From 6ed78e393423ac1243bfda630f5e156843cd74c5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Thu, 10 Feb 2022 23:11:19 +0100 Subject: [PATCH 001/853] Inicia el repositorio --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3e04751d --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +workdir +**/target +**/log/*.log +Cargo.lock From 13a408ce611b613daa869c1b8057c7daec7892de Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Thu, 10 Feb 2022 23:12:53 +0100 Subject: [PATCH 002/853] =?UTF-8?q?A=C3=B1ade=20el=20servidor=20web=20acti?= =?UTF-8?q?x-web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 35 +++++++++++++++++++++++++++++++++++ STARTER.Cargo.toml | 14 ++++++++++++++ src/core/mod.rs | 3 +++ src/core/server/main.rs | 17 +++++++++++++++++ src/core/server/mod.rs | 4 ++++ src/lib.rs | 3 +++ src/main.rs | 6 ++++++ tests/health_check.rs | 9 +++++++++ tests/main.rs | 1 + 9 files changed, 92 insertions(+) create mode 100644 Cargo.toml create mode 100644 STARTER.Cargo.toml create mode 100644 src/core/mod.rs create mode 100644 src/core/server/main.rs create mode 100644 src/core/server/mod.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 tests/health_check.rs create mode 100644 tests/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..e29ba8be --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "pagetop" +version = "0.0.0" +edition = "2021" + +authors = [ + "Manuel Cillero " +] +description = """\ + PageTop es un proyecto personal para aprender Rust. Incluye algunos de los \ + crates más estables y populares para desarrollar soluciones web modulares, \ + extensibles y configurables. También es un sistema para la gestión de \ + contenidos web.\ +""" +homepage = "https://suitepro.cillero.es/projects/pagetop" +repository = "https://gitlab.com/manuelcillero/pagetop" +license = "MIT" + +keywords = [ + "web", "cms", "framework", "frontend", "ssr" +] +categories = [ + "web-programming", "development-tools", "gui" +] + +[dependencies] +actix-web = "4.0.0-rc.3" + +[lib] +name = "pagetop" +path = "src/lib.rs" + +[[bin]] +name = "pagetop" +path = "src/main.rs" diff --git a/STARTER.Cargo.toml b/STARTER.Cargo.toml new file mode 100644 index 00000000..4795fde9 --- /dev/null +++ b/STARTER.Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "app" +version = "0.1.0" +edition = "2021" + +# Ver más claves y sus definiciones en +# https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +pagetop = { path = "pagetop" } +actix-web = "4.0.0-rc.3" + +[[bin]] +name = "app" diff --git a/src/core/mod.rs b/src/core/mod.rs new file mode 100644 index 00000000..fc3e282f --- /dev/null +++ b/src/core/mod.rs @@ -0,0 +1,3 @@ +pub use actix_web::dev::Server; + +pub mod server; diff --git a/src/core/server/main.rs b/src/core/server/main.rs new file mode 100644 index 00000000..022d32d1 --- /dev/null +++ b/src/core/server/main.rs @@ -0,0 +1,17 @@ +use crate::core::{server, Server}; + +async fn greet(req: server::HttpRequest) -> impl server::Responder { + let name = req.match_info().get("name").unwrap_or("World"); + format!("Hello {}!", &name) +} + +pub fn run() -> Result { + let server = server::HttpServer::new(|| { + server::App::new() + .route("/", server::web::get().to(greet)) + .route("/{name}", server::web::get().to(greet)) + }) + .bind("127.0.0.1:8000")? + .run(); + Ok(server) +} diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs new file mode 100644 index 00000000..f293ee80 --- /dev/null +++ b/src/core/server/mod.rs @@ -0,0 +1,4 @@ +pub use actix_web::{web, App, HttpRequest, HttpServer, Responder}; + +mod main; +pub use main::run; diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 00000000..48a67efc --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,3 @@ +pub mod core; + +pub use actix_web::main; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 00000000..db2a29bc --- /dev/null +++ b/src/main.rs @@ -0,0 +1,6 @@ +use pagetop::core::server; + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + server::run()?.await +} diff --git a/tests/health_check.rs b/tests/health_check.rs new file mode 100644 index 00000000..4ae6653e --- /dev/null +++ b/tests/health_check.rs @@ -0,0 +1,9 @@ +fn spawn_app() { + let server = pagetop::core::server::run().expect("Failed to bind address"); + let _ = tokio::spawn(server); +} + +#[tokio::test] +async fn health_check_works() { + spawn_app(); +} diff --git a/tests/main.rs b/tests/main.rs new file mode 100644 index 00000000..f56eeca6 --- /dev/null +++ b/tests/main.rs @@ -0,0 +1 @@ +mod health_check; From e1ea1499885ac4624b199758a2bbbb64799e588b Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Thu, 10 Feb 2022 23:15:50 +0100 Subject: [PATCH 003/853] =?UTF-8?q?A=C3=B1ade=20Sycamore=20para=20render?= =?UTF-8?q?=20de=20HTML=20con=20reactividad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + src/core/server/main.rs | 15 +++++++++++---- src/core/server/mod.rs | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e29ba8be..168ee872 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ categories = [ [dependencies] actix-web = "4.0.0-rc.3" +sycamore = { version = "0.8.0-beta.2", features = ["ssr"] } [lib] name = "pagetop" diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 022d32d1..6a54d243 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,15 +1,22 @@ use crate::core::{server, Server}; -async fn greet(req: server::HttpRequest) -> impl server::Responder { - let name = req.match_info().get("name").unwrap_or("World"); - format!("Hello {}!", &name) +async fn greet() -> impl server::Responder { + "Hello!" +} + +async fn greet_with_param(req: server::HttpRequest) -> server::HttpResponse { + let name: String = req.match_info().get("name").unwrap_or("World").into(); + server::HttpResponse::Ok() + .body(sycamore::render_to_string(|ctx| sycamore::view! { ctx, + p { "Hello " (name) "!" } + })) } pub fn run() -> Result { let server = server::HttpServer::new(|| { server::App::new() .route("/", server::web::get().to(greet)) - .route("/{name}", server::web::get().to(greet)) + .route("/{name}", server::web::get().to(greet_with_param)) }) .bind("127.0.0.1:8000")? .run(); diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index f293ee80..a1210ce3 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -1,4 +1,4 @@ -pub use actix_web::{web, App, HttpRequest, HttpServer, Responder}; +pub use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder}; mod main; pub use main::run; From 4e23523e80fdbc18c8d9e5a2adee009e1663e0a6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Thu, 10 Feb 2022 23:58:22 +0100 Subject: [PATCH 004/853] =?UTF-8?q?A=C3=B1ade=20una=20arquitectura=20escal?= =?UTF-8?q?able=20basada=20en=20m=C3=B3dulos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 4 +++- src/core/all.rs | 7 ++++++ src/core/mod.rs | 6 +++++ src/core/module/api.rs | 14 ++++++++++++ src/core/module/mod.rs | 2 ++ src/core/server/main.rs | 22 ++++++------------ src/core/server/mod.rs | 2 +- src/core/state.rs | 16 +++++++++++++ src/lib.rs | 4 ++++ src/main.rs | 50 +++++++++++++++++++++++++++++++++++++++-- 10 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 src/core/all.rs create mode 100644 src/core/module/api.rs create mode 100644 src/core/module/mod.rs create mode 100644 src/core/state.rs diff --git a/Cargo.toml b/Cargo.toml index 168ee872..1b07ae3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.0" +version = "0.1.0" edition = "2021" authors = [ @@ -24,6 +24,8 @@ categories = [ ] [dependencies] +once_cell = "1.9.0" + actix-web = "4.0.0-rc.3" sycamore = { version = "0.8.0-beta.2", features = ["ssr"] } diff --git a/src/core/all.rs b/src/core/all.rs new file mode 100644 index 00000000..4067a838 --- /dev/null +++ b/src/core/all.rs @@ -0,0 +1,7 @@ +use crate::core::{server, state}; + +pub fn modules(cfg: &mut server::web::ServiceConfig) { + for m in state::MODULES.read().unwrap().iter() { + m.configure_module(cfg); + } +} diff --git a/src/core/mod.rs b/src/core/mod.rs index fc3e282f..3c6040c9 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,3 +1,9 @@ pub use actix_web::dev::Server; +mod state; +pub use state::register_module; + +mod all; + +pub mod module; pub mod server; diff --git a/src/core/module/api.rs b/src/core/module/api.rs new file mode 100644 index 00000000..37c84786 --- /dev/null +++ b/src/core/module/api.rs @@ -0,0 +1,14 @@ +use crate::core::server; + +/// Modules must implement this trait. +pub trait Module: Send + Sync { + fn name(&self) -> String; + + fn description(&self) -> String { + "".to_string() + } + + #[allow(unused_variables)] + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + } +} diff --git a/src/core/module/mod.rs b/src/core/module/mod.rs new file mode 100644 index 00000000..a8f85139 --- /dev/null +++ b/src/core/module/mod.rs @@ -0,0 +1,2 @@ +mod api; +pub use api::Module; diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 6a54d243..457bb652 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,22 +1,14 @@ -use crate::core::{server, Server}; +use crate::core::{Server, all, server}; -async fn greet() -> impl server::Responder { - "Hello!" -} +pub fn run(bootstrap: Option) -> Result { + // Call application bootstrap. + if bootstrap != None { + let _ = &(bootstrap.unwrap())(); + } -async fn greet_with_param(req: server::HttpRequest) -> server::HttpResponse { - let name: String = req.match_info().get("name").unwrap_or("World").into(); - server::HttpResponse::Ok() - .body(sycamore::render_to_string(|ctx| sycamore::view! { ctx, - p { "Hello " (name) "!" } - })) -} - -pub fn run() -> Result { let server = server::HttpServer::new(|| { server::App::new() - .route("/", server::web::get().to(greet)) - .route("/{name}", server::web::get().to(greet_with_param)) + .configure(&all::modules) }) .bind("127.0.0.1:8000")? .run(); diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index a1210ce3..d39c1d4d 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -1,4 +1,4 @@ -pub use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder}; +pub use actix_web::{App, HttpRequest, HttpResponse, HttpServer, Responder, web}; mod main; pub use main::run; diff --git a/src/core/state.rs b/src/core/state.rs new file mode 100644 index 00000000..6ded57b8 --- /dev/null +++ b/src/core/state.rs @@ -0,0 +1,16 @@ +use crate::Lazy; +use crate::core::module::Module; + +use std::sync::RwLock; + +// ----------------------------------------------------------------------------- +// Registered modules. +// ----------------------------------------------------------------------------- + +pub static MODULES: Lazy>> = Lazy::new(|| { + RwLock::new(vec![]) +}); + +pub fn register_module(m: &'static (dyn Module + 'static)) { + MODULES.write().unwrap().push(m); +} diff --git a/src/lib.rs b/src/lib.rs index 48a67efc..01361a13 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,7 @@ +// Global. + +pub use once_cell::sync::Lazy; + pub mod core; pub use actix_web::main; diff --git a/src/main.rs b/src/main.rs index db2a29bc..c1545d0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,52 @@ -use pagetop::core::server; +use pagetop::core::module::Module; +use pagetop::core::{register_module, server}; + +struct Greet; +impl Module for Greet { + fn name(&self) -> String { + "Hello".to_string() + } + + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service( + server::web::resource("/") + .route(server::web::get().to(greet)) + ); + } +} + +async fn greet() -> impl server::Responder { + "Hello!" +} + +struct GreetWithParam; +impl Module for GreetWithParam { + fn name(&self) -> String { + "Hello World!".to_string() + } + + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service( + server::web::resource("/{name}") + .route(server::web::get().to(greet_with_param)) + ); + } +} + +async fn greet_with_param(req: server::HttpRequest) -> server::HttpResponse { + let name: String = req.match_info().get("name").unwrap_or("World").into(); + server::HttpResponse::Ok() + .body(sycamore::render_to_string(|ctx| sycamore::view! { ctx, + p { "Hello " (name) "!" } + })) +} + +fn bootstrap() { + register_module(&Greet); + register_module(&GreetWithParam); +} #[pagetop::main] async fn main() -> std::io::Result<()> { - server::run()?.await + server::run(Some(bootstrap))?.await } From 96884cbbc0590119f6e4ecb646ca578e2451ed36 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 12 Feb 2022 10:14:36 +0100 Subject: [PATCH 005/853] =?UTF-8?q?A=C3=B1ade=20carga=20de=20ajustes=20de?= =?UTF-8?q?=20configuraci=C3=B3n=20globales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 7 ++- STARTER.Cargo.toml | 2 +- config/default.toml | 2 + config/settings.default.toml | 9 +++ src/config/mod.rs | 5 ++ src/config/settings.rs | 103 +++++++++++++++++++++++++++++++++++ src/core/module/api.rs | 2 +- src/core/server/main.rs | 9 ++- src/core/state.rs | 2 +- src/lib.rs | 8 ++- src/main.rs | 5 +- tests/health_check.rs | 4 +- 12 files changed, 146 insertions(+), 12 deletions(-) create mode 100644 config/default.toml create mode 100644 config/settings.default.toml create mode 100644 src/config/mod.rs create mode 100644 src/config/settings.rs diff --git a/Cargo.toml b/Cargo.toml index 1b07ae3a..67ed8c44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,15 +24,18 @@ categories = [ ] [dependencies] +doc-comment = "0.3.3" once_cell = "1.9.0" +config_rs = { package = "config", version = "0.11.0", features = ["toml"] } actix-web = "4.0.0-rc.3" sycamore = { version = "0.8.0-beta.2", features = ["ssr"] } +tokio = { version = "1.16", features = ["macros", "rt-multi-thread"] } +serde = { version = "1.0", features = ["derive"] } + [lib] name = "pagetop" -path = "src/lib.rs" [[bin]] name = "pagetop" -path = "src/main.rs" diff --git a/STARTER.Cargo.toml b/STARTER.Cargo.toml index 4795fde9..13ef591d 100644 --- a/STARTER.Cargo.toml +++ b/STARTER.Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] pagetop = { path = "pagetop" } -actix-web = "4.0.0-rc.3" +tokio = { version = "1.16", features = ["macros", "rt-multi-thread"] } [[bin]] name = "app" diff --git a/config/default.toml b/config/default.toml new file mode 100644 index 00000000..429d6da5 --- /dev/null +++ b/config/default.toml @@ -0,0 +1,2 @@ +[app] +name = "PageTop Essence" diff --git a/config/settings.default.toml b/config/settings.default.toml new file mode 100644 index 00000000..cef2d7cf --- /dev/null +++ b/config/settings.default.toml @@ -0,0 +1,9 @@ +[app] +name = "PageTop Application" +description = "Developed with the amazing PageTop framework." + +[webserver] +# Configuración opcional del servidor web. +# Usar bind_address = "" para deshabilitar el servidor web. +bind_address = "localhost" +bind_port = 8088 diff --git a/src/config/mod.rs b/src/config/mod.rs new file mode 100644 index 00000000..afefaf4f --- /dev/null +++ b/src/config/mod.rs @@ -0,0 +1,5 @@ +/// Nombre del directorio donde se encuentra la configuración. +pub const CONFIG_DIR: &'static str = "config"; + +mod settings; +pub use crate::config::settings::{CONFIG, SETTINGS}; diff --git a/src/config/settings.rs b/src/config/settings.rs new file mode 100644 index 00000000..ffb316f6 --- /dev/null +++ b/src/config/settings.rs @@ -0,0 +1,103 @@ +use crate::Lazy; +use crate::config::CONFIG_DIR; + +use config_rs::{Config, File}; +use serde::Deserialize; + +use std::env; + +/// Carga los ajustes globales "clave = valor" al arrancar la aplicación. +pub static CONFIG: Lazy = Lazy::new(|| { + // Establece el modo de ejecución según el valor de la variable de entorno + // PAGETOP_RUN_MODE. Asume "default" por defecto. + let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or("default".into()); + + // Inicializa los ajustes. + let mut settings = Config::default(); + + // Lee los ajustes combinando los archivos de configuración disponibles y + // asigna el modo de ejecución. + settings + .merge( + File::with_name( + &format!("{}/{}.toml", CONFIG_DIR, "common") + ).required(false)).unwrap() + .merge( + File::with_name( + &format!("{}/{}.toml", CONFIG_DIR, run_mode) + ).required(false)).unwrap() + .merge( + File::with_name( + &format!("{}/{}.toml", CONFIG_DIR, "local") + ).required(false)).unwrap() + .set("app.run_mode", run_mode).unwrap(); + + settings +}); + +#[macro_export] +/// Usar esta macro para obtener el valor de cualquier ajuste global, donde +/// clave y valor son cadenas de caracteres. Devuelve la cadena vacía si no +/// encuentra un ajuste para la clave. +macro_rules! config_get { + ( $key:expr ) => { + $crate::config::CONFIG.get_str($key).unwrap_or("".to_string()) + }; +} + +#[macro_export] +/// Carga los ajustes específicos de tu módulo o aplicación en una estructura +/// similar a [`SETTINGS`] con tipos de variables seguros. Genera un *panic!* +/// en caso de asignaciones no válidas. +macro_rules! config_map { + ( $COMMENT:expr, $CONF:ident, $TYPE:tt $(, $key:expr => $value:expr)* ) => { + $crate::doc_comment! { + concat!($COMMENT), + + pub static $CONF: $crate::Lazy<$TYPE> = $crate::Lazy::new(|| { + let mut settings = $crate::config::CONFIG.clone(); + $( + settings.set_default($key, $value).unwrap(); + )* + match settings.try_into() { + Ok(c) => c, + Err(e) => panic!("Error parsing settings: {}", e), + } + }); + } + }; +} + +#[derive(Debug, Deserialize)] +pub struct App { + pub name : String, + pub description : String, + pub run_mode : String, +} + +#[derive(Debug, Deserialize)] +pub struct Webserver { + pub bind_address : String, + pub bind_port : u16, +} + +#[derive(Debug, Deserialize)] +pub struct Settings { + pub app : App, + pub webserver : Webserver, +} + +config_map!(r#" +Ajustes globales y valores por defecto para las secciones *\[app\]* y +*\[webserver\]* específicas de PageTop. +"#, + SETTINGS, Settings, + + // [app] + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + + // [webserver] + "webserver.bind_address" => "localhost", + "webserver.bind_port" => 8088 +); diff --git a/src/core/module/api.rs b/src/core/module/api.rs index 37c84786..bbbdb5eb 100644 --- a/src/core/module/api.rs +++ b/src/core/module/api.rs @@ -1,6 +1,6 @@ use crate::core::server; -/// Modules must implement this trait. +/// Los módulos deben implementar este *trait*. pub trait Module: Send + Sync { fn name(&self) -> String; diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 457bb652..3f5a7d90 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,16 +1,21 @@ +use crate::config::SETTINGS; use crate::core::{Server, all, server}; pub fn run(bootstrap: Option) -> Result { - // Call application bootstrap. + // Ejecuta la función de inicio específica para la aplicación. if bootstrap != None { let _ = &(bootstrap.unwrap())(); } + // Inicializa el servidor web. let server = server::HttpServer::new(|| { server::App::new() .configure(&all::modules) }) - .bind("127.0.0.1:8000")? + .bind(format!("{}:{}", + &SETTINGS.webserver.bind_address, + &SETTINGS.webserver.bind_port + ))? .run(); Ok(server) } diff --git a/src/core/state.rs b/src/core/state.rs index 6ded57b8..5535c3b6 100644 --- a/src/core/state.rs +++ b/src/core/state.rs @@ -4,7 +4,7 @@ use crate::core::module::Module; use std::sync::RwLock; // ----------------------------------------------------------------------------- -// Registered modules. +// Módulos registrados. // ----------------------------------------------------------------------------- pub static MODULES: Lazy>> = Lazy::new(|| { diff --git a/src/lib.rs b/src/lib.rs index 01361a13..15be4ce1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,11 @@ // Global. +pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy; -pub mod core; +// ----------------------------------------------------------------------------- +// APIs públicas. +// ----------------------------------------------------------------------------- -pub use actix_web::main; +pub mod config; // Gestión de la configuración. +pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. diff --git a/src/main.rs b/src/main.rs index c1545d0a..4d3e46b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use pagetop::config_get; use pagetop::core::module::Module; use pagetop::core::{register_module, server}; @@ -16,7 +17,7 @@ impl Module for Greet { } async fn greet() -> impl server::Responder { - "Hello!" + format!("Hello from {}!", config_get!("app.name")) } struct GreetWithParam; @@ -46,7 +47,7 @@ fn bootstrap() { register_module(&GreetWithParam); } -#[pagetop::main] +#[tokio::main] async fn main() -> std::io::Result<()> { server::run(Some(bootstrap))?.await } diff --git a/tests/health_check.rs b/tests/health_check.rs index 4ae6653e..0c309bea 100644 --- a/tests/health_check.rs +++ b/tests/health_check.rs @@ -1,5 +1,7 @@ +use pagetop::core::server; + fn spawn_app() { - let server = pagetop::core::server::run().expect("Failed to bind address"); + let server = server::run(None).expect("Failed to bind address"); let _ = tokio::spawn(server); } From 0e3300dc90dd344cba9e4af6299f2f09145aa4a2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 13 Feb 2022 09:12:12 +0100 Subject: [PATCH 006/853] =?UTF-8?q?A=C3=B1ade=20traducci=C3=B3n=20de=20tex?= =?UTF-8?q?tos=20con=20plantillas=20Fluent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 4 ++ config/settings.default.toml | 2 + src/base/mod.rs | 3 ++ .../homepage/locales/en-US/homepage.ftl | 4 ++ .../homepage/locales/es-ES/homepage.ftl | 4 ++ src/base/module/homepage/mod.rs | 39 ++++++++++++++ src/base/module/mod.rs | 1 + src/config/settings.rs | 4 +- src/core/server/main.rs | 9 +++- src/lib.rs | 5 ++ src/locale/mod.rs | 47 +++++++++++++++++ src/macros/mod.rs | 19 +++++++ src/main.rs | 51 +------------------ src/prelude.rs | 10 ++++ 14 files changed, 149 insertions(+), 53 deletions(-) create mode 100644 src/base/mod.rs create mode 100644 src/base/module/homepage/locales/en-US/homepage.ftl create mode 100644 src/base/module/homepage/locales/es-ES/homepage.ftl create mode 100644 src/base/module/homepage/mod.rs create mode 100644 src/base/module/mod.rs create mode 100644 src/locale/mod.rs create mode 100644 src/macros/mod.rs create mode 100644 src/prelude.rs diff --git a/Cargo.toml b/Cargo.toml index 67ed8c44..0b8836ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,10 @@ doc-comment = "0.3.3" once_cell = "1.9.0" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } + +fluent-templates = "0.6.1" +unic-langid = "0.9.0" + actix-web = "4.0.0-rc.3" sycamore = { version = "0.8.0-beta.2", features = ["ssr"] } diff --git a/config/settings.default.toml b/config/settings.default.toml index cef2d7cf..dbbf8355 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -1,6 +1,8 @@ [app] name = "PageTop Application" description = "Developed with the amazing PageTop framework." +# Idioma (localización) predeterminado. +language = "en-US" [webserver] # Configuración opcional del servidor web. diff --git a/src/base/mod.rs b/src/base/mod.rs new file mode 100644 index 00000000..fadf78f5 --- /dev/null +++ b/src/base/mod.rs @@ -0,0 +1,3 @@ +//! Temas, Módulos y Componentes base. + +pub mod module; diff --git a/src/base/module/homepage/locales/en-US/homepage.ftl b/src/base/module/homepage/locales/en-US/homepage.ftl new file mode 100644 index 00000000..380b29ee --- /dev/null +++ b/src/base/module/homepage/locales/en-US/homepage.ftl @@ -0,0 +1,4 @@ +module_name = Default homepage +module_desc = Displays a default homepage when none is configured. + +greeting = Hello { $name }! diff --git a/src/base/module/homepage/locales/es-ES/homepage.ftl b/src/base/module/homepage/locales/es-ES/homepage.ftl new file mode 100644 index 00000000..46571c42 --- /dev/null +++ b/src/base/module/homepage/locales/es-ES/homepage.ftl @@ -0,0 +1,4 @@ +module_name = Página de inicio predeterminada +module_desc = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. + +greeting = Hola { $name }! diff --git a/src/base/module/homepage/mod.rs b/src/base/module/homepage/mod.rs new file mode 100644 index 00000000..637659cd --- /dev/null +++ b/src/base/module/homepage/mod.rs @@ -0,0 +1,39 @@ +use crate::prelude::*; + +localize!("en-US", "src/base/module/homepage/locales"); + +pub struct HomepageModule; + +impl Module for HomepageModule { + fn name(&self) -> String { + l("module_name") + } + + fn description(&self) -> String { + l("module_desc") + } + + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service( + server::web::resource("/") + .route(server::web::get().to(greet)) + ); + cfg.service( + server::web::resource("/{name}") + .route(server::web::get().to(greet_with_param)) + ); + } +} + +async fn greet() -> impl server::Responder { + t("greeting", &args!["name" => config_get!("app.name")]) +} + +async fn greet_with_param(req: server::HttpRequest) -> server::HttpResponse { + let name: String = req.match_info().get("name").unwrap_or("World").into(); + let args = args!["name" => name]; + server::HttpResponse::Ok() + .body(sycamore::render_to_string(|ctx| sycamore::view! { ctx, + p { (t("greeting", &args)) } + })) +} diff --git a/src/base/module/mod.rs b/src/base/module/mod.rs new file mode 100644 index 00000000..070e5b82 --- /dev/null +++ b/src/base/module/mod.rs @@ -0,0 +1 @@ +pub mod homepage; diff --git a/src/config/settings.rs b/src/config/settings.rs index ffb316f6..88c5805d 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -72,6 +72,7 @@ macro_rules! config_map { pub struct App { pub name : String, pub description : String, + pub language : String, pub run_mode : String, } @@ -88,7 +89,7 @@ pub struct Settings { } config_map!(r#" -Ajustes globales y valores por defecto para las secciones *\[app\]* y +Ajustes globales y valores predeterminados para las secciones *\[app\]* y *\[webserver\]* específicas de PageTop. "#, SETTINGS, Settings, @@ -96,6 +97,7 @@ Ajustes globales y valores por defecto para las secciones *\[app\]* y // [app] "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", + "app.language" => "en-US", // [webserver] "webserver.bind_address" => "localhost", diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 3f5a7d90..49e78a65 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,12 +1,17 @@ +use crate::base; use crate::config::SETTINGS; -use crate::core::{Server, all, server}; +use crate::core::{Server, all, register_module, server}; pub fn run(bootstrap: Option) -> Result { - // Ejecuta la función de inicio específica para la aplicación. + // Ejecuta la función de arranque de la aplicación. if bootstrap != None { let _ = &(bootstrap.unwrap())(); } + // Registra la página de inicio de PageTop como último módulo. + // Así, la función de arranque de la aplicación podría sobrecargarlo. + register_module(&base::module::homepage::HomepageModule); + // Inicializa el servidor web. let server = server::HttpServer::new(|| { server::App::new() diff --git a/src/lib.rs b/src/lib.rs index 15be4ce1..87e80aac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,5 +7,10 @@ pub use once_cell::sync::Lazy; // APIs públicas. // ----------------------------------------------------------------------------- +pub mod macros; // Macros útiles. pub mod config; // Gestión de la configuración. +pub mod locale; // Localización. pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. +pub mod base; // Temas, Módulos y Componentes base. + +pub mod prelude; // Re-exporta recursos comunes. diff --git a/src/locale/mod.rs b/src/locale/mod.rs new file mode 100644 index 00000000..21fd7bd1 --- /dev/null +++ b/src/locale/mod.rs @@ -0,0 +1,47 @@ +use crate::Lazy; +use crate::config::SETTINGS; + +use unic_langid::LanguageIdentifier; + +pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; +pub use fluent_templates; +pub use fluent_templates::fluent_bundle::FluentValue; + +/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] +/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de +/// la aplicación, obtenido de `SETTINGS.app.language`. +pub static LANGID: Lazy = Lazy::new(|| { + SETTINGS.app.language.parse().expect("Failed to parse.") +}); + +#[macro_export] +/// Permite integrar fácilmente localización en tus temas y módulos. +macro_rules! localize { + ( $DEF_LANGID:literal, $locales:literal $(, $core_locales:literal)? ) => { + use $crate::locale::*; + + static_locale! { + static LOCALES = { + locales: $locales, + $( core_locales: $core_locales, )? + fallback_language: $DEF_LANGID, + + // Elimina las marcas Unicode que delimitan los argumentos. + customise: |bundle| bundle.set_use_isolating(false), + }; + } + + #[allow(dead_code)] + pub fn l(key: &str) -> String { + LOCALES.lookup(&LANGID, key) + } + + #[allow(dead_code)] + pub fn t( + key: &str, + args: &std::collections::HashMap + ) -> String { + LOCALES.lookup_with_args(&LANGID, key, args) + } + }; +} diff --git a/src/macros/mod.rs b/src/macros/mod.rs new file mode 100644 index 00000000..ef3c05d5 --- /dev/null +++ b/src/macros/mod.rs @@ -0,0 +1,19 @@ +#[macro_export] +/// Macro para construir grupos de pares clave-valor. +/// +/// ``` +/// let args = args![ +/// "userName" => "Roberto", +/// "photoCount" => 3, +/// "userGender" => "male" +/// ]; +/// ``` +macro_rules! args { + ( $($key:expr => $value:expr),* ) => {{ + let mut a = std::collections::HashMap::new(); + $( + a.insert(String::from($key), $value.into()); + )* + a + }}; +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 4d3e46b9..96cee3df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,53 +1,4 @@ -use pagetop::config_get; -use pagetop::core::module::Module; -use pagetop::core::{register_module, server}; - -struct Greet; -impl Module for Greet { - fn name(&self) -> String { - "Hello".to_string() - } - - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service( - server::web::resource("/") - .route(server::web::get().to(greet)) - ); - } -} - -async fn greet() -> impl server::Responder { - format!("Hello from {}!", config_get!("app.name")) -} - -struct GreetWithParam; -impl Module for GreetWithParam { - fn name(&self) -> String { - "Hello World!".to_string() - } - - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service( - server::web::resource("/{name}") - .route(server::web::get().to(greet_with_param)) - ); - } -} - -async fn greet_with_param(req: server::HttpRequest) -> server::HttpResponse { - let name: String = req.match_info().get("name").unwrap_or("World").into(); - server::HttpResponse::Ok() - .body(sycamore::render_to_string(|ctx| sycamore::view! { ctx, - p { "Hello " (name) "!" } - })) -} - -fn bootstrap() { - register_module(&Greet); - register_module(&GreetWithParam); -} - #[tokio::main] async fn main() -> std::io::Result<()> { - server::run(Some(bootstrap))?.await + pagetop::core::server::run(None)?.await } diff --git a/src/prelude.rs b/src/prelude.rs new file mode 100644 index 00000000..43370939 --- /dev/null +++ b/src/prelude.rs @@ -0,0 +1,10 @@ +//! Re-exporta recursos comunes. + +pub use crate::args; +pub use crate::config_get; +pub use crate::localize; + +pub use crate::core::module::*; + +pub use crate::core::server; +pub use crate::core::register_module; From 24e773c17b78e7232be52593c99942837219237c Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 13 Feb 2022 20:11:33 +0100 Subject: [PATCH 007/853] =?UTF-8?q?A=C3=B1ade=20composici=C3=B3n=20de=20p?= =?UTF-8?q?=C3=A1ginas=20basada=20en=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 7 +- STARTER.Cargo.toml | 6 +- config/default.toml | 1 + config/settings.default.toml | 2 + src/base/component/chunck.rs | 77 ++++++ src/base/component/container.rs | 103 +++++++ src/base/component/mod.rs | 2 + src/base/mod.rs | 2 + .../homepage/locales/en-US/homepage.ftl | 2 +- .../homepage/locales/es-ES/homepage.ftl | 2 +- src/base/module/homepage/mod.rs | 24 +- src/base/theme/minimal/mod.rs | 9 + src/base/theme/mod.rs | 1 + src/config/settings.rs | 2 + src/core/all.rs | 6 + src/core/mod.rs | 4 + src/core/response/mod.rs | 1 + src/core/response/page/assets.rs | 258 ++++++++++++++++++ src/core/response/page/component.rs | 34 +++ src/core/response/page/container.rs | 33 +++ src/core/response/page/mod.rs | 12 + src/core/response/page/page.rs | 172 ++++++++++++ src/core/server/main.rs | 5 +- src/core/server/mod.rs | 4 +- src/core/state.rs | 46 ++++ src/core/theme/api.rs | 84 ++++++ src/core/theme/mod.rs | 4 + src/locale/mod.rs | 10 + src/main.rs | 2 +- src/prelude.rs | 11 +- 30 files changed, 895 insertions(+), 31 deletions(-) create mode 100644 src/base/component/chunck.rs create mode 100644 src/base/component/container.rs create mode 100644 src/base/component/mod.rs create mode 100644 src/base/theme/minimal/mod.rs create mode 100644 src/base/theme/mod.rs create mode 100644 src/core/response/mod.rs create mode 100644 src/core/response/page/assets.rs create mode 100644 src/core/response/page/component.rs create mode 100644 src/core/response/page/container.rs create mode 100644 src/core/response/page/mod.rs create mode 100644 src/core/response/page/page.rs create mode 100644 src/core/theme/api.rs create mode 100644 src/core/theme/mod.rs diff --git a/Cargo.toml b/Cargo.toml index 0b8836ad..db5f7be9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,10 +32,11 @@ config_rs = { package = "config", version = "0.11.0", features = ["toml"] } fluent-templates = "0.6.1" unic-langid = "0.9.0" -actix-web = "4.0.0-rc.3" -sycamore = { version = "0.8.0-beta.2", features = ["ssr"] } +actix-web = "3.3.3" +maud = { version = "0.23.0", features = ["actix-web"] } +sycamore = { version = "0.7.1", features = ["ssr"] } +downcast-rs = "1.2.0" -tokio = { version = "1.16", features = ["macros", "rt-multi-thread"] } serde = { version = "1.0", features = ["derive"] } [lib] diff --git a/STARTER.Cargo.toml b/STARTER.Cargo.toml index 13ef591d..1db51f3d 100644 --- a/STARTER.Cargo.toml +++ b/STARTER.Cargo.toml @@ -8,7 +8,5 @@ edition = "2021" [dependencies] pagetop = { path = "pagetop" } -tokio = { version = "1.16", features = ["macros", "rt-multi-thread"] } - -[[bin]] -name = "app" +actix-web = "3.3.3" +maud = { version = "0.23.0" } diff --git a/config/default.toml b/config/default.toml index 429d6da5..f96d1a7d 100644 --- a/config/default.toml +++ b/config/default.toml @@ -1,2 +1,3 @@ [app] name = "PageTop Essence" +language = "es-ES" diff --git a/config/settings.default.toml b/config/settings.default.toml index dbbf8355..c726c44e 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -3,6 +3,8 @@ name = "PageTop Application" description = "Developed with the amazing PageTop framework." # Idioma (localización) predeterminado. language = "en-US" +# Tema predeterminado. +theme = "Minimal" [webserver] # Configuración opcional del servidor web. diff --git a/src/base/component/chunck.rs b/src/base/component/chunck.rs new file mode 100644 index 00000000..29c62918 --- /dev/null +++ b/src/base/component/chunck.rs @@ -0,0 +1,77 @@ +use crate::prelude::*; + +pub struct Chunck { + renderable: fn() -> bool, + weight : i8, + markup : Vec, + template : String, +} + +impl PageComponent for Chunck { + + fn prepare() -> Self { + Chunck { + renderable: always, + weight : 0, + markup : Vec::new(), + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, _: &mut PageAssets) -> Markup { + html! { + @for markup in self.markup.iter() { + (*markup) + } + } + } +} + +impl Chunck { + + // Chunck BUILDER. + + pub fn markup(markup: Markup) -> Self { + let mut chunck = Chunck::prepare(); + chunck.markup.push(markup); + chunck + } + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn add_markup(mut self, markup: Markup) -> Self { + self.markup.push(markup); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Chunck GETTERS. + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/container.rs b/src/base/component/container.rs new file mode 100644 index 00000000..58a0caac --- /dev/null +++ b/src/base/component/container.rs @@ -0,0 +1,103 @@ +use crate::prelude::*; + +enum ContainerType { Column, Row, Wrapper } + +pub struct Container { + renderable: fn() -> bool, + weight : i8, + id : String, + container : ContainerType, + components: PageContainer, + template : String, +} + +impl PageComponent for Container { + + fn prepare() -> Self { + Container { + renderable: always, + weight : 0, + id : "".to_string(), + container : ContainerType::Wrapper, + components: PageContainer::new(), + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, assets: &mut PageAssets) -> Markup { + let classes = match self.container { + ContainerType::Wrapper => "wrapper", + ContainerType::Row => "row", + ContainerType::Column => "col", + }; + html! { + div class=(classes) { + (self.components.render(assets)) + } + } + } +} + +impl Container { + + // Container BUILDER. + + pub fn row() -> Self { + let mut grid = Container::prepare(); + grid.container = ContainerType::Row; + grid + } + + pub fn column() -> Self { + let mut grid = Container::prepare(); + grid.container = ContainerType::Column; + grid + } + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.id = id.to_string(); + self + } + + pub fn add(mut self, component: impl PageComponent) -> Self { + self.components.add(component); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Grid GETTERS. + + pub fn id(&self) -> &str { + self.id.as_str() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/mod.rs b/src/base/component/mod.rs new file mode 100644 index 00000000..c12fb175 --- /dev/null +++ b/src/base/component/mod.rs @@ -0,0 +1,2 @@ +pub mod container; +pub mod chunck; diff --git a/src/base/mod.rs b/src/base/mod.rs index fadf78f5..f40d2d0e 100644 --- a/src/base/mod.rs +++ b/src/base/mod.rs @@ -1,3 +1,5 @@ //! Temas, Módulos y Componentes base. +pub mod theme; pub mod module; +pub mod component; diff --git a/src/base/module/homepage/locales/en-US/homepage.ftl b/src/base/module/homepage/locales/en-US/homepage.ftl index 380b29ee..7008c35a 100644 --- a/src/base/module/homepage/locales/en-US/homepage.ftl +++ b/src/base/module/homepage/locales/en-US/homepage.ftl @@ -1,4 +1,4 @@ module_name = Default homepage module_desc = Displays a default homepage when none is configured. -greeting = Hello { $name }! +greetings = Hello { $name }! diff --git a/src/base/module/homepage/locales/es-ES/homepage.ftl b/src/base/module/homepage/locales/es-ES/homepage.ftl index 46571c42..7af7b370 100644 --- a/src/base/module/homepage/locales/es-ES/homepage.ftl +++ b/src/base/module/homepage/locales/es-ES/homepage.ftl @@ -1,4 +1,4 @@ module_name = Página de inicio predeterminada module_desc = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. -greeting = Hola { $name }! +greetings = ¡Hola { $name }! diff --git a/src/base/module/homepage/mod.rs b/src/base/module/homepage/mod.rs index 637659cd..4133f6ba 100644 --- a/src/base/module/homepage/mod.rs +++ b/src/base/module/homepage/mod.rs @@ -14,26 +14,16 @@ impl Module for HomepageModule { } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service( - server::web::resource("/") - .route(server::web::get().to(greet)) - ); - cfg.service( - server::web::resource("/{name}") - .route(server::web::get().to(greet_with_param)) - ); + cfg.service(server::web::resource("/").to(home)); + cfg.service(server::web::resource("/{name}").to(home)); } } -async fn greet() -> impl server::Responder { - t("greeting", &args!["name" => config_get!("app.name")]) -} - -async fn greet_with_param(req: server::HttpRequest) -> server::HttpResponse { +async fn home(req: server::HttpRequest) -> server::Result { let name: String = req.match_info().get("name").unwrap_or("World").into(); - let args = args!["name" => name]; - server::HttpResponse::Ok() - .body(sycamore::render_to_string(|ctx| sycamore::view! { ctx, - p { (t("greeting", &args)) } + Page::prepare() + .add_to("content", Chunck::markup(html! { + h1 { (t("greetings", &args![ "name" => name])) } })) + .render() } diff --git a/src/base/theme/minimal/mod.rs b/src/base/theme/minimal/mod.rs new file mode 100644 index 00000000..ea1ea1f4 --- /dev/null +++ b/src/base/theme/minimal/mod.rs @@ -0,0 +1,9 @@ +use crate::prelude::*; + +pub struct MinimalTheme; + +impl Theme for MinimalTheme { + fn name(&self) -> &str { + "Minimal" + } +} diff --git a/src/base/theme/mod.rs b/src/base/theme/mod.rs new file mode 100644 index 00000000..b272be88 --- /dev/null +++ b/src/base/theme/mod.rs @@ -0,0 +1 @@ +pub mod minimal; diff --git a/src/config/settings.rs b/src/config/settings.rs index 88c5805d..3c9a7853 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -73,6 +73,7 @@ pub struct App { pub name : String, pub description : String, pub language : String, + pub theme : String, pub run_mode : String, } @@ -98,6 +99,7 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]* y "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", "app.language" => "en-US", + "app.theme" => "Minimal", // [webserver] "webserver.bind_address" => "localhost", diff --git a/src/core/all.rs b/src/core/all.rs index 4067a838..716dac9b 100644 --- a/src/core/all.rs +++ b/src/core/all.rs @@ -1,5 +1,11 @@ use crate::core::{server, state}; +pub fn themes(cfg: &mut server::web::ServiceConfig) { + for t in state::THEMES.read().unwrap().iter() { + t.configure_theme(cfg); + } +} + pub fn modules(cfg: &mut server::web::ServiceConfig) { for m in state::MODULES.read().unwrap().iter() { m.configure_module(cfg); diff --git a/src/core/mod.rs b/src/core/mod.rs index 3c6040c9..de375c10 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,9 +1,13 @@ pub use actix_web::dev::Server; mod state; +pub use state::register_theme; pub use state::register_module; +pub use state::add_component_to; mod all; +pub mod theme; pub mod module; +pub mod response; pub mod server; diff --git a/src/core/response/mod.rs b/src/core/response/mod.rs new file mode 100644 index 00000000..79d28612 --- /dev/null +++ b/src/core/response/mod.rs @@ -0,0 +1 @@ +pub mod page; diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs new file mode 100644 index 00000000..d36c870e --- /dev/null +++ b/src/core/response/page/assets.rs @@ -0,0 +1,258 @@ +use crate::core::theme::{Markup, PreEscaped, html}; + +// ----------------------------------------------------------------------------- +// Favicon. +// ----------------------------------------------------------------------------- + +pub struct Favicon(Vec); + +impl Favicon { + pub fn new() -> Self { + Favicon(Vec::new()) + } + + pub fn with_icon(self, image: &str) -> Self { + self.add_item("icon", image, "", "") + } + + pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { + self.add_item("icon", image, sizes, "") + } + + pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { + self.add_item("apple-touch-icon", image, sizes, "") + } + + pub fn with_mask_icon(self, image: &str, color: &str) -> Self { + self.add_item("mask-icon", image, "", color) + } + + pub fn with_manifest(self, file: &str) -> Self { + self.add_item("manifest", file, "", "") + } + + pub fn with_theme_color(mut self, color: &str) -> Self { + self.0.push(format!( + "", color + )); + self + } + + pub fn with_ms_tile_color(mut self, color: &str) -> Self { + self.0.push(format!( + "", color + )); + self + } + + pub fn with_ms_tile_image(mut self, image: &str) -> Self { + self.0.push(format!( + "", image + )); + self + } + + fn add_item( + mut self, + rel : &str, + source: &str, + sizes : &str, + color : &str + ) -> Self { + let mut link: String = format!(" format!("{} type=\"image/gif\"", link), + ".ico" => format!("{} type=\"image/x-icon\"", link), + ".jpg" => format!("{} type=\"image/jpg\"", link), + ".png" => format!("{} type=\"image/png\"", link), + ".svg" => format!("{} type=\"image/svg+xml\"", link), + _ => link + }; + } + if !sizes.is_empty() { + link = format!("{} sizes=\"{}\"", link, sizes); + } + if !color.is_empty() { + link = format!("{} color=\"{}\"", link, color); + } + self.0.push(format!("{} href=\"{}\">", link, source)); + self + } + + fn render(&self) -> Markup { + html! { + @for item in &self.0 { + (PreEscaped(item)) + } + } + } +} + +// ----------------------------------------------------------------------------- +// StyleSheet. +// ----------------------------------------------------------------------------- + +pub struct StyleSheet { + source: &'static str, + weight: i8, +} +impl StyleSheet { + pub fn source(s: &'static str) -> Self { + StyleSheet { + source: s, + weight: 0, + } + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn weight(self) -> i8 { + self.weight + } + + fn render(&self) -> Markup { + html! { + link rel="stylesheet" href=(self.source); + } + } +} + +// ----------------------------------------------------------------------------- +// JavaScript. +// ----------------------------------------------------------------------------- + +#[derive(PartialEq)] +pub enum JSMode { Async, Defer, Normal } + +pub struct JavaScript { + source: &'static str, + weight: i8, + mode : JSMode, +} +impl JavaScript { + pub fn source(s: &'static str) -> Self { + JavaScript { + source: s, + weight: 0, + mode : JSMode::Defer, + } + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_mode(mut self, mode: JSMode) -> Self { + self.mode = mode; + self + } + + pub fn weight(self) -> i8 { + self.weight + } + + fn render(&self) -> Markup { + html! { + script type="text/javascript" + src=(self.source) + async[self.mode == JSMode::Async] + defer[self.mode == JSMode::Defer] + {}; + } + } +} + +// ----------------------------------------------------------------------------- +// Page assets. +// ----------------------------------------------------------------------------- + +pub struct Assets { + favicon : Option, + metadata : Vec<(String, String)>, + stylesheets: Vec, + javascripts: Vec, + seqid_count: u16, +} + +impl Assets { + pub fn new() -> Self { + Assets { + favicon : None, + metadata : Vec::new(), + stylesheets: Vec::new(), + javascripts: Vec::new(), + seqid_count: 0, + } + } + + pub fn with_favicon(&mut self, favicon: Favicon) -> &mut Self { + self.favicon = Some(favicon); + self + } + + pub fn add_metadata(&mut self, name: String, content: String) -> &mut Self { + self.metadata.push((name, content)); + self + } + + pub fn add_stylesheet(&mut self, css: StyleSheet) -> &mut Self { + match self.stylesheets.iter().position(|x| x.source == css.source) { + Some(index) => if self.stylesheets[index].weight > css.weight { + self.stylesheets.remove(index); + self.stylesheets.push(css); + }, + _ => self.stylesheets.push(css) + } + self + } + + pub fn add_javascript(&mut self, js: JavaScript) -> &mut Self { + match self.javascripts.iter().position(|x| x.source == js.source) { + Some(index) => if self.javascripts[index].weight > js.weight { + self.javascripts.remove(index); + self.javascripts.push(js); + }, + _ => self.javascripts.push(js) + } + self + } + + pub fn render(&mut self) -> Markup { + let ordered_css = &mut self.stylesheets; + ordered_css.sort_by_key(|o| o.weight); + + let ordered_js = &mut self.javascripts; + ordered_js.sort_by_key(|o| o.weight); + + html! { + @match &self.favicon { + Some(favicon) => (favicon.render()), + None => "", + } + @for (name, content) in &self.metadata { + meta name=(name) content=(content) {} + } + @for css in ordered_css { + (css.render()) + } + @for js in ordered_js { + (js.render()) + } + } + } + + // Assets GETTERS. + + pub fn seqid(&mut self, id: &str) -> String { + if id.is_empty() { + self.seqid_count += 1; + return format!("seqid-{}", self.seqid_count); + } + id.to_string() + } +} diff --git a/src/core/response/page/component.rs b/src/core/response/page/component.rs new file mode 100644 index 00000000..097d960f --- /dev/null +++ b/src/core/response/page/component.rs @@ -0,0 +1,34 @@ +use crate::core::theme::{Markup, html}; +use crate::core::response::page::PageAssets; + +use downcast_rs::{Downcast, impl_downcast}; + +use std::any::type_name; + +pub trait Component: Downcast + Send + Sync { + + fn prepare() -> Self where Self: Sized; + + fn qualified_name(&self) -> &str { + type_name::() + } + + fn description(&self) -> &str { + "" + } + + fn is_renderable(&self) -> bool { + true + } + + fn weight(&self) -> i8 { + 0 + } + + #[allow(unused_variables)] + fn default_render(&self, assets: &mut PageAssets) -> Markup { + html! {} + } +} + +impl_downcast!(Component); diff --git a/src/core/response/page/container.rs b/src/core/response/page/container.rs new file mode 100644 index 00000000..c9d2e13b --- /dev/null +++ b/src/core/response/page/container.rs @@ -0,0 +1,33 @@ +use crate::core::theme::{Markup, html}; +use crate::core::response::page::{PageAssets, PageComponent, render_component}; + +use std::sync::Arc; + +#[derive(Clone)] +pub struct Container(Vec>); + +impl Container { + pub fn new() -> Self { + Container(Vec::new()) + } + + pub fn new_with(component: impl PageComponent) -> Self { + let mut container = Container::new(); + container.add(component); + container + } + + pub fn add(&mut self, component: impl PageComponent) { + self.0.push(Arc::new(component)); + } + + pub fn render(&self, assets: &mut PageAssets) -> Markup { + let mut components = self.0.clone(); + components.sort_by_key(|c| c.weight()); + html! { + @for c in components.iter() { + (render_component(&**c, assets)) + } + } + } +} \ No newline at end of file diff --git a/src/core/response/page/mod.rs b/src/core/response/page/mod.rs new file mode 100644 index 00000000..881e0df3 --- /dev/null +++ b/src/core/response/page/mod.rs @@ -0,0 +1,12 @@ +pub mod assets; +pub use assets::Assets as PageAssets; + +mod component; +pub use component::Component as PageComponent; + +mod container; +pub use container::Container as PageContainer; + +mod page; +pub use page::Page; +pub use page::render_component; diff --git a/src/core/response/page/page.rs b/src/core/response/page/page.rs new file mode 100644 index 00000000..add4c64d --- /dev/null +++ b/src/core/response/page/page.rs @@ -0,0 +1,172 @@ +use crate::config::SETTINGS; +use crate::core::server; +use crate::core::state::{COMPONENTS, THEME}; +use crate::core::theme::{DOCTYPE, Markup, html}; +use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; + +use std::borrow::Cow; +use std::collections::HashMap; + +pub enum TextDirection { LeftToRight, RightToLeft, Auto } + +pub struct Page<'a> { + language : &'a str, + title : &'a str, + direction : &'a str, + description : &'a str, + body_classes: Cow<'a, str>, + assets : PageAssets, + regions : HashMap<&'a str, PageContainer>, + template : &'a str, +} + +impl<'a> Page<'a> { + + pub fn prepare() -> Self { + Page { + language : &SETTINGS.app.language[..2], + title : &SETTINGS.app.name, + direction : "ltr", + description : "", + body_classes: "body".into(), + assets : PageAssets::new(), + regions : COMPONENTS.read().unwrap().clone(), + template : "default", + } + } + + // Page BUILDER. + + pub fn with_language(&mut self, language: &'a str) -> &mut Self { + self.language = language; + self + } + + pub fn with_title(&mut self, title: &'a str) -> &mut Self { + self.title = title; + self + } + + pub fn with_direction(&mut self, dir: TextDirection) -> &mut Self { + self.direction = match dir { + TextDirection::LeftToRight => "ltr", + TextDirection::RightToLeft => "rtl", + _ => "auto" + }; + self + } + + pub fn with_description(&mut self, description: &'a str) -> &mut Self { + self.description = description; + self + } + + pub fn with_body_classes(&mut self, body_classes: &'a str) -> &mut Self { + self.body_classes = body_classes.into(); + self + } + + pub fn add_body_classes(&mut self, body_classes: &'a str) -> &mut Self { + self.body_classes = String::from( + format!("{} {}", self.body_classes, body_classes).trim() + ).into(); + self + } + + pub fn add_to( + &mut self, + region: &'a str, + component: impl PageComponent + ) -> &mut Self { + if let Some(regions) = self.regions.get_mut(region) { + regions.add(component); + } else { + self.regions.insert(region, PageContainer::new_with(component)); + } + self + } + + pub fn using_template(&mut self, template: &'a str) -> &mut Self { + self.template = template; + self + } + + // Page GETTERS. + + pub fn language(&self) -> &str { + self.language + } + + pub fn title(&self) -> &str { + self.title + } + + pub fn direction(&self) -> TextDirection { + match self.direction { + "ltr" => TextDirection::LeftToRight, + "rtl" => TextDirection::RightToLeft, + _ => TextDirection::Auto + } + } + + pub fn description(&self) -> &str { + self.description + } + + pub fn body_classes(&self) -> &str { + if self.body_classes.is_empty() { + return "body"; + } + &self.body_classes + } + + pub fn assets(&mut self) -> &mut PageAssets { + &mut self.assets + } + + pub fn template(&self) -> &str { + self.template + } + + // Page RENDER. + + pub fn render(&mut self) -> server::Result { + // Acciones del tema antes de renderizar la página. + THEME.before_render_page(self); + + // Primero, renderizar el cuerpo. + let body = THEME.render_page_body(self); + + // Luego, renderizar la cabecera. + let head = THEME.render_page_head(self); + + // Finalmente, renderizar la página. + return Ok(html! { + (DOCTYPE) + html lang=(self.language) dir=(self.direction) { + (head) + (body) + } + }) + } + + pub fn render_region(&mut self, region: &str) -> Markup { + match self.regions.get_mut(region) { + Some(components) => components.render(&mut self.assets), + None => html! {} + } + } +} + +pub fn render_component( + component: &dyn PageComponent, + assets: &mut PageAssets +) -> Markup { + match component.is_renderable() { + true => match THEME.render_component(component, assets) { + Some(markup) => markup, + None => component.default_render(assets) + }, + false => html! {} + } +} diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 49e78a65..ea0deafc 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -8,13 +8,14 @@ pub fn run(bootstrap: Option) -> Result { let _ = &(bootstrap.unwrap())(); } - // Registra la página de inicio de PageTop como último módulo. - // Así, la función de arranque de la aplicación podría sobrecargarlo. + // Registra el módulo para la página de inicio de PageTop. + // Al ser el último, puede sobrecargarse en la función de arranque. register_module(&base::module::homepage::HomepageModule); // Inicializa el servidor web. let server = server::HttpServer::new(|| { server::App::new() + .configure(&all::themes) .configure(&all::modules) }) .bind(format!("{}:{}", diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index d39c1d4d..713a7ae6 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -1,4 +1,6 @@ -pub use actix_web::{App, HttpRequest, HttpResponse, HttpServer, Responder, web}; +pub use actix_web::{ + App, HttpRequest, HttpResponse, HttpServer, Responder, Result, web +}; mod main; pub use main::run; diff --git a/src/core/state.rs b/src/core/state.rs index 5535c3b6..69b6a4de 100644 --- a/src/core/state.rs +++ b/src/core/state.rs @@ -1,7 +1,35 @@ use crate::Lazy; +use crate::config::SETTINGS; +use crate::core::theme::Theme; use crate::core::module::Module; +use crate::core::response::page::{PageComponent, PageContainer}; +use crate::base; use std::sync::RwLock; +use std::collections::HashMap; + +// ----------------------------------------------------------------------------- +// Temas registrados. +// ----------------------------------------------------------------------------- + +pub static THEMES: Lazy>> = Lazy::new(|| { + RwLock::new(vec![ + &base::theme::minimal::MinimalTheme, + ]) +}); + +pub static THEME: Lazy<&dyn Theme> = Lazy::new(|| { + for t in THEMES.read().unwrap().iter() { + if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { + return *t; + } + } + &base::theme::minimal::MinimalTheme +}); + +pub fn register_theme(t: &'static (dyn Theme + 'static)) { + THEMES.write().unwrap().push(t); +} // ----------------------------------------------------------------------------- // Módulos registrados. @@ -14,3 +42,21 @@ pub static MODULES: Lazy>> = Lazy::new(|| { pub fn register_module(m: &'static (dyn Module + 'static)) { MODULES.write().unwrap().push(m); } + +// ----------------------------------------------------------------------------- +// Componentes globales. +// ----------------------------------------------------------------------------- + +pub static COMPONENTS: Lazy>> = Lazy::new( + || { RwLock::new(HashMap::new()) } +); + +#[allow(dead_code)] +pub fn add_component_to(region: &'static str, component: impl PageComponent) { + let mut hmap = COMPONENTS.write().unwrap(); + if let Some(regions) = hmap.get_mut(region) { + regions.add(component); + } else { + hmap.insert(region, PageContainer::new_with(component)); + } +} diff --git a/src/core/theme/api.rs b/src/core/theme/api.rs new file mode 100644 index 00000000..26d71552 --- /dev/null +++ b/src/core/theme/api.rs @@ -0,0 +1,84 @@ +use crate::core::server; +use crate::core::theme::{Markup, html}; +use crate::core::response::page::{Page, PageAssets, PageComponent}; + +/// Los temas deben implementar este "trait". +pub trait Theme: Send + Sync { + fn name(&self) -> &str; + + fn description(&self) -> &str { + "" + } + + #[allow(unused_variables)] + fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { + } + + #[allow(unused_variables)] + fn before_render_page(&self, page: &mut Page) { + } + + fn render_page_head(&self, page: &mut Page) -> Markup { + let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; + let description = page.description(); + html! { + head { + meta charset="utf-8"; + + meta http-equiv="X-UA-Compatible" content="IE=edge"; + meta name="viewport" content=(viewport); + @if !description.is_empty() { + meta name="description" content=(description); + } + + title { (page.title()) } + + (page.assets().render()) + } + } + } + + fn render_page_body(&self, page: &mut Page) -> Markup { + html! { + body id="body" class=(page.body_classes()) { + @match page.template() { + "admin" => { + @for region in &["top-menu", "side-menu", "content"] { + #(region) { + (page.render_region(region)) + } + } + }, + _ => { + #content { + (page.render_region("content")) + } + } + } + } + } + } + + #[allow(unused_variables)] + fn render_component( + &self, + component: &dyn PageComponent, + assets: &mut PageAssets + ) -> Option { + None + /* + Cómo usarlo: + + match component.type_name() { + "Block" => { + let block = component.downcast_mut::().unwrap(); + match block.template() { + "default" => Some(block_default(block)), + _ => None + } + }, + _ => None + } + */ + } +} diff --git a/src/core/theme/mod.rs b/src/core/theme/mod.rs new file mode 100644 index 00000000..9b908257 --- /dev/null +++ b/src/core/theme/mod.rs @@ -0,0 +1,4 @@ +pub use maud::{DOCTYPE, Markup, PreEscaped, html}; + +mod api; +pub use api::Theme; diff --git a/src/locale/mod.rs b/src/locale/mod.rs index 21fd7bd1..6e64cc8f 100644 --- a/src/locale/mod.rs +++ b/src/locale/mod.rs @@ -43,5 +43,15 @@ macro_rules! localize { ) -> String { LOCALES.lookup_with_args(&LANGID, key, args) } + + #[allow(dead_code)] + pub fn e( + key: &str, + args: &std::collections::HashMap + ) -> crate::core::theme::PreEscaped { + crate::core::theme::PreEscaped( + LOCALES.lookup_with_args(&LANGID, key, args) + ) + } }; } diff --git a/src/main.rs b/src/main.rs index 96cee3df..8559a909 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -#[tokio::main] +#[actix_web::main] async fn main() -> std::io::Result<()> { pagetop::core::server::run(None)?.await } diff --git a/src/prelude.rs b/src/prelude.rs index 43370939..c74bb379 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,10 +1,19 @@ //! Re-exporta recursos comunes. pub use crate::args; -pub use crate::config_get; pub use crate::localize; +pub use crate::core::theme::*; + pub use crate::core::module::*; +pub use crate::core::response::page::*; +pub use crate::core::response::page::assets::*; + pub use crate::core::server; +pub use crate::core::register_theme; pub use crate::core::register_module; +pub use crate::core::add_component_to; + +pub use crate::base::component::container::Container; +pub use crate::base::component::chunck::Chunck; From 5d2901d32ad38e8c1bf17380e2b9350057d84237 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Mon, 14 Feb 2022 19:36:16 +0100 Subject: [PATCH 008/853] =?UTF-8?q?A=C3=B1ade=20un=20r=C3=B3tulo=20opciona?= =?UTF-8?q?l=20al=20arrancar=20la=20aplicaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + config/settings.default.toml | 2 + resources/slant.flf | 1295 +++++++++++++++++++++++++++++++++ resources/small.flf | 1097 ++++++++++++++++++++++++++++ resources/speed.flf | 1301 ++++++++++++++++++++++++++++++++++ resources/starwars.flf | 719 +++++++++++++++++++ src/config/settings.rs | 20 +- src/core/server/main.rs | 18 + 8 files changed, 4444 insertions(+), 9 deletions(-) create mode 100644 resources/slant.flf create mode 100644 resources/small.flf create mode 100644 resources/speed.flf create mode 100644 resources/starwars.flf diff --git a/Cargo.toml b/Cargo.toml index db5f7be9..1a36650e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ categories = [ [dependencies] doc-comment = "0.3.3" once_cell = "1.9.0" +figlet-rs = "0.1.3" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } diff --git a/config/settings.default.toml b/config/settings.default.toml index c726c44e..0a446896 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -5,6 +5,8 @@ description = "Developed with the amazing PageTop framework." language = "en-US" # Tema predeterminado. theme = "Minimal" +# Rótulo al inicio: "Off", "Slant", "Small", "Speed" or "Starwars". +startup_banner = "Small" [webserver] # Configuración opcional del servidor web. diff --git a/resources/slant.flf b/resources/slant.flf new file mode 100644 index 00000000..ea27b6ed --- /dev/null +++ b/resources/slant.flf @@ -0,0 +1,1295 @@ +flf2a$ 6 5 16 15 10 0 18319 +Slant by Glenn Chappell 3/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ + __@ + / /@ + / / @ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ + $ @ +$ @ + @@ + __ __ @ + __/ // /_@ + /_ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ + __@ + _/ /@ + / __/@ + (_ ) @ +/ _/ @ +/_/ @@ + _ __@ + (_)_/_/@ + _/_/ @ + _/_/_ @ +/_/ (_) @ + @@ + ___ @ + ( _ ) @ + / __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ + _ @ + ( )@ + |/ @ + $ @ +$ @ + @@ + __@ + _/_/@ + / / @ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + / / @ + _/_/ @ +/_/ @@ + @ + __/|_@ + | /@ +/_ __| @ + |/ @ + @@ + @ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ + _ @ +( )@ +|/ @@ + @ + @ + ______@ +/_____/@ + $ @ + @@ + @ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ + _/_/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ___@ + < /@ + / / @ + / / @ +/_/ @ + @@ + ___ @ + |__ \@ + __/ /@ + / __/ @ +/____/ @ + @@ + _____@ + |__ /@ + /_ < @ + ___/ / @ +/____/ @ + @@ + __ __@ + / // /@ + / // /_@ +/__ __/@ + /_/ @ + @@ + ______@ + / ____/@ + /___ \ @ + ____/ / @ +/_____/ @ + @@ + _____@ + / ___/@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _____@ +/__ /@ + / / @ + / / @ +/_/ @ + @@ + ____ @ + ( __ )@ + / __ |@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + \__, / @ +/____/ @ + @@ + @ + _ @ + (_)@ + _ @ +(_) @ + @@ + @ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +/ / @ +\ \ @ + \_\@ + @@ + @ + _____@ + /____/@ +/____/ @ + $ @ + @@ +__ @ +\ \ @ + \ \@ + / /@ +/_/ @ + @@ + ___ @ + /__ \@ + / _/@ + /_/ @ +(_) @ + @@ + ______ @ + / ____ \@ + / / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ + ___ @ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ + ____ @ + / __ )@ + / __ |@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / __/ @ + / /___ @ +/_____/ @ + @@ + ______@ + / ____/@ + / /_ @ + / __/ @ +/_/ @ + @@ + ______@ + / ____/@ + / / __ @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / / / /@ + / /_/ / @ + / __ / @ +/_/ /_/ @ + @@ + ____@ + / _/@ + / / @ + _/ / @ +/___/ @ + @@ + __@ + / /@ + __ / / @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / //_/@ + / ,< @ + / /| | @ +/_/ |_| @ + @@ + __ @ + / / @ + / / @ + / /___@ +/_____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ + / / / / @ +/_/ /_/ @ + @@ + _ __@ + / | / /@ + / |/ / @ + / /| / @ +/_/ |_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / ____/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\___\_\ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / _, _/ @ +/_/ |_| @ + @@ + _____@ + / ___/@ + \__ \ @ + ___/ / @ +/____/ @ + @@ + ______@ + /_ __/@ + / / @ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ __@ +| | / /@ +| | / / @ +| |/ / @ +|___/ @ + @@ + _ __@ +| | / /@ +| | /| / / @ +| |/ |/ / @ +|__/|__/ @ + @@ + _ __@ + | |/ /@ + | / @ + / | @ +/_/|_| @ + @@ +__ __@ +\ \/ /@ + \ / @ + / / @ +/_/ @ + @@ + _____@ +/__ /@ + / / @ + / /__@ +/____/@ + @@ + ___@ + / _/@ + / / @ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + / / @ + _/ / @ +/__/ @@ + //|@ + |/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ + ______@ +/_____/@@ + _ @ + ( )@ + V @ + $ @ +$ @ + @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ + __ @ + / /_ @ + / __ \@ + / /_/ /@ +/_.___/ @ + @@ + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + __@ + ____/ /@ + / __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ + ___ @ + / _ \@ +/ __/@ +\___/ @ + @@ + ____@ + / __/@ + / /_ @ + / __/ @ +/_/ @ + @@ + @ + ____ _@ + / __ `/@ + / /_/ / @ + \__, / @ +/____/ @@ + __ @ + / /_ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ + __/ / @ +/___/ @@ + __ @ + / /__@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __@ + / /@ + / / @ + / / @ +/_/ @ + @@ + @ + ____ ___ @ + / __ `__ \@ + / / / / / /@ +/_/ /_/ /_/ @ + @@ + @ + ____ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + @ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + @ + ____ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ + _____@ + / ___/@ + / / @ +/_/ @ + @@ + @ + _____@ + / ___/@ + (__ ) @ +/____/ @ + @@ + __ @ + / /_@ + / __/@ +/ /_ @ +\__/ @ + @@ + @ + __ __@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ + _ __@ +| | / /@ +| |/ / @ +|___/ @ + @@ + @ + _ __@ +| | /| / /@ +| |/ |/ / @ +|__/|__/ @ + @@ + @ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + @ + __ __@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ + @ + ____@ +/_ /@ + / /_@ +/___/@ + @@ + __@ + _/_/@ + _/_/ @ +< < @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ + / / @ +/_/ @@ + _ @ + | |@ + / /@ + _>_>@ + _/_/ @ +/_/ @@ + /\//@ + //\/ @ + $ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ +162 CENT SIGN + __@ + __/ /@ + / ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 POUND SIGN + ____ @ + / ,__\@ + __/ /_ @ + _/ /___ @ +(_,____/ @ + @@ +164 CURRENCY SIGN + /|___/|@ + | __ / @ + / /_/ / @ + /___ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @ + @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + __ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | || | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ______ @ + / _____\ @ + / / ___/ |@ + / / /__ / @ +| \___/ / @ + \______/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + ______@ +/___ /@ + /_/ @ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + _____@ +/____/@ + $ @ + @@ +174 REGISTERED SIGN + ______ @ + / ___ \ @ + / / _ \ |@ + / / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 MACRON + ______@ +/_____/@ + $ @ + $ @ +$ @ + @@ +176 DEGREE SIGN + ___ @ + / _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ |@ + / __/ @ +/____/ @ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |_ /@ + _/_ < @ +/____/ @ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / / / /@ + / /_/ / @ + / ._,_/ @ +/_/ @@ +182 PILCROW SIGN + _______@ + / _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ + $ @ +$ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + ___@ + < /@ + / / @ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + \ \ \@ + / / /@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + ___ __ @ + < / _/_/ @ + / /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 VULGAR FRACTION ONE HALF + ___ __ @ + < / _/_/__ @ + / /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |_ / _/_/ @ + _/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 INVERTED QUESTION MARK + _ @ + (_)@ + _/ / @ +/ _/_ @ +\___/ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + __________@ + / ____/@ + / /| __/ @ + / __ /___ @ +/_/ /_____/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + /_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\@ + / __/@ + / _/ @ +/___/ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / __/@ + / _/ @ +/___/ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / __/ @ + / _/ @ +/___/ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / __/ @ + / _/ @ +/___/ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\@ + / _/@ + _/ / @ +/___/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + _/_/@ + / _/@ + _/ / @ +/___/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + / _/ @ + _/ / @ +/___/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + / _/ @ + _/ / @ +/___/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + / __ \@ + __/ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + _//\/ @ + / |/ / @ + / / @ +/_/|_/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ + / //// /@ +/ //// / @ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ +__/_/_@ +\ \/ /@ + \ / @ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / /_ @ + / __ \@ + / ____/@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + __\_\_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + __/_/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //| @ + _|/||_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + __(())@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ____ ___ @ + / __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ + / _ \@ +/ __/@ +\___/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ + / _ \@ +/ __/@ +\___/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + / / @ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + || @ + =||=@ + ___ || @ +/ __` | @ +\____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / __ \ @ + / / / / @ +/_/ /_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 DIVISION SIGN + @ + _ @ + __(_)_@ +/_____/@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + __/_/_@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / /_ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ + / /_/ / @ + \__, / @ +/____/ @@ diff --git a/resources/small.flf b/resources/small.flf new file mode 100644 index 00000000..d2a2c49c --- /dev/null +++ b/resources/small.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 15 10 0 22415 +Small by Glenn Chappell 4/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + @@ + _ _ @ + _| | |_ @ + |_ . _|@ + |_ _|@ + |_|_| @@ + @ + ||_@ + (_-<@ + / _/@ + || @@ + _ __ @ + (_)/ / @ + / /_ @ + /_/(_)@ + @@ + __ @ + / _|___ @ + > _|_ _|@ + \_____| @ + @@ + _ @ + ( )@ + |/ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + /_/ @@ + @ + _/\_@ + > <@ + \/ @ + @@ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + _ @ + ( )@ + |/ @@ + @ + ___ @ + |___|@ + $ @ + @@ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + /_/ @ + @@ + __ @ + / \ @ + | () |@ + \__/ @ + @@ + _ @ + / |@ + | |@ + |_|@ + @@ + ___ @ + |_ )@ + / / @ + /___|@ + @@ + ____@ + |__ /@ + |_ \@ + |___/@ + @@ + _ _ @ + | | | @ + |_ _|@ + |_| @ + @@ + ___ @ + | __|@ + |__ \@ + |___/@ + @@ + __ @ + / / @ + / _ \@ + \___/@ + @@ + ____ @ + |__ |@ + / / @ + /_/ @ + @@ + ___ @ + ( _ )@ + / _ \@ + \___/@ + @@ + ___ @ + / _ \@ + \_, /@ + /_/ @ + @@ + _ @ + (_)@ + _ @ + (_)@ + @@ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + < < @ + \_\@ + @@ + @ + ___ @ + |___|@ + |___|@ + @@ + __ @ + \ \ @ + > >@ + /_/ @ + @@ + ___ @ + |__ \@ + /_/@ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + \ \__,_|@ + \____/ @@ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + ___ @ + | _ )@ + | _ \@ + |___/@ + @@ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + ___ @ + | \ @ + | |) |@ + |___/ @ + @@ + ___ @ + | __|@ + | _| @ + |___|@ + @@ + ___ @ + | __|@ + | _| @ + |_| @ + @@ + ___ @ + / __|@ + | (_ |@ + \___|@ + @@ + _ _ @ + | || |@ + | __ |@ + |_||_|@ + @@ + ___ @ + |_ _|@ + | | @ + |___|@ + @@ + _ @ + _ | |@ + | || |@ + \__/ @ + @@ + _ __@ + | |/ /@ + | ' < @ + |_|\_\@ + @@ + _ @ + | | @ + | |__ @ + |____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + |_| |_|@ + @@ + _ _ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + | _ \@ + | _/@ + |_| @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__\_\@ + @@ + ___ @ + | _ \@ + | /@ + |_|_\@ + @@ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _____ @ + |_ _|@ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \/\/ / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + |_| @ + @@ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __ @ + | _|@ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + @@ + @ + @ + @ + ___ @ + |___|@@ + _ @ + ( )@ + \|@ + $ @ + @@ + @ + __ _ @ + / _` |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \@ + |_.__/@ + @@ + @ + __ @ + / _|@ + \__|@ + @@ + _ @ + __| |@ + / _` |@ + \__,_|@ + @@ + @ + ___ @ + / -_)@ + \___|@ + @@ + __ @ + / _|@ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + \__, |@ + |___/ @@ + _ @ + | |_ @ + | ' \ @ + |_||_|@ + @@ + _ @ + (_)@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + _/ |@ + |__/ @@ + _ @ + | |__@ + | / /@ + |_\_\@ + @@ + _ @ + | |@ + | |@ + |_|@ + @@ + @ + _ __ @ + | ' \ @ + |_|_|_|@ + @@ + @ + _ _ @ + | ' \ @ + |_||_|@ + @@ + @ + ___ @ + / _ \@ + \___/@ + @@ + @ + _ __ @ + | '_ \@ + | .__/@ + |_| @@ + @ + __ _ @ + / _` |@ + \__, |@ + |_|@@ + @ + _ _ @ + | '_|@ + |_| @ + @@ + @ + ___@ + (_-<@ + /__/@ + @@ + _ @ + | |_ @ + | _|@ + \__|@ + @@ + @ + _ _ @ + | || |@ + \_,_|@ + @@ + @ + __ __@ + \ V /@ + \_/ @ + @@ + @ + __ __ __@ + \ V V /@ + \_/\_/ @ + @@ + @ + __ __@ + \ \ /@ + /_\_\@ + @@ + @ + _ _ @ + | || |@ + \_, |@ + |__/ @@ + @ + ___@ + |_ /@ + /__|@ + @@ + __@ + / /@ + _| | @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | |_@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + @@ + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + |_|@ + @@ +162 CENT SIGN + @ + || @ + / _)@ + \ _)@ + || @@ +163 POUND SIGN + __ @ + _/ _\ @ + |_ _|_ @ + (_,___|@ + @@ +164 CURRENCY SIGN + /\_/\@ + \ . /@ + / _ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + / _)@ + /\ \ @ + \ \/ @ + (__/ @@ +168 DIAERESIS + _ _ @ + (_)(_)@ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / _| \@ + \ \__| /@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + < < < @ + \_\_\@ + @@ +172 NOT SIGN + ____ @ + |__ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + __ @ + |__|@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / | -) \@ + \ ||\\ /@ + \____/ @@ +175 MACRON + ___ @ + |___|@ + $ @ + $ @ + @@ +176 DEGREE SIGN + _ @ + /.\@ + \_/@ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ + /__|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ + |__)@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | || |@ + | .,_|@ + |_| @@ +182 PILCROW SIGN + ____ @ + / |@ + \_ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + > > >@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / |/ /__ @ + |_/ /_' |@ + /_/ |_|@ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / |/ /_ @ + |_/ /_ )@ + /_//__|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ // /__ @ + |__) /_' |@ + /_/ |_|@ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /--\ @ + /_/\_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /--\ @ + /_/\_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + /--\ @ + /_/\_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/|@ + |/\/ @ + /--\ @ + /_/\_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + __ @ + (()) @ + /--\ @ + /_/\_\@ + @@ +198 LATIN CAPITAL LETTER AE + ____ @ + /, __|@ + / _ _| @ + /_/|___|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + | -<@ + |__<@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + /_/@ + | -<@ + |__<@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + |/\|@ + | -<@ + |__<@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + | -< @ + |__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | __ \ @ + |_ _|) |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\_ @ + / __ \@ + \____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + _/_/ @ + / __ \@ + \____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + |/\| @ + / __ \@ + \____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / __ \@ + \____/@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ +215 MULTIPLICATION SIGN + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + _/_/_@ + \ V /@ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |_ @ + | -_)@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + _/_/ @ + / _` |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + / _` |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/|@ + |/\/ @ + / _` |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _` |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ___ @ + / _` -_)@ + \__,___|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + __ @ + / _|@ + \__|@ + )_)@@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / -_)@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / -_)@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / -_)@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / -_) @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + \\/\ @ + \/\\ @ + / _` |@ + \___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | ' \ @ + |_||_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \@ + \___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \@ + \___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + \___/@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / _ \@ + \___/@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ +247 DIVISION SIGN + _ @ + (_) @ + |___|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ + / //\@ + \//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + \_\_ @ + | || |@ + \_,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + |/\| @ + | || |@ + \_,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_, |@ + |__/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \@ + | .__/@ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_, |@ + |__/ @@ diff --git a/resources/speed.flf b/resources/speed.flf new file mode 100644 index 00000000..d294c52f --- /dev/null +++ b/resources/speed.flf @@ -0,0 +1,1301 @@ +flf2a$ 6 5 16 15 16 +Speed by Claude Martins 2/95 -- based on Slant +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Explanation of first line: +flf2 - "magic number" for file identification +a - should always be `a', for now +$ - the "hardblank" -- prints as a blank, but can't be smushed +6 - height of a character +5 - height of a character, not including descenders +14 - max line length (excluding comment lines) + a fudge factor +15 - default smushmode for this font +16 - number of comment lines + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +______@ +___ /@ +__ / @ + /_/ @ +(_) @ + @@ +___ _ @ +_( | )@ +_|/|/ @ + $ @ + $ @ + @@ +_______ __ @ +____/ // /_@ +_ _ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ +_______@ +____/ /@ +__ __/@ +_(_ ) @ +/ _/ @ +/_/ @@ +____ __@ +__(_)_/_/@ +____/_/ @ +__/_/_ @ +/_/ (_) @ + @@ +______ @ +__( _ ) @ +_ __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ +___ @ +_( )@ +_|/ @ + $ @ +$ @ + @@ +_______@ +____/_/@ +__ / @ +_ / @ +/ / @ +|_| @@ +______ @ +____| |@ +____ /@ +___ / @ +__/_/ @ +/_/ @@ +_____ @ +____/|_@ +_| /@ +/_ __| @ + |/ @ + @@ + @ +______ @ +___/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ +___ @ +_( )@ +_|/ @@ + @ + @ +________@ +_/_____/@ + $ @ + @@ + @ + @ + @ +___ @ +_(_)@ + @@ +_________@ +______/_/@ +____/_/ @ +__/_/ @ +/_/ @ + @@ +_______ @ +__ __ \@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +______@ +__< /@ +__ / @ +_ / @ +/_/ @ + @@ +______ @ +__|__ \@ +____/ /@ +_ __/ @ +/____/ @ + @@ +________@ +__|__ /@ +___/_ < @ +____/ / @ +/____/ @ + @@ +_____ __@ +__ // /@ +_ // /_@ +/__ __/@ + /_/ @ + @@ +__________@ +___ ____/@ +______ \ @ + ____/ / @ +/_____/ @ + @@ +________@ +__ ___/@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +______@ +/__ /@ +__ / @ +_ / @ +/_/ @ + @@ +_______ @ +__( __ )@ +_ __ |@ +/ /_/ / @ +\____/ @ + @@ +_______ @ +__ __ \@ +_ /_/ /@ +_\__, / @ +/____/ @ + @@ + @ +_____ @ +___(_)@ +___ @ +_(_) @ + @@ + @ +_____ @ +___(_)@ +___ @ +_( ) @ +_|/ @@ +____@ +_ /@ +/ / @ +\ \ @ + \_\@ + @@ + @ +_______@ +_ ____/@ +/____/ @ + $ @ + @@ +___ @ +__ \ @ +___ \@ +__ /@ +_/_/ @ + @@ +_____ @ +_ __ \@ +__/ _/@ +_/_/ @ +(_) @ + @@ +_________ @ +__ ____ \@ +_ / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ +_______ @ +___ |@ +__ /| |@ +_ ___ |@ +/_/ |_|@ + @@ +________ @ +___ __ )@ +__ __ |@ +_ /_/ / @ +/_____/ @ + @@ +_________@ +__ ____/@ +_ / @ +/ /___ @ +\____/ @ + @@ +________ @ +___ __ \@ +__ / / /@ +_ /_/ / @ +/_____/ @ + @@ +__________@ +___ ____/@ +__ __/ @ +_ /___ @ +/_____/ @ + @@ +__________@ +___ ____/@ +__ /_ @ +_ __/ @ +/_/ @ + @@ +_________@ +__ ____/@ +_ / __ @ +/ /_/ / @ +\____/ @ + @@ +______ __@ +___ / / /@ +__ /_/ / @ +_ __ / @ +/_/ /_/ @ + @@ +________@ +____ _/@ + __ / @ +__/ / @ +/___/ @ + @@ +_________@ +______ /@ +___ _ / @ +/ /_/ / @ +\____/ @ + @@ +______ __@ +___ //_/@ +__ ,< @ +_ /| | @ +/_/ |_| @ + @@ +______ @ +___ / @ +__ / @ +_ /___@ +/_____/@ + @@ +______ ___@ +___ |/ /@ +__ /|_/ / @ +_ / / / @ +/_/ /_/ @ + @@ +_____ __@ +___ | / /@ +__ |/ / @ +_ /| / @ +/_/ |_/ @ + @@ +_______ @ +__ __ \@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +________ @ +___ __ \@ +__ /_/ /@ +_ ____/ @ +/_/ @ + @@ +_______ @ +__ __ \@ +_ / / /@ +/ /_/ / @ +\___\_\ @ + @@ +________ @ +___ __ \@ +__ /_/ /@ +_ _, _/ @ +/_/ |_| @ + @@ +________@ +__ ___/@ +_____ \ @ +____/ / @ +/____/ @ + @@ +________@ +___ __/@ +__ / @ +_ / @ +/_/ @ + @@ +_____ __@ +__ / / /@ +_ / / / @ +/ /_/ / @ +\____/ @ + @@ +___ __@ +__ | / /@ +__ | / / @ +__ |/ / @ +_____/ @ + @@ +___ __@ +__ | / /@ +__ | /| / / @ +__ |/ |/ / @ +____/|__/ @ + @@ +____ __@ +__ |/ /@ +__ / @ +_ | @ +/_/|_| @ + @@ +__ __@ +_ \/ /@ +__ / @ +_ / @ +/_/ @ + @@ +______@ +___ /@ +__ / @ +_ /__@ +/____/@ + @@ +________@ +____ _/@ +___ / @ +__ / @ +_ / @ +/__/ @@ +___ @ +__ \ @ +___ \ @ +____ \ @ +______\@ + @@ +________@ +____/ /@ +____ / @ +___ / @ +__/ / @ +/__/ @@ +_ //|@ +_|/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ +________@ +_/_____/@@ +___ @ +_( )@ +__V @ + $ @ +$ @ + @@ + @ +______ _@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +______ @ +___ /_ @ +__ __ \@ +_ /_/ /@ +/_.___/ @ + @@ + @ +_______@ +_ ___/@ +/ /__ @ +\___/ @ + @@ +_________@ +______ /@ +_ __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ +_____ @ +_ _ \@ +/ __/@ +\___/ @ + @@ +________@ +___ __/@ +__ /_ @ +_ __/ @ +/_/ @ + @@ + @ +_______ _@ +__ __ `/@ +_ /_/ / @ +_\__, / @ +/____/ @@ +______ @ +___ /_ @ +__ __ \@ +_ / / /@ +/_/ /_/ @ + @@ +_____ @ +___(_)@ +__ / @ +_ / @ +/_/ @ + @@ +________ @ +______(_)@ +_____ / @ +____ / @ +___ / @ +/___/ @@ +______ @ +___ /__@ +__ //_/@ +_ ,< @ +/_/|_| @ + @@ +______@ +___ /@ +__ / @ +_ / @ +/_/ @ + @@ + @ +_______ ___ @ +__ __ `__ \@ +_ / / / / /@ +/_/ /_/ /_/ @ + @@ + @ +_______ @ +__ __ \@ +_ / / /@ +/_/ /_/ @ + @@ + @ +______ @ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ + @ +________ @ +___ __ \@ +__ /_/ /@ +_ .___/ @ +/_/ @@ + @ +______ _@ +_ __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ +________@ +__ ___/@ +_ / @ +/_/ @ + @@ + @ +________@ +__ ___/@ +_(__ ) @ +/____/ @ + @@ +_____ @ +__ /_@ +_ __/@ +/ /_ @ +\__/ @ + @@ + @ +____ __@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ +___ __@ +__ | / /@ +__ |/ / @ +_____/ @ + @@ + @ +___ __@ +__ | /| / /@ +__ |/ |/ / @ +____/|__/ @ + @@ + @ +____ __@ +__ |/_/@ +__> < @ +/_/|_| @ + @@ + @ +_____ __@ +__ / / /@ +_ /_/ / @ +_\__, / @ +/____/ @@ + @ +______@ +___ /@ +__ /_@ +_____/@ + @@ +_______@ +____/_/@ +__/_/ @ +< < @ +/ / @ +\_\ @@ +_______@ +____ /@ +___ / @ +__ / @ +_ / @ +/_/ @@ +____ _ @ +____| |@ +____/ /@ +____>_>@ +__/_/ @ +/_/ @@ +__/\//@ +_//\/ @ + $ @ + $ @ +$ @ + @@ +_____ _ @ +___(_)(_)@ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\____/ @ + @@ +____ _ @ +__(_)_(_)@ +_ __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\__,_/ @ + @@ +_________ @ +____ __ \@ +___ / / /@ +__ /_| | @ +_ //__/ @ +/_/ @@ +160 + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 +_____ @ +___(_)@ +__ / @ +_ / @ +/_/ @ + @@ +162 +_______@ +____/ /@ +_ ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 +_________ @ +____ ,__\@ +___/ /_ @ +__/ /___ @ +(_,____/ @ + @@ +164 +___ /|___/|@ +___| __ / @ +__ /_/ / @ +_ ___ | @ +|/ |/ @ + @@ +165 +___ ____@ +___| / /@ +_ _ __/@ +/_ __/ @ + /_/ @ + @@ +166 +_______@ +____ /@ +_____/ @ +____ @ +_ / @ +/_/ @@ +167 +_______ @ +____/ _)@ +__ | | @ +_| || | @ +_| |_/ @ +(__/ @@ +168 +___ _ @ +_(_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 +__________ @ +___ _____\ @ +__ / ___/ |@ +_ / /__ / @ +| \___/ / @ + \______/ @@ +170 +______ _@ +__ _ `/@ +__\_,_/ @ +/____/ @ + $ @ + @@ +171 +______@ +_ / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 + @ +________@ +_/___ /@ + /_/ @ + $ @ + @@ +173 + @ + @ +_______@ +_/____/@ + $ @ + @@ +174 +__________ @ +___ ___ \ @ +__ / _ \ |@ +_ / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 +________@ +_/_____/@ + $ @ + $ @ + $ @ + @@ +176 +_____ @ +_ _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 +________ @ +_____/ /_@ +____ __/@ +___/_/_ @ +/_____/ @ + @@ +178 +__ ___ @ +__|_ |@ +_ __/ @ +/____/ @ + $ @ + @@ +179 +__ ____@ +__|_ /@ +__/_ < @ +/____/ @ + $ @ + @@ +180 +____@ +_/_/@ + $ @ + $ @ +$ @ + @@ +181 + @ +______ __@ +___ / / /@ +__ /_/ / @ +_ ._,_/ @ +/_/ @@ +182 +_________@ +_ _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 + @ +___ @ +_(_)@ + $ @ + $ @ + @@ +184 + @ + @ + @ + @ +___ @ +_/_)@@ +185 +_____@ +_< /@ +_ / @ +/_/ @ +$ @ + @@ +186 +______ @ +__ _ \@ +__\___/@ +/____/ @ + $ @ + @@ +187 +_____ @ +__ \ \ @ +___ \ \@ +__ / /@ +___/_/ @ + @@ +188 +_____ __ @ +_< / _/_/ @ +_/ /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 +_____ __ @ +_< / _/_/__ @ +_/ /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 +__ ____ __ @ +__|_ / _/_/ @ +__/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 +___ _ @ +___(_)@ +__ / @ +/ _/_ @ +\___/ @ + @@ +192 +______ @ +____\_\@ +__ _ |@ +_ __ |@ +/_/ |_|@ + @@ +193 +_______@ +____/_/@ +__ _ |@ +_ __ |@ +/_/ |_|@ + @@ +194 +____ //|@ +____|/||@ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +195 +_____/\//@ +____//\/ @ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +196 +_____ _ @ +___(_)(_)@ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +197 +____(())@ +___ |@ +__ /| |@ +_ ___ |@ +/_/ |_|@ + @@ +198 +______________@ +___ ____/@ +__ /| __/ @ +_ __ /___ @ +/_/ /_____/ @ + @@ +199 +_________@ +__ ____/@ +_ / @ +/ /___ @ +\____/ @ + /_) @@ +200 +______ @ +____\_\@ +__ __/@ +_ _/ @ +/___/ @ + @@ +201 +_______@ +____/_/@ +__ __/@ +_ _/ @ +/___/ @ + @@ +202 +____ //|@ +____|/||@ +__ __/ @ +_ _/ @ +/___/ @ + @@ +203 +_____ _ @ +___(_)(_)@ +__ __/ @ +_ _/ @ +/___/ @ + @@ +204 +______ @ +____\_\@ +__ _/@ +__/ / @ +/___/ @ + @@ +205 +_______@ +____/_/@ +__ _/@ +__/ / @ +/___/ @ + @@ +206 +____ //|@ +____|/||@ +__ _/ @ +__/ / @ +/___/ @ + @@ +207 +_____ _ @ +___(_)(_)@ +__ _/ @ +__/ / @ +/___/ @ + @@ +208 +_________ @ +____ __ \@ +___ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 +_____/\//@ +____//\/ @ +__ |/ / @ +_ / @ +/_/|_/ @ + @@ +210 +______ @ +____\_\@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +211 +_______@ +____/_/@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +212 +___ //|@ +___|/||@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +213 +____/\//@ +___//\/ @ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 + @ +__ @ +_/|/|@ + > < @ +|/|/ @ + @@ +216 +________ @ +__ _// \@ +_ //// /@ +/ //// / @ +\_//__/ @ + @@ +217 +______ @ +____\_\_@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +218 +_______ @ +____/_/_@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +219 +___ //| @ +___|/||_@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +220 +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\____/ @ + @@ +221 +______ @ +___/_/_@ +__ \/ /@ +___ / @ +__/_/ @ + @@ +222 +______ @ +___ /_ @ +__ __ \@ +_ ____/@ +/_/ @ + @@ +223 +_________ @ +____ __ \@ +___ / / /@ +__ /_| | @ +_ //__/ @ +/_/ @@ +224 +______ @ +____\_\_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 +_______ @ +____/_/_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 +___ //| @ +___|/||_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 +____/\//@ +___//\/_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 +____ _ @ +__(_)_(_)@ +_ __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 +_______ @ +____(())@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 + @ +______ ___ @ +_ __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 + @ +_______@ +_ ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 +_____ @ +___\_\@ +_ _ \@ +/ __/@ +\___/ @ + @@ +233 +______@ +___/_/@ +_ _ \@ +/ __/@ +\___/ @ + @@ +234 +___ //|@ +___|/||@ +_ _ \ @ +/ __/ @ +\___/ @ + @@ +235 +____ _ @ +__(_)(_)@ +_ _ \ @ +/ __/ @ +\___/ @ + @@ +236 +_____ @ +___\_\@ +__ / @ +_ / @ +/_/ @ + @@ +237 +______@ +___/_/@ +__ / @ +_ / @ +/_/ @ + @@ +238 +___ //|@ +___|/||@ +__ / @ +_ / @ +/_/ @ + @@ +239 +_ _ _ @ +_(_)_(_)@ +__/ / @ +_ / @ +/_/ @ + @@ +240 +____ || @ +____=||=@ +____ || @ +/ __` | @ +\____/ @ + @@ +241 +_____/\//@ +____//\/ @ +__ __ \ @ +_ / / / @ +/_/ /_/ @ + @@ +242 +______ @ +____\_\@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +243 +_______@ +____/_/@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +244 +___ //|@ +___|/||@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +245 +____/\//@ +___//\/ @ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 + @ +_____ @ +___(_)_@ +/_____/@ + (_) @ + @@ +248 + @ +_______ @ +_ _// \@ +/ //// /@ +\_//__/ @ + @@ +249 +______ @ +____\_\_@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 +_______ @ +____/_/_@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 +___ //| @ +___|/||_@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 +________ @ +_____/_/_@ +__ / / /@ +_ /_/ / @ +_\__, / @ +/____/ @@ +254 +_______ @ +____ /_ @ +___ __ \@ +__ /_/ /@ +_ .___/ @ +/_/ @@ +255 +_____ _ @ +___(_) (_)@ +__ / / / @ +_ /_/ / @ +_\__, / @ +/____/ @@ diff --git a/resources/starwars.flf b/resources/starwars.flf new file mode 100644 index 00000000..6ea55f02 --- /dev/null +++ b/resources/starwars.flf @@ -0,0 +1,719 @@ +flf2a$ 7 6 22 15 4 +starwars.flf by Ryan Youck (youck@cs.uregina.ca) Dec 25/1994 +I am not responsible for use of this font +Based on Big.flf by Glenn Chappell + +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ + __ $@ +| |$@ +| |$@ +| |$@ +|__|$@ +(__)$@ + $@@ + _ _ @ +( | )@ + V V @ + $ @ + $ @ + $ @ + @@ + _ _ @ + _| || |_$@ +|_ __ _|@ + _| || |_ @ +|_ __ _|@ + |_||_| $@ + @@ + __,--,_.@ + / |@ + | (----`@ + \ \ $@ +.----) | $@ +|_ __/ $@ + '--' $@@ + _ ___$ @ + / \ / /$ @ +( o ) / / $ @ + \_/ / / _$ @ + / / / \ @ + / / ( o )@ + /__/ \_/ @@ + @ + ___ @ + ( _ ) $@ + / _ \/\@ +| (_> <@ + \___/\/@ + $@@ + __ @ +(_ )@ + |/ @ + $ @ + $ @ + $ @ + @@ + ___@ + / /@ +| |$@ +| |$@ +| |$@ +| |$@ + \__\@@ +___ @ +\ \ @ + | |@ + | |@ + | |@ + | |@ +/__/ @@ + _ @ + /\| |/\ @ + \ ` ' /$@ +|_ _|@ + / , . \$@ + \/|_|\/ @ + @@ + @ + _ @ + _| |_$@ +|_ _|@ + |_| $@ + $ @ + @@ + @ + @ + $ @ + $ @ + __ @ +(_ )@ + |/ @@ + @ + @ + ______ @ +|______|@ + $ @ + $ @ + @@ + @ + @ + @ + $ @ + __ @ +(__)@ + @@ + ___@ + / /@ + / / @ + / /$ @ + / /$ @ +/__/$ @ + @@ + ___ $@ + / _ \ $@ +| | | |$@ +| | | |$@ +| |_| |$@ + \___/ $@ + $@@ + __ $@ +/_ |$@ + | |$@ + | |$@ + | |$@ + |_|$@ + $@@ + ___ $@ +|__ \ $@ + $) |$@ + / / $@ + / /_ $@ +|____|$@ + $@@ + ____ $@ +|___ \ $@ + __) |$@ + |__ < $@ + ___) |$@ +|____/ $@ + $@@ + _ _ $@ +| || | $@ +| || |_ $@ +|__ _|$@ + | | $@ + |_| $@ + $@@ + _____ $@ +| ____|$@ +| |__ $@ +|___ \ $@ + ___) |$@ +|____/ $@ + $@@ + __ $@ + / / $@ + / /_ $@ +| '_ \ $@ +| (_) |$@ + \___/ $@ + $@@ + ______ $@ +|____ |$@ + $/ / $@ + / / $@ + / / $@ + /_/ $@ + $@@ + ___ $@ + / _ \ $@ +| (_) |$@ + > _ < $@ +| (_) |$@ + \___/ $@ + $@@ + ___ $@ + / _ \ $@ +| (_) |$@ + \__, |$@ + / / $@ + /_/ $@ + $@@ + @ + _ @ +(_)@ + $ @ + _ @ +(_)@ + @@ + @ + _ @ +(_)@ + $ @ + _ @ +( )@ +|/ @@ + ___@ + / /@ + / /$@ +< <$ @ + \ \$@ + \__\@ + @@ + @ + ______ @ +|______|@ + ______ @ +|______|@ + @ + @@ +___ @ +\ \$ @ + \ \ @ + > >@ + / / @ +/__/$ @ + @@ + ______ $@ +| \ $@ +`----) |$@ + / / $@ + |__| $@ + __ $@ + (__) $@@ + ____ @ + / __ \ @ + / / _` |@ +| | (_| |@ + \ \__,_|@ + \____/ @ + @@ + ___ $ @ + / \ $ @ + / ^ \$ @ + / /_\ \$ @ + / _____ \$ @ +/__/ \__\$@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| _ < $@ +| |_) |$@ +|______/ $@ + $@@ + ______$@ + / |@ +| ,----'@ +| | $@ +| `----.@ + \______|@ + $@@ + _______ $@ +| \$@ +| .--. |@ +| | | |@ +| '--' |@ +|_______/$@ + $@@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| |____ @ +|_______|@ + @@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| | $ @ +|__| @ + @@ + _______ @ + / _____|@ +| | __ $@ +| | |_ |$@ +| |__| |$@ + \______|$@ + $@@ + __ __ $@ +| | | |$@ +| |__| |$@ +| __ |$@ +| | | |$@ +|__| |__|$@ + $@@ + __ $@ +| |$@ +| |$@ +| |$@ +| |$@ +|__|$@ + $@@ + __ $@ + | |$@ + | |$@ +.--. | |$@ +| `--' |$@ + \______/ $@ + $@@ + __ ___$@ +| |/ /$@ +| ' / $@ +| < $@ +| . \ $@ +|__|\__\$@ + $@@ + __ $@ +| | $@ +| | $@ +| | $@ +| `----.@ +|_______|@ + $@@ +.___ ___.$@ +| \/ |$@ +| \ / |$@ +| |\/| |$@ +| | | |$@ +|__| |__|$@ + $@@ +.__ __.$@ +| \ | |$@ +| \| |$@ +| . ` |$@ +| |\ |$@ +|__| \__|$@ + $@@ + ______ $@ + / __ \ $@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| ___/ $@ +| | $ @ +| _| $ @ + $ @@ + ______ $ @ + / __ \ $ @ +| | | | $ @ +| | | | $ @ +| `--' '--. @ + \_____\_____\@ + $ @@ +.______ $ @ +| _ \ $ @ +| |_) | $ @ +| / $ @ +| |\ \----.@ +| _| `._____|@ + $@@ + _______.@ + / |@ + | (----`@ + \ \ $@ +.----) | $@ +|_______/ $@ + $@@ +.___________.@ +| |@ +`---| |----`@ + | | $ @ + | | $ @ + |__| $ @ + $ @@ + __ __ $@ +| | | |$@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \ /$ @ + \ /$ @ + \__/$ @ + $ @@ +____ __ ____$@ +\ \ / \ / /$@ + \ \/ \/ /$ @ + \ /$ @ + \ /\ /$ @ + \__/ \__/$ @ + $ @@ +___ ___$@ +\ \ / /$@ + \ V / $@ + > < $@ + / . \ $@ +/__/ \__\$@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \_ _/$ @ + | |$ @ + |__|$ @ + $ @@ + ________ $@ +| / $@ +`---/ / $@ + / / $@ + / /----.@ + /________|@ + $@@ + ____ @ +| |@ +| |-`@ +| | $@ +| | $@ +| |-.@ +|____|@@ +___ @ +\ \ $ @ + \ \$ @ + \ \$ @ + \ \$@ + \__\@ + @@ + ____ @ +| |@ +`-| |@ + | |@ + | |@ +.-| |@ +|____|@@ + ___ @ + / \ @ +/--^--\@ + $@ + $@ + $@ + $@@ + @ + @ + @ + $ @ + $ @ + ______ @ +|______|@@ + __ @ +( _)@ + \| @ + $ @ + $ @ + $ @ + @@ + ___ $ @ + / \ $ @ + / ^ \$ @ + / /_\ \$ @ + / _____ \$ @ +/__/ \__\$@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| _ < $@ +| |_) |$@ +|______/ $@ + $@@ + ______$@ + / |@ +| ,----'@ +| | $@ +| `----.@ + \______|@ + $@@ + _______ $@ +| \$@ +| .--. |@ +| | | |@ +| '--' |@ +|_______/$@ + $@@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| |____ @ +|_______|@ + @@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| | $ @ +|__| @ + @@ + _______ @ + / _____|@ +| | __ $@ +| | |_ |$@ +| |__| |$@ + \______|$@ + $@@ + __ __ $@ +| | | |$@ +| |__| |$@ +| __ |$@ +| | | |$@ +|__| |__|$@ + $@@ + __ $@ +| |$@ +| |$@ +| |$@ +| |$@ +|__|$@ + $@@ + __ $@ + | |$@ + | |$@ +.--. | |$@ +| `--' |$@ + \______/ $@ + $@@ + __ ___$@ +| |/ /$@ +| ' / $@ +| < $@ +| . \ $@ +|__|\__\$@ + $@@ + __ $@ +| | $@ +| | $@ +| | $@ +| `----.@ +|_______|@ + $@@ +.___ ___.$@ +| \/ |$@ +| \ / |$@ +| |\/| |$@ +| | | |$@ +|__| |__|$@ + $@@ +.__ __.$@ +| \ | |$@ +| \| |$@ +| . ` |$@ +| |\ |$@ +|__| \__|$@ + $@@ + ______ $@ + / __ \ $@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| ___/ $@ +| | $ @ +| _| $ @ + $ @@ + ______ $ @ + / __ \ $ @ +| | | | $ @ +| | | | $ @ +| `--' '--. @ + \_____\_____\@ + $ @@ +.______ $ @ +| _ \ $ @ +| |_) | $ @ +| / $ @ +| |\ \----.@ +| _| `._____|@ + $@@ + _______.@ + / |@ + | (----`@ + \ \ $@ +.----) | $@ +|_______/ $@ + $@@ +.___________.@ +| |@ +`---| |----`@ + | | $ @ + | | $ @ + |__| $ @ + $ @@ + __ __ $@ +| | | |$@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \ /$ @ + \ /$ @ + \__/$ @ + $ @@ +____ __ ____$@ +\ \ / \ / /$@ + \ \/ \/ /$ @ + \ /$ @ + \ /\ /$ @ + \__/ \__/$ @ + $ @@ +___ ___$@ +\ \ / /$@ + \ V / $@ + > < $@ + / . \ $@ +/__/ \__\$@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \_ _/$ @ + | |$ @ + |__|$ @ + $ @@ + ________ $@ +| / $@ +`---/ / $@ + / / $@ + / /----.@ + /________|@ + $@@ + ___@ + / /@ + | |$@ +/ /$ @ +\ \$ @ + | |$@ + \__\@@ + __ $@ +| |$@ +| |$@ +| |$@ +| |$@ +| |$@ +|__|$@@ +___ @ +\ \$ @ + | | @ + \ \@ + / /@ + | | @ +/__/$ @@ + __ _ @ + / \/ |@ +|_/\__/ @ + $ @ + $ @ + $ @ + @@ + _ _ @ + (_)_(_) @ + / \ @ + / _ \ @ + / ___ \ @ +/_/ \_\@ + @@ + _ _ @ +(_)_(_)@ + / _ \ @ +| | | |@ +| |_| |@ + \___/ @ + @@ + _ _ @ +(_) (_)@ +| | | |@ +| | | |@ +| |_| |@ + \___/ @ + @@ + _ _ @ +(_) (_)@ + __ _ @ + / _` |@ +| (_| |@ + \__,_|@ + @@ + _ _ @ +(_) (_)@ + ___ @ + / _ \ @ +| (_) |@ + \___/ @ + @@ + _ _ @ +(_) (_)@ + _ _ @ +| | | |@ +| |_| |@ + \__,_|@ + @@ + ___ @ + / _ \ @ +| | ) |@ +| |< < @ +| | ) |@ +| ||_/ @ +|_| @@ diff --git a/src/config/settings.rs b/src/config/settings.rs index 3c9a7853..40723e3e 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -70,23 +70,24 @@ macro_rules! config_map { #[derive(Debug, Deserialize)] pub struct App { - pub name : String, - pub description : String, - pub language : String, - pub theme : String, - pub run_mode : String, + pub name : String, + pub description : String, + pub language : String, + pub theme : String, + pub startup_banner: String, + pub run_mode : String, } #[derive(Debug, Deserialize)] pub struct Webserver { - pub bind_address : String, - pub bind_port : u16, + pub bind_address : String, + pub bind_port : u16, } #[derive(Debug, Deserialize)] pub struct Settings { - pub app : App, - pub webserver : Webserver, + pub app : App, + pub webserver : Webserver, } config_map!(r#" @@ -100,6 +101,7 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]* y "app.description" => "Developed with the amazing PageTop framework.", "app.language" => "en-US", "app.theme" => "Minimal", + "app.startup_banner" => "Small", // [webserver] "webserver.bind_address" => "localhost", diff --git a/src/core/server/main.rs b/src/core/server/main.rs index ea0deafc..c9271df5 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -12,6 +12,24 @@ pub fn run(bootstrap: Option) -> Result { // Al ser el último, puede sobrecargarse en la función de arranque. register_module(&base::module::homepage::HomepageModule); + // Si el arranque ha ido bien imprime un rótulo opcional de bienvenida. + if SETTINGS.app.startup_banner.to_lowercase() != "off" { + let figfont = figlet_rs::FIGfont::from_content( + match SETTINGS.app.startup_banner.to_lowercase().as_str() { + "slant" => include_str!("../../../resources/slant.flf"), + "small" => include_str!("../../../resources/small.flf"), + "speed" => include_str!("../../../resources/speed.flf"), + "starwars" => include_str!("../../../resources/starwars.flf"), + _ => include_str!("../../../resources/small.flf") + } + ).unwrap(); + println!("\n{} {}\n\n Powered by PageTop {}\n", + figfont.convert(&SETTINGS.app.name).unwrap(), + &SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + } + // Inicializa el servidor web. let server = server::HttpServer::new(|| { server::App::new() From cb557f4a867cc8ac0afd7f5e3ce6196d2bd20d47 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Mon, 14 Feb 2022 22:52:41 +0100 Subject: [PATCH 009/853] =?UTF-8?q?A=C3=B1ade=20seguimiento=20de=20la=20tr?= =?UTF-8?q?aza=20de=20ejecuci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 6 +++++ config/settings.default.toml | 5 +++- src/config/settings.rs | 2 ++ src/core/server/main.rs | 52 ++++++++++++++++++++++++++++-------- src/lib.rs | 1 + src/prelude.rs | 2 ++ src/trace/mod.rs | 1 + 7 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 src/trace/mod.rs diff --git a/Cargo.toml b/Cargo.toml index 1a36650e..4c98cc21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,12 @@ figlet-rs = "0.1.3" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } +tracing = "0.1" +tracing-log = "0.1" +tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] } +tracing-bunyan-formatter = "0.3" +tracing-actix-web = "0.2" + fluent-templates = "0.6.1" unic-langid = "0.9.0" diff --git a/config/settings.default.toml b/config/settings.default.toml index 0a446896..3d6d0b40 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -5,8 +5,11 @@ description = "Developed with the amazing PageTop framework." language = "en-US" # Tema predeterminado. theme = "Minimal" -# Rótulo al inicio: "Off", "Slant", "Small", "Speed" or "Starwars". +# Rótulo al inicio: "Off", "Slant", "Small", "Speed" o "Starwars". startup_banner = "Small" +# Traza de la ejecución: "Error", "Warn", "Info", "Debug" o "Trace". +# Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". +tracing = "Info" [webserver] # Configuración opcional del servidor web. diff --git a/src/config/settings.rs b/src/config/settings.rs index 40723e3e..3ac39634 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -75,6 +75,7 @@ pub struct App { pub language : String, pub theme : String, pub startup_banner: String, + pub tracing : String, pub run_mode : String, } @@ -102,6 +103,7 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]* y "app.language" => "en-US", "app.theme" => "Minimal", "app.startup_banner" => "Small", + "app.tracing" => "Info", // [webserver] "webserver.bind_address" => "localhost", diff --git a/src/core/server/main.rs b/src/core/server/main.rs index c9271df5..a0ebc59e 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,18 +1,30 @@ -use crate::base; +use crate::{base, trace}; use crate::config::SETTINGS; use crate::core::{Server, all, register_module, server}; +use tracing::subscriber::set_global_default; +use tracing_subscriber::{EnvFilter, Registry}; +use tracing_subscriber::layer::SubscriberExt; +use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer}; +use tracing_log::LogTracer; +use tracing_actix_web::TracingLogger; + pub fn run(bootstrap: Option) -> Result { - // Ejecuta la función de arranque de la aplicación. - if bootstrap != None { - let _ = &(bootstrap.unwrap())(); - } + // Inicia el seguimiento de la traza de ejecución de la aplicación. + let env_filter = EnvFilter::try_new(String::from(&SETTINGS.app.tracing)) + .unwrap_or(EnvFilter::new(String::from("Info"))); + let formatting_layer = BunyanFormattingLayer::new( + String::from(&SETTINGS.app.name), + std::io::stdout + ); + let subscriber = Registry::default() + .with(env_filter) + .with(JsonStorageLayer) + .with(formatting_layer); + LogTracer::init().expect("Failed to set logger"); + set_global_default(subscriber).expect("Failed to set subscriber"); - // Registra el módulo para la página de inicio de PageTop. - // Al ser el último, puede sobrecargarse en la función de arranque. - register_module(&base::module::homepage::HomepageModule); - - // Si el arranque ha ido bien imprime un rótulo opcional de bienvenida. + // Imprime el rótulo (opcional) de bienvenida. if SETTINGS.app.startup_banner.to_lowercase() != "off" { let figfont = figlet_rs::FIGfont::from_content( match SETTINGS.app.startup_banner.to_lowercase().as_str() { @@ -20,7 +32,13 @@ pub fn run(bootstrap: Option) -> Result { "small" => include_str!("../../../resources/small.flf"), "speed" => include_str!("../../../resources/speed.flf"), "starwars" => include_str!("../../../resources/starwars.flf"), - _ => include_str!("../../../resources/small.flf") + _ => { + trace::warn!( + ">>> FIGfont \"{}\" not found for banner. Using \"{}\"", + SETTINGS.app.startup_banner, "Small" + ); + include_str!("../../../resources/small.flf") + } } ).unwrap(); println!("\n{} {}\n\n Powered by PageTop {}\n", @@ -30,9 +48,21 @@ pub fn run(bootstrap: Option) -> Result { ); } + // Ejecuta la función de inicio de la aplicación. + if bootstrap != None { + trace::debug!("Calling application bootstrap"); + let _ = &(bootstrap.unwrap())(); + } + + // Registra el módulo para la página de inicio de PageTop. + // Al ser el último, puede sobrecargarse en la función de arranque. + register_module(&base::module::homepage::HomepageModule); + + // Inicializa el servidor web. let server = server::HttpServer::new(|| { server::App::new() + .wrap(TracingLogger) .configure(&all::themes) .configure(&all::modules) }) diff --git a/src/lib.rs b/src/lib.rs index 87e80aac..c72b36f9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,7 @@ pub use once_cell::sync::Lazy; pub mod macros; // Macros útiles. pub mod config; // Gestión de la configuración. +pub mod trace; // Seguimiento de la traza de ejecución. pub mod locale; // Localización. pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. pub mod base; // Temas, Módulos y Componentes base. diff --git a/src/prelude.rs b/src/prelude.rs index c74bb379..8ae92907 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -3,6 +3,8 @@ pub use crate::args; pub use crate::localize; +pub use crate::trace; + pub use crate::core::theme::*; pub use crate::core::module::*; diff --git a/src/trace/mod.rs b/src/trace/mod.rs new file mode 100644 index 00000000..f4af4116 --- /dev/null +++ b/src/trace/mod.rs @@ -0,0 +1 @@ +pub use tracing::{debug, error, info, trace, warn}; From 1d438dff57c32bc00d831162bd2924169138c4bf Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Wed, 16 Feb 2022 00:33:35 +0100 Subject: [PATCH 010/853] =?UTF-8?q?Mejora=20la=20funcionalidad=20de=20la?= =?UTF-8?q?=20traza=20de=20ejecuci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + config/settings.default.toml | 10 +++++++- src/config/settings.rs | 21 +++++++++++++---- src/core/server/main.rs | 45 ++++++++++++++++++++++++++++-------- src/lib.rs | 2 +- 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4c98cc21..8eb88ee2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ config_rs = { package = "config", version = "0.11.0", features = ["toml"] } tracing = "0.1" tracing-log = "0.1" +tracing-appender = "0.2" tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] } tracing-bunyan-formatter = "0.3" tracing-actix-web = "0.2" diff --git a/config/settings.default.toml b/config/settings.default.toml index 3d6d0b40..1df46f5c 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -7,9 +7,17 @@ language = "en-US" theme = "Minimal" # Rótulo al inicio: "Off", "Slant", "Small", "Speed" o "Starwars". startup_banner = "Small" -# Traza de la ejecución: "Error", "Warn", "Info", "Debug" o "Trace". + +[log] +# Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". # Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". tracing = "Info" +# En terminal ("Stdout") o archivos "Daily", "Hourly", "Minutely" o "Endless". +rolling = "Daily" +# Directorio para los archivos de traza (si rolling != "Stdout"). +path = "log" +# Prefijo para los archivos de traza (si rolling != "Stdout"). +prefix = "tracing.log" [webserver] # Configuración opcional del servidor web. diff --git a/src/config/settings.rs b/src/config/settings.rs index 3ac39634..4d791763 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -75,10 +75,17 @@ pub struct App { pub language : String, pub theme : String, pub startup_banner: String, - pub tracing : String, pub run_mode : String, } +#[derive(Debug, Deserialize)] +pub struct Log { + pub tracing : String, + pub rolling : String, + pub path : String, + pub prefix : String, +} + #[derive(Debug, Deserialize)] pub struct Webserver { pub bind_address : String, @@ -88,12 +95,13 @@ pub struct Webserver { #[derive(Debug, Deserialize)] pub struct Settings { pub app : App, + pub log : Log, pub webserver : Webserver, } config_map!(r#" -Ajustes globales y valores predeterminados para las secciones *\[app\]* y -*\[webserver\]* específicas de PageTop. +Ajustes globales y valores predeterminados para las secciones *\[app\]*, +*\[log\]* y *\[webserver\]* específicas de PageTop. "#, SETTINGS, Settings, @@ -103,7 +111,12 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]* y "app.language" => "en-US", "app.theme" => "Minimal", "app.startup_banner" => "Small", - "app.tracing" => "Info", + + // [log] + "log.tracing" => "Info", + "log.rolling" => "Daily", + "log.path" => "log", + "log.prefix" => "tracing.log", // [webserver] "webserver.bind_address" => "localhost", diff --git a/src/core/server/main.rs b/src/core/server/main.rs index a0ebc59e..0884201e 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -2,27 +2,54 @@ use crate::{base, trace}; use crate::config::SETTINGS; use crate::core::{Server, all, register_module, server}; -use tracing::subscriber::set_global_default; +use tracing_log::LogTracer; use tracing_subscriber::{EnvFilter, Registry}; use tracing_subscriber::layer::SubscriberExt; +use tracing::subscriber::set_global_default; use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer}; -use tracing_log::LogTracer; use tracing_actix_web::TracingLogger; pub fn run(bootstrap: Option) -> Result { - // Inicia el seguimiento de la traza de ejecución de la aplicación. - let env_filter = EnvFilter::try_new(String::from(&SETTINGS.app.tracing)) - .unwrap_or(EnvFilter::new(String::from("Info"))); + // Inicia la traza de ejecución de la aplicación. + let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing) + .unwrap_or(EnvFilter::new("Info")); + + let rolling = SETTINGS.log.rolling.to_lowercase(); + let (non_blocking, _guard) = match rolling.as_str() { + "stdout" => tracing_appender::non_blocking( + std::io::stdout() + ), + _ => tracing_appender::non_blocking({ + let path = &SETTINGS.log.path; + let prefix = &SETTINGS.log.prefix; + match rolling.as_str() { + "daily" => tracing_appender::rolling::daily(path, prefix), + "hourly" => tracing_appender::rolling::hourly(path, prefix), + "minutely" => tracing_appender::rolling::minutely(path, prefix), + "endless" => tracing_appender::rolling::never(path, prefix), + _ => { + println!( + "Rolling value \"{}\" not valid. Using \"daily\"", + rolling + ); + tracing_appender::rolling::daily(path, prefix) + } + } + }) + }; let formatting_layer = BunyanFormattingLayer::new( String::from(&SETTINGS.app.name), - std::io::stdout + non_blocking ); + let subscriber = Registry::default() .with(env_filter) .with(JsonStorageLayer) .with(formatting_layer); - LogTracer::init().expect("Failed to set logger"); - set_global_default(subscriber).expect("Failed to set subscriber"); + + set_global_default(subscriber).expect("Unable to setup subscriber!"); + + LogTracer::init().expect("Unable to setup log tracer!"); // Imprime el rótulo (opcional) de bienvenida. if SETTINGS.app.startup_banner.to_lowercase() != "off" { @@ -34,7 +61,7 @@ pub fn run(bootstrap: Option) -> Result { "starwars" => include_str!("../../../resources/starwars.flf"), _ => { trace::warn!( - ">>> FIGfont \"{}\" not found for banner. Using \"{}\"", + "FIGfont \"{}\" not found for banner. Using \"{}\"", SETTINGS.app.startup_banner, "Small" ); include_str!("../../../resources/small.flf") diff --git a/src/lib.rs b/src/lib.rs index c72b36f9..327379a9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,7 @@ pub use once_cell::sync::Lazy; pub mod macros; // Macros útiles. pub mod config; // Gestión de la configuración. -pub mod trace; // Seguimiento de la traza de ejecución. +pub mod trace; // Traza de ejecución. pub mod locale; // Localización. pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. pub mod base; // Temas, Módulos y Componentes base. From d38df3a5b65918747a30dc92fdf28768aa1f6f34 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 20 Feb 2022 23:01:11 +0100 Subject: [PATCH 011/853] =?UTF-8?q?A=C3=B1ade=20m=C3=B3dulo=20User=20y=20c?= =?UTF-8?q?omponentes=20para=20formularios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/settings.default.toml | 3 +- src/base/component/chunck.rs | 8 +- src/base/component/container.rs | 4 +- src/base/component/form/button.rs | 174 +++++++++ src/base/component/form/date.rs | 264 +++++++++++++ src/base/component/form/form.rs | 152 ++++++++ src/base/component/form/hidden.rs | 110 ++++++ src/base/component/form/input.rs | 346 ++++++++++++++++++ src/base/component/form/mod.rs | 11 + src/base/component/mod.rs | 9 +- .../homepage/locales/en-US/homepage.ftl | 19 +- .../homepage/locales/es-ES/homepage.ftl | 19 +- src/base/module/homepage/mod.rs | 55 ++- src/base/module/mod.rs | 1 + .../module/user/locales/en-US/homepage.ftl | 8 + .../module/user/locales/es-ES/homepage.ftl | 8 + src/base/module/user/mod.rs | 47 +++ src/core/server/main.rs | 3 + src/core/state.rs | 4 +- src/macros/mod.rs | 2 +- src/prelude.rs | 7 +- 21 files changed, 1228 insertions(+), 26 deletions(-) create mode 100644 src/base/component/form/button.rs create mode 100644 src/base/component/form/date.rs create mode 100644 src/base/component/form/form.rs create mode 100644 src/base/component/form/hidden.rs create mode 100644 src/base/component/form/input.rs create mode 100644 src/base/component/form/mod.rs create mode 100644 src/base/module/user/locales/en-US/homepage.ftl create mode 100644 src/base/module/user/locales/es-ES/homepage.ftl create mode 100644 src/base/module/user/mod.rs diff --git a/config/settings.default.toml b/config/settings.default.toml index 1df46f5c..53a2c693 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -20,7 +20,6 @@ path = "log" prefix = "tracing.log" [webserver] -# Configuración opcional del servidor web. -# Usar bind_address = "" para deshabilitar el servidor web. +# Configuración del servidor web. bind_address = "localhost" bind_port = 8088 diff --git a/src/base/component/chunck.rs b/src/base/component/chunck.rs index 29c62918..8d4e956f 100644 --- a/src/base/component/chunck.rs +++ b/src/base/component/chunck.rs @@ -37,14 +37,12 @@ impl PageComponent for Chunck { impl Chunck { - // Chunck BUILDER. - pub fn markup(markup: Markup) -> Self { - let mut chunck = Chunck::prepare(); - chunck.markup.push(markup); - chunck + Chunck::prepare().add_markup(markup) } + // Chunck BUILDER. + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self diff --git a/src/base/component/container.rs b/src/base/component/container.rs index 58a0caac..dfb1a010 100644 --- a/src/base/component/container.rs +++ b/src/base/component/container.rs @@ -48,8 +48,6 @@ impl PageComponent for Container { impl Container { - // Container BUILDER. - pub fn row() -> Self { let mut grid = Container::prepare(); grid.container = ContainerType::Row; @@ -62,6 +60,8 @@ impl Container { grid } + // Container BUILDER. + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self diff --git a/src/base/component/form/button.rs b/src/base/component/form/button.rs new file mode 100644 index 00000000..440ccf93 --- /dev/null +++ b/src/base/component/form/button.rs @@ -0,0 +1,174 @@ +use crate::prelude::*; + +enum ButtonType {Button, Reset, Submit} + +pub struct Button { + renderable : fn() -> bool, + weight : i8, + button_type: ButtonType, + name : Option, + value : Option, + autofocus : Option, + disabled : Option, + template : String, +} + +impl PageComponent for Button { + + fn prepare() -> Self { + Button { + renderable : always, + weight : 0, + button_type: ButtonType::Button, + name : None, + value : None, + autofocus : None, + disabled : None, + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, _: &mut PageAssets) -> Markup { + let (button_type, button_class) = match &self.button_type { + ButtonType::Button => ("button", "btn btn-primary form-button"), + ButtonType::Reset => ("reset", "btn btn-primary form-reset" ), + ButtonType::Submit => ("submit", "btn btn-primary form-submit") + }; + let id_item = match &self.name { + Some(name) => Some(format!("edit-{}", name)), + _ => None + }; + html! { + button + type=(button_type) + id=[&id_item] + class=(button_class) + name=[&self.name] + value=[&self.value] + autofocus=[&self.autofocus] + disabled=[&self.disabled] + { + @match &self.value { + Some(value) => (value), + _ => "" + }; + } + } + } +} + +impl Button { + + pub fn button(value: &str) -> Self { + Button::prepare().with_value(value) + } + + pub fn reset(value: &str) -> Self { + let mut button = Button::prepare().with_value(value); + button.button_type = ButtonType::Reset; + button + } + + pub fn submit(value: &str) -> Self { + let mut button = Button::prepare().with_value(value); + button.button_type = ButtonType::Submit; + button + } + + // Button BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_name(mut self, name: &str) -> Self { + self.name = if name.is_empty() { + None + } else { + Some(name.replace(" ", "_")) + }; + self + } + + pub fn with_value(mut self, value: &str) -> Self { + self.value = if value.is_empty() { + None + } else { + Some(value.to_string()) + }; + self + } + + pub fn autofocus(mut self, toggle: bool) -> Self { + self.autofocus = match toggle { + true => Some("autofocus".to_string()), + false => None + }; + self + } + + pub fn disabled(mut self, toggle: bool) -> Self { + self.disabled = match toggle { + true => Some("disabled".to_string()), + false => None + }; + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Button GETTERS. + + pub fn name(&self) -> &str { + match &self.name { + Some(name) => name.as_str(), + _ => "" + } + } + + pub fn value(&self) -> &str { + match &self.value { + Some(value) => value.as_str(), + _ => "" + } + } + + pub fn has_autofocus(&self) -> bool { + match &self.autofocus { + Some(_) => true, + _ => false + } + } + + pub fn is_disabled(&self) -> bool { + match &self.disabled { + Some(_) => true, + _ => false + } + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/form/date.rs b/src/base/component/form/date.rs new file mode 100644 index 00000000..e1e33be0 --- /dev/null +++ b/src/base/component/form/date.rs @@ -0,0 +1,264 @@ +use crate::prelude::*; + +pub struct Date { + renderable : fn() -> bool, + weight : i8, + name : Option, + value : Option, + label : String, + placeholder : Option, + autofocus : Option, + autocomplete: Option, + disabled : Option, + readonly : Option, + required : Option, + help_text : String, + template : String, +} + +impl PageComponent for Date { + + fn prepare() -> Self { + Date { + renderable : always, + weight : 0, + name : None, + value : None, + label : "".to_string(), + placeholder : None, + autofocus : None, + autocomplete: None, + disabled : None, + readonly : None, + required : None, + help_text : "".to_string(), + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, _: &mut PageAssets) -> Markup { + let (class_item, id_item) = match &self.name { + Some(name) => ( + format!("form-item form-item-{} form-type-date", name), + Some(format!("edit-{}", name)) + ), + None => ( + "form-item form-type-date".to_string(), + None + ) + }; + html! { + div class=(class_item) { + @if !self.label.is_empty() { + label class="form-label" for=[&id_item] { + (self.label) " " + @if self.required != None { + span + class="form-required" + title="Este campo es obligatorio." + { + "*" + } " " + } + } + } + input + type="date" + id=[&id_item] + class="form-control" + name=[&self.name] + value=[&self.value] + placeholder=[&self.placeholder] + autofocus=[&self.autofocus] + autocomplete=[&self.autocomplete] + readonly=[&self.readonly] + required=[&self.required] + disabled=[&self.disabled]; + @if !self.help_text.is_empty() { + div class="form-text" { + (self.help_text) + } + } + } + } + } +} + +impl Date { + + // Date BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_name(mut self, name: &str) -> Self { + self.name = if name.is_empty() { + None + } else { + Some(name.replace(" ", "_")) + }; + self + } + + pub fn with_value(mut self, value: &str) -> Self { + self.value = if value.is_empty() { + None + } else { + Some(value.to_string()) + }; + self + } + + pub fn with_label(mut self, label: &str) -> Self { + self.label = label.to_string(); + self + } + + pub fn with_placeholder(mut self, placeholder: &str) -> Self { + self.placeholder = if placeholder.is_empty() { + None + } else { + Some(placeholder.to_string()) + }; + self + } + + pub fn autofocus(mut self, toggle: bool) -> Self { + self.autofocus = match toggle { + true => Some("autofocus".to_string()), + false => None + }; + self + } + + pub fn autocomplete(mut self, toggle: bool) -> Self { + self.autocomplete = match toggle { + true => None, + false => Some("off".to_string()) + }; + self + } + + pub fn disabled(mut self, toggle: bool) -> Self { + self.disabled = match toggle { + true => Some("disabled".to_string()), + false => None + }; + self + } + + pub fn readonly(mut self, toggle: bool) -> Self { + self.readonly = match toggle { + true => Some("readonly".to_string()), + false => None + }; + self + } + + pub fn required(mut self, toggle: bool) -> Self { + self.required = match toggle { + true => Some("required".to_string()), + false => None + }; + self + } + + pub fn with_help_text(mut self, help_text: &str) -> Self { + self.help_text = help_text.to_string(); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Date GETTERS. + + pub fn name(&self) -> &str { + match &self.name { + Some(name) => name.as_str(), + _ => "" + } + } + + pub fn value(&self) -> &str { + match &self.value { + Some(value) => value.as_str(), + _ => "" + } + } + + pub fn label(&self) -> &str { + self.label.as_str() + } + + pub fn placeholder(&self) -> &str { + match &self.placeholder { + Some(placeholder) => placeholder.as_str(), + _ => "" + } + } + + pub fn has_autofocus(&self) -> bool { + match &self.autofocus { + Some(_) => true, + _ => false + } + } + + pub fn has_autocomplete(&self) -> bool { + match &self.autocomplete { + Some(_) => false, + _ => true + } + } + + pub fn is_disabled(&self) -> bool { + match &self.disabled { + Some(_) => true, + _ => false + } + } + + pub fn is_readonly(&self) -> bool { + match &self.readonly { + Some(_) => true, + _ => false + } + } + + pub fn is_required(&self) -> bool { + match &self.required { + Some(_) => true, + _ => false + } + } + + pub fn help_text(&self) -> &str { + self.help_text.as_str() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/form/form.rs b/src/base/component/form/form.rs new file mode 100644 index 00000000..519587e0 --- /dev/null +++ b/src/base/component/form/form.rs @@ -0,0 +1,152 @@ +use crate::prelude::*; + +pub enum FormMethod {Get, Post} + +pub struct Form { + renderable: fn() -> bool, + weight : i8, + id : Option, + action : Option, + method : FormMethod, + charset : Option, + elements : PageContainer, + template : String, +} + +impl PageComponent for Form { + + fn prepare() -> Self { + Form { + renderable: always, + weight : 0, + id : None, + action : None, + method : FormMethod::Post, + charset : Some("UTF-8".to_string()), + elements : PageContainer::new(), + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, assets: &mut PageAssets) -> Markup { + let method = match self.method { + FormMethod::Get => None, + FormMethod::Post => Some("post".to_string()) + }; + html! { + form + id=[&self.id] + action=[&self.action] + method=[method] + accept-charset=[&self.charset] + { + div { + (self.elements.render(assets)) + } + } + } + } +} + +impl Form { + + // Form BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.id = if id.is_empty() { + None + } else { + Some(id.replace(" ", "_")) + }; + self + } + + pub fn with_action(mut self, action: &str) -> Self { + self.action = if action.is_empty() { + None + } else { + Some(action.to_string()) + }; + self + } + + pub fn with_method(mut self, method: FormMethod) -> Self { + self.method = method; + self + } + + pub fn with_charset(mut self, charset: &str) -> Self { + self.charset = if charset.is_empty() { + None + } else { + Some(charset.to_string()) + }; + self + } + + pub fn add(mut self, element: impl PageComponent) -> Self { + self.elements.add(element); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Form GETTERS. + + pub fn id(&self) -> &str { + match &self.id { + Some(id) => id.as_str(), + _ => "" + } + } + + pub fn action(&self) -> &str { + match &self.action { + Some(action) => action.as_str(), + _ => "" + } + } + + pub fn method(&self) -> &str { + match &self.method { + FormMethod::Get => "get", + FormMethod::Post => "post" + } + } + + pub fn charset(&self) -> &str { + match &self.charset { + Some(charset) => charset.as_str(), + _ => "" + } + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/form/hidden.rs b/src/base/component/form/hidden.rs new file mode 100644 index 00000000..a95cfc77 --- /dev/null +++ b/src/base/component/form/hidden.rs @@ -0,0 +1,110 @@ +use crate::prelude::*; + +pub struct Hidden { + renderable : fn() -> bool, + weight : i8, + name : Option, + value : Option, + template : String, +} + +impl PageComponent for Hidden { + + fn prepare() -> Self { + Hidden { + renderable : always, + weight : 0, + name : None, + value : None, + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, _: &mut PageAssets) -> Markup { + let id_item = match &self.name { + Some(name) => Some(format!("value-{}", name)), + _ => None + }; + html! { + input + type="hidden" + id=[&id_item] + name=[&self.name] + value=[&self.value]; + } + } +} + +impl Hidden { + + pub fn set(name: &str, value: &str) -> Self { + Hidden::prepare().with_name(name).with_value(value) + } + + // Hidden BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_name(mut self, name: &str) -> Self { + self.name = if name.is_empty() { + None + } else { + Some(name.replace(" ", "_")) + }; + self + } + + pub fn with_value(mut self, value: &str) -> Self { + self.value = if value.is_empty() { + None + } else { + Some(value.to_string()) + }; + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Hidden GETTERS. + + pub fn name(&self) -> &str { + match &self.name { + Some(name) => name.as_str(), + _ => "" + } + } + + pub fn value(&self) -> &str { + match &self.value { + Some(value) => value.as_str(), + _ => "" + } + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/form/input.rs b/src/base/component/form/input.rs new file mode 100644 index 00000000..d4ec8930 --- /dev/null +++ b/src/base/component/form/input.rs @@ -0,0 +1,346 @@ +use crate::prelude::*; + +enum InputType {Email, Password, Search, Telephone, Textfield, Url} + +pub struct Input { + renderable : fn() -> bool, + weight : i8, + input_type : InputType, + name : Option, + value : Option, + label : String, + size : Option, + minlength : Option, + maxlength : Option, + placeholder : Option, + autofocus : Option, + autocomplete: Option, + disabled : Option, + readonly : Option, + required : Option, + help_text : String, + template : String, +} + +impl PageComponent for Input { + + fn prepare() -> Self { + Input { + renderable : always, + weight : 0, + input_type : InputType::Textfield, + name : None, + value : None, + label : "".to_string(), + size : Some(60), + minlength : None, + maxlength : Some(128), + placeholder : None, + autofocus : None, + autocomplete: None, + disabled : None, + readonly : None, + required : None, + help_text : "".to_string(), + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, _: &mut PageAssets) -> Markup { + let (input_type, class_type) = match &self.input_type { + InputType::Email => ("email", "form-type-email"), + InputType::Password => ("password", "form-type-password"), + InputType::Search => ("search", "form-type-search"), + InputType::Telephone => ("tel", "form-type-telephone"), + InputType::Textfield => ("text", "form-type-textfield"), + InputType::Url => ("url", "form-type-url") + }; + let (class_item, id_item) = match &self.name { + Some(name) => ( + format!("form-item form-item-{} {}", name, class_type), + Some(format!("edit-{}", name)) + ), + None => ( + format!("form-item {}", class_type), + None + ) + }; + html! { + div class=(class_item) { + @if !self.label.is_empty() { + label class="form-label" for=[&id_item] { + (self.label) " " + @if self.required != None { + span + class="form-required" + title="Este campo es obligatorio." + { + "*" + } " " + } + } + } + input + type=(input_type) + id=[&id_item] + class="form-control" + name=[&self.name] + value=[&self.value] + size=[self.size] + minlength=[self.minlength] + maxlength=[self.maxlength] + placeholder=[&self.placeholder] + autofocus=[&self.autofocus] + autocomplete=[&self.autocomplete] + readonly=[&self.readonly] + required=[&self.required] + disabled=[&self.disabled]; + @if !self.help_text.is_empty() { + div class="form-text" { + (self.help_text) + } + } + } + } + } +} + +impl Input { + + pub fn textfield() -> Self { + Input::prepare() + } + + pub fn password() -> Self { + let mut input = Input::prepare(); + input.input_type = InputType::Password; + input + } + + pub fn search() -> Self { + let mut input = Input::prepare(); + input.input_type = InputType::Search; + input + } + + pub fn email() -> Self { + let mut input = Input::prepare(); + input.input_type = InputType::Email; + input + } + + pub fn telephone() -> Self { + let mut input = Input::prepare(); + input.input_type = InputType::Telephone; + input + } + + pub fn url() -> Self { + let mut input = Input::prepare(); + input.input_type = InputType::Url; + input + } + + // Input BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_name(mut self, name: &str) -> Self { + self.name = if name.is_empty() { + None + } else { + Some(name.replace(" ", "_")) + }; + self + } + + pub fn with_value(mut self, value: &str) -> Self { + self.value = if value.is_empty() { + None + } else { + Some(value.to_string()) + }; + self + } + + pub fn with_label(mut self, label: &str) -> Self { + self.label = label.to_string(); + self + } + + pub fn with_size(mut self, size: Option) -> Self { + self.size = size; + self + } + + pub fn with_minlength(mut self, minlength: Option) -> Self { + self.minlength = minlength; + self + } + + pub fn with_maxlength(mut self, maxlength: Option) -> Self { + self.maxlength = maxlength; + self + } + + pub fn with_placeholder(mut self, placeholder: &str) -> Self { + self.placeholder = if placeholder.is_empty() { + None + } else { + Some(placeholder.to_string()) + }; + self + } + + pub fn autofocus(mut self, toggle: bool) -> Self { + self.autofocus = match toggle { + true => Some("autofocus".to_string()), + false => None + }; + self + } + + pub fn autocomplete(mut self, toggle: bool) -> Self { + self.autocomplete = match toggle { + true => None, + false => Some("off".to_string()) + }; + self + } + + pub fn disabled(mut self, toggle: bool) -> Self { + self.disabled = match toggle { + true => Some("disabled".to_string()), + false => None + }; + self + } + + pub fn readonly(mut self, toggle: bool) -> Self { + self.readonly = match toggle { + true => Some("readonly".to_string()), + false => None + }; + self + } + + pub fn required(mut self, toggle: bool) -> Self { + self.required = match toggle { + true => Some("required".to_string()), + false => None + }; + self + } + + pub fn with_help_text(mut self, help_text: &str) -> Self { + self.help_text = help_text.to_string(); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Input GETTERS. + + pub fn name(&self) -> &str { + match &self.name { + Some(name) => name.as_str(), + _ => "" + } + } + + pub fn value(&self) -> &str { + match &self.value { + Some(value) => value.as_str(), + _ => "" + } + } + + pub fn label(&self) -> &str { + self.label.as_str() + } + + pub fn size(&self) -> Option { + self.size + } + + pub fn minlength(&self) -> Option { + self.minlength + } + + pub fn maxlength(&self) -> Option { + self.maxlength + } + + pub fn placeholder(&self) -> &str { + match &self.placeholder { + Some(placeholder) => placeholder.as_str(), + _ => "" + } + } + + pub fn has_autofocus(&self) -> bool { + match &self.autofocus { + Some(_) => true, + _ => false + } + } + + pub fn has_autocomplete(&self) -> bool { + match &self.autocomplete { + Some(_) => false, + _ => true + } + } + + pub fn is_disabled(&self) -> bool { + match &self.disabled { + Some(_) => true, + _ => false + } + } + + pub fn is_readonly(&self) -> bool { + match &self.readonly { + Some(_) => true, + _ => false + } + } + + pub fn is_required(&self) -> bool { + match &self.required { + Some(_) => true, + _ => false + } + } + + pub fn help_text(&self) -> &str { + self.help_text.as_str() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/form/mod.rs b/src/base/component/form/mod.rs new file mode 100644 index 00000000..4e10d476 --- /dev/null +++ b/src/base/component/form/mod.rs @@ -0,0 +1,11 @@ +mod form; +pub use form::{Form, FormMethod}; + +mod input; +pub use input::Input; +mod hidden; +pub use hidden::Hidden; +mod date; +pub use date::Date; +mod button; +pub use button::Button; diff --git a/src/base/component/mod.rs b/src/base/component/mod.rs index c12fb175..07c16cf7 100644 --- a/src/base/component/mod.rs +++ b/src/base/component/mod.rs @@ -1,2 +1,7 @@ -pub mod container; -pub mod chunck; +mod container; +pub use container::Container; +mod chunck; +pub use chunck::Chunck; + +pub mod form; +pub use form::{Form, FormMethod}; diff --git a/src/base/module/homepage/locales/en-US/homepage.ftl b/src/base/module/homepage/locales/en-US/homepage.ftl index 7008c35a..ec401e64 100644 --- a/src/base/module/homepage/locales/en-US/homepage.ftl +++ b/src/base/module/homepage/locales/en-US/homepage.ftl @@ -1,4 +1,21 @@ module_name = Default homepage module_desc = Displays a default homepage when none is configured. -greetings = Hello { $name }! +page_title = Hello world! + +text_welcome = This page is used to test the proper operation of { $app } after installation. This web solution is powered by { $pagetop }. If you can read this page, it means that the PageTop server is working properly, but has not yet been configured. + +title_normal_user = Just visiting? +text1_normal_user = If you are a normal user of this web site and don't know what this page is about, this probably means that the site is either experiencing problems or is undergoing routine maintenance. +text2_normal_user = If the problem persists, please contact your system administrator. + +title_about_pagetop = About PageTop +text1_about_pagetop = PageTop defines an interface for the most stable and popular Rust packages to build modular, extensible and configurable web solutions. +text2_about_pagetop = For information on PageTop please visit the "PageTop website". + +title_promo_pagetop = Promoting PageTop +text1_promo_pagetop = You are free to use the image below on applications powered by { $pagetop }. Thanks for using PageTop! + +title_report_problems = Reporting Problems +text1_report_problems = Please use the GitLab tool to report bugs in PageTop. However, check "existing bug reports" before reporting a new bug. +text2_report_problems = Please report bugs specific to modules (such as admin, and others) to respective packages, not to PageTop itself. diff --git a/src/base/module/homepage/locales/es-ES/homepage.ftl b/src/base/module/homepage/locales/es-ES/homepage.ftl index 7af7b370..dee1df47 100644 --- a/src/base/module/homepage/locales/es-ES/homepage.ftl +++ b/src/base/module/homepage/locales/es-ES/homepage.ftl @@ -1,4 +1,21 @@ module_name = Página de inicio predeterminada module_desc = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. -greetings = ¡Hola { $name }! +page_title = ¡Hola mundo! + +text_welcome = Esta página se utiliza para probar el correcto funcionamiento de { $app } después de la instalación. Esta solución web funciona con { $pagetop }. Si puede leer esta página, significa que el servidor PageTop funciona correctamente, pero aún no se ha configurado. + +title_normal_user = ¿Sólo de visita? +text1_normal_user = Si usted es un usuario normal de este sitio web y no sabe de qué trata esta página, probablemente significa que el sitio está experimentando problemas o está pasando por un mantenimiento de rutina. +text2_normal_user = Si el problema persiste, póngase en contacto con el administrador del sistema. + +title_about_pagetop = Sobre PageTop +text1_about_pagetop = PageTop define una interfaz para los paquetes Rust más estables y populares para crear soluciones web modulares, extensibles y configurables. +text2_about_pagetop = Para obtener información sobre PageTop, visite el "sitio web de PageTop". + +title_promo_pagetop = Promociona PageTop +text1_promo_pagetop = Puede usar la siguiente imagen en aplicaciones desarrolladas sobre { $pagetop }. ¡Gracias por usar PageTop! + +title_report_problems = Informando Problemas +text1_report_problems = Utilice la herramienta GitLab para informar errores en PageTop. Sin embargo, verifique los "informes de errores existentes" antes de informar de un nuevo error. +text2_report_problems = Informe los errores específicos de los módulos (como admin y otros) a los paquetes respectivos, no a PageTop en sí. diff --git a/src/base/module/homepage/mod.rs b/src/base/module/homepage/mod.rs index 4133f6ba..2e4164d0 100644 --- a/src/base/module/homepage/mod.rs +++ b/src/base/module/homepage/mod.rs @@ -14,16 +14,57 @@ impl Module for HomepageModule { } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service(server::web::resource("/").to(home)); - cfg.service(server::web::resource("/{name}").to(home)); + cfg.route("/", server::web::get().to(home)); } } -async fn home(req: server::HttpRequest) -> server::Result { - let name: String = req.match_info().get("name").unwrap_or("World").into(); +async fn home() -> server::Result { Page::prepare() - .add_to("content", Chunck::markup(html! { - h1 { (t("greetings", &args![ "name" => name])) } - })) + .with_title( + l("page_title").as_str() + ) + .add_to("content", Container::prepare() + .with_id("welcome") + .add(Chunck::markup(html! { + h1 { (l("page_title")) } + p { (e("text_welcome", &args![ + "app" => format!("{}", &SETTINGS.app.name), + "pagetop" => "PageTop" + ])) } + })) + ) + .add_to("content", Container::prepare() + .add(Container::row() + .add(Container::column() + .with_id("visitors") + .add(Chunck::markup(html! { + h2 { (l("title_normal_user")) } + p { (l("text1_normal_user")) } + p { (l("text2_normal_user")) } + }))) + .add(Container::column() + .with_id("pagetop") + .add(Chunck::markup(html! { + h2 { (l("title_about_pagetop")) } + p { (l("text1_about_pagetop")) } + p { (l("text2_about_pagetop")) } + + h2 { (l("title_promo_pagetop")) } + p { (e("text1_promo_pagetop", &args![ + "pagetop" => + "PageTop" + ])) } + })) + ) + ) + ) + .add_to("content", Container::prepare() + .with_id("reporting") + .add(Chunck::markup(html! { + h2 { (l("title_report_problems")) } + p { (l("text1_report_problems")) } + p { (l("text2_report_problems")) } + })) + ) .render() } diff --git a/src/base/module/mod.rs b/src/base/module/mod.rs index 070e5b82..dd90a79f 100644 --- a/src/base/module/mod.rs +++ b/src/base/module/mod.rs @@ -1 +1,2 @@ pub mod homepage; +pub mod user; diff --git a/src/base/module/user/locales/en-US/homepage.ftl b/src/base/module/user/locales/en-US/homepage.ftl new file mode 100644 index 00000000..e6ad0e91 --- /dev/null +++ b/src/base/module/user/locales/en-US/homepage.ftl @@ -0,0 +1,8 @@ +module_name = User +module_desc = Manages the user registration and login system. + +username = User name +password = Password +username_help = Enter your { $app } username. +password_help = Enter the password that accompanies your username. +login = Log in diff --git a/src/base/module/user/locales/es-ES/homepage.ftl b/src/base/module/user/locales/es-ES/homepage.ftl new file mode 100644 index 00000000..68f1c889 --- /dev/null +++ b/src/base/module/user/locales/es-ES/homepage.ftl @@ -0,0 +1,8 @@ +module_name = Usuario +module_desc = Gestion el registro de usuarios y el sistema de accesos. + +username = Nombre de usuario +password = Contraseña +username_help = Introduzca su nombre de usuario en { $app }. +password_help = Introduzca la contraseña asociada a su nombre de usuario. +login = Iniciar sesión diff --git a/src/base/module/user/mod.rs b/src/base/module/user/mod.rs new file mode 100644 index 00000000..61d50ca1 --- /dev/null +++ b/src/base/module/user/mod.rs @@ -0,0 +1,47 @@ +use crate::prelude::*; + +localize!("en-US", "src/base/module/user/locales"); + +pub struct UserModule; + +impl Module for UserModule { + fn name(&self) -> String { + l("module_name") + } + + fn description(&self) -> String { + l("module_desc") + } + + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + cfg.route("/user/login", server::web::get().to(login)); + } +} + +fn form_login() -> impl PageComponent { + Form::prepare() + .with_id("user-login") + .add(form::Input::textfield() + .with_name("name") + .with_label(l("username").as_str()) + .with_help_text(t("username_help", &args![ + "app" => SETTINGS.app.name.to_string() + ]).as_str()) + .autofocus(true) + ) + .add(form::Input::password() + .with_name("pass") + .with_label(l("password").as_str()) + .with_help_text(l("password_help").as_str()) + ) + .add(form::Button::submit(l("login").as_str())) +} + +async fn login() -> server::Result { + Page::prepare() + .with_title( + "Identificación del usuario" + ) + .add_to("content", form_login()) + .render() +} diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 0884201e..b915743e 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -9,6 +9,8 @@ use tracing::subscriber::set_global_default; use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer}; use tracing_actix_web::TracingLogger; +use actix_web::middleware::normalize; + pub fn run(bootstrap: Option) -> Result { // Inicia la traza de ejecución de la aplicación. let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing) @@ -90,6 +92,7 @@ pub fn run(bootstrap: Option) -> Result { let server = server::HttpServer::new(|| { server::App::new() .wrap(TracingLogger) + .wrap(normalize::NormalizePath::new(normalize::TrailingSlash::Trim)) .configure(&all::themes) .configure(&all::modules) }) diff --git a/src/core/state.rs b/src/core/state.rs index 69b6a4de..88936bfd 100644 --- a/src/core/state.rs +++ b/src/core/state.rs @@ -36,7 +36,9 @@ pub fn register_theme(t: &'static (dyn Theme + 'static)) { // ----------------------------------------------------------------------------- pub static MODULES: Lazy>> = Lazy::new(|| { - RwLock::new(vec![]) + RwLock::new(vec![ + &base::module::user::UserModule, + ]) }); pub fn register_module(m: &'static (dyn Module + 'static)) { diff --git a/src/macros/mod.rs b/src/macros/mod.rs index ef3c05d5..88ab3f90 100644 --- a/src/macros/mod.rs +++ b/src/macros/mod.rs @@ -16,4 +16,4 @@ macro_rules! args { )* a }}; -} \ No newline at end of file +} diff --git a/src/prelude.rs b/src/prelude.rs index 8ae92907..b4b62b18 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,9 +1,9 @@ //! Re-exporta recursos comunes. pub use crate::args; -pub use crate::localize; - +pub use crate::config::SETTINGS; pub use crate::trace; +pub use crate::localize; pub use crate::core::theme::*; @@ -17,5 +17,4 @@ pub use crate::core::register_theme; pub use crate::core::register_module; pub use crate::core::add_component_to; -pub use crate::base::component::container::Container; -pub use crate::base::component::chunck::Chunck; +pub use crate::base::component::*; From 7f8b94eafeed18d67fff522c8a01fb8c38500df9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Mon, 21 Feb 2022 00:28:22 +0100 Subject: [PATCH 012/853] =?UTF-8?q?A=C3=B1ade=20soporte=20nativo=20a=20Boo?= =?UTF-8?q?tstrap=20con=20un=20nuevo=20tema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 15 + Cargo.toml | 5 + build.rs | 31 ++ config/settings.default.toml | 2 +- resources/assets/js/jquery.min.js | 2 + resources/assets/js/jquery.min.map | 1 + src/base/component/container.rs | 2 +- src/base/module/user/mod.rs | 5 +- src/base/theme/aliner/assets/css/styles.css | 343 ++++++++++++++++++ src/base/theme/aliner/mod.rs | 28 ++ .../bootsier/assets/css/bootstrap.min.css | 7 + .../bootsier/assets/css/bootstrap.min.css.map | 1 + .../theme/bootsier/assets/fonts/nunito.css | 70 ++++ .../assets/fonts/nunito/cyrillic_400.woff2 | Bin 0 -> 11248 bytes .../assets/fonts/nunito/cyrillic_700.woff2 | Bin 0 -> 11208 bytes .../fonts/nunito/cyrillic_ext_400.woff2 | Bin 0 -> 15308 bytes .../fonts/nunito/cyrillic_ext_700.woff2 | Bin 0 -> 15164 bytes .../assets/fonts/nunito/latin_400.woff2 | Bin 0 -> 18972 bytes .../assets/fonts/nunito/latin_700.woff2 | Bin 0 -> 19088 bytes .../assets/fonts/nunito/latin_ext_400.woff2 | Bin 0 -> 18380 bytes .../assets/fonts/nunito/latin_ext_700.woff2 | Bin 0 -> 18416 bytes .../assets/fonts/nunito/vietnamese_400.woff2 | Bin 0 -> 7568 bytes .../assets/fonts/nunito/vietnamese_700.woff2 | Bin 0 -> 7596 bytes .../theme/bootsier/assets/images/caution.png | Bin 0 -> 12481 bytes .../assets/js/bootstrap.bundle.min.js | 7 + .../assets/js/bootstrap.bundle.min.js.map | 1 + .../theme/bootsier/assets/js/bootstrap.min.js | 7 + .../bootsier/assets/js/bootstrap.min.js.map | 1 + .../theme/bootsier/locales/en-US/bootsier.ftl | 5 + .../theme/bootsier/locales/es-ES/bootsier.ftl | 5 + src/base/theme/bootsier/mod.rs | 82 +++++ src/base/theme/mod.rs | 2 + src/config/settings.rs | 2 +- src/core/response/page/assets.rs | 16 + src/core/server/mod.rs | 2 +- src/core/state.rs | 4 +- src/core/theme/api.rs | 12 + 37 files changed, 652 insertions(+), 6 deletions(-) create mode 100644 CREDITS.md create mode 100644 build.rs create mode 100644 resources/assets/js/jquery.min.js create mode 100644 resources/assets/js/jquery.min.map create mode 100644 src/base/theme/aliner/assets/css/styles.css create mode 100644 src/base/theme/aliner/mod.rs create mode 100644 src/base/theme/bootsier/assets/css/bootstrap.min.css create mode 100644 src/base/theme/bootsier/assets/css/bootstrap.min.css.map create mode 100644 src/base/theme/bootsier/assets/fonts/nunito.css create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_400.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_700.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_400.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_700.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_400.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_700.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_ext_400.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_ext_700.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/vietnamese_400.woff2 create mode 100644 src/base/theme/bootsier/assets/fonts/nunito/vietnamese_700.woff2 create mode 100644 src/base/theme/bootsier/assets/images/caution.png create mode 100644 src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js create mode 100644 src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js.map create mode 100644 src/base/theme/bootsier/assets/js/bootstrap.min.js create mode 100644 src/base/theme/bootsier/assets/js/bootstrap.min.js.map create mode 100644 src/base/theme/bootsier/locales/en-US/bootsier.ftl create mode 100644 src/base/theme/bootsier/locales/es-ES/bootsier.ftl create mode 100644 src/base/theme/bootsier/mod.rs diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 00000000..bd737e27 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,15 @@ +# FIGfonts + +PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de +*yuanbohan* para mostrar al inicio un rótulo con el nombre de la aplicación +usando [FIGlet](http://www.figlet.org/). Las fuentes incluidas en `resources` +son: + +* [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) + por *Glenn Chappell*. +* [small.flf](http://www.figlet.org/fontdb_example.cgi?font=small.flf) + por *Glenn Chappell*, usado por defecto. +* [speed.flf](http://www.figlet.org/fontdb_example.cgi?font=speed.flf) + por *Claude Martins*. +* [starwars.flf](http://www.figlet.org/fontdb_example.cgi?font=starwars.flf) + por *Ryan Youck*. diff --git a/Cargo.toml b/Cargo.toml index 8eb88ee2..7b4ac161 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,12 +41,17 @@ fluent-templates = "0.6.1" unic-langid = "0.9.0" actix-web = "3.3.3" +actix-web-static-files = "3.0.5" + maud = { version = "0.23.0", features = ["actix-web"] } sycamore = { version = "0.7.1", features = ["ssr"] } downcast-rs = "1.2.0" serde = { version = "1.0", features = ["derive"] } +[build-dependencies] +actix-web-static-files = "3.0.5" + [lib] name = "pagetop" diff --git a/build.rs b/build.rs new file mode 100644 index 00000000..75aee1d5 --- /dev/null +++ b/build.rs @@ -0,0 +1,31 @@ +use actix_web_static_files::resource_dir; + +use std::env; +use std::path::Path; + +fn main() { + resource_dir("./resources/assets") + .with_generated_filename( + Path::new(env::var("OUT_DIR").unwrap().as_str()) + .join("assets.rs") + ) + .with_generated_fn("assets") + .build() + .unwrap(); + + resource_dir("./src/base/theme/aliner/assets") + .with_generated_filename( + Path::new(env::var("OUT_DIR").unwrap().as_str()) + .join("aliner.rs") + ) + .build() + .unwrap(); + + resource_dir("./src/base/theme/bootsier/assets") + .with_generated_filename( + Path::new(env::var("OUT_DIR").unwrap().as_str()) + .join("bootsier.rs") + ) + .build() + .unwrap(); +} diff --git a/config/settings.default.toml b/config/settings.default.toml index 53a2c693..aea77e5e 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -4,7 +4,7 @@ description = "Developed with the amazing PageTop framework." # Idioma (localización) predeterminado. language = "en-US" # Tema predeterminado. -theme = "Minimal" +theme = "Bootsier" # Rótulo al inicio: "Off", "Slant", "Small", "Speed" o "Starwars". startup_banner = "Small" diff --git a/resources/assets/js/jquery.min.js b/resources/assets/js/jquery.min.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/resources/assets/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file diff --git a/src/base/component/container.rs b/src/base/component/container.rs index dfb1a010..d4315ddc 100644 --- a/src/base/component/container.rs +++ b/src/base/component/container.rs @@ -34,7 +34,7 @@ impl PageComponent for Container { fn default_render(&self, assets: &mut PageAssets) -> Markup { let classes = match self.container { - ContainerType::Wrapper => "wrapper", + ContainerType::Wrapper => "container", ContainerType::Row => "row", ContainerType::Column => "col", }; diff --git a/src/base/module/user/mod.rs b/src/base/module/user/mod.rs index 61d50ca1..eea6528c 100644 --- a/src/base/module/user/mod.rs +++ b/src/base/module/user/mod.rs @@ -42,6 +42,9 @@ async fn login() -> server::Result { .with_title( "Identificación del usuario" ) - .add_to("content", form_login()) + .add_to("content", Container::prepare() + .with_id("welcome") + .add(form_login()) + ) .render() } diff --git a/src/base/theme/aliner/assets/css/styles.css b/src/base/theme/aliner/assets/css/styles.css new file mode 100644 index 00000000..ffeee7db --- /dev/null +++ b/src/base/theme/aliner/assets/css/styles.css @@ -0,0 +1,343 @@ +html { + background-color: white; +} +* * { + outline: 5px solid rgba(255,0,0,.1); +} +* * * { + outline: 3px dashed rgba(255,0,0,.4); +} +* * * * { + outline: 2px dotted rgba(255,0,0,.6); +} +* * * * * { + outline: 1px dotted rgba(255,0,0,.9); +} +* * * * * * { + outline-color: gray; +} + +*::before, *::after { + background: #faa; + border-radius: 3px; + font: normal normal 400 10px/1.2 monospace; + padding: 1px 3px; +} +*::before { + content: "("; +} +*::after { + content: ")"; +} + +a::before { content: ""; } +a::after { content: ""; } +abbr::before { content: ""; } +abbr::after { content: ""; } +acronym::before { content: ""; } +acronym::after { content: ""; } +address::before { content: "
"; } +address::after { content: "
"; } +applet::before { content: ""; } +applet::after { content: ""; } +area::before { content: ""; } +area::after { content: ""; } +article::before { content: "
"; } +article::after { content: "
"; } +aside::before { content: ""; } +audio::before { content: ""; } + +b::before { content: ""; } +b::after { content: ""; } +base::before { content: ""; } +base::after { content: ""; } +basefont::before { content: ""; } +basefont::after { content: ""; } +bdi::before { content: ""; } +bdi::after { content: ""; } +bdo::before { content: ""; } +bdo::after { content: ""; } +bgsound::before { content: ""; } +bgsound::after { content: ""; } +big::before { content: ""; } +big::after { content: ""; } +blink::before { content: ""; } +blink::after { content: ""; } +blockquote::before { content: "
"; } +blockquote::after { content: "
"; } +body::before { content: ""; } +body::after { content: ""; } +br::before { content: "
"; } +br::after { content: "
"; } +button::before { content: ""; } + +caption::before { content: ""; } +caption::after { content: ""; } +canvas::before { content: ""; } +canvas::after { content: ""; } +center::before { content: "
"; } +center::after { content: "
"; } +cite::before { content: ""; } +cite::after { content: ""; } +code::before { content: ""; } +code::after { content: ""; } +col::before { content: ""; } +col::after { content: ""; } +colgroup::before { content: ""; } +colgroup::after { content: ""; } +command::before { content: ""; } +command::after { content: ""; } +content::before { content: ""; } +content::after { content: ""; } + +data::before { content: ""; } +data::after { content: ""; } +datalist::before { content: ""; } +datalist::after { content: ""; } +dd::before { content: "
"; } +dd::after { content: "
"; } +del::before { content: ""; } +del::after { content: ""; } +details::before { content: "
"; } +details::after { content: "
"; } +dfn::before { content: ""; } +dfn::after { content: ""; } +dialog::before { content: ""; } +dialog::after { content: ""; } +dir::before { content: ""; } +dir::after { content: ""; } +div::before { content: "
"; } +div::after { content: "
"; } +dl::before { content: "
"; } +dl::after { content: "
"; } +dt::before { content: "
"; } +dt::after { content: "
"; } + +element::before { content: ""; } +element::after { content: ""; } +em::before { content: ""; } +em::after { content: ""; } +embed::before { content: ""; } +embed::after { content: ""; } + +fieldset::before { content: "
"; } +fieldset::after { content: "
"; } +figcaption::before { content: "
"; } +figcaption::after { content: "
"; } +figure::before { content: "
"; } +figure::after { content: "
"; } +font::before { content: ""; } +font::after { content: ""; } +footer::before { content: "
"; } +footer::after { content: "
"; } +form::before { content: "
"; } +form::after { content: "
"; } +frame::before { content: ""; } +frame::after { content: ""; } +frameset::before { content: ""; } +frameset::after { content: ""; } + +h1::before { content: "

"; } +h1::after { content: "

"; } +h2::before { content: "

"; } +h2::after { content: "

"; } +h3::before { content: "

"; } +h3::after { content: "

"; } +h4::before { content: "

"; } +h4::after { content: "

"; } +h5::before { content: "
"; } +h5::after { content: "
"; } +h6::before { content: "
"; } +h6::after { content: "
"; } +head::before { content: ""; } +head::after { content: ""; } +header::before { content: "
"; } +header::after { content: "
"; } +hgroup::before { content: "
"; } +hgroup::after { content: "
"; } +hr::before { content: "
"; } +hr::after { content: ""; } +html::before { content: ""; } +html::after { content: ""; } + +i::before { content: ""; } +i::after { content: ""; } +iframe::before { content: ""; } +image::before { content: ""; } +image::after { content: ""; } +img::before { content: ""; } +img::after { content: ""; } +input::before { content: ""; } +input::after { content: ""; } +ins::before { content: ""; } +ins::after { content: ""; } +isindex::before { content: ""; } +isindex::after { content: ""; } + +kbd::before { content: ""; } +kbd::after { content: ""; } +keygen::before { content: ""; } +keygen::after { content: ""; } + +label::before { content: ""; } +legend::before { content: ""; } +legend::after { content: ""; } +li::before { content: "
  • "; } +li::after { content: "
  • "; } +link::before { content: ""; } +link::after { content: ""; } +listing::before { content: ""; } +listing::after { content: ""; } + +main::before { content: "
    "; } +main::after { content: "
    "; } +map::before { content: ""; } +map::after { content: ""; } +mark::before { content: ""; } +mark::after { content: ""; } +marquee::before { content: ""; } +marquee::after { content: ""; } +menu::before { content: ""; } +menu::after { content: ""; } +menuitem::before { content: ""; } +menuitem::after { content: ""; } +meta::before { content: ""; } +meta::after { content: ""; } +meter::before { content: ""; } +meter::after { content: ""; } +multicol::before { content: ""; } +multicol::after { content: ""; } + +nav::before { content: ""; } +nextid::before { content: ""; } +nextid::after { content: ""; } +nobr::before { content: ""; } +nobr::after { content: ""; } +noembed::before { content: ""; } +noembed::after { content: ""; } +noframes::before { content: ""; } +noframes::after { content: ""; } +noscript::before { content: ""; } + +object::before { content: ""; } +object::after { content: ""; } +ol::before { content: "
      "; } +ol::after { content: "
    "; } +optgroup::before { content: ""; } +optgroup::after { content: ""; } +option::before { content: ""; } +output::before { content: ""; } +output::after { content: ""; } + +p::before { content: "

    "; } +p::after { content: "

    "; } +param::before { content: ""; } +param::after { content: ""; } +picture::before { content: ""; } +picture::after { content: ""; } +plaintext::before { content: ""; } +plaintext::after { content: "</plaintext>"; } +pre::before { content: "<pre>"; } +pre::after { content: "</pre>"; } +progress::before { content: "<progress>"; } +progress::after { content: "</progress>"; } + +q::before { content: "<q>"; } +q::after { content: "</q>"; } + +rb::before { content: "<rb>"; } +rb::after { content: "</rb>"; } +rp::before { content: "<rp>"; } +rp::after { content: "</rp>"; } +rt::before { content: "<rt>"; } +rt::after { content: "</rt>"; } +rtc::before { content: "<rtc>"; } +rtc::after { content: "</rtc>"; } +ruby::before { content: "<ruby>"; } +ruby::after { content: "</ruby>"; } + +s::before { content: "<s>"; } +s::after { content: "</s>"; } +samp::before { content: "<samp>"; } +samp::after { content: "</samp>"; } +script::before { content: "<script>"; } +script::after { content: "</script>"; } +section::before { content: "<section>"; } +section::after { content: "</section>"; } +select::before { content: "<select>"; } +select::after { content: "</select>"; } +shadow::before { content: "<shadow>"; } +shadow::after { content: "</shadow>"; } +slot::before { content: "<slot>"; } +slot::after { content: "</slot>"; } +small::before { content: "<small>"; } +small::after { content: "</small>"; } +source::before { content: "<source>"; } +source::after { content: "</source>"; } +spacer::before { content: "<spacer>"; } +spacer::after { content: "</spacer>"; } +span::before { content: "<span>"; } +span::after { content: "</span>"; } +strike::before { content: "<strike>"; } +strike::after { content: "</strike>"; } +strong::before { content: "<strong>"; } +strong::after { content: "</strong>"; } +style::before { content: "<style>"; } +style::after { content: "<\/style>"; } +sub::before { content: "<sub>"; } +sub::after { content: "</sub>"; } +summary::before { content: "<summary>"; } +summary::after { content: "</summary>"; } +sup::before { content: "<sup>"; } +sup::after { content: "</sup>"; } + +table::before { content: "<table>"; } +table::after { content: "</table>"; } +tbody::before { content: "<tbody>"; } +tbody::after { content: "</tbody>"; } +td::before { content: "<td>"; } +td::after { content: "</td>"; } +template::before { content: "<template>"; } +template::after { content: "</template>"; } +textarea::before { content: "<textarea>"; } +textarea::after { content: "</textarea>"; } +tfoot::before { content: "<tfoot>"; } +tfoot::after { content: "</tfoot>"; } +th::before { content: "<th>"; } +th::after { content: "</th>"; } +thead::before { content: "<thead>"; } +thead::after { content: "</thead>"; } +time::before { content: "<time>"; } +time::after { content: "</time>"; } +title::before { content: "<title>"; } +title::after { content: "</title>"; } +tr::before { content: "<tr>"; } +tr::after { content: "</tr>"; } +track::before { content: "<track>"; } +track::after { content: "</track>"; } +tt::before { content: "<tt>"; } +tt::after { content: "</tt>"; } + +u::before { content: "<u>"; } +u::after { content: "</u>"; } +ul::before { content: "<ul>"; } +ul::after { content: "</ul>"; } + +var::before { content: "<var>"; } +var::after { content: "</var>"; } +video::before { content: "<video>"; } +video::after { content: "</video>"; } + +wbr::before { content: "<wbr>"; } +wbr::after { content: "</wbr>"; } + +xmp::before { content: "<xmp>"; } +xmp::after { content: "</xmp>"; } diff --git a/src/base/theme/aliner/mod.rs b/src/base/theme/aliner/mod.rs new file mode 100644 index 00000000..8ad4e291 --- /dev/null +++ b/src/base/theme/aliner/mod.rs @@ -0,0 +1,28 @@ +use crate::prelude::*; + +include!(concat!(env!("OUT_DIR"), "/aliner.rs")); + +pub struct AlinerTheme; + +impl Theme for AlinerTheme { + fn name(&self) -> &str { + "Aliner" + } + + fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service(actix_web_static_files::ResourceFiles::new( + "/aliner", + generate() + )); + } + + fn before_render_page(&self, page: &mut Page) { + page.assets() + .add_stylesheet( + StyleSheet::source( + "/aliner/css/styles.css" + ) + .with_weight(-99) + ); + } +} diff --git a/src/base/theme/bootsier/assets/css/bootstrap.min.css b/src/base/theme/bootsier/assets/css/bootstrap.min.css new file mode 100644 index 00000000..1472dec0 --- /dev/null +++ b/src/base/theme/bootsier/assets/css/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--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-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-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",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, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--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-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;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:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-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[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{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{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}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 (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-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 (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-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 (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;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)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.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 (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.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:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.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 (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.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:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.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 (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.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:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.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 (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.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:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.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 (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.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:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.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-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.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)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--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:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--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:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--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:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--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:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@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:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;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::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.2rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.3rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.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 rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-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 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-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{background-color:#0d6efd;border-color:#0d6efd;background-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")}.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{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image: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-position:left center;border-radius:2em;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{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image: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")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){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:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);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.73L.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.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e"),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.73L.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.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);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-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e"),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,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;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){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.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;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.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{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;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:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-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%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-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%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-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-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{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-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor: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,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%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-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left: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-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.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:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent 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 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-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% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.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 0z'/%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-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.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.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.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}.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}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display: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:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;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:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!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}.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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left: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}.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-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!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:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-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:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left: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}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left: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}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left: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}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left: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}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left: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}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-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-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}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/base/theme/bootsier/assets/css/bootstrap.min.css.map b/src/base/theme/bootsier/assets/css/bootstrap.min.css.map new file mode 100644 index 00000000..c84afa43 --- /dev/null +++ b/src/base/theme/bootsier/assets/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$variable-prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`<button>` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow in Chrome from inputs built with datalists.\n// See https://stackoverflow.com/a/54997118\n\n[list]::-webkit-calendar-picker-indicator {\n display: none;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. Correct the outline style in Safari.\n// 2. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\n[type=\"search\"] {\n outline-offset: -2px; // 1\n -webkit-appearance: textfield; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// Inherit font family and line height for file input buttons\n\n::file-selector-button {\n font: inherit;\n}\n\n// 1. Change font properties to `inherit`\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::-webkit-file-upload-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","@charset \"UTF-8\";\n/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n background-color: currentColor;\n border: 0;\n opacity: 0.25;\n}\n\nhr:not([size]) {\n height: 1px;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1, .h1 {\n font-size: 2.5rem;\n }\n}\n\nh2, .h2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2, .h2 {\n font-size: 2rem;\n }\n}\n\nh3, .h3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3, .h3 {\n font-size: 1.75rem;\n }\n}\n\nh4, .h4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4, .h4 {\n font-size: 1.5rem;\n }\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-bs-original-title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall, .small {\n font-size: 0.875em;\n}\n\nmark, .mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: #0d6efd;\n text-decoration: underline;\n}\na:hover {\n color: #0a58ca;\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n direction: ltr /* rtl:ignore */;\n unicode-bidi: bidi-override;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: #d63384;\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 0.875em;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n font-weight: 700;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: #6c757d;\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]::-webkit-calendar-picker-indicator {\n display: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n outline-offset: -2px;\n -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n}\n\n::file-selector-button {\n font: inherit;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: calc(1.625rem + 4.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-1 {\n font-size: 5rem;\n }\n}\n\n.display-2 {\n font-size: calc(1.575rem + 3.9vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-2 {\n font-size: 4.5rem;\n }\n}\n\n.display-3 {\n font-size: calc(1.525rem + 3.3vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-3 {\n font-size: 4rem;\n }\n}\n\n.display-4 {\n font-size: calc(1.475rem + 2.7vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-4 {\n font-size: 3.5rem;\n }\n}\n\n.display-5 {\n font-size: calc(1.425rem + 2.1vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-5 {\n font-size: 3rem;\n }\n}\n\n.display-6 {\n font-size: calc(1.375rem + 1.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-6 {\n font-size: 2.5rem;\n }\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 0.875em;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n.blockquote > :last-child {\n margin-bottom: 0;\n}\n\n.blockquote-footer {\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n.blockquote-footer::before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 0.875em;\n color: #6c757d;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n width: 100%;\n padding-right: var(--bs-gutter-x, 0.75rem);\n padding-left: var(--bs-gutter-x, 0.75rem);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-sm-0 {\n margin-left: 0;\n }\n\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-sm-3 {\n margin-left: 25%;\n }\n\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-sm-6 {\n margin-left: 50%;\n }\n\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-sm-9 {\n margin-left: 75%;\n }\n\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n\n .g-sm-0,\n.gx-sm-0 {\n --bs-gutter-x: 0;\n }\n\n .g-sm-0,\n.gy-sm-0 {\n --bs-gutter-y: 0;\n }\n\n .g-sm-1,\n.gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-sm-1,\n.gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-sm-2,\n.gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-sm-2,\n.gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-sm-3,\n.gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-sm-3,\n.gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-sm-4,\n.gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-sm-4,\n.gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-sm-5,\n.gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-sm-5,\n.gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-md-0 {\n margin-left: 0;\n }\n\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-md-3 {\n margin-left: 25%;\n }\n\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-md-6 {\n margin-left: 50%;\n }\n\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-md-9 {\n margin-left: 75%;\n }\n\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n\n .g-md-0,\n.gx-md-0 {\n --bs-gutter-x: 0;\n }\n\n .g-md-0,\n.gy-md-0 {\n --bs-gutter-y: 0;\n }\n\n .g-md-1,\n.gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-md-1,\n.gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-md-2,\n.gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-md-2,\n.gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-md-3,\n.gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-md-3,\n.gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-md-4,\n.gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-md-4,\n.gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-md-5,\n.gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-md-5,\n.gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-lg-0 {\n margin-left: 0;\n }\n\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-lg-3 {\n margin-left: 25%;\n }\n\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-lg-6 {\n margin-left: 50%;\n }\n\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-lg-9 {\n margin-left: 75%;\n }\n\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n\n .g-lg-0,\n.gx-lg-0 {\n --bs-gutter-x: 0;\n }\n\n .g-lg-0,\n.gy-lg-0 {\n --bs-gutter-y: 0;\n }\n\n .g-lg-1,\n.gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-lg-1,\n.gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-lg-2,\n.gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-lg-2,\n.gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-lg-3,\n.gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-lg-3,\n.gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-lg-4,\n.gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-lg-4,\n.gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-lg-5,\n.gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-lg-5,\n.gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-xl-0 {\n margin-left: 0;\n }\n\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-xl-3 {\n margin-left: 25%;\n }\n\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-xl-6 {\n margin-left: 50%;\n }\n\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-xl-9 {\n margin-left: 75%;\n }\n\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n\n .g-xl-0,\n.gx-xl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xl-0,\n.gy-xl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xl-1,\n.gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-xl-1,\n.gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-xl-2,\n.gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-xl-2,\n.gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-xl-3,\n.gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xl-3,\n.gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xl-4,\n.gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xl-4,\n.gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xl-5,\n.gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xl-5,\n.gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-xxl-0 {\n margin-left: 0;\n }\n\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-xxl-3 {\n margin-left: 25%;\n }\n\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-xxl-6 {\n margin-left: 50%;\n }\n\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-xxl-9 {\n margin-left: 75%;\n }\n\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n\n .g-xxl-0,\n.gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xxl-0,\n.gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xxl-1,\n.gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-xxl-1,\n.gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-xxl-2,\n.gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-xxl-2,\n.gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-xxl-3,\n.gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xxl-3,\n.gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xxl-4,\n.gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xxl-4,\n.gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xxl-5,\n.gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xxl-5,\n.gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.table {\n --bs-table-bg: transparent;\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: #212529;\n --bs-table-striped-bg: rgba(0, 0, 0, 0.05);\n --bs-table-active-color: #212529;\n --bs-table-active-bg: rgba(0, 0, 0, 0.1);\n --bs-table-hover-color: #212529;\n --bs-table-hover-bg: rgba(0, 0, 0, 0.075);\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n vertical-align: top;\n border-color: #dee2e6;\n}\n.table > :not(caption) > * > * {\n padding: 0.5rem 0.5rem;\n background-color: var(--bs-table-bg);\n border-bottom-width: 1px;\n box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);\n}\n.table > tbody {\n vertical-align: inherit;\n}\n.table > thead {\n vertical-align: bottom;\n}\n.table > :not(:first-child) {\n border-top: 2px solid currentColor;\n}\n\n.caption-top {\n caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n border-width: 1px 0;\n}\n.table-bordered > :not(caption) > * > * {\n border-width: 0 1px;\n}\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n --bs-table-accent-bg: var(--bs-table-striped-bg);\n color: var(--bs-table-striped-color);\n}\n\n.table-active {\n --bs-table-accent-bg: var(--bs-table-active-bg);\n color: var(--bs-table-active-color);\n}\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-accent-bg: var(--bs-table-hover-bg);\n color: var(--bs-table-hover-color);\n}\n\n.table-primary {\n --bs-table-bg: #cfe2ff;\n --bs-table-striped-bg: #c5d7f2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bacbe6;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfd1ec;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bacbe6;\n}\n\n.table-secondary {\n --bs-table-bg: #e2e3e5;\n --bs-table-striped-bg: #d7d8da;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #cbccce;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #d1d2d4;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #cbccce;\n}\n\n.table-success {\n --bs-table-bg: #d1e7dd;\n --bs-table-striped-bg: #c7dbd2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bcd0c7;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #c1d6cc;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bcd0c7;\n}\n\n.table-info {\n --bs-table-bg: #cff4fc;\n --bs-table-striped-bg: #c5e8ef;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #badce3;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfe2e9;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #badce3;\n}\n\n.table-warning {\n --bs-table-bg: #fff3cd;\n --bs-table-striped-bg: #f2e7c3;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #e6dbb9;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #ece1be;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #e6dbb9;\n}\n\n.table-danger {\n --bs-table-bg: #f8d7da;\n --bs-table-striped-bg: #eccccf;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfc2c4;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5c7ca;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfc2c4;\n}\n\n.table-light {\n --bs-table-bg: #f8f9fa;\n --bs-table-striped-bg: #ecedee;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfe0e1;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5e6e7;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfe0e1;\n}\n\n.table-dark {\n --bs-table-bg: #212529;\n --bs-table-striped-bg: #2c3034;\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: #373b3e;\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: #323539;\n --bs-table-hover-color: #fff;\n color: #fff;\n border-color: #373b3e;\n}\n\n.table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 767.98px) {\n .table-responsive-md {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1399.98px) {\n .table-responsive-xxl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n.form-label {\n margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n}\n\n.form-text {\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n.form-control[type=file] {\n overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control:focus {\n color: #212529;\n background-color: #fff;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n height: 1.5em;\n}\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n.form-control::file-selector-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n .form-control::file-selector-button {\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: #dde0e3;\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: #dde0e3;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: #dde0e3;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n min-height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::file-selector-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n min-height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::file-selector-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n min-height: calc(1.5em + 0.75rem + 2px);\n}\ntextarea.form-control-sm {\n min-height: calc(1.5em + 0.5rem + 2px);\n}\ntextarea.form-control-lg {\n min-height: calc(1.5em + 1rem + 2px);\n}\n\n.form-control-color {\n width: 3rem;\n height: auto;\n padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n height: 1.5em;\n border-radius: 0.25rem;\n}\n.form-control-color::-webkit-color-swatch {\n height: 1.5em;\n border-radius: 0.25rem;\n}\n\n.form-select {\n display: block;\n width: 100%;\n padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n -moz-padding-start: calc(0.75rem - 3px);\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right 0.75rem center;\n background-size: 16px 12px;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none;\n }\n}\n.form-select:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n padding-right: 0.75rem;\n background-image: none;\n}\n.form-select:disabled {\n background-color: #e9ecef;\n}\n.form-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #212529;\n}\n\n.form-select-sm {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.form-select-lg {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.form-check {\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5em;\n margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n float: left;\n margin-left: -1.5em;\n}\n\n.form-check-input {\n width: 1em;\n height: 1em;\n margin-top: 0.25em;\n vertical-align: top;\n background-color: #fff;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: 1px solid rgba(0, 0, 0, 0.25);\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-print-color-adjust: exact;\n color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n border-radius: 50%;\n}\n.form-check-input:active {\n filter: brightness(90%);\n}\n.form-check-input:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n background-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 10l3 3l6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n background-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\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n background-color: #0d6efd;\n border-color: #0d6efd;\n background-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\");\n}\n.form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n opacity: 0.5;\n}\n\n.form-switch {\n padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n width: 2em;\n margin-left: -2.5em;\n background-image: 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\");\n background-position: left center;\n border-radius: 2em;\n transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none;\n }\n}\n.form-switch .form-check-input:focus {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n background-position: right center;\n background-image: 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\");\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: 1rem;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n pointer-events: none;\n filter: none;\n opacity: 0.65;\n}\n\n.form-range {\n width: 100%;\n height: 1.5rem;\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.form-range:focus {\n outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n border: 0;\n}\n.form-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-range::-webkit-slider-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n -moz-transition: none;\n transition: none;\n }\n}\n.form-range::-moz-range-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range:disabled {\n pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n.form-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.form-floating {\n position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-select {\n height: calc(3.5rem + 2px);\n line-height: 1.25;\n}\n.form-floating > label {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n padding: 1rem 0.75rem;\n pointer-events: none;\n border: 1px solid transparent;\n transform-origin: 0 0;\n transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none;\n }\n}\n.form-floating > .form-control {\n padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::-moz-placeholder {\n color: transparent;\n}\n.form-floating > .form-control::placeholder {\n color: transparent;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-select ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus {\n z-index: 3;\n}\n.input-group .btn {\n position: relative;\n z-index: 2;\n}\n.input-group .btn:focus {\n z-index: 3;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #198754;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(25, 135, 84, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #198754;\n padding-right: calc(1.5em + 0.75rem);\n 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.73L.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.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n border-color: #198754;\n}\n.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\"] {\n padding-right: 4.125rem;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\"), 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.73L.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.1z'/%3e%3c/svg%3e\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n border-color: #198754;\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n background-color: #198754;\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #198754;\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid,\n.was-validated .input-group .form-select:valid,\n.input-group .form-select.is-valid {\n z-index: 1;\n}\n.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus,\n.was-validated .input-group .form-select:valid:focus,\n.input-group .form-select.is-valid:focus {\n z-index: 3;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n 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\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n border-color: #dc3545;\n}\n.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\"] {\n padding-right: 4.125rem;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\"), 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\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n border-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n background-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid,\n.was-validated .input-group .form-select:invalid,\n.input-group .form-select.is-invalid {\n z-index: 2;\n}\n.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus,\n.was-validated .input-group .form-select:invalid:focus,\n.input-group .form-select.is-invalid:focus {\n z-index: 3;\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n.btn:hover {\n color: #212529;\n}\n.btn-check:focus + .btn, .btn:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n pointer-events: none;\n opacity: 0.65;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #0b5ed7;\n border-color: #0a58ca;\n}\n.btn-check:focus + .btn-primary, .btn-primary:focus {\n color: #fff;\n background-color: #0b5ed7;\n border-color: #0a58ca;\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0a58ca;\n border-color: #0a53be;\n}\n.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-primary:disabled, .btn-primary.disabled {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-secondary:hover {\n color: #fff;\n background-color: #5c636a;\n border-color: #565e64;\n}\n.btn-check:focus + .btn-secondary, .btn-secondary:focus {\n color: #fff;\n background-color: #5c636a;\n border-color: #565e64;\n box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #565e64;\n border-color: #51585e;\n}\n.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-secondary:disabled, .btn-secondary.disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-success {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #157347;\n border-color: #146c43;\n}\n.btn-check:focus + .btn-success, .btn-success:focus {\n color: #fff;\n background-color: #157347;\n border-color: #146c43;\n box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #146c43;\n border-color: #13653f;\n}\n.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-success:disabled, .btn-success.disabled {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n\n.btn-info {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-info:hover {\n color: #000;\n background-color: #31d2f2;\n border-color: #25cff2;\n}\n.btn-check:focus + .btn-info, .btn-info:focus {\n color: #000;\n background-color: #31d2f2;\n border-color: #25cff2;\n box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle {\n color: #000;\n background-color: #3dd5f3;\n border-color: #25cff2;\n}\n.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-info:disabled, .btn-info.disabled {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n\n.btn-warning {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-warning:hover {\n color: #000;\n background-color: #ffca2c;\n border-color: #ffc720;\n}\n.btn-check:focus + .btn-warning, .btn-warning:focus {\n color: #000;\n background-color: #ffca2c;\n border-color: #ffc720;\n box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle {\n color: #000;\n background-color: #ffcd39;\n border-color: #ffc720;\n}\n.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-warning:disabled, .btn-warning.disabled {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #bb2d3b;\n border-color: #b02a37;\n}\n.btn-check:focus + .btn-danger, .btn-danger:focus {\n color: #fff;\n background-color: #bb2d3b;\n border-color: #b02a37;\n box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #b02a37;\n border-color: #a52834;\n}\n.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-danger:disabled, .btn-danger.disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-light {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-light:hover {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n}\n.btn-check:focus + .btn-light, .btn-light:focus {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n}\n.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-light:disabled, .btn-light.disabled {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-dark {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-dark:hover {\n color: #fff;\n background-color: #1c1f23;\n border-color: #1a1e21;\n}\n.btn-check:focus + .btn-dark, .btn-dark:focus {\n color: #fff;\n background-color: #1c1f23;\n border-color: #1a1e21;\n box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1a1e21;\n border-color: #191c1f;\n}\n.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-dark:disabled, .btn-dark.disabled {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n\n.btn-outline-primary {\n color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-outline-primary:disabled, .btn-outline-primary.disabled {\n color: #0d6efd;\n background-color: transparent;\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {\n box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-secondary:disabled, .btn-outline-secondary.disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-success {\n color: #198754;\n border-color: #198754;\n}\n.btn-outline-success:hover {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-check:focus + .btn-outline-success, .btn-outline-success:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-outline-success:disabled, .btn-outline-success.disabled {\n color: #198754;\n background-color: transparent;\n}\n\n.btn-outline-info {\n color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-outline-info:hover {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-check:focus + .btn-outline-info, .btn-outline-info:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-outline-info:disabled, .btn-outline-info.disabled {\n color: #0dcaf0;\n background-color: transparent;\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n.btn-outline-warning:hover {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {\n box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-warning:disabled, .btn-outline-warning.disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-danger:disabled, .btn-outline-danger.disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-outline-light:hover {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-check:focus + .btn-outline-light, .btn-outline-light:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-light:disabled, .btn-outline-light.disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-dark {\n color: #212529;\n border-color: #212529;\n}\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus {\n box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-outline-dark:disabled, .btn-outline-dark.disabled {\n color: #212529;\n background-color: transparent;\n}\n\n.btn-link {\n font-weight: 400;\n color: #0d6efd;\n text-decoration: underline;\n}\n.btn-link:hover {\n color: #0a58ca;\n}\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n.collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none;\n }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n z-index: 1000;\n display: none;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n.dropdown-menu[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: 0.125rem;\n}\n\n.dropdown-menu-start {\n --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-end {\n --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start;\n }\n .dropdown-menu-sm-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-sm-end {\n --bs-position: end;\n }\n .dropdown-menu-sm-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 768px) {\n .dropdown-menu-md-start {\n --bs-position: start;\n }\n .dropdown-menu-md-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-md-end {\n --bs-position: end;\n }\n .dropdown-menu-md-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start;\n }\n .dropdown-menu-lg-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-lg-end {\n --bs-position: end;\n }\n .dropdown-menu-lg-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start;\n }\n .dropdown-menu-xl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-xl-end {\n --bs-position: end;\n }\n .dropdown-menu-xl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start;\n }\n .dropdown-menu-xxl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-xxl-end {\n --bs-position: end;\n }\n .dropdown-menu-xxl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n.dropend .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n.dropstart .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n display: none;\n}\n.dropstart .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n text-decoration: none;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n.dropdown-item:hover, .dropdown-item:focus {\n color: #1e2125;\n background-color: #e9ecef;\n}\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #0d6efd;\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #adb5bd;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1rem;\n color: #212529;\n}\n\n.dropdown-menu-dark {\n color: #dee2e6;\n background-color: #343a40;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item {\n color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.15);\n}\n.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {\n color: #fff;\n background-color: #0d6efd;\n}\n.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {\n color: #adb5bd;\n}\n.dropdown-menu-dark .dropdown-divider {\n border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item-text {\n color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-header {\n color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn ~ .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n color: #0d6efd;\n text-decoration: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: #0a58ca;\n}\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n.nav-tabs .nav-link {\n margin-bottom: -1px;\n background: none;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n isolation: isolate;\n}\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n background: none;\n border: 0;\n border-radius: 0.25rem;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #0d6efd;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n}\n.navbar-brand {\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n text-decoration: none;\n white-space: nowrap;\n}\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n.navbar-nav .dropdown-menu {\n position: static;\n}\n\n.navbar-text {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n transition: box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none;\n }\n}\n.navbar-toggler:hover {\n text-decoration: none;\n}\n.navbar-toggler:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 0.25rem;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n .navbar-expand-sm .offcanvas-header {\n display: none;\n }\n .navbar-expand-sm .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .offcanvas-top,\n.navbar-expand-sm .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-sm .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n .navbar-expand-md .offcanvas-header {\n display: none;\n }\n .navbar-expand-md .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-md .offcanvas-top,\n.navbar-expand-md .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-md .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n .navbar-expand-lg .offcanvas-header {\n display: none;\n }\n .navbar-expand-lg .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .offcanvas-top,\n.navbar-expand-lg .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-lg .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xl .offcanvas-header {\n display: none;\n }\n .navbar-expand-xl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .offcanvas-top,\n.navbar-expand-xl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-xl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xxl .offcanvas-header {\n display: none;\n }\n .navbar-expand-xxl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .offcanvas-top,\n.navbar-expand-xxl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-xxl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n display: none;\n}\n.navbar-expand .offcanvas-header {\n display: none;\n}\n.navbar-expand .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n}\n.navbar-expand .offcanvas-top,\n.navbar-expand .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n}\n.navbar-expand .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.55);\n border-color: rgba(0, 0, 0, 0.1);\n}\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-text a,\n.navbar-light .navbar-text a:hover,\n.navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.55);\n border-color: rgba(255, 255, 255, 0.1);\n}\n.navbar-dark .navbar-toggler-icon {\n background-image: 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\");\n}\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-text a,\n.navbar-dark .navbar-text a:hover,\n.navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1rem 1rem;\n}\n\n.card-title {\n margin-bottom: 0.5rem;\n}\n\n.card-subtitle {\n margin-top: -0.25rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link + .card-link {\n margin-left: 1rem;\n}\n\n.card-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.5rem 1rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.5rem;\n margin-bottom: -0.5rem;\n margin-left: -0.5rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.5rem;\n margin-left: -0.5rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1rem;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-group > .card {\n margin-bottom: 0.75rem;\n}\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n.card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n.card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n.card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n.card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem 1.25rem;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n background-color: #fff;\n border: 0;\n border-radius: 0;\n overflow-anchor: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none;\n }\n}\n.accordion-button:not(.collapsed) {\n color: #0c63e4;\n background-color: #e7f1ff;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125);\n}\n.accordion-button:not(.collapsed)::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%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-.708z'/%3e%3c/svg%3e\");\n transform: rotate(-180deg);\n}\n.accordion-button::after {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: auto;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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-.708z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-size: 1.25rem;\n transition: transform 0.2s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button::after {\n transition: none;\n }\n}\n.accordion-button:hover {\n z-index: 2;\n}\n.accordion-button:focus {\n z-index: 3;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.accordion-item:first-of-type {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.accordion-item:first-of-type .accordion-button {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.accordion-item:not(:first-of-type) {\n border-top: 0;\n}\n.accordion-item:last-of-type {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n.accordion-item:last-of-type .accordion-button.collapsed {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.accordion-item:last-of-type .accordion-collapse {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.accordion-body {\n padding: 1rem 1.25rem;\n}\n\n.accordion-flush .accordion-collapse {\n border-width: 0;\n}\n.accordion-flush .accordion-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n.accordion-flush .accordion-item:first-child {\n border-top: 0;\n}\n.accordion-flush .accordion-item:last-child {\n border-bottom: 0;\n}\n.accordion-flush .accordion-item .accordion-button {\n border-radius: 0;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0 0;\n margin-bottom: 1rem;\n list-style: none;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: 0.5rem;\n color: #6c757d;\n content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n color: #0d6efd;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #dee2e6;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none;\n }\n}\n.page-link:hover {\n z-index: 2;\n color: #0a58ca;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n.page-link:focus {\n z-index: 3;\n color: #0a58ca;\n background-color: #e9ecef;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.page-item:not(:first-child) .page-link {\n margin-left: -1px;\n}\n.page-item.active .page-link {\n z-index: 3;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.page-link {\n padding: 0.375rem 0.75rem;\n}\n\n.page-item:first-child .page-link {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n}\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n}\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.35em 0.65em;\n font-size: 0.75em;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.alert {\n position: relative;\n padding: 1rem 1rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n color: #084298;\n background-color: #cfe2ff;\n border-color: #b6d4fe;\n}\n.alert-primary .alert-link {\n color: #06357a;\n}\n\n.alert-secondary {\n color: #41464b;\n background-color: #e2e3e5;\n border-color: #d3d6d8;\n}\n.alert-secondary .alert-link {\n color: #34383c;\n}\n\n.alert-success {\n color: #0f5132;\n background-color: #d1e7dd;\n border-color: #badbcc;\n}\n.alert-success .alert-link {\n color: #0c4128;\n}\n\n.alert-info {\n color: #055160;\n background-color: #cff4fc;\n border-color: #b6effb;\n}\n.alert-info .alert-link {\n color: #04414d;\n}\n\n.alert-warning {\n color: #664d03;\n background-color: #fff3cd;\n border-color: #ffecb5;\n}\n.alert-warning .alert-link {\n color: #523e02;\n}\n\n.alert-danger {\n color: #842029;\n background-color: #f8d7da;\n border-color: #f5c2c7;\n}\n.alert-danger .alert-link {\n color: #6a1a21;\n}\n\n.alert-light {\n color: #636464;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n.alert-light .alert-link {\n color: #4f5050;\n}\n\n.alert-dark {\n color: #141619;\n background-color: #d3d3d4;\n border-color: #bcbebf;\n}\n.alert-dark .alert-link {\n color: #101214;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #0d6efd;\n transition: width 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: 1s linear infinite progress-bar-stripes;\n animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: 0.25rem;\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n}\n.list-group-numbered > li::before {\n content: counters(section, \".\") \". \";\n counter-increment: section;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.5rem 1rem;\n color: #212529;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n margin-top: -1px;\n border-top-width: 1px;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n.list-group-flush {\n border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n border-width: 0 0 1px;\n}\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n color: #084298;\n background-color: #cfe2ff;\n}\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #084298;\n background-color: #bacbe6;\n}\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #084298;\n border-color: #084298;\n}\n\n.list-group-item-secondary {\n color: #41464b;\n background-color: #e2e3e5;\n}\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #41464b;\n background-color: #cbccce;\n}\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #41464b;\n border-color: #41464b;\n}\n\n.list-group-item-success {\n color: #0f5132;\n background-color: #d1e7dd;\n}\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #0f5132;\n background-color: #bcd0c7;\n}\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #0f5132;\n border-color: #0f5132;\n}\n\n.list-group-item-info {\n color: #055160;\n background-color: #cff4fc;\n}\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #055160;\n background-color: #badce3;\n}\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #055160;\n border-color: #055160;\n}\n\n.list-group-item-warning {\n color: #664d03;\n background-color: #fff3cd;\n}\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #664d03;\n background-color: #e6dbb9;\n}\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #664d03;\n border-color: #664d03;\n}\n\n.list-group-item-danger {\n color: #842029;\n background-color: #f8d7da;\n}\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #842029;\n background-color: #dfc2c4;\n}\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #842029;\n border-color: #842029;\n}\n\n.list-group-item-light {\n color: #636464;\n background-color: #fefefe;\n}\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #636464;\n background-color: #e5e5e5;\n}\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #636464;\n border-color: #636464;\n}\n\n.list-group-item-dark {\n color: #141619;\n background-color: #d3d3d4;\n}\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #141619;\n background-color: #bebebf;\n}\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #141619;\n border-color: #141619;\n}\n\n.btn-close {\n box-sizing: content-box;\n width: 1em;\n height: 1em;\n padding: 0.25em 0.25em;\n color: #000;\n background: transparent 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 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e\") center/1em auto no-repeat;\n border: 0;\n border-radius: 0.25rem;\n opacity: 0.5;\n}\n.btn-close:hover {\n color: #000;\n text-decoration: none;\n opacity: 0.75;\n}\n.btn-close:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n opacity: 1;\n}\n.btn-close:disabled, .btn-close.disabled {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n opacity: 0.25;\n}\n\n.btn-close-white {\n filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n width: 350px;\n max-width: 100%;\n font-size: 0.875rem;\n pointer-events: auto;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n.toast.showing {\n opacity: 0;\n}\n.toast:not(.show) {\n display: none;\n}\n\n.toast-container {\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.toast-header .btn-close {\n margin-right: -0.375rem;\n margin-left: 0.75rem;\n}\n\n.toast-body {\n padding: 0.75rem;\n word-wrap: break-word;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1055;\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n.modal.show .modal-dialog {\n transform: none;\n}\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n height: calc(100% - 1rem);\n}\n.modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n}\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.modal-header .btn-close {\n padding: 0.5rem 0.5rem;\n margin: -0.5rem -0.5rem -0.5rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center;\n justify-content: flex-end;\n padding: 0.75rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: calc(0.3rem - 1px);\n border-bottom-left-radius: calc(0.3rem - 1px);\n}\n.modal-footer > * {\n margin: 0.25rem;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n\n .modal-dialog-scrollable {\n height: calc(100% - 3.5rem);\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n\n .modal-sm {\n max-width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg,\n.modal-xl {\n max-width: 800px;\n }\n}\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n}\n.modal-fullscreen .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n}\n.modal-fullscreen .modal-header {\n border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n overflow-y: auto;\n}\n.modal-fullscreen .modal-footer {\n border-radius: 0;\n}\n\n@media (max-width: 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-sm-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-sm-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-md-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-md-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-lg-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-lg-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-xl-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xxl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-xxl-down .modal-footer {\n border-radius: 0;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1080;\n display: block;\n margin: 0;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n.tooltip.show {\n opacity: 0.9;\n}\n.tooltip .tooltip-arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n.tooltip .tooltip-arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n bottom: 0;\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n top: -1px;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n right: -1px;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n top: 0;\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n bottom: -1px;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n left: -1px;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0 /* rtl:ignore */;\n z-index: 1070;\n display: block;\n max-width: 276px;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n.popover .popover-arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n bottom: calc(-0.5rem - 1px);\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n left: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n top: calc(-0.5rem - 1px);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f0f0f0;\n}\n\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n right: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f0f0f0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 1rem 1rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n/* rtl:end:ignore */\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n.carousel-control-next {\n transition: none;\n }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n 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 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n 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-.708z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n margin-right: 15%;\n margin-bottom: 1rem;\n margin-left: 15%;\n list-style: none;\n}\n.carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n padding: 0;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none;\n }\n}\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 1.25rem;\n left: 15%;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n color: #fff;\n text-align: center;\n}\n\n.carousel-dark .carousel-control-prev-icon,\n.carousel-dark .carousel-control-next-icon {\n filter: invert(1) grayscale(100);\n}\n.carousel-dark .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n.carousel-dark .carousel-caption {\n color: #000;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: 0.75s linear infinite spinner-border;\n animation: 0.75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: 0.75s linear infinite spinner-grow;\n animation: 0.75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n.spinner-grow {\n -webkit-animation-duration: 1.5s;\n animation-duration: 1.5s;\n }\n}\n.offcanvas {\n position: fixed;\n bottom: 0;\n z-index: 1045;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n visibility: hidden;\n background-color: #fff;\n background-clip: padding-box;\n outline: 0;\n transition: transform 0.3s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none;\n }\n}\n\n.offcanvas-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.offcanvas-backdrop.fade {\n opacity: 0;\n}\n.offcanvas-backdrop.show {\n opacity: 0.5;\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem;\n}\n.offcanvas-header .btn-close {\n padding: 0.5rem 0.5rem;\n margin-top: -0.5rem;\n margin-right: -0.5rem;\n margin-bottom: -0.5rem;\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: 1rem 1rem;\n overflow-y: auto;\n}\n\n.offcanvas-start {\n top: 0;\n left: 0;\n width: 400px;\n border-right: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(-100%);\n}\n\n.offcanvas-end {\n top: 0;\n right: 0;\n width: 400px;\n border-left: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(100%);\n}\n\n.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-top: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(100%);\n}\n\n.offcanvas.show {\n transform: none;\n}\n\n.placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentColor;\n opacity: 0.5;\n}\n.placeholder.btn::before {\n display: inline-block;\n content: \"\";\n}\n\n.placeholder-xs {\n min-height: 0.6em;\n}\n\n.placeholder-sm {\n min-height: 0.8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n -webkit-animation: placeholder-glow 2s ease-in-out infinite;\n animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@-webkit-keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n.placeholder-wave {\n -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n -webkit-mask-size: 200% 100%;\n mask-size: 200% 100%;\n -webkit-animation: placeholder-wave 2s linear infinite;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@-webkit-keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n\n@keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.link-primary {\n color: #0d6efd;\n}\n.link-primary:hover, .link-primary:focus {\n color: #0a58ca;\n}\n\n.link-secondary {\n color: #6c757d;\n}\n.link-secondary:hover, .link-secondary:focus {\n color: #565e64;\n}\n\n.link-success {\n color: #198754;\n}\n.link-success:hover, .link-success:focus {\n color: #146c43;\n}\n\n.link-info {\n color: #0dcaf0;\n}\n.link-info:hover, .link-info:focus {\n color: #3dd5f3;\n}\n\n.link-warning {\n color: #ffc107;\n}\n.link-warning:hover, .link-warning:focus {\n color: #ffcd39;\n}\n\n.link-danger {\n color: #dc3545;\n}\n.link-danger:hover, .link-danger:focus {\n color: #b02a37;\n}\n\n.link-light {\n color: #f8f9fa;\n}\n.link-light:hover, .link-light:focus {\n color: #f9fafb;\n}\n\n.link-dark {\n color: #212529;\n}\n.link-dark:hover, .link-dark:focus {\n color: #1a1e21;\n}\n\n.ratio {\n position: relative;\n width: 100%;\n}\n.ratio::before {\n display: block;\n padding-top: var(--bs-aspect-ratio);\n content: \"\";\n}\n.ratio > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n@media (min-width: 576px) {\n .sticky-sm-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 768px) {\n .sticky-md-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 992px) {\n .sticky-lg-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1200px) {\n .sticky-xl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1400px) {\n .sticky-xxl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentColor;\n opacity: 0.25;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.float-start {\n float: left !important;\n}\n\n.float-end {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n.opacity-0 {\n opacity: 0 !important;\n}\n\n.opacity-25 {\n opacity: 0.25 !important;\n}\n\n.opacity-50 {\n opacity: 0.5 !important;\n}\n\n.opacity-75 {\n opacity: 0.75 !important;\n}\n\n.opacity-100 {\n opacity: 1 !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.overflow-visible {\n overflow: visible !important;\n}\n\n.overflow-scroll {\n overflow: scroll !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.top-0 {\n top: 0 !important;\n}\n\n.top-50 {\n top: 50% !important;\n}\n\n.top-100 {\n top: 100% !important;\n}\n\n.bottom-0 {\n bottom: 0 !important;\n}\n\n.bottom-50 {\n bottom: 50% !important;\n}\n\n.bottom-100 {\n bottom: 100% !important;\n}\n\n.start-0 {\n left: 0 !important;\n}\n\n.start-50 {\n left: 50% !important;\n}\n\n.start-100 {\n left: 100% !important;\n}\n\n.end-0 {\n right: 0 !important;\n}\n\n.end-50 {\n right: 50% !important;\n}\n\n.end-100 {\n right: 100% !important;\n}\n\n.translate-middle {\n transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n transform: translateY(-50%) !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-end {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-end-0 {\n border-right: 0 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-start {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-start-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #0d6efd !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #198754 !important;\n}\n\n.border-info {\n border-color: #0dcaf0 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #212529 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.border-1 {\n border-width: 1px !important;\n}\n\n.border-2 {\n border-width: 2px !important;\n}\n\n.border-3 {\n border-width: 3px !important;\n}\n\n.border-4 {\n border-width: 4px !important;\n}\n\n.border-5 {\n border-width: 5px !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.gap-0 {\n gap: 0 !important;\n}\n\n.gap-1 {\n gap: 0.25rem !important;\n}\n\n.gap-2 {\n gap: 0.5rem !important;\n}\n\n.gap-3 {\n gap: 1rem !important;\n}\n\n.gap-4 {\n gap: 1.5rem !important;\n}\n\n.gap-5 {\n gap: 3rem !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n font-size: 1.25rem !important;\n}\n\n.fs-6 {\n font-size: 1rem !important;\n}\n\n.fst-italic {\n font-style: italic !important;\n}\n\n.fst-normal {\n font-style: normal !important;\n}\n\n.fw-light {\n font-weight: 300 !important;\n}\n\n.fw-lighter {\n font-weight: lighter !important;\n}\n\n.fw-normal {\n font-weight: 400 !important;\n}\n\n.fw-bold {\n font-weight: 700 !important;\n}\n\n.fw-bolder {\n font-weight: bolder !important;\n}\n\n.lh-1 {\n line-height: 1 !important;\n}\n\n.lh-sm {\n line-height: 1.25 !important;\n}\n\n.lh-base {\n line-height: 1.5 !important;\n}\n\n.lh-lg {\n line-height: 2 !important;\n}\n\n.text-start {\n text-align: left !important;\n}\n\n.text-end {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-decoration-underline {\n text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n text-decoration: line-through !important;\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n --bs-text-opacity: 1;\n color: #6c757d !important;\n}\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important;\n}\n\n.text-opacity-25 {\n --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n --bs-text-opacity: 1;\n}\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: transparent !important;\n}\n\n.bg-opacity-10 {\n --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1;\n}\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n -webkit-user-select: all !important;\n -moz-user-select: all !important;\n user-select: all !important;\n}\n\n.user-select-auto {\n -webkit-user-select: auto !important;\n -moz-user-select: auto !important;\n user-select: auto !important;\n}\n\n.user-select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n user-select: none !important;\n}\n\n.pe-none {\n pointer-events: none !important;\n}\n\n.pe-auto {\n pointer-events: auto !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.rounded-1 {\n border-radius: 0.2rem !important;\n}\n\n.rounded-2 {\n border-radius: 0.25rem !important;\n}\n\n.rounded-3 {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-end {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-start {\n border-bottom-left-radius: 0.25rem !important;\n border-top-left-radius: 0.25rem !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-start {\n float: left !important;\n }\n\n .float-sm-end {\n float: right !important;\n }\n\n .float-sm-none {\n float: none !important;\n }\n\n .d-sm-inline {\n display: inline !important;\n }\n\n .d-sm-inline-block {\n display: inline-block !important;\n }\n\n .d-sm-block {\n display: block !important;\n }\n\n .d-sm-grid {\n display: grid !important;\n }\n\n .d-sm-table {\n display: table !important;\n }\n\n .d-sm-table-row {\n display: table-row !important;\n }\n\n .d-sm-table-cell {\n display: table-cell !important;\n }\n\n .d-sm-flex {\n display: flex !important;\n }\n\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n\n .d-sm-none {\n display: none !important;\n }\n\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-sm-row {\n flex-direction: row !important;\n }\n\n .flex-sm-column {\n flex-direction: column !important;\n }\n\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-sm-0 {\n gap: 0 !important;\n }\n\n .gap-sm-1 {\n gap: 0.25rem !important;\n }\n\n .gap-sm-2 {\n gap: 0.5rem !important;\n }\n\n .gap-sm-3 {\n gap: 1rem !important;\n }\n\n .gap-sm-4 {\n gap: 1.5rem !important;\n }\n\n .gap-sm-5 {\n gap: 3rem !important;\n }\n\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-sm-center {\n justify-content: center !important;\n }\n\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n\n .align-items-sm-center {\n align-items: center !important;\n }\n\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n\n .align-content-sm-center {\n align-content: center !important;\n }\n\n .align-content-sm-between {\n align-content: space-between !important;\n }\n\n .align-content-sm-around {\n align-content: space-around !important;\n }\n\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n\n .align-self-sm-auto {\n align-self: auto !important;\n }\n\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n\n .align-self-sm-center {\n align-self: center !important;\n }\n\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n\n .order-sm-first {\n order: -1 !important;\n }\n\n .order-sm-0 {\n order: 0 !important;\n }\n\n .order-sm-1 {\n order: 1 !important;\n }\n\n .order-sm-2 {\n order: 2 !important;\n }\n\n .order-sm-3 {\n order: 3 !important;\n }\n\n .order-sm-4 {\n order: 4 !important;\n }\n\n .order-sm-5 {\n order: 5 !important;\n }\n\n .order-sm-last {\n order: 6 !important;\n }\n\n .m-sm-0 {\n margin: 0 !important;\n }\n\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n\n .m-sm-3 {\n margin: 1rem !important;\n }\n\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n\n .m-sm-5 {\n margin: 3rem !important;\n }\n\n .m-sm-auto {\n margin: auto !important;\n }\n\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n\n .mt-sm-auto {\n margin-top: auto !important;\n }\n\n .me-sm-0 {\n margin-right: 0 !important;\n }\n\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n\n .me-sm-auto {\n margin-right: auto !important;\n }\n\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n\n .ms-sm-auto {\n margin-left: auto !important;\n }\n\n .p-sm-0 {\n padding: 0 !important;\n }\n\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n\n .p-sm-3 {\n padding: 1rem !important;\n }\n\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n\n .p-sm-5 {\n padding: 3rem !important;\n }\n\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n\n .text-sm-start {\n text-align: left !important;\n }\n\n .text-sm-end {\n text-align: right !important;\n }\n\n .text-sm-center {\n text-align: center !important;\n }\n}\n@media (min-width: 768px) {\n .float-md-start {\n float: left !important;\n }\n\n .float-md-end {\n float: right !important;\n }\n\n .float-md-none {\n float: none !important;\n }\n\n .d-md-inline {\n display: inline !important;\n }\n\n .d-md-inline-block {\n display: inline-block !important;\n }\n\n .d-md-block {\n display: block !important;\n }\n\n .d-md-grid {\n display: grid !important;\n }\n\n .d-md-table {\n display: table !important;\n }\n\n .d-md-table-row {\n display: table-row !important;\n }\n\n .d-md-table-cell {\n display: table-cell !important;\n }\n\n .d-md-flex {\n display: flex !important;\n }\n\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n\n .d-md-none {\n display: none !important;\n }\n\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-md-row {\n flex-direction: row !important;\n }\n\n .flex-md-column {\n flex-direction: column !important;\n }\n\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-md-0 {\n gap: 0 !important;\n }\n\n .gap-md-1 {\n gap: 0.25rem !important;\n }\n\n .gap-md-2 {\n gap: 0.5rem !important;\n }\n\n .gap-md-3 {\n gap: 1rem !important;\n }\n\n .gap-md-4 {\n gap: 1.5rem !important;\n }\n\n .gap-md-5 {\n gap: 3rem !important;\n }\n\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-md-center {\n justify-content: center !important;\n }\n\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-md-start {\n align-items: flex-start !important;\n }\n\n .align-items-md-end {\n align-items: flex-end !important;\n }\n\n .align-items-md-center {\n align-items: center !important;\n }\n\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n\n .align-content-md-start {\n align-content: flex-start !important;\n }\n\n .align-content-md-end {\n align-content: flex-end !important;\n }\n\n .align-content-md-center {\n align-content: center !important;\n }\n\n .align-content-md-between {\n align-content: space-between !important;\n }\n\n .align-content-md-around {\n align-content: space-around !important;\n }\n\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n\n .align-self-md-auto {\n align-self: auto !important;\n }\n\n .align-self-md-start {\n align-self: flex-start !important;\n }\n\n .align-self-md-end {\n align-self: flex-end !important;\n }\n\n .align-self-md-center {\n align-self: center !important;\n }\n\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n\n .order-md-first {\n order: -1 !important;\n }\n\n .order-md-0 {\n order: 0 !important;\n }\n\n .order-md-1 {\n order: 1 !important;\n }\n\n .order-md-2 {\n order: 2 !important;\n }\n\n .order-md-3 {\n order: 3 !important;\n }\n\n .order-md-4 {\n order: 4 !important;\n }\n\n .order-md-5 {\n order: 5 !important;\n }\n\n .order-md-last {\n order: 6 !important;\n }\n\n .m-md-0 {\n margin: 0 !important;\n }\n\n .m-md-1 {\n margin: 0.25rem !important;\n }\n\n .m-md-2 {\n margin: 0.5rem !important;\n }\n\n .m-md-3 {\n margin: 1rem !important;\n }\n\n .m-md-4 {\n margin: 1.5rem !important;\n }\n\n .m-md-5 {\n margin: 3rem !important;\n }\n\n .m-md-auto {\n margin: auto !important;\n }\n\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-md-0 {\n margin-top: 0 !important;\n }\n\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n\n .mt-md-auto {\n margin-top: auto !important;\n }\n\n .me-md-0 {\n margin-right: 0 !important;\n }\n\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-md-3 {\n margin-right: 1rem !important;\n }\n\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-md-5 {\n margin-right: 3rem !important;\n }\n\n .me-md-auto {\n margin-right: auto !important;\n }\n\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n\n .ms-md-0 {\n margin-left: 0 !important;\n }\n\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n\n .ms-md-auto {\n margin-left: auto !important;\n }\n\n .p-md-0 {\n padding: 0 !important;\n }\n\n .p-md-1 {\n padding: 0.25rem !important;\n }\n\n .p-md-2 {\n padding: 0.5rem !important;\n }\n\n .p-md-3 {\n padding: 1rem !important;\n }\n\n .p-md-4 {\n padding: 1.5rem !important;\n }\n\n .p-md-5 {\n padding: 3rem !important;\n }\n\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-md-0 {\n padding-top: 0 !important;\n }\n\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n\n .pe-md-0 {\n padding-right: 0 !important;\n }\n\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-md-0 {\n padding-left: 0 !important;\n }\n\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n\n .text-md-start {\n text-align: left !important;\n }\n\n .text-md-end {\n text-align: right !important;\n }\n\n .text-md-center {\n text-align: center !important;\n }\n}\n@media (min-width: 992px) {\n .float-lg-start {\n float: left !important;\n }\n\n .float-lg-end {\n float: right !important;\n }\n\n .float-lg-none {\n float: none !important;\n }\n\n .d-lg-inline {\n display: inline !important;\n }\n\n .d-lg-inline-block {\n display: inline-block !important;\n }\n\n .d-lg-block {\n display: block !important;\n }\n\n .d-lg-grid {\n display: grid !important;\n }\n\n .d-lg-table {\n display: table !important;\n }\n\n .d-lg-table-row {\n display: table-row !important;\n }\n\n .d-lg-table-cell {\n display: table-cell !important;\n }\n\n .d-lg-flex {\n display: flex !important;\n }\n\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n\n .d-lg-none {\n display: none !important;\n }\n\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-lg-row {\n flex-direction: row !important;\n }\n\n .flex-lg-column {\n flex-direction: column !important;\n }\n\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-lg-0 {\n gap: 0 !important;\n }\n\n .gap-lg-1 {\n gap: 0.25rem !important;\n }\n\n .gap-lg-2 {\n gap: 0.5rem !important;\n }\n\n .gap-lg-3 {\n gap: 1rem !important;\n }\n\n .gap-lg-4 {\n gap: 1.5rem !important;\n }\n\n .gap-lg-5 {\n gap: 3rem !important;\n }\n\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-lg-center {\n justify-content: center !important;\n }\n\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n\n .align-items-lg-center {\n align-items: center !important;\n }\n\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n\n .align-content-lg-center {\n align-content: center !important;\n }\n\n .align-content-lg-between {\n align-content: space-between !important;\n }\n\n .align-content-lg-around {\n align-content: space-around !important;\n }\n\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n\n .align-self-lg-auto {\n align-self: auto !important;\n }\n\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n\n .align-self-lg-center {\n align-self: center !important;\n }\n\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n\n .order-lg-first {\n order: -1 !important;\n }\n\n .order-lg-0 {\n order: 0 !important;\n }\n\n .order-lg-1 {\n order: 1 !important;\n }\n\n .order-lg-2 {\n order: 2 !important;\n }\n\n .order-lg-3 {\n order: 3 !important;\n }\n\n .order-lg-4 {\n order: 4 !important;\n }\n\n .order-lg-5 {\n order: 5 !important;\n }\n\n .order-lg-last {\n order: 6 !important;\n }\n\n .m-lg-0 {\n margin: 0 !important;\n }\n\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n\n .m-lg-3 {\n margin: 1rem !important;\n }\n\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n\n .m-lg-5 {\n margin: 3rem !important;\n }\n\n .m-lg-auto {\n margin: auto !important;\n }\n\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n\n .mt-lg-auto {\n margin-top: auto !important;\n }\n\n .me-lg-0 {\n margin-right: 0 !important;\n }\n\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n\n .me-lg-auto {\n margin-right: auto !important;\n }\n\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n\n .ms-lg-auto {\n margin-left: auto !important;\n }\n\n .p-lg-0 {\n padding: 0 !important;\n }\n\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n\n .p-lg-3 {\n padding: 1rem !important;\n }\n\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n\n .p-lg-5 {\n padding: 3rem !important;\n }\n\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n\n .text-lg-start {\n text-align: left !important;\n }\n\n .text-lg-end {\n text-align: right !important;\n }\n\n .text-lg-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .float-xl-start {\n float: left !important;\n }\n\n .float-xl-end {\n float: right !important;\n }\n\n .float-xl-none {\n float: none !important;\n }\n\n .d-xl-inline {\n display: inline !important;\n }\n\n .d-xl-inline-block {\n display: inline-block !important;\n }\n\n .d-xl-block {\n display: block !important;\n }\n\n .d-xl-grid {\n display: grid !important;\n }\n\n .d-xl-table {\n display: table !important;\n }\n\n .d-xl-table-row {\n display: table-row !important;\n }\n\n .d-xl-table-cell {\n display: table-cell !important;\n }\n\n .d-xl-flex {\n display: flex !important;\n }\n\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xl-none {\n display: none !important;\n }\n\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-xl-row {\n flex-direction: row !important;\n }\n\n .flex-xl-column {\n flex-direction: column !important;\n }\n\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-xl-0 {\n gap: 0 !important;\n }\n\n .gap-xl-1 {\n gap: 0.25rem !important;\n }\n\n .gap-xl-2 {\n gap: 0.5rem !important;\n }\n\n .gap-xl-3 {\n gap: 1rem !important;\n }\n\n .gap-xl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xl-5 {\n gap: 3rem !important;\n }\n\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xl-center {\n justify-content: center !important;\n }\n\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xl-center {\n align-items: center !important;\n }\n\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xl-center {\n align-content: center !important;\n }\n\n .align-content-xl-between {\n align-content: space-between !important;\n }\n\n .align-content-xl-around {\n align-content: space-around !important;\n }\n\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xl-auto {\n align-self: auto !important;\n }\n\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xl-center {\n align-self: center !important;\n }\n\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n\n .order-xl-first {\n order: -1 !important;\n }\n\n .order-xl-0 {\n order: 0 !important;\n }\n\n .order-xl-1 {\n order: 1 !important;\n }\n\n .order-xl-2 {\n order: 2 !important;\n }\n\n .order-xl-3 {\n order: 3 !important;\n }\n\n .order-xl-4 {\n order: 4 !important;\n }\n\n .order-xl-5 {\n order: 5 !important;\n }\n\n .order-xl-last {\n order: 6 !important;\n }\n\n .m-xl-0 {\n margin: 0 !important;\n }\n\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n\n .m-xl-3 {\n margin: 1rem !important;\n }\n\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xl-5 {\n margin: 3rem !important;\n }\n\n .m-xl-auto {\n margin: auto !important;\n }\n\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xl-auto {\n margin-top: auto !important;\n }\n\n .me-xl-0 {\n margin-right: 0 !important;\n }\n\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xl-auto {\n margin-right: auto !important;\n }\n\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xl-auto {\n margin-left: auto !important;\n }\n\n .p-xl-0 {\n padding: 0 !important;\n }\n\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n\n .p-xl-3 {\n padding: 1rem !important;\n }\n\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xl-5 {\n padding: 3rem !important;\n }\n\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n\n .text-xl-start {\n text-align: left !important;\n }\n\n .text-xl-end {\n text-align: right !important;\n }\n\n .text-xl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1400px) {\n .float-xxl-start {\n float: left !important;\n }\n\n .float-xxl-end {\n float: right !important;\n }\n\n .float-xxl-none {\n float: none !important;\n }\n\n .d-xxl-inline {\n display: inline !important;\n }\n\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n\n .d-xxl-block {\n display: block !important;\n }\n\n .d-xxl-grid {\n display: grid !important;\n }\n\n .d-xxl-table {\n display: table !important;\n }\n\n .d-xxl-table-row {\n display: table-row !important;\n }\n\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n\n .d-xxl-flex {\n display: flex !important;\n }\n\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xxl-none {\n display: none !important;\n }\n\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-xxl-row {\n flex-direction: row !important;\n }\n\n .flex-xxl-column {\n flex-direction: column !important;\n }\n\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-xxl-0 {\n gap: 0 !important;\n }\n\n .gap-xxl-1 {\n gap: 0.25rem !important;\n }\n\n .gap-xxl-2 {\n gap: 0.5rem !important;\n }\n\n .gap-xxl-3 {\n gap: 1rem !important;\n }\n\n .gap-xxl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xxl-5 {\n gap: 3rem !important;\n }\n\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xxl-center {\n align-items: center !important;\n }\n\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xxl-center {\n align-content: center !important;\n }\n\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xxl-center {\n align-self: center !important;\n }\n\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n\n .order-xxl-first {\n order: -1 !important;\n }\n\n .order-xxl-0 {\n order: 0 !important;\n }\n\n .order-xxl-1 {\n order: 1 !important;\n }\n\n .order-xxl-2 {\n order: 2 !important;\n }\n\n .order-xxl-3 {\n order: 3 !important;\n }\n\n .order-xxl-4 {\n order: 4 !important;\n }\n\n .order-xxl-5 {\n order: 5 !important;\n }\n\n .order-xxl-last {\n order: 6 !important;\n }\n\n .m-xxl-0 {\n margin: 0 !important;\n }\n\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n\n .m-xxl-3 {\n margin: 1rem !important;\n }\n\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xxl-5 {\n margin: 3rem !important;\n }\n\n .m-xxl-auto {\n margin: auto !important;\n }\n\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xxl-auto {\n margin-right: auto !important;\n }\n\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n\n .p-xxl-0 {\n padding: 0 !important;\n }\n\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n\n .p-xxl-3 {\n padding: 1rem !important;\n }\n\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xxl-5 {\n padding: 3rem !important;\n }\n\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n\n .text-xxl-start {\n text-align: left !important;\n }\n\n .text-xxl-end {\n text-align: right !important;\n }\n\n .text-xxl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .fs-1 {\n font-size: 2.5rem !important;\n }\n\n .fs-2 {\n font-size: 2rem !important;\n }\n\n .fs-3 {\n font-size: 1.75rem !important;\n }\n\n .fs-4 {\n font-size: 1.5rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n\n .d-print-inline-block {\n display: inline-block !important;\n }\n\n .d-print-block {\n display: block !important;\n }\n\n .d-print-grid {\n display: grid !important;\n }\n\n .d-print-table {\n display: table !important;\n }\n\n .d-print-table-row {\n display: table-row !important;\n }\n\n .d-print-table-cell {\n display: table-cell !important;\n }\n\n .d-print-flex {\n display: flex !important;\n }\n\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","//\n// Headings\n//\n.h1 {\n @extend h1;\n}\n\n.h2 {\n @extend h2;\n}\n\n.h3 {\n @extend h3;\n}\n\n.h4 {\n @extend h4;\n}\n\n.h5 {\n @extend h5;\n}\n\n.h6 {\n @extend h6;\n}\n\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n@each $display, $font-size in $display-font-sizes {\n .display-#{$display} {\n @include font-size($font-size);\n font-weight: $display-font-weight;\n line-height: $display-line-height;\n }\n}\n\n//\n// Emphasis\n//\n.small {\n @extend small;\n}\n\n.mark {\n @extend mark;\n}\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled();\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size($initialism-font-size);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-font-size);\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n.blockquote-footer {\n margin-top: -$blockquote-margin-y;\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-footer-font-size);\n color: $blockquote-footer-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer * .5;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n width: 100%;\n padding-right: var(--#{$variable-prefix}gutter-x, #{$gutter});\n padding-left: var(--#{$variable-prefix}gutter-x, #{$gutter});\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$variable-prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$variable-prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$variable-prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$variable-prefix}gutter-x: #{$gutter};\n --#{$variable-prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$variable-prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$variable-prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$variable-prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$variable-prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n --#{$variable-prefix}table-bg: #{$table-bg};\n --#{$variable-prefix}table-accent-bg: #{$table-accent-bg};\n --#{$variable-prefix}table-striped-color: #{$table-striped-color};\n --#{$variable-prefix}table-striped-bg: #{$table-striped-bg};\n --#{$variable-prefix}table-active-color: #{$table-active-color};\n --#{$variable-prefix}table-active-bg: #{$table-active-bg};\n --#{$variable-prefix}table-hover-color: #{$table-hover-color};\n --#{$variable-prefix}table-hover-bg: #{$table-hover-bg};\n\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n vertical-align: $table-cell-vertical-align;\n border-color: $table-border-color;\n\n // Target th & td\n // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.\n // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\n // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y $table-cell-padding-x;\n background-color: var(--#{$variable-prefix}table-bg);\n border-bottom-width: $table-border-width;\n box-shadow: inset 0 0 0 9999px var(--#{$variable-prefix}table-accent-bg);\n }\n\n > tbody {\n vertical-align: inherit;\n }\n\n > thead {\n vertical-align: bottom;\n }\n\n // Highlight border color between thead, tbody and tfoot.\n > :not(:first-child) {\n border-top: (2 * $table-border-width) solid $table-group-separator-color;\n }\n}\n\n\n//\n// Change placement of captions with a class\n//\n\n.caption-top {\n caption-side: top;\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n//\n// When borders are added on all sides of the cells, the corners can render odd when\n// these borders do not have the same color or if they are semi-transparent.\n// Therefor we add top and border bottoms to the `tr`s and left and right borders\n// to the `td`s or `th`s\n\n.table-bordered {\n > :not(caption) > * {\n border-width: $table-border-width 0;\n\n // stylelint-disable-next-line selector-max-universal\n > * {\n border-width: 0 $table-border-width;\n }\n }\n}\n\n.table-borderless {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n border-bottom-width: 0;\n }\n\n > :not(:first-child) {\n border-top-width: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-striped-bg);\n color: var(--#{$variable-prefix}table-striped-color);\n }\n}\n\n// Active table\n//\n// The `.table-active` class can be added to highlight rows or cells\n\n.table-active {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-active-bg);\n color: var(--#{$variable-prefix}table-active-color);\n}\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover > * {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-hover-bg);\n color: var(--#{$variable-prefix}table-hover-color);\n }\n}\n\n\n// Table variants\n//\n// Table variants set the table cell backgrounds, border colors\n// and the colors of the striped, hovered & active tables\n\n@each $color, $value in $table-variants {\n @include table-variant($color, $value);\n}\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @include media-breakpoint-down($breakpoint) {\n .table-responsive#{$infix} {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n }\n}\n","// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n\n --#{$variable-prefix}table-bg: #{$background};\n --#{$variable-prefix}table-striped-bg: #{$striped-bg};\n --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$variable-prefix}table-active-bg: #{$active-bg};\n --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$variable-prefix}table-hover-bg: #{$hover-bg};\n --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: $color;\n border-color: mix($color, $background, percentage($table-border-factor));\n }\n}\n// scss-docs-end table-variant\n","//\n// Labels\n//\n\n.form-label {\n margin-bottom: $form-label-margin-bottom;\n @include font-size($form-label-font-size);\n font-style: $form-label-font-style;\n font-weight: $form-label-font-weight;\n color: $form-label-color;\n}\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: add($input-padding-y, $input-border-width);\n padding-bottom: add($input-padding-y, $input-border-width);\n margin-bottom: 0; // Override the `<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n font-style: $form-label-font-style;\n font-weight: $form-label-font-weight;\n line-height: $input-line-height;\n color: $form-label-color;\n}\n\n.col-form-label-lg {\n padding-top: add($input-padding-y-lg, $input-border-width);\n padding-bottom: add($input-padding-y-lg, $input-border-width);\n @include font-size($input-font-size-lg);\n}\n\n.col-form-label-sm {\n padding-top: add($input-padding-y-sm, $input-border-width);\n padding-bottom: add($input-padding-y-sm, $input-border-width);\n @include font-size($input-font-size-sm);\n}\n","//\n// Form text\n//\n\n.form-text {\n margin-top: $form-text-margin-top;\n @include font-size($form-text-font-size);\n font-style: $form-text-font-style;\n font-weight: $form-text-font-weight;\n color: $form-text-color;\n}\n","//\n// General form controls (plus a few specific high-level interventions)\n//\n\n.form-control {\n display: block;\n width: 100%;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n appearance: none; // Fix appearance for date inputs in Safari\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n &[type=\"file\"] {\n overflow: hidden; // prevent pseudo element button overlap\n\n &:not(:disabled):not([readonly]) {\n cursor: pointer;\n }\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($input-box-shadow, $input-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $input-focus-box-shadow;\n }\n }\n\n // Add some height to date inputs on iOS\n // https://github.com/twbs/bootstrap/issues/23307\n // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved\n &::-webkit-date-and-time-value {\n // Multiply line-height by 1em if it has no unit\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n }\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n border-color: $input-disabled-border-color;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n\n // File input buttons theming\n &::file-selector-button {\n padding: $input-padding-y $input-padding-x;\n margin: (-$input-padding-y) (-$input-padding-x);\n margin-inline-end: $input-padding-x;\n color: $form-file-button-color;\n @include gradient-bg($form-file-button-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: $input-border-width;\n border-radius: 0; // stylelint-disable-line property-disallowed-list\n @include transition($btn-transition);\n }\n\n &:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: $form-file-button-hover-bg;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y $input-padding-x;\n margin: (-$input-padding-y) (-$input-padding-x);\n margin-inline-end: $input-padding-x;\n color: $form-file-button-color;\n @include gradient-bg($form-file-button-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: $input-border-width;\n border-radius: 0; // stylelint-disable-line property-disallowed-list\n @include transition($btn-transition);\n }\n\n &:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: $form-file-button-hover-bg;\n }\n}\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: $input-padding-y 0;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n min-height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n @include border-radius($input-border-radius-sm);\n\n &::file-selector-button {\n padding: $input-padding-y-sm $input-padding-x-sm;\n margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\n margin-inline-end: $input-padding-x-sm;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y-sm $input-padding-x-sm;\n margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\n margin-inline-end: $input-padding-x-sm;\n }\n}\n\n.form-control-lg {\n min-height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n @include border-radius($input-border-radius-lg);\n\n &::file-selector-button {\n padding: $input-padding-y-lg $input-padding-x-lg;\n margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\n margin-inline-end: $input-padding-x-lg;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y-lg $input-padding-x-lg;\n margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\n margin-inline-end: $input-padding-x-lg;\n }\n}\n\n// Make sure textareas don't shrink too much when resized\n// https://github.com/twbs/bootstrap/pull/29124\n// stylelint-disable selector-no-qualifying-type\ntextarea {\n &.form-control {\n min-height: $input-height;\n }\n\n &.form-control-sm {\n min-height: $input-height-sm;\n }\n\n &.form-control-lg {\n min-height: $input-height-lg;\n }\n}\n// stylelint-enable selector-no-qualifying-type\n\n.form-control-color {\n width: $form-color-width;\n height: auto; // Override fixed browser height\n padding: $input-padding-y;\n\n &:not(:disabled):not([readonly]) {\n cursor: pointer;\n }\n\n &::-moz-color-swatch {\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n @include border-radius($input-border-radius);\n }\n\n &::-webkit-color-swatch {\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n @include border-radius($input-border-radius);\n }\n}\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$variable-prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n","// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n\n.form-select {\n display: block;\n width: 100%;\n padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;\n // stylelint-disable-next-line property-no-vendor-prefix\n -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636\n font-family: $form-select-font-family;\n @include font-size($form-select-font-size);\n font-weight: $form-select-font-weight;\n line-height: $form-select-line-height;\n color: $form-select-color;\n background-color: $form-select-bg;\n background-image: escape-svg($form-select-indicator);\n background-repeat: no-repeat;\n background-position: $form-select-bg-position;\n background-size: $form-select-bg-size;\n border: $form-select-border-width solid $form-select-border-color;\n @include border-radius($form-select-border-radius, 0);\n @include box-shadow($form-select-box-shadow);\n @include transition($form-select-transition);\n appearance: none;\n\n &:focus {\n border-color: $form-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $form-select-focus-box-shadow;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n padding-right: $form-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $form-select-disabled-color;\n background-color: $form-select-disabled-bg;\n border-color: $form-select-disabled-border-color;\n }\n\n // Remove outline from select box in FF\n &:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 $form-select-color;\n }\n}\n\n.form-select-sm {\n padding-top: $form-select-padding-y-sm;\n padding-bottom: $form-select-padding-y-sm;\n padding-left: $form-select-padding-x-sm;\n @include font-size($form-select-font-size-sm);\n @include border-radius($form-select-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: $form-select-padding-y-lg;\n padding-bottom: $form-select-padding-y-lg;\n padding-left: $form-select-padding-x-lg;\n @include font-size($form-select-font-size-lg);\n @include border-radius($form-select-border-radius-lg);\n}\n","//\n// Check/radio\n//\n\n.form-check {\n display: block;\n min-height: $form-check-min-height;\n padding-left: $form-check-padding-start;\n margin-bottom: $form-check-margin-bottom;\n\n .form-check-input {\n float: left;\n margin-left: $form-check-padding-start * -1;\n }\n}\n\n.form-check-input {\n width: $form-check-input-width;\n height: $form-check-input-width;\n margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height\n vertical-align: top;\n background-color: $form-check-input-bg;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: $form-check-input-border;\n appearance: none;\n color-adjust: exact; // Keep themed appearance for print\n @include transition($form-check-transition);\n\n &[type=\"checkbox\"] {\n @include border-radius($form-check-input-border-radius);\n }\n\n &[type=\"radio\"] {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: $form-check-radio-border-radius;\n }\n\n &:active {\n filter: $form-check-input-active-filter;\n }\n\n &:focus {\n border-color: $form-check-input-focus-border;\n outline: 0;\n box-shadow: $form-check-input-focus-box-shadow;\n }\n\n &:checked {\n background-color: $form-check-input-checked-bg-color;\n border-color: $form-check-input-checked-border-color;\n\n &[type=\"checkbox\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-checked-bg-image);\n }\n }\n\n &[type=\"radio\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-radio-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-radio-checked-bg-image);\n }\n }\n }\n\n &[type=\"checkbox\"]:indeterminate {\n background-color: $form-check-input-indeterminate-bg-color;\n border-color: $form-check-input-indeterminate-border-color;\n\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-indeterminate-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-indeterminate-bg-image);\n }\n }\n\n &:disabled {\n pointer-events: none;\n filter: none;\n opacity: $form-check-input-disabled-opacity;\n }\n\n // Use disabled attribute in addition of :disabled pseudo-class\n // See: https://github.com/twbs/bootstrap/issues/28247\n &[disabled],\n &:disabled {\n ~ .form-check-label {\n opacity: $form-check-label-disabled-opacity;\n }\n }\n}\n\n.form-check-label {\n color: $form-check-label-color;\n cursor: $form-check-label-cursor;\n}\n\n//\n// Switch\n//\n\n.form-switch {\n padding-left: $form-switch-padding-start;\n\n .form-check-input {\n width: $form-switch-width;\n margin-left: $form-switch-padding-start * -1;\n background-image: escape-svg($form-switch-bg-image);\n background-position: left center;\n @include border-radius($form-switch-border-radius);\n @include transition($form-switch-transition);\n\n &:focus {\n background-image: escape-svg($form-switch-focus-bg-image);\n }\n\n &:checked {\n background-position: $form-switch-checked-bg-position;\n\n @if $enable-gradients {\n background-image: escape-svg($form-switch-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-switch-checked-bg-image);\n }\n }\n }\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: $form-check-inline-margin-end;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n\n &[disabled],\n &:disabled {\n + .btn {\n pointer-events: none;\n filter: none;\n opacity: $form-check-btn-check-disabled-opacity;\n }\n }\n}\n","// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.form-range {\n width: 100%;\n height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: 0;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $form-range-thumb-width;\n height: $form-range-thumb-height;\n margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific\n @include gradient-bg($form-range-thumb-bg);\n border: $form-range-thumb-border;\n @include border-radius($form-range-thumb-border-radius);\n @include box-shadow($form-range-thumb-box-shadow);\n @include transition($form-range-thumb-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($form-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $form-range-track-width;\n height: $form-range-track-height;\n color: transparent; // Why?\n cursor: $form-range-track-cursor;\n background-color: $form-range-track-bg;\n border-color: transparent;\n @include border-radius($form-range-track-border-radius);\n @include box-shadow($form-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $form-range-thumb-width;\n height: $form-range-thumb-height;\n @include gradient-bg($form-range-thumb-bg);\n border: $form-range-thumb-border;\n @include border-radius($form-range-thumb-border-radius);\n @include box-shadow($form-range-thumb-box-shadow);\n @include transition($form-range-thumb-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($form-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $form-range-track-width;\n height: $form-range-track-height;\n color: transparent;\n cursor: $form-range-track-cursor;\n background-color: $form-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($form-range-track-border-radius);\n @include box-shadow($form-range-track-box-shadow);\n }\n\n &:disabled {\n pointer-events: none;\n\n &::-webkit-slider-thumb {\n background-color: $form-range-thumb-disabled-bg;\n }\n\n &::-moz-range-thumb {\n background-color: $form-range-thumb-disabled-bg;\n }\n }\n}\n",".form-floating {\n position: relative;\n\n > .form-control,\n > .form-select {\n height: $form-floating-height;\n line-height: $form-floating-line-height;\n }\n\n > label {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%; // allow textareas\n padding: $form-floating-padding-y $form-floating-padding-x;\n pointer-events: none;\n border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model\n transform-origin: 0 0;\n @include transition($form-floating-transition);\n }\n\n // stylelint-disable no-duplicate-selectors\n > .form-control {\n padding: $form-floating-padding-y $form-floating-padding-x;\n\n &::placeholder {\n color: transparent;\n }\n\n &:focus,\n &:not(:placeholder-shown) {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n &:-webkit-autofill {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n }\n\n > .form-select {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n\n > .form-control:focus,\n > .form-control:not(:placeholder-shown),\n > .form-select {\n ~ label {\n opacity: $form-floating-label-opacity;\n transform: $form-floating-label-transform;\n }\n }\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n > .form-control:-webkit-autofill {\n ~ label {\n opacity: $form-floating-label-opacity;\n transform: $form-floating-label-transform;\n }\n }\n // stylelint-enable no-duplicate-selectors\n}\n","//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-select {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n width: 1%;\n min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .form-select:focus {\n z-index: 3;\n }\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-group-addon-padding-y $input-group-addon-padding-x;\n @include font-size($input-font-size); // Match inputs\n font-weight: $input-group-addon-font-weight;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: $form-select-padding-x + $form-select-indicator-padding;\n}\n\n\n// Rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.input-group {\n &:not(.has-validation) {\n > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n > .dropdown-toggle:nth-last-child(n + 3) {\n @include border-end-radius(0);\n }\n }\n\n &.has-validation {\n > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),\n > .dropdown-toggle:nth-last-child(n + 4) {\n @include border-end-radius(0);\n }\n }\n\n $validation-messages: \"\";\n @each $state in map-keys($form-validation-states) {\n $validation-messages: $validation-messages + \":not(.\" + unquote($state) + \"-tooltip)\" + \":not(.\" + unquote($state) + \"-feedback)\";\n }\n\n > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {\n margin-left: -$input-border-width;\n @include border-start-radius(0);\n }\n}\n","// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n padding-right: $form-select-feedback-icon-padding-end;\n background-image: escape-svg($form-select-indicator), escape-svg($icon);\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group .form-control,\n .input-group .form-select {\n @include form-validation-state-selector($state) {\n @if $state == \"valid\" {\n z-index: 1;\n } @else if $state == \"invalid\" {\n z-index: 2;\n }\n &:focus {\n z-index: 3;\n }\n }\n }\n}\n// scss-docs-end form-validation-mixins\n","//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n line-height: $btn-line-height;\n color: $body-color;\n text-align: center;\n text-decoration: if($link-decoration == none, null, none);\n white-space: $btn-white-space;\n vertical-align: middle;\n cursor: if($enable-button-pointers, pointer, null);\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius);\n @include transition($btn-transition);\n\n &:hover {\n color: $body-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n .btn-check:focus + &,\n &:focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n\n &:disabled,\n &.disabled,\n fieldset:disabled & {\n pointer-events: none;\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n}\n\n\n//\n// Alternate buttons\n//\n\n// scss-docs-start btn-variant-loops\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n// scss-docs-end btn-variant-loops\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $btn-link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $btn-link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n text-decoration: $link-hover-decoration;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n &:hover {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n @if $enable-shadows {\n @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n color: $active-color;\n background-color: $active-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $disabled-color;\n background-color: $disabled-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $disabled-border;\n }\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n color: $color;\n border-color: $color;\n\n &:hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n &.dropdown-toggle.show {\n color: $active-color;\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $color;\n background-color: transparent;\n }\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n// scss-docs-end btn-size-mixin\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n// scss-docs-start collapse-classes\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n\n &.collapse-horizontal {\n width: 0;\n height: auto;\n @include transition($transition-collapse-width);\n }\n}\n// scss-docs-end collapse-classes\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y $dropdown-padding-x;\n margin: 0; // Override default margin of ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n\n &[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: $dropdown-spacer;\n }\n}\n\n// scss-docs-start responsive-breakpoints\n// We deliberately hardcode the `bs-` prefix because we check\n// this custom property in JS to determine Popper's positioning\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-start {\n --bs-position: start;\n\n &[data-bs-popper] {\n right: auto;\n left: 0;\n }\n }\n\n .dropdown-menu#{$infix}-end {\n --bs-position: end;\n\n &[data-bs-popper] {\n right: 0;\n left: auto;\n }\n }\n }\n}\n// scss-docs-end responsive-breakpoints\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropend {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(end);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropstart {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(start);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n height: 0;\n margin: $dropdown-divider-margin-y 0;\n overflow: hidden;\n border-top: 1px solid $dropdown-divider-bg;\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n &:hover,\n &:focus {\n color: $dropdown-link-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-header-padding;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n\n// Dark dropdowns\n.dropdown-menu-dark {\n color: $dropdown-dark-color;\n background-color: $dropdown-dark-bg;\n border-color: $dropdown-dark-border-color;\n @include box-shadow($dropdown-dark-box-shadow);\n\n .dropdown-item {\n color: $dropdown-dark-link-color;\n\n &:hover,\n &:focus {\n color: $dropdown-dark-link-hover-color;\n @include gradient-bg($dropdown-dark-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-dark-link-active-color;\n @include gradient-bg($dropdown-dark-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-dark-link-disabled-color;\n }\n }\n\n .dropdown-divider {\n border-color: $dropdown-dark-divider-bg;\n }\n\n .dropdown-item-text {\n color: $dropdown-dark-link-color;\n }\n\n .dropdown-header {\n color: $dropdown-dark-header-color;\n }\n}\n","// scss-docs-start caret-mixins\n@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-end {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-start {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down();\n } @else if $direction == up {\n @include caret-up();\n } @else if $direction == end {\n @include caret-end();\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-start();\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n","// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n }\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n > .btn-check:checked + .btn,\n > .btn-check:focus + .btn,\n > .btn:hover,\n > .btn:focus,\n > .btn:active,\n > .btn.active {\n z-index: 1;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-end-radius(0);\n }\n\n // The left radius should be 0 if the button is:\n // - the \"third or more\" child\n // - the second child and the previous element isn't `.btn-check` (making it the first child visually)\n // - part of a btn-group which isn't the first child\n > .btn:nth-child(n + 3),\n > :not(.btn-check) + .btn,\n > .btn-group:not(:first-child) > .btn {\n @include border-start-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropend &::after {\n margin-left: 0;\n }\n\n .dropstart &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn ~ .btn,\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s, `<ul>`s or `<ol>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n @include font-size($nav-link-font-size);\n font-weight: $nav-link-font-weight;\n color: $nav-link-color;\n text-decoration: if($link-decoration == none, null, none);\n @include transition($nav-link-transition);\n\n &:hover,\n &:focus {\n color: $nav-link-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-link {\n margin-bottom: -$nav-tabs-border-width;\n background: none;\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n &:hover,\n &:focus {\n border-color: $nav-tabs-link-hover-border-color;\n // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\n isolation: isolate;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n background: none;\n border: 0;\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n @include gradient-bg($nav-pills-link-active-bg);\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n > .nav-link,\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n > .nav-link,\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n.nav-fill,\n.nav-justified {\n .nav-item .nav-link {\n width: 100%; // Make sure button will grow\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding-top: $navbar-padding-y;\n padding-right: $navbar-padding-x; // default: null\n padding-bottom: $navbar-padding-y;\n padding-left: $navbar-padding-x; // default: null\n @include gradient-bg();\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n // The `flex-wrap` property is inherited to simplify the expanded navbars\n %container-flex-properties {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n }\n\n > .container,\n > .container-fluid {\n @extend %container-flex-properties;\n }\n\n @each $breakpoint, $container-max-width in $container-max-widths {\n > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n @extend %container-flex-properties;\n }\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-brand-margin-end;\n @include font-size($navbar-brand-font-size);\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap;\n\n &:hover,\n &:focus {\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n @include transition($navbar-toggler-transition);\n\n &:hover {\n text-decoration: none;\n }\n\n &:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 $navbar-toggler-focus-width;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--#{$variable-prefix}scroll-height, 75vh);\n overflow-y: auto;\n}\n\n// scss-docs-start navbar-expand-loop\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n // stylelint-disable-next-line scss/selector-no-union-class-name\n &#{$infix} {\n @include media-breakpoint-up($next) {\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: $navbar-nav-link-padding-x;\n padding-left: $navbar-nav-link-padding-x;\n }\n }\n\n .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n\n .offcanvas-header {\n display: none;\n }\n\n .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important; // stylelint-disable-line declaration-no-important\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n @include transition(none);\n transform: none;\n }\n .offcanvas-top,\n .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n\n .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n }\n }\n }\n}\n// scss-docs-end navbar-expand-loop\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n &:hover,\n &:focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n &:hover,\n &:focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: escape-svg($navbar-light-toggler-icon-bg);\n }\n\n .navbar-text {\n color: $navbar-light-color;\n\n a,\n a:hover,\n a:focus {\n color: $navbar-light-active-color;\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n &:hover,\n &:focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n &:hover,\n &:focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: escape-svg($navbar-dark-toggler-icon-bg);\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a,\n a:hover,\n a:focus {\n color: $navbar-dark-active-color;\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n height: $card-height;\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n @include box-shadow($card-box-shadow);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n\n &:first-child {\n border-top-width: 0;\n @include border-top-radius($card-inner-border-radius);\n }\n\n &:last-child {\n border-bottom-width: 0;\n @include border-bottom-radius($card-inner-border-radius);\n }\n }\n\n // Due to specificity of the above selector (`.card > .list-group`), we must\n // use a child selector here to prevent double borders.\n > .card-header + .list-group,\n > .list-group + .card-footer {\n border-top: 0;\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-y $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-title-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-title-spacer-y * .5;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n &:hover {\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-cap-padding-y $card-cap-padding-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n}\n\n.card-footer {\n padding: $card-cap-padding-y $card-cap-padding-x;\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-cap-padding-x * .5;\n margin-bottom: -$card-cap-padding-y;\n margin-left: -$card-cap-padding-x * .5;\n border-bottom: 0;\n\n @if $nav-tabs-link-active-bg != $card-bg {\n .nav-link.active {\n background-color: $card-bg;\n border-bottom-color: $card-bg;\n }\n }\n}\n\n.card-header-pills {\n margin-right: -$card-cap-padding-x * .5;\n margin-left: -$card-cap-padding-x * .5;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n @include border-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n}\n\n.card-img,\n.card-img-top {\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n display: flex;\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-end-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-disallowed-list\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-disallowed-list\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-start-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-disallowed-list\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-disallowed-list\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: $accordion-button-padding-y $accordion-button-padding-x;\n @include font-size($font-size-base);\n color: $accordion-button-color;\n text-align: left; // Reset button style\n background-color: $accordion-button-bg;\n border: 0;\n @include border-radius(0);\n overflow-anchor: none;\n @include transition($accordion-transition);\n\n &:not(.collapsed) {\n color: $accordion-button-active-color;\n background-color: $accordion-button-active-bg;\n box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color;\n\n &::after {\n background-image: escape-svg($accordion-button-active-icon);\n transform: $accordion-icon-transform;\n }\n }\n\n // Accordion icon\n &::after {\n flex-shrink: 0;\n width: $accordion-icon-width;\n height: $accordion-icon-width;\n margin-left: auto;\n content: \"\";\n background-image: escape-svg($accordion-button-icon);\n background-repeat: no-repeat;\n background-size: $accordion-icon-width;\n @include transition($accordion-icon-transition);\n }\n\n &:hover {\n z-index: 2;\n }\n\n &:focus {\n z-index: 3;\n border-color: $accordion-button-focus-border-color;\n outline: 0;\n box-shadow: $accordion-button-focus-box-shadow;\n }\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n background-color: $accordion-bg;\n border: $accordion-border-width solid $accordion-border-color;\n\n &:first-of-type {\n @include border-top-radius($accordion-border-radius);\n\n .accordion-button {\n @include border-top-radius($accordion-inner-border-radius);\n }\n }\n\n &:not(:first-of-type) {\n border-top: 0;\n }\n\n // Only set a border-radius on the last item if the accordion is collapsed\n &:last-of-type {\n @include border-bottom-radius($accordion-border-radius);\n\n .accordion-button {\n &.collapsed {\n @include border-bottom-radius($accordion-inner-border-radius);\n }\n }\n\n .accordion-collapse {\n @include border-bottom-radius($accordion-border-radius);\n }\n }\n}\n\n.accordion-body {\n padding: $accordion-body-padding-y $accordion-body-padding-x;\n}\n\n\n// Flush accordion items\n//\n// Remove borders and border-radius to keep accordion items edge-to-edge.\n\n.accordion-flush {\n .accordion-collapse {\n border-width: 0;\n }\n\n .accordion-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:first-child { border-top: 0; }\n &:last-child { border-bottom: 0; }\n\n .accordion-button {\n @include border-radius(0);\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: $breadcrumb-margin-bottom;\n @include font-size($breadcrumb-font-size);\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n padding-left: $breadcrumb-item-padding-x;\n\n &::before {\n float: left; // Suppress inline spacings and underlining of the separator\n padding-right: $breadcrumb-item-padding-x;\n color: $breadcrumb-divider-color;\n content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{\"/* rtl:\"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{\"*/\"};\n }\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n}\n\n.page-link {\n position: relative;\n display: block;\n color: $pagination-color;\n text-decoration: if($link-decoration == none, null, none);\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n @include transition($pagination-transition);\n\n &:hover {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n\n &:focus {\n z-index: 3;\n color: $pagination-focus-color;\n background-color: $pagination-focus-bg;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n}\n\n.page-item {\n &:not(:first-child) .page-link {\n margin-left: $pagination-margin-start;\n }\n\n &.active .page-link {\n z-index: 3;\n color: $pagination-active-color;\n @include gradient-bg($pagination-active-bg);\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);\n}\n","// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n }\n\n .page-item {\n @if $pagination-margin-start == (-$pagination-border-width) {\n &:first-child {\n .page-link {\n @include border-start-radius($border-radius);\n }\n }\n\n &:last-child {\n .page-link {\n @include border-end-radius($border-radius);\n }\n }\n } @else {\n //Add border-radius to all pageLinks in case they have left margin\n .page-link {\n @include border-radius($border-radius);\n }\n }\n }\n}\n// scss-docs-end pagination-mixin\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n color: $badge-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include gradient-bg();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n","//\n// Base styles\n//\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $alert-dismissible-padding-r;\n\n // Adjust close link position\n .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: $stretched-link-z-index + 1;\n padding: $alert-padding-y * 1.25 $alert-padding-x;\n }\n}\n\n\n// scss-docs-start alert-modifiers\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $state, $value in $theme-colors {\n $alert-background: shift-color($value, $alert-bg-scale);\n $alert-border: shift-color($value, $alert-border-scale);\n $alert-color: shift-color($value, $alert-color-scale);\n @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {\n $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));\n }\n .alert-#{$state} {\n @include alert-variant($alert-background, $alert-border, $alert-color);\n }\n}\n// scss-docs-end alert-modifiers\n","// scss-docs-start alert-variant-mixin\n@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n .alert-link {\n color: shade-color($color, 20%);\n }\n}\n// scss-docs-end alert-variant-mixin\n","// Disable animation if transitions are disabled\n\n// scss-docs-start progress-keyframes\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n 0% { background-position-x: $progress-height; }\n }\n}\n// scss-docs-end progress-keyframes\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: $progress-bar-animation-timing progress-bar-stripes;\n\n @if $enable-reduced-motion {\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n }\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n @include border-radius($list-group-border-radius);\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n\n > li::before {\n // Increments only this instance of the section counter\n content: counters(section, \".\") \". \";\n counter-increment: section;\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n &:hover,\n &:focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n color: $list-group-color;\n text-decoration: if($link-decoration == none, null, none);\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius(inherit);\n }\n\n &:last-child {\n @include border-bottom-radius(inherit);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n\n & + & {\n border-top-width: 0;\n\n &.active {\n margin-top: -$list-group-border-width;\n border-top-width: $list-group-border-width;\n }\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n > .list-group-item {\n &:first-child {\n @include border-bottom-start-radius($list-group-border-radius);\n @include border-top-end-radius(0);\n }\n\n &:last-child {\n @include border-top-end-radius($list-group-border-radius);\n @include border-bottom-start-radius(0);\n }\n\n &.active {\n margin-top: 0;\n }\n\n + .list-group-item {\n border-top-width: $list-group-border-width;\n border-left-width: 0;\n\n &.active {\n margin-left: -$list-group-border-width;\n border-left-width: $list-group-border-width;\n }\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n @include border-radius(0);\n\n > .list-group-item {\n border-width: 0 0 $list-group-border-width;\n\n &:last-child {\n border-bottom-width: 0;\n }\n }\n}\n\n\n// scss-docs-start list-group-modifiers\n// List group contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $state, $value in $theme-colors {\n $list-group-variant-bg: shift-color($value, $list-group-item-bg-scale);\n $list-group-variant-color: shift-color($value, $list-group-item-color-scale);\n @if (contrast-ratio($list-group-variant-bg, $list-group-variant-color) < $min-contrast-ratio) {\n $list-group-variant-color: mix($value, color-contrast($list-group-variant-bg), abs($list-group-item-color-scale));\n }\n\n @include list-group-item-variant($state, $list-group-variant-bg, $list-group-variant-color);\n}\n// scss-docs-end list-group-modifiers\n","// List Groups\n\n// scss-docs-start list-group-mixin\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n &:hover,\n &:focus {\n color: $color;\n background-color: shade-color($background, 10%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n// scss-docs-end list-group-mixin\n","// transparent background and border properties included for button version.\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n.btn-close {\n box-sizing: content-box;\n width: $btn-close-width;\n height: $btn-close-height;\n padding: $btn-close-padding-y $btn-close-padding-x;\n color: $btn-close-color;\n background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements\n border: 0; // for button elements\n @include border-radius();\n opacity: $btn-close-opacity;\n\n // Override <a>'s hover style\n &:hover {\n color: $btn-close-color;\n text-decoration: none;\n opacity: $btn-close-hover-opacity;\n }\n\n &:focus {\n outline: 0;\n box-shadow: $btn-close-focus-shadow;\n opacity: $btn-close-focus-opacity;\n }\n\n &:disabled,\n &.disabled {\n pointer-events: none;\n user-select: none;\n opacity: $btn-close-disabled-opacity;\n }\n}\n\n.btn-close-white {\n filter: $btn-close-white-filter;\n}\n",".toast {\n width: $toast-max-width;\n max-width: 100%;\n @include font-size($toast-font-size);\n color: $toast-color;\n pointer-events: auto;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n @include border-radius($toast-border-radius);\n\n &.showing {\n opacity: 0;\n }\n\n &:not(.show) {\n display: none;\n }\n}\n\n.toast-container {\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n\n > :not(:last-child) {\n margin-bottom: $toast-spacing;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n @include border-top-radius(subtract($toast-border-radius, $toast-border-width));\n\n .btn-close {\n margin-right: $toast-padding-x * -.5;\n margin-left: $toast-padding-x;\n }\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n word-wrap: break-word;\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n\n // When trying to close, animate focus to scale\n .modal.modal-static & {\n transform: $modal-scale-transform;\n }\n}\n\n.modal-dialog-scrollable {\n height: subtract(100%, $modal-dialog-margin * 2);\n\n .modal-content {\n max-height: 100%;\n overflow: hidden;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: subtract(100%, $modal-dialog-margin * 2);\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n @include overlay-backdrop($zindex-modal-backdrop, $modal-backdrop-bg, $modal-backdrop-opacity);\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-inner-border-radius);\n\n .btn-close {\n padding: ($modal-header-padding-y * .5) ($modal-header-padding-x * .5);\n margin: ($modal-header-padding-y * -.5) ($modal-header-padding-x * -.5) ($modal-header-padding-y * -.5) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when there should be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding - $modal-footer-margin-between * .5;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-inner-border-radius);\n\n // Place margin between footer elements\n // This solution is far from ideal because of the universal selector usage,\n // but is needed to fix https://github.com/twbs/bootstrap/issues/24800\n > * {\n margin: $modal-footer-margin-between * .5;\n }\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n }\n\n .modal-dialog-centered {\n min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n\n// scss-docs-start modal-fullscreen-loop\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n $postfix: if($infix != \"\", $infix + \"-down\", \"\");\n\n @include media-breakpoint-down($breakpoint) {\n .modal-fullscreen#{$postfix} {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n\n .modal-content {\n height: 100%;\n border: 0;\n @include border-radius(0);\n }\n\n .modal-header {\n @include border-radius(0);\n }\n\n .modal-body {\n overflow-y: auto;\n }\n\n .modal-footer {\n @include border-radius(0);\n }\n }\n }\n}\n// scss-docs-end modal-fullscreen-loop\n","// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex;\n width: 100vw;\n height: 100vh;\n background-color: $backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $backdrop-opacity; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .tooltip-arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .tooltip-arrow {\n bottom: 0;\n\n &::before {\n top: -1px;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-end {\n padding: 0 $tooltip-arrow-height;\n\n .tooltip-arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: -1px;\n border-width: ($tooltip-arrow-width * .5) $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .tooltip-arrow {\n top: 0;\n\n &::before {\n bottom: -1px;\n border-width: 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-start {\n padding: 0 $tooltip-arrow-height;\n\n .tooltip-arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: -1px;\n border-width: ($tooltip-arrow-width * .5) 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[data-popper-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[data-popper-placement^=\"right\"] {\n @extend .bs-tooltip-end;\n }\n &[data-popper-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[data-popper-placement^=\"left\"] {\n @extend .bs-tooltip-start;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0 #{\"/* rtl:ignore */\"};\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .popover-arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n > .popover-arrow {\n bottom: subtract(-$popover-arrow-height, $popover-border-width);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-end {\n > .popover-arrow {\n left: subtract(-$popover-arrow-height, $popover-border-width);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n > .popover-arrow {\n top: subtract(-$popover-arrow-height, $popover-border-width);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width * .5;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-start {\n > .popover-arrow {\n right: subtract(-$popover-arrow-height, $popover-border-width);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[data-popper-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[data-popper-placement^=\"right\"] {\n @extend .bs-popover-end;\n }\n &[data-popper-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[data-popper-placement^=\"left\"] {\n @extend .bs-popover-start;\n }\n}\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid $popover-border-color;\n @include border-top-radius($popover-inner-border-radius);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-start and .carousel-item-end is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-start and .active.carousel-item-end is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n/* rtl:end:ignore */\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-start,\n .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-start,\n .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n @include transition(opacity 0s $carousel-transition-duration);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n padding: 0;\n color: $carousel-control-color;\n text-align: center;\n background: none;\n border: 0;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n &:hover,\n &:focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);\n}\n.carousel-control-next {\n right: 0;\n background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n background-image: escape-svg($carousel-control-prev-icon-bg);\n}\n.carousel-control-next-icon {\n background-image: escape-svg($carousel-control-next-icon-bg);\n}\n\n// Optional indicator pips/controls\n//\n// Add a container (such as a list) with the following class and add an item (ideally a focusable control,\n// like a button) with data-bs-target for each slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-bottom: 1rem;\n margin-left: $carousel-control-width;\n list-style: none;\n\n [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n padding: 0;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n border: 0;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: $carousel-indicator-opacity;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: $carousel-indicator-active-opacity;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) * .5;\n bottom: $carousel-caption-spacer;\n left: (100% - $carousel-caption-width) * .5;\n padding-top: $carousel-caption-padding-y;\n padding-bottom: $carousel-caption-padding-y;\n color: $carousel-caption-color;\n text-align: center;\n}\n\n// Dark mode carousel\n\n.carousel-dark {\n .carousel-control-prev-icon,\n .carousel-control-next-icon {\n filter: $carousel-dark-control-icon-filter;\n }\n\n .carousel-indicators [data-bs-target] {\n background-color: $carousel-dark-indicator-active-bg;\n }\n\n .carousel-caption {\n color: $carousel-dark-caption-color;\n }\n}\n","// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n","//\n// Rotating border\n//\n\n// scss-docs-start spinner-border-keyframes\n@keyframes spinner-border {\n to { transform: rotate(360deg) #{\"/* rtl:ignore */\"}; }\n}\n// scss-docs-end spinner-border-keyframes\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: $spinner-vertical-align;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 50%;\n animation: $spinner-animation-speed linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n// scss-docs-start spinner-grow-keyframes\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n// scss-docs-end spinner-grow-keyframes\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: $spinner-vertical-align;\n background-color: currentColor;\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 50%;\n opacity: 0;\n animation: $spinner-animation-speed linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n\n@if $enable-reduced-motion {\n @media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n animation-duration: $spinner-animation-speed * 2;\n }\n }\n}\n",".offcanvas {\n position: fixed;\n bottom: 0;\n z-index: $zindex-offcanvas;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: $offcanvas-color;\n visibility: hidden;\n background-color: $offcanvas-bg-color;\n background-clip: padding-box;\n outline: 0;\n @include box-shadow($offcanvas-box-shadow);\n @include transition(transform $offcanvas-transition-duration ease-in-out);\n}\n\n.offcanvas-backdrop {\n @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity);\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $offcanvas-padding-y $offcanvas-padding-x;\n\n .btn-close {\n padding: ($offcanvas-padding-y * .5) ($offcanvas-padding-x * .5);\n margin-top: $offcanvas-padding-y * -.5;\n margin-right: $offcanvas-padding-x * -.5;\n margin-bottom: $offcanvas-padding-y * -.5;\n }\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: $offcanvas-title-line-height;\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: $offcanvas-padding-y $offcanvas-padding-x;\n overflow-y: auto;\n}\n\n.offcanvas-start {\n top: 0;\n left: 0;\n width: $offcanvas-horizontal-width;\n border-right: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateX(-100%);\n}\n\n.offcanvas-end {\n top: 0;\n right: 0;\n width: $offcanvas-horizontal-width;\n border-left: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateX(100%);\n}\n\n.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: $offcanvas-vertical-height;\n max-height: 100%;\n border-bottom: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n right: 0;\n left: 0;\n height: $offcanvas-vertical-height;\n max-height: 100%;\n border-top: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateY(100%);\n}\n\n.offcanvas.show {\n transform: none;\n}\n",".placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentColor;\n opacity: $placeholder-opacity-max;\n\n &.btn::before {\n display: inline-block;\n content: \"\";\n }\n}\n\n// Sizing\n.placeholder-xs {\n min-height: .6em;\n}\n\n.placeholder-sm {\n min-height: .8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n// Animation\n.placeholder-glow {\n .placeholder {\n animation: placeholder-glow 2s ease-in-out infinite;\n }\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: $placeholder-opacity-min;\n }\n}\n\n.placeholder-wave {\n mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);\n mask-size: 200% 100%;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n 100% {\n mask-position: -200% 0%;\n }\n}\n","@each $color, $value in $theme-colors {\n .link-#{$color} {\n color: $value;\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\n }\n }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.ratio {\n position: relative;\n width: 100%;\n\n &::before {\n display: block;\n padding-top: var(--#{$variable-prefix}aspect-ratio);\n content: \"\";\n }\n\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n\n@each $key, $ratio in $aspect-ratios {\n .ratio-#{$key} {\n --#{$variable-prefix}aspect-ratio: #{$ratio};\n }\n}\n","// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n// Responsive sticky top\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .sticky#{$infix}-top {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n }\n}\n","// scss-docs-start stacks\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n// scss-docs-end stacks\n","//\n// Visually hidden\n//\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n @include visually-hidden();\n}\n","// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::#{$stretched-link-pseudo-element} {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $stretched-link-z-index;\n content: \"\";\n }\n}\n","//\n// Text truncation\n//\n\n.text-truncate {\n @include text-truncate();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",".vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentColor;\n opacity: $hr-opacity;\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (eg. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$variable-prefix}#{$property-class}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$variable-prefix}#{$property-class}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $value in $is-local-vars {\n --#{$variable-prefix}#{$local-var}: #{$value};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/src/base/theme/bootsier/assets/fonts/nunito.css b/src/base/theme/bootsier/assets/fonts/nunito.css new file mode 100644 index 00000000..f444a08f --- /dev/null +++ b/src/base/theme/bootsier/assets/fonts/nunito.css @@ -0,0 +1,70 @@ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: url(/pagetop/fonts/nunito/cyrillic_ext_400.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: url(/pagetop/fonts/nunito/cyrillic_400.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: url(/pagetop/fonts/nunito/vietnamese_400.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: url(/pagetop/fonts/nunito/latin_ext_400.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: url(/pagetop/fonts/nunito/latin_400.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: url(/pagetop/fonts/nunito/cyrillic_ext_700.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: url(/pagetop/fonts/nunito/cyrillic_700.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: url(/pagetop/fonts/nunito/vietnamese_700.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: url(/pagetop/fonts/nunito/latin_ext_700.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: url(/pagetop/fonts/nunito/latin_700.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cadafd359ff244c60bc4ad72a6f06d38e8e31eba GIT binary patch literal 11248 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 ax^!^s)asj|cl@`}rFsASFY(Yp?G6B4bx>*m literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2b4950ff24895b57fc66398bad2f892916d8bb00 GIT binary patch literal 11208 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 literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5539f2e13a28cb3ebe3d732580615fc471225e02 GIT binary patch literal 15308 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 literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9f49fc13de796acbfb3b31845fc87ef947b18ec3 GIT binary patch literal 15164 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 literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2f9cc5964455b8f5ca989db989250dbebb1a5f66 GIT binary patch literal 18972 zcmV)5K*_&%Pew8T0RR9107@JH5dZ)H0ISRZ07<$40RR9100000000000000000000 z0000QY#X>z9ECmxU;u>z2!SLCpDhsx3W3sKfwU(Jgd_j~HUcCAh%y8q1%ws{iAoHC zRvSN=2iP`^2p)6?;Ji~-^*q_Q18^QBKOfSSnZZDJ;9gNyy+ZN-e@22Bhg7jE*%*Fr z;t>JRB6~{SPnT$8zN6EZ<Zemo?ZKH#h(1xx`&JKnmq#%b(mq@LH2CnPns$u_b(0dx z<x><+^VX*{O49PnJn~vdvmU?7Uxr29zlDrCd3;%zlhT*+g>}pPB=nH9!DtR>6vmG5 z`tPw?FLX+#LA^y_<1$9Fa`M{q{AoYuz8e+_TEC`FC8S$2SPN|z{4z7ZZ?i|I3_(D# z2n8Pbs89im$Vn?;%n4Ru&CP`|SGv$e|IJ#ZuKRLPcYnLvx$0ZoT>0PY{5<DedIIl; zsR#0cJqm%Asz0tg3h66#rbnl%w@h1v`1t+!&Ds0DI3`UxiDnW>np8_5s%1z}8i|te zl34$F-RjSMnis)>2MMCVMwHos5notQsueH4)~;2tMfs_!K`pEI1QAFG|3V_1Lt2E# zXe<N&p)PwF^H_#>wZIBHId-apj_Pa5?jLNk5W|;b@srn&A_8+mbQ|giUI70~bC%jW z8|q?P_7jd@BN)j>j!`}~IKV@H#hau=n-<irHnFqO?mxr-%%u(hs_@lc-mwc5KzSX& zO-fQxik+N$+{0Og)A`AvO$mzF*6nm+!>7Zm$&YQ;&l`i%kj6<MK)_oc^Q?R^JseK! z_U}~x?^si*A_M6HNXNR4HEbt&JO!w5Y{Z<Pa#mEw$~YHRXI`DXR-j-fC8F&*|IdOP z<J{LNX*apuWKKTXG93XZ$&YKV_FXaks=%%i$jkIn$X$tYzfAcho?}##UrtVCoIlLn z2tbbQ7jAwNN}$kkJkVc_U)`8SdyX$+V%KTW$Bvt1G1O))jUwp(OtnhuccW=!$w!Uj zT8`DsTI~kOkZbMBoe84GuWD3RRX18_7y=EF0s%RKqc;FS%1{oC=4b(u+D9$dP_xE+ zaXi<!GsXw0cFy_81)1?dcG*Sg2HCv}@4}1E{u@i}%>JDqsIZE$_h0h-B~BgDhPlYX z0J}PtsA@!gZG}{|vDdE*w)kS&5@Z#<*1zs;{~^|{qw$Cci3kZ15eawx&mX?Fd*tRq zq%_4C=lt4f9m|+HEbcxhUm=`uqU$!M9ewQ2jfi8zPKdOxBnV><NCUKBWJn=W%z!i* zMoeZPv&=$fn}_+$2La?5N3IAn+Z=?Wpwe``3}6dU1edF%mqa*zvaAlOtIZRQP~G!Q zHbaF2;7Bv>UY}@&99juDmc%GCQjj;$<z-<O-kjy0Pp}{mH@6waT(x&;tJ@AyeQhK! z&lKV%OrdJE>eOps(5TrYlT9_vbaTwJ$6?2vaN2p--8AB!`yL>TY&pqeuZkH{tyZ0S z4Gfwz8(=iAc#fSL^4u~?({og%TCF<u8W=QbHo$1!`*Yk~65|GqTZ_^7A<-j`JsHo( zaU92S9LI4S$Emmo7cQKho_?d(1*LTT*Lq~v1~TMuUn{Qf>l~?`tKR%qXa%<A7aTMX zv1UlBC?zYb<W<WDY<t*fTi%_N>Gmc`kNXRas2FS<fBrUQTa>OQd6|(0!+dPBbV8YG z7W2R;I=df_Zto52zZpn?T;-`ca>GVY$dbzh&vPczz{;M0b9zlaVF(aGKDKc$4To6y zB$RNeWGiEc*HIARnh4lcMN8HVo<W*X-4o(&N}ffSw0ak*S8*@w${(Oxf>g$jE;c^8 zXz#zSd*}<Y;n6Gj9?`u{t2Nwd*G1v#XUv3lx6=43%vHezFkxbPCC@T)jx5pY*2*Fg z<t92ik37Qi&7GGm`on69J8iHQ@9}~vidGuKE^dyufdb2VGRi+g$j`5LU*QX@o@C_w zF{%d6?R~yVUu_FDf2S`#T6WpWp?_nP1Am^vm%5pQNNcC$S?y>y1;<&Egn7`5_6o%| z0q_Q$B&tJp(iCuL9y>EIhO90iiOj6>?Qti2Giavj5UNWQahFxb`*5<eQUaTHkON&~ zw4>JWNLW4HrB_aYU=Q@zs|@^aPsimdUs{Hnv4bpB+{+e$<}kKd2HcAS^a)-*Q`r<i z;W8BZYtQl#D1_DOD{9lsdb$_Mv>oMD_SUu$_Y=a~Ml_olRu@wdAGWv)N@7G+)$h#M zh0Kk#hE&cyDg&%>ua}HjY3sX_W7CK2R0Z1AzR(2cf+imbq|DRBmXELAD~f#jn%+kl z+{g{k-Ew@Z<+eM41y%b#T((!Jaq~+D!AwkFM1#WoS{~bO3JWbj&}V(Pek;HGRUaFJ zV`2E!D#jY*n%j|kZdes8FQamLDuBx#HEB=09HhsUsj$$!3&1&5GB!C)%l7nK7tJae zk)KMxJ(Y=EA<m_)pU9&;$t@Rg);Hu7L3Kyl0XXUklF<JLI=)oEkSP>Y<n(s$_|ytX zudPRC!$fBQ%C{KkxTwAB2xKDY?kkCABlPDc;g(mB7ctNH31U;|g}PrFTPX0lxn{qy z3_-5p+M^XoKSlfqYZfPIHbJxNE2_C;+`UKg0$0QsXeDTt)@pD^QAj`|H{Wj}Ov=+M zK&33ku+*M#ZrIMm*PNcmG_*C~iA#oId^N$b_fie>yI(}!yarqksJEVJ)c49hbe8n+ zVD-Hz8zCa!YF3)SN0OD*tV3bkt`}#vstaGEz$HU_@im4;rY00E=saIIHZ#&%rl^tw zl&VdAEA~ly>o!7?nMmN?La@uaFlBuRT$I!d33ZUa<QG^{PW0DBk>559cT4nEPl$(< z*k4JTN_!JWcL;v8T+V%13ZBi}7)_kI=ErWj?Q6lw8y=gFrAqM%j|A_z6g>xY@780_ z3cRHxZK}nYr(5Qhf6WaY^@uM_E9HBQjHx`Kind}j`m2^_lp>b75K@X;)GEN*606jJ z_5}4T6+)cRxXmvLwkc`0x24y!s%z-N^Aoel9iYjNfEe4%Nt+NAOAJ94gwfH_bX|-I z%oht_SV={N8m}&(&{U-)04+6$^;^7(**J6T7wA@DWd)S8A>Gd{lYZH0Hh_&+Q5Cl1 zYiI5h|EcWD;;XOJwOtv#*193IZ-U54R8TPL3B0`)%@rA@VyWonxEizpi*VcO9n`;E z4A~w0Vn~+8MxTQ3!Vhx?gsj#+WPI{2UmQBC4f$yFl5Q9Y3>yv<&$6CmCGZ=&$1wjj zjjBUE2<s+#!l~5~(?b1;9DKhCaZ)U;cp>6dhn0a|+NrA+<bm!}A;PVPg*{FC(GdgZ zVTwz*c<hCjg$jPnG^9x5JlcC)K)(=4nF`ltAzR>(*yxMW^wWv%U<y?Kkz>V4q_A}B z(l?eB$&1XSk1Ko3ThGvKg8<DlqrrFQmd2Eo?&T9-v!7?Oi^C>N1xAiZli98U?9ThW z#Z1<Fe9NieqcEG?&ZPU_wAvnh=`)*grZo1ZSvMsYbN#qE0nmtbRcI6kz80Ips@L-R z?>7Vb?2t4-u10B^%v58J1t!_*km-)QWT`8z+UUCLHoIxW7Gs{b-RC}c!k4~w(zkxG z10lZ{`!OUD!VRcf@|-DL35PrdQ8zjXrX-Rj;YbyGS~dV4{fX>evKLPZ7?NT%*Kv%r z5Cvx7?HnEy5V=qcXG)syD1tLvk(>Z}p&Zatx{l|u-i0U5504Ezx^e^H4uRjfyBN{J zg>m2@9uO)H;Cl}a<A4L`?uK_UfIkQyJa(}wNgx1dNGFyL2u$$BgF!LOA`Du!JH>uD z@sYK*961rr)E~*_CA(m>@VvD+8qy&AG8sPR2^|U}5#sSGlxVlt4ywcTRS7r@0U8>` zb@*~GTY?Fv06xb%(F+kMK;vIK9N;Gm;LepD*NP?G$xs!&dEE;&9(!0%#*H9C5Pva> zI-#?M7>3@L(p;bZt%#I<t^f_;*pWIBfv3!QB9cx!OGT7`^@jiuMj&f;=i>Z+WC=(w zUVinmaWZ1A)mThO`Y(DLAmd(ne<zCWS-Op=xaxI{O%JA+CZc18vICGxVN#l+sce(Z zbkgyaBpm4^m~ZSp_^Ycv#AHIL1P|=W%FbIuLvlolQ}$Hj9hIP+ja=!3A>3SyXWg9& z^Yq5<SsQ7&s#Z%1V3ZQfB`PGRa$z~Ix!)bE^G<Jqy0ra5=e%G_+~!^#SKtaN?B<15 z0U=$dJ1gAjO7E~})zB*&kM~?{3#3z^{;l?1!pW68yFMdjYxbR2n}caaNJS31Hw3#` z_*#HH0i&Wq!sfceGa;#I_S$!2#H%3dNq{|C7NC?qJYC=)nss?T1esjG-$3+phC86! zoc;TMpTPIU{es>DK!0`@AQAu!!c{5)`q!J68IVN8xdQA&N;a1@V6BWA+4;S_cfUf& z-^oAIAzjjadQR`@NBTpaOg;_h?x*{;egFVFq9`f$N0hT}#b5O!?b7L)Eb05drb&1N zr~$wV0Pz3*YF>@&i+^AEdq)61d||fZ7V{GP&H3x+dzbH>gAf3S15|kv=uOMf3qVim z@&5rYIO92&z3vNNdERw5T=I?+#vFIWNvC||10Oo)OGL?r9S16E8d{#bc=I9B(F+qU zLZm415+q8JV#HOWK65WXnmqXm6{}FGO0`B!nzd-vuHT>`!%WO3nQV%wX1M8RM||Q% zXT9o8uX)Qap0h&!H{Vk}b=!B5;0GT&;9vsqxvyOa6#Fgkw4;tV<~%8elar89u;s#$ z6K5V=xp8ODS0F$Bf(3X_kT}s|#7Y**C`-BwIWlF-RiIpnQe_Npl=x?{B5k^L=+vvr z`+7`dG2R5z445uNpWnQ9!4vmA^vDAcHGyQ~b@<EDAF%57^u@hqd#`XMQ%6JZrJRSN zv+VnbJc%o8A#!h$a7s1-eZ8-uIrTqM?mJh(sQ?ggt}{cl-9XpDHq_|{jm>d%uk8u> zM^|9ZU0Ko@<vAY-DS>N%TrHtdYE=vZ!uTWx151`MIH)+~17nd&;ghUYfeoZ8wCYd5 z_@+*9Ef`Z*KpfReR#!)>P%B@PT74NCY&yP1l{!|XufAbD29ETxDYMFsmWVnYkfHYG zB*|LUY6TU9|7-rPq7P+PJ!W|ZwXWsNlrx7PwXYZcslnZ&cf_20?DCs-uMGuEx&mEi zNv27g$cdf&UqdJ4e@QCD7FL&`LE2o~Cfj*y%)mW>Ik?P$6AkQ+gj8+ew93rNu4^PD zx0M=Fj;3k~XFx$%Fkle#O(08FCWZuM1mRp!N}4t8OIE@11tH~NC61w@Zh8``L8ppD zFla{vfnW2Gah`<qvgb!m^5NS@4PnyQf`|^ZtqFH%G#hCM^Hc4mNRG9m+lrw9!%B&| zY!j>2Sj7aCT^v|?0xIUAeGUxB=h_(ahLEEy;DdQ=1k<*9xicH3>5?>44<&wx6ULL{ z+A2`sW(mSs?T~LIRK(oJcwS7!e0cM?<-wiJsXAJYXC#H@EFhAT7=~4I>UBs<)^pcV zurv>4j5q?TTgPkjWQ+u|O$g%LG82EAW43AG5}ZK7q*M};#^x@mAtd*W1W8)*&y6tq z2;XH2+i!FbrK-6NugrCw_<IlZ_Ung~kXiS4P9vZ%eQT%qJW!&L3?{HDb1K9iA#oIF zhzZ;k8KO87!YTiYaXy*wl7|xuj*ucO&ggTkL7eMIAl_<`vxQ`G!vOKQ3L>yrlIqjX zS_V;2m%Y(QSw$IQR>8B7u_Alf%r{{u8i|xrX&~t@4@yG1CBm;^{FZSwSp*DL1j%Vc z@){!rjgz7#NT5kl(iACcnp8B4R5ddZfs0TB6>q=M)p7#5?-_G#ABc2kW0e~ZyW6p+ zk6VZcYXR(DP;&l&ECdp2V4w~L8epIa23laC4F)=3pbG|iV4x4CG6F5&mW=BynlYtZ zm1$<N73HXMcTZrkL$<yAxU7L_ol06}H^bw7;c`->fUL9oa)>pp*WG$p^FiuhrXL%q z?naarELqtEz3_j03lUpled7QWJc?euM+}`o0GuxIOxV;6;E&5TXo1#2<N+pg{Q~VE znOKOitFRl?jt?EZhrnd~4ka-FY|k9r^uKJ{yXr_E3F<xCs&ZFpaP*<8-v=;++>sLQ z4HdrY;EIC7%CR3=q6NRZj4;hmVs$r^p3n&h&xz&e`LR9~rY#h_8nqRTqT6Yk<QsZ< zUbAUYHm$Uj$Ihm&AZQDQq$^&wcnG0LOLr|b3yx`~CgL?WBXVGK?c6dSbgNY@amh?@ zTiToyq;ssLXaEuIMRS64i%y$1w9Sz`NQj_TRz@t(3o{+vx6-hs>@}ckEM@Xgf`-J> zZR)$6>4X+oio}B??_434QcmmGyn<o5jI4R9WYQu(IeVieu%4y;pVKn%M5gm|uo+Wn zvb)Yv*TkXGv|y4j(R9Uv>5mp3irSlxEj+c}FP{MW!R_6rz%=-9D^%Kh`dx*4pqOAX zhqHAIRcR|q|Bi$EDn+31Qsco(l<>?Z_nsrz4Nl>?Bm2KtujK-;0-1fgz%xQt&89To z;^GLimDJQPwcNHTc`ie$MuJzZ!RB8p(dV_1X2-Ul&-K+C1ZZs)JHB??Sl@eK@h1#r zObM;|Mv}5MD+IuGt|wo)CqyafBO?JsyAWdm#0Mn<69FW<5L1DB(>RqNn!t>KY&T-g zKz>LHV8KAK8?j_G${SM`DuoHvF2q^@^+CzVMgYw&#8#l$_Kw=nDPGX+M(i2QJ}WQ| z3=F#wN5-8og3LTNCrhhv*Eprun8m(0(XY+lPe@`RY$>qXmSvmkXmJy*#+H>{xhub7 zFK`ezZp(h<DcU?oo0n+wT4uNj+yx%nau}b{;VU|PM~9y>!&l%ZI#Br&jhe&8w>41X zrKpo%U$Yd_7*&B)2G7^(G22|pZ-H+Z@H&|?8oU9bm|KqFrQeYi)R~m#sMF%w08QF& zd_bnJ=7+%4JoN{vkZuI8=AaB;dqHXIo7TE4N1M8NA9-@<FjXpzgRYx`CJ|g_{=_(3 z|E2Nnl_bIDRsE$wr#G#t663%6IdwQH)F`vIpB?`E+w^uiDE}rJHza>th58x);BPMZ zC&hl{=!Os^wZ_^n6bkqkzc)3i8_P>)!h(1=k8ucuGo*-oonkpKWv!0tBKZgx125S} zmt+1zmbVH8CyERLD3Nkq`HxJiN+PB<Ag_?;T!%+ZEyzWwlH{LlrJ2nI`*-zUpZygI z(L<=en*h*y0N5_TpCGC=2;7z-;Qv6_1HRuN4C{572rj5@LmxL0qGb=e@BkFGh>8SD zl0);{VLRaz(dm1cVLC;Ra1<Ja<6O403_)3LuM-KaNSFDCM-iKr=Wc>?17An`(DN>= zJCe(g?gDq1TgV*ZEl*2?ZH#*bd{TcXpJnkNsN=xMxsHUzP7{;{B;bKXd2mXVtgR3& zx(bj%l|c)OE!QC%Mo~yeuGW^IA`FK>Ha^wrwzu4sN?f#I86huB>vMCka)@gbatVrb zy|V|sMNA{Kun6%$b`YvO93rcWL&a0@-A-$K0hdyW&o0T+M`sDrkq)E4B0^-3!>mCh zdg0A+q;HuJE^#(+lpqyTIAvk!bb7QR7ddX~fvWf^=#KyQD&*>bXk`8O6*UZdEz^;| zD>ws-{kd%2&(yYlN6D%ZIfM4f=sUgT%pGJ^C`cC+MJ>C9ac7sp8zWRukmb}~Q!B09 z3}w|@o#GVF>MW9qOa(+aRiYH})$?#!G;{(SEB`0|&BzK%*&*#Mfvo)ZfkeKQIs$D4 zFU~fQ61ZrPmj7s8*udZXZ1S6ZRG=W4=_>twy^q}}C^+)z-c^90X&4omx_wG_TvN(A zI>TZvaqf~sm(uLx;i^ZS-G=X`l+H2s*spV4YO`^TdYz&%yU#Vp3R6+K?pCW+D-?wc zaTUa~3Hb~|N?QIe@efMkURlZ~<Dc-ot@RkV7X~eJ@m;~2GI0JDnchnN5HdfVIa7ly z=#zN#5T3ncmglGHc7GkOlo1Br^3shfIWdy43l{=t&iNpn8wN|sF-RobJbCJO^3iwt z?6@3KV{<~MLhUhw_p~PaZBLO)znN{)fb}by#8*D0qgG!Rjd}I++IoA<NS3R$hAo9J z>T)0B07%x^uR%$3MJ!L2{h3{f?1bA>N(_Wt*$ThVC7cSG%X@uU3e1PBtjB<1p;oH_ zz#xypTbR})8mk&cNq(lBq*{(24x@Q-9$gWSi&82wv#Gtv9`OnONTTYN9>WF04D!QS zUU8E|yO@`IPS#=|YRctRJKcMvEh=itZ`TUlsGkx(n{ay{&m7Q+A9f<RhnCz@Z3)cD zfwb2}L9+2owm$jPx4IqtX!{(Jl5;H~6;;zq3+P!p+#45EKt~Q1Los1lP{~wJL&`T( zJzv8LmGRKe#PeJJ<woP4ZnfCd;sG)Ic@Uy-_&u;J<q<+pHN2sLpP1`PwzCf8oxT}f z;3^Ry7T)}GU5xMS+eNA4e*f0+w))kI@G)@u2hP{j^CYwN*8Z9E?D?XpueShsQAutK za|&LIix5%m$wzy{7g^MEE+1TTRAw9ew@W|0Bw{tAqTu)UF*ZKpSwLa6itC&llH)W& zr_5qLjlOo}a&jvz9#e25E7B|$C$A^Z4}+CfSw9y5Fv{rBm)w#K<>&a#Ok~qYk{7gw zZ@l-5KKjiVA+M($f3}N5{yTMpNqCL;*7o)~$f;cM=qm}vvtbh=?g-L?FEFgATe)Y% za;d>|eQT`jmZ@o=ly!vrhsM<mG6H0!xJCGBA&Xh7rrZ>M5<#*|$(A2(f4>y!>E(|e z<<0l&e{-Y0_<K>*Jx>pSJbpvnN?~3S?oeUQa19av?&}a6zL!wp6=EMj8nWR?BT)?D z3Lq62{a=zR(=#b|=`oiHp=+r(jyXrd)tI}+HW?3y&j%U%{<q!7NDfx)Jvf=ON;x$Y zaG9G9er=JwLOOkFIW4EAwW&{>CNjiRrpGkmryqU|?J`7hezppqwn2Mpj?V$2n-+u6 zVmR6f&Ui!enj4K$o|VQW|6ems;;G_}_tJP8ONPp!m%71AkGDgXj77SDYTbO_I&Een z%9?ED^np@}swwtX2Oy$1^hg%S8d*(!#v%b$E}SI~5}^bKbS=V^=bW?9n0|Q~tR&a1 z_X{7>IrFlAD{*#{rPrmq3+p01s8i~&Po^3V8M?Elh4}WE$H*hL%b%IEVMf0*vsDx# zt)JTxoSM96h9mqBGO|+S3bkJ>gjXY!uk_G2>TFwkmIIl*fh-+DxJWBFr=U>PtW8~6 zKuW!Td+qBY))a<$Fk`Jsa_XpZXn7o*Ty?*BG%q}li#?x1)m;81fps(6j}eYOHHd3B zg+Bf<ZVR{$qwpifd4Of!CFMzcyXL;4z6Dv<6RfT%Q`<-oWTbT6bXVG!X*T?27g3Y$ zP=Ok)Mktg`r<DeeGq+WN{drdKeafbH)(x}VcKj8V(d1tSoEkp0QJI=st7Wbbc1-fA zRJp{<m0z(kY=(G$b&JV21FmEfE8>DKU-6oCoav^Qq5Qd)dU9rl7fV@FX%kFJd}t%T zBB$vLd{&KMVv0TAStAjJw)y#v*HvbsH}^R@x>_~2wlF6@%;-zve5_drk!GIjwh*j4 z;=hip*C2DRi)mx{Gqs-JaV!A4xpxgIA8qEe<=2x~G4bsJQb|zL3vxHoJC1WF`qEJ8 zHYv<!-8FpD@_4HlDe$(eGR}8`@imiui@E1&HDfrU(6YMW-t?|Q51-C+2IOs?;q=Hg zo;k#HrA$eXa~1cBPuK<f!6KJ~#YGV%Gj}UjeEYivh0@-TZnCCHpoIAYPwwS&QqmbI z`*pOH0tfcgoJWumrsW(?v?KF=71}A}K<8!=r$`vzG5`LLt2r~fxNpI@J1%=I^<DUT zcYRY0Nnq`lYj5NC_HnBx`Ka<IXciQHZTG`L)Y9seHlyi=rmb|SSe#8q&8x|GHg<;6 zfqY?s&s#Fb+v@OfJ8q^4&cd|=6&4NrH|oOjsvwP<oCp=JcgRMiR_3mH(!V^*=>QAM zsrxs9aGL>W`jiMa8J8&79efL#l1E7M%wK=MT1_L7%F#)7b}o|h8qcenRWTD)Lzihv zaw&j0`rS;R=Mbf1es&d5SiMmRe(88nCRwip;Y$yuc0VaUPCyjv_xEwA;XRw<sO4n! zdt;?;rdKi>CjAaTtu!k+;pd9CK(Tbd7un>SXHF|z80uEEV%5YA4@Jv8n(1*m2y@Uq zBdsYn3Zg4g3$-vrR$zGZH?X~UbRfG0Nh~#km4>x27+C|EOkcqYWEgI>=-y)W5hhTp zR}l@D*1j-!Z+NDpn`4L{v;cTBt()7-c+Z?SJs$=~Nf&p&;dRkRCNe%({$`~8CY)d{ z7$PlL+%vut;%K32b~FVY(2mb@K2KxXW>ipfM|HV>g>Qf1Z|l`Db3RrzEDAVX{NFh` ztY%YR7L3|?mUVki9*IkbBV)+at~ZJDo)NsQfa9s7EcknLCfR(!%V3Cglr)ViClpv| zS~2%{L!*b9)kQT7Qp<V?F>1|Em?_$zdC7tcPcYQ?JG~q*;OJsGA%)mvn@3P8SV{jJ zWO9qRqTz`>6Z1sea4y>b#gaB*>fQtBwuXqhO+T<0r%$=epSJ8hv~*>ubY&@PdF)@q zZBw2QFViVh`h3a1T9%lQ@Gau1@_}07;+zS+(^4jtTrZ)fmo(4h@k)8Tm(@*Pk0QyT z{!QyrPiQXm-<Wm0S800h@swZt+S~hnRm_2vE%8|UYyAw9LRqSx+J><GcRp4xE1ooc z+1yU-ds4AcPB`~C<@unW1~%PwYTKc`+pwQ~+t%ooM-uRn%hf53R0@^qc%QtAO#bfR zq%)vgUd<U$8L$5+qTO|xh`{5mgl*k(VoR;9f0?HuZ6f8yo#ZE*o_6QP$|koi@0{PU zq{C&2z0yqs$h2W9HJFsOs4+^>3T1JcIjrK2+!RSf=qGL>a=5x4P87e7tP2bM=k0y! zgv5W?EEapjlkIf{H(^c@&o3@eCuqVGHijkB%#zIi2x#-qE?FSR0o&P}S|{fjMh1<> z09v37uoYy4aa#f(2Rv?x4X00W<NToaH&;DFp}yok*c1$kr$d>nX>1yLbnO~iG{`h6 z18Bnk)-YmN%obQdPnNac@3-{#cnXVHskKijwGB8?fw6Atiq6id%j^6!q;u}nmAnDz zDb-VJ(&OZ|zfbxWne^R0m8fftZ;iwg(gOMMG_ct(>nB&26i=?HKlg!Cd}Muh&-x?0 z)*u#VB8Lq!C!DWqt}ZTauBkiU$Qe00*wa0DG`oK0o&`Ig1IiMt1+udb)LyZBJXIeS zdv@}}VqCZHOnHGdv(SS23z<K({yHvvLTlBfild@7D5w6=#;&;=4<#sI#umzz(Y#A5 z;U|j;${e>kkvn2Sl}6@8jL$KrDf1d6=Cmrx&>!Yo%keF4oWz!AOcriZhn7YaMS3$$ zNvYY5B9OZ{bl+#tsEjBEmBzU5=FqBO^ST!=m{Y!gs*XP|UHG$u%?8<X7A#y$%Ysrz zFpZn1MPbPPPpKc%{Ark|)a97QItNt-1#bMmsW=Hs9y-cB#X3g{qZFLrpArp_qd3KP zn+nts7-zvT+6h{Lm}7zBwEsSgzeNky#^4kupvR$X99A2AoAxMvM2f>HE=OICVzXFK z7MJxT?J5+9XJ3xK6s^Ev-#>h!WOC_l5~QY+HHk^1GKa`$e<y1elS*TP4`5;|gQsD~ zSGVA6$fQ(;jH(aMfK|-xdbGhE!JLqj>qE2YOty$^6-`S{cPfb_$9R;M%<51-g-IO- z_SlB6rVvvNGMX;D@J9Q1zrpGB+@s_9wfQwI{xJlKE-1t4u@ZIR?`y6^T4FpnPI`69 zHd&rB;fT`afa-xjgU-IYB_-XZ#!?*Pk=wj`D^xJKM{Jg|L6AL-1+rMkaUPLO<xQ5> zS}oFAZ;C^yb$D}f9r;?VBR@CC;Z4QCOy#MvdQ0Q<nKd*^^k;<T6nD^uGdm_^dmKe( zoNbUhL>>K{9t{S;RNfS6t;H&>^(L$2Zc#dlmCR`_2c_fPV&(>6Iy=}WM!<BXa#^Wf z%YGS(Wtw;!eGWpat<=m-GA<Tm7qVf=^pe)nCgUF`{6g6P$!Mn-<(5sA3!9hMtMs-k zi`nWi=xiRd&FYphU=6coH>M}mm!;|o{VjeHHGPcJ<F*2tun#r&gDhinaEV8BHWyUK z3^eH-@&!<kJyS^~lc>t@Bm2>(!`{NKo%EgcrxL2DBr>&XCfh+d8efF%dScvPe*Um6 zg4wgwZOM|#HNF&SmC-1z@+E2H9+6qf0zp=PZH<3Yh~AO!xYz`}4%C76{JI8cs_$^f zR5v$a$H`DO$YPJxS``|rQ}>Q7YRHKfi{j%&Vrf3eUBv-eoK;*~L(oEns7VYG_JkP0 zxAArh3$*fUk=@x}#^<=CVaNX{0o<PdqQIZe{G5luKERwlc;ljm9*wDab@%7MQ*7>E zFk`wq<GZM@|0-P}SH||u!%!mY!e|pe0_$fn!(|C`EqrM`sUXiKl?|K>WwSswO!F!s zNtdC2^P4MKTb<aT>0LD4!%GZPz>9(zN>gOD77N3o-k>jAz*wpd5&Pt=i0i!yTU_dA zm#TI4D!bO)I}*|}*~>20Xi~jCN$}X?-6Q#xv6U~2vO|9DmqozzB@VDSb-kt_WyQv# zRJFId#ZRK>f}9y{3t1iZp;u(=aaBnxH~Laik7(0fP~GCqq;s5@va4?$XgCbA+$<)G zB~AB;<!!R7Dw#)={+PAoUAO3Zg`&pVV7G`d_0_{8@K_Ts(mWO7Tx2!4Sr0DxT~pTx zWhMQ+i%-cAE_#Qd6u#948^)>Lv1zYiyqxHAeBcs!sS!hyucF1;=jKFA#TTo~Y%Y#1 z`agtdfOG9CQMQIAGof=Z-&Dy`O}QCd4C8pPF&x?uC&+*y3g^<}J`C8f--V=*^Uu0) zz$1>qlwrA0{OfVdKXFQ>Jxixx#4h1AM&ch1nPXI%cvYc|gMztTIqo01O;xUGKxKJD zOD{QW`6M4rh*$w{I~E?=F*saO_6fG@RA{WGB2*T6s>P{$r?R_#HWOqEDxG{D?7CZ! zxEs2C$?|YQ>~G6!SJwLC!eidf+PU;2^<OCc#?qy$tTAYwv$d+DYBxaM-Co`9_i@qK ztFzkNLmK_u^z7{c-QZY)BgKq$=a(E{h$F)k^V$a52j(fzQ55Eq{k`X-#ZiRldAquH zbtSP59FBQ6E4lN)w&j4+s1>z!ck_p>!lSwHM;P$JuK<|@NQi$#A&X%Ei41@{VbWYI z?2h8V<l9hnI8$%ZrKDO_j?yquH~?g*D^pU_GL*Iphc^AQ@Xwa%OIv5x&M5TAr0$U) z#%ukA`jQj^da4f(qpkwsxU;*j3`$f<gdmW!lnb)BZGX;W2l=F8kyI)Y8|JJQTxIf| zOrtbRZRE5=!{iUA8gVUk1F;0;U!kPHQ4{?QH&|RGihQBmvRdhM>U2(rGL2=6tLJ<P zew0W)fUNgY=?69k);#^t?mg2FG*6kff6tzlLzDEG_Jzxq+qzr}o40J4@?7xNFlZFU z3_`Ky^X6OWqn$YynnO`!O#WmBg~njF$4D_zy1!mCxZ{OWyR(h5FUv1*pZTj9@`~Dm z+_dD$O3krL3I*pN6_(Th^nEd3*bhJI!3oTEwJOz-W;L9e|F=+Tt@_kNW0Hn%#nn99 z@W}GTTS-%t)aSdBlCm^^>vA-?EtQIXD2v@liY&lje8MAy*s!9gQzj;r$}}~yog>~i z`H2dcq82#w)O>3b+$t+DWjHiCn@7(vl1`VhLuu6U3`Qn{N@cLVuF6;Y5~W2NwY<1O zuGPS%&)z$DVA+{Dd@ogbnR9FQmskUqUQo8EM}$$8nDnXnviL%kMpja!(Cai#mtN;| zYcx)`PVaQ3ZGuKy_w&cO88j+m0md1IF3Oc;{RwbjlR8TBRQlXLO_E2R-BM6l*;<e- zPtFqe>2g(h9VJcOCZ{$j*{L>}9O~pGht`<BeOAZz?H#jpqcFags=CCzIeRqLfZI=z zI-Jb;vP?~eTd!kCqeeQtB<<K3Lq=s)RYrxu=&TSTXQd%NYrx5|a=Ezg&H+w6i5N%H z#0k^;!#H-)GA5h^Sf!*mB8lxnlaPo-lbhOpYs0Jbf(3*g0b;Q>lA5efO`wpJ)XIh} z=BvOsJjTgHka{`RI6U<=4S3EJlZkO;Ci5>Kwv{TFm%M9O8+fi#3`ruo^C#9YD0imH zf&(e!g#NH_B)om<mQMyjIED5f4fzcn_6<o(Agg=!P2HP#YK)Efh2H`{mH<8hSt}TV zFW*oxxU+F_KP7(~wluTEvUHtN?KG+{jj?4^6jtOnWe|sK&r(|N<Zu#GoYs&R{q!V* zL6Ks!C?$-ancyFE`ZE^zEM-byBw>AT%0VJAj`$oPz$cE|WZp<RHpb{mO=Rp>Ak;v- zBT21xS1}$?BNY1?iLO+`JLU}%=?n;-A(3t{j`OG#fX3rR0+a|%{}|#xehI7vN3#F# zp(~6=znhh|%!<MaZ<Fd8{W%Cer_=w>1piD4S*zM1pMd1O9qWd}Q-;C%F}QnJ>^&Ur zS1$V%KXt<IL#s|5Kf$Xz7K7C%<F5jw2pzh9suAJtqF->UV_WMj$*Zs~^dBBg^!g$E zgFi8LJ~n3B*sy(Q?0%PrjZMJL9~-fTh{q8zYsOCF{XR?}OX*pka_>^vyW{z0f}DHq zW=m{MIW@su?luTO2mL<7WWwVP;9g;|uNp>)&&bh`-BOOs{+&8B97ek8D_x^!VF@HY z#etc0F%CQ)pJR}4&fS_GJGGdaSbsIQyFv=~h#Y*8P0Z)p9b&1_$rITnBB9M8Ahr5; zr76Z&jlo#aC~H{t7{vtJuKn{`C53lW>%8-A2AbF4!mKE?6=Up?kGHM6NFY7usq{%u zpec4)A}x+cQ*$5X(ui@i;@Bl#5~&2gpqKF60l9>*V8s*Hc!}ui!0g$qi(6yoe_F?T z)NA+Ir>wZ4e0e{A%JQ4}&=Ei$!gh0ZSN@Cp_8Tj@pjg(4fxB?`s@x-8*_>D+xm{Z; zxs_PjL#|lKEM%T3DFM$g3RhMD5tW;JMU8#i&R!~Eou(JftswU##MrwN@o`ur6^*ci zdyxMkk?&6S1hYntbJU?lC{zGS%;7x%n?HVR1|RY`VpJd!B|<Bx!#yr!VE99@GqMwW z5Eg(sC%sTA8eu`%zyE_o{e$WWW{-%ZLPgIoT7woaHWwXkofMAF{g8{sAfFZp4C^i= zCZ~eciI&(g<G{ivXfet&^nDaCj*lWmy$(eq5U9|Lp(q3b9V!MNEnLb9`?Td?UdOqz z;giFwP9mIN`wQHI)2T2z?9?y6FB)-H<ilC(OL81@;0XKdr}NHr)+pPRZ8a58W7hQw zg|?-MHJ#_?eYVa1GHR6Olt63NBOuAR5;-p_a$b;lr%;e=HKQcxjFoP+pj@pKl(;pk zve6P0nu>Odbumj2lGB#j9^yE6p)(`1Fg>ofA3l3|_QAzkEX9GQCgN9NS8c1oTiG0( zrDeM`elBkH>f7lAHftRIaoOs=&Q-WAonp0{gST|A9_X6f)7g2uql?W>Cp=b<?0xOw zj}vh1A`#ayj?WjQ3)C*2xxV;jG!>Pp3@oRPdulnj5)aJ-^lpbLfitK>6-Exxm&l}9 z-gsq@3q?hvBq-OJe45~!_I?fC9xF@FG9>YvUKB<7B6D2^XG2MDNVk%A2CS^BBXWur z8IBAMN9uz`k%rR<&Cab+&7B=((g~D!RPlG=5p6WXke`jo=?<+vBy<Hwup+eoJcM?K z=X$dZOjY#rv{wZ`0`jS5Gg^v9NznRlCR7*_6^1gkcq=QbB*j47bHaxW&k)9F)~p#b zR-?!$BpJ2(8+h*GxxJ@wpe$}zAB9My^yTddrkzBbj*P*DT)^J5LhvyW501m9Rw6W| zi)*+JD7)s|)a=;0X5X|yIb<?${0NyuA|E*jC_x8%jsqh5kD<ALB`3A%e*ClgW9!x( zJAUkjzuvL^;$9<8{Mf$Zw0@izZF)fI2e~{hHS!<_W2^qYt~9Fbg@e+4=ea?w0CA$w zBb3d?fQyE2DTtXZ+j8<7iS!NnW4HMvvQVU>#-0Ef$o357Od?ad4+CT(aJc8#LJuO6 zJG&{Plls>$W!-K3;H;*dVbPlZdj1LNNw`7B&6udU77?BCwC^gsE&hh&#~Lzlpu3KI zCjeXr7&$YeF4dpju{AFCFy}iiMn`YiHT$kT#G3uO1i;B~RkA$I;?TXV=}(}QBeY?P zRI^AxUzQwn7$@UEx|dZocenRGq~klgf0}8}t}7|YuC?28Y6G8BXI1dytrr(>;R~b| zG)b+YdF}AJl48SVhhj`rL7LUF2>3Q?qhEg8gMrrL73F7U6{PkzHuk3Z8h4EMZt#2f ztuCEhbUgcrmCLncdR?Z(dY>xQOSF{R$ka^cKk_I|vfR*8mhYUm#8Twnl%Kb~VUlM{ ze~#bO#99*fr=57KOVAO+(@L3nDYYeBof!1Ulk?{jVHHh2yVm4037?*%rZe?<E}JgP ztd=IZZKA=0bR(=@4A2vT^wfzvvI{7b7&LC1%CyigrYzw&SW!dIc0T4&nO~LmQl;(a zF9$wLbfU!cl+1|3WZ?JYY_Tv)As1$4i&Jj0Sz>?;0CBBx0RPj`I<;^VGpM*`jbtX9 zWC@HCX0_NxPqxWuWbLK}8}PCOTRuCvLMwz*hdF1=Q4E<;p1>$(R!i*kBwHe#q&YZ$ zBVLwh^RiE&XqSG<<J{YEua`r+nB?5MJMZ?2R=_MB3BH1a85RpG_4yR+=nOU3M+-<~ z=4k2#nQlS7R?A8=U0@nbg9~<1H`Hy#UVl?zp})>c(L@bCCAAY;kufTh&2)X8Gga7c zZTLFk)AiaYce=NUQv^_bAlRWbs$>&#BR-VRq2x9uU}BnC)pM2j)Nbk%U#7v3=_|h& zO`%kVlTqlWRr9~i`&RWCjU<OxQpgla;KXa);bFZKuLe*gG=|<!A(1E`Kq3KtJ;QdW zpQC0l)ND3GE$TUJRlvB^<;+Ns6~P1}SYV{QW<6ejx<XqM6}dVJc?FFocf8cjJ{Z2E zii{9NrxND$M0vYR$J#gS{*>h192LC<D^<jXE6JncKpAa*`L1cJ3EnNib2HPEC*%v> zApTuL5GU{@c_N`uBxZ_C5~pa*y47p<wPg&n2JL~8ISYn@{EDRQ+=A8XpdGr__XE?j z78cp`f%mP>6=*UU9YYms)gJ>pLoAR`B*2rKNyKI{sgwA!Bmdtx_%FN`0T1g&e#FFF z$rIbv&8CZ$gS*;2xi*dv8~2VFOCT}>Phg5ZK4b-a$fDriVPYAu`-|Q;7E=&b$<Ce- z`Usi+e`Rn7MJV74`Fz1$fzyL;PM{>9bjtQ@|LI*>ZEJ6?hq|V1>u)Yte`a@`_Lm=p z=KmNOKDX90g+nGMxu>i>H@w~3fc`HjSBEn3t{`^5z-?4<84MM7Bksj+#1$UOl&fQX zJZUE+LUe>8evMsvhev=On;nS<(zQwgZqP68Ics(Ij%L!fJ<@*M^rcnJ3qjo^=4T41 zU(iuCsk?RtjL!fxkO2u0pc4{M12K4_M|ij&>tQ}r$bcC0*dCB$K|z|KvqJ*39`45q zW--|zkm})ntYC?ppVcQy4llQohx@S}mW>W*OGrZ!I=@^^9`45qmSoXj1B_{OPGx}| zDVEF1&W7Z#iD8nrho?WfNe7EgrZg{O$=gGu^D9Na4>O&K%xz40Sy`OrOC|F5@YF>O zXja5Q0=zxM)RY4QD+oYl3f43NPw68FGR~KFcmb;zZcceqOT(TCu<Ax*9E5ADfp!S3 z(ORw3dTr1~ZPMm<-r{yH(6;N-(BZWIwzb6rZFqeJ%(dfYkmEiJow*F@1Hfi67I?od zE6t;lJ=SA;q9^vu@H4L1vwGH^U+j6O3Ssznqxw^S>2Lj`fAwGZ|KBqoy>Z)X{rux( zlD+T#?;!O42BFm+0J8Fb|55M$yrXXz+M=P?wVHJIZ`Mg~<)+rtmw>P@JH>#}oo`q} zFSV*C{ka%)-t(ELH*}-ZP+?v_+ps09Z@&BPr=3wtK^I@1r{Y@gzROLqhO<kgp?iZ~ zD;-j{mYzi9lAVCPU3|dS{lCa9b?Z|e`<{qaHri{L7<>MJt^41*g@a}Nr7`HWK6xO7 z{lA$qY7)5^+E~Z#p;~J$eD3u}$7uLYgXId}!)n|N#bXa2g{`xCBQ#sxy1skB@w=t0 zmHqH8@XG4y$+<6Hk;rU*Yg=}lU!u#dhbrTqxgH3FaH%4IAbrR;F_oz(bK$NaKo00d zrUMbi3mwkZ?bcY?FW<slXE104++A9KU4tRnzDj?>TwhN%6FqruI*whV)MZKM#liB2 z&CZbw_2gTdTy2@ZBZkYTum{0s<z43j=Ko!0@4JqoRyUL=sFIxBT|G4+8@AcOR%W6) z%mg45gqv818L*=EiHK1p+<`-9I5_x|QavB}HXIznu0b9aECk%zyHCg|MzLFgG^CYz zF8bo*{kKp30E1}eD;jjPTKx%XKUp9GFYL_a^$+F|j?XhP_Y1?AU-XqXgl1FZnO1_+ znK$+=P=lIno{RjBOCin>q$^gKx&5fz@k|le*}G2&3!9om@<1R3NgXd+iD4m!Ic9hv zcoI!>nbV0*qa>Q0d!#Ob88wu{<v?-`0WgR#pk_~Y$#6!nJ9Gni$jQFua3tj$SHVQn zfUhV5cRRKoi&jAxs)~A<XMr??3SH=4WG_kppHnLksR?&R!~<ieYiZ=1T*h7Uc>921 zXN4|NNL_P5;ss|(oy^LZ+5T?_#ruvv#7>e!^HStnc@lCEXXeFr?lzC{I2b@6^$JaO z7nk-P2R)AdwZ~;S;ZDwQf*fC&HKHCx%_(-%U=^y$ZjLR<wny;n)|L5iEu{w}rJC3< znE>P@$!Ipwi1X%@JSg|5<{X&RUCg@3pa`hg)MXC20|m%q?g=A$qV6i27ZY?t8hdCw zi*nYK`s%78EL2GDG!fz004aihpx6X@YO0q9u)@LXLV;~uE;W@M@}a*vGA~4a!>vE= zBpczq$Lh(P^2<C2c0dCqC}I1o&{8!qu`Z$2q#D^+gEb~=wVBenjDE6^v}5a$6@~;P z7(+<2H9t8Mtsny#wl=h>+=(d@-wi8TMSa~00Tj6eoa3i4FoMNSjTg#3hIWBXh2LRS zq-I`BVE291lMy%fj}#kQ!Uun}g+SNBY?K5E?39N1lugZQAQSb33g$M}YfE`rSftS{ zqQ2c$6VM;qZMQ9RlVG<iG@xPZe4F-5MEZzSXuf&%`P-+yH^jkqH8!uwtS>m98tavb z7kV7c?Gy0{w#JtS#h=*953|SXE5PaT<JIhHx_|X>{cyS)`?fCZ?gqDEJAT46#^u2o z71@a3F4uJ5Lg^O^blqUuv}Gj2Z<&X@^)k}5US2U0DufWqt)4JDWttWnnfrp3le53% zEr(>Bn-zftzX!oZ+eo1&>R)edySP|h4D_J4%QgbcLgpUYt*#g)XnA}s3@!a=!D?}# z2apEJq?S(fZnrlTc$5d)+BobB*z5jTkn%v6Ka?;-5zBw2MrQe}iFRac4_ZzgiLjjq zV{Y4YLV|b*-$T0t3>Mw4-?<{y8LFZQO~Zyp7D3P!O}jg4pGeuy$yQ~9zKPUil2RHk z?GrT-@9rZ*%XR&>zh_~mjn!F&CruJ-G|Q+$X?I!b=&x|w8iF0uqin5TlWx-P`2tm? zyKMP#f=^?oJ#TV%P908JDK;@agWz;wqnb{0dj%SDuw<}Ebh)1u#}ZN_qcaCo5oTNC zJ3U>q=~;pdz9y0bF5T@@-c0GFZeKf_Dv{vg00ucR`iMosmdAXA&%MWV`hjhwF%t&M z${ljODjCgY92)y(UkMsK`bf)8yI&7$cGL36ycktueKfH09hy(i!Edq7SqXie76tBQ zs~ME(f8aKCZcg?Tl^hALaL8XDbe-A{eC3<*W*h)pXPcYt&2llU$93(r>ioTJXnV8~ z3o+d}M#`W=N*$YSktuCpEID&$HdyhkMmuwM2BygaY9hxu)2K!<U-DCpGg-q6A*<vr zxo|!Y9*&*jFdk`Ir&cC%Y7jwmbFd4^%{$x=yn^b{8=5N5&apk%>pi%9gaRhJj3{68 zj7VDDs9ItIt+!z1AL1@J%h&vbP_~&-!l7_4MJi)0XzBIk1z<!3pie7b3ibqyeE8SI z$9(+pH$yt#mJbar7*ZKTMhql8U719~Ctq?247cp`bb&y|#IlH9Ivc1!<<@GB*eIA@ zhXgjoF~VbTJH0=SQ-~sCoRteQU*EP~Sr8&X5Owqw_t-<5uxaW1>7I$5o7EpZ>%%W- z?URMtniaA`81s5VyX=;gi{?Fo`C%wSbKc@s-R=XGz+zyN35hq5<-!ly{jdsXwdLr> zR>U;ms`MJ?4my(L1j8FYRDH<rd!zrIL^&^KA9Oh6LXdgHE3!i!MO6GpqiJ4B43@q$ z5bnt(hh?P0?uvcwLpExN;+5`<P9%0j97Yvwq*7QdUn(20p}n{$j>TVoh_F<^x%O#E z))WeWLUuF2KN@D!)uWnNb}Q9=-yg_HOKs;YKg0bK)}>Vocw=y9wyasjgA9a}BMs6m zHlj#<3xE77wGhzh+_GAlgb~x$EUyAqn|%tjgqxI)nPQ|nqglab^<!9;F6E5Aomb|% zF-`2`T*?d;;@Hwo4n~&+3h4qz-IOxJDRH($7oRzSX*@)Vpp2IpRs+;Ud#(i-a^e`u zL00N=1H#^U+f!GtId(wzZuNO4?rsL+ZG(4$?YRe=Do(N8Fov<#W-(G3HZECHDgjEx z?VE%!nhrf1wcJ-StDFvZ$n;pvgFk73tdW1BFv?*VrR`+)eWMVZ16sz>WD+vS`7(gp zQX&Z^J_uP_83MT)M0YThgrv~MJh3U<Fq+JvEAXRv&Jt#Hke!~^Hkrlh<mnnZvm1_i z4gJTLK5ji9O`ffOH|&h5WeCQZ#(x&~@V6bHOLg@w(tQH0ax+RYU&C~i0@82j7I6jO z%K@3^Bi{$W+U>1cqP^bEbsyMw(CEL`lodgkDDhCckKrMD5RcB?i`<k1azgy!QxW-m z_ljnFzO2^(-M(7Yt3)CjA%y<XI`mrkNA!4|yM9zBqETsuA}_kts;7hr&}li(Bi!TB zLJYxDR#Q&_ecxTl71mB)u@pggBjHYS)HY?R?`RRG{AMSU+jXp$c7rUy*Yx~3_lXq0 z{_fS~#p%grwHW)hu{<|{FEmwNu?d^WgKsVI1Kwl%!Y2V$NdO3c(|2iE%o$EHp<QI^ z6tpS3Qx9hWC_<G5GZW?21i09sKjf+6*lUR~jMlKS<55t93M4%;B${t0F<_roSJp@t zO6IjnlRRCr1`R1P^STV6iQ2@hmYW#{!qE!GmP5PJpOHJnde?d!P3Rqat$scgBxq%O zeg-m`6|}Mfdeqzp`L-_2G3UJp*xtJzd?N?x)!W9wTZ_BADKQzV2#)i(%i%+#mGHPT z?f+iVh>7nC1}=|00RiR-8TNiEX>7!CkI-t$oX)Tg>-;YL9NpJ^ry2>*`e3lnGd3T^ z1~nt{RYVoXEWa<)d)!ZwG&}NTPzZ>wiAr*OsXsNZGD7Wjg8$Oww^A%uzj?ZI`Sfu4 z(au@AS&Fupm{%h2zEj#4#(7G_A8uZ?51;x}5{UQ&1|f44GGkB6U|tYe4L|UWSDq5a z>#8JJIu7B`*UY#I=#6f9%xb8f9O48r!C22Q818%=++JUv?l!9<s8XtxaFnJGp3;}z ztbIjRgmb2|vK?iGgQW4${&0z&^RAGd8Smgatl8<)BvtW2#jXKLd5Nq;UXJENrwFqK z9vB`lgrS@FBhcmGClL#(35GI<@t}w@>sUTow;xU!44b9>R$$w~A*iTKe86n=sJO>z z&UuT@ryu#LiAA1HG~8gPJ!uk!4y~&UL03cGl_k511aQ7>(*vg`60!ZXlj<BF7z^IU zYX}|tQ~KM{2yOU)syrKJ?$xr82UId$88^wK?Y!;?!6Iz~V?V>GN$JSxhU-)FH7p4p z5N!4L_qg+P5hs2$InR>`_>xfSrAQ{B^dc^b!1x9UiEhsEMbbSFXK;|`ombSMuBCta z18PNWhH8WoFtKu+NZP8*&0m{fq0bPz`>oyG$sHnM=~cP~yemVouX<=oE7vHTOtsW+ zs8T(Kz8~Hx(*mvGg;UDw=t+I7Z6GYXk^c7V<;qv5CxGkA7vH@6=63gVx11A3ET-Nt zvT#hFdwut|RC{Zu%TvJ-gk%FrSDKTKRIS75Ej&xxTk|npVC(VnaXg=&*Y3804s_TZ zMxa9wU*S$PZVmy{%Ta;tcGgt===$g^dr1FtM_o&xl6TbU3L9D2gFU(F@(Vx;agPY7 ziri2=UF91!4X~4;4aE8hGu-QSr2xzxZmzcL@sr*~wJZiXObvYS9Rs0l|H1!0Bi%Tw zQC=$7AAMC!i|$e;@yzBt=uWqdYyLfb{PNk;^k%ynU-VA8GrZ&GU*@@pdln16^Wp`b zP>!!WtaIQyDzmO^i&!R?4=7T8v|8kYjoVebz>bITIqRr3(KaAQj!u`lh%EKd(Y%h_ zP(s^D2V9Qfi-g0bVHi35K)ncH$Cp7yN7*jXkp%af*#yj2KN3Cp-e|$Vxo~mhRQa4$ zS<3C!H_hD-w42?{lJPBQp9v=z1#k!k;+#sZM1dZt;4NF}DE!RjSu&T|1RA6m8`@Cd zeu~*aC(IwdR0M$^#5cQRBHJx54?b_eXqV-{)#|c=DwPaqxtX2#pcWi!Lc-OHJTSM+ z18x@(w#15VdMU|$gvMp;^{q2Qosr!l721Mv@7`SgzBcL4;M<%iURF(#A4l+6>||Wm z1%2lBhtz-geK`vq^`UxQ03P^bf&jwDzjuOt|Ku<2Ux*gI1mK;m8*V(4efK}+yqf;L z3H2uiAjJRxL2<Q|WUqxxKOb5D4yJkfmALNk-dT6t0QQ-o4oL6yJz{v7FPVV>{Ke}= z@;MhmuXTXydwKnSb$ECmhG8(SKBaiJtl`)*MW?D6?o6{-EAH)nQI*r*c3Vx@=mN!5 zF0i_Yl}Xt{QD~=MFJ}qVGx8px49fC?h~6@Q@KHq8#X_hOs+TGArA)-idRrxSkK7xy z<lAoS)UV75E{{ePkrdBXn24US5Hqsyl_FB2EFX!iQt{EZ^|y%><Le2~3=>@;5m<px z_fq+7dgDtBc~x0O5^4&e^2D#483T`G&{mdsf+=pU0Fh7$S&#<NQ*oKb4^Rn#5CFaq z1wo((@fD>rhmE^d;Y?S*6Dr3X8VK;Iw3pf`>~jRe##Q|kit5}WRu<n7?kx&L{ZHxo z;-GlxV@fJhN;xh&`t|gl48;!8xzt6AWZ{q~gt!C=LASZGy@!4n(8ZH2ggra28N5ZY z7sAQ<W^_3RLYoQYWcGdgI4EfhNw0k}$}GG9`XLZO&$U=46~S9)Wp#`KEp*6bP64|B z>lFA+o#z^LGOLI;_g<q)57p?PSF|2*`irZ$*SB+?>pWrA!2l4@dUa&FNHG4IYz0hR zJA-2Yxjq7#6aWr_kP}-6bH?7;To7X<=RAF%OEg58OL@k-vA-_<n#*Fm873OkZ@^@t z7*V3d5!LB>zppTb*`UcRL{%oT7}BddDrB1?ss>n0G>ItKt$MQYCP@(~QoqA$pu}Aw zbb~09CM>Sd&zLU0kA>M}lSDG7><r0Zsz$GV6pT9KbgT#o8Be9EP|42Emx@Kg<HClK z#A1WqQ=ta)=@e5a@l+N2be>*eNpdh}iu$RdMMz>0BjTqaywIapU3N%L{Jdhr;w0Ud zg&KcesEB+DMiCAso*t=EfikQMIji|w{}$4EfWN20@K~2Kx}CLNfIvNhd?i?~C!Y3< z5PG4)JnK2nd!d}=4?S9+7%zHBzgKK<&UvxE6IbZ+*Wy*L8SuJfDN?2RMta5|&!AyO zL(EL}%U8gn(ASELKYzz3C@v)FywSO))50-Dc_bw=e_+$qm|>RLW;$Sw3u=AeEhn{N zbn;yDEilixVwykHZ{5@yDamlh-N;FSJ@#@b+Q|xD{$JUHXW(Q*wq!^4<Uo#vhbf}S zqKYmiY`E|diY+c;q{snA{OW^`!a4Bb?G)}1orCUM#*UP;%uv{{)uuy+ERLbN=#m@{ zJapL=S6y?$Nn>u4P!i%FJw{B6jglqU5?jM!?*~6RNaV}MCY=t;j-H$!h2@r7Wu?^? zg%el1FB2X=LBd3dlO!#^gc7ZlYmGO(=Phr0KS{|`lvHvlrIwa5@2!HW3hIlSio;C4 z!ikN=`Q!Li{=zD&SsPN$zuin{`q+sz<wCI}5xo}ISNm#;3aT3T1&%Xe<u$u1Rv=7` ztU#2jGURu8;`br%h52iW_cM)?WCic=79Giuws2WITi#^e(NI2_w)~6DXg9vtEL&6F zEK7vnr;MQc2nq(eprD+B0zsz?biqJDK{-7;#)WD*GsK$YCb2M48r?xJx3FbqbTOt; zWme9rwB!hDWrcE7)qxskP>b@ZI4%~&H=c=yc81J>wh4?~7Fo3>=;})(LfN^AA^)vR z+#XaHgj_h3TLxFmK7uNwvAn8i9+QrX6GJ`m--7W_V|E~Q<*;gWi08u+bd`%r7>+$h z5>L8J2K}*=Uj=gVsjjo0I*@*ujJ}!d9=-)Ms|(2Nk!-_5e2tY}bE~#h+S%^NcgVIw z*0DDmo0HpzZPm8k-FK+}{_@aDpR()Z`=~AI38XiR<qg9<UZFmUPD4|FI=I68<*7&t ztvlARWH2K-H6nCIHNUOrNL$UhS7(Rg`kP+qwKnUU6WY6N#WvaH8}xrc!)K`Lnt3Wq H?T~5}mj8_i literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..243810e4594c4c858d043e9dd3562bfd3b1adeff GIT binary patch literal 19088 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 Tc<SUY`Kt13Q$5xzdK&-${v60d literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d859e4d3ceba36192ab6b0ac4e6e2e8ed21795d4 GIT binary patch literal 18380 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 literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0f95acbcdd781cc2ffa1cb7ded7fe637b59a61d0 GIT binary patch literal 18416 zcmV)TK(W7fPew8T0RR9107viu5dZ)H0JanW07r}f0RR9100000000000000000000 z0000Qf_NL7A{=rCU;v0J2!SLCpDhsx3W4W9fysXhhEM<jHUcCAj1mMO1%rMEpa=|s zRvXo#cf@U<pczo=4M=<IOPl+ng6&Ss?a1UUMM@(B!NviEDXz)>|NsB9lZuR)bdYx2 z1_)e#5w1d(M-IzN^`MqpFMX=0m@8UV(}D@NrIgHN^-ZMRJB00ry1j5V?)3OYWLiBG zL2Dqmz~K;utmzL=I&!xDrqR`mrzm0xYmHaXL2+7bsn*jIs=XWK+W!BYcL?HOu~?#x zK-e+Ni?)*;-gKvqYKaRA#nNymEi-z^zFozTE5R*UdpO>PP*w=4t;?1$)9;ndENmyW zoH0{*XPOg5YhuMT(uv<J{umlo18vhAGj7?snp?BG^_6*KHxDIjyVC>WmMPcM9s6sP zrEw|n<@-r#>0b?3=%c#iH!^zCW?!~Sx+mQ2TYtc58u4L2Oi3d-1KURaBquLLG=|Q8 z0A<ozAR`ftLdCvSlBBBz5~@Pw254^GZNN5C)@%dD2HRkj#3IR%$dXdQ$QKYR2%}ID zC2Z7x0~@1JEEEIqQ4r-wr{B-4fL0c=C7CE>2q^G?sk<w>&r}u32da+e>Gx~rzQ41f zEK-Riu}Ttennbh&FHt-}rx7xZ#?@TzP1F|^_)1a$G@dx&3({VJ*@_BP<4P4>VD;RG z0~!(uFYJI(*8S)o+1MMk5^`Y}Owp1I&hc+kXY3M8zl^|R0YQlsAk_|C-uIiT)V0uB z=PGA#`XQvhV~w*@Ki(1;R>Yj3CP?-Dd~Ny-$?DMFT#_$p*L?$%l3KpWeUJ3GtXKqy zRS>Jk<hx9Q^(}j?s_ved-Myfc@_vQ93WwxF-{*8%A!n@2Y-1A^BJwjd;0DM99U>d- z&Vq*T>t=lPK-zzEO=63bNkDl=6yTq2A|#gg@B#btzBstlH?_D_Z(vB^%cVzvF!SHB zb={akS0bEmN4I54E4&2oncLvJ-e1E2T!tvtc6-zp7bG%-NI#6U80i22frtEq>?jr9 zzKz00W20$8i5F73@EEoY$966v!U}l)we|a0QHce4;o*B`P=B)mzI-e}6K42Dy+z3h zQq?zu7XUl_yEZ=K%6G$9#n3%L1Wono+vc$SOj+AVuF0-!IxIrtk?=r&s^;AfMJyNq zO=zr+sU<4N+5#0WVa>c(re^8Pf=4ZQCyDZWD&f8Ll^;*W`S5K#=-I{Y&MpXWL4e@m z3<-d4kEa8`Gd!Hz<$@;wq*RpW$v7W^MlT9-D4dKnk+QcobkT=OGG!mdpM<X@$shi| z_A>S5(5q}kAsoUY(HOJPACIEivQ)XCn6D^R)$t|9M8{>2k%=&w=qMjy9YzGIw$<M~ z5`@?!`6NR#G)KSx{Zjj8cW!vf;E4S~$!=VYje2>oJmFU&aC@q9qJE-MS=YKshX1GK zJ3F)YzZ6O-3S;NUxF@6hFLh`(!cr7|i`f?iZe=_Uqi|S!e=X}zSXAud@GM=V8bkDO z8;IuH>ziFj+S}=+Tq10RYqnw$LO8ea$4}0`y|b1ySv6Wu1H`b0#;-U3e!rhqa6z|z z@0DuB1cWX#fF|!g@9znLumnI`AY6gqK&DKA%$WmOK>=Z4fN*Sph)6(o7(gz#KmsBl z2@fCz1(1pgNJ9gp;|CNV04PW#P_$H_bXh<-ihxSg0M)4jT4X8Ea!o+%Z3NnEJJ3$M zf!gc=+UGD(r%s?_jsbN!1=On-sNWf&bN&Om?mEz*yFd>-272lx(6C{kH%5To`2aNP zJJ5s)pdY4zewzjQ8#sU|BBcPPoKyf)6&aZ77{JuT2c{u0FfF+O)0q;OzO=v$<pl(S z02~4w0s#Wp=RyWLczbdhdNn!OgWiL)187D7W)47rcAuUcfCB^&BM@*9rd2nPj1j<T z+4j4av3UK{*z#HXp9xpO)f^Qg{Efj5Pd)S83oi{D@yYi{ljWLQ9?4UrOqDuKT2@rP zG}xBx>>V7_yPG{cy}W&V{rt0~mu*_CUV|l;rt4ePVuOuYTtkLE@X#ZVJ@w3UFTC{1 zuo3UPH|mqm#(eSBH{Ww-00000000000x%>=k|arzBuNSZ000000000Gux;D6ZQHhO zJ4})!Ns=T<lH@m`cmV-LrxGf)j&9T&A&T}Ua;zZRH?4KPsc~+PZ8}_xUvv-B#8>P6 z8n5QZQy*FU_N!@^2O^e#vblCLU;grYJ(!xu=`2a-(JbSe81Qfwe@z3{_Q6GdYixEt zE8~cEx!fjnq46eBvJ|?+-l}-TKMrzIO?kobiTE%E2TfTVsq~=CKJTQiZ|!j`Zbm&_ zWM&M;2KQ^~OTBIT>nr2med8wmQpeCR2B#)+!prLJE4sgL3kP3GzHJM~Zpqkl2JCb7 z#pD%8UTikZ1*A2=rdsoawrOLbz~89);^}%IIs{B{-yf?g{AOX@oHWSc>W1el<Y~oH zgf2%Ov@XIJ=odu=d!cdT`NKK?x6VxzTFjra&<lPs3gZ!02+_#b6Wd089Z5#NY!RT7 zQcPbk+^`n9=s7hWF1zL5w0N^xI+;o1uEiswJLQ%P_xGmVw>t}KLanbGx^Jvq;U}8{ z>O+EN;zrF~fHmxz^$1N1%fo)ldcX65j>Z;mn;p{-${SKgJG<<-7siTKDIUxEZb$z4 zh5=-KbC=d8nz9wdGO{Z7+|0}DmYm3`K<mdLn5^aohRVhlQ(2|@36gnRUa(CL_(eJ? z1?FZKp+wo6m@jabJV#K7Wb_yaR(JrhWRkB1fvJtl9GRL{Ip(XkxmsgqY>nq!o!#K7 zwfmknLpqR#b#84rNe}%RNV6_&Y8m7a&v>J;BsRI7)!dFY=tj1X89-=y1q_&AA)0Ya z795Vji4=*zl1ME3hA~*6Kq1QBbl(#_Z>a8p67+NsqF@o2=^;=+Kp}Gt3$@cj@;*YC zyn?BfC=#sF#I(2AU=9g5CXSY~cKV!V<P5pxZX%kv3Ws#tE&B`{BaCDlsL9%=u@s+u zVeM<t$T#0v_h0Zl1MWAPjLbTG6hMG553|u$sgDg`f~bb5Vu=i6jK>>;0V+tg0YQLc zc5y&}ICLODfPfYx`GO3=A^SHVK!E~r^UebS>Q<{6IP);W8YD<SKtL=3F_KY;hKh52 z&hHudFga{xV<edUm>Z|e-oJALhN&#RBxcgjx!u`B1wZU6C=1iqntC$X#&pLvdGFQg z-du9{Ui+ev1sbx=$^7*S^$~MqR3_FL#(;IXNPq`&)B=|2_O$ZpfoNkNGp~f;XY3Ae zXgGP24%qCE^%rp4)z$yH*mMRoEkNo$0tGf1)ha)S_f(8^6Hz<_1XIUitE|(k)iK>} z8S=qr-$qn>Whh&PD%Ge8VQ1ULMw7+naCv;8F<AxGORclsCOb{jua5S0phI=m)yeuh zJE8tSz&9eoDh}W6s1q(XzB5{7rkAEJ%KI~LJHsw8$ZWMc-Cn=w_}t1x{?U9OIWW=E zZg1j!_Yuc+>vcw*;jMFWy~cf8ybllRd_(!o=!;%l`sWq&?P2`8`}+z2{tgV=fIlC9 zy8pD9o_hAAfJ!^R#T?}SS*-b@i!C0|QKf(`0Dacq1ps|_x$E8OUPC?XaZh{R%f^~% zb|HtK-57HLu-XBv9ssP4@g|sPG5~fR2DJ~u5mve&orH4AJSX7v!t3MYGCSu`4Pf|> zz4KUZaWRPF4z}Bb9^o6JFwDbCQcuaf;znhJ#(N*=jq>!F!6#nE`1vl_521bvG39>| zW+Y_{(f&#Z3OQLpUe<D(rzD)pNGc*K%SL^U7Du%xipE6N#IrmX>k?WO$3F?QB(pgW zTePLuk*D?y;)B4-*mk6XL2`zUkFSEv_nVRZ?qRy=oz&o9s*|~6(lZ5P2f!Rcagn1- zWS(*NLX0`!ZAOqEQekK-Vp$#6f^0S9#Kb{lu>ru#EFdlrcBNshn~i=%r_ue3<_ZTF zaNQ;Hn7{+Bp7ZvFuWtfO2=hz0X_01SWCod;LrO46&IAfVDGH-1JJs1M4X-?cn#h(! zw={;P#MZ{QF*oaz+K{WQ$?eI@_LR1zursyYX$vg0kYbB0sNj5yDY~%2i*kUwcq2i= z9SmzTovJ%-Oqa<pPxuqE0^2>2&TLCU>*p9<3%PczBu&V7t@Z(WzTY{qenLmszhNe+ zfsp`@!YqnB{0FU@hwyiA0^1w(Uebn?N6(O$|BE8Zhh9H9?}2B)sZK{gIZf7pAkP~O z1nSi{Fp%LVv$%83IxI>`R>@*#wH`f%@Wo1?24R;6*z46uMn;&7qS@~u?8es8rjz{w zq1tGv)g@ElZulHWSIK`vYzpHz435~5EB>`?Cxh_A61IFZ_EhDppTQplZ|se6{cUim zt~?Fgz5Z1i(pjGMEnlKkI`Tk|#f)g&jLl}DAChE4%5SO<l9jY#xy|G=ZWrxFQjBdS zAQ8$QxF3KU$BM6I$6T78p5=eK^u?n8IC&rAkR#|t43FXqh)cEDz(HmL8}lFtTm}R) zL^J1o1aku~4Qk?$n^mYy3P4rOi4I>Y!{u2ImpngqO3C}@>UB0=!<NrNTDrU*gGL{P z<}NtqOd^UgRf7N|PDUU$Mq;vLrUH!Lk|Fg5*vmjj4H87s)E4`Hti0d%T#Y726in0A zUC9`w1v#DBDepB%v3rq58)!pU>CRwdl36J$8GzOyvc?kf4H~c_Fj3W}^^Zg?+e~!= zgJX(XpiKEc)j44fmccvq@sw}SP|3&vA1xgXI(k`PXnauG^D@mM`T@SL>aIctc~d~9 zm4B>!C}oAgB;{==WEbhQCLX>BmHnQ^BdCq8R>(>`3lE>)H9OzCtS`1v!R%hj=9~dm zhT%~ilSHf9J=O<+%PKH&WEHw}*l6W9q0J6Gc|GFYX^w=5C)3BCh{i=n$RiA5sch_b zj}>6nDM;XOMAe7q&B0oY9J~maW-_B?hH7xxB>k;Ao4{DxzGi0HBfC7Xs`k{7-}=Vk z*x;gqGbza95cwQI0mq<_V^PF$DCT&SZ~{s>5oMgTU<ft+gz)*{i=fhiA01_E!>C{r zx9Vrk@g|+B-&-ul8h0HNVD<YBkWDvS;2gJcz$Fg2!U5Mf;0_MBiv#ZAfcrS$0S@sA z<c7DRX=<X%(&<v|>>0z%BwPo~z|@(hFnbP>g|j1Lny+ZDo;{H{&Cx=*jn&q~L9k86 zJXKDYX5mcK(6<Fm*5vp$<f7E`cd&+rIpAl2E{F5ElHmRV0059%dZliwqvtKM3%MZ+ z*(1Pd{1s~0L%aJ%!;&rlik{YiD^w!xQE7t#lpUq#e)-LjO=gzx$ql#z&BmqT(vDM{ zx(49l-J03>M`@<7R8CMh`CKL@a-%FSbJ?^=+f*048KWV*9Zm)|H{mB6w&iX%%WYw_ zL3WW$DJ642=ff%Tj8&EfI$=U8!ZHmC$2>&OqB%Rq(jYe|ds|j9PE_hVUvY}e`D7K8 z$>CI!q)d^bB1@KN<6_Q(QW&tM09;g<SsX+ye7a)8z8Mq|LR^U=dgIFWCI>-ek~{~r z2o7vIJWmx7j7(PF@-Vb=L%s9fF_Fo~7B=&-%Dca85iIB!=%S;T`Frk>6iu`hOS79n z)%DufY@pH_kmTt-hNWANL2ksh&eWbLjgR-c?v}%!RLh$A8lQr-x0ZYcHeT`s;dL6z zk}d_FEi*H^6a+UkwbJN)8EU3Bc&DuGozm)+rqeH@%45;c`u6Alh(!Q{J}`t`@rGV; zK2$<J%80Hkfc3;6%GHXbkk?GqL{cAL)0~*sN9f%0c8T9jJLY=N4OGBIGkZ?HsVl1| zy7iO5ovE}kFJ)yY{WiRr?07!6_Pc`-fCcV~b#J0@U+o8ExDPK>k0uI_)%OX0LIU4U zQ?Q;b6rM->#fy_KRbPp|R{IS<sBby&9hZF1L4P0vojf7zlM+LYBoiVd3Zfz!LJ=J? z@R_S{SnpT|553*6>1zk@ozM?ocQ=)gjR%tVK}>KG)F6c{idd}}`DaR4PASXl*$t$T z-@1#Cix?NJanX82W&^}*f;6_!J!zXK?eL^sp0pQ{*#|LE`3=xUi~klwWl{U^;WtKh zWb`1YcRog&AT}_a<!YoR9r~S7$}nf`=#+Bq2ixnDj@%Rf9&JFd?rAeEW(_Jvt*4E3 zFXSLh$i08S0H6ittfZa!+6|}7n1~^zEttA|O2@w>)bs+WJpx}OMeH!AZ22R&`^tC! zyU$*n#uxQZezUgj*$B~(K~W2p1^kFCx-|30T;gI~!=EoNzFf-50I;9-7yLJ}`k`uX zQsF;V&ebU<{_I`;ioY8}99jQiG#yHi$NG^C=D#hd%kW9UrV{0HMFx#d4gstoXz5CS zL+hInuo7k*;TR<;<6k7RNkn;ah05@0&PyZ>qhhVIH~PzF@$SsPD*9_`|K!~TBEY#h zV*mj6;kJOk<NtwG4`AH|M)iSG8QZ@gfaazU{oKF+8iQVl1-m*}hekm5W1Bd7IQZB? zWT~f>!q`JOc{|T?ES@qJ3af|M3bL;bGY6-UAfj~a<Ynm+%sD}OxH;P?%>K)1Ma|w8 zPxjvcx&+CaW2!dKrF_{!mT!rg4kstL%XEm`*VBmFl!>rs2pjPsy!d@q-m%VF`6<_F zBJ)qg8~e)5-AY-<o+!JHw4aeg(#ciES1NCJW0_^nI4*UXtGMP?N7X#{GPgtL-wAD< zxbNTEy0qym5@}?$ZM*SW`xVupR90kBmc>{ur6N@n*<87~o2Zj*7t=@`pOQsc`8}ke zxHA>CY<F;KdUYwR@cI%R_Rr27B|U!1)T&?DM>6>LL#Qxhgw??Z@iN`T?t4iGV)d{s zNHiV<TDeEUS88qTh{_#zxsYjqlo(Sgz~&;-shh4XoVjnkk4wVljt6UW{SFM1`F7DE zVW7dHG}kIn0}4RAG4xuL=H2GB1~9q$1_j`QK59XG9y&rov$@Z^+haXuCY{W7s|g{% z4Z7VEc6KG<FAy4P%+n6aR!yfC>?F!AN|_73ZLPVlsk@penMWunP+Sm*AIuP@y4gUj z)Jl#~2c;Gw&8tztM3S#wNHH}-*dD5cx2TpHprXbYx=B7f1*6Tlkwc25rP)58OGVZl z@&s{jr|-mcPg+d>&0A(t-Q~95h8~`7mTDzZE@yU62IID@9T5<fYoLR3l*HDu&@C@_ zkI47j9w($&DchH?Q(6>;G`YlFVBR`1e|N=~T*fkw0KGWJnCp;I54-vn8t`5Vryti+ zYx(h_ftOJ0<7L+3HuKM`USet|%_^Jn>I?R*G816Y=)EW))T(9P<)|Nh@g>L?pbJF4 z5v1f+(>_t-xTO&a7SF!ATd4Uv-Ygm!EH7@Mmc;%UdCi15TTsSVx~4=^1-L*VdM_26 zoZd2aF_>_L4S&GH-v`WX#ILy%7J-e9r~oPWk*&<y@{T(#{K+*@UGU$u85LUp=6aG` zyZ4Zzik0%LoFM=~q&i@0f`^3y$auCRnm2M-?n1_x;)GTXS3{Qk!pvH$EZx-Z)3ee! zR^ZaUf1TV(R~Vv~zTT__hb&IShBuM|C-fRB<uJtDT``pJc#xgK+o_Q4FUFHoi8(@p zimGx#DovI8Lmh<pMeU@A#3)>B1Z7oPf>RPzEBiwp$I%wXO=rAvMDx|;wwakdRK9DF zx-=MCa4?a%r*84XhWc5sHLZqh!kHCn15n7n_A=i50!Kr@N+ouADeMa~N1~9ikj8dM zC-Z*9m<b~#O50g@Lv<KJQ6S_Ik9EeRaFp0Vmx7E!PC#S@l0PJ<RLRbGV!~c)Sy9pC z-aWO#RS)fn>#EeXvq-g)In46AuofA^zHm2E#pv(i{P5z%G0~_ekV6#7^-dbnWX3g! z%7pe3Rm7AyKNZ%5C7bemRn>v%5XZt9?-I{H(cGOHJ`^VTpg295Z*q~``6!%$Bf6&= z9@b<Z5*9PUel9i8p|sYY_HJ|q)}csdqD3})akTb=+=e}`4R5&xpqHb4q_8uvw=~Ua zdPfira-TI5{s67A-3*)51;o!!?Z6CZMMV(#g1%{1fh(bDo!U>uk$}v#vyE*k?_?%E z_A>47cIerIbz=rO7%-UTt$J~-8OPn?E~IALH_=F>eWYo%-j<u;OM`SE5oU?pc9a;1 z#8ixKQ5;RN4874s79gb?4KZp((R58%3+ki6CIW*lyw$se%23}f79hk+3aPamZxgKv z)?V7I%u?u>cHz9QHd@%ri){p5X|EVg_vZWX+9*3cwffL7N$<n!ettf*Hq!w9FgL?G z8k0n}n}`L)2`9Tss2&nv>;$=eG^13;T2-7z1pDTEHnwG5)yg)W%lnm_oc3YtZCk~o zfFC8$F=>AsD+2LGW>go|?v5ch9^QVXrFnc=p%yx}6s^`SJ9gisx8q6?3>_ukGi)Qe zrNN{+A;qe9?lSf(^oxzMYF|sT4;Nl9(O51oXkw9|iHj;0T7L0XiPDh`ZE(Ti5h<p$ zA+ujHamnVN%~xOHBr3Y7i3us1aV2amOaQE_PzwpbHfw<O-UnnmH4P6h>T)y+iT7Jh z+^#sl1riuO+k6`QwZBe=bE!_e=)+%X$*~g#PTFRM@tTXpI@etPjW}S_)+hJIdtZ*i zBvH*E4N*GwsOwt2IG!&i{piU@)36y#Ssl)g^n3C&Gpw90XS<n*sA#j{9F#j74|UD3 zYiOUL{OGKhX+4lNYhjDaTCm5K`+nJM4f8r!bR(~=i|_hg*v&@cy4ud**t|q)L(VMM z7!q<l1&~7e)Wpp9G+Ej1%=ag&bblI5A5zUOLIxk7YT0Z&et(WxYHf^Cs#coYuD0V? z+Z{@6NCGCm6eiC^<=*&K-6s`IlWzN)JRXs{#Py1jR4Q2z1BGXRlIQGgo#{`G6|F?? z^~C#>xDAvx(frv{S<HM={P#{`Sk4Do%R$|ekwH15K2Z({ftzLfp;N2jWJT+ceR|%v ze*iX!Iyz|Qn;4bD+rUf|bh+VK^o(T&QXg+dr7z)q_vh}2sZy8N^#VA^Qm-a%9}vzz z8Ll)P$OyR!EoG0Z74V)U+!pSL_F{S{mgxkI@@L_mICTM86x^C4vfUX|yQS*or>OVF z^>$V2S|IAE^TJ5Q19!(Pt7Z+t=s{;ag$>86yU3oc-n?V0MhYYQt5EI!z17tRXH><) zH=pWk5gqVVhX+g~k{I3?iIc;&SLHx#fGbD4L_~<P?SDmvoluPh=Dq`%9XFHqO^2K| z_?^0YB+e+UYU4p-`=ikG_1!~LWRR~DMLTEJ&Qjf|YDg@c#Yn4=*E)7&k)t3U3F&dV z2^+WJpbpm|xdT#THWWj59K>d84U$^+Cq#g&BZ7<0vG7(`%9>%DyZd(%=Vx#w=vJk& z5_(I2ggkE{|3q11Ssb5b&2kBaQD2S2yav7SIIlst*Tgvr>C<U`NhGgiu+K<d#{%kh zIv*U6e&E@*m!>!Ro?SwqejA6E*qHs9FjqXmW*TobQtnzT{U4(LRqAoL&1b6F#o-#} zWwAgcPIbQMBo+$AmdwGQ_}%Bo?ZlVp{Oh|eC%YbFOez@*=sF#RkQh5}-dZAYmo+jX zGbY2cU_oMpt7|ajm?lgeUzc8VX+wKMT3SQ<TsO<kUedj&1(Cl!GPJFrAhfl7l;%sb zhzlBbMx1FK@w9fzDOgldQLs3N=8c5z-lnTgtjV`yH0gA%I^DqW3nvdAxX^QaX;$5j zpHn~T7<?}>JtozTLQ5-IDorF1i8upzkx(eY-{gG1+M->EvfcATTMG)q+gc-wWQ7F# z*lclKZMZ**S6IBbs=91pse{gx(2+0VaYcJXqDhX&`69I28kkDsuTceKEN2YS-9w+s znbNS@VfIM-D=a>j%V)Wet?gABmuxKL$XD8A^%0caw<SA2TUQIMtP{4|s?V;w<c{sh z4Pq^?WZ`XWQ!)MFu{j$nH|TDpaqNIvrBYvvPsvC!cBp{`96s(j+0O}*wVnVIjn@(f zN%%_?8VzEuVf>@ksLADFDKd#v<^YGUfVp`@d3e|ioO*w7GEQ~b?8|QVkJNpqBN`J> zsKRxp!}fRxR=_+Iq4vWzxWviSTRn0QcX=e~JRa9NnR>fdL4S4Tc%RUNKlF%0OS#pn zaAzy4AtQdi?FvNt=BUuN{DRQdO_3QH11X+w@wQD->3K;xODig~8<G)esH^~EYw^Ft zpjMBU*5;=M2B-U3bIpBLS?QgL*#A=dtW9VM!<xn0*Ay46*)CBcv~{*$^0%1;)b%Cd zB!QkH7b^XE9`-bSi$<SREe`g`u{|uWMCR_)`C7B|{;pidnQgh)WOQPbuTq;(BVt@a zq^anB<xoqP+p%`C{rt?8Uf63kHk;6H(*FgStB<rTx54{<MZ>P8>nm2KMN0S~4{m!# z>k`Vd<m(W{TjKop=ChrDm?ths%SsP+IkFaWFgML@Lw@W0sMex_(AJj7%&dsaOhoD? z)J<0jOr;@Rl1ju<6RB7ty+qPD79pB8Z*0kM$9p+FAtFBXz`1m_N~z9h*|5=32NOEo z2{`)MiTHTcu4nt6I<oP7+d76j-mH8=AU`{LFL3KLkvP4r?N<Bkt)om4Or=FUU|nQ9 zC(^HWjP4oz{~ngUqF{&x*E-2=9URG?Jwk`eu93Q)zd>wQ#w7=gZaC4x1bfBi@H9-v z%65Qw#w9%0x=O^ZJHNan|9ueRDweo1UL(XI433^9sjDSsQ!#?mB3q4xs_J{kyUcrG zR@9t~<jn6XH+K~l?#;o6^Ho|AmJ;tpqB%U#91dlZOc=_;6r4z56E{forDsjzz5Qh8 zENe>-{)}*oU~sF~)e&>ayS*WJi>jG^SE6a$^osgo2!+QmU$T^-GQYjk?c3fwr)V_Y zr$GE~Xsk@KPoz@jd~@HmEm)w?Ns%?bTTfCD{zVFTNkD+Su*k#T!Ot4)o@Qm?`-G`B z1o`?H!qm*izJKnNGNInqj9G*#Q7$eH2ox74%2lFJw*IqHp;U&b6bco_Gn8W;FVhAE z25AFiMGo-fd&=rR%+oJk&t<W=>q)pjc6Jsx5{FZftbMG!zabpt-!7Do2(6H-iURx; zMfobv%*uvhCmzS5euaMbF54&7YO|(1+*Gc{h}`nUrNzkROD^p689o)K(Hj`(D=*Gf z`Gm<7t+nGGl1J-!R+5TZQoUr{l5sM?oV0AQ)+>T5)+Bj|^Sr&qxutxKIGioT*jw2u zl#45BE2<c7+CaTt8{k%Oz;uCSj%Ovw$UW6dK}#D-M9ZV_!l<m%=UJy&#~Q;^WZ^uC zI@wK<q1H&!k*pSnv86cM@k<o)21^S<@p<Xi&io~(JY_m>clTUECewR)co@7Q>tG61 z2&|QUTpr309=SH5QYckpuI+58O6U4a#V6?>Ss>Q2aKyj$mPB0BsW;WJK0a-oiQOc* zK&MdZ3doa$IzMW%JvoW$qtQUy=k>gaD-Cz;iY~-Ky8rOQQEv5=)0j7y9=|GN^DnJp z^(mG9rgtXA%y%$4bLzJc{c#mRI*te*5C{ip$PGL8o<Pzb<4DHhBPStkDi#G-wIjED z8RG+D-{~j!ct6?~ekbv6v#pJLvc>_isO007%a!Q){w!g>Lqcx2K)UDJgi5JUeUWKd ze5p?U2msHbiW!#Hv0pW2Wf)To&|R|i=Z^PM<$|fb9A-`dCH+8JVr;a7J;JYG>?sZi zkQWu^x5GuKxS+4+PR%~((D?S~j#mC6R=Sq9xbR#?<H*q?t=fgGG|ewpymF`QHxEPe zj0Ar~ul`njbvH@#v_!TDrsDiQwWo%cAv*NBrNLEZ#kW=DNdz;&I^4JU))(($y(NV= zOmumcf~>>k@<jSLCwZif=A8U>*8AI90{=CMwK4^%GSes}-bEn{GGgGu1CfBs6^LSN zrN?CND$c&e+r_os(0J@S0e#E((nc{HF^=fIJ^^~>4^b0GpwziOe<)I=lFL=rybw10 zF*xx)AKK3h8Dp5vQVGM|J<zw54T}kl+xI`jQu={sKiyr6+ZaBr;R_Ib>6wA2aE`qC ze_$eEW6{8ECv5ljJXWD-+Sz5aP?|5;I)ZWxxxKDPD-=`HEK@8TnP*N@nqJ9j53am( z+!@z>xPn>5Iy7WMUiVJ8+_>+keAoJK(yBwN?p%BUlg7e)<$C@!PUv7fZbn*XGWg*1 z2q%HiD0los8{%=fJciwEmg5)3@b2C8@oYsPGiL9&h3_42B-7i|!%gfdGw4a@!n;p@ z7xMYSK+<lxsO>;9n3o)pzM?`T!cbO{9ad1NnGWPE`{*jnAlADW)zG`XIg|3i@x~5f zuxGG_lu*0h77UF~0M#oxwyvZkc40KF@vWT6XIS=y*{2w=XQb&>D7Q@RNi*sKzqJ*| zGjN2A96Ri)2x~og!z3|1xeroq>U6mUj>7coYNSOqakq@5b#d-Iy5+SLs+(COF2?k( zSsjiE&6%PuUsOAdP(&-aCH}=(D-*ch^!c@!=mRL!K6ECA$RiTTL<||d4~05_CVwSz z2t*FiCfdi@B3|h39~|T!DC9_BP%!t_d`0!5{vsvl{m=KtesqfOS?n_m_B47P{Yhi! zDmC^g8vPU-UXF^)N{YZ?sxjDD>v^n?t;q)5bu{`qE;{@lWMpPys7D8kBqAwjsLd!; zPCJKtj?KW`z+!LWh-XZ2gIMe!&Ln#$nh-(nRJ2`%GN=lB2FSWISj^xw)DRNM4$o(L z3|*u}$9cXyt~h3Dc}EC-8wR}vzY42A?%$S=h72S<+<-mfNkgRO2O6-?f1)v)QK(*< zNPq3&&6C=Uf$LslJQ5XZY7XmrD)U(Z$t@;PuOWfnNG%hYKH3xLNto9;+Aozl8Bk7f zBx?hyy4ay%7mO$(&C+2>rq7auL?X4G67rCcZ-;tU`s2vxu5yoS*Wr)2w0Ed^LwD}t zAb&`X@+j<AEN%=-uVY~f6Bw3`3rE>pY)WZ)1t$(C$y-2;%~$K(D#gTF^wrRH6<w=a zKioPa+;bfEC2sj0l8&@#IL7o#SB%C{fAt6sle8ofm6Tejh(Ww)k7)_fXV3A;NNx)Y zN3<mn>}-iK$x)f^=`f|PDaE-xHrvO_AQA{f24Aa~Z0EMrCY?ewYiYIj=iLUZ?vq?| zo0{DUb5nG&c`O!>t$QwVK<6RQHRhx!+{BuroEDA_sfW?(*~yB9`(P?vKJ5exRjR_| z@_4fZ@_r>0v$%@H1m00yf}3EaUcXY{R`8rpZd~EFn_gL>)3P+?AW%{8mD~<yiw&i| zXYhWQS{H~Q6CN$CDvpn-&dV>>RbD?om4P~NS%Ol_mB}<>Rf7IDjBM6b)vLVbm@E<s zM4RP0r~jB#CWENWX<f5dNi2HnW(h7SM5yOS7%ZwgV^=2h`inA8+1KY4rV3TMrk?$B zdYW`%CQPM?52AYyp4-hRl={4pD{j=!9G@X`BcqNlBuU96+cf-M7*#;L<!(R&rlsNX z3Aht(tFi1L=Njdz5C?}4<yz;3Dh{sNO=3t=+zzg#OGnNm38<71pVQMcAxjRoaJjBp zt}}zH^?OG+T))UOoZpqMT$TZ$^9wNObze;z=K_8}&!A|nY)nPN`iR3n99!e(YMwSj zdi0xb-txc423;ie3&o!<recbSqN|46kWcr!^b;}?hpf}vqqOAsAcaCs#MjN(TG=VK zi^m|Ob-WUint4&(;m8K)e}lGg91d=);PDnFULnt5R$Ov%a&q~eB_6D?MHC@E$Ny>h z9>Hp*Lak9K=`3@Um&0Ro6IT!27nYy$X<4{s#|aY-mj>)Ou+X<<Z@E@#H<5l)>eDOb zJU+f9u;tV;;m}Cx>K&K5lJ<GRBJ>8W<K{?ZmU82R^?MCYo9FYQ%7v4rZS9x2xG-a^ zm--RbhOOID)4n#ScKZFSZLis~&a<J0!>z&L+5dRfpIyOF|Bo&3Nvd)b*Kx|XhP0it zzh1^B#U*|HINMo$IEMoHbVG2YsfNn<?hsxxOQD$OhC2ZGQG_Nql24&F!YCpyy;$s} z7g1n~WVT`wNn}gXkw|)1TcKXd7wEM@<n$w*@<tmHf89&|#E!4mI@$_JwnAHy)|RAo zZ_^Er3w%2!9c@CVCsCL&vEfd?h0n>6pEF_-iFsx)WW;sbpd!Y)J0r>#y%X_d8p^85 zZ&~A=3Dx7wE8&0i{!Se)sibCJWOo{}8S?8kWiH=Nr`>4hW1XfdgRawmej4<+<02sh z$47ipT2W<<Jg~b{hdv0}3Q6zgN4K%4iLqyqefu3DskytM?sP~ibmZL4b4{TUvF2eA z3mXR9y4lFl@9->k4^FUzYLkB@6J^866{^;6;$$f!oi=MXpjTU0pH@T#MmoMh@OsDZ z3@Sns5^3-Zjznmvc))?lHK$N!Yr^>e`=XwV(s;d^_<aAkVM69cH|#gCP=#w2LC34T zLTvB)Y@ZGEHuMt(({_;ONkaw(tQKQQaE3I4B(cLe!G??OFDs{*`f9fX89QSrbTy{{ z{iEcKxkx?ld9P&r#HxJOBSo0UBOUzvc&xhmJB2!2t&SZB;*l_hU)5p6f8SBRYN8#M z<-T898{@Dv&xE{)sZB)A6L-2`dWnS7SO!(AVz@XMPa?bOGE7KH?Hwm4Ura0H`t65v z4r|z+aTuh|v!}8>ln<ps6Eer^O^Sy6i`Ql)Ua*D=p=T~6X02VWIaFj)KW+_eXnlG2 zvbT?CI1KogOf^g`1?^!d$Ze>3le)4)|GIJHL+(YS+hX?x9TMR92;A|e6TO|!=WDFm z90|r+==U<tfLH214*NgP)O(yXU>UNS;OzBE+mTf_a5gjvKg&d#;=X6vUJQV$J#t+1 zyf!W=zW(u8r~Y5+FLk`mO6z<_EnsdQpisLuGX?59&f2-<X+L?z^Cz+HZZtyb1+C&n zE7In=r~I)St)ntj=5BT${Ep)F=sftO$-V|O;ghzy^=P)nLqLM^HZzxPmGQ{hh)si( z)V-pzGCmx&7k=K7Y&Fye1Kv){ILsxtHy&A)r9nz+^}!Pv&x_obV?vx~JMc=BYIu?R zns|HuefB?%fbTtFfo8xQ7URm@m;5lkg69|6Vx#VbA<<qiC?uj_r16cRLsi*Cd|QtU z$Q?Nj9QIhS*o^{j`FWS2ou`V|sMQG?E0vaU*J=%2R7%(WO7Mn71{O+un#Yt%nHsN9 zT&wsel}!8jLfilIBR7V;JU8G%UaZ5iJd-`7?r`MED?!Ul26nOhy2Bxt{$=^Pn_S#w zLNc|rFPk1vX?o?5GmYjvk(>|yFM9~B_5cBPa#R^0<0a4e%6-1^!LF-WEq$z(lq<^f z-(Ak4mY3rh&3@9LpJ?A_TQBlqVCkEyr**(y&DfG=^T@^Unz3tlwC%~*OPEWfd0;lL zsNv0(2lxBfgq(fV#LVO&o1?btig=!A@Jam+kfaem6J>-2=c%pbMM=$@tBq3LPd%vW zW_ErtZqQy|(bAe*h>xU?Ad<xQfl^6!1}#7Tnjq38Z@*51n!irez!(~v1^%o&V<x1| zprw3mR8iAv1-z(eJa;n&JKk{R!QEq*@BdaREjs1Q$(EYEWE?BZ9ugNXn}D~`TI@d7 z3q3Q7N3<~sA$19MGu^TlPG3@(i3kadYMHN!dHHAZ7&P8+<>s+Nu@OgXR<n0wGf|k; zCZC8Ys69XuE%Ah_jcWBS@5q(s+`o^xX|FfJkuo9Al)hOydS7an9WO~Gy>mH>hRRXH zc=dR7sXWGMHnZh}ry_NBYDA)>^8iETm<V~M^cgX{yI#pfos50awfoeMdZYfBE2Pwz zkvCuW{YEsN^UN?mxw0MO!$p~tD`i^xvJY<}U)K=d)?Vm+mihkU0v+k&71ev(VJ;k* zj%Q&5&wCwZ-dvJ;yJh9g)$vBvTPN4wp0*P1Bu?e$RX5glrmc*Oe1qBYVN%{UDVqLF zjmR+JDg~bx6BUgq^cgWctovOLL5VJ%nRh+QsbmCF&n$|G5}Dejuv5t&D3en6Ykoux zGV&$vF4HY1ht!uJ-AqZ|eTM@0HSY_S`o3f5^{e3m+f2@>t-&8aNSRP!N}mBu+U8ct zy2yuCP~)<Ra`#$r@*dk7MLWjOH@oU|JP9fJ2LJcU<IgNQf6joJKkvC$pI?8x{GXjU zcY3bizuLGE@W-=H{|B!Z-zt#l$JN#{;gP-Rvd-N4t=SIE3ZD%B{^UvPX7~LoOLQ!) zJ^Z~nw-WC5{#&3cTtqE8J|hA4Ht_+$^>VS(^!AV|Ick>ngJvA!!iB@RC1+(^jC6jB zoq}G|)3b>ixi-@%<lBQ@uEC_&o>8>UL(d;=QLUZtc`W1he;k{ghfR0>md&L_hyHx4 zDlPnTJJ&s*K(owi-KwyPOFKk#doBBtC3ATog3XIL$la!qKR0)##CoMcA~tssl4o?6 z)ojM)4zbVST0j5X&V>F_@8N|$9OA-bhcoiMZEWPHtp&Y|J>eH`uUa1&_2=ukm^b_R z6grf5V}eG6)u)*TQL;Bm+^|f~^u;s_a=i0D4@F$mUVGcZo(Uo+=Yw)pv(?UA|8>ow zUZQ>A5DMwDQQ{i<5#IBkVY6E%vp1n<bggB~9+DzhOU;JFHPEYFpm1n=(hUl-*EILw zA6(2(_Z^c-1Q{XR!Z+<I<uv0eEwpd+mJryfylp}sw^p-(YfAx_v(vRB3!a;060e17 zBM@%k8+RS6(&!(Z3^=FhhmI!iwdjNx5J5H(=5TB8t{fYfL9Uqyw3m9CSdaXP={nKa zKiVRnM9huU3svZ%Z-22>DRlkppVWN(Rq7Hnp|3y3mc93)t|DM-Z$Z&oBZ~ZLVGg;Q zl$&x%e>t~)s$G-a$!IQuPYTbQpqE9pGy%CKP8_{r&9TFeCJ{&?qS$f{XL3r3Z*bSK zDvi8n=k|hP6oczUV-<z82?Va}_5KReI@==8$+zR%Uy7+a^7UR3q44Vj#Yj47Ope(e zZV7UXf11uOqe19eTQYp6X7%dHth&3hCx_R7Kz^t|Atg)&@|{lz6s>qL`o1z7M7apq z<RpV^8qetf1HF)2hMT}~fY3jn>)?;+2VNDyU=O!?VC{TDcGR?F$p?T5%p4;13=)@} z6rTV&g@XaJlKJ(QrUMQJtUU*LrAP>HRURXP#4<ItB)GU;T6byocof+ofC@f`*_8t6 zYJof6@dR9!$B4;UwLM2~DK&-+MOt^cah}|L+H}Fd7V|j@geZ9)2VwPd1rd11R}ik} zJZgqatEOe7biO1qzEIDa0HNyBB=TL`GBkBimq0<`(z?sPd=#AB!}BihZx)^MmvBCL zPmnb4HcLtgZ$yGSKVS^B2!7eT@9^;4PRTyJ2kywLWVH1<by;MVu1H}>Ner&q8l=uZ zT^7vnjwP^Dg^6uS0!m6|37csblkf&{=RuqP*+JO^h}dY#l&}fUyI1pbttFu)7K)J7 znUzr>aJ`QwYz{pRJLFOs(tVNRn|h1R%ud6iK1RmLsTvEr%GG>l)n<v>(E)>GqCN;5 zNX(6_I-3H3azH_Ys#GP-@G3p#U23vei#=*ckgIvn3&Y}|N^G<b`fdQN(mlsCG_|f? z-=jA)&&PdCJz~AY%6wI50|^}9e$Q~1GyRCl$jFGMBL!)97RjCe4z(!(6Qj3|Op)PW zCv9djPJM;P>MfcaDJgeeSNq=*DyE@wK>A-Ge>!x&^NB6JnI?|JxOmGtfsP+>uZ~!l zSVjkOa{Xc}PbO0Ew)Yh|5D;82^khj|722e_8Zpwwoz4N6S+bj><iX<@I)WGKkrAbO zjpNj^MMFSHC$L+@;PDfef>S_9S)i?AV(|U2W+t`9$Rt%4cvQxW*`;SaMq;>67zj;s zxThIXS`g+k|I)pwohOm+7%ip3f`xV&yFhTx@JwX9S+_uURwRxPvMS2sJdz{*av&t^ zQVRx2Eu-~ZNhP;BvcH@`M`tGZj8$?7T|EbM(k9-^4cWj^ll;6o;z{n>)~GKj`=Q&G z!Zb0fW$Koc;owkP*H0*e7-}71k|nv+hK2@SAQDOZ`Cvu_`P@|6%E2~|3glAwF9$xD zdOgM35(&?<*nF>bg)msENj=Guz-!So#@S=LEivUpCUp>mq};>IXK-&zR#O;hSK(e0 zch|;m)(Fkv`fPKynAK(IJC>?o#meChM-$4MfY=$}L*3>dW{BFf&+JIZMrt$qVUfVP zldavVl@i_w16;}7j9S1_Xbz0eftDN{!@8zV?OD@3I$Z7{oShtAJ-WJC?;R`;7PD?$ zwbR%D7v5!ePWp3eiG{ZeKquNvb*Nx)9RRD&_d^kLgs}86F;gTA5b`Rh!YTzc)yLuE zlahB8R@?_5sta0TRN#K`m4d3`Q>U<$SwhVZ`Xy#pe|xZ9wevI%JqO5%190Rra~A@{ zLi6j}HZVw(m_=L|+AK<(cUPm<)&TgoCMT82TY$F_73v<I_wPP!+K`epyg^43L)CdK zu*+^#a`6U080sh5`k^k^$ZiK=ym#i^d69*_sZ$v>wU>VLqYlck0oZEt0V}Xpd7o)T ze|Pc%bse+B2!2(HzFq}sV09Lg_IBpeVV_CR9joGqW62U-j-QC=!Vtn#?A$g%e~A|w z8m+gAi0-}dQB3Td3Nnd(RTV5Hv5{k&3015+7MZnbEJF_~u9_Ut=4ih{2q<hC_H<<J z0zp7FR$HMe{3ubn+-^5DQPi$2_o62p7IHb1GSdZ8+qT;+ZqUnlF&ThX9uH7jzfk*# zhln&aOVqQY<Bo3aILuvbrWLlav5mhLvSRPHDk_|wxpxecx(o7N3=KNt(6x<TKVoF_ z1|njq=FpkFjiPCYs-*#%8QD({<W;!6r>usov<W45YFpWks}W&xmTi{N_D*QlVFqY) z-k&8OSbKtlz23Ax?My~oCN>fgjmAK21<Y0!mV~2oYxQ>X2HU1h?E)<2U67O>l`bZ| zQSXJ~lsR>$+W1&!MWw}vtB&cf#m$0)z#OWXjan&})gHu}u)}?QA*SWirIngRjD))& z-MkJ)dk0S2=auhnT~aoZwb6`Y?T|{U?I=~LYZO1i92My5gQ_a~ZC={4lA~B-dx?(M zbGG$S>R3{lwOv73wSDC-(+nJSaS0m^Q-NqhCslK?Aa?8z@csNwcEZKb98w_USiG!l zdBr^1W+I9vu7V9ssS=-Cg#IxQ!08l379#Ee2F~f*rcA`6l4hs_L5#e+05-)k#*AN~ zY?DY+YqOV2k8Hxq8Gd7lq_FPcx$^Xbrecs1KhH(r6TSyT;V8$=%zk@w(;gG#J9_H) z1*PY#jX3x&cgMqS?YpMYqBz4_mz(%jX2ru<@TN5*)=m9!Hmp*s1{H1A(+R@K(fZ2f z^3K*|HC^>ON=@p!mZ2&oVazzA$5#+h#X#A(g=7)4i)nLmb;NM3%RC8|eOX}2#L#{U zctx6rv_gUqqs60}c#x$9RZqLfq5!H1JaApk)iY<9`+)Ha4sjU{>9}Qa%nUv@JNw<b zWGPL>hRrD)ml-1oRg=y2MYG1Pl*kGVa`l=Q3z`P+DC;F<u;EcIPHyvA_K}r5Ychn> z<AcrK&h}z5>efjFq2JmXl!Tku4QDs&3E~&6LBfZjCNl(I_z7-Pp-=;&%;zQG?ga~z zeeqaEYg`-3nWRZ{k6EEWuskJ+H|kMX847wu0}a<NvP}f(QBmUPx4+)q-kOhxy-pgJ zYZK`$x#YkZ-W+|DSPsf|WKks>o!TF&t>}N5t^99y>LlCm@z8hS606G^gFI9PH<s*l zw4Y?ZL|Qmjj8c**9|y+Q0jem%wN@D)LrKFRHuEbbuD@-sg8gV1A=#<lc<*=XvIMO0 zZMBB__?-DLG%oJ6h72A;>QRcXS}+63dGU5yS-jxvFxmE?2COQFfLk$z!V!@3zS}%K zON<JtaPx4`K!#HH7z|<=5$8&c6!0&QT|DMX1WF=q>N}C>iJNuDh3cA1wE{o_8rUid z953SGY-z5C>Vv5X#4n`G@D%exuU56*U1Oj@LZh@w6F1mDVT-NcF}KAdjuMH0b1{Vx z?P?9i{Q4wStv5y3nQKiclT0SvPG%~y6&!LpiK=NuC_(UQ%6VXX>z;%R9`m(a)fhR6 zxg=NFj1K*!N(Em`mL|~nNZ$F(r{m$EV^ykZbu67lSFE12zAs?FHigqR$Z4r5q(?ga z=9Me6eyleMM$~8*K+~hNL2%DPvC!94^mj9VMgEgpjg!F`(B9G|(grz*v!Q5@L8cp7 zjFa0-NvROpu&gwL83@cs3*)mHyAiHKl}!gHc4Jdl?6kX(1sDM~h4{kJ;GV{WnibC` z(`2n}$ti=_j-1HQ<kewyp(;!5n0p0Dsx2`FI)4=?1J#2qv^JhN_54G2o|@gFvVKB2 z<zJ>MNG+`%Devu%!36nun&fL_;M)n6G@5Eki0epcc?7J)Xu>X<SV&N9jRkpsbr%Ej zCgjZ#9UhuO3t9*9om>r|Pb(bkSgzeP@sD7TjS4bd8~N5<w1PQM9x8`U?YETBxB{fJ zn+r~!93jq}+|30JHW#>^0D)-{C_p@;KR96Yn58GNXw;NtYf2(m{GtiD0$1fwFGS^& zyRDE*f~H<lbQKgL-RpLpAsf{OmiPuya!eB)V)oJ_BF_eua^%S>Q;`YtHm9ROuT$ip zx0I&VE5pz#9)fvfAJDXNfE(Bzq|H*uXp^RC4nz-{^e~`I7>$nNg&<+ZrvUePtff*9 zvzS#`VKJ%S<^2=fGf;!0fe?5FYLDigx!#~VLcc^(mJBj$L*=#@bB|~B)GEt`9{yzY z#%{z9&BzKjge#|&WvbnZld>i)q*S(G$-p;F*4&hvu}QcrD~U)*NW^9TWowe_RB%FO zR+uAoG$ZJdp%otOIRvM3<lPu;(BjC(@Fvz?1K!X(0N<7-Xbl}2vPgc7+wp&SNdEPK zoi%cBllhkqPILQtD!2N)s44nSn_jZXpEU+Tn7WQe>vBr5iE^_FffpZ$t+xgSlE@IE zzQOWTCGE?@8+u?Z`iDTCx;t-zymOYp2q%VfkJ|uN%8H>d&d=)w6Hxvb;K7ifdcER6 z$)*J$evbThtxbdtzlb45fQ=!d!~Rf#b8ZLzAv#8e+71eKM1VWud=u6$8aPX&t4$C9 zS&wNSM&C+H5sl-N&pY;)M5&!Q*_IZTknVRlR7r`7yQ5NgJ!NAP-Q2Wu!pK1h+NIrR z`|rQH&I?;ESs?2@it@)1{K1)6V&2<X65q3Pu(@%OA#>WOgzbsK35C(VsCP8kbq7`< zZ8ZQw@K7CBc{ZfCZIZ_k2}99|khU)AKNPVf%bo*D(6iC7AOCaNZBYB&Mf3QFTXBB? zzPIk_v-IEc|9>CtQ@DTjKqeq>2?746bMw~dLqK^O0!_ant@MMSe1!Umk)J_Tucv=- z17JOnG|ce-@v7U*+>+{F6Cm&nVeee{ff^>ssEon?@tNR-kD#xH=6eL(gT_Pra^?9K z)6LG3XF|5Og+CJL?@V$a{KT4e&rKD`7j2CH7Xa!==zZgSwI<=nmrni%PX&(lG|nX} zdGm*Z?G3NP{i0BhxMV{X%E`|<4xNKU#hg_o9bq1$ZC)ZVodKc;UHIaz2~H|IzS17G z7y)?T=g?}ssr7lEY}A-@&ppBa`9?0#3pWrPe>Uj<<}l!?cQ2(@PjH$f+ac{<nn$aa zdZ8H+yM&$}=c@{hLuUmw_P|W6MDib-d)bd15A>p&K3Zuh4z~)2Km1||RvUD%%r7#( zoPn{gA?rR7Nx)!yct{LfW*oV+4BdhS<Go%sqASzP&(1Gi4q#Hp81FoNFU8y6vjH$! z_$W=Z`dK~-5r?w)*gRfhJPWYrGqYvNsz9&9{qNEgZ%jKZX`RyfQ07n;xV>duxHDkb zhnoQa{e?h4_rk!WF$Uo%+D3qnzegB>0PIQ!1=b1x_yV}-2bpU#h+fv&55;n--w4*5 zeq#}S^_##Z;P+S(C6!izLJJhjk|9$mG65bw5wftA(sF<@`J<H@o5+HS1+t|{IX1Oo zr6wzoj!Td+Jf@=+R?!W2@{DDcY01erQljS>Rxtg`47t*zE0C{L39kG~kDcq9CSS~z zN{B-e(A+f(q_=wRvd*4&$EYBu2x&n*tL9^}o0Eg5bV)5)LG-LxGg!GAIb>M^6Q2<~ zrb??{;9PyN6LUwYL`tW<uu<pKkGVLk;t#k28Tf&irkX=oKAr9XF1Yrz5E`Aq#LU79 zjcPWa^(T@;jzFhjl+IwX*qj(#9$z37i6v5*JePhcw3RA#OdVZ4{a6NuM#jyUn3|c# zwuoaZu5CMZpOetHY<g3*AOE=t{cnSy30%erlA;-w<As_`Bw0!9k)|6Kt1XF_j^29R zZ*SZluT#2;CnS|lB2%ceWOC^YCX3DC^7w+>REWfqJXCjDjT~auELNX1^kbHG*|FS; zujV&`-~HjwcKa(s!w>%PZ=RY__*Y?(ylfOBlE~r`l2XzZELzH^pRW`ujn2r|0T!EM zrANWmtlO|@OD2CO<qFWFpje=OWffI5b&nen<YK`FAW#?_fkdGTaRY<J;R!?%nL@2q zlg?lk?kStY<?#hYcr9|ecf`#~q%ygp`HZU68m&%WB;SoDv&Cw&JDe_e9J5}Z->v`z zs-_!e;uM|_3R$+}dVcoW<#Yy<#pZB%e1T9TmV}VW71~ObT1Qt;-@wqw*u>P#+`^V^ zJ9h0^T3OrJci_;G283V)#c+b8Xolr@L6l@g)pWyRwb>m`m)qm@`SB65nj$g6ROp$n zIA&_4T5HKd+$%NrT_F!xrf1%@V`pnmdMo@kh5>qux)1-}7x=@sRpY+#Qm(6SncuB! zgHsUPGxmyfTwW7ssvyaGT9+Uwp`!+LU5sZHS|U!e)+$QYjt4?7VOH*1ZTRE!R$4*_ zIyGDuDJU_?I*m=sbp#E`e4@KfL#~2Nr!HN^827UMzRMm?zayt!pY@Ds%~3v~b-tIL zFxqQ<h`qpcIOh6^P4P1hLvSrH^o09)8FCV;MyGKYO(#O<IvbZS94Ao*6@1UmEl)o$ zBWDFnRM7!@yQ5dRUMB`guQ1#C107`OIuM$@VwFi!!tGlBt<`fAzje|#q>63nz`A&x z8!#8TaIWf;32S584?)=li<e}Avv$7#IM8dH*SZ36XbZld$G$8TkZdV}7;#TFlI((& zxvrvISLP|RIu5O@#=O_TC#>B?*CbncMl3iRuu*ARZll7tnGHAb-x*?Ql`bJF*o9{b zhp+BW*cAuSQ*xeuyHV-z>@V!wm?^st{jVAU3=~*E_;M})C;$QU(VcDg>HyKLCdNVb z3_7vyR?it=U(kswLf`hBdWU^Lr5A)R(}ICzN*hj%{PWyqdf!l5AC&KO#R?g{7=47M zljq*|Mqe>Y!MsJoUY^B-nKz@W=Jb0@qN&xel_wwU-@YyWZ_&@G%!!~vXC9A>(|f?t zkmndYf3r{bTfEtm-`osjUJn9;uJkivR5Tz=<Wjs+IjY=+z`(&XN0`{lCdeWQ2O_~0 z8+_>Ce($3J!Dref=rM`{FsC%viLx8Q?v<vXrFsp^gf5UjNA*NR`LHNl)*vp7yJL<^ zC)gEVkU;PQUiJt7CI5r+*JR<>?~<qLzYx&<QaWcEwPj-6tklQ<jIaOWaUKmoCQqC~ z%vZuJm->8iSRqGyqNCtNgB$u7+yHeZXdKd4z9mFkP3A!BxyJo)?!=u62~IvKw?_K> z|K8Ke0O2-qMX1h>yg$Bw|AJGYQa%4Es~SS5K7qFu{;YB0lktA$ix=+15J*$lKiw79 zck$66vOytjVx{)Rf(W{s51fKu2JjQgM26r9Uc#9CsfLN~pZ^??=1uJPpvGnJdyj(9 z!aq3SL(w9O{k2I}v}@aRYC_Jf)FFs0-=*uVB^W}_UHGBsunsA+;*uAK4l{LOfXpr2 zd&IhyB39kqsc*dZ&LEa~h83;|1!Fo2|KFClxBtrw5C04Q&I1?7@2B7|8&TrB3&=PA z0JL|(!C-YCOSJP_envau3s)ac@>KV9rH?t|tGgfE_}glXMqR4@NxcXt9<2<)(wl%v z{=opZE-L)hB%C*2o*tr)TyNfgMPzAk>sfTsy-E7N_!4wW_`{1_crCl3k99}qdXGcq XMu&d5c*nl`nZ5LXaGxZcodEy<7R<vu literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29df398069da61aee853e79efc918a5da50cfdf6 GIT binary patch literal 7568 zcmV;B9dF`yPew8T0RR9103DD35dZ)H07@hP039y?0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..efcc26dc5c69f23564e2cdbdf101e7fdf1e5ee79 GIT binary patch literal 7596 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 O#wJ^t_sl^H8{Ggk@tke| literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/images/caution.png b/src/base/theme/bootsier/assets/images/caution.png new file mode 100644 index 0000000000000000000000000000000000000000..d059f6292c976a198c441cfda66e33ca79d3b76c GIT binary patch literal 12481 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 LNkvXXu0mjf`&SGI literal 0 HcmV?d00001 diff --git a/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js b/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js new file mode 100644 index 00000000..cc0a2556 --- /dev/null +++ b/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=(t,e,i)=>{Object.keys(i).forEach((n=>{const s=i[n],r=e[n],a=r&&o(r)?"element":null==(l=r)?`${l}`:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}))},l=t=>!(!o(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",(()=>{p.forEach((t=>t()))})),p.push(e)):e()},_=t=>{"function"==typeof t&&t()},b=(e,i,n=!0)=>{if(!n)return void _(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),_(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},v=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,E=/::\d+$/,A={};let T=1;const O={mouseenter:"mouseover",mouseleave:"mouseout"},C=/^(mouseenter|mouseleave)/i,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"]);function L(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function x(t){const e=L(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function D(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;s<o;s++){const o=t[n[s]];if(o.originalHandler===e&&o.delegationSelector===i)return o}return null}function S(t,e,i){const n="string"==typeof e,s=n?i:e;let o=P(t);return k.has(o)||(o=t),[n,s,o]}function N(t,e,i,n,s){if("string"!=typeof e||!t)return;if(i||(i=n,n=null),C.test(e)){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=S(e,i,n),l=x(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=L(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&j.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&j.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function I(t,e,i,n,s){const o=D(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function P(t){return t=t.replace(w,""),O[t]||t}const j={on(t,e,i,n){N(t,e,i,n,!1)},one(t,e,i,n){N(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void I(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach((o=>{if(o.includes(n)){const n=s[o];I(t,e,i,n.originalHandler,n.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const n=i.replace(E,"");if(!a||e.includes(n)){const e=h[i];I(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f(),s=P(e),o=e!==s,r=k.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};class B{constructor(t){(t=r(t))&&(this._element=t,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){b(t,e,i)}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class W extends B{static get NAME(){return"alert"}close(){if(j.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(W,"close"),g(W);const $='[data-bs-toggle="button"]';class z extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function q(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}j.on(document,"click.bs.button.data-api",$,(t=>{t.preventDefault();const e=t.target.closest($);z.getOrCreateInstance(e).toggle()})),g(z);const U={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=q(t.dataset[i])})),e},getDataAttribute:(t,e)=>q(t.getAttribute(`data-bs-${F(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!c(t)&&l(t)))}},K="carousel",X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Y={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Q="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z},et="slid.bs.carousel",it="active",nt=".active.carousel-item";class st extends B{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return K}next(){this._slide(Q)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),V.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(s(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=V.findOne(nt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,et,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?Q:G;this._slide(i,this._items[t])}_getConfig(t){return t={...X,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(K,t,Y),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&j.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),j.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};V.find(".carousel-item img",this._element).forEach((t=>{j.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?(j.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),j.on(this._element,"pointerup.bs.carousel",(t=>n(t))),this._element.classList.add("pointer-event")):(j.on(this._element,"touchstart.bs.carousel",(t=>e(t))),j.on(this._element,"touchmove.bs.carousel",(t=>i(t))),j.on(this._element,"touchend.bs.carousel",(t=>n(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?V.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===Q;return v(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),n=this._getItemIndex(V.findOne(nt,this._element));return j.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=V.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=V.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e<i.length;e++)if(Number.parseInt(i[e].getAttribute("data-bs-slide-to"),10)===this._getItemIndex(t)){i[e].classList.add(it),i[e].setAttribute("aria-current","true");break}}}_updateInterval(){const t=this._activeElement||V.findOne(nt,this._element);if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}_slide(t,e){const i=this._directionToOrder(t),n=V.findOne(nt,this._element),s=this._getItemIndex(n),o=e||this._getItemByOrder(i,n),r=this._getItemIndex(o),a=Boolean(this._interval),l=i===Q,c=l?"carousel-item-start":"carousel-item-end",h=l?"carousel-item-next":"carousel-item-prev",d=this._orderToDirection(i);if(o&&o.classList.contains(it))return void(this._isSliding=!1);if(this._isSliding)return;if(this._triggerSlideEvent(o,d).defaultPrevented)return;if(!n||!o)return;this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(o),this._activeElement=o;const f=()=>{j.trigger(this._element,et,{relatedTarget:o,direction:d,from:s,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),u(o),n.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(it),n.classList.remove(it,h,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,n,!0)}else n.classList.remove(it),o.classList.add(it),this._isSliding=!1,f();a&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?m()?t===Z?G:Q:t===Z?Q:G:t}_orderToDirection(t){return[Q,G].includes(t)?m()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const i=st.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){st.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=n(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),st.carouselInterface(e,i),s&&st.getInstance(e).to(s),t.preventDefault()}}j.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",st.dataApiClickHandler),j.on(window,"load.bs.carousel.data-api",(()=>{const t=V.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;e<i;e++)st.carouselInterface(t[e],st.getInstance(t[e]))})),g(st);const ot="collapse",rt={toggle:!0,parent:null},at={toggle:"boolean",parent:"(null|element)"},lt="show",ct="collapse",ht="collapsing",dt="collapsed",ut=":scope .collapse .collapse",ft='[data-bs-toggle="collapse"]';class pt extends B{constructor(t,e){super(t),this._isTransitioning=!1,this._config=this._getConfig(e),this._triggerArray=[];const n=V.find(ft);for(let t=0,e=n.length;t<e;t++){const e=n[t],s=i(e),o=V.find(s).filter((t=>t===this._element));null!==s&&o.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return rt}static get NAME(){return ot}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=V.find(ut,this._config.parent);e=V.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=V.findOne(this._selector);if(e.length){const n=e.find((t=>i!==t));if(t=n?pt.getInstance(n):null,t&&t._isTransitioning)return}if(j.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&pt.getOrCreateInstance(e,{toggle:!1}).hide(),t||H.set(e,"bs.collapse",null)}));const n=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const s=`scroll${n[0].toUpperCase()+n.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[n]="",j.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[n]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);const e=this._triggerArray.length;for(let t=0;t<e;t++){const e=this._triggerArray[t],i=n(e);i&&!this._isShown(i)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),j.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_getConfig(t){return(t={...rt,...U.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=r(t.parent),a(ot,t,at),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=V.find(ut,this._config.parent);V.find(ft,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=n(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(dt):t.classList.add(dt),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,"click.bs.collapse.data-api",ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this);V.find(e).forEach((t=>{pt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),g(pt);var mt="top",gt="bottom",_t="right",bt="left",vt="auto",yt=[mt,gt,_t,bt],wt="start",Et="end",At="clippingParents",Tt="viewport",Ot="popper",Ct="reference",kt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+Et])}),[]),Lt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+Et])}),[]),xt="beforeRead",Dt="read",St="afterRead",Nt="beforeMain",It="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",Bt=[xt,Dt,St,Nt,It,Pt,jt,Mt,Ht];function Rt(t){return t?(t.nodeName||"").toLowerCase():null}function Wt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function $t(t){return t instanceof Wt(t).Element||t instanceof Element}function zt(t){return t instanceof Wt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Wt(t).ShadowRoot||t instanceof ShadowRoot)}const Ft={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Rt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Rt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Ut(t){return t.split("-")[0]}function Vt(t,e){var i=t.getBoundingClientRect();return{width:i.width/1,height:i.height/1,top:i.top/1,right:i.right/1,bottom:i.bottom/1,left:i.left/1,x:i.left/1,y:i.top/1}}function Kt(t){var e=Vt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Xt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Yt(t){return Wt(t).getComputedStyle(t)}function Qt(t){return["table","td","th"].indexOf(Rt(t))>=0}function Gt(t){return(($t(t)?t.ownerDocument:t.document)||window.document).documentElement}function Zt(t){return"html"===Rt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||Gt(t)}function Jt(t){return zt(t)&&"fixed"!==Yt(t).position?t.offsetParent:null}function te(t){for(var e=Wt(t),i=Jt(t);i&&Qt(i)&&"static"===Yt(i).position;)i=Jt(i);return i&&("html"===Rt(i)||"body"===Rt(i)&&"static"===Yt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Yt(t).position)return null;for(var i=Zt(t);zt(i)&&["html","body"].indexOf(Rt(i))<0;){var n=Yt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function ee(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var ie=Math.max,ne=Math.min,se=Math.round;function oe(t,e,i){return ie(t,ne(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Ut(i.placement),l=ee(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Kt(o),u="y"===l?mt:bt,f="y"===l?gt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=te(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=oe(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Xt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:se(se(e*n)/n)||0,y:se(se(i*n)/n)||0}}(r):"function"==typeof h?h(r):r,u=d.x,f=void 0===u?0:u,p=d.y,m=void 0===p?0:p,g=r.hasOwnProperty("x"),_=r.hasOwnProperty("y"),b=bt,v=mt,y=window;if(c){var w=te(i),E="clientHeight",A="clientWidth";w===Wt(i)&&"static"!==Yt(w=Gt(i)).position&&"absolute"===a&&(E="scrollHeight",A="scrollWidth"),w=w,s!==mt&&(s!==bt&&s!==_t||o!==Et)||(v=gt,m-=w[E]-n.height,m*=l?1:-1),s!==bt&&(s!==mt&&s!==gt||o!==Et)||(b=_t,f-=w[A]-n.width,f*=l?1:-1)}var T,O=Object.assign({position:a},c&&he);return l?Object.assign({},O,((T={})[v]=_?"0":"",T[b]=g?"0":"",T.transform=(y.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",T)):Object.assign({},O,((e={})[v]=_?m+"px":"",e[b]=g?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Ut(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Wt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var me={left:"right",right:"left",bottom:"top",top:"bottom"};function ge(t){return t.replace(/left|right|bottom|top/g,(function(t){return me[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Wt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Vt(Gt(t)).left+ve(t).scrollLeft}function we(t){var e=Yt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Rt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ee(Zt(t))}function Ae(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Wt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ae(Zt(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e){return e===Tt?Te(function(t){var e=Wt(t),i=Gt(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):zt(e)?function(t){var e=Vt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=Gt(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ie(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ie(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Yt(s||i).direction&&(a+=ie(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Gt(t)))}function Ce(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Ut(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case mt:e={x:a,y:i.y-n.height};break;case gt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?ee(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Et:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?At:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ot:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=re("number"!=typeof p?p:ae(p,yt)),g=h===Ot?Ct:Ot,_=t.rects.popper,b=t.elements[u?g:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ae(Zt(t)),i=["absolute","fixed"].indexOf(Yt(t).position)>=0&&zt(t)?te(t):t;return $t(i)?e.filter((function(t){return $t(t)&&Xt(t,i)&&"body"!==Rt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Oe(t,i);return e.top=ie(n.top,e.top),e.right=ne(n.right,e.right),e.bottom=ne(n.bottom,e.bottom),e.left=ie(n.left,e.left),e}),Oe(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}($t(b)?b:b.contextElement||Gt(t.elements.popper),r,l),y=Vt(t.elements.reference),w=Ce({reference:y,element:_,strategy:"absolute",placement:s}),E=Te(Object.assign({},_,w)),A=h===Ot?E:y,T={top:v.top-A.top+m.top,bottom:A.bottom-v.bottom+m.bottom,left:v.left-A.left+m.left,right:A.right-v.right+m.right},O=t.modifiersData.offset;if(h===Ot&&O){var C=O[s];Object.keys(T).forEach((function(t){var e=[_t,gt].indexOf(t)>=0?1:-1,i=[mt,gt].indexOf(t)>=0?"y":"x";T[t]+=C[i]*e}))}return T}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?Lt:l,h=ce(n),d=h?a?kt:kt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Ut(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const xe={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=Ut(g),b=l||(_!==g&&p?function(t){if(Ut(t)===vt)return[];var e=ge(t);return[be(t),e,be(e)]}(g):[ge(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(Ut(i)===vt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O<v.length;O++){var C=v[O],k=Ut(C),L=ce(C)===wt,x=[mt,gt].indexOf(k)>=0,D=x?"width":"height",S=ke(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),N=x?L?_t:bt:L?gt:mt;y[D]>w[D]&&(N=ge(N));var I=ge(N),P=[];if(o&&P.push(S[k]<=0),a&&P.push(S[N]<=0,S[I]<=0),P.every((function(t){return t}))){T=C,A=!1;break}E.set(C,P)}if(A)for(var j=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[mt,_t,gt,bt].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ie={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=Lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Ut(t),s=[bt,mt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Ce({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Ut(e.placement),b=ce(e.placement),v=!b,y=ee(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?mt:bt,L="y"===y?gt:_t,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],N=E[y]-g[L],I=f?-T[x]/2:0,P=b===wt?A[x]:T[x],j=b===wt?-T[x]:-A[x],M=e.elements.arrow,H=f&&M?Kt(M):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=B[k],W=B[L],$=oe(0,A[x],H[x]),z=v?A[x]/2-I-$-R-O:P-$-R-O,q=v?-A[x]/2+I+$+W+O:j+$+W+O,F=e.elements.arrow&&te(e.elements.arrow),U=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-U,X=E[y]+q-V;if(o){var Y=oe(f?ne(S,K):S,D,f?ie(N,X):N);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?mt:bt,G="x"===y?gt:_t,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=oe(f?ne(J,K):J,Z,f?ie(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n=zt(e);zt(e)&&function(t){var e=t.getBoundingClientRect();e.width,t.offsetWidth,e.height,t.offsetHeight}(e);var s,o,r=Gt(e),a=Vt(t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(n||!n&&!i)&&(("body"!==Rt(e)||we(r))&&(l=(s=e)!==Wt(s)&&zt(s)?{scrollLeft:(o=s).scrollLeft,scrollTop:o.scrollTop}:ve(s)),zt(e)?((c=Vt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=ye(r))),{x:a.left+l.scrollLeft-c.x,y:a.top+l.scrollTop-c.y,width:a.width,height:a.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Re(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function We(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?Be:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},Be,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:$t(t)?Ae(t):t.contextElement?Ae(t.contextElement):[],popper:Ae(e)};var r,c,u=function(t){var e=He(t);return Bt.reduce((function(t,i){return t.concat(e.filter((function(t){return t.phase===i})))}),[])}((r=[].concat(n,a.options.modifiers),c=r.reduce((function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=u.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}})),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(Re(e,i)){a.rects={reference:Me(e,te(i),"fixed"===a.options.strategy),popper:Kt(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise((function(t){h.forceUpdate(),t(a)}))},function(){return r||(r=new Promise((function(t){Promise.resolve().then((function(){r=void 0,t(s())}))}))),r}),destroy:function(){d(),c=!0}};if(!Re(t,e))return h;function d(){l.forEach((function(t){return t()})),l=[]}return h.setOptions(i).then((function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)})),h}}var $e=We(),ze=We({defaultModifiers:[pe,Pe,ue,Ft]}),qe=We({defaultModifiers:[pe,Pe,ue,Ft,Ie,xe,je,le,Ne]});const Fe=Object.freeze({__proto__:null,popperGenerator:We,detectOverflow:ke,createPopperBase:$e,createPopper:qe,createPopperLite:ze,top:mt,bottom:gt,right:_t,left:bt,auto:vt,basePlacements:yt,start:wt,end:Et,clippingParents:At,viewport:Tt,popper:Ot,reference:Ct,variationPlacements:kt,placements:Lt,beforeRead:xt,read:Dt,afterRead:St,beforeMain:Nt,main:It,afterMain:Pt,beforeWrite:jt,write:Mt,afterWrite:Ht,modifierPhases:Bt,applyStyles:Ft,arrow:le,computeStyles:ue,eventListeners:pe,flip:xe,hide:Ne,offset:Ie,popperOffsets:Pe,preventOverflow:je}),Ue="dropdown",Ve="Escape",Ke="Space",Xe="ArrowUp",Ye="ArrowDown",Qe=new RegExp("ArrowUp|ArrowDown|Escape"),Ge="click.bs.dropdown.data-api",Ze="keydown.bs.dropdown.data-api",Je="show",ti='[data-bs-toggle="dropdown"]',ei=".dropdown-menu",ii=m()?"top-end":"top-start",ni=m()?"top-start":"top-end",si=m()?"bottom-end":"bottom-start",oi=m()?"bottom-start":"bottom-end",ri=m()?"left-start":"right-start",ai=m()?"right-start":"left-start",li={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},ci={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class hi extends B{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar()}static get Default(){return li}static get DefaultType(){return ci}static get NAME(){return Ue}toggle(){return this._isShown()?this.hide():this.show()}show(){if(c(this._element)||this._isShown(this._menu))return;const t={relatedTarget:this._element};if(j.trigger(this._element,"show.bs.dropdown",t).defaultPrevented)return;const e=hi.getParentFromElement(this._element);this._inNavbar?U.setDataAttribute(this._menu,"popper","none"):this._createPopper(e),"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach((t=>j.on(t,"mouseover",d))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Je),this._element.classList.add(Je),j.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(c(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){j.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._popper&&this._popper.destroy(),this._menu.classList.remove(Je),this._element.classList.remove(Je),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},a(Ue,t,this.constructor.DefaultType),"object"==typeof t.reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===Fe)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:o(this._config.reference)?e=r(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=qe(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(Je)}_getMenuElement(){return V.next(this._element,ei)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ri;if(t.classList.contains("dropstart"))return ai;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ni:ii:e?oi:si}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(l);i.length&&v(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=V.find(ti);for(let i=0,n=e.length;i<n;i++){const n=hi.getInstance(e[i]);if(!n||!1===n._config.autoClose)continue;if(!n._isShown())continue;const s={relatedTarget:n._element};if(t){const e=t.composedPath(),i=e.includes(n._menu);if(e.includes(n._element)||"inside"===n._config.autoClose&&!i||"outside"===n._config.autoClose&&i)continue;if(n._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;"click"===t.type&&(s.clickEvent=t)}n._completeHide(s)}}static getParentFromElement(t){return n(t)||t.parentNode}static dataApiKeydownHandler(t){if(/input|textarea/i.test(t.target.tagName)?t.key===Ke||t.key!==Ve&&(t.key!==Ye&&t.key!==Xe||t.target.closest(ei)):!Qe.test(t.key))return;const e=this.classList.contains(Je);if(!e&&t.key===Ve)return;if(t.preventDefault(),t.stopPropagation(),c(this))return;const i=this.matches(ti)?this:V.prev(this,ti)[0],n=hi.getOrCreateInstance(i);if(t.key!==Ve)return t.key===Xe||t.key===Ye?(e||n.show(),void n._selectMenuItem(t)):void(e&&t.key!==Ke||hi.clearMenus());n.hide()}}j.on(document,Ze,ti,hi.dataApiKeydownHandler),j.on(document,Ze,ei,hi.dataApiKeydownHandler),j.on(document,Ge,hi.clearMenus),j.on(document,"keyup.bs.dropdown.data-api",hi.clearMenus),j.on(document,Ge,ti,(function(t){t.preventDefault(),hi.getOrCreateInstance(this).toggle()})),g(hi);const di=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",ui=".sticky-top";class fi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",(e=>e+t)),this._setElementAttributes(di,"paddingRight",(e=>e+t)),this._setElementAttributes(ui,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(s))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(di,"paddingRight"),this._resetElementAttributes(ui,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&U.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=U.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(U.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){o(t)?e(t):V.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const pi={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},mi={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},gi="show",_i="mousedown.bs.backdrop";class bi{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&u(this._getElement()),this._getElement().classList.add(gi),this._emulateAnimation((()=>{_(t)}))):_(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(gi),this._emulateAnimation((()=>{this.dispose(),_(t)}))):_(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...pi,..."object"==typeof t?t:{}}).rootElement=r(t.rootElement),a("backdrop",t,mi),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),j.on(this._getElement(),_i,(()=>{_(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&(j.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const vi={trapElement:null,autofocus:!0},yi={trapElement:"element",autofocus:"boolean"},wi=".bs.focustrap",Ei="backward";class Ai{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),j.off(document,wi),j.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),j.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,wi))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const n=V.focusableChildren(i);0===n.length?i.focus():this._lastTabNavDirection===Ei?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ei:"forward")}_getConfig(t){return t={...vi,..."object"==typeof t?t:{}},a("focustrap",t,yi),t}}const Ti="modal",Oi="Escape",Ci={backdrop:!0,keyboard:!0,focus:!0},ki={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},Li="hidden.bs.modal",xi="show.bs.modal",Di="resize.bs.modal",Si="click.dismiss.bs.modal",Ni="keydown.dismiss.bs.modal",Ii="mousedown.dismiss.bs.modal",Pi="modal-open",ji="show",Mi="modal-static";class Hi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new fi}static get Default(){return Ci}static get NAME(){return Ti}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(Pi),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),j.on(this._dialog,Ii,(()=>{j.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if(j.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(ji),j.off(this._element,Si),j.off(this._dialog,Ii),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>j.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_getConfig(t){return t={...Ci,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Ti,t,ki),t}_showElement(t){const e=this._isAnimated(),i=V.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||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,i&&(i.scrollTop=0),e&&u(this._element),this._element.classList.add(ji),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?j.on(this._element,Ni,(t=>{this._config.keyboard&&t.key===Oi?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Oi||this._triggerBackdropTransition()})):j.off(this._element,Ni)}_setResizeEvent(){this._isShown?j.on(window,Di,(()=>this._adjustDialog())):j.off(window,Di)}_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(Pi),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,Li)}))}_showBackdrop(t){j.on(this._element,Si,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains(Mi)||(n||(i.overflowY="hidden"),t.add(Mi),this._queueCallback((()=>{t.remove(Mi),n||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!m()||i&&!t&&m())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!m()||!i&&t&&m())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,xi,(t=>{t.defaultPrevented||j.one(e,Li,(()=>{l(this)&&this.focus()}))}));const i=V.findOne(".modal.show");i&&Hi.getInstance(i).hide(),Hi.getOrCreateInstance(e).toggle(this)})),R(Hi),g(Hi);const Bi="offcanvas",Ri={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},$i="show",zi=".offcanvas.show",qi="hidden.bs.offcanvas";class Fi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return Bi}static get Default(){return Ri}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($i),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),j.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove($i),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new fi).reset(),j.trigger(this._element,qi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...Ri,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Bi,t,Wi),t}_initializeBackDrop(){return new bi({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_addEventListeners(){j.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;j.one(e,qi,(()=>{l(this)&&this.focus()}));const i=V.findOne(zi);i&&i!==e&&Fi.getInstance(i).hide(),Fi.getOrCreateInstance(e).toggle(this)})),j.on(window,"load.bs.offcanvas.data-api",(()=>V.find(zi).forEach((t=>Fi.getOrCreateInstance(t).show())))),R(Fi),g(Fi);const Ui=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ki=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Xi=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!Ui.has(i)||Boolean(Vi.test(t.nodeValue)||Ki.test(t.nodeValue));const n=e.filter((t=>t instanceof RegExp));for(let t=0,e=n.length;t<e;t++)if(n[t].test(i))return!0;return!1};function Yi(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(let t=0,i=s.length;t<i;t++){const i=s[t],n=i.nodeName.toLowerCase();if(!Object.keys(e).includes(n)){i.remove();continue}const o=[].concat(...i.attributes),r=[].concat(e["*"]||[],e[n]||[]);o.forEach((t=>{Xi(t,r)||i.removeAttribute(t.nodeName)}))}return n.body.innerHTML}const Qi="tooltip",Gi=new Set(["sanitize","allowList","sanitizeFn"]),Zi={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Ji={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},tn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],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:[]},popperConfig:null},en={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},nn="fade",sn="show",on="show",rn="out",an=".tooltip-inner",ln=".modal",cn="hide.bs.modal",hn="hover",dn="focus";class un extends B{constructor(t,e){if(void 0===Fe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return tn}static get NAME(){return Qi}static get Event(){return en}static get DefaultType(){return Zi}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(sn))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ln),cn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.Event.SHOW),e=h(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(an).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),s=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this._config.animation&&n.classList.add(nn);const o="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,r=this._getAttachment(o);this._addAttachmentClass(r);const{container:a}=this._config;H.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(a.append(n),j.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=qe(this._element,n,this._getPopperConfig(r)),n.classList.add(sn);const l=this._resolvePossibleFunction(this._config.customClass);l&&n.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{j.on(t,"mouseover",d)}));const c=this.tip.classList.contains(nn);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,j.trigger(this._element,this.constructor.Event.SHOWN),t===rn&&this._leave(null,this)}),this.tip,c)}hide(){if(!this._popper)return;const t=this.getTipElement();if(j.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(sn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(nn);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==on&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(nn,sn),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),an)}_sanitizeAndSetContent(t,e,i){const n=V.findOne(i,t);e||!n?this.setElementContent(n,e):n.remove()}setElementContent(t,e){if(null!==t)return o(e)?(e=r(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Yi(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,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:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return Ji[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)j.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===hn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===hn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;j.on(this._element,e,this._config.selector,(t=>this._enter(t))),j.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ln),cn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?dn:hn]=!0),e.getTipElement().classList.contains(sn)||e._hoverState===on?e._hoverState=on:(clearTimeout(e._timeout),e._hoverState=on,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===on&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?dn:hn]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=rn,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===rn&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Gi.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a(Qi,t,this.constructor.DefaultType),t.sanitize&&(t.template=Yi(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn={...un.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'},pn={...un.DefaultType,content:"(string|element|function)"},mn={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class gn extends un{static get Default(){return fn}static get NAME(){return"popover"}static get Event(){return mn}static get DefaultType(){return pn}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=gn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(gn);const _n="scrollspy",bn={offset:10,method:"auto",target:""},vn={offset:"number",method:"string",target:"(string|element)"},yn="active",wn=".nav-link, .list-group-item, .dropdown-item",En="position";class An extends B{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,j.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return bn}static get NAME(){return _n}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":En,e="auto"===this._config.method?t:this._config.method,n=e===En?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),V.find(wn,this._config.target).map((t=>{const s=i(t),o=s?V.findOne(s):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[U[e](o).top+n,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){j.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...bn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=r(t.target)||document.documentElement,a(_n,t,vn),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t<this._offsets[e+1])&&this._activate(this._targets[e])}}_activate(t){this._activeTarget=t,this._clear();const e=wn.split(",").map((e=>`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=V.findOne(e.join(","),this._config.target);i.classList.add(yn),i.classList.contains("dropdown-item")?V.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(yn):V.parents(i,".nav, .list-group").forEach((t=>{V.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(yn))),V.prev(t,".nav-item").forEach((t=>{V.children(t,".nav-link").forEach((t=>t.classList.add(yn)))}))})),j.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){V.find(wn,this._config.target).filter((t=>t.classList.contains(yn))).forEach((t=>t.classList.remove(yn)))}static jQueryInterface(t){return this.each((function(){const e=An.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,"load.bs.scrollspy.data-api",(()=>{V.find('[data-bs-spy="scroll"]').forEach((t=>new An(t)))})),g(An);const Tn="active",On="fade",Cn="show",kn=".active",Ln=":scope > li > .active";class xn extends B{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Tn))return;let t;const e=n(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?Ln:kn;t=V.find(e,i),t=t[t.length-1]}const s=t?j.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(j.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const o=()=>{j.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),j.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?V.children(e,kn):V.find(Ln,e))[0],s=i&&n&&n.classList.contains(On),o=()=>this._transitionComplete(t,n,i);n&&s?(n.classList.remove(Cn),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Tn);const t=V.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Tn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Tn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),u(t),t.classList.contains(On)&&t.classList.add(Cn);let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&V.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Tn))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||xn.getOrCreateInstance(this).show()})),g(xn);const Dn="toast",Sn="hide",Nn="show",In="showing",Pn={animation:"boolean",autohide:"boolean",delay:"number"},jn={animation:!0,autohide:!0,delay:5e3};class Mn extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Pn}static get Default(){return jn}static get NAME(){return Dn}show(){j.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Sn),u(this._element),this._element.classList.add(Nn),this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.remove(In),j.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(Nn)&&(j.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.add(Sn),this._element.classList.remove(In),this._element.classList.remove(Nn),j.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(Nn)&&this._element.classList.remove(Nn),super.dispose()}_getConfig(t){return t={...jn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},a(Dn,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),j.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Mn),g(Mn),{Alert:W,Button:z,Carousel:st,Collapse:pt,Dropdown:hi,Modal:Hi,Offcanvas:Fi,Popover:gn,ScrollSpy:An,Tab:xn,Toast:Mn,Tooltip:un}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js.map b/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js.map new file mode 100644 index 00000000..7d78e32a --- /dev/null +++ b/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["TRANSITION_END","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","document","querySelector","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","querySelectorAll","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","static","getInstance","VERSION","Error","enableDismissTrigger","component","method","clickEvent","tagName","closest","getOrCreateInstance","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","position","offsetTop","offsetLeft","SelectorEngine","find","concat","Element","prototype","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","EVENT_SLID","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE_ITEM","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","hasPointerPenTouch","pointerType","start","clientX","touches","move","end","clearTimeout","itemImg","add","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElem","_selector","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activesData","actives","container","tempActiveData","elemActive","dimension","_getDimension","style","scrollSize","triggerArrayLength","selected","triggerArray","isOpen","bottom","right","auto","basePlacements","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","styles","assign","effect","_ref2","initialStyles","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","includeScale","width","height","x","y","getLayoutRect","clientRect","offsetWidth","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","userAgent","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","round","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","_ref3","dpr","devicePixelRatio","roundOffsetsByDPR","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","computeStyles$1","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","scrollTop","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","visualViewport","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","html","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_min","_max","_preventedOffset","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","_len","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref3$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ESCAPE_KEY","SPACE_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","REGEXP_KEYDOWN","EVENT_CLICK_DATA_API","EVENT_KEYDOWN_DATA_API","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","isDisplayStatic","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","items","toggles","context","composedPath","isMenuTarget","isActive","stopPropagation","getToggleButton","clearMenus","dataApiKeydownHandler","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","styleProp","scrollbarWidth","_applyManipulationCallback","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","className","rootElement","clickCallback","EVENT_MOUSEDOWN","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","trapElement","autofocus","TAB_NAV_BACKWARD","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","EVENT_HIDDEN","EVENT_SHOW","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","_triggerBackdropTransition","_resetAdjustments","currentTarget","isModalOverflowing","isBodyOverflowing","paddingLeft","paddingRight","showEvent","allReadyOpen","OPEN_SELECTOR","Offcanvas","visibility","blur","uriAttributes","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","regExp","attributeRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","DISALLOWED_ATTRIBUTES","animation","template","title","delay","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","CLASS_NAME_FADE","HOVER_STATE_SHOW","HOVER_STATE_OUT","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","_disposePopper","isWithContent","shadowRoot","isInTheDom","getTitle","tipId","prefix","floor","random","getElementById","getUID","attachment","_getAttachment","_addAttachmentClass","_resolvePossibleFunction","prevHoverState","_cleanTipClass","setContent","_sanitizeAndSetContent","content","templateElement","setElementContent","textContent","updateAttachment","_getDelegateConfig","_handlePopperPlacementChange","_getBasicClassPrefix","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","basicClassPrefixRegex","tabClass","token","tClass","Popover","_getContent","SELECTOR_LINK_ITEMS","METHOD_POSITION","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","listGroup","navItem","spy","SELECTOR_ACTIVE","SELECTOR_ACTIVE_UL","Tab","listElement","itemSelector","hideEvent","complete","active","isTransitioning","_transitionComplete","dropdownChild","dropdownElement","dropdown","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":";;;;;0OAOA,MAEMA,EAAiB,gBAyBjBC,EAAcC,IAClB,IAAIC,EAAWD,EAAQE,aAAa,kBAEpC,IAAKD,GAAyB,MAAbA,EAAkB,CACjC,IAAIE,EAAWH,EAAQE,aAAa,QAMpC,IAAKC,IAAcA,EAASC,SAAS,OAASD,EAASE,WAAW,KAChE,OAAO,KAILF,EAASC,SAAS,OAASD,EAASE,WAAW,OACjDF,EAAY,IAAGA,EAASG,MAAM,KAAK,MAGrCL,EAAWE,GAAyB,MAAbA,EAAmBA,EAASI,OAAS,KAG9D,OAAON,GAGHO,EAAyBR,IAC7B,MAAMC,EAAWF,EAAYC,GAE7B,OAAIC,GACKQ,SAASC,cAAcT,GAAYA,EAGrC,MAGHU,EAAyBX,IAC7B,MAAMC,EAAWF,EAAYC,GAE7B,OAAOC,EAAWQ,SAASC,cAAcT,GAAY,MA0BjDW,EAAuBZ,IAC3BA,EAAQa,cAAc,IAAIC,MAAMhB,KAG5BiB,EAAYC,MACXA,GAAsB,iBAARA,UAIO,IAAfA,EAAIC,SACbD,EAAMA,EAAI,SAGmB,IAAjBA,EAAIE,UAGdC,EAAaH,GACbD,EAAUC,GACLA,EAAIC,OAASD,EAAI,GAAKA,EAGZ,iBAARA,GAAoBA,EAAII,OAAS,EACnCX,SAASC,cAAcM,GAGzB,KAGHK,EAAkB,CAACC,EAAeC,EAAQC,KAC9CC,OAAOC,KAAKF,GAAaG,SAAQC,IAC/B,MAAMC,EAAgBL,EAAYI,GAC5BE,EAAQP,EAAOK,GACfG,EAAYD,GAASf,EAAUe,GAAS,UArH5Cd,OADSA,EAsHsDc,GApHzD,GAAEd,IAGL,GAAGgB,SAASC,KAAKjB,GAAKkB,MAAM,eAAe,GAAGC,cALxCnB,IAAAA,EAwHX,IAAK,IAAIoB,OAAOP,GAAeQ,KAAKN,GAClC,MAAM,IAAIO,UACP,GAAEhB,EAAciB,0BAA0BX,qBAA4BG,yBAAiCF,WAM1GW,EAAYxC,MACXe,EAAUf,IAAgD,IAApCA,EAAQyC,iBAAiBrB,SAIgB,YAA7DsB,iBAAiB1C,GAAS2C,iBAAiB,cAG9CC,EAAa5C,IACZA,GAAWA,EAAQkB,WAAa2B,KAAKC,gBAItC9C,EAAQ+C,UAAUC,SAAS,mBAIC,IAArBhD,EAAQiD,SACVjD,EAAQiD,SAGVjD,EAAQkD,aAAa,aAAoD,UAArClD,EAAQE,aAAa,aAG5DiD,EAAiBnD,IACrB,IAAKS,SAAS2C,gBAAgBC,aAC5B,OAAO,KAIT,GAAmC,mBAAxBrD,EAAQsD,YAA4B,CAC7C,MAAMC,EAAOvD,EAAQsD,cACrB,OAAOC,aAAgBC,WAAaD,EAAO,KAG7C,OAAIvD,aAAmBwD,WACdxD,EAIJA,EAAQyD,WAINN,EAAenD,EAAQyD,YAHrB,MAMLC,EAAO,OAUPC,EAAS3D,IAEbA,EAAQ4D,cAGJC,EAAY,KAChB,MAAMC,OAAEA,GAAWC,OAEnB,OAAID,IAAWrD,SAASuD,KAAKd,aAAa,qBACjCY,EAGF,MAGHG,EAA4B,GAiB5BC,EAAQ,IAAuC,QAAjCzD,SAAS2C,gBAAgBe,IAEvCC,EAAqBC,IAjBAC,IAAAA,EAAAA,EAkBN,KACjB,MAAMC,EAAIV,IAEV,GAAIU,EAAG,CACL,MAAMC,EAAOH,EAAOI,KACdC,EAAqBH,EAAEI,GAAGH,GAChCD,EAAEI,GAAGH,GAAQH,EAAOO,gBACpBL,EAAEI,GAAGH,GAAMK,YAAcR,EACzBE,EAAEI,GAAGH,GAAMM,WAAa,KACtBP,EAAEI,GAAGH,GAAQE,EACNL,EAAOO,mBA3BQ,YAAxBnE,SAASsE,YAENd,EAA0B7C,QAC7BX,SAASuE,iBAAiB,oBAAoB,KAC5Cf,EAA0BtC,SAAQ2C,GAAYA,SAIlDL,EAA0BgB,KAAKX,IAE/BA,KAuBEY,EAAUZ,IACU,mBAAbA,GACTA,KAIEa,EAAyB,CAACb,EAAUc,EAAmBC,GAAoB,KAC/E,IAAKA,EAEH,YADAH,EAAQZ,GAIV,MACMgB,EA1LiCtF,CAAAA,IACvC,IAAKA,EACH,OAAO,EAIT,IAAIuF,mBAAEA,EAAFC,gBAAsBA,GAAoBzB,OAAOrB,iBAAiB1C,GAEtE,MAAMyF,EAA0BC,OAAOC,WAAWJ,GAC5CK,EAAuBF,OAAOC,WAAWH,GAG/C,OAAKC,GAA4BG,GAKjCL,EAAqBA,EAAmBjF,MAAM,KAAK,GACnDkF,EAAkBA,EAAgBlF,MAAM,KAAK,GArFf,KAuFtBoF,OAAOC,WAAWJ,GAAsBG,OAAOC,WAAWH,KAPzD,GA6KgBK,CAAiCT,GADlC,EAGxB,IAAIU,GAAS,EAEb,MAAMC,EAAU,EAAGC,OAAAA,MACbA,IAAWZ,IAIfU,GAAS,EACTV,EAAkBa,oBAAoBnG,EAAgBiG,GACtDb,EAAQZ,KAGVc,EAAkBJ,iBAAiBlF,EAAgBiG,GACnDG,YAAW,KACJJ,GACHlF,EAAqBwE,KAEtBE,IAYCa,EAAuB,CAACC,EAAMC,EAAeC,EAAeC,KAChE,IAAIC,EAAQJ,EAAKK,QAAQJ,GAGzB,IAAe,IAAXG,EACF,OAAOJ,GAAME,GAAiBC,EAAiBH,EAAKhF,OAAS,EAAI,GAGnE,MAAMsF,EAAaN,EAAKhF,OAQxB,OANAoF,GAASF,EAAgB,GAAK,EAE1BC,IACFC,GAASA,EAAQE,GAAcA,GAG1BN,EAAKO,KAAKC,IAAI,EAAGD,KAAKE,IAAIL,EAAOE,EAAa,MCrSjDI,EAAiB,qBACjBC,EAAiB,OACjBC,EAAgB,SAChBC,EAAgB,GACtB,IAAIC,EAAW,EACf,MAAMC,EAAe,CACnBC,WAAY,YACZC,WAAY,YAERC,EAAoB,4BACpBC,EAAe,IAAIC,IAAI,CAC3B,QACA,WACA,UACA,YACA,cACA,aACA,iBACA,YACA,WACA,YACA,cACA,YACA,UACA,WACA,QACA,oBACA,aACA,YACA,WACA,cACA,cACA,cACA,YACA,eACA,gBACA,eACA,gBACA,aACA,QACA,OACA,SACA,QACA,SACA,SACA,UACA,WACA,OACA,SACA,eACA,SACA,OACA,mBACA,mBACA,QACA,QACA,WASF,SAASC,EAAYzH,EAAS0H,GAC5B,OAAQA,GAAQ,GAAEA,MAAQR,OAAiBlH,EAAQkH,UAAYA,IAGjE,SAASS,EAAS3H,GAChB,MAAM0H,EAAMD,EAAYzH,GAKxB,OAHAA,EAAQkH,SAAWQ,EACnBT,EAAcS,GAAOT,EAAcS,IAAQ,GAEpCT,EAAcS,GAsCvB,SAASE,EAAYC,EAAQ9B,EAAS+B,EAAqB,MACzD,MAAMC,EAAetG,OAAOC,KAAKmG,GAEjC,IAAK,IAAIG,EAAI,EAAGC,EAAMF,EAAa3G,OAAQ4G,EAAIC,EAAKD,IAAK,CACvD,MAAME,EAAQL,EAAOE,EAAaC,IAElC,GAAIE,EAAMC,kBAAoBpC,GAAWmC,EAAMJ,qBAAuBA,EACpE,OAAOI,EAIX,OAAO,KAGT,SAASE,EAAgBC,EAAmBtC,EAASuC,GACnD,MAAMC,EAAgC,iBAAZxC,EACpBoC,EAAkBI,EAAaD,EAAevC,EAEpD,IAAIyC,EAAYC,EAAaJ,GAO7B,OANiBd,EAAamB,IAAIF,KAGhCA,EAAYH,GAGP,CAACE,EAAYJ,EAAiBK,GAGvC,SAASG,EAAW3I,EAASqI,EAAmBtC,EAASuC,EAAcM,GACrE,GAAiC,iBAAtBP,IAAmCrI,EAC5C,OAUF,GAPK+F,IACHA,EAAUuC,EACVA,EAAe,MAKbhB,EAAkBjF,KAAKgG,GAAoB,CAC7C,MAAMQ,EAASlE,GACN,SAAUuD,GACf,IAAKA,EAAMY,eAAkBZ,EAAMY,gBAAkBZ,EAAMa,iBAAmBb,EAAMa,eAAe/F,SAASkF,EAAMY,eAChH,OAAOnE,EAAG1C,KAAK+G,KAAMd,IAKvBI,EACFA,EAAeO,EAAOP,GAEtBvC,EAAU8C,EAAO9C,GAIrB,MAAOwC,EAAYJ,EAAiBK,GAAaJ,EAAgBC,EAAmBtC,EAASuC,GACvFT,EAASF,EAAS3H,GAClBiJ,EAAWpB,EAAOW,KAAeX,EAAOW,GAAa,IACrDU,EAAatB,EAAYqB,EAAUd,EAAiBI,EAAaxC,EAAU,MAEjF,GAAImD,EAGF,YAFAA,EAAWN,OAASM,EAAWN,QAAUA,GAK3C,MAAMlB,EAAMD,EAAYU,EAAiBE,EAAkBc,QAAQrC,EAAgB,KAC7EnC,EAAK4D,EA3Fb,SAAoCvI,EAASC,EAAU0E,GACrD,OAAO,SAASoB,EAAQmC,GACtB,MAAMkB,EAAcpJ,EAAQqJ,iBAAiBpJ,GAE7C,IAAK,IAAI+F,OAAEA,GAAWkC,EAAOlC,GAAUA,IAAWgD,KAAMhD,EAASA,EAAOvC,WACtE,IAAK,IAAIuE,EAAIoB,EAAYhI,OAAQ4G,KAC/B,GAAIoB,EAAYpB,KAAOhC,EAOrB,OANAkC,EAAMa,eAAiB/C,EAEnBD,EAAQ6C,QACVU,EAAaC,IAAIvJ,EAASkI,EAAMsB,KAAMvJ,EAAU0E,GAG3CA,EAAG8E,MAAMzD,EAAQ,CAACkC,IAM/B,OAAO,MAyEPwB,CAA2B1J,EAAS+F,EAASuC,GAxGjD,SAA0BtI,EAAS2E,GACjC,OAAO,SAASoB,EAAQmC,GAOtB,OANAA,EAAMa,eAAiB/I,EAEnB+F,EAAQ6C,QACVU,EAAaC,IAAIvJ,EAASkI,EAAMsB,KAAM7E,GAGjCA,EAAG8E,MAAMzJ,EAAS,CAACkI,KAiG1ByB,CAAiB3J,EAAS+F,GAE5BpB,EAAGmD,mBAAqBS,EAAaxC,EAAU,KAC/CpB,EAAGwD,gBAAkBA,EACrBxD,EAAGiE,OAASA,EACZjE,EAAGuC,SAAWQ,EACduB,EAASvB,GAAO/C,EAEhB3E,EAAQgF,iBAAiBwD,EAAW7D,EAAI4D,GAG1C,SAASqB,EAAc5J,EAAS6H,EAAQW,EAAWzC,EAAS+B,GAC1D,MAAMnD,EAAKiD,EAAYC,EAAOW,GAAYzC,EAAS+B,GAE9CnD,IAIL3E,EAAQiG,oBAAoBuC,EAAW7D,EAAIkF,QAAQ/B,WAC5CD,EAAOW,GAAW7D,EAAGuC,WAe9B,SAASuB,EAAaP,GAGpB,OADAA,EAAQA,EAAMiB,QAAQpC,EAAgB,IAC/BI,EAAae,IAAUA,EAGhC,MAAMoB,EAAe,CACnBQ,GAAG9J,EAASkI,EAAOnC,EAASuC,GAC1BK,EAAW3I,EAASkI,EAAOnC,EAASuC,GAAc,IAGpDyB,IAAI/J,EAASkI,EAAOnC,EAASuC,GAC3BK,EAAW3I,EAASkI,EAAOnC,EAASuC,GAAc,IAGpDiB,IAAIvJ,EAASqI,EAAmBtC,EAASuC,GACvC,GAAiC,iBAAtBD,IAAmCrI,EAC5C,OAGF,MAAOuI,EAAYJ,EAAiBK,GAAaJ,EAAgBC,EAAmBtC,EAASuC,GACvF0B,EAAcxB,IAAcH,EAC5BR,EAASF,EAAS3H,GAClBiK,EAAc5B,EAAkBhI,WAAW,KAEjD,QAA+B,IAApB8H,EAAiC,CAE1C,IAAKN,IAAWA,EAAOW,GACrB,OAIF,YADAoB,EAAc5J,EAAS6H,EAAQW,EAAWL,EAAiBI,EAAaxC,EAAU,MAIhFkE,GACFxI,OAAOC,KAAKmG,GAAQlG,SAAQuI,KAhDlC,SAAkClK,EAAS6H,EAAQW,EAAW2B,GAC5D,MAAMC,EAAoBvC,EAAOW,IAAc,GAE/C/G,OAAOC,KAAK0I,GAAmBzI,SAAQ0I,IACrC,GAAIA,EAAWjK,SAAS+J,GAAY,CAClC,MAAMjC,EAAQkC,EAAkBC,GAEhCT,EAAc5J,EAAS6H,EAAQW,EAAWN,EAAMC,gBAAiBD,EAAMJ,wBA0CrEwC,CAAyBtK,EAAS6H,EAAQqC,EAAc7B,EAAkBkC,MAAM,OAIpF,MAAMH,EAAoBvC,EAAOW,IAAc,GAC/C/G,OAAOC,KAAK0I,GAAmBzI,SAAQ6I,IACrC,MAAMH,EAAaG,EAAYrB,QAAQnC,EAAe,IAEtD,IAAKgD,GAAe3B,EAAkBjI,SAASiK,GAAa,CAC1D,MAAMnC,EAAQkC,EAAkBI,GAEhCZ,EAAc5J,EAAS6H,EAAQW,EAAWN,EAAMC,gBAAiBD,EAAMJ,yBAK7E2C,QAAQzK,EAASkI,EAAOwC,GACtB,GAAqB,iBAAVxC,IAAuBlI,EAChC,OAAO,KAGT,MAAMuE,EAAIV,IACJ2E,EAAYC,EAAaP,GACzB8B,EAAc9B,IAAUM,EACxBmC,EAAWpD,EAAamB,IAAIF,GAElC,IAAIoC,EACAC,GAAU,EACVC,GAAiB,EACjBC,GAAmB,EACnBC,EAAM,KA4CV,OA1CIhB,GAAezF,IACjBqG,EAAcrG,EAAEzD,MAAMoH,EAAOwC,GAE7BnG,EAAEvE,GAASyK,QAAQG,GACnBC,GAAWD,EAAYK,uBACvBH,GAAkBF,EAAYM,gCAC9BH,EAAmBH,EAAYO,sBAG7BR,GACFK,EAAMvK,SAAS2K,YAAY,cAC3BJ,EAAIK,UAAU7C,EAAWqC,GAAS,IAElCG,EAAM,IAAIM,YAAYpD,EAAO,CAC3B2C,QAAAA,EACAU,YAAY,SAKI,IAATb,GACTjJ,OAAOC,KAAKgJ,GAAM/I,SAAQ6J,IACxB/J,OAAOgK,eAAeT,EAAKQ,EAAK,CAC9BE,IAAG,IACMhB,EAAKc,QAMhBT,GACFC,EAAIW,iBAGFb,GACF9K,EAAQa,cAAcmK,GAGpBA,EAAID,uBAA2C,IAAhBH,GACjCA,EAAYe,iBAGPX,IC1ULY,EAAa,IAAIC,IAEvBC,EAAe,CACbC,IAAI/L,EAASwL,EAAKQ,GACXJ,EAAWlD,IAAI1I,IAClB4L,EAAWG,IAAI/L,EAAS,IAAI6L,KAG9B,MAAMI,EAAcL,EAAWF,IAAI1L,GAI9BiM,EAAYvD,IAAI8C,IAA6B,IAArBS,EAAYC,KAMzCD,EAAYF,IAAIP,EAAKQ,GAJnBG,QAAQC,MAAO,+EAA8EC,MAAMC,KAAKL,EAAYvK,QAAQ,QAOhIgK,IAAG,CAAC1L,EAASwL,IACPI,EAAWlD,IAAI1I,IACV4L,EAAWF,IAAI1L,GAAS0L,IAAIF,IAG9B,KAGTe,OAAOvM,EAASwL,GACd,IAAKI,EAAWlD,IAAI1I,GAClB,OAGF,MAAMiM,EAAcL,EAAWF,IAAI1L,GAEnCiM,EAAYO,OAAOhB,GAGM,IAArBS,EAAYC,MACdN,EAAWY,OAAOxM,KC/BxB,MAAMyM,EACJC,YAAY1M,IACVA,EAAUmB,EAAWnB,MAMrBgJ,KAAK2D,SAAW3M,EAChB8L,EAAKC,IAAI/C,KAAK2D,SAAU3D,KAAK0D,YAAYE,SAAU5D,OAGrD6D,UACEf,EAAKS,OAAOvD,KAAK2D,SAAU3D,KAAK0D,YAAYE,UAC5CtD,EAAaC,IAAIP,KAAK2D,SAAU3D,KAAK0D,YAAYI,WAEjDrL,OAAOsL,oBAAoB/D,MAAMrH,SAAQqL,IACvChE,KAAKgE,GAAgB,QAIzBC,eAAe3I,EAAUtE,EAASkN,GAAa,GAC7C/H,EAAuBb,EAAUtE,EAASkN,GAK1BC,mBAACnN,GACjB,OAAO8L,EAAKJ,IAAIvK,EAAWnB,GAAUgJ,KAAK4D,UAGlBO,2BAACnN,EAASuB,EAAS,IAC3C,OAAOyH,KAAKoE,YAAYpN,IAAY,IAAIgJ,KAAKhJ,EAA2B,iBAAXuB,EAAsBA,EAAS,MAGnF8L,qBACT,MAtCY,QAyCH5I,kBACT,MAAM,IAAI6I,MAAM,uEAGPV,sBACT,MAAQ,MAAK5D,KAAKvE,OAGTqI,uBACT,MAAQ,IAAG9D,KAAK4D,YC5DpB,MAAMW,EAAuB,CAACC,EAAWC,EAAS,UAChD,MAAMC,EAAc,gBAAeF,EAAUV,YACvCtI,EAAOgJ,EAAU/I,KAEvB6E,EAAaQ,GAAGrJ,SAAUiN,EAAa,qBAAoBlJ,OAAU,SAAU0D,GAK7E,GAJI,CAAC,IAAK,QAAQ9H,SAAS4I,KAAK2E,UAC9BzF,EAAMyD,iBAGJ/I,EAAWoG,MACb,OAGF,MAAMhD,EAASrF,EAAuBqI,OAASA,KAAK4E,QAAS,IAAGpJ,KAC/CgJ,EAAUK,oBAAoB7H,GAGtCyH,SCMb,MAAMK,UAAcrB,EAGPhI,kBACT,MAnBS,QAwBXsJ,QAGE,GAFmBzE,EAAamB,QAAQzB,KAAK2D,SArB5B,kBAuBF5B,iBACb,OAGF/B,KAAK2D,SAAS5J,UAAUwJ,OAxBJ,QA0BpB,MAAMW,EAAalE,KAAK2D,SAAS5J,UAAUC,SA3BvB,QA4BpBgG,KAAKiE,gBAAe,IAAMjE,KAAKgF,mBAAmBhF,KAAK2D,SAAUO,GAInEc,kBACEhF,KAAK2D,SAASJ,SACdjD,EAAamB,QAAQzB,KAAK2D,SAnCR,mBAoClB3D,KAAK6D,UAKeM,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOJ,EAAMD,oBAAoB7E,MAEvC,GAAsB,iBAAXzH,EAAX,CAIA,QAAqB4M,IAAjBD,EAAK3M,IAAyBA,EAAOlB,WAAW,MAAmB,gBAAXkB,EAC1D,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,GAAQyH,WAWnBuE,EAAqBO,EAAO,SAS5B1J,EAAmB0J,GC/EnB,MAOMM,EAAuB,4BAU7B,MAAMC,UAAe5B,EAGRhI,kBACT,MArBS,SA0BX6J,SAEEtF,KAAK2D,SAAS4B,aAAa,eAAgBvF,KAAK2D,SAAS5J,UAAUuL,OAvB7C,WA4BFnB,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOG,EAAOR,oBAAoB7E,MAEzB,WAAXzH,GACF2M,EAAK3M,SChDb,SAASiN,EAAcC,GACrB,MAAY,SAARA,GAIQ,UAARA,IAIAA,IAAQ/I,OAAO+I,GAAKzM,WACf0D,OAAO+I,GAGJ,KAARA,GAAsB,SAARA,EACT,KAGFA,GAGT,SAASC,EAAiBlD,GACxB,OAAOA,EAAIrC,QAAQ,UAAUwF,GAAQ,IAAGA,EAAIxM,kBDuC9CmH,EAAaQ,GAAGrJ,SAzCc,2BAyCkB2N,GAAsBlG,IACpEA,EAAMyD,iBAEN,MAAMiD,EAAS1G,EAAMlC,OAAO4H,QAAQQ,GACvBC,EAAOR,oBAAoBe,GAEnCN,YAUPlK,EAAmBiK,GCpDnB,MAAMQ,EAAc,CAClBC,iBAAiB9O,EAASwL,EAAK1J,GAC7B9B,EAAQuO,aAAc,WAAUG,EAAiBlD,KAAQ1J,IAG3DiN,oBAAoB/O,EAASwL,GAC3BxL,EAAQgP,gBAAiB,WAAUN,EAAiBlD,OAGtDyD,kBAAkBjP,GAChB,IAAKA,EACH,MAAO,GAGT,MAAMkP,EAAa,GAUnB,OARAzN,OAAOC,KAAK1B,EAAQmP,SACjBC,QAAO5D,GAAOA,EAAInL,WAAW,QAC7BsB,SAAQ6J,IACP,IAAI6D,EAAU7D,EAAIrC,QAAQ,MAAO,IACjCkG,EAAUA,EAAQC,OAAO,GAAGnN,cAAgBkN,EAAQ9E,MAAM,EAAG8E,EAAQjO,QACrE8N,EAAWG,GAAWb,EAAcxO,EAAQmP,QAAQ3D,OAGjD0D,GAGTK,iBAAgB,CAACvP,EAASwL,IACjBgD,EAAcxO,EAAQE,aAAc,WAAUwO,EAAiBlD,OAGxEgE,OAAOxP,GACL,MAAMyP,EAAOzP,EAAQ0P,wBAErB,MAAO,CACLC,IAAKF,EAAKE,IAAM5L,OAAO6L,YACvBC,KAAMJ,EAAKI,KAAO9L,OAAO+L,cAI7BC,SAAS/P,IACA,CACL2P,IAAK3P,EAAQgQ,UACbH,KAAM7P,EAAQiQ,cCzDdC,EAAiB,CACrBC,KAAI,CAAClQ,EAAUD,EAAUS,SAAS2C,kBACzB,GAAGgN,UAAUC,QAAQC,UAAUjH,iBAAiBpH,KAAKjC,EAASC,IAGvEsQ,QAAO,CAACtQ,EAAUD,EAAUS,SAAS2C,kBAC5BiN,QAAQC,UAAU5P,cAAcuB,KAAKjC,EAASC,GAGvDuQ,SAAQ,CAACxQ,EAASC,IACT,GAAGmQ,UAAUpQ,EAAQwQ,UACzBpB,QAAOqB,GAASA,EAAMC,QAAQzQ,KAGnC0Q,QAAQ3Q,EAASC,GACf,MAAM0Q,EAAU,GAEhB,IAAIC,EAAW5Q,EAAQyD,WAEvB,KAAOmN,GAAYA,EAAS1P,WAAa2B,KAAKC,cArBhC,IAqBgD8N,EAAS1P,UACjE0P,EAASF,QAAQzQ,IACnB0Q,EAAQ1L,KAAK2L,GAGfA,EAAWA,EAASnN,WAGtB,OAAOkN,GAGTE,KAAK7Q,EAASC,GACZ,IAAI6Q,EAAW9Q,EAAQ+Q,uBAEvB,KAAOD,GAAU,CACf,GAAIA,EAASJ,QAAQzQ,GACnB,MAAO,CAAC6Q,GAGVA,EAAWA,EAASC,uBAGtB,MAAO,IAGTC,KAAKhR,EAASC,GACZ,IAAI+Q,EAAOhR,EAAQiR,mBAEnB,KAAOD,GAAM,CACX,GAAIA,EAAKN,QAAQzQ,GACf,MAAO,CAAC+Q,GAGVA,EAAOA,EAAKC,mBAGd,MAAO,IAGTC,kBAAkBlR,GAChB,MAAMmR,EAAa,CACjB,IACA,SACA,QACA,WACA,SACA,UACA,aACA,4BACAC,KAAInR,GAAa,GAAEA,2BAAiCoR,KAAK,MAE3D,OAAOrI,KAAKmH,KAAKgB,EAAYnR,GAASoP,QAAOkC,IAAO1O,EAAW0O,IAAO9O,EAAU8O,OC3D9E7M,EAAO,WAUP8M,EAAU,CACdC,SAAU,IACVC,UAAU,EACVC,OAAO,EACPC,MAAO,QACPC,MAAM,EACNC,OAAO,GAGHC,EAAc,CAClBN,SAAU,mBACVC,SAAU,UACVC,MAAO,mBACPC,MAAO,mBACPC,KAAM,UACNC,MAAO,WAGHE,EAAa,OACbC,EAAa,OACbC,EAAiB,OACjBC,EAAkB,QAElBC,GAAmB,CACvBC,UAAkBF,EAClBG,WAAmBJ,GAIfK,GAAc,mBAcdC,GAAoB,SASpBC,GAAuB,wBAiB7B,MAAMC,WAAiBhG,EACrBC,YAAY1M,EAASuB,GACnBmR,MAAM1S,GAENgJ,KAAK2J,OAAS,KACd3J,KAAK4J,UAAY,KACjB5J,KAAK6J,eAAiB,KACtB7J,KAAK8J,WAAY,EACjB9J,KAAK+J,YAAa,EAClB/J,KAAKgK,aAAe,KACpBhK,KAAKiK,YAAc,EACnBjK,KAAKkK,YAAc,EAEnBlK,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAKqK,mBAAqBnD,EAAeK,QA3BjB,uBA2B8CvH,KAAK2D,UAC3E3D,KAAKsK,gBAAkB,iBAAkB7S,SAAS2C,iBAAmBmQ,UAAUC,eAAiB,EAChGxK,KAAKyK,cAAgB5J,QAAQ9F,OAAO2P,cAEpC1K,KAAK2K,qBAKIpC,qBACT,OAAOA,EAGE9M,kBACT,OAAOA,EAKTuM,OACEhI,KAAK4K,OAAO7B,GAGd8B,mBAGOpT,SAASqT,QAAUtR,EAAUwG,KAAK2D,WACrC3D,KAAKgI,OAITH,OACE7H,KAAK4K,OAAO5B,GAGdL,MAAMzJ,GACCA,IACHc,KAAK8J,WAAY,GAGf5C,EAAeK,QApEI,2CAoEwBvH,KAAK2D,YAClD/L,EAAqBoI,KAAK2D,UAC1B3D,KAAK+K,OAAM,IAGbC,cAAchL,KAAK4J,WACnB5J,KAAK4J,UAAY,KAGnBmB,MAAM7L,GACCA,IACHc,KAAK8J,WAAY,GAGf9J,KAAK4J,YACPoB,cAAchL,KAAK4J,WACnB5J,KAAK4J,UAAY,MAGf5J,KAAKmK,SAAWnK,KAAKmK,QAAQ3B,WAAaxI,KAAK8J,YACjD9J,KAAKiL,kBAELjL,KAAK4J,UAAYsB,aACdzT,SAAS0T,gBAAkBnL,KAAK6K,gBAAkB7K,KAAKgI,MAAMoD,KAAKpL,MACnEA,KAAKmK,QAAQ3B,WAKnB6C,GAAG7N,GACDwC,KAAK6J,eAAiB3C,EAAeK,QAAQiC,GAAsBxJ,KAAK2D,UACxE,MAAM2H,EAActL,KAAKuL,cAAcvL,KAAK6J,gBAE5C,GAAIrM,EAAQwC,KAAK2J,OAAOvR,OAAS,GAAKoF,EAAQ,EAC5C,OAGF,GAAIwC,KAAK+J,WAEP,YADAzJ,EAAaS,IAAIf,KAAK2D,SAAU2F,IAAY,IAAMtJ,KAAKqL,GAAG7N,KAI5D,GAAI8N,IAAgB9N,EAGlB,OAFAwC,KAAK2I,aACL3I,KAAK+K,QAIP,MAAMS,EAAQhO,EAAQ8N,EACpBvC,EACAC,EAEFhJ,KAAK4K,OAAOY,EAAOxL,KAAK2J,OAAOnM,IAKjC4M,WAAW7R,GAOT,OANAA,EAAS,IACJgQ,KACA1C,EAAYI,kBAAkBjG,KAAK2D,aAChB,iBAAXpL,EAAsBA,EAAS,IAE5CF,EAAgBoD,EAAMlD,EAAQuQ,GACvBvQ,EAGTkT,eACE,MAAMC,EAAY/N,KAAKgO,IAAI3L,KAAKkK,aAEhC,GAAIwB,GAnMgB,GAoMlB,OAGF,MAAME,EAAYF,EAAY1L,KAAKkK,YAEnClK,KAAKkK,YAAc,EAEd0B,GAIL5L,KAAK4K,OAAOgB,EAAY,EAAI1C,EAAkBD,GAGhD0B,qBACM3K,KAAKmK,QAAQ1B,UACfnI,EAAaQ,GAAGd,KAAK2D,SApLJ,uBAoL6BzE,GAASc,KAAK6L,SAAS3M,KAG5C,UAAvBc,KAAKmK,QAAQxB,QACfrI,EAAaQ,GAAGd,KAAK2D,SAvLD,0BAuL6BzE,GAASc,KAAK2I,MAAMzJ,KACrEoB,EAAaQ,GAAGd,KAAK2D,SAvLD,0BAuL6BzE,GAASc,KAAK+K,MAAM7L,MAGnEc,KAAKmK,QAAQtB,OAAS7I,KAAKsK,iBAC7BtK,KAAK8L,0BAITA,0BACE,MAAMC,EAAqB7M,GAClBc,KAAKyK,gBAnKO,QAoKhBvL,EAAM8M,aArKY,UAqKwB9M,EAAM8M,aAG/CC,EAAQ/M,IACR6M,EAAmB7M,GACrBc,KAAKiK,YAAc/K,EAAMgN,QACflM,KAAKyK,gBACfzK,KAAKiK,YAAc/K,EAAMiN,QAAQ,GAAGD,UAIlCE,EAAOlN,IAEXc,KAAKkK,YAAchL,EAAMiN,SAAWjN,EAAMiN,QAAQ/T,OAAS,EACzD,EACA8G,EAAMiN,QAAQ,GAAGD,QAAUlM,KAAKiK,aAG9BoC,EAAMnN,IACN6M,EAAmB7M,KACrBc,KAAKkK,YAAchL,EAAMgN,QAAUlM,KAAKiK,aAG1CjK,KAAKyL,eACsB,UAAvBzL,KAAKmK,QAAQxB,QASf3I,KAAK2I,QACD3I,KAAKgK,cACPsC,aAAatM,KAAKgK,cAGpBhK,KAAKgK,aAAe9M,YAAWgC,GAASc,KAAK+K,MAAM7L,IA3Q5B,IA2Q6Dc,KAAKmK,QAAQ3B,YAIrGtB,EAAeC,KAtNO,qBAsNiBnH,KAAK2D,UAAUhL,SAAQ4T,IAC5DjM,EAAaQ,GAAGyL,EAvOI,yBAuOuBrN,GAASA,EAAMyD,sBAGxD3C,KAAKyK,eACPnK,EAAaQ,GAAGd,KAAK2D,SA7OA,2BA6O6BzE,GAAS+M,EAAM/M,KACjEoB,EAAaQ,GAAGd,KAAK2D,SA7OF,yBA6O6BzE,GAASmN,EAAInN,KAE7Dc,KAAK2D,SAAS5J,UAAUyS,IAnOG,mBAqO3BlM,EAAaQ,GAAGd,KAAK2D,SArPD,0BAqP6BzE,GAAS+M,EAAM/M,KAChEoB,EAAaQ,GAAGd,KAAK2D,SArPF,yBAqP6BzE,GAASkN,EAAKlN,KAC9DoB,EAAaQ,GAAGd,KAAK2D,SArPH,wBAqP6BzE,GAASmN,EAAInN,MAIhE2M,SAAS3M,GACP,GAAI,kBAAkB7F,KAAK6F,EAAMlC,OAAO2H,SACtC,OAGF,MAAMiH,EAAYzC,GAAiBjK,EAAMsD,KACrCoJ,IACF1M,EAAMyD,iBACN3C,KAAK4K,OAAOgB,IAIhBL,cAAcvU,GAKZ,OAJAgJ,KAAK2J,OAAS3S,GAAWA,EAAQyD,WAC/ByM,EAAeC,KArPC,iBAqPmBnQ,EAAQyD,YAC3C,GAEKuF,KAAK2J,OAAOlM,QAAQzG,GAG7ByV,gBAAgBjB,EAAOnO,GACrB,MAAMqP,EAASlB,IAAUzC,EACzB,OAAO5L,EAAqB6C,KAAK2J,OAAQtM,EAAeqP,EAAQ1M,KAAKmK,QAAQvB,MAG/E+D,mBAAmB7M,EAAe8M,GAChC,MAAMC,EAAc7M,KAAKuL,cAAczL,GACjCgN,EAAY9M,KAAKuL,cAAcrE,EAAeK,QAAQiC,GAAsBxJ,KAAK2D,WAEvF,OAAOrD,EAAamB,QAAQzB,KAAK2D,SA7RhB,oBA6RuC,CACtD7D,cAAAA,EACA8L,UAAWgB,EACXtJ,KAAMwJ,EACNzB,GAAIwB,IAIRE,2BAA2B/V,GACzB,GAAIgJ,KAAKqK,mBAAoB,CAC3B,MAAM2C,EAAkB9F,EAAeK,QAhRrB,UAgR8CvH,KAAKqK,oBAErE2C,EAAgBjT,UAAUwJ,OAAOgG,IACjCyD,EAAgBhH,gBAAgB,gBAEhC,MAAMiH,EAAa/F,EAAeC,KA/Qb,mBA+QsCnH,KAAKqK,oBAEhE,IAAK,IAAIrL,EAAI,EAAGA,EAAIiO,EAAW7U,OAAQ4G,IACrC,GAAItC,OAAOwQ,SAASD,EAAWjO,GAAG9H,aAAa,oBAAqB,MAAQ8I,KAAKuL,cAAcvU,GAAU,CACvGiW,EAAWjO,GAAGjF,UAAUyS,IAAIjD,IAC5B0D,EAAWjO,GAAGuG,aAAa,eAAgB,QAC3C,QAMR0F,kBACE,MAAMjU,EAAUgJ,KAAK6J,gBAAkB3C,EAAeK,QAAQiC,GAAsBxJ,KAAK2D,UAEzF,IAAK3M,EACH,OAGF,MAAMmW,EAAkBzQ,OAAOwQ,SAASlW,EAAQE,aAAa,oBAAqB,IAE9EiW,GACFnN,KAAKmK,QAAQiD,gBAAkBpN,KAAKmK,QAAQiD,iBAAmBpN,KAAKmK,QAAQ3B,SAC5ExI,KAAKmK,QAAQ3B,SAAW2E,GAExBnN,KAAKmK,QAAQ3B,SAAWxI,KAAKmK,QAAQiD,iBAAmBpN,KAAKmK,QAAQ3B,SAIzEoC,OAAOyC,EAAkBrW,GACvB,MAAMwU,EAAQxL,KAAKsN,kBAAkBD,GAC/BhQ,EAAgB6J,EAAeK,QAAQiC,GAAsBxJ,KAAK2D,UAClE4J,EAAqBvN,KAAKuL,cAAclO,GACxCmQ,EAAcxW,GAAWgJ,KAAKyM,gBAAgBjB,EAAOnO,GAErDoQ,EAAmBzN,KAAKuL,cAAciC,GACtCE,EAAY7M,QAAQb,KAAK4J,WAEzB8C,EAASlB,IAAUzC,EACnB4E,EAAuBjB,EAjUR,sBADF,oBAmUbkB,EAAiBlB,EAjUH,qBACA,qBAiUdE,EAAqB5M,KAAK6N,kBAAkBrC,GAElD,GAAIgC,GAAeA,EAAYzT,UAAUC,SAASuP,IAEhD,YADAvJ,KAAK+J,YAAa,GAIpB,GAAI/J,KAAK+J,WACP,OAIF,GADmB/J,KAAK2M,mBAAmBa,EAAaZ,GACzC7K,iBACb,OAGF,IAAK1E,IAAkBmQ,EAErB,OAGFxN,KAAK+J,YAAa,EAEd2D,GACF1N,KAAK2I,QAGP3I,KAAK+M,2BAA2BS,GAChCxN,KAAK6J,eAAiB2D,EAEtB,MAAMM,EAAmB,KACvBxN,EAAamB,QAAQzB,KAAK2D,SAAU2F,GAAY,CAC9CxJ,cAAe0N,EACf5B,UAAWgB,EACXtJ,KAAMiK,EACNlC,GAAIoC,KAIR,GAAIzN,KAAK2D,SAAS5J,UAAUC,SA5WP,SA4WmC,CACtDwT,EAAYzT,UAAUyS,IAAIoB,GAE1BjT,EAAO6S,GAEPnQ,EAActD,UAAUyS,IAAImB,GAC5BH,EAAYzT,UAAUyS,IAAImB,GAE1B,MAAMI,EAAmB,KACvBP,EAAYzT,UAAUwJ,OAAOoK,EAAsBC,GACnDJ,EAAYzT,UAAUyS,IAAIjD,IAE1BlM,EAActD,UAAUwJ,OAAOgG,GAAmBqE,EAAgBD,GAElE3N,KAAK+J,YAAa,EAElB7M,WAAW4Q,EAAkB,IAG/B9N,KAAKiE,eAAe8J,EAAkB1Q,GAAe,QAErDA,EAActD,UAAUwJ,OAAOgG,IAC/BiE,EAAYzT,UAAUyS,IAAIjD,IAE1BvJ,KAAK+J,YAAa,EAClB+D,IAGEJ,GACF1N,KAAK+K,QAITuC,kBAAkB1B,GAChB,MAAK,CAAC1C,EAAiBD,GAAgB7R,SAASwU,GAI5C1Q,IACK0Q,IAAc3C,EAAiBD,EAAaD,EAG9C6C,IAAc3C,EAAiBF,EAAaC,EAP1C4C,EAUXiC,kBAAkBrC,GAChB,MAAK,CAACzC,EAAYC,GAAY5R,SAASoU,GAInCtQ,IACKsQ,IAAUxC,EAAaC,EAAiBC,EAG1CsC,IAAUxC,EAAaE,EAAkBD,EAPvCuC,EAYarH,yBAACnN,EAASuB,GAChC,MAAM2M,EAAOuE,GAAS5E,oBAAoB7N,EAASuB,GAEnD,IAAI4R,QAAEA,GAAYjF,EACI,iBAAX3M,IACT4R,EAAU,IACLA,KACA5R,IAIP,MAAMyV,EAA2B,iBAAXzV,EAAsBA,EAAS4R,EAAQzB,MAE7D,GAAsB,iBAAXnQ,EACT2M,EAAKmG,GAAG9S,QACH,GAAsB,iBAAXyV,EAAqB,CACrC,QAA4B,IAAjB9I,EAAK8I,GACd,MAAM,IAAI1U,UAAW,oBAAmB0U,MAG1C9I,EAAK8I,UACI7D,EAAQ3B,UAAY2B,EAAQ8D,OACrC/I,EAAKyD,QACLzD,EAAK6F,SAIa5G,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACfwE,GAASyE,kBAAkBlO,KAAMzH,MAIX4L,2BAACjF,GACzB,MAAMlC,EAASrF,EAAuBqI,MAEtC,IAAKhD,IAAWA,EAAOjD,UAAUC,SA7cT,YA8ctB,OAGF,MAAMzB,EAAS,IACVsN,EAAYI,kBAAkBjJ,MAC9B6I,EAAYI,kBAAkBjG,OAE7BmO,EAAanO,KAAK9I,aAAa,oBAEjCiX,IACF5V,EAAOiQ,UAAW,GAGpBiB,GAASyE,kBAAkBlR,EAAQzE,GAE/B4V,GACF1E,GAASrF,YAAYpH,GAAQqO,GAAG8C,GAGlCjP,EAAMyD,kBAUVrC,EAAaQ,GAAGrJ,SA7ec,6BAkBF,sCA2dyCgS,GAAS2E,qBAE9E9N,EAAaQ,GAAG/F,OAhfa,6BAgfgB,KAC3C,MAAMsT,EAAYnH,EAAeC,KA7dR,6BA+dzB,IAAK,IAAInI,EAAI,EAAGC,EAAMoP,EAAUjW,OAAQ4G,EAAIC,EAAKD,IAC/CyK,GAASyE,kBAAkBG,EAAUrP,GAAIyK,GAASrF,YAAYiK,EAAUrP,QAW5E5D,EAAmBqO,ICjjBnB,MAAMhO,GAAO,WAKP8M,GAAU,CACdjD,QAAQ,EACRgJ,OAAQ,MAGJxF,GAAc,CAClBxD,OAAQ,UACRgJ,OAAQ,kBASJC,GAAkB,OAClBC,GAAsB,WACtBC,GAAwB,aACxBC,GAAuB,YACvBC,GAA8B,6BAO9BvJ,GAAuB,8BAQ7B,MAAMwJ,WAAiBnL,EACrBC,YAAY1M,EAASuB,GACnBmR,MAAM1S,GAENgJ,KAAK6O,kBAAmB,EACxB7O,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAK8O,cAAgB,GAErB,MAAMC,EAAa7H,EAAeC,KAAK/B,IAEvC,IAAK,IAAIpG,EAAI,EAAGC,EAAM8P,EAAW3W,OAAQ4G,EAAIC,EAAKD,IAAK,CACrD,MAAMgQ,EAAOD,EAAW/P,GAClB/H,EAAWO,EAAuBwX,GAClCC,EAAgB/H,EAAeC,KAAKlQ,GACvCmP,QAAO8I,GAAaA,IAAclP,KAAK2D,WAEzB,OAAb1M,GAAqBgY,EAAc7W,SACrC4H,KAAKmP,UAAYlY,EACjB+I,KAAK8O,cAAc7S,KAAK+S,IAI5BhP,KAAKoP,sBAEApP,KAAKmK,QAAQmE,QAChBtO,KAAKqP,0BAA0BrP,KAAK8O,cAAe9O,KAAKsP,YAGtDtP,KAAKmK,QAAQ7E,QACftF,KAAKsF,SAMEiD,qBACT,OAAOA,GAGE9M,kBACT,OAAOA,GAKT6J,SACMtF,KAAKsP,WACPtP,KAAKuP,OAELvP,KAAKwP,OAITA,OACE,GAAIxP,KAAK6O,kBAAoB7O,KAAKsP,WAChC,OAGF,IACIG,EADAC,EAAU,GAGd,GAAI1P,KAAKmK,QAAQmE,OAAQ,CACvB,MAAM9G,EAAWN,EAAeC,KAAKwH,GAA4B3O,KAAKmK,QAAQmE,QAC9EoB,EAAUxI,EAAeC,KAxEN,uCAwE6BnH,KAAKmK,QAAQmE,QAAQlI,QAAO4I,IAASxH,EAASpQ,SAAS4X,KAGzG,MAAMW,EAAYzI,EAAeK,QAAQvH,KAAKmP,WAC9C,GAAIO,EAAQtX,OAAQ,CAClB,MAAMwX,EAAiBF,EAAQvI,MAAK6H,GAAQW,IAAcX,IAG1D,GAFAS,EAAcG,EAAiBhB,GAASxK,YAAYwL,GAAkB,KAElEH,GAAeA,EAAYZ,iBAC7B,OAKJ,GADmBvO,EAAamB,QAAQzB,KAAK2D,SArG7B,oBAsGD5B,iBACb,OAGF2N,EAAQ/W,SAAQkX,IACVF,IAAcE,GAChBjB,GAAS/J,oBAAoBgL,EAAY,CAAEvK,QAAQ,IAASiK,OAGzDE,GACH3M,EAAKC,IAAI8M,EA9HA,cA8HsB,SAInC,MAAMC,EAAY9P,KAAK+P,gBAEvB/P,KAAK2D,SAAS5J,UAAUwJ,OAAOiL,IAC/BxO,KAAK2D,SAAS5J,UAAUyS,IAAIiC,IAE5BzO,KAAK2D,SAASqM,MAAMF,GAAa,EAEjC9P,KAAKqP,0BAA0BrP,KAAK8O,eAAe,GACnD9O,KAAK6O,kBAAmB,EAExB,MAYMoB,EAAc,SADSH,EAAU,GAAGvW,cAAgBuW,EAAUvO,MAAM,KAG1EvB,KAAKiE,gBAdY,KACfjE,KAAK6O,kBAAmB,EAExB7O,KAAK2D,SAAS5J,UAAUwJ,OAAOkL,IAC/BzO,KAAK2D,SAAS5J,UAAUyS,IAAIgC,GAAqBD,IAEjDvO,KAAK2D,SAASqM,MAAMF,GAAa,GAEjCxP,EAAamB,QAAQzB,KAAK2D,SArIX,uBA2Ia3D,KAAK2D,UAAU,GAC7C3D,KAAK2D,SAASqM,MAAMF,GAAc,GAAE9P,KAAK2D,SAASsM,OAGpDV,OACE,GAAIvP,KAAK6O,mBAAqB7O,KAAKsP,WACjC,OAIF,GADmBhP,EAAamB,QAAQzB,KAAK2D,SAnJ7B,oBAoJD5B,iBACb,OAGF,MAAM+N,EAAY9P,KAAK+P,gBAEvB/P,KAAK2D,SAASqM,MAAMF,GAAc,GAAE9P,KAAK2D,SAAS+C,wBAAwBoJ,OAE1EnV,EAAOqF,KAAK2D,UAEZ3D,KAAK2D,SAAS5J,UAAUyS,IAAIiC,IAC5BzO,KAAK2D,SAAS5J,UAAUwJ,OAAOiL,GAAqBD,IAEpD,MAAM2B,EAAqBlQ,KAAK8O,cAAc1W,OAC9C,IAAK,IAAI4G,EAAI,EAAGA,EAAIkR,EAAoBlR,IAAK,CAC3C,MAAMyC,EAAUzB,KAAK8O,cAAc9P,GAC7BgQ,EAAOrX,EAAuB8J,GAEhCuN,IAAShP,KAAKsP,SAASN,IACzBhP,KAAKqP,0BAA0B,CAAC5N,IAAU,GAI9CzB,KAAK6O,kBAAmB,EASxB7O,KAAK2D,SAASqM,MAAMF,GAAa,GAEjC9P,KAAKiE,gBATY,KACfjE,KAAK6O,kBAAmB,EACxB7O,KAAK2D,SAAS5J,UAAUwJ,OAAOkL,IAC/BzO,KAAK2D,SAAS5J,UAAUyS,IAAIgC,IAC5BlO,EAAamB,QAAQzB,KAAK2D,SAhLV,wBAqLY3D,KAAK2D,UAAU,GAG/C2L,SAAStY,EAAUgJ,KAAK2D,UACtB,OAAO3M,EAAQ+C,UAAUC,SAASuU,IAKpCnE,WAAW7R,GAST,OARAA,EAAS,IACJgQ,MACA1C,EAAYI,kBAAkBjG,KAAK2D,aACnCpL,IAEE+M,OAASzE,QAAQtI,EAAO+M,QAC/B/M,EAAO+V,OAASnW,EAAWI,EAAO+V,QAClCjW,EAAgBoD,GAAMlD,EAAQuQ,IACvBvQ,EAGTwX,gBACE,OAAO/P,KAAK2D,SAAS5J,UAAUC,SAnML,uBAEhB,QACC,SAmMboV,sBACE,IAAKpP,KAAKmK,QAAQmE,OAChB,OAGF,MAAM9G,EAAWN,EAAeC,KAAKwH,GAA4B3O,KAAKmK,QAAQmE,QAC9EpH,EAAeC,KAAK/B,GAAsBpF,KAAKmK,QAAQmE,QAAQlI,QAAO4I,IAASxH,EAASpQ,SAAS4X,KAC9FrW,SAAQ3B,IACP,MAAMmZ,EAAWxY,EAAuBX,GAEpCmZ,GACFnQ,KAAKqP,0BAA0B,CAACrY,GAAUgJ,KAAKsP,SAASa,OAKhEd,0BAA0Be,EAAcC,GACjCD,EAAahY,QAIlBgY,EAAazX,SAAQqW,IACfqB,EACFrB,EAAKjV,UAAUwJ,OAAOmL,IAEtBM,EAAKjV,UAAUyS,IAAIkC,IAGrBM,EAAKzJ,aAAa,gBAAiB8K,MAMjBlM,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMkF,EAAU,GACM,iBAAX5R,GAAuB,YAAYc,KAAKd,KACjD4R,EAAQ7E,QAAS,GAGnB,MAAMJ,EAAO0J,GAAS/J,oBAAoB7E,KAAMmK,GAEhD,GAAsB,iBAAX5R,EAAqB,CAC9B,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,UAYb+H,EAAaQ,GAAGrJ,SAzQc,6BAyQkB2N,IAAsB,SAAUlG,IAEjD,MAAzBA,EAAMlC,OAAO2H,SAAoBzF,EAAMa,gBAAmD,MAAjCb,EAAMa,eAAe4E,UAChFzF,EAAMyD,iBAGR,MAAM1L,EAAWO,EAAuBwI,MACfkH,EAAeC,KAAKlQ,GAE5B0B,SAAQ3B,IACvB4X,GAAS/J,oBAAoB7N,EAAS,CAAEsO,QAAQ,IAASA,eAW7DlK,EAAmBwT,IC5UZ,IAAIjI,GAAM,MACN2J,GAAS,SACTC,GAAQ,QACR1J,GAAO,OACP2J,GAAO,OACPC,GAAiB,CAAC9J,GAAK2J,GAAQC,GAAO1J,IACtCoF,GAAQ,QACRI,GAAM,MACNqE,GAAkB,kBAClBC,GAAW,WACXC,GAAS,SACTC,GAAY,YACZC,GAAmCL,GAAeM,QAAO,SAAUC,EAAKC,GACjF,OAAOD,EAAI5J,OAAO,CAAC6J,EAAY,IAAMhF,GAAOgF,EAAY,IAAM5E,OAC7D,IACQ6E,GAA0B,GAAG9J,OAAOqJ,GAAgB,CAACD,KAAOO,QAAO,SAAUC,EAAKC,GAC3F,OAAOD,EAAI5J,OAAO,CAAC6J,EAAWA,EAAY,IAAMhF,GAAOgF,EAAY,IAAM5E,OACxE,IAEQ8E,GAAa,aACbC,GAAO,OACPC,GAAY,YAEZC,GAAa,aACbC,GAAO,OACPC,GAAY,YAEZC,GAAc,cACdC,GAAQ,QACRC,GAAa,aACbC,GAAiB,CAACT,GAAYC,GAAMC,GAAWC,GAAYC,GAAMC,GAAWC,GAAaC,GAAOC,IC9B5F,SAASE,GAAY7a,GAClC,OAAOA,GAAWA,EAAQ8a,UAAY,IAAI3Y,cAAgB,KCD7C,SAAS4Y,GAAUC,GAChC,GAAY,MAARA,EACF,OAAOjX,OAGT,GAAwB,oBAApBiX,EAAKhZ,WAAkC,CACzC,IAAIiZ,EAAgBD,EAAKC,cACzB,OAAOA,GAAgBA,EAAcC,aAAwBnX,OAG/D,OAAOiX,ECRT,SAASja,GAAUia,GAEjB,OAAOA,aADUD,GAAUC,GAAM3K,SACI2K,aAAgB3K,QAGvD,SAAS8K,GAAcH,GAErB,OAAOA,aADUD,GAAUC,GAAMI,aACIJ,aAAgBI,YAGvD,SAASC,GAAaL,GAEpB,MAA0B,oBAAfxX,aAKJwX,aADUD,GAAUC,GAAMxX,YACIwX,aAAgBxX,YCyDvD,MAAA8X,GAAe,CACb9W,KAAM,cACN+W,SAAS,EACTC,MAAO,QACP7W,GA5EF,SAAqB8W,GACnB,IAAIC,EAAQD,EAAKC,MACjBja,OAAOC,KAAKga,EAAMC,UAAUha,SAAQ,SAAU6C,GAC5C,IAAIwU,EAAQ0C,EAAME,OAAOpX,IAAS,GAC9B0K,EAAawM,EAAMxM,WAAW1K,IAAS,GACvCxE,EAAU0b,EAAMC,SAASnX,GAExB2W,GAAcnb,IAAa6a,GAAY7a,KAO5CyB,OAAOoa,OAAO7b,EAAQgZ,MAAOA,GAC7BvX,OAAOC,KAAKwN,GAAYvN,SAAQ,SAAU6C,GACxC,IAAI1C,EAAQoN,EAAW1K,IAET,IAAV1C,EACF9B,EAAQgP,gBAAgBxK,GAExBxE,EAAQuO,aAAa/J,GAAgB,IAAV1C,EAAiB,GAAKA,WAwDvDga,OAlDF,SAAgBC,GACd,IAAIL,EAAQK,EAAML,MACdM,EAAgB,CAClBpC,OAAQ,CACN7J,SAAU2L,EAAMO,QAAQC,SACxBrM,KAAM,IACNF,IAAK,IACLwM,OAAQ,KAEVC,MAAO,CACLrM,SAAU,YAEZ8J,UAAW,IASb,OAPApY,OAAOoa,OAAOH,EAAMC,SAAS/B,OAAOZ,MAAOgD,EAAcpC,QACzD8B,EAAME,OAASI,EAEXN,EAAMC,SAASS,OACjB3a,OAAOoa,OAAOH,EAAMC,SAASS,MAAMpD,MAAOgD,EAAcI,OAGnD,WACL3a,OAAOC,KAAKga,EAAMC,UAAUha,SAAQ,SAAU6C,GAC5C,IAAIxE,EAAU0b,EAAMC,SAASnX,GACzB0K,EAAawM,EAAMxM,WAAW1K,IAAS,GAGvCwU,EAFkBvX,OAAOC,KAAKga,EAAME,OAAOS,eAAe7X,GAAQkX,EAAME,OAAOpX,GAAQwX,EAAcxX,IAE7EuV,QAAO,SAAUf,EAAOpX,GAElD,OADAoX,EAAMpX,GAAY,GACXoX,IACN,IAEEmC,GAAcnb,IAAa6a,GAAY7a,KAI5CyB,OAAOoa,OAAO7b,EAAQgZ,MAAOA,GAC7BvX,OAAOC,KAAKwN,GAAYvN,SAAQ,SAAU2a,GACxCtc,EAAQgP,gBAAgBsN,YAa9BC,SAAU,CAAC,kBCjFE,SAASC,GAAiBvC,GACvC,OAAOA,EAAU3Z,MAAM,KAAK,GCDf,SAASoP,GAAsB1P,EAC9Cyc,GAKE,IAAIhN,EAAOzP,EAAQ0P,wBAoBnB,MAAO,CACLgN,MAAOjN,EAAKiN,MApBD,EAqBXC,OAAQlN,EAAKkN,OApBF,EAqBXhN,IAAKF,EAAKE,IArBC,EAsBX4J,MAAO9J,EAAK8J,MAvBD,EAwBXD,OAAQ7J,EAAK6J,OAvBF,EAwBXzJ,KAAMJ,EAAKI,KAzBA,EA0BX+M,EAAGnN,EAAKI,KA1BG,EA2BXgN,EAAGpN,EAAKE,IA1BG,GCNA,SAASmN,GAAc9c,GACpC,IAAI+c,EAAarN,GAAsB1P,GAGnC0c,EAAQ1c,EAAQgd,YAChBL,EAAS3c,EAAQ4D,aAUrB,OARI+C,KAAKgO,IAAIoI,EAAWL,MAAQA,IAAU,IACxCA,EAAQK,EAAWL,OAGjB/V,KAAKgO,IAAIoI,EAAWJ,OAASA,IAAW,IAC1CA,EAASI,EAAWJ,QAGf,CACLC,EAAG5c,EAAQiQ,WACX4M,EAAG7c,EAAQgQ,UACX0M,MAAOA,EACPC,OAAQA,GCrBG,SAAS3Z,GAASsU,EAAQ7G,GACvC,IAAIwM,EAAWxM,EAAMnN,aAAemN,EAAMnN,cAE1C,GAAIgU,EAAOtU,SAASyN,GAClB,OAAO,EAEJ,GAAIwM,GAAY5B,GAAa4B,GAAW,CACzC,IAAIjM,EAAOP,EAEX,EAAG,CACD,GAAIO,GAAQsG,EAAO4F,WAAWlM,GAC5B,OAAO,EAITA,EAAOA,EAAKvN,YAAcuN,EAAKmM,WACxBnM,GAIb,OAAO,ECpBM,SAAStO,GAAiB1C,GACvC,OAAO+a,GAAU/a,GAAS0C,iBAAiB1C,GCD9B,SAASod,GAAepd,GACrC,MAAO,CAAC,QAAS,KAAM,MAAMyG,QAAQoU,GAAY7a,KAAa,ECDjD,SAASqd,GAAmBrd,GAEzC,QAASe,GAAUf,GAAWA,EAAQib,cACtCjb,EAAQS,WAAasD,OAAOtD,UAAU2C,gBCDzB,SAASka,GAActd,GACpC,MAA6B,SAAzB6a,GAAY7a,GACPA,EAMPA,EAAQud,cACRvd,EAAQyD,aACR4X,GAAarb,GAAWA,EAAQmd,KAAO,OAEvCE,GAAmBrd,GCRvB,SAASwd,GAAoBxd,GAC3B,OAAKmb,GAAcnb,IACoB,UAAvC0C,GAAiB1C,GAAS+P,SAInB/P,EAAQyd,aAHN,KAwCI,SAASC,GAAgB1d,GAItC,IAHA,IAAI+D,EAASgX,GAAU/a,GACnByd,EAAeD,GAAoBxd,GAEhCyd,GAAgBL,GAAeK,IAA6D,WAA5C/a,GAAiB+a,GAAc1N,UACpF0N,EAAeD,GAAoBC,GAGrC,OAAIA,IAA+C,SAA9B5C,GAAY4C,IAA0D,SAA9B5C,GAAY4C,IAAwE,WAA5C/a,GAAiB+a,GAAc1N,UAC3HhM,EAGF0Z,GA5CT,SAA4Bzd,GAC1B,IAAI2d,GAAsE,IAA1DpK,UAAUqK,UAAUzb,cAAcsE,QAAQ,WAG1D,IAFuD,IAA5C8M,UAAUqK,UAAUnX,QAAQ,YAE3B0U,GAAcnb,IAII,UAFX0C,GAAiB1C,GAEnB+P,SACb,OAAO,KAMX,IAFA,IAAI8N,EAAcP,GAActd,GAEzBmb,GAAc0C,IAAgB,CAAC,OAAQ,QAAQpX,QAAQoU,GAAYgD,IAAgB,GAAG,CAC3F,IAAIC,EAAMpb,GAAiBmb,GAI3B,GAAsB,SAAlBC,EAAIC,WAA4C,SAApBD,EAAIE,aAA0C,UAAhBF,EAAIG,UAAiF,IAA1D,CAAC,YAAa,eAAexX,QAAQqX,EAAII,aAAsBP,GAAgC,WAAnBG,EAAII,YAA2BP,GAAaG,EAAI1O,QAAyB,SAAf0O,EAAI1O,OACjO,OAAOyO,EAEPA,EAAcA,EAAYpa,WAI9B,OAAO,KAiBgB0a,CAAmBne,IAAY+D,EC9DzC,SAASqa,GAAyBnE,GAC/C,MAAO,CAAC,MAAO,UAAUxT,QAAQwT,IAAc,EAAI,IAAM,ICDpD,IAAIrT,GAAMD,KAAKC,IACXC,GAAMF,KAAKE,IACXwX,GAAQ1X,KAAK0X,MCDT,SAASC,GAAOzX,EAAK/E,EAAO8E,GACzC,OAAO2X,GAAQ1X,EAAK2X,GAAQ1c,EAAO8E,ICDtB,SAAS6X,GAAmBC,GACzC,OAAOjd,OAAOoa,OAAO,GCDd,CACLlM,IAAK,EACL4J,MAAO,EACPD,OAAQ,EACRzJ,KAAM,GDHuC6O,GEFlC,SAASC,GAAgB7c,EAAOJ,GAC7C,OAAOA,EAAKqY,QAAO,SAAU6E,EAASpT,GAEpC,OADAoT,EAAQpT,GAAO1J,EACR8c,IACN,ICwFL,MAAAC,GAAe,CACbra,KAAM,QACN+W,SAAS,EACTC,MAAO,OACP7W,GA9EF,SAAe8W,GACb,IAAIqD,EAEApD,EAAQD,EAAKC,MACblX,EAAOiX,EAAKjX,KACZyX,EAAUR,EAAKQ,QACf8C,EAAerD,EAAMC,SAASS,MAC9B4C,EAAgBtD,EAAMuD,cAAcD,cACpCE,EAAgB1C,GAAiBd,EAAMzB,WACvCkF,EAAOf,GAAyBc,GAEhCjX,EADa,CAAC4H,GAAM0J,IAAO9S,QAAQyY,IAAkB,EAClC,SAAW,QAElC,GAAKH,GAAiBC,EAAtB,CAIA,IAAIN,EAxBgB,SAAyBU,EAAS1D,GAItD,OAAO+C,GAAsC,iBAH7CW,EAA6B,mBAAZA,EAAyBA,EAAQ3d,OAAOoa,OAAO,GAAIH,EAAM2D,MAAO,CAC/EpF,UAAWyB,EAAMzB,aACbmF,GACkDA,EAAUT,GAAgBS,EAAS3F,KAoBvE6F,CAAgBrD,EAAQmD,QAAS1D,GACjD6D,EAAYzC,GAAciC,GAC1BS,EAAmB,MAATL,EAAexP,GAAME,GAC/B4P,EAAmB,MAATN,EAAe7F,GAASC,GAClCmG,EAAUhE,EAAM2D,MAAMxF,UAAU5R,GAAOyT,EAAM2D,MAAMxF,UAAUsF,GAAQH,EAAcG,GAAQzD,EAAM2D,MAAMzF,OAAO3R,GAC9G0X,EAAYX,EAAcG,GAAQzD,EAAM2D,MAAMxF,UAAUsF,GACxDS,EAAoBlC,GAAgBqB,GACpCc,EAAaD,EAA6B,MAATT,EAAeS,EAAkBE,cAAgB,EAAIF,EAAkBG,aAAe,EAAI,EAC3HC,EAAoBN,EAAU,EAAIC,EAAY,EAG9C9Y,EAAM6X,EAAcc,GACpB5Y,EAAMiZ,EAAaN,EAAUtX,GAAOyW,EAAce,GAClDQ,EAASJ,EAAa,EAAIN,EAAUtX,GAAO,EAAI+X,EAC/CxQ,EAAS8O,GAAOzX,EAAKoZ,EAAQrZ,GAE7BsZ,EAAWf,EACfzD,EAAMuD,cAAcza,KAASsa,EAAwB,IAA0BoB,GAAY1Q,EAAQsP,EAAsBqB,aAAe3Q,EAASyQ,EAAQnB,KA6CzJhD,OA1CF,SAAgBC,GACd,IAAIL,EAAQK,EAAML,MAEd0E,EADUrE,EAAME,QACWjc,QAC3B+e,OAAoC,IAArBqB,EAA8B,sBAAwBA,EAErD,MAAhBrB,IAKwB,iBAAjBA,IACTA,EAAerD,EAAMC,SAAS/B,OAAOlZ,cAAcqe,MAahD/b,GAAS0Y,EAAMC,SAAS/B,OAAQmF,KAQrCrD,EAAMC,SAASS,MAAQ2C,IAUvBxC,SAAU,CAAC,iBACX8D,iBAAkB,CAAC,oBCnGN,SAASC,GAAarG,GACnC,OAAOA,EAAU3Z,MAAM,KAAK,GCQ9B,IAAIigB,GAAa,CACf5Q,IAAK,OACL4J,MAAO,OACPD,OAAQ,OACRzJ,KAAM,QAgBD,SAAS2Q,GAAYzE,GAC1B,IAAI0E,EAEA7G,EAASmC,EAAMnC,OACf8G,EAAa3E,EAAM2E,WACnBzG,EAAY8B,EAAM9B,UAClB0G,EAAY5E,EAAM4E,UAClBC,EAAU7E,EAAM6E,QAChB7Q,EAAWgM,EAAMhM,SACjB8Q,EAAkB9E,EAAM8E,gBACxBC,EAAW/E,EAAM+E,SACjBC,EAAehF,EAAMgF,aAErBC,GAAyB,IAAjBD,EAxBd,SAA2BtF,GACzB,IAAImB,EAAInB,EAAKmB,EACTC,EAAIpB,EAAKoB,EAEToE,EADMld,OACImd,kBAAoB,EAClC,MAAO,CACLtE,EAAGyB,GAAMA,GAAMzB,EAAIqE,GAAOA,IAAQ,EAClCpE,EAAGwB,GAAMA,GAAMxB,EAAIoE,GAAOA,IAAQ,GAiBAE,CAAkBP,GAAmC,mBAAjBG,EAA8BA,EAAaH,GAAWA,EAC1HQ,EAAUJ,EAAMpE,EAChBA,OAAgB,IAAZwE,EAAqB,EAAIA,EAC7BC,EAAUL,EAAMnE,EAChBA,OAAgB,IAAZwE,EAAqB,EAAIA,EAE7BC,EAAOV,EAAQvE,eAAe,KAC9BkF,EAAOX,EAAQvE,eAAe,KAC9BmF,EAAQ3R,GACR4R,EAAQ9R,GACR+R,EAAM3d,OAEV,GAAI+c,EAAU,CACZ,IAAIrD,EAAeC,GAAgB9D,GAC/B+H,EAAa,eACbC,EAAY,cAEZnE,IAAiB1C,GAAUnB,IAGmB,WAA5ClX,GAFJ+a,EAAeJ,GAAmBzD,IAEC7J,UAAsC,aAAbA,IAC1D4R,EAAa,eACbC,EAAY,eAKhBnE,EAAeA,EAEXxD,IAActK,KAAQsK,IAAcpK,IAAQoK,IAAcV,IAAUoH,IAActL,MACpFoM,EAAQnI,GAERuD,GAAKY,EAAakE,GAAcjB,EAAW/D,OAC3CE,GAAKgE,EAAkB,GAAK,GAG1B5G,IAAcpK,KAASoK,IAActK,IAAOsK,IAAcX,IAAWqH,IAActL,MACrFmM,EAAQjI,GAERqD,GAAKa,EAAamE,GAAalB,EAAWhE,MAC1CE,GAAKiE,EAAkB,GAAK,GAIhC,IAKMgB,EALFC,EAAergB,OAAOoa,OAAO,CAC/B9L,SAAUA,GACT+Q,GAAYP,IAEf,OAAIM,EAGKpf,OAAOoa,OAAO,GAAIiG,IAAeD,EAAiB,IAAmBJ,GAASF,EAAO,IAAM,GAAIM,EAAeL,GAASF,EAAO,IAAM,GAAIO,EAAe9D,WAAa2D,EAAIR,kBAAoB,IAAM,EAAI,aAAetE,EAAI,OAASC,EAAI,MAAQ,eAAiBD,EAAI,OAASC,EAAI,SAAUgF,IAG5RpgB,OAAOoa,OAAO,GAAIiG,IAAerB,EAAkB,IAAoBgB,GAASF,EAAO1E,EAAI,KAAO,GAAI4D,EAAgBe,GAASF,EAAO1E,EAAI,KAAO,GAAI6D,EAAgB1C,UAAY,GAAI0C,IAuD9L,MAAAsB,GAAe,CACbvd,KAAM,gBACN+W,SAAS,EACTC,MAAO,cACP7W,GAxDF,SAAuBqd,GACrB,IAAItG,EAAQsG,EAAMtG,MACdO,EAAU+F,EAAM/F,QAChBgG,EAAwBhG,EAAQ4E,gBAChCA,OAA4C,IAA1BoB,GAA0CA,EAC5DC,EAAoBjG,EAAQ6E,SAC5BA,OAAiC,IAAtBoB,GAAsCA,EACjDC,EAAwBlG,EAAQ8E,aAChCA,OAAyC,IAA1BoB,GAA0CA,EAYzDL,EAAe,CACjB7H,UAAWuC,GAAiBd,EAAMzB,WAClC0G,UAAWL,GAAa5E,EAAMzB,WAC9BL,OAAQ8B,EAAMC,SAAS/B,OACvB8G,WAAYhF,EAAM2D,MAAMzF,OACxBiH,gBAAiBA,GAGsB,MAArCnF,EAAMuD,cAAcD,gBACtBtD,EAAME,OAAOhC,OAASnY,OAAOoa,OAAO,GAAIH,EAAME,OAAOhC,OAAQ4G,GAAY/e,OAAOoa,OAAO,GAAIiG,EAAc,CACvGlB,QAASlF,EAAMuD,cAAcD,cAC7BjP,SAAU2L,EAAMO,QAAQC,SACxB4E,SAAUA,EACVC,aAAcA,OAIe,MAA7BrF,EAAMuD,cAAc7C,QACtBV,EAAME,OAAOQ,MAAQ3a,OAAOoa,OAAO,GAAIH,EAAME,OAAOQ,MAAOoE,GAAY/e,OAAOoa,OAAO,GAAIiG,EAAc,CACrGlB,QAASlF,EAAMuD,cAAc7C,MAC7BrM,SAAU,WACV+Q,UAAU,EACVC,aAAcA,OAIlBrF,EAAMxM,WAAW0K,OAASnY,OAAOoa,OAAO,GAAIH,EAAMxM,WAAW0K,OAAQ,CACnE,wBAAyB8B,EAAMzB,aAUjC/L,KAAM,IC1JR,IAAIkU,GAAU,CACZA,SAAS,GAsCX,MAAAC,GAAe,CACb7d,KAAM,iBACN+W,SAAS,EACTC,MAAO,QACP7W,GAAI,aACJmX,OAxCF,SAAgBL,GACd,IAAIC,EAAQD,EAAKC,MACb1P,EAAWyP,EAAKzP,SAChBiQ,EAAUR,EAAKQ,QACfqG,EAAkBrG,EAAQsG,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7CE,EAAkBvG,EAAQwG,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7Cze,EAASgX,GAAUW,EAAMC,SAAS/B,QAClC8I,EAAgB,GAAGtS,OAAOsL,EAAMgH,cAAc7I,UAAW6B,EAAMgH,cAAc9I,QAYjF,OAVI2I,GACFG,EAAc/gB,SAAQ,SAAUghB,GAC9BA,EAAa3d,iBAAiB,SAAUgH,EAAS4W,OAAQR,OAIzDK,GACF1e,EAAOiB,iBAAiB,SAAUgH,EAAS4W,OAAQR,IAG9C,WACDG,GACFG,EAAc/gB,SAAQ,SAAUghB,GAC9BA,EAAa1c,oBAAoB,SAAU+F,EAAS4W,OAAQR,OAI5DK,GACF1e,EAAOkC,oBAAoB,SAAU+F,EAAS4W,OAAQR,MAY1DlU,KAAM,IC/CR,IAAI2U,GAAO,CACThT,KAAM,QACN0J,MAAO,OACPD,OAAQ,MACR3J,IAAK,UAEQ,SAASmT,GAAqB7I,GAC3C,OAAOA,EAAU9Q,QAAQ,0BAA0B,SAAU4Z,GAC3D,OAAOF,GAAKE,MCRhB,IAAIF,GAAO,CACT5N,MAAO,MACPI,IAAK,SAEQ,SAAS2N,GAA8B/I,GACpD,OAAOA,EAAU9Q,QAAQ,cAAc,SAAU4Z,GAC/C,OAAOF,GAAKE,MCLD,SAASE,GAAgBjI,GACtC,IAAI0G,EAAM3G,GAAUC,GAGpB,MAAO,CACLkI,WAHexB,EAAI5R,YAInBqT,UAHczB,EAAI9R,aCDP,SAASwT,GAAoBpjB,GAQ1C,OAAO0P,GAAsB2N,GAAmBrd,IAAU6P,KAAOoT,GAAgBjjB,GAASkjB,WCV7E,SAASG,GAAerjB,GAErC,IAAIsjB,EAAoB5gB,GAAiB1C,GACrCujB,EAAWD,EAAkBC,SAC7BC,EAAYF,EAAkBE,UAC9BC,EAAYH,EAAkBG,UAElC,MAAO,6BAA6BphB,KAAKkhB,EAAWE,EAAYD,GCJnD,SAASE,GAAgB1I,GACtC,MAAI,CAAC,OAAQ,OAAQ,aAAavU,QAAQoU,GAAYG,KAAU,EAEvDA,EAAKC,cAAcjX,KAGxBmX,GAAcH,IAASqI,GAAerI,GACjCA,EAGF0I,GAAgBpG,GAActC,ICHxB,SAAS2I,GAAkB3jB,EAASoG,GACjD,IAAIwd,OAES,IAATxd,IACFA,EAAO,IAGT,IAAIuc,EAAee,GAAgB1jB,GAC/B6jB,EAASlB,KAAqE,OAAlDiB,EAAwB5jB,EAAQib,oBAAyB,EAAS2I,EAAsB5f,MACpH0d,EAAM3G,GAAU4H,GAChB3c,EAAS6d,EAAS,CAACnC,GAAKtR,OAAOsR,EAAIoC,gBAAkB,GAAIT,GAAeV,GAAgBA,EAAe,IAAMA,EAC7GoB,EAAc3d,EAAKgK,OAAOpK,GAC9B,OAAO6d,EAASE,EAChBA,EAAY3T,OAAOuT,GAAkBrG,GAActX,KCxBtC,SAASge,GAAiBvU,GACvC,OAAOhO,OAAOoa,OAAO,GAAIpM,EAAM,CAC7BI,KAAMJ,EAAKmN,EACXjN,IAAKF,EAAKoN,EACVtD,MAAO9J,EAAKmN,EAAInN,EAAKiN,MACrBpD,OAAQ7J,EAAKoN,EAAIpN,EAAKkN,SCuB1B,SAASsH,GAA2BjkB,EAASkkB,GAC3C,OAAOA,IAAmBvK,GAAWqK,GC1BxB,SAAyBhkB,GACtC,IAAI0hB,EAAM3G,GAAU/a,GAChBmkB,EAAO9G,GAAmBrd,GAC1B8jB,EAAiBpC,EAAIoC,eACrBpH,EAAQyH,EAAKpE,YACbpD,EAASwH,EAAKrE,aACdlD,EAAI,EACJC,EAAI,EAuBR,OAjBIiH,IACFpH,EAAQoH,EAAepH,MACvBC,EAASmH,EAAenH,OASnB,iCAAiCta,KAAKkR,UAAUqK,aACnDhB,EAAIkH,EAAe7T,WACnB4M,EAAIiH,EAAe9T,YAIhB,CACL0M,MAAOA,EACPC,OAAQA,EACRC,EAAGA,EAAIwG,GAAoBpjB,GAC3B6c,EAAGA,GDRiDuH,CAAgBpkB,IAAYmb,GAAc+I,GAdlG,SAAoClkB,GAClC,IAAIyP,EAAOC,GAAsB1P,GASjC,OARAyP,EAAKE,IAAMF,EAAKE,IAAM3P,EAAQqkB,UAC9B5U,EAAKI,KAAOJ,EAAKI,KAAO7P,EAAQskB,WAChC7U,EAAK6J,OAAS7J,EAAKE,IAAM3P,EAAQ8f,aACjCrQ,EAAK8J,MAAQ9J,EAAKI,KAAO7P,EAAQ+f,YACjCtQ,EAAKiN,MAAQ1c,EAAQ+f,YACrBtQ,EAAKkN,OAAS3c,EAAQ8f,aACtBrQ,EAAKmN,EAAInN,EAAKI,KACdJ,EAAKoN,EAAIpN,EAAKE,IACPF,EAI2G8U,CAA2BL,GAAkBF,GEtBlJ,SAAyBhkB,GACtC,IAAI4jB,EAEAO,EAAO9G,GAAmBrd,GAC1BwkB,EAAYvB,GAAgBjjB,GAC5BgE,EAA0D,OAAlD4f,EAAwB5jB,EAAQib,oBAAyB,EAAS2I,EAAsB5f,KAChG0Y,EAAQ9V,GAAIud,EAAKM,YAAaN,EAAKpE,YAAa/b,EAAOA,EAAKygB,YAAc,EAAGzgB,EAAOA,EAAK+b,YAAc,GACvGpD,EAAS/V,GAAIud,EAAKO,aAAcP,EAAKrE,aAAc9b,EAAOA,EAAK0gB,aAAe,EAAG1gB,EAAOA,EAAK8b,aAAe,GAC5GlD,GAAK4H,EAAUtB,WAAaE,GAAoBpjB,GAChD6c,GAAK2H,EAAUrB,UAMnB,MAJiD,QAA7CzgB,GAAiBsB,GAAQmgB,GAAMvP,YACjCgI,GAAKhW,GAAIud,EAAKpE,YAAa/b,EAAOA,EAAK+b,YAAc,GAAKrD,GAGrD,CACLA,MAAOA,EACPC,OAAQA,EACRC,EAAGA,EACHC,EAAGA,GFG2K8H,CAAgBtH,GAAmBrd,KGzBtM,SAAS4kB,GAAenJ,GACrC,IAOImF,EAPA/G,EAAY4B,EAAK5B,UACjB7Z,EAAUyb,EAAKzb,QACfia,EAAYwB,EAAKxB,UACjBiF,EAAgBjF,EAAYuC,GAAiBvC,GAAa,KAC1D0G,EAAY1G,EAAYqG,GAAarG,GAAa,KAClD4K,EAAUhL,EAAU+C,EAAI/C,EAAU6C,MAAQ,EAAI1c,EAAQ0c,MAAQ,EAC9DoI,EAAUjL,EAAUgD,EAAIhD,EAAU8C,OAAS,EAAI3c,EAAQ2c,OAAS,EAGpE,OAAQuC,GACN,KAAKvP,GACHiR,EAAU,CACRhE,EAAGiI,EACHhI,EAAGhD,EAAUgD,EAAI7c,EAAQ2c,QAE3B,MAEF,KAAKrD,GACHsH,EAAU,CACRhE,EAAGiI,EACHhI,EAAGhD,EAAUgD,EAAIhD,EAAU8C,QAE7B,MAEF,KAAKpD,GACHqH,EAAU,CACRhE,EAAG/C,EAAU+C,EAAI/C,EAAU6C,MAC3BG,EAAGiI,GAEL,MAEF,KAAKjV,GACH+Q,EAAU,CACRhE,EAAG/C,EAAU+C,EAAI5c,EAAQ0c,MACzBG,EAAGiI,GAEL,MAEF,QACElE,EAAU,CACRhE,EAAG/C,EAAU+C,EACbC,EAAGhD,EAAUgD,GAInB,IAAIkI,EAAW7F,EAAgBd,GAAyBc,GAAiB,KAEzE,GAAgB,MAAZ6F,EAAkB,CACpB,IAAI9c,EAAmB,MAAb8c,EAAmB,SAAW,QAExC,OAAQpE,GACN,KAAK1L,GACH2L,EAAQmE,GAAYnE,EAAQmE,IAAalL,EAAU5R,GAAO,EAAIjI,EAAQiI,GAAO,GAC7E,MAEF,KAAKoN,GACHuL,EAAQmE,GAAYnE,EAAQmE,IAAalL,EAAU5R,GAAO,EAAIjI,EAAQiI,GAAO,IAOnF,OAAO2Y,EC1DM,SAASoE,GAAetJ,EAAOO,QAC5B,IAAZA,IACFA,EAAU,IAGZ,IAAIgJ,EAAWhJ,EACXiJ,EAAqBD,EAAShL,UAC9BA,OAAmC,IAAvBiL,EAAgCxJ,EAAMzB,UAAYiL,EAC9DC,EAAoBF,EAASG,SAC7BA,OAAiC,IAAtBD,EAA+BzL,GAAkByL,EAC5DE,EAAwBJ,EAASK,aACjCA,OAAyC,IAA1BD,EAAmC1L,GAAW0L,EAC7DE,EAAwBN,EAASO,eACjCA,OAA2C,IAA1BD,EAAmC3L,GAAS2L,EAC7DE,EAAuBR,EAASS,YAChCA,OAAuC,IAAzBD,GAA0CA,EACxDE,EAAmBV,EAAS7F,QAC5BA,OAA+B,IAArBuG,EAA8B,EAAIA,EAC5CjH,EAAgBD,GAAsC,iBAAZW,EAAuBA,EAAUT,GAAgBS,EAAS3F,KACpGmM,EAAaJ,IAAmB5L,GAASC,GAAYD,GACrD8G,EAAahF,EAAM2D,MAAMzF,OACzB5Z,EAAU0b,EAAMC,SAAS+J,EAAcE,EAAaJ,GACpDK,EJoBS,SAAyB7lB,EAASolB,EAAUE,GACzD,IAAIQ,EAAmC,oBAAbV,EAlB5B,SAA4BplB,GAC1B,IAAI0Z,EAAkBiK,GAAkBrG,GAActd,IAElD+lB,EADoB,CAAC,WAAY,SAAStf,QAAQ/D,GAAiB1C,GAAS+P,WAAa,GACnDoL,GAAcnb,GAAW0d,GAAgB1d,GAAWA,EAE9F,OAAKe,GAAUglB,GAKRrM,EAAgBtK,QAAO,SAAU8U,GACtC,OAAOnjB,GAAUmjB,IAAmBlhB,GAASkhB,EAAgB6B,IAAmD,SAAhClL,GAAYqJ,MALrF,GAYkD8B,CAAmBhmB,GAAW,GAAGoQ,OAAOgV,GAC/F1L,EAAkB,GAAGtJ,OAAO0V,EAAqB,CAACR,IAClDW,EAAsBvM,EAAgB,GACtCwM,EAAexM,EAAgBK,QAAO,SAAUoM,EAASjC,GAC3D,IAAIzU,EAAOwU,GAA2BjkB,EAASkkB,GAK/C,OAJAiC,EAAQxW,IAAM/I,GAAI6I,EAAKE,IAAKwW,EAAQxW,KACpCwW,EAAQ5M,MAAQ1S,GAAI4I,EAAK8J,MAAO4M,EAAQ5M,OACxC4M,EAAQ7M,OAASzS,GAAI4I,EAAK6J,OAAQ6M,EAAQ7M,QAC1C6M,EAAQtW,KAAOjJ,GAAI6I,EAAKI,KAAMsW,EAAQtW,MAC/BsW,IACNlC,GAA2BjkB,EAASimB,IAKvC,OAJAC,EAAaxJ,MAAQwJ,EAAa3M,MAAQ2M,EAAarW,KACvDqW,EAAavJ,OAASuJ,EAAa5M,OAAS4M,EAAavW,IACzDuW,EAAatJ,EAAIsJ,EAAarW,KAC9BqW,EAAarJ,EAAIqJ,EAAavW,IACvBuW,EIpCkBE,CAAgBrlB,GAAUf,GAAWA,EAAUA,EAAQqmB,gBAAkBhJ,GAAmB3B,EAAMC,SAAS/B,QAASwL,EAAUE,GACnJgB,EAAsB5W,GAAsBgM,EAAMC,SAAS9B,WAC3DmF,EAAgB4F,GAAe,CACjC/K,UAAWyM,EACXtmB,QAAS0gB,EACTxE,SAAU,WACVjC,UAAWA,IAETsM,EAAmBvC,GAAiBviB,OAAOoa,OAAO,GAAI6E,EAAY1B,IAClEwH,EAAoBhB,IAAmB5L,GAAS2M,EAAmBD,EAGnEG,EAAkB,CACpB9W,IAAKkW,EAAmBlW,IAAM6W,EAAkB7W,IAAM+O,EAAc/O,IACpE2J,OAAQkN,EAAkBlN,OAASuM,EAAmBvM,OAASoF,EAAcpF,OAC7EzJ,KAAMgW,EAAmBhW,KAAO2W,EAAkB3W,KAAO6O,EAAc7O,KACvE0J,MAAOiN,EAAkBjN,MAAQsM,EAAmBtM,MAAQmF,EAAcnF,OAExEmN,EAAahL,EAAMuD,cAAczP,OAErC,GAAIgW,IAAmB5L,IAAU8M,EAAY,CAC3C,IAAIlX,EAASkX,EAAWzM,GACxBxY,OAAOC,KAAK+kB,GAAiB9kB,SAAQ,SAAU6J,GAC7C,IAAImb,EAAW,CAACpN,GAAOD,IAAQ7S,QAAQ+E,IAAQ,EAAI,GAAK,EACpD2T,EAAO,CAACxP,GAAK2J,IAAQ7S,QAAQ+E,IAAQ,EAAI,IAAM,IACnDib,EAAgBjb,IAAQgE,EAAO2P,GAAQwH,KAI3C,OAAOF,ECzDM,SAASG,GAAqBlL,EAAOO,QAClC,IAAZA,IACFA,EAAU,IAGZ,IAAIgJ,EAAWhJ,EACXhC,EAAYgL,EAAShL,UACrBmL,EAAWH,EAASG,SACpBE,EAAeL,EAASK,aACxBlG,EAAU6F,EAAS7F,QACnByH,EAAiB5B,EAAS4B,eAC1BC,EAAwB7B,EAAS8B,sBACjCA,OAAkD,IAA1BD,EAAmCE,GAAgBF,EAC3EnG,EAAYL,GAAarG,GACzBC,EAAayG,EAAYkG,EAAiB/M,GAAsBA,GAAoB1K,QAAO,SAAU6K,GACvG,OAAOqG,GAAarG,KAAe0G,KAChClH,GACDwN,EAAoB/M,EAAW9K,QAAO,SAAU6K,GAClD,OAAO8M,EAAsBtgB,QAAQwT,IAAc,KAGpB,IAA7BgN,EAAkB7lB,SACpB6lB,EAAoB/M,GAQtB,IAAIgN,EAAYD,EAAkBlN,QAAO,SAAUC,EAAKC,GAOtD,OANAD,EAAIC,GAAa+K,GAAetJ,EAAO,CACrCzB,UAAWA,EACXmL,SAAUA,EACVE,aAAcA,EACdlG,QAASA,IACR5C,GAAiBvC,IACbD,IACN,IACH,OAAOvY,OAAOC,KAAKwlB,GAAWC,MAAK,SAAUC,EAAGC,GAC9C,OAAOH,EAAUE,GAAKF,EAAUG,MC6FpC,MAAAC,GAAe,CACb9iB,KAAM,OACN+W,SAAS,EACTC,MAAO,OACP7W,GA5HF,SAAc8W,GACZ,IAAIC,EAAQD,EAAKC,MACbO,EAAUR,EAAKQ,QACfzX,EAAOiX,EAAKjX,KAEhB,IAAIkX,EAAMuD,cAAcza,GAAM+iB,MAA9B,CAoCA,IAhCA,IAAIC,EAAoBvL,EAAQ8I,SAC5B0C,OAAsC,IAAtBD,GAAsCA,EACtDE,EAAmBzL,EAAQ0L,QAC3BC,OAAoC,IAArBF,GAAqCA,EACpDG,EAA8B5L,EAAQ6L,mBACtC1I,EAAUnD,EAAQmD,QAClBgG,EAAWnJ,EAAQmJ,SACnBE,EAAerJ,EAAQqJ,aACvBI,EAAczJ,EAAQyJ,YACtBqC,EAAwB9L,EAAQ4K,eAChCA,OAA2C,IAA1BkB,GAA0CA,EAC3DhB,EAAwB9K,EAAQ8K,sBAChCiB,EAAqBtM,EAAMO,QAAQhC,UACnCiF,EAAgB1C,GAAiBwL,GAEjCF,EAAqBD,IADH3I,IAAkB8I,GACqCnB,EAjC/E,SAAuC5M,GACrC,GAAIuC,GAAiBvC,KAAeT,GAClC,MAAO,GAGT,IAAIyO,EAAoBnF,GAAqB7I,GAC7C,MAAO,CAAC+I,GAA8B/I,GAAYgO,EAAmBjF,GAA8BiF,IA2BwCC,CAA8BF,GAA3E,CAAClF,GAAqBkF,KAChH9N,EAAa,CAAC8N,GAAoB5X,OAAO0X,GAAoB/N,QAAO,SAAUC,EAAKC,GACrF,OAAOD,EAAI5J,OAAOoM,GAAiBvC,KAAeT,GAAOoN,GAAqBlL,EAAO,CACnFzB,UAAWA,EACXmL,SAAUA,EACVE,aAAcA,EACdlG,QAASA,EACTyH,eAAgBA,EAChBE,sBAAuBA,IACpB9M,KACJ,IACCkO,EAAgBzM,EAAM2D,MAAMxF,UAC5B6G,EAAahF,EAAM2D,MAAMzF,OACzBwO,EAAY,IAAIvc,IAChBwc,GAAqB,EACrBC,EAAwBpO,EAAW,GAE9BlS,EAAI,EAAGA,EAAIkS,EAAW9Y,OAAQ4G,IAAK,CAC1C,IAAIiS,EAAYC,EAAWlS,GAEvBugB,EAAiB/L,GAAiBvC,GAElCuO,EAAmBlI,GAAarG,KAAehF,GAC/CwT,EAAa,CAAC9Y,GAAK2J,IAAQ7S,QAAQ8hB,IAAmB,EACtDtgB,EAAMwgB,EAAa,QAAU,SAC7BlF,EAAWyB,GAAetJ,EAAO,CACnCzB,UAAWA,EACXmL,SAAUA,EACVE,aAAcA,EACdI,YAAaA,EACbtG,QAASA,IAEPsJ,EAAoBD,EAAaD,EAAmBjP,GAAQ1J,GAAO2Y,EAAmBlP,GAAS3J,GAE/FwY,EAAclgB,GAAOyY,EAAWzY,KAClCygB,EAAoB5F,GAAqB4F,IAG3C,IAAIC,EAAmB7F,GAAqB4F,GACxCE,EAAS,GAUb,GARInB,GACFmB,EAAO3jB,KAAKse,EAASgF,IAAmB,GAGtCX,GACFgB,EAAO3jB,KAAKse,EAASmF,IAAsB,EAAGnF,EAASoF,IAAqB,GAG1EC,EAAOC,OAAM,SAAUC,GACzB,OAAOA,KACL,CACFR,EAAwBrO,EACxBoO,GAAqB,EACrB,MAGFD,EAAUrc,IAAIkO,EAAW2O,GAG3B,GAAIP,EAqBF,IAnBA,IAEIU,EAAQ,SAAeC,GACzB,IAAIC,EAAmB/O,EAAW/J,MAAK,SAAU8J,GAC/C,IAAI2O,EAASR,EAAU1c,IAAIuO,GAE3B,GAAI2O,EACF,OAAOA,EAAOre,MAAM,EAAGye,GAAIH,OAAM,SAAUC,GACzC,OAAOA,QAKb,GAAIG,EAEF,OADAX,EAAwBW,EACjB,SAIFD,EAnBYnC,EAAiB,EAAI,EAmBZmC,EAAK,GAGpB,UAFFD,EAAMC,GADmBA,KAOpCtN,EAAMzB,YAAcqO,IACtB5M,EAAMuD,cAAcza,GAAM+iB,OAAQ,EAClC7L,EAAMzB,UAAYqO,EAClB5M,EAAMwN,OAAQ,KAUhB7I,iBAAkB,CAAC,UACnBnS,KAAM,CACJqZ,OAAO,IC7IX,SAAS4B,GAAe5F,EAAU9T,EAAM2Z,GAQtC,YAPyB,IAArBA,IACFA,EAAmB,CACjBxM,EAAG,EACHC,EAAG,IAIA,CACLlN,IAAK4T,EAAS5T,IAAMF,EAAKkN,OAASyM,EAAiBvM,EACnDtD,MAAOgK,EAAShK,MAAQ9J,EAAKiN,MAAQ0M,EAAiBxM,EACtDtD,OAAQiK,EAASjK,OAAS7J,EAAKkN,OAASyM,EAAiBvM,EACzDhN,KAAM0T,EAAS1T,KAAOJ,EAAKiN,MAAQ0M,EAAiBxM,GAIxD,SAASyM,GAAsB9F,GAC7B,MAAO,CAAC5T,GAAK4J,GAAOD,GAAQzJ,IAAMyZ,MAAK,SAAUC,GAC/C,OAAOhG,EAASgG,IAAS,KAiC7B,MAAAC,GAAe,CACbhlB,KAAM,OACN+W,SAAS,EACTC,MAAO,OACP6E,iBAAkB,CAAC,mBACnB1b,GAlCF,SAAc8W,GACZ,IAAIC,EAAQD,EAAKC,MACblX,EAAOiX,EAAKjX,KACZ2jB,EAAgBzM,EAAM2D,MAAMxF,UAC5B6G,EAAahF,EAAM2D,MAAMzF,OACzBwP,EAAmB1N,EAAMuD,cAAcwK,gBACvCC,EAAoB1E,GAAetJ,EAAO,CAC5C8J,eAAgB,cAEdmE,EAAoB3E,GAAetJ,EAAO,CAC5CgK,aAAa,IAEXkE,EAA2BT,GAAeO,EAAmBvB,GAC7D0B,EAAsBV,GAAeQ,EAAmBjJ,EAAY0I,GACpEU,EAAoBT,GAAsBO,GAC1CG,EAAmBV,GAAsBQ,GAC7CnO,EAAMuD,cAAcza,GAAQ,CAC1BolB,yBAA0BA,EAC1BC,oBAAqBA,EACrBC,kBAAmBA,EACnBC,iBAAkBA,GAEpBrO,EAAMxM,WAAW0K,OAASnY,OAAOoa,OAAO,GAAIH,EAAMxM,WAAW0K,OAAQ,CACnE,+BAAgCkQ,EAChC,sBAAuBC,MCH3BC,GAAe,CACbxlB,KAAM,SACN+W,SAAS,EACTC,MAAO,OACPe,SAAU,CAAC,iBACX5X,GA5BF,SAAgBoX,GACd,IAAIL,EAAQK,EAAML,MACdO,EAAUF,EAAME,QAChBzX,EAAOuX,EAAMvX,KACbylB,EAAkBhO,EAAQzM,OAC1BA,OAA6B,IAApBya,EAA6B,CAAC,EAAG,GAAKA,EAC/C/b,EAAOgM,GAAWH,QAAO,SAAUC,EAAKC,GAE1C,OADAD,EAAIC,GA5BD,SAAiCA,EAAWoF,EAAO7P,GACxD,IAAI0P,EAAgB1C,GAAiBvC,GACjCiQ,EAAiB,CAACra,GAAMF,IAAKlJ,QAAQyY,IAAkB,GAAK,EAAI,EAEhEzD,EAAyB,mBAAXjM,EAAwBA,EAAO/N,OAAOoa,OAAO,GAAIwD,EAAO,CACxEpF,UAAWA,KACPzK,EACF2a,EAAW1O,EAAK,GAChB2O,EAAW3O,EAAK,GAIpB,OAFA0O,EAAWA,GAAY,EACvBC,GAAYA,GAAY,GAAKF,EACtB,CAACra,GAAM0J,IAAO9S,QAAQyY,IAAkB,EAAI,CACjDtC,EAAGwN,EACHvN,EAAGsN,GACD,CACFvN,EAAGuN,EACHtN,EAAGuN,GAWcC,CAAwBpQ,EAAWyB,EAAM2D,MAAO7P,GAC1DwK,IACN,IACCsQ,EAAwBpc,EAAKwN,EAAMzB,WACnC2C,EAAI0N,EAAsB1N,EAC1BC,EAAIyN,EAAsBzN,EAEW,MAArCnB,EAAMuD,cAAcD,gBACtBtD,EAAMuD,cAAcD,cAAcpC,GAAKA,EACvClB,EAAMuD,cAAcD,cAAcnC,GAAKA,GAGzCnB,EAAMuD,cAAcza,GAAQ0J,ICxB9Bqc,GAAe,CACb/lB,KAAM,gBACN+W,SAAS,EACTC,MAAO,OACP7W,GApBF,SAAuB8W,GACrB,IAAIC,EAAQD,EAAKC,MACblX,EAAOiX,EAAKjX,KAKhBkX,EAAMuD,cAAcza,GAAQogB,GAAe,CACzC/K,UAAW6B,EAAM2D,MAAMxF,UACvB7Z,QAAS0b,EAAM2D,MAAMzF,OACrBsC,SAAU,WACVjC,UAAWyB,EAAMzB,aAUnB/L,KAAM,IC6FRsc,GAAe,CACbhmB,KAAM,kBACN+W,SAAS,EACTC,MAAO,OACP7W,GA5GF,SAAyB8W,GACvB,IAAIC,EAAQD,EAAKC,MACbO,EAAUR,EAAKQ,QACfzX,EAAOiX,EAAKjX,KACZgjB,EAAoBvL,EAAQ8I,SAC5B0C,OAAsC,IAAtBD,GAAsCA,EACtDE,EAAmBzL,EAAQ0L,QAC3BC,OAAoC,IAArBF,GAAsCA,EACrDtC,EAAWnJ,EAAQmJ,SACnBE,EAAerJ,EAAQqJ,aACvBI,EAAczJ,EAAQyJ,YACtBtG,EAAUnD,EAAQmD,QAClBqL,EAAkBxO,EAAQyO,OAC1BA,OAA6B,IAApBD,GAAoCA,EAC7CE,EAAwB1O,EAAQ2O,aAChCA,OAAyC,IAA1BD,EAAmC,EAAIA,EACtDpH,EAAWyB,GAAetJ,EAAO,CACnC0J,SAAUA,EACVE,aAAcA,EACdlG,QAASA,EACTsG,YAAaA,IAEXxG,EAAgB1C,GAAiBd,EAAMzB,WACvC0G,EAAYL,GAAa5E,EAAMzB,WAC/B4Q,GAAmBlK,EACnBoE,EAAW3G,GAAyBc,GACpCyI,ECrCY,MDqCS5C,ECrCH,IAAM,IDsCxB/F,EAAgBtD,EAAMuD,cAAcD,cACpCmJ,EAAgBzM,EAAM2D,MAAMxF,UAC5B6G,EAAahF,EAAM2D,MAAMzF,OACzBkR,EAA4C,mBAAjBF,EAA8BA,EAAanpB,OAAOoa,OAAO,GAAIH,EAAM2D,MAAO,CACvGpF,UAAWyB,EAAMzB,aACb2Q,EACF1c,EAAO,CACT0O,EAAG,EACHC,EAAG,GAGL,GAAKmC,EAAL,CAIA,GAAIyI,GAAiBG,EAAc,CACjC,IAAImD,EAAwB,MAAbhG,EAAmBpV,GAAME,GACpCmb,EAAuB,MAAbjG,EAAmBzL,GAASC,GACtCtR,EAAmB,MAAb8c,EAAmB,SAAW,QACpCvV,EAASwP,EAAc+F,GACvBle,EAAMmY,EAAc+F,GAAYxB,EAASwH,GACzCnkB,EAAMoY,EAAc+F,GAAYxB,EAASyH,GACzCC,EAAWP,GAAUhK,EAAWzY,GAAO,EAAI,EAC3CijB,EAASvK,IAAc1L,GAAQkT,EAAclgB,GAAOyY,EAAWzY,GAC/DkjB,EAASxK,IAAc1L,IAASyL,EAAWzY,IAAQkgB,EAAclgB,GAGjE8W,EAAerD,EAAMC,SAASS,MAC9BmD,EAAYmL,GAAU3L,EAAejC,GAAciC,GAAgB,CACrErC,MAAO,EACPC,OAAQ,GAENyO,EAAqB1P,EAAMuD,cAAc,oBAAsBvD,EAAMuD,cAAc,oBAAoBG,QxBtEtG,CACLzP,IAAK,EACL4J,MAAO,EACPD,OAAQ,EACRzJ,KAAM,GwBmEFwb,EAAkBD,EAAmBL,GACrCO,EAAkBF,EAAmBJ,GAMrCO,EAAWjN,GAAO,EAAG6J,EAAclgB,GAAMsX,EAAUtX,IACnDujB,EAAYX,EAAkB1C,EAAclgB,GAAO,EAAIgjB,EAAWM,EAAWF,EAAkBP,EAAoBI,EAASK,EAAWF,EAAkBP,EACzJW,EAAYZ,GAAmB1C,EAAclgB,GAAO,EAAIgjB,EAAWM,EAAWD,EAAkBR,EAAoBK,EAASI,EAAWD,EAAkBR,EAC1JlL,EAAoBlE,EAAMC,SAASS,OAASsB,GAAgBhC,EAAMC,SAASS,OAC3EsP,EAAe9L,EAAiC,MAAbmF,EAAmBnF,EAAkByE,WAAa,EAAIzE,EAAkB0E,YAAc,EAAI,EAC7HqH,EAAsBjQ,EAAMuD,cAAczP,OAASkM,EAAMuD,cAAczP,OAAOkM,EAAMzB,WAAW8K,GAAY,EAC3G6G,EAAY5M,EAAc+F,GAAYyG,EAAYG,EAAsBD,EACxEG,EAAY7M,EAAc+F,GAAY0G,EAAYE,EAEtD,GAAIlE,EAAe,CACjB,IAAIqE,EAAkBxN,GAAOoM,EAASlM,GAAQ3X,EAAK+kB,GAAa/kB,EAAK2I,EAAQkb,EAASnM,GAAQ3X,EAAKilB,GAAajlB,GAChHoY,EAAc+F,GAAY+G,EAC1B5d,EAAK6W,GAAY+G,EAAkBtc,EAGrC,GAAIoY,EAAc,CAChB,IAAImE,EAAyB,MAAbhH,EAAmBpV,GAAME,GAErCmc,EAAwB,MAAbjH,EAAmBzL,GAASC,GAEvC0S,EAAUjN,EAAc2I,GAExBuE,EAAOD,EAAU1I,EAASwI,GAE1BI,GAAOF,EAAU1I,EAASyI,GAE1BI,GAAmB9N,GAAOoM,EAASlM,GAAQ0N,EAAMN,GAAaM,EAAMD,EAASvB,EAASnM,GAAQ4N,GAAMN,GAAaM,IAErHnN,EAAc2I,GAAWyE,GACzBle,EAAKyZ,GAAWyE,GAAmBH,GAIvCvQ,EAAMuD,cAAcza,GAAQ0J,IAS5BmS,iBAAkB,CAAC,WExGN,SAASgM,GAAiBC,EAAyB7O,EAAc8O,QAC9D,IAAZA,IACFA,GAAU,GAGZ,IAAIC,EAA0BrR,GAAcsC,GACjBtC,GAAcsC,IAf3C,SAAyBzd,GACvB,IAAIyP,EAAOzP,EAAQ0P,wBACND,EAAKiN,MAAQ1c,EAAQgd,YACrBvN,EAAKkN,OAAS3c,EAAQ4D,aAYuB6oB,CAAgBhP,GAC1E,ICpBoCzC,ECJOhb,EFwBvCoD,EAAkBia,GAAmBI,GACrChO,EAAOC,GAAsB4c,GAC7B/J,EAAS,CACXW,WAAY,EACZC,UAAW,GAETvC,EAAU,CACZhE,EAAG,EACHC,EAAG,GAkBL,OAfI2P,IAA4BA,IAA4BD,MACxB,SAA9B1R,GAAY4C,IAChB4F,GAAejgB,MACbmf,GClCgCvH,EDkCTyC,KCjCd1C,GAAUC,IAAUG,GAAcH,GCJxC,CACLkI,YAFyCljB,EDQbgb,GCNRkI,WACpBC,UAAWnjB,EAAQmjB,WDGZF,GAAgBjI,IDmCnBG,GAAcsC,KAChBmD,EAAUlR,GAAsB+N,IACxBb,GAAKa,EAAa6G,WAC1B1D,EAAQ/D,GAAKY,EAAa4G,WACjBjhB,IACTwd,EAAQhE,EAAIwG,GAAoBhgB,KAI7B,CACLwZ,EAAGnN,EAAKI,KAAO0S,EAAOW,WAAatC,EAAQhE,EAC3CC,EAAGpN,EAAKE,IAAM4S,EAAOY,UAAYvC,EAAQ/D,EACzCH,MAAOjN,EAAKiN,MACZC,OAAQlN,EAAKkN,QGpDjB,SAASnI,GAAMkY,GACb,IAAItb,EAAM,IAAIvF,IACV8gB,EAAU,IAAInlB,IACdolB,EAAS,GAKb,SAASzF,EAAK0F,GACZF,EAAQnX,IAAIqX,EAASroB,MACN,GAAG4L,OAAOyc,EAAStQ,UAAY,GAAIsQ,EAASxM,kBAAoB,IACtE1e,SAAQ,SAAUmrB,GACzB,IAAKH,EAAQjkB,IAAIokB,GAAM,CACrB,IAAIC,EAAc3b,EAAI1F,IAAIohB,GAEtBC,GACF5F,EAAK4F,OAIXH,EAAO3nB,KAAK4nB,GASd,OAzBAH,EAAU/qB,SAAQ,SAAUkrB,GAC1Bzb,EAAIrF,IAAI8gB,EAASroB,KAAMqoB,MAkBzBH,EAAU/qB,SAAQ,SAAUkrB,GACrBF,EAAQjkB,IAAImkB,EAASroB,OAExB2iB,EAAK0F,MAGFD,ECfT,IAAII,GAAkB,CACpB/S,UAAW,SACXyS,UAAW,GACXxQ,SAAU,YAGZ,SAAS+Q,KACP,IAAK,IAAIC,EAAOC,UAAU/rB,OAAQsJ,EAAO,IAAI2B,MAAM6gB,GAAOE,EAAO,EAAGA,EAAOF,EAAME,IAC/E1iB,EAAK0iB,GAAQD,UAAUC,GAGzB,OAAQ1iB,EAAK4e,MAAK,SAAUtpB,GAC1B,QAASA,GAAoD,mBAAlCA,EAAQ0P,0BAIhC,SAAS2d,GAAgBC,QACL,IAArBA,IACFA,EAAmB,IAGrB,IAAIC,EAAoBD,EACpBE,EAAwBD,EAAkBE,iBAC1CA,OAA6C,IAA1BD,EAAmC,GAAKA,EAC3DE,EAAyBH,EAAkBI,eAC3CA,OAA4C,IAA3BD,EAAoCV,GAAkBU,EAC3E,OAAO,SAAsB7T,EAAWD,EAAQqC,QAC9B,IAAZA,IACFA,EAAU0R,GAGZ,IC/C6BhpB,EAC3BipB,ED8CElS,EAAQ,CACVzB,UAAW,SACX4T,iBAAkB,GAClB5R,QAASxa,OAAOoa,OAAO,GAAImR,GAAiBW,GAC5C1O,cAAe,GACftD,SAAU,CACR9B,UAAWA,EACXD,OAAQA,GAEV1K,WAAY,GACZ0M,OAAQ,IAENkS,EAAmB,GACnBC,GAAc,EACd/hB,EAAW,CACb0P,MAAOA,EACPsS,WAAY,SAAoBC,GAC9B,IAAIhS,EAAsC,mBAArBgS,EAAkCA,EAAiBvS,EAAMO,SAAWgS,EACzFC,IACAxS,EAAMO,QAAUxa,OAAOoa,OAAO,GAAI8R,EAAgBjS,EAAMO,QAASA,GACjEP,EAAMgH,cAAgB,CACpB7I,UAAW9Y,GAAU8Y,GAAa8J,GAAkB9J,GAAaA,EAAUwM,eAAiB1C,GAAkB9J,EAAUwM,gBAAkB,GAC1IzM,OAAQ+J,GAAkB/J,IAI5B,IEzE4B8S,EAC9ByB,EFwEMN,EDvCG,SAAwBnB,GAErC,IAAImB,EAAmBrZ,GAAMkY,GAE7B,OAAO9R,GAAeb,QAAO,SAAUC,EAAKwB,GAC1C,OAAOxB,EAAI5J,OAAOyd,EAAiBze,QAAO,SAAUyd,GAClD,OAAOA,EAASrR,QAAUA,QAE3B,IC+B0B4S,EEzEK1B,EFyEsB,GAAGtc,OAAOqd,EAAkB/R,EAAMO,QAAQyQ,WExE9FyB,EAASzB,EAAU3S,QAAO,SAAUoU,EAAQE,GAC9C,IAAIC,EAAWH,EAAOE,EAAQ7pB,MAK9B,OAJA2pB,EAAOE,EAAQ7pB,MAAQ8pB,EAAW7sB,OAAOoa,OAAO,GAAIyS,EAAUD,EAAS,CACrEpS,QAASxa,OAAOoa,OAAO,GAAIyS,EAASrS,QAASoS,EAAQpS,SACrD/N,KAAMzM,OAAOoa,OAAO,GAAIyS,EAASpgB,KAAMmgB,EAAQngB,QAC5CmgB,EACEF,IACN,IAEI1sB,OAAOC,KAAKysB,GAAQ/c,KAAI,SAAU5F,GACvC,OAAO2iB,EAAO3iB,QFuGV,OAvCAkQ,EAAMmS,iBAAmBA,EAAiBze,QAAO,SAAUmf,GACzD,OAAOA,EAAEhT,WAqJbG,EAAMmS,iBAAiBlsB,SAAQ,SAAUqf,GACvC,IAAIxc,EAAOwc,EAAMxc,KACbgqB,EAAgBxN,EAAM/E,QACtBA,OAA4B,IAAlBuS,EAA2B,GAAKA,EAC1C1S,EAASkF,EAAMlF,OAEnB,GAAsB,mBAAXA,EAAuB,CAChC,IAAI2S,EAAY3S,EAAO,CACrBJ,MAAOA,EACPlX,KAAMA,EACNwH,SAAUA,EACViQ,QAASA,IAKX6R,EAAiB7oB,KAAKwpB,GAFT,kBA7HRziB,EAAS4W,UAOlB8L,YAAa,WACX,IAAIX,EAAJ,CAIA,IAAIY,EAAkBjT,EAAMC,SACxB9B,EAAY8U,EAAgB9U,UAC5BD,EAAS+U,EAAgB/U,OAG7B,GAAKqT,GAAiBpT,EAAWD,GAAjC,CASA8B,EAAM2D,MAAQ,CACZxF,UAAWwS,GAAiBxS,EAAW6D,GAAgB9D,GAAoC,UAA3B8B,EAAMO,QAAQC,UAC9EtC,OAAQkD,GAAclD,IAOxB8B,EAAMwN,OAAQ,EACdxN,EAAMzB,UAAYyB,EAAMO,QAAQhC,UAKhCyB,EAAMmS,iBAAiBlsB,SAAQ,SAAUkrB,GACvC,OAAOnR,EAAMuD,cAAc4N,EAASroB,MAAQ/C,OAAOoa,OAAO,GAAIgR,EAAS3e,SAIzE,IAAK,IAAI1H,EAAQ,EAAGA,EAAQkV,EAAMmS,iBAAiBzsB,OAAQoF,IAUzD,IAAoB,IAAhBkV,EAAMwN,MAAV,CAMA,IAAI0F,EAAwBlT,EAAMmS,iBAAiBrnB,GAC/C7B,EAAKiqB,EAAsBjqB,GAC3BkqB,EAAyBD,EAAsB3S,QAC/CgJ,OAAsC,IAA3B4J,EAAoC,GAAKA,EACpDrqB,EAAOoqB,EAAsBpqB,KAEf,mBAAPG,IACT+W,EAAQ/W,EAAG,CACT+W,MAAOA,EACPO,QAASgJ,EACTzgB,KAAMA,EACNwH,SAAUA,KACN0P,QAjBNA,EAAMwN,OAAQ,EACd1iB,GAAS,KAsBfoc,QClM2Bje,EDkMV,WACf,OAAO,IAAImqB,SAAQ,SAAUC,GAC3B/iB,EAAS0iB,cACTK,EAAQrT,OCnMT,WAUL,OATKkS,IACHA,EAAU,IAAIkB,SAAQ,SAAUC,GAC9BD,QAAQC,UAAUC,MAAK,WACrBpB,OAAUzf,EACV4gB,EAAQpqB,YAKPipB,ID4LLqB,QAAS,WACPf,IACAH,GAAc,IAIlB,IAAKd,GAAiBpT,EAAWD,GAK/B,OAAO5N,EAmCT,SAASkiB,IACPJ,EAAiBnsB,SAAQ,SAAUgD,GACjC,OAAOA,OAETmpB,EAAmB,GAGrB,OAvCA9hB,EAASgiB,WAAW/R,GAAS+S,MAAK,SAAUtT,IACrCqS,GAAe9R,EAAQiT,eAC1BjT,EAAQiT,cAAcxT,MAqCnB1P,GAGJ,IAAImjB,GAA4B9B,KG1PnC8B,GAA4B9B,GAAgB,CAC9CI,iBAFqB,CAACpL,GAAgBrD,GAAeoQ,GAAeC,MCMlEF,GAA4B9B,GAAgB,CAC9CI,iBAFqB,CAACpL,GAAgBrD,GAAeoQ,GAAeC,GAAa7f,GAAQ8f,GAAM7F,GAAiBrN,GAAO7D,0iBCsBnH9T,GAAO,WAKP8qB,GAAa,SACbC,GAAY,QAEZC,GAAe,UACfC,GAAiB,YAGjBC,GAAiB,IAAIvtB,OAAQ,4BAM7BwtB,GAAwB,6BACxBC,GAA0B,+BAG1BtY,GAAkB,OAMlBnJ,GAAuB,8BACvB0hB,GAAgB,iBAIhBC,GAAgB7rB,IAAU,UAAY,YACtC8rB,GAAmB9rB,IAAU,YAAc,UAC3C+rB,GAAmB/rB,IAAU,aAAe,eAC5CgsB,GAAsBhsB,IAAU,eAAiB,aACjDisB,GAAkBjsB,IAAU,aAAe,cAC3CksB,GAAiBlsB,IAAU,cAAgB,aAE3CqN,GAAU,CACd/B,OAAQ,CAAC,EAAG,GACZ4V,SAAU,kBACVvL,UAAW,SACXwW,QAAS,UACTC,aAAc,KACdC,WAAW,GAGPze,GAAc,CAClBtC,OAAQ,0BACR4V,SAAU,mBACVvL,UAAW,0BACXwW,QAAS,SACTC,aAAc,yBACdC,UAAW,oBASb,MAAMC,WAAiB/jB,EACrBC,YAAY1M,EAASuB,GACnBmR,MAAM1S,GAENgJ,KAAKynB,QAAU,KACfznB,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAK0nB,MAAQ1nB,KAAK2nB,kBAClB3nB,KAAK4nB,UAAY5nB,KAAK6nB,gBAKbtf,qBACT,OAAOA,GAGEO,yBACT,OAAOA,GAGErN,kBACT,OAAOA,GAKT6J,SACE,OAAOtF,KAAKsP,WAAatP,KAAKuP,OAASvP,KAAKwP,OAG9CA,OACE,GAAI5V,EAAWoG,KAAK2D,WAAa3D,KAAKsP,SAAStP,KAAK0nB,OAClD,OAGF,MAAM5nB,EAAgB,CACpBA,cAAeE,KAAK2D,UAKtB,GAFkBrD,EAAamB,QAAQzB,KAAK2D,SAvF5B,mBAuFkD7D,GAEpDiC,iBACZ,OAGF,MAAMuM,EAASkZ,GAASM,qBAAqB9nB,KAAK2D,UAE9C3D,KAAK4nB,UACP/hB,EAAYC,iBAAiB9F,KAAK0nB,MAAO,SAAU,QAEnD1nB,KAAK+nB,cAAczZ,GAOjB,iBAAkB7W,SAAS2C,kBAC5BkU,EAAO1J,QA5Fc,gBA6FtB,GAAGwC,UAAU3P,SAASuD,KAAKwM,UACxB7O,SAAQqW,GAAQ1O,EAAaQ,GAAGkO,EAAM,YAAatU,KAGxDsF,KAAK2D,SAASqkB,QACdhoB,KAAK2D,SAAS4B,aAAa,iBAAiB,GAE5CvF,KAAK0nB,MAAM3tB,UAAUyS,IAAI+B,IACzBvO,KAAK2D,SAAS5J,UAAUyS,IAAI+B,IAC5BjO,EAAamB,QAAQzB,KAAK2D,SAnHT,oBAmHgC7D,GAGnDyP,OACE,GAAI3V,EAAWoG,KAAK2D,YAAc3D,KAAKsP,SAAStP,KAAK0nB,OACnD,OAGF,MAAM5nB,EAAgB,CACpBA,cAAeE,KAAK2D,UAGtB3D,KAAKioB,cAAcnoB,GAGrB+D,UACM7D,KAAKynB,SACPznB,KAAKynB,QAAQxB,UAGfvc,MAAM7F,UAGR+V,SACE5Z,KAAK4nB,UAAY5nB,KAAK6nB,gBAClB7nB,KAAKynB,SACPznB,KAAKynB,QAAQ7N,SAMjBqO,cAAcnoB,GACMQ,EAAamB,QAAQzB,KAAK2D,SAvJ5B,mBAuJkD7D,GACpDiC,mBAMV,iBAAkBtK,SAAS2C,iBAC7B,GAAGgN,UAAU3P,SAASuD,KAAKwM,UACxB7O,SAAQqW,GAAQ1O,EAAaC,IAAIyO,EAAM,YAAatU,KAGrDsF,KAAKynB,SACPznB,KAAKynB,QAAQxB,UAGfjmB,KAAK0nB,MAAM3tB,UAAUwJ,OAAOgL,IAC5BvO,KAAK2D,SAAS5J,UAAUwJ,OAAOgL,IAC/BvO,KAAK2D,SAAS4B,aAAa,gBAAiB,SAC5CM,EAAYE,oBAAoB/F,KAAK0nB,MAAO,UAC5CpnB,EAAamB,QAAQzB,KAAK2D,SA1KR,qBA0KgC7D,IAGpDsK,WAAW7R,GAST,GARAA,EAAS,IACJyH,KAAK0D,YAAY6E,WACjB1C,EAAYI,kBAAkBjG,KAAK2D,aACnCpL,GAGLF,EAAgBoD,GAAMlD,EAAQyH,KAAK0D,YAAYoF,aAEf,iBAArBvQ,EAAOsY,YAA2B9Y,EAAUQ,EAAOsY,YACV,mBAA3CtY,EAAOsY,UAAUnK,sBAGxB,MAAM,IAAIpN,UAAW,GAAEmC,GAAKlC,+GAG9B,OAAOhB,EAGTwvB,cAAczZ,GACZ,QAAsB,IAAX4Z,GACT,MAAM,IAAI5uB,UAAU,gEAGtB,IAAI6uB,EAAmBnoB,KAAK2D,SAEG,WAA3B3D,KAAKmK,QAAQ0G,UACfsX,EAAmB7Z,EACVvW,EAAUiI,KAAKmK,QAAQ0G,WAChCsX,EAAmBhwB,EAAW6H,KAAKmK,QAAQ0G,WACA,iBAA3B7Q,KAAKmK,QAAQ0G,YAC7BsX,EAAmBnoB,KAAKmK,QAAQ0G,WAGlC,MAAMyW,EAAetnB,KAAKooB,mBACpBC,EAAkBf,EAAa5D,UAAUvc,MAAK0c,GAA8B,gBAAlBA,EAASroB,OAA+C,IAArBqoB,EAAStR,UAE5GvS,KAAKynB,QAAUS,GAAoBC,EAAkBnoB,KAAK0nB,MAAOJ,GAE7De,GACFxiB,EAAYC,iBAAiB9F,KAAK0nB,MAAO,SAAU,UAIvDpY,SAAStY,EAAUgJ,KAAK2D,UACtB,OAAO3M,EAAQ+C,UAAUC,SAASuU,IAGpCoZ,kBACE,OAAOzgB,EAAec,KAAKhI,KAAK2D,SAAUmjB,IAAe,GAG3DwB,gBACE,MAAMC,EAAiBvoB,KAAK2D,SAASlJ,WAErC,GAAI8tB,EAAexuB,UAAUC,SA3NN,WA4NrB,OAAOmtB,GAGT,GAAIoB,EAAexuB,UAAUC,SA9NJ,aA+NvB,OAAOotB,GAIT,MAAMoB,EAAkF,QAA1E9uB,iBAAiBsG,KAAK0nB,OAAO/tB,iBAAiB,iBAAiBpC,OAE7E,OAAIgxB,EAAexuB,UAAUC,SAvOP,UAwObwuB,EAAQxB,GAAmBD,GAG7ByB,EAAQtB,GAAsBD,GAGvCY,gBACE,OAA0D,OAAnD7nB,KAAK2D,SAASiB,QAAS,WAGhC6jB,aACE,MAAMjiB,OAAEA,GAAWxG,KAAKmK,QAExB,MAAsB,iBAAX3D,EACFA,EAAOlP,MAAM,KAAK8Q,KAAI3C,GAAO/I,OAAOwQ,SAASzH,EAAK,MAGrC,mBAAXe,EACFkiB,GAAcliB,EAAOkiB,EAAY1oB,KAAK2D,UAGxC6C,EAGT4hB,mBACE,MAAMO,EAAwB,CAC5B1X,UAAWjR,KAAKsoB,gBAChB5E,UAAW,CAAC,CACVloB,KAAM,kBACNyX,QAAS,CACPmJ,SAAUpc,KAAKmK,QAAQiS,WAG3B,CACE5gB,KAAM,SACNyX,QAAS,CACPzM,OAAQxG,KAAKyoB,iBAanB,MAP6B,WAAzBzoB,KAAKmK,QAAQkd,UACfsB,EAAsBjF,UAAY,CAAC,CACjCloB,KAAM,cACN+W,SAAS,KAIN,IACFoW,KACsC,mBAA9B3oB,KAAKmK,QAAQmd,aAA8BtnB,KAAKmK,QAAQmd,aAAaqB,GAAyB3oB,KAAKmK,QAAQmd,cAI1HsB,iBAAgBpmB,IAAEA,EAAFxF,OAAOA,IACrB,MAAM6rB,EAAQ3hB,EAAeC,KAxRF,8DAwR+BnH,KAAK0nB,OAAOthB,OAAO5M,GAExEqvB,EAAMzwB,QAMX+E,EAAqB0rB,EAAO7rB,EAAQwF,IAAQkkB,IAAiBmC,EAAMzxB,SAAS4F,IAASgrB,QAKjE7jB,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOsiB,GAAS3iB,oBAAoB7E,KAAMzH,GAEhD,GAAsB,iBAAXA,EAAX,CAIA,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,SAIQ4L,kBAACjF,GAChB,GAAIA,IA3UmB,IA2UTA,EAAM0G,QAAiD,UAAf1G,EAAMsB,MA9UhD,QA8UoEtB,EAAMsD,KACpF,OAGF,MAAMsmB,EAAU5hB,EAAeC,KAAK/B,IAEpC,IAAK,IAAIpG,EAAI,EAAGC,EAAM6pB,EAAQ1wB,OAAQ4G,EAAIC,EAAKD,IAAK,CAClD,MAAM+pB,EAAUvB,GAASpjB,YAAY0kB,EAAQ9pB,IAC7C,IAAK+pB,IAAyC,IAA9BA,EAAQ5e,QAAQod,UAC9B,SAGF,IAAKwB,EAAQzZ,WACX,SAGF,MAAMxP,EAAgB,CACpBA,cAAeipB,EAAQplB,UAGzB,GAAIzE,EAAO,CACT,MAAM8pB,EAAe9pB,EAAM8pB,eACrBC,EAAeD,EAAa5xB,SAAS2xB,EAAQrB,OACnD,GACEsB,EAAa5xB,SAAS2xB,EAAQplB,WACC,WAA9BolB,EAAQ5e,QAAQod,YAA2B0B,GACb,YAA9BF,EAAQ5e,QAAQod,WAA2B0B,EAE5C,SAIF,GAAIF,EAAQrB,MAAM1tB,SAASkF,EAAMlC,UAA4B,UAAfkC,EAAMsB,MA9W5C,QA8WgEtB,EAAMsD,KAAoB,qCAAqCnJ,KAAK6F,EAAMlC,OAAO2H,UACvJ,SAGiB,UAAfzF,EAAMsB,OACRV,EAAc4E,WAAaxF,GAI/B6pB,EAAQd,cAAcnoB,IAICqE,4BAACnN,GAC1B,OAAOW,EAAuBX,IAAYA,EAAQyD,WAGxB0J,6BAACjF,GAQ3B,GAAI,kBAAkB7F,KAAK6F,EAAMlC,OAAO2H,SACtCzF,EAAMsD,MAAQgkB,IAActnB,EAAMsD,MAAQ+jB,KACxCrnB,EAAMsD,MAAQkkB,IAAkBxnB,EAAMsD,MAAQikB,IAC9CvnB,EAAMlC,OAAO4H,QAAQkiB,MACtBH,GAAettB,KAAK6F,EAAMsD,KAC3B,OAGF,MAAM0mB,EAAWlpB,KAAKjG,UAAUC,SAASuU,IAEzC,IAAK2a,GAAYhqB,EAAMsD,MAAQ+jB,GAC7B,OAMF,GAHArnB,EAAMyD,iBACNzD,EAAMiqB,kBAEFvvB,EAAWoG,MACb,OAGF,MAAMopB,EAAkBppB,KAAK0H,QAAQtC,IAAwBpF,KAAOkH,EAAeW,KAAK7H,KAAMoF,IAAsB,GAC9GpC,EAAWwkB,GAAS3iB,oBAAoBukB,GAE9C,GAAIlqB,EAAMsD,MAAQ+jB,GAKlB,OAAIrnB,EAAMsD,MAAQikB,IAAgBvnB,EAAMsD,MAAQkkB,IACzCwC,GACHlmB,EAASwM,YAGXxM,EAAS4lB,gBAAgB1pB,SAItBgqB,GAAYhqB,EAAMsD,MAAQgkB,IAC7BgB,GAAS6B,cAdTrmB,EAASuM,QAyBfjP,EAAaQ,GAAGrJ,SAAUovB,GAAwBzhB,GAAsBoiB,GAAS8B,uBACjFhpB,EAAaQ,GAAGrJ,SAAUovB,GAAwBC,GAAeU,GAAS8B,uBAC1EhpB,EAAaQ,GAAGrJ,SAAUmvB,GAAsBY,GAAS6B,YACzD/oB,EAAaQ,GAAGrJ,SA/ac,6BA+akB+vB,GAAS6B,YACzD/oB,EAAaQ,GAAGrJ,SAAUmvB,GAAsBxhB,IAAsB,SAAUlG,GAC9EA,EAAMyD,iBACN6kB,GAAS3iB,oBAAoB7E,MAAMsF,YAUrClK,EAAmBosB,ICrenB,MAAM+B,GAAyB,oDACzBC,GAA0B,cAEhC,MAAMC,GACJ/lB,cACE1D,KAAK2D,SAAWlM,SAASuD,KAG3B0uB,WAEE,MAAMC,EAAgBlyB,SAAS2C,gBAAgB2c,YAC/C,OAAOpZ,KAAKgO,IAAI5Q,OAAO6uB,WAAaD,GAGtCpa,OACE,MAAMmE,EAAQ1T,KAAK0pB,WACnB1pB,KAAK6pB,mBAEL7pB,KAAK8pB,sBAAsB9pB,KAAK2D,SAAU,gBAAgBomB,GAAmBA,EAAkBrW,IAE/F1T,KAAK8pB,sBAAsBP,GAAwB,gBAAgBQ,GAAmBA,EAAkBrW,IACxG1T,KAAK8pB,sBAAsBN,GAAyB,eAAeO,GAAmBA,EAAkBrW,IAG1GmW,mBACE7pB,KAAKgqB,sBAAsBhqB,KAAK2D,SAAU,YAC1C3D,KAAK2D,SAASqM,MAAMuK,SAAW,SAGjCuP,sBAAsB7yB,EAAUgzB,EAAW3uB,GACzC,MAAM4uB,EAAiBlqB,KAAK0pB,WAW5B1pB,KAAKmqB,2BAA2BlzB,GAVHD,IAC3B,GAAIA,IAAYgJ,KAAK2D,UAAY5I,OAAO6uB,WAAa5yB,EAAQ+f,YAAcmT,EACzE,OAGFlqB,KAAKgqB,sBAAsBhzB,EAASizB,GACpC,MAAMF,EAAkBhvB,OAAOrB,iBAAiB1C,GAASizB,GACzDjzB,EAAQgZ,MAAMia,GAAc,GAAE3uB,EAASoB,OAAOC,WAAWotB,WAM7D7J,QACElgB,KAAKoqB,wBAAwBpqB,KAAK2D,SAAU,YAC5C3D,KAAKoqB,wBAAwBpqB,KAAK2D,SAAU,gBAC5C3D,KAAKoqB,wBAAwBb,GAAwB,gBACrDvpB,KAAKoqB,wBAAwBZ,GAAyB,eAGxDQ,sBAAsBhzB,EAASizB,GAC7B,MAAMI,EAAcrzB,EAAQgZ,MAAMia,GAC9BI,GACFxkB,EAAYC,iBAAiB9O,EAASizB,EAAWI,GAIrDD,wBAAwBnzB,EAAUgzB,GAWhCjqB,KAAKmqB,2BAA2BlzB,GAVHD,IAC3B,MAAM8B,EAAQ+M,EAAYU,iBAAiBvP,EAASizB,QAC/B,IAAVnxB,EACT9B,EAAQgZ,MAAMsa,eAAeL,IAE7BpkB,EAAYE,oBAAoB/O,EAASizB,GACzCjzB,EAAQgZ,MAAMia,GAAanxB,MAOjCqxB,2BAA2BlzB,EAAUszB,GAC/BxyB,EAAUd,GACZszB,EAAStzB,GAETiQ,EAAeC,KAAKlQ,EAAU+I,KAAK2D,UAAUhL,QAAQ4xB,GAIzDC,gBACE,OAAOxqB,KAAK0pB,WAAa,GClF7B,MAAMnhB,GAAU,CACdkiB,UAAW,iBACXjxB,WAAW,EACX0K,YAAY,EACZwmB,YAAa,OACbC,cAAe,MAGX7hB,GAAc,CAClB2hB,UAAW,SACXjxB,UAAW,UACX0K,WAAY,UACZwmB,YAAa,mBACbC,cAAe,mBAIXpc,GAAkB,OAElBqc,GAAmB,wBAEzB,MAAMC,GACJnnB,YAAYnL,GACVyH,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAK8qB,aAAc,EACnB9qB,KAAK2D,SAAW,KAGlB6L,KAAKlU,GACE0E,KAAKmK,QAAQ3Q,WAKlBwG,KAAK+qB,UAED/qB,KAAKmK,QAAQjG,YACfvJ,EAAOqF,KAAKgrB,eAGdhrB,KAAKgrB,cAAcjxB,UAAUyS,IAAI+B,IAEjCvO,KAAKirB,mBAAkB,KACrB/uB,EAAQZ,OAbRY,EAAQZ,GAiBZiU,KAAKjU,GACE0E,KAAKmK,QAAQ3Q,WAKlBwG,KAAKgrB,cAAcjxB,UAAUwJ,OAAOgL,IAEpCvO,KAAKirB,mBAAkB,KACrBjrB,KAAK6D,UACL3H,EAAQZ,OARRY,EAAQZ,GAcZ0vB,cACE,IAAKhrB,KAAK2D,SAAU,CAClB,MAAMunB,EAAWzzB,SAAS0zB,cAAc,OACxCD,EAAST,UAAYzqB,KAAKmK,QAAQsgB,UAC9BzqB,KAAKmK,QAAQjG,YACfgnB,EAASnxB,UAAUyS,IApDH,QAuDlBxM,KAAK2D,SAAWunB,EAGlB,OAAOlrB,KAAK2D,SAGdyG,WAAW7R,GAST,OARAA,EAAS,IACJgQ,MACmB,iBAAXhQ,EAAsBA,EAAS,KAIrCmyB,YAAcvyB,EAAWI,EAAOmyB,aACvCryB,EAtES,WAsEaE,EAAQuQ,IACvBvQ,EAGTwyB,UACM/qB,KAAK8qB,cAIT9qB,KAAKmK,QAAQugB,YAAYU,OAAOprB,KAAKgrB,eAErC1qB,EAAaQ,GAAGd,KAAKgrB,cAAeJ,IAAiB,KACnD1uB,EAAQ8D,KAAKmK,QAAQwgB,kBAGvB3qB,KAAK8qB,aAAc,GAGrBjnB,UACO7D,KAAK8qB,cAIVxqB,EAAaC,IAAIP,KAAK2D,SAAUinB,IAEhC5qB,KAAK2D,SAASJ,SACdvD,KAAK8qB,aAAc,GAGrBG,kBAAkB3vB,GAChBa,EAAuBb,EAAU0E,KAAKgrB,cAAehrB,KAAKmK,QAAQjG,aClHtE,MAAMqE,GAAU,CACd8iB,YAAa,KACbC,WAAW,GAGPxiB,GAAc,CAClBuiB,YAAa,UACbC,UAAW,WAKPxnB,GAAa,gBAMbynB,GAAmB,WAEzB,MAAMC,GACJ9nB,YAAYnL,GACVyH,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAKyrB,WAAY,EACjBzrB,KAAK0rB,qBAAuB,KAG9BC,WACE,MAAMN,YAAEA,EAAFC,UAAeA,GAActrB,KAAKmK,QAEpCnK,KAAKyrB,YAILH,GACFD,EAAYrD,QAGd1nB,EAAaC,IAAI9I,SAAUqM,IAC3BxD,EAAaQ,GAAGrJ,SA1BG,wBA0BsByH,GAASc,KAAK4rB,eAAe1sB,KACtEoB,EAAaQ,GAAGrJ,SA1BO,4BA0BsByH,GAASc,KAAK6rB,eAAe3sB,KAE1Ec,KAAKyrB,WAAY,GAGnBK,aACO9rB,KAAKyrB,YAIVzrB,KAAKyrB,WAAY,EACjBnrB,EAAaC,IAAI9I,SAAUqM,KAK7B8nB,eAAe1sB,GACb,MAAMlC,OAAEA,GAAWkC,GACbmsB,YAAEA,GAAgBrrB,KAAKmK,QAE7B,GAAInN,IAAWvF,UAAYuF,IAAWquB,GAAeA,EAAYrxB,SAASgD,GACxE,OAGF,MAAM2V,EAAWzL,EAAegB,kBAAkBmjB,GAE1B,IAApB1Y,EAASva,OACXizB,EAAYrD,QACHhoB,KAAK0rB,uBAAyBH,GACvC5Y,EAASA,EAASva,OAAS,GAAG4vB,QAE9BrV,EAAS,GAAGqV,QAIhB6D,eAAe3sB,GA3DD,QA4DRA,EAAMsD,MAIVxC,KAAK0rB,qBAAuBxsB,EAAM6sB,SAAWR,GA/DzB,WAkEtBnhB,WAAW7R,GAMT,OALAA,EAAS,IACJgQ,MACmB,iBAAXhQ,EAAsBA,EAAS,IAE5CF,EA9ES,YA8EaE,EAAQuQ,IACvBvQ,GCtEX,MAAMkD,GAAO,QAIP8qB,GAAa,SAEbhe,GAAU,CACd2iB,UAAU,EACVziB,UAAU,EACVuf,OAAO,GAGHlf,GAAc,CAClBoiB,SAAU,mBACVziB,SAAU,UACVuf,MAAO,WAKHgE,GAAgB,kBAChBC,GAAc,gBAEdC,GAAgB,kBAChBC,GAAuB,yBACvBC,GAAyB,2BAEzBC,GAA2B,6BAG3BC,GAAkB,aAElB/d,GAAkB,OAClBge,GAAoB,eAa1B,MAAMC,WAAc/oB,EAClBC,YAAY1M,EAASuB,GACnBmR,MAAM1S,GAENgJ,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAKysB,QAAUvlB,EAAeK,QAfV,gBAemCvH,KAAK2D,UAC5D3D,KAAK0sB,UAAY1sB,KAAK2sB,sBACtB3sB,KAAK4sB,WAAa5sB,KAAK6sB,uBACvB7sB,KAAKsP,UAAW,EAChBtP,KAAK8sB,sBAAuB,EAC5B9sB,KAAK6O,kBAAmB,EACxB7O,KAAK+sB,WAAa,IAAItD,GAKblhB,qBACT,OAAOA,GAGE9M,kBACT,OAAOA,GAKT6J,OAAOxF,GACL,OAAOE,KAAKsP,SAAWtP,KAAKuP,OAASvP,KAAKwP,KAAK1P,GAGjD0P,KAAK1P,GACCE,KAAKsP,UAAYtP,KAAK6O,kBAIRvO,EAAamB,QAAQzB,KAAK2D,SAAUsoB,GAAY,CAChEnsB,cAAAA,IAGYiC,mBAId/B,KAAKsP,UAAW,EAEZtP,KAAKgtB,gBACPhtB,KAAK6O,kBAAmB,GAG1B7O,KAAK+sB,WAAWxd,OAEhB9X,SAASuD,KAAKjB,UAAUyS,IAAI8f,IAE5BtsB,KAAKitB,gBAELjtB,KAAKktB,kBACLltB,KAAKmtB,kBAEL7sB,EAAaQ,GAAGd,KAAKysB,QAASJ,IAAyB,KACrD/rB,EAAaS,IAAIf,KAAK2D,SA/EG,4BA+E8BzE,IACjDA,EAAMlC,SAAWgD,KAAK2D,WACxB3D,KAAK8sB,sBAAuB,SAKlC9sB,KAAKotB,eAAc,IAAMptB,KAAKqtB,aAAavtB,MAG7CyP,OACE,IAAKvP,KAAKsP,UAAYtP,KAAK6O,iBACzB,OAKF,GAFkBvO,EAAamB,QAAQzB,KAAK2D,SAtG5B,iBAwGF5B,iBACZ,OAGF/B,KAAKsP,UAAW,EAChB,MAAMpL,EAAalE,KAAKgtB,cAEpB9oB,IACFlE,KAAK6O,kBAAmB,GAG1B7O,KAAKktB,kBACLltB,KAAKmtB,kBAELntB,KAAK4sB,WAAWd,aAEhB9rB,KAAK2D,SAAS5J,UAAUwJ,OAAOgL,IAE/BjO,EAAaC,IAAIP,KAAK2D,SAAUwoB,IAChC7rB,EAAaC,IAAIP,KAAKysB,QAASJ,IAE/BrsB,KAAKiE,gBAAe,IAAMjE,KAAKstB,cAActtB,KAAK2D,SAAUO,GAG9DL,UACE,CAAC9I,OAAQiF,KAAKysB,SACX9zB,SAAQ40B,GAAejtB,EAAaC,IAAIgtB,EAlJ5B,eAoJfvtB,KAAK0sB,UAAU7oB,UACf7D,KAAK4sB,WAAWd,aAChBpiB,MAAM7F,UAGR2pB,eACExtB,KAAKitB,gBAKPN,sBACE,OAAO,IAAI9B,GAAS,CAClBrxB,UAAWqH,QAAQb,KAAKmK,QAAQ+gB,UAChChnB,WAAYlE,KAAKgtB,gBAIrBH,uBACE,OAAO,IAAIrB,GAAU,CACnBH,YAAarrB,KAAK2D,WAItByG,WAAW7R,GAOT,OANAA,EAAS,IACJgQ,MACA1C,EAAYI,kBAAkBjG,KAAK2D,aAChB,iBAAXpL,EAAsBA,EAAS,IAE5CF,EAAgBoD,GAAMlD,EAAQuQ,IACvBvQ,EAGT80B,aAAavtB,GACX,MAAMoE,EAAalE,KAAKgtB,cAClBS,EAAYvmB,EAAeK,QArJT,cAqJsCvH,KAAKysB,SAE9DzsB,KAAK2D,SAASlJ,YAAcuF,KAAK2D,SAASlJ,WAAWvC,WAAa2B,KAAKC,cAE1ErC,SAASuD,KAAKowB,OAAOprB,KAAK2D,UAG5B3D,KAAK2D,SAASqM,MAAMqX,QAAU,QAC9BrnB,KAAK2D,SAASqC,gBAAgB,eAC9BhG,KAAK2D,SAAS4B,aAAa,cAAc,GACzCvF,KAAK2D,SAAS4B,aAAa,OAAQ,UACnCvF,KAAK2D,SAASwW,UAAY,EAEtBsT,IACFA,EAAUtT,UAAY,GAGpBjW,GACFvJ,EAAOqF,KAAK2D,UAGd3D,KAAK2D,SAAS5J,UAAUyS,IAAI+B,IAa5BvO,KAAKiE,gBAXsB,KACrBjE,KAAKmK,QAAQ6d,OACfhoB,KAAK4sB,WAAWjB,WAGlB3rB,KAAK6O,kBAAmB,EACxBvO,EAAamB,QAAQzB,KAAK2D,SAjMX,iBAiMkC,CAC/C7D,cAAAA,MAIoCE,KAAKysB,QAASvoB,GAGxDgpB,kBACMltB,KAAKsP,SACPhP,EAAaQ,GAAGd,KAAK2D,SAAUyoB,IAAuBltB,IAChDc,KAAKmK,QAAQ1B,UAAYvJ,EAAMsD,MAAQ+jB,IACzCrnB,EAAMyD,iBACN3C,KAAKuP,QACKvP,KAAKmK,QAAQ1B,UAAYvJ,EAAMsD,MAAQ+jB,IACjDvmB,KAAK0tB,gCAITptB,EAAaC,IAAIP,KAAK2D,SAAUyoB,IAIpCe,kBACMntB,KAAKsP,SACPhP,EAAaQ,GAAG/F,OAAQmxB,IAAc,IAAMlsB,KAAKitB,kBAEjD3sB,EAAaC,IAAIxF,OAAQmxB,IAI7BoB,aACEttB,KAAK2D,SAASqM,MAAMqX,QAAU,OAC9BrnB,KAAK2D,SAAS4B,aAAa,eAAe,GAC1CvF,KAAK2D,SAASqC,gBAAgB,cAC9BhG,KAAK2D,SAASqC,gBAAgB,QAC9BhG,KAAK6O,kBAAmB,EACxB7O,KAAK0sB,UAAUnd,MAAK,KAClB9X,SAASuD,KAAKjB,UAAUwJ,OAAO+oB,IAC/BtsB,KAAK2tB,oBACL3tB,KAAK+sB,WAAW7M,QAChB5f,EAAamB,QAAQzB,KAAK2D,SAAUqoB,OAIxCoB,cAAc9xB,GACZgF,EAAaQ,GAAGd,KAAK2D,SAAUwoB,IAAqBjtB,IAC9Cc,KAAK8sB,qBACP9sB,KAAK8sB,sBAAuB,EAI1B5tB,EAAMlC,SAAWkC,EAAM0uB,iBAIG,IAA1B5tB,KAAKmK,QAAQ+gB,SACflrB,KAAKuP,OAC8B,WAA1BvP,KAAKmK,QAAQ+gB,UACtBlrB,KAAK0tB,iCAIT1tB,KAAK0sB,UAAUld,KAAKlU,GAGtB0xB,cACE,OAAOhtB,KAAK2D,SAAS5J,UAAUC,SA3PX,QA8PtB0zB,6BAEE,GADkBptB,EAAamB,QAAQzB,KAAK2D,SA3QlB,0BA4QZ5B,iBACZ,OAGF,MAAMhI,UAAEA,EAAF2hB,aAAaA,EAAb1L,MAA2BA,GAAUhQ,KAAK2D,SAC1CkqB,EAAqBnS,EAAejkB,SAAS2C,gBAAgB0c,cAG7D+W,GAA0C,WAApB7d,EAAMyK,WAA2B1gB,EAAUC,SAASuyB,MAI3EsB,IACH7d,EAAMyK,UAAY,UAGpB1gB,EAAUyS,IAAI+f,IACdvsB,KAAKiE,gBAAe,KAClBlK,EAAUwJ,OAAOgpB,IACZsB,GACH7tB,KAAKiE,gBAAe,KAClB+L,EAAMyK,UAAY,KACjBza,KAAKysB,WAETzsB,KAAKysB,SAERzsB,KAAK2D,SAASqkB,SAOhBiF,gBACE,MAAMY,EAAqB7tB,KAAK2D,SAAS+X,aAAejkB,SAAS2C,gBAAgB0c,aAC3EoT,EAAiBlqB,KAAK+sB,WAAWrD,WACjCoE,EAAoB5D,EAAiB,IAErC4D,GAAqBD,IAAuB3yB,KAAa4yB,IAAsBD,GAAsB3yB,OACzG8E,KAAK2D,SAASqM,MAAM+d,YAAe,GAAE7D,QAGlC4D,IAAsBD,IAAuB3yB,MAAc4yB,GAAqBD,GAAsB3yB,OACzG8E,KAAK2D,SAASqM,MAAMge,aAAgB,GAAE9D,OAI1CyD,oBACE3tB,KAAK2D,SAASqM,MAAM+d,YAAc,GAClC/tB,KAAK2D,SAASqM,MAAMge,aAAe,GAKf7pB,uBAAC5L,EAAQuH,GAC7B,OAAOE,KAAKiF,MAAK,WACf,MAAMC,EAAOsnB,GAAM3nB,oBAAoB7E,KAAMzH,GAE7C,GAAsB,iBAAXA,EAAX,CAIA,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,GAAQuH,QAWnBQ,EAAaQ,GAAGrJ,SAhVc,0BAUD,4BAsUyC,SAAUyH,GAC9E,MAAMlC,EAASrF,EAAuBqI,MAElC,CAAC,IAAK,QAAQ5I,SAAS4I,KAAK2E,UAC9BzF,EAAMyD,iBAGRrC,EAAaS,IAAI/D,EAAQivB,IAAYgC,IAC/BA,EAAUlsB,kBAKdzB,EAAaS,IAAI/D,EAAQgvB,IAAc,KACjCxyB,EAAUwG,OACZA,KAAKgoB,cAMX,MAAMkG,EAAehnB,EAAeK,QA9VhB,eA+VhB2mB,GACF1B,GAAMpoB,YAAY8pB,GAAc3e,OAGrBid,GAAM3nB,oBAAoB7H,GAElCsI,OAAOtF,SAGduE,EAAqBioB,IASrBpxB,EAAmBoxB,ICrZnB,MAAM/wB,GAAO,YAOP8M,GAAU,CACd2iB,UAAU,EACVziB,UAAU,EACV8Q,QAAQ,GAGJzQ,GAAc,CAClBoiB,SAAU,UACVziB,SAAU,UACV8Q,OAAQ,WAGJhL,GAAkB,OAElB4f,GAAgB,kBAKhBnC,GAAgB,sBAYtB,MAAMoC,WAAkB3qB,EACtBC,YAAY1M,EAASuB,GACnBmR,MAAM1S,GAENgJ,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAKsP,UAAW,EAChBtP,KAAK0sB,UAAY1sB,KAAK2sB,sBACtB3sB,KAAK4sB,WAAa5sB,KAAK6sB,uBACvB7sB,KAAK2K,qBAKIlP,kBACT,OAAOA,GAGE8M,qBACT,OAAOA,GAKTjD,OAAOxF,GACL,OAAOE,KAAKsP,SAAWtP,KAAKuP,OAASvP,KAAKwP,KAAK1P,GAGjD0P,KAAK1P,GACCE,KAAKsP,UAIShP,EAAamB,QAAQzB,KAAK2D,SA/C5B,oBA+CkD,CAAE7D,cAAAA,IAEtDiC,mBAId/B,KAAKsP,UAAW,EAChBtP,KAAK2D,SAASqM,MAAMqe,WAAa,UAEjCruB,KAAK0sB,UAAUld,OAEVxP,KAAKmK,QAAQoP,SAChB,IAAIkQ,IAAkBla,OAGxBvP,KAAK2D,SAASqC,gBAAgB,eAC9BhG,KAAK2D,SAAS4B,aAAa,cAAc,GACzCvF,KAAK2D,SAAS4B,aAAa,OAAQ,UACnCvF,KAAK2D,SAAS5J,UAAUyS,IAAI+B,IAU5BvO,KAAKiE,gBARoB,KAClBjE,KAAKmK,QAAQoP,QAChBvZ,KAAK4sB,WAAWjB,WAGlBrrB,EAAamB,QAAQzB,KAAK2D,SAvEX,qBAuEkC,CAAE7D,cAAAA,MAGfE,KAAK2D,UAAU,IAGvD4L,OACOvP,KAAKsP,WAIQhP,EAAamB,QAAQzB,KAAK2D,SAjF5B,qBAmFF5B,mBAId/B,KAAK4sB,WAAWd,aAChB9rB,KAAK2D,SAAS2qB,OACdtuB,KAAKsP,UAAW,EAChBtP,KAAK2D,SAAS5J,UAAUwJ,OAAOgL,IAC/BvO,KAAK0sB,UAAUnd,OAefvP,KAAKiE,gBAboB,KACvBjE,KAAK2D,SAAS4B,aAAa,eAAe,GAC1CvF,KAAK2D,SAASqC,gBAAgB,cAC9BhG,KAAK2D,SAASqC,gBAAgB,QAC9BhG,KAAK2D,SAASqM,MAAMqe,WAAa,SAE5BruB,KAAKmK,QAAQoP,SAChB,IAAIkQ,IAAkBvJ,QAGxB5f,EAAamB,QAAQzB,KAAK2D,SAAUqoB,MAGAhsB,KAAK2D,UAAU,KAGvDE,UACE7D,KAAK0sB,UAAU7oB,UACf7D,KAAK4sB,WAAWd,aAChBpiB,MAAM7F,UAKRuG,WAAW7R,GAOT,OANAA,EAAS,IACJgQ,MACA1C,EAAYI,kBAAkBjG,KAAK2D,aAChB,iBAAXpL,EAAsBA,EAAS,IAE5CF,EAAgBoD,GAAMlD,EAAQuQ,IACvBvQ,EAGTo0B,sBACE,OAAO,IAAI9B,GAAS,CAClBJ,UAtIsB,qBAuItBjxB,UAAWwG,KAAKmK,QAAQ+gB,SACxBhnB,YAAY,EACZwmB,YAAa1qB,KAAK2D,SAASlJ,WAC3BkwB,cAAe,IAAM3qB,KAAKuP,SAI9Bsd,uBACE,OAAO,IAAIrB,GAAU,CACnBH,YAAarrB,KAAK2D,WAItBgH,qBACErK,EAAaQ,GAAGd,KAAK2D,SA7IM,gCA6I2BzE,IAChDc,KAAKmK,QAAQ1B,UArKJ,WAqKgBvJ,EAAMsD,KACjCxC,KAAKuP,UAOWpL,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOkpB,GAAUvpB,oBAAoB7E,KAAMzH,GAEjD,GAAsB,iBAAXA,EAAX,CAIA,QAAqB4M,IAAjBD,EAAK3M,IAAyBA,EAAOlB,WAAW,MAAmB,gBAAXkB,EAC1D,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,GAAQyH,WAWnBM,EAAaQ,GAAGrJ,SA9Kc,8BAGD,gCA2KyC,SAAUyH,GAC9E,MAAMlC,EAASrF,EAAuBqI,MAMtC,GAJI,CAAC,IAAK,QAAQ5I,SAAS4I,KAAK2E,UAC9BzF,EAAMyD,iBAGJ/I,EAAWoG,MACb,OAGFM,EAAaS,IAAI/D,EAAQgvB,IAAc,KAEjCxyB,EAAUwG,OACZA,KAAKgoB,WAKT,MAAMkG,EAAehnB,EAAeK,QAAQ4mB,IACxCD,GAAgBA,IAAiBlxB,GACnCoxB,GAAUhqB,YAAY8pB,GAAc3e,OAGzB6e,GAAUvpB,oBAAoB7H,GACtCsI,OAAOtF,SAGdM,EAAaQ,GAAG/F,OAjOa,8BAiOgB,IAC3CmM,EAAeC,KAAKgnB,IAAex1B,SAAQ2P,GAAM8lB,GAAUvpB,oBAAoByD,GAAIkH,WAGrFjL,EAAqB6pB,IAOrBhzB,EAAmBgzB,ICtQnB,MAAMG,GAAgB,IAAI/vB,IAAI,CAC5B,aACA,OACA,OACA,WACA,WACA,SACA,MACA,eAUIgwB,GAAmB,iEAOnBC,GAAmB,qIAEnBC,GAAmB,CAACpb,EAAWqb,KACnC,MAAMC,EAAgBtb,EAAUxB,SAAS3Y,cAEzC,GAAIw1B,EAAqBv3B,SAASw3B,GAChC,OAAIL,GAAc7uB,IAAIkvB,IACb/tB,QAAQ2tB,GAAiBn1B,KAAKia,EAAUub,YAAcJ,GAAiBp1B,KAAKia,EAAUub,YAMjG,MAAMC,EAASH,EAAqBvoB,QAAO2oB,GAAkBA,aAA0B31B,SAGvF,IAAK,IAAI4F,EAAI,EAAGC,EAAM6vB,EAAO12B,OAAQ4G,EAAIC,EAAKD,IAC5C,GAAI8vB,EAAO9vB,GAAG3F,KAAKu1B,GACjB,OAAO,EAIX,OAAO,GAqCF,SAASI,GAAaC,EAAYC,EAAWC,GAClD,IAAKF,EAAW72B,OACd,OAAO62B,EAGT,GAAIE,GAAoC,mBAAfA,EACvB,OAAOA,EAAWF,GAGpB,MACMG,GADY,IAAIr0B,OAAOs0B,WACKC,gBAAgBL,EAAY,aACxDtc,EAAW,GAAGvL,UAAUgoB,EAAgBp0B,KAAKqF,iBAAiB,MAEpE,IAAK,IAAIrB,EAAI,EAAGC,EAAM0T,EAASva,OAAQ4G,EAAIC,EAAKD,IAAK,CACnD,MAAMhI,EAAU2b,EAAS3T,GACnBuwB,EAAcv4B,EAAQ8a,SAAS3Y,cAErC,IAAKV,OAAOC,KAAKw2B,GAAW93B,SAASm4B,GAAc,CACjDv4B,EAAQuM,SAER,SAGF,MAAMisB,EAAgB,GAAGpoB,UAAUpQ,EAAQkP,YACrCupB,EAAoB,GAAGroB,OAAO8nB,EAAU,MAAQ,GAAIA,EAAUK,IAAgB,IAEpFC,EAAc72B,SAAQ2a,IACfob,GAAiBpb,EAAWmc,IAC/Bz4B,EAAQgP,gBAAgBsN,EAAUxB,aAKxC,OAAOsd,EAAgBp0B,KAAK00B,UC5F9B,MAAMj0B,GAAO,UAIPk0B,GAAwB,IAAInxB,IAAI,CAAC,WAAY,YAAa,eAE1DsK,GAAc,CAClB8mB,UAAW,UACXC,SAAU,SACVC,MAAO,4BACPruB,QAAS,SACTsuB,MAAO,kBACP5U,KAAM,UACNlkB,SAAU,mBACVga,UAAW,oBACXzK,OAAQ,0BACRmJ,UAAW,2BACXmP,mBAAoB,QACpB1C,SAAU,mBACV4T,YAAa,oBACbC,SAAU,UACVd,WAAY,kBACZD,UAAW,SACX5H,aAAc,0BAGV4I,GAAgB,CACpBC,KAAM,OACNC,IAAK,MACLC,MAAOn1B,IAAU,OAAS,QAC1Bo1B,OAAQ,SACRC,KAAMr1B,IAAU,QAAU,QAGtBqN,GAAU,CACdqnB,WAAW,EACXC,SAAU,+GAIVpuB,QAAS,cACTquB,MAAO,GACPC,MAAO,EACP5U,MAAM,EACNlkB,UAAU,EACVga,UAAW,MACXzK,OAAQ,CAAC,EAAG,GACZmJ,WAAW,EACXmP,mBAAoB,CAAC,MAAO,QAAS,SAAU,QAC/C1C,SAAU,kBACV4T,YAAa,GACbC,UAAU,EACVd,WAAY,KACZD,UD5B8B,CAE9B,IAAK,CAAC,QAAS,MAAO,KAAM,OAAQ,OAzCP,kBA0C7B9Q,EAAG,CAAC,SAAU,OAAQ,QAAS,OAC/BoS,KAAM,GACNnS,EAAG,GACHoS,GAAI,GACJC,IAAK,GACLC,KAAM,GACNC,IAAK,GACLC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJpyB,EAAG,GACHqyB,IAAK,CAAC,MAAO,SAAU,MAAO,QAAS,QAAS,UAChDC,GAAI,GACJC,GAAI,GACJC,EAAG,GACHC,IAAK,GACLC,EAAG,GACHC,MAAO,GACPC,KAAM,GACNC,IAAK,GACLC,IAAK,GACLC,OAAQ,GACRC,EAAG,GACHC,GAAI,ICFJ3K,aAAc,MAGVxvB,GAAQ,CACZo6B,KAAO,kBACPC,OAAS,oBACTC,KAAO,kBACPC,MAAQ,mBACRC,SAAW,sBACXC,MAAQ,mBACRC,QAAU,qBACVC,SAAW,sBACXC,WAAa,wBACbC,WAAa,yBAGTC,GAAkB,OAElBrkB,GAAkB,OAElBskB,GAAmB,OACnBC,GAAkB,MAElBC,GAAyB,iBACzBC,GAAkB,SAElBC,GAAmB,gBAEnBC,GAAgB,QAChBC,GAAgB,QAUtB,MAAMC,WAAgB3vB,EACpBC,YAAY1M,EAASuB,GACnB,QAAsB,IAAX2vB,GACT,MAAM,IAAI5uB,UAAU,+DAGtBoQ,MAAM1S,GAGNgJ,KAAKqzB,YAAa,EAClBrzB,KAAKszB,SAAW,EAChBtzB,KAAKuzB,YAAc,GACnBvzB,KAAKwzB,eAAiB,GACtBxzB,KAAKynB,QAAU,KAGfznB,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAKyzB,IAAM,KAEXzzB,KAAK0zB,gBAKInrB,qBACT,OAAOA,GAGE9M,kBACT,OAAOA,GAGE3D,mBACT,OAAOA,GAGEgR,yBACT,OAAOA,GAKT6qB,SACE3zB,KAAKqzB,YAAa,EAGpBO,UACE5zB,KAAKqzB,YAAa,EAGpBQ,gBACE7zB,KAAKqzB,YAAcrzB,KAAKqzB,WAG1B/tB,OAAOpG,GACL,GAAKc,KAAKqzB,WAIV,GAAIn0B,EAAO,CACT,MAAM6pB,EAAU/oB,KAAK8zB,6BAA6B50B,GAElD6pB,EAAQyK,eAAeO,OAAShL,EAAQyK,eAAeO,MAEnDhL,EAAQiL,uBACVjL,EAAQkL,OAAO,KAAMlL,GAErBA,EAAQmL,OAAO,KAAMnL,OAElB,CACL,GAAI/oB,KAAKm0B,gBAAgBp6B,UAAUC,SAASuU,IAE1C,YADAvO,KAAKk0B,OAAO,KAAMl0B,MAIpBA,KAAKi0B,OAAO,KAAMj0B,OAItB6D,UACEyI,aAAatM,KAAKszB,UAElBhzB,EAAaC,IAAIP,KAAK2D,SAASiB,QAAQouB,IAAiBC,GAAkBjzB,KAAKo0B,mBAE3Ep0B,KAAKyzB,KACPzzB,KAAKyzB,IAAIlwB,SAGXvD,KAAKq0B,iBACL3qB,MAAM7F,UAGR2L,OACE,GAAoC,SAAhCxP,KAAK2D,SAASqM,MAAMqX,QACtB,MAAM,IAAI/iB,MAAM,uCAGlB,IAAMtE,KAAKs0B,kBAAmBt0B,KAAKqzB,WACjC,OAGF,MAAMpF,EAAY3tB,EAAamB,QAAQzB,KAAK2D,SAAU3D,KAAK0D,YAAY5L,MAAMs6B,MACvEmC,EAAap6B,EAAe6F,KAAK2D,UACjC6wB,EAA4B,OAAfD,EACjBv0B,KAAK2D,SAASsO,cAAc7X,gBAAgBJ,SAASgG,KAAK2D,UAC1D4wB,EAAWv6B,SAASgG,KAAK2D,UAE3B,GAAIsqB,EAAUlsB,mBAAqByyB,EACjC,OAK4B,YAA1Bx0B,KAAK0D,YAAYjI,MAAsBuE,KAAKyzB,KAAOzzB,KAAKy0B,aAAez0B,KAAKyzB,IAAI/7B,cAAcq7B,IAAwBrD,YACxH1vB,KAAKq0B,iBACLr0B,KAAKyzB,IAAIlwB,SACTvD,KAAKyzB,IAAM,MAGb,MAAMA,EAAMzzB,KAAKm0B,gBACXO,EvE3NKC,CAAAA,IACb,GACEA,GAAUh3B,KAAKi3B,MArBH,IAqBSj3B,KAAKk3B,gBACnBp9B,SAASq9B,eAAeH,IAEjC,OAAOA,GuEsNSI,CAAO/0B,KAAK0D,YAAYjI,MAEtCg4B,EAAIluB,aAAa,KAAMmvB,GACvB10B,KAAK2D,SAAS4B,aAAa,mBAAoBmvB,GAE3C10B,KAAKmK,QAAQylB,WACf6D,EAAI15B,UAAUyS,IAAIomB,IAGpB,MAAM3hB,EAA8C,mBAA3BjR,KAAKmK,QAAQ8G,UACpCjR,KAAKmK,QAAQ8G,UAAUhY,KAAK+G,KAAMyzB,EAAKzzB,KAAK2D,UAC5C3D,KAAKmK,QAAQ8G,UAET+jB,EAAah1B,KAAKi1B,eAAehkB,GACvCjR,KAAKk1B,oBAAoBF,GAEzB,MAAMrlB,UAAEA,GAAc3P,KAAKmK,QAC3BrH,EAAKC,IAAI0wB,EAAKzzB,KAAK0D,YAAYE,SAAU5D,MAEpCA,KAAK2D,SAASsO,cAAc7X,gBAAgBJ,SAASgG,KAAKyzB,OAC7D9jB,EAAUyb,OAAOqI,GACjBnzB,EAAamB,QAAQzB,KAAK2D,SAAU3D,KAAK0D,YAAY5L,MAAMw6B,WAGzDtyB,KAAKynB,QACPznB,KAAKynB,QAAQ7N,SAEb5Z,KAAKynB,QAAUS,GAAoBloB,KAAK2D,SAAU8vB,EAAKzzB,KAAKooB,iBAAiB4M,IAG/EvB,EAAI15B,UAAUyS,IAAI+B,IAElB,MAAMyhB,EAAchwB,KAAKm1B,yBAAyBn1B,KAAKmK,QAAQ6lB,aAC3DA,GACFyD,EAAI15B,UAAUyS,OAAOwjB,EAAY14B,MAAM,MAOrC,iBAAkBG,SAAS2C,iBAC7B,GAAGgN,UAAU3P,SAASuD,KAAKwM,UAAU7O,SAAQ3B,IAC3CsJ,EAAaQ,GAAG9J,EAAS,YAAa0D,MAI1C,MAWMwJ,EAAalE,KAAKyzB,IAAI15B,UAAUC,SAAS44B,IAC/C5yB,KAAKiE,gBAZY,KACf,MAAMmxB,EAAiBp1B,KAAKuzB,YAE5BvzB,KAAKuzB,YAAc,KACnBjzB,EAAamB,QAAQzB,KAAK2D,SAAU3D,KAAK0D,YAAY5L,MAAMu6B,OAEvD+C,IAAmBtC,IACrB9yB,KAAKk0B,OAAO,KAAMl0B,QAKQA,KAAKyzB,IAAKvvB,GAG1CqL,OACE,IAAKvP,KAAKynB,QACR,OAGF,MAAMgM,EAAMzzB,KAAKm0B,gBAkBjB,GADkB7zB,EAAamB,QAAQzB,KAAK2D,SAAU3D,KAAK0D,YAAY5L,MAAMo6B,MAC/DnwB,iBACZ,OAGF0xB,EAAI15B,UAAUwJ,OAAOgL,IAIjB,iBAAkB9W,SAAS2C,iBAC7B,GAAGgN,UAAU3P,SAASuD,KAAKwM,UACxB7O,SAAQ3B,GAAWsJ,EAAaC,IAAIvJ,EAAS,YAAa0D,KAG/DsF,KAAKwzB,eAAL,OAAqC,EACrCxzB,KAAKwzB,eAAL,OAAqC,EACrCxzB,KAAKwzB,eAAL,OAAqC,EAErC,MAAMtvB,EAAalE,KAAKyzB,IAAI15B,UAAUC,SAAS44B,IAC/C5yB,KAAKiE,gBAnCY,KACXjE,KAAKg0B,yBAILh0B,KAAKuzB,cAAgBV,IACvBY,EAAIlwB,SAGNvD,KAAKq1B,iBACLr1B,KAAK2D,SAASqC,gBAAgB,oBAC9B1F,EAAamB,QAAQzB,KAAK2D,SAAU3D,KAAK0D,YAAY5L,MAAMq6B,QAE3DnyB,KAAKq0B,oBAsBuBr0B,KAAKyzB,IAAKvvB,GACxClE,KAAKuzB,YAAc,GAGrB3Z,SACuB,OAAjB5Z,KAAKynB,SACPznB,KAAKynB,QAAQ7N,SAMjB0a,gBACE,OAAOzzB,QAAQb,KAAKy0B,YAGtBN,gBACE,GAAIn0B,KAAKyzB,IACP,OAAOzzB,KAAKyzB,IAGd,MAAMz8B,EAAUS,SAAS0zB,cAAc,OACvCn0B,EAAQ04B,UAAY1vB,KAAKmK,QAAQ0lB,SAEjC,MAAM4D,EAAMz8B,EAAQwQ,SAAS,GAK7B,OAJAxH,KAAKs1B,WAAW7B,GAChBA,EAAI15B,UAAUwJ,OAAOqvB,GAAiBrkB,IAEtCvO,KAAKyzB,IAAMA,EACJzzB,KAAKyzB,IAGd6B,WAAW7B,GACTzzB,KAAKu1B,uBAAuB9B,EAAKzzB,KAAKy0B,WAAY1B,IAGpDwC,uBAAuB1F,EAAU2F,EAASv+B,GACxC,MAAMw+B,EAAkBvuB,EAAeK,QAAQtQ,EAAU44B,GAEpD2F,IAAWC,EAMhBz1B,KAAK01B,kBAAkBD,EAAiBD,GALtCC,EAAgBlyB,SAQpBmyB,kBAAkB1+B,EAASw+B,GACzB,GAAgB,OAAZx+B,EAIJ,OAAIe,EAAUy9B,IACZA,EAAUr9B,EAAWq9B,QAGjBx1B,KAAKmK,QAAQgR,KACXqa,EAAQ/6B,aAAezD,IACzBA,EAAQ04B,UAAY,GACpB14B,EAAQo0B,OAAOoK,IAGjBx+B,EAAQ2+B,YAAcH,EAAQG,mBAM9B31B,KAAKmK,QAAQgR,MACXnb,KAAKmK,QAAQ8lB,WACfuF,EAAUxG,GAAawG,EAASx1B,KAAKmK,QAAQ+kB,UAAWlvB,KAAKmK,QAAQglB,aAGvEn4B,EAAQ04B,UAAY8F,GAEpBx+B,EAAQ2+B,YAAcH,GAI1Bf,WACE,MAAM3E,EAAQ9vB,KAAK2D,SAASzM,aAAa,2BAA6B8I,KAAKmK,QAAQ2lB,MAEnF,OAAO9vB,KAAKm1B,yBAAyBrF,GAGvC8F,iBAAiBZ,GACf,MAAmB,UAAfA,EACK,MAGU,SAAfA,EACK,QAGFA,EAKTlB,6BAA6B50B,EAAO6pB,GAClC,OAAOA,GAAW/oB,KAAK0D,YAAYmB,oBAAoB3F,EAAMa,eAAgBC,KAAK61B,sBAGpFpN,aACE,MAAMjiB,OAAEA,GAAWxG,KAAKmK,QAExB,MAAsB,iBAAX3D,EACFA,EAAOlP,MAAM,KAAK8Q,KAAI3C,GAAO/I,OAAOwQ,SAASzH,EAAK,MAGrC,mBAAXe,EACFkiB,GAAcliB,EAAOkiB,EAAY1oB,KAAK2D,UAGxC6C,EAGT2uB,yBAAyBK,GACvB,MAA0B,mBAAZA,EAAyBA,EAAQv8B,KAAK+G,KAAK2D,UAAY6xB,EAGvEpN,iBAAiB4M,GACf,MAAMrM,EAAwB,CAC5B1X,UAAW+jB,EACXtR,UAAW,CACT,CACEloB,KAAM,OACNyX,QAAS,CACP6L,mBAAoB9e,KAAKmK,QAAQ2U,qBAGrC,CACEtjB,KAAM,SACNyX,QAAS,CACPzM,OAAQxG,KAAKyoB,eAGjB,CACEjtB,KAAM,kBACNyX,QAAS,CACPmJ,SAAUpc,KAAKmK,QAAQiS,WAG3B,CACE5gB,KAAM,QACNyX,QAAS,CACPjc,QAAU,IAAGgJ,KAAK0D,YAAYjI,eAGlC,CACED,KAAM,WACN+W,SAAS,EACTC,MAAO,aACP7W,GAAIuJ,GAAQlF,KAAK81B,6BAA6B5wB,KAGlDghB,cAAehhB,IACTA,EAAK+N,QAAQhC,YAAc/L,EAAK+L,WAClCjR,KAAK81B,6BAA6B5wB,KAKxC,MAAO,IACFyjB,KACsC,mBAA9B3oB,KAAKmK,QAAQmd,aAA8BtnB,KAAKmK,QAAQmd,aAAaqB,GAAyB3oB,KAAKmK,QAAQmd,cAI1H4N,oBAAoBF,GAClBh1B,KAAKm0B,gBAAgBp6B,UAAUyS,IAAK,GAAExM,KAAK+1B,0BAA0B/1B,KAAK41B,iBAAiBZ,MAG7FC,eAAehkB,GACb,OAAOif,GAAcjf,EAAU1X,eAGjCm6B,gBACmB1zB,KAAKmK,QAAQ1I,QAAQnK,MAAM,KAEnCqB,SAAQ8I,IACf,GAAgB,UAAZA,EACFnB,EAAaQ,GAAGd,KAAK2D,SAAU3D,KAAK0D,YAAY5L,MAAMy6B,MAAOvyB,KAAKmK,QAAQlT,UAAUiI,GAASc,KAAKsF,OAAOpG,UACpG,GA/ZU,WA+ZNuC,EAA4B,CACrC,MAAMu0B,EAAUv0B,IAAYyxB,GAC1BlzB,KAAK0D,YAAY5L,MAAM46B,WACvB1yB,KAAK0D,YAAY5L,MAAM06B,QACnByD,EAAWx0B,IAAYyxB,GAC3BlzB,KAAK0D,YAAY5L,MAAM66B,WACvB3yB,KAAK0D,YAAY5L,MAAM26B,SAEzBnyB,EAAaQ,GAAGd,KAAK2D,SAAUqyB,EAASh2B,KAAKmK,QAAQlT,UAAUiI,GAASc,KAAKi0B,OAAO/0B,KACpFoB,EAAaQ,GAAGd,KAAK2D,SAAUsyB,EAAUj2B,KAAKmK,QAAQlT,UAAUiI,GAASc,KAAKk0B,OAAOh1B,SAIzFc,KAAKo0B,kBAAoB,KACnBp0B,KAAK2D,UACP3D,KAAKuP,QAITjP,EAAaQ,GAAGd,KAAK2D,SAASiB,QAAQouB,IAAiBC,GAAkBjzB,KAAKo0B,mBAE1Ep0B,KAAKmK,QAAQlT,SACf+I,KAAKmK,QAAU,IACVnK,KAAKmK,QACR1I,QAAS,SACTxK,SAAU,IAGZ+I,KAAKk2B,YAITA,YACE,MAAMpG,EAAQ9vB,KAAK2D,SAASzM,aAAa,SACnCi/B,SAA2Bn2B,KAAK2D,SAASzM,aAAa,2BAExD44B,GAA+B,WAAtBqG,KACXn2B,KAAK2D,SAAS4B,aAAa,yBAA0BuqB,GAAS,KAC1DA,GAAU9vB,KAAK2D,SAASzM,aAAa,eAAkB8I,KAAK2D,SAASgyB,aACvE31B,KAAK2D,SAAS4B,aAAa,aAAcuqB,GAG3C9vB,KAAK2D,SAAS4B,aAAa,QAAS,KAIxC0uB,OAAO/0B,EAAO6pB,GACZA,EAAU/oB,KAAK8zB,6BAA6B50B,EAAO6pB,GAE/C7pB,IACF6pB,EAAQyK,eACS,YAAft0B,EAAMsB,KAAqB2yB,GAAgBD,KACzC,GAGFnK,EAAQoL,gBAAgBp6B,UAAUC,SAASuU,KAAoBwa,EAAQwK,cAAgBV,GACzF9J,EAAQwK,YAAcV,IAIxBvmB,aAAayc,EAAQuK,UAErBvK,EAAQwK,YAAcV,GAEjB9J,EAAQ5e,QAAQ4lB,OAAUhH,EAAQ5e,QAAQ4lB,MAAMvgB,KAKrDuZ,EAAQuK,SAAWp2B,YAAW,KACxB6rB,EAAQwK,cAAgBV,IAC1B9J,EAAQvZ,SAETuZ,EAAQ5e,QAAQ4lB,MAAMvgB,MARvBuZ,EAAQvZ,QAWZ0kB,OAAOh1B,EAAO6pB,GACZA,EAAU/oB,KAAK8zB,6BAA6B50B,EAAO6pB,GAE/C7pB,IACF6pB,EAAQyK,eACS,aAAft0B,EAAMsB,KAAsB2yB,GAAgBD,IAC1CnK,EAAQplB,SAAS3J,SAASkF,EAAMY,gBAGlCipB,EAAQiL,yBAIZ1nB,aAAayc,EAAQuK,UAErBvK,EAAQwK,YAAcT,GAEjB/J,EAAQ5e,QAAQ4lB,OAAUhH,EAAQ5e,QAAQ4lB,MAAMxgB,KAKrDwZ,EAAQuK,SAAWp2B,YAAW,KACxB6rB,EAAQwK,cAAgBT,IAC1B/J,EAAQxZ,SAETwZ,EAAQ5e,QAAQ4lB,MAAMxgB,MARvBwZ,EAAQxZ,QAWZykB,uBACE,IAAK,MAAMvyB,KAAWzB,KAAKwzB,eACzB,GAAIxzB,KAAKwzB,eAAe/xB,GACtB,OAAO,EAIX,OAAO,EAGT2I,WAAW7R,GACT,MAAM69B,EAAiBvwB,EAAYI,kBAAkBjG,KAAK2D,UAqC1D,OAnCAlL,OAAOC,KAAK09B,GAAgBz9B,SAAQ09B,IAC9B1G,GAAsBjwB,IAAI22B,WACrBD,EAAeC,OAI1B99B,EAAS,IACJyH,KAAK0D,YAAY6E,WACjB6tB,KACmB,iBAAX79B,GAAuBA,EAASA,EAAS,KAG/CoX,WAAiC,IAArBpX,EAAOoX,UAAsBlY,SAASuD,KAAO7C,EAAWI,EAAOoX,WAEtD,iBAAjBpX,EAAOw3B,QAChBx3B,EAAOw3B,MAAQ,CACbvgB,KAAMjX,EAAOw3B,MACbxgB,KAAMhX,EAAOw3B,QAIW,iBAAjBx3B,EAAOu3B,QAChBv3B,EAAOu3B,MAAQv3B,EAAOu3B,MAAM92B,YAGA,iBAAnBT,EAAOi9B,UAChBj9B,EAAOi9B,QAAUj9B,EAAOi9B,QAAQx8B,YAGlCX,EAAgBoD,GAAMlD,EAAQyH,KAAK0D,YAAYoF,aAE3CvQ,EAAO03B,WACT13B,EAAOs3B,SAAWb,GAAaz2B,EAAOs3B,SAAUt3B,EAAO22B,UAAW32B,EAAO42B,aAGpE52B,EAGTs9B,qBACE,MAAMt9B,EAAS,GAEf,IAAK,MAAMiK,KAAOxC,KAAKmK,QACjBnK,KAAK0D,YAAY6E,QAAQ/F,KAASxC,KAAKmK,QAAQ3H,KACjDjK,EAAOiK,GAAOxC,KAAKmK,QAAQ3H,IAO/B,OAAOjK,EAGT88B,iBACE,MAAM5B,EAAMzzB,KAAKm0B,gBACXmC,EAAwB,IAAIl9B,OAAQ,UAAS4G,KAAK+1B,6BAA8B,KAChFQ,EAAW9C,EAAIv8B,aAAa,SAASgC,MAAMo9B,GAChC,OAAbC,GAAqBA,EAASn+B,OAAS,GACzCm+B,EAASnuB,KAAIouB,GAASA,EAAMj/B,SACzBoB,SAAQ89B,GAAUhD,EAAI15B,UAAUwJ,OAAOkzB,KAI9CV,uBACE,MAvqBiB,aA0qBnBD,6BAA6BpN,GAC3B,MAAMhW,MAAEA,GAAUgW,EAEbhW,IAIL1S,KAAKyzB,IAAM/gB,EAAMC,SAAS/B,OAC1B5Q,KAAKq1B,iBACLr1B,KAAKk1B,oBAAoBl1B,KAAKi1B,eAAeviB,EAAMzB,aAGrDojB,iBACMr0B,KAAKynB,UACPznB,KAAKynB,QAAQxB,UACbjmB,KAAKynB,QAAU,MAMGtjB,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOkuB,GAAQvuB,oBAAoB7E,KAAMzH,GAE/C,GAAsB,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,UAab6C,EAAmBg4B,ICxuBnB,MAKM7qB,GAAU,IACX6qB,GAAQ7qB,QACX0I,UAAW,QACXzK,OAAQ,CAAC,EAAG,GACZ/E,QAAS,QACT+zB,QAAS,GACT3F,SAAU,+IAON/mB,GAAc,IACfsqB,GAAQtqB,YACX0sB,QAAS,6BAGL19B,GAAQ,CACZo6B,KAAO,kBACPC,OAAS,oBACTC,KAAO,kBACPC,MAAQ,mBACRC,SAAW,sBACXC,MAAQ,mBACRC,QAAU,qBACVC,SAAW,sBACXC,WAAa,wBACbC,WAAa,yBAYf,MAAM+D,WAAgBtD,GAGT7qB,qBACT,OAAOA,GAGE9M,kBACT,MArDS,UAwDA3D,mBACT,OAAOA,GAGEgR,yBACT,OAAOA,GAKTwrB,gBACE,OAAOt0B,KAAKy0B,YAAcz0B,KAAK22B,cAGjCrB,WAAW7B,GACTzzB,KAAKu1B,uBAAuB9B,EAAKzzB,KAAKy0B,WAnCnB,mBAoCnBz0B,KAAKu1B,uBAAuB9B,EAAKzzB,KAAK22B,cAnCjB,iBAwCvBA,cACE,OAAO32B,KAAKm1B,yBAAyBn1B,KAAKmK,QAAQqrB,SAGpDO,uBACE,MA/EiB,aAoFG5xB,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOwxB,GAAQ7xB,oBAAoB7E,KAAMzH,GAE/C,GAAsB,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,UAab6C,EAAmBs7B,ICrGnB,MAAMj7B,GAAO,YAKP8M,GAAU,CACd/B,OAAQ,GACR/B,OAAQ,OACRzH,OAAQ,IAGJ8L,GAAc,CAClBtC,OAAQ,SACR/B,OAAQ,SACRzH,OAAQ,oBAQJuM,GAAoB,SAOpBqtB,GAAuB,8CAKvBC,GAAkB,WAQxB,MAAMC,WAAkBrzB,EACtBC,YAAY1M,EAASuB,GACnBmR,MAAM1S,GACNgJ,KAAK+2B,eAA2C,SAA1B/2B,KAAK2D,SAASgB,QAAqB5J,OAASiF,KAAK2D,SACvE3D,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAKg3B,SAAW,GAChBh3B,KAAKi3B,SAAW,GAChBj3B,KAAKk3B,cAAgB,KACrBl3B,KAAKm3B,cAAgB,EAErB72B,EAAaQ,GAAGd,KAAK+2B,eAlCH,uBAkCiC,IAAM/2B,KAAKo3B,aAE9Dp3B,KAAKq3B,UACLr3B,KAAKo3B,WAKI7uB,qBACT,OAAOA,GAGE9M,kBACT,OAAOA,GAKT47B,UACE,MAAMC,EAAat3B,KAAK+2B,iBAAmB/2B,KAAK+2B,eAAeh8B,OAtC7C,SAwChB87B,GAEIU,EAAuC,SAAxBv3B,KAAKmK,QAAQ1F,OAChC6yB,EACAt3B,KAAKmK,QAAQ1F,OAET+yB,EAAaD,IAAiBV,GAClC72B,KAAKy3B,gBACL,EAEFz3B,KAAKg3B,SAAW,GAChBh3B,KAAKi3B,SAAW,GAChBj3B,KAAKm3B,cAAgBn3B,KAAK03B,mBAEVxwB,EAAeC,KAAKyvB,GAAqB52B,KAAKmK,QAAQnN,QAE9DoL,KAAIpR,IACV,MAAM2gC,EAAiBngC,EAAuBR,GACxCgG,EAAS26B,EAAiBzwB,EAAeK,QAAQowB,GAAkB,KAEzE,GAAI36B,EAAQ,CACV,MAAM46B,EAAY56B,EAAO0J,wBACzB,GAAIkxB,EAAUlkB,OAASkkB,EAAUjkB,OAC/B,MAAO,CACL9N,EAAY0xB,GAAcv6B,GAAQ2J,IAAM6wB,EACxCG,GAKN,OAAO,QAENvxB,QAAOyxB,GAAQA,IACf1Z,MAAK,CAACC,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KACxB1lB,SAAQk/B,IACP73B,KAAKg3B,SAAS/6B,KAAK47B,EAAK,IACxB73B,KAAKi3B,SAASh7B,KAAK47B,EAAK,OAI9Bh0B,UACEvD,EAAaC,IAAIP,KAAK+2B,eAhHP,iBAiHfrtB,MAAM7F,UAKRuG,WAAW7R,GAWT,OAVAA,EAAS,IACJgQ,MACA1C,EAAYI,kBAAkBjG,KAAK2D,aAChB,iBAAXpL,GAAuBA,EAASA,EAAS,KAG/CyE,OAAS7E,EAAWI,EAAOyE,SAAWvF,SAAS2C,gBAEtD/B,EAAgBoD,GAAMlD,EAAQuQ,IAEvBvQ,EAGTk/B,gBACE,OAAOz3B,KAAK+2B,iBAAmBh8B,OAC7BiF,KAAK+2B,eAAenwB,YACpB5G,KAAK+2B,eAAe5c,UAGxBud,mBACE,OAAO13B,KAAK+2B,eAAerb,cAAgB/d,KAAKC,IAC9CnG,SAASuD,KAAK0gB,aACdjkB,SAAS2C,gBAAgBshB,cAI7Boc,mBACE,OAAO93B,KAAK+2B,iBAAmBh8B,OAC7BA,OAAOg9B,YACP/3B,KAAK+2B,eAAerwB,wBAAwBiN,OAGhDyjB,WACE,MAAMjd,EAAYna,KAAKy3B,gBAAkBz3B,KAAKmK,QAAQ3D,OAChDkV,EAAe1b,KAAK03B,mBACpBM,EAAYh4B,KAAKmK,QAAQ3D,OAASkV,EAAe1b,KAAK83B,mBAM5D,GAJI93B,KAAKm3B,gBAAkBzb,GACzB1b,KAAKq3B,UAGHld,GAAa6d,EAAjB,CACE,MAAMh7B,EAASgD,KAAKi3B,SAASj3B,KAAKi3B,SAAS7+B,OAAS,GAEhD4H,KAAKk3B,gBAAkBl6B,GACzBgD,KAAKi4B,UAAUj7B,OAJnB,CAUA,GAAIgD,KAAKk3B,eAAiB/c,EAAYna,KAAKg3B,SAAS,IAAMh3B,KAAKg3B,SAAS,GAAK,EAG3E,OAFAh3B,KAAKk3B,cAAgB,UACrBl3B,KAAKk4B,SAIP,IAAK,IAAIl5B,EAAIgB,KAAKg3B,SAAS5+B,OAAQ4G,KACVgB,KAAKk3B,gBAAkBl3B,KAAKi3B,SAASj4B,IACxDmb,GAAana,KAAKg3B,SAASh4B,UACM,IAAzBgB,KAAKg3B,SAASh4B,EAAI,IAAsBmb,EAAYna,KAAKg3B,SAASh4B,EAAI,KAGhFgB,KAAKi4B,UAAUj4B,KAAKi3B,SAASj4B,KAKnCi5B,UAAUj7B,GACRgD,KAAKk3B,cAAgBl6B,EAErBgD,KAAKk4B,SAEL,MAAMC,EAAUvB,GAAoBt/B,MAAM,KACvC8Q,KAAInR,GAAa,GAAEA,qBAA4B+F,OAAY/F,WAAkB+F,QAE1Eo7B,EAAOlxB,EAAeK,QAAQ4wB,EAAQ9vB,KAAK,KAAMrI,KAAKmK,QAAQnN,QAEpEo7B,EAAKr+B,UAAUyS,IAAIjD,IACf6uB,EAAKr+B,UAAUC,SAnLU,iBAoL3BkN,EAAeK,QA1KY,mBA0KsB6wB,EAAKxzB,QA3KlC,cA4KjB7K,UAAUyS,IAAIjD,IAEjBrC,EAAeS,QAAQywB,EAnLG,qBAoLvBz/B,SAAQ0/B,IAGPnxB,EAAeW,KAAKwwB,EAAY,+BAC7B1/B,SAAQk/B,GAAQA,EAAK99B,UAAUyS,IAAIjD,MAGtCrC,EAAeW,KAAKwwB,EAzLH,aA0Ld1/B,SAAQ2/B,IACPpxB,EAAeM,SAAS8wB,EA5LX,aA6LV3/B,SAAQk/B,GAAQA,EAAK99B,UAAUyS,IAAIjD,YAKhDjJ,EAAamB,QAAQzB,KAAK+2B,eA3MN,wBA2MsC,CACxDj3B,cAAe9C,IAInBk7B,SACEhxB,EAAeC,KAAKyvB,GAAqB52B,KAAKmK,QAAQnN,QACnDoJ,QAAO4L,GAAQA,EAAKjY,UAAUC,SAASuP,MACvC5Q,SAAQqZ,GAAQA,EAAKjY,UAAUwJ,OAAOgG,MAKrBpF,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAO4xB,GAAUjyB,oBAAoB7E,KAAMzH,GAEjD,GAAsB,iBAAXA,EAAX,CAIA,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,UAWX+H,EAAaQ,GAAG/F,OA7Oa,8BA6OgB,KAC3CmM,EAAeC,KAzOS,0BA0OrBxO,SAAQ4/B,GAAO,IAAIzB,GAAUyB,QAUlCn9B,EAAmB07B,IC7QnB,MAYMvtB,GAAoB,SACpBqpB,GAAkB,OAClBrkB,GAAkB,OAIlBiqB,GAAkB,UAClBC,GAAqB,wBAW3B,MAAMC,WAAYj1B,EAGLhI,kBACT,MAlCS,MAuCX+T,OACE,GAAKxP,KAAK2D,SAASlJ,YACjBuF,KAAK2D,SAASlJ,WAAWvC,WAAa2B,KAAKC,cAC3CkG,KAAK2D,SAAS5J,UAAUC,SAASuP,IACjC,OAGF,IAAIzB,EACJ,MAAM9K,EAASrF,EAAuBqI,KAAK2D,UACrCg1B,EAAc34B,KAAK2D,SAASiB,QA/BN,qBAiC5B,GAAI+zB,EAAa,CACf,MAAMC,EAAwC,OAAzBD,EAAY7mB,UAA8C,OAAzB6mB,EAAY7mB,SAAoB2mB,GAAqBD,GAC3G1wB,EAAWZ,EAAeC,KAAKyxB,EAAcD,GAC7C7wB,EAAWA,EAASA,EAAS1P,OAAS,GAGxC,MAAMygC,EAAY/wB,EAChBxH,EAAamB,QAAQqG,EApDP,cAoD6B,CACzChI,cAAeE,KAAK2D,WAEtB,KAMF,GAJkBrD,EAAamB,QAAQzB,KAAK2D,SAvD5B,cAuDkD,CAChE7D,cAAegI,IAGH/F,kBAAmC,OAAd82B,GAAsBA,EAAU92B,iBACjE,OAGF/B,KAAKi4B,UAAUj4B,KAAK2D,SAAUg1B,GAE9B,MAAMG,EAAW,KACfx4B,EAAamB,QAAQqG,EAnEL,gBAmE6B,CAC3ChI,cAAeE,KAAK2D,WAEtBrD,EAAamB,QAAQzB,KAAK2D,SApEX,eAoEkC,CAC/C7D,cAAegI,KAIf9K,EACFgD,KAAKi4B,UAAUj7B,EAAQA,EAAOvC,WAAYq+B,GAE1CA,IAMJb,UAAUjhC,EAAS2Y,EAAWrU,GAC5B,MAIMy9B,IAJiBppB,GAAqC,OAAvBA,EAAUmC,UAA4C,OAAvBnC,EAAUmC,SAE5E5K,EAAeM,SAASmI,EAAW6oB,IADnCtxB,EAAeC,KAAKsxB,GAAoB9oB,IAGZ,GACxBqpB,EAAkB19B,GAAay9B,GAAUA,EAAOh/B,UAAUC,SAAS44B,IAEnEkG,EAAW,IAAM94B,KAAKi5B,oBAAoBjiC,EAAS+hC,EAAQz9B,GAE7Dy9B,GAAUC,GACZD,EAAOh/B,UAAUwJ,OAAOgL,IACxBvO,KAAKiE,eAAe60B,EAAU9hC,GAAS,IAEvC8hC,IAIJG,oBAAoBjiC,EAAS+hC,EAAQz9B,GACnC,GAAIy9B,EAAQ,CACVA,EAAOh/B,UAAUwJ,OAAOgG,IAExB,MAAM2vB,EAAgBhyB,EAAeK,QA1FJ,kCA0F4CwxB,EAAOt+B,YAEhFy+B,GACFA,EAAcn/B,UAAUwJ,OAAOgG,IAGG,QAAhCwvB,EAAO7hC,aAAa,SACtB6hC,EAAOxzB,aAAa,iBAAiB,GAIzCvO,EAAQ+C,UAAUyS,IAAIjD,IACe,QAAjCvS,EAAQE,aAAa,SACvBF,EAAQuO,aAAa,iBAAiB,GAGxC5K,EAAO3D,GAEHA,EAAQ+C,UAAUC,SAAS44B,KAC7B57B,EAAQ+C,UAAUyS,IAAI+B,IAGxB,IAAID,EAAStX,EAAQyD,WAKrB,GAJI6T,GAA8B,OAApBA,EAAOwD,WACnBxD,EAASA,EAAO7T,YAGd6T,GAAUA,EAAOvU,UAAUC,SAhIF,iBAgIsC,CACjE,MAAMm/B,EAAkBniC,EAAQ4N,QA5HZ,aA8HhBu0B,GACFjyB,EAAeC,KA1HU,mBA0HqBgyB,GAC3CxgC,SAAQygC,GAAYA,EAASr/B,UAAUyS,IAAIjD,MAGhDvS,EAAQuO,aAAa,iBAAiB,GAGpCjK,GACFA,IAMkB6I,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOwzB,GAAI7zB,oBAAoB7E,MAErC,GAAsB,iBAAXzH,EAAqB,CAC9B,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,UAYb+H,EAAaQ,GAAGrJ,SAzKc,wBAWD,4EA8JyC,SAAUyH,GAC1E,CAAC,IAAK,QAAQ9H,SAAS4I,KAAK2E,UAC9BzF,EAAMyD,iBAGJ/I,EAAWoG,OAIF04B,GAAI7zB,oBAAoB7E,MAChCwP,UAUPpU,EAAmBs9B,ICtMnB,MAAMj9B,GAAO,QAcP49B,GAAkB,OAClB9qB,GAAkB,OAClB+qB,GAAqB,UAErBxwB,GAAc,CAClB8mB,UAAW,UACX2J,SAAU,UACVxJ,MAAO,UAGHxnB,GAAU,CACdqnB,WAAW,EACX2J,UAAU,EACVxJ,MAAO,KAST,MAAMyJ,WAAc/1B,EAClBC,YAAY1M,EAASuB,GACnBmR,MAAM1S,GAENgJ,KAAKmK,QAAUnK,KAAKoK,WAAW7R,GAC/ByH,KAAKszB,SAAW,KAChBtzB,KAAKy5B,sBAAuB,EAC5Bz5B,KAAK05B,yBAA0B,EAC/B15B,KAAK0zB,gBAKI5qB,yBACT,OAAOA,GAGEP,qBACT,OAAOA,GAGE9M,kBACT,OAAOA,GAKT+T,OACoBlP,EAAamB,QAAQzB,KAAK2D,SAtD5B,iBAwDF5B,mBAId/B,KAAK25B,gBAED35B,KAAKmK,QAAQylB,WACf5vB,KAAK2D,SAAS5J,UAAUyS,IA5DN,QAsEpBxM,KAAK2D,SAAS5J,UAAUwJ,OAAO81B,IAC/B1+B,EAAOqF,KAAK2D,UACZ3D,KAAK2D,SAAS5J,UAAUyS,IAAI+B,IAC5BvO,KAAK2D,SAAS5J,UAAUyS,IAAI8sB,IAE5Bt5B,KAAKiE,gBAZY,KACfjE,KAAK2D,SAAS5J,UAAUwJ,OAAO+1B,IAC/Bh5B,EAAamB,QAAQzB,KAAK2D,SAnEX,kBAqEf3D,KAAK45B,uBAQuB55B,KAAK2D,SAAU3D,KAAKmK,QAAQylB,YAG5DrgB,OACOvP,KAAK2D,SAAS5J,UAAUC,SAASuU,MAIpBjO,EAAamB,QAAQzB,KAAK2D,SAxF5B,iBA0FF5B,mBAWd/B,KAAK2D,SAAS5J,UAAUyS,IAAI8sB,IAC5Bt5B,KAAKiE,gBARY,KACfjE,KAAK2D,SAAS5J,UAAUyS,IAAI6sB,IAC5Br5B,KAAK2D,SAAS5J,UAAUwJ,OAAO+1B,IAC/Bt5B,KAAK2D,SAAS5J,UAAUwJ,OAAOgL,IAC/BjO,EAAamB,QAAQzB,KAAK2D,SAjGV,qBAqGY3D,KAAK2D,SAAU3D,KAAKmK,QAAQylB,aAG5D/rB,UACE7D,KAAK25B,gBAED35B,KAAK2D,SAAS5J,UAAUC,SAASuU,KACnCvO,KAAK2D,SAAS5J,UAAUwJ,OAAOgL,IAGjC7E,MAAM7F,UAKRuG,WAAW7R,GAST,OARAA,EAAS,IACJgQ,MACA1C,EAAYI,kBAAkBjG,KAAK2D,aAChB,iBAAXpL,GAAuBA,EAASA,EAAS,IAGtDF,EAAgBoD,GAAMlD,EAAQyH,KAAK0D,YAAYoF,aAExCvQ,EAGTqhC,qBACO55B,KAAKmK,QAAQovB,WAIdv5B,KAAKy5B,sBAAwBz5B,KAAK05B,0BAItC15B,KAAKszB,SAAWp2B,YAAW,KACzB8C,KAAKuP,SACJvP,KAAKmK,QAAQ4lB,SAGlB8J,eAAe36B,EAAO46B,GACpB,OAAQ56B,EAAMsB,MACZ,IAAK,YACL,IAAK,WACHR,KAAKy5B,qBAAuBK,EAC5B,MACF,IAAK,UACL,IAAK,WACH95B,KAAK05B,wBAA0BI,EAMnC,GAAIA,EAEF,YADA95B,KAAK25B,gBAIP,MAAMnsB,EAActO,EAAMY,cACtBE,KAAK2D,WAAa6J,GAAexN,KAAK2D,SAAS3J,SAASwT,IAI5DxN,KAAK45B,qBAGPlG,gBACEpzB,EAAaQ,GAAGd,KAAK2D,SA/KA,sBA+K2BzE,GAASc,KAAK65B,eAAe36B,GAAO,KACpFoB,EAAaQ,GAAGd,KAAK2D,SA/KD,qBA+K2BzE,GAASc,KAAK65B,eAAe36B,GAAO,KACnFoB,EAAaQ,GAAGd,KAAK2D,SA/KF,oBA+K2BzE,GAASc,KAAK65B,eAAe36B,GAAO,KAClFoB,EAAaQ,GAAGd,KAAK2D,SA/KD,qBA+K2BzE,GAASc,KAAK65B,eAAe36B,GAAO,KAGrFy6B,gBACErtB,aAAatM,KAAKszB,UAClBtzB,KAAKszB,SAAW,KAKInvB,uBAAC5L,GACrB,OAAOyH,KAAKiF,MAAK,WACf,MAAMC,EAAOs0B,GAAM30B,oBAAoB7E,KAAMzH,GAE7C,GAAsB,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjB2M,EAAK3M,GACd,MAAM,IAAIe,UAAW,oBAAmBf,MAG1C2M,EAAK3M,GAAQyH,kBAMrBuE,EAAqBi1B,IASrBp+B,EAAmBo+B,IC3NJ,CACb10B,MAAAA,EACAO,OAAAA,EACAoE,SAAAA,GACAmF,SAAAA,GACA4Y,SAAAA,GACAgF,MAAAA,GACA4B,UAAAA,GACAsI,QAAAA,GACAI,UAAAA,GACA4B,IAAAA,GACAc,MAAAA,GACApG,QAAAA","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.3'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + window.pageYOffset,\n left: rect.left + window.pageXOffset\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const hasPointerPenTouch = event => {\n return this._pointerEvent &&\n (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n const start = event => {\n if (hasPointerPenTouch(event)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (hasPointerPenTouch(event)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: null\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let actives = []\n let activesData\n\n if (this._config.parent) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives.length) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !this._isShown(elem)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n })\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","// import { isHTMLElement } from './instanceOf';\nexport default function getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars\nincludeScale) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n var rect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1; // FIXME:\n // `offsetWidth` returns an integer while `getBoundingClientRect`\n // returns a float. This results in `scaleX` or `scaleY` being\n // non-1 when it should be for elements that aren't a full pixel in\n // width or height.\n // if (isHTMLElement(element) && includeScale) {\n // const offsetHeight = element.offsetHeight;\n // const offsetWidth = element.offsetWidth;\n // // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n // // Fallback to 1 in case both values are `0`\n // if (offsetWidth > 0) {\n // scaleX = rect.width / offsetWidth || 1;\n // }\n // if (offsetHeight > 0) {\n // scaleY = rect.height / offsetHeight || 1;\n // }\n // }\n\n return {\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n top: rect.top / scaleY,\n right: rect.right / scaleX,\n bottom: rect.bottom / scaleY,\n left: rect.left / scaleX,\n x: rect.left / scaleX,\n y: rect.top / scaleY\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport default function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport within from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(round(x * dpr) / dpr) || 0,\n y: round(round(y * dpr) / dpr) || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets;\n\n var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n _ref3$x = _ref3.x,\n x = _ref3$x === void 0 ? 0 : _ref3$x,\n _ref3$y = _ref3.y,\n y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom; // $FlowFixMe[prop-missing]\n\n y -= offsetParent[heightProp] - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right; // $FlowFixMe[prop-missing]\n\n x -= offsetParent[widthProp] - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n var state = _ref4.state,\n options = _ref4.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport within from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { max as mathMax, min as mathMin } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis || checkAltAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n if (checkMainAxis) {\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(tether ? mathMin(_min, tetherMin) : _min, _offset, tether ? mathMax(_max, tetherMax) : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = rect.width / element.offsetWidth || 1;\n var scaleY = rect.height / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n this._createPopper(parent)\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper(parent) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._isShown()) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (event.key === ESCAPE_KEY) {\n instance.hide()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n instance.show()\n }\n\n instance._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n className: 'modal-backdrop',\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n className: 'string',\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.append(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n trapElement: null, // The element to trap focus inside of\n autofocus: true\n}\n\nconst DefaultType = {\n trapElement: 'element',\n autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n activate() {\n const { trapElement, autofocus } = this._config\n\n if (this._isActive) {\n return\n }\n\n if (autofocus) {\n trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n\n _handleFocusin(event) {\n const { target } = event\n const { trapElement } = this._config\n\n if (target === document || target === trapElement || trapElement.contains(target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking moddal toggler while another one is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen) {\n Modal.getInstance(allReadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n if (!this._config.scroll) {\n this._focustrap.activate()\n }\n\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attributeName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i]\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n attributeList.forEach(attribute => {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n // This will be removed later in favor of a `setContent` method\n if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n this._disposePopper()\n this.tip.remove()\n this.tip = null\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = this._resolvePossibleFunction(this._config.customClass)\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n this._disposePopper()\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n const tip = element.children[0]\n this.setContent(tip)\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n this.tip = tip\n return this.tip\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n }\n\n _sanitizeAndSetContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!content && templateElement) {\n templateElement.remove()\n return\n }\n\n // we use append for html objects to maintain js events\n this.setElementContent(templateElement, content)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.append(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n return this._resolvePossibleFunction(title)\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(content) {\n return typeof content === 'function' ? content.call(this._element) : content\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n }\n\n // Private\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n\n // Handle special case when .nav-link is inside .nav-item\n SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)\n .forEach(navItem => {\n SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n })\n })\n }\n\n EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n SelectorEngine.find(SELECTOR_DATA_SPY)\n .forEach(spy => new ScrollSpy(spy))\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n reflow\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_UL = ':scope > li > .active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n if ((this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n this._element.classList.contains(CLASS_NAME_ACTIVE))) {\n return\n }\n\n let previous\n const target = getElementFromSelector(this._element)\n const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE\n previous = SelectorEngine.find(itemSelector, listElement)\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = previous ?\n EventHandler.trigger(previous, EVENT_HIDE, {\n relatedTarget: this._element\n }) :\n null\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget: previous\n })\n\n if (showEvent.defaultPrevented || (hideEvent !== null && hideEvent.defaultPrevented)) {\n return\n }\n\n this._activate(this._element, listElement)\n\n const complete = () => {\n EventHandler.trigger(previous, EVENT_HIDDEN, {\n relatedTarget: this._element\n })\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget: previous\n })\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?\n SelectorEngine.find(SELECTOR_ACTIVE_UL, container) :\n SelectorEngine.children(container, SELECTOR_ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && active.classList.contains(CLASS_NAME_FADE))\n\n const complete = () => this._transitionComplete(element, active, callback)\n\n if (active && isTransitioning) {\n active.classList.remove(CLASS_NAME_SHOW)\n this._queueCallback(complete, element, true)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n active.classList.remove(CLASS_NAME_ACTIVE)\n\n const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode)\n\n if (dropdownChild) {\n dropdownChild.classList.remove(CLASS_NAME_ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n\n reflow(element)\n\n if (element.classList.contains(CLASS_NAME_FADE)) {\n element.classList.add(CLASS_NAME_SHOW)\n }\n\n let parent = element.parentNode\n if (parent && parent.nodeName === 'LI') {\n parent = parent.parentNode\n }\n\n if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n const dropdownElement = element.closest(SELECTOR_DROPDOWN)\n\n if (dropdownElement) {\n SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)\n .forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE))\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const data = Tab.getOrCreateInstance(this)\n data.show()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tab to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING)\n this._element.classList.remove(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n return config\n }\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout':\n this._hasMouseInteraction = isInteracting\n break\n case 'focusin':\n case 'focusout':\n this._hasKeyboardInteraction = isInteracting\n break\n default:\n break\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\nenableDismissTrigger(Toast)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Toast to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert'\nimport Button from './src/button'\nimport Carousel from './src/carousel'\nimport Collapse from './src/collapse'\nimport Dropdown from './src/dropdown'\nimport Modal from './src/modal'\nimport Offcanvas from './src/offcanvas'\nimport Popover from './src/popover'\nimport ScrollSpy from './src/scrollspy'\nimport Tab from './src/tab'\nimport Toast from './src/toast'\nimport Tooltip from './src/tooltip'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"]} \ No newline at end of file diff --git a/src/base/theme/bootsier/assets/js/bootstrap.min.js b/src/base/theme/bootsier/assets/js/bootstrap.min.js new file mode 100644 index 00000000..d155068c --- /dev/null +++ b/src/base/theme/bootsier/assets/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){if(t&&t.__esModule)return t;const e=Object.create(null);if(t)for(const i in t)if("default"!==i){const s=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const i=e(t),s="transitionend",n=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},o=t=>{const e=n(t);return e&&document.querySelector(e)?e:null},r=t=>{const e=n(t);return e?document.querySelector(e):null},a=t=>{t.dispatchEvent(new Event(s))},l=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),c=t=>l(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,h=(t,e,i)=>{Object.keys(i).forEach((s=>{const n=i[s],o=e[s],r=o&&l(o)?"element":null==(a=o)?`${a}`:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(n).test(r))throw new TypeError(`${t.toUpperCase()}: Option "${s}" provided type "${r}" but expected type "${n}".`)}))},d=t=>!(!l(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),u=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),g=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?g(t.parentNode):null},_=()=>{},f=t=>{t.offsetHeight},p=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},m=[],b=()=>"rtl"===document.documentElement.dir,v=t=>{var e;e=()=>{const e=p();if(e){const i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}},"loading"===document.readyState?(m.length||document.addEventListener("DOMContentLoaded",(()=>{m.forEach((t=>t()))})),m.push(e)):e()},y=t=>{"function"==typeof t&&t()},E=(t,e,i=!0)=>{if(!i)return void y(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const s=Number.parseFloat(e),n=Number.parseFloat(i);return s||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let o=!1;const r=({target:i})=>{i===e&&(o=!0,e.removeEventListener(s,r),y(t))};e.addEventListener(s,r),setTimeout((()=>{o||a(e)}),n)},w=(t,e,i,s)=>{let n=t.indexOf(e);if(-1===n)return t[!i&&s?t.length-1:0];const o=t.length;return n+=i?1:-1,s&&(n=(n+o)%o),t[Math.max(0,Math.min(n,o-1))]},A=/[^.]*(?=\..*)\.|.*/,T=/\..*/,C=/::\d+$/,k={};let L=1;const S={mouseenter:"mouseover",mouseleave:"mouseout"},O=/^(mouseenter|mouseleave)/i,N=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"]);function D(t,e){return e&&`${e}::${L++}`||t.uidEvent||L++}function I(t){const e=D(t);return t.uidEvent=e,k[e]=k[e]||{},k[e]}function P(t,e,i=null){const s=Object.keys(t);for(let n=0,o=s.length;n<o;n++){const o=t[s[n]];if(o.originalHandler===e&&o.delegationSelector===i)return o}return null}function x(t,e,i){const s="string"==typeof e,n=s?i:e;let o=H(t);return N.has(o)||(o=t),[s,n,o]}function M(t,e,i,s,n){if("string"!=typeof e||!t)return;if(i||(i=s,s=null),O.test(e)){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};s?s=t(s):i=t(i)}const[o,r,a]=x(e,i,s),l=I(t),c=l[a]||(l[a]={}),h=P(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=D(r,e.replace(A,"")),u=o?function(t,e,i){return function s(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return n.delegateTarget=r,s.oneOff&&$.off(t,n.type,e,i),i.apply(r,[n]);return null}}(t,i,s):function(t,e){return function i(s){return s.delegateTarget=t,i.oneOff&&$.off(t,s.type,e),e.apply(t,[s])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function j(t,e,i,s,n){const o=P(e[i],s,n);o&&(t.removeEventListener(i,o,Boolean(n)),delete e[i][o.uidEvent])}function H(t){return t=t.replace(T,""),S[t]||t}const $={on(t,e,i,s){M(t,e,i,s,!1)},one(t,e,i,s){M(t,e,i,s,!0)},off(t,e,i,s){if("string"!=typeof e||!t)return;const[n,o,r]=x(e,i,s),a=r!==e,l=I(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void j(t,l,r,o,n?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,s){const n=e[i]||{};Object.keys(n).forEach((o=>{if(o.includes(s)){const s=n[o];j(t,e,i,s.originalHandler,s.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const s=i.replace(C,"");if(!a||e.includes(s)){const e=h[i];j(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const s=p(),n=H(e),o=e!==n,r=N.has(n);let a,l=!0,c=!0,h=!1,d=null;return o&&s&&(a=s.Event(e,i),s(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(n,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},B=new Map,z={set(t,e,i){B.has(t)||B.set(t,new Map);const s=B.get(t);s.has(e)||0===s.size?s.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(t,e)=>B.has(t)&&B.get(t).get(e)||null,remove(t,e){if(!B.has(t))return;const i=B.get(t);i.delete(e),0===i.size&&B.delete(t)}};class R{constructor(t){(t=c(t))&&(this._element=t,z.set(this._element,this.constructor.DATA_KEY,this))}dispose(){z.remove(this._element,this.constructor.DATA_KEY),$.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){E(t,e,i)}static getInstance(t){return z.get(c(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const F=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;$.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),u(this))return;const n=r(this)||this.closest(`.${s}`);t.getOrCreateInstance(n)[e]()}))};class q extends R{static get NAME(){return"alert"}close(){if($.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),$.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}F(q,"close"),v(q);const W='[data-bs-toggle="button"]';class U extends R{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=U.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function K(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function V(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}$.on(document,"click.bs.button.data-api",W,(t=>{t.preventDefault();const e=t.target.closest(W);U.getOrCreateInstance(e).toggle()})),v(U);const X={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${V(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${V(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let s=i.replace(/^bs/,"");s=s.charAt(0).toLowerCase()+s.slice(1,s.length),e[s]=K(t.dataset[i])})),e},getDataAttribute:(t,e)=>K(t.getAttribute(`data-bs-${V(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},Y={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let s=t.parentNode;for(;s&&s.nodeType===Node.ELEMENT_NODE&&3!==s.nodeType;)s.matches(e)&&i.push(s),s=s.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!u(t)&&d(t)))}},Q="carousel",G={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Z={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},J="next",tt="prev",et="left",it="right",st={ArrowLeft:it,ArrowRight:et},nt="slid.bs.carousel",ot="active",rt=".active.carousel-item";class at extends R{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=Y.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return G}static get NAME(){return Q}next(){this._slide(J)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(tt)}pause(t){t||(this._isPaused=!0),Y.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(a(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=Y.findOne(rt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void $.one(this._element,nt,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?J:tt;this._slide(i,this._items[t])}_getConfig(t){return t={...G,...X.getDataAttributes(this._element),..."object"==typeof t?t:{}},h(Q,t,Z),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?it:et)}_addEventListeners(){this._config.keyboard&&$.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&($.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),$.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},s=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};Y.find(".carousel-item img",this._element).forEach((t=>{$.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?($.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),$.on(this._element,"pointerup.bs.carousel",(t=>s(t))),this._element.classList.add("pointer-event")):($.on(this._element,"touchstart.bs.carousel",(t=>e(t))),$.on(this._element,"touchmove.bs.carousel",(t=>i(t))),$.on(this._element,"touchend.bs.carousel",(t=>s(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=st[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?Y.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===J;return w(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),s=this._getItemIndex(Y.findOne(rt,this._element));return $.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:s,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=Y.findOne(".active",this._indicatorsElement);e.classList.remove(ot),e.removeAttribute("aria-current");const i=Y.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e<i.length;e++)if(Number.parseInt(i[e].getAttribute("data-bs-slide-to"),10)===this._getItemIndex(t)){i[e].classList.add(ot),i[e].setAttribute("aria-current","true");break}}}_updateInterval(){const t=this._activeElement||Y.findOne(rt,this._element);if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}_slide(t,e){const i=this._directionToOrder(t),s=Y.findOne(rt,this._element),n=this._getItemIndex(s),o=e||this._getItemByOrder(i,s),r=this._getItemIndex(o),a=Boolean(this._interval),l=i===J,c=l?"carousel-item-start":"carousel-item-end",h=l?"carousel-item-next":"carousel-item-prev",d=this._orderToDirection(i);if(o&&o.classList.contains(ot))return void(this._isSliding=!1);if(this._isSliding)return;if(this._triggerSlideEvent(o,d).defaultPrevented)return;if(!s||!o)return;this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(o),this._activeElement=o;const u=()=>{$.trigger(this._element,nt,{relatedTarget:o,direction:d,from:n,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),f(o),s.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(ot),s.classList.remove(ot,h,c),this._isSliding=!1,setTimeout(u,0)};this._queueCallback(t,s,!0)}else s.classList.remove(ot),o.classList.add(ot),this._isSliding=!1,u();a&&this.cycle()}_directionToOrder(t){return[it,et].includes(t)?b()?t===et?tt:J:t===et?J:tt:t}_orderToDirection(t){return[J,tt].includes(t)?b()?t===tt?et:it:t===tt?it:et:t}static carouselInterface(t,e){const i=at.getOrCreateInstance(t,e);let{_config:s}=i;"object"==typeof e&&(s={...s,...e});const n="string"==typeof e?e:s.slide;if("number"==typeof e)i.to(e);else if("string"==typeof n){if(void 0===i[n])throw new TypeError(`No method named "${n}"`);i[n]()}else s.interval&&s.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){at.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=r(this);if(!e||!e.classList.contains("carousel"))return;const i={...X.getDataAttributes(e),...X.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),at.carouselInterface(e,i),s&&at.getInstance(e).to(s),t.preventDefault()}}$.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",at.dataApiClickHandler),$.on(window,"load.bs.carousel.data-api",(()=>{const t=Y.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;e<i;e++)at.carouselInterface(t[e],at.getInstance(t[e]))})),v(at);const lt="collapse",ct={toggle:!0,parent:null},ht={toggle:"boolean",parent:"(null|element)"},dt="show",ut="collapse",gt="collapsing",_t="collapsed",ft=":scope .collapse .collapse",pt='[data-bs-toggle="collapse"]';class mt extends R{constructor(t,e){super(t),this._isTransitioning=!1,this._config=this._getConfig(e),this._triggerArray=[];const i=Y.find(pt);for(let t=0,e=i.length;t<e;t++){const e=i[t],s=o(e),n=Y.find(s).filter((t=>t===this._element));null!==s&&n.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ct}static get NAME(){return lt}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=Y.find(ft,this._config.parent);e=Y.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=Y.findOne(this._selector);if(e.length){const s=e.find((t=>i!==t));if(t=s?mt.getInstance(s):null,t&&t._isTransitioning)return}if($.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&mt.getOrCreateInstance(e,{toggle:!1}).hide(),t||z.set(e,"bs.collapse",null)}));const s=this._getDimension();this._element.classList.remove(ut),this._element.classList.add(gt),this._element.style[s]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const n=`scroll${s[0].toUpperCase()+s.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gt),this._element.classList.add(ut,dt),this._element.style[s]="",$.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[s]=`${this._element[n]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if($.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,f(this._element),this._element.classList.add(gt),this._element.classList.remove(ut,dt);const e=this._triggerArray.length;for(let t=0;t<e;t++){const e=this._triggerArray[t],i=r(e);i&&!this._isShown(i)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gt),this._element.classList.add(ut),$.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(dt)}_getConfig(t){return(t={...ct,...X.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=c(t.parent),h(lt,t,ht),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=Y.find(ft,this._config.parent);Y.find(pt,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=r(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(_t):t.classList.add(_t),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=mt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}$.on(document,"click.bs.collapse.data-api",pt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=o(this);Y.find(e).forEach((t=>{mt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),v(mt);const bt="dropdown",vt="Escape",yt="Space",Et="ArrowUp",wt="ArrowDown",At=new RegExp("ArrowUp|ArrowDown|Escape"),Tt="click.bs.dropdown.data-api",Ct="keydown.bs.dropdown.data-api",kt="show",Lt='[data-bs-toggle="dropdown"]',St=".dropdown-menu",Ot=b()?"top-end":"top-start",Nt=b()?"top-start":"top-end",Dt=b()?"bottom-end":"bottom-start",It=b()?"bottom-start":"bottom-end",Pt=b()?"left-start":"right-start",xt=b()?"right-start":"left-start",Mt={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},jt={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class Ht extends R{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar()}static get Default(){return Mt}static get DefaultType(){return jt}static get NAME(){return bt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(u(this._element)||this._isShown(this._menu))return;const t={relatedTarget:this._element};if($.trigger(this._element,"show.bs.dropdown",t).defaultPrevented)return;const e=Ht.getParentFromElement(this._element);this._inNavbar?X.setDataAttribute(this._menu,"popper","none"):this._createPopper(e),"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach((t=>$.on(t,"mouseover",_))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(kt),this._element.classList.add(kt),$.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(u(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){$.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>$.off(t,"mouseover",_))),this._popper&&this._popper.destroy(),this._menu.classList.remove(kt),this._element.classList.remove(kt),this._element.setAttribute("aria-expanded","false"),X.removeDataAttribute(this._menu,"popper"),$.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...X.getDataAttributes(this._element),...t},h(bt,t,this.constructor.DefaultType),"object"==typeof t.reference&&!l(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${bt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===i)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:l(this._config.reference)?e=c(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const s=this._getPopperConfig(),n=s.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=i.createPopper(e,this._menu,s),n&&X.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(kt)}_getMenuElement(){return Y.next(this._element,St)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return Pt;if(t.classList.contains("dropstart"))return xt;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Nt:Ot:e?It:Dt}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=Y.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(d);i.length&&w(i,e,t===wt,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ht.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=Y.find(Lt);for(let i=0,s=e.length;i<s;i++){const s=Ht.getInstance(e[i]);if(!s||!1===s._config.autoClose)continue;if(!s._isShown())continue;const n={relatedTarget:s._element};if(t){const e=t.composedPath(),i=e.includes(s._menu);if(e.includes(s._element)||"inside"===s._config.autoClose&&!i||"outside"===s._config.autoClose&&i)continue;if(s._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;"click"===t.type&&(n.clickEvent=t)}s._completeHide(n)}}static getParentFromElement(t){return r(t)||t.parentNode}static dataApiKeydownHandler(t){if(/input|textarea/i.test(t.target.tagName)?t.key===yt||t.key!==vt&&(t.key!==wt&&t.key!==Et||t.target.closest(St)):!At.test(t.key))return;const e=this.classList.contains(kt);if(!e&&t.key===vt)return;if(t.preventDefault(),t.stopPropagation(),u(this))return;const i=this.matches(Lt)?this:Y.prev(this,Lt)[0],s=Ht.getOrCreateInstance(i);if(t.key!==vt)return t.key===Et||t.key===wt?(e||s.show(),void s._selectMenuItem(t)):void(e&&t.key!==yt||Ht.clearMenus());s.hide()}}$.on(document,Ct,Lt,Ht.dataApiKeydownHandler),$.on(document,Ct,St,Ht.dataApiKeydownHandler),$.on(document,Tt,Ht.clearMenus),$.on(document,"keyup.bs.dropdown.data-api",Ht.clearMenus),$.on(document,Tt,Lt,(function(t){t.preventDefault(),Ht.getOrCreateInstance(this).toggle()})),v(Ht);const $t=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Bt=".sticky-top";class zt{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",(e=>e+t)),this._setElementAttributes($t,"paddingRight",(e=>e+t)),this._setElementAttributes(Bt,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const s=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+s)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(n))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes($t,"paddingRight"),this._resetElementAttributes(Bt,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&X.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=X.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(X.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){l(t)?e(t):Y.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const Rt={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},Ft={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},qt="show",Wt="mousedown.bs.backdrop";class Ut{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&f(this._getElement()),this._getElement().classList.add(qt),this._emulateAnimation((()=>{y(t)}))):y(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(qt),this._emulateAnimation((()=>{this.dispose(),y(t)}))):y(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...Rt,..."object"==typeof t?t:{}}).rootElement=c(t.rootElement),h("backdrop",t,Ft),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),$.on(this._getElement(),Wt,(()=>{y(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&($.off(this._element,Wt),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){E(t,this._getElement(),this._config.isAnimated)}}const Kt={trapElement:null,autofocus:!0},Vt={trapElement:"element",autofocus:"boolean"},Xt=".bs.focustrap",Yt="backward";class Qt{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),$.off(document,Xt),$.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),$.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,$.off(document,Xt))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const s=Y.focusableChildren(i);0===s.length?i.focus():this._lastTabNavDirection===Yt?s[s.length-1].focus():s[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Yt:"forward")}_getConfig(t){return t={...Kt,..."object"==typeof t?t:{}},h("focustrap",t,Vt),t}}const Gt="modal",Zt="Escape",Jt={backdrop:!0,keyboard:!0,focus:!0},te={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},ee="hidden.bs.modal",ie="show.bs.modal",se="resize.bs.modal",ne="click.dismiss.bs.modal",oe="keydown.dismiss.bs.modal",re="mousedown.dismiss.bs.modal",ae="modal-open",le="show",ce="modal-static";class he extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=Y.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new zt}static get Default(){return Jt}static get NAME(){return Gt}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||$.trigger(this._element,ie,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(ae),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),$.on(this._dialog,re,(()=>{$.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if($.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(le),$.off(this._element,ne),$.off(this._dialog,re),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>$.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ut({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Qt({trapElement:this._element})}_getConfig(t){return t={...Jt,...X.getDataAttributes(this._element),..."object"==typeof t?t:{}},h(Gt,t,te),t}_showElement(t){const e=this._isAnimated(),i=Y.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||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,i&&(i.scrollTop=0),e&&f(this._element),this._element.classList.add(le),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,$.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?$.on(this._element,oe,(t=>{this._config.keyboard&&t.key===Zt?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Zt||this._triggerBackdropTransition()})):$.off(this._element,oe)}_setResizeEvent(){this._isShown?$.on(window,se,(()=>this._adjustDialog())):$.off(window,se)}_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(ae),this._resetAdjustments(),this._scrollBar.reset(),$.trigger(this._element,ee)}))}_showBackdrop(t){$.on(this._element,ne,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if($.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,s=e>document.documentElement.clientHeight;!s&&"hidden"===i.overflowY||t.contains(ce)||(s||(i.overflowY="hidden"),t.add(ce),this._queueCallback((()=>{t.remove(ce),s||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!b()||i&&!t&&b())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!b()||!i&&t&&b())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=he.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}$.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=r(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),$.one(e,ie,(t=>{t.defaultPrevented||$.one(e,ee,(()=>{d(this)&&this.focus()}))}));const i=Y.findOne(".modal.show");i&&he.getInstance(i).hide(),he.getOrCreateInstance(e).toggle(this)})),F(he),v(he);const de="offcanvas",ue={backdrop:!0,keyboard:!0,scroll:!1},ge={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},_e="show",fe=".offcanvas.show",pe="hidden.bs.offcanvas";class me extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return de}static get Default(){return ue}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||$.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new zt).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(_e),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),$.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&($.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove(_e),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new zt).reset(),$.trigger(this._element,pe)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...ue,...X.getDataAttributes(this._element),..."object"==typeof t?t:{}},h(de,t,ge),t}_initializeBackDrop(){return new Ut({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Qt({trapElement:this._element})}_addEventListeners(){$.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=me.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}$.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=r(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this))return;$.one(e,pe,(()=>{d(this)&&this.focus()}));const i=Y.findOne(fe);i&&i!==e&&me.getInstance(i).hide(),me.getOrCreateInstance(e).toggle(this)})),$.on(window,"load.bs.offcanvas.data-api",(()=>Y.find(fe).forEach((t=>me.getOrCreateInstance(t).show())))),F(me),v(me);const be=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),ve=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,ye=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ee=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!be.has(i)||Boolean(ve.test(t.nodeValue)||ye.test(t.nodeValue));const s=e.filter((t=>t instanceof RegExp));for(let t=0,e=s.length;t<e;t++)if(s[t].test(i))return!0;return!1};function we(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const s=(new window.DOMParser).parseFromString(t,"text/html"),n=[].concat(...s.body.querySelectorAll("*"));for(let t=0,i=n.length;t<i;t++){const i=n[t],s=i.nodeName.toLowerCase();if(!Object.keys(e).includes(s)){i.remove();continue}const o=[].concat(...i.attributes),r=[].concat(e["*"]||[],e[s]||[]);o.forEach((t=>{Ee(t,r)||i.removeAttribute(t.nodeName)}))}return s.body.innerHTML}const Ae="tooltip",Te=new Set(["sanitize","allowList","sanitizeFn"]),Ce={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},ke={AUTO:"auto",TOP:"top",RIGHT:b()?"left":"right",BOTTOM:"bottom",LEFT:b()?"right":"left"},Le={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],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:[]},popperConfig:null},Se={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Oe="fade",Ne="show",De="show",Ie="out",Pe=".tooltip-inner",xe=".modal",Me="hide.bs.modal",je="hover",He="focus";class $e extends R{constructor(t,e){if(void 0===i)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Le}static get NAME(){return Ae}static get Event(){return Se}static get DefaultType(){return Ce}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(Ne))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),$.off(this._element.closest(xe),Me,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=$.trigger(this._element,this.constructor.Event.SHOW),e=g(this._element),s=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!s)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(Pe).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),o=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",o),this._element.setAttribute("aria-describedby",o),this._config.animation&&n.classList.add(Oe);const r="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,a=this._getAttachment(r);this._addAttachmentClass(a);const{container:l}=this._config;z.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(l.append(n),$.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=i.createPopper(this._element,n,this._getPopperConfig(a)),n.classList.add(Ne);const c=this._resolvePossibleFunction(this._config.customClass);c&&n.classList.add(...c.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{$.on(t,"mouseover",_)}));const h=this.tip.classList.contains(Oe);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,$.trigger(this._element,this.constructor.Event.SHOWN),t===Ie&&this._leave(null,this)}),this.tip,h)}hide(){if(!this._popper)return;const t=this.getTipElement();if($.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(Ne),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>$.off(t,"mouseover",_))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(Oe);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==De&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),$.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(Oe,Ne),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),Pe)}_sanitizeAndSetContent(t,e,i){const s=Y.findOne(i,t);e||!s?this.setElementContent(s,e):s.remove()}setElementContent(t,e){if(null!==t)return l(e)?(e=c(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=we(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,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:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return ke[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)$.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===je?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===je?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;$.on(this._element,e,this._config.selector,(t=>this._enter(t))),$.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},$.on(this._element.closest(xe),Me,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?He:je]=!0),e.getTipElement().classList.contains(Ne)||e._hoverState===De?e._hoverState=De:(clearTimeout(e._timeout),e._hoverState=De,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===De&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?He:je]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Ie,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===Ie&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=X.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Te.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:c(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),h(Ae,t,this.constructor.DefaultType),t.sanitize&&(t.template=we(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=$e.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}v($e);const Be={...$e.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'},ze={...$e.DefaultType,content:"(string|element|function)"},Re={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Fe extends $e{static get Default(){return Be}static get NAME(){return"popover"}static get Event(){return Re}static get DefaultType(){return ze}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=Fe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}v(Fe);const qe="scrollspy",We={offset:10,method:"auto",target:""},Ue={offset:"number",method:"string",target:"(string|element)"},Ke="active",Ve=".nav-link, .list-group-item, .dropdown-item",Xe="position";class Ye extends R{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,$.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return We}static get NAME(){return qe}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":Xe,e="auto"===this._config.method?t:this._config.method,i=e===Xe?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),Y.find(Ve,this._config.target).map((t=>{const s=o(t),n=s?Y.findOne(s):null;if(n){const t=n.getBoundingClientRect();if(t.width||t.height)return[X[e](n).top+i,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){$.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...We,...X.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=c(t.target)||document.documentElement,h(qe,t,Ue),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t<this._offsets[e+1])&&this._activate(this._targets[e])}}_activate(t){this._activeTarget=t,this._clear();const e=Ve.split(",").map((e=>`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=Y.findOne(e.join(","),this._config.target);i.classList.add(Ke),i.classList.contains("dropdown-item")?Y.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(Ke):Y.parents(i,".nav, .list-group").forEach((t=>{Y.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(Ke))),Y.prev(t,".nav-item").forEach((t=>{Y.children(t,".nav-link").forEach((t=>t.classList.add(Ke)))}))})),$.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){Y.find(Ve,this._config.target).filter((t=>t.classList.contains(Ke))).forEach((t=>t.classList.remove(Ke)))}static jQueryInterface(t){return this.each((function(){const e=Ye.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}$.on(window,"load.bs.scrollspy.data-api",(()=>{Y.find('[data-bs-spy="scroll"]').forEach((t=>new Ye(t)))})),v(Ye);const Qe="active",Ge="fade",Ze="show",Je=".active",ti=":scope > li > .active";class ei extends R{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Qe))return;let t;const e=r(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?ti:Je;t=Y.find(e,i),t=t[t.length-1]}const s=t?$.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if($.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const n=()=>{$.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),$.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,n):n()}_activate(t,e,i){const s=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?Y.children(e,Je):Y.find(ti,e))[0],n=i&&s&&s.classList.contains(Ge),o=()=>this._transitionComplete(t,s,i);s&&n?(s.classList.remove(Ze),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Qe);const t=Y.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Qe),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Qe),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),f(t),t.classList.contains(Ge)&&t.classList.add(Ze);let s=t.parentNode;if(s&&"LI"===s.nodeName&&(s=s.parentNode),s&&s.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&Y.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Qe))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=ei.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}$.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this)||ei.getOrCreateInstance(this).show()})),v(ei);const ii="toast",si="hide",ni="show",oi="showing",ri={animation:"boolean",autohide:"boolean",delay:"number"},ai={animation:!0,autohide:!0,delay:5e3};class li extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return ri}static get Default(){return ai}static get NAME(){return ii}show(){$.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(si),f(this._element),this._element.classList.add(ni),this._element.classList.add(oi),this._queueCallback((()=>{this._element.classList.remove(oi),$.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(ni)&&($.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(oi),this._queueCallback((()=>{this._element.classList.add(si),this._element.classList.remove(oi),this._element.classList.remove(ni),$.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(ni)&&this._element.classList.remove(ni),super.dispose()}_getConfig(t){return t={...ai,...X.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},h(ii,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){$.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),$.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),$.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),$.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return F(li),v(li),{Alert:q,Button:U,Carousel:at,Collapse:mt,Dropdown:Ht,Modal:he,Offcanvas:me,Popover:Fe,ScrollSpy:Ye,Tab:ei,Toast:li,Tooltip:$e}})); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/src/base/theme/bootsier/assets/js/bootstrap.min.js.map b/src/base/theme/bootsier/assets/js/bootstrap.min.js.map new file mode 100644 index 00000000..835a3d6b --- /dev/null +++ b/src/base/theme/bootsier/assets/js/bootstrap.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["TRANSITION_END","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","document","querySelector","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","querySelectorAll","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","static","getInstance","VERSION","Error","enableDismissTrigger","component","method","clickEvent","tagName","closest","getOrCreateInstance","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","position","offsetTop","offsetLeft","SelectorEngine","find","concat","Element","prototype","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","EVENT_SLID","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE_ITEM","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","hasPointerPenTouch","pointerType","start","clientX","touches","move","end","clearTimeout","itemImg","add","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElem","_selector","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activesData","actives","container","tempActiveData","elemActive","dimension","_getDimension","style","scrollSize","triggerArrayLength","selected","triggerArray","isOpen","ESCAPE_KEY","SPACE_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","REGEXP_KEYDOWN","EVENT_CLICK_DATA_API","EVENT_KEYDOWN_DATA_API","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","boundary","reference","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","_createPopper","focus","_completeHide","destroy","update","Popper","referenceElement","_getPopperConfig","isDisplayStatic","modifiers","modifier","enabled","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","options","_selectMenuItem","items","toggles","context","composedPath","isMenuTarget","isActive","stopPropagation","getToggleButton","clearMenus","dataApiKeydownHandler","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","overflow","styleProp","scrollbarWidth","_applyManipulationCallback","reset","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","className","rootElement","clickCallback","EVENT_MOUSEDOWN","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","trapElement","autofocus","TAB_NAV_BACKWARD","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","EVENT_HIDDEN","EVENT_SHOW","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","scrollTop","_triggerBackdropTransition","_resetAdjustments","currentTarget","scrollHeight","isModalOverflowing","clientHeight","overflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","allReadyOpen","scroll","OPEN_SELECTOR","Offcanvas","visibility","blur","uriAttributes","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","regExp","attributeRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","DISALLOWED_ATTRIBUTES","animation","template","title","delay","html","fallbackPlacements","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","CLASS_NAME_FADE","HOVER_STATE_SHOW","HOVER_STATE_OUT","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","_disposePopper","isWithContent","shadowRoot","isInTheDom","ownerDocument","getTitle","tipId","prefix","floor","random","getElementById","getUID","attachment","_getAttachment","_addAttachmentClass","_resolvePossibleFunction","prevHoverState","_cleanTipClass","setContent","_sanitizeAndSetContent","content","templateElement","setElementContent","textContent","updateAttachment","_getDelegateConfig","phase","_handlePopperPlacementChange","onFirstUpdate","_getBasicClassPrefix","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","basicClassPrefixRegex","tabClass","token","tClass","state","popper","Popover","_getContent","SELECTOR_LINK_ITEMS","METHOD_POSITION","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","height","item","sort","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","listGroup","navItem","node","spy","SELECTOR_ACTIVE","SELECTOR_ACTIVE_UL","Tab","listElement","itemSelector","hideEvent","complete","active","isTransitioning","_transitionComplete","dropdownChild","dropdownElement","dropdown","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.3'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + window.pageYOffset,\n left: rect.left + window.pageXOffset\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const hasPointerPenTouch = event => {\n return this._pointerEvent &&\n (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n const start = event => {\n if (hasPointerPenTouch(event)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (hasPointerPenTouch(event)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: null\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let actives = []\n let activesData\n\n if (this._config.parent) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives.length) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !this._isShown(elem)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n })\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n this._createPopper(parent)\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper(parent) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._isShown()) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (event.key === ESCAPE_KEY) {\n instance.hide()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n instance.show()\n }\n\n instance._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n className: 'modal-backdrop',\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n className: 'string',\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.append(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n trapElement: null, // The element to trap focus inside of\n autofocus: true\n}\n\nconst DefaultType = {\n trapElement: 'element',\n autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n activate() {\n const { trapElement, autofocus } = this._config\n\n if (this._isActive) {\n return\n }\n\n if (autofocus) {\n trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n\n _handleFocusin(event) {\n const { target } = event\n const { trapElement } = this._config\n\n if (target === document || target === trapElement || trapElement.contains(target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking moddal toggler while another one is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen) {\n Modal.getInstance(allReadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n if (!this._config.scroll) {\n this._focustrap.activate()\n }\n\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attributeName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i]\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n attributeList.forEach(attribute => {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n // This will be removed later in favor of a `setContent` method\n if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n this._disposePopper()\n this.tip.remove()\n this.tip = null\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = this._resolvePossibleFunction(this._config.customClass)\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n this._disposePopper()\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n const tip = element.children[0]\n this.setContent(tip)\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n this.tip = tip\n return this.tip\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n }\n\n _sanitizeAndSetContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!content && templateElement) {\n templateElement.remove()\n return\n }\n\n // we use append for html objects to maintain js events\n this.setElementContent(templateElement, content)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.append(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n return this._resolvePossibleFunction(title)\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(content) {\n return typeof content === 'function' ? content.call(this._element) : content\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n }\n\n // Private\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n\n // Handle special case when .nav-link is inside .nav-item\n SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)\n .forEach(navItem => {\n SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n })\n })\n }\n\n EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n SelectorEngine.find(SELECTOR_DATA_SPY)\n .forEach(spy => new ScrollSpy(spy))\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n reflow\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_UL = ':scope > li > .active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n if ((this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n this._element.classList.contains(CLASS_NAME_ACTIVE))) {\n return\n }\n\n let previous\n const target = getElementFromSelector(this._element)\n const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE\n previous = SelectorEngine.find(itemSelector, listElement)\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = previous ?\n EventHandler.trigger(previous, EVENT_HIDE, {\n relatedTarget: this._element\n }) :\n null\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget: previous\n })\n\n if (showEvent.defaultPrevented || (hideEvent !== null && hideEvent.defaultPrevented)) {\n return\n }\n\n this._activate(this._element, listElement)\n\n const complete = () => {\n EventHandler.trigger(previous, EVENT_HIDDEN, {\n relatedTarget: this._element\n })\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget: previous\n })\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?\n SelectorEngine.find(SELECTOR_ACTIVE_UL, container) :\n SelectorEngine.children(container, SELECTOR_ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && active.classList.contains(CLASS_NAME_FADE))\n\n const complete = () => this._transitionComplete(element, active, callback)\n\n if (active && isTransitioning) {\n active.classList.remove(CLASS_NAME_SHOW)\n this._queueCallback(complete, element, true)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n active.classList.remove(CLASS_NAME_ACTIVE)\n\n const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode)\n\n if (dropdownChild) {\n dropdownChild.classList.remove(CLASS_NAME_ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n\n reflow(element)\n\n if (element.classList.contains(CLASS_NAME_FADE)) {\n element.classList.add(CLASS_NAME_SHOW)\n }\n\n let parent = element.parentNode\n if (parent && parent.nodeName === 'LI') {\n parent = parent.parentNode\n }\n\n if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n const dropdownElement = element.closest(SELECTOR_DROPDOWN)\n\n if (dropdownElement) {\n SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)\n .forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE))\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const data = Tab.getOrCreateInstance(this)\n data.show()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tab to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING)\n this._element.classList.remove(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n return config\n }\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout':\n this._hasMouseInteraction = isInteracting\n break\n case 'focusin':\n case 'focusout':\n this._hasKeyboardInteraction = isInteracting\n break\n default:\n break\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\nenableDismissTrigger(Toast)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Toast to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert'\nimport Button from './src/button'\nimport Carousel from './src/carousel'\nimport Collapse from './src/collapse'\nimport Dropdown from './src/dropdown'\nimport Modal from './src/modal'\nimport Offcanvas from './src/offcanvas'\nimport Popover from './src/popover'\nimport ScrollSpy from './src/scrollspy'\nimport Tab from './src/tab'\nimport Toast from './src/toast'\nimport Tooltip from './src/tooltip'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"]} \ No newline at end of file diff --git a/src/base/theme/bootsier/locales/en-US/bootsier.ftl b/src/base/theme/bootsier/locales/en-US/bootsier.ftl new file mode 100644 index 00000000..0e8969cd --- /dev/null +++ b/src/base/theme/bootsier/locales/en-US/bootsier.ftl @@ -0,0 +1,5 @@ +e404-description = Oops! Page Not Found +e404-message = The page you are looking for may have been removed, had its name changed, or is temporarily unavailable. +e500-description = Oops! Unexpected Error +e500-message = We're having an issue. Please report this error to an administrator. +back-homepage = Back to homepage diff --git a/src/base/theme/bootsier/locales/es-ES/bootsier.ftl b/src/base/theme/bootsier/locales/es-ES/bootsier.ftl new file mode 100644 index 00000000..998b54f2 --- /dev/null +++ b/src/base/theme/bootsier/locales/es-ES/bootsier.ftl @@ -0,0 +1,5 @@ +e404-description = ¡Vaya! Página No Encontrada +e404-message = La página que está buscando puede haber sido eliminada, cambiada de nombre o no está disponible temporalmente. +e500-description = ¡Vaya! Error Inesperado +e500-message = Está ocurriendo una incidencia. Por favor, informe de este error a un administrador. +back-homepage = Volver al inicio diff --git a/src/base/theme/bootsier/mod.rs b/src/base/theme/bootsier/mod.rs new file mode 100644 index 00000000..f0a0f61c --- /dev/null +++ b/src/base/theme/bootsier/mod.rs @@ -0,0 +1,82 @@ +use crate::prelude::*; + +include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); + +localize!("en-US", "src/base/theme/bootsier/locales"); + +pub struct BootsierTheme; + +impl Theme for BootsierTheme { + fn name(&self) -> &str { + "Bootsier" + } + + fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service(actix_web_static_files::ResourceFiles::new( + "/bootsier", + generate() + )); + } + + fn before_render_page(&self, page: &mut Page) { + page.assets() + .with_favicon( + Favicon::new() + .with_icon("/bootsier/favicon.png") + ) + .add_stylesheet( + StyleSheet::source( + "/bootsier/css/bootstrap.min.css" + ) + .with_weight(-99) + ) + .add_javascript( + JavaScript::source( + "/bootsier/js/bootstrap.bundle.min.js" + ) + .with_weight(-98) + ) + .add_jquery(); + } + + fn render_error_page(&self, mut s: server::http::StatusCode) -> server::Result<Markup> { + let mut description = "e500-description"; + let mut message = "e500-description"; + match s { + server::http::StatusCode::NOT_FOUND => { + description = "e404-description"; + message = "e404-message"; + }, + _ => { + s = server::http::StatusCode::INTERNAL_SERVER_ERROR; + } + } + Page::prepare() + .with_title(format!("Error {}", s.as_str()).as_str()) + .add_to("content", Chunck::markup(html! { + div class="jumbotron" { + div class="media" { + img + src="/bootsier/images/caution.png" + class="mr-4" + style="width: 20%; max-width: 188px" + alt="Caution!"; + div class="media-body" { + h1 class="display-4" { (s) } + p class="lead" { (l(description)) } + hr class="my-4"; + p { (l(message)) } + a + class="btn btn-primary btn-lg" + href="/" + role="button" + { + (l("back-homepage")) + } + } + } + } + })) + .render() + } +} diff --git a/src/base/theme/mod.rs b/src/base/theme/mod.rs index b272be88..8794ed17 100644 --- a/src/base/theme/mod.rs +++ b/src/base/theme/mod.rs @@ -1 +1,3 @@ +pub mod aliner; pub mod minimal; +pub mod bootsier; diff --git a/src/config/settings.rs b/src/config/settings.rs index 4d791763..b2a758e7 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -109,7 +109,7 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]*, "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", "app.language" => "en-US", - "app.theme" => "Minimal", + "app.theme" => "Bootsier", "app.startup_banner" => "Small", // [log] diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index d36c870e..2bffd73b 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -176,6 +176,7 @@ pub struct Assets { metadata : Vec<(String, String)>, stylesheets: Vec<StyleSheet>, javascripts: Vec<JavaScript>, + with_jquery: bool, seqid_count: u16, } @@ -186,6 +187,7 @@ impl Assets { metadata : Vec::new(), stylesheets: Vec::new(), javascripts: Vec::new(), + with_jquery: false, seqid_count: 0, } } @@ -222,6 +224,20 @@ impl Assets { self } + pub fn add_jquery(&mut self) -> &mut Self { + if !self.with_jquery { + self.add_javascript( + JavaScript::source( + "/assets/js/jquery.min.js?ver=3.6.0" + ) + .with_weight(i8::MIN) + .with_mode(JSMode::Normal) + ); + self.with_jquery = true; + } + self + } + pub fn render(&mut self) -> Markup { let ordered_css = &mut self.stylesheets; ordered_css.sort_by_key(|o| o.weight); diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index 713a7ae6..32e9ce92 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -1,5 +1,5 @@ pub use actix_web::{ - App, HttpRequest, HttpResponse, HttpServer, Responder, Result, web + App, HttpRequest, HttpResponse, HttpServer, Responder, Result, http, web }; mod main; diff --git a/src/core/state.rs b/src/core/state.rs index 88936bfd..307455a1 100644 --- a/src/core/state.rs +++ b/src/core/state.rs @@ -14,7 +14,9 @@ use std::collections::HashMap; pub static THEMES: Lazy<RwLock<Vec<&dyn Theme>>> = Lazy::new(|| { RwLock::new(vec![ + &base::theme::aliner::AlinerTheme, &base::theme::minimal::MinimalTheme, + &base::theme::bootsier::BootsierTheme, ]) }); @@ -24,7 +26,7 @@ pub static THEME: Lazy<&dyn Theme> = Lazy::new(|| { return *t; } } - &base::theme::minimal::MinimalTheme + &base::theme::bootsier::BootsierTheme }); pub fn register_theme(t: &'static (dyn Theme + 'static)) { diff --git a/src/core/theme/api.rs b/src/core/theme/api.rs index 26d71552..2f4a5682 100644 --- a/src/core/theme/api.rs +++ b/src/core/theme/api.rs @@ -1,6 +1,7 @@ use crate::core::server; use crate::core::theme::{Markup, html}; use crate::core::response::page::{Page, PageAssets, PageComponent}; +use crate::base::component::Chunck; /// Los temas deben implementar este "trait". pub trait Theme: Send + Sync { @@ -81,4 +82,15 @@ pub trait Theme: Send + Sync { } */ } + + fn render_error_page(&self, s: server::http::StatusCode) -> server::Result<Markup> { + Page::prepare() + .with_title(format!("Error {}", s.as_str()).as_str()) + .add_to("content", Chunck::markup(html! { + div { + h1 { (s) } + } + })) + .render() + } } From eddb397bc7cea6fa9480aab0f9873ff1de9ff18a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 22 Feb 2022 20:45:18 +0100 Subject: [PATCH 013/853] =?UTF-8?q?Actualiza=20la=20estructura=20de=20los?= =?UTF-8?q?=20recursos=20est=C3=A1ticos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se prepara PageTop para permitir en el futuro compilar los fuentes incluyendo los recursos estáticos dentro del ejecutable (tal y como está ahora), o usando una carpeta externa "static". --- CREDITS.md | 6 +- build.rs | 10 ++- src/base/theme/aliner/mod.rs | 6 +- .../theme/bootsier/assets/fonts/nunito.css | 70 ------------------ .../assets/fonts/nunito/cyrillic_400.woff2 | Bin 11248 -> 0 bytes .../assets/fonts/nunito/cyrillic_700.woff2 | Bin 11208 -> 0 bytes .../fonts/nunito/cyrillic_ext_400.woff2 | Bin 15308 -> 0 bytes .../fonts/nunito/cyrillic_ext_700.woff2 | Bin 15164 -> 0 bytes .../assets/fonts/nunito/latin_400.woff2 | Bin 18972 -> 0 bytes .../assets/fonts/nunito/latin_700.woff2 | Bin 19088 -> 0 bytes .../assets/fonts/nunito/latin_ext_400.woff2 | Bin 18380 -> 0 bytes .../assets/fonts/nunito/latin_ext_700.woff2 | Bin 18416 -> 0 bytes .../assets/fonts/nunito/vietnamese_400.woff2 | Bin 7568 -> 0 bytes .../assets/fonts/nunito/vietnamese_700.woff2 | Bin 7596 -> 0 bytes .../theme/bootsier/assets/js/bootstrap.min.js | 7 -- .../bootsier/assets/js/bootstrap.min.js.map | 1 - src/base/theme/bootsier/mod.rs | 12 +-- src/base/theme/minimal/mod.rs | 4 +- src/config/settings.rs | 30 +++----- src/core/all.rs | 7 ++ src/core/response/page/assets.rs | 2 +- .../core/server/figfonts}/slant.flf | 0 .../core/server/figfonts}/small.flf | 0 .../core/server/figfonts}/speed.flf | 0 .../core/server/figfonts}/starwars.flf | 0 src/core/server/main.rs | 10 +-- src/core/theme/api.rs | 8 +- .../assets => static/aliner}/css/styles.css | 0 .../bootsier}/css/bootstrap.min.css | 0 .../bootsier}/css/bootstrap.min.css.map | 0 .../bootsier}/images/caution.png | Bin .../bootsier}/js/bootstrap.bundle.min.js | 0 .../bootsier}/js/bootstrap.bundle.min.js.map | 0 .../assets => static/theme}/js/jquery.min.js | 0 .../assets => static/theme}/js/jquery.min.map | 0 35 files changed, 48 insertions(+), 125 deletions(-) delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito.css delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_400.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_700.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_400.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_700.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_400.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_700.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_ext_400.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/latin_ext_700.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/vietnamese_400.woff2 delete mode 100644 src/base/theme/bootsier/assets/fonts/nunito/vietnamese_700.woff2 delete mode 100644 src/base/theme/bootsier/assets/js/bootstrap.min.js delete mode 100644 src/base/theme/bootsier/assets/js/bootstrap.min.js.map rename {resources => src/core/server/figfonts}/slant.flf (100%) rename {resources => src/core/server/figfonts}/small.flf (100%) rename {resources => src/core/server/figfonts}/speed.flf (100%) rename {resources => src/core/server/figfonts}/starwars.flf (100%) rename {src/base/theme/aliner/assets => static/aliner}/css/styles.css (100%) rename {src/base/theme/bootsier/assets => static/bootsier}/css/bootstrap.min.css (100%) rename {src/base/theme/bootsier/assets => static/bootsier}/css/bootstrap.min.css.map (100%) rename {src/base/theme/bootsier/assets => static/bootsier}/images/caution.png (100%) rename {src/base/theme/bootsier/assets => static/bootsier}/js/bootstrap.bundle.min.js (100%) rename {src/base/theme/bootsier/assets => static/bootsier}/js/bootstrap.bundle.min.js.map (100%) rename {resources/assets => static/theme}/js/jquery.min.js (100%) rename {resources/assets => static/theme}/js/jquery.min.map (100%) diff --git a/CREDITS.md b/CREDITS.md index bd737e27..5b9979f4 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,9 +1,9 @@ # FIGfonts PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de -*yuanbohan* para mostrar al inicio un rótulo con el nombre de la aplicación -usando [FIGlet](http://www.figlet.org/). Las fuentes incluidas en `resources` -son: +*yuanbohan*, que muestra al inicio de la ejecución un rótulo con el nombre de +la aplicación usando caracteres [FIGlet](http://www.figlet.org/). Las fuentes +incluidas en `resources` son: * [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) por *Glenn Chappell*. diff --git a/build.rs b/build.rs index 75aee1d5..9b252213 100644 --- a/build.rs +++ b/build.rs @@ -4,28 +4,30 @@ use std::env; use std::path::Path; fn main() { - resource_dir("./resources/assets") + resource_dir("./static/theme") .with_generated_filename( Path::new(env::var("OUT_DIR").unwrap().as_str()) - .join("assets.rs") + .join("theme.rs") ) .with_generated_fn("assets") .build() .unwrap(); - resource_dir("./src/base/theme/aliner/assets") + resource_dir("./static/aliner") .with_generated_filename( Path::new(env::var("OUT_DIR").unwrap().as_str()) .join("aliner.rs") ) + .with_generated_fn("assets") .build() .unwrap(); - resource_dir("./src/base/theme/bootsier/assets") + resource_dir("./static/bootsier") .with_generated_filename( Path::new(env::var("OUT_DIR").unwrap().as_str()) .join("bootsier.rs") ) + .with_generated_fn("assets") .build() .unwrap(); } diff --git a/src/base/theme/aliner/mod.rs b/src/base/theme/aliner/mod.rs index 8ad4e291..68e7d509 100644 --- a/src/base/theme/aliner/mod.rs +++ b/src/base/theme/aliner/mod.rs @@ -5,14 +5,14 @@ include!(concat!(env!("OUT_DIR"), "/aliner.rs")); pub struct AlinerTheme; impl Theme for AlinerTheme { - fn name(&self) -> &str { - "Aliner" + fn name(&self) -> String { + "Aliner".to_string() } fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( "/aliner", - generate() + assets() )); } diff --git a/src/base/theme/bootsier/assets/fonts/nunito.css b/src/base/theme/bootsier/assets/fonts/nunito.css deleted file mode 100644 index f444a08f..00000000 --- a/src/base/theme/bootsier/assets/fonts/nunito.css +++ /dev/null @@ -1,70 +0,0 @@ -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 400; - src: url(/pagetop/fonts/nunito/cyrillic_ext_400.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 400; - src: url(/pagetop/fonts/nunito/cyrillic_400.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 400; - src: url(/pagetop/fonts/nunito/vietnamese_400.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 400; - src: url(/pagetop/fonts/nunito/latin_ext_400.woff2) format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 400; - src: url(/pagetop/fonts/nunito/latin_400.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 700; - src: url(/pagetop/fonts/nunito/cyrillic_ext_700.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 700; - src: url(/pagetop/fonts/nunito/cyrillic_700.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 700; - src: url(/pagetop/fonts/nunito/vietnamese_700.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 700; - src: url(/pagetop/fonts/nunito/latin_ext_700.woff2) format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 700; - src: url(/pagetop/fonts/nunito/latin_700.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_400.woff2 deleted file mode 100644 index cadafd359ff244c60bc4ad72a6f06d38e8e31eba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11248 zcmV<MD-YCnPew8T0RR9104wkS5dZ)H0A<_&04tCH0RR9100000000000000000000 z0000Qd>fZ69BKw&0D=$*fg}l^EfEL`^nB$X3xXm50X7081B5IDAO(aL2Z|>QfmR!` zTQzK(HaEK+G&bq-G!Yf6&5k12H~=K{8%F>C=j3DzVRbfUme)vGHnk|nlau9FNbW$$ z4m*R-D{fPALcx>xss|hu^l3DVB4gFxwClrm#dZATg-ylDVu=PC6};qo&d~cTWWkv{ zizXM6Hl10tc}44rX_NM%W*JpHBqt9gRs~%zmDlwd9(1I8|A+H_2a^<SDEgr57H8y( zr)Tv4xg#|8Nv{9jTD|vGR}TR8?DPT;EfamF<3o;7#>GWO7$8d<Yuj2P6pr*Jj_7O8 zG=KmBAfAW6clZ3+nC9ydSDa^oWI86N7SEHn_jiNYY?5#wT^Mi@HljcRu)))(R-1D{ zWP!$1Q}}rj#+?zaG#ZSXU0fHo`=r~LaDuooQT$uD!S9=<|If_MuCBN>$#>e6$6I%W zN<)51SDGRg0%Dkga5}?5#PI*m5$pc<T9zHtcF|5kiDp^H10K;8JR2IHGkoXO`6;nw z%Zb1YfrI!6eTAvdDd6^D>)2uI)NL*g>QpJvZBpFs#S4%wJS7=2U~pdf4PyyVwx`bB z^k1ViT1Pk?!H7BrXq)wkU7*AzV8O&j1Y?p;!R!SXmG8zX1bb<0a~aM>fAq3-!3r|A zC4wayiau=jU<B3BvY=yVLqTxv`F_h(a%oj(-7Hvr15)aDNhxJ!FZXytP@Y*3TOZ2* zuhYKvUdaxA2z)@UGx!&<>G$+c@5xVkdXi$x0YfH}I2njDU?($k91qIQ%yFE2#%hU5 zOfo>2zX&a1x!bi{ZMkK=Efwt+Ww$&8_o`;SWLpqI9+7>S_mfWgVC@DAR<OjSv4o|M zp=c3LeveHIp+u4PZ`*$5H?ZgJSn6U*k&Q7TwY>B9xQ?;eV=ekCFgJ-3jzhO!7KAZa z{5M*~7!d*S^CLkaL{@+lDMqSPA+?&24qZsEK4j1evSuCGvxgiyM2?*z*Ih>l1Ly!c z1R#J$hC;$w-`We?^K*L@w)t>(9X1?*+%(BMx4jM(fZ+BVqe2PRenkFrqP{f42$QHM z%k1GY+<*Rj={!f{t{HxGZ<dNfaodwUG=F^0kQXn1vfuCX>2nVk-9gL8{q20>TN~W- zBWz8`l|1PWw5W8>6U&HCJT=z5Ff0Al9W+s&D!I3D7Bs%9`{?T{{D3)QW#L_l3Q&#F z*f!!eP0sUA762DVyd`Q_NU~mqr)M252fxf{QI75@g=9R2E*$jPvX(w&x28gISpS3~ zPB*A<OtkXvacab5mYoPO3OKgth()$WFy*9`mLBT??z%N9Jk9WB9tj)vVb#N^VAwCl zR<yi;F89Af^<=k~ORvQ6@%TFanqHgr|C!4?&v;*nzuc?);Uv2BOu6Yf`+KAcC}Ygn z?^Dj0jbR}%UH}i~k5E$Itnm^iZbwH*y5<_Mqz6mf(Vt`+o(0@@e%LsF+5fPi@A=fd z-MyLD`X_$9{^={{1>lTUUj{Y9A0x#Pdg2Dx5cxwpDPWTZDViyGq}Da9{b!mTKTnTi z0jye-->JJnYar(s``q!@{zDjhY2+ryJtrMg8i>7I8W!f1iqv)YR&R4NG8g%8`M37( znN8C-ACTXDn;JaX{b^P*4UB+zXj<O`QMLPkksti|JD^nyO&)FF&ve7dpJR9zeHPEA zZ(q<)1VyHipVKla+gD%+kyf&^WHX9B-`^~*fJITgQ%Su`*}l0|sN_+to==k&A#D%! zvW|0|tjn+zqb5X5TamElSh-WDTAjPp=9(Ki5dxJq@M^G25<P=z6xoDI&=n!Upj2?{ z)9|rAFAq2Y;#`<P-zGye$bLX#FYU+<@B%CZT58?M>23tH7(xdrocl~Xlx}&zf#D#G zpl?M$Aq5xanH55bj#~^V9A_^|ZK^WZRHGUl@hVlay%eyHct?f9fOO8$mjwJ*>7a~W z{n+TiZw1tt)TtnMv|_y2OpkH2IB+wulZ@gDE+z&LBmdHJtzWCFfy#)IK}S!cL}MaW z_13vDv-<V>MFd|58ce6_2-DyMFZJ{UBCt;qfR^I(pc`^zP*{bE{!RF2jPE!?qksQ5 z1K*idLq7n}%J%@ISW|VQjezR8f21W9w$G}^!d7fGe1bo<mLpy};rM2<l~^r*VpK)` zvDu#W?S5WIELeNvx;MP_f6<bqXcJPWR)a=Os?}(gEmMJVegQ#}Fj=ZJ=`v&~RHQ_) zQe`StsZg&)t1jJo^cpZ|#HcajCaqetVcn)JyY}ojcHz>HVORPbIdtOGnSBS&O_{J_ zTatbquGxw10991VuSpBAA}{lPnm3t{7F?PL)K={mL;KuX^Lq|+B!{-5W`X?3j6vr& zznMh;FM6DE-W-bn1iVj^i+p;*-0M$Ky!}3r*e30BzL47Y36{$LDw&YptPetr;4`4^ zR;Vyr2LUNxbTDYt*daiczl4>W8ym4wa<;}+Mr+B#gz@X6pmP|<vcO**S2i@nY=ruc zM;OP|uzKn0ae+~7wd(SiO~I@5&{u~JH3&RQ2<%LrSiljgajZcW;kyI8`hHE*Sx)nW z;wD9e<mW%6=Il@hjm}qZiOSidu(YV~vrB{SvXF)$gVdFX6+yyx8FC@@UO9tCWWkbb zmZqfSLw+o~w{8cP&~XND5_mcnk(&XPz`(%Max%$`*u_bd#(gOcg*yZAcMu2FyhDUc z0#9WTlsqJqZm8Tsj1J`vMRyYqk#5Sy<SuQm9Uh-vha%=_Myw-F4W&x=?`gEiXo6Q~ zDIY>P_oN<OsC=8C2(pA8Wn&#mpyqbPP(OnzQ|+b#mirZ0a{=}8P}Uu42-!RX=M$Gk zJfx`1UMHG&YD*fd>N(+LFU5faTK_<@bzb5WDsKv&vP?BxWa(@V+dZ-rX`9Lpiy<V1 zy=!7D`qxL0O^BisFwhoF*<bn@8NNBB7&Q7zvBQYQhHjWGyABheEP|1ryn%L#xw%LU zd?QWq0y813Q?@E6F1;Eqn3<(cS|JUfTeaZRuT$f{cK!_dz8(dz_MW9rzgk8@998RW zZD?2;zcDR)9#jl-c$?BJSu?KClmo4)Af&}=-8T@PtlqO`yG?b}K3=wi9hjEcW}#!` zhXZk%SfICt(}z235UcJWg0q!W*HdQ4rZIH$b;9B%69zZ*j+jmIe{%PdEN-rE%uE2V z?KM=IZ6dfI+fRFk0}ZR&4w1Mh5E2DJs$j?z0=Yt=P#Ba7he~mvRzxSRWkThj5Jmp< z>!i{{-$x4>O0(`(Is(6&W>=;J{(R9SY}gK-y-@jQNx{btLui<UhG8_6(J&beQ_wIK z4b#vt9St+kdU7DcfQ8)bjGSfEs~r0@MVXwG4M$KlWBk(89Z`sUDA7!5xuYNK!$(+w zJ;d}ysu{*^5^gf0brW@UO0PIeH{LzN#q=Z~ZxWxAhYgH!6Y>?Ipu(!7So=;aAGPo5 zotDs5u3waV$RHomj{&AXppF9cw}+0xx?!lIwdWS0F<E<7`j`MdS{8m>@7?)xx=4Bu zvTm;1TBy2u<0Z^423W(nMR<B)^<qsY*RQGN_F>I&k)amCbV^#J_ZLPXaCAbL%qh8* zuhU=Lu36aA)wM0ROxv%a)UZQL_c@j2`_;<XPXDYl4rg8zk!6`oeuzM=oaqX>#EXi0 z8<p<MouFvAhoyrBdB!XgOF?Kw<kF3pN-kI{0k0lHNkZ5|nRJ~{rf+Vk6hg#Sv4WTm zckU|7qG;^q9%!R9if*}$wMG}32={rHdKokZV`&L3hu4TG5*zXH*DiW57ESh0v@9R; zZpEI8&o@^70;gb`c^}6rp*kue$y;|a9m2UM8N6>1UD;Nrt@`lua2UPXb=VG{bPXtu z1~Y3xNmOa3DfTRDVcjeg?1>nlE{e7Ev@79b1>K~#oo<&`8Kl=c{<G`RG$YA+Hu#YK zhxjmwDJPo8K6=nQA*M@fbeho6iKDG3qLGnznp>lmA!!U1V3WP-_uh&CH?PZ8`Sr{+ zFKj`BULq8DvsELC4rtpP)+Uu+_BC9z<+a11Beb2fI<R&KB1Lo*;MQQ!Q-EI&kugv} zScAbxksaeh2=D<D6{NKo%v6v!KoAQRl(iVFR8~DEib_K>XlpRoDWI>1C^#r!tij-< zkXOD?P;M-Tdo2bZD)}Uo;7bMXS`2<vOTTy@RtA*6ACaFK0yDDKqI8xaXRbF6wt+2( z>K;Tm+5t(YSH*+CDINw+<q=^=JPw@ViGHl&G)UrXt31Q=z!_cy&hRpDhF2j1*MbDs zgCuT1<vHFAoa3#)Io=MO<DC$JyFr3`LF&1Wfp%e=fns~*LuB_!V~FmyMb$^>9*$^D z26&LDVVk#hk4ktS1n<pR(R<>DXx)UGnIz@~Z33B|tF>C=iFDJX-1i6%kTz{h6&}W? zYS3~*R9S6@c`QZ`*JGir4@q6y&}UhQh0ZHm9)km?z7OvF6eXyi<P+CfTd!=z_MaJ@ zfha%JmB?kj79LZGPmLW<A2IGIwfX^iKj0buS4#gP6;P()#HF1kd**2z@*MwK1~jxa zW&;lKxf$B_=0>^{pTyH|OnEpGRF8+G2KtHiAMygN%MCXQPew2Lz@N1~lYQGJu*`<8 z;i6$gO)>`F&So?M&o1yC)Vh6>&+GO{9LfR+c;^3G%J*Ys4S+8&eg;kd2Y&!R!`cW4 zptGkpW55!T@zwug)Ks0Rfdc(P_dMqntNb4|*guYi_blh_Sk8Y?@_qp8WSu`YKvt`I zUpv2q-YVcvrP(^MoS#b*H)xbp{E04tLADt`IqoPeDVfR#brkU3O37a?Nn4n>a^2lD zZBoSpu3UbOSNwDuN?Gtng|tF6#aEemlNdcpnH}mxAaX?(m6+#T;zUa;6X~Wj9;f2F zvE|z6NB;PmX-_Vfl-J7FDQr~u%SagTTERRd{#ubV%%R(dv0;M6^$8M28e0T?2)TA$ z54mNPh;6roFBYt^!&qaN0Gqs8E_I-OF~sMR3^4M5cS$K}11LF(8LYse)8o*K$<ue{ zYYShD?w(qMO-QX(kktwW{PcOK)GgPo`2Bzfi8idu5M}o=!3;aZR4J8aDMCPZ%8-94 z80~L8VB*#<T4hWqC1CfK9V?U$DjqImG2x?9vvuUsDQ}cst+ojodsS~;9KXRSYNQ_U zeVS5!2<=*wmPjx~MmhqlZ3jc&D&pcyzS#A&Z$u9$(GXZKt{FCjwcdWONJWbk_ZH%h zsh!kv&eZ-=WkhAsz&WN07G_1UyHvN(lwl&7UCOe+xy}Gk&Lg0yM;}o-8R-V-_f@pk zy7Lz!F8yNc-|{10JDX)awZ6arH0@2){?<caxlxXFu9*6DkLk@NeCc4x<b_$7k5cM_ zMBCLEW%kdelc0*q^w2<PrHc`N{yv$M@&Pt^u~PZcJK?+=hFrjA>rzT<b?HBtoW>sj z`>}09*vzg*6Z5NqE=z6?&?f{q4@Mjz;r!J}*_O3v>^`}QH59>KHl$@rhk2AnTGkS* z)k4UjyPjT1WFg8`v*i@(5cfaBJ4#<qe(QzM&mOu*O1|Zg(Y3{Gf05Ll?^_ec5Sb6h zNPn%ApG8%Cnd%MIr7G-&-<4Y-az$er=@!jIK);V1IMA{~!OqP9^DT$Yvb`OsP%5Z% z-s9nI8?0X2(mQKZiht!9<4*iEOlPCNqt0MCcq~CzETidNDJY823ifDz2ut?624ktw zXu&HL1Ug<Dg1b>411XO=l1xfHoSpN4S^%yRvWMp-mc!suahUQzU5)O#p$SH(1?lw| ziU3^PG1z`A-%jxJrw_EYop%GO5$l<~iM#(>KDn!y{B?&ug1kL&aV8jKY2kM+%U#<N zCx{S$wi_c3MeW|<6CEolh=PQ<xVnx{Iz%yTIS8=$1m%Aqlw&4BY=kg+F2YU(@cizy znWiDjg0cU^)YT($XucVd!a%NS?2Q6Fc0n>waTj;=E8WppIl|`Oh^IP+DMp=7ym;)+ zkyw<WnRVUL?Y3{rMP~lG?w~v^8ucxJ$mS}$p}11huXIYlwJ9IsQ8U6I`ylfS&RfA% zQ&uW{rJc*nhkxtTeioFsTo<88$@9<;|2uJd#3)YnW%?-~aiTaY;HGl1w8NqLdo@2q z!sbVgSI82)sf$eIKHmB*;M+1g82f@)&tO2oB?#AJWkJ!}hnTVg0t!-b|DJs9WW7w^ z$1R4eh9JZ6Ze4G!^Lxnr*pQtp`_#)7zO|O;Axu~?=lN`5tY}`reTvZwAhM&hi|W6Z zEjqLI4+!cE;FrLi%ZucdOaE+)Vcsa>!{8Az80*aEA`bdU++)FnI{^)pkJ?}SsQmPF z=yxk;T_%6E23!|D8t9Zz+|4aH4MPE(QR~9(p%6Bfxk70Epeg!}MR%7r4PA0<XCQjb z;y2P|(mB$wFgb@0XYr_CmzlDGvJ@|>B^8YT90+4pMGNlcjV0DaV?SLcCWF0B9<pu$ zSlF1yc)1Q~rP1=v;;WVA=`#NS3FkUDj+0uICBNHtVn=P=juS!G2Ai4&ulaZ2@|7~7 zN+A!V>_vXCoYZJ6`h3A9oRw2ix304bHeQhv>F0d@NzjWSIT;=_uarb2kt7R&r-r~E zk{m_@fM8V^5)(FKHiUg$iXX#c)Ea_Q=ybr1XJK;x-91vO?|l?O&<C=F^f-P0dH{qQ zV9<hEuk%FvNxh3D<vWp%9=JEY;<=gGSMS3yeb~DmmpKqGRLSK6)qpH3dq5@}q+yX7 zzE);rQO$;~uA22l@|^DKtl3B#^M6PsDEg|na%FB#<*MTIi&)Ol;a>)ZkJ9{ck@duz znv_c$jZWn_vlFEpU+RM>vpky=>*Pd!2s@?3haa+nIQ=L8xAji-Qb!+AN@Sqt7{?^f zHrpmWHYy-Eq0|ee0thC(2a-vkEl47R_oNtE0620#JYxPv*5}$g`kw?&0H~t_SO0hN zW99>fqoe=4?Yu3DAOJ!|o`&249G%d4yGwTdjt&ctp0Xh-<sr^n2-3n(=E{1fRc?e} zkVOi&T!t&`?0!5VwT4m?lQPUv3WR#0La*Au=omJhAW1gkx*;tbM_g1vFsoQlTGzUY zEU^1xTyvT_By!|SQWIp7Y`&vth&oNue9`S-5LeRHUK$-xoFB}~lGn=#q-fn3nN;W= zX0f>Ho}R!U(b4xPPZS66Af2diiC+l-qXvOQJf0XB0Ko_ppmN9K-BoLAq|_yQPMM%E zf*Npz{$aux-g`8xB$4Uu#bkPUGtyw{CJaWfO;k~dULN%-Zvab<&iH{-BW=<%lk0aI zL15%+a$+3A78j8h#8L<ZNXndu@cf*>+2XOelJvwRNg9_YPD@G@r_)M~z=#xq5QGse z^Y#l(4`e8W0^D4BP$*0075xNJzVAVt288~+2fxA56733{bd-L1kyd2CO=K5wXQFkD zQw}Fz6o-lIJ{w2X*zH?*))q1=$~@8PduSjdtbh*-^liMs?H81@ptp^Me@~;jN!{ab zZcBue2X|bs^R{)i>)F@6uR8#lJ!1d9EwF2L*Lrtnm+R{l8x%#ZmiF)3es;_>a@bV0 zkn_pu?|+q7Wn^ZC;$ZHz!KQ}6Yu=M8#xVJGnina>+<#6@SPeu0p$!-oD8*pr5Cz(V zAkGZ7*T17(G+H%{Ch|v-O-;VNb;3GG{B*T1qe4afE&m~aU@lTtG~;soktWTbSCpxz zeG1~74_Zw1?pYi>ho;-32!z^aoI?i}_w-K5U3<egE%QR<l|MC2hVSi_r9Qqg7tF^O zCu)Xfp7VbjHHr<c&q(BO>IeHNL?WerM|EIqSR6CcdArfrMgFseS|Yoqra<N&DDjRm zd*8gmzX~8>wJ-$24qL!&PUh}#JwkzyOA6X*3<+mdd;gzfUwa-MT-;lunzcB=;V3zP zXed5;YBqpkQii$%o)wiUHFtN2m^LDEy7e!)V>DV7ji%6(sUX(NjX;`B6@J^u-vN8t zT+E=&(YxOE=JdM7?n_-OEG+C&FL5i9-N>UZD2nN1^+!f`r1Xz$->3tkD1w5z8)&#c zMLLSU$Shq9HC<`;s~IQL*EfG@QAO45yXL=|=ag{KQcm3V>PY~K0ryfZJ=*#P2Fl~w zgo={v!Ypc>B@@KZC^y*WuVE0X_hw2(1bUeMasF0F()uR^wIFcDWQe0|vFVxWlIm&a z90b_{B~%Sj))6<a%ep@4W*up>zT;dCx4BmaUZDXrn&9Bt{QJ~lbW1_MLUEIOx&1Pu zXT`yia==c+Mel7@w>K+cw*rc~1DX|=slVL$h3a4{GzAotHyYKS4%qPZx8>DPz3OKg z&2|ireU4_JOilv&nGTW@?-~m~op-K}b@q|hHsMObKoSuQ18VBp6pT2RdY92lY0vks zA~GCs!E(~fi?q2}lg2n_Mp13MK{b~`BvClHlJcfi-U;{`>V+q%8oh0DVBUZ%S}h-; zECaeHcyTYq(xbg^U|<!WN19)fQ<z1KwPX;mpgLSqhe)(mKW8f*)Bc9C*#=~Z`r8Ca z8ND*TN-pQC`r^|fSC((+>MCEqaz(}ZuFi^$A+7*|0p(u13+30;pRerQpRz|YDK?AG z5@%Kx6hEiY6qr%bVXMQVo!zX^WA=8G+^nQH92gR|EH=3~dwFi^uLKO;Uq2Xc<<a#E zoL087I?~Vux1z4EBYJh|`clGbII*a?dNU%n6)R$N(i2!gA!z}ORndHwA~z_K9U)3h zkcra5!$m1Ese*K$Y7||AqGzQNb_h7epQllSlOkfrthUk}K#DzmYvqWy9|HS%kN8&t z2vtd^8&cfdDUTbe?msi{#epOen13>Vm10YSI@jD<7&ftXZAs0T%x`15f&#;}Ev7iD zKMM@F^dskNO0;Vas{?@1*%0Jqm#}5v(bk;<5#?L<Y-&)Sj7~pua@}#kXd=lS6)KNk zKO^U#lw+IrY;g-4H}AeXp#K@{e1(L}qH%9=i41!%KyPNn2eCCA^(PEPc*;lwJV}6o zWJ+NO9B!dgJEQ9_pe|2IiU_5Q^XCI;p#=i}Qh-7ogeeqQW|&<qw4z|DZ#y)~E)YSL z0D^8u5f~j!8XJ-uhc<4j+4F1NKPW%OKL_AXL-V=de5by^1Q?jOm}D4-L|T-@3+Z%y zI(;4LUILIIHAc4bSTRALps(<-Bx7obOolj0y@+{Zllcgx9tZLs%~GYi__*Qt?jfp? z)3b)ND7B`09i7g9H~QD@nt^7N{LjGVHK4m2SZ)HLoc5~s2#o#b7)qlvg+Z7?P@2{u zrZdkGz*kdW&Zp8v=^dpdX`R)M9R9^ly<-NXB_{`_F&Kd#_1TOd5yWY}J^!@0eE^K9 zilXwfGIJ6b%U>2592!oRtB%-X!X228T_=f>U5%ofsmYeFE$=2dChI6Me^x;dT=pO^ zqd&~e&O<+U8a<h=_w^EqC%1iA0EpL&NvtC~V}I^Nk1{1qyfi8^HgSz#59^JO_kYLE zX>%xAQ%iAoqo^^oWld^o16+;&y#lL;(R&dUfKipQ+n%xqnm9|K4Q!fQZpeirEK02i zdS*iprb0&Q5Qf$myT3m$emRl6?Hg7PV!XDVHMf}PFp5qZ&Y}tIZa+4@eSY0V?zp9e z!G6Vp(#F<eOy;!S)o0S>0LL0H<|i1i{~+TD<Ub4q%VMMOZ0i}Sie!30=D?W4DevQW z-o<CyWrqFEN5#ehg5N0wJmq(QBa#VS*;eOVCcSBQrB0~4zO_`qDlQCWJi=vHRU71` z&!VuDBz*Sq4C9PSMfyT&6X9&0I6W~*oW@%UeaAzF0SMX@0q2^sveb+F_6&H44`j%G z4~q;4ix(zLV(3=uu!EY0!wmrnjH+NsCn>!h8};vlF}(NO-~f)Ouw|dco)-eU3W2Th zukrD<J#av~Pc5W#OMG;WAV_vH+1;Hio!+q|y3IPpMnwiKeXnh1P)3=elx&2_I=v-i zSqzW2OcD|jBjNF4Vi-5o5K@bh%{7TFWIGso6gWC}bLXvFKzroLb>y*+&m#m`U@#V! zp2fSk;Gem^X1gZIQatG%v5NkW@Q8a$_aR`}TeffBcA#;Yx<PLWaKrkh_2l$xHlFX> zydBVQA$oey^;L8aT9Pq_k-UU`^YZfWB<T2P=T+}cke}HX-?;79VIcmh?i&8JFTQc# z8F|4m;Pd$;o>>&_rt#!U$I(zK2!>Ke9bZlw-=vvECGn7%C2n|vTY(z^??#|7<C)T} zm9lvvUo0l_=Ve1BDHU-H!soy=X8Wq<A=w=Blb078qRh#LidT)MG6^G05CSZ7-zre4 z4`7Lbuaa9F2`6nqDymfZ#rJTH;2kynLmw*+-gB~isS#3hRh6n%)v2O1Y=ildTP2N3 z)k~FKRW;s8qpFrB3$(-ZJw)>vvl?(U+yy-IA_97W<n6qyQmyJ>-7T($4&GG9KJ*cC z@RmL4s}>Pl+OE1)i}ZPSmOV%Vl<HMIXir|_C|BJ)H7?<lwhcH=DFPOspZ+O^XTLw- z?YDgaaOIaA>r4@t7&mjsKwfhi8E>@j44yOK5N(5fPH&Y8XX-yCUnDs3^JAzMY7{|o z@@(eK#)O=P@@l_hs<42*>MC&qQK(1HKuDMg2&=)Y0s7_wz^e#GSQ=e`D1)iGnE+eX zT%9+FUEl6%;eq2@ra44&)ZXzqr<5k+i>*<S=;{|s<OT00&Xl`4$(#4{N`n}thG|JK zoS3Z-<@%Mq)d@e8m4E8=IVYPBboQ57$Q%+k<!UeX>M0fgD!@I0loN#Tl|kVnD0(np z;AP4-&+7zsKfOdh0^Z$F3BWx(q+*BBI~fB43Yge9uP-GG!Uh3q5_(wq3h?>{(s1Jd z+`vPs2^3ixhn5o<(%jJ+o0pw`%`^{pMhK#Npw)t-rIuRDgQS95j}Q5N*9!Lwtw!zS zxM)l$wvKcVp5osli$24G?K<Bpk_TfuZX*w_RW27S^lN<eXZPxtRRfWGO>+_Mw4+?Z zst)UoI}(!<YyS^YsEF7(uaC=6U?UqO0S&)P;{se+nak>(j91iDvw0_=D#ike$TYmH zQdVqNxz5uSdoDVjE<?a_ews_^%ZOonwAwJfNTp+8$UMmy&JyWjq2<YHrHaU_rTzMb zF?Yk@7!-;WY+_1{M+}fnivme0M)rQZBBz{wbf;acxOMyuOb$zyEUHfaV+*OX0bqeX zAVfP@_cn(RaA!UEU;E+!!6|KcJU*_=G~US~qNiR=q3P{Sk~oZV7#eDxx?X?)_*_By zh*^h#Z==j0sQg)zH+t`nJFiG7b-opA1cAfGkU+X{fc5SMCV7YDdmG=P&2U{NFSG+# zh0c18baW>X3M=M}-B`IU_lz9AhoE4MdJAs!x2qM7!nUw1G{xYIKAe;iIEZ=nUA+Z2 zUed1KB!2O_&>KY41V>4W+(FmFD%R|KX;Z|jk#RE4>fZL=Mh>#T1{K%|ov50bExmi2 zhT)F4lY&5gI%Gp&r0c#algx0>>FsT#4aT7-aHg~CeMlb2;GP~Ys`b9HqH2EY5!tGH z%AJTZ;QWw65>u|FrlDjfUfE@MwnjmAy(PnWbJdm&s?@B(6+Wj1<8qW!sz;Z!O6;d2 zz)5S;lv@zPo)N_8ZA6#BEM%aK6-ugv^a#Mrv{v=`l_7p?ejUBGYn*C=RT*6;GHU0! zp`b$W6TeI<aOVYJ-#OnHTj6IhTcXGkyT@M8i$J6K<!6Yr*Fc1qWkQDvbJG|-cQDC$ z8d<&b3S8*&G<OIbt=n_sC^ZEm9c-&9?>#Dr@!~QJq_nZ2r~1k#nAhqG55=Q(Nh+}u z3^I(Aw7Tv@DJ6w0ov=1fmV__kI&8x9L=+K&V0wHVP|?!`N--9X;=^Pl1`?dZs2e@X zb0h8gau9zsO_8zv=#K0HJq|u;*Zz2@D+nHB9G2tKHPu|tSsGYrrBP6nRQhFp2(c)s zqW4?~%)t;@gOnj+%J*WhtYi#h>?W;3N|0sFoTe>d9Qqqr5LBWN#HhN-C{ZtD)-z{n ziz%Kg5(H*|&OTXUVmNOqV?>6Y%S&!v;nZf1zlm{x*eXKHV1Xi_D+cB=S)hPWocJ4X z@}47G-U$eZia8nUf#?J%QL@2x{G|&X0fA4s;)J0gBYb`U#Y$j7yf<z`k*g;;>fsg2 zwV|hPA^`f@h-!_m?V4(}Jc>nuqHfC8tQTE}l%X@Spm<SBO*W(?P!c_+fL3*!6Sg?= zXl;E6f(8fxYUGzeFeEL`vn14RK%G``{j)Oc)H#O;CJ<Fw!U&FpF7GpZSc&wZg)Zfq zNBNPx*+aJs0h0y^2I7OFi#FOp@6~=U2^r|}o_Z&9eFqHC*8x2`YPTY86@feMWIB4Y zQpTL}P#vN`t9~e0{AAgx&lQBq#tBNwHXm0~M0X202X$qagcOz-$@+4DD6WJZNP`B_ zD1&3BUTen@?OJXYFuD=reOm|W#3ZKhkRBR;(!U`8`3z#csHn_Sa%E+3k=KWcxtv2= z0UO@Dyh#Nmm7UD(d7AlgZpIZ~&aelFl26xl2}F*Jl3+#k(stc%n1TzXw&_&ES||UX z7Ym(}<_O<#sL16?O0d%5;(pKLO<m?`@~U6bOYEC|{)m)$9GLygW$~Xkm@W+vup*Br zfA?!{nAq5)s*Y`q8D+)qKmvLCby<GT6v#8G{m47Bl@X?fB>wve<oEfmixegvZG<L4 zPr3-7kvBPGT|IWEj(T%_<$y0Q(+I(<{N>$~cMneEWx6y~mIUU3v}2$loz6H2WPW$R zmY^(HxJz3p!gLb9HP%+|H3~oa7_{|9)Igs3TNEw1Gd4rbVCDxSq57%oMT$#hfdWD? zVga(DFjdW!x9?Ztm|pe%79KUv)V-Q#c>CTvseS@P)>+XYRE)t*mgst6G|#%Xj90vL z_rQQ&>TilsQI<@b+>buDVkvd{uRkD@JiV+J?9TR8Of+TF$?PFYe<aoW6vxHsWv|NB z*PBnp<gmo+(4ynwOz4Wrn^(P;sit~Lqh+qj&4Ud9A=@cYWeAhZHz33g9r;ez@Or*G zFC5MepY_Nm$fp6wAOi8DF)O%pX9|gi7Pl>pjf!)8zqF9Wb%>HQ6MRGn$FJB^CMlB4 z9qeqeTSd=)NsX?TF5}=!;zj)OdU<s|{?|}d6%!jJd%x!t9>)s_`J2Mt9j^xr3BXn% zaTmfA5Z@L<_~W!#EZ(cr=HuaupRV!p`5(@GgLI`rL<`W;Lg5Kj3q?ouUlpfK2u}%s zw3r!~XuXWGmR1i4#ILEGs5kI6uun!Xso(MrZh|3GoPGy6LP#O44j9T}pI<W&`!CHr z@c)?iFIw<*e46CN!T;&_{@?M(i(<QA4_JZ$V8Bloi7eh!p^{ek4{N_$z&n3{KMx&7 z78OB>DCQTa9_^uA7b;^YKV_`i_dFs=^n1E-ODvk~kw4d=#|CcC@-<Hh$>#HmXG4V@ zMbJ9;@Q5iX(ZL=D*0N9~c%7;d=CB;HI)_6VE#e{PD%g~GgaIW=k<r2rP8D@ZEzyd_ zIZ^?qG=~o1UwZ}?Tph3(9@Y}+a=%x)r~viC2RG&;tpXiw{<Ug^L<b);vK_xJrIa^4 z{{?2~h%+TwLOdioXXgBfi17wbe4JWhop+EDS>q5i>kGynWf9RpeNo%?By`Om_{=fC z#{`dx)EUONCo?c5k<wWLI4oc2C~~#pPwBcG94+pi7clU?KJy%V{(_t12Ns<Rr$nl) zk2_OFlWzjp$CoVlG61Z$$QOI;x`nkLpfah($c;z@c%qlmG!Y{k_6o4y-v-A3D)R(X z)c{@teKXN{?PkW{otp(QU){|4{C2abKbo5re3?8q28o=a#)eHtwk=t(XqO}=A}T@B zE8tvTyFKd)v8%3^bdn;LD{=-es;XjFDK_N(9g;LZB#BKHFP8f(7hJ`nu5Vh7nIzXL zNf8^dZ`GXnRjg~oj$FDPY-D<9(XA8<F1~6i_Q&POrz%QRq9cns;?rfa9sIWGNur-o z`f`cLNXfgD_$22|F%=t0E|H}m_7(9Qg&AWa&xYCYS#x~s>14P_`YgF)CJJ&>1err5 zzA6WCdy-ro>a}7H{Mi5ZlKs!00AxQ9L$VZUGG)mY5fhiMK#5Yd>NQ3{tDj)%)}!Bu z(eDz)q8T<9hnt6&kDq2(flwrtNM&+`Ql-{tb$Wx*R3AZL2o#2jhR%a0FW!7GFfHMW z#gD%Lfr11J!N%h71R{w{q0;CKCX3DC^7sOwNGy@c<O-!qt<mcA2BXQ<&E3P(%iG7- z&up>U?2eAzZO`q`@!M`{Te%;XB8eJ>sx>5v3&#xx5#cVgLt_l;<!Q`8+*X(Y`9kBn zYEh_K(9Kt+6?AC?t?=(Qmrw*QXb1lYlaH3VVFkVXpwV(x4_Cx^p2rUlE311NA;p`B z3gQ%Y#u7k81OgEeF*AdinHkIs01N=kC|A^Ip2p`Y7ESxt@fh2G0rzt5UsAhKxBI=_ zQtE88|5k0eulIuiz1Xf^b5ggSJI%AUI6u<9kLUF!bksCoe}R@0es9wIq~BZm2^$~$ z`ab&VD?*=p(aL!CP0<;R(3}Tg@6hWTz4V4tDHYMtT0;Bu{-pYAE#^u+GyHpr2yLh= zuTYK)`0xQWAT(L$*{Am^{|=g!*;-opnJUv~5ZwFzY5wR7)p>*Ku4mrenH~OIsk17n ax^!^s)asj|cl@`}rFsASFY(Yp?G6B4bx>*m diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_700.woff2 deleted file mode 100644 index 2b4950ff24895b57fc66398bad2f892916d8bb00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11208 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 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_400.woff2 deleted file mode 100644 index 5539f2e13a28cb3ebe3d732580615fc471225e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15308 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 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/cyrillic_ext_700.woff2 deleted file mode 100644 index 9f49fc13de796acbfb3b31845fc87ef947b18ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15164 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 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_400.woff2 deleted file mode 100644 index 2f9cc5964455b8f5ca989db989250dbebb1a5f66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18972 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 H?T~5}mj8_i diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_700.woff2 deleted file mode 100644 index 243810e4594c4c858d043e9dd3562bfd3b1adeff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19088 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 Tc<SUY`Kt13Q$5xzdK&-${v60d diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_400.woff2 deleted file mode 100644 index d859e4d3ceba36192ab6b0ac4e6e2e8ed21795d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18380 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 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/latin_ext_700.woff2 deleted file mode 100644 index 0f95acbcdd781cc2ffa1cb7ded7fe637b59a61d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18416 zcmV)TK(W7fPew8T0RR9107viu5dZ)H0JanW07r}f0RR9100000000000000000000 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 XMu&d5c*nl`nZ5LXaGxZcodEy<7R<vu diff --git a/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_400.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_400.woff2 deleted file mode 100644 index 29df398069da61aee853e79efc918a5da50cfdf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7568 zcmV;B9dF`yPew8T0RR9103DD35dZ)H07@hP039y?0RR9100000000000000000000 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 diff --git a/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_700.woff2 b/src/base/theme/bootsier/assets/fonts/nunito/vietnamese_700.woff2 deleted file mode 100644 index efcc26dc5c69f23564e2cdbdf101e7fdf1e5ee79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7596 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 O#wJ^t_sl^H8{Ggk@tke| diff --git a/src/base/theme/bootsier/assets/js/bootstrap.min.js b/src/base/theme/bootsier/assets/js/bootstrap.min.js deleted file mode 100644 index d155068c..00000000 --- a/src/base/theme/bootsier/assets/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){if(t&&t.__esModule)return t;const e=Object.create(null);if(t)for(const i in t)if("default"!==i){const s=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const i=e(t),s="transitionend",n=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},o=t=>{const e=n(t);return e&&document.querySelector(e)?e:null},r=t=>{const e=n(t);return e?document.querySelector(e):null},a=t=>{t.dispatchEvent(new Event(s))},l=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),c=t=>l(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,h=(t,e,i)=>{Object.keys(i).forEach((s=>{const n=i[s],o=e[s],r=o&&l(o)?"element":null==(a=o)?`${a}`:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(n).test(r))throw new TypeError(`${t.toUpperCase()}: Option "${s}" provided type "${r}" but expected type "${n}".`)}))},d=t=>!(!l(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),u=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),g=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?g(t.parentNode):null},_=()=>{},f=t=>{t.offsetHeight},p=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},m=[],b=()=>"rtl"===document.documentElement.dir,v=t=>{var e;e=()=>{const e=p();if(e){const i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}},"loading"===document.readyState?(m.length||document.addEventListener("DOMContentLoaded",(()=>{m.forEach((t=>t()))})),m.push(e)):e()},y=t=>{"function"==typeof t&&t()},E=(t,e,i=!0)=>{if(!i)return void y(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const s=Number.parseFloat(e),n=Number.parseFloat(i);return s||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let o=!1;const r=({target:i})=>{i===e&&(o=!0,e.removeEventListener(s,r),y(t))};e.addEventListener(s,r),setTimeout((()=>{o||a(e)}),n)},w=(t,e,i,s)=>{let n=t.indexOf(e);if(-1===n)return t[!i&&s?t.length-1:0];const o=t.length;return n+=i?1:-1,s&&(n=(n+o)%o),t[Math.max(0,Math.min(n,o-1))]},A=/[^.]*(?=\..*)\.|.*/,T=/\..*/,C=/::\d+$/,k={};let L=1;const S={mouseenter:"mouseover",mouseleave:"mouseout"},O=/^(mouseenter|mouseleave)/i,N=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"]);function D(t,e){return e&&`${e}::${L++}`||t.uidEvent||L++}function I(t){const e=D(t);return t.uidEvent=e,k[e]=k[e]||{},k[e]}function P(t,e,i=null){const s=Object.keys(t);for(let n=0,o=s.length;n<o;n++){const o=t[s[n]];if(o.originalHandler===e&&o.delegationSelector===i)return o}return null}function x(t,e,i){const s="string"==typeof e,n=s?i:e;let o=H(t);return N.has(o)||(o=t),[s,n,o]}function M(t,e,i,s,n){if("string"!=typeof e||!t)return;if(i||(i=s,s=null),O.test(e)){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};s?s=t(s):i=t(i)}const[o,r,a]=x(e,i,s),l=I(t),c=l[a]||(l[a]={}),h=P(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=D(r,e.replace(A,"")),u=o?function(t,e,i){return function s(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return n.delegateTarget=r,s.oneOff&&$.off(t,n.type,e,i),i.apply(r,[n]);return null}}(t,i,s):function(t,e){return function i(s){return s.delegateTarget=t,i.oneOff&&$.off(t,s.type,e),e.apply(t,[s])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function j(t,e,i,s,n){const o=P(e[i],s,n);o&&(t.removeEventListener(i,o,Boolean(n)),delete e[i][o.uidEvent])}function H(t){return t=t.replace(T,""),S[t]||t}const $={on(t,e,i,s){M(t,e,i,s,!1)},one(t,e,i,s){M(t,e,i,s,!0)},off(t,e,i,s){if("string"!=typeof e||!t)return;const[n,o,r]=x(e,i,s),a=r!==e,l=I(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void j(t,l,r,o,n?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,s){const n=e[i]||{};Object.keys(n).forEach((o=>{if(o.includes(s)){const s=n[o];j(t,e,i,s.originalHandler,s.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const s=i.replace(C,"");if(!a||e.includes(s)){const e=h[i];j(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const s=p(),n=H(e),o=e!==n,r=N.has(n);let a,l=!0,c=!0,h=!1,d=null;return o&&s&&(a=s.Event(e,i),s(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(n,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},B=new Map,z={set(t,e,i){B.has(t)||B.set(t,new Map);const s=B.get(t);s.has(e)||0===s.size?s.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(t,e)=>B.has(t)&&B.get(t).get(e)||null,remove(t,e){if(!B.has(t))return;const i=B.get(t);i.delete(e),0===i.size&&B.delete(t)}};class R{constructor(t){(t=c(t))&&(this._element=t,z.set(this._element,this.constructor.DATA_KEY,this))}dispose(){z.remove(this._element,this.constructor.DATA_KEY),$.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){E(t,e,i)}static getInstance(t){return z.get(c(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const F=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;$.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),u(this))return;const n=r(this)||this.closest(`.${s}`);t.getOrCreateInstance(n)[e]()}))};class q extends R{static get NAME(){return"alert"}close(){if($.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),$.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}F(q,"close"),v(q);const W='[data-bs-toggle="button"]';class U extends R{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=U.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function K(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function V(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}$.on(document,"click.bs.button.data-api",W,(t=>{t.preventDefault();const e=t.target.closest(W);U.getOrCreateInstance(e).toggle()})),v(U);const X={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${V(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${V(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let s=i.replace(/^bs/,"");s=s.charAt(0).toLowerCase()+s.slice(1,s.length),e[s]=K(t.dataset[i])})),e},getDataAttribute:(t,e)=>K(t.getAttribute(`data-bs-${V(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},Y={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let s=t.parentNode;for(;s&&s.nodeType===Node.ELEMENT_NODE&&3!==s.nodeType;)s.matches(e)&&i.push(s),s=s.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!u(t)&&d(t)))}},Q="carousel",G={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Z={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},J="next",tt="prev",et="left",it="right",st={ArrowLeft:it,ArrowRight:et},nt="slid.bs.carousel",ot="active",rt=".active.carousel-item";class at extends R{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=Y.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return G}static get NAME(){return Q}next(){this._slide(J)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(tt)}pause(t){t||(this._isPaused=!0),Y.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(a(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=Y.findOne(rt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void $.one(this._element,nt,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?J:tt;this._slide(i,this._items[t])}_getConfig(t){return t={...G,...X.getDataAttributes(this._element),..."object"==typeof t?t:{}},h(Q,t,Z),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?it:et)}_addEventListeners(){this._config.keyboard&&$.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&($.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),$.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},s=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};Y.find(".carousel-item img",this._element).forEach((t=>{$.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?($.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),$.on(this._element,"pointerup.bs.carousel",(t=>s(t))),this._element.classList.add("pointer-event")):($.on(this._element,"touchstart.bs.carousel",(t=>e(t))),$.on(this._element,"touchmove.bs.carousel",(t=>i(t))),$.on(this._element,"touchend.bs.carousel",(t=>s(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=st[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?Y.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===J;return w(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),s=this._getItemIndex(Y.findOne(rt,this._element));return $.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:s,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=Y.findOne(".active",this._indicatorsElement);e.classList.remove(ot),e.removeAttribute("aria-current");const i=Y.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e<i.length;e++)if(Number.parseInt(i[e].getAttribute("data-bs-slide-to"),10)===this._getItemIndex(t)){i[e].classList.add(ot),i[e].setAttribute("aria-current","true");break}}}_updateInterval(){const t=this._activeElement||Y.findOne(rt,this._element);if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}_slide(t,e){const i=this._directionToOrder(t),s=Y.findOne(rt,this._element),n=this._getItemIndex(s),o=e||this._getItemByOrder(i,s),r=this._getItemIndex(o),a=Boolean(this._interval),l=i===J,c=l?"carousel-item-start":"carousel-item-end",h=l?"carousel-item-next":"carousel-item-prev",d=this._orderToDirection(i);if(o&&o.classList.contains(ot))return void(this._isSliding=!1);if(this._isSliding)return;if(this._triggerSlideEvent(o,d).defaultPrevented)return;if(!s||!o)return;this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(o),this._activeElement=o;const u=()=>{$.trigger(this._element,nt,{relatedTarget:o,direction:d,from:n,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),f(o),s.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(ot),s.classList.remove(ot,h,c),this._isSliding=!1,setTimeout(u,0)};this._queueCallback(t,s,!0)}else s.classList.remove(ot),o.classList.add(ot),this._isSliding=!1,u();a&&this.cycle()}_directionToOrder(t){return[it,et].includes(t)?b()?t===et?tt:J:t===et?J:tt:t}_orderToDirection(t){return[J,tt].includes(t)?b()?t===tt?et:it:t===tt?it:et:t}static carouselInterface(t,e){const i=at.getOrCreateInstance(t,e);let{_config:s}=i;"object"==typeof e&&(s={...s,...e});const n="string"==typeof e?e:s.slide;if("number"==typeof e)i.to(e);else if("string"==typeof n){if(void 0===i[n])throw new TypeError(`No method named "${n}"`);i[n]()}else s.interval&&s.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){at.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=r(this);if(!e||!e.classList.contains("carousel"))return;const i={...X.getDataAttributes(e),...X.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),at.carouselInterface(e,i),s&&at.getInstance(e).to(s),t.preventDefault()}}$.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",at.dataApiClickHandler),$.on(window,"load.bs.carousel.data-api",(()=>{const t=Y.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;e<i;e++)at.carouselInterface(t[e],at.getInstance(t[e]))})),v(at);const lt="collapse",ct={toggle:!0,parent:null},ht={toggle:"boolean",parent:"(null|element)"},dt="show",ut="collapse",gt="collapsing",_t="collapsed",ft=":scope .collapse .collapse",pt='[data-bs-toggle="collapse"]';class mt extends R{constructor(t,e){super(t),this._isTransitioning=!1,this._config=this._getConfig(e),this._triggerArray=[];const i=Y.find(pt);for(let t=0,e=i.length;t<e;t++){const e=i[t],s=o(e),n=Y.find(s).filter((t=>t===this._element));null!==s&&n.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ct}static get NAME(){return lt}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=Y.find(ft,this._config.parent);e=Y.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=Y.findOne(this._selector);if(e.length){const s=e.find((t=>i!==t));if(t=s?mt.getInstance(s):null,t&&t._isTransitioning)return}if($.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&mt.getOrCreateInstance(e,{toggle:!1}).hide(),t||z.set(e,"bs.collapse",null)}));const s=this._getDimension();this._element.classList.remove(ut),this._element.classList.add(gt),this._element.style[s]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const n=`scroll${s[0].toUpperCase()+s.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gt),this._element.classList.add(ut,dt),this._element.style[s]="",$.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[s]=`${this._element[n]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if($.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,f(this._element),this._element.classList.add(gt),this._element.classList.remove(ut,dt);const e=this._triggerArray.length;for(let t=0;t<e;t++){const e=this._triggerArray[t],i=r(e);i&&!this._isShown(i)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gt),this._element.classList.add(ut),$.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(dt)}_getConfig(t){return(t={...ct,...X.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=c(t.parent),h(lt,t,ht),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=Y.find(ft,this._config.parent);Y.find(pt,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=r(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(_t):t.classList.add(_t),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=mt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}$.on(document,"click.bs.collapse.data-api",pt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=o(this);Y.find(e).forEach((t=>{mt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),v(mt);const bt="dropdown",vt="Escape",yt="Space",Et="ArrowUp",wt="ArrowDown",At=new RegExp("ArrowUp|ArrowDown|Escape"),Tt="click.bs.dropdown.data-api",Ct="keydown.bs.dropdown.data-api",kt="show",Lt='[data-bs-toggle="dropdown"]',St=".dropdown-menu",Ot=b()?"top-end":"top-start",Nt=b()?"top-start":"top-end",Dt=b()?"bottom-end":"bottom-start",It=b()?"bottom-start":"bottom-end",Pt=b()?"left-start":"right-start",xt=b()?"right-start":"left-start",Mt={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},jt={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class Ht extends R{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar()}static get Default(){return Mt}static get DefaultType(){return jt}static get NAME(){return bt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(u(this._element)||this._isShown(this._menu))return;const t={relatedTarget:this._element};if($.trigger(this._element,"show.bs.dropdown",t).defaultPrevented)return;const e=Ht.getParentFromElement(this._element);this._inNavbar?X.setDataAttribute(this._menu,"popper","none"):this._createPopper(e),"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach((t=>$.on(t,"mouseover",_))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(kt),this._element.classList.add(kt),$.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(u(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){$.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>$.off(t,"mouseover",_))),this._popper&&this._popper.destroy(),this._menu.classList.remove(kt),this._element.classList.remove(kt),this._element.setAttribute("aria-expanded","false"),X.removeDataAttribute(this._menu,"popper"),$.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...X.getDataAttributes(this._element),...t},h(bt,t,this.constructor.DefaultType),"object"==typeof t.reference&&!l(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${bt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===i)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:l(this._config.reference)?e=c(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const s=this._getPopperConfig(),n=s.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=i.createPopper(e,this._menu,s),n&&X.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(kt)}_getMenuElement(){return Y.next(this._element,St)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return Pt;if(t.classList.contains("dropstart"))return xt;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Nt:Ot:e?It:Dt}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=Y.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(d);i.length&&w(i,e,t===wt,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ht.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=Y.find(Lt);for(let i=0,s=e.length;i<s;i++){const s=Ht.getInstance(e[i]);if(!s||!1===s._config.autoClose)continue;if(!s._isShown())continue;const n={relatedTarget:s._element};if(t){const e=t.composedPath(),i=e.includes(s._menu);if(e.includes(s._element)||"inside"===s._config.autoClose&&!i||"outside"===s._config.autoClose&&i)continue;if(s._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;"click"===t.type&&(n.clickEvent=t)}s._completeHide(n)}}static getParentFromElement(t){return r(t)||t.parentNode}static dataApiKeydownHandler(t){if(/input|textarea/i.test(t.target.tagName)?t.key===yt||t.key!==vt&&(t.key!==wt&&t.key!==Et||t.target.closest(St)):!At.test(t.key))return;const e=this.classList.contains(kt);if(!e&&t.key===vt)return;if(t.preventDefault(),t.stopPropagation(),u(this))return;const i=this.matches(Lt)?this:Y.prev(this,Lt)[0],s=Ht.getOrCreateInstance(i);if(t.key!==vt)return t.key===Et||t.key===wt?(e||s.show(),void s._selectMenuItem(t)):void(e&&t.key!==yt||Ht.clearMenus());s.hide()}}$.on(document,Ct,Lt,Ht.dataApiKeydownHandler),$.on(document,Ct,St,Ht.dataApiKeydownHandler),$.on(document,Tt,Ht.clearMenus),$.on(document,"keyup.bs.dropdown.data-api",Ht.clearMenus),$.on(document,Tt,Lt,(function(t){t.preventDefault(),Ht.getOrCreateInstance(this).toggle()})),v(Ht);const $t=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Bt=".sticky-top";class zt{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",(e=>e+t)),this._setElementAttributes($t,"paddingRight",(e=>e+t)),this._setElementAttributes(Bt,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const s=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+s)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(n))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes($t,"paddingRight"),this._resetElementAttributes(Bt,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&X.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=X.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(X.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){l(t)?e(t):Y.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const Rt={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},Ft={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},qt="show",Wt="mousedown.bs.backdrop";class Ut{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&f(this._getElement()),this._getElement().classList.add(qt),this._emulateAnimation((()=>{y(t)}))):y(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(qt),this._emulateAnimation((()=>{this.dispose(),y(t)}))):y(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...Rt,..."object"==typeof t?t:{}}).rootElement=c(t.rootElement),h("backdrop",t,Ft),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),$.on(this._getElement(),Wt,(()=>{y(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&($.off(this._element,Wt),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){E(t,this._getElement(),this._config.isAnimated)}}const Kt={trapElement:null,autofocus:!0},Vt={trapElement:"element",autofocus:"boolean"},Xt=".bs.focustrap",Yt="backward";class Qt{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),$.off(document,Xt),$.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),$.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,$.off(document,Xt))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const s=Y.focusableChildren(i);0===s.length?i.focus():this._lastTabNavDirection===Yt?s[s.length-1].focus():s[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Yt:"forward")}_getConfig(t){return t={...Kt,..."object"==typeof t?t:{}},h("focustrap",t,Vt),t}}const Gt="modal",Zt="Escape",Jt={backdrop:!0,keyboard:!0,focus:!0},te={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},ee="hidden.bs.modal",ie="show.bs.modal",se="resize.bs.modal",ne="click.dismiss.bs.modal",oe="keydown.dismiss.bs.modal",re="mousedown.dismiss.bs.modal",ae="modal-open",le="show",ce="modal-static";class he extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=Y.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new zt}static get Default(){return Jt}static get NAME(){return Gt}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||$.trigger(this._element,ie,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(ae),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),$.on(this._dialog,re,(()=>{$.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if($.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(le),$.off(this._element,ne),$.off(this._dialog,re),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>$.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ut({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Qt({trapElement:this._element})}_getConfig(t){return t={...Jt,...X.getDataAttributes(this._element),..."object"==typeof t?t:{}},h(Gt,t,te),t}_showElement(t){const e=this._isAnimated(),i=Y.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||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,i&&(i.scrollTop=0),e&&f(this._element),this._element.classList.add(le),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,$.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?$.on(this._element,oe,(t=>{this._config.keyboard&&t.key===Zt?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Zt||this._triggerBackdropTransition()})):$.off(this._element,oe)}_setResizeEvent(){this._isShown?$.on(window,se,(()=>this._adjustDialog())):$.off(window,se)}_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(ae),this._resetAdjustments(),this._scrollBar.reset(),$.trigger(this._element,ee)}))}_showBackdrop(t){$.on(this._element,ne,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if($.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,s=e>document.documentElement.clientHeight;!s&&"hidden"===i.overflowY||t.contains(ce)||(s||(i.overflowY="hidden"),t.add(ce),this._queueCallback((()=>{t.remove(ce),s||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!b()||i&&!t&&b())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!b()||!i&&t&&b())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=he.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}$.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=r(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),$.one(e,ie,(t=>{t.defaultPrevented||$.one(e,ee,(()=>{d(this)&&this.focus()}))}));const i=Y.findOne(".modal.show");i&&he.getInstance(i).hide(),he.getOrCreateInstance(e).toggle(this)})),F(he),v(he);const de="offcanvas",ue={backdrop:!0,keyboard:!0,scroll:!1},ge={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},_e="show",fe=".offcanvas.show",pe="hidden.bs.offcanvas";class me extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return de}static get Default(){return ue}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||$.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new zt).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(_e),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),$.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&($.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove(_e),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new zt).reset(),$.trigger(this._element,pe)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...ue,...X.getDataAttributes(this._element),..."object"==typeof t?t:{}},h(de,t,ge),t}_initializeBackDrop(){return new Ut({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Qt({trapElement:this._element})}_addEventListeners(){$.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=me.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}$.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=r(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this))return;$.one(e,pe,(()=>{d(this)&&this.focus()}));const i=Y.findOne(fe);i&&i!==e&&me.getInstance(i).hide(),me.getOrCreateInstance(e).toggle(this)})),$.on(window,"load.bs.offcanvas.data-api",(()=>Y.find(fe).forEach((t=>me.getOrCreateInstance(t).show())))),F(me),v(me);const be=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),ve=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,ye=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ee=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!be.has(i)||Boolean(ve.test(t.nodeValue)||ye.test(t.nodeValue));const s=e.filter((t=>t instanceof RegExp));for(let t=0,e=s.length;t<e;t++)if(s[t].test(i))return!0;return!1};function we(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const s=(new window.DOMParser).parseFromString(t,"text/html"),n=[].concat(...s.body.querySelectorAll("*"));for(let t=0,i=n.length;t<i;t++){const i=n[t],s=i.nodeName.toLowerCase();if(!Object.keys(e).includes(s)){i.remove();continue}const o=[].concat(...i.attributes),r=[].concat(e["*"]||[],e[s]||[]);o.forEach((t=>{Ee(t,r)||i.removeAttribute(t.nodeName)}))}return s.body.innerHTML}const Ae="tooltip",Te=new Set(["sanitize","allowList","sanitizeFn"]),Ce={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},ke={AUTO:"auto",TOP:"top",RIGHT:b()?"left":"right",BOTTOM:"bottom",LEFT:b()?"right":"left"},Le={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],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:[]},popperConfig:null},Se={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Oe="fade",Ne="show",De="show",Ie="out",Pe=".tooltip-inner",xe=".modal",Me="hide.bs.modal",je="hover",He="focus";class $e extends R{constructor(t,e){if(void 0===i)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Le}static get NAME(){return Ae}static get Event(){return Se}static get DefaultType(){return Ce}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(Ne))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),$.off(this._element.closest(xe),Me,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=$.trigger(this._element,this.constructor.Event.SHOW),e=g(this._element),s=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!s)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(Pe).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),o=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",o),this._element.setAttribute("aria-describedby",o),this._config.animation&&n.classList.add(Oe);const r="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,a=this._getAttachment(r);this._addAttachmentClass(a);const{container:l}=this._config;z.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(l.append(n),$.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=i.createPopper(this._element,n,this._getPopperConfig(a)),n.classList.add(Ne);const c=this._resolvePossibleFunction(this._config.customClass);c&&n.classList.add(...c.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{$.on(t,"mouseover",_)}));const h=this.tip.classList.contains(Oe);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,$.trigger(this._element,this.constructor.Event.SHOWN),t===Ie&&this._leave(null,this)}),this.tip,h)}hide(){if(!this._popper)return;const t=this.getTipElement();if($.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(Ne),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>$.off(t,"mouseover",_))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(Oe);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==De&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),$.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(Oe,Ne),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),Pe)}_sanitizeAndSetContent(t,e,i){const s=Y.findOne(i,t);e||!s?this.setElementContent(s,e):s.remove()}setElementContent(t,e){if(null!==t)return l(e)?(e=c(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=we(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,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:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return ke[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)$.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===je?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===je?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;$.on(this._element,e,this._config.selector,(t=>this._enter(t))),$.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},$.on(this._element.closest(xe),Me,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?He:je]=!0),e.getTipElement().classList.contains(Ne)||e._hoverState===De?e._hoverState=De:(clearTimeout(e._timeout),e._hoverState=De,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===De&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?He:je]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Ie,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===Ie&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=X.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Te.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:c(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),h(Ae,t,this.constructor.DefaultType),t.sanitize&&(t.template=we(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=$e.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}v($e);const Be={...$e.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'},ze={...$e.DefaultType,content:"(string|element|function)"},Re={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Fe extends $e{static get Default(){return Be}static get NAME(){return"popover"}static get Event(){return Re}static get DefaultType(){return ze}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=Fe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}v(Fe);const qe="scrollspy",We={offset:10,method:"auto",target:""},Ue={offset:"number",method:"string",target:"(string|element)"},Ke="active",Ve=".nav-link, .list-group-item, .dropdown-item",Xe="position";class Ye extends R{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,$.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return We}static get NAME(){return qe}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":Xe,e="auto"===this._config.method?t:this._config.method,i=e===Xe?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),Y.find(Ve,this._config.target).map((t=>{const s=o(t),n=s?Y.findOne(s):null;if(n){const t=n.getBoundingClientRect();if(t.width||t.height)return[X[e](n).top+i,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){$.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...We,...X.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=c(t.target)||document.documentElement,h(qe,t,Ue),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t<this._offsets[e+1])&&this._activate(this._targets[e])}}_activate(t){this._activeTarget=t,this._clear();const e=Ve.split(",").map((e=>`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=Y.findOne(e.join(","),this._config.target);i.classList.add(Ke),i.classList.contains("dropdown-item")?Y.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(Ke):Y.parents(i,".nav, .list-group").forEach((t=>{Y.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(Ke))),Y.prev(t,".nav-item").forEach((t=>{Y.children(t,".nav-link").forEach((t=>t.classList.add(Ke)))}))})),$.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){Y.find(Ve,this._config.target).filter((t=>t.classList.contains(Ke))).forEach((t=>t.classList.remove(Ke)))}static jQueryInterface(t){return this.each((function(){const e=Ye.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}$.on(window,"load.bs.scrollspy.data-api",(()=>{Y.find('[data-bs-spy="scroll"]').forEach((t=>new Ye(t)))})),v(Ye);const Qe="active",Ge="fade",Ze="show",Je=".active",ti=":scope > li > .active";class ei extends R{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Qe))return;let t;const e=r(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?ti:Je;t=Y.find(e,i),t=t[t.length-1]}const s=t?$.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if($.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const n=()=>{$.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),$.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,n):n()}_activate(t,e,i){const s=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?Y.children(e,Je):Y.find(ti,e))[0],n=i&&s&&s.classList.contains(Ge),o=()=>this._transitionComplete(t,s,i);s&&n?(s.classList.remove(Ze),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Qe);const t=Y.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Qe),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Qe),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),f(t),t.classList.contains(Ge)&&t.classList.add(Ze);let s=t.parentNode;if(s&&"LI"===s.nodeName&&(s=s.parentNode),s&&s.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&Y.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Qe))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=ei.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}$.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this)||ei.getOrCreateInstance(this).show()})),v(ei);const ii="toast",si="hide",ni="show",oi="showing",ri={animation:"boolean",autohide:"boolean",delay:"number"},ai={animation:!0,autohide:!0,delay:5e3};class li extends R{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return ri}static get Default(){return ai}static get NAME(){return ii}show(){$.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(si),f(this._element),this._element.classList.add(ni),this._element.classList.add(oi),this._queueCallback((()=>{this._element.classList.remove(oi),$.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(ni)&&($.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(oi),this._queueCallback((()=>{this._element.classList.add(si),this._element.classList.remove(oi),this._element.classList.remove(ni),$.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(ni)&&this._element.classList.remove(ni),super.dispose()}_getConfig(t){return t={...ai,...X.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},h(ii,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){$.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),$.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),$.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),$.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return F(li),v(li),{Alert:q,Button:U,Carousel:at,Collapse:mt,Dropdown:Ht,Modal:he,Offcanvas:me,Popover:Fe,ScrollSpy:Ye,Tab:ei,Toast:li,Tooltip:$e}})); -//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/src/base/theme/bootsier/assets/js/bootstrap.min.js.map b/src/base/theme/bootsier/assets/js/bootstrap.min.js.map deleted file mode 100644 index 835a3d6b..00000000 --- a/src/base/theme/bootsier/assets/js/bootstrap.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["TRANSITION_END","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","document","querySelector","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","querySelectorAll","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","static","getInstance","VERSION","Error","enableDismissTrigger","component","method","clickEvent","tagName","closest","getOrCreateInstance","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","position","offsetTop","offsetLeft","SelectorEngine","find","concat","Element","prototype","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","EVENT_SLID","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE_ITEM","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","hasPointerPenTouch","pointerType","start","clientX","touches","move","end","clearTimeout","itemImg","add","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElem","_selector","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activesData","actives","container","tempActiveData","elemActive","dimension","_getDimension","style","scrollSize","triggerArrayLength","selected","triggerArray","isOpen","ESCAPE_KEY","SPACE_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","REGEXP_KEYDOWN","EVENT_CLICK_DATA_API","EVENT_KEYDOWN_DATA_API","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","boundary","reference","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","_createPopper","focus","_completeHide","destroy","update","Popper","referenceElement","_getPopperConfig","isDisplayStatic","modifiers","modifier","enabled","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","options","_selectMenuItem","items","toggles","context","composedPath","isMenuTarget","isActive","stopPropagation","getToggleButton","clearMenus","dataApiKeydownHandler","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","overflow","styleProp","scrollbarWidth","_applyManipulationCallback","reset","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","className","rootElement","clickCallback","EVENT_MOUSEDOWN","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","trapElement","autofocus","TAB_NAV_BACKWARD","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","EVENT_HIDDEN","EVENT_SHOW","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","scrollTop","_triggerBackdropTransition","_resetAdjustments","currentTarget","scrollHeight","isModalOverflowing","clientHeight","overflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","allReadyOpen","scroll","OPEN_SELECTOR","Offcanvas","visibility","blur","uriAttributes","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","regExp","attributeRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","DISALLOWED_ATTRIBUTES","animation","template","title","delay","html","fallbackPlacements","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","CLASS_NAME_FADE","HOVER_STATE_SHOW","HOVER_STATE_OUT","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","_disposePopper","isWithContent","shadowRoot","isInTheDom","ownerDocument","getTitle","tipId","prefix","floor","random","getElementById","getUID","attachment","_getAttachment","_addAttachmentClass","_resolvePossibleFunction","prevHoverState","_cleanTipClass","setContent","_sanitizeAndSetContent","content","templateElement","setElementContent","textContent","updateAttachment","_getDelegateConfig","phase","_handlePopperPlacementChange","onFirstUpdate","_getBasicClassPrefix","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","basicClassPrefixRegex","tabClass","token","tClass","state","popper","Popover","_getContent","SELECTOR_LINK_ITEMS","METHOD_POSITION","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","height","item","sort","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","listGroup","navItem","node","spy","SELECTOR_ACTIVE","SELECTOR_ACTIVE_UL","Tab","listElement","itemSelector","hideEvent","complete","active","isTransitioning","_transitionComplete","dropdownChild","dropdownElement","dropdown","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.3'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + window.pageYOffset,\n left: rect.left + window.pageXOffset\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const hasPointerPenTouch = event => {\n return this._pointerEvent &&\n (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n const start = event => {\n if (hasPointerPenTouch(event)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (hasPointerPenTouch(event)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: null\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let actives = []\n let activesData\n\n if (this._config.parent) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives.length) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !this._isShown(elem)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n })\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n this._createPopper(parent)\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper(parent) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._isShown()) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (event.key === ESCAPE_KEY) {\n instance.hide()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n instance.show()\n }\n\n instance._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n className: 'modal-backdrop',\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n className: 'string',\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.append(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n trapElement: null, // The element to trap focus inside of\n autofocus: true\n}\n\nconst DefaultType = {\n trapElement: 'element',\n autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n activate() {\n const { trapElement, autofocus } = this._config\n\n if (this._isActive) {\n return\n }\n\n if (autofocus) {\n trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n\n _handleFocusin(event) {\n const { target } = event\n const { trapElement } = this._config\n\n if (target === document || target === trapElement || trapElement.contains(target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking moddal toggler while another one is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen) {\n Modal.getInstance(allReadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n if (!this._config.scroll) {\n this._focustrap.activate()\n }\n\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attributeName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i]\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n attributeList.forEach(attribute => {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n // This will be removed later in favor of a `setContent` method\n if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n this._disposePopper()\n this.tip.remove()\n this.tip = null\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = this._resolvePossibleFunction(this._config.customClass)\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n this._disposePopper()\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n const tip = element.children[0]\n this.setContent(tip)\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n this.tip = tip\n return this.tip\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n }\n\n _sanitizeAndSetContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!content && templateElement) {\n templateElement.remove()\n return\n }\n\n // we use append for html objects to maintain js events\n this.setElementContent(templateElement, content)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.append(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n return this._resolvePossibleFunction(title)\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(content) {\n return typeof content === 'function' ? content.call(this._element) : content\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n }\n\n // Private\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n\n // Handle special case when .nav-link is inside .nav-item\n SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)\n .forEach(navItem => {\n SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n })\n })\n }\n\n EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n SelectorEngine.find(SELECTOR_DATA_SPY)\n .forEach(spy => new ScrollSpy(spy))\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n reflow\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_UL = ':scope > li > .active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n if ((this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n this._element.classList.contains(CLASS_NAME_ACTIVE))) {\n return\n }\n\n let previous\n const target = getElementFromSelector(this._element)\n const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE\n previous = SelectorEngine.find(itemSelector, listElement)\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = previous ?\n EventHandler.trigger(previous, EVENT_HIDE, {\n relatedTarget: this._element\n }) :\n null\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget: previous\n })\n\n if (showEvent.defaultPrevented || (hideEvent !== null && hideEvent.defaultPrevented)) {\n return\n }\n\n this._activate(this._element, listElement)\n\n const complete = () => {\n EventHandler.trigger(previous, EVENT_HIDDEN, {\n relatedTarget: this._element\n })\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget: previous\n })\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?\n SelectorEngine.find(SELECTOR_ACTIVE_UL, container) :\n SelectorEngine.children(container, SELECTOR_ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && active.classList.contains(CLASS_NAME_FADE))\n\n const complete = () => this._transitionComplete(element, active, callback)\n\n if (active && isTransitioning) {\n active.classList.remove(CLASS_NAME_SHOW)\n this._queueCallback(complete, element, true)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n active.classList.remove(CLASS_NAME_ACTIVE)\n\n const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode)\n\n if (dropdownChild) {\n dropdownChild.classList.remove(CLASS_NAME_ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n\n reflow(element)\n\n if (element.classList.contains(CLASS_NAME_FADE)) {\n element.classList.add(CLASS_NAME_SHOW)\n }\n\n let parent = element.parentNode\n if (parent && parent.nodeName === 'LI') {\n parent = parent.parentNode\n }\n\n if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n const dropdownElement = element.closest(SELECTOR_DROPDOWN)\n\n if (dropdownElement) {\n SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)\n .forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE))\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const data = Tab.getOrCreateInstance(this)\n data.show()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tab to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING)\n this._element.classList.remove(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n return config\n }\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout':\n this._hasMouseInteraction = isInteracting\n break\n case 'focusin':\n case 'focusout':\n this._hasKeyboardInteraction = isInteracting\n break\n default:\n break\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\nenableDismissTrigger(Toast)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Toast to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert'\nimport Button from './src/button'\nimport Carousel from './src/carousel'\nimport Collapse from './src/collapse'\nimport Dropdown from './src/dropdown'\nimport Modal from './src/modal'\nimport Offcanvas from './src/offcanvas'\nimport Popover from './src/popover'\nimport ScrollSpy from './src/scrollspy'\nimport Tab from './src/tab'\nimport Toast from './src/toast'\nimport Tooltip from './src/tooltip'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"]} \ No newline at end of file diff --git a/src/base/theme/bootsier/mod.rs b/src/base/theme/bootsier/mod.rs index f0a0f61c..92e7437a 100644 --- a/src/base/theme/bootsier/mod.rs +++ b/src/base/theme/bootsier/mod.rs @@ -7,14 +7,14 @@ localize!("en-US", "src/base/theme/bootsier/locales"); pub struct BootsierTheme; impl Theme for BootsierTheme { - fn name(&self) -> &str { - "Bootsier" + fn name(&self) -> String { + "Bootsier".to_string() } fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( "/bootsier", - generate() + assets() )); } @@ -26,15 +26,15 @@ impl Theme for BootsierTheme { ) .add_stylesheet( StyleSheet::source( - "/bootsier/css/bootstrap.min.css" + "/bootsier/css/bootstrap.min.css?v=5.1.3" ) .with_weight(-99) ) .add_javascript( JavaScript::source( - "/bootsier/js/bootstrap.bundle.min.js" + "/bootsier/js/bootstrap.bundle.min.js?v=5.1.3" ) - .with_weight(-98) + .with_weight(-99) ) .add_jquery(); } diff --git a/src/base/theme/minimal/mod.rs b/src/base/theme/minimal/mod.rs index ea1ea1f4..9ea6e87e 100644 --- a/src/base/theme/minimal/mod.rs +++ b/src/base/theme/minimal/mod.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub struct MinimalTheme; impl Theme for MinimalTheme { - fn name(&self) -> &str { - "Minimal" + fn name(&self) -> String { + "Minimal".to_string() } } diff --git a/src/config/settings.rs b/src/config/settings.rs index b2a758e7..94097c3a 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -6,7 +6,10 @@ use serde::Deserialize; use std::env; -/// Carga los ajustes globales "clave = valor" al arrancar la aplicación. +/// Al arrancar la aplicación, carga los valores originales "clave = valor" de +/// los archivos de configuración. Con [`config_map`] se asignarán los ajustes +/// globales ([`SETTINGS`]); y se podrán asignar los ajustes específicos de la +/// aplicación, o también de un tema, módulo o componente. pub static CONFIG: Lazy<Config> = Lazy::new(|| { // Establece el modo de ejecución según el valor de la variable de entorno // PAGETOP_RUN_MODE. Asume "default" por defecto. @@ -15,8 +18,7 @@ pub static CONFIG: Lazy<Config> = Lazy::new(|| { // Inicializa los ajustes. let mut settings = Config::default(); - // Lee los ajustes combinando los archivos de configuración disponibles y - // asigna el modo de ejecución. + // Combina los archivos de configuración y asigna el modo de ejecución. settings .merge( File::with_name( @@ -36,23 +38,13 @@ pub static CONFIG: Lazy<Config> = Lazy::new(|| { }); #[macro_export] -/// Usar esta macro para obtener el valor de cualquier ajuste global, donde -/// clave y valor son cadenas de caracteres. Devuelve la cadena vacía si no -/// encuentra un ajuste para la clave. -macro_rules! config_get { - ( $key:expr ) => { - $crate::config::CONFIG.get_str($key).unwrap_or("".to_string()) - }; -} - -#[macro_export] -/// Carga los ajustes específicos de tu módulo o aplicación en una estructura -/// similar a [`SETTINGS`] con tipos de variables seguros. Genera un *panic!* -/// en caso de asignaciones no válidas. +/// Asigna los ajustes específicos de la aplicación, o de un tema, módulo o +/// componente, en una estructura similar a [`SETTINGS`] con tipos de variables +/// seguros. Produce un *panic!* en caso de asignaciones no válidas. macro_rules! config_map { - ( $COMMENT:expr, $CONF:ident, $TYPE:tt $(, $key:expr => $value:expr)* ) => { + ( $COMM:expr, $CONF:ident, $TYPE:tt $(, $key:expr => $value:expr)* ) => { $crate::doc_comment! { - concat!($COMMENT), + concat!($COMM), pub static $CONF: $crate::Lazy<$TYPE> = $crate::Lazy::new(|| { let mut settings = $crate::config::CONFIG.clone(); @@ -101,7 +93,7 @@ pub struct Settings { config_map!(r#" Ajustes globales y valores predeterminados para las secciones *\[app\]*, -*\[log\]* y *\[webserver\]* específicas de PageTop. +*\[log\]* y *\[webserver\]* de PageTop. "#, SETTINGS, Settings, diff --git a/src/core/all.rs b/src/core/all.rs index 716dac9b..3fe712b6 100644 --- a/src/core/all.rs +++ b/src/core/all.rs @@ -1,6 +1,13 @@ use crate::core::{server, state}; +include!(concat!(env!("OUT_DIR"), "/theme.rs")); + pub fn themes(cfg: &mut server::web::ServiceConfig) { + cfg.service(actix_web_static_files::ResourceFiles::new( + "/theme", + assets() + )); + for t in state::THEMES.read().unwrap().iter() { t.configure_theme(cfg); } diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index 2bffd73b..c01855d9 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -228,7 +228,7 @@ impl Assets { if !self.with_jquery { self.add_javascript( JavaScript::source( - "/assets/js/jquery.min.js?ver=3.6.0" + "/theme/js/jquery.min.js?v=3.6.0" ) .with_weight(i8::MIN) .with_mode(JSMode::Normal) diff --git a/resources/slant.flf b/src/core/server/figfonts/slant.flf similarity index 100% rename from resources/slant.flf rename to src/core/server/figfonts/slant.flf diff --git a/resources/small.flf b/src/core/server/figfonts/small.flf similarity index 100% rename from resources/small.flf rename to src/core/server/figfonts/small.flf diff --git a/resources/speed.flf b/src/core/server/figfonts/speed.flf similarity index 100% rename from resources/speed.flf rename to src/core/server/figfonts/speed.flf diff --git a/resources/starwars.flf b/src/core/server/figfonts/starwars.flf similarity index 100% rename from resources/starwars.flf rename to src/core/server/figfonts/starwars.flf diff --git a/src/core/server/main.rs b/src/core/server/main.rs index b915743e..8616158e 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -57,16 +57,16 @@ pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { if SETTINGS.app.startup_banner.to_lowercase() != "off" { let figfont = figlet_rs::FIGfont::from_content( match SETTINGS.app.startup_banner.to_lowercase().as_str() { - "slant" => include_str!("../../../resources/slant.flf"), - "small" => include_str!("../../../resources/small.flf"), - "speed" => include_str!("../../../resources/speed.flf"), - "starwars" => include_str!("../../../resources/starwars.flf"), + "slant" => include_str!("figfonts/slant.flf"), + "small" => include_str!("figfonts/small.flf"), + "speed" => include_str!("figfonts/speed.flf"), + "starwars" => include_str!("figfonts/starwars.flf"), _ => { trace::warn!( "FIGfont \"{}\" not found for banner. Using \"{}\"", SETTINGS.app.startup_banner, "Small" ); - include_str!("../../../resources/small.flf") + include_str!("figfonts/small.flf") } } ).unwrap(); diff --git a/src/core/theme/api.rs b/src/core/theme/api.rs index 2f4a5682..8c0caad1 100644 --- a/src/core/theme/api.rs +++ b/src/core/theme/api.rs @@ -5,10 +5,10 @@ use crate::base::component::Chunck; /// Los temas deben implementar este "trait". pub trait Theme: Send + Sync { - fn name(&self) -> &str; + fn name(&self) -> String; - fn description(&self) -> &str { - "" + fn description(&self) -> String { + "".to_string() } #[allow(unused_variables)] @@ -41,7 +41,7 @@ pub trait Theme: Send + Sync { fn render_page_body(&self, page: &mut Page) -> Markup { html! { - body id="body" class=(page.body_classes()) { + body class=(page.body_classes()) { @match page.template() { "admin" => { @for region in &["top-menu", "side-menu", "content"] { diff --git a/src/base/theme/aliner/assets/css/styles.css b/static/aliner/css/styles.css similarity index 100% rename from src/base/theme/aliner/assets/css/styles.css rename to static/aliner/css/styles.css diff --git a/src/base/theme/bootsier/assets/css/bootstrap.min.css b/static/bootsier/css/bootstrap.min.css similarity index 100% rename from src/base/theme/bootsier/assets/css/bootstrap.min.css rename to static/bootsier/css/bootstrap.min.css diff --git a/src/base/theme/bootsier/assets/css/bootstrap.min.css.map b/static/bootsier/css/bootstrap.min.css.map similarity index 100% rename from src/base/theme/bootsier/assets/css/bootstrap.min.css.map rename to static/bootsier/css/bootstrap.min.css.map diff --git a/src/base/theme/bootsier/assets/images/caution.png b/static/bootsier/images/caution.png similarity index 100% rename from src/base/theme/bootsier/assets/images/caution.png rename to static/bootsier/images/caution.png diff --git a/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js b/static/bootsier/js/bootstrap.bundle.min.js similarity index 100% rename from src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js rename to static/bootsier/js/bootstrap.bundle.min.js diff --git a/src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js.map b/static/bootsier/js/bootstrap.bundle.min.js.map similarity index 100% rename from src/base/theme/bootsier/assets/js/bootstrap.bundle.min.js.map rename to static/bootsier/js/bootstrap.bundle.min.js.map diff --git a/resources/assets/js/jquery.min.js b/static/theme/js/jquery.min.js similarity index 100% rename from resources/assets/js/jquery.min.js rename to static/theme/js/jquery.min.js diff --git a/resources/assets/js/jquery.min.map b/static/theme/js/jquery.min.map similarity index 100% rename from resources/assets/js/jquery.min.map rename to static/theme/js/jquery.min.map From edf5ddf81b2951192f62d3f55f682681cbfe62c8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 25 Feb 2022 20:42:06 +0100 Subject: [PATCH 014/853] =?UTF-8?q?A=C3=B1ade=20componente=20para=20crear?= =?UTF-8?q?=20men=C3=BAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit También introduce el nuevo módulo Admin para porporcionar un entorno común de administración para los demás módulos de PageTop. --- config/default.toml | 2 +- src/base/component/block.rs | 105 ++++++++ src/base/component/container.rs | 12 +- src/base/component/form/button.rs | 24 +- src/base/component/form/date.rs | 33 +-- src/base/component/form/form.rs | 33 +-- src/base/component/form/hidden.rs | 60 +---- src/base/component/form/input.rs | 33 +-- src/base/component/menu.rs | 252 +++++++++++++++++++ src/base/component/mod.rs | 4 + src/base/module/admin/configure.rs | 17 ++ src/base/module/admin/mod.rs | 4 + src/base/module/admin/summary.rs | 54 +++++ src/base/module/mod.rs | 1 + src/base/theme/bootsier/mod.rs | 4 +- src/core/response/page/assets.rs | 23 +- src/core/response/page/component.rs | 8 + src/core/state.rs | 1 + src/lib.rs | 2 +- src/macros/mod.rs | 19 -- src/prelude.rs | 2 + src/util.rs | 42 ++++ static/theme/menu/css/menu-blue.css | 333 ++++++++++++++++++++++++++ static/theme/menu/css/menu-clean.css | 327 +++++++++++++++++++++++++ static/theme/menu/css/menu-mint.css | 331 +++++++++++++++++++++++++ static/theme/menu/css/menu-simple.css | 249 +++++++++++++++++++ static/theme/menu/css/menu.css | 58 +++++ static/theme/menu/js/menu.min.js | 3 + 28 files changed, 1849 insertions(+), 187 deletions(-) create mode 100644 src/base/component/block.rs create mode 100644 src/base/component/menu.rs create mode 100644 src/base/module/admin/configure.rs create mode 100644 src/base/module/admin/mod.rs create mode 100644 src/base/module/admin/summary.rs delete mode 100644 src/macros/mod.rs create mode 100644 src/util.rs create mode 100644 static/theme/menu/css/menu-blue.css create mode 100644 static/theme/menu/css/menu-clean.css create mode 100644 static/theme/menu/css/menu-mint.css create mode 100644 static/theme/menu/css/menu-simple.css create mode 100644 static/theme/menu/css/menu.css create mode 100644 static/theme/menu/js/menu.min.js diff --git a/config/default.toml b/config/default.toml index f96d1a7d..5f8778a3 100644 --- a/config/default.toml +++ b/config/default.toml @@ -1,3 +1,3 @@ [app] name = "PageTop Essence" -language = "es-ES" +description = "A modern Content Management System for sharing the world." diff --git a/src/base/component/block.rs b/src/base/component/block.rs new file mode 100644 index 00000000..03e67e01 --- /dev/null +++ b/src/base/component/block.rs @@ -0,0 +1,105 @@ +use crate::prelude::*; + +pub struct Block { + renderable: fn() -> bool, + weight : i8, + id : Option<String>, + title : String, + markup : Vec<Markup>, + template : String, +} + +impl PageComponent for Block { + + fn prepare() -> Self { + Block { + renderable: always, + weight : 0, + id : None, + title : "".to_string(), + markup : Vec::new(), + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, assets: &mut PageAssets) -> Markup { + let id = assets.required_id(self.name(), self.id()); + html! { + div id=(id) class="block" { + @if !self.title.is_empty() { + h2 class="block-title" { (self.title) } + } + div class="block-body" { + @for markup in self.markup.iter() { + (*markup) + } + } + } + } + } +} + +impl Block { + + pub fn markup(markup: Markup) -> Self { + Block::prepare().add_markup(markup) + } + + // Block BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.id = util::valid_id(id); + self + } + + pub fn with_title(mut self, title: &str) -> Self { + self.title = title.to_string(); + self + } + + pub fn add_markup(mut self, markup: Markup) -> Self { + self.markup.push(markup); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Block GETTERS. + + pub fn id(&self) -> &str { + util::assigned_value(&self.id) + } + + pub fn title(&self) -> &str { + self.title.as_str() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/container.rs b/src/base/component/container.rs index d4315ddc..61c08336 100644 --- a/src/base/component/container.rs +++ b/src/base/component/container.rs @@ -5,7 +5,7 @@ enum ContainerType { Column, Row, Wrapper } pub struct Container { renderable: fn() -> bool, weight : i8, - id : String, + id : Option<String>, container : ContainerType, components: PageContainer, template : String, @@ -17,7 +17,7 @@ impl PageComponent for Container { Container { renderable: always, weight : 0, - id : "".to_string(), + id : None, container : ContainerType::Wrapper, components: PageContainer::new(), template : "default".to_string(), @@ -39,7 +39,7 @@ impl PageComponent for Container { ContainerType::Column => "col", }; html! { - div class=(classes) { + div id=[&self.id] class=(classes) { (self.components.render(assets)) } } @@ -73,7 +73,7 @@ impl Container { } pub fn with_id(mut self, id: &str) -> Self { - self.id = id.to_string(); + self.id = util::valid_id(id); self } @@ -87,10 +87,10 @@ impl Container { self } - // Grid GETTERS. + // Container GETTERS. pub fn id(&self) -> &str { - self.id.as_str() + util::assigned_value(&self.id) } pub fn template(&self) -> &str { diff --git a/src/base/component/form/button.rs b/src/base/component/form/button.rs index 440ccf93..c95eb3ec 100644 --- a/src/base/component/form/button.rs +++ b/src/base/component/form/button.rs @@ -23,7 +23,7 @@ impl PageComponent for Button { name : None, value : None, autofocus : None, - disabled : None, + disabled : None, template : "default".to_string(), } } @@ -96,20 +96,12 @@ impl Button { } pub fn with_name(mut self, name: &str) -> Self { - self.name = if name.is_empty() { - None - } else { - Some(name.replace(" ", "_")) - }; + self.name = util::valid_id(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = if value.is_empty() { - None - } else { - Some(value.to_string()) - }; + self.value = util::optional_value(value); self } @@ -137,17 +129,11 @@ impl Button { // Button GETTERS. pub fn name(&self) -> &str { - match &self.name { - Some(name) => name.as_str(), - _ => "" - } + util::assigned_value(&self.name) } pub fn value(&self) -> &str { - match &self.value { - Some(value) => value.as_str(), - _ => "" - } + util::assigned_value(&self.value) } pub fn has_autofocus(&self) -> bool { diff --git a/src/base/component/form/date.rs b/src/base/component/form/date.rs index e1e33be0..b2839e8e 100644 --- a/src/base/component/form/date.rs +++ b/src/base/component/form/date.rs @@ -107,20 +107,12 @@ impl Date { } pub fn with_name(mut self, name: &str) -> Self { - self.name = if name.is_empty() { - None - } else { - Some(name.replace(" ", "_")) - }; + self.name = util::valid_id(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = if value.is_empty() { - None - } else { - Some(value.to_string()) - }; + self.value = util::optional_value(value); self } @@ -130,11 +122,7 @@ impl Date { } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = if placeholder.is_empty() { - None - } else { - Some(placeholder.to_string()) - }; + self.placeholder = util::optional_value(placeholder); self } @@ -191,17 +179,11 @@ impl Date { // Date GETTERS. pub fn name(&self) -> &str { - match &self.name { - Some(name) => name.as_str(), - _ => "" - } + util::assigned_value(&self.name) } pub fn value(&self) -> &str { - match &self.value { - Some(value) => value.as_str(), - _ => "" - } + util::assigned_value(&self.value) } pub fn label(&self) -> &str { @@ -209,10 +191,7 @@ impl Date { } pub fn placeholder(&self) -> &str { - match &self.placeholder { - Some(placeholder) => placeholder.as_str(), - _ => "" - } + util::assigned_value(&self.placeholder) } pub fn has_autofocus(&self) -> bool { diff --git a/src/base/component/form/form.rs b/src/base/component/form/form.rs index 519587e0..6f73469d 100644 --- a/src/base/component/form/form.rs +++ b/src/base/component/form/form.rs @@ -71,20 +71,12 @@ impl Form { } pub fn with_id(mut self, id: &str) -> Self { - self.id = if id.is_empty() { - None - } else { - Some(id.replace(" ", "_")) - }; + self.id = util::valid_id(id); self } pub fn with_action(mut self, action: &str) -> Self { - self.action = if action.is_empty() { - None - } else { - Some(action.to_string()) - }; + self.action = util::optional_value(action); self } @@ -94,11 +86,7 @@ impl Form { } pub fn with_charset(mut self, charset: &str) -> Self { - self.charset = if charset.is_empty() { - None - } else { - Some(charset.to_string()) - }; + self.charset = util::optional_value(charset); self } @@ -115,17 +103,11 @@ impl Form { // Form GETTERS. pub fn id(&self) -> &str { - match &self.id { - Some(id) => id.as_str(), - _ => "" - } + util::assigned_value(&self.id) } pub fn action(&self) -> &str { - match &self.action { - Some(action) => action.as_str(), - _ => "" - } + util::assigned_value(&self.action) } pub fn method(&self) -> &str { @@ -136,10 +118,7 @@ impl Form { } pub fn charset(&self) -> &str { - match &self.charset { - Some(charset) => charset.as_str(), - _ => "" - } + util::assigned_value(&self.charset) } pub fn template(&self) -> &str { diff --git a/src/base/component/form/hidden.rs b/src/base/component/form/hidden.rs index a95cfc77..57b4b34f 100644 --- a/src/base/component/form/hidden.rs +++ b/src/base/component/form/hidden.rs @@ -1,29 +1,21 @@ use crate::prelude::*; pub struct Hidden { - renderable : fn() -> bool, - weight : i8, - name : Option<String>, - value : Option<String>, - template : String, + weight : i8, + name : Option<String>, + value : Option<String>, } impl PageComponent for Hidden { fn prepare() -> Self { Hidden { - renderable : always, - weight : 0, - name : None, - value : None, - template : "default".to_string(), + weight : 0, + name : None, + value : None, } } - fn is_renderable(&self) -> bool { - (self.renderable)() - } - fn weight(&self) -> i8 { self.weight } @@ -51,60 +43,28 @@ impl Hidden { // Hidden BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; - self - } - pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } pub fn with_name(mut self, name: &str) -> Self { - self.name = if name.is_empty() { - None - } else { - Some(name.replace(" ", "_")) - }; + self.name = util::valid_id(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = if value.is_empty() { - None - } else { - Some(value.to_string()) - }; - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.value = util::optional_value(value); self } // Hidden GETTERS. pub fn name(&self) -> &str { - match &self.name { - Some(name) => name.as_str(), - _ => "" - } + util::assigned_value(&self.name) } pub fn value(&self) -> &str { - match &self.value { - Some(value) => value.as_str(), - _ => "" - } - } - - pub fn template(&self) -> &str { - self.template.as_str() + util::assigned_value(&self.value) } } - -fn always() -> bool { - true -} diff --git a/src/base/component/form/input.rs b/src/base/component/form/input.rs index d4ec8930..82c0bda3 100644 --- a/src/base/component/form/input.rs +++ b/src/base/component/form/input.rs @@ -162,20 +162,12 @@ impl Input { } pub fn with_name(mut self, name: &str) -> Self { - self.name = if name.is_empty() { - None - } else { - Some(name.replace(" ", "_")) - }; + self.name = util::valid_id(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = if value.is_empty() { - None - } else { - Some(value.to_string()) - }; + self.value = util::optional_value(value); self } @@ -200,11 +192,7 @@ impl Input { } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = if placeholder.is_empty() { - None - } else { - Some(placeholder.to_string()) - }; + self.placeholder = util::optional_value(placeholder); self } @@ -261,17 +249,11 @@ impl Input { // Input GETTERS. pub fn name(&self) -> &str { - match &self.name { - Some(name) => name.as_str(), - _ => "" - } + util::assigned_value(&self.name) } pub fn value(&self) -> &str { - match &self.value { - Some(value) => value.as_str(), - _ => "" - } + util::assigned_value(&self.value) } pub fn label(&self) -> &str { @@ -291,10 +273,7 @@ impl Input { } pub fn placeholder(&self) -> &str { - match &self.placeholder { - Some(placeholder) => placeholder.as_str(), - _ => "" - } + util::assigned_value(&self.placeholder) } pub fn has_autofocus(&self) -> bool { diff --git a/src/base/component/menu.rs b/src/base/component/menu.rs new file mode 100644 index 00000000..34be6e33 --- /dev/null +++ b/src/base/component/menu.rs @@ -0,0 +1,252 @@ +use crate::prelude::*; + +enum MenuItemType { + Label(String), + Link(String, String), + LinkBlank(String, String), + Markup(Markup), + Separator, + Submenu(String, Menu), +} + +// ----------------------------------------------------------------------------- +// MenuItem. +// ----------------------------------------------------------------------------- + +pub struct MenuItem { + renderable: fn() -> bool, + weight : i8, + item_type : Option<MenuItemType>, +} + +impl PageComponent for MenuItem { + + fn prepare() -> Self { + MenuItem { + renderable: always, + weight : 0, + item_type : None, + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, assets: &mut PageAssets) -> Markup { + match &self.item_type { + Some(MenuItemType::Label(label)) => html! { + li class="label" { a href="#" { (label) } } + }, + Some(MenuItemType::Link(label, path)) => html! { + li class="link" { a href=(path) { (label) } } + }, + Some(MenuItemType::LinkBlank(label, path)) => html! { + li class="link_blank" { + a href=(path) target="_blank" { (label) } + } + }, + Some(MenuItemType::Markup(markup)) => html! { + li class="markup" { (*markup) } + }, + Some(MenuItemType::Submenu(label, menu)) => html! { + li class="submenu" { + a href="#" { (label) } + ul { + (menu.render_items(assets)) + } + } + }, + Some(MenuItemType::Separator) => html! { + li class="separator" { } + }, + None => html! {} + } + } +} + +impl MenuItem { + + pub fn label(label: &str) -> Self { + MenuItem { + renderable: always, + weight : 0, + item_type : Some(MenuItemType::Label(label.to_string())), + } + } + + pub fn link(label: &str, path: &str) -> Self { + MenuItem { + renderable: always, + weight : 0, + item_type : Some(MenuItemType::Link( + label.to_string(), + path.to_string(), + )), + } + } + + pub fn link_blank(label: &str, path: &str) -> Self { + MenuItem { + renderable: always, + weight : 0, + item_type : Some(MenuItemType::LinkBlank( + label.to_string(), + path.to_string(), + )), + } + } + + pub fn markup(markup: Markup) -> Self { + MenuItem { + renderable: always, + weight : 0, + item_type : Some(MenuItemType::Markup(markup)), + } + } + + pub fn separator() -> Self { + MenuItem { + renderable: always, + weight : 0, + item_type : Some(MenuItemType::Separator), + } + } + + pub fn submenu(label: &str, menu: Menu) -> Self { + MenuItem { + renderable: always, + weight : 0, + item_type : Some(MenuItemType::Submenu( + label.to_string(), + menu + )), + } + } + + // MenuItem BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } +} + +// ----------------------------------------------------------------------------- +// Menu. +// ----------------------------------------------------------------------------- + +pub struct Menu { + renderable: fn() -> bool, + weight : i8, + id : Option<String>, + items : PageContainer, + template : String, +} + +impl PageComponent for Menu { + + fn prepare() -> Self { + Menu { + renderable: always, + weight : 0, + id : None, + items : PageContainer::new(), + template : "default".to_string(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, assets: &mut PageAssets) -> Markup { + assets + .add_stylesheet(StyleSheet::source( + "/theme/menu/css/menu.css?ver=1.1.1" + )) + .add_stylesheet(StyleSheet::source( + "/theme/menu/css/menu-clean.css?ver=1.1.1" + )) + .add_javascript(JavaScript::source( + "/theme/menu/js/menu.min.js?ver=1.1.1" + )) + .add_jquery(); + + let id = assets.required_id(self.name(), self.id()); + html! { + ul id=(id) class="sm sm-clean" { + (self.render_items(assets)) + } + script type="text/javascript" defer { + "jQuery(function(){jQuery('#" (id) "').smartmenus({" + "hideTimeout: 0," + "showTimeout: 80," + "});});" + } + } + } +} + +impl Menu { + + // Menu BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.id = util::valid_id(id); + self + } + + pub fn add(mut self, item: MenuItem) -> Self { + self.items.add(item); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_string(); + self + } + + // Menu GETTERS. + + pub fn id(&self) -> &str { + util::assigned_value(&self.id) + } + + pub fn template(&self) -> &str { + self.template.as_str() + } + + // Menu EXTRAS. + + pub fn render_items(&self, assets: &mut PageAssets) -> Markup { + html! { (self.items.render(assets)) } + } +} + +fn always() -> bool { + true +} diff --git a/src/base/component/mod.rs b/src/base/component/mod.rs index 07c16cf7..f9973108 100644 --- a/src/base/component/mod.rs +++ b/src/base/component/mod.rs @@ -2,6 +2,10 @@ mod container; pub use container::Container; mod chunck; pub use chunck::Chunck; +mod block; +pub use block::Block; +mod menu; +pub use menu::{Menu, MenuItem}; pub mod form; pub use form::{Form, FormMethod}; diff --git a/src/base/module/admin/configure.rs b/src/base/module/admin/configure.rs new file mode 100644 index 00000000..1859f016 --- /dev/null +++ b/src/base/module/admin/configure.rs @@ -0,0 +1,17 @@ +use crate::prelude::*; +use crate::base::module::admin::summary::summary; + +pub struct AdminModule; + +impl Module for AdminModule { + fn name(&self) -> String { + "PageTop Admin".to_string() + } + + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service( + server::web::scope("/admin") + .route("", server::web::get().to(summary)) + ); + } +} diff --git a/src/base/module/admin/mod.rs b/src/base/module/admin/mod.rs new file mode 100644 index 00000000..1444391b --- /dev/null +++ b/src/base/module/admin/mod.rs @@ -0,0 +1,4 @@ +mod configure; +pub use configure::AdminModule; + +mod summary; diff --git a/src/base/module/admin/summary.rs b/src/base/module/admin/summary.rs new file mode 100644 index 00000000..6f620fd0 --- /dev/null +++ b/src/base/module/admin/summary.rs @@ -0,0 +1,54 @@ +use crate::prelude::*; + +pub async fn summary() -> server::Result<Markup> { + let top_menu = Menu::prepare() + .add(MenuItem::label("Opción 1")) + .add(MenuItem::link("Opción 2", "https://www.google.es")) + .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) + .add(MenuItem::submenu("Submenú 1", Menu::prepare() + .add(MenuItem::label("Opción 1")) + .add(MenuItem::label("Opción 2")) + )) + .add(MenuItem::separator()) + .add(MenuItem::submenu("Submenú 2", Menu::prepare() + .add(MenuItem::label("Opción 1")) + .add(MenuItem::label("Opción 2")) + )) + .add(MenuItem::label("Opción 4")); + + let side_menu = Menu::prepare() + .add(MenuItem::label("Opción 1")) + .add(MenuItem::link("Opción 2", "https://www.google.es")) + .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) + .add(MenuItem::submenu("Submenú 1", Menu::prepare() + .add(MenuItem::label("Opción 1")) + .add(MenuItem::label("Opción 2")) + )) + .add(MenuItem::separator()) + .add(MenuItem::submenu("Submenú 2", Menu::prepare() + .add(MenuItem::label("Opción 1")) + .add(MenuItem::label("Opción 2")) + )) + .add(MenuItem::label("Opción 4")); + + Page::prepare() + .with_title("Admin") + + .add_to("top-menu", top_menu) + + .add_to("content", Container::row() + .add(Container::column() + .add(side_menu) + ) + .add(Container::column() + .add(Chunck::markup(html! { + p { "Columna 2"} + })) + ) + ) + + + .using_template("admin") + + .render() +} diff --git a/src/base/module/mod.rs b/src/base/module/mod.rs index dd90a79f..3a4e2d51 100644 --- a/src/base/module/mod.rs +++ b/src/base/module/mod.rs @@ -1,2 +1,3 @@ +pub mod admin; pub mod homepage; pub mod user; diff --git a/src/base/theme/bootsier/mod.rs b/src/base/theme/bootsier/mod.rs index 92e7437a..2d37cb05 100644 --- a/src/base/theme/bootsier/mod.rs +++ b/src/base/theme/bootsier/mod.rs @@ -26,13 +26,13 @@ impl Theme for BootsierTheme { ) .add_stylesheet( StyleSheet::source( - "/bootsier/css/bootstrap.min.css?v=5.1.3" + "/bootsier/css/bootstrap.min.css?ver=5.1.3" ) .with_weight(-99) ) .add_javascript( JavaScript::source( - "/bootsier/js/bootstrap.bundle.min.js?v=5.1.3" + "/bootsier/js/bootstrap.bundle.min.js?ver=5.1.3" ) .with_weight(-99) ) diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index c01855d9..8d929f79 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -177,7 +177,7 @@ pub struct Assets { stylesheets: Vec<StyleSheet>, javascripts: Vec<JavaScript>, with_jquery: bool, - seqid_count: u16, + id_counter : u32, } impl Assets { @@ -188,7 +188,7 @@ impl Assets { stylesheets: Vec::new(), javascripts: Vec::new(), with_jquery: false, - seqid_count: 0, + id_counter : 0, } } @@ -228,7 +228,7 @@ impl Assets { if !self.with_jquery { self.add_javascript( JavaScript::source( - "/theme/js/jquery.min.js?v=3.6.0" + "/theme/js/jquery.min.js?ver=3.6.0" ) .with_weight(i8::MIN) .with_mode(JSMode::Normal) @@ -262,13 +262,20 @@ impl Assets { } } - // Assets GETTERS. + // Assets EXTRAS. - pub fn seqid(&mut self, id: &str) -> String { + pub fn required_id(&mut self, prefix: &str, id: &str) -> String { if id.is_empty() { - self.seqid_count += 1; - return format!("seqid-{}", self.seqid_count); + let prefix = prefix.trim().replace(" ", "_").to_lowercase(); + let prefix = if prefix.is_empty() { + "prefix".to_string() + } else { + prefix + }; + self.id_counter += 1; + [prefix, self.id_counter.to_string()].join("-") + } else { + id.to_string() } - id.to_string() } } diff --git a/src/core/response/page/component.rs b/src/core/response/page/component.rs index 097d960f..aebb1f43 100644 --- a/src/core/response/page/component.rs +++ b/src/core/response/page/component.rs @@ -9,6 +9,14 @@ pub trait Component: Downcast + Send + Sync { fn prepare() -> Self where Self: Sized; + fn name(&self) -> &str { + let name = type_name::<Self>(); + match name.rfind("::") { + Some(position) => &name[(position + 2)..], + None => name + } + } + fn qualified_name(&self) -> &str { type_name::<Self>() } diff --git a/src/core/state.rs b/src/core/state.rs index 307455a1..a53d8d80 100644 --- a/src/core/state.rs +++ b/src/core/state.rs @@ -39,6 +39,7 @@ pub fn register_theme(t: &'static (dyn Theme + 'static)) { pub static MODULES: Lazy<RwLock<Vec<&dyn Module>>> = Lazy::new(|| { RwLock::new(vec![ + &base::module::admin::AdminModule, &base::module::user::UserModule, ]) }); diff --git a/src/lib.rs b/src/lib.rs index 327379a9..42f51a3a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,11 +7,11 @@ pub use once_cell::sync::Lazy; // APIs públicas. // ----------------------------------------------------------------------------- -pub mod macros; // Macros útiles. pub mod config; // Gestión de la configuración. pub mod trace; // Traza de ejecución. pub mod locale; // Localización. pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. pub mod base; // Temas, Módulos y Componentes base. +pub mod util; // Macros y funciones útiles. pub mod prelude; // Re-exporta recursos comunes. diff --git a/src/macros/mod.rs b/src/macros/mod.rs deleted file mode 100644 index 88ab3f90..00000000 --- a/src/macros/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -#[macro_export] -/// Macro para construir grupos de pares clave-valor. -/// -/// ``` -/// let args = args![ -/// "userName" => "Roberto", -/// "photoCount" => 3, -/// "userGender" => "male" -/// ]; -/// ``` -macro_rules! args { - ( $($key:expr => $value:expr),* ) => {{ - let mut a = std::collections::HashMap::new(); - $( - a.insert(String::from($key), $value.into()); - )* - a - }}; -} diff --git a/src/prelude.rs b/src/prelude.rs index b4b62b18..4a66e08b 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,6 +1,8 @@ //! Re-exporta recursos comunes. pub use crate::args; +pub use crate::util; + pub use crate::config::SETTINGS; pub use crate::trace; pub use crate::localize; diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 00000000..638e948f --- /dev/null +++ b/src/util.rs @@ -0,0 +1,42 @@ +#[macro_export] +/// Macro para construir grupos de pares clave-valor. +/// +/// ``` +/// let args = args![ +/// "userName" => "Roberto", +/// "photoCount" => 3, +/// "userGender" => "male" +/// ]; +/// ``` +macro_rules! args { + ( $($key:expr => $value:expr),* ) => {{ + let mut a = std::collections::HashMap::new(); + $( + a.insert(String::from($key), $value.into()); + )* + a + }}; +} + +pub fn valid_id(id: &str) -> Option<String> { + let id = id.trim().replace(" ", "_").to_lowercase(); + match id.is_empty() { + true => None, + false => Some(id), + } +} + +pub fn optional_value(value: &str) -> Option<String> { + let value = value.to_string(); + match value.is_empty() { + true => None, + false => Some(value), + } +} + +pub fn assigned_value(value: &Option<String>) -> &str { + match value { + Some(value) => value.as_str(), + _ => "", + } +} diff --git a/static/theme/menu/css/menu-blue.css b/static/theme/menu/css/menu-blue.css new file mode 100644 index 00000000..4cff3bb5 --- /dev/null +++ b/static/theme/menu/css/menu-blue.css @@ -0,0 +1,333 @@ +@import url(https://fonts.googleapis.com/css?family=PT+Sans+Narrow:400,700); +.sm-blue { + background: transparent; + border-radius: 8px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); +} +.sm-blue a, .sm-blue a:hover, .sm-blue a:focus, .sm-blue a:active { + padding: 10px 20px; + /* make room for the toggle button (sub indicator) */ + padding-right: 58px; + background: #3092c0; + background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); + color: #fff; + font-family: "PT Sans Narrow", "Arial Narrow", Arial, Helvetica, sans-serif; + font-size: 18px; + font-weight: bold; + line-height: 23px; + text-decoration: none; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); +} +.sm-blue a.current { + background: #006892; + background-image: linear-gradient(to bottom, #006188, #006f9c); + color: #fff; +} +.sm-blue a.disabled { + color: #a1d1e8; +} +.sm-blue a .sub-arrow { + position: absolute; + top: 50%; + margin-top: -17px; + left: auto; + right: 4px; + width: 34px; + height: 34px; + overflow: hidden; + font: bold 16px/34px monospace !important; + text-align: center; + text-shadow: none; + background: rgba(0, 0, 0, 0.1); + border-radius: 4px; +} +.sm-blue a .sub-arrow::before { + content: '+'; +} +.sm-blue a.highlighted .sub-arrow::before { + content: '-'; +} +.sm-blue > li:first-child > a, .sm-blue > li:first-child > :not(ul) a { + border-radius: 8px 8px 0 0; +} +.sm-blue > li:last-child > a, .sm-blue > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul { + border-radius: 0 0 8px 8px; +} +.sm-blue > li:last-child > a.highlighted, .sm-blue > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted { + border-radius: 0; +} +.sm-blue ul { + background: #fff; +} +.sm-blue ul ul { + background: rgba(102, 102, 102, 0.1); +} +.sm-blue ul a, .sm-blue ul a:hover, .sm-blue ul a:focus, .sm-blue ul a:active { + background: transparent; + color: #2b82ac; + font-size: 16px; + text-shadow: none; + border-left: 8px solid transparent; +} +.sm-blue ul a.current { + background: #006892; + background-image: linear-gradient(to bottom, #006188, #006f9c); + color: #fff; +} +.sm-blue ul a.disabled { + color: #b3b3b3; +} +.sm-blue ul ul a, +.sm-blue ul ul a:hover, +.sm-blue ul ul a:focus, +.sm-blue ul ul a:active { + border-left: 16px solid transparent; +} +.sm-blue ul ul ul a, +.sm-blue ul ul ul a:hover, +.sm-blue ul ul ul a:focus, +.sm-blue ul ul ul a:active { + border-left: 24px solid transparent; +} +.sm-blue ul ul ul ul a, +.sm-blue ul ul ul ul a:hover, +.sm-blue ul ul ul ul a:focus, +.sm-blue ul ul ul ul a:active { + border-left: 32px solid transparent; +} +.sm-blue ul ul ul ul ul a, +.sm-blue ul ul ul ul ul a:hover, +.sm-blue ul ul ul ul ul a:focus, +.sm-blue ul ul ul ul ul a:active { + border-left: 40px solid transparent; +} +.sm-blue ul li { + border-top: 1px solid rgba(0, 0, 0, 0.05); +} +.sm-blue ul li:first-child { + border-top: 0; +} + +@media (min-width: 768px) { + /* Switch to desktop layout + ----------------------------------------------- + These transform the menu tree from + collapsible to desktop (navbar + dropdowns) + -----------------------------------------------*/ + /* start... (it's not recommended editing these rules) */ + .sm-blue ul { + position: absolute; + width: 12em; + } + + .sm-blue li { + float: left; + } + + .sm-blue.sm-rtl li { + float: right; + } + + .sm-blue ul li, .sm-blue.sm-rtl ul li, .sm-blue.sm-vertical li { + float: none; + } + + .sm-blue a { + white-space: nowrap; + } + + .sm-blue ul a, .sm-blue.sm-vertical a { + white-space: normal; + } + + .sm-blue .sm-nowrap > li > a, .sm-blue .sm-nowrap > li > :not(ul) a { + white-space: nowrap; + } + + /* ...end */ + .sm-blue { + background: #3092c0; + background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); + border-radius: 8px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + } + .sm-blue a, .sm-blue a:hover, .sm-blue a:focus, .sm-blue a:active, .sm-blue a.highlighted { + padding: 13px 24px; + background: #3092c0; + background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); + color: #fff; + } + .sm-blue a:hover, .sm-blue a:focus, .sm-blue a:active, .sm-blue a.highlighted { + background: #2b82ac; + background-image: linear-gradient(to bottom, #2d89b4, #297ca3); + } + .sm-blue a.current { + background: #006892; + background-image: linear-gradient(to bottom, #006188, #006f9c); + color: #fff; + } + .sm-blue a.disabled { + background: #3092c0; + background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); + color: #a1d1e8; + } + .sm-blue a .sub-arrow { + top: auto; + margin-top: 0; + bottom: 2px; + left: 50%; + margin-left: -5px; + right: auto; + width: 0; + height: 0; + border-width: 5px; + border-style: solid dashed dashed dashed; + border-color: #a1d1e8 transparent transparent transparent; + background: transparent; + border-radius: 0; + } + .sm-blue a .sub-arrow::before { + display: none; + } + .sm-blue > li:first-child > a, .sm-blue > li:first-child > :not(ul) a { + border-radius: 8px 0 0 8px; + } + .sm-blue > li:last-child > a, .sm-blue > li:last-child > :not(ul) a { + border-radius: 0 8px 8px 0 !important; + } + .sm-blue > li { + border-left: 1px solid #2b82ac; + } + .sm-blue > li:first-child { + border-left: 0; + } + .sm-blue ul { + border: 1px solid #a8a8a8; + padding: 7px 0; + background: #fff; + border-radius: 0 0 4px 4px !important; + box-shadow: 0 5px 12px rgba(0, 0, 0, 0.2); + } + .sm-blue ul ul { + border-radius: 4px !important; + background: #fff; + } + .sm-blue ul a, .sm-blue ul a:hover, .sm-blue ul a:focus, .sm-blue ul a:active, .sm-blue ul a.highlighted { + border: 0 !important; + padding: 9px 23px; + background: transparent; + color: #2b82ac; + border-radius: 0 !important; + } + .sm-blue ul a:hover, .sm-blue ul a:focus, .sm-blue ul a:active, .sm-blue ul a.highlighted { + background: #3092c0; + background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); + color: #fff; + } + .sm-blue ul a.current { + background: #006892; + background-image: linear-gradient(to bottom, #006188, #006f9c); + color: #fff; + } + .sm-blue ul a.disabled { + background: #fff; + color: #b3b3b3; + } + .sm-blue ul a .sub-arrow { + top: 50%; + margin-top: -5px; + bottom: auto; + left: auto; + margin-left: 0; + right: 10px; + border-style: dashed dashed dashed solid; + border-color: transparent transparent transparent #a1d1e8; + } + .sm-blue ul li { + border: 0; + } + .sm-blue .scroll-up, + .sm-blue .scroll-down { + position: absolute; + display: none; + visibility: hidden; + overflow: hidden; + background: #fff; + height: 20px; + } + .sm-blue .scroll-up-arrow, + .sm-blue .scroll-down-arrow { + position: absolute; + top: -2px; + left: 50%; + margin-left: -8px; + width: 0; + height: 0; + overflow: hidden; + border-width: 8px; + border-style: dashed dashed solid dashed; + border-color: transparent transparent #2b82ac transparent; + } + .sm-blue .scroll-down-arrow { + top: 6px; + border-style: solid dashed dashed dashed; + border-color: #2b82ac transparent transparent transparent; + } + .sm-blue.sm-rtl.sm-vertical a .sub-arrow { + right: auto; + left: 10px; + border-style: dashed solid dashed dashed; + border-color: transparent #a1d1e8 transparent transparent; + } + .sm-blue.sm-rtl > li:first-child > a, .sm-blue.sm-rtl > li:first-child > :not(ul) a { + border-radius: 0 8px 8px 0; + } + .sm-blue.sm-rtl > li:last-child > a, .sm-blue.sm-rtl > li:last-child > :not(ul) a { + border-radius: 8px 0 0 8px !important; + } + .sm-blue.sm-rtl > li:first-child { + border-left: 1px solid #2b82ac; + } + .sm-blue.sm-rtl > li:last-child { + border-left: 0; + } + .sm-blue.sm-rtl ul a .sub-arrow { + right: auto; + left: 10px; + border-style: dashed solid dashed dashed; + border-color: transparent #a1d1e8 transparent transparent; + } + .sm-blue.sm-vertical { + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + } + .sm-blue.sm-vertical a { + padding: 9px 23px; + } + .sm-blue.sm-vertical a .sub-arrow { + top: 50%; + margin-top: -5px; + bottom: auto; + left: auto; + margin-left: 0; + right: 10px; + border-style: dashed dashed dashed solid; + border-color: transparent transparent transparent #a1d1e8; + } + .sm-blue.sm-vertical > li:first-child > a, .sm-blue.sm-vertical > li:first-child > :not(ul) a { + border-radius: 8px 8px 0 0; + } + .sm-blue.sm-vertical > li:last-child > a, .sm-blue.sm-vertical > li:last-child > :not(ul) a { + border-radius: 0 0 8px 8px !important; + } + .sm-blue.sm-vertical > li { + border-left: 0 !important; + } + .sm-blue.sm-vertical ul { + border-radius: 4px !important; + } + .sm-blue.sm-vertical ul a { + padding: 9px 23px; + } +} + +/*# sourceMappingURL=sm-blue.css.map */ diff --git a/static/theme/menu/css/menu-clean.css b/static/theme/menu/css/menu-clean.css new file mode 100644 index 00000000..4fb39b72 --- /dev/null +++ b/static/theme/menu/css/menu-clean.css @@ -0,0 +1,327 @@ +.sm-clean { + background: #eeeeee; + border-radius: 5px; +} +.sm-clean a, .sm-clean a:hover, .sm-clean a:focus, .sm-clean a:active { + padding: 13px 20px; + /* make room for the toggle button (sub indicator) */ + padding-right: 58px; + color: #555555; + font-family: "Lucida Sans Unicode", "Lucida Sans", "Lucida Grande", Arial, sans-serif; + font-size: 18px; + font-weight: normal; + line-height: 17px; + text-decoration: none; +} +.sm-clean a.current { + color: #D23600; +} +.sm-clean a.disabled { + color: #bbbbbb; +} +.sm-clean a .sub-arrow { + position: absolute; + top: 50%; + margin-top: -17px; + left: auto; + right: 4px; + width: 34px; + height: 34px; + overflow: hidden; + font: bold 16px/34px monospace !important; + text-align: center; + text-shadow: none; + background: rgba(255, 255, 255, 0.5); + border-radius: 5px; +} +.sm-clean a .sub-arrow::before { + content: '+'; +} +.sm-clean a.highlighted .sub-arrow::before { + content: '-'; +} +.sm-clean > li:first-child > a, .sm-clean > li:first-child > :not(ul) a { + border-radius: 5px 5px 0 0; +} +.sm-clean > li:last-child > a, .sm-clean > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul { + border-radius: 0 0 5px 5px; +} +.sm-clean > li:last-child > a.highlighted, .sm-clean > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted { + border-radius: 0; +} +.sm-clean li { + border-top: 1px solid rgba(0, 0, 0, 0.05); +} +.sm-clean > li:first-child { + border-top: 0; +} +.sm-clean ul { + background: rgba(162, 162, 162, 0.1); +} +.sm-clean ul a, .sm-clean ul a:hover, .sm-clean ul a:focus, .sm-clean ul a:active { + font-size: 16px; + border-left: 8px solid transparent; +} +.sm-clean ul ul a, +.sm-clean ul ul a:hover, +.sm-clean ul ul a:focus, +.sm-clean ul ul a:active { + border-left: 16px solid transparent; +} +.sm-clean ul ul ul a, +.sm-clean ul ul ul a:hover, +.sm-clean ul ul ul a:focus, +.sm-clean ul ul ul a:active { + border-left: 24px solid transparent; +} +.sm-clean ul ul ul ul a, +.sm-clean ul ul ul ul a:hover, +.sm-clean ul ul ul ul a:focus, +.sm-clean ul ul ul ul a:active { + border-left: 32px solid transparent; +} +.sm-clean ul ul ul ul ul a, +.sm-clean ul ul ul ul ul a:hover, +.sm-clean ul ul ul ul ul a:focus, +.sm-clean ul ul ul ul ul a:active { + border-left: 40px solid transparent; +} + +@media (min-width: 768px) { + /* Switch to desktop layout + ----------------------------------------------- + These transform the menu tree from + collapsible to desktop (navbar + dropdowns) + -----------------------------------------------*/ + /* start... (it's not recommended editing these rules) */ + .sm-clean ul { + position: absolute; + width: 12em; + } + + .sm-clean li { + float: left; + } + + .sm-clean.sm-rtl li { + float: right; + } + + .sm-clean ul li, .sm-clean.sm-rtl ul li, .sm-clean.sm-vertical li { + float: none; + } + + .sm-clean a { + white-space: nowrap; + } + + .sm-clean ul a, .sm-clean.sm-vertical a { + white-space: normal; + } + + .sm-clean .sm-nowrap > li > a, .sm-clean .sm-nowrap > li > :not(ul) a { + white-space: nowrap; + } + + /* ...end */ + .sm-clean { + padding: 0 10px; + background: #eeeeee; + border-radius: 100px; + } + .sm-clean a, .sm-clean a:hover, .sm-clean a:focus, .sm-clean a:active, .sm-clean a.highlighted { + padding: 12px 12px; + color: #555555; + border-radius: 0 !important; + } + .sm-clean a:hover, .sm-clean a:focus, .sm-clean a:active, .sm-clean a.highlighted { + color: #D23600; + } + .sm-clean a.current { + color: #D23600; + } + .sm-clean a.disabled { + color: #bbbbbb; + } + .sm-clean a.has-submenu { + padding-right: 24px; + } + .sm-clean a .sub-arrow { + top: 50%; + margin-top: -2px; + right: 12px; + width: 0; + height: 0; + border-width: 4px; + border-style: solid dashed dashed dashed; + border-color: #555555 transparent transparent transparent; + background: transparent; + border-radius: 0; + } + .sm-clean a .sub-arrow::before { + display: none; + } + .sm-clean li { + border-top: 0; + } + .sm-clean > li > ul::before, + .sm-clean > li > ul::after { + content: ''; + position: absolute; + top: -18px; + left: 30px; + width: 0; + height: 0; + overflow: hidden; + border-width: 9px; + border-style: dashed dashed solid dashed; + border-color: transparent transparent #bbbbbb transparent; + } + .sm-clean > li > ul::after { + top: -16px; + left: 31px; + border-width: 8px; + border-color: transparent transparent #fff transparent; + } + .sm-clean ul { + border: 1px solid #bbbbbb; + padding: 5px 0; + background: #fff; + border-radius: 5px !important; + box-shadow: 0 5px 9px rgba(0, 0, 0, 0.2); + } + .sm-clean ul a, .sm-clean ul a:hover, .sm-clean ul a:focus, .sm-clean ul a:active, .sm-clean ul a.highlighted { + border: 0 !important; + padding: 10px 20px; + color: #555555; + } + .sm-clean ul a:hover, .sm-clean ul a:focus, .sm-clean ul a:active, .sm-clean ul a.highlighted { + background: #eeeeee; + color: #D23600; + } + .sm-clean ul a.current { + color: #D23600; + } + .sm-clean ul a.disabled { + background: #fff; + color: #cccccc; + } + .sm-clean ul a.has-submenu { + padding-right: 20px; + } + .sm-clean ul a .sub-arrow { + right: 8px; + top: 50%; + margin-top: -5px; + border-width: 5px; + border-style: dashed dashed dashed solid; + border-color: transparent transparent transparent #555555; + } + .sm-clean .scroll-up, + .sm-clean .scroll-down { + position: absolute; + display: none; + visibility: hidden; + overflow: hidden; + background: #fff; + height: 20px; + } + .sm-clean .scroll-up:hover, + .sm-clean .scroll-down:hover { + background: #eeeeee; + } + .sm-clean .scroll-up:hover .scroll-up-arrow { + border-color: transparent transparent #D23600 transparent; + } + .sm-clean .scroll-down:hover .scroll-down-arrow { + border-color: #D23600 transparent transparent transparent; + } + .sm-clean .scroll-up-arrow, + .sm-clean .scroll-down-arrow { + position: absolute; + top: 0; + left: 50%; + margin-left: -6px; + width: 0; + height: 0; + overflow: hidden; + border-width: 6px; + border-style: dashed dashed solid dashed; + border-color: transparent transparent #555555 transparent; + } + .sm-clean .scroll-down-arrow { + top: 8px; + border-style: solid dashed dashed dashed; + border-color: #555555 transparent transparent transparent; + } + .sm-clean.sm-rtl a.has-submenu { + padding-right: 12px; + padding-left: 24px; + } + .sm-clean.sm-rtl a .sub-arrow { + right: auto; + left: 12px; + } + .sm-clean.sm-rtl.sm-vertical a.has-submenu { + padding: 10px 20px; + } + .sm-clean.sm-rtl.sm-vertical a .sub-arrow { + right: auto; + left: 8px; + border-style: dashed solid dashed dashed; + border-color: transparent #555555 transparent transparent; + } + .sm-clean.sm-rtl > li > ul::before { + left: auto; + right: 30px; + } + .sm-clean.sm-rtl > li > ul::after { + left: auto; + right: 31px; + } + .sm-clean.sm-rtl ul a.has-submenu { + padding: 10px 20px !important; + } + .sm-clean.sm-rtl ul a .sub-arrow { + right: auto; + left: 8px; + border-style: dashed solid dashed dashed; + border-color: transparent #555555 transparent transparent; + } + .sm-clean.sm-vertical { + padding: 10px 0; + border-radius: 5px; + } + .sm-clean.sm-vertical a { + padding: 10px 20px; + } + .sm-clean.sm-vertical a:hover, .sm-clean.sm-vertical a:focus, .sm-clean.sm-vertical a:active, .sm-clean.sm-vertical a.highlighted { + background: #fff; + } + .sm-clean.sm-vertical a.disabled { + background: #eeeeee; + } + .sm-clean.sm-vertical a .sub-arrow { + right: 8px; + top: 50%; + margin-top: -5px; + border-width: 5px; + border-style: dashed dashed dashed solid; + border-color: transparent transparent transparent #555555; + } + .sm-clean.sm-vertical > li > ul::before, + .sm-clean.sm-vertical > li > ul::after { + display: none; + } + .sm-clean.sm-vertical ul a { + padding: 10px 20px; + } + .sm-clean.sm-vertical ul a:hover, .sm-clean.sm-vertical ul a:focus, .sm-clean.sm-vertical ul a:active, .sm-clean.sm-vertical ul a.highlighted { + background: #eeeeee; + } + .sm-clean.sm-vertical ul a.disabled { + background: #fff; + } +} + +/*# sourceMappingURL=sm-clean.css.map */ diff --git a/static/theme/menu/css/menu-mint.css b/static/theme/menu/css/menu-mint.css new file mode 100644 index 00000000..1ab65555 --- /dev/null +++ b/static/theme/menu/css/menu-mint.css @@ -0,0 +1,331 @@ +.sm-mint { + border-top: 2px solid #8db863; + border-bottom: 2px solid #8db863; + background: #fff; +} +.sm-mint a, .sm-mint a:hover, .sm-mint a:focus, .sm-mint a:active { + padding: 13px 20px; + /* make room for the toggle button (sub indicator) */ + padding-right: 58px; + color: #333; + font-family: Arial, sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 17px; + text-decoration: none; +} +.sm-mint a.current { + font-weight: bold; +} +.sm-mint a.disabled { + color: #cccccc; +} +.sm-mint a .sub-arrow { + position: absolute; + top: 50%; + margin-top: -17px; + left: auto; + right: 4px; + width: 34px; + height: 34px; + overflow: hidden; + font: bold 14px/34px monospace !important; + text-align: center; + text-shadow: none; + background: rgba(141, 184, 99, 0.2); + border-radius: 4px; +} +.sm-mint a .sub-arrow::before { + content: '+'; +} +.sm-mint a.highlighted .sub-arrow::before { + content: '-'; +} +.sm-mint li { + border-top: 1px solid rgba(141, 184, 99, 0.2); +} +.sm-mint > li:first-child { + border-top: 0; +} +.sm-mint ul { + background: rgba(141, 184, 99, 0.2); +} +.sm-mint ul a, .sm-mint ul a:hover, .sm-mint ul a:focus, .sm-mint ul a:active { + font-size: 14px; + border-left: 8px solid transparent; +} +.sm-mint ul ul a, +.sm-mint ul ul a:hover, +.sm-mint ul ul a:focus, +.sm-mint ul ul a:active { + border-left: 16px solid transparent; +} +.sm-mint ul ul ul a, +.sm-mint ul ul ul a:hover, +.sm-mint ul ul ul a:focus, +.sm-mint ul ul ul a:active { + border-left: 24px solid transparent; +} +.sm-mint ul ul ul ul a, +.sm-mint ul ul ul ul a:hover, +.sm-mint ul ul ul ul a:focus, +.sm-mint ul ul ul ul a:active { + border-left: 32px solid transparent; +} +.sm-mint ul ul ul ul ul a, +.sm-mint ul ul ul ul ul a:hover, +.sm-mint ul ul ul ul ul a:focus, +.sm-mint ul ul ul ul ul a:active { + border-left: 40px solid transparent; +} + +@media (min-width: 768px) { + /* Switch to desktop layout + ----------------------------------------------- + These transform the menu tree from + collapsible to desktop (navbar + dropdowns) + -----------------------------------------------*/ + /* start... (it's not recommended editing these rules) */ + .sm-mint ul { + position: absolute; + width: 12em; + } + + .sm-mint li { + float: left; + } + + .sm-mint.sm-rtl li { + float: right; + } + + .sm-mint ul li, .sm-mint.sm-rtl ul li, .sm-mint.sm-vertical li { + float: none; + } + + .sm-mint a { + white-space: nowrap; + } + + .sm-mint ul a, .sm-mint.sm-vertical a { + white-space: normal; + } + + .sm-mint .sm-nowrap > li > a, .sm-mint .sm-nowrap > li > :not(ul) a { + white-space: nowrap; + } + + /* ...end */ + .sm-mint { + border-top: 0; + background: transparent; + } + .sm-mint a, .sm-mint a:hover, .sm-mint a:focus, .sm-mint a:active, .sm-mint a.highlighted { + padding: 11px 20px; + color: #333; + border-radius: 4px 4px 0 0; + } + .sm-mint a:hover, .sm-mint a:focus, .sm-mint a:active { + background: #8db863; + color: #fff; + } + .sm-mint a.highlighted { + background: #F6FFED; + color: #333; + box-shadow: 0 4px 3px rgba(0, 0, 0, 0.25); + } + .sm-mint a.disabled { + background: transparent; + color: #cccccc; + box-shadow: none; + } + .sm-mint a.has-submenu { + padding-right: 34px; + } + .sm-mint a .sub-arrow { + top: 50%; + margin-top: -3px; + right: 20px; + width: 0; + height: 0; + border-width: 6px 4.02px 0 4.02px; + border-style: solid dashed dashed dashed; + border-color: #8db863 transparent transparent transparent; + background: transparent; + border-radius: 0; + } + .sm-mint a:hover .sub-arrow, .sm-mint a:focus .sub-arrow, .sm-mint a:active .sub-arrow { + border-color: #fff transparent transparent transparent; + } + .sm-mint a.highlighted .sub-arrow { + border-color: #8db863 transparent transparent transparent; + } + .sm-mint a.disabled .sub-arrow { + border-color: #8db863 transparent transparent transparent; + } + .sm-mint a .sub-arrow::before { + display: none; + } + .sm-mint li { + border-top: 0; + } + .sm-mint ul { + border: 0; + padding: 8px 0; + background: #F6FFED; + border-radius: 0 4px 4px 4px; + box-shadow: 0 4px 3px rgba(0, 0, 0, 0.25); + } + .sm-mint ul ul { + border-radius: 4px; + } + .sm-mint ul a, .sm-mint ul a:hover, .sm-mint ul a:focus, .sm-mint ul a:active, .sm-mint ul a.highlighted { + border: 0 !important; + padding: 10px 20px; + color: #333; + border-radius: 0; + } + .sm-mint ul a:hover, .sm-mint ul a:focus, .sm-mint ul a:active, .sm-mint ul a.highlighted { + background: #8db863; + color: #fff; + box-shadow: none; + } + .sm-mint ul a.disabled { + background: transparent; + color: #b3b3b3; + } + .sm-mint ul a.has-submenu { + padding-right: 20px; + } + .sm-mint ul a .sub-arrow { + right: 10px; + margin-top: -4.02px; + border-width: 4.02px 0 4.02px 6px; + border-style: dashed dashed dashed solid; + border-color: transparent transparent transparent #8db863; + } + .sm-mint ul a:hover .sub-arrow, .sm-mint ul a:focus .sub-arrow, .sm-mint ul a:active .sub-arrow, .sm-mint ul a.highlighted .sub-arrow { + border-color: transparent transparent transparent #fff; + } + .sm-mint ul a.disabled .sub-arrow { + border-color: transparent transparent transparent #8db863; + } + .sm-mint .scroll-up, + .sm-mint .scroll-down { + position: absolute; + display: none; + visibility: hidden; + overflow: hidden; + background: #F6FFED; + height: 20px; + } + .sm-mint .scroll-up-arrow, + .sm-mint .scroll-down-arrow { + position: absolute; + top: 6px; + left: 50%; + margin-left: -8px; + width: 0; + height: 0; + overflow: hidden; + border-width: 0 6px 8px 6px; + border-style: dashed dashed solid dashed; + border-color: transparent transparent #8db863 transparent; + } + .sm-mint .scroll-down-arrow { + border-width: 8px 6px 0 6px; + border-style: solid dashed dashed dashed; + border-color: #8db863 transparent transparent transparent; + } + .sm-mint.sm-rtl a.has-submenu { + padding-right: 20px; + padding-left: 34px; + } + .sm-mint.sm-rtl a .sub-arrow { + right: auto; + left: 20px; + } + .sm-mint.sm-rtl.sm-vertical { + border-right: 0; + border-left: 2px solid #8db863; + } + .sm-mint.sm-rtl.sm-vertical a { + border-radius: 0 4px 4px 0; + } + .sm-mint.sm-rtl.sm-vertical a.has-submenu { + padding: 10px 20px; + } + .sm-mint.sm-rtl.sm-vertical a .sub-arrow { + right: auto; + left: 10px; + border-width: 4.02px 6px 4.02px 0; + border-style: dashed solid dashed dashed; + border-color: transparent #8db863 transparent transparent; + } + .sm-mint.sm-rtl.sm-vertical a:hover .sub-arrow, .sm-mint.sm-rtl.sm-vertical a:focus .sub-arrow, .sm-mint.sm-rtl.sm-vertical a:active .sub-arrow, .sm-mint.sm-rtl.sm-vertical a.highlighted .sub-arrow { + border-color: transparent #fff transparent transparent; + } + .sm-mint.sm-rtl.sm-vertical a.disabled .sub-arrow { + border-color: transparent #8db863 transparent transparent; + } + .sm-mint.sm-rtl ul { + border-radius: 4px 0 4px 4px; + } + .sm-mint.sm-rtl ul a { + border-radius: 0 !important; + } + .sm-mint.sm-rtl ul a.has-submenu { + padding: 10px 20px !important; + } + .sm-mint.sm-rtl ul a .sub-arrow { + right: auto; + left: 10px; + border-width: 4.02px 6px 4.02px 0; + border-style: dashed solid dashed dashed; + border-color: transparent #8db863 transparent transparent; + } + .sm-mint.sm-rtl ul a:hover .sub-arrow, .sm-mint.sm-rtl ul a:focus .sub-arrow, .sm-mint.sm-rtl ul a:active .sub-arrow, .sm-mint.sm-rtl ul a.highlighted .sub-arrow { + border-color: transparent #fff transparent transparent; + } + .sm-mint.sm-rtl ul a.disabled .sub-arrow { + border-color: transparent #8db863 transparent transparent; + } + .sm-mint.sm-vertical { + border-bottom: 0; + border-right: 2px solid #8db863; + } + .sm-mint.sm-vertical a { + padding: 10px 20px; + border-radius: 4px 0 0 4px; + } + .sm-mint.sm-vertical a:hover, .sm-mint.sm-vertical a:focus, .sm-mint.sm-vertical a:active, .sm-mint.sm-vertical a.highlighted { + background: #8db863; + color: #fff; + box-shadow: none; + } + .sm-mint.sm-vertical a.disabled { + background: transparent; + color: #cccccc; + } + .sm-mint.sm-vertical a .sub-arrow { + right: 10px; + margin-top: -4.02px; + border-width: 4.02px 0 4.02px 6px; + border-style: dashed dashed dashed solid; + border-color: transparent transparent transparent #8db863; + } + .sm-mint.sm-vertical a:hover .sub-arrow, .sm-mint.sm-vertical a:focus .sub-arrow, .sm-mint.sm-vertical a:active .sub-arrow, .sm-mint.sm-vertical a.highlighted .sub-arrow { + border-color: transparent transparent transparent #fff; + } + .sm-mint.sm-vertical a.disabled .sub-arrow { + border-color: transparent transparent transparent #8db863; + } + .sm-mint.sm-vertical ul { + border-radius: 4px !important; + } + .sm-mint.sm-vertical ul a { + padding: 10px 20px; + } +} + +/*# sourceMappingURL=sm-mint.css.map */ diff --git a/static/theme/menu/css/menu-simple.css b/static/theme/menu/css/menu-simple.css new file mode 100644 index 00000000..8fcf0c15 --- /dev/null +++ b/static/theme/menu/css/menu-simple.css @@ -0,0 +1,249 @@ +.sm-simple { + border: 1px solid #bbbbbb; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} +.sm-simple a, .sm-simple a:hover, .sm-simple a:focus, .sm-simple a:active { + padding: 13px 20px; + /* make room for the toggle button (sub indicator) */ + padding-right: 58px; + color: #555555; + font-family: "Lucida Sans Unicode", "Lucida Sans", "Lucida Grande", Arial, sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 17px; + text-decoration: none; +} +.sm-simple a.current { + background: #555555; + color: #fff; +} +.sm-simple a.disabled { + color: #cccccc; +} +.sm-simple a .sub-arrow { + position: absolute; + top: 50%; + margin-top: -17px; + left: auto; + right: 4px; + width: 34px; + height: 34px; + overflow: hidden; + font: bold 14px/34px monospace !important; + text-align: center; + text-shadow: none; + background: rgba(0, 0, 0, 0.08); +} +.sm-simple a .sub-arrow::before { + content: '+'; +} +.sm-simple a.highlighted .sub-arrow::before { + content: '-'; +} +.sm-simple li { + border-top: 1px solid rgba(0, 0, 0, 0.05); +} +.sm-simple > li:first-child { + border-top: 0; +} +.sm-simple ul { + background: rgba(179, 179, 179, 0.1); +} +.sm-simple ul a, .sm-simple ul a:hover, .sm-simple ul a:focus, .sm-simple ul a:active { + font-size: 14px; + border-left: 8px solid transparent; +} +.sm-simple ul ul a, +.sm-simple ul ul a:hover, +.sm-simple ul ul a:focus, +.sm-simple ul ul a:active { + border-left: 16px solid transparent; +} +.sm-simple ul ul ul a, +.sm-simple ul ul ul a:hover, +.sm-simple ul ul ul a:focus, +.sm-simple ul ul ul a:active { + border-left: 24px solid transparent; +} +.sm-simple ul ul ul ul a, +.sm-simple ul ul ul ul a:hover, +.sm-simple ul ul ul ul a:focus, +.sm-simple ul ul ul ul a:active { + border-left: 32px solid transparent; +} +.sm-simple ul ul ul ul ul a, +.sm-simple ul ul ul ul ul a:hover, +.sm-simple ul ul ul ul ul a:focus, +.sm-simple ul ul ul ul ul a:active { + border-left: 40px solid transparent; +} + +@media (min-width: 768px) { + /* Switch to desktop layout + ----------------------------------------------- + These transform the menu tree from + collapsible to desktop (navbar + dropdowns) + -----------------------------------------------*/ + /* start... (it's not recommended editing these rules) */ + .sm-simple ul { + position: absolute; + width: 12em; + } + + .sm-simple li { + float: left; + } + + .sm-simple.sm-rtl li { + float: right; + } + + .sm-simple ul li, .sm-simple.sm-rtl ul li, .sm-simple.sm-vertical li { + float: none; + } + + .sm-simple a { + white-space: nowrap; + } + + .sm-simple ul a, .sm-simple.sm-vertical a { + white-space: normal; + } + + .sm-simple .sm-nowrap > li > a, .sm-simple .sm-nowrap > li > :not(ul) a { + white-space: nowrap; + } + + /* ...end */ + .sm-simple { + background: #fff; + } + .sm-simple a, .sm-simple a:hover, .sm-simple a:focus, .sm-simple a:active, .sm-simple a.highlighted { + padding: 11px 20px; + color: #555555; + } + .sm-simple a:hover, .sm-simple a:focus, .sm-simple a:active, .sm-simple a.highlighted { + background: #eeeeee; + } + .sm-simple a.current { + background: #555555; + color: #fff; + } + .sm-simple a.disabled { + background: #fff; + color: #cccccc; + } + .sm-simple a.has-submenu { + padding-right: 32px; + } + .sm-simple a .sub-arrow { + top: 50%; + margin-top: -8px; + right: 20px; + width: 8px; + height: 16px; + font: 14px/16px monospace !important; + background: transparent; + } + .sm-simple a.highlighted .sub-arrow::before { + content: '+'; + } + .sm-simple > li { + border-top: 0; + border-left: 1px solid #eeeeee; + } + .sm-simple > li:first-child { + border-left: 0; + } + .sm-simple ul { + border: 1px solid #bbbbbb; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + } + .sm-simple ul a { + border: 0 !important; + } + .sm-simple ul a.has-submenu { + padding-right: 20px; + } + .sm-simple ul a .sub-arrow { + left: 8px; + right: auto; + } + .sm-simple ul > li { + border-left: 0; + border-top: 1px solid #eeeeee; + } + .sm-simple ul > li:first-child { + border-top: 0; + } + .sm-simple .scroll-up, + .sm-simple .scroll-down { + position: absolute; + display: none; + visibility: hidden; + overflow: hidden; + background: #fff; + height: 20px; + } + .sm-simple .scroll-up-arrow, + .sm-simple .scroll-down-arrow { + position: absolute; + top: -2px; + left: 50%; + margin-left: -8px; + width: 0; + height: 0; + overflow: hidden; + border-width: 8px; + border-style: dashed dashed solid dashed; + border-color: transparent transparent #555555 transparent; + } + .sm-simple .scroll-down-arrow { + top: 6px; + border-style: solid dashed dashed dashed; + border-color: #555555 transparent transparent transparent; + } + .sm-simple.sm-rtl a.has-submenu { + padding-right: 20px; + padding-left: 32px; + } + .sm-simple.sm-rtl a .sub-arrow { + left: 20px; + right: auto; + } + .sm-simple.sm-rtl.sm-vertical a.has-submenu { + padding: 11px 20px; + } + .sm-simple.sm-rtl.sm-vertical a .sub-arrow { + left: auto; + right: 8px; + } + .sm-simple.sm-rtl > li:first-child { + border-left: 1px solid #eeeeee; + } + .sm-simple.sm-rtl > li:last-child { + border-left: 0; + } + .sm-simple.sm-rtl ul a.has-submenu { + padding: 11px 20px; + } + .sm-simple.sm-rtl ul a .sub-arrow { + left: auto; + right: 8px; + } + .sm-simple.sm-vertical a .sub-arrow { + left: 8px; + right: auto; + } + .sm-simple.sm-vertical li { + border-left: 0; + border-top: 1px solid #eeeeee; + } + .sm-simple.sm-vertical > li:first-child { + border-top: 0; + } +} + +/*# sourceMappingURL=sm-simple.css.map */ diff --git a/static/theme/menu/css/menu.css b/static/theme/menu/css/menu.css new file mode 100644 index 00000000..95cdf757 --- /dev/null +++ b/static/theme/menu/css/menu.css @@ -0,0 +1,58 @@ +.sm { + box-sizing: border-box; + position: relative; + z-index: 9999; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +.sm, +.sm ul, +.sm li { + display: block; + list-style: none; + margin: 0; + padding: 0; + line-height: normal; + direction: ltr; + text-align: left; +} +.sm-rtl, +.sm-rtl ul, +.sm-rtl li { + direction: rtl; + text-align: right; +} +.sm > li > h1, +.sm > li > h2, +.sm > li > h3, +.sm > li > h4, +.sm > li > h5, +.sm > li > h6 { + margin: 0; + padding: 0; +} +.sm ul { + display: none; +} +.sm li, +.sm a { + position: relative; +} +.sm a { + display: block; +} +.sm a.disabled { + cursor: default; +} +.sm::after { + content: ""; + display: block; + height: 0; + font: 0px/0 serif; + clear: both; + overflow: hidden; +} +.sm *, +.sm *::before, +.sm *::after { + box-sizing: inherit; +} diff --git a/static/theme/menu/js/menu.min.js b/static/theme/menu/js/menu.min.js new file mode 100644 index 00000000..d60d33c5 --- /dev/null +++ b/static/theme/menu/js/menu.min.js @@ -0,0 +1,3 @@ +/*! SmartMenus jQuery Plugin - v1.1.1 - July 23, 2020 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&4>=o&&4>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("<span/>").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a:not(.mega-menu a)").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=e.dataSM("sub"),s=i?2==i.dataSM("level"):!1;if(i){var o=$(t.target).is(".sub-arrow"),a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(i.is(":visible")){if(!a&&this.opts.showOnClick&&s)return this.menuHide(i),this.clickActivated=!1,this.focusActivated=!1,!1;if(a&&(n||o))return this.itemActivate(e,h),this.menuHide(i),!1}else if((!r||!a||o)&&(!a&&this.opts.showOnClick&&s&&(this.clickActivated=!0),this.itemActivate(e,h),i.is(":visible")))return this.focusActivated=!0,!1}return!a&&this.opts.showOnClick&&s||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),w=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),M=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=w?d-r-M:M,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=w?M-r:d-M,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(w&&f>y?e=g?f-y+e:d-M:!w&&y+r>f+b&&(e=g?f+b-r-y+e:M-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],$('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y<o.upEnd)&&a.eq(o.up?1:0).show(),o.y==n)mouse&&a.eq(o.up?0:1).hide(),this.menuScrollStop(t);else if(!e){this.opts.scrollAccelerate&&o.step<this.opts.scrollStep&&(o.step+=.2);var h=this;this.scrollTimeout=requestAnimationFrame(function(){h.menuScroll(t)})}},menuScrollMousewheel:function(t,e){if(this.getClosestMenu(e.target)==t[0]){e=e.originalEvent;var i=(e.wheelDelta||-e.detail)>0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts&&"object"!=typeof dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file From 3764f707daa61b0c84325206ac8bf04425fcc9c2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 26 Feb 2022 21:15:00 +0100 Subject: [PATCH 015/853] =?UTF-8?q?A=C3=B1ade=20elecci=C3=B3n=20de=20tema?= =?UTF-8?q?=20espec=C3=ADfico=20por=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Característica útil para facilitar que el módulo Admin pueda renderizar sus páginas siempre con el mismo tema, indepedientemente del tema por defecto. También podrá ser decisivo para permitir a los usuarios usar un tema diferente. --- src/base/module/admin/summary.rs | 3 ++ src/core/all.rs | 55 ++++++++++++++++++++++++-- src/core/mod.rs | 5 --- src/core/module/mod.rs | 14 +++++++ src/core/response/page/assets.rs | 18 ++++++++- src/core/response/page/mod.rs | 11 ++++++ src/core/response/page/page.rs | 19 ++++++--- src/core/server/main.rs | 3 +- src/core/state.rs | 67 -------------------------------- src/core/theme/mod.rs | 14 +++++++ src/prelude.rs | 4 +- 11 files changed, 127 insertions(+), 86 deletions(-) delete mode 100644 src/core/state.rs diff --git a/src/base/module/admin/summary.rs b/src/base/module/admin/summary.rs index 6f620fd0..a6fe5e5d 100644 --- a/src/base/module/admin/summary.rs +++ b/src/base/module/admin/summary.rs @@ -32,6 +32,9 @@ pub async fn summary() -> server::Result<Markup> { .add(MenuItem::label("Opción 4")); Page::prepare() + + .using_theme(&bootsier::BootsierTheme) + .with_title("Admin") .add_to("top-menu", top_menu) diff --git a/src/core/all.rs b/src/core/all.rs index 3fe712b6..3174fc5f 100644 --- a/src/core/all.rs +++ b/src/core/all.rs @@ -1,20 +1,69 @@ -use crate::core::{server, state}; +use crate::Lazy; +use crate::config::SETTINGS; +use crate::core::theme::Theme; +use crate::core::module::Module; +use crate::core::response::page::PageContainer; +use crate::core::server; +use crate::base; + +use std::sync::RwLock; +use std::collections::HashMap; include!(concat!(env!("OUT_DIR"), "/theme.rs")); +// ----------------------------------------------------------------------------- +// Temas registrados y tema por defecto. +// ----------------------------------------------------------------------------- + +pub static THEMES: Lazy<RwLock<Vec<&dyn Theme>>> = Lazy::new(|| { + RwLock::new(vec![ + &base::theme::aliner::AlinerTheme, + &base::theme::minimal::MinimalTheme, + &base::theme::bootsier::BootsierTheme, + ]) +}); + +pub static DEFAULT_THEME: Lazy<&dyn Theme> = Lazy::new(|| { + for t in THEMES.read().unwrap().iter() { + if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { + return *t; + } + } + &base::theme::bootsier::BootsierTheme +}); + pub fn themes(cfg: &mut server::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( "/theme", assets() )); - for t in state::THEMES.read().unwrap().iter() { + for t in THEMES.read().unwrap().iter() { t.configure_theme(cfg); } } +// ----------------------------------------------------------------------------- +// Módulos registrados. +// ----------------------------------------------------------------------------- + +pub static MODULES: Lazy<RwLock<Vec<&dyn Module>>> = Lazy::new(|| { + RwLock::new(vec![ + &base::module::admin::AdminModule, + &base::module::user::UserModule, + ]) +}); + pub fn modules(cfg: &mut server::web::ServiceConfig) { - for m in state::MODULES.read().unwrap().iter() { + for m in MODULES.read().unwrap().iter() { m.configure_module(cfg); } } + +// ----------------------------------------------------------------------------- +// Componentes globales. +// ----------------------------------------------------------------------------- + +pub static COMPONENTS: Lazy<RwLock<HashMap<&str, PageContainer>>> = Lazy::new( + || { RwLock::new(HashMap::new()) } +); diff --git a/src/core/mod.rs b/src/core/mod.rs index de375c10..40530f15 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,10 +1,5 @@ pub use actix_web::dev::Server; -mod state; -pub use state::register_theme; -pub use state::register_module; -pub use state::add_component_to; - mod all; pub mod theme; diff --git a/src/core/module/mod.rs b/src/core/module/mod.rs index a8f85139..c77e530e 100644 --- a/src/core/module/mod.rs +++ b/src/core/module/mod.rs @@ -1,2 +1,16 @@ +use crate::core::all::MODULES; + mod api; pub use api::Module; + +pub fn register_module(m: &'static (dyn Module + 'static)) { + MODULES.write().unwrap().push(m); +} + +pub fn find_module(name: &str) -> Option<&'static (dyn Module + 'static)> { + let modules = MODULES.write().unwrap(); + match modules.iter().find(|t| t.name() == name) { + Some(module) => Some(*module), + _ => None, + } +} diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index 8d929f79..c515bb04 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -1,4 +1,5 @@ -use crate::core::theme::{Markup, PreEscaped, html}; +use crate::core::all::DEFAULT_THEME; +use crate::core::theme::{Markup, PreEscaped, Theme, html}; // ----------------------------------------------------------------------------- // Favicon. @@ -172,6 +173,7 @@ impl JavaScript { // ----------------------------------------------------------------------------- pub struct Assets { + theme : &'static dyn Theme, favicon : Option<Favicon>, metadata : Vec<(String, String)>, stylesheets: Vec<StyleSheet>, @@ -183,6 +185,7 @@ pub struct Assets { impl Assets { pub fn new() -> Self { Assets { + theme : *DEFAULT_THEME, favicon : None, metadata : Vec::new(), stylesheets: Vec::new(), @@ -192,6 +195,11 @@ impl Assets { } } + pub fn using_theme(&mut self, theme: &'static dyn Theme) -> &mut Self { + self.theme = theme; + self + } + pub fn with_favicon(&mut self, favicon: Favicon) -> &mut Self { self.favicon = Some(favicon); self @@ -238,6 +246,14 @@ impl Assets { self } + /// Assets GETTERS. + + pub fn theme(&mut self) -> &'static dyn Theme { + self.theme + } + + /// Assets RENDER. + pub fn render(&mut self) -> Markup { let ordered_css = &mut self.stylesheets; ordered_css.sort_by_key(|o| o.weight); diff --git a/src/core/response/page/mod.rs b/src/core/response/page/mod.rs index 881e0df3..83f0e0e9 100644 --- a/src/core/response/page/mod.rs +++ b/src/core/response/page/mod.rs @@ -1,3 +1,5 @@ +use crate::core::all::COMPONENTS; + pub mod assets; pub use assets::Assets as PageAssets; @@ -10,3 +12,12 @@ pub use container::Container as PageContainer; mod page; pub use page::Page; pub use page::render_component; + +pub fn add_component_to(region: &'static str, component: impl PageComponent) { + let mut hmap = COMPONENTS.write().unwrap(); + if let Some(regions) = hmap.get_mut(region) { + regions.add(component); + } else { + hmap.insert(region, PageContainer::new_with(component)); + } +} diff --git a/src/core/response/page/page.rs b/src/core/response/page/page.rs index add4c64d..dea08591 100644 --- a/src/core/response/page/page.rs +++ b/src/core/response/page/page.rs @@ -1,7 +1,7 @@ use crate::config::SETTINGS; use crate::core::server; -use crate::core::state::{COMPONENTS, THEME}; -use crate::core::theme::{DOCTYPE, Markup, html}; +use crate::core::all::COMPONENTS; +use crate::core::theme::{DOCTYPE, Markup, Theme, html}; use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; use std::borrow::Cow; @@ -132,13 +132,13 @@ impl<'a> Page<'a> { pub fn render(&mut self) -> server::Result<Markup> { // Acciones del tema antes de renderizar la página. - THEME.before_render_page(self); + self.assets.theme().before_render_page(self); // Primero, renderizar el cuerpo. - let body = THEME.render_page_body(self); + let body = self.assets.theme().render_page_body(self); // Luego, renderizar la cabecera. - let head = THEME.render_page_head(self); + let head = self.assets.theme().render_page_head(self); // Finalmente, renderizar la página. return Ok(html! { @@ -156,6 +156,13 @@ impl<'a> Page<'a> { None => html! {} } } + + // Page EXTRAS. + + pub fn using_theme(&mut self, theme: &'static dyn Theme) -> &mut Self { + self.assets.using_theme(theme); + self + } } pub fn render_component( @@ -163,7 +170,7 @@ pub fn render_component( assets: &mut PageAssets ) -> Markup { match component.is_renderable() { - true => match THEME.render_component(component, assets) { + true => match assets.theme().render_component(component, assets) { Some(markup) => markup, None => component.default_render(assets) }, diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 8616158e..2c8e2d37 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,6 +1,7 @@ use crate::{base, trace}; use crate::config::SETTINGS; -use crate::core::{Server, all, register_module, server}; +use crate::core::{Server, all, server}; +use crate::core::module::register_module; use tracing_log::LogTracer; use tracing_subscriber::{EnvFilter, Registry}; diff --git a/src/core/state.rs b/src/core/state.rs deleted file mode 100644 index a53d8d80..00000000 --- a/src/core/state.rs +++ /dev/null @@ -1,67 +0,0 @@ -use crate::Lazy; -use crate::config::SETTINGS; -use crate::core::theme::Theme; -use crate::core::module::Module; -use crate::core::response::page::{PageComponent, PageContainer}; -use crate::base; - -use std::sync::RwLock; -use std::collections::HashMap; - -// ----------------------------------------------------------------------------- -// Temas registrados. -// ----------------------------------------------------------------------------- - -pub static THEMES: Lazy<RwLock<Vec<&dyn Theme>>> = Lazy::new(|| { - RwLock::new(vec![ - &base::theme::aliner::AlinerTheme, - &base::theme::minimal::MinimalTheme, - &base::theme::bootsier::BootsierTheme, - ]) -}); - -pub static THEME: Lazy<&dyn Theme> = Lazy::new(|| { - for t in THEMES.read().unwrap().iter() { - if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { - return *t; - } - } - &base::theme::bootsier::BootsierTheme -}); - -pub fn register_theme(t: &'static (dyn Theme + 'static)) { - THEMES.write().unwrap().push(t); -} - -// ----------------------------------------------------------------------------- -// Módulos registrados. -// ----------------------------------------------------------------------------- - -pub static MODULES: Lazy<RwLock<Vec<&dyn Module>>> = Lazy::new(|| { - RwLock::new(vec![ - &base::module::admin::AdminModule, - &base::module::user::UserModule, - ]) -}); - -pub fn register_module(m: &'static (dyn Module + 'static)) { - MODULES.write().unwrap().push(m); -} - -// ----------------------------------------------------------------------------- -// Componentes globales. -// ----------------------------------------------------------------------------- - -pub static COMPONENTS: Lazy<RwLock<HashMap<&str, PageContainer>>> = Lazy::new( - || { RwLock::new(HashMap::new()) } -); - -#[allow(dead_code)] -pub fn add_component_to(region: &'static str, component: impl PageComponent) { - let mut hmap = COMPONENTS.write().unwrap(); - if let Some(regions) = hmap.get_mut(region) { - regions.add(component); - } else { - hmap.insert(region, PageContainer::new_with(component)); - } -} diff --git a/src/core/theme/mod.rs b/src/core/theme/mod.rs index 9b908257..b3376d49 100644 --- a/src/core/theme/mod.rs +++ b/src/core/theme/mod.rs @@ -1,4 +1,18 @@ +use crate::core::all::THEMES; + pub use maud::{DOCTYPE, Markup, PreEscaped, html}; mod api; pub use api::Theme; + +pub fn register_theme(t: &'static (dyn Theme + 'static)) { + THEMES.write().unwrap().push(t); +} + +pub fn find_theme(name: &str) -> Option<&'static (dyn Theme + 'static)> { + let themes = THEMES.write().unwrap(); + match themes.iter().find(|t| t.name() == name) { + Some(theme) => Some(*theme), + _ => None, + } +} diff --git a/src/prelude.rs b/src/prelude.rs index 4a66e08b..1792da41 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -15,8 +15,6 @@ pub use crate::core::response::page::*; pub use crate::core::response::page::assets::*; pub use crate::core::server; -pub use crate::core::register_theme; -pub use crate::core::register_module; -pub use crate::core::add_component_to; +pub use crate::base::theme::*; pub use crate::base::component::*; From 83fd12b5cc774aa24c381b78f99a33b92cf12447 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 26 Feb 2022 21:48:39 +0100 Subject: [PATCH 016/853] =?UTF-8?q?Modifica=20la=20forma=20de=20identifica?= =?UTF-8?q?r=20temas=20y=20m=C3=B3dulos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cada módulo y cada tema requerirá a partir de ahora un identificador que debería ser único y con alguna sintaxis particular aún por definir (por ejemplo, admitiendo sólo minúsculas y sin espacios). --- src/base/module/admin/configure.rs | 17 ----------- src/base/module/admin/locales/en-US/admin.ftl | 2 ++ src/base/module/admin/locales/es-ES/admin.ftl | 2 ++ src/base/module/admin/mod.rs | 28 +++++++++++++++++-- src/base/module/admin/summary.rs | 2 +- src/base/module/homepage/mod.rs | 4 +++ src/base/module/user/mod.rs | 4 +++ src/base/theme/aliner/mod.rs | 4 +++ src/base/theme/bootsier/mod.rs | 4 +++ src/base/theme/minimal/mod.rs | 4 +++ src/core/module/api.rs | 2 ++ src/core/module/mod.rs | 4 +-- src/core/response/page/assets.rs | 6 ++-- src/core/response/page/page.rs | 6 ++-- src/core/theme/api.rs | 2 ++ src/core/theme/mod.rs | 4 +-- 16 files changed, 65 insertions(+), 30 deletions(-) delete mode 100644 src/base/module/admin/configure.rs create mode 100644 src/base/module/admin/locales/en-US/admin.ftl create mode 100644 src/base/module/admin/locales/es-ES/admin.ftl diff --git a/src/base/module/admin/configure.rs b/src/base/module/admin/configure.rs deleted file mode 100644 index 1859f016..00000000 --- a/src/base/module/admin/configure.rs +++ /dev/null @@ -1,17 +0,0 @@ -use crate::prelude::*; -use crate::base::module::admin::summary::summary; - -pub struct AdminModule; - -impl Module for AdminModule { - fn name(&self) -> String { - "PageTop Admin".to_string() - } - - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service( - server::web::scope("/admin") - .route("", server::web::get().to(summary)) - ); - } -} diff --git a/src/base/module/admin/locales/en-US/admin.ftl b/src/base/module/admin/locales/en-US/admin.ftl new file mode 100644 index 00000000..7f37e03b --- /dev/null +++ b/src/base/module/admin/locales/en-US/admin.ftl @@ -0,0 +1,2 @@ +module_name = Admin module +module_desc = Administration module. diff --git a/src/base/module/admin/locales/es-ES/admin.ftl b/src/base/module/admin/locales/es-ES/admin.ftl new file mode 100644 index 00000000..d9211301 --- /dev/null +++ b/src/base/module/admin/locales/es-ES/admin.ftl @@ -0,0 +1,2 @@ +module_name = Admin module +module_desc = Módulo de administración. diff --git a/src/base/module/admin/mod.rs b/src/base/module/admin/mod.rs index 1444391b..7550c381 100644 --- a/src/base/module/admin/mod.rs +++ b/src/base/module/admin/mod.rs @@ -1,4 +1,28 @@ -mod configure; -pub use configure::AdminModule; +use crate::prelude::*; + +localize!("en-US", "src/base/module/admin/locales"); mod summary; + +pub struct AdminModule; + +impl Module for AdminModule { + fn id(&self) -> &'static str { + "admin" + } + + fn name(&self) -> String { + l("module_name") + } + + fn description(&self) -> String { + l("module_desc") + } + + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service( + server::web::scope("/admin") + .route("", server::web::get().to(summary::summary)) + ); + } +} diff --git a/src/base/module/admin/summary.rs b/src/base/module/admin/summary.rs index a6fe5e5d..2f889e9e 100644 --- a/src/base/module/admin/summary.rs +++ b/src/base/module/admin/summary.rs @@ -33,7 +33,7 @@ pub async fn summary() -> server::Result<Markup> { Page::prepare() - .using_theme(&bootsier::BootsierTheme) + .using_theme("bootsier") .with_title("Admin") diff --git a/src/base/module/homepage/mod.rs b/src/base/module/homepage/mod.rs index 2e4164d0..a8ed27b7 100644 --- a/src/base/module/homepage/mod.rs +++ b/src/base/module/homepage/mod.rs @@ -5,6 +5,10 @@ localize!("en-US", "src/base/module/homepage/locales"); pub struct HomepageModule; impl Module for HomepageModule { + fn id(&self) -> &'static str { + "homepage" + } + fn name(&self) -> String { l("module_name") } diff --git a/src/base/module/user/mod.rs b/src/base/module/user/mod.rs index eea6528c..98ff27fa 100644 --- a/src/base/module/user/mod.rs +++ b/src/base/module/user/mod.rs @@ -5,6 +5,10 @@ localize!("en-US", "src/base/module/user/locales"); pub struct UserModule; impl Module for UserModule { + fn id(&self) -> &'static str { + "user" + } + fn name(&self) -> String { l("module_name") } diff --git a/src/base/theme/aliner/mod.rs b/src/base/theme/aliner/mod.rs index 68e7d509..6df2fb93 100644 --- a/src/base/theme/aliner/mod.rs +++ b/src/base/theme/aliner/mod.rs @@ -5,6 +5,10 @@ include!(concat!(env!("OUT_DIR"), "/aliner.rs")); pub struct AlinerTheme; impl Theme for AlinerTheme { + fn id(&self) -> &'static str { + "aliner" + } + fn name(&self) -> String { "Aliner".to_string() } diff --git a/src/base/theme/bootsier/mod.rs b/src/base/theme/bootsier/mod.rs index 2d37cb05..58975335 100644 --- a/src/base/theme/bootsier/mod.rs +++ b/src/base/theme/bootsier/mod.rs @@ -7,6 +7,10 @@ localize!("en-US", "src/base/theme/bootsier/locales"); pub struct BootsierTheme; impl Theme for BootsierTheme { + fn id(&self) -> &'static str { + "bootsier" + } + fn name(&self) -> String { "Bootsier".to_string() } diff --git a/src/base/theme/minimal/mod.rs b/src/base/theme/minimal/mod.rs index 9ea6e87e..970181b7 100644 --- a/src/base/theme/minimal/mod.rs +++ b/src/base/theme/minimal/mod.rs @@ -3,6 +3,10 @@ use crate::prelude::*; pub struct MinimalTheme; impl Theme for MinimalTheme { + fn id(&self) -> &'static str { + "minimal" + } + fn name(&self) -> String { "Minimal".to_string() } diff --git a/src/core/module/api.rs b/src/core/module/api.rs index bbbdb5eb..68488b84 100644 --- a/src/core/module/api.rs +++ b/src/core/module/api.rs @@ -2,6 +2,8 @@ use crate::core::server; /// Los módulos deben implementar este *trait*. pub trait Module: Send + Sync { + fn id(&self) -> &'static str; + fn name(&self) -> String; fn description(&self) -> String { diff --git a/src/core/module/mod.rs b/src/core/module/mod.rs index c77e530e..c480df38 100644 --- a/src/core/module/mod.rs +++ b/src/core/module/mod.rs @@ -7,9 +7,9 @@ pub fn register_module(m: &'static (dyn Module + 'static)) { MODULES.write().unwrap().push(m); } -pub fn find_module(name: &str) -> Option<&'static (dyn Module + 'static)> { +pub fn find_module(id: &str) -> Option<&'static (dyn Module + 'static)> { let modules = MODULES.write().unwrap(); - match modules.iter().find(|t| t.name() == name) { + match modules.iter().find(|t| t.id() == id) { Some(module) => Some(*module), _ => None, } diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index c515bb04..7e1205eb 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -1,5 +1,5 @@ use crate::core::all::DEFAULT_THEME; -use crate::core::theme::{Markup, PreEscaped, Theme, html}; +use crate::core::theme::{Markup, PreEscaped, Theme, find_theme, html}; // ----------------------------------------------------------------------------- // Favicon. @@ -195,8 +195,8 @@ impl Assets { } } - pub fn using_theme(&mut self, theme: &'static dyn Theme) -> &mut Self { - self.theme = theme; + pub fn using_theme(&mut self, theme_id: &str) -> &mut Self { + self.theme = find_theme(theme_id).unwrap_or(*DEFAULT_THEME); self } diff --git a/src/core/response/page/page.rs b/src/core/response/page/page.rs index dea08591..99041edd 100644 --- a/src/core/response/page/page.rs +++ b/src/core/response/page/page.rs @@ -1,7 +1,7 @@ use crate::config::SETTINGS; use crate::core::server; use crate::core::all::COMPONENTS; -use crate::core::theme::{DOCTYPE, Markup, Theme, html}; +use crate::core::theme::{DOCTYPE, Markup, html}; use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; use std::borrow::Cow; @@ -159,8 +159,8 @@ impl<'a> Page<'a> { // Page EXTRAS. - pub fn using_theme(&mut self, theme: &'static dyn Theme) -> &mut Self { - self.assets.using_theme(theme); + pub fn using_theme(&mut self, theme_id: &str) -> &mut Self { + self.assets.using_theme(theme_id); self } } diff --git a/src/core/theme/api.rs b/src/core/theme/api.rs index 8c0caad1..45f3e6a8 100644 --- a/src/core/theme/api.rs +++ b/src/core/theme/api.rs @@ -5,6 +5,8 @@ use crate::base::component::Chunck; /// Los temas deben implementar este "trait". pub trait Theme: Send + Sync { + fn id(&self) -> &'static str; + fn name(&self) -> String; fn description(&self) -> String { diff --git a/src/core/theme/mod.rs b/src/core/theme/mod.rs index b3376d49..973af092 100644 --- a/src/core/theme/mod.rs +++ b/src/core/theme/mod.rs @@ -9,9 +9,9 @@ pub fn register_theme(t: &'static (dyn Theme + 'static)) { THEMES.write().unwrap().push(t); } -pub fn find_theme(name: &str) -> Option<&'static (dyn Theme + 'static)> { +pub fn find_theme(id: &str) -> Option<&'static (dyn Theme + 'static)> { let themes = THEMES.write().unwrap(); - match themes.iter().find(|t| t.name() == name) { + match themes.iter().find(|t| t.id() == id) { Some(theme) => Some(*theme), _ => None, } From 0f185887a69aaca5025da615929ab4094fce7aba Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 28 Feb 2022 22:20:28 +0100 Subject: [PATCH 017/853] =?UTF-8?q?Mejora=20la=20gesti=C3=B3n=20de=20la=20?= =?UTF-8?q?traza=20de=20seguimiento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aprovecha la potencia de los crates propios del ecosistema tracing para proporcionar las funcionalidades más importantes vía ajustes de configuración. --- Cargo.toml | 4 +-- config/settings.default.toml | 8 +++-- src/config/settings.rs | 15 ++++++-- src/core/server/main.rs | 66 +++++++----------------------------- src/locale/locale.rs | 23 +++++++++++++ src/locale/mod.rs | 15 ++------ src/trace/mod.rs | 4 +++ src/trace/trace.rs | 57 +++++++++++++++++++++++++++++++ 8 files changed, 119 insertions(+), 73 deletions(-) create mode 100644 src/locale/locale.rs create mode 100644 src/trace/trace.rs diff --git a/Cargo.toml b/Cargo.toml index 7b4ac161..6d9fa877 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,10 +31,8 @@ figlet-rs = "0.1.3" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } tracing = "0.1" -tracing-log = "0.1" tracing-appender = "0.2" -tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] } -tracing-bunyan-formatter = "0.3" +tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } tracing-actix-web = "0.2" fluent-templates = "0.6.1" diff --git a/config/settings.default.toml b/config/settings.default.toml index aea77e5e..3a4fb0ff 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -1,10 +1,12 @@ [app] name = "PageTop Application" description = "Developed with the amazing PageTop framework." -# Idioma (localización) predeterminado. -language = "en-US" # Tema predeterminado. theme = "Bootsier" +# Idioma (localización) predeterminado. +language = "en-US" +# Dirección predeterminada para el texto: "ltr", "rtl" o "auto". +direction = "ltr" # Rótulo al inicio: "Off", "Slant", "Small", "Speed" o "Starwars". startup_banner = "Small" @@ -18,6 +20,8 @@ rolling = "Daily" path = "log" # Prefijo para los archivos de traza (si rolling != "Stdout"). prefix = "tracing.log" +# Presentación de las trazas: "Json", "Full", "Compact" o "Pretty". +format = "Json" [webserver] # Configuración del servidor web. diff --git a/src/config/settings.rs b/src/config/settings.rs index 94097c3a..66ddbe42 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -42,7 +42,12 @@ pub static CONFIG: Lazy<Config> = Lazy::new(|| { /// componente, en una estructura similar a [`SETTINGS`] con tipos de variables /// seguros. Produce un *panic!* en caso de asignaciones no válidas. macro_rules! config_map { - ( $COMM:expr, $CONF:ident, $TYPE:tt $(, $key:expr => $value:expr)* ) => { + ( + $COMM:expr, + $CONF:ident, + $TYPE:tt + $(, $key:expr => $value:expr)* + ) => { $crate::doc_comment! { concat!($COMM), @@ -64,8 +69,9 @@ macro_rules! config_map { pub struct App { pub name : String, pub description : String, - pub language : String, pub theme : String, + pub language : String, + pub direction : String, pub startup_banner: String, pub run_mode : String, } @@ -76,6 +82,7 @@ pub struct Log { pub rolling : String, pub path : String, pub prefix : String, + pub format : String, } #[derive(Debug, Deserialize)] @@ -100,8 +107,9 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]*, // [app] "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", - "app.language" => "en-US", "app.theme" => "Bootsier", + "app.language" => "en-US", + "app.direction" => "ltr", "app.startup_banner" => "Small", // [log] @@ -109,6 +117,7 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]*, "log.rolling" => "Daily", "log.path" => "log", "log.prefix" => "tracing.log", + "log.format" => "json", // [webserver] "webserver.bind_address" => "localhost", diff --git a/src/core/server/main.rs b/src/core/server/main.rs index 2c8e2d37..fb9663b1 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,59 +1,11 @@ -use crate::{base, trace}; +use crate::{Lazy, base, locale, trace}; use crate::config::SETTINGS; use crate::core::{Server, all, server}; use crate::core::module::register_module; -use tracing_log::LogTracer; -use tracing_subscriber::{EnvFilter, Registry}; -use tracing_subscriber::layer::SubscriberExt; -use tracing::subscriber::set_global_default; -use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer}; -use tracing_actix_web::TracingLogger; - use actix_web::middleware::normalize; pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { - // Inicia la traza de ejecución de la aplicación. - let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing) - .unwrap_or(EnvFilter::new("Info")); - - let rolling = SETTINGS.log.rolling.to_lowercase(); - let (non_blocking, _guard) = match rolling.as_str() { - "stdout" => tracing_appender::non_blocking( - std::io::stdout() - ), - _ => tracing_appender::non_blocking({ - let path = &SETTINGS.log.path; - let prefix = &SETTINGS.log.prefix; - match rolling.as_str() { - "daily" => tracing_appender::rolling::daily(path, prefix), - "hourly" => tracing_appender::rolling::hourly(path, prefix), - "minutely" => tracing_appender::rolling::minutely(path, prefix), - "endless" => tracing_appender::rolling::never(path, prefix), - _ => { - println!( - "Rolling value \"{}\" not valid. Using \"daily\"", - rolling - ); - tracing_appender::rolling::daily(path, prefix) - } - } - }) - }; - let formatting_layer = BunyanFormattingLayer::new( - String::from(&SETTINGS.app.name), - non_blocking - ); - - let subscriber = Registry::default() - .with(env_filter) - .with(JsonStorageLayer) - .with(formatting_layer); - - set_global_default(subscriber).expect("Unable to setup subscriber!"); - - LogTracer::init().expect("Unable to setup log tracer!"); - // Imprime el rótulo (opcional) de bienvenida. if SETTINGS.app.startup_banner.to_lowercase() != "off" { let figfont = figlet_rs::FIGfont::from_content( @@ -63,9 +15,11 @@ pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { "speed" => include_str!("figfonts/speed.flf"), "starwars" => include_str!("figfonts/starwars.flf"), _ => { - trace::warn!( - "FIGfont \"{}\" not found for banner. Using \"{}\"", - SETTINGS.app.startup_banner, "Small" + println!( + "FIGfont \"{}\" not found for banner. {}. {}.", + SETTINGS.app.startup_banner, + "Using \"Small\"", + "Check the settings file", ); include_str!("figfonts/small.flf") } @@ -78,6 +32,12 @@ pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { ); } + // Traza de seguimiento. + Lazy::force(&trace::TRACING); + + // Identificador de idioma. + Lazy::force(&locale::LANGID); + // Ejecuta la función de inicio de la aplicación. if bootstrap != None { trace::debug!("Calling application bootstrap"); @@ -92,7 +52,7 @@ pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { // Inicializa el servidor web. let server = server::HttpServer::new(|| { server::App::new() - .wrap(TracingLogger) + .wrap(tracing_actix_web::TracingLogger) .wrap(normalize::NormalizePath::new(normalize::TrailingSlash::Trim)) .configure(&all::themes) .configure(&all::modules) diff --git a/src/locale/locale.rs b/src/locale/locale.rs new file mode 100644 index 00000000..3638a6a4 --- /dev/null +++ b/src/locale/locale.rs @@ -0,0 +1,23 @@ +use crate::{Lazy, trace}; +use crate::config::SETTINGS; + +use unic_langid::LanguageIdentifier; + +/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] +/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de +/// la aplicación, obtenido de `SETTINGS.app.language`. +pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { + match SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "Failed to parse language \"{}\". {}. {}. {}.", + SETTINGS.app.language, + "Unicode Language Identifier not recognized", + "Using \"en-US\"", + "Check the settings file", + ); + "en-US".parse().unwrap() + } + } +}); diff --git a/src/locale/mod.rs b/src/locale/mod.rs index 6e64cc8f..e13d9f21 100644 --- a/src/locale/mod.rs +++ b/src/locale/mod.rs @@ -1,21 +1,12 @@ -use crate::Lazy; -use crate::config::SETTINGS; - -use unic_langid::LanguageIdentifier; - pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; -/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] -/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de -/// la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { - SETTINGS.app.language.parse().expect("Failed to parse.") -}); +mod locale; +pub use locale::LANGID; #[macro_export] -/// Permite integrar fácilmente localización en tus temas y módulos. +/// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! localize { ( $DEF_LANGID:literal, $locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; diff --git a/src/trace/mod.rs b/src/trace/mod.rs index f4af4116..8ffa8bcd 100644 --- a/src/trace/mod.rs +++ b/src/trace/mod.rs @@ -1 +1,5 @@ +pub use tracing::{Level, event, span}; pub use tracing::{debug, error, info, trace, warn}; + +mod trace; +pub use trace::TRACING; diff --git a/src/trace/trace.rs b/src/trace/trace.rs new file mode 100644 index 00000000..fd907461 --- /dev/null +++ b/src/trace/trace.rs @@ -0,0 +1,57 @@ +use crate::Lazy; +use crate::config::SETTINGS; + +use tracing_appender::non_blocking::WorkerGuard; +use tracing_subscriber::EnvFilter; + +pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { + let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing) + .unwrap_or(EnvFilter::new("Info")); + + let rolling = SETTINGS.log.rolling.to_lowercase(); + let (non_blocking, guard) = match rolling.as_str() { + "stdout" => tracing_appender::non_blocking( + std::io::stdout() + ), + _ => tracing_appender::non_blocking({ + let path = &SETTINGS.log.path; + let prefix = &SETTINGS.log.prefix; + match rolling.as_str() { + "daily" => tracing_appender::rolling::daily(path, prefix), + "hourly" => tracing_appender::rolling::hourly(path, prefix), + "minutely" => tracing_appender::rolling::minutely(path, prefix), + "endless" => tracing_appender::rolling::never(path, prefix), + _ => { + println!( + "Rolling value \"{}\" not valid. {}. {}.", + SETTINGS.log.rolling, + "Using \"daily\"", + "Check the settings file", + ); + tracing_appender::rolling::daily(path, prefix) + } + } + }) + }; + let subscriber = tracing_subscriber::fmt() + .with_env_filter(env_filter) + .with_writer(non_blocking) + .with_ansi(rolling.as_str() == "stdout"); + match SETTINGS.log.format.to_lowercase().as_str() { + "json" => subscriber.json().init(), + "full" => subscriber.init(), + "compact" => subscriber.compact().init(), + "pretty" => subscriber.pretty().init(), + _ => { + println!( + "Tracing format \"{}\" not valid. {}. {}.", + SETTINGS.log.format, + "Using \"Full\"", + "Check the settings file", + ); + subscriber.init(); + } + } + + guard +}); From 9e65f89d2df69178716fd186f9f5454e4fc457a7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 1 Mar 2022 17:50:36 +0100 Subject: [PATCH 018/853] =?UTF-8?q?Modifica=20la=20identificaci=C3=B3n=20d?= =?UTF-8?q?e=20m=C3=B3dulos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/module/admin/locales/en-US/admin.ftl | 4 ++-- src/base/module/admin/locales/es-ES/admin.ftl | 4 ++-- src/base/module/admin/mod.rs | 8 ++++---- .../module/homepage/locales/en-US/homepage.ftl | 4 ++-- .../module/homepage/locales/es-ES/homepage.ftl | 4 ++-- src/base/module/homepage/mod.rs | 8 ++++---- .../module/user/locales/en-US/homepage.ftl | 4 ++-- .../module/user/locales/es-ES/homepage.ftl | 4 ++-- src/base/module/user/mod.rs | 8 ++++---- src/base/theme/aliner/mod.rs | 4 ++-- src/base/theme/bootsier/mod.rs | 4 ++-- src/base/theme/minimal/mod.rs | 4 ++-- src/core/module/api.rs | 18 +++++++++++++++--- src/core/module/mod.rs | 16 +--------------- 14 files changed, 46 insertions(+), 48 deletions(-) diff --git a/src/base/module/admin/locales/en-US/admin.ftl b/src/base/module/admin/locales/en-US/admin.ftl index 7f37e03b..88da2fe6 100644 --- a/src/base/module/admin/locales/en-US/admin.ftl +++ b/src/base/module/admin/locales/en-US/admin.ftl @@ -1,2 +1,2 @@ -module_name = Admin module -module_desc = Administration module. +module_fullname = Admin module +module_description = Administration module. diff --git a/src/base/module/admin/locales/es-ES/admin.ftl b/src/base/module/admin/locales/es-ES/admin.ftl index d9211301..c9105a6a 100644 --- a/src/base/module/admin/locales/es-ES/admin.ftl +++ b/src/base/module/admin/locales/es-ES/admin.ftl @@ -1,2 +1,2 @@ -module_name = Admin module -module_desc = Módulo de administración. +module_fullname = Admin module +module_description = Módulo de administración. diff --git a/src/base/module/admin/mod.rs b/src/base/module/admin/mod.rs index 7550c381..5991d4f0 100644 --- a/src/base/module/admin/mod.rs +++ b/src/base/module/admin/mod.rs @@ -7,16 +7,16 @@ mod summary; pub struct AdminModule; impl Module for AdminModule { - fn id(&self) -> &'static str { + fn name(&self) -> &'static str { "admin" } - fn name(&self) -> String { - l("module_name") + fn fullname(&self) -> String { + l("module_fullname") } fn description(&self) -> String { - l("module_desc") + l("module_description") } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/src/base/module/homepage/locales/en-US/homepage.ftl b/src/base/module/homepage/locales/en-US/homepage.ftl index ec401e64..39a5e426 100644 --- a/src/base/module/homepage/locales/en-US/homepage.ftl +++ b/src/base/module/homepage/locales/en-US/homepage.ftl @@ -1,5 +1,5 @@ -module_name = Default homepage -module_desc = Displays a default homepage when none is configured. +module_fullname = Default homepage +module_description = Displays a default homepage when none is configured. page_title = Hello world! diff --git a/src/base/module/homepage/locales/es-ES/homepage.ftl b/src/base/module/homepage/locales/es-ES/homepage.ftl index dee1df47..f1d85b2e 100644 --- a/src/base/module/homepage/locales/es-ES/homepage.ftl +++ b/src/base/module/homepage/locales/es-ES/homepage.ftl @@ -1,5 +1,5 @@ -module_name = Página de inicio predeterminada -module_desc = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. +module_fullname = Página de inicio predeterminada +module_description = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. page_title = ¡Hola mundo! diff --git a/src/base/module/homepage/mod.rs b/src/base/module/homepage/mod.rs index a8ed27b7..386b6716 100644 --- a/src/base/module/homepage/mod.rs +++ b/src/base/module/homepage/mod.rs @@ -5,16 +5,16 @@ localize!("en-US", "src/base/module/homepage/locales"); pub struct HomepageModule; impl Module for HomepageModule { - fn id(&self) -> &'static str { + fn name(&self) -> &'static str { "homepage" } - fn name(&self) -> String { - l("module_name") + fn fullname(&self) -> String { + l("module_fullname") } fn description(&self) -> String { - l("module_desc") + l("module_description") } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/src/base/module/user/locales/en-US/homepage.ftl b/src/base/module/user/locales/en-US/homepage.ftl index e6ad0e91..0493672e 100644 --- a/src/base/module/user/locales/en-US/homepage.ftl +++ b/src/base/module/user/locales/en-US/homepage.ftl @@ -1,5 +1,5 @@ -module_name = User -module_desc = Manages the user registration and login system. +module_fullname = User +module_description = Manages the user registration and login system. username = User name password = Password diff --git a/src/base/module/user/locales/es-ES/homepage.ftl b/src/base/module/user/locales/es-ES/homepage.ftl index 68f1c889..ae9a70e0 100644 --- a/src/base/module/user/locales/es-ES/homepage.ftl +++ b/src/base/module/user/locales/es-ES/homepage.ftl @@ -1,5 +1,5 @@ -module_name = Usuario -module_desc = Gestion el registro de usuarios y el sistema de accesos. +module_fullname = Usuario +module_description = Gestion el registro de usuarios y el sistema de accesos. username = Nombre de usuario password = Contraseña diff --git a/src/base/module/user/mod.rs b/src/base/module/user/mod.rs index 98ff27fa..bbb3ee93 100644 --- a/src/base/module/user/mod.rs +++ b/src/base/module/user/mod.rs @@ -5,16 +5,16 @@ localize!("en-US", "src/base/module/user/locales"); pub struct UserModule; impl Module for UserModule { - fn id(&self) -> &'static str { + fn name(&self) -> &'static str { "user" } - fn name(&self) -> String { - l("module_name") + fn fullname(&self) -> String { + l("module_fullname") } fn description(&self) -> String { - l("module_desc") + l("module_description") } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/src/base/theme/aliner/mod.rs b/src/base/theme/aliner/mod.rs index 6df2fb93..d27e2f91 100644 --- a/src/base/theme/aliner/mod.rs +++ b/src/base/theme/aliner/mod.rs @@ -5,11 +5,11 @@ include!(concat!(env!("OUT_DIR"), "/aliner.rs")); pub struct AlinerTheme; impl Theme for AlinerTheme { - fn id(&self) -> &'static str { + fn name(&self) -> &'static str { "aliner" } - fn name(&self) -> String { + fn fullname(&self) -> String { "Aliner".to_string() } diff --git a/src/base/theme/bootsier/mod.rs b/src/base/theme/bootsier/mod.rs index 58975335..97b7fa46 100644 --- a/src/base/theme/bootsier/mod.rs +++ b/src/base/theme/bootsier/mod.rs @@ -7,11 +7,11 @@ localize!("en-US", "src/base/theme/bootsier/locales"); pub struct BootsierTheme; impl Theme for BootsierTheme { - fn id(&self) -> &'static str { + fn name(&self) -> &'static str { "bootsier" } - fn name(&self) -> String { + fn fullname(&self) -> String { "Bootsier".to_string() } diff --git a/src/base/theme/minimal/mod.rs b/src/base/theme/minimal/mod.rs index 970181b7..17611468 100644 --- a/src/base/theme/minimal/mod.rs +++ b/src/base/theme/minimal/mod.rs @@ -3,11 +3,11 @@ use crate::prelude::*; pub struct MinimalTheme; impl Theme for MinimalTheme { - fn id(&self) -> &'static str { + fn name(&self) -> &'static str { "minimal" } - fn name(&self) -> String { + fn fullname(&self) -> String { "Minimal".to_string() } } diff --git a/src/core/module/api.rs b/src/core/module/api.rs index 68488b84..83be71c3 100644 --- a/src/core/module/api.rs +++ b/src/core/module/api.rs @@ -1,10 +1,10 @@ -use crate::core::server; +use crate::core::{all, server}; /// Los módulos deben implementar este *trait*. pub trait Module: Send + Sync { - fn id(&self) -> &'static str; + fn name(&self) -> &'static str; - fn name(&self) -> String; + fn fullname(&self) -> String; fn description(&self) -> String { "".to_string() @@ -14,3 +14,15 @@ pub trait Module: Send + Sync { fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { } } + +pub fn register_module(m: &'static (dyn Module + 'static)) { + all::MODULES.write().unwrap().push(m); +} + +pub fn find_module(name: &str) -> Option<&'static (dyn Module + 'static)> { + let modules = all::MODULES.write().unwrap(); + match modules.iter().find(|t| t.name() == name) { + Some(module) => Some(*module), + _ => None, + } +} diff --git a/src/core/module/mod.rs b/src/core/module/mod.rs index c480df38..08686bcd 100644 --- a/src/core/module/mod.rs +++ b/src/core/module/mod.rs @@ -1,16 +1,2 @@ -use crate::core::all::MODULES; - mod api; -pub use api::Module; - -pub fn register_module(m: &'static (dyn Module + 'static)) { - MODULES.write().unwrap().push(m); -} - -pub fn find_module(id: &str) -> Option<&'static (dyn Module + 'static)> { - let modules = MODULES.write().unwrap(); - match modules.iter().find(|t| t.id() == id) { - Some(module) => Some(*module), - _ => None, - } -} +pub use api::{Module, find_module, register_module}; From db3efa9ef92b09c189fcda21a5f5f460b91f0f1f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 1 Mar 2022 19:35:02 +0100 Subject: [PATCH 019/853] =?UTF-8?q?Modifica=20gesti=C3=B3n=20de=20p=C3=A1g?= =?UTF-8?q?inas=20para=20normalizar=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/all.rs | 10 --- src/core/response/page/assets.rs | 13 ++- src/core/response/page/component.rs | 10 +-- src/core/response/page/mod.rs | 11 +-- src/core/response/page/page.rs | 122 ++++++++++++++++++---------- src/core/theme/api.rs | 38 +++++++-- src/core/theme/mod.rs | 16 +--- 7 files changed, 128 insertions(+), 92 deletions(-) diff --git a/src/core/all.rs b/src/core/all.rs index 3174fc5f..eb7bed10 100644 --- a/src/core/all.rs +++ b/src/core/all.rs @@ -1,5 +1,4 @@ use crate::Lazy; -use crate::config::SETTINGS; use crate::core::theme::Theme; use crate::core::module::Module; use crate::core::response::page::PageContainer; @@ -23,15 +22,6 @@ pub static THEMES: Lazy<RwLock<Vec<&dyn Theme>>> = Lazy::new(|| { ]) }); -pub static DEFAULT_THEME: Lazy<&dyn Theme> = Lazy::new(|| { - for t in THEMES.read().unwrap().iter() { - if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { - return *t; - } - } - &base::theme::bootsier::BootsierTheme -}); - pub fn themes(cfg: &mut server::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( "/theme", diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index 7e1205eb..71c3f668 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -1,6 +1,17 @@ -use crate::core::all::DEFAULT_THEME; +use crate::{Lazy, base}; +use crate::config::SETTINGS; +use crate::core::all; use crate::core::theme::{Markup, PreEscaped, Theme, find_theme, html}; +pub static DEFAULT_THEME: Lazy<&dyn Theme> = Lazy::new(|| { + for t in all::THEMES.read().unwrap().iter() { + if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { + return *t; + } + } + &base::theme::bootsier::BootsierTheme +}); + // ----------------------------------------------------------------------------- // Favicon. // ----------------------------------------------------------------------------- diff --git a/src/core/response/page/component.rs b/src/core/response/page/component.rs index aebb1f43..a7e0ffd7 100644 --- a/src/core/response/page/component.rs +++ b/src/core/response/page/component.rs @@ -9,7 +9,7 @@ pub trait Component: Downcast + Send + Sync { fn prepare() -> Self where Self: Sized; - fn name(&self) -> &str { + fn name(&self) -> &'static str { let name = type_name::<Self>(); match name.rfind("::") { Some(position) => &name[(position + 2)..], @@ -17,12 +17,12 @@ pub trait Component: Downcast + Send + Sync { } } - fn qualified_name(&self) -> &str { - type_name::<Self>() + fn fullname(&self) -> String { + type_name::<Self>().to_string() } - fn description(&self) -> &str { - "" + fn description(&self) -> String { + "".to_string() } fn is_renderable(&self) -> bool { diff --git a/src/core/response/page/mod.rs b/src/core/response/page/mod.rs index 83f0e0e9..d10c5fcc 100644 --- a/src/core/response/page/mod.rs +++ b/src/core/response/page/mod.rs @@ -1,5 +1,3 @@ -use crate::core::all::COMPONENTS; - pub mod assets; pub use assets::Assets as PageAssets; @@ -12,12 +10,5 @@ pub use container::Container as PageContainer; mod page; pub use page::Page; pub use page::render_component; +pub use page::add_component_to; -pub fn add_component_to(region: &'static str, component: impl PageComponent) { - let mut hmap = COMPONENTS.write().unwrap(); - if let Some(regions) = hmap.get_mut(region) { - regions.add(component); - } else { - hmap.insert(region, PageContainer::new_with(component)); - } -} diff --git a/src/core/response/page/page.rs b/src/core/response/page/page.rs index 99041edd..48ea5094 100644 --- a/src/core/response/page/page.rs +++ b/src/core/response/page/page.rs @@ -1,63 +1,96 @@ +use crate::{Lazy, trace, util}; use crate::config::SETTINGS; -use crate::core::server; -use crate::core::all::COMPONENTS; +use crate::core::{all, server}; use crate::core::theme::{DOCTYPE, Markup, html}; use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; use std::borrow::Cow; use std::collections::HashMap; -pub enum TextDirection { LeftToRight, RightToLeft, Auto } +pub static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { + let language = SETTINGS.app.language[..2].to_lowercase(); + if !language.is_empty() { + Some(language) + } else { + None + } +}); + +pub static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { + let direction = SETTINGS.app.direction.to_lowercase(); + match direction.as_str() { + "auto" => Some("auto".to_string()), + "ltr" => Some("ltr".to_string()), + "rtl" => Some("rtl".to_string()), + "" => None, + _ => { + trace::warn!( + "Text direction \"{}\" not valid. {}.", + SETTINGS.app.direction, + "Check the settings file" + ); + None + } + } +}); + +pub enum TextDirection { Auto, LeftToRight, RightToLeft } pub struct Page<'a> { - language : &'a str, - title : &'a str, - direction : &'a str, - description : &'a str, - body_classes: Cow<'a, str>, + language : Option<String>, + direction : Option<String>, + title : Option<String>, + description : Option<String>, assets : PageAssets, + body_classes: Cow<'a, str>, regions : HashMap<&'a str, PageContainer>, - template : &'a str, + template : Option<String>, } impl<'a> Page<'a> { pub fn prepare() -> Self { Page { - language : &SETTINGS.app.language[..2], - title : &SETTINGS.app.name, - direction : "ltr", - description : "", + language : match &*DEFAULT_LANGUAGE { + Some(language) => Some(language.to_string()), + _ => None, + }, + direction : match &*DEFAULT_DIRECTION { + Some(direction) => Some(direction.to_string()), + _ => None, + }, + title : None, + description : None, body_classes: "body".into(), assets : PageAssets::new(), - regions : COMPONENTS.read().unwrap().clone(), - template : "default", + regions : all::COMPONENTS.read().unwrap().clone(), + template : Some("default".to_string()), } } // Page BUILDER. - pub fn with_language(&mut self, language: &'a str) -> &mut Self { - self.language = language; - self - } - - pub fn with_title(&mut self, title: &'a str) -> &mut Self { - self.title = title; + pub fn with_language(&mut self, language: &str) -> &mut Self { + self.language = util::optional_value(language); self } pub fn with_direction(&mut self, dir: TextDirection) -> &mut Self { self.direction = match dir { - TextDirection::LeftToRight => "ltr", - TextDirection::RightToLeft => "rtl", - _ => "auto" + TextDirection::Auto => Some("auto".to_string()), + TextDirection::LeftToRight => Some("ltr".to_string()), + TextDirection::RightToLeft => Some("rtl".to_string()), }; self } - pub fn with_description(&mut self, description: &'a str) -> &mut Self { - self.description = description; + pub fn with_title(&mut self, title: &str) -> &mut Self { + self.title = util::optional_value(title); + self + } + + pub fn with_description(&mut self, description: &str) -> &mut Self { + self.description = util::optional_value(description); self } @@ -86,31 +119,27 @@ impl<'a> Page<'a> { self } - pub fn using_template(&mut self, template: &'a str) -> &mut Self { - self.template = template; + pub fn using_template(&mut self, template: &str) -> &mut Self { + self.template = util::optional_value(template); self } // Page GETTERS. pub fn language(&self) -> &str { - self.language + util::assigned_value(&self.language) + } + + pub fn direction(&self) -> &str { + util::assigned_value(&self.direction) } pub fn title(&self) -> &str { - self.title - } - - pub fn direction(&self) -> TextDirection { - match self.direction { - "ltr" => TextDirection::LeftToRight, - "rtl" => TextDirection::RightToLeft, - _ => TextDirection::Auto - } + util::assigned_value(&self.title) } pub fn description(&self) -> &str { - self.description + util::assigned_value(&self.description) } pub fn body_classes(&self) -> &str { @@ -125,7 +154,7 @@ impl<'a> Page<'a> { } pub fn template(&self) -> &str { - self.template + util::assigned_value(&self.template) } // Page RENDER. @@ -143,7 +172,7 @@ impl<'a> Page<'a> { // Finalmente, renderizar la página. return Ok(html! { (DOCTYPE) - html lang=(self.language) dir=(self.direction) { + html lang=[&self.language] dir=[&self.direction] { (head) (body) } @@ -177,3 +206,12 @@ pub fn render_component( false => html! {} } } + +pub fn add_component_to(region: &'static str, component: impl PageComponent) { + let mut hmap = all::COMPONENTS.write().unwrap(); + if let Some(regions) = hmap.get_mut(region) { + regions.add(component); + } else { + hmap.insert(region, PageContainer::new_with(component)); + } +} diff --git a/src/core/theme/api.rs b/src/core/theme/api.rs index 45f3e6a8..36350110 100644 --- a/src/core/theme/api.rs +++ b/src/core/theme/api.rs @@ -1,13 +1,14 @@ -use crate::core::server; +use crate::config::SETTINGS; +use crate::core::{all, server}; use crate::core::theme::{Markup, html}; use crate::core::response::page::{Page, PageAssets, PageComponent}; use crate::base::component::Chunck; /// Los temas deben implementar este "trait". pub trait Theme: Send + Sync { - fn id(&self) -> &'static str; + fn name(&self) -> &'static str; - fn name(&self) -> String; + fn fullname(&self) -> String; fn description(&self) -> String { "".to_string() @@ -22,19 +23,26 @@ pub trait Theme: Send + Sync { } fn render_page_head(&self, page: &mut Page) -> Markup { - let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; + let title = page.title(); + let title = if title.is_empty() { + SETTINGS.app.name.to_string() + } else { + [SETTINGS.app.name.to_string(), title.to_string()].join(" | ") + }; let description = page.description(); + let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { head { meta charset="utf-8"; - meta http-equiv="X-UA-Compatible" content="IE=edge"; - meta name="viewport" content=(viewport); + title { (title) } + @if !description.is_empty() { meta name="description" content=(description); } - title { (page.title()) } + meta http-equiv="X-UA-Compatible" content="IE=edge"; + meta name="viewport" content=(viewport); (page.assets().render()) } @@ -72,8 +80,8 @@ pub trait Theme: Send + Sync { /* Cómo usarlo: - match component.type_name() { - "Block" => { + match component.handle() { + "block" => { let block = component.downcast_mut::<Block>().unwrap(); match block.template() { "default" => Some(block_default(block)), @@ -96,3 +104,15 @@ pub trait Theme: Send + Sync { .render() } } + +pub fn register_theme(t: &'static (dyn Theme + 'static)) { + all::THEMES.write().unwrap().push(t); +} + +pub fn find_theme(name: &str) -> Option<&'static (dyn Theme + 'static)> { + let themes = all::THEMES.write().unwrap(); + match themes.iter().find(|t| t.name() == name) { + Some(theme) => Some(*theme), + _ => None, + } +} diff --git a/src/core/theme/mod.rs b/src/core/theme/mod.rs index 973af092..9f708803 100644 --- a/src/core/theme/mod.rs +++ b/src/core/theme/mod.rs @@ -1,18 +1,4 @@ -use crate::core::all::THEMES; - pub use maud::{DOCTYPE, Markup, PreEscaped, html}; mod api; -pub use api::Theme; - -pub fn register_theme(t: &'static (dyn Theme + 'static)) { - THEMES.write().unwrap().push(t); -} - -pub fn find_theme(id: &str) -> Option<&'static (dyn Theme + 'static)> { - let themes = THEMES.write().unwrap(); - match themes.iter().find(|t| t.id() == id) { - Some(theme) => Some(*theme), - _ => None, - } -} +pub use api::{Theme, find_theme, register_theme}; From cac4c2f102137cbde35eb223948b668b1696b4be Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 1 Mar 2022 22:15:41 +0100 Subject: [PATCH 020/853] =?UTF-8?q?Actualiza=20y=20sanea=20piezas=20de=20c?= =?UTF-8?q?=C3=B3digo=20sensible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/block.rs | 2 +- src/base/component/menu.rs | 2 +- src/core/response/page/assets.rs | 14 +++++++------- src/core/response/page/component.rs | 4 ++-- src/core/response/page/container.rs | 8 ++++---- src/core/response/page/mod.rs | 13 +++++++++---- src/core/response/page/page.rs | 8 ++++---- src/core/theme/api.rs | 2 +- src/prelude.rs | 5 ----- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/base/component/block.rs b/src/base/component/block.rs index 03e67e01..9ffe986d 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -31,7 +31,7 @@ impl PageComponent for Block { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - let id = assets.required_id(self.name(), self.id()); + let id = assets.serial_id(self.name(), self.id()); html! { div id=(id) class="block" { @if !self.title.is_empty() { diff --git a/src/base/component/menu.rs b/src/base/component/menu.rs index 34be6e33..0f44fad5 100644 --- a/src/base/component/menu.rs +++ b/src/base/component/menu.rs @@ -186,7 +186,7 @@ impl PageComponent for Menu { )) .add_jquery(); - let id = assets.required_id(self.name(), self.id()); + let id = assets.serial_id(self.name(), self.id()); html! { ul id=(id) class="sm sm-clean" { (self.render_items(assets)) diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index 71c3f668..77174e58 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -3,7 +3,7 @@ use crate::config::SETTINGS; use crate::core::all; use crate::core::theme::{Markup, PreEscaped, Theme, find_theme, html}; -pub static DEFAULT_THEME: Lazy<&dyn Theme> = Lazy::new(|| { +static DEFAULT_THEME: Lazy<&dyn Theme> = Lazy::new(|| { for t in all::THEMES.read().unwrap().iter() { if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { return *t; @@ -183,7 +183,7 @@ impl JavaScript { // Page assets. // ----------------------------------------------------------------------------- -pub struct Assets { +pub struct PageAssets { theme : &'static dyn Theme, favicon : Option<Favicon>, metadata : Vec<(String, String)>, @@ -193,9 +193,9 @@ pub struct Assets { id_counter : u32, } -impl Assets { +impl PageAssets { pub fn new() -> Self { - Assets { + PageAssets { theme : *DEFAULT_THEME, favicon : None, metadata : Vec::new(), @@ -206,8 +206,8 @@ impl Assets { } } - pub fn using_theme(&mut self, theme_id: &str) -> &mut Self { - self.theme = find_theme(theme_id).unwrap_or(*DEFAULT_THEME); + pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { + self.theme = find_theme(theme_name).unwrap_or(*DEFAULT_THEME); self } @@ -291,7 +291,7 @@ impl Assets { // Assets EXTRAS. - pub fn required_id(&mut self, prefix: &str, id: &str) -> String { + pub fn serial_id(&mut self, prefix: &str, id: &str) -> String { if id.is_empty() { let prefix = prefix.trim().replace(" ", "_").to_lowercase(); let prefix = if prefix.is_empty() { diff --git a/src/core/response/page/component.rs b/src/core/response/page/component.rs index a7e0ffd7..ccc0facb 100644 --- a/src/core/response/page/component.rs +++ b/src/core/response/page/component.rs @@ -5,7 +5,7 @@ use downcast_rs::{Downcast, impl_downcast}; use std::any::type_name; -pub trait Component: Downcast + Send + Sync { +pub trait PageComponent: Downcast + Send + Sync { fn prepare() -> Self where Self: Sized; @@ -39,4 +39,4 @@ pub trait Component: Downcast + Send + Sync { } } -impl_downcast!(Component); +impl_downcast!(PageComponent); diff --git a/src/core/response/page/container.rs b/src/core/response/page/container.rs index c9d2e13b..6bf5e56a 100644 --- a/src/core/response/page/container.rs +++ b/src/core/response/page/container.rs @@ -4,15 +4,15 @@ use crate::core::response::page::{PageAssets, PageComponent, render_component}; use std::sync::Arc; #[derive(Clone)] -pub struct Container(Vec<Arc<dyn PageComponent>>); +pub struct PageContainer(Vec<Arc<dyn PageComponent>>); -impl Container { +impl PageContainer { pub fn new() -> Self { - Container(Vec::new()) + PageContainer(Vec::new()) } pub fn new_with(component: impl PageComponent) -> Self { - let mut container = Container::new(); + let mut container = PageContainer::new(); container.add(component); container } diff --git a/src/core/response/page/mod.rs b/src/core/response/page/mod.rs index d10c5fcc..f34070e2 100644 --- a/src/core/response/page/mod.rs +++ b/src/core/response/page/mod.rs @@ -1,11 +1,16 @@ -pub mod assets; -pub use assets::Assets as PageAssets; +mod assets; +pub use assets::{ + Favicon, + StyleSheet, + JavaScript, JSMode, + PageAssets, +}; mod component; -pub use component::Component as PageComponent; +pub use component::PageComponent; mod container; -pub use container::Container as PageContainer; +pub use container::PageContainer; mod page; pub use page::Page; diff --git a/src/core/response/page/page.rs b/src/core/response/page/page.rs index 48ea5094..18e8c917 100644 --- a/src/core/response/page/page.rs +++ b/src/core/response/page/page.rs @@ -7,7 +7,7 @@ use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; use std::borrow::Cow; use std::collections::HashMap; -pub static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { +static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { let language = SETTINGS.app.language[..2].to_lowercase(); if !language.is_empty() { Some(language) @@ -16,7 +16,7 @@ pub static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { } }); -pub static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { +static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { let direction = SETTINGS.app.direction.to_lowercase(); match direction.as_str() { "auto" => Some("auto".to_string()), @@ -188,8 +188,8 @@ impl<'a> Page<'a> { // Page EXTRAS. - pub fn using_theme(&mut self, theme_id: &str) -> &mut Self { - self.assets.using_theme(theme_id); + pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { + self.assets.using_theme(theme_name); self } } diff --git a/src/core/theme/api.rs b/src/core/theme/api.rs index 36350110..efbc9cef 100644 --- a/src/core/theme/api.rs +++ b/src/core/theme/api.rs @@ -80,7 +80,7 @@ pub trait Theme: Send + Sync { /* Cómo usarlo: - match component.handle() { + match component.name() { "block" => { let block = component.downcast_mut::<Block>().unwrap(); match block.template() { diff --git a/src/prelude.rs b/src/prelude.rs index 1792da41..94630400 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -8,13 +8,8 @@ pub use crate::trace; pub use crate::localize; pub use crate::core::theme::*; - pub use crate::core::module::*; - pub use crate::core::response::page::*; -pub use crate::core::response::page::assets::*; - pub use crate::core::server; -pub use crate::base::theme::*; pub use crate::base::component::*; From 67952f68401d81879b8d86c93fd7a49c80644dd1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 1 Mar 2022 23:42:37 +0100 Subject: [PATCH 021/853] =?UTF-8?q?Actualiza=20la=20inicializaci=C3=B3n=20?= =?UTF-8?q?de=20traza+localizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/mod.rs | 2 +- src/{locale/locale.rs => core/server/langid.rs} | 0 src/core/server/main.rs | 10 +++++----- src/core/server/mod.rs | 5 +++++ src/{trace/trace.rs => core/server/tracing.rs} | 0 src/{locale/mod.rs => locale.rs} | 4 +--- src/{trace/mod.rs => trace.rs} | 3 --- 7 files changed, 12 insertions(+), 12 deletions(-) rename src/{locale/locale.rs => core/server/langid.rs} (100%) rename src/{trace/trace.rs => core/server/tracing.rs} (100%) rename src/{locale/mod.rs => locale.rs} (97%) rename src/{trace/mod.rs => trace.rs} (71%) diff --git a/src/config/mod.rs b/src/config/mod.rs index afefaf4f..aba410ee 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -2,4 +2,4 @@ pub const CONFIG_DIR: &'static str = "config"; mod settings; -pub use crate::config::settings::{CONFIG, SETTINGS}; +pub use settings::{CONFIG, SETTINGS}; diff --git a/src/locale/locale.rs b/src/core/server/langid.rs similarity index 100% rename from src/locale/locale.rs rename to src/core/server/langid.rs diff --git a/src/core/server/main.rs b/src/core/server/main.rs index fb9663b1..c39c9f83 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,4 +1,4 @@ -use crate::{Lazy, base, locale, trace}; +use crate::{Lazy, base, trace}; use crate::config::SETTINGS; use crate::core::{Server, all, server}; use crate::core::module::register_module; @@ -32,11 +32,11 @@ pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { ); } - // Traza de seguimiento. - Lazy::force(&trace::TRACING); + // Inicia la traza de la aplicación. + Lazy::force(&server::tracing::TRACING); - // Identificador de idioma. - Lazy::force(&locale::LANGID); + // Asigna identificador de idioma. + Lazy::force(&server::langid::LANGID); // Ejecuta la función de inicio de la aplicación. if bootstrap != None { diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index 32e9ce92..6bb25129 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -2,5 +2,10 @@ pub use actix_web::{ App, HttpRequest, HttpResponse, HttpServer, Responder, Result, http, web }; +mod tracing; + +mod langid; +pub use langid::LANGID; + mod main; pub use main::run; diff --git a/src/trace/trace.rs b/src/core/server/tracing.rs similarity index 100% rename from src/trace/trace.rs rename to src/core/server/tracing.rs diff --git a/src/locale/mod.rs b/src/locale.rs similarity index 97% rename from src/locale/mod.rs rename to src/locale.rs index e13d9f21..b43d9fd6 100644 --- a/src/locale/mod.rs +++ b/src/locale.rs @@ -2,14 +2,12 @@ pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; -mod locale; -pub use locale::LANGID; - #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! localize { ( $DEF_LANGID:literal, $locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; + use $crate::core::server::LANGID; static_locale! { static LOCALES = { diff --git a/src/trace/mod.rs b/src/trace.rs similarity index 71% rename from src/trace/mod.rs rename to src/trace.rs index 8ffa8bcd..d8943c68 100644 --- a/src/trace/mod.rs +++ b/src/trace.rs @@ -1,5 +1,2 @@ pub use tracing::{Level, event, span}; pub use tracing::{debug, error, info, trace, warn}; - -mod trace; -pub use trace::TRACING; From b6dd473578a7df9a0cb7bbc03095c7c1080d8012 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 2 Mar 2022 23:19:16 +0100 Subject: [PATCH 022/853] =?UTF-8?q?Actualiza=20y=20simplifica=20la=20estru?= =?UTF-8?q?ctura=20del=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revisión general del código fuente para asegurar los elementos que deben ser públicos y estandarizar el uso de funciones globales. --- src/base/component/block.rs | 18 ++++----- src/base/component/chunck.rs | 4 +- src/base/component/container.rs | 6 +-- src/base/component/form/button.rs | 14 +++---- src/base/component/form/date.rs | 50 ++++++++++++------------ src/base/component/form/form.rs | 18 ++++----- src/base/component/form/hidden.rs | 6 +-- src/base/component/form/input.rs | 48 +++++++++++------------ src/base/component/menu.rs | 18 ++++----- src/base/module/admin/mod.rs | 4 +- src/base/module/homepage/mod.rs | 4 +- src/base/module/user/mod.rs | 6 +-- src/base/theme/aliner/mod.rs | 2 +- src/base/theme/bootsier/mod.rs | 2 +- src/base/theme/minimal/mod.rs | 2 +- src/{config/settings.rs => config.rs} | 4 +- src/config/mod.rs | 5 --- src/core/{all.rs => global.rs} | 12 +----- src/core/mod.rs | 2 +- src/core/module/api.rs | 28 ------------- src/core/module/definition.rs | 16 ++++++++ src/core/module/mod.rs | 18 ++++++++- src/core/response/page/assets.rs | 10 ++--- src/core/response/page/component.rs | 6 +-- src/core/response/page/page.rs | 44 ++++++++++----------- src/core/server/langid.rs | 23 ----------- src/core/server/main.rs | 22 ++++++++--- src/core/server/mod.rs | 3 -- src/core/server/tracing.rs | 13 ++++++ src/core/theme/{api.rs => definition.rs} | 20 ++-------- src/core/theme/mod.rs | 18 ++++++++- src/lib.rs | 2 +- src/locale.rs | 25 +++++++++++- src/util.rs | 14 +++---- 34 files changed, 250 insertions(+), 237 deletions(-) rename src/{config/settings.rs => config.rs} (97%) delete mode 100644 src/config/mod.rs rename src/core/{all.rs => global.rs} (83%) delete mode 100644 src/core/module/api.rs create mode 100644 src/core/module/definition.rs delete mode 100644 src/core/server/langid.rs rename src/core/theme/{api.rs => definition.rs} (85%) diff --git a/src/base/component/block.rs b/src/base/component/block.rs index 9ffe986d..4f658c9e 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -4,7 +4,7 @@ pub struct Block { renderable: fn() -> bool, weight : i8, id : Option<String>, - title : String, + title : Option<String>, markup : Vec<Markup>, template : String, } @@ -16,9 +16,9 @@ impl PageComponent for Block { renderable: always, weight : 0, id : None, - title : "".to_string(), + title : None, markup : Vec::new(), - template : "default".to_string(), + template : "default".to_owned(), } } @@ -34,8 +34,8 @@ impl PageComponent for Block { let id = assets.serial_id(self.name(), self.id()); html! { div id=(id) class="block" { - @if !self.title.is_empty() { - h2 class="block-title" { (self.title) } + @if self.title != None { + h2 class="block-title" { (self.title()) } } div class="block-body" { @for markup in self.markup.iter() { @@ -71,7 +71,7 @@ impl Block { } pub fn with_title(mut self, title: &str) -> Self { - self.title = title.to_string(); + self.title = util::optional_str(title); self } @@ -81,18 +81,18 @@ impl Block { } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } // Block GETTERS. pub fn id(&self) -> &str { - util::assigned_value(&self.id) + util::assigned_str(&self.id) } pub fn title(&self) -> &str { - self.title.as_str() + util::assigned_str(&self.title) } pub fn template(&self) -> &str { diff --git a/src/base/component/chunck.rs b/src/base/component/chunck.rs index 8d4e956f..63cc20f7 100644 --- a/src/base/component/chunck.rs +++ b/src/base/component/chunck.rs @@ -14,7 +14,7 @@ impl PageComponent for Chunck { renderable: always, weight : 0, markup : Vec::new(), - template : "default".to_string(), + template : "default".to_owned(), } } @@ -59,7 +59,7 @@ impl Chunck { } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } diff --git a/src/base/component/container.rs b/src/base/component/container.rs index 61c08336..161bea78 100644 --- a/src/base/component/container.rs +++ b/src/base/component/container.rs @@ -20,7 +20,7 @@ impl PageComponent for Container { id : None, container : ContainerType::Wrapper, components: PageContainer::new(), - template : "default".to_string(), + template : "default".to_owned(), } } @@ -83,14 +83,14 @@ impl Container { } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } // Container GETTERS. pub fn id(&self) -> &str { - util::assigned_value(&self.id) + util::assigned_str(&self.id) } pub fn template(&self) -> &str { diff --git a/src/base/component/form/button.rs b/src/base/component/form/button.rs index c95eb3ec..c76c49dd 100644 --- a/src/base/component/form/button.rs +++ b/src/base/component/form/button.rs @@ -24,7 +24,7 @@ impl PageComponent for Button { value : None, autofocus : None, disabled : None, - template : "default".to_string(), + template : "default".to_owned(), } } @@ -101,13 +101,13 @@ impl Button { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_value(value); + self.value = util::optional_str(value); self } pub fn autofocus(mut self, toggle: bool) -> Self { self.autofocus = match toggle { - true => Some("autofocus".to_string()), + true => Some("autofocus".to_owned()), false => None }; self @@ -115,25 +115,25 @@ impl Button { pub fn disabled(mut self, toggle: bool) -> Self { self.disabled = match toggle { - true => Some("disabled".to_string()), + true => Some("disabled".to_owned()), false => None }; self } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } // Button GETTERS. pub fn name(&self) -> &str { - util::assigned_value(&self.name) + util::assigned_str(&self.name) } pub fn value(&self) -> &str { - util::assigned_value(&self.value) + util::assigned_str(&self.value) } pub fn has_autofocus(&self) -> bool { diff --git a/src/base/component/form/date.rs b/src/base/component/form/date.rs index b2839e8e..ccc6ab31 100644 --- a/src/base/component/form/date.rs +++ b/src/base/component/form/date.rs @@ -5,14 +5,14 @@ pub struct Date { weight : i8, name : Option<String>, value : Option<String>, - label : String, + label : Option<String>, placeholder : Option<String>, autofocus : Option<String>, autocomplete: Option<String>, disabled : Option<String>, readonly : Option<String>, required : Option<String>, - help_text : String, + help_text : Option<String>, template : String, } @@ -24,15 +24,15 @@ impl PageComponent for Date { weight : 0, name : None, value : None, - label : "".to_string(), + label : None, placeholder : None, autofocus : None, autocomplete: None, disabled : None, readonly : None, required : None, - help_text : "".to_string(), - template : "default".to_string(), + help_text : None, + template : "default".to_owned(), } } @@ -51,15 +51,15 @@ impl PageComponent for Date { Some(format!("edit-{}", name)) ), None => ( - "form-item form-type-date".to_string(), + "form-item form-type-date".to_owned(), None ) }; html! { div class=(class_item) { - @if !self.label.is_empty() { + @if self.label != None { label class="form-label" for=[&id_item] { - (self.label) " " + (self.label()) " " @if self.required != None { span class="form-required" @@ -82,9 +82,9 @@ impl PageComponent for Date { readonly=[&self.readonly] required=[&self.required] disabled=[&self.disabled]; - @if !self.help_text.is_empty() { + @if self.help_text != None { div class="form-text" { - (self.help_text) + (self.help_text()) } } } @@ -112,23 +112,23 @@ impl Date { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_value(value); + self.value = util::optional_str(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label = label.to_string(); + self.label = util::optional_str(label); self } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = util::optional_value(placeholder); + self.placeholder = util::optional_str(placeholder); self } pub fn autofocus(mut self, toggle: bool) -> Self { self.autofocus = match toggle { - true => Some("autofocus".to_string()), + true => Some("autofocus".to_owned()), false => None }; self @@ -137,14 +137,14 @@ impl Date { pub fn autocomplete(mut self, toggle: bool) -> Self { self.autocomplete = match toggle { true => None, - false => Some("off".to_string()) + false => Some("off".to_owned()) }; self } pub fn disabled(mut self, toggle: bool) -> Self { self.disabled = match toggle { - true => Some("disabled".to_string()), + true => Some("disabled".to_owned()), false => None }; self @@ -152,7 +152,7 @@ impl Date { pub fn readonly(mut self, toggle: bool) -> Self { self.readonly = match toggle { - true => Some("readonly".to_string()), + true => Some("readonly".to_owned()), false => None }; self @@ -160,38 +160,38 @@ impl Date { pub fn required(mut self, toggle: bool) -> Self { self.required = match toggle { - true => Some("required".to_string()), + true => Some("required".to_owned()), false => None }; self } pub fn with_help_text(mut self, help_text: &str) -> Self { - self.help_text = help_text.to_string(); + self.help_text = util::optional_str(help_text); self } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } // Date GETTERS. pub fn name(&self) -> &str { - util::assigned_value(&self.name) + util::assigned_str(&self.name) } pub fn value(&self) -> &str { - util::assigned_value(&self.value) + util::assigned_str(&self.value) } pub fn label(&self) -> &str { - self.label.as_str() + util::assigned_str(&self.label) } pub fn placeholder(&self) -> &str { - util::assigned_value(&self.placeholder) + util::assigned_str(&self.placeholder) } pub fn has_autofocus(&self) -> bool { @@ -230,7 +230,7 @@ impl Date { } pub fn help_text(&self) -> &str { - self.help_text.as_str() + util::assigned_str(&self.help_text) } pub fn template(&self) -> &str { diff --git a/src/base/component/form/form.rs b/src/base/component/form/form.rs index 6f73469d..63eace0c 100644 --- a/src/base/component/form/form.rs +++ b/src/base/component/form/form.rs @@ -22,9 +22,9 @@ impl PageComponent for Form { id : None, action : None, method : FormMethod::Post, - charset : Some("UTF-8".to_string()), + charset : Some("UTF-8".to_owned()), elements : PageContainer::new(), - template : "default".to_string(), + template : "default".to_owned(), } } @@ -39,7 +39,7 @@ impl PageComponent for Form { fn default_render(&self, assets: &mut PageAssets) -> Markup { let method = match self.method { FormMethod::Get => None, - FormMethod::Post => Some("post".to_string()) + FormMethod::Post => Some("post".to_owned()) }; html! { form @@ -76,7 +76,7 @@ impl Form { } pub fn with_action(mut self, action: &str) -> Self { - self.action = util::optional_value(action); + self.action = util::optional_str(action); self } @@ -86,7 +86,7 @@ impl Form { } pub fn with_charset(mut self, charset: &str) -> Self { - self.charset = util::optional_value(charset); + self.charset = util::optional_str(charset); self } @@ -96,18 +96,18 @@ impl Form { } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } // Form GETTERS. pub fn id(&self) -> &str { - util::assigned_value(&self.id) + util::assigned_str(&self.id) } pub fn action(&self) -> &str { - util::assigned_value(&self.action) + util::assigned_str(&self.action) } pub fn method(&self) -> &str { @@ -118,7 +118,7 @@ impl Form { } pub fn charset(&self) -> &str { - util::assigned_value(&self.charset) + util::assigned_str(&self.charset) } pub fn template(&self) -> &str { diff --git a/src/base/component/form/hidden.rs b/src/base/component/form/hidden.rs index 57b4b34f..9ac0a4f9 100644 --- a/src/base/component/form/hidden.rs +++ b/src/base/component/form/hidden.rs @@ -54,17 +54,17 @@ impl Hidden { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_value(value); + self.value = util::optional_str(value); self } // Hidden GETTERS. pub fn name(&self) -> &str { - util::assigned_value(&self.name) + util::assigned_str(&self.name) } pub fn value(&self) -> &str { - util::assigned_value(&self.value) + util::assigned_str(&self.value) } } diff --git a/src/base/component/form/input.rs b/src/base/component/form/input.rs index 82c0bda3..884d2232 100644 --- a/src/base/component/form/input.rs +++ b/src/base/component/form/input.rs @@ -8,7 +8,7 @@ pub struct Input { input_type : InputType, name : Option<String>, value : Option<String>, - label : String, + label : Option<String>, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, @@ -18,7 +18,7 @@ pub struct Input { disabled : Option<String>, readonly : Option<String>, required : Option<String>, - help_text : String, + help_text : Option<String>, template : String, } @@ -31,7 +31,7 @@ impl PageComponent for Input { input_type : InputType::Textfield, name : None, value : None, - label : "".to_string(), + label : None, size : Some(60), minlength : None, maxlength : Some(128), @@ -41,8 +41,8 @@ impl PageComponent for Input { disabled : None, readonly : None, required : None, - help_text : "".to_string(), - template : "default".to_string(), + help_text : None, + template : "default".to_owned(), } } @@ -75,9 +75,9 @@ impl PageComponent for Input { }; html! { div class=(class_item) { - @if !self.label.is_empty() { + @if self.label != None { label class="form-label" for=[&id_item] { - (self.label) " " + (self.label()) " " @if self.required != None { span class="form-required" @@ -103,9 +103,9 @@ impl PageComponent for Input { readonly=[&self.readonly] required=[&self.required] disabled=[&self.disabled]; - @if !self.help_text.is_empty() { + @if self.help_text != None { div class="form-text" { - (self.help_text) + (self.help_text()) } } } @@ -167,12 +167,12 @@ impl Input { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_value(value); + self.value = util::optional_str(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label = label.to_string(); + self.label = util::optional_str(label); self } @@ -192,13 +192,13 @@ impl Input { } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = util::optional_value(placeholder); + self.placeholder = util::optional_str(placeholder); self } pub fn autofocus(mut self, toggle: bool) -> Self { self.autofocus = match toggle { - true => Some("autofocus".to_string()), + true => Some("autofocus".to_owned()), false => None }; self @@ -207,14 +207,14 @@ impl Input { pub fn autocomplete(mut self, toggle: bool) -> Self { self.autocomplete = match toggle { true => None, - false => Some("off".to_string()) + false => Some("off".to_owned()) }; self } pub fn disabled(mut self, toggle: bool) -> Self { self.disabled = match toggle { - true => Some("disabled".to_string()), + true => Some("disabled".to_owned()), false => None }; self @@ -222,7 +222,7 @@ impl Input { pub fn readonly(mut self, toggle: bool) -> Self { self.readonly = match toggle { - true => Some("readonly".to_string()), + true => Some("readonly".to_owned()), false => None }; self @@ -230,34 +230,34 @@ impl Input { pub fn required(mut self, toggle: bool) -> Self { self.required = match toggle { - true => Some("required".to_string()), + true => Some("required".to_owned()), false => None }; self } pub fn with_help_text(mut self, help_text: &str) -> Self { - self.help_text = help_text.to_string(); + self.help_text = util::optional_str(help_text); self } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } // Input GETTERS. pub fn name(&self) -> &str { - util::assigned_value(&self.name) + util::assigned_str(&self.name) } pub fn value(&self) -> &str { - util::assigned_value(&self.value) + util::assigned_str(&self.value) } pub fn label(&self) -> &str { - self.label.as_str() + util::assigned_str(&self.label) } pub fn size(&self) -> Option<u16> { @@ -273,7 +273,7 @@ impl Input { } pub fn placeholder(&self) -> &str { - util::assigned_value(&self.placeholder) + util::assigned_str(&self.placeholder) } pub fn has_autofocus(&self) -> bool { @@ -312,7 +312,7 @@ impl Input { } pub fn help_text(&self) -> &str { - self.help_text.as_str() + util::assigned_str(&self.help_text) } pub fn template(&self) -> &str { diff --git a/src/base/component/menu.rs b/src/base/component/menu.rs index 0f44fad5..d3cdb6b8 100644 --- a/src/base/component/menu.rs +++ b/src/base/component/menu.rs @@ -75,7 +75,7 @@ impl MenuItem { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::Label(label.to_string())), + item_type : Some(MenuItemType::Label(label.to_owned())), } } @@ -84,8 +84,8 @@ impl MenuItem { renderable: always, weight : 0, item_type : Some(MenuItemType::Link( - label.to_string(), - path.to_string(), + label.to_owned(), + path.to_owned(), )), } } @@ -95,8 +95,8 @@ impl MenuItem { renderable: always, weight : 0, item_type : Some(MenuItemType::LinkBlank( - label.to_string(), - path.to_string(), + label.to_owned(), + path.to_owned(), )), } } @@ -122,7 +122,7 @@ impl MenuItem { renderable: always, weight : 0, item_type : Some(MenuItemType::Submenu( - label.to_string(), + label.to_owned(), menu )), } @@ -161,7 +161,7 @@ impl PageComponent for Menu { weight : 0, id : None, items : PageContainer::new(), - template : "default".to_string(), + template : "default".to_owned(), } } @@ -226,14 +226,14 @@ impl Menu { } pub fn using_template(mut self, template: &str) -> Self { - self.template = template.to_string(); + self.template = template.to_owned(); self } // Menu GETTERS. pub fn id(&self) -> &str { - util::assigned_value(&self.id) + util::assigned_str(&self.id) } pub fn template(&self) -> &str { diff --git a/src/base/module/admin/mod.rs b/src/base/module/admin/mod.rs index 5991d4f0..0bb1202d 100644 --- a/src/base/module/admin/mod.rs +++ b/src/base/module/admin/mod.rs @@ -15,8 +15,8 @@ impl Module for AdminModule { l("module_fullname") } - fn description(&self) -> String { - l("module_description") + fn description(&self) -> Option<String> { + Some(l("module_description")) } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/src/base/module/homepage/mod.rs b/src/base/module/homepage/mod.rs index 386b6716..de4b98ce 100644 --- a/src/base/module/homepage/mod.rs +++ b/src/base/module/homepage/mod.rs @@ -13,8 +13,8 @@ impl Module for HomepageModule { l("module_fullname") } - fn description(&self) -> String { - l("module_description") + fn description(&self) -> Option<String> { + Some(l("module_description")) } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/src/base/module/user/mod.rs b/src/base/module/user/mod.rs index bbb3ee93..73ab7d16 100644 --- a/src/base/module/user/mod.rs +++ b/src/base/module/user/mod.rs @@ -13,8 +13,8 @@ impl Module for UserModule { l("module_fullname") } - fn description(&self) -> String { - l("module_description") + fn description(&self) -> Option<String> { + Some(l("module_description")) } fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { @@ -29,7 +29,7 @@ fn form_login() -> impl PageComponent { .with_name("name") .with_label(l("username").as_str()) .with_help_text(t("username_help", &args![ - "app" => SETTINGS.app.name.to_string() + "app" => SETTINGS.app.name.to_owned() ]).as_str()) .autofocus(true) ) diff --git a/src/base/theme/aliner/mod.rs b/src/base/theme/aliner/mod.rs index d27e2f91..b678d4b7 100644 --- a/src/base/theme/aliner/mod.rs +++ b/src/base/theme/aliner/mod.rs @@ -10,7 +10,7 @@ impl Theme for AlinerTheme { } fn fullname(&self) -> String { - "Aliner".to_string() + "Aliner".to_owned() } fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/src/base/theme/bootsier/mod.rs b/src/base/theme/bootsier/mod.rs index 97b7fa46..3a340a84 100644 --- a/src/base/theme/bootsier/mod.rs +++ b/src/base/theme/bootsier/mod.rs @@ -12,7 +12,7 @@ impl Theme for BootsierTheme { } fn fullname(&self) -> String { - "Bootsier".to_string() + "Bootsier".to_owned() } fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/src/base/theme/minimal/mod.rs b/src/base/theme/minimal/mod.rs index 17611468..c6780005 100644 --- a/src/base/theme/minimal/mod.rs +++ b/src/base/theme/minimal/mod.rs @@ -8,6 +8,6 @@ impl Theme for MinimalTheme { } fn fullname(&self) -> String { - "Minimal".to_string() + "Minimal".to_owned() } } diff --git a/src/config/settings.rs b/src/config.rs similarity index 97% rename from src/config/settings.rs rename to src/config.rs index 66ddbe42..bd80bd76 100644 --- a/src/config/settings.rs +++ b/src/config.rs @@ -1,11 +1,13 @@ use crate::Lazy; -use crate::config::CONFIG_DIR; use config_rs::{Config, File}; use serde::Deserialize; use std::env; +/// Nombre del directorio donde se encuentra la configuración. +const CONFIG_DIR: &'static str = "config"; + /// Al arrancar la aplicación, carga los valores originales "clave = valor" de /// los archivos de configuración. Con [`config_map`] se asignarán los ajustes /// globales ([`SETTINGS`]); y se podrán asignar los ajustes específicos de la diff --git a/src/config/mod.rs b/src/config/mod.rs deleted file mode 100644 index aba410ee..00000000 --- a/src/config/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -/// Nombre del directorio donde se encuentra la configuración. -pub const CONFIG_DIR: &'static str = "config"; - -mod settings; -pub use settings::{CONFIG, SETTINGS}; diff --git a/src/core/all.rs b/src/core/global.rs similarity index 83% rename from src/core/all.rs rename to src/core/global.rs index eb7bed10..1d64d44f 100644 --- a/src/core/all.rs +++ b/src/core/global.rs @@ -3,7 +3,6 @@ use crate::core::theme::Theme; use crate::core::module::Module; use crate::core::response::page::PageContainer; use crate::core::server; -use crate::base; use std::sync::RwLock; use std::collections::HashMap; @@ -15,11 +14,7 @@ include!(concat!(env!("OUT_DIR"), "/theme.rs")); // ----------------------------------------------------------------------------- pub static THEMES: Lazy<RwLock<Vec<&dyn Theme>>> = Lazy::new(|| { - RwLock::new(vec![ - &base::theme::aliner::AlinerTheme, - &base::theme::minimal::MinimalTheme, - &base::theme::bootsier::BootsierTheme, - ]) + RwLock::new(Vec::new()) }); pub fn themes(cfg: &mut server::web::ServiceConfig) { @@ -38,10 +33,7 @@ pub fn themes(cfg: &mut server::web::ServiceConfig) { // ----------------------------------------------------------------------------- pub static MODULES: Lazy<RwLock<Vec<&dyn Module>>> = Lazy::new(|| { - RwLock::new(vec![ - &base::module::admin::AdminModule, - &base::module::user::UserModule, - ]) + RwLock::new(Vec::new()) }); pub fn modules(cfg: &mut server::web::ServiceConfig) { diff --git a/src/core/mod.rs b/src/core/mod.rs index 40530f15..26618959 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,6 +1,6 @@ pub use actix_web::dev::Server; -mod all; +mod global; pub mod theme; pub mod module; diff --git a/src/core/module/api.rs b/src/core/module/api.rs deleted file mode 100644 index 83be71c3..00000000 --- a/src/core/module/api.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::core::{all, server}; - -/// Los módulos deben implementar este *trait*. -pub trait Module: Send + Sync { - fn name(&self) -> &'static str; - - fn fullname(&self) -> String; - - fn description(&self) -> String { - "".to_string() - } - - #[allow(unused_variables)] - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - } -} - -pub fn register_module(m: &'static (dyn Module + 'static)) { - all::MODULES.write().unwrap().push(m); -} - -pub fn find_module(name: &str) -> Option<&'static (dyn Module + 'static)> { - let modules = all::MODULES.write().unwrap(); - match modules.iter().find(|t| t.name() == name) { - Some(module) => Some(*module), - _ => None, - } -} diff --git a/src/core/module/definition.rs b/src/core/module/definition.rs new file mode 100644 index 00000000..40e9cee8 --- /dev/null +++ b/src/core/module/definition.rs @@ -0,0 +1,16 @@ +use crate::core::server; + +/// Los módulos deben implementar este *trait*. +pub trait Module: Send + Sync { + fn name(&self) -> &'static str; + + fn fullname(&self) -> String; + + fn description(&self) -> Option<String> { + None + } + + #[allow(unused_variables)] + fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + } +} diff --git a/src/core/module/mod.rs b/src/core/module/mod.rs index 08686bcd..439cff79 100644 --- a/src/core/module/mod.rs +++ b/src/core/module/mod.rs @@ -1,2 +1,16 @@ -mod api; -pub use api::{Module, find_module, register_module}; +use crate::core::global; + +mod definition; +pub use definition::Module; + +pub fn register_module(m: &'static (dyn Module + 'static)) { + global::MODULES.write().unwrap().push(m); +} + +pub fn find_module(name: &str) -> Option<&'static (dyn Module + 'static)> { + let modules = global::MODULES.write().unwrap(); + match modules.iter().find(|t| t.name() == name) { + Some(module) => Some(*module), + _ => None, + } +} diff --git a/src/core/response/page/assets.rs b/src/core/response/page/assets.rs index 77174e58..11cdd35c 100644 --- a/src/core/response/page/assets.rs +++ b/src/core/response/page/assets.rs @@ -1,10 +1,10 @@ use crate::{Lazy, base}; use crate::config::SETTINGS; -use crate::core::all; +use crate::core::global; use crate::core::theme::{Markup, PreEscaped, Theme, find_theme, html}; static DEFAULT_THEME: Lazy<&dyn Theme> = Lazy::new(|| { - for t in all::THEMES.read().unwrap().iter() { + for t in global::THEMES.read().unwrap().iter() { if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { return *t; } @@ -73,7 +73,7 @@ impl Favicon { ) -> Self { let mut link: String = format!("<link rel=\"{}\"", rel); if let Some(i) = source.rfind('.') { - link = match source[i..].to_string().to_lowercase().as_str() { + link = match source[i..].to_owned().to_lowercase().as_str() { ".gif" => format!("{} type=\"image/gif\"", link), ".ico" => format!("{} type=\"image/x-icon\"", link), ".jpg" => format!("{} type=\"image/jpg\"", link), @@ -295,14 +295,14 @@ impl PageAssets { if id.is_empty() { let prefix = prefix.trim().replace(" ", "_").to_lowercase(); let prefix = if prefix.is_empty() { - "prefix".to_string() + "prefix".to_owned() } else { prefix }; self.id_counter += 1; [prefix, self.id_counter.to_string()].join("-") } else { - id.to_string() + id.to_owned() } } } diff --git a/src/core/response/page/component.rs b/src/core/response/page/component.rs index ccc0facb..1472ffe2 100644 --- a/src/core/response/page/component.rs +++ b/src/core/response/page/component.rs @@ -18,11 +18,11 @@ pub trait PageComponent: Downcast + Send + Sync { } fn fullname(&self) -> String { - type_name::<Self>().to_string() + type_name::<Self>().to_owned() } - fn description(&self) -> String { - "".to_string() + fn description(&self) -> Option<String> { + None } fn is_renderable(&self) -> bool { diff --git a/src/core/response/page/page.rs b/src/core/response/page/page.rs index 18e8c917..8052683d 100644 --- a/src/core/response/page/page.rs +++ b/src/core/response/page/page.rs @@ -1,6 +1,6 @@ use crate::{Lazy, trace, util}; use crate::config::SETTINGS; -use crate::core::{all, server}; +use crate::core::{global, server}; use crate::core::theme::{DOCTYPE, Markup, html}; use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; @@ -19,9 +19,9 @@ static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { let direction = SETTINGS.app.direction.to_lowercase(); match direction.as_str() { - "auto" => Some("auto".to_string()), - "ltr" => Some("ltr".to_string()), - "rtl" => Some("rtl".to_string()), + "auto" => Some("auto".to_owned()), + "ltr" => Some("ltr".to_owned()), + "rtl" => Some("rtl".to_owned()), "" => None, _ => { trace::warn!( @@ -44,7 +44,7 @@ pub struct Page<'a> { assets : PageAssets, body_classes: Cow<'a, str>, regions : HashMap<&'a str, PageContainer>, - template : Option<String>, + template : String, } impl<'a> Page<'a> { @@ -52,45 +52,45 @@ impl<'a> Page<'a> { pub fn prepare() -> Self { Page { language : match &*DEFAULT_LANGUAGE { - Some(language) => Some(language.to_string()), + Some(language) => Some(language.to_owned()), _ => None, }, direction : match &*DEFAULT_DIRECTION { - Some(direction) => Some(direction.to_string()), + Some(direction) => Some(direction.to_owned()), _ => None, }, title : None, description : None, body_classes: "body".into(), assets : PageAssets::new(), - regions : all::COMPONENTS.read().unwrap().clone(), - template : Some("default".to_string()), + regions : global::COMPONENTS.read().unwrap().clone(), + template : "default".to_owned(), } } // Page BUILDER. pub fn with_language(&mut self, language: &str) -> &mut Self { - self.language = util::optional_value(language); + self.language = util::optional_str(language); self } pub fn with_direction(&mut self, dir: TextDirection) -> &mut Self { self.direction = match dir { - TextDirection::Auto => Some("auto".to_string()), - TextDirection::LeftToRight => Some("ltr".to_string()), - TextDirection::RightToLeft => Some("rtl".to_string()), + TextDirection::Auto => Some("auto".to_owned()), + TextDirection::LeftToRight => Some("ltr".to_owned()), + TextDirection::RightToLeft => Some("rtl".to_owned()), }; self } pub fn with_title(&mut self, title: &str) -> &mut Self { - self.title = util::optional_value(title); + self.title = util::optional_str(title); self } pub fn with_description(&mut self, description: &str) -> &mut Self { - self.description = util::optional_value(description); + self.description = util::optional_str(description); self } @@ -120,26 +120,26 @@ impl<'a> Page<'a> { } pub fn using_template(&mut self, template: &str) -> &mut Self { - self.template = util::optional_value(template); + self.template = template.to_owned(); self } // Page GETTERS. pub fn language(&self) -> &str { - util::assigned_value(&self.language) + util::assigned_str(&self.language) } pub fn direction(&self) -> &str { - util::assigned_value(&self.direction) + util::assigned_str(&self.direction) } pub fn title(&self) -> &str { - util::assigned_value(&self.title) + util::assigned_str(&self.title) } pub fn description(&self) -> &str { - util::assigned_value(&self.description) + util::assigned_str(&self.description) } pub fn body_classes(&self) -> &str { @@ -154,7 +154,7 @@ impl<'a> Page<'a> { } pub fn template(&self) -> &str { - util::assigned_value(&self.template) + self.template.as_str() } // Page RENDER. @@ -208,7 +208,7 @@ pub fn render_component( } pub fn add_component_to(region: &'static str, component: impl PageComponent) { - let mut hmap = all::COMPONENTS.write().unwrap(); + let mut hmap = global::COMPONENTS.write().unwrap(); if let Some(regions) = hmap.get_mut(region) { regions.add(component); } else { diff --git a/src/core/server/langid.rs b/src/core/server/langid.rs deleted file mode 100644 index 3638a6a4..00000000 --- a/src/core/server/langid.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::{Lazy, trace}; -use crate::config::SETTINGS; - -use unic_langid::LanguageIdentifier; - -/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] -/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de -/// la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { - match SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "Failed to parse language \"{}\". {}. {}. {}.", - SETTINGS.app.language, - "Unicode Language Identifier not recognized", - "Using \"en-US\"", - "Check the settings file", - ); - "en-US".parse().unwrap() - } - } -}); diff --git a/src/core/server/main.rs b/src/core/server/main.rs index c39c9f83..b6800142 100644 --- a/src/core/server/main.rs +++ b/src/core/server/main.rs @@ -1,6 +1,7 @@ -use crate::{Lazy, base, trace}; +use crate::{Lazy, base, locale, trace}; use crate::config::SETTINGS; -use crate::core::{Server, all, server}; +use crate::core::{Server, global, server}; +use crate::core::theme::register_theme; use crate::core::module::register_module; use actix_web::middleware::normalize; @@ -32,11 +33,20 @@ pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { ); } - // Inicia la traza de la aplicación. + // Inicia registro de trazas y eventos. Lazy::force(&server::tracing::TRACING); // Asigna identificador de idioma. - Lazy::force(&server::langid::LANGID); + Lazy::force(&locale::LANGID); + + // Registra los temas predefinidos. + register_theme(&base::theme::aliner::AlinerTheme); + register_theme(&base::theme::minimal::MinimalTheme); + register_theme(&base::theme::bootsier::BootsierTheme); + + // Registra los módulos predeterminados. + register_module(&base::module::admin::AdminModule); + register_module(&base::module::user::UserModule); // Ejecuta la función de inicio de la aplicación. if bootstrap != None { @@ -54,8 +64,8 @@ pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { server::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(normalize::NormalizePath::new(normalize::TrailingSlash::Trim)) - .configure(&all::themes) - .configure(&all::modules) + .configure(&global::themes) + .configure(&global::modules) }) .bind(format!("{}:{}", &SETTINGS.webserver.bind_address, diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index 6bb25129..7db53759 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -4,8 +4,5 @@ pub use actix_web::{ mod tracing; -mod langid; -pub use langid::LANGID; - mod main; pub use main::run; diff --git a/src/core/server/tracing.rs b/src/core/server/tracing.rs index fd907461..a9804213 100644 --- a/src/core/server/tracing.rs +++ b/src/core/server/tracing.rs @@ -4,6 +4,19 @@ use crate::config::SETTINGS; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; +/// Registro de trazas y eventos de la aplicación. +/// +/// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de +/// escritura sin bloqueo (*non-blocking writer*) que actúa periódicamente en +/// vez de enviar cada traza o evento al instante. Si el programa termina +/// abruptamente (por ejemplo, por un `panic!` o un `std::process::exit`), es +/// posible que algunas trazas o eventos no se envíen. +/// +/// Puesto que las trazas o eventos registrados poco antes de la caída de una +/// aplicación suelen ser importantes para diagnosticar la causa del fallo, con +/// `Lazy<WorkerGuard>` se garantiza que todos los registros almacenados se +/// enviarán antes de terminar la ejecución. + pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing) .unwrap_or(EnvFilter::new("Info")); diff --git a/src/core/theme/api.rs b/src/core/theme/definition.rs similarity index 85% rename from src/core/theme/api.rs rename to src/core/theme/definition.rs index efbc9cef..12d9e05f 100644 --- a/src/core/theme/api.rs +++ b/src/core/theme/definition.rs @@ -1,5 +1,5 @@ use crate::config::SETTINGS; -use crate::core::{all, server}; +use crate::core::server; use crate::core::theme::{Markup, html}; use crate::core::response::page::{Page, PageAssets, PageComponent}; use crate::base::component::Chunck; @@ -10,8 +10,8 @@ pub trait Theme: Send + Sync { fn fullname(&self) -> String; - fn description(&self) -> String { - "".to_string() + fn description(&self) -> Option<String> { + None } #[allow(unused_variables)] @@ -25,7 +25,7 @@ pub trait Theme: Send + Sync { fn render_page_head(&self, page: &mut Page) -> Markup { let title = page.title(); let title = if title.is_empty() { - SETTINGS.app.name.to_string() + SETTINGS.app.name.to_owned() } else { [SETTINGS.app.name.to_string(), title.to_string()].join(" | ") }; @@ -104,15 +104,3 @@ pub trait Theme: Send + Sync { .render() } } - -pub fn register_theme(t: &'static (dyn Theme + 'static)) { - all::THEMES.write().unwrap().push(t); -} - -pub fn find_theme(name: &str) -> Option<&'static (dyn Theme + 'static)> { - let themes = all::THEMES.write().unwrap(); - match themes.iter().find(|t| t.name() == name) { - Some(theme) => Some(*theme), - _ => None, - } -} diff --git a/src/core/theme/mod.rs b/src/core/theme/mod.rs index 9f708803..8292ade6 100644 --- a/src/core/theme/mod.rs +++ b/src/core/theme/mod.rs @@ -1,4 +1,18 @@ +use crate::core::global; + pub use maud::{DOCTYPE, Markup, PreEscaped, html}; -mod api; -pub use api::{Theme, find_theme, register_theme}; +mod definition; +pub use definition::Theme; + +pub fn register_theme(t: &'static (dyn Theme + 'static)) { + global::THEMES.write().unwrap().push(t); +} + +pub fn find_theme(name: &str) -> Option<&'static (dyn Theme + 'static)> { + let themes = global::THEMES.write().unwrap(); + match themes.iter().find(|t| t.name() == name) { + Some(theme) => Some(*theme), + _ => None, + } +} diff --git a/src/lib.rs b/src/lib.rs index 42f51a3a..7d17db44 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ pub use once_cell::sync::Lazy; // ----------------------------------------------------------------------------- pub mod config; // Gestión de la configuración. -pub mod trace; // Traza de ejecución. +pub mod trace; // Registro de trazas y eventos de la aplicación. pub mod locale; // Localización. pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. pub mod base; // Temas, Módulos y Componentes base. diff --git a/src/locale.rs b/src/locale.rs index b43d9fd6..e3639858 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -2,12 +2,35 @@ pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; +use crate::{Lazy, trace}; +use crate::config::SETTINGS; + +use unic_langid::LanguageIdentifier; + +/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] +/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de +/// la aplicación, obtenido de `SETTINGS.app.language`. +pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { + match SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "Failed to parse language \"{}\". {}. {}. {}.", + SETTINGS.app.language, + "Unicode Language Identifier not recognized", + "Using \"en-US\"", + "Check the settings file", + ); + "en-US".parse().unwrap() + } + } +}); + #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! localize { ( $DEF_LANGID:literal, $locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; - use $crate::core::server::LANGID; static_locale! { static LOCALES = { diff --git a/src/util.rs b/src/util.rs index 638e948f..3fff0a23 100644 --- a/src/util.rs +++ b/src/util.rs @@ -26,17 +26,17 @@ pub fn valid_id(id: &str) -> Option<String> { } } -pub fn optional_value(value: &str) -> Option<String> { - let value = value.to_string(); - match value.is_empty() { +pub fn optional_str(s: &str) -> Option<String> { + let s = s.to_owned(); + match s.is_empty() { true => None, - false => Some(value), + false => Some(s), } } -pub fn assigned_value(value: &Option<String>) -> &str { - match value { - Some(value) => value.as_str(), +pub fn assigned_str(optional: &Option<String>) -> &str { + match optional { + Some(o) => o.as_str(), _ => "", } } From 76785af4dc801e587cba904d013977acbd854c9b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Mar 2022 00:10:48 +0100 Subject: [PATCH 023/853] =?UTF-8?q?A=C3=B1ade=20configuraci=C3=B3n=20y=20c?= =?UTF-8?q?onexi=C3=B3n=20a=20la=20base=20de=20datos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 12 +++ config/settings.default.toml | 14 ++++ src/base/module/admin/summary.rs | 3 +- src/config.rs | 19 +++++ src/core/server/app.rs | 138 +++++++++++++++++++++++++++++++ src/core/server/dbconn.rs | 8 ++ src/core/server/main.rs | 76 ----------------- src/core/server/mod.rs | 6 +- src/database.rs | 1 + src/lib.rs | 3 + src/locale.rs | 6 +- src/main.rs | 6 +- src/prelude.rs | 1 + 13 files changed, 210 insertions(+), 83 deletions(-) create mode 100644 src/core/server/app.rs create mode 100644 src/core/server/dbconn.rs delete mode 100644 src/core/server/main.rs create mode 100644 src/database.rs diff --git a/Cargo.toml b/Cargo.toml index 6d9fa877..d28a0e33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ once_cell = "1.9.0" figlet-rs = "0.1.3" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } +url = "2.2.2" tracing = "0.1" tracing-appender = "0.2" @@ -47,9 +48,20 @@ downcast-rs = "1.2.0" serde = { version = "1.0", features = ["derive"] } +[dependencies.sea-orm] +version = "0.6" +features = ["macros", "debug-print", "runtime-async-std-native-tls"] +default-features = false + [build-dependencies] actix-web-static-files = "3.0.5" +[features] +default = ["sea-orm/sqlx-mysql"] +mysql = ["sea-orm/sqlx-mysql"] +postgres = ["sea-orm/sqlx-postgres"] +sqlite = ["sea-orm/sqlx-sqlite"] + [lib] name = "pagetop" diff --git a/config/settings.default.toml b/config/settings.default.toml index 3a4fb0ff..f22868d2 100644 --- a/config/settings.default.toml +++ b/config/settings.default.toml @@ -23,6 +23,20 @@ prefix = "tracing.log" # Presentación de las trazas: "Json", "Full", "Compact" o "Pretty". format = "Json" +[database] +# Ajustes para conectar con la base de datos. +# El tipo de base de datos es una característica de compilación. +# Nombre (mysql/postgres) o referencia (sqlite) de la base de datos. +db_name = "dbname" +# Usuario y contraseña (mysql/postgres). +db_user = "dbuser" +db_pass = "dbpass" +# Servidor (mysql/postgres) y puerto predeterminado (0 para 3306 ó 5432). +db_host = "localhost" +db_port = 0 +# Número máximo de conexiones habilitadas. +max_pool_size = 5 + [webserver] # Configuración del servidor web. bind_address = "localhost" diff --git a/src/base/module/admin/summary.rs b/src/base/module/admin/summary.rs index 2f889e9e..cee26c22 100644 --- a/src/base/module/admin/summary.rs +++ b/src/base/module/admin/summary.rs @@ -1,8 +1,9 @@ use crate::prelude::*; +use super::l; pub async fn summary() -> server::Result<Markup> { let top_menu = Menu::prepare() - .add(MenuItem::label("Opción 1")) + .add(MenuItem::label(l("module_fullname").as_str())) .add(MenuItem::link("Opción 2", "https://www.google.es")) .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) .add(MenuItem::submenu("Submenú 1", Menu::prepare() diff --git a/src/config.rs b/src/config.rs index bd80bd76..c6232c7a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -87,6 +87,16 @@ pub struct Log { pub format : String, } +#[derive(Debug, Deserialize)] +pub struct Database { + pub db_name : String, + pub db_user : String, + pub db_pass : String, + pub db_host : String, + pub db_port : u16, + pub max_pool_size : u32, +} + #[derive(Debug, Deserialize)] pub struct Webserver { pub bind_address : String, @@ -97,6 +107,7 @@ pub struct Webserver { pub struct Settings { pub app : App, pub log : Log, + pub database : Database, pub webserver : Webserver, } @@ -121,6 +132,14 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]*, "log.prefix" => "tracing.log", "log.format" => "json", + // [database] + "database.db_name" => "dbname", + "database.db_user" => "dbuser", + "database.db_pass" => "dbpass", + "database.db_host" => "localhost", + "database.db_port" => 0, + "database.max_pool_size" => 5, + // [webserver] "webserver.bind_address" => "localhost", "webserver.bind_port" => 8088 diff --git a/src/core/server/app.rs b/src/core/server/app.rs new file mode 100644 index 00000000..3861c412 --- /dev/null +++ b/src/core/server/app.rs @@ -0,0 +1,138 @@ +use crate::{Lazy, base, locale, trace}; +use crate::config::SETTINGS; +use crate::core::{Server, global, server}; +use crate::core::theme::register_theme; +use crate::core::module::register_module; + +use std::io::Error; +use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; + +pub struct Application { + server: Server, +} + +impl Application { + pub async fn build(bootstrap: Option<fn()>) -> Result<Self, Error> { + // Imprime rótulo (opcional) de bienvenida. + if SETTINGS.app.startup_banner.to_lowercase() != "off" { + let figfont = figlet_rs::FIGfont::from_content( + match SETTINGS.app.startup_banner.to_lowercase().as_str() { + "slant" => include_str!("figfonts/slant.flf"), + "small" => include_str!("figfonts/small.flf"), + "speed" => include_str!("figfonts/speed.flf"), + "starwars" => include_str!("figfonts/starwars.flf"), + _ => { + println!( + "FIGfont \"{}\" not found for banner. {}. {}.", + SETTINGS.app.startup_banner, + "Using \"Small\"", + "Check the settings file", + ); + include_str!("figfonts/small.flf") + } + } + ).unwrap(); + println!("\n{} {}\n\n Powered by PageTop {}\n", + figfont.convert(&SETTINGS.app.name).unwrap(), + &SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + } + + // Inicia registro de trazas y eventos. + Lazy::force(&server::tracing::TRACING); + + // Valida el identificador de idioma. + Lazy::force(&locale::LANGID); + + // Inicializa la conexión con la base de datos. + trace::info!( + "Connecting to database \"{}\" with a pool of {} connections.", + &SETTINGS.database.db_name, + &SETTINGS.database.max_pool_size + ); + + #[cfg(any(feature = "default", feature = "mysql"))] + let db_uri = format!( + "mysql://{}/{}", + &SETTINGS.database.db_host, + &SETTINGS.database.db_name + ); + + #[cfg(feature = "postgres")] + let db_uri = format!( + "postgres://{}/{}", + &SETTINGS.database.db_host, + &SETTINGS.database.db_name + ); + + #[cfg(feature = "sqlite")] + let db_uri = format!("sqlite://{}", &SETTINGS.database.db_name); + + let mut uri = url::Url::parse(&db_uri).unwrap(); + + // https://github.com/launchbadge/sqlx/issues/1624 + + #[cfg(not(feature = "sqlite"))] + uri.set_username(&SETTINGS.database.db_user.as_str()).unwrap(); + + #[cfg(not(feature = "sqlite"))] + uri.set_password(Some(&SETTINGS.database.db_pass.as_str())).unwrap(); + + #[cfg(not(feature = "sqlite"))] + if SETTINGS.database.db_port != 0 { + uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); + } + + let mut db_options = sea_orm::ConnectOptions::new(uri.to_string()); + db_options.max_connections(SETTINGS.database.max_pool_size); + + let mut db_conn = server::dbconn::DBCONN.write().unwrap(); + *db_conn = Some( + sea_orm::Database::connect::<sea_orm::ConnectOptions>( + db_options.into() + ) + .await + .expect("Failed to connect to database") + ); + + // Registra los temas predefinidos. + register_theme(&base::theme::aliner::AlinerTheme); + register_theme(&base::theme::minimal::MinimalTheme); + register_theme(&base::theme::bootsier::BootsierTheme); + + // Registra los módulos predeterminados. + register_module(&base::module::admin::AdminModule); + register_module(&base::module::user::UserModule); + + // Ejecuta la función de inicio de la aplicación. + if bootstrap != None { + trace::debug!("Calling application bootstrap"); + let _ = &(bootstrap.unwrap())(); + } + + // Registra el módulo para la página de inicio de PageTop. + // Al ser el último, puede sobrecargarse con la función de inicio. + register_module(&base::module::homepage::HomepageModule); + + // Prepara el servidor web. + let server = server::HttpServer::new(|| { + server::App::new() + .wrap(tracing_actix_web::TracingLogger) + .wrap(NormalizePath::new(TrailingSlash::Trim)) + .configure(&global::themes) + .configure(&global::modules) + }) + .bind(format!("{}:{}", + &SETTINGS.webserver.bind_address, + &SETTINGS.webserver.bind_port + ))? + .run(); + + Ok(Self { server }) + } + + pub fn run(self) -> Result<Server, Error> { + Ok(self.server) + } +} diff --git a/src/core/server/dbconn.rs b/src/core/server/dbconn.rs new file mode 100644 index 00000000..e80629fc --- /dev/null +++ b/src/core/server/dbconn.rs @@ -0,0 +1,8 @@ +use crate::Lazy; +use crate::database::DatabaseConnection; + +use std::sync::RwLock; + +pub static DBCONN: Lazy<RwLock<Option<DatabaseConnection>>> = Lazy::new(|| { + RwLock::new(None) +}); diff --git a/src/core/server/main.rs b/src/core/server/main.rs deleted file mode 100644 index b6800142..00000000 --- a/src/core/server/main.rs +++ /dev/null @@ -1,76 +0,0 @@ -use crate::{Lazy, base, locale, trace}; -use crate::config::SETTINGS; -use crate::core::{Server, global, server}; -use crate::core::theme::register_theme; -use crate::core::module::register_module; - -use actix_web::middleware::normalize; - -pub fn run(bootstrap: Option<fn()>) -> Result<Server, std::io::Error> { - // Imprime el rótulo (opcional) de bienvenida. - if SETTINGS.app.startup_banner.to_lowercase() != "off" { - let figfont = figlet_rs::FIGfont::from_content( - match SETTINGS.app.startup_banner.to_lowercase().as_str() { - "slant" => include_str!("figfonts/slant.flf"), - "small" => include_str!("figfonts/small.flf"), - "speed" => include_str!("figfonts/speed.flf"), - "starwars" => include_str!("figfonts/starwars.flf"), - _ => { - println!( - "FIGfont \"{}\" not found for banner. {}. {}.", - SETTINGS.app.startup_banner, - "Using \"Small\"", - "Check the settings file", - ); - include_str!("figfonts/small.flf") - } - } - ).unwrap(); - println!("\n{} {}\n\n Powered by PageTop {}\n", - figfont.convert(&SETTINGS.app.name).unwrap(), - &SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - } - - // Inicia registro de trazas y eventos. - Lazy::force(&server::tracing::TRACING); - - // Asigna identificador de idioma. - Lazy::force(&locale::LANGID); - - // Registra los temas predefinidos. - register_theme(&base::theme::aliner::AlinerTheme); - register_theme(&base::theme::minimal::MinimalTheme); - register_theme(&base::theme::bootsier::BootsierTheme); - - // Registra los módulos predeterminados. - register_module(&base::module::admin::AdminModule); - register_module(&base::module::user::UserModule); - - // Ejecuta la función de inicio de la aplicación. - if bootstrap != None { - trace::debug!("Calling application bootstrap"); - let _ = &(bootstrap.unwrap())(); - } - - // Registra el módulo para la página de inicio de PageTop. - // Al ser el último, puede sobrecargarse en la función de arranque. - register_module(&base::module::homepage::HomepageModule); - - - // Inicializa el servidor web. - let server = server::HttpServer::new(|| { - server::App::new() - .wrap(tracing_actix_web::TracingLogger) - .wrap(normalize::NormalizePath::new(normalize::TrailingSlash::Trim)) - .configure(&global::themes) - .configure(&global::modules) - }) - .bind(format!("{}:{}", - &SETTINGS.webserver.bind_address, - &SETTINGS.webserver.bind_port - ))? - .run(); - Ok(server) -} diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index 7db53759..8699b8d1 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -4,5 +4,7 @@ pub use actix_web::{ mod tracing; -mod main; -pub use main::run; +mod dbconn; + +mod app; +pub use app::Application; diff --git a/src/database.rs b/src/database.rs new file mode 100644 index 00000000..cd70e401 --- /dev/null +++ b/src/database.rs @@ -0,0 +1 @@ +pub use sea_orm::DatabaseConnection; diff --git a/src/lib.rs b/src/lib.rs index 7d17db44..a01548ba 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,8 +10,11 @@ pub use once_cell::sync::Lazy; pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. pub mod locale; // Localización. +pub mod database; // Acceso a la base de datos. pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. pub mod base; // Temas, Módulos y Componentes base. pub mod util; // Macros y funciones útiles. pub mod prelude; // Re-exporta recursos comunes. + +pub use crate::core::server::Application; diff --git a/src/locale.rs b/src/locale.rs index e3639858..07cb0d8e 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -44,12 +44,12 @@ macro_rules! localize { } #[allow(dead_code)] - pub fn l(key: &str) -> String { + fn l(key: &str) -> String { LOCALES.lookup(&LANGID, key) } #[allow(dead_code)] - pub fn t( + fn t( key: &str, args: &std::collections::HashMap<String, FluentValue> ) -> String { @@ -57,7 +57,7 @@ macro_rules! localize { } #[allow(dead_code)] - pub fn e( + fn e( key: &str, args: &std::collections::HashMap<String, FluentValue> ) -> crate::core::theme::PreEscaped<String> { diff --git a/src/main.rs b/src/main.rs index 8559a909..30df2f36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,8 @@ #[actix_web::main] async fn main() -> std::io::Result<()> { - pagetop::core::server::run(None)?.await + // ``` + // let app = pagetop::Application::build(None).await?; + // app.run()?.await + // ``` + pagetop::Application::build(None).await?.run()?.await } diff --git a/src/prelude.rs b/src/prelude.rs index 94630400..6ca17039 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -6,6 +6,7 @@ pub use crate::util; pub use crate::config::SETTINGS; pub use crate::trace; pub use crate::localize; +pub use crate::database; pub use crate::core::theme::*; pub use crate::core::module::*; From 619b7b73c6564260be2182f9e5e0adf0a7c89017 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Mar 2022 01:39:08 +0100 Subject: [PATCH 024/853] =?UTF-8?q?A=C3=B1ade=20migraci=C3=B3n=20de=20BD?= =?UTF-8?q?=20usando=20Refinery=20y=20Barrel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Realmente esta funcionalidad se va a sustituir por alguna otra librería ya que Refinery usa un único número de versión que dificulta su uso en un contexto de módulos independientes con migraciones propias. --- Cargo.toml | 26 ++++--- STARTER.Cargo.toml | 1 + .../migrations/V1__create_table_system.rs | 13 ++++ src/base/module/admin/mod.rs | 5 ++ .../user/migrations/V1__create_table_user.rs | 13 ++++ src/base/module/user/mod.rs | 5 ++ src/core/global.rs | 14 +++- src/core/module/definition.rs | 5 ++ src/core/server/app.rs | 73 +++++++++---------- src/core/server/dbconn.rs | 8 -- src/core/server/mod.rs | 2 - src/database.rs | 1 - src/db.rs | 17 +++++ src/lib.rs | 4 +- src/prelude.rs | 4 +- 15 files changed, 129 insertions(+), 62 deletions(-) create mode 100644 src/base/module/admin/migrations/V1__create_table_system.rs create mode 100644 src/base/module/user/migrations/V1__create_table_user.rs delete mode 100644 src/core/server/dbconn.rs delete mode 100644 src/database.rs create mode 100644 src/db.rs diff --git a/Cargo.toml b/Cargo.toml index d28a0e33..7aa29cae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,6 @@ once_cell = "1.9.0" figlet-rs = "0.1.3" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } -url = "2.2.2" tracing = "0.1" tracing-appender = "0.2" @@ -44,24 +43,31 @@ actix-web-static-files = "3.0.5" maud = { version = "0.23.0", features = ["actix-web"] } sycamore = { version = "0.7.1", features = ["ssr"] } + downcast-rs = "1.2.0" +url = "2.2.2" serde = { version = "1.0", features = ["derive"] } -[dependencies.sea-orm] -version = "0.6" -features = ["macros", "debug-print", "runtime-async-std-native-tls"] +[dependencies.sqlx] +version = "0.5.11" +features = ["migrate", "runtime-async-std-native-tls"] default-features = false +[dependencies.refinery] +version = "0.8.4" + +[dependencies.barrel] +version = "0.7.0" + +[features] +default = ["mysql"] +mysql = ["sqlx/mysql", "refinery/mysql", "barrel/mysql"] +postgres = ["sqlx/postgres", "refinery/postgres", "barrel/pg"] + [build-dependencies] actix-web-static-files = "3.0.5" -[features] -default = ["sea-orm/sqlx-mysql"] -mysql = ["sea-orm/sqlx-mysql"] -postgres = ["sea-orm/sqlx-postgres"] -sqlite = ["sea-orm/sqlx-sqlite"] - [lib] name = "pagetop" diff --git a/STARTER.Cargo.toml b/STARTER.Cargo.toml index 1db51f3d..08b251e7 100644 --- a/STARTER.Cargo.toml +++ b/STARTER.Cargo.toml @@ -10,3 +10,4 @@ edition = "2021" pagetop = { path = "pagetop" } actix-web = "3.3.3" maud = { version = "0.23.0" } +serde = { version = "1.0", features = ["derive"] } diff --git a/src/base/module/admin/migrations/V1__create_table_system.rs b/src/base/module/admin/migrations/V1__create_table_system.rs new file mode 100644 index 00000000..2cd6196a --- /dev/null +++ b/src/base/module/admin/migrations/V1__create_table_system.rs @@ -0,0 +1,13 @@ +use crate::prelude::*; + +pub fn migration() -> String { + let mut m = db::Migration::new(); + + m.create_table("system", |t| { + t.add_column("id", db::types::primary()); + t.add_column("title", db::types::varchar(255)); + t.add_column("is_completed", db::types::boolean().default(false)); + }); + + m.make::<db::Database>() +} diff --git a/src/base/module/admin/mod.rs b/src/base/module/admin/mod.rs index 0bb1202d..52079841 100644 --- a/src/base/module/admin/mod.rs +++ b/src/base/module/admin/mod.rs @@ -1,6 +1,7 @@ use crate::prelude::*; localize!("en-US", "src/base/module/admin/locales"); +embed_migrations!("src/base/module/admin/migrations"); mod summary; @@ -25,4 +26,8 @@ impl Module for AdminModule { .route("", server::web::get().to(summary::summary)) ); } + + fn configure_migrations(&self) -> Option<db::Migrations> { + Some(migrations::runner()) + } } diff --git a/src/base/module/user/migrations/V1__create_table_user.rs b/src/base/module/user/migrations/V1__create_table_user.rs new file mode 100644 index 00000000..9bc4e823 --- /dev/null +++ b/src/base/module/user/migrations/V1__create_table_user.rs @@ -0,0 +1,13 @@ +use crate::prelude::*; + +pub fn migration() -> String { + let mut m = db::Migration::new(); + + m.create_table("user", |t| { + t.add_column("id", db::types::primary()); + t.add_column("title", db::types::varchar(255)); + t.add_column("is_completed", db::types::boolean().default(false)); + }); + + m.make::<db::Database>() +} diff --git a/src/base/module/user/mod.rs b/src/base/module/user/mod.rs index 73ab7d16..48c69820 100644 --- a/src/base/module/user/mod.rs +++ b/src/base/module/user/mod.rs @@ -1,6 +1,7 @@ use crate::prelude::*; localize!("en-US", "src/base/module/user/locales"); +embed_migrations!("src/base/module/user/migrations"); pub struct UserModule; @@ -20,6 +21,10 @@ impl Module for UserModule { fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { cfg.route("/user/login", server::web::get().to(login)); } + + fn configure_migrations(&self) -> Option<db::Migrations> { + Some(migrations::runner()) + } } fn form_login() -> impl PageComponent { diff --git a/src/core/global.rs b/src/core/global.rs index 1d64d44f..7798d06d 100644 --- a/src/core/global.rs +++ b/src/core/global.rs @@ -1,4 +1,4 @@ -use crate::Lazy; +use crate::{Lazy, db}; use crate::core::theme::Theme; use crate::core::module::Module; use crate::core::response::page::PageContainer; @@ -42,6 +42,18 @@ pub fn modules(cfg: &mut server::web::ServiceConfig) { } } +pub fn migrations(db_uri: db::Uri) { + let mut conn = refinery::config::Config::try_from(db_uri).unwrap(); + for m in MODULES.read().unwrap().iter() { + match m.configure_migrations() { + Some(migrations) => { + migrations.run(&mut conn).expect("Failed to run migrations"); + }, + _ => {} + }; + } +} + // ----------------------------------------------------------------------------- // Componentes globales. // ----------------------------------------------------------------------------- diff --git a/src/core/module/definition.rs b/src/core/module/definition.rs index 40e9cee8..3f1e1e3d 100644 --- a/src/core/module/definition.rs +++ b/src/core/module/definition.rs @@ -1,3 +1,4 @@ +use crate::db; use crate::core::server; /// Los módulos deben implementar este *trait*. @@ -13,4 +14,8 @@ pub trait Module: Send + Sync { #[allow(unused_variables)] fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { } + + fn configure_migrations(&self) -> Option<db::Migrations> { + None + } } diff --git a/src/core/server/app.rs b/src/core/server/app.rs index 3861c412..d758d850 100644 --- a/src/core/server/app.rs +++ b/src/core/server/app.rs @@ -1,12 +1,23 @@ -use crate::{Lazy, base, locale, trace}; +use crate::{Lazy, base, db, locale, trace}; use crate::config::SETTINGS; use crate::core::{Server, global, server}; use crate::core::theme::register_theme; use crate::core::module::register_module; use std::io::Error; +use std::sync::RwLock; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; +#[cfg(feature = "mysql")] +use sqlx::mysql::MySqlPoolOptions as DbPoolOptions; + +#[cfg(feature = "postgres")] +use sqlx::postgres::PgPoolOptions as DbPoolOptions; + +static DBCONN: Lazy<RwLock<Option<db::Conn>>> = Lazy::new(|| { + RwLock::new(None) +}); + pub struct Application { server: Server, } @@ -52,49 +63,33 @@ impl Application { &SETTINGS.database.max_pool_size ); - #[cfg(any(feature = "default", feature = "mysql"))] - let db_uri = format!( - "mysql://{}/{}", - &SETTINGS.database.db_host, - &SETTINGS.database.db_name - ); + #[cfg(feature = "mysql")] + let db_type = "mysql"; #[cfg(feature = "postgres")] - let db_uri = format!( - "postgres://{}/{}", - &SETTINGS.database.db_host, - &SETTINGS.database.db_name - ); - - #[cfg(feature = "sqlite")] - let db_uri = format!("sqlite://{}", &SETTINGS.database.db_name); - - let mut uri = url::Url::parse(&db_uri).unwrap(); + let db_type = "postgres"; // https://github.com/launchbadge/sqlx/issues/1624 - - #[cfg(not(feature = "sqlite"))] - uri.set_username(&SETTINGS.database.db_user.as_str()).unwrap(); - - #[cfg(not(feature = "sqlite"))] - uri.set_password(Some(&SETTINGS.database.db_pass.as_str())).unwrap(); - - #[cfg(not(feature = "sqlite"))] + let mut db_uri = db::Uri::parse(format!( + "{}://{}/{}", + db_type, + &SETTINGS.database.db_host, + &SETTINGS.database.db_name + ).as_str()).unwrap(); + db_uri.set_username(&SETTINGS.database.db_user.as_str()).unwrap(); + db_uri.set_password(Some(&SETTINGS.database.db_pass.as_str())).unwrap(); if SETTINGS.database.db_port != 0 { - uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); + db_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); } - let mut db_options = sea_orm::ConnectOptions::new(uri.to_string()); - db_options.max_connections(SETTINGS.database.max_pool_size); - - let mut db_conn = server::dbconn::DBCONN.write().unwrap(); - *db_conn = Some( - sea_orm::Database::connect::<sea_orm::ConnectOptions>( - db_options.into() - ) + let db_pool = DbPoolOptions::new() + .max_connections(SETTINGS.database.max_pool_size) + .connect(db_uri.as_str()) .await - .expect("Failed to connect to database") - ); + .expect("Failed to connect to database"); + + let mut dbconn = DBCONN.write().unwrap(); + *dbconn = Some(db_pool); // Registra los temas predefinidos. register_theme(&base::theme::aliner::AlinerTheme); @@ -107,7 +102,7 @@ impl Application { // Ejecuta la función de inicio de la aplicación. if bootstrap != None { - trace::debug!("Calling application bootstrap"); + trace::info!("Calling application bootstrap."); let _ = &(bootstrap.unwrap())(); } @@ -115,6 +110,10 @@ impl Application { // Al ser el último, puede sobrecargarse con la función de inicio. register_module(&base::module::homepage::HomepageModule); + // Run migrations. + trace::info!("Running migrations."); + global::migrations(db_uri); + // Prepara el servidor web. let server = server::HttpServer::new(|| { server::App::new() diff --git a/src/core/server/dbconn.rs b/src/core/server/dbconn.rs deleted file mode 100644 index e80629fc..00000000 --- a/src/core/server/dbconn.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::Lazy; -use crate::database::DatabaseConnection; - -use std::sync::RwLock; - -pub static DBCONN: Lazy<RwLock<Option<DatabaseConnection>>> = Lazy::new(|| { - RwLock::new(None) -}); diff --git a/src/core/server/mod.rs b/src/core/server/mod.rs index 8699b8d1..ef85b53c 100644 --- a/src/core/server/mod.rs +++ b/src/core/server/mod.rs @@ -4,7 +4,5 @@ pub use actix_web::{ mod tracing; -mod dbconn; - mod app; pub use app::Application; diff --git a/src/database.rs b/src/database.rs deleted file mode 100644 index cd70e401..00000000 --- a/src/database.rs +++ /dev/null @@ -1 +0,0 @@ -pub use sea_orm::DatabaseConnection; diff --git a/src/db.rs b/src/db.rs new file mode 100644 index 00000000..c754be9c --- /dev/null +++ b/src/db.rs @@ -0,0 +1,17 @@ +pub use url::Url as Uri; + +#[cfg(feature = "mysql")] +pub use { + barrel::backend::MySql as Database, + sqlx::MySqlPool as Conn, +}; + +#[cfg(feature = "postgres")] +pub use { + barrel::backend::Pg as Database, + sqlx::PgPool as Conn, +}; + +pub use barrel::{Migration, types}; +pub use refinery::embed_migrations; +pub use refinery::Runner as Migrations; diff --git a/src/lib.rs b/src/lib.rs index a01548ba..a3906783 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,8 +10,8 @@ pub use once_cell::sync::Lazy; pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. pub mod locale; // Localización. -pub mod database; // Acceso a la base de datos. -pub mod core; // Servidor web y sistemas para Temas, Módulos y Respuestas. +pub mod db; // Acceso a la base de datos. +pub mod core; // Servidor web y APIs para Temas, Módulos y Respuestas web. pub mod base; // Temas, Módulos y Componentes base. pub mod util; // Macros y funciones útiles. diff --git a/src/prelude.rs b/src/prelude.rs index 6ca17039..f168e92f 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -6,7 +6,9 @@ pub use crate::util; pub use crate::config::SETTINGS; pub use crate::trace; pub use crate::localize; -pub use crate::database; + +pub use crate::db; +pub use crate::db::embed_migrations; pub use crate::core::theme::*; pub use crate::core::module::*; From 4b5d8ce38ac9932c7df9b8b54aad1326a0de50e8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Mar 2022 00:19:05 +0100 Subject: [PATCH 025/853] Elimina Refinery y Barrel en favor de SeaORM Se integran las funcionalidades de SeaORM en el funcionamiento de PageTop para abstraer el uso y acceso a la base de datos. --- Cargo.toml | 29 +++++----- .../migrations/V1__create_table_system.rs | 13 ----- src/base/module/admin/mod.rs | 5 -- src/base/module/user/entity/mod.rs | 1 + src/base/module/user/entity/user.rs | 18 +++++++ .../m20220312_000001_create_table_user.rs | 54 +++++++++++++++++++ src/base/module/user/migration/mod.rs | 12 +++++ .../user/migrations/V1__create_table_user.rs | 13 ----- src/base/module/user/mod.rs | 8 +-- src/core/global.rs | 10 +--- src/core/module/definition.rs | 5 +- src/core/server/app.rs | 32 ++++------- src/db.rs | 23 ++++---- src/lib.rs | 1 + src/prelude.rs | 9 ++-- src/util.rs | 15 +++++- 16 files changed, 150 insertions(+), 98 deletions(-) delete mode 100644 src/base/module/admin/migrations/V1__create_table_system.rs create mode 100644 src/base/module/user/entity/mod.rs create mode 100644 src/base/module/user/entity/user.rs create mode 100644 src/base/module/user/migration/m20220312_000001_create_table_user.rs create mode 100644 src/base/module/user/migration/mod.rs delete mode 100644 src/base/module/user/migrations/V1__create_table_user.rs diff --git a/Cargo.toml b/Cargo.toml index 7aa29cae..0c3a0a43 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,8 +25,11 @@ categories = [ [dependencies] doc-comment = "0.3.3" -once_cell = "1.9.0" -figlet-rs = "0.1.3" +downcast-rs = "1.2.0" +figlet-rs = "0.1.3" +futures = "0.3" +once_cell = "1.9.0" +url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } @@ -44,26 +47,22 @@ actix-web-static-files = "3.0.5" maud = { version = "0.23.0", features = ["actix-web"] } sycamore = { version = "0.7.1", features = ["ssr"] } -downcast-rs = "1.2.0" -url = "2.2.2" - serde = { version = "1.0", features = ["derive"] } -[dependencies.sqlx] -version = "0.5.11" -features = ["migrate", "runtime-async-std-native-tls"] +[dependencies.sea-orm] +version = "0.6" +features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false -[dependencies.refinery] -version = "0.8.4" - -[dependencies.barrel] -version = "0.7.0" +[dependencies.sea-schema] +version = "0.5" +features = ["debug-print", "migration"] +default-features = false [features] default = ["mysql"] -mysql = ["sqlx/mysql", "refinery/mysql", "barrel/mysql"] -postgres = ["sqlx/postgres", "refinery/postgres", "barrel/pg"] +mysql = ["sea-orm/sqlx-mysql"] +postgres = ["sea-orm/sqlx-postgres"] [build-dependencies] actix-web-static-files = "3.0.5" diff --git a/src/base/module/admin/migrations/V1__create_table_system.rs b/src/base/module/admin/migrations/V1__create_table_system.rs deleted file mode 100644 index 2cd6196a..00000000 --- a/src/base/module/admin/migrations/V1__create_table_system.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::prelude::*; - -pub fn migration() -> String { - let mut m = db::Migration::new(); - - m.create_table("system", |t| { - t.add_column("id", db::types::primary()); - t.add_column("title", db::types::varchar(255)); - t.add_column("is_completed", db::types::boolean().default(false)); - }); - - m.make::<db::Database>() -} diff --git a/src/base/module/admin/mod.rs b/src/base/module/admin/mod.rs index 52079841..0bb1202d 100644 --- a/src/base/module/admin/mod.rs +++ b/src/base/module/admin/mod.rs @@ -1,7 +1,6 @@ use crate::prelude::*; localize!("en-US", "src/base/module/admin/locales"); -embed_migrations!("src/base/module/admin/migrations"); mod summary; @@ -26,8 +25,4 @@ impl Module for AdminModule { .route("", server::web::get().to(summary::summary)) ); } - - fn configure_migrations(&self) -> Option<db::Migrations> { - Some(migrations::runner()) - } } diff --git a/src/base/module/user/entity/mod.rs b/src/base/module/user/entity/mod.rs new file mode 100644 index 00000000..22d12a38 --- /dev/null +++ b/src/base/module/user/entity/mod.rs @@ -0,0 +1 @@ +pub mod user; diff --git a/src/base/module/user/entity/user.rs b/src/base/module/user/entity/user.rs new file mode 100644 index 00000000..d0db4a98 --- /dev/null +++ b/src/base/module/user/entity/user.rs @@ -0,0 +1,18 @@ +use crate::db::entity::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Deserialize, Serialize)] +#[sea_orm(table_name = "user")] +pub struct Model { + #[sea_orm(primary_key)] + #[serde(skip_deserializing)] + pub id: i32, + pub title: String, + #[sea_orm(column_type = "Text")] + pub text: String, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src/base/module/user/migration/m20220312_000001_create_table_user.rs b/src/base/module/user/migration/m20220312_000001_create_table_user.rs new file mode 100644 index 00000000..729b72e0 --- /dev/null +++ b/src/base/module/user/migration/m20220312_000001_create_table_user.rs @@ -0,0 +1,54 @@ +use crate::db::migration::*; + +#[derive(Iden)] +enum User { + Table, + Id, + Title, + Text, +} + +pub struct Migration; + +impl MigrationName for Migration { + fn name(&self) -> &str { + "m20220312_000001_create_table_user" + } +} + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(User::Table) + .if_not_exists() + .col(ColumnDef::new(User::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(User::Title) + .string() + .not_null() + ) + .col(ColumnDef::new(User::Text) + .string() + .not_null() + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(User::Table) + .to_owned() + ) + .await + } +} diff --git a/src/base/module/user/migration/mod.rs b/src/base/module/user/migration/mod.rs new file mode 100644 index 00000000..8b9167a6 --- /dev/null +++ b/src/base/module/user/migration/mod.rs @@ -0,0 +1,12 @@ +use crate::db::migration::*; + +pub mod m20220312_000001_create_table_user; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec<Box<dyn MigrationTrait>> { + vec![Box::new(m20220312_000001_create_table_user::Migration)] + } +} diff --git a/src/base/module/user/migrations/V1__create_table_user.rs b/src/base/module/user/migrations/V1__create_table_user.rs deleted file mode 100644 index 9bc4e823..00000000 --- a/src/base/module/user/migrations/V1__create_table_user.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::prelude::*; - -pub fn migration() -> String { - let mut m = db::Migration::new(); - - m.create_table("user", |t| { - t.add_column("id", db::types::primary()); - t.add_column("title", db::types::varchar(255)); - t.add_column("is_completed", db::types::boolean().default(false)); - }); - - m.make::<db::Database>() -} diff --git a/src/base/module/user/mod.rs b/src/base/module/user/mod.rs index 48c69820..7dc3c043 100644 --- a/src/base/module/user/mod.rs +++ b/src/base/module/user/mod.rs @@ -1,7 +1,9 @@ use crate::prelude::*; localize!("en-US", "src/base/module/user/locales"); -embed_migrations!("src/base/module/user/migrations"); + +mod entity; +mod migration; pub struct UserModule; @@ -22,8 +24,8 @@ impl Module for UserModule { cfg.route("/user/login", server::web::get().to(login)); } - fn configure_migrations(&self) -> Option<db::Migrations> { - Some(migrations::runner()) + fn migrations(&self, dbconn: &db::DbConn) -> Result<(), db::DbErr> { + db_migrations!(dbconn) } } diff --git a/src/core/global.rs b/src/core/global.rs index 7798d06d..0879fe4c 100644 --- a/src/core/global.rs +++ b/src/core/global.rs @@ -42,15 +42,9 @@ pub fn modules(cfg: &mut server::web::ServiceConfig) { } } -pub fn migrations(db_uri: db::Uri) { - let mut conn = refinery::config::Config::try_from(db_uri).unwrap(); +pub fn migrations(dbconn: &db::DbConn) { for m in MODULES.read().unwrap().iter() { - match m.configure_migrations() { - Some(migrations) => { - migrations.run(&mut conn).expect("Failed to run migrations"); - }, - _ => {} - }; + m.migrations(dbconn).expect("Failed to run migrations"); } } diff --git a/src/core/module/definition.rs b/src/core/module/definition.rs index 3f1e1e3d..e11efd2e 100644 --- a/src/core/module/definition.rs +++ b/src/core/module/definition.rs @@ -15,7 +15,8 @@ pub trait Module: Send + Sync { fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { } - fn configure_migrations(&self) -> Option<db::Migrations> { - None + #[allow(unused_variables)] + fn migrations(&self, dbconn: &db::DbConn) -> Result<(), db::DbErr> { + Ok(()) } } diff --git a/src/core/server/app.rs b/src/core/server/app.rs index d758d850..1f2ec7f3 100644 --- a/src/core/server/app.rs +++ b/src/core/server/app.rs @@ -5,19 +5,8 @@ use crate::core::theme::register_theme; use crate::core::module::register_module; use std::io::Error; -use std::sync::RwLock; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; -#[cfg(feature = "mysql")] -use sqlx::mysql::MySqlPoolOptions as DbPoolOptions; - -#[cfg(feature = "postgres")] -use sqlx::postgres::PgPoolOptions as DbPoolOptions; - -static DBCONN: Lazy<RwLock<Option<db::Conn>>> = Lazy::new(|| { - RwLock::new(None) -}); - pub struct Application { server: Server, } @@ -70,7 +59,7 @@ impl Application { let db_type = "postgres"; // https://github.com/launchbadge/sqlx/issues/1624 - let mut db_uri = db::Uri::parse(format!( + let mut db_uri = db::DbUri::parse(format!( "{}://{}/{}", db_type, &SETTINGS.database.db_host, @@ -82,14 +71,14 @@ impl Application { db_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); } - let db_pool = DbPoolOptions::new() - .max_connections(SETTINGS.database.max_pool_size) - .connect(db_uri.as_str()) - .await - .expect("Failed to connect to database"); + let mut db_options = sea_orm::ConnectOptions::new(db_uri.to_string()); + db_options.max_connections(SETTINGS.database.max_pool_size); - let mut dbconn = DBCONN.write().unwrap(); - *dbconn = Some(db_pool); + let dbconn = sea_orm::Database::connect::<sea_orm::ConnectOptions>( + db_options.into() + ) + .await + .expect("Failed to connect to database"); // Registra los temas predefinidos. register_theme(&base::theme::aliner::AlinerTheme); @@ -112,13 +101,14 @@ impl Application { // Run migrations. trace::info!("Running migrations."); - global::migrations(db_uri); + global::migrations(&dbconn); // Prepara el servidor web. - let server = server::HttpServer::new(|| { + let server = server::HttpServer::new(move || { server::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) + .data(dbconn.clone()) .configure(&global::themes) .configure(&global::modules) }) diff --git a/src/db.rs b/src/db.rs index c754be9c..fb3f789e 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,17 +1,14 @@ -pub use url::Url as Uri; +pub use url::Url as DbUri; -#[cfg(feature = "mysql")] -pub use { - barrel::backend::MySql as Database, - sqlx::MySqlPool as Conn, +pub use sea_orm::{ + DbErr, + DatabaseConnection as DbConn, }; -#[cfg(feature = "postgres")] -pub use { - barrel::backend::Pg as Database, - sqlx::PgPool as Conn, -}; +pub mod entity { + pub use sea_orm::entity::prelude::*; +} -pub use barrel::{Migration, types}; -pub use refinery::embed_migrations; -pub use refinery::Runner as Migrations; +pub mod migration { + pub use sea_schema::migration::prelude::*; +} diff --git a/src/lib.rs b/src/lib.rs index a3906783..8d75fb08 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy; +pub use futures::executor::block_on as run_now; // ----------------------------------------------------------------------------- // APIs públicas. diff --git a/src/prelude.rs b/src/prelude.rs index f168e92f..bcff745b 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,14 +1,15 @@ //! Re-exporta recursos comunes. -pub use crate::args; -pub use crate::util; +pub use crate::{ + args, + db_migrations, +}; pub use crate::config::SETTINGS; pub use crate::trace; pub use crate::localize; pub use crate::db; -pub use crate::db::embed_migrations; pub use crate::core::theme::*; pub use crate::core::module::*; @@ -16,3 +17,5 @@ pub use crate::core::response::page::*; pub use crate::core::server; pub use crate::base::component::*; + +pub use crate::util; diff --git a/src/util.rs b/src/util.rs index 3fff0a23..5150d517 100644 --- a/src/util.rs +++ b/src/util.rs @@ -9,15 +9,26 @@ /// ]; /// ``` macro_rules! args { - ( $($key:expr => $value:expr),* ) => {{ + ( $($KEY:expr => $VALUE:expr),* ) => {{ let mut a = std::collections::HashMap::new(); $( - a.insert(String::from($key), $value.into()); + a.insert(String::from($KEY), $VALUE.into()); )* a }}; } +#[macro_export] +macro_rules! db_migrations { + ( $DBCONN:ident ) => {{ + $crate::run_now({ + use $crate::db::migration::MigratorTrait; + + migration::Migrator::up($DBCONN, None) + }) + }}; +} + pub fn valid_id(id: &str) -> Option<String> { let id = id.trim().replace(" ", "_").to_lowercase(); match id.is_empty() { From ab0ac11f65fe50fc65a9190094643ec50ae05949 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Mar 2022 11:14:33 +0100 Subject: [PATCH 026/853] =?UTF-8?q?Modifica=20la=20estructura=20general=20?= =?UTF-8?q?del=20c=C3=B3digo=20fuente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Importante actualización que reorganiza el código fuente de PageTop. Usa Cargo para crear un espacio de trabajo con los diferentes proyectos que estructuran las funcionalidades de PageTop en módulos interdependientes que se integran en Drust para construir una solución web para la gestión de contenidos. --- Cargo.toml | 79 ++---------------- config/default.toml | 21 ++++- drust/Cargo.toml | 19 +++++ {src => drust/src}/main.rs | 4 - pagetop/Cargo.toml | 71 ++++++++++++++++ .../STARTER.Cargo.toml | 0 build.rs => pagetop/build.rs | 0 .../config}/settings.default.toml | 0 {src => pagetop/src}/base/component/block.rs | 0 {src => pagetop/src}/base/component/chunck.rs | 0 .../src}/base/component/container.rs | 0 .../src}/base/component/form/button.rs | 0 .../src}/base/component/form/date.rs | 0 .../src}/base/component/form/form.rs | 0 .../src}/base/component/form/hidden.rs | 0 .../src}/base/component/form/input.rs | 0 .../src}/base/component/form/mod.rs | 0 {src => pagetop/src}/base/component/menu.rs | 0 {src => pagetop/src}/base/component/mod.rs | 0 {src => pagetop/src}/base/mod.rs | 0 .../base/module/admin/locales/en-US/admin.ftl | 0 .../base/module/admin/locales/es-ES/admin.ftl | 0 {src => pagetop/src}/base/module/admin/mod.rs | 0 .../src}/base/module/admin/summary.rs | 0 .../homepage/locales/en-US/homepage.ftl | 0 .../homepage/locales/es-ES/homepage.ftl | 0 .../src}/base/module/homepage/mod.rs | 0 {src => pagetop/src}/base/module/mod.rs | 0 .../src}/base/module/user/entity/mod.rs | 0 .../src}/base/module/user/entity/user.rs | 0 .../module/user/locales/en-US/homepage.ftl | 0 .../module/user/locales/es-ES/homepage.ftl | 0 .../m20220312_000001_create_table_user.rs | 0 .../src}/base/module/user/migration/mod.rs | 0 {src => pagetop/src}/base/module/user/mod.rs | 0 {src => pagetop/src}/base/theme/aliner/mod.rs | 0 .../theme/bootsier/locales/en-US/bootsier.ftl | 0 .../theme/bootsier/locales/es-ES/bootsier.ftl | 0 .../src}/base/theme/bootsier/mod.rs | 0 .../src}/base/theme/minimal/mod.rs | 0 {src => pagetop/src}/base/theme/mod.rs | 0 {src => pagetop/src}/config.rs | 0 {src => pagetop/src}/core/global.rs | 0 {src => pagetop/src}/core/mod.rs | 0 .../src}/core/module/definition.rs | 0 {src => pagetop/src}/core/module/mod.rs | 0 {src => pagetop/src}/core/response/mod.rs | 0 .../src}/core/response/page/assets.rs | 0 .../src}/core/response/page/component.rs | 0 .../src}/core/response/page/container.rs | 0 .../src}/core/response/page/mod.rs | 0 .../src}/core/response/page/page.rs | 0 {src => pagetop/src}/core/server/app.rs | 2 +- .../src}/core/server/figfonts/slant.flf | 0 .../src}/core/server/figfonts/small.flf | 0 .../src}/core/server/figfonts/speed.flf | 0 .../src}/core/server/figfonts/starwars.flf | 0 {src => pagetop/src}/core/server/mod.rs | 0 {src => pagetop/src}/core/server/tracing.rs | 0 {src => pagetop/src}/core/theme/definition.rs | 0 {src => pagetop/src}/core/theme/mod.rs | 0 {src => pagetop/src}/db.rs | 0 {src => pagetop/src}/lib.rs | 0 {src => pagetop/src}/locale.rs | 0 {src => pagetop/src}/prelude.rs | 0 {src => pagetop/src}/trace.rs | 0 {src => pagetop/src}/util.rs | 0 .../static}/aliner/css/styles.css | 0 .../static}/bootsier/css/bootstrap.min.css | 0 .../bootsier/css/bootstrap.min.css.map | 0 .../static}/bootsier/images/caution.png | Bin .../bootsier/js/bootstrap.bundle.min.js | 0 .../bootsier/js/bootstrap.bundle.min.js.map | 0 .../static}/theme/js/jquery.min.js | 0 .../static}/theme/js/jquery.min.map | 0 .../static}/theme/menu/css/menu-blue.css | 0 .../static}/theme/menu/css/menu-clean.css | 0 .../static}/theme/menu/css/menu-mint.css | 0 .../static}/theme/menu/css/menu-simple.css | 0 .../static}/theme/menu/css/menu.css | 0 .../static}/theme/menu/js/menu.min.js | 0 {tests => pagetop/tests}/health_check.rs | 0 {tests => pagetop/tests}/main.rs | 0 83 files changed, 115 insertions(+), 81 deletions(-) create mode 100644 drust/Cargo.toml rename {src => drust/src}/main.rs (53%) create mode 100644 pagetop/Cargo.toml rename STARTER.Cargo.toml => pagetop/STARTER.Cargo.toml (100%) rename build.rs => pagetop/build.rs (100%) rename {config => pagetop/config}/settings.default.toml (100%) rename {src => pagetop/src}/base/component/block.rs (100%) rename {src => pagetop/src}/base/component/chunck.rs (100%) rename {src => pagetop/src}/base/component/container.rs (100%) rename {src => pagetop/src}/base/component/form/button.rs (100%) rename {src => pagetop/src}/base/component/form/date.rs (100%) rename {src => pagetop/src}/base/component/form/form.rs (100%) rename {src => pagetop/src}/base/component/form/hidden.rs (100%) rename {src => pagetop/src}/base/component/form/input.rs (100%) rename {src => pagetop/src}/base/component/form/mod.rs (100%) rename {src => pagetop/src}/base/component/menu.rs (100%) rename {src => pagetop/src}/base/component/mod.rs (100%) rename {src => pagetop/src}/base/mod.rs (100%) rename {src => pagetop/src}/base/module/admin/locales/en-US/admin.ftl (100%) rename {src => pagetop/src}/base/module/admin/locales/es-ES/admin.ftl (100%) rename {src => pagetop/src}/base/module/admin/mod.rs (100%) rename {src => pagetop/src}/base/module/admin/summary.rs (100%) rename {src => pagetop/src}/base/module/homepage/locales/en-US/homepage.ftl (100%) rename {src => pagetop/src}/base/module/homepage/locales/es-ES/homepage.ftl (100%) rename {src => pagetop/src}/base/module/homepage/mod.rs (100%) rename {src => pagetop/src}/base/module/mod.rs (100%) rename {src => pagetop/src}/base/module/user/entity/mod.rs (100%) rename {src => pagetop/src}/base/module/user/entity/user.rs (100%) rename {src => pagetop/src}/base/module/user/locales/en-US/homepage.ftl (100%) rename {src => pagetop/src}/base/module/user/locales/es-ES/homepage.ftl (100%) rename {src => pagetop/src}/base/module/user/migration/m20220312_000001_create_table_user.rs (100%) rename {src => pagetop/src}/base/module/user/migration/mod.rs (100%) rename {src => pagetop/src}/base/module/user/mod.rs (100%) rename {src => pagetop/src}/base/theme/aliner/mod.rs (100%) rename {src => pagetop/src}/base/theme/bootsier/locales/en-US/bootsier.ftl (100%) rename {src => pagetop/src}/base/theme/bootsier/locales/es-ES/bootsier.ftl (100%) rename {src => pagetop/src}/base/theme/bootsier/mod.rs (100%) rename {src => pagetop/src}/base/theme/minimal/mod.rs (100%) rename {src => pagetop/src}/base/theme/mod.rs (100%) rename {src => pagetop/src}/config.rs (100%) rename {src => pagetop/src}/core/global.rs (100%) rename {src => pagetop/src}/core/mod.rs (100%) rename {src => pagetop/src}/core/module/definition.rs (100%) rename {src => pagetop/src}/core/module/mod.rs (100%) rename {src => pagetop/src}/core/response/mod.rs (100%) rename {src => pagetop/src}/core/response/page/assets.rs (100%) rename {src => pagetop/src}/core/response/page/component.rs (100%) rename {src => pagetop/src}/core/response/page/container.rs (100%) rename {src => pagetop/src}/core/response/page/mod.rs (100%) rename {src => pagetop/src}/core/response/page/page.rs (100%) rename {src => pagetop/src}/core/server/app.rs (98%) rename {src => pagetop/src}/core/server/figfonts/slant.flf (100%) rename {src => pagetop/src}/core/server/figfonts/small.flf (100%) rename {src => pagetop/src}/core/server/figfonts/speed.flf (100%) rename {src => pagetop/src}/core/server/figfonts/starwars.flf (100%) rename {src => pagetop/src}/core/server/mod.rs (100%) rename {src => pagetop/src}/core/server/tracing.rs (100%) rename {src => pagetop/src}/core/theme/definition.rs (100%) rename {src => pagetop/src}/core/theme/mod.rs (100%) rename {src => pagetop/src}/db.rs (100%) rename {src => pagetop/src}/lib.rs (100%) rename {src => pagetop/src}/locale.rs (100%) rename {src => pagetop/src}/prelude.rs (100%) rename {src => pagetop/src}/trace.rs (100%) rename {src => pagetop/src}/util.rs (100%) rename {static => pagetop/static}/aliner/css/styles.css (100%) rename {static => pagetop/static}/bootsier/css/bootstrap.min.css (100%) rename {static => pagetop/static}/bootsier/css/bootstrap.min.css.map (100%) rename {static => pagetop/static}/bootsier/images/caution.png (100%) rename {static => pagetop/static}/bootsier/js/bootstrap.bundle.min.js (100%) rename {static => pagetop/static}/bootsier/js/bootstrap.bundle.min.js.map (100%) rename {static => pagetop/static}/theme/js/jquery.min.js (100%) rename {static => pagetop/static}/theme/js/jquery.min.map (100%) rename {static => pagetop/static}/theme/menu/css/menu-blue.css (100%) rename {static => pagetop/static}/theme/menu/css/menu-clean.css (100%) rename {static => pagetop/static}/theme/menu/css/menu-mint.css (100%) rename {static => pagetop/static}/theme/menu/css/menu-simple.css (100%) rename {static => pagetop/static}/theme/menu/css/menu.css (100%) rename {static => pagetop/static}/theme/menu/js/menu.min.js (100%) rename {tests => pagetop/tests}/health_check.rs (100%) rename {tests => pagetop/tests}/main.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index 0c3a0a43..2369a8da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,74 +1,5 @@ -[package] -name = "pagetop" -version = "0.1.0" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - PageTop es un proyecto personal para aprender Rust. Incluye algunos de los \ - crates más estables y populares para desarrollar soluciones web modulares, \ - extensibles y configurables. También es un sistema para la gestión de \ - contenidos web.\ -""" -homepage = "https://suitepro.cillero.es/projects/pagetop" -repository = "https://gitlab.com/manuelcillero/pagetop" -license = "MIT" - -keywords = [ - "web", "cms", "framework", "frontend", "ssr" -] -categories = [ - "web-programming", "development-tools", "gui" -] - -[dependencies] -doc-comment = "0.3.3" -downcast-rs = "1.2.0" -figlet-rs = "0.1.3" -futures = "0.3" -once_cell = "1.9.0" -url = "2.2.2" - -config_rs = { package = "config", version = "0.11.0", features = ["toml"] } - -tracing = "0.1" -tracing-appender = "0.2" -tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } -tracing-actix-web = "0.2" - -fluent-templates = "0.6.1" -unic-langid = "0.9.0" - -actix-web = "3.3.3" -actix-web-static-files = "3.0.5" - -maud = { version = "0.23.0", features = ["actix-web"] } -sycamore = { version = "0.7.1", features = ["ssr"] } - -serde = { version = "1.0", features = ["derive"] } - -[dependencies.sea-orm] -version = "0.6" -features = ["debug-print", "macros", "runtime-async-std-native-tls"] -default-features = false - -[dependencies.sea-schema] -version = "0.5" -features = ["debug-print", "migration"] -default-features = false - -[features] -default = ["mysql"] -mysql = ["sea-orm/sqlx-mysql"] -postgres = ["sea-orm/sqlx-postgres"] - -[build-dependencies] -actix-web-static-files = "3.0.5" - -[lib] -name = "pagetop" - -[[bin]] -name = "pagetop" +[workspace] +members = [ + "drust", + "pagetop", +] \ No newline at end of file diff --git a/config/default.toml b/config/default.toml index 5f8778a3..26676acb 100644 --- a/config/default.toml +++ b/config/default.toml @@ -1,3 +1,20 @@ [app] -name = "PageTop Essence" -description = "A modern Content Management System for sharing the world." +name = "Drust" +description = """\ + A modern Content Management System for sharing the world.\ +""" +language = "es-ES" +#theme = "Aliner" +#theme = "Minimal" +theme = "Bootsier" + +[database] +db_name = "drust" +db_user = "drust" +db_pass = "DrU__#3T" + +[log] +tracing = "Info" +#Info,actix_server::builder=Error,tracing_actix_web=Warn" +rolling = "Stdout" +format = "Compact" diff --git a/drust/Cargo.toml b/drust/Cargo.toml new file mode 100644 index 00000000..0a579e5f --- /dev/null +++ b/drust/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "drust" +version = "0.1.0" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + A modern Content Management System for sharing the world.\ +""" +homepage = "https://suitepro.cillero.es/projects/drust" +repository = "https://gitlab.com/manuelcillero/drust" + +[dependencies] +pagetop = { path = "../pagetop" } +actix-web = "3.3.3" +maud = { version = "0.23.0" } +serde = { version = "1.0", features = ["derive"] } diff --git a/src/main.rs b/drust/src/main.rs similarity index 53% rename from src/main.rs rename to drust/src/main.rs index 30df2f36..6916d3b1 100644 --- a/src/main.rs +++ b/drust/src/main.rs @@ -1,8 +1,4 @@ #[actix_web::main] async fn main() -> std::io::Result<()> { - // ``` - // let app = pagetop::Application::build(None).await?; - // app.run()?.await - // ``` pagetop::Application::build(None).await?.run()?.await } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml new file mode 100644 index 00000000..278b6ba0 --- /dev/null +++ b/pagetop/Cargo.toml @@ -0,0 +1,71 @@ +[package] +name = "pagetop" +version = "0.1.0" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + PageTop es un proyecto personal para aprender Rust. Incluye algunos de los \ + crates más estables y populares para desarrollar soluciones web modulares, \ + extensibles y configurables. También es un sistema para la gestión de \ + contenidos web.\ +""" +homepage = "https://suitepro.cillero.es/projects/pagetop" +repository = "https://gitlab.com/manuelcillero/pagetop" +license = "MIT" + +keywords = [ + "web", "cms", "framework", "frontend", "ssr" +] +categories = [ + "web-programming", "development-tools", "gui" +] + +[dependencies] +doc-comment = "0.3.3" +downcast-rs = "1.2.0" +figlet-rs = "0.1.3" +futures = "0.3" +once_cell = "1.9.0" +url = "2.2.2" + +config_rs = { package = "config", version = "0.11.0", features = ["toml"] } + +tracing = "0.1" +tracing-appender = "0.2" +tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } +tracing-actix-web = "0.2" + +fluent-templates = "0.6.1" +unic-langid = "0.9.0" + +actix-web = "3.3.3" +actix-web-static-files = "3.0.5" + +maud = { version = "0.23.0", features = ["actix-web"] } +sycamore = { version = "0.7.1", features = ["ssr"] } + +serde = { version = "1.0", features = ["derive"] } + +[dependencies.sea-orm] +version = "0.6" +features = ["debug-print", "macros", "runtime-async-std-native-tls"] +default-features = false + +[dependencies.sea-schema] +version = "0.5" +features = ["debug-print", "migration"] +default-features = false + +[features] +default = ["mysql"] +mysql = ["sea-orm/sqlx-mysql"] +postgres = ["sea-orm/sqlx-postgres"] + +[build-dependencies] +actix-web-static-files = "3.0.5" + +[lib] +name = "pagetop" diff --git a/STARTER.Cargo.toml b/pagetop/STARTER.Cargo.toml similarity index 100% rename from STARTER.Cargo.toml rename to pagetop/STARTER.Cargo.toml diff --git a/build.rs b/pagetop/build.rs similarity index 100% rename from build.rs rename to pagetop/build.rs diff --git a/config/settings.default.toml b/pagetop/config/settings.default.toml similarity index 100% rename from config/settings.default.toml rename to pagetop/config/settings.default.toml diff --git a/src/base/component/block.rs b/pagetop/src/base/component/block.rs similarity index 100% rename from src/base/component/block.rs rename to pagetop/src/base/component/block.rs diff --git a/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs similarity index 100% rename from src/base/component/chunck.rs rename to pagetop/src/base/component/chunck.rs diff --git a/src/base/component/container.rs b/pagetop/src/base/component/container.rs similarity index 100% rename from src/base/component/container.rs rename to pagetop/src/base/component/container.rs diff --git a/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs similarity index 100% rename from src/base/component/form/button.rs rename to pagetop/src/base/component/form/button.rs diff --git a/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs similarity index 100% rename from src/base/component/form/date.rs rename to pagetop/src/base/component/form/date.rs diff --git a/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs similarity index 100% rename from src/base/component/form/form.rs rename to pagetop/src/base/component/form/form.rs diff --git a/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs similarity index 100% rename from src/base/component/form/hidden.rs rename to pagetop/src/base/component/form/hidden.rs diff --git a/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs similarity index 100% rename from src/base/component/form/input.rs rename to pagetop/src/base/component/form/input.rs diff --git a/src/base/component/form/mod.rs b/pagetop/src/base/component/form/mod.rs similarity index 100% rename from src/base/component/form/mod.rs rename to pagetop/src/base/component/form/mod.rs diff --git a/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs similarity index 100% rename from src/base/component/menu.rs rename to pagetop/src/base/component/menu.rs diff --git a/src/base/component/mod.rs b/pagetop/src/base/component/mod.rs similarity index 100% rename from src/base/component/mod.rs rename to pagetop/src/base/component/mod.rs diff --git a/src/base/mod.rs b/pagetop/src/base/mod.rs similarity index 100% rename from src/base/mod.rs rename to pagetop/src/base/mod.rs diff --git a/src/base/module/admin/locales/en-US/admin.ftl b/pagetop/src/base/module/admin/locales/en-US/admin.ftl similarity index 100% rename from src/base/module/admin/locales/en-US/admin.ftl rename to pagetop/src/base/module/admin/locales/en-US/admin.ftl diff --git a/src/base/module/admin/locales/es-ES/admin.ftl b/pagetop/src/base/module/admin/locales/es-ES/admin.ftl similarity index 100% rename from src/base/module/admin/locales/es-ES/admin.ftl rename to pagetop/src/base/module/admin/locales/es-ES/admin.ftl diff --git a/src/base/module/admin/mod.rs b/pagetop/src/base/module/admin/mod.rs similarity index 100% rename from src/base/module/admin/mod.rs rename to pagetop/src/base/module/admin/mod.rs diff --git a/src/base/module/admin/summary.rs b/pagetop/src/base/module/admin/summary.rs similarity index 100% rename from src/base/module/admin/summary.rs rename to pagetop/src/base/module/admin/summary.rs diff --git a/src/base/module/homepage/locales/en-US/homepage.ftl b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl similarity index 100% rename from src/base/module/homepage/locales/en-US/homepage.ftl rename to pagetop/src/base/module/homepage/locales/en-US/homepage.ftl diff --git a/src/base/module/homepage/locales/es-ES/homepage.ftl b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl similarity index 100% rename from src/base/module/homepage/locales/es-ES/homepage.ftl rename to pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl diff --git a/src/base/module/homepage/mod.rs b/pagetop/src/base/module/homepage/mod.rs similarity index 100% rename from src/base/module/homepage/mod.rs rename to pagetop/src/base/module/homepage/mod.rs diff --git a/src/base/module/mod.rs b/pagetop/src/base/module/mod.rs similarity index 100% rename from src/base/module/mod.rs rename to pagetop/src/base/module/mod.rs diff --git a/src/base/module/user/entity/mod.rs b/pagetop/src/base/module/user/entity/mod.rs similarity index 100% rename from src/base/module/user/entity/mod.rs rename to pagetop/src/base/module/user/entity/mod.rs diff --git a/src/base/module/user/entity/user.rs b/pagetop/src/base/module/user/entity/user.rs similarity index 100% rename from src/base/module/user/entity/user.rs rename to pagetop/src/base/module/user/entity/user.rs diff --git a/src/base/module/user/locales/en-US/homepage.ftl b/pagetop/src/base/module/user/locales/en-US/homepage.ftl similarity index 100% rename from src/base/module/user/locales/en-US/homepage.ftl rename to pagetop/src/base/module/user/locales/en-US/homepage.ftl diff --git a/src/base/module/user/locales/es-ES/homepage.ftl b/pagetop/src/base/module/user/locales/es-ES/homepage.ftl similarity index 100% rename from src/base/module/user/locales/es-ES/homepage.ftl rename to pagetop/src/base/module/user/locales/es-ES/homepage.ftl diff --git a/src/base/module/user/migration/m20220312_000001_create_table_user.rs b/pagetop/src/base/module/user/migration/m20220312_000001_create_table_user.rs similarity index 100% rename from src/base/module/user/migration/m20220312_000001_create_table_user.rs rename to pagetop/src/base/module/user/migration/m20220312_000001_create_table_user.rs diff --git a/src/base/module/user/migration/mod.rs b/pagetop/src/base/module/user/migration/mod.rs similarity index 100% rename from src/base/module/user/migration/mod.rs rename to pagetop/src/base/module/user/migration/mod.rs diff --git a/src/base/module/user/mod.rs b/pagetop/src/base/module/user/mod.rs similarity index 100% rename from src/base/module/user/mod.rs rename to pagetop/src/base/module/user/mod.rs diff --git a/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs similarity index 100% rename from src/base/theme/aliner/mod.rs rename to pagetop/src/base/theme/aliner/mod.rs diff --git a/src/base/theme/bootsier/locales/en-US/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl similarity index 100% rename from src/base/theme/bootsier/locales/en-US/bootsier.ftl rename to pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl diff --git a/src/base/theme/bootsier/locales/es-ES/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl similarity index 100% rename from src/base/theme/bootsier/locales/es-ES/bootsier.ftl rename to pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl diff --git a/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs similarity index 100% rename from src/base/theme/bootsier/mod.rs rename to pagetop/src/base/theme/bootsier/mod.rs diff --git a/src/base/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal/mod.rs similarity index 100% rename from src/base/theme/minimal/mod.rs rename to pagetop/src/base/theme/minimal/mod.rs diff --git a/src/base/theme/mod.rs b/pagetop/src/base/theme/mod.rs similarity index 100% rename from src/base/theme/mod.rs rename to pagetop/src/base/theme/mod.rs diff --git a/src/config.rs b/pagetop/src/config.rs similarity index 100% rename from src/config.rs rename to pagetop/src/config.rs diff --git a/src/core/global.rs b/pagetop/src/core/global.rs similarity index 100% rename from src/core/global.rs rename to pagetop/src/core/global.rs diff --git a/src/core/mod.rs b/pagetop/src/core/mod.rs similarity index 100% rename from src/core/mod.rs rename to pagetop/src/core/mod.rs diff --git a/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs similarity index 100% rename from src/core/module/definition.rs rename to pagetop/src/core/module/definition.rs diff --git a/src/core/module/mod.rs b/pagetop/src/core/module/mod.rs similarity index 100% rename from src/core/module/mod.rs rename to pagetop/src/core/module/mod.rs diff --git a/src/core/response/mod.rs b/pagetop/src/core/response/mod.rs similarity index 100% rename from src/core/response/mod.rs rename to pagetop/src/core/response/mod.rs diff --git a/src/core/response/page/assets.rs b/pagetop/src/core/response/page/assets.rs similarity index 100% rename from src/core/response/page/assets.rs rename to pagetop/src/core/response/page/assets.rs diff --git a/src/core/response/page/component.rs b/pagetop/src/core/response/page/component.rs similarity index 100% rename from src/core/response/page/component.rs rename to pagetop/src/core/response/page/component.rs diff --git a/src/core/response/page/container.rs b/pagetop/src/core/response/page/container.rs similarity index 100% rename from src/core/response/page/container.rs rename to pagetop/src/core/response/page/container.rs diff --git a/src/core/response/page/mod.rs b/pagetop/src/core/response/page/mod.rs similarity index 100% rename from src/core/response/page/mod.rs rename to pagetop/src/core/response/page/mod.rs diff --git a/src/core/response/page/page.rs b/pagetop/src/core/response/page/page.rs similarity index 100% rename from src/core/response/page/page.rs rename to pagetop/src/core/response/page/page.rs diff --git a/src/core/server/app.rs b/pagetop/src/core/server/app.rs similarity index 98% rename from src/core/server/app.rs rename to pagetop/src/core/server/app.rs index 1f2ec7f3..b23b38f2 100644 --- a/src/core/server/app.rs +++ b/pagetop/src/core/server/app.rs @@ -47,7 +47,7 @@ impl Application { // Inicializa la conexión con la base de datos. trace::info!( - "Connecting to database \"{}\" with a pool of {} connections.", + "Connecting to database \"{}\" using a pool of {} connections.", &SETTINGS.database.db_name, &SETTINGS.database.max_pool_size ); diff --git a/src/core/server/figfonts/slant.flf b/pagetop/src/core/server/figfonts/slant.flf similarity index 100% rename from src/core/server/figfonts/slant.flf rename to pagetop/src/core/server/figfonts/slant.flf diff --git a/src/core/server/figfonts/small.flf b/pagetop/src/core/server/figfonts/small.flf similarity index 100% rename from src/core/server/figfonts/small.flf rename to pagetop/src/core/server/figfonts/small.flf diff --git a/src/core/server/figfonts/speed.flf b/pagetop/src/core/server/figfonts/speed.flf similarity index 100% rename from src/core/server/figfonts/speed.flf rename to pagetop/src/core/server/figfonts/speed.flf diff --git a/src/core/server/figfonts/starwars.flf b/pagetop/src/core/server/figfonts/starwars.flf similarity index 100% rename from src/core/server/figfonts/starwars.flf rename to pagetop/src/core/server/figfonts/starwars.flf diff --git a/src/core/server/mod.rs b/pagetop/src/core/server/mod.rs similarity index 100% rename from src/core/server/mod.rs rename to pagetop/src/core/server/mod.rs diff --git a/src/core/server/tracing.rs b/pagetop/src/core/server/tracing.rs similarity index 100% rename from src/core/server/tracing.rs rename to pagetop/src/core/server/tracing.rs diff --git a/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs similarity index 100% rename from src/core/theme/definition.rs rename to pagetop/src/core/theme/definition.rs diff --git a/src/core/theme/mod.rs b/pagetop/src/core/theme/mod.rs similarity index 100% rename from src/core/theme/mod.rs rename to pagetop/src/core/theme/mod.rs diff --git a/src/db.rs b/pagetop/src/db.rs similarity index 100% rename from src/db.rs rename to pagetop/src/db.rs diff --git a/src/lib.rs b/pagetop/src/lib.rs similarity index 100% rename from src/lib.rs rename to pagetop/src/lib.rs diff --git a/src/locale.rs b/pagetop/src/locale.rs similarity index 100% rename from src/locale.rs rename to pagetop/src/locale.rs diff --git a/src/prelude.rs b/pagetop/src/prelude.rs similarity index 100% rename from src/prelude.rs rename to pagetop/src/prelude.rs diff --git a/src/trace.rs b/pagetop/src/trace.rs similarity index 100% rename from src/trace.rs rename to pagetop/src/trace.rs diff --git a/src/util.rs b/pagetop/src/util.rs similarity index 100% rename from src/util.rs rename to pagetop/src/util.rs diff --git a/static/aliner/css/styles.css b/pagetop/static/aliner/css/styles.css similarity index 100% rename from static/aliner/css/styles.css rename to pagetop/static/aliner/css/styles.css diff --git a/static/bootsier/css/bootstrap.min.css b/pagetop/static/bootsier/css/bootstrap.min.css similarity index 100% rename from static/bootsier/css/bootstrap.min.css rename to pagetop/static/bootsier/css/bootstrap.min.css diff --git a/static/bootsier/css/bootstrap.min.css.map b/pagetop/static/bootsier/css/bootstrap.min.css.map similarity index 100% rename from static/bootsier/css/bootstrap.min.css.map rename to pagetop/static/bootsier/css/bootstrap.min.css.map diff --git a/static/bootsier/images/caution.png b/pagetop/static/bootsier/images/caution.png similarity index 100% rename from static/bootsier/images/caution.png rename to pagetop/static/bootsier/images/caution.png diff --git a/static/bootsier/js/bootstrap.bundle.min.js b/pagetop/static/bootsier/js/bootstrap.bundle.min.js similarity index 100% rename from static/bootsier/js/bootstrap.bundle.min.js rename to pagetop/static/bootsier/js/bootstrap.bundle.min.js diff --git a/static/bootsier/js/bootstrap.bundle.min.js.map b/pagetop/static/bootsier/js/bootstrap.bundle.min.js.map similarity index 100% rename from static/bootsier/js/bootstrap.bundle.min.js.map rename to pagetop/static/bootsier/js/bootstrap.bundle.min.js.map diff --git a/static/theme/js/jquery.min.js b/pagetop/static/theme/js/jquery.min.js similarity index 100% rename from static/theme/js/jquery.min.js rename to pagetop/static/theme/js/jquery.min.js diff --git a/static/theme/js/jquery.min.map b/pagetop/static/theme/js/jquery.min.map similarity index 100% rename from static/theme/js/jquery.min.map rename to pagetop/static/theme/js/jquery.min.map diff --git a/static/theme/menu/css/menu-blue.css b/pagetop/static/theme/menu/css/menu-blue.css similarity index 100% rename from static/theme/menu/css/menu-blue.css rename to pagetop/static/theme/menu/css/menu-blue.css diff --git a/static/theme/menu/css/menu-clean.css b/pagetop/static/theme/menu/css/menu-clean.css similarity index 100% rename from static/theme/menu/css/menu-clean.css rename to pagetop/static/theme/menu/css/menu-clean.css diff --git a/static/theme/menu/css/menu-mint.css b/pagetop/static/theme/menu/css/menu-mint.css similarity index 100% rename from static/theme/menu/css/menu-mint.css rename to pagetop/static/theme/menu/css/menu-mint.css diff --git a/static/theme/menu/css/menu-simple.css b/pagetop/static/theme/menu/css/menu-simple.css similarity index 100% rename from static/theme/menu/css/menu-simple.css rename to pagetop/static/theme/menu/css/menu-simple.css diff --git a/static/theme/menu/css/menu.css b/pagetop/static/theme/menu/css/menu.css similarity index 100% rename from static/theme/menu/css/menu.css rename to pagetop/static/theme/menu/css/menu.css diff --git a/static/theme/menu/js/menu.min.js b/pagetop/static/theme/menu/js/menu.min.js similarity index 100% rename from static/theme/menu/js/menu.min.js rename to pagetop/static/theme/menu/js/menu.min.js diff --git a/tests/health_check.rs b/pagetop/tests/health_check.rs similarity index 100% rename from tests/health_check.rs rename to pagetop/tests/health_check.rs diff --git a/tests/main.rs b/pagetop/tests/main.rs similarity index 100% rename from tests/main.rs rename to pagetop/tests/main.rs From dce2573f8cd121eee483eacb08816ec3e2b08c3b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 14 Mar 2022 23:59:48 +0100 Subject: [PATCH 027/853] Actualiza el uso opcional de la base de datos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Por defecto PageTop no hace uso de la base de datos. Se deberá indicar explícitamente qué tipo de base de datos usará para que tenga en cuenta la configuración utilizada. --- config/default.toml | 6 +-- drust/Cargo.toml | 6 ++- pagetop/Cargo.toml | 10 +++-- pagetop/config/settings.default.toml | 24 ++++++----- pagetop/src/base/module/mod.rs | 2 + pagetop/src/config.rs | 12 +++--- pagetop/src/core/global.rs | 10 +++-- pagetop/src/core/module/definition.rs | 5 ++- pagetop/src/core/server/app.rs | 52 +++++------------------ pagetop/src/core/server/db.rs | 60 +++++++++++++++++++++++++++ pagetop/src/core/server/locale.rs | 23 ++++++++++ pagetop/src/core/server/mod.rs | 8 +++- pagetop/src/db.rs | 11 +++++ pagetop/src/lib.rs | 5 ++- pagetop/src/locale.rs | 25 +---------- pagetop/src/prelude.rs | 9 ++-- pagetop/src/util.rs | 11 ----- 17 files changed, 166 insertions(+), 113 deletions(-) create mode 100644 pagetop/src/core/server/db.rs create mode 100644 pagetop/src/core/server/locale.rs diff --git a/config/default.toml b/config/default.toml index 26676acb..33280fbd 100644 --- a/config/default.toml +++ b/config/default.toml @@ -9,12 +9,10 @@ language = "es-ES" theme = "Bootsier" [database] +db_type = "mysql" db_name = "drust" db_user = "drust" db_pass = "DrU__#3T" [log] -tracing = "Info" -#Info,actix_server::builder=Error,tracing_actix_web=Warn" -rolling = "Stdout" -format = "Compact" +tracing = "Info,sqlx::query=Warn" diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 0a579e5f..cfa4a264 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -13,7 +13,11 @@ homepage = "https://suitepro.cillero.es/projects/drust" repository = "https://gitlab.com/manuelcillero/drust" [dependencies] -pagetop = { path = "../pagetop" } actix-web = "3.3.3" maud = { version = "0.23.0" } serde = { version = "1.0", features = ["derive"] } + +[dependencies.pagetop] +path = "../pagetop" +features = ["mysql"] +default-features = false diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 278b6ba0..0b6c5d7d 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -36,6 +36,7 @@ config_rs = { package = "config", version = "0.11.0", features = ["toml"] } tracing = "0.1" tracing-appender = "0.2" tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } +tracing-unwrap = { version = "0.9", default-features = false } tracing-actix-web = "0.2" fluent-templates = "0.6.1" @@ -53,16 +54,19 @@ serde = { version = "1.0", features = ["derive"] } version = "0.6" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false +optional = true [dependencies.sea-schema] version = "0.5" features = ["debug-print", "migration"] default-features = false +optional = true [features] -default = ["mysql"] -mysql = ["sea-orm/sqlx-mysql"] -postgres = ["sea-orm/sqlx-postgres"] +default = [] +mysql = ["sea-orm", "sea-schema", "sea-orm/sqlx-mysql"] +postgres = ["sea-orm", "sea-schema", "sea-orm/sqlx-postgres"] +sqlite = ["sea-orm", "sea-schema", "sea-orm/sqlx-sqlite"] [build-dependencies] actix-web-static-files = "3.0.5" diff --git a/pagetop/config/settings.default.toml b/pagetop/config/settings.default.toml index f22868d2..b9c329cf 100644 --- a/pagetop/config/settings.default.toml +++ b/pagetop/config/settings.default.toml @@ -15,24 +15,26 @@ startup_banner = "Small" # Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". tracing = "Info" # En terminal ("Stdout") o archivos "Daily", "Hourly", "Minutely" o "Endless". -rolling = "Daily" +rolling = "Stdout" # Directorio para los archivos de traza (si rolling != "Stdout"). path = "log" # Prefijo para los archivos de traza (si rolling != "Stdout"). prefix = "tracing.log" -# Presentación de las trazas: "Json", "Full", "Compact" o "Pretty". -format = "Json" +# Presentación de las trazas: "Full", "Compact", "Pretty" o "Json". +format = "Full" [database] -# Ajustes para conectar con la base de datos. -# El tipo de base de datos es una característica de compilación. -# Nombre (mysql/postgres) o referencia (sqlite) de la base de datos. -db_name = "dbname" -# Usuario y contraseña (mysql/postgres). -db_user = "dbuser" -db_pass = "dbpass" -# Servidor (mysql/postgres) y puerto predeterminado (0 para 3306 ó 5432). +# Conecta con una base de datos (opcional). +# Tipo de la base de datos (mysql, postgres ó sqlite). +db_type = "" +# Nombre (para mysql/postgres) o referencia (para sqlite) de la base de datos. +db_name = "" +# Usuario y contraseña (para mysql/postgres). +db_user = "" +db_pass = "" +# Servidor (para mysql/postgres). db_host = "localhost" +# Puerto (para mysql/postgres), siendo 0 el puerto predeterminado (3306 ó 5432). db_port = 0 # Número máximo de conexiones habilitadas. max_pool_size = 5 diff --git a/pagetop/src/base/module/mod.rs b/pagetop/src/base/module/mod.rs index 3a4e2d51..ab1169b4 100644 --- a/pagetop/src/base/module/mod.rs +++ b/pagetop/src/base/module/mod.rs @@ -1,3 +1,5 @@ pub mod admin; pub mod homepage; + +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod user; diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index c6232c7a..fedffc21 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -89,6 +89,7 @@ pub struct Log { #[derive(Debug, Deserialize)] pub struct Database { + pub db_type : String, pub db_name : String, pub db_user : String, pub db_pass : String, @@ -127,15 +128,16 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]*, // [log] "log.tracing" => "Info", - "log.rolling" => "Daily", + "log.rolling" => "Stdout", "log.path" => "log", "log.prefix" => "tracing.log", - "log.format" => "json", + "log.format" => "Full", // [database] - "database.db_name" => "dbname", - "database.db_user" => "dbuser", - "database.db_pass" => "dbpass", + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", "database.db_host" => "localhost", "database.db_port" => 0, "database.max_pool_size" => 5, diff --git a/pagetop/src/core/global.rs b/pagetop/src/core/global.rs index 0879fe4c..0b307c56 100644 --- a/pagetop/src/core/global.rs +++ b/pagetop/src/core/global.rs @@ -1,4 +1,4 @@ -use crate::{Lazy, db}; +use crate::{Lazy, trace}; use crate::core::theme::Theme; use crate::core::module::Module; use crate::core::response::page::PageContainer; @@ -42,9 +42,13 @@ pub fn modules(cfg: &mut server::web::ServiceConfig) { } } -pub fn migrations(dbconn: &db::DbConn) { +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +pub fn check_migrations() { + trace::info!("Checking migrations."); for m in MODULES.read().unwrap().iter() { - m.migrations(dbconn).expect("Failed to run migrations"); + m.migrations( + &*server::db::DBCONN.read().unwrap() + ).expect("Failed to run migrations"); } } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index e11efd2e..7dc6252b 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,6 +1,8 @@ -use crate::db; use crate::core::server; +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +use crate::db; + /// Los módulos deben implementar este *trait*. pub trait Module: Send + Sync { fn name(&self) -> &'static str; @@ -15,6 +17,7 @@ pub trait Module: Send + Sync { fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { } + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[allow(unused_variables)] fn migrations(&self, dbconn: &db::DbConn) -> Result<(), db::DbErr> { Ok(()) diff --git a/pagetop/src/core/server/app.rs b/pagetop/src/core/server/app.rs index b23b38f2..dd794a68 100644 --- a/pagetop/src/core/server/app.rs +++ b/pagetop/src/core/server/app.rs @@ -1,4 +1,4 @@ -use crate::{Lazy, base, db, locale, trace}; +use crate::{Lazy, base, trace}; use crate::config::SETTINGS; use crate::core::{Server, global, server}; use crate::core::theme::register_theme; @@ -13,7 +13,7 @@ pub struct Application { impl Application { pub async fn build(bootstrap: Option<fn()>) -> Result<Self, Error> { - // Imprime rótulo (opcional) de bienvenida. + // Imprime un rótulo de presentación (opcional). if SETTINGS.app.startup_banner.to_lowercase() != "off" { let figfont = figlet_rs::FIGfont::from_content( match SETTINGS.app.startup_banner.to_lowercase().as_str() { @@ -43,42 +43,11 @@ impl Application { Lazy::force(&server::tracing::TRACING); // Valida el identificador de idioma. - Lazy::force(&locale::LANGID); + Lazy::force(&server::locale::LANGID); - // Inicializa la conexión con la base de datos. - trace::info!( - "Connecting to database \"{}\" using a pool of {} connections.", - &SETTINGS.database.db_name, - &SETTINGS.database.max_pool_size - ); - - #[cfg(feature = "mysql")] - let db_type = "mysql"; - - #[cfg(feature = "postgres")] - let db_type = "postgres"; - - // https://github.com/launchbadge/sqlx/issues/1624 - let mut db_uri = db::DbUri::parse(format!( - "{}://{}/{}", - db_type, - &SETTINGS.database.db_host, - &SETTINGS.database.db_name - ).as_str()).unwrap(); - db_uri.set_username(&SETTINGS.database.db_user.as_str()).unwrap(); - db_uri.set_password(Some(&SETTINGS.database.db_pass.as_str())).unwrap(); - if SETTINGS.database.db_port != 0 { - db_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); - } - - let mut db_options = sea_orm::ConnectOptions::new(db_uri.to_string()); - db_options.max_connections(SETTINGS.database.max_pool_size); - - let dbconn = sea_orm::Database::connect::<sea_orm::ConnectOptions>( - db_options.into() - ) - .await - .expect("Failed to connect to database"); + // Conecta con la base de datos (opcional). + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] + Lazy::force(&server::db::DBCONN); // Registra los temas predefinidos. register_theme(&base::theme::aliner::AlinerTheme); @@ -87,6 +56,8 @@ impl Application { // Registra los módulos predeterminados. register_module(&base::module::admin::AdminModule); + // Registra los módulos que requieren base de datos. + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] register_module(&base::module::user::UserModule); // Ejecuta la función de inicio de la aplicación. @@ -99,16 +70,15 @@ impl Application { // Al ser el último, puede sobrecargarse con la función de inicio. register_module(&base::module::homepage::HomepageModule); - // Run migrations. - trace::info!("Running migrations."); - global::migrations(&dbconn); + // Comprueba actualizaciones pendientes de la base de datos (opcional). + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] + global::check_migrations(); // Prepara el servidor web. let server = server::HttpServer::new(move || { server::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) - .data(dbconn.clone()) .configure(&global::themes) .configure(&global::modules) }) diff --git a/pagetop/src/core/server/db.rs b/pagetop/src/core/server/db.rs new file mode 100644 index 00000000..8c5c9f1f --- /dev/null +++ b/pagetop/src/core/server/db.rs @@ -0,0 +1,60 @@ +use crate::{Lazy, db, run_now, trace}; +use crate::config::SETTINGS; + +use std::sync::RwLock; +use sea_orm::{ConnectOptions, Database}; +use tracing_unwrap::ResultExt; + +pub static DBCONN: Lazy<RwLock<db::DbConn>> = Lazy::new(|| { + trace::info!( + "Connecting to database \"{}\" using a pool of {} connections.", + &SETTINGS.database.db_name, + &SETTINGS.database.max_pool_size + ); + + let db_uri = match SETTINGS.database.db_type.as_str() { + "mysql" | "postgres" => { + let mut tmp_uri = db::DbUri::parse(format!( + "{}://{}/{}", + &SETTINGS.database.db_type, + &SETTINGS.database.db_host, + &SETTINGS.database.db_name + ).as_str()).unwrap(); + tmp_uri.set_username( + &SETTINGS.database.db_user.as_str() + ).unwrap(); + // https://github.com/launchbadge/sqlx/issues/1624 + tmp_uri.set_password( + Some(&SETTINGS.database.db_pass.as_str()) + ).unwrap(); + if SETTINGS.database.db_port != 0 { + tmp_uri.set_port( + Some(SETTINGS.database.db_port) + ).unwrap(); + } + tmp_uri + }, + "sqlite" => db::DbUri::parse( + format!("{}://{}", + &SETTINGS.database.db_type, + &SETTINGS.database.db_name + ).as_str()).unwrap(), + _ => { + trace::error!( + "Unrecognized database type \"{}\".", + &SETTINGS.database.db_type + ); + db::DbUri::parse("").unwrap() + } + }; + + let db_conn = run_now( + Database::connect::<ConnectOptions>({ + let mut db_opt = ConnectOptions::new(db_uri.to_string()); + db_opt.max_connections(SETTINGS.database.max_pool_size); + db_opt.into() + }) + ).expect_or_log("Failed to connect to database"); + + RwLock::new(db_conn) +}); diff --git a/pagetop/src/core/server/locale.rs b/pagetop/src/core/server/locale.rs new file mode 100644 index 00000000..8bc6fc10 --- /dev/null +++ b/pagetop/src/core/server/locale.rs @@ -0,0 +1,23 @@ +use crate::{Lazy, trace}; +use crate::config::SETTINGS; + +use unic_langid::LanguageIdentifier; + +/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] +/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de +/// la aplicación, obtenido de `SETTINGS.app.language`. +pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { + match SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "Failed to parse language \"{}\". {}. {}. {}.", + SETTINGS.app.language, + "Unrecognized Unicode Language Identifier", + "Using \"en-US\"", + "Check the settings file", + ); + "en-US".parse().unwrap() + } + } +}); diff --git a/pagetop/src/core/server/mod.rs b/pagetop/src/core/server/mod.rs index ef85b53c..394886b4 100644 --- a/pagetop/src/core/server/mod.rs +++ b/pagetop/src/core/server/mod.rs @@ -4,5 +4,9 @@ pub use actix_web::{ mod tracing; -mod app; -pub use app::Application; +pub mod locale; + +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +pub mod db; + +pub mod app; diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index fb3f789e..b487cc19 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -12,3 +12,14 @@ pub mod entity { pub mod migration { pub use sea_schema::migration::prelude::*; } + +#[macro_export] +macro_rules! db_migrations { + ( $DBCONN:ident ) => {{ + $crate::run_now({ + use $crate::db::migration::MigratorTrait; + + migration::Migrator::up($DBCONN, None) + }) + }}; +} diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 8d75fb08..b8485f96 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -11,11 +11,14 @@ pub use futures::executor::block_on as run_now; pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. pub mod locale; // Localización. + +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a la base de datos. + pub mod core; // Servidor web y APIs para Temas, Módulos y Respuestas web. pub mod base; // Temas, Módulos y Componentes base. pub mod util; // Macros y funciones útiles. pub mod prelude; // Re-exporta recursos comunes. -pub use crate::core::server::Application; +pub use crate::core::server::app::Application; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 07cb0d8e..22a01ba6 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -2,35 +2,12 @@ pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; -use crate::{Lazy, trace}; -use crate::config::SETTINGS; - -use unic_langid::LanguageIdentifier; - -/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] -/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de -/// la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { - match SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "Failed to parse language \"{}\". {}. {}. {}.", - SETTINGS.app.language, - "Unicode Language Identifier not recognized", - "Using \"en-US\"", - "Check the settings file", - ); - "en-US".parse().unwrap() - } - } -}); - #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! localize { ( $DEF_LANGID:literal, $locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; + use $crate::core::server::locale::LANGID; static_locale! { static LOCALES = { diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index bcff745b..f0a4b031 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,15 +1,12 @@ //! Re-exporta recursos comunes. -pub use crate::{ - args, - db_migrations, -}; - +pub use crate::args; pub use crate::config::SETTINGS; pub use crate::trace; pub use crate::localize; -pub use crate::db; +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +pub use crate::{db, db_migrations}; pub use crate::core::theme::*; pub use crate::core::module::*; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 5150d517..c56d2146 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -18,17 +18,6 @@ macro_rules! args { }}; } -#[macro_export] -macro_rules! db_migrations { - ( $DBCONN:ident ) => {{ - $crate::run_now({ - use $crate::db::migration::MigratorTrait; - - migration::Migrator::up($DBCONN, None) - }) - }}; -} - pub fn valid_id(id: &str) -> Option<String> { let id = id.trim().replace(" ", "_").to_lowercase(); match id.is_empty() { From 1102a76e471baab9ca376548b09d5f81057d4444 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 15 Mar 2022 20:02:39 +0100 Subject: [PATCH 028/853] =?UTF-8?q?Retoca=20dependencias=20para=20la=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/Cargo.toml | 10 ++++------ pagetop/Cargo.toml | 2 +- pagetop/STARTER.Cargo.toml | 15 ++++++++++++++- pagetop/src/core/global.rs | 2 +- pagetop/src/core/server/app.rs | 2 +- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/drust/Cargo.toml b/drust/Cargo.toml index cfa4a264..dd0bfdc5 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drust" -version = "0.1.0" +version = "0.0.1" edition = "2021" authors = [ @@ -12,12 +12,10 @@ description = """\ homepage = "https://suitepro.cillero.es/projects/drust" repository = "https://gitlab.com/manuelcillero/drust" -[dependencies] -actix-web = "3.3.3" -maud = { version = "0.23.0" } -serde = { version = "1.0", features = ["derive"] } - [dependencies.pagetop] path = "../pagetop" features = ["mysql"] default-features = false + +[dependencies] +actix-web = "3.3.3" diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 0b6c5d7d..b828e58f 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.1.0" +version = "0.0.1" edition = "2021" authors = [ diff --git a/pagetop/STARTER.Cargo.toml b/pagetop/STARTER.Cargo.toml index 08b251e7..7cddd5fc 100644 --- a/pagetop/STARTER.Cargo.toml +++ b/pagetop/STARTER.Cargo.toml @@ -6,8 +6,21 @@ edition = "2021" # Ver más claves y sus definiciones en # https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies.pagetop] +path = "../pagetop" +# Opcional. Por defecto se puede usar PageTop sin base de datos. +features = ["mysql"] +# features = ["postgres"] +# features = ["sqlite"] +# PageTop puede dar soporte a todas las bases de datos. +# features = ["mysql", "postgres", "sqlite"] +# Sólo cuando no se usen las características predeterminadas. +default-features = false + [dependencies] -pagetop = { path = "pagetop" } +# Requerido. actix-web = "3.3.3" +# Opcional. Sólo si se usa la macro html!. maud = { version = "0.23.0" } +# Opcional. Si se requiere serialización de estructuras de datos. serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/src/core/global.rs b/pagetop/src/core/global.rs index 0b307c56..dd9aa909 100644 --- a/pagetop/src/core/global.rs +++ b/pagetop/src/core/global.rs @@ -43,7 +43,7 @@ pub fn modules(cfg: &mut server::web::ServiceConfig) { } #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub fn check_migrations() { +pub fn run_migrations() { trace::info!("Checking migrations."); for m in MODULES.read().unwrap().iter() { m.migrations( diff --git a/pagetop/src/core/server/app.rs b/pagetop/src/core/server/app.rs index dd794a68..7338aa3b 100644 --- a/pagetop/src/core/server/app.rs +++ b/pagetop/src/core/server/app.rs @@ -72,7 +72,7 @@ impl Application { // Comprueba actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - global::check_migrations(); + global::run_migrations(); // Prepara el servidor web. let server = server::HttpServer::new(move || { From ad65ab494c471885354710eee6d66b30a7cd47b9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 15 Mar 2022 20:11:54 +0100 Subject: [PATCH 029/853] =?UTF-8?q?A=C3=B1ade=20las=20dependencias=20para?= =?UTF-8?q?=20soportar=20Actix-web=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pendiente de que Maud libere una nueva versión con las modificaciones aplicadas en https://github.com/lambda-fairy/maud/pull/331 para soportar Actix-web 4. --- pagetop/Cargo.toml | 23 +++++++++---------- pagetop/build.rs | 40 +++++++++++----------------------- pagetop/src/core/server/app.rs | 4 +--- 3 files changed, 26 insertions(+), 41 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index b828e58f..364b35d2 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -27,23 +27,24 @@ categories = [ doc-comment = "0.3.3" downcast-rs = "1.2.0" figlet-rs = "0.1.3" -futures = "0.3" +futures = "0.3.21" once_cell = "1.9.0" url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } -tracing = "0.1" -tracing-appender = "0.2" -tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } -tracing-unwrap = { version = "0.9", default-features = false } -tracing-actix-web = "0.2" +tracing = "0.1.32" +tracing-appender = "0.2.1" +tracing-subscriber = { version = "0.3.9", features = ["json", "env-filter"] } +tracing-unwrap = { version = "0.9.2", default-features = false } +tracing-actix-web = "0.5.1" fluent-templates = "0.6.1" unic-langid = "0.9.0" -actix-web = "3.3.3" -actix-web-static-files = "3.0.5" +actix-web = "4.0.1" +actix-web-static-files = "4.0.0" +static-files = "0.2.3" maud = { version = "0.23.0", features = ["actix-web"] } sycamore = { version = "0.7.1", features = ["ssr"] } @@ -51,13 +52,13 @@ sycamore = { version = "0.7.1", features = ["ssr"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.6" +version = "0.6.0" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.5" +version = "0.6.0" features = ["debug-print", "migration"] default-features = false optional = true @@ -69,7 +70,7 @@ postgres = ["sea-orm", "sea-schema", "sea-orm/sqlx-postgres"] sqlite = ["sea-orm", "sea-schema", "sea-orm/sqlx-sqlite"] [build-dependencies] -actix-web-static-files = "3.0.5" +static-files = "0.2.3" [lib] name = "pagetop" diff --git a/pagetop/build.rs b/pagetop/build.rs index 9b252213..483b2294 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,33 +1,19 @@ -use actix_web_static_files::resource_dir; +use static_files::resource_dir; use std::env; use std::path::Path; fn main() { - resource_dir("./static/theme") - .with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()) - .join("theme.rs") - ) - .with_generated_fn("assets") - .build() - .unwrap(); - - resource_dir("./static/aliner") - .with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()) - .join("aliner.rs") - ) - .with_generated_fn("assets") - .build() - .unwrap(); - - resource_dir("./static/bootsier") - .with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()) - .join("bootsier.rs") - ) - .with_generated_fn("assets") - .build() - .unwrap(); + build_resource_dir("./static/theme", "theme.rs", "assets"); + build_resource_dir("./static/aliner", "aliner.rs", "assets"); + build_resource_dir("./static/bootsier", "bootsier.rs", "assets"); +} + +fn build_resource_dir(dir: &str, with_filename: &str, with_fn: &str) { + let mut resource = resource_dir(dir); + resource.with_generated_filename( + Path::new(env::var("OUT_DIR").unwrap().as_str()).join(with_filename) + ); + resource.with_generated_fn(with_fn); + resource.build().unwrap(); } diff --git a/pagetop/src/core/server/app.rs b/pagetop/src/core/server/app.rs index 7338aa3b..7d09f1fd 100644 --- a/pagetop/src/core/server/app.rs +++ b/pagetop/src/core/server/app.rs @@ -5,7 +5,6 @@ use crate::core::theme::register_theme; use crate::core::module::register_module; use std::io::Error; -use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; pub struct Application { server: Server, @@ -77,8 +76,7 @@ impl Application { // Prepara el servidor web. let server = server::HttpServer::new(move || { server::App::new() - .wrap(tracing_actix_web::TracingLogger) - .wrap(NormalizePath::new(TrailingSlash::Trim)) + .wrap(tracing_actix_web::TracingLogger::default()) .configure(&global::themes) .configure(&global::modules) }) From 2167ab94177ee3617b4e0c54774d9ce22609fead Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 16 Mar 2022 20:45:49 +0100 Subject: [PATCH 030/853] Actualiza y afina las dependencias de paquetes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit También normaliza los "traits" para definir temas y módulos usando el mismo criterio visto en SeaORM. --- drust/src/main.rs | 4 ++- pagetop/Cargo.toml | 19 ++++++----- pagetop/src/base/module/admin/mod.rs | 2 +- pagetop/src/base/module/homepage/mod.rs | 2 +- pagetop/src/base/module/user/mod.rs | 2 +- pagetop/src/base/theme/aliner/mod.rs | 2 +- pagetop/src/base/theme/bootsier/mod.rs | 2 +- pagetop/src/base/theme/minimal/mod.rs | 2 +- pagetop/src/core/{global.rs => all.rs} | 36 +++++++-------------- pagetop/src/core/html.rs | 1 + pagetop/src/core/mod.rs | 3 +- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/module/mod.rs | 12 +++---- pagetop/src/core/response/page/assets.rs | 13 ++++---- pagetop/src/core/response/page/component.rs | 2 +- pagetop/src/core/response/page/container.rs | 2 +- pagetop/src/core/response/page/page.rs | 17 ++++++---- pagetop/src/core/server/app.rs | 20 ++++++------ pagetop/src/core/server/db.rs | 13 +++----- pagetop/src/core/server/locale.rs | 7 ++-- pagetop/src/core/theme/definition.rs | 6 ++-- pagetop/src/core/theme/mod.rs | 14 ++++---- pagetop/src/lib.rs | 2 -- pagetop/src/locale.rs | 4 +-- pagetop/src/prelude.rs | 2 ++ pagetop/tests/health_check.rs | 9 +++--- 26 files changed, 100 insertions(+), 100 deletions(-) rename pagetop/src/core/{global.rs => all.rs} (53%) create mode 100644 pagetop/src/core/html.rs diff --git a/drust/src/main.rs b/drust/src/main.rs index 6916d3b1..ac96b1ed 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,4 +1,6 @@ +use pagetop::prelude::*; + #[actix_web::main] async fn main() -> std::io::Result<()> { - pagetop::Application::build(None).await?.run()?.await + Application::prepare(essence).await?.run()?.await } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index b828e58f..e6cbc75e 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -27,16 +27,16 @@ categories = [ doc-comment = "0.3.3" downcast-rs = "1.2.0" figlet-rs = "0.1.3" -futures = "0.3" -once_cell = "1.9.0" +futures = "0.3.21" +once_cell = "1.10.0" url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } -tracing = "0.1" -tracing-appender = "0.2" -tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } -tracing-unwrap = { version = "0.9", default-features = false } +tracing = "0.1.32" +tracing-appender = "0.2.1" +tracing-subscriber = { version = "0.3.9", features = ["json", "env-filter"] } +tracing-unwrap = { version = "0.9.2", default-features = false } tracing-actix-web = "0.2" fluent-templates = "0.6.1" @@ -51,17 +51,20 @@ sycamore = { version = "0.7.1", features = ["ssr"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.6" +version = "0.6.0" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.5" +version = "0.6.0" features = ["debug-print", "migration"] default-features = false optional = true +[dev-dependencies] +tokio = { version = "1.17.0", features = ["macros", "rt-multi-thread"] } + [features] default = [] mysql = ["sea-orm", "sea-schema", "sea-orm/sqlx-mysql"] diff --git a/pagetop/src/base/module/admin/mod.rs b/pagetop/src/base/module/admin/mod.rs index 0bb1202d..808aa75e 100644 --- a/pagetop/src/base/module/admin/mod.rs +++ b/pagetop/src/base/module/admin/mod.rs @@ -6,7 +6,7 @@ mod summary; pub struct AdminModule; -impl Module for AdminModule { +impl ModuleTrait for AdminModule { fn name(&self) -> &'static str { "admin" } diff --git a/pagetop/src/base/module/homepage/mod.rs b/pagetop/src/base/module/homepage/mod.rs index de4b98ce..b6aac4fe 100644 --- a/pagetop/src/base/module/homepage/mod.rs +++ b/pagetop/src/base/module/homepage/mod.rs @@ -4,7 +4,7 @@ localize!("en-US", "src/base/module/homepage/locales"); pub struct HomepageModule; -impl Module for HomepageModule { +impl ModuleTrait for HomepageModule { fn name(&self) -> &'static str { "homepage" } diff --git a/pagetop/src/base/module/user/mod.rs b/pagetop/src/base/module/user/mod.rs index 7dc3c043..99096377 100644 --- a/pagetop/src/base/module/user/mod.rs +++ b/pagetop/src/base/module/user/mod.rs @@ -7,7 +7,7 @@ mod migration; pub struct UserModule; -impl Module for UserModule { +impl ModuleTrait for UserModule { fn name(&self) -> &'static str { "user" } diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs index b678d4b7..18df448f 100644 --- a/pagetop/src/base/theme/aliner/mod.rs +++ b/pagetop/src/base/theme/aliner/mod.rs @@ -4,7 +4,7 @@ include!(concat!(env!("OUT_DIR"), "/aliner.rs")); pub struct AlinerTheme; -impl Theme for AlinerTheme { +impl ThemeTrait for AlinerTheme { fn name(&self) -> &'static str { "aliner" } diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index 3a340a84..dd16d71c 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -6,7 +6,7 @@ localize!("en-US", "src/base/theme/bootsier/locales"); pub struct BootsierTheme; -impl Theme for BootsierTheme { +impl ThemeTrait for BootsierTheme { fn name(&self) -> &'static str { "bootsier" } diff --git a/pagetop/src/base/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal/mod.rs index c6780005..b3a50906 100644 --- a/pagetop/src/base/theme/minimal/mod.rs +++ b/pagetop/src/base/theme/minimal/mod.rs @@ -2,7 +2,7 @@ use crate::prelude::*; pub struct MinimalTheme; -impl Theme for MinimalTheme { +impl ThemeTrait for MinimalTheme { fn name(&self) -> &'static str { "minimal" } diff --git a/pagetop/src/core/global.rs b/pagetop/src/core/all.rs similarity index 53% rename from pagetop/src/core/global.rs rename to pagetop/src/core/all.rs index dd9aa909..b48e0684 100644 --- a/pagetop/src/core/global.rs +++ b/pagetop/src/core/all.rs @@ -1,21 +1,19 @@ use crate::{Lazy, trace}; -use crate::core::theme::Theme; -use crate::core::module::Module; -use crate::core::response::page::PageContainer; +use crate::core::theme::ThemeTrait; +use crate::core::module::ModuleTrait; use crate::core::server; use std::sync::RwLock; -use std::collections::HashMap; include!(concat!(env!("OUT_DIR"), "/theme.rs")); // ----------------------------------------------------------------------------- -// Temas registrados y tema por defecto. +// Temas registrados y tema predeterminado. // ----------------------------------------------------------------------------- -pub static THEMES: Lazy<RwLock<Vec<&dyn Theme>>> = Lazy::new(|| { - RwLock::new(Vec::new()) -}); +pub static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new( + || { RwLock::new(Vec::new()) } +); pub fn themes(cfg: &mut server::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( @@ -32,9 +30,9 @@ pub fn themes(cfg: &mut server::web::ServiceConfig) { // Módulos registrados. // ----------------------------------------------------------------------------- -pub static MODULES: Lazy<RwLock<Vec<&dyn Module>>> = Lazy::new(|| { - RwLock::new(Vec::new()) -}); +pub static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new( + || { RwLock::new(Vec::new()) } +); pub fn modules(cfg: &mut server::web::ServiceConfig) { for m in MODULES.read().unwrap().iter() { @@ -43,19 +41,9 @@ pub fn modules(cfg: &mut server::web::ServiceConfig) { } #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub fn run_migrations() { - trace::info!("Checking migrations."); +pub fn migrations() { + trace::info!("Checking migrations"); for m in MODULES.read().unwrap().iter() { - m.migrations( - &*server::db::DBCONN.read().unwrap() - ).expect("Failed to run migrations"); + m.migrations(&*server::db::DBCONN).expect("Failed to run migrations"); } } - -// ----------------------------------------------------------------------------- -// Componentes globales. -// ----------------------------------------------------------------------------- - -pub static COMPONENTS: Lazy<RwLock<HashMap<&str, PageContainer>>> = Lazy::new( - || { RwLock::new(HashMap::new()) } -); diff --git a/pagetop/src/core/html.rs b/pagetop/src/core/html.rs new file mode 100644 index 00000000..ba885bb3 --- /dev/null +++ b/pagetop/src/core/html.rs @@ -0,0 +1 @@ +pub use maud::{DOCTYPE, Markup, PreEscaped, html}; diff --git a/pagetop/src/core/mod.rs b/pagetop/src/core/mod.rs index 26618959..8db86b83 100644 --- a/pagetop/src/core/mod.rs +++ b/pagetop/src/core/mod.rs @@ -1,7 +1,8 @@ pub use actix_web::dev::Server; -mod global; +mod all; +pub mod html; pub mod theme; pub mod module; pub mod response; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 7dc6252b..011ef083 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -4,7 +4,7 @@ use crate::core::server; use crate::db; /// Los módulos deben implementar este *trait*. -pub trait Module: Send + Sync { +pub trait ModuleTrait: Send + Sync { fn name(&self) -> &'static str; fn fullname(&self) -> String; diff --git a/pagetop/src/core/module/mod.rs b/pagetop/src/core/module/mod.rs index 439cff79..2a42352a 100644 --- a/pagetop/src/core/module/mod.rs +++ b/pagetop/src/core/module/mod.rs @@ -1,14 +1,14 @@ -use crate::core::global; +use crate::core::all; mod definition; -pub use definition::Module; +pub use definition::ModuleTrait; -pub fn register_module(m: &'static (dyn Module + 'static)) { - global::MODULES.write().unwrap().push(m); +pub fn register_module(m: &'static (dyn ModuleTrait + 'static)) { + all::MODULES.write().unwrap().push(m); } -pub fn find_module(name: &str) -> Option<&'static (dyn Module + 'static)> { - let modules = global::MODULES.write().unwrap(); +pub fn find_module(name: &str) -> Option<&'static (dyn ModuleTrait + 'static)> { + let modules = all::MODULES.write().unwrap(); match modules.iter().find(|t| t.name() == name) { Some(module) => Some(*module), _ => None, diff --git a/pagetop/src/core/response/page/assets.rs b/pagetop/src/core/response/page/assets.rs index 11cdd35c..2bd96fc2 100644 --- a/pagetop/src/core/response/page/assets.rs +++ b/pagetop/src/core/response/page/assets.rs @@ -1,10 +1,11 @@ use crate::{Lazy, base}; use crate::config::SETTINGS; -use crate::core::global; -use crate::core::theme::{Markup, PreEscaped, Theme, find_theme, html}; +use crate::core::all; +use crate::core::html::{Markup, PreEscaped, html}; +use crate::core::theme::*; -static DEFAULT_THEME: Lazy<&dyn Theme> = Lazy::new(|| { - for t in global::THEMES.read().unwrap().iter() { +static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { + for t in all::THEMES.read().unwrap().iter() { if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { return *t; } @@ -184,7 +185,7 @@ impl JavaScript { // ----------------------------------------------------------------------------- pub struct PageAssets { - theme : &'static dyn Theme, + theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, metadata : Vec<(String, String)>, stylesheets: Vec<StyleSheet>, @@ -259,7 +260,7 @@ impl PageAssets { /// Assets GETTERS. - pub fn theme(&mut self) -> &'static dyn Theme { + pub fn theme(&mut self) -> &'static dyn ThemeTrait { self.theme } diff --git a/pagetop/src/core/response/page/component.rs b/pagetop/src/core/response/page/component.rs index 1472ffe2..78925468 100644 --- a/pagetop/src/core/response/page/component.rs +++ b/pagetop/src/core/response/page/component.rs @@ -1,4 +1,4 @@ -use crate::core::theme::{Markup, html}; +use crate::core::html::{Markup, html}; use crate::core::response::page::PageAssets; use downcast_rs::{Downcast, impl_downcast}; diff --git a/pagetop/src/core/response/page/container.rs b/pagetop/src/core/response/page/container.rs index 6bf5e56a..4a577b2d 100644 --- a/pagetop/src/core/response/page/container.rs +++ b/pagetop/src/core/response/page/container.rs @@ -1,4 +1,4 @@ -use crate::core::theme::{Markup, html}; +use crate::core::html::{Markup, html}; use crate::core::response::page::{PageAssets, PageComponent, render_component}; use std::sync::Arc; diff --git a/pagetop/src/core/response/page/page.rs b/pagetop/src/core/response/page/page.rs index 8052683d..d47a33f1 100644 --- a/pagetop/src/core/response/page/page.rs +++ b/pagetop/src/core/response/page/page.rs @@ -1,12 +1,17 @@ use crate::{Lazy, trace, util}; use crate::config::SETTINGS; -use crate::core::{global, server}; -use crate::core::theme::{DOCTYPE, Markup, html}; +use crate::core::html::{DOCTYPE, Markup, html}; use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; +use crate::core::server; use std::borrow::Cow; +use std::sync::RwLock; use std::collections::HashMap; +static COMPONENTS: Lazy<RwLock<HashMap<&str, PageContainer>>> = Lazy::new(|| { + RwLock::new(HashMap::new()) +}); + static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { let language = SETTINGS.app.language[..2].to_lowercase(); if !language.is_empty() { @@ -25,9 +30,9 @@ static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { "" => None, _ => { trace::warn!( - "Text direction \"{}\" not valid. {}.", + "Text direction \"{}\" not valid, {}", SETTINGS.app.direction, - "Check the settings file" + "check the settings file" ); None } @@ -63,7 +68,7 @@ impl<'a> Page<'a> { description : None, body_classes: "body".into(), assets : PageAssets::new(), - regions : global::COMPONENTS.read().unwrap().clone(), + regions : COMPONENTS.read().unwrap().clone(), template : "default".to_owned(), } } @@ -208,7 +213,7 @@ pub fn render_component( } pub fn add_component_to(region: &'static str, component: impl PageComponent) { - let mut hmap = global::COMPONENTS.write().unwrap(); + let mut hmap = COMPONENTS.write().unwrap(); if let Some(regions) = hmap.get_mut(region) { regions.add(component); } else { diff --git a/pagetop/src/core/server/app.rs b/pagetop/src/core/server/app.rs index 7338aa3b..cbca9979 100644 --- a/pagetop/src/core/server/app.rs +++ b/pagetop/src/core/server/app.rs @@ -1,6 +1,6 @@ use crate::{Lazy, base, trace}; use crate::config::SETTINGS; -use crate::core::{Server, global, server}; +use crate::core::{Server, all, server}; use crate::core::theme::register_theme; use crate::core::module::register_module; @@ -11,8 +11,12 @@ pub struct Application { server: Server, } +pub fn essence() { + trace::info!("No bootstrap configured"); +} + impl Application { - pub async fn build(bootstrap: Option<fn()>) -> Result<Self, Error> { + pub async fn prepare(bootstrap: fn()) -> Result<Self, Error> { // Imprime un rótulo de presentación (opcional). if SETTINGS.app.startup_banner.to_lowercase() != "off" { let figfont = figlet_rs::FIGfont::from_content( @@ -61,10 +65,8 @@ impl Application { register_module(&base::module::user::UserModule); // Ejecuta la función de inicio de la aplicación. - if bootstrap != None { - trace::info!("Calling application bootstrap."); - let _ = &(bootstrap.unwrap())(); - } + trace::info!("Calling application bootstrap"); + let _ = &bootstrap(); // Registra el módulo para la página de inicio de PageTop. // Al ser el último, puede sobrecargarse con la función de inicio. @@ -72,15 +74,15 @@ impl Application { // Comprueba actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - global::run_migrations(); + all::migrations(); // Prepara el servidor web. let server = server::HttpServer::new(move || { server::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) - .configure(&global::themes) - .configure(&global::modules) + .configure(&all::themes) + .configure(&all::modules) }) .bind(format!("{}:{}", &SETTINGS.webserver.bind_address, diff --git a/pagetop/src/core/server/db.rs b/pagetop/src/core/server/db.rs index 8c5c9f1f..9d196970 100644 --- a/pagetop/src/core/server/db.rs +++ b/pagetop/src/core/server/db.rs @@ -1,13 +1,12 @@ use crate::{Lazy, db, run_now, trace}; use crate::config::SETTINGS; -use std::sync::RwLock; use sea_orm::{ConnectOptions, Database}; use tracing_unwrap::ResultExt; -pub static DBCONN: Lazy<RwLock<db::DbConn>> = Lazy::new(|| { +pub static DBCONN: Lazy<db::DbConn> = Lazy::new(|| { trace::info!( - "Connecting to database \"{}\" using a pool of {} connections.", + "Connecting to database \"{}\" using a pool of {} connections", &SETTINGS.database.db_name, &SETTINGS.database.max_pool_size ); @@ -41,20 +40,18 @@ pub static DBCONN: Lazy<RwLock<db::DbConn>> = Lazy::new(|| { ).as_str()).unwrap(), _ => { trace::error!( - "Unrecognized database type \"{}\".", + "Unrecognized database type \"{}\"", &SETTINGS.database.db_type ); db::DbUri::parse("").unwrap() } }; - let db_conn = run_now( + run_now( Database::connect::<ConnectOptions>({ let mut db_opt = ConnectOptions::new(db_uri.to_string()); db_opt.max_connections(SETTINGS.database.max_pool_size); db_opt.into() }) - ).expect_or_log("Failed to connect to database"); - - RwLock::new(db_conn) + ).expect_or_log("Failed to connect to database") }); diff --git a/pagetop/src/core/server/locale.rs b/pagetop/src/core/server/locale.rs index 8bc6fc10..59fc8468 100644 --- a/pagetop/src/core/server/locale.rs +++ b/pagetop/src/core/server/locale.rs @@ -11,11 +11,12 @@ pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { Ok(language) => language, Err(_) => { trace::warn!( - "Failed to parse language \"{}\". {}. {}. {}.", + "{}, {} \"{}\"! {}, {}", + "Failed to parse language", + "unrecognized Unicode Language Identifier", SETTINGS.app.language, - "Unrecognized Unicode Language Identifier", "Using \"en-US\"", - "Check the settings file", + "check the settings file", ); "en-US".parse().unwrap() } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 12d9e05f..eb67ec10 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,11 +1,11 @@ use crate::config::SETTINGS; -use crate::core::server; -use crate::core::theme::{Markup, html}; +use crate::core::html::{Markup, html}; use crate::core::response::page::{Page, PageAssets, PageComponent}; +use crate::core::server; use crate::base::component::Chunck; /// Los temas deben implementar este "trait". -pub trait Theme: Send + Sync { +pub trait ThemeTrait: Send + Sync { fn name(&self) -> &'static str; fn fullname(&self) -> String; diff --git a/pagetop/src/core/theme/mod.rs b/pagetop/src/core/theme/mod.rs index 8292ade6..e83f4307 100644 --- a/pagetop/src/core/theme/mod.rs +++ b/pagetop/src/core/theme/mod.rs @@ -1,16 +1,14 @@ -use crate::core::global; - -pub use maud::{DOCTYPE, Markup, PreEscaped, html}; +use crate::core::all; mod definition; -pub use definition::Theme; +pub use definition::ThemeTrait; -pub fn register_theme(t: &'static (dyn Theme + 'static)) { - global::THEMES.write().unwrap().push(t); +pub fn register_theme(t: &'static (dyn ThemeTrait + 'static)) { + all::THEMES.write().unwrap().push(t); } -pub fn find_theme(name: &str) -> Option<&'static (dyn Theme + 'static)> { - let themes = global::THEMES.write().unwrap(); +pub fn find_theme(name: &str) -> Option<&'static (dyn ThemeTrait + 'static)> { + let themes = all::THEMES.write().unwrap(); match themes.iter().find(|t| t.name() == name) { Some(theme) => Some(*theme), _ => None, diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index b8485f96..daf0577d 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -20,5 +20,3 @@ pub mod base; // Temas, Módulos y Componentes base. pub mod util; // Macros y funciones útiles. pub mod prelude; // Re-exporta recursos comunes. - -pub use crate::core::server::app::Application; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 22a01ba6..eac11472 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -37,8 +37,8 @@ macro_rules! localize { fn e( key: &str, args: &std::collections::HashMap<String, FluentValue> - ) -> crate::core::theme::PreEscaped<String> { - crate::core::theme::PreEscaped( + ) -> crate::core::html::PreEscaped<String> { + crate::core::html::PreEscaped( LOCALES.lookup_with_args(&LANGID, key, args) ) } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index f0a4b031..1dd8bd79 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -8,10 +8,12 @@ pub use crate::localize; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub use crate::{db, db_migrations}; +pub use crate::core::html::*; pub use crate::core::theme::*; pub use crate::core::module::*; pub use crate::core::response::page::*; pub use crate::core::server; +pub use crate::core::server::app::{Application, essence}; pub use crate::base::component::*; diff --git a/pagetop/tests/health_check.rs b/pagetop/tests/health_check.rs index 0c309bea..dd980796 100644 --- a/pagetop/tests/health_check.rs +++ b/pagetop/tests/health_check.rs @@ -1,7 +1,8 @@ -use pagetop::core::server; - -fn spawn_app() { - let server = server::run(None).expect("Failed to bind address"); +async fn spawn_app() { + let server = pagetop::Application::prepare(None) + .await? + .run()? + .expect("Failed to prepare server"); let _ = tokio::spawn(server); } From 58afd1f2582fa2b62357d345437199d3c17e150d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 17 Mar 2022 19:41:41 +0100 Subject: [PATCH 031/853] =?UTF-8?q?Corrige=20ejecuci=C3=B3n=20de=20las=20m?= =?UTF-8?q?igraciones=20en=20m=C3=B3dulos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/module/user/migration/mod.rs | 11 ---------- pagetop/src/base/module/user/mod.rs | 8 ++++--- pagetop/src/config.rs | 10 ++++----- pagetop/src/core/all.rs | 22 ++++++++++++++----- pagetop/src/core/module/definition.rs | 4 ++-- pagetop/src/core/server/app.rs | 2 +- pagetop/src/db.rs | 10 +++------ pagetop/src/prelude.rs | 2 +- pagetop/src/util.rs | 4 ++-- 9 files changed, 35 insertions(+), 38 deletions(-) diff --git a/pagetop/src/base/module/user/migration/mod.rs b/pagetop/src/base/module/user/migration/mod.rs index 8b9167a6..60836980 100644 --- a/pagetop/src/base/module/user/migration/mod.rs +++ b/pagetop/src/base/module/user/migration/mod.rs @@ -1,12 +1 @@ -use crate::db::migration::*; - pub mod m20220312_000001_create_table_user; - -pub struct Migrator; - -#[async_trait::async_trait] -impl MigratorTrait for Migrator { - fn migrations() -> Vec<Box<dyn MigrationTrait>> { - vec![Box::new(m20220312_000001_create_table_user::Migration)] - } -} diff --git a/pagetop/src/base/module/user/mod.rs b/pagetop/src/base/module/user/mod.rs index 99096377..362961eb 100644 --- a/pagetop/src/base/module/user/mod.rs +++ b/pagetop/src/base/module/user/mod.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -localize!("en-US", "src/base/module/user/locales"); +localize!("src/base/module/user/locales"); mod entity; mod migration; @@ -24,8 +24,10 @@ impl ModuleTrait for UserModule { cfg.route("/user/login", server::web::get().to(login)); } - fn migrations(&self, dbconn: &db::DbConn) -> Result<(), db::DbErr> { - db_migrations!(dbconn) + fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { + vec![ + boxed_migration!(m20220312_000001_create_table_user) + ] } } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index fedffc21..27dbb275 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -45,15 +45,15 @@ pub static CONFIG: Lazy<Config> = Lazy::new(|| { /// seguros. Produce un *panic!* en caso de asignaciones no válidas. macro_rules! config_map { ( - $COMM:expr, - $CONF:ident, - $TYPE:tt + $doc:expr, + $SETTINGS:ident, + $Type:tt $(, $key:expr => $value:expr)* ) => { $crate::doc_comment! { - concat!($COMM), + concat!($doc), - pub static $CONF: $crate::Lazy<$TYPE> = $crate::Lazy::new(|| { + pub static $SETTINGS: $crate::Lazy<$Type> = $crate::Lazy::new(|| { let mut settings = $crate::config::CONFIG.clone(); $( settings.set_default($key, $value).unwrap(); diff --git a/pagetop/src/core/all.rs b/pagetop/src/core/all.rs index b48e0684..20df22bd 100644 --- a/pagetop/src/core/all.rs +++ b/pagetop/src/core/all.rs @@ -1,4 +1,5 @@ -use crate::{Lazy, trace}; +use crate::{Lazy, run_now}; +use crate::db::migration::*; use crate::core::theme::ThemeTrait; use crate::core::module::ModuleTrait; use crate::core::server; @@ -41,9 +42,18 @@ pub fn modules(cfg: &mut server::web::ServiceConfig) { } #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub fn migrations() { - trace::info!("Checking migrations"); - for m in MODULES.read().unwrap().iter() { - m.migrations(&*server::db::DBCONN).expect("Failed to run migrations"); - } +pub fn run_migrations() { + run_now({ + struct Migrator; + impl MigratorTrait for Migrator { + fn migrations() -> Vec<Box<dyn MigrationTrait>> { + let mut migrations = vec![]; + for m in MODULES.read().unwrap().iter() { + migrations.append(&mut m.migrations()); + } + migrations + } + } + Migrator::up(&server::db::DBCONN, None) + }).unwrap(); } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 011ef083..c50cace3 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -19,7 +19,7 @@ pub trait ModuleTrait: Send + Sync { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[allow(unused_variables)] - fn migrations(&self, dbconn: &db::DbConn) -> Result<(), db::DbErr> { - Ok(()) + fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { + vec![] } } diff --git a/pagetop/src/core/server/app.rs b/pagetop/src/core/server/app.rs index cbca9979..74e1690d 100644 --- a/pagetop/src/core/server/app.rs +++ b/pagetop/src/core/server/app.rs @@ -74,7 +74,7 @@ impl Application { // Comprueba actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - all::migrations(); + all::run_migrations(); // Prepara el servidor web. let server = server::HttpServer::new(move || { diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index b487cc19..d68a5aac 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -14,12 +14,8 @@ pub mod migration { } #[macro_export] -macro_rules! db_migrations { - ( $DBCONN:ident ) => {{ - $crate::run_now({ - use $crate::db::migration::MigratorTrait; - - migration::Migrator::up($DBCONN, None) - }) +macro_rules! boxed_migration { + ( $migration_module:ident ) => {{ + Box::new(migration::$migration_module::Migration) }}; } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 1dd8bd79..18d160ce 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -6,7 +6,7 @@ pub use crate::trace; pub use crate::localize; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub use crate::{db, db_migrations}; +pub use crate::{db, boxed_migration}; pub use crate::core::html::*; pub use crate::core::theme::*; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index c56d2146..3fff0a23 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -9,10 +9,10 @@ /// ]; /// ``` macro_rules! args { - ( $($KEY:expr => $VALUE:expr),* ) => {{ + ( $($key:expr => $value:expr),* ) => {{ let mut a = std::collections::HashMap::new(); $( - a.insert(String::from($KEY), $VALUE.into()); + a.insert(String::from($key), $value.into()); )* a }}; From 516d9683da657176dbd671ce669e4c26b2d4acdd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 17 Mar 2022 19:43:42 +0100 Subject: [PATCH 032/853] Modifica y predetermina los locales para en-US --- pagetop/src/base/module/admin/mod.rs | 2 +- pagetop/src/base/module/homepage/mod.rs | 2 +- pagetop/src/base/theme/bootsier/mod.rs | 2 +- pagetop/src/locale.rs | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pagetop/src/base/module/admin/mod.rs b/pagetop/src/base/module/admin/mod.rs index 808aa75e..e9b58703 100644 --- a/pagetop/src/base/module/admin/mod.rs +++ b/pagetop/src/base/module/admin/mod.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -localize!("en-US", "src/base/module/admin/locales"); +localize!("src/base/module/admin/locales"); mod summary; diff --git a/pagetop/src/base/module/homepage/mod.rs b/pagetop/src/base/module/homepage/mod.rs index b6aac4fe..6b3b9741 100644 --- a/pagetop/src/base/module/homepage/mod.rs +++ b/pagetop/src/base/module/homepage/mod.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -localize!("en-US", "src/base/module/homepage/locales"); +localize!("src/base/module/homepage/locales"); pub struct HomepageModule; diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index dd16d71c..3c4176f0 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -2,7 +2,7 @@ use crate::prelude::*; include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); -localize!("en-US", "src/base/theme/bootsier/locales"); +localize!("src/base/theme/bootsier/locales"); pub struct BootsierTheme; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index eac11472..a5a136c2 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -5,15 +5,15 @@ pub use fluent_templates::fluent_bundle::FluentValue; #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! localize { - ( $DEF_LANGID:literal, $locales:literal $(, $core_locales:literal)? ) => { + ( $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; use $crate::core::server::locale::LANGID; static_locale! { static LOCALES = { - locales: $locales, + locales: $dir_locales, $( core_locales: $core_locales, )? - fallback_language: $DEF_LANGID, + fallback_language: "en-US", // Elimina las marcas Unicode que delimitan los argumentos. customise: |bundle| bundle.set_use_isolating(false), @@ -37,8 +37,8 @@ macro_rules! localize { fn e( key: &str, args: &std::collections::HashMap<String, FluentValue> - ) -> crate::core::html::PreEscaped<String> { - crate::core::html::PreEscaped( + ) -> $crate::core::html::PreEscaped<String> { + $crate::core::html::PreEscaped( LOCALES.lookup_with_args(&LANGID, key, args) ) } From fbc6ab2adfab1aa4e7da8d3c832d5850ea775366 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 19 Mar 2022 20:10:51 +0100 Subject: [PATCH 033/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 3 + drust/Cargo.toml | 3 + drust/src/main.rs | 8 +- pagetop-admin/Cargo.toml | 17 +++ pagetop-admin/src/lib.rs | 24 ++++ .../src}/locales/en-US/admin.ftl | 0 .../src}/locales/es-ES/admin.ftl | 0 .../admin => pagetop-admin/src}/summary.rs | 4 +- pagetop-node/Cargo.toml | 16 +++ pagetop-node/src/lib.rs | 39 +++++++ pagetop-node/src/locales/en-US/homepage.ftl | 2 + pagetop-node/src/locales/es-ES/homepage.ftl | 2 + ...m20220316_000001_create_table_node_type.rs | 90 ++++++++++++++ .../m20220316_000002_create_table_node.rs | 110 ++++++++++++++++++ ...0220316_000003_create_table_node_access.rs | 70 +++++++++++ ...20316_000004_create_table_node_revision.rs | 90 ++++++++++++++ pagetop-node/src/migration/mod.rs | 4 + pagetop-user/Cargo.toml | 22 ++++ .../user => pagetop-user/src}/entity/mod.rs | 0 .../user => pagetop-user/src}/entity/user.rs | 0 .../user/mod.rs => pagetop-user/src/lib.rs | 14 +-- .../src}/locales/en-US/homepage.ftl | 0 .../src}/locales/es-ES/homepage.ftl | 0 .../m20220312_000001_create_table_user.rs | 0 .../src}/migration/mod.rs | 0 pagetop/Cargo.toml | 2 +- ...RTER.Cargo.toml => STARTER.bin.Cargo.toml} | 5 + pagetop/STARTER.lib.Cargo.toml | 29 +++++ pagetop/src/{core => }/all.rs | 13 +-- .../server/app.rs => app/application.rs} | 35 +++--- pagetop/src/{core/server => app}/db.rs | 0 .../{core/server => app}/figfonts/slant.flf | 0 .../{core/server => app}/figfonts/small.flf | 0 .../{core/server => app}/figfonts/speed.flf | 0 .../server => app}/figfonts/starwars.flf | 0 pagetop/src/{core/server => app}/locale.rs | 0 pagetop/src/{core/server => app}/mod.rs | 3 +- pagetop/src/{core/server => app}/tracing.rs | 0 pagetop/src/base/mod.rs | 5 - pagetop/src/base/module/admin/mod.rs | 28 ----- pagetop/src/base/module/mod.rs | 5 - pagetop/src/base/theme/mod.rs | 3 - pagetop/src/{base => }/component/block.rs | 0 pagetop/src/{base => }/component/chunck.rs | 0 pagetop/src/{base => }/component/container.rs | 0 .../src/{base => }/component/form/button.rs | 0 pagetop/src/{base => }/component/form/date.rs | 0 pagetop/src/{base => }/component/form/form.rs | 0 .../src/{base => }/component/form/hidden.rs | 0 .../src/{base => }/component/form/input.rs | 0 pagetop/src/{base => }/component/form/mod.rs | 0 pagetop/src/{base => }/component/menu.rs | 0 pagetop/src/{base => }/component/mod.rs | 0 pagetop/src/core/mod.rs | 9 -- pagetop/src/core/module/mod.rs | 16 --- pagetop/src/{core => }/html.rs | 0 pagetop/src/lib.rs | 12 +- pagetop/src/locale.rs | 6 +- pagetop/src/{core => }/module/definition.rs | 19 ++- .../homepage/locales/en-US/homepage.ftl | 0 .../homepage/locales/es-ES/homepage.ftl | 0 pagetop/src/{base => }/module/homepage/mod.rs | 12 +- pagetop/src/module/mod.rs | 17 +++ pagetop/src/prelude.rs | 15 +-- pagetop/src/{core => }/response/mod.rs | 0 .../src/{core => }/response/page/assets.rs | 9 +- .../src/{core => }/response/page/component.rs | 4 +- .../src/{core => }/response/page/container.rs | 4 +- pagetop/src/{core => }/response/page/mod.rs | 0 pagetop/src/{core => }/response/page/page.rs | 9 +- pagetop/src/{base => }/theme/aliner/mod.rs | 2 +- .../theme/bootsier/locales/en-US/bootsier.ftl | 0 .../theme/bootsier/locales/es-ES/bootsier.ftl | 0 pagetop/src/{base => }/theme/bootsier/mod.rs | 10 +- pagetop/src/{core => }/theme/definition.rs | 12 +- pagetop/src/{base => }/theme/minimal/mod.rs | 0 pagetop/src/{core => }/theme/mod.rs | 10 +- 77 files changed, 651 insertions(+), 161 deletions(-) create mode 100644 pagetop-admin/Cargo.toml create mode 100644 pagetop-admin/src/lib.rs rename {pagetop/src/base/module/admin => pagetop-admin/src}/locales/en-US/admin.ftl (100%) rename {pagetop/src/base/module/admin => pagetop-admin/src}/locales/es-ES/admin.ftl (100%) rename {pagetop/src/base/module/admin => pagetop-admin/src}/summary.rs (95%) create mode 100644 pagetop-node/Cargo.toml create mode 100644 pagetop-node/src/lib.rs create mode 100644 pagetop-node/src/locales/en-US/homepage.ftl create mode 100644 pagetop-node/src/locales/es-ES/homepage.ftl create mode 100644 pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs create mode 100644 pagetop-node/src/migration/m20220316_000002_create_table_node.rs create mode 100644 pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs create mode 100644 pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs create mode 100644 pagetop-node/src/migration/mod.rs create mode 100644 pagetop-user/Cargo.toml rename {pagetop/src/base/module/user => pagetop-user/src}/entity/mod.rs (100%) rename {pagetop/src/base/module/user => pagetop-user/src}/entity/user.rs (100%) rename pagetop/src/base/module/user/mod.rs => pagetop-user/src/lib.rs (80%) rename {pagetop/src/base/module/user => pagetop-user/src}/locales/en-US/homepage.ftl (100%) rename {pagetop/src/base/module/user => pagetop-user/src}/locales/es-ES/homepage.ftl (100%) rename {pagetop/src/base/module/user => pagetop-user/src}/migration/m20220312_000001_create_table_user.rs (100%) rename {pagetop/src/base/module/user => pagetop-user/src}/migration/mod.rs (100%) rename pagetop/{STARTER.Cargo.toml => STARTER.bin.Cargo.toml} (88%) create mode 100644 pagetop/STARTER.lib.Cargo.toml rename pagetop/src/{core => }/all.rs (83%) rename pagetop/src/{core/server/app.rs => app/application.rs} (73%) rename pagetop/src/{core/server => app}/db.rs (100%) rename pagetop/src/{core/server => app}/figfonts/slant.flf (100%) rename pagetop/src/{core/server => app}/figfonts/small.flf (100%) rename pagetop/src/{core/server => app}/figfonts/speed.flf (100%) rename pagetop/src/{core/server => app}/figfonts/starwars.flf (100%) rename pagetop/src/{core/server => app}/locale.rs (100%) rename pagetop/src/{core/server => app}/mod.rs (81%) rename pagetop/src/{core/server => app}/tracing.rs (100%) delete mode 100644 pagetop/src/base/mod.rs delete mode 100644 pagetop/src/base/module/admin/mod.rs delete mode 100644 pagetop/src/base/module/mod.rs delete mode 100644 pagetop/src/base/theme/mod.rs rename pagetop/src/{base => }/component/block.rs (100%) rename pagetop/src/{base => }/component/chunck.rs (100%) rename pagetop/src/{base => }/component/container.rs (100%) rename pagetop/src/{base => }/component/form/button.rs (100%) rename pagetop/src/{base => }/component/form/date.rs (100%) rename pagetop/src/{base => }/component/form/form.rs (100%) rename pagetop/src/{base => }/component/form/hidden.rs (100%) rename pagetop/src/{base => }/component/form/input.rs (100%) rename pagetop/src/{base => }/component/form/mod.rs (100%) rename pagetop/src/{base => }/component/menu.rs (100%) rename pagetop/src/{base => }/component/mod.rs (100%) delete mode 100644 pagetop/src/core/mod.rs delete mode 100644 pagetop/src/core/module/mod.rs rename pagetop/src/{core => }/html.rs (100%) rename pagetop/src/{core => }/module/definition.rs (56%) rename pagetop/src/{base => }/module/homepage/locales/en-US/homepage.ftl (100%) rename pagetop/src/{base => }/module/homepage/locales/es-ES/homepage.ftl (100%) rename pagetop/src/{base => }/module/homepage/mod.rs (88%) create mode 100644 pagetop/src/module/mod.rs rename pagetop/src/{core => }/response/mod.rs (100%) rename pagetop/src/{core => }/response/page/assets.rs (98%) rename pagetop/src/{core => }/response/page/component.rs (90%) rename pagetop/src/{core => }/response/page/container.rs (86%) rename pagetop/src/{core => }/response/page/mod.rs (100%) rename pagetop/src/{core => }/response/page/page.rs (96%) rename pagetop/src/{base => }/theme/aliner/mod.rs (90%) rename pagetop/src/{base => }/theme/bootsier/locales/en-US/bootsier.ftl (100%) rename pagetop/src/{base => }/theme/bootsier/locales/es-ES/bootsier.ftl (100%) rename pagetop/src/{base => }/theme/bootsier/mod.rs (88%) rename pagetop/src/{core => }/theme/definition.rs (89%) rename pagetop/src/{base => }/theme/minimal/mod.rs (100%) rename pagetop/src/{core => }/theme/mod.rs (58%) diff --git a/Cargo.toml b/Cargo.toml index 2369a8da..00ab4e13 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,4 +2,7 @@ members = [ "drust", "pagetop", + "pagetop-admin", + "pagetop-user", + "pagetop-node", ] \ No newline at end of file diff --git a/drust/Cargo.toml b/drust/Cargo.toml index dd0bfdc5..88ebabde 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -19,3 +19,6 @@ default-features = false [dependencies] actix-web = "3.3.3" +pagetop-admin = { path = "../pagetop-admin" } +pagetop-user = { path = "../pagetop-user" } +pagetop-node = { path = "../pagetop-node" } diff --git a/drust/src/main.rs b/drust/src/main.rs index ac96b1ed..e51f5311 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,6 +1,12 @@ use pagetop::prelude::*; +fn bootstrap() { + register_module(&pagetop_admin::AdminModule); + register_module(&pagetop_user::UserModule); + register_module(&pagetop_node::NodeModule); +} + #[actix_web::main] async fn main() -> std::io::Result<()> { - Application::prepare(essence).await?.run()?.await + Application::prepare(bootstrap).await?.run()?.await } diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml new file mode 100644 index 00000000..1bff0edd --- /dev/null +++ b/pagetop-admin/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "pagetop-admin" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Allows content to be submitted to the site and displayed on pages.\ +""" +homepage = "https://suitepro.cillero.es/projects/drust" +repository = "https://gitlab.com/manuelcillero/drust" + +[dependencies] +pagetop = { path = "../pagetop" } +maud = { version = "0.23.0" } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs new file mode 100644 index 00000000..e3ad0337 --- /dev/null +++ b/pagetop-admin/src/lib.rs @@ -0,0 +1,24 @@ +use pagetop::prelude::*; + +localize!("src/locales"); + +mod summary; + +pub struct AdminModule; + +impl ModuleTrait for AdminModule { + fn fullname(&self) -> String { + l("module_fullname") + } + + fn description(&self) -> Option<String> { + Some(l("module_description")) + } + + fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + cfg.service( + app::web::scope("/admin") + .route("", app::web::get().to(summary::summary)) + ); + } +} diff --git a/pagetop/src/base/module/admin/locales/en-US/admin.ftl b/pagetop-admin/src/locales/en-US/admin.ftl similarity index 100% rename from pagetop/src/base/module/admin/locales/en-US/admin.ftl rename to pagetop-admin/src/locales/en-US/admin.ftl diff --git a/pagetop/src/base/module/admin/locales/es-ES/admin.ftl b/pagetop-admin/src/locales/es-ES/admin.ftl similarity index 100% rename from pagetop/src/base/module/admin/locales/es-ES/admin.ftl rename to pagetop-admin/src/locales/es-ES/admin.ftl diff --git a/pagetop/src/base/module/admin/summary.rs b/pagetop-admin/src/summary.rs similarity index 95% rename from pagetop/src/base/module/admin/summary.rs rename to pagetop-admin/src/summary.rs index cee26c22..79bf426e 100644 --- a/pagetop/src/base/module/admin/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,7 +1,7 @@ -use crate::prelude::*; +use pagetop::prelude::*; use super::l; -pub async fn summary() -> server::Result<Markup> { +pub async fn summary() -> app::Result<Markup> { let top_menu = Menu::prepare() .add(MenuItem::label(l("module_fullname").as_str())) .add(MenuItem::link("Opción 2", "https://www.google.es")) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml new file mode 100644 index 00000000..36b43d39 --- /dev/null +++ b/pagetop-node/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "pagetop-node" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Allows content to be submitted to the site and displayed on pages.\ +""" +homepage = "https://suitepro.cillero.es/projects/drust" +repository = "https://gitlab.com/manuelcillero/drust" + +[dependencies] +pagetop = { path = "../pagetop" } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs new file mode 100644 index 00000000..af6d8b3f --- /dev/null +++ b/pagetop-node/src/lib.rs @@ -0,0 +1,39 @@ +use pagetop::prelude::*; + +localize!("src/locales"); + +//mod entity; +mod migration; + +pub struct NodeModule; + +impl ModuleTrait for NodeModule { + fn fullname(&self) -> String { + l("module_fullname") + } + + fn description(&self) -> Option<String> { + Some(l("module_description")) + } + + fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + cfg.route("/node", app::web::get().to(node)); + } + + fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { + vec![ + boxed_migration!(m20220316_000001_create_table_node_type), + boxed_migration!(m20220316_000002_create_table_node), + boxed_migration!(m20220316_000003_create_table_node_access), + boxed_migration!(m20220316_000004_create_table_node_revision), + ] + } +} + +async fn node() -> app::Result<Markup> { + Page::prepare() + .with_title( + "Nodo" + ) + .render() +} diff --git a/pagetop-node/src/locales/en-US/homepage.ftl b/pagetop-node/src/locales/en-US/homepage.ftl new file mode 100644 index 00000000..191dc81f --- /dev/null +++ b/pagetop-node/src/locales/en-US/homepage.ftl @@ -0,0 +1,2 @@ +module_fullname = Node +module_description = Allows content to be submitted to the site and displayed on pages. diff --git a/pagetop-node/src/locales/es-ES/homepage.ftl b/pagetop-node/src/locales/es-ES/homepage.ftl new file mode 100644 index 00000000..b5e6677d --- /dev/null +++ b/pagetop-node/src/locales/es-ES/homepage.ftl @@ -0,0 +1,2 @@ +module_fullname = Nodo +module_description = Permite enviar contenidos al sitio y mostrarlos en páginas. diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs new file mode 100644 index 00000000..5180a785 --- /dev/null +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -0,0 +1,90 @@ +use pagetop::db::migration::*; + +/// Stores information about all defined {node} types. +#[derive(Iden)] +enum NodeType { + Table, // Nombre de la tabla: node_type (Tipo de nodo). + Type, // The machine-readable name of this type + Name, // The human-readable name of this type + Description, // Descripción breve del tipo. + Help, // Help information shown to the user when creating a {node} of this type + HasTitle, // Boolean indicating whether this type uses the {node}.title field + TitleLabel, // The label displayed for the title field on the edit form + Custom, // A boolean indicating whether this type is defined by a module (FALSE) or by a user via Add content type (TRUE) + Locked, // A boolean indicating whether the administrator can change the machine name of this type + Disabled, // A boolean indicating whether the node type is disabled + OrigType, // The original machine-readable name of this node type. This may be different from the current type name if the locked field is 0 +} + +pub struct Migration; + +impl MigrationName for Migration { + fn name(&self) -> &str { + "m20220316_000001_create_table_node_type" + } +} + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(NodeType::Table) + .if_not_exists() + .col(ColumnDef::new(NodeType::Type) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(NodeType::Name) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Description) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Help) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::HasTitle) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::TitleLabel) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Custom) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Locked) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Disabled) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::OrigType) + .string() + .not_null() + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(NodeType::Table) + .to_owned() + ) + .await + } +} diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs new file mode 100644 index 00000000..fe65fc2c --- /dev/null +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -0,0 +1,110 @@ +use pagetop::db::migration::*; + +/// The base table for nodes. +#[derive(Iden)] +enum Node { + Table, // Nombre de la tabla: node (Nodo). + Nid, // The primary identifier for a node + Vid, // The current {node_revision}.vid version identifier + Type, // The {node_type}.type of this node + Language, // The {languages}.language of this node + Title, // The title of this node, always treated as non-markup plain text + Uid, // The {users}.uid that owns this node; initially, this is the user that created it + Status, // Boolean indicating whether the node is published (visible to non-administrators) + Created, // The Unix timestamp when the node was created + Changed, // The Unix timestamp when the node was most recently saved + Comment, // Whether comments are allowed on this node: 0 = no, 1 = closed (read only), 2 = open (read/write) + Promote, // Boolean indicating whether the node should be displayed on the front page + Sticky, // Boolean indicating whether the node should be displayed at the top of lists in which it appears + Tnid, // The translation set id for this node, which equals the node id of the source post in each set + Translate, // A boolean indicating whether this translation page needs to be updated +} + +pub struct Migration; + +impl MigrationName for Migration { + fn name(&self) -> &str { + "m20220316_000002_create_table_node" + } +} + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(Node::Table) + .if_not_exists() + .col(ColumnDef::new(Node::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Node::Vid) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Type) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Language) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Title) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Uid) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Status) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Created) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Changed) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Comment) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Promote) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Sticky) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Tnid) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Translate) + .string() + .not_null() + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(Node::Table) + .to_owned() + ) + .await + } +} diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs new file mode 100644 index 00000000..a179240f --- /dev/null +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -0,0 +1,70 @@ +use pagetop::db::migration::*; + +// Identifies which realm/grant pairs a user must possess in order to view, update, or delete specific nodes. +#[derive(Iden)] +enum NodeAccess { + Table, // Nombre de la tabla: node_access (Acceso a nodos). + Nid, // The {node}.nid this record affects + Gid, // The grant ID a user must possess in the specified realm to gain this row's privileges on the node + Realm, // The realm in which the user must possess the grant ID. Each node access node can define one or more realms + GrantView, // Boolean indicating whether a user with the realm/grant pair can view this node + GrantUpdate, // Boolean indicating whether a user with the realm/grant pair can edit this node + GrantDelete, // Boolean indicating whether a user with the realm/grant pair can delete this node +} + +pub struct Migration; + +impl MigrationName for Migration { + fn name(&self) -> &str { + "m20220316_000003_create_table_node_access" + } +} + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(NodeAccess::Table) + .if_not_exists() + .col(ColumnDef::new(NodeAccess::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(NodeAccess::Gid) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::Realm) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::GrantView) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::GrantUpdate) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::GrantDelete) + .string() + .not_null() + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(NodeAccess::Table) + .to_owned() + ) + .await + } +} diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs new file mode 100644 index 00000000..4dc4e1b6 --- /dev/null +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -0,0 +1,90 @@ +use pagetop::db::migration::*; + +// Stores information about each saved version of a {node}. +#[derive(Iden)] +enum NodeRevision { + Table, // Nombre de la tabla: node_revisión (Versiones de nodos). + Nid, // The {node} this version belongs to + Vid, // The primary identifier for this version + Uid, // The {users}.uid that created this version + Title, // The title of this version + Log, // The log entry explaining the changes in this version + Timestamp, // A Unix timestamp indicating when this version was created + Status, // Boolean indicating whether the node (at the time of this revision) is published (visible to non-administrators) + Comment, // Whether comments are allowed on this node (at the time of this revision): 0 = no, 1 = closed (read only), 2 = open (read/write) + Promote, // Boolean indicating whether the node (at the time of this revision) should be displayed on the front page + Sticky, // Boolean indicating whether the node (at the time of this revision) should be displayed at the top of lists in which it appears +} + +pub struct Migration; + +impl MigrationName for Migration { + fn name(&self) -> &str { + "m20220316_000004_create_table_node_revision" + } +} + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(NodeRevision::Table) + .if_not_exists() + .col(ColumnDef::new(NodeRevision::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(NodeRevision::Vid) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Uid) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Title) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Log) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Timestamp) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Status) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Comment) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Promote) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Sticky) + .string() + .not_null() + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(NodeRevision::Table) + .to_owned() + ) + .await + } +} diff --git a/pagetop-node/src/migration/mod.rs b/pagetop-node/src/migration/mod.rs new file mode 100644 index 00000000..49f4e057 --- /dev/null +++ b/pagetop-node/src/migration/mod.rs @@ -0,0 +1,4 @@ +pub mod m20220316_000001_create_table_node_type; +pub mod m20220316_000002_create_table_node; +pub mod m20220316_000003_create_table_node_access; +pub mod m20220316_000004_create_table_node_revision; diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml new file mode 100644 index 00000000..37352fe7 --- /dev/null +++ b/pagetop-user/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "pagetop-user" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Allows content to be submitted to the site and displayed on pages.\ +""" +homepage = "https://suitepro.cillero.es/projects/drust" +repository = "https://gitlab.com/manuelcillero/drust" + +[dependencies] +pagetop = { path = "../pagetop" } +serde = { version = "1.0", features = ["derive"] } + +[dependencies.sea-orm] +version = "0.6.0" +features = ["debug-print", "macros"] +default-features = false diff --git a/pagetop/src/base/module/user/entity/mod.rs b/pagetop-user/src/entity/mod.rs similarity index 100% rename from pagetop/src/base/module/user/entity/mod.rs rename to pagetop-user/src/entity/mod.rs diff --git a/pagetop/src/base/module/user/entity/user.rs b/pagetop-user/src/entity/user.rs similarity index 100% rename from pagetop/src/base/module/user/entity/user.rs rename to pagetop-user/src/entity/user.rs diff --git a/pagetop/src/base/module/user/mod.rs b/pagetop-user/src/lib.rs similarity index 80% rename from pagetop/src/base/module/user/mod.rs rename to pagetop-user/src/lib.rs index 362961eb..c76233e1 100644 --- a/pagetop/src/base/module/user/mod.rs +++ b/pagetop-user/src/lib.rs @@ -1,6 +1,6 @@ -use crate::prelude::*; +use pagetop::prelude::*; -localize!("src/base/module/user/locales"); +localize!("src/locales"); mod entity; mod migration; @@ -8,10 +8,6 @@ mod migration; pub struct UserModule; impl ModuleTrait for UserModule { - fn name(&self) -> &'static str { - "user" - } - fn fullname(&self) -> String { l("module_fullname") } @@ -20,8 +16,8 @@ impl ModuleTrait for UserModule { Some(l("module_description")) } - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.route("/user/login", server::web::get().to(login)); + fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + cfg.route("/user/login", app::web::get().to(login)); } fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { @@ -50,7 +46,7 @@ fn form_login() -> impl PageComponent { .add(form::Button::submit(l("login").as_str())) } -async fn login() -> server::Result<Markup> { +async fn login() -> app::Result<Markup> { Page::prepare() .with_title( "Identificación del usuario" diff --git a/pagetop/src/base/module/user/locales/en-US/homepage.ftl b/pagetop-user/src/locales/en-US/homepage.ftl similarity index 100% rename from pagetop/src/base/module/user/locales/en-US/homepage.ftl rename to pagetop-user/src/locales/en-US/homepage.ftl diff --git a/pagetop/src/base/module/user/locales/es-ES/homepage.ftl b/pagetop-user/src/locales/es-ES/homepage.ftl similarity index 100% rename from pagetop/src/base/module/user/locales/es-ES/homepage.ftl rename to pagetop-user/src/locales/es-ES/homepage.ftl diff --git a/pagetop/src/base/module/user/migration/m20220312_000001_create_table_user.rs b/pagetop-user/src/migration/m20220312_000001_create_table_user.rs similarity index 100% rename from pagetop/src/base/module/user/migration/m20220312_000001_create_table_user.rs rename to pagetop-user/src/migration/m20220312_000001_create_table_user.rs diff --git a/pagetop/src/base/module/user/migration/mod.rs b/pagetop-user/src/migration/mod.rs similarity index 100% rename from pagetop/src/base/module/user/migration/mod.rs rename to pagetop-user/src/migration/mod.rs diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index e6cbc75e..a9c7993c 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop/STARTER.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml similarity index 88% rename from pagetop/STARTER.Cargo.toml rename to pagetop/STARTER.bin.Cargo.toml index 7cddd5fc..d05a17bf 100644 --- a/pagetop/STARTER.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -24,3 +24,8 @@ actix-web = "3.3.3" maud = { version = "0.23.0" } # Opcional. Si se requiere serialización de estructuras de datos. serde = { version = "1.0", features = ["derive"] } + +[dependencies.sea-orm] +version = "0.6.0" +features = ["debug-print", "macros"] +default-features = false diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml new file mode 100644 index 00000000..97389750 --- /dev/null +++ b/pagetop/STARTER.lib.Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "app" +version = "0.1.0" +edition = "2021" + +# Ver más claves y sus definiciones en +# https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies.pagetop] +path = "../pagetop" +# Opcional. Por defecto se puede usar PageTop sin base de datos. +features = ["mysql"] +# features = ["postgres"] +# features = ["sqlite"] +# PageTop puede dar soporte a todas las bases de datos. +# features = ["mysql", "postgres", "sqlite"] +# Sólo cuando no se usen las características predeterminadas. +default-features = false + +[dependencies] +# Opcional. Sólo si se usa la macro html!. +maud = { version = "0.23.0" } +# Opcional. Si se requiere serialización de estructuras de datos. +serde = { version = "1.0", features = ["derive"] } + +[dependencies.sea-orm] +version = "0.6.0" +features = ["debug-print", "macros"] +default-features = false diff --git a/pagetop/src/core/all.rs b/pagetop/src/all.rs similarity index 83% rename from pagetop/src/core/all.rs rename to pagetop/src/all.rs index 20df22bd..a7134172 100644 --- a/pagetop/src/core/all.rs +++ b/pagetop/src/all.rs @@ -1,8 +1,7 @@ -use crate::{Lazy, run_now}; +use crate::{Lazy, run_now, app}; use crate::db::migration::*; -use crate::core::theme::ThemeTrait; -use crate::core::module::ModuleTrait; -use crate::core::server; +use crate::theme::ThemeTrait; +use crate::module::ModuleTrait; use std::sync::RwLock; @@ -16,7 +15,7 @@ pub static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new( || { RwLock::new(Vec::new()) } ); -pub fn themes(cfg: &mut server::web::ServiceConfig) { +pub fn themes(cfg: &mut app::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( "/theme", assets() @@ -35,7 +34,7 @@ pub static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new( || { RwLock::new(Vec::new()) } ); -pub fn modules(cfg: &mut server::web::ServiceConfig) { +pub fn modules(cfg: &mut app::web::ServiceConfig) { for m in MODULES.read().unwrap().iter() { m.configure_module(cfg); } @@ -54,6 +53,6 @@ pub fn run_migrations() { migrations } } - Migrator::up(&server::db::DBCONN, None) + Migrator::up(&app::db::DBCONN, None) }).unwrap(); } diff --git a/pagetop/src/core/server/app.rs b/pagetop/src/app/application.rs similarity index 73% rename from pagetop/src/core/server/app.rs rename to pagetop/src/app/application.rs index 74e1690d..12af039c 100644 --- a/pagetop/src/core/server/app.rs +++ b/pagetop/src/app/application.rs @@ -1,14 +1,13 @@ -use crate::{Lazy, base, trace}; +use crate::{Lazy, all, app, trace}; use crate::config::SETTINGS; -use crate::core::{Server, all, server}; -use crate::core::theme::register_theme; -use crate::core::module::register_module; +use crate::theme::*; +use crate::module::*; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; pub struct Application { - server: Server, + server: app::Server, } pub fn essence() { @@ -44,25 +43,19 @@ impl Application { } // Inicia registro de trazas y eventos. - Lazy::force(&server::tracing::TRACING); + Lazy::force(&app::tracing::TRACING); // Valida el identificador de idioma. - Lazy::force(&server::locale::LANGID); + Lazy::force(&app::locale::LANGID); // Conecta con la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - Lazy::force(&server::db::DBCONN); + Lazy::force(&app::db::DBCONN); // Registra los temas predefinidos. - register_theme(&base::theme::aliner::AlinerTheme); - register_theme(&base::theme::minimal::MinimalTheme); - register_theme(&base::theme::bootsier::BootsierTheme); - - // Registra los módulos predeterminados. - register_module(&base::module::admin::AdminModule); - // Registra los módulos que requieren base de datos. - #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - register_module(&base::module::user::UserModule); + register_theme(&aliner::AlinerTheme); + register_theme(&minimal::MinimalTheme); + register_theme(&bootsier::BootsierTheme); // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); @@ -70,15 +63,15 @@ impl Application { // Registra el módulo para la página de inicio de PageTop. // Al ser el último, puede sobrecargarse con la función de inicio. - register_module(&base::module::homepage::HomepageModule); + register_module(&homepage::HomepageModule); // Comprueba actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] all::run_migrations(); // Prepara el servidor web. - let server = server::HttpServer::new(move || { - server::App::new() + let server = app::HttpServer::new(move || { + app::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) .configure(&all::themes) @@ -93,7 +86,7 @@ impl Application { Ok(Self { server }) } - pub fn run(self) -> Result<Server, Error> { + pub fn run(self) -> Result<app::Server, Error> { Ok(self.server) } } diff --git a/pagetop/src/core/server/db.rs b/pagetop/src/app/db.rs similarity index 100% rename from pagetop/src/core/server/db.rs rename to pagetop/src/app/db.rs diff --git a/pagetop/src/core/server/figfonts/slant.flf b/pagetop/src/app/figfonts/slant.flf similarity index 100% rename from pagetop/src/core/server/figfonts/slant.flf rename to pagetop/src/app/figfonts/slant.flf diff --git a/pagetop/src/core/server/figfonts/small.flf b/pagetop/src/app/figfonts/small.flf similarity index 100% rename from pagetop/src/core/server/figfonts/small.flf rename to pagetop/src/app/figfonts/small.flf diff --git a/pagetop/src/core/server/figfonts/speed.flf b/pagetop/src/app/figfonts/speed.flf similarity index 100% rename from pagetop/src/core/server/figfonts/speed.flf rename to pagetop/src/app/figfonts/speed.flf diff --git a/pagetop/src/core/server/figfonts/starwars.flf b/pagetop/src/app/figfonts/starwars.flf similarity index 100% rename from pagetop/src/core/server/figfonts/starwars.flf rename to pagetop/src/app/figfonts/starwars.flf diff --git a/pagetop/src/core/server/locale.rs b/pagetop/src/app/locale.rs similarity index 100% rename from pagetop/src/core/server/locale.rs rename to pagetop/src/app/locale.rs diff --git a/pagetop/src/core/server/mod.rs b/pagetop/src/app/mod.rs similarity index 81% rename from pagetop/src/core/server/mod.rs rename to pagetop/src/app/mod.rs index 394886b4..b3f7cd6a 100644 --- a/pagetop/src/core/server/mod.rs +++ b/pagetop/src/app/mod.rs @@ -1,6 +1,7 @@ pub use actix_web::{ App, HttpRequest, HttpResponse, HttpServer, Responder, Result, http, web }; +use actix_web::dev::Server; mod tracing; @@ -9,4 +10,4 @@ pub mod locale; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; -pub mod app; +pub mod application; diff --git a/pagetop/src/core/server/tracing.rs b/pagetop/src/app/tracing.rs similarity index 100% rename from pagetop/src/core/server/tracing.rs rename to pagetop/src/app/tracing.rs diff --git a/pagetop/src/base/mod.rs b/pagetop/src/base/mod.rs deleted file mode 100644 index f40d2d0e..00000000 --- a/pagetop/src/base/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -//! Temas, Módulos y Componentes base. - -pub mod theme; -pub mod module; -pub mod component; diff --git a/pagetop/src/base/module/admin/mod.rs b/pagetop/src/base/module/admin/mod.rs deleted file mode 100644 index e9b58703..00000000 --- a/pagetop/src/base/module/admin/mod.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::prelude::*; - -localize!("src/base/module/admin/locales"); - -mod summary; - -pub struct AdminModule; - -impl ModuleTrait for AdminModule { - fn name(&self) -> &'static str { - "admin" - } - - fn fullname(&self) -> String { - l("module_fullname") - } - - fn description(&self) -> Option<String> { - Some(l("module_description")) - } - - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service( - server::web::scope("/admin") - .route("", server::web::get().to(summary::summary)) - ); - } -} diff --git a/pagetop/src/base/module/mod.rs b/pagetop/src/base/module/mod.rs deleted file mode 100644 index ab1169b4..00000000 --- a/pagetop/src/base/module/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod admin; -pub mod homepage; - -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub mod user; diff --git a/pagetop/src/base/theme/mod.rs b/pagetop/src/base/theme/mod.rs deleted file mode 100644 index 8794ed17..00000000 --- a/pagetop/src/base/theme/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod aliner; -pub mod minimal; -pub mod bootsier; diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/component/block.rs similarity index 100% rename from pagetop/src/base/component/block.rs rename to pagetop/src/component/block.rs diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/component/chunck.rs similarity index 100% rename from pagetop/src/base/component/chunck.rs rename to pagetop/src/component/chunck.rs diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/component/container.rs similarity index 100% rename from pagetop/src/base/component/container.rs rename to pagetop/src/component/container.rs diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/component/form/button.rs similarity index 100% rename from pagetop/src/base/component/form/button.rs rename to pagetop/src/component/form/button.rs diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/component/form/date.rs similarity index 100% rename from pagetop/src/base/component/form/date.rs rename to pagetop/src/component/form/date.rs diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/component/form/form.rs similarity index 100% rename from pagetop/src/base/component/form/form.rs rename to pagetop/src/component/form/form.rs diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/component/form/hidden.rs similarity index 100% rename from pagetop/src/base/component/form/hidden.rs rename to pagetop/src/component/form/hidden.rs diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/component/form/input.rs similarity index 100% rename from pagetop/src/base/component/form/input.rs rename to pagetop/src/component/form/input.rs diff --git a/pagetop/src/base/component/form/mod.rs b/pagetop/src/component/form/mod.rs similarity index 100% rename from pagetop/src/base/component/form/mod.rs rename to pagetop/src/component/form/mod.rs diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/component/menu.rs similarity index 100% rename from pagetop/src/base/component/menu.rs rename to pagetop/src/component/menu.rs diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/component/mod.rs similarity index 100% rename from pagetop/src/base/component/mod.rs rename to pagetop/src/component/mod.rs diff --git a/pagetop/src/core/mod.rs b/pagetop/src/core/mod.rs deleted file mode 100644 index 8db86b83..00000000 --- a/pagetop/src/core/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub use actix_web::dev::Server; - -mod all; - -pub mod html; -pub mod theme; -pub mod module; -pub mod response; -pub mod server; diff --git a/pagetop/src/core/module/mod.rs b/pagetop/src/core/module/mod.rs deleted file mode 100644 index 2a42352a..00000000 --- a/pagetop/src/core/module/mod.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::core::all; - -mod definition; -pub use definition::ModuleTrait; - -pub fn register_module(m: &'static (dyn ModuleTrait + 'static)) { - all::MODULES.write().unwrap().push(m); -} - -pub fn find_module(name: &str) -> Option<&'static (dyn ModuleTrait + 'static)> { - let modules = all::MODULES.write().unwrap(); - match modules.iter().find(|t| t.name() == name) { - Some(module) => Some(*module), - _ => None, - } -} diff --git a/pagetop/src/core/html.rs b/pagetop/src/html.rs similarity index 100% rename from pagetop/src/core/html.rs rename to pagetop/src/html.rs diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index daf0577d..1ecb2028 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -8,6 +8,8 @@ pub use futures::executor::block_on as run_now; // APIs públicas. // ----------------------------------------------------------------------------- +mod all; // Variables globales privadas. + pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. pub mod locale; // Localización. @@ -15,8 +17,14 @@ pub mod locale; // Localización. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a la base de datos. -pub mod core; // Servidor web y APIs para Temas, Módulos y Respuestas web. -pub mod base; // Temas, Módulos y Componentes base. +pub mod html; // Publicación de código HTML desde el código. +pub mod theme; // API para crear temas y temas predeterminados. +pub mod module; // API para crear módulos con nuevas funcionalidades. +pub mod response; // Tipos de respuestas web. +pub mod app; // Aplicación y servidor web. + +pub mod component; // Componentes base. + pub mod util; // Macros y funciones útiles. pub mod prelude; // Re-exporta recursos comunes. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index a5a136c2..93e9e7e8 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -7,7 +7,7 @@ pub use fluent_templates::fluent_bundle::FluentValue; macro_rules! localize { ( $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; - use $crate::core::server::locale::LANGID; + use $crate::app::locale::LANGID; static_locale! { static LOCALES = { @@ -37,8 +37,8 @@ macro_rules! localize { fn e( key: &str, args: &std::collections::HashMap<String, FluentValue> - ) -> $crate::core::html::PreEscaped<String> { - $crate::core::html::PreEscaped( + ) -> $crate::html::PreEscaped<String> { + $crate::html::PreEscaped( LOCALES.lookup_with_args(&LANGID, key, args) ) } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/module/definition.rs similarity index 56% rename from pagetop/src/core/module/definition.rs rename to pagetop/src/module/definition.rs index c50cace3..ccebe607 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/module/definition.rs @@ -1,20 +1,31 @@ -use crate::core::server; - #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db; +use crate::app; + +use std::any::type_name; /// Los módulos deben implementar este *trait*. pub trait ModuleTrait: Send + Sync { - fn name(&self) -> &'static str; + fn name(&self) -> &'static str { + let name = type_name::<Self>(); + match name.rfind("::") { + Some(position) => &name[(position + 2)..], + None => name + } + } fn fullname(&self) -> String; + fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { + vec![] + } + fn description(&self) -> Option<String> { None } #[allow(unused_variables)] - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { } #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] diff --git a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl b/pagetop/src/module/homepage/locales/en-US/homepage.ftl similarity index 100% rename from pagetop/src/base/module/homepage/locales/en-US/homepage.ftl rename to pagetop/src/module/homepage/locales/en-US/homepage.ftl diff --git a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl b/pagetop/src/module/homepage/locales/es-ES/homepage.ftl similarity index 100% rename from pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl rename to pagetop/src/module/homepage/locales/es-ES/homepage.ftl diff --git a/pagetop/src/base/module/homepage/mod.rs b/pagetop/src/module/homepage/mod.rs similarity index 88% rename from pagetop/src/base/module/homepage/mod.rs rename to pagetop/src/module/homepage/mod.rs index 6b3b9741..c74480b3 100644 --- a/pagetop/src/base/module/homepage/mod.rs +++ b/pagetop/src/module/homepage/mod.rs @@ -1,14 +1,10 @@ use crate::prelude::*; -localize!("src/base/module/homepage/locales"); +localize!("src/module/homepage/locales"); pub struct HomepageModule; impl ModuleTrait for HomepageModule { - fn name(&self) -> &'static str { - "homepage" - } - fn fullname(&self) -> String { l("module_fullname") } @@ -17,12 +13,12 @@ impl ModuleTrait for HomepageModule { Some(l("module_description")) } - fn configure_module(&self, cfg: &mut server::web::ServiceConfig) { - cfg.route("/", server::web::get().to(home)); + fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + cfg.route("/", app::web::get().to(home)); } } -async fn home() -> server::Result<Markup> { +async fn home() -> app::Result<Markup> { Page::prepare() .with_title( l("page_title").as_str() diff --git a/pagetop/src/module/mod.rs b/pagetop/src/module/mod.rs new file mode 100644 index 00000000..cb71dfd2 --- /dev/null +++ b/pagetop/src/module/mod.rs @@ -0,0 +1,17 @@ +use crate::{all, trace}; + +mod definition; +pub use definition::ModuleTrait; + +pub mod homepage; + +pub fn register_module(m: &'static dyn ModuleTrait) { + let mut modules = all::MODULES.write().unwrap(); + match modules.iter().find(|t| t.name() == m.name()) { + None => { + trace::info!("{}", m.name()); + modules.push(m); + }, + Some(_) => {}, + } +} diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 18d160ce..1bfc1817 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -8,13 +8,14 @@ pub use crate::localize; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub use crate::{db, boxed_migration}; -pub use crate::core::html::*; -pub use crate::core::theme::*; -pub use crate::core::module::*; -pub use crate::core::response::page::*; -pub use crate::core::server; -pub use crate::core::server::app::{Application, essence}; +pub use crate::html::*; +pub use crate::theme::*; +pub use crate::module::*; +pub use crate::response::page::*; -pub use crate::base::component::*; +pub use crate::app; +pub use crate::app::application::{Application, essence}; + +pub use crate::component::*; pub use crate::util; diff --git a/pagetop/src/core/response/mod.rs b/pagetop/src/response/mod.rs similarity index 100% rename from pagetop/src/core/response/mod.rs rename to pagetop/src/response/mod.rs diff --git a/pagetop/src/core/response/page/assets.rs b/pagetop/src/response/page/assets.rs similarity index 98% rename from pagetop/src/core/response/page/assets.rs rename to pagetop/src/response/page/assets.rs index 2bd96fc2..9c30d981 100644 --- a/pagetop/src/core/response/page/assets.rs +++ b/pagetop/src/response/page/assets.rs @@ -1,8 +1,7 @@ -use crate::{Lazy, base}; +use crate::{Lazy, all}; use crate::config::SETTINGS; -use crate::core::all; -use crate::core::html::{Markup, PreEscaped, html}; -use crate::core::theme::*; +use crate::html::{Markup, PreEscaped, html}; +use crate::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { for t in all::THEMES.read().unwrap().iter() { @@ -10,7 +9,7 @@ static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { return *t; } } - &base::theme::bootsier::BootsierTheme + &bootsier::BootsierTheme }); // ----------------------------------------------------------------------------- diff --git a/pagetop/src/core/response/page/component.rs b/pagetop/src/response/page/component.rs similarity index 90% rename from pagetop/src/core/response/page/component.rs rename to pagetop/src/response/page/component.rs index 78925468..26151cab 100644 --- a/pagetop/src/core/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -1,5 +1,5 @@ -use crate::core::html::{Markup, html}; -use crate::core::response::page::PageAssets; +use crate::html::{Markup, html}; +use crate::response::page::PageAssets; use downcast_rs::{Downcast, impl_downcast}; diff --git a/pagetop/src/core/response/page/container.rs b/pagetop/src/response/page/container.rs similarity index 86% rename from pagetop/src/core/response/page/container.rs rename to pagetop/src/response/page/container.rs index 4a577b2d..72287560 100644 --- a/pagetop/src/core/response/page/container.rs +++ b/pagetop/src/response/page/container.rs @@ -1,5 +1,5 @@ -use crate::core::html::{Markup, html}; -use crate::core::response::page::{PageAssets, PageComponent, render_component}; +use crate::html::{Markup, html}; +use crate::response::page::{PageAssets, PageComponent, render_component}; use std::sync::Arc; diff --git a/pagetop/src/core/response/page/mod.rs b/pagetop/src/response/page/mod.rs similarity index 100% rename from pagetop/src/core/response/page/mod.rs rename to pagetop/src/response/page/mod.rs diff --git a/pagetop/src/core/response/page/page.rs b/pagetop/src/response/page/page.rs similarity index 96% rename from pagetop/src/core/response/page/page.rs rename to pagetop/src/response/page/page.rs index d47a33f1..58541d22 100644 --- a/pagetop/src/core/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,8 +1,7 @@ -use crate::{Lazy, trace, util}; +use crate::{Lazy, app, trace, util}; use crate::config::SETTINGS; -use crate::core::html::{DOCTYPE, Markup, html}; -use crate::core::response::page::{PageAssets, PageComponent, PageContainer}; -use crate::core::server; +use crate::html::{DOCTYPE, Markup, html}; +use crate::response::page::{PageAssets, PageComponent, PageContainer}; use std::borrow::Cow; use std::sync::RwLock; @@ -164,7 +163,7 @@ impl<'a> Page<'a> { // Page RENDER. - pub fn render(&mut self) -> server::Result<Markup> { + pub fn render(&mut self) -> app::Result<Markup> { // Acciones del tema antes de renderizar la página. self.assets.theme().before_render_page(self); diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/theme/aliner/mod.rs similarity index 90% rename from pagetop/src/base/theme/aliner/mod.rs rename to pagetop/src/theme/aliner/mod.rs index 18df448f..676eb25d 100644 --- a/pagetop/src/base/theme/aliner/mod.rs +++ b/pagetop/src/theme/aliner/mod.rs @@ -13,7 +13,7 @@ impl ThemeTrait for AlinerTheme { "Aliner".to_owned() } - fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( "/aliner", assets() diff --git a/pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl b/pagetop/src/theme/bootsier/locales/en-US/bootsier.ftl similarity index 100% rename from pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl rename to pagetop/src/theme/bootsier/locales/en-US/bootsier.ftl diff --git a/pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl b/pagetop/src/theme/bootsier/locales/es-ES/bootsier.ftl similarity index 100% rename from pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl rename to pagetop/src/theme/bootsier/locales/es-ES/bootsier.ftl diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/theme/bootsier/mod.rs similarity index 88% rename from pagetop/src/base/theme/bootsier/mod.rs rename to pagetop/src/theme/bootsier/mod.rs index 3c4176f0..6fba1615 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/theme/bootsier/mod.rs @@ -2,7 +2,7 @@ use crate::prelude::*; include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); -localize!("src/base/theme/bootsier/locales"); +localize!("src/theme/bootsier/locales"); pub struct BootsierTheme; @@ -15,7 +15,7 @@ impl ThemeTrait for BootsierTheme { "Bootsier".to_owned() } - fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { cfg.service(actix_web_static_files::ResourceFiles::new( "/bootsier", assets() @@ -43,16 +43,16 @@ impl ThemeTrait for BootsierTheme { .add_jquery(); } - fn render_error_page(&self, mut s: server::http::StatusCode) -> server::Result<Markup> { + fn render_error_page(&self, mut s: app::http::StatusCode) -> app::Result<Markup> { let mut description = "e500-description"; let mut message = "e500-description"; match s { - server::http::StatusCode::NOT_FOUND => { + app::http::StatusCode::NOT_FOUND => { description = "e404-description"; message = "e404-message"; }, _ => { - s = server::http::StatusCode::INTERNAL_SERVER_ERROR; + s = app::http::StatusCode::INTERNAL_SERVER_ERROR; } } Page::prepare() diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/theme/definition.rs similarity index 89% rename from pagetop/src/core/theme/definition.rs rename to pagetop/src/theme/definition.rs index eb67ec10..38ad1bfd 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -1,8 +1,8 @@ use crate::config::SETTINGS; -use crate::core::html::{Markup, html}; -use crate::core::response::page::{Page, PageAssets, PageComponent}; -use crate::core::server; -use crate::base::component::Chunck; +use crate::html::{Markup, html}; +use crate::response::page::{Page, PageAssets, PageComponent}; +use crate::app; +use crate::component::Chunck; /// Los temas deben implementar este "trait". pub trait ThemeTrait: Send + Sync { @@ -15,7 +15,7 @@ pub trait ThemeTrait: Send + Sync { } #[allow(unused_variables)] - fn configure_theme(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { } #[allow(unused_variables)] @@ -93,7 +93,7 @@ pub trait ThemeTrait: Send + Sync { */ } - fn render_error_page(&self, s: server::http::StatusCode) -> server::Result<Markup> { + fn render_error_page(&self, s: app::http::StatusCode) -> app::Result<Markup> { Page::prepare() .with_title(format!("Error {}", s.as_str()).as_str()) .add_to("content", Chunck::markup(html! { diff --git a/pagetop/src/base/theme/minimal/mod.rs b/pagetop/src/theme/minimal/mod.rs similarity index 100% rename from pagetop/src/base/theme/minimal/mod.rs rename to pagetop/src/theme/minimal/mod.rs diff --git a/pagetop/src/core/theme/mod.rs b/pagetop/src/theme/mod.rs similarity index 58% rename from pagetop/src/core/theme/mod.rs rename to pagetop/src/theme/mod.rs index e83f4307..9b045708 100644 --- a/pagetop/src/core/theme/mod.rs +++ b/pagetop/src/theme/mod.rs @@ -1,13 +1,17 @@ -use crate::core::all; +use crate::all; mod definition; pub use definition::ThemeTrait; -pub fn register_theme(t: &'static (dyn ThemeTrait + 'static)) { +pub mod aliner; +pub mod minimal; +pub mod bootsier; + +pub fn register_theme(t: &'static dyn ThemeTrait) { all::THEMES.write().unwrap().push(t); } -pub fn find_theme(name: &str) -> Option<&'static (dyn ThemeTrait + 'static)> { +pub fn find_theme(name: &str) -> Option<&'static dyn ThemeTrait> { let themes = all::THEMES.write().unwrap(); match themes.iter().find(|t| t.name() == name) { Some(theme) => Some(*theme), From 3ee5859eae895ece4487d5c9db7cf809a3e2bb9b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 19 Mar 2022 22:52:05 +0100 Subject: [PATCH 034/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/src/app/application.rs | 22 ++--- pagetop/src/{ => base}/component/block.rs | 0 pagetop/src/{ => base}/component/chunck.rs | 0 pagetop/src/{ => base}/component/container.rs | 0 .../src/{ => base}/component/form/button.rs | 0 pagetop/src/{ => base}/component/form/date.rs | 0 pagetop/src/{ => base}/component/form/form.rs | 0 .../src/{ => base}/component/form/hidden.rs | 0 .../src/{ => base}/component/form/input.rs | 0 pagetop/src/{ => base}/component/form/mod.rs | 0 pagetop/src/{ => base}/component/menu.rs | 0 pagetop/src/{ => base}/component/mod.rs | 0 pagetop/src/base/mod.rs | 3 + .../homepage/locales/en-US/homepage.ftl | 0 .../homepage/locales/es-ES/homepage.ftl | 0 pagetop/src/{ => base}/module/homepage/mod.rs | 2 +- pagetop/src/base/module/mod.rs | 1 + pagetop/src/{ => base}/theme/aliner/mod.rs | 0 .../theme/bootsier/locales/en-US/bootsier.ftl | 0 .../theme/bootsier/locales/es-ES/bootsier.ftl | 0 pagetop/src/{ => base}/theme/bootsier/mod.rs | 2 +- pagetop/src/{ => base}/theme/minimal/mod.rs | 0 pagetop/src/base/theme/mod.rs | 3 + pagetop/src/{all.rs => global.rs} | 86 +++++++++++++------ pagetop/src/lib.rs | 9 +- pagetop/src/module/definition.rs | 3 +- pagetop/src/module/mod.rs | 15 +--- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page/assets.rs | 14 +-- pagetop/src/theme/definition.rs | 4 +- pagetop/src/theme/mod.rs | 19 +--- 32 files changed, 94 insertions(+), 93 deletions(-) rename pagetop/src/{ => base}/component/block.rs (100%) rename pagetop/src/{ => base}/component/chunck.rs (100%) rename pagetop/src/{ => base}/component/container.rs (100%) rename pagetop/src/{ => base}/component/form/button.rs (100%) rename pagetop/src/{ => base}/component/form/date.rs (100%) rename pagetop/src/{ => base}/component/form/form.rs (100%) rename pagetop/src/{ => base}/component/form/hidden.rs (100%) rename pagetop/src/{ => base}/component/form/input.rs (100%) rename pagetop/src/{ => base}/component/form/mod.rs (100%) rename pagetop/src/{ => base}/component/menu.rs (100%) rename pagetop/src/{ => base}/component/mod.rs (100%) create mode 100644 pagetop/src/base/mod.rs rename pagetop/src/{ => base}/module/homepage/locales/en-US/homepage.ftl (100%) rename pagetop/src/{ => base}/module/homepage/locales/es-ES/homepage.ftl (100%) rename pagetop/src/{ => base}/module/homepage/mod.rs (97%) create mode 100644 pagetop/src/base/module/mod.rs rename pagetop/src/{ => base}/theme/aliner/mod.rs (100%) rename pagetop/src/{ => base}/theme/bootsier/locales/en-US/bootsier.ftl (100%) rename pagetop/src/{ => base}/theme/bootsier/locales/es-ES/bootsier.ftl (100%) rename pagetop/src/{ => base}/theme/bootsier/mod.rs (98%) rename pagetop/src/{ => base}/theme/minimal/mod.rs (100%) create mode 100644 pagetop/src/base/theme/mod.rs rename pagetop/src/{all.rs => global.rs} (57%) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index a9c7993c..db491819 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 12af039c..274203e6 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,7 +1,6 @@ -use crate::{Lazy, all, app, trace}; +use crate::{Lazy, app, base, global, trace}; use crate::config::SETTINGS; -use crate::theme::*; -use crate::module::*; +use crate::module::register_module; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; @@ -52,30 +51,25 @@ impl Application { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] Lazy::force(&app::db::DBCONN); - // Registra los temas predefinidos. - register_theme(&aliner::AlinerTheme); - register_theme(&minimal::MinimalTheme); - register_theme(&bootsier::BootsierTheme); - // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); let _ = &bootstrap(); - // Registra el módulo para la página de inicio de PageTop. - // Al ser el último, puede sobrecargarse con la función de inicio. - register_module(&homepage::HomepageModule); + // Registra el módulo para una página de presentación de PageTop. + // Normalmente se sobrecargará en la función de inicio. + register_module(&base::module::homepage::HomepageModule); // Comprueba actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - all::run_migrations(); + global::run_migrations(); // Prepara el servidor web. let server = app::HttpServer::new(move || { app::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) - .configure(&all::themes) - .configure(&all::modules) + .configure(&global::themes) + .configure(&global::modules) }) .bind(format!("{}:{}", &SETTINGS.webserver.bind_address, diff --git a/pagetop/src/component/block.rs b/pagetop/src/base/component/block.rs similarity index 100% rename from pagetop/src/component/block.rs rename to pagetop/src/base/component/block.rs diff --git a/pagetop/src/component/chunck.rs b/pagetop/src/base/component/chunck.rs similarity index 100% rename from pagetop/src/component/chunck.rs rename to pagetop/src/base/component/chunck.rs diff --git a/pagetop/src/component/container.rs b/pagetop/src/base/component/container.rs similarity index 100% rename from pagetop/src/component/container.rs rename to pagetop/src/base/component/container.rs diff --git a/pagetop/src/component/form/button.rs b/pagetop/src/base/component/form/button.rs similarity index 100% rename from pagetop/src/component/form/button.rs rename to pagetop/src/base/component/form/button.rs diff --git a/pagetop/src/component/form/date.rs b/pagetop/src/base/component/form/date.rs similarity index 100% rename from pagetop/src/component/form/date.rs rename to pagetop/src/base/component/form/date.rs diff --git a/pagetop/src/component/form/form.rs b/pagetop/src/base/component/form/form.rs similarity index 100% rename from pagetop/src/component/form/form.rs rename to pagetop/src/base/component/form/form.rs diff --git a/pagetop/src/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs similarity index 100% rename from pagetop/src/component/form/hidden.rs rename to pagetop/src/base/component/form/hidden.rs diff --git a/pagetop/src/component/form/input.rs b/pagetop/src/base/component/form/input.rs similarity index 100% rename from pagetop/src/component/form/input.rs rename to pagetop/src/base/component/form/input.rs diff --git a/pagetop/src/component/form/mod.rs b/pagetop/src/base/component/form/mod.rs similarity index 100% rename from pagetop/src/component/form/mod.rs rename to pagetop/src/base/component/form/mod.rs diff --git a/pagetop/src/component/menu.rs b/pagetop/src/base/component/menu.rs similarity index 100% rename from pagetop/src/component/menu.rs rename to pagetop/src/base/component/menu.rs diff --git a/pagetop/src/component/mod.rs b/pagetop/src/base/component/mod.rs similarity index 100% rename from pagetop/src/component/mod.rs rename to pagetop/src/base/component/mod.rs diff --git a/pagetop/src/base/mod.rs b/pagetop/src/base/mod.rs new file mode 100644 index 00000000..6a8ebdf7 --- /dev/null +++ b/pagetop/src/base/mod.rs @@ -0,0 +1,3 @@ +pub mod component; +pub mod module; +pub mod theme; \ No newline at end of file diff --git a/pagetop/src/module/homepage/locales/en-US/homepage.ftl b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl similarity index 100% rename from pagetop/src/module/homepage/locales/en-US/homepage.ftl rename to pagetop/src/base/module/homepage/locales/en-US/homepage.ftl diff --git a/pagetop/src/module/homepage/locales/es-ES/homepage.ftl b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl similarity index 100% rename from pagetop/src/module/homepage/locales/es-ES/homepage.ftl rename to pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl diff --git a/pagetop/src/module/homepage/mod.rs b/pagetop/src/base/module/homepage/mod.rs similarity index 97% rename from pagetop/src/module/homepage/mod.rs rename to pagetop/src/base/module/homepage/mod.rs index c74480b3..bd364534 100644 --- a/pagetop/src/module/homepage/mod.rs +++ b/pagetop/src/base/module/homepage/mod.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -localize!("src/module/homepage/locales"); +localize!("src/base/module/homepage/locales"); pub struct HomepageModule; diff --git a/pagetop/src/base/module/mod.rs b/pagetop/src/base/module/mod.rs new file mode 100644 index 00000000..070e5b82 --- /dev/null +++ b/pagetop/src/base/module/mod.rs @@ -0,0 +1 @@ +pub mod homepage; diff --git a/pagetop/src/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs similarity index 100% rename from pagetop/src/theme/aliner/mod.rs rename to pagetop/src/base/theme/aliner/mod.rs diff --git a/pagetop/src/theme/bootsier/locales/en-US/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl similarity index 100% rename from pagetop/src/theme/bootsier/locales/en-US/bootsier.ftl rename to pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl diff --git a/pagetop/src/theme/bootsier/locales/es-ES/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl similarity index 100% rename from pagetop/src/theme/bootsier/locales/es-ES/bootsier.ftl rename to pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl diff --git a/pagetop/src/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs similarity index 98% rename from pagetop/src/theme/bootsier/mod.rs rename to pagetop/src/base/theme/bootsier/mod.rs index 6fba1615..132dce32 100644 --- a/pagetop/src/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -2,7 +2,7 @@ use crate::prelude::*; include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); -localize!("src/theme/bootsier/locales"); +localize!("src/base/theme/bootsier/locales"); pub struct BootsierTheme; diff --git a/pagetop/src/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal/mod.rs similarity index 100% rename from pagetop/src/theme/minimal/mod.rs rename to pagetop/src/base/theme/minimal/mod.rs diff --git a/pagetop/src/base/theme/mod.rs b/pagetop/src/base/theme/mod.rs new file mode 100644 index 00000000..baccfbd9 --- /dev/null +++ b/pagetop/src/base/theme/mod.rs @@ -0,0 +1,3 @@ +pub mod aliner; +pub mod bootsier; +pub mod minimal; diff --git a/pagetop/src/all.rs b/pagetop/src/global.rs similarity index 57% rename from pagetop/src/all.rs rename to pagetop/src/global.rs index a7134172..34280cf4 100644 --- a/pagetop/src/all.rs +++ b/pagetop/src/global.rs @@ -1,31 +1,11 @@ -use crate::{Lazy, run_now, app}; +use crate::{Lazy, app, base, run_now, trace}; +use crate::config::SETTINGS; use crate::db::migration::*; -use crate::theme::ThemeTrait; -use crate::module::ModuleTrait; +use crate::module::*; +use crate::theme::*; use std::sync::RwLock; -include!(concat!(env!("OUT_DIR"), "/theme.rs")); - -// ----------------------------------------------------------------------------- -// Temas registrados y tema predeterminado. -// ----------------------------------------------------------------------------- - -pub static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new( - || { RwLock::new(Vec::new()) } -); - -pub fn themes(cfg: &mut app::web::ServiceConfig) { - cfg.service(actix_web_static_files::ResourceFiles::new( - "/theme", - assets() - )); - - for t in THEMES.read().unwrap().iter() { - t.configure_theme(cfg); - } -} - // ----------------------------------------------------------------------------- // Módulos registrados. // ----------------------------------------------------------------------------- @@ -34,6 +14,17 @@ pub static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new( || { RwLock::new(Vec::new()) } ); +pub fn register_module(m: &'static dyn ModuleTrait) { + let mut modules = MODULES.write().unwrap(); + match modules.iter().find(|t| t.name() == m.name()) { + None => { + trace::info!("{}", m.name()); + modules.push(m); + }, + Some(_) => {}, + } +} + pub fn modules(cfg: &mut app::web::ServiceConfig) { for m in MODULES.read().unwrap().iter() { m.configure_module(cfg); @@ -56,3 +47,50 @@ pub fn run_migrations() { Migrator::up(&app::db::DBCONN, None) }).unwrap(); } + +// ----------------------------------------------------------------------------- +// Temas registrados y tema predeterminado. +// ----------------------------------------------------------------------------- + +include!(concat!(env!("OUT_DIR"), "/theme.rs")); + +pub static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { + RwLock::new(vec![ + &base::theme::aliner::AlinerTheme, + &base::theme::minimal::MinimalTheme, + &base::theme::bootsier::BootsierTheme, + ]) +}); + +pub static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { + for t in THEMES.read().unwrap().iter() { + if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { + return *t; + } + } + &base::theme::bootsier::BootsierTheme +}); + +pub fn register_theme(t: &'static dyn ThemeTrait) { + THEMES.write().unwrap().push(t); +} + +pub fn theme_by_name(name: &str) -> Option<&'static dyn ThemeTrait> { + let themes = crate::global::THEMES.write().unwrap(); + match themes.iter().find(|t| t.name() == name) { + Some(theme) => Some(*theme), + _ => None, + } +} + +pub fn themes(cfg: &mut app::web::ServiceConfig) { + cfg.service(actix_web_static_files::ResourceFiles::new( + "/theme", + assets() + )); + + for t in THEMES.read().unwrap().iter() { + t.configure_theme(cfg); + } +} + diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 1ecb2028..3efe21aa 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -8,7 +8,7 @@ pub use futures::executor::block_on as run_now; // APIs públicas. // ----------------------------------------------------------------------------- -mod all; // Variables globales privadas. +mod global; // Ref. privadas globales a todos los temas y módulos. pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. @@ -17,14 +17,13 @@ pub mod locale; // Localización. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a la base de datos. -pub mod html; // Publicación de código HTML desde el código. -pub mod theme; // API para crear temas y temas predeterminados. +pub mod html; // Publicación de HTML desde el código. pub mod module; // API para crear módulos con nuevas funcionalidades. +pub mod theme; // API para crear temas y temas predeterminados. pub mod response; // Tipos de respuestas web. pub mod app; // Aplicación y servidor web. -pub mod component; // Componentes base. - +pub mod base; // Componentes, Módulos y Temas base. pub mod util; // Macros y funciones útiles. pub mod prelude; // Re-exporta recursos comunes. diff --git a/pagetop/src/module/definition.rs b/pagetop/src/module/definition.rs index ccebe607..9424fbd8 100644 --- a/pagetop/src/module/definition.rs +++ b/pagetop/src/module/definition.rs @@ -1,6 +1,7 @@ +use crate::app; + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db; -use crate::app; use std::any::type_name; diff --git a/pagetop/src/module/mod.rs b/pagetop/src/module/mod.rs index cb71dfd2..faf51e8b 100644 --- a/pagetop/src/module/mod.rs +++ b/pagetop/src/module/mod.rs @@ -1,17 +1,4 @@ -use crate::{all, trace}; - mod definition; pub use definition::ModuleTrait; -pub mod homepage; - -pub fn register_module(m: &'static dyn ModuleTrait) { - let mut modules = all::MODULES.write().unwrap(); - match modules.iter().find(|t| t.name() == m.name()) { - None => { - trace::info!("{}", m.name()); - modules.push(m); - }, - Some(_) => {}, - } -} +pub use crate::global::register_module; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 1bfc1817..e9b3617c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -16,6 +16,6 @@ pub use crate::response::page::*; pub use crate::app; pub use crate::app::application::{Application, essence}; -pub use crate::component::*; +pub use crate::base::component::*; pub use crate::util; diff --git a/pagetop/src/response/page/assets.rs b/pagetop/src/response/page/assets.rs index 9c30d981..99e42b06 100644 --- a/pagetop/src/response/page/assets.rs +++ b/pagetop/src/response/page/assets.rs @@ -1,17 +1,7 @@ -use crate::{Lazy, all}; -use crate::config::SETTINGS; +use crate::global::DEFAULT_THEME; use crate::html::{Markup, PreEscaped, html}; use crate::theme::*; -static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - for t in all::THEMES.read().unwrap().iter() { - if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { - return *t; - } - } - &bootsier::BootsierTheme -}); - // ----------------------------------------------------------------------------- // Favicon. // ----------------------------------------------------------------------------- @@ -207,7 +197,7 @@ impl PageAssets { } pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = find_theme(theme_name).unwrap_or(*DEFAULT_THEME); + self.theme = theme_by_name(theme_name).unwrap_or(*DEFAULT_THEME); self } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 38ad1bfd..727df347 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -1,8 +1,8 @@ +use crate::app; use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::response::page::{Page, PageAssets, PageComponent}; -use crate::app; -use crate::component::Chunck; +use crate::base::component::Chunck; /// Los temas deben implementar este "trait". pub trait ThemeTrait: Send + Sync { diff --git a/pagetop/src/theme/mod.rs b/pagetop/src/theme/mod.rs index 9b045708..a1d0e4ca 100644 --- a/pagetop/src/theme/mod.rs +++ b/pagetop/src/theme/mod.rs @@ -1,20 +1,5 @@ -use crate::all; - mod definition; pub use definition::ThemeTrait; -pub mod aliner; -pub mod minimal; -pub mod bootsier; - -pub fn register_theme(t: &'static dyn ThemeTrait) { - all::THEMES.write().unwrap().push(t); -} - -pub fn find_theme(name: &str) -> Option<&'static dyn ThemeTrait> { - let themes = all::THEMES.write().unwrap(); - match themes.iter().find(|t| t.name() == name) { - Some(theme) => Some(*theme), - _ => None, - } -} +pub use crate::global::register_theme; +pub use crate::global::theme_by_name; From e3f592b3b0835e758e0aca1e3dcec038d924de09 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Mar 2022 20:48:54 +0100 Subject: [PATCH 035/853] =?UTF-8?q?A=C3=B1ade=20carga=20de=20archivos=20es?= =?UTF-8?q?t=C3=A1ticos=20desde=20directorio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Con el ajuste de configuración "dev.static_files" se puede elegir entre integrar los archivos estáticos en el binario ejecutable (por defecto) o servirlos desde su propio directorio. Esto facilita el desarrollo al no tener que compilar cada vez que se modifican estos archivos. --- config/default.toml | 7 +++++-- drust/Cargo.toml | 2 +- pagetop-admin/Cargo.toml | 6 +++--- pagetop-node/Cargo.toml | 4 ++-- pagetop-user/Cargo.toml | 10 +++------ pagetop-user/src/locales/es-ES/homepage.ftl | 2 +- pagetop/Cargo.toml | 13 ++++++------ pagetop/STARTER.bin.Cargo.toml | 18 +++++++--------- pagetop/STARTER.lib.Cargo.toml | 23 +++++---------------- pagetop/build.rs | 3 --- pagetop/config/settings.default.toml | 8 +++++++ pagetop/src/base/theme/aliner/mod.rs | 5 +---- pagetop/src/base/theme/bootsier/mod.rs | 7 ++----- pagetop/src/config.rs | 11 +++++++++- pagetop/src/global.rs | 7 ++----- pagetop/src/prelude.rs | 7 ++++++- pagetop/src/util.rs | 18 ++++++++++++++++ pagetop/static/aliner/css/styles.css | 13 ++++++++++++ 18 files changed, 93 insertions(+), 71 deletions(-) diff --git a/config/default.toml b/config/default.toml index 33280fbd..5b6982fe 100644 --- a/config/default.toml +++ b/config/default.toml @@ -1,12 +1,12 @@ [app] name = "Drust" description = """\ - A modern Content Management System for sharing the world.\ + A modern web Content Management System to share your world.\ """ -language = "es-ES" #theme = "Aliner" #theme = "Minimal" theme = "Bootsier" +language = "es-ES" [database] db_type = "mysql" @@ -16,3 +16,6 @@ db_pass = "DrU__#3T" [log] tracing = "Info,sqlx::query=Warn" + +[dev] +#static_files = "pagetop/static" diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 88ebabde..7a5412d5 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -7,7 +7,7 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - A modern Content Management System for sharing the world.\ + A modern web Content Management System to share your world.\ """ homepage = "https://suitepro.cillero.es/projects/drust" repository = "https://gitlab.com/manuelcillero/drust" diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 1bff0edd..3dfc6e60 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -7,10 +7,10 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Allows content to be submitted to the site and displayed on pages.\ + ...\ """ -homepage = "https://suitepro.cillero.es/projects/drust" -repository = "https://gitlab.com/manuelcillero/drust" +homepage = "https://suitepro.cillero.es/projects/pagetop" +repository = "https://gitlab.com/manuelcillero/pagetop" [dependencies] pagetop = { path = "../pagetop" } diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 36b43d39..29857822 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -9,8 +9,8 @@ authors = [ description = """\ Allows content to be submitted to the site and displayed on pages.\ """ -homepage = "https://suitepro.cillero.es/projects/drust" -repository = "https://gitlab.com/manuelcillero/drust" +homepage = "https://suitepro.cillero.es/projects/pagetop" +repository = "https://gitlab.com/manuelcillero/pagetop" [dependencies] pagetop = { path = "../pagetop" } diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 37352fe7..59c24cb3 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -9,14 +9,10 @@ authors = [ description = """\ Allows content to be submitted to the site and displayed on pages.\ """ -homepage = "https://suitepro.cillero.es/projects/drust" -repository = "https://gitlab.com/manuelcillero/drust" +homepage = "https://suitepro.cillero.es/projects/pagetop" +repository = "https://gitlab.com/manuelcillero/pagetop" [dependencies] pagetop = { path = "../pagetop" } +sea-orm = { version = "0.6.0" } serde = { version = "1.0", features = ["derive"] } - -[dependencies.sea-orm] -version = "0.6.0" -features = ["debug-print", "macros"] -default-features = false diff --git a/pagetop-user/src/locales/es-ES/homepage.ftl b/pagetop-user/src/locales/es-ES/homepage.ftl index ae9a70e0..f5f6e1bb 100644 --- a/pagetop-user/src/locales/es-ES/homepage.ftl +++ b/pagetop-user/src/locales/es-ES/homepage.ftl @@ -1,5 +1,5 @@ module_fullname = Usuario -module_description = Gestion el registro de usuarios y el sistema de accesos. +module_description = Gestiona el registro de usuarios y el sistema de accesos. username = Nombre de usuario password = Contraseña diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index db491819..4d92b378 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -7,10 +7,8 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - PageTop es un proyecto personal para aprender Rust. Incluye algunos de los \ - crates más estables y populares para desarrollar soluciones web modulares, \ - extensibles y configurables. También es un sistema para la gestión de \ - contenidos web.\ + PageTop is an opinionated framework for using the most stable and popular \ + Rust packages to build modular, extensible and configurable web solutions.\ """ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" @@ -44,6 +42,7 @@ unic-langid = "0.9.0" actix-web = "3.3.3" actix-web-static-files = "3.0.5" +actix-files = "0.4.1" maud = { version = "0.23.0", features = ["actix-web"] } sycamore = { version = "0.7.1", features = ["ssr"] } @@ -62,9 +61,6 @@ features = ["debug-print", "migration"] default-features = false optional = true -[dev-dependencies] -tokio = { version = "1.17.0", features = ["macros", "rt-multi-thread"] } - [features] default = [] mysql = ["sea-orm", "sea-schema", "sea-orm/sqlx-mysql"] @@ -74,5 +70,8 @@ sqlite = ["sea-orm", "sea-schema", "sea-orm/sqlx-sqlite"] [build-dependencies] actix-web-static-files = "3.0.5" +[dev-dependencies] +tokio = { version = "1.17.0", features = ["macros", "rt-multi-thread"] } + [lib] name = "pagetop" diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index d05a17bf..2ee2fd9d 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -8,24 +8,20 @@ edition = "2021" [dependencies.pagetop] path = "../pagetop" -# Opcional. Por defecto se puede usar PageTop sin base de datos. +# PageTop por defecto no requiere base de datos. Hay que habilitarla: features = ["mysql"] # features = ["postgres"] # features = ["sqlite"] -# PageTop puede dar soporte a todas las bases de datos. +# PageTop puede dar soporte a todas las bases de datos: # features = ["mysql", "postgres", "sqlite"] -# Sólo cuando no se usen las características predeterminadas. +# En estos casos hay que deshabilitar las características predeterminadas: default-features = false [dependencies] -# Requerido. actix-web = "3.3.3" -# Opcional. Sólo si se usa la macro html!. +# Opcional. Sólo si se usa la macro html!: maud = { version = "0.23.0" } -# Opcional. Si se requiere serialización de estructuras de datos. +# Opcional. Sólo si se usa base de datos: +sea-orm = { version = "0.6.0" } +# Opcional. Para la serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } - -[dependencies.sea-orm] -version = "0.6.0" -features = ["debug-print", "macros"] -default-features = false diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 97389750..74e74a8a 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -6,24 +6,11 @@ edition = "2021" # Ver más claves y sus definiciones en # https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies.pagetop] -path = "../pagetop" -# Opcional. Por defecto se puede usar PageTop sin base de datos. -features = ["mysql"] -# features = ["postgres"] -# features = ["sqlite"] -# PageTop puede dar soporte a todas las bases de datos. -# features = ["mysql", "postgres", "sqlite"] -# Sólo cuando no se usen las características predeterminadas. -default-features = false - [dependencies] -# Opcional. Sólo si se usa la macro html!. +pagetop = { path = "../pagetop" } +# Opcional. Sólo si se usa la macro html!: maud = { version = "0.23.0" } -# Opcional. Si se requiere serialización de estructuras de datos. +# Opcional. Sólo si se usa base de datos: +sea-orm = { version = "0.6.0" } +# Opcional. Para la serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } - -[dependencies.sea-orm] -version = "0.6.0" -features = ["debug-print", "macros"] -default-features = false diff --git a/pagetop/build.rs b/pagetop/build.rs index 9b252213..bd7e60a0 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -9,7 +9,6 @@ fn main() { Path::new(env::var("OUT_DIR").unwrap().as_str()) .join("theme.rs") ) - .with_generated_fn("assets") .build() .unwrap(); @@ -18,7 +17,6 @@ fn main() { Path::new(env::var("OUT_DIR").unwrap().as_str()) .join("aliner.rs") ) - .with_generated_fn("assets") .build() .unwrap(); @@ -27,7 +25,6 @@ fn main() { Path::new(env::var("OUT_DIR").unwrap().as_str()) .join("bootsier.rs") ) - .with_generated_fn("assets") .build() .unwrap(); } diff --git a/pagetop/config/settings.default.toml b/pagetop/config/settings.default.toml index b9c329cf..8ac7ab2d 100644 --- a/pagetop/config/settings.default.toml +++ b/pagetop/config/settings.default.toml @@ -43,3 +43,11 @@ max_pool_size = 5 # Configuración del servidor web. bind_address = "localhost" bind_port = 8088 + +[dev] +# Los archivos estáticos requeridos por temas y componentes incluidos en PageTop +# se integran de manera predeterminada en el binario ejecutable. Sin embargo, es +# útil servir estos archivos desde su propio directorio durante el desarrollo ya +# que no requiere compilar cada vez que se modifican. En este caso, normalmente, +# basta con indicar el directorio "pagetop/static". +static_files = "" diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs index 676eb25d..07b1470f 100644 --- a/pagetop/src/base/theme/aliner/mod.rs +++ b/pagetop/src/base/theme/aliner/mod.rs @@ -14,10 +14,7 @@ impl ThemeTrait for AlinerTheme { } fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { - cfg.service(actix_web_static_files::ResourceFiles::new( - "/aliner", - assets() - )); + theme_static_files!(cfg, "/aliner"); } fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index 132dce32..dbd31727 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -16,10 +16,7 @@ impl ThemeTrait for BootsierTheme { } fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { - cfg.service(actix_web_static_files::ResourceFiles::new( - "/bootsier", - assets() - )); + theme_static_files!(cfg, "/bootsier"); } fn before_render_page(&self, page: &mut Page) { @@ -61,7 +58,7 @@ impl ThemeTrait for BootsierTheme { div class="jumbotron" { div class="media" { img - src="/bootsier/images/caution.png" + src="/static/bootsier/images/caution.png" class="mr-4" style="width: 20%; max-width: 188px" alt="Caution!"; diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 27dbb275..0a5e322d 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -104,12 +104,18 @@ pub struct Webserver { pub bind_port : u16, } +#[derive(Debug, Deserialize)] +pub struct Dev { + pub static_files : String, +} + #[derive(Debug, Deserialize)] pub struct Settings { pub app : App, pub log : Log, pub database : Database, pub webserver : Webserver, + pub dev : Dev, } config_map!(r#" @@ -144,5 +150,8 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]*, // [webserver] "webserver.bind_address" => "localhost", - "webserver.bind_port" => 8088 + "webserver.bind_port" => 8088, + + // [dev] + "dev.static_files" => "" ); diff --git a/pagetop/src/global.rs b/pagetop/src/global.rs index 34280cf4..1b4c169f 100644 --- a/pagetop/src/global.rs +++ b/pagetop/src/global.rs @@ -1,4 +1,4 @@ -use crate::{Lazy, app, base, run_now, trace}; +use crate::{Lazy, app, base, run_now, theme_static_files, trace}; use crate::config::SETTINGS; use crate::db::migration::*; use crate::module::*; @@ -84,10 +84,7 @@ pub fn theme_by_name(name: &str) -> Option<&'static dyn ThemeTrait> { } pub fn themes(cfg: &mut app::web::ServiceConfig) { - cfg.service(actix_web_static_files::ResourceFiles::new( - "/theme", - assets() - )); + theme_static_files!(cfg, "/theme"); for t in THEMES.read().unwrap().iter() { t.configure_theme(cfg); diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index e9b3617c..7c2e9ef3 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,6 +1,11 @@ //! Re-exporta recursos comunes. -pub use crate::args; +// Macros. +pub use crate::{ + args, + theme_static_files, +}; + pub use crate::config::SETTINGS; pub use crate::trace; pub use crate::localize; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 3fff0a23..c5254618 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -18,6 +18,24 @@ macro_rules! args { }}; } +#[macro_export] +macro_rules! theme_static_files { + ( $cfg:ident, $dir:expr ) => {{ + let static_files = &$crate::config::SETTINGS.dev.static_files; + if static_files.is_empty() { + $cfg.service(actix_web_static_files::ResourceFiles::new( + $dir, + generate() + )); + } else { + $cfg.service(actix_files::Files::new( + $dir, + &[static_files, $dir].join("") + ).show_files_listing()); + } + }}; +} + pub fn valid_id(id: &str) -> Option<String> { let id = id.trim().replace(" ", "_").to_lowercase(); match id.is_empty() { diff --git a/pagetop/static/aliner/css/styles.css b/pagetop/static/aliner/css/styles.css index ffeee7db..1cc2f5dc 100644 --- a/pagetop/static/aliner/css/styles.css +++ b/pagetop/static/aliner/css/styles.css @@ -1,5 +1,16 @@ html { background-color: white; + padding: 1px 3px; +} +body { + padding: 1px 3px; +} +div { + padding: 1px 3px; + margin: 5px; +} +h1, h2, h3, h4,h5, h6, p { + background-color: snow; } * * { outline: 5px solid rgba(255,0,0,.1); @@ -21,7 +32,9 @@ html { background: #faa; border-radius: 3px; font: normal normal 400 10px/1.2 monospace; + vertical-align: middle; padding: 1px 3px; + margin: 0 3px; } *::before { content: "("; From d72e1ccad56221bdafec9568dfb2e443272c7347 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 23 Mar 2022 22:29:07 +0100 Subject: [PATCH 036/853] =?UTF-8?q?Actualiza=20la=20presentaci=C3=B3n=20de?= =?UTF-8?q?l=20r=C3=B3tulo=20de=20arranque?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/STARTER.bin.Cargo.toml | 10 +- pagetop/STARTER.lib.Cargo.toml | 6 +- pagetop/config/settings.default.toml | 4 +- pagetop/src/app/application.rs | 40 ++------ pagetop/src/app/banner/mod.rs | 40 ++++++++ .../src/app/{figfonts => banner}/slant.flf | 0 .../src/app/{figfonts => banner}/small.flf | 0 .../src/app/{figfonts => banner}/speed.flf | 0 .../src/app/{figfonts => banner}/starwars.flf | 0 pagetop/src/app/mod.rs | 2 + pagetop/src/config.rs | 2 +- pagetop/src/global.rs | 93 ------------------- pagetop/src/lib.rs | 2 - pagetop/src/module/all.rs | 44 +++++++++ pagetop/src/module/mod.rs | 3 +- pagetop/src/response/page/assets.rs | 10 +- pagetop/src/theme/all.rs | 43 +++++++++ pagetop/src/theme/mod.rs | 7 +- 18 files changed, 164 insertions(+), 142 deletions(-) create mode 100644 pagetop/src/app/banner/mod.rs rename pagetop/src/app/{figfonts => banner}/slant.flf (100%) rename pagetop/src/app/{figfonts => banner}/small.flf (100%) rename pagetop/src/app/{figfonts => banner}/speed.flf (100%) rename pagetop/src/app/{figfonts => banner}/starwars.flf (100%) delete mode 100644 pagetop/src/global.rs create mode 100644 pagetop/src/module/all.rs create mode 100644 pagetop/src/theme/all.rs diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index 2ee2fd9d..9c6c8979 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -8,20 +8,20 @@ edition = "2021" [dependencies.pagetop] path = "../pagetop" -# PageTop por defecto no requiere base de datos. Hay que habilitarla: +# Si se usa base de datos: features = ["mysql"] # features = ["postgres"] # features = ["sqlite"] -# PageTop puede dar soporte a todas las bases de datos: +# Soporte alternativo a todas las bases de datos: # features = ["mysql", "postgres", "sqlite"] # En estos casos hay que deshabilitar las características predeterminadas: default-features = false [dependencies] actix-web = "3.3.3" -# Opcional. Sólo si se usa la macro html!: +# Si se usa la macro html!: maud = { version = "0.23.0" } -# Opcional. Sólo si se usa base de datos: +# Si se usa base de datos: sea-orm = { version = "0.6.0" } -# Opcional. Para la serialización de estructuras de datos: +# Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 74e74a8a..e98fed13 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -8,9 +8,9 @@ edition = "2021" [dependencies] pagetop = { path = "../pagetop" } -# Opcional. Sólo si se usa la macro html!: +# Si se usa la macro html!: maud = { version = "0.23.0" } -# Opcional. Sólo si se usa base de datos: +# Si se usa base de datos: sea-orm = { version = "0.6.0" } -# Opcional. Para la serialización de estructuras de datos: +# Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/config/settings.default.toml b/pagetop/config/settings.default.toml index 8ac7ab2d..115b4cb7 100644 --- a/pagetop/config/settings.default.toml +++ b/pagetop/config/settings.default.toml @@ -8,7 +8,7 @@ language = "en-US" # Dirección predeterminada para el texto: "ltr", "rtl" o "auto". direction = "ltr" # Rótulo al inicio: "Off", "Slant", "Small", "Speed" o "Starwars". -startup_banner = "Small" +startup_banner = "Slant" [log] # Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". @@ -25,7 +25,7 @@ format = "Full" [database] # Conecta con una base de datos (opcional). -# Tipo de la base de datos (mysql, postgres ó sqlite). +# Tipo de base de datos (mysql, postgres ó sqlite). db_type = "" # Nombre (para mysql/postgres) o referencia (para sqlite) de la base de datos. db_name = "" diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 274203e6..4ed2c1da 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,6 +1,5 @@ -use crate::{Lazy, app, base, global, trace}; +use crate::{Lazy, app, base, module, theme, trace}; use crate::config::SETTINGS; -use crate::module::register_module; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; @@ -15,31 +14,8 @@ pub fn essence() { impl Application { pub async fn prepare(bootstrap: fn()) -> Result<Self, Error> { - // Imprime un rótulo de presentación (opcional). - if SETTINGS.app.startup_banner.to_lowercase() != "off" { - let figfont = figlet_rs::FIGfont::from_content( - match SETTINGS.app.startup_banner.to_lowercase().as_str() { - "slant" => include_str!("figfonts/slant.flf"), - "small" => include_str!("figfonts/small.flf"), - "speed" => include_str!("figfonts/speed.flf"), - "starwars" => include_str!("figfonts/starwars.flf"), - _ => { - println!( - "FIGfont \"{}\" not found for banner. {}. {}.", - SETTINGS.app.startup_banner, - "Using \"Small\"", - "Check the settings file", - ); - include_str!("figfonts/small.flf") - } - } - ).unwrap(); - println!("\n{} {}\n\n Powered by PageTop {}\n", - figfont.convert(&SETTINGS.app.name).unwrap(), - &SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - } + // Rótulo de presentación. + app::banner::print_on_startup(); // Inicia registro de trazas y eventos. Lazy::force(&app::tracing::TRACING); @@ -57,19 +33,19 @@ impl Application { // Registra el módulo para una página de presentación de PageTop. // Normalmente se sobrecargará en la función de inicio. - register_module(&base::module::homepage::HomepageModule); + module::register_module(&base::module::homepage::HomepageModule); - // Comprueba actualizaciones pendientes de la base de datos (opcional). + // Actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - global::run_migrations(); + module::all::migrations(); // Prepara el servidor web. let server = app::HttpServer::new(move || { app::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) - .configure(&global::themes) - .configure(&global::modules) + .configure(&module::all::modules) + .configure(&theme::all::themes) }) .bind(format!("{}:{}", &SETTINGS.webserver.bind_address, diff --git a/pagetop/src/app/banner/mod.rs b/pagetop/src/app/banner/mod.rs new file mode 100644 index 00000000..f6d63841 --- /dev/null +++ b/pagetop/src/app/banner/mod.rs @@ -0,0 +1,40 @@ +use crate::Lazy; +use crate::config::SETTINGS; + +use figlet_rs::FIGfont; + +static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { + let slant = include_str!("slant.flf"); + let small = include_str!("small.flf"); + let speed = include_str!("speed.flf"); + let starwars = include_str!("starwars.flf"); + + FIGfont::from_content( + match SETTINGS.app.startup_banner.to_lowercase().as_str() { + "off" => slant, + "slant" => slant, + "small" => small, + "speed" => speed, + "starwars" => starwars, + _ => { + println!( + "\n FIGfont \"{}\" not found for banner. {}. {}.", + SETTINGS.app.startup_banner, + "Using \"Slant\"", + "Check the settings file", + ); + slant + } + } + ).unwrap() +}); + +pub fn print_on_startup() { + if SETTINGS.app.startup_banner.to_lowercase() != "off" { + println!("\n{} {}\n\n Powered by PageTop {}\n", + FIGFONT.convert(&SETTINGS.app.name).unwrap(), + &SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + } +} diff --git a/pagetop/src/app/figfonts/slant.flf b/pagetop/src/app/banner/slant.flf similarity index 100% rename from pagetop/src/app/figfonts/slant.flf rename to pagetop/src/app/banner/slant.flf diff --git a/pagetop/src/app/figfonts/small.flf b/pagetop/src/app/banner/small.flf similarity index 100% rename from pagetop/src/app/figfonts/small.flf rename to pagetop/src/app/banner/small.flf diff --git a/pagetop/src/app/figfonts/speed.flf b/pagetop/src/app/banner/speed.flf similarity index 100% rename from pagetop/src/app/figfonts/speed.flf rename to pagetop/src/app/banner/speed.flf diff --git a/pagetop/src/app/figfonts/starwars.flf b/pagetop/src/app/banner/starwars.flf similarity index 100% rename from pagetop/src/app/figfonts/starwars.flf rename to pagetop/src/app/banner/starwars.flf diff --git a/pagetop/src/app/mod.rs b/pagetop/src/app/mod.rs index b3f7cd6a..07404f64 100644 --- a/pagetop/src/app/mod.rs +++ b/pagetop/src/app/mod.rs @@ -3,6 +3,8 @@ pub use actix_web::{ }; use actix_web::dev::Server; +mod banner; + mod tracing; pub mod locale; diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 0a5e322d..775cc4a6 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -130,7 +130,7 @@ Ajustes globales y valores predeterminados para las secciones *\[app\]*, "app.theme" => "Bootsier", "app.language" => "en-US", "app.direction" => "ltr", - "app.startup_banner" => "Small", + "app.startup_banner" => "Slant", // [log] "log.tracing" => "Info", diff --git a/pagetop/src/global.rs b/pagetop/src/global.rs deleted file mode 100644 index 1b4c169f..00000000 --- a/pagetop/src/global.rs +++ /dev/null @@ -1,93 +0,0 @@ -use crate::{Lazy, app, base, run_now, theme_static_files, trace}; -use crate::config::SETTINGS; -use crate::db::migration::*; -use crate::module::*; -use crate::theme::*; - -use std::sync::RwLock; - -// ----------------------------------------------------------------------------- -// Módulos registrados. -// ----------------------------------------------------------------------------- - -pub static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new( - || { RwLock::new(Vec::new()) } -); - -pub fn register_module(m: &'static dyn ModuleTrait) { - let mut modules = MODULES.write().unwrap(); - match modules.iter().find(|t| t.name() == m.name()) { - None => { - trace::info!("{}", m.name()); - modules.push(m); - }, - Some(_) => {}, - } -} - -pub fn modules(cfg: &mut app::web::ServiceConfig) { - for m in MODULES.read().unwrap().iter() { - m.configure_module(cfg); - } -} - -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub fn run_migrations() { - run_now({ - struct Migrator; - impl MigratorTrait for Migrator { - fn migrations() -> Vec<Box<dyn MigrationTrait>> { - let mut migrations = vec![]; - for m in MODULES.read().unwrap().iter() { - migrations.append(&mut m.migrations()); - } - migrations - } - } - Migrator::up(&app::db::DBCONN, None) - }).unwrap(); -} - -// ----------------------------------------------------------------------------- -// Temas registrados y tema predeterminado. -// ----------------------------------------------------------------------------- - -include!(concat!(env!("OUT_DIR"), "/theme.rs")); - -pub static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { - RwLock::new(vec![ - &base::theme::aliner::AlinerTheme, - &base::theme::minimal::MinimalTheme, - &base::theme::bootsier::BootsierTheme, - ]) -}); - -pub static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - for t in THEMES.read().unwrap().iter() { - if t.name().to_lowercase() == SETTINGS.app.theme.to_lowercase() { - return *t; - } - } - &base::theme::bootsier::BootsierTheme -}); - -pub fn register_theme(t: &'static dyn ThemeTrait) { - THEMES.write().unwrap().push(t); -} - -pub fn theme_by_name(name: &str) -> Option<&'static dyn ThemeTrait> { - let themes = crate::global::THEMES.write().unwrap(); - match themes.iter().find(|t| t.name() == name) { - Some(theme) => Some(*theme), - _ => None, - } -} - -pub fn themes(cfg: &mut app::web::ServiceConfig) { - theme_static_files!(cfg, "/theme"); - - for t in THEMES.read().unwrap().iter() { - t.configure_theme(cfg); - } -} - diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 3efe21aa..73e17c8d 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -8,8 +8,6 @@ pub use futures::executor::block_on as run_now; // APIs públicas. // ----------------------------------------------------------------------------- -mod global; // Ref. privadas globales a todos los temas y módulos. - pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. pub mod locale; // Localización. diff --git a/pagetop/src/module/all.rs b/pagetop/src/module/all.rs new file mode 100644 index 00000000..120c59b6 --- /dev/null +++ b/pagetop/src/module/all.rs @@ -0,0 +1,44 @@ +use crate::{Lazy, app, run_now, trace}; +use crate::db::migration::*; +use super::ModuleTrait; + +use std::sync::RwLock; + +// Módulos registrados. +static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { + RwLock::new(Vec::new()) +}); + +pub fn register_module(module: &'static dyn ModuleTrait) { + let mut modules = MODULES.write().unwrap(); + match modules.iter().find(|m| m.name() == module.name()) { + None => { + trace::info!("{}", module.name()); + modules.push(module); + }, + Some(_) => {}, + } +} + +pub fn modules(cfg: &mut app::web::ServiceConfig) { + for m in MODULES.read().unwrap().iter() { + m.configure_module(cfg); + } +} + +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +pub fn migrations() { + run_now({ + struct Migrator; + impl MigratorTrait for Migrator { + fn migrations() -> Vec<Box<dyn MigrationTrait>> { + let mut migrations = vec![]; + for m in MODULES.read().unwrap().iter() { + migrations.append(&mut m.migrations()); + } + migrations + } + } + Migrator::up(&app::db::DBCONN, None) + }).unwrap(); +} diff --git a/pagetop/src/module/mod.rs b/pagetop/src/module/mod.rs index faf51e8b..a767683b 100644 --- a/pagetop/src/module/mod.rs +++ b/pagetop/src/module/mod.rs @@ -1,4 +1,5 @@ mod definition; pub use definition::ModuleTrait; -pub use crate::global::register_module; +pub(crate) mod all; +pub use all::register_module; \ No newline at end of file diff --git a/pagetop/src/response/page/assets.rs b/pagetop/src/response/page/assets.rs index 99e42b06..ffc566ea 100644 --- a/pagetop/src/response/page/assets.rs +++ b/pagetop/src/response/page/assets.rs @@ -1,7 +1,15 @@ -use crate::global::DEFAULT_THEME; +use crate::{Lazy, base}; +use crate::config::SETTINGS; use crate::html::{Markup, PreEscaped, html}; use crate::theme::*; +static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { + match theme_by_name(&SETTINGS.app.theme) { + Some(theme) => theme, + None => &base::theme::bootsier::BootsierTheme, + } +}); + // ----------------------------------------------------------------------------- // Favicon. // ----------------------------------------------------------------------------- diff --git a/pagetop/src/theme/all.rs b/pagetop/src/theme/all.rs new file mode 100644 index 00000000..cc25d9d8 --- /dev/null +++ b/pagetop/src/theme/all.rs @@ -0,0 +1,43 @@ +use crate::{Lazy, app, base, theme_static_files, trace}; +use super::ThemeTrait; + +use std::sync::RwLock; + +include!(concat!(env!("OUT_DIR"), "/theme.rs")); + +// Temas registrados. +static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { + RwLock::new(vec![ + &base::theme::aliner::AlinerTheme, + &base::theme::minimal::MinimalTheme, + &base::theme::bootsier::BootsierTheme, + ]) +}); + +pub fn register_theme(theme: &'static dyn ThemeTrait) { + let mut themes = THEMES.write().unwrap(); + match themes.iter().find(|t| t.name() == theme.name()) { + None => { + trace::info!("{}", theme.name()); + themes.push(theme); + }, + Some(_) => {}, + } +} + +pub fn theme_by_name(name: &str) -> Option<&'static dyn ThemeTrait> { + match THEMES.write().unwrap().iter().find( + |t| t.name().to_lowercase() == name.to_lowercase() + ) { + Some(theme) => Some(*theme), + _ => None, + } +} + +pub fn themes(cfg: &mut app::web::ServiceConfig) { + theme_static_files!(cfg, "/theme"); + + for t in THEMES.read().unwrap().iter() { + t.configure_theme(cfg); + } +} diff --git a/pagetop/src/theme/mod.rs b/pagetop/src/theme/mod.rs index a1d0e4ca..4456189e 100644 --- a/pagetop/src/theme/mod.rs +++ b/pagetop/src/theme/mod.rs @@ -1,5 +1,8 @@ mod definition; pub use definition::ThemeTrait; -pub use crate::global::register_theme; -pub use crate::global::theme_by_name; +pub(crate) mod all; +pub use all::{ + register_theme, + theme_by_name, +}; From 5b1064fda2a4ffd6f7bbdbc87b98d2a0b2a4762c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 25 Mar 2022 20:24:19 +0100 Subject: [PATCH 037/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 11 ++++++-- config/default.toml | 2 +- pagetop-admin/src/lib.rs | 4 +++ pagetop-node/src/lib.rs | 4 +++ pagetop-user/src/lib.rs | 4 +++ pagetop/Cargo.toml | 2 +- pagetop/src/app/application.rs | 9 +++++-- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 8 +++--- pagetop/src/base/component/form/form.rs | 4 +-- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 8 +++--- .../locales/en-US/demopage.ftl} | 2 +- .../locales/es-ES/demopage.ftl} | 2 +- .../base/module/{homepage => demopage}/mod.rs | 14 +++++++--- pagetop/src/base/module/mod.rs | 2 +- pagetop/src/base/theme/aliner/mod.rs | 6 ++++- pagetop/src/base/theme/bootsier/mod.rs | 4 +-- pagetop/src/base/theme/minimal/mod.rs | 2 +- pagetop/src/module/all.rs | 25 +++++++++++++----- pagetop/src/module/definition.rs | 10 +------ pagetop/src/response/page/page.rs | 6 ++--- pagetop/src/theme/all.rs | 17 ++++-------- pagetop/src/theme/definition.rs | 7 ++++- pagetop/src/util.rs | 12 ++++----- pagetop/static/theme/favicon.png | Bin 0 -> 11471 bytes 27 files changed, 104 insertions(+), 67 deletions(-) rename pagetop/src/base/module/{homepage/locales/en-US/homepage.ftl => demopage/locales/en-US/demopage.ftl} (95%) rename pagetop/src/base/module/{homepage/locales/es-ES/homepage.ftl => demopage/locales/es-ES/demopage.ftl} (93%) rename pagetop/src/base/module/{homepage => demopage}/mod.rs (91%) create mode 100644 pagetop/static/theme/favicon.png diff --git a/CREDITS.md b/CREDITS.md index 5b9979f4..4254ed59 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,9 +1,9 @@ # FIGfonts PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de -*yuanbohan*, que muestra al inicio de la ejecución un rótulo con el nombre de +*yuanbohan*. Muestra en el terminal un rótulo de presentación con el nombre de la aplicación usando caracteres [FIGlet](http://www.figlet.org/). Las fuentes -incluidas en `resources` son: +incluidas en `src/app/banner` son: * [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) por *Glenn Chappell*. @@ -13,3 +13,10 @@ incluidas en `resources` son: por *Claude Martins*. * [starwars.flf](http://www.figlet.org/fontdb_example.cgi?font=starwars.flf) por *Ryan Youck*. + +# Icono + +El monstruo sonriente de Frankenstein es una divertida creación de +[Webalys](https://www.iconfinder.com/webalys). Puede encontrarse en su colección +[Nasty Icons](https://www.iconfinder.com/iconsets/nasty) disponible en +[ICONFINDER](https://www.iconfinder.com/). \ No newline at end of file diff --git a/config/default.toml b/config/default.toml index 5b6982fe..13012a93 100644 --- a/config/default.toml +++ b/config/default.toml @@ -15,7 +15,7 @@ db_user = "drust" db_pass = "DrU__#3T" [log] -tracing = "Info,sqlx::query=Warn" +tracing = "Info,pagetop=Debug,sqlx::query=Warn" [dev] #static_files = "pagetop/static" diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index e3ad0337..a00e7fae 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -7,6 +7,10 @@ mod summary; pub struct AdminModule; impl ModuleTrait for AdminModule { + fn name(&self) -> &'static str { + "Admin" + } + fn fullname(&self) -> String { l("module_fullname") } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index af6d8b3f..afcd729f 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -8,6 +8,10 @@ mod migration; pub struct NodeModule; impl ModuleTrait for NodeModule { + fn name(&self) -> &'static str { + "Node" + } + fn fullname(&self) -> String { l("module_fullname") } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index c76233e1..343daa7a 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -8,6 +8,10 @@ mod migration; pub struct UserModule; impl ModuleTrait for UserModule { + fn name(&self) -> &'static str { + "User" + } + fn fullname(&self) -> String { l("module_fullname") } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 4d92b378..a260d17f 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 4ed2c1da..070390c8 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -27,13 +27,18 @@ impl Application { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] Lazy::force(&app::db::DBCONN); + // Registra los temas predeterminados. + theme::register_theme(&base::theme::aliner::AlinerTheme); + theme::register_theme(&base::theme::minimal::MinimalTheme); + theme::register_theme(&base::theme::bootsier::BootsierTheme); + // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); let _ = &bootstrap(); - // Registra el módulo para una página de presentación de PageTop. + // Registra el módulo de presentación de PageTop. // Normalmente se sobrecargará en la función de inicio. - module::register_module(&base::module::homepage::HomepageModule); + module::register_module(&base::module::demopage::DemopageModule); // Actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 4f658c9e..96fce677 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -71,7 +71,7 @@ impl Block { } pub fn with_title(mut self, title: &str) -> Self { - self.title = util::optional_str(title); + self.title = util::valid_str(title); self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index c76c49dd..57810fea 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -101,7 +101,7 @@ impl Button { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_str(value); + self.value = util::valid_str(value); self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index ccc6ab31..6614670a 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -112,17 +112,17 @@ impl Date { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_str(value); + self.value = util::valid_str(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label = util::optional_str(label); + self.label = util::valid_str(label); self } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = util::optional_str(placeholder); + self.placeholder = util::valid_str(placeholder); self } @@ -167,7 +167,7 @@ impl Date { } pub fn with_help_text(mut self, help_text: &str) -> Self { - self.help_text = util::optional_str(help_text); + self.help_text = util::valid_str(help_text); self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 63eace0c..2fac4403 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -76,7 +76,7 @@ impl Form { } pub fn with_action(mut self, action: &str) -> Self { - self.action = util::optional_str(action); + self.action = util::valid_str(action); self } @@ -86,7 +86,7 @@ impl Form { } pub fn with_charset(mut self, charset: &str) -> Self { - self.charset = util::optional_str(charset); + self.charset = util::valid_str(charset); self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 9ac0a4f9..bd158b85 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -54,7 +54,7 @@ impl Hidden { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_str(value); + self.value = util::valid_str(value); self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 884d2232..f0e73a63 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -167,12 +167,12 @@ impl Input { } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::optional_str(value); + self.value = util::valid_str(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label = util::optional_str(label); + self.label = util::valid_str(label); self } @@ -192,7 +192,7 @@ impl Input { } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = util::optional_str(placeholder); + self.placeholder = util::valid_str(placeholder); self } @@ -237,7 +237,7 @@ impl Input { } pub fn with_help_text(mut self, help_text: &str) -> Self { - self.help_text = util::optional_str(help_text); + self.help_text = util::valid_str(help_text); self } diff --git a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl similarity index 95% rename from pagetop/src/base/module/homepage/locales/en-US/homepage.ftl rename to pagetop/src/base/module/demopage/locales/en-US/demopage.ftl index 39a5e426..14c93f2f 100644 --- a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl +++ b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl @@ -1,5 +1,5 @@ module_fullname = Default homepage -module_description = Displays a default homepage when none is configured. +module_description = Displays a demo homepage when none is configured. page_title = Hello world! diff --git a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl similarity index 93% rename from pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl rename to pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl index f1d85b2e..39720fcd 100644 --- a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl +++ b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl @@ -1,5 +1,5 @@ module_fullname = Página de inicio predeterminada -module_description = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. +module_description = Muestra una página de demostración predeterminada cuando no hay ninguna configurada. page_title = ¡Hola mundo! diff --git a/pagetop/src/base/module/homepage/mod.rs b/pagetop/src/base/module/demopage/mod.rs similarity index 91% rename from pagetop/src/base/module/homepage/mod.rs rename to pagetop/src/base/module/demopage/mod.rs index bd364534..bb6e3b94 100644 --- a/pagetop/src/base/module/homepage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -1,10 +1,14 @@ use crate::prelude::*; -localize!("src/base/module/homepage/locales"); +localize!("src/base/module/demopage/locales"); -pub struct HomepageModule; +pub struct DemopageModule; + +impl ModuleTrait for DemopageModule { + fn name(&self) -> &'static str { + "Demopage" + } -impl ModuleTrait for HomepageModule { fn fullname(&self) -> String { l("module_fullname") } @@ -20,9 +24,13 @@ impl ModuleTrait for HomepageModule { async fn home() -> app::Result<Markup> { Page::prepare() + .using_theme("Bootsier") .with_title( l("page_title").as_str() ) + + + .add_to("content", Container::prepare() .with_id("welcome") .add(Chunck::markup(html! { diff --git a/pagetop/src/base/module/mod.rs b/pagetop/src/base/module/mod.rs index 070e5b82..7107d180 100644 --- a/pagetop/src/base/module/mod.rs +++ b/pagetop/src/base/module/mod.rs @@ -1 +1 @@ -pub mod homepage; +pub mod demopage; diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs index 07b1470f..d4f4f252 100644 --- a/pagetop/src/base/theme/aliner/mod.rs +++ b/pagetop/src/base/theme/aliner/mod.rs @@ -6,7 +6,7 @@ pub struct AlinerTheme; impl ThemeTrait for AlinerTheme { fn name(&self) -> &'static str { - "aliner" + "Aliner" } fn fullname(&self) -> String { @@ -19,6 +19,10 @@ impl ThemeTrait for AlinerTheme { fn before_render_page(&self, page: &mut Page) { page.assets() + .with_favicon( + Favicon::new() + .with_icon("/theme/favicon.png") + ) .add_stylesheet( StyleSheet::source( "/aliner/css/styles.css" diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index dbd31727..ada65b0e 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -8,7 +8,7 @@ pub struct BootsierTheme; impl ThemeTrait for BootsierTheme { fn name(&self) -> &'static str { - "bootsier" + "Bootsier" } fn fullname(&self) -> String { @@ -23,7 +23,7 @@ impl ThemeTrait for BootsierTheme { page.assets() .with_favicon( Favicon::new() - .with_icon("/bootsier/favicon.png") + .with_icon("/theme/favicon.png") ) .add_stylesheet( StyleSheet::source( diff --git a/pagetop/src/base/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal/mod.rs index b3a50906..471b3738 100644 --- a/pagetop/src/base/theme/minimal/mod.rs +++ b/pagetop/src/base/theme/minimal/mod.rs @@ -4,7 +4,7 @@ pub struct MinimalTheme; impl ThemeTrait for MinimalTheme { fn name(&self) -> &'static str { - "minimal" + "Minimal" } fn fullname(&self) -> String { diff --git a/pagetop/src/module/all.rs b/pagetop/src/module/all.rs index 120c59b6..c95583e9 100644 --- a/pagetop/src/module/all.rs +++ b/pagetop/src/module/all.rs @@ -10,13 +10,24 @@ static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { }); pub fn register_module(module: &'static dyn ModuleTrait) { - let mut modules = MODULES.write().unwrap(); - match modules.iter().find(|m| m.name() == module.name()) { - None => { - trace::info!("{}", module.name()); - modules.push(module); - }, - Some(_) => {}, + let mut list: Vec<&dyn ModuleTrait> = Vec::new(); + add_to(&mut list, module); + list.reverse(); + MODULES.write().unwrap().append(&mut list); +} + +fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { + if !MODULES.read().unwrap().iter().any(|m| m.name() == module.name()) { + if !list.iter().any(|m| m.name() == module.name()) { + trace::debug!("Registering \"{}\" module", module.name()); + list.push(module); + + let mut dependencies = module.dependencies(); + dependencies.reverse(); + for d in dependencies.iter() { + add_to(list, *d); + } + } } } diff --git a/pagetop/src/module/definition.rs b/pagetop/src/module/definition.rs index 9424fbd8..b01f9801 100644 --- a/pagetop/src/module/definition.rs +++ b/pagetop/src/module/definition.rs @@ -3,17 +3,9 @@ use crate::app; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db; -use std::any::type_name; - /// Los módulos deben implementar este *trait*. pub trait ModuleTrait: Send + Sync { - fn name(&self) -> &'static str { - let name = type_name::<Self>(); - match name.rfind("::") { - Some(position) => &name[(position + 2)..], - None => name - } - } + fn name(&self) -> &'static str; fn fullname(&self) -> String; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 58541d22..eff38daa 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -75,7 +75,7 @@ impl<'a> Page<'a> { // Page BUILDER. pub fn with_language(&mut self, language: &str) -> &mut Self { - self.language = util::optional_str(language); + self.language = util::valid_str(language); self } @@ -89,12 +89,12 @@ impl<'a> Page<'a> { } pub fn with_title(&mut self, title: &str) -> &mut Self { - self.title = util::optional_str(title); + self.title = util::valid_str(title); self } pub fn with_description(&mut self, description: &str) -> &mut Self { - self.description = util::optional_str(description); + self.description = util::valid_str(description); self } diff --git a/pagetop/src/theme/all.rs b/pagetop/src/theme/all.rs index cc25d9d8..ee0bfedb 100644 --- a/pagetop/src/theme/all.rs +++ b/pagetop/src/theme/all.rs @@ -1,4 +1,4 @@ -use crate::{Lazy, app, base, theme_static_files, trace}; +use crate::{Lazy, app, theme_static_files, trace}; use super::ThemeTrait; use std::sync::RwLock; @@ -7,21 +7,14 @@ include!(concat!(env!("OUT_DIR"), "/theme.rs")); // Temas registrados. static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { - RwLock::new(vec![ - &base::theme::aliner::AlinerTheme, - &base::theme::minimal::MinimalTheme, - &base::theme::bootsier::BootsierTheme, - ]) + RwLock::new(Vec::new()) }); pub fn register_theme(theme: &'static dyn ThemeTrait) { let mut themes = THEMES.write().unwrap(); - match themes.iter().find(|t| t.name() == theme.name()) { - None => { - trace::info!("{}", theme.name()); - themes.push(theme); - }, - Some(_) => {}, + if !themes.iter().any(|t| t.name() == theme.name()) { + trace::debug!("Registering \"{}\" theme", theme.name()); + themes.push(theme); } } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 727df347..733736e2 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -1,7 +1,7 @@ use crate::app; use crate::config::SETTINGS; use crate::html::{Markup, html}; -use crate::response::page::{Page, PageAssets, PageComponent}; +use crate::response::page::{Favicon, Page, PageAssets, PageComponent}; use crate::base::component::Chunck; /// Los temas deben implementar este "trait". @@ -20,6 +20,11 @@ pub trait ThemeTrait: Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { + page.assets() + .with_favicon( + Favicon::new() + .with_icon("/theme/favicon.png") + ); } fn render_page_head(&self, page: &mut Page) -> Markup { diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index c5254618..4ba4f76e 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -37,24 +37,24 @@ macro_rules! theme_static_files { } pub fn valid_id(id: &str) -> Option<String> { - let id = id.trim().replace(" ", "_").to_lowercase(); + let id = id.trim(); match id.is_empty() { true => None, - false => Some(id), + false => Some(id.replace(" ", "_").to_lowercase()), } } -pub fn optional_str(s: &str) -> Option<String> { - let s = s.to_owned(); +pub fn valid_str(s: &str) -> Option<String> { + let s = s.trim(); match s.is_empty() { true => None, - false => Some(s), + false => Some(s.to_owned()), } } pub fn assigned_str(optional: &Option<String>) -> &str { match optional { Some(o) => o.as_str(), - _ => "", + None => "", } } diff --git a/pagetop/static/theme/favicon.png b/pagetop/static/theme/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d38ea4a847b5697db4437972cfc28baba5e05e3 GIT binary patch literal 11471 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 literal 0 HcmV?d00001 From c6bbd565ab2399c0988c6cfb4042acca487ee77a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Mar 2022 06:05:37 +0200 Subject: [PATCH 038/853] =?UTF-8?q?A=C3=B1ade=20nuevas=20caracter=C3=ADsti?= =?UTF-8?q?cas=20a=20la=20p=C3=A1gina=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 22 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 6 +- pagetop/src/base/component/block.rs | 41 +-- pagetop/src/base/component/chunck.rs | 18 +- pagetop/src/base/component/container.rs | 81 ++++-- pagetop/src/base/component/form/button.rs | 73 +++-- pagetop/src/base/component/form/date.rs | 155 +++++------ pagetop/src/base/component/form/form.rs | 32 +-- pagetop/src/base/component/form/hidden.rs | 26 +- pagetop/src/base/component/form/input.rs | 167 ++++++------ pagetop/src/base/component/grid/column.rs | 82 ++++++ pagetop/src/base/component/grid/mod.rs | 4 + pagetop/src/base/component/grid/row.rs | 82 ++++++ pagetop/src/base/component/image.rs | 70 +++++ pagetop/src/base/component/menu.rs | 24 +- pagetop/src/base/component/mod.rs | 5 + .../demopage/locales/en-US/demopage.ftl | 28 +- .../demopage/locales/es-ES/demopage.ftl | 28 +- pagetop/src/base/module/demopage/mod.rs | 253 ++++++++++++++---- pagetop/src/base/theme/bootsier/mod.rs | 4 +- pagetop/src/html.rs | 1 - pagetop/src/html/classes.rs | 63 +++++ pagetop/src/html/mod.rs | 8 + pagetop/src/html/optional_attr.rs | 41 +++ pagetop/src/html/optional_id.rs | 33 +++ pagetop/src/response/page/component.rs | 2 +- pagetop/src/response/page/page.rs | 76 +++--- pagetop/src/theme/definition.rs | 4 +- pagetop/src/util.rs | 23 -- .../static/bootsier/images/demo-header.svg | 1 + .../static/bootsier/images/demo-pagetop.svg | 1 + .../static/bootsier/images/demo-visiting.svg | 1 + 33 files changed, 987 insertions(+), 470 deletions(-) create mode 100644 pagetop/src/base/component/grid/column.rs create mode 100644 pagetop/src/base/component/grid/mod.rs create mode 100644 pagetop/src/base/component/grid/row.rs create mode 100644 pagetop/src/base/component/image.rs delete mode 100644 pagetop/src/html.rs create mode 100644 pagetop/src/html/classes.rs create mode 100644 pagetop/src/html/mod.rs create mode 100644 pagetop/src/html/optional_attr.rs create mode 100644 pagetop/src/html/optional_id.rs create mode 100644 pagetop/static/bootsier/images/demo-header.svg create mode 100644 pagetop/static/bootsier/images/demo-pagetop.svg create mode 100644 pagetop/static/bootsier/images/demo-visiting.svg diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 79bf426e..b91b97fa 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -2,37 +2,37 @@ use pagetop::prelude::*; use super::l; pub async fn summary() -> app::Result<Markup> { - let top_menu = Menu::prepare() + let top_menu = Menu::new() .add(MenuItem::label(l("module_fullname").as_str())) .add(MenuItem::link("Opción 2", "https://www.google.es")) .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .add(MenuItem::submenu("Submenú 1", Menu::prepare() + .add(MenuItem::submenu("Submenú 1", Menu::new() .add(MenuItem::label("Opción 1")) .add(MenuItem::label("Opción 2")) )) .add(MenuItem::separator()) - .add(MenuItem::submenu("Submenú 2", Menu::prepare() + .add(MenuItem::submenu("Submenú 2", Menu::new() .add(MenuItem::label("Opción 1")) .add(MenuItem::label("Opción 2")) )) .add(MenuItem::label("Opción 4")); - let side_menu = Menu::prepare() + let side_menu = Menu::new() .add(MenuItem::label("Opción 1")) .add(MenuItem::link("Opción 2", "https://www.google.es")) .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .add(MenuItem::submenu("Submenú 1", Menu::prepare() + .add(MenuItem::submenu("Submenú 1", Menu::new() .add(MenuItem::label("Opción 1")) .add(MenuItem::label("Opción 2")) )) .add(MenuItem::separator()) - .add(MenuItem::submenu("Submenú 2", Menu::prepare() + .add(MenuItem::submenu("Submenú 2", Menu::new() .add(MenuItem::label("Opción 1")) .add(MenuItem::label("Opción 2")) )) .add(MenuItem::label("Opción 4")); - Page::prepare() + Page::new() .using_theme("bootsier") @@ -40,12 +40,12 @@ pub async fn summary() -> app::Result<Markup> { .add_to("top-menu", top_menu) - .add_to("content", Container::row() - .add(Container::column() + .add_to("content", grid::Row::new() + .add_column(grid::Column::new() .add(side_menu) ) - .add(Container::column() - .add(Chunck::markup(html! { + .add_column(grid::Column::new() + .add(Chunck::with(html! { p { "Columna 2"} })) ) diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index afcd729f..0f5c4662 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -35,7 +35,7 @@ impl ModuleTrait for NodeModule { } async fn node() -> app::Result<Markup> { - Page::prepare() + Page::new() .with_title( "Nodo" ) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 343daa7a..7ef2ecf3 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -32,7 +32,7 @@ impl ModuleTrait for UserModule { } fn form_login() -> impl PageComponent { - Form::prepare() + Form::new() .with_id("user-login") .add(form::Input::textfield() .with_name("name") @@ -51,11 +51,11 @@ fn form_login() -> impl PageComponent { } async fn login() -> app::Result<Markup> { - Page::prepare() + Page::new() .with_title( "Identificación del usuario" ) - .add_to("content", Container::prepare() + .add_to("content", Container::new() .with_id("welcome") .add(form_login()) ) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 96fce677..b857712f 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -3,21 +3,21 @@ use crate::prelude::*; pub struct Block { renderable: fn() -> bool, weight : i8, - id : Option<String>, - title : Option<String>, - markup : Vec<Markup>, + id : OptionId, + title : OptionAttr, + html : Vec<Markup>, template : String, } impl PageComponent for Block { - fn prepare() -> Self { + fn new() -> Self { Block { renderable: always, weight : 0, - id : None, - title : None, - markup : Vec::new(), + id : OptionId::none(), + title : OptionAttr::none(), + html : Vec::new(), template : "default".to_owned(), } } @@ -31,15 +31,16 @@ impl PageComponent for Block { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - let id = assets.serial_id(self.name(), self.id()); + let id = assets.serial_id(self.name(), self.id.value()); + let title = self.title.value(); html! { div id=(id) class="block" { - @if self.title != None { - h2 class="block-title" { (self.title()) } + @if !title.is_empty() { + h2 class="block-title" { (title) } } div class="block-body" { - @for markup in self.markup.iter() { - (*markup) + @for html in self.html.iter() { + (*html) } } } @@ -49,8 +50,8 @@ impl PageComponent for Block { impl Block { - pub fn markup(markup: Markup) -> Self { - Block::prepare().add_markup(markup) + pub fn with(html: Markup) -> Self { + Block::new().add(html) } // Block BUILDER. @@ -66,17 +67,17 @@ impl Block { } pub fn with_id(mut self, id: &str) -> Self { - self.id = util::valid_id(id); + self.id.with_value(id); self } pub fn with_title(mut self, title: &str) -> Self { - self.title = util::valid_str(title); + self.title.with_value(title); self } - pub fn add_markup(mut self, markup: Markup) -> Self { - self.markup.push(markup); + pub fn add(mut self, html: Markup) -> Self { + self.html.push(html); self } @@ -88,11 +89,11 @@ impl Block { // Block GETTERS. pub fn id(&self) -> &str { - util::assigned_str(&self.id) + self.id.value() } pub fn title(&self) -> &str { - util::assigned_str(&self.title) + self.title.value() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 63cc20f7..b03ac0c8 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -3,17 +3,17 @@ use crate::prelude::*; pub struct Chunck { renderable: fn() -> bool, weight : i8, - markup : Vec<Markup>, + html : Vec<Markup>, template : String, } impl PageComponent for Chunck { - fn prepare() -> Self { + fn new() -> Self { Chunck { renderable: always, weight : 0, - markup : Vec::new(), + html : Vec::new(), template : "default".to_owned(), } } @@ -28,8 +28,8 @@ impl PageComponent for Chunck { fn default_render(&self, _: &mut PageAssets) -> Markup { html! { - @for markup in self.markup.iter() { - (*markup) + @for html in self.html.iter() { + (*html) } } } @@ -37,8 +37,8 @@ impl PageComponent for Chunck { impl Chunck { - pub fn markup(markup: Markup) -> Self { - Chunck::prepare().add_markup(markup) + pub fn with(html: Markup) -> Self { + Chunck::new().add(html) } // Chunck BUILDER. @@ -53,8 +53,8 @@ impl Chunck { self } - pub fn add_markup(mut self, markup: Markup) -> Self { - self.markup.push(markup); + pub fn add(mut self, html: Markup) -> Self { + self.html.push(html); self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 161bea78..18d6337a 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -1,11 +1,11 @@ use crate::prelude::*; -enum ContainerType { Column, Row, Wrapper } +enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { renderable: fn() -> bool, weight : i8, - id : Option<String>, + id : OptionId, container : ContainerType, components: PageContainer, template : String, @@ -13,11 +13,11 @@ pub struct Container { impl PageComponent for Container { - fn prepare() -> Self { + fn new() -> Self { Container { renderable: always, weight : 0, - id : None, + id : OptionId::none(), container : ContainerType::Wrapper, components: PageContainer::new(), template : "default".to_owned(), @@ -33,14 +33,39 @@ impl PageComponent for Container { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - let classes = match self.container { - ContainerType::Wrapper => "container", - ContainerType::Row => "row", - ContainerType::Column => "col", - }; - html! { - div id=[&self.id] class=(classes) { - (self.components.render(assets)) + match self.container { + ContainerType::Header => html! { + header id=[&self.id.option()] class="header" { + div class="container" { + (self.components.render(assets)) + } + } + }, + ContainerType::Footer => html! { + footer id=[&self.id.option()] class="footer" { + div class="container" { + (self.components.render(assets)) + } + } + }, + ContainerType::Main => html! { + main id=[&self.id.option()] class="main" { + div class="container" { + (self.components.render(assets)) + } + } + }, + ContainerType::Section => html! { + section id=[&self.id.option()] class="section" { + div class="container" { + (self.components.render(assets)) + } + } + }, + _ => html! { + div id=[&self.id.option()] class="container" { + (self.components.render(assets)) + } } } } @@ -48,16 +73,28 @@ impl PageComponent for Container { impl Container { - pub fn row() -> Self { - let mut grid = Container::prepare(); - grid.container = ContainerType::Row; - grid + pub fn header() -> Self { + let mut c = Container::new(); + c.container = ContainerType::Header; + c } - pub fn column() -> Self { - let mut grid = Container::prepare(); - grid.container = ContainerType::Column; - grid + pub fn footer() -> Self { + let mut c = Container::new(); + c.container = ContainerType::Footer; + c + } + + pub fn main() -> Self { + let mut c = Container::new(); + c.container = ContainerType::Main; + c + } + + pub fn section() -> Self { + let mut c = Container::new(); + c.container = ContainerType::Section; + c } // Container BUILDER. @@ -73,7 +110,7 @@ impl Container { } pub fn with_id(mut self, id: &str) -> Self { - self.id = util::valid_id(id); + self.id.with_value(id); self } @@ -90,7 +127,7 @@ impl Container { // Container GETTERS. pub fn id(&self) -> &str { - util::assigned_str(&self.id) + self.id.value() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 57810fea..a1975ea4 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -6,24 +6,24 @@ pub struct Button { renderable : fn() -> bool, weight : i8, button_type: ButtonType, - name : Option<String>, - value : Option<String>, - autofocus : Option<String>, - disabled : Option<String>, + name : OptionAttr, + value : OptionAttr, + autofocus : OptionAttr, + disabled : OptionAttr, template : String, } impl PageComponent for Button { - fn prepare() -> Self { + fn new() -> Self { Button { renderable : always, weight : 0, button_type: ButtonType::Button, - name : None, - value : None, - autofocus : None, - disabled : None, + name : OptionAttr::none(), + value : OptionAttr::none(), + autofocus : OptionAttr::none(), + disabled : OptionAttr::none(), template : "default".to_owned(), } } @@ -42,7 +42,7 @@ impl PageComponent for Button { ButtonType::Reset => ("reset", "btn btn-primary form-reset" ), ButtonType::Submit => ("submit", "btn btn-primary form-submit") }; - let id_item = match &self.name { + let id_item = match &self.name.option() { Some(name) => Some(format!("edit-{}", name)), _ => None }; @@ -51,15 +51,12 @@ impl PageComponent for Button { type=(button_type) id=[&id_item] class=(button_class) - name=[&self.name] - value=[&self.value] - autofocus=[&self.autofocus] - disabled=[&self.disabled] + name=[&self.name.option()] + value=[&self.value.option()] + autofocus=[&self.autofocus.option()] + disabled=[&self.disabled.option()] { - @match &self.value { - Some(value) => (value), - _ => "" - }; + (self.value.value()) } } } @@ -68,17 +65,17 @@ impl PageComponent for Button { impl Button { pub fn button(value: &str) -> Self { - Button::prepare().with_value(value) + Button::new().with_value(value) } pub fn reset(value: &str) -> Self { - let mut button = Button::prepare().with_value(value); + let mut button = Button::new().with_value(value); button.button_type = ButtonType::Reset; button } pub fn submit(value: &str) -> Self { - let mut button = Button::prepare().with_value(value); + let mut button = Button::new().with_value(value); button.button_type = ButtonType::Submit; button } @@ -96,28 +93,28 @@ impl Button { } pub fn with_name(mut self, name: &str) -> Self { - self.name = util::valid_id(name); + self.name.with_value(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::valid_str(value); + self.value.with_value(value); self } pub fn autofocus(mut self, toggle: bool) -> Self { - self.autofocus = match toggle { - true => Some("autofocus".to_owned()), - false => None - }; + self.autofocus.with_value(match toggle { + true => "autofocus", + false => "", + }); self } pub fn disabled(mut self, toggle: bool) -> Self { - self.disabled = match toggle { - true => Some("disabled".to_owned()), - false => None - }; + self.disabled.with_value(match toggle { + true => "disabled", + false => "", + }); self } @@ -129,25 +126,19 @@ impl Button { // Button GETTERS. pub fn name(&self) -> &str { - util::assigned_str(&self.name) + self.name.value() } pub fn value(&self) -> &str { - util::assigned_str(&self.value) + self.value.value() } pub fn has_autofocus(&self) -> bool { - match &self.autofocus { - Some(_) => true, - _ => false - } + self.autofocus.has_value() } pub fn is_disabled(&self) -> bool { - match &self.disabled { - Some(_) => true, - _ => false - } + self.disabled.has_value() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 6614670a..7f04691b 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -3,35 +3,35 @@ use crate::prelude::*; pub struct Date { renderable : fn() -> bool, weight : i8, - name : Option<String>, - value : Option<String>, - label : Option<String>, - placeholder : Option<String>, - autofocus : Option<String>, - autocomplete: Option<String>, - disabled : Option<String>, - readonly : Option<String>, - required : Option<String>, - help_text : Option<String>, + name : OptionAttr, + value : OptionAttr, + label : OptionAttr, + placeholder : OptionAttr, + autofocus : OptionAttr, + autocomplete: OptionAttr, + disabled : OptionAttr, + readonly : OptionAttr, + required : OptionAttr, + help_text : OptionAttr, template : String, } impl PageComponent for Date { - fn prepare() -> Self { + fn new() -> Self { Date { renderable : always, weight : 0, - name : None, - value : None, - label : None, - placeholder : None, - autofocus : None, - autocomplete: None, - disabled : None, - readonly : None, - required : None, - help_text : None, + name : OptionAttr::none(), + value : OptionAttr::none(), + label : OptionAttr::none(), + placeholder : OptionAttr::none(), + autofocus : OptionAttr::none(), + autocomplete: OptionAttr::none(), + disabled : OptionAttr::none(), + readonly : OptionAttr::none(), + required : OptionAttr::none(), + help_text : OptionAttr::none(), template : "default".to_owned(), } } @@ -45,7 +45,7 @@ impl PageComponent for Date { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (class_item, id_item) = match &self.name { + let (class_item, id_item) = match self.name.option() { Some(name) => ( format!("form-item form-item-{} form-type-date", name), Some(format!("edit-{}", name)) @@ -57,10 +57,10 @@ impl PageComponent for Date { }; html! { div class=(class_item) { - @if self.label != None { + @if self.label.has_value() { label class="form-label" for=[&id_item] { - (self.label()) " " - @if self.required != None { + (self.label.value()) " " + @if self.required.has_value() { span class="form-required" title="Este campo es obligatorio." @@ -74,17 +74,17 @@ impl PageComponent for Date { type="date" id=[&id_item] class="form-control" - name=[&self.name] - value=[&self.value] - placeholder=[&self.placeholder] - autofocus=[&self.autofocus] - autocomplete=[&self.autocomplete] - readonly=[&self.readonly] - required=[&self.required] - disabled=[&self.disabled]; - @if self.help_text != None { + name=[&self.name.option()] + value=[&self.value.option()] + placeholder=[&self.placeholder.option()] + autofocus=[&self.autofocus.option()] + autocomplete=[&self.autocomplete.option()] + readonly=[&self.readonly.option()] + required=[&self.required.option()] + disabled=[&self.disabled.option()]; + @if self.help_text.has_value() { div class="form-text" { - (self.help_text()) + (self.help_text.value()) } } } @@ -107,67 +107,67 @@ impl Date { } pub fn with_name(mut self, name: &str) -> Self { - self.name = util::valid_id(name); + self.name.with_value(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::valid_str(value); + self.value.with_value(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label = util::valid_str(label); + self.label.with_value(label); self } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = util::valid_str(placeholder); + self.placeholder.with_value(placeholder); self } pub fn autofocus(mut self, toggle: bool) -> Self { - self.autofocus = match toggle { - true => Some("autofocus".to_owned()), - false => None - }; + self.autofocus.with_value(match toggle { + true => "autofocus", + false => "", + }); self } pub fn autocomplete(mut self, toggle: bool) -> Self { - self.autocomplete = match toggle { - true => None, - false => Some("off".to_owned()) - }; + self.autocomplete.with_value(match toggle { + true => "", + false => "off", + }); self } pub fn disabled(mut self, toggle: bool) -> Self { - self.disabled = match toggle { - true => Some("disabled".to_owned()), - false => None - }; + self.disabled.with_value(match toggle { + true => "disabled", + false => "", + }); self } pub fn readonly(mut self, toggle: bool) -> Self { - self.readonly = match toggle { - true => Some("readonly".to_owned()), - false => None - }; + self.readonly.with_value(match toggle { + true => "readonly", + false => "", + }); self } pub fn required(mut self, toggle: bool) -> Self { - self.required = match toggle { - true => Some("required".to_owned()), - false => None - }; + self.required.with_value(match toggle { + true => "required", + false => "", + }); self } pub fn with_help_text(mut self, help_text: &str) -> Self { - self.help_text = util::valid_str(help_text); + self.help_text.with_value(help_text); self } @@ -179,58 +179,43 @@ impl Date { // Date GETTERS. pub fn name(&self) -> &str { - util::assigned_str(&self.name) + self.name.value() } pub fn value(&self) -> &str { - util::assigned_str(&self.value) + self.value.value() } pub fn label(&self) -> &str { - util::assigned_str(&self.label) + self.label.value() } pub fn placeholder(&self) -> &str { - util::assigned_str(&self.placeholder) + self.placeholder.value() } pub fn has_autofocus(&self) -> bool { - match &self.autofocus { - Some(_) => true, - _ => false - } + self.autofocus.has_value() } pub fn has_autocomplete(&self) -> bool { - match &self.autocomplete { - Some(_) => false, - _ => true - } + !self.autocomplete.has_value() } pub fn is_disabled(&self) -> bool { - match &self.disabled { - Some(_) => true, - _ => false - } + self.disabled.has_value() } pub fn is_readonly(&self) -> bool { - match &self.readonly { - Some(_) => true, - _ => false - } + self.readonly.has_value() } pub fn is_required(&self) -> bool { - match &self.required { - Some(_) => true, - _ => false - } + self.required.has_value() } pub fn help_text(&self) -> &str { - util::assigned_str(&self.help_text) + self.help_text.value() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 2fac4403..e93926a7 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -5,24 +5,24 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, weight : i8, - id : Option<String>, - action : Option<String>, + id : OptionId, + action : OptionAttr, method : FormMethod, - charset : Option<String>, + charset : OptionAttr, elements : PageContainer, template : String, } impl PageComponent for Form { - fn prepare() -> Self { + fn new() -> Self { Form { renderable: always, weight : 0, - id : None, - action : None, + id : OptionId::none(), + action : OptionAttr::none(), method : FormMethod::Post, - charset : Some("UTF-8".to_owned()), + charset : OptionAttr::some("UTF-8"), elements : PageContainer::new(), template : "default".to_owned(), } @@ -43,10 +43,10 @@ impl PageComponent for Form { }; html! { form - id=[&self.id] - action=[&self.action] + id=[&self.id.option()] + action=[&self.action.option()] method=[method] - accept-charset=[&self.charset] + accept-charset=[&self.charset.option()] { div { (self.elements.render(assets)) @@ -71,12 +71,12 @@ impl Form { } pub fn with_id(mut self, id: &str) -> Self { - self.id = util::valid_id(id); + self.id.with_value(id); self } pub fn with_action(mut self, action: &str) -> Self { - self.action = util::valid_str(action); + self.action.with_value(action); self } @@ -86,7 +86,7 @@ impl Form { } pub fn with_charset(mut self, charset: &str) -> Self { - self.charset = util::valid_str(charset); + self.charset.with_value(charset); self } @@ -103,11 +103,11 @@ impl Form { // Form GETTERS. pub fn id(&self) -> &str { - util::assigned_str(&self.id) + self.id.value() } pub fn action(&self) -> &str { - util::assigned_str(&self.action) + self.action.value() } pub fn method(&self) -> &str { @@ -118,7 +118,7 @@ impl Form { } pub fn charset(&self) -> &str { - util::assigned_str(&self.charset) + self.charset.value() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index bd158b85..b27caf37 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -2,17 +2,17 @@ use crate::prelude::*; pub struct Hidden { weight : i8, - name : Option<String>, - value : Option<String>, + name : OptionId, + value : OptionAttr, } impl PageComponent for Hidden { - fn prepare() -> Self { + fn new() -> Self { Hidden { weight : 0, - name : None, - value : None, + name : OptionId::none(), + value : OptionAttr::none(), } } @@ -21,7 +21,7 @@ impl PageComponent for Hidden { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let id_item = match &self.name { + let id_item = match self.name.option() { Some(name) => Some(format!("value-{}", name)), _ => None }; @@ -29,8 +29,8 @@ impl PageComponent for Hidden { input type="hidden" id=[&id_item] - name=[&self.name] - value=[&self.value]; + name=[&self.name.option()] + value=[&self.value.option()]; } } } @@ -38,7 +38,7 @@ impl PageComponent for Hidden { impl Hidden { pub fn set(name: &str, value: &str) -> Self { - Hidden::prepare().with_name(name).with_value(value) + Hidden::new().with_name(name).with_value(value) } // Hidden BUILDER. @@ -49,22 +49,22 @@ impl Hidden { } pub fn with_name(mut self, name: &str) -> Self { - self.name = util::valid_id(name); + self.name.with_value(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::valid_str(value); + self.value.with_value(value); self } // Hidden GETTERS. pub fn name(&self) -> &str { - util::assigned_str(&self.name) + self.name.value() } pub fn value(&self) -> &str { - util::assigned_str(&self.value) + self.value.value() } } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index f0e73a63..c483c9a9 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -6,42 +6,42 @@ pub struct Input { renderable : fn() -> bool, weight : i8, input_type : InputType, - name : Option<String>, - value : Option<String>, - label : Option<String>, + name : OptionId, + value : OptionAttr, + label : OptionAttr, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, - placeholder : Option<String>, - autofocus : Option<String>, - autocomplete: Option<String>, - disabled : Option<String>, - readonly : Option<String>, - required : Option<String>, - help_text : Option<String>, + placeholder : OptionAttr, + autofocus : OptionAttr, + autocomplete: OptionAttr, + disabled : OptionAttr, + readonly : OptionAttr, + required : OptionAttr, + help_text : OptionAttr, template : String, } impl PageComponent for Input { - fn prepare() -> Self { + fn new() -> Self { Input { renderable : always, weight : 0, input_type : InputType::Textfield, - name : None, - value : None, - label : None, + name : OptionId::none(), + value : OptionAttr::none(), + label : OptionAttr::none(), size : Some(60), minlength : None, maxlength : Some(128), - placeholder : None, - autofocus : None, - autocomplete: None, - disabled : None, - readonly : None, - required : None, - help_text : None, + placeholder : OptionAttr::none(), + autofocus : OptionAttr::none(), + autocomplete: OptionAttr::none(), + disabled : OptionAttr::none(), + readonly : OptionAttr::none(), + required : OptionAttr::none(), + help_text : OptionAttr::none(), template : "default".to_owned(), } } @@ -63,7 +63,7 @@ impl PageComponent for Input { InputType::Textfield => ("text", "form-type-textfield"), InputType::Url => ("url", "form-type-url") }; - let (class_item, id_item) = match &self.name { + let (class_item, id_item) = match &self.name.option() { Some(name) => ( format!("form-item form-item-{} {}", name, class_type), Some(format!("edit-{}", name)) @@ -75,10 +75,10 @@ impl PageComponent for Input { }; html! { div class=(class_item) { - @if self.label != None { + @if self.label.has_value() { label class="form-label" for=[&id_item] { - (self.label()) " " - @if self.required != None { + (self.label.value()) " " + @if self.required.has_value() { span class="form-required" title="Este campo es obligatorio." @@ -92,20 +92,20 @@ impl PageComponent for Input { type=(input_type) id=[&id_item] class="form-control" - name=[&self.name] - value=[&self.value] + name=[&self.name.option()] + value=[&self.value.option()] size=[self.size] minlength=[self.minlength] maxlength=[self.maxlength] - placeholder=[&self.placeholder] - autofocus=[&self.autofocus] - autocomplete=[&self.autocomplete] - readonly=[&self.readonly] - required=[&self.required] - disabled=[&self.disabled]; - @if self.help_text != None { + placeholder=[&self.placeholder.option()] + autofocus=[&self.autofocus.option()] + autocomplete=[&self.autocomplete.option()] + readonly=[&self.readonly.option()] + required=[&self.required.option()] + disabled=[&self.disabled.option()]; + @if self.help_text.has_value() { div class="form-text" { - (self.help_text()) + (self.help_text.value()) } } } @@ -116,35 +116,35 @@ impl PageComponent for Input { impl Input { pub fn textfield() -> Self { - Input::prepare() + Input::new() } pub fn password() -> Self { - let mut input = Input::prepare(); + let mut input = Input::new(); input.input_type = InputType::Password; input } pub fn search() -> Self { - let mut input = Input::prepare(); + let mut input = Input::new(); input.input_type = InputType::Search; input } pub fn email() -> Self { - let mut input = Input::prepare(); + let mut input = Input::new(); input.input_type = InputType::Email; input } pub fn telephone() -> Self { - let mut input = Input::prepare(); + let mut input = Input::new(); input.input_type = InputType::Telephone; input } pub fn url() -> Self { - let mut input = Input::prepare(); + let mut input = Input::new(); input.input_type = InputType::Url; input } @@ -162,17 +162,17 @@ impl Input { } pub fn with_name(mut self, name: &str) -> Self { - self.name = util::valid_id(name); + self.name.with_value(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value = util::valid_str(value); + self.value.with_value(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label = util::valid_str(label); + self.label.with_value(label); self } @@ -192,52 +192,52 @@ impl Input { } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder = util::valid_str(placeholder); + self.placeholder.with_value(placeholder); self } pub fn autofocus(mut self, toggle: bool) -> Self { - self.autofocus = match toggle { - true => Some("autofocus".to_owned()), - false => None - }; + self.autofocus.with_value(match toggle { + true => "autofocus", + false => "", + }); self } pub fn autocomplete(mut self, toggle: bool) -> Self { - self.autocomplete = match toggle { - true => None, - false => Some("off".to_owned()) - }; + self.autocomplete.with_value(match toggle { + true => "", + false => "off", + }); self } pub fn disabled(mut self, toggle: bool) -> Self { - self.disabled = match toggle { - true => Some("disabled".to_owned()), - false => None - }; + self.disabled.with_value(match toggle { + true => "disabled", + false => "", + }); self } pub fn readonly(mut self, toggle: bool) -> Self { - self.readonly = match toggle { - true => Some("readonly".to_owned()), - false => None - }; + self.readonly.with_value(match toggle { + true => "readonly", + false => "", + }); self } pub fn required(mut self, toggle: bool) -> Self { - self.required = match toggle { - true => Some("required".to_owned()), - false => None - }; + self.required.with_value(match toggle { + true => "required", + false => "", + }); self } pub fn with_help_text(mut self, help_text: &str) -> Self { - self.help_text = util::valid_str(help_text); + self.help_text.with_value(help_text); self } @@ -249,15 +249,15 @@ impl Input { // Input GETTERS. pub fn name(&self) -> &str { - util::assigned_str(&self.name) + self.name.value() } pub fn value(&self) -> &str { - util::assigned_str(&self.value) + self.value.value() } pub fn label(&self) -> &str { - util::assigned_str(&self.label) + self.label.value() } pub fn size(&self) -> Option<u16> { @@ -273,46 +273,31 @@ impl Input { } pub fn placeholder(&self) -> &str { - util::assigned_str(&self.placeholder) + self.placeholder.value() } pub fn has_autofocus(&self) -> bool { - match &self.autofocus { - Some(_) => true, - _ => false - } + self.autofocus.has_value() } pub fn has_autocomplete(&self) -> bool { - match &self.autocomplete { - Some(_) => false, - _ => true - } + !self.autocomplete.has_value() } pub fn is_disabled(&self) -> bool { - match &self.disabled { - Some(_) => true, - _ => false - } + self.disabled.has_value() } pub fn is_readonly(&self) -> bool { - match &self.readonly { - Some(_) => true, - _ => false - } + self.readonly.has_value() } pub fn is_required(&self) -> bool { - match &self.required { - Some(_) => true, - _ => false - } + self.required.has_value() } pub fn help_text(&self) -> &str { - util::assigned_str(&self.help_text) + self.help_text.value() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs new file mode 100644 index 00000000..96463490 --- /dev/null +++ b/pagetop/src/base/component/grid/column.rs @@ -0,0 +1,82 @@ +use crate::prelude::*; + +pub struct Column { + renderable: fn() -> bool, + weight : i8, + id : OptionId, + components: PageContainer, + template : String, +} + +impl PageComponent for Column { + + fn new() -> Self { + Column { + renderable: always, + weight : 0, + id : OptionId::none(), + components: PageContainer::new(), + template : "default".to_owned(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, assets: &mut PageAssets) -> Markup { + html! { + div id=[&self.id.option()] class="col" { + (self.components.render(assets)) + } + } + } +} + +impl Column { + + // Column BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.id.with_value(id); + self + } + + pub fn add(mut self, component: impl PageComponent) -> Self { + self.components.add(component); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_owned(); + self + } + + // Column GETTERS. + + pub fn id(&self) -> &str { + self.id.value() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/pagetop/src/base/component/grid/mod.rs b/pagetop/src/base/component/grid/mod.rs new file mode 100644 index 00000000..ca7796ef --- /dev/null +++ b/pagetop/src/base/component/grid/mod.rs @@ -0,0 +1,4 @@ +mod row; +pub use row::Row; +mod column; +pub use column::Column; diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs new file mode 100644 index 00000000..6aed7d0f --- /dev/null +++ b/pagetop/src/base/component/grid/row.rs @@ -0,0 +1,82 @@ +use crate::prelude::*; + +pub struct Row { + renderable: fn() -> bool, + weight : i8, + id : OptionId, + columns : PageContainer, + template : String, +} + +impl PageComponent for Row { + + fn new() -> Self { + Row { + renderable: always, + weight : 0, + id : OptionId::none(), + columns : PageContainer::new(), + template : "default".to_owned(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, assets: &mut PageAssets) -> Markup { + html! { + div id=[&self.id.option()] class="row" { + (self.columns.render(assets)) + } + } + } +} + +impl Row { + + // Row BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.id.with_value(id); + self + } + + pub fn add_column(mut self, column: grid::Column) -> Self { + self.columns.add(column); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_owned(); + self + } + + // Row GETTERS. + + pub fn id(&self) -> &str { + self.id.value() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs new file mode 100644 index 00000000..b330b374 --- /dev/null +++ b/pagetop/src/base/component/image.rs @@ -0,0 +1,70 @@ +use crate::prelude::*; + +pub struct Image { + renderable: fn() -> bool, + weight : i8, + source : Option<String>, + template : String, +} + +impl PageComponent for Image { + + fn new() -> Self { + Image { + renderable: always, + weight : 0, + source : None, + template : "default".to_owned(), + } + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> i8 { + self.weight + } + + fn default_render(&self, _: &mut PageAssets) -> Markup { + html! { + img src=[&self.source] class="img-fluid" {} + } + } +} + +impl Image { + + pub fn image(source: &str) -> Self { + let mut i = Image::new(); + i.source = Some(source.to_owned()); + i + } + + // Image BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.template = template.to_owned(); + self + } + + // Image GETTERS. + + pub fn template(&self) -> &str { + self.template.as_str() + } +} + +fn always() -> bool { + true +} diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index d3cdb6b8..10ac8ca5 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -4,7 +4,7 @@ enum MenuItemType { Label(String), Link(String, String), LinkBlank(String, String), - Markup(Markup), + Html(Markup), Separator, Submenu(String, Menu), } @@ -21,7 +21,7 @@ pub struct MenuItem { impl PageComponent for MenuItem { - fn prepare() -> Self { + fn new() -> Self { MenuItem { renderable: always, weight : 0, @@ -50,8 +50,8 @@ impl PageComponent for MenuItem { a href=(path) target="_blank" { (label) } } }, - Some(MenuItemType::Markup(markup)) => html! { - li class="markup" { (*markup) } + Some(MenuItemType::Html(html)) => html! { + li class="html" { (*html) } }, Some(MenuItemType::Submenu(label, menu)) => html! { li class="submenu" { @@ -101,11 +101,11 @@ impl MenuItem { } } - pub fn markup(markup: Markup) -> Self { + pub fn html(html: Markup) -> Self { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::Markup(markup)), + item_type : Some(MenuItemType::Html(html)), } } @@ -148,18 +148,18 @@ impl MenuItem { pub struct Menu { renderable: fn() -> bool, weight : i8, - id : Option<String>, + id : OptionId, items : PageContainer, template : String, } impl PageComponent for Menu { - fn prepare() -> Self { + fn new() -> Self { Menu { renderable: always, weight : 0, - id : None, + id : OptionId::none(), items : PageContainer::new(), template : "default".to_owned(), } @@ -186,7 +186,7 @@ impl PageComponent for Menu { )) .add_jquery(); - let id = assets.serial_id(self.name(), self.id()); + let id = assets.serial_id(self.name(), self.id.value()); html! { ul id=(id) class="sm sm-clean" { (self.render_items(assets)) @@ -216,7 +216,7 @@ impl Menu { } pub fn with_id(mut self, id: &str) -> Self { - self.id = util::valid_id(id); + self.id.with_value(id); self } @@ -233,7 +233,7 @@ impl Menu { // Menu GETTERS. pub fn id(&self) -> &str { - util::assigned_str(&self.id) + self.id.value() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/base/component/mod.rs index f9973108..4619c937 100644 --- a/pagetop/src/base/component/mod.rs +++ b/pagetop/src/base/component/mod.rs @@ -1,9 +1,14 @@ mod container; pub use container::Container; + +pub mod grid; + mod chunck; pub use chunck::Chunck; mod block; pub use block::Block; +mod image; +pub use image::Image; mod menu; pub use menu::{Menu, MenuItem}; diff --git a/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl index 14c93f2f..d23f6ce6 100644 --- a/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl +++ b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl @@ -3,19 +3,23 @@ module_description = Displays a demo homepage when none is configured. page_title = Hello world! -text_welcome = This page is used to test the proper operation of { $app } after installation. This web solution is powered by { $pagetop }. If you can read this page, it means that the PageTop server is working properly, but has not yet been configured. +welcome_to = Welcome to { $app } +welcome_intro = This page is used to test the proper operation of { $app } after installation. +welcome_pagetop = This web solution is powered by { $pagetop }. -title_normal_user = Just visiting? -text1_normal_user = If you are a normal user of this web site and don't know what this page is about, this probably means that the site is either experiencing problems or is undergoing routine maintenance. -text2_normal_user = If the problem persists, please contact your system administrator. +visiting_title = Just visiting? +visiting_subtitle = Are you user of this website? +visiting_text1 = If you don't know what this page is about, this probably means that the site is either experiencing problems or is undergoing routine maintenance. +visiting_text2 = If the problem persists, please contact your system administrator. -title_about_pagetop = About PageTop -text1_about_pagetop = PageTop defines an interface for the most stable and popular Rust packages to build modular, extensible and configurable web solutions. -text2_about_pagetop = For information on PageTop please visit the "PageTop website". +pagetop_title = About PageTop +pagetop_text1 = If you can read this page, it means that the PageTop server is working properly, but has not yet been configured. +pagetop_text2 = PageTop defines an interface for the most stable and popular Rust packages to build modular, extensible and configurable web solutions. +pagetop_text3 = For information on PageTop please visit the "PageTop website". -title_promo_pagetop = Promoting PageTop -text1_promo_pagetop = You are free to use the image below on applications powered by { $pagetop }. Thanks for using PageTop! +pagetop_promo_title = Promoting PageTop +pagetop_promo_text1 = You are free to use the image below on applications powered by { $pagetop }. Thanks for using PageTop! -title_report_problems = Reporting Problems -text1_report_problems = Please use the GitLab tool to report bugs in PageTop. However, check "existing bug reports" before reporting a new bug. -text2_report_problems = Please report bugs specific to modules (such as admin, and others) to respective packages, not to PageTop itself. +report_problems_title = Reporting Problems +report_problems_text1 = Please use the GitLab tool to report bugs in PageTop. However, check "existing bug reports" before reporting a new bug. +report_problems_text2 = Please report bugs specific to modules (such as admin, and others) to respective packages, not to PageTop itself. diff --git a/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl index 39720fcd..70706ca8 100644 --- a/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl +++ b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl @@ -3,19 +3,23 @@ module_description = Muestra una página de demostración predeterminada cuando page_title = ¡Hola mundo! -text_welcome = Esta página se utiliza para probar el correcto funcionamiento de { $app } después de la instalación. Esta solución web funciona con { $pagetop }. Si puede leer esta página, significa que el servidor PageTop funciona correctamente, pero aún no se ha configurado. +welcome_to = Bienvenido a { $app } +welcome_intro = Esta página se utiliza para probar el correcto funcionamiento de { $app } después de la instalación. +welcome_pagetop = Esta solución web funciona con { $pagetop }. -title_normal_user = ¿Sólo de visita? -text1_normal_user = Si usted es un usuario normal de este sitio web y no sabe de qué trata esta página, probablemente significa que el sitio está experimentando problemas o está pasando por un mantenimiento de rutina. -text2_normal_user = Si el problema persiste, póngase en contacto con el administrador del sistema. +visiting_title = ¿Sólo de visita? +visiting_subtitle = ¿Eres usuario de este sitio web? +visiting_text1 = Si no sabes de qué trata esta página, probablemente significa que el sitio está experimentando problemas o está pasando por un mantenimiento de rutina. +visiting_text2 = Si el problema persiste, póngase en contacto con el administrador del sistema. -title_about_pagetop = Sobre PageTop -text1_about_pagetop = PageTop define una interfaz para los paquetes Rust más estables y populares para crear soluciones web modulares, extensibles y configurables. -text2_about_pagetop = Para obtener información sobre PageTop, visite el "sitio web de PageTop". +pagetop_title = Sobre PageTop +pagetop_text1 = Si puedes leer esta página, significa que el servidor PageTop funciona correctamente, pero aún no se ha configurado. +pagetop_text2 = PageTop define una interfaz para los paquetes Rust más estables y populares para crear soluciones web modulares, extensibles y configurables. +pagetop_text3 = Para obtener información sobre PageTop, visita el "sitio web de PageTop". -title_promo_pagetop = Promociona PageTop -text1_promo_pagetop = Puede usar la siguiente imagen en aplicaciones desarrolladas sobre { $pagetop }. ¡Gracias por usar PageTop! +pagetop_promo_title = Promociona PageTop +pagetop_promo_text1 = Puedes usar la siguiente imagen en aplicaciones desarrolladas sobre { $pagetop }. ¡Gracias por usar PageTop! -title_report_problems = Informando Problemas -text1_report_problems = Utilice la herramienta GitLab para informar errores en PageTop. Sin embargo, verifique los "informes de errores existentes" antes de informar de un nuevo error. -text2_report_problems = Informe los errores específicos de los módulos (como admin y otros) a los paquetes respectivos, no a PageTop en sí. +report_problems_title = Informando Problemas +report_problems_text1 = Utilice la herramienta GitLab para informar errores en PageTop. Sin embargo, verifique los "informes de errores existentes" antes de informar de un nuevo error. +report_problems_text2 = Informe los errores específicos de los módulos (como admin y otros) a los paquetes respectivos, no a PageTop en sí. diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index bb6e3b94..f3d3a903 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -18,61 +18,210 @@ impl ModuleTrait for DemopageModule { } fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { - cfg.route("/", app::web::get().to(home)); + cfg.route("/", app::web::get().to(demo)); } } -async fn home() -> app::Result<Markup> { - Page::prepare() +async fn demo() -> app::Result<Markup> { + Page::new() .using_theme("Bootsier") - .with_title( - l("page_title").as_str() - ) - - - - .add_to("content", Container::prepare() - .with_id("welcome") - .add(Chunck::markup(html! { - h1 { (l("page_title")) } - p { (e("text_welcome", &args![ - "app" => format!("<strong>{}</strong>", &SETTINGS.app.name), - "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" - ])) } - })) - ) - .add_to("content", Container::prepare() - .add(Container::row() - .add(Container::column() - .with_id("visitors") - .add(Chunck::markup(html! { - h2 { (l("title_normal_user")) } - p { (l("text1_normal_user")) } - p { (l("text2_normal_user")) } - }))) - .add(Container::column() - .with_id("pagetop") - .add(Chunck::markup(html! { - h2 { (l("title_about_pagetop")) } - p { (l("text1_about_pagetop")) } - p { (l("text2_about_pagetop")) } - - h2 { (l("title_promo_pagetop")) } - p { (e("text1_promo_pagetop", &args![ - "pagetop" => - "<a href=\"https://pagetop-rs\">PageTop</a>" - ])) } - })) - ) - ) - ) - .add_to("content", Container::prepare() - .with_id("reporting") - .add(Chunck::markup(html! { - h2 { (l("title_report_problems")) } - p { (l("text1_report_problems")) } - p { (l("text2_report_problems")) } - })) - ) + .with_title(l("page_title").as_str()) + .add_to("content", hello_world()) + .add_to("content", hello_world2()) + .add_to("content", just_visiting()) + .add_to("content", about_pagetop()) + .add_to("content", promo_pagetop()) + .add_to("content", reporting_problems()) .render() } + +fn hello_world2() -> Container { + Container::header() + .add(grid::Row::new() + .add_column(grid::Column::new() + .add(Chunck::with(html! { + div class="section-title" { + (t("welcome_to", &args![ + "app" => SETTINGS.app.name.as_str() + ])) + } + h1 class="h1-large" { + (l("page_title")) + } + p class="p-large" { + (e("welcome_intro", &args![ + "app" => format!( + "<strong>{}</strong>", + &SETTINGS.app.name + ) + ])) + } + p { + (e("welcome_pagetop", &args![ + "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + ])) + } + a class="btn-solid-lg" href="#services" { + "Offered services" + } + a class="quote" href="#contact" { + i class="fas fa-paper-plane" {} + "Get quote" + } + })) + ) + .add_column(grid::Column::new() + .add(Image::image("/bootsier/images/demo-header.svg")) + ) + ) +} + +fn hello_world() -> Chunck { + Chunck::with(html! { + header id="header" class="header" { + div class="container" { + div class="row" { + div class="col-lg-6 col-xl-5" { + div class="text-container" { + div class="section-title" { + (t("welcome_to", &args![ + "app" => SETTINGS.app.name.as_str() + ])) + } + h1 class="h1-large" { + (l("page_title")) + } + p class="p-large" { + (e("welcome_intro", &args![ + "app" => format!( + "<strong>{}</strong>", + &SETTINGS.app.name + ) + ])) + } + p { + (e("welcome_pagetop", &args![ + "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + ])) + } + a class="btn-solid-lg" href="#services" { + "Offered services" + } + a class="quote" href="#contact" { + i class="fas fa-paper-plane" {} + "Get quote" + } + } + } + div class="col-lg-6 col-xl-7" { + div class="image-container" { + img class="img-fluid" src="/bootsier/images/demo-header.svg" alt="alternative" {} + } + } + } + } + } + }) +} + +fn just_visiting() -> Chunck { + Chunck::with(html! { + div id="details" class="basic-1" { + div class="container" { + div class="row" { + div class="col-lg-6 col-xl-7" { + div class="image-container" { + img class="img-fluid" src="/bootsier/images/demo-visiting.svg" alt="alternative" {} + } + } + div class="col-lg-6 col-xl-5" { + div class="text-container" { + h2 { + span { + (l("visiting_title")) + } + br {} + (l("visiting_subtitle")) + } + p { (l("visiting_text1")) } + p { (l("visiting_text2")) } + a class="btn-solid-reg" data-bs-toggle="modal" data-bs-target="#staticBackdrop" { "Modal" } + } + } + } + } + } + }) +} + +fn about_pagetop() -> Chunck { + Chunck::with(html! { + div id="pagetop" class="basic-2" { + div class="container" { + div class="row" { + div class="col-lg-6 col-xl-5" { + div class="text-container" { + h2 { (l("pagetop_title")) } + p { (l("pagetop_text1")) } + p { (l("pagetop_text2")) } + p { (l("pagetop_text3")) } + } + } + div class="col-lg-6 col-xl-7" { + div class="image-container" { + img class="img-fluid" src="/bootsier/images/demo-pagetop.svg" alt="alternative" {} + } + } + } + } + } + }) +} + +fn promo_pagetop() -> Chunck { + Chunck::with(html! { + div id="promo" class="basic-3" { + div class="container" { + div class="row" { + div class="col-lg-6 col-xl-5" { + div class="text-container" { + h2 { (l("pagetop_promo_title")) } + p { (e("pagetop_promo_text1", &args![ + "pagetop" => + "<a href=\"https://pagetop-rs\">PageTop</a>" + ])) } + } + } + div class="col-lg-6 col-xl-7" { + div class="image-container" { + img class="img-fluid" src="/bootsier/images/demo-pagetop.svg" alt="alternative" {} + } + } + } + } + } + }) +} + +fn reporting_problems() -> Chunck { + Chunck::with(html! { + div id="reporting" class="basic-4" { + div class="container" { + div class="row" { + div class="col-lg-6 col-xl-5" { + div class="text-container" { + h2 { (l("report_problems_title")) } + p { (l("report_problems_text1")) } + p { (l("report_problems_text2")) } + } + } + div class="col-lg-6 col-xl-7" { + div class="image-container" { + img class="img-fluid" src="/bootsier/images/demo-pagetop.svg" alt="alternative" {} + } + } + } + } + } + }) +} diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index ada65b0e..90111723 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -52,9 +52,9 @@ impl ThemeTrait for BootsierTheme { s = app::http::StatusCode::INTERNAL_SERVER_ERROR; } } - Page::prepare() + Page::new() .with_title(format!("Error {}", s.as_str()).as_str()) - .add_to("content", Chunck::markup(html! { + .add_to("content", Chunck::with(html! { div class="jumbotron" { div class="media" { img diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs deleted file mode 100644 index ba885bb3..00000000 --- a/pagetop/src/html.rs +++ /dev/null @@ -1 +0,0 @@ -pub use maud::{DOCTYPE, Markup, PreEscaped, html}; diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs new file mode 100644 index 00000000..16c5ac73 --- /dev/null +++ b/pagetop/src/html/classes.rs @@ -0,0 +1,63 @@ +pub struct Classes { + classes: Vec<String>, + option : Option<String>, + updated: bool, +} + +impl Classes { + pub fn none() -> Self { + Classes { + classes: Vec::new(), + option : None, + updated: true, + } + } + + pub fn some_class(class: &str) -> Self { + let mut c = Classes::none(); + c.add_class(class); + c + } + + pub fn some_classes(classes: Vec<String>) -> Self { + let mut c = Classes::none(); + c.add_classes(classes); + c + } + + pub fn add_class(&mut self, class: &str) { + let class = class.trim().replace(" ", "_"); + if !class.is_empty() && !self.classes.iter().any(|c| *c == class) { + self.classes.push(class.to_owned()); + self.updated = false; + } + } + + pub fn add_classes(&mut self, classes: Vec<String>) { + for class in classes.iter() { + self.add_class(class); + } + } + + pub fn classes(&mut self) -> &str { + match self.option() { + Some(classes) => classes.as_str(), + None => "", + } + } + + pub fn has_classes(&self) -> bool { + self.classes.len() > 0 + } + + pub fn option(&mut self) -> &Option<String> { + if !self.updated { + self.option = match self.classes.len() { + 0 => None, + _ => Some(self.classes.join(" ")), + }; + self.updated = true; + } + &self.option + } +} diff --git a/pagetop/src/html/mod.rs b/pagetop/src/html/mod.rs new file mode 100644 index 00000000..60a9bd82 --- /dev/null +++ b/pagetop/src/html/mod.rs @@ -0,0 +1,8 @@ +pub use maud::{DOCTYPE, Markup, PreEscaped, html}; + +mod optional_id; +pub use optional_id::OptionId; +mod optional_attr; +pub use optional_attr::OptionAttr; +mod classes; +pub use classes::Classes; diff --git a/pagetop/src/html/optional_attr.rs b/pagetop/src/html/optional_attr.rs new file mode 100644 index 00000000..f6b48189 --- /dev/null +++ b/pagetop/src/html/optional_attr.rs @@ -0,0 +1,41 @@ +pub struct OptionAttr(Option<String>); + +impl OptionAttr { + pub fn none() -> Self { + OptionAttr(None) + } + + pub fn some(value: &str) -> Self { + let value = value.trim(); + match value.is_empty() { + true => OptionAttr(None), + false => OptionAttr(Some(value.to_owned())), + } + } + + pub fn with_value(&mut self, value: &str) { + let value = value.trim(); + self.0 = match value.is_empty() { + true => None, + false => Some(value.to_owned()), + }; + } + + pub fn value(&self) -> &str { + match &self.0 { + Some(value) => value.as_str(), + None => "", + } + } + + pub fn has_value(&self) -> bool { + match &self.0 { + Some(_) => true, + None => false, + } + } + + pub fn option(&self) -> &Option<String> { + &self.0 + } +} diff --git a/pagetop/src/html/optional_id.rs b/pagetop/src/html/optional_id.rs new file mode 100644 index 00000000..678ff5c8 --- /dev/null +++ b/pagetop/src/html/optional_id.rs @@ -0,0 +1,33 @@ +pub struct OptionId(Option<String>); + +impl OptionId { + pub fn none() -> Self { + OptionId(None) + } + + pub fn with_value(&mut self, id: &str) { + let id = id.trim(); + self.0 = match id.is_empty() { + true => None, + false => Some(id.replace(" ", "_")), + }; + } + + pub fn value(&self) -> &str { + match &self.0 { + Some(id) => id.as_str(), + None => "", + } + } + + pub fn has_value(&self) -> bool { + match &self.0 { + Some(_) => true, + None => false, + } + } + + pub fn option(&self) -> &Option<String> { + &self.0 + } +} diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 26151cab..630b8a9b 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -7,7 +7,7 @@ use std::any::type_name; pub trait PageComponent: Downcast + Send + Sync { - fn prepare() -> Self where Self: Sized; + fn new() -> Self where Self: Sized; fn name(&self) -> &'static str { let name = type_name::<Self>(); diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index eff38daa..1ccb9603 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,9 +1,8 @@ -use crate::{Lazy, app, trace, util}; +use crate::{Lazy, app, trace}; use crate::config::SETTINGS; -use crate::html::{DOCTYPE, Markup, html}; +use crate::html::{Classes, DOCTYPE, Markup, OptionAttr, html}; use crate::response::page::{PageAssets, PageComponent, PageContainer}; -use std::borrow::Cow; use std::sync::RwLock; use std::collections::HashMap; @@ -41,31 +40,31 @@ static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { pub enum TextDirection { Auto, LeftToRight, RightToLeft } pub struct Page<'a> { - language : Option<String>, - direction : Option<String>, - title : Option<String>, - description : Option<String>, + language : OptionAttr, + direction : OptionAttr, + title : OptionAttr, + description : OptionAttr, assets : PageAssets, - body_classes: Cow<'a, str>, + body_classes: Classes, regions : HashMap<&'a str, PageContainer>, template : String, } impl<'a> Page<'a> { - pub fn prepare() -> Self { + pub fn new() -> Self { Page { language : match &*DEFAULT_LANGUAGE { - Some(language) => Some(language.to_owned()), - _ => None, + Some(language) => OptionAttr::some(language), + _ => OptionAttr::none(), }, direction : match &*DEFAULT_DIRECTION { - Some(direction) => Some(direction.to_owned()), - _ => None, + Some(direction) => OptionAttr::some(direction), + _ => OptionAttr::none(), }, - title : None, - description : None, - body_classes: "body".into(), + title : OptionAttr::none(), + description : OptionAttr::none(), + body_classes: Classes::some_class("body"), assets : PageAssets::new(), regions : COMPONENTS.read().unwrap().clone(), template : "default".to_owned(), @@ -75,38 +74,36 @@ impl<'a> Page<'a> { // Page BUILDER. pub fn with_language(&mut self, language: &str) -> &mut Self { - self.language = util::valid_str(language); + self.language.with_value(language); self } pub fn with_direction(&mut self, dir: TextDirection) -> &mut Self { - self.direction = match dir { - TextDirection::Auto => Some("auto".to_owned()), - TextDirection::LeftToRight => Some("ltr".to_owned()), - TextDirection::RightToLeft => Some("rtl".to_owned()), - }; + self.direction.with_value(match dir { + TextDirection::Auto => "auto", + TextDirection::LeftToRight => "ltr", + TextDirection::RightToLeft => "rtl", + }); self } pub fn with_title(&mut self, title: &str) -> &mut Self { - self.title = util::valid_str(title); + self.title.with_value(title); self } pub fn with_description(&mut self, description: &str) -> &mut Self { - self.description = util::valid_str(description); + self.description.with_value(description); self } - pub fn with_body_classes(&mut self, body_classes: &'a str) -> &mut Self { - self.body_classes = body_classes.into(); + pub fn add_body_class(&mut self, class: &str) -> &mut Self { + self.body_classes.add_class(class); self } - pub fn add_body_classes(&mut self, body_classes: &'a str) -> &mut Self { - self.body_classes = String::from( - format!("{} {}", self.body_classes, body_classes).trim() - ).into(); + pub fn add_body_classes(&mut self, classes: Vec<String>) -> &mut Self { + self.body_classes.add_classes(classes); self } @@ -131,26 +128,23 @@ impl<'a> Page<'a> { // Page GETTERS. pub fn language(&self) -> &str { - util::assigned_str(&self.language) + self.language.value() } pub fn direction(&self) -> &str { - util::assigned_str(&self.direction) + self.direction.value() } pub fn title(&self) -> &str { - util::assigned_str(&self.title) + self.title.value() } pub fn description(&self) -> &str { - util::assigned_str(&self.description) + self.description.value() } - pub fn body_classes(&self) -> &str { - if self.body_classes.is_empty() { - return "body"; - } - &self.body_classes + pub fn body_classes(&mut self) -> &str { + self.body_classes.classes() } pub fn assets(&mut self) -> &mut PageAssets { @@ -176,7 +170,7 @@ impl<'a> Page<'a> { // Finalmente, renderizar la página. return Ok(html! { (DOCTYPE) - html lang=[&self.language] dir=[&self.direction] { + html lang=[&self.language.option()] dir=[&self.direction.option()] { (head) (body) } @@ -204,7 +198,7 @@ pub fn render_component( ) -> Markup { match component.is_renderable() { true => match assets.theme().render_component(component, assets) { - Some(markup) => markup, + Some(html) => html, None => component.default_render(assets) }, false => html! {} diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 733736e2..15f6566e 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -99,9 +99,9 @@ pub trait ThemeTrait: Send + Sync { } fn render_error_page(&self, s: app::http::StatusCode) -> app::Result<Markup> { - Page::prepare() + Page::new() .with_title(format!("Error {}", s.as_str()).as_str()) - .add_to("content", Chunck::markup(html! { + .add_to("content", Chunck::with(html! { div { h1 { (s) } } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 4ba4f76e..c2fd58d3 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -35,26 +35,3 @@ macro_rules! theme_static_files { } }}; } - -pub fn valid_id(id: &str) -> Option<String> { - let id = id.trim(); - match id.is_empty() { - true => None, - false => Some(id.replace(" ", "_").to_lowercase()), - } -} - -pub fn valid_str(s: &str) -> Option<String> { - let s = s.trim(); - match s.is_empty() { - true => None, - false => Some(s.to_owned()), - } -} - -pub fn assigned_str(optional: &Option<String>) -> &str { - match optional { - Some(o) => o.as_str(), - None => "", - } -} diff --git a/pagetop/static/bootsier/images/demo-header.svg b/pagetop/static/bootsier/images/demo-header.svg new file mode 100644 index 00000000..060757ee --- /dev/null +++ b/pagetop/static/bootsier/images/demo-header.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 317.059 189.688"><defs><style>.cls-1{isolation:isolate;}.cls-2{fill:url(#linear-gradient);}.cls-3{fill:#e0e3fd;}.cls-4{fill:#d1d4fc;}.cls-5{fill:#b2b8fa;}.cls-6{fill:#f3f4fe;}.cls-55,.cls-7{fill:#c1c6fb;}.cls-8{fill:#ffcebd;}.cls-9{fill:#ff5574;}.cls-10,.cls-145{fill:#191c3c;}.cls-11{fill:#6168ff;}.cls-12,.cls-22{fill:#fff;}.cls-13{fill:#4d5068;}.cls-14,.cls-18{fill:#231f20;}.cls-14{opacity:0.15;}.cls-15{fill:#474963;}.cls-16{fill:#75778a;}.cls-17{fill:#3b479a;}.cls-145,.cls-18{opacity:0.3;}.cls-19{fill:#ffc043;}.cls-20,.cls-30{fill:#f0f1fe;}.cls-21{mix-blend-mode:multiply;}.cls-22,.cls-66{opacity:0;}.cls-23,.cls-68{fill:#fdfdff;}.cls-23,.cls-67{opacity:0.024;}.cls-24,.cls-70{fill:#fbfcff;}.cls-24,.cls-69{opacity:0.049;}.cls-25,.cls-72{fill:#f9faff;}.cls-25,.cls-71{opacity:0.073;}.cls-26,.cls-74{fill:#f7f8ff;}.cls-26,.cls-73{opacity:0.098;}.cls-27,.cls-76{fill:#f6f6fe;}.cls-27,.cls-75{opacity:0.122;}.cls-28,.cls-78{fill:#f4f5fe;}.cls-28,.cls-77{opacity:0.146;}.cls-29,.cls-80{fill:#f2f3fe;}.cls-29,.cls-79{opacity:0.171;}.cls-30,.cls-81{opacity:0.195;}.cls-31,.cls-83{fill:#eeeffe;}.cls-31,.cls-82{opacity:0.22;}.cls-32,.cls-85{fill:#eceefe;}.cls-32,.cls-84{opacity:0.244;}.cls-33,.cls-87{fill:#eaecfe;}.cls-33,.cls-86{opacity:0.268;}.cls-34,.cls-89{fill:#e8eafe;}.cls-34,.cls-88{opacity:0.293;}.cls-35,.cls-91{fill:#e7e8fd;}.cls-35,.cls-90{opacity:0.317;}.cls-36,.cls-93{fill:#e5e7fd;}.cls-36,.cls-92{opacity:0.341;}.cls-37,.cls-95{fill:#e3e5fd;}.cls-37,.cls-94{opacity:0.366;}.cls-38,.cls-97{fill:#e1e3fd;}.cls-38,.cls-96{opacity:0.39;}.cls-39,.cls-99{fill:#dfe2fd;}.cls-39,.cls-98{opacity:0.415;}.cls-101,.cls-40{fill:#dde0fd;}.cls-100,.cls-40{opacity:0.439;}.cls-103,.cls-41{fill:#dbdefd;}.cls-102,.cls-41{opacity:0.463;}.cls-105,.cls-42{fill:#d9dcfd;}.cls-104,.cls-42{opacity:0.488;}.cls-107,.cls-43{fill:#d8dbfc;}.cls-106,.cls-43{opacity:0.512;}.cls-109,.cls-44{fill:#d6d9fc;}.cls-108,.cls-44{opacity:0.537;}.cls-111,.cls-45{fill:#d4d7fc;}.cls-110,.cls-45{opacity:0.561;}.cls-113,.cls-46{fill:#d2d5fc;}.cls-112,.cls-46{opacity:0.585;}.cls-115,.cls-47{fill:#d0d4fc;}.cls-114,.cls-47{opacity:0.61;}.cls-117,.cls-48{fill:#ced2fc;}.cls-116,.cls-48{opacity:0.634;}.cls-119,.cls-49{fill:#ccd0fc;}.cls-118,.cls-49{opacity:0.659;}.cls-121,.cls-50{fill:#cacffc;}.cls-120,.cls-50{opacity:0.683;}.cls-123,.cls-51{fill:#c9cdfb;}.cls-122,.cls-51{opacity:0.707;}.cls-125,.cls-52{fill:#c7cbfb;}.cls-124,.cls-52{opacity:0.732;}.cls-127,.cls-53{fill:#c5c9fb;}.cls-126,.cls-53{opacity:0.756;}.cls-129,.cls-54{fill:#c3c8fb;}.cls-128,.cls-54{opacity:0.78;}.cls-130,.cls-55{opacity:0.805;}.cls-132,.cls-56{fill:#bfc4fb;}.cls-131,.cls-56{opacity:0.829;}.cls-134,.cls-57{fill:#bdc2fb;}.cls-133,.cls-57{opacity:0.854;}.cls-136,.cls-58{fill:#bbc1fb;}.cls-135,.cls-58{opacity:0.878;}.cls-138,.cls-59{fill:#babffa;}.cls-137,.cls-59{opacity:0.902;}.cls-140,.cls-60{fill:#b8bdfa;}.cls-139,.cls-60{opacity:0.927;}.cls-142,.cls-61{fill:#b6bbfa;}.cls-141,.cls-61{opacity:0.951;}.cls-144,.cls-62{fill:#b4bafa;}.cls-143,.cls-62{opacity:0.976;}.cls-63{fill:#ffdfd6;}.cls-64{fill:#717386;}.cls-65{fill:#3a3c4e;}.cls-146{fill:#fe5e31;}.cls-147{opacity:0.35;}.cls-148{fill:#ff5f00;}.cls-149{fill:#ff7f33;}</style><linearGradient id="linear-gradient" x1="35.199" y1="214.99" x2="282.198" y2="54.991" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#dfe1fd"/><stop offset="0.454" stop-color="#ebecfe"/><stop offset="1" stop-color="#f4f5fe"/></linearGradient></defs><title>header-illustration</title><g class="cls-1"><g id="Graphics"><g id="Layer_8" data-name="Layer 8"><path class="cls-2" d="M311.36,131.746c5.5,8.781,8.206,19.733,2.628,28.063-4.8,7.174-14.327,10.048-19.137,17.218-2.43,3.621-3.709,8.358-7.5,10.507-2.33,1.32-5.145,1.355-7.822,1.355l-242.153.024c-2.706,0-5.518-.022-7.958-1.194-2.927-1.405-4.879-4.26-6.327-7.167a40.233,40.233,0,0,1,5.029-42.707c5.92-7.08,14.329-12.083,18.9-20.1,3.979-6.984,4.514-15.317,5.829-23.247C54.509,84.448,58.633,74.2,68.311,69.88c11.6-5.184,23.242-9.56,32.252-18.972,9.73-10.166,15.217-24.632,27.315-31.82,11.6-6.89,26.347-5.225,39.267-1.353s25.442,9.757,38.892,10.761c16.491,1.231,33.543-4.96,49.327-.024a37.007,37.007,0,0,1,23.519,22.784c5.28,15.178.224,32.69,6.431,47.513,4.646,11.1,14.781,18.742,22.455,28.006A46.526,46.526,0,0,1,311.36,131.746Z"/></g><g id="Layer_6" data-name="Layer 6"><rect class="cls-3" x="193.476" y="114.758" width="63.825" height="74.808" rx="3.34" ry="3.34"/><rect class="cls-4" x="198.555" y="120.566" width="53.667" height="17.333" rx="1.813" ry="1.813"/><rect class="cls-4" x="198.555" y="143.399" width="53.667" height="17.333" rx="1.813" ry="1.813"/><rect class="cls-4" x="198.555" y="166.233" width="53.667" height="17.333" rx="1.813" ry="1.813"/><circle class="cls-3" cx="225.389" cy="129.233" r="1.833"/><circle class="cls-3" cx="225.389" cy="152.162" r="1.833"/><circle class="cls-3" cx="225.389" cy="175.091" r="1.833"/><path class="cls-4" d="M77.631,80.66c-14.357,8.89-9.89,29.678-9.7,44.046q0.32,23.762.64,47.524a0.742,0.742,0,0,1-1.482,0q-0.383-28.4-.765-56.8c-0.18-13.368-2.467-27.989,10.556-36.053a0.742,0.742,0,0,1,.748,1.28h0Z"/><path class="cls-4" d="M69.658,87.891a18.1,18.1,0,0,1,2.316-3.934,19.26,19.26,0,0,1,5.607-4.1l0.3,0.16a17.793,17.793,0,0,1,1.172,9.617,10.681,10.681,0,0,1-5.521,7.682c-2.163,1.04-4.719,1.176-6.737,2.474C66.223,95.687,67.884,91.631,69.658,87.891Z"/><path class="cls-4" d="M54.619,62.676c14.259,5.656,11.19,27.286,11.765,39.475,0.974,20.671,1.5,41.341,1.366,62.037a0.742,0.742,0,0,1-1.482,0q0.169-25.811-.891-51.607c-0.326-7.769-.716-15.536-1.084-23.3-0.426-9.018-.011-21.184-10.068-25.173-0.876-.348-0.494-1.782.394-1.429h0Z"/><path class="cls-4" d="M64.38,87.554c0.026-.071.044-0.145,0.069-0.217a6.7,6.7,0,0,1,.577,1.09Z"/><path class="cls-4" d="M53.807,63.935a0.732,0.732,0,0,1,1.089-.492,15.576,15.576,0,0,1,9.887,9.88,21.46,21.46,0,0,1-.333,14.014c-1.772-2.8-5.372-4.2-7.893-6.519C52.082,76.7,51.395,69.519,53.807,63.935Z"/><path class="cls-5" d="M60.281,164.207h12.93a5.822,5.822,0,0,1,5.822,5.822V189a0,0,0,0,1,0,0H54.459a0,0,0,0,1,0,0V170.028A5.822,5.822,0,0,1,60.281,164.207Z" transform="translate(133.493 353.202) rotate(180)"/><path class="cls-4" d="M66.1,134.774c0.223-5.728.483-12.512-3.771-17-3.321-3.5-11.838-5.92-16.612-6.044a0.742,0.742,0,0,1,0-1.482c3.641,0.094,7.439,1.538,10.868,2.7,2.523,0.856,4.91,1.8,6.792,3.776,4.57,4.788,4.444,11.9,4.205,18.05a0.742,0.742,0,0,1-1.482,0h0Z"/><path class="cls-4" d="M44.119,109.65a0.463,0.463,0,0,1,.363-0.1l5.376,0.046a18.955,18.955,0,0,1,4.624.419c3.03,0.788,5.484,3.027,7.4,5.5l0.558,0.085c-2.8.892-5.542,2.063-8.462,2.367s-6.155-.436-7.984-2.732a11.122,11.122,0,0,1-1.926-5.2A0.462,0.462,0,0,1,44.119,109.65Z"/><g id="_Group_" data-name="&lt;Group&gt;"><g id="_Group_2" data-name="&lt;Group&gt;"><g id="_Group_3" data-name="&lt;Group&gt;"><path id="_Path_" data-name="&lt;Path&gt;" class="cls-3" d="M232.03,104.1H222.024v3.042a8.623,8.623,0,0,0,2.277,5.838h0V114.5h5.451v-1.518h0a8.623,8.623,0,0,0,2.277-5.838V104.1Z"/></g></g><g id="_Group_4" data-name="&lt;Group&gt;"><g id="_Group_5" data-name="&lt;Group&gt;"><path id="_Path_2" data-name="&lt;Path&gt;" class="cls-6" d="M229.972,104.1v3.042a8.623,8.623,0,0,1-2.277,5.838h0V114.5h1.176v-1.518h0a8.623,8.623,0,0,0,2.277-5.838V104.1h-1.176Z"/></g></g><g id="_Group_6" data-name="&lt;Group&gt;"><g id="_Group_7" data-name="&lt;Group&gt;"><g id="_Group_8" data-name="&lt;Group&gt;"><path id="_Path_3" data-name="&lt;Path&gt;" class="cls-3" d="M223.108,110.429h-1.646a2.714,2.714,0,1,1,0-5.428h1.058v1.15h-1.058a1.564,1.564,0,1,0,0,3.128h1.646v1.15Z"/></g></g></g><path id="_Path_4" data-name="&lt;Path&gt;" class="cls-4" d="M223.547,104.124v2.6a0.753,0.753,0,0,0,.753.753h0a0.753,0.753,0,0,0,.753-0.753v-0.1a0.641,0.641,0,0,1,.641-0.641h0a0.64,0.64,0,0,1,.64.641v4.247a0.736,0.736,0,0,0,.736.736h0a0.736,0.736,0,0,0,.736-0.736v-1.763a0.722,0.722,0,0,1,.722-0.722h0a0.75,0.75,0,0,0,.75-0.75v-3.513h-5.732Z"/></g><path class="cls-3" d="M292.388,141.31a11.256,11.256,0,0,0-.885-4.378,23.868,23.868,0,0,0-4.61,20.924l1.393,1.294a14.47,14.47,0,0,0,4.029-8.385A43.082,43.082,0,0,0,292.388,141.31Z"/><path class="cls-3" d="M305.092,149.429a0.734,0.734,0,0,0-.407-0.19,10.624,10.624,0,0,0-12.943,10.375l0.939,1.134c1.981,0.54,4.051-.469,5.695-1.7a20.268,20.268,0,0,0,6.714-8.856A0.759,0.759,0,0,0,305.092,149.429Z"/><path class="cls-3" d="M274.342,149.258c-2.106-1.711-4.557-3.384-7.266-3.219a0.861,0.861,0,0,0-.75.339c-0.3.561,0.652,0.984,0.836,1.591a2.282,2.282,0,0,1-.14,1.086,3.54,3.54,0,0,0,.328,1.974,15.509,15.509,0,0,0,16.114,9.324l0.824-1.294A73.172,73.172,0,0,0,274.342,149.258Z"/><path class="cls-3" d="M282.105,159.452c4.725,4.487,5.332,11.144,4.517,17.287-0.177,1.337,1.927,1.324,2.1,0,0.887-6.691-.026-13.924-5.133-18.773a1.052,1.052,0,0,0-1.487,1.487h0Z"/><path class="cls-3" d="M286.72,157.32c1,5.906-.275,11.872.356,17.806,0.142,1.332,2.246,1.346,2.1,0-0.652-6.129.6-12.257-.431-18.365-0.225-1.331-2.252-.767-2.028.559h0Z"/><path class="cls-3" d="M292.882,156.9a29.613,29.613,0,0,0-4.3,8.494c-0.88,3.311-.628,7.035-0.78,10.436a1.052,1.052,0,0,0,2.1,0c0.143-3.205-.089-6.762.705-9.877a27.463,27.463,0,0,1,4.085-7.992c0.752-1.129-1.068-2.183-1.816-1.061h0Z"/><path class="cls-5" d="M295.251,189.073H283.514a1.063,1.063,0,0,1-1.027-.791l-4-15.082a1.063,1.063,0,0,1,1.027-1.335h19.728a1.063,1.063,0,0,1,1.027,1.335l-4,15.082A1.063,1.063,0,0,1,295.251,189.073Z"/><path class="cls-7" d="M290.969,139.2c-1.563,5.891-1.576,12.034-3,17.952a0.152,0.152,0,0,0,.293.081c1.423-5.918,1.436-12.062,3-17.952a0.152,0.152,0,0,0-.293-0.081h0Z"/><path class="cls-7" d="M292.9,158.927a20.1,20.1,0,0,1,10.417-8.243c0.183-.064.1-0.358-0.081-0.293a20.431,20.431,0,0,0-10.6,8.383,0.152,0.152,0,0,0,.262.153h0Z"/><path class="cls-7" d="M267.778,147.92a12.182,12.182,0,0,0,4.69,5.493c3,2.1,6.853,3.135,9.6,5.49,0.173,0.149.427-.1,0.252-0.252-1.911-1.639-4.346-2.315-6.51-3.55-3.107-1.773-6.314-3.82-7.689-7.275-0.084-.211-0.429-0.119-0.344.095h0Z"/><rect class="cls-8" x="246.49" y="175.423" width="4.657" height="7.091" transform="translate(497.637 357.937) rotate(180)"/><path class="cls-9" d="M251.775,180.688a29.085,29.085,0,0,0,1.072,5.476,3.129,3.129,0,0,1,.366.911v2.613H242.2V188.3a2.971,2.971,0,0,1,.588-1.768c0.937-1.269,3.725-3.892,3.287-5.844h5.7Z"/><path class="cls-10" d="M251.749,180.688h0.026l-0.013.071C251.759,180.736,251.752,180.71,251.749,180.688Z"/><path class="cls-10" d="M253.213,187.8v1.884H242.2V188.3a2.935,2.935,0,0,1,.044-0.5h10.973Z"/><rect class="cls-10" x="246.856" y="182.174" width="3.035" height="0.68" rx="0.271" ry="0.271" transform="translate(496.747 365.028) rotate(180)"/><rect class="cls-10" x="246.49" y="183.691" width="3.035" height="0.68" rx="0.271" ry="0.271" transform="translate(496.015 368.063) rotate(180)"/><rect class="cls-8" x="276.786" y="175.423" width="4.657" height="7.091" transform="translate(558.229 357.937) rotate(180)"/><path class="cls-11" d="M268.728,115.127c-1.3,3.207-9.181,31.063-9.181,31.063l-7.106,33.372H245.5l3.58-37.87,2.616-40.211,15.044,1.79,2.721,7.45Z"/><polygon class="cls-11" points="284.494 109.055 284.06 142.656 282.407 179.562 275.797 179.562 273.134 150.138 266.742 115.49 266.742 103.271 283.234 104.785 284.494 109.055"/><path class="cls-8" d="M267.672,60.9h9.915V47.842H266.742C269.256,51.106,267.672,60.9,267.672,60.9Z"/><path class="cls-12" d="M283.234,107.54c-0.322,7.734-25.339-4.731-30.793-1.836l6.61-45.492s6.056-2.408,8.621-.526c3.535,2.594,9.915,0,9.915,0l4.453,1.767S283.509,100.93,283.234,107.54Z"/><path class="cls-9" d="M268.123,52.721s1.8,30.026-13.055,49.035c0,0-4.539,11.222-8.212,11.773,0,0-3.834-9.732.848-17.419,2.876-4.722,8.43-15.067,8.76-20.586l0.945-15.839Z"/><path class="cls-9" d="M277.587,52.721s-4.34,19.673-4.453,29.724c-0.092,8.171,12.6,35.42,12.6,35.42s7.833-8.175,3.7-17.624c-2.723-6.229-5.762-11.154-5.375-15.245l-0.1-28.117Z"/><path class="cls-8" d="M263.306,45.366a17.024,17.024,0,0,1,.725-3.887,3.15,3.15,0,0,0-1.136-.244,0.517,0.517,0,0,1-.322-0.856c1.206-1.343,3.415-3.539,3.783-4.343a6.387,6.387,0,0,1,.718-1.335,10.1,10.1,0,0,0,.565-0.992,1.768,1.768,0,0,1,1.21-.952,4.1,4.1,0,0,1,1.483.166,27.692,27.692,0,0,1,5.949,1.857,11.555,11.555,0,0,1,2.071,1.2A6.278,6.278,0,0,1,280.4,38.8a11.211,11.211,0,0,1,.015,5.97,5.147,5.147,0,0,1-.432,1.405,4.476,4.476,0,0,1-1.719,1.627c-1.181.725-2.409,1.369-3.646,1.991a13.466,13.466,0,0,1-2.285.975,13.119,13.119,0,0,1-3.989.32,6.321,6.321,0,0,1-3.034-.6,4.014,4.014,0,0,1-1.72-2.255A7.72,7.72,0,0,1,263.306,45.366Z"/><path class="cls-13" d="M266.378,27.073a12.941,12.941,0,0,0,6.894,2.494,36.564,36.564,0,0,1,7.327,1.18c1.456,0.494,3.722,1.408,4.421,2.9,0.979,2.091.822,5.194,0.285,7.371a10.972,10.972,0,0,1-2.288,4.5,12.452,12.452,0,0,1-4.347,2.914c-0.139.068-.276,0.138-0.413,0.212a2.111,2.111,0,0,1-.431.25c-0.277.057-.339-0.42-0.337-0.635a2.432,2.432,0,0,1,.381-1.191,7.178,7.178,0,0,1,.706-0.864A4.941,4.941,0,0,0,279.3,43.3a3.683,3.683,0,0,0-.094-1.485,1.4,1.4,0,0,0-1.037-.977,1.857,1.857,0,0,0-1.41.587,7.55,7.55,0,0,0-1.866,2.468q-0.041-1.307-.081-2.614a6.391,6.391,0,0,0-.225-1.784c-0.244-.751-0.774-1.487-0.586-2.254a8.052,8.052,0,0,0,.358-1.02,1.36,1.36,0,0,0-.79-1.253,5.035,5.035,0,0,0-1.513-.4c-0.81-.143-1.571-0.411-2.357-0.627a4.965,4.965,0,0,1-2.046-.979A3.945,3.945,0,0,1,266.52,30.9a10.716,10.716,0,0,1-.2-2.381A11.631,11.631,0,0,1,266.378,27.073Z"/><path class="cls-8" d="M296.132,74.122l5.327,13.74a4.852,4.852,0,0,1-.375,4.282L284.151,113.7l-3-4.51,10.859-17.183a5.137,5.137,0,0,0-.115-4.685l-5.26-9.255S293.01,80.442,296.132,74.122Z"/><path class="cls-8" d="M281.147,109.192l-1.939.345-1.34,1.234a1.208,1.208,0,0,0-.092,1.683l0.4,0.456-0.6.96a1.108,1.108,0,0,0,.08,1.287l1.873,2.3a1.108,1.108,0,0,0,1.444.242l2.03-1.26a1.9,1.9,0,0,0,.862-1.25l0.29-1.486Z"/><path class="cls-9" d="M282.071,180.688a6.575,6.575,0,0,0,1.623,5.476,1.385,1.385,0,0,1,.366.911v2.613H273.594V188.3a2.972,2.972,0,0,1,.588-1.768c0.937-1.269,2.623-3.892,2.186-5.844h5.7Z"/><path class="cls-10" d="M282.045,180.688h0.026l-0.013.071C282.055,180.736,282.048,180.71,282.045,180.688Z"/><path class="cls-10" d="M284.06,187.8v1.884H273.594V188.3a2.935,2.935,0,0,1,.044-0.5H284.06Z"/><rect class="cls-10" x="277.152" y="182.174" width="3.035" height="0.68" rx="0.271" ry="0.271" transform="translate(557.34 365.028) rotate(180)"/><rect class="cls-10" x="276.786" y="183.691" width="3.035" height="0.68" rx="0.271" ry="0.271" transform="translate(556.607 368.063) rotate(180)"/><path class="cls-9" d="M277.587,52.721l6.907,4.509,3.078,1.464a8.646,8.646,0,0,1,4.342,4.669l5.549,12.625c-6,1.163-6.243,6.58-10.515,5.57l-6.132-14.6-3.229-7.276V52.721Z"/><path class="cls-9" d="M268.123,52.721L261.2,55.692,257.34,56.7a8.194,8.194,0,0,0-5.395,4.551L245.5,74.062c4.131,0,8.425,5.535,9.089,4.467l7.918-13.886Z"/><path class="cls-14" d="M265.934,49.735a1.944,1.944,0,0,1,.96-1.934h0a1.04,1.04,0,0,0,.46-0.548l0.611-1.688a2.833,2.833,0,0,0,.138-1.38l-0.195-1.309a1.092,1.092,0,0,0-1.529-.835l-2.227,1.005-1.374,1.348-0.009.019a9.021,9.021,0,0,0,.293,3.519,4.479,4.479,0,0,0,1.919,2.516,4.217,4.217,0,0,0,1.1.417Z"/><path class="cls-8" d="M246.261,74.584l15.044-24.178V46.364a1.885,1.885,0,0,1,.565-1.346l1.7-1.662,2-.9a0.979,0.979,0,0,1,1.371.748l0.174,1.173a2.538,2.538,0,0,1-.124,1.237l-0.548,1.514a0.933,0.933,0,0,1-.412.491h0a1.743,1.743,0,0,0-.86,1.734l0.147,1.138,2.653,0.524-3.324,2.558L253.8,78.54a4.27,4.27,0,0,1-5.73,2.167h0A4.271,4.271,0,0,1,246.261,74.584Z"/><path class="cls-10" d="M166.722,186.321l0.008,0a0.488,0.488,0,0,0,.664-0.187l15.432-27.483a0.488,0.488,0,0,0-.186-0.665l-0.008,0a0.487,0.487,0,0,0-.664.186l-15.433,27.484A0.488,0.488,0,0,0,166.722,186.321Z"/><path class="cls-15" d="M129.607,186.1H169.1a1.041,1.041,0,0,1,1.041,1.041v1.2a1.042,1.042,0,0,1-1.042,1.042H129.606a1.041,1.041,0,0,1-1.041-1.041v-1.2a1.042,1.042,0,0,1,1.042-1.042Z" transform="translate(298.604 375.561) rotate(-179.969)"/><path class="cls-10" d="M128.565,187.615a1.5,1.5,0,0,1,.371-0.966,1.528,1.528,0,0,0,1.526,1.522l38.517,0.021a1.5,1.5,0,0,0,1.158-.561v0.235a1.529,1.529,0,0,1-1.53,1.528l-38.517-.021a1.529,1.529,0,0,1-1.528-1.53v-0.228Z"/><rect class="cls-16" x="139.329" y="186.971" width="3.022" height="1.159"/><rect class="cls-16" x="135.748" y="186.969" width="3.022" height="1.159"/><rect class="cls-16" x="161.172" y="186.983" width="3.022" height="1.159"/><rect class="cls-8" x="19.685" y="154.12" width="6.235" height="9.087" transform="translate(-87.475 42.332) rotate(-35.292)"/><path class="cls-11" d="M19.067,158.782L6.534,160.109,3.793,161.65a1.829,1.829,0,0,1-2.389-.537l-1.085-1.532,17.672-12.509a2.185,2.185,0,0,1,3.046.521l0.976,1.379a11.216,11.216,0,0,1,1.94,4.839l0.2,1.369h0a2.483,2.483,0,0,0-3.461-.592l-1.036.733a2.483,2.483,0,0,0-.592,3.461h0Z"/><path class="cls-13" d="M18.995,148.552L1.658,160.823A0.766,0.766,0,0,1,.59,160.64L0,159.806l17.962-12.714a2.2,2.2,0,0,1,3.075.5l0.976,1.379c0.012,0.017.021,0.036,0.032,0.053A2.2,2.2,0,0,0,18.995,148.552Z"/><polygon class="cls-17" points="50.007 185.331 48.228 181.081 25.909 156.76 20.159 161.062 41.408 189.463 45.444 187.549 50.007 185.331"/><rect class="cls-8" x="46.36" y="151.731" width="6.235" height="9.087" transform="translate(35.289 -7.03) rotate(12.602)"/><path class="cls-11" d="M46.885,153.583L37.5,145.175l-2.981-1a1.829,1.829,0,0,1-1.2-2.133l0.41-1.832,21.129,4.724a2.185,2.185,0,0,1,1.655,2.609l-0.369,1.649a11.216,11.216,0,0,1-2.289,4.684l-0.88,1.068h0a2.483,2.483,0,0,0-1.881-2.965L49.85,151.7a2.483,2.483,0,0,0-2.965,1.881h0Z"/><path class="cls-13" d="M54.462,146.678l-20.828-4.7a0.775,0.775,0,0,1-.586-0.925l0.221-.989,21.583,4.869a2.185,2.185,0,0,1,1.656,2.609l-0.369,1.649c0,0.02-.013.039-0.017,0.059A2.183,2.183,0,0,0,54.462,146.678Z"/><path class="cls-18" d="M45.51,178.118l-7.739-8.433-3.947,9.64L41.4,189.454h0.026l4.017-1.905,4.563-2.217-1.779-4.251-1.305-1.423a1.119,1.119,0,0,1-1.466-1.348Z"/><path class="cls-17" d="M79.44,169.065l-2.555.229a47.964,47.964,0,0,0-17.564,5.069l-10.267,5.251a1.126,1.126,0,0,1-1.6-1.3l6.518-23.525h-8.1L35.72,179.578a7.169,7.169,0,0,0,6.783,9.883l39.17-.315Z"/><path class="cls-11" d="M120.372,174.029l-3.9,6.323a6.105,6.105,0,0,1-8,2.223l-1.948-1.005-11.65,5.158a18.047,18.047,0,0,1-6.471,1.526L78.8,189.526s-5.245-12.8-1.081-20.9h0a32.21,32.21,0,0,0,27.79-5.749l8.148-6.326Z"/><polygon class="cls-8" points="130.051 162.437 121.602 168.622 120.372 163.112 126.449 157.384 130.051 162.437"/><path class="cls-8" d="M124.414,159.355c-0.075-2.366,1.679-3.555,3.413-4.4a23.454,23.454,0,0,1,12.3-2.263l1.006,0.244a8.506,8.506,0,0,1-.764,3.611,9.272,9.272,0,0,0,.079,4.639,0.2,0.2,0,0,1-.18.28,14.26,14.26,0,0,0-2.346.163c-0.222.368-.38,0.771-0.57,1.157a5.567,5.567,0,0,1-.849,1.371c-1.112,1.2-2.99,1.186-4.608.959-2.289-.322-4.652-0.956-6.224-2.727A4.857,4.857,0,0,1,124.414,159.355Z"/><path class="cls-8" d="M122.982,165.822l2.664,15.366a1.93,1.93,0,0,0,1.642,1.582l22.92,2.492,4.864,0.769,4.443,1.164,3.51,0.112h0a1.9,1.9,0,0,1-1.6,1.995h-2.588L152.671,189l-27.963.69a4.657,4.657,0,0,1-4.494-3.013l-7.606-20.185Z"/><path class="cls-19" d="M102.559,164.849a12.2,12.2,0,0,1,2.525-3.536,16.731,16.731,0,0,1,3.291-2.827c1.775-1.1,3.563-1.41,5.154-2.823a17.06,17.06,0,0,0,3.685-4.649c0.49-.909.9-1.863,1.436-2.745a12.5,12.5,0,0,1,8.029-5.4,26.361,26.361,0,0,1,5.684-.879,20.341,20.341,0,0,1,6.441,1.141,10.543,10.543,0,0,1,4.128,2.163,5.072,5.072,0,0,1,1.19,5.222,5.5,5.5,0,0,1-.9,2c-1.644,2.178-5.16,2.3-7.631,2.85-1.526.337-3.134-.15-4.606,0.46a9.724,9.724,0,0,0-3.2,2.781,25.882,25.882,0,0,0-3.654,4.753c-0.52.951-.918,1.962-1.361,2.951a17.719,17.719,0,0,1-5.915,7.7,10.357,10.357,0,0,1-10.746.608C102.844,172.706,101.092,168.337,102.559,164.849Z"/><rect id="_Rectangle_" data-name="&lt;Rectangle&gt;" class="cls-12" x="125.891" y="36.047" width="76.607" height="92.263" rx="2.858" ry="2.858"/><path id="_Path_5" data-name="&lt;Path&gt;" class="cls-9" d="M202.5,45.795V38.7a2.654,2.654,0,0,0-2.654-2.654h-71.3a2.654,2.654,0,0,0-2.654,2.654v7.093H202.5Z"/><circle id="_Path_6" data-name="&lt;Path&gt;" class="cls-12" cx="131.696" cy="40.921" r="0.836"/><circle id="_Path_7" data-name="&lt;Path&gt;" class="cls-12" cx="135.446" cy="40.921" r="0.836"/><circle id="_Path_8" data-name="&lt;Path&gt;" class="cls-12" cx="139.196" cy="40.921" r="0.836"/><circle class="cls-3" cx="141.137" cy="90.542" r="6.833"/><circle class="cls-3" cx="141.137" cy="109.192" r="6.833"/><rect class="cls-20" x="155.946" y="86.125" width="38.012" height="1.417"/><rect class="cls-20" x="155.946" y="91.708" width="21" height="1.417"/><rect class="cls-20" x="155.946" y="104.958" width="38.012" height="1.417"/><rect class="cls-20" x="155.946" y="110.542" width="21" height="1.417"/><circle class="cls-3" cx="141.137" cy="70.542" r="6.833"/><rect class="cls-20" x="155.946" y="66.125" width="38.012" height="1.417"/><rect class="cls-20" x="155.946" y="71.708" width="21" height="1.417"/><g class="cls-21"><path class="cls-22" d="M199.951,35.974H181.774V69.4a4.938,4.938,0,0,0,4.938,4.938H202.5V38.521A2.547,2.547,0,0,0,199.951,35.974Z"/><path class="cls-23" d="M199.969,35.974H181.915V69.311a4.9,4.9,0,0,0,4.9,4.9H202.5V38.5A2.529,2.529,0,0,0,199.969,35.974Z"/><path class="cls-24" d="M199.986,35.974H182.055V69.226a4.871,4.871,0,0,0,4.871,4.871H202.5V38.486A2.512,2.512,0,0,0,199.986,35.974Z"/><path class="cls-25" d="M200,35.974H182.2V69.141a4.838,4.838,0,0,0,4.838,4.838H202.5V38.469A2.5,2.5,0,0,0,200,35.974Z"/><path class="cls-26" d="M200.02,35.974H182.336V69.056a4.8,4.8,0,0,0,4.8,4.8H202.5V38.452A2.478,2.478,0,0,0,200.02,35.974Z"/><path class="cls-27" d="M200.038,35.974H182.476v33a4.771,4.771,0,0,0,4.771,4.771H202.5V38.434A2.46,2.46,0,0,0,200.038,35.974Z"/><path class="cls-28" d="M200.055,35.974H182.617V68.887a4.737,4.737,0,0,0,4.737,4.737H202.5V38.417A2.443,2.443,0,0,0,200.055,35.974Z"/><path class="cls-29" d="M200.072,35.974H182.757V68.8a4.7,4.7,0,0,0,4.7,4.7H202.5V38.4A2.426,2.426,0,0,0,200.072,35.974Z"/><path class="cls-30" d="M200.089,35.974H182.9V68.718a4.67,4.67,0,0,0,4.67,4.67H202.5V38.383A2.409,2.409,0,0,0,200.089,35.974Z"/><path class="cls-31" d="M200.107,35.974H183.038V68.633a4.637,4.637,0,0,0,4.637,4.637H202.5v-34.9A2.391,2.391,0,0,0,200.107,35.974Z"/><path class="cls-32" d="M200.124,35.974H183.178V68.548a4.6,4.6,0,0,0,4.6,4.6H202.5v-34.8A2.374,2.374,0,0,0,200.124,35.974Z"/><path class="cls-33" d="M200.141,35.974H183.319V68.463a4.57,4.57,0,0,0,4.57,4.57H202.5v-34.7A2.357,2.357,0,0,0,200.141,35.974Z"/><path class="cls-34" d="M200.158,35.974h-16.7v32.4A4.536,4.536,0,0,0,188,72.915h14.5v-34.6A2.34,2.34,0,0,0,200.158,35.974Z"/><path class="cls-35" d="M200.176,35.974H183.6v32.32a4.5,4.5,0,0,0,4.5,4.5h14.4V38.3A2.322,2.322,0,0,0,200.176,35.974Z"/><path class="cls-36" d="M200.193,35.974H183.74V68.209a4.47,4.47,0,0,0,4.47,4.47H202.5v-34.4A2.305,2.305,0,0,0,200.193,35.974Z"/><path class="cls-37" d="M200.21,35.974H183.88v32.15a4.436,4.436,0,0,0,4.436,4.436H202.5v-34.3A2.288,2.288,0,0,0,200.21,35.974Z"/><path class="cls-38" d="M200.227,35.974H184.021V68.04a4.4,4.4,0,0,0,4.4,4.4H202.5v-34.2A2.271,2.271,0,0,0,200.227,35.974Z"/><path class="cls-39" d="M200.245,35.974H184.161V67.955a4.369,4.369,0,0,0,4.369,4.369H202.5v-34.1A2.253,2.253,0,0,0,200.245,35.974Z"/><path class="cls-40" d="M200.262,35.974H184.3v31.9a4.336,4.336,0,0,0,4.336,4.336H202.5v-34A2.236,2.236,0,0,0,200.262,35.974Z"/><path class="cls-41" d="M200.279,35.974H184.442V67.786a4.3,4.3,0,0,0,4.3,4.3H202.5v-33.9A2.219,2.219,0,0,0,200.279,35.974Z"/><path class="cls-42" d="M200.3,35.974H184.582V67.7a4.269,4.269,0,0,0,4.269,4.269H202.5V38.176A2.2,2.2,0,0,0,200.3,35.974Z"/><path class="cls-43" d="M200.314,35.974H184.723V67.616a4.235,4.235,0,0,0,4.235,4.235H202.5V38.158A2.184,2.184,0,0,0,200.314,35.974Z"/><path class="cls-44" d="M200.331,35.974H184.863V67.532a4.2,4.2,0,0,0,4.2,4.2H202.5V38.141A2.167,2.167,0,0,0,200.331,35.974Z"/><path class="cls-45" d="M200.348,35.974H185V67.447a4.168,4.168,0,0,0,4.168,4.168H202.5V38.124A2.15,2.15,0,0,0,200.348,35.974Z"/><path class="cls-46" d="M200.365,35.974H185.144V67.362a4.135,4.135,0,0,0,4.135,4.135H202.5V38.107A2.132,2.132,0,0,0,200.365,35.974Z"/><path class="cls-47" d="M200.383,35.974h-15.1v31.3a4.1,4.1,0,0,0,4.1,4.1H202.5V38.089A2.115,2.115,0,0,0,200.383,35.974Z"/><path class="cls-48" d="M200.4,35.974H185.424V67.193a4.068,4.068,0,0,0,4.068,4.068H202.5V38.072A2.1,2.1,0,0,0,200.4,35.974Z"/><path class="cls-49" d="M200.417,35.974H185.565V67.108a4.035,4.035,0,0,0,4.035,4.035h12.9V38.055A2.081,2.081,0,0,0,200.417,35.974Z"/><path class="cls-50" d="M200.434,35.974H185.705V67.023a4,4,0,0,0,4,4H202.5V38.038A2.063,2.063,0,0,0,200.434,35.974Z"/><path class="cls-51" d="M200.452,35.974H185.846V66.938a3.968,3.968,0,0,0,3.968,3.968H202.5V38.02A2.046,2.046,0,0,0,200.452,35.974Z"/><path class="cls-52" d="M200.469,35.974H185.986v30.88a3.934,3.934,0,0,0,3.934,3.934H202.5V38A2.029,2.029,0,0,0,200.469,35.974Z"/><path class="cls-53" d="M200.486,35.974h-14.36V66.769a3.9,3.9,0,0,0,3.9,3.9H202.5V37.986A2.012,2.012,0,0,0,200.486,35.974Z"/><path class="cls-54" d="M200.5,35.974H186.267v30.71a3.867,3.867,0,0,0,3.867,3.867H202.5V37.969A1.994,1.994,0,0,0,200.5,35.974Z"/><path class="cls-55" d="M200.521,35.974H186.407V66.6a3.834,3.834,0,0,0,3.834,3.834H202.5V37.951A1.977,1.977,0,0,0,200.521,35.974Z"/><path class="cls-56" d="M200.538,35.974h-13.99V66.515a3.8,3.8,0,0,0,3.8,3.8H202.5V37.934A1.96,1.96,0,0,0,200.538,35.974Z"/><path class="cls-57" d="M200.555,35.974H186.688V66.43a3.767,3.767,0,0,0,3.767,3.767H202.5V37.917A1.943,1.943,0,0,0,200.555,35.974Z"/><path class="cls-58" d="M200.572,35.974H186.828V66.345a3.734,3.734,0,0,0,3.734,3.734H202.5V37.9A1.925,1.925,0,0,0,200.572,35.974Z"/><path class="cls-59" d="M200.59,35.974H186.969V66.261a3.7,3.7,0,0,0,3.7,3.7H202.5V37.882A1.908,1.908,0,0,0,200.59,35.974Z"/><path class="cls-60" d="M200.607,35.974h-13.5v30.2a3.667,3.667,0,0,0,3.667,3.667H202.5V37.865A1.891,1.891,0,0,0,200.607,35.974Z"/><path class="cls-61" d="M200.624,35.974H187.25V66.091a3.633,3.633,0,0,0,3.633,3.633H202.5V37.848A1.874,1.874,0,0,0,200.624,35.974Z"/><path class="cls-62" d="M200.641,35.974H187.39V66.007a3.6,3.6,0,0,0,3.6,3.6H202.5V37.831A1.856,1.856,0,0,0,200.641,35.974Z"/><path class="cls-5" d="M200.659,35.974H187.53V65.922a3.566,3.566,0,0,0,3.566,3.566h11.4V37.813A1.839,1.839,0,0,0,200.659,35.974Z"/></g><rect class="cls-12" x="186.896" y="22.275" width="55.3" height="48.256" rx="5.147" ry="5.147"/><path class="cls-9" d="M237.591,22.275H191.5a4.6,4.6,0,0,0-4.6,4.6v5.243h55.3V26.88A4.6,4.6,0,0,0,237.591,22.275Z"/><circle class="cls-12" cx="193.115" cy="27.199" r="0.844"/><circle class="cls-12" cx="196.779" cy="27.199" r="0.844"/><circle class="cls-12" cx="196.779" cy="27.199" r="0.844"/><circle class="cls-12" cx="200.444" cy="27.199" r="0.844"/><circle class="cls-4" cx="197.623" cy="45.032" r="6.596"/><rect class="cls-20" x="207.772" y="41.479" width="30.204" height="1.777"/><rect class="cls-20" x="207.772" y="46.652" width="30.204" height="1.777"/><rect class="cls-63" x="207.772" y="51.825" width="11.326" height="1.777"/><path class="cls-19" d="M286.646,9.058a9.058,9.058,0,1,0-14.01,7.579v5.78h9.9v-5.78A9.045,9.045,0,0,0,286.646,9.058Z"/><polygon id="_Path_9" data-name="&lt;Path&gt;" class="cls-13" points="283.182 22.821 279.888 25.575 274.986 25.575 271.993 22.821 271.993 18.494 283.182 18.494 283.182 22.821"/><rect id="_Rectangle_2" data-name="&lt;Rectangle&gt;" class="cls-64" x="271.507" y="18.889" width="12.137" height="0.83" rx="0.365" ry="0.365"/><rect id="_Rectangle_3" data-name="&lt;Rectangle&gt;" class="cls-64" x="271.507" y="20.275" width="12.137" height="0.83" rx="0.365" ry="0.365"/><rect id="_Rectangle_4" data-name="&lt;Rectangle&gt;" class="cls-64" x="271.507" y="21.662" width="12.137" height="0.83" rx="0.365" ry="0.365"/><path id="_Rectangle_5" data-name="&lt;Rectangle&gt;" class="cls-65" d="M274.845,25.446h5.082a0,0,0,0,1,0,0v0.2a1.43,1.43,0,0,1-1.43,1.43h-2.222a1.43,1.43,0,0,1-1.43-1.43v-0.2A0,0,0,0,1,274.845,25.446Z"/><polygon class="cls-12" points="277.022 11.422 274.702 9.103 275.409 8.396 277.022 10.008 280.55 6.48 281.257 7.186 277.022 11.422"/><path class="cls-22" d="M152.4,54.256H125.891V84.768H152.4a3.55,3.55,0,0,0,3.55-3.55V57.806A3.55,3.55,0,0,0,152.4,54.256Z"/><path class="cls-23" d="M152.258,54.256H125.891V84.608h26.367a3.531,3.531,0,0,0,3.531-3.531V57.787A3.531,3.531,0,0,0,152.258,54.256Z"/><path class="cls-24" d="M152.119,54.256H125.891V84.449h26.228a3.513,3.513,0,0,0,3.513-3.513V57.769A3.513,3.513,0,0,0,152.119,54.256Z"/><path class="cls-25" d="M151.981,54.256h-26.09V84.29h26.09a3.494,3.494,0,0,0,3.494-3.494V57.75A3.494,3.494,0,0,0,151.981,54.256Z"/><path class="cls-26" d="M151.842,54.256H125.891V84.13h25.951a3.476,3.476,0,0,0,3.476-3.476V57.732A3.476,3.476,0,0,0,151.842,54.256Z"/><path class="cls-27" d="M151.7,54.256H125.891V83.971H151.7a3.457,3.457,0,0,0,3.457-3.457v-22.8A3.457,3.457,0,0,0,151.7,54.256Z"/><path class="cls-28" d="M151.565,54.256H125.891V83.812h25.674A3.438,3.438,0,0,0,155,80.373V57.695A3.438,3.438,0,0,0,151.565,54.256Z"/><path class="cls-29" d="M151.427,54.256H125.891v29.4h25.536a3.42,3.42,0,0,0,3.42-3.42V57.676A3.42,3.42,0,0,0,151.427,54.256Z"/><path class="cls-30" d="M151.288,54.256h-25.4V83.493h25.4a3.4,3.4,0,0,0,3.4-3.4V57.657A3.4,3.4,0,0,0,151.288,54.256Z"/><path class="cls-31" d="M151.15,54.256H125.891V83.333H151.15a3.383,3.383,0,0,0,3.383-3.383V57.639A3.383,3.383,0,0,0,151.15,54.256Z"/><path class="cls-32" d="M151.012,54.256H125.891V83.174h25.121a3.364,3.364,0,0,0,3.364-3.364V57.62A3.364,3.364,0,0,0,151.012,54.256Z"/><path class="cls-33" d="M150.873,54.256H125.891V83.015h24.982a3.346,3.346,0,0,0,3.346-3.346V57.6A3.346,3.346,0,0,0,150.873,54.256Z"/><path class="cls-34" d="M150.735,54.256H125.891v28.6h24.844a3.327,3.327,0,0,0,3.327-3.327V57.583A3.327,3.327,0,0,0,150.735,54.256Z"/><path class="cls-35" d="M150.6,54.256H125.891V82.7H150.6a3.309,3.309,0,0,0,3.309-3.309V57.565A3.309,3.309,0,0,0,150.6,54.256Z"/><path class="cls-36" d="M150.458,54.256H125.891V82.536h24.567a3.29,3.29,0,0,0,3.29-3.29v-21.7A3.29,3.29,0,0,0,150.458,54.256Z"/><path class="cls-37" d="M150.319,54.256H125.891V82.377h24.428a3.272,3.272,0,0,0,3.272-3.272V57.528A3.272,3.272,0,0,0,150.319,54.256Z"/><path class="cls-38" d="M150.181,54.256h-24.29V82.218h24.29a3.253,3.253,0,0,0,3.253-3.253V57.509A3.253,3.253,0,0,0,150.181,54.256Z"/><path class="cls-39" d="M150.042,54.256H125.891v27.8h24.151a3.235,3.235,0,0,0,3.234-3.235V57.491A3.235,3.235,0,0,0,150.042,54.256Z"/><path class="cls-40" d="M149.9,54.256H125.891V81.9H149.9a3.216,3.216,0,0,0,3.216-3.216V57.472A3.216,3.216,0,0,0,149.9,54.256Z"/><path class="cls-41" d="M149.765,54.256H125.891V81.74h23.875a3.2,3.2,0,0,0,3.2-3.2V57.453A3.2,3.2,0,0,0,149.765,54.256Z"/><path class="cls-42" d="M149.627,54.256H125.891V81.58h23.736a3.179,3.179,0,0,0,3.179-3.179V57.435A3.179,3.179,0,0,0,149.627,54.256Z"/><path class="cls-43" d="M149.488,54.256h-23.6V81.421h23.6a3.16,3.16,0,0,0,3.16-3.16V57.416A3.16,3.16,0,0,0,149.488,54.256Z"/><path class="cls-44" d="M149.35,54.256H125.891V81.261H149.35a3.142,3.142,0,0,0,3.142-3.142V57.4A3.142,3.142,0,0,0,149.35,54.256Z"/><path class="cls-45" d="M149.212,54.256H125.891V81.1h23.321a3.123,3.123,0,0,0,3.123-3.123v-20.6A3.123,3.123,0,0,0,149.212,54.256Z"/><path class="cls-46" d="M149.073,54.256H125.891V80.943h23.182a3.1,3.1,0,0,0,3.1-3.1V57.361A3.1,3.1,0,0,0,149.073,54.256Z"/><path class="cls-47" d="M148.935,54.256H125.891V80.783h23.044a3.086,3.086,0,0,0,3.086-3.086V57.342A3.086,3.086,0,0,0,148.935,54.256Z"/><path class="cls-48" d="M148.8,54.256H125.891V80.624H148.8a3.068,3.068,0,0,0,3.068-3.068V57.324A3.068,3.068,0,0,0,148.8,54.256Z"/><path class="cls-49" d="M148.658,54.256H125.891V80.464h22.767a3.049,3.049,0,0,0,3.049-3.049V57.305A3.049,3.049,0,0,0,148.658,54.256Z"/><path class="cls-50" d="M148.519,54.256H125.891V80.305h22.628a3.031,3.031,0,0,0,3.031-3.031V57.287A3.031,3.031,0,0,0,148.519,54.256Z"/><path class="cls-51" d="M148.381,54.256h-22.49v25.89h22.49a3.012,3.012,0,0,0,3.012-3.012V57.268A3.012,3.012,0,0,0,148.381,54.256Z"/><path class="cls-52" d="M148.242,54.256H125.891v25.73h22.351a2.994,2.994,0,0,0,2.994-2.993V57.249A2.994,2.994,0,0,0,148.242,54.256Z"/><path class="cls-53" d="M148.1,54.256H125.891V79.827H148.1a2.975,2.975,0,0,0,2.975-2.975V57.231A2.975,2.975,0,0,0,148.1,54.256Z"/><path class="cls-54" d="M147.965,54.256H125.891V79.668h22.075a2.957,2.957,0,0,0,2.956-2.957v-19.5A2.956,2.956,0,0,0,147.965,54.256Z"/><path class="cls-55" d="M147.827,54.256H125.891V79.508h21.936a2.938,2.938,0,0,0,2.938-2.938V57.194A2.938,2.938,0,0,0,147.827,54.256Z"/><path class="cls-56" d="M147.689,54.256h-21.8V79.349h21.8a2.919,2.919,0,0,0,2.919-2.919V57.175A2.919,2.919,0,0,0,147.689,54.256Z"/><path class="cls-57" d="M147.55,54.256H125.891V79.189H147.55a2.9,2.9,0,0,0,2.9-2.9V57.157A2.9,2.9,0,0,0,147.55,54.256Z"/><path class="cls-58" d="M147.412,54.256H125.891V79.03h21.521a2.882,2.882,0,0,0,2.882-2.882V57.138A2.882,2.882,0,0,0,147.412,54.256Z"/><path class="cls-59" d="M147.273,54.256H125.891V78.871h21.382a2.864,2.864,0,0,0,2.864-2.864V57.12A2.864,2.864,0,0,0,147.273,54.256Z"/><path class="cls-60" d="M147.135,54.256H125.891V78.711h21.244a2.845,2.845,0,0,0,2.845-2.845V57.1A2.845,2.845,0,0,0,147.135,54.256Z"/><path class="cls-61" d="M147,54.256H125.891v24.3H147a2.827,2.827,0,0,0,2.827-2.827V57.083A2.827,2.827,0,0,0,147,54.256Z"/><path class="cls-62" d="M146.858,54.256H125.891V78.392h20.967a2.808,2.808,0,0,0,2.808-2.808V57.064A2.808,2.808,0,0,0,146.858,54.256Z"/><path class="cls-5" d="M146.719,54.256H125.891V78.233h20.828a2.79,2.79,0,0,0,2.79-2.79v-18.4A2.79,2.79,0,0,0,146.719,54.256Z"/><rect class="cls-12" x="100.573" y="49.764" width="50.635" height="29.763" rx="3.463" ry="3.463"/><circle id="_Path_10" data-name="&lt;Path&gt;" class="cls-9" cx="113.674" cy="64.645" r="8.194"/><path id="_Path_11" data-name="&lt;Path&gt;" class="cls-12" d="M116.7,65.108l-5.273,3.044a0.534,0.534,0,0,1-.8-0.462V61.6a0.534,0.534,0,0,1,.8-0.462l5.273,3.044A0.534,0.534,0,0,1,116.7,65.108Z"/><rect class="cls-20" x="124.866" y="58.066" width="22.464" height="2"/><rect class="cls-20" x="124.866" y="63.645" width="22.464" height="2"/><rect class="cls-11" x="124.866" y="69.224" width="11.232" height="2"/><g class="cls-66"><path class="cls-12" d="M202.5,83.625H184.636a2.188,2.188,0,0,0-2.188,2.188v20.966a2.188,2.188,0,0,0,2.188,2.188H202.5V83.625Z"/></g><g class="cls-67"><path class="cls-68" d="M202.5,83.625H184.755a2.173,2.173,0,0,0-2.173,2.173v20.826a2.173,2.173,0,0,0,2.173,2.173H202.5V83.625Z"/></g><g class="cls-69"><path class="cls-70" d="M202.5,83.625H184.874a2.159,2.159,0,0,0-2.159,2.159V106.47a2.158,2.158,0,0,0,2.159,2.159H202.5v-25Z"/></g><g class="cls-71"><path class="cls-72" d="M202.5,83.625h-17.5a2.144,2.144,0,0,0-2.144,2.144v20.546a2.144,2.144,0,0,0,2.144,2.144h17.5V83.625Z"/></g><g class="cls-73"><path class="cls-74" d="M202.5,83.625H185.113a2.129,2.129,0,0,0-2.13,2.129v20.407a2.129,2.129,0,0,0,2.13,2.129H202.5V83.625Z"/></g><g class="cls-75"><path class="cls-76" d="M202.5,83.625H185.232a2.115,2.115,0,0,0-2.115,2.115v20.267a2.115,2.115,0,0,0,2.115,2.115H202.5v-24.5Z"/></g><g class="cls-77"><path class="cls-78" d="M202.5,83.625H185.351a2.1,2.1,0,0,0-2.1,2.1v20.127a2.1,2.1,0,0,0,2.1,2.1H202.5V83.625Z"/></g><g class="cls-79"><path class="cls-80" d="M202.5,83.625H185.47a2.086,2.086,0,0,0-2.086,2.086V105.7a2.086,2.086,0,0,0,2.086,2.086H202.5V83.625Z"/></g><g class="cls-81"><path class="cls-20" d="M202.5,83.625H185.589a2.071,2.071,0,0,0-2.071,2.071v19.847a2.071,2.071,0,0,0,2.071,2.071H202.5V83.625Z"/></g><g class="cls-82"><path class="cls-83" d="M202.5,83.625H185.708a2.057,2.057,0,0,0-2.056,2.057v19.707a2.056,2.056,0,0,0,2.056,2.056H202.5V83.625Z"/></g><g class="cls-84"><path class="cls-85" d="M202.5,83.625h-16.67a2.042,2.042,0,0,0-2.042,2.042v19.567a2.042,2.042,0,0,0,2.042,2.042H202.5V83.625Z"/></g><g class="cls-86"><path class="cls-87" d="M202.5,83.625H185.947a2.027,2.027,0,0,0-2.027,2.027V105.08a2.027,2.027,0,0,0,2.027,2.027H202.5V83.625Z"/></g><g class="cls-88"><path class="cls-89" d="M202.5,83.625H186.066a2.013,2.013,0,0,0-2.013,2.013v19.288a2.013,2.013,0,0,0,2.013,2.013H202.5V83.625Z"/></g><g class="cls-90"><path class="cls-91" d="M202.5,83.625H186.185a2,2,0,0,0-2,2v19.148a2,2,0,0,0,2,2H202.5V83.625Z"/></g><g class="cls-92"><path class="cls-93" d="M202.5,83.625H186.3a1.984,1.984,0,0,0-1.984,1.984v19.008A1.983,1.983,0,0,0,186.3,106.6H202.5V83.625Z"/></g><g class="cls-94"><path class="cls-95" d="M202.5,83.625H186.423a1.969,1.969,0,0,0-1.969,1.969v18.868a1.969,1.969,0,0,0,1.969,1.969H202.5V83.625Z"/></g><g class="cls-96"><path class="cls-97" d="M202.5,83.625H186.543a1.954,1.954,0,0,0-1.954,1.954v18.728a1.954,1.954,0,0,0,1.954,1.954H202.5V83.625Z"/></g><g class="cls-98"><path class="cls-99" d="M202.5,83.625H186.662a1.94,1.94,0,0,0-1.94,1.94v18.588a1.94,1.94,0,0,0,1.94,1.94H202.5V83.625Z"/></g><g class="cls-100"><path class="cls-101" d="M202.5,83.625H186.781a1.925,1.925,0,0,0-1.925,1.925V104a1.925,1.925,0,0,0,1.925,1.925H202.5v-22.3Z"/></g><g class="cls-102"><path class="cls-103" d="M202.5,83.625H186.9a1.911,1.911,0,0,0-1.911,1.91v18.308a1.91,1.91,0,0,0,1.911,1.91h15.6V83.625Z"/></g><g class="cls-104"><path class="cls-105" d="M202.5,83.625H187.019a1.9,1.9,0,0,0-1.9,1.9v18.168a1.9,1.9,0,0,0,1.9,1.9H202.5V83.625Z"/></g><g class="cls-106"><path class="cls-107" d="M202.5,83.625H187.138a1.881,1.881,0,0,0-1.881,1.881v18.029a1.881,1.881,0,0,0,1.881,1.881H202.5V83.625Z"/></g><g class="cls-108"><path class="cls-109" d="M202.5,83.625h-15.24a1.867,1.867,0,0,0-1.867,1.867V103.38a1.867,1.867,0,0,0,1.867,1.867H202.5V83.625Z"/></g><g class="cls-110"><path class="cls-111" d="M202.5,83.625H187.377a1.852,1.852,0,0,0-1.852,1.852v17.749a1.852,1.852,0,0,0,1.852,1.852H202.5V83.625Z"/></g><g class="cls-112"><path class="cls-113" d="M202.5,83.625h-15a1.838,1.838,0,0,0-1.838,1.838v17.609a1.837,1.837,0,0,0,1.838,1.838h15V83.625Z"/></g><g class="cls-114"><path class="cls-115" d="M202.5,83.625H187.615a1.823,1.823,0,0,0-1.823,1.823v17.469a1.823,1.823,0,0,0,1.823,1.823H202.5V83.625Z"/></g><g class="cls-116"><path class="cls-117" d="M202.5,83.625H187.734a1.808,1.808,0,0,0-1.808,1.808v17.329a1.808,1.808,0,0,0,1.808,1.808H202.5V83.625Z"/></g><g class="cls-118"><path class="cls-119" d="M202.5,83.625H187.853a1.794,1.794,0,0,0-1.794,1.794v17.189a1.794,1.794,0,0,0,1.794,1.794H202.5V83.625Z"/></g><g class="cls-120"><path class="cls-121" d="M202.5,83.625H187.973a1.779,1.779,0,0,0-1.779,1.779v17.049a1.779,1.779,0,0,0,1.779,1.779H202.5V83.625Z"/></g><g class="cls-122"><path class="cls-123" d="M202.5,83.625H188.092a1.765,1.765,0,0,0-1.765,1.765V102.3a1.765,1.765,0,0,0,1.765,1.764H202.5V83.625Z"/></g><g class="cls-124"><path class="cls-125" d="M202.5,83.625H188.211a1.75,1.75,0,0,0-1.75,1.75v16.77a1.75,1.75,0,0,0,1.75,1.75H202.5V83.625Z"/></g><g class="cls-126"><path class="cls-127" d="M202.5,83.625H188.33a1.735,1.735,0,0,0-1.735,1.735v16.63a1.735,1.735,0,0,0,1.735,1.735H202.5v-20.1Z"/></g><g class="cls-128"><path class="cls-129" d="M202.5,83.625H188.449a1.721,1.721,0,0,0-1.721,1.721v16.49a1.721,1.721,0,0,0,1.721,1.721H202.5V83.625Z"/></g><g class="cls-130"><path class="cls-7" d="M202.5,83.625H188.569a1.706,1.706,0,0,0-1.706,1.706v16.35a1.706,1.706,0,0,0,1.706,1.706H202.5V83.625Z"/></g><g class="cls-131"><path class="cls-132" d="M202.5,83.625h-13.81A1.692,1.692,0,0,0,187,85.317v16.21a1.691,1.691,0,0,0,1.691,1.692H202.5V83.625Z"/></g><g class="cls-133"><path class="cls-134" d="M202.5,83.625H188.807A1.677,1.677,0,0,0,187.13,85.3v16.07a1.677,1.677,0,0,0,1.677,1.677H202.5V83.625Z"/></g><g class="cls-135"><path class="cls-136" d="M202.5,83.625H188.926a1.662,1.662,0,0,0-1.662,1.662v15.93a1.662,1.662,0,0,0,1.662,1.662H202.5V83.625Z"/></g><g class="cls-137"><path class="cls-138" d="M202.5,83.625H189.045a1.648,1.648,0,0,0-1.648,1.648v15.79a1.648,1.648,0,0,0,1.648,1.648H202.5V83.625Z"/></g><g class="cls-139"><path class="cls-140" d="M202.5,83.625H189.164a1.633,1.633,0,0,0-1.633,1.633v15.65a1.633,1.633,0,0,0,1.633,1.633H202.5V83.625Z"/></g><g class="cls-141"><path class="cls-142" d="M202.5,83.625H189.284a1.619,1.619,0,0,0-1.619,1.619v15.511a1.619,1.619,0,0,0,1.619,1.618H202.5V83.625Z"/></g><g class="cls-143"><path class="cls-144" d="M202.5,83.625H189.4a1.6,1.6,0,0,0-1.6,1.6V100.6a1.6,1.6,0,0,0,1.6,1.6h13.1V83.625Z"/></g><path class="cls-5" d="M202.5,83.625H189.522a1.589,1.589,0,0,0-1.589,1.589v15.231a1.589,1.589,0,0,0,1.589,1.589H202.5V83.625Z"/><rect class="cls-12" x="186.896" y="80.062" width="33.507" height="23.292" rx="2.011" ry="2.011"/><rect class="cls-3" x="189.395" y="82.3" width="28.51" height="17.779"/><polygon class="cls-5" points="193.803 88.84 189.417 95.173 189.395 100.079 200.686 100.079 193.803 88.84"/><polygon class="cls-12" points="194.497 92.139 194.891 92.791 195.586 91.787 193.803 88.84 191.781 91.759 192.406 92.791 192.884 92.101 193.649 93.364 194.497 92.139"/><polygon class="cls-5" points="199.155 97.635 202.491 92.664 207.083 100.079 200.674 100.079 199.155 97.635"/><circle class="cls-4" cx="209.486" cy="88.355" r="3.13"/><polygon class="cls-12" points="203.225 95.963 203.62 96.615 204.315 95.611 202.491 92.664 200.51 95.582 201.134 96.615 201.612 95.924 202.377 97.188 203.225 95.963"/><rect class="cls-12" x="79.679" y="107.534" width="41.923" height="36.584" rx="3.684" ry="3.684"/><path class="cls-9" d="M118.111,107.534H83.17a3.491,3.491,0,0,0-3.491,3.491V115H121.6v-3.975A3.491,3.491,0,0,0,118.111,107.534Z"/><circle class="cls-12" cx="84.393" cy="111.267" r="0.639"/><circle class="cls-12" cx="87.171" cy="111.267" r="0.639"/><circle class="cls-12" cx="87.171" cy="111.267" r="0.639"/><circle class="cls-12" cx="89.949" cy="111.267" r="0.64"/><polygon class="cls-11" points="98.111 128.187 93.283 130.87 94.347 142.737 106.025 142.737 107.805 131.184 102.411 128.187 98.111 128.187"/><polygon class="cls-8" points="102.411 128.32 100.261 132.253 98.111 128.32 98.111 125.528 102.411 125.528 102.411 128.32"/><path class="cls-13" d="M104.265,119.731a2.327,2.327,0,0,0-.216-0.521l-0.527-1.029a1.4,1.4,0,0,0-1.209-.714,6.072,6.072,0,0,0-1.536-.54,1.985,1.985,0,0,0-.992.268,1.836,1.836,0,0,1-.392.177,3.36,3.36,0,0,1-.725.008,1.369,1.369,0,0,0-1.249,1,0.96,0.96,0,0,1-.088.272,0.943,0.943,0,0,1-.167.179c-0.737.705-.3,1.887-0.185,2.754a1.946,1.946,0,0,0,.41,1.354l-0.2-.049a3.464,3.464,0,0,0,1.814.88,10.324,10.324,0,0,0,2.04.113l2.463-.026a0.723,0.723,0,0,0,.447-0.1,0.708,0.708,0,0,0,.2-0.479c0.13-.936.044-1.87,0.123-2.82A2.328,2.328,0,0,0,104.265,119.731Z"/><path class="cls-145" d="M98.111,127.132l0.6,1.046a2.212,2.212,0,0,0,3.7.21v-2.861h-4.3v1.6Z"/><path class="cls-8" d="M97.765,121.216v3.276a4.208,4.208,0,0,0,.563,2.1l0.632,1.095a2.216,2.216,0,0,0,1.92,1.109h0a2.217,2.217,0,0,0,1.894-1.066l0.128-.21a4.208,4.208,0,0,0,.611-2.183V119.3H97.846Z"/><path class="cls-8" d="M97.809,124.977l-0.658-.347a2.156,2.156,0,0,1-.373-1.707s0.24-.587.693-0.32l0.64,0.64Z"/><path class="cls-8" d="M103.354,124.977l0.658-.347a2.156,2.156,0,0,0,.373-1.707s-0.24-.587-0.694-0.32l-0.64.64Z"/><path class="cls-13" d="M97.582,121.745a10.891,10.891,0,0,1,.124,1.54c-0.006.2-.091,0.8,0.344,0.641a0.358,0.358,0,0,0,.187-0.333c0.033-.5-0.379-0.921-0.143-1.379a3.885,3.885,0,0,0,.649-0.929,2.748,2.748,0,0,0-.127-0.824,0.806,0.806,0,0,1,.154-0.609,0.545,0.545,0,0,1,.578-0.185,1.444,1.444,0,0,1,.471.405,1.289,1.289,0,0,0,1.343.269,4.79,4.79,0,0,0,.75-0.467,1.056,1.056,0,0,1,.837-0.191,1.215,1.215,0,0,1,.674,1.008,4.739,4.739,0,0,1,.146,1.4,9.656,9.656,0,0,1-.335,1.059,0.914,0.914,0,0,0-.034.264,0.988,0.988,0,0,0,.181.442,0.1,0.1,0,0,0,.045.047,0.1,0.1,0,0,0,.1-0.033,1.489,1.489,0,0,0,.373-0.88,2.351,2.351,0,0,0,.111-1.136c-0.164-.871.044-1.778-0.1-2.653a0.543,0.543,0,0,0-.09-0.252,0.56,0.56,0,0,0-.27-0.159,10.618,10.618,0,0,0-3.9-.327,2.743,2.743,0,0,0-1.341.285,1.878,1.878,0,0,0-.794,1.37A6.527,6.527,0,0,0,97.582,121.745Z"/><path class="cls-8" d="M86.258,137.9l-0.192-.548-5.788-3.708h0a1.017,1.017,0,0,1,1.256-.144l1.149,0.715,0.414-.09a1.3,1.3,0,0,1,.975.175l0.568,0.363,1.915,0.577a1.735,1.735,0,0,1,1.12,1.042l0.409,1.069Z"/><path class="cls-8" d="M114.265,137.9l0.192-.548,5.788-3.708h0a1.017,1.017,0,0,0-1.256-.144l-1.149.715-0.414-.09a1.3,1.3,0,0,0-.975.175l-0.567.363-1.915.577a1.735,1.735,0,0,0-1.12,1.042l-0.408,1.069Z"/><path class="cls-11" d="M98.111,128.187l-5.7,3.168a3.432,3.432,0,0,0-1.755,2.74l-0.471,6.2-1.834-3.016-2.446.734,2.178,4.828,4.77-.1,1.326-6.6,3.934-5.839v-2.109Z"/><path class="cls-11" d="M102.411,128.187l5.7,3.168a3.432,3.432,0,0,1,1.755,2.74l0.471,6.2,1.834-3.016,2.446,0.734-2.18,4.833-4.762-.078-1.332-6.63-3.934-5.839v-2.109Z"/><polygon class="cls-12" points="98.111 128.187 96.845 128.89 98.336 134.201 100.261 132.253 98.111 128.187"/><polygon class="cls-12" points="102.411 128.187 103.677 128.89 102.187 134.201 100.261 132.253 102.411 128.187"/><path class="cls-13" d="M99.368,125.815c-0.08.158-.107,0.339-0.191,0.5a0.4,0.4,0,0,1-.428.239,0.548,0.548,0,0,1-.279-0.5,7.862,7.862,0,0,0-.122-1.658,2.1,2.1,0,0,1-.129-0.428c-0.016-.136,0-0.276-0.023-0.41a0.31,0.31,0,0,0-.267-0.269,0.283,0.283,0,0,0-.248.233,0.876,0.876,0,0,0,.022.363,6.335,6.335,0,0,1,.132,1.785,4.282,4.282,0,0,0,.367,1.727,2.72,2.72,0,0,0,.249.565,2.1,2.1,0,0,0,1.275.859,6.25,6.25,0,0,0,1.564.139,2.522,2.522,0,0,0,1.01-.134c0.922-.394,1.214-2.129,1.313-2.983a5.148,5.148,0,0,0-.066-1.077,6.954,6.954,0,0,1,.166-1.36,0.183,0.183,0,0,0-.032-0.165,0.293,0.293,0,0,1-.164-0.108,1.017,1.017,0,0,0-.346.507,1.2,1.2,0,0,0-.018.279,3.731,3.731,0,0,1-.076,1.095,10.535,10.535,0,0,0-.3,1.258,0.53,0.53,0,0,1-.287.493,0.352,0.352,0,0,1-.374-0.237,1.3,1.3,0,0,1-.055-0.476,0.726,0.726,0,0,0-.123-0.457,0.822,0.822,0,0,0-.6-0.213C100.675,125.327,99.762,125.028,99.368,125.815Z"/><path class="cls-8" d="M99.467,126.257h0.447a0.685,0.685,0,0,0,.452-0.17l0.272-.239,0.3,0.249a0.685,0.685,0,0,0,.44.16h0.434a1.211,1.211,0,0,1-1.286,1.236C99.645,127.47,99.76,126.954,99.467,126.257Z"/><polygon class="cls-12" points="85.903 138.01 88.348 137.277 88.962 138.286 86.369 139.044 85.903 138.01"/><polygon class="cls-12" points="114.665 138.01 112.22 137.277 111.606 138.286 114.199 139.044 114.665 138.01"/><circle class="cls-146" cx="85.562" cy="120.593" r="2.307"/><polygon class="cls-12" points="86.192 120.593 84.933 121.32 84.933 119.866 86.192 120.593"/><g id="_Group_9" data-name="&lt;Group&gt;"><g id="_Group_10" data-name="&lt;Group&gt;"><g id="_Group_11" data-name="&lt;Group&gt;"><path id="_Rectangle_6" data-name="&lt;Rectangle&gt;" class="cls-5" d="M149.124,161.423H166a2.086,2.086,0,0,1,2.086,2.086v9.906a1.175,1.175,0,0,1-1.175,1.175H147.976a1.159,1.159,0,0,1-1.159-1.159v-9.7A2.307,2.307,0,0,1,149.124,161.423Z" transform="translate(314.903 336.012) rotate(180)"/></g></g><g id="_Group_12" data-name="&lt;Group&gt;"><g id="_Group_13" data-name="&lt;Group&gt;"><path id="_Path_12" data-name="&lt;Path&gt;" class="cls-5" d="M147.058,161.9l8.905-7.256a2.619,2.619,0,0,1,3.091,0l8.42,6.962Z"/></g></g><g id="_Group_14" data-name="&lt;Group&gt;"><g id="_Group_15" data-name="&lt;Group&gt;"><path id="_Path_13" data-name="&lt;Path&gt;" class="cls-12" d="M153.018,151.352l-3.116,3.026v16.612h14.757V152.6a1.25,1.25,0,0,0-1.25-1.25H153.018Z"/></g></g><g id="_Group_16" data-name="&lt;Group&gt;" class="cls-147"><g id="_Group_17" data-name="&lt;Group&gt;"><polygon id="_Path_14" data-name="&lt;Path&gt;" class="cls-5" points="152.833 154.064 149.902 157.415 149.902 154.378 152.833 154.064"/></g></g><g id="_Group_18" data-name="&lt;Group&gt;"><g id="_Group_19" data-name="&lt;Group&gt;"><path id="_Path_15" data-name="&lt;Path&gt;" class="cls-5" d="M153.018,151.352l-3.116,3.026h2.285a0.831,0.831,0,0,0,.831-0.831v-2.195Z"/></g></g><g id="_Group_20" data-name="&lt;Group&gt;"><g id="_Group_21" data-name="&lt;Group&gt;"><path id="_Path_16" data-name="&lt;Path&gt;" class="cls-3" d="M147.433,174.641s8.214-5.73,8.214-6.249l-8.589-6.493a4.9,4.9,0,0,0-.241,1.7v10.462A0.585,0.585,0,0,0,147.433,174.641Z"/></g></g><g id="_Group_22" data-name="&lt;Group&gt;"><g id="_Group_23" data-name="&lt;Group&gt;"><path id="_Path_17" data-name="&lt;Path&gt;" class="cls-3" d="M167.626,174.641s-8.034-5.852-8.034-6.371l8.339-6.127a2.309,2.309,0,0,1,.311,1.455v10.462A0.585,0.585,0,0,1,167.626,174.641Z"/></g></g><g id="_Group_24" data-name="&lt;Group&gt;"><g id="_Group_25" data-name="&lt;Group&gt;"><path id="_Path_18" data-name="&lt;Path&gt;" class="cls-5" d="M147.349,174.654l8.644-7.107a2.59,2.59,0,0,1,3.056,0l8.644,7.107H147.349Z"/></g></g><g id="_Group_26" data-name="&lt;Group&gt;"><g id="_Group_27" data-name="&lt;Group&gt;"><g id="_Group_28" data-name="&lt;Group&gt;"><path id="_Compound_Path_" data-name="&lt;Compound Path&gt;" class="cls-3" d="M159.274,162.069a4.048,4.048,0,0,1-1.976.444,3.305,3.305,0,0,1-3.365-3.465,4.062,4.062,0,0,1,4.053-4.264,3.084,3.084,0,0,1,3.231,3.21c0,1.666-.933,2.643-1.976,2.643a0.822,0.822,0,0,1-.822-0.977h-0.044a1.744,1.744,0,0,1-1.566.977,1.259,1.259,0,0,1-1.2-1.4,2.621,2.621,0,0,1,2.631-2.631,2.92,2.92,0,0,1,1.189.233l-0.378,2.009c-0.166.845-.033,1.233,0.333,1.244,0.567,0.011,1.2-.744,1.2-2.032A2.545,2.545,0,0,0,157.9,155.3a3.409,3.409,0,0,0-3.331,3.687,2.774,2.774,0,0,0,2.854,3,3.469,3.469,0,0,0,1.677-.389Zm-0.611-4.8a1.806,1.806,0,0,0-2.321,1.92,0.733,0.733,0,0,0,.733.844,1.772,1.772,0,0,0,1.355-1.511Z"/></g></g></g></g><path id="_Compound_Path_2" data-name="&lt;Compound Path&gt;" class="cls-11" d="M107.837,95.989h1.075a0.394,0.394,0,0,0,.394-0.394V94.224a0.394,0.394,0,0,0-.394-0.393h-0.841a0.331,0.331,0,0,1-.308-0.22q-0.045-.118-0.1-0.232A0.331,0.331,0,0,1,107.726,93l0.594-.595a0.394,0.394,0,0,0,0-.557l-0.97-.969a0.394,0.394,0,0,0-.557,0l-0.6.6a0.325,0.325,0,0,1-.359.069c-0.086-.037-0.178-0.074-0.258-0.1a0.324,0.324,0,0,1-.206-0.3V90.3a0.394,0.394,0,0,0-.394-0.394h-1.37a0.394,0.394,0,0,0-.394.394v0.841a0.331,0.331,0,0,1-.22.308q-0.123.046-.244,0.1a0.33,0.33,0,0,1-.374-0.06l-0.6-.593a0.394,0.394,0,0,0-.557,0l-0.966.972a0.394,0.394,0,0,0,0,.557l0.6,0.6a0.325,0.325,0,0,1,.07.359c-0.036.086-.073,0.178-0.1,0.258a0.324,0.324,0,0,1-.3.207l-0.85,0a0.394,0.394,0,0,0-.393.395l0,1.371a0.394,0.394,0,0,0,.395.393l0.841,0a0.332,0.332,0,0,1,.308.22q0.045,0.118.1,0.232a0.331,0.331,0,0,1-.061.374l-0.594.6a0.394,0.394,0,0,0,0,.557l0.971,0.967a0.394,0.394,0,0,0,.557,0l0.6-.6a0.325,0.325,0,0,1,.359-0.069c0.085,0.036.178,0.073,0.257,0.1a0.324,0.324,0,0,1,.207.3v0.85a0.394,0.394,0,0,0,.395.393l1.37,0a0.394,0.394,0,0,0,.393-0.394V98.688a0.331,0.331,0,0,1,.22-0.308q0.118-.044.232-0.1a0.331,0.331,0,0,1,.374.061l0.6,0.594a0.394,0.394,0,0,0,.557,0l0.968-.97a0.394,0.394,0,0,0,0-.557l-0.6-.6a0.326,0.326,0,0,1-.069-0.359C107.742,96.248,107.832,96,107.837,95.989Zm-5.454-1.426a1.942,1.942,0,1,1,1.209,2.16A1.942,1.942,0,0,1,102.383,94.563Z"/><rect class="cls-12" x="95.071" y="3.813" width="86.357" height="28.158" rx="4.055" ry="4.055"/><path class="cls-9" d="M177.373,3.813H99.126a4.055,4.055,0,0,0-4.055,4.055v2.6h86.357v-2.6A4.055,4.055,0,0,0,177.373,3.813Z"/><circle class="cls-4" cx="107.842" cy="21.568" r="6.596"/><rect class="cls-20" x="117.992" y="15.515" width="56.173" height="1.777"/><rect class="cls-20" x="117.992" y="20.688" width="56.173" height="1.777"/><rect class="cls-63" x="117.992" y="25.861" width="21.065" height="1.777"/><circle class="cls-12" cx="102.089" cy="7.142" r="0.844"/><circle class="cls-12" cx="105.754" cy="7.142" r="0.844"/><circle class="cls-12" cx="109.418" cy="7.142" r="0.844"/><rect class="cls-11" x="195.097" y="5.397" width="12.381" height="12.381" rx="2.612" ry="2.612"/><path class="cls-12" d="M198.044,11.956v0.018l1.677,0.55v0.933l-2.685-1.094V11.555l2.685-1.094v0.929Z"/><path class="cls-12" d="M201.015,13.989h-1.036l1.51-4.8h1.036Z"/><path class="cls-12" d="M204.53,11.968V11.95l-1.662-.553v-0.93l2.67,1.094v0.808l-2.67,1.094V12.533Z"/><g id="_Group_29" data-name="&lt;Group&gt;"><path id="_Path_19" data-name="&lt;Path&gt;" class="cls-11" d="M234.8,100.061l-1.255-.836a0.522,0.522,0,0,0-.579,0l-1.255.836a0.242,0.242,0,0,1-.333-0.224v-5.5h3.754v5.5A0.242,0.242,0,0,1,234.8,100.061Z"/><path id="_Path_20" data-name="&lt;Path&gt;" class="cls-19" d="M237.161,96.887l-3.771-1.921a0.251,0.251,0,0,0-.234,0l-3.72,2.018a0.251,0.251,0,0,1-.368-0.26l0.661-4.18a0.251,0.251,0,0,0-.075-0.221l-3.068-2.914a0.251,0.251,0,0,1,.133-0.43l4.18-.663a0.251,0.251,0,0,0,.187-0.14l1.823-3.819a0.251,0.251,0,0,1,.45-0.006l1.922,3.77a0.252,0.252,0,0,0,.191.135l4.2,0.554a0.251,0.251,0,0,1,.145.427l-2.992,2.993a0.251,0.251,0,0,0-.069.223l0.769,4.162A0.251,0.251,0,0,1,237.161,96.887Z"/></g><circle id="_Path_21" data-name="&lt;Path&gt;" class="cls-11" cx="80.277" cy="54.208" r="6.48"/><g id="_Group_30" data-name="&lt;Group&gt;"><polygon id="_Path_22" data-name="&lt;Path&gt;" class="cls-12" points="79.421 56.834 77.17 54.583 78.456 53.297 79.421 54.262 82.099 51.582 83.385 52.868 79.421 56.834"/></g><g id="_Group_31" data-name="&lt;Group&gt;"><polygon id="_Path_23" data-name="&lt;Path&gt;" class="cls-148" points="175.871 139.654 174.156 137.383 177.586 137.383 175.871 139.654"/><polygon id="_Path_24" data-name="&lt;Path&gt;" class="cls-148" points="172.46 139.654 170.745 137.383 174.174 137.383 172.46 139.654"/><polygon id="_Path_25" data-name="&lt;Path&gt;" class="cls-148" points="174.165 145.45 169.048 139.63 179.283 139.63 174.165 145.45"/><polygon id="_Path_26" data-name="&lt;Path&gt;" class="cls-149" points="174.165 145.45 172.46 139.63 175.889 139.63 174.165 145.45"/><polygon id="_Path_27" data-name="&lt;Path&gt;" class="cls-149" points="170.745 137.383 169.048 139.63 172.442 139.63 170.745 137.383"/><polygon id="_Path_28" data-name="&lt;Path&gt;" class="cls-149" points="174.156 137.383 172.46 139.63 175.853 139.63 174.156 137.383"/><polygon id="_Path_29" data-name="&lt;Path&gt;" class="cls-149" points="177.586 137.383 175.889 139.63 179.283 139.63 177.586 137.383"/></g></g></g></g></svg> \ No newline at end of file diff --git a/pagetop/static/bootsier/images/demo-pagetop.svg b/pagetop/static/bootsier/images/demo-pagetop.svg new file mode 100644 index 00000000..08fbbb09 --- /dev/null +++ b/pagetop/static/bootsier/images/demo-pagetop.svg @@ -0,0 +1 @@ +<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 658.099 325.932"><defs><style>.cls-1{fill:none;}.cls-1,.cls-2,.cls-3{stroke:#394599;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.785px;}.cls-2{fill:#fff;}.cls-3{fill:#d3d5f9;}</style></defs><title>details-2</title><line class="cls-1" x1="94.914" y1="299.503" x2="613.96" y2="300.329"/><line class="cls-1" x1="46.984" y1="299.426" x2="73.565" y2="299.469"/><rect class="cls-1" x="308.149" y="170.126" width="139.98" height="128.937" transform="translate(1.267 0.291) rotate(0.091)"/><rect class="cls-2" x="190.277" y="158.431" width="87.839" height="165.138" transform="translate(1.277 0.52) rotate(0.091)"/><rect class="cls-3" x="278.116" y="158.516" width="19.029" height="165.138" transform="translate(1.277 0.435) rotate(0.091)"/><rect class="cls-3" x="208.401" y="174.282" width="19.52" height="21.641" transform="translate(1.188 0.545) rotate(0.091)"/><rect class="cls-3" x="240.651" y="174.333" width="19.52" height="21.641" transform="translate(1.188 0.494) rotate(0.091)"/><rect class="cls-3" x="208.344" y="209.502" width="19.52" height="21.641" transform="translate(1.244 0.546) rotate(0.091)"/><rect class="cls-3" x="240.595" y="209.554" width="19.52" height="21.641" transform="translate(1.244 0.494) rotate(0.091)"/><rect class="cls-2" x="509.427" y="213.189" width="65.247" height="110.871" transform="translate(1.321 0.03) rotate(0.091)"/><rect class="cls-3" x="574.673" y="213.258" width="22.222" height="110.871" transform="translate(1.321 -0.04) rotate(0.091)"/><rect class="cls-3" x="522.877" y="226.25" width="14.499" height="16.075" transform="translate(1.266 0.049) rotate(0.091)"/><rect class="cls-3" x="546.833" y="226.288" width="14.499" height="16.075" transform="translate(1.267 0.01) rotate(0.091)"/><rect class="cls-3" x="522.836" y="252.412" width="14.499" height="16.075" transform="translate(1.308 0.049) rotate(0.091)"/><rect class="cls-3" x="546.791" y="252.45" width="14.499" height="16.075" transform="translate(1.308 0.011) rotate(0.091)"/><polygon class="cls-3" points="387.247 0.926 366.423 0.893 366.395 18.212 376.569 18.229 350.467 60.524 387.152 60.583 423.836 60.641 387.247 0.926"/><rect class="cls-2" x="323.029" y="83.472" width="84.434" height="240.306" transform="translate(1.217 0.311) rotate(0.091)"/><rect class="cls-3" x="407.463" y="83.552" width="16.959" height="240.306" transform="translate(1.218 0.23) rotate(0.091)"/><rect class="cls-3" x="387.427" y="59.705" width="16.959" height="23.815" transform="translate(1.007 0.262) rotate(0.091)"/><line class="cls-1" x1="344.005" y1="306.325" x2="344.238" y2="110.068"/><line class="cls-1" x1="366.016" y1="306.36" x2="366.249" y2="110.104"/><line class="cls-1" x1="388.026" y1="306.395" x2="388.259" y2="110.139"/><rect class="cls-1" x="343.406" y="59.657" width="44.021" height="23.815" transform="translate(1.007 0.311) rotate(0.091)"/><polygon class="cls-2" points="366.423 0.893 329.643 60.491 366.328 60.55 403.012 60.608 366.423 0.893"/><circle class="cls-3" cx="448.084" cy="262.515" r="30.044" transform="translate(185.749 711.073) rotate(-89.909)"/><line class="cls-3" x1="448.879" y1="324.803" x2="448.946" y2="282.984"/><path class="cls-2" d="M494.42,182.269s-23.679,65.633-23.714,87.644,7.521,35.734,23.517,35.76,23.6-13.674,23.631-35.685S494.42,182.269,494.42,182.269Z" transform="translate(0.893 0.893)"/><line class="cls-3" x1="495.087" y1="324.876" x2="495.154" y2="283.057"/><polyline class="cls-1" points="165.563 324.351 165.637 277.665 165.679 251.296"/><path class="cls-2" d="M137.45,245.293a10.134,10.134,0,0,0-10.15,10.118l20.268,0.032A10.134,10.134,0,0,0,137.45,245.293Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M137.418,265.561a10.134,10.134,0,0,0,10.15-10.118l-20.268-.032A10.134,10.134,0,0,0,137.418,265.561Z" transform="translate(0.893 0.893)"/><path class="cls-2" d="M192.139,245.38a10.134,10.134,0,0,0-10.15,10.118l20.268,0.032A10.134,10.134,0,0,0,192.139,245.38Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M192.107,265.648a10.134,10.134,0,0,0,10.15-10.118l-20.268-.032A10.134,10.134,0,0,0,192.107,265.648Z" transform="translate(0.893 0.893)"/><path class="cls-2" d="M164.822,228.306a10.134,10.134,0,0,0-10.15,10.118l20.268,0.032A10.134,10.134,0,0,0,164.822,228.306Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M164.789,248.573a10.134,10.134,0,0,0,10.15-10.118l-20.268-.032A10.134,10.134,0,0,0,164.789,248.573Z" transform="translate(0.893 0.893)"/><path class="cls-1" d="M164.738,281.089l-17.211-.027c-7.889-.013-10.127-4.457-10.109-15.5" transform="translate(0.893 0.893)"/><path class="cls-1" d="M164.738,281.089l17.211,0.027c7.889,0.013,10.141-4.424,10.159-15.468" transform="translate(0.893 0.893)"/><rect class="cls-2" x="221.7" y="277.478" width="28.542" height="27.784" transform="translate(1.357 0.517) rotate(0.091)"/><rect class="cls-3" x="250.241" y="277.508" width="9.76" height="27.784" transform="translate(1.357 0.487) rotate(0.091)"/><line class="cls-2" x1="222.57" y1="306.131" x2="222.541" y2="324.442"/><line class="cls-2" x1="251.112" y1="306.177" x2="251.083" y2="324.488"/><line class="cls-2" x1="232.914" y1="306.148" x2="232.885" y2="324.459"/><line class="cls-2" x1="260.872" y1="306.192" x2="260.843" y2="324.503"/><path class="cls-2" d="M94.33,104.534l85.772,0.137S137.287,60.491,94.33,104.534Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M143.962,104.613l85.772,0.137S186.918,60.57,143.962,104.613Z" transform="translate(0.893 0.893)"/><path class="cls-2" d="M504.1,139.769l85.772,0.137S547.053,95.726,504.1,139.769Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M552.726,139.847l60.625,0.1S583.089,108.716,552.726,139.847Z" transform="translate(0.893 0.893)"/><line class="cls-1" x1="657.207" y1="325.04" x2="0.893" y2="325.04"/></svg> \ No newline at end of file diff --git a/pagetop/static/bootsier/images/demo-visiting.svg b/pagetop/static/bootsier/images/demo-visiting.svg new file mode 100644 index 00000000..d06680b3 --- /dev/null +++ b/pagetop/static/bootsier/images/demo-visiting.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 698.629 654.126"><defs><style>.cls-1{isolation:isolate;}.cls-2,.cls-6{fill:#e1e2fe;}.cls-2,.cls-4{opacity:0.5;}.cls-10,.cls-3{opacity:0.66;}.cls-5{fill:#c9ccf7;}.cls-7{fill:#3e479b;}.cls-8{opacity:0.81;}.cls-10,.cls-9{fill:#fff;}.cls-11{fill:#ea8b9b;opacity:0.39;}.cls-12{fill:#f7a9b4;}.cls-13{fill:#e58898;}.cls-14{fill:#ccc;}.cls-15{fill:#6c63ff;}.cls-16{fill:#9e9eef;}.cls-17{fill:#db7183;}.cls-18{fill:#599af2;}.cls-19{fill:#293d7c;}.cls-20{fill:#1a2b63;}.cls-21{fill:#445ea0;}.cls-22{fill:#69cdff;}.cls-23{fill:#52bbef;}.cls-24{fill:#d9eafc;}.cls-25{opacity:0.12;mix-blend-mode:multiply;}.cls-26,.cls-27,.cls-28{fill:none;stroke-linecap:round;stroke-miterlimit:10;}.cls-26,.cls-28{stroke:#9e9eef;}.cls-26{stroke-width:2px;}.cls-27{stroke:#f7a9b4;}.cls-27,.cls-28{stroke-width:1.311px;}.cls-28{stroke-dasharray:3 6;}</style></defs><title>details-1</title><g class="cls-1"><g id="Layer_1" data-name="Layer 1"><path class="cls-2" d="M650.949,632.81s-55.6,48.672-145.533-1.079S393.365,529.949,275.74,537.814s-143.365,26.7-218.732-30.089-72.48-175.274-12.056-239c33.01-34.808,67.739-44.639,104.007-51.425,6.314-1.18,12.674-2.27,19.078-3.382,15.629-2.708,31.527-5.562,47.683-10.224a219.368,219.368,0,0,0,25.954-9.236c0.258-.112.517-0.213,0.775-0.337,7.348-3.191,14.539-6.809,21.527-10.707,5.067-2.82,10.033-5.8,14.865-8.876,0.663-.416,1.326-0.843,1.977-1.27,7.719-4.989,15.112-10.247,22.1-15.572,7.314-5.562,14.179-11.191,20.527-16.7A432.8,432.8,0,0,0,369.77,94.574S443.228-29,557.459,6.365,690.071,122.731,664.218,211.1,638.792,351.912,666.6,416.842C694.431,481.772,728.609,567.206,650.949,632.81Z"/><g class="cls-3"><g class="cls-4"><path class="cls-5" d="M266.019,199.966l-11.96-.92a61.036,61.036,0,0,0-3.62-15.39c-0.13-.36-0.27-0.72-0.41-1.08-0.44.73-.89,1.47-1.35,2.21-3.52,5.7-7.36,11.59-11.51,17.52a42.5,42.5,0,0,1-.02,6.48,44.8,44.8,0,0,1-41.91,41.31,193.288,193.288,0,0,1-19.49,14.88c0.37,0.11.74,0.21,1.12,0.31l-0.91,11.96a10.991,10.991,0,0,0,10.13,11.8c0.29,0.02.58,0.03,0.86,0.03a11,11,0,0,0,10.94-10.16l0.91-11.95a61.627,61.627,0,0,0,25-8.19l7.81,9.1a11,11,0,0,0,16.7-14.33l-7.81-9.1a61.529,61.529,0,0,0,11.88-23.46l11.96,0.91a11.007,11.007,0,0,0,11.81-10.13c0.02-.28.03-0.57,0.03-0.84A11,11,0,0,0,266.019,199.966Z"/></g><g class="cls-4"><path class="cls-6" d="M254.969,166.246l-9.1,7.81a60.468,60.468,0,0,1,4.16,8.52c-0.44.73-.89,1.47-1.35,2.21-4.3,2.74-8.72,5.39-13.23,7.9a44.81,44.81,0,1,0-85.39,27.15c-5.7.99-11.36,1.96-16.98,3.01a61.354,61.354,0,0,1-2.19-11.14l-11.95-.91a11,11,0,0,1-10.16-10.94c0-.28.01-0.57,0.03-0.86a10.985,10.985,0,0,1,11.8-10.13l11.96,0.91a61.449,61.449,0,0,1,11.89-23.47l-7.81-9.1a11,11,0,1,1,16.69-14.32l7.81,9.1a61.525,61.525,0,0,1,25-8.19l0.91-11.96a11.006,11.006,0,0,1,10.96-10.16q0.42,0,.84.03a11,11,0,0,1,10.13,11.81l-0.91,11.95a61.733,61.733,0,0,1,23.47,11.89l9.1-7.81A11,11,0,0,1,254.969,166.246Z"/></g><g class="cls-4"><path class="cls-5" d="M195.239,250.1a193.288,193.288,0,0,1-19.49,14.88,61.382,61.382,0,0,1-22.34-11.58l-9.11,7.81a11,11,0,0,1-14.32-16.69l9.1-7.81a61.3,61.3,0,0,1-6-13.86c5.62-1.05,11.28-2.02,16.98-3.01a44.771,44.771,0,0,0,39,30.22A44.016,44.016,0,0,0,195.239,250.1Z"/></g><g class="cls-4"><path class="cls-5" d="M248.679,184.786c-3.52,5.7-7.36,11.59-11.51,17.52a44.473,44.473,0,0,0-1.72-9.62C239.959,190.176,244.379,187.526,248.679,184.786Z"/></g><path class="cls-7" d="M521.5,537.152a9.178,9.178,0,0,1-8.725-6.4l-2.148-6.783a43.972,43.972,0,0,1-16.435-1.417l-3.278,6.315a9.164,9.164,0,1,1-16.268-8.443l3.277-6.315A44.02,44.02,0,0,1,467.3,501.482l-6.783,2.148a9.164,9.164,0,1,1-5.533-17.473l6.783-2.148a44.012,44.012,0,0,1,1.417-16.437l-6.315-3.278a9.164,9.164,0,0,1,8.443-16.268l6.315,3.278a44.07,44.07,0,0,1,12.625-10.62L482.1,433.9a9.164,9.164,0,1,1,17.473-5.533l2.148,6.783a43.951,43.951,0,0,1,16.437,1.417l3.278-6.317a9.165,9.165,0,0,1,16.268,8.444l-3.278,6.314a44.054,44.054,0,0,1,10.62,12.626l6.783-2.148a9.164,9.164,0,1,1,5.532,17.473l-6.783,2.148a44.012,44.012,0,0,1-1.417,16.437l6.317,3.277a9.165,9.165,0,1,1-8.445,16.268l-6.314-3.276A44.066,44.066,0,0,1,528.1,518.434l2.148,6.783A9.18,9.18,0,0,1,521.5,537.152Zm-8.761-16.472,2.9,9.163a6.16,6.16,0,0,0,11.744-3.72l-2.9-9.162,1.112-.586a41.165,41.165,0,0,0,13.534-11.383L539.89,504l8.531,4.426a6.159,6.159,0,0,0,5.674-10.933l-8.531-4.427,0.373-1.2a41.151,41.151,0,0,0,1.52-17.618L547.294,473l9.163-2.9a6.159,6.159,0,0,0-3.718-11.744l-9.162,2.9-0.586-1.112a41.139,41.139,0,0,0-11.385-13.534l-1-.766,4.428-8.531a6.159,6.159,0,0,0-10.933-5.674l-4.428,8.531-1.2-.373a41.2,41.2,0,0,0-17.618-1.52l-1.247.163-2.9-9.163a6.16,6.16,0,1,0-11.744,3.72l2.9,9.16-1.112.585a41.168,41.168,0,0,0-13.533,11.385l-0.766,1-8.532-4.428a6.158,6.158,0,1,0-5.673,10.933l8.529,4.428-0.373,1.2a41.149,41.149,0,0,0-1.52,17.618l0.163,1.247-9.163,2.9a6.16,6.16,0,0,0,3.72,11.744l9.162-2.9,0.585,1.112a41.148,41.148,0,0,0,11.383,13.533l0.995,0.766-4.425,8.532a6.159,6.159,0,0,0,10.933,5.673l4.428-8.53,1.2,0.373a41.2,41.2,0,0,0,17.617,1.52Zm-6.6-8.389a32.809,32.809,0,1,1,9.915-1.542A32.572,32.572,0,0,1,506.136,512.292Zm0.072-62.458a29.76,29.76,0,1,0,13.652,3.354A29.792,29.792,0,0,0,506.208,449.834Z"/><path class="cls-7" d="M600.4,481.063a11.813,11.813,0,0,1-11.684-13.5l1.435-9.881a58.753,58.753,0,0,1-19.6-11.664l-8,5.971a11.8,11.8,0,0,1-14.114-18.914l8-5.971A58.719,58.719,0,0,1,550.83,405l-9.879-1.437a11.8,11.8,0,1,1,3.391-23.354l9.882,1.435a58.7,58.7,0,0,1,11.664-19.6l-5.972-8a11.8,11.8,0,1,1,18.914-14.116l5.972,8a58.736,58.736,0,0,1,22.1-5.607l1.436-9.879a11.8,11.8,0,1,1,23.354,3.391l-1.435,9.882a58.706,58.706,0,0,1,19.6,11.664l8-5.972a11.8,11.8,0,1,1,14.114,18.914l-8,5.972a58.712,58.712,0,0,1,5.607,22.1l9.881,1.437a11.8,11.8,0,1,1-3.392,23.354l-9.881-1.435a58.729,58.729,0,0,1-11.664,19.6l5.97,8a11.8,11.8,0,1,1-18.914,14.114l-5.97-8a58.729,58.729,0,0,1-22.1,5.607l-1.436,9.881A11.819,11.819,0,0,1,600.4,481.063ZM570.76,442.116l0.918,0.858a55.831,55.831,0,0,0,20.611,12.271l1.192,0.4L591.686,468a8.8,8.8,0,1,0,17.408,2.53l1.794-12.356,1.256-.041a55.814,55.814,0,0,0,23.251-5.9l1.124-.562,7.467,10.006a8.794,8.794,0,1,0,14.1-10.521l-7.466-10.005,0.858-.919a55.812,55.812,0,0,0,12.271-20.611l0.4-1.192L676.5,420.22a8.8,8.8,0,1,0,2.53-17.408l-12.356-1.794-0.041-1.256a55.8,55.8,0,0,0-5.9-23.25l-0.562-1.124,10-7.469a8.794,8.794,0,0,0-10.521-14.095h0l-10.006,7.467-0.918-.858a55.79,55.79,0,0,0-20.611-12.271l-1.192-.4,1.795-12.355a8.8,8.8,0,0,0-17.408-2.528l-1.794,12.355-1.256.041a55.819,55.819,0,0,0-23.25,5.9l-1.124.562-7.469-10a8.794,8.794,0,0,0-14.1,10.521l7.467,10-0.858.918a55.786,55.786,0,0,0-12.271,20.611l-0.4,1.191-12.355-1.794a8.8,8.8,0,0,0-2.528,17.408l12.355,1.795,0.041,1.256a55.813,55.813,0,0,0,5.9,23.251l0.562,1.124-10.007,7.467a8.795,8.795,0,1,0,10.522,14.095Zm39.5,3.024a43.414,43.414,0,1,1,25.936-8.612h0A43.229,43.229,0,0,1,610.258,445.14Zm-0.139-83.894a40.453,40.453,0,1,0,24.28,72.873h0a40.449,40.449,0,0,0-18.38-72.444A41.088,41.088,0,0,0,610.119,361.246ZM635.3,435.324h0Z"/></g><g class="cls-8"><path class="cls-9" d="M406.124,487.112H375.259a1.5,1.5,0,0,1,0-3.005h30.865A1.5,1.5,0,0,1,406.124,487.112Z"/><path class="cls-9" d="M406.124,519.2H375.259a1.5,1.5,0,0,1,0-3.005h30.865A1.5,1.5,0,0,1,406.124,519.2Z"/><path class="cls-9" d="M429.424,551.6H238.8a4.078,4.078,0,0,1-4.074-4.073V448.585a4.079,4.079,0,0,1,4.074-4.075H429.424a4.08,4.08,0,0,1,4.075,4.075v98.939A4.079,4.079,0,0,1,429.424,551.6ZM238.8,447.515a1.071,1.071,0,0,0-1.069,1.07v98.939a1.07,1.07,0,0,0,1.069,1.068H429.424a1.071,1.071,0,0,0,1.07-1.068V448.585a1.071,1.071,0,0,0-1.07-1.07H238.8Z"/><path class="cls-10" d="M429.424,551.6H238.8a4.078,4.078,0,0,1-4.074-4.073V448.585a4.079,4.079,0,0,1,4.074-4.075H429.424a4.08,4.08,0,0,1,4.075,4.075v98.939A4.079,4.079,0,0,1,429.424,551.6ZM238.8,447.515a1.071,1.071,0,0,0-1.069,1.07v98.939a1.07,1.07,0,0,0,1.069,1.068H429.424a1.071,1.071,0,0,0,1.07-1.068V448.585a1.071,1.071,0,0,0-1.07-1.07H238.8Z"/><path class="cls-9" d="M406.124,471.543H259.043a1.5,1.5,0,0,1,0-3.005H406.124A1.5,1.5,0,0,1,406.124,471.543Z"/><path class="cls-9" d="M406.124,502.683H259.043a1.5,1.5,0,0,1,0-3.005H406.124A1.5,1.5,0,0,1,406.124,502.683Z"/><path class="cls-9" d="M338.34,487.112h-79.3a1.5,1.5,0,0,1,0-3.005h79.3A1.5,1.5,0,0,1,338.34,487.112Z"/><path class="cls-9" d="M338.34,519.2h-79.3a1.5,1.5,0,0,1,0-3.005h79.3A1.5,1.5,0,0,1,338.34,519.2Z"/><path class="cls-9" d="M312.521,534.061H259.043a1.5,1.5,0,0,1,0-3.005h53.478A1.5,1.5,0,0,1,312.521,534.061Z"/></g><g class="cls-8"><path class="cls-9" d="M110.813,390.912H76.122a1.5,1.5,0,0,1,0-3.005h34.691A1.5,1.5,0,0,1,110.813,390.912Z"/><path class="cls-9" d="M110.813,354.852H76.122a1.5,1.5,0,1,1,0-3.005h34.691A1.5,1.5,0,1,1,110.813,354.852Z"/><path class="cls-9" d="M264.5,435.417H49.615a4.079,4.079,0,0,1-4.074-4.075V319.5a4.079,4.079,0,0,1,4.074-4.075H264.5a4.079,4.079,0,0,1,4.074,4.075V431.343A4.079,4.079,0,0,1,264.5,435.417ZM49.615,318.434a1.071,1.071,0,0,0-1.069,1.07V431.343a1.071,1.071,0,0,0,1.069,1.07H264.5a1.071,1.071,0,0,0,1.069-1.07V319.5a1.071,1.071,0,0,0-1.069-1.07H49.615Z"/><path class="cls-10" d="M264.5,435.417H49.615a4.079,4.079,0,0,1-4.074-4.075V319.5a4.079,4.079,0,0,1,4.074-4.075H264.5a4.079,4.079,0,0,1,4.074,4.075V431.343A4.079,4.079,0,0,1,264.5,435.417ZM49.615,318.434a1.071,1.071,0,0,0-1.069,1.07V431.343a1.071,1.071,0,0,0,1.069,1.07H264.5a1.071,1.071,0,0,0,1.069-1.07V319.5a1.071,1.071,0,0,0-1.069-1.07H49.615Z"/><path class="cls-9" d="M241.431,408.412H76.122a1.5,1.5,0,1,1,0-3.005h165.31A1.5,1.5,0,1,1,241.431,408.412Z"/><path class="cls-9" d="M241.431,373.412H76.122a1.5,1.5,0,0,1,0-3.005h165.31A1.5,1.5,0,0,1,241.431,373.412Z"/><path class="cls-9" d="M241.431,390.912H152.307a1.5,1.5,0,0,1,0-3.005h89.125A1.5,1.5,0,0,1,241.431,390.912Z"/><path class="cls-9" d="M241.431,354.852H152.307a1.5,1.5,0,0,1,0-3.005h89.125A1.5,1.5,0,1,1,241.431,354.852Z"/><path class="cls-9" d="M241.431,338.146H181.326a1.5,1.5,0,0,1,0-3.005h60.106A1.5,1.5,0,0,1,241.431,338.146Z"/></g><path class="cls-11" d="M554.7,549.817H177.169A13.907,13.907,0,0,1,163.28,535.2l13.27-259.122a13.907,13.907,0,0,1,13.888-13.2h45.819a13.907,13.907,0,0,1,7.982,2.519l51.293,35.953a13.907,13.907,0,0,0,7.982,2.519H567.731a13.907,13.907,0,0,1,13.882,14.736L568.58,536.739A13.907,13.907,0,0,1,554.7,549.817Z"/><path class="cls-12" d="M575.139,209.076a17.555,17.555,0,0,1-.77,5.16,0.048,0.048,0,0,0-.01.04l-1.16,2.8L472.959,460.5a3.352,3.352,0,0,1-4.37,1.82l-234.24-96.47a3.341,3.341,0,0,1-1.81-4.36l100.5-244.02,0.7-1.71a0.145,0.145,0,0,0,.02-0.04,17.492,17.492,0,0,1,19.87-9.41l4.95,2.04,203.61,83.84,4.15,1.72a3.846,3.846,0,0,1,.39.22A17.49,17.49,0,0,1,575.139,209.076Z"/><path class="cls-13" d="M389.072,229.757l-58.1-23.926a3.011,3.011,0,0,1-1.636-3.927l23.926-58.1a3.011,3.011,0,0,1,3.927-1.636l58.1,23.926a3.011,3.011,0,0,1,1.636,3.927L393,228.121A3.011,3.011,0,0,1,389.072,229.757Z"/><path class="cls-9" d="M500.972,309.092L319.267,234.261a3.008,3.008,0,1,1,2.291-5.562h0L503.263,303.53a3.008,3.008,0,0,1-2.291,5.562h0Z"/><path class="cls-9" d="M449.2,310.18l-137.824-56.76a3.008,3.008,0,0,1,2.291-5.562h0l137.824,56.76A3.008,3.008,0,1,1,449.2,310.18Z"/><path class="cls-9" d="M529.37,238.381l-80.346-33.089a3.008,3.008,0,1,1,2.291-5.562h0l80.346,33.089a3.008,3.008,0,0,1-2.291,5.562h0Z"/><path class="cls-9" d="M501.428,249.282l-60.294-24.831a3.008,3.008,0,1,1,2.291-5.562l60.294,24.831a3.008,3.008,0,1,1-2.291,5.562h0Z"/><path class="cls-9" d="M485.192,347.411L303.487,272.58a3.008,3.008,0,0,1,2.291-5.562h0l181.705,74.831a3.008,3.008,0,0,1-2.291,5.562h0Z"/><path class="cls-9" d="M433.42,348.5L295.6,291.739a3.008,3.008,0,0,1,2.291-5.562h0l137.824,56.76a3.008,3.008,0,1,1-2.291,5.562h0Z"/><path class="cls-9" d="M469.411,385.73L287.706,310.9A3.008,3.008,0,0,1,290,305.336L471.7,380.168A3.008,3.008,0,0,1,469.411,385.73Z"/><path class="cls-14" d="M461.52,404.889L279.815,330.058a3.008,3.008,0,0,1,2.291-5.562l181.705,74.831a3.008,3.008,0,0,1-2.291,5.562h0Z"/><path class="cls-15" d="M372.876,403.466a65.513,65.513,0,0,0,10.9-.333c3.258-.381,6.652-0.905,9.508-2.618a9.036,9.036,0,0,0,4.5-6.833,6.359,6.359,0,0,0-3.848-6.448,7.586,7.586,0,0,0-7.7,1.078,10.023,10.023,0,0,0-3.442,8.006c0.15,6.191,5.048,12.3,10.487,14.88,6.126,2.9,14.492.436,16.061-6.707,0.326-1.486-1.7-2-2.543-1.047a6.745,6.745,0,0,0,9.414,9.628l-2.277-.938a16.234,16.234,0,0,0,11.166,11.793,15.058,15.058,0,0,0,4.155.633c1.711,0,3.468.863,5.1,1.4l11.79,3.841c1.734,0.565,2.835-2.068,1.086-2.637l-10.678-3.479c-1.779-.58-3.555-1.175-5.339-1.739-1.276-.4-2.672-0.185-4-0.422a13.371,13.371,0,0,1-10.456-9.78,1.443,1.443,0,0,0-2.277-.938,3.9,3.9,0,0,1-5.431-5.61l-2.543-1.047c-1.012,4.608-6.633,6.337-10.684,5a16.185,16.185,0,0,1-9.775-10.367,8.361,8.361,0,0,1,.608-6.653,4.983,4.983,0,0,1,5.221-2.557,3.575,3.575,0,0,1,3.055,3.921,6.4,6.4,0,0,1-3.561,4.845c-2.55,1.369-5.6,1.709-8.435,2.02a60.944,60.944,0,0,1-9.725.277c-1.821-.092-2.186,2.739-0.346,2.832h0Z"/><path class="cls-16" d="M567.8,337.351V535.673a14.143,14.143,0,0,1-14.143,14.143H176.675a14.143,14.143,0,0,1-14.143-14.143V296.36a14.143,14.143,0,0,1,14.143-14.143h44.813a14.143,14.143,0,0,1,8.118,2.562l51.168,35.867a14.143,14.143,0,0,0,8.118,2.562H553.655A14.143,14.143,0,0,1,567.8,337.351Z"/><rect class="cls-7" x="187.281" y="507.279" width="165.51" height="13.148" rx="6.574" ry="6.574"/><rect class="cls-7" x="187.281" y="481.757" width="82.755" height="13.148" rx="6.574" ry="6.574"/><path class="cls-17" d="M408.686,229.522L350.59,205.6a3.346,3.346,0,0,1-1.818-4.363l23.926-58.1a3.346,3.346,0,0,1,4.363-1.818l58.1,23.926a3.346,3.346,0,0,1,1.818,4.363l-23.926,58.1A3.346,3.346,0,0,1,408.686,229.522Zm-32.134-86.966a2.007,2.007,0,0,0-2.618,1.091l-23.926,58.1a2.007,2.007,0,0,0,1.091,2.618l58.1,23.926a2.007,2.007,0,0,0,2.618-1.091l23.926-58.1a2.007,2.007,0,0,0-1.09-2.618Z"/><path class="cls-18" d="M568.856,465.353l-25.865,26.528,46.921,48.495a18.371,18.371,0,0,0,26.4-.044l0.258-.266a18.305,18.305,0,0,0-.049-25.452Z"/><path class="cls-19" d="M581.977,463.212L564.384,445.62a104.094,104.094,0,0,1-42.425,42.491l17.56,17.559a5.178,5.178,0,0,0,7.3,0l35.155-35.155A5.18,5.18,0,0,0,581.977,463.212Z"/><path class="cls-20" d="M551.568,493.62L536.551,478.6a103.162,103.162,0,0,1-14.593,9.506l17.56,17.559a5.178,5.178,0,0,0,7.3,0l12.049-12.049A5.177,5.177,0,0,1,551.568,493.62Z"/><path class="cls-21" d="M547.759,322.165a105.563,105.563,0,1,1-149.29,0A105.564,105.564,0,0,1,547.759,322.165Z"/><path class="cls-22" d="M525.452,449.146a74.016,74.016,0,1,1,0-104.673A74.015,74.015,0,0,1,525.452,449.146Z"/><path class="cls-23" d="M525.452,449.146a74.505,74.505,0,0,0,7.171-8.32A74.019,74.019,0,0,1,429.1,337.3,74.017,74.017,0,1,0,525.452,449.146Z"/><circle class="cls-24" cx="485.827" cy="347.25" r="12.393"/><circle class="cls-24" cx="511.864" cy="360.129" r="8.779"/><image class="cls-25" width="372" height="116" transform="translate(2.129 319.626)" xlink:href="data:image/png;base64,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"/><path class="cls-9" d="M51.383,342.373H308.264a27.174,27.174,0,0,1,27.174,27.174v0a27.174,27.174,0,0,1-27.174,27.174H51.382a27.173,27.173,0,0,1-27.173-27.173v0a27.174,27.174,0,0,1,27.174-27.174Z"/><path class="cls-18" d="M308.264,396.72H266.483l-0.2-54.347h41.983a27.174,27.174,0,0,1,27.174,27.174h0A27.174,27.174,0,0,1,308.264,396.72Z"/><path class="cls-9" d="M297.69,379.069a11.887,11.887,0,1,1,8.4-3.481A11.9,11.9,0,0,1,297.69,379.069Zm0-20.767a8.881,8.881,0,1,0,8.882,8.881A8.891,8.891,0,0,0,297.69,358.3Z"/><path class="cls-9" d="M314.412,385.509a1.5,1.5,0,0,1-1.062-.44l-9.43-9.43a1.5,1.5,0,1,1,2.125-2.125l9.429,9.43A1.5,1.5,0,0,1,314.412,385.509Z"/><rect class="cls-2" x="48.546" y="362.247" width="194.388" height="14.599" rx="7.299" ry="7.299"/><path class="cls-26" d="M488.844,95.305l10.688,11.957a2.449,2.449,0,0,0,3.652,0l8.861-9.914a2.449,2.449,0,0,1,3.652,0l8.858,9.913a2.449,2.449,0,0,0,3.653,0l8.861-9.914a2.449,2.449,0,0,1,3.652,0l8.865,9.915a2.449,2.449,0,0,0,3.652,0l8.862-9.915a2.449,2.449,0,0,1,3.652,0l8.87,9.917a2.449,2.449,0,0,0,3.651,0l10.7-11.959"/><circle class="cls-27" cx="103.757" cy="502.683" r="19.585"/><circle class="cls-28" cx="329.113" cy="33.96" r="19.585"/></g></g></svg> \ No newline at end of file From b02a92dbb055906df4402329c59e8f2465b836d1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Mar 2022 13:07:16 +0200 Subject: [PATCH 039/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/src/base/component/block.rs | 8 +-- pagetop/src/base/component/container.rs | 4 +- pagetop/src/base/component/form/button.rs | 20 +++---- pagetop/src/base/component/form/date.rs | 48 ++++++++-------- pagetop/src/base/component/form/form.rs | 12 ++-- pagetop/src/base/component/form/hidden.rs | 12 ++-- pagetop/src/base/component/form/input.rs | 56 +++++++++---------- pagetop/src/base/component/grid/column.rs | 4 +- pagetop/src/base/component/grid/row.rs | 4 +- pagetop/src/base/component/menu.rs | 4 +- pagetop/src/base/module/demopage/mod.rs | 6 +- pagetop/src/html/mod.rs | 8 +-- .../src/html/{optional_attr.rs => optattr.rs} | 10 ++-- .../src/html/{optional_id.rs => optiden.rs} | 6 +- pagetop/src/response/page/page.rs | 22 ++++---- 16 files changed, 113 insertions(+), 113 deletions(-) rename pagetop/src/html/{optional_attr.rs => optattr.rs} (80%) rename pagetop/src/html/{optional_id.rs => optiden.rs} (88%) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index a260d17f..514ab6e9 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b857712f..5e5a7159 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub struct Block { renderable: fn() -> bool, weight : i8, - id : OptionId, - title : OptionAttr, + id : OptIden, + title : OptAttr, html : Vec<Markup>, template : String, } @@ -15,8 +15,8 @@ impl PageComponent for Block { Block { renderable: always, weight : 0, - id : OptionId::none(), - title : OptionAttr::none(), + id : OptIden::none(), + title : OptAttr::none(), html : Vec::new(), template : "default".to_owned(), } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 18d6337a..e76b48b4 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -5,7 +5,7 @@ enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { renderable: fn() -> bool, weight : i8, - id : OptionId, + id : OptIden, container : ContainerType, components: PageContainer, template : String, @@ -17,7 +17,7 @@ impl PageComponent for Container { Container { renderable: always, weight : 0, - id : OptionId::none(), + id : OptIden::none(), container : ContainerType::Wrapper, components: PageContainer::new(), template : "default".to_owned(), diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index a1975ea4..fa9794f2 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -6,10 +6,10 @@ pub struct Button { renderable : fn() -> bool, weight : i8, button_type: ButtonType, - name : OptionAttr, - value : OptionAttr, - autofocus : OptionAttr, - disabled : OptionAttr, + name : OptAttr, + value : OptAttr, + autofocus : OptAttr, + disabled : OptAttr, template : String, } @@ -20,10 +20,10 @@ impl PageComponent for Button { renderable : always, weight : 0, button_type: ButtonType::Button, - name : OptionAttr::none(), - value : OptionAttr::none(), - autofocus : OptionAttr::none(), - disabled : OptionAttr::none(), + name : OptAttr::none(), + value : OptAttr::none(), + autofocus : OptAttr::none(), + disabled : OptAttr::none(), template : "default".to_owned(), } } @@ -42,14 +42,14 @@ impl PageComponent for Button { ButtonType::Reset => ("reset", "btn btn-primary form-reset" ), ButtonType::Submit => ("submit", "btn btn-primary form-submit") }; - let id_item = match &self.name.option() { + let id = match &self.name.option() { Some(name) => Some(format!("edit-{}", name)), _ => None }; html! { button type=(button_type) - id=[&id_item] + id=[&id] class=(button_class) name=[&self.name.option()] value=[&self.value.option()] diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 7f04691b..5e42bc6b 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -3,16 +3,16 @@ use crate::prelude::*; pub struct Date { renderable : fn() -> bool, weight : i8, - name : OptionAttr, - value : OptionAttr, - label : OptionAttr, - placeholder : OptionAttr, - autofocus : OptionAttr, - autocomplete: OptionAttr, - disabled : OptionAttr, - readonly : OptionAttr, - required : OptionAttr, - help_text : OptionAttr, + name : OptAttr, + value : OptAttr, + label : OptAttr, + placeholder : OptAttr, + autofocus : OptAttr, + autocomplete: OptAttr, + disabled : OptAttr, + readonly : OptAttr, + required : OptAttr, + help_text : OptAttr, template : String, } @@ -22,16 +22,16 @@ impl PageComponent for Date { Date { renderable : always, weight : 0, - name : OptionAttr::none(), - value : OptionAttr::none(), - label : OptionAttr::none(), - placeholder : OptionAttr::none(), - autofocus : OptionAttr::none(), - autocomplete: OptionAttr::none(), - disabled : OptionAttr::none(), - readonly : OptionAttr::none(), - required : OptionAttr::none(), - help_text : OptionAttr::none(), + name : OptAttr::none(), + value : OptAttr::none(), + label : OptAttr::none(), + placeholder : OptAttr::none(), + autofocus : OptAttr::none(), + autocomplete: OptAttr::none(), + disabled : OptAttr::none(), + readonly : OptAttr::none(), + required : OptAttr::none(), + help_text : OptAttr::none(), template : "default".to_owned(), } } @@ -45,7 +45,7 @@ impl PageComponent for Date { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (class_item, id_item) = match self.name.option() { + let (class, id) = match self.name.option() { Some(name) => ( format!("form-item form-item-{} form-type-date", name), Some(format!("edit-{}", name)) @@ -56,9 +56,9 @@ impl PageComponent for Date { ) }; html! { - div class=(class_item) { + div class=(class) { @if self.label.has_value() { - label class="form-label" for=[&id_item] { + label class="form-label" for=[&id] { (self.label.value()) " " @if self.required.has_value() { span @@ -72,7 +72,7 @@ impl PageComponent for Date { } input type="date" - id=[&id_item] + id=[&id] class="form-control" name=[&self.name.option()] value=[&self.value.option()] diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index e93926a7..385dd369 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -5,10 +5,10 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, weight : i8, - id : OptionId, - action : OptionAttr, + id : OptIden, + action : OptAttr, method : FormMethod, - charset : OptionAttr, + charset : OptAttr, elements : PageContainer, template : String, } @@ -19,10 +19,10 @@ impl PageComponent for Form { Form { renderable: always, weight : 0, - id : OptionId::none(), - action : OptionAttr::none(), + id : OptIden::none(), + action : OptAttr::none(), method : FormMethod::Post, - charset : OptionAttr::some("UTF-8"), + charset : OptAttr::some("UTF-8"), elements : PageContainer::new(), template : "default".to_owned(), } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index b27caf37..b7eca015 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -2,8 +2,8 @@ use crate::prelude::*; pub struct Hidden { weight : i8, - name : OptionId, - value : OptionAttr, + name : OptIden, + value : OptAttr, } impl PageComponent for Hidden { @@ -11,8 +11,8 @@ impl PageComponent for Hidden { fn new() -> Self { Hidden { weight : 0, - name : OptionId::none(), - value : OptionAttr::none(), + name : OptIden::none(), + value : OptAttr::none(), } } @@ -21,14 +21,14 @@ impl PageComponent for Hidden { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let id_item = match self.name.option() { + let id = match self.name.option() { Some(name) => Some(format!("value-{}", name)), _ => None }; html! { input type="hidden" - id=[&id_item] + id=[&id] name=[&self.name.option()] value=[&self.value.option()]; } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index c483c9a9..7622fd08 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -6,19 +6,19 @@ pub struct Input { renderable : fn() -> bool, weight : i8, input_type : InputType, - name : OptionId, - value : OptionAttr, - label : OptionAttr, + name : OptIden, + value : OptAttr, + label : OptAttr, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, - placeholder : OptionAttr, - autofocus : OptionAttr, - autocomplete: OptionAttr, - disabled : OptionAttr, - readonly : OptionAttr, - required : OptionAttr, - help_text : OptionAttr, + placeholder : OptAttr, + autofocus : OptAttr, + autocomplete: OptAttr, + disabled : OptAttr, + readonly : OptAttr, + required : OptAttr, + help_text : OptAttr, template : String, } @@ -29,19 +29,19 @@ impl PageComponent for Input { renderable : always, weight : 0, input_type : InputType::Textfield, - name : OptionId::none(), - value : OptionAttr::none(), - label : OptionAttr::none(), + name : OptIden::none(), + value : OptAttr::none(), + label : OptAttr::none(), size : Some(60), minlength : None, maxlength : Some(128), - placeholder : OptionAttr::none(), - autofocus : OptionAttr::none(), - autocomplete: OptionAttr::none(), - disabled : OptionAttr::none(), - readonly : OptionAttr::none(), - required : OptionAttr::none(), - help_text : OptionAttr::none(), + placeholder : OptAttr::none(), + autofocus : OptAttr::none(), + autocomplete: OptAttr::none(), + disabled : OptAttr::none(), + readonly : OptAttr::none(), + required : OptAttr::none(), + help_text : OptAttr::none(), template : "default".to_owned(), } } @@ -55,7 +55,7 @@ impl PageComponent for Input { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (input_type, class_type) = match &self.input_type { + let (type_input, type_class) = match &self.input_type { InputType::Email => ("email", "form-type-email"), InputType::Password => ("password", "form-type-password"), InputType::Search => ("search", "form-type-search"), @@ -63,20 +63,20 @@ impl PageComponent for Input { InputType::Textfield => ("text", "form-type-textfield"), InputType::Url => ("url", "form-type-url") }; - let (class_item, id_item) = match &self.name.option() { + let (class, id) = match &self.name.option() { Some(name) => ( - format!("form-item form-item-{} {}", name, class_type), + format!("form-item form-item-{} {}", name, type_class), Some(format!("edit-{}", name)) ), None => ( - format!("form-item {}", class_type), + format!("form-item {}", type_class), None ) }; html! { - div class=(class_item) { + div class=(class) { @if self.label.has_value() { - label class="form-label" for=[&id_item] { + label class="form-label" for=[&id] { (self.label.value()) " " @if self.required.has_value() { span @@ -89,8 +89,8 @@ impl PageComponent for Input { } } input - type=(input_type) - id=[&id_item] + type=(type_input) + id=[&id] class="form-control" name=[&self.name.option()] value=[&self.value.option()] diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 96463490..8bcfb54f 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub struct Column { renderable: fn() -> bool, weight : i8, - id : OptionId, + id : OptIden, components: PageContainer, template : String, } @@ -14,7 +14,7 @@ impl PageComponent for Column { Column { renderable: always, weight : 0, - id : OptionId::none(), + id : OptIden::none(), components: PageContainer::new(), template : "default".to_owned(), } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 6aed7d0f..7c94fea6 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub struct Row { renderable: fn() -> bool, weight : i8, - id : OptionId, + id : OptIden, columns : PageContainer, template : String, } @@ -14,7 +14,7 @@ impl PageComponent for Row { Row { renderable: always, weight : 0, - id : OptionId::none(), + id : OptIden::none(), columns : PageContainer::new(), template : "default".to_owned(), } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 10ac8ca5..0f529874 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -148,7 +148,7 @@ impl MenuItem { pub struct Menu { renderable: fn() -> bool, weight : i8, - id : OptionId, + id : OptIden, items : PageContainer, template : String, } @@ -159,7 +159,7 @@ impl PageComponent for Menu { Menu { renderable: always, weight : 0, - id : OptionId::none(), + id : OptIden::none(), items : PageContainer::new(), template : "default".to_owned(), } diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index f3d3a903..7fa78181 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -27,7 +27,7 @@ async fn demo() -> app::Result<Markup> { .using_theme("Bootsier") .with_title(l("page_title").as_str()) .add_to("content", hello_world()) - .add_to("content", hello_world2()) + .add_to("content", hello_world_original()) .add_to("content", just_visiting()) .add_to("content", about_pagetop()) .add_to("content", promo_pagetop()) @@ -35,7 +35,7 @@ async fn demo() -> app::Result<Markup> { .render() } -fn hello_world2() -> Container { +fn hello_world() -> Container { Container::header() .add(grid::Row::new() .add_column(grid::Column::new() @@ -76,7 +76,7 @@ fn hello_world2() -> Container { ) } -fn hello_world() -> Chunck { +fn hello_world_original() -> Chunck { Chunck::with(html! { header id="header" class="header" { div class="container" { diff --git a/pagetop/src/html/mod.rs b/pagetop/src/html/mod.rs index 60a9bd82..52f735fe 100644 --- a/pagetop/src/html/mod.rs +++ b/pagetop/src/html/mod.rs @@ -1,8 +1,8 @@ pub use maud::{DOCTYPE, Markup, PreEscaped, html}; -mod optional_id; -pub use optional_id::OptionId; -mod optional_attr; -pub use optional_attr::OptionAttr; +mod optiden; +pub use optiden::OptIden; +mod optattr; +pub use optattr::OptAttr; mod classes; pub use classes::Classes; diff --git a/pagetop/src/html/optional_attr.rs b/pagetop/src/html/optattr.rs similarity index 80% rename from pagetop/src/html/optional_attr.rs rename to pagetop/src/html/optattr.rs index f6b48189..af82751c 100644 --- a/pagetop/src/html/optional_attr.rs +++ b/pagetop/src/html/optattr.rs @@ -1,15 +1,15 @@ -pub struct OptionAttr(Option<String>); +pub struct OptAttr(Option<String>); -impl OptionAttr { +impl OptAttr { pub fn none() -> Self { - OptionAttr(None) + OptAttr(None) } pub fn some(value: &str) -> Self { let value = value.trim(); match value.is_empty() { - true => OptionAttr(None), - false => OptionAttr(Some(value.to_owned())), + true => OptAttr(None), + false => OptAttr(Some(value.to_owned())), } } diff --git a/pagetop/src/html/optional_id.rs b/pagetop/src/html/optiden.rs similarity index 88% rename from pagetop/src/html/optional_id.rs rename to pagetop/src/html/optiden.rs index 678ff5c8..ca10155e 100644 --- a/pagetop/src/html/optional_id.rs +++ b/pagetop/src/html/optiden.rs @@ -1,8 +1,8 @@ -pub struct OptionId(Option<String>); +pub struct OptIden(Option<String>); -impl OptionId { +impl OptIden { pub fn none() -> Self { - OptionId(None) + OptIden(None) } pub fn with_value(&mut self, id: &str) { diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 1ccb9603..5bd4696a 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,6 +1,6 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; -use crate::html::{Classes, DOCTYPE, Markup, OptionAttr, html}; +use crate::html::{Classes, DOCTYPE, Markup, OptAttr, html}; use crate::response::page::{PageAssets, PageComponent, PageContainer}; use std::sync::RwLock; @@ -40,10 +40,10 @@ static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { pub enum TextDirection { Auto, LeftToRight, RightToLeft } pub struct Page<'a> { - language : OptionAttr, - direction : OptionAttr, - title : OptionAttr, - description : OptionAttr, + language : OptAttr, + direction : OptAttr, + title : OptAttr, + description : OptAttr, assets : PageAssets, body_classes: Classes, regions : HashMap<&'a str, PageContainer>, @@ -55,15 +55,15 @@ impl<'a> Page<'a> { pub fn new() -> Self { Page { language : match &*DEFAULT_LANGUAGE { - Some(language) => OptionAttr::some(language), - _ => OptionAttr::none(), + Some(language) => OptAttr::some(language), + _ => OptAttr::none(), }, direction : match &*DEFAULT_DIRECTION { - Some(direction) => OptionAttr::some(direction), - _ => OptionAttr::none(), + Some(direction) => OptAttr::some(direction), + _ => OptAttr::none(), }, - title : OptionAttr::none(), - description : OptionAttr::none(), + title : OptAttr::none(), + description : OptAttr::none(), body_classes: Classes::some_class("body"), assets : PageAssets::new(), regions : COMPONENTS.read().unwrap().clone(), From 2476b2b9c8ff636d6028430fb6bbba3d3054931b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 28 Mar 2022 01:08:22 +0200 Subject: [PATCH 040/853] =?UTF-8?q?Corrige=20el=20r=C3=B3tulo=20de=20inici?= =?UTF-8?q?o=20en=20terminales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajusta el número de caracteres que se pueden mostrar en el rótulo de inicio según el número de columnas del terminal. Si es menor de 80 columnas mostrará directamente texto. --- pagetop/Cargo.toml | 2 ++ pagetop/src/app/banner/mod.rs | 20 ++++++++++++++++++-- pagetop/src/lib.rs | 8 ++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 514ab6e9..a4db3d98 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -27,6 +27,8 @@ downcast-rs = "1.2.0" figlet-rs = "0.1.3" futures = "0.3.21" once_cell = "1.10.0" +substring = "1.4.5" +term_size = "0.3.2" url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } diff --git a/pagetop/src/app/banner/mod.rs b/pagetop/src/app/banner/mod.rs index f6d63841..1cce7146 100644 --- a/pagetop/src/app/banner/mod.rs +++ b/pagetop/src/app/banner/mod.rs @@ -2,6 +2,7 @@ use crate::Lazy; use crate::config::SETTINGS; use figlet_rs::FIGfont; +use substring::Substring; static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { let slant = include_str!("slant.flf"); @@ -31,8 +32,23 @@ static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { pub fn print_on_startup() { if SETTINGS.app.startup_banner.to_lowercase() != "off" { - println!("\n{} {}\n\n Powered by PageTop {}\n", - FIGFONT.convert(&SETTINGS.app.name).unwrap(), + if let Some((term_width, _)) = term_size::dimensions() { + if term_width >= 80 { + let maxlen = (term_width / 10) - 2; + let mut app = SETTINGS.app.name.substring(0, maxlen).to_owned(); + if SETTINGS.app.name.len() > maxlen { + app = format!("{}...", app); + } + println!("\n{} {}\n\n Powered by PageTop {}\n", + FIGFONT.convert(&app).unwrap(), + &SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + return; + } + } + println!("\n{}\n{}\n\nPowered by PageTop {}\n", + &SETTINGS.app.name, &SETTINGS.app.description, env!("CARGO_PKG_VERSION") ); diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 73e17c8d..72ab7328 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,8 +1,8 @@ -// Global. +// Local. -pub use doc_comment::doc_comment; -pub use once_cell::sync::Lazy; -pub use futures::executor::block_on as run_now; +pub(crate) use doc_comment::doc_comment; +pub(crate) use once_cell::sync::Lazy; +pub(crate) use futures::executor::block_on as run_now; // ----------------------------------------------------------------------------- // APIs públicas. From 5aee113f547e93212a977ffbbda00e618660b697 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 28 Mar 2022 21:19:02 +0200 Subject: [PATCH 041/853] =?UTF-8?q?A=C3=B1ade=20el=20tema=20Bulmix=20basad?= =?UTF-8?q?o=20en=20el=20framework=20Bulma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/default.toml | 1 + pagetop/Cargo.toml | 17 +++--- pagetop/build.rs | 8 +++ pagetop/src/app/application.rs | 1 + pagetop/src/base/component/grid/column.rs | 9 ++- pagetop/src/base/component/grid/row.rs | 9 ++- pagetop/src/base/module/demopage/mod.rs | 2 +- pagetop/src/base/theme/bulmix/mod.rs | 34 +++++++++++ pagetop/src/base/theme/mod.rs | 3 +- pagetop/src/html/classes.rs | 61 +++++++------------ pagetop/src/html/optattr.rs | 13 ++-- pagetop/src/html/optiden.rs | 11 ++-- pagetop/src/lib.rs | 1 + pagetop/src/response/page/page.rs | 9 +-- pagetop/static/bulmix/css/bulma-rtl.min.css | 1 + .../static/bulmix/css/bulma-rtl.min.css.map | 1 + pagetop/static/bulmix/css/bulma.min.css | 1 + pagetop/static/bulmix/css/bulma.min.css.map | 1 + 18 files changed, 113 insertions(+), 70 deletions(-) create mode 100644 pagetop/src/base/theme/bulmix/mod.rs create mode 100644 pagetop/static/bulmix/css/bulma-rtl.min.css create mode 100644 pagetop/static/bulmix/css/bulma-rtl.min.css.map create mode 100644 pagetop/static/bulmix/css/bulma.min.css create mode 100644 pagetop/static/bulmix/css/bulma.min.css.map diff --git a/config/default.toml b/config/default.toml index 13012a93..6d6317f3 100644 --- a/config/default.toml +++ b/config/default.toml @@ -6,6 +6,7 @@ description = """\ #theme = "Aliner" #theme = "Minimal" theme = "Bootsier" +#theme = "Bulmix" language = "es-ES" [database] diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index a4db3d98..01eb60ec 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -22,14 +22,15 @@ categories = [ ] [dependencies] -doc-comment = "0.3.3" -downcast-rs = "1.2.0" -figlet-rs = "0.1.3" -futures = "0.3.21" -once_cell = "1.10.0" -substring = "1.4.5" -term_size = "0.3.2" -url = "2.2.2" +concat-string = "1.0.1" +doc-comment = "0.3.3" +downcast-rs = "1.2.0" +figlet-rs = "0.1.3" +futures = "0.3.21" +once_cell = "1.10.0" +substring = "1.4.5" +term_size = "0.3.2" +url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } diff --git a/pagetop/build.rs b/pagetop/build.rs index bd7e60a0..a8c287a8 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -27,4 +27,12 @@ fn main() { ) .build() .unwrap(); + + resource_dir("./static/bulmix") + .with_generated_filename( + Path::new(env::var("OUT_DIR").unwrap().as_str()) + .join("bulmix.rs") + ) + .build() + .unwrap(); } diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 070390c8..f0473180 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -31,6 +31,7 @@ impl Application { theme::register_theme(&base::theme::aliner::AlinerTheme); theme::register_theme(&base::theme::minimal::MinimalTheme); theme::register_theme(&base::theme::bootsier::BootsierTheme); + theme::register_theme(&base::theme::bulmix::BulmixTheme); // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 8bcfb54f..19eb577b 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -4,6 +4,7 @@ pub struct Column { renderable: fn() -> bool, weight : i8, id : OptIden, + classes : Classes, components: PageContainer, template : String, } @@ -15,6 +16,7 @@ impl PageComponent for Column { renderable: always, weight : 0, id : OptIden::none(), + classes : Classes::some(vec!["col"]), components: PageContainer::new(), template : "default".to_owned(), } @@ -30,7 +32,7 @@ impl PageComponent for Column { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[&self.id.option()] class="col" { + div id=[&self.id.option()] class=[&self.classes.option()] { (self.components.render(assets)) } } @@ -56,6 +58,11 @@ impl Column { self } + pub fn add_classes(mut self, classes: Vec<&str>) -> Self { + self.classes.add_classes(classes); + self + } + pub fn add(mut self, component: impl PageComponent) -> Self { self.components.add(component); self diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 7c94fea6..53719e3f 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -4,6 +4,7 @@ pub struct Row { renderable: fn() -> bool, weight : i8, id : OptIden, + classes : Classes, columns : PageContainer, template : String, } @@ -15,6 +16,7 @@ impl PageComponent for Row { renderable: always, weight : 0, id : OptIden::none(), + classes : Classes::some(vec!["row"]), columns : PageContainer::new(), template : "default".to_owned(), } @@ -30,7 +32,7 @@ impl PageComponent for Row { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[&self.id.option()] class="row" { + div id=[&self.id.option()] class=[&self.classes.option()] { (self.columns.render(assets)) } } @@ -56,6 +58,11 @@ impl Row { self } + pub fn add_classes(mut self, classes: Vec<&str>) -> Self { + self.classes.add_classes(classes); + self + } + pub fn add_column(mut self, column: grid::Column) -> Self { self.columns.add(column); self diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 7fa78181..c9fc9cc0 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -24,7 +24,7 @@ impl ModuleTrait for DemopageModule { async fn demo() -> app::Result<Markup> { Page::new() - .using_theme("Bootsier") + .using_theme("Bulmix") .with_title(l("page_title").as_str()) .add_to("content", hello_world()) .add_to("content", hello_world_original()) diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs new file mode 100644 index 00000000..b8d57ba7 --- /dev/null +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -0,0 +1,34 @@ +use crate::prelude::*; + +include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); + +pub struct BulmixTheme; + +impl ThemeTrait for BulmixTheme { + fn name(&self) -> &'static str { + "Bulmix" + } + + fn fullname(&self) -> String { + "Bulmix".to_owned() + } + + fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { + theme_static_files!(cfg, "/bulmix"); + } + + fn before_render_page(&self, page: &mut Page) { + page.assets() + .with_favicon( + Favicon::new() + .with_icon("/theme/favicon.png") + ) + .add_stylesheet( + StyleSheet::source( + "/bulmix/css/bulma.min.css?ver=0.9.3" + ) + .with_weight(-99) + ) + .add_jquery(); + } +} diff --git a/pagetop/src/base/theme/mod.rs b/pagetop/src/base/theme/mod.rs index baccfbd9..293e4e88 100644 --- a/pagetop/src/base/theme/mod.rs +++ b/pagetop/src/base/theme/mod.rs @@ -1,3 +1,4 @@ pub mod aliner; -pub mod bootsier; pub mod minimal; +pub mod bootsier; +pub mod bulmix; diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 16c5ac73..c2a35984 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,63 +1,48 @@ -pub struct Classes { - classes: Vec<String>, - option : Option<String>, - updated: bool, -} +use crate::concat_string; + +pub struct Classes(Option<String>); impl Classes { pub fn none() -> Self { - Classes { - classes: Vec::new(), - option : None, - updated: true, - } + Classes(None) } - pub fn some_class(class: &str) -> Self { - let mut c = Classes::none(); - c.add_class(class); - c - } - - pub fn some_classes(classes: Vec<String>) -> Self { + pub fn some(classes: Vec<&str>) -> Self { let mut c = Classes::none(); c.add_classes(classes); c } - pub fn add_class(&mut self, class: &str) { - let class = class.trim().replace(" ", "_"); - if !class.is_empty() && !self.classes.iter().any(|c| *c == class) { - self.classes.push(class.to_owned()); - self.updated = false; - } - } - - pub fn add_classes(&mut self, classes: Vec<String>) { + pub fn add_classes(&mut self, classes: Vec<&str>) { for class in classes.iter() { self.add_class(class); } } - pub fn classes(&mut self) -> &str { - match self.option() { + fn add_class(&mut self, class: &str) { + let class = class.trim().replace(" ", "_"); + if !class.is_empty() { + match &self.0 { + None => self.0 = Some(class), + Some(classes) => if !classes.split(" ").any(|c| *c == class) { + self.0 = Some(concat_string!(classes, " ", class)) + } + } + } + } + + pub fn classes(&self) -> &str { + match &self.0 { Some(classes) => classes.as_str(), None => "", } } pub fn has_classes(&self) -> bool { - self.classes.len() > 0 + self.0 != None } - pub fn option(&mut self) -> &Option<String> { - if !self.updated { - self.option = match self.classes.len() { - 0 => None, - _ => Some(self.classes.join(" ")), - }; - self.updated = true; - } - &self.option + pub fn option(&self) -> &Option<String> { + &self.0 } } diff --git a/pagetop/src/html/optattr.rs b/pagetop/src/html/optattr.rs index af82751c..3eed9aab 100644 --- a/pagetop/src/html/optattr.rs +++ b/pagetop/src/html/optattr.rs @@ -6,11 +6,9 @@ impl OptAttr { } pub fn some(value: &str) -> Self { - let value = value.trim(); - match value.is_empty() { - true => OptAttr(None), - false => OptAttr(Some(value.to_owned())), - } + let mut o = OptAttr::none(); + o.with_value(value); + o } pub fn with_value(&mut self, value: &str) { @@ -29,10 +27,7 @@ impl OptAttr { } pub fn has_value(&self) -> bool { - match &self.0 { - Some(_) => true, - None => false, - } + self.0 != None } pub fn option(&self) -> &Option<String> { diff --git a/pagetop/src/html/optiden.rs b/pagetop/src/html/optiden.rs index ca10155e..93caf18a 100644 --- a/pagetop/src/html/optiden.rs +++ b/pagetop/src/html/optiden.rs @@ -5,6 +5,12 @@ impl OptIden { OptIden(None) } + pub fn some(id: &str) -> Self { + let mut o = OptIden::none(); + o.with_value(id); + o + } + pub fn with_value(&mut self, id: &str) { let id = id.trim(); self.0 = match id.is_empty() { @@ -21,10 +27,7 @@ impl OptIden { } pub fn has_value(&self) -> bool { - match &self.0 { - Some(_) => true, - None => false, - } + self.0 != None } pub fn option(&self) -> &Option<String> { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 72ab7328..731271d3 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,5 +1,6 @@ // Local. +pub(crate) use concat_string::concat_string; pub(crate) use doc_comment::doc_comment; pub(crate) use once_cell::sync::Lazy; pub(crate) use futures::executor::block_on as run_now; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 5bd4696a..fedf05e4 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -64,7 +64,7 @@ impl<'a> Page<'a> { }, title : OptAttr::none(), description : OptAttr::none(), - body_classes: Classes::some_class("body"), + body_classes: Classes::some(vec!["body"]), assets : PageAssets::new(), regions : COMPONENTS.read().unwrap().clone(), template : "default".to_owned(), @@ -97,12 +97,7 @@ impl<'a> Page<'a> { self } - pub fn add_body_class(&mut self, class: &str) -> &mut Self { - self.body_classes.add_class(class); - self - } - - pub fn add_body_classes(&mut self, classes: Vec<String>) -> &mut Self { + pub fn add_body_classes(&mut self, classes: Vec<&str>) -> &mut Self { self.body_classes.add_classes(classes); self } diff --git a/pagetop/static/bulmix/css/bulma-rtl.min.css b/pagetop/static/bulmix/css/bulma-rtl.min.css new file mode 100644 index 00000000..36fa65bc --- /dev/null +++ b/pagetop/static/bulmix/css/bulma-rtl.min.css @@ -0,0 +1 @@ +/*! bulma.io v0.9.3 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-right:calc(-.5em - 1px);margin-left:.25em}.button .icon:last-child:not(:first-child){margin-right:.25em;margin-left:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-left:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-left:-1px}.buttons.has-addons .button:last-child{margin-left:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-right:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-right:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-right:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-right:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-left:.25em}.icon-text .icon:not(:first-child){margin-right:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 1.5rem 1.25rem 2.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{left:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:inherit}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-left:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-left:0}.tags.has-addons .tag:not(:first-child){margin-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.tags.has-addons .tag:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-right:.25rem;margin-left:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-right:-.375em;margin-left:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-right:.1875em;margin-left:-.375em}.tag:not(body) .icon:first-child:last-child{margin-right:-.375em;margin-left:-.375em}.tag:not(body).is-delete{margin-right:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-right:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;left:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-right:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-left:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;left:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-left:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-left:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-left:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-left:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-left:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;left:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-right:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-left:.5em}.breadcrumb .icon:last-child{margin-right:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-left:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;right:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-left:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-left:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-left:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-left:1rem}.media-right{margin-right:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-right:1px solid #dbdbdb;margin:.75em;padding-right:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-right:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;left:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-left:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-right:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-left:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;left:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-left:auto}.navbar-end{justify-content:flex-end;margin-right:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;right:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-left:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-right:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-left:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-left:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-left:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-left:.5em}.tabs .icon:last-child{margin-right:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:0 0 4px 4px}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-right:-1px}.tabs.is-toggle li:first-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li:last-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-right:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-right:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-right:50%}.columns.is-mobile>.column.is-offset-one-third{margin-right:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-right:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-right:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-right:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-right:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-right:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-right:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-right:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-right:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-right:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-right:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-right:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-right:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-right:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-right:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-right:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-right:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-right:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-right:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-right:75%}.column.is-offset-two-thirds-mobile{margin-right:66.6666%}.column.is-offset-half-mobile{margin-right:50%}.column.is-offset-one-third-mobile{margin-right:33.3333%}.column.is-offset-one-quarter-mobile{margin-right:25%}.column.is-offset-one-fifth-mobile{margin-right:20%}.column.is-offset-two-fifths-mobile{margin-right:40%}.column.is-offset-three-fifths-mobile{margin-right:60%}.column.is-offset-four-fifths-mobile{margin-right:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-right:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-right:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-right:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-right:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-right:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-right:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-right:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-right:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-right:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-right:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-right:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-right:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-right:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-right:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-right:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-right:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-right:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-right:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-right:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-right:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-right:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-right:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-right:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-right:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-right:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-right:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-right:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-right:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-right:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-right:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-right:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-right:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-right:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-right:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-right:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-right:75%}.column.is-offset-two-thirds-touch{margin-right:66.6666%}.column.is-offset-half-touch{margin-right:50%}.column.is-offset-one-third-touch{margin-right:33.3333%}.column.is-offset-one-quarter-touch{margin-right:25%}.column.is-offset-one-fifth-touch{margin-right:20%}.column.is-offset-two-fifths-touch{margin-right:40%}.column.is-offset-three-fifths-touch{margin-right:60%}.column.is-offset-four-fifths-touch{margin-right:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-right:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-right:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-right:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-right:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-right:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-right:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-right:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-right:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-right:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-right:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-right:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-right:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-right:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-right:75%}.column.is-offset-two-thirds-desktop{margin-right:66.6666%}.column.is-offset-half-desktop{margin-right:50%}.column.is-offset-one-third-desktop{margin-right:33.3333%}.column.is-offset-one-quarter-desktop{margin-right:25%}.column.is-offset-one-fifth-desktop{margin-right:20%}.column.is-offset-two-fifths-desktop{margin-right:40%}.column.is-offset-three-fifths-desktop{margin-right:60%}.column.is-offset-four-fifths-desktop{margin-right:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-right:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-right:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-right:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-right:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-right:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-right:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-right:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-right:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-right:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-right:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-right:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-right:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-right:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-right:75%}.column.is-offset-two-thirds-widescreen{margin-right:66.6666%}.column.is-offset-half-widescreen{margin-right:50%}.column.is-offset-one-third-widescreen{margin-right:33.3333%}.column.is-offset-one-quarter-widescreen{margin-right:25%}.column.is-offset-one-fifth-widescreen{margin-right:20%}.column.is-offset-two-fifths-widescreen{margin-right:40%}.column.is-offset-three-fifths-widescreen{margin-right:60%}.column.is-offset-four-fifths-widescreen{margin-right:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-right:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-right:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-right:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-right:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-right:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-right:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-right:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-right:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-right:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-right:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-right:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-right:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-right:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-right:75%}.column.is-offset-two-thirds-fullhd{margin-right:66.6666%}.column.is-offset-half-fullhd{margin-right:50%}.column.is-offset-one-third-fullhd{margin-right:33.3333%}.column.is-offset-one-quarter-fullhd{margin-right:25%}.column.is-offset-one-fifth-fullhd{margin-right:20%}.column.is-offset-two-fifths-fullhd{margin-right:40%}.column.is-offset-three-fifths-fullhd{margin-right:60%}.column.is-offset-four-fifths-fullhd{margin-right:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-right:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-right:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-right:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-right:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-right:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-right:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-right:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-right:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-right:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-right:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-right:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-right:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-right:100%}}.columns{margin-right:-.75rem;margin-left:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-right:0;margin-left:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-right:calc(-1 * var(--columnGap));margin-left:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-left:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma-rtl.min.css.map b/pagetop/static/bulmix/css/bulma-rtl.min.css.map new file mode 100644 index 00000000..731168fb --- /dev/null +++ b/pagetop/static/bulmix/css/bulma-rtl.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma-rtl.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EH5DE,iCAAiC;EG8DjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTwDgB;ESvDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AShaA;EAGE,uBV/C6B;EUgD7B,qBVrD4B;EUsD5B,iBX3DwB;EW4DxB,cV3D4B;EU4D5B,eAAe;EAGf,uBAAuB;EACvB,iCA5D6D;EA6D7D,iBA5D6B;EA6D7B,kBA7D6B;EA8D7B,8BA/D6D;EAgE7D,kBAAkB;EAClB,mBAAmB;AT+ZrB;;AS/aA;EAkBI,cAAc;ATialB;;ASnbA;EAwBM,aAAa;EACb,YAAY;AT+ZlB;;ASxbA;ER+FI,gCQpEsG;ERoEtG,mBQnEmE;ATiavE;;AS7bA;ER+FI,oBQjEmE;ERiEnE,+BQhEsG;ATma1G;;ASlcA;EAiCM,+BAAiF;EACjF,gCAAkF;ATqaxF;;ASvcA;EAsCI,qBVxF0B;EUyF1B,cV5F0B;ACigB9B;;AS5cA;EA0CI,qBV/E8B;EUgF9B,cVhG0B;ACsgB9B;;ASjdA;EA6CM,iDVlF4B;AC0flC;;ASrdA;EAgDI,qBVpG0B;EUqG1B,cVtG0B;AC+gB9B;;AS1dA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV1G0B;EU2G1B,0BAzF8B;ATmgBlC;;ASjeA;EA4DM,4BV1GwB;EU2GxB,cVlHwB;AC2hB9B;;ASteA;EAgEM,yBCd2B;EDe3B,cVtHwB;ACgiB9B;;AS3eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT4atB;;ASlfA;EAwEI,gBAtG0B;EAuG1B,yBAtGmC;EAuGnC,cV/G8B;EUgH9B,qBAtG0B;ATohB9B;;ASzfA;EA8EM,cVnH4B;EUoH5B,0BAxGmC;ATuhBzC;;AS9fA;EAoFM,uBVhIyB;EUiIzB,yBAAyB;EACzB,cV/IuB;AC6jB7B;;ASpgBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,cVpJqB;ACmkB7B;;AS1gBA;EA8FQ,yBAAyB;EACzB,cVxJqB;ACwkB7B;;AS/gBA;EAiGU,mDV7IqB;AC+jB/B;;ASnhBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,cV/JqB;ACklB7B;;ASzhBA;;EAyGQ,uBVrJuB;EUsJvB,yBAAyB;EACzB,gBAAgB;ATqbxB;;AShiBA;EA6GQ,yBVtKqB;EUuKrB,YV1JuB;ACilB/B;;ASriBA;EAiHU,uBC/DuB;AVufjC;;ASziBA;;EAoHU,yBV7KmB;EU8KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVnKqB;AC6lB/B;;ASjjBA;EA0HU,gEAA4E;AT2btF;;ASrjBA;EA4HQ,6BAA6B;EAC7B,mBVzKuB;EU0KvB,YV1KuB;ACumB/B;;AS3jBA;EAmIU,uBV/KqB;EUgLrB,mBVhLqB;EUiLrB,cV9LmB;AC0nB7B;;ASjkBA;EAwIY,4DAA8D;AT6b1E;;ASrkBA;EA8Ic,gEAA4E;AT2b1F;;ASzkBA;;EAiJU,6BAA6B;EAC7B,mBV9LqB;EU+LrB,gBAAgB;EAChB,YVhMqB;AC6nB/B;;ASjlBA;EAsJQ,6BAA6B;EAC7B,qBVhNqB;EUiNrB,cVjNqB;ACgpB7B;;ASvlBA;EA6JU,yBVtNmB;EUuNnB,YV1MqB;ACwoB/B;;AS5lBA;EAqKc,4DAA8D;AT2b5E;;AShmBA;;EAwKU,6BAA6B;EAC7B,qBVlOmB;EUmOnB,gBAAgB;EAChB,cVpOmB;ACiqB7B;;ASxmBA;EAoFM,yBV7IuB;EU8IvB,yBAAyB;EACzB,YVlIyB;AC0pB/B;;AS9mBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,YVvIuB;ACgqB/B;;ASpnBA;EA8FQ,yBAAyB;EACzB,YV3IuB;ACqqB/B;;ASznBA;EAiGU,gDV1JmB;ACsrB7B;;AS7nBA;EAoGQ,uBClDyB;EDmDzB,yBAAyB;EACzB,YVlJuB;AC+qB/B;;ASnoBA;;EAyGQ,yBVlKqB;EUmKrB,yBAAyB;EACzB,gBAAgB;AT+hBxB;;AS1oBA;EA6GQ,uBVzJuB;EU0JvB,cVvKqB;ACwsB7B;;AS/oBA;EAiHU,yBC/DuB;AVimBjC;;ASnpBA;;EAoHU,uBVhKqB;EUiKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVhLmB;ACotB7B;;AS3pBA;EA0HU,4DAA4E;ATqiBtF;;AS/pBA;EA4HQ,6BAA6B;EAC7B,qBVtLqB;EUuLrB,cVvLqB;AC8tB7B;;ASrqBA;EAmIU,yBV5LmB;EU6LnB,qBV7LmB;EU8LnB,YVjLqB;ACutB/B;;AS3qBA;EAwIY,gEAA8D;ATuiB1E;;AS/qBA;EA8Ic,4DAA4E;ATqiB1F;;ASnrBA;;EAiJU,6BAA6B;EAC7B,qBV3MmB;EU4MnB,gBAAgB;EAChB,cV7MmB;ACovB7B;;AS3rBA;EAsJQ,6BAA6B;EAC7B,mBVnMuB;EUoMvB,YVpMuB;AC6uB/B;;ASjsBA;EA6JU,uBVzMqB;EU0MrB,cVvNmB;AC+vB7B;;AStsBA;EAqKc,gEAA8D;ATqiB5E;;AS1sBA;;EAwKU,6BAA6B;EAC7B,mBVrNqB;EUsNrB,gBAAgB;EAChB,YVvNqB;AC8vB/B;;ASltBA;EAoFM,4BVlIwB;EUmIxB,yBAAyB;EACzB,yBCjEe;AVmsBrB;;ASxtBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVysBrB;;AS9tBA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV8sBrB;;ASnuBA;EAiGU,mDV/IoB;ACqxB9B;;ASvuBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVwtBrB;;AS7uBA;;EAyGQ,4BVvJsB;EUwJtB,yBAAyB;EACzB,gBAAgB;ATyoBxB;;ASpvBA;EA6GQ,oCCxFa;EDyFb,iBV5JsB;ACuyB9B;;ASzvBA;EAiHU,oCC/DuB;AV2sBjC;;AS7vBA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVrKoB;ACmzB9B;;ASrwBA;EA0HU,sFAA4E;AT+oBtF;;ASzwBA;EA4HQ,6BAA6B;EAC7B,wBV3KsB;EU4KtB,iBV5KsB;AC6zB9B;;AS/wBA;EAmIU,4BVjLoB;EUkLpB,wBVlLoB;EUmLpB,yBChHW;AVgwBrB;;ASrxBA;EAwIY,sEAA8D;ATipB1E;;ASzxBA;EA8Ic,sFAA4E;AT+oB1F;;AS7xBA;;EAiJU,6BAA6B;EAC7B,wBVhMoB;EUiMpB,gBAAgB;EAChB,iBVlMoB;ACm1B9B;;ASryBA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVsxBrB;;AS3yBA;EA6JU,oCCxIW;EDyIX,iBV5MoB;AC81B9B;;AShzBA;EAqKc,sEAA8D;AT+oB5E;;ASpzBA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVuyBrB;;AS5zBA;EAoFM,yBVzIwB;EU0IxB,yBAAyB;EACzB,WC/DU;AV2yBhB;;ASl0BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVizBhB;;ASx0BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVszBhB;;AS70BA;EAiGU,gDVtJoB;ACs4B9B;;ASj1BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVg0BhB;;ASv1BA;;EAyGQ,yBV9JsB;EU+JtB,yBAAyB;EACzB,gBAAgB;ATmvBxB;;AS91BA;EA6GQ,sBCtFQ;EDuFR,cVnKsB;ACw5B9B;;ASn2BA;EAiHU,yBC/DuB;AVqzBjC;;ASv2BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5KoB;ACo6B9B;;AS/2BA;EA0HU,0DAA4E;ATyvBtF;;ASn3BA;EA4HQ,6BAA6B;EAC7B,qBVlLsB;EUmLtB,cVnLsB;AC86B9B;;ASz3BA;EAmIU,yBVxLoB;EUyLpB,qBVzLoB;EU0LpB,WC9GM;AVw2BhB;;AS/3BA;EAwIY,gEAA8D;AT2vB1E;;ASn4BA;EA8Ic,0DAA4E;ATyvB1F;;ASv4BA;;EAiJU,6BAA6B;EAC7B,qBVvMoB;EUwMpB,gBAAgB;EAChB,cVzMoB;ACo8B9B;;AS/4BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV83BhB;;ASr5BA;EA6JU,sBCtIM;EDuIN,cVnNoB;AC+8B9B;;AS15BA;EAqKc,gEAA8D;ATyvB5E;;AS95BA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+4BhB;;ASt6BA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WC/DU;AVq5BhB;;AS56BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV25BhB;;ASl7BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVg6BhB;;ASv7BA;EAiGU,iDVxIwB;ACk+BlC;;AS37BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV06BhB;;ASj8BA;;EAyGQ,yBVhJ0B;EUiJ1B,yBAAyB;EACzB,gBAAgB;AT61BxB;;ASx8BA;EA6GQ,sBCtFQ;EDuFR,cVrJ0B;ACo/BlC;;AS78BA;EAiHU,yBC/DuB;AV+5BjC;;ASj9BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACggClC;;ASz9BA;EA0HU,0DAA4E;ATm2BtF;;AS79BA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC0gClC;;ASn+BA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC9GM;AVk9BhB;;ASz+BA;EAwIY,gEAA8D;ATq2B1E;;AS7+BA;EA8Ic,0DAA4E;ATm2B1F;;ASj/BA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACgiClC;;ASz/BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVw+BhB;;AS//BA;EA6JU,sBCtIM;EDuIN,cVrMwB;AC2iClC;;ASpgCA;EAqKc,gEAA8D;ATm2B5E;;ASxgCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVy/BhB;;AShhCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV8+BrE;;ASrhCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVo/BrE;;AS3hCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV0/BrE;;ASjiCA;EAoFM,yBVzH4B;EU0H5B,yBAAyB;EACzB,WC/DU;AVghChB;;ASviCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVshChB;;AS7iCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AV2hChB;;ASljCA;EAiGU,iDVtIwB;AC2lClC;;AStjCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVqiChB;;AS5jCA;;EAyGQ,yBV9I0B;EU+I1B,yBAAyB;EACzB,gBAAgB;ATw9BxB;;ASnkCA;EA6GQ,sBCtFQ;EDuFR,cVnJ0B;AC6mClC;;ASxkCA;EAiHU,yBC/DuB;AV0hCjC;;AS5kCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5JwB;ACynClC;;ASplCA;EA0HU,0DAA4E;AT89BtF;;ASxlCA;EA4HQ,6BAA6B;EAC7B,qBVlK0B;EUmK1B,cVnK0B;ACmoClC;;AS9lCA;EAmIU,yBVxKwB;EUyKxB,qBVzKwB;EU0KxB,WC9GM;AV6kChB;;ASpmCA;EAwIY,gEAA8D;ATg+B1E;;ASxmCA;EA8Ic,0DAA4E;AT89B1F;;AS5mCA;;EAiJU,6BAA6B;EAC7B,qBVvLwB;EUwLxB,gBAAgB;EAChB,cVzLwB;ACypClC;;ASpnCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVmmChB;;AS1nCA;EA6JU,sBCtIM;EDuIN,cVnMwB;ACoqClC;;AS/nCA;EAqKc,gEAA8D;AT89B5E;;ASnoCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVonChB;;AS3oCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVymCrE;;AShpCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV+mCrE;;AStpCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVqnCrE;;AS5pCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WC/DU;AV2oChB;;ASlqCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVipChB;;ASxqCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVspChB;;AS7qCA;EAiGU,kDVvIwB;ACutClC;;ASjrCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVgqChB;;ASvrCA;;EAyGQ,yBV/I0B;EUgJ1B,yBAAyB;EACzB,gBAAgB;ATmlCxB;;AS9rCA;EA6GQ,sBCtFQ;EDuFR,cVpJ0B;ACyuClC;;ASnsCA;EAiHU,yBC/DuB;AVqpCjC;;ASvsCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACqvClC;;AS/sCA;EA0HU,0DAA4E;ATylCtF;;ASntCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;AC+vClC;;ASztCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC9GM;AVwsChB;;AS/tCA;EAwIY,gEAA8D;AT2lC1E;;ASnuCA;EA8Ic,0DAA4E;ATylC1F;;ASvuCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACqxClC;;AS/uCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV8tChB;;ASrvCA;EA6JU,sBCtIM;EDuIN,cVpMwB;ACgyClC;;AS1vCA;EAqKc,gEAA8D;ATylC5E;;AS9vCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+uChB;;AStwCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVouCrE;;AS3wCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV0uCrE;;ASjxCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVgvCrE;;ASvxCA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WC/DU;AVswChB;;AS7xCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV4wChB;;ASnyCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVixChB;;ASxyCA;EAiGU,kDVzIwB;ACo1ClC;;AS5yCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV2xChB;;ASlzCA;;EAyGQ,yBVjJ0B;EUkJ1B,yBAAyB;EACzB,gBAAgB;AT8sCxB;;ASzzCA;EA6GQ,sBCtFQ;EDuFR,cVtJ0B;ACs2ClC;;AS9zCA;EAiHU,yBC/DuB;AVgxCjC;;ASl0CA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACk3ClC;;AS10CA;EA0HU,0DAA4E;ATotCtF;;AS90CA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC43ClC;;ASp1CA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC9GM;AVm0ChB;;AS11CA;EAwIY,gEAA8D;ATstC1E;;AS91CA;EA8Ic,0DAA4E;ATotC1F;;ASl2CA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACk5ClC;;AS12CA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVy1ChB;;ASh3CA;EA6JU,sBCtIM;EDuIN,cVtMwB;AC65ClC;;ASr3CA;EAqKc,gEAA8D;ATotC5E;;ASz3CA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV02ChB;;ASj4CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV+1CrE;;ASt4CA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVq2CrE;;AS54CA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV22CrE;;ASl5CA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,yBCjEe;AVm4CrB;;ASx5CA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVy4CrB;;AS95CA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV84CrB;;ASn6CA;EAiGU,mDV1IwB;ACg9ClC;;ASv6CA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVw5CrB;;AS76CA;;EAyGQ,yBVlJ0B;EUmJ1B,yBAAyB;EACzB,gBAAgB;ATy0CxB;;ASp7CA;EA6GQ,oCCxFa;EDyFb,cVvJ0B;ACk+ClC;;ASz7CA;EAiHU,oCC/DuB;AV24CjC;;AS77CA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;AC8+ClC;;ASr8CA;EA0HU,sFAA4E;AT+0CtF;;ASz8CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;ACw/ClC;;AS/8CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,yBChHW;AVg8CrB;;ASr9CA;EAwIY,gEAA8D;ATi1C1E;;ASz9CA;EA8Ic,sFAA4E;AT+0C1F;;AS79CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;AC8gDlC;;ASr+CA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVs9CrB;;AS3+CA;EA6JU,oCCxIW;EDyIX,cVvMwB;ACyhDlC;;ASh/CA;EAqKc,gEAA8D;AT+0C5E;;ASp/CA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVu+CrB;;AS5/CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV09CrE;;ASjgDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVg+CrE;;ASvgDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVs+CrE;;AS7gDA;EAoFM,yBVvH2B;EUwH3B,yBAAyB;EACzB,WC/DU;AV4/ChB;;ASnhDA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVkgDhB;;ASzhDA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVugDhB;;AS9hDA;EAiGU,kDVpIuB;ACqkDjC;;ASliDA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVihDhB;;ASxiDA;;EAyGQ,yBV5IyB;EU6IzB,yBAAyB;EACzB,gBAAgB;ATo8CxB;;AS/iDA;EA6GQ,sBCtFQ;EDuFR,cVjJyB;ACulDjC;;ASpjDA;EAiHU,yBC/DuB;AVsgDjC;;ASxjDA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV1JuB;ACmmDjC;;AShkDA;EA0HU,0DAA4E;AT08CtF;;ASpkDA;EA4HQ,6BAA6B;EAC7B,qBVhKyB;EUiKzB,cVjKyB;AC6mDjC;;AS1kDA;EAmIU,yBVtKuB;EUuKvB,qBVvKuB;EUwKvB,WC9GM;AVyjDhB;;AShlDA;EAwIY,gEAA8D;AT48C1E;;ASplDA;EA8Ic,0DAA4E;AT08C1F;;ASxlDA;;EAiJU,6BAA6B;EAC7B,qBVrLuB;EUsLvB,gBAAgB;EAChB,cVvLuB;ACmoDjC;;AShmDA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV+kDhB;;AStmDA;EA6JU,sBCtIM;EDuIN,cVjMuB;AC8oDjC;;AS3mDA;EAqKc,gEAA8D;AT08C5E;;AS/mDA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVgmDhB;;ASvnDA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVqlDrE;;AS5nDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV2lDrE;;ASloDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVimDrE;;ASxoDA;EARE,kBVbc;ACiqDhB;;AStpDE;EACE,kBVkBc;ACuoDlB;;AShpDA;EANE,eVhBW;AC0qDb;;ASppDA;EAJE,kBVnBc;AC+qDhB;;ASxpDA;EAFE,iBVtBa;ACorDf;;AS5pDA;;EAyMI,uBVrP2B;EUsP3B,qBV3P0B;EU4P1B,gBAhOyB;EAiOzB,YAhOyB;ATwrD7B;;ASpqDA;EA8MI,aAAa;EACb,WAAW;AT09Cf;;ASzqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT49CxB;;AS9qDA;ERlDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQkQhC,6BAA6B;AT+9CnC;;ASrrDA;EAwNI,4BVtQ0B;EUuQ1B,qBV1Q0B;EU2Q1B,cV7Q0B;EU8Q1B,gBAAgB;EAChB,oBAAoB;ATi+CxB;;AS7rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATm+C/D;;ASj+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATo+C7B;;ASx+CA;EAMI,qBAAqB;ATs+CzB;;AS5+CA;ERnII,mBQ2IwC;ATw+C5C;;ASh/CA;EAUI,sBAAsB;AT0+C1B;;ASp/CA;EAYI,mBAAmB;AT4+CvB;;ASx/CA;EA1OE,kBVbc;ACmvDhB;;ASxuDE;EACE,kBVkBc;ACytDlB;;AShgDA;EAtOE,kBVnBc;AC6vDhB;;ASpgDA;EApOE,iBVtBa;ACkwDf;;ASxgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATk/CjC;;AS7gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ERjK9B,iBQkKwC;ATo/C5C;;ASnhDA;ERnII,cQoKqC;ATs/CzC;;ASvhDA;EAoCQ,UAAU;ATu/ClB;;AS3hDA;EA0CQ,UAAU;ATq/ClB;;AS/hDA;EA4CU,UAAU;ATu/CpB;;ASniDA;EA8CQ,YAAY;EACZ,cAAc;ATy/CtB;;ASxiDA;EAiDI,uBAAuB;AT2/C3B;;AS5iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT4/C7B;;ASjjDA;EAuDI,yBAAyB;AT8/C7B;;ASrjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT+/C7B;;AWl1DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WA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wB;EgBsCxB,WLsCU;AVovEhB;;Ae3zEA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyvEhB;;Aeh0EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV8uErE;;Aer0EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmwEhB;;Ae10EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVwvErE;;Ae/0EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6wEhB;;Aep1EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVkwErE;;Aez1EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuxEhB;;Ae91EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV4wErE;;Aen2EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVmyErB;;Aex2EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVsxErE;;Ae72EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV2yEhB;;Ael3EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVgyErE;;AgBx3EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjBwDqB;EiBvDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB03Eb;;AgBp4EA;EAYI,yBjBX2B;ACu4E/B;;AgBx4EA;EAcI,yBjBjB0B;AC+4E9B;;AgB54EA;EAgBI,yBjBnB0B;ACm5E9B;;AgBh5EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk4EhB;;AgBr5EA;EAyBQ,uBjBpBuB;ACo5E/B;;AgBz5EA;EA2BQ,uBjBtBuB;ACw5E/B;;AgB75EA;EA6BQ,uBjBxBuB;AC45E/B;;AgBj6EA;EA+BQ,mEAA2F;AhBs4EnG;;AgBr6EA;EAyBQ,yBjBjCqB;ACi7E7B;;AgBz6EA;EA2BQ,yBjBnCqB;ACq7E7B;;AgB76EA;EA6BQ,yBjBrCqB;ACy7E7B;;AgBj7EA;EA+BQ,qEAA2F;AhBs5EnG;;AgBr7EA;EAyBQ,4BjBtBsB;ACs7E9B;;AgBz7EA;EA2BQ,4BjBxBsB;AC07E9B;;AgB77EA;EA6BQ,4BjB1BsB;AC87E9B;;AgBj8EA;EA+BQ,wEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjB7BsB;AC68E9B;;AgBz8EA;EA2BQ,yBjB/BsB;ACi9E9B;;AgB78EA;EA6BQ,yBjBjCsB;ACq9E9B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,yBjBf0B;AC+8ElC;;AgBz9EA;EA2BQ,yBjBjB0B;ACm9ElC;;AgB79EA;EA6BQ,yBjBnB0B;ACu9ElC;;AgBj+EA;EA+BQ,qEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjBb0B;AC69ElC;;AgBz+EA;EA2BQ,yBjBf0B;ACi+ElC;;AgB7+EA;EA6BQ,yBjBjB0B;ACq+ElC;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBd0B;AC8+ElC;;AgBz/EA;EA2BQ,yBjBhB0B;ACk/ElC;;AgB7/EA;EA6BQ,yBjBlB0B;ACs/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBhB0B;ACggFlC;;AgBzgFA;EA2BQ,yBjBlB0B;ACogFlC;;AgB7gFA;EA6BQ,yBjBpB0B;ACwgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBjB0B;ACihFlC;;AgBzhFA;EA2BQ,yBjBnB0B;ACqhFlC;;AgB7hFA;EA6BQ,yBjBrB0B;ACyhFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBXyB;AC2hFjC;;AgBziFA;EA2BQ,yBjBbyB;AC+hFjC;;AgB7iFA;EA6BQ,yBjBfyB;ACmiFjC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBuhF9B;;AgBjkFA;EA4CM,6BAA6B;AhByhFnC;;AgBrkFA;EA8CM,6BAA6B;AhB2hFnC;;AgBzkFA;EAgDM,oBAAoB;AhB6hF1B;;AgB7kFA;EAoDI,ejBxBY;ACqjFhB;;AgBjlFA;EAsDI,ejB5BY;AC2jFhB;;AgBrlFA;EAwDI,cjB/BW;ACgkFf;;AgB/hFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AgBxiFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AiB/kFA;EAEE,uBlBhB6B;EkBiB7B,clB1B4B;AC2mF9B;;AiBplFA;;EAMI,yBlBzB0B;EkB0B1B,qBA9B6B;EA+B7B,qBA9B6B;EA+B7B,mBAAmB;AjBmlFvB;;AiB5lFA;;EAeQ,uBlB7BuB;EkB8BvB,mBlB9BuB;EkB+BvB,clB5CqB;AC8nF7B;;AiBnmFA;;EAeQ,yBlB1CqB;EkB2CrB,qBlB3CqB;EkB4CrB,YlB/BuB;ACwnF/B;;AiB1mFA;;EAeQ,4BlB/BsB;EkBgCtB,wBlBhCsB;EkBiCtB,yBPkCa;AV8jFrB;;AiBjnFA;;EAeQ,yBlBtCsB;EkBuCtB,qBlBvCsB;EkBwCtB,WPoCQ;AVmkFhB;;AiBxnFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPoCQ;AV0kFhB;;AiB/nFA;;EAeQ,yBlBtB0B;EkBuB1B,qBlBvB0B;EkBwB1B,WPoCQ;AVilFhB;;AiBtoFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPoCQ;AVwlFhB;;AiB7oFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPoCQ;AV+lFhB;;AiBppFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,yBPkCa;AVwmFrB;;AiB3pFA;;EAeQ,yBlBpByB;EkBqBzB,qBlBrByB;EkBsBzB,WPoCQ;AV6mFhB;;AiBlqFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBmpFf;;AiBxqFA;;EAuBM,yBlBhC4B;EkBiC5B,WP6BU;AVynFhB;;AiB9qFA;;;;EA2BQ,mBAAmB;AjB0pF3B;;AiBrrFA;;EA6BM,sBAAsB;AjB6pF5B;;AiB1rFA;EA+BI,clBtD0B;ACqtF9B;;AiB9rFA;EAiCM,mBAAmB;AjBiqFzB;;AiBlsFA;EAoCM,yBlB7C4B;EkB8C5B,WPgBU;AVkpFhB;;AiBvsFA;;EAwCQ,mBAAmB;AjBoqF3B;;AiB5sFA;;EA2CQ,kBPUQ;EOTR,mBAAmB;AjBsqF3B;;AiBltFA;EA8CI,6BA5DqC;AjBouFzC;;AiBttFA;;EAiDM,qBApEgC;EAqEhC,clBzEwB;ACmvF9B;;AiB5tFA;EAoDI,6BAhEqC;AjB4uFzC;;AiBhuFA;;EAuDM,qBAxEgC;EAyEhC,clB/EwB;AC6vF9B;;AiBtuFA;EA0DI,6BAvEqC;AjBuvFzC;;AiB1uFA;;EA+DU,sBAAsB;AjBgrFhC;;AiB/uFA;;EAoEM,iBAAiB;AjBgrFvB;;AiBpvFA;;EAyEU,wBAAwB;AjBgrFlC;;AiBzvFA;EA2EI,WAAW;AjBkrFf;;AiB7vFA;EAgFU,yBlB/FoB;ACgxF9B;;AiBjwFA;EAqFY,yBlBpGkB;ACoxF9B;;AiBrwFA;EAuFc,4BlBvGgB;ACyxF9B;;AiBzwFA;;EA2FM,qBAAqB;AjBmrF3B;;AiB9wFA;EAgGU,yBlB/GoB;ACiyF9B;;AiBhrFA;EhBjEE,iCAAiC;EgBoEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBkrFjB;;AkB7yFA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBgzF7B;;AkBpzFA;EAMI,qBAAqB;AlBkzFzB;;AkBxzFA;EjBiJI,mBiBzIwC;AlBozF5C;;AkB5zFA;EAUI,sBAAsB;AlBszF1B;;AkBh0FA;EAYI,mBAAmB;AlBwzFvB;;AkBp0FA;EAgBM,enBYO;AC4yFb;;AkBx0FA;EAmBM,kBnBQU;ACizFhB;;AkB50FA;EAqBI,uBAAuB;AlB2zF3B;;AkBh1FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB6zF1B;;AkBr1FA;EA0BI,yBAAyB;AlB+zF7B;;AkBz1FA;EA6BQ,mBAAmB;AlBg0F3B;;AkB71FA;EA+BQ,eAAe;AlBk0FvB;;AkBj2FA;EjBiJI,ciB/GmC;AlBm0FvC;;AkBr2FA;EjBiJI,eiB7GqC;EAK/B,0BAA0B;EAC1B,6BAA6B;AlBi0FvC;;AkB32FA;EAgDU,yBAAyB;EACzB,4BAA4B;AlB+zFtC;;AkB7zFA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBMU;EmBLV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg0FrB;;AkB50FA;EjB8FI,qBiBhFuC;EjBgFvC,sBiB/EyC;AlBk0F7C;;AkBj1FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg5F7B;;AkBt1FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw4F/B;;AkB31FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV40FrB;;AkBh2FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+0FhB;;AkBr2FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo1FhB;;AkB12FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVy0FrE;;AkB/2FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV81FhB;;AkBp3FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVm1FrE;;AkBz3FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw2FhB;;AkB93FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV61FrE;;AkBn4FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk3FhB;;AkBx4FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVu2FrE;;AkB74FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV83FrB;;AkBl5FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVi3FrE;;AkBv5FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs4FhB;;AkB55FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV23FrE;;AkBj6FA;EAgCI,kBnBtDY;AC27FhB;;AkBr6FA;EAkCI,enBzDS;ACg8Fb;;AkBz6FA;EAoCI,kBnB5DY;ACq8FhB;;AkB76FA;EjB8FI,sBiBvD0C;EjBuD1C,qBiBtD0C;AlB04F9C;;AkBl7FA;EjB8FI,sBiBpD0C;EjBoD1C,qBiBnD0C;AlB44F9C;;AkBv7FA;EjB8FI,sBiBjD0C;EjBiD1C,qBiBhD0C;AlB84F9C;;AkB57FA;EjB8FI,iBiBrJmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+4Fd;;AkBn8FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg5FrC;;AkB98FA;EAgEM,WAAW;EACX,UAAU;AlBk5FhB;;AkBn9FA;EAmEM,WAAW;EACX,UAAU;AlBo5FhB;;AkBx9FA;EAuEM,yBAAmD;AlBq5FzD;;AkB59FA;EAyEM,yBAAoD;AlBu5F1D;;AkBh+FA;EA2EI,qBnBhEmB;ACy9FvB;;AkBv5FA;EAEI,0BAA0B;AlBy5F9B;;AmB/gGA;;EAGE,sBAAsB;AnBihGxB;;AmBphGA;;;;EAMI,oBAAoB;AnBqhGxB;;AmB3hGA;;EAQI,iBApBmB;AnB4iGvB;;AmBhiGA;;EAUI,iBArBmB;AnBgjGvB;;AmBriGA;;EAYI,sBAAsB;AnB8hG1B;;AmB5hGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgkGzB;;AmBniGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmkG7B;;AmBxiGA;EAWI,oBA3B+B;AnB4jGnC;;AmB5iGA;EAgBM,epBnBO;ACmjGb;;AmBhjGA;EAgBM,iBpBlBS;ACsjGf;;AmBpjGA;EAgBM,epBjBO;ACyjGb;;AmBxjGA;EAgBM,iBpBhBS;AC4jGf;;AmB5jGA;EAgBM,kBpBfU;AC+jGhB;;AmBhkGA;EAgBM,epBdO;ACkkGb;;AmBpkGA;EAgBM,kBpBbU;ACqkGhB;;AmBtjGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkmG3B;;AmB7jGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4kGrB;;AmBlkGA;EAWI,oBA7C+B;AnBwmGnC;;AmBtkGA;EAgBM,epBrCO;AC+lGb;;AmB1kGA;EAgBM,iBpBpCS;ACkmGf;;AmB9kGA;EAgBM,epBnCO;ACqmGb;;AmBllGA;EAgBM,iBpBlCS;ACwmGf;;AmBtlGA;EAgBM,kBpBjCU;AC2mGhB;;AmB1lGA;EAgBM,epBhCO;AC8mGb;;AmB9lGA;EAgBM,kBpB/BU;ACinGhB;;AoB/oGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkpG3B;;AoB7oGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBkDqB;EqBjDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgpGrB;;AqB9qGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBiCU;EuBhCV,cvB/B4B;ACgrG9B;;ACnnGI;EqB5BA,4BvBjC0B;ACorG9B;;ACvnGI;EqB5BA,4BvBjC0B;ACwrG9B;;AC3nGI;EqB5BA,4BvBjC0B;AC4rG9B;;AC/nGI;EqB5BA,4BvBjC0B;ACgsG9B;;AsB9pGE;EAEE,qBvBjC0B;ACisG9B;;AsB/pGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACyrGlC;;AsB9pGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACktG9B;;ACvpGI;;;;;EqBXE,+BvBhDwB;AC0tG9B;;AC/pGI;;;;;EqBXE,+BvBhDwB;ACkuG9B;;ACvqGI;;;;;EqBXE,+BvBhDwB;AC0uG9B;;AC/qGI;;;;;EqBXE,+BvBhDwB;ACkvG9B;;AuBpvGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsvGb;;AuBrvGE;EACE,gBAAgB;AvBwvGpB;;AuBpvGI;EACE,mBxBFyB;ACyvG/B;;AuBxvGK;EAMG,mDxBPuB;AC6vG/B;;AuB5vGI;EACE,qBxBfuB;AC8wG7B;;AuBhwGK;EAMG,gDxBpBqB;ACkxG7B;;AuBpwGI;EACE,wBxBJwB;AC2wG9B;;AuBxwGK;EAMG,mDxBTsB;AC+wG9B;;AuB5wGI;EACE,qBxBXwB;AC0xG9B;;AuBhxGK;EAMG,gDxBhBsB;AC8xG9B;;AuBpxGI;EACE,qBxBG4B;ACoxGlC;;AuBxxGK;EAMG,iDxBF0B;ACwxGlC;;AuB5xGI;EACE,qBxBK4B;AC0xGlC;;AuBhyGK;EAMG,iDxBA0B;AC8xGlC;;AuBpyGI;EACE,qBxBI4B;ACmyGlC;;AuBxyGK;EAMG,kDxBD0B;ACuyGlC;;AuB5yGI;EACE,qBxBE4B;AC6yGlC;;AuBhzGK;EAMG,kDxBH0B;ACizGlC;;AuBpzGI;EACE,qBxBC4B;ACszGlC;;AuBxzGK;EAMG,mDxBJ0B;AC0zGlC;;AuB5zGI;EACE,qBxBO2B;ACwzGjC;;AuBh0GK;EAMG,kDxBEyB;AC4zGjC;;AuB5zGE;EzBmBA,kBCyBgB;EDxBhB,kBCNc;ACmzGhB;;AuB/zGE;EzBoBA,kBCVc;ACyzGhB;;AuBj0GE;EzBoBA,iBCba;AC8zGf;;AuBl0GE;EACE,cAAc;EACd,WAAW;AvBq0Gf;;AuBp0GE;EACE,eAAe;EACf,WAAW;AvBu0Gf;;AuBr0GA;EAGI,qBxB8BmB;EwB7BnB,gDAA4D;EAC5D,iDAA6D;AvBs0GjE;;AuB30GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw0GpB;;AuBt0GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw0GlB;;AuB90GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo4GzB;;AuBn1GA;EAWI,eAAe;AvB40GnB;;AuBv1GA;EAcI,YAAY;AvB60GhB;;AwB94GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi5GpB;;AwBh5GE;EACE,eAAe;AxBm5GnB;;AwBl5GE;EACE,czBF0B;ACu5G9B;;AwBp5GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy5GvB;;AwBp5GA;EvBwII,mBuBrIqC;AxBq5GzC;;AyBx6GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB26GrB;;AyB/6GA;EAMI,a3BDkB;AE86GtB;;AyBn7GA;EAUM,qB1BU4B;EE4I9B,awBrJ+B;EAC7B,UAAU;AzB66GhB;;AyBz7GA;EAeM,qB1BsDiB;EEmFnB,kBwBxIsC;AzB86G1C;;AyB97GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+6GjB;;AyBt8GA;EAyBM,aAAa;AzBi7GnB;;AyB18GA;;EA4BM,wB1BjBwB;ACo8G9B;;AyB/8GA;ExBwJI,mBwB1HwC;AzBq7G5C;;AyBn9GA;EAgCM,YAAY;EACZ,UAAU;AzBu7GhB;;AyBx9GA;EAmCQ,kBAAkB;AzBy7G1B;;AyB59GA;EAuCM,qB1BnCwB;AC49G9B;;AyBh+GA;EA6CQ,mB1BhCuB;ACu9G/B;;AyBp+GA;EA+CQ,mB1BlCuB;AC29G/B;;AyBx+GA;EAkDU,qBfyDuB;AVi4GjC;;AyB5+GA;EAuDU,mD1B1CqB;ACm+G/B;;AyBh/GA;EA6CQ,qB1B7CqB;ACo/G7B;;AyBp/GA;EA+CQ,qB1B/CqB;ACw/G7B;;AyBx/GA;EAkDU,mBfyDuB;AVi5GjC;;AyB5/GA;EAuDU,gD1BvDmB;ACggH7B;;AyBhgHA;EA6CQ,wB1BlCsB;ACy/G9B;;AyBpgHA;EA+CQ,wB1BpCsB;AC6/G9B;;AyBxgHA;EAkDU,qBfyDuB;AVi6GjC;;AyB5gHA;EAuDU,mD1B5CoB;ACqgH9B;;AyBhhHA;EA6CQ,qB1BzCsB;ACghH9B;;AyBphHA;EA+CQ,qB1B3CsB;ACohH9B;;AyBxhHA;EAkDU,qBfyDuB;AVi7GjC;;AyB5hHA;EAuDU,gD1BnDoB;AC4hH9B;;AyBhiHA;EA6CQ,qB1B3B0B;ACkhHlC;;AyBpiHA;EA+CQ,qB1B7B0B;ACshHlC;;AyBxiHA;EAkDU,qBfyDuB;AVi8GjC;;AyB5iHA;EAuDU,iD1BrCwB;AC8hHlC;;AyBhjHA;EA6CQ,qB1BzB0B;ACgiHlC;;AyBpjHA;EA+CQ,qB1B3B0B;ACoiHlC;;AyBxjHA;EAkDU,qBfyDuB;AVi9GjC;;AyB5jHA;EAuDU,iD1BnCwB;AC4iHlC;;AyBhkHA;EA6CQ,qB1B1B0B;ACijHlC;;AyBpkHA;EA+CQ,qB1B5B0B;ACqjHlC;;AyBxkHA;EAkDU,qBfyDuB;AVi+GjC;;AyB5kHA;EAuDU,kD1BpCwB;AC6jHlC;;AyBhlHA;EA6CQ,qB1B5B0B;ACmkHlC;;AyBplHA;EA+CQ,qB1B9B0B;ACukHlC;;AyBxlHA;EAkDU,qBfyDuB;AVi/GjC;;AyB5lHA;EAuDU,kD1BtCwB;AC+kHlC;;AyBhmHA;EA6CQ,qB1B7B0B;AColHlC;;AyBpmHA;EA+CQ,qB1B/B0B;ACwlHlC;;AyBxmHA;EAkDU,qBfyDuB;AVigHjC;;AyB5mHA;EAuDU,mD1BvCwB;ACgmHlC;;AyBhnHA;EA6CQ,qB1BvByB;AC8lHjC;;AyBpnHA;EA+CQ,qB1BzByB;ACkmHjC;;AyBxnHA;EAkDU,qBfyDuB;AVihHjC;;AyB5nHA;EAuDU,kD1BjCuB;AC0mHjC;;AyBhoHA;E3ByCE,kBCyBgB;EDxBhB,kBCNc;ACimHhB;;AyBroHA;E3B4CE,kBCVc;ACumHhB;;AyBzoHA;E3B8CE,iBCba;AC4mHf;;AyB7oHA;EAkEM,qB1B5DwB;AC2oH9B;;AyBjpHA;EAoEI,WAAW;AzBilHf;;AyBrpHA;EAsEM,WAAW;AzBmlHjB;;AyBzpHA;EA0EM,aAAa;EACb,kBAAkB;ExBqFpB,awBpF+B;EAC7B,YAAY;EACZ,eAAe;AzBmlHrB;;AyBjqHA;EAgFM,kB1B5CU;ACioHhB;;AyBrqHA;EAkFM,kB1BhDU;ACuoHhB;;AyBzqHA;EAoFM,iB1BnDS;AC4oHf;;A0BhqHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BkqHpB;;A0BvqHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC0rH7B;;A0B7qHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,c3BjCmB;ACgsH7B;;A0BnrHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACssH7B;;A0BzrHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,c3B7CmB;AC4sH7B;;A0B/rHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACqsH/B;;A0BrsHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,Y3BpBqB;AC2sH/B;;A0B3sHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACitH/B;;A0BjtHA;EA8BU,uBhBgEuB;EgB/DvB,yBAAyB;EACzB,Y3BhCqB;ACutH/B;;A0BvtHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV4pHrB;;A0B7tHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkqHrB;;A0BnuHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVwqHrB;;A0BzuHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8qHrB;;A0B/uHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVkrHhB;;A0BrvHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwrHhB;;A0B3vHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV8rHhB;;A0BjwHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVosHhB;;A0BvwHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV0sHhB;;A0B7wHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgtHhB;;A0BnxHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVstHhB;;A0BzxHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4tHhB;;A0B/xHA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVkuHhB;;A0BryHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwuHhB;;A0B3yHA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV8uHhB;;A0BjzHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVovHhB;;A0BvzHA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV0vHhB;;A0B7zHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgwHhB;;A0Bn0HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVswHhB;;A0Bz0HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4wHhB;;A0B/0HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVkxHhB;;A0Br1HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwxHhB;;A0B31HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV8xHhB;;A0Bj2HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVoyHhB;;A0Bv2HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV4yHrB;;A0B72HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkzHrB;;A0Bn3HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVwzHrB;;A0Bz3HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8zHrB;;A0B/3HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVk0HhB;;A0Br4HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVw0HhB;;A0B34HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV80HhB;;A0Bj5HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVo1HhB;;A0Bv5HA;EAmCI,kB3BZY;ACo4HhB;;A0B35HA;EAqCI,e3BfS;ACy4Hb;;A0B/5HA;EAuCI,kB3BlBY;AC84HhB;;A0Bn6HA;EA0CQ,eAAe;A1B63HvB;;A0Bv6HA;EA4CI,iB3BxBW;ACu5Hf;;A0B36HA;EA+CQ,eAAe;A1Bg4HvB;;A0B/6HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bg4HhC;;A0Bp7HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bk4H/B;;A0Bz7HA;EA0DQ,kB3BJI;ACu4HZ;;A0B77HA;EA4DQ,aAAa;A1Bq4HrB;;A0Bj8HA;EA+DM,sBAAsB;A1Bs4H5B;;A0Br8HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1Bw4HtB;;A0B38HA;EAqEM,uBAAuB;A1B04H7B;;A0B/8HA;EAuEM,aAAa;EACb,YAAY;A1B44HlB;;A0Bp9HA;EA0EQ,eAAe;A1B84HvB;;A0Bx9HA;EA6EQ,eAAe;A1B+4HvB;;A0B59HA;EAgFQ,eAAe;A1Bg5HvB;;A0Bh+HA;EAmFQ,eAAe;A1Bi5HvB;;A0Bp+HA;EAsFQ,0BAA4C;A1Bk5HpD;;A0Bx+HA;EAwFQ,0B3BlCI;E2BmCJ,uBAAuB;A1Bo5H/B;;A0B7+HA;EA2FI,uBAAuB;A1Bs5H3B;;A0Bj/HA;EA8FM,WAAW;A1Bu5HjB;;A0Br/HA;EAgGM,YAAY;EACZ,eAAe;A1By5HrB;;A0B1/HA;EAmGI,yBAAyB;A1B25H7B;;A0B9/HA;EAqGM,0BAA4C;A1B65HlD;;A0BlgIA;EAuGM,0B3BjDM;E2BkDN,2BAA2B;EAC3B,SAAS;A1B+5Hf;;A0B75HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bg6HpB;;A0Bt6HA;EASM,yBhBtB2B;EgBuB3B,c3B9HwB;AC+hI9B;;A0B36HA;EAYM,qBhBzB2B;AV47HjC;;A0B/6HA;EAeM,yBhB5B2B;EgB6B3B,c3BpIwB;ACwiI9B;;A0Bp7HA;EAkBM,qBhB/B2B;AVq8HjC;;A0Bp6HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bu6Hb;;A0Br6HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BtFU;E2BuFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bu6HrB;;A0Br6HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACokI9B;;A0Bt6HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1By6HzB;;A0Bv6HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBzBrB,kByB0BmC;EACrC,UAAU;A1B06HZ;;A0Bh7HA;EAQI,eAAe;A1B46HnB;;A2B5lIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC8jIjB;;A2BnmIA;EAMI,oBAAoB;A3BimIxB;;A2BvmIA;EASI,kB5BsBY;AC4kIhB;;A2B3mIA;EAWI,kB5BkBY;ACklIhB;;A2B/mIA;EAaI,iB5BeW;ACulIf;;A2BpmIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BumIrB;;A2B1mIA;EAOM,Y5BdyB;ACqnI/B;;A2B9mIA;EAOM,c5B3BuB;ACsoI7B;;A2BlnIA;EAOM,iB5BhBwB;AC+nI9B;;A2BtnIA;EAOM,c5BvBwB;AC0oI9B;;A2B1nIA;EAOM,c5BT4B;ACgoIlC;;A2B9nIA;EAOM,c5BP4B;ACkoIlC;;A2BloIA;EAOM,c5BR4B;ACuoIlC;;A2BtoIA;EAOM,c5BV4B;AC6oIlC;;A2B1oIA;EAOM,c5BX4B;ACkpIlC;;A2B9oIA;EAOM,c5BL2B;ACgpIjC;;A2BvoIA;EAEI,sBAAsB;A3ByoI1B;;A2B3oIA;EAKI,aAAa;EACb,2BAA2B;A3B0oI/B;;A2BhpIA;E1ByHI,iB0BhHwC;A3B2oI5C;;A2BppIA;;;EAcU,gBAAgB;A3B4oI1B;;A2B1pIA;;;EAuBY,4BAA4B;EAC5B,yBAAyB;A3ByoIrC;;A2BjqIA;;;EAiCY,6BAA6B;EAC7B,0BAA0B;A3BsoItC;;A2BxqIA;;;;;EAyCY,UAAU;A3BuoItB;;A2BhrIA;;;;;;;;;EA8CY,UAAU;A3B8oItB;;A2B5rIA;;;;;;;;;EAgDc,UAAU;A3BwpIxB;;A2BxsIA;EAkDQ,YAAY;EACZ,cAAc;A3B0pItB;;A2B7sIA;EAqDM,uBAAuB;A3B4pI7B;;A2BjtIA;EAuDM,yBAAyB;A3B8pI/B;;A2BrtIA;EA0DQ,YAAY;EACZ,cAAc;A3B+pItB;;A2B1tIA;EA6DI,aAAa;EACb,2BAA2B;A3BiqI/B;;A2B/tIA;EAgEM,cAAc;A3BmqIpB;;A2BnuIA;EAkEQ,gBAAgB;E1BuDpB,oB0BtD2C;A3BqqI/C;;A2BxuIA;EAqEQ,YAAY;EACZ,cAAc;A3BuqItB;;A2B7uIA;EAwEM,uBAAuB;A3ByqI7B;;A2BjvIA;EA0EM,yBAAyB;A3B2qI/B;;A2BrvIA;EA4EM,eAAe;A3B6qIrB;;A2BzvIA;EAgFU,sBAAsB;A3B6qIhC;;A2B7vIA;EAkFQ,uBAAuB;A3B+qI/B;;A2BjwIA;EAoFQ,gBAAgB;A3BirIxB;;ACrsIE;E0BhEF;IAuFM,aAAa;E3BmrIjB;AACF;;A2BlrIA;EAEI,kBAAkB;A3BorItB;;ACntIE;E0B6BF;IAII,qBAAqB;E3BurIvB;AACF;;ACrtIE;E0ByBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BwBd,mB0BvBsC;IACtC,iBAAiB;E3B2rInB;E2BrsIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B4rIxB;E2BzsIF;IAeM,oBAAoB;E3B6rIxB;E2B5sIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B8rIxB;E2BhtIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3B+rIxB;AACF;;A2B9rIA;EAEI,gBAAgB;A3BgsIpB;;AClvIE;E0BgDF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BmsIhB;E2B1sIF;IASM,gBAAgB;E3BosIpB;E2B7sIF;IAWM,cAAc;E3BqsIlB;E2BhtIF;IAaQ,YAAY;E3BssIlB;E2BntIF;I1BSI,oB0BM2C;E3BusI7C;AACF;;A2BtsIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3BysIrB;;A2B9sIA;;;EAaU,c5BxKoB;AC+2I9B;;A2BptIA;;;EAeQ,kB5B3IQ;ACs1IhB;;A2B1tIA;;;EAiBQ,kB5B/IQ;AC81IhB;;A2BhuIA;;;EAmBQ,iB5BlJO;ACq2If;;A2BtuIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BqtIhB;;A2BhvIA;;EA+BM,mB7B1LgB;AEg5ItB;;A2BrvIA;EAiCM,OAAO;A3BwtIb;;A2BzvIA;;EAqCM,oB7BhMgB;AEy5ItB;;A2B9vIA;EAuCM,QAAQ;A3B2tId;;A2BlwIA;EA2CM,6BAA6B;E1B3C/B,a0B4C+B;EAC7B,YAAY;EACZ,UAAU;A3B2tIhB;;A2BzwIA;EAgDM,kB5B5KU;ACy4IhB;;A2B7wIA;EAkDM,kB5BhLU;AC+4IhB;;A2BjxIA;EAoDM,iB5BnLS;ACo5If;;A4Bv7IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B86IrB;;A6Bl7IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B87I3C;;A6B17IA;EAYM,c9BjBwB;ACm8I9B;;A6B97IA;EAcI,mBAAmB;EACnB,aAAa;A7Bo7IjB;;A6Bn8IA;E5B+II,gB4B9HoC;A7Bs7IxC;;A6Bv8IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bu7I5B;;A6B78IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7By7IvB;;A6Bl9IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B27I/B;;A6B19IA;E5B+II,kB4B7GuC;A7B47I3C;;A6B99IA;E5B+II,mB4B3GuC;A7B87I3C;;A6Bl+IA;;EAyCM,uBAAuB;A7B87I7B;;A6Bv+IA;;EA6CM,yBAAyB;A7B+7I/B;;A6B5+IA;EAgDI,kB9BrBY;ACq9IhB;;A6Bh/IA;EAkDI,kB9BzBY;AC29IhB;;A6Bp/IA;EAoDI,iB9B5BW;ACg+If;;A6Bx/IA;EAwDM,iBAAiB;A7Bo8IvB;;A6B5/IA;EA2DM,iBAAiB;A7Bq8IvB;;A6BhgJA;EA8DM,iBAAiB;A7Bs8IvB;;A6BpgJA;EAiEM,iBAAiB;A7Bu8IvB;;A8B7/IA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,eAAe;EACf,kBAAkB;A9BggJpB;;A8B7/IE;EACE,+BA3BiB;EA4BjB,gCA5BiB;A9B4hJrB;;A8B//IE;EACE,kCA9BiB;EA+BjB,mCA/BiB;A9BiiJrB;;A8BhgJA;EAEE,6BAjCwC;EAkCxC,oBAAoB;EACpB,kD/BxC2B;E+ByC3B,aAAa;A9BkgJf;;A8BhgJA;EACE,mBAAmB;EACnB,c/BzC4B;E+B0C5B,aAAa;EACb,YAAY;EACZ,gB/BNe;E+BOf,qBA1CgC;A9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B;;AiCp0JA;EAgBQ,kBAlBsB;AjC00J9B;;AiCx0JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCq1JpB;;AiC90JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjCy1J5B;;AiCxzJA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC2zJhB;;AiCzzJA;EhC8GI,iBgCtJgB;AjCq2JpB;;AiC1zJA;EhC2GI,kBgCtJgB;AjCy2JpB;;AiC3zJA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC8zJrB;;ACvxJE;EgC3CF;IAQI,gBAAgB;EjC+zJlB;AACF;;AkCt2JA;EACE,enCgBW;ACy1Jb;;AkC12JA;EAII,kBnCcY;AC41JhB;;AkC92JA;EAMI,kBnCUY;ACk2JhB;;AkCl3JA;EAQI,iBnCOW;ACu2Jf;;AkC52JA;EACE,iBArB0B;AlCo4J5B;;AkCh3JA;EAGI,kBnCmCc;EmClCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC04JrC;;AkCv3JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACo5J9B;;AkC53JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV60JhB;;AkCj4JA;EjC4HI,+BFhJ0B;EmCqCxB,cAnC0B;EjC8I5B,qBiC7IkC;AlCw5JtC;;AkCn3JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCs3J3B;;AkC13JA;EAMI,eAtCoB;AlC85JxB;;AkC93JA;EAQI,kBAxCoB;AlCk6JxB;;AmC75JA;EAEE,4BpCZ4B;EoCa5B,kBpC2CU;EoC1CV,epCUW;ACq5Jb;;AmCn6JA;EAMI,mBAAmB;AnCi6JvB;;AmCv6JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCm6J9B;;AmC56JA;EAYI,kBpCGY;ACi6JhB;;AmCh7JA;EAcI,kBpCDY;ACu6JhB;;AmCp7JA;EAgBI,iBpCJW;AC46Jf;;AmCx7JA;EAsCM,uBAH+C;AnCy5JrD;;AmC57JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACs9J7B;;AmCj8JA;EA2CQ,mBpCnDuB;AC68J/B;;AmCr8JA;EAsCM,yBAH+C;AnCs6JrD;;AmCz8JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACs9J/B;;AmC98JA;EA2CQ,qBpChEqB;ACu+J7B;;AmCl9JA;EAsCM,yBAH+C;AnCm7JrD;;AmCt9JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVk6JrB;;AmC39JA;EA2CQ,wBpCrDsB;ACy+J9B;;AmC/9JA;EAsCM,yBAH+C;AnCg8JrD;;AmCn+JA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV66JhB;;AmCx+JA;EA2CQ,qBpC5DsB;AC6/J9B;;AmC5+JA;EAsCM,yBzB4B0C;AV86JhD;;AmCh/JA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV07JhB;;AmCr/JA;EA2CQ,qBpC9C0B;EoC+C1B,czB+B6D;AV+6JrE;;AmC1/JA;EAsCM,yBzB4B0C;AV47JhD;;AmC9/JA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVw8JhB;;AmCngKA;EA2CQ,qBpC5C0B;EoC6C1B,czB+B6D;AV67JrE;;AmCxgKA;EAsCM,yBzB4B0C;AV08JhD;;AmC5gKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVs9JhB;;AmCjhKA;EA2CQ,qBpC7C0B;EoC8C1B,czB+B6D;AV28JrE;;AmCthKA;EAsCM,yBzB4B0C;AVw9JhD;;AmC1hKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVo+JhB;;AmC/hKA;EA2CQ,qBpC/C0B;EoCgD1B,czB+B6D;AVy9JrE;;AmCpiKA;EAsCM,yBzB4B0C;AVs+JhD;;AmCxiKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVo/JrB;;AmC7iKA;EA2CQ,qBpChD0B;EoCiD1B,czB+B6D;AVu+JrE;;AmCljKA;EAsCM,yBzB4B0C;AVo/JhD;;AmCtjKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AVggKhB;;AmC3jKA;EA2CQ,qBpC1CyB;EoC2CzB,czB+B6D;AVq/JrE;;AmClhKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCqhKpB;;AmC/hKA;EAYI,YAAY;EACZ,cAAc;ElCwEd,oBkCvEsC;AnCuhK1C;;AmCriKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnCyhK9B;;AmCvhKA;EACE,qBpChF4B;EoCiF5B,kBpCtBU;EoCuBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC2mKnC;;AmChiKA;;EASI,uBpCnF2B;AC+mK/B;;AmCriKA;EAWI,6BAlFgD;AnCgnKpD;;AoChmKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC0oKZ;;AoC1mKA;EAWI,aAAa;ApCmmKjB;;AoCjmKA;EAEE,wCrC/C2B;ACkpK7B;;AoCjmKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApComKb;;ACxkKE;EmClCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpC+pKzB;AACF;;AoCtmKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnC8Fb,UmCtJoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCoqK7B;;AoCtmKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApCymKzB;;AoCvmKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC0mKpB;;AoCxmKA;EACE,gCrCjF4B;EqCkF5B,2BrCtBgB;EqCuBhB,4BrCvBgB;ACkoKlB;;AoCzmKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApCyrKhC;;AoC1mKA;EACE,8BrCjCgB;EqCkChB,+BrClCgB;EqCmChB,6BrC/F4B;AC4sK9B;;AoChnKA;EnCoDI,kBmC9CuC;ApC8mK3C;;AoC5mKA;EnChDE,iCAAiC;EmCkDjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCqsK9B;;AqCzqKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCkuKb;;AqChrKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC6uK7B;;AqCrrKA;;EAcU,ctCtEmB;ACkvK7B;;AqC1rKA;;;;EAoBY,yB3B+BqB;E2B9BrB,ctC7EiB;AC0vK7B;;AqClsKA;EAwBY,qBtChFiB;AC8vK7B;;AqCtsKA;EA0BQ,ctClFqB;ACkwK7B;;AC/qKE;EoC3BF;;;;IAgCY,ctCxFiB;EC0wK3B;EqCltKF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,ctC/Fe;ECuxK3B;EqC/tKF;;IA0Cc,qBtClGe;EC2xK3B;EqCnuKF;;;IA8CU,yB3BKuB;I2BJvB,ctCvGmB;ECiyK3B;EqCzuKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECqyK3B;AACF;;AqC9uKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC8xK/B;;AqCnvKA;;EAcU,YtCzDqB;ACmyK/B;;AqCxvKA;;;;EAoBY,uB3B+BqB;E2B9BrB,YtChEmB;AC2yK/B;;AqChwKA;EAwBY,mBtCnEmB;AC+yK/B;;AqCpwKA;EA0BQ,YtCrEuB;ACmzK/B;;AC7uKE;EoC3BF;;;;IAgCY,YtC3EmB;EC2zK7B;EqChxKF;;;;;;;;;;IAsCc,uB3BamB;I2BZnB,YtClFiB;ECw0K7B;EqC7xKF;;IA0Cc,mBtCrFiB;EC40K7B;EqCjyKF;;;IA8CU,uB3BKuB;I2BJvB,YtC1FqB;ECk1K7B;EqCvyKF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECs1K7B;AACF;;AqC5yKA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV2xKrB;;AqCjzKA;;EAcU,yB3BQW;AVgyKrB;;AqCtzKA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AVwyKrB;;AqC9zKA;EAwBY,gC3BFS;AV4yKrB;;AqCl0KA;EA0BQ,yB3BJa;AVgzKrB;;AC3yKE;EoC3BF;;;;IAgCY,yB3BVS;EVwzKnB;EqC90KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVq0KnB;EqC31KF;;IA0Cc,gC3BpBO;EVy0KnB;EqC/1KF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EV+0KnB;EqCr2KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVm1KnB;AACF;;AqC12KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVu1KhB;;AqC/2KA;;EAcU,W3BUM;AV41KhB;;AqCp3KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVo2KhB;;AqC53KA;EAwBY,kB3BAI;AVw2KhB;;AqCh4KA;EA0BQ,W3BFQ;AV42KhB;;ACz2KE;EoC3BF;;;;IAgCY,W3BRI;EVo3Kd;EqC54KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVi4Kd;EqCz5KF;;IA0Cc,kB3BlBE;EVq4Kd;EqC75KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV24Kd;EqCn6KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EV+4Kd;AACF;;AqCx6KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVq5KhB;;AqC76KA;;EAcU,W3BUM;AV05KhB;;AqCl7KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVk6KhB;;AqC17KA;EAwBY,kB3BAI;AVs6KhB;;AqC97KA;EA0BQ,W3BFQ;AV06KhB;;ACv6KE;EoC3BF;;;;IAgCY,W3BRI;EVk7Kd;EqC18KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV+7Kd;EqCv9KF;;IA0Cc,kB3BlBE;EVm8Kd;EqC39KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVy8Kd;EqCj+KF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV68Kd;AACF;;AqCt+KA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVm9KhB;;AqC3+KA;;EAcU,W3BUM;AVw9KhB;;AqCh/KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVg+KhB;;AqCx/KA;EAwBY,kB3BAI;AVo+KhB;;AqC5/KA;EA0BQ,W3BFQ;AVw+KhB;;ACr+KE;EoC3BF;;;;IAgCY,W3BRI;EVg/Kd;EqCxgLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV6/Kd;EqCrhLF;;IA0Cc,kB3BlBE;EVigLd;EqCzhLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVugLd;EqC/hLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV2gLd;AACF;;AqCpiLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVihLhB;;AqCziLA;;EAcU,W3BUM;AVshLhB;;AqC9iLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV8hLhB;;AqCtjLA;EAwBY,kB3BAI;AVkiLhB;;AqC1jLA;EA0BQ,W3BFQ;AVsiLhB;;ACniLE;EoC3BF;;;;IAgCY,W3BRI;EV8iLd;EqCtkLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV2jLd;EqCnlLF;;IA0Cc,kB3BlBE;EV+jLd;EqCvlLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVqkLd;EqC7lLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EVykLd;AACF;;AqClmLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AV+kLhB;;AqCvmLA;;EAcU,W3BUM;AVolLhB;;AqC5mLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV4lLhB;;AqCpnLA;EAwBY,kB3BAI;AVgmLhB;;AqCxnLA;EA0BQ,W3BFQ;AVomLhB;;ACjmLE;EoC3BF;;;;IAgCY,W3BRI;EV4mLd;EqCpoLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVynLd;EqCjpLF;;IA0Cc,kB3BlBE;EV6nLd;EqCrpLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVmoLd;EqC3pLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVuoLd;AACF;;AqChqLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AV+oLrB;;AqCrqLA;;EAcU,yB3BQW;AVopLrB;;AqC1qLA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AV4pLrB;;AqClrLA;EAwBY,gC3BFS;AVgqLrB;;AqCtrLA;EA0BQ,yB3BJa;AVoqLrB;;AC/pLE;EoC3BF;;;;IAgCY,yB3BVS;EV4qLnB;EqClsLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVyrLnB;EqC/sLF;;IA0Cc,gC3BpBO;EV6rLnB;EqCntLF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EVmsLnB;EqCztLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVusLnB;AACF;;AqC9tLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV2sLhB;;AqCnuLA;;EAcU,W3BUM;AVgtLhB;;AqCxuLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVwtLhB;;AqChvLA;EAwBY,kB3BAI;AV4tLhB;;AqCpvLA;EA0BQ,W3BFQ;AVguLhB;;AC7tLE;EoC3BF;;;;IAgCY,W3BRI;EVwuLd;EqChwLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVqvLd;EqC7wLF;;IA0Cc,kB3BlBE;EVyvLd;EqCjxLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV+vLd;EqCvxLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVmwLd;AACF;;AqC5xLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC0uLf;;AqCnyLA;EA2DI,gCtCxG0B;ACo1L9B;;AqCvyLA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArC+1LnB;;AqC9yLA;EAgEI,SAAS;ArCkvLb;;AqClzLA;EAkEM,iCtC/GwB;ACm2L9B;;AqCtzLA;EAoEI,MAAM;ArCsvLV;;AqCpvLA;;EAGI,oBA9HmB;ArCo3LvB;;AqCzvLA;;EAKI,uBAhImB;ArCy3LvB;;AqCvvLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCi4LvB;;AqCxvLA;EAIM,6BAA6B;ArCwvLnC;;AqCtvLA;EpCtFE,iCAAiC;EoCwFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArCyvLpB;;AqCvvLA;EAEE,ctCrJ4B;EEoB5B,eAAe;EACf,cAAc;EACd,eoCxBqB;EpCyBrB,kBAAkB;EAClB,coC1BqB;EpCqJnB,kBoCIkC;ArC6vLtC;;AC33LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBFiCQ;EEhCR,yDAAyD;EACzD,oCF0Ba;EEzBb,WAAW;AD83Lf;;AC73LI;EACE,oBAAoB;ADg4L1B;;AC/3LI;EACE,oBAAoB;ADk4L1B;;ACj4LI;EACE,oBAAoB;ADo4L1B;;ACn4LE;EACE,qCAAiC;ADs4LrC;;ACl4LM;EACE,wCAAwC;ADq4LhD;;ACp4LM;EACE,UAAU;ADu4LlB;;ACt4LM;EACE,0CAA0C;ADy4LlD;;AqCpyLA;EACE,aAAa;ArCuyLf;;AqCryLA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArCwyLpB;;AqC9yLA;;EASM,qBAAqB;EACrB,sBAAsB;ArC0yL5B;;AqCxyLA;;EAEE,eAAe;ArC2yLjB;;AqC7yLA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;AC+8LlC;;AqC5yLA;EACE,YAAY;EACZ,cAAc;ArC+yLhB;;AqCjzLA;EAII,mBA7KgC;ArC89LpC;;AqCrzLA;EAMI,UAAU;ArCmzLd;;AqCzzLA;EAQI,YAAY;EACZ,cAAc;ArCqzLlB;;AqC9zLA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArCuzLtC;;AqCp0LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;AC4+LlC;;AqCz0LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArC0zL9E;;AqCxzLA;EACE,YAAY;EACZ,cAAc;ArC2zLhB;;AqCzzLA;EpC7DI,mBoC8DoC;ArC4zLxC;;AqC7zLA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpC1DpB,aoC2D6B;ArC6zLjC;;AqC3zLA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArC8zLrB;;AqCj0LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCg0LzB;;AqC9zLA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCi0LlB;;ACp9LE;EoC/BF;IAsLI,cAAc;ErCk0LhB;EqCj0LA;;IAGI,mBAAmB;IACnB,aAAa;ErCk0LjB;EqCj0LA;IAEI,aAAa;ErCk0LjB;EqC15LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCm0LnB;EqCt0LA;IAKI,cAAc;ErCo0LlB;EqCl0LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC+jMjB;EqCx0LA;IAKI,SAAS;ErCs0Lb;EqC30LA;IAOM,4CtCrQqB;EC4kM3B;EqC90LA;IASI,MAAM;ErCw0LV;EqCj1LA;IpClMA,iCAAiC;IoCgN3B,iCAA2C;IAC3C,cAAc;ErCu0LpB;EqCt0LA;;IAGI,oBA9QiB;ErCqlMrB;EqC10LA;;IAKI,uBAhRiB;ErCylMrB;AACF;;AC1gME;EoCmMA;;;;IAIE,oBAAoB;IACpB,aAAa;ErC20Lf;EqC9iMF;IAqOI,mBA1RmB;ErCsmMrB;EqC70LA;IAGI,kBA1R0B;ErCumM9B;EqCh1LA;;IAMM,mBAAmB;ErC80LzB;EqCp1LA;;IASM,kBtClOI;ECijMV;EqCx1LA;;;;IAgBQ,wCAAwC;ErC80LhD;EqC91LA;IAuBU,wCAAwC;ErC00LlD;EqCj2LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECioM3B;EqCr2LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECinMhC;EqC7+LF;IAsKI,aAAa;ErC00Lf;EqCv+LF;;IAgKI,mBAAmB;IACnB,aAAa;ErC20Lf;EqCt9LF;IA8IM,oBAAoB;ErC20LxB;EqC70LA;IAKM,oDAAoD;ErC20L1D;EqCh1LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErC40Lf;EqCx1LA;IAkBM,cAAc;ErCy0LpB;EqCx0LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErCy0LhC;EqCrgMF;IA8LI,YAAY;IACZ,cAAc;ErC00LhB;EqCz0LA;IACE,2BAA2B;IpCvM3B,iBoCwMoC;ErC20LtC;EqC10LA;IACE,yBAAyB;IpC1MzB,kBoC2MoC;ErC40LtC;EqCl9LF;IAwII,uBtCxV2B;IsCyV3B,8BtClSc;IsCmSd,+BtCnSc;IsCoSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpC3MnB,QoC4MuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErC8pMpB;EqCh+LF;IAqJM,sBAAsB;IACtB,mBAAmB;ErC80LvB;EqC71LA;IpC5ME,kBoC6NuC;ErC+0LzC;EqCh2LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;ECwsM3B;EqCp2LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;ECwrMhC;EqC/0LE;IAEE,kBtC3TY;IsC4TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtCjUM;IsCkUN,uCAAuC;ErCg1L3C;EqCp3LA;IAsCI,UAAU;IACV,QAAQ;ErCi1LZ;EqCv/LF;IAwKI,cAAc;ErCk1LhB;EqCj1LA;;IpCtPE,sBoCyPyC;ErCk1L3C;EqCr1LA;;IpCtPE,qBoC2PyC;ErCo1L3C;EqCl1LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCsuMjB;EqCx1LA;IAKI,SAAS;ErCs1Lb;EqC31LA;IAOM,4CtC5ZqB;ECmvM3B;EqC91LA;IASI,MAAM;ErCw1LV;EqCv1LA;;IAGI,oBA/ZiB;ErCuvMrB;EqC31LA;;IAKI,uBAjaiB;ErC2vMrB;EqC/1LA;;IAOI,oBAA4D;ErC41LhE;EqCn2LA;;IASI,uBAA+D;ErC81LnE;EqC51LA;;IAGI,ctC7auB;EC0wM3B;EqCh2LA;;IAKI,6BAla2C;ErCiwM/C;EqC91LA;IAKM,yBtCzasB;ECqwM5B;AACF;;AqCz1LA;EAEI,iCAA2C;ArC21L/C;;AsCnvMA;EAEE,evCFW;EuCGX,gBAnC0B;AtCwxM5B;;AsCxvMA;EAMI,kBvCLY;AC2vMhB;;AsC5vMA;EAQI,kBvCTY;ACiwMhB;;AsChwMA;EAUI,iBvCZW;ACswMf;;AsCpwMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCkBiB;ACyuMvB;;AsC3wMA;EAkBM,qBvCgBiB;AC6uMvB;;AsC3vMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtC8vMpB;;AsC5vMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtC6vMpB;;AsC3vMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AEy0MtB;;AsCnwMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACi1M9B;;AsC1wMA;;;EAUI,qBvCjE8B;ACu0MlC;;AsChxMA;;;EAYI,iDvCvFyB;ACi2M7B;;AsCtxMA;;;EAcI,yBvCjF0B;EuCkF1B,qBvClF0B;EuCmF1B,gBAAgB;EAChB,cvCtF0B;EuCuF1B,YAAY;AtC8wMhB;;AsC5wMA;;EAEE,oBAtFkC;EAuFlC,qBAtFmC;EAuFnC,mBAAmB;AtC+wMrB;;AsC7wMA;EAEI,yBvCnF8B;EuCoF9B,qBvCpF8B;EuCqF9B,W5BzBY;AVwyMhB;;AsC7wMA;EACE,cvCrG4B;EuCsG5B,oBAAoB;AtCgxMtB;;AsC9wMA;EACE,eAAe;AtCixMjB;;AsClxMA;EAGI,gBAAgB;AtCmxMpB;;AC1yME;EqCxDF;IAmFI,eAAe;EtCoxMjB;EsC3yMF;;IA0BI,YAAY;IACZ,cAAc;EtCqxMhB;EsChyMF;IAcM,YAAY;IACZ,cAAc;EtCqxMlB;AACF;;ACrzME;EqCgBF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtCuxMV;EsC91MF;;;;IA4EI,gBAAgB;IAChB,aAAa;EtCwxMf;EsCvxMA;IACE,QAAQ;EtCyxMV;EsCxxMA;IACE,QAAQ;EtC0xMV;EsCt4MF;IA8GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtC2xMf;EsC9xMA;IAMM,QAAQ;EtC2xMd;EsCjyMA;IAQM,uBAAuB;IACvB,QAAQ;EtC4xMd;EsCryMA;IAWM,QAAQ;EtC6xMd;EsCxyMA;IAcM,QAAQ;EtC6xMd;EsC3yMA;IAgBM,QAAQ;EtC8xMd;EsC9yMA;IAkBM,yBAAyB;IACzB,QAAQ;EtC+xMd;AACF;;AuCr6MA;EACE,kBxCqCgB;EwCpChB,0FxChC2B;EwCiC3B,exCEW;ACs6Mb;;AuC36MA;EAKI,qBxCWkB;AC+5MtB;;AuC/6MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;ACk9M7B;;AuCp7MA;EAeQ,0BxChCuB;ACy8M/B;;AuCx7MA;EAiBQ,YxClCuB;AC68M/B;;AuC57MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;ACk9M/B;;AuCj8MA;EAeQ,4BxC7CqB;ACm+M7B;;AuCr8MA;EAiBQ,cxC/CqB;ACu+M7B;;AuCz8MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AV85MrB;;AuC98MA;EAeQ,+BxClCsB;ACq+M9B;;AuCl9MA;EAiBQ,iBxCpCsB;ACy+M9B;;AuCt9MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVy6MhB;;AuC39MA;EAeQ,4BxCzCsB;ACy/M9B;;AuC/9MA;EAiBQ,cxC3CsB;AC6/M9B;;AuCn+MA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AVs7MhB;;AuCx+MA;EAeQ,4BxC3B0B;ACw/MlC;;AuC5+MA;EAiBQ,cxC7B0B;AC4/MlC;;AuCh/MA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AVm8MhB;;AuCr/MA;EAeQ,4BxCzB0B;ACmgNlC;;AuCz/MA;EAiBQ,cxC3B0B;ACugNlC;;AuC7/MA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVg9MhB;;AuClgNA;EAeQ,4BxC1B0B;ACihNlC;;AuCtgNA;EAiBQ,cxC5B0B;ACqhNlC;;AuC1gNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AV69MhB;;AuC/gNA;EAeQ,4BxC5B0B;ACgiNlC;;AuCnhNA;EAiBQ,cxC9B0B;ACoiNlC;;AuCvhNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AV4+MrB;;AuC5hNA;EAeQ,4BxC7B0B;AC8iNlC;;AuChiNA;EAiBQ,cxC/B0B;ACkjNlC;;AuCpiNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AVu/MhB;;AuCziNA;EAeQ,4BxCvByB;ACqjNjC;;AuC7iNA;EAiBQ,cxCzByB;ACyjNjC;;AuC9hNA;;EAGI,gCxC3C2B;AC2kN/B;;AuC9hNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvCslNlC;;AuC/hNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvCkiNzB;;AuCtiNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvCoiNlB;;AuC5iNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;AC4mN9B;;AuCniNA;EAEI,cxC1E0B;AC+mN9B;;AuCviNA;EAIM,cxC7D4B;AComNlC;;AuCriNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCwiNvB;;AuC7iNA;EtCqEI,mBsC9DsC;AvC0iN1C;;AuCjjNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvC4iNf;;AuCvjNA;EAaI,eAAe;AvC8iNnB;;AuC3jNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;AC+oN9B;;AuChkNA;EAkBM,cxCjF4B;ACmoNlC;;AuCpkNA;EAoBI,8BxCnCc;EwCoCd,+BxCpCc;ACwlNlB;;AuCljNA;;EAEE,eAAe;AvCqjNjB;;AuCvjNA;;EAII,4BxCnG0B;AC2pN9B;;AuCtjNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EEkJ1B,mBsCrCoC;AvC+jNxC;;AuClkNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCikNxB;;AwC3pNA;EvCgCE,iCAAiC;EuC5BjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxC4pNrB;;AwCtqNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxC8pNvB;;AwCnrNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACgtN9B;;AwCxrNA;EA0BI,cAAc;AxCkqNlB;;AwC5rNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACysNlC;;AwCjsNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxCqqN/B;;AwC5sNA;EAyCM,qBAAqB;AxCuqN3B;;AwChtNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCyqN3B;;AwCvtNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxC2qN1B;;AwC5tNA;EvC4HI,kBuCxEuC;AxC4qN3C;;AwChuNA;EvC4HI,mBuCtEuC;AxC8qN3C;;AwCpuNA;EA0DM,uBAAuB;AxC8qN7B;;AwCxuNA;EA6DM,yBAAyB;AxC+qN/B;;AwC5uNA;EAiEM,6BAA6B;EAI3B,0BzC9BI;AC0sNZ;;AwCjvNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;AC0wN9B;;AwCtvNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxC8qNrF;;AwC5vNA;EAiFM,YAAY;EACZ,cAAc;AxC+qNpB;;AwCjwNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCgrNxB;;AwCzwNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxCkrNlB;;AwC/wNA;EvC4HI,kBuC5BuE;AxCmrN3E;;AwCnxNA;EAsGU,4BzC/DE;EyCgEF,+BzChEE;ACivNZ;;AwCxxNA;EA6GU,2BzCtEE;EyCuEF,8BzCvEE;ACsvNZ;;AwC7xNA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCgrNpB;;AwCpyNA;EAsHM,mBAAmB;AxCkrNzB;;AwCxyNA;EA+HY,kCzCtFW;EyCuFX,+BzCvFW;EyCwFX,qBAAqB;AxC6qNjC;;AwC9yNA;EAwIY,iCzC/FW;EyCgGX,8BzChGW;EyCiGX,oBAAoB;AxC0qNhC;;AwCpzNA;EA6II,kBzCrIY;ACgzNhB;;AwCxzNA;EA+II,kBzCzIY;ACszNhB;;AwC5zNA;EAiJI,iBzC5IW;AC2zNf;;AyC91NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1Cq2NpB;;A0C71NE;EACE,UAAU;EACV,YAAY;A1Cg2NhB;;A0C/1NE;EACE,UAAU;EACV,WAAW;A1Ck2Nf;;A0Cj2NE;EACE,UAAU;EACV,UAAU;A1Co2Nd;;A0Cn2NE;EACE,UAAU;EACV,eAAe;A1Cs2NnB;;A0Cr2NE;EACE,UAAU;EACV,UAAU;A1Cw2Nd;;A0Cv2NE;EACE,UAAU;EACV,eAAe;A1C02NnB;;A0Cz2NE;EACE,UAAU;EACV,UAAU;A1C42Nd;;A0C32NE;EACE,UAAU;EACV,UAAU;A1C82Nd;;A0C72NE;EACE,UAAU;EACV,UAAU;A1Cg3Nd;;A0C/2NE;EACE,UAAU;EACV,UAAU;A1Ck3Nd;;A0Cj3NE;EACE,UAAU;EACV,UAAU;A1Co3Nd;;A0Cn3NE;EzC+GE,iByC9GmC;A1Cs3NvC;;A0Cr3NE;EzC6GE,sByC5GwC;A1Cw3N5C;;A0Cv3NE;EzC2GE,iByC1GmC;A1C03NvC;;A0Cz3NE;EzCyGE,sByCxGwC;A1C43N5C;;A0C33NE;EzCuGE,iByCtGmC;A1C83NvC;;A0C73NE;EzCqGE,iByCpGmC;A1Cg4NvC;;A0C/3NE;EzCmGE,iByClGmC;A1Ck4NvC;;A0Cj4NE;EzCiGE,iByChGmC;A1Co4NvC;;A0Cn4NE;EzC+FE,iByC9FmC;A1Cs4NvC;;A0Cp4NI;EACE,UAAU;EACV,SAAiC;A1Cu4NvC;;A0Ct4NI;EzCyFA,gByCxF4D;A1Cy4NhE;;A0C74NI;EACE,UAAU;EACV,eAAiC;A1Cg5NvC;;A0C/4NI;EzCyFA,sByCxF4D;A1Ck5NhE;;A0Ct5NI;EACE,UAAU;EACV,gBAAiC;A1Cy5NvC;;A0Cx5NI;EzCyFA,uByCxF4D;A1C25NhE;;A0C/5NI;EACE,UAAU;EACV,UAAiC;A1Ck6NvC;;A0Cj6NI;EzCyFA,iByCxF4D;A1Co6NhE;;A0Cx6NI;EACE,UAAU;EACV,gBAAiC;A1C26NvC;;A0C16NI;EzCyFA,uByCxF4D;A1C66NhE;;A0Cj7NI;EACE,UAAU;EACV,gBAAiC;A1Co7NvC;;A0Cn7NI;EzCyFA,uByCxF4D;A1Cs7NhE;;A0C17NI;EACE,UAAU;EACV,UAAiC;A1C67NvC;;A0C57NI;EzCyFA,iByCxF4D;A1C+7NhE;;A0Cn8NI;EACE,UAAU;EACV,gBAAiC;A1Cs8NvC;;A0Cr8NI;EzCyFA,uByCxF4D;A1Cw8NhE;;A0C58NI;EACE,UAAU;EACV,gBAAiC;A1C+8NvC;;A0C98NI;EzCyFA,uByCxF4D;A1Ci9NhE;;A0Cr9NI;EACE,UAAU;EACV,UAAiC;A1Cw9NvC;;A0Cv9NI;EzCyFA,iByCxF4D;A1C09NhE;;A0C99NI;EACE,UAAU;EACV,gBAAiC;A1Ci+NvC;;A0Ch+NI;EzCyFA,uByCxF4D;A1Cm+NhE;;A0Cv+NI;EACE,UAAU;EACV,gBAAiC;A1C0+NvC;;A0Cz+NI;EzCyFA,uByCxF4D;A1C4+NhE;;A0Ch/NI;EACE,UAAU;EACV,WAAiC;A1Cm/NvC;;A0Cl/NI;EzCyFA,kByCxF4D;A1Cq/NhE;;AC19NE;EyCzFF;IAiEM,UAAU;IACV,YAAY;E1Cu/NhB;E0CzjOF;IAoEM,UAAU;IACV,WAAW;E1Cw/Nf;E0C7jOF;IAuEM,UAAU;IACV,UAAU;E1Cy/Nd;E0CjkOF;IA0EM,UAAU;IACV,eAAe;E1C0/NnB;E0CrkOF;IA6EM,UAAU;IACV,UAAU;E1C2/Nd;E0CzkOF;IAgFM,UAAU;IACV,eAAe;E1C4/NnB;E0C7kOF;IAmFM,UAAU;IACV,UAAU;E1C6/Nd;E0CjlOF;IAsFM,UAAU;IACV,UAAU;E1C8/Nd;E0CrlOF;IAyFM,UAAU;IACV,UAAU;E1C+/Nd;E0CzlOF;IA4FM,UAAU;IACV,UAAU;E1CggOd;E0C7lOF;IA+FM,UAAU;IACV,UAAU;E1CigOd;E0CjmOF;IzCsJI,iByCpDqC;E1CkgOvC;E0CpmOF;IzCsJI,sByClD0C;E1CmgO5C;E0CvmOF;IzCsJI,iByChDqC;E1CogOvC;E0C1mOF;IzCsJI,sByC9C0C;E1CqgO5C;E0C7mOF;IzCsJI,iByC5CqC;E1CsgOvC;E0ChnOF;IzCsJI,iByC1CqC;E1CugOvC;E0CnnOF;IzCsJI,iByCxCqC;E1CwgOvC;E0CtnOF;IzCsJI,iByCtCqC;E1CygOvC;E0CznOF;IzCsJI,iByCpCqC;E1C0gOvC;E0C5nOF;IAqHQ,UAAU;IACV,SAAiC;E1C0gOvC;E0ChoOF;IzCsJI,gByC9B8D;E1C2gOhE;E0CnoOF;IAqHQ,UAAU;IACV,eAAiC;E1CihOvC;E0CvoOF;IzCsJI,sByC9B8D;E1CkhOhE;E0C1oOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwhOvC;E0C9oOF;IzCsJI,uByC9B8D;E1CyhOhE;E0CjpOF;IAqHQ,UAAU;IACV,UAAiC;E1C+hOvC;E0CrpOF;IzCsJI,iByC9B8D;E1CgiOhE;E0CxpOF;IAqHQ,UAAU;IACV,gBAAiC;E1CsiOvC;E0C5pOF;IzCsJI,uByC9B8D;E1CuiOhE;E0C/pOF;IAqHQ,UAAU;IACV,gBAAiC;E1C6iOvC;E0CnqOF;IzCsJI,uByC9B8D;E1C8iOhE;E0CtqOF;IAqHQ,UAAU;IACV,UAAiC;E1CojOvC;E0C1qOF;IzCsJI,iByC9B8D;E1CqjOhE;E0C7qOF;IAqHQ,UAAU;IACV,gBAAiC;E1C2jOvC;E0CjrOF;IzCsJI,uByC9B8D;E1C4jOhE;E0CprOF;IAqHQ,UAAU;IACV,gBAAiC;E1CkkOvC;E0CxrOF;IzCsJI,uByC9B8D;E1CmkOhE;E0C3rOF;IAqHQ,UAAU;IACV,UAAiC;E1CykOvC;E0C/rOF;IzCsJI,iByC9B8D;E1C0kOhE;E0ClsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CglOvC;E0CtsOF;IzCsJI,uByC9B8D;E1CilOhE;E0CzsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CulOvC;E0C7sOF;IzCsJI,uByC9B8D;E1CwlOhE;E0ChtOF;IAqHQ,UAAU;IACV,WAAiC;E1C8lOvC;E0CptOF;IzCsJI,kByC9B8D;E1C+lOhE;AACF;;AC3nOE;EyC7FF;IA4HM,UAAU;IACV,YAAY;E1CimOhB;E0C9tOF;IAgIM,UAAU;IACV,WAAW;E1CimOf;E0CluOF;IAoIM,UAAU;IACV,UAAU;E1CimOd;E0CtuOF;IAwIM,UAAU;IACV,eAAe;E1CimOnB;E0C1uOF;IA4IM,UAAU;IACV,UAAU;E1CimOd;E0C9uOF;IAgJM,UAAU;IACV,eAAe;E1CimOnB;E0ClvOF;IAoJM,UAAU;IACV,UAAU;E1CimOd;E0CtvOF;IAwJM,UAAU;IACV,UAAU;E1CimOd;E0C1vOF;IA4JM,UAAU;IACV,UAAU;E1CimOd;E0C9vOF;IAgKM,UAAU;IACV,UAAU;E1CimOd;E0ClwOF;IAoKM,UAAU;IACV,UAAU;E1CimOd;E0CtwOF;IzCsJI,iByCkBqC;E1CimOvC;E0CzwOF;IzCsJI,sByCqB0C;E1CimO5C;E0C5wOF;IzCsJI,iByCwBqC;E1CimOvC;E0C/wOF;IzCsJI,sByC2B0C;E1CimO5C;E0ClxOF;IzCsJI,iByC8BqC;E1CimOvC;E0CrxOF;IzCsJI,iByCiCqC;E1CimOvC;E0CxxOF;IzCsJI,iByCoCqC;E1CimOvC;E0C3xOF;IzCsJI,iByCuCqC;E1CimOvC;E0C9xOF;IzCsJI,iByC0CqC;E1CimOvC;E0CjyOF;IAoMQ,UAAU;IACV,SAAiC;E1CgmOvC;E0CryOF;IzCsJI,gByCkD8D;E1CgmOhE;E0CxyOF;IAoMQ,UAAU;IACV,eAAiC;E1CumOvC;E0C5yOF;IzCsJI,sByCkD8D;E1CumOhE;E0C/yOF;IAoMQ,UAAU;IACV,gBAAiC;E1C8mOvC;E0CnzOF;IzCsJI,uByCkD8D;E1C8mOhE;E0CtzOF;IAoMQ,UAAU;IACV,UAAiC;E1CqnOvC;E0C1zOF;IzCsJI,iByCkD8D;E1CqnOhE;E0C7zOF;IAoMQ,UAAU;IACV,gBAAiC;E1C4nOvC;E0Cj0OF;IzCsJI,uByCkD8D;E1C4nOhE;E0Cp0OF;IAoMQ,UAAU;IACV,gBAAiC;E1CmoOvC;E0Cx0OF;IzCsJI,uByCkD8D;E1CmoOhE;E0C30OF;IAoMQ,UAAU;IACV,UAAiC;E1C0oOvC;E0C/0OF;IzCsJI,iByCkD8D;E1C0oOhE;E0Cl1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CipOvC;E0Ct1OF;IzCsJI,uByCkD8D;E1CipOhE;E0Cz1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CwpOvC;E0C71OF;IzCsJI,uByCkD8D;E1CwpOhE;E0Ch2OF;IAoMQ,UAAU;IACV,UAAiC;E1C+pOvC;E0Cp2OF;IzCsJI,iByCkD8D;E1C+pOhE;E0Cv2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CsqOvC;E0C32OF;IzCsJI,uByCkD8D;E1CsqOhE;E0C92OF;IAoMQ,UAAU;IACV,gBAAiC;E1C6qOvC;E0Cl3OF;IzCsJI,uByCkD8D;E1C6qOhE;E0Cr3OF;IAoMQ,UAAU;IACV,WAAiC;E1CorOvC;E0Cz3OF;IzCsJI,kByCkD8D;E1CorOhE;AACF;;ACxxOE;EyCrGF;IA2MM,UAAU;IACV,YAAY;E1CurOhB;E0Cn4OF;IA8MM,UAAU;IACV,WAAW;E1CwrOf;E0Cv4OF;IAiNM,UAAU;IACV,UAAU;E1CyrOd;E0C34OF;IAoNM,UAAU;IACV,eAAe;E1C0rOnB;E0C/4OF;IAuNM,UAAU;IACV,UAAU;E1C2rOd;E0Cn5OF;IA0NM,UAAU;IACV,eAAe;E1C4rOnB;E0Cv5OF;IA6NM,UAAU;IACV,UAAU;E1C6rOd;E0C35OF;IAgOM,UAAU;IACV,UAAU;E1C8rOd;E0C/5OF;IAmOM,UAAU;IACV,UAAU;E1C+rOd;E0Cn6OF;IAsOM,UAAU;IACV,UAAU;E1CgsOd;E0Cv6OF;IAyOM,UAAU;IACV,UAAU;E1CisOd;E0C36OF;IzCsJI,iByCsFqC;E1CksOvC;E0C96OF;IzCsJI,sByCwF0C;E1CmsO5C;E0Cj7OF;IzCsJI,iByC0FqC;E1CosOvC;E0Cp7OF;IzCsJI,sByC4F0C;E1CqsO5C;E0Cv7OF;IzCsJI,iByC8FqC;E1CssOvC;E0C17OF;IzCsJI,iByCgGqC;E1CusOvC;E0C77OF;IzCsJI,iByCkGqC;E1CwsOvC;E0Ch8OF;IzCsJI,iByCoGqC;E1CysOvC;E0Cn8OF;IzCsJI,iByCsGqC;E1C0sOvC;E0Ct8OF;IA+PQ,UAAU;IACV,SAAiC;E1C0sOvC;E0C18OF;IzCsJI,gByC4G8D;E1C2sOhE;E0C78OF;IA+PQ,UAAU;IACV,eAAiC;E1CitOvC;E0Cj9OF;IzCsJI,sByC4G8D;E1CktOhE;E0Cp9OF;IA+PQ,UAAU;IACV,gBAAiC;E1CwtOvC;E0Cx9OF;IzCsJI,uByC4G8D;E1CytOhE;E0C39OF;IA+PQ,UAAU;IACV,UAAiC;E1C+tOvC;E0C/9OF;IzCsJI,iByC4G8D;E1CguOhE;E0Cl+OF;IA+PQ,UAAU;IACV,gBAAiC;E1CsuOvC;E0Ct+OF;IzCsJI,uByC4G8D;E1CuuOhE;E0Cz+OF;IA+PQ,UAAU;IACV,gBAAiC;E1C6uOvC;E0C7+OF;IzCsJI,uByC4G8D;E1C8uOhE;E0Ch/OF;IA+PQ,UAAU;IACV,UAAiC;E1CovOvC;E0Cp/OF;IzCsJI,iByC4G8D;E1CqvOhE;E0Cv/OF;IA+PQ,UAAU;IACV,gBAAiC;E1C2vOvC;E0C3/OF;IzCsJI,uByC4G8D;E1C4vOhE;E0C9/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CkwOvC;E0ClgPF;IzCsJI,uByC4G8D;E1CmwOhE;E0CrgPF;IA+PQ,UAAU;IACV,UAAiC;E1CywOvC;E0CzgPF;IzCsJI,iByC4G8D;E1C0wOhE;E0C5gPF;IA+PQ,UAAU;IACV,gBAAiC;E1CgxOvC;E0ChhPF;IzCsJI,uByC4G8D;E1CixOhE;E0CnhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CuxOvC;E0CvhPF;IzCsJI,uByC4G8D;E1CwxOhE;E0C1hPF;IA+PQ,UAAU;IACV,WAAiC;E1C8xOvC;E0C9hPF;IzCsJI,kByC4G8D;E1C+xOhE;AACF;;ACz7OE;EyCzGF;IAqQM,UAAU;IACV,YAAY;E1CkyOhB;E0CxiPF;IAwQM,UAAU;IACV,WAAW;E1CmyOf;E0C5iPF;IA2QM,UAAU;IACV,UAAU;E1CoyOd;E0ChjPF;IA8QM,UAAU;IACV,eAAe;E1CqyOnB;E0CpjPF;IAiRM,UAAU;IACV,UAAU;E1CsyOd;E0CxjPF;IAoRM,UAAU;IACV,eAAe;E1CuyOnB;E0C5jPF;IAuRM,UAAU;IACV,UAAU;E1CwyOd;E0ChkPF;IA0RM,UAAU;IACV,UAAU;E1CyyOd;E0CpkPF;IA6RM,UAAU;IACV,UAAU;E1C0yOd;E0CxkPF;IAgSM,UAAU;IACV,UAAU;E1C2yOd;E0C5kPF;IAmSM,UAAU;IACV,UAAU;E1C4yOd;E0ChlPF;IzCsJI,iByCgJqC;E1C6yOvC;E0CnlPF;IzCsJI,sByCkJ0C;E1C8yO5C;E0CtlPF;IzCsJI,iByCoJqC;E1C+yOvC;E0CzlPF;IzCsJI,sByCsJ0C;E1CgzO5C;E0C5lPF;IzCsJI,iByCwJqC;E1CizOvC;E0C/lPF;IzCsJI,iByC0JqC;E1CkzOvC;E0ClmPF;IzCsJI,iByC4JqC;E1CmzOvC;E0CrmPF;IzCsJI,iByC8JqC;E1CozOvC;E0CxmPF;IzCsJI,iByCgKqC;E1CqzOvC;E0C3mPF;IAyTQ,UAAU;IACV,SAAiC;E1CqzOvC;E0C/mPF;IzCsJI,gByCsK8D;E1CszOhE;E0ClnPF;IAyTQ,UAAU;IACV,eAAiC;E1C4zOvC;E0CtnPF;IzCsJI,sByCsK8D;E1C6zOhE;E0CznPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm0OvC;E0C7nPF;IzCsJI,uByCsK8D;E1Co0OhE;E0ChoPF;IAyTQ,UAAU;IACV,UAAiC;E1C00OvC;E0CpoPF;IzCsJI,iByCsK8D;E1C20OhE;E0CvoPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ci1OvC;E0C3oPF;IzCsJI,uByCsK8D;E1Ck1OhE;E0C9oPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cw1OvC;E0ClpPF;IzCsJI,uByCsK8D;E1Cy1OhE;E0CrpPF;IAyTQ,UAAU;IACV,UAAiC;E1C+1OvC;E0CzpPF;IzCsJI,iByCsK8D;E1Cg2OhE;E0C5pPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cs2OvC;E0ChqPF;IzCsJI,uByCsK8D;E1Cu2OhE;E0CnqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C62OvC;E0CvqPF;IzCsJI,uByCsK8D;E1C82OhE;E0C1qPF;IAyTQ,UAAU;IACV,UAAiC;E1Co3OvC;E0C9qPF;IzCsJI,iByCsK8D;E1Cq3OhE;E0CjrPF;IAyTQ,UAAU;IACV,gBAAiC;E1C23OvC;E0CrrPF;IzCsJI,uByCsK8D;E1C43OhE;E0CxrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ck4OvC;E0C5rPF;IzCsJI,uByCsK8D;E1Cm4OhE;E0C/rPF;IAyTQ,UAAU;IACV,WAAiC;E1Cy4OvC;E0CnsPF;IzCsJI,kByCsK8D;E1C04OhE;AACF;;AC/kPI;EyCxHJ;IA+TM,UAAU;IACV,YAAY;E1C64OhB;E0C7sPF;IAkUM,UAAU;IACV,WAAW;E1C84Of;E0CjtPF;IAqUM,UAAU;IACV,UAAU;E1C+4Od;E0CrtPF;IAwUM,UAAU;IACV,eAAe;E1Cg5OnB;E0CztPF;IA2UM,UAAU;IACV,UAAU;E1Ci5Od;E0C7tPF;IA8UM,UAAU;IACV,eAAe;E1Ck5OnB;E0CjuPF;IAiVM,UAAU;IACV,UAAU;E1Cm5Od;E0CruPF;IAoVM,UAAU;IACV,UAAU;E1Co5Od;E0CzuPF;IAuVM,UAAU;IACV,UAAU;E1Cq5Od;E0C7uPF;IA0VM,UAAU;IACV,UAAU;E1Cs5Od;E0CjvPF;IA6VM,UAAU;IACV,UAAU;E1Cu5Od;E0CrvPF;IzCsJI,iByC0MqC;E1Cw5OvC;E0CxvPF;IzCsJI,sByC4M0C;E1Cy5O5C;E0C3vPF;IzCsJI,iByC8MqC;E1C05OvC;E0C9vPF;IzCsJI,sByCgN0C;E1C25O5C;E0CjwPF;IzCsJI,iByCkNqC;E1C45OvC;E0CpwPF;IzCsJI,iByCoNqC;E1C65OvC;E0CvwPF;IzCsJI,iByCsNqC;E1C85OvC;E0C1wPF;IzCsJI,iByCwNqC;E1C+5OvC;E0C7wPF;IzCsJI,iByC0NqC;E1Cg6OvC;E0ChxPF;IAmXQ,UAAU;IACV,SAAiC;E1Cg6OvC;E0CpxPF;IzCsJI,gByCgO8D;E1Ci6OhE;E0CvxPF;IAmXQ,UAAU;IACV,eAAiC;E1Cu6OvC;E0C3xPF;IzCsJI,sByCgO8D;E1Cw6OhE;E0C9xPF;IAmXQ,UAAU;IACV,gBAAiC;E1C86OvC;E0ClyPF;IzCsJI,uByCgO8D;E1C+6OhE;E0CryPF;IAmXQ,UAAU;IACV,UAAiC;E1Cq7OvC;E0CzyPF;IzCsJI,iByCgO8D;E1Cs7OhE;E0C5yPF;IAmXQ,UAAU;IACV,gBAAiC;E1C47OvC;E0ChzPF;IzCsJI,uByCgO8D;E1C67OhE;E0CnzPF;IAmXQ,UAAU;IACV,gBAAiC;E1Cm8OvC;E0CvzPF;IzCsJI,uByCgO8D;E1Co8OhE;E0C1zPF;IAmXQ,UAAU;IACV,UAAiC;E1C08OvC;E0C9zPF;IzCsJI,iByCgO8D;E1C28OhE;E0Cj0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Ci9OvC;E0Cr0PF;IzCsJI,uByCgO8D;E1Ck9OhE;E0Cx0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cw9OvC;E0C50PF;IzCsJI,uByCgO8D;E1Cy9OhE;E0C/0PF;IAmXQ,UAAU;IACV,UAAiC;E1C+9OvC;E0Cn1PF;IzCsJI,iByCgO8D;E1Cg+OhE;E0Ct1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs+OvC;E0C11PF;IzCsJI,uByCgO8D;E1Cu+OhE;E0C71PF;IAmXQ,UAAU;IACV,gBAAiC;E1C6+OvC;E0Cj2PF;IzCsJI,uByCgO8D;E1C8+OhE;E0Cp2PF;IAmXQ,UAAU;IACV,WAAiC;E1Co/OvC;E0Cx2PF;IzCsJI,kByCgO8D;E1Cq/OhE;AACF;;ACruPI;EyCvIJ;IAyXM,UAAU;IACV,YAAY;E1Cw/OhB;E0Cl3PF;IA4XM,UAAU;IACV,WAAW;E1Cy/Of;E0Ct3PF;IA+XM,UAAU;IACV,UAAU;E1C0/Od;E0C13PF;IAkYM,UAAU;IACV,eAAe;E1C2/OnB;E0C93PF;IAqYM,UAAU;IACV,UAAU;E1C4/Od;E0Cl4PF;IAwYM,UAAU;IACV,eAAe;E1C6/OnB;E0Ct4PF;IA2YM,UAAU;IACV,UAAU;E1C8/Od;E0C14PF;IA8YM,UAAU;IACV,UAAU;E1C+/Od;E0C94PF;IAiZM,UAAU;IACV,UAAU;E1CggPd;E0Cl5PF;IAoZM,UAAU;IACV,UAAU;E1CigPd;E0Ct5PF;IAuZM,UAAU;IACV,UAAU;E1CkgPd;E0C15PF;IzCsJI,iByCoQqC;E1CmgPvC;E0C75PF;IzCsJI,sByCsQ0C;E1CogP5C;E0Ch6PF;IzCsJI,iByCwQqC;E1CqgPvC;E0Cn6PF;IzCsJI,sByC0Q0C;E1CsgP5C;E0Ct6PF;IzCsJI,iByC4QqC;E1CugPvC;E0Cz6PF;IzCsJI,iByC8QqC;E1CwgPvC;E0C56PF;IzCsJI,iByCgRqC;E1CygPvC;E0C/6PF;IzCsJI,iByCkRqC;E1C0gPvC;E0Cl7PF;IzCsJI,iByCoRqC;E1C2gPvC;E0Cr7PF;IA6aQ,UAAU;IACV,SAAiC;E1C2gPvC;E0Cz7PF;IzCsJI,gByC0R8D;E1C4gPhE;E0C57PF;IA6aQ,UAAU;IACV,eAAiC;E1CkhPvC;E0Ch8PF;IzCsJI,sByC0R8D;E1CmhPhE;E0Cn8PF;IA6aQ,UAAU;IACV,gBAAiC;E1CyhPvC;E0Cv8PF;IzCsJI,uByC0R8D;E1C0hPhE;E0C18PF;IA6aQ,UAAU;IACV,UAAiC;E1CgiPvC;E0C98PF;IzCsJI,iByC0R8D;E1CiiPhE;E0Cj9PF;IA6aQ,UAAU;IACV,gBAAiC;E1CuiPvC;E0Cr9PF;IzCsJI,uByC0R8D;E1CwiPhE;E0Cx9PF;IA6aQ,UAAU;IACV,gBAAiC;E1C8iPvC;E0C59PF;IzCsJI,uByC0R8D;E1C+iPhE;E0C/9PF;IA6aQ,UAAU;IACV,UAAiC;E1CqjPvC;E0Cn+PF;IzCsJI,iByC0R8D;E1CsjPhE;E0Ct+PF;IA6aQ,UAAU;IACV,gBAAiC;E1C4jPvC;E0C1+PF;IzCsJI,uByC0R8D;E1C6jPhE;E0C7+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CmkPvC;E0Cj/PF;IzCsJI,uByC0R8D;E1CokPhE;E0Cp/PF;IA6aQ,UAAU;IACV,UAAiC;E1C0kPvC;E0Cx/PF;IzCsJI,iByC0R8D;E1C2kPhE;E0C3/PF;IA6aQ,UAAU;IACV,gBAAiC;E1CilPvC;E0C//PF;IzCsJI,uByC0R8D;E1CklPhE;E0ClgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CwlPvC;E0CtgQF;IzCsJI,uByC0R8D;E1CylPhE;E0CzgQF;IA6aQ,UAAU;IACV,WAAiC;E1C+lPvC;E0C7gQF;IzCsJI,kByC0R8D;E1CgmPhE;AACF;;A0C/lPA;EzC5RI,sByCxJgB;EzCwJhB,qByCxJgB;EAublB,oBAvbkB;A1CyhQpB;;A0CrmPA;EAKI,uBAzbgB;A1C6hQpB;;A0CzmPA;EAOI,qCAA4C;A1CsmPhD;;A0C7mPA;EAUI,uBAAuB;A1CumP3B;;A0CjnPA;EzC5RI,eyCwSiC;EzCxSjC,cyCySiC;EACjC,aAAa;A1CymPjB;;A0CvnPA;EAgBM,SAAS;EACT,qBAAqB;A1C2mP3B;;A0C5nPA;EAmBM,qBAAqB;A1C6mP3B;;A0ChoPA;EAqBM,gBAAgB;A1C+mPtB;;A0CpoPA;EAuBI,aAAa;A1CinPjB;;A0CxoPA;EAyBI,eAAe;A1CmnPnB;;A0C5oPA;EA2BI,mBAAmB;A1CqnPvB;;ACr+PE;EyCqVF;IA+BM,aAAa;E1CsnPjB;AACF;;AC/9PE;EyCyUF;IAmCM,aAAa;E1CwnPjB;AACF;;A0CtnPE;EACE,oBAAY;EzCnUZ,yCyCoU2D;EzCpU3D,wCyCqU2D;A1CynP/D;;A0C5nPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1C2nPrC;;A0CjoPE;EASM,iBAAY;A1C4nPpB;;ACpgQE;EyC+XA;IAYQ,iBAAY;E1C8nPpB;AACF;;ACtgQE;EyC2XA;IAeQ,iBAAY;E1CioPpB;AACF;;ACxgQE;EyCuXA;IAkBQ,iBAAY;E1CooPpB;AACF;;AC1gQE;EyCmXA;IAqBQ,iBAAY;E1CuoPpB;AACF;;AC5gQE;EyC+WA;IAwBQ,iBAAY;E1C0oPpB;AACF;;AC7gQI;EyC0WF;IA2BQ,iBAAY;E1C6oPpB;AACF;;ACzgQI;EyCgWF;IA8BQ,iBAAY;E1CgpPpB;AACF;;AC1gQI;EyC2VF;IAiCQ,iBAAY;E1CmpPpB;AACF;;ACtgQI;EyCiVF;IAoCQ,iBAAY;E1CspPpB;AACF;;A0C3rPE;EASM,oBAAY;A1CsrPpB;;AC9jQE;EyC+XA;IAYQ,oBAAY;E1CwrPpB;AACF;;AChkQE;EyC2XA;IAeQ,oBAAY;E1C2rPpB;AACF;;AClkQE;EyCuXA;IAkBQ,oBAAY;E1C8rPpB;AACF;;ACpkQE;EyCmXA;IAqBQ,oBAAY;E1CisPpB;AACF;;ACtkQE;EyC+WA;IAwBQ,oBAAY;E1CosPpB;AACF;;ACvkQI;EyC0WF;IA2BQ,oBAAY;E1CusPpB;AACF;;ACnkQI;EyCgWF;IA8BQ,oBAAY;E1C0sPpB;AACF;;ACpkQI;EyC2VF;IAiCQ,oBAAY;E1C6sPpB;AACF;;AChkQI;EyCiVF;IAoCQ,oBAAY;E1CgtPpB;AACF;;A0CrvPE;EASM,mBAAY;A1CgvPpB;;ACxnQE;EyC+XA;IAYQ,mBAAY;E1CkvPpB;AACF;;AC1nQE;EyC2XA;IAeQ,mBAAY;E1CqvPpB;AACF;;AC5nQE;EyCuXA;IAkBQ,mBAAY;E1CwvPpB;AACF;;AC9nQE;EyCmXA;IAqBQ,mBAAY;E1C2vPpB;AACF;;AChoQE;EyC+WA;IAwBQ,mBAAY;E1C8vPpB;AACF;;ACjoQI;EyC0WF;IA2BQ,mBAAY;E1CiwPpB;AACF;;AC7nQI;EyCgWF;IA8BQ,mBAAY;E1CowPpB;AACF;;AC9nQI;EyC2VF;IAiCQ,mBAAY;E1CuwPpB;AACF;;AC1nQI;EyCiVF;IAoCQ,mBAAY;E1C0wPpB;AACF;;A0C/yPE;EASM,oBAAY;A1C0yPpB;;AClrQE;EyC+XA;IAYQ,oBAAY;E1C4yPpB;AACF;;ACprQE;EyC2XA;IAeQ,oBAAY;E1C+yPpB;AACF;;ACtrQE;EyCuXA;IAkBQ,oBAAY;E1CkzPpB;AACF;;ACxrQE;EyCmXA;IAqBQ,oBAAY;E1CqzPpB;AACF;;AC1rQE;EyC+WA;IAwBQ,oBAAY;E1CwzPpB;AACF;;AC3rQI;EyC0WF;IA2BQ,oBAAY;E1C2zPpB;AACF;;ACvrQI;EyCgWF;IA8BQ,oBAAY;E1C8zPpB;AACF;;ACxrQI;EyC2VF;IAiCQ,oBAAY;E1Ci0PpB;AACF;;ACprQI;EyCiVF;IAoCQ,oBAAY;E1Co0PpB;AACF;;A0Cz2PE;EASM,iBAAY;A1Co2PpB;;AC5uQE;EyC+XA;IAYQ,iBAAY;E1Cs2PpB;AACF;;AC9uQE;EyC2XA;IAeQ,iBAAY;E1Cy2PpB;AACF;;AChvQE;EyCuXA;IAkBQ,iBAAY;E1C42PpB;AACF;;AClvQE;EyCmXA;IAqBQ,iBAAY;E1C+2PpB;AACF;;ACpvQE;EyC+WA;IAwBQ,iBAAY;E1Ck3PpB;AACF;;ACrvQI;EyC0WF;IA2BQ,iBAAY;E1Cq3PpB;AACF;;ACjvQI;EyCgWF;IA8BQ,iBAAY;E1Cw3PpB;AACF;;AClvQI;EyC2VF;IAiCQ,iBAAY;E1C23PpB;AACF;;AC9uQI;EyCiVF;IAoCQ,iBAAY;E1C83PpB;AACF;;A0Cn6PE;EASM,oBAAY;A1C85PpB;;ACtyQE;EyC+XA;IAYQ,oBAAY;E1Cg6PpB;AACF;;ACxyQE;EyC2XA;IAeQ,oBAAY;E1Cm6PpB;AACF;;AC1yQE;EyCuXA;IAkBQ,oBAAY;E1Cs6PpB;AACF;;AC5yQE;EyCmXA;IAqBQ,oBAAY;E1Cy6PpB;AACF;;AC9yQE;EyC+WA;IAwBQ,oBAAY;E1C46PpB;AACF;;AC/yQI;EyC0WF;IA2BQ,oBAAY;E1C+6PpB;AACF;;AC3yQI;EyCgWF;IA8BQ,oBAAY;E1Ck7PpB;AACF;;AC5yQI;EyC2VF;IAiCQ,oBAAY;E1Cq7PpB;AACF;;ACxyQI;EyCiVF;IAoCQ,oBAAY;E1Cw7PpB;AACF;;A0C79PE;EASM,mBAAY;A1Cw9PpB;;ACh2QE;EyC+XA;IAYQ,mBAAY;E1C09PpB;AACF;;ACl2QE;EyC2XA;IAeQ,mBAAY;E1C69PpB;AACF;;ACp2QE;EyCuXA;IAkBQ,mBAAY;E1Cg+PpB;AACF;;ACt2QE;EyCmXA;IAqBQ,mBAAY;E1Cm+PpB;AACF;;ACx2QE;EyC+WA;IAwBQ,mBAAY;E1Cs+PpB;AACF;;ACz2QI;EyC0WF;IA2BQ,mBAAY;E1Cy+PpB;AACF;;ACr2QI;EyCgWF;IA8BQ,mBAAY;E1C4+PpB;AACF;;ACt2QI;EyC2VF;IAiCQ,mBAAY;E1C++PpB;AACF;;ACl2QI;EyCiVF;IAoCQ,mBAAY;E1Ck/PpB;AACF;;A0CvhQE;EASM,oBAAY;A1CkhQpB;;AC15QE;EyC+XA;IAYQ,oBAAY;E1CohQpB;AACF;;AC55QE;EyC2XA;IAeQ,oBAAY;E1CuhQpB;AACF;;AC95QE;EyCuXA;IAkBQ,oBAAY;E1C0hQpB;AACF;;ACh6QE;EyCmXA;IAqBQ,oBAAY;E1C6hQpB;AACF;;ACl6QE;EyC+WA;IAwBQ,oBAAY;E1CgiQpB;AACF;;ACn6QI;EyC0WF;IA2BQ,oBAAY;E1CmiQpB;AACF;;AC/5QI;EyCgWF;IA8BQ,oBAAY;E1CsiQpB;AACF;;ACh6QI;EyC2VF;IAiCQ,oBAAY;E1CyiQpB;AACF;;AC55Q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E,yBAA6B;A7C+zRnC;;A6C9zRI;EAGI,yBAAgD;A7C+zRxD;;A6C9zRI;EACE,oCAAwC;A7Ci0R9C;;A6C71RE;EACE,yBAAwB;A7Cg2R5B;;A6C/1RE;EAGI,yBAA0C;A7Cg2RhD;;A6C/1RE;EACE,oCAAmC;A7Ck2RvC;;A6C71RI;EACE,yBAA8B;A7Cg2RpC;;A6C/1RI;EAGI,yBAAgD;A7Cg2RxD;;A6C/1RI;EACE,oCAAyC;A7Ck2R/C;;A6Ch2RI;EACE,yBAA6B;A7Cm2RnC;;A6Cl2RI;EAGI,yBAAgD;A7Cm2RxD;;A6Cl2RI;EACE,oCAAwC;A7Cq2R9C;;A6Cj4RE;EACE,yBAAwB;A7Co4R5B;;A6Cn4RE;EAGI,yBAA0C;A7Co4RhD;;A6Cn4RE;EACE,oCAAmC;A7Cs4RvC;;A6Cj4RI;EACE,yBAA8B;A7Co4RpC;;A6Cn4RI;EAGI,yBAAgD;A7Co4RxD;;A6Cn4RI;EACE,oCAAyC;A7Cs4R/C;;A6Cp4RI;EACE,yBAA6B;A7Cu4RnC;;A6Ct4RI;EAGI,yBAAgD;A7Cu4RxD;;A6Ct4RI;EACE,oCAAwC;A7Cy4R9C;;A6Cr6RE;EACE,yBAAwB;A7Cw6R5B;;A6Cv6RE;EAGI,yBAA0C;A7Cw6RhD;;A6Cv6RE;EACE,oCAAmC;A7C06RvC;;A6Cr6RI;EACE,yBAA8B;A7Cw6RpC;;A6Cv6RI;EAGI,yBAAgD;A7Cw6RxD;;A6Cv6RI;EACE,oCAAyC;A7C06R/C;;A6Cx6RI;EACE,yBAA6B;A7C26RnC;;A6C16RI;EAGI,yBAAgD;A7C26RxD;;A6C16RI;EACE,oCAAwC;A7C66R9C;;A6C16RE;EACE,yBAAwB;A7C66R5B;;A6C56RE;EACE,oCAAmC;A7C+6RvC;;A6Cl7RE;EACE,yBAAwB;A7Cq7R5B;;A6Cp7RE;EACE,oCAAmC;A7Cu7RvC;;A6C17RE;EACE,yBAAwB;A7C67R5B;;A6C57RE;EACE,oCAAmC;A7C+7RvC;;A6Cl8RE;EACE,yBAAwB;A7Cq8R5B;;A6Cp8RE;EACE,oCAAmC;A7Cu8RvC;;A6C18RE;EACE,yBAAwB;A7C68R5B;;A6C58RE;EACE,oCAAmC;A7C+8RvC;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,4BAAwB;A7Cq+R5B;;A6Cp+RE;EACE,uCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A8CnhSE;EACE,8BAAiC;A9CshSrC;;A8CvhSE;EACE,sCAAiC;A9C0hSrC;;A8C3hSE;EACE,iCAAiC;A9C8hSrC;;A8C/hSE;EACE,yCAAiC;A9CkiSrC;;A8C9hSE;EACE,4BAA4B;A9CiiShC;;A8CliSE;EACE,0BAA4B;A9CqiShC;;A8CtiSE;EACE,kCAA4B;A9CyiShC;;A8CriSE;EACE,sCAAkC;A9CwiStC;;A8CziSE;EACE,oCAAkC;A9C4iStC;;A8C7iSE;EACE,kCAAkC;A9CgjStC;;A8CjjSE;EACE,yCAAkC;A9CojStC;;A8CrjSE;EACE,wCAAkC;A9CwjStC;;A8CzjSE;EACE,wCAAkC;A9C4jStC;;A8C7jSE;EACE,iCAAkC;A9CgkStC;;A8CjkSE;EACE,+BAAkC;A9CokStC;;A8CrkSE;EACE,gCAAkC;A9CwkStC;;A8CzkSE;EACE,iCAAkC;A9C4kStC;;A8CxkSE;EACE,oCAAgC;A9C2kSpC;;A8C5kSE;EACE,kCAAgC;A9C+kSpC;;A8ChlSE;EACE,gCAAgC;A9CmlSpC;;A8CplSE;EACE,uCAAgC;A9CulSpC;;A8CxlSE;EACE,sCAAgC;A9C2lSpC;;A8C5lSE;EACE,sCAAgC;A9C+lSpC;;A8ChmSE;EACE,iCAAgC;A9CmmSpC;;A8CpmSE;EACE,+BAAgC;A9CumSpC;;A8CxmSE;EACE,6BAAgC;A9C2mSpC;;A8C5mSE;EACE,kCAAgC;A9C+mSpC;;A8C3mSE;EACE,+BAA8B;A9C8mSlC;;A8C/mSE;EACE,kCAA8B;A9CknSlC;;A8CnnSE;EACE,gCAA8B;A9CsnSlC;;A8CvnSE;EACE,8BAA8B;A9C0nSlC;;A8C3nSE;EACE,gCAA8B;A9C8nSlC;;A8C/nSE;EACE,6BAA8B;A9CkoSlC;;A8CnoSE;EACE,2BAA8B;A9CsoSlC;;A8CvoSE;EACE,kCAA8B;A9C0oSlC;;A8C3oSE;EACE,gCAA8B;A9C8oSlC;;A8C1oSE;EACE,2BAA6B;A9C6oSjC;;A8C9oSE;EACE,iCAA6B;A9CipSjC;;A8ClpSE;EACE,+BAA6B;A9CqpSjC;;A8CtpSE;EACE,6BAA6B;A9CypSjC;;A8C1pSE;EACE,+BAA6B;A9C6pSjC;;A8C9pSE;EACE,8BAA6B;A9CiqSjC;;A8C5pSI;EACE,uBAAqC;A9C+pS3C;;A8ChqSI;EACE,uBAAqC;A9CmqS3C;;A8CpqSI;EACE,uBAAqC;A9CuqS3C;;A8CxqSI;EACE,uBAAqC;A9C2qS3C;;A8C5qSI;EACE,uBAAqC;A9C+qS3C;;A8ChrSI;EACE,uBAAqC;A9CmrS3C;;A8CprSI;EACE,yBAAqC;A9CurS3C;;A8CxrSI;EACE,yBAAqC;A9C2rS3C;;A8C5rSI;EACE,yBAAqC;A9C+rS3C;;A8ChsSI;EACE,yBAAqC;A9CmsS3C;;A8CpsSI;EACE,yBAAqC;A9CusS3C;;A8CxsSI;EACE,yBAAqC;A9C2sS3C;;AC1uSE;EACE,WAAW;EACX,YAAY;EACZ,cAAc;AD6uSlB;;A+C9uSA;EACE,sBAAsB;A/CivSxB;;A+C/uSA;EACE,uBAAuB;A/CkvSzB;;AgDzvSA;EACE,2BAA2B;AhD4vS7B;;AgD1vSA;EACE,2BAA2B;AhD6vS7B;;AgD3vSA;EACE,0BAA0B;EAC1B,8BAA8B;AhD8vShC;;AiDxwSA;EACE,2BAA2B;AjD2wS7B;;AkDvwSA;EACE,6BAA6B;AlD0wS/B;;AmDhxSA;EACE,oBAAoB;AnDmxStB;;AmDjxSA;EACE,qBAAqB;AnDoxSvB;;AmDzwSI;EACE,oBAA+B;AnD4wSrC;;AmDzwSM;EACE,wBAA8C;AnD4wStD;;AmD7wSM;EACE,0BAA8C;AnDgxStD;;AmDjxSM;EACE,2BAA8C;AnDoxStD;;AmDrxSM;EACE,yBAA8C;AnDwxStD;;AmDrxSM;EACE,yBAAyC;EACzC,0BAA2C;AnDwxSnD;;AmDrxSM;EACE,wBAAuC;EACvC,2BAA6C;AnDwxSrD;;AmDvySI;EACE,0BAA+B;AnD0ySrC;;AmDvySM;EACE,8BAA8C;AnD0yStD;;AmD3ySM;EACE,gCAA8C;AnD8yStD;;AmD/ySM;EACE,iCAA8C;AnDkzStD;;AmDnzSM;EACE,+BAA8C;AnDszStD;;AmDnzSM;EACE,+BAAyC;EACzC,gCAA2C;AnDszSnD;;AmDnzSM;EACE,8BAAuC;EACvC,iCAA6C;AnDszSrD;;AmDr0SI;EACE,yBAA+B;AnDw0SrC;;AmDr0SM;EACE,6BAA8C;AnDw0StD;;AmDz0SM;EACE,+BAA8C;AnD40StD;;AmD70SM;EACE,gCAA8C;AnDg1StD;;AmDj1SM;EACE,8BAA8C;AnDo1StD;;AmDj1SM;EACE,8BAAyC;EACzC,+BAA2C;AnDo1SnD;;AmDj1SM;EACE,6BAAuC;EACvC,gCAA6C;AnDo1SrD;;AmDn2SI;EACE,0BAA+B;AnDs2SrC;;AmDn2SM;EACE,8BAA8C;AnDs2StD;;AmDv2SM;EACE,gCAA8C;AnD02StD;;AmD32SM;EACE,iCAA8C;AnD82StD;;AmD/2SM;EACE,+BAA8C;AnDk3StD;;AmD/2SM;EACE,+BAAyC;EACzC,gCAA2C;AnDk3SnD;;AmD/2SM;EACE,8BAAuC;EACvC,iCAA6C;AnDk3SrD;;AmDj4SI;EACE,uBAA+B;AnDo4SrC;;AmDj4SM;EACE,2BAA8C;AnDo4StD;;AmDr4SM;EACE,6BAA8C;AnDw4StD;;AmDz4SM;EACE,8BAA8C;AnD44StD;;AmD74SM;EACE,4BAA8C;AnDg5StD;;AmD74SM;EACE,4BAAyC;EACzC,6BAA2C;AnDg5SnD;;AmD74SM;EACE,2BAAuC;EACvC,8BAA6C;AnDg5SrD;;AmD/5SI;EACE,yBAA+B;AnDk6SrC;;AmD/5SM;EACE,6BAA8C;AnDk6StD;;AmDn6SM;EACE,+BAA8C;AnDs6StD;;AmDv6SM;EACE,gCAA8C;AnD06StD;;AmD36SM;EACE,8BAA8C;AnD86StD;;AmD36SM;EACE,8BAAyC;EACzC,+BAA2C;AnD86SnD;;AmD36SM;EACE,6BAAuC;EACvC,gCAA6C;AnD86SrD;;AmD77SI;EACE,uBAA+B;AnDg8SrC;;AmD77SM;EACE,2BAA8C;AnDg8StD;;AmDj8SM;EACE,6BAA8C;AnDo8StD;;AmDr8SM;EACE,8BAA8C;AnDw8StD;;AmDz8SM;EACE,4BAA8C;AnD48StD;;AmDz8SM;EACE,4BAAyC;EACzC,6BAA2C;AnD48SnD;;AmDz8SM;EACE,2BAAuC;EACvC,8BAA6C;AnD48SrD;;AmD39SI;EACE,uBAA+B;AnD89SrC;;AmD39SM;EACE,2BAA8C;AnD89StD;;AmD/9SM;EACE,6BAA8C;AnDk+StD;;AmDn+SM;EACE,8BAA8C;AnDs+StD;;AmDv+SM;EACE,4BAA8C;AnD0+StD;;AmDv+SM;EACE,4BAAyC;EACzC,6BAA2C;AnD0+SnD;;AmDv+SM;EACE,2BAAuC;EACvC,8BAA6C;AnD0+SrD;;AmDz/SI;EACE,qBAA+B;AnD4/SrC;;AmDz/SM;EACE,yBAA8C;AnD4/StD;;AmD7/SM;EACE,2BAA8C;AnDggTtD;;AmDjgTM;EACE,4BAA8C;AnDogTtD;;AmDrgTM;EACE,0BAA8C;AnDwgTtD;;AmDrgTM;EACE,0BAAyC;EACzC,2BAA2C;AnDwgTnD;;AmDrgTM;EACE,yBAAuC;EACvC,4BAA6C;AnDwgTrD;;AmDvhTI;EACE,2BAA+B;AnD0hTrC;;AmDvhTM;EACE,+BAA8C;AnD0hTtD;;AmD3hTM;EACE,iCAA8C;AnD8hTtD;;AmD/hTM;EACE,kCAA8C;AnDkiTtD;;AmDniTM;EACE,gCAA8C;AnDsiTtD;;AmDniTM;EACE,gCAAyC;EACzC,iCAA2C;AnDsiTnD;;AmDniTM;EACE,+BAAuC;EACvC,kCAA6C;AnDsiTrD;;AmDrjTI;EACE,0BAA+B;AnDwjTrC;;AmDrjTM;EACE,8BAA8C;AnDwjTtD;;AmDzjTM;EACE,gCAA8C;AnD4jTtD;;AmD7jTM;EACE,iCAA8C;AnDgkTtD;;AmDjkTM;EACE,+BAA8C;AnDokTtD;;AmDjkTM;EACE,+BAAyC;EACzC,gCAA2C;AnDokTnD;;AmDjkTM;EACE,8BAAuC;EACvC,iCAA6C;AnDokTrD;;AmDnlTI;EACE,2BAA+B;AnDslTrC;;AmDnlTM;EACE,+BAA8C;AnDslTtD;;AmDvlTM;EACE,iCAA8C;AnD0lTtD;;AmD3lTM;EACE,kCAA8C;AnD8lTtD;;AmD/lTM;EACE,gCAA8C;AnDkmTtD;;AmD/lTM;EACE,gCAAyC;EACzC,iCAA2C;AnDkmTnD;;AmD/lTM;EACE,+BAAuC;EACvC,kCAA6C;AnDkmTrD;;AmDjnTI;EACE,wBAA+B;AnDonTrC;;AmDjnTM;EACE,4BAA8C;AnDonTtD;;AmDrnTM;EACE,8BAA8C;AnDwnTtD;;AmDznTM;EACE,+BAA8C;AnD4nTtD;;AmD7nTM;EACE,6BAA8C;AnDgoTtD;;AmD7nTM;EACE,6BAAyC;EACzC,8BAA2C;AnDgoTnD;;AmD7nTM;EACE,4BAAuC;EACvC,+BAA6C;AnDgoTrD;;AmD/oTI;EACE,0BAA+B;AnDkpTrC;;AmD/oTM;EACE,8BAA8C;AnDkpTtD;;AmDnpTM;EACE,gCAA8C;AnDspTtD;;AmDvpTM;EACE,iCAA8C;AnD0pTtD;;AmD3pTM;EACE,+BAA8C;AnD8pTtD;;AmD3pTM;EACE,+BAAyC;EACzC,gCAA2C;AnD8pTnD;;AmD3pTM;EACE,8BAAuC;EACvC,iCAA6C;AnD8pTrD;;AmD7qTI;EACE,wBAA+B;AnDgrTrC;;AmD7qTM;EACE,4BAA8C;AnDgrTtD;;AmDjrTM;EACE,8BAA8C;AnDorTtD;;AmDrrTM;EACE,+BAA8C;AnDwrTtD;;AmDzrTM;EACE,6BAA8C;AnD4rTtD;;AmDzrTM;EACE,6BAAyC;EACzC,8BAA2C;AnD4rTnD;;AmDzrTM;EACE,4BAAuC;EACvC,+BAA6C;AnD4rTrD;;AmD3sTI;EACE,wBAA+B;AnD8sTrC;;AmD3sTM;EACE,4BAA8C;AnD8sTtD;;AmD/sTM;EACE,8BAA8C;AnDktTtD;;AmDntTM;EACE,+BAA8C;AnDstTtD;;AmDvtTM;EACE,6BAA8C;AnD0tTtD;;AmDvtTM;EACE,6BAAyC;EACzC,8BAA2C;AnD0tTnD;;AmDvtTM;EACE,4BAAuC;EACvC,+BAA6C;AnD0tTrD;;AoDnvTI;EACE,0BAA2B;ApDsvTjC;;AoDvvTI;EACE,4BAA2B;ApD0vTjC;;AoD3vTI;EACE,0BAA2B;ApD8vTjC;;AoD/vTI;EACE,4BAA2B;ApDkwTjC;;AoDnwTI;EACE,6BAA2B;ApDswTjC;;AoDvwTI;EACE,0BAA2B;ApD0wTjC;;AoD3wTI;EACE,6BAA2B;ApD8wTjC;;ACvrTE;EmDxFE;IACE,0BAA2B;EpDmxT/B;EoDpxTE;IACE,4BAA2B;EpDsxT/B;EoDvxTE;IACE,0BAA2B;EpDyxT/B;EoD1xTE;IACE,4BAA2B;EpD4xT/B;EoD7xTE;IACE,6BAA2B;EpD+xT/B;EoDhyTE;IACE,0BAA2B;EpDkyT/B;EoDnyTE;IACE,6BAA2B;EpDqyT/B;AACF;;AC3sTE;EmD5FE;IACE,0BAA2B;EpD2yT/B;EoD5yTE;IACE,4BAA2B;EpD8yT/B;EoD/yTE;IACE,0BAA2B;EpDizT/B;EoDlzTE;IACE,4BAA2B;EpDozT/B;EoDrzTE;IACE,6BAA2B;EpDuzT/B;EoDxzTE;IACE,0BAA2B;EpD0zT/B;EoD3zTE;IACE,6BAA2B;EpD6zT/B;AACF;;AC3tTE;EmDpGE;IACE,0BAA2B;EpDm0T/B;EoDp0TE;IACE,4BAA2B;EpDs0T/B;EoDv0TE;IACE,0BAA2B;EpDy0T/B;EoD10TE;IACE,4BAA2B;EpD40T/B;EoD70TE;IACE,6BAA2B;EpD+0T/B;EoDh1TE;IACE,0BAA2B;EpDk1T/B;EoDn1TE;IACE,6BAA2B;EpDq1T/B;AACF;;AC/uTE;EmDxGE;IACE,0BAA2B;EpD21T/B;EoD51TE;IACE,4BAA2B;EpD81T/B;EoD/1TE;IACE,0BAA2B;EpDi2T/B;EoDl2TE;IACE,4BAA2B;EpDo2T/B;EoDr2TE;IACE,6BAA2B;EpDu2T/B;EoDx2TE;IACE,0BAA2B;EpD02T/B;EoD32TE;IACE,6BAA2B;EpD62T/B;AACF;;ACxvTI;EmDvHA;IACE,0BAA2B;EpDm3T/B;EoDp3TE;IACE,4BAA2B;EpDs3T/B;EoDv3TE;IACE,0BAA2B;EpDy3T/B;EoD13TE;IACE,4BAA2B;EpD43T/B;EoD73TE;IACE,6BAA2B;EpD+3T/B;EoDh4TE;IACE,0BAA2B;EpDk4T/B;EoDn4TE;IACE,6BAA2B;EpDq4T/B;AACF;;ACjwTI;EmDtIA;IACE,0BAA2B;EpD24T/B;EoD54TE;IACE,4BAA2B;EpD84T/B;EoD/4TE;IACE,0BAA2B;EpDi5T/B;EoDl5TE;IACE,4BAA2B;EpDo5T/B;EoDr5TE;IACE,6BAA2B;EpDu5T/B;EoDx5TE;IACE,0BAA2B;EpD05T/B;EoD35TE;IACE,6BAA2B;EpD65T/B;AACF;;AoDr4TE;EACE,6BAAqC;ApDw4TzC;;AoDz4TE;EACE,8BAAqC;ApD44TzC;;AoD74TE;EACE,2BAAqC;ApDg5TzC;;AoDj5TE;EACE,4BAAqC;ApDo5TzC;;ACv1TE;EmDzDE;IACE,6BAAqC;EpDo5TzC;AACF;;ACz1TE;EmD1DE;IACE,6BAAqC;EpDu5TzC;AACF;;AC31TE;EmD3DE;IACE,6BAAqC;EpD05TzC;AACF;;AC71TE;EmD5DE;IACE,6BAAqC;EpD65TzC;AACF;;AC/1TE;EmD7DE;IACE,6BAAqC;EpDg6TzC;AACF;;ACh2TI;EmD/DA;IACE,6BAAqC;EpDm6TzC;AACF;;AC51TI;EmDtEA;IACE,6BAAqC;EpDs6TzC;AACF;;AC71TI;EmDxEA;IACE,6BAAqC;EpDy6TzC;AACF;;ACz1TI;EmD/EA;IACE,6BAAqC;EpD46TzC;AACF;;AC74TE;EmDzDE;IACE,8BAAqC;EpD08TzC;AACF;;AC/4TE;EmD1DE;IACE,8BAAqC;EpD68TzC;AACF;;ACj5TE;EmD3DE;IACE,8BAAqC;EpDg9TzC;AACF;;ACn5TE;EmD5DE;IACE,8BAAqC;EpDm9TzC;AACF;;ACr5TE;EmD7DE;IACE,8BAAqC;EpDs9TzC;AACF;;ACt5TI;EmD/DA;IACE,8BAAqC;EpDy9TzC;AACF;;ACl5TI;EmDtEA;IACE,8BAAqC;EpD49TzC;AACF;;ACn5TI;EmDxEA;IACE,8BAAqC;EpD+9TzC;AACF;;AC/4TI;EmD/EA;IACE,8BAAqC;EpDk+TzC;AACF;;ACn8TE;EmDzDE;IACE,2BAAqC;EpDggUzC;AACF;;ACr8TE;EmD1DE;IACE,2BAAqC;EpDmgUzC;AACF;;ACv8TE;EmD3DE;IACE,2BAAqC;EpDsgUzC;AACF;;ACz8TE;EmD5DE;IACE,2BAAqC;EpDygUzC;AACF;;AC38TE;EmD7DE;IACE,2BAAqC;EpD4gUzC;AACF;;AC58TI;EmD/DA;IACE,2BAAqC;EpD+gUzC;AACF;;ACx8TI;EmDtEA;IACE,2BAAqC;EpDkhUzC;AACF;;ACz8TI;EmDxEA;IACE,2BAAqC;EpDqhUzC;AACF;;ACr8TI;EmD/EA;IACE,2BAAqC;EpDwhUzC;AACF;;ACz/TE;EmDzDE;IACE,4BAAqC;EpDsjUzC;AACF;;AC3/TE;EmD1DE;IACE,4BAAqC;EpDyjUzC;AACF;;AC7/TE;EmD3DE;IACE,4BAAqC;EpD4jUzC;AACF;;AC//TE;EmD5DE;IACE,4BAAqC;EpD+jUzC;AACF;;ACjgUE;EmD7DE;IACE,4BAAqC;EpDkkUzC;AACF;;AClgUI;EmD/DA;IACE,4BAAqC;EpDqkUzC;AACF;;AC9/TI;EmDtEA;IACE,4BAAqC;EpDwkUzC;AACF;;AC//TI;EmDxEA;IACE,4BAAqC;EpD2kUzC;AACF;;AC3/TI;EmD/EA;IACE,4BAAqC;EpD8kUzC;AACF;;AoD7kUA;EACE,qCAAqC;ApDglUvC;;AoD9kUA;EACE,oCAAoC;ApDilUtC;;AoD/kUA;EACE,oCAAoC;ApDklUtC;;AoDhlUA;EACE,6BAA6B;ApDmlU/B;;AoDjlUA;EACE,qCAAqC;ApDolUvC;;AoDllUA;EACE,2BAAqC;ApDqlUvC;;AoDplUA;EACE,2BAAsC;ApDulUxC;;AoDtlUA;EACE,2BAAsC;ApDylUxC;;AoDxlUA;EACE,2BAAwC;ApD2lU1C;;AoD1lUA;EACE,2BAAoC;ApD6lUtC;;AoD3lUA;EACE,+LAAuC;ApD8lUzC;;AoD5lUA;EACE,+LAAyC;ApD+lU3C;;AoD7lUA;EACE,+LAA0C;ApDgmU5C;;AoD9lUA;EACE,iCAAyC;ApDimU3C;;AoD/lUA;EACE,iCAAoC;ApDkmUtC;;AqDnsUE;EACE,yBAA+B;ArDssUnC;;AC/mUE;EoDrFE;IACE,yBAA+B;ErDwsUnC;AACF;;ACjnUE;EoDtFE;IACE,yBAA+B;ErD2sUnC;AACF;;ACnnUE;EoDvFE;IACE,yBAA+B;ErD8sUnC;AACF;;ACrnUE;EoDxFE;IACE,yBAA+B;ErDitUnC;AACF;;ACvnUE;EoDzFE;IACE,yBAA+B;ErDotUnC;AACF;;ACxnUI;EoD3FA;IACE,yBAA+B;ErDutUnC;AACF;;ACpnUI;EoDlGA;IACE,yBAA+B;ErD0tUnC;AACF;;ACrnUI;EoDpGA;IACE,yBAA+B;ErD6tUnC;AACF;;ACjnUI;EoD3GA;IACE,yBAA+B;ErDguUnC;AACF;;AqD7vUE;EACE,wBAA+B;ArDgwUnC;;ACzqUE;EoDrFE;IACE,wBAA+B;ErDkwUnC;AACF;;AC3qUE;EoDtFE;IACE,wBAA+B;ErDqwUnC;AACF;;AC7qUE;EoDvFE;IACE,wBAA+B;ErDwwUnC;AACF;;AC/qUE;EoDxFE;IACE,wBAA+B;ErD2wUnC;AACF;;ACjrUE;EoDzFE;IACE,wBAA+B;ErD8wUnC;AACF;;AClrUI;EoD3FA;IACE,wBAA+B;ErDixUnC;AACF;;AC9qUI;EoDlGA;IACE,wBAA+B;ErDoxUnC;AACF;;AC/qUI;EoDpGA;IACE,wBAA+B;ErDuxUnC;AACF;;AC3qUI;EoD3GA;IACE,wBAA+B;ErD0xUnC;AACF;;AqDvzUE;EACE,0BAA+B;ArD0zUnC;;ACnuUE;EoDrFE;IACE,0BAA+B;ErD4zUnC;AACF;;ACruUE;EoDtFE;IACE,0BAA+B;ErD+zUnC;AACF;;ACvuUE;EoDvFE;IACE,0BAA+B;ErDk0UnC;AACF;;ACzuUE;EoDxFE;IACE,0BAA+B;ErDq0UnC;AACF;;AC3uUE;EoDzFE;IACE,0BAA+B;ErDw0UnC;AACF;;AC5uUI;EoD3FA;IACE,0BAA+B;ErD20UnC;AACF;;ACxuUI;EoDlGA;IACE,0BAA+B;ErD80UnC;AACF;;ACzuUI;EoDpGA;IACE,0BAA+B;ErDi1UnC;AACF;;ACruUI;EoD3GA;IACE,0BAA+B;ErDo1UnC;AACF;;AqDj3UE;EACE,gCAA+B;ArDo3UnC;;AC7xUE;EoDrFE;IACE,gCAA+B;ErDs3UnC;AACF;;AC/xUE;EoDtFE;IACE,gCAA+B;ErDy3UnC;AACF;;ACjyUE;EoDvFE;IACE,gCAA+B;ErD43UnC;AACF;;ACnyUE;EoDxFE;IACE,gCAA+B;ErD+3UnC;AACF;;ACryUE;EoDzFE;IACE,gCAA+B;ErDk4UnC;AACF;;ACtyUI;EoD3FA;IACE,gCAA+B;ErDq4UnC;AACF;;AClyUI;EoDlGA;IACE,gCAA+B;ErDw4UnC;AACF;;ACnyUI;EoDpGA;IACE,gCAA+B;ErD24UnC;AACF;;AC/xUI;EoD3GA;IACE,gCAA+B;ErD84UnC;AACF;;AqD36UE;EACE,+BAA+B;ArD86UnC;;ACv1UE;EoDrFE;IACE,+BAA+B;ErDg7UnC;AACF;;ACz1UE;EoDtFE;IACE,+BAA+B;ErDm7UnC;AACF;;AC31UE;EoDvFE;IACE,+BAA+B;ErDs7UnC;AACF;;AC71UE;EoDxFE;IACE,+BAA+B;ErDy7UnC;AACF;;AC/1UE;EoDzFE;IACE,+BAA+B;ErD47UnC;AACF;;ACh2UI;EoD3FA;IACE,+BAA+B;ErD+7UnC;AACF;;AC51UI;EoDlGA;IACE,+BAA+B;ErDk8UnC;AACF;;AC71UI;EoDpGA;IACE,+BAA+B;ErDq8UnC;AACF;;ACz1UI;EoD3GA;IACE,+BAA+B;ErDw8UnC;AACF;;AqDv8UA;EACE,wBAAwB;ArD08U1B;;AqDx8UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArD28U1B;;AC55UE;EoD5CA;IACE,wBAAwB;ErD48U1B;AACF;;AC95UE;EoD5CA;IACE,wBAAwB;ErD88U1B;AACF;;ACh6UE;EoD5CA;IACE,wBAAwB;ErDg9U1B;AACF;;ACl6UE;EoD5CA;IACE,wBAAwB;ErDk9U1B;AACF;;ACp6UE;EoD5CA;IACE,wBAAwB;ErDo9U1B;AACF;;ACr6UI;EoD7CF;IACE,wBAAwB;ErDs9U1B;AACF;;ACj6UI;EoDnDF;IACE,wBAAwB;ErDw9U1B;AACF;;ACl6UI;EoDpDF;IACE,wBAAwB;ErD09U1B;AACF;;AC95UI;EoD1DF;IACE,wBAAwB;ErD49U1B;AACF;;AqD39UA;EACE,6BAA6B;ArD89U/B;;ACt9UE;EoDLA;IACE,6BAA6B;ErD+9U/B;AACF;;ACx9UE;EoDLA;IACE,6BAA6B;ErDi+U/B;AACF;;AC19UE;EoDLA;IACE,6BAA6B;ErDm+U/B;AACF;;AC59UE;EoDLA;IACE,6BAA6B;ErDq+U/B;AACF;;AC99UE;EoDLA;IACE,6BAA6B;ErDu+U/B;AACF;;AC/9UI;EoDNF;IACE,6BAA6B;ErDy+U/B;AACF;;AC39UI;EoDZF;IACE,6BAA6B;ErD2+U/B;AACF;;AC59UI;EoDbF;IACE,6BAA6B;ErD6+U/B;AACF;;ACx9UI;EoDnBF;IACE,6BAA6B;ErD++U/B;AACF;;AsDzmVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvDkmVhC;;AuDtmVA;EAMI,gBAAgB;AvDomVpB;;AuD1mVA;EASM,mBAAmB;AvDqmVzB;;AuD9mVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;AC4nV7B;;AuDnnVA;;EAmBQ,cAAc;AvDqmVtB;;AuDxnVA;EAqBQ,cxD9BqB;ACqoV7B;;AuD5nVA;EAuBQ,4BxDhCqB;ACyoV7B;;AuDhoVA;;EA0BU,cxDnCmB;AC8oV7B;;ACviVE;EsD9FF;IA6BU,uBxDzBqB;ECsoV7B;AACF;;AuD3oVA;;EAgCQ,4BxDzCqB;ACypV7B;;AuDhpVA;;;EAqCU,yB7C6DuB;E6C5DvB,cxD/CmB;ACgqV7B;;AuDvpVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvDknVtB;;AuD5pVA;EA4CY,UAAU;AvDonVtB;;AuDhqVA;EA+CY,uBAAwB;EACxB,UAAU;AvDqnVtB;;AuDrqVA;EAoDY,cxD7DiB;ACkrV7B;;AuDzqVA;EAsDc,uCxD/De;ACsrV7B;;AuD7qVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;AC+qV/B;;AuDnrVA;EAkEU,4EAAyG;AvDqnVnH;;ACrmVE;EsDlFF;IAqEc,4EAAyG;EvDunVrH;AACF;;AuD7rVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;AC8rV/B;;AuDlsVA;;EAmBQ,cAAc;AvDorVtB;;AuDvsVA;EAqBQ,YxDjBuB;ACusV/B;;AuD3sVA;EAuBQ,+BxDnBuB;AC2sV/B;;AuD/sVA;;EA0BU,YxDtBqB;ACgtV/B;;ACtnVE;EsD9FF;IA6BU,yBxDtCmB;ECkuV3B;AACF;;AuD1tVA;;EAgCQ,+BxD5BuB;AC2tV/B;;AuD/tVA;;;EAqCU,uB7C6DuB;E6C5DvB,YxDlCqB;ACkuV/B;;AuDtuVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDisVtB;;AuD3uVA;EA4CY,UAAU;AvDmsVtB;;AuD/uVA;EA+CY,yBAAwB;EACxB,UAAU;AvDosVtB;;AuDpvVA;EAoDY,YxDhDmB;ACovV/B;;AuDxvVA;EAsDc,uCxD/De;ACqwV7B;;AuD5vVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;AC2wV7B;;AuDlwVA;EAkEU,8EAAyG;AvDosVnH;;ACprVE;EsDlFF;IAqEc,8EAAyG;EvDssVrH;AACF;;AuD5wVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AV4sVrB;;AuDjxVA;;EAmBQ,cAAc;AvDmwVtB;;AuDtxVA;EAqBQ,yB7CgDa;AVqtVrB;;AuD1xVA;EAuBQ,yB7C8Ca;AVytVrB;;AuD9xVA;;EA0BU,yB7C2CW;AV8tVrB;;ACrsVE;EsD9FF;IA6BU,4BxD3BoB;ECsyV5B;AACF;;AuDzyVA;;EAgCQ,yB7CqCa;AVyuVrB;;AuD9yVA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AVgvVrB;;AuDrzVA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDgxVtB;;AuD1zVA;EA4CY,UAAU;AvDkxVtB;;AuD9zVA;EA+CY,4BAAwB;EACxB,UAAU;AvDmxVtB;;AuDn0VA;EAoDY,yB7CiBS;AVkwVrB;;AuDv0VA;EAsDc,uCxD/De;ACo1V7B;;AuD30VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;AC+0V9B;;AuDj1VA;EAkEU,iFAAyG;AvDmxVnH;;ACnwVE;EsDlFF;IAqEc,iFAAyG;EvDqxVrH;AACF;;AuD31VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVyxVhB;;AuDh2VA;;EAmBQ,cAAc;AvDk1VtB;;AuDr2VA;EAqBQ,W7CkDQ;AVkyVhB;;AuDz2VA;EAuBQ,+B7CgDQ;AVsyVhB;;AuD72VA;;EA0BU,W7C6CM;AV2yVhB;;ACpxVE;EsD9FF;IA6BU,yBxDlCoB;EC43V5B;AACF;;AuDx3VA;;EAgCQ,+B7CuCQ;AVszVhB;;AuD73VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV6zVhB;;AuDp4VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD+1VtB;;AuDz4VA;EA4CY,UAAU;AvDi2VtB;;AuD74VA;EA+CY,yBAAwB;EACxB,UAAU;AvDk2VtB;;AuDl5VA;EAoDY,W7CmBI;AV+0VhB;;AuDt5VA;EAsDc,uCxD/De;ACm6V7B;;AuD15VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;ACq6V9B;;AuDh6VA;EAkEU,gFAAyG;AvDk2VnH;;ACl1VE;EsDlFF;IAqEc,gFAAyG;EvDo2VrH;AACF;;AuD16VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVw2VhB;;AuD/6VA;;EAmBQ,cAAc;AvDi6VtB;;AuDp7VA;EAqBQ,W7CkDQ;AVi3VhB;;AuDx7VA;EAuBQ,+B7CgDQ;AVq3VhB;;AuD57VA;;EA0BU,W7C6CM;AV03VhB;;ACn2VE;EsD9FF;IA6BU,yBxDpBwB;EC67VhC;AACF;;AuDv8VA;;EAgCQ,+B7CuCQ;AVq4VhB;;AuD58VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV44VhB;;AuDn9VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD86VtB;;AuDx9VA;EA4CY,UAAU;AvDg7VtB;;AuD59VA;EA+CY,yBAAwB;EACxB,UAAU;AvDi7VtB;;AuDj+VA;EAoDY,W7CmBI;AV85VhB;;AuDr+VA;EAsDc,uCxD/De;ACk/V7B;;AuDz+VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;ACs+VlC;;AuD/+VA;EAkEU,gFAAyG;AvDi7VnH;;ACj6VE;EsDlFF;IAqEc,gFAAyG;EvDm7VrH;AACF;;AuDz/VA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AVu7VhB;;AuD9/VA;;EAmBQ,cAAc;AvDg/VtB;;AuDngWA;EAqBQ,W7CkDQ;AVg8VhB;;AuDvgWA;EAuBQ,+B7CgDQ;AVo8VhB;;AuD3gWA;;EA0BU,W7C6CM;AVy8VhB;;ACl7VE;EsD9FF;IA6BU,yBxDlBwB;EC0gWhC;AACF;;AuDthWA;;EAgCQ,+B7CuCQ;AVo9VhB;;AuD3hWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV29VhB;;AuDliWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD6/VtB;;AuDviWA;EA4CY,UAAU;AvD+/VtB;;AuD3iWA;EA+CY,yBAAwB;EACxB,UAAU;AvDggWtB;;AuDhjWA;EAoDY,W7CmBI;AV6+VhB;;AuDpjWA;EAsDc,uCxD/De;ACikW7B;;AuDxjWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;ACmjWlC;;AuD9jWA;EAkEU,gFAAyG;AvDggWnH;;ACh/VE;EsDlFF;IAqEc,gFAAyG;EvDkgWrH;AACF;;AuDxkWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AVsgWhB;;AuD7kWA;;EAmBQ,cAAc;AvD+jWtB;;AuDllWA;EAqBQ,W7CkDQ;AV+gWhB;;AuDtlWA;EAuBQ,+B7CgDQ;AVmhWhB;;AuD1lWA;;EA0BU,W7C6CM;AVwhWhB;;ACjgWE;EsD9FF;IA6BU,yBxDnBwB;EC0lWhC;AACF;;AuDrmWA;;EAgCQ,+B7CuCQ;AVmiWhB;;AuD1mWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV0iWhB;;AuDjnWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD4kWtB;;AuDtnWA;EA4CY,UAAU;AvD8kWtB;;AuD1nWA;EA+CY,yBAAwB;EACxB,UAAU;AvD+kWtB;;AuD/nWA;EAoDY,W7CmBI;AV4jWhB;;AuDnoWA;EAsDc,uCxD/De;ACgpW7B;;AuDvoWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;ACmoWlC;;AuD7oWA;EAkEU,gFAAyG;AvD+kWnH;;AC/jWE;EsDlFF;IAqEc,gFAAyG;EvDilWrH;AACF;;AuDvpWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AVqlWhB;;AuD5pWA;;EAmBQ,cAAc;AvD8oWtB;;AuDjqWA;EAqBQ,W7CkDQ;AV8lWhB;;AuDrqWA;EAuBQ,+B7CgDQ;AVkmWhB;;AuDzqWA;;EA0BU,W7C6CM;AVumWhB;;AChlWE;EsD9FF;IA6BU,yBxDrBwB;EC2qWhC;AACF;;AuDprWA;;EAgCQ,+B7CuCQ;AVknWhB;;AuDzrWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVynWhB;;AuDhsWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD2pWtB;;AuDrsWA;EA4CY,UAAU;AvD6pWtB;;AuDzsWA;EA+CY,yBAAwB;EACxB,UAAU;AvD8pWtB;;AuD9sWA;EAoDY,W7CmBI;AV2oWhB;;AuDltWA;EAsDc,uCxD/De;AC+tW7B;;AuDttWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;ACotWlC;;AuD5tWA;EAkEU,gFAAyG;AvD8pWnH;;AC9oWE;EsDlFF;IAqEc,gFAAyG;EvDgqWrH;AACF;;AuDtuWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AVsqWrB;;AuD3uWA;;EAmBQ,cAAc;AvD6tWtB;;AuDhvWA;EAqBQ,yB7CgDa;AV+qWrB;;AuDpvWA;EAuBQ,yB7C8Ca;AVmrWrB;;AuDxvWA;;EA0BU,yB7C2CW;AVwrWrB;;AC/pWE;EsD9FF;IA6BU,yBxDtBwB;EC2vWhC;AACF;;AuDnwWA;;EAgCQ,yB7CqCa;AVmsWrB;;AuDxwWA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AV0sWrB;;AuD/wWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvD0uWtB;;AuDpxWA;EA4CY,UAAU;AvD4uWtB;;AuDxxWA;EA+CY,yBAAwB;EACxB,UAAU;AvD6uWtB;;AuD7xWA;EAoDY,yB7CiBS;AV4tWrB;;AuDjyWA;EAsDc,uCxD/De;AC8yW7B;;AuDryWA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;ACoyWlC;;AuD3yWA;EAkEU,gFAAyG;AvD6uWnH;;AC7tWE;EsDlFF;IAqEc,gFAAyG;EvD+uWrH;AACF;;AuDrzWA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AVmvWhB;;AuD1zWA;;EAmBQ,cAAc;AvD4yWtB;;AuD/zWA;EAqBQ,W7CkDQ;AV4vWhB;;AuDn0WA;EAuBQ,+B7CgDQ;AVgwWhB;;AuDv0WA;;EA0BU,W7C6CM;AVqwWhB;;AC9uWE;EsD9FF;IA6BU,yBxDhBuB;ECo0W/B;AACF;;AuDl1WA;;EAgCQ,+B7CuCQ;AVgxWhB;;AuDv1WA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVuxWhB;;AuD91WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDyzWtB;;AuDn2WA;EA4CY,UAAU;AvD2zWtB;;AuDv2WA;EA+CY,yBAAwB;EACxB,UAAU;AvD4zWtB;;AuD52WA;EAoDY,W7CmBI;AVyyWhB;;AuDh3WA;EAsDc,uCxD/De;AC63W7B;;AuDp3WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;AC62WjC;;AuD13WA;EAkEU,gFAAyG;AvD4zWnH;;AC5yWE;EsDlFF;IAqEc,gFAAyG;EvD8zWrH;AACF;;AuDp4WA;EAyEM,eAhF0B;AvD+4WhC;;AClzWE;EsDtFF;IA6EQ,oBAnF8B;EvDm5WpC;AACF;;ACxzWE;EsDtFF;IAiFQ,mBAtF4B;EvDw5WlC;AACF;;AuDp5WA;EAsFM,mBAAmB;EACnB,aAAa;AvDk0WnB;;AuDz5WA;EAyFQ,YAAY;EACZ,cAAc;AvDo0WtB;;AuD95WA;EA4FI,gBAAgB;AvDs0WpB;;AuDl6WA;EA8FI,iBAAiB;AvDw0WrB;;AuDp0WA;EAEE,gBAAgB;AvDs0WlB;;AuDx0WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDw0WzC;;AuDj1WA;EAYI,YAAY;AvDy0WhB;;ACr2WE;EsDgBF;IAeI,aAAa;EvD20Wf;AACF;;AuD10WA;EACE,kBAAkB;AvD60WpB;;AC/2WE;EsDiCF;IAKM,aAAa;EvD80WjB;EuDn1WF;IAOQ,sBAAsB;EvD+0W5B;AACF;;ACp3WE;EsD6BF;IASI,aAAa;IACb,uBAAuB;EvDm1WzB;EuD71WF;ItD4BI,mBsDhBwC;EvDo1W1C;AACF;;AuDj1WA;;EAEE,YAAY;EACZ,cAAc;AvDo1WhB;;AuDl1WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDy+W/B;;AC14WE;EsDkDF;IAKI,kBArJgC;EvD6+WlC;AACF;;AwD1+WA;EACE,oBAN2B;AxDm/W7B;;ACx4WE;EuDtGF;IAII,kBAR+B;ExDu/WjC;EwDn/WF;IAOM,oBAV8B;ExDy/WlC;EwDt/WF;IASM,mBAX4B;ExD2/WhC;AACF;;AyD3/WA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzDkgXjC","file":"bulma-rtl.css"} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma.min.css b/pagetop/static/bulmix/css/bulma.min.css new file mode 100644 index 00000000..be16f726 --- /dev/null +++ b/pagetop/static/bulmix/css/bulma.min.css @@ -0,0 +1 @@ +/*! bulma.io v0.9.3 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{right:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:inherit}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;right:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma.min.css.map b/pagetop/static/bulmix/css/bulma.min.css.map new file mode 100644 index 00000000..fc794a72 --- /dev/null +++ b/pagetop/static/bulmix/css/bulma.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EH5DE,iCAAiC;EG8DjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTwDgB;ESvDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AShaA;EAGE,uBV/C6B;EUgD7B,qBVrD4B;EUsD5B,iBX3DwB;EW4DxB,cV3D4B;EU4D5B,eAAe;EAGf,uBAAuB;EACvB,iCA5D6D;EA6D7D,iBA5D6B;EA6D7B,kBA7D6B;EA8D7B,8BA/D6D;EAgE7D,kBAAkB;EAClB,mBAAmB;AT+ZrB;;AS/aA;EAkBI,cAAc;ATialB;;ASnbA;EAwBM,aAAa;EACb,YAAY;AT+ZlB;;ASxbA;ERiGI,+BQtEsG;ERsEtG,oBQrEmE;ATiavE;;AS7bA;ERiGI,mBQnEmE;ERmEnE,gCQlEsG;ATma1G;;ASlcA;EAiCM,+BAAiF;EACjF,gCAAkF;ATqaxF;;ASvcA;EAsCI,qBVxF0B;EUyF1B,cV5F0B;ACigB9B;;AS5cA;EA0CI,qBV/E8B;EUgF9B,cVhG0B;ACsgB9B;;ASjdA;EA6CM,iDVlF4B;AC0flC;;ASrdA;EAgDI,qBVpG0B;EUqG1B,cVtG0B;AC+gB9B;;AS1dA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV1G0B;EU2G1B,0BAzF8B;ATmgBlC;;ASjeA;EA4DM,4BV1GwB;EU2GxB,cVlHwB;AC2hB9B;;ASteA;EAgEM,yBCd2B;EDe3B,cVtHwB;ACgiB9B;;AS3eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT4atB;;ASlfA;EAwEI,gBAtG0B;EAuG1B,yBAtGmC;EAuGnC,cV/G8B;EUgH9B,qBAtG0B;ATohB9B;;ASzfA;EA8EM,cVnH4B;EUoH5B,0BAxGmC;ATuhBzC;;AS9fA;EAoFM,uBVhIyB;EUiIzB,yBAAyB;EACzB,cV/IuB;AC6jB7B;;ASpgBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,cVpJqB;ACmkB7B;;AS1gBA;EA8FQ,yBAAyB;EACzB,cVxJqB;ACwkB7B;;AS/gBA;EAiGU,mDV7IqB;AC+jB/B;;ASnhBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,cV/JqB;ACklB7B;;ASzhBA;;EAyGQ,uBVrJuB;EUsJvB,yBAAyB;EACzB,gBAAgB;ATqbxB;;AShiBA;EA6GQ,yBVtKqB;EUuKrB,YV1JuB;ACilB/B;;ASriBA;EAiHU,uBC/DuB;AVufjC;;ASziBA;;EAoHU,yBV7KmB;EU8KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVnKqB;AC6lB/B;;ASjjBA;EA0HU,gEAA4E;AT2btF;;ASrjBA;EA4HQ,6BAA6B;EAC7B,mBVzKuB;EU0KvB,YV1KuB;ACumB/B;;AS3jBA;EAmIU,uBV/KqB;EUgLrB,mBVhLqB;EUiLrB,cV9LmB;AC0nB7B;;ASjkBA;EAwIY,4DAA8D;AT6b1E;;ASrkBA;EA8Ic,gEAA4E;AT2b1F;;ASzkBA;;EAiJU,6BAA6B;EAC7B,mBV9LqB;EU+LrB,gBAAgB;EAChB,YVhMqB;AC6nB/B;;ASjlBA;EAsJQ,6BAA6B;EAC7B,qBVhNqB;EUiNrB,cVjNqB;ACgpB7B;;ASvlBA;EA6JU,yBVtNmB;EUuNnB,YV1MqB;ACwoB/B;;AS5lBA;EAqKc,4DAA8D;AT2b5E;;AShmBA;;EAwKU,6BAA6B;EAC7B,qBVlOmB;EUmOnB,gBAAgB;EAChB,cVpOmB;ACiqB7B;;ASxmBA;EAoFM,yBV7IuB;EU8IvB,yBAAyB;EACzB,YVlIyB;AC0pB/B;;AS9mBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,YVvIuB;ACgqB/B;;ASpnBA;EA8FQ,yBAAyB;EACzB,YV3IuB;ACqqB/B;;ASznBA;EAiGU,gDV1JmB;ACsrB7B;;AS7nBA;EAoGQ,uBClDyB;EDmDzB,yBAAyB;EACzB,YVlJuB;AC+qB/B;;ASnoBA;;EAyGQ,yBVlKqB;EUmKrB,yBAAyB;EACzB,gBAAgB;AT+hBxB;;AS1oBA;EA6GQ,uBVzJuB;EU0JvB,cVvKqB;ACwsB7B;;AS/oBA;EAiHU,yBC/DuB;AVimBjC;;ASnpBA;;EAoHU,uBVhKqB;EUiKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVhLmB;ACotB7B;;AS3pBA;EA0HU,4DAA4E;ATqiBtF;;AS/pBA;EA4HQ,6BAA6B;EAC7B,qBVtLqB;EUuLrB,cVvLqB;AC8tB7B;;ASrqBA;EAmIU,yBV5LmB;EU6LnB,qBV7LmB;EU8LnB,YVjLqB;ACutB/B;;AS3qBA;EAwIY,gEAA8D;ATuiB1E;;AS/qBA;EA8Ic,4DAA4E;ATqiB1F;;ASnrBA;;EAiJU,6BAA6B;EAC7B,qBV3MmB;EU4MnB,gBAAgB;EAChB,cV7MmB;ACovB7B;;AS3rBA;EAsJQ,6BAA6B;EAC7B,mBVnMuB;EUoMvB,YVpMuB;AC6uB/B;;ASjsBA;EA6JU,uBVzMqB;EU0MrB,cVvNmB;AC+vB7B;;AStsBA;EAqKc,gEAA8D;ATqiB5E;;AS1sBA;;EAwKU,6BAA6B;EAC7B,mBVrNqB;EUsNrB,gBAAgB;EAChB,YVvNqB;AC8vB/B;;ASltBA;EAoFM,4BVlIwB;EUmIxB,yBAAyB;EACzB,yBCjEe;AVmsBrB;;ASxtBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVysBrB;;AS9tBA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV8sBrB;;ASnuBA;EAiGU,mDV/IoB;ACqxB9B;;ASvuBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVwtBrB;;AS7uBA;;EAyGQ,4BVvJsB;EUwJtB,yBAAyB;EACzB,gBAAgB;ATyoBxB;;ASpvBA;EA6GQ,oCCxFa;EDyFb,iBV5JsB;ACuyB9B;;ASzvBA;EAiHU,oCC/DuB;AV2sBjC;;AS7vBA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVrKoB;ACmzB9B;;ASrwBA;EA0HU,sFAA4E;AT+oBtF;;ASzwBA;EA4HQ,6BAA6B;EAC7B,wBV3KsB;EU4KtB,iBV5KsB;AC6zB9B;;AS/wBA;EAmIU,4BVjLoB;EUkLpB,wBVlLoB;EUmLpB,yBChHW;AVgwBrB;;ASrxBA;EAwIY,sEAA8D;ATipB1E;;ASzxBA;EA8Ic,sFAA4E;AT+oB1F;;AS7xBA;;EAiJU,6BAA6B;EAC7B,wBVhMoB;EUiMpB,gBAAgB;EAChB,iBVlMoB;ACm1B9B;;ASryBA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVsxBrB;;AS3yBA;EA6JU,oCCxIW;EDyIX,iBV5MoB;AC81B9B;;AShzBA;EAqKc,sEAA8D;AT+oB5E;;ASpzBA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVuyBrB;;AS5zBA;EAoFM,yBVzIwB;EU0IxB,yBAAyB;EACzB,WC/DU;AV2yBhB;;ASl0BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVizBhB;;ASx0BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVszBhB;;AS70BA;EAiGU,gDVtJoB;ACs4B9B;;ASj1BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVg0BhB;;ASv1BA;;EAyGQ,yBV9JsB;EU+JtB,yBAAyB;EACzB,gBAAgB;ATmvBxB;;AS91BA;EA6GQ,sBCtFQ;EDuFR,cVnKsB;ACw5B9B;;ASn2BA;EAiHU,yBC/DuB;AVqzBjC;;ASv2BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5KoB;ACo6B9B;;AS/2BA;EA0HU,0DAA4E;ATyvBtF;;ASn3BA;EA4HQ,6BAA6B;EAC7B,qBVlLsB;EUmLtB,cVnLsB;AC86B9B;;ASz3BA;EAmIU,yBVxLoB;EUyLpB,qBVzLoB;EU0LpB,WC9GM;AVw2BhB;;AS/3BA;EAwIY,gEAA8D;AT2vB1E;;ASn4BA;EA8Ic,0DAA4E;ATyvB1F;;ASv4BA;;EAiJU,6BAA6B;EAC7B,qBVvMoB;EUwMpB,gBAAgB;EAChB,cVzMoB;ACo8B9B;;AS/4BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV83BhB;;ASr5BA;EA6JU,sBCtIM;EDuIN,cVnNoB;AC+8B9B;;AS15BA;EAqKc,gEAA8D;ATyvB5E;;AS95BA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+4BhB;;ASt6BA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WC/DU;AVq5BhB;;AS56BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV25BhB;;ASl7BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVg6BhB;;ASv7BA;EAiGU,iDVxIwB;ACk+BlC;;AS37BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV06BhB;;ASj8BA;;EAyGQ,yBVhJ0B;EUiJ1B,yBAAyB;EACzB,gBAAgB;AT61BxB;;ASx8BA;EA6GQ,sBCtFQ;EDuFR,cVrJ0B;ACo/BlC;;AS78BA;EAiHU,yBC/DuB;AV+5BjC;;ASj9BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACggClC;;ASz9BA;EA0HU,0DAA4E;ATm2BtF;;AS79BA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC0gClC;;ASn+BA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC9GM;AVk9BhB;;ASz+BA;EAwIY,gEAA8D;ATq2B1E;;AS7+BA;EA8Ic,0DAA4E;ATm2B1F;;ASj/BA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACgiClC;;ASz/BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVw+BhB;;AS//BA;EA6JU,sBCtIM;EDuIN,cVrMwB;AC2iClC;;ASpgCA;EAqKc,gEAA8D;ATm2B5E;;ASxgCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVy/BhB;;AShhCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV8+BrE;;ASrhCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVo/BrE;;AS3hCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV0/BrE;;ASjiCA;EAoFM,yBVzH4B;EU0H5B,yBAAyB;EACzB,WC/DU;AVghChB;;ASviCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVshChB;;AS7iCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AV2hChB;;ASljCA;EAiGU,iDVtIwB;AC2lClC;;AStjCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVqiChB;;AS5jCA;;EAyGQ,yBV9I0B;EU+I1B,yBAAyB;EACzB,gBAAgB;ATw9BxB;;ASnkCA;EA6GQ,sBCtFQ;EDuFR,cVnJ0B;AC6mClC;;ASxkCA;EAiHU,yBC/DuB;AV0hCjC;;AS5kCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5JwB;ACynClC;;ASplCA;EA0HU,0DAA4E;AT89BtF;;ASxlCA;EA4HQ,6BAA6B;EAC7B,qBVlK0B;EUmK1B,cVnK0B;ACmoClC;;AS9lCA;EAmIU,yBVxKwB;EUyKxB,qBVzKwB;EU0KxB,WC9GM;AV6kChB;;ASpmCA;EAwIY,gEAA8D;ATg+B1E;;ASxmCA;EA8Ic,0DAA4E;AT89B1F;;AS5mCA;;EAiJU,6BAA6B;EAC7B,qBVvLwB;EUwLxB,gBAAgB;EAChB,cVzLwB;ACypClC;;ASpnCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVmmChB;;AS1nCA;EA6JU,sBCtIM;EDuIN,cVnMwB;ACoqClC;;AS/nCA;EAqKc,gEAA8D;AT89B5E;;ASnoCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVonChB;;AS3oCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVymCrE;;AShpCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV+mCrE;;AStpCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVqnCrE;;AS5pCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WC/DU;AV2oChB;;ASlqCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVipChB;;ASxqCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVspChB;;AS7qCA;EAiGU,kDVvIwB;ACutClC;;ASjrCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVgqChB;;ASvrCA;;EAyGQ,yBV/I0B;EUgJ1B,yBAAyB;EACzB,gBAAgB;ATmlCxB;;AS9rCA;EA6GQ,sBCtFQ;EDuFR,cVpJ0B;ACyuClC;;ASnsCA;EAiHU,yBC/DuB;AVqpCjC;;ASvsCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACqvClC;;AS/sCA;EA0HU,0DAA4E;ATylCtF;;ASntCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;AC+vClC;;ASztCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC9GM;AVwsChB;;AS/tCA;EAwIY,gEAA8D;AT2lC1E;;ASnuCA;EA8Ic,0DAA4E;ATylC1F;;ASvuCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACqxClC;;AS/uCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV8tChB;;ASrvCA;EA6JU,sBCtIM;EDuIN,cVpMwB;ACgyClC;;AS1vCA;EAqKc,gEAA8D;ATylC5E;;AS9vCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+uChB;;AStwCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVouCrE;;AS3wCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV0uCrE;;ASjxCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVgvCrE;;ASvxCA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WC/DU;AVswChB;;AS7xCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV4wChB;;ASnyCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVixChB;;ASxyCA;EAiGU,kDVzIwB;ACo1ClC;;AS5yCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV2xChB;;ASlzCA;;EAyGQ,yBVjJ0B;EUkJ1B,yBAAyB;EACzB,gBAAgB;AT8sCxB;;ASzzCA;EA6GQ,sBCtFQ;EDuFR,cVtJ0B;ACs2ClC;;AS9zCA;EAiHU,yBC/DuB;AVgxCjC;;ASl0CA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACk3ClC;;AS10CA;EA0HU,0DAA4E;ATotCtF;;AS90CA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC43ClC;;ASp1CA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC9GM;AVm0ChB;;AS11CA;EAwIY,gEAA8D;ATstC1E;;AS91CA;EA8Ic,0DAA4E;ATotC1F;;ASl2CA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACk5ClC;;AS12CA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVy1ChB;;ASh3CA;EA6JU,sBCtIM;EDuIN,cVtMwB;AC65ClC;;ASr3CA;EAqKc,gEAA8D;ATotC5E;;ASz3CA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV02ChB;;ASj4CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV+1CrE;;ASt4CA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVq2CrE;;AS54CA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV22CrE;;ASl5CA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,yBCjEe;AVm4CrB;;ASx5CA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVy4CrB;;AS95CA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV84CrB;;ASn6CA;EAiGU,mDV1IwB;ACg9ClC;;ASv6CA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVw5CrB;;AS76CA;;EAyGQ,yBVlJ0B;EUmJ1B,yBAAyB;EACzB,gBAAgB;ATy0CxB;;ASp7CA;EA6GQ,oCCxFa;EDyFb,cVvJ0B;ACk+ClC;;ASz7CA;EAiHU,oCC/DuB;AV24CjC;;AS77CA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;AC8+ClC;;ASr8CA;EA0HU,sFAA4E;AT+0CtF;;ASz8CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;ACw/ClC;;AS/8CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,yBChHW;AVg8CrB;;ASr9CA;EAwIY,gEAA8D;ATi1C1E;;ASz9CA;EA8Ic,sFAA4E;AT+0C1F;;AS79CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;AC8gDlC;;ASr+CA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVs9CrB;;AS3+CA;EA6JU,oCCxIW;EDyIX,cVvMwB;ACyhDlC;;ASh/CA;EAqKc,gEAA8D;AT+0C5E;;ASp/CA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVu+CrB;;AS5/CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV09CrE;;ASjgDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVg+CrE;;ASvgDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVs+CrE;;AS7gDA;EAoFM,yBVvH2B;EUwH3B,yBAAyB;EACzB,WC/DU;AV4/ChB;;ASnhDA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVkgDhB;;ASzhDA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVugDhB;;AS9hDA;EAiGU,kDVpIuB;ACqkDjC;;ASliDA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVihDhB;;ASxiDA;;EAyGQ,yBV5IyB;EU6IzB,yBAAyB;EACzB,gBAAgB;ATo8CxB;;AS/iDA;EA6GQ,sBCtFQ;EDuFR,cVjJyB;ACulDjC;;ASpjDA;EAiHU,yBC/DuB;AVsgDjC;;ASxjDA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV1JuB;ACmmDjC;;AShkDA;EA0HU,0DAA4E;AT08CtF;;ASpkDA;EA4HQ,6BAA6B;EAC7B,qBVhKyB;EUiKzB,cVjKyB;AC6mDjC;;AS1kDA;EAmIU,yBVtKuB;EUuKvB,qBVvKuB;EUwKvB,WC9GM;AVyjDhB;;AShlDA;EAwIY,gEAA8D;AT48C1E;;ASplDA;EA8Ic,0DAA4E;AT08C1F;;ASxlDA;;EAiJU,6BAA6B;EAC7B,qBVrLuB;EUsLvB,gBAAgB;EAChB,cVvLuB;ACmoDjC;;AShmDA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV+kDhB;;AStmDA;EA6JU,sBCtIM;EDuIN,cVjMuB;AC8oDjC;;AS3mDA;EAqKc,gEAA8D;AT08C5E;;AS/mDA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVgmDhB;;ASvnDA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVqlDrE;;AS5nDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV2lDrE;;ASloDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVimDrE;;ASxoDA;EARE,kBVbc;ACiqDhB;;AStpDE;EACE,kBVkBc;ACuoDlB;;AShpDA;EANE,eVhBW;AC0qDb;;ASppDA;EAJE,kBVnBc;AC+qDhB;;ASxpDA;EAFE,iBVtBa;ACorDf;;AS5pDA;;EAyMI,uBVrP2B;EUsP3B,qBV3P0B;EU4P1B,gBAhOyB;EAiOzB,YAhOyB;ATwrD7B;;ASpqDA;EA8MI,aAAa;EACb,WAAW;AT09Cf;;ASzqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT49CxB;;AS9qDA;ERlDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQkQhC,6BAA6B;AT+9CnC;;ASrrDA;EAwNI,4BVtQ0B;EUuQ1B,qBV1Q0B;EU2Q1B,cV7Q0B;EU8Q1B,gBAAgB;EAChB,oBAAoB;ATi+CxB;;AS7rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATm+C/D;;ASj+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATo+C7B;;ASx+CA;EAMI,qBAAqB;ATs+CzB;;AS5+CA;ERjII,oBQyIwC;ATw+C5C;;ASh/CA;EAUI,sBAAsB;AT0+C1B;;ASp/CA;EAYI,mBAAmB;AT4+CvB;;ASx/CA;EA1OE,kBVbc;ACmvDhB;;ASxuDE;EACE,kBVkBc;ACytDlB;;AShgDA;EAtOE,kBVnBc;AC6vDhB;;ASpgDA;EApOE,iBVtBa;ACkwDf;;ASxgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATk/CjC;;AS7gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ER/J9B,kBQgKwC;ATo/C5C;;ASnhDA;ERjII,eQkKqC;ATs/CzC;;ASvhDA;EAoCQ,UAAU;ATu/ClB;;AS3hDA;EA0CQ,UAAU;ATq/ClB;;AS/hDA;EA4CU,UAAU;ATu/CpB;;ASniDA;EA8CQ,YAAY;EACZ,cAAc;ATy/CtB;;ASxiDA;EAiDI,uBAAuB;AT2/C3B;;AS5iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT4/C7B;;ASjjDA;EAuDI,yBAAyB;AT8/C7B;;ASrjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT+/C7B;;AWl1DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WA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wB;EgBsCxB,WLsCU;AVovEhB;;Ae3zEA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyvEhB;;Aeh0EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV8uErE;;Aer0EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmwEhB;;Ae10EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVwvErE;;Ae/0EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6wEhB;;Aep1EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVkwErE;;Aez1EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuxEhB;;Ae91EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV4wErE;;Aen2EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVmyErB;;Aex2EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVsxErE;;Ae72EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV2yEhB;;Ael3EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVgyErE;;AgBx3EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjBwDqB;EiBvDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB03Eb;;AgBp4EA;EAYI,yBjBX2B;ACu4E/B;;AgBx4EA;EAcI,yBjBjB0B;AC+4E9B;;AgB54EA;EAgBI,yBjBnB0B;ACm5E9B;;AgBh5EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk4EhB;;AgBr5EA;EAyBQ,uBjBpBuB;ACo5E/B;;AgBz5EA;EA2BQ,uBjBtBuB;ACw5E/B;;AgB75EA;EA6BQ,uBjBxBuB;AC45E/B;;AgBj6EA;EA+BQ,mEAA2F;AhBs4EnG;;AgBr6EA;EAyBQ,yBjBjCqB;ACi7E7B;;AgBz6EA;EA2BQ,yBjBnCqB;ACq7E7B;;AgB76EA;EA6BQ,yBjBrCqB;ACy7E7B;;AgBj7EA;EA+BQ,qEAA2F;AhBs5EnG;;AgBr7EA;EAyBQ,4BjBtBsB;ACs7E9B;;AgBz7EA;EA2BQ,4BjBxBsB;AC07E9B;;AgB77EA;EA6BQ,4BjB1BsB;AC87E9B;;AgBj8EA;EA+BQ,wEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjB7BsB;AC68E9B;;AgBz8EA;EA2BQ,yBjB/BsB;ACi9E9B;;AgB78EA;EA6BQ,yBjBjCsB;ACq9E9B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,yBjBf0B;AC+8ElC;;AgBz9EA;EA2BQ,yBjBjB0B;ACm9ElC;;AgB79EA;EA6BQ,yBjBnB0B;ACu9ElC;;AgBj+EA;EA+BQ,qEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjBb0B;AC69ElC;;AgBz+EA;EA2BQ,yBjBf0B;ACi+ElC;;AgB7+EA;EA6BQ,yBjBjB0B;ACq+ElC;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBd0B;AC8+ElC;;AgBz/EA;EA2BQ,yBjBhB0B;ACk/ElC;;AgB7/EA;EA6BQ,yBjBlB0B;ACs/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBhB0B;ACggFlC;;AgBzgFA;EA2BQ,yBjBlB0B;ACogFlC;;AgB7gFA;EA6BQ,yBjBpB0B;ACwgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBjB0B;ACihFlC;;AgBzhFA;EA2BQ,yBjBnB0B;ACqhFlC;;AgB7hFA;EA6BQ,yBjBrB0B;ACyhFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBXyB;AC2hFjC;;AgBziFA;EA2BQ,yBjBbyB;AC+hFjC;;AgB7iFA;EA6BQ,yBjBfyB;ACmiFjC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBuhF9B;;AgBjkFA;EA4CM,6BAA6B;AhByhFnC;;AgBrkFA;EA8CM,6BAA6B;AhB2hFnC;;AgBzkFA;EAgDM,oBAAoB;AhB6hF1B;;AgB7kFA;EAoDI,ejBxBY;ACqjFhB;;AgBjlFA;EAsDI,ejB5BY;AC2jFhB;;AgBrlFA;EAwDI,cjB/BW;ACgkFf;;AgB/hFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AgBxiFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AiB/kFA;EAEE,uBlBhB6B;EkBiB7B,clB1B4B;AC2mF9B;;AiBplFA;;EAMI,yBlBzB0B;EkB0B1B,qBA9B6B;EA+B7B,qBA9B6B;EA+B7B,mBAAmB;AjBmlFvB;;AiB5lFA;;EAeQ,uBlB7BuB;EkB8BvB,mBlB9BuB;EkB+BvB,clB5CqB;AC8nF7B;;AiBnmFA;;EAeQ,yBlB1CqB;EkB2CrB,qBlB3CqB;EkB4CrB,YlB/BuB;ACwnF/B;;AiB1mFA;;EAeQ,4BlB/BsB;EkBgCtB,wBlBhCsB;EkBiCtB,yBPkCa;AV8jFrB;;AiBjnFA;;EAeQ,yBlBtCsB;EkBuCtB,qBlBvCsB;EkBwCtB,WPoCQ;AVmkFhB;;AiBxnFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPoCQ;AV0kFhB;;AiB/nFA;;EAeQ,yBlBtB0B;EkBuB1B,qBlBvB0B;EkBwB1B,WPoCQ;AVilFhB;;AiBtoFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPoCQ;AVwlFhB;;AiB7oFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPoCQ;AV+lFhB;;AiBppFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,yBPkCa;AVwmFrB;;AiB3pFA;;EAeQ,yBlBpByB;EkBqBzB,qBlBrByB;EkBsBzB,WPoCQ;AV6mFhB;;AiBlqFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBmpFf;;AiBxqFA;;EAuBM,yBlBhC4B;EkBiC5B,WP6BU;AVynFhB;;AiB9qFA;;;;EA2BQ,mBAAmB;AjB0pF3B;;AiBrrFA;;EA6BM,sBAAsB;AjB6pF5B;;AiB1rFA;EA+BI,clBtD0B;ACqtF9B;;AiB9rFA;EAiCM,mBAAmB;AjBiqFzB;;AiBlsFA;EAoCM,yBlB7C4B;EkB8C5B,WPgBU;AVkpFhB;;AiBvsFA;;EAwCQ,mBAAmB;AjBoqF3B;;AiB5sFA;;EA2CQ,kBPUQ;EOTR,mBAAmB;AjBsqF3B;;AiBltFA;EA8CI,6BA5DqC;AjBouFzC;;AiBttFA;;EAiDM,qBApEgC;EAqEhC,clBzEwB;ACmvF9B;;AiB5tFA;EAoDI,6BAhEqC;AjB4uFzC;;AiBhuFA;;EAuDM,qBAxEgC;EAyEhC,clB/EwB;AC6vF9B;;AiBtuFA;EA0DI,6BAvEqC;AjBuvFzC;;AiB1uFA;;EA+DU,sBAAsB;AjBgrFhC;;AiB/uFA;;EAoEM,iBAAiB;AjBgrFvB;;AiBpvFA;;EAyEU,wBAAwB;AjBgrFlC;;AiBzvFA;EA2EI,WAAW;AjBkrFf;;AiB7vFA;EAgFU,yBlB/FoB;ACgxF9B;;AiBjwFA;EAqFY,yBlBpGkB;ACoxF9B;;AiBrwFA;EAuFc,4BlBvGgB;ACyxF9B;;AiBzwFA;;EA2FM,qBAAqB;AjBmrF3B;;AiB9wFA;EAgGU,yBlB/GoB;ACiyF9B;;AiBhrFA;EhBjEE,iCAAiC;EgBoEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBkrFjB;;AkB7yFA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBgzF7B;;AkBpzFA;EAMI,qBAAqB;AlBkzFzB;;AkBxzFA;EjBmJI,oBiB3IwC;AlBozF5C;;AkB5zFA;EAUI,sBAAsB;AlBszF1B;;AkBh0FA;EAYI,mBAAmB;AlBwzFvB;;AkBp0FA;EAgBM,enBYO;AC4yFb;;AkBx0FA;EAmBM,kBnBQU;ACizFhB;;AkB50FA;EAqBI,uBAAuB;AlB2zF3B;;AkBh1FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB6zF1B;;AkBr1FA;EA0BI,yBAAyB;AlB+zF7B;;AkBz1FA;EA6BQ,mBAAmB;AlBg0F3B;;AkB71FA;EA+BQ,eAAe;AlBk0FvB;;AkBj2FA;EjBmJI,eiBjHmC;AlBm0FvC;;AkBr2FA;EjBmJI,ciB/GqC;EAE/B,yBAAyB;EACzB,4BAA4B;AlBo0FtC;;AkB32FA;EA6CU,0BAA0B;EAC1B,6BAA6B;AlBk0FvC;;AkB7zFA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBMU;EmBLV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg0FrB;;AkB50FA;EjBgGI,oBiBlFuC;EjBkFvC,uBiBjFyC;AlBk0F7C;;AkBj1FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg5F7B;;AkBt1FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw4F/B;;AkB31FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV40FrB;;AkBh2FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+0FhB;;AkBr2FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo1FhB;;AkB12FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVy0FrE;;AkB/2FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV81FhB;;AkBp3FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVm1FrE;;AkBz3FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw2FhB;;AkB93FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV61FrE;;AkBn4FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk3FhB;;AkBx4FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVu2FrE;;AkB74FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV83FrB;;AkBl5FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVi3FrE;;AkBv5FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs4FhB;;AkB55FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV23FrE;;AkBj6FA;EAgCI,kBnBtDY;AC27FhB;;AkBr6FA;EAkCI,enBzDS;ACg8Fb;;AkBz6FA;EAoCI,kBnB5DY;ACq8FhB;;AkB76FA;EjBgGI,qBiBzD0C;EjByD1C,sBiBxD0C;AlB04F9C;;AkBl7FA;EjBgGI,qBiBtD0C;EjBsD1C,sBiBrD0C;AlB44F9C;;AkBv7FA;EjBgGI,qBiBnD0C;EjBmD1C,sBiBlD0C;AlB84F9C;;AkB57FA;EjBgGI,gBiBvJmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+4Fd;;AkBn8FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg5FrC;;AkB98FA;EAgEM,WAAW;EACX,UAAU;AlBk5FhB;;AkBn9FA;EAmEM,WAAW;EACX,UAAU;AlBo5FhB;;AkBx9FA;EAuEM,yBAAmD;AlBq5FzD;;AkB59FA;EAyEM,yBAAoD;AlBu5F1D;;AkBh+FA;EA2EI,qBnBhEmB;ACy9FvB;;AkBv5FA;EAEI,0BAA0B;AlBy5F9B;;AmB/gGA;;EAGE,sBAAsB;AnBihGxB;;AmBphGA;;;;EAMI,oBAAoB;AnBqhGxB;;AmB3hGA;;EAQI,iBApBmB;AnB4iGvB;;AmBhiGA;;EAUI,iBArBmB;AnBgjGvB;;AmBriGA;;EAYI,sBAAsB;AnB8hG1B;;AmB5hGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgkGzB;;AmBniGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmkG7B;;AmBxiGA;EAWI,oBA3B+B;AnB4jGnC;;AmB5iGA;EAgBM,epBnBO;ACmjGb;;AmBhjGA;EAgBM,iBpBlBS;ACsjGf;;AmBpjGA;EAgBM,epBjBO;ACyjGb;;AmBxjGA;EAgBM,iBpBhBS;AC4jGf;;AmB5jGA;EAgBM,kBpBfU;AC+jGhB;;AmBhkGA;EAgBM,epBdO;ACkkGb;;AmBpkGA;EAgBM,kBpBbU;ACqkGhB;;AmBtjGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkmG3B;;AmB7jGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4kGrB;;AmBlkGA;EAWI,oBA7C+B;AnBwmGnC;;AmBtkGA;EAgBM,epBrCO;AC+lGb;;AmB1kGA;EAgBM,iBpBpCS;ACkmGf;;AmB9kGA;EAgBM,epBnCO;ACqmGb;;AmBllGA;EAgBM,iBpBlCS;ACwmGf;;AmBtlGA;EAgBM,kBpBjCU;AC2mGhB;;AmB1lGA;EAgBM,epBhCO;AC8mGb;;AmB9lGA;EAgBM,kBpB/BU;ACinGhB;;AoB/oGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkpG3B;;AoB7oGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBkDqB;EqBjDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgpGrB;;AqB9qGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBiCU;EuBhCV,cvB/B4B;ACgrG9B;;ACnnGI;EqB5BA,4BvBjC0B;ACorG9B;;ACvnGI;EqB5BA,4BvBjC0B;ACwrG9B;;AC3nGI;EqB5BA,4BvBjC0B;AC4rG9B;;AC/nGI;EqB5BA,4BvBjC0B;ACgsG9B;;AsB9pGE;EAEE,qBvBjC0B;ACisG9B;;AsB/pGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACyrGlC;;AsB9pGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACktG9B;;ACvpGI;;;;;EqBXE,+BvBhDwB;AC0tG9B;;AC/pGI;;;;;EqBXE,+BvBhDwB;ACkuG9B;;ACvqGI;;;;;EqBXE,+BvBhDwB;AC0uG9B;;AC/qGI;;;;;EqBXE,+BvBhDwB;ACkvG9B;;AuBpvGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsvGb;;AuBrvGE;EACE,gBAAgB;AvBwvGpB;;AuBpvGI;EACE,mBxBFyB;ACyvG/B;;AuBxvGK;EAMG,mDxBPuB;AC6vG/B;;AuB5vGI;EACE,qBxBfuB;AC8wG7B;;AuBhwGK;EAMG,gDxBpBqB;ACkxG7B;;AuBpwGI;EACE,wBxBJwB;AC2wG9B;;AuBxwGK;EAMG,mDxBTsB;AC+wG9B;;AuB5wGI;EACE,qBxBXwB;AC0xG9B;;AuBhxGK;EAMG,gDxBhBsB;AC8xG9B;;AuBpxGI;EACE,qBxBG4B;ACoxGlC;;AuBxxGK;EAMG,iDxBF0B;ACwxGlC;;AuB5xGI;EACE,qBxBK4B;AC0xGlC;;AuBhyGK;EAMG,iDxBA0B;AC8xGlC;;AuBpyGI;EACE,qBxBI4B;ACmyGlC;;AuBxyGK;EAMG,kDxBD0B;ACuyGlC;;AuB5yGI;EACE,qBxBE4B;AC6yGlC;;AuBhzGK;EAMG,kDxBH0B;ACizGlC;;AuBpzGI;EACE,qBxBC4B;ACszGlC;;AuBxzGK;EAMG,mDxBJ0B;AC0zGlC;;AuB5zGI;EACE,qBxBO2B;ACwzGjC;;AuBh0GK;EAMG,kDxBEyB;AC4zGjC;;AuB5zGE;EzBmBA,kBCyBgB;EDxBhB,kBCNc;ACmzGhB;;AuB/zGE;EzBoBA,kBCVc;ACyzGhB;;AuBj0GE;EzBoBA,iBCba;AC8zGf;;AuBl0GE;EACE,cAAc;EACd,WAAW;AvBq0Gf;;AuBp0GE;EACE,eAAe;EACf,WAAW;AvBu0Gf;;AuBr0GA;EAGI,qBxB8BmB;EwB7BnB,gDAA4D;EAC5D,iDAA6D;AvBs0GjE;;AuB30GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw0GpB;;AuBt0GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw0GlB;;AuB90GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo4GzB;;AuBn1GA;EAWI,eAAe;AvB40GnB;;AuBv1GA;EAcI,YAAY;AvB60GhB;;AwB94GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi5GpB;;AwBh5GE;EACE,eAAe;AxBm5GnB;;AwBl5GE;EACE,czBF0B;ACu5G9B;;AwBp5GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy5GvB;;AwBp5GA;EvB0II,kBuBvIqC;AxBq5GzC;;AyBx6GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB26GrB;;AyB/6GA;EAMI,a3BDkB;AE86GtB;;AyBn7GA;EAUM,qB1BU4B;EE8I9B,cwBvJ+B;EAC7B,UAAU;AzB66GhB;;AyBz7GA;EAeM,qB1BsDiB;EEqFnB,iBwB1IsC;AzB86G1C;;AyB97GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+6GjB;;AyBt8GA;EAyBM,aAAa;AzBi7GnB;;AyB18GA;;EA4BM,wB1BjBwB;ACo8G9B;;AyB/8GA;ExB0JI,oBwB5HwC;AzBq7G5C;;AyBn9GA;EAgCM,YAAY;EACZ,UAAU;AzBu7GhB;;AyBx9GA;EAmCQ,kBAAkB;AzBy7G1B;;AyB59GA;EAuCM,qB1BnCwB;AC49G9B;;AyBh+GA;EA6CQ,mB1BhCuB;ACu9G/B;;AyBp+GA;EA+CQ,mB1BlCuB;AC29G/B;;AyBx+GA;EAkDU,qBfyDuB;AVi4GjC;;AyB5+GA;EAuDU,mD1B1CqB;ACm+G/B;;AyBh/GA;EA6CQ,qB1B7CqB;ACo/G7B;;AyBp/GA;EA+CQ,qB1B/CqB;ACw/G7B;;AyBx/GA;EAkDU,mBfyDuB;AVi5GjC;;AyB5/GA;EAuDU,gD1BvDmB;ACggH7B;;AyBhgHA;EA6CQ,wB1BlCsB;ACy/G9B;;AyBpgHA;EA+CQ,wB1BpCsB;AC6/G9B;;AyBxgHA;EAkDU,qBfyDuB;AVi6GjC;;AyB5gHA;EAuDU,mD1B5CoB;ACqgH9B;;AyBhhHA;EA6CQ,qB1BzCsB;ACghH9B;;AyBphHA;EA+CQ,qB1B3CsB;ACohH9B;;AyBxhHA;EAkDU,qBfyDuB;AVi7GjC;;AyB5hHA;EAuDU,gD1BnDoB;AC4hH9B;;AyBhiHA;EA6CQ,qB1B3B0B;ACkhHlC;;AyBpiHA;EA+CQ,qB1B7B0B;ACshHlC;;AyBxiHA;EAkDU,qBfyDuB;AVi8GjC;;AyB5iHA;EAuDU,iD1BrCwB;AC8hHlC;;AyBhjHA;EA6CQ,qB1BzB0B;ACgiHlC;;AyBpjHA;EA+CQ,qB1B3B0B;ACoiHlC;;AyBxjHA;EAkDU,qBfyDuB;AVi9GjC;;AyB5jHA;EAuDU,iD1BnCwB;AC4iHlC;;AyBhkHA;EA6CQ,qB1B1B0B;ACijHlC;;AyBpkHA;EA+CQ,qB1B5B0B;ACqjHlC;;AyBxkHA;EAkDU,qBfyDuB;AVi+GjC;;AyB5kHA;EAuDU,kD1BpCwB;AC6jHlC;;AyBhlHA;EA6CQ,qB1B5B0B;ACmkHlC;;AyBplHA;EA+CQ,qB1B9B0B;ACukHlC;;AyBxlHA;EAkDU,qBfyDuB;AVi/GjC;;AyB5lHA;EAuDU,kD1BtCwB;AC+kHlC;;AyBhmHA;EA6CQ,qB1B7B0B;AColHlC;;AyBpmHA;EA+CQ,qB1B/B0B;ACwlHlC;;AyBxmHA;EAkDU,qBfyDuB;AVigHjC;;AyB5mHA;EAuDU,mD1BvCwB;ACgmHlC;;AyBhnHA;EA6CQ,qB1BvByB;AC8lHjC;;AyBpnHA;EA+CQ,qB1BzByB;ACkmHjC;;AyBxnHA;EAkDU,qBfyDuB;AVihHjC;;AyB5nHA;EAuDU,kD1BjCuB;AC0mHjC;;AyBhoHA;E3ByCE,kBCyBgB;EDxBhB,kBCNc;ACimHhB;;AyBroHA;E3B4CE,kBCVc;ACumHhB;;AyBzoHA;E3B8CE,iBCba;AC4mHf;;AyB7oHA;EAkEM,qB1B5DwB;AC2oH9B;;AyBjpHA;EAoEI,WAAW;AzBilHf;;AyBrpHA;EAsEM,WAAW;AzBmlHjB;;AyBzpHA;EA0EM,aAAa;EACb,kBAAkB;ExBuFpB,cwBtF+B;EAC7B,YAAY;EACZ,eAAe;AzBmlHrB;;AyBjqHA;EAgFM,kB1B5CU;ACioHhB;;AyBrqHA;EAkFM,kB1BhDU;ACuoHhB;;AyBzqHA;EAoFM,iB1BnDS;AC4oHf;;A0BhqHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BkqHpB;;A0BvqHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC0rH7B;;A0B7qHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,c3BjCmB;ACgsH7B;;A0BnrHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACssH7B;;A0BzrHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,c3B7CmB;AC4sH7B;;A0B/rHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACqsH/B;;A0BrsHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,Y3BpBqB;AC2sH/B;;A0B3sHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACitH/B;;A0BjtHA;EA8BU,uBhBgEuB;EgB/DvB,yBAAyB;EACzB,Y3BhCqB;ACutH/B;;A0BvtHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV4pHrB;;A0B7tHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkqHrB;;A0BnuHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVwqHrB;;A0BzuHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8qHrB;;A0B/uHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVkrHhB;;A0BrvHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwrHhB;;A0B3vHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV8rHhB;;A0BjwHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVosHhB;;A0BvwHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV0sHhB;;A0B7wHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgtHhB;;A0BnxHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVstHhB;;A0BzxHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4tHhB;;A0B/xHA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVkuHhB;;A0BryHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwuHhB;;A0B3yHA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV8uHhB;;A0BjzHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVovHhB;;A0BvzHA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV0vHhB;;A0B7zHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgwHhB;;A0Bn0HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVswHhB;;A0Bz0HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4wHhB;;A0B/0HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVkxHhB;;A0Br1HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwxHhB;;A0B31HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV8xHhB;;A0Bj2HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVoyHhB;;A0Bv2HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV4yHrB;;A0B72HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkzHrB;;A0Bn3HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVwzHrB;;A0Bz3HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8zHrB;;A0B/3HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVk0HhB;;A0Br4HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVw0HhB;;A0B34HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV80HhB;;A0Bj5HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVo1HhB;;A0Bv5HA;EAmCI,kB3BZY;ACo4HhB;;A0B35HA;EAqCI,e3BfS;ACy4Hb;;A0B/5HA;EAuCI,kB3BlBY;AC84HhB;;A0Bn6HA;EA0CQ,eAAe;A1B63HvB;;A0Bv6HA;EA4CI,iB3BxBW;ACu5Hf;;A0B36HA;EA+CQ,eAAe;A1Bg4HvB;;A0B/6HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bg4HhC;;A0Bp7HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bk4H/B;;A0Bz7HA;EA0DQ,kB3BJI;ACu4HZ;;A0B77HA;EA4DQ,aAAa;A1Bq4HrB;;A0Bj8HA;EA+DM,sBAAsB;A1Bs4H5B;;A0Br8HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1Bw4HtB;;A0B38HA;EAqEM,uBAAuB;A1B04H7B;;A0B/8HA;EAuEM,aAAa;EACb,YAAY;A1B44HlB;;A0Bp9HA;EA0EQ,eAAe;A1B84HvB;;A0Bx9HA;EA6EQ,eAAe;A1B+4HvB;;A0B59HA;EAgFQ,eAAe;A1Bg5HvB;;A0Bh+HA;EAmFQ,eAAe;A1Bi5HvB;;A0Bp+HA;EAsFQ,0BAA4C;A1Bk5HpD;;A0Bx+HA;EAwFQ,0B3BlCI;E2BmCJ,uBAAuB;A1Bo5H/B;;A0B7+HA;EA2FI,uBAAuB;A1Bs5H3B;;A0Bj/HA;EA8FM,WAAW;A1Bu5HjB;;A0Br/HA;EAgGM,YAAY;EACZ,eAAe;A1By5HrB;;A0B1/HA;EAmGI,yBAAyB;A1B25H7B;;A0B9/HA;EAqGM,0BAA4C;A1B65HlD;;A0BlgIA;EAuGM,0B3BjDM;E2BkDN,2BAA2B;EAC3B,SAAS;A1B+5Hf;;A0B75HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bg6HpB;;A0Bt6HA;EASM,yBhBtB2B;EgBuB3B,c3B9HwB;AC+hI9B;;A0B36HA;EAYM,qBhBzB2B;AV47HjC;;A0B/6HA;EAeM,yBhB5B2B;EgB6B3B,c3BpIwB;ACwiI9B;;A0Bp7HA;EAkBM,qBhB/B2B;AVq8HjC;;A0Bp6HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bu6Hb;;A0Br6HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BtFU;E2BuFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bu6HrB;;A0Br6HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACokI9B;;A0Bt6HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1By6HzB;;A0Bv6HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBvBrB,mByBwBmC;EACrC,UAAU;A1B06HZ;;A0Bh7HA;EAQI,eAAe;A1B46HnB;;A2B5lIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC8jIjB;;A2BnmIA;EAMI,oBAAoB;A3BimIxB;;A2BvmIA;EASI,kB5BsBY;AC4kIhB;;A2B3mIA;EAWI,kB5BkBY;ACklIhB;;A2B/mIA;EAaI,iB5BeW;ACulIf;;A2BpmIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BumIrB;;A2B1mIA;EAOM,Y5BdyB;ACqnI/B;;A2B9mIA;EAOM,c5B3BuB;ACsoI7B;;A2BlnIA;EAOM,iB5BhBwB;AC+nI9B;;A2BtnIA;EAOM,c5BvBwB;AC0oI9B;;A2B1nIA;EAOM,c5BT4B;ACgoIlC;;A2B9nIA;EAOM,c5BP4B;ACkoIlC;;A2BloIA;EAOM,c5BR4B;ACuoIlC;;A2BtoIA;EAOM,c5BV4B;AC6oIlC;;A2B1oIA;EAOM,c5BX4B;ACkpIlC;;A2B9oIA;EAOM,c5BL2B;ACgpIjC;;A2BvoIA;EAEI,sBAAsB;A3ByoI1B;;A2B3oIA;EAKI,aAAa;EACb,2BAA2B;A3B0oI/B;;A2BhpIA;E1B2HI,kB0BlHwC;A3B2oI5C;;A2BppIA;;;EAcU,gBAAgB;A3B4oI1B;;A2B1pIA;;;EAoBY,6BAA6B;EAC7B,0BAA0B;A3B4oItC;;A2BjqIA;;;EA8BY,4BAA4B;EAC5B,yBAAyB;A3ByoIrC;;A2BxqIA;;;;;EAyCY,UAAU;A3BuoItB;;A2BhrIA;;;;;;;;;EA8CY,UAAU;A3B8oItB;;A2B5rIA;;;;;;;;;EAgDc,UAAU;A3BwpIxB;;A2BxsIA;EAkDQ,YAAY;EACZ,cAAc;A3B0pItB;;A2B7sIA;EAqDM,uBAAuB;A3B4pI7B;;A2BjtIA;EAuDM,yBAAyB;A3B8pI/B;;A2BrtIA;EA0DQ,YAAY;EACZ,cAAc;A3B+pItB;;A2B1tIA;EA6DI,aAAa;EACb,2BAA2B;A3BiqI/B;;A2B/tIA;EAgEM,cAAc;A3BmqIpB;;A2BnuIA;EAkEQ,gBAAgB;E1ByDpB,qB0BxD2C;A3BqqI/C;;A2BxuIA;EAqEQ,YAAY;EACZ,cAAc;A3BuqItB;;A2B7uIA;EAwEM,uBAAuB;A3ByqI7B;;A2BjvIA;EA0EM,yBAAyB;A3B2qI/B;;A2BrvIA;EA4EM,eAAe;A3B6qIrB;;A2BzvIA;EAgFU,sBAAsB;A3B6qIhC;;A2B7vIA;EAkFQ,uBAAuB;A3B+qI/B;;A2BjwIA;EAoFQ,gBAAgB;A3BirIxB;;ACrsIE;E0BhEF;IAuFM,aAAa;E3BmrIjB;AACF;;A2BlrIA;EAEI,kBAAkB;A3BorItB;;ACntIE;E0B6BF;IAII,qBAAqB;E3BurIvB;AACF;;ACrtIE;E0ByBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1B0Bd,oB0BzBsC;IACtC,iBAAiB;E3B2rInB;E2BrsIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B4rIxB;E2BzsIF;IAeM,oBAAoB;E3B6rIxB;E2B5sIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B8rIxB;E2BhtIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3B+rIxB;AACF;;A2B9rIA;EAEI,gBAAgB;A3BgsIpB;;AClvIE;E0BgDF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BmsIhB;E2B1sIF;IASM,gBAAgB;E3BosIpB;E2B7sIF;IAWM,cAAc;E3BqsIlB;E2BhtIF;IAaQ,YAAY;E3BssIlB;E2BntIF;I1BWI,qB0BI2C;E3BusI7C;AACF;;A2BtsIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3BysIrB;;A2B9sIA;;;EAaU,c5BxKoB;AC+2I9B;;A2BptIA;;;EAeQ,kB5B3IQ;ACs1IhB;;A2B1tIA;;;EAiBQ,kB5B/IQ;AC81IhB;;A2BhuIA;;;EAmBQ,iB5BlJO;ACq2If;;A2BtuIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BqtIhB;;A2BhvIA;;EA+BM,mB7B1LgB;AEg5ItB;;A2BrvIA;EAiCM,OAAO;A3BwtIb;;A2BzvIA;;EAqCM,oB7BhMgB;AEy5ItB;;A2B9vIA;EAuCM,QAAQ;A3B2tId;;A2BlwIA;EA2CM,6BAA6B;E1BzC/B,c0B0C+B;EAC7B,YAAY;EACZ,UAAU;A3B2tIhB;;A2BzwIA;EAgDM,kB5B5KU;ACy4IhB;;A2B7wIA;EAkDM,kB5BhLU;AC+4IhB;;A2BjxIA;EAoDM,iB5BnLS;ACo5If;;A4Bv7IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B86IrB;;A6Bl7IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B87I3C;;A6B17IA;EAYM,c9BjBwB;ACm8I9B;;A6B97IA;EAcI,mBAAmB;EACnB,aAAa;A7Bo7IjB;;A6Bn8IA;E5BiJI,e4BhIoC;A7Bs7IxC;;A6Bv8IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bu7I5B;;A6B78IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7By7IvB;;A6Bl9IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B27I/B;;A6B19IA;E5BiJI,mB4B/GuC;A7B47I3C;;A6B99IA;E5BiJI,kB4B7GuC;A7B87I3C;;A6Bl+IA;;EAyCM,uBAAuB;A7B87I7B;;A6Bv+IA;;EA6CM,yBAAyB;A7B+7I/B;;A6B5+IA;EAgDI,kB9BrBY;ACq9IhB;;A6Bh/IA;EAkDI,kB9BzBY;AC29IhB;;A6Bp/IA;EAoDI,iB9B5BW;ACg+If;;A6Bx/IA;EAwDM,iBAAiB;A7Bo8IvB;;A6B5/IA;EA2DM,iBAAiB;A7Bq8IvB;;A6BhgJA;EA8DM,iBAAiB;A7Bs8IvB;;A6BpgJA;EAiEM,iBAAiB;A7Bu8IvB;;A8B7/IA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,eAAe;EACf,kBAAkB;A9BggJpB;;A8B7/IE;EACE,+BA3BiB;EA4BjB,gCA5BiB;A9B4hJrB;;A8B//IE;EACE,kCA9BiB;EA+BjB,mCA/BiB;A9BiiJrB;;A8BhgJA;EAEE,6BAjCwC;EAkCxC,oBAAoB;EACpB,kD/BxC2B;E+ByC3B,aAAa;A9BkgJf;;A8BhgJA;EACE,mBAAmB;EACnB,c/BzC4B;E+B0C5B,aAAa;EACb,YAAY;EACZ,gB/BNe;E+BOf,qBA1CgC;A9B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;;AiCp0JA;EAgBQ,kBAlBsB;AjC00J9B;;AiCx0JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCq1JpB;;AiC90JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjCy1J5B;;AiCxzJA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC2zJhB;;AiCzzJA;EhCgHI,kBgCxJgB;AjCq2JpB;;AiC1zJA;EhC6GI,iBgCxJgB;AjCy2JpB;;AiC3zJA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC8zJrB;;ACvxJE;EgC3CF;IAQI,gBAAgB;EjC+zJlB;AACF;;AkCt2JA;EACE,enCgBW;ACy1Jb;;AkC12JA;EAII,kBnCcY;AC41JhB;;AkC92JA;EAMI,kBnCUY;ACk2JhB;;AkCl3JA;EAQI,iBnCOW;ACu2Jf;;AkC52JA;EACE,iBArB0B;AlCo4J5B;;AkCh3JA;EAGI,kBnCmCc;EmClCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC04JrC;;AkCv3JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACo5J9B;;AkC53JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV60JhB;;AkCj4JA;EjC8HI,8BFlJ0B;EmCqCxB,cAnC0B;EjCgJ5B,oBiC/IkC;AlCw5JtC;;AkCn3JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCs3J3B;;AkC13JA;EAMI,eAtCoB;AlC85JxB;;AkC93JA;EAQI,kBAxCoB;AlCk6JxB;;AmC75JA;EAEE,4BpCZ4B;EoCa5B,kBpC2CU;EoC1CV,epCUW;ACq5Jb;;AmCn6JA;EAMI,mBAAmB;AnCi6JvB;;AmCv6JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCm6J9B;;AmC56JA;EAYI,kBpCGY;ACi6JhB;;AmCh7JA;EAcI,kBpCDY;ACu6JhB;;AmCp7JA;EAgBI,iBpCJW;AC46Jf;;AmCx7JA;EAsCM,uBAH+C;AnCy5JrD;;AmC57JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACs9J7B;;AmCj8JA;EA2CQ,mBpCnDuB;AC68J/B;;AmCr8JA;EAsCM,yBAH+C;AnCs6JrD;;AmCz8JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACs9J/B;;AmC98JA;EA2CQ,qBpChEqB;ACu+J7B;;AmCl9JA;EAsCM,yBAH+C;AnCm7JrD;;AmCt9JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVk6JrB;;AmC39JA;EA2CQ,wBpCrDsB;ACy+J9B;;AmC/9JA;EAsCM,yBAH+C;AnCg8JrD;;AmCn+JA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV66JhB;;AmCx+JA;EA2CQ,qBpC5DsB;AC6/J9B;;AmC5+JA;EAsCM,yBzB4B0C;AV86JhD;;AmCh/JA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV07JhB;;AmCr/JA;EA2CQ,qBpC9C0B;EoC+C1B,czB+B6D;AV+6JrE;;AmC1/JA;EAsCM,yBzB4B0C;AV47JhD;;AmC9/JA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVw8JhB;;AmCngKA;EA2CQ,qBpC5C0B;EoC6C1B,czB+B6D;AV67JrE;;AmCxgKA;EAsCM,yBzB4B0C;AV08JhD;;AmC5gKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVs9JhB;;AmCjhKA;EA2CQ,qBpC7C0B;EoC8C1B,czB+B6D;AV28JrE;;AmCthKA;EAsCM,yBzB4B0C;AVw9JhD;;AmC1hKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVo+JhB;;AmC/hKA;EA2CQ,qBpC/C0B;EoCgD1B,czB+B6D;AVy9JrE;;AmCpiKA;EAsCM,yBzB4B0C;AVs+JhD;;AmCxiKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVo/JrB;;AmC7iKA;EA2CQ,qBpChD0B;EoCiD1B,czB+B6D;AVu+JrE;;AmCljKA;EAsCM,yBzB4B0C;AVo/JhD;;AmCtjKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AVggKhB;;AmC3jKA;EA2CQ,qBpC1CyB;EoC2CzB,czB+B6D;AVq/JrE;;AmClhKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCqhKpB;;AmC/hKA;EAYI,YAAY;EACZ,cAAc;ElC0Ed,mBkCzEsC;AnCuhK1C;;AmCriKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnCyhK9B;;AmCvhKA;EACE,qBpChF4B;EoCiF5B,kBpCtBU;EoCuBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC2mKnC;;AmChiKA;;EASI,uBpCnF2B;AC+mK/B;;AmCriKA;EAWI,6BAlFgD;AnCgnKpD;;AoChmKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC0oKZ;;AoC1mKA;EAWI,aAAa;ApCmmKjB;;AoCjmKA;EAEE,wCrC/C2B;ACkpK7B;;AoCjmKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApComKb;;ACxkKE;EmClCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpC+pKzB;AACF;;AoCtmKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCgGb,WmCxJoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCoqK7B;;AoCtmKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApCymKzB;;AoCvmKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC0mKpB;;AoCxmKA;EACE,gCrCjF4B;EqCkF5B,2BrCtBgB;EqCuBhB,4BrCvBgB;ACkoKlB;;AoCzmKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApCyrKhC;;AoC1mKA;EACE,8BrCjCgB;EqCkChB,+BrClCgB;EqCmChB,6BrC/F4B;AC4sK9B;;AoChnKA;EnCsDI,mBmChDuC;ApC8mK3C;;AoC5mKA;EnChDE,iCAAiC;EmCkDjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCqsK9B;;AqCzqKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCkuKb;;AqChrKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC6uK7B;;AqCrrKA;;EAcU,ctCtEmB;ACkvK7B;;AqC1rKA;;;;EAoBY,yB3B+BqB;E2B9BrB,ctC7EiB;AC0vK7B;;AqClsKA;EAwBY,qBtChFiB;AC8vK7B;;AqCtsKA;EA0BQ,ctClFqB;ACkwK7B;;AC/qKE;EoC3BF;;;;IAgCY,ctCxFiB;EC0wK3B;EqCltKF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,ctC/Fe;ECuxK3B;EqC/tKF;;IA0Cc,qBtClGe;EC2xK3B;EqCnuKF;;;IA8CU,yB3BKuB;I2BJvB,ctCvGmB;ECiyK3B;EqCzuKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECqyK3B;AACF;;AqC9uKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC8xK/B;;AqCnvKA;;EAcU,YtCzDqB;ACmyK/B;;AqCxvKA;;;;EAoBY,uB3B+BqB;E2B9BrB,YtChEmB;AC2yK/B;;AqChwKA;EAwBY,mBtCnEmB;AC+yK/B;;AqCpwKA;EA0BQ,YtCrEuB;ACmzK/B;;AC7uKE;EoC3BF;;;;IAgCY,YtC3EmB;EC2zK7B;EqChxKF;;;;;;;;;;IAsCc,uB3BamB;I2BZnB,YtClFiB;ECw0K7B;EqC7xKF;;IA0Cc,mBtCrFiB;EC40K7B;EqCjyKF;;;IA8CU,uB3BKuB;I2BJvB,YtC1FqB;ECk1K7B;EqCvyKF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECs1K7B;AACF;;AqC5yKA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV2xKrB;;AqCjzKA;;EAcU,yB3BQW;AVgyKrB;;AqCtzKA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AVwyKrB;;AqC9zKA;EAwBY,gC3BFS;AV4yKrB;;AqCl0KA;EA0BQ,yB3BJa;AVgzKrB;;AC3yKE;EoC3BF;;;;IAgCY,yB3BVS;EVwzKnB;EqC90KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVq0KnB;EqC31KF;;IA0Cc,gC3BpBO;EVy0KnB;EqC/1KF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EV+0KnB;EqCr2KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVm1KnB;AACF;;AqC12KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVu1KhB;;AqC/2KA;;EAcU,W3BUM;AV41KhB;;AqCp3KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVo2KhB;;AqC53KA;EAwBY,kB3BAI;AVw2KhB;;AqCh4KA;EA0BQ,W3BFQ;AV42KhB;;ACz2KE;EoC3BF;;;;IAgCY,W3BRI;EVo3Kd;EqC54KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVi4Kd;EqCz5KF;;IA0Cc,kB3BlBE;EVq4Kd;EqC75KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV24Kd;EqCn6KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EV+4Kd;AACF;;AqCx6KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVq5KhB;;AqC76KA;;EAcU,W3BUM;AV05KhB;;AqCl7KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVk6KhB;;AqC17KA;EAwBY,kB3BAI;AVs6KhB;;AqC97KA;EA0BQ,W3BFQ;AV06KhB;;ACv6KE;EoC3BF;;;;IAgCY,W3BRI;EVk7Kd;EqC18KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV+7Kd;EqCv9KF;;IA0Cc,kB3BlBE;EVm8Kd;EqC39KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVy8Kd;EqCj+KF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV68Kd;AACF;;AqCt+KA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVm9KhB;;AqC3+KA;;EAcU,W3BUM;AVw9KhB;;AqCh/KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVg+KhB;;AqCx/KA;EAwBY,kB3BAI;AVo+KhB;;AqC5/KA;EA0BQ,W3BFQ;AVw+KhB;;ACr+KE;EoC3BF;;;;IAgCY,W3BRI;EVg/Kd;EqCxgLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV6/Kd;EqCrhLF;;IA0Cc,kB3BlBE;EVigLd;EqCzhLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVugLd;EqC/hLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV2gLd;AACF;;AqCpiLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVihLhB;;AqCziLA;;EAcU,W3BUM;AVshLhB;;AqC9iLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV8hLhB;;AqCtjLA;EAwBY,kB3BAI;AVkiLhB;;AqC1jLA;EA0BQ,W3BFQ;AVsiLhB;;ACniLE;EoC3BF;;;;IAgCY,W3BRI;EV8iLd;EqCtkLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV2jLd;EqCnlLF;;IA0Cc,kB3BlBE;EV+jLd;EqCvlLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVqkLd;EqC7lLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EVykLd;AACF;;AqClmLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AV+kLhB;;AqCvmLA;;EAcU,W3BUM;AVolLhB;;AqC5mLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV4lLhB;;AqCpnLA;EAwBY,kB3BAI;AVgmLhB;;AqCxnLA;EA0BQ,W3BFQ;AVomLhB;;ACjmLE;EoC3BF;;;;IAgCY,W3BRI;EV4mLd;EqCpoLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVynLd;EqCjpLF;;IA0Cc,kB3BlBE;EV6nLd;EqCrpLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVmoLd;EqC3pLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVuoLd;AACF;;AqChqLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AV+oLrB;;AqCrqLA;;EAcU,yB3BQW;AVopLrB;;AqC1qLA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AV4pLrB;;AqClrLA;EAwBY,gC3BFS;AVgqLrB;;AqCtrLA;EA0BQ,yB3BJa;AVoqLrB;;AC/pLE;EoC3BF;;;;IAgCY,yB3BVS;EV4qLnB;EqClsLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVyrLnB;EqC/sLF;;IA0Cc,gC3BpBO;EV6rLnB;EqCntLF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EVmsLnB;EqCztLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVusLnB;AACF;;AqC9tLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV2sLhB;;AqCnuLA;;EAcU,W3BUM;AVgtLhB;;AqCxuLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVwtLhB;;AqChvLA;EAwBY,kB3BAI;AV4tLhB;;AqCpvLA;EA0BQ,W3BFQ;AVguLhB;;AC7tLE;EoC3BF;;;;IAgCY,W3BRI;EVwuLd;EqChwLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVqvLd;EqC7wLF;;IA0Cc,kB3BlBE;EVyvLd;EqCjxLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV+vLd;EqCvxLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVmwLd;AACF;;AqC5xLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC0uLf;;AqCnyLA;EA2DI,gCtCxG0B;ACo1L9B;;AqCvyLA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArC+1LnB;;AqC9yLA;EAgEI,SAAS;ArCkvLb;;AqClzLA;EAkEM,iCtC/GwB;ACm2L9B;;AqCtzLA;EAoEI,MAAM;ArCsvLV;;AqCpvLA;;EAGI,oBA9HmB;ArCo3LvB;;AqCzvLA;;EAKI,uBAhImB;ArCy3LvB;;AqCvvLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCi4LvB;;AqCxvLA;EAIM,6BAA6B;ArCwvLnC;;AqCtvLA;EpCtFE,iCAAiC;EoCwFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArCyvLpB;;AqCvvLA;EAEE,ctCrJ4B;EEoB5B,eAAe;EACf,cAAc;EACd,eoCxBqB;EpCyBrB,kBAAkB;EAClB,coC1BqB;EpCuJnB,iBoCEkC;ArC6vLtC;;AC33LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBFiCQ;EEhCR,yDAAyD;EACzD,oCF0Ba;EEzBb,WAAW;AD83Lf;;AC73LI;EACE,oBAAoB;ADg4L1B;;AC/3LI;EACE,oBAAoB;ADk4L1B;;ACj4LI;EACE,oBAAoB;ADo4L1B;;ACn4LE;EACE,qCAAiC;ADs4LrC;;ACl4LM;EACE,wCAAwC;ADq4LhD;;ACp4LM;EACE,UAAU;ADu4LlB;;ACt4LM;EACE,0CAA0C;ADy4LlD;;AqCpyLA;EACE,aAAa;ArCuyLf;;AqCryLA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArCwyLpB;;AqC9yLA;;EASM,qBAAqB;EACrB,sBAAsB;ArC0yL5B;;AqCxyLA;;EAEE,eAAe;ArC2yLjB;;AqC7yLA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;AC+8LlC;;AqC5yLA;EACE,YAAY;EACZ,cAAc;ArC+yLhB;;AqCjzLA;EAII,mBA7KgC;ArC89LpC;;AqCrzLA;EAMI,UAAU;ArCmzLd;;AqCzzLA;EAQI,YAAY;EACZ,cAAc;ArCqzLlB;;AqC9zLA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArCuzLtC;;AqCp0LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;AC4+LlC;;AqCz0LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArC0zL9E;;AqCxzLA;EACE,YAAY;EACZ,cAAc;ArC2zLhB;;AqCzzLA;EpC3DI,oBoC4DoC;ArC4zLxC;;AqC7zLA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpCxDpB,coCyD6B;ArC6zLjC;;AqC3zLA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArC8zLrB;;AqCj0LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCg0LzB;;AqC9zLA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCi0LlB;;ACp9LE;EoC/BF;IAsLI,cAAc;ErCk0LhB;EqCj0LA;;IAGI,mBAAmB;IACnB,aAAa;ErCk0LjB;EqCj0LA;IAEI,aAAa;ErCk0LjB;EqC15LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCm0LnB;EqCt0LA;IAKI,cAAc;ErCo0LlB;EqCl0LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC+jMjB;EqCx0LA;IAKI,SAAS;ErCs0Lb;EqC30LA;IAOM,4CtCrQqB;EC4kM3B;EqC90LA;IASI,MAAM;ErCw0LV;EqCj1LA;IpClMA,iCAAiC;IoCgN3B,iCAA2C;IAC3C,cAAc;ErCu0LpB;EqCt0LA;;IAGI,oBA9QiB;ErCqlMrB;EqC10LA;;IAKI,uBAhRiB;ErCylMrB;AACF;;AC1gME;EoCmMA;;;;IAIE,oBAAoB;IACpB,aAAa;ErC20Lf;EqC9iMF;IAqOI,mBA1RmB;ErCsmMrB;EqC70LA;IAGI,kBA1R0B;ErCumM9B;EqCh1LA;;IAMM,mBAAmB;ErC80LzB;EqCp1LA;;IASM,kBtClOI;ECijMV;EqCx1LA;;;;IAgBQ,wCAAwC;ErC80LhD;EqC91LA;IAuBU,wCAAwC;ErC00LlD;EqCj2LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECioM3B;EqCr2LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECinMhC;EqC7+LF;IAsKI,aAAa;ErC00Lf;EqCv+LF;;IAgKI,mBAAmB;IACnB,aAAa;ErC20Lf;EqCt9LF;IA8IM,oBAAoB;ErC20LxB;EqC70LA;IAKM,oDAAoD;ErC20L1D;EqCh1LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErC40Lf;EqCx1LA;IAkBM,cAAc;ErCy0LpB;EqCx0LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErCy0LhC;EqCrgMF;IA8LI,YAAY;IACZ,cAAc;ErC00LhB;EqCz0LA;IACE,2BAA2B;IpCrM3B,kBoCsMoC;ErC20LtC;EqC10LA;IACE,yBAAyB;IpCxMzB,iBoCyMoC;ErC40LtC;EqCl9LF;IAwII,uBtCxV2B;IsCyV3B,8BtClSc;IsCmSd,+BtCnSc;IsCoSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCzMnB,OoC0MuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErC8pMpB;EqCh+LF;IAqJM,sBAAsB;IACtB,mBAAmB;ErC80LvB;EqC71LA;IpC1ME,mBoC2NuC;ErC+0LzC;EqCh2LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;ECwsM3B;EqCp2LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;ECwrMhC;EqC/0LE;IAEE,kBtC3TY;IsC4TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtCjUM;IsCkUN,uCAAuC;ErCg1L3C;EqCp3LA;IAsCI,UAAU;IACV,QAAQ;ErCi1LZ;EqCv/LF;IAwKI,cAAc;ErCk1LhB;EqCj1LA;;IpCpPE,qBoCuPyC;ErCk1L3C;EqCr1LA;;IpCpPE,sBoCyPyC;ErCo1L3C;EqCl1LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCsuMjB;EqCx1LA;IAKI,SAAS;ErCs1Lb;EqC31LA;IAOM,4CtC5ZqB;ECmvM3B;EqC91LA;IASI,MAAM;ErCw1LV;EqCv1LA;;IAGI,oBA/ZiB;ErCuvMrB;EqC31LA;;IAKI,uBAjaiB;ErC2vMrB;EqC/1LA;;IAOI,oBAA4D;ErC41LhE;EqCn2LA;;IASI,uBAA+D;ErC81LnE;EqC51LA;;IAGI,ctC7auB;EC0wM3B;EqCh2LA;;IAKI,6BAla2C;ErCiwM/C;EqC91LA;IAKM,yBtCzasB;ECqwM5B;AACF;;AqCz1LA;EAEI,iCAA2C;ArC21L/C;;AsCnvMA;EAEE,evCFW;EuCGX,gBAnC0B;AtCwxM5B;;AsCxvMA;EAMI,kBvCLY;AC2vMhB;;AsC5vMA;EAQI,kBvCTY;ACiwMhB;;AsChwMA;EAUI,iBvCZW;ACswMf;;AsCpwMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCkBiB;ACyuMvB;;AsC3wMA;EAkBM,qBvCgBiB;AC6uMvB;;AsC3vMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtC8vMpB;;AsC5vMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtC6vMpB;;AsC3vMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AEy0MtB;;AsCnwMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACi1M9B;;AsC1wMA;;;EAUI,qBvCjE8B;ACu0MlC;;AsChxMA;;;EAYI,iDvCvFyB;ACi2M7B;;AsCtxMA;;;EAcI,yBvCjF0B;EuCkF1B,qBvClF0B;EuCmF1B,gBAAgB;EAChB,cvCtF0B;EuCuF1B,YAAY;AtC8wMhB;;AsC5wMA;;EAEE,oBAtFkC;EAuFlC,qBAtFmC;EAuFnC,mBAAmB;AtC+wMrB;;AsC7wMA;EAEI,yBvCnF8B;EuCoF9B,qBvCpF8B;EuCqF9B,W5BzBY;AVwyMhB;;AsC7wMA;EACE,cvCrG4B;EuCsG5B,oBAAoB;AtCgxMtB;;AsC9wMA;EACE,eAAe;AtCixMjB;;AsClxMA;EAGI,gBAAgB;AtCmxMpB;;AC1yME;EqCxDF;IAmFI,eAAe;EtCoxMjB;EsC3yMF;;IA0BI,YAAY;IACZ,cAAc;EtCqxMhB;EsChyMF;IAcM,YAAY;IACZ,cAAc;EtCqxMlB;AACF;;ACrzME;EqCgBF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtCuxMV;EsC91MF;;;;IA4EI,gBAAgB;IAChB,aAAa;EtCwxMf;EsCvxMA;IACE,QAAQ;EtCyxMV;EsCxxMA;IACE,QAAQ;EtC0xMV;EsCt4MF;IA8GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtC2xMf;EsC9xMA;IAMM,QAAQ;EtC2xMd;EsCjyMA;IAQM,uBAAuB;IACvB,QAAQ;EtC4xMd;EsCryMA;IAWM,QAAQ;EtC6xMd;EsCxyMA;IAcM,QAAQ;EtC6xMd;EsC3yMA;IAgBM,QAAQ;EtC8xMd;EsC9yMA;IAkBM,yBAAyB;IACzB,QAAQ;EtC+xMd;AACF;;AuCr6MA;EACE,kBxCqCgB;EwCpChB,0FxChC2B;EwCiC3B,exCEW;ACs6Mb;;AuC36MA;EAKI,qBxCWkB;AC+5MtB;;AuC/6MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;ACk9M7B;;AuCp7MA;EAeQ,0BxChCuB;ACy8M/B;;AuCx7MA;EAiBQ,YxClCuB;AC68M/B;;AuC57MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;ACk9M/B;;AuCj8MA;EAeQ,4BxC7CqB;ACm+M7B;;AuCr8MA;EAiBQ,cxC/CqB;ACu+M7B;;AuCz8MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AV85MrB;;AuC98MA;EAeQ,+BxClCsB;ACq+M9B;;AuCl9MA;EAiBQ,iBxCpCsB;ACy+M9B;;AuCt9MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVy6MhB;;AuC39MA;EAeQ,4BxCzCsB;ACy/M9B;;AuC/9MA;EAiBQ,cxC3CsB;AC6/M9B;;AuCn+MA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AVs7MhB;;AuCx+MA;EAeQ,4BxC3B0B;ACw/MlC;;AuC5+MA;EAiBQ,cxC7B0B;AC4/MlC;;AuCh/MA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AVm8MhB;;AuCr/MA;EAeQ,4BxCzB0B;ACmgNlC;;AuCz/MA;EAiBQ,cxC3B0B;ACugNlC;;AuC7/MA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVg9MhB;;AuClgNA;EAeQ,4BxC1B0B;ACihNlC;;AuCtgNA;EAiBQ,cxC5B0B;ACqhNlC;;AuC1gNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AV69MhB;;AuC/gNA;EAeQ,4BxC5B0B;ACgiNlC;;AuCnhNA;EAiBQ,cxC9B0B;ACoiNlC;;AuCvhNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AV4+MrB;;AuC5hNA;EAeQ,4BxC7B0B;AC8iNlC;;AuChiNA;EAiBQ,cxC/B0B;ACkjNlC;;AuCpiNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AVu/MhB;;AuCziNA;EAeQ,4BxCvByB;ACqjNjC;;AuC7iNA;EAiBQ,cxCzByB;ACyjNjC;;AuC9hNA;;EAGI,gCxC3C2B;AC2kN/B;;AuC9hNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvCslNlC;;AuC/hNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvCkiNzB;;AuCtiNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvCoiNlB;;AuC5iNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;AC4mN9B;;AuCniNA;EAEI,cxC1E0B;AC+mN9B;;AuCviNA;EAIM,cxC7D4B;AComNlC;;AuCriNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCwiNvB;;AuC7iNA;EtCuEI,oBsChEsC;AvC0iN1C;;AuCjjNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvC4iNf;;AuCvjNA;EAaI,eAAe;AvC8iNnB;;AuC3jNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;AC+oN9B;;AuChkNA;EAkBM,cxCjF4B;ACmoNlC;;AuCpkNA;EAoBI,8BxCnCc;EwCoCd,+BxCpCc;ACwlNlB;;AuCljNA;;EAEE,eAAe;AvCqjNjB;;AuCvjNA;;EAII,4BxCnG0B;AC2pN9B;;AuCtjNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EEoJ1B,oBsCvCoC;AvC+jNxC;;AuClkNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCikNxB;;AwC3pNA;EvCgCE,iCAAiC;EuC5BjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxC4pNrB;;AwCtqNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxC8pNvB;;AwCnrNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACgtN9B;;AwCxrNA;EA0BI,cAAc;AxCkqNlB;;AwC5rNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACysNlC;;AwCjsNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxCqqN/B;;AwC5sNA;EAyCM,qBAAqB;AxCuqN3B;;AwChtNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCyqN3B;;AwCvtNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxC2qN1B;;AwC5tNA;EvC8HI,mBuC1EuC;AxC4qN3C;;AwChuNA;EvC8HI,kBuCxEuC;AxC8qN3C;;AwCpuNA;EA0DM,uBAAuB;AxC8qN7B;;AwCxuNA;EA6DM,yBAAyB;AxC+qN/B;;AwC5uNA;EAiEM,6BAA6B;EAE3B,0BAAkE;AxC8qN1E;;AwCjvNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;AC0wN9B;;AwCtvNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxC8qNrF;;AwC5vNA;EAiFM,YAAY;EACZ,cAAc;AxC+qNpB;;AwCjwNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCgrNxB;;AwCzwNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxCkrNlB;;AwC/wNA;EvC8HI,iBuC9BuE;AxCmrN3E;;AwCnxNA;EAmGU,2BzC5DE;EyC6DF,8BzC7DE;ACivNZ;;AwCxxNA;EA0GU,4BzCnEE;EyCoEF,+BzCpEE;ACsvNZ;;AwC7xNA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCgrNpB;;AwCpyNA;EAsHM,mBAAmB;AxCkrNzB;;AwCxyNA;EA2HY,iCzClFW;EyCmFX,8BzCnFW;EyCoFX,oBAAoB;AxCirNhC;;AwC9yNA;EAoIY,kCzC3FW;EyC4FX,+BzC5FW;EyC6FX,qBAAqB;AxC8qNjC;;AwCpzNA;EA6II,kBzCrIY;ACgzNhB;;AwCxzNA;EA+II,kBzCzIY;ACszNhB;;AwC5zNA;EAiJI,iBzC5IW;AC2zNf;;AyC91NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1Cq2NpB;;A0C71NE;EACE,UAAU;EACV,YAAY;A1Cg2NhB;;A0C/1NE;EACE,UAAU;EACV,WAAW;A1Ck2Nf;;A0Cj2NE;EACE,UAAU;EACV,UAAU;A1Co2Nd;;A0Cn2NE;EACE,UAAU;EACV,eAAe;A1Cs2NnB;;A0Cr2NE;EACE,UAAU;EACV,UAAU;A1Cw2Nd;;A0Cv2NE;EACE,UAAU;EACV,eAAe;A1C02NnB;;A0Cz2NE;EACE,UAAU;EACV,UAAU;A1C42Nd;;A0C32NE;EACE,UAAU;EACV,UAAU;A1C82Nd;;A0C72NE;EACE,UAAU;EACV,UAAU;A1Cg3Nd;;A0C/2NE;EACE,UAAU;EACV,UAAU;A1Ck3Nd;;A0Cj3NE;EACE,UAAU;EACV,UAAU;A1Co3Nd;;A0Cn3NE;EzCiHE,gByChHmC;A1Cs3NvC;;A0Cr3NE;EzC+GE,qByC9GwC;A1Cw3N5C;;A0Cv3NE;EzC6GE,gByC5GmC;A1C03NvC;;A0Cz3NE;EzC2GE,qByC1GwC;A1C43N5C;;A0C33NE;EzCyGE,gByCxGmC;A1C83NvC;;A0C73NE;EzCuGE,gByCtGmC;A1Cg4NvC;;A0C/3NE;EzCqGE,gByCpGmC;A1Ck4NvC;;A0Cj4NE;EzCmGE,gByClGmC;A1Co4NvC;;A0Cn4NE;EzCiGE,gByChGmC;A1Cs4NvC;;A0Cp4NI;EACE,UAAU;EACV,SAAiC;A1Cu4NvC;;A0Ct4NI;EzC2FA,eyC1F4D;A1Cy4NhE;;A0C74NI;EACE,UAAU;EACV,eAAiC;A1Cg5NvC;;A0C/4NI;EzC2FA,qByC1F4D;A1Ck5NhE;;A0Ct5NI;EACE,UAAU;EACV,gBAAiC;A1Cy5NvC;;A0Cx5NI;EzC2FA,sByC1F4D;A1C25NhE;;A0C/5NI;EACE,UAAU;EACV,UAAiC;A1Ck6NvC;;A0Cj6NI;EzC2FA,gByC1F4D;A1Co6NhE;;A0Cx6NI;EACE,UAAU;EACV,gBAAiC;A1C26NvC;;A0C16NI;EzC2FA,sByC1F4D;A1C66NhE;;A0Cj7NI;EACE,UAAU;EACV,gBAAiC;A1Co7NvC;;A0Cn7NI;EzC2FA,sByC1F4D;A1Cs7NhE;;A0C17NI;EACE,UAAU;EACV,UAAiC;A1C67NvC;;A0C57NI;EzC2FA,gByC1F4D;A1C+7NhE;;A0Cn8NI;EACE,UAAU;EACV,gBAAiC;A1Cs8NvC;;A0Cr8NI;EzC2FA,sByC1F4D;A1Cw8NhE;;A0C58NI;EACE,UAAU;EACV,gBAAiC;A1C+8NvC;;A0C98NI;EzC2FA,sByC1F4D;A1Ci9NhE;;A0Cr9NI;EACE,UAAU;EACV,UAAiC;A1Cw9NvC;;A0Cv9NI;EzC2FA,gByC1F4D;A1C09NhE;;A0C99NI;EACE,UAAU;EACV,gBAAiC;A1Ci+NvC;;A0Ch+NI;EzC2FA,sByC1F4D;A1Cm+NhE;;A0Cv+NI;EACE,UAAU;EACV,gBAAiC;A1C0+NvC;;A0Cz+NI;EzC2FA,sByC1F4D;A1C4+NhE;;A0Ch/NI;EACE,UAAU;EACV,WAAiC;A1Cm/NvC;;A0Cl/NI;EzC2FA,iByC1F4D;A1Cq/NhE;;AC19NE;EyCzFF;IAiEM,UAAU;IACV,YAAY;E1Cu/NhB;E0CzjOF;IAoEM,UAAU;IACV,WAAW;E1Cw/Nf;E0C7jOF;IAuEM,UAAU;IACV,UAAU;E1Cy/Nd;E0CjkOF;IA0EM,UAAU;IACV,eAAe;E1C0/NnB;E0CrkOF;IA6EM,UAAU;IACV,UAAU;E1C2/Nd;E0CzkOF;IAgFM,UAAU;IACV,eAAe;E1C4/NnB;E0C7kOF;IAmFM,UAAU;IACV,UAAU;E1C6/Nd;E0CjlOF;IAsFM,UAAU;IACV,UAAU;E1C8/Nd;E0CrlOF;IAyFM,UAAU;IACV,UAAU;E1C+/Nd;E0CzlOF;IA4FM,UAAU;IACV,UAAU;E1CggOd;E0C7lOF;IA+FM,UAAU;IACV,UAAU;E1CigOd;E0CjmOF;IzCwJI,gByCtDqC;E1CkgOvC;E0CpmOF;IzCwJI,qByCpD0C;E1CmgO5C;E0CvmOF;IzCwJI,gByClDqC;E1CogOvC;E0C1mOF;IzCwJI,qByChD0C;E1CqgO5C;E0C7mOF;IzCwJI,gByC9CqC;E1CsgOvC;E0ChnOF;IzCwJI,gByC5CqC;E1CugOvC;E0CnnOF;IzCwJI,gByC1CqC;E1CwgOvC;E0CtnOF;IzCwJI,gByCxCqC;E1CygOvC;E0CznOF;IzCwJI,gByCtCqC;E1C0gOvC;E0C5nOF;IAqHQ,UAAU;IACV,SAAiC;E1C0gOvC;E0ChoOF;IzCwJI,eyChC8D;E1C2gOhE;E0CnoOF;IAqHQ,UAAU;IACV,eAAiC;E1CihOvC;E0CvoOF;IzCwJI,qByChC8D;E1CkhOhE;E0C1oOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwhOvC;E0C9oOF;IzCwJI,sByChC8D;E1CyhOhE;E0CjpOF;IAqHQ,UAAU;IACV,UAAiC;E1C+hOvC;E0CrpOF;IzCwJI,gByChC8D;E1CgiOhE;E0CxpOF;IAqHQ,UAAU;IACV,gBAAiC;E1CsiOvC;E0C5pOF;IzCwJI,sByChC8D;E1CuiOhE;E0C/pOF;IAqHQ,UAAU;IACV,gBAAiC;E1C6iOvC;E0CnqOF;IzCwJI,sByChC8D;E1C8iOhE;E0CtqOF;IAqHQ,UAAU;IACV,UAAiC;E1CojOvC;E0C1qOF;IzCwJI,gByChC8D;E1CqjOhE;E0C7qOF;IAqHQ,UAAU;IACV,gBAAiC;E1C2jOvC;E0CjrOF;IzCwJI,sByChC8D;E1C4jOhE;E0CprOF;IAqHQ,UAAU;IACV,gBAAiC;E1CkkOvC;E0CxrOF;IzCwJI,sByChC8D;E1CmkOhE;E0C3rOF;IAqHQ,UAAU;IACV,UAAiC;E1CykOvC;E0C/rOF;IzCwJI,gByChC8D;E1C0kOhE;E0ClsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CglOvC;E0CtsOF;IzCwJI,sByChC8D;E1CilOhE;E0CzsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CulOvC;E0C7sOF;IzCwJI,sByChC8D;E1CwlOhE;E0ChtOF;IAqHQ,UAAU;IACV,WAAiC;E1C8lOvC;E0CptOF;IzCwJI,iByChC8D;E1C+lOhE;AACF;;AC3nOE;EyC7FF;IA4HM,UAAU;IACV,YAAY;E1CimOhB;E0C9tOF;IAgIM,UAAU;IACV,WAAW;E1CimOf;E0CluOF;IAoIM,UAAU;IACV,UAAU;E1CimOd;E0CtuOF;IAwIM,UAAU;IACV,eAAe;E1CimOnB;E0C1uOF;IA4IM,UAAU;IACV,UAAU;E1CimOd;E0C9uOF;IAgJM,UAAU;IACV,eAAe;E1CimOnB;E0ClvOF;IAoJM,UAAU;IACV,UAAU;E1CimOd;E0CtvOF;IAwJM,UAAU;IACV,UAAU;E1CimOd;E0C1vOF;IA4JM,UAAU;IACV,UAAU;E1CimOd;E0C9vOF;IAgKM,UAAU;IACV,UAAU;E1CimOd;E0ClwOF;IAoKM,UAAU;IACV,UAAU;E1CimOd;E0CtwOF;IzCwJI,gByCgBqC;E1CimOvC;E0CzwOF;IzCwJI,qByCmB0C;E1CimO5C;E0C5wOF;IzCwJI,gByCsBqC;E1CimOvC;E0C/wOF;IzCwJI,qByCyB0C;E1CimO5C;E0ClxOF;IzCwJI,gByC4BqC;E1CimOvC;E0CrxOF;IzCwJI,gByC+BqC;E1CimOvC;E0CxxOF;IzCwJI,gByCkCqC;E1CimOvC;E0C3xOF;IzCwJI,gByCqCqC;E1CimOvC;E0C9xOF;IzCwJI,gByCwCqC;E1CimOvC;E0CjyOF;IAoMQ,UAAU;IACV,SAAiC;E1CgmOvC;E0CryOF;IzCwJI,eyCgD8D;E1CgmOhE;E0CxyOF;IAoMQ,UAAU;IACV,eAAiC;E1CumOvC;E0C5yOF;IzCwJI,qByCgD8D;E1CumOhE;E0C/yOF;IAoMQ,UAAU;IACV,gBAAiC;E1C8mOvC;E0CnzOF;IzCwJI,sByCgD8D;E1C8mOhE;E0CtzOF;IAoMQ,UAAU;IACV,UAAiC;E1CqnOvC;E0C1zOF;IzCwJI,gByCgD8D;E1CqnOhE;E0C7zOF;IAoMQ,UAAU;IACV,gBAAiC;E1C4nOvC;E0Cj0OF;IzCwJI,sByCgD8D;E1C4nOhE;E0Cp0OF;IAoMQ,UAAU;IACV,gBAAiC;E1CmoOvC;E0Cx0OF;IzCwJI,sByCgD8D;E1CmoOhE;E0C30OF;IAoMQ,UAAU;IACV,UAAiC;E1C0oOvC;E0C/0OF;IzCwJI,gByCgD8D;E1C0oOhE;E0Cl1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CipOvC;E0Ct1OF;IzCwJI,sByCgD8D;E1CipOhE;E0Cz1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CwpOvC;E0C71OF;IzCwJI,sByCgD8D;E1CwpOhE;E0Ch2OF;IAoMQ,UAAU;IACV,UAAiC;E1C+pOvC;E0Cp2OF;IzCwJI,gByCgD8D;E1C+pOhE;E0Cv2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CsqOvC;E0C32OF;IzCwJI,sByCgD8D;E1CsqOhE;E0C92OF;IAoMQ,UAAU;IACV,gBAAiC;E1C6qOvC;E0Cl3OF;IzCwJI,sByCgD8D;E1C6qOhE;E0Cr3OF;IAoMQ,UAAU;IACV,WAAiC;E1CorOvC;E0Cz3OF;IzCwJI,iByCgD8D;E1CorOhE;AACF;;ACxxOE;EyCrGF;IA2MM,UAAU;IACV,YAAY;E1CurOhB;E0Cn4OF;IA8MM,UAAU;IACV,WAAW;E1CwrOf;E0Cv4OF;IAiNM,UAAU;IACV,UAAU;E1CyrOd;E0C34OF;IAoNM,UAAU;IACV,eAAe;E1C0rOnB;E0C/4OF;IAuNM,UAAU;IACV,UAAU;E1C2rOd;E0Cn5OF;IA0NM,UAAU;IACV,eAAe;E1C4rOnB;E0Cv5OF;IA6NM,UAAU;IACV,UAAU;E1C6rOd;E0C35OF;IAgOM,UAAU;IACV,UAAU;E1C8rOd;E0C/5OF;IAmOM,UAAU;IACV,UAAU;E1C+rOd;E0Cn6OF;IAsOM,UAAU;IACV,UAAU;E1CgsOd;E0Cv6OF;IAyOM,UAAU;IACV,UAAU;E1CisOd;E0C36OF;IzCwJI,gByCoFqC;E1CksOvC;E0C96OF;IzCwJI,qByCsF0C;E1CmsO5C;E0Cj7OF;IzCwJI,gByCwFqC;E1CosOvC;E0Cp7OF;IzCwJI,qByC0F0C;E1CqsO5C;E0Cv7OF;IzCwJI,gByC4FqC;E1CssOvC;E0C17OF;IzCwJI,gByC8FqC;E1CusOvC;E0C77OF;IzCwJI,gByCgGqC;E1CwsOvC;E0Ch8OF;IzCwJI,gByCkGqC;E1CysOvC;E0Cn8OF;IzCwJI,gByCoGqC;E1C0sOvC;E0Ct8OF;IA+PQ,UAAU;IACV,SAAiC;E1C0sOvC;E0C18OF;IzCwJI,eyC0G8D;E1C2sOhE;E0C78OF;IA+PQ,UAAU;IACV,eAAiC;E1CitOvC;E0Cj9OF;IzCwJI,qByC0G8D;E1CktOhE;E0Cp9OF;IA+PQ,UAAU;IACV,gBAAiC;E1CwtOvC;E0Cx9OF;IzCwJI,sByC0G8D;E1CytOhE;E0C39OF;IA+PQ,UAAU;IACV,UAAiC;E1C+tOvC;E0C/9OF;IzCwJI,gByC0G8D;E1CguOhE;E0Cl+OF;IA+PQ,UAAU;IACV,gBAAiC;E1CsuOvC;E0Ct+OF;IzCwJI,sByC0G8D;E1CuuOhE;E0Cz+OF;IA+PQ,UAAU;IACV,gBAAiC;E1C6uOvC;E0C7+OF;IzCwJI,sByC0G8D;E1C8uOhE;E0Ch/OF;IA+PQ,UAAU;IACV,UAAiC;E1CovOvC;E0Cp/OF;IzCwJI,gByC0G8D;E1CqvOhE;E0Cv/OF;IA+PQ,UAAU;IACV,gBAAiC;E1C2vOvC;E0C3/OF;IzCwJI,sByC0G8D;E1C4vOhE;E0C9/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CkwOvC;E0ClgPF;IzCwJI,sByC0G8D;E1CmwOhE;E0CrgPF;IA+PQ,UAAU;IACV,UAAiC;E1CywOvC;E0CzgPF;IzCwJI,gByC0G8D;E1C0wOhE;E0C5gPF;IA+PQ,UAAU;IACV,gBAAiC;E1CgxOvC;E0ChhPF;IzCwJI,sByC0G8D;E1CixOhE;E0CnhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CuxOvC;E0CvhPF;IzCwJI,sByC0G8D;E1CwxOhE;E0C1hPF;IA+PQ,UAAU;IACV,WAAiC;E1C8xOvC;E0C9hPF;IzCwJI,iByC0G8D;E1C+xOhE;AACF;;ACz7OE;EyCzGF;IAqQM,UAAU;IACV,YAAY;E1CkyOhB;E0CxiPF;IAwQM,UAAU;IACV,WAAW;E1CmyOf;E0C5iPF;IA2QM,UAAU;IACV,UAAU;E1CoyOd;E0ChjPF;IA8QM,UAAU;IACV,eAAe;E1CqyOnB;E0CpjPF;IAiRM,UAAU;IACV,UAAU;E1CsyOd;E0CxjPF;IAoRM,UAAU;IACV,eAAe;E1CuyOnB;E0C5jPF;IAuRM,UAAU;IACV,UAAU;E1CwyOd;E0ChkPF;IA0RM,UAAU;IACV,UAAU;E1CyyOd;E0CpkPF;IA6RM,UAAU;IACV,UAAU;E1C0yOd;E0CxkPF;IAgSM,UAAU;IACV,UAAU;E1C2yOd;E0C5kPF;IAmSM,UAAU;IACV,UAAU;E1C4yOd;E0ChlPF;IzCwJI,gByC8IqC;E1C6yOvC;E0CnlPF;IzCwJI,qByCgJ0C;E1C8yO5C;E0CtlPF;IzCwJI,gByCkJqC;E1C+yOvC;E0CzlPF;IzCwJI,qByCoJ0C;E1CgzO5C;E0C5lPF;IzCwJI,gByCsJqC;E1CizOvC;E0C/lPF;IzCwJI,gByCwJqC;E1CkzOvC;E0ClmPF;IzCwJI,gByC0JqC;E1CmzOvC;E0CrmPF;IzCwJI,gByC4JqC;E1CozOvC;E0CxmPF;IzCwJI,gByC8JqC;E1CqzOvC;E0C3mPF;IAyTQ,UAAU;IACV,SAAiC;E1CqzOvC;E0C/mPF;IzCwJI,eyCoK8D;E1CszOhE;E0ClnPF;IAyTQ,UAAU;IACV,eAAiC;E1C4zOvC;E0CtnPF;IzCwJI,qByCoK8D;E1C6zOhE;E0CznPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm0OvC;E0C7nPF;IzCwJI,sByCoK8D;E1Co0OhE;E0ChoPF;IAyTQ,UAAU;IACV,UAAiC;E1C00OvC;E0CpoPF;IzCwJI,gByCoK8D;E1C20OhE;E0CvoPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ci1OvC;E0C3oPF;IzCwJI,sByCoK8D;E1Ck1OhE;E0C9oPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cw1OvC;E0ClpPF;IzCwJI,sByCoK8D;E1Cy1OhE;E0CrpPF;IAyTQ,UAAU;IACV,UAAiC;E1C+1OvC;E0CzpPF;IzCwJI,gByCoK8D;E1Cg2OhE;E0C5pPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cs2OvC;E0ChqPF;IzCwJI,sByCoK8D;E1Cu2OhE;E0CnqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C62OvC;E0CvqPF;IzCwJI,sByCoK8D;E1C82OhE;E0C1qPF;IAyTQ,UAAU;IACV,UAAiC;E1Co3OvC;E0C9qPF;IzCwJI,gByCoK8D;E1Cq3OhE;E0CjrPF;IAyTQ,UAAU;IACV,gBAAiC;E1C23OvC;E0CrrPF;IzCwJI,sByCoK8D;E1C43OhE;E0CxrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ck4OvC;E0C5rPF;IzCwJI,sByCoK8D;E1Cm4OhE;E0C/rPF;IAyTQ,UAAU;IACV,WAAiC;E1Cy4OvC;E0CnsPF;IzCwJI,iByCoK8D;E1C04OhE;AACF;;AC/kPI;EyCxHJ;IA+TM,UAAU;IACV,YAAY;E1C64OhB;E0C7sPF;IAkUM,UAAU;IACV,WAAW;E1C84Of;E0CjtPF;IAqUM,UAAU;IACV,UAAU;E1C+4Od;E0CrtPF;IAwUM,UAAU;IACV,eAAe;E1Cg5OnB;E0CztPF;IA2UM,UAAU;IACV,UAAU;E1Ci5Od;E0C7tPF;IA8UM,UAAU;IACV,eAAe;E1Ck5OnB;E0CjuPF;IAiVM,UAAU;IACV,UAAU;E1Cm5Od;E0CruPF;IAoVM,UAAU;IACV,UAAU;E1Co5Od;E0CzuPF;IAuVM,UAAU;IACV,UAAU;E1Cq5Od;E0C7uPF;IA0VM,UAAU;IACV,UAAU;E1Cs5Od;E0CjvPF;IA6VM,UAAU;IACV,UAAU;E1Cu5Od;E0CrvPF;IzCwJI,gByCwMqC;E1Cw5OvC;E0CxvPF;IzCwJI,qByC0M0C;E1Cy5O5C;E0C3vPF;IzCwJI,gByC4MqC;E1C05OvC;E0C9vPF;IzCwJI,qByC8M0C;E1C25O5C;E0CjwPF;IzCwJI,gByCgNqC;E1C45OvC;E0CpwPF;IzCwJI,gByCkNqC;E1C65OvC;E0CvwPF;IzCwJI,gByCoNqC;E1C85OvC;E0C1wPF;IzCwJI,gByCsNqC;E1C+5OvC;E0C7wPF;IzCwJI,gByCwNqC;E1Cg6OvC;E0ChxPF;IAmXQ,UAAU;IACV,SAAiC;E1Cg6OvC;E0CpxPF;IzCwJI,eyC8N8D;E1Ci6OhE;E0CvxPF;IAmXQ,UAAU;IACV,eAAiC;E1Cu6OvC;E0C3xPF;IzCwJI,qByC8N8D;E1Cw6OhE;E0C9xPF;IAmXQ,UAAU;IACV,gBAAiC;E1C86OvC;E0ClyPF;IzCwJI,sByC8N8D;E1C+6OhE;E0CryPF;IAmXQ,UAAU;IACV,UAAiC;E1Cq7OvC;E0CzyPF;IzCwJI,gByC8N8D;E1Cs7OhE;E0C5yPF;IAmXQ,UAAU;IACV,gBAAiC;E1C47OvC;E0ChzPF;IzCwJI,sByC8N8D;E1C67OhE;E0CnzPF;IAmXQ,UAAU;IACV,gBAAiC;E1Cm8OvC;E0CvzPF;IzCwJI,sByC8N8D;E1Co8OhE;E0C1zPF;IAmXQ,UAAU;IACV,UAAiC;E1C08OvC;E0C9zPF;IzCwJI,gByC8N8D;E1C28OhE;E0Cj0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Ci9OvC;E0Cr0PF;IzCwJI,sByC8N8D;E1Ck9OhE;E0Cx0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cw9OvC;E0C50PF;IzCwJI,sByC8N8D;E1Cy9OhE;E0C/0PF;IAmXQ,UAAU;IACV,UAAiC;E1C+9OvC;E0Cn1PF;IzCwJI,gByC8N8D;E1Cg+OhE;E0Ct1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs+OvC;E0C11PF;IzCwJI,sByC8N8D;E1Cu+OhE;E0C71PF;IAmXQ,UAAU;IACV,gBAAiC;E1C6+OvC;E0Cj2PF;IzCwJI,sByC8N8D;E1C8+OhE;E0Cp2PF;IAmXQ,UAAU;IACV,WAAiC;E1Co/OvC;E0Cx2PF;IzCwJI,iByC8N8D;E1Cq/OhE;AACF;;ACruPI;EyCvIJ;IAyXM,UAAU;IACV,YAAY;E1Cw/OhB;E0Cl3PF;IA4XM,UAAU;IACV,WAAW;E1Cy/Of;E0Ct3PF;IA+XM,UAAU;IACV,UAAU;E1C0/Od;E0C13PF;IAkYM,UAAU;IACV,eAAe;E1C2/OnB;E0C93PF;IAqYM,UAAU;IACV,UAAU;E1C4/Od;E0Cl4PF;IAwYM,UAAU;IACV,eAAe;E1C6/OnB;E0Ct4PF;IA2YM,UAAU;IACV,UAAU;E1C8/Od;E0C14PF;IA8YM,UAAU;IACV,UAAU;E1C+/Od;E0C94PF;IAiZM,UAAU;IACV,UAAU;E1CggPd;E0Cl5PF;IAoZM,UAAU;IACV,UAAU;E1CigPd;E0Ct5PF;IAuZM,UAAU;IACV,UAAU;E1CkgPd;E0C15PF;IzCwJI,gByCkQqC;E1CmgPvC;E0C75PF;IzCwJI,qByCoQ0C;E1CogP5C;E0Ch6PF;IzCwJI,gByCsQqC;E1CqgPvC;E0Cn6PF;IzCwJI,qByCwQ0C;E1CsgP5C;E0Ct6PF;IzCwJI,gByC0QqC;E1CugPvC;E0Cz6PF;IzCwJI,gByC4QqC;E1CwgPvC;E0C56PF;IzCwJI,gByC8QqC;E1CygPvC;E0C/6PF;IzCwJI,gByCgRqC;E1C0gPvC;E0Cl7PF;IzCwJI,gByCkRqC;E1C2gPvC;E0Cr7PF;IA6aQ,UAAU;IACV,SAAiC;E1C2gPvC;E0Cz7PF;IzCwJI,eyCwR8D;E1C4gPhE;E0C57PF;IA6aQ,UAAU;IACV,eAAiC;E1CkhPvC;E0Ch8PF;IzCwJI,qByCwR8D;E1CmhPhE;E0Cn8PF;IA6aQ,UAAU;IACV,gBAAiC;E1CyhPvC;E0Cv8PF;IzCwJI,sByCwR8D;E1C0hPhE;E0C18PF;IA6aQ,UAAU;IACV,UAAiC;E1CgiPvC;E0C98PF;IzCwJI,gByCwR8D;E1CiiPhE;E0Cj9PF;IA6aQ,UAAU;IACV,gBAAiC;E1CuiPvC;E0Cr9PF;IzCwJI,sByCwR8D;E1CwiPhE;E0Cx9PF;IA6aQ,UAAU;IACV,gBAAiC;E1C8iPvC;E0C59PF;IzCwJI,sByCwR8D;E1C+iPhE;E0C/9PF;IA6aQ,UAAU;IACV,UAAiC;E1CqjPvC;E0Cn+PF;IzCwJI,gByCwR8D;E1CsjPhE;E0Ct+PF;IA6aQ,UAAU;IACV,gBAAiC;E1C4jPvC;E0C1+PF;IzCwJI,sByCwR8D;E1C6jPhE;E0C7+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CmkPvC;E0Cj/PF;IzCwJI,sByCwR8D;E1CokPhE;E0Cp/PF;IA6aQ,UAAU;IACV,UAAiC;E1C0kPvC;E0Cx/PF;IzCwJI,gByCwR8D;E1C2kPhE;E0C3/PF;IA6aQ,UAAU;IACV,gBAAiC;E1CilPvC;E0C//PF;IzCwJI,sByCwR8D;E1CklPhE;E0ClgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CwlPvC;E0CtgQF;IzCwJI,sByCwR8D;E1CylPhE;E0CzgQF;IA6aQ,UAAU;IACV,WAAiC;E1C+lPvC;E0C7gQF;IzCwJI,iByCwR8D;E1CgmPhE;AACF;;A0C/lPA;EzC1RI,qByC1JgB;EzC0JhB,sByC1JgB;EAublB,oBAvbkB;A1CyhQpB;;A0CrmPA;EAKI,uBAzbgB;A1C6hQpB;;A0CzmPA;EAOI,qCAA4C;A1CsmPhD;;A0C7mPA;EAUI,uBAAuB;A1CumP3B;;A0CjnPA;EzC1RI,cyCsSiC;EzCtSjC,eyCuSiC;EACjC,aAAa;A1CymPjB;;A0CvnPA;EAgBM,SAAS;EACT,qBAAqB;A1C2mP3B;;A0C5nPA;EAmBM,qBAAqB;A1C6mP3B;;A0ChoPA;EAqBM,gBAAgB;A1C+mPtB;;A0CpoPA;EAuBI,aAAa;A1CinPjB;;A0CxoPA;EAyBI,eAAe;A1CmnPnB;;A0C5oPA;EA2BI,mBAAmB;A1CqnPvB;;ACr+PE;EyCqVF;IA+BM,aAAa;E1CsnPjB;AACF;;AC/9PE;EyCyUF;IAmCM,aAAa;E1CwnPjB;AACF;;A0CtnPE;EACE,oBAAY;EzCjUZ,wCyCkU2D;EzClU3D,yCyCmU2D;A1CynP/D;;A0C5nPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1C2nPrC;;A0CjoPE;EASM,iBAAY;A1C4nPpB;;ACpgQE;EyC+XA;IAYQ,iBAAY;E1C8nPpB;AACF;;ACtgQE;EyC2XA;IAeQ,iBAAY;E1CioPpB;AACF;;ACxgQE;EyCuXA;IAkBQ,iBAAY;E1CooPpB;AACF;;AC1gQE;EyCmXA;IAqBQ,iBAAY;E1CuoPpB;AACF;;AC5gQE;EyC+WA;IAwBQ,iBAAY;E1C0oPpB;AACF;;AC7gQI;EyC0WF;IA2BQ,iBAAY;E1C6oPpB;AACF;;ACzgQI;EyCgWF;IA8BQ,iBAAY;E1CgpPpB;AACF;;AC1gQI;EyC2VF;IAiCQ,iBAAY;E1CmpPpB;AACF;;ACtgQI;EyCiVF;IAoCQ,iBAAY;E1CspPpB;AACF;;A0C3rPE;EASM,oBAAY;A1CsrPpB;;AC9jQE;EyC+XA;IAYQ,oBAAY;E1CwrPpB;AACF;;AChkQE;EyC2XA;IAeQ,oBAAY;E1C2rPpB;AACF;;AClkQE;EyCuXA;IAkBQ,oBAAY;E1C8rPpB;AACF;;ACpkQE;EyCmXA;IAqBQ,oBAAY;E1CisPpB;AACF;;ACtkQE;EyC+WA;IAwBQ,oBAAY;E1CosPpB;AACF;;ACvkQI;EyC0WF;IA2BQ,oBAAY;E1CusPpB;AACF;;ACnkQI;EyCgWF;IA8BQ,oBAAY;E1C0sPpB;AACF;;ACpkQI;EyC2VF;IAiCQ,oBAAY;E1C6sPpB;AACF;;AChkQI;EyCiVF;IAoCQ,oBAAY;E1CgtPpB;AACF;;A0CrvPE;EASM,mBAAY;A1CgvPpB;;ACxnQE;EyC+XA;IAYQ,mBAAY;E1CkvPpB;AACF;;AC1nQE;EyC2XA;IAeQ,mBAAY;E1CqvPpB;AACF;;AC5nQE;EyCuXA;IAkBQ,mBAAY;E1CwvPpB;AACF;;AC9nQE;EyCmXA;IAqBQ,mBAAY;E1C2vPpB;AACF;;AChoQE;EyC+WA;IAwBQ,mBAAY;E1C8vPpB;AACF;;ACjoQI;EyC0WF;IA2BQ,mBAAY;E1CiwPpB;AACF;;AC7nQI;EyCgWF;IA8BQ,mBAAY;E1CowPpB;AACF;;AC9nQI;EyC2VF;IAiCQ,mBAAY;E1CuwPpB;AACF;;AC1nQI;EyCiVF;IAoCQ,mBAAY;E1C0wPpB;AACF;;A0C/yPE;EASM,oBAAY;A1C0yPpB;;AClrQE;EyC+XA;IAYQ,oBAAY;E1C4yPpB;AACF;;ACprQE;EyC2XA;IAeQ,oBAAY;E1C+yPpB;AACF;;ACtrQE;EyCuXA;IAkBQ,oBAAY;E1CkzPpB;AACF;;ACxrQE;EyCmXA;IAqBQ,oBAAY;E1CqzPpB;AACF;;AC1rQE;EyC+WA;IAwBQ,oBAAY;E1CwzPpB;AACF;;AC3rQI;EyC0WF;IA2BQ,oBAAY;E1C2zPpB;AACF;;ACvrQI;EyCgWF;IA8BQ,oBAAY;E1C8zPpB;AACF;;ACxrQI;EyC2VF;IAiCQ,oBAAY;E1Ci0PpB;AACF;;ACprQI;EyCiVF;IAoCQ,oBAAY;E1Co0PpB;AACF;;A0Cz2PE;EASM,iBAAY;A1Co2PpB;;AC5uQE;EyC+XA;IAYQ,iBAAY;E1Cs2PpB;AACF;;AC9uQE;EyC2XA;IAeQ,iBAAY;E1Cy2PpB;AACF;;AChvQE;EyCuXA;IAkBQ,iBAAY;E1C42PpB;AACF;;AClvQE;EyCmXA;IAqBQ,iBAAY;E1C+2PpB;AACF;;ACpvQE;EyC+WA;IAwBQ,iBAAY;E1Ck3PpB;AACF;;ACrvQI;EyC0WF;IA2BQ,iBAAY;E1Cq3PpB;AACF;;ACjvQI;EyCgWF;IA8BQ,iBAAY;E1Cw3PpB;AACF;;AClvQI;EyC2VF;IAiCQ,iBAAY;E1C23PpB;AACF;;AC9uQI;EyCiVF;IAoCQ,iBAAY;E1C83PpB;AACF;;A0Cn6PE;EASM,oBAAY;A1C85PpB;;ACtyQE;EyC+XA;IAYQ,oBAAY;E1Cg6PpB;AACF;;ACxyQE;EyC2XA;IAeQ,oBAAY;E1Cm6PpB;AACF;;AC1yQE;EyCuXA;IAkBQ,oBAAY;E1Cs6PpB;AACF;;AC5yQE;EyCmXA;IAqBQ,oBAAY;E1Cy6PpB;AACF;;AC9yQE;EyC+WA;IAwBQ,oBAAY;E1C46PpB;AACF;;AC/yQI;EyC0WF;IA2BQ,oBAAY;E1C+6PpB;AACF;;AC3yQI;EyCgWF;IA8BQ,oBAAY;E1Ck7PpB;AACF;;AC5yQI;EyC2VF;IAiCQ,oBAAY;E1Cq7PpB;AACF;;ACxyQI;EyCiVF;IAoCQ,oBAAY;E1Cw7PpB;AACF;;A0C79PE;EASM,mBAAY;A1Cw9PpB;;ACh2QE;EyC+XA;IAYQ,mBAAY;E1C09PpB;AACF;;ACl2QE;EyC2XA;IAeQ,mBAAY;E1C69PpB;AACF;;ACp2QE;EyCuXA;IAkBQ,mBAAY;E1Cg+PpB;AACF;;ACt2QE;EyCmXA;IAqBQ,mBAAY;E1Cm+PpB;AACF;;ACx2QE;EyC+WA;IAwBQ,mBAAY;E1Cs+PpB;AACF;;ACz2QI;EyC0WF;IA2BQ,mBAAY;E1Cy+PpB;AACF;;ACr2QI;EyCgWF;IA8BQ,mBAAY;E1C4+PpB;AACF;;ACt2QI;EyC2VF;IAiCQ,mBAAY;E1C++PpB;AACF;;ACl2QI;EyCiVF;IAoCQ,mBAAY;E1Ck/PpB;AACF;;A0CvhQE;EASM,oBAAY;A1CkhQpB;;AC15QE;EyC+XA;IAYQ,oBAAY;E1CohQpB;AACF;;AC55QE;EyC2XA;IAeQ,oBAAY;E1CuhQpB;AACF;;AC95QE;EyCuXA;IAkBQ,oBAAY;E1C0hQpB;AACF;;ACh6QE;EyCmXA;IAqBQ,oBAAY;E1C6hQpB;AACF;;ACl6QE;EyC+WA;IAwBQ,oBAAY;E1CgiQpB;AACF;;ACn6QI;EyC0WF;IA2BQ,oBAAY;E1CmiQpB;AACF;;AC/5QI;EyCgWF;IA8BQ,oBAAY;E1CsiQpB;AACF;;ACh6QI;EyC2VF;IAiCQ,oBAAY;E1CyiQpB;AACF;;AC55QI;EyCiV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B;A7C+zRnC;;A6C9zRI;EAGI,yBAAgD;A7C+zRxD;;A6C9zRI;EACE,oCAAwC;A7Ci0R9C;;A6C71RE;EACE,yBAAwB;A7Cg2R5B;;A6C/1RE;EAGI,yBAA0C;A7Cg2RhD;;A6C/1RE;EACE,oCAAmC;A7Ck2RvC;;A6C71RI;EACE,yBAA8B;A7Cg2RpC;;A6C/1RI;EAGI,yBAAgD;A7Cg2RxD;;A6C/1RI;EACE,oCAAyC;A7Ck2R/C;;A6Ch2RI;EACE,yBAA6B;A7Cm2RnC;;A6Cl2RI;EAGI,yBAAgD;A7Cm2RxD;;A6Cl2RI;EACE,oCAAwC;A7Cq2R9C;;A6Cj4RE;EACE,yBAAwB;A7Co4R5B;;A6Cn4RE;EAGI,yBAA0C;A7Co4RhD;;A6Cn4RE;EACE,oCAAmC;A7Cs4RvC;;A6Cj4RI;EACE,yBAA8B;A7Co4RpC;;A6Cn4RI;EAGI,yBAAgD;A7Co4RxD;;A6Cn4RI;EACE,oCAAyC;A7Cs4R/C;;A6Cp4RI;EACE,yBAA6B;A7Cu4RnC;;A6Ct4RI;EAGI,yBAAgD;A7Cu4RxD;;A6Ct4RI;EACE,oCAAwC;A7Cy4R9C;;A6Cr6RE;EACE,yBAAwB;A7Cw6R5B;;A6Cv6RE;EAGI,yBAA0C;A7Cw6RhD;;A6Cv6RE;EACE,oCAAmC;A7C06RvC;;A6Cr6RI;EACE,yBAA8B;A7Cw6RpC;;A6Cv6RI;EAGI,yBAAgD;A7Cw6RxD;;A6Cv6RI;EACE,oCAAyC;A7C06R/C;;A6Cx6RI;EACE,yBAA6B;A7C26RnC;;A6C16RI;EAGI,yBAAgD;A7C26RxD;;A6C16RI;EACE,oCAAwC;A7C66R9C;;A6C16RE;EACE,yBAAwB;A7C66R5B;;A6C56RE;EACE,oCAAmC;A7C+6RvC;;A6Cl7RE;EACE,yBAAwB;A7Cq7R5B;;A6Cp7RE;EACE,oCAAmC;A7Cu7RvC;;A6C17RE;EACE,yBAAwB;A7C67R5B;;A6C57RE;EACE,oCAAmC;A7C+7RvC;;A6Cl8RE;EACE,yBAAwB;A7Cq8R5B;;A6Cp8RE;EACE,oCAAmC;A7Cu8RvC;;A6C18RE;EACE,yBAAwB;A7C68R5B;;A6C58RE;EACE,oCAAmC;A7C+8RvC;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,4BAAwB;A7Cq+R5B;;A6Cp+RE;EACE,uCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A8CnhSE;EACE,8BAAiC;A9CshSrC;;A8CvhSE;EACE,sCAAiC;A9C0hSrC;;A8C3hSE;EACE,iCAAiC;A9C8hSrC;;A8C/hSE;EACE,yCAAiC;A9CkiSrC;;A8C9hSE;EACE,4BAA4B;A9CiiShC;;A8CliSE;EACE,0BAA4B;A9CqiShC;;A8CtiSE;EACE,kCAA4B;A9CyiShC;;A8CriSE;EACE,sCAAkC;A9CwiStC;;A8CziSE;EACE,oCAAkC;A9C4iStC;;A8C7iSE;EACE,kCAAkC;A9CgjStC;;A8CjjSE;EACE,yCAAkC;A9CojStC;;A8CrjSE;EACE,wCAAkC;A9CwjStC;;A8CzjSE;EACE,wCAAkC;A9C4jStC;;A8C7jSE;EACE,iCAAkC;A9CgkStC;;A8CjkSE;EACE,+BAAkC;A9CokStC;;A8CrkSE;EACE,gCAAkC;A9CwkStC;;A8CzkSE;EACE,iCAAkC;A9C4kStC;;A8CxkSE;EACE,oCAAgC;A9C2kSpC;;A8C5kSE;EACE,kCAAgC;A9C+kSpC;;A8ChlSE;EACE,gCAAgC;A9CmlSpC;;A8CplSE;EACE,uCAAgC;A9CulSpC;;A8CxlSE;EACE,sCAAgC;A9C2lSpC;;A8C5lSE;EACE,sCAAgC;A9C+lSpC;;A8ChmSE;EACE,iCAAgC;A9CmmSpC;;A8CpmSE;EACE,+BAAgC;A9CumSpC;;A8CxmSE;EACE,6BAAgC;A9C2mSpC;;A8C5mSE;EACE,kCAAgC;A9C+mSpC;;A8C3mSE;EACE,+BAA8B;A9C8mSlC;;A8C/mSE;EACE,kCAA8B;A9CknSlC;;A8CnnSE;EACE,gCAA8B;A9CsnSlC;;A8CvnSE;EACE,8BAA8B;A9C0nSlC;;A8C3nSE;EACE,gCAA8B;A9C8nSlC;;A8C/nSE;EACE,6BAA8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0vTjC;;AoD3vTI;EACE,0BAA2B;ApD8vTjC;;AoD/vTI;EACE,4BAA2B;ApDkwTjC;;AoDnwTI;EACE,6BAA2B;ApDswTjC;;AoDvwTI;EACE,0BAA2B;ApD0wTjC;;AoD3wTI;EACE,6BAA2B;ApD8wTjC;;ACvrTE;EmDxFE;IACE,0BAA2B;EpDmxT/B;EoDpxTE;IACE,4BAA2B;EpDsxT/B;EoDvxTE;IACE,0BAA2B;EpDyxT/B;EoD1xTE;IACE,4BAA2B;EpD4xT/B;EoD7xTE;IACE,6BAA2B;EpD+xT/B;EoDhyTE;IACE,0BAA2B;EpDkyT/B;EoDnyTE;IACE,6BAA2B;EpDqyT/B;AACF;;AC3sTE;EmD5FE;IACE,0BAA2B;EpD2yT/B;EoD5yTE;IACE,4BAA2B;EpD8yT/B;EoD/yTE;IACE,0BAA2B;EpDizT/B;EoDlzTE;IACE,4BAA2B;EpDozT/B;EoDrzTE;IACE,6BAA2B;EpDuzT/B;EoDxzTE;IACE,0BAA2B;EpD0zT/B;EoD3zTE;IACE,6BAA2B;EpD6zT/B;AACF;;AC3tTE;EmDpGE;IACE,0BAA2B;EpDm0T/B;EoDp0TE;IACE,4BAA2B;EpDs0T/B;EoDv0TE;IACE,0BAA2B;EpDy0T/B;EoD10TE;IACE,4BAA2B;EpD40T/B;EoD70TE;IACE,6BAA2B;EpD+0T/B;EoDh1TE;IACE,0BAA2B;EpDk1T/B;EoDn1TE;IACE,6BAA2B;EpDq1T/B;AACF;;AC/uTE;EmDxGE;IACE,0BAA2B;EpD21T/B;EoD51TE;IACE,4BAA2B;EpD81T/B;EoD/1TE;IACE,0BAA2B;EpDi2T/B;EoDl2TE;IACE,4BAA2B;EpDo2T/B;EoDr2TE;IACE,6BAA2B;EpDu2T/B;EoDx2TE;IACE,0BAA2B;EpD02T/B;EoD32TE;IACE,6BAA2B;EpD62T/B;AACF;;ACxvTI;EmDvHA;IACE,0BAA2B;EpDm3T/B;EoDp3TE;IACE,4BAA2B;EpDs3T/B;EoDv3TE;IACE,0BAA2B;EpDy3T/B;EoD13TE;IACE,4BAA2B;EpD43T/B;EoD73TE;IACE,6BAA2B;EpD+3T/B;EoDh4TE;IACE,0BAA2B;EpDk4T/B;EoDn4TE;IACE,6BAA2B;EpDq4T/B;AACF;;ACjwTI;EmDtIA;IACE,0BAA2B;EpD24T/B;EoD54TE;IACE,4BAA2B;EpD84T/B;EoD/4TE;IACE,0BAA2B;EpDi5T/B;EoDl5TE;IACE,4BAA2B;EpDo5T/B;EoDr5TE;IACE,6BAA2B;EpDu5T/B;EoDx5TE;IACE,0BAA2B;EpD05T/B;EoD35TE;IACE,6BAA2B;EpD65T/B;AACF;;AoDr4TE;EACE,6BAAqC;ApDw4TzC;;AoDz4TE;EACE,8BAAqC;ApD44TzC;;AoD74TE;EACE,2BAAqC;ApDg5TzC;;AoDj5TE;EACE,4BAAqC;ApDo5TzC;;ACv1TE;EmDzDE;IACE,6BAAqC;EpDo5TzC;AACF;;ACz1TE;EmD1DE;IACE,6BAAqC;EpDu5TzC;AACF;;AC31TE;EmD3DE;IACE,6BAAqC;EpD05TzC;AACF;;AC71TE;EmD5DE;IACE,6BAAqC;EpD65TzC;AACF;;AC/1TE;EmD7DE;IACE,6BAAqC;EpDg6TzC;AACF;;ACh2TI;EmD/DA;IACE,6BAAqC;EpDm6TzC;AACF;;AC51TI;EmDtEA;IACE,6BAAqC;EpDs6TzC;AACF;;AC71TI;EmDxEA;IACE,6BAAqC;EpDy6TzC;AACF;;ACz1TI;EmD/EA;IACE,6BAAqC;EpD46TzC;AACF;;AC74TE;EmDzDE;IACE,8BAAqC;EpD08TzC;AACF;;AC/4TE;EmD1DE;IACE,8BAAqC;EpD68TzC;AACF;;ACj5TE;EmD3DE;IACE,8BAAqC;EpDg9TzC;AACF;;ACn5TE;EmD5DE;IACE,8BAAqC;EpDm9TzC;AACF;;ACr5TE;EmD7DE;IACE,8BAAqC;EpDs9TzC;AACF;;ACt5TI;EmD/DA;IACE,8BAAqC;EpDy9TzC;AACF;;ACl5TI;EmDtEA;IACE,8BAAqC;EpD49TzC;AACF;;ACn5TI;EmDxEA;IACE,8BAAqC;EpD+9TzC;AACF;;AC/4TI;EmD/EA;IACE,8BAAqC;EpDk+TzC;AACF;;ACn8TE;EmDzDE;IACE,2BAAqC;EpDggUzC;AACF;;ACr8TE;EmD1DE;IACE,2BAAqC;EpDmgUzC;AACF;;ACv8TE;EmD3DE;IACE,2BAAqC;EpDsgUzC;AACF;;ACz8TE;EmD5DE;IACE,2BAAqC;EpDygUzC;AACF;;AC38TE;EmD7DE;IACE,2BAAqC;EpD4gUzC;AACF;;AC58TI;EmD/DA;IACE,2BAAqC;EpD+gUzC;AACF;;ACx8TI;EmDtEA;IACE,2BAAqC;EpDkhUzC;AACF;;ACz8TI;EmDxEA;IACE,2BAAqC;EpDqhUzC;AACF;;ACr8TI;EmD/EA;IACE,2BAAqC;EpDwhUzC;AACF;;ACz/TE;EmDzDE;IACE,4BAAqC;EpDsjUzC;AACF;;AC3/TE;EmD1DE;IACE,4BAAqC;EpDyjUzC;AACF;;AC7/TE;EmD3DE;IACE,4BAAqC;EpD4jUzC;AACF;;AC//TE;EmD5DE;IACE,4BAAqC;EpD+jUzC;AACF;;ACjgUE;EmD7DE;IACE,4BAAqC;EpDkkUzC;AACF;;AClgUI;EmD/DA;IACE,4BAAqC;EpDqkUzC;AACF;;AC9/TI;EmDtEA;IACE,4BAAqC;EpDwkUzC;AACF;;AC//TI;EmDxEA;IACE,4BAAqC;EpD2kUzC;AACF;;AC3/TI;EmD/EA;IACE,4BAAqC;EpD8kUzC;AACF;;AoD7kUA;EACE,qCAAqC;ApDglUvC;;AoD9kUA;EACE,oCAAoC;ApDilUtC;;AoD/kUA;EACE,oCAAoC;ApDklUtC;;AoDhlUA;EACE,6BAA6B;ApDmlU/B;;AoDjlUA;EACE,qCAAqC;ApDolUvC;;AoDllUA;EACE,2BAAqC;ApDqlUvC;;AoDplUA;EACE,2BAAsC;ApDulUxC;;AoDtlUA;EACE,2BAAsC;ApDylUxC;;AoDxlUA;EACE,2BAAwC;ApD2lU1C;;AoD1lUA;EACE,2BAAoC;ApD6lUtC;;AoD3lUA;EACE,+LAAuC;ApD8lUzC;;AoD5lUA;EACE,+LAAyC;ApD+lU3C;;AoD7lUA;EACE,+LAA0C;ApDgmU5C;;AoD9lUA;EACE,iCAAyC;ApDimU3C;;AoD/lUA;EACE,iCAAoC;ApDkmUtC;;AqDnsUE;EACE,yBAA+B;ArDssUnC;;AC/mUE;EoDrFE;IACE,yBAA+B;ErDwsUnC;AACF;;ACjnUE;EoDtFE;IACE,yBAA+B;ErD2sUnC;AACF;;ACnnUE;EoDvFE;IACE,yBAA+B;ErD8sUnC;AACF;;ACrnUE;EoDxFE;IACE,yBAA+B;ErDitUnC;AACF;;ACvnUE;EoDzFE;IACE,yBAA+B;ErDotUnC;AACF;;ACxnUI;EoD3FA;IACE,yBAA+B;ErDutUnC;AACF;;ACpnUI;EoDlGA;IACE,yBAA+B;ErD0tUnC;AACF;;ACrnUI;EoDpGA;IACE,yBAA+B;ErD6tUnC;AACF;;ACjnUI;EoD3GA;IACE,yBAA+B;ErDguUnC;AACF;;AqD7vUE;EACE,wBAA+B;ArDgwUnC;;ACzqUE;EoDrFE;IACE,wBAA+B;ErDkwUnC;AACF;;AC3qUE;EoDtFE;IACE,wBAA+B;ErDqwUnC;AACF;;AC7qUE;EoDvFE;IACE,wBAA+B;ErDwwUnC;AACF;;AC/qUE;EoDxFE;IACE,wBAA+B;ErD2wUnC;AACF;;ACjrUE;EoDzFE;IACE,wBAA+B;ErD8wUnC;AACF;;AClrUI;EoD3FA;IACE,wBAA+B;ErDixUnC;AACF;;AC9qUI;EoDlGA;IACE,wBAA+B;ErDoxUnC;AACF;;AC/qUI;EoDpGA;IACE,wBAA+B;ErDuxUnC;AACF;;AC3qUI;EoD3GA;IACE,wBAA+B;ErD0xUnC;AACF;;AqDvzUE;EACE,0BAA+B;ArD0zUnC;;ACnuUE;EoDrFE;IACE,0BAA+B;ErD4zUnC;AACF;;ACruUE;EoDtFE;IACE,0BAA+B;ErD+zUnC;AACF;;ACvuUE;EoDvFE;IACE,0BAA+B;ErDk0UnC;AACF;;ACzuUE;EoDxFE;IACE,0BAA+B;ErDq0UnC;AACF;;AC3uUE;EoDzFE;IACE,0BAA+B;ErDw0UnC;AACF;;AC5uUI;EoD3FA;IACE,0BAA+B;ErD20UnC;AACF;;ACxuUI;EoDlGA;IACE,0BAA+B;ErD80UnC;AACF;;ACzuUI;EoDpGA;IACE,0BAA+B;ErDi1UnC;AACF;;ACruUI;EoD3GA;IACE,0BAA+B;ErDo1UnC;AACF;;AqDj3UE;EACE,gCAA+B;ArDo3UnC;;AC7xUE;EoDrFE;IACE,gCAA+B;ErDs3UnC;AACF;;AC/xUE;EoDtFE;IACE,gCAA+B;ErDy3UnC;AACF;;ACjyUE;EoDvFE;IACE,gCAA+B;ErD43UnC;AACF;;ACnyUE;EoDxFE;IACE,gCAA+B;ErD+3UnC;AACF;;ACryUE;EoDzFE;IACE,gCAA+B;ErDk4UnC;AACF;;ACtyUI;EoD3FA;IACE,gCAA+B;ErDq4UnC;AACF;;AClyUI;EoDlGA;IACE,gCAA+B;ErDw4UnC;AACF;;ACnyUI;EoDpGA;IACE,gCAA+B;ErD24UnC;AACF;;AC/xUI;EoD3GA;IACE,gCAA+B;ErD84UnC;AACF;;AqD36UE;EACE,+BAA+B;ArD86UnC;;ACv1UE;EoDrFE;IACE,+BAA+B;ErDg7UnC;AACF;;ACz1UE;EoDtFE;IACE,+BAA+B;ErDm7UnC;AACF;;AC31UE;EoDvFE;IACE,+BAA+B;ErDs7UnC;AACF;;AC71UE;EoDxFE;IACE,+BAA+B;ErDy7UnC;AACF;;AC/1UE;EoDzFE;IACE,+BAA+B;ErD47UnC;AACF;;ACh2UI;EoD3FA;IACE,+BAA+B;ErD+7UnC;AACF;;AC51UI;EoDlGA;IACE,+BAA+B;ErDk8UnC;AACF;;AC71UI;EoDpGA;IACE,+BAA+B;ErDq8UnC;AACF;;ACz1UI;EoD3GA;IACE,+BAA+B;ErDw8UnC;AACF;;AqDv8UA;EACE,wBAAwB;ArD08U1B;;AqDx8UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArD28U1B;;AC55UE;EoD5CA;IACE,wBAAwB;ErD48U1B;AACF;;AC95UE;EoD5CA;IACE,wBAAwB;ErD88U1B;AACF;;ACh6UE;EoD5CA;IACE,wBAAwB;ErDg9U1B;AACF;;ACl6UE;EoD5CA;IACE,wBAAwB;ErDk9U1B;AACF;;ACp6UE;EoD5CA;IACE,wBAAwB;ErDo9U1B;AACF;;ACr6UI;EoD7CF;IACE,wBAAwB;ErDs9U1B;AACF;;ACj6UI;EoDnDF;IACE,wBAAwB;ErDw9U1B;AACF;;ACl6UI;EoDpDF;IACE,wBAAwB;ErD09U1B;AACF;;AC95UI;EoD1DF;IACE,wBAAwB;ErD49U1B;AACF;;AqD39UA;EACE,6BAA6B;ArD89U/B;;ACt9UE;EoDLA;IACE,6BAA6B;ErD+9U/B;AACF;;ACx9UE;EoDLA;IACE,6BAA6B;ErDi+U/B;AACF;;AC19UE;EoDLA;IACE,6BAA6B;ErDm+U/B;AACF;;AC59UE;EoDLA;IACE,6BAA6B;ErDq+U/B;AACF;;AC99UE;EoDLA;IACE,6BAA6B;ErDu+U/B;AACF;;AC/9UI;EoDNF;IACE,6BAA6B;ErDy+U/B;AACF;;AC39UI;EoDZF;IACE,6BAA6B;ErD2+U/B;AACF;;AC59UI;EoDbF;IACE,6BAA6B;ErD6+U/B;AACF;;ACx9UI;EoDnBF;IACE,6BAA6B;ErD++U/B;AACF;;AsDzmVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvDkmVhC;;AuDtmVA;EAMI,gBAAgB;AvDomVpB;;AuD1mVA;EASM,mBAAmB;AvDqmVzB;;AuD9mVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;AC4nV7B;;AuDnnVA;;EAmBQ,cAAc;AvDqmVtB;;AuDxnVA;EAqBQ,cxD9BqB;ACqoV7B;;AuD5nVA;EAuBQ,4BxDhCqB;ACyoV7B;;AuDhoVA;;EA0BU,cxDnCmB;AC8oV7B;;ACviVE;EsD9FF;IA6BU,uBxDzBqB;ECsoV7B;AACF;;AuD3oVA;;EAgCQ,4BxDzCqB;ACypV7B;;AuDhpVA;;;EAqCU,yB7C6DuB;E6C5DvB,cxD/CmB;ACgqV7B;;AuDvpVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvDknVtB;;AuD5pVA;EA4CY,UAAU;AvDonVtB;;AuDhqVA;EA+CY,uBAAwB;EACxB,UAAU;AvDqnVtB;;AuDrqVA;EAoDY,cxD7DiB;ACkrV7B;;AuDzqVA;EAsDc,uCxD/De;ACsrV7B;;AuD7qVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;AC+qV/B;;AuDnrVA;EAkEU,4EAAyG;AvDqnVnH;;ACrmVE;EsDlFF;IAqEc,4EAAyG;EvDunVrH;AACF;;AuD7rVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;AC8rV/B;;AuDlsVA;;EAmBQ,cAAc;AvDorVtB;;AuDvsVA;EAqBQ,YxDjBuB;ACusV/B;;AuD3sVA;EAuBQ,+BxDnBuB;AC2sV/B;;AuD/sVA;;EA0BU,YxDtBqB;ACgtV/B;;ACtnVE;EsD9FF;IA6BU,yBxDtCmB;ECkuV3B;AACF;;AuD1tVA;;EAgCQ,+BxD5BuB;AC2tV/B;;AuD/tVA;;;EAqCU,uB7C6DuB;E6C5DvB,YxDlCqB;ACkuV/B;;AuDtuVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDisVtB;;AuD3uVA;EA4CY,UAAU;AvDmsVtB;;AuD/uVA;EA+CY,yBAAwB;EACxB,UAAU;AvDosVtB;;AuDpvVA;EAoDY,YxDhDmB;ACovV/B;;AuDxvVA;EAsDc,uCxD/De;ACqwV7B;;AuD5vVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;AC2wV7B;;AuDlwVA;EAkEU,8EAAyG;AvDosVnH;;ACprVE;EsDlFF;IAqEc,8EAAyG;EvDssVrH;AACF;;AuD5wVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AV4sVrB;;AuDjxVA;;EAmBQ,cAAc;AvDmwVtB;;AuDtxVA;EAqBQ,yB7CgDa;AVqtVrB;;AuD1xVA;EAuBQ,yB7C8Ca;AVytVrB;;AuD9xVA;;EA0BU,yB7C2CW;AV8tVrB;;ACrsVE;EsD9FF;IA6BU,4BxD3BoB;ECsyV5B;AACF;;AuDzyVA;;EAgCQ,yB7CqCa;AVyuVrB;;AuD9yVA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AVgvVrB;;AuDrzVA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDgxVtB;;AuD1zVA;EA4CY,UAAU;AvDkxVtB;;AuD9zVA;EA+CY,4BAAwB;EACxB,UAAU;AvDmxVtB;;AuDn0VA;EAoDY,yB7CiBS;AVkwVrB;;AuDv0VA;EAsDc,uCxD/De;ACo1V7B;;AuD30VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;AC+0V9B;;AuDj1VA;EAkEU,iFAAyG;AvDmxVnH;;ACnwVE;EsDlFF;IAqEc,iFAAyG;EvDqxVrH;AACF;;AuD31VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVyxVhB;;AuDh2VA;;EAmBQ,cAAc;AvDk1VtB;;AuDr2VA;EAqBQ,W7CkDQ;AVkyVhB;;AuDz2VA;EAuBQ,+B7CgDQ;AVsyVhB;;AuD72VA;;EA0BU,W7C6CM;AV2yVhB;;ACpxVE;EsD9FF;IA6BU,yBxDlCoB;EC43V5B;AACF;;AuDx3VA;;EAgCQ,+B7CuCQ;AVszVhB;;AuD73VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV6zVhB;;AuDp4VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD+1VtB;;AuDz4VA;EA4CY,UAAU;AvDi2VtB;;AuD74VA;EA+CY,yBAAwB;EACxB,UAAU;AvDk2VtB;;AuDl5VA;EAoDY,W7CmBI;AV+0VhB;;AuDt5VA;EAsDc,uCxD/De;ACm6V7B;;AuD15VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;ACq6V9B;;AuDh6VA;EAkEU,gFAAyG;AvDk2VnH;;ACl1VE;EsDlFF;IAqEc,gFAAyG;EvDo2VrH;AACF;;AuD16VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVw2VhB;;AuD/6VA;;EAmBQ,cAAc;AvDi6VtB;;AuDp7VA;EAqBQ,W7CkDQ;AVi3VhB;;AuDx7VA;EAuBQ,+B7CgDQ;AVq3VhB;;AuD57VA;;EA0BU,W7C6CM;AV03VhB;;ACn2VE;EsD9FF;IA6BU,yBxDpBwB;EC67VhC;AACF;;AuDv8VA;;EAgCQ,+B7CuCQ;AVq4VhB;;AuD58VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV44VhB;;AuDn9VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD86VtB;;AuDx9VA;EA4CY,UAAU;AvDg7VtB;;AuD59VA;EA+CY,yBAAwB;EACxB,UAAU;AvDi7VtB;;AuDj+VA;EAoDY,W7CmBI;AV85VhB;;AuDr+VA;EAsDc,uCxD/De;ACk/V7B;;AuDz+VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;ACs+VlC;;AuD/+VA;EAkEU,gFAAyG;AvDi7VnH;;ACj6VE;EsDlFF;IAqEc,gFAAyG;EvDm7VrH;AACF;;AuDz/VA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AVu7VhB;;AuD9/VA;;EAmBQ,cAAc;AvDg/VtB;;AuDngWA;EAqBQ,W7CkDQ;AVg8VhB;;AuDvgWA;EAuBQ,+B7CgDQ;AVo8VhB;;AuD3gWA;;EA0BU,W7C6CM;AVy8VhB;;ACl7VE;EsD9FF;IA6BU,yBxDlBwB;EC0gWhC;AACF;;AuDthWA;;EAgCQ,+B7CuCQ;AVo9VhB;;AuD3hWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV29VhB;;AuDliWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD6/VtB;;AuDviWA;EA4CY,UAAU;AvD+/VtB;;AuD3iWA;EA+CY,yBAAwB;EACxB,UAAU;AvDggWtB;;AuDhjWA;EAoDY,W7CmBI;AV6+VhB;;AuDpjWA;EAsDc,uCxD/De;ACikW7B;;AuDxjWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;ACmjWlC;;AuD9jWA;EAkEU,gFAAyG;AvDggWnH;;ACh/VE;EsDlFF;IAqEc,gFAAyG;EvDkgWrH;AACF;;AuDxkWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AVsgWhB;;AuD7kWA;;EAmBQ,cAAc;AvD+jWtB;;AuDllWA;EAqBQ,W7CkDQ;AV+gWhB;;AuDtlWA;EAuBQ,+B7CgDQ;AVmhWhB;;AuD1lWA;;EA0BU,W7C6CM;AVwhWhB;;ACjgWE;EsD9FF;IA6BU,yBxDnBwB;EC0lWhC;AACF;;AuDrmWA;;EAgCQ,+B7CuCQ;AVmiWhB;;AuD1mWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV0iWhB;;AuDjnWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD4kWtB;;AuDtnWA;EA4CY,UAAU;AvD8kWtB;;AuD1nWA;EA+CY,yBAAwB;EACxB,UAAU;AvD+kWtB;;AuD/nWA;EAoDY,W7CmBI;AV4jWhB;;AuDnoWA;EAsDc,uCxD/De;ACgpW7B;;AuDvoWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;ACmoWlC;;AuD7oWA;EAkEU,gFAAyG;AvD+kWnH;;AC/jWE;EsDlFF;IAqEc,gFAAyG;EvDilWrH;AACF;;AuDvpWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AVqlWhB;;AuD5pWA;;EAmBQ,cAAc;AvD8oWtB;;AuDjqWA;EAqBQ,W7CkDQ;AV8lWhB;;AuDrqWA;EAuBQ,+B7CgDQ;AVkmWhB;;AuDzqWA;;EA0BU,W7C6CM;AVumWhB;;AChlWE;EsD9FF;IA6BU,yBxDrBwB;EC2qWhC;AACF;;AuDprWA;;EAgCQ,+B7CuCQ;AVknWhB;;AuDzrWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVynWhB;;AuDhsWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD2pWtB;;AuDrsWA;EA4CY,UAAU;AvD6pWtB;;AuDzsWA;EA+CY,yBAAwB;EACxB,UAAU;AvD8pWtB;;AuD9sWA;EAoDY,W7CmBI;AV2oWhB;;AuDltWA;EAsDc,uCxD/De;AC+tW7B;;AuDttWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;ACotWlC;;AuD5tWA;EAkEU,gFAAyG;AvD8pWnH;;AC9oWE;EsDlFF;IAqEc,gFAAyG;EvDgqWrH;AACF;;AuDtuWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AVsqWrB;;AuD3uWA;;EAmBQ,cAAc;AvD6tWtB;;AuDhvWA;EAqBQ,yB7CgDa;AV+qWrB;;AuDpvWA;EAuBQ,yB7C8Ca;AVmrWrB;;AuDxvWA;;EA0BU,yB7C2CW;AVwrWrB;;AC/pWE;EsD9FF;IA6BU,yBxDtBwB;EC2vWhC;AACF;;AuDnwWA;;EAgCQ,yB7CqCa;AVmsWrB;;AuDxwWA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AV0sWrB;;AuD/wWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvD0uWtB;;AuDpxWA;EA4CY,UAAU;AvD4uWtB;;AuDxxWA;EA+CY,yBAAwB;EACxB,UAAU;AvD6uWtB;;AuD7xWA;EAoDY,yB7CiBS;AV4tWrB;;AuDjyWA;EAsDc,uCxD/De;AC8yW7B;;AuDryWA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;ACoyWlC;;AuD3yWA;EAkEU,gFAAyG;AvD6uWnH;;AC7tWE;EsDlFF;IAqEc,gFAAyG;EvD+uWrH;AACF;;AuDrzWA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AVmvWhB;;AuD1zWA;;EAmBQ,cAAc;AvD4yWtB;;AuD/zWA;EAqBQ,W7CkDQ;AV4vWhB;;AuDn0WA;EAuBQ,+B7CgDQ;AVgwWhB;;AuDv0WA;;EA0BU,W7C6CM;AVqwWhB;;AC9uWE;EsD9FF;IA6BU,yBxDhBuB;ECo0W/B;AACF;;AuDl1WA;;EAgCQ,+B7CuCQ;AVgxWhB;;AuDv1WA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVuxWhB;;AuD91WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDyzWtB;;AuDn2WA;EA4CY,UAAU;AvD2zWtB;;AuDv2WA;EA+CY,yBAAwB;EACxB,UAAU;AvD4zWtB;;AuD52WA;EAoDY,W7CmBI;AVyyWhB;;AuDh3WA;EAsDc,uCxD/De;AC63W7B;;AuDp3WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;AC62WjC;;AuD13WA;EAkEU,gFAAyG;AvD4zWnH;;AC5yWE;EsDlFF;IAqEc,gFAAyG;EvD8zWrH;AACF;;AuDp4WA;EAyEM,eAhF0B;AvD+4WhC;;AClzWE;EsDtFF;IA6EQ,oBAnF8B;EvDm5WpC;AACF;;ACxzWE;EsDtFF;IAiFQ,mBAtF4B;EvDw5WlC;AACF;;AuDp5WA;EAsFM,mBAAmB;EACnB,aAAa;AvDk0WnB;;AuDz5WA;EAyFQ,YAAY;EACZ,cAAc;AvDo0WtB;;AuD95WA;EA4FI,gBAAgB;AvDs0WpB;;AuDl6WA;EA8FI,iBAAiB;AvDw0WrB;;AuDp0WA;EAEE,gBAAgB;AvDs0WlB;;AuDx0WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDw0WzC;;AuDj1WA;EAYI,YAAY;AvDy0WhB;;ACr2WE;EsDgBF;IAeI,aAAa;EvD20Wf;AACF;;AuD10WA;EACE,kBAAkB;AvD60WpB;;AC/2WE;EsDiCF;IAKM,aAAa;EvD80WjB;EuDn1WF;IAOQ,sBAAsB;EvD+0W5B;AACF;;ACp3WE;EsD6BF;IASI,aAAa;IACb,uBAAuB;EvDm1WzB;EuD71WF;ItD8BI,oBsDlBwC;EvDo1W1C;AACF;;AuDj1WA;;EAEE,YAAY;EACZ,cAAc;AvDo1WhB;;AuDl1WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDy+W/B;;AC14WE;EsDkDF;IAKI,kBArJgC;EvD6+WlC;AACF;;AwD1+WA;EACE,oBAN2B;AxDm/W7B;;ACx4WE;EuDtGF;IAII,kBAR+B;ExDu/WjC;EwDn/WF;IAOM,oBAV8B;ExDy/WlC;EwDt/WF;IASM,mBAX4B;ExD2/WhC;AACF;;AyD3/WA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzDkgXjC","file":"bulma.css"} \ No newline at end of file From 68d79f60901f90fe31c6d53fdcbc3b73c8d92805 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 29 Mar 2022 22:53:17 +0200 Subject: [PATCH 042/853] Modifica el renderizado de componentes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La función default_render() se implementa usando llamadas a funciones, nunca usando campos internos de la estructura. Esto es así para dar las mismas opciones a los temas que alteren el render de un componente dado. --- pagetop-user/src/lib.rs | 2 +- pagetop/src/base/component/block.rs | 22 ++-- pagetop/src/base/component/chunck.rs | 6 +- pagetop/src/base/component/container.rs | 42 +++++--- pagetop/src/base/component/form/button.rs | 49 +++++---- pagetop/src/base/component/form/date.rs | 100 +++++++++---------- pagetop/src/base/component/form/form.rs | 47 +++++---- pagetop/src/base/component/form/hidden.rs | 30 +++--- pagetop/src/base/component/form/input.rs | 116 +++++++++++----------- pagetop/src/base/component/form/mod.rs | 4 +- pagetop/src/base/component/grid/column.rs | 18 +++- pagetop/src/base/component/grid/row.rs | 18 +++- pagetop/src/base/component/image.rs | 19 ++-- pagetop/src/base/component/menu.rs | 53 +++++----- pagetop/src/base/component/mod.rs | 4 +- pagetop/src/base/module/demopage/mod.rs | 2 +- pagetop/src/html/optattr.rs | 11 -- pagetop/src/html/optiden.rs | 11 -- pagetop/src/lib.rs | 9 +- pagetop/src/prelude.rs | 1 + pagetop/src/response/page/assets.rs | 27 ++--- pagetop/src/response/page/page.rs | 18 ++-- pagetop/src/theme/definition.rs | 21 ++-- 23 files changed, 335 insertions(+), 295 deletions(-) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 7ef2ecf3..dd0b362b 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -40,7 +40,7 @@ fn form_login() -> impl PageComponent { .with_help_text(t("username_help", &args![ "app" => SETTINGS.app.name.to_owned() ]).as_str()) - .autofocus(true) + .with_autofocus(true) ) .add(form::Input::password() .with_name("pass") diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 5e5a7159..976c27bc 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -31,15 +31,15 @@ impl PageComponent for Block { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - let id = assets.serial_id(self.name(), self.id.value()); - let title = self.title.value(); + let id = assets.serial_id(self.name(), self.id()); html! { div id=(id) class="block" { - @if !title.is_empty() { - h2 class="block-title" { (title) } + @match self.title() { + Some(title) => h2 class="block-title" { (title) }, + None => {} } div class="block-body" { - @for html in self.html.iter() { + @for html in self.html().iter() { (*html) } } @@ -88,12 +88,16 @@ impl Block { // Block GETTERS. - pub fn id(&self) -> &str { - self.id.value() + pub fn id(&self) -> &Option<String> { + self.id.option() } - pub fn title(&self) -> &str { - self.title.value() + pub fn title(&self) -> &Option<String> { + self.title.option() + } + + pub fn html(&self) -> &Vec<Markup> { + &self.html } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index b03ac0c8..532584fc 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -28,7 +28,7 @@ impl PageComponent for Chunck { fn default_render(&self, _: &mut PageAssets) -> Markup { html! { - @for html in self.html.iter() { + @for html in self.html().iter() { (*html) } } @@ -65,6 +65,10 @@ impl Chunck { // Chunck GETTERS. + pub fn html(&self) -> &Vec<Markup> { + &self.html + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index e76b48b4..cba905d6 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -1,12 +1,12 @@ use crate::prelude::*; -enum ContainerType { Header, Footer, Main, Section, Wrapper } +pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { renderable: fn() -> bool, weight : i8, - id : OptIden, container : ContainerType, + id : OptIden, components: PageContainer, template : String, } @@ -17,8 +17,8 @@ impl PageComponent for Container { Container { renderable: always, weight : 0, - id : OptIden::none(), container : ContainerType::Wrapper, + id : OptIden::none(), components: PageContainer::new(), template : "default".to_owned(), } @@ -33,38 +33,38 @@ impl PageComponent for Container { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - match self.container { + match self.container_type() { ContainerType::Header => html! { - header id=[&self.id.option()] class="header" { + header id=[self.id()] class="header" { div class="container" { - (self.components.render(assets)) + (self.render_components(assets)) } } }, ContainerType::Footer => html! { - footer id=[&self.id.option()] class="footer" { + footer id=[self.id()] class="footer" { div class="container" { - (self.components.render(assets)) + (self.render_components(assets)) } } }, ContainerType::Main => html! { - main id=[&self.id.option()] class="main" { + main id=[self.id()] class="main" { div class="container" { - (self.components.render(assets)) + (self.render_components(assets)) } } }, ContainerType::Section => html! { - section id=[&self.id.option()] class="section" { + section id=[self.id()] class="section" { div class="container" { - (self.components.render(assets)) + (self.render_components(assets)) } } }, _ => html! { - div id=[&self.id.option()] class="container" { - (self.components.render(assets)) + div id=[self.id()] class="container" { + (self.render_components(assets)) } } } @@ -126,13 +126,23 @@ impl Container { // Container GETTERS. - pub fn id(&self) -> &str { - self.id.value() + pub fn container_type(&self) -> &ContainerType { + &self.container + } + + pub fn id(&self) -> &Option<String> { + self.id.option() } pub fn template(&self) -> &str { self.template.as_str() } + + // Container EXTRAS. + + pub fn render_components(&self, assets: &mut PageAssets) -> Markup { + html! { (self.components.render(assets)) } + } } fn always() -> bool { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index fa9794f2..fbe25738 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -enum ButtonType {Button, Reset, Submit} +pub enum ButtonType {Button, Reset, Submit} pub struct Button { renderable : fn() -> bool, @@ -37,26 +37,29 @@ impl PageComponent for Button { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (button_type, button_class) = match &self.button_type { + let (button_type, button_class) = match self.button_type() { ButtonType::Button => ("button", "btn btn-primary form-button"), ButtonType::Reset => ("reset", "btn btn-primary form-reset" ), - ButtonType::Submit => ("submit", "btn btn-primary form-submit") + ButtonType::Submit => ("submit", "btn btn-primary form-submit"), }; - let id = match &self.name.option() { - Some(name) => Some(format!("edit-{}", name)), + let id = match self.name() { + Some(name) => Some(concat_string!("edit-", name)), _ => None }; html! { button type=(button_type) - id=[&id] + id=[id] class=(button_class) - name=[&self.name.option()] - value=[&self.value.option()] - autofocus=[&self.autofocus.option()] - disabled=[&self.disabled.option()] + name=[self.name()] + value=[self.value()] + autofocus=[self.autofocus()] + disabled=[self.disabled()] { - (self.value.value()) + @match self.value() { + Some(value) => { (value) }, + None => {}, + } } } } @@ -102,7 +105,7 @@ impl Button { self } - pub fn autofocus(mut self, toggle: bool) -> Self { + pub fn with_autofocus(mut self, toggle: bool) -> Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -110,7 +113,7 @@ impl Button { self } - pub fn disabled(mut self, toggle: bool) -> Self { + pub fn with_disabled(mut self, toggle: bool) -> Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -125,20 +128,24 @@ impl Button { // Button GETTERS. - pub fn name(&self) -> &str { - self.name.value() + pub fn button_type(&self) -> &ButtonType { + &self.button_type } - pub fn value(&self) -> &str { - self.value.value() + pub fn name(&self) -> &Option<String> { + self.name.option() } - pub fn has_autofocus(&self) -> bool { - self.autofocus.has_value() + pub fn value(&self) -> &Option<String> { + self.value.option() } - pub fn is_disabled(&self) -> bool { - self.disabled.has_value() + pub fn autofocus(&self) -> &Option<String> { + self.autofocus.option() + } + + pub fn disabled(&self) -> &Option<String> { + self.disabled.option() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 5e42bc6b..906f5bbc 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -45,10 +45,10 @@ impl PageComponent for Date { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (class, id) = match self.name.option() { + let (class, id) = match self.name() { Some(name) => ( - format!("form-item form-item-{} form-type-date", name), - Some(format!("edit-{}", name)) + concat_string!("form-item form-item-", name, " form-type-date"), + Some(concat_string!("edit-", name)) ), None => ( "form-item form-type-date".to_owned(), @@ -57,35 +57,33 @@ impl PageComponent for Date { }; html! { div class=(class) { - @if self.label.has_value() { - label class="form-label" for=[&id] { - (self.label.value()) " " - @if self.required.has_value() { - span + @match self.label() { + Some(label) => label class="form-label" for=[&id] { + (label) " " + @match self.required() { + Some(_) => span class="form-required" - title="Este campo es obligatorio." - { - "*" - } " " + title="Este campo es obligatorio." { "*" } " ", + None => {} } - } + }, + None => {} } input type="date" - id=[&id] + id=[id] class="form-control" - name=[&self.name.option()] - value=[&self.value.option()] - placeholder=[&self.placeholder.option()] - autofocus=[&self.autofocus.option()] - autocomplete=[&self.autocomplete.option()] - readonly=[&self.readonly.option()] - required=[&self.required.option()] - disabled=[&self.disabled.option()]; - @if self.help_text.has_value() { - div class="form-text" { - (self.help_text.value()) - } + name=[self.name()] + value=[self.value()] + placeholder=[self.placeholder()] + autofocus=[self.autofocus()] + autocomplete=[self.autocomplete()] + readonly=[self.readonly()] + required=[self.required()] + disabled=[self.disabled()]; + @match self.help_text() { + Some(help_text) => div class="form-text" { (help_text) }, + None => {} } } } @@ -126,7 +124,7 @@ impl Date { self } - pub fn autofocus(mut self, toggle: bool) -> Self { + pub fn with_autofocus(mut self, toggle: bool) -> Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -134,7 +132,7 @@ impl Date { self } - pub fn autocomplete(mut self, toggle: bool) -> Self { + pub fn with_autocomplete(mut self, toggle: bool) -> Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -142,7 +140,7 @@ impl Date { self } - pub fn disabled(mut self, toggle: bool) -> Self { + pub fn with_disabled(mut self, toggle: bool) -> Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -150,7 +148,7 @@ impl Date { self } - pub fn readonly(mut self, toggle: bool) -> Self { + pub fn with_readonly(mut self, toggle: bool) -> Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -158,7 +156,7 @@ impl Date { self } - pub fn required(mut self, toggle: bool) -> Self { + pub fn with_required(mut self, toggle: bool) -> Self { self.required.with_value(match toggle { true => "required", false => "", @@ -178,44 +176,44 @@ impl Date { // Date GETTERS. - pub fn name(&self) -> &str { - self.name.value() + pub fn name(&self) -> &Option<String> { + self.name.option() } - pub fn value(&self) -> &str { - self.value.value() + pub fn value(&self) -> &Option<String> { + self.value.option() } - pub fn label(&self) -> &str { - self.label.value() + pub fn label(&self) -> &Option<String> { + self.label.option() } - pub fn placeholder(&self) -> &str { - self.placeholder.value() + pub fn placeholder(&self) -> &Option<String> { + self.placeholder.option() } - pub fn has_autofocus(&self) -> bool { - self.autofocus.has_value() + pub fn autofocus(&self) -> &Option<String> { + self.autofocus.option() } - pub fn has_autocomplete(&self) -> bool { - !self.autocomplete.has_value() + pub fn autocomplete(&self) -> &Option<String> { + self.autocomplete.option() } - pub fn is_disabled(&self) -> bool { - self.disabled.has_value() + pub fn disabled(&self) -> &Option<String> { + self.disabled.option() } - pub fn is_readonly(&self) -> bool { - self.readonly.has_value() + pub fn readonly(&self) -> &Option<String> { + self.readonly.option() } - pub fn is_required(&self) -> bool { - self.required.has_value() + pub fn required(&self) -> &Option<String> { + self.required.option() } - pub fn help_text(&self) -> &str { - self.help_text.value() + pub fn help_text(&self) -> &Option<String> { + self.help_text.option() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 385dd369..5ecea5e0 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -7,8 +7,8 @@ pub struct Form { weight : i8, id : OptIden, action : OptAttr, - method : FormMethod, charset : OptAttr, + method : FormMethod, elements : PageContainer, template : String, } @@ -21,8 +21,8 @@ impl PageComponent for Form { weight : 0, id : OptIden::none(), action : OptAttr::none(), - method : FormMethod::Post, charset : OptAttr::some("UTF-8"), + method : FormMethod::Post, elements : PageContainer::new(), template : "default".to_owned(), } @@ -37,19 +37,19 @@ impl PageComponent for Form { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - let method = match self.method { + let method = match self.method() { FormMethod::Get => None, FormMethod::Post => Some("post".to_owned()) }; html! { form - id=[&self.id.option()] - action=[&self.action.option()] + id=[self.id()] + action=[self.action()] method=[method] - accept-charset=[&self.charset.option()] + accept-charset=[self.charset()] { div { - (self.elements.render(assets)) + (self.render_elements(assets)) } } } @@ -80,13 +80,13 @@ impl Form { self } - pub fn with_method(mut self, method: FormMethod) -> Self { - self.method = method; + pub fn with_charset(mut self, charset: &str) -> Self { + self.charset.with_value(charset); self } - pub fn with_charset(mut self, charset: &str) -> Self { - self.charset.with_value(charset); + pub fn with_method(mut self, method: FormMethod) -> Self { + self.method = method; self } @@ -102,28 +102,31 @@ impl Form { // Form GETTERS. - pub fn id(&self) -> &str { - self.id.value() + pub fn id(&self) -> &Option<String> { + self.id.option() } - pub fn action(&self) -> &str { - self.action.value() + pub fn action(&self) -> &Option<String> { + self.action.option() } - pub fn method(&self) -> &str { - match &self.method { - FormMethod::Get => "get", - FormMethod::Post => "post" - } + pub fn charset(&self) -> &Option<String> { + self.charset.option() } - pub fn charset(&self) -> &str { - self.charset.value() + pub fn method(&self) -> &FormMethod { + &self.method } pub fn template(&self) -> &str { self.template.as_str() } + + // Form EXTRAS. + + pub fn render_elements(&self, assets: &mut PageAssets) -> Markup { + html! { (self.elements.render(assets)) } + } } fn always() -> bool { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index b7eca015..636d034e 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,18 +1,18 @@ use crate::prelude::*; pub struct Hidden { - weight : i8, - name : OptIden, - value : OptAttr, + weight: i8, + name : OptIden, + value : OptAttr, } impl PageComponent for Hidden { fn new() -> Self { Hidden { - weight : 0, - name : OptIden::none(), - value : OptAttr::none(), + weight: 0, + name : OptIden::none(), + value : OptAttr::none(), } } @@ -21,16 +21,12 @@ impl PageComponent for Hidden { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let id = match self.name.option() { - Some(name) => Some(format!("value-{}", name)), + let id = match self.name() { + Some(name) => Some(concat_string!("value-", name)), _ => None }; html! { - input - type="hidden" - id=[&id] - name=[&self.name.option()] - value=[&self.value.option()]; + input type="hidden" id=[id] name=[self.name()] value=[self.value()]; } } } @@ -60,11 +56,11 @@ impl Hidden { // Hidden GETTERS. - pub fn name(&self) -> &str { - self.name.value() + pub fn name(&self) -> &Option<String> { + self.name.option() } - pub fn value(&self) -> &str { - self.value.value() + pub fn value(&self) -> &Option<String> { + self.value.option() } } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 7622fd08..7dded20f 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -enum InputType {Email, Password, Search, Telephone, Textfield, Url} +pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} pub struct Input { renderable : fn() -> bool, @@ -55,7 +55,7 @@ impl PageComponent for Input { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (type_input, type_class) = match &self.input_type { + let (type_input, type_class) = match self.input_type() { InputType::Email => ("email", "form-type-email"), InputType::Password => ("password", "form-type-password"), InputType::Search => ("search", "form-type-search"), @@ -63,50 +63,48 @@ impl PageComponent for Input { InputType::Textfield => ("text", "form-type-textfield"), InputType::Url => ("url", "form-type-url") }; - let (class, id) = match &self.name.option() { + let (class, id) = match self.name() { Some(name) => ( - format!("form-item form-item-{} {}", name, type_class), - Some(format!("edit-{}", name)) + concat_string!("form-item form-item-", name, " ", type_class), + Some(concat_string!("edit-", name)) ), None => ( - format!("form-item {}", type_class), + concat_string!("form-item ", type_class), None ) }; html! { div class=(class) { - @if self.label.has_value() { - label class="form-label" for=[&id] { - (self.label.value()) " " - @if self.required.has_value() { - span + @match self.label() { + Some(label) => label class="form-label" for=[&id] { + (label) " " + @match self.required() { + Some(_) => span class="form-required" - title="Este campo es obligatorio." - { - "*" - } " " + title="Este campo es obligatorio." { "*" } " ", + None => {} } - } + }, + None => {} } input type=(type_input) - id=[&id] + id=[id] class="form-control" - name=[&self.name.option()] - value=[&self.value.option()] - size=[self.size] - minlength=[self.minlength] - maxlength=[self.maxlength] - placeholder=[&self.placeholder.option()] - autofocus=[&self.autofocus.option()] - autocomplete=[&self.autocomplete.option()] - readonly=[&self.readonly.option()] - required=[&self.required.option()] - disabled=[&self.disabled.option()]; - @if self.help_text.has_value() { - div class="form-text" { - (self.help_text.value()) - } + name=[self.name()] + value=[self.value()] + size=[self.size()] + minlength=[self.minlength()] + maxlength=[self.maxlength()] + placeholder=[self.placeholder()] + autofocus=[self.autofocus()] + autocomplete=[self.autocomplete()] + readonly=[self.readonly()] + required=[self.required()] + disabled=[self.disabled()]; + @match self.help_text() { + Some(help_text) => div class="form-text" { (help_text) }, + None => {} } } } @@ -196,7 +194,7 @@ impl Input { self } - pub fn autofocus(mut self, toggle: bool) -> Self { + pub fn with_autofocus(mut self, toggle: bool) -> Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -204,7 +202,7 @@ impl Input { self } - pub fn autocomplete(mut self, toggle: bool) -> Self { + pub fn with_autocomplete(mut self, toggle: bool) -> Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -212,7 +210,7 @@ impl Input { self } - pub fn disabled(mut self, toggle: bool) -> Self { + pub fn with_disabled(mut self, toggle: bool) -> Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -220,7 +218,7 @@ impl Input { self } - pub fn readonly(mut self, toggle: bool) -> Self { + pub fn with_readonly(mut self, toggle: bool) -> Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -228,7 +226,7 @@ impl Input { self } - pub fn required(mut self, toggle: bool) -> Self { + pub fn with_required(mut self, toggle: bool) -> Self { self.required.with_value(match toggle { true => "required", false => "", @@ -248,16 +246,20 @@ impl Input { // Input GETTERS. - pub fn name(&self) -> &str { - self.name.value() + pub fn input_type(&self) -> &InputType { + &self.input_type } - pub fn value(&self) -> &str { - self.value.value() + pub fn name(&self) -> &Option<String> { + self.name.option() } - pub fn label(&self) -> &str { - self.label.value() + pub fn value(&self) -> &Option<String> { + self.value.option() + } + + pub fn label(&self) -> &Option<String> { + self.label.option() } pub fn size(&self) -> Option<u16> { @@ -272,32 +274,32 @@ impl Input { self.maxlength } - pub fn placeholder(&self) -> &str { - self.placeholder.value() + pub fn placeholder(&self) -> &Option<String> { + self.placeholder.option() } - pub fn has_autofocus(&self) -> bool { - self.autofocus.has_value() + pub fn autofocus(&self) -> &Option<String> { + self.autofocus.option() } - pub fn has_autocomplete(&self) -> bool { - !self.autocomplete.has_value() + pub fn autocomplete(&self) -> &Option<String> { + self.autocomplete.option() } - pub fn is_disabled(&self) -> bool { - self.disabled.has_value() + pub fn disabled(&self) -> &Option<String> { + self.disabled.option() } - pub fn is_readonly(&self) -> bool { - self.readonly.has_value() + pub fn readonly(&self) -> &Option<String> { + self.readonly.option() } - pub fn is_required(&self) -> bool { - self.required.has_value() + pub fn required(&self) -> &Option<String> { + self.required.option() } - pub fn help_text(&self) -> &str { - self.help_text.value() + pub fn help_text(&self) -> &Option<String> { + self.help_text.option() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/mod.rs b/pagetop/src/base/component/form/mod.rs index 4e10d476..23b965e9 100644 --- a/pagetop/src/base/component/form/mod.rs +++ b/pagetop/src/base/component/form/mod.rs @@ -2,10 +2,10 @@ mod form; pub use form::{Form, FormMethod}; mod input; -pub use input::Input; +pub use input::{Input, InputType}; mod hidden; pub use hidden::Hidden; mod date; pub use date::Date; mod button; -pub use button::Button; +pub use button::{Button, ButtonType}; diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 19eb577b..6d3a7b19 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -32,8 +32,8 @@ impl PageComponent for Column { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[&self.id.option()] class=[&self.classes.option()] { - (self.components.render(assets)) + div id=[self.id()] class=[self.classes()] { + (self.render_components(assets)) } } } @@ -75,13 +75,23 @@ impl Column { // Column GETTERS. - pub fn id(&self) -> &str { - self.id.value() + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } + + // Column EXTRAS. + + pub fn render_components(&self, assets: &mut PageAssets) -> Markup { + html! { (self.components.render(assets)) } + } } fn always() -> bool { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 53719e3f..b1bb2c24 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -32,8 +32,8 @@ impl PageComponent for Row { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[&self.id.option()] class=[&self.classes.option()] { - (self.columns.render(assets)) + div id=[self.id()] class=[self.classes()] { + (self.render_columns(assets)) } } } @@ -75,13 +75,23 @@ impl Row { // Row GETTERS. - pub fn id(&self) -> &str { - self.id.value() + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } + + // Row EXTRAS. + + pub fn render_columns(&self, assets: &mut PageAssets) -> Markup { + html! { (self.columns.render(assets)) } + } } fn always() -> bool { diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index b330b374..799aab63 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub struct Image { renderable: fn() -> bool, weight : i8, - source : Option<String>, + source : OptAttr, template : String, } @@ -13,7 +13,7 @@ impl PageComponent for Image { Image { renderable: always, weight : 0, - source : None, + source : OptAttr::none(), template : "default".to_owned(), } } @@ -28,7 +28,7 @@ impl PageComponent for Image { fn default_render(&self, _: &mut PageAssets) -> Markup { html! { - img src=[&self.source] class="img-fluid" {} + img src=[self.source()] class="img-fluid"; } } } @@ -36,9 +36,7 @@ impl PageComponent for Image { impl Image { pub fn image(source: &str) -> Self { - let mut i = Image::new(); - i.source = Some(source.to_owned()); - i + Image::new().with_source(source) } // Image BUILDER. @@ -53,6 +51,11 @@ impl Image { self } + pub fn with_source(mut self, source: &str) -> Self { + self.source.with_value(source); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self @@ -60,6 +63,10 @@ impl Image { // Image GETTERS. + pub fn source(&self) -> &Option<String> { + self.source.option() + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 0f529874..253cd3d8 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,12 +1,13 @@ use crate::prelude::*; -enum MenuItemType { +pub enum MenuItemType { Label(String), Link(String, String), LinkBlank(String, String), Html(Markup), Separator, Submenu(String, Menu), + Void, } // ----------------------------------------------------------------------------- @@ -16,7 +17,7 @@ enum MenuItemType { pub struct MenuItem { renderable: fn() -> bool, weight : i8, - item_type : Option<MenuItemType>, + item_type : MenuItemType, } impl PageComponent for MenuItem { @@ -25,7 +26,7 @@ impl PageComponent for MenuItem { MenuItem { renderable: always, weight : 0, - item_type : None, + item_type : MenuItemType::Void, } } @@ -38,22 +39,22 @@ impl PageComponent for MenuItem { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - match &self.item_type { - Some(MenuItemType::Label(label)) => html! { + match self.item_type() { + MenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } }, - Some(MenuItemType::Link(label, path)) => html! { + MenuItemType::Link(label, path) => html! { li class="link" { a href=(path) { (label) } } }, - Some(MenuItemType::LinkBlank(label, path)) => html! { + MenuItemType::LinkBlank(label, path) => html! { li class="link_blank" { a href=(path) target="_blank" { (label) } } }, - Some(MenuItemType::Html(html)) => html! { + MenuItemType::Html(html) => html! { li class="html" { (*html) } }, - Some(MenuItemType::Submenu(label, menu)) => html! { + MenuItemType::Submenu(label, menu) => html! { li class="submenu" { a href="#" { (label) } ul { @@ -61,10 +62,10 @@ impl PageComponent for MenuItem { } } }, - Some(MenuItemType::Separator) => html! { + MenuItemType::Separator => html! { li class="separator" { } }, - None => html! {} + MenuItemType::Void => html! {}, } } } @@ -75,7 +76,7 @@ impl MenuItem { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::Label(label.to_owned())), + item_type : MenuItemType::Label(label.to_owned()), } } @@ -83,10 +84,10 @@ impl MenuItem { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::Link( + item_type : MenuItemType::Link( label.to_owned(), path.to_owned(), - )), + ), } } @@ -94,10 +95,10 @@ impl MenuItem { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::LinkBlank( + item_type : MenuItemType::LinkBlank( label.to_owned(), path.to_owned(), - )), + ), } } @@ -105,7 +106,7 @@ impl MenuItem { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::Html(html)), + item_type : MenuItemType::Html(html), } } @@ -113,7 +114,7 @@ impl MenuItem { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::Separator), + item_type : MenuItemType::Separator, } } @@ -121,10 +122,10 @@ impl MenuItem { MenuItem { renderable: always, weight : 0, - item_type : Some(MenuItemType::Submenu( + item_type : MenuItemType::Submenu( label.to_owned(), menu - )), + ), } } @@ -139,6 +140,12 @@ impl MenuItem { self.weight = weight; self } + + // MenuItem GETTERS. + + pub fn item_type(&self) -> &MenuItemType { + &self.item_type + } } // ----------------------------------------------------------------------------- @@ -186,7 +193,7 @@ impl PageComponent for Menu { )) .add_jquery(); - let id = assets.serial_id(self.name(), self.id.value()); + let id = assets.serial_id(self.name(), self.id()); html! { ul id=(id) class="sm sm-clean" { (self.render_items(assets)) @@ -232,8 +239,8 @@ impl Menu { // Menu GETTERS. - pub fn id(&self) -> &str { - self.id.value() + pub fn id(&self) -> &Option<String> { + self.id.option() } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/base/component/mod.rs index 4619c937..b4e646b9 100644 --- a/pagetop/src/base/component/mod.rs +++ b/pagetop/src/base/component/mod.rs @@ -1,5 +1,5 @@ mod container; -pub use container::Container; +pub use container::{Container, ContainerType}; pub mod grid; @@ -10,7 +10,7 @@ pub use block::Block; mod image; pub use image::Image; mod menu; -pub use menu::{Menu, MenuItem}; +pub use menu::{Menu, MenuItem, MenuItemType}; pub mod form; pub use form::{Form, FormMethod}; diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index c9fc9cc0..489b6d3b 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -140,7 +140,7 @@ fn just_visiting() -> Chunck { span { (l("visiting_title")) } - br {} + br; (l("visiting_subtitle")) } p { (l("visiting_text1")) } diff --git a/pagetop/src/html/optattr.rs b/pagetop/src/html/optattr.rs index 3eed9aab..a76f33b7 100644 --- a/pagetop/src/html/optattr.rs +++ b/pagetop/src/html/optattr.rs @@ -19,17 +19,6 @@ impl OptAttr { }; } - pub fn value(&self) -> &str { - match &self.0 { - Some(value) => value.as_str(), - None => "", - } - } - - pub fn has_value(&self) -> bool { - self.0 != None - } - pub fn option(&self) -> &Option<String> { &self.0 } diff --git a/pagetop/src/html/optiden.rs b/pagetop/src/html/optiden.rs index 93caf18a..ec46acf1 100644 --- a/pagetop/src/html/optiden.rs +++ b/pagetop/src/html/optiden.rs @@ -19,17 +19,6 @@ impl OptIden { }; } - pub fn value(&self) -> &str { - match &self.0 { - Some(id) => id.as_str(), - None => "", - } - } - - pub fn has_value(&self) -> bool { - self.0 != None - } - pub fn option(&self) -> &Option<String> { &self.0 } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 731271d3..42ad192a 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,8 +1,11 @@ +// Exports. + +pub use concat_string::concat_string; +pub use doc_comment::doc_comment; +pub use once_cell::sync::Lazy; + // Local. -pub(crate) use concat_string::concat_string; -pub(crate) use doc_comment::doc_comment; -pub(crate) use once_cell::sync::Lazy; pub(crate) use futures::executor::block_on as run_now; // ----------------------------------------------------------------------------- diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 7c2e9ef3..429c9449 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -3,6 +3,7 @@ // Macros. pub use crate::{ args, + concat_string, theme_static_files, }; diff --git a/pagetop/src/response/page/assets.rs b/pagetop/src/response/page/assets.rs index ffc566ea..3d42a06f 100644 --- a/pagetop/src/response/page/assets.rs +++ b/pagetop/src/response/page/assets.rs @@ -1,4 +1,4 @@ -use crate::{Lazy, base}; +use crate::{Lazy, base, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, PreEscaped, html}; use crate::theme::*; @@ -289,18 +289,19 @@ impl PageAssets { // Assets EXTRAS. - pub fn serial_id(&mut self, prefix: &str, id: &str) -> String { - if id.is_empty() { - let prefix = prefix.trim().replace(" ", "_").to_lowercase(); - let prefix = if prefix.is_empty() { - "prefix".to_owned() - } else { - prefix - }; - self.id_counter += 1; - [prefix, self.id_counter.to_string()].join("-") - } else { - id.to_owned() + pub fn serial_id(&mut self, prefix: &str, id: &Option<String>) -> String { + match id { + Some(id) => id.to_string(), + None => { + let prefix = prefix.trim().replace(" ", "_").to_lowercase(); + let prefix = if prefix.is_empty() { + "prefix".to_owned() + } else { + prefix + }; + self.id_counter += 1; + concat_string!(prefix, "-", self.id_counter.to_string()) + } } } } diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index fedf05e4..50ff3040 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -122,20 +122,20 @@ impl<'a> Page<'a> { // Page GETTERS. - pub fn language(&self) -> &str { - self.language.value() + pub fn language(&self) -> &Option<String> { + self.language.option() } - pub fn direction(&self) -> &str { - self.direction.value() + pub fn direction(&self) -> &Option<String> { + self.direction.option() } - pub fn title(&self) -> &str { - self.title.value() + pub fn title(&self) -> &Option<String> { + self.title.option() } - pub fn description(&self) -> &str { - self.description.value() + pub fn description(&self) -> &Option<String> { + self.description.option() } pub fn body_classes(&mut self) -> &str { @@ -165,7 +165,7 @@ impl<'a> Page<'a> { // Finalmente, renderizar la página. return Ok(html! { (DOCTYPE) - html lang=[&self.language.option()] dir=[&self.direction.option()] { + html lang=[self.language()] dir=[self.direction()] { (head) (body) } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 15f6566e..51b1d4c8 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -1,4 +1,4 @@ -use crate::app; +use crate::{app, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::response::page::{Favicon, Page, PageAssets, PageComponent}; @@ -28,22 +28,21 @@ pub trait ThemeTrait: Send + Sync { } fn render_page_head(&self, page: &mut Page) -> Markup { - let title = page.title(); - let title = if title.is_empty() { - SETTINGS.app.name.to_owned() - } else { - [SETTINGS.app.name.to_string(), title.to_string()].join(" | ") - }; - let description = page.description(); let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { head { meta charset="utf-8"; - title { (title) } + @match page.title() { + Some(t) => title { + (concat_string!(SETTINGS.app.name, " | ", t)) + }, + None => title { (SETTINGS.app.name) } + } - @if !description.is_empty() { - meta name="description" content=(description); + @match page.description() { + Some(d) => meta name="description" content=(d);, + None => {} } meta http-equiv="X-UA-Compatible" content="IE=edge"; From 363cec7a75d0479bf89df8c71a1060b703178084 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 30 Mar 2022 23:48:11 +0200 Subject: [PATCH 043/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/src/base/component/block.rs | 40 ++++++++++++++------ pagetop/src/base/component/container.rs | 34 ++++++++++++----- pagetop/src/base/component/form/button.rs | 18 ++++++++- pagetop/src/base/component/form/date.rs | 20 +++++++++- pagetop/src/base/component/form/form.rs | 39 ++++++++++++++------ pagetop/src/base/component/form/input.rs | 16 ++++++++ pagetop/src/base/component/grid/column.rs | 29 ++++++++++----- pagetop/src/base/component/grid/row.rs | 29 ++++++++++----- pagetop/src/base/component/image.rs | 32 +++++++++++++++- pagetop/src/base/component/menu.rs | 26 ++++++++++--- pagetop/src/base/theme/bulmix/mod.rs | 26 +++++++++++++ pagetop/src/html/classes.rs | 45 +++++------------------ pagetop/src/html/optattr.rs | 5 ++- pagetop/src/html/optiden.rs | 5 ++- pagetop/src/response/page/page.rs | 27 ++++++++------ pagetop/src/theme/definition.rs | 6 +-- 17 files changed, 284 insertions(+), 115 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 01eb60ec..8598de96 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 976c27bc..fdf9922d 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -3,9 +3,10 @@ use crate::prelude::*; pub struct Block { renderable: fn() -> bool, weight : i8, - id : OptIden, title : OptAttr, html : Vec<Markup>, + id : OptIden, + classes : Classes, template : String, } @@ -15,9 +16,10 @@ impl PageComponent for Block { Block { renderable: always, weight : 0, - id : OptIden::none(), title : OptAttr::none(), html : Vec::new(), + id : OptIden::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -33,7 +35,7 @@ impl PageComponent for Block { fn default_render(&self, assets: &mut PageAssets) -> Markup { let id = assets.serial_id(self.name(), self.id()); html! { - div id=(id) class="block" { + div id=(id) class=[self.classes("block")] { @match self.title() { Some(title) => h2 class="block-title" { (title) }, None => {} @@ -66,11 +68,6 @@ impl Block { self } - pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); - self - } - pub fn with_title(mut self, title: &str) -> Self { self.title.with_value(title); self @@ -81,6 +78,21 @@ impl Block { self } + pub fn with_id(mut self, id: &str) -> Self { + self.id.with_value(id); + self + } + + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self @@ -88,10 +100,6 @@ impl Block { // Block GETTERS. - pub fn id(&self) -> &Option<String> { - self.id.option() - } - pub fn title(&self) -> &Option<String> { self.title.option() } @@ -100,6 +108,14 @@ impl Block { &self.html } + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index cba905d6..94003ae0 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -6,8 +6,9 @@ pub struct Container { renderable: fn() -> bool, weight : i8, container : ContainerType, - id : OptIden, components: PageContainer, + id : OptIden, + classes : Classes, template : String, } @@ -18,8 +19,9 @@ impl PageComponent for Container { renderable: always, weight : 0, container : ContainerType::Wrapper, - id : OptIden::none(), components: PageContainer::new(), + id : OptIden::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -35,35 +37,35 @@ impl PageComponent for Container { fn default_render(&self, assets: &mut PageAssets) -> Markup { match self.container_type() { ContainerType::Header => html! { - header id=[self.id()] class="header" { + header id=[self.id()] class=[self.classes("header")] { div class="container" { (self.render_components(assets)) } } }, ContainerType::Footer => html! { - footer id=[self.id()] class="footer" { + footer id=[self.id()] class=[self.classes("footer")] { div class="container" { (self.render_components(assets)) } } }, ContainerType::Main => html! { - main id=[self.id()] class="main" { + main id=[self.id()] class=[self.classes("main")] { div class="container" { (self.render_components(assets)) } } }, ContainerType::Section => html! { - section id=[self.id()] class="section" { + section id=[self.id()] class=[self.classes("section")] { div class="container" { (self.render_components(assets)) } } }, _ => html! { - div id=[self.id()] class="container" { + div id=[self.id()] class=[self.classes("container")] { (self.render_components(assets)) } } @@ -109,13 +111,23 @@ impl Container { self } + pub fn add(mut self, component: impl PageComponent) -> Self { + self.components.add(component); + self + } + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn add(mut self, component: impl PageComponent) -> Self { - self.components.add(component); + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); self } @@ -134,6 +146,10 @@ impl Container { self.id.option() } + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index fbe25738..b2f59609 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -10,6 +10,7 @@ pub struct Button { value : OptAttr, autofocus : OptAttr, disabled : OptAttr, + classes : Classes, template : String, } @@ -24,6 +25,7 @@ impl PageComponent for Button { value : OptAttr::none(), autofocus : OptAttr::none(), disabled : OptAttr::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -50,7 +52,7 @@ impl PageComponent for Button { button type=(button_type) id=[id] - class=(button_class) + class=[self.classes(button_class)] name=[self.name()] value=[self.value()] autofocus=[self.autofocus()] @@ -121,6 +123,16 @@ impl Button { self } + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self @@ -148,6 +160,10 @@ impl Button { self.disabled.option() } + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 906f5bbc..f1270a82 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -13,6 +13,7 @@ pub struct Date { readonly : OptAttr, required : OptAttr, help_text : OptAttr, + classes : Classes, template : String, } @@ -32,6 +33,7 @@ impl PageComponent for Date { readonly : OptAttr::none(), required : OptAttr::none(), help_text : OptAttr::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -45,7 +47,7 @@ impl PageComponent for Date { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (class, id) = match self.name() { + let (classes, id) = match self.name() { Some(name) => ( concat_string!("form-item form-item-", name, " form-type-date"), Some(concat_string!("edit-", name)) @@ -56,7 +58,7 @@ impl PageComponent for Date { ) }; html! { - div class=(class) { + div class=[self.classes(classes.as_str())] { @match self.label() { Some(label) => label class="form-label" for=[&id] { (label) " " @@ -169,6 +171,16 @@ impl Date { self } + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self @@ -216,6 +228,10 @@ impl Date { self.help_text.option() } + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 5ecea5e0..c4d8e206 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -5,11 +5,12 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, weight : i8, - id : OptIden, action : OptAttr, charset : OptAttr, method : FormMethod, elements : PageContainer, + id : OptIden, + classes : Classes, template : String, } @@ -19,11 +20,12 @@ impl PageComponent for Form { Form { renderable: always, weight : 0, - id : OptIden::none(), action : OptAttr::none(), charset : OptAttr::some("UTF-8"), method : FormMethod::Post, elements : PageContainer::new(), + id : OptIden::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -44,6 +46,7 @@ impl PageComponent for Form { html! { form id=[self.id()] + class=[self.classes("form")] action=[self.action()] method=[method] accept-charset=[self.charset()] @@ -70,11 +73,6 @@ impl Form { self } - pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); - self - } - pub fn with_action(mut self, action: &str) -> Self { self.action.with_value(action); self @@ -95,6 +93,21 @@ impl Form { self } + pub fn with_id(mut self, id: &str) -> Self { + self.id.with_value(id); + self + } + + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self @@ -102,10 +115,6 @@ impl Form { // Form GETTERS. - pub fn id(&self) -> &Option<String> { - self.id.option() - } - pub fn action(&self) -> &Option<String> { self.action.option() } @@ -118,6 +127,14 @@ impl Form { &self.method } + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 7dded20f..2e1af61d 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -19,6 +19,7 @@ pub struct Input { readonly : OptAttr, required : OptAttr, help_text : OptAttr, + classes : Classes, template : String, } @@ -42,6 +43,7 @@ impl PageComponent for Input { readonly : OptAttr::none(), required : OptAttr::none(), help_text : OptAttr::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -239,6 +241,16 @@ impl Input { self } + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self @@ -302,6 +314,10 @@ impl Input { self.help_text.option() } + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 6d3a7b19..f5bc4669 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -3,9 +3,9 @@ use crate::prelude::*; pub struct Column { renderable: fn() -> bool, weight : i8, + components: PageContainer, id : OptIden, classes : Classes, - components: PageContainer, template : String, } @@ -15,13 +15,17 @@ impl PageComponent for Column { Column { renderable: always, weight : 0, - id : OptIden::none(), - classes : Classes::some(vec!["col"]), components: PageContainer::new(), + id : OptIden::none(), + classes : Classes::none(), template : "default".to_owned(), } } + fn name(&self) -> &'static str { + "GridColumn" + } + fn is_renderable(&self) -> bool { (self.renderable)() } @@ -32,7 +36,7 @@ impl PageComponent for Column { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[self.id()] class=[self.classes()] { + div id=[self.id()] class=[self.classes("col")] { (self.render_components(assets)) } } @@ -53,18 +57,23 @@ impl Column { self } + pub fn add(mut self, component: impl PageComponent) -> Self { + self.components.add(component); + self + } + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn add_classes(mut self, classes: Vec<&str>) -> Self { - self.classes.add_classes(classes); + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); self } - pub fn add(mut self, component: impl PageComponent) -> Self { - self.components.add(component); + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); self } @@ -79,8 +88,8 @@ impl Column { self.id.option() } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index b1bb2c24..8437c1fe 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -3,9 +3,9 @@ use crate::prelude::*; pub struct Row { renderable: fn() -> bool, weight : i8, + columns : PageContainer, id : OptIden, classes : Classes, - columns : PageContainer, template : String, } @@ -15,13 +15,17 @@ impl PageComponent for Row { Row { renderable: always, weight : 0, - id : OptIden::none(), - classes : Classes::some(vec!["row"]), columns : PageContainer::new(), + id : OptIden::none(), + classes : Classes::none(), template : "default".to_owned(), } } + fn name(&self) -> &'static str { + "GridRow" + } + fn is_renderable(&self) -> bool { (self.renderable)() } @@ -32,7 +36,7 @@ impl PageComponent for Row { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[self.id()] class=[self.classes()] { + div id=[self.id()] class=[self.classes("row")] { (self.render_columns(assets)) } } @@ -53,18 +57,23 @@ impl Row { self } + pub fn add_column(mut self, column: grid::Column) -> Self { + self.columns.add(column); + self + } + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn add_classes(mut self, classes: Vec<&str>) -> Self { - self.classes.add_classes(classes); + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); self } - pub fn add_column(mut self, column: grid::Column) -> Self { - self.columns.add(column); + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); self } @@ -79,8 +88,8 @@ impl Row { self.id.option() } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 799aab63..c324782a 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -4,6 +4,8 @@ pub struct Image { renderable: fn() -> bool, weight : i8, source : OptAttr, + id : OptIden, + classes : Classes, template : String, } @@ -14,6 +16,8 @@ impl PageComponent for Image { renderable: always, weight : 0, source : OptAttr::none(), + id : OptIden::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -28,7 +32,10 @@ impl PageComponent for Image { fn default_render(&self, _: &mut PageAssets) -> Markup { html! { - img src=[self.source()] class="img-fluid"; + img + src=[self.source()] + id=[self.id()] + class=[self.classes("img-fluid")]; } } } @@ -56,6 +63,21 @@ impl Image { self } + pub fn with_id(mut self, id: &str) -> Self { + self.id.with_value(id); + self + } + + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self @@ -67,6 +89,14 @@ impl Image { self.source.option() } + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 253cd3d8..91881908 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -155,8 +155,9 @@ impl MenuItem { pub struct Menu { renderable: fn() -> bool, weight : i8, - id : OptIden, items : PageContainer, + id : OptIden, + classes : Classes, template : String, } @@ -166,8 +167,9 @@ impl PageComponent for Menu { Menu { renderable: always, weight : 0, - id : OptIden::none(), items : PageContainer::new(), + id : OptIden::none(), + classes : Classes::none(), template : "default".to_owned(), } } @@ -195,7 +197,7 @@ impl PageComponent for Menu { let id = assets.serial_id(self.name(), self.id()); html! { - ul id=(id) class="sm sm-clean" { + ul id=(id) class=[self.classes("sm sm-clean")] { (self.render_items(assets)) } script type="text/javascript" defer { @@ -222,13 +224,23 @@ impl Menu { self } + pub fn add(mut self, item: MenuItem) -> Self { + self.items.add(item); + self + } + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn add(mut self, item: MenuItem) -> Self { - self.items.add(item); + pub fn set_classes(mut self, classes: &str) -> Self { + self.classes.set_classes(classes); + self + } + + pub fn add_classes(mut self, classes: &str) -> Self { + self.classes.add_classes(classes); self } @@ -243,6 +255,10 @@ impl Menu { self.id.option() } + pub fn classes(&self, default: &str) -> Option<String> { + self.classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index b8d57ba7..0e8a4d9b 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -31,4 +31,30 @@ impl ThemeTrait for BulmixTheme { ) .add_jquery(); } + + fn render_component( + &self, + component: &dyn PageComponent, + assets: &mut PageAssets + ) -> Option<Markup> { + match component.name() { + "GridRow" => { + let row = component.downcast_ref::<grid::Row>().unwrap(); + Some(html! { + div id=[row.id()] class=[row.classes("columns")] { + (row.render_columns(assets)) + } + }) + }, + "GridColumn" => { + let col = component.downcast_ref::<grid::Column>().unwrap(); + Some(html! { + div id=[col.id()] class=[col.classes("column")] { + (col.render_components(assets)) + } + }) + }, + _ => None + } + } } diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index c2a35984..6c41aafb 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,48 +1,23 @@ use crate::concat_string; -pub struct Classes(Option<String>); +pub struct Classes(String); impl Classes { pub fn none() -> Self { - Classes(None) + Classes("".to_owned()) } - pub fn some(classes: Vec<&str>) -> Self { - let mut c = Classes::none(); - c.add_classes(classes); - c + pub fn set_classes(&mut self, classes: &str) -> &mut Self { + self.0 = classes.to_owned(); + self } - pub fn add_classes(&mut self, classes: Vec<&str>) { - for class in classes.iter() { - self.add_class(class); - } + pub fn add_classes(&mut self, classes: &str) -> &mut Self { + self.0 = concat_string!(self.0, " ", classes).trim().to_owned(); + self } - fn add_class(&mut self, class: &str) { - let class = class.trim().replace(" ", "_"); - if !class.is_empty() { - match &self.0 { - None => self.0 = Some(class), - Some(classes) => if !classes.split(" ").any(|c| *c == class) { - self.0 = Some(concat_string!(classes, " ", class)) - } - } - } - } - - pub fn classes(&self) -> &str { - match &self.0 { - Some(classes) => classes.as_str(), - None => "", - } - } - - pub fn has_classes(&self) -> bool { - self.0 != None - } - - pub fn option(&self) -> &Option<String> { - &self.0 + pub fn option(&self, default: &str) -> Option<String> { + Some(concat_string!(default.to_owned(), " ", self.0).trim().to_owned()) } } diff --git a/pagetop/src/html/optattr.rs b/pagetop/src/html/optattr.rs index a76f33b7..d009e32e 100644 --- a/pagetop/src/html/optattr.rs +++ b/pagetop/src/html/optattr.rs @@ -6,17 +6,18 @@ impl OptAttr { } pub fn some(value: &str) -> Self { - let mut o = OptAttr::none(); + let mut o = OptAttr(None); o.with_value(value); o } - pub fn with_value(&mut self, value: &str) { + pub fn with_value(&mut self, value: &str) -> &mut Self { let value = value.trim(); self.0 = match value.is_empty() { true => None, false => Some(value.to_owned()), }; + self } pub fn option(&self) -> &Option<String> { diff --git a/pagetop/src/html/optiden.rs b/pagetop/src/html/optiden.rs index ec46acf1..52a65c10 100644 --- a/pagetop/src/html/optiden.rs +++ b/pagetop/src/html/optiden.rs @@ -6,17 +6,18 @@ impl OptIden { } pub fn some(id: &str) -> Self { - let mut o = OptIden::none(); + let mut o = OptIden(None); o.with_value(id); o } - pub fn with_value(&mut self, id: &str) { + pub fn with_value(&mut self, id: &str) -> &mut Self { let id = id.trim(); self.0 = match id.is_empty() { true => None, false => Some(id.replace(" ", "_")), }; + self } pub fn option(&self) -> &Option<String> { diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 50ff3040..cb561626 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -45,8 +45,8 @@ pub struct Page<'a> { title : OptAttr, description : OptAttr, assets : PageAssets, - body_classes: Classes, regions : HashMap<&'a str, PageContainer>, + body_classes: Classes, template : String, } @@ -64,9 +64,9 @@ impl<'a> Page<'a> { }, title : OptAttr::none(), description : OptAttr::none(), - body_classes: Classes::some(vec!["body"]), assets : PageAssets::new(), regions : COMPONENTS.read().unwrap().clone(), + body_classes: Classes::none(), template : "default".to_owned(), } } @@ -97,11 +97,6 @@ impl<'a> Page<'a> { self } - pub fn add_body_classes(&mut self, classes: Vec<&str>) -> &mut Self { - self.body_classes.add_classes(classes); - self - } - pub fn add_to( &mut self, region: &'a str, @@ -115,6 +110,16 @@ impl<'a> Page<'a> { self } + pub fn set_body_classes(&mut self, classes: &str) -> &mut Self { + self.body_classes.set_classes(classes); + self + } + + pub fn add_body_classes(&mut self, classes: &str) -> &mut Self { + self.body_classes.add_classes(classes); + self + } + pub fn using_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -138,14 +143,14 @@ impl<'a> Page<'a> { self.description.option() } - pub fn body_classes(&mut self) -> &str { - self.body_classes.classes() - } - pub fn assets(&mut self) -> &mut PageAssets { &mut self.assets } + pub fn body_classes(&self, default: &str) -> Option<String> { + self.body_classes.option(default) + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 51b1d4c8..acc30f47 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -55,7 +55,7 @@ pub trait ThemeTrait: Send + Sync { fn render_page_body(&self, page: &mut Page) -> Markup { html! { - body class=(page.body_classes()) { + body class=[page.body_classes("body")] { @match page.template() { "admin" => { @for region in &["top-menu", "side-menu", "content"] { @@ -85,8 +85,8 @@ pub trait ThemeTrait: Send + Sync { Cómo usarlo: match component.name() { - "block" => { - let block = component.downcast_mut::<Block>().unwrap(); + "Block" => { + let block = component.downcast_ref::<Block>().unwrap(); match block.template() { "default" => Some(block_default(block)), _ => None From 48fa9e9db9b4c3b5f564c828bb33891e30fd7842 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 31 Mar 2022 00:50:53 +0200 Subject: [PATCH 044/853] Modifica el renderizado de contenedores internos --- pagetop/src/base/component/container.rs | 20 +++++++++----------- pagetop/src/base/component/form/form.rs | 14 +++++--------- pagetop/src/base/component/menu.rs | 14 ++++++-------- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 94003ae0..24172d00 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -39,34 +39,34 @@ impl PageComponent for Container { ContainerType::Header => html! { header id=[self.id()] class=[self.classes("header")] { div class="container" { - (self.render_components(assets)) + (self.components().render(assets)) } } }, ContainerType::Footer => html! { footer id=[self.id()] class=[self.classes("footer")] { div class="container" { - (self.render_components(assets)) + (self.components().render(assets)) } } }, ContainerType::Main => html! { main id=[self.id()] class=[self.classes("main")] { div class="container" { - (self.render_components(assets)) + (self.components().render(assets)) } } }, ContainerType::Section => html! { section id=[self.id()] class=[self.classes("section")] { div class="container" { - (self.render_components(assets)) + (self.components().render(assets)) } } }, _ => html! { div id=[self.id()] class=[self.classes("container")] { - (self.render_components(assets)) + (self.components().render(assets)) } } } @@ -142,6 +142,10 @@ impl Container { &self.container } + pub fn components(&self) -> &PageContainer { + &self.components + } + pub fn id(&self) -> &Option<String> { self.id.option() } @@ -153,12 +157,6 @@ impl Container { pub fn template(&self) -> &str { self.template.as_str() } - - // Container EXTRAS. - - pub fn render_components(&self, assets: &mut PageAssets) -> Markup { - html! { (self.components.render(assets)) } - } } fn always() -> bool { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index c4d8e206..2d88d141 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -51,9 +51,7 @@ impl PageComponent for Form { method=[method] accept-charset=[self.charset()] { - div { - (self.render_elements(assets)) - } + div { (self.elements().render(assets)) } } } } @@ -127,6 +125,10 @@ impl Form { &self.method } + pub fn elements(&self) -> &PageContainer { + &self.elements + } + pub fn id(&self) -> &Option<String> { self.id.option() } @@ -138,12 +140,6 @@ impl Form { pub fn template(&self) -> &str { self.template.as_str() } - - // Form EXTRAS. - - pub fn render_elements(&self, assets: &mut PageAssets) -> Markup { - html! { (self.elements.render(assets)) } - } } fn always() -> bool { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 91881908..85b9007e 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -58,7 +58,7 @@ impl PageComponent for MenuItem { li class="submenu" { a href="#" { (label) } ul { - (menu.render_items(assets)) + (menu.items().render(assets)) } } }, @@ -198,7 +198,7 @@ impl PageComponent for Menu { let id = assets.serial_id(self.name(), self.id()); html! { ul id=(id) class=[self.classes("sm sm-clean")] { - (self.render_items(assets)) + (self.items().render(assets)) } script type="text/javascript" defer { "jQuery(function(){jQuery('#" (id) "').smartmenus({" @@ -251,6 +251,10 @@ impl Menu { // Menu GETTERS. + pub fn items(&self) -> &PageContainer { + &self.items + } + pub fn id(&self) -> &Option<String> { self.id.option() } @@ -262,12 +266,6 @@ impl Menu { pub fn template(&self) -> &str { self.template.as_str() } - - // Menu EXTRAS. - - pub fn render_items(&self, assets: &mut PageAssets) -> Markup { - html! { (self.items.render(assets)) } - } } fn always() -> bool { From cc579add5fecee236702fc9cab63b5ae5b9fb84c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 31 Mar 2022 21:05:54 +0200 Subject: [PATCH 045/853] Corrige API del grid --- pagetop/src/base/component/grid/column.rs | 12 +++++------- pagetop/src/base/component/grid/row.rs | 12 +++++------- pagetop/src/base/theme/bulmix/mod.rs | 4 ++-- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index f5bc4669..da1a76a9 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -37,7 +37,7 @@ impl PageComponent for Column { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { div id=[self.id()] class=[self.classes("col")] { - (self.render_components(assets)) + (self.components().render(assets)) } } } @@ -84,6 +84,10 @@ impl Column { // Column GETTERS. + pub fn components(&self) -> &PageContainer { + &self.components + } + pub fn id(&self) -> &Option<String> { self.id.option() } @@ -95,12 +99,6 @@ impl Column { pub fn template(&self) -> &str { self.template.as_str() } - - // Column EXTRAS. - - pub fn render_components(&self, assets: &mut PageAssets) -> Markup { - html! { (self.components.render(assets)) } - } } fn always() -> bool { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 8437c1fe..f4a5b6a5 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -37,7 +37,7 @@ impl PageComponent for Row { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { div id=[self.id()] class=[self.classes("row")] { - (self.render_columns(assets)) + (self.columns().render(assets)) } } } @@ -84,6 +84,10 @@ impl Row { // Row GETTERS. + pub fn columns(&self) -> &PageContainer { + &self.columns + } + pub fn id(&self) -> &Option<String> { self.id.option() } @@ -95,12 +99,6 @@ impl Row { pub fn template(&self) -> &str { self.template.as_str() } - - // Row EXTRAS. - - pub fn render_columns(&self, assets: &mut PageAssets) -> Markup { - html! { (self.columns.render(assets)) } - } } fn always() -> bool { diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 0e8a4d9b..284353c1 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -42,7 +42,7 @@ impl ThemeTrait for BulmixTheme { let row = component.downcast_ref::<grid::Row>().unwrap(); Some(html! { div id=[row.id()] class=[row.classes("columns")] { - (row.render_columns(assets)) + (row.columns().render(assets)) } }) }, @@ -50,7 +50,7 @@ impl ThemeTrait for BulmixTheme { let col = component.downcast_ref::<grid::Column>().unwrap(); Some(html! { div id=[col.id()] class=[col.classes("column")] { - (col.render_components(assets)) + (col.components().render(assets)) } }) }, From 69139f2a624545c5959bd748dd9f4cad757f47f2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 1 Apr 2022 19:15:01 +0200 Subject: [PATCH 046/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 2 -- pagetop/src/base/component/chunck.rs | 2 -- pagetop/src/base/component/container.rs | 2 -- pagetop/src/base/component/form/button.rs | 2 -- pagetop/src/base/component/form/date.rs | 1 - pagetop/src/base/component/form/form.rs | 1 - pagetop/src/base/component/form/hidden.rs | 2 -- pagetop/src/base/component/form/input.rs | 2 -- pagetop/src/base/component/grid/column.rs | 1 - pagetop/src/base/component/grid/row.rs | 1 - pagetop/src/base/component/image.rs | 2 -- pagetop/src/base/component/menu.rs | 3 --- 12 files changed, 21 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index fdf9922d..a1bf8745 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -11,7 +11,6 @@ pub struct Block { } impl PageComponent for Block { - fn new() -> Self { Block { renderable: always, @@ -51,7 +50,6 @@ impl PageComponent for Block { } impl Block { - pub fn with(html: Markup) -> Self { Block::new().add(html) } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 532584fc..dc909a89 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -8,7 +8,6 @@ pub struct Chunck { } impl PageComponent for Chunck { - fn new() -> Self { Chunck { renderable: always, @@ -36,7 +35,6 @@ impl PageComponent for Chunck { } impl Chunck { - pub fn with(html: Markup) -> Self { Chunck::new().add(html) } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 24172d00..b85288af 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -13,7 +13,6 @@ pub struct Container { } impl PageComponent for Container { - fn new() -> Self { Container { renderable: always, @@ -74,7 +73,6 @@ impl PageComponent for Container { } impl Container { - pub fn header() -> Self { let mut c = Container::new(); c.container = ContainerType::Header; diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index b2f59609..f99f06d3 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -15,7 +15,6 @@ pub struct Button { } impl PageComponent for Button { - fn new() -> Self { Button { renderable : always, @@ -68,7 +67,6 @@ impl PageComponent for Button { } impl Button { - pub fn button(value: &str) -> Self { Button::new().with_value(value) } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index f1270a82..40c2f784 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -18,7 +18,6 @@ pub struct Date { } impl PageComponent for Date { - fn new() -> Self { Date { renderable : always, diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 2d88d141..e5169ff3 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -15,7 +15,6 @@ pub struct Form { } impl PageComponent for Form { - fn new() -> Self { Form { renderable: always, diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 636d034e..f4734ba0 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -7,7 +7,6 @@ pub struct Hidden { } impl PageComponent for Hidden { - fn new() -> Self { Hidden { weight: 0, @@ -32,7 +31,6 @@ impl PageComponent for Hidden { } impl Hidden { - pub fn set(name: &str, value: &str) -> Self { Hidden::new().with_name(name).with_value(value) } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 2e1af61d..9d6e1afd 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -24,7 +24,6 @@ pub struct Input { } impl PageComponent for Input { - fn new() -> Self { Input { renderable : always, @@ -114,7 +113,6 @@ impl PageComponent for Input { } impl Input { - pub fn textfield() -> Self { Input::new() } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index da1a76a9..c8594642 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -10,7 +10,6 @@ pub struct Column { } impl PageComponent for Column { - fn new() -> Self { Column { renderable: always, diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index f4a5b6a5..03a39e39 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -10,7 +10,6 @@ pub struct Row { } impl PageComponent for Row { - fn new() -> Self { Row { renderable: always, diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index c324782a..1384f4df 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -10,7 +10,6 @@ pub struct Image { } impl PageComponent for Image { - fn new() -> Self { Image { renderable: always, @@ -41,7 +40,6 @@ impl PageComponent for Image { } impl Image { - pub fn image(source: &str) -> Self { Image::new().with_source(source) } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 85b9007e..daabdd60 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -21,7 +21,6 @@ pub struct MenuItem { } impl PageComponent for MenuItem { - fn new() -> Self { MenuItem { renderable: always, @@ -71,7 +70,6 @@ impl PageComponent for MenuItem { } impl MenuItem { - pub fn label(label: &str) -> Self { MenuItem { renderable: always, @@ -162,7 +160,6 @@ pub struct Menu { } impl PageComponent for Menu { - fn new() -> Self { Menu { renderable: always, From 53dd1f24c7cffe369be70aa71b90e8fe44d64f6f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 2 Apr 2022 09:21:43 +0200 Subject: [PATCH 047/853] =?UTF-8?q?A=C3=B1ade=20la=20funci=C3=B3n=20arc()?= =?UTF-8?q?=20para=20capturar=20el=20componente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recibe un componente mutable que podría modificarse justo antes de ser añadido a un contenedor. Es una posible solución para poder desarrollar un mecanismo aceptable de Triggers/Hooks/Actions (THA) para PageTop. --- pagetop-admin/src/summary.rs | 7 +++--- pagetop-user/src/lib.rs | 8 +++++-- pagetop/src/base/component/container.rs | 2 +- pagetop/src/base/component/form/form.rs | 2 +- pagetop/src/base/component/grid/column.rs | 2 +- pagetop/src/base/component/grid/row.rs | 2 +- pagetop/src/base/component/menu.rs | 2 +- pagetop/src/base/module/demopage/mod.rs | 28 ++++++++++++----------- pagetop/src/base/theme/bootsier/mod.rs | 2 +- pagetop/src/response/page/component.rs | 9 ++++++++ pagetop/src/response/page/container.rs | 12 ++++------ pagetop/src/response/page/mod.rs | 2 +- pagetop/src/response/page/page.rs | 6 ++--- pagetop/src/theme/definition.rs | 2 +- 14 files changed, 50 insertions(+), 36 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index b91b97fa..6e6f2158 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -38,17 +38,18 @@ pub async fn summary() -> app::Result<Markup> { .with_title("Admin") - .add_to("top-menu", top_menu) + .add_to("top-menu", top_menu.arc()) .add_to("content", grid::Row::new() .add_column(grid::Column::new() - .add(side_menu) + .add(side_menu.arc()) ) .add_column(grid::Column::new() .add(Chunck::with(html! { p { "Columna 2"} - })) + }).arc()) ) + .arc() ) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index dd0b362b..414fb3e4 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -31,7 +31,7 @@ impl ModuleTrait for UserModule { } } -fn form_login() -> impl PageComponent { +fn form_login() -> ArcComponent { Form::new() .with_id("user-login") .add(form::Input::textfield() @@ -41,13 +41,16 @@ fn form_login() -> impl PageComponent { "app" => SETTINGS.app.name.to_owned() ]).as_str()) .with_autofocus(true) + .arc() ) .add(form::Input::password() .with_name("pass") .with_label(l("password").as_str()) .with_help_text(l("password_help").as_str()) + .arc() ) - .add(form::Button::submit(l("login").as_str())) + .add(form::Button::submit(l("login").as_str()).arc()) + .arc() } async fn login() -> app::Result<Markup> { @@ -58,6 +61,7 @@ async fn login() -> app::Result<Markup> { .add_to("content", Container::new() .with_id("welcome") .add(form_login()) + .arc() ) .render() } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index b85288af..2e48ba10 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -109,7 +109,7 @@ impl Container { self } - pub fn add(mut self, component: impl PageComponent) -> Self { + pub fn add(mut self, component: ArcComponent) -> Self { self.components.add(component); self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index e5169ff3..9317f9eb 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -85,7 +85,7 @@ impl Form { self } - pub fn add(mut self, element: impl PageComponent) -> Self { + pub fn add(mut self, element: ArcComponent) -> Self { self.elements.add(element); self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index c8594642..a007c83b 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -56,7 +56,7 @@ impl Column { self } - pub fn add(mut self, component: impl PageComponent) -> Self { + pub fn add(mut self, component: ArcComponent) -> Self { self.components.add(component); self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 03a39e39..2a185894 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -57,7 +57,7 @@ impl Row { } pub fn add_column(mut self, column: grid::Column) -> Self { - self.columns.add(column); + self.columns.add(column.arc()); self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index daabdd60..3f2b4ff4 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -222,7 +222,7 @@ impl Menu { } pub fn add(mut self, item: MenuItem) -> Self { - self.items.add(item); + self.items.add(item.arc()); self } diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 489b6d3b..d71c7176 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -35,7 +35,7 @@ async fn demo() -> app::Result<Markup> { .render() } -fn hello_world() -> Container { +fn hello_world() -> ArcComponent { Container::header() .add(grid::Row::new() .add_column(grid::Column::new() @@ -68,15 +68,17 @@ fn hello_world() -> Container { i class="fas fa-paper-plane" {} "Get quote" } - })) + }).arc()) ) .add_column(grid::Column::new() - .add(Image::image("/bootsier/images/demo-header.svg")) + .add(Image::image("/bootsier/images/demo-header.svg").arc()) ) + .arc() ) + .arc() } -fn hello_world_original() -> Chunck { +fn hello_world_original() -> ArcComponent { Chunck::with(html! { header id="header" class="header" { div class="container" { @@ -121,10 +123,10 @@ fn hello_world_original() -> Chunck { } } } - }) + }).arc() } -fn just_visiting() -> Chunck { +fn just_visiting() -> ArcComponent { Chunck::with(html! { div id="details" class="basic-1" { div class="container" { @@ -151,10 +153,10 @@ fn just_visiting() -> Chunck { } } } - }) + }).arc() } -fn about_pagetop() -> Chunck { +fn about_pagetop() -> ArcComponent { Chunck::with(html! { div id="pagetop" class="basic-2" { div class="container" { @@ -175,10 +177,10 @@ fn about_pagetop() -> Chunck { } } } - }) + }).arc() } -fn promo_pagetop() -> Chunck { +fn promo_pagetop() -> ArcComponent { Chunck::with(html! { div id="promo" class="basic-3" { div class="container" { @@ -200,10 +202,10 @@ fn promo_pagetop() -> Chunck { } } } - }) + }).arc() } -fn reporting_problems() -> Chunck { +fn reporting_problems() -> ArcComponent { Chunck::with(html! { div id="reporting" class="basic-4" { div class="container" { @@ -223,5 +225,5 @@ fn reporting_problems() -> Chunck { } } } - }) + }).arc() } diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index 90111723..b169351d 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -77,7 +77,7 @@ impl ThemeTrait for BootsierTheme { } } } - })) + }).arc()) .render() } } diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 630b8a9b..b9a920d3 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -3,8 +3,11 @@ use crate::response::page::PageAssets; use downcast_rs::{Downcast, impl_downcast}; +use std::sync::Arc; use std::any::type_name; +pub type ArcComponent = Arc<dyn PageComponent>; + pub trait PageComponent: Downcast + Send + Sync { fn new() -> Self where Self: Sized; @@ -33,6 +36,12 @@ pub trait PageComponent: Downcast + Send + Sync { 0 } + #[allow(unused_mut)] + fn arc(mut self) -> ArcComponent where Self: Sized { + let component = self; + Arc::new(component) + } + #[allow(unused_variables)] fn default_render(&self, assets: &mut PageAssets) -> Markup { html! {} diff --git a/pagetop/src/response/page/container.rs b/pagetop/src/response/page/container.rs index 72287560..7e5d4953 100644 --- a/pagetop/src/response/page/container.rs +++ b/pagetop/src/response/page/container.rs @@ -1,24 +1,22 @@ use crate::html::{Markup, html}; -use crate::response::page::{PageAssets, PageComponent, render_component}; - -use std::sync::Arc; +use crate::response::page::{ArcComponent, PageAssets, render_component}; #[derive(Clone)] -pub struct PageContainer(Vec<Arc<dyn PageComponent>>); +pub struct PageContainer(Vec<ArcComponent>); impl PageContainer { pub fn new() -> Self { PageContainer(Vec::new()) } - pub fn new_with(component: impl PageComponent) -> Self { + pub fn new_with(component: ArcComponent) -> Self { let mut container = PageContainer::new(); container.add(component); container } - pub fn add(&mut self, component: impl PageComponent) { - self.0.push(Arc::new(component)); + pub fn add(&mut self, component: ArcComponent) { + self.0.push(component); } pub fn render(&self, assets: &mut PageAssets) -> Markup { diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index f34070e2..63c19a47 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -7,7 +7,7 @@ pub use assets::{ }; mod component; -pub use component::PageComponent; +pub use component::{ArcComponent, PageComponent}; mod container; pub use container::PageContainer; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index cb561626..5cbe80cb 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,7 +1,7 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::{Classes, DOCTYPE, Markup, OptAttr, html}; -use crate::response::page::{PageAssets, PageComponent, PageContainer}; +use crate::response::page::*; use std::sync::RwLock; use std::collections::HashMap; @@ -100,7 +100,7 @@ impl<'a> Page<'a> { pub fn add_to( &mut self, region: &'a str, - component: impl PageComponent + component: ArcComponent ) -> &mut Self { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); @@ -205,7 +205,7 @@ pub fn render_component( } } -pub fn add_component_to(region: &'static str, component: impl PageComponent) { +pub fn add_component_to(region: &'static str, component: ArcComponent) { let mut hmap = COMPONENTS.write().unwrap(); if let Some(regions) = hmap.get_mut(region) { regions.add(component); diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index acc30f47..db4c0e37 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -104,7 +104,7 @@ pub trait ThemeTrait: Send + Sync { div { h1 { (s) } } - })) + }).arc()) .render() } } From 4dd57eab4360f56a57f1caac1a4f2e69a2108cfa Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 4 Apr 2022 20:32:37 +0200 Subject: [PATCH 048/853] =?UTF-8?q?A=C3=B1ade=20referencias=20a=20todos=20?= =?UTF-8?q?los=20m=C3=A9todos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El proyecto compila, pendiente de una solución para los contenedores. --- pagetop-user/src/lib.rs | 8 ++--- pagetop/src/base/component/block.rs | 20 +++++++------ pagetop/src/base/component/chunck.rs | 12 ++++---- pagetop/src/base/component/container.rs | 12 ++++---- pagetop/src/base/component/form/button.rs | 28 ++++++++++-------- pagetop/src/base/component/form/date.rs | 30 +++++++++---------- pagetop/src/base/component/form/form.rs | 18 ++++++------ pagetop/src/base/component/form/hidden.rs | 11 ++++--- pagetop/src/base/component/form/input.rs | 36 +++++++++++------------ pagetop/src/base/component/grid/column.rs | 12 ++++---- pagetop/src/base/component/grid/row.rs | 12 ++++---- pagetop/src/base/component/image.rs | 18 +++++++----- 12 files changed, 115 insertions(+), 102 deletions(-) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 414fb3e4..06b0dd1a 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -32,7 +32,7 @@ impl ModuleTrait for UserModule { } fn form_login() -> ArcComponent { - Form::new() + Form::new()/* .with_id("user-login") .add(form::Input::textfield() .with_name("name") @@ -49,7 +49,7 @@ fn form_login() -> ArcComponent { .with_help_text(l("password_help").as_str()) .arc() ) - .add(form::Button::submit(l("login").as_str()).arc()) + .add(form::Button::submit(l("login").as_str()).arc())*/ .arc() } @@ -57,11 +57,11 @@ async fn login() -> app::Result<Markup> { Page::new() .with_title( "Identificación del usuario" - ) + )/* .add_to("content", Container::new() .with_id("welcome") .add(form_login()) .arc() - ) + )*/ .render() } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index a1bf8745..64dd8d7c 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -51,47 +51,49 @@ impl PageComponent for Block { impl Block { pub fn with(html: Markup) -> Self { - Block::new().add(html) + let mut block = Block::new(); + block.add(html); + block } // Block BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn with_title(mut self, title: &str) -> Self { + pub fn with_title(&mut self, title: &str) -> &Self { self.title.with_value(title); self } - pub fn add(mut self, html: Markup) -> Self { + pub fn add(&mut self, html: Markup) -> &Self { self.html.push(html); self } - pub fn with_id(mut self, id: &str) -> Self { + pub fn with_id(&mut self, id: &str) -> &Self { self.id.with_value(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index dc909a89..7589ea4a 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -36,27 +36,29 @@ impl PageComponent for Chunck { impl Chunck { pub fn with(html: Markup) -> Self { - Chunck::new().add(html) + let mut chunck = Chunck::new(); + chunck.add(html); + chunck } // Chunck BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn add(mut self, html: Markup) -> Self { + pub fn add(&mut self, html: Markup) -> &Self { self.html.push(html); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 2e48ba10..79f9b7a5 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -99,12 +99,12 @@ impl Container { // Container BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } @@ -114,22 +114,22 @@ impl Container { self } - pub fn with_id(mut self, id: &str) -> Self { + pub fn with_id(&mut self, id: &str) -> &Self { self.id.with_value(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index f99f06d3..f6fd474d 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -68,44 +68,48 @@ impl PageComponent for Button { impl Button { pub fn button(value: &str) -> Self { - Button::new().with_value(value) + let mut button = Button::new(); + button.with_value(value); + button } pub fn reset(value: &str) -> Self { - let mut button = Button::new().with_value(value); + let mut button = Button::new(); + button.with_value(value); button.button_type = ButtonType::Reset; button } pub fn submit(value: &str) -> Self { - let mut button = Button::new().with_value(value); + let mut button = Button::new(); + button.with_value(value); button.button_type = ButtonType::Submit; button } // Button BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn with_name(mut self, name: &str) -> Self { + pub fn with_name(&mut self, name: &str) -> &Self { self.name.with_value(name); self } - pub fn with_value(mut self, value: &str) -> Self { + pub fn with_value(&mut self, value: &str) -> &Self { self.value.with_value(value); self } - pub fn with_autofocus(mut self, toggle: bool) -> Self { + pub fn with_autofocus(&mut self, toggle: bool) -> &Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -113,7 +117,7 @@ impl Button { self } - pub fn with_disabled(mut self, toggle: bool) -> Self { + pub fn with_disabled(&mut self, toggle: bool) -> &Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -121,17 +125,17 @@ impl Button { self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 40c2f784..bc355a2a 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -95,37 +95,37 @@ impl Date { // Date BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn with_name(mut self, name: &str) -> Self { + pub fn with_name(&mut self, name: &str) -> &Self { self.name.with_value(name); self } - pub fn with_value(mut self, value: &str) -> Self { + pub fn with_value(&mut self, value: &str) -> &Self { self.value.with_value(value); self } - pub fn with_label(mut self, label: &str) -> Self { + pub fn with_label(&mut self, label: &str) -> &Self { self.label.with_value(label); self } - pub fn with_placeholder(mut self, placeholder: &str) -> Self { + pub fn with_placeholder(&mut self, placeholder: &str) -> &Self { self.placeholder.with_value(placeholder); self } - pub fn with_autofocus(mut self, toggle: bool) -> Self { + pub fn with_autofocus(&mut self, toggle: bool) -> &Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -133,7 +133,7 @@ impl Date { self } - pub fn with_autocomplete(mut self, toggle: bool) -> Self { + pub fn with_autocomplete(&mut self, toggle: bool) -> &Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -141,7 +141,7 @@ impl Date { self } - pub fn with_disabled(mut self, toggle: bool) -> Self { + pub fn with_disabled(&mut self, toggle: bool) -> &Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -149,7 +149,7 @@ impl Date { self } - pub fn with_readonly(mut self, toggle: bool) -> Self { + pub fn with_readonly(&mut self, toggle: bool) -> &Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -157,7 +157,7 @@ impl Date { self } - pub fn with_required(mut self, toggle: bool) -> Self { + pub fn with_required(&mut self, toggle: bool) -> &Self { self.required.with_value(match toggle { true => "required", false => "", @@ -165,22 +165,22 @@ impl Date { self } - pub fn with_help_text(mut self, help_text: &str) -> Self { + pub fn with_help_text(&mut self, help_text: &str) -> &Self { self.help_text.with_value(help_text); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 9317f9eb..3685d9a1 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -60,27 +60,27 @@ impl Form { // Form BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn with_action(mut self, action: &str) -> Self { + pub fn with_action(&mut self, action: &str) -> &Self { self.action.with_value(action); self } - pub fn with_charset(mut self, charset: &str) -> Self { + pub fn with_charset(&mut self, charset: &str) -> &Self { self.charset.with_value(charset); self } - pub fn with_method(mut self, method: FormMethod) -> Self { + pub fn with_method(&mut self, method: FormMethod) -> &Self { self.method = method; self } @@ -90,22 +90,22 @@ impl Form { self } - pub fn with_id(mut self, id: &str) -> Self { + pub fn with_id(&mut self, id: &str) -> &Self { self.id.with_value(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index f4734ba0..0e6e56c3 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -32,22 +32,25 @@ impl PageComponent for Hidden { impl Hidden { pub fn set(name: &str, value: &str) -> Self { - Hidden::new().with_name(name).with_value(value) + let mut hidden = Hidden::new(); + hidden.with_name(name); + hidden.with_value(value); + hidden } // Hidden BUILDER. - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn with_name(mut self, name: &str) -> Self { + pub fn with_name(&mut self, name: &str) -> &Self { self.name.with_value(name); self } - pub fn with_value(mut self, value: &str) -> Self { + pub fn with_value(&mut self, value: &str) -> &Self { self.value.with_value(value); self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 9d6e1afd..c468cdfe 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -149,52 +149,52 @@ impl Input { // Input BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn with_name(mut self, name: &str) -> Self { + pub fn with_name(&mut self, name: &str) -> &Self { self.name.with_value(name); self } - pub fn with_value(mut self, value: &str) -> Self { + pub fn with_value(&mut self, value: &str) -> &Self { self.value.with_value(value); self } - pub fn with_label(mut self, label: &str) -> Self { + pub fn with_label(&mut self, label: &str) -> &Self { self.label.with_value(label); self } - pub fn with_size(mut self, size: Option<u16>) -> Self { + pub fn with_size(&mut self, size: Option<u16>) -> &Self { self.size = size; self } - pub fn with_minlength(mut self, minlength: Option<u16>) -> Self { + pub fn with_minlength(&mut self, minlength: Option<u16>) -> &Self { self.minlength = minlength; self } - pub fn with_maxlength(mut self, maxlength: Option<u16>) -> Self { + pub fn with_maxlength(&mut self, maxlength: Option<u16>) -> &Self { self.maxlength = maxlength; self } - pub fn with_placeholder(mut self, placeholder: &str) -> Self { + pub fn with_placeholder(&mut self, placeholder: &str) -> &Self { self.placeholder.with_value(placeholder); self } - pub fn with_autofocus(mut self, toggle: bool) -> Self { + pub fn with_autofocus(&mut self, toggle: bool) -> &Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -202,7 +202,7 @@ impl Input { self } - pub fn with_autocomplete(mut self, toggle: bool) -> Self { + pub fn with_autocomplete(&mut self, toggle: bool) -> &Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -210,7 +210,7 @@ impl Input { self } - pub fn with_disabled(mut self, toggle: bool) -> Self { + pub fn with_disabled(&mut self, toggle: bool) -> &Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -218,7 +218,7 @@ impl Input { self } - pub fn with_readonly(mut self, toggle: bool) -> Self { + pub fn with_readonly(&mut self, toggle: bool) -> &Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -226,7 +226,7 @@ impl Input { self } - pub fn with_required(mut self, toggle: bool) -> Self { + pub fn with_required(&mut self, toggle: bool) -> &Self { self.required.with_value(match toggle { true => "required", false => "", @@ -234,22 +234,22 @@ impl Input { self } - pub fn with_help_text(mut self, help_text: &str) -> Self { + pub fn with_help_text(&mut self, help_text: &str) -> &Self { self.help_text.with_value(help_text); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index a007c83b..e4e5525a 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -46,12 +46,12 @@ impl Column { // Column BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } @@ -61,22 +61,22 @@ impl Column { self } - pub fn with_id(mut self, id: &str) -> Self { + pub fn with_id(&mut self, id: &str) -> &Self { self.id.with_value(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 2a185894..30a5f351 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -46,12 +46,12 @@ impl Row { // Row BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } @@ -61,22 +61,22 @@ impl Row { self } - pub fn with_id(mut self, id: &str) -> Self { + pub fn with_id(&mut self, id: &str) -> &Self { self.id.with_value(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 1384f4df..30cca8f3 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -41,42 +41,44 @@ impl PageComponent for Image { impl Image { pub fn image(source: &str) -> Self { - Image::new().with_source(source) + let mut image = Image::new(); + image.with_source(source); + image } // Image BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { self.renderable = renderable; self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(&mut self, weight: i8) -> &Self { self.weight = weight; self } - pub fn with_source(mut self, source: &str) -> Self { + pub fn with_source(&mut self, source: &str) -> &Self { self.source.with_value(source); self } - pub fn with_id(mut self, id: &str) -> Self { + pub fn with_id(&mut self, id: &str) -> &Self { self.id.with_value(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { + pub fn set_classes(&mut self, classes: &str) -> &Self { self.classes.set_classes(classes); self } - pub fn add_classes(mut self, classes: &str) -> Self { + pub fn add_classes(&mut self, classes: &str) -> &Self { self.classes.add_classes(classes); self } - pub fn using_template(mut self, template: &str) -> Self { + pub fn using_template(&mut self, template: &str) -> &Self { self.template = template.to_owned(); self } From 93d6d455c8ecc8c37c4ac1c38cd9e859abcbdd0e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Apr 2022 21:17:56 +0200 Subject: [PATCH 049/853] =?UTF-8?q?Actualiza=20y=20recupera=20definici?= =?UTF-8?q?=C3=B3n=20original=20de=20comp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prácticamente se revierten los últimos cambios realizados en la estructura de componentes. --- pagetop-admin/src/summary.rs | 7 +-- pagetop-user/src/lib.rs | 14 ++--- pagetop/src/base/component/block.rs | 45 ++++++-------- pagetop/src/base/component/chunck.rs | 25 +++----- pagetop/src/base/component/container.rs | 46 +++++++------- pagetop/src/base/component/form/button.rs | 28 ++++----- pagetop/src/base/component/form/date.rs | 30 ++++----- pagetop/src/base/component/form/form.rs | 76 ++++++++++++----------- pagetop/src/base/component/form/hidden.rs | 13 ++-- pagetop/src/base/component/form/input.rs | 36 +++++------ pagetop/src/base/component/grid/column.rs | 42 +++++++------ pagetop/src/base/component/grid/row.rs | 32 +++++----- pagetop/src/base/component/image.rs | 18 +++--- pagetop/src/base/component/menu.rs | 20 +++--- pagetop/src/base/module/demopage/mod.rs | 28 ++++----- pagetop/src/base/theme/bootsier/mod.rs | 2 +- pagetop/src/response/page/component.rs | 9 --- pagetop/src/response/page/container.rs | 14 +++-- pagetop/src/response/page/mod.rs | 2 +- pagetop/src/response/page/page.rs | 4 +- pagetop/src/theme/definition.rs | 2 +- 21 files changed, 234 insertions(+), 259 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 6e6f2158..b91b97fa 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -38,18 +38,17 @@ pub async fn summary() -> app::Result<Markup> { .with_title("Admin") - .add_to("top-menu", top_menu.arc()) + .add_to("top-menu", top_menu) .add_to("content", grid::Row::new() .add_column(grid::Column::new() - .add(side_menu.arc()) + .add(side_menu) ) .add_column(grid::Column::new() .add(Chunck::with(html! { p { "Columna 2"} - }).arc()) + })) ) - .arc() ) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 06b0dd1a..c40057f0 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -31,8 +31,8 @@ impl ModuleTrait for UserModule { } } -fn form_login() -> ArcComponent { - Form::new()/* +fn form_login() -> Form { + Form::new() .with_id("user-login") .add(form::Input::textfield() .with_name("name") @@ -41,27 +41,23 @@ fn form_login() -> ArcComponent { "app" => SETTINGS.app.name.to_owned() ]).as_str()) .with_autofocus(true) - .arc() ) .add(form::Input::password() .with_name("pass") .with_label(l("password").as_str()) .with_help_text(l("password_help").as_str()) - .arc() ) - .add(form::Button::submit(l("login").as_str()).arc())*/ - .arc() + .add(form::Button::submit(l("login").as_str())) } async fn login() -> app::Result<Markup> { Page::new() .with_title( "Identificación del usuario" - )/* + ) .add_to("content", Container::new() .with_id("welcome") .add(form_login()) - .arc() - )*/ + ) .render() } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 64dd8d7c..99950286 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub struct Block { renderable: fn() -> bool, weight : i8, + components: PageContainer, title : OptAttr, - html : Vec<Markup>, id : OptIden, classes : Classes, template : String, @@ -15,8 +15,8 @@ impl PageComponent for Block { Block { renderable: always, weight : 0, + components: PageContainer::new(), title : OptAttr::none(), - html : Vec::new(), id : OptIden::none(), classes : Classes::none(), template : "default".to_owned(), @@ -40,9 +40,7 @@ impl PageComponent for Block { None => {} } div class="block-body" { - @for html in self.html().iter() { - (*html) - } + (self.components().render(assets)) } } } @@ -50,50 +48,51 @@ impl PageComponent for Block { } impl Block { - pub fn with(html: Markup) -> Self { - let mut block = Block::new(); - block.add(html); - block + + // Block CONTAINER. + + pub fn add(mut self, component: impl PageComponent) -> Self { + self.components.add(component); + self + } + + pub fn components(&self) -> &PageContainer { + &self.components } // Block BUILDER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self } - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn with_title(&mut self, title: &str) -> &Self { + pub fn with_title(mut self, title: &str) -> Self { self.title.with_value(title); self } - pub fn add(&mut self, html: Markup) -> &Self { - self.html.push(html); - self - } - - pub fn with_id(&mut self, id: &str) -> &Self { + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } @@ -104,10 +103,6 @@ impl Block { self.title.option() } - pub fn html(&self) -> &Vec<Markup> { - &self.html - } - pub fn id(&self) -> &Option<String> { self.id.option() } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 7589ea4a..0e46c779 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub struct Chunck { renderable: fn() -> bool, weight : i8, - html : Vec<Markup>, + html : Markup, template : String, } @@ -12,7 +12,7 @@ impl PageComponent for Chunck { Chunck { renderable: always, weight : 0, - html : Vec::new(), + html : html! {}, template : "default".to_owned(), } } @@ -26,46 +26,37 @@ impl PageComponent for Chunck { } fn default_render(&self, _: &mut PageAssets) -> Markup { - html! { - @for html in self.html().iter() { - (*html) - } - } + html! { (*self.html()) } } } impl Chunck { pub fn with(html: Markup) -> Self { let mut chunck = Chunck::new(); - chunck.add(html); + chunck.html = html; chunck } // Chunck BUILDER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self } - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn add(&mut self, html: Markup) -> &Self { - self.html.push(html); - self - } - - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } // Chunck GETTERS. - pub fn html(&self) -> &Vec<Markup> { + pub fn html(&self) -> &Markup { &self.html } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 79f9b7a5..70162bb9 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -5,8 +5,8 @@ pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { renderable: fn() -> bool, weight : i8, - container : ContainerType, components: PageContainer, + container : ContainerType, id : OptIden, classes : Classes, template : String, @@ -17,8 +17,8 @@ impl PageComponent for Container { Container { renderable: always, weight : 0, - container : ContainerType::Wrapper, components: PageContainer::new(), + container : ContainerType::Wrapper, id : OptIden::none(), classes : Classes::none(), template : "default".to_owned(), @@ -97,39 +97,45 @@ impl Container { c } - // Container BUILDER. + // Container CONTAINER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { - self.renderable = renderable; - self - } - - pub fn with_weight(&mut self, weight: i8) -> &Self { - self.weight = weight; - self - } - - pub fn add(mut self, component: ArcComponent) -> Self { + pub fn add(mut self, component: impl PageComponent) -> Self { self.components.add(component); self } - pub fn with_id(&mut self, id: &str) -> &Self { + pub fn components(&self) -> &PageContainer { + &self.components + } + + // Container BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } @@ -140,10 +146,6 @@ impl Container { &self.container } - pub fn components(&self) -> &PageContainer { - &self.components - } - pub fn id(&self) -> &Option<String> { self.id.option() } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index f6fd474d..f99f06d3 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -68,48 +68,44 @@ impl PageComponent for Button { impl Button { pub fn button(value: &str) -> Self { - let mut button = Button::new(); - button.with_value(value); - button + Button::new().with_value(value) } pub fn reset(value: &str) -> Self { - let mut button = Button::new(); - button.with_value(value); + let mut button = Button::new().with_value(value); button.button_type = ButtonType::Reset; button } pub fn submit(value: &str) -> Self { - let mut button = Button::new(); - button.with_value(value); + let mut button = Button::new().with_value(value); button.button_type = ButtonType::Submit; button } // Button BUILDER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self } - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn with_name(&mut self, name: &str) -> &Self { + pub fn with_name(mut self, name: &str) -> Self { self.name.with_value(name); self } - pub fn with_value(&mut self, value: &str) -> &Self { + pub fn with_value(mut self, value: &str) -> Self { self.value.with_value(value); self } - pub fn with_autofocus(&mut self, toggle: bool) -> &Self { + pub fn with_autofocus(mut self, toggle: bool) -> Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -117,7 +113,7 @@ impl Button { self } - pub fn with_disabled(&mut self, toggle: bool) -> &Self { + pub fn with_disabled(mut self, toggle: bool) -> Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -125,17 +121,17 @@ impl Button { self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index bc355a2a..40c2f784 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -95,37 +95,37 @@ impl Date { // Date BUILDER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self } - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn with_name(&mut self, name: &str) -> &Self { + pub fn with_name(mut self, name: &str) -> Self { self.name.with_value(name); self } - pub fn with_value(&mut self, value: &str) -> &Self { + pub fn with_value(mut self, value: &str) -> Self { self.value.with_value(value); self } - pub fn with_label(&mut self, label: &str) -> &Self { + pub fn with_label(mut self, label: &str) -> Self { self.label.with_value(label); self } - pub fn with_placeholder(&mut self, placeholder: &str) -> &Self { + pub fn with_placeholder(mut self, placeholder: &str) -> Self { self.placeholder.with_value(placeholder); self } - pub fn with_autofocus(&mut self, toggle: bool) -> &Self { + pub fn with_autofocus(mut self, toggle: bool) -> Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -133,7 +133,7 @@ impl Date { self } - pub fn with_autocomplete(&mut self, toggle: bool) -> &Self { + pub fn with_autocomplete(mut self, toggle: bool) -> Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -141,7 +141,7 @@ impl Date { self } - pub fn with_disabled(&mut self, toggle: bool) -> &Self { + pub fn with_disabled(mut self, toggle: bool) -> Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -149,7 +149,7 @@ impl Date { self } - pub fn with_readonly(&mut self, toggle: bool) -> &Self { + pub fn with_readonly(mut self, toggle: bool) -> Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -157,7 +157,7 @@ impl Date { self } - pub fn with_required(&mut self, toggle: bool) -> &Self { + pub fn with_required(mut self, toggle: bool) -> Self { self.required.with_value(match toggle { true => "required", false => "", @@ -165,22 +165,22 @@ impl Date { self } - pub fn with_help_text(&mut self, help_text: &str) -> &Self { + pub fn with_help_text(mut self, help_text: &str) -> Self { self.help_text.with_value(help_text); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 3685d9a1..07cb6e17 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -5,10 +5,10 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, weight : i8, + elements : PageContainer, action : OptAttr, charset : OptAttr, method : FormMethod, - elements : PageContainer, id : OptIden, classes : Classes, template : String, @@ -19,10 +19,10 @@ impl PageComponent for Form { Form { renderable: always, weight : 0, + elements : PageContainer::new(), action : OptAttr::none(), charset : OptAttr::some("UTF-8"), method : FormMethod::Post, - elements : PageContainer::new(), id : OptIden::none(), classes : Classes::none(), template : "default".to_owned(), @@ -58,54 +58,60 @@ impl PageComponent for Form { impl Form { - // Form BUILDER. + // Form CONTAINER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { - self.renderable = renderable; - self - } - - pub fn with_weight(&mut self, weight: i8) -> &Self { - self.weight = weight; - self - } - - pub fn with_action(&mut self, action: &str) -> &Self { - self.action.with_value(action); - self - } - - pub fn with_charset(&mut self, charset: &str) -> &Self { - self.charset.with_value(charset); - self - } - - pub fn with_method(&mut self, method: FormMethod) -> &Self { - self.method = method; - self - } - - pub fn add(mut self, element: ArcComponent) -> Self { + pub fn add(mut self, element: impl PageComponent) -> Self { self.elements.add(element); self } - pub fn with_id(&mut self, id: &str) -> &Self { + pub fn elements(&self) -> &PageContainer { + &self.elements + } + + // Form BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_action(mut self, action: &str) -> Self { + self.action.with_value(action); + self + } + + pub fn with_charset(mut self, charset: &str) -> Self { + self.charset.with_value(charset); + self + } + + pub fn with_method(mut self, method: FormMethod) -> Self { + self.method = method; + self + } + + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } @@ -124,10 +130,6 @@ impl Form { &self.method } - pub fn elements(&self) -> &PageContainer { - &self.elements - } - pub fn id(&self) -> &Option<String> { self.id.option() } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 0e6e56c3..8f2cc4b3 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -32,25 +32,24 @@ impl PageComponent for Hidden { impl Hidden { pub fn set(name: &str, value: &str) -> Self { - let mut hidden = Hidden::new(); - hidden.with_name(name); - hidden.with_value(value); - hidden + Hidden::new() + .with_name(name) + .with_value(value) } // Hidden BUILDER. - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn with_name(&mut self, name: &str) -> &Self { + pub fn with_name(mut self, name: &str) -> Self { self.name.with_value(name); self } - pub fn with_value(&mut self, value: &str) -> &Self { + pub fn with_value(mut self, value: &str) -> Self { self.value.with_value(value); self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index c468cdfe..9d6e1afd 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -149,52 +149,52 @@ impl Input { // Input BUILDER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self } - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn with_name(&mut self, name: &str) -> &Self { + pub fn with_name(mut self, name: &str) -> Self { self.name.with_value(name); self } - pub fn with_value(&mut self, value: &str) -> &Self { + pub fn with_value(mut self, value: &str) -> Self { self.value.with_value(value); self } - pub fn with_label(&mut self, label: &str) -> &Self { + pub fn with_label(mut self, label: &str) -> Self { self.label.with_value(label); self } - pub fn with_size(&mut self, size: Option<u16>) -> &Self { + pub fn with_size(mut self, size: Option<u16>) -> Self { self.size = size; self } - pub fn with_minlength(&mut self, minlength: Option<u16>) -> &Self { + pub fn with_minlength(mut self, minlength: Option<u16>) -> Self { self.minlength = minlength; self } - pub fn with_maxlength(&mut self, maxlength: Option<u16>) -> &Self { + pub fn with_maxlength(mut self, maxlength: Option<u16>) -> Self { self.maxlength = maxlength; self } - pub fn with_placeholder(&mut self, placeholder: &str) -> &Self { + pub fn with_placeholder(mut self, placeholder: &str) -> Self { self.placeholder.with_value(placeholder); self } - pub fn with_autofocus(&mut self, toggle: bool) -> &Self { + pub fn with_autofocus(mut self, toggle: bool) -> Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -202,7 +202,7 @@ impl Input { self } - pub fn with_autocomplete(&mut self, toggle: bool) -> &Self { + pub fn with_autocomplete(mut self, toggle: bool) -> Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -210,7 +210,7 @@ impl Input { self } - pub fn with_disabled(&mut self, toggle: bool) -> &Self { + pub fn with_disabled(mut self, toggle: bool) -> Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -218,7 +218,7 @@ impl Input { self } - pub fn with_readonly(&mut self, toggle: bool) -> &Self { + pub fn with_readonly(mut self, toggle: bool) -> Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -226,7 +226,7 @@ impl Input { self } - pub fn with_required(&mut self, toggle: bool) -> &Self { + pub fn with_required(mut self, toggle: bool) -> Self { self.required.with_value(match toggle { true => "required", false => "", @@ -234,22 +234,22 @@ impl Input { self } - pub fn with_help_text(&mut self, help_text: &str) -> &Self { + pub fn with_help_text(mut self, help_text: &str) -> Self { self.help_text.with_value(help_text); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index e4e5525a..f29544ca 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -44,49 +44,51 @@ impl PageComponent for Column { impl Column { - // Column BUILDER. + // Column CONTAINER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { - self.renderable = renderable; - self - } - - pub fn with_weight(&mut self, weight: i8) -> &Self { - self.weight = weight; - self - } - - pub fn add(mut self, component: ArcComponent) -> Self { + pub fn add(mut self, component: impl PageComponent) -> Self { self.components.add(component); self } - pub fn with_id(&mut self, id: &str) -> &Self { + pub fn components(&self) -> &PageContainer { + &self.components + } + + // Column BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.renderable = renderable; + self + } + + pub fn with_weight(mut self, weight: i8) -> Self { + self.weight = weight; + self + } + + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } // Column GETTERS. - pub fn components(&self) -> &PageContainer { - &self.components - } - pub fn id(&self) -> &Option<String> { self.id.option() } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 30a5f351..59645b79 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -44,49 +44,51 @@ impl PageComponent for Row { impl Row { + // Row CONTAINER. + + pub fn add_column(mut self, column: grid::Column) -> Self { + self.columns.add(column); + self + } + + pub fn columns(&self) -> &PageContainer { + &self.columns + } + // Row BUILDER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self } - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn add_column(mut self, column: grid::Column) -> Self { - self.columns.add(column.arc()); - self - } - - pub fn with_id(&mut self, id: &str) -> &Self { + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } // Row GETTERS. - pub fn columns(&self) -> &PageContainer { - &self.columns - } - pub fn id(&self) -> &Option<String> { self.id.option() } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 30cca8f3..1384f4df 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -41,44 +41,42 @@ impl PageComponent for Image { impl Image { pub fn image(source: &str) -> Self { - let mut image = Image::new(); - image.with_source(source); - image + Image::new().with_source(source) } // Image BUILDER. - pub fn with_renderable(&mut self, renderable: fn() -> bool) -> &Self { + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { self.renderable = renderable; self } - pub fn with_weight(&mut self, weight: i8) -> &Self { + pub fn with_weight(mut self, weight: i8) -> Self { self.weight = weight; self } - pub fn with_source(&mut self, source: &str) -> &Self { + pub fn with_source(mut self, source: &str) -> Self { self.source.with_value(source); self } - pub fn with_id(&mut self, id: &str) -> &Self { + pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self } - pub fn set_classes(&mut self, classes: &str) -> &Self { + pub fn set_classes(mut self, classes: &str) -> Self { self.classes.set_classes(classes); self } - pub fn add_classes(&mut self, classes: &str) -> &Self { + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self } - pub fn using_template(&mut self, template: &str) -> &Self { + pub fn using_template(mut self, template: &str) -> Self { self.template = template.to_owned(); self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 3f2b4ff4..01a60129 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -209,6 +209,17 @@ impl PageComponent for Menu { impl Menu { + // Menu CONTAINER. + + pub fn add(mut self, item: MenuItem) -> Self { + self.items.add(item); + self + } + + pub fn items(&self) -> &PageContainer { + &self.items + } + // Menu BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { @@ -221,11 +232,6 @@ impl Menu { self } - pub fn add(mut self, item: MenuItem) -> Self { - self.items.add(item.arc()); - self - } - pub fn with_id(mut self, id: &str) -> Self { self.id.with_value(id); self @@ -248,10 +254,6 @@ impl Menu { // Menu GETTERS. - pub fn items(&self) -> &PageContainer { - &self.items - } - pub fn id(&self) -> &Option<String> { self.id.option() } diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index d71c7176..489b6d3b 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -35,7 +35,7 @@ async fn demo() -> app::Result<Markup> { .render() } -fn hello_world() -> ArcComponent { +fn hello_world() -> Container { Container::header() .add(grid::Row::new() .add_column(grid::Column::new() @@ -68,17 +68,15 @@ fn hello_world() -> ArcComponent { i class="fas fa-paper-plane" {} "Get quote" } - }).arc()) + })) ) .add_column(grid::Column::new() - .add(Image::image("/bootsier/images/demo-header.svg").arc()) + .add(Image::image("/bootsier/images/demo-header.svg")) ) - .arc() ) - .arc() } -fn hello_world_original() -> ArcComponent { +fn hello_world_original() -> Chunck { Chunck::with(html! { header id="header" class="header" { div class="container" { @@ -123,10 +121,10 @@ fn hello_world_original() -> ArcComponent { } } } - }).arc() + }) } -fn just_visiting() -> ArcComponent { +fn just_visiting() -> Chunck { Chunck::with(html! { div id="details" class="basic-1" { div class="container" { @@ -153,10 +151,10 @@ fn just_visiting() -> ArcComponent { } } } - }).arc() + }) } -fn about_pagetop() -> ArcComponent { +fn about_pagetop() -> Chunck { Chunck::with(html! { div id="pagetop" class="basic-2" { div class="container" { @@ -177,10 +175,10 @@ fn about_pagetop() -> ArcComponent { } } } - }).arc() + }) } -fn promo_pagetop() -> ArcComponent { +fn promo_pagetop() -> Chunck { Chunck::with(html! { div id="promo" class="basic-3" { div class="container" { @@ -202,10 +200,10 @@ fn promo_pagetop() -> ArcComponent { } } } - }).arc() + }) } -fn reporting_problems() -> ArcComponent { +fn reporting_problems() -> Chunck { Chunck::with(html! { div id="reporting" class="basic-4" { div class="container" { @@ -225,5 +223,5 @@ fn reporting_problems() -> ArcComponent { } } } - }).arc() + }) } diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index b169351d..90111723 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -77,7 +77,7 @@ impl ThemeTrait for BootsierTheme { } } } - }).arc()) + })) .render() } } diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index b9a920d3..630b8a9b 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -3,11 +3,8 @@ use crate::response::page::PageAssets; use downcast_rs::{Downcast, impl_downcast}; -use std::sync::Arc; use std::any::type_name; -pub type ArcComponent = Arc<dyn PageComponent>; - pub trait PageComponent: Downcast + Send + Sync { fn new() -> Self where Self: Sized; @@ -36,12 +33,6 @@ pub trait PageComponent: Downcast + Send + Sync { 0 } - #[allow(unused_mut)] - fn arc(mut self) -> ArcComponent where Self: Sized { - let component = self; - Arc::new(component) - } - #[allow(unused_variables)] fn default_render(&self, assets: &mut PageAssets) -> Markup { html! {} diff --git a/pagetop/src/response/page/container.rs b/pagetop/src/response/page/container.rs index 7e5d4953..011e5f50 100644 --- a/pagetop/src/response/page/container.rs +++ b/pagetop/src/response/page/container.rs @@ -1,22 +1,24 @@ use crate::html::{Markup, html}; -use crate::response::page::{ArcComponent, PageAssets, render_component}; +use crate::response::page::{PageAssets, PageComponent, render_component}; + +use std::sync::Arc; #[derive(Clone)] -pub struct PageContainer(Vec<ArcComponent>); +pub struct PageContainer(Vec<Arc<dyn PageComponent>>); impl PageContainer { pub fn new() -> Self { PageContainer(Vec::new()) } - pub fn new_with(component: ArcComponent) -> Self { + pub fn new_with(component: impl PageComponent) -> Self { let mut container = PageContainer::new(); container.add(component); container } - pub fn add(&mut self, component: ArcComponent) { - self.0.push(component); + pub fn add(&mut self, component: impl PageComponent) { + self.0.push(Arc::new(component)); } pub fn render(&self, assets: &mut PageAssets) -> Markup { @@ -28,4 +30,4 @@ impl PageContainer { } } } -} \ No newline at end of file +} diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 63c19a47..f34070e2 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -7,7 +7,7 @@ pub use assets::{ }; mod component; -pub use component::{ArcComponent, PageComponent}; +pub use component::PageComponent; mod container; pub use container::PageContainer; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 5cbe80cb..5501678a 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -100,7 +100,7 @@ impl<'a> Page<'a> { pub fn add_to( &mut self, region: &'a str, - component: ArcComponent + component: impl PageComponent ) -> &mut Self { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); @@ -205,7 +205,7 @@ pub fn render_component( } } -pub fn add_component_to(region: &'static str, component: ArcComponent) { +pub fn add_component_to(region: &'static str, component: impl PageComponent) { let mut hmap = COMPONENTS.write().unwrap(); if let Some(regions) = hmap.get_mut(region) { regions.add(component); diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index db4c0e37..acc30f47 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -104,7 +104,7 @@ pub trait ThemeTrait: Send + Sync { div { h1 { (s) } } - }).arc()) + })) .render() } } From e11b36f7edb97c1fcc355b111884ebc2e819362e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Apr 2022 23:54:38 +0200 Subject: [PATCH 050/853] Mejora el uso de referencias en los componentes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sin embargo requiere duplicar todos los métodos para recibir una referencia mutable a self en uno y directamente self en otro. --- pagetop/src/base/component/grid/row.rs | 5 +++++ pagetop/src/base/theme/bulmix/mod.rs | 8 ++++++-- pagetop/src/response/page/container.rs | 10 +++++----- pagetop/src/response/page/page.rs | 2 +- pagetop/src/theme/definition.rs | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 59645b79..96d74afc 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -77,6 +77,11 @@ impl Row { self } + pub fn set_classes_ref(&mut self, classes: &str) -> &Self { + self.classes.set_classes(classes); + self + } + pub fn add_classes(mut self, classes: &str) -> Self { self.classes.add_classes(classes); self diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 284353c1..cf83a8f6 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -34,17 +34,21 @@ impl ThemeTrait for BulmixTheme { fn render_component( &self, - component: &dyn PageComponent, + component: &mut dyn PageComponent, assets: &mut PageAssets ) -> Option<Markup> { match component.name() { "GridRow" => { - let row = component.downcast_ref::<grid::Row>().unwrap(); + let row = component.downcast_mut::<grid::Row>().unwrap(); + row.set_classes_ref("Prueba"); + None + /* Some(html! { div id=[row.id()] class=[row.classes("columns")] { (row.columns().render(assets)) } }) + */ }, "GridColumn" => { let col = component.downcast_ref::<grid::Column>().unwrap(); diff --git a/pagetop/src/response/page/container.rs b/pagetop/src/response/page/container.rs index 011e5f50..2e052ee9 100644 --- a/pagetop/src/response/page/container.rs +++ b/pagetop/src/response/page/container.rs @@ -1,10 +1,10 @@ use crate::html::{Markup, html}; use crate::response::page::{PageAssets, PageComponent, render_component}; -use std::sync::Arc; +use std::sync::{Arc, RwLock}; #[derive(Clone)] -pub struct PageContainer(Vec<Arc<dyn PageComponent>>); +pub struct PageContainer(Vec<Arc<RwLock<dyn PageComponent>>>); impl PageContainer { pub fn new() -> Self { @@ -18,15 +18,15 @@ impl PageContainer { } pub fn add(&mut self, component: impl PageComponent) { - self.0.push(Arc::new(component)); + self.0.push(Arc::new(RwLock::new(component))); } pub fn render(&self, assets: &mut PageAssets) -> Markup { let mut components = self.0.clone(); - components.sort_by_key(|c| c.weight()); + components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (render_component(&**c, assets)) + (render_component(&mut *c.write().unwrap(), assets)) } } } diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 5501678a..56db5ecc 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -193,7 +193,7 @@ impl<'a> Page<'a> { } pub fn render_component( - component: &dyn PageComponent, + component: &mut dyn PageComponent, assets: &mut PageAssets ) -> Markup { match component.is_renderable() { diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index acc30f47..457860c7 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -77,7 +77,7 @@ pub trait ThemeTrait: Send + Sync { #[allow(unused_variables)] fn render_component( &self, - component: &dyn PageComponent, + component: &mut dyn PageComponent, assets: &mut PageAssets ) -> Option<Markup> { None From ba4cc982befeb57d844fe28e954687b50826beba Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Apr 2022 18:40:44 +0200 Subject: [PATCH 051/853] =?UTF-8?q?A=C3=B1ade=20alteraci=C3=B3n=20de=20com?= =?UTF-8?q?ponentes=20antes=20del=20render?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Los componentes implementan a la vez el paradigma "builder" y la modificación por "setters" para poder ser modificados durante la creación de la página o alterados antes de ser renderizados. --- pagetop/src/base/component/block.rs | 67 ++++--- pagetop/src/base/component/chunck.rs | 41 +++-- pagetop/src/base/component/container.rs | 114 +++++++----- pagetop/src/base/component/form/button.rs | 102 +++++++---- pagetop/src/base/component/form/date.rs | 152 +++++++++++----- pagetop/src/base/component/form/form.rs | 83 ++++++--- pagetop/src/base/component/form/hidden.rs | 29 ++- pagetop/src/base/component/form/input.rs | 209 +++++++++++++++------- pagetop/src/base/component/grid/column.rs | 58 +++--- pagetop/src/base/component/grid/row.rs | 63 ++++--- pagetop/src/base/component/image.rs | 67 ++++--- pagetop/src/base/component/menu.rs | 86 ++++++--- pagetop/src/base/theme/bulmix/mod.rs | 26 +-- pagetop/src/html/classes.rs | 83 +++++++-- pagetop/src/html/mod.rs | 2 +- pagetop/src/html/optattr.rs | 10 +- pagetop/src/html/optiden.rs | 12 +- pagetop/src/response/page/assets.rs | 2 +- pagetop/src/response/page/component.rs | 4 + pagetop/src/response/page/mod.rs | 3 + pagetop/src/response/page/page.rs | 44 +++-- pagetop/src/theme/definition.rs | 27 ++- 22 files changed, 872 insertions(+), 412 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 99950286..86370ff4 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -13,12 +13,12 @@ pub struct Block { impl PageComponent for Block { fn new() -> Self { Block { - renderable: always, + renderable: render_always, weight : 0, components: PageContainer::new(), - title : OptAttr::none(), - id : OptIden::none(), - classes : Classes::none(), + title : OptAttr::new(), + id : OptIden::new(), + classes : Classes::new_with_default("block"), template : "default".to_owned(), } } @@ -34,7 +34,7 @@ impl PageComponent for Block { fn default_render(&self, assets: &mut PageAssets) -> Markup { let id = assets.serial_id(self.name(), self.id()); html! { - div id=(id) class=[self.classes("block")] { + div id=(id) class=[self.classes()] { @match self.title() { Some(title) => h2 class="block-title" { (title) }, None => {} @@ -63,36 +63,63 @@ impl Block { // Block BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_title(mut self, title: &str) -> Self { - self.title.with_value(title); + self.alter_title(title); self } pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); + self.alter_id(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); - self - } - - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Block ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_title(&mut self, title: &str) -> &mut Self { + self.title.with_value(title); + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -107,15 +134,11 @@ impl Block { self.id.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 0e46c779..6dbc0ff1 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -10,7 +10,7 @@ pub struct Chunck { impl PageComponent for Chunck { fn new() -> Self { Chunck { - renderable: always, + renderable: render_always, weight : 0, html : html! {}, template : "default".to_owned(), @@ -32,24 +32,49 @@ impl PageComponent for Chunck { impl Chunck { pub fn with(html: Markup) -> Self { - let mut chunck = Chunck::new(); - chunck.html = html; - chunck + Chunck::new().with_html(html) } // Chunck BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); + self + } + + pub fn with_html(mut self, html: Markup) -> Self { + self.alter_html(html); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Chunck ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.html = html; + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -64,7 +89,3 @@ impl Chunck { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 70162bb9..fab8225a 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -3,25 +3,27 @@ use crate::prelude::*; pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { - renderable: fn() -> bool, - weight : i8, - components: PageContainer, - container : ContainerType, - id : OptIden, - classes : Classes, - template : String, + renderable : fn() -> bool, + weight : i8, + components : PageContainer, + container : ContainerType, + id : OptIden, + classes : Classes, + inner_classes: Classes, + template : String, } impl PageComponent for Container { fn new() -> Self { Container { - renderable: always, - weight : 0, - components: PageContainer::new(), - container : ContainerType::Wrapper, - id : OptIden::none(), - classes : Classes::none(), - template : "default".to_owned(), + renderable : render_always, + weight : 0, + components : PageContainer::new(), + container : ContainerType::Wrapper, + id : OptIden::new(), + classes : Classes::new_with_default("container"), + inner_classes: Classes::new_with_default("container"), + template : "default".to_owned(), } } @@ -36,35 +38,35 @@ impl PageComponent for Container { fn default_render(&self, assets: &mut PageAssets) -> Markup { match self.container_type() { ContainerType::Header => html! { - header id=[self.id()] class=[self.classes("header")] { - div class="container" { + header id=[self.id()] class=[self.classes()] { + div class=[self.inner_classes()] { (self.components().render(assets)) } } }, ContainerType::Footer => html! { - footer id=[self.id()] class=[self.classes("footer")] { - div class="container" { + footer id=[self.id()] class=[self.classes()] { + div class=[self.inner_classes()] { (self.components().render(assets)) } } }, ContainerType::Main => html! { - main id=[self.id()] class=[self.classes("main")] { - div class="container" { + main id=[self.id()] class=[self.classes()] { + div class=[self.inner_classes()] { (self.components().render(assets)) } } }, ContainerType::Section => html! { - section id=[self.id()] class=[self.classes("section")] { - div class="container" { + section id=[self.id()] class=[self.classes()] { + div class=[self.inner_classes()] { (self.components().render(assets)) } } }, _ => html! { - div id=[self.id()] class=[self.classes("container")] { + div id=[self.id()] class=[self.classes()] { (self.components().render(assets)) } } @@ -74,25 +76,25 @@ impl PageComponent for Container { impl Container { pub fn header() -> Self { - let mut c = Container::new(); + let mut c = Container::new().with_classes("header", ClassesOp::SetDefault); c.container = ContainerType::Header; c } pub fn footer() -> Self { - let mut c = Container::new(); + let mut c = Container::new().with_classes("footer", ClassesOp::SetDefault); c.container = ContainerType::Footer; c } pub fn main() -> Self { - let mut c = Container::new(); + let mut c = Container::new().with_classes("main", ClassesOp::SetDefault); c.container = ContainerType::Main; c } pub fn section() -> Self { - let mut c = Container::new(); + let mut c = Container::new().with_classes("section", ClassesOp::SetDefault); c.container = ContainerType::Section; c } @@ -111,31 +113,63 @@ impl Container { // Container BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); + self.alter_id(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); self } - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); + pub fn with_inner_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_inner_classes(classes, op); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Container ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_inner_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.inner_classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -150,15 +184,15 @@ impl Container { self.id.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() + } + + pub fn inner_classes(&self) -> &Option<String> { + self.inner_classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index f99f06d3..4c75dc62 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -17,16 +17,17 @@ pub struct Button { impl PageComponent for Button { fn new() -> Self { Button { - renderable : always, + renderable : render_always, weight : 0, button_type: ButtonType::Button, - name : OptAttr::none(), - value : OptAttr::none(), - autofocus : OptAttr::none(), - disabled : OptAttr::none(), - classes : Classes::none(), + name : OptAttr::new(), + value : OptAttr::new(), + autofocus : OptAttr::new(), + disabled : OptAttr::new(), + classes : Classes::new_with_default("btn btn-primary"), template : "default".to_owned(), } + .with_classes("form-button", ClassesOp::AddFirst) } fn is_renderable(&self) -> bool { @@ -38,10 +39,10 @@ impl PageComponent for Button { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (button_type, button_class) = match self.button_type() { - ButtonType::Button => ("button", "btn btn-primary form-button"), - ButtonType::Reset => ("reset", "btn btn-primary form-reset" ), - ButtonType::Submit => ("submit", "btn btn-primary form-submit"), + let button_type = match self.button_type() { + ButtonType::Button => "button", + ButtonType::Reset => "reset", + ButtonType::Submit => "submit", }; let id = match self.name() { Some(name) => Some(concat_string!("edit-", name)), @@ -51,7 +52,7 @@ impl PageComponent for Button { button type=(button_type) id=[id] - class=[self.classes(button_class)] + class=[self.classes()] name=[self.name()] value=[self.value()] autofocus=[self.autofocus()] @@ -72,13 +73,17 @@ impl Button { } pub fn reset(value: &str) -> Self { - let mut button = Button::new().with_value(value); + let mut button = Button::new() + .with_classes("form-reset", ClassesOp::Replace("form-button")) + .with_value(value); button.button_type = ButtonType::Reset; button } pub fn submit(value: &str) -> Self { - let mut button = Button::new().with_value(value); + let mut button = Button::new() + .with_classes("form-submit", ClassesOp::Replace("form-button")) + .with_value(value); button.button_type = ButtonType::Submit; button } @@ -86,26 +91,68 @@ impl Button { // Button BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_name(mut self, name: &str) -> Self { - self.name.with_value(name); + self.alter_name(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value.with_value(value); + self.alter_value(value); self } pub fn with_autofocus(mut self, toggle: bool) -> Self { + self.alter_autofocus(toggle); + self + } + + pub fn with_disabled(mut self, toggle: bool) -> Self { + self.alter_disabled(toggle); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Button ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.with_value(name); + self + } + + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.with_value(value); + self + } + + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -113,7 +160,7 @@ impl Button { self } - pub fn with_disabled(mut self, toggle: bool) -> Self { + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -121,17 +168,12 @@ impl Button { self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); self } - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); - self - } - - pub fn using_template(mut self, template: &str) -> Self { + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -158,15 +200,11 @@ impl Button { self.disabled.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 40c2f784..10e795cb 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -20,21 +20,22 @@ pub struct Date { impl PageComponent for Date { fn new() -> Self { Date { - renderable : always, + renderable : render_always, weight : 0, - name : OptAttr::none(), - value : OptAttr::none(), - label : OptAttr::none(), - placeholder : OptAttr::none(), - autofocus : OptAttr::none(), - autocomplete: OptAttr::none(), - disabled : OptAttr::none(), - readonly : OptAttr::none(), - required : OptAttr::none(), - help_text : OptAttr::none(), - classes : Classes::none(), + name : OptAttr::new(), + value : OptAttr::new(), + label : OptAttr::new(), + placeholder : OptAttr::new(), + autofocus : OptAttr::new(), + autocomplete: OptAttr::new(), + disabled : OptAttr::new(), + readonly : OptAttr::new(), + required : OptAttr::new(), + help_text : OptAttr::new(), + classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } + .with_classes("form-type-date", ClassesOp::AddFirst) } fn is_renderable(&self) -> bool { @@ -46,18 +47,12 @@ impl PageComponent for Date { } fn default_render(&self, _: &mut PageAssets) -> Markup { - let (classes, id) = match self.name() { - Some(name) => ( - concat_string!("form-item form-item-", name, " form-type-date"), - Some(concat_string!("edit-", name)) - ), - None => ( - "form-item form-type-date".to_owned(), - None - ) + let id = match self.name() { + Some(name) => Some(concat_string!("edit-", name)), + None => None, }; html! { - div class=[self.classes(classes.as_str())] { + div class=[self.classes()] { @match self.label() { Some(label) => label class="form-label" for=[&id] { (label) " " @@ -96,36 +91,108 @@ impl Date { // Date BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_name(mut self, name: &str) -> Self { - self.name.with_value(name); + self.alter_name(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value.with_value(value); + self.alter_value(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label.with_value(label); + self.alter_label(label); self } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder.with_value(placeholder); + self.alter_placeholder(placeholder); self } pub fn with_autofocus(mut self, toggle: bool) -> Self { + self.alter_autofocus(toggle); + self + } + + pub fn with_autocomplete(mut self, toggle: bool) -> Self { + self.alter_autocomplete(toggle); + self + } + + pub fn with_disabled(mut self, toggle: bool) -> Self { + self.alter_disabled(toggle); + self + } + + pub fn with_readonly(mut self, toggle: bool) -> Self { + self.alter_readonly(toggle); + self + } + + pub fn with_required(mut self, toggle: bool) -> Self { + self.alter_required(toggle); + self + } + + pub fn with_help_text(mut self, help_text: &str) -> Self { + self.alter_help_text(help_text); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Date ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.with_value(name); + self + } + + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.with_value(value); + self + } + + pub fn alter_label(&mut self, label: &str) -> &mut Self { + self.label.with_value(label); + self + } + + pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { + self.placeholder.with_value(placeholder); + self + } + + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -133,7 +200,7 @@ impl Date { self } - pub fn with_autocomplete(mut self, toggle: bool) -> Self { + pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -141,7 +208,7 @@ impl Date { self } - pub fn with_disabled(mut self, toggle: bool) -> Self { + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -149,7 +216,7 @@ impl Date { self } - pub fn with_readonly(mut self, toggle: bool) -> Self { + pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -157,7 +224,7 @@ impl Date { self } - pub fn with_required(mut self, toggle: bool) -> Self { + pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.with_value(match toggle { true => "required", false => "", @@ -165,22 +232,17 @@ impl Date { self } - pub fn with_help_text(mut self, help_text: &str) -> Self { + pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { self.help_text.with_value(help_text); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); self } - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); - self - } - - pub fn using_template(mut self, template: &str) -> Self { + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -227,15 +289,11 @@ impl Date { self.help_text.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 07cb6e17..73581ca2 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -17,14 +17,14 @@ pub struct Form { impl PageComponent for Form { fn new() -> Self { Form { - renderable: always, + renderable: render_always, weight : 0, elements : PageContainer::new(), - action : OptAttr::none(), - charset : OptAttr::some("UTF-8"), + action : OptAttr::new(), + charset : OptAttr::new_with_value("UTF-8"), method : FormMethod::Post, - id : OptIden::none(), - classes : Classes::none(), + id : OptIden::new(), + classes : Classes::new_with_default("form"), template : "default".to_owned(), } } @@ -45,7 +45,7 @@ impl PageComponent for Form { html! { form id=[self.id()] - class=[self.classes("form")] + class=[self.classes()] action=[self.action()] method=[method] accept-charset=[self.charset()] @@ -72,46 +72,83 @@ impl Form { // Form BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_action(mut self, action: &str) -> Self { - self.action.with_value(action); + self.alter_action(action); self } pub fn with_charset(mut self, charset: &str) -> Self { - self.charset.with_value(charset); + self.alter_charset(charset); self } pub fn with_method(mut self, method: FormMethod) -> Self { - self.method = method; + self.alter_method(method); self } pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); + self.alter_id(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); - self - } - - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Form ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_action(&mut self, action: &str) -> &mut Self { + self.action.with_value(action); + self + } + + pub fn alter_charset(&mut self, charset: &str) -> &mut Self { + self.charset.with_value(charset); + self + } + + pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { + self.method = method; + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -134,15 +171,11 @@ impl Form { self.id.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 8f2cc4b3..736aa4ce 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -10,8 +10,8 @@ impl PageComponent for Hidden { fn new() -> Self { Hidden { weight: 0, - name : OptIden::none(), - value : OptAttr::none(), + name : OptIden::new(), + value : OptAttr::new(), } } @@ -32,24 +32,39 @@ impl PageComponent for Hidden { impl Hidden { pub fn set(name: &str, value: &str) -> Self { - Hidden::new() - .with_name(name) - .with_value(value) + Hidden::new().with_name(name).with_value(value) } // Hidden BUILDER. pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_name(mut self, name: &str) -> Self { - self.name.with_value(name); + self.alter_name(name); self } pub fn with_value(mut self, value: &str) -> Self { + self.alter_value(value); + self + } + + // Hidden ALTER. + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.with_value(name); + self + } + + pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.with_value(value); self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 9d6e1afd..71d801b7 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -26,25 +26,26 @@ pub struct Input { impl PageComponent for Input { fn new() -> Self { Input { - renderable : always, + renderable : render_always, weight : 0, input_type : InputType::Textfield, - name : OptIden::none(), - value : OptAttr::none(), - label : OptAttr::none(), + name : OptIden::new(), + value : OptAttr::new(), + label : OptAttr::new(), size : Some(60), minlength : None, maxlength : Some(128), - placeholder : OptAttr::none(), - autofocus : OptAttr::none(), - autocomplete: OptAttr::none(), - disabled : OptAttr::none(), - readonly : OptAttr::none(), - required : OptAttr::none(), - help_text : OptAttr::none(), - classes : Classes::none(), + placeholder : OptAttr::new(), + autofocus : OptAttr::new(), + autocomplete: OptAttr::new(), + disabled : OptAttr::new(), + readonly : OptAttr::new(), + required : OptAttr::new(), + help_text : OptAttr::new(), + classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } + .with_classes("form-type-textfield", ClassesOp::AddFirst) } fn is_renderable(&self) -> bool { @@ -55,27 +56,28 @@ impl PageComponent for Input { self.weight } + fn before_render(&mut self, _: &mut PageAssets) { + if let Some(name) = self.name() { + let class = concat_string!("form-item-", name); + self.alter_classes(class.as_str(), ClassesOp::AddFirst); + } + } + fn default_render(&self, _: &mut PageAssets) -> Markup { - let (type_input, type_class) = match self.input_type() { - InputType::Email => ("email", "form-type-email"), - InputType::Password => ("password", "form-type-password"), - InputType::Search => ("search", "form-type-search"), - InputType::Telephone => ("tel", "form-type-telephone"), - InputType::Textfield => ("text", "form-type-textfield"), - InputType::Url => ("url", "form-type-url") + let type_input = match self.input_type() { + InputType::Email => "email", + InputType::Password => "password", + InputType::Search => "search", + InputType::Telephone => "tel", + InputType::Textfield => "text", + InputType::Url => "url", }; - let (class, id) = match self.name() { - Some(name) => ( - concat_string!("form-item form-item-", name, " ", type_class), - Some(concat_string!("edit-", name)) - ), - None => ( - concat_string!("form-item ", type_class), - None - ) + let id = match self.name() { + Some(name) => Some(concat_string!("edit-", name)), + None => None, }; html! { - div class=(class) { + div class=[self.classes()] { @match self.label() { Some(label) => label class="form-label" for=[&id] { (label) " " @@ -118,31 +120,36 @@ impl Input { } pub fn password() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-password", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Password; input } pub fn search() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-search", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Search; input } pub fn email() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-email", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Email; input } pub fn telephone() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-telephone", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Telephone; input } pub fn url() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-url", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Url; input } @@ -150,51 +157,138 @@ impl Input { // Input BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_name(mut self, name: &str) -> Self { - self.name.with_value(name); + self.alter_name(name); self } pub fn with_value(mut self, value: &str) -> Self { - self.value.with_value(value); + self.alter_value(value); self } pub fn with_label(mut self, label: &str) -> Self { - self.label.with_value(label); + self.alter_label(label); self } pub fn with_size(mut self, size: Option<u16>) -> Self { - self.size = size; + self.alter_size(size); self } pub fn with_minlength(mut self, minlength: Option<u16>) -> Self { - self.minlength = minlength; + self.alter_minlength(minlength); self } pub fn with_maxlength(mut self, maxlength: Option<u16>) -> Self { - self.maxlength = maxlength; + self.alter_maxlength(maxlength); self } pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.placeholder.with_value(placeholder); + self.alter_placeholder(placeholder); self } pub fn with_autofocus(mut self, toggle: bool) -> Self { + self.alter_autofocus(toggle); + self + } + + pub fn with_autocomplete(mut self, toggle: bool) -> Self { + self.alter_autocomplete(toggle); + self + } + + pub fn with_disabled(mut self, toggle: bool) -> Self { + self.alter_disabled(toggle); + self + } + + pub fn with_readonly(mut self, toggle: bool) -> Self { + self.alter_readonly(toggle); + self + } + + pub fn with_required(mut self, toggle: bool) -> Self { + self.alter_required(toggle); + self + } + + pub fn with_help_text(mut self, help_text: &str) -> Self { + self.alter_help_text(help_text); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Input ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.with_value(name); + self + } + + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.with_value(value); + self + } + + pub fn alter_label(&mut self, label: &str) -> &mut Self { + self.label.with_value(label); + self + } + + pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { + self.size = size; + self + } + + pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { + self.minlength = minlength; + self + } + + pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { + self.maxlength = maxlength; + self + } + + pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { + self.placeholder.with_value(placeholder); + self + } + + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.with_value(match toggle { true => "autofocus", false => "", @@ -202,7 +296,7 @@ impl Input { self } - pub fn with_autocomplete(mut self, toggle: bool) -> Self { + pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.with_value(match toggle { true => "", false => "off", @@ -210,7 +304,7 @@ impl Input { self } - pub fn with_disabled(mut self, toggle: bool) -> Self { + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.with_value(match toggle { true => "disabled", false => "", @@ -218,7 +312,7 @@ impl Input { self } - pub fn with_readonly(mut self, toggle: bool) -> Self { + pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.with_value(match toggle { true => "readonly", false => "", @@ -226,7 +320,7 @@ impl Input { self } - pub fn with_required(mut self, toggle: bool) -> Self { + pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.with_value(match toggle { true => "required", false => "", @@ -234,22 +328,17 @@ impl Input { self } - pub fn with_help_text(mut self, help_text: &str) -> Self { + pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { self.help_text.with_value(help_text); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); self } - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); - self - } - - pub fn using_template(mut self, template: &str) -> Self { + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -312,15 +401,11 @@ impl Input { self.help_text.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index f29544ca..77512ea2 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -12,11 +12,11 @@ pub struct Column { impl PageComponent for Column { fn new() -> Self { Column { - renderable: always, + renderable: render_always, weight : 0, components: PageContainer::new(), - id : OptIden::none(), - classes : Classes::none(), + id : OptIden::new(), + classes : Classes::new_with_default("col"), template : "default".to_owned(), } } @@ -35,7 +35,7 @@ impl PageComponent for Column { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[self.id()] class=[self.classes("col")] { + div id=[self.id()] class=[self.classes()] { (self.components().render(assets)) } } @@ -58,31 +58,53 @@ impl Column { // Column BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); + self.alter_id(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); - self - } - - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Column ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -93,15 +115,11 @@ impl Column { self.id.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 96d74afc..4574b090 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -12,11 +12,11 @@ pub struct Row { impl PageComponent for Row { fn new() -> Self { Row { - renderable: always, + renderable: render_always, weight : 0, columns : PageContainer::new(), - id : OptIden::none(), - classes : Classes::none(), + id : OptIden::new(), + classes : Classes::new_with_default("row"), template : "default".to_owned(), } } @@ -35,7 +35,7 @@ impl PageComponent for Row { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! { - div id=[self.id()] class=[self.classes("row")] { + div id=[self.id()] class=[self.classes()] { (self.columns().render(assets)) } } @@ -58,36 +58,53 @@ impl Row { // Row BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); + self.alter_id(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); - self - } - - pub fn set_classes_ref(&mut self, classes: &str) -> &Self { - self.classes.set_classes(classes); - self - } - - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Row ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -98,15 +115,11 @@ impl Row { self.id.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 1384f4df..62690679 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -12,11 +12,11 @@ pub struct Image { impl PageComponent for Image { fn new() -> Self { Image { - renderable: always, + renderable: render_always, weight : 0, - source : OptAttr::none(), - id : OptIden::none(), - classes : Classes::none(), + source : OptAttr::new(), + id : OptIden::new(), + classes : Classes::new_with_default("img-fluid"), template : "default".to_owned(), } } @@ -34,7 +34,7 @@ impl PageComponent for Image { img src=[self.source()] id=[self.id()] - class=[self.classes("img-fluid")]; + class=[self.classes()]; } } } @@ -47,36 +47,63 @@ impl Image { // Image BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_source(mut self, source: &str) -> Self { - self.source.with_value(source); + self.alter_source(source); self } pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); + self.alter_id(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); - self - } - - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Image ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_source(&mut self, source: &str) -> &mut Self { + self.source.with_value(source); + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -91,15 +118,11 @@ impl Image { self.id.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 01a60129..68c5c97e 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -23,7 +23,7 @@ pub struct MenuItem { impl PageComponent for MenuItem { fn new() -> Self { MenuItem { - renderable: always, + renderable: render_always, weight : 0, item_type : MenuItemType::Void, } @@ -72,7 +72,7 @@ impl PageComponent for MenuItem { impl MenuItem { pub fn label(label: &str) -> Self { MenuItem { - renderable: always, + renderable: render_always, weight : 0, item_type : MenuItemType::Label(label.to_owned()), } @@ -80,7 +80,7 @@ impl MenuItem { pub fn link(label: &str, path: &str) -> Self { MenuItem { - renderable: always, + renderable: render_always, weight : 0, item_type : MenuItemType::Link( label.to_owned(), @@ -91,7 +91,7 @@ impl MenuItem { pub fn link_blank(label: &str, path: &str) -> Self { MenuItem { - renderable: always, + renderable: render_always, weight : 0, item_type : MenuItemType::LinkBlank( label.to_owned(), @@ -102,7 +102,7 @@ impl MenuItem { pub fn html(html: Markup) -> Self { MenuItem { - renderable: always, + renderable: render_always, weight : 0, item_type : MenuItemType::Html(html), } @@ -110,7 +110,7 @@ impl MenuItem { pub fn separator() -> Self { MenuItem { - renderable: always, + renderable: render_always, weight : 0, item_type : MenuItemType::Separator, } @@ -118,7 +118,7 @@ impl MenuItem { pub fn submenu(label: &str, menu: Menu) -> Self { MenuItem { - renderable: always, + renderable: render_always, weight : 0, item_type : MenuItemType::Submenu( label.to_owned(), @@ -130,11 +130,23 @@ impl MenuItem { // MenuItem BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { + self.alter_weight(weight); + self + } + + // MenuItem ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { self.weight = weight; self } @@ -162,11 +174,11 @@ pub struct Menu { impl PageComponent for Menu { fn new() -> Self { Menu { - renderable: always, + renderable: render_always, weight : 0, items : PageContainer::new(), - id : OptIden::none(), - classes : Classes::none(), + id : OptIden::new(), + classes : Classes::new_with_default("sm sm-clean"), template : "default".to_owned(), } } @@ -194,7 +206,7 @@ impl PageComponent for Menu { let id = assets.serial_id(self.name(), self.id()); html! { - ul id=(id) class=[self.classes("sm sm-clean")] { + ul id=(id) class=[self.classes()] { (self.items().render(assets)) } script type="text/javascript" defer { @@ -223,31 +235,53 @@ impl Menu { // Menu BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.renderable = renderable; + self.alter_renderable(renderable); self } pub fn with_weight(mut self, weight: i8) -> Self { - self.weight = weight; + self.alter_weight(weight); self } pub fn with_id(mut self, id: &str) -> Self { - self.id.with_value(id); + self.alter_id(id); self } - pub fn set_classes(mut self, classes: &str) -> Self { - self.classes.set_classes(classes); - self - } - - pub fn add_classes(mut self, classes: &str) -> Self { - self.classes.add_classes(classes); + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); self } pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Menu ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } @@ -258,15 +292,11 @@ impl Menu { self.id.option() } - pub fn classes(&self, default: &str) -> Option<String> { - self.classes.option(default) + pub fn classes(&self) -> &Option<String> { + self.classes.option() } pub fn template(&self) -> &str { self.template.as_str() } } - -fn always() -> bool { - true -} diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index cf83a8f6..c7aa3cb2 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -32,33 +32,21 @@ impl ThemeTrait for BulmixTheme { .add_jquery(); } - fn render_component( + fn before_render_component( &self, component: &mut dyn PageComponent, - assets: &mut PageAssets - ) -> Option<Markup> { + _assets: &mut PageAssets + ) { match component.name() { "GridRow" => { let row = component.downcast_mut::<grid::Row>().unwrap(); - row.set_classes_ref("Prueba"); - None - /* - Some(html! { - div id=[row.id()] class=[row.classes("columns")] { - (row.columns().render(assets)) - } - }) - */ + row.alter_classes("columns", ClassesOp::SetDefault); }, "GridColumn" => { - let col = component.downcast_ref::<grid::Column>().unwrap(); - Some(html! { - div id=[col.id()] class=[col.classes("column")] { - (col.components().render(assets)) - } - }) + let col = component.downcast_mut::<grid::Column>().unwrap(); + col.alter_classes("column", ClassesOp::SetDefault); }, - _ => None + _ => {}, } } } diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 6c41aafb..225d6537 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,23 +1,82 @@ use crate::concat_string; -pub struct Classes(String); +pub enum ClassesOp { + Add, + AddAfter(&'static str), + AddBefore(&'static str), + AddFirst, + Replace(&'static str), + Reset, + SetDefault, +} + +pub struct Classes { + default: String, + added : String, + option : Option<String>, +} impl Classes { - pub fn none() -> Self { - Classes("".to_owned()) + pub fn new() -> Self { + Classes { + default: "".to_owned(), + added : "".to_owned(), + option : None, + } } - pub fn set_classes(&mut self, classes: &str) -> &mut Self { - self.0 = classes.to_owned(); + pub fn new_with_default(default: &str) -> Self { + let mut classes = Self::new(); + classes.alter(default, ClassesOp::SetDefault); + classes + } + + pub fn alter(&mut self, classes: &str, op: ClassesOp) -> &Self { + let classes = classes.trim(); + match op { + ClassesOp::Add => self.added.push_str(concat_string!(" ", classes).as_str()), + + ClassesOp::AddAfter(class) => { + let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); + match v_added.iter().position(|c| c.eq(&class)) { + Some(pos) => v_added.insert(pos + 1, classes), + _ => v_added.push(classes), + } + self.added = v_added.join(" "); + }, + + ClassesOp::AddBefore(class) => { + let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); + match v_added.iter().position(|c| c.eq(&class)) { + Some(pos) => v_added.insert(pos, classes), + _ => v_added.insert(0, classes), + } + self.added = v_added.join(" "); + }, + + ClassesOp::AddFirst => self.added = concat_string!(classes, " ", self.added), + + ClassesOp::Replace(class) => { + let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); + match v_added.iter().position(|c| c.eq(&class)) { + Some(pos) => { + v_added.remove(pos); + v_added.insert(pos, classes); + }, + _ => v_added.push(classes), + } + self.added = v_added.join(" "); + }, + + ClassesOp::Reset => self.added = classes.to_owned(), + + ClassesOp::SetDefault => self.default = classes.to_owned(), + } + self.option = Some(concat_string!(self.default, " ", self.added).trim().to_owned()); self } - pub fn add_classes(&mut self, classes: &str) -> &mut Self { - self.0 = concat_string!(self.0, " ", classes).trim().to_owned(); - self - } - - pub fn option(&self, default: &str) -> Option<String> { - Some(concat_string!(default.to_owned(), " ", self.0).trim().to_owned()) + pub fn option(&self) -> &Option<String> { + &self.option } } diff --git a/pagetop/src/html/mod.rs b/pagetop/src/html/mod.rs index 52f735fe..56e5c6d2 100644 --- a/pagetop/src/html/mod.rs +++ b/pagetop/src/html/mod.rs @@ -5,4 +5,4 @@ pub use optiden::OptIden; mod optattr; pub use optattr::OptAttr; mod classes; -pub use classes::Classes; +pub use classes::{Classes, ClassesOp}; diff --git a/pagetop/src/html/optattr.rs b/pagetop/src/html/optattr.rs index d009e32e..86c21e8c 100644 --- a/pagetop/src/html/optattr.rs +++ b/pagetop/src/html/optattr.rs @@ -1,14 +1,14 @@ pub struct OptAttr(Option<String>); impl OptAttr { - pub fn none() -> Self { + pub fn new() -> Self { OptAttr(None) } - pub fn some(value: &str) -> Self { - let mut o = OptAttr(None); - o.with_value(value); - o + pub fn new_with_value(value: &str) -> Self { + let mut option = Self::new(); + option.with_value(value); + option } pub fn with_value(&mut self, value: &str) -> &mut Self { diff --git a/pagetop/src/html/optiden.rs b/pagetop/src/html/optiden.rs index 52a65c10..450867d9 100644 --- a/pagetop/src/html/optiden.rs +++ b/pagetop/src/html/optiden.rs @@ -1,17 +1,17 @@ pub struct OptIden(Option<String>); impl OptIden { - pub fn none() -> Self { + pub fn new() -> Self { OptIden(None) } - pub fn some(id: &str) -> Self { - let mut o = OptIden(None); - o.with_value(id); - o + pub fn new_with_value(id: &str) -> Self { + let mut option = Self::new(); + option.with_value(id); + option } - pub fn with_value(&mut self, id: &str) -> &mut Self { + pub fn with_value(&mut self, id: &str) -> &Self { let id = id.trim(); self.0 = match id.is_empty() { true => None, diff --git a/pagetop/src/response/page/assets.rs b/pagetop/src/response/page/assets.rs index 3d42a06f..8ab4d2eb 100644 --- a/pagetop/src/response/page/assets.rs +++ b/pagetop/src/response/page/assets.rs @@ -257,7 +257,7 @@ impl PageAssets { /// Assets GETTERS. - pub fn theme(&mut self) -> &'static dyn ThemeTrait { + pub(crate) fn theme(&mut self) -> &'static dyn ThemeTrait { self.theme } diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 630b8a9b..05528fc8 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -33,6 +33,10 @@ pub trait PageComponent: Downcast + Send + Sync { 0 } + #[allow(unused_variables)] + fn before_render(&mut self, assets: &mut PageAssets) { + } + #[allow(unused_variables)] fn default_render(&self, assets: &mut PageAssets) -> Markup { html! {} diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index f34070e2..527f74f9 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -17,3 +17,6 @@ pub use page::Page; pub use page::render_component; pub use page::add_component_to; +pub fn render_always() -> bool { true } + +pub fn render_never() -> bool { false } \ No newline at end of file diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 56db5ecc..f7bee609 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,6 +1,6 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; -use crate::html::{Classes, DOCTYPE, Markup, OptAttr, html}; +use crate::html::*; use crate::response::page::*; use std::sync::RwLock; @@ -55,18 +55,18 @@ impl<'a> Page<'a> { pub fn new() -> Self { Page { language : match &*DEFAULT_LANGUAGE { - Some(language) => OptAttr::some(language), - _ => OptAttr::none(), + Some(language) => OptAttr::new_with_value(language), + _ => OptAttr::new(), }, direction : match &*DEFAULT_DIRECTION { - Some(direction) => OptAttr::some(direction), - _ => OptAttr::none(), + Some(direction) => OptAttr::new_with_value(direction), + _ => OptAttr::new(), }, - title : OptAttr::none(), - description : OptAttr::none(), + title : OptAttr::new(), + description : OptAttr::new(), assets : PageAssets::new(), regions : COMPONENTS.read().unwrap().clone(), - body_classes: Classes::none(), + body_classes: Classes::new_with_default("body"), template : "default".to_owned(), } } @@ -110,13 +110,8 @@ impl<'a> Page<'a> { self } - pub fn set_body_classes(&mut self, classes: &str) -> &mut Self { - self.body_classes.set_classes(classes); - self - } - - pub fn add_body_classes(&mut self, classes: &str) -> &mut Self { - self.body_classes.add_classes(classes); + pub fn alter_body_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.body_classes.alter(classes, op); self } @@ -147,8 +142,8 @@ impl<'a> Page<'a> { &mut self.assets } - pub fn body_classes(&self, default: &str) -> Option<String> { - self.body_classes.option(default) + pub fn body_classes(&self) -> &Option<String> { + self.body_classes.option() } pub fn template(&self) -> &str { @@ -192,14 +187,15 @@ impl<'a> Page<'a> { } } -pub fn render_component( - component: &mut dyn PageComponent, - assets: &mut PageAssets -) -> Markup { +pub fn render_component(component: &mut dyn PageComponent, assets: &mut PageAssets) -> Markup { + component.before_render(assets); + assets.theme().before_render_component(component, assets); match component.is_renderable() { - true => match assets.theme().render_component(component, assets) { - Some(html) => html, - None => component.default_render(assets) + true => { + match assets.theme().render_component(component, assets) { + Some(html) => html, + None => component.default_render(assets) + } }, false => html! {} } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 457860c7..983bf0a6 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -55,7 +55,7 @@ pub trait ThemeTrait: Send + Sync { fn render_page_body(&self, page: &mut Page) -> Markup { html! { - body class=[page.body_classes("body")] { + body class=[page.body_classes()] { @match page.template() { "admin" => { @for region in &["top-menu", "side-menu", "content"] { @@ -75,10 +75,29 @@ pub trait ThemeTrait: Send + Sync { } #[allow(unused_variables)] - fn render_component( + fn before_render_component( &self, component: &mut dyn PageComponent, assets: &mut PageAssets + ) { + /* + Cómo usarlo: + + match component.name() { + "Block" => { + let block = component.downcast_mut::<Block>().unwrap(); + block.alter_title("New title"); + }, + _ => {}, + } + */ + } + + #[allow(unused_variables)] + fn render_component( + &self, + component: &dyn PageComponent, + assets: &mut PageAssets ) -> Option<Markup> { None /* @@ -89,10 +108,10 @@ pub trait ThemeTrait: Send + Sync { let block = component.downcast_ref::<Block>().unwrap(); match block.template() { "default" => Some(block_default(block)), - _ => None + _ => None, } }, - _ => None + _ => None, } */ } From 993d6fc0eb0fd31ba09cb457961ac477a31b18f1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Apr 2022 20:54:01 +0200 Subject: [PATCH 052/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- pagetop/Cargo.toml | 12 ++++++------ pagetop/STARTER.bin.Cargo.toml | 2 +- pagetop/STARTER.lib.Cargo.toml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 59c24cb3..d5e3aa84 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -14,5 +14,5 @@ repository = "https://gitlab.com/manuelcillero/pagetop" [dependencies] pagetop = { path = "../pagetop" } -sea-orm = { version = "0.6.0" } +sea-orm = { version = "0.7.1" } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 8598de96..b058c7b4 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.6" +version = "0.0.8" edition = "2021" authors = [ @@ -35,12 +35,12 @@ url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } tracing = "0.1.32" -tracing-appender = "0.2.1" -tracing-subscriber = { version = "0.3.9", features = ["json", "env-filter"] } +tracing-appender = "0.2.2" +tracing-subscriber = { version = "0.3.10", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } tracing-actix-web = "0.2" -fluent-templates = "0.6.1" +fluent-templates = "0.7.1" unic-langid = "0.9.0" actix-web = "3.3.3" @@ -53,13 +53,13 @@ sycamore = { version = "0.7.1", features = ["ssr"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.6.0" +version = "0.7.1" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.6.0" +version = "0.7.1" features = ["debug-print", "migration"] default-features = false optional = true diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index 9c6c8979..f9c6560f 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -22,6 +22,6 @@ actix-web = "3.3.3" # Si se usa la macro html!: maud = { version = "0.23.0" } # Si se usa base de datos: -sea-orm = { version = "0.6.0" } +sea-orm = { version = "0.7.1" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index e98fed13..7a74f96e 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -11,6 +11,6 @@ pagetop = { path = "../pagetop" } # Si se usa la macro html!: maud = { version = "0.23.0" } # Si se usa base de datos: -sea-orm = { version = "0.6.0" } +sea-orm = { version = "0.7.1" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } From d37b2e09abc8797ccfa5baed0d06ca06cbecb01a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 19 Apr 2022 01:32:42 +0200 Subject: [PATCH 053/853] =?UTF-8?q?A=C3=B1ade=20nueva=20macro=20module=5Fn?= =?UTF-8?q?ame!()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Devuelve el nombre del módulo actual en el que se ejecuta la macro. --- pagetop/src/db.rs | 1 + pagetop/src/prelude.rs | 1 + pagetop/src/util.rs | 11 +++++++++++ 3 files changed, 13 insertions(+) diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index d68a5aac..550f8f66 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -11,6 +11,7 @@ pub mod entity { pub mod migration { pub use sea_schema::migration::prelude::*; + pub use crate::module_name; } #[macro_export] diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 429c9449..55c9681e 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -4,6 +4,7 @@ pub use crate::{ args, concat_string, + module_name, theme_static_files, }; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index c2fd58d3..02bb584e 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -18,6 +18,17 @@ macro_rules! args { }}; } +#[macro_export] +macro_rules! module_name { + () => {{ + let name = module_path!(); + match name.rfind("::") { + Some(position) => &name[(position + 2)..], + None => name + } + }}; +} + #[macro_export] macro_rules! theme_static_files { ( $cfg:ident, $dir:expr ) => {{ From 4af658600366768a3d734dbc1c7fd32c842e83c6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 19 Apr 2022 01:47:33 +0200 Subject: [PATCH 054/853] =?UTF-8?q?A=C3=B1ade=20la=20creaci=C3=B3n=20de=20?= =?UTF-8?q?tablas=20asociadas=20a=20usuarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/lib.rs | 5 +- .../m20220312_000001_create_table_role.rs | 65 +++++++++++++ .../m20220312_000001_create_table_user.rs | 54 ----------- ...312_000002_create_table_role_permission.rs | 77 +++++++++++++++ .../m20220312_000003_create_table_user.rs | 97 +++++++++++++++++++ ...m20220312_000004_create_table_user_role.rs | 80 +++++++++++++++ pagetop-user/src/migration/mod.rs | 5 +- 7 files changed, 327 insertions(+), 56 deletions(-) create mode 100644 pagetop-user/src/migration/m20220312_000001_create_table_role.rs delete mode 100644 pagetop-user/src/migration/m20220312_000001_create_table_user.rs create mode 100644 pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs create mode 100644 pagetop-user/src/migration/m20220312_000003_create_table_user.rs create mode 100644 pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index c40057f0..4059cc79 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -26,7 +26,10 @@ impl ModuleTrait for UserModule { fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { vec![ - boxed_migration!(m20220312_000001_create_table_user) + boxed_migration!(m20220312_000001_create_table_role), + boxed_migration!(m20220312_000002_create_table_role_permission), + boxed_migration!(m20220312_000003_create_table_user), + boxed_migration!(m20220312_000004_create_table_user_role), ] } } diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs new file mode 100644 index 00000000..af453f74 --- /dev/null +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -0,0 +1,65 @@ +use pagetop::db::migration::*; + +#[derive(Iden)] +enum Role { Table, + Rid, + Name, + Weight, +} + +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + // Store user roles. + Table::create() + .table(Role::Table) + .if_not_exists() + // Primary Key: Unique role ID. + .col(ColumnDef::new(Role::Rid) + .unsigned() + .not_null() + .auto_increment() + .primary_key() + ) + // Unique role name. + .col(ColumnDef::new(Role::Name) + .string_len(64) + .not_null() + .unique_key() + ) + // The weight of this role in listings and the user interface. + .col(ColumnDef::new(Role::Weight) + .integer() + .not_null() + .default(0) + ) + // INDEXES. + .index(Index::create() + .name("name-weight") + .col(Role::Name) + .col(Role::Weight) + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(Role::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() + } +} diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_user.rs b/pagetop-user/src/migration/m20220312_000001_create_table_user.rs deleted file mode 100644 index 729b72e0..00000000 --- a/pagetop-user/src/migration/m20220312_000001_create_table_user.rs +++ /dev/null @@ -1,54 +0,0 @@ -use crate::db::migration::*; - -#[derive(Iden)] -enum User { - Table, - Id, - Title, - Text, -} - -pub struct Migration; - -impl MigrationName for Migration { - fn name(&self) -> &str { - "m20220312_000001_create_table_user" - } -} - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(User::Table) - .if_not_exists() - .col(ColumnDef::new(User::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(User::Title) - .string() - .not_null() - ) - .col(ColumnDef::new(User::Text) - .string() - .not_null() - ) - .to_owned() - ) - .await - } - - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(User::Table) - .to_owned() - ) - .await - } -} diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs new file mode 100644 index 00000000..0148af5f --- /dev/null +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -0,0 +1,77 @@ +use pagetop::db::migration::*; + +#[derive(Iden)] +enum RolePermission { Table, + Rid, + Permission, + Module, +} +#[derive(Iden)] +enum Role { Table, + Rid, +// ... +} + +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + // Stores the permissions assigned to user roles. + Table::create() + .table(RolePermission::Table) + .if_not_exists() + // Foreign Key: Role::Rid. + .col(ColumnDef::new(RolePermission::Rid) + .unsigned() + .not_null() + ) + // A single permission granted to the role identified by Rid. + .col(ColumnDef::new(RolePermission::Permission) + .string_len(128) + .not_null() + ) + // The module declaring the permission. + .col(ColumnDef::new(RolePermission::Module) + .string_len(255) + .not_null() + ) + // INDEXES. + .primary_key(Index::create() + .col(RolePermission::Rid) + .col(RolePermission::Permission) + ) + .index(Index::create() + .name("permission") + .col(RolePermission::Permission) + ) + .foreign_key( + ForeignKey::create() + .name("fk_role_permission-rid") + .from(RolePermission::Table, RolePermission::Rid) + .to(Role::Table, Role::Rid) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(RolePermission::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() + } +} diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs new file mode 100644 index 00000000..bf151f50 --- /dev/null +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -0,0 +1,97 @@ +use pagetop::db::migration::*; + +#[derive(Iden)] +enum User { Table, + Uid, + Name, + Pass, + Mail, + Created, + Changed, + Access, + Login, + Status, + Timezone, +} + +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + // Stores user data. + Table::create() + .table(User::Table) + .if_not_exists() + // Primary Key: Unique user ID. + .col(ColumnDef::new(User::Uid) + .unsigned() + .not_null() + .primary_key() + ) + // Unique user name. + .col(ColumnDef::new(User::Name) + .string_len(60) + .not_null() + .unique_key() + ) + // User's password (hashed). + .col(ColumnDef::new(User::Pass) + .string_len(128) + .not_null() + ) + // User's e-mail address. + .col(ColumnDef::new(User::Mail) + .string_len(255) + ) + // Timestamp for when user was created. + .col(ColumnDef::new(User::Created) + .timestamp() + .not_null() + ) + // Timestamp for when user was changed. + .col(ColumnDef::new(User::Changed) + .timestamp() + .not_null() + ) + // Timestamp for previous time user accessed the site. + .col(ColumnDef::new(User::Access) + .timestamp() + .not_null() + ) + // Timestamp for user's last login. + .col(ColumnDef::new(User::Login) + .timestamp() + .not_null() + ) + // Whether the user is active(1) or blocked(0). + .col(ColumnDef::new(User::Status) + .boolean() + .not_null() + ) + // User's time zone. + .col(ColumnDef::new(User::Timezone) + .string_len(32) + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(User::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() + } +} diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs new file mode 100644 index 00000000..f92d019b --- /dev/null +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -0,0 +1,80 @@ +use pagetop::db::migration::*; + +#[derive(Iden)] +enum UserRole { Table, + Uid, + Rid, +} +#[derive(Iden)] +enum User { Table, + Uid, +// ... +} +#[derive(Iden)] +enum Role { Table, + Rid, +// ... +} + +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + // Maps users to roles. + Table::create() + .table(UserRole::Table) + .if_not_exists() + // Foreign Key: User::Uid for user. + .col(ColumnDef::new(UserRole::Uid) + .unsigned() + .not_null() + ) + // Foreign Key: Role::Rid for role. + .col(ColumnDef::new(UserRole::Rid) + .unsigned() + .not_null() + ) + // INDEXES. + .primary_key(Index::create() + .col(UserRole::Uid) + .col(UserRole::Rid) + ) + .foreign_key( + ForeignKey::create() + .name("fk_user_role-uid") + .from(UserRole::Table, UserRole::Uid) + .to(User::Table, User::Uid) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .foreign_key( + ForeignKey::create() + .name("fk_user_role-rid") + .from(UserRole::Table, UserRole::Rid) + .to(Role::Table, Role::Rid) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .to_owned() + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop() + .table(UserRole::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() + } +} diff --git a/pagetop-user/src/migration/mod.rs b/pagetop-user/src/migration/mod.rs index 60836980..f56a9b53 100644 --- a/pagetop-user/src/migration/mod.rs +++ b/pagetop-user/src/migration/mod.rs @@ -1 +1,4 @@ -pub mod m20220312_000001_create_table_user; +pub mod m20220312_000001_create_table_role; +pub mod m20220312_000002_create_table_role_permission; +pub mod m20220312_000003_create_table_user; +pub mod m20220312_000004_create_table_user_role; From d07611d044c701d3560d427c455b24ad766190f5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 20 Apr 2022 00:21:49 +0200 Subject: [PATCH 055/853] =?UTF-8?q?A=C3=B1ade=20las=20entidades=20asociada?= =?UTF-8?q?s=20a=20roles=20y=20usuarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/entity/mod.rs | 3 ++ pagetop-user/src/entity/role.rs | 41 ++++++++++++++++++++ pagetop-user/src/entity/role_permission.rs | 35 +++++++++++++++++ pagetop-user/src/entity/user.rs | 43 +++++++++++++++------ pagetop-user/src/entity/user_role.rs | 45 ++++++++++++++++++++++ 5 files changed, 156 insertions(+), 11 deletions(-) create mode 100644 pagetop-user/src/entity/role.rs create mode 100644 pagetop-user/src/entity/role_permission.rs create mode 100644 pagetop-user/src/entity/user_role.rs diff --git a/pagetop-user/src/entity/mod.rs b/pagetop-user/src/entity/mod.rs index 22d12a38..a8287bfe 100644 --- a/pagetop-user/src/entity/mod.rs +++ b/pagetop-user/src/entity/mod.rs @@ -1 +1,4 @@ +pub mod role; +pub mod role_permission; pub mod user; +pub mod user_role; diff --git a/pagetop-user/src/entity/role.rs b/pagetop-user/src/entity/role.rs new file mode 100644 index 00000000..2520ebe8 --- /dev/null +++ b/pagetop-user/src/entity/role.rs @@ -0,0 +1,41 @@ +use pagetop::db::entity::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] +#[sea_orm(table_name = "role")] +pub struct Model { + #[sea_orm(primary_key)] + pub rid : u32, + #[sea_orm(unique)] + pub name : String, + #[sea_orm(default_value = 0)] + pub weight: i32, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + RolePermission, + UserRole, +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::RolePermission => Entity::has_many(super::role_permission::Entity).into(), + Self::UserRole => Entity::has_many(super::user_role::Entity).into(), + } + } +} + +impl Related<super::role_permission::Entity> for Entity { + fn to() -> RelationDef { + Relation::RolePermission.def() + } +} + +impl Related<super::user_role::Entity> for Entity { + fn to() -> RelationDef { + Relation::UserRole.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop-user/src/entity/role_permission.rs b/pagetop-user/src/entity/role_permission.rs new file mode 100644 index 00000000..2c2859d1 --- /dev/null +++ b/pagetop-user/src/entity/role_permission.rs @@ -0,0 +1,35 @@ +use pagetop::db::entity::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] +#[sea_orm(table_name = "role_permission")] +pub struct Model { + #[sea_orm(primary_key)] + pub rid : u32, + #[sea_orm(primary_key)] + pub permission: String, + pub module : String, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Role, +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::Role => Entity::belongs_to(super::role::Entity) + .from(Column::Rid) + .to(super::role::Column::Rid) + .into(), + } + } +} + +impl Related<super::role::Entity> for Entity { + fn to() -> RelationDef { + Relation::Role.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop-user/src/entity/user.rs b/pagetop-user/src/entity/user.rs index d0db4a98..8bec2f1e 100644 --- a/pagetop-user/src/entity/user.rs +++ b/pagetop-user/src/entity/user.rs @@ -1,18 +1,39 @@ -use crate::db::entity::*; -use serde::{Deserialize, Serialize}; +use pagetop::db::entity::*; -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] #[sea_orm(table_name = "user")] pub struct Model { - #[sea_orm(primary_key)] - #[serde(skip_deserializing)] - pub id: i32, - pub title: String, - #[sea_orm(column_type = "Text")] - pub text: String, + #[sea_orm(primary_key, auto_increment = false)] + pub uid : u32, + #[sea_orm(unique)] + pub name : String, + pub pass : String, + pub mail : Option<String>, + pub created : DateTimeUtc, + pub changed : DateTimeUtc, + pub access : DateTimeUtc, + pub login : DateTimeUtc, + pub status : bool, + pub timezone: Option<String>, } -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + UserRole, +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::UserRole => Entity::has_many(super::user_role::Entity).into(), + } + } +} + +impl Related<super::user_role::Entity> for Entity { + fn to() -> RelationDef { + Relation::UserRole.def() + } +} impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop-user/src/entity/user_role.rs b/pagetop-user/src/entity/user_role.rs new file mode 100644 index 00000000..23a6af8f --- /dev/null +++ b/pagetop-user/src/entity/user_role.rs @@ -0,0 +1,45 @@ +use pagetop::db::entity::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] +#[sea_orm(table_name = "user_role")] +pub struct Model { + #[sea_orm(primary_key)] + pub uid: u32, + #[sea_orm(primary_key)] + pub rid: u32, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + User, + Role, +} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + match self { + Self::User => Entity::belongs_to(super::user::Entity) + .from(Column::Uid) + .to(super::user::Column::Uid) + .into(), + Self::Role => Entity::belongs_to(super::role::Entity) + .from(Column::Rid) + .to(super::role::Column::Rid) + .into(), + } + } +} + +impl Related<super::user::Entity> for Entity { + fn to() -> RelationDef { + Relation::User.def() + } +} + +impl Related<super::role::Entity> for Entity { + fn to() -> RelationDef { + Relation::Role.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} From 13c2e7768866715eae379521a743dacaa6cebfc8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 22 Apr 2022 20:54:44 +0200 Subject: [PATCH 056/853] Elimina la excesiva rigidez que impone SeaORM --- pagetop-user/Cargo.toml | 1 - pagetop-user/src/entity/mod.rs | 4 -- pagetop-user/src/entity/role.rs | 41 -------------------- pagetop-user/src/entity/role_permission.rs | 35 ----------------- pagetop-user/src/entity/user.rs | 39 ------------------- pagetop-user/src/entity/user_role.rs | 45 ---------------------- pagetop-user/src/lib.rs | 1 - 7 files changed, 166 deletions(-) delete mode 100644 pagetop-user/src/entity/mod.rs delete mode 100644 pagetop-user/src/entity/role.rs delete mode 100644 pagetop-user/src/entity/role_permission.rs delete mode 100644 pagetop-user/src/entity/user.rs delete mode 100644 pagetop-user/src/entity/user_role.rs diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index d5e3aa84..3395241f 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -14,5 +14,4 @@ repository = "https://gitlab.com/manuelcillero/pagetop" [dependencies] pagetop = { path = "../pagetop" } -sea-orm = { version = "0.7.1" } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop-user/src/entity/mod.rs b/pagetop-user/src/entity/mod.rs deleted file mode 100644 index a8287bfe..00000000 --- a/pagetop-user/src/entity/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod role; -pub mod role_permission; -pub mod user; -pub mod user_role; diff --git a/pagetop-user/src/entity/role.rs b/pagetop-user/src/entity/role.rs deleted file mode 100644 index 2520ebe8..00000000 --- a/pagetop-user/src/entity/role.rs +++ /dev/null @@ -1,41 +0,0 @@ -use pagetop::db::entity::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "role")] -pub struct Model { - #[sea_orm(primary_key)] - pub rid : u32, - #[sea_orm(unique)] - pub name : String, - #[sea_orm(default_value = 0)] - pub weight: i32, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - RolePermission, - UserRole, -} - -impl RelationTrait for Relation { - fn def(&self) -> RelationDef { - match self { - Self::RolePermission => Entity::has_many(super::role_permission::Entity).into(), - Self::UserRole => Entity::has_many(super::user_role::Entity).into(), - } - } -} - -impl Related<super::role_permission::Entity> for Entity { - fn to() -> RelationDef { - Relation::RolePermission.def() - } -} - -impl Related<super::user_role::Entity> for Entity { - fn to() -> RelationDef { - Relation::UserRole.def() - } -} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop-user/src/entity/role_permission.rs b/pagetop-user/src/entity/role_permission.rs deleted file mode 100644 index 2c2859d1..00000000 --- a/pagetop-user/src/entity/role_permission.rs +++ /dev/null @@ -1,35 +0,0 @@ -use pagetop::db::entity::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "role_permission")] -pub struct Model { - #[sea_orm(primary_key)] - pub rid : u32, - #[sea_orm(primary_key)] - pub permission: String, - pub module : String, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - Role, -} - -impl RelationTrait for Relation { - fn def(&self) -> RelationDef { - match self { - Self::Role => Entity::belongs_to(super::role::Entity) - .from(Column::Rid) - .to(super::role::Column::Rid) - .into(), - } - } -} - -impl Related<super::role::Entity> for Entity { - fn to() -> RelationDef { - Relation::Role.def() - } -} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop-user/src/entity/user.rs b/pagetop-user/src/entity/user.rs deleted file mode 100644 index 8bec2f1e..00000000 --- a/pagetop-user/src/entity/user.rs +++ /dev/null @@ -1,39 +0,0 @@ -use pagetop::db::entity::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "user")] -pub struct Model { - #[sea_orm(primary_key, auto_increment = false)] - pub uid : u32, - #[sea_orm(unique)] - pub name : String, - pub pass : String, - pub mail : Option<String>, - pub created : DateTimeUtc, - pub changed : DateTimeUtc, - pub access : DateTimeUtc, - pub login : DateTimeUtc, - pub status : bool, - pub timezone: Option<String>, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - UserRole, -} - -impl RelationTrait for Relation { - fn def(&self) -> RelationDef { - match self { - Self::UserRole => Entity::has_many(super::user_role::Entity).into(), - } - } -} - -impl Related<super::user_role::Entity> for Entity { - fn to() -> RelationDef { - Relation::UserRole.def() - } -} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop-user/src/entity/user_role.rs b/pagetop-user/src/entity/user_role.rs deleted file mode 100644 index 23a6af8f..00000000 --- a/pagetop-user/src/entity/user_role.rs +++ /dev/null @@ -1,45 +0,0 @@ -use pagetop::db::entity::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "user_role")] -pub struct Model { - #[sea_orm(primary_key)] - pub uid: u32, - #[sea_orm(primary_key)] - pub rid: u32, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - User, - Role, -} - -impl RelationTrait for Relation { - fn def(&self) -> RelationDef { - match self { - Self::User => Entity::belongs_to(super::user::Entity) - .from(Column::Uid) - .to(super::user::Column::Uid) - .into(), - Self::Role => Entity::belongs_to(super::role::Entity) - .from(Column::Rid) - .to(super::role::Column::Rid) - .into(), - } - } -} - -impl Related<super::user::Entity> for Entity { - fn to() -> RelationDef { - Relation::User.def() - } -} - -impl Related<super::role::Entity> for Entity { - fn to() -> RelationDef { - Relation::Role.def() - } -} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 4059cc79..a55ea4e8 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -2,7 +2,6 @@ use pagetop::prelude::*; localize!("src/locales"); -mod entity; mod migration; pub struct UserModule; From f32f69dde73ed1dd78ce8c0b56ad8ab2b8501358 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Apr 2022 21:23:00 +0200 Subject: [PATCH 057/853] Elimina downcast_rs y codifica componentes con Any --- pagetop/Cargo.toml | 1 - pagetop/src/base/component/block.rs | 4 ++++ pagetop/src/base/component/chunck.rs | 4 ++++ pagetop/src/base/component/container.rs | 4 ++++ pagetop/src/base/component/form/button.rs | 4 ++++ pagetop/src/base/component/form/date.rs | 4 ++++ pagetop/src/base/component/form/form.rs | 4 ++++ pagetop/src/base/component/form/hidden.rs | 4 ++++ pagetop/src/base/component/form/input.rs | 4 ++++ pagetop/src/base/component/grid/column.rs | 4 ++++ pagetop/src/base/component/grid/row.rs | 4 ++++ pagetop/src/base/component/image.rs | 4 ++++ pagetop/src/base/component/menu.rs | 8 ++++++++ pagetop/src/base/theme/bulmix/mod.rs | 4 ++-- pagetop/src/response/page/component.rs | 10 +++++----- pagetop/src/response/page/mod.rs | 2 +- 16 files changed, 60 insertions(+), 9 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index b058c7b4..bd2ba3a1 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -24,7 +24,6 @@ categories = [ [dependencies] concat-string = "1.0.1" doc-comment = "0.3.3" -downcast-rs = "1.2.0" figlet-rs = "0.1.3" futures = "0.3.21" once_cell = "1.10.0" diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 86370ff4..4c2ab0ab 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -45,6 +45,10 @@ impl PageComponent for Block { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Block { diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 6dbc0ff1..fa6da576 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -28,6 +28,10 @@ impl PageComponent for Chunck { fn default_render(&self, _: &mut PageAssets) -> Markup { html! { (*self.html()) } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Chunck { diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index fab8225a..de4daedc 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -72,6 +72,10 @@ impl PageComponent for Container { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Container { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 4c75dc62..5a2938a0 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -65,6 +65,10 @@ impl PageComponent for Button { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Button { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 10e795cb..b7d3924c 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -84,6 +84,10 @@ impl PageComponent for Date { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Date { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 73581ca2..67b9cd73 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -54,6 +54,10 @@ impl PageComponent for Form { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Form { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 736aa4ce..4c303e4d 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -28,6 +28,10 @@ impl PageComponent for Hidden { input type="hidden" id=[id] name=[self.name()] value=[self.value()]; } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Hidden { diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 71d801b7..21a34a53 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -112,6 +112,10 @@ impl PageComponent for Input { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Input { diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 77512ea2..58d3648f 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -40,6 +40,10 @@ impl PageComponent for Column { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Column { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 4574b090..6630901c 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -40,6 +40,10 @@ impl PageComponent for Row { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Row { diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 62690679..aaa96d86 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -37,6 +37,10 @@ impl PageComponent for Image { class=[self.classes()]; } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Image { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 68c5c97e..6e052194 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -67,6 +67,10 @@ impl PageComponent for MenuItem { MenuItemType::Void => html! {}, } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl MenuItem { @@ -217,6 +221,10 @@ impl PageComponent for Menu { } } } + + fn as_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Menu { diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index c7aa3cb2..d6fd116b 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -39,11 +39,11 @@ impl ThemeTrait for BulmixTheme { ) { match component.name() { "GridRow" => { - let row = component.downcast_mut::<grid::Row>().unwrap(); + let row = component.as_any().downcast_mut::<grid::Row>().unwrap(); row.alter_classes("columns", ClassesOp::SetDefault); }, "GridColumn" => { - let col = component.downcast_mut::<grid::Column>().unwrap(); + let col = component.as_any().downcast_mut::<grid::Column>().unwrap(); col.alter_classes("column", ClassesOp::SetDefault); }, _ => {}, diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 05528fc8..d58258a4 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -1,11 +1,11 @@ use crate::html::{Markup, html}; use crate::response::page::PageAssets; -use downcast_rs::{Downcast, impl_downcast}; - use std::any::type_name; -pub trait PageComponent: Downcast + Send + Sync { +pub use std::any::Any as AnyComponent; + +pub trait PageComponent: AnyComponent + Send + Sync { fn new() -> Self where Self: Sized; @@ -41,6 +41,6 @@ pub trait PageComponent: Downcast + Send + Sync { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! {} } -} -impl_downcast!(PageComponent); + fn as_any(&mut self) -> &mut dyn AnyComponent; +} diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 527f74f9..e238954b 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -7,7 +7,7 @@ pub use assets::{ }; mod component; -pub use component::PageComponent; +pub use component::{AnyComponent, PageComponent}; mod container; pub use container::PageContainer; From 6de248f630b0936b9a771918479e5b77d3e3cadf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Apr 2022 21:25:21 +0200 Subject: [PATCH 058/853] Elimina downcast_rs y codifica componentes con Any --- pagetop/Cargo.toml | 1 - pagetop/src/base/component/block.rs | 4 ++++ pagetop/src/base/component/chunck.rs | 4 ++++ pagetop/src/base/component/container.rs | 4 ++++ pagetop/src/base/component/form/button.rs | 4 ++++ pagetop/src/base/component/form/date.rs | 4 ++++ pagetop/src/base/component/form/form.rs | 4 ++++ pagetop/src/base/component/form/hidden.rs | 4 ++++ pagetop/src/base/component/form/input.rs | 4 ++++ pagetop/src/base/component/grid/column.rs | 4 ++++ pagetop/src/base/component/grid/row.rs | 4 ++++ pagetop/src/base/component/image.rs | 4 ++++ pagetop/src/base/component/menu.rs | 8 ++++++++ pagetop/src/base/theme/bulmix/mod.rs | 4 ++-- pagetop/src/response/page/component.rs | 10 +++++----- pagetop/src/response/page/mod.rs | 2 +- 16 files changed, 60 insertions(+), 9 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index b058c7b4..bd2ba3a1 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -24,7 +24,6 @@ categories = [ [dependencies] concat-string = "1.0.1" doc-comment = "0.3.3" -downcast-rs = "1.2.0" figlet-rs = "0.1.3" futures = "0.3.21" once_cell = "1.10.0" diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 86370ff4..697c9344 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -45,6 +45,10 @@ impl PageComponent for Block { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Block { diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 6dbc0ff1..2957671e 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -28,6 +28,10 @@ impl PageComponent for Chunck { fn default_render(&self, _: &mut PageAssets) -> Markup { html! { (*self.html()) } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Chunck { diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index fab8225a..e4e9589c 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -72,6 +72,10 @@ impl PageComponent for Container { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Container { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 4c75dc62..e098ea71 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -65,6 +65,10 @@ impl PageComponent for Button { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Button { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 10e795cb..bb7e0618 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -84,6 +84,10 @@ impl PageComponent for Date { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Date { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 73581ca2..1ff77394 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -54,6 +54,10 @@ impl PageComponent for Form { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Form { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 736aa4ce..24d70cb2 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -28,6 +28,10 @@ impl PageComponent for Hidden { input type="hidden" id=[id] name=[self.name()] value=[self.value()]; } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Hidden { diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 71d801b7..35a38e73 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -112,6 +112,10 @@ impl PageComponent for Input { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Input { diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 77512ea2..56dc2345 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -40,6 +40,10 @@ impl PageComponent for Column { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Column { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 4574b090..31739359 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -40,6 +40,10 @@ impl PageComponent for Row { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Row { diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 62690679..abafcdbf 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -37,6 +37,10 @@ impl PageComponent for Image { class=[self.classes()]; } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Image { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 68c5c97e..b9461ed2 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -67,6 +67,10 @@ impl PageComponent for MenuItem { MenuItemType::Void => html! {}, } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl MenuItem { @@ -217,6 +221,10 @@ impl PageComponent for Menu { } } } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } } impl Menu { diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index c7aa3cb2..340b8c35 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -39,11 +39,11 @@ impl ThemeTrait for BulmixTheme { ) { match component.name() { "GridRow" => { - let row = component.downcast_mut::<grid::Row>().unwrap(); + let row = component.as_mut_any().downcast_mut::<grid::Row>().unwrap(); row.alter_classes("columns", ClassesOp::SetDefault); }, "GridColumn" => { - let col = component.downcast_mut::<grid::Column>().unwrap(); + let col = component.as_mut_any().downcast_mut::<grid::Column>().unwrap(); col.alter_classes("column", ClassesOp::SetDefault); }, _ => {}, diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 05528fc8..9e731e47 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -1,11 +1,11 @@ use crate::html::{Markup, html}; use crate::response::page::PageAssets; -use downcast_rs::{Downcast, impl_downcast}; - use std::any::type_name; -pub trait PageComponent: Downcast + Send + Sync { +pub use std::any::Any as AnyComponent; + +pub trait PageComponent: AnyComponent + Send + Sync { fn new() -> Self where Self: Sized; @@ -41,6 +41,6 @@ pub trait PageComponent: Downcast + Send + Sync { fn default_render(&self, assets: &mut PageAssets) -> Markup { html! {} } -} -impl_downcast!(PageComponent); + fn as_mut_any(&mut self) -> &mut dyn AnyComponent; +} diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 527f74f9..e238954b 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -7,7 +7,7 @@ pub use assets::{ }; mod component; -pub use component::PageComponent; +pub use component::{AnyComponent, PageComponent}; mod container; pub use container::PageContainer; From 0220020f4f9b3ab9c2ee04bce4da6210b14058f6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Apr 2022 21:55:37 +0200 Subject: [PATCH 059/853] =?UTF-8?q?A=C3=B1ade=20funci=C3=B3n=20as=5Fany()?= =?UTF-8?q?=20en=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 4 ++++ pagetop/src/base/component/chunck.rs | 4 ++++ pagetop/src/base/component/container.rs | 4 ++++ pagetop/src/base/component/form/button.rs | 4 ++++ pagetop/src/base/component/form/date.rs | 4 ++++ pagetop/src/base/component/form/form.rs | 4 ++++ pagetop/src/base/component/form/hidden.rs | 4 ++++ pagetop/src/base/component/form/input.rs | 4 ++++ pagetop/src/base/component/grid/column.rs | 4 ++++ pagetop/src/base/component/grid/row.rs | 4 ++++ pagetop/src/base/component/image.rs | 4 ++++ pagetop/src/base/component/menu.rs | 8 ++++++++ pagetop/src/response/page/component.rs | 2 ++ pagetop/src/theme/definition.rs | 4 ++-- 14 files changed, 56 insertions(+), 2 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 697c9344..e75981cd 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -46,6 +46,10 @@ impl PageComponent for Block { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 2957671e..9476e9d8 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -29,6 +29,10 @@ impl PageComponent for Chunck { html! { (*self.html()) } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index e4e9589c..553d1bae 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -73,6 +73,10 @@ impl PageComponent for Container { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index e098ea71..f6926233 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -66,6 +66,10 @@ impl PageComponent for Button { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index bb7e0618..0aa77a93 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -85,6 +85,10 @@ impl PageComponent for Date { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 1ff77394..5d41d4bc 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -55,6 +55,10 @@ impl PageComponent for Form { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 24d70cb2..a9ccbd47 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -29,6 +29,10 @@ impl PageComponent for Hidden { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 35a38e73..0bb5502d 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -113,6 +113,10 @@ impl PageComponent for Input { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 56dc2345..0e017f14 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -41,6 +41,10 @@ impl PageComponent for Column { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 31739359..9e48d34e 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -41,6 +41,10 @@ impl PageComponent for Row { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index abafcdbf..d2fc2caf 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -38,6 +38,10 @@ impl PageComponent for Image { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index b9461ed2..2ca9be57 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -68,6 +68,10 @@ impl PageComponent for MenuItem { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } @@ -222,6 +226,10 @@ impl PageComponent for Menu { } } + fn as_any(&mut self) -> &dyn AnyComponent { + self + } + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { self } diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 9e731e47..fb57f2ef 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -42,5 +42,7 @@ pub trait PageComponent: AnyComponent + Send + Sync { html! {} } + fn as_any(&mut self) -> &dyn AnyComponent; + fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 983bf0a6..29b20d4c 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -85,7 +85,7 @@ pub trait ThemeTrait: Send + Sync { match component.name() { "Block" => { - let block = component.downcast_mut::<Block>().unwrap(); + let block = component.as_mut_any().downcast_mut::<Block>().unwrap(); block.alter_title("New title"); }, _ => {}, @@ -105,7 +105,7 @@ pub trait ThemeTrait: Send + Sync { match component.name() { "Block" => { - let block = component.downcast_ref::<Block>().unwrap(); + let block = component.as_any().downcast_ref::<Block>().unwrap(); match block.template() { "default" => Some(block_default(block)), _ => None, From d4c6a3b2f3a499ce484d106272599373a07a572a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Apr 2022 22:02:54 +0200 Subject: [PATCH 060/853] =?UTF-8?q?Corrige=20identificaci=C3=B3n=20de=20va?= =?UTF-8?q?riable=20mutable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/chunck.rs | 2 +- pagetop/src/base/component/container.rs | 2 +- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form.rs | 2 +- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 2 +- pagetop/src/base/component/grid/column.rs | 2 +- pagetop/src/base/component/grid/row.rs | 2 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu.rs | 4 ++-- pagetop/src/response/page/component.rs | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index e75981cd..727ff86e 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -46,7 +46,7 @@ impl PageComponent for Block { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 9476e9d8..e0613d3b 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -29,7 +29,7 @@ impl PageComponent for Chunck { html! { (*self.html()) } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 553d1bae..86e907a9 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -73,7 +73,7 @@ impl PageComponent for Container { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index f6926233..7f7ada99 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -66,7 +66,7 @@ impl PageComponent for Button { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 0aa77a93..a062630d 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -85,7 +85,7 @@ impl PageComponent for Date { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 5d41d4bc..0470436f 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -55,7 +55,7 @@ impl PageComponent for Form { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index a9ccbd47..6e3edecc 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -29,7 +29,7 @@ impl PageComponent for Hidden { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 0bb5502d..01158ac5 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -113,7 +113,7 @@ impl PageComponent for Input { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 0e017f14..59948416 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -41,7 +41,7 @@ impl PageComponent for Column { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 9e48d34e..15b87cef 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -41,7 +41,7 @@ impl PageComponent for Row { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index d2fc2caf..0b4b4168 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -38,7 +38,7 @@ impl PageComponent for Image { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 2ca9be57..e5fb46cf 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -68,7 +68,7 @@ impl PageComponent for MenuItem { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } @@ -226,7 +226,7 @@ impl PageComponent for Menu { } } - fn as_any(&mut self) -> &dyn AnyComponent { + fn as_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index fb57f2ef..e4d6b61c 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -42,7 +42,7 @@ pub trait PageComponent: AnyComponent + Send + Sync { html! {} } - fn as_any(&mut self) -> &dyn AnyComponent; + fn as_any(&self) -> &dyn AnyComponent; fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } From e7f9bf8778e9638e98d6b7486cba863bb124db50 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Apr 2022 18:44:37 +0200 Subject: [PATCH 061/853] =?UTF-8?q?A=C3=B1ade=20funciones=20de=20acceso=20?= =?UTF-8?q?b=C3=A1sico=20a=20base=20de=20datos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/src/lib.rs | 2 +- ...m20220316_000001_create_table_node_type.rs | 2 +- .../m20220316_000002_create_table_node.rs | 2 +- ...0220316_000003_create_table_node_access.rs | 2 +- ...20316_000004_create_table_node_revision.rs | 2 +- pagetop-user/src/lib.rs | 2 +- .../m20220312_000001_create_table_role.rs | 88 ++++++++++--------- ...312_000002_create_table_role_permission.rs | 2 +- .../m20220312_000003_create_table_user.rs | 2 +- ...m20220312_000004_create_table_user_role.rs | 2 +- pagetop/STARTER.bin.Cargo.toml | 2 - pagetop/STARTER.lib.Cargo.toml | 2 - pagetop/src/app/db.rs | 44 ++++++++-- pagetop/src/db.rs | 14 +-- pagetop/src/module/all.rs | 2 +- pagetop/src/module/definition.rs | 2 +- pagetop/src/prelude.rs | 2 +- 17 files changed, 99 insertions(+), 75 deletions(-) diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 0f5c4662..a05800ec 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -24,7 +24,7 @@ impl ModuleTrait for NodeModule { cfg.route("/node", app::web::get().to(node)); } - fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { + fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { vec![ boxed_migration!(m20220316_000001_create_table_node_type), boxed_migration!(m20220316_000002_create_table_node), diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 5180a785..6ce9abe1 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; /// Stores information about all defined {node} types. #[derive(Iden)] diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index fe65fc2c..927c92f9 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; /// The base table for nodes. #[derive(Iden)] diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index a179240f..2b55da75 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; // Identifies which realm/grant pairs a user must possess in order to view, update, or delete specific nodes. #[derive(Iden)] diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 4dc4e1b6..5162407c 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; // Stores information about each saved version of a {node}. #[derive(Iden)] diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index a55ea4e8..d5d96f37 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -23,7 +23,7 @@ impl ModuleTrait for UserModule { cfg.route("/user/login", app::web::get().to(login)); } - fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { + fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { vec![ boxed_migration!(m20220312_000001_create_table_role), boxed_migration!(m20220312_000002_create_table_role_permission), diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index af453f74..1028bb5a 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum Role { Table, @@ -12,49 +12,55 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - // Store user roles. - Table::create() - .table(Role::Table) - .if_not_exists() - // Primary Key: Unique role ID. - .col(ColumnDef::new(Role::Rid) - .unsigned() - .not_null() - .auto_increment() - .primary_key() - ) - // Unique role name. - .col(ColumnDef::new(Role::Name) - .string_len(64) - .not_null() - .unique_key() - ) - // The weight of this role in listings and the user interface. - .col(ColumnDef::new(Role::Weight) - .integer() - .not_null() - .default(0) - ) - // INDEXES. - .index(Index::create() - .name("name-weight") - .col(Role::Name) - .col(Role::Weight) - ) - .to_owned() - ) - .await + manager.create_table( + // Store user roles. + Table::create() + .table(Role::Table) + .if_not_exists() + // Primary Key: Unique role ID. + .col(ColumnDef::new(Role::Rid) + .unsigned() + .not_null() + .auto_increment() + .primary_key() + ) + // Unique role name. + .col(ColumnDef::new(Role::Name) + .string_len(64) + .not_null() + .unique_key() + ) + // The weight of this role in listings and the user interface. + .col(ColumnDef::new(Role::Weight) + .integer() + .not_null() + .default(0) + ) + // INDEXES. + .index(Index::create() + .name("name-weight") + .col(Role::Name) + .col(Role::Weight) + ) + .to_owned() + ) + .await?; + + app::db::exec::<InsertStatement>(Query::insert() + .into_table(Role::Table) + .columns(vec![Role::Name]) + .values_panic(vec!["anonymous".into()]) + .values_panic(vec!["authenticated".into()]) + ) + .await.map(|_| ()) } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(Role::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(Role::Table) + .to_owned() + ) + .await } } diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index 0148af5f..3c997872 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum RolePermission { Table, diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index bf151f50..2ef84287 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum User { Table, diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index f92d019b..373f7e53 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum UserRole { Table, diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index f9c6560f..f3169356 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -21,7 +21,5 @@ default-features = false actix-web = "3.3.3" # Si se usa la macro html!: maud = { version = "0.23.0" } -# Si se usa base de datos: -sea-orm = { version = "0.7.1" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 7a74f96e..c268b8cc 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -10,7 +10,5 @@ edition = "2021" pagetop = { path = "../pagetop" } # Si se usa la macro html!: maud = { version = "0.23.0" } -# Si se usa base de datos: -sea-orm = { version = "0.7.1" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 9d196970..aa3f0045 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,10 +1,11 @@ -use crate::{Lazy, db, run_now, trace}; +use crate::{Lazy, run_now, trace}; use crate::config::SETTINGS; +use crate::db::*; -use sea_orm::{ConnectOptions, Database}; +use sea_orm::{ConnectionTrait, ConnectOptions, Database, DatabaseBackend, Statement}; use tracing_unwrap::ResultExt; -pub static DBCONN: Lazy<db::DbConn> = Lazy::new(|| { +pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", &SETTINGS.database.db_name, @@ -13,7 +14,7 @@ pub static DBCONN: Lazy<db::DbConn> = Lazy::new(|| { let db_uri = match SETTINGS.database.db_type.as_str() { "mysql" | "postgres" => { - let mut tmp_uri = db::DbUri::parse(format!( + let mut tmp_uri = DbUri::parse(format!( "{}://{}/{}", &SETTINGS.database.db_type, &SETTINGS.database.db_host, @@ -33,7 +34,7 @@ pub static DBCONN: Lazy<db::DbConn> = Lazy::new(|| { } tmp_uri }, - "sqlite" => db::DbUri::parse( + "sqlite" => DbUri::parse( format!("{}://{}", &SETTINGS.database.db_type, &SETTINGS.database.db_name @@ -43,7 +44,7 @@ pub static DBCONN: Lazy<db::DbConn> = Lazy::new(|| { "Unrecognized database type \"{}\"", &SETTINGS.database.db_type ); - db::DbUri::parse("").unwrap() + DbUri::parse("").unwrap() } }; @@ -55,3 +56,34 @@ pub static DBCONN: Lazy<db::DbConn> = Lazy::new(|| { }) ).expect_or_log("Failed to connect to database") }); + +static DBBACKEND: Lazy<DatabaseBackend> = Lazy::new(|| { + DBCONN.get_database_backend() +}); + + +pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { + DBCONN.query_all(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + } + )).await +} + +pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { + DBCONN.query_one(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + } + )).await +} + +pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { + DBCONN.execute(Statement::from_string(*DBBACKEND, stmt)).await +} diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 550f8f66..4b35bd59 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,18 +1,8 @@ pub use url::Url as DbUri; -pub use sea_orm::{ - DbErr, - DatabaseConnection as DbConn, -}; +pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; -pub mod entity { - pub use sea_orm::entity::prelude::*; -} - -pub mod migration { - pub use sea_schema::migration::prelude::*; - pub use crate::module_name; -} +pub use sea_schema::migration::prelude::*; #[macro_export] macro_rules! boxed_migration { diff --git a/pagetop/src/module/all.rs b/pagetop/src/module/all.rs index c95583e9..6380917a 100644 --- a/pagetop/src/module/all.rs +++ b/pagetop/src/module/all.rs @@ -1,5 +1,5 @@ use crate::{Lazy, app, run_now, trace}; -use crate::db::migration::*; +use crate::db::*; use super::ModuleTrait; use std::sync::RwLock; diff --git a/pagetop/src/module/definition.rs b/pagetop/src/module/definition.rs index b01f9801..a3affa2f 100644 --- a/pagetop/src/module/definition.rs +++ b/pagetop/src/module/definition.rs @@ -23,7 +23,7 @@ pub trait ModuleTrait: Send + Sync { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[allow(unused_variables)] - fn migrations(&self) -> Vec<Box<dyn db::migration::MigrationTrait>> { + fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { vec![] } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 55c9681e..4cbd9a7d 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -13,7 +13,7 @@ pub use crate::trace; pub use crate::localize; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub use crate::{db, boxed_migration}; +pub use crate::{db, db::*, boxed_migration}; pub use crate::html::*; pub use crate::theme::*; From f30f84e993fe68efed5af49f2b887edee25278ad Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Apr 2022 21:57:07 +0200 Subject: [PATCH 062/853] =?UTF-8?q?Actualiza=20formato=20del=20c=C3=B3digo?= =?UTF-8?q?=20de=20las=20migraciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...m20220316_000001_create_table_node_type.rs | 146 +++++++------- .../m20220316_000002_create_table_node.rs | 189 +++++++++--------- ...0220316_000003_create_table_node_access.rs | 109 +++++----- ...20316_000004_create_table_node_revision.rs | 147 +++++++------- .../m20220312_000001_create_table_role.rs | 67 +++---- ...312_000002_create_table_role_permission.rs | 100 +++++---- .../m20220312_000003_create_table_user.rs | 138 ++++++------- ...m20220312_000004_create_table_user_role.rs | 102 +++++----- 8 files changed, 486 insertions(+), 512 deletions(-) diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 6ce9abe1..831a3396 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -1,90 +1,90 @@ use pagetop::prelude::*; -/// Stores information about all defined {node} types. #[derive(Iden)] enum NodeType { - Table, // Nombre de la tabla: node_type (Tipo de nodo). - Type, // The machine-readable name of this type - Name, // The human-readable name of this type - Description, // Descripción breve del tipo. - Help, // Help information shown to the user when creating a {node} of this type - HasTitle, // Boolean indicating whether this type uses the {node}.title field - TitleLabel, // The label displayed for the title field on the edit form - Custom, // A boolean indicating whether this type is defined by a module (FALSE) or by a user via Add content type (TRUE) - Locked, // A boolean indicating whether the administrator can change the machine name of this type - Disabled, // A boolean indicating whether the node type is disabled - OrigType, // The original machine-readable name of this node type. This may be different from the current type name if the locked field is 0 + Table, // Stores information about all defined Node types. + + Type, // The machine-readable name of this type. + Name, // The human-readable name of this type. + Description, // Descripción breve del tipo. + Help, // Help information shown to the user when creating a Node of this type. + HasTitle, // Boolean indicating whether this type uses the Node.Title field. + TitleLabel, // The label displayed for the title field on the edit form. + Custom, // A boolean indicating whether this type is defined by a module (FALSE) or + // by a user via Add content type (TRUE). + Locked, // A boolean indicating whether the administrator can change the machine + // name of this type. + Disabled, // A boolean indicating whether the node type is disabled. + OrigType, // The original machine-readable name of this node type, this may be + // different from the current type name if the locked field is 0. } pub struct Migration; -impl MigrationName for Migration { - fn name(&self) -> &str { - "m20220316_000001_create_table_node_type" - } -} - #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(NodeType::Table) - .if_not_exists() - .col(ColumnDef::new(NodeType::Type) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(NodeType::Name) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Description) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Help) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::HasTitle) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::TitleLabel) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Custom) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Locked) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Disabled) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::OrigType) - .string() - .not_null() - ) - .to_owned() + manager.create_table(Table::create() + .table(NodeType::Table) + .if_not_exists() + .col(ColumnDef::new(NodeType::Type) + .integer() + .not_null() + .auto_increment() + .primary_key(), ) - .await + .col(ColumnDef::new(NodeType::Name) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Description) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Help) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::HasTitle) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::TitleLabel) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Custom) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Locked) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::Disabled) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeType::OrigType) + .string() + .not_null() + ) + .to_owned() + ) + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(NodeType::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(NodeType::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() } } diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index 927c92f9..0b70860d 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -1,110 +1,113 @@ use pagetop::prelude::*; -/// The base table for nodes. #[derive(Iden)] enum Node { - Table, // Nombre de la tabla: node (Nodo). - Nid, // The primary identifier for a node - Vid, // The current {node_revision}.vid version identifier - Type, // The {node_type}.type of this node - Language, // The {languages}.language of this node - Title, // The title of this node, always treated as non-markup plain text - Uid, // The {users}.uid that owns this node; initially, this is the user that created it - Status, // Boolean indicating whether the node is published (visible to non-administrators) - Created, // The Unix timestamp when the node was created - Changed, // The Unix timestamp when the node was most recently saved - Comment, // Whether comments are allowed on this node: 0 = no, 1 = closed (read only), 2 = open (read/write) - Promote, // Boolean indicating whether the node should be displayed on the front page - Sticky, // Boolean indicating whether the node should be displayed at the top of lists in which it appears - Tnid, // The translation set id for this node, which equals the node id of the source post in each set - Translate, // A boolean indicating whether this translation page needs to be updated + Table, // The base table for nodes. + + Nid, // The primary identifier for a node. + Vid, // The current {node_revision}.vid version identifier. + Type, // The {node_type}.type of this node. + Language, // The {languages}.language of this node. + Title, // The title of this node, always treated as non-markup plain text. + Uid, // The {users}.uid that owns this node; initially, this is the user that + // created it. + Status, // Boolean indicating whether the node is published (visible to + // non-administrators). + Created, // The Unix timestamp when the node was created. + Changed, // The Unix timestamp when the node was most recently saved. + Comment, // Whether comments are allowed on this node: 0 = no, 1 = closed (read + // only), 2 = open (read/write). + Promote, // Boolean indicating whether the node should be displayed on the front + // page. + Sticky, // Boolean indicating whether the node should be displayed at the top of + // lists in which it appears. + Tnid, // The translation set id for this node, which equals the node id of the + // source post in each set. + Translate, // A boolean indicating whether this translation page needs to be updated. } pub struct Migration; -impl MigrationName for Migration { - fn name(&self) -> &str { - "m20220316_000002_create_table_node" - } -} - #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(Node::Table) - .if_not_exists() - .col(ColumnDef::new(Node::Nid) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(Node::Vid) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Type) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Language) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Title) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Uid) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Status) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Created) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Changed) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Comment) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Promote) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Sticky) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Tnid) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Translate) - .string() - .not_null() - ) - .to_owned() + manager.create_table(Table::create() + .table(Node::Table) + .if_not_exists() + .col(ColumnDef::new(Node::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), ) - .await + .col(ColumnDef::new(Node::Vid) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Type) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Language) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Title) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Uid) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Status) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Created) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Changed) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Comment) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Promote) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Sticky) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Tnid) + .string() + .not_null() + ) + .col(ColumnDef::new(Node::Translate) + .string() + .not_null() + ) + .to_owned() + ) + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(Node::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(Node::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() } } diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index 2b55da75..8252b5d0 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -1,70 +1,73 @@ use pagetop::prelude::*; -// Identifies which realm/grant pairs a user must possess in order to view, update, or delete specific nodes. #[derive(Iden)] enum NodeAccess { - Table, // Nombre de la tabla: node_access (Acceso a nodos). - Nid, // The {node}.nid this record affects - Gid, // The grant ID a user must possess in the specified realm to gain this row's privileges on the node - Realm, // The realm in which the user must possess the grant ID. Each node access node can define one or more realms - GrantView, // Boolean indicating whether a user with the realm/grant pair can view this node - GrantUpdate, // Boolean indicating whether a user with the realm/grant pair can edit this node - GrantDelete, // Boolean indicating whether a user with the realm/grant pair can delete this node + Table, // Identifies which realm/grant pairs a user must possess in order to view, + // update, or delete specific nodes. + + Nid, // The {node}.nid this record affects. + Gid, // The grant ID a user must possess in the specified realm to gain this + // row's privileges on the node. + Realm, // The realm in which the user must possess the grant ID. Each node access + // node can define one or more realms. + GrantView, // Boolean indicating whether a user with the realm/grant pair can view this + // node. + GrantUpdate, // Boolean indicating whether a user with the realm/grant pair can edit this + // node. + GrantDelete, // Boolean indicating whether a user with the realm/grant pair can delete + // this node. } pub struct Migration; -impl MigrationName for Migration { - fn name(&self) -> &str { - "m20220316_000003_create_table_node_access" - } -} - #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(NodeAccess::Table) - .if_not_exists() - .col(ColumnDef::new(NodeAccess::Nid) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(NodeAccess::Gid) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::Realm) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::GrantView) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::GrantUpdate) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::GrantDelete) - .string() - .not_null() - ) - .to_owned() + manager.create_table(Table::create() + .table(NodeAccess::Table) + .if_not_exists() + .col(ColumnDef::new(NodeAccess::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), ) - .await + .col(ColumnDef::new(NodeAccess::Gid) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::Realm) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::GrantView) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::GrantUpdate) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeAccess::GrantDelete) + .string() + .not_null() + ) + .to_owned() + ) + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(NodeAccess::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(NodeAccess::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() } } diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 5162407c..9c414a60 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -1,90 +1,91 @@ use pagetop::prelude::*; -// Stores information about each saved version of a {node}. #[derive(Iden)] enum NodeRevision { - Table, // Nombre de la tabla: node_revisión (Versiones de nodos). - Nid, // The {node} this version belongs to - Vid, // The primary identifier for this version - Uid, // The {users}.uid that created this version - Title, // The title of this version - Log, // The log entry explaining the changes in this version - Timestamp, // A Unix timestamp indicating when this version was created - Status, // Boolean indicating whether the node (at the time of this revision) is published (visible to non-administrators) - Comment, // Whether comments are allowed on this node (at the time of this revision): 0 = no, 1 = closed (read only), 2 = open (read/write) - Promote, // Boolean indicating whether the node (at the time of this revision) should be displayed on the front page - Sticky, // Boolean indicating whether the node (at the time of this revision) should be displayed at the top of lists in which it appears + Table, // Stores information about each saved version of a {node}. + + Nid, // The {node} this version belongs to. + Vid, // The primary identifier for this version. + Uid, // The {users}.uid that created this version. + Title, // The title of this version. + Log, // The log entry explaining the changes in this version. + Timestamp, // A Unix timestamp indicating when this version was created. + Status, // Boolean indicating whether the node (at the time of this revision) is + // published (visible to non-administrators). + Comment, // Whether comments are allowed on this node (at the time of this revision): + // 0 = no, 1 = closed (read only), 2 = open (read/write). + Promote, // Boolean indicating whether the node (at the time of this revision) should + // be displayed on the front page. + Sticky, // Boolean indicating whether the node (at the time of this revision) should + // be displayed at the top of lists in which it appears. } pub struct Migration; -impl MigrationName for Migration { - fn name(&self) -> &str { - "m20220316_000004_create_table_node_revision" - } -} - #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(NodeRevision::Table) - .if_not_exists() - .col(ColumnDef::new(NodeRevision::Nid) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(NodeRevision::Vid) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Uid) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Title) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Log) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Timestamp) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Status) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Comment) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Promote) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Sticky) - .string() - .not_null() - ) - .to_owned() + manager.create_table(Table::create() + .table(NodeRevision::Table) + .if_not_exists() + .col(ColumnDef::new(NodeRevision::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), ) - .await + .col(ColumnDef::new(NodeRevision::Vid) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Uid) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Title) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Log) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Timestamp) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Status) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Comment) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Promote) + .string() + .not_null() + ) + .col(ColumnDef::new(NodeRevision::Sticky) + .string() + .not_null() + ) + .to_owned() + ) + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(NodeRevision::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(NodeRevision::Table) + .to_owned() + ) + .await + } +} + +impl MigrationName for Migration { + fn name(&self) -> &str { + module_name!() } } diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index 1028bb5a..61d21372 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -1,10 +1,12 @@ use pagetop::prelude::*; #[derive(Iden)] -enum Role { Table, - Rid, - Name, - Weight, +enum Role { + Table, // Store user roles. + + Rid, // Primary Key: Unique role ID. + Name, // Unique role name. + Weight, // The weight of this role in listings and the user interface. } pub struct Migration; @@ -12,37 +14,32 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table( - // Store user roles. - Table::create() - .table(Role::Table) - .if_not_exists() - // Primary Key: Unique role ID. - .col(ColumnDef::new(Role::Rid) - .unsigned() - .not_null() - .auto_increment() - .primary_key() - ) - // Unique role name. - .col(ColumnDef::new(Role::Name) - .string_len(64) - .not_null() - .unique_key() - ) - // The weight of this role in listings and the user interface. - .col(ColumnDef::new(Role::Weight) - .integer() - .not_null() - .default(0) - ) - // INDEXES. - .index(Index::create() - .name("name-weight") - .col(Role::Name) - .col(Role::Weight) - ) - .to_owned() + manager.create_table(Table::create() + .table(Role::Table) + .if_not_exists() + .col(ColumnDef::new(Role::Rid) + .unsigned() + .not_null() + .auto_increment() + .primary_key() + ) + .col(ColumnDef::new(Role::Name) + .string_len(64) + .not_null() + .unique_key() + ) + .col(ColumnDef::new(Role::Weight) + .integer() + .not_null() + .default(0) + ) + // INDEXES. + .index(Index::create() + .name("name-weight") + .col(Role::Name) + .col(Role::Weight) + ) + .to_owned() ) .await?; diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index 3c997872..d5e5f8f1 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -1,72 +1,64 @@ use pagetop::prelude::*; #[derive(Iden)] -enum RolePermission { Table, - Rid, - Permission, - Module, +enum RolePermission { + Table, // Stores the permissions assigned to user roles. + + Rid, // Foreign Key: Role::Rid. + Permission, // A single permission granted to the role identified by Rid. + Module, // The module declaring the permission. } + #[derive(Iden)] -enum Role { Table, - Rid, -// ... -} +enum Role { Table, Rid, /* ... */ } pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - // Stores the permissions assigned to user roles. - Table::create() - .table(RolePermission::Table) - .if_not_exists() - // Foreign Key: Role::Rid. - .col(ColumnDef::new(RolePermission::Rid) - .unsigned() - .not_null() - ) - // A single permission granted to the role identified by Rid. - .col(ColumnDef::new(RolePermission::Permission) - .string_len(128) - .not_null() - ) - // The module declaring the permission. - .col(ColumnDef::new(RolePermission::Module) - .string_len(255) - .not_null() - ) - // INDEXES. - .primary_key(Index::create() - .col(RolePermission::Rid) - .col(RolePermission::Permission) - ) - .index(Index::create() - .name("permission") - .col(RolePermission::Permission) - ) - .foreign_key( - ForeignKey::create() - .name("fk_role_permission-rid") - .from(RolePermission::Table, RolePermission::Rid) - .to(Role::Table, Role::Rid) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) - ) - .to_owned() + manager.create_table(Table::create() + .table(RolePermission::Table) + .if_not_exists() + .col(ColumnDef::new(RolePermission::Rid) + .unsigned() + .not_null() ) - .await + .col(ColumnDef::new(RolePermission::Permission) + .string_len(128) + .not_null() + ) + .col(ColumnDef::new(RolePermission::Module) + .string_len(255) + .not_null() + ) + // INDEXES. + .primary_key(Index::create() + .col(RolePermission::Rid) + .col(RolePermission::Permission) + ) + .index(Index::create() + .name("permission") + .col(RolePermission::Permission) + ) + .foreign_key(ForeignKey::create() + .name("fk_role_permission-rid") + .from(RolePermission::Table, RolePermission::Rid) + .to(Role::Table, Role::Rid) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .to_owned() + ) + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(RolePermission::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(RolePermission::Table) + .to_owned() + ) + .await } } diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index 2ef84287..4849eae5 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -1,17 +1,19 @@ use pagetop::prelude::*; #[derive(Iden)] -enum User { Table, - Uid, - Name, - Pass, - Mail, - Created, - Changed, - Access, - Login, - Status, - Timezone, +enum User { + Table, // Stores user data. + + Uid, // Primary Key: Unique user ID. + Name, // Unique user name. + Pass, // User's password (hashed). + Mail, // User's e-mail address. + Created, // Timestamp for when user was created. + Changed, // Timestamp for when user was changed. + Access, // Timestamp for previous time user accessed the site. + Login, // Timestamp for user's last login. + Status, // Whether the user is active(1) or blocked(0). + Timezone, // User's time zone. } pub struct Migration; @@ -19,74 +21,60 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - // Stores user data. - Table::create() - .table(User::Table) - .if_not_exists() - // Primary Key: Unique user ID. - .col(ColumnDef::new(User::Uid) - .unsigned() - .not_null() - .primary_key() - ) - // Unique user name. - .col(ColumnDef::new(User::Name) - .string_len(60) - .not_null() - .unique_key() - ) - // User's password (hashed). - .col(ColumnDef::new(User::Pass) - .string_len(128) - .not_null() - ) - // User's e-mail address. - .col(ColumnDef::new(User::Mail) - .string_len(255) - ) - // Timestamp for when user was created. - .col(ColumnDef::new(User::Created) - .timestamp() - .not_null() - ) - // Timestamp for when user was changed. - .col(ColumnDef::new(User::Changed) - .timestamp() - .not_null() - ) - // Timestamp for previous time user accessed the site. - .col(ColumnDef::new(User::Access) - .timestamp() - .not_null() - ) - // Timestamp for user's last login. - .col(ColumnDef::new(User::Login) - .timestamp() - .not_null() - ) - // Whether the user is active(1) or blocked(0). - .col(ColumnDef::new(User::Status) - .boolean() - .not_null() - ) - // User's time zone. - .col(ColumnDef::new(User::Timezone) - .string_len(32) - ) - .to_owned() + manager.create_table(Table::create() + .table(User::Table) + .if_not_exists() + .col(ColumnDef::new(User::Uid) + .unsigned() + .not_null() + .primary_key() ) - .await + .col(ColumnDef::new(User::Name) + .string_len(60) + .not_null() + .unique_key() + ) + .col(ColumnDef::new(User::Pass) + .string_len(128) + .not_null() + ) + .col(ColumnDef::new(User::Mail) + .string_len(255) + ) + .col(ColumnDef::new(User::Created) + .timestamp() + .not_null() + ) + .col(ColumnDef::new(User::Changed) + .timestamp() + .not_null() + ) + .col(ColumnDef::new(User::Access) + .timestamp() + .not_null() + ) + .col(ColumnDef::new(User::Login) + .timestamp() + .not_null() + ) + .col(ColumnDef::new(User::Status) + .boolean() + .not_null() + ) + .col(ColumnDef::new(User::Timezone) + .string_len(32) + ) + .to_owned() + ) + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(User::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(User::Table) + .to_owned() + ) + .await } } diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index 373f7e53..1b15810c 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -1,75 +1,65 @@ use pagetop::prelude::*; #[derive(Iden)] -enum UserRole { Table, - Uid, - Rid, +enum UserRole { + Table, // Maps users to roles. + + Uid, // Foreign Key: User::Uid for user. + Rid, // Foreign Key: Role::Rid for role. } + #[derive(Iden)] -enum User { Table, - Uid, -// ... -} +enum User { Table, Uid, /* ... */ } + #[derive(Iden)] -enum Role { Table, - Rid, -// ... -} +enum Role { Table, Rid, /* ... */ } pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - // Maps users to roles. - Table::create() - .table(UserRole::Table) - .if_not_exists() - // Foreign Key: User::Uid for user. - .col(ColumnDef::new(UserRole::Uid) - .unsigned() - .not_null() - ) - // Foreign Key: Role::Rid for role. - .col(ColumnDef::new(UserRole::Rid) - .unsigned() - .not_null() - ) - // INDEXES. - .primary_key(Index::create() - .col(UserRole::Uid) - .col(UserRole::Rid) - ) - .foreign_key( - ForeignKey::create() - .name("fk_user_role-uid") - .from(UserRole::Table, UserRole::Uid) - .to(User::Table, User::Uid) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) - ) - .foreign_key( - ForeignKey::create() - .name("fk_user_role-rid") - .from(UserRole::Table, UserRole::Rid) - .to(Role::Table, Role::Rid) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) - ) - .to_owned() + manager.create_table(Table::create() + .table(UserRole::Table) + .if_not_exists() + .col(ColumnDef::new(UserRole::Uid) + .unsigned() + .not_null() ) - .await + .col(ColumnDef::new(UserRole::Rid) + .unsigned() + .not_null() + ) + // INDEXES. + .primary_key(Index::create() + .col(UserRole::Uid) + .col(UserRole::Rid) + ) + .foreign_key(ForeignKey::create() + .name("fk_user_role-uid") + .from(UserRole::Table, UserRole::Uid) + .to(User::Table, User::Uid) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .foreign_key(ForeignKey::create() + .name("fk_user_role-rid") + .from(UserRole::Table, UserRole::Rid) + .to(Role::Table, Role::Rid) + .on_delete(ForeignKeyAction::Cascade) + .on_update(ForeignKeyAction::Cascade) + ) + .to_owned() + ) + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(UserRole::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(UserRole::Table) + .to_owned() + ) + .await } } From 42a4731bdda2be44742455eceb7ed971f9625ccd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Apr 2022 20:57:36 +0200 Subject: [PATCH 063/853] Retoca las migraciones principales --- .../m20220316_000001_create_table_node_type.rs | 2 +- .../m20220316_000002_create_table_node.rs | 8 ++++---- .../m20220316_000003_create_table_node_access.rs | 6 +++--- ...20220316_000004_create_table_node_revision.rs | 6 +++--- .../m20220312_000001_create_table_role.rs | 16 +++++++++------- ...220312_000002_create_table_role_permission.rs | 11 +++-------- .../m20220312_000003_create_table_user.rs | 2 +- .../m20220312_000004_create_table_user_role.rs | 10 +++++----- 8 files changed, 29 insertions(+), 32 deletions(-) diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 831a3396..50117825 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; #[derive(Iden)] enum NodeType { - Table, // Stores information about all defined Node types. + Table, // node_type: Stores information about all defined Node types. Type, // The machine-readable name of this type. Name, // The human-readable name of this type. diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index 0b70860d..62e2bda1 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -2,14 +2,14 @@ use pagetop::prelude::*; #[derive(Iden)] enum Node { - Table, // The base table for nodes. + Table, // node: The base table for nodes. Nid, // The primary identifier for a node. - Vid, // The current {node_revision}.vid version identifier. - Type, // The {node_type}.type of this node. + Vid, // The current NodeRevision.vid version identifier. + Type, // The NodeType.type of this node. Language, // The {languages}.language of this node. Title, // The title of this node, always treated as non-markup plain text. - Uid, // The {users}.uid that owns this node; initially, this is the user that + Uid, // The User.uid that owns this node; initially, this is the user that // created it. Status, // Boolean indicating whether the node is published (visible to // non-administrators). diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index 8252b5d0..140dac2d 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -2,10 +2,10 @@ use pagetop::prelude::*; #[derive(Iden)] enum NodeAccess { - Table, // Identifies which realm/grant pairs a user must possess in order to view, - // update, or delete specific nodes. + Table, // node_access: Identifies which realm/grant pairs a user must possess in + // order to view, update, or delete specific nodes. - Nid, // The {node}.nid this record affects. + Nid, // The Node.nid this record affects. Gid, // The grant ID a user must possess in the specified realm to gain this // row's privileges on the node. Realm, // The realm in which the user must possess the grant ID. Each node access diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 9c414a60..0009359f 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -2,11 +2,11 @@ use pagetop::prelude::*; #[derive(Iden)] enum NodeRevision { - Table, // Stores information about each saved version of a {node}. + Table, // node_revision: Stores information about each saved version of a Node. - Nid, // The {node} this version belongs to. + Nid, // The Node this version belongs to. Vid, // The primary identifier for this version. - Uid, // The {users}.uid that created this version. + Uid, // The User.uid that created this version. Title, // The title of this version. Log, // The log entry explaining the changes in this version. Timestamp, // A Unix timestamp indicating when this version was created. diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index 61d21372..2557453f 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; #[derive(Iden)] enum Role { - Table, // Store user roles. + Table, // role: Store user roles. Rid, // Primary Key: Unique role ID. Name, // Unique role name. @@ -31,23 +31,25 @@ impl MigrationTrait for Migration { .col(ColumnDef::new(Role::Weight) .integer() .not_null() - .default(0) + .default(10) ) // INDEXES. .index(Index::create() - .name("name-weight") - .col(Role::Name) + .name("weight-name") .col(Role::Weight) + .col(Role::Name) ) .to_owned() ) .await?; + // Built-in roles. app::db::exec::<InsertStatement>(Query::insert() .into_table(Role::Table) - .columns(vec![Role::Name]) - .values_panic(vec!["anonymous".into()]) - .values_panic(vec!["authenticated".into()]) + .columns(vec![Role::Name, Role::Weight]) + .values_panic(vec!["anonymous".into(), "1".into()]) + .values_panic(vec!["authenticated".into(), "2".into()]) + .values_panic(vec!["administrator".into(), "3".into()]) ) .await.map(|_| ()) } diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index d5e5f8f1..052fed2c 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -2,11 +2,10 @@ use pagetop::prelude::*; #[derive(Iden)] enum RolePermission { - Table, // Stores the permissions assigned to user roles. + Table, // role_permission: Stores the permissions assigned to user roles. Rid, // Foreign Key: Role::Rid. Permission, // A single permission granted to the role identified by Rid. - Module, // The module declaring the permission. } #[derive(Iden)] @@ -28,10 +27,6 @@ impl MigrationTrait for Migration { .string_len(128) .not_null() ) - .col(ColumnDef::new(RolePermission::Module) - .string_len(255) - .not_null() - ) // INDEXES. .primary_key(Index::create() .col(RolePermission::Rid) @@ -45,8 +40,8 @@ impl MigrationTrait for Migration { .name("fk_role_permission-rid") .from(RolePermission::Table, RolePermission::Rid) .to(Role::Table, Role::Rid) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) + .on_delete(ForeignKeyAction::Restrict) + .on_update(ForeignKeyAction::Restrict) ) .to_owned() ) diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index 4849eae5..c060c8a5 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; #[derive(Iden)] enum User { - Table, // Stores user data. + Table, // user: Stores user data. Uid, // Primary Key: Unique user ID. Name, // Unique user name. diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index 1b15810c..fedcd4be 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; #[derive(Iden)] enum UserRole { - Table, // Maps users to roles. + Table, // user_role: Maps users to roles. Uid, // Foreign Key: User::Uid for user. Rid, // Foreign Key: Role::Rid for role. @@ -39,15 +39,15 @@ impl MigrationTrait for Migration { .name("fk_user_role-uid") .from(UserRole::Table, UserRole::Uid) .to(User::Table, User::Uid) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) + .on_delete(ForeignKeyAction::Restrict) + .on_update(ForeignKeyAction::Restrict) ) .foreign_key(ForeignKey::create() .name("fk_user_role-rid") .from(UserRole::Table, UserRole::Rid) .to(Role::Table, Role::Rid) - .on_delete(ForeignKeyAction::Cascade) - .on_update(ForeignKeyAction::Cascade) + .on_delete(ForeignKeyAction::Restrict) + .on_update(ForeignKeyAction::Restrict) ) .to_owned() ) From cd7020c77d5aafe78861db2f7fc1b66ca920c3de Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 29 Apr 2022 20:06:44 +0200 Subject: [PATCH 064/853] =?UTF-8?q?A=C3=B1ade=20func.=20component=5Fxxx<T>?= =?UTF-8?q?()=20para=20capturar=20comp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/chunck.rs | 2 +- pagetop/src/base/component/container.rs | 2 +- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form.rs | 2 +- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 2 +- pagetop/src/base/component/grid/column.rs | 2 +- pagetop/src/base/component/grid/row.rs | 2 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu.rs | 4 ++-- pagetop/src/base/theme/bulmix/mod.rs | 4 ++-- pagetop/src/response/page/component.rs | 10 +++++++++- pagetop/src/response/page/mod.rs | 7 ++++++- pagetop/src/theme/definition.rs | 4 ++-- 16 files changed, 32 insertions(+), 19 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 727ff86e..881a4ac5 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -46,7 +46,7 @@ impl PageComponent for Block { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index e0613d3b..3fa5db9e 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -29,7 +29,7 @@ impl PageComponent for Chunck { html! { (*self.html()) } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 86e907a9..8e53c8b2 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -73,7 +73,7 @@ impl PageComponent for Container { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 7f7ada99..ff7c7ef4 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -66,7 +66,7 @@ impl PageComponent for Button { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index a062630d..f24f2bc2 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -85,7 +85,7 @@ impl PageComponent for Date { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 0470436f..05d6296c 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -55,7 +55,7 @@ impl PageComponent for Form { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 6e3edecc..ae19cf0b 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -29,7 +29,7 @@ impl PageComponent for Hidden { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 01158ac5..08318bd3 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -113,7 +113,7 @@ impl PageComponent for Input { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 59948416..d48da98d 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -41,7 +41,7 @@ impl PageComponent for Column { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 15b87cef..761fdb49 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -41,7 +41,7 @@ impl PageComponent for Row { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 0b4b4168..c785f099 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -38,7 +38,7 @@ impl PageComponent for Image { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index e5fb46cf..805f4dbb 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -68,7 +68,7 @@ impl PageComponent for MenuItem { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } @@ -226,7 +226,7 @@ impl PageComponent for Menu { } } - fn as_any(&self) -> &dyn AnyComponent { + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 340b8c35..22a03efe 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -39,11 +39,11 @@ impl ThemeTrait for BulmixTheme { ) { match component.name() { "GridRow" => { - let row = component.as_mut_any().downcast_mut::<grid::Row>().unwrap(); + let row = component_mut::<grid::Row>(component); row.alter_classes("columns", ClassesOp::SetDefault); }, "GridColumn" => { - let col = component.as_mut_any().downcast_mut::<grid::Column>().unwrap(); + let col = component_mut::<grid::Column>(component); col.alter_classes("column", ClassesOp::SetDefault); }, _ => {}, diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index e4d6b61c..de726704 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -42,7 +42,15 @@ pub trait PageComponent: AnyComponent + Send + Sync { html! {} } - fn as_any(&self) -> &dyn AnyComponent; + fn as_ref_any(&self) -> &dyn AnyComponent; fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } + +pub fn component_ref<T: 'static>(component: &dyn PageComponent) -> &T { + component.as_ref_any().downcast_ref::<T>().unwrap() +} + +pub fn component_mut<T: 'static>(component: &mut dyn PageComponent) -> &mut T { + component.as_mut_any().downcast_mut::<T>().unwrap() +} diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index e238954b..5f0bf0e6 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -7,7 +7,12 @@ pub use assets::{ }; mod component; -pub use component::{AnyComponent, PageComponent}; +pub use component::{ + AnyComponent, + PageComponent, + component_ref, + component_mut, +}; mod container; pub use container::PageContainer; diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 29b20d4c..41113639 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -85,7 +85,7 @@ pub trait ThemeTrait: Send + Sync { match component.name() { "Block" => { - let block = component.as_mut_any().downcast_mut::<Block>().unwrap(); + let block = component_mut::<Block>(component); block.alter_title("New title"); }, _ => {}, @@ -105,7 +105,7 @@ pub trait ThemeTrait: Send + Sync { match component.name() { "Block" => { - let block = component.as_any().downcast_ref::<Block>().unwrap(); + let block = component_ref::<Block>(component); match block.template() { "default" => Some(block_default(block)), _ => None, From 37d0254055a5366466db14b0fd46f76f97810d82 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 30 Apr 2022 09:46:03 +0200 Subject: [PATCH 065/853] Modifica PageComponent por ComponentTrait --- pagetop/src/base/component/block.rs | 4 ++-- pagetop/src/base/component/chunck.rs | 2 +- pagetop/src/base/component/container.rs | 4 ++-- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form.rs | 4 ++-- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 2 +- pagetop/src/base/component/grid/column.rs | 4 ++-- pagetop/src/base/component/grid/row.rs | 2 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu.rs | 4 ++-- pagetop/src/base/theme/bulmix/mod.rs | 2 +- pagetop/src/response/page/component.rs | 6 +++--- pagetop/src/response/page/container.rs | 8 ++++---- pagetop/src/response/page/mod.rs | 2 +- pagetop/src/response/page/page.rs | 6 +++--- pagetop/src/theme/definition.rs | 6 +++--- 18 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 881a4ac5..7f125eb5 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -10,7 +10,7 @@ pub struct Block { template : String, } -impl PageComponent for Block { +impl ComponentTrait for Block { fn new() -> Self { Block { renderable: render_always, @@ -59,7 +59,7 @@ impl Block { // Block CONTAINER. - pub fn add(mut self, component: impl PageComponent) -> Self { + pub fn add(mut self, component: impl ComponentTrait) -> Self { self.components.add(component); self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 3fa5db9e..1abd7554 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -7,7 +7,7 @@ pub struct Chunck { template : String, } -impl PageComponent for Chunck { +impl ComponentTrait for Chunck { fn new() -> Self { Chunck { renderable: render_always, diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 8e53c8b2..72766ac8 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -13,7 +13,7 @@ pub struct Container { template : String, } -impl PageComponent for Container { +impl ComponentTrait for Container { fn new() -> Self { Container { renderable : render_always, @@ -109,7 +109,7 @@ impl Container { // Container CONTAINER. - pub fn add(mut self, component: impl PageComponent) -> Self { + pub fn add(mut self, component: impl ComponentTrait) -> Self { self.components.add(component); self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index ff7c7ef4..74f0ba2f 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -14,7 +14,7 @@ pub struct Button { template : String, } -impl PageComponent for Button { +impl ComponentTrait for Button { fn new() -> Self { Button { renderable : render_always, diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index f24f2bc2..f0c0cd33 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -17,7 +17,7 @@ pub struct Date { template : String, } -impl PageComponent for Date { +impl ComponentTrait for Date { fn new() -> Self { Date { renderable : render_always, diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 05d6296c..79fc72dd 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -14,7 +14,7 @@ pub struct Form { template : String, } -impl PageComponent for Form { +impl ComponentTrait for Form { fn new() -> Self { Form { renderable: render_always, @@ -68,7 +68,7 @@ impl Form { // Form CONTAINER. - pub fn add(mut self, element: impl PageComponent) -> Self { + pub fn add(mut self, element: impl ComponentTrait) -> Self { self.elements.add(element); self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index ae19cf0b..baa0316f 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -6,7 +6,7 @@ pub struct Hidden { value : OptAttr, } -impl PageComponent for Hidden { +impl ComponentTrait for Hidden { fn new() -> Self { Hidden { weight: 0, diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 08318bd3..f682ad3d 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -23,7 +23,7 @@ pub struct Input { template : String, } -impl PageComponent for Input { +impl ComponentTrait for Input { fn new() -> Self { Input { renderable : render_always, diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index d48da98d..f80d0ff3 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -9,7 +9,7 @@ pub struct Column { template : String, } -impl PageComponent for Column { +impl ComponentTrait for Column { fn new() -> Self { Column { renderable: render_always, @@ -54,7 +54,7 @@ impl Column { // Column CONTAINER. - pub fn add(mut self, component: impl PageComponent) -> Self { + pub fn add(mut self, component: impl ComponentTrait) -> Self { self.components.add(component); self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 761fdb49..273701ed 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -9,7 +9,7 @@ pub struct Row { template : String, } -impl PageComponent for Row { +impl ComponentTrait for Row { fn new() -> Self { Row { renderable: render_always, diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index c785f099..de1d6840 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -9,7 +9,7 @@ pub struct Image { template : String, } -impl PageComponent for Image { +impl ComponentTrait for Image { fn new() -> Self { Image { renderable: render_always, diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 805f4dbb..5fb9f1cc 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -20,7 +20,7 @@ pub struct MenuItem { item_type : MenuItemType, } -impl PageComponent for MenuItem { +impl ComponentTrait for MenuItem { fn new() -> Self { MenuItem { renderable: render_always, @@ -179,7 +179,7 @@ pub struct Menu { template : String, } -impl PageComponent for Menu { +impl ComponentTrait for Menu { fn new() -> Self { Menu { renderable: render_always, diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 22a03efe..7454c69d 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -34,7 +34,7 @@ impl ThemeTrait for BulmixTheme { fn before_render_component( &self, - component: &mut dyn PageComponent, + component: &mut dyn ComponentTrait, _assets: &mut PageAssets ) { match component.name() { diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index de726704..8839a5ca 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -5,7 +5,7 @@ use std::any::type_name; pub use std::any::Any as AnyComponent; -pub trait PageComponent: AnyComponent + Send + Sync { +pub trait ComponentTrait: AnyComponent + Send + Sync { fn new() -> Self where Self: Sized; @@ -47,10 +47,10 @@ pub trait PageComponent: AnyComponent + Send + Sync { fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } -pub fn component_ref<T: 'static>(component: &dyn PageComponent) -> &T { +pub fn component_ref<T: 'static>(component: &dyn ComponentTrait) -> &T { component.as_ref_any().downcast_ref::<T>().unwrap() } -pub fn component_mut<T: 'static>(component: &mut dyn PageComponent) -> &mut T { +pub fn component_mut<T: 'static>(component: &mut dyn ComponentTrait) -> &mut T { component.as_mut_any().downcast_mut::<T>().unwrap() } diff --git a/pagetop/src/response/page/container.rs b/pagetop/src/response/page/container.rs index 2e052ee9..6cf09607 100644 --- a/pagetop/src/response/page/container.rs +++ b/pagetop/src/response/page/container.rs @@ -1,23 +1,23 @@ use crate::html::{Markup, html}; -use crate::response::page::{PageAssets, PageComponent, render_component}; +use crate::response::page::{PageAssets, ComponentTrait, render_component}; use std::sync::{Arc, RwLock}; #[derive(Clone)] -pub struct PageContainer(Vec<Arc<RwLock<dyn PageComponent>>>); +pub struct PageContainer(Vec<Arc<RwLock<dyn ComponentTrait>>>); impl PageContainer { pub fn new() -> Self { PageContainer(Vec::new()) } - pub fn new_with(component: impl PageComponent) -> Self { + pub fn new_with(component: impl ComponentTrait) -> Self { let mut container = PageContainer::new(); container.add(component); container } - pub fn add(&mut self, component: impl PageComponent) { + pub fn add(&mut self, component: impl ComponentTrait) { self.0.push(Arc::new(RwLock::new(component))); } diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 5f0bf0e6..1d923f73 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -9,7 +9,7 @@ pub use assets::{ mod component; pub use component::{ AnyComponent, - PageComponent, + ComponentTrait, component_ref, component_mut, }; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index f7bee609..2a1f69f4 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -100,7 +100,7 @@ impl<'a> Page<'a> { pub fn add_to( &mut self, region: &'a str, - component: impl PageComponent + component: impl ComponentTrait ) -> &mut Self { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); @@ -187,7 +187,7 @@ impl<'a> Page<'a> { } } -pub fn render_component(component: &mut dyn PageComponent, assets: &mut PageAssets) -> Markup { +pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut PageAssets) -> Markup { component.before_render(assets); assets.theme().before_render_component(component, assets); match component.is_renderable() { @@ -201,7 +201,7 @@ pub fn render_component(component: &mut dyn PageComponent, assets: &mut PageAsse } } -pub fn add_component_to(region: &'static str, component: impl PageComponent) { +pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { let mut hmap = COMPONENTS.write().unwrap(); if let Some(regions) = hmap.get_mut(region) { regions.add(component); diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 41113639..4d54d758 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -1,7 +1,7 @@ use crate::{app, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, html}; -use crate::response::page::{Favicon, Page, PageAssets, PageComponent}; +use crate::response::page::{ComponentTrait, Favicon, Page, PageAssets}; use crate::base::component::Chunck; /// Los temas deben implementar este "trait". @@ -77,7 +77,7 @@ pub trait ThemeTrait: Send + Sync { #[allow(unused_variables)] fn before_render_component( &self, - component: &mut dyn PageComponent, + component: &mut dyn ComponentTrait, assets: &mut PageAssets ) { /* @@ -96,7 +96,7 @@ pub trait ThemeTrait: Send + Sync { #[allow(unused_variables)] fn render_component( &self, - component: &dyn PageComponent, + component: &dyn ComponentTrait, assets: &mut PageAssets ) -> Option<Markup> { None From 16996eeee0986725aeea1ed83d46db0cff16d458 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 2 May 2022 12:29:06 +0200 Subject: [PATCH 066/853] =?UTF-8?q?A=C3=B1ade=20y=20estandariza=20nombres?= =?UTF-8?q?=20de=20m=C3=B3d.,=20tem.=20y=20comp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/module/all.rs | 2 +- pagetop/src/module/definition.rs | 37 ++++++++++++++++---- pagetop/src/module/mod.rs | 5 ++- pagetop/src/response/page/component.rs | 47 ++++++++++++++++---------- pagetop/src/response/page/mod.rs | 1 + pagetop/src/theme/all.rs | 2 +- pagetop/src/theme/definition.rs | 31 ++++++++++++++--- pagetop/src/theme/mod.rs | 5 ++- pagetop/src/util.rs | 11 ++++++ 9 files changed, 109 insertions(+), 32 deletions(-) diff --git a/pagetop/src/module/all.rs b/pagetop/src/module/all.rs index 6380917a..2e499f23 100644 --- a/pagetop/src/module/all.rs +++ b/pagetop/src/module/all.rs @@ -19,7 +19,7 @@ pub fn register_module(module: &'static dyn ModuleTrait) { fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { if !MODULES.read().unwrap().iter().any(|m| m.name() == module.name()) { if !list.iter().any(|m| m.name() == module.name()) { - trace::debug!("Registering \"{}\" module", module.name()); + trace::debug!("Registering \"{}\" module", module.single_name()); list.push(module); let mut dependencies = module.dependencies(); diff --git a/pagetop/src/module/definition.rs b/pagetop/src/module/definition.rs index a3affa2f..baaadd98 100644 --- a/pagetop/src/module/definition.rs +++ b/pagetop/src/module/definition.rs @@ -1,22 +1,31 @@ use crate::app; +use crate::util::partial_type_name; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db; +pub trait BaseModule { + fn type_name(&self) -> &'static str; + + fn single_name(&self) -> &'static str; + + fn qualified_name(&self, last: usize) -> &'static str; +} + /// Los módulos deben implementar este *trait*. -pub trait ModuleTrait: Send + Sync { - fn name(&self) -> &'static str; - - fn fullname(&self) -> String; - - fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { - vec![] +pub trait ModuleTrait: BaseModule + Send + Sync { + fn name(&self) -> String { + self.single_name().to_owned() } fn description(&self) -> Option<String> { None } + fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { + vec![] + } + #[allow(unused_variables)] fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { } @@ -27,3 +36,17 @@ pub trait ModuleTrait: Send + Sync { vec![] } } + +impl<M: ?Sized + ModuleTrait> BaseModule for M { + fn type_name(&self) -> &'static str { + std::any::type_name::<Self>() + } + + fn single_name(&self) -> &'static str { + partial_type_name(std::any::type_name::<Self>(), 1) + } + + fn qualified_name(&self, last: usize) -> &'static str { + partial_type_name(std::any::type_name::<Self>(), last) + } +} diff --git a/pagetop/src/module/mod.rs b/pagetop/src/module/mod.rs index a767683b..720d806c 100644 --- a/pagetop/src/module/mod.rs +++ b/pagetop/src/module/mod.rs @@ -1,5 +1,8 @@ mod definition; -pub use definition::ModuleTrait; +pub use definition::{ + BaseModule, + ModuleTrait, +}; pub(crate) mod all; pub use all::register_module; \ No newline at end of file diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/response/page/component.rs index 8839a5ca..a423707f 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/response/page/component.rs @@ -1,24 +1,23 @@ use crate::html::{Markup, html}; use crate::response::page::PageAssets; - -use std::any::type_name; +use crate::util::partial_type_name; pub use std::any::Any as AnyComponent; -pub trait ComponentTrait: AnyComponent + Send + Sync { +pub trait BaseComponent { + fn type_name(&self) -> &'static str; + + fn single_name(&self) -> &'static str; + + fn qualified_name(&self, last: usize) -> &'static str; +} + +pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { fn new() -> Self where Self: Sized; - fn name(&self) -> &'static str { - let name = type_name::<Self>(); - match name.rfind("::") { - Some(position) => &name[(position + 2)..], - None => name - } - } - - fn fullname(&self) -> String { - type_name::<Self>().to_owned() + fn name(&self) -> String { + self.single_name().to_owned() } fn description(&self) -> Option<String> { @@ -47,10 +46,24 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } -pub fn component_ref<T: 'static>(component: &dyn ComponentTrait) -> &T { - component.as_ref_any().downcast_ref::<T>().unwrap() +impl<C: ?Sized + ComponentTrait> BaseComponent for C { + fn type_name(&self) -> &'static str { + std::any::type_name::<Self>() + } + + fn single_name(&self) -> &'static str { + partial_type_name(std::any::type_name::<Self>(), 1) + } + + fn qualified_name(&self, last: usize) -> &'static str { + partial_type_name(std::any::type_name::<Self>(), last) + } } -pub fn component_mut<T: 'static>(component: &mut dyn ComponentTrait) -> &mut T { - component.as_mut_any().downcast_mut::<T>().unwrap() +pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C { + component.as_ref_any().downcast_ref::<C>().unwrap() +} + +pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { + component.as_mut_any().downcast_mut::<C>().unwrap() } diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 1d923f73..01add24f 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -9,6 +9,7 @@ pub use assets::{ mod component; pub use component::{ AnyComponent, + BaseComponent, ComponentTrait, component_ref, component_mut, diff --git a/pagetop/src/theme/all.rs b/pagetop/src/theme/all.rs index ee0bfedb..12d96338 100644 --- a/pagetop/src/theme/all.rs +++ b/pagetop/src/theme/all.rs @@ -13,7 +13,7 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { pub fn register_theme(theme: &'static dyn ThemeTrait) { let mut themes = THEMES.write().unwrap(); if !themes.iter().any(|t| t.name() == theme.name()) { - trace::debug!("Registering \"{}\" theme", theme.name()); + trace::debug!("Registering \"{}\" theme", theme.single_name()); themes.push(theme); } } diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/theme/definition.rs index 4d54d758..ef21491a 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/theme/definition.rs @@ -3,12 +3,21 @@ use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::response::page::{ComponentTrait, Favicon, Page, PageAssets}; use crate::base::component::Chunck; +use crate::util::partial_type_name; + +pub trait BaseTheme { + fn type_name(&self) -> &'static str; + + fn single_name(&self) -> &'static str; + + fn qualified_name(&self, last: usize) -> &'static str; +} /// Los temas deben implementar este "trait". -pub trait ThemeTrait: Send + Sync { - fn name(&self) -> &'static str; - - fn fullname(&self) -> String; +pub trait ThemeTrait: BaseTheme + Send + Sync { + fn name(&self) -> String { + self.single_name().to_owned() + } fn description(&self) -> Option<String> { None @@ -127,3 +136,17 @@ pub trait ThemeTrait: Send + Sync { .render() } } + +impl<T: ?Sized + ThemeTrait> BaseTheme for T { + fn type_name(&self) -> &'static str { + std::any::type_name::<Self>() + } + + fn single_name(&self) -> &'static str { + partial_type_name(std::any::type_name::<Self>(), 1) + } + + fn qualified_name(&self, last: usize) -> &'static str { + partial_type_name(std::any::type_name::<Self>(), last) + } +} diff --git a/pagetop/src/theme/mod.rs b/pagetop/src/theme/mod.rs index 4456189e..f76d1fe3 100644 --- a/pagetop/src/theme/mod.rs +++ b/pagetop/src/theme/mod.rs @@ -1,5 +1,8 @@ mod definition; -pub use definition::ThemeTrait; +pub use definition::{ + BaseTheme, + ThemeTrait, +}; pub(crate) mod all; pub use all::{ diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 02bb584e..ca4a96fc 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -46,3 +46,14 @@ macro_rules! theme_static_files { } }}; } + +pub(crate) fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { + if last == 0 { + return type_name; + } + let positions: Vec<_> = type_name.rmatch_indices("::").collect(); + if positions.len() < last { + return type_name; + } + &type_name[(positions[last - 1].0 + 2)..] +} From a8cb7f0d29b75212bb31edaddc51ad40b181242c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 2 May 2022 12:30:30 +0200 Subject: [PATCH 067/853] =?UTF-8?q?Actualiza=20el=20c=C3=B3digo=20para=20l?= =?UTF-8?q?as=20nuevas=20denominaciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 6 ++--- pagetop-admin/src/lib.rs | 12 ++++------ pagetop-admin/src/locales/en-US/admin.ftl | 2 +- pagetop-admin/src/locales/es-ES/admin.ftl | 2 +- pagetop-admin/src/summary.rs | 2 +- pagetop-node/src/lib.rs | 12 ++++------ pagetop-node/src/locales/en-US/homepage.ftl | 2 +- pagetop-node/src/locales/es-ES/homepage.ftl | 2 +- pagetop-user/src/lib.rs | 12 ++++------ pagetop-user/src/locales/en-US/homepage.ftl | 2 +- pagetop-user/src/locales/es-ES/homepage.ftl | 2 +- pagetop/src/app/application.rs | 10 ++++---- pagetop/src/base/component/block.rs | 4 +++- pagetop/src/base/component/chunck.rs | 2 ++ pagetop/src/base/component/container.rs | 2 ++ pagetop/src/base/component/form/button.rs | 2 ++ pagetop/src/base/component/form/date.rs | 2 ++ pagetop/src/base/component/form/form.rs | 2 ++ pagetop/src/base/component/form/hidden.rs | 2 ++ pagetop/src/base/component/form/input.rs | 2 ++ pagetop/src/base/component/form/mod.rs | 20 ++++++++++++---- pagetop/src/base/component/grid/column.rs | 6 ++--- pagetop/src/base/component/grid/mod.rs | 8 +++++-- pagetop/src/base/component/grid/row.rs | 6 ++--- pagetop/src/base/component/image.rs | 2 ++ pagetop/src/base/component/menu.rs | 9 ++++--- pagetop/src/base/component/mod.rs | 24 ++++++++++++++----- pagetop/src/base/mod.rs | 2 +- .../demopage/locales/en-US/demopage.ftl | 2 +- .../demopage/locales/es-ES/demopage.ftl | 2 +- pagetop/src/base/module/demopage/mod.rs | 12 ++++------ pagetop/src/base/theme/aliner/mod.rs | 12 ++-------- pagetop/src/base/theme/bootsier/mod.rs | 12 ++-------- pagetop/src/base/theme/bulmix/mod.rs | 18 ++++---------- pagetop/src/base/theme/minimal/mod.rs | 11 ++------- pagetop/src/lib.rs | 20 ++++++++-------- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page/assets.rs | 10 +------- 38 files changed, 123 insertions(+), 139 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index e51f5311..9da7b124 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,9 +1,9 @@ use pagetop::prelude::*; fn bootstrap() { - register_module(&pagetop_admin::AdminModule); - register_module(&pagetop_user::UserModule); - register_module(&pagetop_node::NodeModule); + register_module(&pagetop_admin::Admin); + register_module(&pagetop_user::User); + register_module(&pagetop_node::Node); } #[actix_web::main] diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index a00e7fae..c07f617b 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -4,15 +4,11 @@ localize!("src/locales"); mod summary; -pub struct AdminModule; +pub struct Admin; -impl ModuleTrait for AdminModule { - fn name(&self) -> &'static str { - "Admin" - } - - fn fullname(&self) -> String { - l("module_fullname") +impl ModuleTrait for Admin { + fn name(&self) -> String { + l("module_name") } fn description(&self) -> Option<String> { diff --git a/pagetop-admin/src/locales/en-US/admin.ftl b/pagetop-admin/src/locales/en-US/admin.ftl index 88da2fe6..758f5ab5 100644 --- a/pagetop-admin/src/locales/en-US/admin.ftl +++ b/pagetop-admin/src/locales/en-US/admin.ftl @@ -1,2 +1,2 @@ -module_fullname = Admin module +module_name = Admin module module_description = Administration module. diff --git a/pagetop-admin/src/locales/es-ES/admin.ftl b/pagetop-admin/src/locales/es-ES/admin.ftl index c9105a6a..ba596691 100644 --- a/pagetop-admin/src/locales/es-ES/admin.ftl +++ b/pagetop-admin/src/locales/es-ES/admin.ftl @@ -1,2 +1,2 @@ -module_fullname = Admin module +module_name = Admin module module_description = Módulo de administración. diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index b91b97fa..696f408d 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -3,7 +3,7 @@ use super::l; pub async fn summary() -> app::Result<Markup> { let top_menu = Menu::new() - .add(MenuItem::label(l("module_fullname").as_str())) + .add(MenuItem::label(l("module_name").as_str())) .add(MenuItem::link("Opción 2", "https://www.google.es")) .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) .add(MenuItem::submenu("Submenú 1", Menu::new() diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index a05800ec..c9e2dcda 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -5,15 +5,11 @@ localize!("src/locales"); //mod entity; mod migration; -pub struct NodeModule; +pub struct Node; -impl ModuleTrait for NodeModule { - fn name(&self) -> &'static str { - "Node" - } - - fn fullname(&self) -> String { - l("module_fullname") +impl ModuleTrait for Node { + fn name(&self) -> String { + l("module_name") } fn description(&self) -> Option<String> { diff --git a/pagetop-node/src/locales/en-US/homepage.ftl b/pagetop-node/src/locales/en-US/homepage.ftl index 191dc81f..46a2e750 100644 --- a/pagetop-node/src/locales/en-US/homepage.ftl +++ b/pagetop-node/src/locales/en-US/homepage.ftl @@ -1,2 +1,2 @@ -module_fullname = Node +module_name = Node module_description = Allows content to be submitted to the site and displayed on pages. diff --git a/pagetop-node/src/locales/es-ES/homepage.ftl b/pagetop-node/src/locales/es-ES/homepage.ftl index b5e6677d..a2253fe9 100644 --- a/pagetop-node/src/locales/es-ES/homepage.ftl +++ b/pagetop-node/src/locales/es-ES/homepage.ftl @@ -1,2 +1,2 @@ -module_fullname = Nodo +module_name = Nodo module_description = Permite enviar contenidos al sitio y mostrarlos en páginas. diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index d5d96f37..bbbf01f3 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -4,15 +4,11 @@ localize!("src/locales"); mod migration; -pub struct UserModule; +pub struct User; -impl ModuleTrait for UserModule { - fn name(&self) -> &'static str { - "User" - } - - fn fullname(&self) -> String { - l("module_fullname") +impl ModuleTrait for User { + fn name(&self) -> String { + l("module_name") } fn description(&self) -> Option<String> { diff --git a/pagetop-user/src/locales/en-US/homepage.ftl b/pagetop-user/src/locales/en-US/homepage.ftl index 0493672e..710369d7 100644 --- a/pagetop-user/src/locales/en-US/homepage.ftl +++ b/pagetop-user/src/locales/en-US/homepage.ftl @@ -1,4 +1,4 @@ -module_fullname = User +module_name = User module_description = Manages the user registration and login system. username = User name diff --git a/pagetop-user/src/locales/es-ES/homepage.ftl b/pagetop-user/src/locales/es-ES/homepage.ftl index f5f6e1bb..8faaf12d 100644 --- a/pagetop-user/src/locales/es-ES/homepage.ftl +++ b/pagetop-user/src/locales/es-ES/homepage.ftl @@ -1,4 +1,4 @@ -module_fullname = Usuario +module_name = Usuario module_description = Gestiona el registro de usuarios y el sistema de accesos. username = Nombre de usuario diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index f0473180..f183bbfc 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -28,10 +28,10 @@ impl Application { Lazy::force(&app::db::DBCONN); // Registra los temas predeterminados. - theme::register_theme(&base::theme::aliner::AlinerTheme); - theme::register_theme(&base::theme::minimal::MinimalTheme); - theme::register_theme(&base::theme::bootsier::BootsierTheme); - theme::register_theme(&base::theme::bulmix::BulmixTheme); + theme::register_theme(&base::theme::aliner::Aliner); + theme::register_theme(&base::theme::minimal::Minimal); + theme::register_theme(&base::theme::bootsier::Bootsier); + theme::register_theme(&base::theme::bulmix::Bulmix); // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); @@ -39,7 +39,7 @@ impl Application { // Registra el módulo de presentación de PageTop. // Normalmente se sobrecargará en la función de inicio. - module::register_module(&base::module::demopage::DemopageModule); + module::register_module(&base::module::demopage::Demopage); // Actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 7f125eb5..96dc06b6 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_BLOCK: &str = "pagetop::base::component::block::Block"; + pub struct Block { renderable: fn() -> bool, weight : i8, @@ -32,7 +34,7 @@ impl ComponentTrait for Block { } fn default_render(&self, assets: &mut PageAssets) -> Markup { - let id = assets.serial_id(self.name(), self.id()); + let id = assets.serial_id(self.single_name(), self.id()); html! { div id=(id) class=[self.classes()] { @match self.title() { diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 1abd7554..902b1eef 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_CHUNCK: &str = "pagetop::base::component::chunck::Chunck"; + pub struct Chunck { renderable: fn() -> bool, weight : i8, diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 72766ac8..2bfbc3e0 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_CONTAINER: &str = "pagetop::base::component::container::Container"; + pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 74f0ba2f..783adbc6 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_BUTTON: &str = "pagetop::base::component::form::button::Button"; + pub enum ButtonType {Button, Reset, Submit} pub struct Button { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index f0c0cd33..7ef3f82d 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_DATE: &str = "pagetop::base::component::form::date::Date"; + pub struct Date { renderable : fn() -> bool, weight : i8, diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 79fc72dd..e6b10261 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_FORM: &str = "pagetop::base::component::form::form::Form"; + pub enum FormMethod {Get, Post} pub struct Form { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index baa0316f..3e9b41f3 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_HIDDEN: &str = "pagetop::base::component::form::hidden::Hidden"; + pub struct Hidden { weight: i8, name : OptIden, diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index f682ad3d..7a45ce21 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_INPUT: &str = "pagetop::base::component::form::input::Input"; + pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} pub struct Input { diff --git a/pagetop/src/base/component/form/mod.rs b/pagetop/src/base/component/form/mod.rs index 23b965e9..d8df6d2d 100644 --- a/pagetop/src/base/component/form/mod.rs +++ b/pagetop/src/base/component/form/mod.rs @@ -1,11 +1,21 @@ mod form; -pub use form::{Form, FormMethod}; +pub use form::{ + TYPENAME_FORM, Form, FormMethod +}; mod input; -pub use input::{Input, InputType}; +pub use input::{ + TYPENAME_INPUT, Input, InputType +}; mod hidden; -pub use hidden::Hidden; +pub use hidden::{ + TYPENAME_HIDDEN, Hidden +}; mod date; -pub use date::Date; +pub use date::{ + TYPENAME_DATE, Date +}; mod button; -pub use button::{Button, ButtonType}; +pub use button::{ + TYPENAME_BUTTON, Button, ButtonType +}; diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index f80d0ff3..b4121549 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_COLUMN: &str = "pagetop::base::component::grid::column::Column"; + pub struct Column { renderable: fn() -> bool, weight : i8, @@ -21,10 +23,6 @@ impl ComponentTrait for Column { } } - fn name(&self) -> &'static str { - "GridColumn" - } - fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/grid/mod.rs b/pagetop/src/base/component/grid/mod.rs index ca7796ef..e63ea7cd 100644 --- a/pagetop/src/base/component/grid/mod.rs +++ b/pagetop/src/base/component/grid/mod.rs @@ -1,4 +1,8 @@ mod row; -pub use row::Row; +pub use row::{ + TYPENAME_ROW, Row +}; mod column; -pub use column::Column; +pub use column::{ + TYPENAME_COLUMN, Column +}; diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 273701ed..8077fec6 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_ROW: &str = "pagetop::base::component::grid::row::Row"; + pub struct Row { renderable: fn() -> bool, weight : i8, @@ -21,10 +23,6 @@ impl ComponentTrait for Row { } } - fn name(&self) -> &'static str { - "GridRow" - } - fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index de1d6840..b88ead07 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const TYPENAME_IMAGE: &str = "pagetop::base::component::image::Image"; + pub struct Image { renderable: fn() -> bool, weight : i8, diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 5fb9f1cc..845284f9 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,5 +1,8 @@ use crate::prelude::*; +pub const TYPENAME_MENU: &str = "pagetop::base::component::menu::Menu"; +pub const TYPENAME_MENUITEM: &str = "pagetop::base::component::menu::MenuItem"; + pub enum MenuItemType { Label(String), Link(String, String), @@ -10,9 +13,7 @@ pub enum MenuItemType { Void, } -// ----------------------------------------------------------------------------- // MenuItem. -// ----------------------------------------------------------------------------- pub struct MenuItem { renderable: fn() -> bool, @@ -166,9 +167,7 @@ impl MenuItem { } } -// ----------------------------------------------------------------------------- // Menu. -// ----------------------------------------------------------------------------- pub struct Menu { renderable: fn() -> bool, @@ -212,7 +211,7 @@ impl ComponentTrait for Menu { )) .add_jquery(); - let id = assets.serial_id(self.name(), self.id()); + let id = assets.serial_id(self.single_name(), self.id()); html! { ul id=(id) class=[self.classes()] { (self.items().render(assets)) diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/base/component/mod.rs index b4e646b9..032fd625 100644 --- a/pagetop/src/base/component/mod.rs +++ b/pagetop/src/base/component/mod.rs @@ -1,16 +1,28 @@ mod container; -pub use container::{Container, ContainerType}; +pub use container::{ + TYPENAME_CONTAINER, Container, ContainerType +}; pub mod grid; mod chunck; -pub use chunck::Chunck; +pub use chunck::{ + TYPENAME_CHUNCK, Chunck +}; mod block; -pub use block::Block; +pub use block::{ + TYPENAME_BLOCK, Block +}; mod image; -pub use image::Image; +pub use image::{ + TYPENAME_IMAGE, Image +}; mod menu; -pub use menu::{Menu, MenuItem, MenuItemType}; +pub use menu::{ + TYPENAME_MENU, TYPENAME_MENUITEM, Menu, MenuItem, MenuItemType +}; pub mod form; -pub use form::{Form, FormMethod}; +pub use form::{ + TYPENAME_FORM, Form, FormMethod +}; diff --git a/pagetop/src/base/mod.rs b/pagetop/src/base/mod.rs index 6a8ebdf7..d58aa565 100644 --- a/pagetop/src/base/mod.rs +++ b/pagetop/src/base/mod.rs @@ -1,3 +1,3 @@ pub mod component; pub mod module; -pub mod theme; \ No newline at end of file +pub mod theme; diff --git a/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl index d23f6ce6..27749979 100644 --- a/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl +++ b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl @@ -1,4 +1,4 @@ -module_fullname = Default homepage +module_name = Default homepage module_description = Displays a demo homepage when none is configured. page_title = Hello world! diff --git a/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl index 70706ca8..e9bdd97f 100644 --- a/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl +++ b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl @@ -1,4 +1,4 @@ -module_fullname = Página de inicio predeterminada +module_name = Página de inicio predeterminada module_description = Muestra una página de demostración predeterminada cuando no hay ninguna configurada. page_title = ¡Hola mundo! diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 489b6d3b..34ac79b7 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -2,15 +2,11 @@ use crate::prelude::*; localize!("src/base/module/demopage/locales"); -pub struct DemopageModule; +pub struct Demopage; -impl ModuleTrait for DemopageModule { - fn name(&self) -> &'static str { - "Demopage" - } - - fn fullname(&self) -> String { - l("module_fullname") +impl ModuleTrait for Demopage { + fn name(&self) -> String { + l("module_name") } fn description(&self) -> Option<String> { diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs index d4f4f252..6936a019 100644 --- a/pagetop/src/base/theme/aliner/mod.rs +++ b/pagetop/src/base/theme/aliner/mod.rs @@ -2,17 +2,9 @@ use crate::prelude::*; include!(concat!(env!("OUT_DIR"), "/aliner.rs")); -pub struct AlinerTheme; - -impl ThemeTrait for AlinerTheme { - fn name(&self) -> &'static str { - "Aliner" - } - - fn fullname(&self) -> String { - "Aliner".to_owned() - } +pub struct Aliner; +impl ThemeTrait for Aliner { fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/aliner"); } diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index 90111723..0445356b 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -4,17 +4,9 @@ include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); localize!("src/base/theme/bootsier/locales"); -pub struct BootsierTheme; - -impl ThemeTrait for BootsierTheme { - fn name(&self) -> &'static str { - "Bootsier" - } - - fn fullname(&self) -> String { - "Bootsier".to_owned() - } +pub struct Bootsier; +impl ThemeTrait for Bootsier { fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/bootsier"); } diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 7454c69d..a4b194f4 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -2,17 +2,9 @@ use crate::prelude::*; include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); -pub struct BulmixTheme; - -impl ThemeTrait for BulmixTheme { - fn name(&self) -> &'static str { - "Bulmix" - } - - fn fullname(&self) -> String { - "Bulmix".to_owned() - } +pub struct Bulmix; +impl ThemeTrait for Bulmix { fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/bulmix"); } @@ -37,12 +29,12 @@ impl ThemeTrait for BulmixTheme { component: &mut dyn ComponentTrait, _assets: &mut PageAssets ) { - match component.name() { - "GridRow" => { + match component.type_name() { + grid::TYPENAME_ROW => { let row = component_mut::<grid::Row>(component); row.alter_classes("columns", ClassesOp::SetDefault); }, - "GridColumn" => { + grid::TYPENAME_COLUMN => { let col = component_mut::<grid::Column>(component); col.alter_classes("column", ClassesOp::SetDefault); }, diff --git a/pagetop/src/base/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal/mod.rs index 471b3738..d2124fb6 100644 --- a/pagetop/src/base/theme/minimal/mod.rs +++ b/pagetop/src/base/theme/minimal/mod.rs @@ -1,13 +1,6 @@ use crate::prelude::*; -pub struct MinimalTheme; +pub struct Minimal; -impl ThemeTrait for MinimalTheme { - fn name(&self) -> &'static str { - "Minimal" - } - - fn fullname(&self) -> String { - "Minimal".to_owned() - } +impl ThemeTrait for Minimal { } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 42ad192a..fa2b6ce1 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,4 +1,4 @@ -// Exports. +// External. pub use concat_string::concat_string; pub use doc_comment::doc_comment; @@ -8,24 +8,24 @@ pub use once_cell::sync::Lazy; pub(crate) use futures::executor::block_on as run_now; -// ----------------------------------------------------------------------------- -// APIs públicas. -// ----------------------------------------------------------------------------- +// Public APIs. pub mod config; // Gestión de la configuración. pub mod trace; // Registro de trazas y eventos de la aplicación. pub mod locale; // Localización. +pub mod html; // HTML en código. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub mod db; // Acceso a la base de datos. +pub mod db; // Acceso a base de datos. -pub mod html; // Publicación de HTML desde el código. -pub mod module; // API para crear módulos con nuevas funcionalidades. -pub mod theme; // API para crear temas y temas predeterminados. +pub mod theme; // Temas predefinidos y API para crear temas. +pub mod module; // API para añadir módulos con nuevas funcionalidades. pub mod response; // Tipos de respuestas web. -pub mod app; // Aplicación y servidor web. +pub mod app; // Aplicación y servidor web. pub mod base; // Componentes, Módulos y Temas base. pub mod util; // Macros y funciones útiles. -pub mod prelude; // Re-exporta recursos comunes. +// Re-exports. + +pub mod prelude; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 4cbd9a7d..c548f82c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -11,11 +11,11 @@ pub use crate::{ pub use crate::config::SETTINGS; pub use crate::trace; pub use crate::localize; +pub use crate::html::*; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub use crate::{db, db::*, boxed_migration}; -pub use crate::html::*; pub use crate::theme::*; pub use crate::module::*; pub use crate::response::page::*; diff --git a/pagetop/src/response/page/assets.rs b/pagetop/src/response/page/assets.rs index 8ab4d2eb..13c28a0b 100644 --- a/pagetop/src/response/page/assets.rs +++ b/pagetop/src/response/page/assets.rs @@ -6,13 +6,11 @@ use crate::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { match theme_by_name(&SETTINGS.app.theme) { Some(theme) => theme, - None => &base::theme::bootsier::BootsierTheme, + None => &base::theme::bootsier::Bootsier, } }); -// ----------------------------------------------------------------------------- // Favicon. -// ----------------------------------------------------------------------------- pub struct Favicon(Vec<String>); @@ -99,9 +97,7 @@ impl Favicon { } } -// ----------------------------------------------------------------------------- // StyleSheet. -// ----------------------------------------------------------------------------- pub struct StyleSheet { source: &'static str, @@ -131,9 +127,7 @@ impl StyleSheet { } } -// ----------------------------------------------------------------------------- // JavaScript. -// ----------------------------------------------------------------------------- #[derive(PartialEq)] pub enum JSMode { Async, Defer, Normal } @@ -177,9 +171,7 @@ impl JavaScript { } } -// ----------------------------------------------------------------------------- // Page assets. -// ----------------------------------------------------------------------------- pub struct PageAssets { theme : &'static dyn ThemeTrait, From 21b004fc1e14562b678c65868fb88bbcb354f882 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 2 May 2022 12:43:39 +0200 Subject: [PATCH 068/853] Actualiza y concentra APIs que extienden PageTop --- pagetop/src/app/application.rs | 3 ++- pagetop/src/core/mod.rs | 3 +++ pagetop/src/{ => core}/module/all.rs | 0 pagetop/src/{ => core}/module/definition.rs | 0 pagetop/src/{ => core}/module/mod.rs | 0 pagetop/src/{ => core}/response/mod.rs | 0 pagetop/src/{ => core}/response/page/assets.rs | 2 +- pagetop/src/{ => core}/response/page/component.rs | 2 +- pagetop/src/{ => core}/response/page/container.rs | 2 +- pagetop/src/{ => core}/response/page/mod.rs | 0 pagetop/src/{ => core}/response/page/page.rs | 2 +- pagetop/src/{ => core}/theme/all.rs | 0 pagetop/src/{ => core}/theme/definition.rs | 2 +- pagetop/src/{ => core}/theme/mod.rs | 0 pagetop/src/lib.rs | 7 ++----- pagetop/src/prelude.rs | 8 +++++--- 16 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 pagetop/src/core/mod.rs rename pagetop/src/{ => core}/module/all.rs (100%) rename pagetop/src/{ => core}/module/definition.rs (100%) rename pagetop/src/{ => core}/module/mod.rs (100%) rename pagetop/src/{ => core}/response/mod.rs (100%) rename pagetop/src/{ => core}/response/page/assets.rs (99%) rename pagetop/src/{ => core}/response/page/component.rs (97%) rename pagetop/src/{ => core}/response/page/container.rs (91%) rename pagetop/src/{ => core}/response/page/mod.rs (100%) rename pagetop/src/{ => core}/response/page/page.rs (99%) rename pagetop/src/{ => core}/theme/all.rs (100%) rename pagetop/src/{ => core}/theme/definition.rs (98%) rename pagetop/src/{ => core}/theme/mod.rs (100%) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index f183bbfc..db8af1a6 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,5 +1,6 @@ -use crate::{Lazy, app, base, module, theme, trace}; +use crate::{Lazy, app, base, trace}; use crate::config::SETTINGS; +use crate::core::{module, theme}; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; diff --git a/pagetop/src/core/mod.rs b/pagetop/src/core/mod.rs new file mode 100644 index 00000000..179f3e12 --- /dev/null +++ b/pagetop/src/core/mod.rs @@ -0,0 +1,3 @@ +pub mod module; // API para añadir módulos con nuevas funcionalidades. +pub mod response; // Tipos de respuestas web. +pub mod theme; // Temas predefinidos y API para crear temas. diff --git a/pagetop/src/module/all.rs b/pagetop/src/core/module/all.rs similarity index 100% rename from pagetop/src/module/all.rs rename to pagetop/src/core/module/all.rs diff --git a/pagetop/src/module/definition.rs b/pagetop/src/core/module/definition.rs similarity index 100% rename from pagetop/src/module/definition.rs rename to pagetop/src/core/module/definition.rs diff --git a/pagetop/src/module/mod.rs b/pagetop/src/core/module/mod.rs similarity index 100% rename from pagetop/src/module/mod.rs rename to pagetop/src/core/module/mod.rs diff --git a/pagetop/src/response/mod.rs b/pagetop/src/core/response/mod.rs similarity index 100% rename from pagetop/src/response/mod.rs rename to pagetop/src/core/response/mod.rs diff --git a/pagetop/src/response/page/assets.rs b/pagetop/src/core/response/page/assets.rs similarity index 99% rename from pagetop/src/response/page/assets.rs rename to pagetop/src/core/response/page/assets.rs index 13c28a0b..7eef7b1a 100644 --- a/pagetop/src/response/page/assets.rs +++ b/pagetop/src/core/response/page/assets.rs @@ -1,7 +1,7 @@ use crate::{Lazy, base, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, PreEscaped, html}; -use crate::theme::*; +use crate::core::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { match theme_by_name(&SETTINGS.app.theme) { diff --git a/pagetop/src/response/page/component.rs b/pagetop/src/core/response/page/component.rs similarity index 97% rename from pagetop/src/response/page/component.rs rename to pagetop/src/core/response/page/component.rs index a423707f..aa1160b1 100644 --- a/pagetop/src/response/page/component.rs +++ b/pagetop/src/core/response/page/component.rs @@ -1,5 +1,5 @@ use crate::html::{Markup, html}; -use crate::response::page::PageAssets; +use crate::core::response::page::PageAssets; use crate::util::partial_type_name; pub use std::any::Any as AnyComponent; diff --git a/pagetop/src/response/page/container.rs b/pagetop/src/core/response/page/container.rs similarity index 91% rename from pagetop/src/response/page/container.rs rename to pagetop/src/core/response/page/container.rs index 6cf09607..91c685fd 100644 --- a/pagetop/src/response/page/container.rs +++ b/pagetop/src/core/response/page/container.rs @@ -1,5 +1,5 @@ use crate::html::{Markup, html}; -use crate::response::page::{PageAssets, ComponentTrait, render_component}; +use crate::core::response::page::{PageAssets, ComponentTrait, render_component}; use std::sync::{Arc, RwLock}; diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/core/response/page/mod.rs similarity index 100% rename from pagetop/src/response/page/mod.rs rename to pagetop/src/core/response/page/mod.rs diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/core/response/page/page.rs similarity index 99% rename from pagetop/src/response/page/page.rs rename to pagetop/src/core/response/page/page.rs index 2a1f69f4..c23ea9c2 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/core/response/page/page.rs @@ -1,7 +1,7 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::*; -use crate::response::page::*; +use crate::core::response::page::*; use std::sync::RwLock; use std::collections::HashMap; diff --git a/pagetop/src/theme/all.rs b/pagetop/src/core/theme/all.rs similarity index 100% rename from pagetop/src/theme/all.rs rename to pagetop/src/core/theme/all.rs diff --git a/pagetop/src/theme/definition.rs b/pagetop/src/core/theme/definition.rs similarity index 98% rename from pagetop/src/theme/definition.rs rename to pagetop/src/core/theme/definition.rs index ef21491a..c7d5f855 100644 --- a/pagetop/src/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,7 @@ use crate::{app, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, html}; -use crate::response::page::{ComponentTrait, Favicon, Page, PageAssets}; +use crate::core::response::page::{ComponentTrait, Favicon, Page, PageAssets}; use crate::base::component::Chunck; use crate::util::partial_type_name; diff --git a/pagetop/src/theme/mod.rs b/pagetop/src/core/theme/mod.rs similarity index 100% rename from pagetop/src/theme/mod.rs rename to pagetop/src/core/theme/mod.rs diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index fa2b6ce1..68c23520 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -18,12 +18,9 @@ pub mod html; // HTML en código. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a base de datos. -pub mod theme; // Temas predefinidos y API para crear temas. -pub mod module; // API para añadir módulos con nuevas funcionalidades. -pub mod response; // Tipos de respuestas web. - +pub mod core; // APIs para módulos, respuestas web y temas. pub mod app; // Aplicación y servidor web. -pub mod base; // Componentes, Módulos y Temas base. +pub mod base; // Base de componentes, módulos y temas. pub mod util; // Macros y funciones útiles. // Re-exports. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index c548f82c..d5190250 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -16,9 +16,11 @@ pub use crate::html::*; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub use crate::{db, db::*, boxed_migration}; -pub use crate::theme::*; -pub use crate::module::*; -pub use crate::response::page::*; +pub use crate::core::{ + module::*, + response::page::*, + theme::*, +}; pub use crate::app; pub use crate::app::application::{Application, essence}; From 8f429401ebc6a3f45a68b93e437fdaecfc86913f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 2 May 2022 13:12:28 +0200 Subject: [PATCH 069/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 2 +- pagetop/Cargo.toml | 6 +++--- pagetop/src/core/theme/definition.rs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 696f408d..f254714f 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -34,7 +34,7 @@ pub async fn summary() -> app::Result<Markup> { Page::new() - .using_theme("bootsier") + .using_theme("Bootsier") .with_title("Admin") diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index bd2ba3a1..003bde82 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ @@ -33,9 +33,9 @@ url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } -tracing = "0.1.32" +tracing = "0.1.34" tracing-appender = "0.2.2" -tracing-subscriber = { version = "0.3.10", features = ["json", "env-filter"] } +tracing-subscriber = { version = "0.3.11", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } tracing-actix-web = "0.2" diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index c7d5f855..1d6df035 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -92,7 +92,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { /* Cómo usarlo: - match component.name() { + match component.single_name() { "Block" => { let block = component_mut::<Block>(component); block.alter_title("New title"); @@ -112,7 +112,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { /* Cómo usarlo: - match component.name() { + match component.single_name() { "Block" => { let block = component_ref::<Block>(component); match block.template() { From 9eede3321a015fa84a8cb777334cdd0dbb077e2b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 2 May 2022 20:00:22 +0200 Subject: [PATCH 070/853] =?UTF-8?q?A=C3=B1ade=20extensiones=20en=20m=C3=B3?= =?UTF-8?q?dulos=20para=20a=C3=B1adir=20funciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/all.rs | 34 ++++++++++++++++++--- pagetop/src/core/module/definition.rs | 25 +++++++++------ pagetop/src/core/module/extension.rs | 30 ++++++++++++++++++ pagetop/src/core/module/mod.rs | 10 +++++- pagetop/src/core/response/page/component.rs | 10 +++--- pagetop/src/core/theme/definition.rs | 10 +++--- pagetop/src/util.rs | 3 +- 7 files changed, 96 insertions(+), 26 deletions(-) create mode 100644 pagetop/src/core/module/extension.rs diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 2e499f23..e902c1ec 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,14 +1,20 @@ use crate::{Lazy, app, run_now, trace}; use crate::db::*; -use super::ModuleTrait; +use super::{ExtensionTrait, ModuleTrait}; -use std::sync::RwLock; +use std::sync::{Arc, RwLock}; +use std::collections::HashMap; // Módulos registrados. static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { RwLock::new(Vec::new()) }); +// Extensiones registradas. +static EXTENSIONS: Lazy<RwLock<HashMap<&str, Arc<Vec<&dyn ExtensionTrait>>>>> = Lazy::new(|| { + RwLock::new(HashMap::new()) +}); + pub fn register_module(module: &'static dyn ModuleTrait) { let mut list: Vec<&dyn ModuleTrait> = Vec::new(); add_to(&mut list, module); @@ -17,11 +23,24 @@ pub fn register_module(module: &'static dyn ModuleTrait) { } fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { - if !MODULES.read().unwrap().iter().any(|m| m.name() == module.name()) { - if !list.iter().any(|m| m.name() == module.name()) { + if !MODULES.read().unwrap().iter().any(|m| m.type_name() == module.type_name()) { + if !list.iter().any(|m| m.type_name() == module.type_name()) { trace::debug!("Registering \"{}\" module", module.single_name()); list.push(module); + + let mut hmap = EXTENSIONS.write().unwrap(); + for e in module.extensions().iter() { + if let Some(extensions) = hmap.get_mut(e.type_name()) { + let v = Arc::get_mut(extensions).unwrap(); + v.push(*e); + v.sort_by_key(|e| e.weight()); + } else { + hmap.insert(e.type_name(), Arc::new(vec![*e])); + } + } + + let mut dependencies = module.dependencies(); dependencies.reverse(); for d in dependencies.iter() { @@ -37,6 +56,13 @@ pub fn modules(cfg: &mut app::web::ServiceConfig) { } } +pub fn extensions(type_name: &'static str) -> Option<Arc<Vec<&dyn ExtensionTrait>>> { + match EXTENSIONS.read().unwrap().get(type_name) { + Some(extensions) => Some(extensions.clone()), + _ => None, + } +} + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub fn migrations() { run_now({ diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index baaadd98..58a8d4ea 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,15 +1,16 @@ -use crate::app; -use crate::util::partial_type_name; +use crate::{app, util}; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db; +use super::ExtensionTrait; + pub trait BaseModule { fn type_name(&self) -> &'static str; fn single_name(&self) -> &'static str; - fn qualified_name(&self, last: usize) -> &'static str; + fn qualified_name(&self, last: u8) -> &'static str; } /// Los módulos deben implementar este *trait*. @@ -22,19 +23,23 @@ pub trait ModuleTrait: BaseModule + Send + Sync { None } - fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { - vec![] - } - #[allow(unused_variables)] fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { } + fn extensions(&self) -> Vec<&'static dyn ExtensionTrait> { + vec![] + } + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[allow(unused_variables)] fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { vec![] } + + fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { + vec![] + } } impl<M: ?Sized + ModuleTrait> BaseModule for M { @@ -43,10 +48,10 @@ impl<M: ?Sized + ModuleTrait> BaseModule for M { } fn single_name(&self) -> &'static str { - partial_type_name(std::any::type_name::<Self>(), 1) + util::partial_type_name(std::any::type_name::<Self>(), 1) } - fn qualified_name(&self, last: usize) -> &'static str { - partial_type_name(std::any::type_name::<Self>(), last) + fn qualified_name(&self, last: u8) -> &'static str { + util::partial_type_name(std::any::type_name::<Self>(), last) } } diff --git a/pagetop/src/core/module/extension.rs b/pagetop/src/core/module/extension.rs new file mode 100644 index 00000000..e8b8107c --- /dev/null +++ b/pagetop/src/core/module/extension.rs @@ -0,0 +1,30 @@ +use crate::util; + +pub trait BaseExtension { + fn type_name(&self) -> &'static str; + + fn single_name(&self) -> &'static str; + + fn qualified_name(&self, last: u8) -> &'static str; +} + +/// Las extensiones deben extender este *trait*. +pub trait ExtensionTrait: BaseExtension + Send + Sync { + fn weight(&self) -> i8 { + 0 + } +} + +impl<E: ?Sized + ExtensionTrait> BaseExtension for E { + fn type_name(&self) -> &'static str { + std::any::type_name::<Self>() + } + + fn single_name(&self) -> &'static str { + util::partial_type_name(std::any::type_name::<Self>(), 1) + } + + fn qualified_name(&self, last: u8) -> &'static str { + util::partial_type_name(std::any::type_name::<Self>(), last) + } +} diff --git a/pagetop/src/core/module/mod.rs b/pagetop/src/core/module/mod.rs index 720d806c..d72bd48d 100644 --- a/pagetop/src/core/module/mod.rs +++ b/pagetop/src/core/module/mod.rs @@ -3,6 +3,14 @@ pub use definition::{ BaseModule, ModuleTrait, }; +mod extension; +pub use extension::{ + BaseExtension, + ExtensionTrait, +}; pub(crate) mod all; -pub use all::register_module; \ No newline at end of file +pub use all::{ + extensions, + register_module +}; diff --git a/pagetop/src/core/response/page/component.rs b/pagetop/src/core/response/page/component.rs index aa1160b1..0bbc3abf 100644 --- a/pagetop/src/core/response/page/component.rs +++ b/pagetop/src/core/response/page/component.rs @@ -1,6 +1,6 @@ use crate::html::{Markup, html}; use crate::core::response::page::PageAssets; -use crate::util::partial_type_name; +use crate::util; pub use std::any::Any as AnyComponent; @@ -9,7 +9,7 @@ pub trait BaseComponent { fn single_name(&self) -> &'static str; - fn qualified_name(&self, last: usize) -> &'static str; + fn qualified_name(&self, last: u8) -> &'static str; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -52,11 +52,11 @@ impl<C: ?Sized + ComponentTrait> BaseComponent for C { } fn single_name(&self) -> &'static str { - partial_type_name(std::any::type_name::<Self>(), 1) + util::partial_type_name(std::any::type_name::<Self>(), 1) } - fn qualified_name(&self, last: usize) -> &'static str { - partial_type_name(std::any::type_name::<Self>(), last) + fn qualified_name(&self, last: u8) -> &'static str { + util::partial_type_name(std::any::type_name::<Self>(), last) } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 1d6df035..130dfdac 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -3,14 +3,14 @@ use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::core::response::page::{ComponentTrait, Favicon, Page, PageAssets}; use crate::base::component::Chunck; -use crate::util::partial_type_name; +use crate::util; pub trait BaseTheme { fn type_name(&self) -> &'static str; fn single_name(&self) -> &'static str; - fn qualified_name(&self, last: usize) -> &'static str; + fn qualified_name(&self, last: u8) -> &'static str; } /// Los temas deben implementar este "trait". @@ -143,10 +143,10 @@ impl<T: ?Sized + ThemeTrait> BaseTheme for T { } fn single_name(&self) -> &'static str { - partial_type_name(std::any::type_name::<Self>(), 1) + util::partial_type_name(std::any::type_name::<Self>(), 1) } - fn qualified_name(&self, last: usize) -> &'static str { - partial_type_name(std::any::type_name::<Self>(), last) + fn qualified_name(&self, last: u8) -> &'static str { + util::partial_type_name(std::any::type_name::<Self>(), last) } } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index ca4a96fc..3190b641 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -47,11 +47,12 @@ macro_rules! theme_static_files { }}; } -pub(crate) fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { +pub(crate) fn partial_type_name(type_name: &'static str, last: u8) -> &'static str { if last == 0 { return type_name; } let positions: Vec<_> = type_name.rmatch_indices("::").collect(); + let last: usize = last as usize; if positions.len() < last { return type_name; } From d0e566aede64683e2d8ccfbe9bd014120aebd278 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 4 May 2022 18:07:56 +0200 Subject: [PATCH 071/853] Modifica las extensiones por acciones registradas --- pagetop/src/api/action/all.rs | 27 ++++++++ .../extension.rs => api/action/definition.rs} | 17 +++-- pagetop/src/api/action/holder.rs | 30 +++++++++ pagetop/src/api/action/mod.rs | 19 ++++++ pagetop/src/api/component/action.rs | 55 ++++++++++++++++ pagetop/src/api/component/all.rs | 22 +++++++ .../response/page => api/component}/assets.rs | 2 +- .../page => api/component}/container.rs | 2 +- .../component/definition.rs} | 28 ++++++++- .../response/page => api/component}/mod.rs | 16 +++-- pagetop/src/api/mod.rs | 4 ++ pagetop/src/{core => api}/module/all.rs | 30 +-------- .../src/{core => api}/module/definition.rs | 6 -- pagetop/src/api/module/mod.rs | 10 +++ pagetop/src/{core => api}/theme/all.rs | 0 pagetop/src/{core => api}/theme/definition.rs | 3 +- pagetop/src/{core => api}/theme/mod.rs | 0 pagetop/src/app/application.rs | 2 +- pagetop/src/core/mod.rs | 3 - pagetop/src/core/module/mod.rs | 16 ----- pagetop/src/lib.rs | 4 +- pagetop/src/prelude.rs | 7 ++- pagetop/src/{core => }/response/mod.rs | 0 pagetop/src/response/page/action.rs | 63 +++++++++++++++++++ pagetop/src/response/page/mod.rs | 4 ++ pagetop/src/{core => }/response/page/page.rs | 39 +++--------- 26 files changed, 309 insertions(+), 100 deletions(-) create mode 100644 pagetop/src/api/action/all.rs rename pagetop/src/{core/module/extension.rs => api/action/definition.rs} (59%) create mode 100644 pagetop/src/api/action/holder.rs create mode 100644 pagetop/src/api/action/mod.rs create mode 100644 pagetop/src/api/component/action.rs create mode 100644 pagetop/src/api/component/all.rs rename pagetop/src/{core/response/page => api/component}/assets.rs (99%) rename pagetop/src/{core/response/page => api/component}/container.rs (91%) rename pagetop/src/{core/response/page/component.rs => api/component/definition.rs} (64%) rename pagetop/src/{core/response/page => api/component}/mod.rs (67%) create mode 100644 pagetop/src/api/mod.rs rename pagetop/src/{core => api}/module/all.rs (63%) rename pagetop/src/{core => api}/module/definition.rs (91%) create mode 100644 pagetop/src/api/module/mod.rs rename pagetop/src/{core => api}/theme/all.rs (100%) rename pagetop/src/{core => api}/theme/definition.rs (97%) rename pagetop/src/{core => api}/theme/mod.rs (100%) delete mode 100644 pagetop/src/core/mod.rs delete mode 100644 pagetop/src/core/module/mod.rs rename pagetop/src/{core => }/response/mod.rs (100%) create mode 100644 pagetop/src/response/page/action.rs create mode 100644 pagetop/src/response/page/mod.rs rename pagetop/src/{core => }/response/page/page.rs (82%) diff --git a/pagetop/src/api/action/all.rs b/pagetop/src/api/action/all.rs new file mode 100644 index 00000000..e7a4981f --- /dev/null +++ b/pagetop/src/api/action/all.rs @@ -0,0 +1,27 @@ +use crate::Lazy; +use super::{ActionItem, ActionsHolder, ActionTrait}; + +use std::sync::RwLock; +use std::collections::HashMap; + +// Registered actions. +static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = Lazy::new(|| { + RwLock::new(HashMap::new()) +}); + +pub fn register_action(action: impl ActionTrait) { + let mut hmap = ACTIONS.write().unwrap(); + let action_name = action.type_name(); + if let Some(actions) = hmap.get_mut(action_name) { + actions.add(action); + } else { + hmap.insert(action_name, ActionsHolder::new_with(action)); + } +} + +pub fn run_actions<B, F>(type_name: &'static str, f: F) where F: FnMut(&ActionItem) -> B { + let hmap = ACTIONS.read().unwrap(); + if let Some(actions) = hmap.get(type_name) { + actions.iter_map(f) + } +} diff --git a/pagetop/src/core/module/extension.rs b/pagetop/src/api/action/definition.rs similarity index 59% rename from pagetop/src/core/module/extension.rs rename to pagetop/src/api/action/definition.rs index e8b8107c..4a813ef9 100644 --- a/pagetop/src/core/module/extension.rs +++ b/pagetop/src/api/action/definition.rs @@ -1,6 +1,8 @@ use crate::util; -pub trait BaseExtension { +pub use std::any::Any as AnyAction; + +pub trait BaseAction { fn type_name(&self) -> &'static str; fn single_name(&self) -> &'static str; @@ -8,14 +10,17 @@ pub trait BaseExtension { fn qualified_name(&self, last: u8) -> &'static str; } -/// Las extensiones deben extender este *trait*. -pub trait ExtensionTrait: BaseExtension + Send + Sync { +pub trait ActionTrait: AnyAction + BaseAction + Send + Sync { + fn new() -> Self where Self: Sized; + fn weight(&self) -> i8 { 0 } + + fn as_ref_any(&self) -> &dyn AnyAction; } -impl<E: ?Sized + ExtensionTrait> BaseExtension for E { +impl<C: ?Sized + ActionTrait> BaseAction for C { fn type_name(&self) -> &'static str { std::any::type_name::<Self>() } @@ -28,3 +33,7 @@ impl<E: ?Sized + ExtensionTrait> BaseExtension for E { util::partial_type_name(std::any::type_name::<Self>(), last) } } + +pub fn action_ref<A: 'static>(action: &dyn ActionTrait) -> &A { + action.as_ref_any().downcast_ref::<A>().unwrap() +} diff --git a/pagetop/src/api/action/holder.rs b/pagetop/src/api/action/holder.rs new file mode 100644 index 00000000..c7dd3ef3 --- /dev/null +++ b/pagetop/src/api/action/holder.rs @@ -0,0 +1,30 @@ +use super::ActionTrait; + +use std::sync::{Arc, RwLock}; + +pub type ActionItem = Box<dyn ActionTrait>; + +#[derive(Clone)] +pub struct ActionsHolder(Arc<RwLock<Vec<ActionItem>>>); + +impl ActionsHolder { + pub fn new() -> Self { + ActionsHolder(Arc::new(RwLock::new(Vec::new()))) + } + + pub fn new_with(action: impl ActionTrait) -> Self { + let mut container = ActionsHolder::new(); + container.add(action); + container + } + + pub fn add(&mut self, action: impl ActionTrait) { + let mut actions = self.0.write().unwrap(); + actions.push(Box::new(action)); + actions.sort_by_key(|a| a.weight()); + } + + pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&ActionItem) -> B { + let _ = self.0.read().unwrap().iter().map(f); + } +} diff --git a/pagetop/src/api/action/mod.rs b/pagetop/src/api/action/mod.rs new file mode 100644 index 00000000..e28122e0 --- /dev/null +++ b/pagetop/src/api/action/mod.rs @@ -0,0 +1,19 @@ +mod definition; +pub use definition::{ + ActionTrait, + AnyAction, + BaseAction, + action_ref, +}; + +mod holder; +pub use holder::{ + ActionItem, + ActionsHolder, +}; + +mod all; +pub use all::{ + register_action, + run_actions, +}; diff --git a/pagetop/src/api/component/action.rs b/pagetop/src/api/component/action.rs new file mode 100644 index 00000000..2569be85 --- /dev/null +++ b/pagetop/src/api/component/action.rs @@ -0,0 +1,55 @@ +use crate::api::action::{ActionTrait, AnyAction}; +use super::{ComponentTrait, PageAssets}; + +pub enum TypeAction { + BeforeRenderComponent(fn(&mut dyn ComponentTrait, &mut PageAssets)), + None, +} + +pub struct ComponentAction { + action: TypeAction, + weight: i8, +} + +impl ActionTrait for ComponentAction { + fn new() -> Self { + ComponentAction { + action: TypeAction::None, + weight: 0, + } + } + + fn weight(&self) -> i8 { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } +} + +impl ComponentAction { + pub fn new(action: TypeAction) -> Self { + ComponentAction { + action, + weight: 0, + } + } + + pub fn new_with_weight(action: TypeAction, weight: i8) -> Self { + ComponentAction { + action, + weight, + } + } + + pub fn before_render_component( + &self, + component: &mut dyn ComponentTrait, + assets: &mut PageAssets) + { + if let TypeAction::BeforeRenderComponent(f) = self.action { + f(component, assets) + } + } +} diff --git a/pagetop/src/api/component/all.rs b/pagetop/src/api/component/all.rs new file mode 100644 index 00000000..6ba66752 --- /dev/null +++ b/pagetop/src/api/component/all.rs @@ -0,0 +1,22 @@ +use crate::Lazy; +use super::{ComponentTrait, PageContainer}; + +use std::sync::RwLock; +use std::collections::HashMap; + +static COMPONENTS: Lazy<RwLock<HashMap<&str, PageContainer>>> = Lazy::new(|| { + RwLock::new(HashMap::new()) +}); + +pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { + let mut hmap = COMPONENTS.write().unwrap(); + if let Some(regions) = hmap.get_mut(region) { + regions.add(component); + } else { + hmap.insert(region, PageContainer::new_with(component)); + } +} + +pub fn common_components() -> HashMap<&'static str, PageContainer> { + COMPONENTS.read().unwrap().clone() +} diff --git a/pagetop/src/core/response/page/assets.rs b/pagetop/src/api/component/assets.rs similarity index 99% rename from pagetop/src/core/response/page/assets.rs rename to pagetop/src/api/component/assets.rs index 7eef7b1a..16821ada 100644 --- a/pagetop/src/core/response/page/assets.rs +++ b/pagetop/src/api/component/assets.rs @@ -1,7 +1,7 @@ use crate::{Lazy, base, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, PreEscaped, html}; -use crate::core::theme::*; +use crate::api::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { match theme_by_name(&SETTINGS.app.theme) { diff --git a/pagetop/src/core/response/page/container.rs b/pagetop/src/api/component/container.rs similarity index 91% rename from pagetop/src/core/response/page/container.rs rename to pagetop/src/api/component/container.rs index 91c685fd..5ca41056 100644 --- a/pagetop/src/core/response/page/container.rs +++ b/pagetop/src/api/component/container.rs @@ -1,5 +1,5 @@ use crate::html::{Markup, html}; -use crate::core::response::page::{PageAssets, ComponentTrait, render_component}; +use super::{PageAssets, ComponentTrait, render_component}; use std::sync::{Arc, RwLock}; diff --git a/pagetop/src/core/response/page/component.rs b/pagetop/src/api/component/definition.rs similarity index 64% rename from pagetop/src/core/response/page/component.rs rename to pagetop/src/api/component/definition.rs index 0bbc3abf..d32f1b3f 100644 --- a/pagetop/src/core/response/page/component.rs +++ b/pagetop/src/api/component/definition.rs @@ -1,6 +1,8 @@ use crate::html::{Markup, html}; -use crate::core::response::page::PageAssets; use crate::util; +use crate::api::action::{action_ref, run_actions}; +use super::PageAssets; +use super::action::ComponentAction; pub use std::any::Any as AnyComponent; @@ -67,3 +69,27 @@ pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C { pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } + +pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut PageAssets) -> Markup { + // Acciones del componente antes de renderizar. + component.before_render(assets); + + // Acciones de los módulos antes de renderizar el componente. + run_actions( + "", + |a| action_ref::<ComponentAction>(&**a).before_render_component(component, assets) + ); + + // Acciones del tema antes de renderizar el componente. + assets.theme().before_render_component(component, assets); + + match component.is_renderable() { + true => { + match assets.theme().render_component(component, assets) { + Some(html) => html, + None => component.default_render(assets) + } + }, + false => html! {} + } +} diff --git a/pagetop/src/core/response/page/mod.rs b/pagetop/src/api/component/mod.rs similarity index 67% rename from pagetop/src/core/response/page/mod.rs rename to pagetop/src/api/component/mod.rs index 01add24f..7c9482c6 100644 --- a/pagetop/src/core/response/page/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -1,3 +1,5 @@ +pub mod action; + mod assets; pub use assets::{ Favicon, @@ -6,22 +8,24 @@ pub use assets::{ PageAssets, }; -mod component; -pub use component::{ +mod definition; +pub use definition::{ AnyComponent, BaseComponent, ComponentTrait, component_ref, component_mut, }; +use definition::render_component; mod container; pub use container::PageContainer; -mod page; -pub use page::Page; -pub use page::render_component; -pub use page::add_component_to; +mod all; +pub use all::{ + add_component_to, + common_components, +}; pub fn render_always() -> bool { true } diff --git a/pagetop/src/api/mod.rs b/pagetop/src/api/mod.rs new file mode 100644 index 00000000..b69ec91b --- /dev/null +++ b/pagetop/src/api/mod.rs @@ -0,0 +1,4 @@ +pub mod action; // API to define functions that alter the behavior of PageTop core. +pub mod component; // API para crear nuevos componentes. +pub mod module; // API para añadir módulos con nuevas funcionalidades. +pub mod theme; // API para crear temas. diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/api/module/all.rs similarity index 63% rename from pagetop/src/core/module/all.rs rename to pagetop/src/api/module/all.rs index e902c1ec..56e1d6c4 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/api/module/all.rs @@ -1,20 +1,14 @@ use crate::{Lazy, app, run_now, trace}; use crate::db::*; -use super::{ExtensionTrait, ModuleTrait}; +use super::ModuleTrait; -use std::sync::{Arc, RwLock}; -use std::collections::HashMap; +use std::sync::RwLock; // Módulos registrados. static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { RwLock::new(Vec::new()) }); -// Extensiones registradas. -static EXTENSIONS: Lazy<RwLock<HashMap<&str, Arc<Vec<&dyn ExtensionTrait>>>>> = Lazy::new(|| { - RwLock::new(HashMap::new()) -}); - pub fn register_module(module: &'static dyn ModuleTrait) { let mut list: Vec<&dyn ModuleTrait> = Vec::new(); add_to(&mut list, module); @@ -28,19 +22,6 @@ fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { trace::debug!("Registering \"{}\" module", module.single_name()); list.push(module); - - let mut hmap = EXTENSIONS.write().unwrap(); - for e in module.extensions().iter() { - if let Some(extensions) = hmap.get_mut(e.type_name()) { - let v = Arc::get_mut(extensions).unwrap(); - v.push(*e); - v.sort_by_key(|e| e.weight()); - } else { - hmap.insert(e.type_name(), Arc::new(vec![*e])); - } - } - - let mut dependencies = module.dependencies(); dependencies.reverse(); for d in dependencies.iter() { @@ -56,13 +37,6 @@ pub fn modules(cfg: &mut app::web::ServiceConfig) { } } -pub fn extensions(type_name: &'static str) -> Option<Arc<Vec<&dyn ExtensionTrait>>> { - match EXTENSIONS.read().unwrap().get(type_name) { - Some(extensions) => Some(extensions.clone()), - _ => None, - } -} - #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub fn migrations() { run_now({ diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/api/module/definition.rs similarity index 91% rename from pagetop/src/core/module/definition.rs rename to pagetop/src/api/module/definition.rs index 58a8d4ea..288e99bb 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -3,8 +3,6 @@ use crate::{app, util}; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db; -use super::ExtensionTrait; - pub trait BaseModule { fn type_name(&self) -> &'static str; @@ -27,10 +25,6 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { } - fn extensions(&self) -> Vec<&'static dyn ExtensionTrait> { - vec![] - } - #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[allow(unused_variables)] fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { diff --git a/pagetop/src/api/module/mod.rs b/pagetop/src/api/module/mod.rs new file mode 100644 index 00000000..d1addefe --- /dev/null +++ b/pagetop/src/api/module/mod.rs @@ -0,0 +1,10 @@ +mod definition; +pub use definition::{ + BaseModule, + ModuleTrait, +}; + +pub(crate) mod all; +pub use all::{ + register_module, +}; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/api/theme/all.rs similarity index 100% rename from pagetop/src/core/theme/all.rs rename to pagetop/src/api/theme/all.rs diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/api/theme/definition.rs similarity index 97% rename from pagetop/src/core/theme/definition.rs rename to pagetop/src/api/theme/definition.rs index 130dfdac..11551680 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/api/theme/definition.rs @@ -1,7 +1,8 @@ use crate::{app, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, html}; -use crate::core::response::page::{ComponentTrait, Favicon, Page, PageAssets}; +use crate::api::component::{ComponentTrait, Favicon, PageAssets}; +use crate::response::page::Page; use crate::base::component::Chunck; use crate::util; diff --git a/pagetop/src/core/theme/mod.rs b/pagetop/src/api/theme/mod.rs similarity index 100% rename from pagetop/src/core/theme/mod.rs rename to pagetop/src/api/theme/mod.rs diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index db8af1a6..1b7564ea 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,6 +1,6 @@ use crate::{Lazy, app, base, trace}; use crate::config::SETTINGS; -use crate::core::{module, theme}; +use crate::api::{module, theme}; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; diff --git a/pagetop/src/core/mod.rs b/pagetop/src/core/mod.rs deleted file mode 100644 index 179f3e12..00000000 --- a/pagetop/src/core/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod module; // API para añadir módulos con nuevas funcionalidades. -pub mod response; // Tipos de respuestas web. -pub mod theme; // Temas predefinidos y API para crear temas. diff --git a/pagetop/src/core/module/mod.rs b/pagetop/src/core/module/mod.rs deleted file mode 100644 index d72bd48d..00000000 --- a/pagetop/src/core/module/mod.rs +++ /dev/null @@ -1,16 +0,0 @@ -mod definition; -pub use definition::{ - BaseModule, - ModuleTrait, -}; -mod extension; -pub use extension::{ - BaseExtension, - ExtensionTrait, -}; - -pub(crate) mod all; -pub use all::{ - extensions, - register_module -}; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 68c23520..fd843285 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -18,7 +18,9 @@ pub mod html; // HTML en código. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a base de datos. -pub mod core; // APIs para módulos, respuestas web y temas. +pub mod api; // Main APIs for actions, components, modules and themes. + +pub mod response; // Tipos de respuestas web. pub mod app; // Aplicación y servidor web. pub mod base; // Base de componentes, módulos y temas. pub mod util; // Macros y funciones útiles. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index d5190250..079deb63 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -16,12 +16,15 @@ pub use crate::html::*; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub use crate::{db, db::*, boxed_migration}; -pub use crate::core::{ +pub use crate::api::{ + action::*, + component::*, module::*, - response::page::*, theme::*, }; +pub use crate::response::page::*; + pub use crate::app; pub use crate::app::application::{Application, essence}; diff --git a/pagetop/src/core/response/mod.rs b/pagetop/src/response/mod.rs similarity index 100% rename from pagetop/src/core/response/mod.rs rename to pagetop/src/response/mod.rs diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs new file mode 100644 index 00000000..e3173d7f --- /dev/null +++ b/pagetop/src/response/page/action.rs @@ -0,0 +1,63 @@ +use crate::api::action::{ActionTrait, AnyAction}; +use crate::api::component::{ComponentTrait, PageAssets}; +use super::Page; + +pub enum TypeAction { + BeforeRenderPage(fn(&mut Page)), + BeforeRenderComponent(fn(&mut dyn ComponentTrait, &mut PageAssets)), + None, +} + +pub struct PageAction { + action: TypeAction, + weight: i8, +} + +impl ActionTrait for PageAction { + fn new() -> Self { + PageAction { + action: TypeAction::None, + weight: 0, + } + } + + fn weight(&self) -> i8 { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } +} + +impl PageAction { + pub fn new(action: TypeAction) -> Self { + PageAction { + action, + weight: 0, + } + } + + pub fn new_with_weight(action: TypeAction, weight: i8) -> Self { + PageAction { + action, + weight, + } + } + + pub fn before_render_page(&self, page: &mut Page) { + if let TypeAction::BeforeRenderPage(f) = self.action { + f(page) + } + } + + pub fn before_render_component( + &self, + component: &mut dyn ComponentTrait, + assets: &mut PageAssets) + { + if let TypeAction::BeforeRenderComponent(f) = self.action { + f(component, assets) + } + } +} diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs new file mode 100644 index 00000000..097bde8b --- /dev/null +++ b/pagetop/src/response/page/mod.rs @@ -0,0 +1,4 @@ +pub mod action; + +mod page; +pub use page::Page; diff --git a/pagetop/src/core/response/page/page.rs b/pagetop/src/response/page/page.rs similarity index 82% rename from pagetop/src/core/response/page/page.rs rename to pagetop/src/response/page/page.rs index c23ea9c2..b52566a8 100644 --- a/pagetop/src/core/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,14 +1,12 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::*; -use crate::core::response::page::*; +use crate::api::action::{action_ref, run_actions}; +use crate::api::component::*; -use std::sync::RwLock; use std::collections::HashMap; -static COMPONENTS: Lazy<RwLock<HashMap<&str, PageContainer>>> = Lazy::new(|| { - RwLock::new(HashMap::new()) -}); +use super::action::PageAction; static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { let language = SETTINGS.app.language[..2].to_lowercase(); @@ -65,7 +63,7 @@ impl<'a> Page<'a> { title : OptAttr::new(), description : OptAttr::new(), assets : PageAssets::new(), - regions : COMPONENTS.read().unwrap().clone(), + regions : common_components(), body_classes: Classes::new_with_default("body"), template : "default".to_owned(), } @@ -153,6 +151,12 @@ impl<'a> Page<'a> { // Page RENDER. pub fn render(&mut self) -> app::Result<Markup> { + // Acciones de los módulos antes de renderizar el tema. + run_actions( + "", + |a| action_ref::<PageAction>(&**a).before_render_page(self) + ); + // Acciones del tema antes de renderizar la página. self.assets.theme().before_render_page(self); @@ -186,26 +190,3 @@ impl<'a> Page<'a> { self } } - -pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut PageAssets) -> Markup { - component.before_render(assets); - assets.theme().before_render_component(component, assets); - match component.is_renderable() { - true => { - match assets.theme().render_component(component, assets) { - Some(html) => html, - None => component.default_render(assets) - } - }, - false => html! {} - } -} - -pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { - let mut hmap = COMPONENTS.write().unwrap(); - if let Some(regions) = hmap.get_mut(region) { - regions.add(component); - } else { - hmap.insert(region, PageContainer::new_with(component)); - } -} From 7c8f51ba86b41f65849fddbb4f4c7bab12b642e2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 4 May 2022 18:21:36 +0200 Subject: [PATCH 072/853] =?UTF-8?q?Modifica=20tipos=20num=C3=A9ricos=20por?= =?UTF-8?q?=20isize/usize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/api/action/definition.rs | 6 +++--- pagetop/src/api/component/action.rs | 6 +++--- pagetop/src/api/component/assets.rs | 16 ++++++++-------- pagetop/src/api/component/definition.rs | 6 +++--- pagetop/src/api/module/definition.rs | 4 ++-- pagetop/src/api/theme/definition.rs | 4 ++-- pagetop/src/base/component/block.rs | 8 ++++---- pagetop/src/base/component/chunck.rs | 8 ++++---- pagetop/src/base/component/container.rs | 8 ++++---- pagetop/src/base/component/form/button.rs | 8 ++++---- pagetop/src/base/component/form/date.rs | 8 ++++---- pagetop/src/base/component/form/form.rs | 8 ++++---- pagetop/src/base/component/form/hidden.rs | 8 ++++---- pagetop/src/base/component/form/input.rs | 8 ++++---- pagetop/src/base/component/grid/column.rs | 8 ++++---- pagetop/src/base/component/grid/row.rs | 8 ++++---- pagetop/src/base/component/image.rs | 8 ++++---- pagetop/src/base/component/menu.rs | 16 ++++++++-------- pagetop/src/response/page/action.rs | 6 +++--- pagetop/src/util.rs | 3 +-- 20 files changed, 77 insertions(+), 78 deletions(-) diff --git a/pagetop/src/api/action/definition.rs b/pagetop/src/api/action/definition.rs index 4a813ef9..e0bab945 100644 --- a/pagetop/src/api/action/definition.rs +++ b/pagetop/src/api/action/definition.rs @@ -7,13 +7,13 @@ pub trait BaseAction { fn single_name(&self) -> &'static str; - fn qualified_name(&self, last: u8) -> &'static str; + fn qualified_name(&self, last: usize) -> &'static str; } pub trait ActionTrait: AnyAction + BaseAction + Send + Sync { fn new() -> Self where Self: Sized; - fn weight(&self) -> i8 { + fn weight(&self) -> isize { 0 } @@ -29,7 +29,7 @@ impl<C: ?Sized + ActionTrait> BaseAction for C { util::partial_type_name(std::any::type_name::<Self>(), 1) } - fn qualified_name(&self, last: u8) -> &'static str { + fn qualified_name(&self, last: usize) -> &'static str { util::partial_type_name(std::any::type_name::<Self>(), last) } } diff --git a/pagetop/src/api/component/action.rs b/pagetop/src/api/component/action.rs index 2569be85..6479cc11 100644 --- a/pagetop/src/api/component/action.rs +++ b/pagetop/src/api/component/action.rs @@ -8,7 +8,7 @@ pub enum TypeAction { pub struct ComponentAction { action: TypeAction, - weight: i8, + weight: isize, } impl ActionTrait for ComponentAction { @@ -19,7 +19,7 @@ impl ActionTrait for ComponentAction { } } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -36,7 +36,7 @@ impl ComponentAction { } } - pub fn new_with_weight(action: TypeAction, weight: i8) -> Self { + pub fn new_with_weight(action: TypeAction, weight: isize) -> Self { ComponentAction { action, weight, diff --git a/pagetop/src/api/component/assets.rs b/pagetop/src/api/component/assets.rs index 16821ada..c7faf1bc 100644 --- a/pagetop/src/api/component/assets.rs +++ b/pagetop/src/api/component/assets.rs @@ -101,7 +101,7 @@ impl Favicon { pub struct StyleSheet { source: &'static str, - weight: i8, + weight: isize, } impl StyleSheet { pub fn source(s: &'static str) -> Self { @@ -111,12 +111,12 @@ impl StyleSheet { } } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self } - pub fn weight(self) -> i8 { + pub fn weight(self) -> isize { self.weight } @@ -134,7 +134,7 @@ pub enum JSMode { Async, Defer, Normal } pub struct JavaScript { source: &'static str, - weight: i8, + weight: isize, mode : JSMode, } impl JavaScript { @@ -146,7 +146,7 @@ impl JavaScript { } } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self } @@ -156,7 +156,7 @@ impl JavaScript { self } - pub fn weight(self) -> i8 { + pub fn weight(self) -> isize { self.weight } @@ -180,7 +180,7 @@ pub struct PageAssets { stylesheets: Vec<StyleSheet>, javascripts: Vec<JavaScript>, with_jquery: bool, - id_counter : u32, + id_counter : usize, } impl PageAssets { @@ -239,7 +239,7 @@ impl PageAssets { JavaScript::source( "/theme/js/jquery.min.js?ver=3.6.0" ) - .with_weight(i8::MIN) + .with_weight(isize::MIN) .with_mode(JSMode::Normal) ); self.with_jquery = true; diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/api/component/definition.rs index d32f1b3f..f7c1df43 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/api/component/definition.rs @@ -11,7 +11,7 @@ pub trait BaseComponent { fn single_name(&self) -> &'static str; - fn qualified_name(&self, last: u8) -> &'static str; + fn qualified_name(&self, last: usize) -> &'static str; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -30,7 +30,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { true } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { 0 } @@ -57,7 +57,7 @@ impl<C: ?Sized + ComponentTrait> BaseComponent for C { util::partial_type_name(std::any::type_name::<Self>(), 1) } - fn qualified_name(&self, last: u8) -> &'static str { + fn qualified_name(&self, last: usize) -> &'static str { util::partial_type_name(std::any::type_name::<Self>(), last) } } diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/api/module/definition.rs index 288e99bb..837304f3 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -8,7 +8,7 @@ pub trait BaseModule { fn single_name(&self) -> &'static str; - fn qualified_name(&self, last: u8) -> &'static str; + fn qualified_name(&self, last: usize) -> &'static str; } /// Los módulos deben implementar este *trait*. @@ -45,7 +45,7 @@ impl<M: ?Sized + ModuleTrait> BaseModule for M { util::partial_type_name(std::any::type_name::<Self>(), 1) } - fn qualified_name(&self, last: u8) -> &'static str { + fn qualified_name(&self, last: usize) -> &'static str { util::partial_type_name(std::any::type_name::<Self>(), last) } } diff --git a/pagetop/src/api/theme/definition.rs b/pagetop/src/api/theme/definition.rs index 11551680..08d913e6 100644 --- a/pagetop/src/api/theme/definition.rs +++ b/pagetop/src/api/theme/definition.rs @@ -11,7 +11,7 @@ pub trait BaseTheme { fn single_name(&self) -> &'static str; - fn qualified_name(&self, last: u8) -> &'static str; + fn qualified_name(&self, last: usize) -> &'static str; } /// Los temas deben implementar este "trait". @@ -147,7 +147,7 @@ impl<T: ?Sized + ThemeTrait> BaseTheme for T { util::partial_type_name(std::any::type_name::<Self>(), 1) } - fn qualified_name(&self, last: u8) -> &'static str { + fn qualified_name(&self, last: usize) -> &'static str { util::partial_type_name(std::any::type_name::<Self>(), last) } } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 96dc06b6..b1407d60 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -4,7 +4,7 @@ pub const TYPENAME_BLOCK: &str = "pagetop::base::component::block::Block"; pub struct Block { renderable: fn() -> bool, - weight : i8, + weight : isize, components: PageContainer, title : OptAttr, id : OptIden, @@ -29,7 +29,7 @@ impl ComponentTrait for Block { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -77,7 +77,7 @@ impl Block { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -109,7 +109,7 @@ impl Block { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 902b1eef..26666344 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -4,7 +4,7 @@ pub const TYPENAME_CHUNCK: &str = "pagetop::base::component::chunck::Chunck"; pub struct Chunck { renderable: fn() -> bool, - weight : i8, + weight : isize, html : Markup, template : String, } @@ -23,7 +23,7 @@ impl ComponentTrait for Chunck { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -52,7 +52,7 @@ impl Chunck { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -74,7 +74,7 @@ impl Chunck { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 2bfbc3e0..dbc58ce6 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -6,7 +6,7 @@ pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { renderable : fn() -> bool, - weight : i8, + weight : isize, components : PageContainer, container : ContainerType, id : OptIden, @@ -33,7 +33,7 @@ impl ComponentTrait for Container { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -127,7 +127,7 @@ impl Container { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -159,7 +159,7 @@ impl Container { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 783adbc6..16720106 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -6,7 +6,7 @@ pub enum ButtonType {Button, Reset, Submit} pub struct Button { renderable : fn() -> bool, - weight : i8, + weight : isize, button_type: ButtonType, name : OptAttr, value : OptAttr, @@ -36,7 +36,7 @@ impl ComponentTrait for Button { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -105,7 +105,7 @@ impl Button { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -147,7 +147,7 @@ impl Button { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 7ef3f82d..741ac450 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -4,7 +4,7 @@ pub const TYPENAME_DATE: &str = "pagetop::base::component::form::date::Date"; pub struct Date { renderable : fn() -> bool, - weight : i8, + weight : isize, name : OptAttr, value : OptAttr, label : OptAttr, @@ -44,7 +44,7 @@ impl ComponentTrait for Date { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -105,7 +105,7 @@ impl Date { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -177,7 +177,7 @@ impl Date { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index e6b10261..0ddb99eb 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -6,7 +6,7 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, - weight : i8, + weight : isize, elements : PageContainer, action : OptAttr, charset : OptAttr, @@ -35,7 +35,7 @@ impl ComponentTrait for Form { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -86,7 +86,7 @@ impl Form { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -128,7 +128,7 @@ impl Form { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 3e9b41f3..4df5fd4f 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub const TYPENAME_HIDDEN: &str = "pagetop::base::component::form::hidden::Hidden"; pub struct Hidden { - weight: i8, + weight: isize, name : OptIden, value : OptAttr, } @@ -17,7 +17,7 @@ impl ComponentTrait for Hidden { } } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -47,7 +47,7 @@ impl Hidden { // Hidden BUILDER. - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -64,7 +64,7 @@ impl Hidden { // Hidden ALTER. - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 7a45ce21..573ddebf 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -6,7 +6,7 @@ pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} pub struct Input { renderable : fn() -> bool, - weight : i8, + weight : isize, input_type : InputType, name : OptIden, value : OptAttr, @@ -54,7 +54,7 @@ impl ComponentTrait for Input { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -171,7 +171,7 @@ impl Input { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -258,7 +258,7 @@ impl Input { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index b4121549..add535e3 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -4,7 +4,7 @@ pub const TYPENAME_COLUMN: &str = "pagetop::base::component::grid::column::Colum pub struct Column { renderable: fn() -> bool, - weight : i8, + weight : isize, components: PageContainer, id : OptIden, classes : Classes, @@ -27,7 +27,7 @@ impl ComponentTrait for Column { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -68,7 +68,7 @@ impl Column { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -95,7 +95,7 @@ impl Column { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 8077fec6..d8a8858a 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -4,7 +4,7 @@ pub const TYPENAME_ROW: &str = "pagetop::base::component::grid::row::Row"; pub struct Row { renderable: fn() -> bool, - weight : i8, + weight : isize, columns : PageContainer, id : OptIden, classes : Classes, @@ -27,7 +27,7 @@ impl ComponentTrait for Row { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -68,7 +68,7 @@ impl Row { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -95,7 +95,7 @@ impl Row { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index b88ead07..ee92215a 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -4,7 +4,7 @@ pub const TYPENAME_IMAGE: &str = "pagetop::base::component::image::Image"; pub struct Image { renderable: fn() -> bool, - weight : i8, + weight : isize, source : OptAttr, id : OptIden, classes : Classes, @@ -27,7 +27,7 @@ impl ComponentTrait for Image { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -61,7 +61,7 @@ impl Image { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -93,7 +93,7 @@ impl Image { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 845284f9..f0bd2a40 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -17,7 +17,7 @@ pub enum MenuItemType { pub struct MenuItem { renderable: fn() -> bool, - weight : i8, + weight : isize, item_type : MenuItemType, } @@ -34,7 +34,7 @@ impl ComponentTrait for MenuItem { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -143,7 +143,7 @@ impl MenuItem { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -155,7 +155,7 @@ impl MenuItem { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } @@ -171,7 +171,7 @@ impl MenuItem { pub struct Menu { renderable: fn() -> bool, - weight : i8, + weight : isize, items : PageContainer, id : OptIden, classes : Classes, @@ -194,7 +194,7 @@ impl ComponentTrait for Menu { (self.renderable)() } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -254,7 +254,7 @@ impl Menu { self } - pub fn with_weight(mut self, weight: i8) -> Self { + pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } @@ -281,7 +281,7 @@ impl Menu { self } - pub fn alter_weight(&mut self, weight: i8) -> &mut Self { + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index e3173d7f..e90f05be 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -10,7 +10,7 @@ pub enum TypeAction { pub struct PageAction { action: TypeAction, - weight: i8, + weight: isize, } impl ActionTrait for PageAction { @@ -21,7 +21,7 @@ impl ActionTrait for PageAction { } } - fn weight(&self) -> i8 { + fn weight(&self) -> isize { self.weight } @@ -38,7 +38,7 @@ impl PageAction { } } - pub fn new_with_weight(action: TypeAction, weight: i8) -> Self { + pub fn new_with_weight(action: TypeAction, weight: isize) -> Self { PageAction { action, weight, diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 3190b641..ca4a96fc 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -47,12 +47,11 @@ macro_rules! theme_static_files { }}; } -pub(crate) fn partial_type_name(type_name: &'static str, last: u8) -> &'static str { +pub(crate) fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { if last == 0 { return type_name; } let positions: Vec<_> = type_name.rmatch_indices("::").collect(); - let last: usize = last as usize; if positions.len() < last { return type_name; } From 67ddb8d8992219d4e886052c455f7709fcee20f7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 5 May 2022 21:43:00 +0200 Subject: [PATCH 073/853] =?UTF-8?q?Mejora=20y=20simplifica=20la=20gesti?= =?UTF-8?q?=C3=B3n=20global=20de=20acciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- pagetop-admin/src/lib.rs | 10 ++++ pagetop-node/src/lib.rs | 20 +++++-- ...m20220316_000001_create_table_node_type.rs | 8 +-- .../m20220316_000002_create_table_node.rs | 8 +-- ...0220316_000003_create_table_node_access.rs | 8 +-- ...20316_000004_create_table_node_revision.rs | 8 +-- pagetop-user/src/lib.rs | 10 ++-- .../m20220312_000001_create_table_role.rs | 8 +-- ...312_000002_create_table_role_permission.rs | 8 +-- .../m20220312_000003_create_table_user.rs | 8 +-- ...m20220312_000004_create_table_user_role.rs | 8 +-- pagetop/src/api/action/all.rs | 14 +++-- pagetop/src/api/action/definition.rs | 30 ++-------- pagetop/src/api/action/holder.rs | 22 ++++++-- pagetop/src/api/action/mod.rs | 7 ++- pagetop/src/api/component/action.rs | 47 +++++++--------- pagetop/src/api/component/definition.rs | 6 +- pagetop/src/api/component/mod.rs | 6 +- pagetop/src/api/module/all.rs | 13 ++++- pagetop/src/api/module/definition.rs | 9 ++- pagetop/src/app/application.rs | 15 +++-- pagetop/src/db.rs | 17 +++++- pagetop/src/html/classes.rs | 2 +- pagetop/src/prelude.rs | 14 +++-- pagetop/src/response/page/action.rs | 55 +++++++------------ pagetop/src/response/page/mod.rs | 6 +- pagetop/src/response/page/page.rs | 8 +-- pagetop/src/util.rs | 13 +---- 29 files changed, 184 insertions(+), 206 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 9da7b124..27bb0886 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -8,5 +8,5 @@ fn bootstrap() { #[actix_web::main] async fn main() -> std::io::Result<()> { - Application::prepare(bootstrap).await?.run()?.await + Application::prepare(UsingBootstrap::Fn(bootstrap)).await?.run()?.await } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index c07f617b..56d34e1c 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -21,4 +21,14 @@ impl ModuleTrait for Admin { .route("", app::web::get().to(summary::summary)) ); } + + fn actions(&self) -> Vec<ActionItem> { + vec![ + action_item!(ActionBeforeRenderPage => before_render_page) + ] + } +} + +fn before_render_page(page: &mut Page) { + page.alter_body_classes("test-admin", ClassesOp::Add); } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index c9e2dcda..1f879f36 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -20,12 +20,18 @@ impl ModuleTrait for Node { cfg.route("/node", app::web::get().to(node)); } - fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { + fn actions(&self) -> Vec<ActionItem> { vec![ - boxed_migration!(m20220316_000001_create_table_node_type), - boxed_migration!(m20220316_000002_create_table_node), - boxed_migration!(m20220316_000003_create_table_node_access), - boxed_migration!(m20220316_000004_create_table_node_revision), + action_item!(ActionBeforeRenderPage => before_render_page, -1) + ] + } + + fn migrations(&self) -> Vec<MigrationItem> { + vec![ + migration_item!(m20220316_000001_create_table_node_type), + migration_item!(m20220316_000002_create_table_node), + migration_item!(m20220316_000003_create_table_node_access), + migration_item!(m20220316_000004_create_table_node_revision), ] } } @@ -37,3 +43,7 @@ async fn node() -> app::Result<Markup> { ) .render() } + +fn before_render_page(page: &mut Page) { + page.alter_body_classes("test-node", ClassesOp::Add); +} diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 50117825..9065836a 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -19,7 +19,7 @@ enum NodeType { // different from the current type name if the locked field is 0. } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -82,9 +82,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index 62e2bda1..1c8d7b12 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -26,7 +26,7 @@ enum Node { Translate, // A boolean indicating whether this translation page needs to be updated. } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -105,9 +105,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index 140dac2d..3fa19d66 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -18,7 +18,7 @@ enum NodeAccess { // this node. } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -65,9 +65,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 0009359f..621628a6 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -20,7 +20,7 @@ enum NodeRevision { // be displayed at the top of lists in which it appears. } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -83,9 +83,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index bbbf01f3..a36c0e6f 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -19,12 +19,12 @@ impl ModuleTrait for User { cfg.route("/user/login", app::web::get().to(login)); } - fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { + fn migrations(&self) -> Vec<MigrationItem> { vec![ - boxed_migration!(m20220312_000001_create_table_role), - boxed_migration!(m20220312_000002_create_table_role_permission), - boxed_migration!(m20220312_000003_create_table_user), - boxed_migration!(m20220312_000004_create_table_user_role), + migration_item!(m20220312_000001_create_table_role), + migration_item!(m20220312_000002_create_table_role_permission), + migration_item!(m20220312_000003_create_table_user), + migration_item!(m20220312_000004_create_table_user_role), ] } } diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index 2557453f..649115ac 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -9,7 +9,7 @@ enum Role { Weight, // The weight of this role in listings and the user interface. } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -62,9 +62,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index 052fed2c..7869f029 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -11,7 +11,7 @@ enum RolePermission { #[derive(Iden)] enum Role { Table, Rid, /* ... */ } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -56,9 +56,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index c060c8a5..ed3d85f7 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -16,7 +16,7 @@ enum User { Timezone, // User's time zone. } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -77,9 +77,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index fedcd4be..cae74e3e 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -14,7 +14,7 @@ enum User { Table, Uid, /* ... */ } #[derive(Iden)] enum Role { Table, Rid, /* ... */ } -pub struct Migration; +pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { @@ -62,9 +62,3 @@ impl MigrationTrait for Migration { .await } } - -impl MigrationName for Migration { - fn name(&self) -> &str { - module_name!() - } -} diff --git a/pagetop/src/api/action/all.rs b/pagetop/src/api/action/all.rs index e7a4981f..8003d09e 100644 --- a/pagetop/src/api/action/all.rs +++ b/pagetop/src/api/action/all.rs @@ -1,5 +1,5 @@ use crate::Lazy; -use super::{ActionItem, ActionsHolder, ActionTrait}; +use super::{ActionItem, ActionsHolder}; use std::sync::RwLock; use std::collections::HashMap; @@ -9,9 +9,9 @@ static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); -pub fn register_action(action: impl ActionTrait) { +pub fn add_action(action: ActionItem) { let mut hmap = ACTIONS.write().unwrap(); - let action_name = action.type_name(); + let action_name = action.machine_name(); if let Some(actions) = hmap.get_mut(action_name) { actions.add(action); } else { @@ -19,9 +19,11 @@ pub fn register_action(action: impl ActionTrait) { } } -pub fn run_actions<B, F>(type_name: &'static str, f: F) where F: FnMut(&ActionItem) -> B { - let hmap = ACTIONS.read().unwrap(); - if let Some(actions) = hmap.get(type_name) { +pub fn run_actions<B, F>(machine_name: &'static str, f: F) +where + F: FnMut(&ActionItem) -> B +{ + if let Some(actions) = ACTIONS.read().unwrap().get(machine_name) { actions.iter_map(f) } } diff --git a/pagetop/src/api/action/definition.rs b/pagetop/src/api/action/definition.rs index e0bab945..1bd554df 100644 --- a/pagetop/src/api/action/definition.rs +++ b/pagetop/src/api/action/definition.rs @@ -1,18 +1,12 @@ -use crate::util; - pub use std::any::Any as AnyAction; -pub trait BaseAction { - fn type_name(&self) -> &'static str; - - fn single_name(&self) -> &'static str; - - fn qualified_name(&self, last: usize) -> &'static str; -} - -pub trait ActionTrait: AnyAction + BaseAction + Send + Sync { +pub trait ActionTrait: AnyAction + Send + Sync { fn new() -> Self where Self: Sized; + fn machine_name(&self) -> &'static str { + std::any::type_name::<Self>() + } + fn weight(&self) -> isize { 0 } @@ -20,20 +14,6 @@ pub trait ActionTrait: AnyAction + BaseAction + Send + Sync { fn as_ref_any(&self) -> &dyn AnyAction; } -impl<C: ?Sized + ActionTrait> BaseAction for C { - fn type_name(&self) -> &'static str { - std::any::type_name::<Self>() - } - - fn single_name(&self) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), 1) - } - - fn qualified_name(&self, last: usize) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), last) - } -} - pub fn action_ref<A: 'static>(action: &dyn ActionTrait) -> &A { action.as_ref_any().downcast_ref::<A>().unwrap() } diff --git a/pagetop/src/api/action/holder.rs b/pagetop/src/api/action/holder.rs index c7dd3ef3..ab3e2405 100644 --- a/pagetop/src/api/action/holder.rs +++ b/pagetop/src/api/action/holder.rs @@ -4,7 +4,13 @@ use std::sync::{Arc, RwLock}; pub type ActionItem = Box<dyn ActionTrait>; -#[derive(Clone)] +#[macro_export] +macro_rules! action_item { + ( $action:ident => $f:ident $(, $weight:expr)? ) => {{ + Box::new($action::new().with_action($f)$(.with_weight($weight))?) + }}; +} + pub struct ActionsHolder(Arc<RwLock<Vec<ActionItem>>>); impl ActionsHolder { @@ -12,19 +18,23 @@ impl ActionsHolder { ActionsHolder(Arc::new(RwLock::new(Vec::new()))) } - pub fn new_with(action: impl ActionTrait) -> Self { + pub fn new_with(action: ActionItem) -> Self { let mut container = ActionsHolder::new(); container.add(action); container } - pub fn add(&mut self, action: impl ActionTrait) { + pub fn add(&mut self, action: ActionItem) { let mut actions = self.0.write().unwrap(); - actions.push(Box::new(action)); + actions.push(action); actions.sort_by_key(|a| a.weight()); } - pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&ActionItem) -> B { - let _ = self.0.read().unwrap().iter().map(f); + pub fn iter_map<B, F>(&self, f: F) + where + Self: Sized, + F: FnMut(&ActionItem) -> B, + { + let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); } } diff --git a/pagetop/src/api/action/mod.rs b/pagetop/src/api/action/mod.rs index e28122e0..78eec705 100644 --- a/pagetop/src/api/action/mod.rs +++ b/pagetop/src/api/action/mod.rs @@ -2,18 +2,21 @@ mod definition; pub use definition::{ ActionTrait, AnyAction, - BaseAction, action_ref, }; mod holder; pub use holder::{ ActionItem, +}; +pub(crate) use holder::{ ActionsHolder, }; mod all; pub use all::{ - register_action, run_actions, }; +pub(crate) use all::{ + add_action, +}; diff --git a/pagetop/src/api/component/action.rs b/pagetop/src/api/component/action.rs index 6479cc11..34f1cc57 100644 --- a/pagetop/src/api/component/action.rs +++ b/pagetop/src/api/component/action.rs @@ -1,24 +1,25 @@ use crate::api::action::{ActionTrait, AnyAction}; use super::{ComponentTrait, PageAssets}; -pub enum TypeAction { - BeforeRenderComponent(fn(&mut dyn ComponentTrait, &mut PageAssets)), - None, -} +pub const ACTION_BEFORE_RENDER_COMPONENT: &str = "pagetop::render::before_render_component"; -pub struct ComponentAction { - action: TypeAction, +pub struct ActionBeforeRenderComponent { + action: Option<fn(&mut dyn ComponentTrait, &mut PageAssets)>, weight: isize, } -impl ActionTrait for ComponentAction { +impl ActionTrait for ActionBeforeRenderComponent { fn new() -> Self { - ComponentAction { - action: TypeAction::None, + ActionBeforeRenderComponent { + action: None, weight: 0, } } + fn machine_name(&self) -> &'static str { + ACTION_BEFORE_RENDER_COMPONENT + } + fn weight(&self) -> isize { self.weight } @@ -28,28 +29,20 @@ impl ActionTrait for ComponentAction { } } -impl ComponentAction { - pub fn new(action: TypeAction) -> Self { - ComponentAction { - action, - weight: 0, - } +impl ActionBeforeRenderComponent { + pub fn with_action(mut self, action: fn(&mut dyn ComponentTrait, &mut PageAssets)) -> Self { + self.action = Some(action); + self } - pub fn new_with_weight(action: TypeAction, weight: isize) -> Self { - ComponentAction { - action, - weight, - } + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self } - pub fn before_render_component( - &self, - component: &mut dyn ComponentTrait, - assets: &mut PageAssets) - { - if let TypeAction::BeforeRenderComponent(f) = self.action { - f(component, assets) + pub fn run(&self, component: &mut dyn ComponentTrait, assets: &mut PageAssets) { + if let Some(action) = self.action { + action(component, assets) } } } diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/api/component/definition.rs index f7c1df43..a6b2ea7c 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/api/component/definition.rs @@ -2,7 +2,7 @@ use crate::html::{Markup, html}; use crate::util; use crate::api::action::{action_ref, run_actions}; use super::PageAssets; -use super::action::ComponentAction; +use super::{ACTION_BEFORE_RENDER_COMPONENT, ActionBeforeRenderComponent}; pub use std::any::Any as AnyComponent; @@ -76,8 +76,8 @@ pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut PageAss // Acciones de los módulos antes de renderizar el componente. run_actions( - "", - |a| action_ref::<ComponentAction>(&**a).before_render_component(component, assets) + ACTION_BEFORE_RENDER_COMPONENT, + |a| action_ref::<ActionBeforeRenderComponent>(&**a).run(component, assets) ); // Acciones del tema antes de renderizar el componente. diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/api/component/mod.rs index 7c9482c6..1203d1b2 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -1,4 +1,8 @@ -pub mod action; +mod action; +pub use action::{ + ACTION_BEFORE_RENDER_COMPONENT, + ActionBeforeRenderComponent, +}; mod assets; pub use assets::{ diff --git a/pagetop/src/api/module/all.rs b/pagetop/src/api/module/all.rs index 56e1d6c4..3d5d9a77 100644 --- a/pagetop/src/api/module/all.rs +++ b/pagetop/src/api/module/all.rs @@ -1,4 +1,5 @@ use crate::{Lazy, app, run_now, trace}; +use crate::api::action::add_action; use crate::db::*; use super::ModuleTrait; @@ -37,12 +38,20 @@ pub fn modules(cfg: &mut app::web::ServiceConfig) { } } +pub fn register_actions() { + for m in MODULES.read().unwrap().iter() { + for a in m.actions().into_iter() { + add_action(a); + } + } +} + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub fn migrations() { +pub fn run_migrations() { run_now({ struct Migrator; impl MigratorTrait for Migrator { - fn migrations() -> Vec<Box<dyn MigrationTrait>> { + fn migrations() -> Vec<MigrationItem> { let mut migrations = vec![]; for m in MODULES.read().unwrap().iter() { migrations.append(&mut m.migrations()); diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/api/module/definition.rs index 837304f3..eb07350c 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -1,7 +1,8 @@ use crate::{app, util}; +use crate::api::action::ActionItem; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -use crate::db; +use crate::db::MigrationItem; pub trait BaseModule { fn type_name(&self) -> &'static str; @@ -25,9 +26,13 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { } + fn actions(&self) -> Vec<ActionItem> { + vec![] + } + #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[allow(unused_variables)] - fn migrations(&self) -> Vec<Box<dyn db::MigrationTrait>> { + fn migrations(&self) -> Vec<MigrationItem> { vec![] } diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 1b7564ea..98a49f80 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -9,12 +9,10 @@ pub struct Application { server: app::Server, } -pub fn essence() { - trace::info!("No bootstrap configured"); -} +pub enum UsingBootstrap {Fn(fn()), No} impl Application { - pub async fn prepare(bootstrap: fn()) -> Result<Self, Error> { + pub async fn prepare(bootstrap: UsingBootstrap) -> Result<Self, Error> { // Rótulo de presentación. app::banner::print_on_startup(); @@ -36,15 +34,20 @@ impl Application { // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); - let _ = &bootstrap(); + if let UsingBootstrap::Fn(bootstrap) = bootstrap { + let _ = &bootstrap(); + } // Registra el módulo de presentación de PageTop. // Normalmente se sobrecargará en la función de inicio. module::register_module(&base::module::demopage::Demopage); + // Registra las acciones de todos los módulos. + module::all::register_actions(); + // Actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - module::all::migrations(); + module::all::run_migrations(); // Prepara el servidor web. let server = app::HttpServer::new(move || { diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 4b35bd59..d350043e 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -4,8 +4,23 @@ pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; pub use sea_schema::migration::prelude::*; +pub type MigrationItem = Box<dyn MigrationTrait>; + #[macro_export] -macro_rules! boxed_migration { +macro_rules! pub_migration { + ( $migration:ident ) => { + pub struct $migration; + + impl MigrationName for $migration { + fn name(&self) -> &str { + crate::util::partial_type_name(module_path!(), 1) + } + } + }; +} + +#[macro_export] +macro_rules! migration_item { ( $migration_module:ident ) => {{ Box::new(migration::$migration_module::Migration) }}; diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 225d6537..740d1f89 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -72,7 +72,7 @@ impl Classes { ClassesOp::SetDefault => self.default = classes.to_owned(), } - self.option = Some(concat_string!(self.default, " ", self.added).trim().to_owned()); + self.option = Some(concat_string!(self.default, " ", self.added.trim()).to_owned()); self } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 079deb63..357c31cf 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -4,7 +4,6 @@ pub use crate::{ args, concat_string, - module_name, theme_static_files, }; @@ -14,19 +13,24 @@ pub use crate::localize; pub use crate::html::*; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub use crate::{db, db::*, boxed_migration}; +pub use crate::{ + db, + db::*, + pub_migration, + migration_item, +}; -pub use crate::api::{ +pub use crate::{action_item, api::{ action::*, component::*, module::*, theme::*, -}; +}}; pub use crate::response::page::*; pub use crate::app; -pub use crate::app::application::{Application, essence}; +pub use crate::app::application::{Application, UsingBootstrap}; pub use crate::base::component::*; diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index e90f05be..d47b5ca6 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -1,26 +1,25 @@ use crate::api::action::{ActionTrait, AnyAction}; -use crate::api::component::{ComponentTrait, PageAssets}; use super::Page; -pub enum TypeAction { - BeforeRenderPage(fn(&mut Page)), - BeforeRenderComponent(fn(&mut dyn ComponentTrait, &mut PageAssets)), - None, -} +pub const ACTION_BEFORE_RENDER_PAGE: &str = "pagetop::render::before_render_page"; -pub struct PageAction { - action: TypeAction, +pub struct ActionBeforeRenderPage { + action: Option<fn(&mut Page)>, weight: isize, } -impl ActionTrait for PageAction { +impl ActionTrait for ActionBeforeRenderPage { fn new() -> Self { - PageAction { - action: TypeAction::None, + ActionBeforeRenderPage { + action: None, weight: 0, } } + fn machine_name(&self) -> &'static str { + ACTION_BEFORE_RENDER_PAGE + } + fn weight(&self) -> isize { self.weight } @@ -30,34 +29,20 @@ impl ActionTrait for PageAction { } } -impl PageAction { - pub fn new(action: TypeAction) -> Self { - PageAction { - action, - weight: 0, - } +impl ActionBeforeRenderPage { + pub fn with_action(mut self, action: fn(&mut Page)) -> Self { + self.action = Some(action); + self } - pub fn new_with_weight(action: TypeAction, weight: isize) -> Self { - PageAction { - action, - weight, - } + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self } - pub fn before_render_page(&self, page: &mut Page) { - if let TypeAction::BeforeRenderPage(f) = self.action { - f(page) - } - } - - pub fn before_render_component( - &self, - component: &mut dyn ComponentTrait, - assets: &mut PageAssets) - { - if let TypeAction::BeforeRenderComponent(f) = self.action { - f(component, assets) + pub fn run(&self, page: &mut Page) { + if let Some(action) = self.action { + action(page) } } } diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 097bde8b..3d8194f2 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -1,4 +1,8 @@ -pub mod action; +mod action; +pub use action::{ + ACTION_BEFORE_RENDER_PAGE, + ActionBeforeRenderPage, +}; mod page; pub use page::Page; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index b52566a8..13944810 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -6,7 +6,7 @@ use crate::api::component::*; use std::collections::HashMap; -use super::action::PageAction; +use super::{ACTION_BEFORE_RENDER_PAGE, ActionBeforeRenderPage}; static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { let language = SETTINGS.app.language[..2].to_lowercase(); @@ -151,10 +151,10 @@ impl<'a> Page<'a> { // Page RENDER. pub fn render(&mut self) -> app::Result<Markup> { - // Acciones de los módulos antes de renderizar el tema. + // Acciones de los módulos antes de renderizar la página. run_actions( - "", - |a| action_ref::<PageAction>(&**a).before_render_page(self) + ACTION_BEFORE_RENDER_PAGE, + |a| action_ref::<ActionBeforeRenderPage>(&**a).run(self) ); // Acciones del tema antes de renderizar la página. diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index ca4a96fc..f87b67fc 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -18,17 +18,6 @@ macro_rules! args { }}; } -#[macro_export] -macro_rules! module_name { - () => {{ - let name = module_path!(); - match name.rfind("::") { - Some(position) => &name[(position + 2)..], - None => name - } - }}; -} - #[macro_export] macro_rules! theme_static_files { ( $cfg:ident, $dir:expr ) => {{ @@ -47,7 +36,7 @@ macro_rules! theme_static_files { }}; } -pub(crate) fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { +pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { if last == 0 { return type_name; } From d8b2e3089cc15e7bf1295d0b020442b14c010ad7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 5 May 2022 21:45:36 +0200 Subject: [PATCH 074/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 003bde82..36215a52 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From c2b69fa539f14fff213702294bec0937d7fd2641 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 5 May 2022 23:23:47 +0200 Subject: [PATCH 075/853] =?UTF-8?q?Actualiza=20nomenclatura=20en=20c=C3=B3?= =?UTF-8?q?digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 26 ++++++++++++------------- pagetop/src/api/component/container.rs | 4 ++-- pagetop/src/api/component/definition.rs | 4 ++-- pagetop/src/api/module/all.rs | 2 +- pagetop/src/api/module/definition.rs | 2 +- pagetop/src/base/module/demopage/mod.rs | 2 +- pagetop/src/response/page/page.rs | 3 +-- 9 files changed, 23 insertions(+), 24 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 56d34e1c..5ca91531 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -15,7 +15,7 @@ impl ModuleTrait for Admin { Some(l("module_description")) } - fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { cfg.service( app::web::scope("/admin") .route("", app::web::get().to(summary::summary)) diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 1f879f36..3f8bff18 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -16,7 +16,7 @@ impl ModuleTrait for Node { Some(l("module_description")) } - fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { cfg.route("/node", app::web::get().to(node)); } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index a36c0e6f..557ecdac 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -15,7 +15,7 @@ impl ModuleTrait for User { Some(l("module_description")) } - fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { cfg.route("/user/login", app::web::get().to(login)); } @@ -29,6 +29,18 @@ impl ModuleTrait for User { } } +async fn login() -> app::Result<Markup> { + Page::new() + .with_title( + "Identificación del usuario" + ) + .add_to("content", Container::new() + .with_id("welcome") + .add(form_login()) + ) + .render() +} + fn form_login() -> Form { Form::new() .with_id("user-login") @@ -47,15 +59,3 @@ fn form_login() -> Form { ) .add(form::Button::submit(l("login").as_str())) } - -async fn login() -> app::Result<Markup> { - Page::new() - .with_title( - "Identificación del usuario" - ) - .add_to("content", Container::new() - .with_id("welcome") - .add(form_login()) - ) - .render() -} diff --git a/pagetop/src/api/component/container.rs b/pagetop/src/api/component/container.rs index 5ca41056..5008a94d 100644 --- a/pagetop/src/api/component/container.rs +++ b/pagetop/src/api/component/container.rs @@ -1,5 +1,5 @@ use crate::html::{Markup, html}; -use super::{PageAssets, ComponentTrait, render_component}; +use super::{ComponentTrait, PageAssets}; use std::sync::{Arc, RwLock}; @@ -26,7 +26,7 @@ impl PageContainer { components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (render_component(&mut *c.write().unwrap(), assets)) + (super::render_component(&mut *c.write().unwrap(), assets)) } } } diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/api/component/definition.rs index a6b2ea7c..a7e6decb 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/api/component/definition.rs @@ -1,8 +1,8 @@ use crate::html::{Markup, html}; -use crate::util; use crate::api::action::{action_ref, run_actions}; -use super::PageAssets; +use crate::util; use super::{ACTION_BEFORE_RENDER_COMPONENT, ActionBeforeRenderComponent}; +use super::PageAssets; pub use std::any::Any as AnyComponent; diff --git a/pagetop/src/api/module/all.rs b/pagetop/src/api/module/all.rs index 3d5d9a77..6c7948de 100644 --- a/pagetop/src/api/module/all.rs +++ b/pagetop/src/api/module/all.rs @@ -34,7 +34,7 @@ fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { pub fn modules(cfg: &mut app::web::ServiceConfig) { for m in MODULES.read().unwrap().iter() { - m.configure_module(cfg); + m.configure_service(cfg); } } diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/api/module/definition.rs index eb07350c..d1c213e3 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -23,7 +23,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { } #[allow(unused_variables)] - fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { } fn actions(&self) -> Vec<ActionItem> { diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 34ac79b7..55ed6d56 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -13,7 +13,7 @@ impl ModuleTrait for Demopage { Some(l("module_description")) } - fn configure_module(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { cfg.route("/", app::web::get().to(demo)); } } diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 13944810..206224ec 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -3,11 +3,10 @@ use crate::config::SETTINGS; use crate::html::*; use crate::api::action::{action_ref, run_actions}; use crate::api::component::*; +use super::{ACTION_BEFORE_RENDER_PAGE, ActionBeforeRenderPage}; use std::collections::HashMap; -use super::{ACTION_BEFORE_RENDER_PAGE, ActionBeforeRenderPage}; - static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { let language = SETTINGS.app.language[..2].to_lowercase(); if !language.is_empty() { From d53408c6b60cfe8d381b370be3e2ae197f90c148 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 6 May 2022 00:27:21 +0200 Subject: [PATCH 076/853] Modifica PageContainer para ser ComponentsHolder --- pagetop/src/api/action/mod.rs | 2 +- pagetop/src/api/component/all.rs | 8 ++++---- pagetop/src/api/component/{container.rs => holder.rs} | 8 ++++---- pagetop/src/api/component/mod.rs | 10 +++++++--- pagetop/src/base/component/block.rs | 6 +++--- pagetop/src/base/component/container.rs | 6 +++--- pagetop/src/base/component/form/form.rs | 6 +++--- pagetop/src/base/component/grid/column.rs | 6 +++--- pagetop/src/base/component/grid/row.rs | 6 +++--- pagetop/src/base/component/menu.rs | 6 +++--- pagetop/src/response/page/page.rs | 4 ++-- 11 files changed, 36 insertions(+), 32 deletions(-) rename pagetop/src/api/component/{container.rs => holder.rs} (80%) diff --git a/pagetop/src/api/action/mod.rs b/pagetop/src/api/action/mod.rs index 78eec705..59310a8a 100644 --- a/pagetop/src/api/action/mod.rs +++ b/pagetop/src/api/action/mod.rs @@ -9,7 +9,7 @@ mod holder; pub use holder::{ ActionItem, }; -pub(crate) use holder::{ +use holder::{ ActionsHolder, }; diff --git a/pagetop/src/api/component/all.rs b/pagetop/src/api/component/all.rs index 6ba66752..82573f59 100644 --- a/pagetop/src/api/component/all.rs +++ b/pagetop/src/api/component/all.rs @@ -1,10 +1,10 @@ use crate::Lazy; -use super::{ComponentTrait, PageContainer}; +use super::{ComponentsHolder, ComponentTrait}; use std::sync::RwLock; use std::collections::HashMap; -static COMPONENTS: Lazy<RwLock<HashMap<&str, PageContainer>>> = Lazy::new(|| { +static COMPONENTS: Lazy<RwLock<HashMap<&str, ComponentsHolder>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); @@ -13,10 +13,10 @@ pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { if let Some(regions) = hmap.get_mut(region) { regions.add(component); } else { - hmap.insert(region, PageContainer::new_with(component)); + hmap.insert(region, ComponentsHolder::new_with(component)); } } -pub fn common_components() -> HashMap<&'static str, PageContainer> { +pub fn common_components() -> HashMap<&'static str, ComponentsHolder> { COMPONENTS.read().unwrap().clone() } diff --git a/pagetop/src/api/component/container.rs b/pagetop/src/api/component/holder.rs similarity index 80% rename from pagetop/src/api/component/container.rs rename to pagetop/src/api/component/holder.rs index 5008a94d..b3fa54e8 100644 --- a/pagetop/src/api/component/container.rs +++ b/pagetop/src/api/component/holder.rs @@ -4,15 +4,15 @@ use super::{ComponentTrait, PageAssets}; use std::sync::{Arc, RwLock}; #[derive(Clone)] -pub struct PageContainer(Vec<Arc<RwLock<dyn ComponentTrait>>>); +pub struct ComponentsHolder(Vec<Arc<RwLock<dyn ComponentTrait>>>); -impl PageContainer { +impl ComponentsHolder { pub fn new() -> Self { - PageContainer(Vec::new()) + ComponentsHolder(Vec::new()) } pub fn new_with(component: impl ComponentTrait) -> Self { - let mut container = PageContainer::new(); + let mut container = ComponentsHolder::new(); container.add(component); container } diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/api/component/mod.rs index 1203d1b2..3faac016 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -20,10 +20,14 @@ pub use definition::{ component_ref, component_mut, }; -use definition::render_component; +use definition::{ + render_component, +}; -mod container; -pub use container::PageContainer; +mod holder; +pub use holder::{ + ComponentsHolder, +}; mod all; pub use all::{ diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b1407d60..d0b4ad7a 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -5,7 +5,7 @@ pub const TYPENAME_BLOCK: &str = "pagetop::base::component::block::Block"; pub struct Block { renderable: fn() -> bool, weight : isize, - components: PageContainer, + components: ComponentsHolder, title : OptAttr, id : OptIden, classes : Classes, @@ -17,7 +17,7 @@ impl ComponentTrait for Block { Block { renderable: render_always, weight : 0, - components: PageContainer::new(), + components: ComponentsHolder::new(), title : OptAttr::new(), id : OptIden::new(), classes : Classes::new_with_default("block"), @@ -66,7 +66,7 @@ impl Block { self } - pub fn components(&self) -> &PageContainer { + pub fn components(&self) -> &ComponentsHolder { &self.components } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index dbc58ce6..5c64b14e 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -7,7 +7,7 @@ pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { renderable : fn() -> bool, weight : isize, - components : PageContainer, + components : ComponentsHolder, container : ContainerType, id : OptIden, classes : Classes, @@ -20,7 +20,7 @@ impl ComponentTrait for Container { Container { renderable : render_always, weight : 0, - components : PageContainer::new(), + components : ComponentsHolder::new(), container : ContainerType::Wrapper, id : OptIden::new(), classes : Classes::new_with_default("container"), @@ -116,7 +116,7 @@ impl Container { self } - pub fn components(&self) -> &PageContainer { + pub fn components(&self) -> &ComponentsHolder { &self.components } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 0ddb99eb..2f4fa609 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -7,7 +7,7 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, weight : isize, - elements : PageContainer, + elements : ComponentsHolder, action : OptAttr, charset : OptAttr, method : FormMethod, @@ -21,7 +21,7 @@ impl ComponentTrait for Form { Form { renderable: render_always, weight : 0, - elements : PageContainer::new(), + elements : ComponentsHolder::new(), action : OptAttr::new(), charset : OptAttr::new_with_value("UTF-8"), method : FormMethod::Post, @@ -75,7 +75,7 @@ impl Form { self } - pub fn elements(&self) -> &PageContainer { + pub fn elements(&self) -> &ComponentsHolder { &self.elements } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index add535e3..ca22ad37 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -5,7 +5,7 @@ pub const TYPENAME_COLUMN: &str = "pagetop::base::component::grid::column::Colum pub struct Column { renderable: fn() -> bool, weight : isize, - components: PageContainer, + components: ComponentsHolder, id : OptIden, classes : Classes, template : String, @@ -16,7 +16,7 @@ impl ComponentTrait for Column { Column { renderable: render_always, weight : 0, - components: PageContainer::new(), + components: ComponentsHolder::new(), id : OptIden::new(), classes : Classes::new_with_default("col"), template : "default".to_owned(), @@ -57,7 +57,7 @@ impl Column { self } - pub fn components(&self) -> &PageContainer { + pub fn components(&self) -> &ComponentsHolder { &self.components } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index d8a8858a..b9692015 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -5,7 +5,7 @@ pub const TYPENAME_ROW: &str = "pagetop::base::component::grid::row::Row"; pub struct Row { renderable: fn() -> bool, weight : isize, - columns : PageContainer, + columns : ComponentsHolder, id : OptIden, classes : Classes, template : String, @@ -16,7 +16,7 @@ impl ComponentTrait for Row { Row { renderable: render_always, weight : 0, - columns : PageContainer::new(), + columns : ComponentsHolder::new(), id : OptIden::new(), classes : Classes::new_with_default("row"), template : "default".to_owned(), @@ -57,7 +57,7 @@ impl Row { self } - pub fn columns(&self) -> &PageContainer { + pub fn columns(&self) -> &ComponentsHolder { &self.columns } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index f0bd2a40..a152b9ec 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -172,7 +172,7 @@ impl MenuItem { pub struct Menu { renderable: fn() -> bool, weight : isize, - items : PageContainer, + items : ComponentsHolder, id : OptIden, classes : Classes, template : String, @@ -183,7 +183,7 @@ impl ComponentTrait for Menu { Menu { renderable: render_always, weight : 0, - items : PageContainer::new(), + items : ComponentsHolder::new(), id : OptIden::new(), classes : Classes::new_with_default("sm sm-clean"), template : "default".to_owned(), @@ -243,7 +243,7 @@ impl Menu { self } - pub fn items(&self) -> &PageContainer { + pub fn items(&self) -> &ComponentsHolder { &self.items } diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 206224ec..3669f649 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -42,7 +42,7 @@ pub struct Page<'a> { title : OptAttr, description : OptAttr, assets : PageAssets, - regions : HashMap<&'a str, PageContainer>, + regions : HashMap<&'a str, ComponentsHolder>, body_classes: Classes, template : String, } @@ -102,7 +102,7 @@ impl<'a> Page<'a> { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); } else { - self.regions.insert(region, PageContainer::new_with(component)); + self.regions.insert(region, ComponentsHolder::new_with(component)); } self } From fce106af7ae0e8ce4aacb057a9dce3e502bbcb7e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 6 May 2022 00:55:47 +0200 Subject: [PATCH 077/853] Modifica PageAssets para ser simplemente Assets --- pagetop/src/api/component/action.rs | 8 ++++---- pagetop/src/api/component/assets.rs | 6 +++--- pagetop/src/api/component/definition.rs | 8 ++++---- pagetop/src/api/component/holder.rs | 4 ++-- pagetop/src/api/component/mod.rs | 2 +- pagetop/src/api/theme/definition.rs | 6 +++--- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/chunck.rs | 2 +- pagetop/src/base/component/container.rs | 2 +- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form.rs | 2 +- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 4 ++-- pagetop/src/base/component/grid/column.rs | 2 +- pagetop/src/base/component/grid/row.rs | 2 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu.rs | 4 ++-- pagetop/src/base/theme/bulmix/mod.rs | 2 +- pagetop/src/response/page/page.rs | 6 +++--- 20 files changed, 35 insertions(+), 35 deletions(-) diff --git a/pagetop/src/api/component/action.rs b/pagetop/src/api/component/action.rs index 34f1cc57..9e372570 100644 --- a/pagetop/src/api/component/action.rs +++ b/pagetop/src/api/component/action.rs @@ -1,10 +1,10 @@ use crate::api::action::{ActionTrait, AnyAction}; -use super::{ComponentTrait, PageAssets}; +use super::{Assets, ComponentTrait}; pub const ACTION_BEFORE_RENDER_COMPONENT: &str = "pagetop::render::before_render_component"; pub struct ActionBeforeRenderComponent { - action: Option<fn(&mut dyn ComponentTrait, &mut PageAssets)>, + action: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, weight: isize, } @@ -30,7 +30,7 @@ impl ActionTrait for ActionBeforeRenderComponent { } impl ActionBeforeRenderComponent { - pub fn with_action(mut self, action: fn(&mut dyn ComponentTrait, &mut PageAssets)) -> Self { + pub fn with_action(mut self, action: fn(&mut dyn ComponentTrait, &mut Assets)) -> Self { self.action = Some(action); self } @@ -40,7 +40,7 @@ impl ActionBeforeRenderComponent { self } - pub fn run(&self, component: &mut dyn ComponentTrait, assets: &mut PageAssets) { + pub fn run(&self, component: &mut dyn ComponentTrait, assets: &mut Assets) { if let Some(action) = self.action { action(component, assets) } diff --git a/pagetop/src/api/component/assets.rs b/pagetop/src/api/component/assets.rs index c7faf1bc..4801ada2 100644 --- a/pagetop/src/api/component/assets.rs +++ b/pagetop/src/api/component/assets.rs @@ -173,7 +173,7 @@ impl JavaScript { // Page assets. -pub struct PageAssets { +pub struct Assets { theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, metadata : Vec<(String, String)>, @@ -183,9 +183,9 @@ pub struct PageAssets { id_counter : usize, } -impl PageAssets { +impl Assets { pub fn new() -> Self { - PageAssets { + Assets { theme : *DEFAULT_THEME, favicon : None, metadata : Vec::new(), diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/api/component/definition.rs index a7e6decb..61893243 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/api/component/definition.rs @@ -2,7 +2,7 @@ use crate::html::{Markup, html}; use crate::api::action::{action_ref, run_actions}; use crate::util; use super::{ACTION_BEFORE_RENDER_COMPONENT, ActionBeforeRenderComponent}; -use super::PageAssets; +use super::Assets; pub use std::any::Any as AnyComponent; @@ -35,11 +35,11 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn before_render(&mut self, assets: &mut PageAssets) { + fn before_render(&mut self, assets: &mut Assets) { } #[allow(unused_variables)] - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { html! {} } @@ -70,7 +70,7 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } -pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut PageAssets) -> Markup { +pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut Assets) -> Markup { // Acciones del componente antes de renderizar. component.before_render(assets); diff --git a/pagetop/src/api/component/holder.rs b/pagetop/src/api/component/holder.rs index b3fa54e8..51b67736 100644 --- a/pagetop/src/api/component/holder.rs +++ b/pagetop/src/api/component/holder.rs @@ -1,5 +1,5 @@ use crate::html::{Markup, html}; -use super::{ComponentTrait, PageAssets}; +use super::{Assets, ComponentTrait}; use std::sync::{Arc, RwLock}; @@ -21,7 +21,7 @@ impl ComponentsHolder { self.0.push(Arc::new(RwLock::new(component))); } - pub fn render(&self, assets: &mut PageAssets) -> Markup { + pub fn render(&self, assets: &mut Assets) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/api/component/mod.rs index 3faac016..a119089f 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -6,10 +6,10 @@ pub use action::{ mod assets; pub use assets::{ + Assets, Favicon, StyleSheet, JavaScript, JSMode, - PageAssets, }; mod definition; diff --git a/pagetop/src/api/theme/definition.rs b/pagetop/src/api/theme/definition.rs index 08d913e6..b5a12243 100644 --- a/pagetop/src/api/theme/definition.rs +++ b/pagetop/src/api/theme/definition.rs @@ -1,7 +1,7 @@ use crate::{app, concat_string}; use crate::config::SETTINGS; use crate::html::{Markup, html}; -use crate::api::component::{ComponentTrait, Favicon, PageAssets}; +use crate::api::component::{Assets, ComponentTrait, Favicon}; use crate::response::page::Page; use crate::base::component::Chunck; use crate::util; @@ -88,7 +88,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn before_render_component( &self, component: &mut dyn ComponentTrait, - assets: &mut PageAssets + assets: &mut Assets ) { /* Cómo usarlo: @@ -107,7 +107,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn render_component( &self, component: &dyn ComponentTrait, - assets: &mut PageAssets + assets: &mut Assets ) -> Option<Markup> { None /* diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index d0b4ad7a..df209ea9 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -33,7 +33,7 @@ impl ComponentTrait for Block { self.weight } - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { let id = assets.serial_id(self.single_name(), self.id()); html! { div id=(id) class=[self.classes()] { diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 26666344..a772af1d 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -27,7 +27,7 @@ impl ComponentTrait for Chunck { self.weight } - fn default_render(&self, _: &mut PageAssets) -> Markup { + fn default_render(&self, _: &mut Assets) -> Markup { html! { (*self.html()) } } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 5c64b14e..dd2508ad 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -37,7 +37,7 @@ impl ComponentTrait for Container { self.weight } - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { match self.container_type() { ContainerType::Header => html! { header id=[self.id()] class=[self.classes()] { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 16720106..47f2e9ca 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -40,7 +40,7 @@ impl ComponentTrait for Button { self.weight } - fn default_render(&self, _: &mut PageAssets) -> Markup { + fn default_render(&self, _: &mut Assets) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Reset => "reset", diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 741ac450..e9741120 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -48,7 +48,7 @@ impl ComponentTrait for Date { self.weight } - fn default_render(&self, _: &mut PageAssets) -> Markup { + fn default_render(&self, _: &mut Assets) -> Markup { let id = match self.name() { Some(name) => Some(concat_string!("edit-", name)), None => None, diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 2f4fa609..70a9caf6 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -39,7 +39,7 @@ impl ComponentTrait for Form { self.weight } - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { let method = match self.method() { FormMethod::Get => None, FormMethod::Post => Some("post".to_owned()) diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 4df5fd4f..c837d0a8 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -21,7 +21,7 @@ impl ComponentTrait for Hidden { self.weight } - fn default_render(&self, _: &mut PageAssets) -> Markup { + fn default_render(&self, _: &mut Assets) -> Markup { let id = match self.name() { Some(name) => Some(concat_string!("value-", name)), _ => None diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 573ddebf..a7168097 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -58,14 +58,14 @@ impl ComponentTrait for Input { self.weight } - fn before_render(&mut self, _: &mut PageAssets) { + fn before_render(&mut self, _: &mut Assets) { if let Some(name) = self.name() { let class = concat_string!("form-item-", name); self.alter_classes(class.as_str(), ClassesOp::AddFirst); } } - fn default_render(&self, _: &mut PageAssets) -> Markup { + fn default_render(&self, _: &mut Assets) -> Markup { let type_input = match self.input_type() { InputType::Email => "email", InputType::Password => "password", diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index ca22ad37..8199c986 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -31,7 +31,7 @@ impl ComponentTrait for Column { self.weight } - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { html! { div id=[self.id()] class=[self.classes()] { (self.components().render(assets)) diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index b9692015..a366cf7a 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -31,7 +31,7 @@ impl ComponentTrait for Row { self.weight } - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { html! { div id=[self.id()] class=[self.classes()] { (self.columns().render(assets)) diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index ee92215a..efb647c2 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -31,7 +31,7 @@ impl ComponentTrait for Image { self.weight } - fn default_render(&self, _: &mut PageAssets) -> Markup { + fn default_render(&self, _: &mut Assets) -> Markup { html! { img src=[self.source()] diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index a152b9ec..9b416daf 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -38,7 +38,7 @@ impl ComponentTrait for MenuItem { self.weight } - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { match self.item_type() { MenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } @@ -198,7 +198,7 @@ impl ComponentTrait for Menu { self.weight } - fn default_render(&self, assets: &mut PageAssets) -> Markup { + fn default_render(&self, assets: &mut Assets) -> Markup { assets .add_stylesheet(StyleSheet::source( "/theme/menu/css/menu.css?ver=1.1.1" diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index a4b194f4..1a36fe7d 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -27,7 +27,7 @@ impl ThemeTrait for Bulmix { fn before_render_component( &self, component: &mut dyn ComponentTrait, - _assets: &mut PageAssets + _assets: &mut Assets ) { match component.type_name() { grid::TYPENAME_ROW => { diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 3669f649..0fc9c627 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -41,7 +41,7 @@ pub struct Page<'a> { direction : OptAttr, title : OptAttr, description : OptAttr, - assets : PageAssets, + assets : Assets, regions : HashMap<&'a str, ComponentsHolder>, body_classes: Classes, template : String, @@ -61,7 +61,7 @@ impl<'a> Page<'a> { }, title : OptAttr::new(), description : OptAttr::new(), - assets : PageAssets::new(), + assets : Assets::new(), regions : common_components(), body_classes: Classes::new_with_default("body"), template : "default".to_owned(), @@ -135,7 +135,7 @@ impl<'a> Page<'a> { self.description.option() } - pub fn assets(&mut self) -> &mut PageAssets { + pub fn assets(&mut self) -> &mut Assets { &mut self.assets } From a6d39202d49b18a10f2c67672adc12da095d02cd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 7 May 2022 15:15:14 +0200 Subject: [PATCH 078/853] =?UTF-8?q?Modifica=20y=20simplifica=20identificac?= =?UTF-8?q?i=C3=B3n=20de=20acciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/api/action/all.rs | 13 +++++++------ pagetop/src/api/action/definition.rs | 4 ---- pagetop/src/api/component/action.rs | 6 ------ pagetop/src/api/component/definition.rs | 7 +++---- pagetop/src/api/component/mod.rs | 5 +---- pagetop/src/api/mod.rs | 2 ++ pagetop/src/prelude.rs | 1 + pagetop/src/response/page/action.rs | 6 ------ pagetop/src/response/page/mod.rs | 5 +---- pagetop/src/response/page/page.rs | 6 +++--- 10 files changed, 18 insertions(+), 37 deletions(-) diff --git a/pagetop/src/api/action/all.rs b/pagetop/src/api/action/all.rs index 8003d09e..4e301777 100644 --- a/pagetop/src/api/action/all.rs +++ b/pagetop/src/api/action/all.rs @@ -1,29 +1,30 @@ use crate::Lazy; +use crate::api::TypeId; use super::{ActionItem, ActionsHolder}; use std::sync::RwLock; use std::collections::HashMap; // Registered actions. -static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = Lazy::new(|| { +static ACTIONS: Lazy<RwLock<HashMap<TypeId, ActionsHolder>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); pub fn add_action(action: ActionItem) { let mut hmap = ACTIONS.write().unwrap(); - let action_name = action.machine_name(); - if let Some(actions) = hmap.get_mut(action_name) { + let action_id = action.type_id(); + if let Some(actions) = hmap.get_mut(&action_id) { actions.add(action); } else { - hmap.insert(action_name, ActionsHolder::new_with(action)); + hmap.insert(action_id, ActionsHolder::new_with(action)); } } -pub fn run_actions<B, F>(machine_name: &'static str, f: F) +pub fn run_actions<B, F>(action_id: TypeId, f: F) where F: FnMut(&ActionItem) -> B { - if let Some(actions) = ACTIONS.read().unwrap().get(machine_name) { + if let Some(actions) = ACTIONS.read().unwrap().get(&action_id) { actions.iter_map(f) } } diff --git a/pagetop/src/api/action/definition.rs b/pagetop/src/api/action/definition.rs index 1bd554df..9acb1258 100644 --- a/pagetop/src/api/action/definition.rs +++ b/pagetop/src/api/action/definition.rs @@ -3,10 +3,6 @@ pub use std::any::Any as AnyAction; pub trait ActionTrait: AnyAction + Send + Sync { fn new() -> Self where Self: Sized; - fn machine_name(&self) -> &'static str { - std::any::type_name::<Self>() - } - fn weight(&self) -> isize { 0 } diff --git a/pagetop/src/api/component/action.rs b/pagetop/src/api/component/action.rs index 9e372570..d4e1f460 100644 --- a/pagetop/src/api/component/action.rs +++ b/pagetop/src/api/component/action.rs @@ -1,8 +1,6 @@ use crate::api::action::{ActionTrait, AnyAction}; use super::{Assets, ComponentTrait}; -pub const ACTION_BEFORE_RENDER_COMPONENT: &str = "pagetop::render::before_render_component"; - pub struct ActionBeforeRenderComponent { action: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, weight: isize, @@ -16,10 +14,6 @@ impl ActionTrait for ActionBeforeRenderComponent { } } - fn machine_name(&self) -> &'static str { - ACTION_BEFORE_RENDER_COMPONENT - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/api/component/definition.rs index 61893243..687b4eae 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/api/component/definition.rs @@ -1,8 +1,7 @@ use crate::html::{Markup, html}; -use crate::api::action::{action_ref, run_actions}; +use crate::api::{TypeId, action::{action_ref, run_actions}}; use crate::util; -use super::{ACTION_BEFORE_RENDER_COMPONENT, ActionBeforeRenderComponent}; -use super::Assets; +use super::{ActionBeforeRenderComponent, Assets}; pub use std::any::Any as AnyComponent; @@ -76,7 +75,7 @@ pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut Assets) // Acciones de los módulos antes de renderizar el componente. run_actions( - ACTION_BEFORE_RENDER_COMPONENT, + TypeId::of::<ActionBeforeRenderComponent>(), |a| action_ref::<ActionBeforeRenderComponent>(&**a).run(component, assets) ); diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/api/component/mod.rs index a119089f..10a894b9 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -1,8 +1,5 @@ mod action; -pub use action::{ - ACTION_BEFORE_RENDER_COMPONENT, - ActionBeforeRenderComponent, -}; +pub use action::ActionBeforeRenderComponent; mod assets; pub use assets::{ diff --git a/pagetop/src/api/mod.rs b/pagetop/src/api/mod.rs index b69ec91b..8d84af05 100644 --- a/pagetop/src/api/mod.rs +++ b/pagetop/src/api/mod.rs @@ -1,3 +1,5 @@ +pub use std::any::TypeId; + pub mod action; // API to define functions that alter the behavior of PageTop core. pub mod component; // API para crear nuevos componentes. pub mod module; // API para añadir módulos con nuevas funcionalidades. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 357c31cf..a20d1563 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -21,6 +21,7 @@ pub use crate::{ }; pub use crate::{action_item, api::{ + TypeId, action::*, component::*, module::*, diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index d47b5ca6..7fe35a7f 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -1,8 +1,6 @@ use crate::api::action::{ActionTrait, AnyAction}; use super::Page; -pub const ACTION_BEFORE_RENDER_PAGE: &str = "pagetop::render::before_render_page"; - pub struct ActionBeforeRenderPage { action: Option<fn(&mut Page)>, weight: isize, @@ -16,10 +14,6 @@ impl ActionTrait for ActionBeforeRenderPage { } } - fn machine_name(&self) -> &'static str { - ACTION_BEFORE_RENDER_PAGE - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 3d8194f2..30f95d72 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -1,8 +1,5 @@ mod action; -pub use action::{ - ACTION_BEFORE_RENDER_PAGE, - ActionBeforeRenderPage, -}; +pub use action::ActionBeforeRenderPage; mod page; pub use page::Page; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 0fc9c627..99a81cb3 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,9 +1,9 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::*; -use crate::api::action::{action_ref, run_actions}; +use crate::api::{TypeId, action::{action_ref, run_actions}}; use crate::api::component::*; -use super::{ACTION_BEFORE_RENDER_PAGE, ActionBeforeRenderPage}; +use super::ActionBeforeRenderPage; use std::collections::HashMap; @@ -152,7 +152,7 @@ impl<'a> Page<'a> { pub fn render(&mut self) -> app::Result<Markup> { // Acciones de los módulos antes de renderizar la página. run_actions( - ACTION_BEFORE_RENDER_PAGE, + TypeId::of::<ActionBeforeRenderPage>(), |a| action_ref::<ActionBeforeRenderPage>(&**a).run(self) ); From cbfe374eb5052a7080f0e547333fed5f7cdb8aff Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 7 May 2022 15:29:38 +0200 Subject: [PATCH 079/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/src/api/component/assets.rs | 60 ++++++++++++++--------------- pagetop/src/api/component/mod.rs | 2 +- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 36215a52..1888cacc 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.10" +version = "0.0.11" edition = "2021" authors = [ diff --git a/pagetop/src/api/component/assets.rs b/pagetop/src/api/component/assets.rs index 4801ada2..30a6e4b1 100644 --- a/pagetop/src/api/component/assets.rs +++ b/pagetop/src/api/component/assets.rs @@ -97,36 +97,6 @@ impl Favicon { } } -// StyleSheet. - -pub struct StyleSheet { - source: &'static str, - weight: isize, -} -impl StyleSheet { - pub fn source(s: &'static str) -> Self { - StyleSheet { - source: s, - weight: 0, - } - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn weight(self) -> isize { - self.weight - } - - fn render(&self) -> Markup { - html! { - link rel="stylesheet" href=(self.source); - } - } -} - // JavaScript. #[derive(PartialEq)] @@ -171,6 +141,36 @@ impl JavaScript { } } +// StyleSheet. + +pub struct StyleSheet { + source: &'static str, + weight: isize, +} +impl StyleSheet { + pub fn source(s: &'static str) -> Self { + StyleSheet { + source: s, + weight: 0, + } + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn weight(self) -> isize { + self.weight + } + + fn render(&self) -> Markup { + html! { + link rel="stylesheet" href=(self.source); + } + } +} + // Page assets. pub struct Assets { diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/api/component/mod.rs index 10a894b9..fe21f1ea 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -5,8 +5,8 @@ mod assets; pub use assets::{ Assets, Favicon, - StyleSheet, JavaScript, JSMode, + StyleSheet, }; mod definition; From e8226daa4bba215261ee4806e4f849016aa05dc9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 7 May 2022 18:56:55 +0200 Subject: [PATCH 080/853] =?UTF-8?q?Corrige=20asignaci=C3=B3n=20de=20clases?= =?UTF-8?q?=20para=20evitar=20espacios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html/classes.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 740d1f89..aa629aaf 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -34,7 +34,9 @@ impl Classes { pub fn alter(&mut self, classes: &str, op: ClassesOp) -> &Self { let classes = classes.trim(); match op { - ClassesOp::Add => self.added.push_str(concat_string!(" ", classes).as_str()), + ClassesOp::Add => { + self.added = concat_string!(self.added, " ", classes).trim().to_owned() + }, ClassesOp::AddAfter(class) => { let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); @@ -54,7 +56,9 @@ impl Classes { self.added = v_added.join(" "); }, - ClassesOp::AddFirst => self.added = concat_string!(classes, " ", self.added), + ClassesOp::AddFirst => { + self.added = concat_string!(classes, " ", self.added).trim().to_owned() + }, ClassesOp::Replace(class) => { let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); @@ -72,7 +76,7 @@ impl Classes { ClassesOp::SetDefault => self.default = classes.to_owned(), } - self.option = Some(concat_string!(self.default, " ", self.added.trim()).to_owned()); + self.option = Some(concat_string!(self.default, " ", self.added).trim().to_owned()); self } From 68a347382df76842a573dc39589f4eeaaa0c6164 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 7 May 2022 23:16:00 +0200 Subject: [PATCH 081/853] Modifica identificador por handler() --- pagetop-admin/src/lib.rs | 6 ++++ pagetop-node/src/lib.rs | 6 ++++ pagetop-user/src/lib.rs | 6 ++++ pagetop/src/api/action/all.rs | 16 ++++------ pagetop/src/api/action/definition.rs | 2 ++ pagetop/src/api/component/action.rs | 14 ++++++--- pagetop/src/api/component/definition.rs | 38 ++++++----------------- pagetop/src/api/component/mod.rs | 6 ++-- pagetop/src/api/mod.rs | 2 -- pagetop/src/api/module/all.rs | 6 ++-- pagetop/src/api/module/definition.rs | 31 ++++-------------- pagetop/src/api/module/mod.rs | 9 ++---- pagetop/src/api/theme/all.rs | 4 +-- pagetop/src/api/theme/definition.rs | 36 +++++---------------- pagetop/src/api/theme/mod.rs | 5 +-- pagetop/src/base/component/block.rs | 8 +++-- pagetop/src/base/component/chunck.rs | 6 +++- pagetop/src/base/component/container.rs | 6 +++- pagetop/src/base/component/form/button.rs | 6 +++- pagetop/src/base/component/form/date.rs | 6 +++- pagetop/src/base/component/form/form.rs | 6 +++- pagetop/src/base/component/form/hidden.rs | 6 +++- pagetop/src/base/component/form/input.rs | 6 +++- pagetop/src/base/component/form/mod.rs | 10 +++--- pagetop/src/base/component/grid/column.rs | 6 +++- pagetop/src/base/component/grid/mod.rs | 4 +-- pagetop/src/base/component/grid/row.rs | 6 +++- pagetop/src/base/component/image.rs | 6 +++- pagetop/src/base/component/menu.rs | 14 +++++++-- pagetop/src/base/component/mod.rs | 12 +++---- pagetop/src/base/module/demopage/mod.rs | 6 ++++ pagetop/src/base/theme/aliner/mod.rs | 6 ++++ pagetop/src/base/theme/bootsier/mod.rs | 6 ++++ pagetop/src/base/theme/bulmix/mod.rs | 12 +++++-- pagetop/src/base/theme/minimal/mod.rs | 5 +++ pagetop/src/prelude.rs | 1 - pagetop/src/response/page/action.rs | 6 ++++ pagetop/src/response/page/mod.rs | 5 ++- pagetop/src/response/page/page.rs | 6 ++-- pagetop/src/util.rs | 4 +++ 40 files changed, 200 insertions(+), 152 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 5ca91531..d05138b4 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,5 +1,7 @@ use pagetop::prelude::*; +pub const ADMIN_MODULE: &str = "pagetop-admin::module::admin"; + localize!("src/locales"); mod summary; @@ -7,6 +9,10 @@ mod summary; pub struct Admin; impl ModuleTrait for Admin { + fn handler(&self) -> &'static str { + ADMIN_MODULE + } + fn name(&self) -> String { l("module_name") } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 3f8bff18..98af01bd 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,5 +1,7 @@ use pagetop::prelude::*; +pub const NODE_MODULE: &str = "pagetop-node::module::node"; + localize!("src/locales"); //mod entity; @@ -8,6 +10,10 @@ mod migration; pub struct Node; impl ModuleTrait for Node { + fn handler(&self) -> &'static str { + NODE_MODULE + } + fn name(&self) -> String { l("module_name") } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 557ecdac..8003e707 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,5 +1,7 @@ use pagetop::prelude::*; +pub const USER_MODULE: &str = "pagetop-user::module::user"; + localize!("src/locales"); mod migration; @@ -7,6 +9,10 @@ mod migration; pub struct User; impl ModuleTrait for User { + fn handler(&self) -> &'static str { + USER_MODULE + } + fn name(&self) -> String { l("module_name") } diff --git a/pagetop/src/api/action/all.rs b/pagetop/src/api/action/all.rs index 4e301777..cb9bfb8d 100644 --- a/pagetop/src/api/action/all.rs +++ b/pagetop/src/api/action/all.rs @@ -1,30 +1,26 @@ use crate::Lazy; -use crate::api::TypeId; use super::{ActionItem, ActionsHolder}; use std::sync::RwLock; use std::collections::HashMap; // Registered actions. -static ACTIONS: Lazy<RwLock<HashMap<TypeId, ActionsHolder>>> = Lazy::new(|| { +static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); pub fn add_action(action: ActionItem) { let mut hmap = ACTIONS.write().unwrap(); - let action_id = action.type_id(); - if let Some(actions) = hmap.get_mut(&action_id) { + let action_handler = action.handler(); + if let Some(actions) = hmap.get_mut(action_handler) { actions.add(action); } else { - hmap.insert(action_id, ActionsHolder::new_with(action)); + hmap.insert(action_handler, ActionsHolder::new_with(action)); } } -pub fn run_actions<B, F>(action_id: TypeId, f: F) -where - F: FnMut(&ActionItem) -> B -{ - if let Some(actions) = ACTIONS.read().unwrap().get(&action_id) { +pub fn run_actions<B, F>(action_handler: &str, f: F) where F: FnMut(&ActionItem) -> B { + if let Some(actions) = ACTIONS.read().unwrap().get(action_handler) { actions.iter_map(f) } } diff --git a/pagetop/src/api/action/definition.rs b/pagetop/src/api/action/definition.rs index 9acb1258..1c950686 100644 --- a/pagetop/src/api/action/definition.rs +++ b/pagetop/src/api/action/definition.rs @@ -3,6 +3,8 @@ pub use std::any::Any as AnyAction; pub trait ActionTrait: AnyAction + Send + Sync { fn new() -> Self where Self: Sized; + fn handler(&self) -> &'static str; + fn weight(&self) -> isize { 0 } diff --git a/pagetop/src/api/component/action.rs b/pagetop/src/api/component/action.rs index d4e1f460..243646cc 100644 --- a/pagetop/src/api/component/action.rs +++ b/pagetop/src/api/component/action.rs @@ -1,19 +1,25 @@ use crate::api::action::{ActionTrait, AnyAction}; use super::{Assets, ComponentTrait}; -pub struct ActionBeforeRenderComponent { +pub const BEFORE_RENDER_COMPONENT_ACTION: &str = "pagetop::action::before_render_component"; + +pub struct BeforeRenderComponentAction { action: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, weight: isize, } -impl ActionTrait for ActionBeforeRenderComponent { +impl ActionTrait for BeforeRenderComponentAction { fn new() -> Self { - ActionBeforeRenderComponent { + BeforeRenderComponentAction { action: None, weight: 0, } } + fn handler(&self) -> &'static str { + BEFORE_RENDER_COMPONENT_ACTION + } + fn weight(&self) -> isize { self.weight } @@ -23,7 +29,7 @@ impl ActionTrait for ActionBeforeRenderComponent { } } -impl ActionBeforeRenderComponent { +impl BeforeRenderComponentAction { pub fn with_action(mut self, action: fn(&mut dyn ComponentTrait, &mut Assets)) -> Self { self.action = Some(action); self diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/api/component/definition.rs index 687b4eae..a807a36f 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/api/component/definition.rs @@ -1,24 +1,18 @@ use crate::html::{Markup, html}; -use crate::api::{TypeId, action::{action_ref, run_actions}}; +use crate::api::action::{action_ref, run_actions}; use crate::util; -use super::{ActionBeforeRenderComponent, Assets}; +use super::{BEFORE_RENDER_COMPONENT_ACTION, BeforeRenderComponentAction}; +use super::Assets; pub use std::any::Any as AnyComponent; -pub trait BaseComponent { - fn type_name(&self) -> &'static str; - - fn single_name(&self) -> &'static str; - - fn qualified_name(&self, last: usize) -> &'static str; -} - -pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { - +pub trait ComponentTrait: AnyComponent + Send + Sync { fn new() -> Self where Self: Sized; + fn handler(&self) -> &'static str; + fn name(&self) -> String { - self.single_name().to_owned() + util::single_type_name::<Self>().to_owned() } fn description(&self) -> Option<String> { @@ -47,20 +41,6 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } -impl<C: ?Sized + ComponentTrait> BaseComponent for C { - fn type_name(&self) -> &'static str { - std::any::type_name::<Self>() - } - - fn single_name(&self) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), 1) - } - - fn qualified_name(&self, last: usize) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), last) - } -} - pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C { component.as_ref_any().downcast_ref::<C>().unwrap() } @@ -75,8 +55,8 @@ pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut Assets) // Acciones de los módulos antes de renderizar el componente. run_actions( - TypeId::of::<ActionBeforeRenderComponent>(), - |a| action_ref::<ActionBeforeRenderComponent>(&**a).run(component, assets) + BEFORE_RENDER_COMPONENT_ACTION, + |a| action_ref::<BeforeRenderComponentAction>(&**a).run(component, assets) ); // Acciones del tema antes de renderizar el componente. diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/api/component/mod.rs index fe21f1ea..95044f52 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -1,5 +1,8 @@ mod action; -pub use action::ActionBeforeRenderComponent; +pub use action::{ + BEFORE_RENDER_COMPONENT_ACTION, + BeforeRenderComponentAction, +}; mod assets; pub use assets::{ @@ -12,7 +15,6 @@ pub use assets::{ mod definition; pub use definition::{ AnyComponent, - BaseComponent, ComponentTrait, component_ref, component_mut, diff --git a/pagetop/src/api/mod.rs b/pagetop/src/api/mod.rs index 8d84af05..b69ec91b 100644 --- a/pagetop/src/api/mod.rs +++ b/pagetop/src/api/mod.rs @@ -1,5 +1,3 @@ -pub use std::any::TypeId; - pub mod action; // API to define functions that alter the behavior of PageTop core. pub mod component; // API para crear nuevos componentes. pub mod module; // API para añadir módulos con nuevas funcionalidades. diff --git a/pagetop/src/api/module/all.rs b/pagetop/src/api/module/all.rs index 6c7948de..1bb6ea7d 100644 --- a/pagetop/src/api/module/all.rs +++ b/pagetop/src/api/module/all.rs @@ -18,9 +18,9 @@ pub fn register_module(module: &'static dyn ModuleTrait) { } fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { - if !MODULES.read().unwrap().iter().any(|m| m.type_name() == module.type_name()) { - if !list.iter().any(|m| m.type_name() == module.type_name()) { - trace::debug!("Registering \"{}\" module", module.single_name()); + if !MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) { + if !list.iter().any(|m| m.handler() == module.handler()) { + trace::debug!("Register module: \"{}\"", module.name()); list.push(module); let mut dependencies = module.dependencies(); diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/api/module/definition.rs index d1c213e3..7ee26e5d 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -1,21 +1,16 @@ -use crate::{app, util}; +use crate::app; use crate::api::action::ActionItem; +use crate::util; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db::MigrationItem; -pub trait BaseModule { - fn type_name(&self) -> &'static str; - - fn single_name(&self) -> &'static str; - - fn qualified_name(&self, last: usize) -> &'static str; -} - /// Los módulos deben implementar este *trait*. -pub trait ModuleTrait: BaseModule + Send + Sync { +pub trait ModuleTrait: Send + Sync { + fn handler(&self) -> &'static str; + fn name(&self) -> String { - self.single_name().to_owned() + util::single_type_name::<Self>().to_owned() } fn description(&self) -> Option<String> { @@ -40,17 +35,3 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } } - -impl<M: ?Sized + ModuleTrait> BaseModule for M { - fn type_name(&self) -> &'static str { - std::any::type_name::<Self>() - } - - fn single_name(&self) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), 1) - } - - fn qualified_name(&self, last: usize) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), last) - } -} diff --git a/pagetop/src/api/module/mod.rs b/pagetop/src/api/module/mod.rs index d1addefe..b4a97393 100644 --- a/pagetop/src/api/module/mod.rs +++ b/pagetop/src/api/module/mod.rs @@ -1,10 +1,5 @@ mod definition; -pub use definition::{ - BaseModule, - ModuleTrait, -}; +pub use definition::ModuleTrait; pub(crate) mod all; -pub use all::{ - register_module, -}; +pub use all::register_module; diff --git a/pagetop/src/api/theme/all.rs b/pagetop/src/api/theme/all.rs index 12d96338..b1e47307 100644 --- a/pagetop/src/api/theme/all.rs +++ b/pagetop/src/api/theme/all.rs @@ -12,8 +12,8 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { pub fn register_theme(theme: &'static dyn ThemeTrait) { let mut themes = THEMES.write().unwrap(); - if !themes.iter().any(|t| t.name() == theme.name()) { - trace::debug!("Registering \"{}\" theme", theme.single_name()); + if !themes.iter().any(|t| t.handler() == theme.handler()) { + trace::debug!("Register theme: \"{}\"", theme.name()); themes.push(theme); } } diff --git a/pagetop/src/api/theme/definition.rs b/pagetop/src/api/theme/definition.rs index b5a12243..6bfa63d5 100644 --- a/pagetop/src/api/theme/definition.rs +++ b/pagetop/src/api/theme/definition.rs @@ -6,18 +6,12 @@ use crate::response::page::Page; use crate::base::component::Chunck; use crate::util; -pub trait BaseTheme { - fn type_name(&self) -> &'static str; - - fn single_name(&self) -> &'static str; - - fn qualified_name(&self, last: usize) -> &'static str; -} - /// Los temas deben implementar este "trait". -pub trait ThemeTrait: BaseTheme + Send + Sync { +pub trait ThemeTrait: Send + Sync { + fn handler(&self) -> &'static str; + fn name(&self) -> String { - self.single_name().to_owned() + util::single_type_name::<Self>().to_owned() } fn description(&self) -> Option<String> { @@ -93,8 +87,8 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { /* Cómo usarlo: - match component.single_name() { - "Block" => { + match component.handler() { + BLOCK_COMPONENT => { let block = component_mut::<Block>(component); block.alter_title("New title"); }, @@ -113,8 +107,8 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { /* Cómo usarlo: - match component.single_name() { - "Block" => { + match component.handler() { + BLOCK_COMPONENT => { let block = component_ref::<Block>(component); match block.template() { "default" => Some(block_default(block)), @@ -137,17 +131,3 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { .render() } } - -impl<T: ?Sized + ThemeTrait> BaseTheme for T { - fn type_name(&self) -> &'static str { - std::any::type_name::<Self>() - } - - fn single_name(&self) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), 1) - } - - fn qualified_name(&self, last: usize) -> &'static str { - util::partial_type_name(std::any::type_name::<Self>(), last) - } -} diff --git a/pagetop/src/api/theme/mod.rs b/pagetop/src/api/theme/mod.rs index f76d1fe3..4456189e 100644 --- a/pagetop/src/api/theme/mod.rs +++ b/pagetop/src/api/theme/mod.rs @@ -1,8 +1,5 @@ mod definition; -pub use definition::{ - BaseTheme, - ThemeTrait, -}; +pub use definition::ThemeTrait; pub(crate) mod all; pub use all::{ diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index df209ea9..dafe4497 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_BLOCK: &str = "pagetop::base::component::block::Block"; +pub const BLOCK_COMPONENT: &str = "pagetop::component::block"; pub struct Block { renderable: fn() -> bool, @@ -25,6 +25,10 @@ impl ComponentTrait for Block { } } + fn handler(&self) -> &'static str { + BLOCK_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } @@ -34,7 +38,7 @@ impl ComponentTrait for Block { } fn default_render(&self, assets: &mut Assets) -> Markup { - let id = assets.serial_id(self.single_name(), self.id()); + let id = assets.serial_id("block", self.id()); html! { div id=(id) class=[self.classes()] { @match self.title() { diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index a772af1d..c7d8a978 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_CHUNCK: &str = "pagetop::base::component::chunck::Chunck"; +pub const CHUNCK_COMPONENT: &str = "pagetop::component::chunck"; pub struct Chunck { renderable: fn() -> bool, @@ -19,6 +19,10 @@ impl ComponentTrait for Chunck { } } + fn handler(&self) -> &'static str { + CHUNCK_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index dd2508ad..e275f255 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_CONTAINER: &str = "pagetop::base::component::container::Container"; +pub const CONTAINER_COMPONENT: &str = "pagetop::component::container"; pub enum ContainerType { Header, Footer, Main, Section, Wrapper } @@ -29,6 +29,10 @@ impl ComponentTrait for Container { } } + fn handler(&self) -> &'static str { + CONTAINER_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 47f2e9ca..fc7fe620 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_BUTTON: &str = "pagetop::base::component::form::button::Button"; +pub const BUTTON_COMPONENT: &str = "pagetop::component::form::button"; pub enum ButtonType {Button, Reset, Submit} @@ -32,6 +32,10 @@ impl ComponentTrait for Button { .with_classes("form-button", ClassesOp::AddFirst) } + fn handler(&self) -> &'static str { + BUTTON_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index e9741120..eeb1d7aa 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_DATE: &str = "pagetop::base::component::form::date::Date"; +pub const DATE_COMPONENT: &str = "pagetop::component::form::date"; pub struct Date { renderable : fn() -> bool, @@ -40,6 +40,10 @@ impl ComponentTrait for Date { .with_classes("form-type-date", ClassesOp::AddFirst) } + fn handler(&self) -> &'static str { + DATE_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 70a9caf6..dcf209b0 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_FORM: &str = "pagetop::base::component::form::form::Form"; +pub const FORM_COMPONENT: &str = "pagetop::component::form"; pub enum FormMethod {Get, Post} @@ -31,6 +31,10 @@ impl ComponentTrait for Form { } } + fn handler(&self) -> &'static str { + FORM_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index c837d0a8..c8d86131 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_HIDDEN: &str = "pagetop::base::component::form::hidden::Hidden"; +pub const HIDDEN_COMPONENT: &str = "pagetop::component::form::hidden"; pub struct Hidden { weight: isize, @@ -17,6 +17,10 @@ impl ComponentTrait for Hidden { } } + fn handler(&self) -> &'static str { + HIDDEN_COMPONENT + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index a7168097..d1614aa3 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_INPUT: &str = "pagetop::base::component::form::input::Input"; +pub const INPUT_COMPONENT: &str = "pagetop::component::form::input"; pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} @@ -50,6 +50,10 @@ impl ComponentTrait for Input { .with_classes("form-type-textfield", ClassesOp::AddFirst) } + fn handler(&self) -> &'static str { + INPUT_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/form/mod.rs b/pagetop/src/base/component/form/mod.rs index d8df6d2d..4e35a9d4 100644 --- a/pagetop/src/base/component/form/mod.rs +++ b/pagetop/src/base/component/form/mod.rs @@ -1,21 +1,21 @@ mod form; pub use form::{ - TYPENAME_FORM, Form, FormMethod + FORM_COMPONENT, Form, FormMethod }; mod input; pub use input::{ - TYPENAME_INPUT, Input, InputType + INPUT_COMPONENT, Input, InputType }; mod hidden; pub use hidden::{ - TYPENAME_HIDDEN, Hidden + HIDDEN_COMPONENT, Hidden }; mod date; pub use date::{ - TYPENAME_DATE, Date + DATE_COMPONENT, Date }; mod button; pub use button::{ - TYPENAME_BUTTON, Button, ButtonType + BUTTON_COMPONENT, Button, ButtonType }; diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 8199c986..a69edce7 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_COLUMN: &str = "pagetop::base::component::grid::column::Column"; +pub const COLUMN_COMPONENT: &str = "pagetop::component::grid::column"; pub struct Column { renderable: fn() -> bool, @@ -23,6 +23,10 @@ impl ComponentTrait for Column { } } + fn handler(&self) -> &'static str { + COLUMN_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/grid/mod.rs b/pagetop/src/base/component/grid/mod.rs index e63ea7cd..4fd8936b 100644 --- a/pagetop/src/base/component/grid/mod.rs +++ b/pagetop/src/base/component/grid/mod.rs @@ -1,8 +1,8 @@ mod row; pub use row::{ - TYPENAME_ROW, Row + ROW_COMPONENT, Row }; mod column; pub use column::{ - TYPENAME_COLUMN, Column + COLUMN_COMPONENT, Column }; diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index a366cf7a..05fae1cf 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_ROW: &str = "pagetop::base::component::grid::row::Row"; +pub const ROW_COMPONENT: &str = "pagetop::component::grid::row"; pub struct Row { renderable: fn() -> bool, @@ -23,6 +23,10 @@ impl ComponentTrait for Row { } } + fn handler(&self) -> &'static str { + ROW_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index efb647c2..300cafc2 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const TYPENAME_IMAGE: &str = "pagetop::base::component::image::Image"; +pub const IMAGE_COMPONENT: &str = "pagetop::component::image"; pub struct Image { renderable: fn() -> bool, @@ -23,6 +23,10 @@ impl ComponentTrait for Image { } } + fn handler(&self) -> &'static str { + IMAGE_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 9b416daf..0434b90f 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,7 +1,7 @@ use crate::prelude::*; -pub const TYPENAME_MENU: &str = "pagetop::base::component::menu::Menu"; -pub const TYPENAME_MENUITEM: &str = "pagetop::base::component::menu::MenuItem"; +pub const MENU_COMPONENT: &str = "pagetop::component::menu"; +pub const MENUITEM_COMPONENT: &str = "pagetop::component::menu"; pub enum MenuItemType { Label(String), @@ -30,6 +30,10 @@ impl ComponentTrait for MenuItem { } } + fn handler(&self) -> &'static str { + MENUITEM_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } @@ -190,6 +194,10 @@ impl ComponentTrait for Menu { } } + fn handler(&self) -> &'static str { + MENU_COMPONENT + } + fn is_renderable(&self) -> bool { (self.renderable)() } @@ -211,7 +219,7 @@ impl ComponentTrait for Menu { )) .add_jquery(); - let id = assets.serial_id(self.single_name(), self.id()); + let id = assets.serial_id("menu", self.id()); html! { ul id=(id) class=[self.classes()] { (self.items().render(assets)) diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/base/component/mod.rs index 032fd625..14759dc8 100644 --- a/pagetop/src/base/component/mod.rs +++ b/pagetop/src/base/component/mod.rs @@ -1,28 +1,28 @@ mod container; pub use container::{ - TYPENAME_CONTAINER, Container, ContainerType + CONTAINER_COMPONENT, Container, ContainerType }; pub mod grid; mod chunck; pub use chunck::{ - TYPENAME_CHUNCK, Chunck + CHUNCK_COMPONENT, Chunck }; mod block; pub use block::{ - TYPENAME_BLOCK, Block + BLOCK_COMPONENT, Block }; mod image; pub use image::{ - TYPENAME_IMAGE, Image + IMAGE_COMPONENT, Image }; mod menu; pub use menu::{ - TYPENAME_MENU, TYPENAME_MENUITEM, Menu, MenuItem, MenuItemType + MENU_COMPONENT, MENUITEM_COMPONENT, Menu, MenuItem, MenuItemType }; pub mod form; pub use form::{ - TYPENAME_FORM, Form, FormMethod + FORM_COMPONENT, Form, FormMethod }; diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 55ed6d56..343b00a0 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -1,10 +1,16 @@ use crate::prelude::*; +pub const DEMOPAGE_MODULE: &str = "pagetop::module::demopage"; + localize!("src/base/module/demopage/locales"); pub struct Demopage; impl ModuleTrait for Demopage { + fn handler(&self) -> &'static str { + DEMOPAGE_MODULE + } + fn name(&self) -> String { l("module_name") } diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs index 6936a019..f3c90f9b 100644 --- a/pagetop/src/base/theme/aliner/mod.rs +++ b/pagetop/src/base/theme/aliner/mod.rs @@ -1,10 +1,16 @@ use crate::prelude::*; +pub const ALINER_THEME: &str = "pagetop::theme::aliner"; + include!(concat!(env!("OUT_DIR"), "/aliner.rs")); pub struct Aliner; impl ThemeTrait for Aliner { + fn handler(&self) -> &'static str { + ALINER_THEME + } + fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/aliner"); } diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index 0445356b..a8be7118 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +pub const BOOTSIER_THEME: &str = "pagetop::theme::bootsier"; + include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); localize!("src/base/theme/bootsier/locales"); @@ -7,6 +9,10 @@ localize!("src/base/theme/bootsier/locales"); pub struct Bootsier; impl ThemeTrait for Bootsier { + fn handler(&self) -> &'static str { + BOOTSIER_THEME + } + fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/bootsier"); } diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 1a36fe7d..477dbbf7 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -1,10 +1,16 @@ use crate::prelude::*; +pub const BULMIX_THEME: &str = "pagetop::theme::bulmix"; + include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); pub struct Bulmix; impl ThemeTrait for Bulmix { + fn handler(&self) -> &'static str { + BULMIX_THEME + } + fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/bulmix"); } @@ -29,12 +35,12 @@ impl ThemeTrait for Bulmix { component: &mut dyn ComponentTrait, _assets: &mut Assets ) { - match component.type_name() { - grid::TYPENAME_ROW => { + match component.handler() { + grid::ROW_COMPONENT => { let row = component_mut::<grid::Row>(component); row.alter_classes("columns", ClassesOp::SetDefault); }, - grid::TYPENAME_COLUMN => { + grid::COLUMN_COMPONENT => { let col = component_mut::<grid::Column>(component); col.alter_classes("column", ClassesOp::SetDefault); }, diff --git a/pagetop/src/base/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal/mod.rs index d2124fb6..e86e1719 100644 --- a/pagetop/src/base/theme/minimal/mod.rs +++ b/pagetop/src/base/theme/minimal/mod.rs @@ -1,6 +1,11 @@ use crate::prelude::*; +pub const MINIMAL_THEME: &str = "pagetop::theme::minimal"; + pub struct Minimal; impl ThemeTrait for Minimal { + fn handler(&self) -> &'static str { + MINIMAL_THEME + } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index a20d1563..357c31cf 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -21,7 +21,6 @@ pub use crate::{ }; pub use crate::{action_item, api::{ - TypeId, action::*, component::*, module::*, diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index 7fe35a7f..7869987c 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -1,6 +1,8 @@ use crate::api::action::{ActionTrait, AnyAction}; use super::Page; +pub const BEFORE_RENDER_PAGE_ACTION: &str = "pagetop::action::before_render_page"; + pub struct ActionBeforeRenderPage { action: Option<fn(&mut Page)>, weight: isize, @@ -14,6 +16,10 @@ impl ActionTrait for ActionBeforeRenderPage { } } + fn handler(&self) -> &'static str { + BEFORE_RENDER_PAGE_ACTION + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index 30f95d72..e08e55f0 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -1,5 +1,8 @@ mod action; -pub use action::ActionBeforeRenderPage; +pub use action::{ + BEFORE_RENDER_PAGE_ACTION, + ActionBeforeRenderPage, +}; mod page; pub use page::Page; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index 99a81cb3..a4fc741b 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,9 +1,9 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::*; -use crate::api::{TypeId, action::{action_ref, run_actions}}; +use crate::api::action::{action_ref, run_actions}; use crate::api::component::*; -use super::ActionBeforeRenderPage; +use super::{BEFORE_RENDER_PAGE_ACTION, ActionBeforeRenderPage}; use std::collections::HashMap; @@ -152,7 +152,7 @@ impl<'a> Page<'a> { pub fn render(&mut self) -> app::Result<Markup> { // Acciones de los módulos antes de renderizar la página. run_actions( - TypeId::of::<ActionBeforeRenderPage>(), + BEFORE_RENDER_PAGE_ACTION, |a| action_ref::<ActionBeforeRenderPage>(&**a).run(self) ); diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index f87b67fc..f4f683bf 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -46,3 +46,7 @@ pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { } &type_name[(positions[last - 1].0 + 2)..] } + +pub fn single_type_name<T: ?Sized>() -> &'static str { + partial_type_name(std::any::type_name::<T>(), 1) +} From 5e8a1f75fd1883d61be908a7c21129baf5f59001 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 7 May 2022 23:25:54 +0200 Subject: [PATCH 082/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/src/api/action/mod.rs | 16 ++++------------ pagetop/src/api/component/mod.rs | 8 ++------ pagetop/src/lib.rs | 2 +- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 1888cacc..912c3477 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.11" +version = "0.0.12" edition = "2021" authors = [ diff --git a/pagetop/src/api/action/mod.rs b/pagetop/src/api/action/mod.rs index 59310a8a..53e32f8d 100644 --- a/pagetop/src/api/action/mod.rs +++ b/pagetop/src/api/action/mod.rs @@ -6,17 +6,9 @@ pub use definition::{ }; mod holder; -pub use holder::{ - ActionItem, -}; -use holder::{ - ActionsHolder, -}; +pub use holder::ActionItem; +use holder::ActionsHolder; mod all; -pub use all::{ - run_actions, -}; -pub(crate) use all::{ - add_action, -}; +pub use all::run_actions; +pub(crate) use all::add_action; diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/api/component/mod.rs index 95044f52..a8ee3c4d 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/api/component/mod.rs @@ -19,14 +19,10 @@ pub use definition::{ component_ref, component_mut, }; -use definition::{ - render_component, -}; +use definition::render_component; mod holder; -pub use holder::{ - ComponentsHolder, -}; +pub use holder::ComponentsHolder; mod all; pub use all::{ diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index fd843285..2c298184 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,8 +1,8 @@ // External. +pub use once_cell::sync::Lazy; pub use concat_string::concat_string; pub use doc_comment::doc_comment; -pub use once_cell::sync::Lazy; // Local. From 3366a6acdc3870b793efc31930796aab1003e30b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 7 May 2022 23:51:04 +0200 Subject: [PATCH 083/853] =?UTF-8?q?Actualiza=20textos=20y=20formato=20del?= =?UTF-8?q?=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/api/action/holder.rs | 6 +----- pagetop/src/api/component/assets.rs | 9 ++++++--- pagetop/src/api/component/definition.rs | 2 +- pagetop/src/api/mod.rs | 6 +++--- pagetop/src/api/module/definition.rs | 3 +-- pagetop/src/api/theme/definition.rs | 3 +-- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/menu.rs | 2 +- pagetop/src/lib.rs | 4 ++-- 9 files changed, 17 insertions(+), 20 deletions(-) diff --git a/pagetop/src/api/action/holder.rs b/pagetop/src/api/action/holder.rs index ab3e2405..7009e103 100644 --- a/pagetop/src/api/action/holder.rs +++ b/pagetop/src/api/action/holder.rs @@ -30,11 +30,7 @@ impl ActionsHolder { actions.sort_by_key(|a| a.weight()); } - pub fn iter_map<B, F>(&self, f: F) - where - Self: Sized, - F: FnMut(&ActionItem) -> B, - { + pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&ActionItem) -> B { let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); } } diff --git a/pagetop/src/api/component/assets.rs b/pagetop/src/api/component/assets.rs index 30a6e4b1..aa05ebd5 100644 --- a/pagetop/src/api/component/assets.rs +++ b/pagetop/src/api/component/assets.rs @@ -1,4 +1,4 @@ -use crate::{Lazy, base, concat_string}; +use crate::{Lazy, base, concat_string, util}; use crate::config::SETTINGS; use crate::html::{Markup, PreEscaped, html}; use crate::api::theme::*; @@ -281,11 +281,14 @@ impl Assets { // Assets EXTRAS. - pub fn serial_id(&mut self, prefix: &str, id: &Option<String>) -> String { + pub fn required_id<T>(&mut self, id: &Option<String>) -> String { match id { Some(id) => id.to_string(), None => { - let prefix = prefix.trim().replace(" ", "_").to_lowercase(); + let prefix = util::single_type_name::<T>() + .trim() + .replace(" ", "_") + .to_lowercase(); let prefix = if prefix.is_empty() { "prefix".to_owned() } else { diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/api/component/definition.rs index a807a36f..4381b08e 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/api/component/definition.rs @@ -1,6 +1,6 @@ +use crate::util; use crate::html::{Markup, html}; use crate::api::action::{action_ref, run_actions}; -use crate::util; use super::{BEFORE_RENDER_COMPONENT_ACTION, BeforeRenderComponentAction}; use super::Assets; diff --git a/pagetop/src/api/mod.rs b/pagetop/src/api/mod.rs index b69ec91b..ff5daff9 100644 --- a/pagetop/src/api/mod.rs +++ b/pagetop/src/api/mod.rs @@ -1,4 +1,4 @@ pub mod action; // API to define functions that alter the behavior of PageTop core. -pub mod component; // API para crear nuevos componentes. -pub mod module; // API para añadir módulos con nuevas funcionalidades. -pub mod theme; // API para crear temas. +pub mod component; // API to build new components. +pub mod module; // API to add new features with modules. +pub mod theme; // API to create themes. diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/api/module/definition.rs index 7ee26e5d..1deb7d80 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -1,6 +1,5 @@ -use crate::app; +use crate::{app, util}; use crate::api::action::ActionItem; -use crate::util; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db::MigrationItem; diff --git a/pagetop/src/api/theme/definition.rs b/pagetop/src/api/theme/definition.rs index 6bfa63d5..e063b355 100644 --- a/pagetop/src/api/theme/definition.rs +++ b/pagetop/src/api/theme/definition.rs @@ -1,10 +1,9 @@ -use crate::{app, concat_string}; +use crate::{app, concat_string, util}; use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::api::component::{Assets, ComponentTrait, Favicon}; use crate::response::page::Page; use crate::base::component::Chunck; -use crate::util; /// Los temas deben implementar este "trait". pub trait ThemeTrait: Send + Sync { diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index dafe4497..4f120434 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -38,7 +38,7 @@ impl ComponentTrait for Block { } fn default_render(&self, assets: &mut Assets) -> Markup { - let id = assets.serial_id("block", self.id()); + let id = assets.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes()] { @match self.title() { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 0434b90f..450bc92e 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -219,7 +219,7 @@ impl ComponentTrait for Menu { )) .add_jquery(); - let id = assets.serial_id("menu", self.id()); + let id = assets.required_id::<Menu>(self.id()); html! { ul id=(id) class=[self.classes()] { (self.items().render(assets)) diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 2c298184..20a25229 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,4 +1,4 @@ -// External. +// External re-exports. pub use once_cell::sync::Lazy; pub use concat_string::concat_string; @@ -25,6 +25,6 @@ pub mod app; // Aplicación y servidor web. pub mod base; // Base de componentes, módulos y temas. pub mod util; // Macros y funciones útiles. -// Re-exports. +// Internal re-exports. pub mod prelude; From af9afca77796bab0c1cad3a32db556b1c01c53bd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 8 May 2022 01:02:07 +0200 Subject: [PATCH 084/853] =?UTF-8?q?Modifica=20identificaci=C3=B3n=20de=20m?= =?UTF-8?q?=C3=B3dulos=20y=20temas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 6 +++--- pagetop/src/api/component/assets.rs | 4 ++-- pagetop/src/api/module/all.rs | 4 ++-- pagetop/src/api/module/definition.rs | 18 ++++++++++++++---- pagetop/src/api/module/mod.rs | 9 +++++++-- pagetop/src/api/theme/all.rs | 6 +++--- pagetop/src/api/theme/definition.rs | 14 ++++++++++++-- pagetop/src/api/theme/mod.rs | 7 +++++-- pagetop/src/app/application.rs | 2 +- 9 files changed, 49 insertions(+), 21 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 27bb0886..6b610c8b 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,9 +1,9 @@ use pagetop::prelude::*; fn bootstrap() { - register_module(&pagetop_admin::Admin); - register_module(&pagetop_user::User); - register_module(&pagetop_node::Node); + include_module(&pagetop_admin::Admin); + include_module(&pagetop_user::User); + include_module(&pagetop_node::Node); } #[actix_web::main] diff --git a/pagetop/src/api/component/assets.rs b/pagetop/src/api/component/assets.rs index aa05ebd5..1ff78d23 100644 --- a/pagetop/src/api/component/assets.rs +++ b/pagetop/src/api/component/assets.rs @@ -4,7 +4,7 @@ use crate::html::{Markup, PreEscaped, html}; use crate::api::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - match theme_by_name(&SETTINGS.app.theme) { + match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, } @@ -197,7 +197,7 @@ impl Assets { } pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = theme_by_name(theme_name).unwrap_or(*DEFAULT_THEME); + self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); self } diff --git a/pagetop/src/api/module/all.rs b/pagetop/src/api/module/all.rs index 1bb6ea7d..778dba2e 100644 --- a/pagetop/src/api/module/all.rs +++ b/pagetop/src/api/module/all.rs @@ -10,7 +10,7 @@ static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { RwLock::new(Vec::new()) }); -pub fn register_module(module: &'static dyn ModuleTrait) { +pub fn include_module(module: &'static dyn ModuleTrait) { let mut list: Vec<&dyn ModuleTrait> = Vec::new(); add_to(&mut list, module); list.reverse(); @@ -20,7 +20,7 @@ pub fn register_module(module: &'static dyn ModuleTrait) { fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { if !MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) { if !list.iter().any(|m| m.handler() == module.handler()) { - trace::debug!("Register module: \"{}\"", module.name()); + trace::debug!("Including module \"{}\"", module.single_name()); list.push(module); let mut dependencies = module.dependencies(); diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/api/module/definition.rs index 1deb7d80..e457e3f0 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/api/module/definition.rs @@ -4,18 +4,26 @@ use crate::api::action::ActionItem; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db::MigrationItem; +pub trait BaseModule { + fn single_name(&self) -> &'static str; +} + /// Los módulos deben implementar este *trait*. -pub trait ModuleTrait: Send + Sync { +pub trait ModuleTrait: BaseModule + Send + Sync { fn handler(&self) -> &'static str; fn name(&self) -> String { - util::single_type_name::<Self>().to_owned() + self.single_name().to_owned() } fn description(&self) -> Option<String> { None } + fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { + vec![] + } + #[allow(unused_variables)] fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { } @@ -29,8 +37,10 @@ pub trait ModuleTrait: Send + Sync { fn migrations(&self) -> Vec<MigrationItem> { vec![] } +} - fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { - vec![] +impl<M: ?Sized + ModuleTrait> BaseModule for M { + fn single_name(&self) -> &'static str { + util::single_type_name::<Self>() } } diff --git a/pagetop/src/api/module/mod.rs b/pagetop/src/api/module/mod.rs index b4a97393..9c186aea 100644 --- a/pagetop/src/api/module/mod.rs +++ b/pagetop/src/api/module/mod.rs @@ -1,5 +1,10 @@ mod definition; -pub use definition::ModuleTrait; +pub use definition::{ + BaseModule, + ModuleTrait, +}; pub(crate) mod all; -pub use all::register_module; +pub use all::{ + include_module, +}; diff --git a/pagetop/src/api/theme/all.rs b/pagetop/src/api/theme/all.rs index b1e47307..c4bb54fe 100644 --- a/pagetop/src/api/theme/all.rs +++ b/pagetop/src/api/theme/all.rs @@ -13,14 +13,14 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { pub fn register_theme(theme: &'static dyn ThemeTrait) { let mut themes = THEMES.write().unwrap(); if !themes.iter().any(|t| t.handler() == theme.handler()) { - trace::debug!("Register theme: \"{}\"", theme.name()); + trace::debug!("Registering theme \"{}\"", theme.single_name()); themes.push(theme); } } -pub fn theme_by_name(name: &str) -> Option<&'static dyn ThemeTrait> { +pub fn theme_by_single_name(single_name: &str) -> Option<&'static dyn ThemeTrait> { match THEMES.write().unwrap().iter().find( - |t| t.name().to_lowercase() == name.to_lowercase() + |t| t.single_name().to_lowercase() == single_name.to_lowercase() ) { Some(theme) => Some(*theme), _ => None, diff --git a/pagetop/src/api/theme/definition.rs b/pagetop/src/api/theme/definition.rs index e063b355..d5ca1db0 100644 --- a/pagetop/src/api/theme/definition.rs +++ b/pagetop/src/api/theme/definition.rs @@ -5,12 +5,16 @@ use crate::api::component::{Assets, ComponentTrait, Favicon}; use crate::response::page::Page; use crate::base::component::Chunck; +pub trait BaseTheme { + fn single_name(&self) -> &'static str; +} + /// Los temas deben implementar este "trait". -pub trait ThemeTrait: Send + Sync { +pub trait ThemeTrait: BaseTheme + Send + Sync { fn handler(&self) -> &'static str; fn name(&self) -> String { - util::single_type_name::<Self>().to_owned() + self.single_name().to_owned() } fn description(&self) -> Option<String> { @@ -130,3 +134,9 @@ pub trait ThemeTrait: Send + Sync { .render() } } + +impl<T: ?Sized + ThemeTrait> BaseTheme for T { + fn single_name(&self) -> &'static str { + util::single_type_name::<Self>() + } +} diff --git a/pagetop/src/api/theme/mod.rs b/pagetop/src/api/theme/mod.rs index 4456189e..ccb55a6d 100644 --- a/pagetop/src/api/theme/mod.rs +++ b/pagetop/src/api/theme/mod.rs @@ -1,8 +1,11 @@ mod definition; -pub use definition::ThemeTrait; +pub use definition::{ + BaseTheme, + ThemeTrait, +}; pub(crate) mod all; pub use all::{ register_theme, - theme_by_name, + theme_by_single_name, }; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 98a49f80..6432e265 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -40,7 +40,7 @@ impl Application { // Registra el módulo de presentación de PageTop. // Normalmente se sobrecargará en la función de inicio. - module::register_module(&base::module::demopage::Demopage); + module::include_module(&base::module::demopage::Demopage); // Registra las acciones de todos los módulos. module::all::register_actions(); From fcc022d164da07d483190b63b0d95eb5a4ff9cd7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 8 May 2022 11:10:18 +0200 Subject: [PATCH 085/853] =?UTF-8?q?Modifica=20la=20estructura=20de=20prepa?= =?UTF-8?q?raci=C3=B3n=20de=20una=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 18 ++++-- pagetop-admin/src/lib.rs | 4 +- pagetop-node/src/lib.rs | 4 +- pagetop/src/api/action/definition.rs | 17 ------ pagetop/src/api/action/mod.rs | 14 ----- pagetop/src/api/component/action.rs | 48 ---------------- pagetop/src/base/component/form/form.rs | 2 +- pagetop/src/{ => core}/app/application.rs | 56 ++++++++++--------- pagetop/src/{ => core}/app/banner/mod.rs | 0 pagetop/src/{ => core}/app/banner/slant.flf | 0 pagetop/src/{ => core}/app/banner/small.flf | 0 pagetop/src/{ => core}/app/banner/speed.flf | 0 .../src/{ => core}/app/banner/starwars.flf | 0 pagetop/src/{ => core}/app/db.rs | 0 pagetop/src/core/app/definition.rs | 19 +++++++ pagetop/src/{ => core}/app/locale.rs | 0 pagetop/src/{ => core}/app/mod.rs | 3 + pagetop/src/{ => core}/app/tracing.rs | 0 pagetop/src/{api => core}/component/all.rs | 0 pagetop/src/{api => core}/component/assets.rs | 2 +- .../src/{api => core}/component/definition.rs | 10 ++-- pagetop/src/{api => core}/component/holder.rs | 0 pagetop/src/core/component/hook.rs | 48 ++++++++++++++++ pagetop/src/{api => core}/component/mod.rs | 8 +-- pagetop/src/{api/action => core/hook}/all.rs | 10 ++-- pagetop/src/core/hook/definition.rs | 17 ++++++ .../src/{api/action => core/hook}/holder.rs | 22 ++++---- pagetop/src/core/hook/mod.rs | 14 +++++ pagetop/src/{api => core}/mod.rs | 3 +- pagetop/src/{api => core}/module/all.rs | 42 +++++++++----- .../src/{api => core}/module/definition.rs | 7 ++- pagetop/src/{api => core}/module/mod.rs | 4 +- pagetop/src/{api => core}/theme/all.rs | 9 ++- pagetop/src/{api => core}/theme/definition.rs | 5 +- pagetop/src/{api => core}/theme/mod.rs | 1 + pagetop/src/lib.rs | 4 +- pagetop/src/locale.rs | 2 +- pagetop/src/prelude.rs | 11 ++-- pagetop/src/response/page/action.rs | 48 ---------------- pagetop/src/response/page/hook.rs | 48 ++++++++++++++++ pagetop/src/response/page/mod.rs | 8 +-- pagetop/src/response/page/page.rs | 15 ++--- 42 files changed, 295 insertions(+), 228 deletions(-) delete mode 100644 pagetop/src/api/action/definition.rs delete mode 100644 pagetop/src/api/action/mod.rs delete mode 100644 pagetop/src/api/component/action.rs rename pagetop/src/{ => core}/app/application.rs (57%) rename pagetop/src/{ => core}/app/banner/mod.rs (100%) rename pagetop/src/{ => core}/app/banner/slant.flf (100%) rename pagetop/src/{ => core}/app/banner/small.flf (100%) rename pagetop/src/{ => core}/app/banner/speed.flf (100%) rename pagetop/src/{ => core}/app/banner/starwars.flf (100%) rename pagetop/src/{ => core}/app/db.rs (100%) create mode 100644 pagetop/src/core/app/definition.rs rename pagetop/src/{ => core}/app/locale.rs (100%) rename pagetop/src/{ => core}/app/mod.rs (85%) rename pagetop/src/{ => core}/app/tracing.rs (100%) rename pagetop/src/{api => core}/component/all.rs (100%) rename pagetop/src/{api => core}/component/assets.rs (99%) rename pagetop/src/{api => core}/component/definition.rs (86%) rename pagetop/src/{api => core}/component/holder.rs (100%) create mode 100644 pagetop/src/core/component/hook.rs rename pagetop/src/{api => core}/component/mod.rs (82%) rename pagetop/src/{api/action => core/hook}/all.rs (58%) create mode 100644 pagetop/src/core/hook/definition.rs rename pagetop/src/{api/action => core/hook}/holder.rs (50%) create mode 100644 pagetop/src/core/hook/mod.rs rename pagetop/src/{api => core}/mod.rs (57%) rename pagetop/src/{api => core}/module/all.rs (54%) rename pagetop/src/{api => core}/module/definition.rs (89%) rename pagetop/src/{api => core}/module/mod.rs (65%) rename pagetop/src/{api => core}/theme/all.rs (83%) rename pagetop/src/{api => core}/theme/definition.rs (96%) rename pagetop/src/{api => core}/theme/mod.rs (88%) delete mode 100644 pagetop/src/response/page/action.rs create mode 100644 pagetop/src/response/page/hook.rs diff --git a/drust/src/main.rs b/drust/src/main.rs index 6b610c8b..66a8d192 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,12 +1,18 @@ -use pagetop::prelude::*; +use pagetop::{prelude::*, core::app::AppTrait}; -fn bootstrap() { - include_module(&pagetop_admin::Admin); - include_module(&pagetop_user::User); - include_module(&pagetop_node::Node); +struct Drust; + +impl AppTrait for Drust { + fn enabled_modules(&self) -> Vec<&'static dyn ModuleTrait> { + vec![ + &pagetop_admin::Admin, + &pagetop_user::User, + &pagetop_node::Node, + ] + } } #[actix_web::main] async fn main() -> std::io::Result<()> { - Application::prepare(UsingBootstrap::Fn(bootstrap)).await?.run()?.await + Application::prepare(Drust).await?.run()?.await } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index d05138b4..d495ecaf 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -28,9 +28,9 @@ impl ModuleTrait for Admin { ); } - fn actions(&self) -> Vec<ActionItem> { + fn actions(&self) -> Vec<HookItem> { vec![ - action_item!(ActionBeforeRenderPage => before_render_page) + hook_item!(BeforeRenderPageHook => before_render_page) ] } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 98af01bd..5556fefe 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -26,9 +26,9 @@ impl ModuleTrait for Node { cfg.route("/node", app::web::get().to(node)); } - fn actions(&self) -> Vec<ActionItem> { + fn actions(&self) -> Vec<HookItem> { vec![ - action_item!(ActionBeforeRenderPage => before_render_page, -1) + hook_item!(BeforeRenderPageHook => before_render_page, -1) ] } diff --git a/pagetop/src/api/action/definition.rs b/pagetop/src/api/action/definition.rs deleted file mode 100644 index 1c950686..00000000 --- a/pagetop/src/api/action/definition.rs +++ /dev/null @@ -1,17 +0,0 @@ -pub use std::any::Any as AnyAction; - -pub trait ActionTrait: AnyAction + Send + Sync { - fn new() -> Self where Self: Sized; - - fn handler(&self) -> &'static str; - - fn weight(&self) -> isize { - 0 - } - - fn as_ref_any(&self) -> &dyn AnyAction; -} - -pub fn action_ref<A: 'static>(action: &dyn ActionTrait) -> &A { - action.as_ref_any().downcast_ref::<A>().unwrap() -} diff --git a/pagetop/src/api/action/mod.rs b/pagetop/src/api/action/mod.rs deleted file mode 100644 index 53e32f8d..00000000 --- a/pagetop/src/api/action/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -mod definition; -pub use definition::{ - ActionTrait, - AnyAction, - action_ref, -}; - -mod holder; -pub use holder::ActionItem; -use holder::ActionsHolder; - -mod all; -pub use all::run_actions; -pub(crate) use all::add_action; diff --git a/pagetop/src/api/component/action.rs b/pagetop/src/api/component/action.rs deleted file mode 100644 index 243646cc..00000000 --- a/pagetop/src/api/component/action.rs +++ /dev/null @@ -1,48 +0,0 @@ -use crate::api::action::{ActionTrait, AnyAction}; -use super::{Assets, ComponentTrait}; - -pub const BEFORE_RENDER_COMPONENT_ACTION: &str = "pagetop::action::before_render_component"; - -pub struct BeforeRenderComponentAction { - action: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, - weight: isize, -} - -impl ActionTrait for BeforeRenderComponentAction { - fn new() -> Self { - BeforeRenderComponentAction { - action: None, - weight: 0, - } - } - - fn handler(&self) -> &'static str { - BEFORE_RENDER_COMPONENT_ACTION - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } -} - -impl BeforeRenderComponentAction { - pub fn with_action(mut self, action: fn(&mut dyn ComponentTrait, &mut Assets)) -> Self { - self.action = Some(action); - self - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, component: &mut dyn ComponentTrait, assets: &mut Assets) { - if let Some(action) = self.action { - action(component, assets) - } - } -} diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index dcf209b0..189eb0c4 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -95,7 +95,7 @@ impl Form { self } - pub fn with_action(mut self, action: &str) -> Self { + pub fn with_hook(mut self, action: &str) -> Self { self.alter_action(action); self } diff --git a/pagetop/src/app/application.rs b/pagetop/src/core/app/application.rs similarity index 57% rename from pagetop/src/app/application.rs rename to pagetop/src/core/app/application.rs index 6432e265..01af2c5b 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/core/app/application.rs @@ -1,57 +1,63 @@ -use crate::{Lazy, app, base, trace}; +use crate::{Lazy, base, trace}; use crate::config::SETTINGS; -use crate::api::{module, theme}; +use crate::core::{module, theme}; +use super::AppTrait; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; pub struct Application { - server: app::Server, + server: super::Server, } -pub enum UsingBootstrap {Fn(fn()), No} - impl Application { - pub async fn prepare(bootstrap: UsingBootstrap) -> Result<Self, Error> { + pub async fn prepare(brrrz: impl AppTrait) -> Result<Self, Error> { // Rótulo de presentación. - app::banner::print_on_startup(); + super::banner::print_on_startup(); // Inicia registro de trazas y eventos. - Lazy::force(&app::tracing::TRACING); + Lazy::force(&super::tracing::TRACING); // Valida el identificador de idioma. - Lazy::force(&app::locale::LANGID); + Lazy::force(&super::locale::LANGID); // Conecta con la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - Lazy::force(&app::db::DBCONN); + Lazy::force(&super::db::DBCONN); // Registra los temas predeterminados. - theme::register_theme(&base::theme::aliner::Aliner); - theme::register_theme(&base::theme::minimal::Minimal); - theme::register_theme(&base::theme::bootsier::Bootsier); - theme::register_theme(&base::theme::bulmix::Bulmix); + theme::register_themes(vec![ + &base::theme::aliner::Aliner, + &base::theme::minimal::Minimal, + &base::theme::bootsier::Bootsier, + &base::theme::bulmix::Bulmix, + ]); + theme::register_themes(brrrz.register_themes()); + + // Habilita los módulos predeterminados. + module::enable_modules(brrrz.enabled_modules()); + // Habilita el módulo de presentación de PageTop. + // Normalmente se sobrecargará en la función de inicio. + module::enable_module(&base::module::demopage::Demopage); + + // Registra las acciones de todos los módulos. + module::all::register_hooks(); // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); + brrrz.bootstrap(); + /* if let UsingBootstrap::Fn(bootstrap) = bootstrap { let _ = &bootstrap(); - } - - // Registra el módulo de presentación de PageTop. - // Normalmente se sobrecargará en la función de inicio. - module::include_module(&base::module::demopage::Demopage); - - // Registra las acciones de todos los módulos. - module::all::register_actions(); + }*/ // Actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] module::all::run_migrations(); // Prepara el servidor web. - let server = app::HttpServer::new(move || { - app::App::new() + let server = super::HttpServer::new(move || { + super::App::new() .wrap(tracing_actix_web::TracingLogger) .wrap(NormalizePath::new(TrailingSlash::Trim)) .configure(&module::all::modules) @@ -66,7 +72,7 @@ impl Application { Ok(Self { server }) } - pub fn run(self) -> Result<app::Server, Error> { + pub fn run(self) -> Result<super::Server, Error> { Ok(self.server) } } diff --git a/pagetop/src/app/banner/mod.rs b/pagetop/src/core/app/banner/mod.rs similarity index 100% rename from pagetop/src/app/banner/mod.rs rename to pagetop/src/core/app/banner/mod.rs diff --git a/pagetop/src/app/banner/slant.flf b/pagetop/src/core/app/banner/slant.flf similarity index 100% rename from pagetop/src/app/banner/slant.flf rename to pagetop/src/core/app/banner/slant.flf diff --git a/pagetop/src/app/banner/small.flf b/pagetop/src/core/app/banner/small.flf similarity index 100% rename from pagetop/src/app/banner/small.flf rename to pagetop/src/core/app/banner/small.flf diff --git a/pagetop/src/app/banner/speed.flf b/pagetop/src/core/app/banner/speed.flf similarity index 100% rename from pagetop/src/app/banner/speed.flf rename to pagetop/src/core/app/banner/speed.flf diff --git a/pagetop/src/app/banner/starwars.flf b/pagetop/src/core/app/banner/starwars.flf similarity index 100% rename from pagetop/src/app/banner/starwars.flf rename to pagetop/src/core/app/banner/starwars.flf diff --git a/pagetop/src/app/db.rs b/pagetop/src/core/app/db.rs similarity index 100% rename from pagetop/src/app/db.rs rename to pagetop/src/core/app/db.rs diff --git a/pagetop/src/core/app/definition.rs b/pagetop/src/core/app/definition.rs new file mode 100644 index 00000000..7c13f9b0 --- /dev/null +++ b/pagetop/src/core/app/definition.rs @@ -0,0 +1,19 @@ +use crate::core::module::ModuleTrait; +use crate::core::theme::ThemeTrait; + +pub trait AppTrait: Send + Sync { + fn bootstrap(&self) { + } + + fn enabled_modules(&self) -> Vec<&'static dyn ModuleTrait> { + vec![] + } + + fn disabled_modules(&self) -> Vec<&'static dyn ModuleTrait> { + vec![] + } + + fn register_themes(&self) -> Vec<&'static dyn ThemeTrait> { + vec![] + } +} diff --git a/pagetop/src/app/locale.rs b/pagetop/src/core/app/locale.rs similarity index 100% rename from pagetop/src/app/locale.rs rename to pagetop/src/core/app/locale.rs diff --git a/pagetop/src/app/mod.rs b/pagetop/src/core/app/mod.rs similarity index 85% rename from pagetop/src/app/mod.rs rename to pagetop/src/core/app/mod.rs index 07404f64..04feaf83 100644 --- a/pagetop/src/app/mod.rs +++ b/pagetop/src/core/app/mod.rs @@ -12,4 +12,7 @@ pub mod locale; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; +mod definition; +pub use definition::AppTrait; + pub mod application; diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/core/app/tracing.rs similarity index 100% rename from pagetop/src/app/tracing.rs rename to pagetop/src/core/app/tracing.rs diff --git a/pagetop/src/api/component/all.rs b/pagetop/src/core/component/all.rs similarity index 100% rename from pagetop/src/api/component/all.rs rename to pagetop/src/core/component/all.rs diff --git a/pagetop/src/api/component/assets.rs b/pagetop/src/core/component/assets.rs similarity index 99% rename from pagetop/src/api/component/assets.rs rename to pagetop/src/core/component/assets.rs index 1ff78d23..1274348d 100644 --- a/pagetop/src/api/component/assets.rs +++ b/pagetop/src/core/component/assets.rs @@ -1,7 +1,7 @@ use crate::{Lazy, base, concat_string, util}; use crate::config::SETTINGS; use crate::html::{Markup, PreEscaped, html}; -use crate::api::theme::*; +use crate::core::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { match theme_by_single_name(&SETTINGS.app.theme) { diff --git a/pagetop/src/api/component/definition.rs b/pagetop/src/core/component/definition.rs similarity index 86% rename from pagetop/src/api/component/definition.rs rename to pagetop/src/core/component/definition.rs index 4381b08e..45fa3e91 100644 --- a/pagetop/src/api/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,7 @@ use crate::util; use crate::html::{Markup, html}; -use crate::api::action::{action_ref, run_actions}; -use super::{BEFORE_RENDER_COMPONENT_ACTION, BeforeRenderComponentAction}; +use crate::core::hook::{hook_ref, run_hooks}; +use super::{BEFORE_RENDER_COMPONENT_HOOK, BeforeRenderComponentHook}; use super::Assets; pub use std::any::Any as AnyComponent; @@ -54,9 +54,9 @@ pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut Assets) component.before_render(assets); // Acciones de los módulos antes de renderizar el componente. - run_actions( - BEFORE_RENDER_COMPONENT_ACTION, - |a| action_ref::<BeforeRenderComponentAction>(&**a).run(component, assets) + run_hooks( + BEFORE_RENDER_COMPONENT_HOOK, + |a| hook_ref::<BeforeRenderComponentHook>(&**a).run(component, assets) ); // Acciones del tema antes de renderizar el componente. diff --git a/pagetop/src/api/component/holder.rs b/pagetop/src/core/component/holder.rs similarity index 100% rename from pagetop/src/api/component/holder.rs rename to pagetop/src/core/component/holder.rs diff --git a/pagetop/src/core/component/hook.rs b/pagetop/src/core/component/hook.rs new file mode 100644 index 00000000..a35e09ad --- /dev/null +++ b/pagetop/src/core/component/hook.rs @@ -0,0 +1,48 @@ +use crate::core::hook::{HookTrait, AnyHook}; +use super::{Assets, ComponentTrait}; + +pub const BEFORE_RENDER_COMPONENT_HOOK: &str = "pagetop::action::before_render_component"; + +pub struct BeforeRenderComponentHook { + hook: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, + weight: isize, +} + +impl HookTrait for BeforeRenderComponentHook { + fn new() -> Self { + BeforeRenderComponentHook { + hook: None, + weight: 0, + } + } + + fn handler(&self) -> &'static str { + BEFORE_RENDER_COMPONENT_HOOK + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyHook { + self + } +} + +impl BeforeRenderComponentHook { + pub fn with_hook(mut self, hook: fn(&mut dyn ComponentTrait, &mut Assets)) -> Self { + self.hook = Some(hook); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, component: &mut dyn ComponentTrait, assets: &mut Assets) { + if let Some(hook) = self.hook { + hook(component, assets) + } + } +} diff --git a/pagetop/src/api/component/mod.rs b/pagetop/src/core/component/mod.rs similarity index 82% rename from pagetop/src/api/component/mod.rs rename to pagetop/src/core/component/mod.rs index a8ee3c4d..1f710deb 100644 --- a/pagetop/src/api/component/mod.rs +++ b/pagetop/src/core/component/mod.rs @@ -1,7 +1,7 @@ -mod action; -pub use action::{ - BEFORE_RENDER_COMPONENT_ACTION, - BeforeRenderComponentAction, +mod hook; +pub use hook::{ + BEFORE_RENDER_COMPONENT_HOOK, + BeforeRenderComponentHook, }; mod assets; diff --git a/pagetop/src/api/action/all.rs b/pagetop/src/core/hook/all.rs similarity index 58% rename from pagetop/src/api/action/all.rs rename to pagetop/src/core/hook/all.rs index cb9bfb8d..2329b251 100644 --- a/pagetop/src/api/action/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,25 +1,25 @@ use crate::Lazy; -use super::{ActionItem, ActionsHolder}; +use super::{HookItem, HooksHolder}; use std::sync::RwLock; use std::collections::HashMap; // Registered actions. -static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = Lazy::new(|| { +static ACTIONS: Lazy<RwLock<HashMap<&str, HooksHolder>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); -pub fn add_action(action: ActionItem) { +pub fn add_hook(action: HookItem) { let mut hmap = ACTIONS.write().unwrap(); let action_handler = action.handler(); if let Some(actions) = hmap.get_mut(action_handler) { actions.add(action); } else { - hmap.insert(action_handler, ActionsHolder::new_with(action)); + hmap.insert(action_handler, HooksHolder::new_with(action)); } } -pub fn run_actions<B, F>(action_handler: &str, f: F) where F: FnMut(&ActionItem) -> B { +pub fn run_hooks<B, F>(action_handler: &str, f: F) where F: FnMut(&HookItem) -> B { if let Some(actions) = ACTIONS.read().unwrap().get(action_handler) { actions.iter_map(f) } diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs new file mode 100644 index 00000000..823e830e --- /dev/null +++ b/pagetop/src/core/hook/definition.rs @@ -0,0 +1,17 @@ +pub use std::any::Any as AnyHook; + +pub trait HookTrait: AnyHook + Send + Sync { + fn new() -> Self where Self: Sized; + + fn handler(&self) -> &'static str; + + fn weight(&self) -> isize { + 0 + } + + fn as_ref_any(&self) -> &dyn AnyHook; +} + +pub fn hook_ref<A: 'static>(action: &dyn HookTrait) -> &A { + action.as_ref_any().downcast_ref::<A>().unwrap() +} diff --git a/pagetop/src/api/action/holder.rs b/pagetop/src/core/hook/holder.rs similarity index 50% rename from pagetop/src/api/action/holder.rs rename to pagetop/src/core/hook/holder.rs index 7009e103..3cd6d369 100644 --- a/pagetop/src/api/action/holder.rs +++ b/pagetop/src/core/hook/holder.rs @@ -1,36 +1,36 @@ -use super::ActionTrait; +use super::HookTrait; use std::sync::{Arc, RwLock}; -pub type ActionItem = Box<dyn ActionTrait>; +pub type HookItem = Box<dyn HookTrait>; #[macro_export] -macro_rules! action_item { +macro_rules! hook_item { ( $action:ident => $f:ident $(, $weight:expr)? ) => {{ - Box::new($action::new().with_action($f)$(.with_weight($weight))?) + Box::new($action::new().with_hook($f)$(.with_weight($weight))?) }}; } -pub struct ActionsHolder(Arc<RwLock<Vec<ActionItem>>>); +pub struct HooksHolder(Arc<RwLock<Vec<HookItem>>>); -impl ActionsHolder { +impl HooksHolder { pub fn new() -> Self { - ActionsHolder(Arc::new(RwLock::new(Vec::new()))) + HooksHolder(Arc::new(RwLock::new(Vec::new()))) } - pub fn new_with(action: ActionItem) -> Self { - let mut container = ActionsHolder::new(); + pub fn new_with(action: HookItem) -> Self { + let mut container = HooksHolder::new(); container.add(action); container } - pub fn add(&mut self, action: ActionItem) { + pub fn add(&mut self, action: HookItem) { let mut actions = self.0.write().unwrap(); actions.push(action); actions.sort_by_key(|a| a.weight()); } - pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&ActionItem) -> B { + pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&HookItem) -> B { let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); } } diff --git a/pagetop/src/core/hook/mod.rs b/pagetop/src/core/hook/mod.rs new file mode 100644 index 00000000..8b83a58d --- /dev/null +++ b/pagetop/src/core/hook/mod.rs @@ -0,0 +1,14 @@ +mod definition; +pub use definition::{ + HookTrait, + AnyHook, + hook_ref, +}; + +mod holder; +pub use holder::HookItem; +use holder::HooksHolder; + +mod all; +pub use all::run_hooks; +pub(crate) use all::add_hook; diff --git a/pagetop/src/api/mod.rs b/pagetop/src/core/mod.rs similarity index 57% rename from pagetop/src/api/mod.rs rename to pagetop/src/core/mod.rs index ff5daff9..e3208027 100644 --- a/pagetop/src/api/mod.rs +++ b/pagetop/src/core/mod.rs @@ -1,4 +1,5 @@ -pub mod action; // API to define functions that alter the behavior of PageTop core. +pub mod app; // API to initialize the PageTop base application. pub mod component; // API to build new components. +pub mod hook; // API to define functions that alter the behavior of PageTop core. pub mod module; // API to add new features with modules. pub mod theme; // API to create themes. diff --git a/pagetop/src/api/module/all.rs b/pagetop/src/core/module/all.rs similarity index 54% rename from pagetop/src/api/module/all.rs rename to pagetop/src/core/module/all.rs index 778dba2e..ac5e8144 100644 --- a/pagetop/src/api/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,26 +1,38 @@ -use crate::{Lazy, app, run_now, trace}; -use crate::api::action::add_action; +use crate::{Lazy, run_now, trace}; +use crate::core::app; +use crate::core::hook::add_hook; use crate::db::*; use super::ModuleTrait; use std::sync::RwLock; -// Módulos registrados. -static MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { +// Enabled modules. +static ENABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { RwLock::new(Vec::new()) }); -pub fn include_module(module: &'static dyn ModuleTrait) { +/* Disabled modules. +static DISABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { + RwLock::new(Vec::new()) +}); */ + +pub fn enable_modules(modules: Vec<&'static dyn ModuleTrait>) { + for m in modules { + enable_module(m) + } +} + +pub fn enable_module(module: &'static dyn ModuleTrait) { let mut list: Vec<&dyn ModuleTrait> = Vec::new(); add_to(&mut list, module); list.reverse(); - MODULES.write().unwrap().append(&mut list); + ENABLED_MODULES.write().unwrap().append(&mut list); } fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { - if !MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) { + if !ENABLED_MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) { if !list.iter().any(|m| m.handler() == module.handler()) { - trace::debug!("Including module \"{}\"", module.single_name()); + trace::debug!("Enabling module \"{}\"", module.single_name()); list.push(module); let mut dependencies = module.dependencies(); @@ -32,16 +44,20 @@ fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { } } +#[allow(unused_variables)] +pub fn disable_module(module: &'static dyn ModuleTrait) { +} + pub fn modules(cfg: &mut app::web::ServiceConfig) { - for m in MODULES.read().unwrap().iter() { + for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(cfg); } } -pub fn register_actions() { - for m in MODULES.read().unwrap().iter() { +pub fn register_hooks() { + for m in ENABLED_MODULES.read().unwrap().iter() { for a in m.actions().into_iter() { - add_action(a); + add_hook(a); } } } @@ -53,7 +69,7 @@ pub fn run_migrations() { impl MigratorTrait for Migrator { fn migrations() -> Vec<MigrationItem> { let mut migrations = vec![]; - for m in MODULES.read().unwrap().iter() { + for m in ENABLED_MODULES.read().unwrap().iter() { migrations.append(&mut m.migrations()); } migrations diff --git a/pagetop/src/api/module/definition.rs b/pagetop/src/core/module/definition.rs similarity index 89% rename from pagetop/src/api/module/definition.rs rename to pagetop/src/core/module/definition.rs index e457e3f0..89904cc0 100644 --- a/pagetop/src/api/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,6 @@ -use crate::{app, util}; -use crate::api::action::ActionItem; +use crate::util; +use crate::core::app; +use crate::core::hook::HookItem; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db::MigrationItem; @@ -28,7 +29,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { } - fn actions(&self) -> Vec<ActionItem> { + fn actions(&self) -> Vec<HookItem> { vec![] } diff --git a/pagetop/src/api/module/mod.rs b/pagetop/src/core/module/mod.rs similarity index 65% rename from pagetop/src/api/module/mod.rs rename to pagetop/src/core/module/mod.rs index 9c186aea..424595e3 100644 --- a/pagetop/src/api/module/mod.rs +++ b/pagetop/src/core/module/mod.rs @@ -6,5 +6,7 @@ pub use definition::{ pub(crate) mod all; pub use all::{ - include_module, + disable_module, + enable_module, + enable_modules, }; diff --git a/pagetop/src/api/theme/all.rs b/pagetop/src/core/theme/all.rs similarity index 83% rename from pagetop/src/api/theme/all.rs rename to pagetop/src/core/theme/all.rs index c4bb54fe..2a54f578 100644 --- a/pagetop/src/api/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,4 +1,5 @@ -use crate::{Lazy, app, theme_static_files, trace}; +use crate::{Lazy, theme_static_files, trace}; +use crate::core::app; use super::ThemeTrait; use std::sync::RwLock; @@ -10,6 +11,12 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { RwLock::new(Vec::new()) }); +pub fn register_themes(themes: Vec<&'static dyn ThemeTrait>) { + for t in themes { + register_theme(t) + } +} + pub fn register_theme(theme: &'static dyn ThemeTrait) { let mut themes = THEMES.write().unwrap(); if !themes.iter().any(|t| t.handler() == theme.handler()) { diff --git a/pagetop/src/api/theme/definition.rs b/pagetop/src/core/theme/definition.rs similarity index 96% rename from pagetop/src/api/theme/definition.rs rename to pagetop/src/core/theme/definition.rs index d5ca1db0..697f52ea 100644 --- a/pagetop/src/api/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,8 @@ -use crate::{app, concat_string, util}; +use crate::{concat_string, util}; use crate::config::SETTINGS; use crate::html::{Markup, html}; -use crate::api::component::{Assets, ComponentTrait, Favicon}; +use crate::core::app; +use crate::core::component::{Assets, ComponentTrait, Favicon}; use crate::response::page::Page; use crate::base::component::Chunck; diff --git a/pagetop/src/api/theme/mod.rs b/pagetop/src/core/theme/mod.rs similarity index 88% rename from pagetop/src/api/theme/mod.rs rename to pagetop/src/core/theme/mod.rs index ccb55a6d..5a4b4060 100644 --- a/pagetop/src/api/theme/mod.rs +++ b/pagetop/src/core/theme/mod.rs @@ -7,5 +7,6 @@ pub use definition::{ pub(crate) mod all; pub use all::{ register_theme, + register_themes, theme_by_single_name, }; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 20a25229..64da0481 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -18,10 +18,10 @@ pub mod html; // HTML en código. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a base de datos. -pub mod api; // Main APIs for actions, components, modules and themes. +pub mod core; // Main APIs for actions, components, modules and themes. pub mod response; // Tipos de respuestas web. -pub mod app; // Aplicación y servidor web. +//pub mod app; // Aplicación y servidor web. pub mod base; // Base de componentes, módulos y temas. pub mod util; // Macros y funciones útiles. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 93e9e7e8..98e88823 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -7,7 +7,7 @@ pub use fluent_templates::fluent_bundle::FluentValue; macro_rules! localize { ( $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; - use $crate::app::locale::LANGID; + use $crate::core::app::locale::LANGID; static_locale! { static LOCALES = { diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 357c31cf..0495bc70 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -20,17 +20,20 @@ pub use crate::{ migration_item, }; -pub use crate::{action_item, api::{ - action::*, +pub use crate::{hook_item, core::{ +// app::*, component::*, + hook::*, module::*, theme::*, }}; +pub use crate::core::app; +pub use crate::core::app::application::Application; pub use crate::response::page::*; -pub use crate::app; -pub use crate::app::application::{Application, UsingBootstrap}; +//pub use crate::app; +//pub use crate::app::application::{Application, UsingBootstrap}; pub use crate::base::component::*; diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs deleted file mode 100644 index 7869987c..00000000 --- a/pagetop/src/response/page/action.rs +++ /dev/null @@ -1,48 +0,0 @@ -use crate::api::action::{ActionTrait, AnyAction}; -use super::Page; - -pub const BEFORE_RENDER_PAGE_ACTION: &str = "pagetop::action::before_render_page"; - -pub struct ActionBeforeRenderPage { - action: Option<fn(&mut Page)>, - weight: isize, -} - -impl ActionTrait for ActionBeforeRenderPage { - fn new() -> Self { - ActionBeforeRenderPage { - action: None, - weight: 0, - } - } - - fn handler(&self) -> &'static str { - BEFORE_RENDER_PAGE_ACTION - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } -} - -impl ActionBeforeRenderPage { - pub fn with_action(mut self, action: fn(&mut Page)) -> Self { - self.action = Some(action); - self - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, page: &mut Page) { - if let Some(action) = self.action { - action(page) - } - } -} diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs new file mode 100644 index 00000000..e63a189c --- /dev/null +++ b/pagetop/src/response/page/hook.rs @@ -0,0 +1,48 @@ +use crate::core::hook::{HookTrait, AnyHook}; +use super::Page; + +pub const BEFORE_RENDER_PAGE_HOOK: &str = "pagetop::action::before_render_page"; + +pub struct BeforeRenderPageHook { + hook: Option<fn(&mut Page)>, + weight: isize, +} + +impl HookTrait for BeforeRenderPageHook { + fn new() -> Self { + BeforeRenderPageHook { + hook: None, + weight: 0, + } + } + + fn handler(&self) -> &'static str { + BEFORE_RENDER_PAGE_HOOK + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyHook { + self + } +} + +impl BeforeRenderPageHook { + pub fn with_hook(mut self, hook: fn(&mut Page)) -> Self { + self.hook = Some(hook); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, page: &mut Page) { + if let Some(hook) = self.hook { + hook(page) + } + } +} diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page/mod.rs index e08e55f0..82c5d7da 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page/mod.rs @@ -1,7 +1,7 @@ -mod action; -pub use action::{ - BEFORE_RENDER_PAGE_ACTION, - ActionBeforeRenderPage, +mod hook; +pub use hook::{ + BEFORE_RENDER_PAGE_HOOK, + BeforeRenderPageHook, }; mod page; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/page.rs index a4fc741b..6febf1ac 100644 --- a/pagetop/src/response/page/page.rs +++ b/pagetop/src/response/page/page.rs @@ -1,9 +1,10 @@ -use crate::{Lazy, app, trace}; +use crate::{Lazy, trace}; use crate::config::SETTINGS; use crate::html::*; -use crate::api::action::{action_ref, run_actions}; -use crate::api::component::*; -use super::{BEFORE_RENDER_PAGE_ACTION, ActionBeforeRenderPage}; +use crate::core::app; +use crate::core::hook::{hook_ref, run_hooks}; +use crate::core::component::*; +use super::{BEFORE_RENDER_PAGE_HOOK, BeforeRenderPageHook}; use std::collections::HashMap; @@ -151,9 +152,9 @@ impl<'a> Page<'a> { pub fn render(&mut self) -> app::Result<Markup> { // Acciones de los módulos antes de renderizar la página. - run_actions( - BEFORE_RENDER_PAGE_ACTION, - |a| action_ref::<ActionBeforeRenderPage>(&**a).run(self) + run_hooks( + BEFORE_RENDER_PAGE_HOOK, + |a| hook_ref::<BeforeRenderPageHook>(&**a).run(self) ); // Acciones del tema antes de renderizar la página. From 897ce6bb64ade574f9878059e28b670b286d77f8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 8 May 2022 11:23:11 +0200 Subject: [PATCH 086/853] =?UTF-8?q?Corrige=20errores=20de=20asignaci=C3=B3?= =?UTF-8?q?n=20de=20identificadores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/form/form.rs | 2 +- pagetop/src/base/theme/aliner/mod.rs | 2 +- pagetop/src/base/theme/bootsier/mod.rs | 2 +- pagetop/src/base/theme/bulmix/mod.rs | 2 +- pagetop/src/core/component/hook.rs | 2 +- pagetop/src/core/component/mod.rs | 6 ++---- pagetop/src/core/hook/all.rs | 8 ++++---- pagetop/src/core/hook/definition.rs | 4 ++-- pagetop/src/core/hook/holder.rs | 12 ++++++------ pagetop/src/core/theme/all.rs | 2 +- pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/response/page/hook.rs | 2 +- 12 files changed, 22 insertions(+), 24 deletions(-) diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 189eb0c4..dcf209b0 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -95,7 +95,7 @@ impl Form { self } - pub fn with_hook(mut self, action: &str) -> Self { + pub fn with_action(mut self, action: &str) -> Self { self.alter_action(action); self } diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner/mod.rs index f3c90f9b..d27c4632 100644 --- a/pagetop/src/base/theme/aliner/mod.rs +++ b/pagetop/src/base/theme/aliner/mod.rs @@ -11,7 +11,7 @@ impl ThemeTrait for Aliner { ALINER_THEME } - fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/aliner"); } diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier/mod.rs index a8be7118..5471b5cf 100644 --- a/pagetop/src/base/theme/bootsier/mod.rs +++ b/pagetop/src/base/theme/bootsier/mod.rs @@ -13,7 +13,7 @@ impl ThemeTrait for Bootsier { BOOTSIER_THEME } - fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/bootsier"); } diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 477dbbf7..e047b214 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -11,7 +11,7 @@ impl ThemeTrait for Bulmix { BULMIX_THEME } - fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/bulmix"); } diff --git a/pagetop/src/core/component/hook.rs b/pagetop/src/core/component/hook.rs index a35e09ad..f52d755b 100644 --- a/pagetop/src/core/component/hook.rs +++ b/pagetop/src/core/component/hook.rs @@ -1,7 +1,7 @@ use crate::core::hook::{HookTrait, AnyHook}; use super::{Assets, ComponentTrait}; -pub const BEFORE_RENDER_COMPONENT_HOOK: &str = "pagetop::action::before_render_component"; +pub const BEFORE_RENDER_COMPONENT_HOOK: &str = "pagetop::hook::before_render_component"; pub struct BeforeRenderComponentHook { hook: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, diff --git a/pagetop/src/core/component/mod.rs b/pagetop/src/core/component/mod.rs index 1f710deb..c0c78a57 100644 --- a/pagetop/src/core/component/mod.rs +++ b/pagetop/src/core/component/mod.rs @@ -25,10 +25,8 @@ mod holder; pub use holder::ComponentsHolder; mod all; -pub use all::{ - add_component_to, - common_components, -}; +pub use all::add_component_to; +pub(crate) use all::common_components; pub fn render_always() -> bool { true } diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index 2329b251..5c6f28d9 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -9,13 +9,13 @@ static ACTIONS: Lazy<RwLock<HashMap<&str, HooksHolder>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); -pub fn add_hook(action: HookItem) { +pub fn add_hook(hook: HookItem) { let mut hmap = ACTIONS.write().unwrap(); - let action_handler = action.handler(); + let action_handler = hook.handler(); if let Some(actions) = hmap.get_mut(action_handler) { - actions.add(action); + actions.add(hook); } else { - hmap.insert(action_handler, HooksHolder::new_with(action)); + hmap.insert(action_handler, HooksHolder::new_with(hook)); } } diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index 823e830e..e21ea10f 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -12,6 +12,6 @@ pub trait HookTrait: AnyHook + Send + Sync { fn as_ref_any(&self) -> &dyn AnyHook; } -pub fn hook_ref<A: 'static>(action: &dyn HookTrait) -> &A { - action.as_ref_any().downcast_ref::<A>().unwrap() +pub fn hook_ref<A: 'static>(hook: &dyn HookTrait) -> &A { + hook.as_ref_any().downcast_ref::<A>().unwrap() } diff --git a/pagetop/src/core/hook/holder.rs b/pagetop/src/core/hook/holder.rs index 3cd6d369..cd138c67 100644 --- a/pagetop/src/core/hook/holder.rs +++ b/pagetop/src/core/hook/holder.rs @@ -6,8 +6,8 @@ pub type HookItem = Box<dyn HookTrait>; #[macro_export] macro_rules! hook_item { - ( $action:ident => $f:ident $(, $weight:expr)? ) => {{ - Box::new($action::new().with_hook($f)$(.with_weight($weight))?) + ( $hook:ident => $f:ident $(, $weight:expr)? ) => {{ + Box::new($hook::new().with_hook($f)$(.with_weight($weight))?) }}; } @@ -18,15 +18,15 @@ impl HooksHolder { HooksHolder(Arc::new(RwLock::new(Vec::new()))) } - pub fn new_with(action: HookItem) -> Self { + pub fn new_with(hook: HookItem) -> Self { let mut container = HooksHolder::new(); - container.add(action); + container.add(hook); container } - pub fn add(&mut self, action: HookItem) { + pub fn add(&mut self, hook: HookItem) { let mut actions = self.0.write().unwrap(); - actions.push(action); + actions.push(hook); actions.sort_by_key(|a| a.weight()); } diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 2a54f578..ba725b71 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -38,6 +38,6 @@ pub fn themes(cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/theme"); for t in THEMES.read().unwrap().iter() { - t.configure_theme(cfg); + t.configure_service(cfg); } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 697f52ea..74457e19 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -23,7 +23,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { } #[allow(unused_variables)] - fn configure_theme(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { } #[allow(unused_variables)] diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index e63a189c..d482fb56 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,7 +1,7 @@ use crate::core::hook::{HookTrait, AnyHook}; use super::Page; -pub const BEFORE_RENDER_PAGE_HOOK: &str = "pagetop::action::before_render_page"; +pub const BEFORE_RENDER_PAGE_HOOK: &str = "pagetop::hook::before_render_page"; pub struct BeforeRenderPageHook { hook: Option<fn(&mut Page)>, From 6b38e4b8ae2f667353566408cfab9f2da520c55a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 8 May 2022 12:53:16 +0200 Subject: [PATCH 087/853] Modifica y depura el uso de la api interna --- drust/src/main.rs | 5 ++-- pagetop/src/core/app/application.rs | 35 ++++++++++++---------------- pagetop/src/core/app/definition.rs | 15 +++++++----- pagetop/src/core/app/mod.rs | 1 - pagetop/src/core/component/assets.rs | 4 ++-- pagetop/src/core/module/all.rs | 8 +++---- pagetop/src/core/module/mod.rs | 5 ---- pagetop/src/core/theme/all.rs | 4 ++-- pagetop/src/core/theme/mod.rs | 5 ---- pagetop/src/lib.rs | 3 +-- pagetop/src/prelude.rs | 8 +++---- 11 files changed, 39 insertions(+), 54 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 66a8d192..6b1f4543 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,13 +1,14 @@ -use pagetop::{prelude::*, core::app::AppTrait}; +use pagetop::prelude::*; struct Drust; impl AppTrait for Drust { - fn enabled_modules(&self) -> Vec<&'static dyn ModuleTrait> { + fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { vec![ &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, + &demopage::Demopage, ] } } diff --git a/pagetop/src/core/app/application.rs b/pagetop/src/core/app/application.rs index 01af2c5b..3069aa19 100644 --- a/pagetop/src/core/app/application.rs +++ b/pagetop/src/core/app/application.rs @@ -5,13 +5,14 @@ use super::AppTrait; use std::io::Error; use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; +use actix_web::dev::Server; pub struct Application { - server: super::Server, + server: Server, } impl Application { - pub async fn prepare(brrrz: impl AppTrait) -> Result<Self, Error> { + pub async fn prepare(app: impl AppTrait) -> Result<Self, Error> { // Rótulo de presentación. super::banner::print_on_startup(); @@ -25,36 +26,30 @@ impl Application { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] Lazy::force(&super::db::DBCONN); + // Habilita los módulos de la aplicación. + module::all::enable_modules(app.enable_modules()); + // Registra los temas predeterminados. - theme::register_themes(vec![ + theme::all::register_themes(vec![ &base::theme::aliner::Aliner, &base::theme::minimal::Minimal, &base::theme::bootsier::Bootsier, &base::theme::bulmix::Bulmix, ]); - theme::register_themes(brrrz.register_themes()); - - // Habilita los módulos predeterminados. - module::enable_modules(brrrz.enabled_modules()); - // Habilita el módulo de presentación de PageTop. - // Normalmente se sobrecargará en la función de inicio. - module::enable_module(&base::module::demopage::Demopage); + // Registra los temas de la aplicación. + theme::all::register_themes(app.themes()); // Registra las acciones de todos los módulos. module::all::register_hooks(); - // Ejecuta la función de inicio de la aplicación. - trace::info!("Calling application bootstrap"); - brrrz.bootstrap(); - /* - if let UsingBootstrap::Fn(bootstrap) = bootstrap { - let _ = &bootstrap(); - }*/ - - // Actualizaciones pendientes de la base de datos (opcional). + // Ejecuta actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] module::all::run_migrations(); + // Ejecuta la función de inicio de la aplicación. + trace::info!("Calling application bootstrap"); + app.bootstrap(); + // Prepara el servidor web. let server = super::HttpServer::new(move || { super::App::new() @@ -72,7 +67,7 @@ impl Application { Ok(Self { server }) } - pub fn run(self) -> Result<super::Server, Error> { + pub fn run(self) -> Result<Server, Error> { Ok(self.server) } } diff --git a/pagetop/src/core/app/definition.rs b/pagetop/src/core/app/definition.rs index 7c13f9b0..4740d223 100644 --- a/pagetop/src/core/app/definition.rs +++ b/pagetop/src/core/app/definition.rs @@ -1,3 +1,4 @@ +use crate::base::module::demopage; use crate::core::module::ModuleTrait; use crate::core::theme::ThemeTrait; @@ -5,15 +6,17 @@ pub trait AppTrait: Send + Sync { fn bootstrap(&self) { } - fn enabled_modules(&self) -> Vec<&'static dyn ModuleTrait> { + fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { + vec![ + &demopage::Demopage, + ] + } + + fn disable_modules(&self) -> Vec<&'static dyn ModuleTrait> { vec![] } - fn disabled_modules(&self) -> Vec<&'static dyn ModuleTrait> { - vec![] - } - - fn register_themes(&self) -> Vec<&'static dyn ThemeTrait> { + fn themes(&self) -> Vec<&'static dyn ThemeTrait> { vec![] } } diff --git a/pagetop/src/core/app/mod.rs b/pagetop/src/core/app/mod.rs index 04feaf83..17bd0509 100644 --- a/pagetop/src/core/app/mod.rs +++ b/pagetop/src/core/app/mod.rs @@ -1,7 +1,6 @@ pub use actix_web::{ App, HttpRequest, HttpResponse, HttpServer, Responder, Result, http, web }; -use actix_web::dev::Server; mod banner; diff --git a/pagetop/src/core/component/assets.rs b/pagetop/src/core/component/assets.rs index 1274348d..563e33c9 100644 --- a/pagetop/src/core/component/assets.rs +++ b/pagetop/src/core/component/assets.rs @@ -4,7 +4,7 @@ use crate::html::{Markup, PreEscaped, html}; use crate::core::theme::*; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - match theme_by_single_name(&SETTINGS.app.theme) { + match all::theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, } @@ -197,7 +197,7 @@ impl Assets { } pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); + self.theme = all::theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); self } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index ac5e8144..5131a878 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -18,11 +18,11 @@ static DISABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { pub fn enable_modules(modules: Vec<&'static dyn ModuleTrait>) { for m in modules { - enable_module(m) + enable(m) } } -pub fn enable_module(module: &'static dyn ModuleTrait) { +fn enable(module: &'static dyn ModuleTrait) { let mut list: Vec<&dyn ModuleTrait> = Vec::new(); add_to(&mut list, module); list.reverse(); @@ -43,11 +43,11 @@ fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { } } } - +/* #[allow(unused_variables)] pub fn disable_module(module: &'static dyn ModuleTrait) { } - +*/ pub fn modules(cfg: &mut app::web::ServiceConfig) { for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(cfg); diff --git a/pagetop/src/core/module/mod.rs b/pagetop/src/core/module/mod.rs index 424595e3..e50144b5 100644 --- a/pagetop/src/core/module/mod.rs +++ b/pagetop/src/core/module/mod.rs @@ -5,8 +5,3 @@ pub use definition::{ }; pub(crate) mod all; -pub use all::{ - disable_module, - enable_module, - enable_modules, -}; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index ba725b71..dc693e70 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -13,11 +13,11 @@ static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { pub fn register_themes(themes: Vec<&'static dyn ThemeTrait>) { for t in themes { - register_theme(t) + register(t) } } -pub fn register_theme(theme: &'static dyn ThemeTrait) { +fn register(theme: &'static dyn ThemeTrait) { let mut themes = THEMES.write().unwrap(); if !themes.iter().any(|t| t.handler() == theme.handler()) { trace::debug!("Registering theme \"{}\"", theme.single_name()); diff --git a/pagetop/src/core/theme/mod.rs b/pagetop/src/core/theme/mod.rs index 5a4b4060..391a0064 100644 --- a/pagetop/src/core/theme/mod.rs +++ b/pagetop/src/core/theme/mod.rs @@ -5,8 +5,3 @@ pub use definition::{ }; pub(crate) mod all; -pub use all::{ - register_theme, - register_themes, - theme_by_single_name, -}; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 64da0481..c4081535 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -18,10 +18,9 @@ pub mod html; // HTML en código. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a base de datos. -pub mod core; // Main APIs for actions, components, modules and themes. +pub mod core; // Main APIs for app, components, hooks, modules and themes. pub mod response; // Tipos de respuestas web. -//pub mod app; // Aplicación y servidor web. pub mod base; // Base de componentes, módulos y temas. pub mod util; // Macros y funciones útiles. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 0495bc70..d271980c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -21,20 +21,18 @@ pub use crate::{ }; pub use crate::{hook_item, core::{ -// app::*, + app, component::*, hook::*, module::*, theme::*, }}; -pub use crate::core::app; +pub use crate::core::app::AppTrait; pub use crate::core::app::application::Application; pub use crate::response::page::*; -//pub use crate::app; -//pub use crate::app::application::{Application, UsingBootstrap}; - pub use crate::base::component::*; +pub use crate::base::module::demopage; pub use crate::util; From b3854fe393dbe7472a8eba6dace266ae60ed0645 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 8 May 2022 13:54:18 +0200 Subject: [PATCH 088/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 8 +++++++- pagetop/Cargo.toml | 2 +- pagetop/src/base/module/demopage/mod.rs | 1 - pagetop/src/core/app/application.rs | 1 - pagetop/src/prelude.rs | 6 ++---- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 6b1f4543..4c210191 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -8,7 +8,13 @@ impl AppTrait for Drust { &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, - &demopage::Demopage, + &pagetop::base::module::demopage::Demopage, + ] + } + + fn themes(&self) -> Vec<&'static dyn ThemeTrait> { + vec![ + &pagetop::base::theme::bulmix::Bulmix, ] } } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 912c3477..d044369c 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.12" +version = "0.0.14" edition = "2021" authors = [ diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 343b00a0..34fb8ba1 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -26,7 +26,6 @@ impl ModuleTrait for Demopage { async fn demo() -> app::Result<Markup> { Page::new() - .using_theme("Bulmix") .with_title(l("page_title").as_str()) .add_to("content", hello_world()) .add_to("content", hello_world_original()) diff --git a/pagetop/src/core/app/application.rs b/pagetop/src/core/app/application.rs index 3069aa19..4cb18d39 100644 --- a/pagetop/src/core/app/application.rs +++ b/pagetop/src/core/app/application.rs @@ -34,7 +34,6 @@ impl Application { &base::theme::aliner::Aliner, &base::theme::minimal::Minimal, &base::theme::bootsier::Bootsier, - &base::theme::bulmix::Bulmix, ]); // Registra los temas de la aplicación. theme::all::register_themes(app.themes()); diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index d271980c..e9b8a396 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,10 +1,11 @@ //! Re-exporta recursos comunes. -// Macros. +// Macros, globals and helpers. pub use crate::{ args, concat_string, theme_static_files, + util, }; pub use crate::config::SETTINGS; @@ -33,6 +34,3 @@ pub use crate::core::app::application::Application; pub use crate::response::page::*; pub use crate::base::component::*; -pub use crate::base::module::demopage; - -pub use crate::util; From dda666e8890a13bfb30c0147649b34ba772c4536 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 9 May 2022 21:07:57 +0200 Subject: [PATCH 089/853] =?UTF-8?q?A=C3=B1ade=20componentes=20para=20cabec?= =?UTF-8?q?eras=20y=20p=C3=A1rrafos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/heading.rs | 186 ++++++++++++++++++++++++ pagetop/src/base/component/mod.rs | 8 + pagetop/src/base/component/paragraph.rs | 177 ++++++++++++++++++++++ pagetop/src/base/module/demopage/mod.rs | 26 ++-- pagetop/src/base/theme/bulmix/mod.rs | 29 ++++ 5 files changed, 414 insertions(+), 12 deletions(-) create mode 100644 pagetop/src/base/component/heading.rs create mode 100644 pagetop/src/base/component/paragraph.rs diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs new file mode 100644 index 00000000..5023e611 --- /dev/null +++ b/pagetop/src/base/component/heading.rs @@ -0,0 +1,186 @@ +use crate::prelude::*; + +pub const HEADING_COMPONENT: &str = "pagetop::component::heading"; + +pub enum HeadingType { + H1(String), + H2(String), + H3(String), + H4(String), + H5(String), + H6(String), +} + +pub enum HeadingDisplay { + XxLarge, + Large, + Normal, + Medium, + Small, + XxSmall, +} + +pub struct Heading { + renderable: fn() -> bool, + weight : isize, + heading : HeadingType, + display : HeadingDisplay, + id : OptIden, + classes : Classes, + template : String, +} + +impl ComponentTrait for Heading { + fn new() -> Self { + Heading { + renderable: render_always, + weight : 0, + heading : HeadingType::H1("".to_owned()), + display : HeadingDisplay::Normal, + id : OptIden::new(), + classes : Classes::new(), + template : "default".to_owned(), + } + } + + fn handler(&self) -> &'static str { + HEADING_COMPONENT + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> isize { + self.weight + } + + fn default_render(&self, _: &mut Assets) -> Markup { + html! { @match &self.heading() { + HeadingType::H1(text) => h1 id=[self.id()] class=[self.classes()] { (text) }, + HeadingType::H2(text) => h2 id=[self.id()] class=[self.classes()] { (text) }, + HeadingType::H3(text) => h3 id=[self.id()] class=[self.classes()] { (text) }, + HeadingType::H4(text) => h4 id=[self.id()] class=[self.classes()] { (text) }, + HeadingType::H5(text) => h5 id=[self.id()] class=[self.classes()] { (text) }, + HeadingType::H6(text) => h6 id=[self.id()] class=[self.classes()] { (text) }, + }} + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Heading { + pub fn with(heading: HeadingType) -> Self { + Heading::new().with_heading(heading) + } + + // Heading BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); + self + } + + pub fn with_heading(mut self, heading: HeadingType) -> Self { + self.alter_heading(heading); + self + } + + pub fn with_display(mut self, display: HeadingDisplay) -> Self { + self.alter_display(display); + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.alter_id(id); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Heading ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_heading(&mut self, heading: HeadingType) -> &mut Self { + self.heading = heading; + self + } + + pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { + self.display = display; + self.classes.alter(match &self.display() { + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::Large => "display-3", + HeadingDisplay::Normal => "", + HeadingDisplay::Medium => "display-4", + HeadingDisplay::Small => "display-5", + HeadingDisplay::XxSmall => "display-6", + }, ClassesOp::SetDefault); + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Paragraph GETTERS. + + pub fn heading(&self) -> &HeadingType { + &self.heading + } + + pub fn display(&self) -> &HeadingDisplay { + &self.display + } + + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self) -> &Option<String> { + self.classes.option() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/base/component/mod.rs index 14759dc8..986ba6f5 100644 --- a/pagetop/src/base/component/mod.rs +++ b/pagetop/src/base/component/mod.rs @@ -9,6 +9,14 @@ mod chunck; pub use chunck::{ CHUNCK_COMPONENT, Chunck }; +mod heading; +pub use heading::{ + HEADING_COMPONENT, Heading, HeadingDisplay, HeadingType +}; +mod paragraph; +pub use paragraph::{ + PARAGRAPH_COMPONENT, Paragraph, ParagraphDisplay +}; mod block; pub use block::{ BLOCK_COMPONENT, Block diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs new file mode 100644 index 00000000..1cf7c01b --- /dev/null +++ b/pagetop/src/base/component/paragraph.rs @@ -0,0 +1,177 @@ +use crate::prelude::*; + +pub const PARAGRAPH_COMPONENT: &str = "pagetop::component::paragraph"; + +pub enum ParagraphDisplay { + XxLarge, + Large, + MediumPlus, + Normal, + Medium, + Small, + XxSmall, +} + +pub struct Paragraph { + renderable: fn() -> bool, + weight : isize, + html : Markup, + display : ParagraphDisplay, + id : OptIden, + classes : Classes, + template : String, +} + +impl ComponentTrait for Paragraph { + fn new() -> Self { + Paragraph { + renderable: render_always, + weight : 0, + html : html! {}, + display : ParagraphDisplay::Normal, + id : OptIden::new(), + classes : Classes::new(), + template : "default".to_owned(), + } + } + + fn handler(&self) -> &'static str { + PARAGRAPH_COMPONENT + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> isize { + self.weight + } + + fn default_render(&self, _: &mut Assets) -> Markup { + html! { + p id=[self.id()] class=[self.classes()] { (*self.html()) } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Paragraph { + pub fn with(html: Markup) -> Self { + Paragraph::new().with_html(html) + } + + // Paragraph BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); + self + } + + pub fn with_html(mut self, html: Markup) -> Self { + self.alter_html(html); + self + } + + pub fn with_display(mut self, display: ParagraphDisplay) -> Self { + self.alter_display(display); + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.alter_id(id); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Paragraph ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.html = html; + self + } + + pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { + self.display = display; + self.classes.alter( + match &self.display() { + ParagraphDisplay::XxLarge => "fs-1", + ParagraphDisplay::Large => "fs-2", + ParagraphDisplay::MediumPlus => "fs-3", + ParagraphDisplay::Normal => "", + ParagraphDisplay::Medium => "fs-4", + ParagraphDisplay::Small => "fs-5", + ParagraphDisplay::XxSmall => "fs-6", + }, + ClassesOp::SetDefault + ); + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Paragraph GETTERS. + + pub fn html(&self) -> &Markup { + &self.html + } + + pub fn display(&self) -> &ParagraphDisplay { + &self.display + } + + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self) -> &Option<String> { + self.classes.option() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 34fb8ba1..41c398c0 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -41,22 +41,24 @@ fn hello_world() -> Container { .add(grid::Row::new() .add_column(grid::Column::new() .add(Chunck::with(html! { - div class="section-title" { + div class="area-title" { (t("welcome_to", &args![ "app" => SETTINGS.app.name.as_str() ])) } - h1 class="h1-large" { - (l("page_title")) - } - p class="p-large" { - (e("welcome_intro", &args![ - "app" => format!( - "<strong>{}</strong>", - &SETTINGS.app.name - ) - ])) - } + })) + .add(Heading::with(HeadingType::H1( + l("page_title")) + ).with_display(HeadingDisplay::Large)) + .add(Paragraph::with(html! { + (e("welcome_intro", &args![ + "app" => format!( + "<strong>{}</strong>", + &SETTINGS.app.name + ) + ])) + }).with_display(ParagraphDisplay::Large)) + .add(Chunck::with(html! { p { (e("welcome_pagetop", &args![ "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index e047b214..7bdb0890 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -36,6 +36,35 @@ impl ThemeTrait for Bulmix { _assets: &mut Assets ) { match component.handler() { + HEADING_COMPONENT => { + let h = component_mut::<Heading>(component); + h.alter_classes( + concat_string!("title ", match h.display() { + HeadingDisplay::XxLarge => "is-1", + HeadingDisplay::Large => "is-2", + HeadingDisplay::Normal => "", + HeadingDisplay::Medium => "is-3", + HeadingDisplay::Small => "is-4", + HeadingDisplay::XxSmall => "is-5", + }).as_str(), + ClassesOp::SetDefault + ); + }, + PARAGRAPH_COMPONENT => { + let p = component_mut::<Paragraph>(component); + p.alter_classes( + match p.display() { + ParagraphDisplay::XxLarge => "is-size-2", + ParagraphDisplay::Large => "is-size-3", + ParagraphDisplay::MediumPlus => "is-size-4", + ParagraphDisplay::Normal => "", + ParagraphDisplay::Medium => "is-size-5", + ParagraphDisplay::Small => "is-size-6", + ParagraphDisplay::XxSmall => "is-size-7", + }, + ClassesOp::SetDefault + ); + }, grid::ROW_COMPONENT => { let row = component_mut::<grid::Row>(component); row.alter_classes("columns", ClassesOp::SetDefault); From 075c546fd55c799e9432ed797ab9f1bd5b924aa9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 13 May 2022 16:25:11 +0200 Subject: [PATCH 090/853] =?UTF-8?q?A=C3=B1ade=20componentes=20para=20enlac?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 227 ++++++++++++++++++++++++ pagetop/src/base/component/heading.rs | 77 +++++--- pagetop/src/base/component/mod.rs | 4 + pagetop/src/base/component/paragraph.rs | 23 +-- pagetop/src/base/module/demopage/mod.rs | 35 ++-- pagetop/src/base/theme/bulmix/mod.rs | 48 ++--- pagetop/src/html/classes.rs | 5 + 7 files changed, 338 insertions(+), 81 deletions(-) create mode 100644 pagetop/src/base/component/anchor.rs diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs new file mode 100644 index 00000000..d0534694 --- /dev/null +++ b/pagetop/src/base/component/anchor.rs @@ -0,0 +1,227 @@ +use crate::prelude::*; + +pub const ANCHOR_COMPONENT: &str = "pagetop::component::anchor"; + +pub enum AnchorType { + Button, + Link, + Location, +} + +pub enum AnchorTarget { + Blank, + Context(String), + Default, + Parent, + Top, +} + +pub struct Anchor { + renderable : fn() -> bool, + weight : isize, + anchor_type: AnchorType, + href : OptAttr, + html : Markup, + target : AnchorTarget, + id : OptIden, + classes : Classes, + template : String, +} + +impl ComponentTrait for Anchor { + fn new() -> Self { + Anchor { + renderable : render_always, + weight : 0, + anchor_type: AnchorType::Link, + href : OptAttr::new(), + html : html! {}, + target : AnchorTarget::Default, + id : OptIden::new(), + classes : Classes::new(), + template : "default".to_owned(), + } + } + + fn handler(&self) -> &'static str { + ANCHOR_COMPONENT + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> isize { + self.weight + } + + fn default_render(&self, _: &mut Assets) -> Markup { + let target = match &self.target() { + AnchorTarget::Blank => Some("_blank"), + AnchorTarget::Context(name) => Some(name.as_str()), + AnchorTarget::Parent => Some("_parent"), + AnchorTarget::Top => Some("_top"), + _ => None, + }; + html! { + a + id=[self.id()] + class=[self.classes()] + href=[self.href()] + target=[target] + { + (*self.html()) + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Anchor { + pub fn link(href: &str, html: Markup) -> Self { + Anchor::new().with_href(href).with_html(html) + } + + pub fn button(href: &str, html: Markup) -> Self { + Anchor::new().with_type(AnchorType::Button).with_href(href).with_html(html) + } + + pub fn location(id: &str) -> Self { + Anchor::new().with_type(AnchorType::Location).with_id(id) + } + + // Anchor BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); + self + } + + pub fn with_type(mut self, anchor_type: AnchorType) -> Self { + self.alter_type(anchor_type); + self + } + + pub fn with_href(mut self, href: &str) -> Self { + self.alter_href(href); + self + } + + pub fn with_html(mut self, html: Markup) -> Self { + self.alter_html(html); + self + } + + pub fn with_target(mut self, target: AnchorTarget) -> Self { + self.alter_target(target); + self + } + + pub fn with_id(mut self, id: &str) -> Self { + self.alter_id(id); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Anchor ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { + self.anchor_type = anchor_type; + self.classes.alter(match self.anchor_type { + AnchorType::Button => "btn btn-primary", + _ => "", + }, ClassesOp::SetDefault); + self + } + + pub fn alter_href(&mut self, href: &str) -> &mut Self { + self.href.with_value(href); + self + } + + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.html = html; + self + } + + pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { + self.target = target; + self + } + + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Anchor GETTERS. + + pub fn anchor_type(&self) -> &AnchorType { + &self.anchor_type + } + + pub fn href(&self) -> &Option<String> { + self.href.option() + } + + pub fn html(&self) -> &Markup { + &self.html + } + + pub fn target(&self) -> &AnchorTarget { + &self.target + } + + pub fn id(&self) -> &Option<String> { + self.id.option() + } + + pub fn classes(&self) -> &Option<String> { + self.classes.option() + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 5023e611..fa17ca7e 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -2,28 +2,22 @@ use crate::prelude::*; pub const HEADING_COMPONENT: &str = "pagetop::component::heading"; -pub enum HeadingType { - H1(String), - H2(String), - H3(String), - H4(String), - H5(String), - H6(String), -} +pub enum HeadingType { H1, H2, H3, H4, H5, H6 } pub enum HeadingDisplay { XxLarge, Large, - Normal, Medium, Small, XxSmall, + Normal, } pub struct Heading { renderable: fn() -> bool, weight : isize, heading : HeadingType, + html : Markup, display : HeadingDisplay, id : OptIden, classes : Classes, @@ -35,7 +29,8 @@ impl ComponentTrait for Heading { Heading { renderable: render_always, weight : 0, - heading : HeadingType::H1("".to_owned()), + heading : HeadingType::H1, + html : html! {}, display : HeadingDisplay::Normal, id : OptIden::new(), classes : Classes::new(), @@ -57,12 +52,12 @@ impl ComponentTrait for Heading { fn default_render(&self, _: &mut Assets) -> Markup { html! { @match &self.heading() { - HeadingType::H1(text) => h1 id=[self.id()] class=[self.classes()] { (text) }, - HeadingType::H2(text) => h2 id=[self.id()] class=[self.classes()] { (text) }, - HeadingType::H3(text) => h3 id=[self.id()] class=[self.classes()] { (text) }, - HeadingType::H4(text) => h4 id=[self.id()] class=[self.classes()] { (text) }, - HeadingType::H5(text) => h5 id=[self.id()] class=[self.classes()] { (text) }, - HeadingType::H6(text) => h6 id=[self.id()] class=[self.classes()] { (text) }, + HeadingType::H1 => h1 id=[self.id()] class=[self.classes()] { (*self.html()) }, + HeadingType::H2 => h2 id=[self.id()] class=[self.classes()] { (*self.html()) }, + HeadingType::H3 => h3 id=[self.id()] class=[self.classes()] { (*self.html()) }, + HeadingType::H4 => h4 id=[self.id()] class=[self.classes()] { (*self.html()) }, + HeadingType::H5 => h5 id=[self.id()] class=[self.classes()] { (*self.html()) }, + HeadingType::H6 => h6 id=[self.id()] class=[self.classes()] { (*self.html()) }, }} } @@ -76,8 +71,28 @@ impl ComponentTrait for Heading { } impl Heading { - pub fn with(heading: HeadingType) -> Self { - Heading::new().with_heading(heading) + pub fn h1(html: Markup) -> Self { + Heading::new().with_heading(HeadingType::H1).with_html(html) + } + + pub fn h2(html: Markup) -> Self { + Heading::new().with_heading(HeadingType::H2).with_html(html) + } + + pub fn h3(html: Markup) -> Self { + Heading::new().with_heading(HeadingType::H3).with_html(html) + } + + pub fn h4(html: Markup) -> Self { + Heading::new().with_heading(HeadingType::H4).with_html(html) + } + + pub fn h5(html: Markup) -> Self { + Heading::new().with_heading(HeadingType::H5).with_html(html) + } + + pub fn h6(html: Markup) -> Self { + Heading::new().with_heading(HeadingType::H6).with_html(html) } // Heading BUILDER. @@ -97,6 +112,11 @@ impl Heading { self } + pub fn with_html(mut self, html: Markup) -> Self { + self.alter_html(html); + self + } + pub fn with_display(mut self, display: HeadingDisplay) -> Self { self.alter_display(display); self @@ -134,15 +154,20 @@ impl Heading { self } + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.html = html; + self + } + pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; self.classes.alter(match &self.display() { - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::Large => "display-3", - HeadingDisplay::Normal => "", - HeadingDisplay::Medium => "display-4", - HeadingDisplay::Small => "display-5", - HeadingDisplay::XxSmall => "display-6", + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::Large => "display-3", + HeadingDisplay::Medium => "display-4", + HeadingDisplay::Small => "display-5", + HeadingDisplay::XxSmall => "display-6", + HeadingDisplay::Normal => "", }, ClassesOp::SetDefault); self } @@ -168,6 +193,10 @@ impl Heading { &self.heading } + pub fn html(&self) -> &Markup { + &self.html + } + pub fn display(&self) -> &HeadingDisplay { &self.display } diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/base/component/mod.rs index 986ba6f5..22caca38 100644 --- a/pagetop/src/base/component/mod.rs +++ b/pagetop/src/base/component/mod.rs @@ -17,6 +17,10 @@ mod paragraph; pub use paragraph::{ PARAGRAPH_COMPONENT, Paragraph, ParagraphDisplay }; +mod anchor; +pub use anchor::{ + ANCHOR_COMPONENT, Anchor, AnchorTarget, AnchorType +}; mod block; pub use block::{ BLOCK_COMPONENT, Block diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 1cf7c01b..025d9565 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -5,11 +5,10 @@ pub const PARAGRAPH_COMPONENT: &str = "pagetop::component::paragraph"; pub enum ParagraphDisplay { XxLarge, Large, - MediumPlus, - Normal, Medium, Small, XxSmall, + Normal, } pub struct Paragraph { @@ -123,18 +122,14 @@ impl Paragraph { pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { self.display = display; - self.classes.alter( - match &self.display() { - ParagraphDisplay::XxLarge => "fs-1", - ParagraphDisplay::Large => "fs-2", - ParagraphDisplay::MediumPlus => "fs-3", - ParagraphDisplay::Normal => "", - ParagraphDisplay::Medium => "fs-4", - ParagraphDisplay::Small => "fs-5", - ParagraphDisplay::XxSmall => "fs-6", - }, - ClassesOp::SetDefault - ); + self.classes.alter(match &self.display() { + ParagraphDisplay::XxLarge => "fs-2", + ParagraphDisplay::Large => "fs-3", + ParagraphDisplay::Medium => "fs-4", + ParagraphDisplay::Small => "fs-5", + ParagraphDisplay::XxSmall => "fs-6", + ParagraphDisplay::Normal => "", + }, ClassesOp::SetDefault); self } diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage/mod.rs index 41c398c0..f8753638 100644 --- a/pagetop/src/base/module/demopage/mod.rs +++ b/pagetop/src/base/module/demopage/mod.rs @@ -40,30 +40,27 @@ fn hello_world() -> Container { Container::header() .add(grid::Row::new() .add_column(grid::Column::new() - .add(Chunck::with(html! { - div class="area-title" { - (t("welcome_to", &args![ - "app" => SETTINGS.app.name.as_str() - ])) - } + .add(Heading::h1(html! { + (l("page_title")) + }).with_display(HeadingDisplay::Large)) + .add(Paragraph::with(html! { + (t("welcome_to", &args![ + "app" => SETTINGS.app.name.as_str() + ])) })) - .add(Heading::with(HeadingType::H1( - l("page_title")) - ).with_display(HeadingDisplay::Large)) .add(Paragraph::with(html! { (e("welcome_intro", &args![ - "app" => format!( - "<strong>{}</strong>", - &SETTINGS.app.name - ) + "app" => format!("<strong>{}</strong>", &SETTINGS.app.name) ])) - }).with_display(ParagraphDisplay::Large)) + }).with_display(ParagraphDisplay::Small)) + .add(Paragraph::with(html! { + (e("welcome_pagetop", &args![ + "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + ])) + })) + .add(Anchor::button("#", html! { ("Offered services") })) + .add(Anchor::button("#", html! { ("Get quote") })) .add(Chunck::with(html! { - p { - (e("welcome_pagetop", &args![ - "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" - ])) - } a class="btn-solid-lg" href="#services" { "Offered services" } diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix/mod.rs index 7bdb0890..b4a360fb 100644 --- a/pagetop/src/base/theme/bulmix/mod.rs +++ b/pagetop/src/base/theme/bulmix/mod.rs @@ -38,32 +38,32 @@ impl ThemeTrait for Bulmix { match component.handler() { HEADING_COMPONENT => { let h = component_mut::<Heading>(component); - h.alter_classes( - concat_string!("title ", match h.display() { - HeadingDisplay::XxLarge => "is-1", - HeadingDisplay::Large => "is-2", - HeadingDisplay::Normal => "", - HeadingDisplay::Medium => "is-3", - HeadingDisplay::Small => "is-4", - HeadingDisplay::XxSmall => "is-5", - }).as_str(), - ClassesOp::SetDefault - ); + h.alter_classes(concat_string!("title ", match h.display() { + HeadingDisplay::XxLarge => "is-1", + HeadingDisplay::Large => "is-2", + HeadingDisplay::Medium => "is-3", + HeadingDisplay::Small => "is-4", + HeadingDisplay::XxSmall => "is-5", + HeadingDisplay::Normal => "", + }).as_str(), ClassesOp::SetDefault); }, PARAGRAPH_COMPONENT => { let p = component_mut::<Paragraph>(component); - p.alter_classes( - match p.display() { - ParagraphDisplay::XxLarge => "is-size-2", - ParagraphDisplay::Large => "is-size-3", - ParagraphDisplay::MediumPlus => "is-size-4", - ParagraphDisplay::Normal => "", - ParagraphDisplay::Medium => "is-size-5", - ParagraphDisplay::Small => "is-size-6", - ParagraphDisplay::XxSmall => "is-size-7", - }, - ClassesOp::SetDefault - ); + p.alter_classes(match p.display() { + ParagraphDisplay::XxLarge => "is-size-2", + ParagraphDisplay::Large => "is-size-3", + ParagraphDisplay::Medium => "is-size-4", + ParagraphDisplay::Small => "is-size-5", + ParagraphDisplay::XxSmall => "is-size-6", + ParagraphDisplay::Normal => "", + }, ClassesOp::SetDefault); + }, + ANCHOR_COMPONENT => { + let a = component_mut::<Anchor>(component); + a.alter_classes(match a.anchor_type() { + AnchorType::Button => "button is-primary", + _ => "", + }, ClassesOp::SetDefault); }, grid::ROW_COMPONENT => { let row = component_mut::<grid::Row>(component); @@ -71,7 +71,7 @@ impl ThemeTrait for Bulmix { }, grid::COLUMN_COMPONENT => { let col = component_mut::<grid::Column>(component); - col.alter_classes("column", ClassesOp::SetDefault); + col.alter_classes("column content", ClassesOp::SetDefault); }, _ => {}, } diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index aa629aaf..0623baa2 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -8,6 +8,7 @@ pub enum ClassesOp { Replace(&'static str), Reset, SetDefault, + SetDefaultIfEmpty, } pub struct Classes { @@ -75,6 +76,10 @@ impl Classes { ClassesOp::Reset => self.added = classes.to_owned(), ClassesOp::SetDefault => self.default = classes.to_owned(), + + ClassesOp::SetDefaultIfEmpty => if self.default.is_empty() { + self.default = classes.to_owned() + }, } self.option = Some(concat_string!(self.default, " ", self.added).trim().to_owned()); self From 7d06cdec19ebd1f2a46b3c44c00d5334fde87e0a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 13 May 2022 18:59:33 +0200 Subject: [PATCH 091/853] =?UTF-8?q?Actualiza=20estructura=20de=20archivos?= =?UTF-8?q?=20a=20nueva=20edici=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/{migration/mod.rs => migration.rs} | 0 .../src/{migration/mod.rs => migration.rs} | 0 pagetop/src/{base/mod.rs => base.rs} | 0 .../base/{component/mod.rs => component.rs} | 0 .../base/component/{form/mod.rs => form.rs} | 0 .../base/component/{grid/mod.rs => grid.rs} | 0 pagetop/src/base/{module/mod.rs => module.rs} | 0 .../module/{demopage/mod.rs => demopage.rs} | 0 pagetop/src/base/{theme/mod.rs => theme.rs} | 0 .../base/theme/{aliner/mod.rs => aliner.rs} | 0 .../theme/{bootsier/mod.rs => bootsier.rs} | 0 .../base/theme/{bulmix/mod.rs => bulmix.rs} | 0 .../base/theme/{minimal/mod.rs => minimal.rs} | 0 pagetop/src/{core/mod.rs => core.rs} | 0 pagetop/src/core/{app/mod.rs => app.rs} | 0 .../src/core/app/{banner/mod.rs => banner.rs} | 31 ++----------------- pagetop/src/core/app/banner/figfont.rs | 30 ++++++++++++++++++ .../core/{component/mod.rs => component.rs} | 0 pagetop/src/core/{hook/mod.rs => hook.rs} | 0 pagetop/src/core/{module/mod.rs => module.rs} | 0 pagetop/src/core/{theme/mod.rs => theme.rs} | 0 pagetop/src/{html/mod.rs => html.rs} | 0 pagetop/src/{response/mod.rs => response.rs} | 0 pagetop/src/response/{page/mod.rs => page.rs} | 4 +-- .../response/page/{page.rs => definition.rs} | 0 25 files changed, 35 insertions(+), 30 deletions(-) rename pagetop-node/src/{migration/mod.rs => migration.rs} (100%) rename pagetop-user/src/{migration/mod.rs => migration.rs} (100%) rename pagetop/src/{base/mod.rs => base.rs} (100%) rename pagetop/src/base/{component/mod.rs => component.rs} (100%) rename pagetop/src/base/component/{form/mod.rs => form.rs} (100%) rename pagetop/src/base/component/{grid/mod.rs => grid.rs} (100%) rename pagetop/src/base/{module/mod.rs => module.rs} (100%) rename pagetop/src/base/module/{demopage/mod.rs => demopage.rs} (100%) rename pagetop/src/base/{theme/mod.rs => theme.rs} (100%) rename pagetop/src/base/theme/{aliner/mod.rs => aliner.rs} (100%) rename pagetop/src/base/theme/{bootsier/mod.rs => bootsier.rs} (100%) rename pagetop/src/base/theme/{bulmix/mod.rs => bulmix.rs} (100%) rename pagetop/src/base/theme/{minimal/mod.rs => minimal.rs} (100%) rename pagetop/src/{core/mod.rs => core.rs} (100%) rename pagetop/src/core/{app/mod.rs => app.rs} (100%) rename pagetop/src/core/app/{banner/mod.rs => banner.rs} (52%) create mode 100644 pagetop/src/core/app/banner/figfont.rs rename pagetop/src/core/{component/mod.rs => component.rs} (100%) rename pagetop/src/core/{hook/mod.rs => hook.rs} (100%) rename pagetop/src/core/{module/mod.rs => module.rs} (100%) rename pagetop/src/core/{theme/mod.rs => theme.rs} (100%) rename pagetop/src/{html/mod.rs => html.rs} (100%) rename pagetop/src/{response/mod.rs => response.rs} (100%) rename pagetop/src/response/{page/mod.rs => page.rs} (66%) rename pagetop/src/response/page/{page.rs => definition.rs} (100%) diff --git a/pagetop-node/src/migration/mod.rs b/pagetop-node/src/migration.rs similarity index 100% rename from pagetop-node/src/migration/mod.rs rename to pagetop-node/src/migration.rs diff --git a/pagetop-user/src/migration/mod.rs b/pagetop-user/src/migration.rs similarity index 100% rename from pagetop-user/src/migration/mod.rs rename to pagetop-user/src/migration.rs diff --git a/pagetop/src/base/mod.rs b/pagetop/src/base.rs similarity index 100% rename from pagetop/src/base/mod.rs rename to pagetop/src/base.rs diff --git a/pagetop/src/base/component/mod.rs b/pagetop/src/base/component.rs similarity index 100% rename from pagetop/src/base/component/mod.rs rename to pagetop/src/base/component.rs diff --git a/pagetop/src/base/component/form/mod.rs b/pagetop/src/base/component/form.rs similarity index 100% rename from pagetop/src/base/component/form/mod.rs rename to pagetop/src/base/component/form.rs diff --git a/pagetop/src/base/component/grid/mod.rs b/pagetop/src/base/component/grid.rs similarity index 100% rename from pagetop/src/base/component/grid/mod.rs rename to pagetop/src/base/component/grid.rs diff --git a/pagetop/src/base/module/mod.rs b/pagetop/src/base/module.rs similarity index 100% rename from pagetop/src/base/module/mod.rs rename to pagetop/src/base/module.rs diff --git a/pagetop/src/base/module/demopage/mod.rs b/pagetop/src/base/module/demopage.rs similarity index 100% rename from pagetop/src/base/module/demopage/mod.rs rename to pagetop/src/base/module/demopage.rs diff --git a/pagetop/src/base/theme/mod.rs b/pagetop/src/base/theme.rs similarity index 100% rename from pagetop/src/base/theme/mod.rs rename to pagetop/src/base/theme.rs diff --git a/pagetop/src/base/theme/aliner/mod.rs b/pagetop/src/base/theme/aliner.rs similarity index 100% rename from pagetop/src/base/theme/aliner/mod.rs rename to pagetop/src/base/theme/aliner.rs diff --git a/pagetop/src/base/theme/bootsier/mod.rs b/pagetop/src/base/theme/bootsier.rs similarity index 100% rename from pagetop/src/base/theme/bootsier/mod.rs rename to pagetop/src/base/theme/bootsier.rs diff --git a/pagetop/src/base/theme/bulmix/mod.rs b/pagetop/src/base/theme/bulmix.rs similarity index 100% rename from pagetop/src/base/theme/bulmix/mod.rs rename to pagetop/src/base/theme/bulmix.rs diff --git a/pagetop/src/base/theme/minimal/mod.rs b/pagetop/src/base/theme/minimal.rs similarity index 100% rename from pagetop/src/base/theme/minimal/mod.rs rename to pagetop/src/base/theme/minimal.rs diff --git a/pagetop/src/core/mod.rs b/pagetop/src/core.rs similarity index 100% rename from pagetop/src/core/mod.rs rename to pagetop/src/core.rs diff --git a/pagetop/src/core/app/mod.rs b/pagetop/src/core/app.rs similarity index 100% rename from pagetop/src/core/app/mod.rs rename to pagetop/src/core/app.rs diff --git a/pagetop/src/core/app/banner/mod.rs b/pagetop/src/core/app/banner.rs similarity index 52% rename from pagetop/src/core/app/banner/mod.rs rename to pagetop/src/core/app/banner.rs index 1cce7146..a4dfd5b3 100644 --- a/pagetop/src/core/app/banner/mod.rs +++ b/pagetop/src/core/app/banner.rs @@ -1,35 +1,10 @@ -use crate::Lazy; +mod figfont; +use figfont::FIGFONT; + use crate::config::SETTINGS; -use figlet_rs::FIGfont; use substring::Substring; -static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { - let slant = include_str!("slant.flf"); - let small = include_str!("small.flf"); - let speed = include_str!("speed.flf"); - let starwars = include_str!("starwars.flf"); - - FIGfont::from_content( - match SETTINGS.app.startup_banner.to_lowercase().as_str() { - "off" => slant, - "slant" => slant, - "small" => small, - "speed" => speed, - "starwars" => starwars, - _ => { - println!( - "\n FIGfont \"{}\" not found for banner. {}. {}.", - SETTINGS.app.startup_banner, - "Using \"Slant\"", - "Check the settings file", - ); - slant - } - } - ).unwrap() -}); - pub fn print_on_startup() { if SETTINGS.app.startup_banner.to_lowercase() != "off" { if let Some((term_width, _)) = term_size::dimensions() { diff --git a/pagetop/src/core/app/banner/figfont.rs b/pagetop/src/core/app/banner/figfont.rs new file mode 100644 index 00000000..8fe0a4e7 --- /dev/null +++ b/pagetop/src/core/app/banner/figfont.rs @@ -0,0 +1,30 @@ +use crate::Lazy; +use crate::config::SETTINGS; + +use figlet_rs::FIGfont; + +pub static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { + let slant = include_str!("slant.flf"); + let small = include_str!("small.flf"); + let speed = include_str!("speed.flf"); + let starwars = include_str!("starwars.flf"); + + FIGfont::from_content( + match SETTINGS.app.startup_banner.to_lowercase().as_str() { + "off" => slant, + "slant" => slant, + "small" => small, + "speed" => speed, + "starwars" => starwars, + _ => { + println!( + "\n FIGfont \"{}\" not found for banner. {}. {}.", + SETTINGS.app.startup_banner, + "Using \"Slant\"", + "Check the settings file", + ); + slant + } + } + ).unwrap() +}); diff --git a/pagetop/src/core/component/mod.rs b/pagetop/src/core/component.rs similarity index 100% rename from pagetop/src/core/component/mod.rs rename to pagetop/src/core/component.rs diff --git a/pagetop/src/core/hook/mod.rs b/pagetop/src/core/hook.rs similarity index 100% rename from pagetop/src/core/hook/mod.rs rename to pagetop/src/core/hook.rs diff --git a/pagetop/src/core/module/mod.rs b/pagetop/src/core/module.rs similarity index 100% rename from pagetop/src/core/module/mod.rs rename to pagetop/src/core/module.rs diff --git a/pagetop/src/core/theme/mod.rs b/pagetop/src/core/theme.rs similarity index 100% rename from pagetop/src/core/theme/mod.rs rename to pagetop/src/core/theme.rs diff --git a/pagetop/src/html/mod.rs b/pagetop/src/html.rs similarity index 100% rename from pagetop/src/html/mod.rs rename to pagetop/src/html.rs diff --git a/pagetop/src/response/mod.rs b/pagetop/src/response.rs similarity index 100% rename from pagetop/src/response/mod.rs rename to pagetop/src/response.rs diff --git a/pagetop/src/response/page/mod.rs b/pagetop/src/response/page.rs similarity index 66% rename from pagetop/src/response/page/mod.rs rename to pagetop/src/response/page.rs index 82c5d7da..5f517471 100644 --- a/pagetop/src/response/page/mod.rs +++ b/pagetop/src/response/page.rs @@ -4,5 +4,5 @@ pub use hook::{ BeforeRenderPageHook, }; -mod page; -pub use page::Page; +mod definition; +pub use definition::Page; diff --git a/pagetop/src/response/page/page.rs b/pagetop/src/response/page/definition.rs similarity index 100% rename from pagetop/src/response/page/page.rs rename to pagetop/src/response/page/definition.rs From 9e5d6e1a7245b1d7fcfa1018d1f01923f74bbc1a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 13 May 2022 23:28:58 +0200 Subject: [PATCH 092/853] =?UTF-8?q?Corrige=20asignaci=C3=B3n=20err=C3=B3ne?= =?UTF-8?q?a=20de=20identificador?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/menu.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 450bc92e..6fa41268 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,7 +1,7 @@ use crate::prelude::*; pub const MENU_COMPONENT: &str = "pagetop::component::menu"; -pub const MENUITEM_COMPONENT: &str = "pagetop::component::menu"; +pub const MENUITEM_COMPONENT: &str = "pagetop::component::menu_item"; pub enum MenuItemType { Label(String), From 72f5144b7545b92fb0060a826daeda874e1ccd6d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 May 2022 18:32:56 +0200 Subject: [PATCH 093/853] Modifica Assets por Context --- pagetop/src/base/component/anchor.rs | 2 +- pagetop/src/base/component/block.rs | 6 +- pagetop/src/base/component/chunck.rs | 2 +- pagetop/src/base/component/container.rs | 12 +- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form.rs | 4 +- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 4 +- pagetop/src/base/component/grid/column.rs | 4 +- pagetop/src/base/component/grid/row.rs | 4 +- pagetop/src/base/component/heading.rs | 2 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu.rs | 12 +- pagetop/src/base/component/paragraph.rs | 2 +- pagetop/src/base/theme/aliner.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/base/theme/bulmix.rs | 4 +- pagetop/src/core/component.rs | 6 +- pagetop/src/core/component/assets.rs | 302 ------------------ pagetop/src/core/component/context.rs | 148 +++++++++ pagetop/src/core/component/context/favicon.rs | 86 +++++ .../src/core/component/context/javascript.rs | 43 +++ .../src/core/component/context/stylesheet.rs | 29 ++ pagetop/src/core/component/definition.rs | 19 +- pagetop/src/core/component/holder.rs | 6 +- pagetop/src/core/component/hook.rs | 10 +- pagetop/src/core/theme/definition.rs | 10 +- pagetop/src/response/page/definition.rs | 18 +- 29 files changed, 375 insertions(+), 372 deletions(-) delete mode 100644 pagetop/src/core/component/assets.rs create mode 100644 pagetop/src/core/component/context.rs create mode 100644 pagetop/src/core/component/context/favicon.rs create mode 100644 pagetop/src/core/component/context/javascript.rs create mode 100644 pagetop/src/core/component/context/stylesheet.rs diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index d0534694..1d0ce8a1 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -55,7 +55,7 @@ impl ComponentTrait for Anchor { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Context(name) => Some(name.as_str()), diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 4f120434..a37bc2ed 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -37,8 +37,8 @@ impl ComponentTrait for Block { self.weight } - fn default_render(&self, assets: &mut Assets) -> Markup { - let id = assets.required_id::<Block>(self.id()); + fn default_render(&self, context: &mut Context) -> Markup { + let id = context.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes()] { @match self.title() { @@ -46,7 +46,7 @@ impl ComponentTrait for Block { None => {} } div class="block-body" { - (self.components().render(assets)) + (self.components().render(context)) } } } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index c7d8a978..fdbfe9ee 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -31,7 +31,7 @@ impl ComponentTrait for Chunck { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { html! { (*self.html()) } } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index e275f255..7be54148 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -41,39 +41,39 @@ impl ComponentTrait for Container { self.weight } - fn default_render(&self, assets: &mut Assets) -> Markup { + fn default_render(&self, context: &mut Context) -> Markup { match self.container_type() { ContainerType::Header => html! { header id=[self.id()] class=[self.classes()] { div class=[self.inner_classes()] { - (self.components().render(assets)) + (self.components().render(context)) } } }, ContainerType::Footer => html! { footer id=[self.id()] class=[self.classes()] { div class=[self.inner_classes()] { - (self.components().render(assets)) + (self.components().render(context)) } } }, ContainerType::Main => html! { main id=[self.id()] class=[self.classes()] { div class=[self.inner_classes()] { - (self.components().render(assets)) + (self.components().render(context)) } } }, ContainerType::Section => html! { section id=[self.id()] class=[self.classes()] { div class=[self.inner_classes()] { - (self.components().render(assets)) + (self.components().render(context)) } } }, _ => html! { div id=[self.id()] class=[self.classes()] { - (self.components().render(assets)) + (self.components().render(context)) } } } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index fc7fe620..ad042b60 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -44,7 +44,7 @@ impl ComponentTrait for Button { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Reset => "reset", diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index eeb1d7aa..763a474a 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -52,7 +52,7 @@ impl ComponentTrait for Date { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { let id = match self.name() { Some(name) => Some(concat_string!("edit-", name)), None => None, diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index dcf209b0..688eeeed 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -43,7 +43,7 @@ impl ComponentTrait for Form { self.weight } - fn default_render(&self, assets: &mut Assets) -> Markup { + fn default_render(&self, context: &mut Context) -> Markup { let method = match self.method() { FormMethod::Get => None, FormMethod::Post => Some("post".to_owned()) @@ -56,7 +56,7 @@ impl ComponentTrait for Form { method=[method] accept-charset=[self.charset()] { - div { (self.elements().render(assets)) } + div { (self.elements().render(context)) } } } } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index c8d86131..91a2986f 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -25,7 +25,7 @@ impl ComponentTrait for Hidden { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { let id = match self.name() { Some(name) => Some(concat_string!("value-", name)), _ => None diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index d1614aa3..806be50a 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -62,14 +62,14 @@ impl ComponentTrait for Input { self.weight } - fn before_render(&mut self, _: &mut Assets) { + fn before_render(&mut self, _: &mut Context) { if let Some(name) = self.name() { let class = concat_string!("form-item-", name); self.alter_classes(class.as_str(), ClassesOp::AddFirst); } } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { let type_input = match self.input_type() { InputType::Email => "email", InputType::Password => "password", diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index a69edce7..b06faea2 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -35,10 +35,10 @@ impl ComponentTrait for Column { self.weight } - fn default_render(&self, assets: &mut Assets) -> Markup { + fn default_render(&self, context: &mut Context) -> Markup { html! { div id=[self.id()] class=[self.classes()] { - (self.components().render(assets)) + (self.components().render(context)) } } } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 05fae1cf..0ffe3f08 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -35,10 +35,10 @@ impl ComponentTrait for Row { self.weight } - fn default_render(&self, assets: &mut Assets) -> Markup { + fn default_render(&self, context: &mut Context) -> Markup { html! { div id=[self.id()] class=[self.classes()] { - (self.columns().render(assets)) + (self.columns().render(context)) } } } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index fa17ca7e..eada3ea5 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -50,7 +50,7 @@ impl ComponentTrait for Heading { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { html! { @match &self.heading() { HeadingType::H1 => h1 id=[self.id()] class=[self.classes()] { (*self.html()) }, HeadingType::H2 => h2 id=[self.id()] class=[self.classes()] { (*self.html()) }, diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 300cafc2..5a3f16c6 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -35,7 +35,7 @@ impl ComponentTrait for Image { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { html! { img src=[self.source()] diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 6fa41268..c4a97a05 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -42,7 +42,7 @@ impl ComponentTrait for MenuItem { self.weight } - fn default_render(&self, assets: &mut Assets) -> Markup { + fn default_render(&self, context: &mut Context) -> Markup { match self.item_type() { MenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } @@ -62,7 +62,7 @@ impl ComponentTrait for MenuItem { li class="submenu" { a href="#" { (label) } ul { - (menu.items().render(assets)) + (menu.items().render(context)) } } }, @@ -206,8 +206,8 @@ impl ComponentTrait for Menu { self.weight } - fn default_render(&self, assets: &mut Assets) -> Markup { - assets + fn default_render(&self, context: &mut Context) -> Markup { + context .add_stylesheet(StyleSheet::source( "/theme/menu/css/menu.css?ver=1.1.1" )) @@ -219,10 +219,10 @@ impl ComponentTrait for Menu { )) .add_jquery(); - let id = assets.required_id::<Menu>(self.id()); + let id = context.required_id::<Menu>(self.id()); html! { ul id=(id) class=[self.classes()] { - (self.items().render(assets)) + (self.items().render(context)) } script type="text/javascript" defer { "jQuery(function(){jQuery('#" (id) "').smartmenus({" diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 025d9565..d8e1ac4b 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -46,7 +46,7 @@ impl ComponentTrait for Paragraph { self.weight } - fn default_render(&self, _: &mut Assets) -> Markup { + fn default_render(&self, _: &mut Context) -> Markup { html! { p id=[self.id()] class=[self.classes()] { (*self.html()) } } diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index d27c4632..ae6c7475 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -16,7 +16,7 @@ impl ThemeTrait for Aliner { } fn before_render_page(&self, page: &mut Page) { - page.assets() + page.context() .with_favicon( Favicon::new() .with_icon("/theme/favicon.png") diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 5471b5cf..494bda17 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -18,7 +18,7 @@ impl ThemeTrait for Bootsier { } fn before_render_page(&self, page: &mut Page) { - page.assets() + page.context() .with_favicon( Favicon::new() .with_icon("/theme/favicon.png") diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index b4a360fb..e6041798 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -16,7 +16,7 @@ impl ThemeTrait for Bulmix { } fn before_render_page(&self, page: &mut Page) { - page.assets() + page.context() .with_favicon( Favicon::new() .with_icon("/theme/favicon.png") @@ -33,7 +33,7 @@ impl ThemeTrait for Bulmix { fn before_render_component( &self, component: &mut dyn ComponentTrait, - _assets: &mut Assets + _context: &mut Context ) { match component.handler() { HEADING_COMPONENT => { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index c0c78a57..f11f6b1b 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -4,9 +4,9 @@ pub use hook::{ BeforeRenderComponentHook, }; -mod assets; -pub use assets::{ - Assets, +mod context; +pub use context::{ + Context, Favicon, JavaScript, JSMode, StyleSheet, diff --git a/pagetop/src/core/component/assets.rs b/pagetop/src/core/component/assets.rs deleted file mode 100644 index 563e33c9..00000000 --- a/pagetop/src/core/component/assets.rs +++ /dev/null @@ -1,302 +0,0 @@ -use crate::{Lazy, base, concat_string, util}; -use crate::config::SETTINGS; -use crate::html::{Markup, PreEscaped, html}; -use crate::core::theme::*; - -static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - match all::theme_by_single_name(&SETTINGS.app.theme) { - Some(theme) => theme, - None => &base::theme::bootsier::Bootsier, - } -}); - -// Favicon. - -pub struct Favicon(Vec<String>); - -impl Favicon { - pub fn new() -> Self { - Favicon(Vec::new()) - } - - pub fn with_icon(self, image: &str) -> Self { - self.add_item("icon", image, "", "") - } - - pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { - self.add_item("icon", image, sizes, "") - } - - pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { - self.add_item("apple-touch-icon", image, sizes, "") - } - - pub fn with_mask_icon(self, image: &str, color: &str) -> Self { - self.add_item("mask-icon", image, "", color) - } - - pub fn with_manifest(self, file: &str) -> Self { - self.add_item("manifest", file, "", "") - } - - pub fn with_theme_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"theme-color\" content=\"{}\">", color - )); - self - } - - pub fn with_ms_tile_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileColor\" content=\"{}\">", color - )); - self - } - - pub fn with_ms_tile_image(mut self, image: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileImage\" content=\"{}\">", image - )); - self - } - - fn add_item( - mut self, - rel : &str, - source: &str, - sizes : &str, - color : &str - ) -> Self { - let mut link: String = format!("<link rel=\"{}\"", rel); - if let Some(i) = source.rfind('.') { - link = match source[i..].to_owned().to_lowercase().as_str() { - ".gif" => format!("{} type=\"image/gif\"", link), - ".ico" => format!("{} type=\"image/x-icon\"", link), - ".jpg" => format!("{} type=\"image/jpg\"", link), - ".png" => format!("{} type=\"image/png\"", link), - ".svg" => format!("{} type=\"image/svg+xml\"", link), - _ => link - }; - } - if !sizes.is_empty() { - link = format!("{} sizes=\"{}\"", link, sizes); - } - if !color.is_empty() { - link = format!("{} color=\"{}\"", link, color); - } - self.0.push(format!("{} href=\"{}\">", link, source)); - self - } - - fn render(&self) -> Markup { - html! { - @for item in &self.0 { - (PreEscaped(item)) - } - } - } -} - -// JavaScript. - -#[derive(PartialEq)] -pub enum JSMode { Async, Defer, Normal } - -pub struct JavaScript { - source: &'static str, - weight: isize, - mode : JSMode, -} -impl JavaScript { - pub fn source(s: &'static str) -> Self { - JavaScript { - source: s, - weight: 0, - mode : JSMode::Defer, - } - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn with_mode(mut self, mode: JSMode) -> Self { - self.mode = mode; - self - } - - pub fn weight(self) -> isize { - self.weight - } - - fn render(&self) -> Markup { - html! { - script type="text/javascript" - src=(self.source) - async[self.mode == JSMode::Async] - defer[self.mode == JSMode::Defer] - {}; - } - } -} - -// StyleSheet. - -pub struct StyleSheet { - source: &'static str, - weight: isize, -} -impl StyleSheet { - pub fn source(s: &'static str) -> Self { - StyleSheet { - source: s, - weight: 0, - } - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn weight(self) -> isize { - self.weight - } - - fn render(&self) -> Markup { - html! { - link rel="stylesheet" href=(self.source); - } - } -} - -// Page assets. - -pub struct Assets { - theme : &'static dyn ThemeTrait, - favicon : Option<Favicon>, - metadata : Vec<(String, String)>, - stylesheets: Vec<StyleSheet>, - javascripts: Vec<JavaScript>, - with_jquery: bool, - id_counter : usize, -} - -impl Assets { - pub fn new() -> Self { - Assets { - theme : *DEFAULT_THEME, - favicon : None, - metadata : Vec::new(), - stylesheets: Vec::new(), - javascripts: Vec::new(), - with_jquery: false, - id_counter : 0, - } - } - - pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = all::theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); - self - } - - pub fn with_favicon(&mut self, favicon: Favicon) -> &mut Self { - self.favicon = Some(favicon); - self - } - - pub fn add_metadata(&mut self, name: String, content: String) -> &mut Self { - self.metadata.push((name, content)); - self - } - - pub fn add_stylesheet(&mut self, css: StyleSheet) -> &mut Self { - match self.stylesheets.iter().position(|x| x.source == css.source) { - Some(index) => if self.stylesheets[index].weight > css.weight { - self.stylesheets.remove(index); - self.stylesheets.push(css); - }, - _ => self.stylesheets.push(css) - } - self - } - - pub fn add_javascript(&mut self, js: JavaScript) -> &mut Self { - match self.javascripts.iter().position(|x| x.source == js.source) { - Some(index) => if self.javascripts[index].weight > js.weight { - self.javascripts.remove(index); - self.javascripts.push(js); - }, - _ => self.javascripts.push(js) - } - self - } - - pub fn add_jquery(&mut self) -> &mut Self { - if !self.with_jquery { - self.add_javascript( - JavaScript::source( - "/theme/js/jquery.min.js?ver=3.6.0" - ) - .with_weight(isize::MIN) - .with_mode(JSMode::Normal) - ); - self.with_jquery = true; - } - self - } - - /// Assets GETTERS. - - pub(crate) fn theme(&mut self) -> &'static dyn ThemeTrait { - self.theme - } - - /// Assets RENDER. - - pub fn render(&mut self) -> Markup { - let ordered_css = &mut self.stylesheets; - ordered_css.sort_by_key(|o| o.weight); - - let ordered_js = &mut self.javascripts; - ordered_js.sort_by_key(|o| o.weight); - - html! { - @match &self.favicon { - Some(favicon) => (favicon.render()), - None => "", - } - @for (name, content) in &self.metadata { - meta name=(name) content=(content) {} - } - @for css in ordered_css { - (css.render()) - } - @for js in ordered_js { - (js.render()) - } - } - } - - // Assets EXTRAS. - - pub fn required_id<T>(&mut self, id: &Option<String>) -> String { - match id { - Some(id) => id.to_string(), - None => { - let prefix = util::single_type_name::<T>() - .trim() - .replace(" ", "_") - .to_lowercase(); - let prefix = if prefix.is_empty() { - "prefix".to_owned() - } else { - prefix - }; - self.id_counter += 1; - concat_string!(prefix, "-", self.id_counter.to_string()) - } - } - } -} diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs new file mode 100644 index 00000000..3aeab266 --- /dev/null +++ b/pagetop/src/core/component/context.rs @@ -0,0 +1,148 @@ +use crate::{Lazy, base, concat_string, util}; +use crate::config::SETTINGS; +use crate::html::{Markup, html}; +use crate::core::theme::*; + +mod favicon; +pub use favicon::Favicon; + +mod javascript; +pub use javascript::{JavaScript, JSMode}; + +mod stylesheet; +pub use stylesheet::StyleSheet; + +static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { + match all::theme_by_single_name(&SETTINGS.app.theme) { + Some(theme) => theme, + None => &base::theme::bootsier::Bootsier, + } +}); + +pub struct Context { + theme : &'static dyn ThemeTrait, + favicon : Option<Favicon>, + metadata : Vec<(String, String)>, + stylesheets: Vec<StyleSheet>, + javascripts: Vec<JavaScript>, + with_jquery: bool, + id_counter : usize, +} + +impl Context { + pub fn new() -> Self { + Context { + theme : *DEFAULT_THEME, + favicon : None, + metadata : Vec::new(), + stylesheets: Vec::new(), + javascripts: Vec::new(), + with_jquery: false, + id_counter : 0, + } + } + + pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { + self.theme = all::theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); + self + } + + pub fn with_favicon(&mut self, favicon: Favicon) -> &mut Self { + self.favicon = Some(favicon); + self + } + + pub fn add_metadata(&mut self, name: String, content: String) -> &mut Self { + self.metadata.push((name, content)); + self + } + + pub fn add_stylesheet(&mut self, css: StyleSheet) -> &mut Self { + match self.stylesheets.iter().position(|x| x.source == css.source) { + Some(index) => if self.stylesheets[index].weight > css.weight { + self.stylesheets.remove(index); + self.stylesheets.push(css); + }, + _ => self.stylesheets.push(css) + } + self + } + + pub fn add_javascript(&mut self, js: JavaScript) -> &mut Self { + match self.javascripts.iter().position(|x| x.source == js.source) { + Some(index) => if self.javascripts[index].weight > js.weight { + self.javascripts.remove(index); + self.javascripts.push(js); + }, + _ => self.javascripts.push(js) + } + self + } + + pub fn add_jquery(&mut self) -> &mut Self { + if !self.with_jquery { + self.add_javascript( + JavaScript::source( + "/theme/js/jquery.min.js?ver=3.6.0" + ) + .with_weight(isize::MIN) + .with_mode(JSMode::Normal) + ); + self.with_jquery = true; + } + self + } + + /// Context GETTERS. + + pub(crate) fn theme(&mut self) -> &'static dyn ThemeTrait { + self.theme + } + + /// Context RENDER. + + pub fn render(&mut self) -> Markup { + let ordered_css = &mut self.stylesheets; + ordered_css.sort_by_key(|o| o.weight); + + let ordered_js = &mut self.javascripts; + ordered_js.sort_by_key(|o| o.weight); + + html! { + @match &self.favicon { + Some(favicon) => (favicon.render()), + None => "", + } + @for (name, content) in &self.metadata { + meta name=(name) content=(content) {} + } + @for css in ordered_css { + (css.render()) + } + @for js in ordered_js { + (js.render()) + } + } + } + + // Context EXTRAS. + + pub fn required_id<T>(&mut self, id: &Option<String>) -> String { + match id { + Some(id) => id.to_string(), + None => { + let prefix = util::single_type_name::<T>() + .trim() + .replace(" ", "_") + .to_lowercase(); + let prefix = if prefix.is_empty() { + "prefix".to_owned() + } else { + prefix + }; + self.id_counter += 1; + concat_string!(prefix, "-", self.id_counter.to_string()) + } + } + } +} diff --git a/pagetop/src/core/component/context/favicon.rs b/pagetop/src/core/component/context/favicon.rs new file mode 100644 index 00000000..1788540e --- /dev/null +++ b/pagetop/src/core/component/context/favicon.rs @@ -0,0 +1,86 @@ +use crate::html::{Markup, PreEscaped, html}; + +pub struct Favicon(Vec<String>); + +impl Favicon { + pub fn new() -> Self { + Favicon(Vec::new()) + } + + pub fn with_icon(self, image: &str) -> Self { + self.add_item("icon", image, "", "") + } + + pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { + self.add_item("icon", image, sizes, "") + } + + pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { + self.add_item("apple-touch-icon", image, sizes, "") + } + + pub fn with_mask_icon(self, image: &str, color: &str) -> Self { + self.add_item("mask-icon", image, "", color) + } + + pub fn with_manifest(self, file: &str) -> Self { + self.add_item("manifest", file, "", "") + } + + pub fn with_theme_color(mut self, color: &str) -> Self { + self.0.push(format!( + "<meta name=\"theme-color\" content=\"{}\">", color + )); + self + } + + pub fn with_ms_tile_color(mut self, color: &str) -> Self { + self.0.push(format!( + "<meta name=\"msapplication-TileColor\" content=\"{}\">", color + )); + self + } + + pub fn with_ms_tile_image(mut self, image: &str) -> Self { + self.0.push(format!( + "<meta name=\"msapplication-TileImage\" content=\"{}\">", image + )); + self + } + + fn add_item( + mut self, + rel : &str, + source: &str, + sizes : &str, + color : &str + ) -> Self { + let mut link: String = format!("<link rel=\"{}\"", rel); + if let Some(i) = source.rfind('.') { + link = match source[i..].to_owned().to_lowercase().as_str() { + ".gif" => format!("{} type=\"image/gif\"", link), + ".ico" => format!("{} type=\"image/x-icon\"", link), + ".jpg" => format!("{} type=\"image/jpg\"", link), + ".png" => format!("{} type=\"image/png\"", link), + ".svg" => format!("{} type=\"image/svg+xml\"", link), + _ => link + }; + } + if !sizes.is_empty() { + link = format!("{} sizes=\"{}\"", link, sizes); + } + if !color.is_empty() { + link = format!("{} color=\"{}\"", link, color); + } + self.0.push(format!("{} href=\"{}\">", link, source)); + self + } + + pub(super) fn render(&self) -> Markup { + html! { + @for item in &self.0 { + (PreEscaped(item)) + } + } + } +} diff --git a/pagetop/src/core/component/context/javascript.rs b/pagetop/src/core/component/context/javascript.rs new file mode 100644 index 00000000..2f2d725b --- /dev/null +++ b/pagetop/src/core/component/context/javascript.rs @@ -0,0 +1,43 @@ +use crate::html::{Markup, html}; + +#[derive(PartialEq)] +pub enum JSMode { Async, Defer, Normal } + +pub struct JavaScript { + pub(super) source: &'static str, + pub(super) weight: isize, + pub(super) mode : JSMode, +} +impl JavaScript { + pub fn source(s: &'static str) -> Self { + JavaScript { + source: s, + weight: 0, + mode : JSMode::Defer, + } + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn with_mode(mut self, mode: JSMode) -> Self { + self.mode = mode; + self + } + + pub fn weight(self) -> isize { + self.weight + } + + pub(super) fn render(&self) -> Markup { + html! { + script type="text/javascript" + src=(self.source) + async[self.mode == JSMode::Async] + defer[self.mode == JSMode::Defer] + {}; + } + } +} diff --git a/pagetop/src/core/component/context/stylesheet.rs b/pagetop/src/core/component/context/stylesheet.rs new file mode 100644 index 00000000..f7803938 --- /dev/null +++ b/pagetop/src/core/component/context/stylesheet.rs @@ -0,0 +1,29 @@ +use crate::html::{Markup, html}; + +pub struct StyleSheet { + pub(super) source: &'static str, + pub(super) weight: isize, +} +impl StyleSheet { + pub fn source(s: &'static str) -> Self { + StyleSheet { + source: s, + weight: 0, + } + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn weight(self) -> isize { + self.weight + } + + pub(super) fn render(&self) -> Markup { + html! { + link rel="stylesheet" href=(self.source); + } + } +} diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 45fa3e91..ce57b240 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,8 +1,7 @@ use crate::util; use crate::html::{Markup, html}; use crate::core::hook::{hook_ref, run_hooks}; -use super::{BEFORE_RENDER_COMPONENT_HOOK, BeforeRenderComponentHook}; -use super::Assets; +use super::{BEFORE_RENDER_COMPONENT_HOOK, BeforeRenderComponentHook, Context}; pub use std::any::Any as AnyComponent; @@ -28,11 +27,11 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { } #[allow(unused_variables)] - fn before_render(&mut self, assets: &mut Assets) { + fn before_render(&mut self, context: &mut Context) { } #[allow(unused_variables)] - fn default_render(&self, assets: &mut Assets) -> Markup { + fn default_render(&self, context: &mut Context) -> Markup { html! {} } @@ -49,24 +48,24 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } -pub fn render_component(component: &mut dyn ComponentTrait, assets: &mut Assets) -> Markup { +pub fn render_component(component: &mut dyn ComponentTrait, context: &mut Context) -> Markup { // Acciones del componente antes de renderizar. - component.before_render(assets); + component.before_render(context); // Acciones de los módulos antes de renderizar el componente. run_hooks( BEFORE_RENDER_COMPONENT_HOOK, - |a| hook_ref::<BeforeRenderComponentHook>(&**a).run(component, assets) + |a| hook_ref::<BeforeRenderComponentHook>(&**a).run(component, context) ); // Acciones del tema antes de renderizar el componente. - assets.theme().before_render_component(component, assets); + context.theme().before_render_component(component, context); match component.is_renderable() { true => { - match assets.theme().render_component(component, assets) { + match context.theme().render_component(component, context) { Some(html) => html, - None => component.default_render(assets) + None => component.default_render(context) } }, false => html! {} diff --git a/pagetop/src/core/component/holder.rs b/pagetop/src/core/component/holder.rs index 51b67736..b19eb7f2 100644 --- a/pagetop/src/core/component/holder.rs +++ b/pagetop/src/core/component/holder.rs @@ -1,5 +1,5 @@ use crate::html::{Markup, html}; -use super::{Assets, ComponentTrait}; +use super::{Context, ComponentTrait}; use std::sync::{Arc, RwLock}; @@ -21,12 +21,12 @@ impl ComponentsHolder { self.0.push(Arc::new(RwLock::new(component))); } - pub fn render(&self, assets: &mut Assets) -> Markup { + pub fn render(&self, context: &mut Context) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (super::render_component(&mut *c.write().unwrap(), assets)) + (super::render_component(&mut *c.write().unwrap(), context)) } } } diff --git a/pagetop/src/core/component/hook.rs b/pagetop/src/core/component/hook.rs index f52d755b..e29ac1eb 100644 --- a/pagetop/src/core/component/hook.rs +++ b/pagetop/src/core/component/hook.rs @@ -1,10 +1,10 @@ use crate::core::hook::{HookTrait, AnyHook}; -use super::{Assets, ComponentTrait}; +use super::{ComponentTrait, Context}; pub const BEFORE_RENDER_COMPONENT_HOOK: &str = "pagetop::hook::before_render_component"; pub struct BeforeRenderComponentHook { - hook: Option<fn(&mut dyn ComponentTrait, &mut Assets)>, + hook: Option<fn(&mut dyn ComponentTrait, &mut Context)>, weight: isize, } @@ -30,7 +30,7 @@ impl HookTrait for BeforeRenderComponentHook { } impl BeforeRenderComponentHook { - pub fn with_hook(mut self, hook: fn(&mut dyn ComponentTrait, &mut Assets)) -> Self { + pub fn with_hook(mut self, hook: fn(&mut dyn ComponentTrait, &mut Context)) -> Self { self.hook = Some(hook); self } @@ -40,9 +40,9 @@ impl BeforeRenderComponentHook { self } - pub fn run(&self, component: &mut dyn ComponentTrait, assets: &mut Assets) { + pub fn run(&self, component: &mut dyn ComponentTrait, context: &mut Context) { if let Some(hook) = self.hook { - hook(component, assets) + hook(component, context) } } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 74457e19..205ea6cd 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -2,7 +2,7 @@ use crate::{concat_string, util}; use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::core::app; -use crate::core::component::{Assets, ComponentTrait, Favicon}; +use crate::core::component::{ComponentTrait, Context, Favicon}; use crate::response::page::Page; use crate::base::component::Chunck; @@ -28,7 +28,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { - page.assets() + page.context() .with_favicon( Favicon::new() .with_icon("/theme/favicon.png") @@ -56,7 +56,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { meta http-equiv="X-UA-Compatible" content="IE=edge"; meta name="viewport" content=(viewport); - (page.assets().render()) + (page.context().render()) } } } @@ -86,7 +86,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn before_render_component( &self, component: &mut dyn ComponentTrait, - assets: &mut Assets + context: &mut Context ) { /* Cómo usarlo: @@ -105,7 +105,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn render_component( &self, component: &dyn ComponentTrait, - assets: &mut Assets + context: &mut Context ) -> Option<Markup> { None /* diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 6febf1ac..f57de4ee 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -42,7 +42,7 @@ pub struct Page<'a> { direction : OptAttr, title : OptAttr, description : OptAttr, - assets : Assets, + context : Context, regions : HashMap<&'a str, ComponentsHolder>, body_classes: Classes, template : String, @@ -62,7 +62,7 @@ impl<'a> Page<'a> { }, title : OptAttr::new(), description : OptAttr::new(), - assets : Assets::new(), + context : Context::new(), regions : common_components(), body_classes: Classes::new_with_default("body"), template : "default".to_owned(), @@ -136,8 +136,8 @@ impl<'a> Page<'a> { self.description.option() } - pub fn assets(&mut self) -> &mut Assets { - &mut self.assets + pub fn context(&mut self) -> &mut Context { + &mut self.context } pub fn body_classes(&self) -> &Option<String> { @@ -158,13 +158,13 @@ impl<'a> Page<'a> { ); // Acciones del tema antes de renderizar la página. - self.assets.theme().before_render_page(self); + self.context.theme().before_render_page(self); // Primero, renderizar el cuerpo. - let body = self.assets.theme().render_page_body(self); + let body = self.context.theme().render_page_body(self); // Luego, renderizar la cabecera. - let head = self.assets.theme().render_page_head(self); + let head = self.context.theme().render_page_head(self); // Finalmente, renderizar la página. return Ok(html! { @@ -178,7 +178,7 @@ impl<'a> Page<'a> { pub fn render_region(&mut self, region: &str) -> Markup { match self.regions.get_mut(region) { - Some(components) => components.render(&mut self.assets), + Some(components) => components.render(&mut self.context), None => html! {} } } @@ -186,7 +186,7 @@ impl<'a> Page<'a> { // Page EXTRAS. pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.assets.using_theme(theme_name); + self.context.using_theme(theme_name); self } } From 96cbbb0c3c7b87266e1f38f1c12a807d87c638cb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 May 2022 20:12:59 +0200 Subject: [PATCH 094/853] Actualiza nomenclatura de tipos --- pagetop/src/base/component/anchor.rs | 2 +- pagetop/src/base/component/block.rs | 8 ++++---- pagetop/src/base/component/chunck.rs | 2 +- pagetop/src/base/component/container.rs | 8 ++++---- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form.rs | 8 ++++---- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 4 ++-- pagetop/src/base/component/grid/column.rs | 8 ++++---- pagetop/src/base/component/grid/row.rs | 8 ++++---- pagetop/src/base/component/heading.rs | 2 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu.rs | 10 +++++----- pagetop/src/base/component/paragraph.rs | 2 +- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/core/component.rs | 6 +++--- pagetop/src/core/component/all.rs | 8 ++++---- .../src/core/component/{holder.rs => bundle.rs} | 12 ++++++------ pagetop/src/core/component/context.rs | 16 ++++++++-------- pagetop/src/core/component/definition.rs | 8 ++++---- pagetop/src/core/component/hook.rs | 8 ++++---- pagetop/src/core/theme/definition.rs | 6 +++--- pagetop/src/response/page/definition.rs | 10 +++++----- 24 files changed, 73 insertions(+), 73 deletions(-) rename pagetop/src/core/component/{holder.rs => bundle.rs} (69%) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 1d0ce8a1..0c100f04 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -55,7 +55,7 @@ impl ComponentTrait for Anchor { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Context(name) => Some(name.as_str()), diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index a37bc2ed..c3581654 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -5,7 +5,7 @@ pub const BLOCK_COMPONENT: &str = "pagetop::component::block"; pub struct Block { renderable: fn() -> bool, weight : isize, - components: ComponentsHolder, + components: ComponentsBundle, title : OptAttr, id : OptIden, classes : Classes, @@ -17,7 +17,7 @@ impl ComponentTrait for Block { Block { renderable: render_always, weight : 0, - components: ComponentsHolder::new(), + components: ComponentsBundle::new(), title : OptAttr::new(), id : OptIden::new(), classes : Classes::new_with_default("block"), @@ -37,7 +37,7 @@ impl ComponentTrait for Block { self.weight } - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { let id = context.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes()] { @@ -70,7 +70,7 @@ impl Block { self } - pub fn components(&self) -> &ComponentsHolder { + pub fn components(&self) -> &ComponentsBundle { &self.components } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index fdbfe9ee..1832a455 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -31,7 +31,7 @@ impl ComponentTrait for Chunck { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { html! { (*self.html()) } } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 7be54148..f7e59740 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -7,7 +7,7 @@ pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { renderable : fn() -> bool, weight : isize, - components : ComponentsHolder, + components : ComponentsBundle, container : ContainerType, id : OptIden, classes : Classes, @@ -20,7 +20,7 @@ impl ComponentTrait for Container { Container { renderable : render_always, weight : 0, - components : ComponentsHolder::new(), + components : ComponentsBundle::new(), container : ContainerType::Wrapper, id : OptIden::new(), classes : Classes::new_with_default("container"), @@ -41,7 +41,7 @@ impl ComponentTrait for Container { self.weight } - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { match self.container_type() { ContainerType::Header => html! { header id=[self.id()] class=[self.classes()] { @@ -120,7 +120,7 @@ impl Container { self } - pub fn components(&self) -> &ComponentsHolder { + pub fn components(&self) -> &ComponentsBundle { &self.components } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index ad042b60..fc3e82b3 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -44,7 +44,7 @@ impl ComponentTrait for Button { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Reset => "reset", diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 763a474a..19ba44a9 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -52,7 +52,7 @@ impl ComponentTrait for Date { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { let id = match self.name() { Some(name) => Some(concat_string!("edit-", name)), None => None, diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 688eeeed..72c3bbcd 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -7,7 +7,7 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, weight : isize, - elements : ComponentsHolder, + elements : ComponentsBundle, action : OptAttr, charset : OptAttr, method : FormMethod, @@ -21,7 +21,7 @@ impl ComponentTrait for Form { Form { renderable: render_always, weight : 0, - elements : ComponentsHolder::new(), + elements : ComponentsBundle::new(), action : OptAttr::new(), charset : OptAttr::new_with_value("UTF-8"), method : FormMethod::Post, @@ -43,7 +43,7 @@ impl ComponentTrait for Form { self.weight } - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { let method = match self.method() { FormMethod::Get => None, FormMethod::Post => Some("post".to_owned()) @@ -79,7 +79,7 @@ impl Form { self } - pub fn elements(&self) -> &ComponentsHolder { + pub fn elements(&self) -> &ComponentsBundle { &self.elements } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 91a2986f..83bca41b 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -25,7 +25,7 @@ impl ComponentTrait for Hidden { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { let id = match self.name() { Some(name) => Some(concat_string!("value-", name)), _ => None diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 806be50a..c96197e8 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -62,14 +62,14 @@ impl ComponentTrait for Input { self.weight } - fn before_render(&mut self, _: &mut Context) { + fn before_render(&mut self, _: &mut InContext) { if let Some(name) = self.name() { let class = concat_string!("form-item-", name); self.alter_classes(class.as_str(), ClassesOp::AddFirst); } } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { let type_input = match self.input_type() { InputType::Email => "email", InputType::Password => "password", diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index b06faea2..4cf0f48e 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -5,7 +5,7 @@ pub const COLUMN_COMPONENT: &str = "pagetop::component::grid::column"; pub struct Column { renderable: fn() -> bool, weight : isize, - components: ComponentsHolder, + components: ComponentsBundle, id : OptIden, classes : Classes, template : String, @@ -16,7 +16,7 @@ impl ComponentTrait for Column { Column { renderable: render_always, weight : 0, - components: ComponentsHolder::new(), + components: ComponentsBundle::new(), id : OptIden::new(), classes : Classes::new_with_default("col"), template : "default".to_owned(), @@ -35,7 +35,7 @@ impl ComponentTrait for Column { self.weight } - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { html! { div id=[self.id()] class=[self.classes()] { (self.components().render(context)) @@ -61,7 +61,7 @@ impl Column { self } - pub fn components(&self) -> &ComponentsHolder { + pub fn components(&self) -> &ComponentsBundle { &self.components } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 0ffe3f08..57f44568 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -5,7 +5,7 @@ pub const ROW_COMPONENT: &str = "pagetop::component::grid::row"; pub struct Row { renderable: fn() -> bool, weight : isize, - columns : ComponentsHolder, + columns : ComponentsBundle, id : OptIden, classes : Classes, template : String, @@ -16,7 +16,7 @@ impl ComponentTrait for Row { Row { renderable: render_always, weight : 0, - columns : ComponentsHolder::new(), + columns : ComponentsBundle::new(), id : OptIden::new(), classes : Classes::new_with_default("row"), template : "default".to_owned(), @@ -35,7 +35,7 @@ impl ComponentTrait for Row { self.weight } - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { html! { div id=[self.id()] class=[self.classes()] { (self.columns().render(context)) @@ -61,7 +61,7 @@ impl Row { self } - pub fn columns(&self) -> &ComponentsHolder { + pub fn columns(&self) -> &ComponentsBundle { &self.columns } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index eada3ea5..4248fb03 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -50,7 +50,7 @@ impl ComponentTrait for Heading { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { html! { @match &self.heading() { HeadingType::H1 => h1 id=[self.id()] class=[self.classes()] { (*self.html()) }, HeadingType::H2 => h2 id=[self.id()] class=[self.classes()] { (*self.html()) }, diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 5a3f16c6..3d3a361e 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -35,7 +35,7 @@ impl ComponentTrait for Image { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { html! { img src=[self.source()] diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index c4a97a05..ef7668aa 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -42,7 +42,7 @@ impl ComponentTrait for MenuItem { self.weight } - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { match self.item_type() { MenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } @@ -176,7 +176,7 @@ impl MenuItem { pub struct Menu { renderable: fn() -> bool, weight : isize, - items : ComponentsHolder, + items : ComponentsBundle, id : OptIden, classes : Classes, template : String, @@ -187,7 +187,7 @@ impl ComponentTrait for Menu { Menu { renderable: render_always, weight : 0, - items : ComponentsHolder::new(), + items : ComponentsBundle::new(), id : OptIden::new(), classes : Classes::new_with_default("sm sm-clean"), template : "default".to_owned(), @@ -206,7 +206,7 @@ impl ComponentTrait for Menu { self.weight } - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { context .add_stylesheet(StyleSheet::source( "/theme/menu/css/menu.css?ver=1.1.1" @@ -251,7 +251,7 @@ impl Menu { self } - pub fn items(&self) -> &ComponentsHolder { + pub fn items(&self) -> &ComponentsBundle { &self.items } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index d8e1ac4b..c0d7d93c 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -46,7 +46,7 @@ impl ComponentTrait for Paragraph { self.weight } - fn default_render(&self, _: &mut Context) -> Markup { + fn default_render(&self, _: &mut InContext) -> Markup { html! { p id=[self.id()] class=[self.classes()] { (*self.html()) } } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index e6041798..f099d880 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -33,7 +33,7 @@ impl ThemeTrait for Bulmix { fn before_render_component( &self, component: &mut dyn ComponentTrait, - _context: &mut Context + _context: &mut InContext ) { match component.handler() { HEADING_COMPONENT => { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index f11f6b1b..038ee93d 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -5,8 +5,8 @@ pub use hook::{ }; mod context; +pub use context::InContext; pub use context::{ - Context, Favicon, JavaScript, JSMode, StyleSheet, @@ -21,8 +21,8 @@ pub use definition::{ }; use definition::render_component; -mod holder; -pub use holder::ComponentsHolder; +mod bundle; +pub use bundle::ComponentsBundle; mod all; pub use all::add_component_to; diff --git a/pagetop/src/core/component/all.rs b/pagetop/src/core/component/all.rs index 82573f59..a8567794 100644 --- a/pagetop/src/core/component/all.rs +++ b/pagetop/src/core/component/all.rs @@ -1,10 +1,10 @@ use crate::Lazy; -use super::{ComponentsHolder, ComponentTrait}; +use super::{ComponentsBundle, ComponentTrait}; use std::sync::RwLock; use std::collections::HashMap; -static COMPONENTS: Lazy<RwLock<HashMap<&str, ComponentsHolder>>> = Lazy::new(|| { +static COMPONENTS: Lazy<RwLock<HashMap<&str, ComponentsBundle>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); @@ -13,10 +13,10 @@ pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { if let Some(regions) = hmap.get_mut(region) { regions.add(component); } else { - hmap.insert(region, ComponentsHolder::new_with(component)); + hmap.insert(region, ComponentsBundle::new_with(component)); } } -pub fn common_components() -> HashMap<&'static str, ComponentsHolder> { +pub fn common_components() -> HashMap<&'static str, ComponentsBundle> { COMPONENTS.read().unwrap().clone() } diff --git a/pagetop/src/core/component/holder.rs b/pagetop/src/core/component/bundle.rs similarity index 69% rename from pagetop/src/core/component/holder.rs rename to pagetop/src/core/component/bundle.rs index b19eb7f2..0477a4fd 100644 --- a/pagetop/src/core/component/holder.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,18 +1,18 @@ use crate::html::{Markup, html}; -use super::{Context, ComponentTrait}; +use super::{InContext, ComponentTrait}; use std::sync::{Arc, RwLock}; #[derive(Clone)] -pub struct ComponentsHolder(Vec<Arc<RwLock<dyn ComponentTrait>>>); +pub struct ComponentsBundle(Vec<Arc<RwLock<dyn ComponentTrait>>>); -impl ComponentsHolder { +impl ComponentsBundle { pub fn new() -> Self { - ComponentsHolder(Vec::new()) + ComponentsBundle(Vec::new()) } pub fn new_with(component: impl ComponentTrait) -> Self { - let mut container = ComponentsHolder::new(); + let mut container = ComponentsBundle::new(); container.add(component); container } @@ -21,7 +21,7 @@ impl ComponentsHolder { self.0.push(Arc::new(RwLock::new(component))); } - pub fn render(&self, context: &mut Context) -> Markup { + pub fn render(&self, context: &mut InContext) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 3aeab266..a5c7a43a 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -19,7 +19,7 @@ static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { } }); -pub struct Context { +pub struct InContext { theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, metadata : Vec<(String, String)>, @@ -29,9 +29,9 @@ pub struct Context { id_counter : usize, } -impl Context { +impl InContext { pub fn new() -> Self { - Context { + InContext { theme : *DEFAULT_THEME, favicon : None, metadata : Vec::new(), @@ -93,20 +93,20 @@ impl Context { self } - /// Context GETTERS. + /// InContext GETTERS. pub(crate) fn theme(&mut self) -> &'static dyn ThemeTrait { self.theme } - /// Context RENDER. + /// InContext RENDER. pub fn render(&mut self) -> Markup { let ordered_css = &mut self.stylesheets; - ordered_css.sort_by_key(|o| o.weight); + ordered_css.sort_by_key(|css| css.weight); let ordered_js = &mut self.javascripts; - ordered_js.sort_by_key(|o| o.weight); + ordered_js.sort_by_key(|js| js.weight); html! { @match &self.favicon { @@ -125,7 +125,7 @@ impl Context { } } - // Context EXTRAS. + // InContext EXTRAS. pub fn required_id<T>(&mut self, id: &Option<String>) -> String { match id { diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index ce57b240..96950798 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,7 @@ use crate::util; use crate::html::{Markup, html}; use crate::core::hook::{hook_ref, run_hooks}; -use super::{BEFORE_RENDER_COMPONENT_HOOK, BeforeRenderComponentHook, Context}; +use super::{BEFORE_RENDER_COMPONENT_HOOK, BeforeRenderComponentHook, InContext}; pub use std::any::Any as AnyComponent; @@ -27,11 +27,11 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { } #[allow(unused_variables)] - fn before_render(&mut self, context: &mut Context) { + fn before_render(&mut self, context: &mut InContext) { } #[allow(unused_variables)] - fn default_render(&self, context: &mut Context) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { html! {} } @@ -48,7 +48,7 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } -pub fn render_component(component: &mut dyn ComponentTrait, context: &mut Context) -> Markup { +pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InContext) -> Markup { // Acciones del componente antes de renderizar. component.before_render(context); diff --git a/pagetop/src/core/component/hook.rs b/pagetop/src/core/component/hook.rs index e29ac1eb..82d1ba01 100644 --- a/pagetop/src/core/component/hook.rs +++ b/pagetop/src/core/component/hook.rs @@ -1,10 +1,10 @@ use crate::core::hook::{HookTrait, AnyHook}; -use super::{ComponentTrait, Context}; +use super::{ComponentTrait, InContext}; pub const BEFORE_RENDER_COMPONENT_HOOK: &str = "pagetop::hook::before_render_component"; pub struct BeforeRenderComponentHook { - hook: Option<fn(&mut dyn ComponentTrait, &mut Context)>, + hook: Option<fn(&mut dyn ComponentTrait, &mut InContext)>, weight: isize, } @@ -30,7 +30,7 @@ impl HookTrait for BeforeRenderComponentHook { } impl BeforeRenderComponentHook { - pub fn with_hook(mut self, hook: fn(&mut dyn ComponentTrait, &mut Context)) -> Self { + pub fn with_hook(mut self, hook: fn(&mut dyn ComponentTrait, &mut InContext)) -> Self { self.hook = Some(hook); self } @@ -40,7 +40,7 @@ impl BeforeRenderComponentHook { self } - pub fn run(&self, component: &mut dyn ComponentTrait, context: &mut Context) { + pub fn run(&self, component: &mut dyn ComponentTrait, context: &mut InContext) { if let Some(hook) = self.hook { hook(component, context) } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 205ea6cd..841632ba 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -2,7 +2,7 @@ use crate::{concat_string, util}; use crate::config::SETTINGS; use crate::html::{Markup, html}; use crate::core::app; -use crate::core::component::{ComponentTrait, Context, Favicon}; +use crate::core::component::{ComponentTrait, Favicon, InContext}; use crate::response::page::Page; use crate::base::component::Chunck; @@ -86,7 +86,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn before_render_component( &self, component: &mut dyn ComponentTrait, - context: &mut Context + context: &mut InContext ) { /* Cómo usarlo: @@ -105,7 +105,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn render_component( &self, component: &dyn ComponentTrait, - context: &mut Context + context: &mut InContext ) -> Option<Markup> { None /* diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index f57de4ee..ce1ab12b 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -42,8 +42,8 @@ pub struct Page<'a> { direction : OptAttr, title : OptAttr, description : OptAttr, - context : Context, - regions : HashMap<&'a str, ComponentsHolder>, + context : InContext, + regions : HashMap<&'a str, ComponentsBundle>, body_classes: Classes, template : String, } @@ -62,7 +62,7 @@ impl<'a> Page<'a> { }, title : OptAttr::new(), description : OptAttr::new(), - context : Context::new(), + context : InContext::new(), regions : common_components(), body_classes: Classes::new_with_default("body"), template : "default".to_owned(), @@ -103,7 +103,7 @@ impl<'a> Page<'a> { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); } else { - self.regions.insert(region, ComponentsHolder::new_with(component)); + self.regions.insert(region, ComponentsBundle::new_with(component)); } self } @@ -136,7 +136,7 @@ impl<'a> Page<'a> { self.description.option() } - pub fn context(&mut self) -> &mut Context { + pub fn context(&mut self) -> &mut InContext { &mut self.context } From 9485179257f0e324599975b1444499371338bf3d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 May 2022 20:21:14 +0200 Subject: [PATCH 095/853] =?UTF-8?q?Actualiza=20la=20organizaci=C3=B3n=20de?= =?UTF-8?q?l=20c=C3=B3digo=20para=20las=20apps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/{core => }/app.rs | 0 pagetop/src/{core => }/app/application.rs | 0 pagetop/src/{core => }/app/banner.rs | 0 pagetop/src/{core => }/app/banner/figfont.rs | 0 pagetop/src/{core => }/app/banner/slant.flf | 0 pagetop/src/{core => }/app/banner/small.flf | 0 pagetop/src/{core => }/app/banner/speed.flf | 0 pagetop/src/{core => }/app/banner/starwars.flf | 0 pagetop/src/{core => }/app/db.rs | 0 pagetop/src/{core => }/app/definition.rs | 0 pagetop/src/{core => }/app/locale.rs | 0 pagetop/src/{core => }/app/tracing.rs | 0 pagetop/src/core.rs | 1 - pagetop/src/core/module/all.rs | 3 +-- pagetop/src/core/module/definition.rs | 3 +-- pagetop/src/core/theme/all.rs | 3 +-- pagetop/src/core/theme/definition.rs | 3 +-- pagetop/src/lib.rs | 4 +++- pagetop/src/locale.rs | 2 +- pagetop/src/prelude.rs | 7 ++++--- pagetop/src/response/page/definition.rs | 3 +-- 21 files changed, 13 insertions(+), 16 deletions(-) rename pagetop/src/{core => }/app.rs (100%) rename pagetop/src/{core => }/app/application.rs (100%) rename pagetop/src/{core => }/app/banner.rs (100%) rename pagetop/src/{core => }/app/banner/figfont.rs (100%) rename pagetop/src/{core => }/app/banner/slant.flf (100%) rename pagetop/src/{core => }/app/banner/small.flf (100%) rename pagetop/src/{core => }/app/banner/speed.flf (100%) rename pagetop/src/{core => }/app/banner/starwars.flf (100%) rename pagetop/src/{core => }/app/db.rs (100%) rename pagetop/src/{core => }/app/definition.rs (100%) rename pagetop/src/{core => }/app/locale.rs (100%) rename pagetop/src/{core => }/app/tracing.rs (100%) diff --git a/pagetop/src/core/app.rs b/pagetop/src/app.rs similarity index 100% rename from pagetop/src/core/app.rs rename to pagetop/src/app.rs diff --git a/pagetop/src/core/app/application.rs b/pagetop/src/app/application.rs similarity index 100% rename from pagetop/src/core/app/application.rs rename to pagetop/src/app/application.rs diff --git a/pagetop/src/core/app/banner.rs b/pagetop/src/app/banner.rs similarity index 100% rename from pagetop/src/core/app/banner.rs rename to pagetop/src/app/banner.rs diff --git a/pagetop/src/core/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs similarity index 100% rename from pagetop/src/core/app/banner/figfont.rs rename to pagetop/src/app/banner/figfont.rs diff --git a/pagetop/src/core/app/banner/slant.flf b/pagetop/src/app/banner/slant.flf similarity index 100% rename from pagetop/src/core/app/banner/slant.flf rename to pagetop/src/app/banner/slant.flf diff --git a/pagetop/src/core/app/banner/small.flf b/pagetop/src/app/banner/small.flf similarity index 100% rename from pagetop/src/core/app/banner/small.flf rename to pagetop/src/app/banner/small.flf diff --git a/pagetop/src/core/app/banner/speed.flf b/pagetop/src/app/banner/speed.flf similarity index 100% rename from pagetop/src/core/app/banner/speed.flf rename to pagetop/src/app/banner/speed.flf diff --git a/pagetop/src/core/app/banner/starwars.flf b/pagetop/src/app/banner/starwars.flf similarity index 100% rename from pagetop/src/core/app/banner/starwars.flf rename to pagetop/src/app/banner/starwars.flf diff --git a/pagetop/src/core/app/db.rs b/pagetop/src/app/db.rs similarity index 100% rename from pagetop/src/core/app/db.rs rename to pagetop/src/app/db.rs diff --git a/pagetop/src/core/app/definition.rs b/pagetop/src/app/definition.rs similarity index 100% rename from pagetop/src/core/app/definition.rs rename to pagetop/src/app/definition.rs diff --git a/pagetop/src/core/app/locale.rs b/pagetop/src/app/locale.rs similarity index 100% rename from pagetop/src/core/app/locale.rs rename to pagetop/src/app/locale.rs diff --git a/pagetop/src/core/app/tracing.rs b/pagetop/src/app/tracing.rs similarity index 100% rename from pagetop/src/core/app/tracing.rs rename to pagetop/src/app/tracing.rs diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index e3208027..7b25095b 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -1,4 +1,3 @@ -pub mod app; // API to initialize the PageTop base application. pub mod component; // API to build new components. pub mod hook; // API to define functions that alter the behavior of PageTop core. pub mod module; // API to add new features with modules. diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 5131a878..1a20688c 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,5 +1,4 @@ -use crate::{Lazy, run_now, trace}; -use crate::core::app; +use crate::{Lazy, app, run_now, trace}; use crate::core::hook::add_hook; use crate::db::*; use super::ModuleTrait; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 89904cc0..38621d82 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,4 @@ -use crate::util; -use crate::core::app; +use crate::{app, util}; use crate::core::hook::HookItem; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index dc693e70..2a02b2ec 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,5 +1,4 @@ -use crate::{Lazy, theme_static_files, trace}; -use crate::core::app; +use crate::{Lazy, app, theme_static_files, trace}; use super::ThemeTrait; use std::sync::RwLock; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 841632ba..951c7a50 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,6 @@ -use crate::{concat_string, util}; +use crate::{app, concat_string, util}; use crate::config::SETTINGS; use crate::html::{Markup, html}; -use crate::core::app; use crate::core::component::{ComponentTrait, Favicon, InContext}; use crate::response::page::Page; use crate::base::component::Chunck; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index c4081535..79b3e3e5 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -18,7 +18,9 @@ pub mod html; // HTML en código. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] pub mod db; // Acceso a base de datos. -pub mod core; // Main APIs for app, components, hooks, modules and themes. +pub mod app; // Prepare and run the application. + +pub mod core; // Main APIs for components, hooks, modules and themes. pub mod response; // Tipos de respuestas web. pub mod base; // Base de componentes, módulos y temas. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 98e88823..93e9e7e8 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -7,7 +7,7 @@ pub use fluent_templates::fluent_bundle::FluentValue; macro_rules! localize { ( $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; - use $crate::core::app::locale::LANGID; + use $crate::app::locale::LANGID; static_locale! { static LOCALES = { diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index e9b8a396..c772c91d 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -21,15 +21,16 @@ pub use crate::{ migration_item, }; +pub use crate::app; +pub use crate::app::AppTrait; +pub use crate::app::application::Application; + pub use crate::{hook_item, core::{ - app, component::*, hook::*, module::*, theme::*, }}; -pub use crate::core::app::AppTrait; -pub use crate::core::app::application::Application; pub use crate::response::page::*; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index ce1ab12b..fb9f0fa8 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,7 +1,6 @@ -use crate::{Lazy, trace}; +use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::*; -use crate::core::app; use crate::core::hook::{hook_ref, run_hooks}; use crate::core::component::*; use super::{BEFORE_RENDER_PAGE_HOOK, BeforeRenderPageHook}; From aab74546ed857352050cf049f2cdb4d42caa0497 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 May 2022 20:53:19 +0200 Subject: [PATCH 096/853] =?UTF-8?q?Retoca=20la=20disposici=C3=B3n=20de=20l?= =?UTF-8?q?os=20elementos=20de=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/context.rs | 166 +++++++++++++++++- pagetop/src/core/component/context/favicon.rs | 86 --------- .../src/core/component/context/javascript.rs | 43 ----- .../src/core/component/context/stylesheet.rs | 29 --- 4 files changed, 159 insertions(+), 165 deletions(-) delete mode 100644 pagetop/src/core/component/context/favicon.rs delete mode 100644 pagetop/src/core/component/context/javascript.rs delete mode 100644 pagetop/src/core/component/context/stylesheet.rs diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index a5c7a43a..9b788557 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,16 +1,168 @@ use crate::{Lazy, base, concat_string, util}; use crate::config::SETTINGS; -use crate::html::{Markup, html}; +use crate::html::{Markup, PreEscaped, html}; use crate::core::theme::*; -mod favicon; -pub use favicon::Favicon; +// Favicon. -mod javascript; -pub use javascript::{JavaScript, JSMode}; +pub struct Favicon(Vec<String>); -mod stylesheet; -pub use stylesheet::StyleSheet; +impl Favicon { + pub fn new() -> Self { + Favicon(Vec::new()) + } + + pub fn with_icon(self, image: &str) -> Self { + self.add_item("icon", image, "", "") + } + + pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { + self.add_item("icon", image, sizes, "") + } + + pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { + self.add_item("apple-touch-icon", image, sizes, "") + } + + pub fn with_mask_icon(self, image: &str, color: &str) -> Self { + self.add_item("mask-icon", image, "", color) + } + + pub fn with_manifest(self, file: &str) -> Self { + self.add_item("manifest", file, "", "") + } + + pub fn with_theme_color(mut self, color: &str) -> Self { + self.0.push(format!( + "<meta name=\"theme-color\" content=\"{}\">", color + )); + self + } + + pub fn with_ms_tile_color(mut self, color: &str) -> Self { + self.0.push(format!( + "<meta name=\"msapplication-TileColor\" content=\"{}\">", color + )); + self + } + + pub fn with_ms_tile_image(mut self, image: &str) -> Self { + self.0.push(format!( + "<meta name=\"msapplication-TileImage\" content=\"{}\">", image + )); + self + } + + fn add_item( + mut self, + rel : &str, + source: &str, + sizes : &str, + color : &str + ) -> Self { + let mut link: String = format!("<link rel=\"{}\"", rel); + if let Some(i) = source.rfind('.') { + link = match source[i..].to_owned().to_lowercase().as_str() { + ".gif" => format!("{} type=\"image/gif\"", link), + ".ico" => format!("{} type=\"image/x-icon\"", link), + ".jpg" => format!("{} type=\"image/jpg\"", link), + ".png" => format!("{} type=\"image/png\"", link), + ".svg" => format!("{} type=\"image/svg+xml\"", link), + _ => link + }; + } + if !sizes.is_empty() { + link = format!("{} sizes=\"{}\"", link, sizes); + } + if !color.is_empty() { + link = format!("{} color=\"{}\"", link, color); + } + self.0.push(format!("{} href=\"{}\">", link, source)); + self + } + + fn render(&self) -> Markup { + html! { + @for item in &self.0 { + (PreEscaped(item)) + } + } + } +} + +// JavaScript. + +#[derive(PartialEq)] +pub enum JSMode { Async, Defer, Normal } + +pub struct JavaScript { + source: &'static str, + weight: isize, + mode : JSMode, +} +impl JavaScript { + pub fn source(s: &'static str) -> Self { + JavaScript { + source: s, + weight: 0, + mode : JSMode::Defer, + } + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn with_mode(mut self, mode: JSMode) -> Self { + self.mode = mode; + self + } + + pub fn weight(self) -> isize { + self.weight + } + + pub fn render(&self) -> Markup { + html! { + script type="text/javascript" + src=(self.source) + async[self.mode == JSMode::Async] + defer[self.mode == JSMode::Defer] + {}; + } + } +} + +// StyleSheet. + +pub struct StyleSheet { + source: &'static str, + weight: isize, +} +impl StyleSheet { + pub fn source(s: &'static str) -> Self { + StyleSheet { + source: s, + weight: 0, + } + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn weight(self) -> isize { + self.weight + } + + fn render(&self) -> Markup { + html! { + link rel="stylesheet" href=(self.source); + } + } +} static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { match all::theme_by_single_name(&SETTINGS.app.theme) { diff --git a/pagetop/src/core/component/context/favicon.rs b/pagetop/src/core/component/context/favicon.rs deleted file mode 100644 index 1788540e..00000000 --- a/pagetop/src/core/component/context/favicon.rs +++ /dev/null @@ -1,86 +0,0 @@ -use crate::html::{Markup, PreEscaped, html}; - -pub struct Favicon(Vec<String>); - -impl Favicon { - pub fn new() -> Self { - Favicon(Vec::new()) - } - - pub fn with_icon(self, image: &str) -> Self { - self.add_item("icon", image, "", "") - } - - pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { - self.add_item("icon", image, sizes, "") - } - - pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { - self.add_item("apple-touch-icon", image, sizes, "") - } - - pub fn with_mask_icon(self, image: &str, color: &str) -> Self { - self.add_item("mask-icon", image, "", color) - } - - pub fn with_manifest(self, file: &str) -> Self { - self.add_item("manifest", file, "", "") - } - - pub fn with_theme_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"theme-color\" content=\"{}\">", color - )); - self - } - - pub fn with_ms_tile_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileColor\" content=\"{}\">", color - )); - self - } - - pub fn with_ms_tile_image(mut self, image: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileImage\" content=\"{}\">", image - )); - self - } - - fn add_item( - mut self, - rel : &str, - source: &str, - sizes : &str, - color : &str - ) -> Self { - let mut link: String = format!("<link rel=\"{}\"", rel); - if let Some(i) = source.rfind('.') { - link = match source[i..].to_owned().to_lowercase().as_str() { - ".gif" => format!("{} type=\"image/gif\"", link), - ".ico" => format!("{} type=\"image/x-icon\"", link), - ".jpg" => format!("{} type=\"image/jpg\"", link), - ".png" => format!("{} type=\"image/png\"", link), - ".svg" => format!("{} type=\"image/svg+xml\"", link), - _ => link - }; - } - if !sizes.is_empty() { - link = format!("{} sizes=\"{}\"", link, sizes); - } - if !color.is_empty() { - link = format!("{} color=\"{}\"", link, color); - } - self.0.push(format!("{} href=\"{}\">", link, source)); - self - } - - pub(super) fn render(&self) -> Markup { - html! { - @for item in &self.0 { - (PreEscaped(item)) - } - } - } -} diff --git a/pagetop/src/core/component/context/javascript.rs b/pagetop/src/core/component/context/javascript.rs deleted file mode 100644 index 2f2d725b..00000000 --- a/pagetop/src/core/component/context/javascript.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::html::{Markup, html}; - -#[derive(PartialEq)] -pub enum JSMode { Async, Defer, Normal } - -pub struct JavaScript { - pub(super) source: &'static str, - pub(super) weight: isize, - pub(super) mode : JSMode, -} -impl JavaScript { - pub fn source(s: &'static str) -> Self { - JavaScript { - source: s, - weight: 0, - mode : JSMode::Defer, - } - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn with_mode(mut self, mode: JSMode) -> Self { - self.mode = mode; - self - } - - pub fn weight(self) -> isize { - self.weight - } - - pub(super) fn render(&self) -> Markup { - html! { - script type="text/javascript" - src=(self.source) - async[self.mode == JSMode::Async] - defer[self.mode == JSMode::Defer] - {}; - } - } -} diff --git a/pagetop/src/core/component/context/stylesheet.rs b/pagetop/src/core/component/context/stylesheet.rs deleted file mode 100644 index f7803938..00000000 --- a/pagetop/src/core/component/context/stylesheet.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::html::{Markup, html}; - -pub struct StyleSheet { - pub(super) source: &'static str, - pub(super) weight: isize, -} -impl StyleSheet { - pub fn source(s: &'static str) -> Self { - StyleSheet { - source: s, - weight: 0, - } - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn weight(self) -> isize { - self.weight - } - - pub(super) fn render(&self) -> Markup { - html! { - link rel="stylesheet" href=(self.source); - } - } -} From 9f6b790a9d39fdb2e0af88c3f13a051956dd5c01 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 May 2022 20:54:40 +0200 Subject: [PATCH 097/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index d044369c..6bde05af 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.14" +version = "0.0.15" edition = "2021" authors = [ From 18bec0543c2152da29217bbfaaabdedb41591713 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 May 2022 22:18:28 +0200 Subject: [PATCH 098/853] Modifica la fuente de los activos globales --- pagetop/src/base/component/menu.rs | 6 +++--- pagetop/src/base/theme/aliner.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 4 ++-- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/core/component/context.rs | 16 ++++------------ pagetop/src/core/component/definition.rs | 2 +- pagetop/src/response/page/definition.rs | 2 +- 7 files changed, 13 insertions(+), 21 deletions(-) diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index ef7668aa..22902ed2 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -208,13 +208,13 @@ impl ComponentTrait for Menu { fn default_render(&self, context: &mut InContext) -> Markup { context - .add_stylesheet(StyleSheet::source( + .add_stylesheet(StyleSheet::with_source( "/theme/menu/css/menu.css?ver=1.1.1" )) - .add_stylesheet(StyleSheet::source( + .add_stylesheet(StyleSheet::with_source( "/theme/menu/css/menu-clean.css?ver=1.1.1" )) - .add_javascript(JavaScript::source( + .add_javascript(JavaScript::with_source( "/theme/menu/js/menu.min.js?ver=1.1.1" )) .add_jquery(); diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index ae6c7475..e4180303 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -22,7 +22,7 @@ impl ThemeTrait for Aliner { .with_icon("/theme/favicon.png") ) .add_stylesheet( - StyleSheet::source( + StyleSheet::with_source( "/aliner/css/styles.css" ) .with_weight(-99) diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 494bda17..ec294457 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -24,13 +24,13 @@ impl ThemeTrait for Bootsier { .with_icon("/theme/favicon.png") ) .add_stylesheet( - StyleSheet::source( + StyleSheet::with_source( "/bootsier/css/bootstrap.min.css?ver=5.1.3" ) .with_weight(-99) ) .add_javascript( - JavaScript::source( + JavaScript::with_source( "/bootsier/js/bootstrap.bundle.min.js?ver=5.1.3" ) .with_weight(-99) diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index f099d880..9dfde724 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -22,7 +22,7 @@ impl ThemeTrait for Bulmix { .with_icon("/theme/favicon.png") ) .add_stylesheet( - StyleSheet::source( + StyleSheet::with_source( "/bulmix/css/bulma.min.css?ver=0.9.3" ) .with_weight(-99) diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 9b788557..6fcf7be8 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -101,7 +101,7 @@ pub struct JavaScript { mode : JSMode, } impl JavaScript { - pub fn source(s: &'static str) -> Self { + pub fn with_source(s: &'static str) -> Self { JavaScript { source: s, weight: 0, @@ -119,11 +119,7 @@ impl JavaScript { self } - pub fn weight(self) -> isize { - self.weight - } - - pub fn render(&self) -> Markup { + fn render(&self) -> Markup { html! { script type="text/javascript" src=(self.source) @@ -141,7 +137,7 @@ pub struct StyleSheet { weight: isize, } impl StyleSheet { - pub fn source(s: &'static str) -> Self { + pub fn with_source(s: &'static str) -> Self { StyleSheet { source: s, weight: 0, @@ -153,10 +149,6 @@ impl StyleSheet { self } - pub fn weight(self) -> isize { - self.weight - } - fn render(&self) -> Markup { html! { link rel="stylesheet" href=(self.source); @@ -234,7 +226,7 @@ impl InContext { pub fn add_jquery(&mut self) -> &mut Self { if !self.with_jquery { self.add_javascript( - JavaScript::source( + JavaScript::with_source( "/theme/js/jquery.min.js?ver=3.6.0" ) .with_weight(isize::MIN) diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 96950798..4912214e 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -55,7 +55,7 @@ pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InCont // Acciones de los módulos antes de renderizar el componente. run_hooks( BEFORE_RENDER_COMPONENT_HOOK, - |a| hook_ref::<BeforeRenderComponentHook>(&**a).run(component, context) + |hook| hook_ref::<BeforeRenderComponentHook>(&**hook).run(component, context) ); // Acciones del tema antes de renderizar el componente. diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index fb9f0fa8..ba210d2d 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -153,7 +153,7 @@ impl<'a> Page<'a> { // Acciones de los módulos antes de renderizar la página. run_hooks( BEFORE_RENDER_PAGE_HOOK, - |a| hook_ref::<BeforeRenderPageHook>(&**a).run(self) + |hook| hook_ref::<BeforeRenderPageHook>(&**hook).run(self) ); // Acciones del tema antes de renderizar la página. From 658d88a383b554e3ffaf510ae401cd8a13cad69c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 16 May 2022 18:41:51 +0200 Subject: [PATCH 099/853] Elimina before_render() en la def. de componentes --- pagetop/src/base/component/form/input.rs | 23 +++++------------------ pagetop/src/core/component/definition.rs | 7 ------- 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index c96197e8..18a980e3 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -47,7 +47,6 @@ impl ComponentTrait for Input { classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } - .with_classes("form-type-textfield", ClassesOp::AddFirst) } fn handler(&self) -> &'static str { @@ -62,13 +61,6 @@ impl ComponentTrait for Input { self.weight } - fn before_render(&mut self, _: &mut InContext) { - if let Some(name) = self.name() { - let class = concat_string!("form-item-", name); - self.alter_classes(class.as_str(), ClassesOp::AddFirst); - } - } - fn default_render(&self, _: &mut InContext) -> Markup { let type_input = match self.input_type() { InputType::Email => "email", @@ -134,36 +126,31 @@ impl Input { } pub fn password() -> Self { - let mut input = Input::new() - .with_classes("form-type-password", ClassesOp::Replace("form-type-textfield")); + let mut input = Input::new(); input.input_type = InputType::Password; input } pub fn search() -> Self { - let mut input = Input::new() - .with_classes("form-type-search", ClassesOp::Replace("form-type-textfield")); + let mut input = Input::new(); input.input_type = InputType::Search; input } pub fn email() -> Self { - let mut input = Input::new() - .with_classes("form-type-email", ClassesOp::Replace("form-type-textfield")); + let mut input = Input::new(); input.input_type = InputType::Email; input } pub fn telephone() -> Self { - let mut input = Input::new() - .with_classes("form-type-telephone", ClassesOp::Replace("form-type-textfield")); + let mut input = Input::new(); input.input_type = InputType::Telephone; input } pub fn url() -> Self { - let mut input = Input::new() - .with_classes("form-type-url", ClassesOp::Replace("form-type-textfield")); + let mut input = Input::new(); input.input_type = InputType::Url; input } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 4912214e..4b49526f 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -26,10 +26,6 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { 0 } - #[allow(unused_variables)] - fn before_render(&mut self, context: &mut InContext) { - } - #[allow(unused_variables)] fn default_render(&self, context: &mut InContext) -> Markup { html! {} @@ -49,9 +45,6 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { } pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InContext) -> Markup { - // Acciones del componente antes de renderizar. - component.before_render(context); - // Acciones de los módulos antes de renderizar el componente. run_hooks( BEFORE_RENDER_COMPONENT_HOOK, From f5314e9ca4caa126db5729521fac99c99ca51750 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 16 May 2022 20:44:17 +0200 Subject: [PATCH 100/853] =?UTF-8?q?Modifica=20la=20localizaci=C3=B3n=20de?= =?UTF-8?q?=20activos=20en=20el=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/form/input.rs | 20 ++- pagetop/src/base/theme/aliner.rs | 7 +- pagetop/src/base/theme/bootsier.rs | 7 +- pagetop/src/base/theme/bulmix.rs | 7 +- pagetop/src/core/component.rs | 5 - pagetop/src/core/component/context.rs | 204 ++--------------------- pagetop/src/core/theme/definition.rs | 11 +- pagetop/src/html.rs | 10 ++ pagetop/src/html/assets.rs | 41 +++++ pagetop/src/html/assets/javascript.rs | 51 ++++++ pagetop/src/html/assets/stylesheet.rs | 37 ++++ pagetop/src/html/favicon.rs | 86 ++++++++++ 12 files changed, 269 insertions(+), 217 deletions(-) create mode 100644 pagetop/src/html/assets.rs create mode 100644 pagetop/src/html/assets/javascript.rs create mode 100644 pagetop/src/html/assets/stylesheet.rs create mode 100644 pagetop/src/html/favicon.rs diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 18a980e3..0c615de2 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -47,6 +47,7 @@ impl ComponentTrait for Input { classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } + .with_classes("form-type-textfield", ClassesOp::AddFirst) } fn handler(&self) -> &'static str { @@ -126,31 +127,36 @@ impl Input { } pub fn password() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-password", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Password; input } pub fn search() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-search", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Search; input } pub fn email() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-email", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Email; input } pub fn telephone() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-telephone", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Telephone; input } pub fn url() -> Self { - let mut input = Input::new(); + let mut input = Input::new() + .with_classes("form-type-url", ClassesOp::Replace("form-type-textfield")); input.input_type = InputType::Url; input } @@ -256,6 +262,10 @@ impl Input { pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.with_value(name); + self.alter_classes( + concat_string!("form-item form-item-", name).as_str(), + ClassesOp::SetDefault + ); self } diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index e4180303..02ed19d3 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -17,10 +17,9 @@ impl ThemeTrait for Aliner { fn before_render_page(&self, page: &mut Page) { page.context() - .with_favicon( - Favicon::new() - .with_icon("/theme/favicon.png") - ) + .with_favicon(Some(Favicon::new() + .with_icon("/theme/favicon.png") + )) .add_stylesheet( StyleSheet::with_source( "/aliner/css/styles.css" diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index ec294457..8512234f 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -19,10 +19,9 @@ impl ThemeTrait for Bootsier { fn before_render_page(&self, page: &mut Page) { page.context() - .with_favicon( - Favicon::new() - .with_icon("/theme/favicon.png") - ) + .with_favicon(Some(Favicon::new() + .with_icon("/theme/favicon.png") + )) .add_stylesheet( StyleSheet::with_source( "/bootsier/css/bootstrap.min.css?ver=5.1.3" diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 9dfde724..a1b98275 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -17,10 +17,9 @@ impl ThemeTrait for Bulmix { fn before_render_page(&self, page: &mut Page) { page.context() - .with_favicon( - Favicon::new() - .with_icon("/theme/favicon.png") - ) + .with_favicon(Some(Favicon::new() + .with_icon("/theme/favicon.png") + )) .add_stylesheet( StyleSheet::with_source( "/bulmix/css/bulma.min.css?ver=0.9.3" diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 038ee93d..ef3e33d5 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -6,11 +6,6 @@ pub use hook::{ mod context; pub use context::InContext; -pub use context::{ - Favicon, - JavaScript, JSMode, - StyleSheet, -}; mod definition; pub use definition::{ diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 6fcf7be8..916d0d96 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,163 +1,11 @@ use crate::{Lazy, base, concat_string, util}; use crate::config::SETTINGS; -use crate::html::{Markup, PreEscaped, html}; -use crate::core::theme::*; - -// Favicon. - -pub struct Favicon(Vec<String>); - -impl Favicon { - pub fn new() -> Self { - Favicon(Vec::new()) - } - - pub fn with_icon(self, image: &str) -> Self { - self.add_item("icon", image, "", "") - } - - pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { - self.add_item("icon", image, sizes, "") - } - - pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { - self.add_item("apple-touch-icon", image, sizes, "") - } - - pub fn with_mask_icon(self, image: &str, color: &str) -> Self { - self.add_item("mask-icon", image, "", color) - } - - pub fn with_manifest(self, file: &str) -> Self { - self.add_item("manifest", file, "", "") - } - - pub fn with_theme_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"theme-color\" content=\"{}\">", color - )); - self - } - - pub fn with_ms_tile_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileColor\" content=\"{}\">", color - )); - self - } - - pub fn with_ms_tile_image(mut self, image: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileImage\" content=\"{}\">", image - )); - self - } - - fn add_item( - mut self, - rel : &str, - source: &str, - sizes : &str, - color : &str - ) -> Self { - let mut link: String = format!("<link rel=\"{}\"", rel); - if let Some(i) = source.rfind('.') { - link = match source[i..].to_owned().to_lowercase().as_str() { - ".gif" => format!("{} type=\"image/gif\"", link), - ".ico" => format!("{} type=\"image/x-icon\"", link), - ".jpg" => format!("{} type=\"image/jpg\"", link), - ".png" => format!("{} type=\"image/png\"", link), - ".svg" => format!("{} type=\"image/svg+xml\"", link), - _ => link - }; - } - if !sizes.is_empty() { - link = format!("{} sizes=\"{}\"", link, sizes); - } - if !color.is_empty() { - link = format!("{} color=\"{}\"", link, color); - } - self.0.push(format!("{} href=\"{}\">", link, source)); - self - } - - fn render(&self) -> Markup { - html! { - @for item in &self.0 { - (PreEscaped(item)) - } - } - } -} - -// JavaScript. - -#[derive(PartialEq)] -pub enum JSMode { Async, Defer, Normal } - -pub struct JavaScript { - source: &'static str, - weight: isize, - mode : JSMode, -} -impl JavaScript { - pub fn with_source(s: &'static str) -> Self { - JavaScript { - source: s, - weight: 0, - mode : JSMode::Defer, - } - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn with_mode(mut self, mode: JSMode) -> Self { - self.mode = mode; - self - } - - fn render(&self) -> Markup { - html! { - script type="text/javascript" - src=(self.source) - async[self.mode == JSMode::Async] - defer[self.mode == JSMode::Defer] - {}; - } - } -} - -// StyleSheet. - -pub struct StyleSheet { - source: &'static str, - weight: isize, -} -impl StyleSheet { - pub fn with_source(s: &'static str) -> Self { - StyleSheet { - source: s, - weight: 0, - } - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - fn render(&self) -> Markup { - html! { - link rel="stylesheet" href=(self.source); - } - } -} +use crate::html::*; +use crate::core::theme::ThemeTrait; +use crate::core::theme::all::theme_by_single_name; static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - match all::theme_by_single_name(&SETTINGS.app.theme) { + match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, } @@ -167,8 +15,8 @@ pub struct InContext { theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, metadata : Vec<(String, String)>, - stylesheets: Vec<StyleSheet>, - javascripts: Vec<JavaScript>, + stylesheets: Assets<StyleSheet>, + javascripts: Assets<JavaScript>, with_jquery: bool, id_counter : usize, } @@ -179,20 +27,20 @@ impl InContext { theme : *DEFAULT_THEME, favicon : None, metadata : Vec::new(), - stylesheets: Vec::new(), - javascripts: Vec::new(), + stylesheets: Assets::<StyleSheet>::new(), + javascripts: Assets::<JavaScript>::new(), with_jquery: false, id_counter : 0, } } pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = all::theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); + self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); self } - pub fn with_favicon(&mut self, favicon: Favicon) -> &mut Self { - self.favicon = Some(favicon); + pub fn with_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { + self.favicon = favicon; self } @@ -202,24 +50,12 @@ impl InContext { } pub fn add_stylesheet(&mut self, css: StyleSheet) -> &mut Self { - match self.stylesheets.iter().position(|x| x.source == css.source) { - Some(index) => if self.stylesheets[index].weight > css.weight { - self.stylesheets.remove(index); - self.stylesheets.push(css); - }, - _ => self.stylesheets.push(css) - } + self.stylesheets.add(css); self } pub fn add_javascript(&mut self, js: JavaScript) -> &mut Self { - match self.javascripts.iter().position(|x| x.source == js.source) { - Some(index) => if self.javascripts[index].weight > js.weight { - self.javascripts.remove(index); - self.javascripts.push(js); - }, - _ => self.javascripts.push(js) - } + self.javascripts.add(js); self } @@ -246,12 +82,6 @@ impl InContext { /// InContext RENDER. pub fn render(&mut self) -> Markup { - let ordered_css = &mut self.stylesheets; - ordered_css.sort_by_key(|css| css.weight); - - let ordered_js = &mut self.javascripts; - ordered_js.sort_by_key(|js| js.weight); - html! { @match &self.favicon { Some(favicon) => (favicon.render()), @@ -260,12 +90,8 @@ impl InContext { @for (name, content) in &self.metadata { meta name=(name) content=(content) {} } - @for css in ordered_css { - (css.render()) - } - @for js in ordered_js { - (js.render()) - } + (self.stylesheets.render()) + (self.javascripts.render()) } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 951c7a50..520eadc4 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,7 @@ use crate::{app, concat_string, util}; use crate::config::SETTINGS; -use crate::html::{Markup, html}; -use crate::core::component::{ComponentTrait, Favicon, InContext}; +use crate::html::{Favicon, Markup, html}; +use crate::core::component::{ComponentTrait, InContext}; use crate::response::page::Page; use crate::base::component::Chunck; @@ -28,10 +28,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { page.context() - .with_favicon( - Favicon::new() - .with_icon("/theme/favicon.png") - ); + .with_favicon(Some(Favicon::new() + .with_icon("/theme/favicon.png") + )); } fn render_page_head(&self, page: &mut Page) -> Markup { diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 56e5c6d2..0afcdadd 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -1,8 +1,18 @@ pub use maud::{DOCTYPE, Markup, PreEscaped, html}; +mod assets; +pub use assets::Assets; +pub use assets::javascript::{JavaScript, JSMode}; +pub use assets::stylesheet::StyleSheet; + +mod favicon; +pub use favicon::Favicon; + mod optiden; pub use optiden::OptIden; + mod optattr; pub use optattr::OptAttr; + mod classes; pub use classes::{Classes, ClassesOp}; diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs new file mode 100644 index 00000000..921d6816 --- /dev/null +++ b/pagetop/src/html/assets.rs @@ -0,0 +1,41 @@ +pub mod javascript; +pub mod stylesheet; + +use crate::html::{Markup, html}; + +pub trait AssetsTrait { + fn source(&self) -> &'static str; + + fn weight(&self) -> isize; + + fn render(&self) -> Markup; +} + +pub struct Assets<T>(Vec<T>); + +impl<T: AssetsTrait> Assets<T> { + pub fn new() -> Self { + Assets::<T>(Vec::<T>::new()) + } + + pub fn add(&mut self, assets: T) -> &mut Self { + match self.0.iter().position(|x| x.source() == assets.source()) { + Some(index) => if self.0[index].weight() > assets.weight() { + self.0.remove(index); + self.0.push(assets); + }, + _ => self.0.push(assets) + } + self + } + + pub fn render(&mut self) -> Markup { + let assets = &mut self.0; + assets.sort_by_key(|a| a.weight()); + html! { + @for a in assets { + (a.render()) + } + } + } +} \ No newline at end of file diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs new file mode 100644 index 00000000..40cdfb07 --- /dev/null +++ b/pagetop/src/html/assets/javascript.rs @@ -0,0 +1,51 @@ +use crate::html::{Markup, html}; +use super::AssetsTrait; + +#[derive(PartialEq)] +pub enum JSMode { Async, Defer, Normal } + +pub struct JavaScript { + source: &'static str, + weight: isize, + mode : JSMode, +} + +impl AssetsTrait for JavaScript { + fn source(&self) -> &'static str { + self.source + } + + fn weight(&self) -> isize { + self.weight + } + + fn render(&self) -> Markup { + html! { + script type="text/javascript" + src=(self.source) + async[self.mode == JSMode::Async] + defer[self.mode == JSMode::Defer] + {}; + } + } +} + +impl JavaScript { + pub fn with_source(s: &'static str) -> Self { + JavaScript { + source: s, + weight: 0, + mode : JSMode::Defer, + } + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn with_mode(mut self, mode: JSMode) -> Self { + self.mode = mode; + self + } +} diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs new file mode 100644 index 00000000..ff7da045 --- /dev/null +++ b/pagetop/src/html/assets/stylesheet.rs @@ -0,0 +1,37 @@ +use crate::html::{Markup, html}; +use super::AssetsTrait; + +pub struct StyleSheet { + source: &'static str, + weight: isize, +} + +impl AssetsTrait for StyleSheet { + fn source(&self) -> &'static str { + self.source + } + + fn weight(&self) -> isize { + self.weight + } + + fn render(&self) -> Markup { + html! { + link rel="stylesheet" href=(self.source); + } + } +} + +impl StyleSheet { + pub fn with_source(s: &'static str) -> Self { + StyleSheet { + source: s, + weight: 0, + } + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } +} diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs new file mode 100644 index 00000000..d8d6fc18 --- /dev/null +++ b/pagetop/src/html/favicon.rs @@ -0,0 +1,86 @@ +use crate::html::{Markup, PreEscaped, html}; + +pub struct Favicon(Vec<String>); + +impl Favicon { + pub fn new() -> Self { + Favicon(Vec::new()) + } + + pub fn with_icon(self, image: &str) -> Self { + self.add_item("icon", image, "", "") + } + + pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { + self.add_item("icon", image, sizes, "") + } + + pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { + self.add_item("apple-touch-icon", image, sizes, "") + } + + pub fn with_mask_icon(self, image: &str, color: &str) -> Self { + self.add_item("mask-icon", image, "", color) + } + + pub fn with_manifest(self, file: &str) -> Self { + self.add_item("manifest", file, "", "") + } + + pub fn with_theme_color(mut self, color: &str) -> Self { + self.0.push(format!( + "<meta name=\"theme-color\" content=\"{}\">", color + )); + self + } + + pub fn with_ms_tile_color(mut self, color: &str) -> Self { + self.0.push(format!( + "<meta name=\"msapplication-TileColor\" content=\"{}\">", color + )); + self + } + + pub fn with_ms_tile_image(mut self, image: &str) -> Self { + self.0.push(format!( + "<meta name=\"msapplication-TileImage\" content=\"{}\">", image + )); + self + } + + fn add_item( + mut self, + rel : &str, + source: &str, + sizes : &str, + color : &str + ) -> Self { + let mut link: String = format!("<link rel=\"{}\"", rel); + if let Some(i) = source.rfind('.') { + link = match source[i..].to_owned().to_lowercase().as_str() { + ".gif" => format!("{} type=\"image/gif\"", link), + ".ico" => format!("{} type=\"image/x-icon\"", link), + ".jpg" => format!("{} type=\"image/jpg\"", link), + ".png" => format!("{} type=\"image/png\"", link), + ".svg" => format!("{} type=\"image/svg+xml\"", link), + _ => link + }; + } + if !sizes.is_empty() { + link = format!("{} sizes=\"{}\"", link, sizes); + } + if !color.is_empty() { + link = format!("{} color=\"{}\"", link, color); + } + self.0.push(format!("{} href=\"{}\">", link, source)); + self + } + + pub(crate) fn render(&self) -> Markup { + html! { + @for item in &self.0 { + (PreEscaped(item)) + } + } + } +} From 5901ff6fcf3c5307bd4dcd6a9102a6e2470ba371 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 16 May 2022 21:49:11 +0200 Subject: [PATCH 101/853] Corrige referencias si no se usa base de datos --- pagetop/src/core/module/all.rs | 9 +++++++-- pagetop/src/lib.rs | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 1a20688c..aae071a5 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,8 +1,13 @@ -use crate::{Lazy, app, run_now, trace}; +use crate::{Lazy, app, trace}; use crate::core::hook::add_hook; -use crate::db::*; use super::ModuleTrait; +#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +use crate::{ + db::*, + run_now, +}; + use std::sync::RwLock; // Enabled modules. diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 79b3e3e5..06dc32bc 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -6,6 +6,7 @@ pub use doc_comment::doc_comment; // Local. +#[allow(unused_imports)] pub(crate) use futures::executor::block_on as run_now; // Public APIs. From d5c1495fa2fae5d62d93ce8304e6c0bdcb4f52f3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 17 May 2022 23:59:18 +0200 Subject: [PATCH 102/853] =?UTF-8?q?A=C3=B1ade=20un=20componente=20para=20i?= =?UTF-8?q?conos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 6 +- pagetop/src/base/component/anchor.rs | 42 +- pagetop/src/base/component/icon.rs | 95 + pagetop/src/base/module/demopage.rs | 25 +- pagetop/src/core/component/bundle.rs | 4 + .../static/theme/icons/bootstrap-icons.css | 1705 +++++++++++++++++ .../static/theme/icons/bootstrap-icons.woff | Bin 0 -> 137216 bytes .../static/theme/icons/bootstrap-icons.woff2 | Bin 0 -> 102380 bytes 8 files changed, 1863 insertions(+), 14 deletions(-) create mode 100644 pagetop/src/base/component/icon.rs create mode 100644 pagetop/static/theme/icons/bootstrap-icons.css create mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff create mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff2 diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 22caca38..b0fd2673 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -9,6 +9,10 @@ mod chunck; pub use chunck::{ CHUNCK_COMPONENT, Chunck }; +mod icon; +pub use icon::{ + ICON_COMPONENT, Icon +}; mod heading; pub use heading::{ HEADING_COMPONENT, Heading, HeadingDisplay, HeadingType @@ -19,7 +23,7 @@ pub use paragraph::{ }; mod anchor; pub use anchor::{ - ANCHOR_COMPONENT, Anchor, AnchorTarget, AnchorType + ANCHOR_COMPONENT, Anchor, AnchorIcon, AnchorTarget, AnchorType }; mod block; pub use block::{ diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 0c100f04..50d1b41e 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -16,12 +16,16 @@ pub enum AnchorTarget { Top, } +pub type AnchorIcon = ComponentsBundle; + pub struct Anchor { renderable : fn() -> bool, weight : isize, anchor_type: AnchorType, href : OptAttr, html : Markup, + left_icon : AnchorIcon, + right_icon : AnchorIcon, target : AnchorTarget, id : OptIden, classes : Classes, @@ -36,6 +40,8 @@ impl ComponentTrait for Anchor { anchor_type: AnchorType::Link, href : OptAttr::new(), html : html! {}, + left_icon : AnchorIcon::new(), + right_icon : AnchorIcon::new(), target : AnchorTarget::Default, id : OptIden::new(), classes : Classes::new(), @@ -55,7 +61,7 @@ impl ComponentTrait for Anchor { self.weight } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, context: &mut InContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Context(name) => Some(name.as_str()), @@ -70,7 +76,9 @@ impl ComponentTrait for Anchor { href=[self.href()] target=[target] { - (*self.html()) + (self.left_icon().render(context)) + (" ")(*self.html())(" ") + (self.right_icon().render(context)) } } } @@ -124,6 +132,16 @@ impl Anchor { self } + pub fn with_left_icon(mut self, icon: Icon) -> Self { + self.alter_left_icon(icon); + self + } + + pub fn with_right_icon(mut self, icon: Icon) -> Self { + self.alter_right_icon(icon); + self + } + pub fn with_target(mut self, target: AnchorTarget) -> Self { self.alter_target(target); self @@ -175,6 +193,18 @@ impl Anchor { self } + pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { + self.left_icon.clear(); + self.left_icon.add(icon); + self + } + + pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { + self.right_icon.clear(); + self.right_icon.add(icon); + self + } + pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { self.target = target; self @@ -209,6 +239,14 @@ impl Anchor { &self.html } + pub fn left_icon(&self) -> &AnchorIcon { + &self.left_icon + } + + pub fn right_icon(&self) -> &AnchorIcon { + &self.right_icon + } + pub fn target(&self) -> &AnchorTarget { &self.target } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs new file mode 100644 index 00000000..1fb24120 --- /dev/null +++ b/pagetop/src/base/component/icon.rs @@ -0,0 +1,95 @@ +use crate::prelude::*; + +pub const ICON_COMPONENT: &str = "pagetop::component::icon"; + +pub struct Icon { + renderable: fn() -> bool, + weight : isize, + icon_name : String, +} + +impl ComponentTrait for Icon { + fn new() -> Self { + Icon { + renderable: render_always, + weight : 0, + icon_name : "question-circle-fill".to_owned(), + } + } + + fn handler(&self) -> &'static str { + ICON_COMPONENT + } + + fn is_renderable(&self) -> bool { + (self.renderable)() + } + + fn weight(&self) -> isize { + self.weight + } + + fn default_render(&self, context: &mut InContext) -> Markup { + context + .add_stylesheet(StyleSheet::with_source( + "/theme/icons/bootstrap-icons.css?ver=1.8.2" + )); + + let name = concat_string!("bi-", self.icon_name); + html! { i class=(name) {}; } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Icon { + pub fn with(icon_name: &str) -> Self { + Icon::new().with_icon_name(icon_name) + } + + // Icon BUILDER. + + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); + self + } + + pub fn with_icon_name(mut self, name: &str) -> Self { + self.alter_icon_name(name); + self + } + + // Icon ALTER. + + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { + self.icon_name = name.to_owned(); + self + } + + // Icon GETTERS. + + pub fn icon_name(&self) -> &str { + &self.icon_name + } +} diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index f8753638..c3276124 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -58,17 +58,20 @@ fn hello_world() -> Container { "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" ])) })) - .add(Anchor::button("#", html! { ("Offered services") })) - .add(Anchor::button("#", html! { ("Get quote") })) - .add(Chunck::with(html! { - a class="btn-solid-lg" href="#services" { - "Offered services" - } - a class="quote" href="#contact" { - i class="fas fa-paper-plane" {} - "Get quote" - } - })) + .add(Anchor::button("#", + html! { + ("Offered services") + }).with_left_icon( + Icon::with("card-checklist") + ) + ) + .add(Anchor::button("#", + html! { + ("Get quote") + }).with_left_icon( + Icon::with("envelope-open-heart-fill") + ) + ) ) .add_column(grid::Column::new() .add(Image::image("/bootsier/images/demo-header.svg")) diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 0477a4fd..f1042166 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -21,6 +21,10 @@ impl ComponentsBundle { self.0.push(Arc::new(RwLock::new(component))); } + pub fn clear(&mut self) { + self.0.clear(); + } + pub fn render(&self, context: &mut InContext) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); diff --git a/pagetop/static/theme/icons/bootstrap-icons.css b/pagetop/static/theme/icons/bootstrap-icons.css new file mode 100644 index 00000000..9a7d8ae2 --- /dev/null +++ b/pagetop/static/theme/icons/bootstrap-icons.css @@ -0,0 +1,1705 @@ +@font-face { + font-family: "bootstrap-icons"; + src: url("bootstrap-icons.woff2?ver=1.8.2") format("woff2"), + url("bootstrap-icons.woff?ver=1.8.2") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-display: block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-1::before { content: "\f2a5"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-1::before { content: "\f68a"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-1::before { content: "\f68d"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-1::before { content: "\f690"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-1::before { content: "\f695"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-1::before { content: "\f698"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-mortorboard-fill::before { content: "\f6a2"; } +.bi-mortorboard::before { content: "\f6a3"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-1::before { content: "\f6b6"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash-1::before { content: "\f6c2"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport-1::before { content: "\f6e0"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-ssd-fill::before { content: "\f6ed"; } +.bi-ssd::before { content: "\f6ee"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt-1::before { content: "\f759"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls-1::before { content: "\f769"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff b/pagetop/static/theme/icons/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..4cd66b71ad5f51be58843c52c66f78a8f7b89e47 GIT binary patch literal 137216 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 NrT!1{z<Eso003f9u}}a2 literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff2 b/pagetop/static/theme/icons/bootstrap-icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..de01cad9d15e664cde293ac71d80f5cb2e0c1860 GIT binary patch literal 102380 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 G0001yd~9+6 literal 0 HcmV?d00001 From b3858887d419d81e41a44ba7eee28769ac09c5a9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 7 Jun 2022 06:44:51 +0200 Subject: [PATCH 103/853] =?UTF-8?q?A=C3=B1ade=20las=20licencias=20del=20pr?= =?UTF-8?q?oyecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 1 + LICENSE-APACHE | 201 +++++++++++++++++++++++++++++++++++++++ LICENSE-MIT | 21 ++++ README.md | 48 ++++++++++ drust/Cargo.toml | 1 + pagetop-admin/Cargo.toml | 1 + pagetop-node/Cargo.toml | 1 + pagetop-user/Cargo.toml | 1 + pagetop/Cargo.toml | 2 +- 9 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 LICENSE-APACHE create mode 100644 LICENSE-MIT create mode 100644 README.md diff --git a/CREDITS.md b/CREDITS.md index 4254ed59..4965de82 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -14,6 +14,7 @@ incluidas en `src/app/banner` son: * [starwars.flf](http://www.figlet.org/fontdb_example.cgi?font=starwars.flf) por *Ryan Youck*. + # Icono El monstruo sonriente de Frankenstein es una divertida creación de diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 00000000..263ddac1 --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 00000000..cd8af3d6 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Manuel Cillero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..9772e87c --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +[PageTop](https://suitepro.cillero.es/projects/pagetop/wiki) es un proyecto basado en el [lenguaje +de programación Rust](https://www.rust-lang.org/es/) que reúne algunos de los crates más estables y +populares en un único entorno para crear soluciones web modulares, extensibles y configurables. +Incluye **Drust**, un sistema de gestión de contenidos para crear sitios web dinámicos, rápidos y +seguros. + + +# Advertencia + +**PageTop** es un proyecto personal para aprender a programar con Rust y conocer su ecosistema. +Ahora mismo sólo se liberan versiones de desarrollo con pruebas de concepto. En este contexto la API +no tiene ninguna estabilidad y los cambios son constantes. Básicamente aún no hace nada. No puede +considerarse listo para usar en producción hasta que se libere la versión **0.1.0**. + + +# Estructura del código + +El repositorio se organiza en un *workspace* con los siguientes proyectos (*crates*): + +* [pagetop](pagetop/), es la librería esencial, reúne algunos de los crates más estables y + populares del ecosistema Rust para proporcionar APIs, patrones de desarrollo y buenas prácticas + para la creación avanzada de soluciones web. + +* [pagetop-admin](pagetop_admin/), habilita a otros módulos un entorno central para la + configuración de las aplicaciones. + +* [pagetop-user](pagetop_user/), para la gestión de usuarios, roles, permisos y sesiones en + aplicaciones desarrolladas con PageTop. + +* [pagetop-node](pagetop_node/), proporciona un entorno básico para crear contenidos y extenderlos + con funcionalidades básicas para, por ejemplo, crear un sitio básico con páginas, entradas de blog + y comentarios. + +* [drust](drust/), integra la librería y las extensiones anteriores de PageTop en un sistema de + gestión de contenidos para crear sitios web dinámicos, rápidos y seguros. + + +# Licencia + +Este proyecto tiene licencia, de hecho se puede aplicar cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 7a5412d5..4e06320a 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -11,6 +11,7 @@ description = """\ """ homepage = "https://suitepro.cillero.es/projects/drust" repository = "https://gitlab.com/manuelcillero/drust" +license = "Apache-2.0 or MIT" [dependencies.pagetop] path = "../pagetop" diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 3dfc6e60..1f037317 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -11,6 +11,7 @@ description = """\ """ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" +license = "Apache-2.0 or MIT" [dependencies] pagetop = { path = "../pagetop" } diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 29857822..71412013 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -11,6 +11,7 @@ description = """\ """ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" +license = "Apache-2.0 or MIT" [dependencies] pagetop = { path = "../pagetop" } diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 3395241f..8781d7ff 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -11,6 +11,7 @@ description = """\ """ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" +license = "Apache-2.0 or MIT" [dependencies] pagetop = { path = "../pagetop" } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 6bde05af..ba9a6726 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -12,7 +12,7 @@ description = """\ """ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" -license = "MIT" +license = "Apache-2.0 or MIT" keywords = [ "web", "cms", "framework", "frontend", "ssr" From a6c6d3387acfa003969ee437d30a8f26ef3efd39 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 7 Jun 2022 05:07:20 +0000 Subject: [PATCH 104/853] =?UTF-8?q?A=C3=B1ade=20licencia=20Apache=20versi?= =?UTF-8?q?=C3=B3n=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..ea237b29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From 45e43bfe70afb908703baee0de1545c77e4439e9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 7 Jun 2022 05:08:36 +0000 Subject: [PATCH 105/853] =?UTF-8?q?Revert=20"A=C3=B1ade=20licencia=20Apach?= =?UTF-8?q?e=20versi=C3=B3n=202.0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a6c6d3387acfa003969ee437d30a8f26ef3efd39 --- LICENSE | 201 -------------------------------------------------------- 1 file changed, 201 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index ea237b29..00000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2022 Manuel Cillero - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. From 091bbe16ba93cfa0a95f0384c56a370a6cb5cd48 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 23 Jun 2022 00:18:40 +0200 Subject: [PATCH 106/853] =?UTF-8?q?Modifica=20README=20en=20espa=C3=B1ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 ------------------------------------------------ README_es.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 48 deletions(-) delete mode 100644 README.md create mode 100644 README_es.md diff --git a/README.md b/README.md deleted file mode 100644 index 9772e87c..00000000 --- a/README.md +++ /dev/null @@ -1,48 +0,0 @@ -[PageTop](https://suitepro.cillero.es/projects/pagetop/wiki) es un proyecto basado en el [lenguaje -de programación Rust](https://www.rust-lang.org/es/) que reúne algunos de los crates más estables y -populares en un único entorno para crear soluciones web modulares, extensibles y configurables. -Incluye **Drust**, un sistema de gestión de contenidos para crear sitios web dinámicos, rápidos y -seguros. - - -# Advertencia - -**PageTop** es un proyecto personal para aprender a programar con Rust y conocer su ecosistema. -Ahora mismo sólo se liberan versiones de desarrollo con pruebas de concepto. En este contexto la API -no tiene ninguna estabilidad y los cambios son constantes. Básicamente aún no hace nada. No puede -considerarse listo para usar en producción hasta que se libere la versión **0.1.0**. - - -# Estructura del código - -El repositorio se organiza en un *workspace* con los siguientes proyectos (*crates*): - -* [pagetop](pagetop/), es la librería esencial, reúne algunos de los crates más estables y - populares del ecosistema Rust para proporcionar APIs, patrones de desarrollo y buenas prácticas - para la creación avanzada de soluciones web. - -* [pagetop-admin](pagetop_admin/), habilita a otros módulos un entorno central para la - configuración de las aplicaciones. - -* [pagetop-user](pagetop_user/), para la gestión de usuarios, roles, permisos y sesiones en - aplicaciones desarrolladas con PageTop. - -* [pagetop-node](pagetop_node/), proporciona un entorno básico para crear contenidos y extenderlos - con funcionalidades básicas para, por ejemplo, crear un sitio básico con páginas, entradas de blog - y comentarios. - -* [drust](drust/), integra la librería y las extensiones anteriores de PageTop en un sistema de - gestión de contenidos para crear sitios web dinámicos, rápidos y seguros. - - -# Licencia - -Este proyecto tiene licencia, de hecho se puede aplicar cualquiera de las siguientes a tu elección: - -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). - -* Licencia MIT - ([LICENSE-MIT](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). diff --git a/README_es.md b/README_es.md new file mode 100644 index 00000000..cada225c --- /dev/null +++ b/README_es.md @@ -0,0 +1,48 @@ +**PageTop** es un entorno de desarrollo basado en [Rust](https://www.rust-lang.org/es/) que reúne +algunos de los crates más estables y populares para crear soluciones web modulares, extensibles y +configurables. + +Incluye **Drust**, un sistema de gestión de contenidos basado en PageTop que permite crear, editar y +mantener sitios web dinámicos, rápidos y seguros. + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Estructura del código + +El repositorio se organiza en un *workspace* con los siguientes subproyectos: + +* [pagetop](pagetop/), es la librería esencial construida con *crates* estables y muy conocidos del + ecosistema Rust para proporcionar APIs, patrones de desarrollo y buenas prácticas para la creación + avanzada de soluciones web SSR (*Server-Side Rendering*). + +* [pagetop-admin](pagetop_admin/), módulo que proporciona a otros módulos un lugar común donde + presentar a los administradores sus opciones de configuración. + +* [pagetop-user](pagetop_user/), módulo para añadir una gestión de usuarios, roles, permisos y + sesiones en aplicaciones desarrolladas con PageTop. + +* [pagetop-node](pagetop_node/), módulo para crear y extender los tipos de contenido que puede + gestionar una solución web de propósito general o personalizado. + +* [drust](drust/), es una aplicación humildemente inspirada en [Drupal](https://www.drupal.org) que + proporciona un CMS (*Content Management System*) o sistema de gestión de contenidos para construir + sitios web administrados y configurables. + + +# Licencia + +Este proyecto tiene licencia, de hecho se puede aplicar cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). From 0bad86cf686d8cc04f7905e0db01fec77abd7f85 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 23 Jun 2022 00:20:44 +0200 Subject: [PATCH 107/853] =?UTF-8?q?Corrige=20presentaci=C3=B3n=20de=20READ?= =?UTF-8?q?ME=20en=20GitHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_es.md => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README_es.md => README.md (100%) diff --git a/README_es.md b/README.md similarity index 100% rename from README_es.md rename to README.md From 7c30a90c76a4f5624b0d0c4f49ceb6e6108eca19 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 28 Jun 2022 23:52:51 +0200 Subject: [PATCH 108/853] =?UTF-8?q?Actualiza=20SeaORM=20a=20la=20versi?= =?UTF-8?q?=C3=B3n=200.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++------ pagetop/Cargo.toml | 18 ++++++++---------- pagetop/src/db.rs | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index cada225c..9f8d5024 100644 --- a/README.md +++ b/README.md @@ -24,15 +24,15 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: * [pagetop-admin](pagetop_admin/), módulo que proporciona a otros módulos un lugar común donde presentar a los administradores sus opciones de configuración. -* [pagetop-user](pagetop_user/), módulo para añadir una gestión de usuarios, roles, permisos y - sesiones en aplicaciones desarrolladas con PageTop. +* [pagetop-user](pagetop_user/), módulo para añadir gestión de usuarios, roles, permisos y sesiones + en aplicaciones desarrolladas con PageTop. -* [pagetop-node](pagetop_node/), módulo para crear y extender los tipos de contenido que puede - gestionar una solución web de propósito general o personalizado. +* [pagetop-node](pagetop_node/), módulo para crear, extender o personalizar los tipos de contenido + que puede administrar un sitio web. -* [drust](drust/), es una aplicación humildemente inspirada en [Drupal](https://www.drupal.org) que +* [drust](drust/) es una aplicación inspirada modestamente en [Drupal](https://www.drupal.org) que proporciona un CMS (*Content Management System*) o sistema de gestión de contenidos para construir - sitios web administrados y configurables. + sitios web dinámicos, administrados y configurables. # Licencia diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index ba9a6726..15a979c3 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -26,14 +26,14 @@ concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.3" futures = "0.3.21" -once_cell = "1.10.0" +once_cell = "1.12.0" substring = "1.4.5" term_size = "0.3.2" url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } -tracing = "0.1.34" +tracing = "0.1.35" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.11", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } @@ -52,22 +52,20 @@ sycamore = { version = "0.7.1", features = ["ssr"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.7.1" +version = "0.8.0" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true -[dependencies.sea-schema] -version = "0.7.1" -features = ["debug-print", "migration"] -default-features = false +[dependencies.sea-orm-migration] +version = "0.8.3" optional = true [features] default = [] -mysql = ["sea-orm", "sea-schema", "sea-orm/sqlx-mysql"] -postgres = ["sea-orm", "sea-schema", "sea-orm/sqlx-postgres"] -sqlite = ["sea-orm", "sea-schema", "sea-orm/sqlx-sqlite"] +mysql = ["sea-orm", "sea-orm-migration", "sea-orm/sqlx-mysql"] +postgres = ["sea-orm", "sea-orm-migration", "sea-orm/sqlx-postgres"] +sqlite = ["sea-orm", "sea-orm-migration", "sea-orm/sqlx-sqlite"] [build-dependencies] actix-web-static-files = "3.0.5" diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index d350043e..3c25c0dc 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -2,7 +2,7 @@ pub use url::Url as DbUri; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; -pub use sea_schema::migration::prelude::*; +pub use sea_orm_migration::prelude::*; pub type MigrationItem = Box<dyn MigrationTrait>; From 7be5520f5cc17161368e246dbb2cfe09b263be2d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 28 Jun 2022 23:53:25 +0200 Subject: [PATCH 109/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 15a979c3..434fe9a0 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.15" +version = "0.0.16" edition = "2021" authors = [ From 82d23c2499280de583065712faed877da47f6120 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 2 Jul 2022 23:40:48 +0200 Subject: [PATCH 110/853] =?UTF-8?q?Actualiza=20actix-web=20a=20la=20versi?= =?UTF-8?q?=C3=B3n=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/Cargo.toml | 2 +- pagetop-admin/Cargo.toml | 2 +- pagetop/Cargo.toml | 6 +++--- pagetop/STARTER.bin.Cargo.toml | 4 ++-- pagetop/STARTER.lib.Cargo.toml | 2 +- pagetop/build.rs | 17 +++++++++-------- pagetop/src/app/application.rs | 4 +--- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/core/theme/definition.rs | 2 +- 9 files changed, 20 insertions(+), 21 deletions(-) diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 4e06320a..983496c2 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -19,7 +19,7 @@ features = ["mysql"] default-features = false [dependencies] -actix-web = "3.3.3" +actix-web = "4.1.0" pagetop-admin = { path = "../pagetop-admin" } pagetop-user = { path = "../pagetop-user" } pagetop-node = { path = "../pagetop-node" } diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 1f037317..7eebf18a 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -15,4 +15,4 @@ license = "Apache-2.0 or MIT" [dependencies] pagetop = { path = "../pagetop" } -maud = { version = "0.23.0" } +maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 11fd2d5e..9ca64c7c 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -43,11 +43,11 @@ fluent-templates = "0.7.1" unic-langid = "0.9.0" actix-web = "4.1.0" -actix-web-static-files = "4.0.0" actix-files = "0.6.1" +actix-web-static-files = "4.0.0" +static-files = "0.2.3" -maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd62165a075c7f16a32f8bbacc398f52d13", features = ["actix-web"] } -sycamore = { version = "0.7.1", features = ["ssr"] } +maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index f3169356..4958aea5 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -18,8 +18,8 @@ features = ["mysql"] default-features = false [dependencies] -actix-web = "3.3.3" +actix-web = "4.1.0" # Si se usa la macro html!: -maud = { version = "0.23.0" } +maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index c268b8cc..7c06a7fd 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -9,6 +9,6 @@ edition = "2021" [dependencies] pagetop = { path = "../pagetop" } # Si se usa la macro html!: -maud = { version = "0.23.0" } +maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/build.rs b/pagetop/build.rs index 483b2294..c0b8812e 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -3,17 +3,18 @@ use static_files::resource_dir; use std::env; use std::path::Path; -fn main() { - build_resource_dir("./static/theme", "theme.rs", "assets"); - build_resource_dir("./static/aliner", "aliner.rs", "assets"); - build_resource_dir("./static/bootsier", "bootsier.rs", "assets"); +fn main() -> std::io::Result<()> { + build_resource_dir("./static/theme", "theme")?; + build_resource_dir("./static/aliner", "aliner")?; + build_resource_dir("./static/bootsier", "bootsier")?; + build_resource_dir("./static/bulmix", "bulmix") } -fn build_resource_dir(dir: &str, with_filename: &str, with_fn: &str) { +fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { let mut resource = resource_dir(dir); resource.with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()).join(with_filename) + Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)) ); - resource.with_generated_fn(with_fn); - resource.build().unwrap(); + resource.with_module_name(format!("resources_{}", name)); + resource.build() } diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 4cb18d39..6f175555 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -4,7 +4,6 @@ use crate::core::{module, theme}; use super::AppTrait; use std::io::Error; -use actix_web::middleware::normalize::{NormalizePath, TrailingSlash}; use actix_web::dev::Server; pub struct Application { @@ -52,8 +51,7 @@ impl Application { // Prepara el servidor web. let server = super::HttpServer::new(move || { super::App::new() - .wrap(tracing_actix_web::TracingLogger) - .wrap(NormalizePath::new(TrailingSlash::Trim)) + .wrap(tracing_actix_web::TracingLogger::default()) .configure(&module::all::modules) .configure(&theme::all::themes) }) diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 8512234f..3e875f30 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -60,7 +60,7 @@ impl ThemeTrait for Bootsier { style="width: 20%; max-width: 188px" alt="Caution!"; div class="media-body" { - h1 class="display-4" { (s) } + h1 class="display-4" { (s.as_str()) } p class="lead" { (l(description)) } hr class="my-4"; p { (l(message)) } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 520eadc4..2b0c5d97 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -127,7 +127,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { .with_title(format!("Error {}", s.as_str()).as_str()) .add_to("content", Chunck::with(html! { div { - h1 { (s) } + h1 { (s.as_str()) } } })) .render() From 2cb23317a8f6142265e4abe4cf26bd248168cdde Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 2 Jul 2022 23:50:15 +0200 Subject: [PATCH 111/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 9ca64c7c..28d3c61b 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.16" +version = "0.0.17" edition = "2021" authors = [ From 37dbcaa84aa8fe40aabc899bdc96e6514eac3ada Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Jul 2022 20:26:49 +0200 Subject: [PATCH 112/853] =?UTF-8?q?A=C3=B1ade=20estilos=20en=20l=C3=ADnea?= =?UTF-8?q?=20para=20los=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 6 ++-- pagetop/src/base/component/icon.rs | 47 +++++++++++++++++++++------- pagetop/src/html.rs | 3 ++ pagetop/src/html/inline_styles.rs | 46 +++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 pagetop/src/html/inline_styles.rs diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 50d1b41e..82f863ed 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -77,7 +77,7 @@ impl ComponentTrait for Anchor { target=[target] { (self.left_icon().render(context)) - (" ")(*self.html())(" ") + (*self.html()) (self.right_icon().render(context)) } } @@ -195,13 +195,13 @@ impl Anchor { pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { self.left_icon.clear(); - self.left_icon.add(icon); + self.left_icon.add(icon.with_inline_style("margin-right", Some("5px"))); self } pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { self.right_icon.clear(); - self.right_icon.add(icon); + self.right_icon.add(icon.with_inline_style("margin-left", Some("5px"))); self } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 1fb24120..6e10cbe5 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -3,17 +3,19 @@ use crate::prelude::*; pub const ICON_COMPONENT: &str = "pagetop::component::icon"; pub struct Icon { - renderable: fn() -> bool, - weight : isize, - icon_name : String, + renderable : fn() -> bool, + weight : isize, + classes : Classes, + inline_styles: InlineStyles, } impl ComponentTrait for Icon { fn new() -> Self { Icon { - renderable: render_always, - weight : 0, - icon_name : "question-circle-fill".to_owned(), + renderable : render_always, + weight : 0, + classes : Classes::new_with_default("bi-question-circle-fill"), + inline_styles: InlineStyles::new(), } } @@ -35,8 +37,7 @@ impl ComponentTrait for Icon { "/theme/icons/bootstrap-icons.css?ver=1.8.2" )); - let name = concat_string!("bi-", self.icon_name); - html! { i class=(name) {}; } + html! { i class=[self.classes()] style=[self.inline_styles()] {}; } } fn as_ref_any(&self) -> &dyn AnyComponent { @@ -70,6 +71,16 @@ impl Icon { self } + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn with_inline_style(mut self, style: &str, value: Option<&str>) -> Self { + self.alter_inline_style(style, value); + self + } + // Icon ALTER. pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { @@ -83,13 +94,27 @@ impl Icon { } pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { - self.icon_name = name.to_owned(); + self.classes.alter(concat_string!("bi-", name).as_str(), ClassesOp::SetDefault); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_inline_style(&mut self, style: &str, value: Option<&str>) -> &mut Self { + self.inline_styles.add_style(style, value); self } // Icon GETTERS. - pub fn icon_name(&self) -> &str { - &self.icon_name + pub fn classes(&self) -> &Option<String> { + self.classes.option() + } + + pub fn inline_styles(&self) -> Option<String> { + self.inline_styles.option() } } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 0afcdadd..35db7b8c 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -16,3 +16,6 @@ pub use optattr::OptAttr; mod classes; pub use classes::{Classes, ClassesOp}; + +mod inline_styles; +pub use inline_styles::InlineStyles; diff --git a/pagetop/src/html/inline_styles.rs b/pagetop/src/html/inline_styles.rs new file mode 100644 index 00000000..c9e9faad --- /dev/null +++ b/pagetop/src/html/inline_styles.rs @@ -0,0 +1,46 @@ +use crate::concat_string; + +struct Style { + property: String, + inline : String, +} + +pub struct InlineStyles(Vec<Style>); + +impl InlineStyles { + pub fn new() -> Self { + InlineStyles(Vec::new()) + } + + pub fn add_style(&mut self, property: &str, value: Option<&str>) -> &Self { + let property = property.trim(); + match self.0.iter().position(|s| s.property.eq(property)) { + Some(pos) => { + self.0.remove(pos); + if let Some(value) = value { + self.0.insert(pos, Style { + property: property.to_owned(), + inline : concat_string!(property, ":", value.trim(), ";"), + }); + } + }, + _ => if let Some(value) = value { + self.0.push(Style { + property: property.to_owned(), + inline : concat_string!(property, ":", value.trim(), ";"), + }); + } + } + self + } + + pub fn option(&self) -> Option<String> { + if self.0.len() == 0 { + None + } else { + let mut inline = "".to_owned(); + self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); + Some(inline) + } + } +} From e2103f0943b58d7d0e9e788e07b5874730c7a27b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 4 Jul 2022 01:21:53 +0200 Subject: [PATCH 113/853] =?UTF-8?q?Modifica=20estilos=20en=20l=C3=ADnea=20?= =?UTF-8?q?s=C3=B3lo=20para=20composici=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se limitan los estilos que pueden añadirse en línea en los componentes a sólo los que afectan a la composición. Inicialmente se aceptan márgenes exteriores (margin) y espacios interiores (padding). --- pagetop/src/base/component/anchor.rs | 47 +++++--- pagetop/src/base/component/block.rs | 24 ++--- pagetop/src/base/component/container.rs | 34 +++--- pagetop/src/base/component/form/button.rs | 50 ++++----- pagetop/src/base/component/form/date.rs | 110 +++++++++---------- pagetop/src/base/component/form/form.rs | 36 +++---- pagetop/src/base/component/form/hidden.rs | 20 ++-- pagetop/src/base/component/form/input.rs | 110 +++++++++---------- pagetop/src/base/component/grid/column.rs | 14 +-- pagetop/src/base/component/grid/row.rs | 14 +-- pagetop/src/base/component/heading.rs | 26 ++--- pagetop/src/base/component/icon.rs | 34 +++--- pagetop/src/base/component/image.rs | 26 ++--- pagetop/src/base/component/menu.rs | 14 +-- pagetop/src/base/component/paragraph.rs | 14 +-- pagetop/src/base/module/demopage.rs | 4 +- pagetop/src/core/component/context.rs | 4 +- pagetop/src/core/theme/definition.rs | 6 +- pagetop/src/html.rs | 12 +-- pagetop/src/html/attribute.rs | 26 +++++ pagetop/src/html/classes.rs | 11 +- pagetop/src/html/identifier.rs | 26 +++++ pagetop/src/html/inline_styles.rs | 46 -------- pagetop/src/html/layout.rs | 124 ++++++++++++++++++++++ pagetop/src/html/optattr.rs | 26 ----- pagetop/src/html/optiden.rs | 26 ----- pagetop/src/response/page/definition.rs | 42 ++++---- 27 files changed, 513 insertions(+), 413 deletions(-) create mode 100644 pagetop/src/html/attribute.rs create mode 100644 pagetop/src/html/identifier.rs delete mode 100644 pagetop/src/html/inline_styles.rs create mode 100644 pagetop/src/html/layout.rs delete mode 100644 pagetop/src/html/optattr.rs delete mode 100644 pagetop/src/html/optiden.rs diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 82f863ed..2d6de2a1 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -22,13 +22,14 @@ pub struct Anchor { renderable : fn() -> bool, weight : isize, anchor_type: AnchorType, - href : OptAttr, + href : AttributeValue, html : Markup, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, - id : OptIden, + id : IdentifierValue, classes : Classes, + layout : Layout, template : String, } @@ -38,13 +39,14 @@ impl ComponentTrait for Anchor { renderable : render_always, weight : 0, anchor_type: AnchorType::Link, - href : OptAttr::new(), + href : AttributeValue::new(), html : html! {}, left_icon : AnchorIcon::new(), right_icon : AnchorIcon::new(), target : AnchorTarget::Default, - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new(), + layout : Layout::new(), template : "default".to_owned(), } } @@ -71,9 +73,10 @@ impl ComponentTrait for Anchor { }; html! { a - id=[self.id()] - class=[self.classes()] - href=[self.href()] + id=[self.id().get()] + class=[self.classes().get()] + style=[self.layout().get()] + href=[self.href().get()] target=[target] { (self.left_icon().render(context)) @@ -157,6 +160,11 @@ impl Anchor { self } + pub fn with_layout(mut self, property: LayoutProperty, value: LayoutUnit) -> Self { + self.alter_layout(property, value); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -195,13 +203,13 @@ impl Anchor { pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { self.left_icon.clear(); - self.left_icon.add(icon.with_inline_style("margin-right", Some("5px"))); + self.left_icon.add(icon.with_layout(LayoutProperty::MarginRight, LayoutUnit::Px(5))); self } pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { self.right_icon.clear(); - self.right_icon.add(icon.with_inline_style("margin-left", Some("5px"))); + self.right_icon.add(icon.with_layout(LayoutProperty::MarginLeft, LayoutUnit::Px(5))); self } @@ -220,6 +228,11 @@ impl Anchor { self } + pub fn alter_layout(&mut self, property: LayoutProperty, value: LayoutUnit) -> &mut Self { + self.layout.add(property, value); + self + } + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -231,8 +244,8 @@ impl Anchor { &self.anchor_type } - pub fn href(&self) -> &Option<String> { - self.href.option() + pub fn href(&self) -> &AttributeValue { + &self.href } pub fn html(&self) -> &Markup { @@ -251,12 +264,16 @@ impl Anchor { &self.target } - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn layout(&self) -> &Layout { + &self.layout } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index c3581654..f78c19f2 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -6,8 +6,8 @@ pub struct Block { renderable: fn() -> bool, weight : isize, components: ComponentsBundle, - title : OptAttr, - id : OptIden, + title : AttributeValue, + id : IdentifierValue, classes : Classes, template : String, } @@ -18,8 +18,8 @@ impl ComponentTrait for Block { renderable: render_always, weight : 0, components: ComponentsBundle::new(), - title : OptAttr::new(), - id : OptIden::new(), + title : AttributeValue::new(), + id : IdentifierValue::new(), classes : Classes::new_with_default("block"), template : "default".to_owned(), } @@ -40,8 +40,8 @@ impl ComponentTrait for Block { fn default_render(&self, context: &mut InContext) -> Markup { let id = context.required_id::<Block>(self.id()); html! { - div id=(id) class=[self.classes()] { - @match self.title() { + div id=(id) class=[self.classes().get()] { + @match self.title().get() { Some(title) => h2 class="block-title" { (title) }, None => {} } @@ -140,16 +140,16 @@ impl Block { // Block GETTERS. - pub fn title(&self) -> &Option<String> { - self.title.option() + pub fn title(&self) -> &AttributeValue { + &self.title } - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index f7e59740..d5d2eec7 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -9,7 +9,7 @@ pub struct Container { weight : isize, components : ComponentsBundle, container : ContainerType, - id : OptIden, + id : IdentifierValue, classes : Classes, inner_classes: Classes, template : String, @@ -22,7 +22,7 @@ impl ComponentTrait for Container { weight : 0, components : ComponentsBundle::new(), container : ContainerType::Wrapper, - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new_with_default("container"), inner_classes: Classes::new_with_default("container"), template : "default".to_owned(), @@ -44,35 +44,35 @@ impl ComponentTrait for Container { fn default_render(&self, context: &mut InContext) -> Markup { match self.container_type() { ContainerType::Header => html! { - header id=[self.id()] class=[self.classes()] { - div class=[self.inner_classes()] { + header id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { (self.components().render(context)) } } }, ContainerType::Footer => html! { - footer id=[self.id()] class=[self.classes()] { - div class=[self.inner_classes()] { + footer id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { (self.components().render(context)) } } }, ContainerType::Main => html! { - main id=[self.id()] class=[self.classes()] { - div class=[self.inner_classes()] { + main id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { (self.components().render(context)) } } }, ContainerType::Section => html! { - section id=[self.id()] class=[self.classes()] { - div class=[self.inner_classes()] { + section id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { (self.components().render(context)) } } }, _ => html! { - div id=[self.id()] class=[self.classes()] { + div id=[self.id().get()] class=[self.classes().get()] { (self.components().render(context)) } } @@ -194,16 +194,16 @@ impl Container { &self.container } - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } - pub fn inner_classes(&self) -> &Option<String> { - self.inner_classes.option() + pub fn inner_classes(&self) -> &Classes { + &self.inner_classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index fc3e82b3..9accd1c4 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -8,10 +8,10 @@ pub struct Button { renderable : fn() -> bool, weight : isize, button_type: ButtonType, - name : OptAttr, - value : OptAttr, - autofocus : OptAttr, - disabled : OptAttr, + name : AttributeValue, + value : AttributeValue, + autofocus : AttributeValue, + disabled : AttributeValue, classes : Classes, template : String, } @@ -22,10 +22,10 @@ impl ComponentTrait for Button { renderable : render_always, weight : 0, button_type: ButtonType::Button, - name : OptAttr::new(), - value : OptAttr::new(), - autofocus : OptAttr::new(), - disabled : OptAttr::new(), + name : AttributeValue::new(), + value : AttributeValue::new(), + autofocus : AttributeValue::new(), + disabled : AttributeValue::new(), classes : Classes::new_with_default("btn btn-primary"), template : "default".to_owned(), } @@ -50,7 +50,7 @@ impl ComponentTrait for Button { ButtonType::Reset => "reset", ButtonType::Submit => "submit", }; - let id = match self.name() { + let id = match self.name().get() { Some(name) => Some(concat_string!("edit-", name)), _ => None }; @@ -58,13 +58,13 @@ impl ComponentTrait for Button { button type=(button_type) id=[id] - class=[self.classes()] - name=[self.name()] - value=[self.value()] - autofocus=[self.autofocus()] - disabled=[self.disabled()] + class=[self.classes().get()] + name=[self.name().get()] + value=[self.value().get()] + autofocus=[self.autofocus().get()] + disabled=[self.disabled().get()] { - @match self.value() { + @match self.value().get() { Some(value) => { (value) }, None => {}, } @@ -198,24 +198,24 @@ impl Button { &self.button_type } - pub fn name(&self) -> &Option<String> { - self.name.option() + pub fn name(&self) -> &AttributeValue { + &self.name } - pub fn value(&self) -> &Option<String> { - self.value.option() + pub fn value(&self) -> &AttributeValue { + &self.value } - pub fn autofocus(&self) -> &Option<String> { - self.autofocus.option() + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus } - pub fn disabled(&self) -> &Option<String> { - self.disabled.option() + pub fn disabled(&self) -> &AttributeValue { + &self.disabled } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 19ba44a9..611e4578 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -5,16 +5,16 @@ pub const DATE_COMPONENT: &str = "pagetop::component::form::date"; pub struct Date { renderable : fn() -> bool, weight : isize, - name : OptAttr, - value : OptAttr, - label : OptAttr, - placeholder : OptAttr, - autofocus : OptAttr, - autocomplete: OptAttr, - disabled : OptAttr, - readonly : OptAttr, - required : OptAttr, - help_text : OptAttr, + name : AttributeValue, + value : AttributeValue, + label : AttributeValue, + placeholder : AttributeValue, + autofocus : AttributeValue, + autocomplete: AttributeValue, + disabled : AttributeValue, + readonly : AttributeValue, + required : AttributeValue, + help_text : AttributeValue, classes : Classes, template : String, } @@ -24,16 +24,16 @@ impl ComponentTrait for Date { Date { renderable : render_always, weight : 0, - name : OptAttr::new(), - value : OptAttr::new(), - label : OptAttr::new(), - placeholder : OptAttr::new(), - autofocus : OptAttr::new(), - autocomplete: OptAttr::new(), - disabled : OptAttr::new(), - readonly : OptAttr::new(), - required : OptAttr::new(), - help_text : OptAttr::new(), + name : AttributeValue::new(), + value : AttributeValue::new(), + label : AttributeValue::new(), + placeholder : AttributeValue::new(), + autofocus : AttributeValue::new(), + autocomplete: AttributeValue::new(), + disabled : AttributeValue::new(), + readonly : AttributeValue::new(), + required : AttributeValue::new(), + help_text : AttributeValue::new(), classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } @@ -53,16 +53,16 @@ impl ComponentTrait for Date { } fn default_render(&self, _: &mut InContext) -> Markup { - let id = match self.name() { + let id = match self.name().get() { Some(name) => Some(concat_string!("edit-", name)), None => None, }; html! { - div class=[self.classes()] { - @match self.label() { + div class=[self.classes().get()] { + @match self.label().get() { Some(label) => label class="form-label" for=[&id] { (label) " " - @match self.required() { + @match self.required().get() { Some(_) => span class="form-required" title="Este campo es obligatorio." { "*" } " ", @@ -75,15 +75,15 @@ impl ComponentTrait for Date { type="date" id=[id] class="form-control" - name=[self.name()] - value=[self.value()] - placeholder=[self.placeholder()] - autofocus=[self.autofocus()] - autocomplete=[self.autocomplete()] - readonly=[self.readonly()] - required=[self.required()] - disabled=[self.disabled()]; - @match self.help_text() { + name=[self.name().get()] + value=[self.value().get()] + placeholder=[self.placeholder().get()] + autofocus=[self.autofocus().get()] + autocomplete=[self.autocomplete().get()] + readonly=[self.readonly().get()] + required=[self.required().get()] + disabled=[self.disabled().get()]; + @match self.help_text().get() { Some(help_text) => div class="form-text" { (help_text) }, None => {} } @@ -263,48 +263,48 @@ impl Date { // Date GETTERS. - pub fn name(&self) -> &Option<String> { - self.name.option() + pub fn name(&self) -> &AttributeValue { + &self.name } - pub fn value(&self) -> &Option<String> { - self.value.option() + pub fn value(&self) -> &AttributeValue { + &self.value } - pub fn label(&self) -> &Option<String> { - self.label.option() + pub fn label(&self) -> &AttributeValue { + &self.label } - pub fn placeholder(&self) -> &Option<String> { - self.placeholder.option() + pub fn placeholder(&self) -> &AttributeValue { + &self.placeholder } - pub fn autofocus(&self) -> &Option<String> { - self.autofocus.option() + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus } - pub fn autocomplete(&self) -> &Option<String> { - self.autocomplete.option() + pub fn autocomplete(&self) -> &AttributeValue { + &self.autocomplete } - pub fn disabled(&self) -> &Option<String> { - self.disabled.option() + pub fn disabled(&self) -> &AttributeValue { + &self.disabled } - pub fn readonly(&self) -> &Option<String> { - self.readonly.option() + pub fn readonly(&self) -> &AttributeValue { + &self.readonly } - pub fn required(&self) -> &Option<String> { - self.required.option() + pub fn required(&self) -> &AttributeValue { + &self.required } - pub fn help_text(&self) -> &Option<String> { - self.help_text.option() + pub fn help_text(&self) -> &AttributeValue { + &self.help_text } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 72c3bbcd..a062f5ba 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -8,10 +8,10 @@ pub struct Form { renderable: fn() -> bool, weight : isize, elements : ComponentsBundle, - action : OptAttr, - charset : OptAttr, + action : AttributeValue, + charset : AttributeValue, method : FormMethod, - id : OptIden, + id : IdentifierValue, classes : Classes, template : String, } @@ -22,10 +22,10 @@ impl ComponentTrait for Form { renderable: render_always, weight : 0, elements : ComponentsBundle::new(), - action : OptAttr::new(), - charset : OptAttr::new_with_value("UTF-8"), + action : AttributeValue::new(), + charset : AttributeValue::new_with_value("UTF-8"), method : FormMethod::Post, - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new_with_default("form"), template : "default".to_owned(), } @@ -50,11 +50,11 @@ impl ComponentTrait for Form { }; html! { form - id=[self.id()] - class=[self.classes()] - action=[self.action()] + id=[self.id().get()] + class=[self.classes().get()] + action=[self.action().get()] method=[method] - accept-charset=[self.charset()] + accept-charset=[self.charset().get()] { div { (self.elements().render(context)) } } @@ -169,24 +169,24 @@ impl Form { // Form GETTERS. - pub fn action(&self) -> &Option<String> { - self.action.option() + pub fn action(&self) -> &AttributeValue { + &self.action } - pub fn charset(&self) -> &Option<String> { - self.charset.option() + pub fn charset(&self) -> &AttributeValue { + &self.charset } pub fn method(&self) -> &FormMethod { &self.method } - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 83bca41b..358e01ef 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -4,16 +4,16 @@ pub const HIDDEN_COMPONENT: &str = "pagetop::component::form::hidden"; pub struct Hidden { weight: isize, - name : OptIden, - value : OptAttr, + name : IdentifierValue, + value : AttributeValue, } impl ComponentTrait for Hidden { fn new() -> Self { Hidden { weight: 0, - name : OptIden::new(), - value : OptAttr::new(), + name : IdentifierValue::new(), + value : AttributeValue::new(), } } @@ -26,12 +26,12 @@ impl ComponentTrait for Hidden { } fn default_render(&self, _: &mut InContext) -> Markup { - let id = match self.name() { + let id = match self.name().get() { Some(name) => Some(concat_string!("value-", name)), _ => None }; html! { - input type="hidden" id=[id] name=[self.name()] value=[self.value()]; + input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; } } @@ -85,11 +85,11 @@ impl Hidden { // Hidden GETTERS. - pub fn name(&self) -> &Option<String> { - self.name.option() + pub fn name(&self) -> &IdentifierValue { + &self.name } - pub fn value(&self) -> &Option<String> { - self.value.option() + pub fn value(&self) -> &AttributeValue { + &self.value } } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 0c615de2..9ffa98c7 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -8,19 +8,19 @@ pub struct Input { renderable : fn() -> bool, weight : isize, input_type : InputType, - name : OptIden, - value : OptAttr, - label : OptAttr, + name : IdentifierValue, + value : AttributeValue, + label : AttributeValue, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, - placeholder : OptAttr, - autofocus : OptAttr, - autocomplete: OptAttr, - disabled : OptAttr, - readonly : OptAttr, - required : OptAttr, - help_text : OptAttr, + placeholder : AttributeValue, + autofocus : AttributeValue, + autocomplete: AttributeValue, + disabled : AttributeValue, + readonly : AttributeValue, + required : AttributeValue, + help_text : AttributeValue, classes : Classes, template : String, } @@ -31,19 +31,19 @@ impl ComponentTrait for Input { renderable : render_always, weight : 0, input_type : InputType::Textfield, - name : OptIden::new(), - value : OptAttr::new(), - label : OptAttr::new(), + name : IdentifierValue::new(), + value : AttributeValue::new(), + label : AttributeValue::new(), size : Some(60), minlength : None, maxlength : Some(128), - placeholder : OptAttr::new(), - autofocus : OptAttr::new(), - autocomplete: OptAttr::new(), - disabled : OptAttr::new(), - readonly : OptAttr::new(), - required : OptAttr::new(), - help_text : OptAttr::new(), + placeholder : AttributeValue::new(), + autofocus : AttributeValue::new(), + autocomplete: AttributeValue::new(), + disabled : AttributeValue::new(), + readonly : AttributeValue::new(), + required : AttributeValue::new(), + help_text : AttributeValue::new(), classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } @@ -71,16 +71,16 @@ impl ComponentTrait for Input { InputType::Textfield => "text", InputType::Url => "url", }; - let id = match self.name() { + let id = match self.name().get() { Some(name) => Some(concat_string!("edit-", name)), None => None, }; html! { - div class=[self.classes()] { - @match self.label() { + div class=[self.classes().get()] { + @match self.label().get() { Some(label) => label class="form-label" for=[&id] { (label) " " - @match self.required() { + @match self.required().get() { Some(_) => span class="form-required" title="Este campo es obligatorio." { "*" } " ", @@ -93,18 +93,18 @@ impl ComponentTrait for Input { type=(type_input) id=[id] class="form-control" - name=[self.name()] - value=[self.value()] + name=[self.name().get()] + value=[self.value().get()] size=[self.size()] minlength=[self.minlength()] maxlength=[self.maxlength()] - placeholder=[self.placeholder()] - autofocus=[self.autofocus()] - autocomplete=[self.autocomplete()] - readonly=[self.readonly()] - required=[self.required()] - disabled=[self.disabled()]; - @match self.help_text() { + placeholder=[self.placeholder().get()] + autofocus=[self.autofocus().get()] + autocomplete=[self.autocomplete().get()] + readonly=[self.readonly().get()] + required=[self.required().get()] + disabled=[self.disabled().get()]; + @match self.help_text().get() { Some(help_text) => div class="form-text" { (help_text) }, None => {} } @@ -360,16 +360,16 @@ impl Input { &self.input_type } - pub fn name(&self) -> &Option<String> { - self.name.option() + pub fn name(&self) -> &IdentifierValue { + &self.name } - pub fn value(&self) -> &Option<String> { - self.value.option() + pub fn value(&self) -> &AttributeValue { + &self.value } - pub fn label(&self) -> &Option<String> { - self.label.option() + pub fn label(&self) -> &AttributeValue { + &self.label } pub fn size(&self) -> Option<u16> { @@ -384,36 +384,36 @@ impl Input { self.maxlength } - pub fn placeholder(&self) -> &Option<String> { - self.placeholder.option() + pub fn placeholder(&self) -> &AttributeValue { + &self.placeholder } - pub fn autofocus(&self) -> &Option<String> { - self.autofocus.option() + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus } - pub fn autocomplete(&self) -> &Option<String> { - self.autocomplete.option() + pub fn autocomplete(&self) -> &AttributeValue { + &self.autocomplete } - pub fn disabled(&self) -> &Option<String> { - self.disabled.option() + pub fn disabled(&self) -> &AttributeValue { + &self.disabled } - pub fn readonly(&self) -> &Option<String> { - self.readonly.option() + pub fn readonly(&self) -> &AttributeValue { + &self.readonly } - pub fn required(&self) -> &Option<String> { - self.required.option() + pub fn required(&self) -> &AttributeValue { + &self.required } - pub fn help_text(&self) -> &Option<String> { - self.help_text.option() + pub fn help_text(&self) -> &AttributeValue { + &self.help_text } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 4cf0f48e..9ff5912f 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -6,7 +6,7 @@ pub struct Column { renderable: fn() -> bool, weight : isize, components: ComponentsBundle, - id : OptIden, + id : IdentifierValue, classes : Classes, template : String, } @@ -17,7 +17,7 @@ impl ComponentTrait for Column { renderable: render_always, weight : 0, components: ComponentsBundle::new(), - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new_with_default("col"), template : "default".to_owned(), } @@ -37,7 +37,7 @@ impl ComponentTrait for Column { fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id()] class=[self.classes()] { + div id=[self.id().get()] class=[self.classes().get()] { (self.components().render(context)) } } @@ -121,12 +121,12 @@ impl Column { // Column GETTERS. - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 57f44568..2ec9139f 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -6,7 +6,7 @@ pub struct Row { renderable: fn() -> bool, weight : isize, columns : ComponentsBundle, - id : OptIden, + id : IdentifierValue, classes : Classes, template : String, } @@ -17,7 +17,7 @@ impl ComponentTrait for Row { renderable: render_always, weight : 0, columns : ComponentsBundle::new(), - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new_with_default("row"), template : "default".to_owned(), } @@ -37,7 +37,7 @@ impl ComponentTrait for Row { fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id()] class=[self.classes()] { + div id=[self.id().get()] class=[self.classes().get()] { (self.columns().render(context)) } } @@ -121,12 +121,12 @@ impl Row { // Row GETTERS. - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 4248fb03..81cea936 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -19,7 +19,7 @@ pub struct Heading { heading : HeadingType, html : Markup, display : HeadingDisplay, - id : OptIden, + id : IdentifierValue, classes : Classes, template : String, } @@ -32,7 +32,7 @@ impl ComponentTrait for Heading { heading : HeadingType::H1, html : html! {}, display : HeadingDisplay::Normal, - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new(), template : "default".to_owned(), } @@ -51,13 +51,15 @@ impl ComponentTrait for Heading { } fn default_render(&self, _: &mut InContext) -> Markup { + let id = self.id().get(); + let classes = self.classes().get(); html! { @match &self.heading() { - HeadingType::H1 => h1 id=[self.id()] class=[self.classes()] { (*self.html()) }, - HeadingType::H2 => h2 id=[self.id()] class=[self.classes()] { (*self.html()) }, - HeadingType::H3 => h3 id=[self.id()] class=[self.classes()] { (*self.html()) }, - HeadingType::H4 => h4 id=[self.id()] class=[self.classes()] { (*self.html()) }, - HeadingType::H5 => h5 id=[self.id()] class=[self.classes()] { (*self.html()) }, - HeadingType::H6 => h6 id=[self.id()] class=[self.classes()] { (*self.html()) }, + HeadingType::H1 => h1 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (*self.html()) }, }} } @@ -201,12 +203,12 @@ impl Heading { &self.display } - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 6e10cbe5..238c71e7 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -3,19 +3,19 @@ use crate::prelude::*; pub const ICON_COMPONENT: &str = "pagetop::component::icon"; pub struct Icon { - renderable : fn() -> bool, - weight : isize, - classes : Classes, - inline_styles: InlineStyles, + renderable: fn() -> bool, + weight : isize, + classes : Classes, + layout : Layout, } impl ComponentTrait for Icon { fn new() -> Self { Icon { - renderable : render_always, - weight : 0, - classes : Classes::new_with_default("bi-question-circle-fill"), - inline_styles: InlineStyles::new(), + renderable: render_always, + weight : 0, + classes : Classes::new_with_default("bi-question-circle-fill"), + layout : Layout::new(), } } @@ -37,7 +37,7 @@ impl ComponentTrait for Icon { "/theme/icons/bootstrap-icons.css?ver=1.8.2" )); - html! { i class=[self.classes()] style=[self.inline_styles()] {}; } + html! { i class=[self.classes().get()] style=[self.layout().get()] {}; } } fn as_ref_any(&self) -> &dyn AnyComponent { @@ -76,8 +76,8 @@ impl Icon { self } - pub fn with_inline_style(mut self, style: &str, value: Option<&str>) -> Self { - self.alter_inline_style(style, value); + pub fn with_layout(mut self, property: LayoutProperty, value: LayoutUnit) -> Self { + self.alter_layout(property, value); self } @@ -103,18 +103,18 @@ impl Icon { self } - pub fn alter_inline_style(&mut self, style: &str, value: Option<&str>) -> &mut Self { - self.inline_styles.add_style(style, value); + pub fn alter_layout(&mut self, property: LayoutProperty, value: LayoutUnit) -> &mut Self { + self.layout.add(property, value); self } // Icon GETTERS. - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } - pub fn inline_styles(&self) -> Option<String> { - self.inline_styles.option() + pub fn layout(&self) -> &Layout { + &self.layout } } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 3d3a361e..57a5fb25 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -5,8 +5,8 @@ pub const IMAGE_COMPONENT: &str = "pagetop::component::image"; pub struct Image { renderable: fn() -> bool, weight : isize, - source : OptAttr, - id : OptIden, + source : AttributeValue, + id : IdentifierValue, classes : Classes, template : String, } @@ -16,8 +16,8 @@ impl ComponentTrait for Image { Image { renderable: render_always, weight : 0, - source : OptAttr::new(), - id : OptIden::new(), + source : AttributeValue::new(), + id : IdentifierValue::new(), classes : Classes::new_with_default("img-fluid"), template : "default".to_owned(), } @@ -38,9 +38,9 @@ impl ComponentTrait for Image { fn default_render(&self, _: &mut InContext) -> Markup { html! { img - src=[self.source()] - id=[self.id()] - class=[self.classes()]; + src=[self.source().get()] + id=[self.id().get()] + class=[self.classes().get()]; } } @@ -124,16 +124,16 @@ impl Image { // Image GETTERS. - pub fn source(&self) -> &Option<String> { - self.source.option() + pub fn source(&self) -> &AttributeValue { + &self.source } - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 22902ed2..86cb361f 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -177,7 +177,7 @@ pub struct Menu { renderable: fn() -> bool, weight : isize, items : ComponentsBundle, - id : OptIden, + id : IdentifierValue, classes : Classes, template : String, } @@ -188,7 +188,7 @@ impl ComponentTrait for Menu { renderable: render_always, weight : 0, items : ComponentsBundle::new(), - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new_with_default("sm sm-clean"), template : "default".to_owned(), } @@ -221,7 +221,7 @@ impl ComponentTrait for Menu { let id = context.required_id::<Menu>(self.id()); html! { - ul id=(id) class=[self.classes()] { + ul id=(id) class=[self.classes().get()] { (self.items().render(context)) } script type="text/javascript" defer { @@ -311,12 +311,12 @@ impl Menu { // Menu GETTERS. - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index c0d7d93c..75b685e7 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -16,7 +16,7 @@ pub struct Paragraph { weight : isize, html : Markup, display : ParagraphDisplay, - id : OptIden, + id : IdentifierValue, classes : Classes, template : String, } @@ -28,7 +28,7 @@ impl ComponentTrait for Paragraph { weight : 0, html : html! {}, display : ParagraphDisplay::Normal, - id : OptIden::new(), + id : IdentifierValue::new(), classes : Classes::new(), template : "default".to_owned(), } @@ -48,7 +48,7 @@ impl ComponentTrait for Paragraph { fn default_render(&self, _: &mut InContext) -> Markup { html! { - p id=[self.id()] class=[self.classes()] { (*self.html()) } + p id=[self.id().get()] class=[self.classes().get()] { (*self.html()) } } } @@ -158,12 +158,12 @@ impl Paragraph { &self.display } - pub fn id(&self) -> &Option<String> { - self.id.option() + pub fn id(&self) -> &IdentifierValue { + &self.id } - pub fn classes(&self) -> &Option<String> { - self.classes.option() + pub fn classes(&self) -> &Classes { + &self.classes } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index c3276124..f44f6768 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -68,7 +68,9 @@ fn hello_world() -> Container { .add(Anchor::button("#", html! { ("Get quote") - }).with_left_icon( + }).with_layout( + LayoutProperty::MarginLeft, LayoutUnit::Px(8) + ).with_left_icon( Icon::with("envelope-open-heart-fill") ) ) diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 916d0d96..b0296e56 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -97,8 +97,8 @@ impl InContext { // InContext EXTRAS. - pub fn required_id<T>(&mut self, id: &Option<String>) -> String { - match id { + pub fn required_id<T>(&mut self, id: &IdentifierValue) -> String { + match id.get() { Some(id) => id.to_string(), None => { let prefix = util::single_type_name::<T>() diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 2b0c5d97..5d784875 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -39,14 +39,14 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { head { meta charset="utf-8"; - @match page.title() { + @match page.title().get() { Some(t) => title { (concat_string!(SETTINGS.app.name, " | ", t)) }, None => title { (SETTINGS.app.name) } } - @match page.description() { + @match page.description().get() { Some(d) => meta name="description" content=(d);, None => {} } @@ -61,7 +61,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn render_page_body(&self, page: &mut Page) -> Markup { html! { - body class=[page.body_classes()] { + body class=[page.body_classes().get()] { @match page.template() { "admin" => { @for region in &["top-menu", "side-menu", "content"] { diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 35db7b8c..6d586449 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -8,14 +8,14 @@ pub use assets::stylesheet::StyleSheet; mod favicon; pub use favicon::Favicon; -mod optiden; -pub use optiden::OptIden; +mod attribute; +pub use attribute::AttributeValue; -mod optattr; -pub use optattr::OptAttr; +mod identifier; +pub use identifier::IdentifierValue; mod classes; pub use classes::{Classes, ClassesOp}; -mod inline_styles; -pub use inline_styles::InlineStyles; +mod layout; +pub use layout::{Layout, LayoutProperty, LayoutUnit}; diff --git a/pagetop/src/html/attribute.rs b/pagetop/src/html/attribute.rs new file mode 100644 index 00000000..095f9df8 --- /dev/null +++ b/pagetop/src/html/attribute.rs @@ -0,0 +1,26 @@ +pub struct AttributeValue(String); + +impl AttributeValue { + pub fn new() -> Self { + AttributeValue("".to_owned()) + } + + pub fn new_with_value(value: &str) -> Self { + let mut attr = Self::new(); + attr.with_value(value); + attr + } + + pub fn with_value(&mut self, value: &str) -> &mut Self { + self.0 = value.trim().to_owned(); + self + } + + pub fn get(&self) -> Option<String> { + if self.0.is_empty() { + None + } else { + Some(self.0.to_owned()) + } + } +} diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 0623baa2..a3766c59 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -14,7 +14,6 @@ pub enum ClassesOp { pub struct Classes { default: String, added : String, - option : Option<String>, } impl Classes { @@ -22,7 +21,6 @@ impl Classes { Classes { default: "".to_owned(), added : "".to_owned(), - option : None, } } @@ -81,11 +79,14 @@ impl Classes { self.default = classes.to_owned() }, } - self.option = Some(concat_string!(self.default, " ", self.added).trim().to_owned()); self } - pub fn option(&self) -> &Option<String> { - &self.option + pub fn get(&self) -> Option<String> { + if self.default.is_empty() && self.added.is_empty() { + None + } else { + Some(concat_string!(self.default, " ", self.added).trim().to_owned()) + } } } diff --git a/pagetop/src/html/identifier.rs b/pagetop/src/html/identifier.rs new file mode 100644 index 00000000..bda078eb --- /dev/null +++ b/pagetop/src/html/identifier.rs @@ -0,0 +1,26 @@ +pub struct IdentifierValue(String); + +impl IdentifierValue { + pub fn new() -> Self { + IdentifierValue("".to_owned()) + } + + pub fn new_with_value(value: &str) -> Self { + let mut id = Self::new(); + id.with_value(value); + id + } + + pub fn with_value(&mut self, value: &str) -> &Self { + self.0 = value.trim().replace(" ", "_"); + self + } + + pub fn get(&self) -> Option<String> { + if self.0.is_empty() { + None + } else { + Some(self.0.to_owned()) + } + } +} diff --git a/pagetop/src/html/inline_styles.rs b/pagetop/src/html/inline_styles.rs deleted file mode 100644 index c9e9faad..00000000 --- a/pagetop/src/html/inline_styles.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::concat_string; - -struct Style { - property: String, - inline : String, -} - -pub struct InlineStyles(Vec<Style>); - -impl InlineStyles { - pub fn new() -> Self { - InlineStyles(Vec::new()) - } - - pub fn add_style(&mut self, property: &str, value: Option<&str>) -> &Self { - let property = property.trim(); - match self.0.iter().position(|s| s.property.eq(property)) { - Some(pos) => { - self.0.remove(pos); - if let Some(value) = value { - self.0.insert(pos, Style { - property: property.to_owned(), - inline : concat_string!(property, ":", value.trim(), ";"), - }); - } - }, - _ => if let Some(value) = value { - self.0.push(Style { - property: property.to_owned(), - inline : concat_string!(property, ":", value.trim(), ";"), - }); - } - } - self - } - - pub fn option(&self) -> Option<String> { - if self.0.len() == 0 { - None - } else { - let mut inline = "".to_owned(); - self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); - Some(inline) - } - } -} diff --git a/pagetop/src/html/layout.rs b/pagetop/src/html/layout.rs new file mode 100644 index 00000000..ddd4a893 --- /dev/null +++ b/pagetop/src/html/layout.rs @@ -0,0 +1,124 @@ +use crate::concat_string; + +#[derive(Clone, Copy, PartialEq)] +pub enum LayoutProperty { + MarginBottom, + MarginLeft, + MarginRight, + MarginTop, + PaddingBottom, + PaddingLeft, + PaddingRight, + PaddingTop, +} + +impl std::convert::AsRef<str> for LayoutProperty { + fn as_ref(&self) -> &str { + match *self { + LayoutProperty::MarginBottom => "margin-bottom", + LayoutProperty::MarginLeft => "margin-left", + LayoutProperty::MarginRight => "margin-right", + LayoutProperty::MarginTop => "margin-top", + LayoutProperty::PaddingBottom => "padding-bottom", + LayoutProperty::PaddingLeft => "padding-left", + LayoutProperty::PaddingRight => "padding-right", + LayoutProperty::PaddingTop => "padding-top", + } + } +} + +// About pixels: Pixels (px) are relative to the viewing device. For low-dpi +// devices, 1px is one device pixel (dot) of the display. For printers and high +// resolution screens 1px implies multiple device pixels. + +// About em: 2em means 2 times the size of the current font. The em and rem +// units are practical in creating perfectly scalable layout! + +// About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. + +#[derive(PartialEq)] +pub enum LayoutUnit { + Auto, + + Cm(isize), // Centimeters. + In(isize), // Inches (1in = 96px = 2.54cm). + Mm(isize), // Millimeters. + Pc(isize), // Picas (1pc = 12pt). + Pt(isize), // Points (1pt = 1/72 of 1in). + Px(isize), // Pixels (1px = 1/96th of 1in). + + RelEm(f32), // Relative to the font-size of the element. + RelPct(f32), // Percentage relative to the parent element. + RelRem(f32), // Relative to font-size of the root element. + RelVh(f32), // Relative to 1% of the height of the viewport. + RelVw(f32), // Relative to 1% of the width of the viewport. + + UnSet, +} + +impl LayoutUnit { + fn to_inline(&self, property: LayoutProperty) -> String { + match self { + LayoutUnit::Auto => concat_string!(property, ":auto;"), + + LayoutUnit::Cm(value) => concat_string!(property, ":", value.to_string(), "cm;"), + LayoutUnit::In(value) => concat_string!(property, ":", value.to_string(), "in;"), + LayoutUnit::Mm(value) => concat_string!(property, ":", value.to_string(), "mm;"), + LayoutUnit::Pc(value) => concat_string!(property, ":", value.to_string(), "pc;"), + LayoutUnit::Pt(value) => concat_string!(property, ":", value.to_string(), "pt;"), + LayoutUnit::Px(value) => concat_string!(property, ":", value.to_string(), "px;"), + + LayoutUnit::RelEm(value) => concat_string!(property, ":", value.to_string(), "em;"), + LayoutUnit::RelPct(value) => concat_string!(property, ":", value.to_string(), "%;"), + LayoutUnit::RelRem(value) => concat_string!(property, ":", value.to_string(), "rem;"), + LayoutUnit::RelVh(value) => concat_string!(property, ":", value.to_string(), "vh;"), + LayoutUnit::RelVw(value) => concat_string!(property, ":", value.to_string(), "vw;"), + + _ => "".to_owned(), + } + } +} + +struct Style { + property: LayoutProperty, + inline : String, +} + +pub struct Layout(Vec<Style>); + +impl Layout { + pub fn new() -> Self { + Layout(Vec::new()) + } + + pub fn add(&mut self, property: LayoutProperty, value: LayoutUnit) -> &Self { + match self.0.iter().position(|s| s.property.eq(&property)) { + Some(pos) => { + self.0.remove(pos); + if value != LayoutUnit::UnSet { + self.0.insert(pos, Style { + property, + inline: value.to_inline(property), + }); + } + }, + _ => if value != LayoutUnit::UnSet { + self.0.push(Style { + property, + inline: value.to_inline(property), + }); + } + } + self + } + + pub fn get(&self) -> Option<String> { + if self.0.len() == 0 { + None + } else { + let mut inline = "".to_owned(); + self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); + Some(inline) + } + } +} diff --git a/pagetop/src/html/optattr.rs b/pagetop/src/html/optattr.rs deleted file mode 100644 index 86c21e8c..00000000 --- a/pagetop/src/html/optattr.rs +++ /dev/null @@ -1,26 +0,0 @@ -pub struct OptAttr(Option<String>); - -impl OptAttr { - pub fn new() -> Self { - OptAttr(None) - } - - pub fn new_with_value(value: &str) -> Self { - let mut option = Self::new(); - option.with_value(value); - option - } - - pub fn with_value(&mut self, value: &str) -> &mut Self { - let value = value.trim(); - self.0 = match value.is_empty() { - true => None, - false => Some(value.to_owned()), - }; - self - } - - pub fn option(&self) -> &Option<String> { - &self.0 - } -} diff --git a/pagetop/src/html/optiden.rs b/pagetop/src/html/optiden.rs deleted file mode 100644 index 450867d9..00000000 --- a/pagetop/src/html/optiden.rs +++ /dev/null @@ -1,26 +0,0 @@ -pub struct OptIden(Option<String>); - -impl OptIden { - pub fn new() -> Self { - OptIden(None) - } - - pub fn new_with_value(id: &str) -> Self { - let mut option = Self::new(); - option.with_value(id); - option - } - - pub fn with_value(&mut self, id: &str) -> &Self { - let id = id.trim(); - self.0 = match id.is_empty() { - true => None, - false => Some(id.replace(" ", "_")), - }; - self - } - - pub fn option(&self) -> &Option<String> { - &self.0 - } -} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index ba210d2d..28c10c8f 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -37,10 +37,10 @@ static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { pub enum TextDirection { Auto, LeftToRight, RightToLeft } pub struct Page<'a> { - language : OptAttr, - direction : OptAttr, - title : OptAttr, - description : OptAttr, + language : AttributeValue, + direction : AttributeValue, + title : AttributeValue, + description : AttributeValue, context : InContext, regions : HashMap<&'a str, ComponentsBundle>, body_classes: Classes, @@ -52,15 +52,15 @@ impl<'a> Page<'a> { pub fn new() -> Self { Page { language : match &*DEFAULT_LANGUAGE { - Some(language) => OptAttr::new_with_value(language), - _ => OptAttr::new(), + Some(language) => AttributeValue::new_with_value(language), + _ => AttributeValue::new(), }, direction : match &*DEFAULT_DIRECTION { - Some(direction) => OptAttr::new_with_value(direction), - _ => OptAttr::new(), + Some(direction) => AttributeValue::new_with_value(direction), + _ => AttributeValue::new(), }, - title : OptAttr::new(), - description : OptAttr::new(), + title : AttributeValue::new(), + description : AttributeValue::new(), context : InContext::new(), regions : common_components(), body_classes: Classes::new_with_default("body"), @@ -119,28 +119,28 @@ impl<'a> Page<'a> { // Page GETTERS. - pub fn language(&self) -> &Option<String> { - self.language.option() + pub fn language(&self) -> &AttributeValue { + &self.language } - pub fn direction(&self) -> &Option<String> { - self.direction.option() + pub fn direction(&self) -> &AttributeValue { + &self.direction } - pub fn title(&self) -> &Option<String> { - self.title.option() + pub fn title(&self) -> &AttributeValue { + &self.title } - pub fn description(&self) -> &Option<String> { - self.description.option() + pub fn description(&self) -> &AttributeValue { + &self.description } pub fn context(&mut self) -> &mut InContext { &mut self.context } - pub fn body_classes(&self) -> &Option<String> { - self.body_classes.option() + pub fn body_classes(&self) -> &Classes { + &self.body_classes } pub fn template(&self) -> &str { @@ -168,7 +168,7 @@ impl<'a> Page<'a> { // Finalmente, renderizar la página. return Ok(html! { (DOCTYPE) - html lang=[self.language()] dir=[self.direction()] { + html lang=[self.language().get()] dir=[self.direction().get()] { (head) (body) } From 6a112e77047ca858f628cd2089650e9525d53347 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 4 Jul 2022 23:27:48 +0200 Subject: [PATCH 114/853] =?UTF-8?q?Actualiza=20la=20versi=C3=B3n=20de=20Bu?= =?UTF-8?q?lma=20a=20la=200.9.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/static/bulmix/css/bulma-rtl.min.css | 2 +- pagetop/static/bulmix/css/bulma-rtl.min.css.map | 2 +- pagetop/static/bulmix/css/bulma.min.css | 2 +- pagetop/static/bulmix/css/bulma.min.css.map | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index a1b98275..783a63dd 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -22,7 +22,7 @@ impl ThemeTrait for Bulmix { )) .add_stylesheet( StyleSheet::with_source( - "/bulmix/css/bulma.min.css?ver=0.9.3" + "/bulmix/css/bulma.min.css?ver=0.9.4" ) .with_weight(-99) ) diff --git a/pagetop/static/bulmix/css/bulma-rtl.min.css b/pagetop/static/bulmix/css/bulma-rtl.min.css index 36fa65bc..65f54069 100644 --- a/pagetop/static/bulmix/css/bulma-rtl.min.css +++ b/pagetop/static/bulmix/css/bulma-rtl.min.css @@ -1 +1 @@ -/*! bulma.io v0.9.3 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-right:calc(-.5em - 1px);margin-left:.25em}.button .icon:last-child:not(:first-child){margin-right:.25em;margin-left:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-left:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-left:-1px}.buttons.has-addons .button:last-child{margin-left:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-right:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-right:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-right:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-right:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-left:.25em}.icon-text .icon:not(:first-child){margin-right:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 1.5rem 1.25rem 2.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{left:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:inherit}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-left:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-left:0}.tags.has-addons .tag:not(:first-child){margin-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.tags.has-addons .tag:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-right:.25rem;margin-left:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-right:-.375em;margin-left:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-right:.1875em;margin-left:-.375em}.tag:not(body) .icon:first-child:last-child{margin-right:-.375em;margin-left:-.375em}.tag:not(body).is-delete{margin-right:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-right:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;left:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-right:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-left:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;left:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-left:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-left:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-left:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-left:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-left:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;left:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-right:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-left:.5em}.breadcrumb .icon:last-child{margin-right:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-left:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;right:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-left:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-left:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-left:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-left:1rem}.media-right{margin-right:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-right:1px solid #dbdbdb;margin:.75em;padding-right:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-right:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;left:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-left:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-right:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-left:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;left:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-left:auto}.navbar-end{justify-content:flex-end;margin-right:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;right:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-left:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-right:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-left:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-left:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-left:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-left:.5em}.tabs .icon:last-child{margin-right:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:0 0 4px 4px}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-right:-1px}.tabs.is-toggle li:first-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li:last-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-right:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-right:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-right:50%}.columns.is-mobile>.column.is-offset-one-third{margin-right:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-right:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-right:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-right:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-right:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-right:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-right:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-right:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-right:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-right:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-right:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-right:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-right:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-right:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-right:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-right:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-right:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-right:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-right:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-right:75%}.column.is-offset-two-thirds-mobile{margin-right:66.6666%}.column.is-offset-half-mobile{margin-right:50%}.column.is-offset-one-third-mobile{margin-right:33.3333%}.column.is-offset-one-quarter-mobile{margin-right:25%}.column.is-offset-one-fifth-mobile{margin-right:20%}.column.is-offset-two-fifths-mobile{margin-right:40%}.column.is-offset-three-fifths-mobile{margin-right:60%}.column.is-offset-four-fifths-mobile{margin-right:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-right:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-right:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-right:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-right:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-right:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-right:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-right:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-right:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-right:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-right:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-right:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-right:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-right:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-right:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-right:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-right:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-right:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-right:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-right:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-right:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-right:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-right:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-right:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-right:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-right:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-right:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-right:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-right:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-right:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-right:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-right:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-right:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-right:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-right:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-right:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-right:75%}.column.is-offset-two-thirds-touch{margin-right:66.6666%}.column.is-offset-half-touch{margin-right:50%}.column.is-offset-one-third-touch{margin-right:33.3333%}.column.is-offset-one-quarter-touch{margin-right:25%}.column.is-offset-one-fifth-touch{margin-right:20%}.column.is-offset-two-fifths-touch{margin-right:40%}.column.is-offset-three-fifths-touch{margin-right:60%}.column.is-offset-four-fifths-touch{margin-right:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-right:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-right:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-right:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-right:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-right:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-right:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-right:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-right:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-right:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-right:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-right:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-right:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-right:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-right:75%}.column.is-offset-two-thirds-desktop{margin-right:66.6666%}.column.is-offset-half-desktop{margin-right:50%}.column.is-offset-one-third-desktop{margin-right:33.3333%}.column.is-offset-one-quarter-desktop{margin-right:25%}.column.is-offset-one-fifth-desktop{margin-right:20%}.column.is-offset-two-fifths-desktop{margin-right:40%}.column.is-offset-three-fifths-desktop{margin-right:60%}.column.is-offset-four-fifths-desktop{margin-right:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-right:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-right:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-right:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-right:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-right:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-right:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-right:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-right:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-right:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-right:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-right:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-right:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-right:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-right:75%}.column.is-offset-two-thirds-widescreen{margin-right:66.6666%}.column.is-offset-half-widescreen{margin-right:50%}.column.is-offset-one-third-widescreen{margin-right:33.3333%}.column.is-offset-one-quarter-widescreen{margin-right:25%}.column.is-offset-one-fifth-widescreen{margin-right:20%}.column.is-offset-two-fifths-widescreen{margin-right:40%}.column.is-offset-three-fifths-widescreen{margin-right:60%}.column.is-offset-four-fifths-widescreen{margin-right:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-right:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-right:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-right:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-right:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-right:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-right:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-right:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-right:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-right:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-right:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-right:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-right:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-right:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-right:75%}.column.is-offset-two-thirds-fullhd{margin-right:66.6666%}.column.is-offset-half-fullhd{margin-right:50%}.column.is-offset-one-third-fullhd{margin-right:33.3333%}.column.is-offset-one-quarter-fullhd{margin-right:25%}.column.is-offset-one-fifth-fullhd{margin-right:20%}.column.is-offset-two-fifths-fullhd{margin-right:40%}.column.is-offset-three-fifths-fullhd{margin-right:60%}.column.is-offset-four-fifths-fullhd{margin-right:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-right:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-right:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-right:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-right:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-right:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-right:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-right:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-right:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-right:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-right:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-right:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-right:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-right:100%}}.columns{margin-right:-.75rem;margin-left:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-right:0;margin-left:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-right:calc(-1 * var(--columnGap));margin-left:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-left:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file +/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-right:calc(-.5em - 1px);margin-left:.25em}.button .icon:last-child:not(:first-child){margin-right:.25em;margin-left:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:#00d1b2;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:#485fc7;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:#3e8ed0;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:#48c78e;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:#ffe08a;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:#f14668;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-left:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-left:-1px}.buttons.has-addons .button:last-child{margin-left:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.button.is-responsive.is-small{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-right:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-right:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-right:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-right:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-left:.25em}.icon-text .icon:not(:first-child){margin-right:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 1.5rem 1.25rem 2.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{left:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-left:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-left:0}.tags.has-addons .tag:not(:first-child){margin-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.tags.has-addons .tag:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-right:.25rem;margin-left:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-right:-.375em;margin-left:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-right:.1875em;margin-left:-.375em}.tag:not(body) .icon:first-child:last-child{margin-right:-.375em;margin-left:-.375em}.tag:not(body).is-delete{margin-right:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-right:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;left:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-right:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-left:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a!important;opacity:.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;left:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-left:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-left:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-left:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-left:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-left:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;left:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-right:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-left:.5em}.breadcrumb .icon:last-child{margin-right:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-left:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;right:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-left:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-left:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-left:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-left:1rem}.media-right{margin-right:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-right:1px solid #dbdbdb;margin:.75em;padding-right:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-right:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;left:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-left:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-right:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-left:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;left:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-left:auto}.navbar-end{justify-content:flex-end;margin-right:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;right:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-left:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-right:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-left:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link.is-disabled,.pagination-link[disabled],.pagination-next.is-disabled,.pagination-next[disabled],.pagination-previous.is-disabled,.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-left:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-left:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-left:.5em}.tabs .icon:last-child{margin-right:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:0 0 4px 4px}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-right:-1px}.tabs.is-toggle li:first-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li:last-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-right:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-right:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-right:50%}.columns.is-mobile>.column.is-offset-one-third{margin-right:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-right:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-right:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-right:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-right:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-right:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-right:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-right:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-right:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-right:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-right:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-right:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-right:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-right:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-right:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-right:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-right:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-right:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-right:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-right:75%}.column.is-offset-two-thirds-mobile{margin-right:66.6666%}.column.is-offset-half-mobile{margin-right:50%}.column.is-offset-one-third-mobile{margin-right:33.3333%}.column.is-offset-one-quarter-mobile{margin-right:25%}.column.is-offset-one-fifth-mobile{margin-right:20%}.column.is-offset-two-fifths-mobile{margin-right:40%}.column.is-offset-three-fifths-mobile{margin-right:60%}.column.is-offset-four-fifths-mobile{margin-right:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-right:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-right:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-right:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-right:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-right:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-right:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-right:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-right:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-right:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-right:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-right:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-right:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-right:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-right:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-right:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-right:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-right:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-right:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-right:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-right:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-right:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-right:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-right:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-right:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-right:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-right:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-right:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-right:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-right:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-right:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-right:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-right:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-right:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-right:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-right:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-right:75%}.column.is-offset-two-thirds-touch{margin-right:66.6666%}.column.is-offset-half-touch{margin-right:50%}.column.is-offset-one-third-touch{margin-right:33.3333%}.column.is-offset-one-quarter-touch{margin-right:25%}.column.is-offset-one-fifth-touch{margin-right:20%}.column.is-offset-two-fifths-touch{margin-right:40%}.column.is-offset-three-fifths-touch{margin-right:60%}.column.is-offset-four-fifths-touch{margin-right:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-right:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-right:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-right:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-right:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-right:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-right:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-right:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-right:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-right:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-right:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-right:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-right:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-right:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-right:75%}.column.is-offset-two-thirds-desktop{margin-right:66.6666%}.column.is-offset-half-desktop{margin-right:50%}.column.is-offset-one-third-desktop{margin-right:33.3333%}.column.is-offset-one-quarter-desktop{margin-right:25%}.column.is-offset-one-fifth-desktop{margin-right:20%}.column.is-offset-two-fifths-desktop{margin-right:40%}.column.is-offset-three-fifths-desktop{margin-right:60%}.column.is-offset-four-fifths-desktop{margin-right:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-right:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-right:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-right:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-right:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-right:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-right:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-right:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-right:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-right:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-right:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-right:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-right:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-right:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-right:75%}.column.is-offset-two-thirds-widescreen{margin-right:66.6666%}.column.is-offset-half-widescreen{margin-right:50%}.column.is-offset-one-third-widescreen{margin-right:33.3333%}.column.is-offset-one-quarter-widescreen{margin-right:25%}.column.is-offset-one-fifth-widescreen{margin-right:20%}.column.is-offset-two-fifths-widescreen{margin-right:40%}.column.is-offset-three-fifths-widescreen{margin-right:60%}.column.is-offset-four-fifths-widescreen{margin-right:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-right:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-right:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-right:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-right:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-right:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-right:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-right:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-right:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-right:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-right:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-right:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-right:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-right:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-right:75%}.column.is-offset-two-thirds-fullhd{margin-right:66.6666%}.column.is-offset-half-fullhd{margin-right:50%}.column.is-offset-one-third-fullhd{margin-right:33.3333%}.column.is-offset-one-quarter-fullhd{margin-right:25%}.column.is-offset-one-fifth-fullhd{margin-right:20%}.column.is-offset-two-fifths-fullhd{margin-right:40%}.column.is-offset-three-fifths-fullhd{margin-right:60%}.column.is-offset-four-fifths-fullhd{margin-right:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-right:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-right:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-right:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-right:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-right:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-right:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-right:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-right:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-right:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-right:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-right:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-right:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-right:100%}}.columns{margin-right:-.75rem;margin-left:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-right:0;margin-left:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-right:calc(-1 * var(--columnGap));margin-left:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-left:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma-rtl.min.css.map b/pagetop/static/bulmix/css/bulma-rtl.min.css.map index 731168fb..726415ee 100644 --- a/pagetop/static/bulmix/css/bulma-rtl.min.css.map +++ b/pagetop/static/bulmix/css/bulma-rtl.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma-rtl.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"AACA,6DAAA;ACDA,oBAAA;ACEA;;;;;ECYE,qBAAqB;EACrB,wBAAwB;EACxB,mBAAmB;EACnB,6BAA+C;EAC/C,kBCmDU;EDlDV,gBAAgB;EAChB,oBAAoB;EACpB,eCgBW;EDfX,aAfoB;EAgBpB,2BAA2B;EAC3B,gBAhBuB;EAiBvB,iCAf+D;EAgB/D,gCAfkE;EAgBlE,iCAhBkE;EAiBlE,8BAlB+D;EAmB/D,kBAAkB;EAClB,mBAAmB;AENrB;;AFQE;;;;;;;;;;;;;;;;;EAIE,aAAa;AEQjB;;AFPE;;;;;;;;;;;;;;;;EAEE,mBAAmB;AEwBvB;;AH1DA;;;;EIoKE,2BAA2B;EAC3B,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;ADnGnB;;AHlEA;EIwKE,6BAD8B;EAE9B,kBAAkB;EAClB,eAAe;EACf,aAAa;EACb,YAAY;EACZ,cAAc;EACd,eAAe;EACf,qBAAqB;EACrB,oBAAoB;EACpB,kBAAkB;EAClB,QAAQ;EACR,yBAAyB;EACzB,wBAAwB;EACxB,cAAc;ADlGhB;;ACqGE;;EACE,qBFjJkB;ACgDtB;;AHlFA;EI2JE,2BAA2B;EAC3B,yBAAyB;EACzB,sBAAsB;EACtB,qBAAqB;EACrB,iBAAiB;EAwBjB,qBAAqB;EACrB,wBAAwB;EACxB,uCFrM2B;EEsM3B,YAAY;EACZ,qBFlIqB;EEmIrB,eAAe;EACf,oBAAoB;EACpB,qBAAqB;EACrB,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,aAAa;EACb,kBAAkB;EAClB,mBAAmB;EACnB,WAAW;AD5Fb;;AC6FE;EAEE,uBF5M2B;EE6M3B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AD3FnC;;AC4FE;EACE,WAAW;EACX,UAAU;ADzFd;;AC0FE;EACE,WAAW;EACX,UAAU;ADvFd;;ACwFE;EAEE,uCFzOyB;ACmJ7B;;ACuFE;EACE,uCF3OyB;ACuJ7B;;ACsFE;EACE,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,WAAW;ADnFf;;ACoFE;EACE,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,WAAW;ADjFf;;ACkFE;EACE,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,eAAe;EACf,WAAW;AD/Ef;;AHnKA;EIqPE,mDAA2C;UAA3C,2CAA2C;EAC3C,yBF7P4B;EE8P5B,qBFjMqB;EEkMrB,+BAA+B;EAC/B,6BAA6B;EAC7B,WAAW;EACX,cAAc;EACd,WAAW;EACX,kBAAkB;EAClB,UAAU;AD9EZ;;AH7KA;;;;;;;;;;;;;;;;;EI8PE,SADuB;EAEvB,OAFuB;EAGvB,kBAAkB;EAClB,QAJuB;EAKvB,MALuB;ADxDzB;;AHlMA;EIgDE,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;EACpB,cAAc;EACd,SAAS;EACT,UAAU;ADsJZ;;AEtOA,eAAA;ACAA,0EAAA;AAEA;;;;;;;;;;;;;;;;;;;;;;;EAuBE,SAAS;EACT,UAAU;AHyOZ;;AGtOA;;;;;;EAME,eAAe;EACf,mBAAmB;AHyOrB;;AGtOA;EACE,gBAAgB;AHyOlB;;AGtOA;;;;EAIE,SAAS;AHyOX;;AGtOA;EACE,sBAAsB;AHyOxB;;AGvOA;EAII,mBAAmB;AHuOvB;;AGpOA;;EAEE,YAAY;EACZ,eAAe;AHuOjB;;AGpOA;EACE,SAAS;AHuOX;;AGpOA;EACE,yBAAyB;EACzB,iBAAiB;AHuOnB;;AGrOA;;EAEE,UAAU;AHwOZ;;AG1OA;;EAII,mBAAmB;AH2OvB;;AGvQA;EChBE,uBLnB6B;EKoB7B,eAhCc;EAiCd,kCAAkC;EAClC,mCAAmC;EACnC,gBAlCoB;EAmCpB,kBAhCsB;EAiCtB,kBAhCsB;EAiCtB,kCApCiC;EAqCjC,8BAAsB;KAAtB,2BAAsB;UAAtB,sBAAsB;AJ2RxB;;AIzRA;;;;;;;EAOE,cAAc;AJ4RhB;;AI1RA;;;;;;EAME,oLL/ByL;AC4T3L;;AI3RA;;EAEE,6BAA6B;EAC7B,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EH5DE,iCAAiC;EG8DjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTwDgB;ESvDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AShaA;EAGE,uBV/C6B;EUgD7B,qBVrD4B;EUsD5B,iBX3DwB;EW4DxB,cV3D4B;EU4D5B,eAAe;EAGf,uBAAuB;EACvB,iCA5D6D;EA6D7D,iBA5D6B;EA6D7B,kBA7D6B;EA8D7B,8BA/D6D;EAgE7D,kBAAkB;EAClB,mBAAmB;AT+ZrB;;AS/aA;EAkBI,cAAc;ATialB;;ASnbA;EAwBM,aAAa;EACb,YAAY;AT+ZlB;;ASxbA;ER+FI,gCQpEsG;ERoEtG,mBQnEmE;ATiavE;;AS7bA;ER+FI,oBQjEmE;ERiEnE,+BQhEsG;ATma1G;;ASlcA;EAiCM,+BAAiF;EACjF,gCAAkF;ATqaxF;;ASvcA;EAsCI,qBVxF0B;EUyF1B,cV5F0B;ACigB9B;;AS5cA;EA0CI,qBV/E8B;EUgF9B,cVhG0B;ACsgB9B;;ASjdA;EA6CM,iDVlF4B;AC0flC;;ASrdA;EAgDI,qBVpG0B;EUqG1B,cVtG0B;AC+gB9B;;AS1dA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV1G0B;EU2G1B,0BAzF8B;ATmgBlC;;ASjeA;EA4DM,4BV1GwB;EU2GxB,cVlHwB;AC2hB9B;;ASteA;EAgEM,yBCd2B;EDe3B,cVtHwB;ACgiB9B;;AS3eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT4atB;;ASlfA;EAwEI,gBAtG0B;EAuG1B,yBAtGmC;EAuGnC,cV/G8B;EUgH9B,qBAtG0B;ATohB9B;;ASzfA;EA8EM,cVnH4B;EUoH5B,0BAxGmC;ATuhBzC;;AS9fA;EAoFM,uBVhIyB;EUiIzB,yBAAyB;EACzB,cV/IuB;AC6jB7B;;ASpgBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,cVpJqB;ACmkB7B;;AS1gBA;EA8FQ,yBAAyB;EACzB,cVxJqB;ACwkB7B;;AS/gBA;EAiGU,mDV7IqB;AC+jB/B;;ASnhBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,cV/JqB;ACklB7B;;ASzhBA;;EAyGQ,uBVrJuB;EUsJvB,yBAAyB;EACzB,gBAAgB;ATqbxB;;AShiBA;EA6GQ,yBVtKqB;EUuKrB,YV1JuB;ACilB/B;;ASriBA;EAiHU,uBC/DuB;AVufjC;;ASziBA;;EAoHU,yBV7KmB;EU8KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVnKqB;AC6lB/B;;ASjjBA;EA0HU,gEAA4E;AT2btF;;ASrjBA;EA4HQ,6BAA6B;EAC7B,mBVzKuB;EU0KvB,YV1KuB;ACumB/B;;AS3jBA;EAmIU,uBV/KqB;EUgLrB,mBVhLqB;EUiLrB,cV9LmB;AC0nB7B;;ASjkBA;EAwIY,4DAA8D;AT6b1E;;ASrkBA;EA8Ic,gEAA4E;AT2b1F;;ASzkBA;;EAiJU,6BAA6B;EAC7B,mBV9LqB;EU+LrB,gBAAgB;EAChB,YVhMqB;AC6nB/B;;ASjlBA;EAsJQ,6BAA6B;EAC7B,qBVhNqB;EUiNrB,cVjNqB;ACgpB7B;;ASvlBA;EA6JU,yBVtNmB;EUuNnB,YV1MqB;ACwoB/B;;AS5lBA;EAqKc,4DAA8D;AT2b5E;;AShmBA;;EAwKU,6BAA6B;EAC7B,qBVlOmB;EUmOnB,gBAAgB;EAChB,cVpOmB;ACiqB7B;;ASxmBA;EAoFM,yBV7IuB;EU8IvB,yBAAyB;EACzB,YVlIyB;AC0pB/B;;AS9mBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,YVvIuB;ACgqB/B;;ASpnBA;EA8FQ,yBAAyB;EACzB,YV3IuB;ACqqB/B;;ASznBA;EAiGU,gDV1JmB;ACsrB7B;;AS7nBA;EAoGQ,uBClDyB;EDmDzB,yBAAyB;EACzB,YVlJuB;AC+qB/B;;ASnoBA;;EAyGQ,yBVlKqB;EUmKrB,yBAAyB;EACzB,gBAAgB;AT+hBxB;;AS1oBA;EA6GQ,uBVzJuB;EU0JvB,cVvKqB;ACwsB7B;;AS/oBA;EAiHU,yBC/DuB;AVimBjC;;ASnpBA;;EAoHU,uBVhKqB;EUiKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVhLmB;ACotB7B;;AS3pBA;EA0HU,4DAA4E;ATqiBtF;;AS/pBA;EA4HQ,6BAA6B;EAC7B,qBVtLqB;EUuLrB,cVvLqB;AC8tB7B;;ASrqBA;EAmIU,yBV5LmB;EU6LnB,qBV7LmB;EU8LnB,YVjLqB;ACutB/B;;AS3qBA;EAwIY,gEAA8D;ATuiB1E;;AS/qBA;EA8Ic,4DAA4E;ATqiB1F;;ASnrBA;;EAiJU,6BAA6B;EAC7B,qBV3MmB;EU4MnB,gBAAgB;EAChB,cV7MmB;ACovB7B;;AS3rBA;EAsJQ,6BAA6B;EAC7B,mBVnMuB;EUoMvB,YVpMuB;AC6uB/B;;ASjsBA;EA6JU,uBVzMqB;EU0MrB,cVvNmB;AC+vB7B;;AStsBA;EAqKc,gEAA8D;ATqiB5E;;AS1sBA;;EAwKU,6BAA6B;EAC7B,mBVrNqB;EUsNrB,gBAAgB;EAChB,YVvNqB;AC8vB/B;;ASltBA;EAoFM,4BVlIwB;EUmIxB,yBAAyB;EACzB,yBCjEe;AVmsBrB;;ASxtBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVysBrB;;AS9tBA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV8sBrB;;ASnuBA;EAiGU,mDV/IoB;ACqxB9B;;ASvuBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVwtBrB;;AS7uBA;;EAyGQ,4BVvJsB;EUwJtB,yBAAyB;EACzB,gBAAgB;ATyoBxB;;ASpvBA;EA6GQ,oCCxFa;EDyFb,iBV5JsB;ACuyB9B;;ASzvBA;EAiHU,oCC/DuB;AV2sBjC;;AS7vBA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVrKoB;ACmzB9B;;ASrwBA;EA0HU,sFAA4E;AT+oBtF;;ASzwBA;EA4HQ,6BAA6B;EAC7B,wBV3KsB;EU4KtB,iBV5KsB;AC6zB9B;;AS/wBA;EAmIU,4BVjLoB;EUkLpB,wBVlLoB;EUmLpB,yBChHW;AVgwBrB;;ASrxBA;EAwIY,sEAA8D;ATipB1E;;ASzxBA;EA8Ic,sFAA4E;AT+oB1F;;AS7xBA;;EAiJU,6BAA6B;EAC7B,wBVhMoB;EUiMpB,gBAAgB;EAChB,iBVlMoB;ACm1B9B;;ASryBA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVsxBrB;;AS3yBA;EA6JU,oCCxIW;EDyIX,iBV5MoB;AC81B9B;;AShzBA;EAqKc,sEAA8D;AT+oB5E;;ASpzBA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVuyBrB;;AS5zBA;EAoFM,yBVzIwB;EU0IxB,yBAAyB;EACzB,WC/DU;AV2yBhB;;ASl0BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVizBhB;;ASx0BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVszBhB;;AS70BA;EAiGU,gDVtJoB;ACs4B9B;;ASj1BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVg0BhB;;ASv1BA;;EAyGQ,yBV9JsB;EU+JtB,yBAAyB;EACzB,gBAAgB;ATmvBxB;;AS91BA;EA6GQ,sBCtFQ;EDuFR,cVnKsB;ACw5B9B;;ASn2BA;EAiHU,yBC/DuB;AVqzBjC;;ASv2BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5KoB;ACo6B9B;;AS/2BA;EA0HU,0DAA4E;ATyvBtF;;ASn3BA;EA4HQ,6BAA6B;EAC7B,qBVlLsB;EUmLtB,cVnLsB;AC86B9B;;ASz3BA;EAmIU,yBVxLoB;EUyLpB,qBVzLoB;EU0LpB,WC9GM;AVw2BhB;;AS/3BA;EAwIY,gEAA8D;AT2vB1E;;ASn4BA;EA8Ic,0DAA4E;ATyvB1F;;ASv4BA;;EAiJU,6BAA6B;EAC7B,qBVvMoB;EUwMpB,gBAAgB;EAChB,cVzMoB;ACo8B9B;;AS/4BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV83BhB;;ASr5BA;EA6JU,sBCtIM;EDuIN,cVnNoB;AC+8B9B;;AS15BA;EAqKc,gEAA8D;ATyvB5E;;AS95BA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+4BhB;;ASt6BA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WC/DU;AVq5BhB;;AS56BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV25BhB;;ASl7BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVg6BhB;;ASv7BA;EAiGU,iDVxIwB;ACk+BlC;;AS37BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV06BhB;;ASj8BA;;EAyGQ,yBVhJ0B;EUiJ1B,yBAAyB;EACzB,gBAAgB;AT61BxB;;ASx8BA;EA6GQ,sBCtFQ;EDuFR,cVrJ0B;ACo/BlC;;AS78BA;EAiHU,yBC/DuB;AV+5BjC;;ASj9BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACggClC;;ASz9BA;EA0HU,0DAA4E;ATm2BtF;;AS79BA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC0gClC;;ASn+BA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC9GM;AVk9BhB;;ASz+BA;EAwIY,gEAA8D;ATq2B1E;;AS7+BA;EA8Ic,0DAA4E;ATm2B1F;;ASj/BA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACgiClC;;ASz/BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVw+BhB;;AS//BA;EA6JU,sBCtIM;EDuIN,cVrMwB;AC2iClC;;ASpgCA;EAqKc,gEAA8D;ATm2B5E;;ASxgCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVy/BhB;;AShhCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV8+BrE;;ASrhCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVo/BrE;;AS3hCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV0/BrE;;ASjiCA;EAoFM,yBVzH4B;EU0H5B,yBAAyB;EACzB,WC/DU;AVghChB;;ASviCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVshChB;;AS7iCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AV2hChB;;ASljCA;EAiGU,iDVtIwB;AC2lClC;;AStjCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVqiChB;;AS5jCA;;EAyGQ,yBV9I0B;EU+I1B,yBAAyB;EACzB,gBAAgB;ATw9BxB;;ASnkCA;EA6GQ,sBCtFQ;EDuFR,cVnJ0B;AC6mClC;;ASxkCA;EAiHU,yBC/DuB;AV0hCjC;;AS5kCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5JwB;ACynClC;;ASplCA;EA0HU,0DAA4E;AT89BtF;;ASxlCA;EA4HQ,6BAA6B;EAC7B,qBVlK0B;EUmK1B,cVnK0B;ACmoClC;;AS9lCA;EAmIU,yBVxKwB;EUyKxB,qBVzKwB;EU0KxB,WC9GM;AV6kChB;;ASpmCA;EAwIY,gEAA8D;ATg+B1E;;ASxmCA;EA8Ic,0DAA4E;AT89B1F;;AS5mCA;;EAiJU,6BAA6B;EAC7B,qBVvLwB;EUwLxB,gBAAgB;EAChB,cVzLwB;ACypClC;;ASpnCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVmmChB;;AS1nCA;EA6JU,sBCtIM;EDuIN,cVnMwB;ACoqClC;;AS/nCA;EAqKc,gEAA8D;AT89B5E;;ASnoCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVonChB;;AS3oCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVymCrE;;AShpCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV+mCrE;;AStpCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVqnCrE;;AS5pCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WC/DU;AV2oChB;;ASlqCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVipChB;;ASxqCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVspChB;;AS7qCA;EAiGU,kDVvIwB;ACutClC;;ASjrCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVgqChB;;ASvrCA;;EAyGQ,yBV/I0B;EUgJ1B,yBAAyB;EACzB,gBAAgB;ATmlCxB;;AS9rCA;EA6GQ,sBCtFQ;EDuFR,cVpJ0B;ACyuClC;;ASnsCA;EAiHU,yBC/DuB;AVqpCjC;;ASvsCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACqvClC;;AS/sCA;EA0HU,0DAA4E;ATylCtF;;ASntCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;AC+vClC;;ASztCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC9GM;AVwsChB;;AS/tCA;EAwIY,gEAA8D;AT2lC1E;;ASnuCA;EA8Ic,0DAA4E;ATylC1F;;ASvuCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACqxClC;;AS/uCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV8tChB;;ASrvCA;EA6JU,sBCtIM;EDuIN,cVpMwB;ACgyClC;;AS1vCA;EAqKc,gEAA8D;ATylC5E;;AS9vCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+uChB;;AStwCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVouCrE;;AS3wCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV0uCrE;;ASjxCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVgvCrE;;ASvxCA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WC/DU;AVswChB;;AS7xCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV4wChB;;ASnyCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVixChB;;ASxyCA;EAiGU,kDVzIwB;ACo1ClC;;AS5yCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV2xChB;;ASlzCA;;EAyGQ,yBVjJ0B;EUkJ1B,yBAAyB;EACzB,gBAAgB;AT8sCxB;;ASzzCA;EA6GQ,sBCtFQ;EDuFR,cVtJ0B;ACs2ClC;;AS9zCA;EAiHU,yBC/DuB;AVgxCjC;;ASl0CA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACk3ClC;;AS10CA;EA0HU,0DAA4E;ATotCtF;;AS90CA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC43ClC;;ASp1CA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC9GM;AVm0ChB;;AS11CA;EAwIY,gEAA8D;ATstC1E;;AS91CA;EA8Ic,0DAA4E;ATotC1F;;ASl2CA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACk5ClC;;AS12CA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVy1ChB;;ASh3CA;EA6JU,sBCtIM;EDuIN,cVtMwB;AC65ClC;;ASr3CA;EAqKc,gEAA8D;ATotC5E;;ASz3CA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV02ChB;;ASj4CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV+1CrE;;ASt4CA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVq2CrE;;AS54CA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV22CrE;;ASl5CA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,yBCjEe;AVm4CrB;;ASx5CA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVy4CrB;;AS95CA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV84CrB;;ASn6CA;EAiGU,mDV1IwB;ACg9ClC;;ASv6CA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVw5CrB;;AS76CA;;EAyGQ,yBVlJ0B;EUmJ1B,yBAAyB;EACzB,gBAAgB;ATy0CxB;;ASp7CA;EA6GQ,oCCxFa;EDyFb,cVvJ0B;ACk+ClC;;ASz7CA;EAiHU,oCC/DuB;AV24CjC;;AS77CA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;AC8+ClC;;ASr8CA;EA0HU,sFAA4E;AT+0CtF;;ASz8CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;ACw/ClC;;AS/8CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,yBChHW;AVg8CrB;;ASr9CA;EAwIY,gEAA8D;ATi1C1E;;ASz9CA;EA8Ic,sFAA4E;AT+0C1F;;AS79CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;AC8gDlC;;ASr+CA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVs9CrB;;AS3+CA;EA6JU,oCCxIW;EDyIX,cVvMwB;ACyhDlC;;ASh/CA;EAqKc,gEAA8D;AT+0C5E;;ASp/CA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVu+CrB;;AS5/CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV09CrE;;ASjgDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVg+CrE;;ASvgDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVs+CrE;;AS7gDA;EAoFM,yBVvH2B;EUwH3B,yBAAyB;EACzB,WC/DU;AV4/ChB;;ASnhDA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVkgDhB;;ASzhDA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVugDhB;;AS9hDA;EAiGU,kDVpIuB;ACqkDjC;;ASliDA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVihDhB;;ASxiDA;;EAyGQ,yBV5IyB;EU6IzB,yBAAyB;EACzB,gBAAgB;ATo8CxB;;AS/iDA;EA6GQ,sBCtFQ;EDuFR,cVjJyB;ACulDjC;;ASpjDA;EAiHU,yBC/DuB;AVsgDjC;;ASxjDA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV1JuB;ACmmDjC;;AShkDA;EA0HU,0DAA4E;AT08CtF;;ASpkDA;EA4HQ,6BAA6B;EAC7B,qBVhKyB;EUiKzB,cVjKyB;AC6mDjC;;AS1kDA;EAmIU,yBVtKuB;EUuKvB,qBVvKuB;EUwKvB,WC9GM;AVyjDhB;;AShlDA;EAwIY,gEAA8D;AT48C1E;;ASplDA;EA8Ic,0DAA4E;AT08C1F;;ASxlDA;;EAiJU,6BAA6B;EAC7B,qBVrLuB;EUsLvB,gBAAgB;EAChB,cVvLuB;ACmoDjC;;AShmDA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV+kDhB;;AStmDA;EA6JU,sBCtIM;EDuIN,cVjMuB;AC8oDjC;;AS3mDA;EAqKc,gEAA8D;AT08C5E;;AS/mDA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVgmDhB;;ASvnDA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVqlDrE;;AS5nDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV2lDrE;;ASloDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVimDrE;;ASxoDA;EARE,kBVbc;ACiqDhB;;AStpDE;EACE,kBVkBc;ACuoDlB;;AShpDA;EANE,eVhBW;AC0qDb;;ASppDA;EAJE,kBVnBc;AC+qDhB;;ASxpDA;EAFE,iBVtBa;ACorDf;;AS5pDA;;EAyMI,uBVrP2B;EUsP3B,qBV3P0B;EU4P1B,gBAhOyB;EAiOzB,YAhOyB;ATwrD7B;;ASpqDA;EA8MI,aAAa;EACb,WAAW;AT09Cf;;ASzqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT49CxB;;AS9qDA;ERlDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQkQhC,6BAA6B;AT+9CnC;;ASrrDA;EAwNI,4BVtQ0B;EUuQ1B,qBV1Q0B;EU2Q1B,cV7Q0B;EU8Q1B,gBAAgB;EAChB,oBAAoB;ATi+CxB;;AS7rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATm+C/D;;ASj+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATo+C7B;;ASx+CA;EAMI,qBAAqB;ATs+CzB;;AS5+CA;ERnII,mBQ2IwC;ATw+C5C;;ASh/CA;EAUI,sBAAsB;AT0+C1B;;ASp/CA;EAYI,mBAAmB;AT4+CvB;;ASx/CA;EA1OE,kBVbc;ACmvDhB;;ASxuDE;EACE,kBVkBc;ACytDlB;;AShgDA;EAtOE,kBVnBc;AC6vDhB;;ASpgDA;EApOE,iBVtBa;ACkwDf;;ASxgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATk/CjC;;AS7gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ERjK9B,iBQkKwC;ATo/C5C;;ASnhDA;ERnII,cQoKqC;ATs/CzC;;ASvhDA;EAoCQ,UAAU;ATu/ClB;;AS3hDA;EA0CQ,UAAU;ATq/ClB;;AS/hDA;EA4CU,UAAU;ATu/CpB;;ASniDA;EA8CQ,YAAY;EACZ,cAAc;ATy/CtB;;ASxiDA;EAiDI,uBAAuB;AT2/C3B;;AS5iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT4/C7B;;ASjjDA;EAuDI,yBAAyB;AT8/C7B;;ASrjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT+/C7B;;AWl1DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WA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wB;EgBsCxB,WLsCU;AVovEhB;;Ae3zEA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyvEhB;;Aeh0EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV8uErE;;Aer0EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmwEhB;;Ae10EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVwvErE;;Ae/0EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6wEhB;;Aep1EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVkwErE;;Aez1EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuxEhB;;Ae91EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV4wErE;;Aen2EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVmyErB;;Aex2EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVsxErE;;Ae72EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV2yEhB;;Ael3EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVgyErE;;AgBx3EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjBwDqB;EiBvDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB03Eb;;AgBp4EA;EAYI,yBjBX2B;ACu4E/B;;AgBx4EA;EAcI,yBjBjB0B;AC+4E9B;;AgB54EA;EAgBI,yBjBnB0B;ACm5E9B;;AgBh5EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk4EhB;;AgBr5EA;EAyBQ,uBjBpBuB;ACo5E/B;;AgBz5EA;EA2BQ,uBjBtBuB;ACw5E/B;;AgB75EA;EA6BQ,uBjBxBuB;AC45E/B;;AgBj6EA;EA+BQ,mEAA2F;AhBs4EnG;;AgBr6EA;EAyBQ,yBjBjCqB;ACi7E7B;;AgBz6EA;EA2BQ,yBjBnCqB;ACq7E7B;;AgB76EA;EA6BQ,yBjBrCqB;ACy7E7B;;AgBj7EA;EA+BQ,qEAA2F;AhBs5EnG;;AgBr7EA;EAyBQ,4BjBtBsB;ACs7E9B;;AgBz7EA;EA2BQ,4BjBxBsB;AC07E9B;;AgB77EA;EA6BQ,4BjB1BsB;AC87E9B;;AgBj8EA;EA+BQ,wEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjB7BsB;AC68E9B;;AgBz8EA;EA2BQ,yBjB/BsB;ACi9E9B;;AgB78EA;EA6BQ,yBjBjCsB;ACq9E9B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,yBjBf0B;AC+8ElC;;AgBz9EA;EA2BQ,yBjBjB0B;ACm9ElC;;AgB79EA;EA6BQ,yBjBnB0B;ACu9ElC;;AgBj+EA;EA+BQ,qEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjBb0B;AC69ElC;;AgBz+EA;EA2BQ,yBjBf0B;ACi+ElC;;AgB7+EA;EA6BQ,yBjBjB0B;ACq+ElC;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBd0B;AC8+ElC;;AgBz/EA;EA2BQ,yBjBhB0B;ACk/ElC;;AgB7/EA;EA6BQ,yBjBlB0B;ACs/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBhB0B;ACggFlC;;AgBzgFA;EA2BQ,yBjBlB0B;ACogFlC;;AgB7gFA;EA6BQ,yBjBpB0B;ACwgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBjB0B;ACihFlC;;AgBzhFA;EA2BQ,yBjBnB0B;ACqhFlC;;AgB7hFA;EA6BQ,yBjBrB0B;ACyhFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBXyB;AC2hFjC;;AgBziFA;EA2BQ,yBjBbyB;AC+hFjC;;AgB7iFA;EA6BQ,yBjBfyB;ACmiFjC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBuhF9B;;AgBjkFA;EA4CM,6BAA6B;AhByhFnC;;AgBrkFA;EA8CM,6BAA6B;AhB2hFnC;;AgBzkFA;EAgDM,oBAAoB;AhB6hF1B;;AgB7kFA;EAoDI,ejBxBY;ACqjFhB;;AgBjlFA;EAsDI,ejB5BY;AC2jFhB;;AgBrlFA;EAwDI,cjB/BW;ACgkFf;;AgB/hFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AgBxiFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AiB/kFA;EAEE,uBlBhB6B;EkBiB7B,clB1B4B;AC2mF9B;;AiBplFA;;EAMI,yBlBzB0B;EkB0B1B,qBA9B6B;EA+B7B,qBA9B6B;EA+B7B,mBAAmB;AjBmlFvB;;AiB5lFA;;EAeQ,uBlB7BuB;EkB8BvB,mBlB9BuB;EkB+BvB,clB5CqB;AC8nF7B;;AiBnmFA;;EAeQ,yBlB1CqB;EkB2CrB,qBlB3CqB;EkB4CrB,YlB/BuB;ACwnF/B;;AiB1mFA;;EAeQ,4BlB/BsB;EkBgCtB,wBlBhCsB;EkBiCtB,yBPkCa;AV8jFrB;;AiBjnFA;;EAeQ,yBlBtCsB;EkBuCtB,qBlBvCsB;EkBwCtB,WPoCQ;AVmkFhB;;AiBxnFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPoCQ;AV0kFhB;;AiB/nFA;;EAeQ,yBlBtB0B;EkBuB1B,qBlBvB0B;EkBwB1B,WPoCQ;AVilFhB;;AiBtoFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPoCQ;AVwlFhB;;AiB7oFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPoCQ;AV+lFhB;;AiBppFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,yBPkCa;AVwmFrB;;AiB3pFA;;EAeQ,yBlBpByB;EkBqBzB,qBlBrByB;EkBsBzB,WPoCQ;AV6mFhB;;AiBlqFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBmpFf;;AiBxqFA;;EAuBM,yBlBhC4B;EkBiC5B,WP6BU;AVynFhB;;AiB9qFA;;;;EA2BQ,mBAAmB;AjB0pF3B;;AiBrrFA;;EA6BM,sBAAsB;AjB6pF5B;;AiB1rFA;EA+BI,clBtD0B;ACqtF9B;;AiB9rFA;EAiCM,mBAAmB;AjBiqFzB;;AiBlsFA;EAoCM,yBlB7C4B;EkB8C5B,WPgBU;AVkpFhB;;AiBvsFA;;EAwCQ,mBAAmB;AjBoqF3B;;AiB5sFA;;EA2CQ,kBPUQ;EOTR,mBAAmB;AjBsqF3B;;AiBltFA;EA8CI,6BA5DqC;AjBouFzC;;AiBttFA;;EAiDM,qBApEgC;EAqEhC,clBzEwB;ACmvF9B;;AiB5tFA;EAoDI,6BAhEqC;AjB4uFzC;;AiBhuFA;;EAuDM,qBAxEgC;EAyEhC,clB/EwB;AC6vF9B;;AiBtuFA;EA0DI,6BAvEqC;AjBuvFzC;;AiB1uFA;;EA+DU,sBAAsB;AjBgrFhC;;AiB/uFA;;EAoEM,iBAAiB;AjBgrFvB;;AiBpvFA;;EAyEU,wBAAwB;AjBgrFlC;;AiBzvFA;EA2EI,WAAW;AjBkrFf;;AiB7vFA;EAgFU,yBlB/FoB;ACgxF9B;;AiBjwFA;EAqFY,yBlBpGkB;ACoxF9B;;AiBrwFA;EAuFc,4BlBvGgB;ACyxF9B;;AiBzwFA;;EA2FM,qBAAqB;AjBmrF3B;;AiB9wFA;EAgGU,yBlB/GoB;ACiyF9B;;AiBhrFA;EhBjEE,iCAAiC;EgBoEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBkrFjB;;AkB7yFA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBgzF7B;;AkBpzFA;EAMI,qBAAqB;AlBkzFzB;;AkBxzFA;EjBiJI,mBiBzIwC;AlBozF5C;;AkB5zFA;EAUI,sBAAsB;AlBszF1B;;AkBh0FA;EAYI,mBAAmB;AlBwzFvB;;AkBp0FA;EAgBM,enBYO;AC4yFb;;AkBx0FA;EAmBM,kBnBQU;ACizFhB;;AkB50FA;EAqBI,uBAAuB;AlB2zF3B;;AkBh1FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB6zF1B;;AkBr1FA;EA0BI,yBAAyB;AlB+zF7B;;AkBz1FA;EA6BQ,mBAAmB;AlBg0F3B;;AkB71FA;EA+BQ,eAAe;AlBk0FvB;;AkBj2FA;EjBiJI,ciB/GmC;AlBm0FvC;;AkBr2FA;EjBiJI,eiB7GqC;EAK/B,0BAA0B;EAC1B,6BAA6B;AlBi0FvC;;AkB32FA;EAgDU,yBAAyB;EACzB,4BAA4B;AlB+zFtC;;AkB7zFA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBMU;EmBLV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg0FrB;;AkB50FA;EjB8FI,qBiBhFuC;EjBgFvC,sBiB/EyC;AlBk0F7C;;AkBj1FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg5F7B;;AkBt1FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw4F/B;;AkB31FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV40FrB;;AkBh2FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+0FhB;;AkBr2FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo1FhB;;AkB12FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVy0FrE;;AkB/2FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV81FhB;;AkBp3FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVm1FrE;;AkBz3FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw2FhB;;AkB93FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV61FrE;;AkBn4FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk3FhB;;AkBx4FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVu2FrE;;AkB74FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV83FrB;;AkBl5FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVi3FrE;;AkBv5FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs4FhB;;AkB55FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV23FrE;;AkBj6FA;EAgCI,kBnBtDY;AC27FhB;;AkBr6FA;EAkCI,enBzDS;ACg8Fb;;AkBz6FA;EAoCI,kBnB5DY;ACq8FhB;;AkB76FA;EjB8FI,sBiBvD0C;EjBuD1C,qBiBtD0C;AlB04F9C;;AkBl7FA;EjB8FI,sBiBpD0C;EjBoD1C,qBiBnD0C;AlB44F9C;;AkBv7FA;EjB8FI,sBiBjD0C;EjBiD1C,qBiBhD0C;AlB84F9C;;AkB57FA;EjB8FI,iBiBrJmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+4Fd;;AkBn8FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg5FrC;;AkB98FA;EAgEM,WAAW;EACX,UAAU;AlBk5FhB;;AkBn9FA;EAmEM,WAAW;EACX,UAAU;AlBo5FhB;;AkBx9FA;EAuEM,yBAAmD;AlBq5FzD;;AkB59FA;EAyEM,yBAAoD;AlBu5F1D;;AkBh+FA;EA2EI,qBnBhEmB;ACy9FvB;;AkBv5FA;EAEI,0BAA0B;AlBy5F9B;;AmB/gGA;;EAGE,sBAAsB;AnBihGxB;;AmBphGA;;;;EAMI,oBAAoB;AnBqhGxB;;AmB3hGA;;EAQI,iBApBmB;AnB4iGvB;;AmBhiGA;;EAUI,iBArBmB;AnBgjGvB;;AmBriGA;;EAYI,sBAAsB;AnB8hG1B;;AmB5hGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgkGzB;;AmBniGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmkG7B;;AmBxiGA;EAWI,oBA3B+B;AnB4jGnC;;AmB5iGA;EAgBM,epBnBO;ACmjGb;;AmBhjGA;EAgBM,iBpBlBS;ACsjGf;;AmBpjGA;EAgBM,epBjBO;ACyjGb;;AmBxjGA;EAgBM,iBpBhBS;AC4jGf;;AmB5jGA;EAgBM,kBpBfU;AC+jGhB;;AmBhkGA;EAgBM,epBdO;ACkkGb;;AmBpkGA;EAgBM,kBpBbU;ACqkGhB;;AmBtjGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkmG3B;;AmB7jGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4kGrB;;AmBlkGA;EAWI,oBA7C+B;AnBwmGnC;;AmBtkGA;EAgBM,epBrCO;AC+lGb;;AmB1kGA;EAgBM,iBpBpCS;ACkmGf;;AmB9kGA;EAgBM,epBnCO;ACqmGb;;AmBllGA;EAgBM,iBpBlCS;ACwmGf;;AmBtlGA;EAgBM,kBpBjCU;AC2mGhB;;AmB1lGA;EAgBM,epBhCO;AC8mGb;;AmB9lGA;EAgBM,kBpB/BU;ACinGhB;;AoB/oGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkpG3B;;AoB7oGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBkDqB;EqBjDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgpGrB;;AqB9qGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBiCU;EuBhCV,cvB/B4B;ACgrG9B;;ACnnGI;EqB5BA,4BvBjC0B;ACorG9B;;ACvnGI;EqB5BA,4BvBjC0B;ACwrG9B;;AC3nGI;EqB5BA,4BvBjC0B;AC4rG9B;;AC/nGI;EqB5BA,4BvBjC0B;ACgsG9B;;AsB9pGE;EAEE,qBvBjC0B;ACisG9B;;AsB/pGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACyrGlC;;AsB9pGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACktG9B;;ACvpGI;;;;;EqBXE,+BvBhDwB;AC0tG9B;;AC/pGI;;;;;EqBXE,+BvBhDwB;ACkuG9B;;ACvqGI;;;;;EqBXE,+BvBhDwB;AC0uG9B;;AC/qGI;;;;;EqBXE,+BvBhDwB;ACkvG9B;;AuBpvGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsvGb;;AuBrvGE;EACE,gBAAgB;AvBwvGpB;;AuBpvGI;EACE,mBxBFyB;ACyvG/B;;AuBxvGK;EAMG,mDxBPuB;AC6vG/B;;AuB5vGI;EACE,qBxBfuB;AC8wG7B;;AuBhwGK;EAMG,gDxBpBqB;ACkxG7B;;AuBpwGI;EACE,wBxBJwB;AC2wG9B;;AuBxwGK;EAMG,mDxBTsB;AC+wG9B;;AuB5wGI;EACE,qBxBXwB;AC0xG9B;;AuBhxGK;EAMG,gDxBhBsB;AC8xG9B;;AuBpxGI;EACE,qBxBG4B;ACoxGlC;;AuBxxGK;EAMG,iDxBF0B;ACwxGlC;;AuB5xGI;EACE,qBxBK4B;AC0xGlC;;AuBhyGK;EAMG,iDxBA0B;AC8xGlC;;AuBpyGI;EACE,qBxBI4B;ACmyGlC;;AuBxyGK;EAMG,kDxBD0B;ACuyGlC;;AuB5yGI;EACE,qBxBE4B;AC6yGlC;;AuBhzGK;EAMG,kDxBH0B;ACizGlC;;AuBpzGI;EACE,qBxBC4B;ACszGlC;;AuBxzGK;EAMG,mDxBJ0B;AC0zGlC;;AuB5zGI;EACE,qBxBO2B;ACwzGjC;;AuBh0GK;EAMG,kDxBEyB;AC4zGjC;;AuB5zGE;EzBmBA,kBCyBgB;EDxBhB,kBCNc;ACmzGhB;;AuB/zGE;EzBoBA,kBCVc;ACyzGhB;;AuBj0GE;EzBoBA,iBCba;AC8zGf;;AuBl0GE;EACE,cAAc;EACd,WAAW;AvBq0Gf;;AuBp0GE;EACE,eAAe;EACf,WAAW;AvBu0Gf;;AuBr0GA;EAGI,qBxB8BmB;EwB7BnB,gDAA4D;EAC5D,iDAA6D;AvBs0GjE;;AuB30GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw0GpB;;AuBt0GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw0GlB;;AuB90GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo4GzB;;AuBn1GA;EAWI,eAAe;AvB40GnB;;AuBv1GA;EAcI,YAAY;AvB60GhB;;AwB94GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi5GpB;;AwBh5GE;EACE,eAAe;AxBm5GnB;;AwBl5GE;EACE,czBF0B;ACu5G9B;;AwBp5GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy5GvB;;AwBp5GA;EvBwII,mBuBrIqC;AxBq5GzC;;AyBx6GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB26GrB;;AyB/6GA;EAMI,a3BDkB;AE86GtB;;AyBn7GA;EAUM,qB1BU4B;EE4I9B,awBrJ+B;EAC7B,UAAU;AzB66GhB;;AyBz7GA;EAeM,qB1BsDiB;EEmFnB,kBwBxIsC;AzB86G1C;;AyB97GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+6GjB;;AyBt8GA;EAyBM,aAAa;AzBi7GnB;;AyB18GA;;EA4BM,wB1BjBwB;ACo8G9B;;AyB/8GA;ExBwJI,mBwB1HwC;AzBq7G5C;;AyBn9GA;EAgCM,YAAY;EACZ,UAAU;AzBu7GhB;;AyBx9GA;EAmCQ,kBAAkB;AzBy7G1B;;AyB59GA;EAuCM,qB1BnCwB;AC49G9B;;AyBh+GA;EA6CQ,mB1BhCuB;ACu9G/B;;AyBp+GA;EA+CQ,mB1BlCuB;AC29G/B;;AyBx+GA;EAkDU,qBfyDuB;AVi4GjC;;AyB5+GA;EAuDU,mD1B1CqB;ACm+G/B;;AyBh/GA;EA6CQ,qB1B7CqB;ACo/G7B;;AyBp/GA;EA+CQ,qB1B/CqB;ACw/G7B;;AyBx/GA;EAkDU,mBfyDuB;AVi5GjC;;AyB5/GA;EAuDU,gD1BvDmB;ACggH7B;;AyBhgHA;EA6CQ,wB1BlCsB;ACy/G9B;;AyBpgHA;EA+CQ,wB1BpCsB;AC6/G9B;;AyBxgHA;EAkDU,qBfyDuB;AVi6GjC;;AyB5gHA;EAuDU,mD1B5CoB;ACqgH9B;;AyBhhHA;EA6CQ,qB1BzCsB;ACghH9B;;AyBphHA;EA+CQ,qB1B3CsB;ACohH9B;;AyBxhHA;EAkDU,qBfyDuB;AVi7GjC;;AyB5hHA;EAuDU,gD1BnDoB;AC4hH9B;;AyBhiHA;EA6CQ,qB1B3B0B;ACkhHlC;;AyBpiHA;EA+CQ,qB1B7B0B;ACshHlC;;AyBxiHA;EAkDU,qBfyDuB;AVi8GjC;;AyB5iHA;EAuDU,iD1BrCwB;AC8hHlC;;AyBhjHA;EA6CQ,qB1BzB0B;ACgiHlC;;AyBpjHA;EA+CQ,qB1B3B0B;ACoiHlC;;AyBxjHA;EAkDU,qBfyDuB;AVi9GjC;;AyB5jHA;EAuDU,iD1BnCwB;AC4iHlC;;AyBhkHA;EA6CQ,qB1B1B0B;ACijHlC;;AyBpkHA;EA+CQ,qB1B5B0B;ACqjHlC;;AyBxkHA;EAkDU,qBfyDuB;AVi+GjC;;AyB5kHA;EAuDU,kD1BpCwB;AC6jHlC;;AyBhlHA;EA6CQ,qB1B5B0B;ACmkHlC;;AyBplHA;EA+CQ,qB1B9B0B;ACukHlC;;AyBxlHA;EAkDU,qBfyDuB;AVi/GjC;;AyB5lHA;EAuDU,kD1BtCwB;AC+kHlC;;AyBhmHA;EA6CQ,qB1B7B0B;AColHlC;;AyBpmHA;EA+CQ,qB1B/B0B;ACwlHlC;;AyBxmHA;EAkDU,qBfyDuB;AVigHjC;;AyB5mHA;EAuDU,mD1BvCwB;ACgmHlC;;AyBhnHA;EA6CQ,qB1BvByB;AC8lHjC;;AyBpnHA;EA+CQ,qB1BzByB;ACkmHjC;;AyBxnHA;EAkDU,qBfyDuB;AVihHjC;;AyB5nHA;EAuDU,kD1BjCuB;AC0mHjC;;AyBhoHA;E3ByCE,kBCyBgB;EDxBhB,kBCNc;ACimHhB;;AyBroHA;E3B4CE,kBCVc;ACumHhB;;AyBzoHA;E3B8CE,iBCba;AC4mHf;;AyB7oHA;EAkEM,qB1B5DwB;AC2oH9B;;AyBjpHA;EAoEI,WAAW;AzBilHf;;AyBrpHA;EAsEM,WAAW;AzBmlHjB;;AyBzpHA;EA0EM,aAAa;EACb,kBAAkB;ExBqFpB,awBpF+B;EAC7B,YAAY;EACZ,eAAe;AzBmlHrB;;AyBjqHA;EAgFM,kB1B5CU;ACioHhB;;AyBrqHA;EAkFM,kB1BhDU;ACuoHhB;;AyBzqHA;EAoFM,iB1BnDS;AC4oHf;;A0BhqHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BkqHpB;;A0BvqHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC0rH7B;;A0B7qHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,c3BjCmB;ACgsH7B;;A0BnrHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACssH7B;;A0BzrHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,c3B7CmB;AC4sH7B;;A0B/rHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACqsH/B;;A0BrsHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,Y3BpBqB;AC2sH/B;;A0B3sHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACitH/B;;A0BjtHA;EA8BU,uBhBgEuB;EgB/DvB,yBAAyB;EACzB,Y3BhCqB;ACutH/B;;A0BvtHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV4pHrB;;A0B7tHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkqHrB;;A0BnuHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVwqHrB;;A0BzuHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8qHrB;;A0B/uHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVkrHhB;;A0BrvHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwrHhB;;A0B3vHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV8rHhB;;A0BjwHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVosHhB;;A0BvwHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV0sHhB;;A0B7wHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgtHhB;;A0BnxHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVstHhB;;A0BzxHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4tHhB;;A0B/xHA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVkuHhB;;A0BryHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwuHhB;;A0B3yHA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV8uHhB;;A0BjzHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVovHhB;;A0BvzHA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV0vHhB;;A0B7zHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgwHhB;;A0Bn0HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVswHhB;;A0Bz0HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4wHhB;;A0B/0HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVkxHhB;;A0Br1HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwxHhB;;A0B31HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV8xHhB;;A0Bj2HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVoyHhB;;A0Bv2HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV4yHrB;;A0B72HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkzHrB;;A0Bn3HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVwzHrB;;A0Bz3HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8zHrB;;A0B/3HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVk0HhB;;A0Br4HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVw0HhB;;A0B34HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV80HhB;;A0Bj5HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVo1HhB;;A0Bv5HA;EAmCI,kB3BZY;ACo4HhB;;A0B35HA;EAqCI,e3BfS;ACy4Hb;;A0B/5HA;EAuCI,kB3BlBY;AC84HhB;;A0Bn6HA;EA0CQ,eAAe;A1B63HvB;;A0Bv6HA;EA4CI,iB3BxBW;ACu5Hf;;A0B36HA;EA+CQ,eAAe;A1Bg4HvB;;A0B/6HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bg4HhC;;A0Bp7HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bk4H/B;;A0Bz7HA;EA0DQ,kB3BJI;ACu4HZ;;A0B77HA;EA4DQ,aAAa;A1Bq4HrB;;A0Bj8HA;EA+DM,sBAAsB;A1Bs4H5B;;A0Br8HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1Bw4HtB;;A0B38HA;EAqEM,uBAAuB;A1B04H7B;;A0B/8HA;EAuEM,aAAa;EACb,YAAY;A1B44HlB;;A0Bp9HA;EA0EQ,eAAe;A1B84HvB;;A0Bx9HA;EA6EQ,eAAe;A1B+4HvB;;A0B59HA;EAgFQ,eAAe;A1Bg5HvB;;A0Bh+HA;EAmFQ,eAAe;A1Bi5HvB;;A0Bp+HA;EAsFQ,0BAA4C;A1Bk5HpD;;A0Bx+HA;EAwFQ,0B3BlCI;E2BmCJ,uBAAuB;A1Bo5H/B;;A0B7+HA;EA2FI,uBAAuB;A1Bs5H3B;;A0Bj/HA;EA8FM,WAAW;A1Bu5HjB;;A0Br/HA;EAgGM,YAAY;EACZ,eAAe;A1By5HrB;;A0B1/HA;EAmGI,yBAAyB;A1B25H7B;;A0B9/HA;EAqGM,0BAA4C;A1B65HlD;;A0BlgIA;EAuGM,0B3BjDM;E2BkDN,2BAA2B;EAC3B,SAAS;A1B+5Hf;;A0B75HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bg6HpB;;A0Bt6HA;EASM,yBhBtB2B;EgBuB3B,c3B9HwB;AC+hI9B;;A0B36HA;EAYM,qBhBzB2B;AV47HjC;;A0B/6HA;EAeM,yBhB5B2B;EgB6B3B,c3BpIwB;ACwiI9B;;A0Bp7HA;EAkBM,qBhB/B2B;AVq8HjC;;A0Bp6HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bu6Hb;;A0Br6HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BtFU;E2BuFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bu6HrB;;A0Br6HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACokI9B;;A0Bt6HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1By6HzB;;A0Bv6HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBzBrB,kByB0BmC;EACrC,UAAU;A1B06HZ;;A0Bh7HA;EAQI,eAAe;A1B46HnB;;A2B5lIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC8jIjB;;A2BnmIA;EAMI,oBAAoB;A3BimIxB;;A2BvmIA;EASI,kB5BsBY;AC4kIhB;;A2B3mIA;EAWI,kB5BkBY;ACklIhB;;A2B/mIA;EAaI,iB5BeW;ACulIf;;A2BpmIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BumIrB;;A2B1mIA;EAOM,Y5BdyB;ACqnI/B;;A2B9mIA;EAOM,c5B3BuB;ACsoI7B;;A2BlnIA;EAOM,iB5BhBwB;AC+nI9B;;A2BtnIA;EAOM,c5BvBwB;AC0oI9B;;A2B1nIA;EAOM,c5BT4B;ACgoIlC;;A2B9nIA;EAOM,c5BP4B;ACkoIlC;;A2BloIA;EAOM,c5BR4B;ACuoIlC;;A2BtoIA;EAOM,c5BV4B;AC6oIlC;;A2B1oIA;EAOM,c5BX4B;ACkpIlC;;A2B9oIA;EAOM,c5BL2B;ACgpIjC;;A2BvoIA;EAEI,sBAAsB;A3ByoI1B;;A2B3oIA;EAKI,aAAa;EACb,2BAA2B;A3B0oI/B;;A2BhpIA;E1ByHI,iB0BhHwC;A3B2oI5C;;A2BppIA;;;EAcU,gBAAgB;A3B4oI1B;;A2B1pIA;;;EAuBY,4BAA4B;EAC5B,yBAAyB;A3ByoIrC;;A2BjqIA;;;EAiCY,6BAA6B;EAC7B,0BAA0B;A3BsoItC;;A2BxqIA;;;;;EAyCY,UAAU;A3BuoItB;;A2BhrIA;;;;;;;;;EA8CY,UAAU;A3B8oItB;;A2B5rIA;;;;;;;;;EAgDc,UAAU;A3BwpIxB;;A2BxsIA;EAkDQ,YAAY;EACZ,cAAc;A3B0pItB;;A2B7sIA;EAqDM,uBAAuB;A3B4pI7B;;A2BjtIA;EAuDM,yBAAyB;A3B8pI/B;;A2BrtIA;EA0DQ,YAAY;EACZ,cAAc;A3B+pItB;;A2B1tIA;EA6DI,aAAa;EACb,2BAA2B;A3BiqI/B;;A2B/tIA;EAgEM,cAAc;A3BmqIpB;;A2BnuIA;EAkEQ,gBAAgB;E1BuDpB,oB0BtD2C;A3BqqI/C;;A2BxuIA;EAqEQ,YAAY;EACZ,cAAc;A3BuqItB;;A2B7uIA;EAwEM,uBAAuB;A3ByqI7B;;A2BjvIA;EA0EM,yBAAyB;A3B2qI/B;;A2BrvIA;EA4EM,eAAe;A3B6qIrB;;A2BzvIA;EAgFU,sBAAsB;A3B6qIhC;;A2B7vIA;EAkFQ,uBAAuB;A3B+qI/B;;A2BjwIA;EAoFQ,gBAAgB;A3BirIxB;;ACrsIE;E0BhEF;IAuFM,aAAa;E3BmrIjB;AACF;;A2BlrIA;EAEI,kBAAkB;A3BorItB;;ACntIE;E0B6BF;IAII,qBAAqB;E3BurIvB;AACF;;ACrtIE;E0ByBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BwBd,mB0BvBsC;IACtC,iBAAiB;E3B2rInB;E2BrsIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B4rIxB;E2BzsIF;IAeM,oBAAoB;E3B6rIxB;E2B5sIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B8rIxB;E2BhtIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3B+rIxB;AACF;;A2B9rIA;EAEI,gBAAgB;A3BgsIpB;;AClvIE;E0BgDF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BmsIhB;E2B1sIF;IASM,gBAAgB;E3BosIpB;E2B7sIF;IAWM,cAAc;E3BqsIlB;E2BhtIF;IAaQ,YAAY;E3BssIlB;E2BntIF;I1BSI,oB0BM2C;E3BusI7C;AACF;;A2BtsIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3BysIrB;;A2B9sIA;;;EAaU,c5BxKoB;AC+2I9B;;A2BptIA;;;EAeQ,kB5B3IQ;ACs1IhB;;A2B1tIA;;;EAiBQ,kB5B/IQ;AC81IhB;;A2BhuIA;;;EAmBQ,iB5BlJO;ACq2If;;A2BtuIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BqtIhB;;A2BhvIA;;EA+BM,mB7B1LgB;AEg5ItB;;A2BrvIA;EAiCM,OAAO;A3BwtIb;;A2BzvIA;;EAqCM,oB7BhMgB;AEy5ItB;;A2B9vIA;EAuCM,QAAQ;A3B2tId;;A2BlwIA;EA2CM,6BAA6B;E1B3C/B,a0B4C+B;EAC7B,YAAY;EACZ,UAAU;A3B2tIhB;;A2BzwIA;EAgDM,kB5B5KU;ACy4IhB;;A2B7wIA;EAkDM,kB5BhLU;AC+4IhB;;A2BjxIA;EAoDM,iB5BnLS;ACo5If;;A4Bv7IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B86IrB;;A6Bl7IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B87I3C;;A6B17IA;EAYM,c9BjBwB;ACm8I9B;;A6B97IA;EAcI,mBAAmB;EACnB,aAAa;A7Bo7IjB;;A6Bn8IA;E5B+II,gB4B9HoC;A7Bs7IxC;;A6Bv8IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bu7I5B;;A6B78IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7By7IvB;;A6Bl9IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B27I/B;;A6B19IA;E5B+II,kB4B7GuC;A7B47I3C;;A6B99IA;E5B+II,mB4B3GuC;A7B87I3C;;A6Bl+IA;;EAyCM,uBAAuB;A7B87I7B;;A6Bv+IA;;EA6CM,yBAAyB;A7B+7I/B;;A6B5+IA;EAgDI,kB9BrBY;ACq9IhB;;A6Bh/IA;EAkDI,kB9BzBY;AC29IhB;;A6Bp/IA;EAoDI,iB9B5BW;ACg+If;;A6Bx/IA;EAwDM,iBAAiB;A7Bo8IvB;;A6B5/IA;EA2DM,iBAAiB;A7Bq8IvB;;A6BhgJA;EA8DM,iBAAiB;A7Bs8IvB;;A6BpgJA;EAiEM,iBAAiB;A7Bu8IvB;;A8B7/IA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,eAAe;EACf,kBAAkB;A9BggJpB;;A8B7/IE;EACE,+BA3BiB;EA4BjB,gCA5BiB;A9B4hJrB;;A8B//IE;EACE,kCA9BiB;EA+BjB,mCA/BiB;A9BiiJrB;;A8BhgJA;EAEE,6BAjCwC;EAkCxC,oBAAoB;EACpB,kD/BxC2B;E+ByC3B,aAAa;A9BkgJf;;A8BhgJA;EACE,mBAAmB;EACnB,c/BzC4B;E+B0C5B,aAAa;EACb,YAAY;EACZ,gB/BNe;E+BOf,qBA1CgC;A9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B;;AiCp0JA;EAgBQ,kBAlBsB;AjC00J9B;;AiCx0JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCq1JpB;;AiC90JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjCy1J5B;;AiCxzJA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC2zJhB;;AiCzzJA;EhC8GI,iBgCtJgB;AjCq2JpB;;AiC1zJA;EhC2GI,kBgCtJgB;AjCy2JpB;;AiC3zJA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC8zJrB;;ACvxJE;EgC3CF;IAQI,gBAAgB;EjC+zJlB;AACF;;AkCt2JA;EACE,enCgBW;ACy1Jb;;AkC12JA;EAII,kBnCcY;AC41JhB;;AkC92JA;EAMI,kBnCUY;ACk2JhB;;AkCl3JA;EAQI,iBnCOW;ACu2Jf;;AkC52JA;EACE,iBArB0B;AlCo4J5B;;AkCh3JA;EAGI,kBnCmCc;EmClCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC04JrC;;AkCv3JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACo5J9B;;AkC53JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV60JhB;;AkCj4JA;EjC4HI,+BFhJ0B;EmCqCxB,cAnC0B;EjC8I5B,qBiC7IkC;AlCw5JtC;;AkCn3JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCs3J3B;;AkC13JA;EAMI,eAtCoB;AlC85JxB;;AkC93JA;EAQI,kBAxCoB;AlCk6JxB;;AmC75JA;EAEE,4BpCZ4B;EoCa5B,kBpC2CU;EoC1CV,epCUW;ACq5Jb;;AmCn6JA;EAMI,mBAAmB;AnCi6JvB;;AmCv6JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCm6J9B;;AmC56JA;EAYI,kBpCGY;ACi6JhB;;AmCh7JA;EAcI,kBpCDY;ACu6JhB;;AmCp7JA;EAgBI,iBpCJW;AC46Jf;;AmCx7JA;EAsCM,uBAH+C;AnCy5JrD;;AmC57JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACs9J7B;;AmCj8JA;EA2CQ,mBpCnDuB;AC68J/B;;AmCr8JA;EAsCM,yBAH+C;AnCs6JrD;;AmCz8JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACs9J/B;;AmC98JA;EA2CQ,qBpChEqB;ACu+J7B;;AmCl9JA;EAsCM,yBAH+C;AnCm7JrD;;AmCt9JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVk6JrB;;AmC39JA;EA2CQ,wBpCrDsB;ACy+J9B;;AmC/9JA;EAsCM,yBAH+C;AnCg8JrD;;AmCn+JA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV66JhB;;AmCx+JA;EA2CQ,qBpC5DsB;AC6/J9B;;AmC5+JA;EAsCM,yBzB4B0C;AV86JhD;;AmCh/JA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV07JhB;;AmCr/JA;EA2CQ,qBpC9C0B;EoC+C1B,czB+B6D;AV+6JrE;;AmC1/JA;EAsCM,yBzB4B0C;AV47JhD;;AmC9/JA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVw8JhB;;AmCngKA;EA2CQ,qBpC5C0B;EoC6C1B,czB+B6D;AV67JrE;;AmCxgKA;EAsCM,yBzB4B0C;AV08JhD;;AmC5gKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVs9JhB;;AmCjhKA;EA2CQ,qBpC7C0B;EoC8C1B,czB+B6D;AV28JrE;;AmCthKA;EAsCM,yBzB4B0C;AVw9JhD;;AmC1hKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVo+JhB;;AmC/hKA;EA2CQ,qBpC/C0B;EoCgD1B,czB+B6D;AVy9JrE;;AmCpiKA;EAsCM,yBzB4B0C;AVs+JhD;;AmCxiKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVo/JrB;;AmC7iKA;EA2CQ,qBpChD0B;EoCiD1B,czB+B6D;AVu+JrE;;AmCljKA;EAsCM,yBzB4B0C;AVo/JhD;;AmCtjKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AVggKhB;;AmC3jKA;EA2CQ,qBpC1CyB;EoC2CzB,czB+B6D;AVq/JrE;;AmClhKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCqhKpB;;AmC/hKA;EAYI,YAAY;EACZ,cAAc;ElCwEd,oBkCvEsC;AnCuhK1C;;AmCriKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnCyhK9B;;AmCvhKA;EACE,qBpChF4B;EoCiF5B,kBpCtBU;EoCuBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC2mKnC;;AmChiKA;;EASI,uBpCnF2B;AC+mK/B;;AmCriKA;EAWI,6BAlFgD;AnCgnKpD;;AoChmKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC0oKZ;;AoC1mKA;EAWI,aAAa;ApCmmKjB;;AoCjmKA;EAEE,wCrC/C2B;ACkpK7B;;AoCjmKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApComKb;;ACxkKE;EmClCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpC+pKzB;AACF;;AoCtmKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnC8Fb,UmCtJoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCoqK7B;;AoCtmKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApCymKzB;;AoCvmKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC0mKpB;;AoCxmKA;EACE,gCrCjF4B;EqCkF5B,2BrCtBgB;EqCuBhB,4BrCvBgB;ACkoKlB;;AoCzmKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApCyrKhC;;AoC1mKA;EACE,8BrCjCgB;EqCkChB,+BrClCgB;EqCmChB,6BrC/F4B;AC4sK9B;;AoChnKA;EnCoDI,kBmC9CuC;ApC8mK3C;;AoC5mKA;EnChDE,iCAAiC;EmCkDjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCqsK9B;;AqCzqKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCkuKb;;AqChrKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC6uK7B;;AqCrrKA;;EAcU,ctCtEmB;ACkvK7B;;AqC1rKA;;;;EAoBY,yB3B+BqB;E2B9BrB,ctC7EiB;AC0vK7B;;AqClsKA;EAwBY,qBtChFiB;AC8vK7B;;AqCtsKA;EA0BQ,ctClFqB;ACkwK7B;;AC/qKE;EoC3BF;;;;IAgCY,ctCxFiB;EC0wK3B;EqCltKF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,ctC/Fe;ECuxK3B;EqC/tKF;;IA0Cc,qBtClGe;EC2xK3B;EqCnuKF;;;IA8CU,yB3BKuB;I2BJvB,ctCvGmB;ECiyK3B;EqCzuKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECqyK3B;AACF;;AqC9uKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC8xK/B;;AqCnvKA;;EAcU,YtCzDqB;ACmyK/B;;AqCxvKA;;;;EAoBY,uB3B+BqB;E2B9BrB,YtChEmB;AC2yK/B;;AqChwKA;EAwBY,mBtCnEmB;AC+yK/B;;AqCpwKA;EA0BQ,YtCrEuB;ACmzK/B;;AC7uKE;EoC3BF;;;;IAgCY,YtC3EmB;EC2zK7B;EqChxKF;;;;;;;;;;IAsCc,uB3BamB;I2BZnB,YtClFiB;ECw0K7B;EqC7xKF;;IA0Cc,mBtCrFiB;EC40K7B;EqCjyKF;;;IA8CU,uB3BKuB;I2BJvB,YtC1FqB;ECk1K7B;EqCvyKF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECs1K7B;AACF;;AqC5yKA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV2xKrB;;AqCjzKA;;EAcU,yB3BQW;AVgyKrB;;AqCtzKA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AVwyKrB;;AqC9zKA;EAwBY,gC3BFS;AV4yKrB;;AqCl0KA;EA0BQ,yB3BJa;AVgzKrB;;AC3yKE;EoC3BF;;;;IAgCY,yB3BVS;EVwzKnB;EqC90KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVq0KnB;EqC31KF;;IA0Cc,gC3BpBO;EVy0KnB;EqC/1KF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EV+0KnB;EqCr2KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVm1KnB;AACF;;AqC12KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVu1KhB;;AqC/2KA;;EAcU,W3BUM;AV41KhB;;AqCp3KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVo2KhB;;AqC53KA;EAwBY,kB3BAI;AVw2KhB;;AqCh4KA;EA0BQ,W3BFQ;AV42KhB;;ACz2KE;EoC3BF;;;;IAgCY,W3BRI;EVo3Kd;EqC54KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVi4Kd;EqCz5KF;;IA0Cc,kB3BlBE;EVq4Kd;EqC75KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV24Kd;EqCn6KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EV+4Kd;AACF;;AqCx6KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVq5KhB;;AqC76KA;;EAcU,W3BUM;AV05KhB;;AqCl7KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVk6KhB;;AqC17KA;EAwBY,kB3BAI;AVs6KhB;;AqC97KA;EA0BQ,W3BFQ;AV06KhB;;ACv6KE;EoC3BF;;;;IAgCY,W3BRI;EVk7Kd;EqC18KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV+7Kd;EqCv9KF;;IA0Cc,kB3BlBE;EVm8Kd;EqC39KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVy8Kd;EqCj+KF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV68Kd;AACF;;AqCt+KA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVm9KhB;;AqC3+KA;;EAcU,W3BUM;AVw9KhB;;AqCh/KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVg+KhB;;AqCx/KA;EAwBY,kB3BAI;AVo+KhB;;AqC5/KA;EA0BQ,W3BFQ;AVw+KhB;;ACr+KE;EoC3BF;;;;IAgCY,W3BRI;EVg/Kd;EqCxgLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV6/Kd;EqCrhLF;;IA0Cc,kB3BlBE;EVigLd;EqCzhLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVugLd;EqC/hLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV2gLd;AACF;;AqCpiLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVihLhB;;AqCziLA;;EAcU,W3BUM;AVshLhB;;AqC9iLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV8hLhB;;AqCtjLA;EAwBY,kB3BAI;AVkiLhB;;AqC1jLA;EA0BQ,W3BFQ;AVsiLhB;;ACniLE;EoC3BF;;;;IAgCY,W3BRI;EV8iLd;EqCtkLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV2jLd;EqCnlLF;;IA0Cc,kB3BlBE;EV+jLd;EqCvlLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVqkLd;EqC7lLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EVykLd;AACF;;AqClmLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AV+kLhB;;AqCvmLA;;EAcU,W3BUM;AVolLhB;;AqC5mLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV4lLhB;;AqCpnLA;EAwBY,kB3BAI;AVgmLhB;;AqCxnLA;EA0BQ,W3BFQ;AVomLhB;;ACjmLE;EoC3BF;;;;IAgCY,W3BRI;EV4mLd;EqCpoLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVynLd;EqCjpLF;;IA0Cc,kB3BlBE;EV6nLd;EqCrpLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVmoLd;EqC3pLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVuoLd;AACF;;AqChqLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AV+oLrB;;AqCrqLA;;EAcU,yB3BQW;AVopLrB;;AqC1qLA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AV4pLrB;;AqClrLA;EAwBY,gC3BFS;AVgqLrB;;AqCtrLA;EA0BQ,yB3BJa;AVoqLrB;;AC/pLE;EoC3BF;;;;IAgCY,yB3BVS;EV4qLnB;EqClsLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVyrLnB;EqC/sLF;;IA0Cc,gC3BpBO;EV6rLnB;EqCntLF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EVmsLnB;EqCztLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVusLnB;AACF;;AqC9tLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV2sLhB;;AqCnuLA;;EAcU,W3BUM;AVgtLhB;;AqCxuLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVwtLhB;;AqChvLA;EAwBY,kB3BAI;AV4tLhB;;AqCpvLA;EA0BQ,W3BFQ;AVguLhB;;AC7tLE;EoC3BF;;;;IAgCY,W3BRI;EVwuLd;EqChwLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVqvLd;EqC7wLF;;IA0Cc,kB3BlBE;EVyvLd;EqCjxLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV+vLd;EqCvxLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVmwLd;AACF;;AqC5xLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC0uLf;;AqCnyLA;EA2DI,gCtCxG0B;ACo1L9B;;AqCvyLA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArC+1LnB;;AqC9yLA;EAgEI,SAAS;ArCkvLb;;AqClzLA;EAkEM,iCtC/GwB;ACm2L9B;;AqCtzLA;EAoEI,MAAM;ArCsvLV;;AqCpvLA;;EAGI,oBA9HmB;ArCo3LvB;;AqCzvLA;;EAKI,uBAhImB;ArCy3LvB;;AqCvvLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCi4LvB;;AqCxvLA;EAIM,6BAA6B;ArCwvLnC;;AqCtvLA;EpCtFE,iCAAiC;EoCwFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArCyvLpB;;AqCvvLA;EAEE,ctCrJ4B;EEoB5B,eAAe;EACf,cAAc;EACd,eoCxBqB;EpCyBrB,kBAAkB;EAClB,coC1BqB;EpCqJnB,kBoCIkC;ArC6vLtC;;AC33LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBFiCQ;EEhCR,yDAAyD;EACzD,oCF0Ba;EEzBb,WAAW;AD83Lf;;AC73LI;EACE,oBAAoB;ADg4L1B;;AC/3LI;EACE,oBAAoB;ADk4L1B;;ACj4LI;EACE,oBAAoB;ADo4L1B;;ACn4LE;EACE,qCAAiC;ADs4LrC;;ACl4LM;EACE,wCAAwC;ADq4LhD;;ACp4LM;EACE,UAAU;ADu4LlB;;ACt4LM;EACE,0CAA0C;ADy4LlD;;AqCpyLA;EACE,aAAa;ArCuyLf;;AqCryLA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArCwyLpB;;AqC9yLA;;EASM,qBAAqB;EACrB,sBAAsB;ArC0yL5B;;AqCxyLA;;EAEE,eAAe;ArC2yLjB;;AqC7yLA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;AC+8LlC;;AqC5yLA;EACE,YAAY;EACZ,cAAc;ArC+yLhB;;AqCjzLA;EAII,mBA7KgC;ArC89LpC;;AqCrzLA;EAMI,UAAU;ArCmzLd;;AqCzzLA;EAQI,YAAY;EACZ,cAAc;ArCqzLlB;;AqC9zLA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArCuzLtC;;AqCp0LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;AC4+LlC;;AqCz0LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArC0zL9E;;AqCxzLA;EACE,YAAY;EACZ,cAAc;ArC2zLhB;;AqCzzLA;EpC7DI,mBoC8DoC;ArC4zLxC;;AqC7zLA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpC1DpB,aoC2D6B;ArC6zLjC;;AqC3zLA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArC8zLrB;;AqCj0LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCg0LzB;;AqC9zLA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCi0LlB;;ACp9LE;EoC/BF;IAsLI,cAAc;ErCk0LhB;EqCj0LA;;IAGI,mBAAmB;IACnB,aAAa;ErCk0LjB;EqCj0LA;IAEI,aAAa;ErCk0LjB;EqC15LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCm0LnB;EqCt0LA;IAKI,cAAc;ErCo0LlB;EqCl0LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC+jMjB;EqCx0LA;IAKI,SAAS;ErCs0Lb;EqC30LA;IAOM,4CtCrQqB;EC4kM3B;EqC90LA;IASI,MAAM;ErCw0LV;EqCj1LA;IpClMA,iCAAiC;IoCgN3B,iCAA2C;IAC3C,cAAc;ErCu0LpB;EqCt0LA;;IAGI,oBA9QiB;ErCqlMrB;EqC10LA;;IAKI,uBAhRiB;ErCylMrB;AACF;;AC1gME;EoCmMA;;;;IAIE,oBAAoB;IACpB,aAAa;ErC20Lf;EqC9iMF;IAqOI,mBA1RmB;ErCsmMrB;EqC70LA;IAGI,kBA1R0B;ErCumM9B;EqCh1LA;;IAMM,mBAAmB;ErC80LzB;EqCp1LA;;IASM,kBtClOI;ECijMV;EqCx1LA;;;;IAgBQ,wCAAwC;ErC80LhD;EqC91LA;IAuBU,wCAAwC;ErC00LlD;EqCj2LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECioM3B;EqCr2LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECinMhC;EqC7+LF;IAsKI,aAAa;ErC00Lf;EqCv+LF;;IAgKI,mBAAmB;IACnB,aAAa;ErC20Lf;EqCt9LF;IA8IM,oBAAoB;ErC20LxB;EqC70LA;IAKM,oDAAoD;ErC20L1D;EqCh1LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErC40Lf;EqCx1LA;IAkBM,cAAc;ErCy0LpB;EqCx0LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErCy0LhC;EqCrgMF;IA8LI,YAAY;IACZ,cAAc;ErC00LhB;EqCz0LA;IACE,2BAA2B;IpCvM3B,iBoCwMoC;ErC20LtC;EqC10LA;IACE,yBAAyB;IpC1MzB,kBoC2MoC;ErC40LtC;EqCl9LF;IAwII,uBtCxV2B;IsCyV3B,8BtClSc;IsCmSd,+BtCnSc;IsCoSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpC3MnB,QoC4MuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErC8pMpB;EqCh+LF;IAqJM,sBAAsB;IACtB,mBAAmB;ErC80LvB;EqC71LA;IpC5ME,kBoC6NuC;ErC+0LzC;EqCh2LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;ECwsM3B;EqCp2LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;ECwrMhC;EqC/0LE;IAEE,kBtC3TY;IsC4TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtCjUM;IsCkUN,uCAAuC;ErCg1L3C;EqCp3LA;IAsCI,UAAU;IACV,QAAQ;ErCi1LZ;EqCv/LF;IAwKI,cAAc;ErCk1LhB;EqCj1LA;;IpCtPE,sBoCyPyC;ErCk1L3C;EqCr1LA;;IpCtPE,qBoC2PyC;ErCo1L3C;EqCl1LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCsuMjB;EqCx1LA;IAKI,SAAS;ErCs1Lb;EqC31LA;IAOM,4CtC5ZqB;ECmvM3B;EqC91LA;IASI,MAAM;ErCw1LV;EqCv1LA;;IAGI,oBA/ZiB;ErCuvMrB;EqC31LA;;IAKI,uBAjaiB;ErC2vMrB;EqC/1LA;;IAOI,oBAA4D;ErC41LhE;EqCn2LA;;IASI,uBAA+D;ErC81LnE;EqC51LA;;IAGI,ctC7auB;EC0wM3B;EqCh2LA;;IAKI,6BAla2C;ErCiwM/C;EqC91LA;IAKM,yBtCzasB;ECqwM5B;AACF;;AqCz1LA;EAEI,iCAA2C;ArC21L/C;;AsCnvMA;EAEE,evCFW;EuCGX,gBAnC0B;AtCwxM5B;;AsCxvMA;EAMI,kBvCLY;AC2vMhB;;AsC5vMA;EAQI,kBvCTY;ACiwMhB;;AsChwMA;EAUI,iBvCZW;ACswMf;;AsCpwMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCkBiB;ACyuMvB;;AsC3wMA;EAkBM,qBvCgBiB;AC6uMvB;;AsC3vMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtC8vMpB;;AsC5vMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtC6vMpB;;AsC3vMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AEy0MtB;;AsCnwMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACi1M9B;;AsC1wMA;;;EAUI,qBvCjE8B;ACu0MlC;;AsChxMA;;;EAYI,iDvCvFyB;ACi2M7B;;AsCtxMA;;;EAcI,yBvCjF0B;EuCkF1B,qBvClF0B;EuCmF1B,gBAAgB;EAChB,cvCtF0B;EuCuF1B,YAAY;AtC8wMhB;;AsC5wMA;;EAEE,oBAtFkC;EAuFlC,qBAtFmC;EAuFnC,mBAAmB;AtC+wMrB;;AsC7wMA;EAEI,yBvCnF8B;EuCoF9B,qBvCpF8B;EuCqF9B,W5BzBY;AVwyMhB;;AsC7wMA;EACE,cvCrG4B;EuCsG5B,oBAAoB;AtCgxMtB;;AsC9wMA;EACE,eAAe;AtCixMjB;;AsClxMA;EAGI,gBAAgB;AtCmxMpB;;AC1yME;EqCxDF;IAmFI,eAAe;EtCoxMjB;EsC3yMF;;IA0BI,YAAY;IACZ,cAAc;EtCqxMhB;EsChyMF;IAcM,YAAY;IACZ,cAAc;EtCqxMlB;AACF;;ACrzME;EqCgBF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtCuxMV;EsC91MF;;;;IA4EI,gBAAgB;IAChB,aAAa;EtCwxMf;EsCvxMA;IACE,QAAQ;EtCyxMV;EsCxxMA;IACE,QAAQ;EtC0xMV;EsCt4MF;IA8GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtC2xMf;EsC9xMA;IAMM,QAAQ;EtC2xMd;EsCjyMA;IAQM,uBAAuB;IACvB,QAAQ;EtC4xMd;EsCryMA;IAWM,QAAQ;EtC6xMd;EsCxyMA;IAcM,QAAQ;EtC6xMd;EsC3yMA;IAgBM,QAAQ;EtC8xMd;EsC9yMA;IAkBM,yBAAyB;IACzB,QAAQ;EtC+xMd;AACF;;AuCr6MA;EACE,kBxCqCgB;EwCpChB,0FxChC2B;EwCiC3B,exCEW;ACs6Mb;;AuC36MA;EAKI,qBxCWkB;AC+5MtB;;AuC/6MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;ACk9M7B;;AuCp7MA;EAeQ,0BxChCuB;ACy8M/B;;AuCx7MA;EAiBQ,YxClCuB;AC68M/B;;AuC57MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;ACk9M/B;;AuCj8MA;EAeQ,4BxC7CqB;ACm+M7B;;AuCr8MA;EAiBQ,cxC/CqB;ACu+M7B;;AuCz8MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AV85MrB;;AuC98MA;EAeQ,+BxClCsB;ACq+M9B;;AuCl9MA;EAiBQ,iBxCpCsB;ACy+M9B;;AuCt9MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVy6MhB;;AuC39MA;EAeQ,4BxCzCsB;ACy/M9B;;AuC/9MA;EAiBQ,cxC3CsB;AC6/M9B;;AuCn+MA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AVs7MhB;;AuCx+MA;EAeQ,4BxC3B0B;ACw/MlC;;AuC5+MA;EAiBQ,cxC7B0B;AC4/MlC;;AuCh/MA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AVm8MhB;;AuCr/MA;EAeQ,4BxCzB0B;ACmgNlC;;AuCz/MA;EAiBQ,cxC3B0B;ACugNlC;;AuC7/MA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVg9MhB;;AuClgNA;EAeQ,4BxC1B0B;ACihNlC;;AuCtgNA;EAiBQ,cxC5B0B;ACqhNlC;;AuC1gNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AV69MhB;;AuC/gNA;EAeQ,4BxC5B0B;ACgiNlC;;AuCnhNA;EAiBQ,cxC9B0B;ACoiNlC;;AuCvhNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AV4+MrB;;AuC5hNA;EAeQ,4BxC7B0B;AC8iNlC;;AuChiNA;EAiBQ,cxC/B0B;ACkjNlC;;AuCpiNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AVu/MhB;;AuCziNA;EAeQ,4BxCvByB;ACqjNjC;;AuC7iNA;EAiBQ,cxCzByB;ACyjNjC;;AuC9hNA;;EAGI,gCxC3C2B;AC2kN/B;;AuC9hNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvCslNlC;;AuC/hNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvCkiNzB;;AuCtiNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvCoiNlB;;AuC5iNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;AC4mN9B;;AuCniNA;EAEI,cxC1E0B;AC+mN9B;;AuCviNA;EAIM,cxC7D4B;AComNlC;;AuCriNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCwiNvB;;AuC7iNA;EtCqEI,mBsC9DsC;AvC0iN1C;;AuCjjNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvC4iNf;;AuCvjNA;EAaI,eAAe;AvC8iNnB;;AuC3jNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;AC+oN9B;;AuChkNA;EAkBM,cxCjF4B;ACmoNlC;;AuCpkNA;EAoBI,8BxCnCc;EwCoCd,+BxCpCc;ACwlNlB;;AuCljNA;;EAEE,eAAe;AvCqjNjB;;AuCvjNA;;EAII,4BxCnG0B;AC2pN9B;;AuCtjNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EEkJ1B,mBsCrCoC;AvC+jNxC;;AuClkNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCikNxB;;AwC3pNA;EvCgCE,iCAAiC;EuC5BjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxC4pNrB;;AwCtqNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxC8pNvB;;AwCnrNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACgtN9B;;AwCxrNA;EA0BI,cAAc;AxCkqNlB;;AwC5rNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACysNlC;;AwCjsNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxCqqN/B;;AwC5sNA;EAyCM,qBAAqB;AxCuqN3B;;AwChtNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCyqN3B;;AwCvtNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxC2qN1B;;AwC5tNA;EvC4HI,kBuCxEuC;AxC4qN3C;;AwChuNA;EvC4HI,mBuCtEuC;AxC8qN3C;;AwCpuNA;EA0DM,uBAAuB;AxC8qN7B;;AwCxuNA;EA6DM,yBAAyB;AxC+qN/B;;AwC5uNA;EAiEM,6BAA6B;EAI3B,0BzC9BI;AC0sNZ;;AwCjvNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;AC0wN9B;;AwCtvNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxC8qNrF;;AwC5vNA;EAiFM,YAAY;EACZ,cAAc;AxC+qNpB;;AwCjwNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCgrNxB;;AwCzwNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxCkrNlB;;AwC/wNA;EvC4HI,kBuC5BuE;AxCmrN3E;;AwCnxNA;EAsGU,4BzC/DE;EyCgEF,+BzChEE;ACivNZ;;AwCxxNA;EA6GU,2BzCtEE;EyCuEF,8BzCvEE;ACsvNZ;;AwC7xNA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCgrNpB;;AwCpyNA;EAsHM,mBAAmB;AxCkrNzB;;AwCxyNA;EA+HY,kCzCtFW;EyCuFX,+BzCvFW;EyCwFX,qBAAqB;AxC6qNjC;;AwC9yNA;EAwIY,iCzC/FW;EyCgGX,8BzChGW;EyCiGX,oBAAoB;AxC0qNhC;;AwCpzNA;EA6II,kBzCrIY;ACgzNhB;;AwCxzNA;EA+II,kBzCzIY;ACszNhB;;AwC5zNA;EAiJI,iBzC5IW;AC2zNf;;AyC91NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1Cq2NpB;;A0C71NE;EACE,UAAU;EACV,YAAY;A1Cg2NhB;;A0C/1NE;EACE,UAAU;EACV,WAAW;A1Ck2Nf;;A0Cj2NE;EACE,UAAU;EACV,UAAU;A1Co2Nd;;A0Cn2NE;EACE,UAAU;EACV,eAAe;A1Cs2NnB;;A0Cr2NE;EACE,UAAU;EACV,UAAU;A1Cw2Nd;;A0Cv2NE;EACE,UAAU;EACV,eAAe;A1C02NnB;;A0Cz2NE;EACE,UAAU;EACV,UAAU;A1C42Nd;;A0C32NE;EACE,UAAU;EACV,UAAU;A1C82Nd;;A0C72NE;EACE,UAAU;EACV,UAAU;A1Cg3Nd;;A0C/2NE;EACE,UAAU;EACV,UAAU;A1Ck3Nd;;A0Cj3NE;EACE,UAAU;EACV,UAAU;A1Co3Nd;;A0Cn3NE;EzC+GE,iByC9GmC;A1Cs3NvC;;A0Cr3NE;EzC6GE,sByC5GwC;A1Cw3N5C;;A0Cv3NE;EzC2GE,iByC1GmC;A1C03NvC;;A0Cz3NE;EzCyGE,sByCxGwC;A1C43N5C;;A0C33NE;EzCuGE,iByCtGmC;A1C83NvC;;A0C73NE;EzCqGE,iByCpGmC;A1Cg4NvC;;A0C/3NE;EzCmGE,iByClGmC;A1Ck4NvC;;A0Cj4NE;EzCiGE,iByChGmC;A1Co4NvC;;A0Cn4NE;EzC+FE,iByC9FmC;A1Cs4NvC;;A0Cp4NI;EACE,UAAU;EACV,SAAiC;A1Cu4NvC;;A0Ct4NI;EzCyFA,gByCxF4D;A1Cy4NhE;;A0C74NI;EACE,UAAU;EACV,eAAiC;A1Cg5NvC;;A0C/4NI;EzCyFA,sByCxF4D;A1Ck5NhE;;A0Ct5NI;EACE,UAAU;EACV,gBAAiC;A1Cy5NvC;;A0Cx5NI;EzCyFA,uByCxF4D;A1C25NhE;;A0C/5NI;EACE,UAAU;EACV,UAAiC;A1Ck6NvC;;A0Cj6NI;EzCyFA,iByCxF4D;A1Co6NhE;;A0Cx6NI;EACE,UAAU;EACV,gBAAiC;A1C26NvC;;A0C16NI;EzCyFA,uByCxF4D;A1C66NhE;;A0Cj7NI;EACE,UAAU;EACV,gBAAiC;A1Co7NvC;;A0Cn7NI;EzCyFA,uByCxF4D;A1Cs7NhE;;A0C17NI;EACE,UAAU;EACV,UAAiC;A1C67NvC;;A0C57NI;EzCyFA,iByCxF4D;A1C+7NhE;;A0Cn8NI;EACE,UAAU;EACV,gBAAiC;A1Cs8NvC;;A0Cr8NI;EzCyFA,uByCxF4D;A1Cw8NhE;;A0C58NI;EACE,UAAU;EACV,gBAAiC;A1C+8NvC;;A0C98NI;EzCyFA,uByCxF4D;A1Ci9NhE;;A0Cr9NI;EACE,UAAU;EACV,UAAiC;A1Cw9NvC;;A0Cv9NI;EzCyFA,iByCxF4D;A1C09NhE;;A0C99NI;EACE,UAAU;EACV,gBAAiC;A1Ci+NvC;;A0Ch+NI;EzCyFA,uByCxF4D;A1Cm+NhE;;A0Cv+NI;EACE,UAAU;EACV,gBAAiC;A1C0+NvC;;A0Cz+NI;EzCyFA,uByCxF4D;A1C4+NhE;;A0Ch/NI;EACE,UAAU;EACV,WAAiC;A1Cm/NvC;;A0Cl/NI;EzCyFA,kByCxF4D;A1Cq/NhE;;AC19NE;EyCzFF;IAiEM,UAAU;IACV,YAAY;E1Cu/NhB;E0CzjOF;IAoEM,UAAU;IACV,WAAW;E1Cw/Nf;E0C7jOF;IAuEM,UAAU;IACV,UAAU;E1Cy/Nd;E0CjkOF;IA0EM,UAAU;IACV,eAAe;E1C0/NnB;E0CrkOF;IA6EM,UAAU;IACV,UAAU;E1C2/Nd;E0CzkOF;IAgFM,UAAU;IACV,eAAe;E1C4/NnB;E0C7kOF;IAmFM,UAAU;IACV,UAAU;E1C6/Nd;E0CjlOF;IAsFM,UAAU;IACV,UAAU;E1C8/Nd;E0CrlOF;IAyFM,UAAU;IACV,UAAU;E1C+/Nd;E0CzlOF;IA4FM,UAAU;IACV,UAAU;E1CggOd;E0C7lOF;IA+FM,UAAU;IACV,UAAU;E1CigOd;E0CjmOF;IzCsJI,iByCpDqC;E1CkgOvC;E0CpmOF;IzCsJI,sByClD0C;E1CmgO5C;E0CvmOF;IzCsJI,iByChDqC;E1CogOvC;E0C1mOF;IzCsJI,sByC9C0C;E1CqgO5C;E0C7mOF;IzCsJI,iByC5CqC;E1CsgOvC;E0ChnOF;IzCsJI,iByC1CqC;E1CugOvC;E0CnnOF;IzCsJI,iByCxCqC;E1CwgOvC;E0CtnOF;IzCsJI,iByCtCqC;E1CygOvC;E0CznOF;IzCsJI,iByCpCqC;E1C0gOvC;E0C5nOF;IAqHQ,UAAU;IACV,SAAiC;E1C0gOvC;E0ChoOF;IzCsJI,gByC9B8D;E1C2gOhE;E0CnoOF;IAqHQ,UAAU;IACV,eAAiC;E1CihOvC;E0CvoOF;IzCsJI,sByC9B8D;E1CkhOhE;E0C1oOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwhOvC;E0C9oOF;IzCsJI,uByC9B8D;E1CyhOhE;E0CjpOF;IAqHQ,UAAU;IACV,UAAiC;E1C+hOvC;E0CrpOF;IzCsJI,iByC9B8D;E1CgiOhE;E0CxpOF;IAqHQ,UAAU;IACV,gBAAiC;E1CsiOvC;E0C5pOF;IzCsJI,uByC9B8D;E1CuiOhE;E0C/pOF;IAqHQ,UAAU;IACV,gBAAiC;E1C6iOvC;E0CnqOF;IzCsJI,uByC9B8D;E1C8iOhE;E0CtqOF;IAqHQ,UAAU;IACV,UAAiC;E1CojOvC;E0C1qOF;IzCsJI,iByC9B8D;E1CqjOhE;E0C7qOF;IAqHQ,UAAU;IACV,gBAAiC;E1C2jOvC;E0CjrOF;IzCsJI,uByC9B8D;E1C4jOhE;E0CprOF;IAqHQ,UAAU;IACV,gBAAiC;E1CkkOvC;E0CxrOF;IzCsJI,uByC9B8D;E1CmkOhE;E0C3rOF;IAqHQ,UAAU;IACV,UAAiC;E1CykOvC;E0C/rOF;IzCsJI,iByC9B8D;E1C0kOhE;E0ClsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CglOvC;E0CtsOF;IzCsJI,uByC9B8D;E1CilOhE;E0CzsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CulOvC;E0C7sOF;IzCsJI,uByC9B8D;E1CwlOhE;E0ChtOF;IAqHQ,UAAU;IACV,WAAiC;E1C8lOvC;E0CptOF;IzCsJI,kByC9B8D;E1C+lOhE;AACF;;AC3nOE;EyC7FF;IA4HM,UAAU;IACV,YAAY;E1CimOhB;E0C9tOF;IAgIM,UAAU;IACV,WAAW;E1CimOf;E0CluOF;IAoIM,UAAU;IACV,UAAU;E1CimOd;E0CtuOF;IAwIM,UAAU;IACV,eAAe;E1CimOnB;E0C1uOF;IA4IM,UAAU;IACV,UAAU;E1CimOd;E0C9uOF;IAgJM,UAAU;IACV,eAAe;E1CimOnB;E0ClvOF;IAoJM,UAAU;IACV,UAAU;E1CimOd;E0CtvOF;IAwJM,UAAU;IACV,UAAU;E1CimOd;E0C1vOF;IA4JM,UAAU;IACV,UAAU;E1CimOd;E0C9vOF;IAgKM,UAAU;IACV,UAAU;E1CimOd;E0ClwOF;IAoKM,UAAU;IACV,UAAU;E1CimOd;E0CtwOF;IzCsJI,iByCkBqC;E1CimOvC;E0CzwOF;IzCsJI,sByCqB0C;E1CimO5C;E0C5wOF;IzCsJI,iByCwBqC;E1CimOvC;E0C/wOF;IzCsJI,sByC2B0C;E1CimO5C;E0ClxOF;IzCsJI,iByC8BqC;E1CimOvC;E0CrxOF;IzCsJI,iByCiCqC;E1CimOvC;E0CxxOF;IzCsJI,iByCoCqC;E1CimOvC;E0C3xOF;IzCsJI,iByCuCqC;E1CimOvC;E0C9xOF;IzCsJI,iByC0CqC;E1CimOvC;E0CjyOF;IAoMQ,UAAU;IACV,SAAiC;E1CgmOvC;E0CryOF;IzCsJI,gByCkD8D;E1CgmOhE;E0CxyOF;IAoMQ,UAAU;IACV,eAAiC;E1CumOvC;E0C5yOF;IzCsJI,sByCkD8D;E1CumOhE;E0C/yOF;IAoMQ,UAAU;IACV,gBAAiC;E1C8mOvC;E0CnzOF;IzCsJI,uByCkD8D;E1C8mOhE;E0CtzOF;IAoMQ,UAAU;IACV,UAAiC;E1CqnOvC;E0C1zOF;IzCsJI,iByCkD8D;E1CqnOhE;E0C7zOF;IAoMQ,UAAU;IACV,gBAAiC;E1C4nOvC;E0Cj0OF;IzCsJI,uByCkD8D;E1C4nOhE;E0Cp0OF;IAoMQ,UAAU;IACV,gBAAiC;E1CmoOvC;E0Cx0OF;IzCsJI,uByCkD8D;E1CmoOhE;E0C30OF;IAoMQ,UAAU;IACV,UAAiC;E1C0oOvC;E0C/0OF;IzCsJI,iByCkD8D;E1C0oOhE;E0Cl1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CipOvC;E0Ct1OF;IzCsJI,uByCkD8D;E1CipOhE;E0Cz1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CwpOvC;E0C71OF;IzCsJI,uByCkD8D;E1CwpOhE;E0Ch2OF;IAoMQ,UAAU;IACV,UAAiC;E1C+pOvC;E0Cp2OF;IzCsJI,iByCkD8D;E1C+pOhE;E0Cv2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CsqOvC;E0C32OF;IzCsJI,uByCkD8D;E1CsqOhE;E0C92OF;IAoMQ,UAAU;IACV,gBAAiC;E1C6qOvC;E0Cl3OF;IzCsJI,uByCkD8D;E1C6qOhE;E0Cr3OF;IAoMQ,UAAU;IACV,WAAiC;E1CorOvC;E0Cz3OF;IzCsJI,kByCkD8D;E1CorOhE;AACF;;ACxxOE;EyCrGF;IA2MM,UAAU;IACV,YAAY;E1CurOhB;E0Cn4OF;IA8MM,UAAU;IACV,WAAW;E1CwrOf;E0Cv4OF;IAiNM,UAAU;IACV,UAAU;E1CyrOd;E0C34OF;IAoNM,UAAU;IACV,eAAe;E1C0rOnB;E0C/4OF;IAuNM,UAAU;IACV,UAAU;E1C2rOd;E0Cn5OF;IA0NM,UAAU;IACV,eAAe;E1C4rOnB;E0Cv5OF;IA6NM,UAAU;IACV,UAAU;E1C6rOd;E0C35OF;IAgOM,UAAU;IACV,UAAU;E1C8rOd;E0C/5OF;IAmOM,UAAU;IACV,UAAU;E1C+rOd;E0Cn6OF;IAsOM,UAAU;IACV,UAAU;E1CgsOd;E0Cv6OF;IAyOM,UAAU;IACV,UAAU;E1CisOd;E0C36OF;IzCsJI,iByCsFqC;E1CksOvC;E0C96OF;IzCsJI,sByCwF0C;E1CmsO5C;E0Cj7OF;IzCsJI,iByC0FqC;E1CosOvC;E0Cp7OF;IzCsJI,sByC4F0C;E1CqsO5C;E0Cv7OF;IzCsJI,iByC8FqC;E1CssOvC;E0C17OF;IzCsJI,iByCgGqC;E1CusOvC;E0C77OF;IzCsJI,iByCkGqC;E1CwsOvC;E0Ch8OF;IzCsJI,iByCoGqC;E1CysOvC;E0Cn8OF;IzCsJI,iByCsGqC;E1C0sOvC;E0Ct8OF;IA+PQ,UAAU;IACV,SAAiC;E1C0sOvC;E0C18OF;IzCsJI,gByC4G8D;E1C2sOhE;E0C78OF;IA+PQ,UAAU;IACV,eAAiC;E1CitOvC;E0Cj9OF;IzCsJI,sByC4G8D;E1CktOhE;E0Cp9OF;IA+PQ,UAAU;IACV,gBAAiC;E1CwtOvC;E0Cx9OF;IzCsJI,uByC4G8D;E1CytOhE;E0C39OF;IA+PQ,UAAU;IACV,UAAiC;E1C+tOvC;E0C/9OF;IzCsJI,iByC4G8D;E1CguOhE;E0Cl+OF;IA+PQ,UAAU;IACV,gBAAiC;E1CsuOvC;E0Ct+OF;IzCsJI,uByC4G8D;E1CuuOhE;E0Cz+OF;IA+PQ,UAAU;IACV,gBAAiC;E1C6uOvC;E0C7+OF;IzCsJI,uByC4G8D;E1C8uOhE;E0Ch/OF;IA+PQ,UAAU;IACV,UAAiC;E1CovOvC;E0Cp/OF;IzCsJI,iByC4G8D;E1CqvOhE;E0Cv/OF;IA+PQ,UAAU;IACV,gBAAiC;E1C2vOvC;E0C3/OF;IzCsJI,uByC4G8D;E1C4vOhE;E0C9/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CkwOvC;E0ClgPF;IzCsJI,uByC4G8D;E1CmwOhE;E0CrgPF;IA+PQ,UAAU;IACV,UAAiC;E1CywOvC;E0CzgPF;IzCsJI,iByC4G8D;E1C0wOhE;E0C5gPF;IA+PQ,UAAU;IACV,gBAAiC;E1CgxOvC;E0ChhPF;IzCsJI,uByC4G8D;E1CixOhE;E0CnhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CuxOvC;E0CvhPF;IzCsJI,uByC4G8D;E1CwxOhE;E0C1hPF;IA+PQ,UAAU;IACV,WAAiC;E1C8xOvC;E0C9hPF;IzCsJI,kByC4G8D;E1C+xOhE;AACF;;ACz7OE;EyCzGF;IAqQM,UAAU;IACV,YAAY;E1CkyOhB;E0CxiPF;IAwQM,UAAU;IACV,WAAW;E1CmyOf;E0C5iPF;IA2QM,UAAU;IACV,UAAU;E1CoyOd;E0ChjPF;IA8QM,UAAU;IACV,eAAe;E1CqyOnB;E0CpjPF;IAiRM,UAAU;IACV,UAAU;E1CsyOd;E0CxjPF;IAoRM,UAAU;IACV,eAAe;E1CuyOnB;E0C5jPF;IAuRM,UAAU;IACV,UAAU;E1CwyOd;E0ChkPF;IA0RM,UAAU;IACV,UAAU;E1CyyOd;E0CpkPF;IA6RM,UAAU;IACV,UAAU;E1C0yOd;E0CxkPF;IAgSM,UAAU;IACV,UAAU;E1C2yOd;E0C5kPF;IAmSM,UAAU;IACV,UAAU;E1C4yOd;E0ChlPF;IzCsJI,iByCgJqC;E1C6yOvC;E0CnlPF;IzCsJI,sByCkJ0C;E1C8yO5C;E0CtlPF;IzCsJI,iByCoJqC;E1C+yOvC;E0CzlPF;IzCsJI,sByCsJ0C;E1CgzO5C;E0C5lPF;IzCsJI,iByCwJqC;E1CizOvC;E0C/lPF;IzCsJI,iByC0JqC;E1CkzOvC;E0ClmPF;IzCsJI,iByC4JqC;E1CmzOvC;E0CrmPF;IzCsJI,iByC8JqC;E1CozOvC;E0CxmPF;IzCsJI,iByCgKqC;E1CqzOvC;E0C3mPF;IAyTQ,UAAU;IACV,SAAiC;E1CqzOvC;E0C/mPF;IzCsJI,gByCsK8D;E1CszOhE;E0ClnPF;IAyTQ,UAAU;IACV,eAAiC;E1C4zOvC;E0CtnPF;IzCsJI,sByCsK8D;E1C6zOhE;E0CznPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm0OvC;E0C7nPF;IzCsJI,uByCsK8D;E1Co0OhE;E0ChoPF;IAyTQ,UAAU;IACV,UAAiC;E1C00OvC;E0CpoPF;IzCsJI,iByCsK8D;E1C20OhE;E0CvoPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ci1OvC;E0C3oPF;IzCsJI,uByCsK8D;E1Ck1OhE;E0C9oPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cw1OvC;E0ClpPF;IzCsJI,uByCsK8D;E1Cy1OhE;E0CrpPF;IAyTQ,UAAU;IACV,UAAiC;E1C+1OvC;E0CzpPF;IzCsJI,iByCsK8D;E1Cg2OhE;E0C5pPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cs2OvC;E0ChqPF;IzCsJI,uByCsK8D;E1Cu2OhE;E0CnqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C62OvC;E0CvqPF;IzCsJI,uByCsK8D;E1C82OhE;E0C1qPF;IAyTQ,UAAU;IACV,UAAiC;E1Co3OvC;E0C9qPF;IzCsJI,iByCsK8D;E1Cq3OhE;E0CjrPF;IAyTQ,UAAU;IACV,gBAAiC;E1C23OvC;E0CrrPF;IzCsJI,uByCsK8D;E1C43OhE;E0CxrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ck4OvC;E0C5rPF;IzCsJI,uByCsK8D;E1Cm4OhE;E0C/rPF;IAyTQ,UAAU;IACV,WAAiC;E1Cy4OvC;E0CnsPF;IzCsJI,kByCsK8D;E1C04OhE;AACF;;AC/kPI;EyCxHJ;IA+TM,UAAU;IACV,YAAY;E1C64OhB;E0C7sPF;IAkUM,UAAU;IACV,WAAW;E1C84Of;E0CjtPF;IAqUM,UAAU;IACV,UAAU;E1C+4Od;E0CrtPF;IAwUM,UAAU;IACV,eAAe;E1Cg5OnB;E0CztPF;IA2UM,UAAU;IACV,UAAU;E1Ci5Od;E0C7tPF;IA8UM,UAAU;IACV,eAAe;E1Ck5OnB;E0CjuPF;IAiVM,UAAU;IACV,UAAU;E1Cm5Od;E0CruPF;IAoVM,UAAU;IACV,UAAU;E1Co5Od;E0CzuPF;IAuVM,UAAU;IACV,UAAU;E1Cq5Od;E0C7uPF;IA0VM,UAAU;IACV,UAAU;E1Cs5Od;E0CjvPF;IA6VM,UAAU;IACV,UAAU;E1Cu5Od;E0CrvPF;IzCsJI,iByC0MqC;E1Cw5OvC;E0CxvPF;IzCsJI,sByC4M0C;E1Cy5O5C;E0C3vPF;IzCsJI,iByC8MqC;E1C05OvC;E0C9vPF;IzCsJI,sByCgN0C;E1C25O5C;E0CjwPF;IzCsJI,iByCkNqC;E1C45OvC;E0CpwPF;IzCsJI,iByCoNqC;E1C65OvC;E0CvwPF;IzCsJI,iByCsNqC;E1C85OvC;E0C1wPF;IzCsJI,iByCwNqC;E1C+5OvC;E0C7wPF;IzCsJI,iByC0NqC;E1Cg6OvC;E0ChxPF;IAmXQ,UAAU;IACV,SAAiC;E1Cg6OvC;E0CpxPF;IzCsJI,gByCgO8D;E1Ci6OhE;E0CvxPF;IAmXQ,UAAU;IACV,eAAiC;E1Cu6OvC;E0C3xPF;IzCsJI,sByCgO8D;E1Cw6OhE;E0C9xPF;IAmXQ,UAAU;IACV,gBAAiC;E1C86OvC;E0ClyPF;IzCsJI,uByCgO8D;E1C+6OhE;E0CryPF;IAmXQ,UAAU;IACV,UAAiC;E1Cq7OvC;E0CzyPF;IzCsJI,iByCgO8D;E1Cs7OhE;E0C5yPF;IAmXQ,UAAU;IACV,gBAAiC;E1C47OvC;E0ChzPF;IzCsJI,uByCgO8D;E1C67OhE;E0CnzPF;IAmXQ,UAAU;IACV,gBAAiC;E1Cm8OvC;E0CvzPF;IzCsJI,uByCgO8D;E1Co8OhE;E0C1zPF;IAmXQ,UAAU;IACV,UAAiC;E1C08OvC;E0C9zPF;IzCsJI,iByCgO8D;E1C28OhE;E0Cj0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Ci9OvC;E0Cr0PF;IzCsJI,uByCgO8D;E1Ck9OhE;E0Cx0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cw9OvC;E0C50PF;IzCsJI,uByCgO8D;E1Cy9OhE;E0C/0PF;IAmXQ,UAAU;IACV,UAAiC;E1C+9OvC;E0Cn1PF;IzCsJI,iByCgO8D;E1Cg+OhE;E0Ct1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs+OvC;E0C11PF;IzCsJI,uByCgO8D;E1Cu+OhE;E0C71PF;IAmXQ,UAAU;IACV,gBAAiC;E1C6+OvC;E0Cj2PF;IzCsJI,uByCgO8D;E1C8+OhE;E0Cp2PF;IAmXQ,UAAU;IACV,WAAiC;E1Co/OvC;E0Cx2PF;IzCsJI,kByCgO8D;E1Cq/OhE;AACF;;ACruPI;EyCvIJ;IAyXM,UAAU;IACV,YAAY;E1Cw/OhB;E0Cl3PF;IA4XM,UAAU;IACV,WAAW;E1Cy/Of;E0Ct3PF;IA+XM,UAAU;IACV,UAAU;E1C0/Od;E0C13PF;IAkYM,UAAU;IACV,eAAe;E1C2/OnB;E0C93PF;IAqYM,UAAU;IACV,UAAU;E1C4/Od;E0Cl4PF;IAwYM,UAAU;IACV,eAAe;E1C6/OnB;E0Ct4PF;IA2YM,UAAU;IACV,UAAU;E1C8/Od;E0C14PF;IA8YM,UAAU;IACV,UAAU;E1C+/Od;E0C94PF;IAiZM,UAAU;IACV,UAAU;E1CggPd;E0Cl5PF;IAoZM,UAAU;IACV,UAAU;E1CigPd;E0Ct5PF;IAuZM,UAAU;IACV,UAAU;E1CkgPd;E0C15PF;IzCsJI,iByCoQqC;E1CmgPvC;E0C75PF;IzCsJI,sByCsQ0C;E1CogP5C;E0Ch6PF;IzCsJI,iByCwQqC;E1CqgPvC;E0Cn6PF;IzCsJI,sByC0Q0C;E1CsgP5C;E0Ct6PF;IzCsJI,iByC4QqC;E1CugPvC;E0Cz6PF;IzCsJI,iByC8QqC;E1CwgPvC;E0C56PF;IzCsJI,iByCgRqC;E1CygPvC;E0C/6PF;IzCsJI,iByCkRqC;E1C0gPvC;E0Cl7PF;IzCsJI,iByCoRqC;E1C2gPvC;E0Cr7PF;IA6aQ,UAAU;IACV,SAAiC;E1C2gPvC;E0Cz7PF;IzCsJI,gByC0R8D;E1C4gPhE;E0C57PF;IA6aQ,UAAU;IACV,eAAiC;E1CkhPvC;E0Ch8PF;IzCsJI,sByC0R8D;E1CmhPhE;E0Cn8PF;IA6aQ,UAAU;IACV,gBAAiC;E1CyhPvC;E0Cv8PF;IzCsJI,uByC0R8D;E1C0hPhE;E0C18PF;IA6aQ,UAAU;IACV,UAAiC;E1CgiPvC;E0C98PF;IzCsJI,iByC0R8D;E1CiiPhE;E0Cj9PF;IA6aQ,UAAU;IACV,gBAAiC;E1CuiPvC;E0Cr9PF;IzCsJI,uByC0R8D;E1CwiPhE;E0Cx9PF;IA6aQ,UAAU;IACV,gBAAiC;E1C8iPvC;E0C59PF;IzCsJI,uByC0R8D;E1C+iPhE;E0C/9PF;IA6aQ,UAAU;IACV,UAAiC;E1CqjPvC;E0Cn+PF;IzCsJI,iByC0R8D;E1CsjPhE;E0Ct+PF;IA6aQ,UAAU;IACV,gBAAiC;E1C4jPvC;E0C1+PF;IzCsJI,uByC0R8D;E1C6jPhE;E0C7+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CmkPvC;E0Cj/PF;IzCsJI,uByC0R8D;E1CokPhE;E0Cp/PF;IA6aQ,UAAU;IACV,UAAiC;E1C0kPvC;E0Cx/PF;IzCsJI,iByC0R8D;E1C2kPhE;E0C3/PF;IA6aQ,UAAU;IACV,gBAAiC;E1CilPvC;E0C//PF;IzCsJI,uByC0R8D;E1CklPhE;E0ClgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CwlPvC;E0CtgQF;IzCsJI,uByC0R8D;E1CylPhE;E0CzgQF;IA6aQ,UAAU;IACV,WAAiC;E1C+lPvC;E0C7gQF;IzCsJI,kByC0R8D;E1CgmPhE;AACF;;A0C/lPA;EzC5RI,sByCxJgB;EzCwJhB,qByCxJgB;EAublB,oBAvbkB;A1CyhQpB;;A0CrmPA;EAKI,uBAzbgB;A1C6hQpB;;A0CzmPA;EAOI,qCAA4C;A1CsmPhD;;A0C7mPA;EAUI,uBAAuB;A1CumP3B;;A0CjnPA;EzC5RI,eyCwSiC;EzCxSjC,cyCySiC;EACjC,aAAa;A1CymPjB;;A0CvnPA;EAgBM,SAAS;EACT,qBAAqB;A1C2mP3B;;A0C5nPA;EAmBM,qBAAqB;A1C6mP3B;;A0ChoPA;EAqBM,gBAAgB;A1C+mPtB;;A0CpoPA;EAuBI,aAAa;A1CinPjB;;A0CxoPA;EAyBI,eAAe;A1CmnPnB;;A0C5oPA;EA2BI,mBAAmB;A1CqnPvB;;ACr+PE;EyCqVF;IA+BM,aAAa;E1CsnPjB;AACF;;AC/9PE;EyCyUF;IAmCM,aAAa;E1CwnPjB;AACF;;A0CtnPE;EACE,oBAAY;EzCnUZ,yCyCoU2D;EzCpU3D,wCyCqU2D;A1CynP/D;;A0C5nPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1C2nPrC;;A0CjoPE;EASM,iBAAY;A1C4nPpB;;ACpgQE;EyC+XA;IAYQ,iBAAY;E1C8nPpB;AACF;;ACtgQE;EyC2XA;IAeQ,iBAAY;E1CioPpB;AACF;;ACxgQE;EyCuXA;IAkBQ,iBAAY;E1CooPpB;AACF;;AC1gQE;EyCmXA;IAqBQ,iBAAY;E1CuoPpB;AACF;;AC5gQE;EyC+WA;IAwBQ,iBAAY;E1C0oPpB;AACF;;AC7gQI;EyC0WF;IA2BQ,iBAAY;E1C6oPpB;AACF;;ACzgQI;EyCgWF;IA8BQ,iBAAY;E1CgpPpB;AACF;;AC1gQI;EyC2VF;IAiCQ,iBAAY;E1CmpPpB;AACF;;ACtgQI;EyCiVF;IAoCQ,iBAAY;E1CspPpB;AACF;;A0C3rPE;EASM,oBAAY;A1CsrPpB;;AC9jQE;EyC+XA;IAYQ,oBAAY;E1CwrPpB;AACF;;AChkQE;EyC2XA;IAeQ,oBAAY;E1C2rPpB;AACF;;AClkQE;EyCuXA;IAkBQ,oBAAY;E1C8rPpB;AACF;;ACpkQE;EyCmXA;IAqBQ,oBAAY;E1CisPpB;AACF;;ACtkQE;EyC+WA;IAwBQ,oBAAY;E1CosPpB;AACF;;ACvkQI;EyC0WF;IA2BQ,oBAAY;E1CusPpB;AACF;;ACnkQI;EyCgWF;IA8BQ,oBAAY;E1C0sPpB;AACF;;ACpkQI;EyC2VF;IAiCQ,oBAAY;E1C6sPpB;AACF;;AChkQI;EyCiVF;IAoCQ,oBAAY;E1CgtPpB;AACF;;A0CrvPE;EASM,mBAAY;A1CgvPpB;;ACxnQE;EyC+XA;IAYQ,mBAAY;E1CkvPpB;AACF;;AC1nQE;EyC2XA;IAeQ,mBAAY;E1CqvPpB;AACF;;AC5nQE;EyCuXA;IAkBQ,mBAAY;E1CwvPpB;AACF;;AC9nQE;EyCmXA;IAqBQ,mBAAY;E1C2vPpB;AACF;;AChoQE;EyC+WA;IAwBQ,mBAAY;E1C8vPpB;AACF;;ACjoQI;EyC0WF;IA2BQ,mBAAY;E1CiwPpB;AACF;;AC7nQI;EyCgWF;IA8BQ,mBAAY;E1CowPpB;AACF;;AC9nQI;EyC2VF;IAiCQ,mBAAY;E1CuwPpB;AACF;;AC1nQI;EyCiVF;IAoCQ,mBAAY;E1C0wPpB;AACF;;A0C/yPE;EASM,oBAAY;A1C0yPpB;;AClrQE;EyC+XA;IAYQ,oBAAY;E1C4yPpB;AACF;;ACprQE;EyC2XA;IAeQ,oBAAY;E1C+yPpB;AACF;;ACtrQE;EyCuXA;IAkBQ,oBAAY;E1CkzPpB;AACF;;ACxrQE;EyCmXA;IAqBQ,oBAAY;E1CqzPpB;AACF;;AC1rQE;EyC+WA;IAwBQ,oBAAY;E1CwzPpB;AACF;;AC3rQI;EyC0WF;IA2BQ,oBAAY;E1C2zPpB;AACF;;ACvrQI;EyCgWF;IA8BQ,oBAAY;E1C8zPpB;AACF;;ACxrQI;EyC2VF;IAiCQ,oBAAY;E1Ci0PpB;AACF;;ACprQI;EyCiVF;IAoCQ,oBAAY;E1Co0PpB;AACF;;A0Cz2PE;EASM,iBAAY;A1Co2PpB;;AC5uQE;EyC+XA;IAYQ,iBAAY;E1Cs2PpB;AACF;;AC9uQE;EyC2XA;IAeQ,iBAAY;E1Cy2PpB;AACF;;AChvQE;EyCuXA;IAkBQ,iBAAY;E1C42PpB;AACF;;AClvQE;EyCmXA;IAqBQ,iBAAY;E1C+2PpB;AACF;;ACpvQE;EyC+WA;IAwBQ,iBAAY;E1Ck3PpB;AACF;;ACrvQI;EyC0WF;IA2BQ,iBAAY;E1Cq3PpB;AACF;;ACjvQI;EyCgWF;IA8BQ,iBAAY;E1Cw3PpB;AACF;;AClvQI;EyC2VF;IAiCQ,iBAAY;E1C23PpB;AACF;;AC9uQI;EyCiVF;IAoCQ,iBAAY;E1C83PpB;AACF;;A0Cn6PE;EASM,oBAAY;A1C85PpB;;ACtyQE;EyC+XA;IAYQ,oBAAY;E1Cg6PpB;AACF;;ACxyQE;EyC2XA;IAeQ,oBAAY;E1Cm6PpB;AACF;;AC1yQE;EyCuXA;IAkBQ,oBAAY;E1Cs6PpB;AACF;;AC5yQE;EyCmXA;IAqBQ,oBAAY;E1Cy6PpB;AACF;;AC9yQE;EyC+WA;IAwBQ,oBAAY;E1C46PpB;AACF;;AC/yQI;EyC0WF;IA2BQ,oBAAY;E1C+6PpB;AACF;;AC3yQI;EyCgWF;IA8BQ,oBAAY;E1Ck7PpB;AACF;;AC5yQI;EyC2VF;IAiCQ,oBAAY;E1Cq7PpB;AACF;;ACxyQI;EyCiVF;IAoCQ,oBAAY;E1Cw7PpB;AACF;;A0C79PE;EASM,mBAAY;A1Cw9PpB;;ACh2QE;EyC+XA;IAYQ,mBAAY;E1C09PpB;AACF;;ACl2QE;EyC2XA;IAeQ,mBAAY;E1C69PpB;AACF;;ACp2QE;EyCuXA;IAkBQ,mBAAY;E1Cg+PpB;AACF;;ACt2QE;EyCmXA;IAqBQ,mBAAY;E1Cm+PpB;AACF;;ACx2QE;EyC+WA;IAwBQ,mBAAY;E1Cs+PpB;AACF;;ACz2QI;EyC0WF;IA2BQ,mBAAY;E1Cy+PpB;AACF;;ACr2QI;EyCgWF;IA8BQ,mBAAY;E1C4+PpB;AACF;;ACt2QI;EyC2VF;IAiCQ,mBAAY;E1C++PpB;AACF;;ACl2QI;EyCiVF;IAoCQ,mBAAY;E1Ck/PpB;AACF;;A0CvhQE;EASM,oBAAY;A1CkhQpB;;AC15QE;EyC+XA;IAYQ,oBAAY;E1CohQpB;AACF;;AC55QE;EyC2XA;IAeQ,oBAAY;E1CuhQpB;AACF;;AC95QE;EyCuXA;IAkBQ,oBAAY;E1C0hQpB;AACF;;ACh6QE;EyCmXA;IAqBQ,oBAAY;E1C6hQpB;AACF;;ACl6QE;EyC+WA;IAwBQ,oBAAY;E1CgiQpB;AACF;;ACn6QI;EyC0WF;IA2BQ,oBAAY;E1CmiQpB;AACF;;AC/5QI;EyCgWF;IA8BQ,oBAAY;E1CsiQpB;AACF;;ACh6QI;EyC2VF;IAiCQ,oBAAY;E1CyiQpB;AACF;;AC55Q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E,yBAA6B;A7C+zRnC;;A6C9zRI;EAGI,yBAAgD;A7C+zRxD;;A6C9zRI;EACE,oCAAwC;A7Ci0R9C;;A6C71RE;EACE,yBAAwB;A7Cg2R5B;;A6C/1RE;EAGI,yBAA0C;A7Cg2RhD;;A6C/1RE;EACE,oCAAmC;A7Ck2RvC;;A6C71RI;EACE,yBAA8B;A7Cg2RpC;;A6C/1RI;EAGI,yBAAgD;A7Cg2RxD;;A6C/1RI;EACE,oCAAyC;A7Ck2R/C;;A6Ch2RI;EACE,yBAA6B;A7Cm2RnC;;A6Cl2RI;EAGI,yBAAgD;A7Cm2RxD;;A6Cl2RI;EACE,oCAAwC;A7Cq2R9C;;A6Cj4RE;EACE,yBAAwB;A7Co4R5B;;A6Cn4RE;EAGI,yBAA0C;A7Co4RhD;;A6Cn4RE;EACE,oCAAmC;A7Cs4RvC;;A6Cj4RI;EACE,yBAA8B;A7Co4RpC;;A6Cn4RI;EAGI,yBAAgD;A7Co4RxD;;A6Cn4RI;EACE,oCAAyC;A7Cs4R/C;;A6Cp4RI;EACE,yBAA6B;A7Cu4RnC;;A6Ct4RI;EAGI,yBAAgD;A7Cu4RxD;;A6Ct4RI;EACE,oCAAwC;A7Cy4R9C;;A6Cr6RE;EACE,yBAAwB;A7Cw6R5B;;A6Cv6RE;EAGI,yBAA0C;A7Cw6RhD;;A6Cv6RE;EACE,oCAAmC;A7C06RvC;;A6Cr6RI;EACE,yBAA8B;A7Cw6RpC;;A6Cv6RI;EAGI,yBAAgD;A7Cw6RxD;;A6Cv6RI;EACE,oCAAyC;A7C06R/C;;A6Cx6RI;EACE,yBAA6B;A7C26RnC;;A6C16RI;EAGI,yBAAgD;A7C26RxD;;A6C16RI;EACE,oCAAwC;A7C66R9C;;A6C16RE;EACE,yBAAwB;A7C66R5B;;A6C56RE;EACE,oCAAmC;A7C+6RvC;;A6Cl7RE;EACE,yBAAwB;A7Cq7R5B;;A6Cp7RE;EACE,oCAAmC;A7Cu7RvC;;A6C17RE;EACE,yBAAwB;A7C67R5B;;A6C57RE;EACE,oCAAmC;A7C+7RvC;;A6Cl8RE;EACE,yBAAwB;A7Cq8R5B;;A6Cp8RE;EACE,oCAAmC;A7Cu8RvC;;A6C18RE;EACE,yBAAwB;A7C68R5B;;A6C58RE;EACE,oCAAmC;A7C+8RvC;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,4BAAwB;A7Cq+R5B;;A6Cp+RE;EACE,uCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A8CnhSE;EACE,8BAAiC;A9CshSrC;;A8CvhSE;EACE,sCAAiC;A9C0hSrC;;A8C3hSE;EACE,iCAAiC;A9C8hSrC;;A8C/hSE;EACE,yCAAiC;A9CkiSrC;;A8C9hSE;EACE,4BAA4B;A9CiiShC;;A8CliSE;EACE,0BAA4B;A9CqiShC;;A8CtiSE;EACE,kCAA4B;A9CyiShC;;A8CriSE;EACE,sCAAkC;A9CwiStC;;A8CziSE;EACE,oCAAkC;A9C4iStC;;A8C7iSE;EACE,kCAAkC;A9CgjStC;;A8CjjSE;EACE,yCAAkC;A9CojStC;;A8CrjSE;EACE,wCAAkC;A9CwjStC;;A8CzjSE;EACE,wCAAkC;A9C4jStC;;A8C7jSE;EACE,iCAAkC;A9CgkStC;;A8CjkSE;EACE,+BAAkC;A9CokStC;;A8CrkSE;EACE,gCAAkC;A9CwkStC;;A8CzkSE;EACE,iCAAkC;A9C4kStC;;A8CxkSE;EACE,oCAAgC;A9C2kSpC;;A8C5kSE;EACE,kCAAgC;A9C+kSpC;;A8ChlSE;EACE,gCAAgC;A9CmlSpC;;A8CplSE;EACE,uCAAgC;A9CulSpC;;A8CxlSE;EACE,sCAAgC;A9C2lSpC;;A8C5lSE;EACE,sCAAgC;A9C+lSpC;;A8ChmSE;EACE,iCAAgC;A9CmmSpC;;A8CpmSE;EACE,+BAAgC;A9CumSpC;;A8CxmSE;EACE,6BAAgC;A9C2mSpC;;A8C5mSE;EACE,kCAAgC;A9C+mSpC;;A8C3mSE;EACE,+BAA8B;A9C8mSlC;;A8C/mSE;EACE,kCAA8B;A9CknSlC;;A8CnnSE;EACE,gCAA8B;A9CsnSlC;;A8CvnSE;EACE,8BAA8B;A9C0nSlC;;A8C3nSE;EACE,gCAA8B;A9C8nSlC;;A8C/nSE;EAC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A2B;ApD0vTjC;;AoD3vTI;EACE,0BAA2B;ApD8vTjC;;AoD/vTI;EACE,4BAA2B;ApDkwTjC;;AoDnwTI;EACE,6BAA2B;ApDswTjC;;AoDvwTI;EACE,0BAA2B;ApD0wTjC;;AoD3wTI;EACE,6BAA2B;ApD8wTjC;;ACvrTE;EmDxFE;IACE,0BAA2B;EpDmxT/B;EoDpxTE;IACE,4BAA2B;EpDsxT/B;EoDvxTE;IACE,0BAA2B;EpDyxT/B;EoD1xTE;IACE,4BAA2B;EpD4xT/B;EoD7xTE;IACE,6BAA2B;EpD+xT/B;EoDhyTE;IACE,0BAA2B;EpDkyT/B;EoDnyTE;IACE,6BAA2B;EpDqyT/B;AACF;;AC3sTE;EmD5FE;IACE,0BAA2B;EpD2yT/B;EoD5yTE;IACE,4BAA2B;EpD8yT/B;EoD/yTE;IACE,0BAA2B;EpDizT/B;EoDlzTE;IACE,4BAA2B;EpDozT/B;EoDrzTE;IACE,6BAA2B;EpDuzT/B;EoDxzTE;IACE,0BAA2B;EpD0zT/B;EoD3zTE;IACE,6BAA2B;EpD6zT/B;AACF;;AC3tTE;EmDpGE;IACE,0BAA2B;EpDm0T/B;EoDp0TE;IACE,4BAA2B;EpDs0T/B;EoDv0TE;IACE,0BAA2B;EpDy0T/B;EoD10TE;IACE,4BAA2B;EpD40T/B;EoD70TE;IACE,6BAA2B;EpD+0T/B;EoDh1TE;IACE,0BAA2B;EpDk1T/B;EoDn1TE;IACE,6BAA2B;EpDq1T/B;AACF;;AC/uTE;EmDxGE;IACE,0BAA2B;EpD21T/B;EoD51TE;IACE,4BAA2B;EpD81T/B;EoD/1TE;IACE,0BAA2B;EpDi2T/B;EoDl2TE;IACE,4BAA2B;EpDo2T/B;EoDr2TE;IACE,6BAA2B;EpDu2T/B;EoDx2TE;IACE,0BAA2B;EpD02T/B;EoD32TE;IACE,6BAA2B;EpD62T/B;AACF;;ACxvTI;EmDvHA;IACE,0BAA2B;EpDm3T/B;EoDp3TE;IACE,4BAA2B;EpDs3T/B;EoDv3TE;IACE,0BAA2B;EpDy3T/B;EoD13TE;IACE,4BAA2B;EpD43T/B;EoD73TE;IACE,6BAA2B;EpD+3T/B;EoDh4TE;IACE,0BAA2B;EpDk4T/B;EoDn4TE;IACE,6BAA2B;EpDq4T/B;AACF;;ACjwTI;EmDtIA;IACE,0BAA2B;EpD24T/B;EoD54TE;IACE,4BAA2B;EpD84T/B;EoD/4TE;IACE,0BAA2B;EpDi5T/B;EoDl5TE;IACE,4BAA2B;EpDo5T/B;EoDr5TE;IACE,6BAA2B;EpDu5T/B;EoDx5TE;IACE,0BAA2B;EpD05T/B;EoD35TE;IACE,6BAA2B;EpD65T/B;AACF;;AoDr4TE;EACE,6BAAqC;ApDw4TzC;;AoDz4TE;EACE,8BAAqC;ApD44TzC;;AoD74TE;EACE,2BAAqC;ApDg5TzC;;AoDj5TE;EACE,4BAAqC;ApDo5TzC;;ACv1TE;EmDzDE;IACE,6BAAqC;EpDo5TzC;AACF;;ACz1TE;EmD1DE;IACE,6BAAqC;EpDu5TzC;AACF;;AC31TE;EmD3DE;IACE,6BAAqC;EpD05TzC;AACF;;AC71TE;EmD5DE;IACE,6BAAqC;EpD65TzC;AACF;;AC/1TE;EmD7DE;IACE,6BAAqC;EpDg6TzC;AACF;;ACh2TI;EmD/DA;IACE,6BAAqC;EpDm6TzC;AACF;;AC51TI;EmDtEA;IACE,6BAAqC;EpDs6TzC;AACF;;AC71TI;EmDxEA;IACE,6BAAqC;EpDy6TzC;AACF;;ACz1TI;EmD/EA;IACE,6BAAqC;EpD46TzC;AACF;;AC74TE;EmDzDE;IACE,8BAAqC;EpD08TzC;AACF;;AC/4TE;EmD1DE;IACE,8BAAqC;EpD68TzC;AACF;;ACj5TE;EmD3DE;IACE,8BAAqC;EpDg9TzC;AACF;;ACn5TE;EmD5DE;IACE,8BAAqC;EpDm9TzC;AACF;;ACr5TE;EmD7DE;IACE,8BAAqC;EpDs9TzC;AACF;;ACt5TI;EmD/DA;IACE,8BAAqC;EpDy9TzC;AACF;;ACl5TI;EmDtEA;IACE,8BAAqC;EpD49TzC;AACF;;ACn5TI;EmDxEA;IACE,8BAAqC;EpD+9TzC;AACF;;AC/4TI;EmD/EA;IACE,8BAAqC;EpDk+TzC;AACF;;ACn8TE;EmDzDE;IACE,2BAAqC;EpDggUzC;AACF;;ACr8TE;EmD1DE;IACE,2BAAqC;EpDmgUzC;AACF;;ACv8TE;EmD3DE;IACE,2BAAqC;EpDsgUzC;AACF;;ACz8TE;EmD5DE;IACE,2BAAqC;EpDygUzC;AACF;;AC38TE;EmD7DE;IACE,2BAAqC;EpD4gUzC;AACF;;AC58TI;EmD/DA;IACE,2BAAqC;EpD+gUzC;AACF;;ACx8TI;EmDtEA;IACE,2BAAqC;EpDkhUzC;AACF;;ACz8TI;EmDxEA;IACE,2BAAqC;EpDqhUzC;AACF;;ACr8TI;EmD/EA;IACE,2BAAqC;EpDwhUzC;AACF;;ACz/TE;EmDzDE;IACE,4BAAqC;EpDsjUzC;AACF;;AC3/TE;EmD1DE;IACE,4BAAqC;EpDyjUzC;AACF;;AC7/TE;EmD3DE;IACE,4BAAqC;EpD4jUzC;AACF;;AC//TE;EmD5DE;IACE,4BAAqC;EpD+jUzC;AACF;;ACjgUE;EmD7DE;IACE,4BAAqC;EpDkkUzC;AACF;;AClgUI;EmD/DA;IACE,4BAAqC;EpDqkUzC;AACF;;AC9/TI;EmDtEA;IACE,4BAAqC;EpDwkUzC;AACF;;AC//TI;EmDxEA;IACE,4BAAqC;EpD2kUzC;AACF;;AC3/TI;EmD/EA;IACE,4BAAqC;EpD8kUzC;AACF;;AoD7kUA;EACE,qCAAqC;ApDglUvC;;AoD9kUA;EACE,oCAAoC;ApDilUtC;;AoD/kUA;EACE,oCAAoC;ApDklUtC;;AoDhlUA;EACE,6BAA6B;ApDmlU/B;;AoDjlUA;EACE,qCAAqC;ApDolUvC;;AoDllUA;EACE,2BAAqC;ApDqlUvC;;AoDplUA;EACE,2BAAsC;ApDulUxC;;AoDtlUA;EACE,2BAAsC;ApDylUxC;;AoDxlUA;EACE,2BAAwC;ApD2lU1C;;AoD1lUA;EACE,2BAAoC;ApD6lUtC;;AoD3lUA;EACE,+LAAuC;ApD8lUzC;;AoD5lUA;EACE,+LAAyC;ApD+lU3C;;AoD7lUA;EACE,+LAA0C;ApDgmU5C;;AoD9lUA;EACE,iCAAyC;ApDimU3C;;AoD/lUA;EACE,iCAAoC;ApDkmUtC;;AqDnsUE;EACE,yBAA+B;ArDssUnC;;AC/mUE;EoDrFE;IACE,yBAA+B;ErDwsUnC;AACF;;ACjnUE;EoDtFE;IACE,yBAA+B;ErD2sUnC;AACF;;ACnnUE;EoDvFE;IACE,yBAA+B;ErD8sUnC;AACF;;ACrnUE;EoDxFE;IACE,yBAA+B;ErDitUnC;AACF;;ACvnUE;EoDzFE;IACE,yBAA+B;ErDotUnC;AACF;;ACxnUI;EoD3FA;IACE,yBAA+B;ErDutUnC;AACF;;ACpnUI;EoDlGA;IACE,yBAA+B;ErD0tUnC;AACF;;ACrnUI;EoDpGA;IACE,yBAA+B;ErD6tUnC;AACF;;ACjnUI;EoD3GA;IACE,yBAA+B;ErDguUnC;AACF;;AqD7vUE;EACE,wBAA+B;ArDgwUnC;;ACzqUE;EoDrFE;IACE,wBAA+B;ErDkwUnC;AACF;;AC3qUE;EoDtFE;IACE,wBAA+B;ErDqwUnC;AACF;;AC7qUE;EoDvFE;IACE,wBAA+B;ErDwwUnC;AACF;;AC/qUE;EoDxFE;IACE,wBAA+B;ErD2wUnC;AACF;;ACjrUE;EoDzFE;IACE,wBAA+B;ErD8wUnC;AACF;;AClrUI;EoD3FA;IACE,wBAA+B;ErDixUnC;AACF;;AC9qUI;EoDlGA;IACE,wBAA+B;ErDoxUnC;AACF;;AC/qUI;EoDpGA;IACE,wBAA+B;ErDuxUnC;AACF;;AC3qUI;EoD3GA;IACE,wBAA+B;ErD0xUnC;AACF;;AqDvzUE;EACE,0BAA+B;ArD0zUnC;;ACnuUE;EoDrFE;IACE,0BAA+B;ErD4zUnC;AACF;;ACruUE;EoDtFE;IACE,0BAA+B;ErD+zUnC;AACF;;ACvuUE;EoDvFE;IACE,0BAA+B;ErDk0UnC;AACF;;ACzuUE;EoDxFE;IACE,0BAA+B;ErDq0UnC;AACF;;AC3uUE;EoDzFE;IACE,0BAA+B;ErDw0UnC;AACF;;AC5uUI;EoD3FA;IACE,0BAA+B;ErD20UnC;AACF;;ACxuUI;EoDlGA;IACE,0BAA+B;ErD80UnC;AACF;;ACzuUI;EoDpGA;IACE,0BAA+B;ErDi1UnC;AACF;;ACruUI;EoD3GA;IACE,0BAA+B;ErDo1UnC;AACF;;AqDj3UE;EACE,gCAA+B;ArDo3UnC;;AC7xUE;EoDrFE;IACE,gCAA+B;ErDs3UnC;AACF;;AC/xUE;EoDtFE;IACE,gCAA+B;ErDy3UnC;AACF;;ACjyUE;EoDvFE;IACE,gCAA+B;ErD43UnC;AACF;;ACnyUE;EoDxFE;IACE,gCAA+B;ErD+3UnC;AACF;;ACryUE;EoDzFE;IACE,gCAA+B;ErDk4UnC;AACF;;ACtyUI;EoD3FA;IACE,gCAA+B;ErDq4UnC;AACF;;AClyUI;EoDlGA;IACE,gCAA+B;ErDw4UnC;AACF;;ACnyUI;EoDpGA;IACE,gCAA+B;ErD24UnC;AACF;;AC/xUI;EoD3GA;IACE,gCAA+B;ErD84UnC;AACF;;AqD36UE;EACE,+BAA+B;ArD86UnC;;ACv1UE;EoDrFE;IACE,+BAA+B;ErDg7UnC;AACF;;ACz1UE;EoDtFE;IACE,+BAA+B;ErDm7UnC;AACF;;AC31UE;EoDvFE;IACE,+BAA+B;ErDs7UnC;AACF;;AC71UE;EoDxFE;IACE,+BAA+B;ErDy7UnC;AACF;;AC/1UE;EoDzFE;IACE,+BAA+B;ErD47UnC;AACF;;ACh2UI;EoD3FA;IACE,+BAA+B;ErD+7UnC;AACF;;AC51UI;EoDlGA;IACE,+BAA+B;ErDk8UnC;AACF;;AC71UI;EoDpGA;IACE,+BAA+B;ErDq8UnC;AACF;;ACz1UI;EoD3GA;IACE,+BAA+B;ErDw8UnC;AACF;;AqDv8UA;EACE,wBAAwB;ArD08U1B;;AqDx8UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArD28U1B;;AC55UE;EoD5CA;IACE,wBAAwB;ErD48U1B;AACF;;AC95UE;EoD5CA;IACE,wBAAwB;ErD88U1B;AACF;;ACh6UE;EoD5CA;IACE,wBAAwB;ErDg9U1B;AACF;;ACl6UE;EoD5CA;IACE,wBAAwB;ErDk9U1B;AACF;;ACp6UE;EoD5CA;IACE,wBAAwB;ErDo9U1B;AACF;;ACr6UI;EoD7CF;IACE,wBAAwB;ErDs9U1B;AACF;;ACj6UI;EoDnDF;IACE,wBAAwB;ErDw9U1B;AACF;;ACl6UI;EoDpDF;IACE,wBAAwB;ErD09U1B;AACF;;AC95UI;EoD1DF;IACE,wBAAwB;ErD49U1B;AACF;;AqD39UA;EACE,6BAA6B;ArD89U/B;;ACt9UE;EoDLA;IACE,6BAA6B;ErD+9U/B;AACF;;ACx9UE;EoDLA;IACE,6BAA6B;ErDi+U/B;AACF;;AC19UE;EoDLA;IACE,6BAA6B;ErDm+U/B;AACF;;AC59UE;EoDLA;IACE,6BAA6B;ErDq+U/B;AACF;;AC99UE;EoDLA;IACE,6BAA6B;ErDu+U/B;AACF;;AC/9UI;EoDNF;IACE,6BAA6B;ErDy+U/B;AACF;;AC39UI;EoDZF;IACE,6BAA6B;ErD2+U/B;AACF;;AC59UI;EoDbF;IACE,6BAA6B;ErD6+U/B;AACF;;ACx9UI;EoDnBF;IACE,6BAA6B;ErD++U/B;AACF;;AsDzmVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvDkmVhC;;AuDtmVA;EAMI,gBAAgB;AvDomVpB;;AuD1mVA;EASM,mBAAmB;AvDqmVzB;;AuD9mVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;AC4nV7B;;AuDnnVA;;EAmBQ,cAAc;AvDqmVtB;;AuDxnVA;EAqBQ,cxD9BqB;ACqoV7B;;AuD5nVA;EAuBQ,4BxDhCqB;ACyoV7B;;AuDhoVA;;EA0BU,cxDnCmB;AC8oV7B;;ACviVE;EsD9FF;IA6BU,uBxDzBqB;ECsoV7B;AACF;;AuD3oVA;;EAgCQ,4BxDzCqB;ACypV7B;;AuDhpVA;;;EAqCU,yB7C6DuB;E6C5DvB,cxD/CmB;ACgqV7B;;AuDvpVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvDknVtB;;AuD5pVA;EA4CY,UAAU;AvDonVtB;;AuDhqVA;EA+CY,uBAAwB;EACxB,UAAU;AvDqnVtB;;AuDrqVA;EAoDY,cxD7DiB;ACkrV7B;;AuDzqVA;EAsDc,uCxD/De;ACsrV7B;;AuD7qVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;AC+qV/B;;AuDnrVA;EAkEU,4EAAyG;AvDqnVnH;;ACrmVE;EsDlFF;IAqEc,4EAAyG;EvDunVrH;AACF;;AuD7rVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;AC8rV/B;;AuDlsVA;;EAmBQ,cAAc;AvDorVtB;;AuDvsVA;EAqBQ,YxDjBuB;ACusV/B;;AuD3sVA;EAuBQ,+BxDnBuB;AC2sV/B;;AuD/sVA;;EA0BU,YxDtBqB;ACgtV/B;;ACtnVE;EsD9FF;IA6BU,yBxDtCmB;ECkuV3B;AACF;;AuD1tVA;;EAgCQ,+BxD5BuB;AC2tV/B;;AuD/tVA;;;EAqCU,uB7C6DuB;E6C5DvB,YxDlCqB;ACkuV/B;;AuDtuVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDisVtB;;AuD3uVA;EA4CY,UAAU;AvDmsVtB;;AuD/uVA;EA+CY,yBAAwB;EACxB,UAAU;AvDosVtB;;AuDpvVA;EAoDY,YxDhDmB;ACovV/B;;AuDxvVA;EAsDc,uCxD/De;ACqwV7B;;AuD5vVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;AC2wV7B;;AuDlwVA;EAkEU,8EAAyG;AvDosVnH;;ACprVE;EsDlFF;IAqEc,8EAAyG;EvDssVrH;AACF;;AuD5wVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AV4sVrB;;AuDjxVA;;EAmBQ,cAAc;AvDmwVtB;;AuDtxVA;EAqBQ,yB7CgDa;AVqtVrB;;AuD1xVA;EAuBQ,yB7C8Ca;AVytVrB;;AuD9xVA;;EA0BU,yB7C2CW;AV8tVrB;;ACrsVE;EsD9FF;IA6BU,4BxD3BoB;ECsyV5B;AACF;;AuDzyVA;;EAgCQ,yB7CqCa;AVyuVrB;;AuD9yVA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AVgvVrB;;AuDrzVA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDgxVtB;;AuD1zVA;EA4CY,UAAU;AvDkxVtB;;AuD9zVA;EA+CY,4BAAwB;EACxB,UAAU;AvDmxVtB;;AuDn0VA;EAoDY,yB7CiBS;AVkwVrB;;AuDv0VA;EAsDc,uCxD/De;ACo1V7B;;AuD30VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;AC+0V9B;;AuDj1VA;EAkEU,iFAAyG;AvDmxVnH;;ACnwVE;EsDlFF;IAqEc,iFAAyG;EvDqxVrH;AACF;;AuD31VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVyxVhB;;AuDh2VA;;EAmBQ,cAAc;AvDk1VtB;;AuDr2VA;EAqBQ,W7CkDQ;AVkyVhB;;AuDz2VA;EAuBQ,+B7CgDQ;AVsyVhB;;AuD72VA;;EA0BU,W7C6CM;AV2yVhB;;ACpxVE;EsD9FF;IA6BU,yBxDlCoB;EC43V5B;AACF;;AuDx3VA;;EAgCQ,+B7CuCQ;AVszVhB;;AuD73VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV6zVhB;;AuDp4VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD+1VtB;;AuDz4VA;EA4CY,UAAU;AvDi2VtB;;AuD74VA;EA+CY,yBAAwB;EACxB,UAAU;AvDk2VtB;;AuDl5VA;EAoDY,W7CmBI;AV+0VhB;;AuDt5VA;EAsDc,uCxD/De;ACm6V7B;;AuD15VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;ACq6V9B;;AuDh6VA;EAkEU,gFAAyG;AvDk2VnH;;ACl1VE;EsDlFF;IAqEc,gFAAyG;EvDo2VrH;AACF;;AuD16VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVw2VhB;;AuD/6VA;;EAmBQ,cAAc;AvDi6VtB;;AuDp7VA;EAqBQ,W7CkDQ;AVi3VhB;;AuDx7VA;EAuBQ,+B7CgDQ;AVq3VhB;;AuD57VA;;EA0BU,W7C6CM;AV03VhB;;ACn2VE;EsD9FF;IA6BU,yBxDpBwB;EC67VhC;AACF;;AuDv8VA;;EAgCQ,+B7CuCQ;AVq4VhB;;AuD58VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV44VhB;;AuDn9VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD86VtB;;AuDx9VA;EA4CY,UAAU;AvDg7VtB;;AuD59VA;EA+CY,yBAAwB;EACxB,UAAU;AvDi7VtB;;AuDj+VA;EAoDY,W7CmBI;AV85VhB;;AuDr+VA;EAsDc,uCxD/De;ACk/V7B;;AuDz+VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;ACs+VlC;;AuD/+VA;EAkEU,gFAAyG;AvDi7VnH;;ACj6VE;EsDlFF;IAqEc,gFAAyG;EvDm7VrH;AACF;;AuDz/VA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AVu7VhB;;AuD9/VA;;EAmBQ,cAAc;AvDg/VtB;;AuDngWA;EAqBQ,W7CkDQ;AVg8VhB;;AuDvgWA;EAuBQ,+B7CgDQ;AVo8VhB;;AuD3gWA;;EA0BU,W7C6CM;AVy8VhB;;ACl7VE;EsD9FF;IA6BU,yBxDlBwB;EC0gWhC;AACF;;AuDthWA;;EAgCQ,+B7CuCQ;AVo9VhB;;AuD3hWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV29VhB;;AuDliWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD6/VtB;;AuDviWA;EA4CY,UAAU;AvD+/VtB;;AuD3iWA;EA+CY,yBAAwB;EACxB,UAAU;AvDggWtB;;AuDhjWA;EAoDY,W7CmBI;AV6+VhB;;AuDpjWA;EAsDc,uCxD/De;ACikW7B;;AuDxjWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;ACmjWlC;;AuD9jWA;EAkEU,gFAAyG;AvDggWnH;;ACh/VE;EsDlFF;IAqEc,gFAAyG;EvDkgWrH;AACF;;AuDxkWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AVsgWhB;;AuD7kWA;;EAmBQ,cAAc;AvD+jWtB;;AuDllWA;EAqBQ,W7CkDQ;AV+gWhB;;AuDtlWA;EAuBQ,+B7CgDQ;AVmhWhB;;AuD1lWA;;EA0BU,W7C6CM;AVwhWhB;;ACjgWE;EsD9FF;IA6BU,yBxDnBwB;EC0lWhC;AACF;;AuDrmWA;;EAgCQ,+B7CuCQ;AVmiWhB;;AuD1mWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV0iWhB;;AuDjnWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD4kWtB;;AuDtnWA;EA4CY,UAAU;AvD8kWtB;;AuD1nWA;EA+CY,yBAAwB;EACxB,UAAU;AvD+kWtB;;AuD/nWA;EAoDY,W7CmBI;AV4jWhB;;AuDnoWA;EAsDc,uCxD/De;ACgpW7B;;AuDvoWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;ACmoWlC;;AuD7oWA;EAkEU,gFAAyG;AvD+kWnH;;AC/jWE;EsDlFF;IAqEc,gFAAyG;EvDilWrH;AACF;;AuDvpWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AVqlWhB;;AuD5pWA;;EAmBQ,cAAc;AvD8oWtB;;AuDjqWA;EAqBQ,W7CkDQ;AV8lWhB;;AuDrqWA;EAuBQ,+B7CgDQ;AVkmWhB;;AuDzqWA;;EA0BU,W7C6CM;AVumWhB;;AChlWE;EsD9FF;IA6BU,yBxDrBwB;EC2qWhC;AACF;;AuDprWA;;EAgCQ,+B7CuCQ;AVknWhB;;AuDzrWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVynWhB;;AuDhsWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD2pWtB;;AuDrsWA;EA4CY,UAAU;AvD6pWtB;;AuDzsWA;EA+CY,yBAAwB;EACxB,UAAU;AvD8pWtB;;AuD9sWA;EAoDY,W7CmBI;AV2oWhB;;AuDltWA;EAsDc,uCxD/De;AC+tW7B;;AuDttWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;ACotWlC;;AuD5tWA;EAkEU,gFAAyG;AvD8pWnH;;AC9oWE;EsDlFF;IAqEc,gFAAyG;EvDgqWrH;AACF;;AuDtuWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AVsqWrB;;AuD3uWA;;EAmBQ,cAAc;AvD6tWtB;;AuDhvWA;EAqBQ,yB7CgDa;AV+qWrB;;AuDpvWA;EAuBQ,yB7C8Ca;AVmrWrB;;AuDxvWA;;EA0BU,yB7C2CW;AVwrWrB;;AC/pWE;EsD9FF;IA6BU,yBxDtBwB;EC2vWhC;AACF;;AuDnwWA;;EAgCQ,yB7CqCa;AVmsWrB;;AuDxwWA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AV0sWrB;;AuD/wWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvD0uWtB;;AuDpxWA;EA4CY,UAAU;AvD4uWtB;;AuDxxWA;EA+CY,yBAAwB;EACxB,UAAU;AvD6uWtB;;AuD7xWA;EAoDY,yB7CiBS;AV4tWrB;;AuDjyWA;EAsDc,uCxD/De;AC8yW7B;;AuDryWA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;ACoyWlC;;AuD3yWA;EAkEU,gFAAyG;AvD6uWnH;;AC7tWE;EsDlFF;IAqEc,gFAAyG;EvD+uWrH;AACF;;AuDrzWA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AVmvWhB;;AuD1zWA;;EAmBQ,cAAc;AvD4yWtB;;AuD/zWA;EAqBQ,W7CkDQ;AV4vWhB;;AuDn0WA;EAuBQ,+B7CgDQ;AVgwWhB;;AuDv0WA;;EA0BU,W7C6CM;AVqwWhB;;AC9uWE;EsD9FF;IA6BU,yBxDhBuB;ECo0W/B;AACF;;AuDl1WA;;EAgCQ,+B7CuCQ;AVgxWhB;;AuDv1WA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVuxWhB;;AuD91WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDyzWtB;;AuDn2WA;EA4CY,UAAU;AvD2zWtB;;AuDv2WA;EA+CY,yBAAwB;EACxB,UAAU;AvD4zWtB;;AuD52WA;EAoDY,W7CmBI;AVyyWhB;;AuDh3WA;EAsDc,uCxD/De;AC63W7B;;AuDp3WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;AC62WjC;;AuD13WA;EAkEU,gFAAyG;AvD4zWnH;;AC5yWE;EsDlFF;IAqEc,gFAAyG;EvD8zWrH;AACF;;AuDp4WA;EAyEM,eAhF0B;AvD+4WhC;;AClzWE;EsDtFF;IA6EQ,oBAnF8B;EvDm5WpC;AACF;;ACxzWE;EsDtFF;IAiFQ,mBAtF4B;EvDw5WlC;AACF;;AuDp5WA;EAsFM,mBAAmB;EACnB,aAAa;AvDk0WnB;;AuDz5WA;EAyFQ,YAAY;EACZ,cAAc;AvDo0WtB;;AuD95WA;EA4FI,gBAAgB;AvDs0WpB;;AuDl6WA;EA8FI,iBAAiB;AvDw0WrB;;AuDp0WA;EAEE,gBAAgB;AvDs0WlB;;AuDx0WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDw0WzC;;AuDj1WA;EAYI,YAAY;AvDy0WhB;;ACr2WE;EsDgBF;IAeI,aAAa;EvD20Wf;AACF;;AuD10WA;EACE,kBAAkB;AvD60WpB;;AC/2WE;EsDiCF;IAKM,aAAa;EvD80WjB;EuDn1WF;IAOQ,sBAAsB;EvD+0W5B;AACF;;ACp3WE;EsD6BF;IASI,aAAa;IACb,uBAAuB;EvDm1WzB;EuD71WF;ItD4BI,mBsDhBwC;EvDo1W1C;AACF;;AuDj1WA;;EAEE,YAAY;EACZ,cAAc;AvDo1WhB;;AuDl1WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDy+W/B;;AC14WE;EsDkDF;IAKI,kBArJgC;EvD6+WlC;AACF;;AwD1+WA;EACE,oBAN2B;AxDm/W7B;;ACx4WE;EuDtGF;IAII,kBAR+B;ExDu/WjC;EwDn/WF;IAOM,oBAV8B;ExDy/WlC;EwDt/WF;IASM,mBAX4B;ExD2/WhC;AACF;;AyD3/WA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzDkgXjC","file":"bulma-rtl.css"} \ No newline at end of file +{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma-rtl.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EHvDE,iCAAiC;EGyDjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTyDgB;ESxDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AS/ZA;EAGE,uBVhD6B;EUiD7B,qBVtD4B;EUuD5B,iBX5DwB;EW6DxB,cV5D4B;EU6D5B,eAAe;EAGf,uBAAuB;EACvB,iCA7D6D;EA8D7D,iBA7D6B;EA8D7B,kBA9D6B;EA+D7B,8BAhE6D;EAiE7D,kBAAkB;EAClB,mBAAmB;AT8ZrB;;AS9aA;EAkBI,cAAc;ATgalB;;ASlbA;EAwBM,aAAa;EACb,YAAY;AT8ZlB;;ASvbA;ERsHI,gCQ3FsG;ER2FtG,mBQ1FmE;ATgavE;;AS5bA;ERsHI,oBQxFmE;ERwFnE,+BQvFsG;ATka1G;;ASjcA;EAiCM,+BAAiF;EACjF,gCAAkF;AToaxF;;AStcA;EAsCI,qBVzF0B;EU0F1B,cV7F0B;ACigB9B;;AS3cA;EA0CI,qBVhF8B;EUiF9B,cVjG0B;ACsgB9B;;AShdA;EA6CM,iDVnF4B;AC0flC;;ASpdA;EAgDI,qBVrG0B;EUsG1B,cVvG0B;AC+gB9B;;ASzdA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV3G0B;EU4G1B,0BA1F8B;ATmgBlC;;ASheA;EA4DM,4BV3GwB;EU4GxB,cVnHwB;AC2hB9B;;ASreA;EAgEM,yBChB2B;EDiB3B,cVvHwB;ACgiB9B;;AS1eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT2atB;;ASjfA;EAwEI,gBAvG0B;EAwG1B,yBAvGmC;EAwGnC,cVhH8B;EUiH9B,qBAvG0B;ATohB9B;;ASxfA;EA8EM,cVpH4B;EUqH5B,0BAzGmC;ATuhBzC;;AS7fA;EAoFM,uBVjIyB;EUkIzB,yBAAyB;EACzB,cVhJuB;AC6jB7B;;ASngBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,cVrJqB;ACmkB7B;;ASzgBA;EA8FQ,yBAAyB;EACzB,cVzJqB;ACwkB7B;;AS9gBA;EAiGU,mDV9IqB;AC+jB/B;;ASlhBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,cVhKqB;ACklB7B;;ASxhBA;;EAyGQ,uBVtJuB;EUuJvB,mBVvJuB;EUwJvB,gBAAgB;ATobxB;;AS/hBA;EA6GQ,yBVvKqB;EUwKrB,YV3JuB;ACilB/B;;ASpiBA;EAiHU,uBCjEuB;AVwfjC;;ASxiBA;;EAoHU,yBV9KmB;EU+KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVpKqB;AC6lB/B;;AShjBA;EA0HU,gEAA4E;AT0btF;;ASpjBA;EA4HQ,6BAA6B;EAC7B,mBV1KuB;EU2KvB,YV3KuB;ACumB/B;;AS1jBA;EAmIU,uBVhLqB;EUiLrB,mBVjLqB;EUkLrB,cV/LmB;AC0nB7B;;AShkBA;EAwIY,4DAA8D;AT4b1E;;ASpkBA;EA8Ic,gEAA4E;AT0b1F;;ASxkBA;;EAiJU,6BAA6B;EAC7B,mBV/LqB;EUgMrB,gBAAgB;EAChB,YVjMqB;AC6nB/B;;AShlBA;EAsJQ,6BAA6B;EAC7B,qBVjNqB;EUkNrB,cVlNqB;ACgpB7B;;AStlBA;EA6JU,yBVvNmB;EUwNnB,YV3MqB;ACwoB/B;;AS3lBA;EAqKc,4DAA8D;AT0b5E;;AS/lBA;;EAwKU,6BAA6B;EAC7B,qBVnOmB;EUoOnB,gBAAgB;EAChB,cVrOmB;ACiqB7B;;ASvmBA;EAoFM,yBV9IuB;EU+IvB,yBAAyB;EACzB,YVnIyB;AC0pB/B;;AS7mBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,YVxIuB;ACgqB/B;;ASnnBA;EA8FQ,yBAAyB;EACzB,YV5IuB;ACqqB/B;;ASxnBA;EAiGU,gDV3JmB;ACsrB7B;;AS5nBA;EAoGQ,uBCpDyB;EDqDzB,yBAAyB;EACzB,YVnJuB;AC+qB/B;;ASloBA;;EAyGQ,yBVnKqB;EUoKrB,qBVpKqB;EUqKrB,gBAAgB;AT8hBxB;;ASzoBA;EA6GQ,uBV1JuB;EU2JvB,cVxKqB;ACwsB7B;;AS9oBA;EAiHU,yBCjEuB;AVkmBjC;;ASlpBA;;EAoHU,uBVjKqB;EUkKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVjLmB;ACotB7B;;AS1pBA;EA0HU,4DAA4E;AToiBtF;;AS9pBA;EA4HQ,6BAA6B;EAC7B,qBVvLqB;EUwLrB,cVxLqB;AC8tB7B;;ASpqBA;EAmIU,yBV7LmB;EU8LnB,qBV9LmB;EU+LnB,YVlLqB;ACutB/B;;AS1qBA;EAwIY,gEAA8D;ATsiB1E;;AS9qBA;EA8Ic,4DAA4E;AToiB1F;;ASlrBA;;EAiJU,6BAA6B;EAC7B,qBV5MmB;EU6MnB,gBAAgB;EAChB,cV9MmB;ACovB7B;;AS1rBA;EAsJQ,6BAA6B;EAC7B,mBVpMuB;EUqMvB,YVrMuB;AC6uB/B;;AShsBA;EA6JU,uBV1MqB;EU2MrB,cVxNmB;AC+vB7B;;ASrsBA;EAqKc,gEAA8D;AToiB5E;;ASzsBA;;EAwKU,6BAA6B;EAC7B,mBVtNqB;EUuNrB,gBAAgB;EAChB,YVxNqB;AC8vB/B;;ASjtBA;EAoFM,4BVnIwB;EUoIxB,yBAAyB;EACzB,yBClEe;AVmsBrB;;ASvtBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVysBrB;;AS7tBA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV8sBrB;;ASluBA;EAiGU,mDVhJoB;ACqxB9B;;AStuBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVwtBrB;;AS5uBA;;EAyGQ,4BVxJsB;EUyJtB,wBVzJsB;EU0JtB,gBAAgB;ATwoBxB;;ASnvBA;EA6GQ,oCCzFa;ED0Fb,iBV7JsB;ACuyB9B;;ASxvBA;EAiHU,oCCjEuB;AV4sBjC;;AS5vBA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVtKoB;ACmzB9B;;ASpwBA;EA0HU,sFAA4E;AT8oBtF;;ASxwBA;EA4HQ,6BAA6B;EAC7B,wBV5KsB;EU6KtB,iBV7KsB;AC6zB9B;;AS9wBA;EAmIU,4BVlLoB;EUmLpB,wBVnLoB;EUoLpB,yBCjHW;AVgwBrB;;ASpxBA;EAwIY,sEAA8D;ATgpB1E;;ASxxBA;EA8Ic,sFAA4E;AT8oB1F;;AS5xBA;;EAiJU,6BAA6B;EAC7B,wBVjMoB;EUkMpB,gBAAgB;EAChB,iBVnMoB;ACm1B9B;;ASpyBA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVsxBrB;;AS1yBA;EA6JU,oCCzIW;ED0IX,iBV7MoB;AC81B9B;;AS/yBA;EAqKc,sEAA8D;AT8oB5E;;ASnzBA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVuyBrB;;AS3zBA;EAoFM,yBV1IwB;EU2IxB,yBAAyB;EACzB,WChEU;AV2yBhB;;ASj0BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVizBhB;;ASv0BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVszBhB;;AS50BA;EAiGU,gDVvJoB;ACs4B9B;;ASh1BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVg0BhB;;ASt1BA;;EAyGQ,yBV/JsB;EUgKtB,qBVhKsB;EUiKtB,gBAAgB;ATkvBxB;;AS71BA;EA6GQ,sBCvFQ;EDwFR,cVpKsB;ACw5B9B;;ASl2BA;EAiHU,yBCjEuB;AVszBjC;;ASt2BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7KoB;ACo6B9B;;AS92BA;EA0HU,0DAA4E;ATwvBtF;;ASl3BA;EA4HQ,6BAA6B;EAC7B,qBVnLsB;EUoLtB,cVpLsB;AC86B9B;;ASx3BA;EAmIU,yBVzLoB;EU0LpB,qBV1LoB;EU2LpB,WC/GM;AVw2BhB;;AS93BA;EAwIY,gEAA8D;AT0vB1E;;ASl4BA;EA8Ic,0DAA4E;ATwvB1F;;ASt4BA;;EAiJU,6BAA6B;EAC7B,qBVxMoB;EUyMpB,gBAAgB;EAChB,cV1MoB;ACo8B9B;;AS94BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV83BhB;;ASp5BA;EA6JU,sBCvIM;EDwIN,cVpNoB;AC+8B9B;;ASz5BA;EAqKc,gEAA8D;ATwvB5E;;AS75BA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+4BhB;;ASr6BA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WChEU;AVq5BhB;;AS36BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV25BhB;;ASj7BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVg6BhB;;ASt7BA;EAiGU,iDVzIwB;ACk+BlC;;AS17BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV06BhB;;ASh8BA;;EAyGQ,yBVjJ0B;EUkJ1B,qBVlJ0B;EUmJ1B,gBAAgB;AT41BxB;;ASv8BA;EA6GQ,sBCvFQ;EDwFR,cVtJ0B;ACo/BlC;;AS58BA;EAiHU,yBCjEuB;AVg6BjC;;ASh9BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACggClC;;ASx9BA;EA0HU,0DAA4E;ATk2BtF;;AS59BA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC0gClC;;ASl+BA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC/GM;AVk9BhB;;ASx+BA;EAwIY,gEAA8D;ATo2B1E;;AS5+BA;EA8Ic,0DAA4E;ATk2B1F;;ASh/BA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACgiClC;;ASx/BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVw+BhB;;AS9/BA;EA6JU,sBCvIM;EDwIN,cVtMwB;AC2iClC;;ASngCA;EAqKc,gEAA8D;ATk2B5E;;ASvgCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVy/BhB;;AS/gCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV++BrE;;ASphCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVq/BrE;;AS1hCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV2/BrE;;AShiCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WChEU;AVghChB;;AStiCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVshChB;;AS5iCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AV2hChB;;ASjjCA;EAiGU,iDVvIwB;AC2lClC;;ASrjCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVqiChB;;AS3jCA;;EAyGQ,yBV/I0B;EUgJ1B,qBVhJ0B;EUiJ1B,gBAAgB;ATu9BxB;;ASlkCA;EA6GQ,sBCvFQ;EDwFR,cVpJ0B;AC6mClC;;ASvkCA;EAiHU,yBCjEuB;AV2hCjC;;AS3kCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACynClC;;ASnlCA;EA0HU,0DAA4E;AT69BtF;;ASvlCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;ACmoClC;;AS7lCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC/GM;AV6kChB;;ASnmCA;EAwIY,gEAA8D;AT+9B1E;;ASvmCA;EA8Ic,0DAA4E;AT69B1F;;AS3mCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACypClC;;ASnnCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVmmChB;;ASznCA;EA6JU,sBCvIM;EDwIN,cVpMwB;ACoqClC;;AS9nCA;EAqKc,gEAA8D;AT69B5E;;ASloCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVonChB;;AS1oCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV0mCrE;;AS/oCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVgnCrE;;ASrpCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVsnCrE;;AS3pCA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WChEU;AV2oChB;;ASjqCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVipChB;;ASvqCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVspChB;;AS5qCA;EAiGU,kDVxIwB;ACutClC;;AShrCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVgqChB;;AStrCA;;EAyGQ,yBVhJ0B;EUiJ1B,qBVjJ0B;EUkJ1B,gBAAgB;ATklCxB;;AS7rCA;EA6GQ,sBCvFQ;EDwFR,cVrJ0B;ACyuClC;;ASlsCA;EAiHU,yBCjEuB;AVspCjC;;AStsCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACqvClC;;AS9sCA;EA0HU,0DAA4E;ATwlCtF;;ASltCA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC+vClC;;ASxtCA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC/GM;AVwsChB;;AS9tCA;EAwIY,gEAA8D;AT0lC1E;;ASluCA;EA8Ic,0DAA4E;ATwlC1F;;AStuCA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACqxClC;;AS9uCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV8tChB;;ASpvCA;EA6JU,sBCvIM;EDwIN,cVrMwB;ACgyClC;;ASzvCA;EAqKc,gEAA8D;ATwlC5E;;AS7vCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+uChB;;ASrwCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVquCrE;;AS1wCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV2uCrE;;AShxCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVivCrE;;AStxCA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,WChEU;AVswChB;;AS5xCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV4wChB;;ASlyCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVixChB;;ASvyCA;EAiGU,kDV1IwB;ACo1ClC;;AS3yCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV2xChB;;ASjzCA;;EAyGQ,yBVlJ0B;EUmJ1B,qBVnJ0B;EUoJ1B,gBAAgB;AT6sCxB;;ASxzCA;EA6GQ,sBCvFQ;EDwFR,cVvJ0B;ACs2ClC;;AS7zCA;EAiHU,yBCjEuB;AVixCjC;;ASj0CA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;ACk3ClC;;ASz0CA;EA0HU,0DAA4E;ATmtCtF;;AS70CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;AC43ClC;;ASn1CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,WC/GM;AVm0ChB;;ASz1CA;EAwIY,gEAA8D;ATqtC1E;;AS71CA;EA8Ic,0DAA4E;ATmtC1F;;ASj2CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;ACk5ClC;;ASz2CA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVy1ChB;;AS/2CA;EA6JU,sBCvIM;EDwIN,cVvMwB;AC65ClC;;ASp3CA;EAqKc,gEAA8D;ATmtC5E;;ASx3CA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV02ChB;;ASh4CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVg2CrE;;ASr4CA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVs2CrE;;AS34CA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV42CrE;;ASj5CA;EAoFM,yBV9H4B;EU+H5B,yBAAyB;EACzB,yBClEe;AVm4CrB;;ASv5CA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVy4CrB;;AS75CA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV84CrB;;ASl6CA;EAiGU,mDV3IwB;ACg9ClC;;ASt6CA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVw5CrB;;AS56CA;;EAyGQ,yBVnJ0B;EUoJ1B,qBVpJ0B;EUqJ1B,gBAAgB;ATw0CxB;;ASn7CA;EA6GQ,oCCzFa;ED0Fb,cVxJ0B;ACk+ClC;;ASx7CA;EAiHU,oCCjEuB;AV44CjC;;AS57CA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,cVjKwB;AC8+ClC;;ASp8CA;EA0HU,sFAA4E;AT80CtF;;ASx8CA;EA4HQ,6BAA6B;EAC7B,qBVvK0B;EUwK1B,cVxK0B;ACw/ClC;;AS98CA;EAmIU,yBV7KwB;EU8KxB,qBV9KwB;EU+KxB,yBCjHW;AVg8CrB;;ASp9CA;EAwIY,gEAA8D;ATg1C1E;;ASx9CA;EA8Ic,sFAA4E;AT80C1F;;AS59CA;;EAiJU,6BAA6B;EAC7B,qBV5LwB;EU6LxB,gBAAgB;EAChB,cV9LwB;AC8gDlC;;ASp+CA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVs9CrB;;AS1+CA;EA6JU,oCCzIW;ED0IX,cVxMwB;ACyhDlC;;AS/+CA;EAqKc,gEAA8D;AT80C5E;;ASn/CA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVu+CrB;;AS3/CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV29CrE;;AShgDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVi+CrE;;AStgDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVu+CrE;;AS5gDA;EAoFM,yBVxH2B;EUyH3B,yBAAyB;EACzB,WChEU;AV4/ChB;;ASlhDA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVkgDhB;;ASxhDA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVugDhB;;AS7hDA;EAiGU,kDVrIuB;ACqkDjC;;ASjiDA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVihDhB;;ASviDA;;EAyGQ,yBV7IyB;EU8IzB,qBV9IyB;EU+IzB,gBAAgB;ATm8CxB;;AS9iDA;EA6GQ,sBCvFQ;EDwFR,cVlJyB;ACulDjC;;ASnjDA;EAiHU,yBCjEuB;AVugDjC;;ASvjDA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV3JuB;ACmmDjC;;AS/jDA;EA0HU,0DAA4E;ATy8CtF;;ASnkDA;EA4HQ,6BAA6B;EAC7B,qBVjKyB;EUkKzB,cVlKyB;AC6mDjC;;ASzkDA;EAmIU,yBVvKuB;EUwKvB,qBVxKuB;EUyKvB,WC/GM;AVyjDhB;;AS/kDA;EAwIY,gEAA8D;AT28C1E;;ASnlDA;EA8Ic,0DAA4E;ATy8C1F;;ASvlDA;;EAiJU,6BAA6B;EAC7B,qBVtLuB;EUuLvB,gBAAgB;EAChB,cVxLuB;ACmoDjC;;AS/lDA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV+kDhB;;ASrmDA;EA6JU,sBCvIM;EDwIN,cVlMuB;AC8oDjC;;AS1mDA;EAqKc,gEAA8D;ATy8C5E;;AS9mDA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVgmDhB;;AStnDA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVslDrE;;AS3nDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV4lDrE;;ASjoDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVkmDrE;;ASvoDA;EARE,kBVdc;ACiqDhB;;ASrpDE;EACE,kBVkBc;ACsoDlB;;AS/oDA;EANE,eVjBW;AC0qDb;;ASnpDA;EAJE,kBVpBc;AC+qDhB;;ASvpDA;EAFE,iBVvBa;ACorDf;;AS3pDA;;EAyMI,uBVtP2B;EUuP3B,qBV5P0B;EU6P1B,gBAjOyB;EAkOzB,YAjOyB;ATwrD7B;;ASnqDA;EA8MI,aAAa;EACb,WAAW;ATy9Cf;;ASxqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT29CxB;;AS7qDA;ERnDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQmQhC,6BAA6B;AT89CnC;;ASprDA;EAwNI,4BVvQ0B;EUwQ1B,qBV3Q0B;EU4Q1B,cV9Q0B;EU+Q1B,gBAAgB;EAChB,oBAAoB;ATg+CxB;;AS5rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATk+C/D;;ASh+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATm+C7B;;ASv+CA;EAMI,qBAAqB;ATq+CzB;;AS3+CA;ER5GI,mBQoHwC;ATu+C5C;;AS/+CA;EAUI,sBAAsB;ATy+C1B;;ASn/CA;EAYI,mBAAmB;AT2+CvB;;ASv/CA;EA1OE,kBVdc;ACmvDhB;;ASvuDE;EACE,kBVkBc;ACwtDlB;;AS//CA;EAtOE,kBVpBc;AC6vDhB;;ASngDA;EApOE,iBVvBa;ACkwDf;;ASvgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATi/CjC;;AS5gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ER1I9B,iBQ2IwC;ATm/C5C;;ASlhDA;ER5GI,cQ6IqC;ATq/CzC;;ASthDA;EAoCQ,UAAU;ATs/ClB;;AS1hDA;EA0CQ,UAAU;ATo/ClB;;AS9hDA;EA4CU,UAAU;ATs/CpB;;ASliDA;EA8CQ,YAAY;EACZ,cAAc;ATw/CtB;;ASviDA;EAiDI,uBAAuB;AT0/C3B;;AS3iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT2/C7B;;AShjDA;EAuDI,yBAAyB;AT6/C7B;;ASpjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT8/C7B;;ACzvDE;EQiQM;IACE,oBAlTyD;ET8yDjE;ES1/CM;;IAEE,qBAtT0F;ETkzDlG;ESjgDM;IACE,kBV1TM;EC6zDd;ESpgDM;IACE,eV3TG;ECi0DX;AACF;;ACrwDE;EQ6PM;IACE,qBAlTyL;ET8zDjM;ES1gDM;;IAEE,kBV9TM;EC00Dd;ESjhDM;IACE,eV3TG;EC80DX;ESphDM;IACE,kBV5TM;ECk1Dd;AACF;;AWl3DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WAAW;AXq3Db;;AWz3DA;EAMI,0BAA0B;EAC1B,kBZyCM;EYxCN,mBZwCM;EYvCN,WAAW;AXu3Df;;AC/wDE;EUjHF;IAWI,gBAAuC;EX03DzC;AACF;;AC3wDI;EU3HJ;IAcM,iBAAqE;EX63DzE;AACF;;AClwDI;EU1IJ;IAiBM,iBAAiE;EXg4DrE;AACF;;AClxDI;EUhIJ;IAoBM,iBAAqE;EXm4DzE;AACF;;ACzwDI;EU/IJ;IAuBM,iBAAiE;EXs4DrE;AACF;;AY34DA;EAII,kBAAkB;AZ24DtB;;AY/4DA;;;;;;;EAcM,kBAhC2B;AZ26DjC;;AYz5DA;;;;;;EAqBI,cbvC0B;EawC1B,gBbHiB;EaIjB,kBA3C+B;AZw7DnC;;AYp6DA;EAyBI,cAAc;EACd,oBAAoB;AZ+4DxB;;AYz6DA;EA4BM,eAAe;AZi5DrB;;AY76DA;EA8BI,iBAAiB;EACjB,uBAAuB;AZm5D3B;;AYl7DA;EAiCM,oBAAoB;AZq5D1B;;AYt7DA;EAmCI,gBAAgB;EAChB,uBAAuB;AZu5D3B;;AY37DA;EAsCM,oBAAoB;AZy5D1B;;AY/7DA;EAwCI,iBAAiB;EACjB,oBAAoB;AZ25DxB;;AYp8DA;EA2CI,kBAAkB;EAClB,uBAAuB;AZ65D3B;;AYz8DA;EA8CI,cAAc;EACd,kBAAkB;AZ+5DtB;;AY98DA;EAiDI,4Bb5D0B;EEqK1B,+BFxK0B;EaiE1B,qBAjEqC;AZk+DzC;;AYp9DA;EAqDI,4BAA4B;EXqG5B,iBWpGmC;EACnC,eAAe;AZm6DnB;;AY19DA;EAyDM,wBAAwB;AZq6D9B;;AY99DA;EA2DQ,4BAA4B;AZu6DpC;;AYl+DA;EA6DQ,4BAA4B;AZy6DpC;;AYt+DA;EA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kBI,uBAAuB;AfyyE3B;;Ae3zEA;Ed+KI,Yc3J4B;EAC5B,kBAAkB;EAClB,WAAW;Af2yEf;;Aej0EA;;;EA0BI,mBAAmB;Af6yEvB;;Aev0EA;EAgCM,uBhB5ByB;EgB6BzB,chB1CuB;ACq1E7B;;Ae50EA;EAgCM,yBhBzCuB;EgB0CvB,YhB7ByB;AC60E/B;;Aej1EA;EAgCM,4BhB9BwB;EgB+BxB,yBLoCe;AVixErB;;Aet1EA;EAgCM,yBhBrCwB;EgBsCxB,WLsCU;AVoxEhB;;Ae31EA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyxEhB;;Aeh2EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV+wErE;;Aer2EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmyEhB;;Ae12EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVyxErE;;Ae/2EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6yEhB;;Aep3EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVmyErE;;Aez3EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuzEhB;;Ae93EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV6yErE;;Aen4EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVm0ErB;;Aex4EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVuzErE;;Ae74EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV20EhB;;Ael5EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVi0ErE;;AgBx5EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjByDqB;EiBxDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB05Eb;;AgBp6EA;EAYI,yBjBX2B;ACu6E/B;;AgBx6EA;EAcI,yBjBjB0B;AC+6E9B;;AgB56EA;EAgBI,yBjBnB0B;ACm7E9B;;AgBh7EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk6EhB;;AgBr7EA;EAyBQ,uBjBpBuB;ACo7E/B;;AgBz7EA;EA2BQ,uBjBtBuB;ACw7E/B;;AgB77EA;EA6BQ,uBjBxBuB;AC47E/B;;AgBj8EA;EA+BQ,mEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjBjCqB;ACi9E7B;;AgBz8EA;EA2BQ,yBjBnCqB;ACq9E7B;;AgB78EA;EA6BQ,yBjBrCqB;ACy9E7B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,4BjBtBsB;ACs9E9B;;AgBz9EA;EA2BQ,4BjBxBsB;AC09E9B;;AgB79EA;EA6BQ,4BjB1BsB;AC89E9B;;AgBj+EA;EA+BQ,wEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjB7BsB;AC6+E9B;;AgBz+EA;EA2BQ,yBjB/BsB;ACi/E9B;;AgB7+EA;EA6BQ,yBjBjCsB;ACq/E9B;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBf0B;AC++ElC;;AgBz/EA;EA2BQ,yBjBjB0B;ACm/ElC;;AgB7/EA;EA6BQ,yBjBnB0B;ACu/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBb0B;AC6/ElC;;AgBzgFA;EA2BQ,yBjBf0B;ACigFlC;;AgB7gFA;EA6BQ,yBjBjB0B;ACqgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBd0B;AC8gFlC;;AgBzhFA;EA2BQ,yBjBhB0B;ACkhFlC;;AgB7hFA;EA6BQ,yBjBlB0B;ACshFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBhB0B;ACgiFlC;;AgBziFA;EA2BQ,yBjBlB0B;ACoiFlC;;AgB7iFA;EA6BQ,yBjBpB0B;ACwiFlC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAyBQ,yBjBjB0B;ACijFlC;;AgBzjFA;EA2BQ,yBjBnB0B;ACqjFlC;;AgB7jFA;EA6BQ,yBjBrB0B;ACyjFlC;;AgBjkFA;EA+BQ,qEAA2F;AhBsiFnG;;AgBrkFA;EAyBQ,yBjBXyB;AC2jFjC;;AgBzkFA;EA2BQ,yBjBbyB;AC+jFjC;;AgB7kFA;EA6BQ,yBjBfyB;ACmkFjC;;AgBjlFA;EA+BQ,qEAA2F;AhBsjFnG;;AgBrlFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBujF9B;;AgBjmFA;EA4CM,6BAA6B;AhByjFnC;;AgBrmFA;EA8CM,6BAA6B;AhB2jFnC;;AgBzmFA;EAgDM,oBAAoB;AhB6jF1B;;AgB7mFA;EAoDI,ejBxBY;ACqlFhB;;AgBjnFA;EAsDI,ejB5BY;AC2lFhB;;AgBrnFA;EAwDI,cjB/BW;ACgmFf;;AgB/jFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AgBxkFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AiB9mFA;EAEE,uBlBjB6B;EkBkB7B,clB3B4B;AC2oF9B;;AiBnnFA;;EAMI,yBlB1B0B;EkB2B1B,qBA/B6B;EAgC7B,qBA/B6B;EAgC7B,mBAAmB;AjBknFvB;;AiB3nFA;;EAeQ,uBlB9BuB;EkB+BvB,mBlB/BuB;EkBgCvB,clB7CqB;AC8pF7B;;AiBloFA;;EAeQ,yBlB3CqB;EkB4CrB,qBlB5CqB;EkB6CrB,YlBhCuB;ACwpF/B;;AiBzoFA;;EAeQ,4BlBhCsB;EkBiCtB,wBlBjCsB;EkBkCtB,yBPiCa;AV8lFrB;;AiBhpFA;;EAeQ,yBlBvCsB;EkBwCtB,qBlBxCsB;EkByCtB,WPmCQ;AVmmFhB;;AiBvpFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPmCQ;AV0mFhB;;AiB9pFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPmCQ;AVinFhB;;AiBrqFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPmCQ;AVwnFhB;;AiB5qFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,WPmCQ;AV+nFhB;;AiBnrFA;;EAeQ,yBlB3B0B;EkB4B1B,qBlB5B0B;EkB6B1B,yBPiCa;AVwoFrB;;AiB1rFA;;EAeQ,yBlBrByB;EkBsBzB,qBlBtByB;EkBuBzB,WPmCQ;AV6oFhB;;AiBjsFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBkrFf;;AiBvsFA;;EAuBM,yBlBjC4B;EkBkC5B,WP4BU;AVypFhB;;AiB7sFA;;;;EA2BQ,mBAAmB;AjByrF3B;;AiBptFA;;EA6BM,sBAAsB;AjB4rF5B;;AiBztFA;EA+BI,clBvD0B;ACqvF9B;;AiB7tFA;EAiCM,gBAtDsB;AjBsvF5B;;AiBjuFA;EAoCM,yBlB9C4B;EkB+C5B,WPeU;AVkrFhB;;AiBtuFA;;EAwCQ,mBAAmB;AjBmsF3B;;AiB3uFA;;EA2CQ,kBPSQ;EORR,mBAAmB;AjBqsF3B;;AiBjvFA;EA8CI,6BA5DqC;AjBmwFzC;;AiBrvFA;;EAiDM,qBApEgC;EAqEhC,clB1EwB;ACmxF9B;;AiB3vFA;EAoDI,6BAhEqC;AjB2wFzC;;AiB/vFA;;EAuDM,qBAxEgC;EAyEhC,clBhFwB;AC6xF9B;;AiBrwFA;EA0DI,6BAvEqC;AjBsxFzC;;AiBzwFA;;EA+DU,sBAAsB;AjB+sFhC;;AiB9wFA;;EAoEM,iBAAiB;AjB+sFvB;;AiBnxFA;;EAyEU,wBAAwB;AjB+sFlC;;AiBxxFA;EA2EI,WAAW;AjBitFf;;AiB5xFA;EAgFU,yBlBhGoB;ACgzF9B;;AiBhyFA;EAqFY,yBlBrGkB;ACozF9B;;AiBpyFA;EAuFc,4BlBxGgB;ACyzF9B;;AiBxyFA;;EA2FM,qBAAqB;AjBktF3B;;AiB7yFA;EAgGU,yBlBhHoB;ACi0F9B;;AiB/sFA;EhB7DE,iCAAiC;EgBgEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBitFjB;;AkB70FA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBg1F7B;;AkBp1FA;EAMI,qBAAqB;AlBk1FzB;;AkBx1FA;EjByKI,mBiBjKwC;AlBo1F5C;;AkB51FA;EAUI,sBAAsB;AlBs1F1B;;AkBh2FA;EAYI,mBAAmB;AlBw1FvB;;AkBp2FA;EAgBM,enBYO;AC40Fb;;AkBx2FA;EAmBM,kBnBQU;ACi1FhB;;AkB52FA;EAqBI,uBAAuB;AlB21F3B;;AkBh3FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB61F1B;;AkBr3FA;EA0BI,yBAAyB;AlB+1F7B;;AkBz3FA;EA6BQ,mBAAmB;AlBg2F3B;;AkB73FA;EA+BQ,eAAe;AlBk2FvB;;AkBj4FA;EjByKI,ciBvImC;AlBm2FvC;;AkBr4FA;EjByKI,eiBrIqC;EAK/B,0BAA0B;EAC1B,6BAA6B;AlBi2FvC;;AkB34FA;EAgDU,yBAAyB;EACzB,4BAA4B;AlB+1FtC;;AkB71FA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBOU;EmBNV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg2FrB;;AkB52FA;EjBsHI,qBiBxGuC;EjBwGvC,sBiBvGyC;AlBk2F7C;;AkBj3FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg7F7B;;AkBt3FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw6F/B;;AkB33FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV42FrB;;AkBh4FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+2FhB;;AkBr4FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo3FhB;;AkB14FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV02FrE;;AkB/4FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV83FhB;;AkBp5FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVo3FrE;;AkBz5FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw4FhB;;AkB95FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV83FrE;;AkBn6FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk5FhB;;AkBx6FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVw4FrE;;AkB76FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV85FrB;;AkBl7FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVk5FrE;;AkBv7FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs6FhB;;AkB57FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV45FrE;;AkBj8FA;EAgCI,kBnBtDY;AC29FhB;;AkBr8FA;EAkCI,enBzDS;ACg+Fb;;AkBz8FA;EAoCI,kBnB5DY;ACq+FhB;;AkB78FA;EjBsHI,sBiB/E0C;EjB+E1C,qBiB9E0C;AlB06F9C;;AkBl9FA;EjBsHI,sBiB5E0C;EjB4E1C,qBiB3E0C;AlB46F9C;;AkBv9FA;EjBsHI,sBiBzE0C;EjByE1C,qBiBxE0C;AlB86F9C;;AkB59FA;EjBsHI,iBiB7KmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+6Fd;;AkBn+FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg7FrC;;AkB9+FA;EAgEM,WAAW;EACX,UAAU;AlBk7FhB;;AkBn/FA;EAmEM,WAAW;EACX,UAAU;AlBo7FhB;;AkBx/FA;EAuEM,yBAAmD;AlBq7FzD;;AkB5/FA;EAyEM,yBAAoD;AlBu7F1D;;AkBhgGA;EA2EI,qBnB/DmB;ACw/FvB;;AkBv7FA;EAEI,0BAA0B;AlBy7F9B;;AmB/iGA;;EAGE,sBAAsB;AnBijGxB;;AmBpjGA;;;;EAMI,oBAAoB;AnBqjGxB;;AmB3jGA;;EAQI,iBApBmB;AnB4kGvB;;AmBhkGA;;EAUI,iBArBmB;AnBglGvB;;AmBrkGA;;EAYI,sBAAsB;AnB8jG1B;;AmB5jGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgmGzB;;AmBnkGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmmG7B;;AmBxkGA;EAWI,oBA3B+B;AnB4lGnC;;AmB5kGA;EAgBM,epBnBO;ACmlGb;;AmBhlGA;EAgBM,iBpBlBS;ACslGf;;AmBplGA;EAgBM,epBjBO;ACylGb;;AmBxlGA;EAgBM,iBpBhBS;AC4lGf;;AmB5lGA;EAgBM,kBpBfU;AC+lGhB;;AmBhmGA;EAgBM,epBdO;ACkmGb;;AmBpmGA;EAgBM,kBpBbU;ACqmGhB;;AmBtlGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkoG3B;;AmB7lGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4mGrB;;AmBlmGA;EAWI,oBA7C+B;AnBwoGnC;;AmBtmGA;EAgBM,epBrCO;AC+nGb;;AmB1mGA;EAgBM,iBpBpCS;ACkoGf;;AmB9mGA;EAgBM,epBnCO;ACqoGb;;AmBlnGA;EAgBM,iBpBlCS;ACwoGf;;AmBtnGA;EAgBM,kBpBjCU;AC2oGhB;;AmB1nGA;EAgBM,epBhCO;AC8oGb;;AmB9nGA;EAgBM,kBpB/BU;ACipGhB;;AoB/qGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkrG3B;;AoB7qGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBmDqB;EqBlDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgrGrB;;AqB9sGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBkCU;EuBjCV,cvB/B4B;ACgtG9B;;AC9oGI;EqBjCA,4BvBjC0B;ACotG9B;;AClpGI;EqBjCA,4BvBjC0B;ACwtG9B;;ACtpGI;EqBjCA,4BvBjC0B;AC4tG9B;;AC1pGI;EqBjCA,4BvBjC0B;ACguG9B;;AsB9rGE;EAEE,qBvBjC0B;ACiuG9B;;AsB/rGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACytGlC;;AsB9rGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACkvG9B;;AClrGI;;;;;EqBhBE,+BvBhDwB;AC0vG9B;;AC1rGI;;;;;EqBhBE,+BvBhDwB;ACkwG9B;;AClsGI;;;;;EqBhBE,+BvBhDwB;AC0wG9B;;AC1sGI;;;;;EqBhBE,+BvBhDwB;ACkxG9B;;AuBpxGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsxGb;;AuBrxGE;EACE,gBAAgB;AvBwxGpB;;AuBpxGI;EACE,mBxBFyB;ACyxG/B;;AuBxxGK;EAMG,mDxBPuB;AC6xG/B;;AuB5xGI;EACE,qBxBfuB;AC8yG7B;;AuBhyGK;EAMG,gDxBpBqB;ACkzG7B;;AuBpyGI;EACE,wBxBJwB;AC2yG9B;;AuBxyGK;EAMG,mDxBTsB;AC+yG9B;;AuB5yGI;EACE,qBxBXwB;AC0zG9B;;AuBhzGK;EAMG,gDxBhBsB;AC8zG9B;;AuBpzGI;EACE,qBxBG4B;ACozGlC;;AuBxzGK;EAMG,iDxBF0B;ACwzGlC;;AuB5zGI;EACE,qBxBK4B;AC0zGlC;;AuBh0GK;EAMG,iDxBA0B;AC8zGlC;;AuBp0GI;EACE,qBxBI4B;ACm0GlC;;AuBx0GK;EAMG,kDxBD0B;ACu0GlC;;AuB50GI;EACE,qBxBE4B;AC60GlC;;AuBh1GK;EAMG,kDxBH0B;ACi1GlC;;AuBp1GI;EACE,qBxBC4B;ACs1GlC;;AuBx1GK;EAMG,mDxBJ0B;AC01GlC;;AuB51GI;EACE,qBxBO2B;ACw1GjC;;AuBh2GK;EAMG,kDxBEyB;AC41GjC;;AuB51GE;EzBmBA,kBC0BgB;EDzBhB,kBCNc;ACm1GhB;;AuB/1GE;EzBoBA,kBCVc;ACy1GhB;;AuBj2GE;EzBoBA,iBCba;AC81Gf;;AuBl2GE;EACE,cAAc;EACd,WAAW;AvBq2Gf;;AuBp2GE;EACE,eAAe;EACf,WAAW;AvBu2Gf;;AuBr2GA;EAGI,qBxB+BmB;EwB9BnB,gDAA4D;EAC5D,iDAA6D;AvBs2GjE;;AuB32GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw2GpB;;AuBt2GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw2GlB;;AuB92GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo6GzB;;AuBn3GA;EAWI,eAAe;AvB42GnB;;AuBv3GA;EAcI,YAAY;AvB62GhB;;AwB96GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi7GpB;;AwBh7GE;EACE,eAAe;AxBm7GnB;;AwBl7GE;EACE,czBF0B;ACu7G9B;;AwBp7GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy7GvB;;AwBp7GA;EvBgKI,mBuB7JqC;AxBq7GzC;;AyBx8GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB28GrB;;AyB/8GA;EAMI,a3BDkB;AE88GtB;;AyBn9GA;EAUM,qB1BU4B;EEoK9B,awB7K+B;EAC7B,UAAU;AzB68GhB;;AyBz9GA;EAeM,qB1BuDiB;EE0GnB,kBwBhKsC;AzB88G1C;;AyB99GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+8GjB;;AyBt+GA;EAyBM,aAAa;AzBi9GnB;;AyB1+GA;;EA4BM,wB1BjBwB;ACo+G9B;;AyB/+GA;ExBgLI,mBwBlJwC;AzBq9G5C;;AyBn/GA;EAgCM,YAAY;EACZ,UAAU;AzBu9GhB;;AyBx/GA;EAmCQ,kBAAkB;AzBy9G1B;;AyB5/GA;EAuCM,qB1BnCwB;AC4/G9B;;AyBhgHA;EA6CQ,mB1BhCuB;ACu/G/B;;AyBpgHA;EA+CQ,mB1BlCuB;AC2/G/B;;AyBxgHA;EAkDU,qBfwDuB;AVk6GjC;;AyB5gHA;EAuDU,mD1B1CqB;ACmgH/B;;AyBhhHA;EA6CQ,qB1B7CqB;ACohH7B;;AyBphHA;EA+CQ,qB1B/CqB;ACwhH7B;;AyBxhHA;EAkDU,mBfwDuB;AVk7GjC;;AyB5hHA;EAuDU,gD1BvDmB;ACgiH7B;;AyBhiHA;EA6CQ,wB1BlCsB;ACyhH9B;;AyBpiHA;EA+CQ,wB1BpCsB;AC6hH9B;;AyBxiHA;EAkDU,qBfwDuB;AVk8GjC;;AyB5iHA;EAuDU,mD1B5CoB;ACqiH9B;;AyBhjHA;EA6CQ,qB1BzCsB;ACgjH9B;;AyBpjHA;EA+CQ,qB1B3CsB;ACojH9B;;AyBxjHA;EAkDU,qBfwDuB;AVk9GjC;;AyB5jHA;EAuDU,gD1BnDoB;AC4jH9B;;AyBhkHA;EA6CQ,qB1B3B0B;ACkjHlC;;AyBpkHA;EA+CQ,qB1B7B0B;ACsjHlC;;AyBxkHA;EAkDU,qBfwDuB;AVk+GjC;;AyB5kHA;EAuDU,iD1BrCwB;AC8jHlC;;AyBhlHA;EA6CQ,qB1BzB0B;ACgkHlC;;AyBplHA;EA+CQ,qB1B3B0B;ACokHlC;;AyBxlHA;EAkDU,qBfwDuB;AVk/GjC;;AyB5lHA;EAuDU,iD1BnCwB;AC4kHlC;;AyBhmHA;EA6CQ,qB1B1B0B;ACilHlC;;AyBpmHA;EA+CQ,qB1B5B0B;ACqlHlC;;AyBxmHA;EAkDU,qBfwDuB;AVkgHjC;;AyB5mHA;EAuDU,kD1BpCwB;AC6lHlC;;AyBhnHA;EA6CQ,qB1B5B0B;ACmmHlC;;AyBpnHA;EA+CQ,qB1B9B0B;ACumHlC;;AyBxnHA;EAkDU,qBfwDuB;AVkhHjC;;AyB5nHA;EAuDU,kD1BtCwB;AC+mHlC;;AyBhoHA;EA6CQ,qB1B7B0B;AConHlC;;AyBpoHA;EA+CQ,qB1B/B0B;ACwnHlC;;AyBxoHA;EAkDU,qBfwDuB;AVkiHjC;;AyB5oHA;EAuDU,mD1BvCwB;ACgoHlC;;AyBhpHA;EA6CQ,qB1BvByB;AC8nHjC;;AyBppHA;EA+CQ,qB1BzByB;ACkoHjC;;AyBxpHA;EAkDU,qBfwDuB;AVkjHjC;;AyB5pHA;EAuDU,kD1BjCuB;AC0oHjC;;AyBhqHA;E3ByCE,kBC0BgB;EDzBhB,kBCNc;ACioHhB;;AyBrqHA;E3B4CE,kBCVc;ACuoHhB;;AyBzqHA;E3B8CE,iBCba;AC4oHf;;AyB7qHA;EAkEM,gCAA8C;EAC9C,YAAY;AzB+mHlB;;AyBlrHA;EAqEI,WAAW;AzBinHf;;AyBtrHA;EAuEM,WAAW;AzBmnHjB;;AyB1rHA;EA2EM,aAAa;EACb,kBAAkB;ExB4GpB,awB3G+B;EAC7B,YAAY;EACZ,eAAe;AzBmnHrB;;AyBlsHA;EAiFM,kB1B7CU;ACkqHhB;;AyBtsHA;EAmFM,kB1BjDU;ACwqHhB;;AyB1sHA;EAqFM,iB1BpDS;AC6qHf;;A0BjsHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BmsHpB;;A0BxsHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC2tH7B;;A0B9sHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,c3BjCmB;ACiuH7B;;A0BptHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACuuH7B;;A0B1tHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,c3B7CmB;AC6uH7B;;A0BhuHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACsuH/B;;A0BtuHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,Y3BpBqB;AC4uH/B;;A0B5uHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACkvH/B;;A0BlvHA;EA8BU,uBhB+DuB;EgB9DvB,yBAAyB;EACzB,Y3BhCqB;ACwvH/B;;A0BxvHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV6rHrB;;A0B9vHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVmsHrB;;A0BpwHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVysHrB;;A0B1wHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+sHrB;;A0BhxHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVmtHhB;;A0BtxHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVytHhB;;A0B5xHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV+tHhB;;A0BlyHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVquHhB;;A0BxyHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV2uHhB;;A0B9yHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVivHhB;;A0BpzHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVuvHhB;;A0B1zHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6vHhB;;A0Bh0HA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVmwHhB;;A0Bt0HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVywHhB;;A0B50HA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV+wHhB;;A0Bl1HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVqxHhB;;A0Bx1HA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV2xHhB;;A0B91HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AViyHhB;;A0Bp2HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVuyHhB;;A0B12HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6yHhB;;A0Bh3HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVmzHhB;;A0Bt3HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVyzHhB;;A0B53HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV+zHhB;;A0Bl4HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq0HhB;;A0Bx4HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV60HrB;;A0B94HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVm1HrB;;A0Bp5HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVy1HrB;;A0B15HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+1HrB;;A0Bh6HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVm2HhB;;A0Bt6HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVy2HhB;;A0B56HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV+2HhB;;A0Bl7HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq3HhB;;A0Bx7HA;EAmCI,kB3BZY;ACq6HhB;;A0B57HA;EAqCI,e3BfS;AC06Hb;;A0Bh8HA;EAuCI,kB3BlBY;AC+6HhB;;A0Bp8HA;EA0CQ,eAAe;A1B85HvB;;A0Bx8HA;EA4CI,iB3BxBW;ACw7Hf;;A0B58HA;EA+CQ,eAAe;A1Bi6HvB;;A0Bh9HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bi6HhC;;A0Br9HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bm6H/B;;A0B19HA;EA0DQ,kB3BHI;ACu6HZ;;A0B99HA;EA4DQ,aAAa;A1Bs6HrB;;A0Bl+HA;EA+DM,sBAAsB;A1Bu6H5B;;A0Bt+HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1By6HtB;;A0B5+HA;EAqEM,uBAAuB;A1B26H7B;;A0Bh/HA;EAuEM,aAAa;EACb,YAAY;A1B66HlB;;A0Br/HA;EA0EQ,eAAe;A1B+6HvB;;A0Bz/HA;EA6EQ,eAAe;A1Bg7HvB;;A0B7/HA;EAgFQ,eAAe;A1Bi7HvB;;A0BjgIA;EAmFQ,eAAe;A1Bk7HvB;;A0BrgIA;EAsFQ,0BAA4C;A1Bm7HpD;;A0BzgIA;EAwFQ,0B3BjCI;E2BkCJ,uBAAuB;A1Bq7H/B;;A0B9gIA;EA2FI,uBAAuB;A1Bu7H3B;;A0BlhIA;EA8FM,WAAW;A1Bw7HjB;;A0BthIA;EAgGM,YAAY;EACZ,eAAe;A1B07HrB;;A0B3hIA;EAmGI,yBAAyB;A1B47H7B;;A0B/hIA;EAqGM,0BAA4C;A1B87HlD;;A0BniIA;EAuGM,0B3BhDM;E2BiDN,2BAA2B;EAC3B,SAAS;A1Bg8Hf;;A0B97HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bi8HpB;;A0Bv8HA;EASM,yBhBvB2B;EgBwB3B,c3B9HwB;ACgkI9B;;A0B58HA;EAYM,qBhB1B2B;AV89HjC;;A0Bh9HA;EAeM,yBhB7B2B;EgB8B3B,c3BpIwB;ACykI9B;;A0Br9HA;EAkBM,qBhBhC2B;AVu+HjC;;A0Br8HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bw8Hb;;A0Bt8HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BrFU;E2BsFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bw8HrB;;A0Bt8HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACqmI9B;;A0Bv8HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1B08HzB;;A0Bx8HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBDrB,kByBEmC;EACrC,UAAU;A1B28HZ;;A0Bj9HA;EAQI,eAAe;A1B68HnB;;A2B7nIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC+lIjB;;A2BpoIA;EAMI,oBAAoB;A3BkoIxB;;A2BxoIA;EASI,kB5BsBY;AC6mIhB;;A2B5oIA;EAWI,kB5BkBY;ACmnIhB;;A2BhpIA;EAaI,iB5BeW;ACwnIf;;A2BroIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BwoIrB;;A2B3oIA;EAOM,Y5BdyB;ACspI/B;;A2B/oIA;EAOM,c5B3BuB;ACuqI7B;;A2BnpIA;EAOM,iB5BhBwB;ACgqI9B;;A2BvpIA;EAOM,c5BvBwB;AC2qI9B;;A2B3pIA;EAOM,c5BT4B;ACiqIlC;;A2B/pIA;EAOM,c5BP4B;ACmqIlC;;A2BnqIA;EAOM,c5BR4B;ACwqIlC;;A2BvqIA;EAOM,c5BV4B;AC8qIlC;;A2B3qIA;EAOM,c5BX4B;ACmrIlC;;A2B/qIA;EAOM,c5BL2B;ACirIjC;;A2BxqIA;EAEI,sBAAsB;A3B0qI1B;;A2B5qIA;EAKI,aAAa;EACb,2BAA2B;A3B2qI/B;;A2BjrIA;E1BiJI,iB0BxIwC;A3B4qI5C;;A2BrrIA;;;EAcU,gBAAgB;A3B6qI1B;;A2B3rIA;;;EAuBY,4BAA4B;EAC5B,yBAAyB;A3B0qIrC;;A2BlsIA;;;EAiCY,6BAA6B;EAC7B,0BAA0B;A3BuqItC;;A2BzsIA;;;;;EAyCY,UAAU;A3BwqItB;;A2BjtIA;;;;;;;;;EA8CY,UAAU;A3B+qItB;;A2B7tIA;;;;;;;;;EAgDc,UAAU;A3ByrIxB;;A2BzuIA;EAkDQ,YAAY;EACZ,cAAc;A3B2rItB;;A2B9uIA;EAqDM,uBAAuB;A3B6rI7B;;A2BlvIA;EAuDM,yBAAyB;A3B+rI/B;;A2BtvIA;EA0DQ,YAAY;EACZ,cAAc;A3BgsItB;;A2B3vIA;EA6DI,aAAa;EACb,2BAA2B;A3BksI/B;;A2BhwIA;EAgEM,cAAc;A3BosIpB;;A2BpwIA;EAkEQ,gBAAgB;E1B+EpB,oB0B9E2C;A3BssI/C;;A2BzwIA;EAqEQ,YAAY;EACZ,cAAc;A3BwsItB;;A2B9wIA;EAwEM,uBAAuB;A3B0sI7B;;A2BlxIA;EA0EM,yBAAyB;A3B4sI/B;;A2BtxIA;EA4EM,eAAe;A3B8sIrB;;A2B1xIA;EAgFU,sBAAsB;A3B8sIhC;;A2B9xIA;EAkFQ,uBAAuB;A3BgtI/B;;A2BlyIA;EAoFQ,gBAAgB;A3BktIxB;;AC7tIE;E0BzEF;IAuFM,aAAa;E3BotIjB;AACF;;A2BntIA;EAEI,kBAAkB;A3BqtItB;;AC3uIE;E0BoBF;IAII,qBAAqB;E3BwtIvB;AACF;;AC7uIE;E0BgBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BgDd,mB0B/CsC;IACtC,iBAAiB;E3B4tInB;E2BtuIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B6tIxB;E2B1uIF;IAeM,oBAAoB;E3B8tIxB;E2B7uIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B+tIxB;E2BjvIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3BguIxB;AACF;;A2B/tIA;EAEI,gBAAgB;A3BiuIpB;;AC1wIE;E0BuCF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BouIhB;E2B3uIF;IASM,gBAAgB;E3BquIpB;E2B9uIF;IAWM,cAAc;E3BsuIlB;E2BjvIF;IAaQ,YAAY;E3BuuIlB;E2BpvIF;I1BiCI,oB0BlB2C;E3BwuI7C;AACF;;A2BvuIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3B0uIrB;;A2B/uIA;;;EAaU,c5BxKoB;ACg5I9B;;A2BrvIA;;;EAeQ,kB5B3IQ;ACu3IhB;;A2B3vIA;;;EAiBQ,kB5B/IQ;AC+3IhB;;A2BjwIA;;;EAmBQ,iB5BlJO;ACs4If;;A2BvwIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BsvIhB;;A2BjxIA;;EA+BM,mB7B1LgB;AEi7ItB;;A2BtxIA;EAiCM,OAAO;A3ByvIb;;A2B1xIA;;EAqCM,oB7BhMgB;AE07ItB;;A2B/xIA;EAuCM,QAAQ;A3B4vId;;A2BnyIA;EA2CM,6BAA6B;E1BnB/B,a0BoB+B;EAC7B,YAAY;EACZ,UAAU;A3B4vIhB;;A2B1yIA;EAgDM,kB5B5KU;AC06IhB;;A2B9yIA;EAkDM,kB5BhLU;ACg7IhB;;A2BlzIA;EAoDM,iB5BnLS;ACq7If;;A4Bx9IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B+8IrB;;A6Bn9IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B+9I3C;;A6B39IA;EAYM,c9BjBwB;ACo+I9B;;A6B/9IA;EAcI,mBAAmB;EACnB,aAAa;A7Bq9IjB;;A6Bp+IA;E5BuKI,gB4BtJoC;A7Bu9IxC;;A6Bx+IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bw9I5B;;A6B9+IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7B09IvB;;A6Bn/IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B49I/B;;A6B3/IA;E5BuKI,kB4BrIuC;A7B69I3C;;A6B//IA;E5BuKI,mB4BnIuC;A7B+9I3C;;A6BngJA;;EAyCM,uBAAuB;A7B+9I7B;;A6BxgJA;;EA6CM,yBAAyB;A7Bg+I/B;;A6B7gJA;EAgDI,kB9BrBY;ACs/IhB;;A6BjhJA;EAkDI,kB9BzBY;AC4/IhB;;A6BrhJA;EAoDI,iB9B5BW;ACigJf;;A6BzhJA;EAwDM,iBAAiB;A7Bq+IvB;;A6B7hJA;EA2DM,iBAAiB;A7Bs+IvB;;A6BjiJA;EA8DM,iBAAiB;A7Bu+IvB;;A6BriJA;EAiEM,iBAAiB;A7Bw+IvB;;A8B9hJA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,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CnwJA;EACE,mBAAmB;EACnB,yBAAyB;AhCswJ3B;;ACvuJE;E+BjCF;IAKI,aAAa;EhCwwJf;AACF;;AiC50JA;EACE,uBAAuB;EACvB,aAAa;EACb,mBAAmB;AjC+0JrB;;AiCl1JA;EAKI,sBAV2B;AjC21J/B;;AiCt1JA;EAOI,8ClCR0B;EkCS1B,aAAa;EACb,oBAb2B;AjCg2J/B;;AiC51JA;;EAYM,qBAfgC;AjCo2JtC;;AiCj2JA;EAcM,mBAhBwB;AjCu2J9B;;AiCr2JA;EAgBQ,kBAlBsB;AjC22J9B;;AiCz2JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCs3JpB;;AiC/2JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjC03J5B;;AiCz1JA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC41JhB;;AiC11JA;EhCsII,iBgC9KgB;AjCs4JpB;;AiC31JA;EhCmII,kBgC9KgB;AjC04JpB;;AiC51JA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC+1JrB;;AC/yJE;EgCpDF;IAQI,gBAAgB;EjCg2JlB;AACF;;AkCv4JA;EACE,enCgBW;AC03Jb;;AkC34JA;EAII,kBnCcY;AC63JhB;;AkC/4JA;EAMI,kBnCUY;ACm4JhB;;AkCn5JA;EAQI,iBnCOW;ACw4Jf;;AkC74JA;EACE,iBArB0B;AlCq6J5B;;AkCj5JA;EAGI,kBnCoCc;EmCnCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC26JrC;;AkCx5JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACq7J9B;;AkC75JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV82JhB;;AkCl6JA;EjCoJI,+BFxK0B;EmCqCxB,cAnC0B;EjCsK5B,qBiCrKkC;AlCy7JtC;;AkCp5JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCu5J3B;;AkC35JA;EAMI,eAtCoB;AlC+7JxB;;AkC/5JA;EAQI,kBAxCoB;AlCm8JxB;;AmC97JA;EAEE,4BpCZ4B;EoCa5B,kBpC4CU;EoC3CV,epCUW;ACs7Jb;;AmCp8JA;EAMI,mBAAmB;AnCk8JvB;;AmCx8JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCo8J9B;;AmC78JA;EAYI,kBpCGY;ACk8JhB;;AmCj9JA;EAcI,kBpCDY;ACw8JhB;;AmCr9JA;EAgBI,iBpCJW;AC68Jf;;AmCz9JA;EAsCM,uBAH+C;AnC07JrD;;AmC79JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACu/J7B;;AmCl+JA;EA2CQ,mBpCnDuB;AC8+J/B;;AmCt+JA;EAsCM,yBAH+C;AnCu8JrD;;AmC1+JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACu/J/B;;AmC/+JA;EA2CQ,qBpChEqB;ACwgK7B;;AmCn/JA;EAsCM,yBAH+C;AnCo9JrD;;AmCv/JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVm8JrB;;AmC5/JA;EA2CQ,wBpCrDsB;AC0gK9B;;AmChgKA;EAsCM,yBAH+C;AnCi+JrD;;AmCpgKA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV88JhB;;AmCzgKA;EA2CQ,qBpC5DsB;AC8hK9B;;AmC7gKA;EAsCM,yBzB4B0C;AV+8JhD;;AmCjhKA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV29JhB;;AmCthKA;EA2CQ,qBpC9C0B;EoC+C1B,czB8B6D;AVi9JrE;;AmC3hKA;EAsCM,yBzB4B0C;AV69JhD;;AmC/hKA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVy+JhB;;AmCpiKA;EA2CQ,qBpC5C0B;EoC6C1B,czB8B6D;AV+9JrE;;AmCziKA;EAsCM,yBzB4B0C;AV2+JhD;;AmC7iKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVu/JhB;;AmCljKA;EA2CQ,qBpC7C0B;EoC8C1B,czB8B6D;AV6+JrE;;AmCvjKA;EAsCM,yBzB4B0C;AVy/JhD;;AmC3jKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVqgKhB;;AmChkKA;EA2CQ,qBpC/C0B;EoCgD1B,czB8B6D;AV2/JrE;;AmCrkKA;EAsCM,yBzB4B0C;AVugKhD;;AmCzkKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVqhKrB;;AmC9kKA;EA2CQ,qBpChD0B;EoCiD1B,czB8B6D;AVygKrE;;AmCnlKA;EAsCM,yBzB4B0C;AVqhKhD;;AmCvlKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AViiKhB;;AmC5lKA;EA2CQ,qBpC1CyB;EoC2CzB,czB8B6D;AVuhKrE;;AmCnjKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCsjKpB;;AmChkKA;EAYI,YAAY;EACZ,cAAc;ElCgGd,oBkC/FsC;AnCwjK1C;;AmCtkKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnC0jK9B;;AmCxjKA;EACE,qBpChF4B;EoCiF5B,kBpCrBU;EoCsBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC4oKnC;;AmCjkKA;;EASI,uBpCnF2B;ACgpK/B;;AmCtkKA;EAWI,6BAlFgD;AnCipKpD;;AoCjoKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC2qKZ;;AoC3oKA;EAWI,aAAa;ApCooKjB;;AoCloKA;EAEE,wCrC/C2B;ACmrK7B;;AoCloKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApCqoKb;;ACpmKE;EmCvCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpCgsKzB;AACF;;AoCvoKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCsHb,UmC9KoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCqsK7B;;AoCvoKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApC0oKzB;;AoCxoKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC2oKpB;;AoCzoKA;EACE,gCrCjF4B;EqCkF5B,2BrCrBgB;EqCsBhB,4BrCtBgB;ACkqKlB;;AoC1oKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApC0tKhC;;AoC3oKA;EACE,8BrChCgB;EqCiChB,+BrCjCgB;EqCkChB,6BrC/F4B;AC6uK9B;;AoCjpKA;EnC4EI,kBmCtEuC;ApC+oK3C;;AoC7oKA;EnC3CE,iCAAiC;EmC6CjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCsuK9B;;AqC1sKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCmwKb;;AqCjtKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC8wK7B;;AqCttKA;;EAcU,ctCtEmB;ACmxK7B;;AqC3tKA;;;;EAoBY,yB3B8BqB;E2B7BrB,ctC7EiB;AC2xK7B;;AqCnuKA;EAwBY,qBtChFiB;AC+xK7B;;AqCvuKA;EA0BQ,ctClFqB;ACmyK7B;;AC3sKE;EoChCF;;;;IAgCY,ctCxFiB;EC2yK3B;EqCnvKF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,ctC/Fe;ECwzK3B;EqChwKF;;IA0Cc,qBtClGe;EC4zK3B;EqCpwKF;;;IA8CU,yB3BIuB;I2BHvB,ctCvGmB;ECk0K3B;EqC1wKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECs0K3B;AACF;;AqC/wKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC+zK/B;;AqCpxKA;;EAcU,YtCzDqB;ACo0K/B;;AqCzxKA;;;;EAoBY,uB3B8BqB;E2B7BrB,YtChEmB;AC40K/B;;AqCjyKA;EAwBY,mBtCnEmB;ACg1K/B;;AqCryKA;EA0BQ,YtCrEuB;ACo1K/B;;ACzwKE;EoChCF;;;;IAgCY,YtC3EmB;EC41K7B;EqCjzKF;;;;;;;;;;IAsCc,uB3BYmB;I2BXnB,YtClFiB;ECy2K7B;EqC9zKF;;IA0Cc,mBtCrFiB;EC62K7B;EqCl0KF;;;IA8CU,uB3BIuB;I2BHvB,YtC1FqB;ECm3K7B;EqCx0KF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECu3K7B;AACF;;AqC70KA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV4zKrB;;AqCl1KA;;EAcU,yB3BQW;AVi0KrB;;AqCv1KA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AVy0KrB;;AqC/1KA;EAwBY,gC3BFS;AV60KrB;;AqCn2KA;EA0BQ,yB3BJa;AVi1KrB;;ACv0KE;EoChCF;;;;IAgCY,yB3BVS;EVy1KnB;EqC/2KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EVs2KnB;EqC53KF;;IA0Cc,gC3BpBO;EV02KnB;EqCh4KF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVg3KnB;EqCt4KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVo3KnB;AACF;;AqC34KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVw3KhB;;AqCh5KA;;EAcU,W3BUM;AV63KhB;;AqCr5KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVq4KhB;;AqC75KA;EAwBY,kB3BAI;AVy4KhB;;AqCj6KA;EA0BQ,W3BFQ;AV64KhB;;ACr4KE;EoChCF;;;;IAgCY,W3BRI;EVq5Kd;EqC76KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVk6Kd;EqC17KF;;IA0Cc,kB3BlBE;EVs6Kd;EqC97KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV46Kd;EqCp8KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EVg7Kd;AACF;;AqCz8KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVs7KhB;;AqC98KA;;EAcU,W3BUM;AV27KhB;;AqCn9KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVm8KhB;;AqC39KA;EAwBY,kB3BAI;AVu8KhB;;AqC/9KA;EA0BQ,W3BFQ;AV28KhB;;ACn8KE;EoChCF;;;;IAgCY,W3BRI;EVm9Kd;EqC3+KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVg+Kd;EqCx/KF;;IA0Cc,kB3BlBE;EVo+Kd;EqC5/KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV0+Kd;EqClgLF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV8+Kd;AACF;;AqCvgLA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVo/KhB;;AqC5gLA;;EAcU,W3BUM;AVy/KhB;;AqCjhLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVigLhB;;AqCzhLA;EAwBY,kB3BAI;AVqgLhB;;AqC7hLA;EA0BQ,W3BFQ;AVygLhB;;ACjgLE;EoChCF;;;;IAgCY,W3BRI;EVihLd;EqCziLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV8hLd;EqCtjLF;;IA0Cc,kB3BlBE;EVkiLd;EqC1jLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVwiLd;EqChkLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV4iLd;AACF;;AqCrkLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVkjLhB;;AqC1kLA;;EAcU,W3BUM;AVujLhB;;AqC/kLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV+jLhB;;AqCvlLA;EAwBY,kB3BAI;AVmkLhB;;AqC3lLA;EA0BQ,W3BFQ;AVukLhB;;AC/jLE;EoChCF;;;;IAgCY,W3BRI;EV+kLd;EqCvmLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV4lLd;EqCpnLF;;IA0Cc,kB3BlBE;EVgmLd;EqCxnLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVsmLd;EqC9nLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EV0mLd;AACF;;AqCnoLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AVgnLhB;;AqCxoLA;;EAcU,W3BUM;AVqnLhB;;AqC7oLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV6nLhB;;AqCrpLA;EAwBY,kB3BAI;AVioLhB;;AqCzpLA;EA0BQ,W3BFQ;AVqoLhB;;AC7nLE;EoChCF;;;;IAgCY,W3BRI;EV6oLd;EqCrqLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV0pLd;EqClrLF;;IA0Cc,kB3BlBE;EV8pLd;EqCtrLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVoqLd;EqC5rLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVwqLd;AACF;;AqCjsLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AVgrLrB;;AqCtsLA;;EAcU,yB3BQW;AVqrLrB;;AqC3sLA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AV6rLrB;;AqCntLA;EAwBY,gC3BFS;AVisLrB;;AqCvtLA;EA0BQ,yB3BJa;AVqsLrB;;AC3rLE;EoChCF;;;;IAgCY,yB3BVS;EV6sLnB;EqCnuLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EV0tLnB;EqChvLF;;IA0Cc,gC3BpBO;EV8tLnB;EqCpvLF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVouLnB;EqC1vLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVwuLnB;AACF;;AqC/vLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV4uLhB;;AqCpwLA;;EAcU,W3BUM;AVivLhB;;AqCzwLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVyvLhB;;AqCjxLA;EAwBY,kB3BAI;AV6vLhB;;AqCrxLA;EA0BQ,W3BFQ;AViwLhB;;ACzvLE;EoChCF;;;;IAgCY,W3BRI;EVywLd;EqCjyLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVsxLd;EqC9yLF;;IA0Cc,kB3BlBE;EV0xLd;EqClzLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVgyLd;EqCxzLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVoyLd;AACF;;AqC7zLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC2wLf;;AqCp0LA;EA2DI,gCtCxG0B;ACq3L9B;;AqCx0LA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArCg4LnB;;AqC/0LA;EAgEI,SAAS;ArCmxLb;;AqCn1LA;EAkEM,iCtC/GwB;ACo4L9B;;AqCv1LA;EAoEI,MAAM;ArCuxLV;;AqCrxLA;;EAGI,oBA9HmB;ArCq5LvB;;AqC1xLA;;EAKI,uBAhImB;ArC05LvB;;AqCxxLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCk6LvB;;AqCzxLA;EAIM,6BAA6B;ArCyxLnC;;AqCvxLA;EpCjFE,iCAAiC;EoCmFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArC0xLpB;;AqCxxLA;EAEE,ctCrJ4B;EEoB5B,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eoC7BqB;EpC8BrB,kBAAkB;EAClB,coC/BqB;EpC6KnB,kBoCpBkC;ArCmyLtC;;AC55LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBF6BQ;EE5BR,yDAAyD;EACzD,oCFsBa;EErBb,WAAW;AD+5Lf;;AC95LI;EACE,oBAAoB;ADi6L1B;;ACh6LI;EACE,oBAAoB;ADm6L1B;;ACl6LI;EACE,oBAAoB;ADq6L1B;;ACp6LE;EACE,qCAAiC;ADu6LrC;;ACn6LM;EACE,wCAAwC;ADs6LhD;;ACr6LM;EACE,UAAU;ADw6LlB;;ACv6LM;EACE,0CAA0C;AD06LlD;;AqC10LA;EACE,aAAa;ArC60Lf;;AqC30LA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArC80LpB;;AqCp1LA;;EASM,qBAAqB;EACrB,sBAAsB;ArCg1L5B;;AqC90LA;;EAEE,eAAe;ArCi1LjB;;AqCn1LA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;ACq/LlC;;AqCl1LA;EACE,YAAY;EACZ,cAAc;ArCq1LhB;;AqCv1LA;EAII,mBA7KgC;ArCogMpC;;AqC31LA;EAMI,UAAU;ArCy1Ld;;AqC/1LA;EAQI,YAAY;EACZ,cAAc;ArC21LlB;;AqCp2LA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArC61LtC;;AqC12LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;ACkhMlC;;AqC/2LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArCg2L9E;;AqC91LA;EACE,YAAY;EACZ,cAAc;ArCi2LhB;;AqC/1LA;EpCrCI,mBoCsCoC;ArCk2LxC;;AqCn2LA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpClCpB,aoCmC6B;ArCm2LjC;;AqCj2LA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArCo2LrB;;AqCv2LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCs2LzB;;AqCp2LA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCu2LlB;;ACr/LE;EoCpCF;IAsLI,cAAc;ErCw2LhB;EqCv2LA;;IAGI,mBAAmB;IACnB,aAAa;ErCw2LjB;EqCv2LA;IAEI,aAAa;ErCw2LjB;EqCh8LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCy2LnB;EqC52LA;IAKI,cAAc;ErC02LlB;EqCx2LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCqmMjB;EqC92LA;IAKI,SAAS;ErC42Lb;EqCj3LA;IAOM,4CtCrQqB;ECknM3B;EqCp3LA;IASI,MAAM;ErC82LV;EqCv3LA;IpC7LA,iCAAiC;IoC2M3B,iCAA2C;IAC3C,cAAc;ErC62LpB;EqC52LA;;IAGI,oBA9QiB;ErC2nMrB;EqCh3LA;;IAKI,uBAhRiB;ErC+nMrB;AACF;;AC3iME;EoC8LA;;;;IAIE,oBAAoB;IACpB,aAAa;ErCi3Lf;EqCplMF;IAqOI,mBA1RmB;ErC4oMrB;EqCn3LA;IAGI,kBA1R0B;ErC6oM9B;EqCt3LA;;IAMM,mBAAmB;ErCo3LzB;EqC13LA;;IASM,kBtCjOI;ECslMV;EqC93LA;;;;IAgBQ,wCAAwC;ErCo3LhD;EqCp4LA;IAuBU,wCAAwC;ErCg3LlD;EqCv4LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECuqM3B;EqC34LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECupMhC;EqCnhMF;IAsKI,aAAa;ErCg3Lf;EqC7gMF;;IAgKI,mBAAmB;IACnB,aAAa;ErCi3Lf;EqC5/LF;IA8IM,oBAAoB;ErCi3LxB;EqCn3LA;IAKM,oDAAoD;ErCi3L1D;EqCt3LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErCk3Lf;EqC93LA;IAkBM,cAAc;ErC+2LpB;EqC92LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErC+2LhC;EqC3iMF;IA8LI,YAAY;IACZ,cAAc;ErCg3LhB;EqC/2LA;IACE,2BAA2B;IpC/K3B,iBoCgLoC;ErCi3LtC;EqCh3LA;IACE,yBAAyB;IpClLzB,kBoCmLoC;ErCk3LtC;EqCx/LF;IAwII,uBtCxV2B;IsCyV3B,8BtCjSc;IsCkSd,+BtClSc;IsCmSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCnLnB,QoCoLuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErCosMpB;EqCtgMF;IAqJM,sBAAsB;IACtB,mBAAmB;ErCo3LvB;EqCn4LA;IpCpLE,kBoCqMuC;ErCq3LzC;EqCt4LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;EC8uM3B;EqC14LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;EC8tMhC;EqCr3LE;IAEE,kBtC1TY;IsC2TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtChUM;IsCiUN,uCAAuC;ErCs3L3C;EqC15LA;IAsCI,UAAU;IACV,QAAQ;ErCu3LZ;EqC7hMF;IAwKI,cAAc;ErCw3LhB;EqCv3LA;;IpC9NE,sBoCiOyC;ErCw3L3C;EqC33LA;;IpC9NE,qBoCmOyC;ErC03L3C;EqCx3LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC4wMjB;EqC93LA;IAKI,SAAS;ErC43Lb;EqCj4LA;IAOM,4CtC5ZqB;ECyxM3B;EqCp4LA;IASI,MAAM;ErC83LV;EqC73LA;;IAGI,oBA/ZiB;ErC6xMrB;EqCj4LA;;IAKI,uBAjaiB;ErCiyMrB;EqCr4LA;;IAOI,oBAA4D;ErCk4LhE;EqCz4LA;;IASI,uBAA+D;ErCo4LnE;EqCl4LA;;IAGI,ctC7auB;ECgzM3B;EqCt4LA;;IAKI,6BAla2C;ErCuyM/C;EqCp4LA;IAKM,yBtCzasB;EC2yM5B;AACF;;AqC/3LA;EAEI,iCAA2C;ArCi4L/C;;AsCzxMA;EAEE,evCFW;EuCGX,gBAnC0B;AtC8zM5B;;AsC9xMA;EAMI,kBvCLY;ACiyMhB;;AsClyMA;EAQI,kBvCTY;ACuyMhB;;AsCtyMA;EAUI,iBvCZW;AC4yMf;;AsC1yMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCmBiB;AC8wMvB;;AsCjzMA;EAkBM,qBvCiBiB;ACkxMvB;;AsCjyMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtCoyMpB;;AsClyMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtCmyMpB;;AsCjyMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AE+2MtB;;AsCzyMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACu3M9B;;AsChzMA;;;EAUI,qBvCjE8B;AC62MlC;;AsCtzMA;;;EAYI,iDvCvFyB;ACu4M7B;;AsC5zMA;;;;;EAeI,yBvClF0B;EuCmF1B,qBvCnF0B;EuCoF1B,gBAAgB;EAChB,cvCvF0B;EuCwF1B,YAAY;AtCqzMhB;;AsCnzMA;;EAEE,oBAvFkC;EAwFlC,qBAvFmC;EAwFnC,mBAAmB;AtCszMrB;;AsCpzMA;EAEI,yBvCpF8B;EuCqF9B,qBvCrF8B;EuCsF9B,W5B1BY;AVg1MhB;;AsCpzMA;EACE,cvCtG4B;EuCuG5B,oBAAoB;AtCuzMtB;;AsCrzMA;EACE,eAAe;AtCwzMjB;;AsCzzMA;EAGI,gBAAgB;AtC0zMpB;;ACz0ME;EqCjEF;IAoFI,eAAe;EtC2zMjB;EsCl1MF;;IA0BI,YAAY;IACZ,cAAc;EtC4zMhB;EsCv0MF;IAcM,YAAY;IACZ,cAAc;EtC4zMlB;AACF;;ACp1ME;EqCQF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtC8zMV;EsCt4MF;;;;IA6EI,gBAAgB;IAChB,aAAa;EtC+zMf;EsC9zMA;IACE,QAAQ;EtCg0MV;EsC/zMA;IACE,QAAQ;EtCi0MV;EsC96MF;IA+GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtCk0Mf;EsCr0MA;IAMM,QAAQ;EtCk0Md;EsCx0MA;IAQM,uBAAuB;IACvB,QAAQ;EtCm0Md;EsC50MA;IAWM,QAAQ;EtCo0Md;EsC/0MA;IAcM,QAAQ;EtCo0Md;EsCl1MA;IAgBM,QAAQ;EtCq0Md;EsCr1MA;IAkBM,yBAAyB;IACzB,QAAQ;EtCs0Md;AACF;;AuC78MA;EACE,kBxCsCgB;EwCrChB,0FxChC2B;EwCiC3B,exCEW;AC88Mb;;AuCn9MA;EAKI,qBxCWkB;ACu8MtB;;AuCv9MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;AC0/M7B;;AuC59MA;EAeQ,0BxChCuB;ACi/M/B;;AuCh+MA;EAiBQ,YxClCuB;ACq/M/B;;AuCp+MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;AC0/M/B;;AuCz+MA;EAeQ,4BxC7CqB;AC2gN7B;;AuC7+MA;EAiBQ,cxC/CqB;AC+gN7B;;AuCj/MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AVs8MrB;;AuCt/MA;EAeQ,+BxClCsB;AC6gN9B;;AuC1/MA;EAiBQ,iBxCpCsB;ACihN9B;;AuC9/MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVi9MhB;;AuCngNA;EAeQ,4BxCzCsB;ACiiN9B;;AuCvgNA;EAiBQ,cxC3CsB;ACqiN9B;;AuC3gNA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AV89MhB;;AuChhNA;EAeQ,4BxC3B0B;ACgiNlC;;AuCphNA;EAiBQ,cxC7B0B;ACoiNlC;;AuCxhNA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AV2+MhB;;AuC7hNA;EAeQ,4BxCzB0B;AC2iNlC;;AuCjiNA;EAiBQ,cxC3B0B;AC+iNlC;;AuCriNA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVw/MhB;;AuC1iNA;EAeQ,4BxC1B0B;ACyjNlC;;AuC9iNA;EAiBQ,cxC5B0B;AC6jNlC;;AuCljNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AVqgNhB;;AuCvjNA;EAeQ,4BxC5B0B;ACwkNlC;;AuC3jNA;EAiBQ,cxC9B0B;AC4kNlC;;AuC/jNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AVohNrB;;AuCpkNA;EAeQ,4BxC7B0B;ACslNlC;;AuCxkNA;EAiBQ,cxC/B0B;AC0lNlC;;AuC5kNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AV+hNhB;;AuCjlNA;EAeQ,4BxCvByB;AC6lNjC;;AuCrlNA;EAiBQ,cxCzByB;ACimNjC;;AuCtkNA;;EAGI,gCxC3C2B;ACmnN/B;;AuCtkNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvC8nNlC;;AuCvkNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvC0kNzB;;AuC9kNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvC4kNlB;;AuCplNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;ACopN9B;;AuC3kNA;EAEI,cxC1E0B;ACupN9B;;AuC/kNA;EAIM,cxC7D4B;AC4oNlC;;AuC7kNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCglNvB;;AuCrlNA;EtC6FI,mBsCtFsC;AvCklN1C;;AuCzlNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvColNf;;AuC/lNA;EAaI,eAAe;AvCslNnB;;AuCnmNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;ACurN9B;;AuCxmNA;EAkBM,cxCjF4B;AC2qNlC;;AuC5mNA;EAoBI,8BxClCc;EwCmCd,+BxCnCc;AC+nNlB;;AuC1lNA;;EAEE,eAAe;AvC6lNjB;;AuC/lNA;;EAII,4BxCnG0B;ACmsN9B;;AuC9lNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EE0K1B,mBsC7DoC;AvCumNxC;;AuC1mNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCymNxB;;AwCnsNA;EvCqCE,iCAAiC;EuCjCjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxCosNrB;;AwC9sNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxCssNvB;;AwC3tNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACwvN9B;;AwChuNA;EA0BI,cAAc;AxC0sNlB;;AwCpuNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACivNlC;;AwCzuNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxC6sN/B;;AwCpvNA;EAyCM,qBAAqB;AxC+sN3B;;AwCxvNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCitN3B;;AwC/vNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxCmtN1B;;AwCpwNA;EvCoJI,kBuChGuC;AxCotN3C;;AwCxwNA;EvCoJI,mBuC9FuC;AxCstN3C;;AwC5wNA;EA0DM,uBAAuB;AxCstN7B;;AwChxNA;EA6DM,yBAAyB;AxCutN/B;;AwCpxNA;EAiEM,6BAA6B;EAI3B,0BzC7BI;ACivNZ;;AwCzxNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;ACkzN9B;;AwC9xNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxCstNrF;;AwCpyNA;EAiFM,YAAY;EACZ,cAAc;AxCutNpB;;AwCzyNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCwtNxB;;AwCjzNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxC0tNlB;;AwCvzNA;EvCoJI,kBuCpDuE;AxC2tN3E;;AwC3zNA;EAsGU,4BzC9DE;EyC+DF,+BzC/DE;ACwxNZ;;AwCh0NA;EA6GU,2BzCrEE;EyCsEF,8BzCtEE;AC6xNZ;;AwCr0NA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCwtNpB;;AwC50NA;EAsHM,mBAAmB;AxC0tNzB;;AwCh1NA;EA+HY,kCzCrFW;EyCsFX,+BzCtFW;EyCuFX,qBAAqB;AxCqtNjC;;AwCt1NA;EAwIY,iCzC9FW;EyC+FX,8BzC/FW;EyCgGX,oBAAoB;AxCktNhC;;AwC51NA;EA6II,kBzCrIY;ACw1NhB;;AwCh2NA;EA+II,kBzCzIY;AC81NhB;;AwCp2NA;EAiJI,iBzC5IW;ACm2Nf;;AyCt4NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1C64NpB;;A0Cr4NE;EACE,UAAU;EACV,YAAY;A1Cw4NhB;;A0Cv4NE;EACE,UAAU;EACV,WAAW;A1C04Nf;;A0Cz4NE;EACE,UAAU;EACV,UAAU;A1C44Nd;;A0C34NE;EACE,UAAU;EACV,eAAe;A1C84NnB;;A0C74NE;EACE,UAAU;EACV,UAAU;A1Cg5Nd;;A0C/4NE;EACE,UAAU;EACV,eAAe;A1Ck5NnB;;A0Cj5NE;EACE,UAAU;EACV,UAAU;A1Co5Nd;;A0Cn5NE;EACE,UAAU;EACV,UAAU;A1Cs5Nd;;A0Cr5NE;EACE,UAAU;EACV,UAAU;A1Cw5Nd;;A0Cv5NE;EACE,UAAU;EACV,UAAU;A1C05Nd;;A0Cz5NE;EACE,UAAU;EACV,UAAU;A1C45Nd;;A0C35NE;EzCuIE,iByCtImC;A1C85NvC;;A0C75NE;EzCqIE,sByCpIwC;A1Cg6N5C;;A0C/5NE;EzCmIE,iByClImC;A1Ck6NvC;;A0Cj6NE;EzCiIE,sByChIwC;A1Co6N5C;;A0Cn6NE;EzC+HE,iByC9HmC;A1Cs6NvC;;A0Cr6NE;EzC6HE,iByC5HmC;A1Cw6NvC;;A0Cv6NE;EzC2HE,iByC1HmC;A1C06NvC;;A0Cz6NE;EzCyHE,iByCxHmC;A1C46NvC;;A0C36NE;EzCuHE,iByCtHmC;A1C86NvC;;A0C56NI;EACE,UAAU;EACV,SAAiC;A1C+6NvC;;A0C96NI;EzCiHA,gByChH4D;A1Ci7NhE;;A0Cr7NI;EACE,UAAU;EACV,eAAiC;A1Cw7NvC;;A0Cv7NI;EzCiHA,sByChH4D;A1C07NhE;;A0C97NI;EACE,UAAU;EACV,gBAAiC;A1Ci8NvC;;A0Ch8NI;EzCiHA,uByChH4D;A1Cm8NhE;;A0Cv8NI;EACE,UAAU;EACV,UAAiC;A1C08NvC;;A0Cz8NI;EzCiHA,iByChH4D;A1C48NhE;;A0Ch9NI;EACE,UAAU;EACV,gBAAiC;A1Cm9NvC;;A0Cl9NI;EzCiHA,uByChH4D;A1Cq9NhE;;A0Cz9NI;EACE,UAAU;EACV,gBAAiC;A1C49NvC;;A0C39NI;EzCiHA,uByChH4D;A1C89NhE;;A0Cl+NI;EACE,UAAU;EACV,UAAiC;A1Cq+NvC;;A0Cp+NI;EzCiHA,iByChH4D;A1Cu+NhE;;A0C3+NI;EACE,UAAU;EACV,gBAAiC;A1C8+NvC;;A0C7+NI;EzCiHA,uByChH4D;A1Cg/NhE;;A0Cp/NI;EACE,UAAU;EACV,gBAAiC;A1Cu/NvC;;A0Ct/NI;EzCiHA,uByChH4D;A1Cy/NhE;;A0C7/NI;EACE,UAAU;EACV,UAAiC;A1CggOvC;;A0C//NI;EzCiHA,iByChH4D;A1CkgOhE;;A0CtgOI;EACE,UAAU;EACV,gBAAiC;A1CygOvC;;A0CxgOI;EzCiHA,uByChH4D;A1C2gOhE;;A0C/gOI;EACE,UAAU;EACV,gBAAiC;A1CkhOvC;;A0CjhOI;EzCiHA,uByChH4D;A1CohOhE;;A0CxhOI;EACE,UAAU;EACV,WAAiC;A1C2hOvC;;A0C1hOI;EzCiHA,kByChH4D;A1C6hOhE;;ACz/NE;EyClGF;IAiEM,UAAU;IACV,YAAY;E1C+hOhB;E0CjmOF;IAoEM,UAAU;IACV,WAAW;E1CgiOf;E0CrmOF;IAuEM,UAAU;IACV,UAAU;E1CiiOd;E0CzmOF;IA0EM,UAAU;IACV,eAAe;E1CkiOnB;E0C7mOF;IA6EM,UAAU;IACV,UAAU;E1CmiOd;E0CjnOF;IAgFM,UAAU;IACV,eAAe;E1CoiOnB;E0CrnOF;IAmFM,UAAU;IACV,UAAU;E1CqiOd;E0CznOF;IAsFM,UAAU;IACV,UAAU;E1CsiOd;E0C7nOF;IAyFM,UAAU;IACV,UAAU;E1CuiOd;E0CjoOF;IA4FM,UAAU;IACV,UAAU;E1CwiOd;E0CroOF;IA+FM,UAAU;IACV,UAAU;E1CyiOd;E0CzoOF;IzC8KI,iByC5EqC;E1C0iOvC;E0C5oOF;IzC8KI,sByC1E0C;E1C2iO5C;E0C/oOF;IzC8KI,iByCxEqC;E1C4iOvC;E0ClpOF;IzC8KI,sByCtE0C;E1C6iO5C;E0CrpOF;IzC8KI,iByCpEqC;E1C8iOvC;E0CxpOF;IzC8KI,iByClEqC;E1C+iOvC;E0C3pOF;IzC8KI,iByChEqC;E1CgjOvC;E0C9pOF;IzC8KI,iByC9DqC;E1CijOvC;E0CjqOF;IzC8KI,iByC5DqC;E1CkjOvC;E0CpqOF;IAqHQ,UAAU;IACV,SAAiC;E1CkjOvC;E0CxqOF;IzC8KI,gByCtD8D;E1CmjOhE;E0C3qOF;IAqHQ,UAAU;IACV,eAAiC;E1CyjOvC;E0C/qOF;IzC8KI,sByCtD8D;E1C0jOhE;E0ClrOF;IAqHQ,UAAU;IACV,gBAAiC;E1CgkOvC;E0CtrOF;IzC8KI,uByCtD8D;E1CikOhE;E0CzrOF;IAqHQ,UAAU;IACV,UAAiC;E1CukOvC;E0C7rOF;IzC8KI,iByCtD8D;E1CwkOhE;E0ChsOF;IAqHQ,UAAU;IACV,gBAAiC;E1C8kOvC;E0CpsOF;IzC8KI,uByCtD8D;E1C+kOhE;E0CvsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CqlOvC;E0C3sOF;IzC8KI,uByCtD8D;E1CslOhE;E0C9sOF;IAqHQ,UAAU;IACV,UAAiC;E1C4lOvC;E0CltOF;IzC8KI,iByCtD8D;E1C6lOhE;E0CrtOF;IAqHQ,UAAU;IACV,gBAAiC;E1CmmOvC;E0CztOF;IzC8KI,uByCtD8D;E1ComOhE;E0C5tOF;IAqHQ,UAAU;IACV,gBAAiC;E1C0mOvC;E0ChuOF;IzC8KI,uByCtD8D;E1C2mOhE;E0CnuOF;IAqHQ,UAAU;IACV,UAAiC;E1CinOvC;E0CvuOF;IzC8KI,iByCtD8D;E1CknOhE;E0C1uOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwnOvC;E0C9uOF;IzC8KI,uByCtD8D;E1CynOhE;E0CjvOF;IAqHQ,UAAU;IACV,gBAAiC;E1C+nOvC;E0CrvOF;IzC8KI,uByCtD8D;E1CgoOhE;E0CxvOF;IAqHQ,UAAU;IACV,WAAiC;E1CsoOvC;E0C5vOF;IzC8KI,kByCtD8D;E1CuoOhE;AACF;;AC1pOE;EyCtGF;IA4HM,UAAU;IACV,YAAY;E1CyoOhB;E0CtwOF;IAgIM,UAAU;IACV,WAAW;E1CyoOf;E0C1wOF;IAoIM,UAAU;IACV,UAAU;E1CyoOd;E0C9wOF;IAwIM,UAAU;IACV,eAAe;E1CyoOnB;E0ClxOF;IA4IM,UAAU;IACV,UAAU;E1CyoOd;E0CtxOF;IAgJM,UAAU;IACV,eAAe;E1CyoOnB;E0C1xOF;IAoJM,UAAU;IACV,UAAU;E1CyoOd;E0C9xOF;IAwJM,UAAU;IACV,UAAU;E1CyoOd;E0ClyOF;IA4JM,UAAU;IACV,UAAU;E1CyoOd;E0CtyOF;IAgKM,UAAU;IACV,UAAU;E1CyoOd;E0C1yOF;IAoKM,UAAU;IACV,UAAU;E1CyoOd;E0C9yOF;IzC8KI,iByCNqC;E1CyoOvC;E0CjzOF;IzC8KI,sByCH0C;E1CyoO5C;E0CpzOF;IzC8KI,iByCAqC;E1CyoOvC;E0CvzOF;IzC8KI,sByCG0C;E1CyoO5C;E0C1zOF;IzC8KI,iByCMqC;E1CyoOvC;E0C7zOF;IzC8KI,iByCSqC;E1CyoOvC;E0Ch0OF;IzC8KI,iByCYqC;E1CyoOvC;E0Cn0OF;IzC8KI,iByCeqC;E1CyoOvC;E0Ct0OF;IzC8KI,iByCkBqC;E1CyoOvC;E0Cz0OF;IAoMQ,UAAU;IACV,SAAiC;E1CwoOvC;E0C70OF;IzC8KI,gByC0B8D;E1CwoOhE;E0Ch1OF;IAoMQ,UAAU;IACV,eAAiC;E1C+oOvC;E0Cp1OF;IzC8KI,sByC0B8D;E1C+oOhE;E0Cv1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CspOvC;E0C31OF;IzC8KI,uByC0B8D;E1CspOhE;E0C91OF;IAoMQ,UAAU;IACV,UAAiC;E1C6pOvC;E0Cl2OF;IzC8KI,iByC0B8D;E1C6pOhE;E0Cr2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CoqOvC;E0Cz2OF;IzC8KI,uByC0B8D;E1CoqOhE;E0C52OF;IAoMQ,UAAU;IACV,gBAAiC;E1C2qOvC;E0Ch3OF;IzC8KI,uByC0B8D;E1C2qOhE;E0Cn3OF;IAoMQ,UAAU;IACV,UAAiC;E1CkrOvC;E0Cv3OF;IzC8KI,iByC0B8D;E1CkrOhE;E0C13OF;IAoMQ,UAAU;IACV,gBAAiC;E1CyrOvC;E0C93OF;IzC8KI,uByC0B8D;E1CyrOhE;E0Cj4OF;IAoMQ,UAAU;IACV,gBAAiC;E1CgsOvC;E0Cr4OF;IzC8KI,uByC0B8D;E1CgsOhE;E0Cx4OF;IAoMQ,UAAU;IACV,UAAiC;E1CusOvC;E0C54OF;IzC8KI,iByC0B8D;E1CusOhE;E0C/4OF;IAoMQ,UAAU;IACV,gBAAiC;E1C8sOvC;E0Cn5OF;IzC8KI,uByC0B8D;E1C8sOhE;E0Ct5OF;IAoMQ,UAAU;IACV,gBAAiC;E1CqtOvC;E0C15OF;IzC8KI,uByC0B8D;E1CqtOhE;E0C75OF;IAoMQ,UAAU;IACV,WAAiC;E1C4tOvC;E0Cj6OF;IzC8KI,kByC0B8D;E1C4tOhE;AACF;;ACvzOE;EyC9GF;IA2MM,UAAU;IACV,YAAY;E1C+tOhB;E0C36OF;IA8MM,UAAU;IACV,WAAW;E1CguOf;E0C/6OF;IAiNM,UAAU;IACV,UAAU;E1CiuOd;E0Cn7OF;IAoNM,UAAU;IACV,eAAe;E1CkuOnB;E0Cv7OF;IAuNM,UAAU;IACV,UAAU;E1CmuOd;E0C37OF;IA0NM,UAAU;IACV,eAAe;E1CouOnB;E0C/7OF;IA6NM,UAAU;IACV,UAAU;E1CquOd;E0Cn8OF;IAgOM,UAAU;IACV,UAAU;E1CsuOd;E0Cv8OF;IAmOM,UAAU;IACV,UAAU;E1CuuOd;E0C38OF;IAsOM,UAAU;IACV,UAAU;E1CwuOd;E0C/8OF;IAyOM,UAAU;IACV,UAAU;E1CyuOd;E0Cn9OF;IzC8KI,iByC8DqC;E1C0uOvC;E0Ct9OF;IzC8KI,sByCgE0C;E1C2uO5C;E0Cz9OF;IzC8KI,iByCkEqC;E1C4uOvC;E0C59OF;IzC8KI,sByCoE0C;E1C6uO5C;E0C/9OF;IzC8KI,iByCsEqC;E1C8uOvC;E0Cl+OF;IzC8KI,iByCwEqC;E1C+uOvC;E0Cr+OF;IzC8KI,iByC0EqC;E1CgvOvC;E0Cx+OF;IzC8KI,iByC4EqC;E1CivOvC;E0C3+OF;IzC8KI,iByC8EqC;E1CkvOvC;E0C9+OF;IA+PQ,UAAU;IACV,SAAiC;E1CkvOvC;E0Cl/OF;IzC8KI,gByCoF8D;E1CmvOhE;E0Cr/OF;IA+PQ,UAAU;IACV,eAAiC;E1CyvOvC;E0Cz/OF;IzC8KI,sByCoF8D;E1C0vOhE;E0C5/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CgwOvC;E0ChgPF;IzC8KI,uByCoF8D;E1CiwOhE;E0CngPF;IA+PQ,UAAU;IACV,UAAiC;E1CuwOvC;E0CvgPF;IzC8KI,iByCoF8D;E1CwwOhE;E0C1gPF;IA+PQ,UAAU;IACV,gBAAiC;E1C8wOvC;E0C9gPF;IzC8KI,uByCoF8D;E1C+wOhE;E0CjhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CqxOvC;E0CrhPF;IzC8KI,uByCoF8D;E1CsxOhE;E0CxhPF;IA+PQ,UAAU;IACV,UAAiC;E1C4xOvC;E0C5hPF;IzC8KI,iByCoF8D;E1C6xOhE;E0C/hPF;IA+PQ,UAAU;IACV,gBAAiC;E1CmyOvC;E0CniPF;IzC8KI,uByCoF8D;E1CoyOhE;E0CtiPF;IA+PQ,UAAU;IACV,gBAAiC;E1C0yOvC;E0C1iPF;IzC8KI,uByCoF8D;E1C2yOhE;E0C7iPF;IA+PQ,UAAU;IACV,UAAiC;E1CizOvC;E0CjjPF;IzC8KI,iByCoF8D;E1CkzOhE;E0CpjPF;IA+PQ,UAAU;IACV,gBAAiC;E1CwzOvC;E0CxjPF;IzC8KI,uByCoF8D;E1CyzOhE;E0C3jPF;IA+PQ,UAAU;IACV,gBAAiC;E1C+zOvC;E0C/jPF;IzC8KI,uByCoF8D;E1Cg0OhE;E0ClkPF;IA+PQ,UAAU;IACV,WAAiC;E1Cs0OvC;E0CtkPF;IzC8KI,kByCoF8D;E1Cu0OhE;AACF;;ACx9OE;EyClHF;IAqQM,UAAU;IACV,YAAY;E1C00OhB;E0ChlPF;IAwQM,UAAU;IACV,WAAW;E1C20Of;E0CplPF;IA2QM,UAAU;IACV,UAAU;E1C40Od;E0CxlPF;IA8QM,UAAU;IACV,eAAe;E1C60OnB;E0C5lPF;IAiRM,UAAU;IACV,UAAU;E1C80Od;E0ChmPF;IAoRM,UAAU;IACV,eAAe;E1C+0OnB;E0CpmPF;IAuRM,UAAU;IACV,UAAU;E1Cg1Od;E0CxmPF;IA0RM,UAAU;IACV,UAAU;E1Ci1Od;E0C5mPF;IA6RM,UAAU;IACV,UAAU;E1Ck1Od;E0ChnPF;IAgSM,UAAU;IACV,UAAU;E1Cm1Od;E0CpnPF;IAmSM,UAAU;IACV,UAAU;E1Co1Od;E0CxnPF;IzC8KI,iByCwHqC;E1Cq1OvC;E0C3nPF;IzC8KI,sByC0H0C;E1Cs1O5C;E0C9nPF;IzC8KI,iByC4HqC;E1Cu1OvC;E0CjoPF;IzC8KI,sByC8H0C;E1Cw1O5C;E0CpoPF;IzC8KI,iByCgIqC;E1Cy1OvC;E0CvoPF;IzC8KI,iByCkIqC;E1C01OvC;E0C1oPF;IzC8KI,iByCoIqC;E1C21OvC;E0C7oPF;IzC8KI,iByCsIqC;E1C41OvC;E0ChpPF;IzC8KI,iByCwIqC;E1C61OvC;E0CnpPF;IAyTQ,UAAU;IACV,SAAiC;E1C61OvC;E0CvpPF;IzC8KI,gByC8I8D;E1C81OhE;E0C1pPF;IAyTQ,UAAU;IACV,eAAiC;E1Co2OvC;E0C9pPF;IzC8KI,sByC8I8D;E1Cq2OhE;E0CjqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C22OvC;E0CrqPF;IzC8KI,uByC8I8D;E1C42OhE;E0CxqPF;IAyTQ,UAAU;IACV,UAAiC;E1Ck3OvC;E0C5qPF;IzC8KI,iByC8I8D;E1Cm3OhE;E0C/qPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cy3OvC;E0CnrPF;IzC8KI,uByC8I8D;E1C03OhE;E0CtrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cg4OvC;E0C1rPF;IzC8KI,uByC8I8D;E1Ci4OhE;E0C7rPF;IAyTQ,UAAU;IACV,UAAiC;E1Cu4OvC;E0CjsPF;IzC8KI,iByC8I8D;E1Cw4OhE;E0CpsPF;IAyTQ,UAAU;IACV,gBAAiC;E1C84OvC;E0CxsPF;IzC8KI,uByC8I8D;E1C+4OhE;E0C3sPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cq5OvC;E0C/sPF;IzC8KI,uByC8I8D;E1Cs5OhE;E0CltPF;IAyTQ,UAAU;IACV,UAAiC;E1C45OvC;E0CttPF;IzC8KI,iByC8I8D;E1C65OhE;E0CztPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm6OvC;E0C7tPF;IzC8KI,uByC8I8D;E1Co6OhE;E0ChuPF;IAyTQ,UAAU;IACV,gBAAiC;E1C06OvC;E0CpuPF;IzC8KI,uByC8I8D;E1C26OhE;E0CvuPF;IAyTQ,UAAU;IACV,WAAiC;E1Ci7OvC;E0C3uPF;IzC8KI,kByC8I8D;E1Ck7OhE;AACF;;AC9mPI;EyCjIJ;IA+TM,UAAU;IACV,YAAY;E1Cq7OhB;E0CrvPF;IAkUM,UAAU;IACV,WAAW;E1Cs7Of;E0CzvPF;IAqUM,UAAU;IACV,UAAU;E1Cu7Od;E0C7vPF;IAwUM,UAAU;IACV,eAAe;E1Cw7OnB;E0CjwPF;IA2UM,UAAU;IACV,UAAU;E1Cy7Od;E0CrwPF;IA8UM,UAAU;IACV,eAAe;E1C07OnB;E0CzwPF;IAiVM,UAAU;IACV,UAAU;E1C27Od;E0C7wPF;IAoVM,UAAU;IACV,UAAU;E1C47Od;E0CjxPF;IAuVM,UAAU;IACV,UAAU;E1C67Od;E0CrxPF;IA0VM,UAAU;IACV,UAAU;E1C87Od;E0CzxPF;IA6VM,UAAU;IACV,UAAU;E1C+7Od;E0C7xPF;IzC8KI,iByCkLqC;E1Cg8OvC;E0ChyPF;IzC8KI,sByCoL0C;E1Ci8O5C;E0CnyPF;IzC8KI,iByCsLqC;E1Ck8OvC;E0CtyPF;IzC8KI,sByCwL0C;E1Cm8O5C;E0CzyPF;IzC8KI,iByC0LqC;E1Co8OvC;E0C5yPF;IzC8KI,iByC4LqC;E1Cq8OvC;E0C/yPF;IzC8KI,iByC8LqC;E1Cs8OvC;E0ClzPF;IzC8KI,iByCgMqC;E1Cu8OvC;E0CrzPF;IzC8KI,iByCkMqC;E1Cw8OvC;E0CxzPF;IAmXQ,UAAU;IACV,SAAiC;E1Cw8OvC;E0C5zPF;IzC8KI,gByCwM8D;E1Cy8OhE;E0C/zPF;IAmXQ,UAAU;IACV,eAAiC;E1C+8OvC;E0Cn0PF;IzC8KI,sByCwM8D;E1Cg9OhE;E0Ct0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs9OvC;E0C10PF;IzC8KI,uByCwM8D;E1Cu9OhE;E0C70PF;IAmXQ,UAAU;IACV,UAAiC;E1C69OvC;E0Cj1PF;IzC8KI,iByCwM8D;E1C89OhE;E0Cp1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Co+OvC;E0Cx1PF;IzC8KI,uByCwM8D;E1Cq+OhE;E0C31PF;IAmXQ,UAAU;IACV,gBAAiC;E1C2+OvC;E0C/1PF;IzC8KI,uByCwM8D;E1C4+OhE;E0Cl2PF;IAmXQ,UAAU;IACV,UAAiC;E1Ck/OvC;E0Ct2PF;IzC8KI,iByCwM8D;E1Cm/OhE;E0Cz2PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cy/OvC;E0C72PF;IzC8KI,uByCwM8D;E1C0/OhE;E0Ch3PF;IAmXQ,UAAU;IACV,gBAAiC;E1CggPvC;E0Cp3PF;IzC8KI,uByCwM8D;E1CigPhE;E0Cv3PF;IAmXQ,UAAU;IACV,UAAiC;E1CugPvC;E0C33PF;IzC8KI,iByCwM8D;E1CwgPhE;E0C93PF;IAmXQ,UAAU;IACV,gBAAiC;E1C8gPvC;E0Cl4PF;IzC8KI,uByCwM8D;E1C+gPhE;E0Cr4PF;IAmXQ,UAAU;IACV,gBAAiC;E1CqhPvC;E0Cz4PF;IzC8KI,uByCwM8D;E1CshPhE;E0C54PF;IAmXQ,UAAU;IACV,WAAiC;E1C4hPvC;E0Ch5PF;IzC8KI,kByCwM8D;E1C6hPhE;AACF;;ACpwPI;EyChJJ;IAyXM,UAAU;IACV,YAAY;E1CgiPhB;E0C15PF;IA4XM,UAAU;IACV,WAAW;E1CiiPf;E0C95PF;IA+XM,UAAU;IACV,UAAU;E1CkiPd;E0Cl6PF;IAkYM,UAAU;IACV,eAAe;E1CmiPnB;E0Ct6PF;IAqYM,UAAU;IACV,UAAU;E1CoiPd;E0C16PF;IAwYM,UAAU;IACV,eAAe;E1CqiPnB;E0C96PF;IA2YM,UAAU;IACV,UAAU;E1CsiPd;E0Cl7PF;IA8YM,UAAU;IACV,UAAU;E1CuiPd;E0Ct7PF;IAiZM,UAAU;IACV,UAAU;E1CwiPd;E0C17PF;IAoZM,UAAU;IACV,UAAU;E1CyiPd;E0C97PF;IAuZM,UAAU;IACV,UAAU;E1C0iPd;E0Cl8PF;IzC8KI,iByC4OqC;E1C2iPvC;E0Cr8PF;IzC8KI,sByC8O0C;E1C4iP5C;E0Cx8PF;IzC8KI,iByCgPqC;E1C6iPvC;E0C38PF;IzC8KI,sByCkP0C;E1C8iP5C;E0C98PF;IzC8KI,iByCoPqC;E1C+iPvC;E0Cj9PF;IzC8KI,iByCsPqC;E1CgjPvC;E0Cp9PF;IzC8KI,iByCwPqC;E1CijPvC;E0Cv9PF;IzC8KI,iByC0PqC;E1CkjPvC;E0C19PF;IzC8KI,iByC4PqC;E1CmjPvC;E0C79PF;IA6aQ,UAAU;IACV,SAAiC;E1CmjPvC;E0Cj+PF;IzC8KI,gByCkQ8D;E1CojPhE;E0Cp+PF;IA6aQ,UAAU;IACV,eAAiC;E1C0jPvC;E0Cx+PF;IzC8KI,sByCkQ8D;E1C2jPhE;E0C3+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CikPvC;E0C/+PF;IzC8KI,uByCkQ8D;E1CkkPhE;E0Cl/PF;IA6aQ,UAAU;IACV,UAAiC;E1CwkPvC;E0Ct/PF;IzC8KI,iByCkQ8D;E1CykPhE;E0Cz/PF;IA6aQ,UAAU;IACV,gBAAiC;E1C+kPvC;E0C7/PF;IzC8KI,uByCkQ8D;E1CglPhE;E0ChgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CslPvC;E0CpgQF;IzC8KI,uByCkQ8D;E1CulPhE;E0CvgQF;IA6aQ,UAAU;IACV,UAAiC;E1C6lPvC;E0C3gQF;IzC8KI,iByCkQ8D;E1C8lPhE;E0C9gQF;IA6aQ,UAAU;IACV,gBAAiC;E1ComPvC;E0ClhQF;IzC8KI,uByCkQ8D;E1CqmPhE;E0CrhQF;IA6aQ,UAAU;IACV,gBAAiC;E1C2mPvC;E0CzhQF;IzC8KI,uByCkQ8D;E1C4mPhE;E0C5hQF;IA6aQ,UAAU;IACV,UAAiC;E1CknPvC;E0ChiQF;IzC8KI,iByCkQ8D;E1CmnPhE;E0CniQF;IA6aQ,UAAU;IACV,gBAAiC;E1CynPvC;E0CviQF;IzC8KI,uByCkQ8D;E1C0nPhE;E0C1iQF;IA6aQ,UAAU;IACV,gBAAiC;E1CgoPvC;E0C9iQF;IzC8KI,uByCkQ8D;E1CioPhE;E0CjjQF;IA6aQ,UAAU;IACV,WAAiC;E1CuoPvC;E0CrjQF;IzC8KI,kByCkQ8D;E1CwoPhE;AACF;;A0CvoPA;EzCpQI,sByChLgB;EzCgLhB,qByChLgB;EAublB,oBAvbkB;A1CikQpB;;A0C7oPA;EAKI,uBAzbgB;A1CqkQpB;;A0CjpPA;EAOI,qCAA4C;A1C8oPhD;;A0CrpPA;EAUI,uBAAuB;A1C+oP3B;;A0CzpPA;EzCpQI,eyCgRiC;EzChRjC,cyCiRiC;EACjC,aAAa;A1CipPjB;;A0C/pPA;EAgBM,SAAS;EACT,qBAAqB;A1CmpP3B;;A0CpqPA;EAmBM,qBAAqB;A1CqpP3B;;A0CxqPA;EAqBM,gBAAgB;A1CupPtB;;A0C5qPA;EAuBI,aAAa;A1CypPjB;;A0ChrPA;EAyBI,eAAe;A1C2pPnB;;A0CprPA;EA2BI,mBAAmB;A1C6pPvB;;ACpgQE;EyC4UF;IA+BM,aAAa;E1C8pPjB;AACF;;AC9/PE;EyCgUF;IAmCM,aAAa;E1CgqPjB;AACF;;A0C9pPE;EACE,oBAAY;EzC3SZ,yCyC4S2D;EzC5S3D,wCyC6S2D;A1CiqP/D;;A0CpqPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1CmqPrC;;A0CzqPE;EASM,iBAAY;A1CoqPpB;;ACniQE;EyCsXA;IAYQ,iBAAY;E1CsqPpB;AACF;;ACriQE;EyCkXA;IAeQ,iBAAY;E1CyqPpB;AACF;;ACviQE;EyC8WA;IAkBQ,iBAAY;E1C4qPpB;AACF;;ACziQE;EyC0WA;IAqBQ,iBAAY;E1C+qPpB;AACF;;AC3iQE;EyCsWA;IAwBQ,iBAAY;E1CkrPpB;AACF;;AC5iQI;EyCiWF;IA2BQ,iBAAY;E1CqrPpB;AACF;;ACxiQI;EyCuVF;IA8BQ,iBAAY;E1CwrPpB;AACF;;ACziQI;EyCkVF;IAiCQ,iBAAY;E1C2rPpB;AACF;;ACriQI;EyCwUF;IAoCQ,iBAAY;E1C8rPpB;AACF;;A0CnuPE;EASM,oBAAY;A1C8tPpB;;AC7lQE;EyCsXA;IAYQ,oBAAY;E1CguPpB;AACF;;AC/lQE;EyCkXA;IAeQ,oBAAY;E1CmuPpB;AACF;;ACjmQE;EyC8WA;IAkBQ,oBAAY;E1CsuPpB;AACF;;ACnmQE;EyC0WA;IAqBQ,oBAAY;E1CyuPpB;AACF;;ACrmQE;EyCsWA;IAwBQ,oBAAY;E1C4uPpB;AACF;;ACtmQI;EyCiWF;IA2BQ,oBAAY;E1C+uPpB;AACF;;AClmQI;EyCuVF;IA8BQ,oBAAY;E1CkvPpB;AACF;;ACnmQI;EyCkVF;IAiCQ,oBAAY;E1CqvPpB;AACF;;AC/lQI;EyCwUF;IAoCQ,oBAAY;E1CwvPpB;AACF;;A0C7xPE;EASM,mBAAY;A1CwxPpB;;ACvpQE;EyCsXA;IAYQ,mBAAY;E1C0xPpB;AACF;;ACzpQE;EyCkXA;IAeQ,mBAAY;E1C6xPpB;AACF;;AC3pQE;EyC8WA;IAkBQ,mBAAY;E1CgyPpB;AACF;;AC7pQE;EyC0WA;IAqBQ,mBAAY;E1CmyPpB;AACF;;AC/pQE;EyCsWA;IAwBQ,mBAAY;E1CsyPpB;AACF;;AChqQI;EyCiWF;IA2BQ,mBAAY;E1CyyPpB;AACF;;AC5pQI;EyCuVF;IA8BQ,mBAAY;E1C4yPpB;AACF;;AC7pQI;EyCkVF;IAiCQ,mBAAY;E1C+yPpB;AACF;;ACzpQI;EyCwUF;IAoCQ,mBAAY;E1CkzPpB;AACF;;A0Cv1PE;EASM,oBAAY;A1Ck1PpB;;ACjtQE;EyCsXA;IAYQ,oBAAY;E1Co1PpB;AACF;;ACntQE;EyCkXA;IAeQ,oBAAY;E1Cu1PpB;AACF;;ACrtQE;EyC8WA;IAkBQ,oBAAY;E1C01PpB;AACF;;ACvtQE;EyC0WA;IAqBQ,oBAAY;E1C61PpB;AACF;;ACztQE;EyCsWA;IAwBQ,oBAAY;E1Cg2PpB;AACF;;AC1tQI;EyCiWF;IA2BQ,oBAAY;E1Cm2PpB;AACF;;ACttQI;EyCuVF;IA8BQ,oBAAY;E1Cs2PpB;AACF;;ACvtQI;EyCkVF;IAiCQ,oBAAY;E1Cy2PpB;AACF;;ACntQI;EyCwUF;IAoCQ,oBAAY;E1C42PpB;AACF;;A0Cj5PE;EASM,iBAAY;A1C44PpB;;AC3wQE;EyCsXA;IAYQ,iBAAY;E1C84PpB;AACF;;AC7wQE;EyCkXA;IAeQ,iBAAY;E1Ci5PpB;AACF;;AC/wQE;EyC8WA;IAkBQ,iBAAY;E1Co5PpB;AACF;;ACjxQE;EyC0WA;IAqBQ,iBAAY;E1Cu5PpB;AACF;;ACnxQE;EyCsWA;IAwBQ,iBAAY;E1C05PpB;AACF;;ACpxQI;EyCiWF;IA2BQ,iBAAY;E1C65PpB;AACF;;AChxQI;EyCuVF;IA8BQ,iBAAY;E1Cg6PpB;AACF;;ACjxQI;EyCkVF;IAiCQ,iBAAY;E1Cm6PpB;AACF;;AC7wQI;EyCwUF;IAoCQ,iBAAY;E1Cs6PpB;AACF;;A0C38PE;EASM,oBAAY;A1Cs8PpB;;ACr0QE;EyCsXA;IAYQ,oBAAY;E1Cw8PpB;AACF;;ACv0QE;EyCkXA;IAeQ,oBAAY;E1C28PpB;AACF;;ACz0QE;EyC8WA;IAkBQ,oBAAY;E1C88PpB;AACF;;AC30QE;EyC0WA;IAqBQ,oBAAY;E1Ci9PpB;AACF;;AC70QE;EyCsWA;IAwBQ,oBAAY;E1Co9PpB;AACF;;AC90QI;EyCiWF;IA2BQ,oBAAY;E1Cu9PpB;AACF;;AC10QI;EyCuVF;IA8BQ,oBAAY;E1C09PpB;AACF;;AC30QI;EyCkVF;IAiCQ,oBAAY;E1C69PpB;AACF;;ACv0QI;EyCwUF;IAoCQ,oBAAY;E1Cg+PpB;AACF;;A0CrgQE;EASM,mBAAY;A1CggQpB;;AC/3QE;EyCsXA;IAYQ,mBAAY;E1CkgQpB;AACF;;ACj4QE;EyCkXA;IAeQ,mBAAY;E1CqgQpB;AACF;;ACn4QE;EyC8WA;IAkBQ,mBAAY;E1CwgQpB;AACF;;ACr4QE;EyC0WA;IAqBQ,mBAAY;E1C2gQpB;AACF;;ACv4QE;EyCsWA;IAwBQ,mBAAY;E1C8gQpB;AACF;;ACx4QI;EyCiWF;IA2BQ,mBAAY;E1CihQpB;AACF;;ACp4QI;EyCuVF;IA8BQ,mBAAY;E1CohQpB;AACF;;ACr4QI;EyCkVF;IAiCQ,mBAAY;E1CuhQpB;AACF;;ACj4QI;EyCwUF;IAoCQ,mBAAY;E1C0hQpB;AACF;;A0C/jQE;EASM,oBAAY;A1C0jQpB;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AGI,yBAAgD;A7Cg0RxD;;A6C/zRI;EACE,oCAAyC;A7Ck0R/C;;A6Ch0RI;EACE,yBAA6B;A7Cm0RnC;;A6Cl0RI;EAGI,yBAAgD;A7Cm0RxD;;A6Cl0RI;EACE,oCAAwC;A7Cq0R9C;;A6Cj2RE;EACE,yBAAwB;A7Co2R5B;;A6Cn2RE;EAGI,yBAA0C;A7Co2RhD;;A6Cn2RE;EACE,oCAAmC;A7Cs2RvC;;A6Cj2RI;EACE,yBAA8B;A7Co2RpC;;A6Cn2RI;EAGI,yBAAgD;A7Co2RxD;;A6Cn2RI;EACE,oCAAyC;A7Cs2R/C;;A6Cp2RI;EACE,yBAA6B;A7Cu2RnC;;A6Ct2RI;EAGI,yBAAgD;A7Cu2RxD;;A6Ct2RI;EACE,oCAAwC;A7Cy2R9C;;A6Cr4RE;EACE,yBAAwB;A7Cw4R5B;;A6Cv4RE;EAGI,yBAA0C;A7Cw4RhD;;A6Cv4RE;EACE,oCAAmC;A7C04RvC;;A6Cr4RI;EACE,yBAA8B;A7Cw4RpC;;A6Cv4RI;EAGI,yBAAgD;A7Cw4RxD;;A6Cv4RI;EACE,oCAAyC;A7C04R/C;;A6Cx4RI;EACE,yBAA6B;A7C24RnC;;A6C14RI;EAGI,yBAAgD;A7C24RxD;;A6C14RI;EACE,oCAAwC;A7C64R9C;;A6Cz6RE;EACE,yBAAwB;A7C46R5B;;A6C36RE;EAGI,yBAA0C;A7C46RhD;;A6C36RE;EACE,oCAAmC;A7C86RvC;;A6Cz6RI;EACE,yBAA8B;A7C46RpC;;A6C36RI;EAGI,yBAAgD;A7C46RxD;;A6C36RI;EACE,oCAAyC;A7C86R/C;;A6C56RI;EACE,yBAA6B;A7C+6RnC;;A6C96RI;EAGI,yBAAgD;A7C+6RxD;;A6C96RI;EACE,oCAAwC;A7Ci7R9C;;A6C78RE;EACE,yBAAwB;A7Cg9R5B;;A6C/8RE;EAGI,yBAA0C;A7Cg9RhD;;A6C/8RE;EACE,oCAAmC;A7Ck9RvC;;A6C78RI;EACE,yBAA8B;A7Cg9RpC;;A6C/8RI;EAGI,yBAAgD;A7Cg9RxD;;A6C/8RI;EACE,oCAAyC;A7Ck9R/C;;A6Ch9RI;EACE,yBAA6B;A7Cm9RnC;;A6Cl9RI;EAGI,yBAAgD;A7Cm9RxD;;A6Cl9RI;EACE,oCAAwC;A7Cq9R9C;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,yBAAwB;A7Cq+R5B;;A6Cp+RE;EACE,oCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A6Cl/RE;EACE,yBAAwB;A7Cq/R5B;;A6Cp/RE;EACE,oCAAmC;A7Cu/RvC;;A6C1/RE;EACE,yBAAwB;A7C6/R5B;;A6C5/RE;EACE,oCAAmC;A7C+/RvC;;A6ClgSE;EACE,yBAAwB;A7CqgS5B;;A6CpgSE;EACE,oCAAmC;A7CugSvC;;A6C1gSE;EACE,4BAAwB;A7C6gS5B;;A6C5gSE;EACE,uCAAmC;A7C+gSvC;;A6ClhSE;EACE,yBAAwB;A7CqhS5B;;A6CphSE;EACE,oCAAmC;A7CuhSvC;;A8C3jSE;EACE,8BAAiC;A9C8jSrC;;A8C/jSE;EACE,sCAAiC;A9CkkSrC;;A8CnkSE;EACE,iCAAiC;A9CskSrC;;A8CvkSE;EACE,yCAAiC;A9C0kSrC;;A8CtkSE;EACE,4BAA4B;A9CykShC;;A8C1kSE;EACE,0BAA4B;A9C6kShC;;A8C9kSE;EACE,kCAA4B;A9CilShC;;A8C7kSE;EACE,sCAAkC;A9CglStC;;A8CjlSE;EACE,oCAAkC;A9ColStC;;A8CrlSE;EACE,kCAAkC;A9CwlStC;;A8CzlSE;EACE,yCAAkC;A9C4lStC;;A8C7lSE;EACE,wCAAkC;A9CgmStC;;A8CjmSE;EACE,wCAAkC;A9ComStC;;A8CrmSE;EACE,iCAAkC;A9CwmStC;;A8CzmSE;EACE,+BAAkC;A9C4mStC;;A8C7mSE;EACE,gCAAkC;A9CgnStC;;A8CjnSE;EACE,iCAAkC;A9ConStC;;A8ChnSE;EACE,oCAAgC;A9CmnSpC;;A8CpnSE;EACE,kCAAgC;A9CunSpC;;A8CxnSE;EACE,gCAAgC;A9C2nSpC;;A8C5nSE;EACE,uCAAgC;A9C+nSpC;;A8ChoSE;E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4T/B;EoDv4TE;IACE,0BAA2B;EpDy4T/B;EoD14TE;IACE,4BAA2B;EpD44T/B;EoD74TE;IACE,6BAA2B;EpD+4T/B;EoDh5TE;IACE,0BAA2B;EpDk5T/B;EoDn5TE;IACE,6BAA2B;EpDq5T/B;AACF;;ACvxTI;EmDhIA;IACE,0BAA2B;EpD25T/B;EoD55TE;IACE,4BAA2B;EpD85T/B;EoD/5TE;IACE,0BAA2B;EpDi6T/B;EoDl6TE;IACE,4BAA2B;EpDo6T/B;EoDr6TE;IACE,6BAA2B;EpDu6T/B;EoDx6TE;IACE,0BAA2B;EpD06T/B;EoD36TE;IACE,6BAA2B;EpD66T/B;AACF;;AChyTI;EmD/IA;IACE,0BAA2B;EpDm7T/B;EoDp7TE;IACE,4BAA2B;EpDs7T/B;EoDv7TE;IACE,0BAA2B;EpDy7T/B;EoD17TE;IACE,4BAA2B;EpD47T/B;EoD77TE;IACE,6BAA2B;EpD+7T/B;EoDh8TE;IACE,0BAA2B;EpDk8T/B;EoDn8TE;IACE,6BAA2B;EpDq8T/B;AACF;;AoD76TE;EACE,6BAAqC;ApDg7TzC;;AoDj7TE;EACE,8BAAqC;ApDo7TzC;;AoDr7TE;EACE,2BAAqC;ApDw7TzC;;AoDz7TE;EACE,4BAAqC;ApD47TzC;;ACt3TE;EmDlEE;IACE,6BAAqC;EpD47TzC;AACF;;ACx3TE;EmDnEE;IACE,6BAAqC;EpD+7TzC;AACF;;AC13TE;EmDpEE;IACE,6BAAqC;EpDk8TzC;AACF;;AC53TE;EmDrEE;IACE,6BAAqC;EpDq8TzC;AACF;;AC93TE;EmDtEE;IACE,6BAAqC;EpDw8TzC;AACF;;AC/3TI;EmDxEA;IACE,6BAAqC;EpD28TzC;AACF;;AC33TI;EmD/EA;IACE,6BAAqC;EpD88TzC;AACF;;AC53TI;EmDjFA;IACE,6BAAqC;EpDi9TzC;AACF;;ACx3TI;EmDxFA;IACE,6BAAqC;EpDo9TzC;AACF;;AC56TE;EmDlEE;IACE,8BAAqC;EpDk/TzC;AACF;;AC96TE;EmDnEE;IACE,8BAAqC;EpDq/TzC;AACF;;ACh7TE;EmDpEE;IACE,8BAAqC;EpDw/TzC;AACF;;ACl7TE;EmDrEE;IACE,8BAAqC;EpD2/TzC;AACF;;ACp7TE;EmDtEE;IACE,8BAAqC;EpD8/TzC;AACF;;ACr7TI;EmDxEA;IACE,8BAAqC;EpDigUzC;AACF;;ACj7TI;EmD/EA;IACE,8BAAqC;EpDogUzC;AACF;;ACl7TI;EmDjFA;IACE,8BAAqC;EpDugUzC;AACF;;AC96TI;EmDxFA;IACE,8BAAqC;EpD0gUzC;AACF;;ACl+TE;EmDlEE;IACE,2BAAqC;EpDwiUzC;AACF;;ACp+TE;EmDnEE;IACE,2BAAqC;EpD2iUzC;AACF;;ACt+TE;EmDpEE;IACE,2BAAqC;EpD8iUzC;AACF;;ACx+TE;EmDrEE;IACE,2BAAqC;EpDijUzC;AACF;;AC1+TE;EmDtEE;IACE,2BAAqC;EpDojUzC;AACF;;AC3+TI;EmDxEA;IACE,2BAAqC;EpDujUzC;AACF;;ACv+TI;EmD/EA;IACE,2BAAqC;EpD0jUzC;AACF;;ACx+TI;EmDjFA;IACE,2BAAqC;EpD6jUzC;AACF;;ACp+TI;EmDxFA;IACE,2BAAqC;EpDgkUzC;AACF;;ACxhUE;EmDlEE;IACE,4BAAqC;EpD8lUzC;AACF;;AC1hUE;EmDnEE;IACE,4BAAqC;EpDimUzC;AACF;;AC5hUE;EmDpEE;IACE,4BAAqC;EpDomUzC;AACF;;AC9hUE;EmDrEE;IACE,4BAAqC;EpDumUzC;AACF;;AChiUE;EmDtEE;IACE,4BAAqC;EpD0mUzC;AACF;;ACjiUI;EmDxEA;IACE,4BAAqC;EpD6mUzC;AACF;;AC7hUI;EmD/EA;IACE,4BAAqC;EpDgnUzC;AACF;;AC9hUI;EmDjFA;IACE,4BAAqC;EpDmnUzC;AACF;;AC1hUI;EmDxFA;IACE,4BAAqC;EpDsnUzC;AACF;;AoDrnUA;EACE,qCAAqC;ApDwnUvC;;AoDtnUA;EACE,oCAAoC;ApDynUtC;;AoDvnUA;EACE,oCAAoC;ApD0nUtC;;AoDxnUA;EACE,6BAA6B;ApD2nU/B;;AoDznUA;EACE,qCAAqC;ApD4nUvC;;AoD1nUA;EACE,2BAAqC;ApD6nUvC;;AoD5nUA;EACE,2BAAsC;ApD+nUxC;;AoD9nUA;EACE,2BAAsC;ApDioUxC;;AoDhoUA;EACE,2BAAwC;ApDmoU1C;;AoDloUA;EACE,2BAAoC;ApDqoUtC;;AoDnoUA;EACE,+LAAuC;ApDsoUzC;;AoDpoUA;EACE,+LAAyC;ApDuoU3C;;AoDroUA;EACE,+LAA0C;ApDwoU5C;;AoDtoUA;EACE,iCAAyC;ApDyoU3C;;AoDvoUA;EACE,iCAAoC;ApD0oUtC;;AqD3uUE;EACE,yBAA+B;ArD8uUnC;;AC9oUE;EoD9FE;IACE,yBAA+B;ErDgvUnC;AACF;;AChpUE;EoD/FE;IACE,yBAA+B;ErDmvUnC;AACF;;AClpUE;EoDhGE;IACE,yBAA+B;ErDsvUnC;AACF;;ACppUE;EoDjGE;IACE,yBAA+B;ErDyvUnC;AACF;;ACtpUE;EoDlGE;IACE,yBAA+B;ErD4vUnC;AACF;;ACvpUI;EoDpGA;IACE,yBAA+B;ErD+vUnC;AACF;;ACnpUI;EoD3GA;IACE,yBAA+B;ErDkwUnC;AACF;;ACppUI;EoD7GA;IACE,yBAA+B;ErDqwUnC;AACF;;AChpUI;EoDpHA;IACE,yBAA+B;ErDwwUnC;AACF;;AqDryUE;EACE,wBAA+B;ArDwyUnC;;ACxsUE;EoD9FE;IACE,wBAA+B;ErD0yUnC;AACF;;AC1sUE;EoD/FE;IACE,wBAA+B;ErD6yUnC;AACF;;AC5sUE;EoDhGE;IACE,wBAA+B;ErDgzUnC;AACF;;AC9sUE;EoDjGE;IACE,wBAA+B;ErDmzUnC;AACF;;AChtUE;EoDlGE;IACE,wBAA+B;ErDszUnC;AACF;;ACjtUI;EoDpGA;IACE,wBAA+B;ErDyzUnC;AACF;;AC7sUI;EoD3GA;IACE,wBAA+B;ErD4zUnC;AACF;;AC9sUI;EoD7GA;IACE,wBAA+B;ErD+zUnC;AACF;;AC1sUI;EoDpHA;IACE,wBAA+B;ErDk0UnC;AACF;;AqD/1UE;EACE,0BAA+B;ArDk2UnC;;AClwUE;EoD9FE;IACE,0BAA+B;ErDo2UnC;AACF;;ACpwUE;EoD/FE;IACE,0BAA+B;ErDu2UnC;AACF;;ACtwUE;EoDhGE;IACE,0BAA+B;ErD02UnC;AACF;;ACxwUE;EoDjGE;IACE,0BAA+B;ErD62UnC;AACF;;AC1wUE;EoDlGE;IACE,0BAA+B;ErDg3UnC;AACF;;AC3wUI;EoDpGA;IACE,0BAA+B;ErDm3UnC;AACF;;ACvwUI;EoD3GA;IACE,0BAA+B;ErDs3UnC;AACF;;ACxwUI;EoD7GA;IACE,0BAA+B;ErDy3UnC;AACF;;ACpwUI;EoDpHA;IACE,0BAA+B;ErD43UnC;AACF;;AqDz5UE;EACE,gCAA+B;ArD45UnC;;AC5zUE;EoD9FE;IACE,gCAA+B;ErD85UnC;AACF;;AC9zUE;EoD/FE;IACE,gCAA+B;ErDi6UnC;AACF;;ACh0UE;EoDhGE;IACE,gCAA+B;ErDo6UnC;AACF;;ACl0UE;EoDjGE;IACE,gCAA+B;ErDu6UnC;AACF;;ACp0UE;EoDlGE;IACE,gCAA+B;ErD06UnC;AACF;;ACr0UI;EoDpGA;IACE,gCAA+B;ErD66UnC;AACF;;ACj0UI;EoD3GA;IACE,gCAA+B;ErDg7UnC;AACF;;ACl0UI;EoD7GA;IACE,gCAA+B;ErDm7UnC;AACF;;AC9zUI;EoDpHA;IACE,gCAA+B;ErDs7UnC;AACF;;AqDn9UE;EACE,+BAA+B;ArDs9UnC;;ACt3UE;EoD9FE;IACE,+BAA+B;ErDw9UnC;AACF;;ACx3UE;EoD/FE;IACE,+BAA+B;ErD29UnC;AACF;;AC13UE;EoDhGE;IACE,+BAA+B;ErD89UnC;AACF;;AC53UE;EoDjGE;IACE,+BAA+B;ErDi+UnC;AACF;;AC93UE;EoDlGE;IACE,+BAA+B;ErDo+UnC;AACF;;AC/3UI;EoDpGA;IACE,+BAA+B;ErDu+UnC;AACF;;AC33UI;EoD3GA;IACE,+BAA+B;ErD0+UnC;AACF;;AC53UI;EoD7GA;IACE,+BAA+B;ErD6+UnC;AACF;;ACx3UI;EoDpHA;IACE,+BAA+B;ErDg/UnC;AACF;;AqD/+UA;EACE,wBAAwB;ArDk/U1B;;AqDh/UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArDm/U1B;;AC37UE;EoDrDA;IACE,wBAAwB;ErDo/U1B;AACF;;AC77UE;EoDrDA;IACE,wBAAwB;ErDs/U1B;AACF;;AC/7UE;EoDrDA;IACE,wBAAwB;ErDw/U1B;AACF;;ACj8UE;EoDrDA;IACE,wBAAwB;ErD0/U1B;AACF;;ACn8UE;EoDrDA;IACE,wBAAwB;ErD4/U1B;AACF;;ACp8UI;EoDtDF;IACE,wBAAwB;ErD8/U1B;AACF;;ACh8UI;EoD5DF;IACE,wBAAwB;ErDggV1B;AACF;;ACj8UI;EoD7DF;IACE,wBAAwB;ErDkgV1B;AACF;;AC77UI;EoDnEF;IACE,wBAAwB;ErDogV1B;AACF;;AqDngVA;EACE,6BAA6B;ArDsgV/B;;ACr/UE;EoDdA;IACE,6BAA6B;ErDugV/B;AACF;;ACv/UE;EoDdA;IACE,6BAA6B;ErDygV/B;AACF;;ACz/UE;EoDdA;IACE,6BAA6B;ErD2gV/B;AACF;;AC3/UE;EoDdA;IACE,6BAA6B;ErD6gV/B;AACF;;AC7/UE;EoDdA;IACE,6BAA6B;ErD+gV/B;AACF;;AC9/UI;EoDfF;IACE,6BAA6B;ErDihV/B;AACF;;AC1/UI;EoDrBF;IACE,6BAA6B;ErDmhV/B;AACF;;AC3/UI;EoDtBF;IACE,6BAA6B;ErDqhV/B;AACF;;ACv/UI;EoD5BF;IACE,6BAA6B;ErDuhV/B;AACF;;AsDjpVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvD0oVhC;;AuD9oVA;EAMI,gBAAgB;AvD4oVpB;;AuDlpVA;EASM,mBAAmB;AvD6oVzB;;AuDtpVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;ACoqV7B;;AuD3pVA;;EAmBQ,cAAc;AvD6oVtB;;AuDhqVA;EAqBQ,cxD9BqB;AC6qV7B;;AuDpqVA;EAuBQ,4BxDhCqB;ACirV7B;;AuDxqVA;;EA0BU,cxDnCmB;ACsrV7B;;ACtkVE;EsDvGF;IA6BU,uBxDzBqB;EC8qV7B;AACF;;AuDnrVA;;EAgCQ,4BxDzCqB;ACisV7B;;AuDxrVA;;;EAqCU,yB7C4DuB;E6C3DvB,cxD/CmB;ACwsV7B;;AuD/rVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvD0pVtB;;AuDpsVA;EA4CY,UAAU;AvD4pVtB;;AuDxsVA;EA+CY,uBAAwB;EACxB,UAAU;AvD6pVtB;;AuD7sVA;EAoDY,cxD7DiB;AC0tV7B;;AuDjtVA;EAsDc,uCxD/De;AC8tV7B;;AuDrtVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;ACutV/B;;AuD3tVA;EAkEU,4EAAyG;AvD6pVnH;;ACpoVE;EsD3FF;IAqEc,4EAAyG;EvD+pVrH;AACF;;AuDruVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;ACsuV/B;;AuD1uVA;;EAmBQ,cAAc;AvD4tVtB;;AuD/uVA;EAqBQ,YxDjBuB;AC+uV/B;;AuDnvVA;EAuBQ,+BxDnBuB;ACmvV/B;;AuDvvVA;;EA0BU,YxDtBqB;ACwvV/B;;ACrpVE;EsDvGF;IA6BU,yBxDtCmB;EC0wV3B;AACF;;AuDlwVA;;EAgCQ,+BxD5BuB;ACmwV/B;;AuDvwVA;;;EAqCU,uB7C4DuB;E6C3DvB,YxDlCqB;AC0wV/B;;AuD9wVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDyuVtB;;AuDnxVA;EA4CY,UAAU;AvD2uVtB;;AuDvxVA;EA+CY,yBAAwB;EACxB,UAAU;AvD4uVtB;;AuD5xVA;EAoDY,YxDhDmB;AC4xV/B;;AuDhyVA;EAsDc,uCxD/De;AC6yV7B;;AuDpyVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;ACmzV7B;;AuD1yVA;EAkEU,8EAAyG;AvD4uVnH;;ACntVE;EsD3FF;IAqEc,8EAAyG;EvD8uVrH;AACF;;AuDpzVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AVovVrB;;AuDzzVA;;EAmBQ,cAAc;AvD2yVtB;;AuD9zVA;EAqBQ,yB7CgDa;AV6vVrB;;AuDl0VA;EAuBQ,yB7C8Ca;AViwVrB;;AuDt0VA;;EA0BU,yB7C2CW;AVswVrB;;ACpuVE;EsDvGF;IA6BU,4BxD3BoB;EC80V5B;AACF;;AuDj1VA;;EAgCQ,yB7CqCa;AVixVrB;;AuDt1VA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVwxVrB;;AuD71VA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDwzVtB;;AuDl2VA;EA4CY,UAAU;AvD0zVtB;;AuDt2VA;EA+CY,4BAAwB;EACxB,UAAU;AvD2zVtB;;AuD32VA;EAoDY,yB7CiBS;AV0yVrB;;AuD/2VA;EAsDc,uCxD/De;AC43V7B;;AuDn3VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;ACu3V9B;;AuDz3VA;EAkEU,iFAAyG;AvD2zVnH;;AClyVE;EsD3FF;IAqEc,iFAAyG;EvD6zVrH;AACF;;AuDn4VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVi0VhB;;AuDx4VA;;EAmBQ,cAAc;AvD03VtB;;AuD74VA;EAqBQ,W7CkDQ;AV00VhB;;AuDj5VA;EAuBQ,+B7CgDQ;AV80VhB;;AuDr5VA;;EA0BU,W7C6CM;AVm1VhB;;ACnzVE;EsDvGF;IA6BU,yBxDlCoB;ECo6V5B;AACF;;AuDh6VA;;EAgCQ,+B7CuCQ;AV81VhB;;AuDr6VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVq2VhB;;AuD56VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDu4VtB;;AuDj7VA;EA4CY,UAAU;AvDy4VtB;;AuDr7VA;EA+CY,yBAAwB;EACxB,UAAU;AvD04VtB;;AuD17VA;EAoDY,W7CmBI;AVu3VhB;;AuD97VA;EAsDc,uCxD/De;AC28V7B;;AuDl8VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;AC68V9B;;AuDx8VA;EAkEU,gFAAyG;AvD04VnH;;ACj3VE;EsD3FF;IAqEc,gFAAyG;EvD44VrH;AACF;;AuDl9VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVg5VhB;;AuDv9VA;;EAmBQ,cAAc;AvDy8VtB;;AuD59VA;EAqBQ,W7CkDQ;AVy5VhB;;AuDh+VA;EAuBQ,+B7CgDQ;AV65VhB;;AuDp+VA;;EA0BU,W7C6CM;AVk6VhB;;ACl4VE;EsDvGF;IA6BU,yBxDpBwB;ECq+VhC;AACF;;AuD/+VA;;EAgCQ,+B7CuCQ;AV66VhB;;AuDp/VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVo7VhB;;AuD3/VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDs9VtB;;AuDhgWA;EA4CY,UAAU;AvDw9VtB;;AuDpgWA;EA+CY,yBAAwB;EACxB,UAAU;AvDy9VtB;;AuDzgWA;EAoDY,W7CmBI;AVs8VhB;;AuD7gWA;EAsDc,uCxD/De;AC0hW7B;;AuDjhWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;AC8gWlC;;AuDvhWA;EAkEU,gFAAyG;AvDy9VnH;;ACh8VE;EsD3FF;IAqEc,gFAAyG;EvD29VrH;AACF;;AuDjiWA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AV+9VhB;;AuDtiWA;;EAmBQ,cAAc;AvDwhWtB;;AuD3iWA;EAqBQ,W7CkDQ;AVw+VhB;;AuD/iWA;EAuBQ,+B7CgDQ;AV4+VhB;;AuDnjWA;;EA0BU,W7C6CM;AVi/VhB;;ACj9VE;EsDvGF;IA6BU,yBxDlBwB;ECkjWhC;AACF;;AuD9jWA;;EAgCQ,+B7CuCQ;AV4/VhB;;AuDnkWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVmgWhB;;AuD1kWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDqiWtB;;AuD/kWA;EA4CY,UAAU;AvDuiWtB;;AuDnlWA;EA+CY,yBAAwB;EACxB,UAAU;AvDwiWtB;;AuDxlWA;EAoDY,W7CmBI;AVqhWhB;;AuD5lWA;EAsDc,uCxD/De;ACymW7B;;AuDhmWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;AC2lWlC;;AuDtmWA;EAkEU,gFAAyG;AvDwiWnH;;AC/gWE;EsD3FF;IAqEc,gFAAyG;EvD0iWrH;AACF;;AuDhnWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AV8iWhB;;AuDrnWA;;EAmBQ,cAAc;AvDumWtB;;AuD1nWA;EAqBQ,W7CkDQ;AVujWhB;;AuD9nWA;EAuBQ,+B7CgDQ;AV2jWhB;;AuDloWA;;EA0BU,W7C6CM;AVgkWhB;;AChiWE;EsDvGF;IA6BU,yBxDnBwB;ECkoWhC;AACF;;AuD7oWA;;EAgCQ,+B7CuCQ;AV2kWhB;;AuDlpWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVklWhB;;AuDzpWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDonWtB;;AuD9pWA;EA4CY,UAAU;AvDsnWtB;;AuDlqWA;EA+CY,yBAAwB;EACxB,UAAU;AvDunWtB;;AuDvqWA;EAoDY,W7CmBI;AVomWhB;;AuD3qWA;EAsDc,uCxD/De;ACwrW7B;;AuD/qWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;AC2qWlC;;AuDrrWA;EAkEU,gFAAyG;AvDunWnH;;AC9lWE;EsD3FF;IAqEc,gFAAyG;EvDynWrH;AACF;;AuD/rWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AV6nWhB;;AuDpsWA;;EAmBQ,cAAc;AvDsrWtB;;AuDzsWA;EAqBQ,W7CkDQ;AVsoWhB;;AuD7sWA;EAuBQ,+B7CgDQ;AV0oWhB;;AuDjtWA;;EA0BU,W7C6CM;AV+oWhB;;AC/mWE;EsDvGF;IA6BU,yBxDrBwB;ECmtWhC;AACF;;AuD5tWA;;EAgCQ,+B7CuCQ;AV0pWhB;;AuDjuWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AViqWhB;;AuDxuWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDmsWtB;;AuD7uWA;EA4CY,UAAU;AvDqsWtB;;AuDjvWA;EA+CY,yBAAwB;EACxB,UAAU;AvDssWtB;;AuDtvWA;EAoDY,W7CmBI;AVmrWhB;;AuD1vWA;EAsDc,uCxD/De;ACuwW7B;;AuD9vWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;AC4vWlC;;AuDpwWA;EAkEU,gFAAyG;AvDssWnH;;AC7qWE;EsD3FF;IAqEc,gFAAyG;EvDwsWrH;AACF;;AuD9wWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AV8sWrB;;AuDnxWA;;EAmBQ,cAAc;AvDqwWtB;;AuDxxWA;EAqBQ,yB7CgDa;AVutWrB;;AuD5xWA;EAuBQ,yB7C8Ca;AV2tWrB;;AuDhyWA;;EA0BU,yB7C2CW;AVguWrB;;AC9rWE;EsDvGF;IA6BU,yBxDtBwB;ECmyWhC;AACF;;AuD3yWA;;EAgCQ,yB7CqCa;AV2uWrB;;AuDhzWA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVkvWrB;;AuDvzWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDkxWtB;;AuD5zWA;EA4CY,UAAU;AvDoxWtB;;AuDh0WA;EA+CY,yBAAwB;EACxB,UAAU;AvDqxWtB;;AuDr0WA;EAoDY,yB7CiBS;AVowWrB;;AuDz0WA;EAsDc,uCxD/De;ACs1W7B;;AuD70WA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;AC40WlC;;AuDn1WA;EAkEU,gFAAyG;AvDqxWnH;;AC5vWE;EsD3FF;IAqEc,gFAAyG;EvDuxWrH;AACF;;AuD71WA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AV2xWhB;;AuDl2WA;;EAmBQ,cAAc;AvDo1WtB;;AuDv2WA;EAqBQ,W7CkDQ;AVoyWhB;;AuD32WA;EAuBQ,+B7CgDQ;AVwyWhB;;AuD/2WA;;EA0BU,W7C6CM;AV6yWhB;;AC7wWE;EsDvGF;IA6BU,yBxDhBuB;EC42W/B;AACF;;AuD13WA;;EAgCQ,+B7CuCQ;AVwzWhB;;AuD/3WA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AV+zWhB;;AuDt4WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDi2WtB;;AuD34WA;EA4CY,UAAU;AvDm2WtB;;AuD/4WA;EA+CY,yBAAwB;EACxB,UAAU;AvDo2WtB;;AuDp5WA;EAoDY,W7CmBI;AVi1WhB;;AuDx5WA;EAsDc,uCxD/De;ACq6W7B;;AuD55WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;ACq5WjC;;AuDl6WA;EAkEU,gFAAyG;AvDo2WnH;;AC30WE;EsD3FF;IAqEc,gFAAyG;EvDs2WrH;AACF;;AuD56WA;EAyEM,eAhF0B;AvDu7WhC;;ACj1WE;EsD/FF;IA6EQ,oBAnF8B;EvD27WpC;AACF;;ACv1WE;EsD/FF;IAiFQ,mBAtF4B;EvDg8WlC;AACF;;AuD57WA;EAsFM,mBAAmB;EACnB,aAAa;AvD02WnB;;AuDj8WA;EAyFQ,YAAY;EACZ,cAAc;AvD42WtB;;AuDt8WA;EA4FI,gBAAgB;AvD82WpB;;AuD18WA;EA8FI,iBAAiB;AvDg3WrB;;AuD52WA;EAEE,gBAAgB;AvD82WlB;;AuDh3WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDg3WzC;;AuDz3WA;EAYI,YAAY;AvDi3WhB;;ACp4WE;EsDOF;IAeI,aAAa;EvDm3Wf;AACF;;AuDl3WA;EACE,kBAAkB;AvDq3WpB;;AC94WE;EsDwBF;IAKM,aAAa;EvDs3WjB;EuD33WF;IAOQ,sBAAsB;EvDu3W5B;AACF;;ACn5WE;EsDoBF;IASI,aAAa;IACb,uBAAuB;EvD23WzB;EuDr4WF;ItDoDI,mBsDxCwC;EvD43W1C;AACF;;AuDz3WA;;EAEE,YAAY;EACZ,cAAc;AvD43WhB;;AuD13WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDihX/B;;ACz6WE;EsDyCF;IAKI,kBArJgC;EvDqhXlC;AACF;;AwDlhXA;EACE,oBAN2B;AxD2hX7B;;ACv6WE;EuD/GF;IAII,kBAR+B;ExD+hXjC;EwD3hXF;IAOM,oBAV8B;ExDiiXlC;EwD9hXF;IASM,mBAX4B;ExDmiXhC;AACF;;AyDniXA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzD0iXjC","file":"bulma-rtl.css"} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma.min.css b/pagetop/static/bulmix/css/bulma.min.css index be16f726..86ad2ff1 100644 --- a/pagetop/static/bulmix/css/bulma.min.css +++ b/pagetop/static/bulmix/css/bulma.min.css @@ -1 +1 @@ -/*! bulma.io v0.9.3 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{right:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:inherit}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;right:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file +/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:#00d1b2;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:#485fc7;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:#3e8ed0;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:#48c78e;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:#ffe08a;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:#f14668;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.button.is-responsive.is-small{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{right:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;right:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a!important;opacity:.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link.is-disabled,.pagination-link[disabled],.pagination-next.is-disabled,.pagination-next[disabled],.pagination-previous.is-disabled,.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma.min.css.map b/pagetop/static/bulmix/css/bulma.min.css.map index fc794a72..dbe97a3f 100644 --- a/pagetop/static/bulmix/css/bulma.min.css.map +++ b/pagetop/static/bulmix/css/bulma.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EH5DE,iCAAiC;EG8DjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTwDgB;ESvDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AShaA;EAGE,uBV/C6B;EUgD7B,qBVrD4B;EUsD5B,iBX3DwB;EW4DxB,cV3D4B;EU4D5B,eAAe;EAGf,uBAAuB;EACvB,iCA5D6D;EA6D7D,iBA5D6B;EA6D7B,kBA7D6B;EA8D7B,8BA/D6D;EAgE7D,kBAAkB;EAClB,mBAAmB;AT+ZrB;;AS/aA;EAkBI,cAAc;ATialB;;ASnbA;EAwBM,aAAa;EACb,YAAY;AT+ZlB;;ASxbA;ERiGI,+BQtEsG;ERsEtG,oBQrEmE;ATiavE;;AS7bA;ERiGI,mBQnEmE;ERmEnE,gCQlEsG;ATma1G;;ASlcA;EAiCM,+BAAiF;EACjF,gCAAkF;ATqaxF;;ASvcA;EAsCI,qBVxF0B;EUyF1B,cV5F0B;ACigB9B;;AS5cA;EA0CI,qBV/E8B;EUgF9B,cVhG0B;ACsgB9B;;ASjdA;EA6CM,iDVlF4B;AC0flC;;ASrdA;EAgDI,qBVpG0B;EUqG1B,cVtG0B;AC+gB9B;;AS1dA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV1G0B;EU2G1B,0BAzF8B;ATmgBlC;;ASjeA;EA4DM,4BV1GwB;EU2GxB,cVlHwB;AC2hB9B;;ASteA;EAgEM,yBCd2B;EDe3B,cVtHwB;ACgiB9B;;AS3eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT4atB;;ASlfA;EAwEI,gBAtG0B;EAuG1B,yBAtGmC;EAuGnC,cV/G8B;EUgH9B,qBAtG0B;ATohB9B;;ASzfA;EA8EM,cVnH4B;EUoH5B,0BAxGmC;ATuhBzC;;AS9fA;EAoFM,uBVhIyB;EUiIzB,yBAAyB;EACzB,cV/IuB;AC6jB7B;;ASpgBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,cVpJqB;ACmkB7B;;AS1gBA;EA8FQ,yBAAyB;EACzB,cVxJqB;ACwkB7B;;AS/gBA;EAiGU,mDV7IqB;AC+jB/B;;ASnhBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,cV/JqB;ACklB7B;;ASzhBA;;EAyGQ,uBVrJuB;EUsJvB,yBAAyB;EACzB,gBAAgB;ATqbxB;;AShiBA;EA6GQ,yBVtKqB;EUuKrB,YV1JuB;ACilB/B;;ASriBA;EAiHU,uBC/DuB;AVufjC;;ASziBA;;EAoHU,yBV7KmB;EU8KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVnKqB;AC6lB/B;;ASjjBA;EA0HU,gEAA4E;AT2btF;;ASrjBA;EA4HQ,6BAA6B;EAC7B,mBVzKuB;EU0KvB,YV1KuB;ACumB/B;;AS3jBA;EAmIU,uBV/KqB;EUgLrB,mBVhLqB;EUiLrB,cV9LmB;AC0nB7B;;ASjkBA;EAwIY,4DAA8D;AT6b1E;;ASrkBA;EA8Ic,gEAA4E;AT2b1F;;ASzkBA;;EAiJU,6BAA6B;EAC7B,mBV9LqB;EU+LrB,gBAAgB;EAChB,YVhMqB;AC6nB/B;;ASjlBA;EAsJQ,6BAA6B;EAC7B,qBVhNqB;EUiNrB,cVjNqB;ACgpB7B;;ASvlBA;EA6JU,yBVtNmB;EUuNnB,YV1MqB;ACwoB/B;;AS5lBA;EAqKc,4DAA8D;AT2b5E;;AShmBA;;EAwKU,6BAA6B;EAC7B,qBVlOmB;EUmOnB,gBAAgB;EAChB,cVpOmB;ACiqB7B;;ASxmBA;EAoFM,yBV7IuB;EU8IvB,yBAAyB;EACzB,YVlIyB;AC0pB/B;;AS9mBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,YVvIuB;ACgqB/B;;ASpnBA;EA8FQ,yBAAyB;EACzB,YV3IuB;ACqqB/B;;ASznBA;EAiGU,gDV1JmB;ACsrB7B;;AS7nBA;EAoGQ,uBClDyB;EDmDzB,yBAAyB;EACzB,YVlJuB;AC+qB/B;;ASnoBA;;EAyGQ,yBVlKqB;EUmKrB,yBAAyB;EACzB,gBAAgB;AT+hBxB;;AS1oBA;EA6GQ,uBVzJuB;EU0JvB,cVvKqB;ACwsB7B;;AS/oBA;EAiHU,yBC/DuB;AVimBjC;;ASnpBA;;EAoHU,uBVhKqB;EUiKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVhLmB;ACotB7B;;AS3pBA;EA0HU,4DAA4E;ATqiBtF;;AS/pBA;EA4HQ,6BAA6B;EAC7B,qBVtLqB;EUuLrB,cVvLqB;AC8tB7B;;ASrqBA;EAmIU,yBV5LmB;EU6LnB,qBV7LmB;EU8LnB,YVjLqB;ACutB/B;;AS3qBA;EAwIY,gEAA8D;ATuiB1E;;AS/qBA;EA8Ic,4DAA4E;ATqiB1F;;ASnrBA;;EAiJU,6BAA6B;EAC7B,qBV3MmB;EU4MnB,gBAAgB;EAChB,cV7MmB;ACovB7B;;AS3rBA;EAsJQ,6BAA6B;EAC7B,mBVnMuB;EUoMvB,YVpMuB;AC6uB/B;;ASjsBA;EA6JU,uBVzMqB;EU0MrB,cVvNmB;AC+vB7B;;AStsBA;EAqKc,gEAA8D;ATqiB5E;;AS1sBA;;EAwKU,6BAA6B;EAC7B,mBVrNqB;EUsNrB,gBAAgB;EAChB,YVvNqB;AC8vB/B;;ASltBA;EAoFM,4BVlIwB;EUmIxB,yBAAyB;EACzB,yBCjEe;AVmsBrB;;ASxtBA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVysBrB;;AS9tBA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV8sBrB;;ASnuBA;EAiGU,mDV/IoB;ACqxB9B;;ASvuBA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVwtBrB;;AS7uBA;;EAyGQ,4BVvJsB;EUwJtB,yBAAyB;EACzB,gBAAgB;ATyoBxB;;ASpvBA;EA6GQ,oCCxFa;EDyFb,iBV5JsB;ACuyB9B;;ASzvBA;EAiHU,oCC/DuB;AV2sBjC;;AS7vBA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVrKoB;ACmzB9B;;ASrwBA;EA0HU,sFAA4E;AT+oBtF;;ASzwBA;EA4HQ,6BAA6B;EAC7B,wBV3KsB;EU4KtB,iBV5KsB;AC6zB9B;;AS/wBA;EAmIU,4BVjLoB;EUkLpB,wBVlLoB;EUmLpB,yBChHW;AVgwBrB;;ASrxBA;EAwIY,sEAA8D;ATipB1E;;ASzxBA;EA8Ic,sFAA4E;AT+oB1F;;AS7xBA;;EAiJU,6BAA6B;EAC7B,wBVhMoB;EUiMpB,gBAAgB;EAChB,iBVlMoB;ACm1B9B;;ASryBA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVsxBrB;;AS3yBA;EA6JU,oCCxIW;EDyIX,iBV5MoB;AC81B9B;;AShzBA;EAqKc,sEAA8D;AT+oB5E;;ASpzBA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVuyBrB;;AS5zBA;EAoFM,yBVzIwB;EU0IxB,yBAAyB;EACzB,WC/DU;AV2yBhB;;ASl0BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVizBhB;;ASx0BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVszBhB;;AS70BA;EAiGU,gDVtJoB;ACs4B9B;;ASj1BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVg0BhB;;ASv1BA;;EAyGQ,yBV9JsB;EU+JtB,yBAAyB;EACzB,gBAAgB;ATmvBxB;;AS91BA;EA6GQ,sBCtFQ;EDuFR,cVnKsB;ACw5B9B;;ASn2BA;EAiHU,yBC/DuB;AVqzBjC;;ASv2BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5KoB;ACo6B9B;;AS/2BA;EA0HU,0DAA4E;ATyvBtF;;ASn3BA;EA4HQ,6BAA6B;EAC7B,qBVlLsB;EUmLtB,cVnLsB;AC86B9B;;ASz3BA;EAmIU,yBVxLoB;EUyLpB,qBVzLoB;EU0LpB,WC9GM;AVw2BhB;;AS/3BA;EAwIY,gEAA8D;AT2vB1E;;ASn4BA;EA8Ic,0DAA4E;ATyvB1F;;ASv4BA;;EAiJU,6BAA6B;EAC7B,qBVvMoB;EUwMpB,gBAAgB;EAChB,cVzMoB;ACo8B9B;;AS/4BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV83BhB;;ASr5BA;EA6JU,sBCtIM;EDuIN,cVnNoB;AC+8B9B;;AS15BA;EAqKc,gEAA8D;ATyvB5E;;AS95BA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+4BhB;;ASt6BA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WC/DU;AVq5BhB;;AS56BA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV25BhB;;ASl7BA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVg6BhB;;ASv7BA;EAiGU,iDVxIwB;ACk+BlC;;AS37BA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV06BhB;;ASj8BA;;EAyGQ,yBVhJ0B;EUiJ1B,yBAAyB;EACzB,gBAAgB;AT61BxB;;ASx8BA;EA6GQ,sBCtFQ;EDuFR,cVrJ0B;ACo/BlC;;AS78BA;EAiHU,yBC/DuB;AV+5BjC;;ASj9BA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACggClC;;ASz9BA;EA0HU,0DAA4E;ATm2BtF;;AS79BA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC0gClC;;ASn+BA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC9GM;AVk9BhB;;ASz+BA;EAwIY,gEAA8D;ATq2B1E;;AS7+BA;EA8Ic,0DAA4E;ATm2B1F;;ASj/BA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACgiClC;;ASz/BA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVw+BhB;;AS//BA;EA6JU,sBCtIM;EDuIN,cVrMwB;AC2iClC;;ASpgCA;EAqKc,gEAA8D;ATm2B5E;;ASxgCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVy/BhB;;AShhCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV8+BrE;;ASrhCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVo/BrE;;AS3hCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV0/BrE;;ASjiCA;EAoFM,yBVzH4B;EU0H5B,yBAAyB;EACzB,WC/DU;AVghChB;;ASviCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVshChB;;AS7iCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AV2hChB;;ASljCA;EAiGU,iDVtIwB;AC2lClC;;AStjCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVqiChB;;AS5jCA;;EAyGQ,yBV9I0B;EU+I1B,yBAAyB;EACzB,gBAAgB;ATw9BxB;;ASnkCA;EA6GQ,sBCtFQ;EDuFR,cVnJ0B;AC6mClC;;ASxkCA;EAiHU,yBC/DuB;AV0hCjC;;AS5kCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV5JwB;ACynClC;;ASplCA;EA0HU,0DAA4E;AT89BtF;;ASxlCA;EA4HQ,6BAA6B;EAC7B,qBVlK0B;EUmK1B,cVnK0B;ACmoClC;;AS9lCA;EAmIU,yBVxKwB;EUyKxB,qBVzKwB;EU0KxB,WC9GM;AV6kChB;;ASpmCA;EAwIY,gEAA8D;ATg+B1E;;ASxmCA;EA8Ic,0DAA4E;AT89B1F;;AS5mCA;;EAiJU,6BAA6B;EAC7B,qBVvLwB;EUwLxB,gBAAgB;EAChB,cVzLwB;ACypClC;;ASpnCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVmmChB;;AS1nCA;EA6JU,sBCtIM;EDuIN,cVnMwB;ACoqClC;;AS/nCA;EAqKc,gEAA8D;AT89B5E;;ASnoCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVonChB;;AS3oCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVymCrE;;AShpCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV+mCrE;;AStpCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVqnCrE;;AS5pCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WC/DU;AV2oChB;;ASlqCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVipChB;;ASxqCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVspChB;;AS7qCA;EAiGU,kDVvIwB;ACutClC;;ASjrCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVgqChB;;ASvrCA;;EAyGQ,yBV/I0B;EUgJ1B,yBAAyB;EACzB,gBAAgB;ATmlCxB;;AS9rCA;EA6GQ,sBCtFQ;EDuFR,cVpJ0B;ACyuClC;;ASnsCA;EAiHU,yBC/DuB;AVqpCjC;;ASvsCA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACqvClC;;AS/sCA;EA0HU,0DAA4E;ATylCtF;;ASntCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;AC+vClC;;ASztCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC9GM;AVwsChB;;AS/tCA;EAwIY,gEAA8D;AT2lC1E;;ASnuCA;EA8Ic,0DAA4E;ATylC1F;;ASvuCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACqxClC;;AS/uCA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV8tChB;;ASrvCA;EA6JU,sBCtIM;EDuIN,cVpMwB;ACgyClC;;AS1vCA;EAqKc,gEAA8D;ATylC5E;;AS9vCA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV+uChB;;AStwCA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVouCrE;;AS3wCA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV0uCrE;;ASjxCA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVgvCrE;;ASvxCA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WC/DU;AVswChB;;AS7xCA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AV4wChB;;ASnyCA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVixChB;;ASxyCA;EAiGU,kDVzIwB;ACo1ClC;;AS5yCA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AV2xChB;;ASlzCA;;EAyGQ,yBVjJ0B;EUkJ1B,yBAAyB;EACzB,gBAAgB;AT8sCxB;;ASzzCA;EA6GQ,sBCtFQ;EDuFR,cVtJ0B;ACs2ClC;;AS9zCA;EAiHU,yBC/DuB;AVgxCjC;;ASl0CA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACk3ClC;;AS10CA;EA0HU,0DAA4E;ATotCtF;;AS90CA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC43ClC;;ASp1CA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC9GM;AVm0ChB;;AS11CA;EAwIY,gEAA8D;ATstC1E;;AS91CA;EA8Ic,0DAA4E;ATotC1F;;ASl2CA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACk5ClC;;AS12CA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AVy1ChB;;ASh3CA;EA6JU,sBCtIM;EDuIN,cVtMwB;AC65ClC;;ASr3CA;EAqKc,gEAA8D;ATotC5E;;ASz3CA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AV02ChB;;ASj4CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV+1CrE;;ASt4CA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVq2CrE;;AS54CA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AV22CrE;;ASl5CA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,yBCjEe;AVm4CrB;;ASx5CA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,yBCtEa;AVy4CrB;;AS95CA;EA8FQ,yBAAyB;EACzB,yBC1Ea;AV84CrB;;ASn6CA;EAiGU,mDV1IwB;ACg9ClC;;ASv6CA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,yBCjFa;AVw5CrB;;AS76CA;;EAyGQ,yBVlJ0B;EUmJ1B,yBAAyB;EACzB,gBAAgB;ATy0CxB;;ASp7CA;EA6GQ,oCCxFa;EDyFb,cVvJ0B;ACk+ClC;;ASz7CA;EAiHU,oCC/DuB;AV24CjC;;AS77CA;;EAoHU,oCC/FW;EDgGX,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;AC8+ClC;;ASr8CA;EA0HU,sFAA4E;AT+0CtF;;ASz8CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;ACw/ClC;;AS/8CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,yBChHW;AVg8CrB;;ASr9CA;EAwIY,gEAA8D;ATi1C1E;;ASz9CA;EA8Ic,sFAA4E;AT+0C1F;;AS79CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;AC8gDlC;;ASr+CA;EAsJQ,6BAA6B;EAC7B,gCClIa;EDmIb,yBCnIa;AVs9CrB;;AS3+CA;EA6JU,oCCxIW;EDyIX,cVvMwB;ACyhDlC;;ASh/CA;EAqKc,gEAA8D;AT+0C5E;;ASp/CA;;EAwKU,6BAA6B;EAC7B,gCCpJW;EDqJX,gBAAgB;EAChB,yBCtJW;AVu+CrB;;AS5/CA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AV09CrE;;ASjgDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AVg+CrE;;ASvgDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVs+CrE;;AS7gDA;EAoFM,yBVvH2B;EUwH3B,yBAAyB;EACzB,WC/DU;AV4/ChB;;ASnhDA;EAyFQ,yBCvCyB;EDwCzB,yBAAyB;EACzB,WCpEQ;AVkgDhB;;ASzhDA;EA8FQ,yBAAyB;EACzB,WCxEQ;AVugDhB;;AS9hDA;EAiGU,kDVpIuB;ACqkDjC;;ASliDA;EAoGQ,yBClDyB;EDmDzB,yBAAyB;EACzB,WC/EQ;AVihDhB;;ASxiDA;;EAyGQ,yBV5IyB;EU6IzB,yBAAyB;EACzB,gBAAgB;ATo8CxB;;AS/iDA;EA6GQ,sBCtFQ;EDuFR,cVjJyB;ACulDjC;;ASpjDA;EAiHU,yBC/DuB;AVsgDjC;;ASxjDA;;EAoHU,sBC7FM;ED8FN,yBAAyB;EACzB,gBAAgB;EAChB,cV1JuB;ACmmDjC;;AShkDA;EA0HU,0DAA4E;AT08CtF;;ASpkDA;EA4HQ,6BAA6B;EAC7B,qBVhKyB;EUiKzB,cVjKyB;AC6mDjC;;AS1kDA;EAmIU,yBVtKuB;EUuKvB,qBVvKuB;EUwKvB,WC9GM;AVyjDhB;;AShlDA;EAwIY,gEAA8D;AT48C1E;;ASplDA;EA8Ic,0DAA4E;AT08C1F;;ASxlDA;;EAiJU,6BAA6B;EAC7B,qBVrLuB;EUsLvB,gBAAgB;EAChB,cVvLuB;ACmoDjC;;AShmDA;EAsJQ,6BAA6B;EAC7B,kBChIQ;EDiIR,WCjIQ;AV+kDhB;;AStmDA;EA6JU,sBCtIM;EDuIN,cVjMuB;AC8oDjC;;AS3mDA;EAqKc,gEAA8D;AT08C5E;;AS/mDA;;EAwKU,6BAA6B;EAC7B,kBClJM;EDmJN,gBAAgB;EAChB,WCpJM;AVgmDhB;;ASvnDA;EAiLU,yBCnJsC;EDoJtC,cC3I2D;AVqlDrE;;AS5nDA;EAqLY,yBCnIqB;EDoIrB,yBAAyB;EACzB,cChJyD;AV2lDrE;;ASloDA;EA0LY,yBCxIqB;EDyIrB,yBAAyB;EACzB,cCrJyD;AVimDrE;;ASxoDA;EARE,kBVbc;ACiqDhB;;AStpDE;EACE,kBVkBc;ACuoDlB;;AShpDA;EANE,eVhBW;AC0qDb;;ASppDA;EAJE,kBVnBc;AC+qDhB;;ASxpDA;EAFE,iBVtBa;ACorDf;;AS5pDA;;EAyMI,uBVrP2B;EUsP3B,qBV3P0B;EU4P1B,gBAhOyB;EAiOzB,YAhOyB;ATwrD7B;;ASpqDA;EA8MI,aAAa;EACb,WAAW;AT09Cf;;ASzqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT49CxB;;AS9qDA;ERlDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQkQhC,6BAA6B;AT+9CnC;;ASrrDA;EAwNI,4BVtQ0B;EUuQ1B,qBV1Q0B;EU2Q1B,cV7Q0B;EU8Q1B,gBAAgB;EAChB,oBAAoB;ATi+CxB;;AS7rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATm+C/D;;ASj+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATo+C7B;;ASx+CA;EAMI,qBAAqB;ATs+CzB;;AS5+CA;ERjII,oBQyIwC;ATw+C5C;;ASh/CA;EAUI,sBAAsB;AT0+C1B;;ASp/CA;EAYI,mBAAmB;AT4+CvB;;ASx/CA;EA1OE,kBVbc;ACmvDhB;;ASxuDE;EACE,kBVkBc;ACytDlB;;AShgDA;EAtOE,kBVnBc;AC6vDhB;;ASpgDA;EApOE,iBVtBa;ACkwDf;;ASxgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATk/CjC;;AS7gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ER/J9B,kBQgKwC;ATo/C5C;;ASnhDA;ERjII,eQkKqC;ATs/CzC;;ASvhDA;EAoCQ,UAAU;ATu/ClB;;AS3hDA;EA0CQ,UAAU;ATq/ClB;;AS/hDA;EA4CU,UAAU;ATu/CpB;;ASniDA;EA8CQ,YAAY;EACZ,cAAc;ATy/CtB;;ASxiDA;EAiDI,uBAAuB;AT2/C3B;;AS5iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT4/C7B;;ASjjDA;EAuDI,yBAAyB;AT8/C7B;;ASrjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT+/C7B;;AWl1DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WAAW;AXq1Db;;AWz1DA;EAMI,0BAA0B;EAC1B,kBZyCM;EYxCN,mBZwCM;EYvCN,WAAW;AXu1Df;;ACxvDE;EUxGF;IAWI,gBAAuC;EX01DzC;AACF;;ACpvDI;EUlHJ;IAcM,iBAAqE;EX61DzE;AACF;;AC3uDI;EUjIJ;IAiBM,iBAAiE;EXg2DrE;AACF;;AC3vDI;EUvHJ;IAoBM,iBAAqE;EXm2DzE;AACF;;AClvDI;EUtIJ;IAuBM,iBAAiE;EXs2DrE;AACF;;AY92DA;EAII,kBAAkB;AZ82DtB;;AYl3DA;;;;;;;EAcM,kBAAkB;AZ82DxB;;AY53DA;;;;;;EAqBI,cbpC0B;EaqC1B,gBbAiB;EaCjB,kBAxC+B;AZw5DnC;;AYv4DA;EAyBI,cAAc;EACd,oBAAoB;AZk3DxB;;AY54DA;EA4BM,eAAe;AZo3DrB;;AYh5DA;EA8BI,iBAAiB;EACjB,uBAAuB;AZs3D3B;;AYr5DA;EAiCM,oBAAoB;AZw3D1B;;AYz5DA;EAmCI,gBAAgB;EAChB,uBAAuB;AZ03D3B;;AY95DA;EAsCM,oBAAoB;AZ43D1B;;AYl6DA;EAwCI,iBAAiB;EACjB,oBAAoB;AZ83DxB;;AYv6DA;EA2CI,kBAAkB;EAClB,uBAAuB;AZg4D3B;;AY56DA;EA8CI,cAAc;EACd,kBAAkB;AZk4DtB;;AYj7DA;EAiDI,4BbzD0B;EE+I1B,8BFlJ0B;Ea8D1B,qBAhEqC;AZo8DzC;;AYv7DA;EAqDI,4BAA4B;EXkF5B,gBWjFmC;EACnC,eAAe;AZs4DnB;;AY77DA;EAyDM,wBAAwB;AZw4D9B;;AYj8DA;EA2DQ,4BAA4B;AZ04DpC;;AYr8DA;EA6DQ,4BAA4B;AZ44DpC;;AYz8DA;EA+DQ,4BAA4B;AZ84DpC;;AY78DA;EAiEQ,4BAA4B;AZg5DpC;;AYj9DA;EAmEI,wBAAwB;EXoExB,gBWnEmC;EACnC,eAAe;AZk5DnB;;AYv9DA;EAuEM,uBAAuB;EACvB,iBAAiB;AZo5DvB;;AY59DA;EA0EQ,uBAAuB;AZs5D/B;;AYh+DA;EXuII,gBW3DmC;AZw5DvC;;AYp+DA;EA8EI,gBAAgB;EAChB,iBAAiB;EACjB,kBAAkB;AZ05DtB;;AY1+DA;EAkFM,eAAe;AZ45DrB;;AY9+DA;EAoFM,kBAAkB;AZ85DxB;;AYl/DA;EAsFM,qBAAqB;AZg6D3B;;AYt/DA;EAwFM,kBAAkB;AZk6DxB;;AY1/DA;EXyCE,iCAAiC;EWkD/B,gBAAgB;EAChB,qBAvG8B;EAwG9B,gBAAgB;EAChB,iBAAiB;AZo6DrB;;AYlgEA;;EAiGI,cAAc;AZs6DlB;;AYvgEA;EAmGI,WAAW;AZw6Df;;AY3gEA;;EAsGM,yBbjHwB;EakHxB,qBA/GmC;EAgHnC,qBA/GmC;EAgHnC,mBAAmB;AZ06DzB;;AYnhEA;EA2GM,cb1HwB;ACsiE9B;;AYvhEA;EA6GQ,mBAAmB;AZ86D3B;;AY3hEA;;EAiHQ,qBAtHsC;EAuHtC,cbjIsB;ACgjE9B;;AYjiEA;;EAsHQ,qBAzHsC;EA0HtC,cbtIsB;ACsjE9B;;AYviEA;;EA6HY,sBAAsB;AZ+6DlC;;AY5iEA;EAgIM,aAAa;AZg7DnB;;AYhjEA;EAmII,kBblHY;ACmiEhB;;AYpjEA;EAqII,ebrHS;ACwiEb;;AYxjEA;EAuII,kBbxHY;AC6iEhB;;AY5jEA;EAyII,iBb3HW;ACkjEf;;Aa/kEA;EACE,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,cAVsB;EAWtB,aAXsB;Ab6lExB;;AavlEA;EAQI,YAbwB;EAcxB,WAdwB;AbimE5B;;Aa5lEA;EAWI,YAfyB;EAgBzB,WAhByB;AbqmE7B;;AajmEA;EAcI,YAjBwB;EAkBxB,WAlBwB;AbymE5B;;AarlEA;EACE,uBAAuB;EACvB,cAAc;EACd,oBAAoB;EACpB,eAAe;EACf,mBA5BsB;EA6BtB,mBAAmB;AbwlErB;;Aa9lEA;EAQI,YAAY;EACZ,cAAc;Ab0lElB;;AanmEA;EAYQ,oBA/BkB;Ab0nE1B;;AavmEA;EAiBQ,mBApCkB;Ab8nE1B;;AatlEA;EACE,aAAa;AbylEf;;AcloEA;EACE,cAAc;EACd,kBAAkB;AdqoEpB;;AcvoEA;EAII,cAAc;EACd,YAAY;EACZ,WAAW;AduoEf;;Ac7oEA;EAQM,qBf2DiB;AC8kEvB;;AcjpEA;EAUI,WAAW;Ad2oEf;;AcrpEA;;;;;;;;;;;;;;;;;EA+BM,YAAY;EACZ,WAAW;Ad0oEjB;;Ac1qEA;EAmCI,iBAAiB;Ad2oErB;;Ac9qEA;EAqCI,gBAAgB;Ad6oEpB;;AclrEA;EAuCI,gBAAgB;Ad+oEpB;;ActrEA;EAyCI,qBAAqB;AdipEzB;;Ac1rEA;EA2CI,gBAAgB;AdmpEpB;;Ac9rEA;EA6CI,mBAAmB;AdqpEvB;;AclsEA;EA+CI,gBAAgB;AdupEpB;;ActsEA;EAiDI,qBAAqB;AdypEzB;;Ac1sEA;EAmDI,iBAAiB;Ad2pErB;;Ac9sEA;EAqDI,sBAAsB;Ad6pE1B;;AcltEA;EAuDI,iBAAiB;Ad+pErB;;ActtEA;EAyDI,sBAAsB;AdiqE1B;;Ac1tEA;EA2DI,sBAAsB;AdmqE1B;;Ac9tEA;EA6DI,iBAAiB;AdqqErB;;AcluEA;EA+DI,iBAAiB;AduqErB;;ActuEA;EAmEM,YAAwB;EACxB,WAAuB;AduqE7B;;Ac3uEA;EAmEM,YAAwB;EACxB,WAAuB;Ad4qE7B;;AchvEA;EAmEM,YAAwB;EACxB,WAAuB;AdirE7B;;AcrvEA;EAmEM,YAAwB;EACxB,WAAuB;AdsrE7B;;Ac1vEA;EAmEM,YAAwB;EACxB,WAAuB;Ad2rE7B;;Ac/vEA;EAmEM,YAAwB;EACxB,WAAuB;AdgsE7B;;AcpwEA;EAmEM,aAAwB;EACxB,YAAuB;AdqsE7B;;AelwEA;EAEE,4BhBA4B;EgBC5B,kBhBuDU;EgBtDV,kBAAkB;EAEhB,sCAXoD;Af8wExD;;AezwEA;EAUI,mBAAmB;EACnB,0BAA0B;AfmwE9B;;Ae9wEA;EAaI,mBAAmB;AfqwEvB;;AelxEA;;EAgBI,iBhBZ2B;ACmxE/B;;AevxEA;EAkBI,uBAAuB;AfywE3B;;Ae3xEA;EdyJI,acrI4B;EAC5B,kBAAkB;EAClB,WAAW;Af2wEf;;AejyEA;;;EA0BI,mBAAmB;Af6wEvB;;AevyEA;EAgCM,uBhB5ByB;EgB6BzB,chB1CuB;ACqzE7B;;Ae5yEA;EAgCM,yBhBzCuB;EgB0CvB,YhB7ByB;AC6yE/B;;AejzEA;EAgCM,4BhB9BwB;EgB+BxB,yBLoCe;AVivErB;;AetzEA;EAgCM,yBhBrCwB;EgBsCxB,WLsCU;AVovEhB;;Ae3zEA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyvEhB;;Aeh0EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV8uErE;;Aer0EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmwEhB;;Ae10EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVwvErE;;Ae/0EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6wEhB;;Aep1EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVkwErE;;Aez1EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuxEhB;;Ae91EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AV4wErE;;Aen2EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVmyErB;;Aex2EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVsxErE;;Ae72EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV2yEhB;;Ael3EA;EAuCU,yBLuCsC;EKtCtC,cL+C2D;AVgyErE;;AgBx3EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjBwDqB;EiBvDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB03Eb;;AgBp4EA;EAYI,yBjBX2B;ACu4E/B;;AgBx4EA;EAcI,yBjBjB0B;AC+4E9B;;AgB54EA;EAgBI,yBjBnB0B;ACm5E9B;;AgBh5EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk4EhB;;AgBr5EA;EAyBQ,uBjBpBuB;ACo5E/B;;AgBz5EA;EA2BQ,uBjBtBuB;ACw5E/B;;AgB75EA;EA6BQ,uBjBxBuB;AC45E/B;;AgBj6EA;EA+BQ,mEAA2F;AhBs4EnG;;AgBr6EA;EAyBQ,yBjBjCqB;ACi7E7B;;AgBz6EA;EA2BQ,yBjBnCqB;ACq7E7B;;AgB76EA;EA6BQ,yBjBrCqB;ACy7E7B;;AgBj7EA;EA+BQ,qEAA2F;AhBs5EnG;;AgBr7EA;EAyBQ,4BjBtBsB;ACs7E9B;;AgBz7EA;EA2BQ,4BjBxBsB;AC07E9B;;AgB77EA;EA6BQ,4BjB1BsB;AC87E9B;;AgBj8EA;EA+BQ,wEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjB7BsB;AC68E9B;;AgBz8EA;EA2BQ,yBjB/BsB;ACi9E9B;;AgB78EA;EA6BQ,yBjBjCsB;ACq9E9B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,yBjBf0B;AC+8ElC;;AgBz9EA;EA2BQ,yBjBjB0B;ACm9ElC;;AgB79EA;EA6BQ,yBjBnB0B;ACu9ElC;;AgBj+EA;EA+BQ,qEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjBb0B;AC69ElC;;AgBz+EA;EA2BQ,yBjBf0B;ACi+ElC;;AgB7+EA;EA6BQ,yBjBjB0B;ACq+ElC;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBd0B;AC8+ElC;;AgBz/EA;EA2BQ,yBjBhB0B;ACk/ElC;;AgB7/EA;EA6BQ,yBjBlB0B;ACs/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBhB0B;ACggFlC;;AgBzgFA;EA2BQ,yBjBlB0B;ACogFlC;;AgB7gFA;EA6BQ,yBjBpB0B;ACwgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBjB0B;ACihFlC;;AgBzhFA;EA2BQ,yBjBnB0B;ACqhFlC;;AgB7hFA;EA6BQ,yBjBrB0B;ACyhFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBXyB;AC2hFjC;;AgBziFA;EA2BQ,yBjBbyB;AC+hFjC;;AgB7iFA;EA6BQ,yBjBfyB;ACmiFjC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBuhF9B;;AgBjkFA;EA4CM,6BAA6B;AhByhFnC;;AgBrkFA;EA8CM,6BAA6B;AhB2hFnC;;AgBzkFA;EAgDM,oBAAoB;AhB6hF1B;;AgB7kFA;EAoDI,ejBxBY;ACqjFhB;;AgBjlFA;EAsDI,ejB5BY;AC2jFhB;;AgBrlFA;EAwDI,cjB/BW;ACgkFf;;AgB/hFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AgBxiFA;EACE;IACE,2BAA2B;EhBkiF7B;EgBjiFA;IACE,4BAA4B;EhBmiF9B;AACF;;AiB/kFA;EAEE,uBlBhB6B;EkBiB7B,clB1B4B;AC2mF9B;;AiBplFA;;EAMI,yBlBzB0B;EkB0B1B,qBA9B6B;EA+B7B,qBA9B6B;EA+B7B,mBAAmB;AjBmlFvB;;AiB5lFA;;EAeQ,uBlB7BuB;EkB8BvB,mBlB9BuB;EkB+BvB,clB5CqB;AC8nF7B;;AiBnmFA;;EAeQ,yBlB1CqB;EkB2CrB,qBlB3CqB;EkB4CrB,YlB/BuB;ACwnF/B;;AiB1mFA;;EAeQ,4BlB/BsB;EkBgCtB,wBlBhCsB;EkBiCtB,yBPkCa;AV8jFrB;;AiBjnFA;;EAeQ,yBlBtCsB;EkBuCtB,qBlBvCsB;EkBwCtB,WPoCQ;AVmkFhB;;AiBxnFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPoCQ;AV0kFhB;;AiB/nFA;;EAeQ,yBlBtB0B;EkBuB1B,qBlBvB0B;EkBwB1B,WPoCQ;AVilFhB;;AiBtoFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPoCQ;AVwlFhB;;AiB7oFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPoCQ;AV+lFhB;;AiBppFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,yBPkCa;AVwmFrB;;AiB3pFA;;EAeQ,yBlBpByB;EkBqBzB,qBlBrByB;EkBsBzB,WPoCQ;AV6mFhB;;AiBlqFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBmpFf;;AiBxqFA;;EAuBM,yBlBhC4B;EkBiC5B,WP6BU;AVynFhB;;AiB9qFA;;;;EA2BQ,mBAAmB;AjB0pF3B;;AiBrrFA;;EA6BM,sBAAsB;AjB6pF5B;;AiB1rFA;EA+BI,clBtD0B;ACqtF9B;;AiB9rFA;EAiCM,mBAAmB;AjBiqFzB;;AiBlsFA;EAoCM,yBlB7C4B;EkB8C5B,WPgBU;AVkpFhB;;AiBvsFA;;EAwCQ,mBAAmB;AjBoqF3B;;AiB5sFA;;EA2CQ,kBPUQ;EOTR,mBAAmB;AjBsqF3B;;AiBltFA;EA8CI,6BA5DqC;AjBouFzC;;AiBttFA;;EAiDM,qBApEgC;EAqEhC,clBzEwB;ACmvF9B;;AiB5tFA;EAoDI,6BAhEqC;AjB4uFzC;;AiBhuFA;;EAuDM,qBAxEgC;EAyEhC,clB/EwB;AC6vF9B;;AiBtuFA;EA0DI,6BAvEqC;AjBuvFzC;;AiB1uFA;;EA+DU,sBAAsB;AjBgrFhC;;AiB/uFA;;EAoEM,iBAAiB;AjBgrFvB;;AiBpvFA;;EAyEU,wBAAwB;AjBgrFlC;;AiBzvFA;EA2EI,WAAW;AjBkrFf;;AiB7vFA;EAgFU,yBlB/FoB;ACgxF9B;;AiBjwFA;EAqFY,yBlBpGkB;ACoxF9B;;AiBrwFA;EAuFc,4BlBvGgB;ACyxF9B;;AiBzwFA;;EA2FM,qBAAqB;AjBmrF3B;;AiB9wFA;EAgGU,yBlB/GoB;ACiyF9B;;AiBhrFA;EhBjEE,iCAAiC;EgBoEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBkrFjB;;AkB7yFA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBgzF7B;;AkBpzFA;EAMI,qBAAqB;AlBkzFzB;;AkBxzFA;EjBmJI,oBiB3IwC;AlBozF5C;;AkB5zFA;EAUI,sBAAsB;AlBszF1B;;AkBh0FA;EAYI,mBAAmB;AlBwzFvB;;AkBp0FA;EAgBM,enBYO;AC4yFb;;AkBx0FA;EAmBM,kBnBQU;ACizFhB;;AkB50FA;EAqBI,uBAAuB;AlB2zF3B;;AkBh1FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB6zF1B;;AkBr1FA;EA0BI,yBAAyB;AlB+zF7B;;AkBz1FA;EA6BQ,mBAAmB;AlBg0F3B;;AkB71FA;EA+BQ,eAAe;AlBk0FvB;;AkBj2FA;EjBmJI,eiBjHmC;AlBm0FvC;;AkBr2FA;EjBmJI,ciB/GqC;EAE/B,yBAAyB;EACzB,4BAA4B;AlBo0FtC;;AkB32FA;EA6CU,0BAA0B;EAC1B,6BAA6B;AlBk0FvC;;AkB7zFA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBMU;EmBLV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg0FrB;;AkB50FA;EjBgGI,oBiBlFuC;EjBkFvC,uBiBjFyC;AlBk0F7C;;AkBj1FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg5F7B;;AkBt1FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw4F/B;;AkB31FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV40FrB;;AkBh2FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+0FhB;;AkBr2FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo1FhB;;AkB12FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVy0FrE;;AkB/2FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV81FhB;;AkBp3FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVm1FrE;;AkBz3FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw2FhB;;AkB93FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV61FrE;;AkBn4FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk3FhB;;AkBx4FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVu2FrE;;AkB74FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV83FrB;;AkBl5FA;EA4BU,yBRCsC;EQAtC,cRS2D;AVi3FrE;;AkBv5FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs4FhB;;AkB55FA;EA4BU,yBRCsC;EQAtC,cRS2D;AV23FrE;;AkBj6FA;EAgCI,kBnBtDY;AC27FhB;;AkBr6FA;EAkCI,enBzDS;ACg8Fb;;AkBz6FA;EAoCI,kBnB5DY;ACq8FhB;;AkB76FA;EjBgGI,qBiBzD0C;EjByD1C,sBiBxD0C;AlB04F9C;;AkBl7FA;EjBgGI,qBiBtD0C;EjBsD1C,sBiBrD0C;AlB44F9C;;AkBv7FA;EjBgGI,qBiBnD0C;EjBmD1C,sBiBlD0C;AlB84F9C;;AkB57FA;EjBgGI,gBiBvJmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+4Fd;;AkBn8FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg5FrC;;AkB98FA;EAgEM,WAAW;EACX,UAAU;AlBk5FhB;;AkBn9FA;EAmEM,WAAW;EACX,UAAU;AlBo5FhB;;AkBx9FA;EAuEM,yBAAmD;AlBq5FzD;;AkB59FA;EAyEM,yBAAoD;AlBu5F1D;;AkBh+FA;EA2EI,qBnBhEmB;ACy9FvB;;AkBv5FA;EAEI,0BAA0B;AlBy5F9B;;AmB/gGA;;EAGE,sBAAsB;AnBihGxB;;AmBphGA;;;;EAMI,oBAAoB;AnBqhGxB;;AmB3hGA;;EAQI,iBApBmB;AnB4iGvB;;AmBhiGA;;EAUI,iBArBmB;AnBgjGvB;;AmBriGA;;EAYI,sBAAsB;AnB8hG1B;;AmB5hGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgkGzB;;AmBniGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmkG7B;;AmBxiGA;EAWI,oBA3B+B;AnB4jGnC;;AmB5iGA;EAgBM,epBnBO;ACmjGb;;AmBhjGA;EAgBM,iBpBlBS;ACsjGf;;AmBpjGA;EAgBM,epBjBO;ACyjGb;;AmBxjGA;EAgBM,iBpBhBS;AC4jGf;;AmB5jGA;EAgBM,kBpBfU;AC+jGhB;;AmBhkGA;EAgBM,epBdO;ACkkGb;;AmBpkGA;EAgBM,kBpBbU;ACqkGhB;;AmBtjGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkmG3B;;AmB7jGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4kGrB;;AmBlkGA;EAWI,oBA7C+B;AnBwmGnC;;AmBtkGA;EAgBM,epBrCO;AC+lGb;;AmB1kGA;EAgBM,iBpBpCS;ACkmGf;;AmB9kGA;EAgBM,epBnCO;ACqmGb;;AmBllGA;EAgBM,iBpBlCS;ACwmGf;;AmBtlGA;EAgBM,kBpBjCU;AC2mGhB;;AmB1lGA;EAgBM,epBhCO;AC8mGb;;AmB9lGA;EAgBM,kBpB/BU;ACinGhB;;AoB/oGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkpG3B;;AoB7oGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBkDqB;EqBjDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgpGrB;;AqB9qGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBiCU;EuBhCV,cvB/B4B;ACgrG9B;;ACnnGI;EqB5BA,4BvBjC0B;ACorG9B;;ACvnGI;EqB5BA,4BvBjC0B;ACwrG9B;;AC3nGI;EqB5BA,4BvBjC0B;AC4rG9B;;AC/nGI;EqB5BA,4BvBjC0B;ACgsG9B;;AsB9pGE;EAEE,qBvBjC0B;ACisG9B;;AsB/pGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACyrGlC;;AsB9pGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACktG9B;;ACvpGI;;;;;EqBXE,+BvBhDwB;AC0tG9B;;AC/pGI;;;;;EqBXE,+BvBhDwB;ACkuG9B;;ACvqGI;;;;;EqBXE,+BvBhDwB;AC0uG9B;;AC/qGI;;;;;EqBXE,+BvBhDwB;ACkvG9B;;AuBpvGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsvGb;;AuBrvGE;EACE,gBAAgB;AvBwvGpB;;AuBpvGI;EACE,mBxBFyB;ACyvG/B;;AuBxvGK;EAMG,mDxBPuB;AC6vG/B;;AuB5vGI;EACE,qBxBfuB;AC8wG7B;;AuBhwGK;EAMG,gDxBpBqB;ACkxG7B;;AuBpwGI;EACE,wBxBJwB;AC2wG9B;;AuBxwGK;EAMG,mDxBTsB;AC+wG9B;;AuB5wGI;EACE,qBxBXwB;AC0xG9B;;AuBhxGK;EAMG,gDxBhBsB;AC8xG9B;;AuBpxGI;EACE,qBxBG4B;ACoxGlC;;AuBxxGK;EAMG,iDxBF0B;ACwxGlC;;AuB5xGI;EACE,qBxBK4B;AC0xGlC;;AuBhyGK;EAMG,iDxBA0B;AC8xGlC;;AuBpyGI;EACE,qBxBI4B;ACmyGlC;;AuBxyGK;EAMG,kDxBD0B;ACuyGlC;;AuB5yGI;EACE,qBxBE4B;AC6yGlC;;AuBhzGK;EAMG,kDxBH0B;ACizGlC;;AuBpzGI;EACE,qBxBC4B;ACszGlC;;AuBxzGK;EAMG,mDxBJ0B;AC0zGlC;;AuB5zGI;EACE,qBxBO2B;ACwzGjC;;AuBh0GK;EAMG,kDxBEyB;AC4zGjC;;AuB5zGE;EzBmBA,kBCyBgB;EDxBhB,kBCNc;ACmzGhB;;AuB/zGE;EzBoBA,kBCVc;ACyzGhB;;AuBj0GE;EzBoBA,iBCba;AC8zGf;;AuBl0GE;EACE,cAAc;EACd,WAAW;AvBq0Gf;;AuBp0GE;EACE,eAAe;EACf,WAAW;AvBu0Gf;;AuBr0GA;EAGI,qBxB8BmB;EwB7BnB,gDAA4D;EAC5D,iDAA6D;AvBs0GjE;;AuB30GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw0GpB;;AuBt0GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw0GlB;;AuB90GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo4GzB;;AuBn1GA;EAWI,eAAe;AvB40GnB;;AuBv1GA;EAcI,YAAY;AvB60GhB;;AwB94GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi5GpB;;AwBh5GE;EACE,eAAe;AxBm5GnB;;AwBl5GE;EACE,czBF0B;ACu5G9B;;AwBp5GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy5GvB;;AwBp5GA;EvB0II,kBuBvIqC;AxBq5GzC;;AyBx6GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB26GrB;;AyB/6GA;EAMI,a3BDkB;AE86GtB;;AyBn7GA;EAUM,qB1BU4B;EE8I9B,cwBvJ+B;EAC7B,UAAU;AzB66GhB;;AyBz7GA;EAeM,qB1BsDiB;EEqFnB,iBwB1IsC;AzB86G1C;;AyB97GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+6GjB;;AyBt8GA;EAyBM,aAAa;AzBi7GnB;;AyB18GA;;EA4BM,wB1BjBwB;ACo8G9B;;AyB/8GA;ExB0JI,oBwB5HwC;AzBq7G5C;;AyBn9GA;EAgCM,YAAY;EACZ,UAAU;AzBu7GhB;;AyBx9GA;EAmCQ,kBAAkB;AzBy7G1B;;AyB59GA;EAuCM,qB1BnCwB;AC49G9B;;AyBh+GA;EA6CQ,mB1BhCuB;ACu9G/B;;AyBp+GA;EA+CQ,mB1BlCuB;AC29G/B;;AyBx+GA;EAkDU,qBfyDuB;AVi4GjC;;AyB5+GA;EAuDU,mD1B1CqB;ACm+G/B;;AyBh/GA;EA6CQ,qB1B7CqB;ACo/G7B;;AyBp/GA;EA+CQ,qB1B/CqB;ACw/G7B;;AyBx/GA;EAkDU,mBfyDuB;AVi5GjC;;AyB5/GA;EAuDU,gD1BvDmB;ACggH7B;;AyBhgHA;EA6CQ,wB1BlCsB;ACy/G9B;;AyBpgHA;EA+CQ,wB1BpCsB;AC6/G9B;;AyBxgHA;EAkDU,qBfyDuB;AVi6GjC;;AyB5gHA;EAuDU,mD1B5CoB;ACqgH9B;;AyBhhHA;EA6CQ,qB1BzCsB;ACghH9B;;AyBphHA;EA+CQ,qB1B3CsB;ACohH9B;;AyBxhHA;EAkDU,qBfyDuB;AVi7GjC;;AyB5hHA;EAuDU,gD1BnDoB;AC4hH9B;;AyBhiHA;EA6CQ,qB1B3B0B;ACkhHlC;;AyBpiHA;EA+CQ,qB1B7B0B;ACshHlC;;AyBxiHA;EAkDU,qBfyDuB;AVi8GjC;;AyB5iHA;EAuDU,iD1BrCwB;AC8hHlC;;AyBhjHA;EA6CQ,qB1BzB0B;ACgiHlC;;AyBpjHA;EA+CQ,qB1B3B0B;ACoiHlC;;AyBxjHA;EAkDU,qBfyDuB;AVi9GjC;;AyB5jHA;EAuDU,iD1BnCwB;AC4iHlC;;AyBhkHA;EA6CQ,qB1B1B0B;ACijHlC;;AyBpkHA;EA+CQ,qB1B5B0B;ACqjHlC;;AyBxkHA;EAkDU,qBfyDuB;AVi+GjC;;AyB5kHA;EAuDU,kD1BpCwB;AC6jHlC;;AyBhlHA;EA6CQ,qB1B5B0B;ACmkHlC;;AyBplHA;EA+CQ,qB1B9B0B;ACukHlC;;AyBxlHA;EAkDU,qBfyDuB;AVi/GjC;;AyB5lHA;EAuDU,kD1BtCwB;AC+kHlC;;AyBhmHA;EA6CQ,qB1B7B0B;AColHlC;;AyBpmHA;EA+CQ,qB1B/B0B;ACwlHlC;;AyBxmHA;EAkDU,qBfyDuB;AVigHjC;;AyB5mHA;EAuDU,mD1BvCwB;ACgmHlC;;AyBhnHA;EA6CQ,qB1BvByB;AC8lHjC;;AyBpnHA;EA+CQ,qB1BzByB;ACkmHjC;;AyBxnHA;EAkDU,qBfyDuB;AVihHjC;;AyB5nHA;EAuDU,kD1BjCuB;AC0mHjC;;AyBhoHA;E3ByCE,kBCyBgB;EDxBhB,kBCNc;ACimHhB;;AyBroHA;E3B4CE,kBCVc;ACumHhB;;AyBzoHA;E3B8CE,iBCba;AC4mHf;;AyB7oHA;EAkEM,qB1B5DwB;AC2oH9B;;AyBjpHA;EAoEI,WAAW;AzBilHf;;AyBrpHA;EAsEM,WAAW;AzBmlHjB;;AyBzpHA;EA0EM,aAAa;EACb,kBAAkB;ExBuFpB,cwBtF+B;EAC7B,YAAY;EACZ,eAAe;AzBmlHrB;;AyBjqHA;EAgFM,kB1B5CU;ACioHhB;;AyBrqHA;EAkFM,kB1BhDU;ACuoHhB;;AyBzqHA;EAoFM,iB1BnDS;AC4oHf;;A0BhqHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BkqHpB;;A0BvqHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC0rH7B;;A0B7qHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,c3BjCmB;ACgsH7B;;A0BnrHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACssH7B;;A0BzrHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,c3B7CmB;AC4sH7B;;A0B/rHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACqsH/B;;A0BrsHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,Y3BpBqB;AC2sH/B;;A0B3sHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACitH/B;;A0BjtHA;EA8BU,uBhBgEuB;EgB/DvB,yBAAyB;EACzB,Y3BhCqB;ACutH/B;;A0BvtHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV4pHrB;;A0B7tHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkqHrB;;A0BnuHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVwqHrB;;A0BzuHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8qHrB;;A0B/uHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVkrHhB;;A0BrvHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwrHhB;;A0B3vHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV8rHhB;;A0BjwHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVosHhB;;A0BvwHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV0sHhB;;A0B7wHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgtHhB;;A0BnxHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVstHhB;;A0BzxHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4tHhB;;A0B/xHA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVkuHhB;;A0BryHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwuHhB;;A0B3yHA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV8uHhB;;A0BjzHA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVovHhB;;A0BvzHA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV0vHhB;;A0B7zHA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVgwHhB;;A0Bn0HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVswHhB;;A0Bz0HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AV4wHhB;;A0B/0HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVkxHhB;;A0Br1HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVwxHhB;;A0B31HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV8xHhB;;A0Bj2HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVoyHhB;;A0Bv2HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV4yHrB;;A0B72HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,yBhB6CW;AVkzHrB;;A0Bn3HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVwzHrB;;A0Bz3HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,yBhBiCW;AV8zHrB;;A0B/3HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVk0HhB;;A0Br4HA;EAkBU,yBhB4EuB;EgB3EvB,yBAAyB;EACzB,WhB+CM;AVw0HhB;;A0B34HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV80HhB;;A0Bj5HA;EA8BU,yBhBgEuB;EgB/DvB,yBAAyB;EACzB,WhBmCM;AVo1HhB;;A0Bv5HA;EAmCI,kB3BZY;ACo4HhB;;A0B35HA;EAqCI,e3BfS;ACy4Hb;;A0B/5HA;EAuCI,kB3BlBY;AC84HhB;;A0Bn6HA;EA0CQ,eAAe;A1B63HvB;;A0Bv6HA;EA4CI,iB3BxBW;ACu5Hf;;A0B36HA;EA+CQ,eAAe;A1Bg4HvB;;A0B/6HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bg4HhC;;A0Bp7HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bk4H/B;;A0Bz7HA;EA0DQ,kB3BJI;ACu4HZ;;A0B77HA;EA4DQ,aAAa;A1Bq4HrB;;A0Bj8HA;EA+DM,sBAAsB;A1Bs4H5B;;A0Br8HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1Bw4HtB;;A0B38HA;EAqEM,uBAAuB;A1B04H7B;;A0B/8HA;EAuEM,aAAa;EACb,YAAY;A1B44HlB;;A0Bp9HA;EA0EQ,eAAe;A1B84HvB;;A0Bx9HA;EA6EQ,eAAe;A1B+4HvB;;A0B59HA;EAgFQ,eAAe;A1Bg5HvB;;A0Bh+HA;EAmFQ,eAAe;A1Bi5HvB;;A0Bp+HA;EAsFQ,0BAA4C;A1Bk5HpD;;A0Bx+HA;EAwFQ,0B3BlCI;E2BmCJ,uBAAuB;A1Bo5H/B;;A0B7+HA;EA2FI,uBAAuB;A1Bs5H3B;;A0Bj/HA;EA8FM,WAAW;A1Bu5HjB;;A0Br/HA;EAgGM,YAAY;EACZ,eAAe;A1By5HrB;;A0B1/HA;EAmGI,yBAAyB;A1B25H7B;;A0B9/HA;EAqGM,0BAA4C;A1B65HlD;;A0BlgIA;EAuGM,0B3BjDM;E2BkDN,2BAA2B;EAC3B,SAAS;A1B+5Hf;;A0B75HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bg6HpB;;A0Bt6HA;EASM,yBhBtB2B;EgBuB3B,c3B9HwB;AC+hI9B;;A0B36HA;EAYM,qBhBzB2B;AV47HjC;;A0B/6HA;EAeM,yBhB5B2B;EgB6B3B,c3BpIwB;ACwiI9B;;A0Bp7HA;EAkBM,qBhB/B2B;AVq8HjC;;A0Bp6HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bu6Hb;;A0Br6HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BtFU;E2BuFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bu6HrB;;A0Br6HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACokI9B;;A0Bt6HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1By6HzB;;A0Bv6HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBvBrB,mByBwBmC;EACrC,UAAU;A1B06HZ;;A0Bh7HA;EAQI,eAAe;A1B46HnB;;A2B5lIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC8jIjB;;A2BnmIA;EAMI,oBAAoB;A3BimIxB;;A2BvmIA;EASI,kB5BsBY;AC4kIhB;;A2B3mIA;EAWI,kB5BkBY;ACklIhB;;A2B/mIA;EAaI,iB5BeW;ACulIf;;A2BpmIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BumIrB;;A2B1mIA;EAOM,Y5BdyB;ACqnI/B;;A2B9mIA;EAOM,c5B3BuB;ACsoI7B;;A2BlnIA;EAOM,iB5BhBwB;AC+nI9B;;A2BtnIA;EAOM,c5BvBwB;AC0oI9B;;A2B1nIA;EAOM,c5BT4B;ACgoIlC;;A2B9nIA;EAOM,c5BP4B;ACkoIlC;;A2BloIA;EAOM,c5BR4B;ACuoIlC;;A2BtoIA;EAOM,c5BV4B;AC6oIlC;;A2B1oIA;EAOM,c5BX4B;ACkpIlC;;A2B9oIA;EAOM,c5BL2B;ACgpIjC;;A2BvoIA;EAEI,sBAAsB;A3ByoI1B;;A2B3oIA;EAKI,aAAa;EACb,2BAA2B;A3B0oI/B;;A2BhpIA;E1B2HI,kB0BlHwC;A3B2oI5C;;A2BppIA;;;EAcU,gBAAgB;A3B4oI1B;;A2B1pIA;;;EAoBY,6BAA6B;EAC7B,0BAA0B;A3B4oItC;;A2BjqIA;;;EA8BY,4BAA4B;EAC5B,yBAAyB;A3ByoIrC;;A2BxqIA;;;;;EAyCY,UAAU;A3BuoItB;;A2BhrIA;;;;;;;;;EA8CY,UAAU;A3B8oItB;;A2B5rIA;;;;;;;;;EAgDc,UAAU;A3BwpIxB;;A2BxsIA;EAkDQ,YAAY;EACZ,cAAc;A3B0pItB;;A2B7sIA;EAqDM,uBAAuB;A3B4pI7B;;A2BjtIA;EAuDM,yBAAyB;A3B8pI/B;;A2BrtIA;EA0DQ,YAAY;EACZ,cAAc;A3B+pItB;;A2B1tIA;EA6DI,aAAa;EACb,2BAA2B;A3BiqI/B;;A2B/tIA;EAgEM,cAAc;A3BmqIpB;;A2BnuIA;EAkEQ,gBAAgB;E1ByDpB,qB0BxD2C;A3BqqI/C;;A2BxuIA;EAqEQ,YAAY;EACZ,cAAc;A3BuqItB;;A2B7uIA;EAwEM,uBAAuB;A3ByqI7B;;A2BjvIA;EA0EM,yBAAyB;A3B2qI/B;;A2BrvIA;EA4EM,eAAe;A3B6qIrB;;A2BzvIA;EAgFU,sBAAsB;A3B6qIhC;;A2B7vIA;EAkFQ,uBAAuB;A3B+qI/B;;A2BjwIA;EAoFQ,gBAAgB;A3BirIxB;;ACrsIE;E0BhEF;IAuFM,aAAa;E3BmrIjB;AACF;;A2BlrIA;EAEI,kBAAkB;A3BorItB;;ACntIE;E0B6BF;IAII,qBAAqB;E3BurIvB;AACF;;ACrtIE;E0ByBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1B0Bd,oB0BzBsC;IACtC,iBAAiB;E3B2rInB;E2BrsIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B4rIxB;E2BzsIF;IAeM,oBAAoB;E3B6rIxB;E2B5sIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B8rIxB;E2BhtIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3B+rIxB;AACF;;A2B9rIA;EAEI,gBAAgB;A3BgsIpB;;AClvIE;E0BgDF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BmsIhB;E2B1sIF;IASM,gBAAgB;E3BosIpB;E2B7sIF;IAWM,cAAc;E3BqsIlB;E2BhtIF;IAaQ,YAAY;E3BssIlB;E2BntIF;I1BWI,qB0BI2C;E3BusI7C;AACF;;A2BtsIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3BysIrB;;A2B9sIA;;;EAaU,c5BxKoB;AC+2I9B;;A2BptIA;;;EAeQ,kB5B3IQ;ACs1IhB;;A2B1tIA;;;EAiBQ,kB5B/IQ;AC81IhB;;A2BhuIA;;;EAmBQ,iB5BlJO;ACq2If;;A2BtuIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BqtIhB;;A2BhvIA;;EA+BM,mB7B1LgB;AEg5ItB;;A2BrvIA;EAiCM,OAAO;A3BwtIb;;A2BzvIA;;EAqCM,oB7BhMgB;AEy5ItB;;A2B9vIA;EAuCM,QAAQ;A3B2tId;;A2BlwIA;EA2CM,6BAA6B;E1BzC/B,c0B0C+B;EAC7B,YAAY;EACZ,UAAU;A3B2tIhB;;A2BzwIA;EAgDM,kB5B5KU;ACy4IhB;;A2B7wIA;EAkDM,kB5BhLU;AC+4IhB;;A2BjxIA;EAoDM,iB5BnLS;ACo5If;;A4Bv7IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B86IrB;;A6Bl7IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B87I3C;;A6B17IA;EAYM,c9BjBwB;ACm8I9B;;A6B97IA;EAcI,mBAAmB;EACnB,aAAa;A7Bo7IjB;;A6Bn8IA;E5BiJI,e4BhIoC;A7Bs7IxC;;A6Bv8IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bu7I5B;;A6B78IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7By7IvB;;A6Bl9IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B27I/B;;A6B19IA;E5BiJI,mB4B/GuC;A7B47I3C;;A6B99IA;E5BiJI,kB4B7GuC;A7B87I3C;;A6Bl+IA;;EAyCM,uBAAuB;A7B87I7B;;A6Bv+IA;;EA6CM,yBAAyB;A7B+7I/B;;A6B5+IA;EAgDI,kB9BrBY;ACq9IhB;;A6Bh/IA;EAkDI,kB9BzBY;AC29IhB;;A6Bp/IA;EAoDI,iB9B5BW;ACg+If;;A6Bx/IA;EAwDM,iBAAiB;A7Bo8IvB;;A6B5/IA;EA2DM,iBAAiB;A7Bq8IvB;;A6BhgJA;EA8DM,iBAAiB;A7Bs8IvB;;A6BpgJA;EAiEM,iBAAiB;A7Bu8IvB;;A8B7/IA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,eAAe;EACf,kBAAkB;A9BggJpB;;A8B7/IE;EACE,+BA3BiB;EA4BjB,gCA5BiB;A9B4hJrB;;A8B//IE;EACE,kCA9BiB;EA+BjB,mCA/BiB;A9BiiJrB;;A8BhgJA;EAEE,6BAjCwC;EAkCxC,oBAAoB;EACpB,kD/BxC2B;E+ByC3B,aAAa;A9BkgJf;;A8BhgJA;EACE,mBAAmB;EACnB,c/BzC4B;E+B0C5B,aAAa;EACb,YAAY;EACZ,gB/BNe;E+BOf,qBA1CgC;A9B6iJlC;;A8BzgJA;EAQI,uBAAuB;A9BqgJ3B;;A8BngJA;E7BgBE,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,mBAAmB;EACnB,oBAAoB;EACpB,cAAc;EACd,SAAS;EACT,UAAU;E6BvBV,mBAAmB;EACnB,eAAe;EACf,aAAa;EACb,uBAAuB;EACvB,qBApDgC;A9BmkJlC;;A8B7gJA;EACE,cAAc;EACd,kBAAkB;A9BghJpB;;A8BlhJA;EAKM,+BA/De;EAgEf,gCAhEe;A9BilJrB;;A8BvhJA;EASM,kCAnEe;EAoEf,mCApEe;A9BslJrB;;A8BhhJA;EAEE,6BAhEyC;EAiEzC,eAhE2B;A9BklJ7B;;A8BhhJA;EAEE,6BAlEwC;EAmExC,6B/BxE6B;E+ByE7B,oBAAoB;EACpB,aAAa;A9BkhJf;;A8BhhJA;EACE,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,YAAY;EACZ,cAAc;EACd,uBAAuB;EACvB,gBA5E2B;A9B+lJ7B;;A8B1hJA;E7BqEI,+BFjJ2B;AC0mJ/B;;A8BjhJA;EAEI,qB/BtDkB;ACykJtB;;A+BpmJA;EACE,oBAAoB;EACpB,kBAAkB;EAClB,mBAAmB;A/BumJrB;;A+B1mJA;EAOM,cAAc;A/BumJpB;;A+B9mJA;EAUM,UAAU;EACV,QAAQ;A/BwmJd;;A+BnnJA;EAcM,YAAY;EACZ,mBA9BuB;EA+BvB,oBAAoB;EACpB,SAAS;A/BymJf;;A+BvmJA;EACE,aAAa;E9B2HX,O8B1HqB;EACvB,gBAzC6B;EA0C7B,gBAtC2B;EAuC3B,kBAAkB;EAClB,SAAS;EACT,WApCqB;A/B8oJvB;;A+BxmJA;EACE,uBhCnC6B;EgCoC7B,kBhCkBU;EgCjBV,0FhClD2B;EgCmD3B,sBA9CsC;EA+CtC,mBA9CmC;A/BypJrC;;Ae7oJgB;EgBqCd,chClD4B;EgCmD5B,cAAc;EACd,mBAAmB;EACnB,gBAAgB;EAChB,sBAAsB;EACtB,kBAAkB;A/B4mJpB;;A+B1mJA;;E9B4FI,mB8B1FmC;EACrC,mBAAmB;EACnB,mBAAmB;EACnB,WAAW;A/B6mJb;;A+BlnJA;;EAOI,4BhC1D0B;EgC2D1B,chCtEyB;ACsrJ7B;;A+BxnJA;;EAUI,yBhCpD8B;EgCqD9B,WrBOY;AV4mJhB;;A+BjnJA;EACE,yBhCnE6B;EgCoE7B,YAAY;EACZ,cAAc;EACd,WAAW;EACX,gBAAgB;A/BonJlB;;AgClsJA;EAEE,mBAAmB;EACnB,8BAA8B;AhCosJhC;;AgCvsJA;EAKI,kBjC4DQ;AC0oJZ;;AgC3sJA;EAOI,qBAAqB;EACrB,mBAAmB;AhCwsJvB;;AgChtJA;EAWI,aAAa;AhCysJjB;;AgCptJA;;EAcM,aAAa;AhC2sJnB;;AgCztJA;EAgBM,aAAa;AhC6sJnB;;AgC7tJA;EAmBQ,gBAAgB;E/BqIpB,qB+B1JuC;AhCouJ3C;;AgCluJA;EAsBQ,YAAY;AhCgtJpB;;ACzoJE;E+B7FF;IAyBI,aAAa;EhCktJf;EgC3uJF;IA4BQ,YAAY;EhCktJlB;AACF;;AgCjtJA;EACE,mBAAmB;EACnB,aAAa;EACb,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,uBAAuB;AhCotJzB;;AgC1tJA;;EASI,gBAAgB;AhCstJpB;;ACpqJE;E+B3DF;IAaM,sBA7CqC;EhCowJzC;AACF;;AgCttJA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AhCytJhB;;AgC7tJA;;EAQM,YAAY;AhC0tJlB;;AClrJE;E+BhDF;;I/B2GI,qB+B1JuC;EhCuxJzC;AACF;;AgC3tJA;EACE,mBAAmB;EACnB,2BAA2B;AhC8tJ7B;;AClsJE;E+B9BF;IAMM,kBAAkB;EhC+tJtB;AACF;;ACpsJE;E+BlCF;IAQI,aAAa;EhCmuJf;AACF;;AgCluJA;EACE,mBAAmB;EACnB,yBAAyB;AhCquJ3B;;AC/sJE;E+BxBF;IAKI,aAAa;EhCuuJf;AACF;;AiC3yJA;EACE,uBAAuB;EACvB,aAAa;EACb,mBAAmB;AjC8yJrB;;AiCjzJA;EAKI,sBAV2B;AjC0zJ/B;;AiCrzJA;EAOI,8ClCR0B;EkCS1B,aAAa;EACb,oBAb2B;AjC+zJ/B;;AiC3zJA;;EAYM,qBAfgC;AjCm0JtC;;AiCh0JA;EAcM,mBAhBwB;AjCs0J9B;;AiCp0JA;EAgBQ,kBAlBsB;AjC00J9B;;AiCx0JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCq1JpB;;AiC90JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjCy1J5B;;AiCxzJA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC2zJhB;;AiCzzJA;EhCgHI,kBgCxJgB;AjCq2JpB;;AiC1zJA;EhC6GI,iBgCxJgB;AjCy2JpB;;AiC3zJA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC8zJrB;;ACvxJE;EgC3CF;IAQI,gBAAgB;EjC+zJlB;AACF;;AkCt2JA;EACE,enCgBW;ACy1Jb;;AkC12JA;EAII,kBnCcY;AC41JhB;;AkC92JA;EAMI,kBnCUY;ACk2JhB;;AkCl3JA;EAQI,iBnCOW;ACu2Jf;;AkC52JA;EACE,iBArB0B;AlCo4J5B;;AkCh3JA;EAGI,kBnCmCc;EmClCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC04JrC;;AkCv3JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACo5J9B;;AkC53JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV60JhB;;AkCj4JA;EjC8HI,8BFlJ0B;EmCqCxB,cAnC0B;EjCgJ5B,oBiC/IkC;AlCw5JtC;;AkCn3JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCs3J3B;;AkC13JA;EAMI,eAtCoB;AlC85JxB;;AkC93JA;EAQI,kBAxCoB;AlCk6JxB;;AmC75JA;EAEE,4BpCZ4B;EoCa5B,kBpC2CU;EoC1CV,epCUW;ACq5Jb;;AmCn6JA;EAMI,mBAAmB;AnCi6JvB;;AmCv6JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCm6J9B;;AmC56JA;EAYI,kBpCGY;ACi6JhB;;AmCh7JA;EAcI,kBpCDY;ACu6JhB;;AmCp7JA;EAgBI,iBpCJW;AC46Jf;;AmCx7JA;EAsCM,uBAH+C;AnCy5JrD;;AmC57JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACs9J7B;;AmCj8JA;EA2CQ,mBpCnDuB;AC68J/B;;AmCr8JA;EAsCM,yBAH+C;AnCs6JrD;;AmCz8JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACs9J/B;;AmC98JA;EA2CQ,qBpChEqB;ACu+J7B;;AmCl9JA;EAsCM,yBAH+C;AnCm7JrD;;AmCt9JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVk6JrB;;AmC39JA;EA2CQ,wBpCrDsB;ACy+J9B;;AmC/9JA;EAsCM,yBAH+C;AnCg8JrD;;AmCn+JA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV66JhB;;AmCx+JA;EA2CQ,qBpC5DsB;AC6/J9B;;AmC5+JA;EAsCM,yBzB4B0C;AV86JhD;;AmCh/JA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV07JhB;;AmCr/JA;EA2CQ,qBpC9C0B;EoC+C1B,czB+B6D;AV+6JrE;;AmC1/JA;EAsCM,yBzB4B0C;AV47JhD;;AmC9/JA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVw8JhB;;AmCngKA;EA2CQ,qBpC5C0B;EoC6C1B,czB+B6D;AV67JrE;;AmCxgKA;EAsCM,yBzB4B0C;AV08JhD;;AmC5gKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVs9JhB;;AmCjhKA;EA2CQ,qBpC7C0B;EoC8C1B,czB+B6D;AV28JrE;;AmCthKA;EAsCM,yBzB4B0C;AVw9JhD;;AmC1hKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVo+JhB;;AmC/hKA;EA2CQ,qBpC/C0B;EoCgD1B,czB+B6D;AVy9JrE;;AmCpiKA;EAsCM,yBzB4B0C;AVs+JhD;;AmCxiKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVo/JrB;;AmC7iKA;EA2CQ,qBpChD0B;EoCiD1B,czB+B6D;AVu+JrE;;AmCljKA;EAsCM,yBzB4B0C;AVo/JhD;;AmCtjKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AVggKhB;;AmC3jKA;EA2CQ,qBpC1CyB;EoC2CzB,czB+B6D;AVq/JrE;;AmClhKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCqhKpB;;AmC/hKA;EAYI,YAAY;EACZ,cAAc;ElC0Ed,mBkCzEsC;AnCuhK1C;;AmCriKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnCyhK9B;;AmCvhKA;EACE,qBpChF4B;EoCiF5B,kBpCtBU;EoCuBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC2mKnC;;AmChiKA;;EASI,uBpCnF2B;AC+mK/B;;AmCriKA;EAWI,6BAlFgD;AnCgnKpD;;AoChmKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC0oKZ;;AoC1mKA;EAWI,aAAa;ApCmmKjB;;AoCjmKA;EAEE,wCrC/C2B;ACkpK7B;;AoCjmKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApComKb;;ACxkKE;EmClCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpC+pKzB;AACF;;AoCtmKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCgGb,WmCxJoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCoqK7B;;AoCtmKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApCymKzB;;AoCvmKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC0mKpB;;AoCxmKA;EACE,gCrCjF4B;EqCkF5B,2BrCtBgB;EqCuBhB,4BrCvBgB;ACkoKlB;;AoCzmKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApCyrKhC;;AoC1mKA;EACE,8BrCjCgB;EqCkChB,+BrClCgB;EqCmChB,6BrC/F4B;AC4sK9B;;AoChnKA;EnCsDI,mBmChDuC;ApC8mK3C;;AoC5mKA;EnChDE,iCAAiC;EmCkDjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCqsK9B;;AqCzqKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCkuKb;;AqChrKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC6uK7B;;AqCrrKA;;EAcU,ctCtEmB;ACkvK7B;;AqC1rKA;;;;EAoBY,yB3B+BqB;E2B9BrB,ctC7EiB;AC0vK7B;;AqClsKA;EAwBY,qBtChFiB;AC8vK7B;;AqCtsKA;EA0BQ,ctClFqB;ACkwK7B;;AC/qKE;EoC3BF;;;;IAgCY,ctCxFiB;EC0wK3B;EqCltKF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,ctC/Fe;ECuxK3B;EqC/tKF;;IA0Cc,qBtClGe;EC2xK3B;EqCnuKF;;;IA8CU,yB3BKuB;I2BJvB,ctCvGmB;ECiyK3B;EqCzuKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECqyK3B;AACF;;AqC9uKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC8xK/B;;AqCnvKA;;EAcU,YtCzDqB;ACmyK/B;;AqCxvKA;;;;EAoBY,uB3B+BqB;E2B9BrB,YtChEmB;AC2yK/B;;AqChwKA;EAwBY,mBtCnEmB;AC+yK/B;;AqCpwKA;EA0BQ,YtCrEuB;ACmzK/B;;AC7uKE;EoC3BF;;;;IAgCY,YtC3EmB;EC2zK7B;EqChxKF;;;;;;;;;;IAsCc,uB3BamB;I2BZnB,YtClFiB;ECw0K7B;EqC7xKF;;IA0Cc,mBtCrFiB;EC40K7B;EqCjyKF;;;IA8CU,uB3BKuB;I2BJvB,YtC1FqB;ECk1K7B;EqCvyKF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECs1K7B;AACF;;AqC5yKA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV2xKrB;;AqCjzKA;;EAcU,yB3BQW;AVgyKrB;;AqCtzKA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AVwyKrB;;AqC9zKA;EAwBY,gC3BFS;AV4yKrB;;AqCl0KA;EA0BQ,yB3BJa;AVgzKrB;;AC3yKE;EoC3BF;;;;IAgCY,yB3BVS;EVwzKnB;EqC90KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVq0KnB;EqC31KF;;IA0Cc,gC3BpBO;EVy0KnB;EqC/1KF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EV+0KnB;EqCr2KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVm1KnB;AACF;;AqC12KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVu1KhB;;AqC/2KA;;EAcU,W3BUM;AV41KhB;;AqCp3KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVo2KhB;;AqC53KA;EAwBY,kB3BAI;AVw2KhB;;AqCh4KA;EA0BQ,W3BFQ;AV42KhB;;ACz2KE;EoC3BF;;;;IAgCY,W3BRI;EVo3Kd;EqC54KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVi4Kd;EqCz5KF;;IA0Cc,kB3BlBE;EVq4Kd;EqC75KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV24Kd;EqCn6KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EV+4Kd;AACF;;AqCx6KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVq5KhB;;AqC76KA;;EAcU,W3BUM;AV05KhB;;AqCl7KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVk6KhB;;AqC17KA;EAwBY,kB3BAI;AVs6KhB;;AqC97KA;EA0BQ,W3BFQ;AV06KhB;;ACv6KE;EoC3BF;;;;IAgCY,W3BRI;EVk7Kd;EqC18KF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV+7Kd;EqCv9KF;;IA0Cc,kB3BlBE;EVm8Kd;EqC39KF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVy8Kd;EqCj+KF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV68Kd;AACF;;AqCt+KA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVm9KhB;;AqC3+KA;;EAcU,W3BUM;AVw9KhB;;AqCh/KA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVg+KhB;;AqCx/KA;EAwBY,kB3BAI;AVo+KhB;;AqC5/KA;EA0BQ,W3BFQ;AVw+KhB;;ACr+KE;EoC3BF;;;;IAgCY,W3BRI;EVg/Kd;EqCxgLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV6/Kd;EqCrhLF;;IA0Cc,kB3BlBE;EVigLd;EqCzhLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVugLd;EqC/hLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV2gLd;AACF;;AqCpiLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVihLhB;;AqCziLA;;EAcU,W3BUM;AVshLhB;;AqC9iLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV8hLhB;;AqCtjLA;EAwBY,kB3BAI;AVkiLhB;;AqC1jLA;EA0BQ,W3BFQ;AVsiLhB;;ACniLE;EoC3BF;;;;IAgCY,W3BRI;EV8iLd;EqCtkLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EV2jLd;EqCnlLF;;IA0Cc,kB3BlBE;EV+jLd;EqCvlLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVqkLd;EqC7lLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EVykLd;AACF;;AqClmLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AV+kLhB;;AqCvmLA;;EAcU,W3BUM;AVolLhB;;AqC5mLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AV4lLhB;;AqCpnLA;EAwBY,kB3BAI;AVgmLhB;;AqCxnLA;EA0BQ,W3BFQ;AVomLhB;;ACjmLE;EoC3BF;;;;IAgCY,W3BRI;EV4mLd;EqCpoLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVynLd;EqCjpLF;;IA0Cc,kB3BlBE;EV6nLd;EqCrpLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EVmoLd;EqC3pLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVuoLd;AACF;;AqChqLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AV+oLrB;;AqCrqLA;;EAcU,yB3BQW;AVopLrB;;AqC1qLA;;;;EAoBY,yB3B+BqB;E2B9BrB,yB3BCS;AV4pLrB;;AqClrLA;EAwBY,gC3BFS;AVgqLrB;;AqCtrLA;EA0BQ,yB3BJa;AVoqLrB;;AC/pLE;EoC3BF;;;;IAgCY,yB3BVS;EV4qLnB;EqClsLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,yB3BjBO;EVyrLnB;EqC/sLF;;IA0Cc,gC3BpBO;EV6rLnB;EqCntLF;;;IA8CU,yB3BKuB;I2BJvB,yB3BzBW;EVmsLnB;EqCztLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVusLnB;AACF;;AqC9tLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV2sLhB;;AqCnuLA;;EAcU,W3BUM;AVgtLhB;;AqCxuLA;;;;EAoBY,yB3B+BqB;E2B9BrB,W3BGI;AVwtLhB;;AqChvLA;EAwBY,kB3BAI;AV4tLhB;;AqCpvLA;EA0BQ,W3BFQ;AVguLhB;;AC7tLE;EoC3BF;;;;IAgCY,W3BRI;EVwuLd;EqChwLF;;;;;;;;;;IAsCc,yB3BamB;I2BZnB,W3BfE;EVqvLd;EqC7wLF;;IA0Cc,kB3BlBE;EVyvLd;EqCjxLF;;;IA8CU,yB3BKuB;I2BJvB,W3BvBM;EV+vLd;EqCvxLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVmwLd;AACF;;AqC5xLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC0uLf;;AqCnyLA;EA2DI,gCtCxG0B;ACo1L9B;;AqCvyLA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArC+1LnB;;AqC9yLA;EAgEI,SAAS;ArCkvLb;;AqClzLA;EAkEM,iCtC/GwB;ACm2L9B;;AqCtzLA;EAoEI,MAAM;ArCsvLV;;AqCpvLA;;EAGI,oBA9HmB;ArCo3LvB;;AqCzvLA;;EAKI,uBAhImB;ArCy3LvB;;AqCvvLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCi4LvB;;AqCxvLA;EAIM,6BAA6B;ArCwvLnC;;AqCtvLA;EpCtFE,iCAAiC;EoCwFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArCyvLpB;;AqCvvLA;EAEE,ctCrJ4B;EEoB5B,eAAe;EACf,cAAc;EACd,eoCxBqB;EpCyBrB,kBAAkB;EAClB,coC1BqB;EpCuJnB,iBoCEkC;ArC6vLtC;;AC33LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBFiCQ;EEhCR,yDAAyD;EACzD,oCF0Ba;EEzBb,WAAW;AD83Lf;;AC73LI;EACE,oBAAoB;ADg4L1B;;AC/3LI;EACE,oBAAoB;ADk4L1B;;ACj4LI;EACE,oBAAoB;ADo4L1B;;ACn4LE;EACE,qCAAiC;ADs4LrC;;ACl4LM;EACE,wCAAwC;ADq4LhD;;ACp4LM;EACE,UAAU;ADu4LlB;;ACt4LM;EACE,0CAA0C;ADy4LlD;;AqCpyLA;EACE,aAAa;ArCuyLf;;AqCryLA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArCwyLpB;;AqC9yLA;;EASM,qBAAqB;EACrB,sBAAsB;ArC0yL5B;;AqCxyLA;;EAEE,eAAe;ArC2yLjB;;AqC7yLA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;AC+8LlC;;AqC5yLA;EACE,YAAY;EACZ,cAAc;ArC+yLhB;;AqCjzLA;EAII,mBA7KgC;ArC89LpC;;AqCrzLA;EAMI,UAAU;ArCmzLd;;AqCzzLA;EAQI,YAAY;EACZ,cAAc;ArCqzLlB;;AqC9zLA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArCuzLtC;;AqCp0LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;AC4+LlC;;AqCz0LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArC0zL9E;;AqCxzLA;EACE,YAAY;EACZ,cAAc;ArC2zLhB;;AqCzzLA;EpC3DI,oBoC4DoC;ArC4zLxC;;AqC7zLA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpCxDpB,coCyD6B;ArC6zLjC;;AqC3zLA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArC8zLrB;;AqCj0LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCg0LzB;;AqC9zLA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCi0LlB;;ACp9LE;EoC/BF;IAsLI,cAAc;ErCk0LhB;EqCj0LA;;IAGI,mBAAmB;IACnB,aAAa;ErCk0LjB;EqCj0LA;IAEI,aAAa;ErCk0LjB;EqC15LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCm0LnB;EqCt0LA;IAKI,cAAc;ErCo0LlB;EqCl0LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC+jMjB;EqCx0LA;IAKI,SAAS;ErCs0Lb;EqC30LA;IAOM,4CtCrQqB;EC4kM3B;EqC90LA;IASI,MAAM;ErCw0LV;EqCj1LA;IpClMA,iCAAiC;IoCgN3B,iCAA2C;IAC3C,cAAc;ErCu0LpB;EqCt0LA;;IAGI,oBA9QiB;ErCqlMrB;EqC10LA;;IAKI,uBAhRiB;ErCylMrB;AACF;;AC1gME;EoCmMA;;;;IAIE,oBAAoB;IACpB,aAAa;ErC20Lf;EqC9iMF;IAqOI,mBA1RmB;ErCsmMrB;EqC70LA;IAGI,kBA1R0B;ErCumM9B;EqCh1LA;;IAMM,mBAAmB;ErC80LzB;EqCp1LA;;IASM,kBtClOI;ECijMV;EqCx1LA;;;;IAgBQ,wCAAwC;ErC80LhD;EqC91LA;IAuBU,wCAAwC;ErC00LlD;EqCj2LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECioM3B;EqCr2LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECinMhC;EqC7+LF;IAsKI,aAAa;ErC00Lf;EqCv+LF;;IAgKI,mBAAmB;IACnB,aAAa;ErC20Lf;EqCt9LF;IA8IM,oBAAoB;ErC20LxB;EqC70LA;IAKM,oDAAoD;ErC20L1D;EqCh1LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErC40Lf;EqCx1LA;IAkBM,cAAc;ErCy0LpB;EqCx0LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErCy0LhC;EqCrgMF;IA8LI,YAAY;IACZ,cAAc;ErC00LhB;EqCz0LA;IACE,2BAA2B;IpCrM3B,kBoCsMoC;ErC20LtC;EqC10LA;IACE,yBAAyB;IpCxMzB,iBoCyMoC;ErC40LtC;EqCl9LF;IAwII,uBtCxV2B;IsCyV3B,8BtClSc;IsCmSd,+BtCnSc;IsCoSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCzMnB,OoC0MuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErC8pMpB;EqCh+LF;IAqJM,sBAAsB;IACtB,mBAAmB;ErC80LvB;EqC71LA;IpC1ME,mBoC2NuC;ErC+0LzC;EqCh2LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;ECwsM3B;EqCp2LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;ECwrMhC;EqC/0LE;IAEE,kBtC3TY;IsC4TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtCjUM;IsCkUN,uCAAuC;ErCg1L3C;EqCp3LA;IAsCI,UAAU;IACV,QAAQ;ErCi1LZ;EqCv/LF;IAwKI,cAAc;ErCk1LhB;EqCj1LA;;IpCpPE,qBoCuPyC;ErCk1L3C;EqCr1LA;;IpCpPE,sBoCyPyC;ErCo1L3C;EqCl1LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCsuMjB;EqCx1LA;IAKI,SAAS;ErCs1Lb;EqC31LA;IAOM,4CtC5ZqB;ECmvM3B;EqC91LA;IASI,MAAM;ErCw1LV;EqCv1LA;;IAGI,oBA/ZiB;ErCuvMrB;EqC31LA;;IAKI,uBAjaiB;ErC2vMrB;EqC/1LA;;IAOI,oBAA4D;ErC41LhE;EqCn2LA;;IASI,uBAA+D;ErC81LnE;EqC51LA;;IAGI,ctC7auB;EC0wM3B;EqCh2LA;;IAKI,6BAla2C;ErCiwM/C;EqC91LA;IAKM,yBtCzasB;ECqwM5B;AACF;;AqCz1LA;EAEI,iCAA2C;ArC21L/C;;AsCnvMA;EAEE,evCFW;EuCGX,gBAnC0B;AtCwxM5B;;AsCxvMA;EAMI,kBvCLY;AC2vMhB;;AsC5vMA;EAQI,kBvCTY;ACiwMhB;;AsChwMA;EAUI,iBvCZW;ACswMf;;AsCpwMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCkBiB;ACyuMvB;;AsC3wMA;EAkBM,qBvCgBiB;AC6uMvB;;AsC3vMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtC8vMpB;;AsC5vMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtC6vMpB;;AsC3vMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AEy0MtB;;AsCnwMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACi1M9B;;AsC1wMA;;;EAUI,qBvCjE8B;ACu0MlC;;AsChxMA;;;EAYI,iDvCvFyB;ACi2M7B;;AsCtxMA;;;EAcI,yBvCjF0B;EuCkF1B,qBvClF0B;EuCmF1B,gBAAgB;EAChB,cvCtF0B;EuCuF1B,YAAY;AtC8wMhB;;AsC5wMA;;EAEE,oBAtFkC;EAuFlC,qBAtFmC;EAuFnC,mBAAmB;AtC+wMrB;;AsC7wMA;EAEI,yBvCnF8B;EuCoF9B,qBvCpF8B;EuCqF9B,W5BzBY;AVwyMhB;;AsC7wMA;EACE,cvCrG4B;EuCsG5B,oBAAoB;AtCgxMtB;;AsC9wMA;EACE,eAAe;AtCixMjB;;AsClxMA;EAGI,gBAAgB;AtCmxMpB;;AC1yME;EqCxDF;IAmFI,eAAe;EtCoxMjB;EsC3yMF;;IA0BI,YAAY;IACZ,cAAc;EtCqxMhB;EsChyMF;IAcM,YAAY;IACZ,cAAc;EtCqxMlB;AACF;;ACrzME;EqCgBF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtCuxMV;EsC91MF;;;;IA4EI,gBAAgB;IAChB,aAAa;EtCwxMf;EsCvxMA;IACE,QAAQ;EtCyxMV;EsCxxMA;IACE,QAAQ;EtC0xMV;EsCt4MF;IA8GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtC2xMf;EsC9xMA;IAMM,QAAQ;EtC2xMd;EsCjyMA;IAQM,uBAAuB;IACvB,QAAQ;EtC4xMd;EsCryMA;IAWM,QAAQ;EtC6xMd;EsCxyMA;IAcM,QAAQ;EtC6xMd;EsC3yMA;IAgBM,QAAQ;EtC8xMd;EsC9yMA;IAkBM,yBAAyB;IACzB,QAAQ;EtC+xMd;AACF;;AuCr6MA;EACE,kBxCqCgB;EwCpChB,0FxChC2B;EwCiC3B,exCEW;ACs6Mb;;AuC36MA;EAKI,qBxCWkB;AC+5MtB;;AuC/6MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;ACk9M7B;;AuCp7MA;EAeQ,0BxChCuB;ACy8M/B;;AuCx7MA;EAiBQ,YxClCuB;AC68M/B;;AuC57MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;ACk9M/B;;AuCj8MA;EAeQ,4BxC7CqB;ACm+M7B;;AuCr8MA;EAiBQ,cxC/CqB;ACu+M7B;;AuCz8MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AV85MrB;;AuC98MA;EAeQ,+BxClCsB;ACq+M9B;;AuCl9MA;EAiBQ,iBxCpCsB;ACy+M9B;;AuCt9MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVy6MhB;;AuC39MA;EAeQ,4BxCzCsB;ACy/M9B;;AuC/9MA;EAiBQ,cxC3CsB;AC6/M9B;;AuCn+MA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AVs7MhB;;AuCx+MA;EAeQ,4BxC3B0B;ACw/MlC;;AuC5+MA;EAiBQ,cxC7B0B;AC4/MlC;;AuCh/MA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AVm8MhB;;AuCr/MA;EAeQ,4BxCzB0B;ACmgNlC;;AuCz/MA;EAiBQ,cxC3B0B;ACugNlC;;AuC7/MA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVg9MhB;;AuClgNA;EAeQ,4BxC1B0B;ACihNlC;;AuCtgNA;EAiBQ,cxC5B0B;ACqhNlC;;AuC1gNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AV69MhB;;AuC/gNA;EAeQ,4BxC5B0B;ACgiNlC;;AuCnhNA;EAiBQ,cxC9B0B;ACoiNlC;;AuCvhNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AV4+MrB;;AuC5hNA;EAeQ,4BxC7B0B;AC8iNlC;;AuChiNA;EAiBQ,cxC/B0B;ACkjNlC;;AuCpiNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AVu/MhB;;AuCziNA;EAeQ,4BxCvByB;ACqjNjC;;AuC7iNA;EAiBQ,cxCzByB;ACyjNjC;;AuC9hNA;;EAGI,gCxC3C2B;AC2kN/B;;AuC9hNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvCslNlC;;AuC/hNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvCkiNzB;;AuCtiNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvCoiNlB;;AuC5iNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;AC4mN9B;;AuCniNA;EAEI,cxC1E0B;AC+mN9B;;AuCviNA;EAIM,cxC7D4B;AComNlC;;AuCriNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCwiNvB;;AuC7iNA;EtCuEI,oBsChEsC;AvC0iN1C;;AuCjjNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvC4iNf;;AuCvjNA;EAaI,eAAe;AvC8iNnB;;AuC3jNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;AC+oN9B;;AuChkNA;EAkBM,cxCjF4B;ACmoNlC;;AuCpkNA;EAoBI,8BxCnCc;EwCoCd,+BxCpCc;ACwlNlB;;AuCljNA;;EAEE,eAAe;AvCqjNjB;;AuCvjNA;;EAII,4BxCnG0B;AC2pN9B;;AuCtjNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EEoJ1B,oBsCvCoC;AvC+jNxC;;AuClkNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCikNxB;;AwC3pNA;EvCgCE,iCAAiC;EuC5BjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxC4pNrB;;AwCtqNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxC8pNvB;;AwCnrNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACgtN9B;;AwCxrNA;EA0BI,cAAc;AxCkqNlB;;AwC5rNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACysNlC;;AwCjsNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxCqqN/B;;AwC5sNA;EAyCM,qBAAqB;AxCuqN3B;;AwChtNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCyqN3B;;AwCvtNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxC2qN1B;;AwC5tNA;EvC8HI,mBuC1EuC;AxC4qN3C;;AwChuNA;EvC8HI,kBuCxEuC;AxC8qN3C;;AwCpuNA;EA0DM,uBAAuB;AxC8qN7B;;AwCxuNA;EA6DM,yBAAyB;AxC+qN/B;;AwC5uNA;EAiEM,6BAA6B;EAE3B,0BAAkE;AxC8qN1E;;AwCjvNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;AC0wN9B;;AwCtvNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxC8qNrF;;AwC5vNA;EAiFM,YAAY;EACZ,cAAc;AxC+qNpB;;AwCjwNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCgrNxB;;AwCzwNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxCkrNlB;;AwC/wNA;EvC8HI,iBuC9BuE;AxCmrN3E;;AwCnxNA;EAmGU,2BzC5DE;EyC6DF,8BzC7DE;ACivNZ;;AwCxxNA;EA0GU,4BzCnEE;EyCoEF,+BzCpEE;ACsvNZ;;AwC7xNA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCgrNpB;;AwCpyNA;EAsHM,mBAAmB;AxCkrNzB;;AwCxyNA;EA2HY,iCzClFW;EyCmFX,8BzCnFW;EyCoFX,oBAAoB;AxCirNhC;;AwC9yNA;EAoIY,kCzC3FW;EyC4FX,+BzC5FW;EyC6FX,qBAAqB;AxC8qNjC;;AwCpzNA;EA6II,kBzCrIY;ACgzNhB;;AwCxzNA;EA+II,kBzCzIY;ACszNhB;;AwC5zNA;EAiJI,iBzC5IW;AC2zNf;;AyC91NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1Cq2NpB;;A0C71NE;EACE,UAAU;EACV,YAAY;A1Cg2NhB;;A0C/1NE;EACE,UAAU;EACV,WAAW;A1Ck2Nf;;A0Cj2NE;EACE,UAAU;EACV,UAAU;A1Co2Nd;;A0Cn2NE;EACE,UAAU;EACV,eAAe;A1Cs2NnB;;A0Cr2NE;EACE,UAAU;EACV,UAAU;A1Cw2Nd;;A0Cv2NE;EACE,UAAU;EACV,eAAe;A1C02NnB;;A0Cz2NE;EACE,UAAU;EACV,UAAU;A1C42Nd;;A0C32NE;EACE,UAAU;EACV,UAAU;A1C82Nd;;A0C72NE;EACE,UAAU;EACV,UAAU;A1Cg3Nd;;A0C/2NE;EACE,UAAU;EACV,UAAU;A1Ck3Nd;;A0Cj3NE;EACE,UAAU;EACV,UAAU;A1Co3Nd;;A0Cn3NE;EzCiHE,gByChHmC;A1Cs3NvC;;A0Cr3NE;EzC+GE,qByC9GwC;A1Cw3N5C;;A0Cv3NE;EzC6GE,gByC5GmC;A1C03NvC;;A0Cz3NE;EzC2GE,qByC1GwC;A1C43N5C;;A0C33NE;EzCyGE,gByCxGmC;A1C83NvC;;A0C73NE;EzCuGE,gByCtGmC;A1Cg4NvC;;A0C/3NE;EzCqGE,gByCpGmC;A1Ck4NvC;;A0Cj4NE;EzCmGE,gByClGmC;A1Co4NvC;;A0Cn4NE;EzCiGE,gByChGmC;A1Cs4NvC;;A0Cp4NI;EACE,UAAU;EACV,SAAiC;A1Cu4NvC;;A0Ct4NI;EzC2FA,eyC1F4D;A1Cy4NhE;;A0C74NI;EACE,UAAU;EACV,eAAiC;A1Cg5NvC;;A0C/4NI;EzC2FA,qByC1F4D;A1Ck5NhE;;A0Ct5NI;EACE,UAAU;EACV,gBAAiC;A1Cy5NvC;;A0Cx5NI;EzC2FA,sByC1F4D;A1C25NhE;;A0C/5NI;EACE,UAAU;EACV,UAAiC;A1Ck6NvC;;A0Cj6NI;EzC2FA,gByC1F4D;A1Co6NhE;;A0Cx6NI;EACE,UAAU;EACV,gBAAiC;A1C26NvC;;A0C16NI;EzC2FA,sByC1F4D;A1C66NhE;;A0Cj7NI;EACE,UAAU;EACV,gBAAiC;A1Co7NvC;;A0Cn7NI;EzC2FA,sByC1F4D;A1Cs7NhE;;A0C17NI;EACE,UAAU;EACV,UAAiC;A1C67NvC;;A0C57NI;EzC2FA,gByC1F4D;A1C+7NhE;;A0Cn8NI;EACE,UAAU;EACV,gBAAiC;A1Cs8NvC;;A0Cr8NI;EzC2FA,sByC1F4D;A1Cw8NhE;;A0C58NI;EACE,UAAU;EACV,gBAAiC;A1C+8NvC;;A0C98NI;EzC2FA,sByC1F4D;A1Ci9NhE;;A0Cr9NI;EACE,UAAU;EACV,UAAiC;A1Cw9NvC;;A0Cv9NI;EzC2FA,gByC1F4D;A1C09NhE;;A0C99NI;EACE,UAAU;EACV,gBAAiC;A1Ci+NvC;;A0Ch+NI;EzC2FA,sByC1F4D;A1Cm+NhE;;A0Cv+NI;EACE,UAAU;EACV,gBAAiC;A1C0+NvC;;A0Cz+NI;EzC2FA,sByC1F4D;A1C4+NhE;;A0Ch/NI;EACE,UAAU;EACV,WAAiC;A1Cm/NvC;;A0Cl/NI;EzC2FA,iByC1F4D;A1Cq/NhE;;AC19NE;EyCzFF;IAiEM,UAAU;IACV,YAAY;E1Cu/NhB;E0CzjOF;IAoEM,UAAU;IACV,WAAW;E1Cw/Nf;E0C7jOF;IAuEM,UAAU;IACV,UAAU;E1Cy/Nd;E0CjkOF;IA0EM,UAAU;IACV,eAAe;E1C0/NnB;E0CrkOF;IA6EM,UAAU;IACV,UAAU;E1C2/Nd;E0CzkOF;IAgFM,UAAU;IACV,eAAe;E1C4/NnB;E0C7kOF;IAmFM,UAAU;IACV,UAAU;E1C6/Nd;E0CjlOF;IAsFM,UAAU;IACV,UAAU;E1C8/Nd;E0CrlOF;IAyFM,UAAU;IACV,UAAU;E1C+/Nd;E0CzlOF;IA4FM,UAAU;IACV,UAAU;E1CggOd;E0C7lOF;IA+FM,UAAU;IACV,UAAU;E1CigOd;E0CjmOF;IzCwJI,gByCtDqC;E1CkgOvC;E0CpmOF;IzCwJI,qByCpD0C;E1CmgO5C;E0CvmOF;IzCwJI,gByClDqC;E1CogOvC;E0C1mOF;IzCwJI,qByChD0C;E1CqgO5C;E0C7mOF;IzCwJI,gByC9CqC;E1CsgOvC;E0ChnOF;IzCwJI,gByC5CqC;E1CugOvC;E0CnnOF;IzCwJI,gByC1CqC;E1CwgOvC;E0CtnOF;IzCwJI,gByCxCqC;E1CygOvC;E0CznOF;IzCwJI,gByCtCqC;E1C0gOvC;E0C5nOF;IAqHQ,UAAU;IACV,SAAiC;E1C0gOvC;E0ChoOF;IzCwJI,eyChC8D;E1C2gOhE;E0CnoOF;IAqHQ,UAAU;IACV,eAAiC;E1CihOvC;E0CvoOF;IzCwJI,qByChC8D;E1CkhOhE;E0C1oOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwhOvC;E0C9oOF;IzCwJI,sByChC8D;E1CyhOhE;E0CjpOF;IAqHQ,UAAU;IACV,UAAiC;E1C+hOvC;E0CrpOF;IzCwJI,gByChC8D;E1CgiOhE;E0CxpOF;IAqHQ,UAAU;IACV,gBAAiC;E1CsiOvC;E0C5pOF;IzCwJI,sByChC8D;E1CuiOhE;E0C/pOF;IAqHQ,UAAU;IACV,gBAAiC;E1C6iOvC;E0CnqOF;IzCwJI,sByChC8D;E1C8iOhE;E0CtqOF;IAqHQ,UAAU;IACV,UAAiC;E1CojOvC;E0C1qOF;IzCwJI,gByChC8D;E1CqjOhE;E0C7qOF;IAqHQ,UAAU;IACV,gBAAiC;E1C2jOvC;E0CjrOF;IzCwJI,sByChC8D;E1C4jOhE;E0CprOF;IAqHQ,UAAU;IACV,gBAAiC;E1CkkOvC;E0CxrOF;IzCwJI,sByChC8D;E1CmkOhE;E0C3rOF;IAqHQ,UAAU;IACV,UAAiC;E1CykOvC;E0C/rOF;IzCwJI,gByChC8D;E1C0kOhE;E0ClsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CglOvC;E0CtsOF;IzCwJI,sByChC8D;E1CilOhE;E0CzsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CulOvC;E0C7sOF;IzCwJI,sByChC8D;E1CwlOhE;E0ChtOF;IAqHQ,UAAU;IACV,WAAiC;E1C8lOvC;E0CptOF;IzCwJI,iByChC8D;E1C+lOhE;AACF;;AC3nOE;EyC7FF;IA4HM,UAAU;IACV,YAAY;E1CimOhB;E0C9tOF;IAgIM,UAAU;IACV,WAAW;E1CimOf;E0CluOF;IAoIM,UAAU;IACV,UAAU;E1CimOd;E0CtuOF;IAwIM,UAAU;IACV,eAAe;E1CimOnB;E0C1uOF;IA4IM,UAAU;IACV,UAAU;E1CimOd;E0C9uOF;IAgJM,UAAU;IACV,eAAe;E1CimOnB;E0ClvOF;IAoJM,UAAU;IACV,UAAU;E1CimOd;E0CtvOF;IAwJM,UAAU;IACV,UAAU;E1CimOd;E0C1vOF;IA4JM,UAAU;IACV,UAAU;E1CimOd;E0C9vOF;IAgKM,UAAU;IACV,UAAU;E1CimOd;E0ClwOF;IAoKM,UAAU;IACV,UAAU;E1CimOd;E0CtwOF;IzCwJI,gByCgBqC;E1CimOvC;E0CzwOF;IzCwJI,qByCmB0C;E1CimO5C;E0C5wOF;IzCwJI,gByCsBqC;E1CimOvC;E0C/wOF;IzCwJI,qByCyB0C;E1CimO5C;E0ClxOF;IzCwJI,gByC4BqC;E1CimOvC;E0CrxOF;IzCwJI,gByC+BqC;E1CimOvC;E0CxxOF;IzCwJI,gByCkCqC;E1CimOvC;E0C3xOF;IzCwJI,gByCqCqC;E1CimOvC;E0C9xOF;IzCwJI,gByCwCqC;E1CimOvC;E0CjyOF;IAoMQ,UAAU;IACV,SAAiC;E1CgmOvC;E0CryOF;IzCwJI,eyCgD8D;E1CgmOhE;E0CxyOF;IAoMQ,UAAU;IACV,eAAiC;E1CumOvC;E0C5yOF;IzCwJI,qByCgD8D;E1CumOhE;E0C/yOF;IAoMQ,UAAU;IACV,gBAAiC;E1C8mOvC;E0CnzOF;IzCwJI,sByCgD8D;E1C8mOhE;E0CtzOF;IAoMQ,UAAU;IACV,UAAiC;E1CqnOvC;E0C1zOF;IzCwJI,gByCgD8D;E1CqnOhE;E0C7zOF;IAoMQ,UAAU;IACV,gBAAiC;E1C4nOvC;E0Cj0OF;IzCwJI,sByCgD8D;E1C4nOhE;E0Cp0OF;IAoMQ,UAAU;IACV,gBAAiC;E1CmoOvC;E0Cx0OF;IzCwJI,sByCgD8D;E1CmoOhE;E0C30OF;IAoMQ,UAAU;IACV,UAAiC;E1C0oOvC;E0C/0OF;IzCwJI,gByCgD8D;E1C0oOhE;E0Cl1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CipOvC;E0Ct1OF;IzCwJI,sByCgD8D;E1CipOhE;E0Cz1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CwpOvC;E0C71OF;IzCwJI,sByCgD8D;E1CwpOhE;E0Ch2OF;IAoMQ,UAAU;IACV,UAAiC;E1C+pOvC;E0Cp2OF;IzCwJI,gByCgD8D;E1C+pOhE;E0Cv2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CsqOvC;E0C32OF;IzCwJI,sByCgD8D;E1CsqOhE;E0C92OF;IAoMQ,UAAU;IACV,gBAAiC;E1C6qOvC;E0Cl3OF;IzCwJI,sByCgD8D;E1C6qOhE;E0Cr3OF;IAoMQ,UAAU;IACV,WAAiC;E1CorOvC;E0Cz3OF;IzCwJI,iByCgD8D;E1CorOhE;AACF;;ACxxOE;EyCrGF;IA2MM,UAAU;IACV,YAAY;E1CurOhB;E0Cn4OF;IA8MM,UAAU;IACV,WAAW;E1CwrOf;E0Cv4OF;IAiNM,UAAU;IACV,UAAU;E1CyrOd;E0C34OF;IAoNM,UAAU;IACV,eAAe;E1C0rOnB;E0C/4OF;IAuNM,UAAU;IACV,UAAU;E1C2rOd;E0Cn5OF;IA0NM,UAAU;IACV,eAAe;E1C4rOnB;E0Cv5OF;IA6NM,UAAU;IACV,UAAU;E1C6rOd;E0C35OF;IAgOM,UAAU;IACV,UAAU;E1C8rOd;E0C/5OF;IAmOM,UAAU;IACV,UAAU;E1C+rOd;E0Cn6OF;IAsOM,UAAU;IACV,UAAU;E1CgsOd;E0Cv6OF;IAyOM,UAAU;IACV,UAAU;E1CisOd;E0C36OF;IzCwJI,gByCoFqC;E1CksOvC;E0C96OF;IzCwJI,qByCsF0C;E1CmsO5C;E0Cj7OF;IzCwJI,gByCwFqC;E1CosOvC;E0Cp7OF;IzCwJI,qByC0F0C;E1CqsO5C;E0Cv7OF;IzCwJI,gByC4FqC;E1CssOvC;E0C17OF;IzCwJI,gByC8FqC;E1CusOvC;E0C77OF;IzCwJI,gByCgGqC;E1CwsOvC;E0Ch8OF;IzCwJI,gByCkGqC;E1CysOvC;E0Cn8OF;IzCwJI,gByCoGqC;E1C0sOvC;E0Ct8OF;IA+PQ,UAAU;IACV,SAAiC;E1C0sOvC;E0C18OF;IzCwJI,eyC0G8D;E1C2sOhE;E0C78OF;IA+PQ,UAAU;IACV,eAAiC;E1CitOvC;E0Cj9OF;IzCwJI,qByC0G8D;E1CktOhE;E0Cp9OF;IA+PQ,UAAU;IACV,gBAAiC;E1CwtOvC;E0Cx9OF;IzCwJI,sByC0G8D;E1CytOhE;E0C39OF;IA+PQ,UAAU;IACV,UAAiC;E1C+tOvC;E0C/9OF;IzCwJI,gByC0G8D;E1CguOhE;E0Cl+OF;IA+PQ,UAAU;IACV,gBAAiC;E1CsuOvC;E0Ct+OF;IzCwJI,sByC0G8D;E1CuuOhE;E0Cz+OF;IA+PQ,UAAU;IACV,gBAAiC;E1C6uOvC;E0C7+OF;IzCwJI,sByC0G8D;E1C8uOhE;E0Ch/OF;IA+PQ,UAAU;IACV,UAAiC;E1CovOvC;E0Cp/OF;IzCwJI,gByC0G8D;E1CqvOhE;E0Cv/OF;IA+PQ,UAAU;IACV,gBAAiC;E1C2vOvC;E0C3/OF;IzCwJI,sByC0G8D;E1C4vOhE;E0C9/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CkwOvC;E0ClgPF;IzCwJI,sByC0G8D;E1CmwOhE;E0CrgPF;IA+PQ,UAAU;IACV,UAAiC;E1CywOvC;E0CzgPF;IzCwJI,gByC0G8D;E1C0wOhE;E0C5gPF;IA+PQ,UAAU;IACV,gBAAiC;E1CgxOvC;E0ChhPF;IzCwJI,sByC0G8D;E1CixOhE;E0CnhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CuxOvC;E0CvhPF;IzCwJI,sByC0G8D;E1CwxOhE;E0C1hPF;IA+PQ,UAAU;IACV,WAAiC;E1C8xOvC;E0C9hPF;IzCwJI,iByC0G8D;E1C+xOhE;AACF;;ACz7OE;EyCzGF;IAqQM,UAAU;IACV,YAAY;E1CkyOhB;E0CxiPF;IAwQM,UAAU;IACV,WAAW;E1CmyOf;E0C5iPF;IA2QM,UAAU;IACV,UAAU;E1CoyOd;E0ChjPF;IA8QM,UAAU;IACV,eAAe;E1CqyOnB;E0CpjPF;IAiRM,UAAU;IACV,UAAU;E1CsyOd;E0CxjPF;IAoRM,UAAU;IACV,eAAe;E1CuyOnB;E0C5jPF;IAuRM,UAAU;IACV,UAAU;E1CwyOd;E0ChkPF;IA0RM,UAAU;IACV,UAAU;E1CyyOd;E0CpkPF;IA6RM,UAAU;IACV,UAAU;E1C0yOd;E0CxkPF;IAgSM,UAAU;IACV,UAAU;E1C2yOd;E0C5kPF;IAmSM,UAAU;IACV,UAAU;E1C4yOd;E0ChlPF;IzCwJI,gByC8IqC;E1C6yOvC;E0CnlPF;IzCwJI,qByCgJ0C;E1C8yO5C;E0CtlPF;IzCwJI,gByCkJqC;E1C+yOvC;E0CzlPF;IzCwJI,qByCoJ0C;E1CgzO5C;E0C5lPF;IzCwJI,gByCsJqC;E1CizOvC;E0C/lPF;IzCwJI,gByCwJqC;E1CkzOvC;E0ClmPF;IzCwJI,gByC0JqC;E1CmzOvC;E0CrmPF;IzCwJI,gByC4JqC;E1CozOvC;E0CxmPF;IzCwJI,gByC8JqC;E1CqzOvC;E0C3mPF;IAyTQ,UAAU;IACV,SAAiC;E1CqzOvC;E0C/mPF;IzCwJI,eyCoK8D;E1CszOhE;E0ClnPF;IAyTQ,UAAU;IACV,eAAiC;E1C4zOvC;E0CtnPF;IzCwJI,qByCoK8D;E1C6zOhE;E0CznPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm0OvC;E0C7nPF;IzCwJI,sByCoK8D;E1Co0OhE;E0ChoPF;IAyTQ,UAAU;IACV,UAAiC;E1C00OvC;E0CpoPF;IzCwJI,gByCoK8D;E1C20OhE;E0CvoPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ci1OvC;E0C3oPF;IzCwJI,sByCoK8D;E1Ck1OhE;E0C9oPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cw1OvC;E0ClpPF;IzCwJI,sByCoK8D;E1Cy1OhE;E0CrpPF;IAyTQ,UAAU;IACV,UAAiC;E1C+1OvC;E0CzpPF;IzCwJI,gByCoK8D;E1Cg2OhE;E0C5pPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cs2OvC;E0ChqPF;IzCwJI,sByCoK8D;E1Cu2OhE;E0CnqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C62OvC;E0CvqPF;IzCwJI,sByCoK8D;E1C82OhE;E0C1qPF;IAyTQ,UAAU;IACV,UAAiC;E1Co3OvC;E0C9qPF;IzCwJI,gByCoK8D;E1Cq3OhE;E0CjrPF;IAyTQ,UAAU;IACV,gBAAiC;E1C23OvC;E0CrrPF;IzCwJI,sByCoK8D;E1C43OhE;E0CxrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Ck4OvC;E0C5rPF;IzCwJI,sByCoK8D;E1Cm4OhE;E0C/rPF;IAyTQ,UAAU;IACV,WAAiC;E1Cy4OvC;E0CnsPF;IzCwJI,iByCoK8D;E1C04OhE;AACF;;AC/kPI;EyCxHJ;IA+TM,UAAU;IACV,YAAY;E1C64OhB;E0C7sPF;IAkUM,UAAU;IACV,WAAW;E1C84Of;E0CjtPF;IAqUM,UAAU;IACV,UAAU;E1C+4Od;E0CrtPF;IAwUM,UAAU;IACV,eAAe;E1Cg5OnB;E0CztPF;IA2UM,UAAU;IACV,UAAU;E1Ci5Od;E0C7tPF;IA8UM,UAAU;IACV,eAAe;E1Ck5OnB;E0CjuPF;IAiVM,UAAU;IACV,UAAU;E1Cm5Od;E0CruPF;IAoVM,UAAU;IACV,UAAU;E1Co5Od;E0CzuPF;IAuVM,UAAU;IACV,UAAU;E1Cq5Od;E0C7uPF;IA0VM,UAAU;IACV,UAAU;E1Cs5Od;E0CjvPF;IA6VM,UAAU;IACV,UAAU;E1Cu5Od;E0CrvPF;IzCwJI,gByCwMqC;E1Cw5OvC;E0CxvPF;IzCwJI,qByC0M0C;E1Cy5O5C;E0C3vPF;IzCwJI,gByC4MqC;E1C05OvC;E0C9vPF;IzCwJI,qByC8M0C;E1C25O5C;E0CjwPF;IzCwJI,gByCgNqC;E1C45OvC;E0CpwPF;IzCwJI,gByCkNqC;E1C65OvC;E0CvwPF;IzCwJI,gByCoNqC;E1C85OvC;E0C1wPF;IzCwJI,gByCsNqC;E1C+5OvC;E0C7wPF;IzCwJI,gByCwNqC;E1Cg6OvC;E0ChxPF;IAmXQ,UAAU;IACV,SAAiC;E1Cg6OvC;E0CpxPF;IzCwJI,eyC8N8D;E1Ci6OhE;E0CvxPF;IAmXQ,UAAU;IACV,eAAiC;E1Cu6OvC;E0C3xPF;IzCwJI,qByC8N8D;E1Cw6OhE;E0C9xPF;IAmXQ,UAAU;IACV,gBAAiC;E1C86OvC;E0ClyPF;IzCwJI,sByC8N8D;E1C+6OhE;E0CryPF;IAmXQ,UAAU;IACV,UAAiC;E1Cq7OvC;E0CzyPF;IzCwJI,gByC8N8D;E1Cs7OhE;E0C5yPF;IAmXQ,UAAU;IACV,gBAAiC;E1C47OvC;E0ChzPF;IzCwJI,sByC8N8D;E1C67OhE;E0CnzPF;IAmXQ,UAAU;IACV,gBAAiC;E1Cm8OvC;E0CvzPF;IzCwJI,sByC8N8D;E1Co8OhE;E0C1zPF;IAmXQ,UAAU;IACV,UAAiC;E1C08OvC;E0C9zPF;IzCwJI,gByC8N8D;E1C28OhE;E0Cj0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Ci9OvC;E0Cr0PF;IzCwJI,sByC8N8D;E1Ck9OhE;E0Cx0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cw9OvC;E0C50PF;IzCwJI,sByC8N8D;E1Cy9OhE;E0C/0PF;IAmXQ,UAAU;IACV,UAAiC;E1C+9OvC;E0Cn1PF;IzCwJI,gByC8N8D;E1Cg+OhE;E0Ct1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs+OvC;E0C11PF;IzCwJI,sByC8N8D;E1Cu+OhE;E0C71PF;IAmXQ,UAAU;IACV,gBAAiC;E1C6+OvC;E0Cj2PF;IzCwJI,sByC8N8D;E1C8+OhE;E0Cp2PF;IAmXQ,UAAU;IACV,WAAiC;E1Co/OvC;E0Cx2PF;IzCwJI,iByC8N8D;E1Cq/OhE;AACF;;ACruPI;EyCvIJ;IAyXM,UAAU;IACV,YAAY;E1Cw/OhB;E0Cl3PF;IA4XM,UAAU;IACV,WAAW;E1Cy/Of;E0Ct3PF;IA+XM,UAAU;IACV,UAAU;E1C0/Od;E0C13PF;IAkYM,UAAU;IACV,eAAe;E1C2/OnB;E0C93PF;IAqYM,UAAU;IACV,UAAU;E1C4/Od;E0Cl4PF;IAwYM,UAAU;IACV,eAAe;E1C6/OnB;E0Ct4PF;IA2YM,UAAU;IACV,UAAU;E1C8/Od;E0C14PF;IA8YM,UAAU;IACV,UAAU;E1C+/Od;E0C94PF;IAiZM,UAAU;IACV,UAAU;E1CggPd;E0Cl5PF;IAoZM,UAAU;IACV,UAAU;E1CigPd;E0Ct5PF;IAuZM,UAAU;IACV,UAAU;E1CkgPd;E0C15PF;IzCwJI,gByCkQqC;E1CmgPvC;E0C75PF;IzCwJI,qByCoQ0C;E1CogP5C;E0Ch6PF;IzCwJI,gByCsQqC;E1CqgPvC;E0Cn6PF;IzCwJI,qByCwQ0C;E1CsgP5C;E0Ct6PF;IzCwJI,gByC0QqC;E1CugPvC;E0Cz6PF;IzCwJI,gByC4QqC;E1CwgPvC;E0C56PF;IzCwJI,gByC8QqC;E1CygPvC;E0C/6PF;IzCwJI,gByCgRqC;E1C0gPvC;E0Cl7PF;IzCwJI,gByCkRqC;E1C2gPvC;E0Cr7PF;IA6aQ,UAAU;IACV,SAAiC;E1C2gPvC;E0Cz7PF;IzCwJI,eyCwR8D;E1C4gPhE;E0C57PF;IA6aQ,UAAU;IACV,eAAiC;E1CkhPvC;E0Ch8PF;IzCwJI,qByCwR8D;E1CmhPhE;E0Cn8PF;IA6aQ,UAAU;IACV,gBAAiC;E1CyhPvC;E0Cv8PF;IzCwJI,sByCwR8D;E1C0hPhE;E0C18PF;IA6aQ,UAAU;IACV,UAAiC;E1CgiPvC;E0C98PF;IzCwJI,gByCwR8D;E1CiiPhE;E0Cj9PF;IA6aQ,UAAU;IACV,gBAAiC;E1CuiPvC;E0Cr9PF;IzCwJI,sByCwR8D;E1CwiPhE;E0Cx9PF;IA6aQ,UAAU;IACV,gBAAiC;E1C8iPvC;E0C59PF;IzCwJI,sByCwR8D;E1C+iPhE;E0C/9PF;IA6aQ,UAAU;IACV,UAAiC;E1CqjPvC;E0Cn+PF;IzCwJI,gByCwR8D;E1CsjPhE;E0Ct+PF;IA6aQ,UAAU;IACV,gBAAiC;E1C4jPvC;E0C1+PF;IzCwJI,sByCwR8D;E1C6jPhE;E0C7+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CmkPvC;E0Cj/PF;IzCwJI,sByCwR8D;E1CokPhE;E0Cp/PF;IA6aQ,UAAU;IACV,UAAiC;E1C0kPvC;E0Cx/PF;IzCwJI,gByCwR8D;E1C2kPhE;E0C3/PF;IA6aQ,UAAU;IACV,gBAAiC;E1CilPvC;E0C//PF;IzCwJI,sByCwR8D;E1CklPhE;E0ClgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CwlPvC;E0CtgQF;IzCwJI,sByCwR8D;E1CylPhE;E0CzgQF;IA6aQ,UAAU;IACV,WAAiC;E1C+lPvC;E0C7gQF;IzCwJI,iByCwR8D;E1CgmPhE;AACF;;A0C/lPA;EzC1RI,qByC1JgB;EzC0JhB,sByC1JgB;EAublB,oBAvbkB;A1CyhQpB;;A0CrmPA;EAKI,uBAzbgB;A1C6hQpB;;A0CzmPA;EAOI,qCAA4C;A1CsmPhD;;A0C7mPA;EAUI,uBAAuB;A1CumP3B;;A0CjnPA;EzC1RI,cyCsSiC;EzCtSjC,eyCuSiC;EACjC,aAAa;A1CymPjB;;A0CvnPA;EAgBM,SAAS;EACT,qBAAqB;A1C2mP3B;;A0C5nPA;EAmBM,qBAAqB;A1C6mP3B;;A0ChoPA;EAqBM,gBAAgB;A1C+mPtB;;A0CpoPA;EAuBI,aAAa;A1CinPjB;;A0CxoPA;EAyBI,eAAe;A1CmnPnB;;A0C5oPA;EA2BI,mBAAmB;A1CqnPvB;;ACr+PE;EyCqVF;IA+BM,aAAa;E1CsnPjB;AACF;;AC/9PE;EyCyUF;IAmCM,aAAa;E1CwnPjB;AACF;;A0CtnPE;EACE,oBAAY;EzCjUZ,wCyCkU2D;EzClU3D,yCyCmU2D;A1CynP/D;;A0C5nPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1C2nPrC;;A0CjoPE;EASM,iBAAY;A1C4nPpB;;ACpgQE;EyC+XA;IAYQ,iBAAY;E1C8nPpB;AACF;;ACtgQE;EyC2XA;IAeQ,iBAAY;E1CioPpB;AACF;;ACxgQE;EyCuXA;IAkBQ,iBAAY;E1CooPpB;AACF;;AC1gQE;EyCmXA;IAqBQ,iBAAY;E1CuoPpB;AACF;;AC5gQE;EyC+WA;IAwBQ,iBAAY;E1C0oPpB;AACF;;AC7gQI;EyC0WF;IA2BQ,iBAAY;E1C6oPpB;AACF;;ACzgQI;EyCgWF;IA8BQ,iBAAY;E1CgpPpB;AACF;;AC1gQI;EyC2VF;IAiCQ,iBAAY;E1CmpPpB;AACF;;ACtgQI;EyCiVF;IAoCQ,iBAAY;E1CspPpB;AACF;;A0C3rPE;EASM,oBAAY;A1CsrPpB;;AC9jQE;EyC+XA;IAYQ,oBAAY;E1CwrPpB;AACF;;AChkQE;EyC2XA;IAeQ,oBAAY;E1C2rPpB;AACF;;AClkQE;EyCuXA;IAkBQ,oBAAY;E1C8rPpB;AACF;;ACpkQE;EyCmXA;IAqBQ,oBAAY;E1CisPpB;AACF;;ACtkQE;EyC+WA;IAwBQ,oBAAY;E1CosPpB;AACF;;ACvkQI;EyC0WF;IA2BQ,oBAAY;E1CusPpB;AACF;;ACnkQI;EyCgWF;IA8BQ,oBAAY;E1C0sPpB;AACF;;ACpkQI;EyC2VF;IAiCQ,oBAAY;E1C6sPpB;AACF;;AChkQI;EyCiVF;IAoCQ,oBAAY;E1CgtPpB;AACF;;A0CrvPE;EASM,mBAAY;A1CgvPpB;;ACxnQE;EyC+XA;IAYQ,mBAAY;E1CkvPpB;AACF;;AC1nQE;EyC2XA;IAeQ,mBAAY;E1CqvPpB;AACF;;AC5nQE;EyCuXA;IAkBQ,mBAAY;E1CwvPpB;AACF;;AC9nQE;EyCmXA;IAqBQ,mBAAY;E1C2vPpB;AACF;;AChoQE;EyC+WA;IAwBQ,mBAAY;E1C8vPpB;AACF;;ACjoQI;EyC0WF;IA2BQ,mBAAY;E1CiwPpB;AACF;;AC7nQI;EyCgWF;IA8BQ,mBAAY;E1CowPpB;AACF;;AC9nQI;EyC2VF;IAiCQ,mBAAY;E1CuwPpB;AACF;;AC1nQI;EyCiVF;IAoCQ,mBAAY;E1C0wPpB;AACF;;A0C/yPE;EASM,oBAAY;A1C0yPpB;;AClrQE;EyC+XA;IAYQ,oBAAY;E1C4yPpB;AACF;;ACprQE;EyC2XA;IAeQ,oBAAY;E1C+yPpB;AACF;;ACtrQE;EyCuXA;IAkBQ,oBAAY;E1CkzPpB;AACF;;ACxrQE;EyCmXA;IAqBQ,oBAAY;E1CqzPpB;AACF;;AC1rQE;EyC+WA;IAwBQ,oBAAY;E1CwzPpB;AACF;;AC3rQI;EyC0WF;IA2BQ,oBAAY;E1C2zPpB;AACF;;ACvrQI;EyCgWF;IA8BQ,oBAAY;E1C8zPpB;AACF;;ACxrQI;EyC2VF;IAiCQ,oBAAY;E1Ci0PpB;AACF;;ACprQI;EyCiVF;IAoCQ,oBAAY;E1Co0PpB;AACF;;A0Cz2PE;EASM,iBAAY;A1Co2PpB;;AC5uQE;EyC+XA;IAYQ,iBAAY;E1Cs2PpB;AACF;;AC9uQE;EyC2XA;IAeQ,iBAAY;E1Cy2PpB;AACF;;AChvQE;EyCuXA;IAkBQ,iBAAY;E1C42PpB;AACF;;AClvQE;EyCmXA;IAqBQ,iBAAY;E1C+2PpB;AACF;;ACpvQE;EyC+WA;IAwBQ,iBAAY;E1Ck3PpB;AACF;;ACrvQI;EyC0WF;IA2BQ,iBAAY;E1Cq3PpB;AACF;;ACjvQI;EyCgWF;IA8BQ,iBAAY;E1Cw3PpB;AACF;;AClvQI;EyC2VF;IAiCQ,iBAAY;E1C23PpB;AACF;;AC9uQI;EyCiVF;IAoCQ,iBAAY;E1C83PpB;AACF;;A0Cn6PE;EASM,oBAAY;A1C85PpB;;ACtyQE;EyC+XA;IAYQ,oBAAY;E1Cg6PpB;AACF;;ACxyQE;EyC2XA;IAeQ,oBAAY;E1Cm6PpB;AACF;;AC1yQE;EyCuXA;IAkBQ,oBAAY;E1Cs6PpB;AACF;;AC5yQE;EyCmXA;IAqBQ,oBAAY;E1Cy6PpB;AACF;;AC9yQE;EyC+WA;IAwBQ,oBAAY;E1C46PpB;AACF;;AC/yQI;EyC0WF;IA2BQ,oBAAY;E1C+6PpB;AACF;;AC3yQI;EyCgWF;IA8BQ,oBAAY;E1Ck7PpB;AACF;;AC5yQI;EyC2VF;IAiCQ,oBAAY;E1Cq7PpB;AACF;;ACxyQI;EyCiVF;IAoCQ,oBAAY;E1Cw7PpB;AACF;;A0C79PE;EASM,mBAAY;A1Cw9PpB;;ACh2QE;EyC+XA;IAYQ,mBAAY;E1C09PpB;AACF;;ACl2QE;EyC2XA;IAeQ,mBAAY;E1C69PpB;AACF;;ACp2QE;EyCuXA;IAkBQ,mBAAY;E1Cg+PpB;AACF;;ACt2QE;EyCmXA;IAqBQ,mBAAY;E1Cm+PpB;AACF;;ACx2QE;EyC+WA;IAwBQ,mBAAY;E1Cs+PpB;AACF;;ACz2QI;EyC0WF;IA2BQ,mBAAY;E1Cy+PpB;AACF;;ACr2QI;EyCgWF;IA8BQ,mBAAY;E1C4+PpB;AACF;;ACt2QI;EyC2VF;IAiCQ,mBAAY;E1C++PpB;AACF;;ACl2QI;EyCiVF;IAoCQ,mBAAY;E1Ck/PpB;AACF;;A0CvhQE;EASM,oBAAY;A1CkhQpB;;AC15QE;EyC+XA;IAYQ,oBAAY;E1CohQpB;AACF;;AC55QE;EyC2XA;IAeQ,oBAAY;E1CuhQpB;AACF;;AC95QE;EyCuXA;IAkBQ,oBAAY;E1C0hQpB;AACF;;ACh6QE;EyCmXA;IAqBQ,oBAAY;E1C6hQpB;AACF;;ACl6QE;EyC+WA;IAwBQ,oBAAY;E1CgiQpB;AACF;;ACn6QI;EyC0WF;IA2BQ,oBAAY;E1CmiQpB;AACF;;AC/5QI;EyCgWF;IA8BQ,oBAAY;E1CsiQpB;AACF;;ACh6QI;EyC2VF;IAiCQ,oBAAY;E1CyiQpB;AACF;;AC55QI;EyCiV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B;A7C+zRnC;;A6C9zRI;EAGI,yBAAgD;A7C+zRxD;;A6C9zRI;EACE,oCAAwC;A7Ci0R9C;;A6C71RE;EACE,yBAAwB;A7Cg2R5B;;A6C/1RE;EAGI,yBAA0C;A7Cg2RhD;;A6C/1RE;EACE,oCAAmC;A7Ck2RvC;;A6C71RI;EACE,yBAA8B;A7Cg2RpC;;A6C/1RI;EAGI,yBAAgD;A7Cg2RxD;;A6C/1RI;EACE,oCAAyC;A7Ck2R/C;;A6Ch2RI;EACE,yBAA6B;A7Cm2RnC;;A6Cl2RI;EAGI,yBAAgD;A7Cm2RxD;;A6Cl2RI;EACE,oCAAwC;A7Cq2R9C;;A6Cj4RE;EACE,yBAAwB;A7Co4R5B;;A6Cn4RE;EAGI,yBAA0C;A7Co4RhD;;A6Cn4RE;EACE,oCAAmC;A7Cs4RvC;;A6Cj4RI;EACE,yBAA8B;A7Co4RpC;;A6Cn4RI;EAGI,yBAAgD;A7Co4RxD;;A6Cn4RI;EACE,oCAAyC;A7Cs4R/C;;A6Cp4RI;EACE,yBAA6B;A7Cu4RnC;;A6Ct4RI;EAGI,yBAAgD;A7Cu4RxD;;A6Ct4RI;EACE,oCAAwC;A7Cy4R9C;;A6Cr6RE;EACE,yBAAwB;A7Cw6R5B;;A6Cv6RE;EAGI,yBAA0C;A7Cw6RhD;;A6Cv6RE;EACE,oCAAmC;A7C06RvC;;A6Cr6RI;EACE,yBAA8B;A7Cw6RpC;;A6Cv6RI;EAGI,yBAAgD;A7Cw6RxD;;A6Cv6RI;EACE,oCAAyC;A7C06R/C;;A6Cx6RI;EACE,yBAA6B;A7C26RnC;;A6C16RI;EAGI,yBAAgD;A7C26RxD;;A6C16RI;EACE,oCAAwC;A7C66R9C;;A6C16RE;EACE,yBAAwB;A7C66R5B;;A6C56RE;EACE,oCAAmC;A7C+6RvC;;A6Cl7RE;EACE,yBAAwB;A7Cq7R5B;;A6Cp7RE;EACE,oCAAmC;A7Cu7RvC;;A6C17RE;EACE,yBAAwB;A7C67R5B;;A6C57RE;EACE,oCAAmC;A7C+7RvC;;A6Cl8RE;EACE,yBAAwB;A7Cq8R5B;;A6Cp8RE;EACE,oCAAmC;A7Cu8RvC;;A6C18RE;EACE,yBAAwB;A7C68R5B;;A6C58RE;EACE,oCAAmC;A7C+8RvC;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,4BAAwB;A7Cq+R5B;;A6Cp+RE;EACE,uCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A8CnhSE;EACE,8BAAiC;A9CshSrC;;A8CvhSE;EACE,sCAAiC;A9C0hSrC;;A8C3hSE;EACE,iCAAiC;A9C8hSrC;;A8C/hSE;EACE,yCAAiC;A9CkiSrC;;A8C9hSE;EACE,4BAA4B;A9CiiShC;;A8CliSE;EACE,0BAA4B;A9CqiShC;;A8CtiSE;EACE,kCAA4B;A9CyiShC;;A8CriSE;EACE,sCAAkC;A9CwiStC;;A8CziSE;EACE,oCAAkC;A9C4iStC;;A8C7iSE;EACE,kCAAkC;A9CgjStC;;A8CjjSE;EACE,yCAAkC;A9CojStC;;A8CrjSE;EACE,wCAAkC;A9CwjStC;;A8CzjSE;EACE,wCAAkC;A9C4jStC;;A8C7jSE;EACE,iCAAkC;A9CgkStC;;A8CjkSE;EACE,+BAAkC;A9CokStC;;A8CrkSE;EACE,gCAAkC;A9CwkStC;;A8CzkSE;EACE,iCAAkC;A9C4kStC;;A8CxkSE;EACE,oCAAgC;A9C2kSpC;;A8C5kSE;EACE,kCAAgC;A9C+kSpC;;A8ChlSE;EACE,gCAAgC;A9CmlSpC;;A8CplSE;EACE,uCAAgC;A9CulSpC;;A8CxlSE;EACE,sCAAgC;A9C2lSpC;;A8C5lSE;EACE,sCAAgC;A9C+lSpC;;A8ChmSE;EACE,iCAAgC;A9CmmSpC;;A8CpmSE;EACE,+BAAgC;A9CumSpC;;A8CxmSE;EACE,6BAAgC;A9C2mSpC;;A8C5mSE;EACE,kCAAgC;A9C+mSpC;;A8C3mSE;EACE,+BAA8B;A9C8mSlC;;A8C/mSE;EACE,kCAA8B;A9CknSlC;;A8CnnSE;EACE,gCAA8B;A9CsnSlC;;A8CvnSE;EACE,8BAA8B;A9C0nSlC;;A8C3nSE;EACE,gCAA8B;A9C8nSlC;;A8C/nSE;EACE,6BAA8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0vTjC;;AoD3vTI;EACE,0BAA2B;ApD8vTjC;;AoD/vTI;EACE,4BAA2B;ApDkwTjC;;AoDnwTI;EACE,6BAA2B;ApDswTjC;;AoDvwTI;EACE,0BAA2B;ApD0wTjC;;AoD3wTI;EACE,6BAA2B;ApD8wTjC;;ACvrTE;EmDxFE;IACE,0BAA2B;EpDmxT/B;EoDpxTE;IACE,4BAA2B;EpDsxT/B;EoDvxTE;IACE,0BAA2B;EpDyxT/B;EoD1xTE;IACE,4BAA2B;EpD4xT/B;EoD7xTE;IACE,6BAA2B;EpD+xT/B;EoDhyTE;IACE,0BAA2B;EpDkyT/B;EoDnyTE;IACE,6BAA2B;EpDqyT/B;AACF;;AC3sTE;EmD5FE;IACE,0BAA2B;EpD2yT/B;EoD5yTE;IACE,4BAA2B;EpD8yT/B;EoD/yTE;IACE,0BAA2B;EpDizT/B;EoDlzTE;IACE,4BAA2B;EpDozT/B;EoDrzTE;IACE,6BAA2B;EpDuzT/B;EoDxzTE;IACE,0BAA2B;EpD0zT/B;EoD3zTE;IACE,6BAA2B;EpD6zT/B;AACF;;AC3tTE;EmDpGE;IACE,0BAA2B;EpDm0T/B;EoDp0TE;IACE,4BAA2B;EpDs0T/B;EoDv0TE;IACE,0BAA2B;EpDy0T/B;EoD10TE;IACE,4BAA2B;EpD40T/B;EoD70TE;IACE,6BAA2B;EpD+0T/B;EoDh1TE;IACE,0BAA2B;EpDk1T/B;EoDn1TE;IACE,6BAA2B;EpDq1T/B;AACF;;AC/uTE;EmDxGE;IACE,0BAA2B;EpD21T/B;EoD51TE;IACE,4BAA2B;EpD81T/B;EoD/1TE;IACE,0BAA2B;EpDi2T/B;EoDl2TE;IACE,4BAA2B;EpDo2T/B;EoDr2TE;IACE,6BAA2B;EpDu2T/B;EoDx2TE;IACE,0BAA2B;EpD02T/B;EoD32TE;IACE,6BAA2B;EpD62T/B;AACF;;ACxvTI;EmDvHA;IACE,0BAA2B;EpDm3T/B;EoDp3TE;IACE,4BAA2B;EpDs3T/B;EoDv3TE;IACE,0BAA2B;EpDy3T/B;EoD13TE;IACE,4BAA2B;EpD43T/B;EoD73TE;IACE,6BAA2B;EpD+3T/B;EoDh4TE;IACE,0BAA2B;EpDk4T/B;EoDn4TE;IACE,6BAA2B;EpDq4T/B;AACF;;ACjwTI;EmDtIA;IACE,0BAA2B;EpD24T/B;EoD54TE;IACE,4BAA2B;EpD84T/B;EoD/4TE;IACE,0BAA2B;EpDi5T/B;EoDl5TE;IACE,4BAA2B;EpDo5T/B;EoDr5TE;IACE,6BAA2B;EpDu5T/B;EoDx5TE;IACE,0BAA2B;EpD05T/B;EoD35TE;IACE,6BAA2B;EpD65T/B;AACF;;AoDr4TE;EACE,6BAAqC;ApDw4TzC;;AoDz4TE;EACE,8BAAqC;ApD44TzC;;AoD74TE;EACE,2BAAqC;ApDg5TzC;;AoDj5TE;EACE,4BAAqC;ApDo5TzC;;ACv1TE;EmDzDE;IACE,6BAAqC;EpDo5TzC;AACF;;ACz1TE;EmD1DE;IACE,6BAAqC;EpDu5TzC;AACF;;AC31TE;EmD3DE;IACE,6BAAqC;EpD05TzC;AACF;;AC71TE;EmD5DE;IACE,6BAAqC;EpD65TzC;AACF;;AC/1TE;EmD7DE;IACE,6BAAqC;EpDg6TzC;AACF;;ACh2TI;EmD/DA;IACE,6BAAqC;EpDm6TzC;AACF;;AC51TI;EmDtEA;IACE,6BAAqC;EpDs6TzC;AACF;;AC71TI;EmDxEA;IACE,6BAAqC;EpDy6TzC;AACF;;ACz1TI;EmD/EA;IACE,6BAAqC;EpD46TzC;AACF;;AC74TE;EmDzDE;IACE,8BAAqC;EpD08TzC;AACF;;AC/4TE;EmD1DE;IACE,8BAAqC;EpD68TzC;AACF;;ACj5TE;EmD3DE;IACE,8BAAqC;EpDg9TzC;AACF;;ACn5TE;EmD5DE;IACE,8BAAqC;EpDm9TzC;AACF;;ACr5TE;EmD7DE;IACE,8BAAqC;EpDs9TzC;AACF;;ACt5TI;EmD/DA;IACE,8BAAqC;EpDy9TzC;AACF;;ACl5TI;EmDtEA;IACE,8BAAqC;EpD49TzC;AACF;;ACn5TI;EmDxEA;IACE,8BAAqC;EpD+9TzC;AACF;;AC/4TI;EmD/EA;IACE,8BAAqC;EpDk+TzC;AACF;;ACn8TE;EmDzDE;IACE,2BAAqC;EpDggUzC;AACF;;ACr8TE;EmD1DE;IACE,2BAAqC;EpDmgUzC;AACF;;ACv8TE;EmD3DE;IACE,2BAAqC;EpDsgUzC;AACF;;ACz8TE;EmD5DE;IACE,2BAAqC;EpDygUzC;AACF;;AC38TE;EmD7DE;IACE,2BAAqC;EpD4gUzC;AACF;;AC58TI;EmD/DA;IACE,2BAAqC;EpD+gUzC;AACF;;ACx8TI;EmDtEA;IACE,2BAAqC;EpDkhUzC;AACF;;ACz8TI;EmDxEA;IACE,2BAAqC;EpDqhUzC;AACF;;ACr8TI;EmD/EA;IACE,2BAAqC;EpDwhUzC;AACF;;ACz/TE;EmDzDE;IACE,4BAAqC;EpDsjUzC;AACF;;AC3/TE;EmD1DE;IACE,4BAAqC;EpDyjUzC;AACF;;AC7/TE;EmD3DE;IACE,4BAAqC;EpD4jUzC;AACF;;AC//TE;EmD5DE;IACE,4BAAqC;EpD+jUzC;AACF;;ACjgUE;EmD7DE;IACE,4BAAqC;EpDkkUzC;AACF;;AClgUI;EmD/DA;IACE,4BAAqC;EpDqkUzC;AACF;;AC9/TI;EmDtEA;IACE,4BAAqC;EpDwkUzC;AACF;;AC//TI;EmDxEA;IACE,4BAAqC;EpD2kUzC;AACF;;AC3/TI;EmD/EA;IACE,4BAAqC;EpD8kUzC;AACF;;AoD7kUA;EACE,qCAAqC;ApDglUvC;;AoD9kUA;EACE,oCAAoC;ApDilUtC;;AoD/kUA;EACE,oCAAoC;ApDklUtC;;AoDhlUA;EACE,6BAA6B;ApDmlU/B;;AoDjlUA;EACE,qCAAqC;ApDolUvC;;AoDllUA;EACE,2BAAqC;ApDqlUvC;;AoDplUA;EACE,2BAAsC;ApDulUxC;;AoDtlUA;EACE,2BAAsC;ApDylUxC;;AoDxlUA;EACE,2BAAwC;ApD2lU1C;;AoD1lUA;EACE,2BAAoC;ApD6lUtC;;AoD3lUA;EACE,+LAAuC;ApD8lUzC;;AoD5lUA;EACE,+LAAyC;ApD+lU3C;;AoD7lUA;EACE,+LAA0C;ApDgmU5C;;AoD9lUA;EACE,iCAAyC;ApDimU3C;;AoD/lUA;EACE,iCAAoC;ApDkmUtC;;AqDnsUE;EACE,yBAA+B;ArDssUnC;;AC/mUE;EoDrFE;IACE,yBAA+B;ErDwsUnC;AACF;;ACjnUE;EoDtFE;IACE,yBAA+B;ErD2sUnC;AACF;;ACnnUE;EoDvFE;IACE,yBAA+B;ErD8sUnC;AACF;;ACrnUE;EoDxFE;IACE,yBAA+B;ErDitUnC;AACF;;ACvnUE;EoDzFE;IACE,yBAA+B;ErDotUnC;AACF;;ACxnUI;EoD3FA;IACE,yBAA+B;ErDutUnC;AACF;;ACpnUI;EoDlGA;IACE,yBAA+B;ErD0tUnC;AACF;;ACrnUI;EoDpGA;IACE,yBAA+B;ErD6tUnC;AACF;;ACjnUI;EoD3GA;IACE,yBAA+B;ErDguUnC;AACF;;AqD7vUE;EACE,wBAA+B;ArDgwUnC;;ACzqUE;EoDrFE;IACE,wBAA+B;ErDkwUnC;AACF;;AC3qUE;EoDtFE;IACE,wBAA+B;ErDqwUnC;AACF;;AC7qUE;EoDvFE;IACE,wBAA+B;ErDwwUnC;AACF;;AC/qUE;EoDxFE;IACE,wBAA+B;ErD2wUnC;AACF;;ACjrUE;EoDzFE;IACE,wBAA+B;ErD8wUnC;AACF;;AClrUI;EoD3FA;IACE,wBAA+B;ErDixUnC;AACF;;AC9qUI;EoDlGA;IACE,wBAA+B;ErDoxUnC;AACF;;AC/qUI;EoDpGA;IACE,wBAA+B;ErDuxUnC;AACF;;AC3qUI;EoD3GA;IACE,wBAA+B;ErD0xUnC;AACF;;AqDvzUE;EACE,0BAA+B;ArD0zUnC;;ACnuUE;EoDrFE;IACE,0BAA+B;ErD4zUnC;AACF;;ACruUE;EoDtFE;IACE,0BAA+B;ErD+zUnC;AACF;;ACvuUE;EoDvFE;IACE,0BAA+B;ErDk0UnC;AACF;;ACzuUE;EoDxFE;IACE,0BAA+B;ErDq0UnC;AACF;;AC3uUE;EoDzFE;IACE,0BAA+B;ErDw0UnC;AACF;;AC5uUI;EoD3FA;IACE,0BAA+B;ErD20UnC;AACF;;ACxuUI;EoDlGA;IACE,0BAA+B;ErD80UnC;AACF;;ACzuUI;EoDpGA;IACE,0BAA+B;ErDi1UnC;AACF;;ACruUI;EoD3GA;IACE,0BAA+B;ErDo1UnC;AACF;;AqDj3UE;EACE,gCAA+B;ArDo3UnC;;AC7xUE;EoDrFE;IACE,gCAA+B;ErDs3UnC;AACF;;AC/xUE;EoDtFE;IACE,gCAA+B;ErDy3UnC;AACF;;ACjyUE;EoDvFE;IACE,gCAA+B;ErD43UnC;AACF;;ACnyUE;EoDxFE;IACE,gCAA+B;ErD+3UnC;AACF;;ACryUE;EoDzFE;IACE,gCAA+B;ErDk4UnC;AACF;;ACtyUI;EoD3FA;IACE,gCAA+B;ErDq4UnC;AACF;;AClyUI;EoDlGA;IACE,gCAA+B;ErDw4UnC;AACF;;ACnyUI;EoDpGA;IACE,gCAA+B;ErD24UnC;AACF;;AC/xUI;EoD3GA;IACE,gCAA+B;ErD84UnC;AACF;;AqD36UE;EACE,+BAA+B;ArD86UnC;;ACv1UE;EoDrFE;IACE,+BAA+B;ErDg7UnC;AACF;;ACz1UE;EoDtFE;IACE,+BAA+B;ErDm7UnC;AACF;;AC31UE;EoDvFE;IACE,+BAA+B;ErDs7UnC;AACF;;AC71UE;EoDxFE;IACE,+BAA+B;ErDy7UnC;AACF;;AC/1UE;EoDzFE;IACE,+BAA+B;ErD47UnC;AACF;;ACh2UI;EoD3FA;IACE,+BAA+B;ErD+7UnC;AACF;;AC51UI;EoDlGA;IACE,+BAA+B;ErDk8UnC;AACF;;AC71UI;EoDpGA;IACE,+BAA+B;ErDq8UnC;AACF;;ACz1UI;EoD3GA;IACE,+BAA+B;ErDw8UnC;AACF;;AqDv8UA;EACE,wBAAwB;ArD08U1B;;AqDx8UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArD28U1B;;AC55UE;EoD5CA;IACE,wBAAwB;ErD48U1B;AACF;;AC95UE;EoD5CA;IACE,wBAAwB;ErD88U1B;AACF;;ACh6UE;EoD5CA;IACE,wBAAwB;ErDg9U1B;AACF;;ACl6UE;EoD5CA;IACE,wBAAwB;ErDk9U1B;AACF;;ACp6UE;EoD5CA;IACE,wBAAwB;ErDo9U1B;AACF;;ACr6UI;EoD7CF;IACE,wBAAwB;ErDs9U1B;AACF;;ACj6UI;EoDnDF;IACE,wBAAwB;ErDw9U1B;AACF;;ACl6UI;EoDpDF;IACE,wBAAwB;ErD09U1B;AACF;;AC95UI;EoD1DF;IACE,wBAAwB;ErD49U1B;AACF;;AqD39UA;EACE,6BAA6B;ArD89U/B;;ACt9UE;EoDLA;IACE,6BAA6B;ErD+9U/B;AACF;;ACx9UE;EoDLA;IACE,6BAA6B;ErDi+U/B;AACF;;AC19UE;EoDLA;IACE,6BAA6B;ErDm+U/B;AACF;;AC59UE;EoDLA;IACE,6BAA6B;ErDq+U/B;AACF;;AC99UE;EoDLA;IACE,6BAA6B;ErDu+U/B;AACF;;AC/9UI;EoDNF;IACE,6BAA6B;ErDy+U/B;AACF;;AC39UI;EoDZF;IACE,6BAA6B;ErD2+U/B;AACF;;AC59UI;EoDbF;IACE,6BAA6B;ErD6+U/B;AACF;;ACx9UI;EoDnBF;IACE,6BAA6B;ErD++U/B;AACF;;AsDzmVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvDkmVhC;;AuDtmVA;EAMI,gBAAgB;AvDomVpB;;AuD1mVA;EASM,mBAAmB;AvDqmVzB;;AuD9mVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;AC4nV7B;;AuDnnVA;;EAmBQ,cAAc;AvDqmVtB;;AuDxnVA;EAqBQ,cxD9BqB;ACqoV7B;;AuD5nVA;EAuBQ,4BxDhCqB;ACyoV7B;;AuDhoVA;;EA0BU,cxDnCmB;AC8oV7B;;ACviVE;EsD9FF;IA6BU,uBxDzBqB;ECsoV7B;AACF;;AuD3oVA;;EAgCQ,4BxDzCqB;ACypV7B;;AuDhpVA;;;EAqCU,yB7C6DuB;E6C5DvB,cxD/CmB;ACgqV7B;;AuDvpVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvDknVtB;;AuD5pVA;EA4CY,UAAU;AvDonVtB;;AuDhqVA;EA+CY,uBAAwB;EACxB,UAAU;AvDqnVtB;;AuDrqVA;EAoDY,cxD7DiB;ACkrV7B;;AuDzqVA;EAsDc,uCxD/De;ACsrV7B;;AuD7qVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;AC+qV/B;;AuDnrVA;EAkEU,4EAAyG;AvDqnVnH;;ACrmVE;EsDlFF;IAqEc,4EAAyG;EvDunVrH;AACF;;AuD7rVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;AC8rV/B;;AuDlsVA;;EAmBQ,cAAc;AvDorVtB;;AuDvsVA;EAqBQ,YxDjBuB;ACusV/B;;AuD3sVA;EAuBQ,+BxDnBuB;AC2sV/B;;AuD/sVA;;EA0BU,YxDtBqB;ACgtV/B;;ACtnVE;EsD9FF;IA6BU,yBxDtCmB;ECkuV3B;AACF;;AuD1tVA;;EAgCQ,+BxD5BuB;AC2tV/B;;AuD/tVA;;;EAqCU,uB7C6DuB;E6C5DvB,YxDlCqB;ACkuV/B;;AuDtuVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDisVtB;;AuD3uVA;EA4CY,UAAU;AvDmsVtB;;AuD/uVA;EA+CY,yBAAwB;EACxB,UAAU;AvDosVtB;;AuDpvVA;EAoDY,YxDhDmB;ACovV/B;;AuDxvVA;EAsDc,uCxD/De;ACqwV7B;;AuD5vVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;AC2wV7B;;AuDlwVA;EAkEU,8EAAyG;AvDosVnH;;ACprVE;EsDlFF;IAqEc,8EAAyG;EvDssVrH;AACF;;AuD5wVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AV4sVrB;;AuDjxVA;;EAmBQ,cAAc;AvDmwVtB;;AuDtxVA;EAqBQ,yB7CgDa;AVqtVrB;;AuD1xVA;EAuBQ,yB7C8Ca;AVytVrB;;AuD9xVA;;EA0BU,yB7C2CW;AV8tVrB;;ACrsVE;EsD9FF;IA6BU,4BxD3BoB;ECsyV5B;AACF;;AuDzyVA;;EAgCQ,yB7CqCa;AVyuVrB;;AuD9yVA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AVgvVrB;;AuDrzVA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDgxVtB;;AuD1zVA;EA4CY,UAAU;AvDkxVtB;;AuD9zVA;EA+CY,4BAAwB;EACxB,UAAU;AvDmxVtB;;AuDn0VA;EAoDY,yB7CiBS;AVkwVrB;;AuDv0VA;EAsDc,uCxD/De;ACo1V7B;;AuD30VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;AC+0V9B;;AuDj1VA;EAkEU,iFAAyG;AvDmxVnH;;ACnwVE;EsDlFF;IAqEc,iFAAyG;EvDqxVrH;AACF;;AuD31VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVyxVhB;;AuDh2VA;;EAmBQ,cAAc;AvDk1VtB;;AuDr2VA;EAqBQ,W7CkDQ;AVkyVhB;;AuDz2VA;EAuBQ,+B7CgDQ;AVsyVhB;;AuD72VA;;EA0BU,W7C6CM;AV2yVhB;;ACpxVE;EsD9FF;IA6BU,yBxDlCoB;EC43V5B;AACF;;AuDx3VA;;EAgCQ,+B7CuCQ;AVszVhB;;AuD73VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV6zVhB;;AuDp4VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD+1VtB;;AuDz4VA;EA4CY,UAAU;AvDi2VtB;;AuD74VA;EA+CY,yBAAwB;EACxB,UAAU;AvDk2VtB;;AuDl5VA;EAoDY,W7CmBI;AV+0VhB;;AuDt5VA;EAsDc,uCxD/De;ACm6V7B;;AuD15VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;ACq6V9B;;AuDh6VA;EAkEU,gFAAyG;AvDk2VnH;;ACl1VE;EsDlFF;IAqEc,gFAAyG;EvDo2VrH;AACF;;AuD16VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVw2VhB;;AuD/6VA;;EAmBQ,cAAc;AvDi6VtB;;AuDp7VA;EAqBQ,W7CkDQ;AVi3VhB;;AuDx7VA;EAuBQ,+B7CgDQ;AVq3VhB;;AuD57VA;;EA0BU,W7C6CM;AV03VhB;;ACn2VE;EsD9FF;IA6BU,yBxDpBwB;EC67VhC;AACF;;AuDv8VA;;EAgCQ,+B7CuCQ;AVq4VhB;;AuD58VA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV44VhB;;AuDn9VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD86VtB;;AuDx9VA;EA4CY,UAAU;AvDg7VtB;;AuD59VA;EA+CY,yBAAwB;EACxB,UAAU;AvDi7VtB;;AuDj+VA;EAoDY,W7CmBI;AV85VhB;;AuDr+VA;EAsDc,uCxD/De;ACk/V7B;;AuDz+VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;ACs+VlC;;AuD/+VA;EAkEU,gFAAyG;AvDi7VnH;;ACj6VE;EsDlFF;IAqEc,gFAAyG;EvDm7VrH;AACF;;AuDz/VA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AVu7VhB;;AuD9/VA;;EAmBQ,cAAc;AvDg/VtB;;AuDngWA;EAqBQ,W7CkDQ;AVg8VhB;;AuDvgWA;EAuBQ,+B7CgDQ;AVo8VhB;;AuD3gWA;;EA0BU,W7C6CM;AVy8VhB;;ACl7VE;EsD9FF;IA6BU,yBxDlBwB;EC0gWhC;AACF;;AuDthWA;;EAgCQ,+B7CuCQ;AVo9VhB;;AuD3hWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV29VhB;;AuDliWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD6/VtB;;AuDviWA;EA4CY,UAAU;AvD+/VtB;;AuD3iWA;EA+CY,yBAAwB;EACxB,UAAU;AvDggWtB;;AuDhjWA;EAoDY,W7CmBI;AV6+VhB;;AuDpjWA;EAsDc,uCxD/De;ACikW7B;;AuDxjWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;ACmjWlC;;AuD9jWA;EAkEU,gFAAyG;AvDggWnH;;ACh/VE;EsDlFF;IAqEc,gFAAyG;EvDkgWrH;AACF;;AuDxkWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AVsgWhB;;AuD7kWA;;EAmBQ,cAAc;AvD+jWtB;;AuDllWA;EAqBQ,W7CkDQ;AV+gWhB;;AuDtlWA;EAuBQ,+B7CgDQ;AVmhWhB;;AuD1lWA;;EA0BU,W7C6CM;AVwhWhB;;ACjgWE;EsD9FF;IA6BU,yBxDnBwB;EC0lWhC;AACF;;AuDrmWA;;EAgCQ,+B7CuCQ;AVmiWhB;;AuD1mWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AV0iWhB;;AuDjnWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD4kWtB;;AuDtnWA;EA4CY,UAAU;AvD8kWtB;;AuD1nWA;EA+CY,yBAAwB;EACxB,UAAU;AvD+kWtB;;AuD/nWA;EAoDY,W7CmBI;AV4jWhB;;AuDnoWA;EAsDc,uCxD/De;ACgpW7B;;AuDvoWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;ACmoWlC;;AuD7oWA;EAkEU,gFAAyG;AvD+kWnH;;AC/jWE;EsDlFF;IAqEc,gFAAyG;EvDilWrH;AACF;;AuDvpWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AVqlWhB;;AuD5pWA;;EAmBQ,cAAc;AvD8oWtB;;AuDjqWA;EAqBQ,W7CkDQ;AV8lWhB;;AuDrqWA;EAuBQ,+B7CgDQ;AVkmWhB;;AuDzqWA;;EA0BU,W7C6CM;AVumWhB;;AChlWE;EsD9FF;IA6BU,yBxDrBwB;EC2qWhC;AACF;;AuDprWA;;EAgCQ,+B7CuCQ;AVknWhB;;AuDzrWA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVynWhB;;AuDhsWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvD2pWtB;;AuDrsWA;EA4CY,UAAU;AvD6pWtB;;AuDzsWA;EA+CY,yBAAwB;EACxB,UAAU;AvD8pWtB;;AuD9sWA;EAoDY,W7CmBI;AV2oWhB;;AuDltWA;EAsDc,uCxD/De;AC+tW7B;;AuDttWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;ACotWlC;;AuD5tWA;EAkEU,gFAAyG;AvD8pWnH;;AC9oWE;EsDlFF;IAqEc,gFAAyG;EvDgqWrH;AACF;;AuDtuWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AVsqWrB;;AuD3uWA;;EAmBQ,cAAc;AvD6tWtB;;AuDhvWA;EAqBQ,yB7CgDa;AV+qWrB;;AuDpvWA;EAuBQ,yB7C8Ca;AVmrWrB;;AuDxvWA;;EA0BU,yB7C2CW;AVwrWrB;;AC/pWE;EsD9FF;IA6BU,yBxDtBwB;EC2vWhC;AACF;;AuDnwWA;;EAgCQ,yB7CqCa;AVmsWrB;;AuDxwWA;;;EAqCU,yB7C6DuB;E6C5DvB,yB7C+BW;AV0sWrB;;AuD/wWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvD0uWtB;;AuDpxWA;EA4CY,UAAU;AvD4uWtB;;AuDxxWA;EA+CY,yBAAwB;EACxB,UAAU;AvD6uWtB;;AuD7xWA;EAoDY,yB7CiBS;AV4tWrB;;AuDjyWA;EAsDc,uCxD/De;AC8yW7B;;AuDryWA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;ACoyWlC;;AuD3yWA;EAkEU,gFAAyG;AvD6uWnH;;AC7tWE;EsDlFF;IAqEc,gFAAyG;EvD+uWrH;AACF;;AuDrzWA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AVmvWhB;;AuD1zWA;;EAmBQ,cAAc;AvD4yWtB;;AuD/zWA;EAqBQ,W7CkDQ;AV4vWhB;;AuDn0WA;EAuBQ,+B7CgDQ;AVgwWhB;;AuDv0WA;;EA0BU,W7C6CM;AVqwWhB;;AC9uWE;EsD9FF;IA6BU,yBxDhBuB;ECo0W/B;AACF;;AuDl1WA;;EAgCQ,+B7CuCQ;AVgxWhB;;AuDv1WA;;;EAqCU,yB7C6DuB;E6C5DvB,W7CiCM;AVuxWhB;;AuD91WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDyzWtB;;AuDn2WA;EA4CY,UAAU;AvD2zWtB;;AuDv2WA;EA+CY,yBAAwB;EACxB,UAAU;AvD4zWtB;;AuD52WA;EAoDY,W7CmBI;AVyyWhB;;AuDh3WA;EAsDc,uCxD/De;AC63W7B;;AuDp3WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;AC62WjC;;AuD13WA;EAkEU,gFAAyG;AvD4zWnH;;AC5yWE;EsDlFF;IAqEc,gFAAyG;EvD8zWrH;AACF;;AuDp4WA;EAyEM,eAhF0B;AvD+4WhC;;AClzWE;EsDtFF;IA6EQ,oBAnF8B;EvDm5WpC;AACF;;ACxzWE;EsDtFF;IAiFQ,mBAtF4B;EvDw5WlC;AACF;;AuDp5WA;EAsFM,mBAAmB;EACnB,aAAa;AvDk0WnB;;AuDz5WA;EAyFQ,YAAY;EACZ,cAAc;AvDo0WtB;;AuD95WA;EA4FI,gBAAgB;AvDs0WpB;;AuDl6WA;EA8FI,iBAAiB;AvDw0WrB;;AuDp0WA;EAEE,gBAAgB;AvDs0WlB;;AuDx0WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDw0WzC;;AuDj1WA;EAYI,YAAY;AvDy0WhB;;ACr2WE;EsDgBF;IAeI,aAAa;EvD20Wf;AACF;;AuD10WA;EACE,kBAAkB;AvD60WpB;;AC/2WE;EsDiCF;IAKM,aAAa;EvD80WjB;EuDn1WF;IAOQ,sBAAsB;EvD+0W5B;AACF;;ACp3WE;EsD6BF;IASI,aAAa;IACb,uBAAuB;EvDm1WzB;EuD71WF;ItD8BI,oBsDlBwC;EvDo1W1C;AACF;;AuDj1WA;;EAEE,YAAY;EACZ,cAAc;AvDo1WhB;;AuDl1WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDy+W/B;;AC14WE;EsDkDF;IAKI,kBArJgC;EvD6+WlC;AACF;;AwD1+WA;EACE,oBAN2B;AxDm/W7B;;ACx4WE;EuDtGF;IAII,kBAR+B;ExDu/WjC;EwDn/WF;IAOM,oBAV8B;ExDy/WlC;EwDt/WF;IASM,mBAX4B;ExD2/WhC;AACF;;AyD3/WA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzDkgXjC","file":"bulma.css"} \ No newline at end of file +{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EHvDE,iCAAiC;EGyDjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTyDgB;ESxDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AS/ZA;EAGE,uBVhD6B;EUiD7B,qBVtD4B;EUuD5B,iBX5DwB;EW6DxB,cV5D4B;EU6D5B,eAAe;EAGf,uBAAuB;EACvB,iCA7D6D;EA8D7D,iBA7D6B;EA8D7B,kBA9D6B;EA+D7B,8BAhE6D;EAiE7D,kBAAkB;EAClB,mBAAmB;AT8ZrB;;AS9aA;EAkBI,cAAc;ATgalB;;ASlbA;EAwBM,aAAa;EACb,YAAY;AT8ZlB;;ASvbA;ERwHI,+BQ7FsG;ER6FtG,oBQ5FmE;ATgavE;;AS5bA;ERwHI,mBQ1FmE;ER0FnE,gCQzFsG;ATka1G;;ASjcA;EAiCM,+BAAiF;EACjF,gCAAkF;AToaxF;;AStcA;EAsCI,qBVzF0B;EU0F1B,cV7F0B;ACigB9B;;AS3cA;EA0CI,qBVhF8B;EUiF9B,cVjG0B;ACsgB9B;;AShdA;EA6CM,iDVnF4B;AC0flC;;ASpdA;EAgDI,qBVrG0B;EUsG1B,cVvG0B;AC+gB9B;;ASzdA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV3G0B;EU4G1B,0BA1F8B;ATmgBlC;;ASheA;EA4DM,4BV3GwB;EU4GxB,cVnHwB;AC2hB9B;;ASreA;EAgEM,yBChB2B;EDiB3B,cVvHwB;ACgiB9B;;AS1eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT2atB;;ASjfA;EAwEI,gBAvG0B;EAwG1B,yBAvGmC;EAwGnC,cVhH8B;EUiH9B,qBAvG0B;ATohB9B;;ASxfA;EA8EM,cVpH4B;EUqH5B,0BAzGmC;ATuhBzC;;AS7fA;EAoFM,uBVjIyB;EUkIzB,yBAAyB;EACzB,cVhJuB;AC6jB7B;;ASngBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,cVrJqB;ACmkB7B;;ASzgBA;EA8FQ,yBAAyB;EACzB,cVzJqB;ACwkB7B;;AS9gBA;EAiGU,mDV9IqB;AC+jB/B;;ASlhBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,cVhKqB;ACklB7B;;ASxhBA;;EAyGQ,uBVtJuB;EUuJvB,mBVvJuB;EUwJvB,gBAAgB;ATobxB;;AS/hBA;EA6GQ,yBVvKqB;EUwKrB,YV3JuB;ACilB/B;;ASpiBA;EAiHU,uBCjEuB;AVwfjC;;ASxiBA;;EAoHU,yBV9KmB;EU+KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVpKqB;AC6lB/B;;AShjBA;EA0HU,gEAA4E;AT0btF;;ASpjBA;EA4HQ,6BAA6B;EAC7B,mBV1KuB;EU2KvB,YV3KuB;ACumB/B;;AS1jBA;EAmIU,uBVhLqB;EUiLrB,mBVjLqB;EUkLrB,cV/LmB;AC0nB7B;;AShkBA;EAwIY,4DAA8D;AT4b1E;;ASpkBA;EA8Ic,gEAA4E;AT0b1F;;ASxkBA;;EAiJU,6BAA6B;EAC7B,mBV/LqB;EUgMrB,gBAAgB;EAChB,YVjMqB;AC6nB/B;;AShlBA;EAsJQ,6BAA6B;EAC7B,qBVjNqB;EUkNrB,cVlNqB;ACgpB7B;;AStlBA;EA6JU,yBVvNmB;EUwNnB,YV3MqB;ACwoB/B;;AS3lBA;EAqKc,4DAA8D;AT0b5E;;AS/lBA;;EAwKU,6BAA6B;EAC7B,qBVnOmB;EUoOnB,gBAAgB;EAChB,cVrOmB;ACiqB7B;;ASvmBA;EAoFM,yBV9IuB;EU+IvB,yBAAyB;EACzB,YVnIyB;AC0pB/B;;AS7mBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,YVxIuB;ACgqB/B;;ASnnBA;EA8FQ,yBAAyB;EACzB,YV5IuB;ACqqB/B;;ASxnBA;EAiGU,gDV3JmB;ACsrB7B;;AS5nBA;EAoGQ,uBCpDyB;EDqDzB,yBAAyB;EACzB,YVnJuB;AC+qB/B;;ASloBA;;EAyGQ,yBVnKqB;EUoKrB,qBVpKqB;EUqKrB,gBAAgB;AT8hBxB;;ASzoBA;EA6GQ,uBV1JuB;EU2JvB,cVxKqB;ACwsB7B;;AS9oBA;EAiHU,yBCjEuB;AVkmBjC;;ASlpBA;;EAoHU,uBVjKqB;EUkKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVjLmB;ACotB7B;;AS1pBA;EA0HU,4DAA4E;AToiBtF;;AS9pBA;EA4HQ,6BAA6B;EAC7B,qBVvLqB;EUwLrB,cVxLqB;AC8tB7B;;ASpqBA;EAmIU,yBV7LmB;EU8LnB,qBV9LmB;EU+LnB,YVlLqB;ACutB/B;;AS1qBA;EAwIY,gEAA8D;ATsiB1E;;AS9qBA;EA8Ic,4DAA4E;AToiB1F;;ASlrBA;;EAiJU,6BAA6B;EAC7B,qBV5MmB;EU6MnB,gBAAgB;EAChB,cV9MmB;ACovB7B;;AS1rBA;EAsJQ,6BAA6B;EAC7B,mBVpMuB;EUqMvB,YVrMuB;AC6uB/B;;AShsBA;EA6JU,uBV1MqB;EU2MrB,cVxNmB;AC+vB7B;;ASrsBA;EAqKc,gEAA8D;AToiB5E;;ASzsBA;;EAwKU,6BAA6B;EAC7B,mBVtNqB;EUuNrB,gBAAgB;EAChB,YVxNqB;AC8vB/B;;ASjtBA;EAoFM,4BVnIwB;EUoIxB,yBAAyB;EACzB,yBClEe;AVmsBrB;;ASvtBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVysBrB;;AS7tBA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV8sBrB;;ASluBA;EAiGU,mDVhJoB;ACqxB9B;;AStuBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVwtBrB;;AS5uBA;;EAyGQ,4BVxJsB;EUyJtB,wBVzJsB;EU0JtB,gBAAgB;ATwoBxB;;ASnvBA;EA6GQ,oCCzFa;ED0Fb,iBV7JsB;ACuyB9B;;ASxvBA;EAiHU,oCCjEuB;AV4sBjC;;AS5vBA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVtKoB;ACmzB9B;;ASpwBA;EA0HU,sFAA4E;AT8oBtF;;ASxwBA;EA4HQ,6BAA6B;EAC7B,wBV5KsB;EU6KtB,iBV7KsB;AC6zB9B;;AS9wBA;EAmIU,4BVlLoB;EUmLpB,wBVnLoB;EUoLpB,yBCjHW;AVgwBrB;;ASpxBA;EAwIY,sEAA8D;ATgpB1E;;ASxxBA;EA8Ic,sFAA4E;AT8oB1F;;AS5xBA;;EAiJU,6BAA6B;EAC7B,wBVjMoB;EUkMpB,gBAAgB;EAChB,iBVnMoB;ACm1B9B;;ASpyBA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVsxBrB;;AS1yBA;EA6JU,oCCzIW;ED0IX,iBV7MoB;AC81B9B;;AS/yBA;EAqKc,sEAA8D;AT8oB5E;;ASnzBA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVuyBrB;;AS3zBA;EAoFM,yBV1IwB;EU2IxB,yBAAyB;EACzB,WChEU;AV2yBhB;;ASj0BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVizBhB;;ASv0BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVszBhB;;AS50BA;EAiGU,gDVvJoB;ACs4B9B;;ASh1BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVg0BhB;;ASt1BA;;EAyGQ,yBV/JsB;EUgKtB,qBVhKsB;EUiKtB,gBAAgB;ATkvBxB;;AS71BA;EA6GQ,sBCvFQ;EDwFR,cVpKsB;ACw5B9B;;ASl2BA;EAiHU,yBCjEuB;AVszBjC;;ASt2BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7KoB;ACo6B9B;;AS92BA;EA0HU,0DAA4E;ATwvBtF;;ASl3BA;EA4HQ,6BAA6B;EAC7B,qBVnLsB;EUoLtB,cVpLsB;AC86B9B;;ASx3BA;EAmIU,yBVzLoB;EU0LpB,qBV1LoB;EU2LpB,WC/GM;AVw2BhB;;AS93BA;EAwIY,gEAA8D;AT0vB1E;;ASl4BA;EA8Ic,0DAA4E;ATwvB1F;;ASt4BA;;EAiJU,6BAA6B;EAC7B,qBVxMoB;EUyMpB,gBAAgB;EAChB,cV1MoB;ACo8B9B;;AS94BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV83BhB;;ASp5BA;EA6JU,sBCvIM;EDwIN,cVpNoB;AC+8B9B;;ASz5BA;EAqKc,gEAA8D;ATwvB5E;;AS75BA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+4BhB;;ASr6BA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WChEU;AVq5BhB;;AS36BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV25BhB;;ASj7BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVg6BhB;;ASt7BA;EAiGU,iDVzIwB;ACk+BlC;;AS17BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV06BhB;;ASh8BA;;EAyGQ,yBVjJ0B;EUkJ1B,qBVlJ0B;EUmJ1B,gBAAgB;AT41BxB;;ASv8BA;EA6GQ,sBCvFQ;EDwFR,cVtJ0B;ACo/BlC;;AS58BA;EAiHU,yBCjEuB;AVg6BjC;;ASh9BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACggClC;;ASx9BA;EA0HU,0DAA4E;ATk2BtF;;AS59BA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC0gClC;;ASl+BA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC/GM;AVk9BhB;;ASx+BA;EAwIY,gEAA8D;ATo2B1E;;AS5+BA;EA8Ic,0DAA4E;ATk2B1F;;ASh/BA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACgiClC;;ASx/BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVw+BhB;;AS9/BA;EA6JU,sBCvIM;EDwIN,cVtMwB;AC2iClC;;ASngCA;EAqKc,gEAA8D;ATk2B5E;;ASvgCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVy/BhB;;AS/gCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV++BrE;;ASphCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVq/BrE;;AS1hCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV2/BrE;;AShiCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WChEU;AVghChB;;AStiCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVshChB;;AS5iCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AV2hChB;;ASjjCA;EAiGU,iDVvIwB;AC2lClC;;ASrjCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVqiChB;;AS3jCA;;EAyGQ,yBV/I0B;EUgJ1B,qBVhJ0B;EUiJ1B,gBAAgB;ATu9BxB;;ASlkCA;EA6GQ,sBCvFQ;EDwFR,cVpJ0B;AC6mClC;;ASvkCA;EAiHU,yBCjEuB;AV2hCjC;;AS3kCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACynClC;;ASnlCA;EA0HU,0DAA4E;AT69BtF;;ASvlCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;ACmoClC;;AS7lCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC/GM;AV6kChB;;ASnmCA;EAwIY,gEAA8D;AT+9B1E;;ASvmCA;EA8Ic,0DAA4E;AT69B1F;;AS3mCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACypClC;;ASnnCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVmmChB;;ASznCA;EA6JU,sBCvIM;EDwIN,cVpMwB;ACoqClC;;AS9nCA;EAqKc,gEAA8D;AT69B5E;;ASloCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVonChB;;AS1oCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV0mCrE;;AS/oCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVgnCrE;;ASrpCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVsnCrE;;AS3pCA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WChEU;AV2oChB;;ASjqCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVipChB;;ASvqCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVspChB;;AS5qCA;EAiGU,kDVxIwB;ACutClC;;AShrCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVgqChB;;AStrCA;;EAyGQ,yBVhJ0B;EUiJ1B,qBVjJ0B;EUkJ1B,gBAAgB;ATklCxB;;AS7rCA;EA6GQ,sBCvFQ;EDwFR,cVrJ0B;ACyuClC;;ASlsCA;EAiHU,yBCjEuB;AVspCjC;;AStsCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACqvClC;;AS9sCA;EA0HU,0DAA4E;ATwlCtF;;ASltCA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC+vClC;;ASxtCA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC/GM;AVwsChB;;AS9tCA;EAwIY,gEAA8D;AT0lC1E;;ASluCA;EA8Ic,0DAA4E;ATwlC1F;;AStuCA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACqxClC;;AS9uCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV8tChB;;ASpvCA;EA6JU,sBCvIM;EDwIN,cVrMwB;ACgyClC;;ASzvCA;EAqKc,gEAA8D;ATwlC5E;;AS7vCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+uChB;;ASrwCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVquCrE;;AS1wCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV2uCrE;;AShxCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVivCrE;;AStxCA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,WChEU;AVswChB;;AS5xCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV4wChB;;ASlyCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVixChB;;ASvyCA;EAiGU,kDV1IwB;ACo1ClC;;AS3yCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV2xChB;;ASjzCA;;EAyGQ,yBVlJ0B;EUmJ1B,qBVnJ0B;EUoJ1B,gBAAgB;AT6sCxB;;ASxzCA;EA6GQ,sBCvFQ;EDwFR,cVvJ0B;ACs2ClC;;AS7zCA;EAiHU,yBCjEuB;AVixCjC;;ASj0CA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;ACk3ClC;;ASz0CA;EA0HU,0DAA4E;ATmtCtF;;AS70CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;AC43ClC;;ASn1CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,WC/GM;AVm0ChB;;ASz1CA;EAwIY,gEAA8D;ATqtC1E;;AS71CA;EA8Ic,0DAA4E;ATmtC1F;;ASj2CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;ACk5ClC;;ASz2CA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVy1ChB;;AS/2CA;EA6JU,sBCvIM;EDwIN,cVvMwB;AC65ClC;;ASp3CA;EAqKc,gEAA8D;ATmtC5E;;ASx3CA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV02ChB;;ASh4CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVg2CrE;;ASr4CA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVs2CrE;;AS34CA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV42CrE;;ASj5CA;EAoFM,yBV9H4B;EU+H5B,yBAAyB;EACzB,yBClEe;AVm4CrB;;ASv5CA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVy4CrB;;AS75CA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV84CrB;;ASl6CA;EAiGU,mDV3IwB;ACg9ClC;;ASt6CA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVw5CrB;;AS56CA;;EAyGQ,yBVnJ0B;EUoJ1B,qBVpJ0B;EUqJ1B,gBAAgB;ATw0CxB;;ASn7CA;EA6GQ,oCCzFa;ED0Fb,cVxJ0B;ACk+ClC;;ASx7CA;EAiHU,oCCjEuB;AV44CjC;;AS57CA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,cVjKwB;AC8+ClC;;ASp8CA;EA0HU,sFAA4E;AT80CtF;;ASx8CA;EA4HQ,6BAA6B;EAC7B,qBVvK0B;EUwK1B,cVxK0B;ACw/ClC;;AS98CA;EAmIU,yBV7KwB;EU8KxB,qBV9KwB;EU+KxB,yBCjHW;AVg8CrB;;ASp9CA;EAwIY,gEAA8D;ATg1C1E;;ASx9CA;EA8Ic,sFAA4E;AT80C1F;;AS59CA;;EAiJU,6BAA6B;EAC7B,qBV5LwB;EU6LxB,gBAAgB;EAChB,cV9LwB;AC8gDlC;;ASp+CA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVs9CrB;;AS1+CA;EA6JU,oCCzIW;ED0IX,cVxMwB;ACyhDlC;;AS/+CA;EAqKc,gEAA8D;AT80C5E;;ASn/CA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVu+CrB;;AS3/CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV29CrE;;AShgDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVi+CrE;;AStgDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVu+CrE;;AS5gDA;EAoFM,yBVxH2B;EUyH3B,yBAAyB;EACzB,WChEU;AV4/ChB;;ASlhDA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVkgDhB;;ASxhDA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVugDhB;;AS7hDA;EAiGU,kDVrIuB;ACqkDjC;;ASjiDA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVihDhB;;ASviDA;;EAyGQ,yBV7IyB;EU8IzB,qBV9IyB;EU+IzB,gBAAgB;ATm8CxB;;AS9iDA;EA6GQ,sBCvFQ;EDwFR,cVlJyB;ACulDjC;;ASnjDA;EAiHU,yBCjEuB;AVugDjC;;ASvjDA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV3JuB;ACmmDjC;;AS/jDA;EA0HU,0DAA4E;ATy8CtF;;ASnkDA;EA4HQ,6BAA6B;EAC7B,qBVjKyB;EUkKzB,cVlKyB;AC6mDjC;;ASzkDA;EAmIU,yBVvKuB;EUwKvB,qBVxKuB;EUyKvB,WC/GM;AVyjDhB;;AS/kDA;EAwIY,gEAA8D;AT28C1E;;ASnlDA;EA8Ic,0DAA4E;ATy8C1F;;ASvlDA;;EAiJU,6BAA6B;EAC7B,qBVtLuB;EUuLvB,gBAAgB;EAChB,cVxLuB;ACmoDjC;;AS/lDA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV+kDhB;;ASrmDA;EA6JU,sBCvIM;EDwIN,cVlMuB;AC8oDjC;;AS1mDA;EAqKc,gEAA8D;ATy8C5E;;AS9mDA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVgmDhB;;AStnDA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVslDrE;;AS3nDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV4lDrE;;ASjoDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVkmDrE;;ASvoDA;EARE,kBVdc;ACiqDhB;;ASrpDE;EACE,kBVkBc;ACsoDlB;;AS/oDA;EANE,eVjBW;AC0qDb;;ASnpDA;EAJE,kBVpBc;AC+qDhB;;ASvpDA;EAFE,iBVvBa;ACorDf;;AS3pDA;;EAyMI,uBVtP2B;EUuP3B,qBV5P0B;EU6P1B,gBAjOyB;EAkOzB,YAjOyB;ATwrD7B;;ASnqDA;EA8MI,aAAa;EACb,WAAW;ATy9Cf;;ASxqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT29CxB;;AS7qDA;ERnDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQmQhC,6BAA6B;AT89CnC;;ASprDA;EAwNI,4BVvQ0B;EUwQ1B,qBV3Q0B;EU4Q1B,cV9Q0B;EU+Q1B,gBAAgB;EAChB,oBAAoB;ATg+CxB;;AS5rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATk+C/D;;ASh+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATm+C7B;;ASv+CA;EAMI,qBAAqB;ATq+CzB;;AS3+CA;ER1GI,oBQkHwC;ATu+C5C;;AS/+CA;EAUI,sBAAsB;ATy+C1B;;ASn/CA;EAYI,mBAAmB;AT2+CvB;;ASv/CA;EA1OE,kBVdc;ACmvDhB;;ASvuDE;EACE,kBVkBc;ACwtDlB;;AS//CA;EAtOE,kBVpBc;AC6vDhB;;ASngDA;EApOE,iBVvBa;ACkwDf;;ASvgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATi/CjC;;AS5gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ERxI9B,kBQyIwC;ATm/C5C;;ASlhDA;ER1GI,eQ2IqC;ATq/CzC;;ASthDA;EAoCQ,UAAU;ATs/ClB;;AS1hDA;EA0CQ,UAAU;ATo/ClB;;AS9hDA;EA4CU,UAAU;ATs/CpB;;ASliDA;EA8CQ,YAAY;EACZ,cAAc;ATw/CtB;;ASviDA;EAiDI,uBAAuB;AT0/C3B;;AS3iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT2/C7B;;AShjDA;EAuDI,yBAAyB;AT6/C7B;;ASpjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT8/C7B;;ACzvDE;EQiQM;IACE,oBAlTyD;ET8yDjE;ES1/CM;;IAEE,qBAtT0F;ETkzDlG;ESjgDM;IACE,kBV1TM;EC6zDd;ESpgDM;IACE,eV3TG;ECi0DX;AACF;;ACrwDE;EQ6PM;IACE,qBAlTyL;ET8zDjM;ES1gDM;;IAEE,kBV9TM;EC00Dd;ESjhDM;IACE,eV3TG;EC80DX;ESphDM;IACE,kBV5TM;ECk1Dd;AACF;;AWl3DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WAAW;AXq3Db;;AWz3DA;EAMI,0BAA0B;EAC1B,kBZyCM;EYxCN,mBZwCM;EYvCN,WAAW;AXu3Df;;AC/wDE;EUjHF;IAWI,gBAAuC;EX03DzC;AACF;;AC3wDI;EU3HJ;IAcM,iBAAqE;EX63DzE;AACF;;AClwDI;EU1IJ;IAiBM,iBAAiE;EXg4DrE;AACF;;AClxDI;EUhIJ;IAoBM,iBAAqE;EXm4DzE;AACF;;ACzwDI;EU/IJ;IAuBM,iBAAiE;EXs4DrE;AACF;;AY34DA;EAII,kBAAkB;AZ24DtB;;AY/4DA;;;;;;;EAcM,kBAhC2B;AZ26DjC;;AYz5DA;;;;;;EAqBI,cbvC0B;EawC1B,gBbHiB;EaIjB,kBA3C+B;AZw7DnC;;AYp6DA;EAyBI,cAAc;EACd,oBAAoB;AZ+4DxB;;AYz6DA;EA4BM,eAAe;AZi5DrB;;AY76DA;EA8BI,iBAAiB;EACjB,uBAAuB;AZm5D3B;;AYl7DA;EAiCM,oBAAoB;AZq5D1B;;AYt7DA;EAmCI,gBAAgB;EAChB,uBAAuB;AZu5D3B;;AY37DA;EAsCM,oBAAoB;AZy5D1B;;AY/7DA;EAwCI,iBAAiB;EACjB,oBAAoB;AZ25DxB;;AYp8DA;EA2CI,kBAAkB;EAClB,uBAAuB;AZ65D3B;;AYz8DA;EA8CI,cAAc;EACd,kBAAkB;AZ+5DtB;;AY98DA;EAiDI,4Bb5D0B;EEuK1B,8BF1K0B;EaiE1B,qBAjEqC;AZk+DzC;;AYp9DA;EAqDI,4BAA4B;EXuG5B,gBWtGmC;EACnC,eAAe;AZm6DnB;;AY19DA;EAyDM,wBAAwB;AZq6D9B;;AY99DA;EA2DQ,4BAA4B;AZu6DpC;;AYl+DA;EA6DQ,4BAA4B;AZy6DpC;;AYt+DA;EA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kBI,uBAAuB;AfyyE3B;;Ae3zEA;EdiLI,ac7J4B;EAC5B,kBAAkB;EAClB,WAAW;Af2yEf;;Aej0EA;;;EA0BI,mBAAmB;Af6yEvB;;Aev0EA;EAgCM,uBhB5ByB;EgB6BzB,chB1CuB;ACq1E7B;;Ae50EA;EAgCM,yBhBzCuB;EgB0CvB,YhB7ByB;AC60E/B;;Aej1EA;EAgCM,4BhB9BwB;EgB+BxB,yBLoCe;AVixErB;;Aet1EA;EAgCM,yBhBrCwB;EgBsCxB,WLsCU;AVoxEhB;;Ae31EA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyxEhB;;Aeh2EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV+wErE;;Aer2EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmyEhB;;Ae12EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVyxErE;;Ae/2EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6yEhB;;Aep3EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVmyErE;;Aez3EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuzEhB;;Ae93EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV6yErE;;Aen4EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVm0ErB;;Aex4EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVuzErE;;Ae74EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV20EhB;;Ael5EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVi0ErE;;AgBx5EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjByDqB;EiBxDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB05Eb;;AgBp6EA;EAYI,yBjBX2B;ACu6E/B;;AgBx6EA;EAcI,yBjBjB0B;AC+6E9B;;AgB56EA;EAgBI,yBjBnB0B;ACm7E9B;;AgBh7EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk6EhB;;AgBr7EA;EAyBQ,uBjBpBuB;ACo7E/B;;AgBz7EA;EA2BQ,uBjBtBuB;ACw7E/B;;AgB77EA;EA6BQ,uBjBxBuB;AC47E/B;;AgBj8EA;EA+BQ,mEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjBjCqB;ACi9E7B;;AgBz8EA;EA2BQ,yBjBnCqB;ACq9E7B;;AgB78EA;EA6BQ,yBjBrCqB;ACy9E7B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,4BjBtBsB;ACs9E9B;;AgBz9EA;EA2BQ,4BjBxBsB;AC09E9B;;AgB79EA;EA6BQ,4BjB1BsB;AC89E9B;;AgBj+EA;EA+BQ,wEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjB7BsB;AC6+E9B;;AgBz+EA;EA2BQ,yBjB/BsB;ACi/E9B;;AgB7+EA;EA6BQ,yBjBjCsB;ACq/E9B;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBf0B;AC++ElC;;AgBz/EA;EA2BQ,yBjBjB0B;ACm/ElC;;AgB7/EA;EA6BQ,yBjBnB0B;ACu/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBb0B;AC6/ElC;;AgBzgFA;EA2BQ,yBjBf0B;ACigFlC;;AgB7gFA;EA6BQ,yBjBjB0B;ACqgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBd0B;AC8gFlC;;AgBzhFA;EA2BQ,yBjBhB0B;ACkhFlC;;AgB7hFA;EA6BQ,yBjBlB0B;ACshFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBhB0B;ACgiFlC;;AgBziFA;EA2BQ,yBjBlB0B;ACoiFlC;;AgB7iFA;EA6BQ,yBjBpB0B;ACwiFlC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAyBQ,yBjBjB0B;ACijFlC;;AgBzjFA;EA2BQ,yBjBnB0B;ACqjFlC;;AgB7jFA;EA6BQ,yBjBrB0B;ACyjFlC;;AgBjkFA;EA+BQ,qEAA2F;AhBsiFnG;;AgBrkFA;EAyBQ,yBjBXyB;AC2jFjC;;AgBzkFA;EA2BQ,yBjBbyB;AC+jFjC;;AgB7kFA;EA6BQ,yBjBfyB;ACmkFjC;;AgBjlFA;EA+BQ,qEAA2F;AhBsjFnG;;AgBrlFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBujF9B;;AgBjmFA;EA4CM,6BAA6B;AhByjFnC;;AgBrmFA;EA8CM,6BAA6B;AhB2jFnC;;AgBzmFA;EAgDM,oBAAoB;AhB6jF1B;;AgB7mFA;EAoDI,ejBxBY;ACqlFhB;;AgBjnFA;EAsDI,ejB5BY;AC2lFhB;;AgBrnFA;EAwDI,cjB/BW;ACgmFf;;AgB/jFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AgBxkFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AiB9mFA;EAEE,uBlBjB6B;EkBkB7B,clB3B4B;AC2oF9B;;AiBnnFA;;EAMI,yBlB1B0B;EkB2B1B,qBA/B6B;EAgC7B,qBA/B6B;EAgC7B,mBAAmB;AjBknFvB;;AiB3nFA;;EAeQ,uBlB9BuB;EkB+BvB,mBlB/BuB;EkBgCvB,clB7CqB;AC8pF7B;;AiBloFA;;EAeQ,yBlB3CqB;EkB4CrB,qBlB5CqB;EkB6CrB,YlBhCuB;ACwpF/B;;AiBzoFA;;EAeQ,4BlBhCsB;EkBiCtB,wBlBjCsB;EkBkCtB,yBPiCa;AV8lFrB;;AiBhpFA;;EAeQ,yBlBvCsB;EkBwCtB,qBlBxCsB;EkByCtB,WPmCQ;AVmmFhB;;AiBvpFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPmCQ;AV0mFhB;;AiB9pFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPmCQ;AVinFhB;;AiBrqFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPmCQ;AVwnFhB;;AiB5qFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,WPmCQ;AV+nFhB;;AiBnrFA;;EAeQ,yBlB3B0B;EkB4B1B,qBlB5B0B;EkB6B1B,yBPiCa;AVwoFrB;;AiB1rFA;;EAeQ,yBlBrByB;EkBsBzB,qBlBtByB;EkBuBzB,WPmCQ;AV6oFhB;;AiBjsFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBkrFf;;AiBvsFA;;EAuBM,yBlBjC4B;EkBkC5B,WP4BU;AVypFhB;;AiB7sFA;;;;EA2BQ,mBAAmB;AjByrF3B;;AiBptFA;;EA6BM,sBAAsB;AjB4rF5B;;AiBztFA;EA+BI,clBvD0B;ACqvF9B;;AiB7tFA;EAiCM,gBAtDsB;AjBsvF5B;;AiBjuFA;EAoCM,yBlB9C4B;EkB+C5B,WPeU;AVkrFhB;;AiBtuFA;;EAwCQ,mBAAmB;AjBmsF3B;;AiB3uFA;;EA2CQ,kBPSQ;EORR,mBAAmB;AjBqsF3B;;AiBjvFA;EA8CI,6BA5DqC;AjBmwFzC;;AiBrvFA;;EAiDM,qBApEgC;EAqEhC,clB1EwB;ACmxF9B;;AiB3vFA;EAoDI,6BAhEqC;AjB2wFzC;;AiB/vFA;;EAuDM,qBAxEgC;EAyEhC,clBhFwB;AC6xF9B;;AiBrwFA;EA0DI,6BAvEqC;AjBsxFzC;;AiBzwFA;;EA+DU,sBAAsB;AjB+sFhC;;AiB9wFA;;EAoEM,iBAAiB;AjB+sFvB;;AiBnxFA;;EAyEU,wBAAwB;AjB+sFlC;;AiBxxFA;EA2EI,WAAW;AjBitFf;;AiB5xFA;EAgFU,yBlBhGoB;ACgzF9B;;AiBhyFA;EAqFY,yBlBrGkB;ACozF9B;;AiBpyFA;EAuFc,4BlBxGgB;ACyzF9B;;AiBxyFA;;EA2FM,qBAAqB;AjBktF3B;;AiB7yFA;EAgGU,yBlBhHoB;ACi0F9B;;AiB/sFA;EhB7DE,iCAAiC;EgBgEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBitFjB;;AkB70FA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBg1F7B;;AkBp1FA;EAMI,qBAAqB;AlBk1FzB;;AkBx1FA;EjB2KI,oBiBnKwC;AlBo1F5C;;AkB51FA;EAUI,sBAAsB;AlBs1F1B;;AkBh2FA;EAYI,mBAAmB;AlBw1FvB;;AkBp2FA;EAgBM,enBYO;AC40Fb;;AkBx2FA;EAmBM,kBnBQU;ACi1FhB;;AkB52FA;EAqBI,uBAAuB;AlB21F3B;;AkBh3FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB61F1B;;AkBr3FA;EA0BI,yBAAyB;AlB+1F7B;;AkBz3FA;EA6BQ,mBAAmB;AlBg2F3B;;AkB73FA;EA+BQ,eAAe;AlBk2FvB;;AkBj4FA;EjB2KI,eiBzImC;AlBm2FvC;;AkBr4FA;EjB2KI,ciBvIqC;EAE/B,yBAAyB;EACzB,4BAA4B;AlBo2FtC;;AkB34FA;EA6CU,0BAA0B;EAC1B,6BAA6B;AlBk2FvC;;AkB71FA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBOU;EmBNV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg2FrB;;AkB52FA;EjBwHI,oBiB1GuC;EjB0GvC,uBiBzGyC;AlBk2F7C;;AkBj3FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg7F7B;;AkBt3FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw6F/B;;AkB33FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV42FrB;;AkBh4FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+2FhB;;AkBr4FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo3FhB;;AkB14FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV02FrE;;AkB/4FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV83FhB;;AkBp5FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVo3FrE;;AkBz5FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw4FhB;;AkB95FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV83FrE;;AkBn6FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk5FhB;;AkBx6FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVw4FrE;;AkB76FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV85FrB;;AkBl7FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVk5FrE;;AkBv7FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs6FhB;;AkB57FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV45FrE;;AkBj8FA;EAgCI,kBnBtDY;AC29FhB;;AkBr8FA;EAkCI,enBzDS;ACg+Fb;;AkBz8FA;EAoCI,kBnB5DY;ACq+FhB;;AkB78FA;EjBwHI,qBiBjF0C;EjBiF1C,sBiBhF0C;AlB06F9C;;AkBl9FA;EjBwHI,qBiB9E0C;EjB8E1C,sBiB7E0C;AlB46F9C;;AkBv9FA;EjBwHI,qBiB3E0C;EjB2E1C,sBiB1E0C;AlB86F9C;;AkB59FA;EjBwHI,gBiB/KmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+6Fd;;AkBn+FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg7FrC;;AkB9+FA;EAgEM,WAAW;EACX,UAAU;AlBk7FhB;;AkBn/FA;EAmEM,WAAW;EACX,UAAU;AlBo7FhB;;AkBx/FA;EAuEM,yBAAmD;AlBq7FzD;;AkB5/FA;EAyEM,yBAAoD;AlBu7F1D;;AkBhgGA;EA2EI,qBnB/DmB;ACw/FvB;;AkBv7FA;EAEI,0BAA0B;AlBy7F9B;;AmB/iGA;;EAGE,sBAAsB;AnBijGxB;;AmBpjGA;;;;EAMI,oBAAoB;AnBqjGxB;;AmB3jGA;;EAQI,iBApBmB;AnB4kGvB;;AmBhkGA;;EAUI,iBArBmB;AnBglGvB;;AmBrkGA;;EAYI,sBAAsB;AnB8jG1B;;AmB5jGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgmGzB;;AmBnkGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmmG7B;;AmBxkGA;EAWI,oBA3B+B;AnB4lGnC;;AmB5kGA;EAgBM,epBnBO;ACmlGb;;AmBhlGA;EAgBM,iBpBlBS;ACslGf;;AmBplGA;EAgBM,epBjBO;ACylGb;;AmBxlGA;EAgBM,iBpBhBS;AC4lGf;;AmB5lGA;EAgBM,kBpBfU;AC+lGhB;;AmBhmGA;EAgBM,epBdO;ACkmGb;;AmBpmGA;EAgBM,kBpBbU;ACqmGhB;;AmBtlGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkoG3B;;AmB7lGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4mGrB;;AmBlmGA;EAWI,oBA7C+B;AnBwoGnC;;AmBtmGA;EAgBM,epBrCO;AC+nGb;;AmB1mGA;EAgBM,iBpBpCS;ACkoGf;;AmB9mGA;EAgBM,epBnCO;ACqoGb;;AmBlnGA;EAgBM,iBpBlCS;ACwoGf;;AmBtnGA;EAgBM,kBpBjCU;AC2oGhB;;AmB1nGA;EAgBM,epBhCO;AC8oGb;;AmB9nGA;EAgBM,kBpB/BU;ACipGhB;;AoB/qGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkrG3B;;AoB7qGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBmDqB;EqBlDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgrGrB;;AqB9sGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBkCU;EuBjCV,cvB/B4B;ACgtG9B;;AC9oGI;EqBjCA,4BvBjC0B;ACotG9B;;AClpGI;EqBjCA,4BvBjC0B;ACwtG9B;;ACtpGI;EqBjCA,4BvBjC0B;AC4tG9B;;AC1pGI;EqBjCA,4BvBjC0B;ACguG9B;;AsB9rGE;EAEE,qBvBjC0B;ACiuG9B;;AsB/rGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACytGlC;;AsB9rGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACkvG9B;;AClrGI;;;;;EqBhBE,+BvBhDwB;AC0vG9B;;AC1rGI;;;;;EqBhBE,+BvBhDwB;ACkwG9B;;AClsGI;;;;;EqBhBE,+BvBhDwB;AC0wG9B;;AC1sGI;;;;;EqBhBE,+BvBhDwB;ACkxG9B;;AuBpxGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsxGb;;AuBrxGE;EACE,gBAAgB;AvBwxGpB;;AuBpxGI;EACE,mBxBFyB;ACyxG/B;;AuBxxGK;EAMG,mDxBPuB;AC6xG/B;;AuB5xGI;EACE,qBxBfuB;AC8yG7B;;AuBhyGK;EAMG,gDxBpBqB;ACkzG7B;;AuBpyGI;EACE,wBxBJwB;AC2yG9B;;AuBxyGK;EAMG,mDxBTsB;AC+yG9B;;AuB5yGI;EACE,qBxBXwB;AC0zG9B;;AuBhzGK;EAMG,gDxBhBsB;AC8zG9B;;AuBpzGI;EACE,qBxBG4B;ACozGlC;;AuBxzGK;EAMG,iDxBF0B;ACwzGlC;;AuB5zGI;EACE,qBxBK4B;AC0zGlC;;AuBh0GK;EAMG,iDxBA0B;AC8zGlC;;AuBp0GI;EACE,qBxBI4B;ACm0GlC;;AuBx0GK;EAMG,kDxBD0B;ACu0GlC;;AuB50GI;EACE,qBxBE4B;AC60GlC;;AuBh1GK;EAMG,kDxBH0B;ACi1GlC;;AuBp1GI;EACE,qBxBC4B;ACs1GlC;;AuBx1GK;EAMG,mDxBJ0B;AC01GlC;;AuB51GI;EACE,qBxBO2B;ACw1GjC;;AuBh2GK;EAMG,kDxBEyB;AC41GjC;;AuB51GE;EzBmBA,kBC0BgB;EDzBhB,kBCNc;ACm1GhB;;AuB/1GE;EzBoBA,kBCVc;ACy1GhB;;AuBj2GE;EzBoBA,iBCba;AC81Gf;;AuBl2GE;EACE,cAAc;EACd,WAAW;AvBq2Gf;;AuBp2GE;EACE,eAAe;EACf,WAAW;AvBu2Gf;;AuBr2GA;EAGI,qBxB+BmB;EwB9BnB,gDAA4D;EAC5D,iDAA6D;AvBs2GjE;;AuB32GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw2GpB;;AuBt2GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw2GlB;;AuB92GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo6GzB;;AuBn3GA;EAWI,eAAe;AvB42GnB;;AuBv3GA;EAcI,YAAY;AvB62GhB;;AwB96GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi7GpB;;AwBh7GE;EACE,eAAe;AxBm7GnB;;AwBl7GE;EACE,czBF0B;ACu7G9B;;AwBp7GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy7GvB;;AwBp7GA;EvBkKI,kBuB/JqC;AxBq7GzC;;AyBx8GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB28GrB;;AyB/8GA;EAMI,a3BDkB;AE88GtB;;AyBn9GA;EAUM,qB1BU4B;EEsK9B,cwB/K+B;EAC7B,UAAU;AzB68GhB;;AyBz9GA;EAeM,qB1BuDiB;EE4GnB,iBwBlKsC;AzB88G1C;;AyB99GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+8GjB;;AyBt+GA;EAyBM,aAAa;AzBi9GnB;;AyB1+GA;;EA4BM,wB1BjBwB;ACo+G9B;;AyB/+GA;ExBkLI,oBwBpJwC;AzBq9G5C;;AyBn/GA;EAgCM,YAAY;EACZ,UAAU;AzBu9GhB;;AyBx/GA;EAmCQ,kBAAkB;AzBy9G1B;;AyB5/GA;EAuCM,qB1BnCwB;AC4/G9B;;AyBhgHA;EA6CQ,mB1BhCuB;ACu/G/B;;AyBpgHA;EA+CQ,mB1BlCuB;AC2/G/B;;AyBxgHA;EAkDU,qBfwDuB;AVk6GjC;;AyB5gHA;EAuDU,mD1B1CqB;ACmgH/B;;AyBhhHA;EA6CQ,qB1B7CqB;ACohH7B;;AyBphHA;EA+CQ,qB1B/CqB;ACwhH7B;;AyBxhHA;EAkDU,mBfwDuB;AVk7GjC;;AyB5hHA;EAuDU,gD1BvDmB;ACgiH7B;;AyBhiHA;EA6CQ,wB1BlCsB;ACyhH9B;;AyBpiHA;EA+CQ,wB1BpCsB;AC6hH9B;;AyBxiHA;EAkDU,qBfwDuB;AVk8GjC;;AyB5iHA;EAuDU,mD1B5CoB;ACqiH9B;;AyBhjHA;EA6CQ,qB1BzCsB;ACgjH9B;;AyBpjHA;EA+CQ,qB1B3CsB;ACojH9B;;AyBxjHA;EAkDU,qBfwDuB;AVk9GjC;;AyB5jHA;EAuDU,gD1BnDoB;AC4jH9B;;AyBhkHA;EA6CQ,qB1B3B0B;ACkjHlC;;AyBpkHA;EA+CQ,qB1B7B0B;ACsjHlC;;AyBxkHA;EAkDU,qBfwDuB;AVk+GjC;;AyB5kHA;EAuDU,iD1BrCwB;AC8jHlC;;AyBhlHA;EA6CQ,qB1BzB0B;ACgkHlC;;AyBplHA;EA+CQ,qB1B3B0B;ACokHlC;;AyBxlHA;EAkDU,qBfwDuB;AVk/GjC;;AyB5lHA;EAuDU,iD1BnCwB;AC4kHlC;;AyBhmHA;EA6CQ,qB1B1B0B;ACilHlC;;AyBpmHA;EA+CQ,qB1B5B0B;ACqlHlC;;AyBxmHA;EAkDU,qBfwDuB;AVkgHjC;;AyB5mHA;EAuDU,kD1BpCwB;AC6lHlC;;AyBhnHA;EA6CQ,qB1B5B0B;ACmmHlC;;AyBpnHA;EA+CQ,qB1B9B0B;ACumHlC;;AyBxnHA;EAkDU,qBfwDuB;AVkhHjC;;AyB5nHA;EAuDU,kD1BtCwB;AC+mHlC;;AyBhoHA;EA6CQ,qB1B7B0B;AConHlC;;AyBpoHA;EA+CQ,qB1B/B0B;ACwnHlC;;AyBxoHA;EAkDU,qBfwDuB;AVkiHjC;;AyB5oHA;EAuDU,mD1BvCwB;ACgoHlC;;AyBhpHA;EA6CQ,qB1BvByB;AC8nHjC;;AyBppHA;EA+CQ,qB1BzByB;ACkoHjC;;AyBxpHA;EAkDU,qBfwDuB;AVkjHjC;;AyB5pHA;EAuDU,kD1BjCuB;AC0oHjC;;AyBhqHA;E3ByCE,kBC0BgB;EDzBhB,kBCNc;ACioHhB;;AyBrqHA;E3B4CE,kBCVc;ACuoHhB;;AyBzqHA;E3B8CE,iBCba;AC4oHf;;AyB7qHA;EAkEM,gCAA8C;EAC9C,YAAY;AzB+mHlB;;AyBlrHA;EAqEI,WAAW;AzBinHf;;AyBtrHA;EAuEM,WAAW;AzBmnHjB;;AyB1rHA;EA2EM,aAAa;EACb,kBAAkB;ExB8GpB,cwB7G+B;EAC7B,YAAY;EACZ,eAAe;AzBmnHrB;;AyBlsHA;EAiFM,kB1B7CU;ACkqHhB;;AyBtsHA;EAmFM,kB1BjDU;ACwqHhB;;AyB1sHA;EAqFM,iB1BpDS;AC6qHf;;A0BjsHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BmsHpB;;A0BxsHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC2tH7B;;A0B9sHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,c3BjCmB;ACiuH7B;;A0BptHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACuuH7B;;A0B1tHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,c3B7CmB;AC6uH7B;;A0BhuHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACsuH/B;;A0BtuHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,Y3BpBqB;AC4uH/B;;A0B5uHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACkvH/B;;A0BlvHA;EA8BU,uBhB+DuB;EgB9DvB,yBAAyB;EACzB,Y3BhCqB;ACwvH/B;;A0BxvHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV6rHrB;;A0B9vHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVmsHrB;;A0BpwHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVysHrB;;A0B1wHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+sHrB;;A0BhxHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVmtHhB;;A0BtxHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVytHhB;;A0B5xHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV+tHhB;;A0BlyHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVquHhB;;A0BxyHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV2uHhB;;A0B9yHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVivHhB;;A0BpzHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVuvHhB;;A0B1zHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6vHhB;;A0Bh0HA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVmwHhB;;A0Bt0HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVywHhB;;A0B50HA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV+wHhB;;A0Bl1HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVqxHhB;;A0Bx1HA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV2xHhB;;A0B91HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AViyHhB;;A0Bp2HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVuyHhB;;A0B12HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6yHhB;;A0Bh3HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVmzHhB;;A0Bt3HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVyzHhB;;A0B53HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV+zHhB;;A0Bl4HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq0HhB;;A0Bx4HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV60HrB;;A0B94HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVm1HrB;;A0Bp5HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVy1HrB;;A0B15HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+1HrB;;A0Bh6HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVm2HhB;;A0Bt6HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVy2HhB;;A0B56HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV+2HhB;;A0Bl7HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq3HhB;;A0Bx7HA;EAmCI,kB3BZY;ACq6HhB;;A0B57HA;EAqCI,e3BfS;AC06Hb;;A0Bh8HA;EAuCI,kB3BlBY;AC+6HhB;;A0Bp8HA;EA0CQ,eAAe;A1B85HvB;;A0Bx8HA;EA4CI,iB3BxBW;ACw7Hf;;A0B58HA;EA+CQ,eAAe;A1Bi6HvB;;A0Bh9HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bi6HhC;;A0Br9HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bm6H/B;;A0B19HA;EA0DQ,kB3BHI;ACu6HZ;;A0B99HA;EA4DQ,aAAa;A1Bs6HrB;;A0Bl+HA;EA+DM,sBAAsB;A1Bu6H5B;;A0Bt+HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1By6HtB;;A0B5+HA;EAqEM,uBAAuB;A1B26H7B;;A0Bh/HA;EAuEM,aAAa;EACb,YAAY;A1B66HlB;;A0Br/HA;EA0EQ,eAAe;A1B+6HvB;;A0Bz/HA;EA6EQ,eAAe;A1Bg7HvB;;A0B7/HA;EAgFQ,eAAe;A1Bi7HvB;;A0BjgIA;EAmFQ,eAAe;A1Bk7HvB;;A0BrgIA;EAsFQ,0BAA4C;A1Bm7HpD;;A0BzgIA;EAwFQ,0B3BjCI;E2BkCJ,uBAAuB;A1Bq7H/B;;A0B9gIA;EA2FI,uBAAuB;A1Bu7H3B;;A0BlhIA;EA8FM,WAAW;A1Bw7HjB;;A0BthIA;EAgGM,YAAY;EACZ,eAAe;A1B07HrB;;A0B3hIA;EAmGI,yBAAyB;A1B47H7B;;A0B/hIA;EAqGM,0BAA4C;A1B87HlD;;A0BniIA;EAuGM,0B3BhDM;E2BiDN,2BAA2B;EAC3B,SAAS;A1Bg8Hf;;A0B97HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bi8HpB;;A0Bv8HA;EASM,yBhBvB2B;EgBwB3B,c3B9HwB;ACgkI9B;;A0B58HA;EAYM,qBhB1B2B;AV89HjC;;A0Bh9HA;EAeM,yBhB7B2B;EgB8B3B,c3BpIwB;ACykI9B;;A0Br9HA;EAkBM,qBhBhC2B;AVu+HjC;;A0Br8HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bw8Hb;;A0Bt8HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BrFU;E2BsFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bw8HrB;;A0Bt8HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACqmI9B;;A0Bv8HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1B08HzB;;A0Bx8HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBCrB,mByBAmC;EACrC,UAAU;A1B28HZ;;A0Bj9HA;EAQI,eAAe;A1B68HnB;;A2B7nIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC+lIjB;;A2BpoIA;EAMI,oBAAoB;A3BkoIxB;;A2BxoIA;EASI,kB5BsBY;AC6mIhB;;A2B5oIA;EAWI,kB5BkBY;ACmnIhB;;A2BhpIA;EAaI,iB5BeW;ACwnIf;;A2BroIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BwoIrB;;A2B3oIA;EAOM,Y5BdyB;ACspI/B;;A2B/oIA;EAOM,c5B3BuB;ACuqI7B;;A2BnpIA;EAOM,iB5BhBwB;ACgqI9B;;A2BvpIA;EAOM,c5BvBwB;AC2qI9B;;A2B3pIA;EAOM,c5BT4B;ACiqIlC;;A2B/pIA;EAOM,c5BP4B;ACmqIlC;;A2BnqIA;EAOM,c5BR4B;ACwqIlC;;A2BvqIA;EAOM,c5BV4B;AC8qIlC;;A2B3qIA;EAOM,c5BX4B;ACmrIlC;;A2B/qIA;EAOM,c5BL2B;ACirIjC;;A2BxqIA;EAEI,sBAAsB;A3B0qI1B;;A2B5qIA;EAKI,aAAa;EACb,2BAA2B;A3B2qI/B;;A2BjrIA;E1BmJI,kB0B1IwC;A3B4qI5C;;A2BrrIA;;;EAcU,gBAAgB;A3B6qI1B;;A2B3rIA;;;EAoBY,6BAA6B;EAC7B,0BAA0B;A3B6qItC;;A2BlsIA;;;EA8BY,4BAA4B;EAC5B,yBAAyB;A3B0qIrC;;A2BzsIA;;;;;EAyCY,UAAU;A3BwqItB;;A2BjtIA;;;;;;;;;EA8CY,UAAU;A3B+qItB;;A2B7tIA;;;;;;;;;EAgDc,UAAU;A3ByrIxB;;A2BzuIA;EAkDQ,YAAY;EACZ,cAAc;A3B2rItB;;A2B9uIA;EAqDM,uBAAuB;A3B6rI7B;;A2BlvIA;EAuDM,yBAAyB;A3B+rI/B;;A2BtvIA;EA0DQ,YAAY;EACZ,cAAc;A3BgsItB;;A2B3vIA;EA6DI,aAAa;EACb,2BAA2B;A3BksI/B;;A2BhwIA;EAgEM,cAAc;A3BosIpB;;A2BpwIA;EAkEQ,gBAAgB;E1BiFpB,qB0BhF2C;A3BssI/C;;A2BzwIA;EAqEQ,YAAY;EACZ,cAAc;A3BwsItB;;A2B9wIA;EAwEM,uBAAuB;A3B0sI7B;;A2BlxIA;EA0EM,yBAAyB;A3B4sI/B;;A2BtxIA;EA4EM,eAAe;A3B8sIrB;;A2B1xIA;EAgFU,sBAAsB;A3B8sIhC;;A2B9xIA;EAkFQ,uBAAuB;A3BgtI/B;;A2BlyIA;EAoFQ,gBAAgB;A3BktIxB;;AC7tIE;E0BzEF;IAuFM,aAAa;E3BotIjB;AACF;;A2BntIA;EAEI,kBAAkB;A3BqtItB;;AC3uIE;E0BoBF;IAII,qBAAqB;E3BwtIvB;AACF;;AC7uIE;E0BgBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BkDd,oB0BjDsC;IACtC,iBAAiB;E3B4tInB;E2BtuIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B6tIxB;E2B1uIF;IAeM,oBAAoB;E3B8tIxB;E2B7uIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B+tIxB;E2BjvIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3BguIxB;AACF;;A2B/tIA;EAEI,gBAAgB;A3BiuIpB;;AC1wIE;E0BuCF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BouIhB;E2B3uIF;IASM,gBAAgB;E3BquIpB;E2B9uIF;IAWM,cAAc;E3BsuIlB;E2BjvIF;IAaQ,YAAY;E3BuuIlB;E2BpvIF;I1BmCI,qB0BpB2C;E3BwuI7C;AACF;;A2BvuIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3B0uIrB;;A2B/uIA;;;EAaU,c5BxKoB;ACg5I9B;;A2BrvIA;;;EAeQ,kB5B3IQ;ACu3IhB;;A2B3vIA;;;EAiBQ,kB5B/IQ;AC+3IhB;;A2BjwIA;;;EAmBQ,iB5BlJO;ACs4If;;A2BvwIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BsvIhB;;A2BjxIA;;EA+BM,mB7B1LgB;AEi7ItB;;A2BtxIA;EAiCM,OAAO;A3ByvIb;;A2B1xIA;;EAqCM,oB7BhMgB;AE07ItB;;A2B/xIA;EAuCM,QAAQ;A3B4vId;;A2BnyIA;EA2CM,6BAA6B;E1BjB/B,c0BkB+B;EAC7B,YAAY;EACZ,UAAU;A3B4vIhB;;A2B1yIA;EAgDM,kB5B5KU;AC06IhB;;A2B9yIA;EAkDM,kB5BhLU;ACg7IhB;;A2BlzIA;EAoDM,iB5BnLS;ACq7If;;A4Bx9IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B+8IrB;;A6Bn9IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B+9I3C;;A6B39IA;EAYM,c9BjBwB;ACo+I9B;;A6B/9IA;EAcI,mBAAmB;EACnB,aAAa;A7Bq9IjB;;A6Bp+IA;E5ByKI,e4BxJoC;A7Bu9IxC;;A6Bx+IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bw9I5B;;A6B9+IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7B09IvB;;A6Bn/IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B49I/B;;A6B3/IA;E5ByKI,mB4BvIuC;A7B69I3C;;A6B//IA;E5ByKI,kB4BrIuC;A7B+9I3C;;A6BngJA;;EAyCM,uBAAuB;A7B+9I7B;;A6BxgJA;;EA6CM,yBAAyB;A7Bg+I/B;;A6B7gJA;EAgDI,kB9BrBY;ACs/IhB;;A6BjhJA;EAkDI,kB9BzBY;AC4/IhB;;A6BrhJA;EAoDI,iB9B5BW;ACigJf;;A6BzhJA;EAwDM,iBAAiB;A7Bq+IvB;;A6B7hJA;EA2DM,iBAAiB;A7Bs+IvB;;A6BjiJA;EA8DM,iBAAiB;A7Bu+IvB;;A6BriJA;EAiEM,iBAAiB;A7Bw+IvB;;A8B9hJA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,e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nwJA;EACE,mBAAmB;EACnB,yBAAyB;AhCswJ3B;;ACvuJE;E+BjCF;IAKI,aAAa;EhCwwJf;AACF;;AiC50JA;EACE,uBAAuB;EACvB,aAAa;EACb,mBAAmB;AjC+0JrB;;AiCl1JA;EAKI,sBAV2B;AjC21J/B;;AiCt1JA;EAOI,8ClCR0B;EkCS1B,aAAa;EACb,oBAb2B;AjCg2J/B;;AiC51JA;;EAYM,qBAfgC;AjCo2JtC;;AiCj2JA;EAcM,mBAhBwB;AjCu2J9B;;AiCr2JA;EAgBQ,kBAlBsB;AjC22J9B;;AiCz2JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCs3JpB;;AiC/2JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjC03J5B;;AiCz1JA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC41JhB;;AiC11JA;EhCwII,kBgChLgB;AjCs4JpB;;AiC31JA;EhCqII,iBgChLgB;AjC04JpB;;AiC51JA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC+1JrB;;AC/yJE;EgCpDF;IAQI,gBAAgB;EjCg2JlB;AACF;;AkCv4JA;EACE,enCgBW;AC03Jb;;AkC34JA;EAII,kBnCcY;AC63JhB;;AkC/4JA;EAMI,kBnCUY;ACm4JhB;;AkCn5JA;EAQI,iBnCOW;ACw4Jf;;AkC74JA;EACE,iBArB0B;AlCq6J5B;;AkCj5JA;EAGI,kBnCoCc;EmCnCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC26JrC;;AkCx5JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACq7J9B;;AkC75JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV82JhB;;AkCl6JA;EjCsJI,8BF1K0B;EmCqCxB,cAnC0B;EjCwK5B,oBiCvKkC;AlCy7JtC;;AkCp5JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCu5J3B;;AkC35JA;EAMI,eAtCoB;AlC+7JxB;;AkC/5JA;EAQI,kBAxCoB;AlCm8JxB;;AmC97JA;EAEE,4BpCZ4B;EoCa5B,kBpC4CU;EoC3CV,epCUW;ACs7Jb;;AmCp8JA;EAMI,mBAAmB;AnCk8JvB;;AmCx8JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCo8J9B;;AmC78JA;EAYI,kBpCGY;ACk8JhB;;AmCj9JA;EAcI,kBpCDY;ACw8JhB;;AmCr9JA;EAgBI,iBpCJW;AC68Jf;;AmCz9JA;EAsCM,uBAH+C;AnC07JrD;;AmC79JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACu/J7B;;AmCl+JA;EA2CQ,mBpCnDuB;AC8+J/B;;AmCt+JA;EAsCM,yBAH+C;AnCu8JrD;;AmC1+JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACu/J/B;;AmC/+JA;EA2CQ,qBpChEqB;ACwgK7B;;AmCn/JA;EAsCM,yBAH+C;AnCo9JrD;;AmCv/JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVm8JrB;;AmC5/JA;EA2CQ,wBpCrDsB;AC0gK9B;;AmChgKA;EAsCM,yBAH+C;AnCi+JrD;;AmCpgKA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV88JhB;;AmCzgKA;EA2CQ,qBpC5DsB;AC8hK9B;;AmC7gKA;EAsCM,yBzB4B0C;AV+8JhD;;AmCjhKA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV29JhB;;AmCthKA;EA2CQ,qBpC9C0B;EoC+C1B,czB8B6D;AVi9JrE;;AmC3hKA;EAsCM,yBzB4B0C;AV69JhD;;AmC/hKA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVy+JhB;;AmCpiKA;EA2CQ,qBpC5C0B;EoC6C1B,czB8B6D;AV+9JrE;;AmCziKA;EAsCM,yBzB4B0C;AV2+JhD;;AmC7iKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVu/JhB;;AmCljKA;EA2CQ,qBpC7C0B;EoC8C1B,czB8B6D;AV6+JrE;;AmCvjKA;EAsCM,yBzB4B0C;AVy/JhD;;AmC3jKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVqgKhB;;AmChkKA;EA2CQ,qBpC/C0B;EoCgD1B,czB8B6D;AV2/JrE;;AmCrkKA;EAsCM,yBzB4B0C;AVugKhD;;AmCzkKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVqhKrB;;AmC9kKA;EA2CQ,qBpChD0B;EoCiD1B,czB8B6D;AVygKrE;;AmCnlKA;EAsCM,yBzB4B0C;AVqhKhD;;AmCvlKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AViiKhB;;AmC5lKA;EA2CQ,qBpC1CyB;EoC2CzB,czB8B6D;AVuhKrE;;AmCnjKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCsjKpB;;AmChkKA;EAYI,YAAY;EACZ,cAAc;ElCkGd,mBkCjGsC;AnCwjK1C;;AmCtkKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnC0jK9B;;AmCxjKA;EACE,qBpChF4B;EoCiF5B,kBpCrBU;EoCsBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC4oKnC;;AmCjkKA;;EASI,uBpCnF2B;ACgpK/B;;AmCtkKA;EAWI,6BAlFgD;AnCipKpD;;AoCjoKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC2qKZ;;AoC3oKA;EAWI,aAAa;ApCooKjB;;AoCloKA;EAEE,wCrC/C2B;ACmrK7B;;AoCloKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApCqoKb;;ACpmKE;EmCvCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpCgsKzB;AACF;;AoCvoKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCwHb,WmChLoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCqsK7B;;AoCvoKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApC0oKzB;;AoCxoKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC2oKpB;;AoCzoKA;EACE,gCrCjF4B;EqCkF5B,2BrCrBgB;EqCsBhB,4BrCtBgB;ACkqKlB;;AoC1oKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApC0tKhC;;AoC3oKA;EACE,8BrChCgB;EqCiChB,+BrCjCgB;EqCkChB,6BrC/F4B;AC6uK9B;;AoCjpKA;EnC8EI,mBmCxEuC;ApC+oK3C;;AoC7oKA;EnC3CE,iCAAiC;EmC6CjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCsuK9B;;AqC1sKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCmwKb;;AqCjtKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC8wK7B;;AqCttKA;;EAcU,ctCtEmB;ACmxK7B;;AqC3tKA;;;;EAoBY,yB3B8BqB;E2B7BrB,ctC7EiB;AC2xK7B;;AqCnuKA;EAwBY,qBtChFiB;AC+xK7B;;AqCvuKA;EA0BQ,ctClFqB;ACmyK7B;;AC3sKE;EoChCF;;;;IAgCY,ctCxFiB;EC2yK3B;EqCnvKF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,ctC/Fe;ECwzK3B;EqChwKF;;IA0Cc,qBtClGe;EC4zK3B;EqCpwKF;;;IA8CU,yB3BIuB;I2BHvB,ctCvGmB;ECk0K3B;EqC1wKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECs0K3B;AACF;;AqC/wKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC+zK/B;;AqCpxKA;;EAcU,YtCzDqB;ACo0K/B;;AqCzxKA;;;;EAoBY,uB3B8BqB;E2B7BrB,YtChEmB;AC40K/B;;AqCjyKA;EAwBY,mBtCnEmB;ACg1K/B;;AqCryKA;EA0BQ,YtCrEuB;ACo1K/B;;ACzwKE;EoChCF;;;;IAgCY,YtC3EmB;EC41K7B;EqCjzKF;;;;;;;;;;IAsCc,uB3BYmB;I2BXnB,YtClFiB;ECy2K7B;EqC9zKF;;IA0Cc,mBtCrFiB;EC62K7B;EqCl0KF;;;IA8CU,uB3BIuB;I2BHvB,YtC1FqB;ECm3K7B;EqCx0KF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECu3K7B;AACF;;AqC70KA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV4zKrB;;AqCl1KA;;EAcU,yB3BQW;AVi0KrB;;AqCv1KA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AVy0KrB;;AqC/1KA;EAwBY,gC3BFS;AV60KrB;;AqCn2KA;EA0BQ,yB3BJa;AVi1KrB;;ACv0KE;EoChCF;;;;IAgCY,yB3BVS;EVy1KnB;EqC/2KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EVs2KnB;EqC53KF;;IA0Cc,gC3BpBO;EV02KnB;EqCh4KF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVg3KnB;EqCt4KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVo3KnB;AACF;;AqC34KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVw3KhB;;AqCh5KA;;EAcU,W3BUM;AV63KhB;;AqCr5KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVq4KhB;;AqC75KA;EAwBY,kB3BAI;AVy4KhB;;AqCj6KA;EA0BQ,W3BFQ;AV64KhB;;ACr4KE;EoChCF;;;;IAgCY,W3BRI;EVq5Kd;EqC76KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVk6Kd;EqC17KF;;IA0Cc,kB3BlBE;EVs6Kd;EqC97KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV46Kd;EqCp8KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EVg7Kd;AACF;;AqCz8KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVs7KhB;;AqC98KA;;EAcU,W3BUM;AV27KhB;;AqCn9KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVm8KhB;;AqC39KA;EAwBY,kB3BAI;AVu8KhB;;AqC/9KA;EA0BQ,W3BFQ;AV28KhB;;ACn8KE;EoChCF;;;;IAgCY,W3BRI;EVm9Kd;EqC3+KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVg+Kd;EqCx/KF;;IA0Cc,kB3BlBE;EVo+Kd;EqC5/KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV0+Kd;EqClgLF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV8+Kd;AACF;;AqCvgLA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVo/KhB;;AqC5gLA;;EAcU,W3BUM;AVy/KhB;;AqCjhLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVigLhB;;AqCzhLA;EAwBY,kB3BAI;AVqgLhB;;AqC7hLA;EA0BQ,W3BFQ;AVygLhB;;ACjgLE;EoChCF;;;;IAgCY,W3BRI;EVihLd;EqCziLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV8hLd;EqCtjLF;;IA0Cc,kB3BlBE;EVkiLd;EqC1jLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVwiLd;EqChkLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV4iLd;AACF;;AqCrkLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVkjLhB;;AqC1kLA;;EAcU,W3BUM;AVujLhB;;AqC/kLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV+jLhB;;AqCvlLA;EAwBY,kB3BAI;AVmkLhB;;AqC3lLA;EA0BQ,W3BFQ;AVukLhB;;AC/jLE;EoChCF;;;;IAgCY,W3BRI;EV+kLd;EqCvmLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV4lLd;EqCpnLF;;IA0Cc,kB3BlBE;EVgmLd;EqCxnLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVsmLd;EqC9nLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EV0mLd;AACF;;AqCnoLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AVgnLhB;;AqCxoLA;;EAcU,W3BUM;AVqnLhB;;AqC7oLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV6nLhB;;AqCrpLA;EAwBY,kB3BAI;AVioLhB;;AqCzpLA;EA0BQ,W3BFQ;AVqoLhB;;AC7nLE;EoChCF;;;;IAgCY,W3BRI;EV6oLd;EqCrqLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV0pLd;EqClrLF;;IA0Cc,kB3BlBE;EV8pLd;EqCtrLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVoqLd;EqC5rLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVwqLd;AACF;;AqCjsLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AVgrLrB;;AqCtsLA;;EAcU,yB3BQW;AVqrLrB;;AqC3sLA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AV6rLrB;;AqCntLA;EAwBY,gC3BFS;AVisLrB;;AqCvtLA;EA0BQ,yB3BJa;AVqsLrB;;AC3rLE;EoChCF;;;;IAgCY,yB3BVS;EV6sLnB;EqCnuLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EV0tLnB;EqChvLF;;IA0Cc,gC3BpBO;EV8tLnB;EqCpvLF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVouLnB;EqC1vLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVwuLnB;AACF;;AqC/vLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV4uLhB;;AqCpwLA;;EAcU,W3BUM;AVivLhB;;AqCzwLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVyvLhB;;AqCjxLA;EAwBY,kB3BAI;AV6vLhB;;AqCrxLA;EA0BQ,W3BFQ;AViwLhB;;ACzvLE;EoChCF;;;;IAgCY,W3BRI;EVywLd;EqCjyLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVsxLd;EqC9yLF;;IA0Cc,kB3BlBE;EV0xLd;EqClzLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVgyLd;EqCxzLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVoyLd;AACF;;AqC7zLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC2wLf;;AqCp0LA;EA2DI,gCtCxG0B;ACq3L9B;;AqCx0LA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArCg4LnB;;AqC/0LA;EAgEI,SAAS;ArCmxLb;;AqCn1LA;EAkEM,iCtC/GwB;ACo4L9B;;AqCv1LA;EAoEI,MAAM;ArCuxLV;;AqCrxLA;;EAGI,oBA9HmB;ArCq5LvB;;AqC1xLA;;EAKI,uBAhImB;ArC05LvB;;AqCxxLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCk6LvB;;AqCzxLA;EAIM,6BAA6B;ArCyxLnC;;AqCvxLA;EpCjFE,iCAAiC;EoCmFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArC0xLpB;;AqCxxLA;EAEE,ctCrJ4B;EEoB5B,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eoC7BqB;EpC8BrB,kBAAkB;EAClB,coC/BqB;EpC+KnB,iBoCtBkC;ArCmyLtC;;AC55LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBF6BQ;EE5BR,yDAAyD;EACzD,oCFsBa;EErBb,WAAW;AD+5Lf;;AC95LI;EACE,oBAAoB;ADi6L1B;;ACh6LI;EACE,oBAAoB;ADm6L1B;;ACl6LI;EACE,oBAAoB;ADq6L1B;;ACp6LE;EACE,qCAAiC;ADu6LrC;;ACn6LM;EACE,wCAAwC;ADs6LhD;;ACr6LM;EACE,UAAU;ADw6LlB;;ACv6LM;EACE,0CAA0C;AD06LlD;;AqC10LA;EACE,aAAa;ArC60Lf;;AqC30LA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArC80LpB;;AqCp1LA;;EASM,qBAAqB;EACrB,sBAAsB;ArCg1L5B;;AqC90LA;;EAEE,eAAe;ArCi1LjB;;AqCn1LA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;ACq/LlC;;AqCl1LA;EACE,YAAY;EACZ,cAAc;ArCq1LhB;;AqCv1LA;EAII,mBA7KgC;ArCogMpC;;AqC31LA;EAMI,UAAU;ArCy1Ld;;AqC/1LA;EAQI,YAAY;EACZ,cAAc;ArC21LlB;;AqCp2LA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArC61LtC;;AqC12LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;ACkhMlC;;AqC/2LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArCg2L9E;;AqC91LA;EACE,YAAY;EACZ,cAAc;ArCi2LhB;;AqC/1LA;EpCnCI,oBoCoCoC;ArCk2LxC;;AqCn2LA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpChCpB,coCiC6B;ArCm2LjC;;AqCj2LA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArCo2LrB;;AqCv2LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCs2LzB;;AqCp2LA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCu2LlB;;ACr/LE;EoCpCF;IAsLI,cAAc;ErCw2LhB;EqCv2LA;;IAGI,mBAAmB;IACnB,aAAa;ErCw2LjB;EqCv2LA;IAEI,aAAa;ErCw2LjB;EqCh8LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCy2LnB;EqC52LA;IAKI,cAAc;ErC02LlB;EqCx2LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCqmMjB;EqC92LA;IAKI,SAAS;ErC42Lb;EqCj3LA;IAOM,4CtCrQqB;ECknM3B;EqCp3LA;IASI,MAAM;ErC82LV;EqCv3LA;IpC7LA,iCAAiC;IoC2M3B,iCAA2C;IAC3C,cAAc;ErC62LpB;EqC52LA;;IAGI,oBA9QiB;ErC2nMrB;EqCh3LA;;IAKI,uBAhRiB;ErC+nMrB;AACF;;AC3iME;EoC8LA;;;;IAIE,oBAAoB;IACpB,aAAa;ErCi3Lf;EqCplMF;IAqOI,mBA1RmB;ErC4oMrB;EqCn3LA;IAGI,kBA1R0B;ErC6oM9B;EqCt3LA;;IAMM,mBAAmB;ErCo3LzB;EqC13LA;;IASM,kBtCjOI;ECslMV;EqC93LA;;;;IAgBQ,wCAAwC;ErCo3LhD;EqCp4LA;IAuBU,wCAAwC;ErCg3LlD;EqCv4LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECuqM3B;EqC34LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECupMhC;EqCnhMF;IAsKI,aAAa;ErCg3Lf;EqC7gMF;;IAgKI,mBAAmB;IACnB,aAAa;ErCi3Lf;EqC5/LF;IA8IM,oBAAoB;ErCi3LxB;EqCn3LA;IAKM,oDAAoD;ErCi3L1D;EqCt3LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErCk3Lf;EqC93LA;IAkBM,cAAc;ErC+2LpB;EqC92LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErC+2LhC;EqC3iMF;IA8LI,YAAY;IACZ,cAAc;ErCg3LhB;EqC/2LA;IACE,2BAA2B;IpC7K3B,kBoC8KoC;ErCi3LtC;EqCh3LA;IACE,yBAAyB;IpChLzB,iBoCiLoC;ErCk3LtC;EqCx/LF;IAwII,uBtCxV2B;IsCyV3B,8BtCjSc;IsCkSd,+BtClSc;IsCmSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCjLnB,OoCkLuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErCosMpB;EqCtgMF;IAqJM,sBAAsB;IACtB,mBAAmB;ErCo3LvB;EqCn4LA;IpClLE,mBoCmMuC;ErCq3LzC;EqCt4LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;EC8uM3B;EqC14LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;EC8tMhC;EqCr3LE;IAEE,kBtC1TY;IsC2TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtChUM;IsCiUN,uCAAuC;ErCs3L3C;EqC15LA;IAsCI,UAAU;IACV,QAAQ;ErCu3LZ;EqC7hMF;IAwKI,cAAc;ErCw3LhB;EqCv3LA;;IpC5NE,qBoC+NyC;ErCw3L3C;EqC33LA;;IpC5NE,sBoCiOyC;ErC03L3C;EqCx3LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC4wMjB;EqC93LA;IAKI,SAAS;ErC43Lb;EqCj4LA;IAOM,4CtC5ZqB;ECyxM3B;EqCp4LA;IASI,MAAM;ErC83LV;EqC73LA;;IAGI,oBA/ZiB;ErC6xMrB;EqCj4LA;;IAKI,uBAjaiB;ErCiyMrB;EqCr4LA;;IAOI,oBAA4D;ErCk4LhE;EqCz4LA;;IASI,uBAA+D;ErCo4LnE;EqCl4LA;;IAGI,ctC7auB;ECgzM3B;EqCt4LA;;IAKI,6BAla2C;ErCuyM/C;EqCp4LA;IAKM,yBtCzasB;EC2yM5B;AACF;;AqC/3LA;EAEI,iCAA2C;ArCi4L/C;;AsCzxMA;EAEE,evCFW;EuCGX,gBAnC0B;AtC8zM5B;;AsC9xMA;EAMI,kBvCLY;ACiyMhB;;AsClyMA;EAQI,kBvCTY;ACuyMhB;;AsCtyMA;EAUI,iBvCZW;AC4yMf;;AsC1yMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCmBiB;AC8wMvB;;AsCjzMA;EAkBM,qBvCiBiB;ACkxMvB;;AsCjyMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtCoyMpB;;AsClyMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtCmyMpB;;AsCjyMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AE+2MtB;;AsCzyMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACu3M9B;;AsChzMA;;;EAUI,qBvCjE8B;AC62MlC;;AsCtzMA;;;EAYI,iDvCvFyB;ACu4M7B;;AsC5zMA;;;;;EAeI,yBvClF0B;EuCmF1B,qBvCnF0B;EuCoF1B,gBAAgB;EAChB,cvCvF0B;EuCwF1B,YAAY;AtCqzMhB;;AsCnzMA;;EAEE,oBAvFkC;EAwFlC,qBAvFmC;EAwFnC,mBAAmB;AtCszMrB;;AsCpzMA;EAEI,yBvCpF8B;EuCqF9B,qBvCrF8B;EuCsF9B,W5B1BY;AVg1MhB;;AsCpzMA;EACE,cvCtG4B;EuCuG5B,oBAAoB;AtCuzMtB;;AsCrzMA;EACE,eAAe;AtCwzMjB;;AsCzzMA;EAGI,gBAAgB;AtC0zMpB;;ACz0ME;EqCjEF;IAoFI,eAAe;EtC2zMjB;EsCl1MF;;IA0BI,YAAY;IACZ,cAAc;EtC4zMhB;EsCv0MF;IAcM,YAAY;IACZ,cAAc;EtC4zMlB;AACF;;ACp1ME;EqCQF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtC8zMV;EsCt4MF;;;;IA6EI,gBAAgB;IAChB,aAAa;EtC+zMf;EsC9zMA;IACE,QAAQ;EtCg0MV;EsC/zMA;IACE,QAAQ;EtCi0MV;EsC96MF;IA+GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtCk0Mf;EsCr0MA;IAMM,QAAQ;EtCk0Md;EsCx0MA;IAQM,uBAAuB;IACvB,QAAQ;EtCm0Md;EsC50MA;IAWM,QAAQ;EtCo0Md;EsC/0MA;IAcM,QAAQ;EtCo0Md;EsCl1MA;IAgBM,QAAQ;EtCq0Md;EsCr1MA;IAkBM,yBAAyB;IACzB,QAAQ;EtCs0Md;AACF;;AuC78MA;EACE,kBxCsCgB;EwCrChB,0FxChC2B;EwCiC3B,exCEW;AC88Mb;;AuCn9MA;EAKI,qBxCWkB;ACu8MtB;;AuCv9MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;AC0/M7B;;AuC59MA;EAeQ,0BxChCuB;ACi/M/B;;AuCh+MA;EAiBQ,YxClCuB;ACq/M/B;;AuCp+MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;AC0/M/B;;AuCz+MA;EAeQ,4BxC7CqB;AC2gN7B;;AuC7+MA;EAiBQ,cxC/CqB;AC+gN7B;;AuCj/MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AVs8MrB;;AuCt/MA;EAeQ,+BxClCsB;AC6gN9B;;AuC1/MA;EAiBQ,iBxCpCsB;ACihN9B;;AuC9/MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVi9MhB;;AuCngNA;EAeQ,4BxCzCsB;ACiiN9B;;AuCvgNA;EAiBQ,cxC3CsB;ACqiN9B;;AuC3gNA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AV89MhB;;AuChhNA;EAeQ,4BxC3B0B;ACgiNlC;;AuCphNA;EAiBQ,cxC7B0B;ACoiNlC;;AuCxhNA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AV2+MhB;;AuC7hNA;EAeQ,4BxCzB0B;AC2iNlC;;AuCjiNA;EAiBQ,cxC3B0B;AC+iNlC;;AuCriNA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVw/MhB;;AuC1iNA;EAeQ,4BxC1B0B;ACyjNlC;;AuC9iNA;EAiBQ,cxC5B0B;AC6jNlC;;AuCljNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AVqgNhB;;AuCvjNA;EAeQ,4BxC5B0B;ACwkNlC;;AuC3jNA;EAiBQ,cxC9B0B;AC4kNlC;;AuC/jNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AVohNrB;;AuCpkNA;EAeQ,4BxC7B0B;ACslNlC;;AuCxkNA;EAiBQ,cxC/B0B;AC0lNlC;;AuC5kNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AV+hNhB;;AuCjlNA;EAeQ,4BxCvByB;AC6lNjC;;AuCrlNA;EAiBQ,cxCzByB;ACimNjC;;AuCtkNA;;EAGI,gCxC3C2B;ACmnN/B;;AuCtkNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvC8nNlC;;AuCvkNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvC0kNzB;;AuC9kNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvC4kNlB;;AuCplNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;ACopN9B;;AuC3kNA;EAEI,cxC1E0B;ACupN9B;;AuC/kNA;EAIM,cxC7D4B;AC4oNlC;;AuC7kNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCglNvB;;AuCrlNA;EtC+FI,oBsCxFsC;AvCklN1C;;AuCzlNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvColNf;;AuC/lNA;EAaI,eAAe;AvCslNnB;;AuCnmNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;ACurN9B;;AuCxmNA;EAkBM,cxCjF4B;AC2qNlC;;AuC5mNA;EAoBI,8BxClCc;EwCmCd,+BxCnCc;AC+nNlB;;AuC1lNA;;EAEE,eAAe;AvC6lNjB;;AuC/lNA;;EAII,4BxCnG0B;ACmsN9B;;AuC9lNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EE4K1B,oBsC/DoC;AvCumNxC;;AuC1mNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCymNxB;;AwCnsNA;EvCqCE,iCAAiC;EuCjCjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxCosNrB;;AwC9sNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxCssNvB;;AwC3tNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACwvN9B;;AwChuNA;EA0BI,cAAc;AxC0sNlB;;AwCpuNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACivNlC;;AwCzuNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxC6sN/B;;AwCpvNA;EAyCM,qBAAqB;AxC+sN3B;;AwCxvNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCitN3B;;AwC/vNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxCmtN1B;;AwCpwNA;EvCsJI,mBuClGuC;AxCotN3C;;AwCxwNA;EvCsJI,kBuChGuC;AxCstN3C;;AwC5wNA;EA0DM,uBAAuB;AxCstN7B;;AwChxNA;EA6DM,yBAAyB;AxCutN/B;;AwCpxNA;EAiEM,6BAA6B;EAE3B,0BAAkE;AxCstN1E;;AwCzxNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;ACkzN9B;;AwC9xNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxCstNrF;;AwCpyNA;EAiFM,YAAY;EACZ,cAAc;AxCutNpB;;AwCzyNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCwtNxB;;AwCjzNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxC0tNlB;;AwCvzNA;EvCsJI,iBuCtDuE;AxC2tN3E;;AwC3zNA;EAmGU,2BzC3DE;EyC4DF,8BzC5DE;ACwxNZ;;AwCh0NA;EA0GU,4BzClEE;EyCmEF,+BzCnEE;AC6xNZ;;AwCr0NA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCwtNpB;;AwC50NA;EAsHM,mBAAmB;AxC0tNzB;;AwCh1NA;EA2HY,iCzCjFW;EyCkFX,8BzClFW;EyCmFX,oBAAoB;AxCytNhC;;AwCt1NA;EAoIY,kCzC1FW;EyC2FX,+BzC3FW;EyC4FX,qBAAqB;AxCstNjC;;AwC51NA;EA6II,kBzCrIY;ACw1NhB;;AwCh2NA;EA+II,kBzCzIY;AC81NhB;;AwCp2NA;EAiJI,iBzC5IW;ACm2Nf;;AyCt4NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1C64NpB;;A0Cr4NE;EACE,UAAU;EACV,YAAY;A1Cw4NhB;;A0Cv4NE;EACE,UAAU;EACV,WAAW;A1C04Nf;;A0Cz4NE;EACE,UAAU;EACV,UAAU;A1C44Nd;;A0C34NE;EACE,UAAU;EACV,eAAe;A1C84NnB;;A0C74NE;EACE,UAAU;EACV,UAAU;A1Cg5Nd;;A0C/4NE;EACE,UAAU;EACV,eAAe;A1Ck5NnB;;A0Cj5NE;EACE,UAAU;EACV,UAAU;A1Co5Nd;;A0Cn5NE;EACE,UAAU;EACV,UAAU;A1Cs5Nd;;A0Cr5NE;EACE,UAAU;EACV,UAAU;A1Cw5Nd;;A0Cv5NE;EACE,UAAU;EACV,UAAU;A1C05Nd;;A0Cz5NE;EACE,UAAU;EACV,UAAU;A1C45Nd;;A0C35NE;EzCyIE,gByCxImC;A1C85NvC;;A0C75NE;EzCuIE,qByCtIwC;A1Cg6N5C;;A0C/5NE;EzCqIE,gByCpImC;A1Ck6NvC;;A0Cj6NE;EzCmIE,qByClIwC;A1Co6N5C;;A0Cn6NE;EzCiIE,gByChImC;A1Cs6NvC;;A0Cr6NE;EzC+HE,gByC9HmC;A1Cw6NvC;;A0Cv6NE;EzC6HE,gByC5HmC;A1C06NvC;;A0Cz6NE;EzC2HE,gByC1HmC;A1C46NvC;;A0C36NE;EzCyHE,gByCxHmC;A1C86NvC;;A0C56NI;EACE,UAAU;EACV,SAAiC;A1C+6NvC;;A0C96NI;EzCmHA,eyClH4D;A1Ci7NhE;;A0Cr7NI;EACE,UAAU;EACV,eAAiC;A1Cw7NvC;;A0Cv7NI;EzCmHA,qByClH4D;A1C07NhE;;A0C97NI;EACE,UAAU;EACV,gBAAiC;A1Ci8NvC;;A0Ch8NI;EzCmHA,sByClH4D;A1Cm8NhE;;A0Cv8NI;EACE,UAAU;EACV,UAAiC;A1C08NvC;;A0Cz8NI;EzCmHA,gByClH4D;A1C48NhE;;A0Ch9NI;EACE,UAAU;EACV,gBAAiC;A1Cm9NvC;;A0Cl9NI;EzCmHA,sByClH4D;A1Cq9NhE;;A0Cz9NI;EACE,UAAU;EACV,gBAAiC;A1C49NvC;;A0C39NI;EzCmHA,sByClH4D;A1C89NhE;;A0Cl+NI;EACE,UAAU;EACV,UAAiC;A1Cq+NvC;;A0Cp+NI;EzCmHA,gByClH4D;A1Cu+NhE;;A0C3+NI;EACE,UAAU;EACV,gBAAiC;A1C8+NvC;;A0C7+NI;EzCmHA,sByClH4D;A1Cg/NhE;;A0Cp/NI;EACE,UAAU;EACV,gBAAiC;A1Cu/NvC;;A0Ct/NI;EzCmHA,sByClH4D;A1Cy/NhE;;A0C7/NI;EACE,UAAU;EACV,UAAiC;A1CggOvC;;A0C//NI;EzCmHA,gByClH4D;A1CkgOhE;;A0CtgOI;EACE,UAAU;EACV,gBAAiC;A1CygOvC;;A0CxgOI;EzCmHA,sByClH4D;A1C2gOhE;;A0C/gOI;EACE,UAAU;EACV,gBAAiC;A1CkhOvC;;A0CjhOI;EzCmHA,sByClH4D;A1CohOhE;;A0CxhOI;EACE,UAAU;EACV,WAAiC;A1C2hOvC;;A0C1hOI;EzCmHA,iByClH4D;A1C6hOhE;;ACz/NE;EyClGF;IAiEM,UAAU;IACV,YAAY;E1C+hOhB;E0CjmOF;IAoEM,UAAU;IACV,WAAW;E1CgiOf;E0CrmOF;IAuEM,UAAU;IACV,UAAU;E1CiiOd;E0CzmOF;IA0EM,UAAU;IACV,eAAe;E1CkiOnB;E0C7mOF;IA6EM,UAAU;IACV,UAAU;E1CmiOd;E0CjnOF;IAgFM,UAAU;IACV,eAAe;E1CoiOnB;E0CrnOF;IAmFM,UAAU;IACV,UAAU;E1CqiOd;E0CznOF;IAsFM,UAAU;IACV,UAAU;E1CsiOd;E0C7nOF;IAyFM,UAAU;IACV,UAAU;E1CuiOd;E0CjoOF;IA4FM,UAAU;IACV,UAAU;E1CwiOd;E0CroOF;IA+FM,UAAU;IACV,UAAU;E1CyiOd;E0CzoOF;IzCgLI,gByC9EqC;E1C0iOvC;E0C5oOF;IzCgLI,qByC5E0C;E1C2iO5C;E0C/oOF;IzCgLI,gByC1EqC;E1C4iOvC;E0ClpOF;IzCgLI,qByCxE0C;E1C6iO5C;E0CrpOF;IzCgLI,gByCtEqC;E1C8iOvC;E0CxpOF;IzCgLI,gByCpEqC;E1C+iOvC;E0C3pOF;IzCgLI,gByClEqC;E1CgjOvC;E0C9pOF;IzCgLI,gByChEqC;E1CijOvC;E0CjqOF;IzCgLI,gByC9DqC;E1CkjOvC;E0CpqOF;IAqHQ,UAAU;IACV,SAAiC;E1CkjOvC;E0CxqOF;IzCgLI,eyCxD8D;E1CmjOhE;E0C3qOF;IAqHQ,UAAU;IACV,eAAiC;E1CyjOvC;E0C/qOF;IzCgLI,qByCxD8D;E1C0jOhE;E0ClrOF;IAqHQ,UAAU;IACV,gBAAiC;E1CgkOvC;E0CtrOF;IzCgLI,sByCxD8D;E1CikOhE;E0CzrOF;IAqHQ,UAAU;IACV,UAAiC;E1CukOvC;E0C7rOF;IzCgLI,gByCxD8D;E1CwkOhE;E0ChsOF;IAqHQ,UAAU;IACV,gBAAiC;E1C8kOvC;E0CpsOF;IzCgLI,sByCxD8D;E1C+kOhE;E0CvsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CqlOvC;E0C3sOF;IzCgLI,sByCxD8D;E1CslOhE;E0C9sOF;IAqHQ,UAAU;IACV,UAAiC;E1C4lOvC;E0CltOF;IzCgLI,gByCxD8D;E1C6lOhE;E0CrtOF;IAqHQ,UAAU;IACV,gBAAiC;E1CmmOvC;E0CztOF;IzCgLI,sByCxD8D;E1ComOhE;E0C5tOF;IAqHQ,UAAU;IACV,gBAAiC;E1C0mOvC;E0ChuOF;IzCgLI,sByCxD8D;E1C2mOhE;E0CnuOF;IAqHQ,UAAU;IACV,UAAiC;E1CinOvC;E0CvuOF;IzCgLI,gByCxD8D;E1CknOhE;E0C1uOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwnOvC;E0C9uOF;IzCgLI,sByCxD8D;E1CynOhE;E0CjvOF;IAqHQ,UAAU;IACV,gBAAiC;E1C+nOvC;E0CrvOF;IzCgLI,sByCxD8D;E1CgoOhE;E0CxvOF;IAqHQ,UAAU;IACV,WAAiC;E1CsoOvC;E0C5vOF;IzCgLI,iByCxD8D;E1CuoOhE;AACF;;AC1pOE;EyCtGF;IA4HM,UAAU;IACV,YAAY;E1CyoOhB;E0CtwOF;IAgIM,UAAU;IACV,WAAW;E1CyoOf;E0C1wOF;IAoIM,UAAU;IACV,UAAU;E1CyoOd;E0C9wOF;IAwIM,UAAU;IACV,eAAe;E1CyoOnB;E0ClxOF;IA4IM,UAAU;IACV,UAAU;E1CyoOd;E0CtxOF;IAgJM,UAAU;IACV,eAAe;E1CyoOnB;E0C1xOF;IAoJM,UAAU;IACV,UAAU;E1CyoOd;E0C9xOF;IAwJM,UAAU;IACV,UAAU;E1CyoOd;E0ClyOF;IA4JM,UAAU;IACV,UAAU;E1CyoOd;E0CtyOF;IAgKM,UAAU;IACV,UAAU;E1CyoOd;E0C1yOF;IAoKM,UAAU;IACV,UAAU;E1CyoOd;E0C9yOF;IzCgLI,gByCRqC;E1CyoOvC;E0CjzOF;IzCgLI,qByCL0C;E1CyoO5C;E0CpzOF;IzCgLI,gByCFqC;E1CyoOvC;E0CvzOF;IzCgLI,qByCC0C;E1CyoO5C;E0C1zOF;IzCgLI,gByCIqC;E1CyoOvC;E0C7zOF;IzCgLI,gByCOqC;E1CyoOvC;E0Ch0OF;IzCgLI,gByCUqC;E1CyoOvC;E0Cn0OF;IzCgLI,gByCaqC;E1CyoOvC;E0Ct0OF;IzCgLI,gByCgBqC;E1CyoOvC;E0Cz0OF;IAoMQ,UAAU;IACV,SAAiC;E1CwoOvC;E0C70OF;IzCgLI,eyCwB8D;E1CwoOhE;E0Ch1OF;IAoMQ,UAAU;IACV,eAAiC;E1C+oOvC;E0Cp1OF;IzCgLI,qByCwB8D;E1C+oOhE;E0Cv1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CspOvC;E0C31OF;IzCgLI,sByCwB8D;E1CspOhE;E0C91OF;IAoMQ,UAAU;IACV,UAAiC;E1C6pOvC;E0Cl2OF;IzCgLI,gByCwB8D;E1C6pOhE;E0Cr2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CoqOvC;E0Cz2OF;IzCgLI,sByCwB8D;E1CoqOhE;E0C52OF;IAoMQ,UAAU;IACV,gBAAiC;E1C2qOvC;E0Ch3OF;IzCgLI,sByCwB8D;E1C2qOhE;E0Cn3OF;IAoMQ,UAAU;IACV,UAAiC;E1CkrOvC;E0Cv3OF;IzCgLI,gByCwB8D;E1CkrOhE;E0C13OF;IAoMQ,UAAU;IACV,gBAAiC;E1CyrOvC;E0C93OF;IzCgLI,sByCwB8D;E1CyrOhE;E0Cj4OF;IAoMQ,UAAU;IACV,gBAAiC;E1CgsOvC;E0Cr4OF;IzCgLI,sByCwB8D;E1CgsOhE;E0Cx4OF;IAoMQ,UAAU;IACV,UAAiC;E1CusOvC;E0C54OF;IzCgLI,gByCwB8D;E1CusOhE;E0C/4OF;IAoMQ,UAAU;IACV,gBAAiC;E1C8sOvC;E0Cn5OF;IzCgLI,sByCwB8D;E1C8sOhE;E0Ct5OF;IAoMQ,UAAU;IACV,gBAAiC;E1CqtOvC;E0C15OF;IzCgLI,sByCwB8D;E1CqtOhE;E0C75OF;IAoMQ,UAAU;IACV,WAAiC;E1C4tOvC;E0Cj6OF;IzCgLI,iByCwB8D;E1C4tOhE;AACF;;ACvzOE;EyC9GF;IA2MM,UAAU;IACV,YAAY;E1C+tOhB;E0C36OF;IA8MM,UAAU;IACV,WAAW;E1CguOf;E0C/6OF;IAiNM,UAAU;IACV,UAAU;E1CiuOd;E0Cn7OF;IAoNM,UAAU;IACV,eAAe;E1CkuOnB;E0Cv7OF;IAuNM,UAAU;IACV,UAAU;E1CmuOd;E0C37OF;IA0NM,UAAU;IACV,eAAe;E1CouOnB;E0C/7OF;IA6NM,UAAU;IACV,UAAU;E1CquOd;E0Cn8OF;IAgOM,UAAU;IACV,UAAU;E1CsuOd;E0Cv8OF;IAmOM,UAAU;IACV,UAAU;E1CuuOd;E0C38OF;IAsOM,UAAU;IACV,UAAU;E1CwuOd;E0C/8OF;IAyOM,UAAU;IACV,UAAU;E1CyuOd;E0Cn9OF;IzCgLI,gByC4DqC;E1C0uOvC;E0Ct9OF;IzCgLI,qByC8D0C;E1C2uO5C;E0Cz9OF;IzCgLI,gByCgEqC;E1C4uOvC;E0C59OF;IzCgLI,qByCkE0C;E1C6uO5C;E0C/9OF;IzCgLI,gByCoEqC;E1C8uOvC;E0Cl+OF;IzCgLI,gByCsEqC;E1C+uOvC;E0Cr+OF;IzCgLI,gByCwEqC;E1CgvOvC;E0Cx+OF;IzCgLI,gByC0EqC;E1CivOvC;E0C3+OF;IzCgLI,gByC4EqC;E1CkvOvC;E0C9+OF;IA+PQ,UAAU;IACV,SAAiC;E1CkvOvC;E0Cl/OF;IzCgLI,eyCkF8D;E1CmvOhE;E0Cr/OF;IA+PQ,UAAU;IACV,eAAiC;E1CyvOvC;E0Cz/OF;IzCgLI,qByCkF8D;E1C0vOhE;E0C5/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CgwOvC;E0ChgPF;IzCgLI,sByCkF8D;E1CiwOhE;E0CngPF;IA+PQ,UAAU;IACV,UAAiC;E1CuwOvC;E0CvgPF;IzCgLI,gByCkF8D;E1CwwOhE;E0C1gPF;IA+PQ,UAAU;IACV,gBAAiC;E1C8wOvC;E0C9gPF;IzCgLI,sByCkF8D;E1C+wOhE;E0CjhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CqxOvC;E0CrhPF;IzCgLI,sByCkF8D;E1CsxOhE;E0CxhPF;IA+PQ,UAAU;IACV,UAAiC;E1C4xOvC;E0C5hPF;IzCgLI,gByCkF8D;E1C6xOhE;E0C/hPF;IA+PQ,UAAU;IACV,gBAAiC;E1CmyOvC;E0CniPF;IzCgLI,sByCkF8D;E1CoyOhE;E0CtiPF;IA+PQ,UAAU;IACV,gBAAiC;E1C0yOvC;E0C1iPF;IzCgLI,sByCkF8D;E1C2yOhE;E0C7iPF;IA+PQ,UAAU;IACV,UAAiC;E1CizOvC;E0CjjPF;IzCgLI,gByCkF8D;E1CkzOhE;E0CpjPF;IA+PQ,UAAU;IACV,gBAAiC;E1CwzOvC;E0CxjPF;IzCgLI,sByCkF8D;E1CyzOhE;E0C3jPF;IA+PQ,UAAU;IACV,gBAAiC;E1C+zOvC;E0C/jPF;IzCgLI,sByCkF8D;E1Cg0OhE;E0ClkPF;IA+PQ,UAAU;IACV,WAAiC;E1Cs0OvC;E0CtkPF;IzCgLI,iByCkF8D;E1Cu0OhE;AACF;;ACx9OE;EyClHF;IAqQM,UAAU;IACV,YAAY;E1C00OhB;E0ChlPF;IAwQM,UAAU;IACV,WAAW;E1C20Of;E0CplPF;IA2QM,UAAU;IACV,UAAU;E1C40Od;E0CxlPF;IA8QM,UAAU;IACV,eAAe;E1C60OnB;E0C5lPF;IAiRM,UAAU;IACV,UAAU;E1C80Od;E0ChmPF;IAoRM,UAAU;IACV,eAAe;E1C+0OnB;E0CpmPF;IAuRM,UAAU;IACV,UAAU;E1Cg1Od;E0CxmPF;IA0RM,UAAU;IACV,UAAU;E1Ci1Od;E0C5mPF;IA6RM,UAAU;IACV,UAAU;E1Ck1Od;E0ChnPF;IAgSM,UAAU;IACV,UAAU;E1Cm1Od;E0CpnPF;IAmSM,UAAU;IACV,UAAU;E1Co1Od;E0CxnPF;IzCgLI,gByCsHqC;E1Cq1OvC;E0C3nPF;IzCgLI,qByCwH0C;E1Cs1O5C;E0C9nPF;IzCgLI,gByC0HqC;E1Cu1OvC;E0CjoPF;IzCgLI,qByC4H0C;E1Cw1O5C;E0CpoPF;IzCgLI,gByC8HqC;E1Cy1OvC;E0CvoPF;IzCgLI,gByCgIqC;E1C01OvC;E0C1oPF;IzCgLI,gByCkIqC;E1C21OvC;E0C7oPF;IzCgLI,gByCoIqC;E1C41OvC;E0ChpPF;IzCgLI,gByCsIqC;E1C61OvC;E0CnpPF;IAyTQ,UAAU;IACV,SAAiC;E1C61OvC;E0CvpPF;IzCgLI,eyC4I8D;E1C81OhE;E0C1pPF;IAyTQ,UAAU;IACV,eAAiC;E1Co2OvC;E0C9pPF;IzCgLI,qByC4I8D;E1Cq2OhE;E0CjqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C22OvC;E0CrqPF;IzCgLI,sByC4I8D;E1C42OhE;E0CxqPF;IAyTQ,UAAU;IACV,UAAiC;E1Ck3OvC;E0C5qPF;IzCgLI,gByC4I8D;E1Cm3OhE;E0C/qPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cy3OvC;E0CnrPF;IzCgLI,sByC4I8D;E1C03OhE;E0CtrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cg4OvC;E0C1rPF;IzCgLI,sByC4I8D;E1Ci4OhE;E0C7rPF;IAyTQ,UAAU;IACV,UAAiC;E1Cu4OvC;E0CjsPF;IzCgLI,gByC4I8D;E1Cw4OhE;E0CpsPF;IAyTQ,UAAU;IACV,gBAAiC;E1C84OvC;E0CxsPF;IzCgLI,sByC4I8D;E1C+4OhE;E0C3sPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cq5OvC;E0C/sPF;IzCgLI,sByC4I8D;E1Cs5OhE;E0CltPF;IAyTQ,UAAU;IACV,UAAiC;E1C45OvC;E0CttPF;IzCgLI,gByC4I8D;E1C65OhE;E0CztPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm6OvC;E0C7tPF;IzCgLI,sByC4I8D;E1Co6OhE;E0ChuPF;IAyTQ,UAAU;IACV,gBAAiC;E1C06OvC;E0CpuPF;IzCgLI,sByC4I8D;E1C26OhE;E0CvuPF;IAyTQ,UAAU;IACV,WAAiC;E1Ci7OvC;E0C3uPF;IzCgLI,iByC4I8D;E1Ck7OhE;AACF;;AC9mPI;EyCjIJ;IA+TM,UAAU;IACV,YAAY;E1Cq7OhB;E0CrvPF;IAkUM,UAAU;IACV,WAAW;E1Cs7Of;E0CzvPF;IAqUM,UAAU;IACV,UAAU;E1Cu7Od;E0C7vPF;IAwUM,UAAU;IACV,eAAe;E1Cw7OnB;E0CjwPF;IA2UM,UAAU;IACV,UAAU;E1Cy7Od;E0CrwPF;IA8UM,UAAU;IACV,eAAe;E1C07OnB;E0CzwPF;IAiVM,UAAU;IACV,UAAU;E1C27Od;E0C7wPF;IAoVM,UAAU;IACV,UAAU;E1C47Od;E0CjxPF;IAuVM,UAAU;IACV,UAAU;E1C67Od;E0CrxPF;IA0VM,UAAU;IACV,UAAU;E1C87Od;E0CzxPF;IA6VM,UAAU;IACV,UAAU;E1C+7Od;E0C7xPF;IzCgLI,gByCgLqC;E1Cg8OvC;E0ChyPF;IzCgLI,qByCkL0C;E1Ci8O5C;E0CnyPF;IzCgLI,gByCoLqC;E1Ck8OvC;E0CtyPF;IzCgLI,qByCsL0C;E1Cm8O5C;E0CzyPF;IzCgLI,gByCwLqC;E1Co8OvC;E0C5yPF;IzCgLI,gByC0LqC;E1Cq8OvC;E0C/yPF;IzCgLI,gByC4LqC;E1Cs8OvC;E0ClzPF;IzCgLI,gByC8LqC;E1Cu8OvC;E0CrzPF;IzCgLI,gByCgMqC;E1Cw8OvC;E0CxzPF;IAmXQ,UAAU;IACV,SAAiC;E1Cw8OvC;E0C5zPF;IzCgLI,eyCsM8D;E1Cy8OhE;E0C/zPF;IAmXQ,UAAU;IACV,eAAiC;E1C+8OvC;E0Cn0PF;IzCgLI,qByCsM8D;E1Cg9OhE;E0Ct0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs9OvC;E0C10PF;IzCgLI,sByCsM8D;E1Cu9OhE;E0C70PF;IAmXQ,UAAU;IACV,UAAiC;E1C69OvC;E0Cj1PF;IzCgLI,gByCsM8D;E1C89OhE;E0Cp1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Co+OvC;E0Cx1PF;IzCgLI,sByCsM8D;E1Cq+OhE;E0C31PF;IAmXQ,UAAU;IACV,gBAAiC;E1C2+OvC;E0C/1PF;IzCgLI,sByCsM8D;E1C4+OhE;E0Cl2PF;IAmXQ,UAAU;IACV,UAAiC;E1Ck/OvC;E0Ct2PF;IzCgLI,gByCsM8D;E1Cm/OhE;E0Cz2PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cy/OvC;E0C72PF;IzCgLI,sByCsM8D;E1C0/OhE;E0Ch3PF;IAmXQ,UAAU;IACV,gBAAiC;E1CggPvC;E0Cp3PF;IzCgLI,sByCsM8D;E1CigPhE;E0Cv3PF;IAmXQ,UAAU;IACV,UAAiC;E1CugPvC;E0C33PF;IzCgLI,gByCsM8D;E1CwgPhE;E0C93PF;IAmXQ,UAAU;IACV,gBAAiC;E1C8gPvC;E0Cl4PF;IzCgLI,sByCsM8D;E1C+gPhE;E0Cr4PF;IAmXQ,UAAU;IACV,gBAAiC;E1CqhPvC;E0Cz4PF;IzCgLI,sByCsM8D;E1CshPhE;E0C54PF;IAmXQ,UAAU;IACV,WAAiC;E1C4hPvC;E0Ch5PF;IzCgLI,iByCsM8D;E1C6hPhE;AACF;;ACpwPI;EyChJJ;IAyXM,UAAU;IACV,YAAY;E1CgiPhB;E0C15PF;IA4XM,UAAU;IACV,WAAW;E1CiiPf;E0C95PF;IA+XM,UAAU;IACV,UAAU;E1CkiPd;E0Cl6PF;IAkYM,UAAU;IACV,eAAe;E1CmiPnB;E0Ct6PF;IAqYM,UAAU;IACV,UAAU;E1CoiPd;E0C16PF;IAwYM,UAAU;IACV,eAAe;E1CqiPnB;E0C96PF;IA2YM,UAAU;IACV,UAAU;E1CsiPd;E0Cl7PF;IA8YM,UAAU;IACV,UAAU;E1CuiPd;E0Ct7PF;IAiZM,UAAU;IACV,UAAU;E1CwiPd;E0C17PF;IAoZM,UAAU;IACV,UAAU;E1CyiPd;E0C97PF;IAuZM,UAAU;IACV,UAAU;E1C0iPd;E0Cl8PF;IzCgLI,gByC0OqC;E1C2iPvC;E0Cr8PF;IzCgLI,qByC4O0C;E1C4iP5C;E0Cx8PF;IzCgLI,gByC8OqC;E1C6iPvC;E0C38PF;IzCgLI,qByCgP0C;E1C8iP5C;E0C98PF;IzCgLI,gByCkPqC;E1C+iPvC;E0Cj9PF;IzCgLI,gByCoPqC;E1CgjPvC;E0Cp9PF;IzCgLI,gByCsPqC;E1CijPvC;E0Cv9PF;IzCgLI,gByCwPqC;E1CkjPvC;E0C19PF;IzCgLI,gByC0PqC;E1CmjPvC;E0C79PF;IA6aQ,UAAU;IACV,SAAiC;E1CmjPvC;E0Cj+PF;IzCgLI,eyCgQ8D;E1CojPhE;E0Cp+PF;IA6aQ,UAAU;IACV,eAAiC;E1C0jPvC;E0Cx+PF;IzCgLI,qByCgQ8D;E1C2jPhE;E0C3+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CikPvC;E0C/+PF;IzCgLI,sByCgQ8D;E1CkkPhE;E0Cl/PF;IA6aQ,UAAU;IACV,UAAiC;E1CwkPvC;E0Ct/PF;IzCgLI,gByCgQ8D;E1CykPhE;E0Cz/PF;IA6aQ,UAAU;IACV,gBAAiC;E1C+kPvC;E0C7/PF;IzCgLI,sByCgQ8D;E1CglPhE;E0ChgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CslPvC;E0CpgQF;IzCgLI,sByCgQ8D;E1CulPhE;E0CvgQF;IA6aQ,UAAU;IACV,UAAiC;E1C6lPvC;E0C3gQF;IzCgLI,gByCgQ8D;E1C8lPhE;E0C9gQF;IA6aQ,UAAU;IACV,gBAAiC;E1ComPvC;E0ClhQF;IzCgLI,sByCgQ8D;E1CqmPhE;E0CrhQF;IA6aQ,UAAU;IACV,gBAAiC;E1C2mPvC;E0CzhQF;IzCgLI,sByCgQ8D;E1C4mPhE;E0C5hQF;IA6aQ,UAAU;IACV,UAAiC;E1CknPvC;E0ChiQF;IzCgLI,gByCgQ8D;E1CmnPhE;E0CniQF;IA6aQ,UAAU;IACV,gBAAiC;E1CynPvC;E0CviQF;IzCgLI,sByCgQ8D;E1C0nPhE;E0C1iQF;IA6aQ,UAAU;IACV,gBAAiC;E1CgoPvC;E0C9iQF;IzCgLI,sByCgQ8D;E1CioPhE;E0CjjQF;IA6aQ,UAAU;IACV,WAAiC;E1CuoPvC;E0CrjQF;IzCgLI,iByCgQ8D;E1CwoPhE;AACF;;A0CvoPA;EzClQI,qByClLgB;EzCkLhB,sByClLgB;EAublB,oBAvbkB;A1CikQpB;;A0C7oPA;EAKI,uBAzbgB;A1CqkQpB;;A0CjpPA;EAOI,qCAA4C;A1C8oPhD;;A0CrpPA;EAUI,uBAAuB;A1C+oP3B;;A0CzpPA;EzClQI,cyC8QiC;EzC9QjC,eyC+QiC;EACjC,aAAa;A1CipPjB;;A0C/pPA;EAgBM,SAAS;EACT,qBAAqB;A1CmpP3B;;A0CpqPA;EAmBM,qBAAqB;A1CqpP3B;;A0CxqPA;EAqBM,gBAAgB;A1CupPtB;;A0C5qPA;EAuBI,aAAa;A1CypPjB;;A0ChrPA;EAyBI,eAAe;A1C2pPnB;;A0CprPA;EA2BI,mBAAmB;A1C6pPvB;;ACpgQE;EyC4UF;IA+BM,aAAa;E1C8pPjB;AACF;;AC9/PE;EyCgUF;IAmCM,aAAa;E1CgqPjB;AACF;;A0C9pPE;EACE,oBAAY;EzCzSZ,wCyC0S2D;EzC1S3D,yCyC2S2D;A1CiqP/D;;A0CpqPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1CmqPrC;;A0CzqPE;EASM,iBAAY;A1CoqPpB;;ACniQE;EyCsXA;IAYQ,iBAAY;E1CsqPpB;AACF;;ACriQE;EyCkXA;IAeQ,iBAAY;E1CyqPpB;AACF;;ACviQE;EyC8WA;IAkBQ,iBAAY;E1C4qPpB;AACF;;ACziQE;EyC0WA;IAqBQ,iBAAY;E1C+qPpB;AACF;;AC3iQE;EyCsWA;IAwBQ,iBAAY;E1CkrPpB;AACF;;AC5iQI;EyCiWF;IA2BQ,iBAAY;E1CqrPpB;AACF;;ACxiQI;EyCuVF;IA8BQ,iBAAY;E1CwrPpB;AACF;;ACziQI;EyCkVF;IAiCQ,iBAAY;E1C2rPpB;AACF;;ACriQI;EyCwUF;IAoCQ,iBAAY;E1C8rPpB;AACF;;A0CnuPE;EASM,oBAAY;A1C8tPpB;;AC7lQE;EyCsXA;IAYQ,oBAAY;E1CguPpB;AACF;;AC/lQE;EyCkXA;IAeQ,oBAAY;E1CmuPpB;AACF;;ACjmQE;EyC8WA;IAkBQ,oBAAY;E1CsuPpB;AACF;;ACnmQE;EyC0WA;IAqBQ,oBAAY;E1CyuPpB;AACF;;ACrmQE;EyCsWA;IAwBQ,oBAAY;E1C4uPpB;AACF;;ACtmQI;EyCiWF;IA2BQ,oBAAY;E1C+uPpB;AACF;;AClmQI;EyCuVF;IA8BQ,oBAAY;E1CkvPpB;AACF;;ACnmQI;EyCkVF;IAiCQ,oBAAY;E1CqvPpB;AACF;;AC/lQI;EyCwUF;IAoCQ,oBAAY;E1CwvPpB;AACF;;A0C7xPE;EASM,mBAAY;A1CwxPpB;;ACvpQE;EyCsXA;IAYQ,mBAAY;E1C0xPpB;AACF;;ACzpQE;EyCkXA;IAeQ,mBAAY;E1C6xPpB;AACF;;AC3pQE;EyC8WA;IAkBQ,mBAAY;E1CgyPpB;AACF;;AC7pQE;EyC0WA;IAqBQ,mBAAY;E1CmyPpB;AACF;;AC/pQE;EyCsWA;IAwBQ,mBAAY;E1CsyPpB;AACF;;AChqQI;EyCiWF;IA2BQ,mBAAY;E1CyyPpB;AACF;;AC5pQI;EyCuVF;IA8BQ,mBAAY;E1C4yPpB;AACF;;AC7pQI;EyCkVF;IAiCQ,mBAAY;E1C+yPpB;AACF;;ACzpQI;EyCwUF;IAoCQ,mBAAY;E1CkzPpB;AACF;;A0Cv1PE;EASM,oBAAY;A1Ck1PpB;;ACjtQE;EyCsXA;IAYQ,oBAAY;E1Co1PpB;AACF;;ACntQE;EyCkXA;IAeQ,oBAAY;E1Cu1PpB;AACF;;ACrtQE;EyC8WA;IAkBQ,oBAAY;E1C01PpB;AACF;;ACvtQE;EyC0WA;IAqBQ,oBAAY;E1C61PpB;AACF;;ACztQE;EyCsWA;IAwBQ,oBAAY;E1Cg2PpB;AACF;;AC1tQI;EyCiWF;IA2BQ,oBAAY;E1Cm2PpB;AACF;;ACttQI;EyCuVF;IA8BQ,oBAAY;E1Cs2PpB;AACF;;ACvtQI;EyCkVF;IAiCQ,oBAAY;E1Cy2PpB;AACF;;ACntQI;EyCwUF;IAoCQ,oBAAY;E1C42PpB;AACF;;A0Cj5PE;EASM,iBAAY;A1C44PpB;;AC3wQE;EyCsXA;IAYQ,iBAAY;E1C84PpB;AACF;;AC7wQE;EyCkXA;IAeQ,iBAAY;E1Ci5PpB;AACF;;AC/wQE;EyC8WA;IAkBQ,iBAAY;E1Co5PpB;AACF;;ACjxQE;EyC0WA;IAqBQ,iBAAY;E1Cu5PpB;AACF;;ACnxQE;EyCsWA;IAwBQ,iBAAY;E1C05PpB;AACF;;ACpxQI;EyCiWF;IA2BQ,iBAAY;E1C65PpB;AACF;;AChxQI;EyCuVF;IA8BQ,iBAAY;E1Cg6PpB;AACF;;ACjxQI;EyCkVF;IAiCQ,iBAAY;E1Cm6PpB;AACF;;AC7wQI;EyCwUF;IAoCQ,iBAAY;E1Cs6PpB;AACF;;A0C38PE;EASM,oBAAY;A1Cs8PpB;;ACr0QE;EyCsXA;IAYQ,oBAAY;E1Cw8PpB;AACF;;ACv0QE;EyCkXA;IAeQ,oBAAY;E1C28PpB;AACF;;ACz0QE;EyC8WA;IAkBQ,oBAAY;E1C88PpB;AACF;;AC30QE;EyC0WA;IAqBQ,oBAAY;E1Ci9PpB;AACF;;AC70QE;EyCsWA;IAwBQ,oBAAY;E1Co9PpB;AACF;;AC90QI;EyCiWF;IA2BQ,oBAAY;E1Cu9PpB;AACF;;AC10QI;EyCuVF;IA8BQ,oBAAY;E1C09PpB;AACF;;AC30QI;EyCkVF;IAiCQ,oBAAY;E1C69PpB;AACF;;ACv0QI;EyCwUF;IAoCQ,oBAAY;E1Cg+PpB;AACF;;A0CrgQE;EASM,mBAAY;A1CggQpB;;AC/3QE;EyCsXA;IAYQ,mBAAY;E1CkgQpB;AACF;;ACj4QE;EyCkXA;IAeQ,mBAAY;E1CqgQpB;AACF;;ACn4QE;EyC8WA;IAkBQ,mBAAY;E1CwgQpB;AACF;;ACr4QE;EyC0WA;IAqBQ,mBAAY;E1C2gQpB;AACF;;ACv4QE;EyCsWA;IAwBQ,mBAAY;E1C8gQpB;AACF;;ACx4QI;EyCiWF;IA2BQ,mBAAY;E1CihQpB;AACF;;ACp4QI;EyCuVF;IA8BQ,mBAAY;E1CohQpB;AACF;;ACr4QI;EyCkVF;IAiCQ,mBAAY;E1CuhQpB;AACF;;ACj4QI;EyCwUF;IAoCQ,mBAAY;E1C0hQpB;AACF;;A0C/jQE;EASM,oBAAY;A1C0jQpB;;ACz7QE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AgD;A7Cg0RxD;;A6C/zRI;EACE,oCAAyC;A7Ck0R/C;;A6Ch0RI;EACE,yBAA6B;A7Cm0RnC;;A6Cl0RI;EAGI,yBAAgD;A7Cm0RxD;;A6Cl0RI;EACE,oCAAwC;A7Cq0R9C;;A6Cj2RE;EACE,yBAAwB;A7Co2R5B;;A6Cn2RE;EAGI,yBAA0C;A7Co2RhD;;A6Cn2RE;EACE,oCAAmC;A7Cs2RvC;;A6Cj2RI;EACE,yBAA8B;A7Co2RpC;;A6Cn2RI;EAGI,yBAAgD;A7Co2RxD;;A6Cn2RI;EACE,oCAAyC;A7Cs2R/C;;A6Cp2RI;EACE,yBAA6B;A7Cu2RnC;;A6Ct2RI;EAGI,yBAAgD;A7Cu2RxD;;A6Ct2RI;EACE,oCAAwC;A7Cy2R9C;;A6Cr4RE;EACE,yBAAwB;A7Cw4R5B;;A6Cv4RE;EAGI,yBAA0C;A7Cw4RhD;;A6Cv4RE;EACE,oCAAmC;A7C04RvC;;A6Cr4RI;EACE,yBAA8B;A7Cw4RpC;;A6Cv4RI;EAGI,yBAAgD;A7Cw4RxD;;A6Cv4RI;EACE,oCAAyC;A7C04R/C;;A6Cx4RI;EACE,yBAA6B;A7C24RnC;;A6C14RI;EAGI,yBAAgD;A7C24RxD;;A6C14RI;EACE,oCAAwC;A7C64R9C;;A6Cz6RE;EACE,yBAAwB;A7C46R5B;;A6C36RE;EAGI,yBAA0C;A7C46RhD;;A6C36RE;EACE,oCAAmC;A7C86RvC;;A6Cz6RI;EACE,yBAA8B;A7C46RpC;;A6C36RI;EAGI,yBAAgD;A7C46RxD;;A6C36RI;EACE,oCAAyC;A7C86R/C;;A6C56RI;EACE,yBAA6B;A7C+6RnC;;A6C96RI;EAGI,yBAAgD;A7C+6RxD;;A6C96RI;EACE,oCAAwC;A7Ci7R9C;;A6C78RE;EACE,yBAAwB;A7Cg9R5B;;A6C/8RE;EAGI,yBAA0C;A7Cg9RhD;;A6C/8RE;EACE,oCAAmC;A7Ck9RvC;;A6C78RI;EACE,yBAA8B;A7Cg9RpC;;A6C/8RI;EAGI,yBAAgD;A7Cg9RxD;;A6C/8RI;EACE,oCAAyC;A7Ck9R/C;;A6Ch9RI;EACE,yBAA6B;A7Cm9RnC;;A6Cl9RI;EAGI,yBAAgD;A7Cm9RxD;;A6Cl9RI;EACE,oCAAwC;A7Cq9R9C;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,yBAAwB;A7Cq+R5B;;A6Cp+RE;EACE,oCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A6Cl/RE;EACE,yBAAwB;A7Cq/R5B;;A6Cp/RE;EACE,oCAAmC;A7Cu/RvC;;A6C1/RE;EACE,yBAAwB;A7C6/R5B;;A6C5/RE;EACE,oCAAmC;A7C+/RvC;;A6ClgSE;EACE,yBAAwB;A7CqgS5B;;A6CpgSE;EACE,oCAAmC;A7CugSvC;;A6C1gSE;EACE,4BAAwB;A7C6gS5B;;A6C5gSE;EACE,uCAAmC;A7C+gSvC;;A6ClhSE;EACE,yBAAwB;A7CqhS5B;;A6CphSE;EACE,oCAAmC;A7CuhSvC;;A8C3jSE;EACE,8BAAiC;A9C8jSrC;;A8C/jSE;EACE,sCAAiC;A9CkkSrC;;A8CnkSE;EACE,iCAAiC;A9CskSrC;;A8CvkSE;EACE,yCAAiC;A9C0kSrC;;A8CtkSE;EACE,4BAA4B;A9CykShC;;A8C1kSE;EACE,0BAA4B;A9C6kShC;;A8C9kSE;EACE,kCAA4B;A9CilShC;;A8C7kSE;EACE,sCAAkC;A9CglStC;;A8CjlSE;EACE,oCAAkC;A9ColStC;;A8CrlSE;EACE,kCAAkC;A9CwlStC;;A8CzlSE;EACE,yCAAkC;A9C4lStC;;A8C7lSE;EACE,wCAAkC;A9CgmStC;;A8CjmSE;EACE,wCAAkC;A9ComStC;;A8CrmSE;EACE,iCAAkC;A9CwmStC;;A8CzmSE;EACE,+BAAkC;A9C4mStC;;A8C7mSE;EACE,gCAAkC;A9CgnStC;;A8CjnSE;EACE,iCAAkC;A9ConStC;;A8ChnSE;EACE,oCAAgC;A9CmnSpC;;A8CpnSE;EACE,kCAAgC;A9CunSpC;;A8CxnSE;EACE,gCAAgC;A9C2nSpC;;A8C5nSE;EACE,uCAAgC;A9C+nSpC;;A8ChoSE;EACE,sCA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Dv4TE;IACE,0BAA2B;EpDy4T/B;EoD14TE;IACE,4BAA2B;EpD44T/B;EoD74TE;IACE,6BAA2B;EpD+4T/B;EoDh5TE;IACE,0BAA2B;EpDk5T/B;EoDn5TE;IACE,6BAA2B;EpDq5T/B;AACF;;ACvxTI;EmDhIA;IACE,0BAA2B;EpD25T/B;EoD55TE;IACE,4BAA2B;EpD85T/B;EoD/5TE;IACE,0BAA2B;EpDi6T/B;EoDl6TE;IACE,4BAA2B;EpDo6T/B;EoDr6TE;IACE,6BAA2B;EpDu6T/B;EoDx6TE;IACE,0BAA2B;EpD06T/B;EoD36TE;IACE,6BAA2B;EpD66T/B;AACF;;AChyTI;EmD/IA;IACE,0BAA2B;EpDm7T/B;EoDp7TE;IACE,4BAA2B;EpDs7T/B;EoDv7TE;IACE,0BAA2B;EpDy7T/B;EoD17TE;IACE,4BAA2B;EpD47T/B;EoD77TE;IACE,6BAA2B;EpD+7T/B;EoDh8TE;IACE,0BAA2B;EpDk8T/B;EoDn8TE;IACE,6BAA2B;EpDq8T/B;AACF;;AoD76TE;EACE,6BAAqC;ApDg7TzC;;AoDj7TE;EACE,8BAAqC;ApDo7TzC;;AoDr7TE;EACE,2BAAqC;ApDw7TzC;;AoDz7TE;EACE,4BAAqC;ApD47TzC;;ACt3TE;EmDlEE;IACE,6BAAqC;EpD47TzC;AACF;;ACx3TE;EmDnEE;IACE,6BAAqC;EpD+7TzC;AACF;;AC13TE;EmDpEE;IACE,6BAAqC;EpDk8TzC;AACF;;AC53TE;EmDrEE;IACE,6BAAqC;EpDq8TzC;AACF;;AC93TE;EmDtEE;IACE,6BAAqC;EpDw8TzC;AACF;;AC/3TI;EmDxEA;IACE,6BAAqC;EpD28TzC;AACF;;AC33TI;EmD/EA;IACE,6BAAqC;EpD88TzC;AACF;;AC53TI;EmDjFA;IACE,6BAAqC;EpDi9TzC;AACF;;ACx3TI;EmDxFA;IACE,6BAAqC;EpDo9TzC;AACF;;AC56TE;EmDlEE;IACE,8BAAqC;EpDk/TzC;AACF;;AC96TE;EmDnEE;IACE,8BAAqC;EpDq/TzC;AACF;;ACh7TE;EmDpEE;IACE,8BAAqC;EpDw/TzC;AACF;;ACl7TE;EmDrEE;IACE,8BAAqC;EpD2/TzC;AACF;;ACp7TE;EmDtEE;IACE,8BAAqC;EpD8/TzC;AACF;;ACr7TI;EmDxEA;IACE,8BAAqC;EpDigUzC;AACF;;ACj7TI;EmD/EA;IACE,8BAAqC;EpDogUzC;AACF;;ACl7TI;EmDjFA;IACE,8BAAqC;EpDugUzC;AACF;;AC96TI;EmDxFA;IACE,8BAAqC;EpD0gUzC;AACF;;ACl+TE;EmDlEE;IACE,2BAAqC;EpDwiUzC;AACF;;ACp+TE;EmDnEE;IACE,2BAAqC;EpD2iUzC;AACF;;ACt+TE;EmDpEE;IACE,2BAAqC;EpD8iUzC;AACF;;ACx+TE;EmDrEE;IACE,2BAAqC;EpDijUzC;AACF;;AC1+TE;EmDtEE;IACE,2BAAqC;EpDojUzC;AACF;;AC3+TI;EmDxEA;IACE,2BAAqC;EpDujUzC;AACF;;ACv+TI;EmD/EA;IACE,2BAAqC;EpD0jUzC;AACF;;ACx+TI;EmDjFA;IACE,2BAAqC;EpD6jUzC;AACF;;ACp+TI;EmDxFA;IACE,2BAAqC;EpDgkUzC;AACF;;ACxhUE;EmDlEE;IACE,4BAAqC;EpD8lUzC;AACF;;AC1hUE;EmDnEE;IACE,4BAAqC;EpDimUzC;AACF;;AC5hUE;EmDpEE;IACE,4BAAqC;EpDomUzC;AACF;;AC9hUE;EmDrEE;IACE,4BAAqC;EpDumUzC;AACF;;AChiUE;EmDtEE;IACE,4BAAqC;EpD0mUzC;AACF;;ACjiUI;EmDxEA;IACE,4BAAqC;EpD6mUzC;AACF;;AC7hUI;EmD/EA;IACE,4BAAqC;EpDgnUzC;AACF;;AC9hUI;EmDjFA;IACE,4BAAqC;EpDmnUzC;AACF;;AC1hUI;EmDxFA;IACE,4BAAqC;EpDsnUzC;AACF;;AoDrnUA;EACE,qCAAqC;ApDwnUvC;;AoDtnUA;EACE,oCAAoC;ApDynUtC;;AoDvnUA;EACE,oCAAoC;ApD0nUtC;;AoDxnUA;EACE,6BAA6B;ApD2nU/B;;AoDznUA;EACE,qCAAqC;ApD4nUvC;;AoD1nUA;EACE,2BAAqC;ApD6nUvC;;AoD5nUA;EACE,2BAAsC;ApD+nUxC;;AoD9nUA;EACE,2BAAsC;ApDioUxC;;AoDhoUA;EACE,2BAAwC;ApDmoU1C;;AoDloUA;EACE,2BAAoC;ApDqoUtC;;AoDnoUA;EACE,+LAAuC;ApDsoUzC;;AoDpoUA;EACE,+LAAyC;ApDuoU3C;;AoDroUA;EACE,+LAA0C;ApDwoU5C;;AoDtoUA;EACE,iCAAyC;ApDyoU3C;;AoDvoUA;EACE,iCAAoC;ApD0oUtC;;AqD3uUE;EACE,yBAA+B;ArD8uUnC;;AC9oUE;EoD9FE;IACE,yBAA+B;ErDgvUnC;AACF;;AChpUE;EoD/FE;IACE,yBAA+B;ErDmvUnC;AACF;;AClpUE;EoDhGE;IACE,yBAA+B;ErDsvUnC;AACF;;ACppUE;EoDjGE;IACE,yBAA+B;ErDyvUnC;AACF;;ACtpUE;EoDlGE;IACE,yBAA+B;ErD4vUnC;AACF;;ACvpUI;EoDpGA;IACE,yBAA+B;ErD+vUnC;AACF;;ACnpUI;EoD3GA;IACE,yBAA+B;ErDkwUnC;AACF;;ACppUI;EoD7GA;IACE,yBAA+B;ErDqwUnC;AACF;;AChpUI;EoDpHA;IACE,yBAA+B;ErDwwUnC;AACF;;AqDryUE;EACE,wBAA+B;ArDwyUnC;;ACxsUE;EoD9FE;IACE,wBAA+B;ErD0yUnC;AACF;;AC1sUE;EoD/FE;IACE,wBAA+B;ErD6yUnC;AACF;;AC5sUE;EoDhGE;IACE,wBAA+B;ErDgzUnC;AACF;;AC9sUE;EoDjGE;IACE,wBAA+B;ErDmzUnC;AACF;;AChtUE;EoDlGE;IACE,wBAA+B;ErDszUnC;AACF;;ACjtUI;EoDpGA;IACE,wBAA+B;ErDyzUnC;AACF;;AC7sUI;EoD3GA;IACE,wBAA+B;ErD4zUnC;AACF;;AC9sUI;EoD7GA;IACE,wBAA+B;ErD+zUnC;AACF;;AC1sUI;EoDpHA;IACE,wBAA+B;ErDk0UnC;AACF;;AqD/1UE;EACE,0BAA+B;ArDk2UnC;;AClwUE;EoD9FE;IACE,0BAA+B;ErDo2UnC;AACF;;ACpwUE;EoD/FE;IACE,0BAA+B;ErDu2UnC;AACF;;ACtwUE;EoDhGE;IACE,0BAA+B;ErD02UnC;AACF;;ACxwUE;EoDjGE;IACE,0BAA+B;ErD62UnC;AACF;;AC1wUE;EoDlGE;IACE,0BAA+B;ErDg3UnC;AACF;;AC3wUI;EoDpGA;IACE,0BAA+B;ErDm3UnC;AACF;;ACvwUI;EoD3GA;IACE,0BAA+B;ErDs3UnC;AACF;;ACxwUI;EoD7GA;IACE,0BAA+B;ErDy3UnC;AACF;;ACpwUI;EoDpHA;IACE,0BAA+B;ErD43UnC;AACF;;AqDz5UE;EACE,gCAA+B;ArD45UnC;;AC5zUE;EoD9FE;IACE,gCAA+B;ErD85UnC;AACF;;AC9zUE;EoD/FE;IACE,gCAA+B;ErDi6UnC;AACF;;ACh0UE;EoDhGE;IACE,gCAA+B;ErDo6UnC;AACF;;ACl0UE;EoDjGE;IACE,gCAA+B;ErDu6UnC;AACF;;ACp0UE;EoDlGE;IACE,gCAA+B;ErD06UnC;AACF;;ACr0UI;EoDpGA;IACE,gCAA+B;ErD66UnC;AACF;;ACj0UI;EoD3GA;IACE,gCAA+B;ErDg7UnC;AACF;;ACl0UI;EoD7GA;IACE,gCAA+B;ErDm7UnC;AACF;;AC9zUI;EoDpHA;IACE,gCAA+B;ErDs7UnC;AACF;;AqDn9UE;EACE,+BAA+B;ArDs9UnC;;ACt3UE;EoD9FE;IACE,+BAA+B;ErDw9UnC;AACF;;ACx3UE;EoD/FE;IACE,+BAA+B;ErD29UnC;AACF;;AC13UE;EoDhGE;IACE,+BAA+B;ErD89UnC;AACF;;AC53UE;EoDjGE;IACE,+BAA+B;ErDi+UnC;AACF;;AC93UE;EoDlGE;IACE,+BAA+B;ErDo+UnC;AACF;;AC/3UI;EoDpGA;IACE,+BAA+B;ErDu+UnC;AACF;;AC33UI;EoD3GA;IACE,+BAA+B;ErD0+UnC;AACF;;AC53UI;EoD7GA;IACE,+BAA+B;ErD6+UnC;AACF;;ACx3UI;EoDpHA;IACE,+BAA+B;ErDg/UnC;AACF;;AqD/+UA;EACE,wBAAwB;ArDk/U1B;;AqDh/UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArDm/U1B;;AC37UE;EoDrDA;IACE,wBAAwB;ErDo/U1B;AACF;;AC77UE;EoDrDA;IACE,wBAAwB;ErDs/U1B;AACF;;AC/7UE;EoDrDA;IACE,wBAAwB;ErDw/U1B;AACF;;ACj8UE;EoDrDA;IACE,wBAAwB;ErD0/U1B;AACF;;ACn8UE;EoDrDA;IACE,wBAAwB;ErD4/U1B;AACF;;ACp8UI;EoDtDF;IACE,wBAAwB;ErD8/U1B;AACF;;ACh8UI;EoD5DF;IACE,wBAAwB;ErDggV1B;AACF;;ACj8UI;EoD7DF;IACE,wBAAwB;ErDkgV1B;AACF;;AC77UI;EoDnEF;IACE,wBAAwB;ErDogV1B;AACF;;AqDngVA;EACE,6BAA6B;ArDsgV/B;;ACr/UE;EoDdA;IACE,6BAA6B;ErDugV/B;AACF;;ACv/UE;EoDdA;IACE,6BAA6B;ErDygV/B;AACF;;ACz/UE;EoDdA;IACE,6BAA6B;ErD2gV/B;AACF;;AC3/UE;EoDdA;IACE,6BAA6B;ErD6gV/B;AACF;;AC7/UE;EoDdA;IACE,6BAA6B;ErD+gV/B;AACF;;AC9/UI;EoDfF;IACE,6BAA6B;ErDihV/B;AACF;;AC1/UI;EoDrBF;IACE,6BAA6B;ErDmhV/B;AACF;;AC3/UI;EoDtBF;IACE,6BAA6B;ErDqhV/B;AACF;;ACv/UI;EoD5BF;IACE,6BAA6B;ErDuhV/B;AACF;;AsDjpVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvD0oVhC;;AuD9oVA;EAMI,gBAAgB;AvD4oVpB;;AuDlpVA;EASM,mBAAmB;AvD6oVzB;;AuDtpVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;ACoqV7B;;AuD3pVA;;EAmBQ,cAAc;AvD6oVtB;;AuDhqVA;EAqBQ,cxD9BqB;AC6qV7B;;AuDpqVA;EAuBQ,4BxDhCqB;ACirV7B;;AuDxqVA;;EA0BU,cxDnCmB;ACsrV7B;;ACtkVE;EsDvGF;IA6BU,uBxDzBqB;EC8qV7B;AACF;;AuDnrVA;;EAgCQ,4BxDzCqB;ACisV7B;;AuDxrVA;;;EAqCU,yB7C4DuB;E6C3DvB,cxD/CmB;ACwsV7B;;AuD/rVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvD0pVtB;;AuDpsVA;EA4CY,UAAU;AvD4pVtB;;AuDxsVA;EA+CY,uBAAwB;EACxB,UAAU;AvD6pVtB;;AuD7sVA;EAoDY,cxD7DiB;AC0tV7B;;AuDjtVA;EAsDc,uCxD/De;AC8tV7B;;AuDrtVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;ACutV/B;;AuD3tVA;EAkEU,4EAAyG;AvD6pVnH;;ACpoVE;EsD3FF;IAqEc,4EAAyG;EvD+pVrH;AACF;;AuDruVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;ACsuV/B;;AuD1uVA;;EAmBQ,cAAc;AvD4tVtB;;AuD/uVA;EAqBQ,YxDjBuB;AC+uV/B;;AuDnvVA;EAuBQ,+BxDnBuB;ACmvV/B;;AuDvvVA;;EA0BU,YxDtBqB;ACwvV/B;;ACrpVE;EsDvGF;IA6BU,yBxDtCmB;EC0wV3B;AACF;;AuDlwVA;;EAgCQ,+BxD5BuB;ACmwV/B;;AuDvwVA;;;EAqCU,uB7C4DuB;E6C3DvB,YxDlCqB;AC0wV/B;;AuD9wVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDyuVtB;;AuDnxVA;EA4CY,UAAU;AvD2uVtB;;AuDvxVA;EA+CY,yBAAwB;EACxB,UAAU;AvD4uVtB;;AuD5xVA;EAoDY,YxDhDmB;AC4xV/B;;AuDhyVA;EAsDc,uCxD/De;AC6yV7B;;AuDpyVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;ACmzV7B;;AuD1yVA;EAkEU,8EAAyG;AvD4uVnH;;ACntVE;EsD3FF;IAqEc,8EAAyG;EvD8uVrH;AACF;;AuDpzVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AVovVrB;;AuDzzVA;;EAmBQ,cAAc;AvD2yVtB;;AuD9zVA;EAqBQ,yB7CgDa;AV6vVrB;;AuDl0VA;EAuBQ,yB7C8Ca;AViwVrB;;AuDt0VA;;EA0BU,yB7C2CW;AVswVrB;;ACpuVE;EsDvGF;IA6BU,4BxD3BoB;EC80V5B;AACF;;AuDj1VA;;EAgCQ,yB7CqCa;AVixVrB;;AuDt1VA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVwxVrB;;AuD71VA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDwzVtB;;AuDl2VA;EA4CY,UAAU;AvD0zVtB;;AuDt2VA;EA+CY,4BAAwB;EACxB,UAAU;AvD2zVtB;;AuD32VA;EAoDY,yB7CiBS;AV0yVrB;;AuD/2VA;EAsDc,uCxD/De;AC43V7B;;AuDn3VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;ACu3V9B;;AuDz3VA;EAkEU,iFAAyG;AvD2zVnH;;AClyVE;EsD3FF;IAqEc,iFAAyG;EvD6zVrH;AACF;;AuDn4VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVi0VhB;;AuDx4VA;;EAmBQ,cAAc;AvD03VtB;;AuD74VA;EAqBQ,W7CkDQ;AV00VhB;;AuDj5VA;EAuBQ,+B7CgDQ;AV80VhB;;AuDr5VA;;EA0BU,W7C6CM;AVm1VhB;;ACnzVE;EsDvGF;IA6BU,yBxDlCoB;ECo6V5B;AACF;;AuDh6VA;;EAgCQ,+B7CuCQ;AV81VhB;;AuDr6VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVq2VhB;;AuD56VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDu4VtB;;AuDj7VA;EA4CY,UAAU;AvDy4VtB;;AuDr7VA;EA+CY,yBAAwB;EACxB,UAAU;AvD04VtB;;AuD17VA;EAoDY,W7CmBI;AVu3VhB;;AuD97VA;EAsDc,uCxD/De;AC28V7B;;AuDl8VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;AC68V9B;;AuDx8VA;EAkEU,gFAAyG;AvD04VnH;;ACj3VE;EsD3FF;IAqEc,gFAAyG;EvD44VrH;AACF;;AuDl9VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVg5VhB;;AuDv9VA;;EAmBQ,cAAc;AvDy8VtB;;AuD59VA;EAqBQ,W7CkDQ;AVy5VhB;;AuDh+VA;EAuBQ,+B7CgDQ;AV65VhB;;AuDp+VA;;EA0BU,W7C6CM;AVk6VhB;;ACl4VE;EsDvGF;IA6BU,yBxDpBwB;ECq+VhC;AACF;;AuD/+VA;;EAgCQ,+B7CuCQ;AV66VhB;;AuDp/VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVo7VhB;;AuD3/VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDs9VtB;;AuDhgWA;EA4CY,UAAU;AvDw9VtB;;AuDpgWA;EA+CY,yBAAwB;EACxB,UAAU;AvDy9VtB;;AuDzgWA;EAoDY,W7CmBI;AVs8VhB;;AuD7gWA;EAsDc,uCxD/De;AC0hW7B;;AuDjhWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;AC8gWlC;;AuDvhWA;EAkEU,gFAAyG;AvDy9VnH;;ACh8VE;EsD3FF;IAqEc,gFAAyG;EvD29VrH;AACF;;AuDjiWA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AV+9VhB;;AuDtiWA;;EAmBQ,cAAc;AvDwhWtB;;AuD3iWA;EAqBQ,W7CkDQ;AVw+VhB;;AuD/iWA;EAuBQ,+B7CgDQ;AV4+VhB;;AuDnjWA;;EA0BU,W7C6CM;AVi/VhB;;ACj9VE;EsDvGF;IA6BU,yBxDlBwB;ECkjWhC;AACF;;AuD9jWA;;EAgCQ,+B7CuCQ;AV4/VhB;;AuDnkWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVmgWhB;;AuD1kWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDqiWtB;;AuD/kWA;EA4CY,UAAU;AvDuiWtB;;AuDnlWA;EA+CY,yBAAwB;EACxB,UAAU;AvDwiWtB;;AuDxlWA;EAoDY,W7CmBI;AVqhWhB;;AuD5lWA;EAsDc,uCxD/De;ACymW7B;;AuDhmWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;AC2lWlC;;AuDtmWA;EAkEU,gFAAyG;AvDwiWnH;;AC/gWE;EsD3FF;IAqEc,gFAAyG;EvD0iWrH;AACF;;AuDhnWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AV8iWhB;;AuDrnWA;;EAmBQ,cAAc;AvDumWtB;;AuD1nWA;EAqBQ,W7CkDQ;AVujWhB;;AuD9nWA;EAuBQ,+B7CgDQ;AV2jWhB;;AuDloWA;;EA0BU,W7C6CM;AVgkWhB;;AChiWE;EsDvGF;IA6BU,yBxDnBwB;ECkoWhC;AACF;;AuD7oWA;;EAgCQ,+B7CuCQ;AV2kWhB;;AuDlpWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVklWhB;;AuDzpWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDonWtB;;AuD9pWA;EA4CY,UAAU;AvDsnWtB;;AuDlqWA;EA+CY,yBAAwB;EACxB,UAAU;AvDunWtB;;AuDvqWA;EAoDY,W7CmBI;AVomWhB;;AuD3qWA;EAsDc,uCxD/De;ACwrW7B;;AuD/qWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;AC2qWlC;;AuDrrWA;EAkEU,gFAAyG;AvDunWnH;;AC9lWE;EsD3FF;IAqEc,gFAAyG;EvDynWrH;AACF;;AuD/rWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AV6nWhB;;AuDpsWA;;EAmBQ,cAAc;AvDsrWtB;;AuDzsWA;EAqBQ,W7CkDQ;AVsoWhB;;AuD7sWA;EAuBQ,+B7CgDQ;AV0oWhB;;AuDjtWA;;EA0BU,W7C6CM;AV+oWhB;;AC/mWE;EsDvGF;IA6BU,yBxDrBwB;ECmtWhC;AACF;;AuD5tWA;;EAgCQ,+B7CuCQ;AV0pWhB;;AuDjuWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AViqWhB;;AuDxuWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDmsWtB;;AuD7uWA;EA4CY,UAAU;AvDqsWtB;;AuDjvWA;EA+CY,yBAAwB;EACxB,UAAU;AvDssWtB;;AuDtvWA;EAoDY,W7CmBI;AVmrWhB;;AuD1vWA;EAsDc,uCxD/De;ACuwW7B;;AuD9vWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;AC4vWlC;;AuDpwWA;EAkEU,gFAAyG;AvDssWnH;;AC7qWE;EsD3FF;IAqEc,gFAAyG;EvDwsWrH;AACF;;AuD9wWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AV8sWrB;;AuDnxWA;;EAmBQ,cAAc;AvDqwWtB;;AuDxxWA;EAqBQ,yB7CgDa;AVutWrB;;AuD5xWA;EAuBQ,yB7C8Ca;AV2tWrB;;AuDhyWA;;EA0BU,yB7C2CW;AVguWrB;;AC9rWE;EsDvGF;IA6BU,yBxDtBwB;ECmyWhC;AACF;;AuD3yWA;;EAgCQ,yB7CqCa;AV2uWrB;;AuDhzWA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVkvWrB;;AuDvzWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDkxWtB;;AuD5zWA;EA4CY,UAAU;AvDoxWtB;;AuDh0WA;EA+CY,yBAAwB;EACxB,UAAU;AvDqxWtB;;AuDr0WA;EAoDY,yB7CiBS;AVowWrB;;AuDz0WA;EAsDc,uCxD/De;ACs1W7B;;AuD70WA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;AC40WlC;;AuDn1WA;EAkEU,gFAAyG;AvDqxWnH;;AC5vWE;EsD3FF;IAqEc,gFAAyG;EvDuxWrH;AACF;;AuD71WA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AV2xWhB;;AuDl2WA;;EAmBQ,cAAc;AvDo1WtB;;AuDv2WA;EAqBQ,W7CkDQ;AVoyWhB;;AuD32WA;EAuBQ,+B7CgDQ;AVwyWhB;;AuD/2WA;;EA0BU,W7C6CM;AV6yWhB;;AC7wWE;EsDvGF;IA6BU,yBxDhBuB;EC42W/B;AACF;;AuD13WA;;EAgCQ,+B7CuCQ;AVwzWhB;;AuD/3WA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AV+zWhB;;AuDt4WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDi2WtB;;AuD34WA;EA4CY,UAAU;AvDm2WtB;;AuD/4WA;EA+CY,yBAAwB;EACxB,UAAU;AvDo2WtB;;AuDp5WA;EAoDY,W7CmBI;AVi1WhB;;AuDx5WA;EAsDc,uCxD/De;ACq6W7B;;AuD55WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;ACq5WjC;;AuDl6WA;EAkEU,gFAAyG;AvDo2WnH;;AC30WE;EsD3FF;IAqEc,gFAAyG;EvDs2WrH;AACF;;AuD56WA;EAyEM,eAhF0B;AvDu7WhC;;ACj1WE;EsD/FF;IA6EQ,oBAnF8B;EvD27WpC;AACF;;ACv1WE;EsD/FF;IAiFQ,mBAtF4B;EvDg8WlC;AACF;;AuD57WA;EAsFM,mBAAmB;EACnB,aAAa;AvD02WnB;;AuDj8WA;EAyFQ,YAAY;EACZ,cAAc;AvD42WtB;;AuDt8WA;EA4FI,gBAAgB;AvD82WpB;;AuD18WA;EA8FI,iBAAiB;AvDg3WrB;;AuD52WA;EAEE,gBAAgB;AvD82WlB;;AuDh3WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDg3WzC;;AuDz3WA;EAYI,YAAY;AvDi3WhB;;ACp4WE;EsDOF;IAeI,aAAa;EvDm3Wf;AACF;;AuDl3WA;EACE,kBAAkB;AvDq3WpB;;AC94WE;EsDwBF;IAKM,aAAa;EvDs3WjB;EuD33WF;IAOQ,sBAAsB;EvDu3W5B;AACF;;ACn5WE;EsDoBF;IASI,aAAa;IACb,uBAAuB;EvD23WzB;EuDr4WF;ItDsDI,oBsD1CwC;EvD43W1C;AACF;;AuDz3WA;;EAEE,YAAY;EACZ,cAAc;AvD43WhB;;AuD13WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDihX/B;;ACz6WE;EsDyCF;IAKI,kBArJgC;EvDqhXlC;AACF;;AwDlhXA;EACE,oBAN2B;AxD2hX7B;;ACv6WE;EuD/GF;IAII,kBAR+B;ExD+hXjC;EwD3hXF;IAOM,oBAV8B;ExDiiXlC;EwD9hXF;IASM,mBAX4B;ExDmiXhC;AACF;;AyDniXA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzD0iXjC","file":"bulma.css"} \ No newline at end of file From 1d5d48811d484cb383272245b810e7d947a58ad6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 5 Jul 2022 21:34:44 +0200 Subject: [PATCH 115/853] =?UTF-8?q?Modifica=20la=20visualizaci=C3=B3n=20de?= =?UTF-8?q?=20iconos=20por=20temas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 6 ++-- pagetop/src/base/module/demopage.rs | 53 +--------------------------- pagetop/src/base/theme/bulmix.rs | 42 ++++++++++++++++------ pagetop/src/core/component/bundle.rs | 2 +- 4 files changed, 37 insertions(+), 66 deletions(-) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 2d6de2a1..f6553096 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -80,7 +80,7 @@ impl ComponentTrait for Anchor { target=[target] { (self.left_icon().render(context)) - (*self.html()) + span { (*self.html()) } (self.right_icon().render(context)) } } @@ -203,13 +203,13 @@ impl Anchor { pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { self.left_icon.clear(); - self.left_icon.add(icon.with_layout(LayoutProperty::MarginRight, LayoutUnit::Px(5))); + self.left_icon.add(icon); self } pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { self.right_icon.clear(); - self.right_icon.add(icon.with_layout(LayoutProperty::MarginLeft, LayoutUnit::Px(5))); + self.right_icon.add(icon); self } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index f44f6768..0e35420b 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -28,7 +28,6 @@ async fn demo() -> app::Result<Markup> { Page::new() .with_title(l("page_title").as_str()) .add_to("content", hello_world()) - .add_to("content", hello_world_original()) .add_to("content", just_visiting()) .add_to("content", about_pagetop()) .add_to("content", promo_pagetop()) @@ -68,9 +67,7 @@ fn hello_world() -> Container { .add(Anchor::button("#", html! { ("Get quote") - }).with_layout( - LayoutProperty::MarginLeft, LayoutUnit::Px(8) - ).with_left_icon( + }).with_left_icon( Icon::with("envelope-open-heart-fill") ) ) @@ -81,54 +78,6 @@ fn hello_world() -> Container { ) } -fn hello_world_original() -> Chunck { - Chunck::with(html! { - header id="header" class="header" { - div class="container" { - div class="row" { - div class="col-lg-6 col-xl-5" { - div class="text-container" { - div class="section-title" { - (t("welcome_to", &args![ - "app" => SETTINGS.app.name.as_str() - ])) - } - h1 class="h1-large" { - (l("page_title")) - } - p class="p-large" { - (e("welcome_intro", &args![ - "app" => format!( - "<strong>{}</strong>", - &SETTINGS.app.name - ) - ])) - } - p { - (e("welcome_pagetop", &args![ - "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" - ])) - } - a class="btn-solid-lg" href="#services" { - "Offered services" - } - a class="quote" href="#contact" { - i class="fas fa-paper-plane" {} - "Get quote" - } - } - } - div class="col-lg-6 col-xl-7" { - div class="image-container" { - img class="img-fluid" src="/bootsier/images/demo-header.svg" alt="alternative" {} - } - } - } - } - } - }) -} - fn just_visiting() -> Chunck { Chunck::with(html! { div id="details" class="basic-1" { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 783a63dd..f586ea07 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -35,6 +35,13 @@ impl ThemeTrait for Bulmix { _context: &mut InContext ) { match component.handler() { + ANCHOR_COMPONENT => { + let a = component_mut::<Anchor>(component); + a.alter_classes(match a.anchor_type() { + AnchorType::Button => "button is-primary", + _ => "", + }, ClassesOp::SetDefault); + }, HEADING_COMPONENT => { let h = component_mut::<Heading>(component); h.alter_classes(concat_string!("title ", match h.display() { @@ -57,22 +64,37 @@ impl ThemeTrait for Bulmix { ParagraphDisplay::Normal => "", }, ClassesOp::SetDefault); }, - ANCHOR_COMPONENT => { - let a = component_mut::<Anchor>(component); - a.alter_classes(match a.anchor_type() { - AnchorType::Button => "button is-primary", - _ => "", - }, ClassesOp::SetDefault); + grid::COLUMN_COMPONENT => { + let col = component_mut::<grid::Column>(component); + col.alter_classes("column content", ClassesOp::SetDefault); }, grid::ROW_COMPONENT => { let row = component_mut::<grid::Row>(component); row.alter_classes("columns", ClassesOp::SetDefault); }, - grid::COLUMN_COMPONENT => { - let col = component_mut::<grid::Column>(component); - col.alter_classes("column content", ClassesOp::SetDefault); - }, _ => {}, } } + + fn render_component( + &self, + component: &dyn ComponentTrait, + context: &mut InContext + ) -> Option<Markup> { + match component.handler() { + ICON_COMPONENT => { + let icon = component_ref::<Icon>(component); + context + .add_stylesheet(StyleSheet::with_source( + "/theme/icons/bootstrap-icons.css?ver=1.8.2" + )); + Some(html! { + span class="icon" { + i class=[icon.classes().get()] style=[icon.layout().get()] {}; + } + }) + }, + _ => None, + } + } } diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index f1042166..a3c88a97 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -30,7 +30,7 @@ impl ComponentsBundle { components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (super::render_component(&mut *c.write().unwrap(), context)) + (" ")(super::render_component(&mut *c.write().unwrap(), context))(" ") } } } From 743e32b0f6fb1ff0677a4d7407e1f1e5d334a1ee Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 7 Jul 2022 15:50:36 +0200 Subject: [PATCH 116/853] =?UTF-8?q?Mejora=20la=20asignaci=C3=B3n=20de=20m?= =?UTF-8?q?=C3=A1rgenes/espacios=20en=20comp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 18 +- pagetop/src/base/component/grid/column.rs | 2 +- pagetop/src/base/component/grid/row.rs | 18 +- pagetop/src/base/component/icon.rs | 18 +- pagetop/src/base/module/demopage.rs | 3 +- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/html.rs | 4 +- pagetop/src/html/layout.rs | 124 ------------ pagetop/src/html/spacing.rs | 177 ++++++++++++++++++ .../images/demo-header.svg | 0 10 files changed, 218 insertions(+), 148 deletions(-) delete mode 100644 pagetop/src/html/layout.rs create mode 100644 pagetop/src/html/spacing.rs rename pagetop/static/{bootsier => theme}/images/demo-header.svg (100%) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index f6553096..e63f6432 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -29,7 +29,7 @@ pub struct Anchor { target : AnchorTarget, id : IdentifierValue, classes : Classes, - layout : Layout, + spaces : Spaces, template : String, } @@ -46,7 +46,7 @@ impl ComponentTrait for Anchor { target : AnchorTarget::Default, id : IdentifierValue::new(), classes : Classes::new(), - layout : Layout::new(), + spaces : Spaces::new(), template : "default".to_owned(), } } @@ -75,7 +75,7 @@ impl ComponentTrait for Anchor { a id=[self.id().get()] class=[self.classes().get()] - style=[self.layout().get()] + style=[self.spaces().get()] href=[self.href().get()] target=[target] { @@ -160,8 +160,8 @@ impl Anchor { self } - pub fn with_layout(mut self, property: LayoutProperty, value: LayoutUnit) -> Self { - self.alter_layout(property, value); + pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { + self.alter_spaces(spaces); self } @@ -228,8 +228,8 @@ impl Anchor { self } - pub fn alter_layout(&mut self, property: LayoutProperty, value: LayoutUnit) -> &mut Self { - self.layout.add(property, value); + pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { + self.spaces.add(spaces); self } @@ -272,8 +272,8 @@ impl Anchor { &self.classes } - pub fn layout(&self) -> &Layout { - &self.layout + pub fn spaces(&self) -> &Spaces { + &self.spaces } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 9ff5912f..b8cb9419 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -18,7 +18,7 @@ impl ComponentTrait for Column { weight : 0, components: ComponentsBundle::new(), id : IdentifierValue::new(), - classes : Classes::new_with_default("col"), + classes : Classes::new_with_default("col-md"), template : "default".to_owned(), } } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 2ec9139f..efd544a7 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -8,6 +8,7 @@ pub struct Row { columns : ComponentsBundle, id : IdentifierValue, classes : Classes, + spaces : Spaces, template : String, } @@ -19,6 +20,7 @@ impl ComponentTrait for Row { columns : ComponentsBundle::new(), id : IdentifierValue::new(), classes : Classes::new_with_default("row"), + spaces : Spaces::new(), template : "default".to_owned(), } } @@ -37,7 +39,7 @@ impl ComponentTrait for Row { fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] { + div id=[self.id().get()] class=[self.classes().get()] style=[self.spaces().get()] { (self.columns().render(context)) } } @@ -87,6 +89,11 @@ impl Row { self } + pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { + self.alter_spaces(spaces); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -114,6 +121,11 @@ impl Row { self } + pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { + self.spaces.add(spaces); + self + } + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -129,6 +141,10 @@ impl Row { &self.classes } + pub fn spaces(&self) -> &Spaces { + &self.spaces + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 238c71e7..770d0a9d 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -6,7 +6,7 @@ pub struct Icon { renderable: fn() -> bool, weight : isize, classes : Classes, - layout : Layout, + spaces : Spaces, } impl ComponentTrait for Icon { @@ -15,7 +15,7 @@ impl ComponentTrait for Icon { renderable: render_always, weight : 0, classes : Classes::new_with_default("bi-question-circle-fill"), - layout : Layout::new(), + spaces : Spaces::new(), } } @@ -37,7 +37,7 @@ impl ComponentTrait for Icon { "/theme/icons/bootstrap-icons.css?ver=1.8.2" )); - html! { i class=[self.classes().get()] style=[self.layout().get()] {}; } + html! { i class=[self.classes().get()] style=[self.spaces().get()] {}; } } fn as_ref_any(&self) -> &dyn AnyComponent { @@ -76,8 +76,8 @@ impl Icon { self } - pub fn with_layout(mut self, property: LayoutProperty, value: LayoutUnit) -> Self { - self.alter_layout(property, value); + pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { + self.alter_spaces(spaces); self } @@ -103,8 +103,8 @@ impl Icon { self } - pub fn alter_layout(&mut self, property: LayoutProperty, value: LayoutUnit) -> &mut Self { - self.layout.add(property, value); + pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { + self.spaces.add(spaces); self } @@ -114,7 +114,7 @@ impl Icon { &self.classes } - pub fn layout(&self) -> &Layout { - &self.layout + pub fn spaces(&self) -> &Spaces { + &self.spaces } } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index 0e35420b..95a069d2 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -73,8 +73,9 @@ fn hello_world() -> Container { ) ) .add_column(grid::Column::new() - .add(Image::image("/bootsier/images/demo-header.svg")) + .add(Image::image("/theme/images/demo-header.svg")) ) + .with_spaces(&[SpaceSet::PaddingBoth(SpaceValue::RelEm(2.0), SpaceValue::RelPct(5.0))]) ) } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index f586ea07..ff2f29bc 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -90,7 +90,7 @@ impl ThemeTrait for Bulmix { )); Some(html! { span class="icon" { - i class=[icon.classes().get()] style=[icon.layout().get()] {}; + i class=[icon.classes().get()] style=[icon.spaces().get()] {}; } }) }, diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 6d586449..eb720c41 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -17,5 +17,5 @@ pub use identifier::IdentifierValue; mod classes; pub use classes::{Classes, ClassesOp}; -mod layout; -pub use layout::{Layout, LayoutProperty, LayoutUnit}; +mod spacing; +pub use spacing::{Spaces, SpaceSet, SpaceValue}; diff --git a/pagetop/src/html/layout.rs b/pagetop/src/html/layout.rs deleted file mode 100644 index ddd4a893..00000000 --- a/pagetop/src/html/layout.rs +++ /dev/null @@ -1,124 +0,0 @@ -use crate::concat_string; - -#[derive(Clone, Copy, PartialEq)] -pub enum LayoutProperty { - MarginBottom, - MarginLeft, - MarginRight, - MarginTop, - PaddingBottom, - PaddingLeft, - PaddingRight, - PaddingTop, -} - -impl std::convert::AsRef<str> for LayoutProperty { - fn as_ref(&self) -> &str { - match *self { - LayoutProperty::MarginBottom => "margin-bottom", - LayoutProperty::MarginLeft => "margin-left", - LayoutProperty::MarginRight => "margin-right", - LayoutProperty::MarginTop => "margin-top", - LayoutProperty::PaddingBottom => "padding-bottom", - LayoutProperty::PaddingLeft => "padding-left", - LayoutProperty::PaddingRight => "padding-right", - LayoutProperty::PaddingTop => "padding-top", - } - } -} - -// About pixels: Pixels (px) are relative to the viewing device. For low-dpi -// devices, 1px is one device pixel (dot) of the display. For printers and high -// resolution screens 1px implies multiple device pixels. - -// About em: 2em means 2 times the size of the current font. The em and rem -// units are practical in creating perfectly scalable layout! - -// About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. - -#[derive(PartialEq)] -pub enum LayoutUnit { - Auto, - - Cm(isize), // Centimeters. - In(isize), // Inches (1in = 96px = 2.54cm). - Mm(isize), // Millimeters. - Pc(isize), // Picas (1pc = 12pt). - Pt(isize), // Points (1pt = 1/72 of 1in). - Px(isize), // Pixels (1px = 1/96th of 1in). - - RelEm(f32), // Relative to the font-size of the element. - RelPct(f32), // Percentage relative to the parent element. - RelRem(f32), // Relative to font-size of the root element. - RelVh(f32), // Relative to 1% of the height of the viewport. - RelVw(f32), // Relative to 1% of the width of the viewport. - - UnSet, -} - -impl LayoutUnit { - fn to_inline(&self, property: LayoutProperty) -> String { - match self { - LayoutUnit::Auto => concat_string!(property, ":auto;"), - - LayoutUnit::Cm(value) => concat_string!(property, ":", value.to_string(), "cm;"), - LayoutUnit::In(value) => concat_string!(property, ":", value.to_string(), "in;"), - LayoutUnit::Mm(value) => concat_string!(property, ":", value.to_string(), "mm;"), - LayoutUnit::Pc(value) => concat_string!(property, ":", value.to_string(), "pc;"), - LayoutUnit::Pt(value) => concat_string!(property, ":", value.to_string(), "pt;"), - LayoutUnit::Px(value) => concat_string!(property, ":", value.to_string(), "px;"), - - LayoutUnit::RelEm(value) => concat_string!(property, ":", value.to_string(), "em;"), - LayoutUnit::RelPct(value) => concat_string!(property, ":", value.to_string(), "%;"), - LayoutUnit::RelRem(value) => concat_string!(property, ":", value.to_string(), "rem;"), - LayoutUnit::RelVh(value) => concat_string!(property, ":", value.to_string(), "vh;"), - LayoutUnit::RelVw(value) => concat_string!(property, ":", value.to_string(), "vw;"), - - _ => "".to_owned(), - } - } -} - -struct Style { - property: LayoutProperty, - inline : String, -} - -pub struct Layout(Vec<Style>); - -impl Layout { - pub fn new() -> Self { - Layout(Vec::new()) - } - - pub fn add(&mut self, property: LayoutProperty, value: LayoutUnit) -> &Self { - match self.0.iter().position(|s| s.property.eq(&property)) { - Some(pos) => { - self.0.remove(pos); - if value != LayoutUnit::UnSet { - self.0.insert(pos, Style { - property, - inline: value.to_inline(property), - }); - } - }, - _ => if value != LayoutUnit::UnSet { - self.0.push(Style { - property, - inline: value.to_inline(property), - }); - } - } - self - } - - pub fn get(&self) -> Option<String> { - if self.0.len() == 0 { - None - } else { - let mut inline = "".to_owned(); - self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); - Some(inline) - } - } -} diff --git a/pagetop/src/html/spacing.rs b/pagetop/src/html/spacing.rs new file mode 100644 index 00000000..a3d138c0 --- /dev/null +++ b/pagetop/src/html/spacing.rs @@ -0,0 +1,177 @@ +use crate::concat_string; + +const MARGIN_BOTTOM: &str = "margin-bottom"; +const MARGIN_LEFT: &str = "margin-left"; +const MARGIN_RIGHT: &str = "margin-right"; +const MARGIN_TOP: &str = "margin-top"; + +const PADDING_BOTTOM: &str = "padding-bottom"; +const PADDING_LEFT: &str = "padding-left"; +const PADDING_RIGHT: &str = "padding-right"; +const PADDING_TOP: &str = "padding-top"; + +struct SpaceStyle { + property: String, + inline : String, +} + +pub struct Spaces(Vec<SpaceStyle>); + +// About pixels: Pixels (px) are relative to the viewing device. For low-dpi +// devices, 1px is one device pixel (dot) of the display. For printers and high +// resolution screens 1px implies multiple device pixels. + +// About em: 2em means 2 times the size of the current font. The em and rem +// units are practical in creating perfectly scalable layout! + +// About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. + +pub enum SpaceValue { + Auto, + + Cm(isize), // Centimeters. + In(isize), // Inches (1in = 96px = 2.54cm). + Mm(isize), // Millimeters. + Pc(isize), // Picas (1pc = 12pt). + Pt(isize), // Points (1pt = 1/72 of 1in). + Px(isize), // Pixels (1px = 1/96th of 1in). + + RelEm(f32), // Relative to the font-size of the element. + RelPct(f32), // Percentage relative to the parent element. + RelRem(f32), // Relative to font-size of the root element. + RelVh(f32), // Relative to 1% of the height of the viewport. + RelVw(f32), // Relative to 1% of the value of the viewport. + + UnSet, +} + +impl SpaceValue { + fn add(&self, property: &str, into_spaces: &mut Spaces) { + let style = SpaceStyle { + property: property.to_owned(), + inline : match self { + SpaceValue::Auto => concat_string!(property, ":auto;"), + // Absolute value. + SpaceValue::Cm(aw) => concat_string!(property, ":", aw.to_string(), "cm;"), + SpaceValue::In(aw) => concat_string!(property, ":", aw.to_string(), "in;"), + SpaceValue::Mm(aw) => concat_string!(property, ":", aw.to_string(), "mm;"), + SpaceValue::Pc(aw) => concat_string!(property, ":", aw.to_string(), "pc;"), + SpaceValue::Pt(aw) => concat_string!(property, ":", aw.to_string(), "pt;"), + SpaceValue::Px(aw) => concat_string!(property, ":", aw.to_string(), "px;"), + // Relative value. + SpaceValue::RelEm(rw) => concat_string!(property, ":", rw.to_string(), "em;"), + SpaceValue::RelPct(rw) => concat_string!(property, ":", rw.to_string(), "%;"), + SpaceValue::RelRem(rw) => concat_string!(property, ":", rw.to_string(), "rem;"), + SpaceValue::RelVh(rw) => concat_string!(property, ":", rw.to_string(), "vh;"), + SpaceValue::RelVw(rw) => concat_string!(property, ":", rw.to_string(), "vw;"), + + _ => "".to_owned(), + } + }; + match into_spaces.0.iter().position(|s| s.property.eq(&style.property)) { + Some(pos) => { + into_spaces.0.remove(pos); + if !style.inline.is_empty() { + into_spaces.0.insert(pos, style); + } + }, + _ => if !style.inline.is_empty() { + into_spaces.0.push(style) + } + } + } +} + +pub enum SpaceSet { + Margin(SpaceValue, SpaceValue, SpaceValue, SpaceValue), + MarginAll(SpaceValue), + MarginBoth(SpaceValue, SpaceValue), + MarginBottom(SpaceValue), + MarginLeft(SpaceValue), + MarginRight(SpaceValue), + MarginTop(SpaceValue), + Padding(SpaceValue, SpaceValue, SpaceValue, SpaceValue), + PaddingAll(SpaceValue), + PaddingBoth(SpaceValue, SpaceValue), + PaddingBottom(SpaceValue), + PaddingLeft(SpaceValue), + PaddingRight(SpaceValue), + PaddingTop(SpaceValue), +} + +impl SpaceSet { + fn add(&self, into_spaces: &mut Spaces) { + match self { + SpaceSet::Margin(top, right, bottom, left) => { + top.add(MARGIN_TOP, into_spaces); + right.add(MARGIN_RIGHT, into_spaces); + bottom.add(MARGIN_BOTTOM, into_spaces); + left.add(MARGIN_LEFT, into_spaces); + }, + SpaceSet::MarginAll(value) => { + value.add(MARGIN_TOP, into_spaces); + value.add(MARGIN_RIGHT, into_spaces); + value.add(MARGIN_BOTTOM, into_spaces); + value.add(MARGIN_LEFT, into_spaces); + }, + SpaceSet::MarginBoth(top_bottom, right_left) => { + top_bottom.add(MARGIN_TOP, into_spaces); + right_left.add(MARGIN_RIGHT, into_spaces); + top_bottom.add(MARGIN_BOTTOM, into_spaces); + right_left.add(MARGIN_LEFT, into_spaces); + }, + + SpaceSet::MarginBottom(value) => value.add(MARGIN_BOTTOM, into_spaces), + SpaceSet::MarginLeft(value) => value.add(MARGIN_LEFT, into_spaces), + SpaceSet::MarginRight(value) => value.add(MARGIN_RIGHT, into_spaces), + SpaceSet::MarginTop(value) => value.add(MARGIN_TOP, into_spaces), + + SpaceSet::Padding(top, right, bottom, left) => { + top.add(PADDING_TOP, into_spaces); + right.add(PADDING_RIGHT, into_spaces); + bottom.add(PADDING_BOTTOM, into_spaces); + left.add(PADDING_LEFT, into_spaces); + }, + SpaceSet::PaddingAll(value) => { + value.add(PADDING_TOP, into_spaces); + value.add(PADDING_RIGHT, into_spaces); + value.add(PADDING_BOTTOM, into_spaces); + value.add(PADDING_LEFT, into_spaces); + }, + SpaceSet::PaddingBoth(top_bottom, right_left) => { + top_bottom.add(PADDING_TOP, into_spaces); + right_left.add(PADDING_RIGHT, into_spaces); + top_bottom.add(PADDING_BOTTOM, into_spaces); + right_left.add(PADDING_LEFT, into_spaces); + }, + + SpaceSet::PaddingBottom(value) => value.add(PADDING_BOTTOM, into_spaces), + SpaceSet::PaddingLeft(value) => value.add(PADDING_LEFT, into_spaces), + SpaceSet::PaddingRight(value) => value.add(PADDING_RIGHT, into_spaces), + SpaceSet::PaddingTop(value) => value.add(PADDING_TOP, into_spaces), + } + } +} + +impl Spaces { + pub fn new() -> Self { + Spaces(Vec::new()) + } + + pub fn add(&mut self, spaces: &[SpaceSet]) -> &Self { + for i in 0..spaces.len() { + spaces[i].add(self); + } + self + } + + pub fn get(&self) -> Option<String> { + if self.0.len() == 0 { + None + } else { + let mut inline = "".to_owned(); + self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); + Some(inline) + } + } +} diff --git a/pagetop/static/bootsier/images/demo-header.svg b/pagetop/static/theme/images/demo-header.svg similarity index 100% rename from pagetop/static/bootsier/images/demo-header.svg rename to pagetop/static/theme/images/demo-header.svg From 88a59780c30e5618bae452573927e695f95f7709 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 8 Jul 2022 01:21:33 +0200 Subject: [PATCH 117/853] =?UTF-8?q?Mejora=20disposici=C3=B3n=20de=20propie?= =?UTF-8?q?dades=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 52 ++++---- pagetop-user/src/lib.rs | 8 +- pagetop/src/base/component/anchor.rs | 96 +++++++-------- pagetop/src/base/component/block.rs | 61 +++++----- pagetop/src/base/component/container.rs | 73 +++++------ pagetop/src/base/component/form/button.rs | 32 ++--- pagetop/src/base/component/form/date.rs | 32 ++--- pagetop/src/base/component/form/form.rs | 77 ++++++------ pagetop/src/base/component/form/input.rs | 32 ++--- pagetop/src/base/component/grid.rs | 2 +- pagetop/src/base/component/grid/column.rs | 97 ++++++++++++--- pagetop/src/base/component/grid/row.rs | 33 ++--- pagetop/src/base/component/heading.rs | 114 +++++++++--------- pagetop/src/base/component/icon.rs | 20 ++- pagetop/src/base/component/image.rs | 32 ++--- pagetop/src/base/component/menu.rs | 31 +++-- pagetop/src/base/component/paragraph.rs | 64 +++++----- pagetop/src/base/module/demopage.rs | 114 ++++++++---------- pagetop/src/base/theme/bulmix.rs | 22 +++- pagetop/src/core/component/definition.rs | 15 ++- .../images/demo-visiting.svg | 0 21 files changed, 554 insertions(+), 453 deletions(-) rename pagetop/static/{bootsier => theme}/images/demo-visiting.svg (100%) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index f254714f..77a192b3 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -3,34 +3,34 @@ use super::l; pub async fn summary() -> app::Result<Markup> { let top_menu = Menu::new() - .add(MenuItem::label(l("module_name").as_str())) - .add(MenuItem::link("Opción 2", "https://www.google.es")) - .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .add(MenuItem::submenu("Submenú 1", Menu::new() - .add(MenuItem::label("Opción 1")) - .add(MenuItem::label("Opción 2")) + .with_item(MenuItem::label(l("module_name").as_str())) + .with_item(MenuItem::link("Opción 2", "https://www.google.es")) + .with_item(MenuItem::link_blank("Opción 3", "https://www.google.es")) + .with_item(MenuItem::submenu("Submenú 1", Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")) )) - .add(MenuItem::separator()) - .add(MenuItem::submenu("Submenú 2", Menu::new() - .add(MenuItem::label("Opción 1")) - .add(MenuItem::label("Opción 2")) + .with_item(MenuItem::separator()) + .with_item(MenuItem::submenu("Submenú 2", Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")) )) - .add(MenuItem::label("Opción 4")); + .with_item(MenuItem::label("Opción 4")); let side_menu = Menu::new() - .add(MenuItem::label("Opción 1")) - .add(MenuItem::link("Opción 2", "https://www.google.es")) - .add(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .add(MenuItem::submenu("Submenú 1", Menu::new() - .add(MenuItem::label("Opción 1")) - .add(MenuItem::label("Opción 2")) + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::link("Opción 2", "https://www.google.es")) + .with_item(MenuItem::link_blank("Opción 3", "https://www.google.es")) + .with_item(MenuItem::submenu("Submenú 1", Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")) )) - .add(MenuItem::separator()) - .add(MenuItem::submenu("Submenú 2", Menu::new() - .add(MenuItem::label("Opción 1")) - .add(MenuItem::label("Opción 2")) + .with_item(MenuItem::separator()) + .with_item(MenuItem::submenu("Submenú 2", Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")) )) - .add(MenuItem::label("Opción 4")); + .with_item(MenuItem::label("Opción 4")); Page::new() @@ -41,11 +41,11 @@ pub async fn summary() -> app::Result<Markup> { .add_to("top-menu", top_menu) .add_to("content", grid::Row::new() - .add_column(grid::Column::new() - .add(side_menu) + .with_column(grid::Column::new() + .with_component(side_menu) ) - .add_column(grid::Column::new() - .add(Chunck::with(html! { + .with_column(grid::Column::new() + .with_component(Chunck::with(html! { p { "Columna 2"} })) ) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 8003e707..f1515419 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -42,7 +42,7 @@ async fn login() -> app::Result<Markup> { ) .add_to("content", Container::new() .with_id("welcome") - .add(form_login()) + .with_component(form_login()) ) .render() } @@ -50,7 +50,7 @@ async fn login() -> app::Result<Markup> { fn form_login() -> Form { Form::new() .with_id("user-login") - .add(form::Input::textfield() + .with_element(form::Input::textfield() .with_name("name") .with_label(l("username").as_str()) .with_help_text(t("username_help", &args![ @@ -58,10 +58,10 @@ fn form_login() -> Form { ]).as_str()) .with_autofocus(true) ) - .add(form::Input::password() + .with_element(form::Input::password() .with_name("pass") .with_label(l("password").as_str()) .with_help_text(l("password_help").as_str()) ) - .add(form::Button::submit(l("login").as_str())) + .with_element(form::Button::submit(l("login").as_str())) } diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index e63f6432..5bae4ef2 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -21,15 +21,15 @@ pub type AnchorIcon = ComponentsBundle; pub struct Anchor { renderable : fn() -> bool, weight : isize, + id : IdentifierValue, + classes : Classes, + spaces : Spaces, anchor_type: AnchorType, href : AttributeValue, html : Markup, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, - id : IdentifierValue, - classes : Classes, - spaces : Spaces, template : String, } @@ -38,15 +38,15 @@ impl ComponentTrait for Anchor { Anchor { renderable : render_always, weight : 0, + id : IdentifierValue::new(), + classes : Classes::new(), + spaces : Spaces::new(), anchor_type: AnchorType::Link, href : AttributeValue::new(), html : html! {}, left_icon : AnchorIcon::new(), right_icon : AnchorIcon::new(), target : AnchorTarget::Default, - id : IdentifierValue::new(), - classes : Classes::new(), - spaces : Spaces::new(), template : "default".to_owned(), } } @@ -120,6 +120,21 @@ impl Anchor { self } + pub fn with_id(mut self, id: &str) -> Self { + self.alter_id(id); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { + self.alter_spaces(spaces); + self + } + pub fn with_type(mut self, anchor_type: AnchorType) -> Self { self.alter_type(anchor_type); self @@ -150,21 +165,6 @@ impl Anchor { self } - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); - self - } - - pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { - self.alter_spaces(spaces); - self - } - pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -182,6 +182,21 @@ impl Anchor { self } + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { + self.spaces.add(spaces); + self + } + pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { self.anchor_type = anchor_type; self.classes.alter(match self.anchor_type { @@ -218,21 +233,6 @@ impl Anchor { self } - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); - self - } - - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); - self - } - - pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { - self.spaces.add(spaces); - self - } - pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -240,6 +240,18 @@ impl Anchor { // Anchor GETTERS. + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn spaces(&self) -> &Spaces { + &self.spaces + } + pub fn anchor_type(&self) -> &AnchorType { &self.anchor_type } @@ -264,18 +276,6 @@ impl Anchor { &self.target } - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn spaces(&self) -> &Spaces { - &self.spaces - } - pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index f78c19f2..6120af0b 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -5,10 +5,10 @@ pub const BLOCK_COMPONENT: &str = "pagetop::component::block"; pub struct Block { renderable: fn() -> bool, weight : isize, - components: ComponentsBundle, - title : AttributeValue, id : IdentifierValue, classes : Classes, + title : AttributeValue, + components: ComponentsBundle, template : String, } @@ -17,10 +17,10 @@ impl ComponentTrait for Block { Block { renderable: render_always, weight : 0, - components: ComponentsBundle::new(), - title : AttributeValue::new(), id : IdentifierValue::new(), classes : Classes::new_with_default("block"), + title : AttributeValue::new(), + components: ComponentsBundle::new(), template : "default".to_owned(), } } @@ -63,17 +63,6 @@ impl ComponentTrait for Block { impl Block { - // Block CONTAINER. - - pub fn add(mut self, component: impl ComponentTrait) -> Self { - self.components.add(component); - self - } - - pub fn components(&self) -> &ComponentsBundle { - &self.components - } - // Block BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { @@ -86,11 +75,6 @@ impl Block { self } - pub fn with_title(mut self, title: &str) -> Self { - self.alter_title(title); - self - } - pub fn with_id(mut self, id: &str) -> Self { self.alter_id(id); self @@ -101,6 +85,16 @@ impl Block { self } + pub fn with_title(mut self, title: &str) -> Self { + self.alter_title(title); + self + } + + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.alter_component(component); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -118,11 +112,6 @@ impl Block { self } - pub fn alter_title(&mut self, title: &str) -> &mut Self { - self.title.with_value(title); - self - } - pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.with_value(id); self @@ -133,6 +122,16 @@ impl Block { self } + pub fn alter_title(&mut self, title: &str) -> &mut Self { + self.title.with_value(title); + self + } + + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); + self + } + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -140,10 +139,6 @@ impl Block { // Block GETTERS. - pub fn title(&self) -> &AttributeValue { - &self.title - } - pub fn id(&self) -> &IdentifierValue { &self.id } @@ -152,6 +147,14 @@ impl Block { &self.classes } + pub fn title(&self) -> &AttributeValue { + &self.title + } + + pub fn components(&self) -> &ComponentsBundle { + &self.components + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index d5d2eec7..013f7294 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -5,27 +5,27 @@ pub const CONTAINER_COMPONENT: &str = "pagetop::component::container"; pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { - renderable : fn() -> bool, - weight : isize, - components : ComponentsBundle, - container : ContainerType, - id : IdentifierValue, - classes : Classes, - inner_classes: Classes, - template : String, + renderable : fn() -> bool, + weight : isize, + id : IdentifierValue, + classes : Classes, + inner_classes : Classes, + container_type: ContainerType, + components : ComponentsBundle, + template : String, } impl ComponentTrait for Container { fn new() -> Self { Container { - renderable : render_always, - weight : 0, - components : ComponentsBundle::new(), - container : ContainerType::Wrapper, - id : IdentifierValue::new(), - classes : Classes::new_with_default("container"), - inner_classes: Classes::new_with_default("container"), - template : "default".to_owned(), + renderable : render_always, + weight : 0, + id : IdentifierValue::new(), + classes : Classes::new_with_default("container"), + inner_classes : Classes::new_with_default("container"), + container_type: ContainerType::Wrapper, + components : ComponentsBundle::new(), + template : "default".to_owned(), } } @@ -91,39 +91,28 @@ impl ComponentTrait for Container { impl Container { pub fn header() -> Self { let mut c = Container::new().with_classes("header", ClassesOp::SetDefault); - c.container = ContainerType::Header; + c.container_type = ContainerType::Header; c } pub fn footer() -> Self { let mut c = Container::new().with_classes("footer", ClassesOp::SetDefault); - c.container = ContainerType::Footer; + c.container_type = ContainerType::Footer; c } pub fn main() -> Self { let mut c = Container::new().with_classes("main", ClassesOp::SetDefault); - c.container = ContainerType::Main; + c.container_type = ContainerType::Main; c } pub fn section() -> Self { let mut c = Container::new().with_classes("section", ClassesOp::SetDefault); - c.container = ContainerType::Section; + c.container_type = ContainerType::Section; c } - // Container CONTAINER. - - pub fn add(mut self, component: impl ComponentTrait) -> Self { - self.components.add(component); - self - } - - pub fn components(&self) -> &ComponentsBundle { - &self.components - } - // Container BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { @@ -151,6 +140,11 @@ impl Container { self } + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.alter_component(component); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -183,6 +177,11 @@ impl Container { self } + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); + self + } + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -190,10 +189,6 @@ impl Container { // Container GETTERS. - pub fn container_type(&self) -> &ContainerType { - &self.container - } - pub fn id(&self) -> &IdentifierValue { &self.id } @@ -206,6 +201,14 @@ impl Container { &self.inner_classes } + pub fn container_type(&self) -> &ContainerType { + &self.container_type + } + + pub fn components(&self) -> &ComponentsBundle { + &self.components + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 9accd1c4..a03a0e45 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -7,12 +7,12 @@ pub enum ButtonType {Button, Reset, Submit} pub struct Button { renderable : fn() -> bool, weight : isize, + classes : Classes, button_type: ButtonType, name : AttributeValue, value : AttributeValue, autofocus : AttributeValue, disabled : AttributeValue, - classes : Classes, template : String, } @@ -21,12 +21,12 @@ impl ComponentTrait for Button { Button { renderable : render_always, weight : 0, + classes : Classes::new_with_default("btn btn-primary"), button_type: ButtonType::Button, name : AttributeValue::new(), value : AttributeValue::new(), autofocus : AttributeValue::new(), disabled : AttributeValue::new(), - classes : Classes::new_with_default("btn btn-primary"), template : "default".to_owned(), } .with_classes("form-button", ClassesOp::AddFirst) @@ -114,6 +114,11 @@ impl Button { self } + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + pub fn with_name(mut self, name: &str) -> Self { self.alter_name(name); self @@ -134,11 +139,6 @@ impl Button { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); - self - } - pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -156,6 +156,11 @@ impl Button { self } + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.with_value(name); self @@ -182,11 +187,6 @@ impl Button { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); - self - } - pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -194,6 +194,10 @@ impl Button { // Button GETTERS. + pub fn classes(&self) -> &Classes { + &self.classes + } + pub fn button_type(&self) -> &ButtonType { &self.button_type } @@ -214,10 +218,6 @@ impl Button { &self.disabled } - pub fn classes(&self) -> &Classes { - &self.classes - } - pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 611e4578..a008ca97 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -5,6 +5,7 @@ pub const DATE_COMPONENT: &str = "pagetop::component::form::date"; pub struct Date { renderable : fn() -> bool, weight : isize, + classes : Classes, name : AttributeValue, value : AttributeValue, label : AttributeValue, @@ -15,7 +16,6 @@ pub struct Date { readonly : AttributeValue, required : AttributeValue, help_text : AttributeValue, - classes : Classes, template : String, } @@ -24,6 +24,7 @@ impl ComponentTrait for Date { Date { renderable : render_always, weight : 0, + classes : Classes::new_with_default("form-item"), name : AttributeValue::new(), value : AttributeValue::new(), label : AttributeValue::new(), @@ -34,7 +35,6 @@ impl ComponentTrait for Date { readonly : AttributeValue::new(), required : AttributeValue::new(), help_text : AttributeValue::new(), - classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } .with_classes("form-type-date", ClassesOp::AddFirst) @@ -114,6 +114,11 @@ impl Date { self } + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + pub fn with_name(mut self, name: &str) -> Self { self.alter_name(name); self @@ -164,11 +169,6 @@ impl Date { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); - self - } - pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -186,6 +186,11 @@ impl Date { self } + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.with_value(name); self @@ -251,11 +256,6 @@ impl Date { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); - self - } - pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -263,6 +263,10 @@ impl Date { // Date GETTERS. + pub fn classes(&self) -> &Classes { + &self.classes + } + pub fn name(&self) -> &AttributeValue { &self.name } @@ -303,10 +307,6 @@ impl Date { &self.help_text } - pub fn classes(&self) -> &Classes { - &self.classes - } - pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index a062f5ba..363096ab 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -7,12 +7,12 @@ pub enum FormMethod {Get, Post} pub struct Form { renderable: fn() -> bool, weight : isize, - elements : ComponentsBundle, + id : IdentifierValue, + classes : Classes, action : AttributeValue, charset : AttributeValue, method : FormMethod, - id : IdentifierValue, - classes : Classes, + elements : ComponentsBundle, template : String, } @@ -21,12 +21,12 @@ impl ComponentTrait for Form { Form { renderable: render_always, weight : 0, - elements : ComponentsBundle::new(), + id : IdentifierValue::new(), + classes : Classes::new_with_default("form"), action : AttributeValue::new(), charset : AttributeValue::new_with_value("UTF-8"), method : FormMethod::Post, - id : IdentifierValue::new(), - classes : Classes::new_with_default("form"), + elements : ComponentsBundle::new(), template : "default".to_owned(), } } @@ -72,17 +72,6 @@ impl ComponentTrait for Form { impl Form { - // Form CONTAINER. - - pub fn add(mut self, element: impl ComponentTrait) -> Self { - self.elements.add(element); - self - } - - pub fn elements(&self) -> &ComponentsBundle { - &self.elements - } - // Form BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { @@ -95,6 +84,16 @@ impl Form { self } + pub fn with_id(mut self, id: &str) -> Self { + self.alter_id(id); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + pub fn with_action(mut self, action: &str) -> Self { self.alter_action(action); self @@ -110,13 +109,8 @@ impl Form { self } - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_element(mut self, element: impl ComponentTrait) -> Self { + self.alter_element(element); self } @@ -137,6 +131,16 @@ impl Form { self } + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + pub fn alter_action(&mut self, action: &str) -> &mut Self { self.action.with_value(action); self @@ -152,13 +156,8 @@ impl Form { self } - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); - self - } - - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_element(&mut self, element: impl ComponentTrait) -> &mut Self { + self.elements.add(element); self } @@ -169,6 +168,14 @@ impl Form { // Form GETTERS. + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + pub fn action(&self) -> &AttributeValue { &self.action } @@ -181,12 +188,8 @@ impl Form { &self.method } - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes + pub fn elements(&self) -> &ComponentsBundle { + &self.elements } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 9ffa98c7..df2789ff 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -7,6 +7,7 @@ pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} pub struct Input { renderable : fn() -> bool, weight : isize, + classes : Classes, input_type : InputType, name : IdentifierValue, value : AttributeValue, @@ -21,7 +22,6 @@ pub struct Input { readonly : AttributeValue, required : AttributeValue, help_text : AttributeValue, - classes : Classes, template : String, } @@ -30,6 +30,7 @@ impl ComponentTrait for Input { Input { renderable : render_always, weight : 0, + classes : Classes::new_with_default("form-item"), input_type : InputType::Textfield, name : IdentifierValue::new(), value : AttributeValue::new(), @@ -44,7 +45,6 @@ impl ComponentTrait for Input { readonly : AttributeValue::new(), required : AttributeValue::new(), help_text : AttributeValue::new(), - classes : Classes::new_with_default("form-item"), template : "default".to_owned(), } .with_classes("form-type-textfield", ClassesOp::AddFirst) @@ -173,6 +173,11 @@ impl Input { self } + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + pub fn with_name(mut self, name: &str) -> Self { self.alter_name(name); self @@ -238,11 +243,6 @@ impl Input { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); - self - } - pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -260,6 +260,11 @@ impl Input { self } + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.with_value(name); self.alter_classes( @@ -344,11 +349,6 @@ impl Input { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); - self - } - pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -356,6 +356,10 @@ impl Input { // Input GETTERS. + pub fn classes(&self) -> &Classes { + &self.classes + } + pub fn input_type(&self) -> &InputType { &self.input_type } @@ -412,10 +416,6 @@ impl Input { &self.help_text } - pub fn classes(&self) -> &Classes { - &self.classes - } - pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/grid.rs b/pagetop/src/base/component/grid.rs index 4fd8936b..af88db55 100644 --- a/pagetop/src/base/component/grid.rs +++ b/pagetop/src/base/component/grid.rs @@ -4,5 +4,5 @@ pub use row::{ }; mod column; pub use column::{ - COLUMN_COMPONENT, Column + COLUMN_COMPONENT, Column, ColumnSize }; diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index b8cb9419..bca2e516 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -2,12 +2,29 @@ use crate::prelude::*; pub const COLUMN_COMPONENT: &str = "pagetop::component::grid::column"; +pub enum ColumnSize { + Default, + Is1of12, + Is2of12, + Is3of12, + Is4of12, + Is5of12, + Is6of12, + Is7of12, + Is8of12, + Is9of12, + Is10of12, + Is11of12, + IsFull, +} pub struct Column { renderable: fn() -> bool, weight : isize, - components: ComponentsBundle, id : IdentifierValue, classes : Classes, + spaces : Spaces, + size : ColumnSize, + components: ComponentsBundle, template : String, } @@ -16,9 +33,11 @@ impl ComponentTrait for Column { Column { renderable: render_always, weight : 0, - components: ComponentsBundle::new(), id : IdentifierValue::new(), - classes : Classes::new_with_default("col-md"), + classes : Classes::new(), + spaces : Spaces::new(), + size : ColumnSize::Default, + components: ComponentsBundle::new(), template : "default".to_owned(), } } @@ -35,9 +54,27 @@ impl ComponentTrait for Column { self.weight } + fn before_render(&mut self, _context: &mut InContext) { + match self.size() { + ColumnSize::Default => self.alter_classes("col-sm", ClassesOp::SetDefault), + ColumnSize::Is1of12 => self.alter_classes("col-sm-1", ClassesOp::SetDefault), + ColumnSize::Is2of12 => self.alter_classes("col-sm-2", ClassesOp::SetDefault), + ColumnSize::Is3of12 => self.alter_classes("col-sm-3", ClassesOp::SetDefault), + ColumnSize::Is4of12 => self.alter_classes("col-sm-4", ClassesOp::SetDefault), + ColumnSize::Is5of12 => self.alter_classes("col-sm-5", ClassesOp::SetDefault), + ColumnSize::Is6of12 => self.alter_classes("col-sm-6", ClassesOp::SetDefault), + ColumnSize::Is7of12 => self.alter_classes("col-sm-7", ClassesOp::SetDefault), + ColumnSize::Is8of12 => self.alter_classes("col-sm-8", ClassesOp::SetDefault), + ColumnSize::Is9of12 => self.alter_classes("col-sm-9", ClassesOp::SetDefault), + ColumnSize::Is10of12 => self.alter_classes("col-sm-10", ClassesOp::SetDefault), + ColumnSize::Is11of12 => self.alter_classes("col-sm-11", ClassesOp::SetDefault), + ColumnSize::IsFull => self.alter_classes("col-sm-12", ClassesOp::SetDefault), + }; + } + fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] { + div id=[self.id().get()] class=[self.classes().get()] style=[self.spaces().get()] { (self.components().render(context)) } } @@ -54,17 +91,6 @@ impl ComponentTrait for Column { impl Column { - // Column CONTAINER. - - pub fn add(mut self, component: impl ComponentTrait) -> Self { - self.components.add(component); - self - } - - pub fn components(&self) -> &ComponentsBundle { - &self.components - } - // Column BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { @@ -87,6 +113,21 @@ impl Column { self } + pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { + self.alter_spaces(spaces); + self + } + + pub fn with_size(mut self, size: ColumnSize) -> Self { + self.alter_size(size); + self + } + + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.alter_component(component); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -114,6 +155,20 @@ impl Column { self } + pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { + self.spaces.add(spaces); + self + } + + pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { + self.size = size; + self + } + + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); + self + } pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -129,6 +184,18 @@ impl Column { &self.classes } + pub fn spaces(&self) -> &Spaces { + &self.spaces + } + + pub fn size(&self) -> &ColumnSize { + &self.size + } + + pub fn components(&self) -> &ComponentsBundle { + &self.components + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index efd544a7..65f72c5f 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -5,10 +5,10 @@ pub const ROW_COMPONENT: &str = "pagetop::component::grid::row"; pub struct Row { renderable: fn() -> bool, weight : isize, - columns : ComponentsBundle, id : IdentifierValue, classes : Classes, - spaces : Spaces, + spaces : Spaces, + columns : ComponentsBundle, template : String, } @@ -17,10 +17,10 @@ impl ComponentTrait for Row { Row { renderable: render_always, weight : 0, - columns : ComponentsBundle::new(), id : IdentifierValue::new(), classes : Classes::new_with_default("row"), - spaces : Spaces::new(), + spaces : Spaces::new(), + columns : ComponentsBundle::new(), template : "default".to_owned(), } } @@ -56,17 +56,6 @@ impl ComponentTrait for Row { impl Row { - // Row CONTAINER. - - pub fn add_column(mut self, column: grid::Column) -> Self { - self.columns.add(column); - self - } - - pub fn columns(&self) -> &ComponentsBundle { - &self.columns - } - // Row BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { @@ -94,6 +83,11 @@ impl Row { self } + pub fn with_column(mut self, column: grid::Column) -> Self { + self.alter_column(column); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -126,6 +120,11 @@ impl Row { self } + pub fn alter_column(&mut self, column: grid::Column) -> &mut Self { + self.columns.add(column); + self + } + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -145,6 +144,10 @@ impl Row { &self.spaces } + pub fn columns(&self) -> &ComponentsBundle { + &self.columns + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 81cea936..647ca6d2 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -14,27 +14,27 @@ pub enum HeadingDisplay { } pub struct Heading { - renderable: fn() -> bool, - weight : isize, - heading : HeadingType, - html : Markup, - display : HeadingDisplay, - id : IdentifierValue, - classes : Classes, - template : String, + renderable : fn() -> bool, + weight : isize, + id : IdentifierValue, + classes : Classes, + heading_type: HeadingType, + html : Markup, + display : HeadingDisplay, + template : String, } impl ComponentTrait for Heading { fn new() -> Self { Heading { - renderable: render_always, - weight : 0, - heading : HeadingType::H1, - html : html! {}, - display : HeadingDisplay::Normal, - id : IdentifierValue::new(), - classes : Classes::new(), - template : "default".to_owned(), + renderable : render_always, + weight : 0, + id : IdentifierValue::new(), + classes : Classes::new(), + heading_type: HeadingType::H1, + html : html! {}, + display : HeadingDisplay::Normal, + template : "default".to_owned(), } } @@ -53,7 +53,7 @@ impl ComponentTrait for Heading { fn default_render(&self, _: &mut InContext) -> Markup { let id = self.id().get(); let classes = self.classes().get(); - html! { @match &self.heading() { + html! { @match &self.heading_type() { HeadingType::H1 => h1 id=[id] class=[classes] { (*self.html()) }, HeadingType::H2 => h2 id=[id] class=[classes] { (*self.html()) }, HeadingType::H3 => h3 id=[id] class=[classes] { (*self.html()) }, @@ -74,27 +74,27 @@ impl ComponentTrait for Heading { impl Heading { pub fn h1(html: Markup) -> Self { - Heading::new().with_heading(HeadingType::H1).with_html(html) + Heading::new().with_heading_type(HeadingType::H1).with_html(html) } pub fn h2(html: Markup) -> Self { - Heading::new().with_heading(HeadingType::H2).with_html(html) + Heading::new().with_heading_type(HeadingType::H2).with_html(html) } pub fn h3(html: Markup) -> Self { - Heading::new().with_heading(HeadingType::H3).with_html(html) + Heading::new().with_heading_type(HeadingType::H3).with_html(html) } pub fn h4(html: Markup) -> Self { - Heading::new().with_heading(HeadingType::H4).with_html(html) + Heading::new().with_heading_type(HeadingType::H4).with_html(html) } pub fn h5(html: Markup) -> Self { - Heading::new().with_heading(HeadingType::H5).with_html(html) + Heading::new().with_heading_type(HeadingType::H5).with_html(html) } pub fn h6(html: Markup) -> Self { - Heading::new().with_heading(HeadingType::H6).with_html(html) + Heading::new().with_heading_type(HeadingType::H6).with_html(html) } // Heading BUILDER. @@ -109,8 +109,18 @@ impl Heading { self } - pub fn with_heading(mut self, heading: HeadingType) -> Self { - self.alter_heading(heading); + pub fn with_id(mut self, id: &str) -> Self { + self.alter_id(id); + self + } + + pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { + self.alter_classes(classes, op); + self + } + + pub fn with_heading_type(mut self, heading_type: HeadingType) -> Self { + self.alter_heading_type(heading_type); self } @@ -124,16 +134,6 @@ impl Heading { self } - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); - self - } - pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -151,8 +151,18 @@ impl Heading { self } - pub fn alter_heading(&mut self, heading: HeadingType) -> &mut Self { - self.heading = heading; + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + + pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { + self.heading_type = heading_type; self } @@ -174,16 +184,6 @@ impl Heading { self } - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); - self - } - - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); - self - } - pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -191,8 +191,16 @@ impl Heading { // Paragraph GETTERS. - pub fn heading(&self) -> &HeadingType { - &self.heading + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn heading_type(&self) -> &HeadingType { + &self.heading_type } pub fn html(&self) -> &Markup { @@ -203,14 +211,6 @@ impl Heading { &self.display } - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 770d0a9d..1237ccc3 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -5,8 +5,9 @@ pub const ICON_COMPONENT: &str = "pagetop::component::icon"; pub struct Icon { renderable: fn() -> bool, weight : isize, + icon_name : String, classes : Classes, - spaces : Spaces, + spaces : Spaces, } impl ComponentTrait for Icon { @@ -14,8 +15,9 @@ impl ComponentTrait for Icon { Icon { renderable: render_always, weight : 0, - classes : Classes::new_with_default("bi-question-circle-fill"), - spaces : Spaces::new(), + icon_name : "question-circle-fill".to_owned(), + classes : Classes::new(), + spaces : Spaces::new(), } } @@ -31,12 +33,16 @@ impl ComponentTrait for Icon { self.weight } - fn default_render(&self, context: &mut InContext) -> Markup { + fn before_render(&mut self, context: &mut InContext) { context .add_stylesheet(StyleSheet::with_source( "/theme/icons/bootstrap-icons.css?ver=1.8.2" )); + self.alter_classes(concat_string!("bi-", self.icon_name()).as_str(), ClassesOp::SetDefault); + } + + fn default_render(&self, _context: &mut InContext) -> Markup { html! { i class=[self.classes().get()] style=[self.spaces().get()] {}; } } @@ -94,7 +100,7 @@ impl Icon { } pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { - self.classes.alter(concat_string!("bi-", name).as_str(), ClassesOp::SetDefault); + self.icon_name = name.to_owned(); self } @@ -110,6 +116,10 @@ impl Icon { // Icon GETTERS. + pub fn icon_name(&self) -> &str { + self.icon_name.as_str() + } + pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 57a5fb25..adf64b53 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -5,9 +5,9 @@ pub const IMAGE_COMPONENT: &str = "pagetop::component::image"; pub struct Image { renderable: fn() -> bool, weight : isize, - source : AttributeValue, id : IdentifierValue, classes : Classes, + source : AttributeValue, template : String, } @@ -16,9 +16,9 @@ impl ComponentTrait for Image { Image { renderable: render_always, weight : 0, - source : AttributeValue::new(), id : IdentifierValue::new(), classes : Classes::new_with_default("img-fluid"), + source : AttributeValue::new(), template : "default".to_owned(), } } @@ -70,11 +70,6 @@ impl Image { self } - pub fn with_source(mut self, source: &str) -> Self { - self.alter_source(source); - self - } - pub fn with_id(mut self, id: &str) -> Self { self.alter_id(id); self @@ -85,6 +80,11 @@ impl Image { self } + pub fn with_source(mut self, source: &str) -> Self { + self.alter_source(source); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -102,11 +102,6 @@ impl Image { self } - pub fn alter_source(&mut self, source: &str) -> &mut Self { - self.source.with_value(source); - self - } - pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.with_value(id); self @@ -117,6 +112,11 @@ impl Image { self } + pub fn alter_source(&mut self, source: &str) -> &mut Self { + self.source.with_value(source); + self + } + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -124,10 +124,6 @@ impl Image { // Image GETTERS. - pub fn source(&self) -> &AttributeValue { - &self.source - } - pub fn id(&self) -> &IdentifierValue { &self.id } @@ -136,6 +132,10 @@ impl Image { &self.classes } + pub fn source(&self) -> &AttributeValue { + &self.source + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 86cb361f..0531219d 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -176,9 +176,9 @@ impl MenuItem { pub struct Menu { renderable: fn() -> bool, weight : isize, - items : ComponentsBundle, id : IdentifierValue, classes : Classes, + items : ComponentsBundle, template : String, } @@ -206,7 +206,7 @@ impl ComponentTrait for Menu { self.weight } - fn default_render(&self, context: &mut InContext) -> Markup { + fn before_render(&mut self, context: &mut InContext) { context .add_stylesheet(StyleSheet::with_source( "/theme/menu/css/menu.css?ver=1.1.1" @@ -218,7 +218,9 @@ impl ComponentTrait for Menu { "/theme/menu/js/menu.min.js?ver=1.1.1" )) .add_jquery(); + } + fn default_render(&self, context: &mut InContext) -> Markup { let id = context.required_id::<Menu>(self.id()); html! { ul id=(id) class=[self.classes().get()] { @@ -244,17 +246,6 @@ impl ComponentTrait for Menu { impl Menu { - // Menu CONTAINER. - - pub fn add(mut self, item: MenuItem) -> Self { - self.items.add(item); - self - } - - pub fn items(&self) -> &ComponentsBundle { - &self.items - } - // Menu BUILDER. pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { @@ -277,6 +268,11 @@ impl Menu { self } + pub fn with_item(mut self, item: MenuItem) -> Self { + self.alter_item(item); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -304,6 +300,11 @@ impl Menu { self } + pub fn alter_item(&mut self, item: MenuItem) -> &mut Self { + self.items.add(item); + self + } + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -319,6 +320,10 @@ impl Menu { &self.classes } + pub fn items(&self) -> &ComponentsBundle { + &self.items + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 75b685e7..afdf7f6c 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -14,10 +14,10 @@ pub enum ParagraphDisplay { pub struct Paragraph { renderable: fn() -> bool, weight : isize, - html : Markup, - display : ParagraphDisplay, id : IdentifierValue, classes : Classes, + html : Markup, + display : ParagraphDisplay, template : String, } @@ -26,10 +26,10 @@ impl ComponentTrait for Paragraph { Paragraph { renderable: render_always, weight : 0, - html : html! {}, - display : ParagraphDisplay::Normal, id : IdentifierValue::new(), classes : Classes::new(), + html : html! {}, + display : ParagraphDisplay::Normal, template : "default".to_owned(), } } @@ -78,16 +78,6 @@ impl Paragraph { self } - pub fn with_html(mut self, html: Markup) -> Self { - self.alter_html(html); - self - } - - pub fn with_display(mut self, display: ParagraphDisplay) -> Self { - self.alter_display(display); - self - } - pub fn with_id(mut self, id: &str) -> Self { self.alter_id(id); self @@ -98,6 +88,16 @@ impl Paragraph { self } + pub fn with_html(mut self, html: Markup) -> Self { + self.alter_html(html); + self + } + + pub fn with_display(mut self, display: ParagraphDisplay) -> Self { + self.alter_display(display); + self + } + pub fn using_template(mut self, template: &str) -> Self { self.alter_template(template); self @@ -115,6 +115,16 @@ impl Paragraph { self } + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.with_value(id); + self + } + + pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { + self.classes.alter(classes, op); + self + } + pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.html = html; self @@ -133,16 +143,6 @@ impl Paragraph { self } - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); - self - } - - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); - self - } - pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self @@ -150,14 +150,6 @@ impl Paragraph { // Paragraph GETTERS. - pub fn html(&self) -> &Markup { - &self.html - } - - pub fn display(&self) -> &ParagraphDisplay { - &self.display - } - pub fn id(&self) -> &IdentifierValue { &self.id } @@ -166,6 +158,14 @@ impl Paragraph { &self.classes } + pub fn html(&self) -> &Markup { + &self.html + } + + pub fn display(&self) -> &ParagraphDisplay { + &self.display + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index 95a069d2..f10657df 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -37,76 +37,68 @@ async fn demo() -> app::Result<Markup> { fn hello_world() -> Container { Container::header() - .add(grid::Row::new() - .add_column(grid::Column::new() - .add(Heading::h1(html! { - (l("page_title")) - }).with_display(HeadingDisplay::Large)) - .add(Paragraph::with(html! { - (t("welcome_to", &args![ - "app" => SETTINGS.app.name.as_str() - ])) - })) - .add(Paragraph::with(html! { - (e("welcome_intro", &args![ - "app" => format!("<strong>{}</strong>", &SETTINGS.app.name) - ])) - }).with_display(ParagraphDisplay::Small)) - .add(Paragraph::with(html! { - (e("welcome_pagetop", &args![ - "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" - ])) - })) - .add(Anchor::button("#", - html! { - ("Offered services") - }).with_left_icon( - Icon::with("card-checklist") - ) + .with_component(grid::Row::new() + .with_column(grid::Column::new() + .with_component(Heading::h1(html! { + (l("page_title")) + }) + .with_display(HeadingDisplay::Large) ) - .add(Anchor::button("#", - html! { + .with_component(Paragraph::with(html! { + (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) + }) + ) + .with_component(Paragraph::with(html! { + (e("welcome_intro", &args![ + "app" => format!("<strong>{}</strong>", &SETTINGS.app.name) + ])) + }) + .with_display(ParagraphDisplay::Small) + ) + .with_component(Paragraph::with(html! { + (e("welcome_pagetop", &args![ + "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + ])) + }) + ) + .with_component(Anchor::button("#", html! { + ("Offered services") + }) + .with_left_icon(Icon::with("card-checklist")) + ) + .with_component(Anchor::button("#", html! { ("Get quote") - }).with_left_icon( - Icon::with("envelope-open-heart-fill") - ) + }) + .with_left_icon(Icon::with("envelope-open-heart-fill")) ) ) - .add_column(grid::Column::new() - .add(Image::image("/theme/images/demo-header.svg")) + .with_column(grid::Column::new() + .with_component(Image::image("/theme/images/demo-header.svg")) ) .with_spaces(&[SpaceSet::PaddingBoth(SpaceValue::RelEm(2.0), SpaceValue::RelPct(5.0))]) ) } -fn just_visiting() -> Chunck { - Chunck::with(html! { - div id="details" class="basic-1" { - div class="container" { - div class="row" { - div class="col-lg-6 col-xl-7" { - div class="image-container" { - img class="img-fluid" src="/bootsier/images/demo-visiting.svg" alt="alternative" {} - } - } - div class="col-lg-6 col-xl-5" { - div class="text-container" { - h2 { - span { - (l("visiting_title")) - } - br; - (l("visiting_subtitle")) - } - p { (l("visiting_text1")) } - p { (l("visiting_text2")) } - a class="btn-solid-reg" data-bs-toggle="modal" data-bs-target="#staticBackdrop" { "Modal" } - } - } - } - } - } - }) +fn just_visiting() -> Container { + Container::new() + .with_component(grid::Row::new() + .with_column(grid::Column::new() + .with_size(grid::ColumnSize::Is5of12) + .with_component(Image::image("/theme/images/demo-visiting.svg")) + .with_spaces(&[SpaceSet::PaddingAll(SpaceValue::RelPct(2.0))]) + ) + .with_column(grid::Column::new() + .with_component(Heading::h2(html! { (l("visiting_title")) })) + .with_component(Heading::h3(html! { (l("visiting_subtitle")) })) + .with_component(Paragraph::with(html! { (l("visiting_text1")) })) + .with_component(Paragraph::with(html! { (l("visiting_text2")) })) + .with_spaces(&[ + SpaceSet::PaddingTop(SpaceValue::RelPct(2.5)), + SpaceSet::PaddingLeft(SpaceValue::RelPct(5.0)), + ]) + ) + .with_spaces(&[SpaceSet::PaddingBoth(SpaceValue::RelEm(1.0), SpaceValue::RelPct(5.0))]) + ) } fn about_pagetop() -> Chunck { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index ff2f29bc..fdeeb4fa 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -66,7 +66,21 @@ impl ThemeTrait for Bulmix { }, grid::COLUMN_COMPONENT => { let col = component_mut::<grid::Column>(component); - col.alter_classes("column content", ClassesOp::SetDefault); + col.alter_classes(concat_string!("column", match col.size() { + grid::ColumnSize::Default => "", + grid::ColumnSize::Is1of12 => " is-1", + grid::ColumnSize::Is2of12 => " is-2", + grid::ColumnSize::Is3of12 => " is-3", + grid::ColumnSize::Is4of12 => " is-4", + grid::ColumnSize::Is5of12 => " is-5", + grid::ColumnSize::Is6of12 => " is-6", + grid::ColumnSize::Is7of12 => " is-7", + grid::ColumnSize::Is8of12 => " is-8", + grid::ColumnSize::Is9of12 => " is-9", + grid::ColumnSize::Is10of12 => " is-10", + grid::ColumnSize::Is11of12 => " is-11", + grid::ColumnSize::IsFull => " is-12", + }, " content").as_str(), ClassesOp::SetDefault); }, grid::ROW_COMPONENT => { let row = component_mut::<grid::Row>(component); @@ -79,15 +93,11 @@ impl ThemeTrait for Bulmix { fn render_component( &self, component: &dyn ComponentTrait, - context: &mut InContext + _context: &mut InContext ) -> Option<Markup> { match component.handler() { ICON_COMPONENT => { let icon = component_ref::<Icon>(component); - context - .add_stylesheet(StyleSheet::with_source( - "/theme/icons/bootstrap-icons.css?ver=1.8.2" - )); Some(html! { span class="icon" { i class=[icon.classes().get()] style=[icon.spaces().get()] {}; diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 4b49526f..bf88f4cd 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -26,6 +26,10 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { 0 } + #[allow(unused_variables)] + fn before_render(&mut self, context: &mut InContext) { + } + #[allow(unused_variables)] fn default_render(&self, context: &mut InContext) -> Markup { html! {} @@ -45,6 +49,9 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { } pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InContext) -> Markup { + // Acciones del propio componente antes de renderizarlo. + component.before_render(context); + // Acciones de los módulos antes de renderizar el componente. run_hooks( BEFORE_RENDER_COMPONENT_HOOK, @@ -55,11 +62,9 @@ pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InCont context.theme().before_render_component(component, context); match component.is_renderable() { - true => { - match context.theme().render_component(component, context) { - Some(html) => html, - None => component.default_render(context) - } + true => match context.theme().render_component(component, context) { + Some(html) => html, + None => component.default_render(context) }, false => html! {} } diff --git a/pagetop/static/bootsier/images/demo-visiting.svg b/pagetop/static/theme/images/demo-visiting.svg similarity index 100% rename from pagetop/static/bootsier/images/demo-visiting.svg rename to pagetop/static/theme/images/demo-visiting.svg From c5c3d1688e03789fc168f8ef15d1e41694331c38 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 8 Jul 2022 07:21:42 +0200 Subject: [PATCH 118/853] =?UTF-8?q?A=C3=B1ade=20definici=C3=B3n=20de=20sub?= =?UTF-8?q?t=C3=ADtulos=20en=20cabeceras?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/heading.rs | 14 ++++++++------ pagetop/src/base/module/demopage.rs | 17 ++++++++++++++--- pagetop/src/base/theme/bulmix.rs | 17 +++++++++-------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 647ca6d2..41e9d28a 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -11,6 +11,7 @@ pub enum HeadingDisplay { Small, XxSmall, Normal, + Subtitle, } pub struct Heading { @@ -174,12 +175,13 @@ impl Heading { pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; self.classes.alter(match &self.display() { - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::Large => "display-3", - HeadingDisplay::Medium => "display-4", - HeadingDisplay::Small => "display-5", - HeadingDisplay::XxSmall => "display-6", - HeadingDisplay::Normal => "", + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::Large => "display-3", + HeadingDisplay::Medium => "display-4", + HeadingDisplay::Small => "display-5", + HeadingDisplay::XxSmall => "display-6", + HeadingDisplay::Normal => "", + HeadingDisplay::Subtitle => "", }, ClassesOp::SetDefault); self } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index f10657df..b443b83d 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -88,9 +88,20 @@ fn just_visiting() -> Container { .with_spaces(&[SpaceSet::PaddingAll(SpaceValue::RelPct(2.0))]) ) .with_column(grid::Column::new() - .with_component(Heading::h2(html! { (l("visiting_title")) })) - .with_component(Heading::h3(html! { (l("visiting_subtitle")) })) - .with_component(Paragraph::with(html! { (l("visiting_text1")) })) + .with_component(Heading::h2(html! { + (l("visiting_title")) + }) + ) + .with_component(Heading::h3(html! { + (l("visiting_subtitle")) + }) + .with_display(HeadingDisplay::Subtitle) + ) + .with_component(Paragraph::with(html! { + (l("visiting_text1")) + }) + .with_display(ParagraphDisplay::Small) + ) .with_component(Paragraph::with(html! { (l("visiting_text2")) })) .with_spaces(&[ SpaceSet::PaddingTop(SpaceValue::RelPct(2.5)), diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index fdeeb4fa..7acbe441 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -44,14 +44,15 @@ impl ThemeTrait for Bulmix { }, HEADING_COMPONENT => { let h = component_mut::<Heading>(component); - h.alter_classes(concat_string!("title ", match h.display() { - HeadingDisplay::XxLarge => "is-1", - HeadingDisplay::Large => "is-2", - HeadingDisplay::Medium => "is-3", - HeadingDisplay::Small => "is-4", - HeadingDisplay::XxSmall => "is-5", - HeadingDisplay::Normal => "", - }).as_str(), ClassesOp::SetDefault); + h.alter_classes(match h.display() { + HeadingDisplay::XxLarge => "title is-1", + HeadingDisplay::Large => "title is-2", + HeadingDisplay::Medium => "title is-3", + HeadingDisplay::Small => "title is-4", + HeadingDisplay::XxSmall => "title is-5", + HeadingDisplay::Normal => "title", + HeadingDisplay::Subtitle => "subtitle", + }, ClassesOp::SetDefault); }, PARAGRAPH_COMPONENT => { let p = component_mut::<Paragraph>(component); From 25406ba331206cc20e3626a5114548b0989059b0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 12 Jul 2022 19:05:50 +0200 Subject: [PATCH 119/853] =?UTF-8?q?Modifica=20asignaci=C3=B3n=20en=20l?= =?UTF-8?q?=C3=ADnea=20de=20m=C3=A1rgenes/espacios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 18 +- pagetop/src/base/component/grid/column.rs | 18 +- pagetop/src/base/component/grid/row.rs | 18 +- pagetop/src/base/component/icon.rs | 18 +- pagetop/src/base/module/demopage.rs | 197 +++++++++++------- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/html.rs | 7 +- pagetop/src/html/layout.rs | 165 +++++++++++++++ pagetop/src/html/spacing.rs | 177 ---------------- pagetop/src/html/unit.rs | 52 +++++ pagetop/src/locale.rs | 2 +- .../images/demo-pagetop.svg | 0 12 files changed, 380 insertions(+), 294 deletions(-) create mode 100644 pagetop/src/html/layout.rs delete mode 100644 pagetop/src/html/spacing.rs create mode 100644 pagetop/src/html/unit.rs rename pagetop/static/{bootsier => theme}/images/demo-pagetop.svg (100%) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 5bae4ef2..2bb15ee4 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -23,7 +23,7 @@ pub struct Anchor { weight : isize, id : IdentifierValue, classes : Classes, - spaces : Spaces, + layout : InlineLayout, anchor_type: AnchorType, href : AttributeValue, html : Markup, @@ -40,7 +40,7 @@ impl ComponentTrait for Anchor { weight : 0, id : IdentifierValue::new(), classes : Classes::new(), - spaces : Spaces::new(), + layout : InlineLayout::new(), anchor_type: AnchorType::Link, href : AttributeValue::new(), html : html! {}, @@ -75,7 +75,7 @@ impl ComponentTrait for Anchor { a id=[self.id().get()] class=[self.classes().get()] - style=[self.spaces().get()] + style=[self.layout().get()] href=[self.href().get()] target=[target] { @@ -130,8 +130,8 @@ impl Anchor { self } - pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { - self.alter_spaces(spaces); + pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { + self.alter_layout(layout); self } @@ -192,8 +192,8 @@ impl Anchor { self } - pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { - self.spaces.add(spaces); + pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { + self.layout.set(layout); self } @@ -248,8 +248,8 @@ impl Anchor { &self.classes } - pub fn spaces(&self) -> &Spaces { - &self.spaces + pub fn layout(&self) -> &InlineLayout { + &self.layout } pub fn anchor_type(&self) -> &AnchorType { diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index bca2e516..d535f2e2 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -22,7 +22,7 @@ pub struct Column { weight : isize, id : IdentifierValue, classes : Classes, - spaces : Spaces, + layout : InlineLayout, size : ColumnSize, components: ComponentsBundle, template : String, @@ -35,7 +35,7 @@ impl ComponentTrait for Column { weight : 0, id : IdentifierValue::new(), classes : Classes::new(), - spaces : Spaces::new(), + layout : InlineLayout::new(), size : ColumnSize::Default, components: ComponentsBundle::new(), template : "default".to_owned(), @@ -74,7 +74,7 @@ impl ComponentTrait for Column { fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] style=[self.spaces().get()] { + div id=[self.id().get()] class=[self.classes().get()] style=[self.layout().get()] { (self.components().render(context)) } } @@ -113,8 +113,8 @@ impl Column { self } - pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { - self.alter_spaces(spaces); + pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { + self.alter_layout(layout); self } @@ -155,8 +155,8 @@ impl Column { self } - pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { - self.spaces.add(spaces); + pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { + self.layout.set(layout); self } @@ -184,8 +184,8 @@ impl Column { &self.classes } - pub fn spaces(&self) -> &Spaces { - &self.spaces + pub fn layout(&self) -> &InlineLayout { + &self.layout } pub fn size(&self) -> &ColumnSize { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 65f72c5f..eb59ed9e 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -7,7 +7,7 @@ pub struct Row { weight : isize, id : IdentifierValue, classes : Classes, - spaces : Spaces, + layout : InlineLayout, columns : ComponentsBundle, template : String, } @@ -19,7 +19,7 @@ impl ComponentTrait for Row { weight : 0, id : IdentifierValue::new(), classes : Classes::new_with_default("row"), - spaces : Spaces::new(), + layout : InlineLayout::new(), columns : ComponentsBundle::new(), template : "default".to_owned(), } @@ -39,7 +39,7 @@ impl ComponentTrait for Row { fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] style=[self.spaces().get()] { + div id=[self.id().get()] class=[self.classes().get()] style=[self.layout().get()] { (self.columns().render(context)) } } @@ -78,8 +78,8 @@ impl Row { self } - pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { - self.alter_spaces(spaces); + pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { + self.alter_layout(layout); self } @@ -115,8 +115,8 @@ impl Row { self } - pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { - self.spaces.add(spaces); + pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { + self.layout.set(layout); self } @@ -140,8 +140,8 @@ impl Row { &self.classes } - pub fn spaces(&self) -> &Spaces { - &self.spaces + pub fn layout(&self) -> &InlineLayout { + &self.layout } pub fn columns(&self) -> &ComponentsBundle { diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 1237ccc3..d731940d 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -7,7 +7,7 @@ pub struct Icon { weight : isize, icon_name : String, classes : Classes, - spaces : Spaces, + layout : InlineLayout, } impl ComponentTrait for Icon { @@ -17,7 +17,7 @@ impl ComponentTrait for Icon { weight : 0, icon_name : "question-circle-fill".to_owned(), classes : Classes::new(), - spaces : Spaces::new(), + layout : InlineLayout::new(), } } @@ -43,7 +43,7 @@ impl ComponentTrait for Icon { } fn default_render(&self, _context: &mut InContext) -> Markup { - html! { i class=[self.classes().get()] style=[self.spaces().get()] {}; } + html! { i class=[self.classes().get()] style=[self.layout().get()] {}; } } fn as_ref_any(&self) -> &dyn AnyComponent { @@ -82,8 +82,8 @@ impl Icon { self } - pub fn with_spaces(mut self, spaces: &[SpaceSet]) -> Self { - self.alter_spaces(spaces); + pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { + self.alter_layout(layout); self } @@ -109,8 +109,8 @@ impl Icon { self } - pub fn alter_spaces(&mut self, spaces: &[SpaceSet]) -> &mut Self { - self.spaces.add(spaces); + pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { + self.layout.set(layout); self } @@ -124,7 +124,7 @@ impl Icon { &self.classes } - pub fn spaces(&self) -> &Spaces { - &self.spaces + pub fn layout(&self) -> &InlineLayout { + &self.layout } } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index b443b83d..1a5e4235 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -37,12 +37,17 @@ async fn demo() -> app::Result<Markup> { fn hello_world() -> Container { Container::header() + .with_id("hello-world") .with_component(grid::Row::new() + .with_layout( + &[LayoutSet::PaddingSide(UnitValue::RelEm(2.0), UnitValue::RelPct(5.0))] + ) .with_column(grid::Column::new() + .with_size(grid::ColumnSize::Is4of12) .with_component(Heading::h1(html! { (l("page_title")) }) - .with_display(HeadingDisplay::Large) + .with_display(HeadingDisplay::Medium) ) .with_component(Paragraph::with(html! { (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) @@ -65,6 +70,10 @@ fn hello_world() -> Container { ("Offered services") }) .with_left_icon(Icon::with("card-checklist")) + .with_layout(&[ + LayoutSet::PaddingSide(UnitValue::UnSet, UnitValue::RelEm(1.5)), + LayoutSet::RadiusAll(UnitValue::RelEm(1.5)), + ]) ) .with_component(Anchor::button("#", html! { ("Get quote") @@ -75,19 +84,26 @@ fn hello_world() -> Container { .with_column(grid::Column::new() .with_component(Image::image("/theme/images/demo-header.svg")) ) - .with_spaces(&[SpaceSet::PaddingBoth(SpaceValue::RelEm(2.0), SpaceValue::RelPct(5.0))]) ) } fn just_visiting() -> Container { Container::new() + .with_id("visiting") .with_component(grid::Row::new() - .with_column(grid::Column::new() - .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::image("/theme/images/demo-visiting.svg")) - .with_spaces(&[SpaceSet::PaddingAll(SpaceValue::RelPct(2.0))]) + .with_layout( + &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] ) .with_column(grid::Column::new() + .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) + .with_size(grid::ColumnSize::Is5of12) + .with_component(Image::image("/theme/images/demo-visiting.svg")) + ) + .with_column(grid::Column::new() + .with_layout(&[ + LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), + LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), + ]) .with_component(Heading::h2(html! { (l("visiting_title")) }) @@ -103,83 +119,110 @@ fn just_visiting() -> Container { .with_display(ParagraphDisplay::Small) ) .with_component(Paragraph::with(html! { (l("visiting_text2")) })) - .with_spaces(&[ - SpaceSet::PaddingTop(SpaceValue::RelPct(2.5)), - SpaceSet::PaddingLeft(SpaceValue::RelPct(5.0)), - ]) ) - .with_spaces(&[SpaceSet::PaddingBoth(SpaceValue::RelEm(1.0), SpaceValue::RelPct(5.0))]) ) } -fn about_pagetop() -> Chunck { - Chunck::with(html! { - div id="pagetop" class="basic-2" { - div class="container" { - div class="row" { - div class="col-lg-6 col-xl-5" { - div class="text-container" { - h2 { (l("pagetop_title")) } - p { (l("pagetop_text1")) } - p { (l("pagetop_text2")) } - p { (l("pagetop_text3")) } - } - } - div class="col-lg-6 col-xl-7" { - div class="image-container" { - img class="img-fluid" src="/bootsier/images/demo-pagetop.svg" alt="alternative" {} - } - } - } - } - } - }) +fn about_pagetop() -> Container { + Container::new() + .with_id("pagetop") + .with_component(grid::Row::new() + .with_layout( + &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] + ) + .with_column(grid::Column::new() + .with_layout(&[ + LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), + LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), + ]) + .with_size(grid::ColumnSize::Is7of12) + .with_component(Heading::h2(html! { + (l("pagetop_title")) + }) + ) + .with_component(Paragraph::with(html! { + (l("pagetop_text1")) + }) + .with_display(ParagraphDisplay::Small) + ) + .with_component(Paragraph::with(html! { + (l("pagetop_text2")) + }) + ) + .with_component(Paragraph::with(html! { + (l("pagetop_text3")) + }) + ) + ) + .with_column(grid::Column::new() + .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) + .with_component(Image::image("/theme/images/demo-pagetop.svg")) + ) + ) } -fn promo_pagetop() -> Chunck { - Chunck::with(html! { - div id="promo" class="basic-3" { - div class="container" { - div class="row" { - div class="col-lg-6 col-xl-5" { - div class="text-container" { - h2 { (l("pagetop_promo_title")) } - p { (e("pagetop_promo_text1", &args![ - "pagetop" => - "<a href=\"https://pagetop-rs\">PageTop</a>" - ])) } - } - } - div class="col-lg-6 col-xl-7" { - div class="image-container" { - img class="img-fluid" src="/bootsier/images/demo-pagetop.svg" alt="alternative" {} - } - } - } - } - } - }) +fn promo_pagetop() -> Container { + Container::new() + .with_id("promo") + .with_component(grid::Row::new() + .with_layout( + &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] + ) + .with_column(grid::Column::new() + .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) + .with_size(grid::ColumnSize::Is5of12) + .with_component(Image::image("/theme/images/demo-pagetop.svg")) + ) + .with_column(grid::Column::new() + .with_layout(&[ + LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), + LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), + ]) + .with_component(Heading::h2(html! { + (l("pagetop_promo_title")) + }) + ) + .with_component(Paragraph::with(html! { + (e("pagetop_promo_text1", &args![ + "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + ])) + }) + .with_display(ParagraphDisplay::Small) + ) + ) + ) } -fn reporting_problems() -> Chunck { - Chunck::with(html! { - div id="reporting" class="basic-4" { - div class="container" { - div class="row" { - div class="col-lg-6 col-xl-5" { - div class="text-container" { - h2 { (l("report_problems_title")) } - p { (l("report_problems_text1")) } - p { (l("report_problems_text2")) } - } - } - div class="col-lg-6 col-xl-7" { - div class="image-container" { - img class="img-fluid" src="/bootsier/images/demo-pagetop.svg" alt="alternative" {} - } - } - } - } - } - }) +fn reporting_problems() -> Container { + Container::new() + .with_id("reporting") + .with_component(grid::Row::new() + .with_layout( + &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] + ) + .with_column(grid::Column::new() + .with_layout(&[ + LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), + LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), + ]) + .with_size(grid::ColumnSize::Is7of12) + .with_component(Heading::h2(html! { + (l("report_problems_title")) + }) + ) + .with_component(Paragraph::with(html! { + (l("report_problems_text1")) + }) + .with_display(ParagraphDisplay::Small) + ) + .with_component(Paragraph::with(html! { + (l("report_problems_text2")) + }) + ) + ) + .with_column(grid::Column::new() + .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) + .with_component(Image::image("/theme/images/demo-pagetop.svg")) + ) + ) } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 7acbe441..77e0ce2b 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -101,7 +101,7 @@ impl ThemeTrait for Bulmix { let icon = component_ref::<Icon>(component); Some(html! { span class="icon" { - i class=[icon.classes().get()] style=[icon.spaces().get()] {}; + i class=[icon.classes().get()] style=[icon.layout().get()] {}; } }) }, diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index eb720c41..17d271a2 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -17,5 +17,8 @@ pub use identifier::IdentifierValue; mod classes; pub use classes::{Classes, ClassesOp}; -mod spacing; -pub use spacing::{Spaces, SpaceSet, SpaceValue}; +mod unit; +pub use unit::UnitValue; + +mod layout; +pub use layout::{InlineLayout, LayoutSet}; diff --git a/pagetop/src/html/layout.rs b/pagetop/src/html/layout.rs new file mode 100644 index 00000000..b94a10fa --- /dev/null +++ b/pagetop/src/html/layout.rs @@ -0,0 +1,165 @@ +use crate::concat_string; + +use super::unit::UnitValue; + +const RADIUS_BOTTOM_LEFT: &str = "border-bottom-left-radius"; +const RADIUS_BOTTOM_RIGHT: &str = "border-bottom-right-radius"; +const RADIUS_TOP_LEFT: &str = "border-top-left-radius"; +const RADIUS_TOP_RIGHT: &str = "border-top-right-radius"; + +const MARGIN_BOTTOM: &str = "margin-bottom"; +const MARGIN_LEFT: &str = "margin-left"; +const MARGIN_RIGHT: &str = "margin-right"; +const MARGIN_TOP: &str = "margin-top"; + +const PADDING_BOTTOM: &str = "padding-bottom"; +const PADDING_LEFT: &str = "padding-left"; +const PADDING_RIGHT: &str = "padding-right"; +const PADDING_TOP: &str = "padding-top"; + +pub enum LayoutSet { + Margin(UnitValue, UnitValue, UnitValue, UnitValue), + MarginAll(UnitValue), + MarginSide(UnitValue, UnitValue), + MarginBottom(UnitValue), + MarginLeft(UnitValue), + MarginRight(UnitValue), + MarginTop(UnitValue), + + Padding(UnitValue, UnitValue, UnitValue, UnitValue), + PaddingAll(UnitValue), + PaddingSide(UnitValue, UnitValue), + PaddingBottom(UnitValue), + PaddingLeft(UnitValue), + PaddingRight(UnitValue), + PaddingTop(UnitValue), + + Radius(UnitValue, UnitValue, UnitValue, UnitValue), + RadiusAll(UnitValue), + RadiusBottomLeft(UnitValue), + RadiusBottomRight(UnitValue), + RadiusTopLeft(UnitValue), + RadiusTopRight(UnitValue), +} + +impl LayoutSet { + fn set(&self, into_spaces: &mut InlineLayout) { + match self { + + // MARGIN LAYOUT. + LayoutSet::Margin(top, right, bottom, left) => { + self.add(MARGIN_TOP, top, into_spaces); + self.add(MARGIN_RIGHT, right, into_spaces); + self.add(MARGIN_BOTTOM, bottom, into_spaces); + self.add(MARGIN_LEFT, left, into_spaces); + }, + LayoutSet::MarginAll(val) => { + self.add(MARGIN_TOP, val, into_spaces); + self.add(MARGIN_RIGHT, val, into_spaces); + self.add(MARGIN_BOTTOM, val, into_spaces); + self.add(MARGIN_LEFT, val, into_spaces); + }, + LayoutSet::MarginSide(top_bottom, right_left) => { + self.add(MARGIN_TOP, top_bottom, into_spaces); + self.add(MARGIN_RIGHT, right_left, into_spaces); + self.add(MARGIN_BOTTOM, top_bottom, into_spaces); + self.add(MARGIN_LEFT, right_left, into_spaces); + }, + LayoutSet::MarginTop(val) => self.add(MARGIN_TOP, val, into_spaces), + LayoutSet::MarginRight(val) => self.add(MARGIN_RIGHT, val, into_spaces), + LayoutSet::MarginBottom(val) => self.add(MARGIN_BOTTOM, val, into_spaces), + LayoutSet::MarginLeft(val) => self.add(MARGIN_LEFT, val, into_spaces), + + // PADDING LAYOUT. + LayoutSet::Padding(top, right, bottom, left) => { + self.add(PADDING_TOP, top, into_spaces); + self.add(PADDING_RIGHT, right, into_spaces); + self.add(PADDING_BOTTOM, bottom, into_spaces); + self.add(PADDING_LEFT, left, into_spaces); + }, + LayoutSet::PaddingAll(val) => { + self.add(PADDING_TOP, val, into_spaces); + self.add(PADDING_RIGHT, val, into_spaces); + self.add(PADDING_BOTTOM, val, into_spaces); + self.add(PADDING_LEFT, val, into_spaces); + }, + LayoutSet::PaddingSide(top_bottom, right_left) => { + self.add(PADDING_TOP, top_bottom, into_spaces); + self.add(PADDING_RIGHT, right_left, into_spaces); + self.add(PADDING_BOTTOM, top_bottom, into_spaces); + self.add(PADDING_LEFT, right_left, into_spaces); + }, + LayoutSet::PaddingTop(val) => self.add(PADDING_TOP, val, into_spaces), + LayoutSet::PaddingRight(val) => self.add(PADDING_RIGHT, val, into_spaces), + LayoutSet::PaddingBottom(val) => self.add(PADDING_BOTTOM, val, into_spaces), + LayoutSet::PaddingLeft(val) => self.add(PADDING_LEFT, val, into_spaces), + + // BORDER RADIUS LAYOUT. + LayoutSet::Radius(top_left, top_right, bottom_right, bottom_left) => { + self.add(RADIUS_TOP_LEFT, top_left, into_spaces); + self.add(RADIUS_TOP_RIGHT, top_right, into_spaces); + self.add(RADIUS_BOTTOM_RIGHT, bottom_right, into_spaces); + self.add(RADIUS_BOTTOM_LEFT, bottom_left, into_spaces); + }, + LayoutSet::RadiusAll(val) => { + self.add(RADIUS_TOP_LEFT, val, into_spaces); + self.add(RADIUS_TOP_RIGHT, val, into_spaces); + self.add(RADIUS_BOTTOM_RIGHT, val, into_spaces); + self.add(RADIUS_BOTTOM_LEFT, val, into_spaces); + }, + LayoutSet::RadiusTopLeft(val) => self.add(RADIUS_TOP_LEFT, val, into_spaces), + LayoutSet::RadiusTopRight(val) => self.add(RADIUS_TOP_RIGHT, val, into_spaces), + LayoutSet::RadiusBottomRight(val) => self.add(RADIUS_BOTTOM_RIGHT, val, into_spaces), + LayoutSet::RadiusBottomLeft(val) => self.add(RADIUS_BOTTOM_LEFT, val, into_spaces), + } + } + + fn add(&self, property: &str, value: &UnitValue, into_spaces: &mut InlineLayout) { + let val = value.to_string(); + let style = InlineProperty { + property: property.to_owned(), + inline : concat_string!(property, ":", val, ";"), + }; + match into_spaces.0.iter().position(|s| s.property.eq(&style.property)) { + Some(pos) => { + into_spaces.0.remove(pos); + if !val.is_empty() { + into_spaces.0.insert(pos, style); + } + }, + _ => if !val.is_empty() { + into_spaces.0.push(style) + } + } + } +} + +struct InlineProperty { + property: String, + inline : String, +} + +pub struct InlineLayout(Vec<InlineProperty>); + +impl InlineLayout { + pub fn new() -> Self { + InlineLayout(Vec::new()) + } + + pub fn set(&mut self, layout: &[LayoutSet]) -> &Self { + for i in 0..layout.len() { + layout[i].set(self); + } + self + } + + pub fn get(&self) -> Option<String> { + if self.0.len() == 0 { + None + } else { + let mut inline = "".to_owned(); + self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); + Some(inline) + } + } +} diff --git a/pagetop/src/html/spacing.rs b/pagetop/src/html/spacing.rs deleted file mode 100644 index a3d138c0..00000000 --- a/pagetop/src/html/spacing.rs +++ /dev/null @@ -1,177 +0,0 @@ -use crate::concat_string; - -const MARGIN_BOTTOM: &str = "margin-bottom"; -const MARGIN_LEFT: &str = "margin-left"; -const MARGIN_RIGHT: &str = "margin-right"; -const MARGIN_TOP: &str = "margin-top"; - -const PADDING_BOTTOM: &str = "padding-bottom"; -const PADDING_LEFT: &str = "padding-left"; -const PADDING_RIGHT: &str = "padding-right"; -const PADDING_TOP: &str = "padding-top"; - -struct SpaceStyle { - property: String, - inline : String, -} - -pub struct Spaces(Vec<SpaceStyle>); - -// About pixels: Pixels (px) are relative to the viewing device. For low-dpi -// devices, 1px is one device pixel (dot) of the display. For printers and high -// resolution screens 1px implies multiple device pixels. - -// About em: 2em means 2 times the size of the current font. The em and rem -// units are practical in creating perfectly scalable layout! - -// About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. - -pub enum SpaceValue { - Auto, - - Cm(isize), // Centimeters. - In(isize), // Inches (1in = 96px = 2.54cm). - Mm(isize), // Millimeters. - Pc(isize), // Picas (1pc = 12pt). - Pt(isize), // Points (1pt = 1/72 of 1in). - Px(isize), // Pixels (1px = 1/96th of 1in). - - RelEm(f32), // Relative to the font-size of the element. - RelPct(f32), // Percentage relative to the parent element. - RelRem(f32), // Relative to font-size of the root element. - RelVh(f32), // Relative to 1% of the height of the viewport. - RelVw(f32), // Relative to 1% of the value of the viewport. - - UnSet, -} - -impl SpaceValue { - fn add(&self, property: &str, into_spaces: &mut Spaces) { - let style = SpaceStyle { - property: property.to_owned(), - inline : match self { - SpaceValue::Auto => concat_string!(property, ":auto;"), - // Absolute value. - SpaceValue::Cm(aw) => concat_string!(property, ":", aw.to_string(), "cm;"), - SpaceValue::In(aw) => concat_string!(property, ":", aw.to_string(), "in;"), - SpaceValue::Mm(aw) => concat_string!(property, ":", aw.to_string(), "mm;"), - SpaceValue::Pc(aw) => concat_string!(property, ":", aw.to_string(), "pc;"), - SpaceValue::Pt(aw) => concat_string!(property, ":", aw.to_string(), "pt;"), - SpaceValue::Px(aw) => concat_string!(property, ":", aw.to_string(), "px;"), - // Relative value. - SpaceValue::RelEm(rw) => concat_string!(property, ":", rw.to_string(), "em;"), - SpaceValue::RelPct(rw) => concat_string!(property, ":", rw.to_string(), "%;"), - SpaceValue::RelRem(rw) => concat_string!(property, ":", rw.to_string(), "rem;"), - SpaceValue::RelVh(rw) => concat_string!(property, ":", rw.to_string(), "vh;"), - SpaceValue::RelVw(rw) => concat_string!(property, ":", rw.to_string(), "vw;"), - - _ => "".to_owned(), - } - }; - match into_spaces.0.iter().position(|s| s.property.eq(&style.property)) { - Some(pos) => { - into_spaces.0.remove(pos); - if !style.inline.is_empty() { - into_spaces.0.insert(pos, style); - } - }, - _ => if !style.inline.is_empty() { - into_spaces.0.push(style) - } - } - } -} - -pub enum SpaceSet { - Margin(SpaceValue, SpaceValue, SpaceValue, SpaceValue), - MarginAll(SpaceValue), - MarginBoth(SpaceValue, SpaceValue), - MarginBottom(SpaceValue), - MarginLeft(SpaceValue), - MarginRight(SpaceValue), - MarginTop(SpaceValue), - Padding(SpaceValue, SpaceValue, SpaceValue, SpaceValue), - PaddingAll(SpaceValue), - PaddingBoth(SpaceValue, SpaceValue), - PaddingBottom(SpaceValue), - PaddingLeft(SpaceValue), - PaddingRight(SpaceValue), - PaddingTop(SpaceValue), -} - -impl SpaceSet { - fn add(&self, into_spaces: &mut Spaces) { - match self { - SpaceSet::Margin(top, right, bottom, left) => { - top.add(MARGIN_TOP, into_spaces); - right.add(MARGIN_RIGHT, into_spaces); - bottom.add(MARGIN_BOTTOM, into_spaces); - left.add(MARGIN_LEFT, into_spaces); - }, - SpaceSet::MarginAll(value) => { - value.add(MARGIN_TOP, into_spaces); - value.add(MARGIN_RIGHT, into_spaces); - value.add(MARGIN_BOTTOM, into_spaces); - value.add(MARGIN_LEFT, into_spaces); - }, - SpaceSet::MarginBoth(top_bottom, right_left) => { - top_bottom.add(MARGIN_TOP, into_spaces); - right_left.add(MARGIN_RIGHT, into_spaces); - top_bottom.add(MARGIN_BOTTOM, into_spaces); - right_left.add(MARGIN_LEFT, into_spaces); - }, - - SpaceSet::MarginBottom(value) => value.add(MARGIN_BOTTOM, into_spaces), - SpaceSet::MarginLeft(value) => value.add(MARGIN_LEFT, into_spaces), - SpaceSet::MarginRight(value) => value.add(MARGIN_RIGHT, into_spaces), - SpaceSet::MarginTop(value) => value.add(MARGIN_TOP, into_spaces), - - SpaceSet::Padding(top, right, bottom, left) => { - top.add(PADDING_TOP, into_spaces); - right.add(PADDING_RIGHT, into_spaces); - bottom.add(PADDING_BOTTOM, into_spaces); - left.add(PADDING_LEFT, into_spaces); - }, - SpaceSet::PaddingAll(value) => { - value.add(PADDING_TOP, into_spaces); - value.add(PADDING_RIGHT, into_spaces); - value.add(PADDING_BOTTOM, into_spaces); - value.add(PADDING_LEFT, into_spaces); - }, - SpaceSet::PaddingBoth(top_bottom, right_left) => { - top_bottom.add(PADDING_TOP, into_spaces); - right_left.add(PADDING_RIGHT, into_spaces); - top_bottom.add(PADDING_BOTTOM, into_spaces); - right_left.add(PADDING_LEFT, into_spaces); - }, - - SpaceSet::PaddingBottom(value) => value.add(PADDING_BOTTOM, into_spaces), - SpaceSet::PaddingLeft(value) => value.add(PADDING_LEFT, into_spaces), - SpaceSet::PaddingRight(value) => value.add(PADDING_RIGHT, into_spaces), - SpaceSet::PaddingTop(value) => value.add(PADDING_TOP, into_spaces), - } - } -} - -impl Spaces { - pub fn new() -> Self { - Spaces(Vec::new()) - } - - pub fn add(&mut self, spaces: &[SpaceSet]) -> &Self { - for i in 0..spaces.len() { - spaces[i].add(self); - } - self - } - - pub fn get(&self) -> Option<String> { - if self.0.len() == 0 { - None - } else { - let mut inline = "".to_owned(); - self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); - Some(inline) - } - } -} diff --git a/pagetop/src/html/unit.rs b/pagetop/src/html/unit.rs new file mode 100644 index 00000000..61641184 --- /dev/null +++ b/pagetop/src/html/unit.rs @@ -0,0 +1,52 @@ +use crate::concat_string; + +// About pixels: Pixels (px) are relative to the viewing device. For low-dpi +// devices, 1px is one device pixel (dot) of the display. For printers and high +// resolution screens 1px implies multiple device pixels. + +// About em: 2em means 2 times the size of the current font. The em and rem +// units are practical in creating perfectly scalable layout! + +// About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. + +pub enum UnitValue { + Auto, + + Cm(isize), // Centimeters. + In(isize), // Inches (1in = 96px = 2.54cm). + Mm(isize), // Millimeters. + Pc(isize), // Picas (1pc = 12pt). + Pt(isize), // Points (1pt = 1/72 of 1in). + Px(isize), // Pixels (1px = 1/96th of 1in). + + RelEm(f32), // Relative to the font-size of the element. + RelPct(f32), // Percentage relative to the parent element. + RelRem(f32), // Relative to font-size of the root element. + RelVh(f32), // Relative to 1% of the height of the viewport. + RelVw(f32), // Relative to 1% of the value of the viewport. + + UnSet, +} + +impl ToString for UnitValue { + fn to_string(&self) -> String { + match self { + UnitValue::Auto => "auto".to_owned(), + // Absolute value. + UnitValue::Cm(aw) => concat_string!(aw.to_string(), "cm"), + UnitValue::In(aw) => concat_string!(aw.to_string(), "in"), + UnitValue::Mm(aw) => concat_string!(aw.to_string(), "mm"), + UnitValue::Pc(aw) => concat_string!(aw.to_string(), "pc"), + UnitValue::Pt(aw) => concat_string!(aw.to_string(), "pt"), + UnitValue::Px(aw) => concat_string!(aw.to_string(), "px"), + // Relative value. + UnitValue::RelEm(rw) => concat_string!(rw.to_string(), "em"), + UnitValue::RelPct(rw) => concat_string!(rw.to_string(), "%"), + UnitValue::RelRem(rw) => concat_string!(rw.to_string(), "rem"), + UnitValue::RelVh(rw) => concat_string!(rw.to_string(), "vh"), + UnitValue::RelVw(rw) => concat_string!(rw.to_string(), "vw"), + + _ => "".to_owned(), + } + } +} diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 93e9e7e8..86f5c966 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -1,5 +1,5 @@ -pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; pub use fluent_templates; +pub use fluent_templates::{Loader as Locale, static_loader as static_locale}; pub use fluent_templates::fluent_bundle::FluentValue; #[macro_export] diff --git a/pagetop/static/bootsier/images/demo-pagetop.svg b/pagetop/static/theme/images/demo-pagetop.svg similarity index 100% rename from pagetop/static/bootsier/images/demo-pagetop.svg rename to pagetop/static/theme/images/demo-pagetop.svg From e8c904fac739977718004b6e3aa3c492ad0b1c9e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 12 Jul 2022 19:07:02 +0200 Subject: [PATCH 120/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 28d3c61b..1e9ce156 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.17" +version = "0.0.18" edition = "2021" authors = [ From 4ff9cfec0fe0d40ad92b77842c5350b1aa67535a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 13 Jul 2022 20:07:05 +0200 Subject: [PATCH 121/853] =?UTF-8?q?A=C3=B1ade=20opci=C3=B3n=20de=20borrar?= =?UTF-8?q?=20stylesheets=20y=20javascripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/icon.rs | 5 ++-- pagetop/src/base/component/menu.rs | 15 +++++++----- pagetop/src/base/theme/aliner.rs | 6 ++--- pagetop/src/base/theme/bootsier.rs | 22 ++++++++---------- pagetop/src/base/theme/bulmix.rs | 11 ++++----- pagetop/src/core/component/context.rs | 21 ++++++++--------- pagetop/src/html.rs | 2 +- pagetop/src/html/assets.rs | 29 +++++++++++++++++------ pagetop/src/html/assets/javascript.rs | 33 +++++++++++++++++++-------- pagetop/src/html/assets/stylesheet.rs | 31 ++++++++++++++++++------- 10 files changed, 109 insertions(+), 66 deletions(-) diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index d731940d..071c0b6e 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -35,8 +35,9 @@ impl ComponentTrait for Icon { fn before_render(&mut self, context: &mut InContext) { context - .add_stylesheet(StyleSheet::with_source( - "/theme/icons/bootstrap-icons.css?ver=1.8.2" + .with_stylesheet(AssetsOp::Add( + StyleSheet::located("/theme/icons/bootstrap-icons.css") + .with_version("1.8.2") )); self.alter_classes(concat_string!("bi-", self.icon_name()).as_str(), ClassesOp::SetDefault); diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 0531219d..8b8b1b9f 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -208,14 +208,17 @@ impl ComponentTrait for Menu { fn before_render(&mut self, context: &mut InContext) { context - .add_stylesheet(StyleSheet::with_source( - "/theme/menu/css/menu.css?ver=1.1.1" + .with_stylesheet(AssetsOp::Add( + StyleSheet::located("/theme/menu/css/menu.css") + .with_version("1.1.1") )) - .add_stylesheet(StyleSheet::with_source( - "/theme/menu/css/menu-clean.css?ver=1.1.1" + .with_stylesheet(AssetsOp::Add( + StyleSheet::located("/theme/menu/css/menu-clean.css") + .with_version("1.1.1") )) - .add_javascript(JavaScript::with_source( - "/theme/menu/js/menu.min.js?ver=1.1.1" + .with_javascript(AssetsOp::Add( + JavaScript::located("/theme/menu/js/menu.min.js") + .with_version("1.1.1") )) .add_jquery(); } diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 02ed19d3..10ff3379 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -20,11 +20,11 @@ impl ThemeTrait for Aliner { .with_favicon(Some(Favicon::new() .with_icon("/theme/favicon.png") )) - .add_stylesheet( - StyleSheet::with_source( + .with_stylesheet(AssetsOp::Add( + StyleSheet::located( "/aliner/css/styles.css" ) .with_weight(-99) - ); + )); } } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 3e875f30..ed9d431e 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -22,18 +22,16 @@ impl ThemeTrait for Bootsier { .with_favicon(Some(Favicon::new() .with_icon("/theme/favicon.png") )) - .add_stylesheet( - StyleSheet::with_source( - "/bootsier/css/bootstrap.min.css?ver=5.1.3" - ) - .with_weight(-99) - ) - .add_javascript( - JavaScript::with_source( - "/bootsier/js/bootstrap.bundle.min.js?ver=5.1.3" - ) - .with_weight(-99) - ) + .with_stylesheet(AssetsOp::Add( + StyleSheet::located("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99) + )) + .with_javascript(AssetsOp::Add( + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") + .with_weight(-99) + )) .add_jquery(); } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 77e0ce2b..72340600 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -20,12 +20,11 @@ impl ThemeTrait for Bulmix { .with_favicon(Some(Favicon::new() .with_icon("/theme/favicon.png") )) - .add_stylesheet( - StyleSheet::with_source( - "/bulmix/css/bulma.min.css?ver=0.9.4" - ) - .with_weight(-99) - ) + .with_stylesheet(AssetsOp::Add( + StyleSheet::located("/bulmix/css/bulma.min.css") + .with_version("0.9.4") + .with_weight(-99) + )) .add_jquery(); } diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index b0296e56..ef309f01 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -49,25 +49,24 @@ impl InContext { self } - pub fn add_stylesheet(&mut self, css: StyleSheet) -> &mut Self { - self.stylesheets.add(css); + pub fn with_stylesheet(&mut self, css: AssetsOp<StyleSheet>) -> &mut Self { + self.stylesheets.alter(css); self } - pub fn add_javascript(&mut self, js: JavaScript) -> &mut Self { - self.javascripts.add(js); + pub fn with_javascript(&mut self, js: AssetsOp<JavaScript>) -> &mut Self { + self.javascripts.alter(js); self } pub fn add_jquery(&mut self) -> &mut Self { if !self.with_jquery { - self.add_javascript( - JavaScript::with_source( - "/theme/js/jquery.min.js?ver=3.6.0" - ) - .with_weight(isize::MIN) - .with_mode(JSMode::Normal) - ); + self.with_javascript(AssetsOp::Add( + JavaScript::located("/theme/js/jquery.min.js") + .with_version("3.6.0") + .with_weight(isize::MIN) + .with_mode(JSMode::Normal) + )); self.with_jquery = true; } self diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 17d271a2..3d71db75 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -1,7 +1,7 @@ pub use maud::{DOCTYPE, Markup, PreEscaped, html}; mod assets; -pub use assets::Assets; +pub use assets::{Assets, AssetsOp, SourceValue}; pub use assets::javascript::{JavaScript, JSMode}; pub use assets::stylesheet::StyleSheet; diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 921d6816..96e52d2c 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -3,14 +3,20 @@ pub mod stylesheet; use crate::html::{Markup, html}; +pub type SourceValue = &'static str; + pub trait AssetsTrait { - fn source(&self) -> &'static str; + fn source(&self) -> SourceValue; fn weight(&self) -> isize; fn render(&self) -> Markup; } +pub enum AssetsOp<T: AssetsTrait> { + Add(T), + Remove(SourceValue), +} pub struct Assets<T>(Vec<T>); impl<T: AssetsTrait> Assets<T> { @@ -18,13 +24,22 @@ impl<T: AssetsTrait> Assets<T> { Assets::<T>(Vec::<T>::new()) } - pub fn add(&mut self, assets: T) -> &mut Self { - match self.0.iter().position(|x| x.source() == assets.source()) { - Some(index) => if self.0[index].weight() > assets.weight() { + pub fn alter(&mut self, op: AssetsOp<T>) -> &mut Self { + match op { + AssetsOp::Add(asset) => match self.0.iter().position( + |x| x.source() == asset.source() + ) { + Some(index) => if self.0[index].weight() > asset.weight() { + self.0.remove(index); + self.0.push(asset); + }, + _ => self.0.push(asset) + } + AssetsOp::Remove(source) => if let Some(index) = self.0.iter().position( + |x| x.source() == source + ) { self.0.remove(index); - self.0.push(assets); - }, - _ => self.0.push(assets) + } } self } diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 40cdfb07..08d7705a 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,17 +1,19 @@ use crate::html::{Markup, html}; -use super::AssetsTrait; +use super::{AssetsTrait, SourceValue}; #[derive(PartialEq)] pub enum JSMode { Async, Defer, Normal } pub struct JavaScript { - source: &'static str, - weight: isize, - mode : JSMode, + source : SourceValue, + prefix : &'static str, + version: &'static str, + weight : isize, + mode : JSMode, } impl AssetsTrait for JavaScript { - fn source(&self) -> &'static str { + fn source(&self) -> SourceValue { self.source } @@ -22,7 +24,7 @@ impl AssetsTrait for JavaScript { fn render(&self) -> Markup { html! { script type="text/javascript" - src=(self.source) + src=(crate::concat_string!(self.source, self.prefix, self.version)) async[self.mode == JSMode::Async] defer[self.mode == JSMode::Defer] {}; @@ -31,14 +33,25 @@ impl AssetsTrait for JavaScript { } impl JavaScript { - pub fn with_source(s: &'static str) -> Self { + pub fn located(source: SourceValue) -> Self { JavaScript { - source: s, - weight: 0, - mode : JSMode::Defer, + source, + prefix : "", + version: "", + weight : 0, + mode : JSMode::Defer, } } + pub fn with_version(mut self, version: &'static str) -> Self { + (self.prefix, self.version) = if version.is_empty() { + ("", "") + } else { + ("?ver=", version) + }; + self + } + pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index ff7da045..65f477fd 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,13 +1,15 @@ use crate::html::{Markup, html}; -use super::AssetsTrait; +use super::{AssetsTrait, SourceValue}; pub struct StyleSheet { - source: &'static str, - weight: isize, + source : SourceValue, + prefix : &'static str, + version: &'static str, + weight : isize, } impl AssetsTrait for StyleSheet { - fn source(&self) -> &'static str { + fn source(&self) -> SourceValue { self.source } @@ -17,19 +19,32 @@ impl AssetsTrait for StyleSheet { fn render(&self) -> Markup { html! { - link rel="stylesheet" href=(self.source); + link + rel="stylesheet" + href=(crate::concat_string!(self.source, self.prefix, self.version)); } } } impl StyleSheet { - pub fn with_source(s: &'static str) -> Self { + pub fn located(source: SourceValue) -> Self { StyleSheet { - source: s, - weight: 0, + source, + prefix : "", + version: "", + weight : 0, } } + pub fn with_version(mut self, version: &'static str) -> Self { + (self.prefix, self.version) = if version.is_empty() { + ("", "") + } else { + ("?ver=", version) + }; + self + } + pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self From 4b3fc945749ee9a888285cf26877e1192d2b3dd3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 13 Jul 2022 20:59:07 +0200 Subject: [PATCH 122/853] =?UTF-8?q?A=C3=B1ade=20la=20opci=C3=B3n=20de=20bo?= =?UTF-8?q?rrar=20clases=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html.rs | 2 +- pagetop/src/html/classes.rs | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 3d71db75..4e9d3355 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -15,7 +15,7 @@ mod identifier; pub use identifier::IdentifierValue; mod classes; -pub use classes::{Classes, ClassesOp}; +pub use classes::{Classes, ClassesOp, ClassValue}; mod unit; pub use unit::UnitValue; diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index a3766c59..2bc8421e 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,11 +1,14 @@ use crate::concat_string; +pub type ClassValue = &'static str; + pub enum ClassesOp { Add, - AddAfter(&'static str), - AddBefore(&'static str), + AddAfter(ClassValue), + AddBefore(ClassValue), AddFirst, - Replace(&'static str), + Remove, + Replace(ClassValue), Reset, SetDefault, SetDefaultIfEmpty, @@ -59,6 +62,17 @@ impl Classes { self.added = concat_string!(classes, " ", self.added).trim().to_owned() }, + ClassesOp::Remove => { + let v_list: Vec<&str> = classes.split_ascii_whitespace().collect(); + let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); + for class in v_list { + if let Some(pos) = v_added.iter().position(|c| c.eq(&class)) { + v_added.remove(pos); + } + } + self.added = v_added.join(" "); + }, + ClassesOp::Replace(class) => { let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); match v_added.iter().position(|c| c.eq(&class)) { From c593fc580130bb7e091e6442573a30994c5f2cde Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 14 Jul 2022 07:21:57 +0200 Subject: [PATCH 123/853] =?UTF-8?q?Modifica=20orden=20de=20par=C3=A1metros?= =?UTF-8?q?=20que=20modifica=20clases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop/src/base/component/anchor.rs | 12 ++-- pagetop/src/base/component/block.rs | 8 +-- pagetop/src/base/component/container.rs | 24 ++++---- pagetop/src/base/component/form/button.rs | 14 ++--- pagetop/src/base/component/form/date.rs | 10 ++-- pagetop/src/base/component/form/form.rs | 8 +-- pagetop/src/base/component/form/input.rs | 25 ++++---- pagetop/src/base/component/grid/column.rs | 34 +++++------ pagetop/src/base/component/grid/row.rs | 8 +-- pagetop/src/base/component/heading.rs | 12 ++-- pagetop/src/base/component/icon.rs | 10 ++-- pagetop/src/base/component/image.rs | 8 +-- pagetop/src/base/component/menu.rs | 8 +-- pagetop/src/base/component/paragraph.rs | 12 ++-- pagetop/src/base/module/demopage.rs | 59 ++++++++++--------- .../demopage/locales/en-US/demopage.ftl | 13 ++-- .../demopage/locales/es-ES/demopage.ftl | 13 ++-- pagetop/src/base/theme/bulmix.rs | 18 +++--- pagetop/src/html/classes.rs | 4 +- pagetop/src/response/page/definition.rs | 4 +- 22 files changed, 153 insertions(+), 155 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index d495ecaf..bb9d70b0 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -36,5 +36,5 @@ impl ModuleTrait for Admin { } fn before_render_page(page: &mut Page) { - page.alter_body_classes("test-admin", ClassesOp::Add); + page.alter_body_classes(ClassesOp::Add, "test-admin"); } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 5556fefe..1662e625 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -51,5 +51,5 @@ async fn node() -> app::Result<Markup> { } fn before_render_page(page: &mut Page) { - page.alter_body_classes("test-node", ClassesOp::Add); + page.alter_body_classes(ClassesOp::Add, "test-node"); } diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 2bb15ee4..b62676d7 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -125,8 +125,8 @@ impl Anchor { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -187,8 +187,8 @@ impl Anchor { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } @@ -199,10 +199,10 @@ impl Anchor { pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { self.anchor_type = anchor_type; - self.classes.alter(match self.anchor_type { + self.classes.alter(ClassesOp::SetDefault, match self.anchor_type { AnchorType::Button => "btn btn-primary", _ => "", - }, ClassesOp::SetDefault); + }); self } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 6120af0b..7daf3ebe 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -80,8 +80,8 @@ impl Block { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -117,8 +117,8 @@ impl Block { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 013f7294..b1839901 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -90,25 +90,25 @@ impl ComponentTrait for Container { impl Container { pub fn header() -> Self { - let mut c = Container::new().with_classes("header", ClassesOp::SetDefault); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "header"); c.container_type = ContainerType::Header; c } pub fn footer() -> Self { - let mut c = Container::new().with_classes("footer", ClassesOp::SetDefault); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "footer"); c.container_type = ContainerType::Footer; c } pub fn main() -> Self { - let mut c = Container::new().with_classes("main", ClassesOp::SetDefault); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "main"); c.container_type = ContainerType::Main; c } pub fn section() -> Self { - let mut c = Container::new().with_classes("section", ClassesOp::SetDefault); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "section"); c.container_type = ContainerType::Section; c } @@ -130,13 +130,13 @@ impl Container { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } - pub fn with_inner_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_inner_classes(classes, op); + pub fn with_inner_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_inner_classes(op, classes); self } @@ -167,13 +167,13 @@ impl Container { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } - pub fn alter_inner_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.inner_classes.alter(classes, op); + pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.inner_classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index a03a0e45..6a01a1a3 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -29,7 +29,7 @@ impl ComponentTrait for Button { disabled : AttributeValue::new(), template : "default".to_owned(), } - .with_classes("form-button", ClassesOp::AddFirst) + .with_classes(ClassesOp::AddFirst, "form-button") } fn handler(&self) -> &'static str { @@ -88,7 +88,7 @@ impl Button { pub fn reset(value: &str) -> Self { let mut button = Button::new() - .with_classes("form-reset", ClassesOp::Replace("form-button")) + .with_classes(ClassesOp::Replace("form-button"), "form-reset") .with_value(value); button.button_type = ButtonType::Reset; button @@ -96,7 +96,7 @@ impl Button { pub fn submit(value: &str) -> Self { let mut button = Button::new() - .with_classes("form-submit", ClassesOp::Replace("form-button")) + .with_classes(ClassesOp::Replace("form-button"), "form-submit") .with_value(value); button.button_type = ButtonType::Submit; button @@ -114,8 +114,8 @@ impl Button { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -156,8 +156,8 @@ impl Button { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index a008ca97..1772e718 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -37,7 +37,7 @@ impl ComponentTrait for Date { help_text : AttributeValue::new(), template : "default".to_owned(), } - .with_classes("form-type-date", ClassesOp::AddFirst) + .with_classes(ClassesOp::AddFirst, "form-type-date") } fn handler(&self) -> &'static str { @@ -114,8 +114,8 @@ impl Date { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -186,8 +186,8 @@ impl Date { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 363096ab..65269ca4 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -89,8 +89,8 @@ impl Form { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -136,8 +136,8 @@ impl Form { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index df2789ff..0ee01c67 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -47,7 +47,7 @@ impl ComponentTrait for Input { help_text : AttributeValue::new(), template : "default".to_owned(), } - .with_classes("form-type-textfield", ClassesOp::AddFirst) + .with_classes(ClassesOp::AddFirst, "form-type-textfield") } fn handler(&self) -> &'static str { @@ -128,35 +128,35 @@ impl Input { pub fn password() -> Self { let mut input = Input::new() - .with_classes("form-type-password", ClassesOp::Replace("form-type-textfield")); + .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-password"); input.input_type = InputType::Password; input } pub fn search() -> Self { let mut input = Input::new() - .with_classes("form-type-search", ClassesOp::Replace("form-type-textfield")); + .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-search"); input.input_type = InputType::Search; input } pub fn email() -> Self { let mut input = Input::new() - .with_classes("form-type-email", ClassesOp::Replace("form-type-textfield")); + .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-email"); input.input_type = InputType::Email; input } pub fn telephone() -> Self { let mut input = Input::new() - .with_classes("form-type-telephone", ClassesOp::Replace("form-type-textfield")); + .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-telephone"); input.input_type = InputType::Telephone; input } pub fn url() -> Self { let mut input = Input::new() - .with_classes("form-type-url", ClassesOp::Replace("form-type-textfield")); + .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-url"); input.input_type = InputType::Url; input } @@ -173,8 +173,8 @@ impl Input { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -260,16 +260,15 @@ impl Input { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.with_value(name); - self.alter_classes( - concat_string!("form-item form-item-", name).as_str(), - ClassesOp::SetDefault + self.alter_classes(ClassesOp::SetDefault, + concat_string!("form-item form-item-", name).as_str() ); self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index d535f2e2..127a6d33 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -56,19 +56,19 @@ impl ComponentTrait for Column { fn before_render(&mut self, _context: &mut InContext) { match self.size() { - ColumnSize::Default => self.alter_classes("col-sm", ClassesOp::SetDefault), - ColumnSize::Is1of12 => self.alter_classes("col-sm-1", ClassesOp::SetDefault), - ColumnSize::Is2of12 => self.alter_classes("col-sm-2", ClassesOp::SetDefault), - ColumnSize::Is3of12 => self.alter_classes("col-sm-3", ClassesOp::SetDefault), - ColumnSize::Is4of12 => self.alter_classes("col-sm-4", ClassesOp::SetDefault), - ColumnSize::Is5of12 => self.alter_classes("col-sm-5", ClassesOp::SetDefault), - ColumnSize::Is6of12 => self.alter_classes("col-sm-6", ClassesOp::SetDefault), - ColumnSize::Is7of12 => self.alter_classes("col-sm-7", ClassesOp::SetDefault), - ColumnSize::Is8of12 => self.alter_classes("col-sm-8", ClassesOp::SetDefault), - ColumnSize::Is9of12 => self.alter_classes("col-sm-9", ClassesOp::SetDefault), - ColumnSize::Is10of12 => self.alter_classes("col-sm-10", ClassesOp::SetDefault), - ColumnSize::Is11of12 => self.alter_classes("col-sm-11", ClassesOp::SetDefault), - ColumnSize::IsFull => self.alter_classes("col-sm-12", ClassesOp::SetDefault), + ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, "col-md"), + ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-1"), + ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-2"), + ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-3"), + ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-4"), + ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-5"), + ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-6"), + ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-7"), + ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-8"), + ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-9"), + ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-10"), + ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-11"), + ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, "col-md-12"), }; } @@ -108,8 +108,8 @@ impl Column { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -150,8 +150,8 @@ impl Column { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index eb59ed9e..ce91033d 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -73,8 +73,8 @@ impl Row { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -110,8 +110,8 @@ impl Row { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 41e9d28a..86094fb1 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -115,8 +115,8 @@ impl Heading { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -157,8 +157,8 @@ impl Heading { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } @@ -174,7 +174,7 @@ impl Heading { pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; - self.classes.alter(match &self.display() { + self.classes.alter(ClassesOp::SetDefault, match &self.display() { HeadingDisplay::XxLarge => "display-2", HeadingDisplay::Large => "display-3", HeadingDisplay::Medium => "display-4", @@ -182,7 +182,7 @@ impl Heading { HeadingDisplay::XxSmall => "display-6", HeadingDisplay::Normal => "", HeadingDisplay::Subtitle => "", - }, ClassesOp::SetDefault); + }); self } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 071c0b6e..00b919b1 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -40,7 +40,7 @@ impl ComponentTrait for Icon { .with_version("1.8.2") )); - self.alter_classes(concat_string!("bi-", self.icon_name()).as_str(), ClassesOp::SetDefault); + self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", self.icon_name()).as_str()); } fn default_render(&self, _context: &mut InContext) -> Markup { @@ -78,8 +78,8 @@ impl Icon { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -105,8 +105,8 @@ impl Icon { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index adf64b53..a7cccdf2 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -75,8 +75,8 @@ impl Image { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -107,8 +107,8 @@ impl Image { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 8b8b1b9f..fe0689eb 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -266,8 +266,8 @@ impl Menu { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -298,8 +298,8 @@ impl Menu { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index afdf7f6c..564710cc 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -83,8 +83,8 @@ impl Paragraph { self } - pub fn with_classes(mut self, classes: &str, op: ClassesOp) -> Self { - self.alter_classes(classes, op); + pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_classes(op, classes); self } @@ -120,8 +120,8 @@ impl Paragraph { self } - pub fn alter_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.classes.alter(classes, op); + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter(op, classes); self } @@ -132,14 +132,14 @@ impl Paragraph { pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { self.display = display; - self.classes.alter(match &self.display() { + self.classes.alter(ClassesOp::SetDefault, match &self.display() { ParagraphDisplay::XxLarge => "fs-2", ParagraphDisplay::Large => "fs-3", ParagraphDisplay::Medium => "fs-4", ParagraphDisplay::Small => "fs-5", ParagraphDisplay::XxSmall => "fs-6", ParagraphDisplay::Normal => "", - }, ClassesOp::SetDefault); + }); self } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index 1a5e4235..7c1eb22a 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -28,7 +28,7 @@ async fn demo() -> app::Result<Markup> { Page::new() .with_title(l("page_title").as_str()) .add_to("content", hello_world()) - .add_to("content", just_visiting()) + .add_to("content", welcome()) .add_to("content", about_pagetop()) .add_to("content", promo_pagetop()) .add_to("content", reporting_problems()) @@ -39,10 +39,16 @@ fn hello_world() -> Container { Container::header() .with_id("hello-world") .with_component(grid::Row::new() - .with_layout( - &[LayoutSet::PaddingSide(UnitValue::RelEm(2.0), UnitValue::RelPct(5.0))] - ) + .with_layout(&[ + LayoutSet::PaddingTop(UnitValue::RelEm(2.0)), + LayoutSet::PaddingBottom(UnitValue::RelEm(2.0)), + LayoutSet::PaddingLeft(UnitValue::RelPct(2.0)), + ]) .with_column(grid::Column::new() + .with_layout(&[ + LayoutSet::PaddingTop(UnitValue::RelEm(2.0)), + LayoutSet::PaddingBottom(UnitValue::RelEm(2.0)), + ]) .with_size(grid::ColumnSize::Is4of12) .with_component(Heading::h1(html! { (l("page_title")) @@ -50,18 +56,14 @@ fn hello_world() -> Container { .with_display(HeadingDisplay::Medium) ) .with_component(Paragraph::with(html! { - (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) - }) - ) - .with_component(Paragraph::with(html! { - (e("welcome_intro", &args![ + (e("hello_intro", &args![ "app" => format!("<strong>{}</strong>", &SETTINGS.app.name) ])) }) .with_display(ParagraphDisplay::Small) ) .with_component(Paragraph::with(html! { - (e("welcome_pagetop", &args![ + (e("hello_pagetop", &args![ "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" ])) }) @@ -87,13 +89,13 @@ fn hello_world() -> Container { ) } -fn just_visiting() -> Container { +fn welcome() -> Container { Container::new() .with_id("visiting") .with_component(grid::Row::new() - .with_layout( - &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] - ) + .with_layout(&[ + LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) + ]) .with_column(grid::Column::new() .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) .with_size(grid::ColumnSize::Is5of12) @@ -105,20 +107,19 @@ fn just_visiting() -> Container { LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), ]) .with_component(Heading::h2(html! { - (l("visiting_title")) - }) - ) + (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) + })) .with_component(Heading::h3(html! { - (l("visiting_subtitle")) + (l("welcome_subtitle")) }) .with_display(HeadingDisplay::Subtitle) ) .with_component(Paragraph::with(html! { - (l("visiting_text1")) + (l("welcome_text1")) }) .with_display(ParagraphDisplay::Small) ) - .with_component(Paragraph::with(html! { (l("visiting_text2")) })) + .with_component(Paragraph::with(html! { (l("welcome_text2")) })) ) ) } @@ -127,9 +128,9 @@ fn about_pagetop() -> Container { Container::new() .with_id("pagetop") .with_component(grid::Row::new() - .with_layout( - &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] - ) + .with_layout(&[ + LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) + ]) .with_column(grid::Column::new() .with_layout(&[ LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), @@ -165,9 +166,9 @@ fn promo_pagetop() -> Container { Container::new() .with_id("promo") .with_component(grid::Row::new() - .with_layout( - &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] - ) + .with_layout(&[ + LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) + ]) .with_column(grid::Column::new() .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) .with_size(grid::ColumnSize::Is5of12) @@ -197,9 +198,9 @@ fn reporting_problems() -> Container { Container::new() .with_id("reporting") .with_component(grid::Row::new() - .with_layout( - &[LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0))] - ) + .with_layout(&[ + LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) + ]) .with_column(grid::Column::new() .with_layout(&[ LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), diff --git a/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl index 27749979..87e0ddf0 100644 --- a/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl +++ b/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl @@ -3,14 +3,13 @@ module_description = Displays a demo homepage when none is configured. page_title = Hello world! -welcome_to = Welcome to { $app } -welcome_intro = This page is used to test the proper operation of { $app } after installation. -welcome_pagetop = This web solution is powered by { $pagetop }. +hello_intro = This page is used to test the proper operation of { $app } after installation. +hello_pagetop = This web solution is powered by { $pagetop }. -visiting_title = Just visiting? -visiting_subtitle = Are you user of this website? -visiting_text1 = If you don't know what this page is about, this probably means that the site is either experiencing problems or is undergoing routine maintenance. -visiting_text2 = If the problem persists, please contact your system administrator. +welcome_to = Welcome to { $app } +welcome_subtitle = Are you user of this website? +welcome_text1 = If you don't know what this page is about, this probably means that the site is either experiencing problems or is undergoing routine maintenance. +welcome_text2 = If the problem persists, please contact your system administrator. pagetop_title = About PageTop pagetop_text1 = If you can read this page, it means that the PageTop server is working properly, but has not yet been configured. diff --git a/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl index e9bdd97f..67afd423 100644 --- a/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl +++ b/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl @@ -3,14 +3,13 @@ module_description = Muestra una página de demostración predeterminada cuando page_title = ¡Hola mundo! -welcome_to = Bienvenido a { $app } -welcome_intro = Esta página se utiliza para probar el correcto funcionamiento de { $app } después de la instalación. -welcome_pagetop = Esta solución web funciona con { $pagetop }. +hello_intro = Esta página se utiliza para probar el correcto funcionamiento de { $app } después de la instalación. +hello_pagetop = Esta solución web funciona con { $pagetop }. -visiting_title = ¿Sólo de visita? -visiting_subtitle = ¿Eres usuario de este sitio web? -visiting_text1 = Si no sabes de qué trata esta página, probablemente significa que el sitio está experimentando problemas o está pasando por un mantenimiento de rutina. -visiting_text2 = Si el problema persiste, póngase en contacto con el administrador del sistema. +welcome_to = Bienvenido a { $app } +welcome_subtitle = ¿Eres usuario de este sitio web? +welcome_text1 = Si no sabes de qué trata esta página, probablemente significa que el sitio está experimentando problemas o está pasando por un mantenimiento de rutina. +welcome_text2 = Si el problema persiste, póngase en contacto con el administrador del sistema. pagetop_title = Sobre PageTop pagetop_text1 = Si puedes leer esta página, significa que el servidor PageTop funciona correctamente, pero aún no se ha configurado. diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 72340600..23546c61 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -36,14 +36,14 @@ impl ThemeTrait for Bulmix { match component.handler() { ANCHOR_COMPONENT => { let a = component_mut::<Anchor>(component); - a.alter_classes(match a.anchor_type() { + a.alter_classes(ClassesOp::SetDefault, match a.anchor_type() { AnchorType::Button => "button is-primary", _ => "", - }, ClassesOp::SetDefault); + }); }, HEADING_COMPONENT => { let h = component_mut::<Heading>(component); - h.alter_classes(match h.display() { + h.alter_classes(ClassesOp::SetDefault, match h.display() { HeadingDisplay::XxLarge => "title is-1", HeadingDisplay::Large => "title is-2", HeadingDisplay::Medium => "title is-3", @@ -51,22 +51,22 @@ impl ThemeTrait for Bulmix { HeadingDisplay::XxSmall => "title is-5", HeadingDisplay::Normal => "title", HeadingDisplay::Subtitle => "subtitle", - }, ClassesOp::SetDefault); + }); }, PARAGRAPH_COMPONENT => { let p = component_mut::<Paragraph>(component); - p.alter_classes(match p.display() { + p.alter_classes(ClassesOp::SetDefault, match p.display() { ParagraphDisplay::XxLarge => "is-size-2", ParagraphDisplay::Large => "is-size-3", ParagraphDisplay::Medium => "is-size-4", ParagraphDisplay::Small => "is-size-5", ParagraphDisplay::XxSmall => "is-size-6", ParagraphDisplay::Normal => "", - }, ClassesOp::SetDefault); + }); }, grid::COLUMN_COMPONENT => { let col = component_mut::<grid::Column>(component); - col.alter_classes(concat_string!("column", match col.size() { + col.alter_classes(ClassesOp::SetDefault, concat_string!("column", match col.size() { grid::ColumnSize::Default => "", grid::ColumnSize::Is1of12 => " is-1", grid::ColumnSize::Is2of12 => " is-2", @@ -80,11 +80,11 @@ impl ThemeTrait for Bulmix { grid::ColumnSize::Is10of12 => " is-10", grid::ColumnSize::Is11of12 => " is-11", grid::ColumnSize::IsFull => " is-12", - }, " content").as_str(), ClassesOp::SetDefault); + }, " content").as_str()); }, grid::ROW_COMPONENT => { let row = component_mut::<grid::Row>(component); - row.alter_classes("columns", ClassesOp::SetDefault); + row.alter_classes(ClassesOp::SetDefault, "columns"); }, _ => {}, } diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 2bc8421e..4268220c 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -29,11 +29,11 @@ impl Classes { pub fn new_with_default(default: &str) -> Self { let mut classes = Self::new(); - classes.alter(default, ClassesOp::SetDefault); + classes.alter(ClassesOp::SetDefault, default); classes } - pub fn alter(&mut self, classes: &str, op: ClassesOp) -> &Self { + pub fn alter(&mut self, op: ClassesOp, classes: &str) -> &Self { let classes = classes.trim(); match op { ClassesOp::Add => { diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 28c10c8f..3c3d9a9f 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -107,8 +107,8 @@ impl<'a> Page<'a> { self } - pub fn alter_body_classes(&mut self, classes: &str, op: ClassesOp) -> &mut Self { - self.body_classes.alter(classes, op); + pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.body_classes.alter(op, classes); self } From e011c9269a9b0b61234d778306548a226785b0d0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 14 Jul 2022 22:44:51 +0200 Subject: [PATCH 124/853] =?UTF-8?q?Elimina=20la=20asignaci=C3=B3n=20de=20m?= =?UTF-8?q?=C3=A1rgenes/espaciado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 2 +- pagetop/src/base/component/anchor.rs | 17 --- pagetop/src/base/component/grid/column.rs | 18 +-- pagetop/src/base/component/grid/row.rs | 18 +-- pagetop/src/base/component/icon.rs | 22 +-- pagetop/src/base/component/menu.rs | 14 +- pagetop/src/base/module/demopage.rs | 45 ------ pagetop/src/base/theme/aliner.rs | 10 +- pagetop/src/base/theme/bootsier.rs | 16 +-- pagetop/src/base/theme/bulmix.rs | 14 +- pagetop/src/core/component.rs | 2 +- pagetop/src/core/component/context.rs | 69 ++++----- pagetop/src/core/theme/definition.rs | 8 +- pagetop/src/html.rs | 6 - pagetop/src/html/classes.rs | 2 +- pagetop/src/html/layout.rs | 165 ---------------------- pagetop/src/html/unit.rs | 52 ------- pagetop/src/response/page/definition.rs | 98 +++++++++---- 18 files changed, 142 insertions(+), 436 deletions(-) delete mode 100644 pagetop/src/html/layout.rs delete mode 100644 pagetop/src/html/unit.rs diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 77a192b3..ffb1d014 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -34,7 +34,7 @@ pub async fn summary() -> app::Result<Markup> { Page::new() - .using_theme("Bootsier") + .with_context(InContextOp::SetTheme("Bootsier")) .with_title("Admin") diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index b62676d7..25c9a33e 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -23,7 +23,6 @@ pub struct Anchor { weight : isize, id : IdentifierValue, classes : Classes, - layout : InlineLayout, anchor_type: AnchorType, href : AttributeValue, html : Markup, @@ -40,7 +39,6 @@ impl ComponentTrait for Anchor { weight : 0, id : IdentifierValue::new(), classes : Classes::new(), - layout : InlineLayout::new(), anchor_type: AnchorType::Link, href : AttributeValue::new(), html : html! {}, @@ -75,7 +73,6 @@ impl ComponentTrait for Anchor { a id=[self.id().get()] class=[self.classes().get()] - style=[self.layout().get()] href=[self.href().get()] target=[target] { @@ -130,11 +127,6 @@ impl Anchor { self } - pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { - self.alter_layout(layout); - self - } - pub fn with_type(mut self, anchor_type: AnchorType) -> Self { self.alter_type(anchor_type); self @@ -192,11 +184,6 @@ impl Anchor { self } - pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { - self.layout.set(layout); - self - } - pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { self.anchor_type = anchor_type; self.classes.alter(ClassesOp::SetDefault, match self.anchor_type { @@ -248,10 +235,6 @@ impl Anchor { &self.classes } - pub fn layout(&self) -> &InlineLayout { - &self.layout - } - pub fn anchor_type(&self) -> &AnchorType { &self.anchor_type } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 127a6d33..6fbc1989 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -22,7 +22,6 @@ pub struct Column { weight : isize, id : IdentifierValue, classes : Classes, - layout : InlineLayout, size : ColumnSize, components: ComponentsBundle, template : String, @@ -35,7 +34,6 @@ impl ComponentTrait for Column { weight : 0, id : IdentifierValue::new(), classes : Classes::new(), - layout : InlineLayout::new(), size : ColumnSize::Default, components: ComponentsBundle::new(), template : "default".to_owned(), @@ -74,7 +72,7 @@ impl ComponentTrait for Column { fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] style=[self.layout().get()] { + div id=[self.id().get()] class=[self.classes().get()] { (self.components().render(context)) } } @@ -113,11 +111,6 @@ impl Column { self } - pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { - self.alter_layout(layout); - self - } - pub fn with_size(mut self, size: ColumnSize) -> Self { self.alter_size(size); self @@ -155,11 +148,6 @@ impl Column { self } - pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { - self.layout.set(layout); - self - } - pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { self.size = size; self @@ -184,10 +172,6 @@ impl Column { &self.classes } - pub fn layout(&self) -> &InlineLayout { - &self.layout - } - pub fn size(&self) -> &ColumnSize { &self.size } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index ce91033d..2681ae9b 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -7,7 +7,6 @@ pub struct Row { weight : isize, id : IdentifierValue, classes : Classes, - layout : InlineLayout, columns : ComponentsBundle, template : String, } @@ -19,7 +18,6 @@ impl ComponentTrait for Row { weight : 0, id : IdentifierValue::new(), classes : Classes::new_with_default("row"), - layout : InlineLayout::new(), columns : ComponentsBundle::new(), template : "default".to_owned(), } @@ -39,7 +37,7 @@ impl ComponentTrait for Row { fn default_render(&self, context: &mut InContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] style=[self.layout().get()] { + div id=[self.id().get()] class=[self.classes().get()] { (self.columns().render(context)) } } @@ -78,11 +76,6 @@ impl Row { self } - pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { - self.alter_layout(layout); - self - } - pub fn with_column(mut self, column: grid::Column) -> Self { self.alter_column(column); self @@ -115,11 +108,6 @@ impl Row { self } - pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { - self.layout.set(layout); - self - } - pub fn alter_column(&mut self, column: grid::Column) -> &mut Self { self.columns.add(column); self @@ -140,10 +128,6 @@ impl Row { &self.classes } - pub fn layout(&self) -> &InlineLayout { - &self.layout - } - pub fn columns(&self) -> &ComponentsBundle { &self.columns } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 00b919b1..e3f2ede0 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -7,7 +7,6 @@ pub struct Icon { weight : isize, icon_name : String, classes : Classes, - layout : InlineLayout, } impl ComponentTrait for Icon { @@ -17,7 +16,6 @@ impl ComponentTrait for Icon { weight : 0, icon_name : "question-circle-fill".to_owned(), classes : Classes::new(), - layout : InlineLayout::new(), } } @@ -35,16 +33,16 @@ impl ComponentTrait for Icon { fn before_render(&mut self, context: &mut InContext) { context - .with_stylesheet(AssetsOp::Add( + .alter(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/theme/icons/bootstrap-icons.css") .with_version("1.8.2") - )); + ))); self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", self.icon_name()).as_str()); } fn default_render(&self, _context: &mut InContext) -> Markup { - html! { i class=[self.classes().get()] style=[self.layout().get()] {}; } + html! { i class=[self.classes().get()] {}; } } fn as_ref_any(&self) -> &dyn AnyComponent { @@ -83,11 +81,6 @@ impl Icon { self } - pub fn with_layout(mut self, layout: &[LayoutSet]) -> Self { - self.alter_layout(layout); - self - } - // Icon ALTER. pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { @@ -110,11 +103,6 @@ impl Icon { self } - pub fn alter_layout(&mut self, layout: &[LayoutSet]) -> &mut Self { - self.layout.set(layout); - self - } - // Icon GETTERS. pub fn icon_name(&self) -> &str { @@ -124,8 +112,4 @@ impl Icon { pub fn classes(&self) -> &Classes { &self.classes } - - pub fn layout(&self) -> &InlineLayout { - &self.layout - } } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index fe0689eb..c0c8a0b3 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -208,19 +208,19 @@ impl ComponentTrait for Menu { fn before_render(&mut self, context: &mut InContext) { context - .with_stylesheet(AssetsOp::Add( + .alter(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/theme/menu/css/menu.css") .with_version("1.1.1") - )) - .with_stylesheet(AssetsOp::Add( + ))) + .alter(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/theme/menu/css/menu-clean.css") .with_version("1.1.1") - )) - .with_javascript(AssetsOp::Add( + ))) + .alter(InContextOp::JavaScript(AssetsOp::Add( JavaScript::located("/theme/menu/js/menu.min.js") .with_version("1.1.1") - )) - .add_jquery(); + ))) + .alter(InContextOp::AddJQuery); } fn default_render(&self, context: &mut InContext) -> Markup { diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index 7c1eb22a..ac9e120e 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -39,16 +39,7 @@ fn hello_world() -> Container { Container::header() .with_id("hello-world") .with_component(grid::Row::new() - .with_layout(&[ - LayoutSet::PaddingTop(UnitValue::RelEm(2.0)), - LayoutSet::PaddingBottom(UnitValue::RelEm(2.0)), - LayoutSet::PaddingLeft(UnitValue::RelPct(2.0)), - ]) .with_column(grid::Column::new() - .with_layout(&[ - LayoutSet::PaddingTop(UnitValue::RelEm(2.0)), - LayoutSet::PaddingBottom(UnitValue::RelEm(2.0)), - ]) .with_size(grid::ColumnSize::Is4of12) .with_component(Heading::h1(html! { (l("page_title")) @@ -72,10 +63,6 @@ fn hello_world() -> Container { ("Offered services") }) .with_left_icon(Icon::with("card-checklist")) - .with_layout(&[ - LayoutSet::PaddingSide(UnitValue::UnSet, UnitValue::RelEm(1.5)), - LayoutSet::RadiusAll(UnitValue::RelEm(1.5)), - ]) ) .with_component(Anchor::button("#", html! { ("Get quote") @@ -93,19 +80,11 @@ fn welcome() -> Container { Container::new() .with_id("visiting") .with_component(grid::Row::new() - .with_layout(&[ - LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) - ]) .with_column(grid::Column::new() - .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) .with_size(grid::ColumnSize::Is5of12) .with_component(Image::image("/theme/images/demo-visiting.svg")) ) .with_column(grid::Column::new() - .with_layout(&[ - LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), - LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), - ]) .with_component(Heading::h2(html! { (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) })) @@ -128,14 +107,7 @@ fn about_pagetop() -> Container { Container::new() .with_id("pagetop") .with_component(grid::Row::new() - .with_layout(&[ - LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) - ]) .with_column(grid::Column::new() - .with_layout(&[ - LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), - LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), - ]) .with_size(grid::ColumnSize::Is7of12) .with_component(Heading::h2(html! { (l("pagetop_title")) @@ -156,7 +128,6 @@ fn about_pagetop() -> Container { ) ) .with_column(grid::Column::new() - .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) .with_component(Image::image("/theme/images/demo-pagetop.svg")) ) ) @@ -166,19 +137,11 @@ fn promo_pagetop() -> Container { Container::new() .with_id("promo") .with_component(grid::Row::new() - .with_layout(&[ - LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) - ]) .with_column(grid::Column::new() - .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) .with_size(grid::ColumnSize::Is5of12) .with_component(Image::image("/theme/images/demo-pagetop.svg")) ) .with_column(grid::Column::new() - .with_layout(&[ - LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), - LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), - ]) .with_component(Heading::h2(html! { (l("pagetop_promo_title")) }) @@ -198,14 +161,7 @@ fn reporting_problems() -> Container { Container::new() .with_id("reporting") .with_component(grid::Row::new() - .with_layout(&[ - LayoutSet::PaddingSide(UnitValue::RelEm(1.0), UnitValue::RelPct(5.0)) - ]) .with_column(grid::Column::new() - .with_layout(&[ - LayoutSet::PaddingTop(UnitValue::RelPct(2.5)), - LayoutSet::PaddingLeft(UnitValue::RelPct(5.0)), - ]) .with_size(grid::ColumnSize::Is7of12) .with_component(Heading::h2(html! { (l("report_problems_title")) @@ -222,7 +178,6 @@ fn reporting_problems() -> Container { ) ) .with_column(grid::Column::new() - .with_layout(&[LayoutSet::PaddingAll(UnitValue::RelPct(2.0))]) .with_component(Image::image("/theme/images/demo-pagetop.svg")) ) ) diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 10ff3379..e7a76922 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -16,15 +16,15 @@ impl ThemeTrait for Aliner { } fn before_render_page(&self, page: &mut Page) { - page.context() - .with_favicon(Some(Favicon::new() + page + .alter_context(InContextOp::Favicon(Some(Favicon::new() .with_icon("/theme/favicon.png") - )) - .with_stylesheet(AssetsOp::Add( + ))) + .alter_context(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located( "/aliner/css/styles.css" ) .with_weight(-99) - )); + ))); } } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index ed9d431e..582a5499 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -18,21 +18,21 @@ impl ThemeTrait for Bootsier { } fn before_render_page(&self, page: &mut Page) { - page.context() - .with_favicon(Some(Favicon::new() + page + .alter_context(InContextOp::Favicon(Some(Favicon::new() .with_icon("/theme/favicon.png") - )) - .with_stylesheet(AssetsOp::Add( + ))) + .alter_context(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/bootsier/css/bootstrap.min.css") .with_version("5.1.3") .with_weight(-99) - )) - .with_javascript(AssetsOp::Add( + ))) + .alter_context(InContextOp::JavaScript(AssetsOp::Add( JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") .with_version("5.1.3") .with_weight(-99) - )) - .add_jquery(); + ))) + .alter_context(InContextOp::AddJQuery); } fn render_error_page(&self, mut s: app::http::StatusCode) -> app::Result<Markup> { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 23546c61..e46d601a 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -16,16 +16,16 @@ impl ThemeTrait for Bulmix { } fn before_render_page(&self, page: &mut Page) { - page.context() - .with_favicon(Some(Favicon::new() + page + .alter_context(InContextOp::Favicon(Some(Favicon::new() .with_icon("/theme/favicon.png") - )) - .with_stylesheet(AssetsOp::Add( + ))) + .alter_context(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/bulmix/css/bulma.min.css") .with_version("0.9.4") .with_weight(-99) - )) - .add_jquery(); + ))) + .alter_context(InContextOp::AddJQuery); } fn before_render_component( @@ -100,7 +100,7 @@ impl ThemeTrait for Bulmix { let icon = component_ref::<Icon>(component); Some(html! { span class="icon" { - i class=[icon.classes().get()] style=[icon.layout().get()] {}; + i class=[icon.classes().get()] {}; } }) }, diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index ef3e33d5..3e3c9dec 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -5,7 +5,7 @@ pub use hook::{ }; mod context; -pub use context::InContext; +pub use context::{InContext, InContextOp}; mod definition; pub use definition::{ diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index ef309f01..3f9de74a 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -11,6 +11,15 @@ static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { } }); +pub enum InContextOp { + AddMetadata(&'static str, &'static str), + Favicon(Option<Favicon>), + SetTheme(&'static str), + StyleSheet(AssetsOp<StyleSheet>), + JavaScript(AssetsOp<JavaScript>), + AddJQuery, +} + pub struct InContext { theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, @@ -34,40 +43,32 @@ impl InContext { } } - pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); - self - } - - pub fn with_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { - self.favicon = favicon; - self - } - - pub fn add_metadata(&mut self, name: String, content: String) -> &mut Self { - self.metadata.push((name, content)); - self - } - - pub fn with_stylesheet(&mut self, css: AssetsOp<StyleSheet>) -> &mut Self { - self.stylesheets.alter(css); - self - } - - pub fn with_javascript(&mut self, js: AssetsOp<JavaScript>) -> &mut Self { - self.javascripts.alter(js); - self - } - - pub fn add_jquery(&mut self) -> &mut Self { - if !self.with_jquery { - self.with_javascript(AssetsOp::Add( - JavaScript::located("/theme/js/jquery.min.js") - .with_version("3.6.0") - .with_weight(isize::MIN) - .with_mode(JSMode::Normal) - )); - self.with_jquery = true; + pub fn alter(&mut self, op: InContextOp) -> &mut Self { + match op { + InContextOp::AddMetadata(name, content) => { + self.metadata.push((name.to_owned(), content.to_owned())); + }, + InContextOp::Favicon(favicon) => { + self.favicon = favicon; + }, + InContextOp::SetTheme(theme_name) => { + self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); + }, + InContextOp::StyleSheet(css) => { + self.stylesheets.alter(css); + }, + InContextOp::JavaScript(js) => { + self.javascripts.alter(js); + }, + InContextOp::AddJQuery => if !self.with_jquery { + self.javascripts.alter(AssetsOp::Add( + JavaScript::located("/theme/js/jquery.min.js") + .with_version("3.6.0") + .with_weight(isize::MIN) + .with_mode(JSMode::Normal) + )); + self.with_jquery = true; + }, } self } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 5d784875..8b63d833 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,7 @@ use crate::{app, concat_string, util}; use crate::config::SETTINGS; use crate::html::{Favicon, Markup, html}; -use crate::core::component::{ComponentTrait, InContext}; +use crate::core::component::{ComponentTrait, InContext, InContextOp}; use crate::response::page::Page; use crate::base::component::Chunck; @@ -27,10 +27,10 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { - page.context() - .with_favicon(Some(Favicon::new() + page + .alter_context(InContextOp::Favicon(Some(Favicon::new() .with_icon("/theme/favicon.png") - )); + ))); } fn render_page_head(&self, page: &mut Page) -> Markup { diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 4e9d3355..4fa94ebb 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -16,9 +16,3 @@ pub use identifier::IdentifierValue; mod classes; pub use classes::{Classes, ClassesOp, ClassValue}; - -mod unit; -pub use unit::UnitValue; - -mod layout; -pub use layout::{InlineLayout, LayoutSet}; diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 4268220c..197f1502 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -33,7 +33,7 @@ impl Classes { classes } - pub fn alter(&mut self, op: ClassesOp, classes: &str) -> &Self { + pub fn alter(&mut self, op: ClassesOp, classes: &str) -> &mut Self { let classes = classes.trim(); match op { ClassesOp::Add => { diff --git a/pagetop/src/html/layout.rs b/pagetop/src/html/layout.rs deleted file mode 100644 index b94a10fa..00000000 --- a/pagetop/src/html/layout.rs +++ /dev/null @@ -1,165 +0,0 @@ -use crate::concat_string; - -use super::unit::UnitValue; - -const RADIUS_BOTTOM_LEFT: &str = "border-bottom-left-radius"; -const RADIUS_BOTTOM_RIGHT: &str = "border-bottom-right-radius"; -const RADIUS_TOP_LEFT: &str = "border-top-left-radius"; -const RADIUS_TOP_RIGHT: &str = "border-top-right-radius"; - -const MARGIN_BOTTOM: &str = "margin-bottom"; -const MARGIN_LEFT: &str = "margin-left"; -const MARGIN_RIGHT: &str = "margin-right"; -const MARGIN_TOP: &str = "margin-top"; - -const PADDING_BOTTOM: &str = "padding-bottom"; -const PADDING_LEFT: &str = "padding-left"; -const PADDING_RIGHT: &str = "padding-right"; -const PADDING_TOP: &str = "padding-top"; - -pub enum LayoutSet { - Margin(UnitValue, UnitValue, UnitValue, UnitValue), - MarginAll(UnitValue), - MarginSide(UnitValue, UnitValue), - MarginBottom(UnitValue), - MarginLeft(UnitValue), - MarginRight(UnitValue), - MarginTop(UnitValue), - - Padding(UnitValue, UnitValue, UnitValue, UnitValue), - PaddingAll(UnitValue), - PaddingSide(UnitValue, UnitValue), - PaddingBottom(UnitValue), - PaddingLeft(UnitValue), - PaddingRight(UnitValue), - PaddingTop(UnitValue), - - Radius(UnitValue, UnitValue, UnitValue, UnitValue), - RadiusAll(UnitValue), - RadiusBottomLeft(UnitValue), - RadiusBottomRight(UnitValue), - RadiusTopLeft(UnitValue), - RadiusTopRight(UnitValue), -} - -impl LayoutSet { - fn set(&self, into_spaces: &mut InlineLayout) { - match self { - - // MARGIN LAYOUT. - LayoutSet::Margin(top, right, bottom, left) => { - self.add(MARGIN_TOP, top, into_spaces); - self.add(MARGIN_RIGHT, right, into_spaces); - self.add(MARGIN_BOTTOM, bottom, into_spaces); - self.add(MARGIN_LEFT, left, into_spaces); - }, - LayoutSet::MarginAll(val) => { - self.add(MARGIN_TOP, val, into_spaces); - self.add(MARGIN_RIGHT, val, into_spaces); - self.add(MARGIN_BOTTOM, val, into_spaces); - self.add(MARGIN_LEFT, val, into_spaces); - }, - LayoutSet::MarginSide(top_bottom, right_left) => { - self.add(MARGIN_TOP, top_bottom, into_spaces); - self.add(MARGIN_RIGHT, right_left, into_spaces); - self.add(MARGIN_BOTTOM, top_bottom, into_spaces); - self.add(MARGIN_LEFT, right_left, into_spaces); - }, - LayoutSet::MarginTop(val) => self.add(MARGIN_TOP, val, into_spaces), - LayoutSet::MarginRight(val) => self.add(MARGIN_RIGHT, val, into_spaces), - LayoutSet::MarginBottom(val) => self.add(MARGIN_BOTTOM, val, into_spaces), - LayoutSet::MarginLeft(val) => self.add(MARGIN_LEFT, val, into_spaces), - - // PADDING LAYOUT. - LayoutSet::Padding(top, right, bottom, left) => { - self.add(PADDING_TOP, top, into_spaces); - self.add(PADDING_RIGHT, right, into_spaces); - self.add(PADDING_BOTTOM, bottom, into_spaces); - self.add(PADDING_LEFT, left, into_spaces); - }, - LayoutSet::PaddingAll(val) => { - self.add(PADDING_TOP, val, into_spaces); - self.add(PADDING_RIGHT, val, into_spaces); - self.add(PADDING_BOTTOM, val, into_spaces); - self.add(PADDING_LEFT, val, into_spaces); - }, - LayoutSet::PaddingSide(top_bottom, right_left) => { - self.add(PADDING_TOP, top_bottom, into_spaces); - self.add(PADDING_RIGHT, right_left, into_spaces); - self.add(PADDING_BOTTOM, top_bottom, into_spaces); - self.add(PADDING_LEFT, right_left, into_spaces); - }, - LayoutSet::PaddingTop(val) => self.add(PADDING_TOP, val, into_spaces), - LayoutSet::PaddingRight(val) => self.add(PADDING_RIGHT, val, into_spaces), - LayoutSet::PaddingBottom(val) => self.add(PADDING_BOTTOM, val, into_spaces), - LayoutSet::PaddingLeft(val) => self.add(PADDING_LEFT, val, into_spaces), - - // BORDER RADIUS LAYOUT. - LayoutSet::Radius(top_left, top_right, bottom_right, bottom_left) => { - self.add(RADIUS_TOP_LEFT, top_left, into_spaces); - self.add(RADIUS_TOP_RIGHT, top_right, into_spaces); - self.add(RADIUS_BOTTOM_RIGHT, bottom_right, into_spaces); - self.add(RADIUS_BOTTOM_LEFT, bottom_left, into_spaces); - }, - LayoutSet::RadiusAll(val) => { - self.add(RADIUS_TOP_LEFT, val, into_spaces); - self.add(RADIUS_TOP_RIGHT, val, into_spaces); - self.add(RADIUS_BOTTOM_RIGHT, val, into_spaces); - self.add(RADIUS_BOTTOM_LEFT, val, into_spaces); - }, - LayoutSet::RadiusTopLeft(val) => self.add(RADIUS_TOP_LEFT, val, into_spaces), - LayoutSet::RadiusTopRight(val) => self.add(RADIUS_TOP_RIGHT, val, into_spaces), - LayoutSet::RadiusBottomRight(val) => self.add(RADIUS_BOTTOM_RIGHT, val, into_spaces), - LayoutSet::RadiusBottomLeft(val) => self.add(RADIUS_BOTTOM_LEFT, val, into_spaces), - } - } - - fn add(&self, property: &str, value: &UnitValue, into_spaces: &mut InlineLayout) { - let val = value.to_string(); - let style = InlineProperty { - property: property.to_owned(), - inline : concat_string!(property, ":", val, ";"), - }; - match into_spaces.0.iter().position(|s| s.property.eq(&style.property)) { - Some(pos) => { - into_spaces.0.remove(pos); - if !val.is_empty() { - into_spaces.0.insert(pos, style); - } - }, - _ => if !val.is_empty() { - into_spaces.0.push(style) - } - } - } -} - -struct InlineProperty { - property: String, - inline : String, -} - -pub struct InlineLayout(Vec<InlineProperty>); - -impl InlineLayout { - pub fn new() -> Self { - InlineLayout(Vec::new()) - } - - pub fn set(&mut self, layout: &[LayoutSet]) -> &Self { - for i in 0..layout.len() { - layout[i].set(self); - } - self - } - - pub fn get(&self) -> Option<String> { - if self.0.len() == 0 { - None - } else { - let mut inline = "".to_owned(); - self.0.iter().for_each(|s| inline.push_str(s.inline.as_str())); - Some(inline) - } - } -} diff --git a/pagetop/src/html/unit.rs b/pagetop/src/html/unit.rs deleted file mode 100644 index 61641184..00000000 --- a/pagetop/src/html/unit.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::concat_string; - -// About pixels: Pixels (px) are relative to the viewing device. For low-dpi -// devices, 1px is one device pixel (dot) of the display. For printers and high -// resolution screens 1px implies multiple device pixels. - -// About em: 2em means 2 times the size of the current font. The em and rem -// units are practical in creating perfectly scalable layout! - -// About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. - -pub enum UnitValue { - Auto, - - Cm(isize), // Centimeters. - In(isize), // Inches (1in = 96px = 2.54cm). - Mm(isize), // Millimeters. - Pc(isize), // Picas (1pc = 12pt). - Pt(isize), // Points (1pt = 1/72 of 1in). - Px(isize), // Pixels (1px = 1/96th of 1in). - - RelEm(f32), // Relative to the font-size of the element. - RelPct(f32), // Percentage relative to the parent element. - RelRem(f32), // Relative to font-size of the root element. - RelVh(f32), // Relative to 1% of the height of the viewport. - RelVw(f32), // Relative to 1% of the value of the viewport. - - UnSet, -} - -impl ToString for UnitValue { - fn to_string(&self) -> String { - match self { - UnitValue::Auto => "auto".to_owned(), - // Absolute value. - UnitValue::Cm(aw) => concat_string!(aw.to_string(), "cm"), - UnitValue::In(aw) => concat_string!(aw.to_string(), "in"), - UnitValue::Mm(aw) => concat_string!(aw.to_string(), "mm"), - UnitValue::Pc(aw) => concat_string!(aw.to_string(), "pc"), - UnitValue::Pt(aw) => concat_string!(aw.to_string(), "pt"), - UnitValue::Px(aw) => concat_string!(aw.to_string(), "px"), - // Relative value. - UnitValue::RelEm(rw) => concat_string!(rw.to_string(), "em"), - UnitValue::RelPct(rw) => concat_string!(rw.to_string(), "%"), - UnitValue::RelRem(rw) => concat_string!(rw.to_string(), "rem"), - UnitValue::RelVh(rw) => concat_string!(rw.to_string(), "vh"), - UnitValue::RelVw(rw) => concat_string!(rw.to_string(), "vw"), - - _ => "".to_owned(), - } - } -} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 3c3d9a9f..95362453 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -36,21 +36,22 @@ static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { pub enum TextDirection { Auto, LeftToRight, RightToLeft } -pub struct Page<'a> { +pub struct Page { + context : InContext, language : AttributeValue, direction : AttributeValue, title : AttributeValue, description : AttributeValue, - context : InContext, - regions : HashMap<&'a str, ComponentsBundle>, body_classes: Classes, + regions : HashMap<&'static str, ComponentsBundle>, template : String, } -impl<'a> Page<'a> { +impl Page { pub fn new() -> Self { Page { + context : InContext::new(), language : match &*DEFAULT_LANGUAGE { Some(language) => AttributeValue::new_with_value(language), _ => AttributeValue::new(), @@ -61,44 +62,49 @@ impl<'a> Page<'a> { }, title : AttributeValue::new(), description : AttributeValue::new(), - context : InContext::new(), - regions : common_components(), body_classes: Classes::new_with_default("body"), + regions : common_components(), template : "default".to_owned(), } } // Page BUILDER. - pub fn with_language(&mut self, language: &str) -> &mut Self { - self.language.with_value(language); + pub fn with_context(mut self, op: InContextOp) -> Self { + self.alter_context(op); self } - pub fn with_direction(&mut self, dir: TextDirection) -> &mut Self { - self.direction.with_value(match dir { - TextDirection::Auto => "auto", - TextDirection::LeftToRight => "ltr", - TextDirection::RightToLeft => "rtl", - }); + pub fn with_language(mut self, language: &str) -> Self { + self.alter_language(language); self } - pub fn with_title(&mut self, title: &str) -> &mut Self { - self.title.with_value(title); + pub fn with_direction(mut self, dir: TextDirection) -> Self { + self.alter_direction(dir); self } - pub fn with_description(&mut self, description: &str) -> &mut Self { - self.description.with_value(description); + pub fn with_title(mut self, title: &str) -> Self { + self.alter_title(title); + self + } + + pub fn with_description(mut self, description: &str) -> Self { + self.alter_description(description); + self + } + + pub fn with_body_classes(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_body_classes(op, classes); self } pub fn add_to( - &mut self, - region: &'a str, + mut self, + region: &'static str, component: impl ComponentTrait - ) -> &mut Self { + ) -> Self { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); } else { @@ -107,18 +113,58 @@ impl<'a> Page<'a> { self } + pub fn using_template(mut self, template: &str) -> Self { + self.alter_template(template); + self + } + + // Page ALTER. + + pub fn alter_context(&mut self, op: InContextOp) -> &mut Self { + self.context.alter(op); + self + } + + pub fn alter_language(&mut self, language: &str) -> &mut Self { + self.language.with_value(language); + self + } + + pub fn alter_direction(&mut self, dir: TextDirection) -> &mut Self { + self.direction.with_value(match dir { + TextDirection::Auto => "auto", + TextDirection::LeftToRight => "ltr", + TextDirection::RightToLeft => "rtl", + }); + self + } + + pub fn alter_title(&mut self, title: &str) -> &mut Self { + self.title.with_value(title); + self + } + + pub fn alter_description(&mut self, description: &str) -> &mut Self { + self.description.with_value(description); + self + } + pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.body_classes.alter(op, classes); self } - pub fn using_template(&mut self, template: &str) -> &mut Self { + pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self } // Page GETTERS. + pub fn context(&mut self) -> &mut InContext { + &mut self.context + } + pub fn language(&self) -> &AttributeValue { &self.language } @@ -135,10 +181,6 @@ impl<'a> Page<'a> { &self.description } - pub fn context(&mut self) -> &mut InContext { - &mut self.context - } - pub fn body_classes(&self) -> &Classes { &self.body_classes } @@ -184,8 +226,4 @@ impl<'a> Page<'a> { // Page EXTRAS. - pub fn using_theme(&mut self, theme_name: &str) -> &mut Self { - self.context.using_theme(theme_name); - self - } } From bc70527ecfa8a8beb134966176b97452ccad9a9b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 15 Jul 2022 18:58:05 +0200 Subject: [PATCH 125/853] =?UTF-8?q?Actualiza=20c=C3=B3digo=20y=20revisa=20?= =?UTF-8?q?constantes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-node/src/lib.rs | 4 +- pagetop-user/src/lib.rs | 4 +- pagetop/src/base/component.rs | 20 ++--- pagetop/src/base/component/anchor.rs | 28 +++---- pagetop/src/base/component/block.rs | 28 +++---- pagetop/src/base/component/chunck.rs | 28 +++---- pagetop/src/base/component/container.rs | 28 +++---- pagetop/src/base/component/form.rs | 10 +-- pagetop/src/base/component/form/button.rs | 28 +++---- pagetop/src/base/component/form/date.rs | 28 +++---- pagetop/src/base/component/form/form.rs | 28 +++---- pagetop/src/base/component/form/hidden.rs | 4 +- pagetop/src/base/component/form/input.rs | 28 +++---- pagetop/src/base/component/grid.rs | 4 +- pagetop/src/base/component/grid/column.rs | 73 +++++++++++-------- pagetop/src/base/component/grid/row.rs | 28 +++---- pagetop/src/base/component/heading.rs | 28 +++---- pagetop/src/base/component/icon.rs | 39 +++++----- pagetop/src/base/component/image.rs | 28 +++---- pagetop/src/base/component/menu.rs | 63 ++++++++-------- pagetop/src/base/component/paragraph.rs | 28 +++---- pagetop/src/base/module/demopage.rs | 14 +++- pagetop/src/base/theme/aliner.rs | 4 +- pagetop/src/base/theme/bootsier.rs | 4 +- pagetop/src/base/theme/bulmix.rs | 16 ++-- pagetop/src/base/theme/minimal.rs | 4 +- pagetop/src/core/component.rs | 2 +- pagetop/src/core/component/context.rs | 8 +- pagetop/src/core/component/definition.rs | 16 ++-- pagetop/src/core/component/hook.rs | 4 +- pagetop/src/response/page.rs | 2 +- pagetop/src/response/page/definition.rs | 4 +- pagetop/src/response/page/hook.rs | 4 +- .../static/theme/module/demopage/styles.css | 30 ++++++++ 35 files changed, 356 insertions(+), 317 deletions(-) create mode 100644 pagetop/static/theme/module/demopage/styles.css diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index bb9d70b0..c12421c3 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub const ADMIN_MODULE: &str = "pagetop-admin::module::admin"; +pub const MODULE_ADMIN: &str = "pagetop-admin::module::admin"; localize!("src/locales"); @@ -10,7 +10,7 @@ pub struct Admin; impl ModuleTrait for Admin { fn handler(&self) -> &'static str { - ADMIN_MODULE + MODULE_ADMIN } fn name(&self) -> String { diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 1662e625..bed7f9db 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub const NODE_MODULE: &str = "pagetop-node::module::node"; +pub const MODULE_NODE: &str = "pagetop-node::module::node"; localize!("src/locales"); @@ -11,7 +11,7 @@ pub struct Node; impl ModuleTrait for Node { fn handler(&self) -> &'static str { - NODE_MODULE + MODULE_NODE } fn name(&self) -> String { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index f1515419..d250adfc 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub const USER_MODULE: &str = "pagetop-user::module::user"; +pub const MODULE_USER: &str = "pagetop-user::module::user"; localize!("src/locales"); @@ -10,7 +10,7 @@ pub struct User; impl ModuleTrait for User { fn handler(&self) -> &'static str { - USER_MODULE + MODULE_USER } fn name(&self) -> String { diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index b0fd2673..366c7ff3 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -1,44 +1,44 @@ mod container; pub use container::{ - CONTAINER_COMPONENT, Container, ContainerType + COMPONENT_CONTAINER, Container, ContainerType }; pub mod grid; mod chunck; pub use chunck::{ - CHUNCK_COMPONENT, Chunck + COMPONENT_CHUNCK, Chunck }; mod icon; pub use icon::{ - ICON_COMPONENT, Icon + COMPONENT_ICON, Icon }; mod heading; pub use heading::{ - HEADING_COMPONENT, Heading, HeadingDisplay, HeadingType + COMPONENT_HEADING, Heading, HeadingDisplay, HeadingType }; mod paragraph; pub use paragraph::{ - PARAGRAPH_COMPONENT, Paragraph, ParagraphDisplay + COMPONENT_PARAGRAPH, Paragraph, ParagraphDisplay }; mod anchor; pub use anchor::{ - ANCHOR_COMPONENT, Anchor, AnchorIcon, AnchorTarget, AnchorType + COMPONENT_ANCHOR, Anchor, AnchorIcon, AnchorTarget, AnchorType }; mod block; pub use block::{ - BLOCK_COMPONENT, Block + COMPONENT_BLOCK, Block }; mod image; pub use image::{ - IMAGE_COMPONENT, Image + COMPONENT_IMAGE, Image }; mod menu; pub use menu::{ - MENU_COMPONENT, MENUITEM_COMPONENT, Menu, MenuItem, MenuItemType + COMPONENT_MENU, COMPONENT_MENUITEM, Menu, MenuItem, MenuItemType }; pub mod form; pub use form::{ - FORM_COMPONENT, Form, FormMethod + COMPONENT_FORM, Form, FormMethod }; diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 25c9a33e..26644db7 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const ANCHOR_COMPONENT: &str = "pagetop::component::anchor"; +pub const COMPONENT_ANCHOR: &str = "pagetop::component::anchor"; pub enum AnchorType { Button, @@ -50,17 +50,17 @@ impl ComponentTrait for Anchor { } fn handler(&self) -> &'static str { - ANCHOR_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_ANCHOR } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, context: &mut InContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), @@ -107,13 +107,13 @@ impl Anchor { // Anchor BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -164,13 +164,13 @@ impl Anchor { // Anchor ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 7daf3ebe..fec21328 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const BLOCK_COMPONENT: &str = "pagetop::component::block"; +pub const COMPONENT_BLOCK: &str = "pagetop::component::block"; pub struct Block { renderable: fn() -> bool, @@ -26,17 +26,17 @@ impl ComponentTrait for Block { } fn handler(&self) -> &'static str { - BLOCK_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_BLOCK } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, context: &mut InContext) -> Markup { let id = context.required_id::<Block>(self.id()); html! { @@ -65,13 +65,13 @@ impl Block { // Block BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -102,13 +102,13 @@ impl Block { // Block ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 1832a455..59d29b12 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const CHUNCK_COMPONENT: &str = "pagetop::component::chunck"; +pub const COMPONENT_CHUNCK: &str = "pagetop::component::chunck"; pub struct Chunck { renderable: fn() -> bool, @@ -20,17 +20,17 @@ impl ComponentTrait for Chunck { } fn handler(&self) -> &'static str { - CHUNCK_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_CHUNCK } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, _: &mut InContext) -> Markup { html! { (*self.html()) } } @@ -51,13 +51,13 @@ impl Chunck { // Chunck BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -73,13 +73,13 @@ impl Chunck { // Chunck ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index b1839901..94634943 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const CONTAINER_COMPONENT: &str = "pagetop::component::container"; +pub const COMPONENT_CONTAINER: &str = "pagetop::component::container"; pub enum ContainerType { Header, Footer, Main, Section, Wrapper } @@ -30,17 +30,17 @@ impl ComponentTrait for Container { } fn handler(&self) -> &'static str { - CONTAINER_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_CONTAINER } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, context: &mut InContext) -> Markup { match self.container_type() { ContainerType::Header => html! { @@ -115,13 +115,13 @@ impl Container { // Container BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -152,13 +152,13 @@ impl Container { // Container ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form.rs b/pagetop/src/base/component/form.rs index 4e35a9d4..4b17e5c3 100644 --- a/pagetop/src/base/component/form.rs +++ b/pagetop/src/base/component/form.rs @@ -1,21 +1,21 @@ mod form; pub use form::{ - FORM_COMPONENT, Form, FormMethod + COMPONENT_FORM, Form, FormMethod }; mod input; pub use input::{ - INPUT_COMPONENT, Input, InputType + COMPONENT_INPUT, Input, InputType }; mod hidden; pub use hidden::{ - HIDDEN_COMPONENT, Hidden + COMPONENT_HIDDEN, Hidden }; mod date; pub use date::{ - DATE_COMPONENT, Date + COMPONENT_DATE, Date }; mod button; pub use button::{ - BUTTON_COMPONENT, Button, ButtonType + COMPONENT_BUTTON, Button, ButtonType }; diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 6a01a1a3..e9ba40ec 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const BUTTON_COMPONENT: &str = "pagetop::component::form::button"; +pub const COMPONENT_BUTTON: &str = "pagetop::component::form::button"; pub enum ButtonType {Button, Reset, Submit} @@ -33,17 +33,17 @@ impl ComponentTrait for Button { } fn handler(&self) -> &'static str { - BUTTON_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_BUTTON } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, _: &mut InContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", @@ -104,13 +104,13 @@ impl Button { // Button BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -146,13 +146,13 @@ impl Button { // Button ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 1772e718..5151cead 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const DATE_COMPONENT: &str = "pagetop::component::form::date"; +pub const COMPONENT_DATE: &str = "pagetop::component::form::date"; pub struct Date { renderable : fn() -> bool, @@ -41,17 +41,17 @@ impl ComponentTrait for Date { } fn handler(&self) -> &'static str { - DATE_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_DATE } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, _: &mut InContext) -> Markup { let id = match self.name().get() { Some(name) => Some(concat_string!("edit-", name)), @@ -104,13 +104,13 @@ impl Date { // Date BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -176,13 +176,13 @@ impl Date { // Date ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 65269ca4..17059a02 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const FORM_COMPONENT: &str = "pagetop::component::form"; +pub const COMPONENT_FORM: &str = "pagetop::component::form"; pub enum FormMethod {Get, Post} @@ -32,17 +32,17 @@ impl ComponentTrait for Form { } fn handler(&self) -> &'static str { - FORM_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_FORM } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, context: &mut InContext) -> Markup { let method = match self.method() { FormMethod::Get => None, @@ -74,13 +74,13 @@ impl Form { // Form BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -121,13 +121,13 @@ impl Form { // Form ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 358e01ef..b233f7fe 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const HIDDEN_COMPONENT: &str = "pagetop::component::form::hidden"; +pub const COMPONENT_HIDDEN: &str = "pagetop::component::form::hidden"; pub struct Hidden { weight: isize, @@ -18,7 +18,7 @@ impl ComponentTrait for Hidden { } fn handler(&self) -> &'static str { - HIDDEN_COMPONENT + COMPONENT_HIDDEN } fn weight(&self) -> isize { diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 0ee01c67..8dac6678 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const INPUT_COMPONENT: &str = "pagetop::component::form::input"; +pub const COMPONENT_INPUT: &str = "pagetop::component::form::input"; pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} @@ -51,17 +51,17 @@ impl ComponentTrait for Input { } fn handler(&self) -> &'static str { - INPUT_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_INPUT } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, _: &mut InContext) -> Markup { let type_input = match self.input_type() { InputType::Email => "email", @@ -163,13 +163,13 @@ impl Input { // Input BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -250,13 +250,13 @@ impl Input { // Input ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/grid.rs b/pagetop/src/base/component/grid.rs index af88db55..17663df6 100644 --- a/pagetop/src/base/component/grid.rs +++ b/pagetop/src/base/component/grid.rs @@ -1,8 +1,8 @@ mod row; pub use row::{ - ROW_COMPONENT, Row + COMPONENT_ROW, Row }; mod column; pub use column::{ - COLUMN_COMPONENT, Column, ColumnSize + COMPONENT_COLUMN, Column, ColumnSize }; diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 6fbc1989..5aabb947 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -1,6 +1,20 @@ use crate::prelude::*; -pub const COLUMN_COMPONENT: &str = "pagetop::component::grid::column"; +pub const COMPONENT_COLUMN: &str = "pagetop::component::grid::column"; + +const SIZE_DEFAULT: &str = "col-md"; +const SIZE_1_OF_12: &str = "col-md-1"; +const SIZE_2_OF_12: &str = "col-md-2"; +const SIZE_3_OF_12: &str = "col-md-3"; +const SIZE_4_OF_12: &str = "col-md-4"; +const SIZE_5_OF_12: &str = "col-md-5"; +const SIZE_6_OF_12: &str = "col-md-6"; +const SIZE_7_OF_12: &str = "col-md-7"; +const SIZE_8_OF_12: &str = "col-md-8"; +const SIZE_9_OF_12: &str = "col-md-9"; +const SIZE_10_OF_12: &str = "col-md-10"; +const SIZE_11_OF_12: &str = "col-md-11"; +const SIZE_12_OF_12: &str = "col-md-12"; pub enum ColumnSize { Default, @@ -33,7 +47,7 @@ impl ComponentTrait for Column { renderable: render_always, weight : 0, id : IdentifierValue::new(), - classes : Classes::new(), + classes : Classes::new_with_default(SIZE_DEFAULT), size : ColumnSize::Default, components: ComponentsBundle::new(), template : "default".to_owned(), @@ -41,33 +55,15 @@ impl ComponentTrait for Column { } fn handler(&self) -> &'static str { - COLUMN_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_COLUMN } fn weight(&self) -> isize { self.weight } - fn before_render(&mut self, _context: &mut InContext) { - match self.size() { - ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, "col-md"), - ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-1"), - ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-2"), - ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-3"), - ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-4"), - ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-5"), - ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-6"), - ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-7"), - ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-8"), - ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-9"), - ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-10"), - ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, "col-md-11"), - ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, "col-md-12"), - }; + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() } fn default_render(&self, context: &mut InContext) -> Markup { @@ -91,13 +87,13 @@ impl Column { // Column BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -128,13 +124,13 @@ impl Column { // Column ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } @@ -149,6 +145,21 @@ impl Column { } pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { + match size { + ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE_DEFAULT), + ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_1_OF_12), + ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_2_OF_12), + ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_3_OF_12), + ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_4_OF_12), + ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_5_OF_12), + ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_6_OF_12), + ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_7_OF_12), + ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_8_OF_12), + ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_9_OF_12), + ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), + ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), + ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), + }; self.size = size; self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 2681ae9b..2e67c6f4 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const ROW_COMPONENT: &str = "pagetop::component::grid::row"; +pub const COMPONENT_ROW: &str = "pagetop::component::grid::row"; pub struct Row { renderable: fn() -> bool, @@ -24,17 +24,17 @@ impl ComponentTrait for Row { } fn handler(&self) -> &'static str { - ROW_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_ROW } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, context: &mut InContext) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { @@ -56,13 +56,13 @@ impl Row { // Row BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -88,13 +88,13 @@ impl Row { // Row ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 86094fb1..23fb0af1 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const HEADING_COMPONENT: &str = "pagetop::component::heading"; +pub const COMPONENT_HEADING: &str = "pagetop::component::heading"; pub enum HeadingType { H1, H2, H3, H4, H5, H6 } @@ -40,17 +40,17 @@ impl ComponentTrait for Heading { } fn handler(&self) -> &'static str { - HEADING_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_HEADING } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, _: &mut InContext) -> Markup { let id = self.id().get(); let classes = self.classes().get(); @@ -100,13 +100,13 @@ impl Heading { // Heading BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -142,13 +142,13 @@ impl Heading { // Heading ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index e3f2ede0..a45ebf20 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const ICON_COMPONENT: &str = "pagetop::component::icon"; +pub const COMPONENT_ICON: &str = "pagetop::component::icon"; pub struct Icon { renderable: fn() -> bool, @@ -15,33 +15,29 @@ impl ComponentTrait for Icon { renderable: render_always, weight : 0, icon_name : "question-circle-fill".to_owned(), - classes : Classes::new(), + classes : Classes::new_with_default("bi-question-circle-fill"), } } fn handler(&self) -> &'static str { - ICON_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_ICON } fn weight(&self) -> isize { self.weight } - fn before_render(&mut self, context: &mut InContext) { + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + + fn default_render(&self, context: &mut InContext) -> Markup { context .alter(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/theme/icons/bootstrap-icons.css") .with_version("1.8.2") ))); - self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", self.icon_name()).as_str()); - } - - fn default_render(&self, _context: &mut InContext) -> Markup { html! { i class=[self.classes().get()] {}; } } @@ -61,13 +57,13 @@ impl Icon { // Icon BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -83,18 +79,19 @@ impl Icon { // Icon ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; - self - } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { self.icon_name = name.to_owned(); + self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", self.icon_name).as_str()); self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index a7cccdf2..8a28aba9 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const IMAGE_COMPONENT: &str = "pagetop::component::image"; +pub const COMPONENT_IMAGE: &str = "pagetop::component::image"; pub struct Image { renderable: fn() -> bool, @@ -24,17 +24,17 @@ impl ComponentTrait for Image { } fn handler(&self) -> &'static str { - IMAGE_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_IMAGE } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, _: &mut InContext) -> Markup { html! { img @@ -60,13 +60,13 @@ impl Image { // Image BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -92,13 +92,13 @@ impl Image { // Image ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index c0c8a0b3..cef6abee 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,7 +1,7 @@ use crate::prelude::*; -pub const MENU_COMPONENT: &str = "pagetop::component::menu"; -pub const MENUITEM_COMPONENT: &str = "pagetop::component::menu_item"; +pub const COMPONENT_MENU: &str = "pagetop::component::menu"; +pub const COMPONENT_MENUITEM: &str = "pagetop::component::menu_item"; pub enum MenuItemType { Label(String), @@ -31,17 +31,17 @@ impl ComponentTrait for MenuItem { } fn handler(&self) -> &'static str { - MENUITEM_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_MENUITEM } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, context: &mut InContext) -> Markup { match self.item_type() { MenuItemType::Label(label) => html! { @@ -142,28 +142,28 @@ impl MenuItem { // MenuItem BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); - self - } - pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); self } - // MenuItem ALTER. - - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } + // MenuItem ALTER. + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; + self + } + // MenuItem GETTERS. pub fn item_type(&self) -> &MenuItemType { @@ -195,18 +195,18 @@ impl ComponentTrait for Menu { } fn handler(&self) -> &'static str { - MENU_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_MENU } fn weight(&self) -> isize { self.weight } - fn before_render(&mut self, context: &mut InContext) { + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + + fn default_render(&self, context: &mut InContext) -> Markup { context .alter(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/theme/menu/css/menu.css") @@ -221,10 +221,9 @@ impl ComponentTrait for Menu { .with_version("1.1.1") ))) .alter(InContextOp::AddJQuery); - } - fn default_render(&self, context: &mut InContext) -> Markup { let id = context.required_id::<Menu>(self.id()); + html! { ul id=(id) class=[self.classes().get()] { (self.items().render(context)) @@ -251,13 +250,13 @@ impl Menu { // Menu BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -283,13 +282,13 @@ impl Menu { // Menu ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 564710cc..6329b312 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const PARAGRAPH_COMPONENT: &str = "pagetop::component::paragraph"; +pub const COMPONENT_PARAGRAPH: &str = "pagetop::component::paragraph"; pub enum ParagraphDisplay { XxLarge, @@ -35,17 +35,17 @@ impl ComponentTrait for Paragraph { } fn handler(&self) -> &'static str { - PARAGRAPH_COMPONENT - } - - fn is_renderable(&self) -> bool { - (self.renderable)() + COMPONENT_PARAGRAPH } fn weight(&self) -> isize { self.weight } + fn is_renderable(&self, _: &InContext) -> bool { + (self.renderable)() + } + fn default_render(&self, _: &mut InContext) -> Markup { html! { p id=[self.id().get()] class=[self.classes().get()] { (*self.html()) } @@ -68,13 +68,13 @@ impl Paragraph { // Paragraph BUILDER. - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { - self.alter_renderable(renderable); + pub fn with_weight(mut self, weight: isize) -> Self { + self.alter_weight(weight); self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); + pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + self.alter_renderable(renderable); self } @@ -105,13 +105,13 @@ impl Paragraph { // Paragraph ALTER. - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { - self.renderable = renderable; + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; self } - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + self.renderable = renderable; self } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index ac9e120e..b02f8603 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const DEMOPAGE_MODULE: &str = "pagetop::module::demopage"; +pub const MODULE_DEMOPAGE: &str = "pagetop::module::demopage"; localize!("src/base/module/demopage/locales"); @@ -8,7 +8,7 @@ pub struct Demopage; impl ModuleTrait for Demopage { fn handler(&self) -> &'static str { - DEMOPAGE_MODULE + MODULE_DEMOPAGE } fn name(&self) -> String { @@ -27,6 +27,9 @@ impl ModuleTrait for Demopage { async fn demo() -> app::Result<Markup> { Page::new() .with_title(l("page_title").as_str()) + .with_context(InContextOp::StyleSheet(AssetsOp::Add( + StyleSheet::located("/theme/module/demopage/styles.css") + ))) .add_to("content", hello_world()) .add_to("content", welcome()) .add_to("content", about_pagetop()) @@ -40,6 +43,7 @@ fn hello_world() -> Container { .with_id("hello-world") .with_component(grid::Row::new() .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "hello-col-text") .with_size(grid::ColumnSize::Is4of12) .with_component(Heading::h1(html! { (l("page_title")) @@ -63,6 +67,7 @@ fn hello_world() -> Container { ("Offered services") }) .with_left_icon(Icon::with("card-checklist")) + .with_classes(ClassesOp::Add, "services-link") ) .with_component(Anchor::button("#", html! { ("Get quote") @@ -71,6 +76,7 @@ fn hello_world() -> Container { ) ) .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "hello-col-image") .with_component(Image::image("/theme/images/demo-header.svg")) ) ) @@ -78,13 +84,15 @@ fn hello_world() -> Container { fn welcome() -> Container { Container::new() - .with_id("visiting") + .with_id("welcome") .with_component(grid::Row::new() .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "welcome-col-image") .with_size(grid::ColumnSize::Is5of12) .with_component(Image::image("/theme/images/demo-visiting.svg")) ) .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "welcome-col-text") .with_component(Heading::h2(html! { (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) })) diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index e7a76922..de6bc60f 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const ALINER_THEME: &str = "pagetop::theme::aliner"; +pub const THEME_ALINER: &str = "pagetop::theme::aliner"; include!(concat!(env!("OUT_DIR"), "/aliner.rs")); @@ -8,7 +8,7 @@ pub struct Aliner; impl ThemeTrait for Aliner { fn handler(&self) -> &'static str { - ALINER_THEME + THEME_ALINER } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 582a5499..4ba21119 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const BOOTSIER_THEME: &str = "pagetop::theme::bootsier"; +pub const THEME_BOOTSIER: &str = "pagetop::theme::bootsier"; include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); @@ -10,7 +10,7 @@ pub struct Bootsier; impl ThemeTrait for Bootsier { fn handler(&self) -> &'static str { - BOOTSIER_THEME + THEME_BOOTSIER } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index e46d601a..fda612a9 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const BULMIX_THEME: &str = "pagetop::theme::bulmix"; +pub const THEME_BULMIX: &str = "pagetop::theme::bulmix"; include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); @@ -8,7 +8,7 @@ pub struct Bulmix; impl ThemeTrait for Bulmix { fn handler(&self) -> &'static str { - BULMIX_THEME + THEME_BULMIX } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { @@ -34,14 +34,14 @@ impl ThemeTrait for Bulmix { _context: &mut InContext ) { match component.handler() { - ANCHOR_COMPONENT => { + COMPONENT_ANCHOR => { let a = component_mut::<Anchor>(component); a.alter_classes(ClassesOp::SetDefault, match a.anchor_type() { AnchorType::Button => "button is-primary", _ => "", }); }, - HEADING_COMPONENT => { + COMPONENT_HEADING => { let h = component_mut::<Heading>(component); h.alter_classes(ClassesOp::SetDefault, match h.display() { HeadingDisplay::XxLarge => "title is-1", @@ -53,7 +53,7 @@ impl ThemeTrait for Bulmix { HeadingDisplay::Subtitle => "subtitle", }); }, - PARAGRAPH_COMPONENT => { + COMPONENT_PARAGRAPH => { let p = component_mut::<Paragraph>(component); p.alter_classes(ClassesOp::SetDefault, match p.display() { ParagraphDisplay::XxLarge => "is-size-2", @@ -64,7 +64,7 @@ impl ThemeTrait for Bulmix { ParagraphDisplay::Normal => "", }); }, - grid::COLUMN_COMPONENT => { + grid::COMPONENT_COLUMN => { let col = component_mut::<grid::Column>(component); col.alter_classes(ClassesOp::SetDefault, concat_string!("column", match col.size() { grid::ColumnSize::Default => "", @@ -82,7 +82,7 @@ impl ThemeTrait for Bulmix { grid::ColumnSize::IsFull => " is-12", }, " content").as_str()); }, - grid::ROW_COMPONENT => { + grid::COMPONENT_ROW => { let row = component_mut::<grid::Row>(component); row.alter_classes(ClassesOp::SetDefault, "columns"); }, @@ -96,7 +96,7 @@ impl ThemeTrait for Bulmix { _context: &mut InContext ) -> Option<Markup> { match component.handler() { - ICON_COMPONENT => { + COMPONENT_ICON => { let icon = component_ref::<Icon>(component); Some(html! { span class="icon" { diff --git a/pagetop/src/base/theme/minimal.rs b/pagetop/src/base/theme/minimal.rs index e86e1719..bcdbe8cf 100644 --- a/pagetop/src/base/theme/minimal.rs +++ b/pagetop/src/base/theme/minimal.rs @@ -1,11 +1,11 @@ use crate::prelude::*; -pub const MINIMAL_THEME: &str = "pagetop::theme::minimal"; +pub const THEME_MINIMAL: &str = "pagetop::theme::minimal"; pub struct Minimal; impl ThemeTrait for Minimal { fn handler(&self) -> &'static str { - MINIMAL_THEME + THEME_MINIMAL } } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 3e3c9dec..adcf0192 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,6 +1,6 @@ mod hook; pub use hook::{ - BEFORE_RENDER_COMPONENT_HOOK, + HOOK_BEFORE_RENDER_COMPONENT, BeforeRenderComponentHook, }; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 3f9de74a..6d3f8dc5 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -12,9 +12,9 @@ static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { }); pub enum InContextOp { + SetTheme(&'static str), AddMetadata(&'static str, &'static str), Favicon(Option<Favicon>), - SetTheme(&'static str), StyleSheet(AssetsOp<StyleSheet>), JavaScript(AssetsOp<JavaScript>), AddJQuery, @@ -45,15 +45,15 @@ impl InContext { pub fn alter(&mut self, op: InContextOp) -> &mut Self { match op { + InContextOp::SetTheme(theme_name) => { + self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); + }, InContextOp::AddMetadata(name, content) => { self.metadata.push((name.to_owned(), content.to_owned())); }, InContextOp::Favicon(favicon) => { self.favicon = favicon; }, - InContextOp::SetTheme(theme_name) => { - self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); - }, InContextOp::StyleSheet(css) => { self.stylesheets.alter(css); }, diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index bf88f4cd..787561b3 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,7 @@ use crate::util; use crate::html::{Markup, html}; use crate::core::hook::{hook_ref, run_hooks}; -use super::{BEFORE_RENDER_COMPONENT_HOOK, BeforeRenderComponentHook, InContext}; +use super::{HOOK_BEFORE_RENDER_COMPONENT, BeforeRenderComponentHook, InContext}; pub use std::any::Any as AnyComponent; @@ -18,16 +18,13 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { None } - fn is_renderable(&self) -> bool { - true - } - fn weight(&self) -> isize { 0 } #[allow(unused_variables)] - fn before_render(&mut self, context: &mut InContext) { + fn is_renderable(&self, context: &InContext) -> bool { + true } #[allow(unused_variables)] @@ -49,19 +46,16 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { } pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InContext) -> Markup { - // Acciones del propio componente antes de renderizarlo. - component.before_render(context); - // Acciones de los módulos antes de renderizar el componente. run_hooks( - BEFORE_RENDER_COMPONENT_HOOK, + HOOK_BEFORE_RENDER_COMPONENT, |hook| hook_ref::<BeforeRenderComponentHook>(&**hook).run(component, context) ); // Acciones del tema antes de renderizar el componente. context.theme().before_render_component(component, context); - match component.is_renderable() { + match component.is_renderable(context) { true => match context.theme().render_component(component, context) { Some(html) => html, None => component.default_render(context) diff --git a/pagetop/src/core/component/hook.rs b/pagetop/src/core/component/hook.rs index 82d1ba01..d95d1cdf 100644 --- a/pagetop/src/core/component/hook.rs +++ b/pagetop/src/core/component/hook.rs @@ -1,7 +1,7 @@ use crate::core::hook::{HookTrait, AnyHook}; use super::{ComponentTrait, InContext}; -pub const BEFORE_RENDER_COMPONENT_HOOK: &str = "pagetop::hook::before_render_component"; +pub const HOOK_BEFORE_RENDER_COMPONENT: &str = "pagetop::hook::before_render_component"; pub struct BeforeRenderComponentHook { hook: Option<fn(&mut dyn ComponentTrait, &mut InContext)>, @@ -17,7 +17,7 @@ impl HookTrait for BeforeRenderComponentHook { } fn handler(&self) -> &'static str { - BEFORE_RENDER_COMPONENT_HOOK + HOOK_BEFORE_RENDER_COMPONENT } fn weight(&self) -> isize { diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 5f517471..d3def8df 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,6 +1,6 @@ mod hook; pub use hook::{ - BEFORE_RENDER_PAGE_HOOK, + HOOK_BEFORE_RENDER_PAGE, BeforeRenderPageHook, }; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 95362453..322c6e77 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -3,7 +3,7 @@ use crate::config::SETTINGS; use crate::html::*; use crate::core::hook::{hook_ref, run_hooks}; use crate::core::component::*; -use super::{BEFORE_RENDER_PAGE_HOOK, BeforeRenderPageHook}; +use super::{HOOK_BEFORE_RENDER_PAGE, BeforeRenderPageHook}; use std::collections::HashMap; @@ -194,7 +194,7 @@ impl Page { pub fn render(&mut self) -> app::Result<Markup> { // Acciones de los módulos antes de renderizar la página. run_hooks( - BEFORE_RENDER_PAGE_HOOK, + HOOK_BEFORE_RENDER_PAGE, |hook| hook_ref::<BeforeRenderPageHook>(&**hook).run(self) ); diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index d482fb56..e094c9ca 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,7 +1,7 @@ use crate::core::hook::{HookTrait, AnyHook}; use super::Page; -pub const BEFORE_RENDER_PAGE_HOOK: &str = "pagetop::hook::before_render_page"; +pub const HOOK_BEFORE_RENDER_PAGE: &str = "pagetop::hook::before_render_page"; pub struct BeforeRenderPageHook { hook: Option<fn(&mut Page)>, @@ -17,7 +17,7 @@ impl HookTrait for BeforeRenderPageHook { } fn handler(&self) -> &'static str { - BEFORE_RENDER_PAGE_HOOK + HOOK_BEFORE_RENDER_PAGE } fn weight(&self) -> isize { diff --git a/pagetop/static/theme/module/demopage/styles.css b/pagetop/static/theme/module/demopage/styles.css new file mode 100644 index 00000000..956f49e7 --- /dev/null +++ b/pagetop/static/theme/module/demopage/styles.css @@ -0,0 +1,30 @@ +#hello-world { + padding: 2em 5%; +} +#hello-world a { + margin: .25em; +} +#hello-world a.services-link { + padding-left: 1.5em; + padding-right: 1.5em; + border-radius: 1.5em; +} +#welcome { + padding: 1em 5%; +} +#welcome .welcome-col-text { + padding-left: 5%; +} +/* Responsiveness */ +@media (max-width: 992px) { + #hello-world .hello-col-text { + text-align: center; + } + #hello-world .hello-col-image { + padding-top: 5%; + } + #welcome .welcome-col-text { + text-align: center; + padding-left: 0; + } +} \ No newline at end of file From 068f3d852012eb6ec79ed80bc9048c939ae788e3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 15 Jul 2022 22:20:24 +0200 Subject: [PATCH 126/853] =?UTF-8?q?Corrige=20asignaci=C3=B3n=20de=20contex?= =?UTF-8?q?to=20a=20is=5Frenderable()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 12 ++++---- pagetop/src/base/component/block.rs | 12 ++++---- pagetop/src/base/component/chunck.rs | 12 ++++---- pagetop/src/base/component/container.rs | 12 ++++---- pagetop/src/base/component/form/button.rs | 12 ++++---- pagetop/src/base/component/form/date.rs | 12 ++++---- pagetop/src/base/component/form/form.rs | 12 ++++---- pagetop/src/base/component/form/input.rs | 12 ++++---- pagetop/src/base/component/grid/column.rs | 12 ++++---- pagetop/src/base/component/grid/row.rs | 12 ++++---- pagetop/src/base/component/heading.rs | 12 ++++---- pagetop/src/base/component/icon.rs | 12 ++++---- pagetop/src/base/component/image.rs | 12 ++++---- pagetop/src/base/component/menu.rs | 36 +++++++++++------------ pagetop/src/base/component/paragraph.rs | 12 ++++---- pagetop/src/core/component.rs | 6 ++-- 16 files changed, 106 insertions(+), 104 deletions(-) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 26644db7..e1532888 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -19,8 +19,8 @@ pub enum AnchorTarget { pub type AnchorIcon = ComponentsBundle; pub struct Anchor { - renderable : fn() -> bool, weight : isize, + renderable : Renderable, id : IdentifierValue, classes : Classes, anchor_type: AnchorType, @@ -35,8 +35,8 @@ pub struct Anchor { impl ComponentTrait for Anchor { fn new() -> Self { Anchor { - renderable : render_always, weight : 0, + renderable : render_always, id : IdentifierValue::new(), classes : Classes::new(), anchor_type: AnchorType::Link, @@ -57,8 +57,8 @@ impl ComponentTrait for Anchor { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -112,7 +112,7 @@ impl Anchor { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -169,7 +169,7 @@ impl Anchor { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index fec21328..868751fc 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub const COMPONENT_BLOCK: &str = "pagetop::component::block"; pub struct Block { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, id : IdentifierValue, classes : Classes, title : AttributeValue, @@ -15,8 +15,8 @@ pub struct Block { impl ComponentTrait for Block { fn new() -> Self { Block { - renderable: render_always, weight : 0, + renderable: render_always, id : IdentifierValue::new(), classes : Classes::new_with_default("block"), title : AttributeValue::new(), @@ -33,8 +33,8 @@ impl ComponentTrait for Block { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -70,7 +70,7 @@ impl Block { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -107,7 +107,7 @@ impl Block { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/chunck.rs index 59d29b12..9622923a 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/chunck.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub const COMPONENT_CHUNCK: &str = "pagetop::component::chunck"; pub struct Chunck { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, html : Markup, template : String, } @@ -12,8 +12,8 @@ pub struct Chunck { impl ComponentTrait for Chunck { fn new() -> Self { Chunck { - renderable: render_always, weight : 0, + renderable: render_always, html : html! {}, template : "default".to_owned(), } @@ -27,8 +27,8 @@ impl ComponentTrait for Chunck { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, _: &mut InContext) -> Markup { @@ -56,7 +56,7 @@ impl Chunck { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -78,7 +78,7 @@ impl Chunck { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 94634943..fe49e224 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -5,8 +5,8 @@ pub const COMPONENT_CONTAINER: &str = "pagetop::component::container"; pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { - renderable : fn() -> bool, weight : isize, + renderable : Renderable, id : IdentifierValue, classes : Classes, inner_classes : Classes, @@ -18,8 +18,8 @@ pub struct Container { impl ComponentTrait for Container { fn new() -> Self { Container { - renderable : render_always, weight : 0, + renderable : render_always, id : IdentifierValue::new(), classes : Classes::new_with_default("container"), inner_classes : Classes::new_with_default("container"), @@ -37,8 +37,8 @@ impl ComponentTrait for Container { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -120,7 +120,7 @@ impl Container { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -157,7 +157,7 @@ impl Container { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index e9ba40ec..1414f6a8 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -5,8 +5,8 @@ pub const COMPONENT_BUTTON: &str = "pagetop::component::form::button"; pub enum ButtonType {Button, Reset, Submit} pub struct Button { - renderable : fn() -> bool, weight : isize, + renderable : Renderable, classes : Classes, button_type: ButtonType, name : AttributeValue, @@ -19,8 +19,8 @@ pub struct Button { impl ComponentTrait for Button { fn new() -> Self { Button { - renderable : render_always, weight : 0, + renderable : render_always, classes : Classes::new_with_default("btn btn-primary"), button_type: ButtonType::Button, name : AttributeValue::new(), @@ -40,8 +40,8 @@ impl ComponentTrait for Button { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, _: &mut InContext) -> Markup { @@ -109,7 +109,7 @@ impl Button { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -151,7 +151,7 @@ impl Button { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 5151cead..cbb6593f 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub const COMPONENT_DATE: &str = "pagetop::component::form::date"; pub struct Date { - renderable : fn() -> bool, weight : isize, + renderable : Renderable, classes : Classes, name : AttributeValue, value : AttributeValue, @@ -22,8 +22,8 @@ pub struct Date { impl ComponentTrait for Date { fn new() -> Self { Date { - renderable : render_always, weight : 0, + renderable : render_always, classes : Classes::new_with_default("form-item"), name : AttributeValue::new(), value : AttributeValue::new(), @@ -48,8 +48,8 @@ impl ComponentTrait for Date { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, _: &mut InContext) -> Markup { @@ -109,7 +109,7 @@ impl Date { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -181,7 +181,7 @@ impl Date { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index 17059a02..f331700d 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -5,8 +5,8 @@ pub const COMPONENT_FORM: &str = "pagetop::component::form"; pub enum FormMethod {Get, Post} pub struct Form { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, id : IdentifierValue, classes : Classes, action : AttributeValue, @@ -19,8 +19,8 @@ pub struct Form { impl ComponentTrait for Form { fn new() -> Self { Form { - renderable: render_always, weight : 0, + renderable: render_always, id : IdentifierValue::new(), classes : Classes::new_with_default("form"), action : AttributeValue::new(), @@ -39,8 +39,8 @@ impl ComponentTrait for Form { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -79,7 +79,7 @@ impl Form { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -126,7 +126,7 @@ impl Form { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 8dac6678..505014e4 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -5,8 +5,8 @@ pub const COMPONENT_INPUT: &str = "pagetop::component::form::input"; pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} pub struct Input { - renderable : fn() -> bool, weight : isize, + renderable : Renderable, classes : Classes, input_type : InputType, name : IdentifierValue, @@ -28,8 +28,8 @@ pub struct Input { impl ComponentTrait for Input { fn new() -> Self { Input { - renderable : render_always, weight : 0, + renderable : render_always, classes : Classes::new_with_default("form-item"), input_type : InputType::Textfield, name : IdentifierValue::new(), @@ -58,8 +58,8 @@ impl ComponentTrait for Input { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, _: &mut InContext) -> Markup { @@ -168,7 +168,7 @@ impl Input { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -255,7 +255,7 @@ impl Input { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 5aabb947..80d70fd0 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -32,8 +32,8 @@ pub enum ColumnSize { IsFull, } pub struct Column { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, id : IdentifierValue, classes : Classes, size : ColumnSize, @@ -44,8 +44,8 @@ pub struct Column { impl ComponentTrait for Column { fn new() -> Self { Column { - renderable: render_always, weight : 0, + renderable: render_always, id : IdentifierValue::new(), classes : Classes::new_with_default(SIZE_DEFAULT), size : ColumnSize::Default, @@ -62,8 +62,8 @@ impl ComponentTrait for Column { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -92,7 +92,7 @@ impl Column { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -129,7 +129,7 @@ impl Column { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 2e67c6f4..5bfa8ad2 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub const COMPONENT_ROW: &str = "pagetop::component::grid::row"; pub struct Row { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, id : IdentifierValue, classes : Classes, columns : ComponentsBundle, @@ -14,8 +14,8 @@ pub struct Row { impl ComponentTrait for Row { fn new() -> Self { Row { - renderable: render_always, weight : 0, + renderable: render_always, id : IdentifierValue::new(), classes : Classes::new_with_default("row"), columns : ComponentsBundle::new(), @@ -31,8 +31,8 @@ impl ComponentTrait for Row { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -61,7 +61,7 @@ impl Row { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -93,7 +93,7 @@ impl Row { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 23fb0af1..65685c12 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -15,8 +15,8 @@ pub enum HeadingDisplay { } pub struct Heading { - renderable : fn() -> bool, weight : isize, + renderable : Renderable, id : IdentifierValue, classes : Classes, heading_type: HeadingType, @@ -28,8 +28,8 @@ pub struct Heading { impl ComponentTrait for Heading { fn new() -> Self { Heading { - renderable : render_always, weight : 0, + renderable : render_always, id : IdentifierValue::new(), classes : Classes::new(), heading_type: HeadingType::H1, @@ -47,8 +47,8 @@ impl ComponentTrait for Heading { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, _: &mut InContext) -> Markup { @@ -105,7 +105,7 @@ impl Heading { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -147,7 +147,7 @@ impl Heading { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index a45ebf20..c8f95fa2 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub const COMPONENT_ICON: &str = "pagetop::component::icon"; pub struct Icon { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, icon_name : String, classes : Classes, } @@ -12,8 +12,8 @@ pub struct Icon { impl ComponentTrait for Icon { fn new() -> Self { Icon { - renderable: render_always, weight : 0, + renderable: render_always, icon_name : "question-circle-fill".to_owned(), classes : Classes::new_with_default("bi-question-circle-fill"), } @@ -27,8 +27,8 @@ impl ComponentTrait for Icon { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -62,7 +62,7 @@ impl Icon { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -84,7 +84,7 @@ impl Icon { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 8a28aba9..66a8b8c8 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -3,8 +3,8 @@ use crate::prelude::*; pub const COMPONENT_IMAGE: &str = "pagetop::component::image"; pub struct Image { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, id : IdentifierValue, classes : Classes, source : AttributeValue, @@ -14,8 +14,8 @@ pub struct Image { impl ComponentTrait for Image { fn new() -> Self { Image { - renderable: render_always, weight : 0, + renderable: render_always, id : IdentifierValue::new(), classes : Classes::new_with_default("img-fluid"), source : AttributeValue::new(), @@ -31,8 +31,8 @@ impl ComponentTrait for Image { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, _: &mut InContext) -> Markup { @@ -65,7 +65,7 @@ impl Image { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -97,7 +97,7 @@ impl Image { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index cef6abee..95fd16a6 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -16,16 +16,16 @@ pub enum MenuItemType { // MenuItem. pub struct MenuItem { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, item_type : MenuItemType, } impl ComponentTrait for MenuItem { fn new() -> Self { MenuItem { - renderable: render_always, weight : 0, + renderable: render_always, item_type : MenuItemType::Void, } } @@ -38,8 +38,8 @@ impl ComponentTrait for MenuItem { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -85,16 +85,16 @@ impl ComponentTrait for MenuItem { impl MenuItem { pub fn label(label: &str) -> Self { MenuItem { - renderable: render_always, weight : 0, + renderable: render_always, item_type : MenuItemType::Label(label.to_owned()), } } pub fn link(label: &str, path: &str) -> Self { MenuItem { - renderable: render_always, weight : 0, + renderable: render_always, item_type : MenuItemType::Link( label.to_owned(), path.to_owned(), @@ -104,8 +104,8 @@ impl MenuItem { pub fn link_blank(label: &str, path: &str) -> Self { MenuItem { - renderable: render_always, weight : 0, + renderable: render_always, item_type : MenuItemType::LinkBlank( label.to_owned(), path.to_owned(), @@ -115,24 +115,24 @@ impl MenuItem { pub fn html(html: Markup) -> Self { MenuItem { - renderable: render_always, weight : 0, + renderable: render_always, item_type : MenuItemType::Html(html), } } pub fn separator() -> Self { MenuItem { - renderable: render_always, weight : 0, + renderable: render_always, item_type : MenuItemType::Separator, } } pub fn submenu(label: &str, menu: Menu) -> Self { MenuItem { - renderable: render_always, weight : 0, + renderable: render_always, item_type : MenuItemType::Submenu( label.to_owned(), menu @@ -147,7 +147,7 @@ impl MenuItem { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -159,7 +159,7 @@ impl MenuItem { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } @@ -174,8 +174,8 @@ impl MenuItem { // Menu. pub struct Menu { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, id : IdentifierValue, classes : Classes, items : ComponentsBundle, @@ -185,8 +185,8 @@ pub struct Menu { impl ComponentTrait for Menu { fn new() -> Self { Menu { - renderable: render_always, weight : 0, + renderable: render_always, items : ComponentsBundle::new(), id : IdentifierValue::new(), classes : Classes::new_with_default("sm sm-clean"), @@ -202,8 +202,8 @@ impl ComponentTrait for Menu { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, context: &mut InContext) -> Markup { @@ -255,7 +255,7 @@ impl Menu { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -287,7 +287,7 @@ impl Menu { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 6329b312..21750a8b 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -12,8 +12,8 @@ pub enum ParagraphDisplay { } pub struct Paragraph { - renderable: fn() -> bool, weight : isize, + renderable: Renderable, id : IdentifierValue, classes : Classes, html : Markup, @@ -24,8 +24,8 @@ pub struct Paragraph { impl ComponentTrait for Paragraph { fn new() -> Self { Paragraph { - renderable: render_always, weight : 0, + renderable: render_always, id : IdentifierValue::new(), classes : Classes::new(), html : html! {}, @@ -42,8 +42,8 @@ impl ComponentTrait for Paragraph { self.weight } - fn is_renderable(&self, _: &InContext) -> bool { - (self.renderable)() + fn is_renderable(&self, context: &InContext) -> bool { + (self.renderable)(context) } fn default_render(&self, _: &mut InContext) -> Markup { @@ -73,7 +73,7 @@ impl Paragraph { self } - pub fn with_renderable(mut self, renderable: fn() -> bool) -> Self { + pub fn with_renderable(mut self, renderable: Renderable) -> Self { self.alter_renderable(renderable); self } @@ -110,7 +110,7 @@ impl Paragraph { self } - pub fn alter_renderable(&mut self, renderable: fn() -> bool) -> &mut Self { + pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { self.renderable = renderable; self } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index adcf0192..a6d91d21 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -23,6 +23,8 @@ mod all; pub use all::add_component_to; pub(crate) use all::common_components; -pub fn render_always() -> bool { true } +pub type Renderable = fn(_: &InContext) -> bool; -pub fn render_never() -> bool { false } \ No newline at end of file +pub fn render_always(_: &InContext) -> bool { true } + +pub fn render_never(_: &InContext) -> bool { false } \ No newline at end of file From 166f209dab5f72f6e2a6e0607188580c3a6a0c27 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Jul 2022 06:45:32 +0200 Subject: [PATCH 127/853] Actualiza HookItem por HookAction --- pagetop-admin/src/lib.rs | 4 ++-- pagetop-node/src/lib.rs | 4 ++-- pagetop/src/core/component/definition.rs | 4 ++++ pagetop/src/core/hook.rs | 2 +- pagetop/src/core/hook/all.rs | 6 +++--- pagetop/src/core/hook/holder.rs | 12 ++++++------ pagetop/src/core/module/definition.rs | 4 ++-- pagetop/src/prelude.rs | 2 +- 8 files changed, 21 insertions(+), 17 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index c12421c3..5bd6dfb6 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -28,9 +28,9 @@ impl ModuleTrait for Admin { ); } - fn actions(&self) -> Vec<HookItem> { + fn actions(&self) -> Vec<HookAction> { vec![ - hook_item!(BeforeRenderPageHook => before_render_page) + hook_action!(BeforeRenderPageHook => before_render_page) ] } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index bed7f9db..98b06c66 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -26,9 +26,9 @@ impl ModuleTrait for Node { cfg.route("/node", app::web::get().to(node)); } - fn actions(&self) -> Vec<HookItem> { + fn actions(&self) -> Vec<HookAction> { vec![ - hook_item!(BeforeRenderPageHook => before_render_page, -1) + hook_action!(BeforeRenderPageHook => before_render_page, -1) ] } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 787561b3..d8eb920e 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -27,6 +27,10 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { true } + #[allow(unused_variables)] + fn before_render(&mut self, context: &mut InContext) { + } + #[allow(unused_variables)] fn default_render(&self, context: &mut InContext) -> Markup { html! {} diff --git a/pagetop/src/core/hook.rs b/pagetop/src/core/hook.rs index 8b83a58d..00b6d4ea 100644 --- a/pagetop/src/core/hook.rs +++ b/pagetop/src/core/hook.rs @@ -6,7 +6,7 @@ pub use definition::{ }; mod holder; -pub use holder::HookItem; +pub use holder::HookAction; use holder::HooksHolder; mod all; diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index 5c6f28d9..6321dfbc 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,5 +1,5 @@ use crate::Lazy; -use super::{HookItem, HooksHolder}; +use super::{HookAction, HooksHolder}; use std::sync::RwLock; use std::collections::HashMap; @@ -9,7 +9,7 @@ static ACTIONS: Lazy<RwLock<HashMap<&str, HooksHolder>>> = Lazy::new(|| { RwLock::new(HashMap::new()) }); -pub fn add_hook(hook: HookItem) { +pub fn add_hook(hook: HookAction) { let mut hmap = ACTIONS.write().unwrap(); let action_handler = hook.handler(); if let Some(actions) = hmap.get_mut(action_handler) { @@ -19,7 +19,7 @@ pub fn add_hook(hook: HookItem) { } } -pub fn run_hooks<B, F>(action_handler: &str, f: F) where F: FnMut(&HookItem) -> B { +pub fn run_hooks<B, F>(action_handler: &str, f: F) where F: FnMut(&HookAction) -> B { if let Some(actions) = ACTIONS.read().unwrap().get(action_handler) { actions.iter_map(f) } diff --git a/pagetop/src/core/hook/holder.rs b/pagetop/src/core/hook/holder.rs index cd138c67..59ce3b81 100644 --- a/pagetop/src/core/hook/holder.rs +++ b/pagetop/src/core/hook/holder.rs @@ -2,35 +2,35 @@ use super::HookTrait; use std::sync::{Arc, RwLock}; -pub type HookItem = Box<dyn HookTrait>; +pub type HookAction = Box<dyn HookTrait>; #[macro_export] -macro_rules! hook_item { +macro_rules! hook_action { ( $hook:ident => $f:ident $(, $weight:expr)? ) => {{ Box::new($hook::new().with_hook($f)$(.with_weight($weight))?) }}; } -pub struct HooksHolder(Arc<RwLock<Vec<HookItem>>>); +pub struct HooksHolder(Arc<RwLock<Vec<HookAction>>>); impl HooksHolder { pub fn new() -> Self { HooksHolder(Arc::new(RwLock::new(Vec::new()))) } - pub fn new_with(hook: HookItem) -> Self { + pub fn new_with(hook: HookAction) -> Self { let mut container = HooksHolder::new(); container.add(hook); container } - pub fn add(&mut self, hook: HookItem) { + pub fn add(&mut self, hook: HookAction) { let mut actions = self.0.write().unwrap(); actions.push(hook); actions.sort_by_key(|a| a.weight()); } - pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&HookItem) -> B { + pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&HookAction) -> B { let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); } } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 38621d82..5fe9e84e 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,5 @@ use crate::{app, util}; -use crate::core::hook::HookItem; +use crate::core::hook::HookAction; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db::MigrationItem; @@ -28,7 +28,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { } - fn actions(&self) -> Vec<HookItem> { + fn actions(&self) -> Vec<HookAction> { vec![] } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index c772c91d..9c0f552a 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -25,7 +25,7 @@ pub use crate::app; pub use crate::app::AppTrait; pub use crate::app::application::Application; -pub use crate::{hook_item, core::{ +pub use crate::{hook_action, core::{ component::*, hook::*, module::*, From 616d7ee20712af761062cb0d48a2b6dc66b0898a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Jul 2022 21:16:38 +0200 Subject: [PATCH 128/853] =?UTF-8?q?A=C3=B1ade=20hook=20previo=20antes=20de?= =?UTF-8?q?=20renderizar=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 1 + pagetop/src/base/component/block.rs | 9 +++ pagetop/src/base/component/container.rs | 9 +++ pagetop/src/base/component/form/form.rs | 9 +++ pagetop/src/base/component/grid/column.rs | 9 +++ pagetop/src/base/component/grid/row.rs | 9 +++ pagetop/src/base/component/menu.rs | 12 +++- pagetop/src/core/component.rs | 6 -- pagetop/src/core/component/definition.rs | 75 ++++++++++++++++++++--- pagetop/src/core/component/hook.rs | 48 --------------- pagetop/src/core/hook.rs | 6 +- pagetop/src/core/hook/all.rs | 2 +- pagetop/src/core/hook/definition.rs | 2 +- pagetop/src/prelude.rs | 11 +++- pagetop/src/response/page/definition.rs | 6 +- pagetop/src/response/page/hook.rs | 6 +- 16 files changed, 145 insertions(+), 75 deletions(-) delete mode 100644 pagetop/src/core/component/hook.rs diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 1e9ce156..6292a160 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -27,6 +27,7 @@ doc-comment = "0.3.3" figlet-rs = "0.1.3" futures = "0.3.21" once_cell = "1.12.0" +paste = "1.0.7" substring = "1.4.5" term_size = "0.3.2" url = "2.2.2" diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 868751fc..8740d522 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -2,6 +2,11 @@ use crate::prelude::*; pub const COMPONENT_BLOCK: &str = "pagetop::component::block"; +hook_before_render_component!( + HOOK_BEFORE_RENDER_BLOCK = "pagetop::action::before_render_block", + Block +); + pub struct Block { weight : isize, renderable: Renderable, @@ -37,6 +42,10 @@ impl ComponentTrait for Block { (self.renderable)(context) } + fn before_render(&mut self, context: &mut InContext) { + before_render_inline(self, context); + } + fn default_render(&self, context: &mut InContext) -> Markup { let id = context.required_id::<Block>(self.id()); html! { diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index fe49e224..2f64e762 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -2,6 +2,11 @@ use crate::prelude::*; pub const COMPONENT_CONTAINER: &str = "pagetop::component::container"; +hook_before_render_component!( + HOOK_BEFORE_RENDER_CONTAINER = "pagetop::action::before_render_container", + Container +); + pub enum ContainerType { Header, Footer, Main, Section, Wrapper } pub struct Container { @@ -41,6 +46,10 @@ impl ComponentTrait for Container { (self.renderable)(context) } + fn before_render(&mut self, context: &mut InContext) { + before_render_inline(self, context); + } + fn default_render(&self, context: &mut InContext) -> Markup { match self.container_type() { ContainerType::Header => html! { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index f331700d..cfe973ba 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -2,6 +2,11 @@ use crate::prelude::*; pub const COMPONENT_FORM: &str = "pagetop::component::form"; +hook_before_render_component!( + HOOK_BEFORE_RENDER_FORM = "pagetop::action::before_render_form", + Form +); + pub enum FormMethod {Get, Post} pub struct Form { @@ -43,6 +48,10 @@ impl ComponentTrait for Form { (self.renderable)(context) } + fn before_render(&mut self, context: &mut InContext) { + before_render_inline(self, context); + } + fn default_render(&self, context: &mut InContext) -> Markup { let method = match self.method() { FormMethod::Get => None, diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 80d70fd0..0a988599 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -2,6 +2,11 @@ use crate::prelude::*; pub const COMPONENT_COLUMN: &str = "pagetop::component::grid::column"; +hook_before_render_component!( + HOOK_BEFORE_RENDER_COLUMN = "pagetop::action::before_render_column", + Column +); + const SIZE_DEFAULT: &str = "col-md"; const SIZE_1_OF_12: &str = "col-md-1"; const SIZE_2_OF_12: &str = "col-md-2"; @@ -66,6 +71,10 @@ impl ComponentTrait for Column { (self.renderable)(context) } + fn before_render(&mut self, context: &mut InContext) { + before_render_inline(self, context); + } + fn default_render(&self, context: &mut InContext) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 5bfa8ad2..0cf59b90 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -2,6 +2,11 @@ use crate::prelude::*; pub const COMPONENT_ROW: &str = "pagetop::component::grid::row"; +hook_before_render_component!( + HOOK_BEFORE_RENDER_ROW = "pagetop::action::before_render_row", + Row +); + pub struct Row { weight : isize, renderable: Renderable, @@ -35,6 +40,10 @@ impl ComponentTrait for Row { (self.renderable)(context) } + fn before_render(&mut self, context: &mut InContext) { + before_render_inline(self, context); + } + fn default_render(&self, context: &mut InContext) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 95fd16a6..2c0e94e5 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,6 +1,5 @@ use crate::prelude::*; -pub const COMPONENT_MENU: &str = "pagetop::component::menu"; pub const COMPONENT_MENUITEM: &str = "pagetop::component::menu_item"; pub enum MenuItemType { @@ -173,6 +172,13 @@ impl MenuItem { // Menu. +pub const COMPONENT_MENU: &str = "pagetop::component::menu"; + +hook_before_render_component!( + HOOK_BEFORE_RENDER_MENU = "pagetop::action::before_render_menu", + Menu +); + pub struct Menu { weight : isize, renderable: Renderable, @@ -206,6 +212,10 @@ impl ComponentTrait for Menu { (self.renderable)(context) } + fn before_render(&mut self, context: &mut InContext) { + before_render_inline(self, context); + } + fn default_render(&self, context: &mut InContext) -> Markup { context .alter(InContextOp::StyleSheet(AssetsOp::Add( diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index a6d91d21..20ec2b42 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,9 +1,3 @@ -mod hook; -pub use hook::{ - HOOK_BEFORE_RENDER_COMPONENT, - BeforeRenderComponentHook, -}; - mod context; pub use context::{InContext, InContextOp}; diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index d8eb920e..b437fa0b 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,6 @@ use crate::util; use crate::html::{Markup, html}; -use crate::core::hook::{hook_ref, run_hooks}; -use super::{HOOK_BEFORE_RENDER_COMPONENT, BeforeRenderComponentHook, InContext}; +use super::InContext; pub use std::any::Any as AnyComponent; @@ -50,11 +49,8 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { } pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InContext) -> Markup { - // Acciones de los módulos antes de renderizar el componente. - run_hooks( - HOOK_BEFORE_RENDER_COMPONENT, - |hook| hook_ref::<BeforeRenderComponentHook>(&**hook).run(component, context) - ); + // Acciones del componente antes de renderizar. + component.before_render(context); // Acciones del tema antes de renderizar el componente. context.theme().before_render_component(component, context); @@ -67,3 +63,68 @@ pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InCont false => html! {} } } + +#[macro_export] +macro_rules! hook_before_render_component { + ( $ACTION_HANDLER:ident = $handler:literal, $Component:ty ) => { + paste::paste! { + const $ACTION_HANDLER: &str = $handler; + + type Action = fn(&$Component, &mut InContext); + + pub struct [< BeforeRender $Component >] { + action: Option<Action>, + weight: isize, + } + + impl HookTrait for [< BeforeRender $Component >] { + fn new() -> Self { + [< BeforeRender $Component >] { + action: None, + weight: 0, + } + } + + fn handler(&self) -> &'static str { + $ACTION_HANDLER + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyHook { + self + } + } + + impl [< BeforeRender $Component >] { + #[allow(dead_code)] + pub fn with_hook(mut self, action: Action) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, component: &mut $Component, context: &mut InContext) { + if let Some(action) = self.action { + action(component, context) + } + } + } + + #[inline(always)] + fn before_render_inline(component: &mut $Component, context: &mut InContext) { + run_actions( + $ACTION_HANDLER, + |action| action_ref::<[< BeforeRender $Component >]>(&**action).run(component, context) + ); + } + } + }; +} diff --git a/pagetop/src/core/component/hook.rs b/pagetop/src/core/component/hook.rs deleted file mode 100644 index d95d1cdf..00000000 --- a/pagetop/src/core/component/hook.rs +++ /dev/null @@ -1,48 +0,0 @@ -use crate::core::hook::{HookTrait, AnyHook}; -use super::{ComponentTrait, InContext}; - -pub const HOOK_BEFORE_RENDER_COMPONENT: &str = "pagetop::hook::before_render_component"; - -pub struct BeforeRenderComponentHook { - hook: Option<fn(&mut dyn ComponentTrait, &mut InContext)>, - weight: isize, -} - -impl HookTrait for BeforeRenderComponentHook { - fn new() -> Self { - BeforeRenderComponentHook { - hook: None, - weight: 0, - } - } - - fn handler(&self) -> &'static str { - HOOK_BEFORE_RENDER_COMPONENT - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyHook { - self - } -} - -impl BeforeRenderComponentHook { - pub fn with_hook(mut self, hook: fn(&mut dyn ComponentTrait, &mut InContext)) -> Self { - self.hook = Some(hook); - self - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, component: &mut dyn ComponentTrait, context: &mut InContext) { - if let Some(hook) = self.hook { - hook(component, context) - } - } -} diff --git a/pagetop/src/core/hook.rs b/pagetop/src/core/hook.rs index 00b6d4ea..c90dd436 100644 --- a/pagetop/src/core/hook.rs +++ b/pagetop/src/core/hook.rs @@ -1,8 +1,8 @@ mod definition; pub use definition::{ - HookTrait, AnyHook, - hook_ref, + HookTrait, + action_ref, }; mod holder; @@ -10,5 +10,5 @@ pub use holder::HookAction; use holder::HooksHolder; mod all; -pub use all::run_hooks; +pub use all::run_actions; pub(crate) use all::add_hook; diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index 6321dfbc..0d0d3e08 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -19,7 +19,7 @@ pub fn add_hook(hook: HookAction) { } } -pub fn run_hooks<B, F>(action_handler: &str, f: F) where F: FnMut(&HookAction) -> B { +pub fn run_actions<B, F>(action_handler: &str, f: F) where F: FnMut(&HookAction) -> B { if let Some(actions) = ACTIONS.read().unwrap().get(action_handler) { actions.iter_map(f) } diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index e21ea10f..b3611f08 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -12,6 +12,6 @@ pub trait HookTrait: AnyHook + Send + Sync { fn as_ref_any(&self) -> &dyn AnyHook; } -pub fn hook_ref<A: 'static>(hook: &dyn HookTrait) -> &A { +pub fn action_ref<A: 'static>(hook: &dyn HookTrait) -> &A { hook.as_ref_any().downcast_ref::<A>().unwrap() } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 9c0f552a..c91a9678 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,6 +1,6 @@ //! Re-exporta recursos comunes. -// Macros, globals and helpers. +// Global macros and helpers. pub use crate::{ args, concat_string, @@ -25,12 +25,17 @@ pub use crate::app; pub use crate::app::AppTrait; pub use crate::app::application::Application; -pub use crate::{hook_action, core::{ +pub use crate::core::{ component::*, hook::*, module::*, theme::*, -}}; +}; +pub use crate::{ + hook_action, + hook_before_render_component, +}; + pub use crate::response::page::*; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 322c6e77..cf05e8f8 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,7 +1,7 @@ use crate::{Lazy, app, trace}; use crate::config::SETTINGS; use crate::html::*; -use crate::core::hook::{hook_ref, run_hooks}; +use crate::core::hook::{action_ref, run_actions}; use crate::core::component::*; use super::{HOOK_BEFORE_RENDER_PAGE, BeforeRenderPageHook}; @@ -193,9 +193,9 @@ impl Page { pub fn render(&mut self) -> app::Result<Markup> { // Acciones de los módulos antes de renderizar la página. - run_hooks( + run_actions( HOOK_BEFORE_RENDER_PAGE, - |hook| hook_ref::<BeforeRenderPageHook>(&**hook).run(self) + |hook| action_ref::<BeforeRenderPageHook>(&**hook).run(self) ); // Acciones del tema antes de renderizar la página. diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index e094c9ca..75b330d8 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -3,8 +3,10 @@ use super::Page; pub const HOOK_BEFORE_RENDER_PAGE: &str = "pagetop::hook::before_render_page"; +type Hook = fn(&mut Page); + pub struct BeforeRenderPageHook { - hook: Option<fn(&mut Page)>, + hook: Option<Hook>, weight: isize, } @@ -30,7 +32,7 @@ impl HookTrait for BeforeRenderPageHook { } impl BeforeRenderPageHook { - pub fn with_hook(mut self, hook: fn(&mut Page)) -> Self { + pub fn with_hook(mut self, hook: Hook) -> Self { self.hook = Some(hook); self } From 8fbb16a7d92832486ecde5a883beeda2e91f0e81 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Jul 2022 21:47:58 +0200 Subject: [PATCH 129/853] =?UTF-8?q?Actualiza=20SeaORM=20a=20la=20versi?= =?UTF-8?q?=C3=B3n=200.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 6292a160..6f9df4f9 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -53,13 +53,13 @@ maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6", feature serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.8.0" +version = "0.9.0" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-orm-migration] -version = "0.8.3" +version = "0.9.0" optional = true [features] From 3779e191a63a19b0a07b6d724f71edbbc66157d4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Jul 2022 21:49:01 +0200 Subject: [PATCH 130/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 6f9df4f9..1b048428 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.18" +version = "0.0.19" edition = "2021" authors = [ From 57fd4c2054efa3f842ea54803dc0efd987413e1b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 17 Jul 2022 22:22:12 +0200 Subject: [PATCH 131/853] =?UTF-8?q?A=C3=B1ade=20secci=C3=B3n=20de=20bienve?= =?UTF-8?q?nida=20en=20la=20p=C3=A1gina=20de=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/icon.rs | 4 +- pagetop/src/base/module/demopage.rs | 58 ++++++++---------- .../{demo-visiting.svg => demo-about.svg} | 0 pagetop/static/theme/images/demo-welcome.jpg | Bin 0 -> 21169 bytes .../static/theme/module/demopage/styles.css | 56 ++++++++++++++--- 5 files changed, 79 insertions(+), 39 deletions(-) rename pagetop/static/theme/images/{demo-visiting.svg => demo-about.svg} (100%) create mode 100644 pagetop/static/theme/images/demo-welcome.jpg diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index c8f95fa2..00c7ec24 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -31,13 +31,15 @@ impl ComponentTrait for Icon { (self.renderable)(context) } - fn default_render(&self, context: &mut InContext) -> Markup { + fn before_render(&mut self, context: &mut InContext) { context .alter(InContextOp::StyleSheet(AssetsOp::Add( StyleSheet::located("/theme/icons/bootstrap-icons.css") .with_version("1.8.2") ))); + } + fn default_render(&self, _: &mut InContext) -> Markup { html! { i class=[self.classes().get()] {}; } } diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/demopage.rs index b02f8603..f7940dfe 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/demopage.rs @@ -83,32 +83,23 @@ fn hello_world() -> Container { } fn welcome() -> Container { - Container::new() + Container::section() .with_id("welcome") - .with_component(grid::Row::new() - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "welcome-col-image") - .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::image("/theme/images/demo-visiting.svg")) - ) - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "welcome-col-text") - .with_component(Heading::h2(html! { - (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) - })) - .with_component(Heading::h3(html! { - (l("welcome_subtitle")) - }) - .with_display(HeadingDisplay::Subtitle) - ) - .with_component(Paragraph::with(html! { - (l("welcome_text1")) - }) - .with_display(ParagraphDisplay::Small) - ) - .with_component(Paragraph::with(html! { (l("welcome_text2")) })) - ) + .with_classes(ClassesOp::Add, "welcome-col-text") + .with_component(Heading::h2(html! { + (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) + })) + .with_component(Heading::h3(html! { + (l("welcome_subtitle")) + }) + .with_display(HeadingDisplay::Subtitle) ) + .with_component(Paragraph::with(html! { + (l("welcome_text1")) + }) + .with_display(ParagraphDisplay::Small) + ) + .with_component(Paragraph::with(html! { (l("welcome_text2")) })) } fn about_pagetop() -> Container { @@ -116,11 +107,15 @@ fn about_pagetop() -> Container { .with_id("pagetop") .with_component(grid::Row::new() .with_column(grid::Column::new() - .with_size(grid::ColumnSize::Is7of12) + .with_classes(ClassesOp::Add, "pagetop-col-image") + .with_size(grid::ColumnSize::Is5of12) + .with_component(Image::image("/theme/images/demo-about.svg")) + ) + .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "pagetop-col-text") .with_component(Heading::h2(html! { - (l("pagetop_title")) - }) - ) + (l("pagetop_title")) + })) .with_component(Paragraph::with(html! { (l("pagetop_text1")) }) @@ -135,9 +130,6 @@ fn about_pagetop() -> Container { }) ) ) - .with_column(grid::Column::new() - .with_component(Image::image("/theme/images/demo-pagetop.svg")) - ) ) } @@ -146,10 +138,12 @@ fn promo_pagetop() -> Container { .with_id("promo") .with_component(grid::Row::new() .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "promo-col-image") .with_size(grid::ColumnSize::Is5of12) .with_component(Image::image("/theme/images/demo-pagetop.svg")) ) .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "promo-col-text") .with_component(Heading::h2(html! { (l("pagetop_promo_title")) }) @@ -170,6 +164,7 @@ fn reporting_problems() -> Container { .with_id("reporting") .with_component(grid::Row::new() .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "reporting-col-text") .with_size(grid::ColumnSize::Is7of12) .with_component(Heading::h2(html! { (l("report_problems_title")) @@ -186,6 +181,7 @@ fn reporting_problems() -> Container { ) ) .with_column(grid::Column::new() + .with_classes(ClassesOp::Add, "reporting-col-image") .with_component(Image::image("/theme/images/demo-pagetop.svg")) ) ) diff --git a/pagetop/static/theme/images/demo-visiting.svg b/pagetop/static/theme/images/demo-about.svg similarity index 100% rename from pagetop/static/theme/images/demo-visiting.svg rename to pagetop/static/theme/images/demo-about.svg diff --git a/pagetop/static/theme/images/demo-welcome.jpg b/pagetop/static/theme/images/demo-welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..612bba082c4bf09ba287f47db806d17e4f61726a GIT binary patch literal 21169 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 literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/module/demopage/styles.css b/pagetop/static/theme/module/demopage/styles.css index 956f49e7..08b28b02 100644 --- a/pagetop/static/theme/module/demopage/styles.css +++ b/pagetop/static/theme/module/demopage/styles.css @@ -9,22 +9,64 @@ padding-right: 1.5em; border-radius: 1.5em; } + #welcome { - padding: 1em 5%; + padding: 2em 10%; } -#welcome .welcome-col-text { +#welcome > div.container { + padding: 3rem 8rem; + border-radius: 28px; + background: url("/theme/images/demo-welcome.jpg") center center no-repeat; + background-size: auto; + background-size: cover; + text-align: center; + color: #fff; +} +#welcome > div.container > h2 { + color: #fff; +} +#welcome > div.container > h3 { + color: #ccc; +} + +#pagetop { + padding: 2em 5%; +} +#pagetop .pagetop-col-text { + padding-top: 2em; padding-left: 5%; } + +#promo { + padding: 4em 5% 2em; +} +#promo .promo-col-text { + padding-top: 2em; + padding-left: 5%; +} + +#reporting { + padding: 4em 5%; +} +#reporting .reporting-col-text { + text-align: center; +} + /* Responsiveness */ +@media (min-width: 993px) { + #reporting .reporting-col-text { + padding-right: 3em; + text-align: right; + } +} @media (max-width: 992px) { - #hello-world .hello-col-text { + [class$="-col-text"] { text-align: center; } #hello-world .hello-col-image { padding-top: 5%; } - #welcome .welcome-col-text { - text-align: center; - padding-left: 0; + #welcome > div.container { + padding: 3rem 1rem; } -} \ No newline at end of file +} From 686ec924d1cdf6fb592778b28e82e4c80a4484e0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 19 Jul 2022 19:24:56 +0200 Subject: [PATCH 132/853] =?UTF-8?q?A=C3=B1ade=20nuevo=20proyecto=20para=20?= =?UTF-8?q?el=20sitio=20web=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +++-- Cargo.toml | 1 + {config => drust/config}/default.toml | 0 drust/src/main.rs | 7 ------- pagetop/src/app/application.rs | 5 +++++ pagetop/src/app/definition.rs | 5 +---- pagetop/src/base/module.rs | 2 +- .../base/module/{demopage.rs => homepage.rs} | 12 +++++------ .../locales/en-US/homepage.ftl} | 0 .../locales/es-ES/homepage.ftl} | 0 .../module/{demopage => homepage}/styles.css | 0 website/Cargo.toml | 20 +++++++++++++++++++ website/config/default.toml | 9 +++++++++ website/src/main.rs | 11 ++++++++++ 14 files changed, 57 insertions(+), 20 deletions(-) rename {config => drust/config}/default.toml (100%) rename pagetop/src/base/module/{demopage.rs => homepage.rs} (95%) rename pagetop/src/base/module/{demopage/locales/en-US/demopage.ftl => homepage/locales/en-US/homepage.ftl} (100%) rename pagetop/src/base/module/{demopage/locales/es-ES/demopage.ftl => homepage/locales/es-ES/homepage.ftl} (100%) rename pagetop/static/theme/module/{demopage => homepage}/styles.css (100%) create mode 100644 website/Cargo.toml create mode 100644 website/config/default.toml create mode 100644 website/src/main.rs diff --git a/.gitignore b/.gitignore index 3e04751d..0c5ec392 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -workdir **/target -**/log/*.log +**/log/*.log* +**/update.sh Cargo.lock +workdir diff --git a/Cargo.toml b/Cargo.toml index 00ab4e13..75cd1c81 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,5 @@ members = [ "pagetop-admin", "pagetop-user", "pagetop-node", + "website", ] \ No newline at end of file diff --git a/config/default.toml b/drust/config/default.toml similarity index 100% rename from config/default.toml rename to drust/config/default.toml diff --git a/drust/src/main.rs b/drust/src/main.rs index 4c210191..576d4bdb 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -8,13 +8,6 @@ impl AppTrait for Drust { &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, - &pagetop::base::module::demopage::Demopage, - ] - } - - fn themes(&self) -> Vec<&'static dyn ThemeTrait> { - vec![ - &pagetop::base::theme::bulmix::Bulmix, ] } } diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 6f175555..8acfaf7f 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -25,6 +25,10 @@ impl Application { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] Lazy::force(&super::db::DBCONN); + // Habilita los módulos predeterminados. + module::all::enable_modules(vec![ + &base::module::homepage::DefaultHomePage, + ]); // Habilita los módulos de la aplicación. module::all::enable_modules(app.enable_modules()); @@ -33,6 +37,7 @@ impl Application { &base::theme::aliner::Aliner, &base::theme::minimal::Minimal, &base::theme::bootsier::Bootsier, + &base::theme::bulmix::Bulmix, ]); // Registra los temas de la aplicación. theme::all::register_themes(app.themes()); diff --git a/pagetop/src/app/definition.rs b/pagetop/src/app/definition.rs index 4740d223..2c68e6cf 100644 --- a/pagetop/src/app/definition.rs +++ b/pagetop/src/app/definition.rs @@ -1,4 +1,3 @@ -use crate::base::module::demopage; use crate::core::module::ModuleTrait; use crate::core::theme::ThemeTrait; @@ -7,9 +6,7 @@ pub trait AppTrait: Send + Sync { } fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { - vec![ - &demopage::Demopage, - ] + vec![] } fn disable_modules(&self) -> Vec<&'static dyn ModuleTrait> { diff --git a/pagetop/src/base/module.rs b/pagetop/src/base/module.rs index 7107d180..070e5b82 100644 --- a/pagetop/src/base/module.rs +++ b/pagetop/src/base/module.rs @@ -1 +1 @@ -pub mod demopage; +pub mod homepage; diff --git a/pagetop/src/base/module/demopage.rs b/pagetop/src/base/module/homepage.rs similarity index 95% rename from pagetop/src/base/module/demopage.rs rename to pagetop/src/base/module/homepage.rs index f7940dfe..c43f7003 100644 --- a/pagetop/src/base/module/demopage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -1,14 +1,14 @@ use crate::prelude::*; -pub const MODULE_DEMOPAGE: &str = "pagetop::module::demopage"; +pub const MODULE_DEFAULT_HOMEPAGE: &str = "pagetop::module::homepage::default"; -localize!("src/base/module/demopage/locales"); +localize!("src/base/module/homepage/locales"); -pub struct Demopage; +pub struct DefaultHomePage; -impl ModuleTrait for Demopage { +impl ModuleTrait for DefaultHomePage { fn handler(&self) -> &'static str { - MODULE_DEMOPAGE + MODULE_DEFAULT_HOMEPAGE } fn name(&self) -> String { @@ -28,7 +28,7 @@ async fn demo() -> app::Result<Markup> { Page::new() .with_title(l("page_title").as_str()) .with_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/theme/module/demopage/styles.css") + StyleSheet::located("/theme/module/homepage/styles.css") ))) .add_to("content", hello_world()) .add_to("content", welcome()) diff --git a/pagetop/src/base/module/demopage/locales/en-US/demopage.ftl b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl similarity index 100% rename from pagetop/src/base/module/demopage/locales/en-US/demopage.ftl rename to pagetop/src/base/module/homepage/locales/en-US/homepage.ftl diff --git a/pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl similarity index 100% rename from pagetop/src/base/module/demopage/locales/es-ES/demopage.ftl rename to pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl diff --git a/pagetop/static/theme/module/demopage/styles.css b/pagetop/static/theme/module/homepage/styles.css similarity index 100% rename from pagetop/static/theme/module/demopage/styles.css rename to pagetop/static/theme/module/homepage/styles.css diff --git a/website/Cargo.toml b/website/Cargo.toml new file mode 100644 index 00000000..3ca2163a --- /dev/null +++ b/website/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "pagetop-website" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + PageTop and Drust website.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://gitlab.com/manuelcillero/pagetop/website" +license = "Apache-2.0 or MIT" + +[dependencies.pagetop] +path = "../pagetop" + +[dependencies] +actix-web = "4.1.0" diff --git a/website/config/default.toml b/website/config/default.toml new file mode 100644 index 00000000..3216329d --- /dev/null +++ b/website/config/default.toml @@ -0,0 +1,9 @@ +[app] +name = "PageTop WebSite" +description = """\ + The definitive PageTop Guide for PageTop Users.\ +""" +language = "es-ES" + +[log] +rolling = "Daily" diff --git a/website/src/main.rs b/website/src/main.rs new file mode 100644 index 00000000..fad7b05d --- /dev/null +++ b/website/src/main.rs @@ -0,0 +1,11 @@ +use pagetop::prelude::*; + +struct PageTopWebSite; + +impl AppTrait for PageTopWebSite { +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + Application::prepare(PageTopWebSite).await?.run()?.await +} From 4b5caf06a7bf9ccd5861b93adc33362f25028aca Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 19 Jul 2022 22:56:45 +0200 Subject: [PATCH 133/853] =?UTF-8?q?Actualiza=20cr=C3=A9ditos=20con=20info?= =?UTF-8?q?=20de=20la=20p=C3=A1gina=20de=20inicio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 4965de82..bd5f0f62 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,18 +1,21 @@ # FIGfonts -PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de -*yuanbohan*. Muestra en el terminal un rótulo de presentación con el nombre de -la aplicación usando caracteres [FIGlet](http://www.figlet.org/). Las fuentes -incluidas en `src/app/banner` son: +PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de *yuanbohan*. Muestra +en el terminal un rótulo de presentación con el nombre de la aplicación usando caracteres +[FIGlet](http://www.figlet.org). Las fuentes incluidas en `src/app/banner` son: -* [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) - por *Glenn Chappell*. -* [small.flf](http://www.figlet.org/fontdb_example.cgi?font=small.flf) - por *Glenn Chappell*, usado por defecto. -* [speed.flf](http://www.figlet.org/fontdb_example.cgi?font=speed.flf) - por *Claude Martins*. -* [starwars.flf](http://www.figlet.org/fontdb_example.cgi?font=starwars.flf) - por *Ryan Youck*. +* [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) por *Glenn Chappell*. +* [small.flf](http://www.figlet.org/fontdb_example.cgi?font=small.flf) por *Glenn Chappell* + (predeterminado). +* [speed.flf](http://www.figlet.org/fontdb_example.cgi?font=speed.flf) por *Claude Martins*. +* [starwars.flf](http://www.figlet.org/fontdb_example.cgi?font=starwars.flf) por *Ryan Youck*. + + +# Plantillas + +* El diseño de la página predeterminada de inicio está basado en la plantilla + [Zinc](https://themewagon.com/themes/free-bootstrap-5-html5-business-website-template-zinc) creada + por [inovatik](https://inovatik.com/) y distribuida por [ThemeWagon](https://themewagon.com). # Icono @@ -20,4 +23,4 @@ incluidas en `src/app/banner` son: El monstruo sonriente de Frankenstein es una divertida creación de [Webalys](https://www.iconfinder.com/webalys). Puede encontrarse en su colección [Nasty Icons](https://www.iconfinder.com/iconsets/nasty) disponible en -[ICONFINDER](https://www.iconfinder.com/). \ No newline at end of file +[ICONFINDER](https://www.iconfinder.com). \ No newline at end of file From e6ea59785ef42281f36c53b0924b419f7e0a70db Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 20 Jul 2022 00:01:01 +0200 Subject: [PATCH 134/853] =?UTF-8?q?Actualiza=20formato=20del=20c=C3=B3digo?= =?UTF-8?q?=20aplicando=20cargo=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 9 +- pagetop-admin/src/summary.rs | 55 ++-- pagetop-node/src/lib.rs | 10 +- ...m20220316_000001_create_table_node_type.rs | 78 ++---- .../m20220316_000002_create_table_node.rs | 98 +++----- ...0220316_000003_create_table_node_access.rs | 58 ++--- ...20316_000004_create_table_node_revision.rs | 78 ++---- pagetop-user/src/lib.rs | 42 ++-- .../m20220312_000001_create_table_role.rs | 84 ++++--- ...312_000002_create_table_role_permission.rs | 75 +++--- .../m20220312_000003_create_table_user.rs | 80 +++--- ...m20220312_000004_create_table_user_role.rs | 79 +++--- pagetop/build.rs | 2 +- pagetop/src/app.rs | 4 +- pagetop/src/app/application.rs | 22 +- pagetop/src/app/banner.rs | 6 +- pagetop/src/app/banner/figfont.rs | 39 ++- pagetop/src/app/db.rs | 107 ++++---- pagetop/src/app/definition.rs | 3 +- pagetop/src/app/locale.rs | 28 +-- pagetop/src/app/tracing.rs | 19 +- pagetop/src/base/component.rs | 40 +-- pagetop/src/base/component/anchor.rs | 16 +- pagetop/src/base/component/block.rs | 1 - pagetop/src/base/component/container.rs | 10 +- pagetop/src/base/component/form.rs | 20 +- pagetop/src/base/component/form/button.rs | 8 +- pagetop/src/base/component/form/date.rs | 1 - pagetop/src/base/component/form/form.rs | 8 +- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 44 +++- pagetop/src/base/component/grid.rs | 8 +- pagetop/src/base/component/grid/column.rs | 1 - pagetop/src/base/component/grid/row.rs | 1 - pagetop/src/base/component/heading.rs | 54 ++-- pagetop/src/base/component/icon.rs | 13 +- pagetop/src/base/component/menu.rs | 25 +- pagetop/src/base/component/paragraph.rs | 19 +- pagetop/src/base/module/homepage.rs | 237 +++++++++--------- pagetop/src/base/theme.rs | 3 + pagetop/src/base/theme/aliner.rs | 16 +- pagetop/src/base/theme/bootsier.rs | 76 +++--- pagetop/src/base/theme/bulmix.rs | 126 ++++++---- pagetop/src/config.rs | 21 +- pagetop/src/core.rs | 15 +- pagetop/src/core/component.rs | 15 +- pagetop/src/core/component/all.rs | 9 +- pagetop/src/core/component/bundle.rs | 4 +- pagetop/src/core/component/context.rs | 43 ++-- pagetop/src/core/component/definition.rs | 15 +- pagetop/src/core/hook.rs | 8 +- pagetop/src/core/hook/all.rs | 14 +- pagetop/src/core/hook/definition.rs | 4 +- pagetop/src/core/hook/holder.rs | 6 +- pagetop/src/core/module.rs | 5 +- pagetop/src/core/module/all.rs | 23 +- pagetop/src/core/module/definition.rs | 5 +- pagetop/src/core/theme.rs | 5 +- pagetop/src/core/theme/all.rs | 15 +- pagetop/src/core/theme/definition.rs | 87 ++++--- pagetop/src/html.rs | 8 +- pagetop/src/html/assets.rs | 30 +-- pagetop/src/html/assets/javascript.rs | 8 +- pagetop/src/html/assets/stylesheet.rs | 2 +- pagetop/src/html/classes.rs | 28 ++- pagetop/src/html/favicon.rs | 21 +- pagetop/src/lib.rs | 40 +-- pagetop/src/locale.rs | 2 +- pagetop/src/prelude.rs | 31 +-- pagetop/src/response/page.rs | 5 +- pagetop/src/response/page/definition.rs | 36 ++- pagetop/src/response/page/hook.rs | 2 +- pagetop/src/trace.rs | 2 +- pagetop/src/util.rs | 12 +- website/src/main.rs | 3 +- 75 files changed, 1069 insertions(+), 1160 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 5bd6dfb6..ddd03cb1 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -22,16 +22,11 @@ impl ModuleTrait for Admin { } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - cfg.service( - app::web::scope("/admin") - .route("", app::web::get().to(summary::summary)) - ); + cfg.service(app::web::scope("/admin").route("", app::web::get().to(summary::summary))); } fn actions(&self) -> Vec<HookAction> { - vec![ - hook_action!(BeforeRenderPageHook => before_render_page) - ] + vec![hook_action!(BeforeRenderPageHook => before_render_page)] } } diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index ffb1d014..01fd1650 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,19 +1,23 @@ -use pagetop::prelude::*; use super::l; +use pagetop::prelude::*; pub async fn summary() -> app::Result<Markup> { let top_menu = Menu::new() .with_item(MenuItem::label(l("module_name").as_str())) .with_item(MenuItem::link("Opción 2", "https://www.google.es")) .with_item(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .with_item(MenuItem::submenu("Submenú 1", Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")) + .with_item(MenuItem::submenu( + "Submenú 1", + Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")), )) .with_item(MenuItem::separator()) - .with_item(MenuItem::submenu("Submenú 2", Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")) + .with_item(MenuItem::submenu( + "Submenú 2", + Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")), )) .with_item(MenuItem::label("Opción 4")); @@ -21,38 +25,33 @@ pub async fn summary() -> app::Result<Markup> { .with_item(MenuItem::label("Opción 1")) .with_item(MenuItem::link("Opción 2", "https://www.google.es")) .with_item(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .with_item(MenuItem::submenu("Submenú 1", Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")) + .with_item(MenuItem::submenu( + "Submenú 1", + Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")), )) .with_item(MenuItem::separator()) - .with_item(MenuItem::submenu("Submenú 2", Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")) + .with_item(MenuItem::submenu( + "Submenú 2", + Menu::new() + .with_item(MenuItem::label("Opción 1")) + .with_item(MenuItem::label("Opción 2")), )) .with_item(MenuItem::label("Opción 4")); Page::new() - .with_context(InContextOp::SetTheme("Bootsier")) - .with_title("Admin") - .add_to("top-menu", top_menu) - - .add_to("content", grid::Row::new() - .with_column(grid::Column::new() - .with_component(side_menu) - ) - .with_column(grid::Column::new() - .with_component(Chunck::with(html! { + .add_to( + "content", + grid::Row::new() + .with_column(grid::Column::new().with_component(side_menu)) + .with_column(grid::Column::new().with_component(Chunck::with(html! { p { "Columna 2"} - })) - ) + }))), ) - - .using_template("admin") - .render() } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 98b06c66..a5c94d2e 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,9 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<HookAction> { - vec![ - hook_action!(BeforeRenderPageHook => before_render_page, -1) - ] + vec![hook_action!(BeforeRenderPageHook => before_render_page, -1)] } fn migrations(&self) -> Vec<MigrationItem> { @@ -43,11 +41,7 @@ impl ModuleTrait for Node { } async fn node() -> app::Result<Markup> { - Page::new() - .with_title( - "Nodo" - ) - .render() + Page::new().with_title("Nodo").render() } fn before_render_page(page: &mut Page) { diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 9065836a..60b76149 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -24,61 +24,35 @@ pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(NodeType::Table) - .if_not_exists() - .col(ColumnDef::new(NodeType::Type) - .integer() - .not_null() - .auto_increment() - .primary_key(), + manager + .create_table( + Table::create() + .table(NodeType::Table) + .if_not_exists() + .col( + ColumnDef::new(NodeType::Type) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(NodeType::Name).string().not_null()) + .col(ColumnDef::new(NodeType::Description).string().not_null()) + .col(ColumnDef::new(NodeType::Help).string().not_null()) + .col(ColumnDef::new(NodeType::HasTitle).string().not_null()) + .col(ColumnDef::new(NodeType::TitleLabel).string().not_null()) + .col(ColumnDef::new(NodeType::Custom).string().not_null()) + .col(ColumnDef::new(NodeType::Locked).string().not_null()) + .col(ColumnDef::new(NodeType::Disabled).string().not_null()) + .col(ColumnDef::new(NodeType::OrigType).string().not_null()) + .to_owned(), ) - .col(ColumnDef::new(NodeType::Name) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Description) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Help) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::HasTitle) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::TitleLabel) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Custom) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Locked) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::Disabled) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeType::OrigType) - .string() - .not_null() - ) - .to_owned() - ) - .await + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(NodeType::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(NodeType::Table).to_owned()) + .await } } diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index 1c8d7b12..c04c79ad 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -31,77 +31,39 @@ pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(Node::Table) - .if_not_exists() - .col(ColumnDef::new(Node::Nid) - .integer() - .not_null() - .auto_increment() - .primary_key(), + manager + .create_table( + Table::create() + .table(Node::Table) + .if_not_exists() + .col( + ColumnDef::new(Node::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Node::Vid).string().not_null()) + .col(ColumnDef::new(Node::Type).string().not_null()) + .col(ColumnDef::new(Node::Language).string().not_null()) + .col(ColumnDef::new(Node::Title).string().not_null()) + .col(ColumnDef::new(Node::Uid).string().not_null()) + .col(ColumnDef::new(Node::Status).string().not_null()) + .col(ColumnDef::new(Node::Created).string().not_null()) + .col(ColumnDef::new(Node::Changed).string().not_null()) + .col(ColumnDef::new(Node::Comment).string().not_null()) + .col(ColumnDef::new(Node::Promote).string().not_null()) + .col(ColumnDef::new(Node::Sticky).string().not_null()) + .col(ColumnDef::new(Node::Tnid).string().not_null()) + .col(ColumnDef::new(Node::Translate).string().not_null()) + .to_owned(), ) - .col(ColumnDef::new(Node::Vid) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Type) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Language) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Title) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Uid) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Status) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Created) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Changed) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Comment) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Promote) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Sticky) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Tnid) - .string() - .not_null() - ) - .col(ColumnDef::new(Node::Translate) - .string() - .not_null() - ) - .to_owned() - ) - .await + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(Node::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(Node::Table).to_owned()) + .await } } diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index 3fa19d66..fdf627cf 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -23,45 +23,31 @@ pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(NodeAccess::Table) - .if_not_exists() - .col(ColumnDef::new(NodeAccess::Nid) - .integer() - .not_null() - .auto_increment() - .primary_key(), + manager + .create_table( + Table::create() + .table(NodeAccess::Table) + .if_not_exists() + .col( + ColumnDef::new(NodeAccess::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(NodeAccess::Gid).string().not_null()) + .col(ColumnDef::new(NodeAccess::Realm).string().not_null()) + .col(ColumnDef::new(NodeAccess::GrantView).string().not_null()) + .col(ColumnDef::new(NodeAccess::GrantUpdate).string().not_null()) + .col(ColumnDef::new(NodeAccess::GrantDelete).string().not_null()) + .to_owned(), ) - .col(ColumnDef::new(NodeAccess::Gid) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::Realm) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::GrantView) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::GrantUpdate) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeAccess::GrantDelete) - .string() - .not_null() - ) - .to_owned() - ) - .await + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(NodeAccess::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(NodeAccess::Table).to_owned()) + .await } } diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 621628a6..8d314d6e 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -25,61 +25,35 @@ pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(NodeRevision::Table) - .if_not_exists() - .col(ColumnDef::new(NodeRevision::Nid) - .integer() - .not_null() - .auto_increment() - .primary_key(), + manager + .create_table( + Table::create() + .table(NodeRevision::Table) + .if_not_exists() + .col( + ColumnDef::new(NodeRevision::Nid) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(NodeRevision::Vid).string().not_null()) + .col(ColumnDef::new(NodeRevision::Uid).string().not_null()) + .col(ColumnDef::new(NodeRevision::Title).string().not_null()) + .col(ColumnDef::new(NodeRevision::Log).string().not_null()) + .col(ColumnDef::new(NodeRevision::Timestamp).string().not_null()) + .col(ColumnDef::new(NodeRevision::Status).string().not_null()) + .col(ColumnDef::new(NodeRevision::Comment).string().not_null()) + .col(ColumnDef::new(NodeRevision::Promote).string().not_null()) + .col(ColumnDef::new(NodeRevision::Sticky).string().not_null()) + .to_owned(), ) - .col(ColumnDef::new(NodeRevision::Vid) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Uid) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Title) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Log) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Timestamp) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Status) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Comment) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Promote) - .string() - .not_null() - ) - .col(ColumnDef::new(NodeRevision::Sticky) - .string() - .not_null() - ) - .to_owned() - ) - .await + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(NodeRevision::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(NodeRevision::Table).to_owned()) + .await } } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index d250adfc..9127e1fd 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -37,12 +37,12 @@ impl ModuleTrait for User { async fn login() -> app::Result<Markup> { Page::new() - .with_title( - "Identificación del usuario" - ) - .add_to("content", Container::new() - .with_id("welcome") - .with_component(form_login()) + .with_title("Identificación del usuario") + .add_to( + "content", + Container::new() + .with_id("welcome") + .with_component(form_login()), ) .render() } @@ -50,18 +50,26 @@ async fn login() -> app::Result<Markup> { fn form_login() -> Form { Form::new() .with_id("user-login") - .with_element(form::Input::textfield() - .with_name("name") - .with_label(l("username").as_str()) - .with_help_text(t("username_help", &args![ - "app" => SETTINGS.app.name.to_owned() - ]).as_str()) - .with_autofocus(true) + .with_element( + form::Input::textfield() + .with_name("name") + .with_label(l("username").as_str()) + .with_help_text( + t( + "username_help", + &args![ + "app" => SETTINGS.app.name.to_owned() + ], + ) + .as_str(), + ) + .with_autofocus(true), ) - .with_element(form::Input::password() - .with_name("pass") - .with_label(l("password").as_str()) - .with_help_text(l("password_help").as_str()) + .with_element( + form::Input::password() + .with_name("pass") + .with_label(l("password").as_str()) + .with_help_text(l("password_help").as_str()), ) .with_element(form::Button::submit(l("login").as_str())) } diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index 649115ac..0f871aee 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -14,51 +14,57 @@ pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(Role::Table) - .if_not_exists() - .col(ColumnDef::new(Role::Rid) - .unsigned() - .not_null() - .auto_increment() - .primary_key() + manager + .create_table( + Table::create() + .table(Role::Table) + .if_not_exists() + .col( + ColumnDef::new(Role::Rid) + .unsigned() + .not_null() + .auto_increment() + .primary_key(), + ) + .col( + ColumnDef::new(Role::Name) + .string_len(64) + .not_null() + .unique_key(), + ) + .col( + ColumnDef::new(Role::Weight) + .integer() + .not_null() + .default(10), + ) + // INDEXES. + .index( + Index::create() + .name("weight-name") + .col(Role::Weight) + .col(Role::Name), + ) + .to_owned(), ) - .col(ColumnDef::new(Role::Name) - .string_len(64) - .not_null() - .unique_key() - ) - .col(ColumnDef::new(Role::Weight) - .integer() - .not_null() - .default(10) - ) - // INDEXES. - .index(Index::create() - .name("weight-name") - .col(Role::Weight) - .col(Role::Name) - ) - .to_owned() - ) - .await?; + .await?; // Built-in roles. - app::db::exec::<InsertStatement>(Query::insert() - .into_table(Role::Table) - .columns(vec![Role::Name, Role::Weight]) - .values_panic(vec!["anonymous".into(), "1".into()]) - .values_panic(vec!["authenticated".into(), "2".into()]) - .values_panic(vec!["administrator".into(), "3".into()]) + app::db::exec::<InsertStatement>( + Query::insert() + .into_table(Role::Table) + .columns(vec![Role::Name, Role::Weight]) + .values_panic(vec!["anonymous".into(), "1".into()]) + .values_panic(vec!["authenticated".into(), "2".into()]) + .values_panic(vec!["administrator".into(), "3".into()]), ) - .await.map(|_| ()) + .await + .map(|_| ()) } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(Role::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(Role::Table).to_owned()) + .await } } diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index 7869f029..6ac5c963 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -9,50 +9,55 @@ enum RolePermission { } #[derive(Iden)] -enum Role { Table, Rid, /* ... */ } +enum Role { + Table, + Rid, + /* ... */ +} pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(RolePermission::Table) - .if_not_exists() - .col(ColumnDef::new(RolePermission::Rid) - .unsigned() - .not_null() + manager + .create_table( + Table::create() + .table(RolePermission::Table) + .if_not_exists() + .col(ColumnDef::new(RolePermission::Rid).unsigned().not_null()) + .col( + ColumnDef::new(RolePermission::Permission) + .string_len(128) + .not_null(), + ) + // INDEXES. + .primary_key( + Index::create() + .col(RolePermission::Rid) + .col(RolePermission::Permission), + ) + .index( + Index::create() + .name("permission") + .col(RolePermission::Permission), + ) + .foreign_key( + ForeignKey::create() + .name("fk_role_permission-rid") + .from(RolePermission::Table, RolePermission::Rid) + .to(Role::Table, Role::Rid) + .on_delete(ForeignKeyAction::Restrict) + .on_update(ForeignKeyAction::Restrict), + ) + .to_owned(), ) - .col(ColumnDef::new(RolePermission::Permission) - .string_len(128) - .not_null() - ) - // INDEXES. - .primary_key(Index::create() - .col(RolePermission::Rid) - .col(RolePermission::Permission) - ) - .index(Index::create() - .name("permission") - .col(RolePermission::Permission) - ) - .foreign_key(ForeignKey::create() - .name("fk_role_permission-rid") - .from(RolePermission::Table, RolePermission::Rid) - .to(Role::Table, Role::Rid) - .on_delete(ForeignKeyAction::Restrict) - .on_update(ForeignKeyAction::Restrict) - ) - .to_owned() - ) - .await + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(RolePermission::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(RolePermission::Table).to_owned()) + .await } } diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index ed3d85f7..7bae11ba 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -21,59 +21,39 @@ pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(User::Table) - .if_not_exists() - .col(ColumnDef::new(User::Uid) - .unsigned() - .not_null() - .primary_key() + manager + .create_table( + Table::create() + .table(User::Table) + .if_not_exists() + .col( + ColumnDef::new(User::Uid) + .unsigned() + .not_null() + .primary_key(), + ) + .col( + ColumnDef::new(User::Name) + .string_len(60) + .not_null() + .unique_key(), + ) + .col(ColumnDef::new(User::Pass).string_len(128).not_null()) + .col(ColumnDef::new(User::Mail).string_len(255)) + .col(ColumnDef::new(User::Created).timestamp().not_null()) + .col(ColumnDef::new(User::Changed).timestamp().not_null()) + .col(ColumnDef::new(User::Access).timestamp().not_null()) + .col(ColumnDef::new(User::Login).timestamp().not_null()) + .col(ColumnDef::new(User::Status).boolean().not_null()) + .col(ColumnDef::new(User::Timezone).string_len(32)) + .to_owned(), ) - .col(ColumnDef::new(User::Name) - .string_len(60) - .not_null() - .unique_key() - ) - .col(ColumnDef::new(User::Pass) - .string_len(128) - .not_null() - ) - .col(ColumnDef::new(User::Mail) - .string_len(255) - ) - .col(ColumnDef::new(User::Created) - .timestamp() - .not_null() - ) - .col(ColumnDef::new(User::Changed) - .timestamp() - .not_null() - ) - .col(ColumnDef::new(User::Access) - .timestamp() - .not_null() - ) - .col(ColumnDef::new(User::Login) - .timestamp() - .not_null() - ) - .col(ColumnDef::new(User::Status) - .boolean() - .not_null() - ) - .col(ColumnDef::new(User::Timezone) - .string_len(32) - ) - .to_owned() - ) - .await + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(User::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(User::Table).to_owned()) + .await } } diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index cae74e3e..d70ab270 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -9,56 +9,57 @@ enum UserRole { } #[derive(Iden)] -enum User { Table, Uid, /* ... */ } +enum User { + Table, + Uid, + /* ... */ +} #[derive(Iden)] -enum Role { Table, Rid, /* ... */ } +enum Role { + Table, + Rid, + /* ... */ +} pub_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.create_table(Table::create() - .table(UserRole::Table) - .if_not_exists() - .col(ColumnDef::new(UserRole::Uid) - .unsigned() - .not_null() + manager + .create_table( + Table::create() + .table(UserRole::Table) + .if_not_exists() + .col(ColumnDef::new(UserRole::Uid).unsigned().not_null()) + .col(ColumnDef::new(UserRole::Rid).unsigned().not_null()) + // INDEXES. + .primary_key(Index::create().col(UserRole::Uid).col(UserRole::Rid)) + .foreign_key( + ForeignKey::create() + .name("fk_user_role-uid") + .from(UserRole::Table, UserRole::Uid) + .to(User::Table, User::Uid) + .on_delete(ForeignKeyAction::Restrict) + .on_update(ForeignKeyAction::Restrict), + ) + .foreign_key( + ForeignKey::create() + .name("fk_user_role-rid") + .from(UserRole::Table, UserRole::Rid) + .to(Role::Table, Role::Rid) + .on_delete(ForeignKeyAction::Restrict) + .on_update(ForeignKeyAction::Restrict), + ) + .to_owned(), ) - .col(ColumnDef::new(UserRole::Rid) - .unsigned() - .not_null() - ) - // INDEXES. - .primary_key(Index::create() - .col(UserRole::Uid) - .col(UserRole::Rid) - ) - .foreign_key(ForeignKey::create() - .name("fk_user_role-uid") - .from(UserRole::Table, UserRole::Uid) - .to(User::Table, User::Uid) - .on_delete(ForeignKeyAction::Restrict) - .on_update(ForeignKeyAction::Restrict) - ) - .foreign_key(ForeignKey::create() - .name("fk_user_role-rid") - .from(UserRole::Table, UserRole::Rid) - .to(Role::Table, Role::Rid) - .on_delete(ForeignKeyAction::Restrict) - .on_update(ForeignKeyAction::Restrict) - ) - .to_owned() - ) - .await + .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager.drop_table(Table::drop() - .table(UserRole::Table) - .to_owned() - ) - .await + manager + .drop_table(Table::drop().table(UserRole::Table).to_owned()) + .await } } diff --git a/pagetop/build.rs b/pagetop/build.rs index c0b8812e..d27cb3cd 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -13,7 +13,7 @@ fn main() -> std::io::Result<()> { fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { let mut resource = resource_dir(dir); resource.with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)) + Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), ); resource.with_module_name(format!("resources_{}", name)); resource.build() diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 17bd0509..fbaf9b75 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,6 +1,4 @@ -pub use actix_web::{ - App, HttpRequest, HttpResponse, HttpServer, Responder, Result, http, web -}; +pub use actix_web::{http, web, App, HttpRequest, HttpResponse, HttpServer, Responder, Result}; mod banner; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 8acfaf7f..c2fde5fd 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,10 +1,10 @@ -use crate::{Lazy, base, trace}; +use super::AppTrait; use crate::config::SETTINGS; use crate::core::{module, theme}; -use super::AppTrait; +use crate::{base, trace, Lazy}; -use std::io::Error; use actix_web::dev::Server; +use std::io::Error; pub struct Application { server: Server, @@ -26,9 +26,7 @@ impl Application { Lazy::force(&super::db::DBCONN); // Habilita los módulos predeterminados. - module::all::enable_modules(vec![ - &base::module::homepage::DefaultHomePage, - ]); + module::all::enable_modules(vec![&base::module::homepage::DefaultHomePage]); // Habilita los módulos de la aplicación. module::all::enable_modules(app.enable_modules()); @@ -59,12 +57,12 @@ impl Application { .wrap(tracing_actix_web::TracingLogger::default()) .configure(&module::all::modules) .configure(&theme::all::themes) - }) - .bind(format!("{}:{}", - &SETTINGS.webserver.bind_address, - &SETTINGS.webserver.bind_port - ))? - .run(); + }) + .bind(format!( + "{}:{}", + &SETTINGS.webserver.bind_address, &SETTINGS.webserver.bind_port + ))? + .run(); Ok(Self { server }) } diff --git a/pagetop/src/app/banner.rs b/pagetop/src/app/banner.rs index a4dfd5b3..1e50e54a 100644 --- a/pagetop/src/app/banner.rs +++ b/pagetop/src/app/banner.rs @@ -14,7 +14,8 @@ pub fn print_on_startup() { if SETTINGS.app.name.len() > maxlen { app = format!("{}...", app); } - println!("\n{} {}\n\n Powered by PageTop {}\n", + println!( + "\n{} {}\n\n Powered by PageTop {}\n", FIGFONT.convert(&app).unwrap(), &SETTINGS.app.description, env!("CARGO_PKG_VERSION") @@ -22,7 +23,8 @@ pub fn print_on_startup() { return; } } - println!("\n{}\n{}\n\nPowered by PageTop {}\n", + println!( + "\n{}\n{}\n\nPowered by PageTop {}\n", &SETTINGS.app.name, &SETTINGS.app.description, env!("CARGO_PKG_VERSION") diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index 8fe0a4e7..a2702655 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -1,30 +1,27 @@ -use crate::Lazy; use crate::config::SETTINGS; +use crate::Lazy; use figlet_rs::FIGfont; pub static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { - let slant = include_str!("slant.flf"); - let small = include_str!("small.flf"); - let speed = include_str!("speed.flf"); + let slant = include_str!("slant.flf"); + let small = include_str!("small.flf"); + let speed = include_str!("speed.flf"); let starwars = include_str!("starwars.flf"); - FIGfont::from_content( - match SETTINGS.app.startup_banner.to_lowercase().as_str() { - "off" => slant, - "slant" => slant, - "small" => small, - "speed" => speed, - "starwars" => starwars, - _ => { - println!( - "\n FIGfont \"{}\" not found for banner. {}. {}.", - SETTINGS.app.startup_banner, - "Using \"Slant\"", - "Check the settings file", - ); - slant - } + FIGfont::from_content(match SETTINGS.app.startup_banner.to_lowercase().as_str() { + "off" => slant, + "slant" => slant, + "small" => small, + "speed" => speed, + "starwars" => starwars, + _ => { + println!( + "\n FIGfont \"{}\" not found for banner. {}. {}.", + SETTINGS.app.startup_banner, "Using \"Slant\"", "Check the settings file", + ); + slant } - ).unwrap() + }) + .unwrap() }); diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index aa3f0045..3b4cb282 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,8 +1,8 @@ -use crate::{Lazy, run_now, trace}; use crate::config::SETTINGS; use crate::db::*; +use crate::{run_now, trace, Lazy}; -use sea_orm::{ConnectionTrait, ConnectOptions, Database, DatabaseBackend, Statement}; +use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; use tracing_unwrap::ResultExt; pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { @@ -14,31 +14,36 @@ pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { let db_uri = match SETTINGS.database.db_type.as_str() { "mysql" | "postgres" => { - let mut tmp_uri = DbUri::parse(format!( - "{}://{}/{}", - &SETTINGS.database.db_type, - &SETTINGS.database.db_host, - &SETTINGS.database.db_name - ).as_str()).unwrap(); - tmp_uri.set_username( - &SETTINGS.database.db_user.as_str() - ).unwrap(); + let mut tmp_uri = DbUri::parse( + format!( + "{}://{}/{}", + &SETTINGS.database.db_type, + &SETTINGS.database.db_host, + &SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(); + tmp_uri + .set_username(&SETTINGS.database.db_user.as_str()) + .unwrap(); // https://github.com/launchbadge/sqlx/issues/1624 - tmp_uri.set_password( - Some(&SETTINGS.database.db_pass.as_str()) - ).unwrap(); + tmp_uri + .set_password(Some(&SETTINGS.database.db_pass.as_str())) + .unwrap(); if SETTINGS.database.db_port != 0 { - tmp_uri.set_port( - Some(SETTINGS.database.db_port) - ).unwrap(); + tmp_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); } tmp_uri - }, + } "sqlite" => DbUri::parse( - format!("{}://{}", - &SETTINGS.database.db_type, - &SETTINGS.database.db_name - ).as_str()).unwrap(), + format!( + "{}://{}", + &SETTINGS.database.db_type, &SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(), _ => { trace::error!( "Unrecognized database type \"{}\"", @@ -48,42 +53,44 @@ pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { } }; - run_now( - Database::connect::<ConnectOptions>({ - let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(SETTINGS.database.max_pool_size); - db_opt.into() - }) - ).expect_or_log("Failed to connect to database") -}); - -static DBBACKEND: Lazy<DatabaseBackend> = Lazy::new(|| { - DBCONN.get_database_backend() + run_now(Database::connect::<ConnectOptions>({ + let mut db_opt = ConnectOptions::new(db_uri.to_string()); + db_opt.max_connections(SETTINGS.database.max_pool_size); + db_opt.into() + })) + .expect_or_log("Failed to connect to database") }); +static DBBACKEND: Lazy<DatabaseBackend> = Lazy::new(|| DBCONN.get_database_backend()); pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { - DBCONN.query_all(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - } - )).await + DBCONN + .query_all(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await } pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { - DBCONN.query_one(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - } - )).await + DBCONN + .query_one(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await } pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { - DBCONN.execute(Statement::from_string(*DBBACKEND, stmt)).await + DBCONN + .execute(Statement::from_string(*DBBACKEND, stmt)) + .await } diff --git a/pagetop/src/app/definition.rs b/pagetop/src/app/definition.rs index 2c68e6cf..1d470a59 100644 --- a/pagetop/src/app/definition.rs +++ b/pagetop/src/app/definition.rs @@ -2,8 +2,7 @@ use crate::core::module::ModuleTrait; use crate::core::theme::ThemeTrait; pub trait AppTrait: Send + Sync { - fn bootstrap(&self) { - } + fn bootstrap(&self) {} fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { vec![] diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index 59fc8468..af7a57c8 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -1,24 +1,22 @@ -use crate::{Lazy, trace}; use crate::config::SETTINGS; +use crate::{trace, Lazy}; use unic_langid::LanguageIdentifier; /// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] /// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de /// la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| { - match SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "{}, {} \"{}\"! {}, {}", - "Failed to parse language", - "unrecognized Unicode Language Identifier", - SETTINGS.app.language, - "Using \"en-US\"", - "check the settings file", - ); - "en-US".parse().unwrap() - } +pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| match SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "{}, {} \"{}\"! {}, {}", + "Failed to parse language", + "unrecognized Unicode Language Identifier", + SETTINGS.app.language, + "Using \"en-US\"", + "check the settings file", + ); + "en-US".parse().unwrap() } }); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index a9804213..35625407 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -1,5 +1,5 @@ -use crate::Lazy; use crate::config::SETTINGS; +use crate::Lazy; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; @@ -18,14 +18,11 @@ use tracing_subscriber::EnvFilter; /// enviarán antes de terminar la ejecución. pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { - let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing) - .unwrap_or(EnvFilter::new("Info")); + let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or(EnvFilter::new("Info")); let rolling = SETTINGS.log.rolling.to_lowercase(); let (non_blocking, guard) = match rolling.as_str() { - "stdout" => tracing_appender::non_blocking( - std::io::stdout() - ), + "stdout" => tracing_appender::non_blocking(std::io::stdout()), _ => tracing_appender::non_blocking({ let path = &SETTINGS.log.path; let prefix = &SETTINGS.log.prefix; @@ -37,14 +34,12 @@ pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { _ => { println!( "Rolling value \"{}\" not valid. {}. {}.", - SETTINGS.log.rolling, - "Using \"daily\"", - "Check the settings file", + SETTINGS.log.rolling, "Using \"daily\"", "Check the settings file", ); tracing_appender::rolling::daily(path, prefix) } } - }) + }), }; let subscriber = tracing_subscriber::fmt() .with_env_filter(env_filter) @@ -58,9 +53,7 @@ pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { _ => { println!( "Tracing format \"{}\" not valid. {}. {}.", - SETTINGS.log.format, - "Using \"Full\"", - "Check the settings file", + SETTINGS.log.format, "Using \"Full\"", "Check the settings file", ); subscriber.init(); } diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 366c7ff3..77eeb44d 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -1,44 +1,24 @@ mod container; -pub use container::{ - COMPONENT_CONTAINER, Container, ContainerType -}; +pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; pub mod grid; mod chunck; -pub use chunck::{ - COMPONENT_CHUNCK, Chunck -}; +pub use chunck::{Chunck, COMPONENT_CHUNCK}; mod icon; -pub use icon::{ - COMPONENT_ICON, Icon -}; +pub use icon::{Icon, COMPONENT_ICON}; mod heading; -pub use heading::{ - COMPONENT_HEADING, Heading, HeadingDisplay, HeadingType -}; +pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; mod paragraph; -pub use paragraph::{ - COMPONENT_PARAGRAPH, Paragraph, ParagraphDisplay -}; +pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; mod anchor; -pub use anchor::{ - COMPONENT_ANCHOR, Anchor, AnchorIcon, AnchorTarget, AnchorType -}; +pub use anchor::{Anchor, AnchorIcon, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; mod block; -pub use block::{ - COMPONENT_BLOCK, Block -}; +pub use block::{Block, COMPONENT_BLOCK}; mod image; -pub use image::{ - COMPONENT_IMAGE, Image -}; +pub use image::{Image, COMPONENT_IMAGE}; mod menu; -pub use menu::{ - COMPONENT_MENU, COMPONENT_MENUITEM, Menu, MenuItem, MenuItemType -}; +pub use menu::{Menu, MenuItem, MenuItemType, COMPONENT_MENU, COMPONENT_MENUITEM}; pub mod form; -pub use form::{ - COMPONENT_FORM, Form, FormMethod -}; +pub use form::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index e1532888..22ab34a0 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -98,7 +98,10 @@ impl Anchor { } pub fn button(href: &str, html: Markup) -> Self { - Anchor::new().with_type(AnchorType::Button).with_href(href).with_html(html) + Anchor::new() + .with_type(AnchorType::Button) + .with_href(href) + .with_html(html) } pub fn location(id: &str) -> Self { @@ -186,10 +189,13 @@ impl Anchor { pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { self.anchor_type = anchor_type; - self.classes.alter(ClassesOp::SetDefault, match self.anchor_type { - AnchorType::Button => "btn btn-primary", - _ => "", - }); + self.classes.alter( + ClassesOp::SetDefault, + match self.anchor_type { + AnchorType::Button => "btn btn-primary", + _ => "", + }, + ); self } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 8740d522..4b77ef31 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -71,7 +71,6 @@ impl ComponentTrait for Block { } impl Block { - // Block BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 2f64e762..70271eb1 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -7,7 +7,13 @@ hook_before_render_component!( Container ); -pub enum ContainerType { Header, Footer, Main, Section, Wrapper } +pub enum ContainerType { + Header, + Footer, + Main, + Section, + Wrapper, +} pub struct Container { weight : isize, @@ -84,7 +90,7 @@ impl ComponentTrait for Container { div id=[self.id().get()] class=[self.classes().get()] { (self.components().render(context)) } - } + }, } } diff --git a/pagetop/src/base/component/form.rs b/pagetop/src/base/component/form.rs index 4b17e5c3..bbd4e309 100644 --- a/pagetop/src/base/component/form.rs +++ b/pagetop/src/base/component/form.rs @@ -1,21 +1,11 @@ mod form; -pub use form::{ - COMPONENT_FORM, Form, FormMethod -}; +pub use form::{Form, FormMethod, COMPONENT_FORM}; mod input; -pub use input::{ - COMPONENT_INPUT, Input, InputType -}; +pub use input::{Input, InputType, COMPONENT_INPUT}; mod hidden; -pub use hidden::{ - COMPONENT_HIDDEN, Hidden -}; +pub use hidden::{Hidden, COMPONENT_HIDDEN}; mod date; -pub use date::{ - COMPONENT_DATE, Date -}; +pub use date::{Date, COMPONENT_DATE}; mod button; -pub use button::{ - COMPONENT_BUTTON, Button, ButtonType -}; +pub use button::{Button, ButtonType, COMPONENT_BUTTON}; diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 1414f6a8..f5bee082 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -2,7 +2,11 @@ use crate::prelude::*; pub const COMPONENT_BUTTON: &str = "pagetop::component::form::button"; -pub enum ButtonType {Button, Reset, Submit} +pub enum ButtonType { + Button, + Reset, + Submit, +} pub struct Button { weight : isize, @@ -52,7 +56,7 @@ impl ComponentTrait for Button { }; let id = match self.name().get() { Some(name) => Some(concat_string!("edit-", name)), - _ => None + _ => None, }; html! { button diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index cbb6593f..21d24cbf 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -101,7 +101,6 @@ impl ComponentTrait for Date { } impl Date { - // Date BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form/form.rs index cfe973ba..8b562f56 100644 --- a/pagetop/src/base/component/form/form.rs +++ b/pagetop/src/base/component/form/form.rs @@ -7,7 +7,10 @@ hook_before_render_component!( Form ); -pub enum FormMethod {Get, Post} +pub enum FormMethod { + Get, + Post, +} pub struct Form { weight : isize, @@ -55,7 +58,7 @@ impl ComponentTrait for Form { fn default_render(&self, context: &mut InContext) -> Markup { let method = match self.method() { FormMethod::Get => None, - FormMethod::Post => Some("post".to_owned()) + FormMethod::Post => Some("post".to_owned()), }; html! { form @@ -80,7 +83,6 @@ impl ComponentTrait for Form { } impl Form { - // Form BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index b233f7fe..3ee5c2f5 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -28,7 +28,7 @@ impl ComponentTrait for Hidden { fn default_render(&self, _: &mut InContext) -> Markup { let id = match self.name().get() { Some(name) => Some(concat_string!("value-", name)), - _ => None + _ => None, }; html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 505014e4..6cb50d96 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -2,7 +2,14 @@ use crate::prelude::*; pub const COMPONENT_INPUT: &str = "pagetop::component::form::input"; -pub enum InputType {Email, Password, Search, Telephone, Textfield, Url} +pub enum InputType { + Email, + Password, + Search, + Telephone, + Textfield, + Url, +} pub struct Input { weight : isize, @@ -127,36 +134,46 @@ impl Input { } pub fn password() -> Self { - let mut input = Input::new() - .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-password"); + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-password", + ); input.input_type = InputType::Password; input } pub fn search() -> Self { - let mut input = Input::new() - .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-search"); + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-search", + ); input.input_type = InputType::Search; input } pub fn email() -> Self { - let mut input = Input::new() - .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-email"); + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-email" + ); input.input_type = InputType::Email; input } pub fn telephone() -> Self { - let mut input = Input::new() - .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-telephone"); + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-telephone", + ); input.input_type = InputType::Telephone; input } pub fn url() -> Self { - let mut input = Input::new() - .with_classes(ClassesOp::Replace("form-type-textfield"), "form-type-url"); + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-url" + ); input.input_type = InputType::Url; input } @@ -267,8 +284,9 @@ impl Input { pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.with_value(name); - self.alter_classes(ClassesOp::SetDefault, - concat_string!("form-item form-item-", name).as_str() + self.alter_classes( + ClassesOp::SetDefault, + concat_string!("form-item form-item-", name).as_str(), ); self } diff --git a/pagetop/src/base/component/grid.rs b/pagetop/src/base/component/grid.rs index 17663df6..b85bf837 100644 --- a/pagetop/src/base/component/grid.rs +++ b/pagetop/src/base/component/grid.rs @@ -1,8 +1,4 @@ mod row; -pub use row::{ - COMPONENT_ROW, Row -}; +pub use row::{Row, COMPONENT_ROW}; mod column; -pub use column::{ - COMPONENT_COLUMN, Column, ColumnSize -}; +pub use column::{Column, ColumnSize, COMPONENT_COLUMN}; diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 0a988599..d0b0e2ed 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -93,7 +93,6 @@ impl ComponentTrait for Column { } impl Column { - // Column BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 0cf59b90..117cf499 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -62,7 +62,6 @@ impl ComponentTrait for Row { } impl Row { - // Row BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 65685c12..0dbbcdea 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -2,7 +2,14 @@ use crate::prelude::*; pub const COMPONENT_HEADING: &str = "pagetop::component::heading"; -pub enum HeadingType { H1, H2, H3, H4, H5, H6 } +pub enum HeadingType { + H1, + H2, + H3, + H4, + H5, + H6, +} pub enum HeadingDisplay { XxLarge, @@ -75,27 +82,39 @@ impl ComponentTrait for Heading { impl Heading { pub fn h1(html: Markup) -> Self { - Heading::new().with_heading_type(HeadingType::H1).with_html(html) + Heading::new() + .with_heading_type(HeadingType::H1) + .with_html(html) } pub fn h2(html: Markup) -> Self { - Heading::new().with_heading_type(HeadingType::H2).with_html(html) + Heading::new() + .with_heading_type(HeadingType::H2) + .with_html(html) } pub fn h3(html: Markup) -> Self { - Heading::new().with_heading_type(HeadingType::H3).with_html(html) + Heading::new() + .with_heading_type(HeadingType::H3) + .with_html(html) } pub fn h4(html: Markup) -> Self { - Heading::new().with_heading_type(HeadingType::H4).with_html(html) + Heading::new() + .with_heading_type(HeadingType::H4) + .with_html(html) } pub fn h5(html: Markup) -> Self { - Heading::new().with_heading_type(HeadingType::H5).with_html(html) + Heading::new() + .with_heading_type(HeadingType::H5) + .with_html(html) } pub fn h6(html: Markup) -> Self { - Heading::new().with_heading_type(HeadingType::H6).with_html(html) + Heading::new() + .with_heading_type(HeadingType::H6) + .with_html(html) } // Heading BUILDER. @@ -174,15 +193,18 @@ impl Heading { pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; - self.classes.alter(ClassesOp::SetDefault, match &self.display() { - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::Large => "display-3", - HeadingDisplay::Medium => "display-4", - HeadingDisplay::Small => "display-5", - HeadingDisplay::XxSmall => "display-6", - HeadingDisplay::Normal => "", - HeadingDisplay::Subtitle => "", - }); + self.classes.alter( + ClassesOp::SetDefault, + match &self.display() { + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::Large => "display-3", + HeadingDisplay::Medium => "display-4", + HeadingDisplay::Small => "display-5", + HeadingDisplay::XxSmall => "display-6", + HeadingDisplay::Normal => "", + HeadingDisplay::Subtitle => "", + }, + ); self } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 00c7ec24..4722fe63 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -32,11 +32,9 @@ impl ComponentTrait for Icon { } fn before_render(&mut self, context: &mut InContext) { - context - .alter(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/theme/icons/bootstrap-icons.css") - .with_version("1.8.2") - ))); + context.alter(InContextOp::StyleSheet(AssetsOp::Add( + StyleSheet::located("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), + ))); } fn default_render(&self, _: &mut InContext) -> Markup { @@ -93,7 +91,10 @@ impl Icon { pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { self.icon_name = name.to_owned(); - self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", self.icon_name).as_str()); + self.alter_classes( + ClassesOp::SetDefault, + concat_string!("bi-", self.icon_name).as_str(), + ); self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 2c0e94e5..acae967a 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -94,10 +94,7 @@ impl MenuItem { MenuItem { weight : 0, renderable: render_always, - item_type : MenuItemType::Link( - label.to_owned(), - path.to_owned(), - ), + item_type : MenuItemType::Link(label.to_owned(), path.to_owned()), } } @@ -105,10 +102,7 @@ impl MenuItem { MenuItem { weight : 0, renderable: render_always, - item_type : MenuItemType::LinkBlank( - label.to_owned(), - path.to_owned(), - ), + item_type : MenuItemType::LinkBlank(label.to_owned(), path.to_owned()), } } @@ -132,10 +126,7 @@ impl MenuItem { MenuItem { weight : 0, renderable: render_always, - item_type : MenuItemType::Submenu( - label.to_owned(), - menu - ), + item_type : MenuItemType::Submenu(label.to_owned(), menu), } } @@ -219,16 +210,13 @@ impl ComponentTrait for Menu { fn default_render(&self, context: &mut InContext) -> Markup { context .alter(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/theme/menu/css/menu.css") - .with_version("1.1.1") + StyleSheet::located("/theme/menu/css/menu.css").with_version("1.1.1"), ))) .alter(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/theme/menu/css/menu-clean.css") - .with_version("1.1.1") + StyleSheet::located("/theme/menu/css/menu-clean.css").with_version("1.1.1"), ))) .alter(InContextOp::JavaScript(AssetsOp::Add( - JavaScript::located("/theme/menu/js/menu.min.js") - .with_version("1.1.1") + JavaScript::located("/theme/menu/js/menu.min.js").with_version("1.1.1"), ))) .alter(InContextOp::AddJQuery); @@ -257,7 +245,6 @@ impl ComponentTrait for Menu { } impl Menu { - // Menu BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 21750a8b..06438b7b 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -132,14 +132,17 @@ impl Paragraph { pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { self.display = display; - self.classes.alter(ClassesOp::SetDefault, match &self.display() { - ParagraphDisplay::XxLarge => "fs-2", - ParagraphDisplay::Large => "fs-3", - ParagraphDisplay::Medium => "fs-4", - ParagraphDisplay::Small => "fs-5", - ParagraphDisplay::XxSmall => "fs-6", - ParagraphDisplay::Normal => "", - }); + self.classes.alter( + ClassesOp::SetDefault, + match &self.display() { + ParagraphDisplay::XxLarge => "fs-2", + ParagraphDisplay::Large => "fs-3", + ParagraphDisplay::Medium => "fs-4", + ParagraphDisplay::Small => "fs-5", + ParagraphDisplay::XxSmall => "fs-6", + ParagraphDisplay::Normal => "", + }, + ); self } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index c43f7003..a3d3e33a 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -27,9 +27,9 @@ impl ModuleTrait for DefaultHomePage { async fn demo() -> app::Result<Markup> { Page::new() .with_title(l("page_title").as_str()) - .with_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/theme/module/homepage/styles.css") - ))) + .with_context(InContextOp::StyleSheet(AssetsOp::Add(StyleSheet::located( + "/theme/module/homepage/styles.css", + )))) .add_to("content", hello_world()) .add_to("content", welcome()) .add_to("content", about_pagetop()) @@ -39,47 +39,57 @@ async fn demo() -> app::Result<Markup> { } fn hello_world() -> Container { - Container::header() - .with_id("hello-world") - .with_component(grid::Row::new() - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "hello-col-text") - .with_size(grid::ColumnSize::Is4of12) - .with_component(Heading::h1(html! { - (l("page_title")) - }) - .with_display(HeadingDisplay::Medium) - ) - .with_component(Paragraph::with(html! { - (e("hello_intro", &args![ - "app" => format!("<strong>{}</strong>", &SETTINGS.app.name) - ])) - }) - .with_display(ParagraphDisplay::Small) - ) - .with_component(Paragraph::with(html! { + Container::header().with_id("hello-world").with_component( + grid::Row::new() + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "hello-col-text") + .with_size(grid::ColumnSize::Is4of12) + .with_component( + Heading::h1(html! { + (l("page_title")) + }) + .with_display(HeadingDisplay::Medium), + ) + .with_component( + Paragraph::with(html! { + (e("hello_intro", &args![ + "app" => format!("<strong>{}</strong>", &SETTINGS.app.name) + ])) + }) + .with_display(ParagraphDisplay::Small), + ) + .with_component(Paragraph::with(html! { (e("hello_pagetop", &args![ "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" ])) - }) - ) - .with_component(Anchor::button("#", html! { - ("Offered services") - }) - .with_left_icon(Icon::with("card-checklist")) - .with_classes(ClassesOp::Add, "services-link") - ) - .with_component(Anchor::button("#", html! { - ("Get quote") - }) - .with_left_icon(Icon::with("envelope-open-heart-fill")) - ) + })) + .with_component( + Anchor::button( + "#", + html! { + ("Offered services") + }, + ) + .with_left_icon(Icon::with("card-checklist")) + .with_classes(ClassesOp::Add, "services-link"), + ) + .with_component( + Anchor::button( + "#", + html! { + ("Get quote") + }, + ) + .with_left_icon(Icon::with("envelope-open-heart-fill")), + ), ) - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "hello-col-image") - .with_component(Image::image("/theme/images/demo-header.svg")) - ) - ) + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "hello-col-image") + .with_component(Image::image("/theme/images/demo-header.svg")), + ), + ) } fn welcome() -> Container { @@ -89,100 +99,103 @@ fn welcome() -> Container { .with_component(Heading::h2(html! { (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) })) - .with_component(Heading::h3(html! { + .with_component( + Heading::h3(html! { (l("welcome_subtitle")) }) - .with_display(HeadingDisplay::Subtitle) + .with_display(HeadingDisplay::Subtitle), ) - .with_component(Paragraph::with(html! { + .with_component( + Paragraph::with(html! { (l("welcome_text1")) }) - .with_display(ParagraphDisplay::Small) + .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { (l("welcome_text2")) })) } fn about_pagetop() -> Container { - Container::new() - .with_id("pagetop") - .with_component(grid::Row::new() - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "pagetop-col-image") - .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::image("/theme/images/demo-about.svg")) + Container::new().with_id("pagetop").with_component( + grid::Row::new() + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "pagetop-col-image") + .with_size(grid::ColumnSize::Is5of12) + .with_component(Image::image("/theme/images/demo-about.svg")), ) - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "pagetop-col-text") - .with_component(Heading::h2(html! { - (l("pagetop_title")) - })) - .with_component(Paragraph::with(html! { - (l("pagetop_text1")) - }) - .with_display(ParagraphDisplay::Small) - ) - .with_component(Paragraph::with(html! { + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "pagetop-col-text") + .with_component(Heading::h2(html! { + (l("pagetop_title")) + })) + .with_component( + Paragraph::with(html! { + (l("pagetop_text1")) + }) + .with_display(ParagraphDisplay::Small), + ) + .with_component(Paragraph::with(html! { (l("pagetop_text2")) - }) - ) - .with_component(Paragraph::with(html! { + })) + .with_component(Paragraph::with(html! { (l("pagetop_text3")) - }) - ) - ) - ) + })), + ), + ) } fn promo_pagetop() -> Container { - Container::new() - .with_id("promo") - .with_component(grid::Row::new() - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "promo-col-image") - .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::image("/theme/images/demo-pagetop.svg")) + Container::new().with_id("promo").with_component( + grid::Row::new() + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "promo-col-image") + .with_size(grid::ColumnSize::Is5of12) + .with_component(Image::image("/theme/images/demo-pagetop.svg")), ) - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "promo-col-text") - .with_component(Heading::h2(html! { + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "promo-col-text") + .with_component(Heading::h2(html! { (l("pagetop_promo_title")) - }) - ) - .with_component(Paragraph::with(html! { - (e("pagetop_promo_text1", &args![ - "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" - ])) - }) - .with_display(ParagraphDisplay::Small) - ) - ) - ) + })) + .with_component( + Paragraph::with(html! { + (e("pagetop_promo_text1", &args![ + "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + ])) + }) + .with_display(ParagraphDisplay::Small), + ), + ), + ) } fn reporting_problems() -> Container { - Container::new() - .with_id("reporting") - .with_component(grid::Row::new() - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "reporting-col-text") - .with_size(grid::ColumnSize::Is7of12) - .with_component(Heading::h2(html! { + Container::new().with_id("reporting").with_component( + grid::Row::new() + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "reporting-col-text") + .with_size(grid::ColumnSize::Is7of12) + .with_component(Heading::h2(html! { (l("report_problems_title")) - }) - ) - .with_component(Paragraph::with(html! { - (l("report_problems_text1")) - }) - .with_display(ParagraphDisplay::Small) - ) - .with_component(Paragraph::with(html! { + })) + .with_component( + Paragraph::with(html! { + (l("report_problems_text1")) + }) + .with_display(ParagraphDisplay::Small), + ) + .with_component(Paragraph::with(html! { (l("report_problems_text2")) - }) - ) + })), ) - .with_column(grid::Column::new() - .with_classes(ClassesOp::Add, "reporting-col-image") - .with_component(Image::image("/theme/images/demo-pagetop.svg")) - ) - ) + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "reporting-col-image") + .with_component(Image::image("/theme/images/demo-pagetop.svg")), + ), + ) } diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs index 293e4e88..164a8177 100644 --- a/pagetop/src/base/theme.rs +++ b/pagetop/src/base/theme.rs @@ -1,4 +1,7 @@ pub mod aliner; + pub mod minimal; + pub mod bootsier; + pub mod bulmix; diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index de6bc60f..bb6e794f 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -16,15 +16,11 @@ impl ThemeTrait for Aliner { } fn before_render_page(&self, page: &mut Page) { - page - .alter_context(InContextOp::Favicon(Some(Favicon::new() - .with_icon("/theme/favicon.png") - ))) - .alter_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located( - "/aliner/css/styles.css" - ) - .with_weight(-99) - ))); + page.alter_context(InContextOp::Favicon(Some( + Favicon::new().with_icon("/theme/favicon.png"), + ))) + .alter_context(InContextOp::StyleSheet(AssetsOp::Add( + StyleSheet::located("/aliner/css/styles.css").with_weight(-99), + ))); } } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 4ba21119..0525053d 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -18,21 +18,20 @@ impl ThemeTrait for Bootsier { } fn before_render_page(&self, page: &mut Page) { - page - .alter_context(InContextOp::Favicon(Some(Favicon::new() - .with_icon("/theme/favicon.png") - ))) - .alter_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/bootsier/css/bootstrap.min.css") - .with_version("5.1.3") - .with_weight(-99) - ))) - .alter_context(InContextOp::JavaScript(AssetsOp::Add( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") - .with_version("5.1.3") - .with_weight(-99) - ))) - .alter_context(InContextOp::AddJQuery); + page.alter_context(InContextOp::Favicon(Some( + Favicon::new().with_icon("/theme/favicon.png"), + ))) + .alter_context(InContextOp::StyleSheet(AssetsOp::Add( + StyleSheet::located("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99), + ))) + .alter_context(InContextOp::JavaScript(AssetsOp::Add( + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") + .with_weight(-99), + ))) + .alter_context(InContextOp::AddJQuery); } fn render_error_page(&self, mut s: app::http::StatusCode) -> app::Result<Markup> { @@ -42,37 +41,40 @@ impl ThemeTrait for Bootsier { app::http::StatusCode::NOT_FOUND => { description = "e404-description"; message = "e404-message"; - }, + } _ => { s = app::http::StatusCode::INTERNAL_SERVER_ERROR; } } Page::new() .with_title(format!("Error {}", s.as_str()).as_str()) - .add_to("content", Chunck::with(html! { - div class="jumbotron" { - div class="media" { - img - src="/static/bootsier/images/caution.png" - class="mr-4" - style="width: 20%; max-width: 188px" - alt="Caution!"; - div class="media-body" { - h1 class="display-4" { (s.as_str()) } - p class="lead" { (l(description)) } - hr class="my-4"; - p { (l(message)) } - a - class="btn btn-primary btn-lg" - href="/" - role="button" - { - (l("back-homepage")) + .add_to( + "content", + Chunck::with(html! { + div class="jumbotron" { + div class="media" { + img + src="/static/bootsier/images/caution.png" + class="mr-4" + style="width: 20%; max-width: 188px" + alt="Caution!"; + div class="media-body" { + h1 class="display-4" { (s.as_str()) } + p class="lead" { (l(description)) } + hr class="my-4"; + p { (l(message)) } + a + class="btn btn-primary btn-lg" + href="/" + role="button" + { + (l("back-homepage")) + } } } } - } - })) + }), + ) .render() } } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index fda612a9..200c2b63 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -16,84 +16,100 @@ impl ThemeTrait for Bulmix { } fn before_render_page(&self, page: &mut Page) { - page - .alter_context(InContextOp::Favicon(Some(Favicon::new() - .with_icon("/theme/favicon.png") - ))) - .alter_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/bulmix/css/bulma.min.css") - .with_version("0.9.4") - .with_weight(-99) - ))) - .alter_context(InContextOp::AddJQuery); + page.alter_context(InContextOp::Favicon(Some( + Favicon::new().with_icon("/theme/favicon.png"), + ))) + .alter_context(InContextOp::StyleSheet(AssetsOp::Add( + StyleSheet::located("/bulmix/css/bulma.min.css") + .with_version("0.9.4") + .with_weight(-99), + ))) + .alter_context(InContextOp::AddJQuery); } fn before_render_component( &self, component: &mut dyn ComponentTrait, - _context: &mut InContext + _context: &mut InContext, ) { match component.handler() { COMPONENT_ANCHOR => { let a = component_mut::<Anchor>(component); - a.alter_classes(ClassesOp::SetDefault, match a.anchor_type() { - AnchorType::Button => "button is-primary", - _ => "", - }); - }, + a.alter_classes( + ClassesOp::SetDefault, + match a.anchor_type() { + AnchorType::Button => "button is-primary", + _ => "", + }, + ); + } COMPONENT_HEADING => { let h = component_mut::<Heading>(component); - h.alter_classes(ClassesOp::SetDefault, match h.display() { - HeadingDisplay::XxLarge => "title is-1", - HeadingDisplay::Large => "title is-2", - HeadingDisplay::Medium => "title is-3", - HeadingDisplay::Small => "title is-4", - HeadingDisplay::XxSmall => "title is-5", - HeadingDisplay::Normal => "title", - HeadingDisplay::Subtitle => "subtitle", - }); - }, + h.alter_classes( + ClassesOp::SetDefault, + match h.display() { + HeadingDisplay::XxLarge => "title is-1", + HeadingDisplay::Large => "title is-2", + HeadingDisplay::Medium => "title is-3", + HeadingDisplay::Small => "title is-4", + HeadingDisplay::XxSmall => "title is-5", + HeadingDisplay::Normal => "title", + HeadingDisplay::Subtitle => "subtitle", + }, + ); + } COMPONENT_PARAGRAPH => { let p = component_mut::<Paragraph>(component); - p.alter_classes(ClassesOp::SetDefault, match p.display() { - ParagraphDisplay::XxLarge => "is-size-2", - ParagraphDisplay::Large => "is-size-3", - ParagraphDisplay::Medium => "is-size-4", - ParagraphDisplay::Small => "is-size-5", - ParagraphDisplay::XxSmall => "is-size-6", - ParagraphDisplay::Normal => "", - }); - }, + p.alter_classes( + ClassesOp::SetDefault, + match p.display() { + ParagraphDisplay::XxLarge => "is-size-2", + ParagraphDisplay::Large => "is-size-3", + ParagraphDisplay::Medium => "is-size-4", + ParagraphDisplay::Small => "is-size-5", + ParagraphDisplay::XxSmall => "is-size-6", + ParagraphDisplay::Normal => "", + }, + ); + } grid::COMPONENT_COLUMN => { let col = component_mut::<grid::Column>(component); - col.alter_classes(ClassesOp::SetDefault, concat_string!("column", match col.size() { - grid::ColumnSize::Default => "", - grid::ColumnSize::Is1of12 => " is-1", - grid::ColumnSize::Is2of12 => " is-2", - grid::ColumnSize::Is3of12 => " is-3", - grid::ColumnSize::Is4of12 => " is-4", - grid::ColumnSize::Is5of12 => " is-5", - grid::ColumnSize::Is6of12 => " is-6", - grid::ColumnSize::Is7of12 => " is-7", - grid::ColumnSize::Is8of12 => " is-8", - grid::ColumnSize::Is9of12 => " is-9", - grid::ColumnSize::Is10of12 => " is-10", - grid::ColumnSize::Is11of12 => " is-11", - grid::ColumnSize::IsFull => " is-12", - }, " content").as_str()); - }, + col.alter_classes( + ClassesOp::SetDefault, + concat_string!( + "column", + match col.size() { + grid::ColumnSize::Default => "", + grid::ColumnSize::Is1of12 => " is-1", + grid::ColumnSize::Is2of12 => " is-2", + grid::ColumnSize::Is3of12 => " is-3", + grid::ColumnSize::Is4of12 => " is-4", + grid::ColumnSize::Is5of12 => " is-5", + grid::ColumnSize::Is6of12 => " is-6", + grid::ColumnSize::Is7of12 => " is-7", + grid::ColumnSize::Is8of12 => " is-8", + grid::ColumnSize::Is9of12 => " is-9", + grid::ColumnSize::Is10of12 => " is-10", + grid::ColumnSize::Is11of12 => " is-11", + grid::ColumnSize::IsFull => " is-12", + }, + " content" + ) + .as_str(), + ); + } grid::COMPONENT_ROW => { let row = component_mut::<grid::Row>(component); row.alter_classes(ClassesOp::SetDefault, "columns"); - }, - _ => {}, + } + _ => {} } } fn render_component( &self, component: &dyn ComponentTrait, - _context: &mut InContext + _context: &mut InContext, ) -> Option<Markup> { match component.handler() { COMPONENT_ICON => { @@ -103,7 +119,7 @@ impl ThemeTrait for Bulmix { i class=[icon.classes().get()] {}; } }) - }, + } _ => None, } } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 775cc4a6..b06b62d5 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -22,19 +22,14 @@ pub static CONFIG: Lazy<Config> = Lazy::new(|| { // Combina los archivos de configuración y asigna el modo de ejecución. settings - .merge( - File::with_name( - &format!("{}/{}.toml", CONFIG_DIR, "common") - ).required(false)).unwrap() - .merge( - File::with_name( - &format!("{}/{}.toml", CONFIG_DIR, run_mode) - ).required(false)).unwrap() - .merge( - File::with_name( - &format!("{}/{}.toml", CONFIG_DIR, "local") - ).required(false)).unwrap() - .set("app.run_mode", run_mode).unwrap(); + .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) + .unwrap() + .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, run_mode)).required(false)) + .unwrap() + .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "local")).required(false)) + .unwrap() + .set("app.run_mode", run_mode) + .unwrap(); settings }); diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index 7b25095b..3d09c260 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -1,4 +1,11 @@ -pub mod component; // API to build new components. -pub mod hook; // API to define functions that alter the behavior of PageTop core. -pub mod module; // API to add new features with modules. -pub mod theme; // API to create themes. +// API to build new components. +pub mod component; + +// API to define functions that alter the behavior of PageTop core. +pub mod hook; + +// API to add new features with modules. +pub mod module; + +// API to create themes. +pub mod theme; diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 20ec2b42..88c5f0ec 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -2,13 +2,8 @@ mod context; pub use context::{InContext, InContextOp}; mod definition; -pub use definition::{ - AnyComponent, - ComponentTrait, - component_ref, - component_mut, -}; use definition::render_component; +pub use definition::{component_mut, component_ref, AnyComponent, ComponentTrait}; mod bundle; pub use bundle::ComponentsBundle; @@ -19,6 +14,10 @@ pub(crate) use all::common_components; pub type Renderable = fn(_: &InContext) -> bool; -pub fn render_always(_: &InContext) -> bool { true } +pub fn render_always(_: &InContext) -> bool { + true +} -pub fn render_never(_: &InContext) -> bool { false } \ No newline at end of file +pub fn render_never(_: &InContext) -> bool { + false +} diff --git a/pagetop/src/core/component/all.rs b/pagetop/src/core/component/all.rs index a8567794..4309c3a7 100644 --- a/pagetop/src/core/component/all.rs +++ b/pagetop/src/core/component/all.rs @@ -1,12 +1,11 @@ +use super::{ComponentTrait, ComponentsBundle}; use crate::Lazy; -use super::{ComponentsBundle, ComponentTrait}; -use std::sync::RwLock; use std::collections::HashMap; +use std::sync::RwLock; -static COMPONENTS: Lazy<RwLock<HashMap<&str, ComponentsBundle>>> = Lazy::new(|| { - RwLock::new(HashMap::new()) -}); +static COMPONENTS: Lazy<RwLock<HashMap<&str, ComponentsBundle>>> = + Lazy::new(|| RwLock::new(HashMap::new())); pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { let mut hmap = COMPONENTS.write().unwrap(); diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index a3c88a97..7cb4a651 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,5 +1,5 @@ -use crate::html::{Markup, html}; -use super::{InContext, ComponentTrait}; +use super::{ComponentTrait, InContext}; +use crate::html::{html, Markup}; use std::sync::{Arc, RwLock}; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 6d3f8dc5..054a87f9 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,15 +1,14 @@ -use crate::{Lazy, base, concat_string, util}; use crate::config::SETTINGS; -use crate::html::*; -use crate::core::theme::ThemeTrait; use crate::core::theme::all::theme_by_single_name; +use crate::core::theme::ThemeTrait; +use crate::html::*; +use crate::{base, concat_string, util, Lazy}; -static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = Lazy::new(|| { - match theme_by_single_name(&SETTINGS.app.theme) { +static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = + Lazy::new(|| match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, - } -}); + }); pub enum InContextOp { SetTheme(&'static str), @@ -47,28 +46,30 @@ impl InContext { match op { InContextOp::SetTheme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); - }, + } InContextOp::AddMetadata(name, content) => { self.metadata.push((name.to_owned(), content.to_owned())); - }, + } InContextOp::Favicon(favicon) => { self.favicon = favicon; - }, + } InContextOp::StyleSheet(css) => { self.stylesheets.alter(css); - }, + } InContextOp::JavaScript(js) => { self.javascripts.alter(js); - }, - InContextOp::AddJQuery => if !self.with_jquery { - self.javascripts.alter(AssetsOp::Add( - JavaScript::located("/theme/js/jquery.min.js") - .with_version("3.6.0") - .with_weight(isize::MIN) - .with_mode(JSMode::Normal) - )); - self.with_jquery = true; - }, + } + InContextOp::AddJQuery => { + if !self.with_jquery { + self.javascripts.alter(AssetsOp::Add( + JavaScript::located("/theme/js/jquery.min.js") + .with_version("3.6.0") + .with_weight(isize::MIN) + .with_mode(JSMode::Normal), + )); + self.with_jquery = true; + } + } } self } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index b437fa0b..d3a62c6e 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,11 +1,13 @@ -use crate::util; -use crate::html::{Markup, html}; use super::InContext; +use crate::html::{html, Markup}; +use crate::util; pub use std::any::Any as AnyComponent; pub trait ComponentTrait: AnyComponent + Send + Sync { - fn new() -> Self where Self: Sized; + fn new() -> Self + where + Self: Sized; fn handler(&self) -> &'static str; @@ -27,8 +29,7 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { } #[allow(unused_variables)] - fn before_render(&mut self, context: &mut InContext) { - } + fn before_render(&mut self, context: &mut InContext) {} #[allow(unused_variables)] fn default_render(&self, context: &mut InContext) -> Markup { @@ -58,9 +59,9 @@ pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InCont match component.is_renderable(context) { true => match context.theme().render_component(component, context) { Some(html) => html, - None => component.default_render(context) + None => component.default_render(context), }, - false => html! {} + false => html! {}, } } diff --git a/pagetop/src/core/hook.rs b/pagetop/src/core/hook.rs index c90dd436..8cc94cb0 100644 --- a/pagetop/src/core/hook.rs +++ b/pagetop/src/core/hook.rs @@ -1,14 +1,10 @@ mod definition; -pub use definition::{ - AnyHook, - HookTrait, - action_ref, -}; +pub use definition::{action_ref, AnyHook, HookTrait}; mod holder; pub use holder::HookAction; use holder::HooksHolder; mod all; -pub use all::run_actions; pub(crate) use all::add_hook; +pub use all::run_actions; diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index 0d0d3e08..d3d00342 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,13 +1,12 @@ -use crate::Lazy; use super::{HookAction, HooksHolder}; +use crate::Lazy; -use std::sync::RwLock; use std::collections::HashMap; +use std::sync::RwLock; // Registered actions. -static ACTIONS: Lazy<RwLock<HashMap<&str, HooksHolder>>> = Lazy::new(|| { - RwLock::new(HashMap::new()) -}); +static ACTIONS: Lazy<RwLock<HashMap<&str, HooksHolder>>> = + Lazy::new(|| RwLock::new(HashMap::new())); pub fn add_hook(hook: HookAction) { let mut hmap = ACTIONS.write().unwrap(); @@ -19,7 +18,10 @@ pub fn add_hook(hook: HookAction) { } } -pub fn run_actions<B, F>(action_handler: &str, f: F) where F: FnMut(&HookAction) -> B { +pub fn run_actions<B, F>(action_handler: &str, f: F) +where + F: FnMut(&HookAction) -> B, +{ if let Some(actions) = ACTIONS.read().unwrap().get(action_handler) { actions.iter_map(f) } diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index b3611f08..2b89b969 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -1,7 +1,9 @@ pub use std::any::Any as AnyHook; pub trait HookTrait: AnyHook + Send + Sync { - fn new() -> Self where Self: Sized; + fn new() -> Self + where + Self: Sized; fn handler(&self) -> &'static str; diff --git a/pagetop/src/core/hook/holder.rs b/pagetop/src/core/hook/holder.rs index 59ce3b81..4a607c1d 100644 --- a/pagetop/src/core/hook/holder.rs +++ b/pagetop/src/core/hook/holder.rs @@ -30,7 +30,11 @@ impl HooksHolder { actions.sort_by_key(|a| a.weight()); } - pub fn iter_map<B, F>(&self, f: F) where Self: Sized, F: FnMut(&HookAction) -> B { + pub fn iter_map<B, F>(&self, f: F) + where + Self: Sized, + F: FnMut(&HookAction) -> B, + { let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); } } diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index e50144b5..a47fe3c4 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,7 +1,4 @@ mod definition; -pub use definition::{ - BaseModule, - ModuleTrait, -}; +pub use definition::{BaseModule, ModuleTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index aae071a5..222a968e 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,19 +1,14 @@ -use crate::{Lazy, app, trace}; -use crate::core::hook::add_hook; use super::ModuleTrait; +use crate::core::hook::add_hook; +use crate::{app, trace, Lazy}; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -use crate::{ - db::*, - run_now, -}; +use crate::{db::*, run_now}; use std::sync::RwLock; // Enabled modules. -static ENABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { - RwLock::new(Vec::new()) -}); +static ENABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| RwLock::new(Vec::new())); /* Disabled modules. static DISABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { @@ -34,7 +29,12 @@ fn enable(module: &'static dyn ModuleTrait) { } fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { - if !ENABLED_MODULES.read().unwrap().iter().any(|m| m.handler() == module.handler()) { + if !ENABLED_MODULES + .read() + .unwrap() + .iter() + .any(|m| m.handler() == module.handler()) + { if !list.iter().any(|m| m.handler() == module.handler()) { trace::debug!("Enabling module \"{}\"", module.single_name()); list.push(module); @@ -80,5 +80,6 @@ pub fn run_migrations() { } } Migrator::up(&app::db::DBCONN, None) - }).unwrap(); + }) + .unwrap(); } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 5fe9e84e..dbf6904e 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,5 @@ -use crate::{app, util}; use crate::core::hook::HookAction; +use crate::{app, util}; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::db::MigrationItem; @@ -25,8 +25,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { } #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - } + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} fn actions(&self) -> Vec<HookAction> { vec![] diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 391a0064..b481f69b 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -1,7 +1,4 @@ mod definition; -pub use definition::{ - BaseTheme, - ThemeTrait, -}; +pub use definition::{BaseTheme, ThemeTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 2a02b2ec..46c6f699 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,14 +1,12 @@ -use crate::{Lazy, app, theme_static_files, trace}; use super::ThemeTrait; +use crate::{app, theme_static_files, trace, Lazy}; use std::sync::RwLock; include!(concat!(env!("OUT_DIR"), "/theme.rs")); // Temas registrados. -static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| { - RwLock::new(Vec::new()) -}); +static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| RwLock::new(Vec::new())); pub fn register_themes(themes: Vec<&'static dyn ThemeTrait>) { for t in themes { @@ -25,9 +23,12 @@ fn register(theme: &'static dyn ThemeTrait) { } pub fn theme_by_single_name(single_name: &str) -> Option<&'static dyn ThemeTrait> { - match THEMES.write().unwrap().iter().find( - |t| t.single_name().to_lowercase() == single_name.to_lowercase() - ) { + match THEMES + .write() + .unwrap() + .iter() + .find(|t| t.single_name().to_lowercase() == single_name.to_lowercase()) + { Some(theme) => Some(*theme), _ => None, } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 8b63d833..fe1b7821 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,9 +1,9 @@ -use crate::{app, concat_string, util}; -use crate::config::SETTINGS; -use crate::html::{Favicon, Markup, html}; -use crate::core::component::{ComponentTrait, InContext, InContextOp}; -use crate::response::page::Page; use crate::base::component::Chunck; +use crate::config::SETTINGS; +use crate::core::component::{ComponentTrait, InContext, InContextOp}; +use crate::html::{html, Favicon, Markup}; +use crate::response::page::Page; +use crate::{app, concat_string, util}; pub trait BaseTheme { fn single_name(&self) -> &'static str; @@ -22,15 +22,13 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { } #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - } + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { - page - .alter_context(InContextOp::Favicon(Some(Favicon::new() - .with_icon("/theme/favicon.png") - ))); + page.alter_context(InContextOp::Favicon(Some( + Favicon::new().with_icon("/theme/favicon.png"), + ))); } fn render_page_head(&self, page: &mut Page) -> Markup { @@ -81,55 +79,54 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { } #[allow(unused_variables)] - fn before_render_component( - &self, - component: &mut dyn ComponentTrait, - context: &mut InContext - ) { - /* - Cómo usarlo: + fn before_render_component(&self, component: &mut dyn ComponentTrait, context: &mut InContext) { + /* + Cómo usarlo: - match component.handler() { - BLOCK_COMPONENT => { - let block = component_mut::<Block>(component); - block.alter_title("New title"); - }, - _ => {}, - } - */ + match component.handler() { + BLOCK_COMPONENT => { + let block = component_mut::<Block>(component); + block.alter_title("New title"); + }, + _ => {}, + } + */ } #[allow(unused_variables)] fn render_component( &self, component: &dyn ComponentTrait, - context: &mut InContext + context: &mut InContext, ) -> Option<Markup> { None - /* - Cómo usarlo: + /* + Cómo usarlo: - match component.handler() { - BLOCK_COMPONENT => { - let block = component_ref::<Block>(component); - match block.template() { - "default" => Some(block_default(block)), - _ => None, - } - }, - _ => None, - } - */ + match component.handler() { + BLOCK_COMPONENT => { + let block = component_ref::<Block>(component); + match block.template() { + "default" => Some(block_default(block)), + _ => None, + } + }, + _ => None, + } + */ } fn render_error_page(&self, s: app::http::StatusCode) -> app::Result<Markup> { Page::new() .with_title(format!("Error {}", s.as_str()).as_str()) - .add_to("content", Chunck::with(html! { - div { - h1 { (s.as_str()) } - } - })) + .add_to( + "content", + Chunck::with(html! { + div { + h1 { (s.as_str()) } + } + }), + ) .render() } } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 4fa94ebb..35943793 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -1,9 +1,9 @@ -pub use maud::{DOCTYPE, Markup, PreEscaped, html}; +pub use maud::{html, Markup, PreEscaped, DOCTYPE}; mod assets; -pub use assets::{Assets, AssetsOp, SourceValue}; -pub use assets::javascript::{JavaScript, JSMode}; +pub use assets::javascript::{JSMode, JavaScript}; pub use assets::stylesheet::StyleSheet; +pub use assets::{Assets, AssetsOp, SourceValue}; mod favicon; pub use favicon::Favicon; @@ -15,4 +15,4 @@ mod identifier; pub use identifier::IdentifierValue; mod classes; -pub use classes::{Classes, ClassesOp, ClassValue}; +pub use classes::{ClassValue, Classes, ClassesOp}; diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 96e52d2c..338446f4 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -1,7 +1,7 @@ pub mod javascript; pub mod stylesheet; -use crate::html::{Markup, html}; +use crate::html::{html, Markup}; pub type SourceValue = &'static str; @@ -26,19 +26,21 @@ impl<T: AssetsTrait> Assets<T> { pub fn alter(&mut self, op: AssetsOp<T>) -> &mut Self { match op { - AssetsOp::Add(asset) => match self.0.iter().position( - |x| x.source() == asset.source() - ) { - Some(index) => if self.0[index].weight() > asset.weight() { - self.0.remove(index); - self.0.push(asset); - }, - _ => self.0.push(asset) + AssetsOp::Add(asset) => { + match self.0.iter().position(|x| x.source() == asset.source()) { + Some(index) => { + if self.0[index].weight() > asset.weight() { + self.0.remove(index); + self.0.push(asset); + } + } + _ => self.0.push(asset), + } } - AssetsOp::Remove(source) => if let Some(index) = self.0.iter().position( - |x| x.source() == source - ) { - self.0.remove(index); + AssetsOp::Remove(source) => { + if let Some(index) = self.0.iter().position(|x| x.source() == source) { + self.0.remove(index); + } } } self @@ -53,4 +55,4 @@ impl<T: AssetsTrait> Assets<T> { } } } -} \ No newline at end of file +} diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 08d7705a..03f0a3dc 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,8 +1,12 @@ -use crate::html::{Markup, html}; use super::{AssetsTrait, SourceValue}; +use crate::html::{html, Markup}; #[derive(PartialEq)] -pub enum JSMode { Async, Defer, Normal } +pub enum JSMode { + Async, + Defer, + Normal, +} pub struct JavaScript { source : SourceValue, diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 65f477fd..893e8c66 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,5 +1,5 @@ -use crate::html::{Markup, html}; use super::{AssetsTrait, SourceValue}; +use crate::html::{html, Markup}; pub struct StyleSheet { source : SourceValue, diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 197f1502..43b1ad79 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -38,7 +38,7 @@ impl Classes { match op { ClassesOp::Add => { self.added = concat_string!(self.added, " ", classes).trim().to_owned() - }, + } ClassesOp::AddAfter(class) => { let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); @@ -47,7 +47,7 @@ impl Classes { _ => v_added.push(classes), } self.added = v_added.join(" "); - }, + } ClassesOp::AddBefore(class) => { let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); @@ -56,11 +56,11 @@ impl Classes { _ => v_added.insert(0, classes), } self.added = v_added.join(" "); - }, + } ClassesOp::AddFirst => { self.added = concat_string!(classes, " ", self.added).trim().to_owned() - }, + } ClassesOp::Remove => { let v_list: Vec<&str> = classes.split_ascii_whitespace().collect(); @@ -71,7 +71,7 @@ impl Classes { } } self.added = v_added.join(" "); - }, + } ClassesOp::Replace(class) => { let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); @@ -79,19 +79,21 @@ impl Classes { Some(pos) => { v_added.remove(pos); v_added.insert(pos, classes); - }, + } _ => v_added.push(classes), } self.added = v_added.join(" "); - }, + } ClassesOp::Reset => self.added = classes.to_owned(), ClassesOp::SetDefault => self.default = classes.to_owned(), - ClassesOp::SetDefaultIfEmpty => if self.default.is_empty() { - self.default = classes.to_owned() - }, + ClassesOp::SetDefaultIfEmpty => { + if self.default.is_empty() { + self.default = classes.to_owned() + } + } } self } @@ -100,7 +102,11 @@ impl Classes { if self.default.is_empty() && self.added.is_empty() { None } else { - Some(concat_string!(self.default, " ", self.added).trim().to_owned()) + Some( + concat_string!(self.default, " ", self.added) + .trim() + .to_owned(), + ) } } } diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index d8d6fc18..316d97e8 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -1,4 +1,4 @@ -use crate::html::{Markup, PreEscaped, html}; +use crate::html::{html, Markup, PreEscaped}; pub struct Favicon(Vec<String>); @@ -29,32 +29,29 @@ impl Favicon { pub fn with_theme_color(mut self, color: &str) -> Self { self.0.push(format!( - "<meta name=\"theme-color\" content=\"{}\">", color + "<meta name=\"theme-color\" content=\"{}\">", + color )); self } pub fn with_ms_tile_color(mut self, color: &str) -> Self { self.0.push(format!( - "<meta name=\"msapplication-TileColor\" content=\"{}\">", color + "<meta name=\"msapplication-TileColor\" content=\"{}\">", + color )); self } pub fn with_ms_tile_image(mut self, image: &str) -> Self { self.0.push(format!( - "<meta name=\"msapplication-TileImage\" content=\"{}\">", image + "<meta name=\"msapplication-TileImage\" content=\"{}\">", + image )); self } - fn add_item( - mut self, - rel : &str, - source: &str, - sizes : &str, - color : &str - ) -> Self { + fn add_item(mut self, rel: &str, source: &str, sizes: &str, color: &str) -> Self { let mut link: String = format!("<link rel=\"{}\"", rel); if let Some(i) = source.rfind('.') { link = match source[i..].to_owned().to_lowercase().as_str() { @@ -63,7 +60,7 @@ impl Favicon { ".jpg" => format!("{} type=\"image/jpg\"", link), ".png" => format!("{} type=\"image/png\"", link), ".svg" => format!("{} type=\"image/svg+xml\"", link), - _ => link + _ => link, }; } if !sizes.is_empty() { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 06dc32bc..5a33697c 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,32 +1,42 @@ -// External re-exports. +// EXTERNAL RE-EXPORTS. -pub use once_cell::sync::Lazy; pub use concat_string::concat_string; pub use doc_comment::doc_comment; +pub use once_cell::sync::Lazy; -// Local. +// LOCAL. #[allow(unused_imports)] pub(crate) use futures::executor::block_on as run_now; -// Public APIs. +// PUBLIC APIs. -pub mod config; // Gestión de la configuración. -pub mod trace; // Registro de trazas y eventos de la aplicación. -pub mod locale; // Localización. -pub mod html; // HTML en código. +// Gestión de la configuración. +pub mod config; +// Registro de trazas y eventos de la aplicación. +pub mod trace; +// Localización. +pub mod locale; +// HTML en código. +pub mod html; +// Acceso a base de datos. #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub mod db; // Acceso a base de datos. +pub mod db; -pub mod app; // Prepare and run the application. +// Prepare and run the application. +pub mod app; -pub mod core; // Main APIs for components, hooks, modules and themes. +// Main APIs for components, hooks, modules and themes. +pub mod core; -pub mod response; // Tipos de respuestas web. -pub mod base; // Base de componentes, módulos y temas. -pub mod util; // Macros y funciones útiles. +// Tipos de respuestas web. +pub mod response; +// Base de componentes, módulos y temas. +pub mod base; +// Macros y funciones útiles. +pub mod util; -// Internal re-exports. +// INTERNAL RE-EXPORTS. pub mod prelude; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 86f5c966..355732be 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -1,6 +1,6 @@ pub use fluent_templates; -pub use fluent_templates::{Loader as Locale, static_loader as static_locale}; pub use fluent_templates::fluent_bundle::FluentValue; +pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index c91a9678..f6e6fc97 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,41 +1,26 @@ //! Re-exporta recursos comunes. // Global macros and helpers. -pub use crate::{ - args, - concat_string, - theme_static_files, - util, -}; +pub use crate::{args, concat_string, theme_static_files, util}; pub use crate::config::SETTINGS; + pub use crate::trace; + pub use crate::localize; + pub use crate::html::*; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub use crate::{ - db, - db::*, - pub_migration, - migration_item, -}; +pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::app; -pub use crate::app::AppTrait; pub use crate::app::application::Application; +pub use crate::app::AppTrait; -pub use crate::core::{ - component::*, - hook::*, - module::*, - theme::*, -}; -pub use crate::{ - hook_action, - hook_before_render_component, -}; +pub use crate::core::{component::*, hook::*, module::*, theme::*}; +pub use crate::{hook_action, hook_before_render_component}; pub use crate::response::page::*; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index d3def8df..96530369 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,8 +1,5 @@ mod hook; -pub use hook::{ - HOOK_BEFORE_RENDER_PAGE, - BeforeRenderPageHook, -}; +pub use hook::{BeforeRenderPageHook, HOOK_BEFORE_RENDER_PAGE}; mod definition; pub use definition::Page; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index cf05e8f8..0ad8bbb0 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,9 +1,9 @@ -use crate::{Lazy, app, trace}; +use super::{BeforeRenderPageHook, HOOK_BEFORE_RENDER_PAGE}; use crate::config::SETTINGS; -use crate::html::*; -use crate::core::hook::{action_ref, run_actions}; use crate::core::component::*; -use super::{HOOK_BEFORE_RENDER_PAGE, BeforeRenderPageHook}; +use crate::core::hook::{action_ref, run_actions}; +use crate::html::*; +use crate::{app, trace, Lazy}; use std::collections::HashMap; @@ -34,7 +34,11 @@ static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { } }); -pub enum TextDirection { Auto, LeftToRight, RightToLeft } +pub enum TextDirection { + Auto, + LeftToRight, + RightToLeft, +} pub struct Page { context : InContext, @@ -48,7 +52,6 @@ pub struct Page { } impl Page { - pub fn new() -> Self { Page { context : InContext::new(), @@ -100,15 +103,12 @@ impl Page { self } - pub fn add_to( - mut self, - region: &'static str, - component: impl ComponentTrait - ) -> Self { + pub fn add_to(mut self, region: &'static str, component: impl ComponentTrait) -> Self { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); } else { - self.regions.insert(region, ComponentsBundle::new_with(component)); + self.regions + .insert(region, ComponentsBundle::new_with(component)); } self } @@ -193,10 +193,9 @@ impl Page { pub fn render(&mut self) -> app::Result<Markup> { // Acciones de los módulos antes de renderizar la página. - run_actions( - HOOK_BEFORE_RENDER_PAGE, - |hook| action_ref::<BeforeRenderPageHook>(&**hook).run(self) - ); + run_actions(HOOK_BEFORE_RENDER_PAGE, |hook| { + action_ref::<BeforeRenderPageHook>(&**hook).run(self) + }); // Acciones del tema antes de renderizar la página. self.context.theme().before_render_page(self); @@ -208,7 +207,7 @@ impl Page { let head = self.context.theme().render_page_head(self); // Finalmente, renderizar la página. - return Ok(html! { + Ok(html! { (DOCTYPE) html lang=[self.language().get()] dir=[self.direction().get()] { (head) @@ -220,10 +219,9 @@ impl Page { pub fn render_region(&mut self, region: &str) -> Markup { match self.regions.get_mut(region) { Some(components) => components.render(&mut self.context), - None => html! {} + None => html! {}, } } // Page EXTRAS. - } diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index 75b330d8..ac78719b 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,5 +1,5 @@ -use crate::core::hook::{HookTrait, AnyHook}; use super::Page; +use crate::core::hook::{AnyHook, HookTrait}; pub const HOOK_BEFORE_RENDER_PAGE: &str = "pagetop::hook::before_render_page"; diff --git a/pagetop/src/trace.rs b/pagetop/src/trace.rs index d8943c68..f2e355ce 100644 --- a/pagetop/src/trace.rs +++ b/pagetop/src/trace.rs @@ -1,2 +1,2 @@ -pub use tracing::{Level, event, span}; pub use tracing::{debug, error, info, trace, warn}; +pub use tracing::{event, span, Level}; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index f4f683bf..a9a6b052 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -23,15 +23,11 @@ macro_rules! theme_static_files { ( $cfg:ident, $dir:expr ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service(actix_web_static_files::ResourceFiles::new( - $dir, - generate() - )); + $cfg.service(actix_web_static_files::ResourceFiles::new($dir, generate())); } else { - $cfg.service(actix_files::Files::new( - $dir, - &[static_files, $dir].join("") - ).show_files_listing()); + $cfg.service( + actix_files::Files::new($dir, &[static_files, $dir].join("")).show_files_listing(), + ); } }}; } diff --git a/website/src/main.rs b/website/src/main.rs index fad7b05d..4b892d2f 100644 --- a/website/src/main.rs +++ b/website/src/main.rs @@ -2,8 +2,7 @@ use pagetop::prelude::*; struct PageTopWebSite; -impl AppTrait for PageTopWebSite { -} +impl AppTrait for PageTopWebSite {} #[actix_web::main] async fn main() -> std::io::Result<()> { From f3d57eb0aaabd06a99d031c1a408007c08a2466b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 20 Jul 2022 00:53:00 +0200 Subject: [PATCH 135/853] =?UTF-8?q?Actualiza=20y=20revisa=20c=C3=B3digo=20?= =?UTF-8?q?aplicando=20cargo=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/lib.rs | 6 +++--- pagetop/src/app/banner/figfont.rs | 4 ++-- pagetop/src/app/db.rs | 6 +++--- pagetop/src/app/tracing.rs | 10 +++++----- pagetop/src/base/component.rs | 4 ++-- .../base/component/{form.rs => form_element.rs} | 0 .../component/{form => form_element}/button.rs | 7 ++----- .../component/{form => form_element}/date.rs | 5 +---- .../component/{form => form_element}/form.rs | 0 .../component/{form => form_element}/hidden.rs | 5 +---- .../component/{form => form_element}/input.rs | 5 +---- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/module/homepage.rs | 8 ++++---- pagetop/src/config.rs | 4 ++-- pagetop/src/core/component/bundle.rs | 2 +- pagetop/src/core/component/context.rs | 4 ++-- pagetop/src/core/module/all.rs | 16 +++++++--------- pagetop/src/db.rs | 2 +- pagetop/src/html/assets.rs | 2 ++ pagetop/src/html/attribute.rs | 1 + pagetop/src/html/classes.rs | 1 + pagetop/src/html/favicon.rs | 1 + pagetop/src/html/identifier.rs | 3 ++- 23 files changed, 45 insertions(+), 53 deletions(-) rename pagetop/src/base/component/{form.rs => form_element.rs} (100%) rename pagetop/src/base/component/{form => form_element}/button.rs (96%) rename pagetop/src/base/component/{form => form_element}/date.rs (98%) rename pagetop/src/base/component/{form => form_element}/form.rs (100%) rename pagetop/src/base/component/{form => form_element}/hidden.rs (93%) rename pagetop/src/base/component/{form => form_element}/input.rs (98%) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 9127e1fd..78640dfc 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -51,7 +51,7 @@ fn form_login() -> Form { Form::new() .with_id("user-login") .with_element( - form::Input::textfield() + form_element::Input::textfield() .with_name("name") .with_label(l("username").as_str()) .with_help_text( @@ -66,10 +66,10 @@ fn form_login() -> Form { .with_autofocus(true), ) .with_element( - form::Input::password() + form_element::Input::password() .with_name("pass") .with_label(l("password").as_str()) .with_help_text(l("password_help").as_str()), ) - .with_element(form::Button::submit(l("login").as_str())) + .with_element(form_element::Button::submit(l("login").as_str())) } diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index a2702655..51be8ae9 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -17,8 +17,8 @@ pub static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { "starwars" => starwars, _ => { println!( - "\n FIGfont \"{}\" not found for banner. {}. {}.", - SETTINGS.app.startup_banner, "Using \"Slant\"", "Check the settings file", + "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check the settings file.", + SETTINGS.app.startup_banner, ); slant } diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 3b4cb282..23818424 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -25,11 +25,11 @@ pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { ) .unwrap(); tmp_uri - .set_username(&SETTINGS.database.db_user.as_str()) + .set_username(SETTINGS.database.db_user.as_str()) .unwrap(); // https://github.com/launchbadge/sqlx/issues/1624 tmp_uri - .set_password(Some(&SETTINGS.database.db_pass.as_str())) + .set_password(Some(SETTINGS.database.db_pass.as_str())) .unwrap(); if SETTINGS.database.db_port != 0 { tmp_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); @@ -56,7 +56,7 @@ pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { run_now(Database::connect::<ConnectOptions>({ let mut db_opt = ConnectOptions::new(db_uri.to_string()); db_opt.max_connections(SETTINGS.database.max_pool_size); - db_opt.into() + db_opt })) .expect_or_log("Failed to connect to database") }); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index 35625407..d7c8e071 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -18,7 +18,7 @@ use tracing_subscriber::EnvFilter; /// enviarán antes de terminar la ejecución. pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { - let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or(EnvFilter::new("Info")); + let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); let rolling = SETTINGS.log.rolling.to_lowercase(); let (non_blocking, guard) = match rolling.as_str() { @@ -33,8 +33,8 @@ pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { "endless" => tracing_appender::rolling::never(path, prefix), _ => { println!( - "Rolling value \"{}\" not valid. {}. {}.", - SETTINGS.log.rolling, "Using \"daily\"", "Check the settings file", + "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", + SETTINGS.log.rolling, ); tracing_appender::rolling::daily(path, prefix) } @@ -52,8 +52,8 @@ pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { "pretty" => subscriber.pretty().init(), _ => { println!( - "Tracing format \"{}\" not valid. {}. {}.", - SETTINGS.log.format, "Using \"Full\"", "Check the settings file", + "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", + SETTINGS.log.format, ); subscriber.init(); } diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 77eeb44d..4077888b 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -20,5 +20,5 @@ pub use image::{Image, COMPONENT_IMAGE}; mod menu; pub use menu::{Menu, MenuItem, MenuItemType, COMPONENT_MENU, COMPONENT_MENUITEM}; -pub mod form; -pub use form::{Form, FormMethod, COMPONENT_FORM}; +pub mod form_element; +pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/base/component/form.rs b/pagetop/src/base/component/form_element.rs similarity index 100% rename from pagetop/src/base/component/form.rs rename to pagetop/src/base/component/form_element.rs diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form_element/button.rs similarity index 96% rename from pagetop/src/base/component/form/button.rs rename to pagetop/src/base/component/form_element/button.rs index f5bee082..cddb6bdb 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -54,10 +54,7 @@ impl ComponentTrait for Button { ButtonType::Reset => "reset", ButtonType::Submit => "submit", }; - let id = match self.name().get() { - Some(name) => Some(concat_string!("edit-", name)), - _ => None, - }; + let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { button type=(button_type) @@ -86,7 +83,7 @@ impl ComponentTrait for Button { } impl Button { - pub fn button(value: &str) -> Self { + pub fn new_with_value(value: &str) -> Self { Button::new().with_value(value) } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form_element/date.rs similarity index 98% rename from pagetop/src/base/component/form/date.rs rename to pagetop/src/base/component/form_element/date.rs index 21d24cbf..19370e57 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -53,10 +53,7 @@ impl ComponentTrait for Date { } fn default_render(&self, _: &mut InContext) -> Markup { - let id = match self.name().get() { - Some(name) => Some(concat_string!("edit-", name)), - None => None, - }; + let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { @match self.label().get() { diff --git a/pagetop/src/base/component/form/form.rs b/pagetop/src/base/component/form_element/form.rs similarity index 100% rename from pagetop/src/base/component/form/form.rs rename to pagetop/src/base/component/form_element/form.rs diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs similarity index 93% rename from pagetop/src/base/component/form/hidden.rs rename to pagetop/src/base/component/form_element/hidden.rs index 3ee5c2f5..3da6a4c3 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -26,10 +26,7 @@ impl ComponentTrait for Hidden { } fn default_render(&self, _: &mut InContext) -> Markup { - let id = match self.name().get() { - Some(name) => Some(concat_string!("value-", name)), - _ => None, - }; + let id = self.name().get().map(|name| concat_string!("value-", name)); html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form_element/input.rs similarity index 98% rename from pagetop/src/base/component/form/input.rs rename to pagetop/src/base/component/form_element/input.rs index 6cb50d96..8d56b739 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -78,10 +78,7 @@ impl ComponentTrait for Input { InputType::Textfield => "text", InputType::Url => "url", }; - let id = match self.name().get() { - Some(name) => Some(concat_string!("edit-", name)), - None => None, - }; + let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { @match self.label().get() { diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 66a8b8c8..06749f5b 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -54,7 +54,7 @@ impl ComponentTrait for Image { } impl Image { - pub fn image(source: &str) -> Self { + pub fn new_with_source(source: &str) -> Self { Image::new().with_source(source) } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index a3d3e33a..176ae834 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -87,7 +87,7 @@ fn hello_world() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "hello-col-image") - .with_component(Image::image("/theme/images/demo-header.svg")), + .with_component(Image::new_with_source("/theme/images/demo-header.svg")), ), ) } @@ -121,7 +121,7 @@ fn about_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-image") .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::image("/theme/images/demo-about.svg")), + .with_component(Image::new_with_source("/theme/images/demo-about.svg")), ) .with_column( grid::Column::new() @@ -152,7 +152,7 @@ fn promo_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-image") .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::image("/theme/images/demo-pagetop.svg")), + .with_component(Image::new_with_source("/theme/images/demo-pagetop.svg")), ) .with_column( grid::Column::new() @@ -195,7 +195,7 @@ fn reporting_problems() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "reporting-col-image") - .with_component(Image::image("/theme/images/demo-pagetop.svg")), + .with_component(Image::new_with_source("/theme/images/demo-pagetop.svg")), ), ) } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index b06b62d5..cc5d3c3b 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -6,7 +6,7 @@ use serde::Deserialize; use std::env; /// Nombre del directorio donde se encuentra la configuración. -const CONFIG_DIR: &'static str = "config"; +const CONFIG_DIR: &str = "config"; /// Al arrancar la aplicación, carga los valores originales "clave = valor" de /// los archivos de configuración. Con [`config_map`] se asignarán los ajustes @@ -15,7 +15,7 @@ const CONFIG_DIR: &'static str = "config"; pub static CONFIG: Lazy<Config> = Lazy::new(|| { // Establece el modo de ejecución según el valor de la variable de entorno // PAGETOP_RUN_MODE. Asume "default" por defecto. - let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or("default".into()); + let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); // Inicializa los ajustes. let mut settings = Config::default(); diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 7cb4a651..bc9773c7 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -3,7 +3,7 @@ use crate::html::{html, Markup}; use std::sync::{Arc, RwLock}; -#[derive(Clone)] +#[derive(Clone, Default)] pub struct ComponentsBundle(Vec<Arc<RwLock<dyn ComponentTrait>>>); impl ComponentsBundle { diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 054a87f9..e7aa814c 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -100,11 +100,11 @@ impl InContext { pub fn required_id<T>(&mut self, id: &IdentifierValue) -> String { match id.get() { - Some(id) => id.to_string(), + Some(id) => id, None => { let prefix = util::single_type_name::<T>() .trim() - .replace(" ", "_") + .replace(' ', "_") .to_lowercase(); let prefix = if prefix.is_empty() { "prefix".to_owned() diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 222a968e..ae36ac29 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -33,17 +33,15 @@ fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { .read() .unwrap() .iter() - .any(|m| m.handler() == module.handler()) + .any(|m| m.handler() == module.handler()) && !list.iter().any(|m| m.handler() == module.handler()) { - if !list.iter().any(|m| m.handler() == module.handler()) { - trace::debug!("Enabling module \"{}\"", module.single_name()); - list.push(module); + trace::debug!("Enabling module \"{}\"", module.single_name()); + list.push(module); - let mut dependencies = module.dependencies(); - dependencies.reverse(); - for d in dependencies.iter() { - add_to(list, *d); - } + let mut dependencies = module.dependencies(); + dependencies.reverse(); + for d in dependencies.iter() { + add_to(list, *d); } } } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 3c25c0dc..de2556ad 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -13,7 +13,7 @@ macro_rules! pub_migration { impl MigrationName for $migration { fn name(&self) -> &str { - crate::util::partial_type_name(module_path!(), 1) + $crate::util::partial_type_name(module_path!(), 1) } } }; diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 338446f4..1736dbc0 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -17,6 +17,8 @@ pub enum AssetsOp<T: AssetsTrait> { Add(T), Remove(SourceValue), } + +#[derive(Default)] pub struct Assets<T>(Vec<T>); impl<T: AssetsTrait> Assets<T> { diff --git a/pagetop/src/html/attribute.rs b/pagetop/src/html/attribute.rs index 095f9df8..b6cc0e9a 100644 --- a/pagetop/src/html/attribute.rs +++ b/pagetop/src/html/attribute.rs @@ -1,3 +1,4 @@ +#[derive(Default)] pub struct AttributeValue(String); impl AttributeValue { diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 43b1ad79..dd60f177 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -14,6 +14,7 @@ pub enum ClassesOp { SetDefaultIfEmpty, } +#[derive(Default)] pub struct Classes { default: String, added : String, diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index 316d97e8..d3819cf8 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -1,5 +1,6 @@ use crate::html::{html, Markup, PreEscaped}; +#[derive(Default)] pub struct Favicon(Vec<String>); impl Favicon { diff --git a/pagetop/src/html/identifier.rs b/pagetop/src/html/identifier.rs index bda078eb..81223993 100644 --- a/pagetop/src/html/identifier.rs +++ b/pagetop/src/html/identifier.rs @@ -1,3 +1,4 @@ +#[derive(Default)] pub struct IdentifierValue(String); impl IdentifierValue { @@ -12,7 +13,7 @@ impl IdentifierValue { } pub fn with_value(&mut self, value: &str) -> &Self { - self.0 = value.trim().replace(" ", "_"); + self.0 = value.trim().replace(' ', "_"); self } From db053531d1cd5ec2639eb849514b939db0017cf4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 20 Jul 2022 01:05:30 +0200 Subject: [PATCH 136/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 1b048428..05b1c52d 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.19" +version = "0.0.20" edition = "2021" authors = [ @@ -26,7 +26,7 @@ concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.3" futures = "0.3.21" -once_cell = "1.12.0" +once_cell = "1.13.0" paste = "1.0.7" substring = "1.4.5" term_size = "0.3.2" @@ -36,7 +36,7 @@ config_rs = { package = "config", version = "0.11.0", features = ["toml"] } tracing = "0.1.35" tracing-appender = "0.2.2" -tracing-subscriber = { version = "0.3.11", features = ["json", "env-filter"] } +tracing-subscriber = { version = "0.3.14", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } tracing-actix-web = "0.6.0" @@ -72,7 +72,7 @@ sqlite = ["sea-orm", "sea-orm-migration", "sea-orm/sqlx-sqlite"] static-files = "0.2.3" [dev-dependencies] -tokio = { version = "1.17.0", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.20.0", features = ["macros", "rt-multi-thread"] } [lib] name = "pagetop" From 3eb9cfbff87f0d174dd7337615007cbc1be3724b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 20 Jul 2022 17:56:51 +0200 Subject: [PATCH 137/853] Retoca la llamada al renderizado de componentes --- .gitignore | 4 +++ pagetop/src/core/component.rs | 3 +- pagetop/src/core/component/bundle.rs | 2 +- pagetop/src/core/component/definition.rs | 40 ++++++++++++++---------- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 0c5ec392..cd08f2d1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,8 @@ **/log/*.log* **/update.sh Cargo.lock + +website/website + +.sitecopy workdir diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 88c5f0ec..471eefbc 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -2,8 +2,7 @@ mod context; pub use context::{InContext, InContextOp}; mod definition; -use definition::render_component; -pub use definition::{component_mut, component_ref, AnyComponent, ComponentTrait}; +pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; mod bundle; pub use bundle::ComponentsBundle; diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index bc9773c7..4c298fbe 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -30,7 +30,7 @@ impl ComponentsBundle { components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (" ")(super::render_component(&mut *c.write().unwrap(), context))(" ") + (" ")(c.write().unwrap().render(context))(" ") } } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index d3a62c6e..fc5da576 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -4,7 +4,11 @@ use crate::util; pub use std::any::Any as AnyComponent; -pub trait ComponentTrait: AnyComponent + Send + Sync { +pub trait BaseComponent { + fn render(&mut self, context: &mut InContext) -> Markup; +} + +pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { fn new() -> Self where Self: Sized; @@ -41,6 +45,24 @@ pub trait ComponentTrait: AnyComponent + Send + Sync { fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } +impl<C: ComponentTrait> BaseComponent for C { + fn render(&mut self, context: &mut InContext) -> Markup { + // Acciones del componente antes de renderizar. + self.before_render(context); + + // Acciones del tema antes de renderizar el componente. + context.theme().before_render_component(self, context); + + match self.is_renderable(context) { + true => match context.theme().render_component(self, context) { + Some(html) => html, + None => self.default_render(context), + }, + false => html! {}, + } + } +} + pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C { component.as_ref_any().downcast_ref::<C>().unwrap() } @@ -49,22 +71,6 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } -pub fn render_component(component: &mut dyn ComponentTrait, context: &mut InContext) -> Markup { - // Acciones del componente antes de renderizar. - component.before_render(context); - - // Acciones del tema antes de renderizar el componente. - context.theme().before_render_component(component, context); - - match component.is_renderable(context) { - true => match context.theme().render_component(component, context) { - Some(html) => html, - None => component.default_render(context), - }, - false => html! {}, - } -} - #[macro_export] macro_rules! hook_before_render_component { ( $ACTION_HANDLER:ident = $handler:literal, $Component:ty ) => { From 8833a2aa7daa55d4ed600755cb96f0774cb0a10f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 20 Jul 2022 18:44:00 +0200 Subject: [PATCH 138/853] =?UTF-8?q?Retoca=20denominaci=C3=B3n=20y=20agrupa?= =?UTF-8?q?ci=C3=B3n=20de=20las=20acciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 2 +- pagetop/src/core/component/definition.rs | 4 ++-- pagetop/src/core/hook.rs | 6 +++--- pagetop/src/core/hook/all.rs | 20 +++++++++--------- pagetop/src/core/hook/definition.rs | 10 ++++----- pagetop/src/core/hook/holder.rs | 26 ++++++++++++------------ pagetop/src/core/module/all.rs | 6 +++--- pagetop/src/response/page/hook.rs | 6 +++--- 8 files changed, 40 insertions(+), 40 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index c2fde5fd..f2b9323a 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -41,7 +41,7 @@ impl Application { theme::all::register_themes(app.themes()); // Registra las acciones de todos los módulos. - module::all::register_hooks(); + module::all::register_actions(); // Ejecuta actualizaciones pendientes de la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index fc5da576..d43b8f70 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -84,7 +84,7 @@ macro_rules! hook_before_render_component { weight: isize, } - impl HookTrait for [< BeforeRender $Component >] { + impl HookActionTrait for [< BeforeRender $Component >] { fn new() -> Self { [< BeforeRender $Component >] { action: None, @@ -100,7 +100,7 @@ macro_rules! hook_before_render_component { self.weight } - fn as_ref_any(&self) -> &dyn AnyHook { + fn as_ref_any(&self) -> &dyn AnyHookAction { self } } diff --git a/pagetop/src/core/hook.rs b/pagetop/src/core/hook.rs index 8cc94cb0..579c3bbc 100644 --- a/pagetop/src/core/hook.rs +++ b/pagetop/src/core/hook.rs @@ -1,10 +1,10 @@ mod definition; -pub use definition::{action_ref, AnyHook, HookTrait}; +pub use definition::{action_ref, AnyHookAction, HookActionTrait}; mod holder; pub use holder::HookAction; -use holder::HooksHolder; +use holder::ActionsHolder; mod all; -pub(crate) use all::add_hook; +pub(crate) use all::add_action; pub use all::run_actions; diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index d3d00342..05b2f510 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,20 +1,20 @@ -use super::{HookAction, HooksHolder}; +use super::{HookAction, ActionsHolder}; use crate::Lazy; use std::collections::HashMap; use std::sync::RwLock; // Registered actions. -static ACTIONS: Lazy<RwLock<HashMap<&str, HooksHolder>>> = +static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = Lazy::new(|| RwLock::new(HashMap::new())); -pub fn add_hook(hook: HookAction) { - let mut hmap = ACTIONS.write().unwrap(); - let action_handler = hook.handler(); - if let Some(actions) = hmap.get_mut(action_handler) { - actions.add(hook); +pub fn add_action(action: HookAction) { + let mut actions = ACTIONS.write().unwrap(); + let action_handler = action.handler(); + if let Some(holder) = actions.get_mut(action_handler) { + holder.add(action); } else { - hmap.insert(action_handler, HooksHolder::new_with(hook)); + actions.insert(action_handler, ActionsHolder::new_with(action)); } } @@ -22,7 +22,7 @@ pub fn run_actions<B, F>(action_handler: &str, f: F) where F: FnMut(&HookAction) -> B, { - if let Some(actions) = ACTIONS.read().unwrap().get(action_handler) { - actions.iter_map(f) + if let Some(holder) = ACTIONS.read().unwrap().get(action_handler) { + holder.iter_map(f) } } diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index 2b89b969..ae739fa6 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -1,6 +1,6 @@ -pub use std::any::Any as AnyHook; +pub use std::any::Any as AnyHookAction; -pub trait HookTrait: AnyHook + Send + Sync { +pub trait HookActionTrait: AnyHookAction + Send + Sync { fn new() -> Self where Self: Sized; @@ -11,9 +11,9 @@ pub trait HookTrait: AnyHook + Send + Sync { 0 } - fn as_ref_any(&self) -> &dyn AnyHook; + fn as_ref_any(&self) -> &dyn AnyHookAction; } -pub fn action_ref<A: 'static>(hook: &dyn HookTrait) -> &A { - hook.as_ref_any().downcast_ref::<A>().unwrap() +pub fn action_ref<A: 'static>(action: &dyn HookActionTrait) -> &A { + action.as_ref_any().downcast_ref::<A>().unwrap() } diff --git a/pagetop/src/core/hook/holder.rs b/pagetop/src/core/hook/holder.rs index 4a607c1d..31f69711 100644 --- a/pagetop/src/core/hook/holder.rs +++ b/pagetop/src/core/hook/holder.rs @@ -1,8 +1,8 @@ -use super::HookTrait; +use super::HookActionTrait; use std::sync::{Arc, RwLock}; -pub type HookAction = Box<dyn HookTrait>; +pub type HookAction = Box<dyn HookActionTrait>; #[macro_export] macro_rules! hook_action { @@ -11,23 +11,23 @@ macro_rules! hook_action { }}; } -pub struct HooksHolder(Arc<RwLock<Vec<HookAction>>>); +pub struct ActionsHolder(Arc<RwLock<Vec<HookAction>>>); -impl HooksHolder { +impl ActionsHolder { pub fn new() -> Self { - HooksHolder(Arc::new(RwLock::new(Vec::new()))) + ActionsHolder(Arc::new(RwLock::new(Vec::new()))) } - pub fn new_with(hook: HookAction) -> Self { - let mut container = HooksHolder::new(); - container.add(hook); - container + pub fn new_with(action: HookAction) -> Self { + let mut holder = ActionsHolder::new(); + holder.add(action); + holder } - pub fn add(&mut self, hook: HookAction) { - let mut actions = self.0.write().unwrap(); - actions.push(hook); - actions.sort_by_key(|a| a.weight()); + pub fn add(&mut self, action: HookAction) { + let mut holder = self.0.write().unwrap(); + holder.push(action); + holder.sort_by_key(|a| a.weight()); } pub fn iter_map<B, F>(&self, f: F) diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index ae36ac29..87d952b1 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,5 +1,5 @@ use super::ModuleTrait; -use crate::core::hook::add_hook; +use crate::core::hook::add_action; use crate::{app, trace, Lazy}; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] @@ -56,10 +56,10 @@ pub fn modules(cfg: &mut app::web::ServiceConfig) { } } -pub fn register_hooks() { +pub fn register_actions() { for m in ENABLED_MODULES.read().unwrap().iter() { for a in m.actions().into_iter() { - add_hook(a); + add_action(a); } } } diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index ac78719b..28d6a779 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,5 +1,5 @@ use super::Page; -use crate::core::hook::{AnyHook, HookTrait}; +use crate::core::hook::{AnyHookAction, HookActionTrait}; pub const HOOK_BEFORE_RENDER_PAGE: &str = "pagetop::hook::before_render_page"; @@ -10,7 +10,7 @@ pub struct BeforeRenderPageHook { weight: isize, } -impl HookTrait for BeforeRenderPageHook { +impl HookActionTrait for BeforeRenderPageHook { fn new() -> Self { BeforeRenderPageHook { hook: None, @@ -26,7 +26,7 @@ impl HookTrait for BeforeRenderPageHook { self.weight } - fn as_ref_any(&self) -> &dyn AnyHook { + fn as_ref_any(&self) -> &dyn AnyHookAction { self } } From 1543ab296076b80eb664313cab91a90f1a3f8095 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Jul 2022 18:20:33 +0200 Subject: [PATCH 139/853] =?UTF-8?q?A=C3=B1ade=20una=20v=C3=ADa=20para=20da?= =?UTF-8?q?r=20respuesta=20a=20errores=20fatales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Son errores fatales aquellos que deberán mostrarse (renderizarse) sin depender de las APIs de renderizado de páginas. No pueden depender del tema ni del estado actual de la aplicación. Se generan al intentar componer una página y se llega a una situación no recuperable que debe informarse directamente al navegador cliente. Es típico el error 500 (internal server error) pero también un error 507 (insufficient storage) y otros más que se irán contemplando según requerimientos. --- pagetop-admin/src/summary.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/app.rs | 4 ++- pagetop/src/app/fatal_error.rs | 38 +++++++++++++++++++++++++ pagetop/src/base/module/homepage.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/core/theme/definition.rs | 7 +++-- pagetop/src/prelude.rs | 1 + pagetop/src/response.rs | 2 ++ pagetop/src/response/page.rs | 2 ++ pagetop/src/response/page/definition.rs | 9 +++--- 12 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 pagetop/src/app/fatal_error.rs diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 01fd1650..6f798252 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,7 +1,7 @@ use super::l; use pagetop::prelude::*; -pub async fn summary() -> app::Result<Markup> { +pub async fn summary() -> ResultPage<Markup, FatalError> { let top_menu = Menu::new() .with_item(MenuItem::label(l("module_name").as_str())) .with_item(MenuItem::link("Opción 2", "https://www.google.es")) diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index a5c94d2e..343a467d 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -40,7 +40,7 @@ impl ModuleTrait for Node { } } -async fn node() -> app::Result<Markup> { +async fn node() -> ResultPage<Markup, FatalError> { Page::new().with_title("Nodo").render() } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 78640dfc..4b5732ad 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -35,7 +35,7 @@ impl ModuleTrait for User { } } -async fn login() -> app::Result<Markup> { +async fn login() -> ResultPage<Markup, FatalError> { Page::new() .with_title("Identificación del usuario") .add_to( diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index fbaf9b75..9bae2939 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,4 +1,4 @@ -pub use actix_web::{http, web, App, HttpRequest, HttpResponse, HttpServer, Responder, Result}; +pub use actix_web::{http, web, App, HttpRequest, HttpResponse, HttpServer, Responder}; mod banner; @@ -13,3 +13,5 @@ mod definition; pub use definition::AppTrait; pub mod application; + +pub mod fatal_error; \ No newline at end of file diff --git a/pagetop/src/app/fatal_error.rs b/pagetop/src/app/fatal_error.rs new file mode 100644 index 00000000..079e3047 --- /dev/null +++ b/pagetop/src/app/fatal_error.rs @@ -0,0 +1,38 @@ +use crate::app::HttpResponse; +use crate::app::http::{header::ContentType, StatusCode}; +use crate::response::ResponseError; + +use std::fmt; + +#[derive(Debug)] +pub enum FatalError { + InternalError, + BadClientData, + Timeout, +} + +impl fmt::Display for FatalError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + FatalError::InternalError => write!(f, "Internal Error"), + FatalError::BadClientData => write!(f, "Bad Client Data"), + FatalError::Timeout => write!(f, "Timeout"), + } + } +} + +impl ResponseError for FatalError { + fn error_response(&self) -> HttpResponse { + HttpResponse::build(self.status_code()) + .insert_header(ContentType::html()) + .body(self.to_string()) + } + + fn status_code(&self) -> StatusCode { + match *self { + FatalError::InternalError => StatusCode::INTERNAL_SERVER_ERROR, + FatalError::BadClientData => StatusCode::BAD_REQUEST, + FatalError::Timeout => StatusCode::GATEWAY_TIMEOUT, + } + } +} diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 176ae834..b0512501 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -24,7 +24,7 @@ impl ModuleTrait for DefaultHomePage { } } -async fn demo() -> app::Result<Markup> { +async fn demo() -> ResultPage<Markup, FatalError> { Page::new() .with_title(l("page_title").as_str()) .with_context(InContextOp::StyleSheet(AssetsOp::Add(StyleSheet::located( diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 0525053d..7731786f 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -34,7 +34,7 @@ impl ThemeTrait for Bootsier { .alter_context(InContextOp::AddJQuery); } - fn render_error_page(&self, mut s: app::http::StatusCode) -> app::Result<Markup> { + fn render_error_page(&self, mut s: app::http::StatusCode) -> ResultPage<Markup, FatalError> { let mut description = "e500-description"; let mut message = "e500-description"; match s { diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index fe1b7821..c2bcbd86 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -2,8 +2,9 @@ use crate::base::component::Chunck; use crate::config::SETTINGS; use crate::core::component::{ComponentTrait, InContext, InContextOp}; use crate::html::{html, Favicon, Markup}; -use crate::response::page::Page; -use crate::{app, concat_string, util}; +use crate::{concat_string, util}; +use crate::{app, app::fatal_error::FatalError}; +use crate::response::page::{Page, ResultPage}; pub trait BaseTheme { fn single_name(&self) -> &'static str; @@ -116,7 +117,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { */ } - fn render_error_page(&self, s: app::http::StatusCode) -> app::Result<Markup> { + fn render_error_page(&self, s: app::http::StatusCode) -> ResultPage<Markup, FatalError> { Page::new() .with_title(format!("Error {}", s.as_str()).as_str()) .add_to( diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index f6e6fc97..9ce6e3c7 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -16,6 +16,7 @@ pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::app; pub use crate::app::application::Application; +pub use crate::app::fatal_error::FatalError; pub use crate::app::AppTrait; pub use crate::core::{component::*, hook::*, module::*, theme::*}; diff --git a/pagetop/src/response.rs b/pagetop/src/response.rs index 79d28612..cdce7ee2 100644 --- a/pagetop/src/response.rs +++ b/pagetop/src/response.rs @@ -1 +1,3 @@ +pub use actix_web::ResponseError; + pub mod page; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 96530369..3f82c157 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,3 +1,5 @@ +pub use actix_web::Result as ResultPage; + mod hook; pub use hook::{BeforeRenderPageHook, HOOK_BEFORE_RENDER_PAGE}; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 0ad8bbb0..e8437c81 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,9 +1,10 @@ -use super::{BeforeRenderPageHook, HOOK_BEFORE_RENDER_PAGE}; +use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; +use crate::app::fatal_error::FatalError; use crate::config::SETTINGS; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::*; -use crate::{app, trace, Lazy}; +use crate::{trace, Lazy}; use std::collections::HashMap; @@ -191,7 +192,7 @@ impl Page { // Page RENDER. - pub fn render(&mut self) -> app::Result<Markup> { + pub fn render(&mut self) -> ResultPage<Markup, FatalError> { // Acciones de los módulos antes de renderizar la página. run_actions(HOOK_BEFORE_RENDER_PAGE, |hook| { action_ref::<BeforeRenderPageHook>(&**hook).run(self) @@ -222,6 +223,4 @@ impl Page { None => html! {}, } } - - // Page EXTRAS. } From 1363c3da1f514e48ffef6405599f240139be9558 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 22 Jul 2022 18:39:23 +0200 Subject: [PATCH 140/853] =?UTF-8?q?A=C3=B1ade=20el=20error=20404=20integra?= =?UTF-8?q?do=20en=20el=20servidor=20web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 25 ++++++++++++++++++++++- pagetop/src/base/theme/bootsier.rs | 30 ++++++++-------------------- pagetop/src/core/theme/definition.rs | 30 ++++++++++++++++++---------- 3 files changed, 51 insertions(+), 34 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index f2b9323a..31ce03d8 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,6 +1,8 @@ -use super::AppTrait; +use super::{fatal_error::FatalError, AppTrait}; use crate::config::SETTINGS; use crate::core::{module, theme}; +use crate::html::Markup; +use crate::response::page::{Page, ResultPage}; use crate::{base, trace, Lazy}; use actix_web::dev::Server; @@ -57,6 +59,7 @@ impl Application { .wrap(tracing_actix_web::TracingLogger::default()) .configure(&module::all::modules) .configure(&theme::all::themes) + .default_service(super::web::route().to(service_not_found)) }) .bind(format!( "{}:{}", @@ -71,3 +74,23 @@ impl Application { Ok(self.server) } } + +async fn service_not_found() -> ResultPage<Markup, FatalError> { + let mut page = Page::new(); + let content_error = page.context().theme().error_404_not_found(); + page + .with_title("Error RESOURCE NOT FOUND") + .using_template("error") + .add_to("content", content_error) + .render() +} + +async fn _access_denied() -> ResultPage<Markup, FatalError> { + let mut page = Page::new(); + let content_error = page.context().theme().error_403_access_denied(); + page + .with_title("Error FORBIDDEN ACCESS") + .using_template("error") + .add_to("content", content_error) + .render() +} diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 7731786f..04f810f2 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -34,35 +34,22 @@ impl ThemeTrait for Bootsier { .alter_context(InContextOp::AddJQuery); } - fn render_error_page(&self, mut s: app::http::StatusCode) -> ResultPage<Markup, FatalError> { - let mut description = "e500-description"; - let mut message = "e500-description"; - match s { - app::http::StatusCode::NOT_FOUND => { - description = "e404-description"; - message = "e404-message"; - } - _ => { - s = app::http::StatusCode::INTERNAL_SERVER_ERROR; - } - } - Page::new() - .with_title(format!("Error {}", s.as_str()).as_str()) - .add_to( - "content", + fn error_404_not_found(&self) -> Container { + Container::new() + .with_component( Chunck::with(html! { div class="jumbotron" { div class="media" { img - src="/static/bootsier/images/caution.png" + src="/bootsier/images/caution.png" class="mr-4" style="width: 20%; max-width: 188px" alt="Caution!"; div class="media-body" { - h1 class="display-4" { (s.as_str()) } - p class="lead" { (l(description)) } + h1 class="display-4" { ("RESOURCE NOT FOUND") } + p class="lead" { (l("e404-description")) } hr class="my-4"; - p { (l(message)) } + p { (l("e404-description")) } a class="btn btn-primary btn-lg" href="/" @@ -73,8 +60,7 @@ impl ThemeTrait for Bootsier { } } } - }), + }) ) - .render() } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index c2bcbd86..69c8a815 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,10 +1,10 @@ -use crate::base::component::Chunck; +use crate::app; +use crate::base::component::{Chunck, Container}; use crate::config::SETTINGS; use crate::core::component::{ComponentTrait, InContext, InContextOp}; use crate::html::{html, Favicon, Markup}; +use crate::response::page::Page; use crate::{concat_string, util}; -use crate::{app, app::fatal_error::FatalError}; -use crate::response::page::{Page, ResultPage}; pub trait BaseTheme { fn single_name(&self) -> &'static str; @@ -117,18 +117,26 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { */ } - fn render_error_page(&self, s: app::http::StatusCode) -> ResultPage<Markup, FatalError> { - Page::new() - .with_title(format!("Error {}", s.as_str()).as_str()) - .add_to( - "content", + fn error_404_not_found(&self) -> Container { + Container::new() + .with_component( Chunck::with(html! { div { - h1 { (s.as_str()) } + h1 { ("RESOURCE NOT FOUND") } } - }), + }) + ) + } + + fn error_403_access_denied(&self) -> Container { + Container::new() + .with_component( + Chunck::with(html! { + div { + h1 { ("FORBIDDEN ACCESS") } + } + }) ) - .render() } } From aa3f0cf79ab79b2520075cf2ac38501bbed39878 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 22 Jul 2022 18:43:56 +0200 Subject: [PATCH 141/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 05b1c52d..9d6034ca 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.20" +version = "0.0.21" edition = "2021" authors = [ @@ -53,13 +53,13 @@ maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6", feature serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.9.0" +version = "0.9.1" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-orm-migration] -version = "0.9.0" +version = "0.9.1" optional = true [features] From bd5ccdef8ae4ddf9f253a880473b23dbde69c66f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Jul 2022 08:00:42 +0200 Subject: [PATCH 142/853] =?UTF-8?q?Corrige=20localizaci=C3=B3n=20errores?= =?UTF-8?q?=20NOT=5FFOUND=20y=20FORBIDDEN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 20 ++------------------ pagetop/src/app/fatal_error.rs | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 31ce03d8..d1a56ce4 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -2,7 +2,7 @@ use super::{fatal_error::FatalError, AppTrait}; use crate::config::SETTINGS; use crate::core::{module, theme}; use crate::html::Markup; -use crate::response::page::{Page, ResultPage}; +use crate::response::page::ResultPage; use crate::{base, trace, Lazy}; use actix_web::dev::Server; @@ -76,21 +76,5 @@ impl Application { } async fn service_not_found() -> ResultPage<Markup, FatalError> { - let mut page = Page::new(); - let content_error = page.context().theme().error_404_not_found(); - page - .with_title("Error RESOURCE NOT FOUND") - .using_template("error") - .add_to("content", content_error) - .render() -} - -async fn _access_denied() -> ResultPage<Markup, FatalError> { - let mut page = Page::new(); - let content_error = page.context().theme().error_403_access_denied(); - page - .with_title("Error FORBIDDEN ACCESS") - .using_template("error") - .add_to("content", content_error) - .render() + Err(FatalError::NotFound) } diff --git a/pagetop/src/app/fatal_error.rs b/pagetop/src/app/fatal_error.rs index 079e3047..71f730ae 100644 --- a/pagetop/src/app/fatal_error.rs +++ b/pagetop/src/app/fatal_error.rs @@ -1,11 +1,13 @@ use crate::app::HttpResponse; use crate::app::http::{header::ContentType, StatusCode}; -use crate::response::ResponseError; +use crate::response::{page::Page, ResponseError}; use std::fmt; #[derive(Debug)] pub enum FatalError { + NotFound, + AccessDenied, InternalError, BadClientData, Timeout, @@ -14,6 +16,34 @@ pub enum FatalError { impl fmt::Display for FatalError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { + FatalError::NotFound => { + let mut error_page = Page::new(); + let error_content = error_page.context().theme().error_404_not_found(); + if let Ok(page) = error_page + .with_title("Error RESOURCE NOT FOUND") + .using_template("error") + .add_to("content", error_content) + .render() + { + write!(f, "{}", page.into_string()) + } else { + write!(f, "Not Found") + } + }, + FatalError::AccessDenied => { + let mut error_page = Page::new(); + let error_content = error_page.context().theme().error_403_access_denied(); + if let Ok(page) = error_page + .with_title("Error FORBIDDEN") + .using_template("error") + .add_to("content", error_content) + .render() + { + write!(f, "{}", page.into_string()) + } else { + write!(f, "Access Denied") + } + }, FatalError::InternalError => write!(f, "Internal Error"), FatalError::BadClientData => write!(f, "Bad Client Data"), FatalError::Timeout => write!(f, "Timeout"), @@ -30,6 +60,8 @@ impl ResponseError for FatalError { fn status_code(&self) -> StatusCode { match *self { + FatalError::NotFound => StatusCode::NOT_FOUND, + FatalError::AccessDenied => StatusCode::FORBIDDEN, FatalError::InternalError => StatusCode::INTERNAL_SERVER_ERROR, FatalError::BadClientData => StatusCode::BAD_REQUEST, FatalError::Timeout => StatusCode::GATEWAY_TIMEOUT, From 280fa4cac1db9e5976d54568b362ea13fecf7f92 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Jul 2022 08:08:25 +0200 Subject: [PATCH 143/853] Actualiza el componente Chunck para llamarse Html --- pagetop-admin/src/summary.rs | 2 +- pagetop/src/base/component.rs | 4 ++-- .../src/base/component/{chunck.rs => html.rs} | 20 +++++++++---------- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/core/theme/definition.rs | 6 +++--- 5 files changed, 17 insertions(+), 17 deletions(-) rename pagetop/src/base/component/{chunck.rs => html.rs} (87%) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 6f798252..c2f40b63 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -48,7 +48,7 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { "content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) - .with_column(grid::Column::new().with_component(Chunck::with(html! { + .with_column(grid::Column::new().with_component(Html::with(html! { p { "Columna 2"} }))), ) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 4077888b..f01900e4 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -3,8 +3,8 @@ pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; pub mod grid; -mod chunck; -pub use chunck::{Chunck, COMPONENT_CHUNCK}; +mod html; +pub use html::{Html, COMPONENT_HTML}; mod icon; pub use icon::{Icon, COMPONENT_ICON}; mod heading; diff --git a/pagetop/src/base/component/chunck.rs b/pagetop/src/base/component/html.rs similarity index 87% rename from pagetop/src/base/component/chunck.rs rename to pagetop/src/base/component/html.rs index 9622923a..438684a2 100644 --- a/pagetop/src/base/component/chunck.rs +++ b/pagetop/src/base/component/html.rs @@ -1,17 +1,17 @@ use crate::prelude::*; -pub const COMPONENT_CHUNCK: &str = "pagetop::component::chunck"; +pub const COMPONENT_HTML: &str = "pagetop::component::html"; -pub struct Chunck { +pub struct Html { weight : isize, renderable: Renderable, html : Markup, template : String, } -impl ComponentTrait for Chunck { +impl ComponentTrait for Html { fn new() -> Self { - Chunck { + Html { weight : 0, renderable: render_always, html : html! {}, @@ -20,7 +20,7 @@ impl ComponentTrait for Chunck { } fn handler(&self) -> &'static str { - COMPONENT_CHUNCK + COMPONENT_HTML } fn weight(&self) -> isize { @@ -44,12 +44,12 @@ impl ComponentTrait for Chunck { } } -impl Chunck { +impl Html { pub fn with(html: Markup) -> Self { - Chunck::new().with_html(html) + Html::new().with_html(html) } - // Chunck BUILDER. + // Html BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { self.alter_weight(weight); @@ -71,7 +71,7 @@ impl Chunck { self } - // Chunck ALTER. + // Html ALTER. pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; @@ -93,7 +93,7 @@ impl Chunck { self } - // Chunck GETTERS. + // Html GETTERS. pub fn html(&self) -> &Markup { &self.html diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 04f810f2..6dcf5fd0 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -37,7 +37,7 @@ impl ThemeTrait for Bootsier { fn error_404_not_found(&self) -> Container { Container::new() .with_component( - Chunck::with(html! { + Html::with(html! { div class="jumbotron" { div class="media" { img diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 69c8a815..16cdef6c 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,5 +1,5 @@ use crate::app; -use crate::base::component::{Chunck, Container}; +use crate::base::component::{Container, Html}; use crate::config::SETTINGS; use crate::core::component::{ComponentTrait, InContext, InContextOp}; use crate::html::{html, Favicon, Markup}; @@ -120,7 +120,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn error_404_not_found(&self) -> Container { Container::new() .with_component( - Chunck::with(html! { + Html::with(html! { div { h1 { ("RESOURCE NOT FOUND") } } @@ -131,7 +131,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn error_403_access_denied(&self) -> Container { Container::new() .with_component( - Chunck::with(html! { + Html::with(html! { div { h1 { ("FORBIDDEN ACCESS") } } From a7105d6a6345218f6888a6c2fd0ef76b9ced98dc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Jul 2022 14:03:23 +0200 Subject: [PATCH 144/853] =?UTF-8?q?Actualiza=20la=20denominaci=C3=B3n=20La?= =?UTF-8?q?zy=20por=20LazyStatic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 8 +++---- pagetop/src/app/banner/figfont.rs | 4 ++-- pagetop/src/app/db.rs | 6 ++--- pagetop/src/app/locale.rs | 30 +++++++++++++------------ pagetop/src/app/tracing.rs | 4 ++-- pagetop/src/config.rs | 6 ++--- pagetop/src/core/component/all.rs | 7 +++--- pagetop/src/core/component/context.rs | 9 ++++---- pagetop/src/core/hook/all.rs | 7 +++--- pagetop/src/core/module/all.rs | 6 +++-- pagetop/src/core/theme/all.rs | 6 +++-- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page/definition.rs | 6 ++--- 14 files changed, 56 insertions(+), 47 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index d1a56ce4..aa49adcb 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -3,7 +3,7 @@ use crate::config::SETTINGS; use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; -use crate::{base, trace, Lazy}; +use crate::{base, trace, LazyStatic}; use actix_web::dev::Server; use std::io::Error; @@ -18,14 +18,14 @@ impl Application { super::banner::print_on_startup(); // Inicia registro de trazas y eventos. - Lazy::force(&super::tracing::TRACING); + LazyStatic::force(&super::tracing::TRACING); // Valida el identificador de idioma. - Lazy::force(&super::locale::LANGID); + LazyStatic::force(&super::locale::LANGID); // Conecta con la base de datos (opcional). #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] - Lazy::force(&super::db::DBCONN); + LazyStatic::force(&super::db::DBCONN); // Habilita los módulos predeterminados. module::all::enable_modules(vec![&base::module::homepage::DefaultHomePage]); diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index 51be8ae9..d92fe35a 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -1,9 +1,9 @@ use crate::config::SETTINGS; -use crate::Lazy; +use crate::LazyStatic; use figlet_rs::FIGfont; -pub static FIGFONT: Lazy<FIGfont> = Lazy::new(|| { +pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { let slant = include_str!("slant.flf"); let small = include_str!("small.flf"); let speed = include_str!("speed.flf"); diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 23818424..98f96e47 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,11 +1,11 @@ use crate::config::SETTINGS; use crate::db::*; -use crate::{run_now, trace, Lazy}; +use crate::{run_now, trace, LazyStatic}; use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; use tracing_unwrap::ResultExt; -pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { +pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", &SETTINGS.database.db_name, @@ -61,7 +61,7 @@ pub static DBCONN: Lazy<DbConn> = Lazy::new(|| { .expect_or_log("Failed to connect to database") }); -static DBBACKEND: Lazy<DatabaseBackend> = Lazy::new(|| DBCONN.get_database_backend()); +static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| DBCONN.get_database_backend()); pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { DBCONN diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index af7a57c8..5354ffdb 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -1,22 +1,24 @@ use crate::config::SETTINGS; -use crate::{trace, Lazy}; +use crate::{trace, LazyStatic}; use unic_langid::LanguageIdentifier; /// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] /// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de /// la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: Lazy<LanguageIdentifier> = Lazy::new(|| match SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "{}, {} \"{}\"! {}, {}", - "Failed to parse language", - "unrecognized Unicode Language Identifier", - SETTINGS.app.language, - "Using \"en-US\"", - "check the settings file", - ); - "en-US".parse().unwrap() +pub static LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| + match SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "{}, {} \"{}\"! {}, {}", + "Failed to parse language", + "unrecognized Unicode Language Identifier", + SETTINGS.app.language, + "Using \"en-US\"", + "check the settings file", + ); + "en-US".parse().unwrap() + } } -}); +); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index d7c8e071..4282cb7d 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -1,5 +1,5 @@ use crate::config::SETTINGS; -use crate::Lazy; +use crate::LazyStatic; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; @@ -17,7 +17,7 @@ use tracing_subscriber::EnvFilter; /// `Lazy<WorkerGuard>` se garantiza que todos los registros almacenados se /// enviarán antes de terminar la ejecución. -pub static TRACING: Lazy<WorkerGuard> = Lazy::new(|| { +pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); let rolling = SETTINGS.log.rolling.to_lowercase(); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index cc5d3c3b..7c8b32d8 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,4 +1,4 @@ -use crate::Lazy; +use crate::LazyStatic; use config_rs::{Config, File}; use serde::Deserialize; @@ -12,7 +12,7 @@ const CONFIG_DIR: &str = "config"; /// los archivos de configuración. Con [`config_map`] se asignarán los ajustes /// globales ([`SETTINGS`]); y se podrán asignar los ajustes específicos de la /// aplicación, o también de un tema, módulo o componente. -pub static CONFIG: Lazy<Config> = Lazy::new(|| { +pub static CONFIG: LazyStatic<Config> = LazyStatic::new(|| { // Establece el modo de ejecución según el valor de la variable de entorno // PAGETOP_RUN_MODE. Asume "default" por defecto. let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); @@ -48,7 +48,7 @@ macro_rules! config_map { $crate::doc_comment! { concat!($doc), - pub static $SETTINGS: $crate::Lazy<$Type> = $crate::Lazy::new(|| { + pub static $SETTINGS: $crate::LazyStatic<$Type> = $crate::LazyStatic::new(|| { let mut settings = $crate::config::CONFIG.clone(); $( settings.set_default($key, $value).unwrap(); diff --git a/pagetop/src/core/component/all.rs b/pagetop/src/core/component/all.rs index 4309c3a7..74873a46 100644 --- a/pagetop/src/core/component/all.rs +++ b/pagetop/src/core/component/all.rs @@ -1,11 +1,12 @@ use super::{ComponentTrait, ComponentsBundle}; -use crate::Lazy; +use crate::LazyStatic; use std::collections::HashMap; use std::sync::RwLock; -static COMPONENTS: Lazy<RwLock<HashMap<&str, ComponentsBundle>>> = - Lazy::new(|| RwLock::new(HashMap::new())); +static COMPONENTS: LazyStatic<RwLock<HashMap<&str, ComponentsBundle>>> = LazyStatic::new(|| + RwLock::new(HashMap::new()) +); pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { let mut hmap = COMPONENTS.write().unwrap(); diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index e7aa814c..0b8f1429 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -2,13 +2,14 @@ use crate::config::SETTINGS; use crate::core::theme::all::theme_by_single_name; use crate::core::theme::ThemeTrait; use crate::html::*; -use crate::{base, concat_string, util, Lazy}; +use crate::{base, concat_string, util, LazyStatic}; -static DEFAULT_THEME: Lazy<&dyn ThemeTrait> = - Lazy::new(|| match theme_by_single_name(&SETTINGS.app.theme) { +static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = LazyStatic::new(|| + match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, - }); + } +); pub enum InContextOp { SetTheme(&'static str), diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index 05b2f510..ab562311 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,12 +1,13 @@ use super::{HookAction, ActionsHolder}; -use crate::Lazy; +use crate::LazyStatic; use std::collections::HashMap; use std::sync::RwLock; // Registered actions. -static ACTIONS: Lazy<RwLock<HashMap<&str, ActionsHolder>>> = - Lazy::new(|| RwLock::new(HashMap::new())); +static ACTIONS: LazyStatic<RwLock<HashMap<&str, ActionsHolder>>> = LazyStatic::new(|| + RwLock::new(HashMap::new()) +); pub fn add_action(action: HookAction) { let mut actions = ACTIONS.write().unwrap(); diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 87d952b1..4e6c6282 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,6 +1,6 @@ use super::ModuleTrait; use crate::core::hook::add_action; -use crate::{app, trace, Lazy}; +use crate::{app, trace, LazyStatic}; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] use crate::{db::*, run_now}; @@ -8,7 +8,9 @@ use crate::{db::*, run_now}; use std::sync::RwLock; // Enabled modules. -static ENABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| RwLock::new(Vec::new())); +static ENABLED_MODULES: LazyStatic<RwLock<Vec<&dyn ModuleTrait>>> = LazyStatic::new(|| + RwLock::new(Vec::new()) +); /* Disabled modules. static DISABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 46c6f699..923175fe 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,12 +1,14 @@ use super::ThemeTrait; -use crate::{app, theme_static_files, trace, Lazy}; +use crate::{app, theme_static_files, trace, LazyStatic}; use std::sync::RwLock; include!(concat!(env!("OUT_DIR"), "/theme.rs")); // Temas registrados. -static THEMES: Lazy<RwLock<Vec<&dyn ThemeTrait>>> = Lazy::new(|| RwLock::new(Vec::new())); +static THEMES: LazyStatic<RwLock<Vec<&dyn ThemeTrait>>> = LazyStatic::new(|| + RwLock::new(Vec::new()) +); pub fn register_themes(themes: Vec<&'static dyn ThemeTrait>) { for t in themes { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 5a33697c..5d788104 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -2,7 +2,7 @@ pub use concat_string::concat_string; pub use doc_comment::doc_comment; -pub use once_cell::sync::Lazy; +pub use once_cell::sync::Lazy as LazyStatic; // LOCAL. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 9ce6e3c7..3ad1f27c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,7 +1,7 @@ //! Re-exporta recursos comunes. // Global macros and helpers. -pub use crate::{args, concat_string, theme_static_files, util}; +pub use crate::{args, concat_string, theme_static_files, util, LazyStatic}; pub use crate::config::SETTINGS; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index e8437c81..bbd00059 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -4,11 +4,11 @@ use crate::config::SETTINGS; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::*; -use crate::{trace, Lazy}; +use crate::{trace, LazyStatic}; use std::collections::HashMap; -static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { +static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { let language = SETTINGS.app.language[..2].to_lowercase(); if !language.is_empty() { Some(language) @@ -17,7 +17,7 @@ static DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| { } }); -static DEFAULT_DIRECTION: Lazy<Option<String>> = Lazy::new(|| { +static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { let direction = SETTINGS.app.direction.to_lowercase(); match direction.as_str() { "auto" => Some("auto".to_owned()), From ae2d54828f65f5aacdac4f612a0a07c8850b3430 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Jul 2022 12:48:29 +0200 Subject: [PATCH 145/853] =?UTF-8?q?A=C3=B1ade=20nuevo=20c=C3=B3digo=20para?= =?UTF-8?q?=20soportar=20MdBook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 9 ---- pagetop-admin/src/summary.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/app.rs | 4 +- pagetop/src/app/fatal_error.rs | 61 +++++++++++++++---------- pagetop/src/base/module/homepage.rs | 10 ++-- pagetop/src/core/theme/definition.rs | 12 ++--- pagetop/src/html.rs | 2 +- pagetop/src/html/assets/stylesheet.rs | 17 ++++++- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page/definition.rs | 6 ++- pagetop/src/util.rs | 7 ++- 12 files changed, 79 insertions(+), 55 deletions(-) delete mode 100644 Cargo.toml diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 75cd1c81..00000000 --- a/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[workspace] -members = [ - "drust", - "pagetop", - "pagetop-admin", - "pagetop-user", - "pagetop-node", - "website", -] \ No newline at end of file diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index c2f40b63..e09071f5 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -45,7 +45,7 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { .with_title("Admin") .add_to("top-menu", top_menu) .add_to( - "content", + "region-content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) .with_column(grid::Column::new().with_component(Html::with(html! { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 4b5732ad..ee49fa8d 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -39,7 +39,7 @@ async fn login() -> ResultPage<Markup, FatalError> { Page::new() .with_title("Identificación del usuario") .add_to( - "content", + "region-content", Container::new() .with_id("welcome") .with_component(form_login()), diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 9bae2939..80237c40 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,4 +1,6 @@ -pub use actix_web::{http, web, App, HttpRequest, HttpResponse, HttpServer, Responder}; +pub use actix_web::{http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder}; +pub use actix_web_static_files::ResourceFiles; +pub use actix_files::Files as ActixFiles; mod banner; diff --git a/pagetop/src/app/fatal_error.rs b/pagetop/src/app/fatal_error.rs index 71f730ae..8bc30f50 100644 --- a/pagetop/src/app/fatal_error.rs +++ b/pagetop/src/app/fatal_error.rs @@ -6,37 +6,30 @@ use std::fmt; #[derive(Debug)] pub enum FatalError { - NotFound, + NotModified, + BadRequest, AccessDenied, + NotFound, + PreconditionFailed, InternalError, - BadClientData, Timeout, } impl fmt::Display for FatalError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { - FatalError::NotFound => { - let mut error_page = Page::new(); - let error_content = error_page.context().theme().error_404_not_found(); - if let Ok(page) = error_page - .with_title("Error RESOURCE NOT FOUND") - .using_template("error") - .add_to("content", error_content) - .render() - { - write!(f, "{}", page.into_string()) - } else { - write!(f, "Not Found") - } - }, + // Error 304. + FatalError::NotModified => write!(f, "Not Modified"), + // Error 400. + FatalError::BadRequest => write!(f, "Bad Client Data"), + // Error 403. FatalError::AccessDenied => { let mut error_page = Page::new(); let error_content = error_page.context().theme().error_403_access_denied(); if let Ok(page) = error_page .with_title("Error FORBIDDEN") .using_template("error") - .add_to("content", error_content) + .add_to("region-content", error_content) .render() { write!(f, "{}", page.into_string()) @@ -44,9 +37,27 @@ impl fmt::Display for FatalError { write!(f, "Access Denied") } }, + // Error 404. + FatalError::NotFound => { + let mut error_page = Page::new(); + let error_content = error_page.context().theme().error_404_not_found(); + if let Ok(page) = error_page + .with_title("Error RESOURCE NOT FOUND") + .using_template("error") + .add_to("region-content", error_content) + .render() + { + write!(f, "{}", page.into_string()) + } else { + write!(f, "Not Found") + } + }, + // Error 412. + FatalError::PreconditionFailed => write!(f, "Precondition Failed"), + // Error 500. FatalError::InternalError => write!(f, "Internal Error"), - FatalError::BadClientData => write!(f, "Bad Client Data"), - FatalError::Timeout => write!(f, "Timeout"), + // Error 504. + FatalError::Timeout => write!(f, "Timeout"), } } } @@ -60,11 +71,13 @@ impl ResponseError for FatalError { fn status_code(&self) -> StatusCode { match *self { - FatalError::NotFound => StatusCode::NOT_FOUND, - FatalError::AccessDenied => StatusCode::FORBIDDEN, - FatalError::InternalError => StatusCode::INTERNAL_SERVER_ERROR, - FatalError::BadClientData => StatusCode::BAD_REQUEST, - FatalError::Timeout => StatusCode::GATEWAY_TIMEOUT, + FatalError::NotModified => StatusCode::NOT_MODIFIED, + FatalError::BadRequest => StatusCode::BAD_REQUEST, + FatalError::AccessDenied => StatusCode::FORBIDDEN, + FatalError::NotFound => StatusCode::NOT_FOUND, + FatalError::PreconditionFailed => StatusCode::PRECONDITION_FAILED, + FatalError::InternalError => StatusCode::INTERNAL_SERVER_ERROR, + FatalError::Timeout => StatusCode::GATEWAY_TIMEOUT, } } } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index b0512501..c8635dcf 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -30,11 +30,11 @@ async fn demo() -> ResultPage<Markup, FatalError> { .with_context(InContextOp::StyleSheet(AssetsOp::Add(StyleSheet::located( "/theme/module/homepage/styles.css", )))) - .add_to("content", hello_world()) - .add_to("content", welcome()) - .add_to("content", about_pagetop()) - .add_to("content", promo_pagetop()) - .add_to("content", reporting_problems()) + .add_to("region-content", hello_world()) + .add_to("region-content", welcome()) + .add_to("region-content", about_pagetop()) + .add_to("region-content", promo_pagetop()) + .add_to("region-content", reporting_problems()) .render() } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 16cdef6c..a1fc70e6 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -63,16 +63,12 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { body class=[page.body_classes().get()] { @match page.template() { "admin" => { - @for region in &["top-menu", "side-menu", "content"] { - #(region) { - (page.render_region(region)) - } - } + (page.render_region("top-menu")) + (page.render_region("side-menu")) + (page.render_region("region-content")) }, _ => { - #content { - (page.render_region("content")) - } + (page.render_region("region-content")) } } } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 35943793..cb6034ef 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -2,7 +2,7 @@ pub use maud::{html, Markup, PreEscaped, DOCTYPE}; mod assets; pub use assets::javascript::{JSMode, JavaScript}; -pub use assets::stylesheet::StyleSheet; +pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::{Assets, AssetsOp, SourceValue}; mod favicon; diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 893e8c66..0000aff9 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,10 +1,13 @@ use super::{AssetsTrait, SourceValue}; use crate::html::{html, Markup}; +pub enum TargetMedia {Default, Print, Screen, Speech} + pub struct StyleSheet { source : SourceValue, prefix : &'static str, version: &'static str, + media : Option<&'static str>, weight : isize, } @@ -21,7 +24,8 @@ impl AssetsTrait for StyleSheet { html! { link rel="stylesheet" - href=(crate::concat_string!(self.source, self.prefix, self.version)); + href=(crate::concat_string!(self.source, self.prefix, self.version)) + media=[self.media]; } } } @@ -32,6 +36,7 @@ impl StyleSheet { source, prefix : "", version: "", + media : None, weight : 0, } } @@ -49,4 +54,14 @@ impl StyleSheet { self.weight = weight; self } + + pub fn for_media(mut self, media: TargetMedia) -> Self { + self.media = match media { + TargetMedia::Print => Some("print"), + TargetMedia::Screen => Some("screen"), + TargetMedia::Speech => Some("speech"), + _ => None, + }; + self + } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 3ad1f27c..20fa3e9d 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -17,7 +17,7 @@ pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::app; pub use crate::app::application::Application; pub use crate::app::fatal_error::FatalError; -pub use crate::app::AppTrait; +pub use crate::app::{AppTrait, HttpMessage}; pub use crate::core::{component::*, hook::*, module::*, theme::*}; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index bbd00059..8f91b394 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -219,7 +219,11 @@ impl Page { pub fn render_region(&mut self, region: &str) -> Markup { match self.regions.get_mut(region) { - Some(components) => components.render(&mut self.context), + Some(components) => html! { + #(region) { + (components.render(&mut self.context)) + } + }, None => html! {}, } } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index a9a6b052..fed318be 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -23,10 +23,13 @@ macro_rules! theme_static_files { ( $cfg:ident, $dir:expr ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service(actix_web_static_files::ResourceFiles::new($dir, generate())); + $cfg.service($crate::app::ResourceFiles::new($dir, generate())); } else { $cfg.service( - actix_files::Files::new($dir, &[static_files, $dir].join("")).show_files_listing(), + $crate::app::ActixFiles::new( + $dir, $crate::concat_string!(static_files, $dir) + ) + .show_files_listing(), ); } }}; From 396f9df5ee75e0ed4eebc77d8a9e7dfda880830a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Jul 2022 16:14:50 +0200 Subject: [PATCH 146/853] =?UTF-8?q?A=C3=B1ade=20gu=C3=ADa=20de=20mdBook=20?= =?UTF-8?q?como=20referencia=20para=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- website/Cargo.toml | 5 + website/build.rs | 17 + website/doc/book.toml | 9 + website/doc/src/404.md | 3 + website/doc/src/README.md | 41 ++ website/doc/src/SUMMARY.md | 43 ++ website/doc/src/cli/README.md | 14 + website/doc/src/cli/build.md | 40 ++ website/doc/src/cli/clean.md | 30 + website/doc/src/cli/completions.md | 16 + website/doc/src/cli/init.md | 70 ++ website/doc/src/cli/serve.md | 56 ++ website/doc/src/cli/test.md | 63 ++ website/doc/src/cli/watch.md | 40 ++ website/doc/src/continuous-integration.md | 121 ++++ website/doc/src/for_developers/README.md | 47 ++ website/doc/src/for_developers/backends.md | 346 +++++++++ .../mdbook-wordcount/Cargo.toml | 9 + .../mdbook-wordcount/src/main.rs | 49 ++ .../doc/src/for_developers/preprocessors.md | 134 ++++ website/doc/src/format/README.md | 8 + .../doc/src/format/configuration/README.md | 12 + .../configuration/environment-variables.md | 38 + .../doc/src/format/configuration/general.md | 110 +++ .../src/format/configuration/preprocessors.md | 87 +++ .../doc/src/format/configuration/renderers.md | 299 ++++++++ website/doc/src/format/example.rs | 6 + .../doc/src/format/images/rust-logo-blk.svg | 1 + website/doc/src/format/markdown.md | 222 ++++++ website/doc/src/format/mathjax.md | 43 ++ website/doc/src/format/mdbook.md | 276 +++++++ website/doc/src/format/summary.md | 99 +++ website/doc/src/format/theme/README.md | 50 ++ website/doc/src/format/theme/editor.md | 48 ++ website/doc/src/format/theme/index-hbs.md | 101 +++ .../src/format/theme/syntax-highlighting.md | 121 ++++ website/doc/src/guide/README.md | 7 + website/doc/src/guide/creating.md | 109 +++ website/doc/src/guide/installation.md | 52 ++ website/doc/src/guide/reading.md | 74 ++ website/doc/src/misc/contributors.md | 24 + website/doc/theme/book.js | 679 ++++++++++++++++++ website/doc/theme/css/chrome.css | 534 ++++++++++++++ website/doc/theme/css/general.css | 191 +++++ website/doc/theme/css/print.css | 54 ++ website/doc/theme/css/variables.css | 253 +++++++ website/doc/theme/favicon.png | Bin 0 -> 5679 bytes website/doc/theme/favicon.svg | 22 + website/doc/theme/highlight.css | 82 +++ website/doc/theme/highlight.js | 6 + website/doc/theme/index.hbs | 254 +++++++ website/examples/nop-preprocessor.rs | 104 +++ website/src/main.rs | 8 +- website/src/mdbook.rs | 153 ++++ 55 files changed, 5280 insertions(+), 2 deletions(-) create mode 100644 website/build.rs create mode 100644 website/doc/book.toml create mode 100644 website/doc/src/404.md create mode 100644 website/doc/src/README.md create mode 100644 website/doc/src/SUMMARY.md create mode 100644 website/doc/src/cli/README.md create mode 100644 website/doc/src/cli/build.md create mode 100644 website/doc/src/cli/clean.md create mode 100644 website/doc/src/cli/completions.md create mode 100644 website/doc/src/cli/init.md create mode 100644 website/doc/src/cli/serve.md create mode 100644 website/doc/src/cli/test.md create mode 100644 website/doc/src/cli/watch.md create mode 100644 website/doc/src/continuous-integration.md create mode 100644 website/doc/src/for_developers/README.md create mode 100644 website/doc/src/for_developers/backends.md create mode 100644 website/doc/src/for_developers/mdbook-wordcount/Cargo.toml create mode 100644 website/doc/src/for_developers/mdbook-wordcount/src/main.rs create mode 100644 website/doc/src/for_developers/preprocessors.md create mode 100644 website/doc/src/format/README.md create mode 100644 website/doc/src/format/configuration/README.md create mode 100644 website/doc/src/format/configuration/environment-variables.md create mode 100644 website/doc/src/format/configuration/general.md create mode 100644 website/doc/src/format/configuration/preprocessors.md create mode 100644 website/doc/src/format/configuration/renderers.md create mode 100644 website/doc/src/format/example.rs create mode 100644 website/doc/src/format/images/rust-logo-blk.svg create mode 100644 website/doc/src/format/markdown.md create mode 100644 website/doc/src/format/mathjax.md create mode 100644 website/doc/src/format/mdbook.md create mode 100644 website/doc/src/format/summary.md create mode 100644 website/doc/src/format/theme/README.md create mode 100644 website/doc/src/format/theme/editor.md create mode 100644 website/doc/src/format/theme/index-hbs.md create mode 100644 website/doc/src/format/theme/syntax-highlighting.md create mode 100644 website/doc/src/guide/README.md create mode 100644 website/doc/src/guide/creating.md create mode 100644 website/doc/src/guide/installation.md create mode 100644 website/doc/src/guide/reading.md create mode 100644 website/doc/src/misc/contributors.md create mode 100644 website/doc/theme/book.js create mode 100644 website/doc/theme/css/chrome.css create mode 100644 website/doc/theme/css/general.css create mode 100644 website/doc/theme/css/print.css create mode 100644 website/doc/theme/css/variables.css create mode 100644 website/doc/theme/favicon.png create mode 100644 website/doc/theme/favicon.svg create mode 100644 website/doc/theme/highlight.css create mode 100644 website/doc/theme/highlight.js create mode 100644 website/doc/theme/index.hbs create mode 100644 website/examples/nop-preprocessor.rs create mode 100644 website/src/mdbook.rs diff --git a/.gitignore b/.gitignore index cd08f2d1..a7ab8d0b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,6 @@ Cargo.lock website/website - +website/static/doc .sitecopy workdir diff --git a/website/Cargo.toml b/website/Cargo.toml index 3ca2163a..cac77481 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -18,3 +18,8 @@ path = "../pagetop" [dependencies] actix-web = "4.1.0" +static-files = "0.2.3" +maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } + +[build-dependencies] +static-files = "0.2.3" diff --git a/website/build.rs b/website/build.rs new file mode 100644 index 00000000..200d195b --- /dev/null +++ b/website/build.rs @@ -0,0 +1,17 @@ +use static_files::resource_dir; + +use std::env; +use std::path::Path; + +fn main() -> std::io::Result<()> { + build_resource_dir("./static/doc", "mdbook") +} + +fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { + let mut resource = resource_dir(dir); + resource.with_generated_filename( + Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), + ); + resource.with_module_name(format!("resources_{}", name)); + resource.build() +} diff --git a/website/doc/book.toml b/website/doc/book.toml new file mode 100644 index 00000000..31213b48 --- /dev/null +++ b/website/doc/book.toml @@ -0,0 +1,9 @@ +[book] +authors = ["Manuel Cillero"] +language = "en" +multilingual = false +src = "src" +title = "PageTop Guide" + +[build] +build-dir = "../static/doc" diff --git a/website/doc/src/404.md b/website/doc/src/404.md new file mode 100644 index 00000000..a55db44e --- /dev/null +++ b/website/doc/src/404.md @@ -0,0 +1,3 @@ +# Document not found (404) + +This URL is invalid, sorry. Try the search instead! \ No newline at end of file diff --git a/website/doc/src/README.md b/website/doc/src/README.md new file mode 100644 index 00000000..a3aeb68d --- /dev/null +++ b/website/doc/src/README.md @@ -0,0 +1,41 @@ +# Introduction + +**mdBook** is a command line tool to create books with Markdown. +It is ideal for creating product or API documentation, tutorials, course materials or anything that requires a clean, +easily navigable and customizable presentation. + +* Lightweight [Markdown] syntax helps you focus more on your content +* Integrated [search] support +* Color [syntax highlighting] for code blocks for many different languages +* [Theme] files allow customizing the formatting of the output +* [Preprocessors] can provide extensions for custom syntax and modifying content +* [Backends] can render the output to multiple formats +* Written in [Rust] for speed, safety, and simplicity +* Automated testing of [Rust code samples] + +This guide is an example of what mdBook produces. +mdBook is used by the Rust programming language project, and [The Rust Programming Language][trpl] book is another fine example of mdBook in action. + +[Markdown]: format/markdown.md +[search]: guide/reading.md#search +[syntax highlighting]: format/theme/syntax-highlighting.md +[theme]: format/theme/index.html +[preprocessors]: format/configuration/preprocessors.md +[backends]: format/configuration/renderers.md +[Rust]: https://www.rust-lang.org/ +[trpl]: https://doc.rust-lang.org/book/ +[Rust code samples]: cli/test.md + +## Contributing + +mdBook is free and open source. You can find the source code on +[GitHub](https://github.com/rust-lang/mdBook) and issues and feature requests can be posted on +the [GitHub issue tracker](https://github.com/rust-lang/mdBook/issues). mdBook relies on the community to fix bugs and +add features: if you'd like to contribute, please read +the [CONTRIBUTING](https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md) guide and consider opening +a [pull request](https://github.com/rust-lang/mdBook/pulls). + +## License + +The mdBook source and documentation are released under +the [Mozilla Public License v2.0](https://www.mozilla.org/MPL/2.0/). diff --git a/website/doc/src/SUMMARY.md b/website/doc/src/SUMMARY.md new file mode 100644 index 00000000..974d65fa --- /dev/null +++ b/website/doc/src/SUMMARY.md @@ -0,0 +1,43 @@ +# Summary + +[Introduction](README.md) + +# User Guide + +- [Installation](guide/installation.md) +- [Reading Books](guide/reading.md) +- [Creating a Book](guide/creating.md) + +# Reference Guide + +- [Command Line Tool](cli/README.md) + - [init](cli/init.md) + - [build](cli/build.md) + - [watch](cli/watch.md) + - [serve](cli/serve.md) + - [test](cli/test.md) + - [clean](cli/clean.md) + - [completions](cli/completions.md) +- [Format](format/README.md) + - [SUMMARY.md](format/summary.md) + - [Draft chapter]() + - [Configuration](format/configuration/README.md) + - [General](format/configuration/general.md) + - [Preprocessors](format/configuration/preprocessors.md) + - [Renderers](format/configuration/renderers.md) + - [Environment Variables](format/configuration/environment-variables.md) + - [Theme](format/theme/README.md) + - [index.hbs](format/theme/index-hbs.md) + - [Syntax highlighting](format/theme/syntax-highlighting.md) + - [Editor](format/theme/editor.md) + - [MathJax Support](format/mathjax.md) + - [mdBook-specific features](format/mdbook.md) + - [Markdown](format/markdown.md) +- [Continuous Integration](continuous-integration.md) +- [For Developers](for_developers/README.md) + - [Preprocessors](for_developers/preprocessors.md) + - [Alternative Backends](for_developers/backends.md) + +----------- + +[Contributors](misc/contributors.md) diff --git a/website/doc/src/cli/README.md b/website/doc/src/cli/README.md new file mode 100644 index 00000000..2fbe3781 --- /dev/null +++ b/website/doc/src/cli/README.md @@ -0,0 +1,14 @@ +# Command Line Tool + +The `mdbook` command-line tool is used to create and build books. +After you have [installed](../guide/installation.md) `mdbook`, you can run the `mdbook help` command in your terminal to view the available commands. + +This following sections provide in-depth information on the different commands available. + +* [`mdbook init <directory>`](init.md) — Creates a new book with minimal boilerplate to start with. +* [`mdbook build`](build.md) — Renders the book. +* [`mdbook watch`](watch.md) — Rebuilds the book any time a source file changes. +* [`mdbook serve`](serve.md) — Runs a web server to view the book, and rebuilds on changes. +* [`mdbook test`](test.md) — Tests Rust code samples. +* [`mdbook clean`](clean.md) — Deletes the rendered output. +* [`mdbook completions`](completions.md) — Support for shell auto-completion. diff --git a/website/doc/src/cli/build.md b/website/doc/src/cli/build.md new file mode 100644 index 00000000..71f1c48c --- /dev/null +++ b/website/doc/src/cli/build.md @@ -0,0 +1,40 @@ +# The build command + +The build command is used to render your book: + +```bash +mdbook build +``` + +It will try to parse your `SUMMARY.md` file to understand the structure of your +book and fetch the corresponding files. Note that files mentioned in `SUMMARY.md` +but not present will be created. + +The rendered output will maintain the same directory structure as the source for +convenience. Large books will therefore remain structured when rendered. + +#### Specify a directory + +The `build` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook build path/to/book +``` + +#### --open + +When you use the `--open` (`-o`) flag, mdbook will open the rendered book in +your default web browser after building it. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. + +------------------- + +***Note:*** *The build command copies all files (excluding files with `.md` extension) from the source directory +into the build directory.* diff --git a/website/doc/src/cli/clean.md b/website/doc/src/cli/clean.md new file mode 100644 index 00000000..23efc450 --- /dev/null +++ b/website/doc/src/cli/clean.md @@ -0,0 +1,30 @@ +# The clean command + +The clean command is used to delete the generated book and any other build +artifacts. + +```bash +mdbook clean +``` + +#### Specify a directory + +The `clean` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook clean path/to/book +``` + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to override the book's output +directory, which will be deleted by this command. Relative paths are interpreted +relative to the book's root directory. If not specified it will default to the +value of the `build.build-dir` key in `book.toml`, or to `./book`. + +```bash +mdbook clean --dest-dir=path/to/book +``` + +`path/to/book` could be absolute or relative. \ No newline at end of file diff --git a/website/doc/src/cli/completions.md b/website/doc/src/cli/completions.md new file mode 100644 index 00000000..1246b1ee --- /dev/null +++ b/website/doc/src/cli/completions.md @@ -0,0 +1,16 @@ +# The completions command + +The completions command is used to generate auto-completions for some common shells. +This means when you type `mdbook` in your shell, you can then press your shell's auto-complete key (usually the Tab key) and it may display what the valid options are, or finish partial input. + +The completions first need to be installed for your shell: + +```bash +mdbook completions bash > ~/.local/share/bash-completion/completions/mdbook +``` + +The command prints a completion script for the given shell. +Run `mdbook completions --help` for a list of supported shells. + +Where to place the completions depend on which shell you are using and your operating system. +Consult your shell's documentation for more information one where to place the script. diff --git a/website/doc/src/cli/init.md b/website/doc/src/cli/init.md new file mode 100644 index 00000000..99c0be09 --- /dev/null +++ b/website/doc/src/cli/init.md @@ -0,0 +1,70 @@ +# The init command + +There is some minimal boilerplate that is the same for every new book. It's for +this purpose that mdBook includes an `init` command. + +The `init` command is used like this: + +```bash +mdbook init +``` + +When using the `init` command for the first time, a couple of files will be set +up for you: +```bash +book-test/ +├── book +└── src + ├── chapter_1.md + └── SUMMARY.md +``` + +- The `src` directory is where you write your book in markdown. It contains all + the source files, configuration files, etc. + +- The `book` directory is where your book is rendered. All the output is ready + to be uploaded to a server to be seen by your audience. + +- The `SUMMARY.md` is the skeleton of your + book, and is discussed in more detail [in another + chapter](../format/summary.md). + +#### Tip: Generate chapters from SUMMARY.md + +When a `SUMMARY.md` file already exists, the `init` command will first parse it +and generate the missing files according to the paths used in the `SUMMARY.md`. +This allows you to think and create the whole structure of your book and then +let mdBook generate it for you. + +#### Specify a directory + +The `init` command can take a directory as an argument to use as the book's root +instead of the current working directory. + +```bash +mdbook init path/to/book +``` + +#### --theme + +When you use the `--theme` flag, the default theme will be copied into a +directory called `theme` in your source directory so that you can modify it. + +The theme is selectively overwritten, this means that if you don't want to +overwrite a specific file, just delete it and the default file will be used. + +#### --title + +Specify a title for the book. If not supplied, an interactive prompt will ask for +a title. + +```bash +mdbook init --title="my amazing book" +``` + +#### --ignore + +Create a `.gitignore` file configured to ignore the `book` directory created when [building] a book. +If not supplied, an interactive prompt will ask whether it should be created. + +[building]: build.md diff --git a/website/doc/src/cli/serve.md b/website/doc/src/cli/serve.md new file mode 100644 index 00000000..62ea26c2 --- /dev/null +++ b/website/doc/src/cli/serve.md @@ -0,0 +1,56 @@ +# The serve command + +The serve command is used to preview a book by serving it via HTTP at +`localhost:3000` by default: + +```bash +mdbook serve +``` + +The `serve` command watches the book's `src` directory for +changes, rebuilding the book and refreshing clients for each change; this includes +re-creating deleted files still mentioned in `SUMMARY.md`! A websocket +connection is used to trigger the client-side refresh. + +***Note:*** *The `serve` command is for testing a book's HTML output, and is not +intended to be a complete HTTP server for a website.* + +#### Specify a directory + +The `serve` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook serve path/to/book +``` + +### Server options + +The `serve` hostname defaults to `localhost`, and the port defaults to `3000`. Either option can be specified on the command line: + +```bash +mdbook serve path/to/book -p 8000 -n 127.0.0.1 +``` + +#### --open + +When you use the `--open` (`-o`) flag, mdbook will open the book in your +default web browser after starting the server. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. + +#### Specify exclude patterns + +The `serve` command will not automatically trigger a build for files listed in +the `.gitignore` file in the book root directory. The `.gitignore` file may +contain file patterns described in the [gitignore +documentation](https://git-scm.com/docs/gitignore). This can be useful for +ignoring temporary files created by some editors. + +***Note:*** *Only the `.gitignore` from the book root directory is used. Global +`$HOME/.gitignore` or `.gitignore` files in parent directories are not used.* diff --git a/website/doc/src/cli/test.md b/website/doc/src/cli/test.md new file mode 100644 index 00000000..e134dc9b --- /dev/null +++ b/website/doc/src/cli/test.md @@ -0,0 +1,63 @@ +# The test command + +When writing a book, you sometimes need to automate some tests. For example, +[The Rust Programming Book](https://doc.rust-lang.org/stable/book/) uses a lot +of code examples that could get outdated. Therefore it is very important for +them to be able to automatically test these code examples. + +mdBook supports a `test` command that will run all available tests in a book. At +the moment, only rustdoc tests are supported, but this may be expanded upon in +the future. + +#### Disable tests on a code block + +rustdoc doesn't test code blocks which contain the `ignore` attribute: + + ```rust,ignore + fn main() {} + ``` + +rustdoc also doesn't test code blocks which specify a language other than Rust: + + ```markdown + **Foo**: _bar_ + ``` + +rustdoc *does* test code blocks which have no language specified: + + ``` + This is going to cause an error! + ``` + +#### Specify a directory + +The `test` command can take a directory as an argument to use as the book's root +instead of the current working directory. + +```bash +mdbook test path/to/book +``` + +#### --library-path + +The `--library-path` (`-L`) option allows you to add directories to the library +search path used by `rustdoc` when it builds and tests the examples. Multiple +directories can be specified with multiple options (`-L foo -L bar`) or with a +comma-delimited list (`-L foo,bar`). The path should point to the Cargo +[build cache](https://doc.rust-lang.org/cargo/guide/build-cache.html) `deps` directory that +contains the build output of your project. For example, if your Rust project's book is in a directory +named `my-book`, the following command would include the crate's dependencies when running `test`: + +```shell +mdbook test my-book -L target/debug/deps/ +``` + +See the `rustdoc` command-line [documentation](https://doc.rust-lang.org/rustdoc/command-line-arguments.html#-l--library-path-where-to-look-for-dependencies) +for more information. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. diff --git a/website/doc/src/cli/watch.md b/website/doc/src/cli/watch.md new file mode 100644 index 00000000..3522f43c --- /dev/null +++ b/website/doc/src/cli/watch.md @@ -0,0 +1,40 @@ +# The watch command + +The `watch` command is useful when you want your book to be rendered on every +file change. You could repeatedly issue `mdbook build` every time a file is +changed. But using `mdbook watch` once will watch your files and will trigger a +build automatically whenever you modify a file; this includes re-creating +deleted files still mentioned in `SUMMARY.md`! + +#### Specify a directory + +The `watch` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook watch path/to/book +``` + +#### --open + +When you use the `--open` (`-o`) option, mdbook will open the rendered book in +your default web browser. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. + + +#### Specify exclude patterns + +The `watch` command will not automatically trigger a build for files listed in +the `.gitignore` file in the book root directory. The `.gitignore` file may +contain file patterns described in the [gitignore +documentation](https://git-scm.com/docs/gitignore). This can be useful for +ignoring temporary files created by some editors. + +_Note: Only `.gitignore` from book root directory is used. Global +`$HOME/.gitignore` or `.gitignore` files in parent directories are not used._ diff --git a/website/doc/src/continuous-integration.md b/website/doc/src/continuous-integration.md new file mode 100644 index 00000000..c39cb010 --- /dev/null +++ b/website/doc/src/continuous-integration.md @@ -0,0 +1,121 @@ +# Running `mdbook` in Continuous Integration + +There are a variety of services such as [GitHub Actions] or [GitLab CI/CD] which can be used to test and deploy your book automatically. + +The following provides some general guidelines on how to configure your service to run mdBook. +Specific recipes can be found at the [Automated Deployment] wiki page. + +[GitHub Actions]: https://docs.github.com/en/actions +[GitLab CI/CD]: https://docs.gitlab.com/ee/ci/ +[Automated Deployment]: https://github.com/rust-lang/mdBook/wiki/Automated-Deployment + +## Installing mdBook + +There are several different strategies for installing mdBook. +The particular method depends on your needs and preferences. + +### Pre-compiled binaries + +Perhaps the easiest method is to use the pre-compiled binaries found on the [GitHub Releases page][releases]. +A simple approach would be to use the popular `curl` CLI tool to download the executable: + +```sh +mkdir bin +curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.21/mdbook-v0.4.21-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin +bin/mdbook build +``` + +Some considerations for this approach: + +* This is relatively fast, and does not necessarily require dealing with caching. +* This does not require installing Rust. +* Specifying a specific URL means you have to manually update your script to get a new version. + This may be a benefit if you want to lock to a specific version. + However, some users prefer to automatically get a newer version when they are published. +* You are reliant on the GitHub CDN being available. + +[releases]: https://github.com/rust-lang/mdBook/releases + +### Building from source + +Building from source will require having Rust installed. +Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. + +After Rust is installed, `cargo install` can be used to build and install mdBook. +We recommend using a SemVer version specifier so that you get the latest **non-breaking** version of mdBook. +For example: + +```sh +cargo install mdbook --no-default-features --features search --vers "^0.4" --locked +``` + +This includes several recommended options: + +* `--no-default-features` — Disables features like the HTTP server used by `mdbook serve` that is likely not needed on CI. + This will speed up the build time significantly. +* `--features search` — Disabling default features means you should then manually enable features that you want, such as the built-in [search] capability. +* `--vers "^0.4"` — This will install the most recent version of the `0.4` series. + However, versions after like `0.5.0` won't be installed, as they may break your build. + Cargo will automatically upgrade mdBook if you have an older version already installed. +* `--locked` — This will use the dependencies that were used when mdBook was released. + Without `--locked`, it will use the latest version of all dependencies, which may include some fixes since the last release, but may also (rarely) cause build problems. + +You will likely want to investigate caching options, as building mdBook can be somewhat slow. + +[search]: guide/reading.md#search + +## Running tests + +You may want to run tests using [`mdbook test`] every time you push a change or create a pull request. +This can be used to validate Rust code examples in the book. + +This will require having Rust installed. +Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. + +Other than making sure the appropriate version of Rust is installed, there's not much more than just running `mdbook test` from the book directory. + +You may also want to consider running other kinds of tests, like [mdbook-linkcheck] which will check for broken links. +Or if you have your own style checks, spell checker, or any other tests it might be good to run them in CI. + +[`mdbook test`]: cli/test.md +[mdbook-linkcheck]: https://github.com/Michael-F-Bryan/mdbook-linkcheck#continuous-integration + +## Deploying + +You may want to automatically deploy your book. +Some may want to do this with every time a change is pushed, and others may want to only deploy when a specific release is tagged. + +You'll also need to understand the specifics on how to push a change to your web service. +For example, [GitHub Pages] just requires committing the output onto a specific git branch. +Other services may require using something like SSH to connect to a remote server. + +The basic outline is that you need to run `mdbook build` to generate the output, and then transfer the files (which are in the `book` directory) to the correct location. + +You may then want to consider if you need to invalidate any caches on your web service. + +See the [Automated Deployment] wiki page for examples of various different services. + +[GitHub Pages]: https://docs.github.com/en/pages + +### 404 handling + +mdBook automatically generates a 404 page to be used for broken links. +The default output is a file named `404.html` at the root of the book. +Some services like [GitHub Pages] will automatically use this page for broken links. +For other services, you may want to consider configuring the web server to use this page as it will provide the reader navigation to get back to the book. + +If your book is not deployed at the root of the domain, then you should set the [`output.html.site-url`] setting so that the 404 page works correctly. +It needs to know where the book is deployed in order to load the static files (like CSS) correctly. +For example, this guide is deployed at <https://rust-lang.github.io/mdBook/>, and the `site-url` setting is configured like this: + +```toml +# book.toml +[output.html] +site-url = "/mdBook/" +``` + +You can customize the look of the 404 page by creating a file named `src/404.md` in your book. +If you want to use a different filename, you can set [`output.html.input-404`] to a different filename. + +[`output.html.site-url`]: format/configuration/renderers.md#html-renderer-options +[`output.html.input-404`]: format/configuration/renderers.md#html-renderer-options diff --git a/website/doc/src/for_developers/README.md b/website/doc/src/for_developers/README.md new file mode 100644 index 00000000..d8b97709 --- /dev/null +++ b/website/doc/src/for_developers/README.md @@ -0,0 +1,47 @@ +# For Developers + +While `mdbook` is mainly used as a command line tool, you can also import the +underlying library directly and use that to manage a book. It also has a fairly +flexible plugin mechanism, allowing you to create your own custom tooling and +consumers (often referred to as *backends*) if you need to do some analysis of +the book or render it in a different format. + +The *For Developers* chapters are here to show you the more advanced usage of +`mdbook`. + +The two main ways a developer can hook into the book's build process is via, + +- [Preprocessors](preprocessors.md) +- [Alternative Backends](backends.md) + + +## The Build Process + +The process of rendering a book project goes through several steps. + +1. Load the book + - Parse the `book.toml`, falling back to the default `Config` if it doesn't + exist + - Load the book chapters into memory + - Discover which preprocessors/backends should be used +2. For each backend: + 1. Run all the preprocessors. + 2. Call the backend to render the processed result. + + +## Using `mdbook` as a Library + +The `mdbook` binary is just a wrapper around the `mdbook` crate, exposing its +functionality as a command-line program. As such it is quite easy to create your +own programs which use `mdbook` internally, adding your own functionality (e.g. +a custom preprocessor) or tweaking the build process. + +The easiest way to find out how to use the `mdbook` crate is by looking at the +[API Docs]. The top level documentation explains how one would use the +[`MDBook`] type to load and build a book, while the [config] module gives a good +explanation on the configuration system. + + +[`MDBook`]: https://docs.rs/mdbook/*/mdbook/book/struct.MDBook.html +[API Docs]: https://docs.rs/mdbook/*/mdbook/ +[config]: https://docs.rs/mdbook/*/mdbook/config/index.html diff --git a/website/doc/src/for_developers/backends.md b/website/doc/src/for_developers/backends.md new file mode 100644 index 00000000..78326a36 --- /dev/null +++ b/website/doc/src/for_developers/backends.md @@ -0,0 +1,346 @@ +# Alternative Backends + +A "backend" is simply a program which `mdbook` will invoke during the book +rendering process. This program is passed a JSON representation of the book and +configuration information via `stdin`. Once the backend receives this +information it is free to do whatever it wants. + +See [Configuring Renderers](../format/configuration/renderers.md) for more information about using backends. + +The community has developed several backends. +See the [Third Party Plugins] wiki page for a list of available backends. + +## Setting Up + +This page will step you through creating your own alternative backend in the form +of a simple word counting program. Although it will be written in Rust, there's +no reason why it couldn't be accomplished using something like Python or Ruby. + +First you'll want to create a new binary program and add `mdbook` as a +dependency. + +```shell +$ cargo new --bin mdbook-wordcount +$ cd mdbook-wordcount +$ cargo add mdbook +``` + +When our `mdbook-wordcount` plugin is invoked, `mdbook` will send it a JSON +version of [`RenderContext`] via our plugin's `stdin`. For convenience, there's +a [`RenderContext::from_json()`] constructor which will load a `RenderContext`. + +This is all the boilerplate necessary for our backend to load the book. + +```rust +// src/main.rs +extern crate mdbook; + +use std::io; +use mdbook::renderer::RenderContext; + +fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); +} +``` + +> **Note:** The `RenderContext` contains a `version` field. This lets backends + figure out whether they are compatible with the version of `mdbook` it's being + called by. This `version` comes directly from the corresponding field in + `mdbook`'s `Cargo.toml`. + + It is recommended that backends use the [`semver`] crate to inspect this field + and emit a warning if there may be a compatibility issue. + + +## Inspecting the Book + +Now our backend has a copy of the book, lets count how many words are in each +chapter! + +Because the `RenderContext` contains a [`Book`] field (`book`), and a `Book` has +the [`Book::iter()`] method for iterating over all items in a `Book`, this step +turns out to be just as easy as the first. + +```rust + +fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + } + } +} + +fn count_words(ch: &Chapter) -> usize { + ch.content.split_whitespace().count() +} +``` + + +## Enabling the Backend + +Now we've got the basics running, we want to actually use it. First, install the +program. + +```shell +$ cargo install --path . +``` + +Then `cd` to the particular book you'd like to count the words of and update its +`book.toml` file. + +```diff + [book] + title = "mdBook Documentation" + description = "Create book from markdown files. Like Gitbook but implemented in Rust" + authors = ["Mathieu David", "Michael-F-Bryan"] + ++ [output.html] + ++ [output.wordcount] +``` + +When it loads a book into memory, `mdbook` will inspect your `book.toml` file to +try and figure out which backends to use by looking for all `output.*` tables. +If none are provided it'll fall back to using the default HTML renderer. + +Notably, this means if you want to add your own custom backend you'll also need +to make sure to add the HTML backend, even if its table just stays empty. + +Now you just need to build your book like normal, and everything should *Just +Work*. + +```shell +$ mdbook build +... +2018-01-16 07:31:15 [INFO] (mdbook::renderer): Invoking the "mdbook-wordcount" renderer +mdBook: 126 +Command Line Tool: 224 +init: 283 +build: 145 +watch: 146 +serve: 292 +test: 139 +Format: 30 +SUMMARY.md: 259 +Configuration: 784 +Theme: 304 +index.hbs: 447 +Syntax highlighting: 314 +MathJax Support: 153 +Rust code specific features: 148 +For Developers: 788 +Alternative Backends: 710 +Contributors: 85 +``` + +The reason we didn't need to specify the full name/path of our `wordcount` +backend is because `mdbook` will try to *infer* the program's name via +convention. The executable for the `foo` backend is typically called +`mdbook-foo`, with an associated `[output.foo]` entry in the `book.toml`. To +explicitly tell `mdbook` what command to invoke (it may require command-line +arguments or be an interpreted script), you can use the `command` field. + +```diff + [book] + title = "mdBook Documentation" + description = "Create book from markdown files. Like Gitbook but implemented in Rust" + authors = ["Mathieu David", "Michael-F-Bryan"] + + [output.html] + + [output.wordcount] ++ command = "python /path/to/wordcount.py" +``` + + +## Configuration + +Now imagine you don't want to count the number of words on a particular chapter +(it might be generated text/code, etc). The canonical way to do this is via the +usual `book.toml` configuration file by adding items to your `[output.foo]` +table. + +The `Config` can be treated roughly as a nested hashmap which lets you call +methods like `get()` to access the config's contents, with a +`get_deserialized()` convenience method for retrieving a value and automatically +deserializing to some arbitrary type `T`. + +To implement this, we'll create our own serializable `WordcountConfig` struct +which will encapsulate all configuration for this backend. + +First add `serde` and `serde_derive` to your `Cargo.toml`, + +``` +$ cargo add serde serde_derive +``` + +And then you can create the config struct, + +```rust +extern crate serde; +#[macro_use] +extern crate serde_derive; + +... + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(default, rename_all = "kebab-case")] +pub struct WordcountConfig { + pub ignores: Vec<String>, +} +``` + +Now we just need to deserialize the `WordcountConfig` from our `RenderContext` +and then add a check to make sure we skip ignored chapters. + +```diff + fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); ++ let cfg: WordcountConfig = ctx.config ++ .get_deserialized("output.wordcount") ++ .unwrap_or_default(); + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { ++ if cfg.ignores.contains(&ch.name) { ++ continue; ++ } ++ + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + } + } + } +``` + + +## Output and Signalling Failure + +While it's nice to print word counts to the terminal when a book is built, it +might also be a good idea to output them to a file somewhere. `mdbook` tells a +backend where it should place any generated output via the `destination` field +in [`RenderContext`]. + +```diff ++ use std::fs::{self, File}; ++ use std::io::{self, Write}; +- use std::io; + use mdbook::renderer::RenderContext; + use mdbook::book::{BookItem, Chapter}; + + fn main() { + ... + ++ let _ = fs::create_dir_all(&ctx.destination); ++ let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); ++ + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + ... + + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); ++ writeln!(f, "{}: {}", ch.name, num_words).unwrap(); + } + } + } +``` + +> **Note:** There is no guarantee that the destination directory exists or is +> empty (`mdbook` may leave the previous contents to let backends do caching), +> so it's always a good idea to create it with `fs::create_dir_all()`. +> +> If the destination directory already exists, don't assume it will be empty. +> To allow backends to cache the results from previous runs, `mdbook` may leave +> old content in the directory. + +There's always the possibility that an error will occur while processing a book +(just look at all the `unwrap()`'s we've written already), so `mdbook` will +interpret a non-zero exit code as a rendering failure. + +For example, if we wanted to make sure all chapters have an *even* number of +words, erroring out if an odd number is encountered, then you may do something +like this: + +```diff ++ use std::process; + ... + + fn main() { + ... + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + ... + + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + writeln!(f, "{}: {}", ch.name, num_words).unwrap(); + ++ if cfg.deny_odds && num_words % 2 == 1 { ++ eprintln!("{} has an odd number of words!", ch.name); ++ process::exit(1); + } + } + } + } + + #[derive(Debug, Default, Serialize, Deserialize)] + #[serde(default, rename_all = "kebab-case")] + pub struct WordcountConfig { + pub ignores: Vec<String>, ++ pub deny_odds: bool, + } +``` + +Now, if we reinstall the backend and build a book, + +```shell +$ cargo install --path . --force +$ mdbook build /path/to/book +... +2018-01-16 21:21:39 [INFO] (mdbook::renderer): Invoking the "wordcount" renderer +mdBook: 126 +Command Line Tool: 224 +init: 283 +init has an odd number of words! +2018-01-16 21:21:39 [ERROR] (mdbook::renderer): Renderer exited with non-zero return code. +2018-01-16 21:21:39 [ERROR] (mdbook::utils): Error: Rendering failed +2018-01-16 21:21:39 [ERROR] (mdbook::utils): Caused By: The "mdbook-wordcount" renderer failed +``` + +As you've probably already noticed, output from the plugin's subprocess is +immediately passed through to the user. It is encouraged for plugins to follow +the "rule of silence" and only generate output when necessary (e.g. an error in +generation or a warning). + +All environment variables are passed through to the backend, allowing you to use +the usual `RUST_LOG` to control logging verbosity. + +## Wrapping Up + +Although contrived, hopefully this example was enough to show how you'd create +an alternative backend for `mdbook`. If you feel it's missing something, don't +hesitate to create an issue in the [issue tracker] so we can improve the user +guide. + +The existing backends mentioned towards the start of this chapter should serve +as a good example of how it's done in real life, so feel free to skim through +the source code or ask questions. + + +[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins +[`RenderContext`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html +[`RenderContext::from_json()`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html#method.from_json +[`semver`]: https://crates.io/crates/semver +[`Book`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html +[`Book::iter()`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html#method.iter +[`Config`]: https://docs.rs/mdbook/*/mdbook/config/struct.Config.html +[issue tracker]: https://github.com/rust-lang/mdBook/issues diff --git a/website/doc/src/for_developers/mdbook-wordcount/Cargo.toml b/website/doc/src/for_developers/mdbook-wordcount/Cargo.toml new file mode 100644 index 00000000..e58e73b6 --- /dev/null +++ b/website/doc/src/for_developers/mdbook-wordcount/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "mdbook-wordcount" +version = "0.1.0" +authors = ["Michael Bryan <michaelfbryan@gmail.com>"] + +[dependencies] +mdbook = { path = "../../../..", version = "*" } +serde = "1.0" +serde_derive = "1.0" diff --git a/website/doc/src/for_developers/mdbook-wordcount/src/main.rs b/website/doc/src/for_developers/mdbook-wordcount/src/main.rs new file mode 100644 index 00000000..607338dd --- /dev/null +++ b/website/doc/src/for_developers/mdbook-wordcount/src/main.rs @@ -0,0 +1,49 @@ +extern crate mdbook; +extern crate serde; +#[macro_use] +extern crate serde_derive; + +use std::process; +use std::fs::{self, File}; +use std::io::{self, Write}; +use mdbook::renderer::RenderContext; +use mdbook::book::{BookItem, Chapter}; + +fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); + let cfg: WordcountConfig = ctx.config + .get_deserialized("output.wordcount") + .unwrap_or_default(); + + let _ = fs::create_dir_all(&ctx.destination); + let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + if cfg.ignores.contains(&ch.name) { + continue; + } + + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + writeln!(f, "{}: {}", ch.name, num_words).unwrap(); + + if cfg.deny_odds && num_words % 2 == 1 { + eprintln!("{} has an odd number of words!", ch.name); + process::exit(1); + } + } + } +} + +fn count_words(ch: &Chapter) -> usize { + ch.content.split_whitespace().count() +} + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(default, rename_all = "kebab-case")] +pub struct WordcountConfig { + pub ignores: Vec<String>, + pub deny_odds: bool, +} diff --git a/website/doc/src/for_developers/preprocessors.md b/website/doc/src/for_developers/preprocessors.md new file mode 100644 index 00000000..1ac46256 --- /dev/null +++ b/website/doc/src/for_developers/preprocessors.md @@ -0,0 +1,134 @@ +# Preprocessors + +A *preprocessor* is simply a bit of code which gets run immediately after the +book is loaded and before it gets rendered, allowing you to update and mutate +the book. Possible use cases are: + +- Creating custom helpers like `\{{#include /path/to/file.md}}` +- Substituting in latex-style expressions (`$$ \frac{1}{3} $$`) with their + mathjax equivalents + +See [Configuring Preprocessors](../format/configuration/preprocessors.md) for more information about using preprocessors. + +## Hooking Into MDBook + +MDBook uses a fairly simple mechanism for discovering third party plugins. +A new table is added to `book.toml` (e.g. `[preprocessor.foo]` for the `foo` +preprocessor) and then `mdbook` will try to invoke the `mdbook-foo` program as +part of the build process. + +Once the preprocessor has been defined and the build process starts, mdBook executes the command defined in the `preprocessor.foo.command` key twice. +The first time it runs the preprocessor to determine if it supports the given renderer. +mdBook passes two arguments to the process: the first argument is the string `supports` and the second argument is the renderer name. +The preprocessor should exit with a status code 0 if it supports the given renderer, or return a non-zero exit code if it does not. + +If the preprocessor supports the renderer, then mdbook runs it a second time, passing JSON data into stdin. +The JSON consists of an array of `[context, book]` where `context` is the serialized object [`PreprocessorContext`] and `book` is a [`Book`] object containing the content of the book. + +The preprocessor should return the JSON format of the [`Book`] object to stdout, with any modifications it wishes to perform. + +The easiest way to get started is by creating your own implementation of the +`Preprocessor` trait (e.g. in `lib.rs`) and then creating a shell binary which +translates inputs to the correct `Preprocessor` method. For convenience, there +is [an example no-op preprocessor] in the `examples/` directory which can easily +be adapted for other preprocessors. + +<details> +<summary>Example no-op preprocessor</summary> + +```rust +// nop-preprocessors.rs + +{{#include ../../../examples/nop-preprocessor.rs}} +``` +</details> + +## Hints For Implementing A Preprocessor + +By pulling in `mdbook` as a library, preprocessors can have access to the +existing infrastructure for dealing with books. + +For example, a custom preprocessor could use the +[`CmdPreprocessor::parse_input()`] function to deserialize the JSON written to +`stdin`. Then each chapter of the `Book` can be mutated in-place via +[`Book::for_each_mut()`], and then written to `stdout` with the `serde_json` +crate. + +Chapters can be accessed either directly (by recursively iterating over +chapters) or via the `Book::for_each_mut()` convenience method. + +The `chapter.content` is just a string which happens to be markdown. While it's +entirely possible to use regular expressions or do a manual find & replace, +you'll probably want to process the input into something more computer-friendly. +The [`pulldown-cmark`][pc] crate implements a production-quality event-based +Markdown parser, with the [`pulldown-cmark-to-cmark`][pctc] crate allowing you to +translate events back into markdown text. + +The following code block shows how to remove all emphasis from markdown, +without accidentally breaking the document. + +```rust +fn remove_emphasis( + num_removed_items: &mut usize, + chapter: &mut Chapter, +) -> Result<String> { + let mut buf = String::with_capacity(chapter.content.len()); + + let events = Parser::new(&chapter.content).filter(|e| { + let should_keep = match *e { + Event::Start(Tag::Emphasis) + | Event::Start(Tag::Strong) + | Event::End(Tag::Emphasis) + | Event::End(Tag::Strong) => false, + _ => true, + }; + if !should_keep { + *num_removed_items += 1; + } + should_keep + }); + + cmark(events, &mut buf, None).map(|_| buf).map_err(|err| { + Error::from(format!("Markdown serialization failed: {}", err)) + }) +} +``` + +For everything else, have a look [at the complete example][example]. + +## Implementing a preprocessor with a different language + +The fact that mdBook utilizes stdin and stdout to communicate with the preprocessors makes it easy to implement them in a language other than Rust. +The following code shows how to implement a simple preprocessor in Python, which will modify the content of the first chapter. +The example below follows the configuration shown above with `preprocessor.foo.command` actually pointing to a Python script. + +```python +import json +import sys + + +if __name__ == '__main__': + if len(sys.argv) > 1: # we check if we received any argument + if sys.argv[1] == "supports": + # then we are good to return an exit status code of 0, since the other argument will just be the renderer's name + sys.exit(0) + + # load both the context and the book representations from stdin + context, book = json.load(sys.stdin) + # and now, we can just modify the content of the first chapter + book['sections'][0]['Chapter']['content'] = '# Hello' + # we are done with the book's modification, we can just print it to stdout, + print(json.dumps(book)) +``` + + + +[preprocessor-docs]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html +[pc]: https://crates.io/crates/pulldown-cmark +[pctc]: https://crates.io/crates/pulldown-cmark-to-cmark +[example]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs +[an example no-op preprocessor]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs +[`CmdPreprocessor::parse_input()`]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html#method.parse_input +[`Book::for_each_mut()`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html#method.for_each_mut +[`PreprocessorContext`]: https://docs.rs/mdbook/latest/mdbook/preprocess/struct.PreprocessorContext.html +[`Book`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html diff --git a/website/doc/src/format/README.md b/website/doc/src/format/README.md new file mode 100644 index 00000000..35757252 --- /dev/null +++ b/website/doc/src/format/README.md @@ -0,0 +1,8 @@ +# Format + +In this section you will learn how to: + +- Structure your book correctly +- Format your `SUMMARY.md` file +- Configure your book using `book.toml` +- Customize your theme diff --git a/website/doc/src/format/configuration/README.md b/website/doc/src/format/configuration/README.md new file mode 100644 index 00000000..4dcb5852 --- /dev/null +++ b/website/doc/src/format/configuration/README.md @@ -0,0 +1,12 @@ +# Configuration + +This section details the configuration options available in the ***book.toml***: +- **[General]** configuration including the `book`, `rust`, `build` sections +- **[Preprocessor]** configuration for default and custom book preprocessors +- **[Renderer]** configuration for the HTML, Markdown and custom renderers +- **[Environment Variable]** configuration for overriding configuration options in your environment + +[General]: general.md +[Preprocessor]: preprocessors.md +[Renderer]: renderers.md +[Environment Variable]: environment-variables.md \ No newline at end of file diff --git a/website/doc/src/format/configuration/environment-variables.md b/website/doc/src/format/configuration/environment-variables.md new file mode 100644 index 00000000..3631769b --- /dev/null +++ b/website/doc/src/format/configuration/environment-variables.md @@ -0,0 +1,38 @@ +# Environment Variables + +All configuration values can be overridden from the command line by setting the +corresponding environment variable. Because many operating systems restrict +environment variables to be alphanumeric characters or `_`, the configuration +key needs to be formatted slightly differently to the normal `foo.bar.baz` form. + +Variables starting with `MDBOOK_` are used for configuration. The key is created +by removing the `MDBOOK_` prefix and turning the resulting string into +`kebab-case`. Double underscores (`__`) separate nested keys, while a single +underscore (`_`) is replaced with a dash (`-`). + +For example: + +- `MDBOOK_foo` -> `foo` +- `MDBOOK_FOO` -> `foo` +- `MDBOOK_FOO__BAR` -> `foo.bar` +- `MDBOOK_FOO_BAR` -> `foo-bar` +- `MDBOOK_FOO_bar__baz` -> `foo-bar.baz` + +So by setting the `MDBOOK_BOOK__TITLE` environment variable you can override the +book's title without needing to touch your `book.toml`. + +> **Note:** To facilitate setting more complex config items, the value of an +> environment variable is first parsed as JSON, falling back to a string if the +> parse fails. +> +> This means, if you so desired, you could override all book metadata when +> building the book with something like +> +> ```shell +> $ export MDBOOK_BOOK="{'title': 'My Awesome Book', authors: ['Michael-F-Bryan']}" +> $ mdbook build +> ``` + +The latter case may be useful in situations where `mdbook` is invoked from a +script or CI, where it sometimes isn't possible to update the `book.toml` before +building. diff --git a/website/doc/src/format/configuration/general.md b/website/doc/src/format/configuration/general.md new file mode 100644 index 00000000..a00247ec --- /dev/null +++ b/website/doc/src/format/configuration/general.md @@ -0,0 +1,110 @@ +# General Configuration + +You can configure the parameters for your book in the ***book.toml*** file. + +Here is an example of what a ***book.toml*** file might look like: + +```toml +[book] +title = "Example book" +authors = ["John Doe"] +description = "The example book covers examples." + +[rust] +edition = "2018" + +[build] +build-dir = "my-example-book" +create-missing = false + +[preprocessor.index] + +[preprocessor.links] + +[output.html] +additional-css = ["custom.css"] + +[output.html.search] +limit-results = 15 +``` + +## Supported configuration options + +It is important to note that **any** relative path specified in the +configuration will always be taken relative from the root of the book where the +configuration file is located. + +### General metadata + +This is general information about your book. + +- **title:** The title of the book +- **authors:** The author(s) of the book +- **description:** A description for the book, which is added as meta + information in the html `<head>` of each page +- **src:** By default, the source directory is found in the directory named + `src` directly under the root folder. But this is configurable with the `src` + key in the configuration file. +- **language:** The main language of the book, which is used as a language attribute `<html lang="en">` for example. + +**book.toml** +```toml +[book] +title = "Example book" +authors = ["John Doe", "Jane Doe"] +description = "The example book covers examples." +src = "my-src" # the source files will be found in `root/my-src` instead of `root/src` +language = "en" +``` + +### Rust options + +Options for the Rust language, relevant to running tests and playground +integration. + +```toml +[rust] +edition = "2015" # the default edition for code blocks +``` + +- **edition**: Rust edition to use by default for the code snippets. Default + is "2015". Individual code blocks can be controlled with the `edition2015`, + `edition2018` or `edition2021` annotations, such as: + + ~~~text + ```rust,edition2015 + // This only works in 2015. + let try = true; + ``` + ~~~ + +### Build options + +This controls the build process of your book. + +```toml +[build] +build-dir = "book" # the directory where the output is placed +create-missing = true # whether or not to create missing pages +use-default-preprocessors = true # use the default preprocessors +``` + +- **build-dir:** The directory to put the rendered book in. By default this is + `book/` in the book's root directory. + This can overridden with the `--dest-dir` CLI option. +- **create-missing:** By default, any missing files specified in `SUMMARY.md` + will be created when the book is built (i.e. `create-missing = true`). If this + is `false` then the build process will instead exit with an error if any files + do not exist. +- **use-default-preprocessors:** Disable the default preprocessors of (`links` & + `index`) by setting this option to `false`. + + If you have the same, and/or other preprocessors declared via their table + of configuration, they will run instead. + + - For clarity, with no preprocessor configuration, the default `links` and + `index` will run. + - Setting `use-default-preprocessors = false` will disable these + default preprocessors from running. + - Adding `[preprocessor.links]`, for example, will ensure, regardless of + `use-default-preprocessors` that `links` it will run. diff --git a/website/doc/src/format/configuration/preprocessors.md b/website/doc/src/format/configuration/preprocessors.md new file mode 100644 index 00000000..f44bdd4f --- /dev/null +++ b/website/doc/src/format/configuration/preprocessors.md @@ -0,0 +1,87 @@ +# Configuring Preprocessors + +Preprocessors are extensions that can modify the raw Markdown source before it gets sent to the renderer. + +The following preprocessors are built-in and included by default: + +- `links`: Expands the `{{ #playground }}`, `{{ #include }}`, and `{{ #rustdoc_include }}` handlebars + helpers in a chapter to include the contents of a file. + See [Including files] for more. +- `index`: Convert all chapter files named `README.md` into `index.md`. That is + to say, all `README.md` would be rendered to an index file `index.html` in the + rendered book. + +The built-in preprocessors can be disabled with the [`build.use-default-preprocessors`] config option. + +The community has developed several preprocessors. +See the [Third Party Plugins] wiki page for a list of available preprocessors. + +For information on how to create a new preprocessor, see the [Preprocessors for Developers] chapter. + +[Including files]: ../mdbook.md#including-files +[`build.use-default-preprocessors`]: general.md#build-options +[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins +[Preprocessors for Developers]: ../../for_developers/preprocessors.md + +## Custom Preprocessor Configuration + +Preprocessors can be added by including a `preprocessor` table in `book.toml` with the name of the preprocessor. +For example, if you have a preprocessor called `mdbook-example`, then you can include it with: + +```toml +[preprocessor.example] +``` + +With this table, mdBook will execute the `mdbook-example` preprocessor. + +This table can include additional key-value pairs that are specific to the preprocessor. +For example, if our example prepocessor needed some extra configuration options: + +```toml +[preprocessor.example] +some-extra-feature = true +``` + +## Locking a Preprocessor dependency to a renderer + +You can explicitly specify that a preprocessor should run for a renderer by +binding the two together. + +```toml +[preprocessor.example] +renderers = ["html"] # example preprocessor only runs with the HTML renderer +``` + +## Provide Your Own Command + +By default when you add a `[preprocessor.foo]` table to your `book.toml` file, +`mdbook` will try to invoke the `mdbook-foo` executable. If you want to use a +different program name or pass in command-line arguments, this behaviour can +be overridden by adding a `command` field. + +```toml +[preprocessor.random] +command = "python random.py" +``` + +## Require A Certain Order + +The order in which preprocessors are run can be controlled with the `before` and `after` fields. +For example, suppose you want your `linenos` preprocessor to process lines that may have been `{{#include}}`d; then you want it to run after the built-in `links` preprocessor, which you can require using either the `before` or `after` field: + +```toml +[preprocessor.linenos] +after = [ "links" ] +``` + +or + +```toml +[preprocessor.links] +before = [ "linenos" ] +``` + +It would also be possible, though redundant, to specify both of the above in the same config file. + +Preprocessors having the same priority specified through `before` and `after` are sorted by name. +Any infinite loops will be detected and produce an error. diff --git a/website/doc/src/format/configuration/renderers.md b/website/doc/src/format/configuration/renderers.md new file mode 100644 index 00000000..f1d5ee15 --- /dev/null +++ b/website/doc/src/format/configuration/renderers.md @@ -0,0 +1,299 @@ +# Configuring Renderers + +Renderers (also called "backends") are responsible for creating the output of the book. + +The following backends are built-in: + +* [`html`](#html-renderer-options) — This renders the book to HTML. + This is enabled by default if no other `[output]` tables are defined in `book.toml`. +* [`markdown`](#markdown-renderer) — This outputs the book as markdown after running the preprocessors. + This is useful for debugging preprocessors. + +The community has developed several backends. +See the [Third Party Plugins] wiki page for a list of available backends. + +For information on how to create a new backend, see the [Backends for Developers] chapter. + +[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins +[Backends for Developers]: ../../for_developers/backends.md + +## Output tables + +Backends can be added by including a `output` table in `book.toml` with the name of the backend. +For example, if you have a backend called `mdbook-wordcount`, then you can include it with: + +```toml +[output.wordcount] +``` + +With this table, mdBook will execute the `mdbook-wordcount` backend. + +This table can include additional key-value pairs that are specific to the backend. +For example, if our example backend needed some extra configuration options: + +```toml +[output.wordcount] +ignores = ["Example Chapter"] +``` + +If you define any `[output]` tables, then the `html` backend is not enabled by default. +If you want to keep the `html` backend running, then just include it in the `book.toml` file. +For example: + +```toml +[book] +title = "My Awesome Book" + +[output.wordcount] + +[output.html] +``` + +If more than one `output` table is included, this changes the behavior for the layout of the output directory. +If there is only one backend, then it places its output directly in the `book` directory (see [`build.build-dir`] to override this location). +If there is more than one backend, then each backend is placed in a separate directory underneath `book`. +For example, the above would have directories `book/html` and `book/wordcount`. + +[`build.build-dir`]: general.md#build-options + +### Custom backend commands + +By default when you add an `[output.foo]` table to your `book.toml` file, +`mdbook` will try to invoke the `mdbook-foo` executable. +If you want to use a different program name or pass in command-line arguments, +this behaviour can be overridden by adding a `command` field. + +```toml +[output.random] +command = "python random.py" +``` + +### Optional backends + +If you enable a backend that isn't installed, the default behavior is to throw an error. +This behavior can be changed by marking the backend as optional: + +```toml +[output.wordcount] +optional = true +``` + +This demotes the error to a warning. + + +## HTML renderer options + +The HTML renderer has a variety of options detailed below. +They should be specified in the `[output.html]` table of the `book.toml` file. + +```toml +# Example book.toml file with all output options. +[book] +title = "Example book" +authors = ["John Doe", "Jane Doe"] +description = "The example book covers examples." + +[output.html] +theme = "my-theme" +default-theme = "light" +preferred-dark-theme = "navy" +curly-quotes = true +mathjax-support = false +copy-fonts = true +additional-css = ["custom.css", "custom2.css"] +additional-js = ["custom.js"] +no-section-label = false +git-repository-url = "https://github.com/rust-lang/mdBook" +git-repository-icon = "fa-github" +edit-url-template = "https://github.com/rust-lang/mdBook/edit/master/guide/{path}" +site-url = "/example-book/" +cname = "myproject.rs" +input-404 = "not-found.md" +``` + +The following configuration options are available: + +- **theme:** mdBook comes with a default theme and all the resource files needed + for it. But if this option is set, mdBook will selectively overwrite the theme + files with the ones found in the specified folder. +- **default-theme:** The theme color scheme to select by default in the + 'Change Theme' dropdown. Defaults to `light`. +- **preferred-dark-theme:** The default dark theme. This theme will be used if + the browser requests the dark version of the site via the + ['prefers-color-scheme'](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme) + CSS media query. Defaults to `navy`. +- **curly-quotes:** Convert straight quotes to curly quotes, except for those + that occur in code blocks and code spans. Defaults to `false`. +- **mathjax-support:** Adds support for [MathJax](../mathjax.md). Defaults to + `false`. +- **copy-fonts:** Copies fonts.css and respective font files to the output directory and use them in the default theme. Defaults to `true`. +- **google-analytics:** This field has been deprecated and will be removed in a future release. + Use the `theme/head.hbs` file to add the appropriate Google Analytics code instead. +- **additional-css:** If you need to slightly change the appearance of your book + without overwriting the whole style, you can specify a set of stylesheets that + will be loaded after the default ones where you can surgically change the + style. +- **additional-js:** If you need to add some behaviour to your book without + removing the current behaviour, you can specify a set of JavaScript files that + will be loaded alongside the default one. +- **no-section-label:** mdBook by defaults adds numeric section labels in the table of + contents column. For example, "1.", "2.1". Set this option to true to disable + those labels. Defaults to `false`. +- **git-repository-url:** A url to the git repository for the book. If provided + an icon link will be output in the menu bar of the book. +- **git-repository-icon:** The FontAwesome icon class to use for the git + repository link. Defaults to `fa-github` which looks like <i class="fa fa-github"></i>. + If you are not using GitHub, another option to consider is `fa-code-fork` which looks like <i class="fa fa-code-fork"></i>. +- **edit-url-template:** Edit url template, when provided shows a + "Suggest an edit" button (which looks like <i class="fa fa-edit"></i>) for directly jumping to editing the currently + viewed page. For e.g. GitHub projects set this to + `https://github.com/<owner>/<repo>/edit/master/{path}` or for + Bitbucket projects set it to + `https://bitbucket.org/<owner>/<repo>/src/master/{path}?mode=edit` + where {path} will be replaced with the full path of the file in the + repository. +- **input-404:** The name of the markdown file used for missing files. + The corresponding output file will be the same, with the extension replaced with `html`. + Defaults to `404.md`. +- **site-url:** The url where the book will be hosted. This is required to ensure + navigation links and script/css imports in the 404 file work correctly, even when accessing + urls in subdirectories. Defaults to `/`. +- **cname:** The DNS subdomain or apex domain at which your book will be hosted. + This string will be written to a file named CNAME in the root of your site, as + required by GitHub Pages (see [*Managing a custom domain for your GitHub Pages + site*][custom domain]). + +[custom domain]: https://docs.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site + +### `[output.html.print]` + +The `[output.html.print]` table provides options for controlling the printable output. +By default, mdBook will include an icon on the top right of the book (which looks like <i class="fa fa-print"></i>) that will print the book as a single page. + +```toml +[output.html.print] +enable = true # include support for printable output +page-break = true # insert page-break after each chapter +``` + +- **enable:** Enable print support. When `false`, all print support will not be + rendered. Defaults to `true`. +- **page-break** Insert page breaks between chapters. Defaults to `true`. + +### `[output.html.fold]` + +The `[output.html.fold]` table provides options for controlling folding of the chapter listing in the navigation sidebar. + +```toml +[output.html.fold] +enable = false # whether or not to enable section folding +level = 0 # the depth to start folding +``` + +- **enable:** Enable section-folding. When off, all folds are open. + Defaults to `false`. +- **level:** The higher the more folded regions are open. When level is 0, all + folds are closed. Defaults to `0`. + +### `[output.html.playground]` + +The `[output.html.playground]` table provides options for controlling Rust sample code blocks, and their integration with the [Rust Playground]. + +[Rust Playground]: https://play.rust-lang.org/ + +```toml +[output.html.playground] +editable = false # allows editing the source code +copyable = true # include the copy button for copying code snippets +copy-js = true # includes the JavaScript for the code editor +line-numbers = false # displays line numbers for editable code +runnable = true # displays a run button for rust code +``` + +- **editable:** Allow editing the source code. Defaults to `false`. +- **copyable:** Display the copy button on code snippets. Defaults to `true`. +- **copy-js:** Copy JavaScript files for the editor to the output directory. + Defaults to `true`. +- **line-numbers** Display line numbers on editable sections of code. Requires both `editable` and `copy-js` to be `true`. Defaults to `false`. +- **runnable** Displays a run button for rust code snippets. Changing this to `false` will disable the run in playground feature globally. Defaults to `true`. + +[Ace]: https://ace.c9.io/ + +### `[output.html.search]` + +The `[output.html.search]` table provides options for controlling the built-in text [search]. +mdBook must be compiled with the `search` feature enabled (on by default). + +[search]: ../../guide/reading.md#search + +```toml +[output.html.search] +enable = true # enables the search feature +limit-results = 30 # maximum number of search results +teaser-word-count = 30 # number of words used for a search result teaser +use-boolean-and = true # multiple search terms must all match +boost-title = 2 # ranking boost factor for matches in headers +boost-hierarchy = 1 # ranking boost factor for matches in page names +boost-paragraph = 1 # ranking boost factor for matches in text +expand = true # partial words will match longer terms +heading-split-level = 3 # link results to heading levels +copy-js = true # include Javascript code for search +``` + +- **enable:** Enables the search feature. Defaults to `true`. +- **limit-results:** The maximum number of search results. Defaults to `30`. +- **teaser-word-count:** The number of words used for a search result teaser. + Defaults to `30`. +- **use-boolean-and:** Define the logical link between multiple search words. If + true, all search words must appear in each result. Defaults to `false`. +- **boost-title:** Boost factor for the search result score if a search word + appears in the header. Defaults to `2`. +- **boost-hierarchy:** Boost factor for the search result score if a search word + appears in the hierarchy. The hierarchy contains all titles of the parent + documents and all parent headings. Defaults to `1`. +- **boost-paragraph:** Boost factor for the search result score if a search word + appears in the text. Defaults to `1`. +- **expand:** True if search should match longer results e.g. search `micro` + should match `microwave`. Defaults to `true`. +- **heading-split-level:** Search results will link to a section of the document + which contains the result. Documents are split into sections by headings this + level or less. Defaults to `3`. (`### This is a level 3 heading`) +- **copy-js:** Copy JavaScript files for the search implementation to the output + directory. Defaults to `true`. + +### `[output.html.redirect]` + +The `[output.html.redirect]` table provides a way to add redirects. +This is useful when you move, rename, or remove a page to ensure that links to the old URL will go to the new location. + +```toml +[output.html.redirect] +"/appendices/bibliography.html" = "https://rustc-dev-guide.rust-lang.org/appendix/bibliography.html" +"/other-installation-methods.html" = "../infra/other-installation-methods.html" +``` + +The table contains key-value pairs where the key is where the redirect file needs to be created, as an absolute path from the build directory, (e.g. `/appendices/bibliography.html`). +The value can be any valid URI the browser should navigate to (e.g. `https://rust-lang.org/`, `/overview.html`, or `../bibliography.html`). + +This will generate an HTML page which will automatically redirect to the given location. +Note that the source location does not support `#` anchor redirects. + +## Markdown Renderer + +The Markdown renderer will run preprocessors and then output the resulting +Markdown. This is mostly useful for debugging preprocessors, especially in +conjunction with `mdbook test` to see the Markdown that `mdbook` is passing +to `rustdoc`. + +The Markdown renderer is included with `mdbook` but disabled by default. +Enable it by adding an empty table to your `book.toml` as follows: + +```toml +[output.markdown] +``` + +There are no configuration options for the Markdown renderer at this time; +only whether it is enabled or disabled. + +See [the preprocessors documentation](preprocessors.md) for how to +specify which preprocessors should run before the Markdown renderer. diff --git a/website/doc/src/format/example.rs b/website/doc/src/format/example.rs new file mode 100644 index 00000000..a467cac1 --- /dev/null +++ b/website/doc/src/format/example.rs @@ -0,0 +1,6 @@ +fn main() { + println!("Hello World!"); +# +# // You can even hide lines! :D +# println!("I am hidden! Expand the code snippet to see me"); +} diff --git a/website/doc/src/format/images/rust-logo-blk.svg b/website/doc/src/format/images/rust-logo-blk.svg new file mode 100644 index 00000000..1a6c762d --- /dev/null +++ b/website/doc/src/format/images/rust-logo-blk.svg @@ -0,0 +1 @@ +<svg height="144" width="144" xmlns="http://www.w3.org/2000/svg"><path d="m71.05 23.68c-26.06 0-47.27 21.22-47.27 47.27s21.22 47.27 47.27 47.27 47.27-21.22 47.27-47.27-21.22-47.27-47.27-47.27zm-.07 4.2a3.1 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm7.12 5.12a38.27 38.27 0 0 1 26.2 18.66l-3.67 8.28c-.63 1.43.02 3.11 1.44 3.75l7.06 3.13a38.27 38.27 0 0 1 .08 6.64h-3.93c-.39 0-.55.26-.55.64v1.8c0 4.24-2.39 5.17-4.49 5.4-2 .23-4.21-.84-4.49-2.06-1.18-6.63-3.14-8.04-6.24-10.49 3.85-2.44 7.85-6.05 7.85-10.87 0-5.21-3.57-8.49-6-10.1-3.42-2.25-7.2-2.7-8.22-2.7h-40.6a38.27 38.27 0 0 1 21.41-12.08l4.79 5.02c1.08 1.13 2.87 1.18 4 .09zm-44.2 23.02a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm74.15.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm-68.29.5h5.42v24.44h-10.94a38.27 38.27 0 0 1 -1.24-14.61l6.7-2.98c1.43-.64 2.08-2.31 1.44-3.74zm22.62.26h12.91c.67 0 4.71.77 4.71 3.8 0 2.51-3.1 3.41-5.65 3.41h-11.98zm0 17.56h9.89c.9 0 4.83.26 6.08 5.28.39 1.54 1.26 6.56 1.85 8.17.59 1.8 2.98 5.4 5.53 5.4h16.14a38.27 38.27 0 0 1 -3.54 4.1l-6.57-1.41c-1.53-.33-3.04.65-3.37 2.18l-1.56 7.28a38.27 38.27 0 0 1 -31.91-.15l-1.56-7.28c-.33-1.53-1.83-2.51-3.36-2.18l-6.43 1.38a38.27 38.27 0 0 1 -3.32-3.92h31.27c.35 0 .59-.06.59-.39v-11.06c0-.32-.24-.39-.59-.39h-9.15zm-14.43 25.33a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm46.05.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11z"/><path d="m115.68 70.95a44.63 44.63 0 0 1 -44.63 44.63 44.63 44.63 0 0 1 -44.63-44.63 44.63 44.63 0 0 1 44.63-44.63 44.63 44.63 0 0 1 44.63 44.63zm-.84-4.31 6.96 4.31-6.96 4.31 5.98 5.59-7.66 2.87 4.78 6.65-8.09 1.32 3.4 7.46-8.19-.29 1.88 7.98-7.98-1.88.29 8.19-7.46-3.4-1.32 8.09-6.65-4.78-2.87 7.66-5.59-5.98-4.31 6.96-4.31-6.96-5.59 5.98-2.87-7.66-6.65 4.78-1.32-8.09-7.46 3.4.29-8.19-7.98 1.88 1.88-7.98-8.19.29 3.4-7.46-8.09-1.32 4.78-6.65-7.66-2.87 5.98-5.59-6.96-4.31 6.96-4.31-5.98-5.59 7.66-2.87-4.78-6.65 8.09-1.32-3.4-7.46 8.19.29-1.88-7.98 7.98 1.88-.29-8.19 7.46 3.4 1.32-8.09 6.65 4.78 2.87-7.66 5.59 5.98 4.31-6.96 4.31 6.96 5.59-5.98 2.87 7.66 6.65-4.78 1.32 8.09 7.46-3.4-.29 8.19 7.98-1.88-1.88 7.98 8.19-.29-3.4 7.46 8.09 1.32-4.78 6.65 7.66 2.87z" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/></svg> \ No newline at end of file diff --git a/website/doc/src/format/markdown.md b/website/doc/src/format/markdown.md new file mode 100644 index 00000000..963a1538 --- /dev/null +++ b/website/doc/src/format/markdown.md @@ -0,0 +1,222 @@ +# Markdown + +mdBook's [parser](https://github.com/raphlinus/pulldown-cmark) adheres to the [CommonMark](https://commonmark.org/) specification with some extensions described below. +You can take a quick [tutorial](https://commonmark.org/help/tutorial/), +or [try out](https://spec.commonmark.org/dingus/) CommonMark in real time. A complete Markdown overview is out of scope for +this documentation, but below is a high level overview of some of the basics. For a more in-depth experience, check out the +[Markdown Guide](https://www.markdownguide.org). + +## Text and Paragraphs + +Text is rendered relatively predictably: + +```markdown +Here is a line of text. + +This is a new line. +``` + +Will look like you might expect: + +Here is a line of text. + +This is a new line. + +## Headings + +Headings use the `#` marker and should be on a line by themselves. More `#` mean smaller headings: + +```markdown +### A heading + +Some text. + +#### A smaller heading + +More text. +``` + +### A heading + +Some text. + +#### A smaller heading + +More text. + +## Lists + +Lists can be unordered or ordered. Ordered lists will order automatically: + +```markdown +* milk +* eggs +* butter + +1. carrots +1. celery +1. radishes +``` + +* milk +* eggs +* butter + +1. carrots +1. celery +1. radishes + +## Links + +Linking to a URL or local file is easy: + +```markdown +Use [mdBook](https://github.com/rust-lang/mdBook). + +Read about [mdBook](mdBook.md). + +A bare url: <https://www.rust-lang.org>. +``` + +Use [mdBook](https://github.com/rust-lang/mdBook). + +Read about [mdBook](mdBook.md). + +A bare url: <https://www.rust-lang.org>. + +---- + +Relative links that end with `.md` will be converted to the `.html` extension. +It is recommended to use `.md` links when possible. +This is useful when viewing the Markdown file outside of mdBook, for example on GitHub or GitLab which render Markdown automatically. + +Links to `README.md` will be converted to `index.html`. +This is done since some services like GitHub render README files automatically, but web servers typically expect the root file to be called `index.html`. + +You can link to individual headings with `#` fragments. +For example, `mdbook.md#text-and-paragraphs` would link to the [Text and Paragraphs](#text-and-paragraphs) section above. +The ID is created by transforming the heading such as converting to lowercase and replacing spaces with dashes. +You can click on any heading and look at the URL in your browser to see what the fragment looks like. + +## Images + +Including images is simply a matter of including a link to them, much like in the _Links_ section above. The following markdown +includes the Rust logo SVG image found in the `images` directory at the same level as this file: + +```markdown +![The Rust Logo](images/rust-logo-blk.svg) +``` + +Produces the following HTML when built with mdBook: + +```html +<p><img src="images/rust-logo-blk.svg" alt="The Rust Logo" /></p> +``` + +Which, of course displays the image like so: + +![The Rust Logo](images/rust-logo-blk.svg) + +## Extensions + +mdBook has several extensions beyond the standard CommonMark specification. + +### Strikethrough + +Text may be rendered with a horizontal line through the center by wrapping the +text with two tilde characters on each side: + +```text +An example of ~~strikethrough text~~. +``` + +This example will render as: + +> An example of ~~strikethrough text~~. + +This follows the [GitHub Strikethrough extension][strikethrough]. + +### Footnotes + +A footnote generates a small numbered link in the text which when clicked +takes the reader to the footnote text at the bottom of the item. The footnote +label is written similarly to a link reference with a caret at the front. The +footnote text is written like a link reference definition, with the text +following the label. Example: + +```text +This is an example of a footnote[^note]. + +[^note]: This text is the contents of the footnote, which will be rendered + towards the bottom. +``` + +This example will render as: + +> This is an example of a footnote[^note]. +> +> [^note]: This text is the contents of the footnote, which will be rendered +> towards the bottom. + +The footnotes are automatically numbered based on the order the footnotes are +written. + +### Tables + +Tables can be written using pipes and dashes to draw the rows and columns of +the table. These will be translated to HTML table matching the shape. Example: + +```text +| Header1 | Header2 | +|---------|---------| +| abc | def | +``` + +This example will render similarly to this: + +| Header1 | Header2 | +|---------|---------| +| abc | def | + +See the specification for the [GitHub Tables extension][tables] for more +details on the exact syntax supported. + +### Task lists + +Task lists can be used as a checklist of items that have been completed. +Example: + +```md +- [x] Complete task +- [ ] Incomplete task +``` + +This will render as: + +> - [x] Complete task +> - [ ] Incomplete task + +See the specification for the [task list extension] for more details. + +### Smart punctuation + +Some ASCII punctuation sequences will be automatically turned into fancy Unicode +characters: + +| ASCII sequence | Unicode | +|----------------|---------| +| `--` | – | +| `---` | — | +| `...` | … | +| `"` | “ or ”, depending on context | +| `'` | ‘ or ’, depending on context | + +So, no need to manually enter those Unicode characters! + +This feature is disabled by default. +To enable it, see the [`output.html.curly-quotes`] config option. + +[strikethrough]: https://github.github.com/gfm/#strikethrough-extension- +[tables]: https://github.github.com/gfm/#tables-extension- +[task list extension]: https://github.github.com/gfm/#task-list-items-extension- +[`output.html.curly-quotes`]: configuration/renderers.md#html-renderer-options diff --git a/website/doc/src/format/mathjax.md b/website/doc/src/format/mathjax.md new file mode 100644 index 00000000..3dd79215 --- /dev/null +++ b/website/doc/src/format/mathjax.md @@ -0,0 +1,43 @@ +# MathJax Support + +mdBook has optional support for math equations through +[MathJax](https://www.mathjax.org/). + +To enable MathJax, you need to add the `mathjax-support` key to your `book.toml` +under the `output.html` section. + +```toml +[output.html] +mathjax-support = true +``` + +>**Note:** The usual delimiters MathJax uses are not yet supported. You can't +currently use `$$ ... $$` as delimiters and the `\[ ... \]` delimiters need an +extra backslash to work. Hopefully this limitation will be lifted soon. + +>**Note:** When you use double backslashes in MathJax blocks (for example in +> commands such as `\begin{cases} \frac 1 2 \\ \frac 3 4 \end{cases}`) you need +> to add _two extra_ backslashes (e.g., `\begin{cases} \frac 1 2 \\\\ \frac 3 4 +> \end{cases}`). + + +### Inline equations +Inline equations are delimited by `\\(` and `\\)`. So for example, to render the +following inline equation \\( \int x dx = \frac{x^2}{2} + C \\) you would write +the following: +``` +\\( \int x dx = \frac{x^2}{2} + C \\) +``` + +### Block equations +Block equations are delimited by `\\[` and `\\]`. To render the following +equation + +\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] + + +you would write: + +```bash +\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] +``` diff --git a/website/doc/src/format/mdbook.md b/website/doc/src/format/mdbook.md new file mode 100644 index 00000000..62e89843 --- /dev/null +++ b/website/doc/src/format/mdbook.md @@ -0,0 +1,276 @@ +# mdBook-specific features + +## Hiding code lines + +There is a feature in mdBook that lets you hide code lines by prepending them +with a `#` [like you would with Rustdoc][rustdoc-hide]. +This currently only works with Rust language code blocks. + +[rustdoc-hide]: https://doc.rust-lang.org/stable/rustdoc/documentation-tests.html#hiding-portions-of-the-example + +```bash +# fn main() { + let x = 5; + let y = 6; + + println!("{}", x + y); +# } +``` + +Will render as + +```rust +# fn main() { + let x = 5; + let y = 6; + + println!("{}", x + y); +# } +``` + +The code block has an eyeball icon (<i class="fa fa-eye"></i>) which will toggle the visibility of the hidden lines. + +## Rust Playground + +Rust language code blocks will automatically get a play button (<i class="fa fa-play"></i>) which will execute the code and display the output just below the code block. +This works by sending the code to the [Rust Playground]. + +```rust +println!("Hello, World!"); +``` + +If there is no `main` function, then the code is automatically wrapped inside one. + +If you wish to disable the play button for a code block, you can include the `noplayground` option on the code block like this: + +~~~markdown +```rust,noplayground +let mut name = String::new(); +std::io::stdin().read_line(&mut name).expect("failed to read line"); +println!("Hello {}!", name); +``` +~~~ + +Or, if you wish to disable the play button for all code blocks in your book, you can write the config to the `book.toml` like this. + +```toml +[output.html.playground] +runnable = false +``` + +## Rust code block attributes + +Additional attributes can be included in Rust code blocks with comma, space, or tab-separated terms just after the language term. For example: + +~~~markdown +```rust,ignore +# This example won't be tested. +panic!("oops!"); +``` +~~~ + +These are particularly important when using [`mdbook test`] to test Rust examples. +These use the same attributes as [rustdoc attributes], with a few additions: + +* `editable` — Enables the [editor]. +* `noplayground` — Removes the play button, but will still be tested. +* `mdbook-runnable` — Forces the play button to be displayed. + This is intended to be combined with the `ignore` attribute for examples that should not be tested, but you want to allow the reader to run. +* `ignore` — Will not be tested and no play button is shown, but it is still highlighted as Rust syntax. +* `should_panic` — When executed, it should produce a panic. +* `no_run` — The code is compiled when tested, but it is not run. + The play button is also not shown. +* `compile_fail` — The code should fail to compile. +* `edition2015`, `edition2018`, `edition2021` — Forces the use of a specific Rust edition. + See [`rust.edition`] to set this globally. + +[`mdbook test`]: ../cli/test.md +[rustdoc attributes]: https://doc.rust-lang.org/rustdoc/documentation-tests.html#attributes +[editor]: theme/editor.md +[`rust.edition`]: configuration/general.md#rust-options + +## Including files + +With the following syntax, you can include files into your book: + +```hbs +\{{#include file.rs}} +``` + +The path to the file has to be relative from the current source file. + +mdBook will interpret included files as Markdown. Since the include command +is usually used for inserting code snippets and examples, you will often +wrap the command with ```` ``` ```` to display the file contents without +interpreting them. + +````hbs +``` +\{{#include file.rs}} +``` +```` + +## Including portions of a file +Often you only need a specific part of the file, e.g. relevant lines for an +example. We support four different modes of partial includes: + +```hbs +\{{#include file.rs:2}} +\{{#include file.rs::10}} +\{{#include file.rs:2:}} +\{{#include file.rs:2:10}} +``` + +The first command only includes the second line from file `file.rs`. The second +command includes all lines up to line 10, i.e. the lines from 11 till the end of +the file are omitted. The third command includes all lines from line 2, i.e. the +first line is omitted. The last command includes the excerpt of `file.rs` +consisting of lines 2 to 10. + +To avoid breaking your book when modifying included files, you can also +include a specific section using anchors instead of line numbers. +An anchor is a pair of matching lines. The line beginning an anchor must +match the regex `ANCHOR:\s*[\w_-]+` and similarly the ending line must match +the regex `ANCHOR_END:\s*[\w_-]+`. This allows you to put anchors in +any kind of commented line. + +Consider the following file to include: +```rs +/* ANCHOR: all */ + +// ANCHOR: component +struct Paddle { + hello: f32, +} +// ANCHOR_END: component + +////////// ANCHOR: system +impl System for MySystem { ... } +////////// ANCHOR_END: system + +/* ANCHOR_END: all */ +``` + +Then in the book, all you have to do is: +````hbs +Here is a component: +```rust,no_run,noplayground +\{{#include file.rs:component}} +``` + +Here is a system: +```rust,no_run,noplayground +\{{#include file.rs:system}} +``` + +This is the full file. +```rust,no_run,noplayground +\{{#include file.rs:all}} +``` +```` + +Lines containing anchor patterns inside the included anchor are ignored. + +## Including a file but initially hiding all except specified lines + +The `rustdoc_include` helper is for including code from external Rust files that contain complete +examples, but only initially showing particular lines specified with line numbers or anchors in the +same way as with `include`. + +The lines not in the line number range or between the anchors will still be included, but they will +be prefaced with `#`. This way, a reader can expand the snippet to see the complete example, and +Rustdoc will use the complete example when you run `mdbook test`. + +For example, consider a file named `file.rs` that contains this Rust program: + +```rust +fn main() { + let x = add_one(2); + assert_eq!(x, 3); +} + +fn add_one(num: i32) -> i32 { + num + 1 +} +``` + +We can include a snippet that initially shows only line 2 by using this syntax: + +````hbs +To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: + +```rust +\{{#rustdoc_include file.rs:2}} +``` +```` + +This would have the same effect as if we had manually inserted the code and hidden all but line 2 +using `#`: + +````hbs +To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: + +```rust +# fn main() { + let x = add_one(2); +# assert_eq!(x, 3); +# } +# +# fn add_one(num: i32) -> i32 { +# num + 1 +# } +``` +```` + +That is, it looks like this (click the "expand" icon to see the rest of the file): + +```rust +# fn main() { + let x = add_one(2); +# assert_eq!(x, 3); +# } +# +# fn add_one(num: i32) -> i32 { +# num + 1 +# } +``` + +## Inserting runnable Rust files + +With the following syntax, you can insert runnable Rust files into your book: + +```hbs +\{{#playground file.rs}} +``` + +The path to the Rust file has to be relative from the current source file. + +When play is clicked, the code snippet will be sent to the [Rust Playground] to be +compiled and run. The result is sent back and displayed directly underneath the +code. + +Here is what a rendered code snippet looks like: + +{{#playground example.rs}} + +Any additional values passed after the filename will be included as attributes of the code block. +For example `\{{#playground example.rs editable}}` will create the code block like the following: + +~~~markdown +```rust,editable +# Contents of example.rs here. +``` +~~~ + +And the `editable` attribute will enable the [editor] as described at [Rust code block attributes](#rust-code-block-attributes). + +[Rust Playground]: https://play.rust-lang.org/ + +## Controlling page \<title\> + +A chapter can set a \<title\> that is different from its entry in the table of +contents (sidebar) by including a `\{{#title ...}}` near the top of the page. + +```hbs +\{{#title My Title}} +``` diff --git a/website/doc/src/format/summary.md b/website/doc/src/format/summary.md new file mode 100644 index 00000000..0e138529 --- /dev/null +++ b/website/doc/src/format/summary.md @@ -0,0 +1,99 @@ +# SUMMARY.md + +The summary file is used by mdBook to know what chapters to include, in what +order they should appear, what their hierarchy is and where the source files +are. Without this file, there is no book. + +This markdown file must be named `SUMMARY.md`. Its formatting +is very strict and must follow the structure outlined below to allow for easy +parsing. Any element not specified below, be it formatting or textual, is likely +to be ignored at best, or may cause an error when attempting to build the book. + +### Structure + +1. ***Title*** - While optional, it's common practice to begin with a title, generally <code + class="language-markdown"># Summary</code>. This is ignored by the parser however, and + can be omitted. + ```markdown + # Summary + ``` + +1. ***Prefix Chapter*** - Before the main numbered chapters, prefix chapters can be added + that will not be numbered. This is useful for forewords, + introductions, etc. There are, however, some constraints. Prefix chapters cannot be + nested; they should all be on the root level. And you cannot add + prefix chapters once you have added numbered chapters. + ```markdown + [A Prefix Chapter](relative/path/to/markdown.md) + + - [First Chapter](relative/path/to/markdown2.md) + ``` + +1. ***Part Title*** - Headers can be used as a title for the following numbered + chapters. This can be used to logically separate different sections + of the book. The title is rendered as unclickable text. + Titles are optional, and the numbered chapters can be broken into as many + parts as desired. + ```markdown + # My Part Title + + - [First Chapter](relative/path/to/markdown.md) + ``` + +1. ***Numbered Chapter*** - Numbered chapters outline the main content of the book + and can be nested, resulting in a nice hierarchy + (chapters, sub-chapters, etc.). + ```markdown + # Title of Part + + - [First Chapter](relative/path/to/markdown.md) + - [Second Chapter](relative/path/to/markdown2.md) + - [Sub Chapter](relative/path/to/markdown3.md) + + # Title of Another Part + + - [Another Chapter](relative/path/to/markdown4.md) + ``` + Numbered chapters can be denoted with either `-` or `*` (do not mix delimiters). + +1. ***Suffix Chapter*** - Like prefix chapters, suffix chapters are unnumbered, but they come after + numbered chapters. + ```markdown + - [Last Chapter](relative/path/to/markdown.md) + + [Title of Suffix Chapter](relative/path/to/markdown2.md) + ``` + +1. ***Draft chapters*** - Draft chapters are chapters without a file and thus content. + The purpose of a draft chapter is to signal future chapters still to be written. + Or when still laying out the structure of the book to avoid creating the files + while you are still changing the structure of the book a lot. + Draft chapters will be rendered in the HTML renderer as disabled links in the table + of contents, as you can see for the next chapter in the table of contents on the left. + Draft chapters are written like normal chapters but without writing the path to the file. + ```markdown + - [Draft Chapter]() + ``` + +1. ***Separators*** - Separators can be added before, in between, and after any other element. They result + in an HTML rendered line in the built table of contents. A separator is + a line containing exclusively dashes and at least three of them: `---`. + ```markdown + # My Part Title + + [A Prefix Chapter](relative/path/to/markdown.md) + + --- + + - [First Chapter](relative/path/to/markdown2.md) + ``` + + +### Example + +Below is the markdown source for the `SUMMARY.md` for this guide, with the resulting table +of contents as rendered to the left. + +```markdown +{{#include ../SUMMARY.md}} +``` diff --git a/website/doc/src/format/theme/README.md b/website/doc/src/format/theme/README.md new file mode 100644 index 00000000..4a776e60 --- /dev/null +++ b/website/doc/src/format/theme/README.md @@ -0,0 +1,50 @@ +# Theme + +The default renderer uses a [handlebars](http://handlebarsjs.com/) template to +render your markdown files and comes with a default theme included in the mdBook +binary. + +The theme is totally customizable, you can selectively replace every file from +the theme by your own by adding a `theme` directory next to `src` folder in your +project root. Create a new file with the name of the file you want to override +and now that file will be used instead of the default file. + +Here are the files you can override: + +- **_index.hbs_** is the handlebars template. +- **_head.hbs_** is appended to the HTML `<head>` section. +- **_header.hbs_** content is appended on top of every book page. +- **_css/_** contains the CSS files for styling the book. + - **_css/chrome.css_** is for UI elements. + - **_css/general.css_** is the base styles. + - **_css/print.css_** is the style for printer output. + - **_css/variables.css_** contains variables used in other CSS files. +- **_book.js_** is mostly used to add client side functionality, like hiding / + un-hiding the sidebar, changing the theme, ... +- **_highlight.js_** is the JavaScript that is used to highlight code snippets, + you should not need to modify this. +- **_highlight.css_** is the theme used for the code highlighting. +- **_favicon.svg_** and **_favicon.png_** the favicon that will be used. The SVG + version is used by [newer browsers]. + +Generally, when you want to tweak the theme, you don't need to override all the +files. If you only need changes in the stylesheet, there is no point in +overriding all the other files. Because custom files take precedence over +built-in ones, they will not get updated with new fixes / features. + +**Note:** When you override a file, it is possible that you break some +functionality. Therefore I recommend to use the file from the default theme as +template and only add / modify what you need. You can copy the default theme +into your source directory automatically by using `mdbook init --theme` and just +remove the files you don't want to override. + +`mdbook init --theme` will not create every file listed above. +Some files, such as `head.hbs`, do not have built-in equivalents. +Just create the file if you need it. + +If you completely replace all built-in themes, be sure to also set +[`output.html.preferred-dark-theme`] in the config, which defaults to the +built-in `navy` theme. + +[`output.html.preferred-dark-theme`]: ../configuration/renderers.md#html-renderer-options +[newer browsers]: https://caniuse.com/#feat=link-icon-svg diff --git a/website/doc/src/format/theme/editor.md b/website/doc/src/format/theme/editor.md new file mode 100644 index 00000000..9294dd44 --- /dev/null +++ b/website/doc/src/format/theme/editor.md @@ -0,0 +1,48 @@ +# Editor + +In addition to providing runnable code playgrounds, mdBook optionally allows them +to be editable. In order to enable editable code blocks, the following needs to +be added to the ***book.toml***: + +```toml +[output.html.playground] +editable = true +``` + +To make a specific block available for editing, the attribute `editable` needs +to be added to it: + +~~~markdown +```rust,editable +fn main() { + let number = 5; + print!("{}", number); +} +``` +~~~ + +The above will result in this editable playground: + +```rust,editable +fn main() { + let number = 5; + print!("{}", number); +} +``` + +Note the new `Undo Changes` button in the editable playgrounds. + +## Customizing the Editor + +By default, the editor is the [Ace](https://ace.c9.io/) editor, but, if desired, +the functionality may be overridden by providing a different folder: + +```toml +[output.html.playground] +editable = true +editor = "/path/to/editor" +``` + +Note that for the editor changes to function correctly, the `book.js` inside of +the `theme` folder will need to be overridden as it has some couplings with the +default Ace editor. diff --git a/website/doc/src/format/theme/index-hbs.md b/website/doc/src/format/theme/index-hbs.md new file mode 100644 index 00000000..e5331dcc --- /dev/null +++ b/website/doc/src/format/theme/index-hbs.md @@ -0,0 +1,101 @@ +# index.hbs + +`index.hbs` is the handlebars template that is used to render the book. The +markdown files are processed to html and then injected in that template. + +If you want to change the layout or style of your book, chances are that you +will have to modify this template a little bit. Here is what you need to know. + +## Data + +A lot of data is exposed to the handlebars template with the "context". In the +handlebars template you can access this information by using + +```handlebars +{{name_of_property}} +``` + +Here is a list of the properties that are exposed: + +- ***language*** Language of the book in the form `en`, as specified in `book.toml` (if not specified, defaults to `en`). To use in <code + class="language-html">\<html lang="{{ language }}"></code> for example. +- ***title*** Title used for the current page. This is identical to `{{ chapter_title }} - {{ book_title }}` unless `book_title` is not set in which case it just defaults to the `chapter_title`. +- ***book_title*** Title of the book, as specified in `book.toml` +- ***chapter_title*** Title of the current chapter, as listed in `SUMMARY.md` + +- ***path*** Relative path to the original markdown file from the source + directory +- ***content*** This is the rendered markdown. +- ***path_to_root*** This is a path containing exclusively `../`'s that points + to the root of the book from the current file. Since the original directory + structure is maintained, it is useful to prepend relative links with this + `path_to_root`. + +- ***chapters*** Is an array of dictionaries of the form + ```json + {"section": "1.2.1", "name": "name of this chapter", "path": "dir/markdown.md"} + ``` + containing all the chapters of the book. It is used for example to construct + the table of contents (sidebar). + +## Handlebars Helpers + +In addition to the properties you can access, there are some handlebars helpers +at your disposal. + +### 1. toc + +The toc helper is used like this + +```handlebars +{{#toc}}{{/toc}} +``` + +and outputs something that looks like this, depending on the structure of your +book + +```html +<ul class="chapter"> + <li><a href="link/to/file.html">Some chapter</a></li> + <li> + <ul class="section"> + <li><a href="link/to/other_file.html">Some other Chapter</a></li> + </ul> + </li> +</ul> +``` + +If you would like to make a toc with another structure, you have access to the +chapters property containing all the data. The only limitation at the moment +is that you would have to do it with JavaScript instead of with a handlebars +helper. + +```html +<script> +var chapters = {{chapters}}; +// Processing here +</script> +``` + +### 2. previous / next + +The previous and next helpers expose a `link` and `name` property to the +previous and next chapters. + +They are used like this + +```handlebars +{{#previous}} + <a href="{{link}}" class="nav-chapters previous"> + <i class="fa fa-angle-left"></i> + </a> +{{/previous}} +``` + +The inner html will only be rendered if the previous / next chapter exists. +Of course the inner html can be changed to your liking. + +------ + +*If you would like other properties or helpers exposed, please [create a new +issue](https://github.com/rust-lang/mdBook/issues)* diff --git a/website/doc/src/format/theme/syntax-highlighting.md b/website/doc/src/format/theme/syntax-highlighting.md new file mode 100644 index 00000000..f57540f0 --- /dev/null +++ b/website/doc/src/format/theme/syntax-highlighting.md @@ -0,0 +1,121 @@ +# Syntax Highlighting + +mdBook uses [Highlight.js](https://highlightjs.org) with a custom theme +for syntax highlighting. + +Automatic language detection has been turned off, so you will probably want to +specify the programming language you use like this: + +~~~markdown +```rust +fn main() { + // Some code +} +``` +~~~ + +## Supported languages + +These languages are supported by default, but you can add more by supplying +your own `highlight.js` file: + +- apache +- armasm +- bash +- c +- coffeescript +- cpp +- csharp +- css +- d +- diff +- go +- handlebars +- haskell +- http +- ini +- java +- javascript +- json +- julia +- kotlin +- less +- lua +- makefile +- markdown +- nginx +- objectivec +- perl +- php +- plaintext +- properties +- python +- r +- ruby +- rust +- scala +- scss +- shell +- sql +- swift +- typescript +- x86asm +- xml +- yaml + +## Custom theme +Like the rest of the theme, the files used for syntax highlighting can be +overridden with your own. + +- ***highlight.js*** normally you shouldn't have to overwrite this file, unless + you want to use a more recent version. +- ***highlight.css*** theme used by highlight.js for syntax highlighting. + +If you want to use another theme for `highlight.js` download it from their +website, or make it yourself, rename it to `highlight.css` and put it in +the `theme` folder of your book. + +Now your theme will be used instead of the default theme. + +## Hiding code lines + +There is a feature in mdBook that lets you hide code lines by prepending them +with a `#`. + + +```bash +# fn main() { + let x = 5; + let y = 6; + + println!("{}", x + y); +# } +``` + +Will render as + +```rust +# fn main() { + let x = 5; + let y = 7; + + println!("{}", x + y); +# } +``` + +**At the moment, this only works for code examples that are annotated with +`rust`. Because it would collide with semantics of some programming languages. +In the future, we want to make this configurable through the `book.toml` so that +everyone can benefit from it.** + + +## Improve default theme + +If you think the default theme doesn't look quite right for a specific language, +or could be improved, feel free to [submit a new +issue](https://github.com/rust-lang/mdBook/issues) explaining what you +have in mind and I will take a look at it. + +You could also create a pull-request with the proposed improvements. + +Overall the theme should be light and sober, without too many flashy colors. diff --git a/website/doc/src/guide/README.md b/website/doc/src/guide/README.md new file mode 100644 index 00000000..90deb10e --- /dev/null +++ b/website/doc/src/guide/README.md @@ -0,0 +1,7 @@ +# User Guide + +This user guide provides an introduction to basic concepts of using mdBook. + +- [Installation](installation.md) +- [Reading Books](reading.md) +- [Creating a Book](creating.md) diff --git a/website/doc/src/guide/creating.md b/website/doc/src/guide/creating.md new file mode 100644 index 00000000..f68a8c60 --- /dev/null +++ b/website/doc/src/guide/creating.md @@ -0,0 +1,109 @@ +# Creating a Book + +Once you have the `mdbook` CLI tool installed, you can use it to create and render a book. + +## Initializing a book + +The `mdbook init` command will create a new directory containing an empty book for you to get started. +Give it the name of the directory that you want to create: + +```sh +mdbook init my-first-book +``` + +It will ask a few questions before generating the book. +After answering the questions, you can change the current directory into the new book: + +```sh +cd my-first-book +``` + +There are several ways to render a book, but one of the easiest methods is to use the `serve` command, which will build your book and start a local webserver: + +```sh +mdbook serve --open +``` + +The `--open` option will open your default web browser to view your new book. +You can leave the server running even while you edit the content of the book, and `mdbook` will automatically rebuild the output *and* automatically refresh your web browser. + +Check out the [CLI Guide](../cli/index.html) for more information about other `mdbook` commands and CLI options. + +## Anatomy of a book + +A book is built from several files which define the settings and layout of the book. + +### `book.toml` + +In the root of your book, there is a `book.toml` file which contains settings for describing how to build your book. +This is written in the [TOML markup language](https://toml.io/). +The default settings are usually good enough to get you started. +When you are interested in exploring more features and options that mdBook provides, check out the [Configuration chapter](../format/configuration/index.html) for more details. + +A very basic `book.toml` can be as simple as this: + +```toml +[book] +title = "My First Book" +``` + +### `SUMMARY.md` + +The next major part of a book is the summary file located at `src/SUMMARY.md`. +This file contains a list of all the chapters in the book. +Before a chapter can be viewed, it must be added to this list. + +Here's a basic summary file with a few chapters: + +```md +# Summary + +[Introduction](README.md) + +- [My First Chapter](my-first-chapter.md) +- [Nested example](nested/README.md) + - [Sub-chapter](nested/sub-chapter.md) +``` + +Try opening up `src/SUMMARY.md` in your editor and adding a few chapters. +If any of the chapter files do not exist, `mdbook` will automatically create them for you. + +For more details on other formatting options for the summary file, check out the [Summary chapter](../format/summary.md). + +### Source files + +The content of your book is all contained in the `src` directory. +Each chapter is a separate Markdown file. +Typically, each chapter starts with a level 1 heading with the title of the chapter. + +```md +# My First Chapter + +Fill out your content here. +``` + +The precise layout of the files is up to you. +The organization of the files will correspond to the HTML files generated, so keep in mind that the file layout is part of the URL of each chapter. + +While the `mdbook serve` command is running, you can open any of the chapter files and start editing them. +Each time you save the file, `mdbook` will rebuild the book and refresh your web browser. + +Check out the [Markdown chapter](../format/markdown.md) for more information on formatting the content of your chapters. + +All other files in the `src` directory will be included in the output. +So if you have images or other static files, just include them somewhere in the `src` directory. + +## Publishing a book + +Once you've written your book, you may want to host it somewhere for others to view. +The first step is to build the output of the book. +This can be done with the `mdbook build` command in the same directory where the `book.toml` file is located: + +```sh +mdbook build +``` + +This will generate a directory named `book` which contains the HTML content of your book. +You can then place this directory on any web server to host it. + +For more information about publishing and deploying, check out the [Continuous Integration chapter](../continuous-integration.md) for more. \ No newline at end of file diff --git a/website/doc/src/guide/installation.md b/website/doc/src/guide/installation.md new file mode 100644 index 00000000..128b1047 --- /dev/null +++ b/website/doc/src/guide/installation.md @@ -0,0 +1,52 @@ +# Installation + +There are multiple ways to install the mdBook CLI tool. +Choose any one of the methods below that best suit your needs. +If you are installing mdBook for automatic deployment, check out the [continuous integration] chapter for more examples on how to install. + +[continuous integration]: ../continuous-integration.md + +## Pre-compiled binaries + +Executable binaries are available for download on the [GitHub Releases page][releases]. +Download the binary for your platform (Windows, macOS, or Linux) and extract the archive. +The archive contains an `mdbook` executable which you can run to build your books. + +To make it easier to run, put the path to the binary into your `PATH`. + +[releases]: https://github.com/rust-lang/mdBook/releases + +## Build from source using Rust + +To build the `mdbook` executable from source, you will first need to install Rust and Cargo. +Follow the instructions on the [Rust installation page]. +mdBook currently requires at least Rust version 1.54. + +Once you have installed Rust, the following command can be used to build and install mdBook: + +```sh +cargo install mdbook +``` + +This will automatically download mdBook from [crates.io], build it, and install it in Cargo's global binary directory (`~/.cargo/bin/` by default). + +To uninstall, run the command `cargo uninstall mdbook`. + +[Rust installation page]: https://www.rust-lang.org/tools/install +[crates.io]: https://crates.io/ + +### Installing the latest master version + +The version published to crates.io will ever so slightly be behind the version hosted on GitHub. +If you need the latest version you can build the git version of mdBook yourself. +Cargo makes this ***super easy***! + +```sh +cargo install --git https://github.com/rust-lang/mdBook.git mdbook +``` + +Again, make sure to add the Cargo bin directory to your `PATH`. + +If you are interested in making modifications to mdBook itself, check out the [Contributing Guide] for more information. + +[Contributing Guide]: https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md diff --git a/website/doc/src/guide/reading.md b/website/doc/src/guide/reading.md new file mode 100644 index 00000000..cab3a865 --- /dev/null +++ b/website/doc/src/guide/reading.md @@ -0,0 +1,74 @@ +# Reading Books + +This chapter gives an introduction on how to interact with a book produced by mdBook. +This assumes you are reading an HTML book. +The options and formatting will be different for other output formats such as PDF. + +A book is organized into *chapters*. +Each chapter is a separate page. +Chapters can be nested into a hierarchy of sub-chapters. +Typically, each chapter will be organized into a series of *headings* to subdivide a chapter. + +## Navigation + +There are several methods for navigating through the chapters of a book. + +The **sidebar** on the left provides a list of all chapters. +Clicking on any of the chapter titles will load that page. + +The sidebar may not automatically appear if the window is too narrow, particularly on mobile displays. +In that situation, the menu icon (three horizontal bars) at the top-left of the page can be pressed to open and close the sidebar. + +The **arrow buttons** at the bottom of the page can be used to navigate to the previous or the next chapter. + +The **left and right arrow keys** on the keyboard can be used to navigate to the previous or the next chapter. + +## Top menu bar + +The menu bar at the top of the page provides some icons for interacting with the book. +The icons displayed will depend on the settings of how the book was generated. + +| Icon | Description | +|------|-------------| +| <i class="fa fa-bars"></i> | Opens and closes the chapter listing sidebar. | +| <i class="fa fa-paint-brush"></i> | Opens a picker to choose a different color theme. | +| <i class="fa fa-search"></i> | Opens a search bar for searching within the book. | +| <i class="fa fa-print"></i> | Instructs the web browser to print the entire book. | +| <i class="fa fa-github"></i> | Opens a link to the website that hosts the source code of the book. | +| <i class="fa fa-edit"></i> | Opens a page to directly edit the source of the page you are currently reading. | + +Tapping the menu bar will scroll the page to the top. + +## Search + +Each book has a built-in search system. +Pressing the search icon (<i class="fa fa-search"></i>) in the menu bar, or pressing the `S` key on the keyboard will open an input box for entering search terms. +Typing some terms will show matching chapters and sections in real time. + +Clicking any of the results will jump to that section. +The up and down arrow keys can be used to navigate the results, and enter will open the highlighted section. + +After loading a search result, the matching search terms will be highlighted in the text. +Clicking a highlighted word or pressing the `Esc` key will remove the highlighting. + +## Code blocks + +mdBook books are often used for programming projects, and thus support highlighting code blocks and samples. +Code blocks may contain several different icons for interacting with them: + +| Icon | Description | +|------|-------------| +| <i class="fa fa-copy"></i> | Copies the code block into your local clipboard, to allow pasting into another application. | +| <i class="fa fa-play"></i> | For Rust code examples, this will execute the sample code and display the compiler output just below the example (see [playground]). | +| <i class="fa fa-eye"></i> | For Rust code examples, this will toggle visibility of "hidden" lines. Sometimes, larger examples will hide lines which are not particularly relevant to what is being illustrated (see [hiding code lines]). | +| <i class="fa fa-history"></i> | For [editable code examples][editor], this will undo any changes you have made. | + +Here's an example: + +```rust +println!("Hello, World!"); +``` + +[editor]: ../format/theme/editor.md +[playground]: ../format/mdbook.md#rust-playground +[hiding code lines]: ../format/mdbook.md#hiding-code-lines diff --git a/website/doc/src/misc/contributors.md b/website/doc/src/misc/contributors.md new file mode 100644 index 00000000..362a21fe --- /dev/null +++ b/website/doc/src/misc/contributors.md @@ -0,0 +1,24 @@ +# Contributors + +Here is a list of the contributors who have helped improving mdBook. Big +shout-out to them! + +- [mdinger](https://github.com/mdinger) +- Kevin ([kbknapp](https://github.com/kbknapp)) +- Steve Klabnik ([steveklabnik](https://github.com/steveklabnik)) +- Adam Solove ([asolove](https://github.com/asolove)) +- Wayne Nilsen ([waynenilsen](https://github.com/waynenilsen)) +- [funnkill](https://github.com/funkill) +- Fu Gangqiang ([FuGangqiang](https://github.com/FuGangqiang)) +- [Michael-F-Bryan](https://github.com/Michael-F-Bryan) +- Chris Spiegel ([cspiegel](https://github.com/cspiegel)) +- [projektir](https://github.com/projektir) +- [Phaiax](https://github.com/Phaiax) +- Matt Ickstadt ([mattico](https://github.com/mattico)) +- Weihang Lo ([weihanglo](https://github.com/weihanglo)) +- Avision Ho ([avisionh](https://github.com/avisionh)) +- Vivek Akupatni ([apatniv](https://github.com/apatniv)) +- Eric Huss ([ehuss](https://github.com/ehuss)) +- Josh Rotenberg ([joshrotenberg](https://github.com/joshrotenberg)) + +If you feel you're missing from this list, feel free to add yourself in a PR. diff --git a/website/doc/theme/book.js b/website/doc/theme/book.js new file mode 100644 index 00000000..d40440c7 --- /dev/null +++ b/website/doc/theme/book.js @@ -0,0 +1,679 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else { + return code_block.textContent; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on http://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + Array + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = "<button class=\"fa fa-eye\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'fa fa-copy clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = '<i class=\"tooltiptext\"></i>'; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'fa fa-copy clip-button'; + copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>'; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var html = document.querySelector("html"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + html.classList.remove('sidebar-hidden') + html.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + + function hideSidebar() { + html.classList.remove('sidebar-visible') + html.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (html.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (html.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + html.classList.add('sidebar-resizing'); + } + function resize(e) { + var pos = (e.clientX - sidebar.offsetLeft); + if (pos < 20) { + hideSidebar(); + } else { + if (html.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + html.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); + + // Scroll sidebar to current active section + var activeSection = document.getElementById("sidebar").querySelector(".active"); + if (activeSection) { + // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView + activeSection.scrollIntoView({ block: 'center' }); + } +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + break; + case 'ArrowLeft': + e.preventDefault(); + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'fa fa-copy clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'fa fa-copy tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + menu.classList.remove('bordered'); + document.addEventListener('scroll', function () { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + }, { passive: true }); + })(); +})(); diff --git a/website/doc/theme/css/chrome.css b/website/doc/theme/css/chrome.css new file mode 100644 index 00000000..10fa4b36 --- /dev/null +++ b/website/doc/theme/css/chrome.css @@ -0,0 +1,534 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +@import 'variables.css'; + +::-webkit-scrollbar { + background: var(--bg); +} +::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} +html { + scrollbar-color: var(--scrollbar) var(--bg); +} +#searchresults a, +.content a:link, +a:visited, +a > .hljs { + color: var(--links); +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-bottom-color: var(--bg); + border-bottom-width: 1px; + border-bottom-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-bottom-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +.no-js .left-buttons { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js .menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-top: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +.previous { + float: left; +} + +.next { + float: right; + right: var(--page-padding); +} + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +@media only screen and (max-width: 1380px) { + .sidebar-visible .nav-wide-wrapper { display: none; } + .sidebar-visible .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-left: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } +} +pre > code { + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-top: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding: 0 3px 1px 3px; + margin: 0 -3px -1px -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin: 5px auto 0px auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding: 18px 0 0 5px; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); + border-bottom: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-left: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin: 5px 0 0 20px; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.js:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} +.sidebar-hidden .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +.sidebar-visible .page-wrapper { + transform: translateX(var(--sidebar-width)); +} +@media only screen and (min-width: 620px) { + .sidebar-visible .page-wrapper { + transform: none; + margin-left: var(--sidebar-width); + } +} + +.chapter { + list-style: none outside none; + padding-left: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-top: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-left: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; +} +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 10px; + line-height: 25px; + white-space: nowrap; + text-align: left; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} +.theme-popup .theme:hover:first-child, +.theme-popup .theme:hover:last-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} diff --git a/website/doc/theme/css/general.css b/website/doc/theme/css/general.css new file mode 100644 index 00000000..0e4f07a5 --- /dev/null +++ b/website/doc/theme/css/general.css @@ -0,0 +1,191 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; + font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-top: 2.5em; } +h4, h5 { margin-top: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-top: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-left: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; +} +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-top: .1em solid var(--quote-border); + border-bottom: .1em solid var(--quote-border); +} + + +:not(.footnote-definition) + .footnote-definition, +.footnote-definition + :not(.footnote-definition) { + margin-top: 2em; +} +.footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +.footnote-definition p { + display: inline; +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} diff --git a/website/doc/theme/css/print.css b/website/doc/theme/css/print.css new file mode 100644 index 00000000..5e690f75 --- /dev/null +++ b/website/doc/theme/css/print.css @@ -0,0 +1,54 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none; + margin-left: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + background-color: #666666; + border-radius: 5px; + + /* Force background to be printed in Chrome */ + -webkit-print-color-adjust: exact; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/website/doc/theme/css/variables.css b/website/doc/theme/css/variables.css new file mode 100644 index 00000000..56b634bc --- /dev/null +++ b/website/doc/theme/css/variables.css @@ -0,0 +1,253 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/website/doc/theme/favicon.png b/website/doc/theme/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b1aa16c4dcb6c872cb5af799bfc9b5552c7b9e GIT binary patch literal 5679 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 A;{X5v literal 0 HcmV?d00001 diff --git a/website/doc/theme/favicon.svg b/website/doc/theme/favicon.svg new file mode 100644 index 00000000..90e0ea58 --- /dev/null +++ b/website/doc/theme/favicon.svg @@ -0,0 +1,22 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 199.7 184.2"> + <style> + @media (prefers-color-scheme: dark) { + svg { fill: white; } + } + </style> +<path d="M189.5,36.8c0.2,2.8,0,5.1-0.6,6.8L153,162c-0.6,2.1-2,3.7-4.2,5c-2.2,1.2-4.4,1.9-6.7,1.9H31.4c-9.6,0-15.3-2.8-17.3-8.4 + c-0.8-2.2-0.8-3.9,0.1-5.2c0.9-1.2,2.4-1.8,4.6-1.8H123c7.4,0,12.6-1.4,15.4-4.1s5.7-8.9,8.6-18.4l32.9-108.6 + c1.8-5.9,1-11.1-2.2-15.6S169.9,0,164,0H72.7c-1,0-3.1,0.4-6.1,1.1l0.1-0.4C64.5,0.2,62.6,0,61,0.1s-3,0.5-4.3,1.4 + c-1.3,0.9-2.4,1.8-3.2,2.8S52,6.5,51.2,8.1c-0.8,1.6-1.4,3-1.9,4.3s-1.1,2.7-1.8,4.2c-0.7,1.5-1.3,2.7-2,3.7c-0.5,0.6-1.2,1.5-2,2.5 + s-1.6,2-2.2,2.8s-0.9,1.5-1.1,2.2c-0.2,0.7-0.1,1.8,0.2,3.2c0.3,1.4,0.4,2.4,0.4,3.1c-0.3,3-1.4,6.9-3.3,11.6 + c-1.9,4.7-3.6,8.1-5.1,10.1c-0.3,0.4-1.2,1.3-2.6,2.7c-1.4,1.4-2.3,2.6-2.6,3.7c-0.3,0.4-0.3,1.5-0.1,3.4c0.3,1.8,0.4,3.1,0.3,3.8 + c-0.3,2.7-1.3,6.3-3,10.8c-1.7,4.5-3.4,8.2-5,11c-0.2,0.5-0.9,1.4-2,2.8c-1.1,1.4-1.8,2.5-2,3.4c-0.2,0.6-0.1,1.8,0.1,3.4 + c0.2,1.6,0.2,2.8-0.1,3.6c-0.6,3-1.8,6.7-3.6,11c-1.8,4.3-3.6,7.9-5.4,11c-0.5,0.8-1.1,1.7-2,2.8c-0.8,1.1-1.5,2-2,2.8 + s-0.8,1.6-1,2.5c-0.1,0.5,0,1.3,0.4,2.3c0.3,1.1,0.4,1.9,0.4,2.6c-0.1,1.1-0.2,2.6-0.5,4.4c-0.2,1.8-0.4,2.9-0.4,3.2 + c-1.8,4.8-1.7,9.9,0.2,15.2c2.2,6.2,6.2,11.5,11.9,15.8c5.7,4.3,11.7,6.4,17.8,6.4h110.7c5.2,0,10.1-1.7,14.7-5.2s7.7-7.8,9.2-12.9 + l33-108.6c1.8-5.8,1-10.9-2.2-15.5C194.9,39.7,192.6,38,189.5,36.8z M59.6,122.8L73.8,80c0,0,7,0,10.8,0s28.8-1.7,25.4,17.5 + c-3.4,19.2-18.8,25.2-36.8,25.4S59.6,122.8,59.6,122.8z M78.6,116.8c4.7-0.1,18.9-2.9,22.1-17.1S89.2,86.3,89.2,86.3l-8.9,0 + l-10.2,30.5C70.2,116.9,74,116.9,78.6,116.8z M75.3,68.7L89,26.2h9.8l0.8,34l23.6-34h9.9l-13.6,42.5h-7.1l12.5-35.4l-24.5,35.4h-6.8 + l-0.8-35L82,68.7H75.3z"/> +</svg> +<!-- Original image Copyright Dave Gandy — CC BY 4.0 License --> diff --git a/website/doc/theme/highlight.css b/website/doc/theme/highlight.css new file mode 100644 index 00000000..ba57b82b --- /dev/null +++ b/website/doc/theme/highlight.css @@ -0,0 +1,82 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/website/doc/theme/highlight.js b/website/doc/theme/highlight.js new file mode 100644 index 00000000..180385b7 --- /dev/null +++ b/website/doc/theme/highlight.js @@ -0,0 +1,6 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/website/doc/theme/index.hbs b/website/doc/theme/index.hbs new file mode 100644 index 00000000..31a74b5c --- /dev/null +++ b/website/doc/theme/index.hbs @@ -0,0 +1,254 @@ +<!-- Provide site root to javascript --> +<script type="text/javascript"> + var path_to_root = "{{ path_to_root }}"; + var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}"; +</script> + +<!-- Work around some values being stored in localStorage wrapped in quotes --> +<script type="text/javascript"> + try { + var theme = localStorage.getItem('mdbook-theme'); + var sidebar = localStorage.getItem('mdbook-sidebar'); + + if (theme.startsWith('"') && theme.endsWith('"')) { + localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); + } + + if (sidebar.startsWith('"') && sidebar.endsWith('"')) { + localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); + } + } catch (e) { } +</script> + +<!-- Set the theme before any content is loaded, prevents flash --> +<script type="text/javascript"> + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } + if (theme === null || theme === undefined) { theme = default_theme; } + var html = document.querySelector('html'); + html.classList.remove('no-js') + html.classList.remove('{{ default_theme }}') + html.classList.add(theme); + html.classList.add('js'); +</script> + +<!-- Hide / unhide sidebar before it is displayed --> +<script type="text/javascript"> + var html = document.querySelector('html'); + var sidebar = 'hidden'; + if (document.body.clientWidth >= 1080) { + try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } + sidebar = sidebar || 'visible'; + } + html.classList.remove('sidebar-visible'); + html.classList.add("sidebar-" + sidebar); +</script> + +<nav id="sidebar" class="sidebar" aria-label="Table of contents"> + <div class="sidebar-scrollbox"> + {{#toc}}{{/toc}} + </div> + <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> +</nav> + +<div id="page-wrapper" class="page-wrapper"> + + <div class="page"> + {{> header}} + <div id="menu-bar-hover-placeholder"></div> + <div id="menu-bar" class="menu-bar sticky bordered"> + <div class="left-buttons"> + <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> + <i class="fa fa-bars"></i> + </button> + <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> + <i class="fa fa-paint-brush"></i> + </button> + <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> + <li role="none"><button role="menuitem" class="theme" id="light">{{ theme_option "Light" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="rust">{{ theme_option "Rust" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="coal">{{ theme_option "Coal" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="navy">{{ theme_option "Navy" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="ayu">{{ theme_option "Ayu" }}</button></li> + </ul> + {{#if search_enabled}} + <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> + <i class="fa fa-search"></i> + </button> + {{/if}} + </div> + + <h1 class="menu-title">{{ book_title }}</h1> + + <div class="right-buttons"> + {{#if print_enable}} + <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book"> + <i id="print-button" class="fa fa-print"></i> + </a> + {{/if}} + {{#if git_repository_url}} + <a href="{{git_repository_url}}" title="Git repository" aria-label="Git repository"> + <i id="git-repository-button" class="fa {{git_repository_icon}}"></i> + </a> + {{/if}} + {{#if git_repository_edit_url}} + <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit"> + <i id="git-edit-button" class="fa fa-edit"></i> + </a> + {{/if}} + + </div> + </div> + + {{#if search_enabled}} + <div id="search-wrapper" class="hidden"> + <form id="searchbar-outer" class="searchbar-outer"> + <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> + </form> + <div id="searchresults-outer" class="searchresults-outer hidden"> + <div id="searchresults-header" class="searchresults-header"></div> + <ul id="searchresults"> + </ul> + </div> + </div> + {{/if}} + + <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> + <script type="text/javascript"> + document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); + document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); + Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { + link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); + }); + </script> + + <div id="content" class="content"> + <main> + {{{ content }}} + </main> + + <nav class="nav-wrapper" aria-label="Page navigation"> + <!-- Mobile navigation buttons --> + {{#previous}} + <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> + <i class="fa fa-angle-left"></i> + </a> + {{/previous}} + + {{#next}} + <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> + <i class="fa fa-angle-right"></i> + </a> + {{/next}} + + <div style="clear: both"></div> + </nav> + </div> + </div> + + <nav class="nav-wide-wrapper" aria-label="Page navigation"> + {{#previous}} + <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> + <i class="fa fa-angle-left"></i> + </a> + {{/previous}} + + {{#next}} + <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> + <i class="fa fa-angle-right"></i> + </a> + {{/next}} + </nav> + +</div> + +{{#if live_reload_endpoint}} +<!-- Livereload script (if served using the cli tool) --> +<script type="text/javascript"> + const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; + const wsAddress = wsProtocol + "//" + location.host + "/" + "{{{live_reload_endpoint}}}"; + const socket = new WebSocket(wsAddress); + socket.onmessage = function (event) { + if (event.data === "reload") { + socket.close(); + location.reload(); + } + }; + + window.onbeforeunload = function() { + socket.close(); + } +</script> +{{/if}} + +{{#if google_analytics}} +<!-- Google Analytics Tag --> +<script type="text/javascript"> + var localAddrs = ["localhost", "127.0.0.1", ""]; + + // make sure we don't activate google analytics if the developer is + // inspecting the book locally... + if (localAddrs.indexOf(document.location.hostname) === -1) { + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', '{{google_analytics}}', 'auto'); + ga('send', 'pageview'); + } +</script> +{{/if}} + +{{#if playground_line_numbers}} +<script type="text/javascript"> + window.playground_line_numbers = true; +</script> +{{/if}} + +{{#if playground_copyable}} +<script type="text/javascript"> + window.playground_copyable = true; +</script> +{{/if}} + +{{#if playground_js}} +<script src="{{ path_to_root }}ace.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}editor.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}mode-rust.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}theme-dawn.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}theme-tomorrow_night.js" type="text/javascript" charset="utf-8"></script> +{{/if}} + +{{#if search_js}} +<script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script> +{{/if}} + +<script src="{{ path_to_root }}clipboard.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}highlight.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script> + +<!-- Custom JS scripts --> +{{#each additional_js}} +<script type="text/javascript" src="{{ ../path_to_root }}{{this}}"></script> +{{/each}} + +{{#if is_print}} +{{#if mathjax_support}} +<script type="text/javascript"> +window.addEventListener('load', function() { + MathJax.Hub.Register.StartupHook('End', function() { + window.setTimeout(window.print, 100); + }); +}); +</script> +{{else}} +<script type="text/javascript"> +window.addEventListener('load', function() { + window.setTimeout(window.print, 100); +}); +</script> +{{/if}} +{{/if}} diff --git a/website/examples/nop-preprocessor.rs b/website/examples/nop-preprocessor.rs new file mode 100644 index 00000000..ace40093 --- /dev/null +++ b/website/examples/nop-preprocessor.rs @@ -0,0 +1,104 @@ +use crate::nop_lib::Nop; +use clap::{App, Arg, ArgMatches}; +use mdbook::book::Book; +use mdbook::errors::Error; +use mdbook::preprocess::{CmdPreprocessor, Preprocessor, PreprocessorContext}; +use semver::{Version, VersionReq}; +use std::io; +use std::process; + +pub fn make_app() -> App<'static> { + App::new("nop-preprocessor") + .about("A mdbook preprocessor which does precisely nothing") + .subcommand( + App::new("supports") + .arg(Arg::new("renderer").required(true)) + .about("Check whether a renderer is supported by this preprocessor"), + ) +} + +fn main() { + let matches = make_app().get_matches(); + + // Users will want to construct their own preprocessor here + let preprocessor = Nop::new(); + + if let Some(sub_args) = matches.subcommand_matches("supports") { + handle_supports(&preprocessor, sub_args); + } else if let Err(e) = handle_preprocessing(&preprocessor) { + eprintln!("{}", e); + process::exit(1); + } +} + +fn handle_preprocessing(pre: &dyn Preprocessor) -> Result<(), Error> { + let (ctx, book) = CmdPreprocessor::parse_input(io::stdin())?; + + let book_version = Version::parse(&ctx.mdbook_version)?; + let version_req = VersionReq::parse(mdbook::MDBOOK_VERSION)?; + + if !version_req.matches(&book_version) { + eprintln!( + "Warning: The {} plugin was built against version {} of mdbook, \ + but we're being called from version {}", + pre.name(), + mdbook::MDBOOK_VERSION, + ctx.mdbook_version + ); + } + + let processed_book = pre.run(&ctx, book)?; + serde_json::to_writer(io::stdout(), &processed_book)?; + + Ok(()) +} + +fn handle_supports(pre: &dyn Preprocessor, sub_args: &ArgMatches) -> ! { + let renderer = sub_args.value_of("renderer").expect("Required argument"); + let supported = pre.supports_renderer(renderer); + + // Signal whether the renderer is supported by exiting with 1 or 0. + if supported { + process::exit(0); + } else { + process::exit(1); + } +} + +/// The actual implementation of the `Nop` preprocessor. This would usually go +/// in your main `lib.rs` file. +mod nop_lib { + use super::*; + + /// A no-op preprocessor. + pub struct Nop; + + impl Nop { + pub fn new() -> Nop { + Nop + } + } + + impl Preprocessor for Nop { + fn name(&self) -> &str { + "nop-preprocessor" + } + + fn run(&self, ctx: &PreprocessorContext, book: Book) -> Result<Book, Error> { + // In testing we want to tell the preprocessor to blow up by setting a + // particular config value + if let Some(nop_cfg) = ctx.config.get_preprocessor(self.name()) { + if nop_cfg.contains_key("blow-up") { + anyhow::bail!("Boom!!1!"); + } + } + + // we *are* a no-op preprocessor after all + Ok(book) + } + + fn supports_renderer(&self, renderer: &str) -> bool { + renderer != "not-supported" + } + } +} diff --git a/website/src/main.rs b/website/src/main.rs index 4b892d2f..407284da 100644 --- a/website/src/main.rs +++ b/website/src/main.rs @@ -1,8 +1,14 @@ use pagetop::prelude::*; +mod mdbook; + struct PageTopWebSite; -impl AppTrait for PageTopWebSite {} +impl AppTrait for PageTopWebSite { + fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { + vec![&mdbook::MdBook] + } +} #[actix_web::main] async fn main() -> std::io::Result<()> { diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs new file mode 100644 index 00000000..48eb6eb0 --- /dev/null +++ b/website/src/mdbook.rs @@ -0,0 +1,153 @@ +use actix_web::ResponseError; +use pagetop::prelude::*; + +use static_files::Resource; + +use std::collections::HashMap; + +include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); + +static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(|| + generate() +); + +pub const MODULE_MDBOOK: &str = "pagetop::website::module::mdbook"; + +pub struct MdBook; + +impl ModuleTrait for MdBook { + fn handler(&self) -> &'static str { + MODULE_MDBOOK + } + + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { + cfg.service( + app::web::scope("/doc") + .route("{tail:.*html$}", app::web::get().to(mdbook_page)) + .route("{tail:.*$}", app::web::get().to(mdbook_resource)) + ); + } +} + +async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError> { + // Remove initial "/doc/" from path: + let path = &request.path()[5..]; + + if let Some(content) = MDBOOK.get(path) { + if let Ok(html) = std::str::from_utf8(content.data) { + let mut page = Page::new().with_title("Documentación"); + page.context() + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/variables.css")) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/general.css")) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/chrome.css")) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add( + StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print) + ) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/FontAwesome/css/font-awesome.css")) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/fonts/fonts.css")) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/highlight.css")) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/tomorrow-night.css")) + )) + .alter(InContextOp::StyleSheet( + AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/ayu-highlight.css")) + )); + page.add_to( + "region-content", + Container::new() + .with_id("mdbook") + .with_component(Html::with(html! { (PreEscaped(html)) })) + ) + .render() + } else { + Err(FatalError::NotFound) + } + } else { + Err(FatalError::NotFound) + } +} + +async fn mdbook_resource(request: app::HttpRequest) -> app::HttpResponse { + // Remove initial "/doc/" from path: + let path = &request.path()[5..]; + + // From https://github.com/kilork/actix-web-static-files/blob/master/src/resource_files.rs, see + // functions respond_to(), any_match() and none_match(). + if let Some(file) = &MDBOOK.get(path) { + let etag = Some(app::http::header::EntityTag::new_strong(format!( + "{:x}:{:x}", + file.data.len(), + file.modified + ))); + + let precondition_failed = !any_match(etag.as_ref(), &request); + + let not_modified = !none_match(etag.as_ref(), &request); + + let mut resp = app::HttpResponse::build(app::http::StatusCode::OK); + resp.insert_header((app::http::header::CONTENT_TYPE, file.mime_type)); + + if let Some(etag) = etag { + resp.insert_header(app::http::header::ETag(etag)); + } + + if precondition_failed { + return FatalError::PreconditionFailed.error_response(); + } else if not_modified { + return FatalError::NotModified.error_response(); + } + + resp.body(file.data) + } else { + FatalError::NotFound.error_response() + } +} + +/// Returns true if `request` has no `If-Match` header or one which matches `etag`. +fn any_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { + match request.get_header::<app::http::header::IfMatch>() { + None | Some(app::http::header::IfMatch::Any) => true, + Some(app::http::header::IfMatch::Items(ref items)) => { + if let Some(some_etag) = etag { + for item in items { + if item.strong_eq(some_etag) { + return true; + } + } + } + false + } + } +} + +/// Returns true if `request` doesn't have an `If-None-Match` header matching `req`. +fn none_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { + match request.get_header::<app::http::header::IfNoneMatch>() { + Some(app::http::header::IfNoneMatch::Any) => false, + Some(app::http::header::IfNoneMatch::Items(ref items)) => { + if let Some(some_etag) = etag { + for item in items { + if item.weak_eq(some_etag) { + return false; + } + } + } + true + } + None => true, + } +} From eb3e354f2f9f7f4b5b1b93337c55c28a786f6492 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Jul 2022 19:36:09 +0200 Subject: [PATCH 147/853] Actualiza los estilos para encajarlos en los temas --- website/doc/book.toml | 2 +- website/doc/theme/css/chrome.css | 712 ++++++++++++++-------------- website/doc/theme/css/general.css | 252 +++++----- website/doc/theme/css/print.css | 73 +-- website/doc/theme/css/variables.css | 348 +++++++------- website/src/mdbook.rs | 12 +- 6 files changed, 705 insertions(+), 694 deletions(-) diff --git a/website/doc/book.toml b/website/doc/book.toml index 31213b48..2facf58a 100644 --- a/website/doc/book.toml +++ b/website/doc/book.toml @@ -3,7 +3,7 @@ authors = ["Manuel Cillero"] language = "en" multilingual = false src = "src" -title = "PageTop Guide" +title = "PageTop Guides" [build] build-dir = "../static/doc" diff --git a/website/doc/theme/css/chrome.css b/website/doc/theme/css/chrome.css index 10fa4b36..f33ab4e3 100644 --- a/website/doc/theme/css/chrome.css +++ b/website/doc/theme/css/chrome.css @@ -3,257 +3,263 @@ @import 'variables.css'; ::-webkit-scrollbar { - background: var(--bg); + background: var(--bg); } ::-webkit-scrollbar-thumb { - background: var(--scrollbar); + background: var(--scrollbar); } -html { - scrollbar-color: var(--scrollbar) var(--bg); + +#mdbook { + position: relative; + scrollbar-color: var(--scrollbar) var(--bg); } -#searchresults a, -.content a:link, -a:visited, -a > .hljs { - color: var(--links); +#mdbook .content { + position: relative; +} + +#mdbook #searchresults a, +#mdbook .content a:link, +#mdbook a:visited, +#mdbook a > .hljs { + color: var(--links); } /* Menu Bar */ #menu-bar, #menu-bar-hover-placeholder { - z-index: 101; - margin: auto calc(0px - var(--page-padding)); + z-index: 101; + margin: auto calc(0px - var(--page-padding)); } #menu-bar { - position: relative; - display: flex; - flex-wrap: wrap; - background-color: var(--bg); - border-bottom-color: var(--bg); - border-bottom-width: 1px; - border-bottom-style: solid; + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-bottom-color: var(--bg); + border-bottom-width: 1px; + border-bottom-style: solid; } #menu-bar.sticky, .js #menu-bar-hover-placeholder:hover + #menu-bar, .js #menu-bar:hover, .js.sidebar-visible #menu-bar { - position: -webkit-sticky; - position: sticky; - top: 0 !important; + position: -webkit-sticky; + position: sticky; + top: 0 !important; } #menu-bar-hover-placeholder { - position: sticky; - position: -webkit-sticky; - top: 0; - height: var(--menu-bar-height); + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); } #menu-bar.bordered { - border-bottom-color: var(--table-border-color); + border-bottom-color: var(--table-border-color); } #menu-bar i, #menu-bar .icon-button { - position: relative; - padding: 0 8px; - z-index: 10; - line-height: var(--menu-bar-height); - cursor: pointer; - transition: color 0.5s; + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; } @media only screen and (max-width: 420px) { - #menu-bar i, #menu-bar .icon-button { - padding: 0 5px; - } + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } } -.icon-button { - border: none; - background: none; - padding: 0; - color: inherit; +#mdbook .icon-button { + border: none; + background: none; + padding: 0; + color: inherit; } -.icon-button i { - margin: 0; +#mdbook .icon-button i { + margin: 0; } -.right-buttons { - margin: 0 15px; +#mdbook .right-buttons { + margin: 0 15px; } -.right-buttons a { - text-decoration: none; +#mdbook .right-buttons a { + text-decoration: none; } -.left-buttons { - display: flex; - margin: 0 5px; +#mdbook .left-buttons { + display: flex; + margin: 0 5px; } -.no-js .left-buttons { - display: none; +.no-js #mdbook .left-buttons { + display: none; } -.menu-title { - display: inline-block; - font-weight: 200; - font-size: 2.4rem; - line-height: var(--menu-bar-height); - text-align: center; - margin: 0; - flex: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; +#mdbook .menu-title { + display: inline-block; + font-weight: 200; + font-size: 1.8rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -.js .menu-title { - cursor: pointer; +.js #mdbook .menu-title { + cursor: pointer; } -.menu-bar, -.menu-bar:visited, -.nav-chapters, -.nav-chapters:visited, -.mobile-nav-chapters, -.mobile-nav-chapters:visited, -.menu-bar .icon-button, -.menu-bar a i { - color: var(--icons); +#mdbook .menu-bar, +#mdbook .menu-bar:visited, +#mdbook .nav-chapters, +#mdbook .nav-chapters:visited, +#mdbook .mobile-nav-chapters, +#mdbook .mobile-nav-chapters:visited, +#mdbook .menu-bar .icon-button, +#mdbook .menu-bar a i { + color: var(--icons); } -.menu-bar i:hover, -.menu-bar .icon-button:hover, -.nav-chapters:hover, -.mobile-nav-chapters i:hover { - color: var(--icons-hover); +#mdbook .menu-bar i:hover, +#mdbook .menu-bar .icon-button:hover, +#mdbook .nav-chapters:hover, +#mdbook .mobile-nav-chapters i:hover { + color: var(--icons-hover); } /* Nav Icons */ -.nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; +#mdbook .nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; - position: fixed; - top: 0; - bottom: 0; - margin: 0; - max-width: 150px; - min-width: 90px; + position: absolute; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; - transition: color 0.5s, background-color 0.5s; + transition: color 0.5s, background-color 0.5s; } -.nav-chapters:hover { - text-decoration: none; - background-color: var(--theme-hover); - transition: background-color 0.15s, color 0.15s; +#mdbook .nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; } -.nav-wrapper { - margin-top: 50px; - display: none; +#mdbook .nav-wrapper { + margin-top: 50px; + display: none; } -.mobile-nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - width: 90px; - border-radius: 5px; - background-color: var(--sidebar-bg); +#mdbook .mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); } -.previous { - float: left; +#mdbook .previous { + float: left; } -.next { - float: right; - right: var(--page-padding); +#mdbook .next { + float: right; + right: var(--page-padding); } @media only screen and (max-width: 1080px) { - .nav-wide-wrapper { display: none; } - .nav-wrapper { display: block; } + #mdbook .nav-wide-wrapper { display: none; } + #mdbook .nav-wrapper { display: block; } } @media only screen and (max-width: 1380px) { - .sidebar-visible .nav-wide-wrapper { display: none; } - .sidebar-visible .nav-wrapper { display: block; } + .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } + .sidebar-visible #mdbook .nav-wrapper { display: block; } } /* Inline code */ -:not(pre) > .hljs { - display: inline; - padding: 0.1em 0.3em; - border-radius: 3px; +#mdbook :not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; } -:not(pre):not(a) > .hljs { - color: var(--inline-code-color); - overflow-x: initial; +#mdbook :not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; } -a:hover > .hljs { - text-decoration: underline; +#mdbook a:hover > .hljs { + text-decoration: underline; } -pre { - position: relative; +#mdbook pre { + position: relative; } -pre > .buttons { - position: absolute; - z-index: 100; - right: 0px; - top: 2px; - margin: 0px; - padding: 2px 0px; +#mdbook pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; - color: var(--sidebar-fg); - cursor: pointer; - visibility: hidden; - opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; } -pre:hover > .buttons { - visibility: visible; - opacity: 1 +#mdbook pre:hover > .buttons { + visibility: visible; + opacity: 1 } -pre > .buttons :hover { - color: var(--sidebar-active); - border-color: var(--icons-hover); - background-color: var(--theme-hover); +#mdbook pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); } -pre > .buttons i { - margin-left: 8px; +#mdbook pre > .buttons i { + margin-left: 8px; } -pre > .buttons button { - cursor: inherit; - margin: 0px 5px; - padding: 3px 5px; - font-size: 14px; +#mdbook pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: var(--icons); - background-color: var(--theme-popup-bg); - transition: 100ms; - transition-property: color,border-color,background-color; - color: var(--icons); + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); } @media (pointer: coarse) { - pre > .buttons button { - /* On mobile, make it easier to tap buttons. */ - padding: 0.3rem 1rem; - } + #mdbook pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } } -pre > code { - padding: 1rem; +#mdbook pre > code { + padding: 1rem; } /* FIXME: ACE editors overlap their buttons because ACE does absolute @@ -261,274 +267,274 @@ pre > code { can think of is to move the padding to the outer pre tag (or insert a div wrapper), but that would require fixing a whole bunch of CSS rules. */ -.hljs.ace_editor { - padding: 0rem 0rem; +#mdbook .hljs.ace_editor { + padding: 0rem 0rem; } -pre > .result { - margin-top: 10px; +#mdbook pre > .result { + margin-top: 10px; } /* Search */ #searchresults a { - text-decoration: none; + text-decoration: none; } -mark { - border-radius: 2px; - padding: 0 3px 1px 3px; - margin: 0 -3px -1px -3px; - background-color: var(--search-mark-bg); - transition: background-color 300ms linear; - cursor: pointer; +#mdbook mark { + border-radius: 2px; + padding: 0 3px 1px 3px; + margin: 0 -3px -1px -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; } -mark.fade-out { - background-color: rgba(0,0,0,0) !important; - cursor: auto; +#mdbook mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; } -.searchbar-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); +#mdbook .searchbar-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); } #searchbar { - width: 100%; - margin: 5px auto 0px auto; - padding: 10px 16px; - transition: box-shadow 300ms ease-in-out; - border: 1px solid var(--searchbar-border-color); - border-radius: 3px; - background-color: var(--searchbar-bg); - color: var(--searchbar-fg); + width: 100%; + margin: 5px auto 0px auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); } #searchbar:focus, #searchbar.active { - box-shadow: 0 0 3px var(--searchbar-shadow-color); + box-shadow: 0 0 3px var(--searchbar-shadow-color); } -.searchresults-header { - font-weight: bold; - font-size: 1em; - padding: 18px 0 0 5px; - color: var(--searchresults-header-fg); +#mdbook .searchresults-header { + font-weight: bold; + font-size: 1em; + padding: 18px 0 0 5px; + color: var(--searchresults-header-fg); } -.searchresults-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); - border-bottom: 1px dashed var(--searchresults-border-color); +#mdbook .searchresults-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); + border-bottom: 1px dashed var(--searchresults-border-color); } -ul#searchresults { - list-style: none; - padding-left: 20px; +#mdbook ul#searchresults { + list-style: none; + padding-left: 20px; } -ul#searchresults li { - margin: 10px 0px; - padding: 2px; - border-radius: 2px; +#mdbook ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; } -ul#searchresults li.focus { - background-color: var(--searchresults-li-bg); +#mdbook ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); } -ul#searchresults span.teaser { - display: block; - clear: both; - margin: 5px 0 0 20px; - font-size: 0.8em; +#mdbook ul#searchresults span.teaser { + display: block; + clear: both; + margin: 5px 0 0 20px; + font-size: 0.8em; } -ul#searchresults span.teaser em { - font-weight: bold; - font-style: normal; +#mdbook ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; } /* Sidebar */ - -.sidebar { - position: fixed; - left: 0; - top: 0; - bottom: 0; - width: var(--sidebar-width); - font-size: 0.875em; - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - overscroll-behavior-y: contain; - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); +#mdbook .sidebar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); } .sidebar-resizing { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } -.js:not(.sidebar-resizing) .sidebar { - transition: transform 0.3s; /* Animation: slide away */ +.js:not(.sidebar-resizing) #mdbook .sidebar { + transition: transform 0.3s; /* Animation: slide away */ } -.sidebar code { - line-height: 2em; +#mdbook .sidebar code { + line-height: 2em; } -.sidebar .sidebar-scrollbox { - overflow-y: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 10px 10px; +#mdbook .sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; } -.sidebar .sidebar-resize-handle { - position: absolute; - cursor: col-resize; - width: 0; - right: 0; - top: 0; - bottom: 0; +#mdbook .sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; } -.js .sidebar .sidebar-resize-handle { - cursor: col-resize; - width: 5px; +.js #mdbook .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; } -.sidebar-hidden .sidebar { - transform: translateX(calc(0px - var(--sidebar-width))); +.sidebar-hidden #mdbook .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); } -.sidebar::-webkit-scrollbar { - background: var(--sidebar-bg); +#mdbook .sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); } -.sidebar::-webkit-scrollbar-thumb { - background: var(--scrollbar); +#mdbook .sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); } -.sidebar-visible .page-wrapper { - transform: translateX(var(--sidebar-width)); +.sidebar-visible #mdbook .page-wrapper { + transform: translateX(var(--sidebar-width)); } @media only screen and (min-width: 620px) { - .sidebar-visible .page-wrapper { - transform: none; - margin-left: var(--sidebar-width); - } + .sidebar-visible #mdbook .page-wrapper { + transform: none; + margin-left: var(--sidebar-width); + } } -.chapter { - list-style: none outside none; - padding-left: 0; - line-height: 2.2em; +#mdbook .chapter { + list-style: none outside none; + padding-left: 0; + line-height: 2.2em; } -.chapter ol { - width: 100%; +#mdbook .chapter ol { + width: 100%; } -.chapter li { - display: flex; - color: var(--sidebar-non-existant); +#mdbook .chapter li { + display: flex; + color: var(--sidebar-non-existant); } -.chapter li a { - display: block; - padding: 0; - text-decoration: none; - color: var(--sidebar-fg); +#mdbook .chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); } -.chapter li a:hover { - color: var(--sidebar-active); +#mdbook .chapter li a:hover { + color: var(--sidebar-active); } -.chapter li a.active { - color: var(--sidebar-active); +#mdbook .chapter li a.active { + color: var(--sidebar-active); } -.chapter li > a.toggle { - cursor: pointer; - display: block; - margin-left: auto; - padding: 0 10px; - user-select: none; - opacity: 0.68; +#mdbook .chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; } -.chapter li > a.toggle div { - transition: transform 0.5s; +#mdbook .chapter li > a.toggle div { + transition: transform 0.5s; } /* collapse the section */ -.chapter li:not(.expanded) + li > ol { - display: none; +#mdbook .chapter li:not(.expanded) + li > ol { + display: none; } -.chapter li.chapter-item { - line-height: 1.5em; - margin-top: 0.6em; +#mdbook .chapter li.chapter-item { + line-height: 1.5em; + margin-top: 0.6em; } -.chapter li.expanded > a.toggle div { - transform: rotate(90deg); +#mdbook .chapter li.expanded > a.toggle div { + transform: rotate(90deg); } -.spacer { - width: 100%; - height: 3px; - margin: 5px 0px; +#mdbook .spacer { + width: 100%; + height: 3px; + margin: 5px 0px; } -.chapter .spacer { - background-color: var(--sidebar-spacer); +#mdbook .chapter .spacer { + background-color: var(--sidebar-spacer); } @media (-moz-touch-enabled: 1), (pointer: coarse) { - .chapter li a { padding: 5px 0; } - .spacer { margin: 10px 0; } + #mdbook .chapter li a { padding: 5px 0; } + #mdbook .spacer { margin: 10px 0; } } -.section { - list-style: none outside none; - padding-left: 20px; - line-height: 1.9em; +#mdbook .section { + list-style: none outside none; + margin: 0; + padding: 0 0 0 20px; + line-height: 1.9em; } /* Theme Menu Popup */ -.theme-popup { - position: absolute; - left: 10px; - top: var(--menu-bar-height); - z-index: 1000; - border-radius: 4px; - font-size: 0.7em; - color: var(--fg); - background: var(--theme-popup-bg); - border: 1px solid var(--theme-popup-border); - margin: 0; - padding: 0; - list-style: none; - display: none; +#mdbook .theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; } -.theme-popup .default { - color: var(--icons); +#mdbook .theme-popup .default { + color: var(--icons); } -.theme-popup .theme { - width: 100%; - border: 0; - margin: 0; - padding: 2px 10px; - line-height: 25px; - white-space: nowrap; - text-align: left; - cursor: pointer; - color: inherit; - background: inherit; - font-size: inherit; +#mdbook .theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 10px; + line-height: 25px; + white-space: nowrap; + text-align: left; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; } -.theme-popup .theme:hover { - background-color: var(--theme-hover); +#mdbook .theme-popup .theme:hover { + background-color: var(--theme-hover); } -.theme-popup .theme:hover:first-child, -.theme-popup .theme:hover:last-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; +#mdbook .theme-popup .theme:hover:first-child, +#mdbook .theme-popup .theme:hover:last-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; } diff --git a/website/doc/theme/css/general.css b/website/doc/theme/css/general.css index 0e4f07a5..000100bb 100644 --- a/website/doc/theme/css/general.css +++ b/website/doc/theme/css/general.css @@ -2,70 +2,64 @@ @import 'variables.css'; -:root { - /* Browser default font-size is 16px, this way 1 rem = 10px */ - font-size: 62.5%; +#mdbook { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; + overflow-x: hidden; } -html { - font-family: "Open Sans", sans-serif; - color: var(--fg); - background-color: var(--bg); - text-size-adjust: none; - -webkit-text-size-adjust: none; -} - -body { - margin: 0; - font-size: 1.6rem; - overflow-x: hidden; -} - -code { - font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; - font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ +#mdbook code { + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; } /* make long words/inline code not x overflow */ -main { - overflow-wrap: break-word; +#mdbook main { + overflow-wrap: break-word; } /* make wide tables scroll if they overflow */ -.table-wrapper { - overflow-x: auto; +#mdbook .table-wrapper { + overflow-x: auto; } /* Don't change font size in headers. */ -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - font-size: unset; +#mdbook h1 code, +#mdbook h2 code, +#mdbook h3 code, +#mdbook h4 code, +#mdbook h5 code, +#mdbook h6 code { + font-size: unset; } -.left { float: left; } -.right { float: right; } -.boring { opacity: 0.6; } -.hide-boring .boring { display: none; } -.hidden { display: none !important; } +#mdbook .left { float: left; } +#mdbook .right { float: right; } +#mdbook .boring { opacity: 0.6; } +#mdbook .hide-boring .boring { display: none; } +#mdbook .hidden { display: none !important; } -h2, h3 { margin-top: 2.5em; } -h4, h5 { margin-top: 2em; } +#mdbook h2, #mdbook h3 { margin-top: 2.5em; } +#mdbook h4, #mdbook h5 { margin-top: 2em; } -.header + .header h3, -.header + .header h4, -.header + .header h5 { - margin-top: 1em; +#mdbook .header + .header h3, +#mdbook .header + .header h4, +#mdbook .header + .header h5 { + margin-top: 1em; } -h1:target::before, -h2:target::before, -h3:target::before, -h4:target::before, -h5:target::before, -h6:target::before { - display: inline-block; - content: "»"; - margin-left: -30px; - width: 30px; +#mdbook h1:target::before, +#mdbook h2:target::before, +#mdbook h3:target::before, +#mdbook h4:target::before, +#mdbook h5:target::before, +#mdbook h6:target::before { + display: inline-block; + content: "»"; + margin-left: -30px; + width: 30px; } /* This is broken on Safari as of version 14, but is fixed @@ -73,119 +67,119 @@ h6:target::before { https://bugs.webkit.org/show_bug.cgi?id=218076 */ :target { - scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); } -.page { - outline: 0; - padding: 0 var(--page-padding); - margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +#mdbook .page { + outline: 0; + padding: 0 var(--page-padding); + margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ } -.page-wrapper { - box-sizing: border-box; +#mdbook .page-wrapper { + box-sizing: border-box; } -.js:not(.sidebar-resizing) .page-wrapper { - transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +.js:not(.sidebar-resizing) #mdbook .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ } -.content { - overflow-y: auto; - padding: 0 5px 50px 5px; +#mdbook .content { + overflow-y: auto; + padding: 20px 5px 50px 5px; } -.content main { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); +#mdbook .content main { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); } -.content p { line-height: 1.45em; } -.content ol { line-height: 1.45em; } -.content ul { line-height: 1.45em; } -.content a { text-decoration: none; } -.content a:hover { text-decoration: underline; } -.content img, .content video { max-width: 100%; } -.content .header:link, -.content .header:visited { - color: var(--fg); +#mdbook .content p { line-height: 1.45em; } +#mdbook .content ol { line-height: 1.45em; } +#mdbook .content ul { line-height: 1.45em; } +#mdbook .content a { text-decoration: none; } +#mdbook .content a:hover { text-decoration: underline; } +#mdbook .content img, .content video { max-width: 100%; } +#mdbook .content .header:link, +#mdbook .content .header:visited { + color: var(--fg); } -.content .header:link, -.content .header:visited:hover { - text-decoration: none; +#mdbook .content .header:link, +#mdbook .content .header:visited:hover { + text-decoration: none; } -table { - margin: 0 auto; - border-collapse: collapse; +#mdbook table { + margin: 0 auto; + border-collapse: collapse; } -table td { - padding: 3px 20px; - border: 1px var(--table-border-color) solid; +#mdbook table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; } -table thead { - background: var(--table-header-bg); +#mdbook table thead { + background: var(--table-header-bg); } -table thead td { - font-weight: 700; - border: none; +#mdbook table thead td { + font-weight: 700; + border: none; } -table thead th { - padding: 3px 20px; +#mdbook table thead th { + padding: 3px 20px; } -table thead tr { - border: 1px var(--table-header-bg) solid; +#mdbook table thead tr { + border: 1px var(--table-header-bg) solid; } /* Alternate background colors for rows */ -table tbody tr:nth-child(2n) { - background: var(--table-alternate-bg); +#mdbook table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); } -blockquote { - margin: 20px 0; - padding: 0 20px; - color: var(--fg); - background-color: var(--quote-bg); - border-top: .1em solid var(--quote-border); - border-bottom: .1em solid var(--quote-border); +#mdbook blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-top: .1em solid var(--quote-border); + border-bottom: .1em solid var(--quote-border); } -:not(.footnote-definition) + .footnote-definition, -.footnote-definition + :not(.footnote-definition) { - margin-top: 2em; +#mdbook :not(.footnote-definition) + .footnote-definition, +#mdbook .footnote-definition + :not(.footnote-definition) { + margin-top: 2em; } -.footnote-definition { - font-size: 0.9em; - margin: 0.5em 0; +#mdbook .footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; } -.footnote-definition p { - display: inline; +#mdbook .footnote-definition p { + display: inline; } -.tooltiptext { - position: absolute; - visibility: hidden; - color: #fff; - background-color: #333; - transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ - left: -8px; /* Half of the width of the icon */ - top: -35px; - font-size: 0.8em; - text-align: center; - border-radius: 6px; - padding: 5px 8px; - margin: 5px; - z-index: 1000; +#mdbook .tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; } -.tooltipped .tooltiptext { - visibility: visible; +#mdbook .tooltipped .tooltiptext { + visibility: visible; } -.chapter li.part-title { - color: var(--sidebar-fg); - margin: 5px 0px; - font-weight: bold; +#mdbook .chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; } -.result-no-output { - font-style: italic; +#mdbook .result-no-output { + font-style: italic; } diff --git a/website/doc/theme/css/print.css b/website/doc/theme/css/print.css index 5e690f75..bd7c8da7 100644 --- a/website/doc/theme/css/print.css +++ b/website/doc/theme/css/print.css @@ -1,54 +1,65 @@ - #sidebar, #menu-bar, -.nav-chapters, -.mobile-nav-chapters { - display: none; +#mdbook .nav-chapters, +#mdbook .mobile-nav-chapters { + display: none; } -#page-wrapper.page-wrapper { - transform: none; - margin-left: 0px; - overflow-y: initial; +#mdbook, +#page-wrapper { + margin: 0; + padding: 0; + max-width: none; + transform: none !important; + overflow-y: initial; } #content { - max-width: none; - margin: 0; - padding: 0; + max-width: none; + margin: 0; + padding: 0; } -.page { - overflow-y: initial; +#mdbook .page { + overflow-y: initial; } -code { - background-color: #666666; - border-radius: 5px; +#mdbook code { + background-color: #eeeeee; + border-radius: 5px; - /* Force background to be printed in Chrome */ - -webkit-print-color-adjust: exact; + /* Force background to be printed in Chrome */ + -webkit-print-color-adjust: exact; } -pre > .buttons { - z-index: 2; +#mdbook pre > .buttons { + z-index: 2; } -a, a:visited, a:active, a:hover { - color: #4183c4; - text-decoration: none; +#mdbook a, +#mdbook a:visited, +#mdbook a:active, +#mdbook a:hover { + color: #4183c4; + text-decoration: none; } -h1, h2, h3, h4, h5, h6 { - page-break-inside: avoid; - page-break-after: avoid; +#mdbook h1, +#mdbook h2, +#mdbook h3, +#mdbook h4, +#mdbook h5, +#mdbook h6 { + page-break-inside: avoid; + page-break-after: avoid; } -pre, code { - page-break-inside: avoid; - white-space: pre-wrap; +#mdbook pre, +#mdbook code { + page-break-inside: avoid; + white-space: pre-wrap; } -.fa { - display: none !important; +#mdbook .fa { + display: none !important; } diff --git a/website/doc/theme/css/variables.css b/website/doc/theme/css/variables.css index 56b634bc..7a68155a 100644 --- a/website/doc/theme/css/variables.css +++ b/website/doc/theme/css/variables.css @@ -2,252 +2,252 @@ /* Globals */ :root { - --sidebar-width: 300px; - --page-padding: 15px; - --content-max-width: 750px; - --menu-bar-height: 50px; + --sidebar-width: 300px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; } /* Themes */ .ayu { - --bg: hsl(210, 25%, 8%); - --fg: #c5c5c5; + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; - --sidebar-bg: #14191f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #5c6773; - --sidebar-active: #ffb454; - --sidebar-spacer: #2d334f; + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; - --scrollbar: var(--sidebar-fg); + --scrollbar: var(--sidebar-fg); - --icons: #737480; - --icons-hover: #b7b9cc; + --icons: #737480; + --icons-hover: #b7b9cc; - --links: #0096cf; + --links: #0096cf; - --inline-code-color: #ffb454; + --inline-code-color: #ffb454; - --theme-popup-bg: #14191f; - --theme-popup-border: #5c6773; - --theme-hover: #191f26; + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); - --table-border-color: hsl(210, 25%, 13%); - --table-header-bg: hsl(210, 25%, 28%); - --table-alternate-bg: hsl(210, 25%, 11%); + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); - --searchbar-border-color: #848484; - --searchbar-bg: #424242; - --searchbar-fg: #fff; - --searchbar-shadow-color: #d4c89f; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #252932; - --search-mark-bg: #e3b171; + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; } .coal { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; - --scrollbar: var(--sidebar-fg); + --scrollbar: var(--sidebar-fg); - --icons: #43484d; - --icons-hover: #b3c0cc; + --icons: #43484d; + --icons-hover: #b3c0cc; - --links: #2b79a2; + --links: #2b79a2; - --inline-code-color: #c5c8c6; + --inline-code-color: #c5c8c6; - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; } .light { - --bg: hsl(0, 0%, 100%); - --fg: hsl(0, 0%, 0%); + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); - --sidebar-bg: #fafafa; - --sidebar-fg: hsl(0, 0%, 0%); - --sidebar-non-existant: #aaaaaa; - --sidebar-active: #1f1fff; - --sidebar-spacer: #f4f4f4; + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; - --scrollbar: #8F8F8F; + --scrollbar: #8F8F8F; - --icons: #747474; - --icons-hover: #000000; + --icons: #747474; + --icons-hover: #000000; - --links: #20609f; + --links: #20609f; - --inline-code-color: #301900; + --inline-code-color: #301900; - --theme-popup-bg: #fafafa; - --theme-popup-border: #cccccc; - --theme-hover: #e6e6e6; + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; - --quote-bg: hsl(197, 37%, 96%); - --quote-border: hsl(197, 37%, 91%); + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); - --table-border-color: hsl(0, 0%, 95%); - --table-header-bg: hsl(0, 0%, 80%); - --table-alternate-bg: hsl(0, 0%, 97%); + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #e4f2fe; - --search-mark-bg: #a2cff5; + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; } .navy { - --bg: hsl(226, 23%, 11%); - --fg: #bcbdd0; + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; - --sidebar-bg: #282d3f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505274; - --sidebar-active: #2b79a2; - --sidebar-spacer: #2d334f; + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; - --scrollbar: var(--sidebar-fg); + --scrollbar: var(--sidebar-fg); - --icons: #737480; - --icons-hover: #b7b9cc; + --icons: #737480; + --icons-hover: #b7b9cc; - --links: #2b79a2; + --links: #2b79a2; - --inline-code-color: #c5c8c6; + --inline-code-color: #c5c8c6; - --theme-popup-bg: #161923; - --theme-popup-border: #737480; - --theme-hover: #282e40; + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); - --table-border-color: hsl(226, 23%, 16%); - --table-header-bg: hsl(226, 23%, 31%); - --table-alternate-bg: hsl(226, 23%, 14%); + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); - --searchbar-border-color: #aaa; - --searchbar-bg: #aeaec6; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #5f5f71; - --searchresults-border-color: #5c5c68; - --searchresults-li-bg: #242430; - --search-mark-bg: #a2cff5; + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; } .rust { - --bg: hsl(60, 9%, 87%); - --fg: #262625; + --bg: hsl(60, 9%, 87%); + --fg: #262625; - --sidebar-bg: #3b2e2a; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505254; - --sidebar-active: #e69f67; - --sidebar-spacer: #45373a; + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; - --scrollbar: var(--sidebar-fg); + --scrollbar: var(--sidebar-fg); - --icons: #737480; - --icons-hover: #262625; + --icons: #737480; + --icons-hover: #262625; - --links: #2b79a2; + --links: #2b79a2; - --inline-code-color: #6e6b5e; + --inline-code-color: #6e6b5e; - --theme-popup-bg: #e1e1db; - --theme-popup-border: #b38f6b; - --theme-hover: #99908a; + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; - --quote-bg: hsl(60, 5%, 75%); - --quote-border: hsl(60, 5%, 70%); + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); - --table-border-color: hsl(60, 9%, 82%); - --table-header-bg: #b3a497; - --table-alternate-bg: hsl(60, 9%, 84%); + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #dec2a2; - --search-mark-bg: #e69f67; + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; } @media (prefers-color-scheme: dark) { - .light.no-js { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; - --scrollbar: var(--sidebar-fg); + --scrollbar: var(--sidebar-fg); - --icons: #43484d; - --icons-hover: #b3c0cc; + --icons: #43484d; + --icons-hover: #b3c0cc; - --links: #2b79a2; + --links: #2b79a2; - --inline-code-color: #c5c8c6; + --inline-code-color: #c5c8c6; - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - } + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } } diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index 48eb6eb0..3efe8e22 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -67,12 +67,12 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/ayu-highlight.css")) )); page.add_to( - "region-content", - Container::new() - .with_id("mdbook") - .with_component(Html::with(html! { (PreEscaped(html)) })) - ) - .render() + "region-content", + Container::new() + .with_id("mdbook") + .with_component(Html::with(html! { (PreEscaped(html)) })) + ) + .render() } else { Err(FatalError::NotFound) } From 62be83504202bed70b0fdfc1b74a0f4d39feb31c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Jul 2022 21:59:55 +0200 Subject: [PATCH 148/853] Corrige errores javascript para integrar mdBook --- website/doc/theme/book.js | 3 ++- website/src/mdbook.rs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/website/doc/theme/book.js b/website/doc/theme/book.js index d40440c7..c4f264aa 100644 --- a/website/doc/theme/book.js +++ b/website/doc/theme/book.js @@ -500,7 +500,8 @@ function playground_text(playground) { html.classList.add('sidebar-resizing'); } function resize(e) { - var pos = (e.clientX - sidebar.offsetLeft); + var viewportOffset = sidebar.getBoundingClientRect(); + var pos = (e.clientX - sidebar.offsetLeft - viewportOffset.left); if (pos < 20) { hideSidebar(); } else { diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index 3efe8e22..65038cac 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -37,6 +37,7 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError if let Ok(html) = std::str::from_utf8(content.data) { let mut page = Page::new().with_title("Documentación"); page.context() + .alter(InContextOp::AddMetadata("theme-color", "#ffffff")) .alter(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/variables.css")) )) From 34692551f69d6fdc0a547c9fbe5a2ec1dcffdfe8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Jul 2022 22:17:17 +0200 Subject: [PATCH 149/853] =?UTF-8?q?Corrige=20presentaci=C3=B3n=20de=20elem?= =?UTF-8?q?entos=20en=20p=C3=A1gina=20mdBook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/doc/theme/css/chrome.css | 2 ++ website/doc/theme/css/general.css | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/website/doc/theme/css/chrome.css b/website/doc/theme/css/chrome.css index f33ab4e3..69fbe34d 100644 --- a/website/doc/theme/css/chrome.css +++ b/website/doc/theme/css/chrome.css @@ -210,6 +210,7 @@ #mdbook pre { position: relative; + font-size: 0.875rem; } #mdbook pre > .buttons { position: absolute; @@ -260,6 +261,7 @@ } #mdbook pre > code { padding: 1rem; + font-size: 0.875rem; } /* FIXME: ACE editors overlap their buttons because ACE does absolute diff --git a/website/doc/theme/css/general.css b/website/doc/theme/css/general.css index 000100bb..8ace6312 100644 --- a/website/doc/theme/css/general.css +++ b/website/doc/theme/css/general.css @@ -141,7 +141,9 @@ border-top: .1em solid var(--quote-border); border-bottom: .1em solid var(--quote-border); } - +#mdbook blockquote p { + margin-top: 1rem; +} #mdbook :not(.footnote-definition) + .footnote-definition, #mdbook .footnote-definition + :not(.footnote-definition) { From 6a85db2b02a0d84bbc2e221cbfda0ab2d7a51fd0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Jul 2022 21:25:35 +0200 Subject: [PATCH 150/853] Mejora y simplifica el soporte a bases de datos --- pagetop-node/Cargo.toml | 6 ++++-- pagetop-user/Cargo.toml | 6 +++++- pagetop/Cargo.toml | 7 ++++--- pagetop/STARTER.bin.Cargo.toml | 6 ++---- pagetop/STARTER.lib.Cargo.toml | 8 +++++++- pagetop/src/app.rs | 2 +- pagetop/src/app/application.rs | 4 ++-- pagetop/src/core/module/all.rs | 4 ++-- pagetop/src/core/module/definition.rs | 4 ++-- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 2 +- 11 files changed, 31 insertions(+), 20 deletions(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 71412013..b2fa9fec 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -13,5 +13,7 @@ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" -[dependencies] -pagetop = { path = "../pagetop" } +[dependencies.pagetop] +path = "../pagetop" +features = ["database"] +default-features = false diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 8781d7ff..01c28e4b 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -13,6 +13,10 @@ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" +[dependencies.pagetop] +path = "../pagetop" +features = ["database"] +default-features = false + [dependencies] -pagetop = { path = "../pagetop" } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 9d6034ca..ad3604d4 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -64,9 +64,10 @@ optional = true [features] default = [] -mysql = ["sea-orm", "sea-orm-migration", "sea-orm/sqlx-mysql"] -postgres = ["sea-orm", "sea-orm-migration", "sea-orm/sqlx-postgres"] -sqlite = ["sea-orm", "sea-orm-migration", "sea-orm/sqlx-sqlite"] +database = ["sea-orm", "sea-orm-migration"] +mysql = ["database", "sea-orm/sqlx-mysql"] +postgres = ["database", "sea-orm/sqlx-postgres"] +sqlite = ["database", "sea-orm/sqlx-sqlite"] [build-dependencies] static-files = "0.2.3" diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index 4958aea5..f5d375c4 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -8,13 +8,11 @@ edition = "2021" [dependencies.pagetop] path = "../pagetop" -# Si se usa base de datos: +# Si requiere base de datos (MySql, Postgres y/o SQLite): features = ["mysql"] # features = ["postgres"] # features = ["sqlite"] -# Soporte alternativo a todas las bases de datos: -# features = ["mysql", "postgres", "sqlite"] -# En estos casos hay que deshabilitar las características predeterminadas: +# En este caso hay que deshabilitar las características predeterminadas: default-features = false [dependencies] diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 7c06a7fd..0cdc858a 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -6,8 +6,14 @@ edition = "2021" # Ver más claves y sus definiciones en # https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies.pagetop] +path = "../pagetop" +# Para dar soporte a bases de datos: +features = ["database"] +# En este caso hay que deshabilitar las características predeterminadas: +default-features = false + [dependencies] -pagetop = { path = "../pagetop" } # Si se usa la macro html!: maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } # Si se requiere serialización de estructuras de datos: diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 80237c40..0ff72856 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -8,7 +8,7 @@ mod tracing; pub mod locale; -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +#[cfg(feature = "database")] pub mod db; mod definition; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index aa49adcb..e68a0b95 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -24,7 +24,7 @@ impl Application { LazyStatic::force(&super::locale::LANGID); // Conecta con la base de datos (opcional). - #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] + #[cfg(feature = "database")] LazyStatic::force(&super::db::DBCONN); // Habilita los módulos predeterminados. @@ -46,7 +46,7 @@ impl Application { module::all::register_actions(); // Ejecuta actualizaciones pendientes de la base de datos (opcional). - #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] + #[cfg(feature = "database")] module::all::run_migrations(); // Ejecuta la función de inicio de la aplicación. diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 4e6c6282..d0b48655 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -2,7 +2,7 @@ use super::ModuleTrait; use crate::core::hook::add_action; use crate::{app, trace, LazyStatic}; -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +#[cfg(feature = "database")] use crate::{db::*, run_now}; use std::sync::RwLock; @@ -66,7 +66,7 @@ pub fn register_actions() { } } -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +#[cfg(feature = "database")] pub fn run_migrations() { run_now({ struct Migrator; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index dbf6904e..59aec809 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,7 +1,7 @@ use crate::core::hook::HookAction; use crate::{app, util}; -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +#[cfg(feature = "database")] use crate::db::MigrationItem; pub trait BaseModule { @@ -31,7 +31,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } - #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] + #[cfg(feature = "database")] #[allow(unused_variables)] fn migrations(&self) -> Vec<MigrationItem> { vec![] diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 5d788104..cfcaf8ad 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -21,7 +21,7 @@ pub mod locale; pub mod html; // Acceso a base de datos. -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +#[cfg(feature = "database")] pub mod db; // Prepare and run the application. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 20fa3e9d..b1c29c63 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -11,7 +11,7 @@ pub use crate::localize; pub use crate::html::*; -#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] +#[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::app; From 8b75f72a44b10cedf1af6dd3f4463e53789997c0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Jul 2022 21:27:39 +0200 Subject: [PATCH 151/853] =?UTF-8?q?Retoca=20el=20renderizado=20de=20las=20?= =?UTF-8?q?regiones=20de=20la=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/theme/definition.rs | 14 ++++++++++---- pagetop/src/response/page/definition.rs | 10 +++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index a1fc70e6..7f64258b 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -63,12 +63,18 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { body class=[page.body_classes().get()] { @match page.template() { "admin" => { - (page.render_region("top-menu")) - (page.render_region("side-menu")) - (page.render_region("region-content")) + @for region in &["top-menu", "side-menu", "region-content"] { + @if let Some(content) = page.render_region(region) { + #(region) { (content) } + } + } }, _ => { - (page.render_region("region-content")) + @for region in &["region-content"] { + @if let Some(content) = page.render_region(region) { + #(region) { (content) } + } + } } } } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 8f91b394..291ec6b9 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -217,14 +217,10 @@ impl Page { }) } - pub fn render_region(&mut self, region: &str) -> Markup { + pub fn render_region(&mut self, region: &str) -> Option<Markup> { match self.regions.get_mut(region) { - Some(components) => html! { - #(region) { - (components.render(&mut self.context)) - } - }, - None => html! {}, + Some(components) => Some(components.render(&mut self.context)), + None => None, } } } From 1094435a387f0553f689e42d94fbba8114659025 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 26 Jul 2022 06:29:49 +0200 Subject: [PATCH 152/853] =?UTF-8?q?Corrige=20scroll=20no=20deseado=20tras?= =?UTF-8?q?=20carga=20de=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Al integrar el menú lateral (sidebar) en el `div #mdbook` el efecto del `scrollIntoView()` también afecta al contenido del documento desplazando toda la página. --- website/doc/theme/book.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/doc/theme/book.js b/website/doc/theme/book.js index c4f264aa..16f31323 100644 --- a/website/doc/theme/book.js +++ b/website/doc/theme/book.js @@ -548,7 +548,7 @@ function playground_text(playground) { var activeSection = document.getElementById("sidebar").querySelector(".active"); if (activeSection) { // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView - activeSection.scrollIntoView({ block: 'center' }); + // activeSection.scrollIntoView({ block: 'center' }); } })(); From 53668b8719e9c799c30f367f9171f2d40ce671ed Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 26 Jul 2022 06:31:00 +0200 Subject: [PATCH 153/853] Elimina el directorio examples de mdbook --- .../doc/src/for_developers/preprocessors.md | 8 -- website/examples/nop-preprocessor.rs | 104 ------------------ 2 files changed, 112 deletions(-) delete mode 100644 website/examples/nop-preprocessor.rs diff --git a/website/doc/src/for_developers/preprocessors.md b/website/doc/src/for_developers/preprocessors.md index 1ac46256..dbe78779 100644 --- a/website/doc/src/for_developers/preprocessors.md +++ b/website/doc/src/for_developers/preprocessors.md @@ -33,14 +33,6 @@ translates inputs to the correct `Preprocessor` method. For convenience, there is [an example no-op preprocessor] in the `examples/` directory which can easily be adapted for other preprocessors. -<details> -<summary>Example no-op preprocessor</summary> - -```rust -// nop-preprocessors.rs - -{{#include ../../../examples/nop-preprocessor.rs}} -``` </details> ## Hints For Implementing A Preprocessor diff --git a/website/examples/nop-preprocessor.rs b/website/examples/nop-preprocessor.rs deleted file mode 100644 index ace40093..00000000 --- a/website/examples/nop-preprocessor.rs +++ /dev/null @@ -1,104 +0,0 @@ -use crate::nop_lib::Nop; -use clap::{App, Arg, ArgMatches}; -use mdbook::book::Book; -use mdbook::errors::Error; -use mdbook::preprocess::{CmdPreprocessor, Preprocessor, PreprocessorContext}; -use semver::{Version, VersionReq}; -use std::io; -use std::process; - -pub fn make_app() -> App<'static> { - App::new("nop-preprocessor") - .about("A mdbook preprocessor which does precisely nothing") - .subcommand( - App::new("supports") - .arg(Arg::new("renderer").required(true)) - .about("Check whether a renderer is supported by this preprocessor"), - ) -} - -fn main() { - let matches = make_app().get_matches(); - - // Users will want to construct their own preprocessor here - let preprocessor = Nop::new(); - - if let Some(sub_args) = matches.subcommand_matches("supports") { - handle_supports(&preprocessor, sub_args); - } else if let Err(e) = handle_preprocessing(&preprocessor) { - eprintln!("{}", e); - process::exit(1); - } -} - -fn handle_preprocessing(pre: &dyn Preprocessor) -> Result<(), Error> { - let (ctx, book) = CmdPreprocessor::parse_input(io::stdin())?; - - let book_version = Version::parse(&ctx.mdbook_version)?; - let version_req = VersionReq::parse(mdbook::MDBOOK_VERSION)?; - - if !version_req.matches(&book_version) { - eprintln!( - "Warning: The {} plugin was built against version {} of mdbook, \ - but we're being called from version {}", - pre.name(), - mdbook::MDBOOK_VERSION, - ctx.mdbook_version - ); - } - - let processed_book = pre.run(&ctx, book)?; - serde_json::to_writer(io::stdout(), &processed_book)?; - - Ok(()) -} - -fn handle_supports(pre: &dyn Preprocessor, sub_args: &ArgMatches) -> ! { - let renderer = sub_args.value_of("renderer").expect("Required argument"); - let supported = pre.supports_renderer(renderer); - - // Signal whether the renderer is supported by exiting with 1 or 0. - if supported { - process::exit(0); - } else { - process::exit(1); - } -} - -/// The actual implementation of the `Nop` preprocessor. This would usually go -/// in your main `lib.rs` file. -mod nop_lib { - use super::*; - - /// A no-op preprocessor. - pub struct Nop; - - impl Nop { - pub fn new() -> Nop { - Nop - } - } - - impl Preprocessor for Nop { - fn name(&self) -> &str { - "nop-preprocessor" - } - - fn run(&self, ctx: &PreprocessorContext, book: Book) -> Result<Book, Error> { - // In testing we want to tell the preprocessor to blow up by setting a - // particular config value - if let Some(nop_cfg) = ctx.config.get_preprocessor(self.name()) { - if nop_cfg.contains_key("blow-up") { - anyhow::bail!("Boom!!1!"); - } - } - - // we *are* a no-op preprocessor after all - Ok(book) - } - - fn supports_renderer(&self, renderer: &str) -> bool { - renderer != "not-supported" - } - } -} From b986bfcd13d3e8470947221250c020a6eb5edc1f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 26 Jul 2022 20:57:32 +0200 Subject: [PATCH 154/853] =?UTF-8?q?A=C3=B1ade=20funci=C3=B3n=20para=20crea?= =?UTF-8?q?r=20handler=20=C3=BAnico=20al=20compilar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Permite asignar automáticamente el "handler" a componentes, módulos, temas y acciones. --- pagetop-admin/src/lib.rs | 4 +- pagetop-node/src/lib.rs | 4 +- pagetop-user/src/lib.rs | 4 +- pagetop/src/base/component/anchor.rs | 4 +- pagetop/src/base/component/block.rs | 9 +-- pagetop/src/base/component/container.rs | 9 +-- .../src/base/component/form_element/button.rs | 4 +- .../src/base/component/form_element/date.rs | 4 +- .../src/base/component/form_element/form.rs | 9 +-- .../src/base/component/form_element/hidden.rs | 4 +- .../src/base/component/form_element/input.rs | 4 +- pagetop/src/base/component/grid/column.rs | 9 +-- pagetop/src/base/component/grid/row.rs | 9 +-- pagetop/src/base/component/heading.rs | 4 +- pagetop/src/base/component/html.rs | 4 +- pagetop/src/base/component/icon.rs | 4 +- pagetop/src/base/component/image.rs | 4 +- pagetop/src/base/component/menu.rs | 13 ++-- pagetop/src/base/component/paragraph.rs | 4 +- pagetop/src/base/module/homepage.rs | 4 +- pagetop/src/base/theme/aliner.rs | 4 +- pagetop/src/base/theme/bootsier.rs | 4 +- pagetop/src/base/theme/bulmix.rs | 4 +- pagetop/src/base/theme/minimal.rs | 4 +- pagetop/src/core/component/definition.rs | 12 +-- pagetop/src/core/hook/all.rs | 9 ++- pagetop/src/core/hook/definition.rs | 4 +- pagetop/src/core/module/definition.rs | 7 +- pagetop/src/core/theme/definition.rs | 7 +- pagetop/src/prelude.rs | 10 ++- pagetop/src/response/page/hook.rs | 6 +- pagetop/src/util.rs | 78 +++++++++++++++---- website/src/mdbook.rs | 4 +- 33 files changed, 156 insertions(+), 111 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index ddd03cb1..4ddd3279 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub const MODULE_ADMIN: &str = "pagetop-admin::module::admin"; +pub_const_handler!(MODULE_ADMIN); localize!("src/locales"); @@ -9,7 +9,7 @@ mod summary; pub struct Admin; impl ModuleTrait for Admin { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { MODULE_ADMIN } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 343a467d..ff4755fd 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub const MODULE_NODE: &str = "pagetop-node::module::node"; +pub_const_handler!(MODULE_NODE); localize!("src/locales"); @@ -10,7 +10,7 @@ mod migration; pub struct Node; impl ModuleTrait for Node { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { MODULE_NODE } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index ee49fa8d..22c14c41 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub const MODULE_USER: &str = "pagetop-user::module::user"; +pub_const_handler!(MODULE_USER); localize!("src/locales"); @@ -9,7 +9,7 @@ mod migration; pub struct User; impl ModuleTrait for User { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { MODULE_USER } diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 22ab34a0..78febf27 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_ANCHOR: &str = "pagetop::component::anchor"; +pub_const_handler!(COMPONENT_ANCHOR); pub enum AnchorType { Button, @@ -49,7 +49,7 @@ impl ComponentTrait for Anchor { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_ANCHOR } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 4b77ef31..9b0636c1 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,11 +1,8 @@ use crate::prelude::*; -pub const COMPONENT_BLOCK: &str = "pagetop::component::block"; +pub_const_handler!(COMPONENT_BLOCK); -hook_before_render_component!( - HOOK_BEFORE_RENDER_BLOCK = "pagetop::action::before_render_block", - Block -); +hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); pub struct Block { weight : isize, @@ -30,7 +27,7 @@ impl ComponentTrait for Block { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_BLOCK } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 70271eb1..ad7be745 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -1,11 +1,8 @@ use crate::prelude::*; -pub const COMPONENT_CONTAINER: &str = "pagetop::component::container"; +pub_const_handler!(COMPONENT_CONTAINER); -hook_before_render_component!( - HOOK_BEFORE_RENDER_CONTAINER = "pagetop::action::before_render_container", - Container -); +hook_before_render_component!(HOOK_BEFORE_RENDER_CONTAINER, Container); pub enum ContainerType { Header, @@ -40,7 +37,7 @@ impl ComponentTrait for Container { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_CONTAINER } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index cddb6bdb..f349ea5a 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_BUTTON: &str = "pagetop::component::form::button"; +pub_const_handler!(COMPONENT_BUTTON); pub enum ButtonType { Button, @@ -36,7 +36,7 @@ impl ComponentTrait for Button { .with_classes(ClassesOp::AddFirst, "form-button") } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_BUTTON } diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 19370e57..2ce8c357 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_DATE: &str = "pagetop::component::form::date"; +pub_const_handler!(COMPONENT_DATE); pub struct Date { weight : isize, @@ -40,7 +40,7 @@ impl ComponentTrait for Date { .with_classes(ClassesOp::AddFirst, "form-type-date") } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_DATE } diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 8b562f56..9c80c05a 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -1,11 +1,8 @@ use crate::prelude::*; -pub const COMPONENT_FORM: &str = "pagetop::component::form"; +pub_const_handler!(COMPONENT_FORM); -hook_before_render_component!( - HOOK_BEFORE_RENDER_FORM = "pagetop::action::before_render_form", - Form -); +hook_before_render_component!(HOOK_BEFORE_RENDER_FORM, Form); pub enum FormMethod { Get, @@ -39,7 +36,7 @@ impl ComponentTrait for Form { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_FORM } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 3da6a4c3..ed24a56f 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_HIDDEN: &str = "pagetop::component::form::hidden"; +pub_const_handler!(COMPONENT_HIDDEN); pub struct Hidden { weight: isize, @@ -17,7 +17,7 @@ impl ComponentTrait for Hidden { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_HIDDEN } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 8d56b739..b88d4902 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_INPUT: &str = "pagetop::component::form::input"; +pub_const_handler!(COMPONENT_INPUT); pub enum InputType { Email, @@ -57,7 +57,7 @@ impl ComponentTrait for Input { .with_classes(ClassesOp::AddFirst, "form-type-textfield") } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_INPUT } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index d0b0e2ed..57b2e51a 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -1,11 +1,8 @@ use crate::prelude::*; -pub const COMPONENT_COLUMN: &str = "pagetop::component::grid::column"; +pub_const_handler!(COMPONENT_COLUMN); -hook_before_render_component!( - HOOK_BEFORE_RENDER_COLUMN = "pagetop::action::before_render_column", - Column -); +hook_before_render_component!(HOOK_BEFORE_RENDER_COLUMN, Column); const SIZE_DEFAULT: &str = "col-md"; const SIZE_1_OF_12: &str = "col-md-1"; @@ -59,7 +56,7 @@ impl ComponentTrait for Column { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_COLUMN } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 117cf499..e92dfc3d 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -1,11 +1,8 @@ use crate::prelude::*; -pub const COMPONENT_ROW: &str = "pagetop::component::grid::row"; +pub_const_handler!(COMPONENT_ROW); -hook_before_render_component!( - HOOK_BEFORE_RENDER_ROW = "pagetop::action::before_render_row", - Row -); +hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); pub struct Row { weight : isize, @@ -28,7 +25,7 @@ impl ComponentTrait for Row { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_ROW } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 0dbbcdea..5d3e7652 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_HEADING: &str = "pagetop::component::heading"; +pub_const_handler!(COMPONENT_HEADING); pub enum HeadingType { H1, @@ -46,7 +46,7 @@ impl ComponentTrait for Heading { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_HEADING } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 438684a2..69e9e78d 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_HTML: &str = "pagetop::component::html"; +pub_const_handler!(COMPONENT_HTML); pub struct Html { weight : isize, @@ -19,7 +19,7 @@ impl ComponentTrait for Html { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_HTML } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 4722fe63..8bb64e3d 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_ICON: &str = "pagetop::component::icon"; +pub_const_handler!(COMPONENT_ICON); pub struct Icon { weight : isize, @@ -19,7 +19,7 @@ impl ComponentTrait for Icon { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_ICON } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 06749f5b..4f8fadac 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_IMAGE: &str = "pagetop::component::image"; +pub_const_handler!(COMPONENT_IMAGE); pub struct Image { weight : isize, @@ -23,7 +23,7 @@ impl ComponentTrait for Image { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_IMAGE } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index acae967a..6727b3f6 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_MENUITEM: &str = "pagetop::component::menu_item"; +pub_const_handler!(COMPONENT_MENUITEM); pub enum MenuItemType { Label(String), @@ -29,7 +29,7 @@ impl ComponentTrait for MenuItem { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_MENUITEM } @@ -163,12 +163,9 @@ impl MenuItem { // Menu. -pub const COMPONENT_MENU: &str = "pagetop::component::menu"; +pub_const_handler!(COMPONENT_MENU); -hook_before_render_component!( - HOOK_BEFORE_RENDER_MENU = "pagetop::action::before_render_menu", - Menu -); +hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, Menu); pub struct Menu { weight : isize, @@ -191,7 +188,7 @@ impl ComponentTrait for Menu { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_MENU } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 06438b7b..bb7af142 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const COMPONENT_PARAGRAPH: &str = "pagetop::component::paragraph"; +pub_const_handler!(COMPONENT_PARAGRAPH); pub enum ParagraphDisplay { XxLarge, @@ -34,7 +34,7 @@ impl ComponentTrait for Paragraph { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { COMPONENT_PARAGRAPH } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index c8635dcf..2676096a 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -1,13 +1,13 @@ use crate::prelude::*; -pub const MODULE_DEFAULT_HOMEPAGE: &str = "pagetop::module::homepage::default"; +pub_const_handler!(MODULE_DEFAULT_HOMEPAGE); localize!("src/base/module/homepage/locales"); pub struct DefaultHomePage; impl ModuleTrait for DefaultHomePage { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { MODULE_DEFAULT_HOMEPAGE } diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index bb6e794f..33b2a453 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -1,13 +1,13 @@ use crate::prelude::*; -pub const THEME_ALINER: &str = "pagetop::theme::aliner"; +pub_const_handler!(THEME_ALINER); include!(concat!(env!("OUT_DIR"), "/aliner.rs")); pub struct Aliner; impl ThemeTrait for Aliner { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { THEME_ALINER } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 6dcf5fd0..6edec2e1 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub const THEME_BOOTSIER: &str = "pagetop::theme::bootsier"; +pub_const_handler!(THEME_BOOTSIER); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); @@ -9,7 +9,7 @@ localize!("src/base/theme/bootsier/locales"); pub struct Bootsier; impl ThemeTrait for Bootsier { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { THEME_BOOTSIER } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 200c2b63..b0f81c4e 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -1,13 +1,13 @@ use crate::prelude::*; -pub const THEME_BULMIX: &str = "pagetop::theme::bulmix"; +pub_const_handler!(THEME_BULMIX); include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); pub struct Bulmix; impl ThemeTrait for Bulmix { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { THEME_BULMIX } diff --git a/pagetop/src/base/theme/minimal.rs b/pagetop/src/base/theme/minimal.rs index bcdbe8cf..63c90976 100644 --- a/pagetop/src/base/theme/minimal.rs +++ b/pagetop/src/base/theme/minimal.rs @@ -1,11 +1,11 @@ use crate::prelude::*; -pub const THEME_MINIMAL: &str = "pagetop::theme::minimal"; +pub_const_handler!(THEME_MINIMAL); pub struct Minimal; impl ThemeTrait for Minimal { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { THEME_MINIMAL } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index d43b8f70..0c69f90e 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,6 +1,6 @@ use super::InContext; use crate::html::{html, Markup}; -use crate::util; +use crate::util::{single_type_name, Handler}; pub use std::any::Any as AnyComponent; @@ -13,10 +13,10 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { where Self: Sized; - fn handler(&self) -> &'static str; + fn handler(&self) -> Handler; fn name(&self) -> String { - util::single_type_name::<Self>().to_owned() + single_type_name::<Self>().to_owned() } fn description(&self) -> Option<String> { @@ -73,9 +73,9 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { #[macro_export] macro_rules! hook_before_render_component { - ( $ACTION_HANDLER:ident = $handler:literal, $Component:ty ) => { + ( $ACTION_HANDLER:ident, $Component:ty ) => { paste::paste! { - const $ACTION_HANDLER: &str = $handler; + $crate::pub_const_handler!($ACTION_HANDLER); type Action = fn(&$Component, &mut InContext); @@ -92,7 +92,7 @@ macro_rules! hook_before_render_component { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { $ACTION_HANDLER } diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index ab562311..e98d5ca3 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,29 +1,30 @@ use super::{HookAction, ActionsHolder}; use crate::LazyStatic; +use crate::util::Handler; use std::collections::HashMap; use std::sync::RwLock; // Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<&str, ActionsHolder>>> = LazyStatic::new(|| +static ACTIONS: LazyStatic<RwLock<HashMap<Handler, ActionsHolder>>> = LazyStatic::new(|| RwLock::new(HashMap::new()) ); pub fn add_action(action: HookAction) { let mut actions = ACTIONS.write().unwrap(); let action_handler = action.handler(); - if let Some(holder) = actions.get_mut(action_handler) { + if let Some(holder) = actions.get_mut(&action_handler) { holder.add(action); } else { actions.insert(action_handler, ActionsHolder::new_with(action)); } } -pub fn run_actions<B, F>(action_handler: &str, f: F) +pub fn run_actions<B, F>(action_handler: Handler, f: F) where F: FnMut(&HookAction) -> B, { - if let Some(holder) = ACTIONS.read().unwrap().get(action_handler) { + if let Some(holder) = ACTIONS.read().unwrap().get(&action_handler) { holder.iter_map(f) } } diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index ae739fa6..5808b6c9 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -1,3 +1,5 @@ +use crate::util::Handler; + pub use std::any::Any as AnyHookAction; pub trait HookActionTrait: AnyHookAction + Send + Sync { @@ -5,7 +7,7 @@ pub trait HookActionTrait: AnyHookAction + Send + Sync { where Self: Sized; - fn handler(&self) -> &'static str; + fn handler(&self) -> Handler; fn weight(&self) -> isize { 0 diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 59aec809..e4492ab7 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,6 @@ +use crate::app; use crate::core::hook::HookAction; -use crate::{app, util}; +use crate::util::{single_type_name, Handler}; #[cfg(feature = "database")] use crate::db::MigrationItem; @@ -10,7 +11,7 @@ pub trait BaseModule { /// Los módulos deben implementar este *trait*. pub trait ModuleTrait: BaseModule + Send + Sync { - fn handler(&self) -> &'static str; + fn handler(&self) -> Handler; fn name(&self) -> String { self.single_name().to_owned() @@ -40,6 +41,6 @@ pub trait ModuleTrait: BaseModule + Send + Sync { impl<M: ?Sized + ModuleTrait> BaseModule for M { fn single_name(&self) -> &'static str { - util::single_type_name::<Self>() + single_type_name::<Self>() } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 7f64258b..eeaaad2d 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,10 +1,11 @@ use crate::app; use crate::base::component::{Container, Html}; +use crate::concat_string; use crate::config::SETTINGS; use crate::core::component::{ComponentTrait, InContext, InContextOp}; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; -use crate::{concat_string, util}; +use crate::util::{single_type_name, Handler}; pub trait BaseTheme { fn single_name(&self) -> &'static str; @@ -12,7 +13,7 @@ pub trait BaseTheme { /// Los temas deben implementar este "trait". pub trait ThemeTrait: BaseTheme + Send + Sync { - fn handler(&self) -> &'static str; + fn handler(&self) -> Handler; fn name(&self) -> String { self.single_name().to_owned() @@ -144,6 +145,6 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { impl<T: ?Sized + ThemeTrait> BaseTheme for T { fn single_name(&self) -> &'static str { - util::single_type_name::<Self>() + single_type_name::<Self>() } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index b1c29c63..1420f1d6 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,7 +1,15 @@ //! Re-exporta recursos comunes. // Global macros and helpers. -pub use crate::{args, concat_string, theme_static_files, util, LazyStatic}; +pub use crate::{ + args, + concat_string, + pub_const_handler, + theme_static_files, + LazyStatic +}; +pub use crate::util; +pub use crate::util::Handler; pub use crate::config::SETTINGS; diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index 28d6a779..09363f35 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,7 +1,9 @@ use super::Page; use crate::core::hook::{AnyHookAction, HookActionTrait}; +use crate::pub_const_handler; +use crate::util::Handler; -pub const HOOK_BEFORE_RENDER_PAGE: &str = "pagetop::hook::before_render_page"; +pub_const_handler!(HOOK_BEFORE_RENDER_PAGE); type Hook = fn(&mut Page); @@ -18,7 +20,7 @@ impl HookActionTrait for BeforeRenderPageHook { } } - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { HOOK_BEFORE_RENDER_PAGE } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index fed318be..28a979d2 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,3 +1,66 @@ +pub type Handler = u64; + +// https://stackoverflow.com/a/71464396 +pub const fn handler( + module_path: &'static str, + file: &'static str, + line: u32, + column: u32, +) -> Handler { + let mut hash = 0xcbf29ce484222325; + let prime = 0x00000100000001B3; + + let mut bytes = module_path.as_bytes(); + let mut i = 0; + + while i < bytes.len() { + hash ^= bytes[i] as u64; + hash = hash.wrapping_mul(prime); + i += 1; + } + + bytes = file.as_bytes(); + i = 0; + while i < bytes.len() { + hash ^= bytes[i] as u64; + hash = hash.wrapping_mul(prime); + i += 1; + } + + hash ^= line as u64; + hash = hash.wrapping_mul(prime); + hash ^= column as u64; + hash = hash.wrapping_mul(prime); + hash +} + +#[macro_export] +macro_rules! pub_const_handler { + ( $HANDLER:ident ) => { + pub const $HANDLER: $crate::util::Handler = $crate::util::handler( + module_path!(), + file!(), + line!(), + column!(), + ); + }; +} + +pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { + if last == 0 { + return type_name; + } + let positions: Vec<_> = type_name.rmatch_indices("::").collect(); + if positions.len() < last { + return type_name; + } + &type_name[(positions[last - 1].0 + 2)..] +} + +pub fn single_type_name<T: ?Sized>() -> &'static str { + partial_type_name(std::any::type_name::<T>(), 1) +} + #[macro_export] /// Macro para construir grupos de pares clave-valor. /// @@ -34,18 +97,3 @@ macro_rules! theme_static_files { } }}; } - -pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { - if last == 0 { - return type_name; - } - let positions: Vec<_> = type_name.rmatch_indices("::").collect(); - if positions.len() < last { - return type_name; - } - &type_name[(positions[last - 1].0 + 2)..] -} - -pub fn single_type_name<T: ?Sized>() -> &'static str { - partial_type_name(std::any::type_name::<T>(), 1) -} diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index 65038cac..f2589515 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -11,12 +11,12 @@ static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(|| generate() ); -pub const MODULE_MDBOOK: &str = "pagetop::website::module::mdbook"; +pub_const_handler!(MODULE_MDBOOK); pub struct MdBook; impl ModuleTrait for MdBook { - fn handler(&self) -> &'static str { + fn handler(&self) -> Handler { MODULE_MDBOOK } From 385da3c325744b232081482881bb3b5a96c8d0fe Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 27 Jul 2022 21:30:39 +0200 Subject: [PATCH 155/853] =?UTF-8?q?Corrige=20la=20vista=20completa=20del?= =?UTF-8?q?=20men=C3=BA=20lateral=20mdBook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/doc/theme/book.js | 9 ++++----- website/doc/theme/css/chrome.css | 10 ++++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/website/doc/theme/book.js b/website/doc/theme/book.js index 16f31323..c4ab6988 100644 --- a/website/doc/theme/book.js +++ b/website/doc/theme/book.js @@ -544,11 +544,10 @@ function playground_text(playground) { } }, { passive: true }); - // Scroll sidebar to current active section - var activeSection = document.getElementById("sidebar").querySelector(".active"); - if (activeSection) { - // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView - // activeSection.scrollIntoView({ block: 'center' }); + // Try to show the full sidebar + if (html.classList.contains("sidebar-visible")) { + var realHeight = sidebar.querySelector(".sidebar-scrollbox").scrollHeight; + document.getElementById("page-wrapper").style.minHeight = realHeight + 80 + "px"; } })(); diff --git a/website/doc/theme/css/chrome.css b/website/doc/theme/css/chrome.css index 69fbe34d..7f9dc35d 100644 --- a/website/doc/theme/css/chrome.css +++ b/website/doc/theme/css/chrome.css @@ -111,6 +111,16 @@ .js #mdbook .menu-title { cursor: pointer; } +@media only screen and (max-width: 640px) { + #mdbook .menu-title { + font-size: 1.5rem; + } +} +@media only screen and (max-width: 420px) { + #mdbook .menu-title { + font-size: 1.2rem; + } +} #mdbook .menu-bar, #mdbook .menu-bar:visited, From 3297c24082a693d3f5845dbe2186fdaadec428d5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 28 Jul 2022 00:08:15 +0200 Subject: [PATCH 156/853] =?UTF-8?q?A=C3=B1ade=20datos=20para=20capturar=20?= =?UTF-8?q?de=20la=20p=C3=A1gina=20[mdbook]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/doc/theme/favicon.png | Bin 5679 -> 0 bytes website/doc/theme/favicon.svg | 22 ---------------------- website/doc/theme/index.hbs | 6 ++++++ 3 files changed, 6 insertions(+), 22 deletions(-) delete mode 100644 website/doc/theme/favicon.png delete mode 100644 website/doc/theme/favicon.svg diff --git a/website/doc/theme/favicon.png b/website/doc/theme/favicon.png deleted file mode 100644 index a5b1aa16c4dcb6c872cb5af799bfc9b5552c7b9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5679 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 A;{X5v diff --git a/website/doc/theme/favicon.svg b/website/doc/theme/favicon.svg deleted file mode 100644 index 90e0ea58..00000000 --- a/website/doc/theme/favicon.svg +++ /dev/null @@ -1,22 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 199.7 184.2"> - <style> - @media (prefers-color-scheme: dark) { - svg { fill: white; } - } - </style> -<path d="M189.5,36.8c0.2,2.8,0,5.1-0.6,6.8L153,162c-0.6,2.1-2,3.7-4.2,5c-2.2,1.2-4.4,1.9-6.7,1.9H31.4c-9.6,0-15.3-2.8-17.3-8.4 - c-0.8-2.2-0.8-3.9,0.1-5.2c0.9-1.2,2.4-1.8,4.6-1.8H123c7.4,0,12.6-1.4,15.4-4.1s5.7-8.9,8.6-18.4l32.9-108.6 - c1.8-5.9,1-11.1-2.2-15.6S169.9,0,164,0H72.7c-1,0-3.1,0.4-6.1,1.1l0.1-0.4C64.5,0.2,62.6,0,61,0.1s-3,0.5-4.3,1.4 - c-1.3,0.9-2.4,1.8-3.2,2.8S52,6.5,51.2,8.1c-0.8,1.6-1.4,3-1.9,4.3s-1.1,2.7-1.8,4.2c-0.7,1.5-1.3,2.7-2,3.7c-0.5,0.6-1.2,1.5-2,2.5 - s-1.6,2-2.2,2.8s-0.9,1.5-1.1,2.2c-0.2,0.7-0.1,1.8,0.2,3.2c0.3,1.4,0.4,2.4,0.4,3.1c-0.3,3-1.4,6.9-3.3,11.6 - c-1.9,4.7-3.6,8.1-5.1,10.1c-0.3,0.4-1.2,1.3-2.6,2.7c-1.4,1.4-2.3,2.6-2.6,3.7c-0.3,0.4-0.3,1.5-0.1,3.4c0.3,1.8,0.4,3.1,0.3,3.8 - c-0.3,2.7-1.3,6.3-3,10.8c-1.7,4.5-3.4,8.2-5,11c-0.2,0.5-0.9,1.4-2,2.8c-1.1,1.4-1.8,2.5-2,3.4c-0.2,0.6-0.1,1.8,0.1,3.4 - c0.2,1.6,0.2,2.8-0.1,3.6c-0.6,3-1.8,6.7-3.6,11c-1.8,4.3-3.6,7.9-5.4,11c-0.5,0.8-1.1,1.7-2,2.8c-0.8,1.1-1.5,2-2,2.8 - s-0.8,1.6-1,2.5c-0.1,0.5,0,1.3,0.4,2.3c0.3,1.1,0.4,1.9,0.4,2.6c-0.1,1.1-0.2,2.6-0.5,4.4c-0.2,1.8-0.4,2.9-0.4,3.2 - c-1.8,4.8-1.7,9.9,0.2,15.2c2.2,6.2,6.2,11.5,11.9,15.8c5.7,4.3,11.7,6.4,17.8,6.4h110.7c5.2,0,10.1-1.7,14.7-5.2s7.7-7.8,9.2-12.9 - l33-108.6c1.8-5.8,1-10.9-2.2-15.5C194.9,39.7,192.6,38,189.5,36.8z M59.6,122.8L73.8,80c0,0,7,0,10.8,0s28.8-1.7,25.4,17.5 - c-3.4,19.2-18.8,25.2-36.8,25.4S59.6,122.8,59.6,122.8z M78.6,116.8c4.7-0.1,18.9-2.9,22.1-17.1S89.2,86.3,89.2,86.3l-8.9,0 - l-10.2,30.5C70.2,116.9,74,116.9,78.6,116.8z M75.3,68.7L89,26.2h9.8l0.8,34l23.6-34h9.9l-13.6,42.5h-7.1l12.5-35.4l-24.5,35.4h-6.8 - l-0.8-35L82,68.7H75.3z"/> -</svg> -<!-- Original image Copyright Dave Gandy — CC BY 4.0 License --> diff --git a/website/doc/theme/index.hbs b/website/doc/theme/index.hbs index 31a74b5c..5136eb09 100644 --- a/website/doc/theme/index.hbs +++ b/website/doc/theme/index.hbs @@ -1,3 +1,9 @@ +<!-- Lang: "{{ language }}" --> +<!-- Title: "{{ title }}" --> +<!-- Description: "{{ description }}" --> +<!-- Print: {{#if print_enable}}enabled{{else}}disabled{{/if}} --> +<!-- MathJax: {{#if mathjax_support}}supported{{else}}unsupported{{/if}} --> + <!-- Provide site root to javascript --> <script type="text/javascript"> var path_to_root = "{{ path_to_root }}"; From 33c32624267b0177f895985d93ed8a9c8ba68d3f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 28 Jul 2022 22:31:58 +0200 Subject: [PATCH 157/853] =?UTF-8?q?Retoca=20y=20depura=20info=20capturada?= =?UTF-8?q?=20de=20p=C3=A1gina=20[mdbook]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/doc/theme/index.hbs | 7 ++-- website/src/mdbook.rs | 74 +++++++++++++++++++++++++++---------- 2 files changed, 58 insertions(+), 23 deletions(-) diff --git a/website/doc/theme/index.hbs b/website/doc/theme/index.hbs index 5136eb09..490b7ca1 100644 --- a/website/doc/theme/index.hbs +++ b/website/doc/theme/index.hbs @@ -1,9 +1,10 @@ -<!-- Lang: "{{ language }}" --> -<!-- Title: "{{ title }}" --> -<!-- Description: "{{ description }}" --> +<!-- Lang: {{ language }} --> +<!-- Title: {{ title }} --> <!-- Print: {{#if print_enable}}enabled{{else}}disabled{{/if}} --> <!-- MathJax: {{#if mathjax_support}}supported{{else}}unsupported{{/if}} --> +<!-- mdBook --> + <!-- Provide site root to javascript --> <script type="text/javascript"> var path_to_root = "{{ path_to_root }}"; diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index f2589515..cde06cd4 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -35,45 +35,67 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError if let Some(content) = MDBOOK.get(path) { if let Ok(html) = std::str::from_utf8(content.data) { - let mut page = Page::new().with_title("Documentación"); - page.context() - .alter(InContextOp::AddMetadata("theme-color", "#ffffff")) - .alter(InContextOp::StyleSheet( + + let _lang = extract("Lang", html); + let title = match extract("Title", html) { + Some(title) => title, + _ => "Documentación", + }; + let _print = match extract("Print", html) { + Some("enabled") => true, + _ => false, + }; + let _mathjax = match extract("MathJax", html) { + Some("supported") => true, + _ => false, + }; + let beginning = { + let separator = "<!-- mdBook -->"; + match html.find(separator) { + Some(pos) => pos + separator.len(), + _ => 0, + } + }; + + Page::new() + .with_title(title) + .with_context(InContextOp::AddMetadata("theme-color", "#ffffff")) + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/variables.css")) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/general.css")) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/chrome.css")) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add( StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print) ) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/FontAwesome/css/font-awesome.css")) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/fonts/fonts.css")) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/highlight.css")) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/tomorrow-night.css")) )) - .alter(InContextOp::StyleSheet( + .with_context(InContextOp::StyleSheet( AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/ayu-highlight.css")) - )); - page.add_to( - "region-content", - Container::new() - .with_id("mdbook") - .with_component(Html::with(html! { (PreEscaped(html)) })) - ) - .render() + )) + .add_to( + "region-content", + Container::new() + .with_id("mdbook") + .with_component(Html::with(html! { (PreEscaped(&html[beginning..])) })) + ) + .render() } else { Err(FatalError::NotFound) } @@ -152,3 +174,15 @@ fn none_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRe None => true, } } + +fn extract(attr: &'static str, from: &'static str) -> Option<&'static str> { + let search = concat_string!("<!-- ", attr, ":"); + if let Some(ini) = from.find(&search) { + let ini = ini + search.len() + 1; + if let Some(end) = from[ini..].find("-->").map(|i| i + ini) { + let end = end - 1; + return Some(&from[ini..end]); + } + } + None +} From de0785c29fe04623badf13dcf45b6aa41bc46445 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 29 Jul 2022 22:41:00 +0200 Subject: [PATCH 158/853] =?UTF-8?q?A=C3=B1ade=20nuevas=20posibilidades=20p?= =?UTF-8?q?ara=20manipular=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/icon.rs | 4 +- pagetop/src/base/component/menu.rs | 12 +++--- pagetop/src/base/module/homepage.rs | 6 +-- pagetop/src/base/theme/aliner.rs | 13 ++++--- pagetop/src/base/theme/bootsier.rs | 29 +++++++------- pagetop/src/base/theme/bulmix.rs | 19 ++++----- pagetop/src/core/component/context.rs | 55 ++++++++++++++++++++------- pagetop/src/core/theme/definition.rs | 4 +- pagetop/src/html.rs | 2 +- pagetop/src/html/assets.rs | 39 ++++++++----------- pagetop/src/html/assets/javascript.rs | 8 ++-- pagetop/src/html/assets/stylesheet.rs | 8 ++-- website/src/mdbook.rs | 38 +++++++++--------- 13 files changed, 129 insertions(+), 108 deletions(-) diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 8bb64e3d..cc2f51d1 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -32,9 +32,9 @@ impl ComponentTrait for Icon { } fn before_render(&mut self, context: &mut InContext) { - context.alter(InContextOp::StyleSheet(AssetsOp::Add( + context.alter(InContextOp::AddStyleSheet( StyleSheet::located("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), - ))); + )); } fn default_render(&self, _: &mut InContext) -> Markup { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 6727b3f6..1178478e 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -206,15 +206,15 @@ impl ComponentTrait for Menu { fn default_render(&self, context: &mut InContext) -> Markup { context - .alter(InContextOp::StyleSheet(AssetsOp::Add( + .alter(InContextOp::AddStyleSheet( StyleSheet::located("/theme/menu/css/menu.css").with_version("1.1.1"), - ))) - .alter(InContextOp::StyleSheet(AssetsOp::Add( + )) + .alter(InContextOp::AddStyleSheet( StyleSheet::located("/theme/menu/css/menu-clean.css").with_version("1.1.1"), - ))) - .alter(InContextOp::JavaScript(AssetsOp::Add( + )) + .alter(InContextOp::AddJavaScript( JavaScript::located("/theme/menu/js/menu.min.js").with_version("1.1.1"), - ))) + )) .alter(InContextOp::AddJQuery); let id = context.required_id::<Menu>(self.id()); diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 2676096a..596803bf 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -27,9 +27,9 @@ impl ModuleTrait for DefaultHomePage { async fn demo() -> ResultPage<Markup, FatalError> { Page::new() .with_title(l("page_title").as_str()) - .with_context(InContextOp::StyleSheet(AssetsOp::Add(StyleSheet::located( - "/theme/module/homepage/styles.css", - )))) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/theme/module/homepage/styles.css" + ))) .add_to("region-content", hello_world()) .add_to("region-content", welcome()) .add_to("region-content", about_pagetop()) diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 33b2a453..1e7b2535 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -16,11 +16,12 @@ impl ThemeTrait for Aliner { } fn before_render_page(&self, page: &mut Page) { - page.alter_context(InContextOp::Favicon(Some( - Favicon::new().with_icon("/theme/favicon.png"), - ))) - .alter_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/aliner/css/styles.css").with_weight(-99), - ))); + page + .alter_context(InContextOp::AddFavicon( + Favicon::new().with_icon("/theme/favicon.png"), + )) + .alter_context(InContextOp::AddStyleSheet( + StyleSheet::located("/aliner/css/styles.css").with_weight(-99), + )); } } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 6edec2e1..85a94ee4 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -18,20 +18,21 @@ impl ThemeTrait for Bootsier { } fn before_render_page(&self, page: &mut Page) { - page.alter_context(InContextOp::Favicon(Some( - Favicon::new().with_icon("/theme/favicon.png"), - ))) - .alter_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/bootsier/css/bootstrap.min.css") - .with_version("5.1.3") - .with_weight(-99), - ))) - .alter_context(InContextOp::JavaScript(AssetsOp::Add( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") - .with_version("5.1.3") - .with_weight(-99), - ))) - .alter_context(InContextOp::AddJQuery); + page + .alter_context(InContextOp::AddFavicon( + Favicon::new().with_icon("/theme/favicon.png"), + )) + .alter_context(InContextOp::AddStyleSheet( + StyleSheet::located("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_context(InContextOp::AddJavaScript( + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_context(InContextOp::AddJQuery); } fn error_404_not_found(&self) -> Container { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index b0f81c4e..6db51da0 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -16,15 +16,16 @@ impl ThemeTrait for Bulmix { } fn before_render_page(&self, page: &mut Page) { - page.alter_context(InContextOp::Favicon(Some( - Favicon::new().with_icon("/theme/favicon.png"), - ))) - .alter_context(InContextOp::StyleSheet(AssetsOp::Add( - StyleSheet::located("/bulmix/css/bulma.min.css") - .with_version("0.9.4") - .with_weight(-99), - ))) - .alter_context(InContextOp::AddJQuery); + page + .alter_context(InContextOp::AddFavicon( + Favicon::new().with_icon("/theme/favicon.png"), + )) + .alter_context(InContextOp::AddStyleSheet( + StyleSheet::located("/bulmix/css/bulma.min.css") + .with_version("0.9.4") + .with_weight(-99), + )) + .alter_context(InContextOp::AddJQuery); } fn before_render_component( diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 0b8f1429..6ef5f37b 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -13,17 +13,26 @@ static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = LazyStatic::new(|| pub enum InContextOp { SetTheme(&'static str), + + AddFavicon(Favicon), + RemoveFavicon, + AddMetadata(&'static str, &'static str), - Favicon(Option<Favicon>), - StyleSheet(AssetsOp<StyleSheet>), - JavaScript(AssetsOp<JavaScript>), + AddProperty(&'static str, &'static str), + + AddStyleSheet(StyleSheet), + RemoveStyleSheet(&'static str), + + AddJavaScript(JavaScript), + RemoveJavaScript(&'static str), AddJQuery, } pub struct InContext { theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, - metadata : Vec<(String, String)>, + metadata : Vec<(&'static str, &'static str)>, + properties : Vec<(&'static str, &'static str)>, stylesheets: Assets<StyleSheet>, javascripts: Assets<JavaScript>, with_jquery: bool, @@ -36,6 +45,7 @@ impl InContext { theme : *DEFAULT_THEME, favicon : None, metadata : Vec::new(), + properties : Vec::new(), stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), with_jquery: false, @@ -48,26 +58,42 @@ impl InContext { InContextOp::SetTheme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); } + + InContextOp::AddFavicon(favicon) => { + self.favicon = Some(favicon); + } + InContextOp::RemoveFavicon => { + self.favicon = None; + } + InContextOp::AddMetadata(name, content) => { - self.metadata.push((name.to_owned(), content.to_owned())); + self.metadata.push((name, content)); } - InContextOp::Favicon(favicon) => { - self.favicon = favicon; + InContextOp::AddProperty(property, content) => { + self.properties.push((property, content)); } - InContextOp::StyleSheet(css) => { - self.stylesheets.alter(css); + + InContextOp::AddStyleSheet(css) => { + self.stylesheets.add(css); } - InContextOp::JavaScript(js) => { - self.javascripts.alter(js); + InContextOp::RemoveStyleSheet(source) => { + self.stylesheets.remove(source); + } + + InContextOp::AddJavaScript(js) => { + self.javascripts.add(js); + } + InContextOp::RemoveJavaScript(source) => { + self.javascripts.remove(source); } InContextOp::AddJQuery => { if !self.with_jquery { - self.javascripts.alter(AssetsOp::Add( + self.javascripts.add( JavaScript::located("/theme/js/jquery.min.js") .with_version("3.6.0") .with_weight(isize::MIN) .with_mode(JSMode::Normal), - )); + ); self.with_jquery = true; } } @@ -92,6 +118,9 @@ impl InContext { @for (name, content) in &self.metadata { meta name=(name) content=(content) {} } + @for (property, content) in &self.properties { + meta property=(property) content=(content) {} + } (self.stylesheets.render()) (self.javascripts.render()) } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index eeaaad2d..daf65c36 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -28,9 +28,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { - page.alter_context(InContextOp::Favicon(Some( + page.alter_context(InContextOp::AddFavicon( Favicon::new().with_icon("/theme/favicon.png"), - ))); + )); } fn render_page_head(&self, page: &mut Page) -> Markup { diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index cb6034ef..cc8c5de9 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -3,7 +3,7 @@ pub use maud::{html, Markup, PreEscaped, DOCTYPE}; mod assets; pub use assets::javascript::{JSMode, JavaScript}; pub use assets::stylesheet::{StyleSheet, TargetMedia}; -pub use assets::{Assets, AssetsOp, SourceValue}; +pub use assets::Assets; mod favicon; pub use favicon::Favicon; diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 1736dbc0..020df76c 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -3,21 +3,14 @@ pub mod stylesheet; use crate::html::{html, Markup}; -pub type SourceValue = &'static str; - pub trait AssetsTrait { - fn source(&self) -> SourceValue; + fn source(&self) -> &'static str; fn weight(&self) -> isize; fn render(&self) -> Markup; } -pub enum AssetsOp<T: AssetsTrait> { - Add(T), - Remove(SourceValue), -} - #[derive(Default)] pub struct Assets<T>(Vec<T>); @@ -26,25 +19,23 @@ impl<T: AssetsTrait> Assets<T> { Assets::<T>(Vec::<T>::new()) } - pub fn alter(&mut self, op: AssetsOp<T>) -> &mut Self { - match op { - AssetsOp::Add(asset) => { - match self.0.iter().position(|x| x.source() == asset.source()) { - Some(index) => { - if self.0[index].weight() > asset.weight() { - self.0.remove(index); - self.0.push(asset); - } - } - _ => self.0.push(asset), - } - } - AssetsOp::Remove(source) => { - if let Some(index) = self.0.iter().position(|x| x.source() == source) { + pub fn add(&mut self, asset: T) -> &mut Self { + match self.0.iter().position(|x| x.source() == asset.source()) { + Some(index) => { + if self.0[index].weight() > asset.weight() { self.0.remove(index); + self.0.push(asset); } } - } + _ => self.0.push(asset), + }; + self + } + + pub fn remove(&mut self, source: &'static str) -> &mut Self { + if let Some(index) = self.0.iter().position(|x| x.source() == source) { + self.0.remove(index); + }; self } diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 03f0a3dc..70297e3a 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,4 +1,4 @@ -use super::{AssetsTrait, SourceValue}; +use super::AssetsTrait; use crate::html::{html, Markup}; #[derive(PartialEq)] @@ -9,7 +9,7 @@ pub enum JSMode { } pub struct JavaScript { - source : SourceValue, + source : &'static str, prefix : &'static str, version: &'static str, weight : isize, @@ -17,7 +17,7 @@ pub struct JavaScript { } impl AssetsTrait for JavaScript { - fn source(&self) -> SourceValue { + fn source(&self) -> &'static str { self.source } @@ -37,7 +37,7 @@ impl AssetsTrait for JavaScript { } impl JavaScript { - pub fn located(source: SourceValue) -> Self { + pub fn located(source: &'static str) -> Self { JavaScript { source, prefix : "", diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 0000aff9..481c0f5d 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,10 +1,10 @@ -use super::{AssetsTrait, SourceValue}; +use super::AssetsTrait; use crate::html::{html, Markup}; pub enum TargetMedia {Default, Print, Screen, Speech} pub struct StyleSheet { - source : SourceValue, + source : &'static str, prefix : &'static str, version: &'static str, media : Option<&'static str>, @@ -12,7 +12,7 @@ pub struct StyleSheet { } impl AssetsTrait for StyleSheet { - fn source(&self) -> SourceValue { + fn source(&self) -> &'static str { self.source } @@ -31,7 +31,7 @@ impl AssetsTrait for StyleSheet { } impl StyleSheet { - pub fn located(source: SourceValue) -> Self { + pub fn located(source: &'static str) -> Self { StyleSheet { source, prefix : "", diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index cde06cd4..02546e42 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -60,34 +60,32 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError Page::new() .with_title(title) .with_context(InContextOp::AddMetadata("theme-color", "#ffffff")) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/variables.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/css/variables.css") )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/general.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/css/general.css") )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/css/chrome.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/css/chrome.css") )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add( - StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print) - ) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print) )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/FontAwesome/css/font-awesome.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/FontAwesome/css/font-awesome.css") )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/fonts/fonts.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/fonts/fonts.css") )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/highlight.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/highlight.css") )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/tomorrow-night.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/tomorrow-night.css") )) - .with_context(InContextOp::StyleSheet( - AssetsOp::<StyleSheet>::Add(StyleSheet::located("/doc/ayu-highlight.css")) + .with_context(InContextOp::AddStyleSheet( + StyleSheet::located("/doc/ayu-highlight.css") )) .add_to( "region-content", From 31daf11faaa752df441f3ece9dc4d9163a0841aa Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 30 Jul 2022 06:11:30 +0200 Subject: [PATCH 159/853] Modifica InContext por PageContext y PageOp --- pagetop-admin/src/summary.rs | 2 +- pagetop/src/base/component/anchor.rs | 4 +- pagetop/src/base/component/block.rs | 6 +-- pagetop/src/base/component/container.rs | 6 +-- .../src/base/component/form_element/button.rs | 4 +- .../src/base/component/form_element/date.rs | 4 +- .../src/base/component/form_element/form.rs | 6 +-- .../src/base/component/form_element/hidden.rs | 2 +- .../src/base/component/form_element/input.rs | 4 +- pagetop/src/base/component/grid/column.rs | 6 +-- pagetop/src/base/component/grid/row.rs | 6 +-- pagetop/src/base/component/heading.rs | 4 +- pagetop/src/base/component/html.rs | 4 +- pagetop/src/base/component/icon.rs | 8 +-- pagetop/src/base/component/image.rs | 4 +- pagetop/src/base/component/menu.rs | 18 +++---- pagetop/src/base/component/paragraph.rs | 4 +- pagetop/src/base/module/homepage.rs | 2 +- pagetop/src/base/theme/aliner.rs | 4 +- pagetop/src/base/theme/bootsier.rs | 8 +-- pagetop/src/base/theme/bulmix.rs | 10 ++-- pagetop/src/core/component.rs | 11 ++-- pagetop/src/core/component/bundle.rs | 5 +- pagetop/src/core/component/definition.rs | 18 +++---- pagetop/src/core/theme/definition.rs | 14 +++-- pagetop/src/html.rs | 2 +- pagetop/src/response/page.rs | 22 ++++++++ .../component => response/page}/context.rs | 54 +++++++------------ pagetop/src/response/page/definition.rs | 20 ++++--- website/src/mdbook.rs | 20 +++---- 30 files changed, 149 insertions(+), 133 deletions(-) rename pagetop/src/{core/component => response/page}/context.rs (75%) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index e09071f5..c91b31db 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -41,7 +41,7 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { .with_item(MenuItem::label("Opción 4")); Page::new() - .with_context(InContextOp::SetTheme("Bootsier")) + .with_context(PageOp::SetTheme("Bootsier")) .with_title("Admin") .add_to("top-menu", top_menu) .add_to( diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 78febf27..62528774 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -57,11 +57,11 @@ impl ComponentTrait for Anchor { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Context(name) => Some(name.as_str()), diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 9b0636c1..9c05c6ef 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -35,15 +35,15 @@ impl ComponentTrait for Block { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn before_render(&mut self, context: &mut InContext) { + fn before_render(&mut self, context: &mut PageContext) { before_render_inline(self, context); } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { let id = context.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes().get()] { diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index ad7be745..1e1c5a3a 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -45,15 +45,15 @@ impl ComponentTrait for Container { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn before_render(&mut self, context: &mut InContext) { + fn before_render(&mut self, context: &mut PageContext) { before_render_inline(self, context); } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { match self.container_type() { ContainerType::Header => html! { header id=[self.id().get()] class=[self.classes().get()] { diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index f349ea5a..8d9d69ad 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -44,11 +44,11 @@ impl ComponentTrait for Button { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Reset => "reset", diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 2ce8c357..7d69a614 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -48,11 +48,11 @@ impl ComponentTrait for Date { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 9c80c05a..8c5a0235 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -44,15 +44,15 @@ impl ComponentTrait for Form { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn before_render(&mut self, context: &mut InContext) { + fn before_render(&mut self, context: &mut PageContext) { before_render_inline(self, context); } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { let method = match self.method() { FormMethod::Get => None, FormMethod::Post => Some("post".to_owned()), diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index ed24a56f..be1959f6 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -25,7 +25,7 @@ impl ComponentTrait for Hidden { self.weight } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { let id = self.name().get().map(|name| concat_string!("value-", name)); html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index b88d4902..7f85c6a6 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -65,11 +65,11 @@ impl ComponentTrait for Input { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { let type_input = match self.input_type() { InputType::Email => "email", InputType::Password => "password", diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 57b2e51a..e7ed5bb9 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -64,15 +64,15 @@ impl ComponentTrait for Column { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn before_render(&mut self, context: &mut InContext) { + fn before_render(&mut self, context: &mut PageContext) { before_render_inline(self, context); } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { (self.components().render(context)) diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index e92dfc3d..5653ef4e 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -33,15 +33,15 @@ impl ComponentTrait for Row { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn before_render(&mut self, context: &mut InContext) { + fn before_render(&mut self, context: &mut PageContext) { before_render_inline(self, context); } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { (self.columns().render(context)) diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 5d3e7652..219a345a 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -54,11 +54,11 @@ impl ComponentTrait for Heading { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { let id = self.id().get(); let classes = self.classes().get(); html! { @match &self.heading_type() { diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 69e9e78d..bd12ccaa 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -27,11 +27,11 @@ impl ComponentTrait for Html { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { html! { (*self.html()) } } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index cc2f51d1..acf0c8e7 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -27,17 +27,17 @@ impl ComponentTrait for Icon { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn before_render(&mut self, context: &mut InContext) { - context.alter(InContextOp::AddStyleSheet( + fn before_render(&mut self, context: &mut PageContext) { + context.alter(PageOp::AddStyleSheet( StyleSheet::located("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), )); } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { html! { i class=[self.classes().get()] {}; } } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 4f8fadac..db173e3d 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -31,11 +31,11 @@ impl ComponentTrait for Image { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { html! { img src=[self.source().get()] diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 1178478e..84a9b8f9 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -37,11 +37,11 @@ impl ComponentTrait for MenuItem { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { match self.item_type() { MenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } @@ -196,26 +196,26 @@ impl ComponentTrait for Menu { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn before_render(&mut self, context: &mut InContext) { + fn before_render(&mut self, context: &mut PageContext) { before_render_inline(self, context); } - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { context - .alter(InContextOp::AddStyleSheet( + .alter(PageOp::AddStyleSheet( StyleSheet::located("/theme/menu/css/menu.css").with_version("1.1.1"), )) - .alter(InContextOp::AddStyleSheet( + .alter(PageOp::AddStyleSheet( StyleSheet::located("/theme/menu/css/menu-clean.css").with_version("1.1.1"), )) - .alter(InContextOp::AddJavaScript( + .alter(PageOp::AddJavaScript( JavaScript::located("/theme/menu/js/menu.min.js").with_version("1.1.1"), )) - .alter(InContextOp::AddJQuery); + .alter(PageOp::AddJQuery); let id = context.required_id::<Menu>(self.id()); diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index bb7af142..f469e180 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -42,11 +42,11 @@ impl ComponentTrait for Paragraph { self.weight } - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { (self.renderable)(context) } - fn default_render(&self, _: &mut InContext) -> Markup { + fn default_render(&self, _: &mut PageContext) -> Markup { html! { p id=[self.id().get()] class=[self.classes().get()] { (*self.html()) } } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 596803bf..47f8ffcd 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -27,7 +27,7 @@ impl ModuleTrait for DefaultHomePage { async fn demo() -> ResultPage<Markup, FatalError> { Page::new() .with_title(l("page_title").as_str()) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/theme/module/homepage/styles.css" ))) .add_to("region-content", hello_world()) diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 1e7b2535..ca9bd6d1 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -17,10 +17,10 @@ impl ThemeTrait for Aliner { fn before_render_page(&self, page: &mut Page) { page - .alter_context(InContextOp::AddFavicon( + .alter_context(PageOp::AddFavicon( Favicon::new().with_icon("/theme/favicon.png"), )) - .alter_context(InContextOp::AddStyleSheet( + .alter_context(PageOp::AddStyleSheet( StyleSheet::located("/aliner/css/styles.css").with_weight(-99), )); } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 85a94ee4..6033742a 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -19,20 +19,20 @@ impl ThemeTrait for Bootsier { fn before_render_page(&self, page: &mut Page) { page - .alter_context(InContextOp::AddFavicon( + .alter_context(PageOp::AddFavicon( Favicon::new().with_icon("/theme/favicon.png"), )) - .alter_context(InContextOp::AddStyleSheet( + .alter_context(PageOp::AddStyleSheet( StyleSheet::located("/bootsier/css/bootstrap.min.css") .with_version("5.1.3") .with_weight(-99), )) - .alter_context(InContextOp::AddJavaScript( + .alter_context(PageOp::AddJavaScript( JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") .with_version("5.1.3") .with_weight(-99), )) - .alter_context(InContextOp::AddJQuery); + .alter_context(PageOp::AddJQuery); } fn error_404_not_found(&self) -> Container { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 6db51da0..fae254ed 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -17,21 +17,21 @@ impl ThemeTrait for Bulmix { fn before_render_page(&self, page: &mut Page) { page - .alter_context(InContextOp::AddFavicon( + .alter_context(PageOp::AddFavicon( Favicon::new().with_icon("/theme/favicon.png"), )) - .alter_context(InContextOp::AddStyleSheet( + .alter_context(PageOp::AddStyleSheet( StyleSheet::located("/bulmix/css/bulma.min.css") .with_version("0.9.4") .with_weight(-99), )) - .alter_context(InContextOp::AddJQuery); + .alter_context(PageOp::AddJQuery); } fn before_render_component( &self, component: &mut dyn ComponentTrait, - _context: &mut InContext, + _context: &mut PageContext, ) { match component.handler() { COMPONENT_ANCHOR => { @@ -110,7 +110,7 @@ impl ThemeTrait for Bulmix { fn render_component( &self, component: &dyn ComponentTrait, - _context: &mut InContext, + _context: &mut PageContext, ) -> Option<Markup> { match component.handler() { COMPONENT_ICON => { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 471eefbc..175a6d87 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,6 +1,3 @@ -mod context; -pub use context::{InContext, InContextOp}; - mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; @@ -11,12 +8,14 @@ mod all; pub use all::add_component_to; pub(crate) use all::common_components; -pub type Renderable = fn(_: &InContext) -> bool; +use crate::response::page::PageContext; -pub fn render_always(_: &InContext) -> bool { +pub type Renderable = fn(_: &PageContext) -> bool; + +pub fn render_always(_: &PageContext) -> bool { true } -pub fn render_never(_: &InContext) -> bool { +pub fn render_never(_: &PageContext) -> bool { false } diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 4c298fbe..ce294b37 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,5 +1,6 @@ -use super::{ComponentTrait, InContext}; +use super::ComponentTrait; use crate::html::{html, Markup}; +use crate::response::page::PageContext; use std::sync::{Arc, RwLock}; @@ -25,7 +26,7 @@ impl ComponentsBundle { self.0.clear(); } - pub fn render(&self, context: &mut InContext) -> Markup { + pub fn render(&self, context: &mut PageContext) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 0c69f90e..6786ca9b 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,11 +1,11 @@ -use super::InContext; use crate::html::{html, Markup}; +use crate::response::page::PageContext; use crate::util::{single_type_name, Handler}; pub use std::any::Any as AnyComponent; pub trait BaseComponent { - fn render(&mut self, context: &mut InContext) -> Markup; + fn render(&mut self, context: &mut PageContext) -> Markup; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -28,15 +28,15 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn is_renderable(&self, context: &InContext) -> bool { + fn is_renderable(&self, context: &PageContext) -> bool { true } #[allow(unused_variables)] - fn before_render(&mut self, context: &mut InContext) {} + fn before_render(&mut self, context: &mut PageContext) {} #[allow(unused_variables)] - fn default_render(&self, context: &mut InContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { html! {} } @@ -46,7 +46,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } impl<C: ComponentTrait> BaseComponent for C { - fn render(&mut self, context: &mut InContext) -> Markup { + fn render(&mut self, context: &mut PageContext) -> Markup { // Acciones del componente antes de renderizar. self.before_render(context); @@ -77,7 +77,7 @@ macro_rules! hook_before_render_component { paste::paste! { $crate::pub_const_handler!($ACTION_HANDLER); - type Action = fn(&$Component, &mut InContext); + type Action = fn(&$Component, &mut PageContext); pub struct [< BeforeRender $Component >] { action: Option<Action>, @@ -118,7 +118,7 @@ macro_rules! hook_before_render_component { self } - pub fn run(&self, component: &mut $Component, context: &mut InContext) { + pub fn run(&self, component: &mut $Component, context: &mut PageContext) { if let Some(action) = self.action { action(component, context) } @@ -126,7 +126,7 @@ macro_rules! hook_before_render_component { } #[inline(always)] - fn before_render_inline(component: &mut $Component, context: &mut InContext) { + fn before_render_inline(component: &mut $Component, context: &mut PageContext) { run_actions( $ACTION_HANDLER, |action| action_ref::<[< BeforeRender $Component >]>(&**action).run(component, context) diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index daf65c36..f1a65d46 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -2,9 +2,9 @@ use crate::app; use crate::base::component::{Container, Html}; use crate::concat_string; use crate::config::SETTINGS; -use crate::core::component::{ComponentTrait, InContext, InContextOp}; +use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; -use crate::response::page::Page; +use crate::response::page::{Page, PageContext, PageOp}; use crate::util::{single_type_name, Handler}; pub trait BaseTheme { @@ -28,7 +28,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { - page.alter_context(InContextOp::AddFavicon( + page.alter_context(PageOp::AddFavicon( Favicon::new().with_icon("/theme/favicon.png"), )); } @@ -83,7 +83,11 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { } #[allow(unused_variables)] - fn before_render_component(&self, component: &mut dyn ComponentTrait, context: &mut InContext) { + fn before_render_component( + &self, + component: &mut dyn ComponentTrait, + context: &mut PageContext, + ) { /* Cómo usarlo: @@ -101,7 +105,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn render_component( &self, component: &dyn ComponentTrait, - context: &mut InContext, + context: &mut PageContext, ) -> Option<Markup> { None /* diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index cc8c5de9..7bbfede9 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -1,7 +1,7 @@ pub use maud::{html, Markup, PreEscaped, DOCTYPE}; mod assets; -pub use assets::javascript::{JSMode, JavaScript}; +pub use assets::javascript::{JavaScript, JSMode}; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::Assets; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 3f82c157..cd6688fb 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,5 +1,27 @@ +use crate::html::{Favicon, StyleSheet, JavaScript}; + pub use actix_web::Result as ResultPage; +pub enum PageOp { + SetTheme(&'static str), + + AddFavicon(Favicon), + RemoveFavicon, + + AddMetadata(&'static str, &'static str), + AddProperty(&'static str, &'static str), + + AddStyleSheet(StyleSheet), + RemoveStyleSheet(&'static str), + + AddJavaScript(JavaScript), + RemoveJavaScript(&'static str), + AddJQuery, +} + +mod context; +pub use context::PageContext; + mod hook; pub use hook::{BeforeRenderPageHook, HOOK_BEFORE_RENDER_PAGE}; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/response/page/context.rs similarity index 75% rename from pagetop/src/core/component/context.rs rename to pagetop/src/response/page/context.rs index 6ef5f37b..c77465e1 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/response/page/context.rs @@ -1,7 +1,8 @@ +use super::PageOp; use crate::config::SETTINGS; use crate::core::theme::all::theme_by_single_name; use crate::core::theme::ThemeTrait; -use crate::html::*; +use crate::html::{html, Assets, Favicon, StyleSheet, JavaScript, JSMode, Markup, IdentifierValue}; use crate::{base, concat_string, util, LazyStatic}; static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = LazyStatic::new(|| @@ -11,24 +12,7 @@ static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = LazyStatic::new(|| } ); -pub enum InContextOp { - SetTheme(&'static str), - - AddFavicon(Favicon), - RemoveFavicon, - - AddMetadata(&'static str, &'static str), - AddProperty(&'static str, &'static str), - - AddStyleSheet(StyleSheet), - RemoveStyleSheet(&'static str), - - AddJavaScript(JavaScript), - RemoveJavaScript(&'static str), - AddJQuery, -} - -pub struct InContext { +pub struct PageContext { theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, metadata : Vec<(&'static str, &'static str)>, @@ -39,9 +23,9 @@ pub struct InContext { id_counter : usize, } -impl InContext { +impl PageContext { pub fn new() -> Self { - InContext { + PageContext { theme : *DEFAULT_THEME, favicon : None, metadata : Vec::new(), @@ -53,40 +37,40 @@ impl InContext { } } - pub fn alter(&mut self, op: InContextOp) -> &mut Self { + pub fn alter(&mut self, op: PageOp) -> &mut Self { match op { - InContextOp::SetTheme(theme_name) => { + PageOp::SetTheme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); } - InContextOp::AddFavicon(favicon) => { + PageOp::AddFavicon(favicon) => { self.favicon = Some(favicon); } - InContextOp::RemoveFavicon => { + PageOp::RemoveFavicon => { self.favicon = None; } - InContextOp::AddMetadata(name, content) => { + PageOp::AddMetadata(name, content) => { self.metadata.push((name, content)); } - InContextOp::AddProperty(property, content) => { + PageOp::AddProperty(property, content) => { self.properties.push((property, content)); } - InContextOp::AddStyleSheet(css) => { + PageOp::AddStyleSheet(css) => { self.stylesheets.add(css); } - InContextOp::RemoveStyleSheet(source) => { + PageOp::RemoveStyleSheet(source) => { self.stylesheets.remove(source); } - InContextOp::AddJavaScript(js) => { + PageOp::AddJavaScript(js) => { self.javascripts.add(js); } - InContextOp::RemoveJavaScript(source) => { + PageOp::RemoveJavaScript(source) => { self.javascripts.remove(source); } - InContextOp::AddJQuery => { + PageOp::AddJQuery => { if !self.with_jquery { self.javascripts.add( JavaScript::located("/theme/js/jquery.min.js") @@ -101,13 +85,13 @@ impl InContext { self } - /// InContext GETTERS. + /// PageContext GETTERS. pub(crate) fn theme(&mut self) -> &'static dyn ThemeTrait { self.theme } - /// InContext RENDER. + /// PageContext RENDER. pub fn render(&mut self) -> Markup { html! { @@ -126,7 +110,7 @@ impl InContext { } } - // InContext EXTRAS. + // PageContext EXTRAS. pub fn required_id<T>(&mut self, id: &IdentifierValue) -> String { match id.get() { diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 291ec6b9..5543938d 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,9 +1,15 @@ -use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; +use super::{ + BeforeRenderPageHook, + PageContext, + PageOp, + ResultPage, + HOOK_BEFORE_RENDER_PAGE, +}; use crate::app::fatal_error::FatalError; use crate::config::SETTINGS; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; -use crate::html::*; +use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; use crate::{trace, LazyStatic}; use std::collections::HashMap; @@ -42,7 +48,7 @@ pub enum TextDirection { } pub struct Page { - context : InContext, + context : PageContext, language : AttributeValue, direction : AttributeValue, title : AttributeValue, @@ -55,7 +61,7 @@ pub struct Page { impl Page { pub fn new() -> Self { Page { - context : InContext::new(), + context : PageContext::new(), language : match &*DEFAULT_LANGUAGE { Some(language) => AttributeValue::new_with_value(language), _ => AttributeValue::new(), @@ -74,7 +80,7 @@ impl Page { // Page BUILDER. - pub fn with_context(mut self, op: InContextOp) -> Self { + pub fn with_context(mut self, op: PageOp) -> Self { self.alter_context(op); self } @@ -121,7 +127,7 @@ impl Page { // Page ALTER. - pub fn alter_context(&mut self, op: InContextOp) -> &mut Self { + pub fn alter_context(&mut self, op: PageOp) -> &mut Self { self.context.alter(op); self } @@ -162,7 +168,7 @@ impl Page { // Page GETTERS. - pub fn context(&mut self) -> &mut InContext { + pub fn context(&mut self) -> &mut PageContext { &mut self.context } diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index 02546e42..66e4e0b1 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -59,32 +59,32 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError Page::new() .with_title(title) - .with_context(InContextOp::AddMetadata("theme-color", "#ffffff")) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddMetadata("theme-color", "#ffffff")) + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/css/variables.css") )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/css/general.css") )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/css/chrome.css") )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print) )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/FontAwesome/css/font-awesome.css") )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/fonts/fonts.css") )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/highlight.css") )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/tomorrow-night.css") )) - .with_context(InContextOp::AddStyleSheet( + .with_context(PageOp::AddStyleSheet( StyleSheet::located("/doc/ayu-highlight.css") )) .add_to( From 592cd9ccdaa82318948896053cf852f86bbe7f6a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 30 Jul 2022 06:56:36 +0200 Subject: [PATCH 160/853] =?UTF-8?q?Actualiza=20formato=20del=20c=C3=B3digo?= =?UTF-8?q?=20aplicando=20cargo=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/src/app.rs | 8 +- pagetop/src/app/fatal_error.rs | 7 +- pagetop/src/app/locale.rs | 7 +- pagetop/src/app/tracing.rs | 4 +- pagetop/src/base/component/anchor.rs | 3 + pagetop/src/base/component/block.rs | 2 + pagetop/src/base/component/container.rs | 2 + .../src/base/component/form_element/button.rs | 3 + .../src/base/component/form_element/date.rs | 2 + .../src/base/component/form_element/form.rs | 2 + .../src/base/component/form_element/hidden.rs | 2 + .../src/base/component/form_element/input.rs | 8 ++ pagetop/src/base/component/grid/column.rs | 46 ++++++----- pagetop/src/base/component/grid/row.rs | 2 + pagetop/src/base/component/heading.rs | 3 + pagetop/src/base/component/html.rs | 2 + pagetop/src/base/component/icon.rs | 2 + pagetop/src/base/component/image.rs | 2 + pagetop/src/base/component/menu.rs | 10 +++ pagetop/src/base/component/paragraph.rs | 3 + pagetop/src/base/module/homepage.rs | 4 +- pagetop/src/base/theme/aliner.rs | 13 ++-- pagetop/src/base/theme/bootsier.rs | 76 +++++++++---------- pagetop/src/base/theme/bulmix.rs | 20 ++--- pagetop/src/config.rs | 6 ++ pagetop/src/core/component/all.rs | 5 +- pagetop/src/core/hook.rs | 2 +- pagetop/src/core/hook/all.rs | 9 +-- pagetop/src/core/module/all.rs | 8 +- pagetop/src/core/theme/all.rs | 5 +- pagetop/src/core/theme/definition.rs | 26 +++---- pagetop/src/html.rs | 2 +- pagetop/src/html/assets/javascript.rs | 14 ++-- pagetop/src/html/assets/stylesheet.rs | 10 ++- pagetop/src/html/classes.rs | 2 + pagetop/src/html/favicon.rs | 6 +- pagetop/src/prelude.rs | 8 +- pagetop/src/response/page.rs | 2 +- pagetop/src/response/page/context.rs | 13 ++-- pagetop/src/response/page/definition.rs | 10 +-- pagetop/src/util.rs | 14 +--- 42 files changed, 210 insertions(+), 167 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index ad3604d4..cac1d25b 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -44,7 +44,7 @@ fluent-templates = "0.7.1" unic-langid = "0.9.0" actix-web = "4.1.0" -actix-files = "0.6.1" +actix-web-files = { package = "actix-files", version = "0.6.1" } actix-web-static-files = "4.0.0" static-files = "0.2.3" diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 0ff72856..114da34e 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,6 +1,8 @@ -pub use actix_web::{http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder}; +pub use actix_web::{ + http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, +}; +pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; -pub use actix_files::Files as ActixFiles; mod banner; @@ -16,4 +18,4 @@ pub use definition::AppTrait; pub mod application; -pub mod fatal_error; \ No newline at end of file +pub mod fatal_error; diff --git a/pagetop/src/app/fatal_error.rs b/pagetop/src/app/fatal_error.rs index 8bc30f50..a6e7c29d 100644 --- a/pagetop/src/app/fatal_error.rs +++ b/pagetop/src/app/fatal_error.rs @@ -1,5 +1,5 @@ -use crate::app::HttpResponse; use crate::app::http::{header::ContentType, StatusCode}; +use crate::app::HttpResponse; use crate::response::{page::Page, ResponseError}; use std::fmt; @@ -36,7 +36,7 @@ impl fmt::Display for FatalError { } else { write!(f, "Access Denied") } - }, + } // Error 404. FatalError::NotFound => { let mut error_page = Page::new(); @@ -51,7 +51,7 @@ impl fmt::Display for FatalError { } else { write!(f, "Not Found") } - }, + } // Error 412. FatalError::PreconditionFailed => write!(f, "Precondition Failed"), // Error 500. @@ -69,6 +69,7 @@ impl ResponseError for FatalError { .body(self.to_string()) } + #[rustfmt::skip] fn status_code(&self) -> StatusCode { match *self { FatalError::NotModified => StatusCode::NOT_MODIFIED, diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index 5354ffdb..9775867f 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -6,8 +6,8 @@ use unic_langid::LanguageIdentifier; /// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] /// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de /// la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| - match SETTINGS.app.language.parse() { +pub static LANGID: LazyStatic<LanguageIdentifier> = + LazyStatic::new(|| match SETTINGS.app.language.parse() { Ok(language) => language, Err(_) => { trace::warn!( @@ -20,5 +20,4 @@ pub static LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| ); "en-US".parse().unwrap() } - } -); + }); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index 4282cb7d..bc6bf515 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -17,8 +17,10 @@ use tracing_subscriber::EnvFilter; /// `Lazy<WorkerGuard>` se garantiza que todos los registros almacenados se /// enviarán antes de terminar la ejecución. +#[rustfmt::skip] pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { - let env_filter = EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); + let env_filter = + EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); let rolling = SETTINGS.log.rolling.to_lowercase(); let (non_blocking, guard) = match rolling.as_str() { diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 62528774..96416ace 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -18,6 +18,7 @@ pub enum AnchorTarget { pub type AnchorIcon = ComponentsBundle; +#[rustfmt::skip] pub struct Anchor { weight : isize, renderable : Renderable, @@ -33,6 +34,7 @@ pub struct Anchor { } impl ComponentTrait for Anchor { + #[rustfmt::skip] fn new() -> Self { Anchor { weight : 0, @@ -61,6 +63,7 @@ impl ComponentTrait for Anchor { (self.renderable)(context) } + #[rustfmt::skip] fn default_render(&self, context: &mut PageContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 9c05c6ef..9e76a505 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -4,6 +4,7 @@ pub_const_handler!(COMPONENT_BLOCK); hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); +#[rustfmt::skip] pub struct Block { weight : isize, renderable: Renderable, @@ -15,6 +16,7 @@ pub struct Block { } impl ComponentTrait for Block { + #[rustfmt::skip] fn new() -> Self { Block { weight : 0, diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 1e1c5a3a..097d82b7 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -12,6 +12,7 @@ pub enum ContainerType { Wrapper, } +#[rustfmt::skip] pub struct Container { weight : isize, renderable : Renderable, @@ -24,6 +25,7 @@ pub struct Container { } impl ComponentTrait for Container { + #[rustfmt::skip] fn new() -> Self { Container { weight : 0, diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index 8d9d69ad..5e127f08 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -8,6 +8,7 @@ pub enum ButtonType { Submit, } +#[rustfmt::skip] pub struct Button { weight : isize, renderable : Renderable, @@ -21,6 +22,7 @@ pub struct Button { } impl ComponentTrait for Button { + #[rustfmt::skip] fn new() -> Self { Button { weight : 0, @@ -48,6 +50,7 @@ impl ComponentTrait for Button { (self.renderable)(context) } + #[rustfmt::skip] fn default_render(&self, _: &mut PageContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 7d69a614..871aeffd 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -2,6 +2,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_DATE); +#[rustfmt::skip] pub struct Date { weight : isize, renderable : Renderable, @@ -20,6 +21,7 @@ pub struct Date { } impl ComponentTrait for Date { + #[rustfmt::skip] fn new() -> Self { Date { weight : 0, diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 8c5a0235..68b192fd 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -9,6 +9,7 @@ pub enum FormMethod { Post, } +#[rustfmt::skip] pub struct Form { weight : isize, renderable: Renderable, @@ -22,6 +23,7 @@ pub struct Form { } impl ComponentTrait for Form { + #[rustfmt::skip] fn new() -> Self { Form { weight : 0, diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index be1959f6..c56ee109 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -2,6 +2,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_HIDDEN); +#[rustfmt::skip] pub struct Hidden { weight: isize, name : IdentifierValue, @@ -9,6 +10,7 @@ pub struct Hidden { } impl ComponentTrait for Hidden { + #[rustfmt::skip] fn new() -> Self { Hidden { weight: 0, diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 7f85c6a6..15236e16 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -11,6 +11,7 @@ pub enum InputType { Url, } +#[rustfmt::skip] pub struct Input { weight : isize, renderable : Renderable, @@ -33,6 +34,7 @@ pub struct Input { } impl ComponentTrait for Input { + #[rustfmt::skip] fn new() -> Self { Input { weight : 0, @@ -69,6 +71,7 @@ impl ComponentTrait for Input { (self.renderable)(context) } + #[rustfmt::skip] fn default_render(&self, _: &mut PageContext) -> Markup { let type_input = match self.input_type() { InputType::Email => "email", @@ -130,6 +133,7 @@ impl Input { Input::new() } + #[rustfmt::skip] pub fn password() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield"), @@ -139,6 +143,7 @@ impl Input { input } + #[rustfmt::skip] pub fn search() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield"), @@ -148,6 +153,7 @@ impl Input { input } + #[rustfmt::skip] pub fn email() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield"), @@ -157,6 +163,7 @@ impl Input { input } + #[rustfmt::skip] pub fn telephone() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield"), @@ -166,6 +173,7 @@ impl Input { input } + #[rustfmt::skip] pub fn url() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield"), diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index e7ed5bb9..5ddba56c 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -4,16 +4,16 @@ pub_const_handler!(COMPONENT_COLUMN); hook_before_render_component!(HOOK_BEFORE_RENDER_COLUMN, Column); -const SIZE_DEFAULT: &str = "col-md"; -const SIZE_1_OF_12: &str = "col-md-1"; -const SIZE_2_OF_12: &str = "col-md-2"; -const SIZE_3_OF_12: &str = "col-md-3"; -const SIZE_4_OF_12: &str = "col-md-4"; -const SIZE_5_OF_12: &str = "col-md-5"; -const SIZE_6_OF_12: &str = "col-md-6"; -const SIZE_7_OF_12: &str = "col-md-7"; -const SIZE_8_OF_12: &str = "col-md-8"; -const SIZE_9_OF_12: &str = "col-md-9"; +const SIZE__DEFAULT: &str = "col-md"; +const SIZE__1_OF_12: &str = "col-md-1"; +const SIZE__2_OF_12: &str = "col-md-2"; +const SIZE__3_OF_12: &str = "col-md-3"; +const SIZE__4_OF_12: &str = "col-md-4"; +const SIZE__5_OF_12: &str = "col-md-5"; +const SIZE__6_OF_12: &str = "col-md-6"; +const SIZE__7_OF_12: &str = "col-md-7"; +const SIZE__8_OF_12: &str = "col-md-8"; +const SIZE__9_OF_12: &str = "col-md-9"; const SIZE_10_OF_12: &str = "col-md-10"; const SIZE_11_OF_12: &str = "col-md-11"; const SIZE_12_OF_12: &str = "col-md-12"; @@ -33,6 +33,8 @@ pub enum ColumnSize { Is11of12, IsFull, } + +#[rustfmt::skip] pub struct Column { weight : isize, renderable: Renderable, @@ -44,12 +46,13 @@ pub struct Column { } impl ComponentTrait for Column { + #[rustfmt::skip] fn new() -> Self { Column { weight : 0, renderable: render_always, id : IdentifierValue::new(), - classes : Classes::new_with_default(SIZE_DEFAULT), + classes : Classes::new_with_default(SIZE__DEFAULT), size : ColumnSize::Default, components: ComponentsBundle::new(), template : "default".to_owned(), @@ -149,18 +152,19 @@ impl Column { self } + #[rustfmt::skip] pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { match size { - ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE_DEFAULT), - ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_1_OF_12), - ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_2_OF_12), - ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_3_OF_12), - ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_4_OF_12), - ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_5_OF_12), - ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_6_OF_12), - ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_7_OF_12), - ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_8_OF_12), - ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_9_OF_12), + ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE__DEFAULT), + ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__1_OF_12), + ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__2_OF_12), + ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__3_OF_12), + ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__4_OF_12), + ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__5_OF_12), + ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__6_OF_12), + ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__7_OF_12), + ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__8_OF_12), + ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__9_OF_12), ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 5653ef4e..2652bbce 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -4,6 +4,7 @@ pub_const_handler!(COMPONENT_ROW); hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); +#[rustfmt::skip] pub struct Row { weight : isize, renderable: Renderable, @@ -14,6 +15,7 @@ pub struct Row { } impl ComponentTrait for Row { + #[rustfmt::skip] fn new() -> Self { Row { weight : 0, diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 219a345a..0695bad2 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -21,6 +21,7 @@ pub enum HeadingDisplay { Subtitle, } +#[rustfmt::skip] pub struct Heading { weight : isize, renderable : Renderable, @@ -33,6 +34,7 @@ pub struct Heading { } impl ComponentTrait for Heading { + #[rustfmt::skip] fn new() -> Self { Heading { weight : 0, @@ -191,6 +193,7 @@ impl Heading { self } + #[rustfmt::skip] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; self.classes.alter( diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index bd12ccaa..8454960f 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -2,6 +2,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_HTML); +#[rustfmt::skip] pub struct Html { weight : isize, renderable: Renderable, @@ -10,6 +11,7 @@ pub struct Html { } impl ComponentTrait for Html { + #[rustfmt::skip] fn new() -> Self { Html { weight : 0, diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index acf0c8e7..4b8eab6a 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -2,6 +2,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_ICON); +#[rustfmt::skip] pub struct Icon { weight : isize, renderable: Renderable, @@ -10,6 +11,7 @@ pub struct Icon { } impl ComponentTrait for Icon { + #[rustfmt::skip] fn new() -> Self { Icon { weight : 0, diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index db173e3d..2e0de6d6 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -2,6 +2,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_IMAGE); +#[rustfmt::skip] pub struct Image { weight : isize, renderable: Renderable, @@ -12,6 +13,7 @@ pub struct Image { } impl ComponentTrait for Image { + #[rustfmt::skip] fn new() -> Self { Image { weight : 0, diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 84a9b8f9..2ee45773 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -14,6 +14,7 @@ pub enum MenuItemType { // MenuItem. +#[rustfmt::skip] pub struct MenuItem { weight : isize, renderable: Renderable, @@ -21,6 +22,7 @@ pub struct MenuItem { } impl ComponentTrait for MenuItem { + #[rustfmt::skip] fn new() -> Self { MenuItem { weight : 0, @@ -82,6 +84,7 @@ impl ComponentTrait for MenuItem { } impl MenuItem { + #[rustfmt::skip] pub fn label(label: &str) -> Self { MenuItem { weight : 0, @@ -90,6 +93,7 @@ impl MenuItem { } } + #[rustfmt::skip] pub fn link(label: &str, path: &str) -> Self { MenuItem { weight : 0, @@ -98,6 +102,7 @@ impl MenuItem { } } + #[rustfmt::skip] pub fn link_blank(label: &str, path: &str) -> Self { MenuItem { weight : 0, @@ -106,6 +111,7 @@ impl MenuItem { } } + #[rustfmt::skip] pub fn html(html: Markup) -> Self { MenuItem { weight : 0, @@ -114,6 +120,7 @@ impl MenuItem { } } + #[rustfmt::skip] pub fn separator() -> Self { MenuItem { weight : 0, @@ -122,6 +129,7 @@ impl MenuItem { } } + #[rustfmt::skip] pub fn submenu(label: &str, menu: Menu) -> Self { MenuItem { weight : 0, @@ -167,6 +175,7 @@ pub_const_handler!(COMPONENT_MENU); hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, Menu); +#[rustfmt::skip] pub struct Menu { weight : isize, renderable: Renderable, @@ -177,6 +186,7 @@ pub struct Menu { } impl ComponentTrait for Menu { + #[rustfmt::skip] fn new() -> Self { Menu { weight : 0, diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index f469e180..74124be3 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -11,6 +11,7 @@ pub enum ParagraphDisplay { Normal, } +#[rustfmt::skip] pub struct Paragraph { weight : isize, renderable: Renderable, @@ -22,6 +23,7 @@ pub struct Paragraph { } impl ComponentTrait for Paragraph { + #[rustfmt::skip] fn new() -> Self { Paragraph { weight : 0, @@ -130,6 +132,7 @@ impl Paragraph { self } + #[rustfmt::skip] pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { self.display = display; self.classes.alter( diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 47f8ffcd..eb8e41dd 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -27,8 +27,8 @@ impl ModuleTrait for DefaultHomePage { async fn demo() -> ResultPage<Markup, FatalError> { Page::new() .with_title(l("page_title").as_str()) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/theme/module/homepage/styles.css" + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/theme/module/homepage/styles.css", ))) .add_to("region-content", hello_world()) .add_to("region-content", welcome()) diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index ca9bd6d1..3c73701f 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -16,12 +16,11 @@ impl ThemeTrait for Aliner { } fn before_render_page(&self, page: &mut Page) { - page - .alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.png"), - )) - .alter_context(PageOp::AddStyleSheet( - StyleSheet::located("/aliner/css/styles.css").with_weight(-99), - )); + page.alter_context(PageOp::AddFavicon( + Favicon::new().with_icon("/theme/favicon.png"), + )) + .alter_context(PageOp::AddStyleSheet( + StyleSheet::located("/aliner/css/styles.css").with_weight(-99), + )); } } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 6033742a..ffdad73f 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -18,50 +18,46 @@ impl ThemeTrait for Bootsier { } fn before_render_page(&self, page: &mut Page) { - page - .alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.png"), - )) - .alter_context(PageOp::AddStyleSheet( - StyleSheet::located("/bootsier/css/bootstrap.min.css") - .with_version("5.1.3") - .with_weight(-99), - )) - .alter_context(PageOp::AddJavaScript( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") - .with_version("5.1.3") - .with_weight(-99), - )) - .alter_context(PageOp::AddJQuery); + page.alter_context(PageOp::AddFavicon( + Favicon::new().with_icon("/theme/favicon.png"), + )) + .alter_context(PageOp::AddStyleSheet( + StyleSheet::located("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_context(PageOp::AddJavaScript( + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_context(PageOp::AddJQuery); } fn error_404_not_found(&self) -> Container { - Container::new() - .with_component( - Html::with(html! { - div class="jumbotron" { - div class="media" { - img - src="/bootsier/images/caution.png" - class="mr-4" - style="width: 20%; max-width: 188px" - alt="Caution!"; - div class="media-body" { - h1 class="display-4" { ("RESOURCE NOT FOUND") } - p class="lead" { (l("e404-description")) } - hr class="my-4"; - p { (l("e404-description")) } - a - class="btn btn-primary btn-lg" - href="/" - role="button" - { - (l("back-homepage")) - } - } + Container::new().with_component(Html::with(html! { + div class="jumbotron" { + div class="media" { + img + src="/bootsier/images/caution.png" + class="mr-4" + style="width: 20%; max-width: 188px" + alt="Caution!"; + div class="media-body" { + h1 class="display-4" { ("RESOURCE NOT FOUND") } + p class="lead" { (l("e404-description")) } + hr class="my-4"; + p { (l("e404-description")) } + a + class="btn btn-primary btn-lg" + href="/" + role="button" + { + (l("back-homepage")) } } - }) - ) + } + } + })) } } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index fae254ed..53b72c28 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -16,18 +16,18 @@ impl ThemeTrait for Bulmix { } fn before_render_page(&self, page: &mut Page) { - page - .alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.png"), - )) - .alter_context(PageOp::AddStyleSheet( - StyleSheet::located("/bulmix/css/bulma.min.css") - .with_version("0.9.4") - .with_weight(-99), - )) - .alter_context(PageOp::AddJQuery); + page.alter_context(PageOp::AddFavicon( + Favicon::new().with_icon("/theme/favicon.png"), + )) + .alter_context(PageOp::AddStyleSheet( + StyleSheet::located("/bulmix/css/bulma.min.css") + .with_version("0.9.4") + .with_weight(-99), + )) + .alter_context(PageOp::AddJQuery); } + #[rustfmt::skip] fn before_render_component( &self, component: &mut dyn ComponentTrait, diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 7c8b32d8..76dd5777 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -62,6 +62,7 @@ macro_rules! config_map { }; } +#[rustfmt::skip] #[derive(Debug, Deserialize)] pub struct App { pub name : String, @@ -73,6 +74,7 @@ pub struct App { pub run_mode : String, } +#[rustfmt::skip] #[derive(Debug, Deserialize)] pub struct Log { pub tracing : String, @@ -82,6 +84,7 @@ pub struct Log { pub format : String, } +#[rustfmt::skip] #[derive(Debug, Deserialize)] pub struct Database { pub db_type : String, @@ -93,17 +96,20 @@ pub struct Database { pub max_pool_size : u32, } +#[rustfmt::skip] #[derive(Debug, Deserialize)] pub struct Webserver { pub bind_address : String, pub bind_port : u16, } +#[rustfmt::skip] #[derive(Debug, Deserialize)] pub struct Dev { pub static_files : String, } +#[rustfmt::skip] #[derive(Debug, Deserialize)] pub struct Settings { pub app : App, diff --git a/pagetop/src/core/component/all.rs b/pagetop/src/core/component/all.rs index 74873a46..b307dc40 100644 --- a/pagetop/src/core/component/all.rs +++ b/pagetop/src/core/component/all.rs @@ -4,9 +4,8 @@ use crate::LazyStatic; use std::collections::HashMap; use std::sync::RwLock; -static COMPONENTS: LazyStatic<RwLock<HashMap<&str, ComponentsBundle>>> = LazyStatic::new(|| - RwLock::new(HashMap::new()) -); +static COMPONENTS: LazyStatic<RwLock<HashMap<&str, ComponentsBundle>>> = + LazyStatic::new(|| RwLock::new(HashMap::new())); pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { let mut hmap = COMPONENTS.write().unwrap(); diff --git a/pagetop/src/core/hook.rs b/pagetop/src/core/hook.rs index 579c3bbc..2ccd6768 100644 --- a/pagetop/src/core/hook.rs +++ b/pagetop/src/core/hook.rs @@ -2,8 +2,8 @@ mod definition; pub use definition::{action_ref, AnyHookAction, HookActionTrait}; mod holder; -pub use holder::HookAction; use holder::ActionsHolder; +pub use holder::HookAction; mod all; pub(crate) use all::add_action; diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index e98d5ca3..a5eeb5a7 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,14 +1,13 @@ -use super::{HookAction, ActionsHolder}; -use crate::LazyStatic; +use super::{ActionsHolder, HookAction}; use crate::util::Handler; +use crate::LazyStatic; use std::collections::HashMap; use std::sync::RwLock; // Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<Handler, ActionsHolder>>> = LazyStatic::new(|| - RwLock::new(HashMap::new()) -); +static ACTIONS: LazyStatic<RwLock<HashMap<Handler, ActionsHolder>>> = + LazyStatic::new(|| RwLock::new(HashMap::new())); pub fn add_action(action: HookAction) { let mut actions = ACTIONS.write().unwrap(); diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index d0b48655..803d1ac2 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -8,9 +8,8 @@ use crate::{db::*, run_now}; use std::sync::RwLock; // Enabled modules. -static ENABLED_MODULES: LazyStatic<RwLock<Vec<&dyn ModuleTrait>>> = LazyStatic::new(|| - RwLock::new(Vec::new()) -); +static ENABLED_MODULES: LazyStatic<RwLock<Vec<&dyn ModuleTrait>>> = + LazyStatic::new(|| RwLock::new(Vec::new())); /* Disabled modules. static DISABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { @@ -35,7 +34,8 @@ fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { .read() .unwrap() .iter() - .any(|m| m.handler() == module.handler()) && !list.iter().any(|m| m.handler() == module.handler()) + .any(|m| m.handler() == module.handler()) + && !list.iter().any(|m| m.handler() == module.handler()) { trace::debug!("Enabling module \"{}\"", module.single_name()); list.push(module); diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 923175fe..256be72a 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -6,9 +6,8 @@ use std::sync::RwLock; include!(concat!(env!("OUT_DIR"), "/theme.rs")); // Temas registrados. -static THEMES: LazyStatic<RwLock<Vec<&dyn ThemeTrait>>> = LazyStatic::new(|| - RwLock::new(Vec::new()) -); +static THEMES: LazyStatic<RwLock<Vec<&dyn ThemeTrait>>> = + LazyStatic::new(|| RwLock::new(Vec::new())); pub fn register_themes(themes: Vec<&'static dyn ThemeTrait>) { for t in themes { diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index f1a65d46..ab996e6c 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -125,25 +125,19 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { } fn error_404_not_found(&self) -> Container { - Container::new() - .with_component( - Html::with(html! { - div { - h1 { ("RESOURCE NOT FOUND") } - } - }) - ) + Container::new().with_component(Html::with(html! { + div { + h1 { ("RESOURCE NOT FOUND") } + } + })) } fn error_403_access_denied(&self) -> Container { - Container::new() - .with_component( - Html::with(html! { - div { - h1 { ("FORBIDDEN ACCESS") } - } - }) - ) + Container::new().with_component(Html::with(html! { + div { + h1 { ("FORBIDDEN ACCESS") } + } + })) } } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 7bbfede9..eb8e1563 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -1,7 +1,7 @@ pub use maud::{html, Markup, PreEscaped, DOCTYPE}; mod assets; -pub use assets::javascript::{JavaScript, JSMode}; +pub use assets::javascript::{JavaScript, ModeJS}; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::Assets; diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 70297e3a..8d72e7fd 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -2,18 +2,19 @@ use super::AssetsTrait; use crate::html::{html, Markup}; #[derive(PartialEq)] -pub enum JSMode { +pub enum ModeJS { Async, Defer, Normal, } +#[rustfmt::skip] pub struct JavaScript { source : &'static str, prefix : &'static str, version: &'static str, weight : isize, - mode : JSMode, + mode : ModeJS, } impl AssetsTrait for JavaScript { @@ -29,21 +30,22 @@ impl AssetsTrait for JavaScript { html! { script type="text/javascript" src=(crate::concat_string!(self.source, self.prefix, self.version)) - async[self.mode == JSMode::Async] - defer[self.mode == JSMode::Defer] + async[self.mode == ModeJS::Async] + defer[self.mode == ModeJS::Defer] {}; } } } impl JavaScript { + #[rustfmt::skip] pub fn located(source: &'static str) -> Self { JavaScript { source, prefix : "", version: "", weight : 0, - mode : JSMode::Defer, + mode : ModeJS::Defer, } } @@ -61,7 +63,7 @@ impl JavaScript { self } - pub fn with_mode(mut self, mode: JSMode) -> Self { + pub fn with_mode(mut self, mode: ModeJS) -> Self { self.mode = mode; self } diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 481c0f5d..000af232 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,8 +1,14 @@ use super::AssetsTrait; use crate::html::{html, Markup}; -pub enum TargetMedia {Default, Print, Screen, Speech} +pub enum TargetMedia { + Default, + Print, + Screen, + Speech, +} +#[rustfmt::skip] pub struct StyleSheet { source : &'static str, prefix : &'static str, @@ -31,6 +37,7 @@ impl AssetsTrait for StyleSheet { } impl StyleSheet { + #[rustfmt::skip] pub fn located(source: &'static str) -> Self { StyleSheet { source, @@ -55,6 +62,7 @@ impl StyleSheet { self } + #[rustfmt::skip] pub fn for_media(mut self, media: TargetMedia) -> Self { self.media = match media { TargetMedia::Print => Some("print"), diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index dd60f177..3bdca35d 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -14,6 +14,7 @@ pub enum ClassesOp { SetDefaultIfEmpty, } +#[rustfmt::skip] #[derive(Default)] pub struct Classes { default: String, @@ -21,6 +22,7 @@ pub struct Classes { } impl Classes { + #[rustfmt::skip] pub fn new() -> Self { Classes { default: "".to_owned(), diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index d3819cf8..604a7873 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -29,10 +29,8 @@ impl Favicon { } pub fn with_theme_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"theme-color\" content=\"{}\">", - color - )); + self.0 + .push(format!("<meta name=\"theme-color\" content=\"{}\">", color)); self } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 1420f1d6..f0935e37 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,15 +1,9 @@ //! Re-exporta recursos comunes. // Global macros and helpers. -pub use crate::{ - args, - concat_string, - pub_const_handler, - theme_static_files, - LazyStatic -}; pub use crate::util; pub use crate::util::Handler; +pub use crate::{args, concat_string, pub_const_handler, theme_static_files, LazyStatic}; pub use crate::config::SETTINGS; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index cd6688fb..92a8241f 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,4 +1,4 @@ -use crate::html::{Favicon, StyleSheet, JavaScript}; +use crate::html::{Favicon, JavaScript, StyleSheet}; pub use actix_web::Result as ResultPage; diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index c77465e1..9b5ed179 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -2,16 +2,16 @@ use super::PageOp; use crate::config::SETTINGS; use crate::core::theme::all::theme_by_single_name; use crate::core::theme::ThemeTrait; -use crate::html::{html, Assets, Favicon, StyleSheet, JavaScript, JSMode, Markup, IdentifierValue}; +use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; use crate::{base, concat_string, util, LazyStatic}; -static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = LazyStatic::new(|| - match theme_by_single_name(&SETTINGS.app.theme) { +static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = + LazyStatic::new(|| match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, - } -); + }); +#[rustfmt::skip] pub struct PageContext { theme : &'static dyn ThemeTrait, favicon : Option<Favicon>, @@ -24,6 +24,7 @@ pub struct PageContext { } impl PageContext { + #[rustfmt::skip] pub fn new() -> Self { PageContext { theme : *DEFAULT_THEME, @@ -76,7 +77,7 @@ impl PageContext { JavaScript::located("/theme/js/jquery.min.js") .with_version("3.6.0") .with_weight(isize::MIN) - .with_mode(JSMode::Normal), + .with_mode(ModeJS::Normal), ); self.with_jquery = true; } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 5543938d..6bbf0cd5 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,10 +1,4 @@ -use super::{ - BeforeRenderPageHook, - PageContext, - PageOp, - ResultPage, - HOOK_BEFORE_RENDER_PAGE, -}; +use super::{BeforeRenderPageHook, PageContext, PageOp, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::app::fatal_error::FatalError; use crate::config::SETTINGS; use crate::core::component::*; @@ -47,6 +41,7 @@ pub enum TextDirection { RightToLeft, } +#[rustfmt::skip] pub struct Page { context : PageContext, language : AttributeValue, @@ -59,6 +54,7 @@ pub struct Page { } impl Page { + #[rustfmt::skip] pub fn new() -> Self { Page { context : PageContext::new(), diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 28a979d2..06ce3261 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -37,12 +37,8 @@ pub const fn handler( #[macro_export] macro_rules! pub_const_handler { ( $HANDLER:ident ) => { - pub const $HANDLER: $crate::util::Handler = $crate::util::handler( - module_path!(), - file!(), - line!(), - column!(), - ); + pub const $HANDLER: $crate::util::Handler = + $crate::util::handler(module_path!(), file!(), line!(), column!()); }; } @@ -89,10 +85,8 @@ macro_rules! theme_static_files { $cfg.service($crate::app::ResourceFiles::new($dir, generate())); } else { $cfg.service( - $crate::app::ActixFiles::new( - $dir, $crate::concat_string!(static_files, $dir) - ) - .show_files_listing(), + $crate::app::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) + .show_files_listing(), ); } }}; From 0e974d6d59a370115268b4400dc61c19b6e2ce0f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 30 Jul 2022 07:00:16 +0200 Subject: [PATCH 161/853] =?UTF-8?q?Retoca=20formato=20pendiente=20del=20c?= =?UTF-8?q?=C3=B3digo=20v=C3=ADa=20cargo=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...m20220316_000001_create_table_node_type.rs | 1 + .../m20220316_000002_create_table_node.rs | 1 + ...0220316_000003_create_table_node_access.rs | 1 + ...20316_000004_create_table_node_revision.rs | 1 + .../m20220312_000001_create_table_role.rs | 1 + ...312_000002_create_table_role_permission.rs | 1 + .../m20220312_000003_create_table_user.rs | 1 + ...m20220312_000004_create_table_user_role.rs | 1 + website/src/mdbook.rs | 59 +++++++++---------- 9 files changed, 36 insertions(+), 31 deletions(-) diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 60b76149..093ae25f 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum NodeType { Table, // node_type: Stores information about all defined Node types. diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index c04c79ad..bb829100 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum Node { Table, // node: The base table for nodes. diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index fdf627cf..a331c04d 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum NodeAccess { Table, // node_access: Identifies which realm/grant pairs a user must possess in diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 8d314d6e..5635571d 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum NodeRevision { Table, // node_revision: Stores information about each saved version of a Node. diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index 0f871aee..eeb3abed 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum Role { Table, // role: Store user roles. diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index 6ac5c963..ea4af0da 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum RolePermission { Table, // role_permission: Stores the permissions assigned to user roles. diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index 7bae11ba..27194274 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum User { Table, // user: Stores user data. diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index d70ab270..a8dfbf22 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; +#[rustfmt::skip] #[derive(Iden)] enum UserRole { Table, // user_role: Maps users to roles. diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index 66e4e0b1..21629bc5 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -7,9 +7,7 @@ use std::collections::HashMap; include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); -static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(|| - generate() -); +static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(|| generate()); pub_const_handler!(MODULE_MDBOOK); @@ -24,7 +22,7 @@ impl ModuleTrait for MdBook { cfg.service( app::web::scope("/doc") .route("{tail:.*html$}", app::web::get().to(mdbook_page)) - .route("{tail:.*$}", app::web::get().to(mdbook_resource)) + .route("{tail:.*$}", app::web::get().to(mdbook_resource)), ); } } @@ -35,7 +33,6 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError if let Some(content) = MDBOOK.get(path) { if let Ok(html) = std::str::from_utf8(content.data) { - let _lang = extract("Lang", html); let title = match extract("Title", html) { Some(title) => title, @@ -60,38 +57,38 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError Page::new() .with_title(title) .with_context(PageOp::AddMetadata("theme-color", "#ffffff")) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/css/variables.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/css/general.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/css/chrome.css", + ))) .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/css/variables.css") - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/css/general.css") - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/css/chrome.css") - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print) - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/FontAwesome/css/font-awesome.css") - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/fonts/fonts.css") - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/highlight.css") - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/tomorrow-night.css") - )) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/ayu-highlight.css") + StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print), )) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/FontAwesome/css/font-awesome.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/fonts/fonts.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/highlight.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/tomorrow-night.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/ayu-highlight.css", + ))) .add_to( "region-content", Container::new() .with_id("mdbook") - .with_component(Html::with(html! { (PreEscaped(&html[beginning..])) })) + .with_component(Html::with(html! { (PreEscaped(&html[beginning..])) })), ) .render() } else { From 261cea6c2f97a5ff0264823ae2cf2e0f1e86c809 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 30 Jul 2022 18:32:32 +0200 Subject: [PATCH 162/853] Actualiza para cumplir recomendaciones de clippy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Básicamente a todos los componentes y elementos principales se les implementa Default() y se adaptan los constructores para inicializar los campos de sus estructuras de datos. --- pagetop/src/base/component/anchor.rs | 52 +++++------- pagetop/src/base/component/block.rs | 28 +++---- pagetop/src/base/component/container.rs | 35 ++++---- .../src/base/component/form_element/button.rs | 60 ++++++-------- .../src/base/component/form_element/date.rs | 54 +++++-------- .../src/base/component/form_element/form.rs | 40 ++++------ .../src/base/component/form_element/hidden.rs | 12 +-- .../src/base/component/form_element/input.rs | 70 +++++++--------- pagetop/src/base/component/grid/column.rs | 28 +++---- pagetop/src/base/component/grid/row.rs | 25 +++--- pagetop/src/base/component/heading.rs | 41 +++++----- pagetop/src/base/component/html.rs | 25 +++--- pagetop/src/base/component/icon.rs | 21 ++--- pagetop/src/base/component/image.rs | 27 +++---- pagetop/src/base/component/menu.rs | 80 +++++++++---------- pagetop/src/base/component/paragraph.rs | 38 ++++----- pagetop/src/core/component.rs | 14 +--- pagetop/src/core/component/bundle.rs | 2 +- pagetop/src/core/component/html_markup.rs | 13 +++ pagetop/src/core/component/renderable.rs | 19 +++++ pagetop/src/html.rs | 2 +- pagetop/src/html/assets/javascript.rs | 10 +-- pagetop/src/html/assets/stylesheet.rs | 7 +- pagetop/src/html/attribute.rs | 17 ++-- pagetop/src/html/classes.rs | 29 ++++--- pagetop/src/html/favicon.rs | 6 +- pagetop/src/html/identifier.rs | 17 ++-- pagetop/src/response/page/context.rs | 10 ++- pagetop/src/response/page/definition.rs | 26 +++--- website/src/mdbook.rs | 12 +-- 30 files changed, 372 insertions(+), 448 deletions(-) create mode 100644 pagetop/src/core/component/html_markup.rs create mode 100644 pagetop/src/core/component/renderable.rs diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 96416ace..110aa5ff 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -2,23 +2,28 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_ANCHOR); +#[derive(Default)] pub enum AnchorType { - Button, + #[default] Link, + Button, Location, } +#[derive(Default)] pub enum AnchorTarget { - Blank, - Context(String), + #[default] Default, + Blank, Parent, Top, + Context(String), } pub type AnchorIcon = ComponentsBundle; #[rustfmt::skip] +#[derive(Default)] pub struct Anchor { weight : isize, renderable : Renderable, @@ -26,7 +31,7 @@ pub struct Anchor { classes : Classes, anchor_type: AnchorType, href : AttributeValue, - html : Markup, + html : HtmlMarkup, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, @@ -34,21 +39,8 @@ pub struct Anchor { } impl ComponentTrait for Anchor { - #[rustfmt::skip] fn new() -> Self { - Anchor { - weight : 0, - renderable : render_always, - id : IdentifierValue::new(), - classes : Classes::new(), - anchor_type: AnchorType::Link, - href : AttributeValue::new(), - html : html! {}, - left_icon : AnchorIcon::new(), - right_icon : AnchorIcon::new(), - target : AnchorTarget::Default, - template : "default".to_owned(), - } + Anchor::default() } fn handler(&self) -> Handler { @@ -60,16 +52,16 @@ impl ComponentTrait for Anchor { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } #[rustfmt::skip] fn default_render(&self, context: &mut PageContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), - AnchorTarget::Context(name) => Some(name.as_str()), AnchorTarget::Parent => Some("_parent"), AnchorTarget::Top => Some("_top"), + AnchorTarget::Context(name) => Some(name.as_str()), _ => None, }; html! { @@ -118,8 +110,8 @@ impl Anchor { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -175,24 +167,24 @@ impl Anchor { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { self.anchor_type = anchor_type; - self.classes.alter( + self.classes.alter_value( ClassesOp::SetDefault, match self.anchor_type { AnchorType::Button => "btn btn-primary", @@ -203,12 +195,12 @@ impl Anchor { } pub fn alter_href(&mut self, href: &str) -> &mut Self { - self.href.with_value(href); + self.href.alter_value(href); self } pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html = html; + self.html.markup = html; self } @@ -253,7 +245,7 @@ impl Anchor { } pub fn html(&self) -> &Markup { - &self.html + &self.html.markup } pub fn left_icon(&self) -> &AnchorIcon { diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 9e76a505..818b80c8 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -5,6 +5,7 @@ pub_const_handler!(COMPONENT_BLOCK); hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); #[rustfmt::skip] +#[derive(Default)] pub struct Block { weight : isize, renderable: Renderable, @@ -16,17 +17,8 @@ pub struct Block { } impl ComponentTrait for Block { - #[rustfmt::skip] fn new() -> Self { - Block { - weight : 0, - renderable: render_always, - id : IdentifierValue::new(), - classes : Classes::new_with_default("block"), - title : AttributeValue::new(), - components: ComponentsBundle::new(), - template : "default".to_owned(), - } + Block::default().with_classes(ClassesOp::SetDefault, "block") } fn handler(&self) -> Handler { @@ -38,7 +30,7 @@ impl ComponentTrait for Block { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn before_render(&mut self, context: &mut PageContext) { @@ -77,8 +69,8 @@ impl Block { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -114,23 +106,23 @@ impl Block { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_title(&mut self, title: &str) -> &mut Self { - self.title.with_value(title); + self.title.alter_value(title); self } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 097d82b7..b3522957 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -4,15 +4,18 @@ pub_const_handler!(COMPONENT_CONTAINER); hook_before_render_component!(HOOK_BEFORE_RENDER_CONTAINER, Container); +#[derive(Default)] pub enum ContainerType { + #[default] + Wrapper, Header, Footer, Main, Section, - Wrapper, } #[rustfmt::skip] +#[derive(Default)] pub struct Container { weight : isize, renderable : Renderable, @@ -25,18 +28,10 @@ pub struct Container { } impl ComponentTrait for Container { - #[rustfmt::skip] fn new() -> Self { - Container { - weight : 0, - renderable : render_always, - id : IdentifierValue::new(), - classes : Classes::new_with_default("container"), - inner_classes : Classes::new_with_default("container"), - container_type: ContainerType::Wrapper, - components : ComponentsBundle::new(), - template : "default".to_owned(), - } + Container::default() + .with_classes(ClassesOp::SetDefault, "container") + .with_inner_classes(ClassesOp::SetDefault, "container") } fn handler(&self) -> Handler { @@ -48,7 +43,7 @@ impl ComponentTrait for Container { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn before_render(&mut self, context: &mut PageContext) { @@ -134,8 +129,8 @@ impl Container { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -171,23 +166,23 @@ impl Container { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.inner_classes.alter(op, classes); + self.inner_classes.alter_value(op, classes); self } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index 5e127f08..14382227 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -2,13 +2,16 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_BUTTON); +#[derive(Default)] pub enum ButtonType { + #[default] Button, - Reset, Submit, + Reset, } #[rustfmt::skip] +#[derive(Default)] pub struct Button { weight : isize, renderable : Renderable, @@ -22,20 +25,10 @@ pub struct Button { } impl ComponentTrait for Button { - #[rustfmt::skip] fn new() -> Self { - Button { - weight : 0, - renderable : render_always, - classes : Classes::new_with_default("btn btn-primary"), - button_type: ButtonType::Button, - name : AttributeValue::new(), - value : AttributeValue::new(), - autofocus : AttributeValue::new(), - disabled : AttributeValue::new(), - template : "default".to_owned(), - } - .with_classes(ClassesOp::AddFirst, "form-button") + Button::default() + .with_classes(ClassesOp::SetDefault, "btn btn-primary") + .with_classes(ClassesOp::AddFirst, "form-button") } fn handler(&self) -> Handler { @@ -47,15 +40,14 @@ impl ComponentTrait for Button { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } - #[rustfmt::skip] fn default_render(&self, _: &mut PageContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", - ButtonType::Reset => "reset", ButtonType::Submit => "submit", + ButtonType::Reset => "reset", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { @@ -90,14 +82,6 @@ impl Button { Button::new().with_value(value) } - pub fn reset(value: &str) -> Self { - let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button"), "form-reset") - .with_value(value); - button.button_type = ButtonType::Reset; - button - } - pub fn submit(value: &str) -> Self { let mut button = Button::new() .with_classes(ClassesOp::Replace("form-button"), "form-submit") @@ -106,6 +90,14 @@ impl Button { button } + pub fn reset(value: &str) -> Self { + let mut button = Button::new() + .with_classes(ClassesOp::Replace("form-button"), "form-reset") + .with_value(value); + button.button_type = ButtonType::Reset; + button + } + // Button BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { @@ -113,8 +105,8 @@ impl Button { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -155,28 +147,28 @@ impl Button { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.with_value(name); + self.name.alter_value(name); self } pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.with_value(value); + self.value.alter_value(value); self } pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.with_value(match toggle { + self.autofocus.alter_value(match toggle { true => "autofocus", false => "", }); @@ -184,7 +176,7 @@ impl Button { } pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.with_value(match toggle { + self.disabled.alter_value(match toggle { true => "disabled", false => "", }); diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 871aeffd..6945f9e6 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -3,6 +3,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_DATE); #[rustfmt::skip] +#[derive(Default)] pub struct Date { weight : isize, renderable : Renderable, @@ -21,25 +22,10 @@ pub struct Date { } impl ComponentTrait for Date { - #[rustfmt::skip] fn new() -> Self { - Date { - weight : 0, - renderable : render_always, - classes : Classes::new_with_default("form-item"), - name : AttributeValue::new(), - value : AttributeValue::new(), - label : AttributeValue::new(), - placeholder : AttributeValue::new(), - autofocus : AttributeValue::new(), - autocomplete: AttributeValue::new(), - disabled : AttributeValue::new(), - readonly : AttributeValue::new(), - required : AttributeValue::new(), - help_text : AttributeValue::new(), - template : "default".to_owned(), - } - .with_classes(ClassesOp::AddFirst, "form-type-date") + Date::default() + .with_classes(ClassesOp::SetDefault,"form-item") + .with_classes(ClassesOp::AddFirst, "form-type-date") } fn handler(&self) -> Handler { @@ -51,7 +37,7 @@ impl ComponentTrait for Date { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn default_render(&self, _: &mut PageContext) -> Markup { @@ -107,8 +93,8 @@ impl Date { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -179,38 +165,38 @@ impl Date { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.with_value(name); + self.name.alter_value(name); self } pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.with_value(value); + self.value.alter_value(value); self } pub fn alter_label(&mut self, label: &str) -> &mut Self { - self.label.with_value(label); + self.label.alter_value(label); self } pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { - self.placeholder.with_value(placeholder); + self.placeholder.alter_value(placeholder); self } pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.with_value(match toggle { + self.autofocus.alter_value(match toggle { true => "autofocus", false => "", }); @@ -218,7 +204,7 @@ impl Date { } pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { - self.autocomplete.with_value(match toggle { + self.autocomplete.alter_value(match toggle { true => "", false => "off", }); @@ -226,7 +212,7 @@ impl Date { } pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.with_value(match toggle { + self.disabled.alter_value(match toggle { true => "disabled", false => "", }); @@ -234,7 +220,7 @@ impl Date { } pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { - self.readonly.with_value(match toggle { + self.readonly.alter_value(match toggle { true => "readonly", false => "", }); @@ -242,7 +228,7 @@ impl Date { } pub fn alter_required(&mut self, toggle: bool) -> &mut Self { - self.required.with_value(match toggle { + self.required.alter_value(match toggle { true => "required", false => "", }); @@ -250,7 +236,7 @@ impl Date { } pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { - self.help_text.with_value(help_text); + self.help_text.alter_value(help_text); self } diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 68b192fd..9ff1593e 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -4,12 +4,15 @@ pub_const_handler!(COMPONENT_FORM); hook_before_render_component!(HOOK_BEFORE_RENDER_FORM, Form); +#[derive(Default)] pub enum FormMethod { - Get, + #[default] Post, + Get, } #[rustfmt::skip] +#[derive(Default)] pub struct Form { weight : isize, renderable: Renderable, @@ -23,19 +26,10 @@ pub struct Form { } impl ComponentTrait for Form { - #[rustfmt::skip] fn new() -> Self { - Form { - weight : 0, - renderable: render_always, - id : IdentifierValue::new(), - classes : Classes::new_with_default("form"), - action : AttributeValue::new(), - charset : AttributeValue::new_with_value("UTF-8"), - method : FormMethod::Post, - elements : ComponentsBundle::new(), - template : "default".to_owned(), - } + Form::default() + .with_classes(ClassesOp::SetDefault, "form") + .with_charset("UTF-8") } fn handler(&self) -> Handler { @@ -47,7 +41,7 @@ impl ComponentTrait for Form { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn before_render(&mut self, context: &mut PageContext) { @@ -56,8 +50,8 @@ impl ComponentTrait for Form { fn default_render(&self, context: &mut PageContext) -> Markup { let method = match self.method() { - FormMethod::Get => None, FormMethod::Post => Some("post".to_owned()), + FormMethod::Get => None, }; html! { form @@ -89,8 +83,8 @@ impl Form { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -136,28 +130,28 @@ impl Form { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_action(&mut self, action: &str) -> &mut Self { - self.action.with_value(action); + self.action.alter_value(action); self } pub fn alter_charset(&mut self, charset: &str) -> &mut Self { - self.charset.with_value(charset); + self.charset.alter_value(charset); self } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index c56ee109..0ee11d83 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -3,6 +3,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_HIDDEN); #[rustfmt::skip] +#[derive(Default)] pub struct Hidden { weight: isize, name : IdentifierValue, @@ -10,13 +11,8 @@ pub struct Hidden { } impl ComponentTrait for Hidden { - #[rustfmt::skip] fn new() -> Self { - Hidden { - weight: 0, - name : IdentifierValue::new(), - value : AttributeValue::new(), - } + Hidden::default() } fn handler(&self) -> Handler { @@ -73,12 +69,12 @@ impl Hidden { } pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.with_value(name); + self.name.alter_value(name); self } pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.with_value(value); + self.value.alter_value(value); self } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 15236e16..51533327 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -2,16 +2,19 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_INPUT); +#[derive(Default)] pub enum InputType { - Email, + #[default] + Textfield, Password, Search, + Email, Telephone, - Textfield, Url, } #[rustfmt::skip] +#[derive(Default)] pub struct Input { weight : isize, renderable : Renderable, @@ -34,29 +37,12 @@ pub struct Input { } impl ComponentTrait for Input { - #[rustfmt::skip] fn new() -> Self { - Input { - weight : 0, - renderable : render_always, - classes : Classes::new_with_default("form-item"), - input_type : InputType::Textfield, - name : IdentifierValue::new(), - value : AttributeValue::new(), - label : AttributeValue::new(), - size : Some(60), - minlength : None, - maxlength : Some(128), - placeholder : AttributeValue::new(), - autofocus : AttributeValue::new(), - autocomplete: AttributeValue::new(), - disabled : AttributeValue::new(), - readonly : AttributeValue::new(), - required : AttributeValue::new(), - help_text : AttributeValue::new(), - template : "default".to_owned(), - } - .with_classes(ClassesOp::AddFirst, "form-type-textfield") + Input::default() + .with_classes(ClassesOp::SetDefault, "form-item") + .with_classes(ClassesOp::AddFirst, "form-type-textfield") + .with_size(Some(60)) + .with_maxlength(Some(128)) } fn handler(&self) -> Handler { @@ -68,17 +54,17 @@ impl ComponentTrait for Input { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } #[rustfmt::skip] fn default_render(&self, _: &mut PageContext) -> Markup { let type_input = match self.input_type() { - InputType::Email => "email", + InputType::Textfield => "text", InputType::Password => "password", InputType::Search => "search", + InputType::Email => "email", InputType::Telephone => "tel", - InputType::Textfield => "text", InputType::Url => "url", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); @@ -190,8 +176,8 @@ impl Input { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -277,18 +263,18 @@ impl Input { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.with_value(name); + self.name.alter_value(name); self.alter_classes( ClassesOp::SetDefault, concat_string!("form-item form-item-", name).as_str(), @@ -297,12 +283,12 @@ impl Input { } pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.with_value(value); + self.value.alter_value(value); self } pub fn alter_label(&mut self, label: &str) -> &mut Self { - self.label.with_value(label); + self.label.alter_value(label); self } @@ -322,12 +308,12 @@ impl Input { } pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { - self.placeholder.with_value(placeholder); + self.placeholder.alter_value(placeholder); self } pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.with_value(match toggle { + self.autofocus.alter_value(match toggle { true => "autofocus", false => "", }); @@ -335,7 +321,7 @@ impl Input { } pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { - self.autocomplete.with_value(match toggle { + self.autocomplete.alter_value(match toggle { true => "", false => "off", }); @@ -343,7 +329,7 @@ impl Input { } pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.with_value(match toggle { + self.disabled.alter_value(match toggle { true => "disabled", false => "", }); @@ -351,7 +337,7 @@ impl Input { } pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { - self.readonly.with_value(match toggle { + self.readonly.alter_value(match toggle { true => "readonly", false => "", }); @@ -359,7 +345,7 @@ impl Input { } pub fn alter_required(&mut self, toggle: bool) -> &mut Self { - self.required.with_value(match toggle { + self.required.alter_value(match toggle { true => "required", false => "", }); @@ -367,7 +353,7 @@ impl Input { } pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { - self.help_text.with_value(help_text); + self.help_text.alter_value(help_text); self } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 5ddba56c..898141f2 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -18,7 +18,9 @@ const SIZE_10_OF_12: &str = "col-md-10"; const SIZE_11_OF_12: &str = "col-md-11"; const SIZE_12_OF_12: &str = "col-md-12"; +#[derive(Default)] pub enum ColumnSize { + #[default] Default, Is1of12, Is2of12, @@ -35,6 +37,7 @@ pub enum ColumnSize { } #[rustfmt::skip] +#[derive(Default)] pub struct Column { weight : isize, renderable: Renderable, @@ -46,17 +49,8 @@ pub struct Column { } impl ComponentTrait for Column { - #[rustfmt::skip] fn new() -> Self { - Column { - weight : 0, - renderable: render_always, - id : IdentifierValue::new(), - classes : Classes::new_with_default(SIZE__DEFAULT), - size : ColumnSize::Default, - components: ComponentsBundle::new(), - template : "default".to_owned(), - } + Column::default().with_classes(ClassesOp::SetDefault, SIZE__DEFAULT) } fn handler(&self) -> Handler { @@ -68,7 +62,7 @@ impl ComponentTrait for Column { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn before_render(&mut self, context: &mut PageContext) { @@ -100,8 +94,8 @@ impl Column { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -137,18 +131,18 @@ impl Column { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 2652bbce..76919287 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -5,6 +5,7 @@ pub_const_handler!(COMPONENT_ROW); hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); #[rustfmt::skip] +#[derive(Default)] pub struct Row { weight : isize, renderable: Renderable, @@ -15,16 +16,8 @@ pub struct Row { } impl ComponentTrait for Row { - #[rustfmt::skip] fn new() -> Self { - Row { - weight : 0, - renderable: render_always, - id : IdentifierValue::new(), - classes : Classes::new_with_default("row"), - columns : ComponentsBundle::new(), - template : "default".to_owned(), - } + Row::default().with_classes(ClassesOp::SetDefault, "row") } fn handler(&self) -> Handler { @@ -36,7 +29,7 @@ impl ComponentTrait for Row { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn before_render(&mut self, context: &mut PageContext) { @@ -68,8 +61,8 @@ impl Row { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -100,18 +93,18 @@ impl Row { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 0695bad2..b3c643b6 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -2,7 +2,9 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_HEADING); +#[derive(Default)] pub enum HeadingType { + #[default] H1, H2, H3, @@ -11,41 +13,34 @@ pub enum HeadingType { H6, } +#[derive(Default)] pub enum HeadingDisplay { + #[default] + Normal, XxLarge, Large, Medium, Small, XxSmall, - Normal, Subtitle, } #[rustfmt::skip] +#[derive(Default)] pub struct Heading { weight : isize, renderable : Renderable, id : IdentifierValue, classes : Classes, heading_type: HeadingType, - html : Markup, + html : HtmlMarkup, display : HeadingDisplay, template : String, } impl ComponentTrait for Heading { - #[rustfmt::skip] fn new() -> Self { - Heading { - weight : 0, - renderable : render_always, - id : IdentifierValue::new(), - classes : Classes::new(), - heading_type: HeadingType::H1, - html : html! {}, - display : HeadingDisplay::Normal, - template : "default".to_owned(), - } + Heading::default() } fn handler(&self) -> Handler { @@ -57,7 +52,7 @@ impl ComponentTrait for Heading { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn default_render(&self, _: &mut PageContext) -> Markup { @@ -126,8 +121,8 @@ impl Heading { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -168,18 +163,18 @@ impl Heading { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } @@ -189,14 +184,14 @@ impl Heading { } pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html = html; + self.html.markup = html; self } #[rustfmt::skip] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; - self.classes.alter( + self.classes.alter_value( ClassesOp::SetDefault, match &self.display() { HeadingDisplay::XxLarge => "display-2", @@ -231,7 +226,7 @@ impl Heading { } pub fn html(&self) -> &Markup { - &self.html + &self.html.markup } pub fn display(&self) -> &HeadingDisplay { diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 8454960f..881ef29c 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -3,22 +3,17 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_HTML); #[rustfmt::skip] +#[derive(Default)] pub struct Html { weight : isize, renderable: Renderable, - html : Markup, + html : HtmlMarkup, template : String, } impl ComponentTrait for Html { - #[rustfmt::skip] fn new() -> Self { - Html { - weight : 0, - renderable: render_always, - html : html! {}, - template : "default".to_owned(), - } + Html::default() } fn handler(&self) -> Handler { @@ -30,7 +25,7 @@ impl ComponentTrait for Html { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn default_render(&self, _: &mut PageContext) -> Markup { @@ -58,8 +53,8 @@ impl Html { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -80,13 +75,13 @@ impl Html { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html = html; + self.html.markup = html; self } @@ -98,7 +93,7 @@ impl Html { // Html GETTERS. pub fn html(&self) -> &Markup { - &self.html + &self.html.markup } pub fn template(&self) -> &str { diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 4b8eab6a..657a4f7f 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -3,6 +3,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_ICON); #[rustfmt::skip] +#[derive(Default)] pub struct Icon { weight : isize, renderable: Renderable, @@ -11,14 +12,8 @@ pub struct Icon { } impl ComponentTrait for Icon { - #[rustfmt::skip] fn new() -> Self { - Icon { - weight : 0, - renderable: render_always, - icon_name : "question-circle-fill".to_owned(), - classes : Classes::new_with_default("bi-question-circle-fill"), - } + Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") } fn handler(&self) -> Handler { @@ -30,7 +25,7 @@ impl ComponentTrait for Icon { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn before_render(&mut self, context: &mut PageContext) { @@ -64,8 +59,8 @@ impl Icon { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -86,8 +81,8 @@ impl Icon { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } @@ -101,7 +96,7 @@ impl Icon { } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 2e0de6d6..b3afe450 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -3,6 +3,7 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_IMAGE); #[rustfmt::skip] +#[derive(Default)] pub struct Image { weight : isize, renderable: Renderable, @@ -13,16 +14,8 @@ pub struct Image { } impl ComponentTrait for Image { - #[rustfmt::skip] fn new() -> Self { - Image { - weight : 0, - renderable: render_always, - id : IdentifierValue::new(), - classes : Classes::new_with_default("img-fluid"), - source : AttributeValue::new(), - template : "default".to_owned(), - } + Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") } fn handler(&self) -> Handler { @@ -34,7 +27,7 @@ impl ComponentTrait for Image { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn default_render(&self, _: &mut PageContext) -> Markup { @@ -67,8 +60,8 @@ impl Image { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -99,23 +92,23 @@ impl Image { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_source(&mut self, source: &str) -> &mut Self { - self.source.with_value(source); + self.source.alter_value(source); self } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 2ee45773..89da9f7b 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -2,19 +2,22 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_MENUITEM); +#[derive(Default)] pub enum MenuItemType { + #[default] + Void, Label(String), Link(String, String), LinkBlank(String, String), Html(Markup), - Separator, Submenu(String, Menu), - Void, + Separator, } // MenuItem. #[rustfmt::skip] +#[derive(Default)] pub struct MenuItem { weight : isize, renderable: Renderable, @@ -22,13 +25,8 @@ pub struct MenuItem { } impl ComponentTrait for MenuItem { - #[rustfmt::skip] fn new() -> Self { - MenuItem { - weight : 0, - renderable: render_always, - item_type : MenuItemType::Void, - } + MenuItem::default() } fn handler(&self) -> Handler { @@ -40,11 +38,13 @@ impl ComponentTrait for MenuItem { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn default_render(&self, context: &mut PageContext) -> Markup { match self.item_type() { + MenuItemType::Void => html! { + }, MenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } }, @@ -70,7 +70,6 @@ impl ComponentTrait for MenuItem { MenuItemType::Separator => html! { li class="separator" { } }, - MenuItemType::Void => html! {}, } } @@ -88,7 +87,7 @@ impl MenuItem { pub fn label(label: &str) -> Self { MenuItem { weight : 0, - renderable: render_always, + renderable: Renderable::default(), item_type : MenuItemType::Label(label.to_owned()), } } @@ -97,7 +96,7 @@ impl MenuItem { pub fn link(label: &str, path: &str) -> Self { MenuItem { weight : 0, - renderable: render_always, + renderable: Renderable::default(), item_type : MenuItemType::Link(label.to_owned(), path.to_owned()), } } @@ -106,7 +105,7 @@ impl MenuItem { pub fn link_blank(label: &str, path: &str) -> Self { MenuItem { weight : 0, - renderable: render_always, + renderable: Renderable::default(), item_type : MenuItemType::LinkBlank(label.to_owned(), path.to_owned()), } } @@ -115,29 +114,29 @@ impl MenuItem { pub fn html(html: Markup) -> Self { MenuItem { weight : 0, - renderable: render_always, + renderable: Renderable::default(), item_type : MenuItemType::Html(html), } } - #[rustfmt::skip] - pub fn separator() -> Self { - MenuItem { - weight : 0, - renderable: render_always, - item_type : MenuItemType::Separator, - } - } - #[rustfmt::skip] pub fn submenu(label: &str, menu: Menu) -> Self { MenuItem { weight : 0, - renderable: render_always, + renderable: Renderable::default(), item_type : MenuItemType::Submenu(label.to_owned(), menu), } } + #[rustfmt::skip] + pub fn separator() -> Self { + MenuItem { + weight : 0, + renderable: Renderable::default(), + item_type : MenuItemType::Separator, + } + } + // MenuItem BUILDER. pub fn with_weight(mut self, weight: isize) -> Self { @@ -145,8 +144,8 @@ impl MenuItem { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -157,8 +156,8 @@ impl MenuItem { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } @@ -176,6 +175,7 @@ pub_const_handler!(COMPONENT_MENU); hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, Menu); #[rustfmt::skip] +#[derive(Default)] pub struct Menu { weight : isize, renderable: Renderable, @@ -186,16 +186,8 @@ pub struct Menu { } impl ComponentTrait for Menu { - #[rustfmt::skip] fn new() -> Self { - Menu { - weight : 0, - renderable: render_always, - items : ComponentsBundle::new(), - id : IdentifierValue::new(), - classes : Classes::new_with_default("sm sm-clean"), - template : "default".to_owned(), - } + Menu::default().with_classes(ClassesOp::SetDefault, "sm sm-clean") } fn handler(&self) -> Handler { @@ -207,7 +199,7 @@ impl ComponentTrait for Menu { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn before_render(&mut self, context: &mut PageContext) { @@ -259,8 +251,8 @@ impl Menu { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -291,18 +283,18 @@ impl Menu { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 74124be3..ab1eccf7 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -2,38 +2,32 @@ use crate::prelude::*; pub_const_handler!(COMPONENT_PARAGRAPH); +#[derive(Default)] pub enum ParagraphDisplay { + #[default] + Normal, XxLarge, Large, Medium, Small, XxSmall, - Normal, } #[rustfmt::skip] +#[derive(Default)] pub struct Paragraph { weight : isize, renderable: Renderable, id : IdentifierValue, classes : Classes, - html : Markup, + html : HtmlMarkup, display : ParagraphDisplay, template : String, } impl ComponentTrait for Paragraph { - #[rustfmt::skip] fn new() -> Self { - Paragraph { - weight : 0, - renderable: render_always, - id : IdentifierValue::new(), - classes : Classes::new(), - html : html! {}, - display : ParagraphDisplay::Normal, - template : "default".to_owned(), - } + Paragraph::default() } fn handler(&self) -> Handler { @@ -45,7 +39,7 @@ impl ComponentTrait for Paragraph { } fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable)(context) + (self.renderable.check)(context) } fn default_render(&self, _: &mut PageContext) -> Markup { @@ -75,8 +69,8 @@ impl Paragraph { self } - pub fn with_renderable(mut self, renderable: Renderable) -> Self { - self.alter_renderable(renderable); + pub fn with_renderable(mut self, check: IsRenderable) -> Self { + self.alter_renderable(check); self } @@ -112,30 +106,30 @@ impl Paragraph { self } - pub fn alter_renderable(&mut self, renderable: Renderable) -> &mut Self { - self.renderable = renderable; + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; self } pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.with_value(id); + self.id.alter_value(id); self } pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter(op, classes); + self.classes.alter_value(op, classes); self } pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html = html; + self.html.markup = html; self } #[rustfmt::skip] pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { self.display = display; - self.classes.alter( + self.classes.alter_value( ClassesOp::SetDefault, match &self.display() { ParagraphDisplay::XxLarge => "fs-2", @@ -165,7 +159,7 @@ impl Paragraph { } pub fn html(&self) -> &Markup { - &self.html + &self.html.markup } pub fn display(&self) -> &ParagraphDisplay { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 175a6d87..cd596397 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -8,14 +8,8 @@ mod all; pub use all::add_component_to; pub(crate) use all::common_components; -use crate::response::page::PageContext; +mod renderable; +pub use renderable::{IsRenderable, Renderable}; -pub type Renderable = fn(_: &PageContext) -> bool; - -pub fn render_always(_: &PageContext) -> bool { - true -} - -pub fn render_never(_: &PageContext) -> bool { - false -} +mod html_markup; +pub use html_markup::HtmlMarkup; diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index ce294b37..2927ff29 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -9,7 +9,7 @@ pub struct ComponentsBundle(Vec<Arc<RwLock<dyn ComponentTrait>>>); impl ComponentsBundle { pub fn new() -> Self { - ComponentsBundle(Vec::new()) + ComponentsBundle::default() } pub fn new_with(component: impl ComponentTrait) -> Self { diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs new file mode 100644 index 00000000..c298c1cc --- /dev/null +++ b/pagetop/src/core/component/html_markup.rs @@ -0,0 +1,13 @@ +use crate::html::{html, Markup}; + +pub struct HtmlMarkup { + pub markup: Markup, +} + +impl Default for HtmlMarkup { + fn default() -> Self { + HtmlMarkup { + markup: html! {}, + } + } +} diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs new file mode 100644 index 00000000..c93da898 --- /dev/null +++ b/pagetop/src/core/component/renderable.rs @@ -0,0 +1,19 @@ +use crate::response::page::PageContext; + +pub type IsRenderable = fn(&PageContext) -> bool; + +pub struct Renderable { + pub check: IsRenderable, +} + +impl Default for Renderable { + fn default() -> Self { + Renderable { + check: render_always, + } + } +} + +fn render_always(_: &PageContext) -> bool { + true +} diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index eb8e1563..3551caa2 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -15,4 +15,4 @@ mod identifier; pub use identifier::IdentifierValue; mod classes; -pub use classes::{ClassValue, Classes, ClassesOp}; +pub use classes::{Classes, ClassesOp}; diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 8d72e7fd..02bff3b9 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,14 +1,16 @@ use super::AssetsTrait; use crate::html::{html, Markup}; -#[derive(PartialEq)] +#[derive(Default, PartialEq)] pub enum ModeJS { Async, + #[default] Defer, Normal, } #[rustfmt::skip] +#[derive(Default)] pub struct JavaScript { source : &'static str, prefix : &'static str, @@ -38,14 +40,10 @@ impl AssetsTrait for JavaScript { } impl JavaScript { - #[rustfmt::skip] pub fn located(source: &'static str) -> Self { JavaScript { source, - prefix : "", - version: "", - weight : 0, - mode : ModeJS::Defer, + ..Default::default() } } diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 000af232..d7cce552 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -9,6 +9,7 @@ pub enum TargetMedia { } #[rustfmt::skip] +#[derive(Default)] pub struct StyleSheet { source : &'static str, prefix : &'static str, @@ -37,14 +38,10 @@ impl AssetsTrait for StyleSheet { } impl StyleSheet { - #[rustfmt::skip] pub fn located(source: &'static str) -> Self { StyleSheet { source, - prefix : "", - version: "", - media : None, - weight : 0, + ..Default::default() } } diff --git a/pagetop/src/html/attribute.rs b/pagetop/src/html/attribute.rs index b6cc0e9a..1a68d21a 100644 --- a/pagetop/src/html/attribute.rs +++ b/pagetop/src/html/attribute.rs @@ -3,20 +3,25 @@ pub struct AttributeValue(String); impl AttributeValue { pub fn new() -> Self { - AttributeValue("".to_owned()) + AttributeValue::default() } - pub fn new_with_value(value: &str) -> Self { - let mut attr = Self::new(); - attr.with_value(value); - attr + // AttributeValue BUILDER. + + pub fn with_value(mut self, value: &str) -> Self { + self.alter_value(value); + self } - pub fn with_value(&mut self, value: &str) -> &mut Self { + // AttributeValue ALTER. + + pub fn alter_value(&mut self, value: &str) -> &mut Self { self.0 = value.trim().to_owned(); self } + // AttributeValue GETTERS. + pub fn get(&self) -> Option<String> { if self.0.is_empty() { None diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 3bdca35d..6d453128 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,14 +1,12 @@ use crate::concat_string; -pub type ClassValue = &'static str; - pub enum ClassesOp { Add, - AddAfter(ClassValue), - AddBefore(ClassValue), + AddAfter(&'static str), + AddBefore(&'static str), AddFirst, Remove, - Replace(ClassValue), + Replace(&'static str), Reset, SetDefault, SetDefaultIfEmpty, @@ -22,21 +20,20 @@ pub struct Classes { } impl Classes { - #[rustfmt::skip] pub fn new() -> Self { - Classes { - default: "".to_owned(), - added : "".to_owned(), - } + Classes::default() } - pub fn new_with_default(default: &str) -> Self { - let mut classes = Self::new(); - classes.alter(ClassesOp::SetDefault, default); - classes + // Classes BUILDER. + + pub fn with_value(mut self, op: ClassesOp, classes: &str) -> Self { + self.alter_value(op, classes); + self } - pub fn alter(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + // Classes ALTER. + + pub fn alter_value(&mut self, op: ClassesOp, classes: &str) -> &mut Self { let classes = classes.trim(); match op { ClassesOp::Add => { @@ -101,6 +98,8 @@ impl Classes { self } + // Classes GETTERS. + pub fn get(&self) -> Option<String> { if self.default.is_empty() && self.added.is_empty() { None diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index 604a7873..1af80243 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -5,9 +5,11 @@ pub struct Favicon(Vec<String>); impl Favicon { pub fn new() -> Self { - Favicon(Vec::new()) + Favicon::default() } + // Favicon BUILDER. + pub fn with_icon(self, image: &str) -> Self { self.add_item("icon", image, "", "") } @@ -72,6 +74,8 @@ impl Favicon { self } + // Favicon RENDER. + pub(crate) fn render(&self) -> Markup { html! { @for item in &self.0 { diff --git a/pagetop/src/html/identifier.rs b/pagetop/src/html/identifier.rs index 81223993..6707a71f 100644 --- a/pagetop/src/html/identifier.rs +++ b/pagetop/src/html/identifier.rs @@ -3,20 +3,25 @@ pub struct IdentifierValue(String); impl IdentifierValue { pub fn new() -> Self { - IdentifierValue("".to_owned()) + IdentifierValue::default() } - pub fn new_with_value(value: &str) -> Self { - let mut id = Self::new(); - id.with_value(value); - id + // IdentifierValue BUILDER. + + pub fn with_value(mut self, value: &str) -> Self { + self.alter_value(value); + self } - pub fn with_value(&mut self, value: &str) -> &Self { + // IdentifierValue ALTER. + + pub fn alter_value(&mut self, value: &str) -> &mut Self { self.0 = value.trim().replace(' ', "_"); self } + // IdentifierValue GETTERS. + pub fn get(&self) -> Option<String> { if self.0.is_empty() { None diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index 9b5ed179..cb8571d7 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -23,9 +23,9 @@ pub struct PageContext { id_counter : usize, } -impl PageContext { +impl Default for PageContext { #[rustfmt::skip] - pub fn new() -> Self { + fn default() -> Self { PageContext { theme : *DEFAULT_THEME, favicon : None, @@ -37,6 +37,12 @@ impl PageContext { id_counter : 0, } } +} + +impl PageContext { + pub fn new() -> Self { + PageContext::default() + } pub fn alter(&mut self, op: PageOp) -> &mut Self { match op { diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 6bbf0cd5..3617b40d 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -53,26 +53,32 @@ pub struct Page { template : String, } -impl Page { +impl Default for Page { #[rustfmt::skip] - pub fn new() -> Self { + fn default() -> Self { Page { context : PageContext::new(), language : match &*DEFAULT_LANGUAGE { - Some(language) => AttributeValue::new_with_value(language), + Some(language) => AttributeValue::new().with_value(language), _ => AttributeValue::new(), }, direction : match &*DEFAULT_DIRECTION { - Some(direction) => AttributeValue::new_with_value(direction), + Some(direction) => AttributeValue::new().with_value(direction), _ => AttributeValue::new(), }, title : AttributeValue::new(), description : AttributeValue::new(), - body_classes: Classes::new_with_default("body"), + body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), regions : common_components(), template : "default".to_owned(), } } +} + +impl Page { + pub fn new() -> Self { + Page::default() + } // Page BUILDER. @@ -129,12 +135,12 @@ impl Page { } pub fn alter_language(&mut self, language: &str) -> &mut Self { - self.language.with_value(language); + self.language.alter_value(language); self } pub fn alter_direction(&mut self, dir: TextDirection) -> &mut Self { - self.direction.with_value(match dir { + self.direction.alter_value(match dir { TextDirection::Auto => "auto", TextDirection::LeftToRight => "ltr", TextDirection::RightToLeft => "rtl", @@ -143,17 +149,17 @@ impl Page { } pub fn alter_title(&mut self, title: &str) -> &mut Self { - self.title.with_value(title); + self.title.alter_value(title); self } pub fn alter_description(&mut self, description: &str) -> &mut Self { - self.description.with_value(description); + self.description.alter_value(description); self } pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.body_classes.alter(op, classes); + self.body_classes.alter_value(op, classes); self } diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index 21629bc5..23572368 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -7,7 +7,7 @@ use std::collections::HashMap; include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); -static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(|| generate()); +static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(generate); pub_const_handler!(MODULE_MDBOOK); @@ -38,14 +38,8 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError Some(title) => title, _ => "Documentación", }; - let _print = match extract("Print", html) { - Some("enabled") => true, - _ => false, - }; - let _mathjax = match extract("MathJax", html) { - Some("supported") => true, - _ => false, - }; + let _print = matches!(extract("Print", html), Some("enabled")); + let _mathjax = matches!(extract("MathJax", html), Some("supported")); let beginning = { let separator = "<!-- mdBook -->"; match html.find(separator) { From 9611a80275f91becc2883aaebfda8c27b254ee4c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 30 Jul 2022 18:51:15 +0200 Subject: [PATCH 163/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.22=20[pagetop]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index cac1d25b..3d07aed1 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.21" +version = "0.0.22" edition = "2021" authors = [ @@ -36,7 +36,7 @@ config_rs = { package = "config", version = "0.11.0", features = ["toml"] } tracing = "0.1.35" tracing-appender = "0.2.2" -tracing-subscriber = { version = "0.3.14", features = ["json", "env-filter"] } +tracing-subscriber = { version = "0.3.15", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } tracing-actix-web = "0.6.0" @@ -44,7 +44,7 @@ fluent-templates = "0.7.1" unic-langid = "0.9.0" actix-web = "4.1.0" -actix-web-files = { package = "actix-files", version = "0.6.1" } +actix-web-files = { package = "actix-files", version = "0.6.2" } actix-web-static-files = "4.0.0" static-files = "0.2.3" @@ -73,7 +73,7 @@ sqlite = ["database", "sea-orm/sqlx-sqlite"] static-files = "0.2.3" [dev-dependencies] -tokio = { version = "1.20.0", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.20.1", features = ["macros", "rt-multi-thread"] } [lib] name = "pagetop" From a09f3aba7b7c462765a9d0287517c2f991c6e76c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 30 Jul 2022 20:56:26 +0200 Subject: [PATCH 164/853] Mejora el renderizado condicional de Favicon --- pagetop/src/html/favicon.rs | 74 ++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index 1af80243..45324b92 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -1,7 +1,7 @@ -use crate::html::{html, Markup, PreEscaped}; +use crate::html::{html, Markup}; #[derive(Default)] -pub struct Favicon(Vec<String>); +pub struct Favicon(Vec<Markup>); impl Favicon { pub fn new() -> Self { @@ -11,66 +11,66 @@ impl Favicon { // Favicon BUILDER. pub fn with_icon(self, image: &str) -> Self { - self.add_item("icon", image, "", "") + self.add_icon_item("icon", image, None, None) } pub fn with_icon_for_sizes(self, image: &str, sizes: &str) -> Self { - self.add_item("icon", image, sizes, "") + self.add_icon_item("icon", image, Some(sizes), None) } pub fn with_apple_touch_icon(self, image: &str, sizes: &str) -> Self { - self.add_item("apple-touch-icon", image, sizes, "") + self.add_icon_item("apple-touch-icon", image, Some(sizes), None) } pub fn with_mask_icon(self, image: &str, color: &str) -> Self { - self.add_item("mask-icon", image, "", color) + self.add_icon_item("mask-icon", image, None, Some(color)) } pub fn with_manifest(self, file: &str) -> Self { - self.add_item("manifest", file, "", "") + self.add_icon_item("manifest", file, None, None) } pub fn with_theme_color(mut self, color: &str) -> Self { - self.0 - .push(format!("<meta name=\"theme-color\" content=\"{}\">", color)); + self.0.push(html! { meta name="theme-color" content=(color); }); self } pub fn with_ms_tile_color(mut self, color: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileColor\" content=\"{}\">", - color - )); + self.0.push(html! { meta name="msapplication-TileColor" content=(color); }); self } pub fn with_ms_tile_image(mut self, image: &str) -> Self { - self.0.push(format!( - "<meta name=\"msapplication-TileImage\" content=\"{}\">", - image - )); + self.0.push(html! { meta name="msapplication-TileImage" content=(image); }); self } - fn add_item(mut self, rel: &str, source: &str, sizes: &str, color: &str) -> Self { - let mut link: String = format!("<link rel=\"{}\"", rel); - if let Some(i) = source.rfind('.') { - link = match source[i..].to_owned().to_lowercase().as_str() { - ".gif" => format!("{} type=\"image/gif\"", link), - ".ico" => format!("{} type=\"image/x-icon\"", link), - ".jpg" => format!("{} type=\"image/jpg\"", link), - ".png" => format!("{} type=\"image/png\"", link), - ".svg" => format!("{} type=\"image/svg+xml\"", link), - _ => link, - }; - } - if !sizes.is_empty() { - link = format!("{} sizes=\"{}\"", link, sizes); - } - if !color.is_empty() { - link = format!("{} color=\"{}\"", link, color); - } - self.0.push(format!("{} href=\"{}\">", link, source)); + fn add_icon_item( + mut self, + icon_rel: &str, + icon_source: &str, + icon_sizes: Option<&str>, + icon_color: Option<&str>, + ) -> Self { + let icon_type = match icon_source.rfind('.') { + Some(i) => match icon_source[i..].to_owned().to_lowercase().as_str() { + ".gif" => Some("image/gif"), + ".ico" => Some("image/x-icon"), + ".jpg" => Some("image/jpg"), + ".png" => Some("image/png"), + ".svg" => Some("image/svg+xml"), + _ => None, + }, + _ => None, + }; + self.0.push(html! { + link + rel=(icon_rel) + type=[(icon_type)] + sizes=[(icon_sizes)] + color=[(icon_color)] + href=(icon_source); + }); self } @@ -79,7 +79,7 @@ impl Favicon { pub(crate) fn render(&self) -> Markup { html! { @for item in &self.0 { - (PreEscaped(item)) + (item) } } } From 842dd5234b6d4359b92c9a300ca6b5dab39b4dca Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 31 Jul 2022 18:48:08 +0200 Subject: [PATCH 165/853] =?UTF-8?q?Corrige=20ejecuci=C3=B3n=20de=20"migrat?= =?UTF-8?q?ions"=20al=20desinst.=20m=C3=B3d.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 8 +- pagetop/Cargo.toml | 8 +- pagetop/src/app/application.rs | 2 + pagetop/src/app/definition.rs | 10 +- .../src/base/component/form_element/date.rs | 2 +- pagetop/src/base/component/menu.rs | 4 +- pagetop/src/core/component/html_markup.rs | 4 +- pagetop/src/core/module.rs | 2 +- pagetop/src/core/module/all.rs | 91 +++-- pagetop/src/core/module/definition.rs | 4 +- pagetop/src/core/theme.rs | 2 +- pagetop/src/core/theme/all.rs | 27 +- pagetop/src/core/theme/definition.rs | 2 + pagetop/src/db.rs | 13 +- pagetop/src/db/migration.rs | 30 ++ pagetop/src/db/migration/manager.rs | 133 +++++++ pagetop/src/db/migration/migrator.rs | 326 ++++++++++++++++++ pagetop/src/db/migration/prelude.rs | 10 + pagetop/src/db/migration/seaql_migrations.rs | 14 + pagetop/src/html/favicon.rs | 12 +- pagetop/src/response/page/context.rs | 9 +- website/src/main.rs | 2 +- 22 files changed, 644 insertions(+), 71 deletions(-) create mode 100644 pagetop/src/db/migration.rs create mode 100644 pagetop/src/db/migration/manager.rs create mode 100644 pagetop/src/db/migration/migrator.rs create mode 100644 pagetop/src/db/migration/prelude.rs create mode 100644 pagetop/src/db/migration/seaql_migrations.rs diff --git a/drust/src/main.rs b/drust/src/main.rs index 576d4bdb..5a1dd565 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -3,13 +3,19 @@ use pagetop::prelude::*; struct Drust; impl AppTrait for Drust { - fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { + fn enable_modules(&self) -> Vec<ModuleStaticRef> { vec![ &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, ] } + + fn disable_modules(&self) -> Vec<ModuleStaticRef> { + vec![ + // &pagetop_node::Node, + ] + } } #[actix_web::main] diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 3d07aed1..33b45256 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -22,6 +22,7 @@ categories = [ ] [dependencies] +async-trait = "0.1.56" concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.3" @@ -57,14 +58,13 @@ version = "0.9.1" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true - -[dependencies.sea-orm-migration] -version = "0.9.1" +[dependencies.sea-schema] +version = "0.9.3" optional = true [features] default = [] -database = ["sea-orm", "sea-orm-migration"] +database = ["sea-orm", "sea-schema"] mysql = ["database", "sea-orm/sqlx-mysql"] postgres = ["database", "sea-orm/sqlx-postgres"] sqlite = ["database", "sea-orm/sqlx-sqlite"] diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index e68a0b95..8ecb2a84 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -27,6 +27,8 @@ impl Application { #[cfg(feature = "database")] LazyStatic::force(&super::db::DBCONN); + // Deshabilita los módulos indicados por la aplicación. + module::all::disable_modules(app.disable_modules()); // Habilita los módulos predeterminados. module::all::enable_modules(vec![&base::module::homepage::DefaultHomePage]); // Habilita los módulos de la aplicación. diff --git a/pagetop/src/app/definition.rs b/pagetop/src/app/definition.rs index 1d470a59..11eb50e6 100644 --- a/pagetop/src/app/definition.rs +++ b/pagetop/src/app/definition.rs @@ -1,18 +1,18 @@ -use crate::core::module::ModuleTrait; -use crate::core::theme::ThemeTrait; +use crate::core::module::ModuleStaticRef; +use crate::core::theme::ThemeStaticRef; pub trait AppTrait: Send + Sync { fn bootstrap(&self) {} - fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { + fn enable_modules(&self) -> Vec<ModuleStaticRef> { vec![] } - fn disable_modules(&self) -> Vec<&'static dyn ModuleTrait> { + fn disable_modules(&self) -> Vec<ModuleStaticRef> { vec![] } - fn themes(&self) -> Vec<&'static dyn ThemeTrait> { + fn themes(&self) -> Vec<ThemeStaticRef> { vec![] } } diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 6945f9e6..35b8f5d8 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -24,7 +24,7 @@ pub struct Date { impl ComponentTrait for Date { fn new() -> Self { Date::default() - .with_classes(ClassesOp::SetDefault,"form-item") + .with_classes(ClassesOp::SetDefault, "form-item") .with_classes(ClassesOp::AddFirst, "form-type-date") } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 89da9f7b..2076d3fc 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -43,8 +43,8 @@ impl ComponentTrait for MenuItem { fn default_render(&self, context: &mut PageContext) -> Markup { match self.item_type() { - MenuItemType::Void => html! { - }, + MenuItemType::Void => html! {}, + MenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } }, diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs index c298c1cc..20eacf96 100644 --- a/pagetop/src/core/component/html_markup.rs +++ b/pagetop/src/core/component/html_markup.rs @@ -6,8 +6,6 @@ pub struct HtmlMarkup { impl Default for HtmlMarkup { fn default() -> Self { - HtmlMarkup { - markup: html! {}, - } + HtmlMarkup { markup: html! {} } } } diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index a47fe3c4..0ecfbc65 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,4 +1,4 @@ mod definition; -pub use definition::{BaseModule, ModuleTrait}; +pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 803d1ac2..91220b52 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,4 +1,4 @@ -use super::ModuleTrait; +use super::ModuleStaticRef; use crate::core::hook::add_action; use crate::{app, trace, LazyStatic}; @@ -7,29 +7,39 @@ use crate::{db::*, run_now}; use std::sync::RwLock; -// Enabled modules. -static ENABLED_MODULES: LazyStatic<RwLock<Vec<&dyn ModuleTrait>>> = +// DISABLED MODULES ******************************************************************************** + +static DISABLED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); -/* Disabled modules. -static DISABLED_MODULES: Lazy<RwLock<Vec<&dyn ModuleTrait>>> = Lazy::new(|| { - RwLock::new(Vec::new()) -}); */ - -pub fn enable_modules(modules: Vec<&'static dyn ModuleTrait>) { - for m in modules { - enable(m) +pub fn disable_modules(modules: Vec<ModuleStaticRef>) { + let mut disabled_modules = DISABLED_MODULES.write().unwrap(); + for module in modules { + if !disabled_modules + .iter() + .any(|m| m.handler() == module.handler()) + { + trace::debug!("Disabling the \"{}\" module", module.single_name()); + disabled_modules.push(module); + } } } -fn enable(module: &'static dyn ModuleTrait) { - let mut list: Vec<&dyn ModuleTrait> = Vec::new(); - add_to(&mut list, module); - list.reverse(); - ENABLED_MODULES.write().unwrap().append(&mut list); +// ENABLED MODULES ********************************************************************************* + +static ENABLED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = + LazyStatic::new(|| RwLock::new(Vec::new())); + +pub fn enable_modules(modules: Vec<ModuleStaticRef>) { + for module in modules { + let mut list: Vec<ModuleStaticRef> = Vec::new(); + add_to_enabled(&mut list, module); + list.reverse(); + ENABLED_MODULES.write().unwrap().append(&mut list); + } } -fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { +fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { if !ENABLED_MODULES .read() .unwrap() @@ -37,21 +47,31 @@ fn add_to(list: &mut Vec<&dyn ModuleTrait>, module: &'static dyn ModuleTrait) { .any(|m| m.handler() == module.handler()) && !list.iter().any(|m| m.handler() == module.handler()) { - trace::debug!("Enabling module \"{}\"", module.single_name()); - list.push(module); + if DISABLED_MODULES + .read() + .unwrap() + .iter() + .any(|m| m.handler() == module.handler()) + { + panic!( + "Trying to enable \"{}\" module which is disabled", + module.single_name() + ); + } else { + trace::debug!("Enabling the \"{}\" module", module.single_name()); + list.push(module); - let mut dependencies = module.dependencies(); - dependencies.reverse(); - for d in dependencies.iter() { - add_to(list, *d); + let mut dependencies = module.dependencies(); + dependencies.reverse(); + for d in dependencies.iter() { + add_to_enabled(list, *d); + } } } } -/* -#[allow(unused_variables)] -pub fn disable_module(module: &'static dyn ModuleTrait) { -} -*/ + +// CONFIGURE MODULES ******************************************************************************* + pub fn modules(cfg: &mut app::web::ServiceConfig) { for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(cfg); @@ -68,6 +88,21 @@ pub fn register_actions() { #[cfg(feature = "database")] pub fn run_migrations() { + run_now({ + struct Migrator; + impl MigratorTrait for Migrator { + fn migrations() -> Vec<MigrationItem> { + let mut migrations = vec![]; + for m in DISABLED_MODULES.read().unwrap().iter() { + migrations.append(&mut m.migrations()); + } + migrations + } + } + Migrator::down(&app::db::DBCONN, None) + }) + .unwrap(); + run_now({ struct Migrator; impl MigratorTrait for Migrator { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index e4492ab7..17105ba0 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -5,6 +5,8 @@ use crate::util::{single_type_name, Handler}; #[cfg(feature = "database")] use crate::db::MigrationItem; +pub type ModuleStaticRef = &'static dyn ModuleTrait; + pub trait BaseModule { fn single_name(&self) -> &'static str; } @@ -21,7 +23,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { None } - fn dependencies(&self) -> Vec<&'static dyn ModuleTrait> { + fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![] } diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index b481f69b..6e008d80 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -1,4 +1,4 @@ mod definition; -pub use definition::{BaseTheme, ThemeTrait}; +pub use definition::{BaseTheme, ThemeStaticRef, ThemeTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 256be72a..1f728ca8 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,4 +1,4 @@ -use super::ThemeTrait; +use super::ThemeStaticRef; use crate::{app, theme_static_files, trace, LazyStatic}; use std::sync::RwLock; @@ -6,24 +6,23 @@ use std::sync::RwLock; include!(concat!(env!("OUT_DIR"), "/theme.rs")); // Temas registrados. -static THEMES: LazyStatic<RwLock<Vec<&dyn ThemeTrait>>> = +static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); -pub fn register_themes(themes: Vec<&'static dyn ThemeTrait>) { - for t in themes { - register(t) +pub fn register_themes(themes: Vec<ThemeStaticRef>) { + let mut registered_themes = THEMES.write().unwrap(); + for theme in themes { + if !registered_themes + .iter() + .any(|t| t.handler() == theme.handler()) + { + trace::debug!("Registering theme \"{}\"", theme.single_name()); + registered_themes.push(theme); + } } } -fn register(theme: &'static dyn ThemeTrait) { - let mut themes = THEMES.write().unwrap(); - if !themes.iter().any(|t| t.handler() == theme.handler()) { - trace::debug!("Registering theme \"{}\"", theme.single_name()); - themes.push(theme); - } -} - -pub fn theme_by_single_name(single_name: &str) -> Option<&'static dyn ThemeTrait> { +pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { match THEMES .write() .unwrap() diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index ab996e6c..ee3abcbf 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -7,6 +7,8 @@ use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; use crate::util::{single_type_name, Handler}; +pub type ThemeStaticRef = &'static dyn ThemeTrait; + pub trait BaseTheme { fn single_name(&self) -> &'static str; } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index de2556ad..a6639943 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -2,7 +2,18 @@ pub use url::Url as DbUri; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; -pub use sea_orm_migration::prelude::*; +// El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.9.1) +// https://github.com/SeaQL/sea-orm/tree/0.9.1/sea-orm-migration para evitar los errores generados +// por el paradigma modular de PageTop. Se copian los siguientes archivos del original: +// +// lib.rs => db/migration.rs (descartando el uso de algunos módulos y exportaciones) +// manager.rs => db/migration/manager.rs +// migrator.rs => db/migration/migrator.rs (suprimiendo la gestión de los errores) +// prelude.rs => db/migration/prelude.rs (evitando cli) +// seaql_migrations.rs => db/migration/seaql_migrations.rs +// +mod migration; +pub use migration::prelude::*; pub type MigrationItem = Box<dyn MigrationTrait>; diff --git a/pagetop/src/db/migration.rs b/pagetop/src/db/migration.rs new file mode 100644 index 00000000..eb9ee6dc --- /dev/null +++ b/pagetop/src/db/migration.rs @@ -0,0 +1,30 @@ +//pub mod cli; +pub mod manager; +pub mod migrator; +pub mod prelude; +pub mod seaql_migrations; +//pub mod util; + +pub use manager::*; +//pub use migrator::*; + +//pub use async_trait; +//pub use sea_orm; +//pub use sea_orm::sea_query; +use sea_orm::DbErr; + +pub trait MigrationName { + fn name(&self) -> &str; +} + +/// The migration definition +#[async_trait::async_trait] +pub trait MigrationTrait: MigrationName + Send + Sync { + /// Define actions to perform when applying the migration + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr>; + + /// Define actions to perform when rolling back the migration + async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> { + Err(DbErr::Migration("We Don't Do That Here".to_owned())) + } +} diff --git a/pagetop/src/db/migration/manager.rs b/pagetop/src/db/migration/manager.rs new file mode 100644 index 00000000..71e91b37 --- /dev/null +++ b/pagetop/src/db/migration/manager.rs @@ -0,0 +1,133 @@ +use sea_orm::sea_query::{ + extension::postgres::{TypeAlterStatement, TypeCreateStatement, TypeDropStatement}, + ForeignKeyCreateStatement, ForeignKeyDropStatement, IndexCreateStatement, IndexDropStatement, + TableAlterStatement, TableCreateStatement, TableDropStatement, TableRenameStatement, + TableTruncateStatement, +}; +use sea_orm::{ConnectionTrait, DbBackend, DbConn, DbErr, StatementBuilder}; +use sea_schema::{mysql::MySql, postgres::Postgres, probe::SchemaProbe, sqlite::Sqlite}; + +/// Helper struct for writing migration scripts in migration file +pub struct SchemaManager<'c> { + conn: &'c DbConn, +} + +impl<'c> SchemaManager<'c> { + pub fn new(conn: &'c DbConn) -> Self { + Self { conn } + } + + pub async fn exec_stmt<S>(&self, stmt: S) -> Result<(), DbErr> + where + S: StatementBuilder, + { + let builder = self.conn.get_database_backend(); + self.conn.execute(builder.build(&stmt)).await.map(|_| ()) + } + + pub fn get_database_backend(&self) -> DbBackend { + self.conn.get_database_backend() + } + + pub fn get_connection(&self) -> &'c DbConn { + self.conn + } +} + +/// Schema Creation +impl<'c> SchemaManager<'c> { + pub async fn create_table(&self, stmt: TableCreateStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn create_index(&self, stmt: IndexCreateStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn create_foreign_key(&self, stmt: ForeignKeyCreateStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn create_type(&self, stmt: TypeCreateStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } +} + +/// Schema Mutation +impl<'c> SchemaManager<'c> { + pub async fn alter_table(&self, stmt: TableAlterStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn drop_table(&self, stmt: TableDropStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn rename_table(&self, stmt: TableRenameStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn truncate_table(&self, stmt: TableTruncateStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn drop_index(&self, stmt: IndexDropStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn drop_foreign_key(&self, stmt: ForeignKeyDropStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn alter_type(&self, stmt: TypeAlterStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } + + pub async fn drop_type(&self, stmt: TypeDropStatement) -> Result<(), DbErr> { + self.exec_stmt(stmt).await + } +} + +/// Schema Inspection +impl<'c> SchemaManager<'c> { + pub async fn has_table<T>(&self, table: T) -> Result<bool, DbErr> + where + T: AsRef<str>, + { + let stmt = match self.conn.get_database_backend() { + DbBackend::MySql => MySql::has_table(table), + DbBackend::Postgres => Postgres::has_table(table), + DbBackend::Sqlite => Sqlite::has_table(table), + }; + + let builder = self.conn.get_database_backend(); + let res = self + .conn + .query_one(builder.build(&stmt)) + .await? + .ok_or_else(|| DbErr::Custom("Failed to check table exists".to_owned()))?; + + res.try_get("", "has_table") + } + + pub async fn has_column<T, C>(&self, table: T, column: C) -> Result<bool, DbErr> + where + T: AsRef<str>, + C: AsRef<str>, + { + let stmt = match self.conn.get_database_backend() { + DbBackend::MySql => MySql::has_column(table, column), + DbBackend::Postgres => Postgres::has_column(table, column), + DbBackend::Sqlite => Sqlite::has_column(table, column), + }; + + let builder = self.conn.get_database_backend(); + let res = self + .conn + .query_one(builder.build(&stmt)) + .await? + .ok_or_else(|| DbErr::Custom("Failed to check column exists".to_owned()))?; + + res.try_get("", "has_column") + } +} diff --git a/pagetop/src/db/migration/migrator.rs b/pagetop/src/db/migration/migrator.rs new file mode 100644 index 00000000..ef881cae --- /dev/null +++ b/pagetop/src/db/migration/migrator.rs @@ -0,0 +1,326 @@ +use std::collections::HashSet; +use std::fmt::Display; +use std::time::SystemTime; +use tracing::info; + +use sea_orm::sea_query::{Alias, Expr, ForeignKey, Query, SelectStatement, SimpleExpr, Table}; +use sea_orm::{ + ActiveModelTrait, ActiveValue, ColumnTrait, Condition, ConnectionTrait, DbBackend, DbConn, + DbErr, EntityTrait, QueryFilter, QueryOrder, Schema, Statement, +}; +use sea_schema::{mysql::MySql, postgres::Postgres, probe::SchemaProbe, sqlite::Sqlite}; + +use super::{seaql_migrations, MigrationTrait, SchemaManager}; + +#[derive(Debug, PartialEq)] +/// Status of migration +pub enum MigrationStatus { + /// Not yet applied + Pending, + /// Applied + Applied, +} + +pub struct Migration { + migration: Box<dyn MigrationTrait>, + status: MigrationStatus, +} + +impl Display for MigrationStatus { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let status = match self { + MigrationStatus::Pending => "Pending", + MigrationStatus::Applied => "Applied", + }; + write!(f, "{}", status) + } +} + +/// Performing migrations on a database +#[async_trait::async_trait] +pub trait MigratorTrait: Send { + /// Vector of migrations in time sequence + fn migrations() -> Vec<Box<dyn MigrationTrait>>; + + /// Get list of migrations wrapped in `Migration` struct + fn get_migration_files() -> Vec<Migration> { + Self::migrations() + .into_iter() + .map(|migration| Migration { + migration, + status: MigrationStatus::Pending, + }) + .collect() + } + + /// Get list of applied migrations from database + async fn get_migration_models(db: &DbConn) -> Result<Vec<seaql_migrations::Model>, DbErr> { + Self::install(db).await?; + seaql_migrations::Entity::find() + .order_by_asc(seaql_migrations::Column::Version) + .all(db) + .await + } + + /// Get list of migrations with status + async fn get_migration_with_status(db: &DbConn) -> Result<Vec<Migration>, DbErr> { + Self::install(db).await?; + let mut migration_files = Self::get_migration_files(); + let migration_models = Self::get_migration_models(db).await?; + + let migration_in_db: HashSet<String> = migration_models + .into_iter() + .map(|model| model.version) + .collect(); + let migration_in_fs: HashSet<String> = migration_files + .iter() + .map(|file| file.migration.name().to_string()) + .collect(); + + let pending_migrations = &migration_in_fs - &migration_in_db; + for migration_file in migration_files.iter_mut() { + if !pending_migrations.contains(migration_file.migration.name()) { + migration_file.status = MigrationStatus::Applied; + } + } + /* + let missing_migrations_in_fs = &migration_in_db - &migration_in_fs; + let errors: Vec<String> = missing_migrations_in_fs + .iter() + .map(|missing_migration| { + format!("Migration file of version '{}' is missing, this migration has been applied but its file is missing", missing_migration) + }).collect(); + + if !errors.is_empty() { + Err(DbErr::Custom(errors.join("\n"))) + } else { */ + Ok(migration_files) + /* } */ + } + + /// Get list of pending migrations + async fn get_pending_migrations(db: &DbConn) -> Result<Vec<Migration>, DbErr> { + Self::install(db).await?; + Ok(Self::get_migration_with_status(db) + .await? + .into_iter() + .filter(|file| file.status == MigrationStatus::Pending) + .collect()) + } + + /// Get list of applied migrations + async fn get_applied_migrations(db: &DbConn) -> Result<Vec<Migration>, DbErr> { + Self::install(db).await?; + Ok(Self::get_migration_with_status(db) + .await? + .into_iter() + .filter(|file| file.status == MigrationStatus::Applied) + .collect()) + } + + /// Create migration table `seaql_migrations` in the database + async fn install(db: &DbConn) -> Result<(), DbErr> { + let builder = db.get_database_backend(); + let schema = Schema::new(builder); + let mut stmt = schema.create_table_from_entity(seaql_migrations::Entity); + stmt.if_not_exists(); + db.execute(builder.build(&stmt)).await.map(|_| ()) + } + + /// Drop all tables from the database, then reapply all migrations + async fn fresh(db: &DbConn) -> Result<(), DbErr> { + Self::install(db).await?; + let db_backend = db.get_database_backend(); + + // Temporarily disable the foreign key check + if db_backend == DbBackend::Sqlite { + info!("Disabling foreign key check"); + db.execute(Statement::from_string( + db_backend, + "PRAGMA foreign_keys = OFF".to_owned(), + )) + .await?; + info!("Foreign key check disabled"); + } + + // Drop all foreign keys + if db_backend == DbBackend::MySql { + info!("Dropping all foreign keys"); + let mut stmt = Query::select(); + stmt.columns([Alias::new("TABLE_NAME"), Alias::new("CONSTRAINT_NAME")]) + .from(( + Alias::new("information_schema"), + Alias::new("table_constraints"), + )) + .cond_where( + Condition::all() + .add( + Expr::expr(get_current_schema(db)).equals( + Alias::new("table_constraints"), + Alias::new("table_schema"), + ), + ) + .add(Expr::expr(Expr::value("FOREIGN KEY")).equals( + Alias::new("table_constraints"), + Alias::new("constraint_type"), + )), + ); + let rows = db.query_all(db_backend.build(&stmt)).await?; + for row in rows.into_iter() { + let constraint_name: String = row.try_get("", "CONSTRAINT_NAME")?; + let table_name: String = row.try_get("", "TABLE_NAME")?; + info!( + "Dropping foreign key '{}' from table '{}'", + constraint_name, table_name + ); + let mut stmt = ForeignKey::drop(); + stmt.table(Alias::new(table_name.as_str())) + .name(constraint_name.as_str()); + db.execute(db_backend.build(&stmt)).await?; + info!("Foreign key '{}' has been dropped", constraint_name); + } + info!("All foreign keys dropped"); + } + + // Drop all tables + let stmt = query_tables(db); + let rows = db.query_all(db_backend.build(&stmt)).await?; + for row in rows.into_iter() { + let table_name: String = row.try_get("", "table_name")?; + info!("Dropping table '{}'", table_name); + let mut stmt = Table::drop(); + stmt.table(Alias::new(table_name.as_str())) + .if_exists() + .cascade(); + db.execute(db_backend.build(&stmt)).await?; + info!("Table '{}' has been dropped", table_name); + } + + // Restore the foreign key check + if db_backend == DbBackend::Sqlite { + info!("Restoring foreign key check"); + db.execute(Statement::from_string( + db_backend, + "PRAGMA foreign_keys = ON".to_owned(), + )) + .await?; + info!("Foreign key check restored"); + } + + // Reapply all migrations + Self::up(db, None).await + } + + /// Rollback all applied migrations, then reapply all migrations + async fn refresh(db: &DbConn) -> Result<(), DbErr> { + Self::down(db, None).await?; + Self::up(db, None).await + } + + /// Rollback all applied migrations + async fn reset(db: &DbConn) -> Result<(), DbErr> { + Self::down(db, None).await + } + + /// Check the status of all migrations + async fn status(db: &DbConn) -> Result<(), DbErr> { + Self::install(db).await?; + + info!("Checking migration status"); + + for Migration { migration, status } in Self::get_migration_with_status(db).await? { + info!("Migration '{}'... {}", migration.name(), status); + } + + Ok(()) + } + + /// Apply pending migrations + async fn up(db: &DbConn, mut steps: Option<u32>) -> Result<(), DbErr> { + Self::install(db).await?; + let manager = SchemaManager::new(db); + + if let Some(steps) = steps { + info!("Applying {} pending migrations", steps); + } else { + info!("Applying all pending migrations"); + } + + let migrations = Self::get_pending_migrations(db).await?.into_iter(); + if migrations.len() == 0 { + info!("No pending migrations"); + } + for Migration { migration, .. } in migrations { + if let Some(steps) = steps.as_mut() { + if steps == &0 { + break; + } + *steps -= 1; + } + info!("Applying migration '{}'", migration.name()); + migration.up(&manager).await?; + info!("Migration '{}' has been applied", migration.name()); + let now = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("SystemTime before UNIX EPOCH!"); + seaql_migrations::ActiveModel { + version: ActiveValue::Set(migration.name().to_owned()), + applied_at: ActiveValue::Set(now.as_secs() as i64), + } + .insert(db) + .await?; + } + + Ok(()) + } + + /// Rollback applied migrations + async fn down(db: &DbConn, mut steps: Option<u32>) -> Result<(), DbErr> { + Self::install(db).await?; + let manager = SchemaManager::new(db); + + if let Some(steps) = steps { + info!("Rolling back {} applied migrations", steps); + } else { + info!("Rolling back all applied migrations"); + } + + let migrations = Self::get_applied_migrations(db).await?.into_iter().rev(); + if migrations.len() == 0 { + info!("No applied migrations"); + } + for Migration { migration, .. } in migrations { + if let Some(steps) = steps.as_mut() { + if steps == &0 { + break; + } + *steps -= 1; + } + info!("Rolling back migration '{}'", migration.name()); + migration.down(&manager).await?; + info!("Migration '{}' has been rollbacked", migration.name()); + seaql_migrations::Entity::delete_many() + .filter(seaql_migrations::Column::Version.eq(migration.name())) + .exec(db) + .await?; + } + + Ok(()) + } +} + +pub(crate) fn query_tables(db: &DbConn) -> SelectStatement { + match db.get_database_backend() { + DbBackend::MySql => MySql::query_tables(), + DbBackend::Postgres => Postgres::query_tables(), + DbBackend::Sqlite => Sqlite::query_tables(), + } +} + +pub(crate) fn get_current_schema(db: &DbConn) -> SimpleExpr { + match db.get_database_backend() { + DbBackend::MySql => MySql::get_current_schema(), + DbBackend::Postgres => Postgres::get_current_schema(), + DbBackend::Sqlite => unimplemented!(), + } +} diff --git a/pagetop/src/db/migration/prelude.rs b/pagetop/src/db/migration/prelude.rs new file mode 100644 index 00000000..5d1e6f49 --- /dev/null +++ b/pagetop/src/db/migration/prelude.rs @@ -0,0 +1,10 @@ +//pub use super::cli; +pub use super::manager::SchemaManager; +pub use super::migrator::MigratorTrait; +pub use super::{MigrationName, MigrationTrait}; +pub use async_trait; +pub use sea_orm; +pub use sea_orm::sea_query; +pub use sea_orm::sea_query::*; +pub use sea_orm::DbErr; +pub use sea_orm::DeriveMigrationName; diff --git a/pagetop/src/db/migration/seaql_migrations.rs b/pagetop/src/db/migration/seaql_migrations.rs new file mode 100644 index 00000000..43f044ec --- /dev/null +++ b/pagetop/src/db/migration/seaql_migrations.rs @@ -0,0 +1,14 @@ +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] +#[sea_orm(table_name = "seaql_migrations")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub version: String, + pub applied_at: i64, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index 45324b92..ac669ef8 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -31,17 +31,23 @@ impl Favicon { } pub fn with_theme_color(mut self, color: &str) -> Self { - self.0.push(html! { meta name="theme-color" content=(color); }); + self.0.push(html! { + meta name="theme-color" content=(color); + }); self } pub fn with_ms_tile_color(mut self, color: &str) -> Self { - self.0.push(html! { meta name="msapplication-TileColor" content=(color); }); + self.0.push(html! { + meta name="msapplication-TileColor" content=(color); + }); self } pub fn with_ms_tile_image(mut self, image: &str) -> Self { - self.0.push(html! { meta name="msapplication-TileImage" content=(image); }); + self.0.push(html! { + meta name="msapplication-TileImage" content=(image); + }); self } diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index cb8571d7..055fa781 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -1,11 +1,10 @@ use super::PageOp; use crate::config::SETTINGS; -use crate::core::theme::all::theme_by_single_name; -use crate::core::theme::ThemeTrait; +use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; use crate::{base, concat_string, util, LazyStatic}; -static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = +static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, @@ -13,7 +12,7 @@ static DEFAULT_THEME: LazyStatic<&dyn ThemeTrait> = #[rustfmt::skip] pub struct PageContext { - theme : &'static dyn ThemeTrait, + theme : ThemeStaticRef, favicon : Option<Favicon>, metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, @@ -94,7 +93,7 @@ impl PageContext { /// PageContext GETTERS. - pub(crate) fn theme(&mut self) -> &'static dyn ThemeTrait { + pub(crate) fn theme(&mut self) -> ThemeStaticRef { self.theme } diff --git a/website/src/main.rs b/website/src/main.rs index 407284da..80604748 100644 --- a/website/src/main.rs +++ b/website/src/main.rs @@ -5,7 +5,7 @@ mod mdbook; struct PageTopWebSite; impl AppTrait for PageTopWebSite { - fn enable_modules(&self) -> Vec<&'static dyn ModuleTrait> { + fn enable_modules(&self) -> Vec<ModuleStaticRef> { vec![&mdbook::MdBook] } } From 0b9c53fce10a2e5f2e00107c01ad74489cdc44f0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 31 Jul 2022 18:53:14 +0200 Subject: [PATCH 166/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.23=20[pagetop]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 33b45256..f2d5dfcb 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.22" +version = "0.0.23" edition = "2021" authors = [ From 61813a44e50f02fe56f443d107c38303a653bf02 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 1 Aug 2022 20:01:36 +0200 Subject: [PATCH 167/853] =?UTF-8?q?Actualiza=20denominaciones=20en=20m?= =?UTF-8?q?=C3=B3dulos=20y=20temas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 7 +++++-- pagetop/src/core/module/all.rs | 10 ++++++++-- pagetop/src/core/module/definition.rs | 2 ++ pagetop/src/core/theme/all.rs | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 8ecb2a84..e588cd6f 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -51,6 +51,9 @@ impl Application { #[cfg(feature = "database")] module::all::run_migrations(); + // Inicializa los módulos que lo requieran. + module::all::init_modules(); + // Ejecuta la función de inicio de la aplicación. trace::info!("Calling application bootstrap"); app.bootstrap(); @@ -59,8 +62,8 @@ impl Application { let server = super::HttpServer::new(move || { super::App::new() .wrap(tracing_actix_web::TracingLogger::default()) - .configure(&module::all::modules) - .configure(&theme::all::themes) + .configure(&module::all::configure_services) + .configure(&theme::all::configure_services) .default_service(super::web::route().to(service_not_found)) }) .bind(format!( diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 91220b52..c6cef12c 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -72,7 +72,13 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { // CONFIGURE MODULES ******************************************************************************* -pub fn modules(cfg: &mut app::web::ServiceConfig) { +pub fn init_modules() { + for m in ENABLED_MODULES.read().unwrap().iter() { + m.init_module(); + } +} + +pub fn configure_services(cfg: &mut app::web::ServiceConfig) { for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(cfg); } @@ -87,7 +93,7 @@ pub fn register_actions() { } #[cfg(feature = "database")] -pub fn run_migrations() { +pub(crate) fn run_migrations() { run_now({ struct Migrator; impl MigratorTrait for Migrator { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 17105ba0..4e04050d 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -27,6 +27,8 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } + fn init_module(&self) {} + #[allow(unused_variables)] fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 1f728ca8..9ee3b095 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -34,7 +34,7 @@ pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { } } -pub fn themes(cfg: &mut app::web::ServiceConfig) { +pub fn configure_services(cfg: &mut app::web::ServiceConfig) { theme_static_files!(cfg, "/theme"); for t in THEMES.read().unwrap().iter() { From 5c65642ec0e7198c07b8b5e8af2fa0f4b3fb0780 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 3 Aug 2022 23:52:37 +0200 Subject: [PATCH 168/853] =?UTF-8?q?Modifica=20la=20definici=C3=B3n=20de=20?= =?UTF-8?q?apps=20como=20un=20m=C3=B3dulo=20m=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 17 ++- pagetop-mdbook/Cargo.toml | 19 +++ pagetop-mdbook/src/lib.rs | 191 ++++++++++++++++++++++++++ pagetop/src/app.rs | 3 - pagetop/src/app/application.rs | 43 ++---- pagetop/src/app/definition.rs | 18 --- pagetop/src/core/module/all.rs | 128 +++++++++-------- pagetop/src/core/module/definition.rs | 15 +- pagetop/src/core/theme/all.rs | 12 +- pagetop/src/prelude.rs | 3 +- website/Cargo.toml | 1 + website/src/main.rs | 17 ++- website/src/mdbook.rs | 54 ++++++-- 13 files changed, 384 insertions(+), 137 deletions(-) create mode 100644 pagetop-mdbook/Cargo.toml create mode 100644 pagetop-mdbook/src/lib.rs delete mode 100644 pagetop/src/app/definition.rs diff --git a/drust/src/main.rs b/drust/src/main.rs index 5a1dd565..9f45fc65 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,24 +1,31 @@ use pagetop::prelude::*; +pub_const_handler!(APP_DRUST); + struct Drust; -impl AppTrait for Drust { - fn enable_modules(&self) -> Vec<ModuleStaticRef> { +impl ModuleTrait for Drust { + fn handler(&self) -> Handler { + APP_DRUST + } + + fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![ &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, + &pagetop::base::module::homepage::DefaultHomePage, ] } - fn disable_modules(&self) -> Vec<ModuleStaticRef> { + fn uninstall_modules(&self) -> Vec<ModuleStaticRef> { vec![ - // &pagetop_node::Node, + // &pagetop_node::Node ] } } #[actix_web::main] async fn main() -> std::io::Result<()> { - Application::prepare(Drust).await?.run()?.await + Application::prepare(&Drust).await?.run()?.await } diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml new file mode 100644 index 00000000..1b792aef --- /dev/null +++ b/pagetop-mdbook/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "pagetop-mdbook" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + ...\ +""" +homepage = "https://suitepro.cillero.es/projects/pagetop" +repository = "https://gitlab.com/manuelcillero/pagetop" +license = "Apache-2.0 or MIT" + +[dependencies] +pagetop = { path = "../pagetop" } +static-files = "0.2.3" +maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } diff --git a/pagetop-mdbook/src/lib.rs b/pagetop-mdbook/src/lib.rs new file mode 100644 index 00000000..92924dcd --- /dev/null +++ b/pagetop-mdbook/src/lib.rs @@ -0,0 +1,191 @@ +use pagetop::prelude::*; + +pub type BookMapResources = std::collections::HashMap<&'static str, static_files::Resource>; + +pub_const_handler!(MODULE_MDBOOK); + +pub struct MdBook; + +impl ModuleTrait for MdBook { + fn handler(&self) -> Handler { + MODULE_MDBOOK + } +} + +impl MdBook { + pub fn configure_service_mdbook( + cfg: &mut app::web::ServiceConfig, + mdbook_path: &'static str, + mdbook_map: &'static BookMapResources, + ) { + let path = mdbook_path.trim_end_matches('/'); + cfg.service( + app::web::scope(path) + .route( + "{tail:.*html$}", + app::web::get().to(move |request: app::HttpRequest| { + mdbook_page(request, path, mdbook_map) + }), + ) + .route( + "{tail:.*$}", + app::web::get().to(move |request: app::HttpRequest| { + mdbook_resource(request, path, mdbook_map) + }), + ), + ); + } +} + +async fn mdbook_page( + request: app::HttpRequest, + mdbook_path: &'static str, + mdbook_map: &'static BookMapResources, +) -> ResultPage<Markup, FatalError> { + let path_len = mdbook_path.len() + 1; + if let Some(content) = mdbook_map.get(&request.path()[path_len..]) { + if let Ok(html) = std::str::from_utf8(content.data) { + let _lang = extract("Lang", html); + let title = match extract("Title", html) { + Some(title) => title, + _ => "Documentación", + }; + let _print = matches!(extract("Print", html), Some("enabled")); + let _mathjax = matches!(extract("MathJax", html), Some("supported")); + let beginning = { + let separator = "<!-- mdBook -->"; + match html.find(separator) { + Some(pos) => pos + separator.len(), + _ => 0, + } + }; + + Page::new() + .with_title(title) + .with_context(PageOp::AddMetadata("theme-color", "#ffffff")) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/css/variables.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/css/general.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/css/chrome.css", + ))) + .with_context(PageOp::AddStyleSheet( + StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print), + )) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/FontAwesome/css/font-awesome.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/fonts/fonts.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/highlight.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/tomorrow-night.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/doc/ayu-highlight.css", + ))) + .add_to( + "region-content", + Container::new() + .with_id("mdbook") + .with_component(Html::with(html! { (PreEscaped(&html[beginning..])) })), + ) + .render() + } else { + Err(FatalError::NotFound) + } + } else { + Err(FatalError::NotFound) + } +} + +async fn mdbook_resource( + request: app::HttpRequest, + mdbook_path: &'static str, + mdbook_map: &'static BookMapResources, +) -> app::HttpResponse { + let path_len = mdbook_path.len() + 1; + // From https://github.com/kilork/actix-web-static-files/blob/master/src/resource_files.rs, see + // functions respond_to(), any_match() and none_match(). + if let Some(file) = &mdbook_map.get(&request.path()[path_len..]) { + let etag = Some(app::http::header::EntityTag::new_strong(format!( + "{:x}:{:x}", + file.data.len(), + file.modified + ))); + + let precondition_failed = !any_match(etag.as_ref(), &request); + + let not_modified = !none_match(etag.as_ref(), &request); + + let mut resp = app::HttpResponse::build(app::http::StatusCode::OK); + resp.insert_header((app::http::header::CONTENT_TYPE, file.mime_type)); + + if let Some(etag) = etag { + resp.insert_header(app::http::header::ETag(etag)); + } + + if precondition_failed { + return FatalError::PreconditionFailed.error_response(); + } else if not_modified { + return FatalError::NotModified.error_response(); + } + + resp.body(file.data) + } else { + FatalError::NotFound.error_response() + } +} + +/// Returns true if `request` has no `If-Match` header or one which matches `etag`. +fn any_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { + match request.get_header::<app::http::header::IfMatch>() { + None | Some(app::http::header::IfMatch::Any) => true, + Some(app::http::header::IfMatch::Items(ref items)) => { + if let Some(some_etag) = etag { + for item in items { + if item.strong_eq(some_etag) { + return true; + } + } + } + false + } + } +} + +/// Returns true if `request` doesn't have an `If-None-Match` header matching `req`. +fn none_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { + match request.get_header::<app::http::header::IfNoneMatch>() { + Some(app::http::header::IfNoneMatch::Any) => false, + Some(app::http::header::IfNoneMatch::Items(ref items)) => { + if let Some(some_etag) = etag { + for item in items { + if item.weak_eq(some_etag) { + return false; + } + } + } + true + } + None => true, + } +} + +fn extract(attr: &'static str, from: &'static str) -> Option<&'static str> { + let search = concat_string!("<!-- ", attr, ":"); + if let Some(ini) = from.find(&search) { + let ini = ini + search.len() + 1; + if let Some(end) = from[ini..].find("-->").map(|i| i + ini) { + let end = end - 1; + return Some(&from[ini..end]); + } + } + None +} diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 114da34e..843a32b5 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -13,9 +13,6 @@ pub mod locale; #[cfg(feature = "database")] pub mod db; -mod definition; -pub use definition::AppTrait; - pub mod application; pub mod fatal_error; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index e588cd6f..a5c18c4c 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,11 +1,13 @@ -use super::{fatal_error::FatalError, AppTrait}; +use super::fatal_error::FatalError; use crate::config::SETTINGS; +use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; -use crate::{base, trace, LazyStatic}; +use crate::LazyStatic; use actix_web::dev::Server; + use std::io::Error; pub struct Application { @@ -13,7 +15,7 @@ pub struct Application { } impl Application { - pub async fn prepare(app: impl AppTrait) -> Result<Self, Error> { + pub async fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { // Rótulo de presentación. super::banner::print_on_startup(); @@ -23,40 +25,25 @@ impl Application { // Valida el identificador de idioma. LazyStatic::force(&super::locale::LANGID); - // Conecta con la base de datos (opcional). #[cfg(feature = "database")] + // Conecta con la base de datos. LazyStatic::force(&super::db::DBCONN); - // Deshabilita los módulos indicados por la aplicación. - module::all::disable_modules(app.disable_modules()); - // Habilita los módulos predeterminados. - module::all::enable_modules(vec![&base::module::homepage::DefaultHomePage]); - // Habilita los módulos de la aplicación. - module::all::enable_modules(app.enable_modules()); + // Registra los módulos de la aplicación. + module::all::register_modules(app); - // Registra los temas predeterminados. - theme::all::register_themes(vec![ - &base::theme::aliner::Aliner, - &base::theme::minimal::Minimal, - &base::theme::bootsier::Bootsier, - &base::theme::bulmix::Bulmix, - ]); - // Registra los temas de la aplicación. - theme::all::register_themes(app.themes()); + // Registra los temas de los módulos. + module::all::register_themes(); - // Registra las acciones de todos los módulos. + // Registra acciones de los módulos. module::all::register_actions(); - // Ejecuta actualizaciones pendientes de la base de datos (opcional). - #[cfg(feature = "database")] - module::all::run_migrations(); - - // Inicializa los módulos que lo requieran. + // Inicializa los módulos. module::all::init_modules(); - // Ejecuta la función de inicio de la aplicación. - trace::info!("Calling application bootstrap"); - app.bootstrap(); + #[cfg(feature = "database")] + // Ejecuta actualizaciones pendientes de la base de datos. + module::all::run_migrations(); // Prepara el servidor web. let server = super::HttpServer::new(move || { diff --git a/pagetop/src/app/definition.rs b/pagetop/src/app/definition.rs deleted file mode 100644 index 11eb50e6..00000000 --- a/pagetop/src/app/definition.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::core::module::ModuleStaticRef; -use crate::core::theme::ThemeStaticRef; - -pub trait AppTrait: Send + Sync { - fn bootstrap(&self) {} - - fn enable_modules(&self) -> Vec<ModuleStaticRef> { - vec![] - } - - fn disable_modules(&self) -> Vec<ModuleStaticRef> { - vec![] - } - - fn themes(&self) -> Vec<ThemeStaticRef> { - vec![] - } -} diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index c6cef12c..c4df3f0f 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,5 +1,6 @@ use super::ModuleStaticRef; use crate::core::hook::add_action; +use crate::core::theme; use crate::{app, trace, LazyStatic}; #[cfg(feature = "database")] @@ -7,47 +8,42 @@ use crate::{db::*, run_now}; use std::sync::RwLock; -// DISABLED MODULES ******************************************************************************** - -static DISABLED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = - LazyStatic::new(|| RwLock::new(Vec::new())); - -pub fn disable_modules(modules: Vec<ModuleStaticRef>) { - let mut disabled_modules = DISABLED_MODULES.write().unwrap(); - for module in modules { - if !disabled_modules - .iter() - .any(|m| m.handler() == module.handler()) - { - trace::debug!("Disabling the \"{}\" module", module.single_name()); - disabled_modules.push(module); - } - } -} - -// ENABLED MODULES ********************************************************************************* +// REGISTER MODULES ******************************************************************************** static ENABLED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); -pub fn enable_modules(modules: Vec<ModuleStaticRef>) { - for module in modules { - let mut list: Vec<ModuleStaticRef> = Vec::new(); - add_to_enabled(&mut list, module); - list.reverse(); - ENABLED_MODULES.write().unwrap().append(&mut list); +static DISCARDED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = + LazyStatic::new(|| RwLock::new(Vec::new())); + +pub fn register_modules(app: ModuleStaticRef) { + // Revisa los módulos a deshabilitar. + let mut list: Vec<ModuleStaticRef> = Vec::new(); + add_to_discarded(&mut list, app); + DISCARDED_MODULES.write().unwrap().append(&mut list); + + // Habilita los módulos de la aplicación. + let mut list: Vec<ModuleStaticRef> = Vec::new(); + add_to_enabled(&mut list, app); + list.reverse(); + ENABLED_MODULES.write().unwrap().append(&mut list); +} + +fn add_to_discarded(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { + for u in module.uninstall_modules().iter() { + if !list.iter().any(|m| m.handler() == u.handler()) { + list.push(*u); + trace::debug!("Module \"{}\" discarded", u.single_name()); + } + } + for d in module.dependencies().iter() { + add_to_discarded(list, *d); } } fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { - if !ENABLED_MODULES - .read() - .unwrap() - .iter() - .any(|m| m.handler() == module.handler()) - && !list.iter().any(|m| m.handler() == module.handler()) - { - if DISABLED_MODULES + if !list.iter().any(|m| m.handler() == module.handler()) { + if DISCARDED_MODULES .read() .unwrap() .iter() @@ -58,7 +54,6 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { module.single_name() ); } else { - trace::debug!("Enabling the \"{}\" module", module.single_name()); list.push(module); let mut dependencies = module.dependencies(); @@ -66,23 +61,21 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { for d in dependencies.iter() { add_to_enabled(list, *d); } + + trace::debug!("Enabling \"{}\" module", module.single_name()); } } } -// CONFIGURE MODULES ******************************************************************************* +// REGISTER THEMES ********************************************************************************* -pub fn init_modules() { +pub fn register_themes() { for m in ENABLED_MODULES.read().unwrap().iter() { - m.init_module(); + theme::all::register_themes(m.themes()); } } -pub fn configure_services(cfg: &mut app::web::ServiceConfig) { - for m in ENABLED_MODULES.read().unwrap().iter() { - m.configure_service(cfg); - } -} +// REGISTER ACTIONS ******************************************************************************** pub fn register_actions() { for m in ENABLED_MODULES.read().unwrap().iter() { @@ -92,23 +85,10 @@ pub fn register_actions() { } } -#[cfg(feature = "database")] -pub(crate) fn run_migrations() { - run_now({ - struct Migrator; - impl MigratorTrait for Migrator { - fn migrations() -> Vec<MigrationItem> { - let mut migrations = vec![]; - for m in DISABLED_MODULES.read().unwrap().iter() { - migrations.append(&mut m.migrations()); - } - migrations - } - } - Migrator::down(&app::db::DBCONN, None) - }) - .unwrap(); +// RUN MIGRATIONS ********************************************************************************** +#[cfg(feature = "database")] +pub fn run_migrations() { run_now({ struct Migrator; impl MigratorTrait for Migrator { @@ -123,4 +103,36 @@ pub(crate) fn run_migrations() { Migrator::up(&app::db::DBCONN, None) }) .unwrap(); + + run_now({ + struct Migrator; + impl MigratorTrait for Migrator { + fn migrations() -> Vec<MigrationItem> { + let mut migrations = vec![]; + for m in DISCARDED_MODULES.read().unwrap().iter() { + migrations.append(&mut m.migrations()); + } + migrations + } + } + Migrator::down(&app::db::DBCONN, None) + }) + .unwrap(); +} + +// INIT MODULES ************************************************************************************ + +pub fn init_modules() { + trace::info!("Calling application bootstrap"); + for m in ENABLED_MODULES.read().unwrap().iter() { + m.init(); + } +} + +// CONFIGURE SERVICES ****************************************************************************** + +pub fn configure_services(cfg: &mut app::web::ServiceConfig) { + for m in ENABLED_MODULES.read().unwrap().iter() { + m.configure_service(cfg); + } } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 4e04050d..5ca54cc1 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,6 @@ use crate::app; use crate::core::hook::HookAction; +use crate::core::theme::ThemeStaticRef; use crate::util::{single_type_name, Handler}; #[cfg(feature = "database")] @@ -27,10 +28,13 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } - fn init_module(&self) {} + fn uninstall_modules(&self) -> Vec<ModuleStaticRef> { + vec![] + } - #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} + fn themes(&self) -> Vec<ThemeStaticRef> { + vec![] + } fn actions(&self) -> Vec<HookAction> { vec![] @@ -41,6 +45,11 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn migrations(&self) -> Vec<MigrationItem> { vec![] } + + fn init(&self) {} + + #[allow(unused_variables)] + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} } impl<M: ?Sized + ModuleTrait> BaseModule for M { diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 9ee3b095..99429838 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,13 +1,19 @@ use super::ThemeStaticRef; -use crate::{app, theme_static_files, trace, LazyStatic}; +use crate::{app, base, theme_static_files, trace, LazyStatic}; use std::sync::RwLock; include!(concat!(env!("OUT_DIR"), "/theme.rs")); // Temas registrados. -static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = - LazyStatic::new(|| RwLock::new(Vec::new())); +static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = LazyStatic::new(|| { + RwLock::new(vec![ + &base::theme::aliner::Aliner, + &base::theme::minimal::Minimal, + &base::theme::bootsier::Bootsier, + &base::theme::bulmix::Bulmix, + ]) +}); pub fn register_themes(themes: Vec<ThemeStaticRef>) { let mut registered_themes = THEMES.write().unwrap(); diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index f0935e37..b2b83648 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -19,12 +19,13 @@ pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::app; pub use crate::app::application::Application; pub use crate::app::fatal_error::FatalError; -pub use crate::app::{AppTrait, HttpMessage}; +pub use crate::app::HttpMessage; pub use crate::core::{component::*, hook::*, module::*, theme::*}; pub use crate::{hook_action, hook_before_render_component}; pub use crate::response::page::*; +pub use crate::response::ResponseError; pub use crate::base::component::*; diff --git a/website/Cargo.toml b/website/Cargo.toml index cac77481..43e50777 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -19,6 +19,7 @@ path = "../pagetop" [dependencies] actix-web = "4.1.0" static-files = "0.2.3" +#pagetop-mdbook = { path = "../pagetop-mdbook" } maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } [build-dependencies] diff --git a/website/src/main.rs b/website/src/main.rs index 80604748..a9736028 100644 --- a/website/src/main.rs +++ b/website/src/main.rs @@ -1,16 +1,25 @@ use pagetop::prelude::*; +pub_const_handler!(APP_PAGETOP_WEBSITE); + mod mdbook; struct PageTopWebSite; -impl AppTrait for PageTopWebSite { - fn enable_modules(&self) -> Vec<ModuleStaticRef> { - vec![&mdbook::MdBook] +impl ModuleTrait for PageTopWebSite { + fn handler(&self) -> Handler { + APP_PAGETOP_WEBSITE + } + + fn dependencies(&self) -> Vec<ModuleStaticRef> { + vec![ + &mdbook::MdBook, + &pagetop::base::module::homepage::DefaultHomePage, + ] } } #[actix_web::main] async fn main() -> std::io::Result<()> { - Application::prepare(PageTopWebSite).await?.run()?.await + Application::prepare(&PageTopWebSite).await?.run()?.await } diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs index 23572368..13adc20b 100644 --- a/website/src/mdbook.rs +++ b/website/src/mdbook.rs @@ -5,12 +5,12 @@ use static_files::Resource; use std::collections::HashMap; +pub_const_handler!(MODULE_MDBOOK); + include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(generate); -pub_const_handler!(MODULE_MDBOOK); - pub struct MdBook; impl ModuleTrait for MdBook { @@ -19,19 +19,41 @@ impl ModuleTrait for MdBook { } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - cfg.service( - app::web::scope("/doc") - .route("{tail:.*html$}", app::web::get().to(mdbook_page)) - .route("{tail:.*$}", app::web::get().to(mdbook_resource)), - ); + configure_mdbook_service(cfg, "/doc/", &MDBOOK); } } -async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError> { - // Remove initial "/doc/" from path: - let path = &request.path()[5..]; +fn configure_mdbook_service( + cfg: &mut app::web::ServiceConfig, + url_root: &'static str, + book: &'static HashMap<&'static str, Resource>, +) { + let url = url_root.trim_end_matches('/'); + let url_len = url.len() + 1; + cfg.service( + app::web::scope(url) + .route( + "{tail:.*html$}", + app::web::get() + .to(move |request: app::HttpRequest| mdbook_page(request, url_len, book)), + ) + .route( + "{tail:.*$}", + app::web::get() + .to(move |request: app::HttpRequest| mdbook_resource(request, url_len, book)), + ), + ); +} - if let Some(content) = MDBOOK.get(path) { +async fn mdbook_page( + request: app::HttpRequest, + v: usize, + book: &HashMap<&'static str, Resource>, +) -> ResultPage<Markup, FatalError> { + // Remove initial "/doc/" from path: + let path = &request.path()[v..]; + + if let Some(content) = book.get(path) { if let Ok(html) = std::str::from_utf8(content.data) { let _lang = extract("Lang", html); let title = match extract("Title", html) { @@ -93,13 +115,17 @@ async fn mdbook_page(request: app::HttpRequest) -> ResultPage<Markup, FatalError } } -async fn mdbook_resource(request: app::HttpRequest) -> app::HttpResponse { +async fn mdbook_resource( + request: app::HttpRequest, + v: usize, + book: &HashMap<&'static str, Resource>, +) -> app::HttpResponse { // Remove initial "/doc/" from path: - let path = &request.path()[5..]; + let path = &request.path()[v..]; // From https://github.com/kilork/actix-web-static-files/blob/master/src/resource_files.rs, see // functions respond_to(), any_match() and none_match(). - if let Some(file) = &MDBOOK.get(path) { + if let Some(file) = &book.get(path) { let etag = Some(app::http::header::EntityTag::new_strong(format!( "{:x}:{:x}", file.data.len(), From 3e16b0f805f28eb9754f3cb9e5aadd1ce37fe6dd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 3 Aug 2022 23:56:15 +0200 Subject: [PATCH 169/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.24=20[pagetop]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index f2d5dfcb..7e04ea35 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.23" +version = "0.0.24" edition = "2021" authors = [ @@ -22,7 +22,7 @@ categories = [ ] [dependencies] -async-trait = "0.1.56" +async-trait = "0.1.57" concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.3" @@ -35,7 +35,7 @@ url = "2.2.2" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } -tracing = "0.1.35" +tracing = "0.1.36" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.15", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } From 348ca8829001b37f743f6e749128a180f35cab14 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 4 Aug 2022 01:03:52 +0200 Subject: [PATCH 170/853] =?UTF-8?q?A=C3=B1ade=20m=C3=B3dulo=20aut=C3=B3nom?= =?UTF-8?q?o=20para=20integrar=20[mdbook]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-mdbook/src/lib.rs | 59 +- pagetop/src/html/assets.rs | 2 +- pagetop/src/html/assets/javascript.rs | 13 +- pagetop/src/html/assets/stylesheet.rs | 13 +- website/Cargo.toml | 2 +- website/build.rs | 4 +- website/doc/{ => en}/book.toml | 3 +- website/doc/{ => en}/src/404.md | 0 website/doc/{ => en}/src/README.md | 0 website/doc/{ => en}/src/SUMMARY.md | 0 website/doc/{ => en}/src/cli/README.md | 0 website/doc/{ => en}/src/cli/build.md | 0 website/doc/{ => en}/src/cli/clean.md | 0 website/doc/{ => en}/src/cli/completions.md | 0 website/doc/{ => en}/src/cli/init.md | 0 website/doc/{ => en}/src/cli/serve.md | 0 website/doc/{ => en}/src/cli/test.md | 0 website/doc/{ => en}/src/cli/watch.md | 0 .../{ => en}/src/continuous-integration.md | 0 .../doc/{ => en}/src/for_developers/README.md | 0 .../{ => en}/src/for_developers/backends.md | 0 .../mdbook-wordcount/Cargo.toml | 0 .../mdbook-wordcount/src/main.rs | 0 .../src/for_developers/preprocessors.md | 0 website/doc/{ => en}/src/format/README.md | 0 .../src/format/configuration/README.md | 0 .../configuration/environment-variables.md | 0 .../src/format/configuration/general.md | 0 .../src/format/configuration/preprocessors.md | 0 .../src/format/configuration/renderers.md | 0 website/doc/{ => en}/src/format/example.rs | 0 .../src/format/images/rust-logo-blk.svg | 0 website/doc/{ => en}/src/format/markdown.md | 0 website/doc/{ => en}/src/format/mathjax.md | 0 website/doc/{ => en}/src/format/mdbook.md | 0 website/doc/{ => en}/src/format/summary.md | 0 .../doc/{ => en}/src/format/theme/README.md | 0 .../doc/{ => en}/src/format/theme/editor.md | 0 .../{ => en}/src/format/theme/index-hbs.md | 0 .../src/format/theme/syntax-highlighting.md | 0 website/doc/{ => en}/src/guide/README.md | 0 website/doc/{ => en}/src/guide/creating.md | 0 .../doc/{ => en}/src/guide/installation.md | 0 website/doc/{ => en}/src/guide/reading.md | 0 website/doc/{ => en}/src/misc/contributors.md | 0 website/doc/{ => en}/theme/book.js | 0 website/doc/{ => en}/theme/css/chrome.css | 0 website/doc/{ => en}/theme/css/general.css | 0 website/doc/{ => en}/theme/css/print.css | 0 website/doc/{ => en}/theme/css/variables.css | 0 website/doc/{ => en}/theme/highlight.css | 0 website/doc/{ => en}/theme/highlight.js | 0 website/doc/{ => en}/theme/index.hbs | 0 website/doc/es/book.toml | 8 + website/doc/es/src/404.md | 3 + website/doc/es/src/README.md | 41 ++ website/doc/es/src/SUMMARY.md | 43 ++ website/doc/es/src/cli/README.md | 14 + website/doc/es/src/cli/build.md | 40 ++ website/doc/es/src/cli/clean.md | 30 + website/doc/es/src/cli/completions.md | 16 + website/doc/es/src/cli/init.md | 70 ++ website/doc/es/src/cli/serve.md | 56 ++ website/doc/es/src/cli/test.md | 63 ++ website/doc/es/src/cli/watch.md | 40 ++ website/doc/es/src/continuous-integration.md | 121 ++++ website/doc/es/src/for_developers/README.md | 47 ++ website/doc/es/src/for_developers/backends.md | 346 +++++++++ .../mdbook-wordcount/Cargo.toml | 9 + .../mdbook-wordcount/src/main.rs | 49 ++ .../es/src/for_developers/preprocessors.md | 126 ++++ website/doc/es/src/format/README.md | 8 + .../doc/es/src/format/configuration/README.md | 12 + .../configuration/environment-variables.md | 38 + .../es/src/format/configuration/general.md | 110 +++ .../src/format/configuration/preprocessors.md | 87 +++ .../es/src/format/configuration/renderers.md | 299 ++++++++ website/doc/es/src/format/example.rs | 6 + .../es/src/format/images/rust-logo-blk.svg | 1 + website/doc/es/src/format/markdown.md | 222 ++++++ website/doc/es/src/format/mathjax.md | 43 ++ website/doc/es/src/format/mdbook.md | 276 +++++++ website/doc/es/src/format/summary.md | 99 +++ website/doc/es/src/format/theme/README.md | 50 ++ website/doc/es/src/format/theme/editor.md | 48 ++ website/doc/es/src/format/theme/index-hbs.md | 101 +++ .../src/format/theme/syntax-highlighting.md | 121 ++++ website/doc/es/src/guide/README.md | 7 + website/doc/es/src/guide/creating.md | 109 +++ website/doc/es/src/guide/installation.md | 52 ++ website/doc/es/src/guide/reading.md | 74 ++ website/doc/es/src/misc/contributors.md | 24 + website/doc/es/theme/book.js | 679 ++++++++++++++++++ website/doc/es/theme/css/chrome.css | 552 ++++++++++++++ website/doc/es/theme/css/general.css | 187 +++++ website/doc/es/theme/css/print.css | 65 ++ website/doc/es/theme/css/variables.css | 253 +++++++ website/doc/es/theme/highlight.css | 82 +++ website/doc/es/theme/highlight.js | 6 + website/doc/es/theme/index.hbs | 261 +++++++ website/src/main.rs | 18 +- website/src/mdbook.rs | 203 ------ 102 files changed, 5063 insertions(+), 248 deletions(-) rename website/doc/{ => en}/book.toml (66%) rename website/doc/{ => en}/src/404.md (100%) rename website/doc/{ => en}/src/README.md (100%) rename website/doc/{ => en}/src/SUMMARY.md (100%) rename website/doc/{ => en}/src/cli/README.md (100%) rename website/doc/{ => en}/src/cli/build.md (100%) rename website/doc/{ => en}/src/cli/clean.md (100%) rename website/doc/{ => en}/src/cli/completions.md (100%) rename website/doc/{ => en}/src/cli/init.md (100%) rename website/doc/{ => en}/src/cli/serve.md (100%) rename website/doc/{ => en}/src/cli/test.md (100%) rename website/doc/{ => en}/src/cli/watch.md (100%) rename website/doc/{ => en}/src/continuous-integration.md (100%) rename website/doc/{ => en}/src/for_developers/README.md (100%) rename website/doc/{ => en}/src/for_developers/backends.md (100%) rename website/doc/{ => en}/src/for_developers/mdbook-wordcount/Cargo.toml (100%) rename website/doc/{ => en}/src/for_developers/mdbook-wordcount/src/main.rs (100%) rename website/doc/{ => en}/src/for_developers/preprocessors.md (100%) rename website/doc/{ => en}/src/format/README.md (100%) rename website/doc/{ => en}/src/format/configuration/README.md (100%) rename website/doc/{ => en}/src/format/configuration/environment-variables.md (100%) rename website/doc/{ => en}/src/format/configuration/general.md (100%) rename website/doc/{ => en}/src/format/configuration/preprocessors.md (100%) rename website/doc/{ => en}/src/format/configuration/renderers.md (100%) rename website/doc/{ => en}/src/format/example.rs (100%) rename website/doc/{ => en}/src/format/images/rust-logo-blk.svg (100%) rename website/doc/{ => en}/src/format/markdown.md (100%) rename website/doc/{ => en}/src/format/mathjax.md (100%) rename website/doc/{ => en}/src/format/mdbook.md (100%) rename website/doc/{ => en}/src/format/summary.md (100%) rename website/doc/{ => en}/src/format/theme/README.md (100%) rename website/doc/{ => en}/src/format/theme/editor.md (100%) rename website/doc/{ => en}/src/format/theme/index-hbs.md (100%) rename website/doc/{ => en}/src/format/theme/syntax-highlighting.md (100%) rename website/doc/{ => en}/src/guide/README.md (100%) rename website/doc/{ => en}/src/guide/creating.md (100%) rename website/doc/{ => en}/src/guide/installation.md (100%) rename website/doc/{ => en}/src/guide/reading.md (100%) rename website/doc/{ => en}/src/misc/contributors.md (100%) rename website/doc/{ => en}/theme/book.js (100%) rename website/doc/{ => en}/theme/css/chrome.css (100%) rename website/doc/{ => en}/theme/css/general.css (100%) rename website/doc/{ => en}/theme/css/print.css (100%) rename website/doc/{ => en}/theme/css/variables.css (100%) rename website/doc/{ => en}/theme/highlight.css (100%) rename website/doc/{ => en}/theme/highlight.js (100%) rename website/doc/{ => en}/theme/index.hbs (100%) create mode 100644 website/doc/es/book.toml create mode 100644 website/doc/es/src/404.md create mode 100644 website/doc/es/src/README.md create mode 100644 website/doc/es/src/SUMMARY.md create mode 100644 website/doc/es/src/cli/README.md create mode 100644 website/doc/es/src/cli/build.md create mode 100644 website/doc/es/src/cli/clean.md create mode 100644 website/doc/es/src/cli/completions.md create mode 100644 website/doc/es/src/cli/init.md create mode 100644 website/doc/es/src/cli/serve.md create mode 100644 website/doc/es/src/cli/test.md create mode 100644 website/doc/es/src/cli/watch.md create mode 100644 website/doc/es/src/continuous-integration.md create mode 100644 website/doc/es/src/for_developers/README.md create mode 100644 website/doc/es/src/for_developers/backends.md create mode 100644 website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml create mode 100644 website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs create mode 100644 website/doc/es/src/for_developers/preprocessors.md create mode 100644 website/doc/es/src/format/README.md create mode 100644 website/doc/es/src/format/configuration/README.md create mode 100644 website/doc/es/src/format/configuration/environment-variables.md create mode 100644 website/doc/es/src/format/configuration/general.md create mode 100644 website/doc/es/src/format/configuration/preprocessors.md create mode 100644 website/doc/es/src/format/configuration/renderers.md create mode 100644 website/doc/es/src/format/example.rs create mode 100644 website/doc/es/src/format/images/rust-logo-blk.svg create mode 100644 website/doc/es/src/format/markdown.md create mode 100644 website/doc/es/src/format/mathjax.md create mode 100644 website/doc/es/src/format/mdbook.md create mode 100644 website/doc/es/src/format/summary.md create mode 100644 website/doc/es/src/format/theme/README.md create mode 100644 website/doc/es/src/format/theme/editor.md create mode 100644 website/doc/es/src/format/theme/index-hbs.md create mode 100644 website/doc/es/src/format/theme/syntax-highlighting.md create mode 100644 website/doc/es/src/guide/README.md create mode 100644 website/doc/es/src/guide/creating.md create mode 100644 website/doc/es/src/guide/installation.md create mode 100644 website/doc/es/src/guide/reading.md create mode 100644 website/doc/es/src/misc/contributors.md create mode 100644 website/doc/es/theme/book.js create mode 100644 website/doc/es/theme/css/chrome.css create mode 100644 website/doc/es/theme/css/general.css create mode 100644 website/doc/es/theme/css/print.css create mode 100644 website/doc/es/theme/css/variables.css create mode 100644 website/doc/es/theme/highlight.css create mode 100644 website/doc/es/theme/highlight.js create mode 100644 website/doc/es/theme/index.hbs delete mode 100644 website/src/mdbook.rs diff --git a/pagetop-mdbook/src/lib.rs b/pagetop-mdbook/src/lib.rs index 92924dcd..c769efcb 100644 --- a/pagetop-mdbook/src/lib.rs +++ b/pagetop-mdbook/src/lib.rs @@ -63,33 +63,42 @@ async fn mdbook_page( Page::new() .with_title(title) .with_context(PageOp::AddMetadata("theme-color", "#ffffff")) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/css/variables.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/css/general.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/css/chrome.css", - ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/css/variables.css" + )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/css/general.css" + )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/css/chrome.css" + )))) .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print), + StyleSheet::located(concat_string!(mdbook_path, "/css/print.css")) + .for_media(TargetMedia::Print), )) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/FontAwesome/css/font-awesome.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/fonts/fonts.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/highlight.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/tomorrow-night.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/ayu-highlight.css", - ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/FontAwesome/css/font-awesome.css" + )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/fonts/fonts.css" + )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/highlight.css" + )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/tomorrow-night.css" + )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( + mdbook_path, + "/ayu-highlight.css" + )))) .add_to( "region-content", Container::new() diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 020df76c..fb9b5722 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -4,7 +4,7 @@ pub mod stylesheet; use crate::html::{html, Markup}; pub trait AssetsTrait { - fn source(&self) -> &'static str; + fn source(&self) -> &str; fn weight(&self) -> isize; diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 02bff3b9..3ecd7e30 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -12,7 +12,7 @@ pub enum ModeJS { #[rustfmt::skip] #[derive(Default)] pub struct JavaScript { - source : &'static str, + source : String, prefix : &'static str, version: &'static str, weight : isize, @@ -20,8 +20,8 @@ pub struct JavaScript { } impl AssetsTrait for JavaScript { - fn source(&self) -> &'static str { - self.source + fn source(&self) -> &str { + self.source.as_str() } fn weight(&self) -> isize { @@ -40,9 +40,12 @@ impl AssetsTrait for JavaScript { } impl JavaScript { - pub fn located(source: &'static str) -> Self { + pub fn located<S>(source: S) -> Self + where + S: Into<String> + { JavaScript { - source, + source: source.into(), ..Default::default() } } diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index d7cce552..9282a2dd 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -11,7 +11,7 @@ pub enum TargetMedia { #[rustfmt::skip] #[derive(Default)] pub struct StyleSheet { - source : &'static str, + source : String, prefix : &'static str, version: &'static str, media : Option<&'static str>, @@ -19,8 +19,8 @@ pub struct StyleSheet { } impl AssetsTrait for StyleSheet { - fn source(&self) -> &'static str { - self.source + fn source(&self) -> &str { + self.source.as_str() } fn weight(&self) -> isize { @@ -38,9 +38,12 @@ impl AssetsTrait for StyleSheet { } impl StyleSheet { - pub fn located(source: &'static str) -> Self { + pub fn located<S>(source: S) -> Self + where + S: Into<String>, + { StyleSheet { - source, + source: source.into(), ..Default::default() } } diff --git a/website/Cargo.toml b/website/Cargo.toml index 43e50777..9f4db205 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -19,7 +19,7 @@ path = "../pagetop" [dependencies] actix-web = "4.1.0" static-files = "0.2.3" -#pagetop-mdbook = { path = "../pagetop-mdbook" } +pagetop-mdbook = { path = "../pagetop-mdbook" } maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } [build-dependencies] diff --git a/website/build.rs b/website/build.rs index 200d195b..861014cf 100644 --- a/website/build.rs +++ b/website/build.rs @@ -4,7 +4,8 @@ use std::env; use std::path::Path; fn main() -> std::io::Result<()> { - build_resource_dir("./static/doc", "mdbook") + build_resource_dir("./static/doc/en", "guides_en")?; + build_resource_dir("./static/doc/es", "guias_es") } fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { @@ -13,5 +14,6 @@ fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), ); resource.with_module_name(format!("resources_{}", name)); + resource.with_generated_fn(name); resource.build() } diff --git a/website/doc/book.toml b/website/doc/en/book.toml similarity index 66% rename from website/doc/book.toml rename to website/doc/en/book.toml index 2facf58a..c45397b9 100644 --- a/website/doc/book.toml +++ b/website/doc/en/book.toml @@ -1,9 +1,8 @@ [book] authors = ["Manuel Cillero"] language = "en" -multilingual = false src = "src" title = "PageTop Guides" [build] -build-dir = "../static/doc" +build-dir = "../../static/doc/en" diff --git a/website/doc/src/404.md b/website/doc/en/src/404.md similarity index 100% rename from website/doc/src/404.md rename to website/doc/en/src/404.md diff --git a/website/doc/src/README.md b/website/doc/en/src/README.md similarity index 100% rename from website/doc/src/README.md rename to website/doc/en/src/README.md diff --git a/website/doc/src/SUMMARY.md b/website/doc/en/src/SUMMARY.md similarity index 100% rename from website/doc/src/SUMMARY.md rename to website/doc/en/src/SUMMARY.md diff --git a/website/doc/src/cli/README.md b/website/doc/en/src/cli/README.md similarity index 100% rename from website/doc/src/cli/README.md rename to website/doc/en/src/cli/README.md diff --git a/website/doc/src/cli/build.md b/website/doc/en/src/cli/build.md similarity index 100% rename from website/doc/src/cli/build.md rename to website/doc/en/src/cli/build.md diff --git a/website/doc/src/cli/clean.md b/website/doc/en/src/cli/clean.md similarity index 100% rename from website/doc/src/cli/clean.md rename to website/doc/en/src/cli/clean.md diff --git a/website/doc/src/cli/completions.md b/website/doc/en/src/cli/completions.md similarity index 100% rename from website/doc/src/cli/completions.md rename to website/doc/en/src/cli/completions.md diff --git a/website/doc/src/cli/init.md b/website/doc/en/src/cli/init.md similarity index 100% rename from website/doc/src/cli/init.md rename to website/doc/en/src/cli/init.md diff --git a/website/doc/src/cli/serve.md b/website/doc/en/src/cli/serve.md similarity index 100% rename from website/doc/src/cli/serve.md rename to website/doc/en/src/cli/serve.md diff --git a/website/doc/src/cli/test.md b/website/doc/en/src/cli/test.md similarity index 100% rename from website/doc/src/cli/test.md rename to website/doc/en/src/cli/test.md diff --git a/website/doc/src/cli/watch.md b/website/doc/en/src/cli/watch.md similarity index 100% rename from website/doc/src/cli/watch.md rename to website/doc/en/src/cli/watch.md diff --git a/website/doc/src/continuous-integration.md b/website/doc/en/src/continuous-integration.md similarity index 100% rename from website/doc/src/continuous-integration.md rename to website/doc/en/src/continuous-integration.md diff --git a/website/doc/src/for_developers/README.md b/website/doc/en/src/for_developers/README.md similarity index 100% rename from website/doc/src/for_developers/README.md rename to website/doc/en/src/for_developers/README.md diff --git a/website/doc/src/for_developers/backends.md b/website/doc/en/src/for_developers/backends.md similarity index 100% rename from website/doc/src/for_developers/backends.md rename to website/doc/en/src/for_developers/backends.md diff --git a/website/doc/src/for_developers/mdbook-wordcount/Cargo.toml b/website/doc/en/src/for_developers/mdbook-wordcount/Cargo.toml similarity index 100% rename from website/doc/src/for_developers/mdbook-wordcount/Cargo.toml rename to website/doc/en/src/for_developers/mdbook-wordcount/Cargo.toml diff --git a/website/doc/src/for_developers/mdbook-wordcount/src/main.rs b/website/doc/en/src/for_developers/mdbook-wordcount/src/main.rs similarity index 100% rename from website/doc/src/for_developers/mdbook-wordcount/src/main.rs rename to website/doc/en/src/for_developers/mdbook-wordcount/src/main.rs diff --git a/website/doc/src/for_developers/preprocessors.md b/website/doc/en/src/for_developers/preprocessors.md similarity index 100% rename from website/doc/src/for_developers/preprocessors.md rename to website/doc/en/src/for_developers/preprocessors.md diff --git a/website/doc/src/format/README.md b/website/doc/en/src/format/README.md similarity index 100% rename from website/doc/src/format/README.md rename to website/doc/en/src/format/README.md diff --git a/website/doc/src/format/configuration/README.md b/website/doc/en/src/format/configuration/README.md similarity index 100% rename from website/doc/src/format/configuration/README.md rename to website/doc/en/src/format/configuration/README.md diff --git a/website/doc/src/format/configuration/environment-variables.md b/website/doc/en/src/format/configuration/environment-variables.md similarity index 100% rename from website/doc/src/format/configuration/environment-variables.md rename to website/doc/en/src/format/configuration/environment-variables.md diff --git a/website/doc/src/format/configuration/general.md b/website/doc/en/src/format/configuration/general.md similarity index 100% rename from website/doc/src/format/configuration/general.md rename to website/doc/en/src/format/configuration/general.md diff --git a/website/doc/src/format/configuration/preprocessors.md b/website/doc/en/src/format/configuration/preprocessors.md similarity index 100% rename from website/doc/src/format/configuration/preprocessors.md rename to website/doc/en/src/format/configuration/preprocessors.md diff --git a/website/doc/src/format/configuration/renderers.md b/website/doc/en/src/format/configuration/renderers.md similarity index 100% rename from website/doc/src/format/configuration/renderers.md rename to website/doc/en/src/format/configuration/renderers.md diff --git a/website/doc/src/format/example.rs b/website/doc/en/src/format/example.rs similarity index 100% rename from website/doc/src/format/example.rs rename to website/doc/en/src/format/example.rs diff --git a/website/doc/src/format/images/rust-logo-blk.svg b/website/doc/en/src/format/images/rust-logo-blk.svg similarity index 100% rename from website/doc/src/format/images/rust-logo-blk.svg rename to website/doc/en/src/format/images/rust-logo-blk.svg diff --git a/website/doc/src/format/markdown.md b/website/doc/en/src/format/markdown.md similarity index 100% rename from website/doc/src/format/markdown.md rename to website/doc/en/src/format/markdown.md diff --git a/website/doc/src/format/mathjax.md b/website/doc/en/src/format/mathjax.md similarity index 100% rename from website/doc/src/format/mathjax.md rename to website/doc/en/src/format/mathjax.md diff --git a/website/doc/src/format/mdbook.md b/website/doc/en/src/format/mdbook.md similarity index 100% rename from website/doc/src/format/mdbook.md rename to website/doc/en/src/format/mdbook.md diff --git a/website/doc/src/format/summary.md b/website/doc/en/src/format/summary.md similarity index 100% rename from website/doc/src/format/summary.md rename to website/doc/en/src/format/summary.md diff --git a/website/doc/src/format/theme/README.md b/website/doc/en/src/format/theme/README.md similarity index 100% rename from website/doc/src/format/theme/README.md rename to website/doc/en/src/format/theme/README.md diff --git a/website/doc/src/format/theme/editor.md b/website/doc/en/src/format/theme/editor.md similarity index 100% rename from website/doc/src/format/theme/editor.md rename to website/doc/en/src/format/theme/editor.md diff --git a/website/doc/src/format/theme/index-hbs.md b/website/doc/en/src/format/theme/index-hbs.md similarity index 100% rename from website/doc/src/format/theme/index-hbs.md rename to website/doc/en/src/format/theme/index-hbs.md diff --git a/website/doc/src/format/theme/syntax-highlighting.md b/website/doc/en/src/format/theme/syntax-highlighting.md similarity index 100% rename from website/doc/src/format/theme/syntax-highlighting.md rename to website/doc/en/src/format/theme/syntax-highlighting.md diff --git a/website/doc/src/guide/README.md b/website/doc/en/src/guide/README.md similarity index 100% rename from website/doc/src/guide/README.md rename to website/doc/en/src/guide/README.md diff --git a/website/doc/src/guide/creating.md b/website/doc/en/src/guide/creating.md similarity index 100% rename from website/doc/src/guide/creating.md rename to website/doc/en/src/guide/creating.md diff --git a/website/doc/src/guide/installation.md b/website/doc/en/src/guide/installation.md similarity index 100% rename from website/doc/src/guide/installation.md rename to website/doc/en/src/guide/installation.md diff --git a/website/doc/src/guide/reading.md b/website/doc/en/src/guide/reading.md similarity index 100% rename from website/doc/src/guide/reading.md rename to website/doc/en/src/guide/reading.md diff --git a/website/doc/src/misc/contributors.md b/website/doc/en/src/misc/contributors.md similarity index 100% rename from website/doc/src/misc/contributors.md rename to website/doc/en/src/misc/contributors.md diff --git a/website/doc/theme/book.js b/website/doc/en/theme/book.js similarity index 100% rename from website/doc/theme/book.js rename to website/doc/en/theme/book.js diff --git a/website/doc/theme/css/chrome.css b/website/doc/en/theme/css/chrome.css similarity index 100% rename from website/doc/theme/css/chrome.css rename to website/doc/en/theme/css/chrome.css diff --git a/website/doc/theme/css/general.css b/website/doc/en/theme/css/general.css similarity index 100% rename from website/doc/theme/css/general.css rename to website/doc/en/theme/css/general.css diff --git a/website/doc/theme/css/print.css b/website/doc/en/theme/css/print.css similarity index 100% rename from website/doc/theme/css/print.css rename to website/doc/en/theme/css/print.css diff --git a/website/doc/theme/css/variables.css b/website/doc/en/theme/css/variables.css similarity index 100% rename from website/doc/theme/css/variables.css rename to website/doc/en/theme/css/variables.css diff --git a/website/doc/theme/highlight.css b/website/doc/en/theme/highlight.css similarity index 100% rename from website/doc/theme/highlight.css rename to website/doc/en/theme/highlight.css diff --git a/website/doc/theme/highlight.js b/website/doc/en/theme/highlight.js similarity index 100% rename from website/doc/theme/highlight.js rename to website/doc/en/theme/highlight.js diff --git a/website/doc/theme/index.hbs b/website/doc/en/theme/index.hbs similarity index 100% rename from website/doc/theme/index.hbs rename to website/doc/en/theme/index.hbs diff --git a/website/doc/es/book.toml b/website/doc/es/book.toml new file mode 100644 index 00000000..6a171b33 --- /dev/null +++ b/website/doc/es/book.toml @@ -0,0 +1,8 @@ +[book] +authors = ["Manuel Cillero"] +language = "es" +src = "src" +title = "Guías de PageTop" + +[build] +build-dir = "../../static/doc/es" diff --git a/website/doc/es/src/404.md b/website/doc/es/src/404.md new file mode 100644 index 00000000..a55db44e --- /dev/null +++ b/website/doc/es/src/404.md @@ -0,0 +1,3 @@ +# Document not found (404) + +This URL is invalid, sorry. Try the search instead! \ No newline at end of file diff --git a/website/doc/es/src/README.md b/website/doc/es/src/README.md new file mode 100644 index 00000000..a3aeb68d --- /dev/null +++ b/website/doc/es/src/README.md @@ -0,0 +1,41 @@ +# Introduction + +**mdBook** is a command line tool to create books with Markdown. +It is ideal for creating product or API documentation, tutorials, course materials or anything that requires a clean, +easily navigable and customizable presentation. + +* Lightweight [Markdown] syntax helps you focus more on your content +* Integrated [search] support +* Color [syntax highlighting] for code blocks for many different languages +* [Theme] files allow customizing the formatting of the output +* [Preprocessors] can provide extensions for custom syntax and modifying content +* [Backends] can render the output to multiple formats +* Written in [Rust] for speed, safety, and simplicity +* Automated testing of [Rust code samples] + +This guide is an example of what mdBook produces. +mdBook is used by the Rust programming language project, and [The Rust Programming Language][trpl] book is another fine example of mdBook in action. + +[Markdown]: format/markdown.md +[search]: guide/reading.md#search +[syntax highlighting]: format/theme/syntax-highlighting.md +[theme]: format/theme/index.html +[preprocessors]: format/configuration/preprocessors.md +[backends]: format/configuration/renderers.md +[Rust]: https://www.rust-lang.org/ +[trpl]: https://doc.rust-lang.org/book/ +[Rust code samples]: cli/test.md + +## Contributing + +mdBook is free and open source. You can find the source code on +[GitHub](https://github.com/rust-lang/mdBook) and issues and feature requests can be posted on +the [GitHub issue tracker](https://github.com/rust-lang/mdBook/issues). mdBook relies on the community to fix bugs and +add features: if you'd like to contribute, please read +the [CONTRIBUTING](https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md) guide and consider opening +a [pull request](https://github.com/rust-lang/mdBook/pulls). + +## License + +The mdBook source and documentation are released under +the [Mozilla Public License v2.0](https://www.mozilla.org/MPL/2.0/). diff --git a/website/doc/es/src/SUMMARY.md b/website/doc/es/src/SUMMARY.md new file mode 100644 index 00000000..974d65fa --- /dev/null +++ b/website/doc/es/src/SUMMARY.md @@ -0,0 +1,43 @@ +# Summary + +[Introduction](README.md) + +# User Guide + +- [Installation](guide/installation.md) +- [Reading Books](guide/reading.md) +- [Creating a Book](guide/creating.md) + +# Reference Guide + +- [Command Line Tool](cli/README.md) + - [init](cli/init.md) + - [build](cli/build.md) + - [watch](cli/watch.md) + - [serve](cli/serve.md) + - [test](cli/test.md) + - [clean](cli/clean.md) + - [completions](cli/completions.md) +- [Format](format/README.md) + - [SUMMARY.md](format/summary.md) + - [Draft chapter]() + - [Configuration](format/configuration/README.md) + - [General](format/configuration/general.md) + - [Preprocessors](format/configuration/preprocessors.md) + - [Renderers](format/configuration/renderers.md) + - [Environment Variables](format/configuration/environment-variables.md) + - [Theme](format/theme/README.md) + - [index.hbs](format/theme/index-hbs.md) + - [Syntax highlighting](format/theme/syntax-highlighting.md) + - [Editor](format/theme/editor.md) + - [MathJax Support](format/mathjax.md) + - [mdBook-specific features](format/mdbook.md) + - [Markdown](format/markdown.md) +- [Continuous Integration](continuous-integration.md) +- [For Developers](for_developers/README.md) + - [Preprocessors](for_developers/preprocessors.md) + - [Alternative Backends](for_developers/backends.md) + +----------- + +[Contributors](misc/contributors.md) diff --git a/website/doc/es/src/cli/README.md b/website/doc/es/src/cli/README.md new file mode 100644 index 00000000..2fbe3781 --- /dev/null +++ b/website/doc/es/src/cli/README.md @@ -0,0 +1,14 @@ +# Command Line Tool + +The `mdbook` command-line tool is used to create and build books. +After you have [installed](../guide/installation.md) `mdbook`, you can run the `mdbook help` command in your terminal to view the available commands. + +This following sections provide in-depth information on the different commands available. + +* [`mdbook init <directory>`](init.md) — Creates a new book with minimal boilerplate to start with. +* [`mdbook build`](build.md) — Renders the book. +* [`mdbook watch`](watch.md) — Rebuilds the book any time a source file changes. +* [`mdbook serve`](serve.md) — Runs a web server to view the book, and rebuilds on changes. +* [`mdbook test`](test.md) — Tests Rust code samples. +* [`mdbook clean`](clean.md) — Deletes the rendered output. +* [`mdbook completions`](completions.md) — Support for shell auto-completion. diff --git a/website/doc/es/src/cli/build.md b/website/doc/es/src/cli/build.md new file mode 100644 index 00000000..71f1c48c --- /dev/null +++ b/website/doc/es/src/cli/build.md @@ -0,0 +1,40 @@ +# The build command + +The build command is used to render your book: + +```bash +mdbook build +``` + +It will try to parse your `SUMMARY.md` file to understand the structure of your +book and fetch the corresponding files. Note that files mentioned in `SUMMARY.md` +but not present will be created. + +The rendered output will maintain the same directory structure as the source for +convenience. Large books will therefore remain structured when rendered. + +#### Specify a directory + +The `build` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook build path/to/book +``` + +#### --open + +When you use the `--open` (`-o`) flag, mdbook will open the rendered book in +your default web browser after building it. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. + +------------------- + +***Note:*** *The build command copies all files (excluding files with `.md` extension) from the source directory +into the build directory.* diff --git a/website/doc/es/src/cli/clean.md b/website/doc/es/src/cli/clean.md new file mode 100644 index 00000000..23efc450 --- /dev/null +++ b/website/doc/es/src/cli/clean.md @@ -0,0 +1,30 @@ +# The clean command + +The clean command is used to delete the generated book and any other build +artifacts. + +```bash +mdbook clean +``` + +#### Specify a directory + +The `clean` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook clean path/to/book +``` + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to override the book's output +directory, which will be deleted by this command. Relative paths are interpreted +relative to the book's root directory. If not specified it will default to the +value of the `build.build-dir` key in `book.toml`, or to `./book`. + +```bash +mdbook clean --dest-dir=path/to/book +``` + +`path/to/book` could be absolute or relative. \ No newline at end of file diff --git a/website/doc/es/src/cli/completions.md b/website/doc/es/src/cli/completions.md new file mode 100644 index 00000000..1246b1ee --- /dev/null +++ b/website/doc/es/src/cli/completions.md @@ -0,0 +1,16 @@ +# The completions command + +The completions command is used to generate auto-completions for some common shells. +This means when you type `mdbook` in your shell, you can then press your shell's auto-complete key (usually the Tab key) and it may display what the valid options are, or finish partial input. + +The completions first need to be installed for your shell: + +```bash +mdbook completions bash > ~/.local/share/bash-completion/completions/mdbook +``` + +The command prints a completion script for the given shell. +Run `mdbook completions --help` for a list of supported shells. + +Where to place the completions depend on which shell you are using and your operating system. +Consult your shell's documentation for more information one where to place the script. diff --git a/website/doc/es/src/cli/init.md b/website/doc/es/src/cli/init.md new file mode 100644 index 00000000..99c0be09 --- /dev/null +++ b/website/doc/es/src/cli/init.md @@ -0,0 +1,70 @@ +# The init command + +There is some minimal boilerplate that is the same for every new book. It's for +this purpose that mdBook includes an `init` command. + +The `init` command is used like this: + +```bash +mdbook init +``` + +When using the `init` command for the first time, a couple of files will be set +up for you: +```bash +book-test/ +├── book +└── src + ├── chapter_1.md + └── SUMMARY.md +``` + +- The `src` directory is where you write your book in markdown. It contains all + the source files, configuration files, etc. + +- The `book` directory is where your book is rendered. All the output is ready + to be uploaded to a server to be seen by your audience. + +- The `SUMMARY.md` is the skeleton of your + book, and is discussed in more detail [in another + chapter](../format/summary.md). + +#### Tip: Generate chapters from SUMMARY.md + +When a `SUMMARY.md` file already exists, the `init` command will first parse it +and generate the missing files according to the paths used in the `SUMMARY.md`. +This allows you to think and create the whole structure of your book and then +let mdBook generate it for you. + +#### Specify a directory + +The `init` command can take a directory as an argument to use as the book's root +instead of the current working directory. + +```bash +mdbook init path/to/book +``` + +#### --theme + +When you use the `--theme` flag, the default theme will be copied into a +directory called `theme` in your source directory so that you can modify it. + +The theme is selectively overwritten, this means that if you don't want to +overwrite a specific file, just delete it and the default file will be used. + +#### --title + +Specify a title for the book. If not supplied, an interactive prompt will ask for +a title. + +```bash +mdbook init --title="my amazing book" +``` + +#### --ignore + +Create a `.gitignore` file configured to ignore the `book` directory created when [building] a book. +If not supplied, an interactive prompt will ask whether it should be created. + +[building]: build.md diff --git a/website/doc/es/src/cli/serve.md b/website/doc/es/src/cli/serve.md new file mode 100644 index 00000000..62ea26c2 --- /dev/null +++ b/website/doc/es/src/cli/serve.md @@ -0,0 +1,56 @@ +# The serve command + +The serve command is used to preview a book by serving it via HTTP at +`localhost:3000` by default: + +```bash +mdbook serve +``` + +The `serve` command watches the book's `src` directory for +changes, rebuilding the book and refreshing clients for each change; this includes +re-creating deleted files still mentioned in `SUMMARY.md`! A websocket +connection is used to trigger the client-side refresh. + +***Note:*** *The `serve` command is for testing a book's HTML output, and is not +intended to be a complete HTTP server for a website.* + +#### Specify a directory + +The `serve` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook serve path/to/book +``` + +### Server options + +The `serve` hostname defaults to `localhost`, and the port defaults to `3000`. Either option can be specified on the command line: + +```bash +mdbook serve path/to/book -p 8000 -n 127.0.0.1 +``` + +#### --open + +When you use the `--open` (`-o`) flag, mdbook will open the book in your +default web browser after starting the server. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. + +#### Specify exclude patterns + +The `serve` command will not automatically trigger a build for files listed in +the `.gitignore` file in the book root directory. The `.gitignore` file may +contain file patterns described in the [gitignore +documentation](https://git-scm.com/docs/gitignore). This can be useful for +ignoring temporary files created by some editors. + +***Note:*** *Only the `.gitignore` from the book root directory is used. Global +`$HOME/.gitignore` or `.gitignore` files in parent directories are not used.* diff --git a/website/doc/es/src/cli/test.md b/website/doc/es/src/cli/test.md new file mode 100644 index 00000000..e134dc9b --- /dev/null +++ b/website/doc/es/src/cli/test.md @@ -0,0 +1,63 @@ +# The test command + +When writing a book, you sometimes need to automate some tests. For example, +[The Rust Programming Book](https://doc.rust-lang.org/stable/book/) uses a lot +of code examples that could get outdated. Therefore it is very important for +them to be able to automatically test these code examples. + +mdBook supports a `test` command that will run all available tests in a book. At +the moment, only rustdoc tests are supported, but this may be expanded upon in +the future. + +#### Disable tests on a code block + +rustdoc doesn't test code blocks which contain the `ignore` attribute: + + ```rust,ignore + fn main() {} + ``` + +rustdoc also doesn't test code blocks which specify a language other than Rust: + + ```markdown + **Foo**: _bar_ + ``` + +rustdoc *does* test code blocks which have no language specified: + + ``` + This is going to cause an error! + ``` + +#### Specify a directory + +The `test` command can take a directory as an argument to use as the book's root +instead of the current working directory. + +```bash +mdbook test path/to/book +``` + +#### --library-path + +The `--library-path` (`-L`) option allows you to add directories to the library +search path used by `rustdoc` when it builds and tests the examples. Multiple +directories can be specified with multiple options (`-L foo -L bar`) or with a +comma-delimited list (`-L foo,bar`). The path should point to the Cargo +[build cache](https://doc.rust-lang.org/cargo/guide/build-cache.html) `deps` directory that +contains the build output of your project. For example, if your Rust project's book is in a directory +named `my-book`, the following command would include the crate's dependencies when running `test`: + +```shell +mdbook test my-book -L target/debug/deps/ +``` + +See the `rustdoc` command-line [documentation](https://doc.rust-lang.org/rustdoc/command-line-arguments.html#-l--library-path-where-to-look-for-dependencies) +for more information. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. diff --git a/website/doc/es/src/cli/watch.md b/website/doc/es/src/cli/watch.md new file mode 100644 index 00000000..3522f43c --- /dev/null +++ b/website/doc/es/src/cli/watch.md @@ -0,0 +1,40 @@ +# The watch command + +The `watch` command is useful when you want your book to be rendered on every +file change. You could repeatedly issue `mdbook build` every time a file is +changed. But using `mdbook watch` once will watch your files and will trigger a +build automatically whenever you modify a file; this includes re-creating +deleted files still mentioned in `SUMMARY.md`! + +#### Specify a directory + +The `watch` command can take a directory as an argument to use as the book's +root instead of the current working directory. + +```bash +mdbook watch path/to/book +``` + +#### --open + +When you use the `--open` (`-o`) option, mdbook will open the rendered book in +your default web browser. + +#### --dest-dir + +The `--dest-dir` (`-d`) option allows you to change the output directory for the +book. Relative paths are interpreted relative to the book's root directory. If +not specified it will default to the value of the `build.build-dir` key in +`book.toml`, or to `./book`. + + +#### Specify exclude patterns + +The `watch` command will not automatically trigger a build for files listed in +the `.gitignore` file in the book root directory. The `.gitignore` file may +contain file patterns described in the [gitignore +documentation](https://git-scm.com/docs/gitignore). This can be useful for +ignoring temporary files created by some editors. + +_Note: Only `.gitignore` from book root directory is used. Global +`$HOME/.gitignore` or `.gitignore` files in parent directories are not used._ diff --git a/website/doc/es/src/continuous-integration.md b/website/doc/es/src/continuous-integration.md new file mode 100644 index 00000000..c39cb010 --- /dev/null +++ b/website/doc/es/src/continuous-integration.md @@ -0,0 +1,121 @@ +# Running `mdbook` in Continuous Integration + +There are a variety of services such as [GitHub Actions] or [GitLab CI/CD] which can be used to test and deploy your book automatically. + +The following provides some general guidelines on how to configure your service to run mdBook. +Specific recipes can be found at the [Automated Deployment] wiki page. + +[GitHub Actions]: https://docs.github.com/en/actions +[GitLab CI/CD]: https://docs.gitlab.com/ee/ci/ +[Automated Deployment]: https://github.com/rust-lang/mdBook/wiki/Automated-Deployment + +## Installing mdBook + +There are several different strategies for installing mdBook. +The particular method depends on your needs and preferences. + +### Pre-compiled binaries + +Perhaps the easiest method is to use the pre-compiled binaries found on the [GitHub Releases page][releases]. +A simple approach would be to use the popular `curl` CLI tool to download the executable: + +```sh +mkdir bin +curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.21/mdbook-v0.4.21-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin +bin/mdbook build +``` + +Some considerations for this approach: + +* This is relatively fast, and does not necessarily require dealing with caching. +* This does not require installing Rust. +* Specifying a specific URL means you have to manually update your script to get a new version. + This may be a benefit if you want to lock to a specific version. + However, some users prefer to automatically get a newer version when they are published. +* You are reliant on the GitHub CDN being available. + +[releases]: https://github.com/rust-lang/mdBook/releases + +### Building from source + +Building from source will require having Rust installed. +Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. + +After Rust is installed, `cargo install` can be used to build and install mdBook. +We recommend using a SemVer version specifier so that you get the latest **non-breaking** version of mdBook. +For example: + +```sh +cargo install mdbook --no-default-features --features search --vers "^0.4" --locked +``` + +This includes several recommended options: + +* `--no-default-features` — Disables features like the HTTP server used by `mdbook serve` that is likely not needed on CI. + This will speed up the build time significantly. +* `--features search` — Disabling default features means you should then manually enable features that you want, such as the built-in [search] capability. +* `--vers "^0.4"` — This will install the most recent version of the `0.4` series. + However, versions after like `0.5.0` won't be installed, as they may break your build. + Cargo will automatically upgrade mdBook if you have an older version already installed. +* `--locked` — This will use the dependencies that were used when mdBook was released. + Without `--locked`, it will use the latest version of all dependencies, which may include some fixes since the last release, but may also (rarely) cause build problems. + +You will likely want to investigate caching options, as building mdBook can be somewhat slow. + +[search]: guide/reading.md#search + +## Running tests + +You may want to run tests using [`mdbook test`] every time you push a change or create a pull request. +This can be used to validate Rust code examples in the book. + +This will require having Rust installed. +Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. + +Other than making sure the appropriate version of Rust is installed, there's not much more than just running `mdbook test` from the book directory. + +You may also want to consider running other kinds of tests, like [mdbook-linkcheck] which will check for broken links. +Or if you have your own style checks, spell checker, or any other tests it might be good to run them in CI. + +[`mdbook test`]: cli/test.md +[mdbook-linkcheck]: https://github.com/Michael-F-Bryan/mdbook-linkcheck#continuous-integration + +## Deploying + +You may want to automatically deploy your book. +Some may want to do this with every time a change is pushed, and others may want to only deploy when a specific release is tagged. + +You'll also need to understand the specifics on how to push a change to your web service. +For example, [GitHub Pages] just requires committing the output onto a specific git branch. +Other services may require using something like SSH to connect to a remote server. + +The basic outline is that you need to run `mdbook build` to generate the output, and then transfer the files (which are in the `book` directory) to the correct location. + +You may then want to consider if you need to invalidate any caches on your web service. + +See the [Automated Deployment] wiki page for examples of various different services. + +[GitHub Pages]: https://docs.github.com/en/pages + +### 404 handling + +mdBook automatically generates a 404 page to be used for broken links. +The default output is a file named `404.html` at the root of the book. +Some services like [GitHub Pages] will automatically use this page for broken links. +For other services, you may want to consider configuring the web server to use this page as it will provide the reader navigation to get back to the book. + +If your book is not deployed at the root of the domain, then you should set the [`output.html.site-url`] setting so that the 404 page works correctly. +It needs to know where the book is deployed in order to load the static files (like CSS) correctly. +For example, this guide is deployed at <https://rust-lang.github.io/mdBook/>, and the `site-url` setting is configured like this: + +```toml +# book.toml +[output.html] +site-url = "/mdBook/" +``` + +You can customize the look of the 404 page by creating a file named `src/404.md` in your book. +If you want to use a different filename, you can set [`output.html.input-404`] to a different filename. + +[`output.html.site-url`]: format/configuration/renderers.md#html-renderer-options +[`output.html.input-404`]: format/configuration/renderers.md#html-renderer-options diff --git a/website/doc/es/src/for_developers/README.md b/website/doc/es/src/for_developers/README.md new file mode 100644 index 00000000..d8b97709 --- /dev/null +++ b/website/doc/es/src/for_developers/README.md @@ -0,0 +1,47 @@ +# For Developers + +While `mdbook` is mainly used as a command line tool, you can also import the +underlying library directly and use that to manage a book. It also has a fairly +flexible plugin mechanism, allowing you to create your own custom tooling and +consumers (often referred to as *backends*) if you need to do some analysis of +the book or render it in a different format. + +The *For Developers* chapters are here to show you the more advanced usage of +`mdbook`. + +The two main ways a developer can hook into the book's build process is via, + +- [Preprocessors](preprocessors.md) +- [Alternative Backends](backends.md) + + +## The Build Process + +The process of rendering a book project goes through several steps. + +1. Load the book + - Parse the `book.toml`, falling back to the default `Config` if it doesn't + exist + - Load the book chapters into memory + - Discover which preprocessors/backends should be used +2. For each backend: + 1. Run all the preprocessors. + 2. Call the backend to render the processed result. + + +## Using `mdbook` as a Library + +The `mdbook` binary is just a wrapper around the `mdbook` crate, exposing its +functionality as a command-line program. As such it is quite easy to create your +own programs which use `mdbook` internally, adding your own functionality (e.g. +a custom preprocessor) or tweaking the build process. + +The easiest way to find out how to use the `mdbook` crate is by looking at the +[API Docs]. The top level documentation explains how one would use the +[`MDBook`] type to load and build a book, while the [config] module gives a good +explanation on the configuration system. + + +[`MDBook`]: https://docs.rs/mdbook/*/mdbook/book/struct.MDBook.html +[API Docs]: https://docs.rs/mdbook/*/mdbook/ +[config]: https://docs.rs/mdbook/*/mdbook/config/index.html diff --git a/website/doc/es/src/for_developers/backends.md b/website/doc/es/src/for_developers/backends.md new file mode 100644 index 00000000..78326a36 --- /dev/null +++ b/website/doc/es/src/for_developers/backends.md @@ -0,0 +1,346 @@ +# Alternative Backends + +A "backend" is simply a program which `mdbook` will invoke during the book +rendering process. This program is passed a JSON representation of the book and +configuration information via `stdin`. Once the backend receives this +information it is free to do whatever it wants. + +See [Configuring Renderers](../format/configuration/renderers.md) for more information about using backends. + +The community has developed several backends. +See the [Third Party Plugins] wiki page for a list of available backends. + +## Setting Up + +This page will step you through creating your own alternative backend in the form +of a simple word counting program. Although it will be written in Rust, there's +no reason why it couldn't be accomplished using something like Python or Ruby. + +First you'll want to create a new binary program and add `mdbook` as a +dependency. + +```shell +$ cargo new --bin mdbook-wordcount +$ cd mdbook-wordcount +$ cargo add mdbook +``` + +When our `mdbook-wordcount` plugin is invoked, `mdbook` will send it a JSON +version of [`RenderContext`] via our plugin's `stdin`. For convenience, there's +a [`RenderContext::from_json()`] constructor which will load a `RenderContext`. + +This is all the boilerplate necessary for our backend to load the book. + +```rust +// src/main.rs +extern crate mdbook; + +use std::io; +use mdbook::renderer::RenderContext; + +fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); +} +``` + +> **Note:** The `RenderContext` contains a `version` field. This lets backends + figure out whether they are compatible with the version of `mdbook` it's being + called by. This `version` comes directly from the corresponding field in + `mdbook`'s `Cargo.toml`. + + It is recommended that backends use the [`semver`] crate to inspect this field + and emit a warning if there may be a compatibility issue. + + +## Inspecting the Book + +Now our backend has a copy of the book, lets count how many words are in each +chapter! + +Because the `RenderContext` contains a [`Book`] field (`book`), and a `Book` has +the [`Book::iter()`] method for iterating over all items in a `Book`, this step +turns out to be just as easy as the first. + +```rust + +fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + } + } +} + +fn count_words(ch: &Chapter) -> usize { + ch.content.split_whitespace().count() +} +``` + + +## Enabling the Backend + +Now we've got the basics running, we want to actually use it. First, install the +program. + +```shell +$ cargo install --path . +``` + +Then `cd` to the particular book you'd like to count the words of and update its +`book.toml` file. + +```diff + [book] + title = "mdBook Documentation" + description = "Create book from markdown files. Like Gitbook but implemented in Rust" + authors = ["Mathieu David", "Michael-F-Bryan"] + ++ [output.html] + ++ [output.wordcount] +``` + +When it loads a book into memory, `mdbook` will inspect your `book.toml` file to +try and figure out which backends to use by looking for all `output.*` tables. +If none are provided it'll fall back to using the default HTML renderer. + +Notably, this means if you want to add your own custom backend you'll also need +to make sure to add the HTML backend, even if its table just stays empty. + +Now you just need to build your book like normal, and everything should *Just +Work*. + +```shell +$ mdbook build +... +2018-01-16 07:31:15 [INFO] (mdbook::renderer): Invoking the "mdbook-wordcount" renderer +mdBook: 126 +Command Line Tool: 224 +init: 283 +build: 145 +watch: 146 +serve: 292 +test: 139 +Format: 30 +SUMMARY.md: 259 +Configuration: 784 +Theme: 304 +index.hbs: 447 +Syntax highlighting: 314 +MathJax Support: 153 +Rust code specific features: 148 +For Developers: 788 +Alternative Backends: 710 +Contributors: 85 +``` + +The reason we didn't need to specify the full name/path of our `wordcount` +backend is because `mdbook` will try to *infer* the program's name via +convention. The executable for the `foo` backend is typically called +`mdbook-foo`, with an associated `[output.foo]` entry in the `book.toml`. To +explicitly tell `mdbook` what command to invoke (it may require command-line +arguments or be an interpreted script), you can use the `command` field. + +```diff + [book] + title = "mdBook Documentation" + description = "Create book from markdown files. Like Gitbook but implemented in Rust" + authors = ["Mathieu David", "Michael-F-Bryan"] + + [output.html] + + [output.wordcount] ++ command = "python /path/to/wordcount.py" +``` + + +## Configuration + +Now imagine you don't want to count the number of words on a particular chapter +(it might be generated text/code, etc). The canonical way to do this is via the +usual `book.toml` configuration file by adding items to your `[output.foo]` +table. + +The `Config` can be treated roughly as a nested hashmap which lets you call +methods like `get()` to access the config's contents, with a +`get_deserialized()` convenience method for retrieving a value and automatically +deserializing to some arbitrary type `T`. + +To implement this, we'll create our own serializable `WordcountConfig` struct +which will encapsulate all configuration for this backend. + +First add `serde` and `serde_derive` to your `Cargo.toml`, + +``` +$ cargo add serde serde_derive +``` + +And then you can create the config struct, + +```rust +extern crate serde; +#[macro_use] +extern crate serde_derive; + +... + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(default, rename_all = "kebab-case")] +pub struct WordcountConfig { + pub ignores: Vec<String>, +} +``` + +Now we just need to deserialize the `WordcountConfig` from our `RenderContext` +and then add a check to make sure we skip ignored chapters. + +```diff + fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); ++ let cfg: WordcountConfig = ctx.config ++ .get_deserialized("output.wordcount") ++ .unwrap_or_default(); + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { ++ if cfg.ignores.contains(&ch.name) { ++ continue; ++ } ++ + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + } + } + } +``` + + +## Output and Signalling Failure + +While it's nice to print word counts to the terminal when a book is built, it +might also be a good idea to output them to a file somewhere. `mdbook` tells a +backend where it should place any generated output via the `destination` field +in [`RenderContext`]. + +```diff ++ use std::fs::{self, File}; ++ use std::io::{self, Write}; +- use std::io; + use mdbook::renderer::RenderContext; + use mdbook::book::{BookItem, Chapter}; + + fn main() { + ... + ++ let _ = fs::create_dir_all(&ctx.destination); ++ let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); ++ + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + ... + + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); ++ writeln!(f, "{}: {}", ch.name, num_words).unwrap(); + } + } + } +``` + +> **Note:** There is no guarantee that the destination directory exists or is +> empty (`mdbook` may leave the previous contents to let backends do caching), +> so it's always a good idea to create it with `fs::create_dir_all()`. +> +> If the destination directory already exists, don't assume it will be empty. +> To allow backends to cache the results from previous runs, `mdbook` may leave +> old content in the directory. + +There's always the possibility that an error will occur while processing a book +(just look at all the `unwrap()`'s we've written already), so `mdbook` will +interpret a non-zero exit code as a rendering failure. + +For example, if we wanted to make sure all chapters have an *even* number of +words, erroring out if an odd number is encountered, then you may do something +like this: + +```diff ++ use std::process; + ... + + fn main() { + ... + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + ... + + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + writeln!(f, "{}: {}", ch.name, num_words).unwrap(); + ++ if cfg.deny_odds && num_words % 2 == 1 { ++ eprintln!("{} has an odd number of words!", ch.name); ++ process::exit(1); + } + } + } + } + + #[derive(Debug, Default, Serialize, Deserialize)] + #[serde(default, rename_all = "kebab-case")] + pub struct WordcountConfig { + pub ignores: Vec<String>, ++ pub deny_odds: bool, + } +``` + +Now, if we reinstall the backend and build a book, + +```shell +$ cargo install --path . --force +$ mdbook build /path/to/book +... +2018-01-16 21:21:39 [INFO] (mdbook::renderer): Invoking the "wordcount" renderer +mdBook: 126 +Command Line Tool: 224 +init: 283 +init has an odd number of words! +2018-01-16 21:21:39 [ERROR] (mdbook::renderer): Renderer exited with non-zero return code. +2018-01-16 21:21:39 [ERROR] (mdbook::utils): Error: Rendering failed +2018-01-16 21:21:39 [ERROR] (mdbook::utils): Caused By: The "mdbook-wordcount" renderer failed +``` + +As you've probably already noticed, output from the plugin's subprocess is +immediately passed through to the user. It is encouraged for plugins to follow +the "rule of silence" and only generate output when necessary (e.g. an error in +generation or a warning). + +All environment variables are passed through to the backend, allowing you to use +the usual `RUST_LOG` to control logging verbosity. + +## Wrapping Up + +Although contrived, hopefully this example was enough to show how you'd create +an alternative backend for `mdbook`. If you feel it's missing something, don't +hesitate to create an issue in the [issue tracker] so we can improve the user +guide. + +The existing backends mentioned towards the start of this chapter should serve +as a good example of how it's done in real life, so feel free to skim through +the source code or ask questions. + + +[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins +[`RenderContext`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html +[`RenderContext::from_json()`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html#method.from_json +[`semver`]: https://crates.io/crates/semver +[`Book`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html +[`Book::iter()`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html#method.iter +[`Config`]: https://docs.rs/mdbook/*/mdbook/config/struct.Config.html +[issue tracker]: https://github.com/rust-lang/mdBook/issues diff --git a/website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml b/website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml new file mode 100644 index 00000000..e58e73b6 --- /dev/null +++ b/website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "mdbook-wordcount" +version = "0.1.0" +authors = ["Michael Bryan <michaelfbryan@gmail.com>"] + +[dependencies] +mdbook = { path = "../../../..", version = "*" } +serde = "1.0" +serde_derive = "1.0" diff --git a/website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs b/website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs new file mode 100644 index 00000000..607338dd --- /dev/null +++ b/website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs @@ -0,0 +1,49 @@ +extern crate mdbook; +extern crate serde; +#[macro_use] +extern crate serde_derive; + +use std::process; +use std::fs::{self, File}; +use std::io::{self, Write}; +use mdbook::renderer::RenderContext; +use mdbook::book::{BookItem, Chapter}; + +fn main() { + let mut stdin = io::stdin(); + let ctx = RenderContext::from_json(&mut stdin).unwrap(); + let cfg: WordcountConfig = ctx.config + .get_deserialized("output.wordcount") + .unwrap_or_default(); + + let _ = fs::create_dir_all(&ctx.destination); + let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); + + for item in ctx.book.iter() { + if let BookItem::Chapter(ref ch) = *item { + if cfg.ignores.contains(&ch.name) { + continue; + } + + let num_words = count_words(ch); + println!("{}: {}", ch.name, num_words); + writeln!(f, "{}: {}", ch.name, num_words).unwrap(); + + if cfg.deny_odds && num_words % 2 == 1 { + eprintln!("{} has an odd number of words!", ch.name); + process::exit(1); + } + } + } +} + +fn count_words(ch: &Chapter) -> usize { + ch.content.split_whitespace().count() +} + +#[derive(Debug, Default, Serialize, Deserialize)] +#[serde(default, rename_all = "kebab-case")] +pub struct WordcountConfig { + pub ignores: Vec<String>, + pub deny_odds: bool, +} diff --git a/website/doc/es/src/for_developers/preprocessors.md b/website/doc/es/src/for_developers/preprocessors.md new file mode 100644 index 00000000..dbe78779 --- /dev/null +++ b/website/doc/es/src/for_developers/preprocessors.md @@ -0,0 +1,126 @@ +# Preprocessors + +A *preprocessor* is simply a bit of code which gets run immediately after the +book is loaded and before it gets rendered, allowing you to update and mutate +the book. Possible use cases are: + +- Creating custom helpers like `\{{#include /path/to/file.md}}` +- Substituting in latex-style expressions (`$$ \frac{1}{3} $$`) with their + mathjax equivalents + +See [Configuring Preprocessors](../format/configuration/preprocessors.md) for more information about using preprocessors. + +## Hooking Into MDBook + +MDBook uses a fairly simple mechanism for discovering third party plugins. +A new table is added to `book.toml` (e.g. `[preprocessor.foo]` for the `foo` +preprocessor) and then `mdbook` will try to invoke the `mdbook-foo` program as +part of the build process. + +Once the preprocessor has been defined and the build process starts, mdBook executes the command defined in the `preprocessor.foo.command` key twice. +The first time it runs the preprocessor to determine if it supports the given renderer. +mdBook passes two arguments to the process: the first argument is the string `supports` and the second argument is the renderer name. +The preprocessor should exit with a status code 0 if it supports the given renderer, or return a non-zero exit code if it does not. + +If the preprocessor supports the renderer, then mdbook runs it a second time, passing JSON data into stdin. +The JSON consists of an array of `[context, book]` where `context` is the serialized object [`PreprocessorContext`] and `book` is a [`Book`] object containing the content of the book. + +The preprocessor should return the JSON format of the [`Book`] object to stdout, with any modifications it wishes to perform. + +The easiest way to get started is by creating your own implementation of the +`Preprocessor` trait (e.g. in `lib.rs`) and then creating a shell binary which +translates inputs to the correct `Preprocessor` method. For convenience, there +is [an example no-op preprocessor] in the `examples/` directory which can easily +be adapted for other preprocessors. + +</details> + +## Hints For Implementing A Preprocessor + +By pulling in `mdbook` as a library, preprocessors can have access to the +existing infrastructure for dealing with books. + +For example, a custom preprocessor could use the +[`CmdPreprocessor::parse_input()`] function to deserialize the JSON written to +`stdin`. Then each chapter of the `Book` can be mutated in-place via +[`Book::for_each_mut()`], and then written to `stdout` with the `serde_json` +crate. + +Chapters can be accessed either directly (by recursively iterating over +chapters) or via the `Book::for_each_mut()` convenience method. + +The `chapter.content` is just a string which happens to be markdown. While it's +entirely possible to use regular expressions or do a manual find & replace, +you'll probably want to process the input into something more computer-friendly. +The [`pulldown-cmark`][pc] crate implements a production-quality event-based +Markdown parser, with the [`pulldown-cmark-to-cmark`][pctc] crate allowing you to +translate events back into markdown text. + +The following code block shows how to remove all emphasis from markdown, +without accidentally breaking the document. + +```rust +fn remove_emphasis( + num_removed_items: &mut usize, + chapter: &mut Chapter, +) -> Result<String> { + let mut buf = String::with_capacity(chapter.content.len()); + + let events = Parser::new(&chapter.content).filter(|e| { + let should_keep = match *e { + Event::Start(Tag::Emphasis) + | Event::Start(Tag::Strong) + | Event::End(Tag::Emphasis) + | Event::End(Tag::Strong) => false, + _ => true, + }; + if !should_keep { + *num_removed_items += 1; + } + should_keep + }); + + cmark(events, &mut buf, None).map(|_| buf).map_err(|err| { + Error::from(format!("Markdown serialization failed: {}", err)) + }) +} +``` + +For everything else, have a look [at the complete example][example]. + +## Implementing a preprocessor with a different language + +The fact that mdBook utilizes stdin and stdout to communicate with the preprocessors makes it easy to implement them in a language other than Rust. +The following code shows how to implement a simple preprocessor in Python, which will modify the content of the first chapter. +The example below follows the configuration shown above with `preprocessor.foo.command` actually pointing to a Python script. + +```python +import json +import sys + + +if __name__ == '__main__': + if len(sys.argv) > 1: # we check if we received any argument + if sys.argv[1] == "supports": + # then we are good to return an exit status code of 0, since the other argument will just be the renderer's name + sys.exit(0) + + # load both the context and the book representations from stdin + context, book = json.load(sys.stdin) + # and now, we can just modify the content of the first chapter + book['sections'][0]['Chapter']['content'] = '# Hello' + # we are done with the book's modification, we can just print it to stdout, + print(json.dumps(book)) +``` + + + +[preprocessor-docs]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html +[pc]: https://crates.io/crates/pulldown-cmark +[pctc]: https://crates.io/crates/pulldown-cmark-to-cmark +[example]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs +[an example no-op preprocessor]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs +[`CmdPreprocessor::parse_input()`]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html#method.parse_input +[`Book::for_each_mut()`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html#method.for_each_mut +[`PreprocessorContext`]: https://docs.rs/mdbook/latest/mdbook/preprocess/struct.PreprocessorContext.html +[`Book`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html diff --git a/website/doc/es/src/format/README.md b/website/doc/es/src/format/README.md new file mode 100644 index 00000000..35757252 --- /dev/null +++ b/website/doc/es/src/format/README.md @@ -0,0 +1,8 @@ +# Format + +In this section you will learn how to: + +- Structure your book correctly +- Format your `SUMMARY.md` file +- Configure your book using `book.toml` +- Customize your theme diff --git a/website/doc/es/src/format/configuration/README.md b/website/doc/es/src/format/configuration/README.md new file mode 100644 index 00000000..4dcb5852 --- /dev/null +++ b/website/doc/es/src/format/configuration/README.md @@ -0,0 +1,12 @@ +# Configuration + +This section details the configuration options available in the ***book.toml***: +- **[General]** configuration including the `book`, `rust`, `build` sections +- **[Preprocessor]** configuration for default and custom book preprocessors +- **[Renderer]** configuration for the HTML, Markdown and custom renderers +- **[Environment Variable]** configuration for overriding configuration options in your environment + +[General]: general.md +[Preprocessor]: preprocessors.md +[Renderer]: renderers.md +[Environment Variable]: environment-variables.md \ No newline at end of file diff --git a/website/doc/es/src/format/configuration/environment-variables.md b/website/doc/es/src/format/configuration/environment-variables.md new file mode 100644 index 00000000..3631769b --- /dev/null +++ b/website/doc/es/src/format/configuration/environment-variables.md @@ -0,0 +1,38 @@ +# Environment Variables + +All configuration values can be overridden from the command line by setting the +corresponding environment variable. Because many operating systems restrict +environment variables to be alphanumeric characters or `_`, the configuration +key needs to be formatted slightly differently to the normal `foo.bar.baz` form. + +Variables starting with `MDBOOK_` are used for configuration. The key is created +by removing the `MDBOOK_` prefix and turning the resulting string into +`kebab-case`. Double underscores (`__`) separate nested keys, while a single +underscore (`_`) is replaced with a dash (`-`). + +For example: + +- `MDBOOK_foo` -> `foo` +- `MDBOOK_FOO` -> `foo` +- `MDBOOK_FOO__BAR` -> `foo.bar` +- `MDBOOK_FOO_BAR` -> `foo-bar` +- `MDBOOK_FOO_bar__baz` -> `foo-bar.baz` + +So by setting the `MDBOOK_BOOK__TITLE` environment variable you can override the +book's title without needing to touch your `book.toml`. + +> **Note:** To facilitate setting more complex config items, the value of an +> environment variable is first parsed as JSON, falling back to a string if the +> parse fails. +> +> This means, if you so desired, you could override all book metadata when +> building the book with something like +> +> ```shell +> $ export MDBOOK_BOOK="{'title': 'My Awesome Book', authors: ['Michael-F-Bryan']}" +> $ mdbook build +> ``` + +The latter case may be useful in situations where `mdbook` is invoked from a +script or CI, where it sometimes isn't possible to update the `book.toml` before +building. diff --git a/website/doc/es/src/format/configuration/general.md b/website/doc/es/src/format/configuration/general.md new file mode 100644 index 00000000..a00247ec --- /dev/null +++ b/website/doc/es/src/format/configuration/general.md @@ -0,0 +1,110 @@ +# General Configuration + +You can configure the parameters for your book in the ***book.toml*** file. + +Here is an example of what a ***book.toml*** file might look like: + +```toml +[book] +title = "Example book" +authors = ["John Doe"] +description = "The example book covers examples." + +[rust] +edition = "2018" + +[build] +build-dir = "my-example-book" +create-missing = false + +[preprocessor.index] + +[preprocessor.links] + +[output.html] +additional-css = ["custom.css"] + +[output.html.search] +limit-results = 15 +``` + +## Supported configuration options + +It is important to note that **any** relative path specified in the +configuration will always be taken relative from the root of the book where the +configuration file is located. + +### General metadata + +This is general information about your book. + +- **title:** The title of the book +- **authors:** The author(s) of the book +- **description:** A description for the book, which is added as meta + information in the html `<head>` of each page +- **src:** By default, the source directory is found in the directory named + `src` directly under the root folder. But this is configurable with the `src` + key in the configuration file. +- **language:** The main language of the book, which is used as a language attribute `<html lang="en">` for example. + +**book.toml** +```toml +[book] +title = "Example book" +authors = ["John Doe", "Jane Doe"] +description = "The example book covers examples." +src = "my-src" # the source files will be found in `root/my-src` instead of `root/src` +language = "en" +``` + +### Rust options + +Options for the Rust language, relevant to running tests and playground +integration. + +```toml +[rust] +edition = "2015" # the default edition for code blocks +``` + +- **edition**: Rust edition to use by default for the code snippets. Default + is "2015". Individual code blocks can be controlled with the `edition2015`, + `edition2018` or `edition2021` annotations, such as: + + ~~~text + ```rust,edition2015 + // This only works in 2015. + let try = true; + ``` + ~~~ + +### Build options + +This controls the build process of your book. + +```toml +[build] +build-dir = "book" # the directory where the output is placed +create-missing = true # whether or not to create missing pages +use-default-preprocessors = true # use the default preprocessors +``` + +- **build-dir:** The directory to put the rendered book in. By default this is + `book/` in the book's root directory. + This can overridden with the `--dest-dir` CLI option. +- **create-missing:** By default, any missing files specified in `SUMMARY.md` + will be created when the book is built (i.e. `create-missing = true`). If this + is `false` then the build process will instead exit with an error if any files + do not exist. +- **use-default-preprocessors:** Disable the default preprocessors of (`links` & + `index`) by setting this option to `false`. + + If you have the same, and/or other preprocessors declared via their table + of configuration, they will run instead. + + - For clarity, with no preprocessor configuration, the default `links` and + `index` will run. + - Setting `use-default-preprocessors = false` will disable these + default preprocessors from running. + - Adding `[preprocessor.links]`, for example, will ensure, regardless of + `use-default-preprocessors` that `links` it will run. diff --git a/website/doc/es/src/format/configuration/preprocessors.md b/website/doc/es/src/format/configuration/preprocessors.md new file mode 100644 index 00000000..f44bdd4f --- /dev/null +++ b/website/doc/es/src/format/configuration/preprocessors.md @@ -0,0 +1,87 @@ +# Configuring Preprocessors + +Preprocessors are extensions that can modify the raw Markdown source before it gets sent to the renderer. + +The following preprocessors are built-in and included by default: + +- `links`: Expands the `{{ #playground }}`, `{{ #include }}`, and `{{ #rustdoc_include }}` handlebars + helpers in a chapter to include the contents of a file. + See [Including files] for more. +- `index`: Convert all chapter files named `README.md` into `index.md`. That is + to say, all `README.md` would be rendered to an index file `index.html` in the + rendered book. + +The built-in preprocessors can be disabled with the [`build.use-default-preprocessors`] config option. + +The community has developed several preprocessors. +See the [Third Party Plugins] wiki page for a list of available preprocessors. + +For information on how to create a new preprocessor, see the [Preprocessors for Developers] chapter. + +[Including files]: ../mdbook.md#including-files +[`build.use-default-preprocessors`]: general.md#build-options +[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins +[Preprocessors for Developers]: ../../for_developers/preprocessors.md + +## Custom Preprocessor Configuration + +Preprocessors can be added by including a `preprocessor` table in `book.toml` with the name of the preprocessor. +For example, if you have a preprocessor called `mdbook-example`, then you can include it with: + +```toml +[preprocessor.example] +``` + +With this table, mdBook will execute the `mdbook-example` preprocessor. + +This table can include additional key-value pairs that are specific to the preprocessor. +For example, if our example prepocessor needed some extra configuration options: + +```toml +[preprocessor.example] +some-extra-feature = true +``` + +## Locking a Preprocessor dependency to a renderer + +You can explicitly specify that a preprocessor should run for a renderer by +binding the two together. + +```toml +[preprocessor.example] +renderers = ["html"] # example preprocessor only runs with the HTML renderer +``` + +## Provide Your Own Command + +By default when you add a `[preprocessor.foo]` table to your `book.toml` file, +`mdbook` will try to invoke the `mdbook-foo` executable. If you want to use a +different program name or pass in command-line arguments, this behaviour can +be overridden by adding a `command` field. + +```toml +[preprocessor.random] +command = "python random.py" +``` + +## Require A Certain Order + +The order in which preprocessors are run can be controlled with the `before` and `after` fields. +For example, suppose you want your `linenos` preprocessor to process lines that may have been `{{#include}}`d; then you want it to run after the built-in `links` preprocessor, which you can require using either the `before` or `after` field: + +```toml +[preprocessor.linenos] +after = [ "links" ] +``` + +or + +```toml +[preprocessor.links] +before = [ "linenos" ] +``` + +It would also be possible, though redundant, to specify both of the above in the same config file. + +Preprocessors having the same priority specified through `before` and `after` are sorted by name. +Any infinite loops will be detected and produce an error. diff --git a/website/doc/es/src/format/configuration/renderers.md b/website/doc/es/src/format/configuration/renderers.md new file mode 100644 index 00000000..f1d5ee15 --- /dev/null +++ b/website/doc/es/src/format/configuration/renderers.md @@ -0,0 +1,299 @@ +# Configuring Renderers + +Renderers (also called "backends") are responsible for creating the output of the book. + +The following backends are built-in: + +* [`html`](#html-renderer-options) — This renders the book to HTML. + This is enabled by default if no other `[output]` tables are defined in `book.toml`. +* [`markdown`](#markdown-renderer) — This outputs the book as markdown after running the preprocessors. + This is useful for debugging preprocessors. + +The community has developed several backends. +See the [Third Party Plugins] wiki page for a list of available backends. + +For information on how to create a new backend, see the [Backends for Developers] chapter. + +[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins +[Backends for Developers]: ../../for_developers/backends.md + +## Output tables + +Backends can be added by including a `output` table in `book.toml` with the name of the backend. +For example, if you have a backend called `mdbook-wordcount`, then you can include it with: + +```toml +[output.wordcount] +``` + +With this table, mdBook will execute the `mdbook-wordcount` backend. + +This table can include additional key-value pairs that are specific to the backend. +For example, if our example backend needed some extra configuration options: + +```toml +[output.wordcount] +ignores = ["Example Chapter"] +``` + +If you define any `[output]` tables, then the `html` backend is not enabled by default. +If you want to keep the `html` backend running, then just include it in the `book.toml` file. +For example: + +```toml +[book] +title = "My Awesome Book" + +[output.wordcount] + +[output.html] +``` + +If more than one `output` table is included, this changes the behavior for the layout of the output directory. +If there is only one backend, then it places its output directly in the `book` directory (see [`build.build-dir`] to override this location). +If there is more than one backend, then each backend is placed in a separate directory underneath `book`. +For example, the above would have directories `book/html` and `book/wordcount`. + +[`build.build-dir`]: general.md#build-options + +### Custom backend commands + +By default when you add an `[output.foo]` table to your `book.toml` file, +`mdbook` will try to invoke the `mdbook-foo` executable. +If you want to use a different program name or pass in command-line arguments, +this behaviour can be overridden by adding a `command` field. + +```toml +[output.random] +command = "python random.py" +``` + +### Optional backends + +If you enable a backend that isn't installed, the default behavior is to throw an error. +This behavior can be changed by marking the backend as optional: + +```toml +[output.wordcount] +optional = true +``` + +This demotes the error to a warning. + + +## HTML renderer options + +The HTML renderer has a variety of options detailed below. +They should be specified in the `[output.html]` table of the `book.toml` file. + +```toml +# Example book.toml file with all output options. +[book] +title = "Example book" +authors = ["John Doe", "Jane Doe"] +description = "The example book covers examples." + +[output.html] +theme = "my-theme" +default-theme = "light" +preferred-dark-theme = "navy" +curly-quotes = true +mathjax-support = false +copy-fonts = true +additional-css = ["custom.css", "custom2.css"] +additional-js = ["custom.js"] +no-section-label = false +git-repository-url = "https://github.com/rust-lang/mdBook" +git-repository-icon = "fa-github" +edit-url-template = "https://github.com/rust-lang/mdBook/edit/master/guide/{path}" +site-url = "/example-book/" +cname = "myproject.rs" +input-404 = "not-found.md" +``` + +The following configuration options are available: + +- **theme:** mdBook comes with a default theme and all the resource files needed + for it. But if this option is set, mdBook will selectively overwrite the theme + files with the ones found in the specified folder. +- **default-theme:** The theme color scheme to select by default in the + 'Change Theme' dropdown. Defaults to `light`. +- **preferred-dark-theme:** The default dark theme. This theme will be used if + the browser requests the dark version of the site via the + ['prefers-color-scheme'](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme) + CSS media query. Defaults to `navy`. +- **curly-quotes:** Convert straight quotes to curly quotes, except for those + that occur in code blocks and code spans. Defaults to `false`. +- **mathjax-support:** Adds support for [MathJax](../mathjax.md). Defaults to + `false`. +- **copy-fonts:** Copies fonts.css and respective font files to the output directory and use them in the default theme. Defaults to `true`. +- **google-analytics:** This field has been deprecated and will be removed in a future release. + Use the `theme/head.hbs` file to add the appropriate Google Analytics code instead. +- **additional-css:** If you need to slightly change the appearance of your book + without overwriting the whole style, you can specify a set of stylesheets that + will be loaded after the default ones where you can surgically change the + style. +- **additional-js:** If you need to add some behaviour to your book without + removing the current behaviour, you can specify a set of JavaScript files that + will be loaded alongside the default one. +- **no-section-label:** mdBook by defaults adds numeric section labels in the table of + contents column. For example, "1.", "2.1". Set this option to true to disable + those labels. Defaults to `false`. +- **git-repository-url:** A url to the git repository for the book. If provided + an icon link will be output in the menu bar of the book. +- **git-repository-icon:** The FontAwesome icon class to use for the git + repository link. Defaults to `fa-github` which looks like <i class="fa fa-github"></i>. + If you are not using GitHub, another option to consider is `fa-code-fork` which looks like <i class="fa fa-code-fork"></i>. +- **edit-url-template:** Edit url template, when provided shows a + "Suggest an edit" button (which looks like <i class="fa fa-edit"></i>) for directly jumping to editing the currently + viewed page. For e.g. GitHub projects set this to + `https://github.com/<owner>/<repo>/edit/master/{path}` or for + Bitbucket projects set it to + `https://bitbucket.org/<owner>/<repo>/src/master/{path}?mode=edit` + where {path} will be replaced with the full path of the file in the + repository. +- **input-404:** The name of the markdown file used for missing files. + The corresponding output file will be the same, with the extension replaced with `html`. + Defaults to `404.md`. +- **site-url:** The url where the book will be hosted. This is required to ensure + navigation links and script/css imports in the 404 file work correctly, even when accessing + urls in subdirectories. Defaults to `/`. +- **cname:** The DNS subdomain or apex domain at which your book will be hosted. + This string will be written to a file named CNAME in the root of your site, as + required by GitHub Pages (see [*Managing a custom domain for your GitHub Pages + site*][custom domain]). + +[custom domain]: https://docs.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site + +### `[output.html.print]` + +The `[output.html.print]` table provides options for controlling the printable output. +By default, mdBook will include an icon on the top right of the book (which looks like <i class="fa fa-print"></i>) that will print the book as a single page. + +```toml +[output.html.print] +enable = true # include support for printable output +page-break = true # insert page-break after each chapter +``` + +- **enable:** Enable print support. When `false`, all print support will not be + rendered. Defaults to `true`. +- **page-break** Insert page breaks between chapters. Defaults to `true`. + +### `[output.html.fold]` + +The `[output.html.fold]` table provides options for controlling folding of the chapter listing in the navigation sidebar. + +```toml +[output.html.fold] +enable = false # whether or not to enable section folding +level = 0 # the depth to start folding +``` + +- **enable:** Enable section-folding. When off, all folds are open. + Defaults to `false`. +- **level:** The higher the more folded regions are open. When level is 0, all + folds are closed. Defaults to `0`. + +### `[output.html.playground]` + +The `[output.html.playground]` table provides options for controlling Rust sample code blocks, and their integration with the [Rust Playground]. + +[Rust Playground]: https://play.rust-lang.org/ + +```toml +[output.html.playground] +editable = false # allows editing the source code +copyable = true # include the copy button for copying code snippets +copy-js = true # includes the JavaScript for the code editor +line-numbers = false # displays line numbers for editable code +runnable = true # displays a run button for rust code +``` + +- **editable:** Allow editing the source code. Defaults to `false`. +- **copyable:** Display the copy button on code snippets. Defaults to `true`. +- **copy-js:** Copy JavaScript files for the editor to the output directory. + Defaults to `true`. +- **line-numbers** Display line numbers on editable sections of code. Requires both `editable` and `copy-js` to be `true`. Defaults to `false`. +- **runnable** Displays a run button for rust code snippets. Changing this to `false` will disable the run in playground feature globally. Defaults to `true`. + +[Ace]: https://ace.c9.io/ + +### `[output.html.search]` + +The `[output.html.search]` table provides options for controlling the built-in text [search]. +mdBook must be compiled with the `search` feature enabled (on by default). + +[search]: ../../guide/reading.md#search + +```toml +[output.html.search] +enable = true # enables the search feature +limit-results = 30 # maximum number of search results +teaser-word-count = 30 # number of words used for a search result teaser +use-boolean-and = true # multiple search terms must all match +boost-title = 2 # ranking boost factor for matches in headers +boost-hierarchy = 1 # ranking boost factor for matches in page names +boost-paragraph = 1 # ranking boost factor for matches in text +expand = true # partial words will match longer terms +heading-split-level = 3 # link results to heading levels +copy-js = true # include Javascript code for search +``` + +- **enable:** Enables the search feature. Defaults to `true`. +- **limit-results:** The maximum number of search results. Defaults to `30`. +- **teaser-word-count:** The number of words used for a search result teaser. + Defaults to `30`. +- **use-boolean-and:** Define the logical link between multiple search words. If + true, all search words must appear in each result. Defaults to `false`. +- **boost-title:** Boost factor for the search result score if a search word + appears in the header. Defaults to `2`. +- **boost-hierarchy:** Boost factor for the search result score if a search word + appears in the hierarchy. The hierarchy contains all titles of the parent + documents and all parent headings. Defaults to `1`. +- **boost-paragraph:** Boost factor for the search result score if a search word + appears in the text. Defaults to `1`. +- **expand:** True if search should match longer results e.g. search `micro` + should match `microwave`. Defaults to `true`. +- **heading-split-level:** Search results will link to a section of the document + which contains the result. Documents are split into sections by headings this + level or less. Defaults to `3`. (`### This is a level 3 heading`) +- **copy-js:** Copy JavaScript files for the search implementation to the output + directory. Defaults to `true`. + +### `[output.html.redirect]` + +The `[output.html.redirect]` table provides a way to add redirects. +This is useful when you move, rename, or remove a page to ensure that links to the old URL will go to the new location. + +```toml +[output.html.redirect] +"/appendices/bibliography.html" = "https://rustc-dev-guide.rust-lang.org/appendix/bibliography.html" +"/other-installation-methods.html" = "../infra/other-installation-methods.html" +``` + +The table contains key-value pairs where the key is where the redirect file needs to be created, as an absolute path from the build directory, (e.g. `/appendices/bibliography.html`). +The value can be any valid URI the browser should navigate to (e.g. `https://rust-lang.org/`, `/overview.html`, or `../bibliography.html`). + +This will generate an HTML page which will automatically redirect to the given location. +Note that the source location does not support `#` anchor redirects. + +## Markdown Renderer + +The Markdown renderer will run preprocessors and then output the resulting +Markdown. This is mostly useful for debugging preprocessors, especially in +conjunction with `mdbook test` to see the Markdown that `mdbook` is passing +to `rustdoc`. + +The Markdown renderer is included with `mdbook` but disabled by default. +Enable it by adding an empty table to your `book.toml` as follows: + +```toml +[output.markdown] +``` + +There are no configuration options for the Markdown renderer at this time; +only whether it is enabled or disabled. + +See [the preprocessors documentation](preprocessors.md) for how to +specify which preprocessors should run before the Markdown renderer. diff --git a/website/doc/es/src/format/example.rs b/website/doc/es/src/format/example.rs new file mode 100644 index 00000000..a467cac1 --- /dev/null +++ b/website/doc/es/src/format/example.rs @@ -0,0 +1,6 @@ +fn main() { + println!("Hello World!"); +# +# // You can even hide lines! :D +# println!("I am hidden! Expand the code snippet to see me"); +} diff --git a/website/doc/es/src/format/images/rust-logo-blk.svg b/website/doc/es/src/format/images/rust-logo-blk.svg new file mode 100644 index 00000000..1a6c762d --- /dev/null +++ b/website/doc/es/src/format/images/rust-logo-blk.svg @@ -0,0 +1 @@ +<svg height="144" width="144" xmlns="http://www.w3.org/2000/svg"><path d="m71.05 23.68c-26.06 0-47.27 21.22-47.27 47.27s21.22 47.27 47.27 47.27 47.27-21.22 47.27-47.27-21.22-47.27-47.27-47.27zm-.07 4.2a3.1 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm7.12 5.12a38.27 38.27 0 0 1 26.2 18.66l-3.67 8.28c-.63 1.43.02 3.11 1.44 3.75l7.06 3.13a38.27 38.27 0 0 1 .08 6.64h-3.93c-.39 0-.55.26-.55.64v1.8c0 4.24-2.39 5.17-4.49 5.4-2 .23-4.21-.84-4.49-2.06-1.18-6.63-3.14-8.04-6.24-10.49 3.85-2.44 7.85-6.05 7.85-10.87 0-5.21-3.57-8.49-6-10.1-3.42-2.25-7.2-2.7-8.22-2.7h-40.6a38.27 38.27 0 0 1 21.41-12.08l4.79 5.02c1.08 1.13 2.87 1.18 4 .09zm-44.2 23.02a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm74.15.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm-68.29.5h5.42v24.44h-10.94a38.27 38.27 0 0 1 -1.24-14.61l6.7-2.98c1.43-.64 2.08-2.31 1.44-3.74zm22.62.26h12.91c.67 0 4.71.77 4.71 3.8 0 2.51-3.1 3.41-5.65 3.41h-11.98zm0 17.56h9.89c.9 0 4.83.26 6.08 5.28.39 1.54 1.26 6.56 1.85 8.17.59 1.8 2.98 5.4 5.53 5.4h16.14a38.27 38.27 0 0 1 -3.54 4.1l-6.57-1.41c-1.53-.33-3.04.65-3.37 2.18l-1.56 7.28a38.27 38.27 0 0 1 -31.91-.15l-1.56-7.28c-.33-1.53-1.83-2.51-3.36-2.18l-6.43 1.38a38.27 38.27 0 0 1 -3.32-3.92h31.27c.35 0 .59-.06.59-.39v-11.06c0-.32-.24-.39-.59-.39h-9.15zm-14.43 25.33a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm46.05.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11z"/><path d="m115.68 70.95a44.63 44.63 0 0 1 -44.63 44.63 44.63 44.63 0 0 1 -44.63-44.63 44.63 44.63 0 0 1 44.63-44.63 44.63 44.63 0 0 1 44.63 44.63zm-.84-4.31 6.96 4.31-6.96 4.31 5.98 5.59-7.66 2.87 4.78 6.65-8.09 1.32 3.4 7.46-8.19-.29 1.88 7.98-7.98-1.88.29 8.19-7.46-3.4-1.32 8.09-6.65-4.78-2.87 7.66-5.59-5.98-4.31 6.96-4.31-6.96-5.59 5.98-2.87-7.66-6.65 4.78-1.32-8.09-7.46 3.4.29-8.19-7.98 1.88 1.88-7.98-8.19.29 3.4-7.46-8.09-1.32 4.78-6.65-7.66-2.87 5.98-5.59-6.96-4.31 6.96-4.31-5.98-5.59 7.66-2.87-4.78-6.65 8.09-1.32-3.4-7.46 8.19.29-1.88-7.98 7.98 1.88-.29-8.19 7.46 3.4 1.32-8.09 6.65 4.78 2.87-7.66 5.59 5.98 4.31-6.96 4.31 6.96 5.59-5.98 2.87 7.66 6.65-4.78 1.32 8.09 7.46-3.4-.29 8.19 7.98-1.88-1.88 7.98 8.19-.29-3.4 7.46 8.09 1.32-4.78 6.65 7.66 2.87z" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/></svg> \ No newline at end of file diff --git a/website/doc/es/src/format/markdown.md b/website/doc/es/src/format/markdown.md new file mode 100644 index 00000000..963a1538 --- /dev/null +++ b/website/doc/es/src/format/markdown.md @@ -0,0 +1,222 @@ +# Markdown + +mdBook's [parser](https://github.com/raphlinus/pulldown-cmark) adheres to the [CommonMark](https://commonmark.org/) specification with some extensions described below. +You can take a quick [tutorial](https://commonmark.org/help/tutorial/), +or [try out](https://spec.commonmark.org/dingus/) CommonMark in real time. A complete Markdown overview is out of scope for +this documentation, but below is a high level overview of some of the basics. For a more in-depth experience, check out the +[Markdown Guide](https://www.markdownguide.org). + +## Text and Paragraphs + +Text is rendered relatively predictably: + +```markdown +Here is a line of text. + +This is a new line. +``` + +Will look like you might expect: + +Here is a line of text. + +This is a new line. + +## Headings + +Headings use the `#` marker and should be on a line by themselves. More `#` mean smaller headings: + +```markdown +### A heading + +Some text. + +#### A smaller heading + +More text. +``` + +### A heading + +Some text. + +#### A smaller heading + +More text. + +## Lists + +Lists can be unordered or ordered. Ordered lists will order automatically: + +```markdown +* milk +* eggs +* butter + +1. carrots +1. celery +1. radishes +``` + +* milk +* eggs +* butter + +1. carrots +1. celery +1. radishes + +## Links + +Linking to a URL or local file is easy: + +```markdown +Use [mdBook](https://github.com/rust-lang/mdBook). + +Read about [mdBook](mdBook.md). + +A bare url: <https://www.rust-lang.org>. +``` + +Use [mdBook](https://github.com/rust-lang/mdBook). + +Read about [mdBook](mdBook.md). + +A bare url: <https://www.rust-lang.org>. + +---- + +Relative links that end with `.md` will be converted to the `.html` extension. +It is recommended to use `.md` links when possible. +This is useful when viewing the Markdown file outside of mdBook, for example on GitHub or GitLab which render Markdown automatically. + +Links to `README.md` will be converted to `index.html`. +This is done since some services like GitHub render README files automatically, but web servers typically expect the root file to be called `index.html`. + +You can link to individual headings with `#` fragments. +For example, `mdbook.md#text-and-paragraphs` would link to the [Text and Paragraphs](#text-and-paragraphs) section above. +The ID is created by transforming the heading such as converting to lowercase and replacing spaces with dashes. +You can click on any heading and look at the URL in your browser to see what the fragment looks like. + +## Images + +Including images is simply a matter of including a link to them, much like in the _Links_ section above. The following markdown +includes the Rust logo SVG image found in the `images` directory at the same level as this file: + +```markdown +![The Rust Logo](images/rust-logo-blk.svg) +``` + +Produces the following HTML when built with mdBook: + +```html +<p><img src="images/rust-logo-blk.svg" alt="The Rust Logo" /></p> +``` + +Which, of course displays the image like so: + +![The Rust Logo](images/rust-logo-blk.svg) + +## Extensions + +mdBook has several extensions beyond the standard CommonMark specification. + +### Strikethrough + +Text may be rendered with a horizontal line through the center by wrapping the +text with two tilde characters on each side: + +```text +An example of ~~strikethrough text~~. +``` + +This example will render as: + +> An example of ~~strikethrough text~~. + +This follows the [GitHub Strikethrough extension][strikethrough]. + +### Footnotes + +A footnote generates a small numbered link in the text which when clicked +takes the reader to the footnote text at the bottom of the item. The footnote +label is written similarly to a link reference with a caret at the front. The +footnote text is written like a link reference definition, with the text +following the label. Example: + +```text +This is an example of a footnote[^note]. + +[^note]: This text is the contents of the footnote, which will be rendered + towards the bottom. +``` + +This example will render as: + +> This is an example of a footnote[^note]. +> +> [^note]: This text is the contents of the footnote, which will be rendered +> towards the bottom. + +The footnotes are automatically numbered based on the order the footnotes are +written. + +### Tables + +Tables can be written using pipes and dashes to draw the rows and columns of +the table. These will be translated to HTML table matching the shape. Example: + +```text +| Header1 | Header2 | +|---------|---------| +| abc | def | +``` + +This example will render similarly to this: + +| Header1 | Header2 | +|---------|---------| +| abc | def | + +See the specification for the [GitHub Tables extension][tables] for more +details on the exact syntax supported. + +### Task lists + +Task lists can be used as a checklist of items that have been completed. +Example: + +```md +- [x] Complete task +- [ ] Incomplete task +``` + +This will render as: + +> - [x] Complete task +> - [ ] Incomplete task + +See the specification for the [task list extension] for more details. + +### Smart punctuation + +Some ASCII punctuation sequences will be automatically turned into fancy Unicode +characters: + +| ASCII sequence | Unicode | +|----------------|---------| +| `--` | – | +| `---` | — | +| `...` | … | +| `"` | “ or ”, depending on context | +| `'` | ‘ or ’, depending on context | + +So, no need to manually enter those Unicode characters! + +This feature is disabled by default. +To enable it, see the [`output.html.curly-quotes`] config option. + +[strikethrough]: https://github.github.com/gfm/#strikethrough-extension- +[tables]: https://github.github.com/gfm/#tables-extension- +[task list extension]: https://github.github.com/gfm/#task-list-items-extension- +[`output.html.curly-quotes`]: configuration/renderers.md#html-renderer-options diff --git a/website/doc/es/src/format/mathjax.md b/website/doc/es/src/format/mathjax.md new file mode 100644 index 00000000..3dd79215 --- /dev/null +++ b/website/doc/es/src/format/mathjax.md @@ -0,0 +1,43 @@ +# MathJax Support + +mdBook has optional support for math equations through +[MathJax](https://www.mathjax.org/). + +To enable MathJax, you need to add the `mathjax-support` key to your `book.toml` +under the `output.html` section. + +```toml +[output.html] +mathjax-support = true +``` + +>**Note:** The usual delimiters MathJax uses are not yet supported. You can't +currently use `$$ ... $$` as delimiters and the `\[ ... \]` delimiters need an +extra backslash to work. Hopefully this limitation will be lifted soon. + +>**Note:** When you use double backslashes in MathJax blocks (for example in +> commands such as `\begin{cases} \frac 1 2 \\ \frac 3 4 \end{cases}`) you need +> to add _two extra_ backslashes (e.g., `\begin{cases} \frac 1 2 \\\\ \frac 3 4 +> \end{cases}`). + + +### Inline equations +Inline equations are delimited by `\\(` and `\\)`. So for example, to render the +following inline equation \\( \int x dx = \frac{x^2}{2} + C \\) you would write +the following: +``` +\\( \int x dx = \frac{x^2}{2} + C \\) +``` + +### Block equations +Block equations are delimited by `\\[` and `\\]`. To render the following +equation + +\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] + + +you would write: + +```bash +\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] +``` diff --git a/website/doc/es/src/format/mdbook.md b/website/doc/es/src/format/mdbook.md new file mode 100644 index 00000000..62e89843 --- /dev/null +++ b/website/doc/es/src/format/mdbook.md @@ -0,0 +1,276 @@ +# mdBook-specific features + +## Hiding code lines + +There is a feature in mdBook that lets you hide code lines by prepending them +with a `#` [like you would with Rustdoc][rustdoc-hide]. +This currently only works with Rust language code blocks. + +[rustdoc-hide]: https://doc.rust-lang.org/stable/rustdoc/documentation-tests.html#hiding-portions-of-the-example + +```bash +# fn main() { + let x = 5; + let y = 6; + + println!("{}", x + y); +# } +``` + +Will render as + +```rust +# fn main() { + let x = 5; + let y = 6; + + println!("{}", x + y); +# } +``` + +The code block has an eyeball icon (<i class="fa fa-eye"></i>) which will toggle the visibility of the hidden lines. + +## Rust Playground + +Rust language code blocks will automatically get a play button (<i class="fa fa-play"></i>) which will execute the code and display the output just below the code block. +This works by sending the code to the [Rust Playground]. + +```rust +println!("Hello, World!"); +``` + +If there is no `main` function, then the code is automatically wrapped inside one. + +If you wish to disable the play button for a code block, you can include the `noplayground` option on the code block like this: + +~~~markdown +```rust,noplayground +let mut name = String::new(); +std::io::stdin().read_line(&mut name).expect("failed to read line"); +println!("Hello {}!", name); +``` +~~~ + +Or, if you wish to disable the play button for all code blocks in your book, you can write the config to the `book.toml` like this. + +```toml +[output.html.playground] +runnable = false +``` + +## Rust code block attributes + +Additional attributes can be included in Rust code blocks with comma, space, or tab-separated terms just after the language term. For example: + +~~~markdown +```rust,ignore +# This example won't be tested. +panic!("oops!"); +``` +~~~ + +These are particularly important when using [`mdbook test`] to test Rust examples. +These use the same attributes as [rustdoc attributes], with a few additions: + +* `editable` — Enables the [editor]. +* `noplayground` — Removes the play button, but will still be tested. +* `mdbook-runnable` — Forces the play button to be displayed. + This is intended to be combined with the `ignore` attribute for examples that should not be tested, but you want to allow the reader to run. +* `ignore` — Will not be tested and no play button is shown, but it is still highlighted as Rust syntax. +* `should_panic` — When executed, it should produce a panic. +* `no_run` — The code is compiled when tested, but it is not run. + The play button is also not shown. +* `compile_fail` — The code should fail to compile. +* `edition2015`, `edition2018`, `edition2021` — Forces the use of a specific Rust edition. + See [`rust.edition`] to set this globally. + +[`mdbook test`]: ../cli/test.md +[rustdoc attributes]: https://doc.rust-lang.org/rustdoc/documentation-tests.html#attributes +[editor]: theme/editor.md +[`rust.edition`]: configuration/general.md#rust-options + +## Including files + +With the following syntax, you can include files into your book: + +```hbs +\{{#include file.rs}} +``` + +The path to the file has to be relative from the current source file. + +mdBook will interpret included files as Markdown. Since the include command +is usually used for inserting code snippets and examples, you will often +wrap the command with ```` ``` ```` to display the file contents without +interpreting them. + +````hbs +``` +\{{#include file.rs}} +``` +```` + +## Including portions of a file +Often you only need a specific part of the file, e.g. relevant lines for an +example. We support four different modes of partial includes: + +```hbs +\{{#include file.rs:2}} +\{{#include file.rs::10}} +\{{#include file.rs:2:}} +\{{#include file.rs:2:10}} +``` + +The first command only includes the second line from file `file.rs`. The second +command includes all lines up to line 10, i.e. the lines from 11 till the end of +the file are omitted. The third command includes all lines from line 2, i.e. the +first line is omitted. The last command includes the excerpt of `file.rs` +consisting of lines 2 to 10. + +To avoid breaking your book when modifying included files, you can also +include a specific section using anchors instead of line numbers. +An anchor is a pair of matching lines. The line beginning an anchor must +match the regex `ANCHOR:\s*[\w_-]+` and similarly the ending line must match +the regex `ANCHOR_END:\s*[\w_-]+`. This allows you to put anchors in +any kind of commented line. + +Consider the following file to include: +```rs +/* ANCHOR: all */ + +// ANCHOR: component +struct Paddle { + hello: f32, +} +// ANCHOR_END: component + +////////// ANCHOR: system +impl System for MySystem { ... } +////////// ANCHOR_END: system + +/* ANCHOR_END: all */ +``` + +Then in the book, all you have to do is: +````hbs +Here is a component: +```rust,no_run,noplayground +\{{#include file.rs:component}} +``` + +Here is a system: +```rust,no_run,noplayground +\{{#include file.rs:system}} +``` + +This is the full file. +```rust,no_run,noplayground +\{{#include file.rs:all}} +``` +```` + +Lines containing anchor patterns inside the included anchor are ignored. + +## Including a file but initially hiding all except specified lines + +The `rustdoc_include` helper is for including code from external Rust files that contain complete +examples, but only initially showing particular lines specified with line numbers or anchors in the +same way as with `include`. + +The lines not in the line number range or between the anchors will still be included, but they will +be prefaced with `#`. This way, a reader can expand the snippet to see the complete example, and +Rustdoc will use the complete example when you run `mdbook test`. + +For example, consider a file named `file.rs` that contains this Rust program: + +```rust +fn main() { + let x = add_one(2); + assert_eq!(x, 3); +} + +fn add_one(num: i32) -> i32 { + num + 1 +} +``` + +We can include a snippet that initially shows only line 2 by using this syntax: + +````hbs +To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: + +```rust +\{{#rustdoc_include file.rs:2}} +``` +```` + +This would have the same effect as if we had manually inserted the code and hidden all but line 2 +using `#`: + +````hbs +To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: + +```rust +# fn main() { + let x = add_one(2); +# assert_eq!(x, 3); +# } +# +# fn add_one(num: i32) -> i32 { +# num + 1 +# } +``` +```` + +That is, it looks like this (click the "expand" icon to see the rest of the file): + +```rust +# fn main() { + let x = add_one(2); +# assert_eq!(x, 3); +# } +# +# fn add_one(num: i32) -> i32 { +# num + 1 +# } +``` + +## Inserting runnable Rust files + +With the following syntax, you can insert runnable Rust files into your book: + +```hbs +\{{#playground file.rs}} +``` + +The path to the Rust file has to be relative from the current source file. + +When play is clicked, the code snippet will be sent to the [Rust Playground] to be +compiled and run. The result is sent back and displayed directly underneath the +code. + +Here is what a rendered code snippet looks like: + +{{#playground example.rs}} + +Any additional values passed after the filename will be included as attributes of the code block. +For example `\{{#playground example.rs editable}}` will create the code block like the following: + +~~~markdown +```rust,editable +# Contents of example.rs here. +``` +~~~ + +And the `editable` attribute will enable the [editor] as described at [Rust code block attributes](#rust-code-block-attributes). + +[Rust Playground]: https://play.rust-lang.org/ + +## Controlling page \<title\> + +A chapter can set a \<title\> that is different from its entry in the table of +contents (sidebar) by including a `\{{#title ...}}` near the top of the page. + +```hbs +\{{#title My Title}} +``` diff --git a/website/doc/es/src/format/summary.md b/website/doc/es/src/format/summary.md new file mode 100644 index 00000000..0e138529 --- /dev/null +++ b/website/doc/es/src/format/summary.md @@ -0,0 +1,99 @@ +# SUMMARY.md + +The summary file is used by mdBook to know what chapters to include, in what +order they should appear, what their hierarchy is and where the source files +are. Without this file, there is no book. + +This markdown file must be named `SUMMARY.md`. Its formatting +is very strict and must follow the structure outlined below to allow for easy +parsing. Any element not specified below, be it formatting or textual, is likely +to be ignored at best, or may cause an error when attempting to build the book. + +### Structure + +1. ***Title*** - While optional, it's common practice to begin with a title, generally <code + class="language-markdown"># Summary</code>. This is ignored by the parser however, and + can be omitted. + ```markdown + # Summary + ``` + +1. ***Prefix Chapter*** - Before the main numbered chapters, prefix chapters can be added + that will not be numbered. This is useful for forewords, + introductions, etc. There are, however, some constraints. Prefix chapters cannot be + nested; they should all be on the root level. And you cannot add + prefix chapters once you have added numbered chapters. + ```markdown + [A Prefix Chapter](relative/path/to/markdown.md) + + - [First Chapter](relative/path/to/markdown2.md) + ``` + +1. ***Part Title*** - Headers can be used as a title for the following numbered + chapters. This can be used to logically separate different sections + of the book. The title is rendered as unclickable text. + Titles are optional, and the numbered chapters can be broken into as many + parts as desired. + ```markdown + # My Part Title + + - [First Chapter](relative/path/to/markdown.md) + ``` + +1. ***Numbered Chapter*** - Numbered chapters outline the main content of the book + and can be nested, resulting in a nice hierarchy + (chapters, sub-chapters, etc.). + ```markdown + # Title of Part + + - [First Chapter](relative/path/to/markdown.md) + - [Second Chapter](relative/path/to/markdown2.md) + - [Sub Chapter](relative/path/to/markdown3.md) + + # Title of Another Part + + - [Another Chapter](relative/path/to/markdown4.md) + ``` + Numbered chapters can be denoted with either `-` or `*` (do not mix delimiters). + +1. ***Suffix Chapter*** - Like prefix chapters, suffix chapters are unnumbered, but they come after + numbered chapters. + ```markdown + - [Last Chapter](relative/path/to/markdown.md) + + [Title of Suffix Chapter](relative/path/to/markdown2.md) + ``` + +1. ***Draft chapters*** - Draft chapters are chapters without a file and thus content. + The purpose of a draft chapter is to signal future chapters still to be written. + Or when still laying out the structure of the book to avoid creating the files + while you are still changing the structure of the book a lot. + Draft chapters will be rendered in the HTML renderer as disabled links in the table + of contents, as you can see for the next chapter in the table of contents on the left. + Draft chapters are written like normal chapters but without writing the path to the file. + ```markdown + - [Draft Chapter]() + ``` + +1. ***Separators*** - Separators can be added before, in between, and after any other element. They result + in an HTML rendered line in the built table of contents. A separator is + a line containing exclusively dashes and at least three of them: `---`. + ```markdown + # My Part Title + + [A Prefix Chapter](relative/path/to/markdown.md) + + --- + + - [First Chapter](relative/path/to/markdown2.md) + ``` + + +### Example + +Below is the markdown source for the `SUMMARY.md` for this guide, with the resulting table +of contents as rendered to the left. + +```markdown +{{#include ../SUMMARY.md}} +``` diff --git a/website/doc/es/src/format/theme/README.md b/website/doc/es/src/format/theme/README.md new file mode 100644 index 00000000..4a776e60 --- /dev/null +++ b/website/doc/es/src/format/theme/README.md @@ -0,0 +1,50 @@ +# Theme + +The default renderer uses a [handlebars](http://handlebarsjs.com/) template to +render your markdown files and comes with a default theme included in the mdBook +binary. + +The theme is totally customizable, you can selectively replace every file from +the theme by your own by adding a `theme` directory next to `src` folder in your +project root. Create a new file with the name of the file you want to override +and now that file will be used instead of the default file. + +Here are the files you can override: + +- **_index.hbs_** is the handlebars template. +- **_head.hbs_** is appended to the HTML `<head>` section. +- **_header.hbs_** content is appended on top of every book page. +- **_css/_** contains the CSS files for styling the book. + - **_css/chrome.css_** is for UI elements. + - **_css/general.css_** is the base styles. + - **_css/print.css_** is the style for printer output. + - **_css/variables.css_** contains variables used in other CSS files. +- **_book.js_** is mostly used to add client side functionality, like hiding / + un-hiding the sidebar, changing the theme, ... +- **_highlight.js_** is the JavaScript that is used to highlight code snippets, + you should not need to modify this. +- **_highlight.css_** is the theme used for the code highlighting. +- **_favicon.svg_** and **_favicon.png_** the favicon that will be used. The SVG + version is used by [newer browsers]. + +Generally, when you want to tweak the theme, you don't need to override all the +files. If you only need changes in the stylesheet, there is no point in +overriding all the other files. Because custom files take precedence over +built-in ones, they will not get updated with new fixes / features. + +**Note:** When you override a file, it is possible that you break some +functionality. Therefore I recommend to use the file from the default theme as +template and only add / modify what you need. You can copy the default theme +into your source directory automatically by using `mdbook init --theme` and just +remove the files you don't want to override. + +`mdbook init --theme` will not create every file listed above. +Some files, such as `head.hbs`, do not have built-in equivalents. +Just create the file if you need it. + +If you completely replace all built-in themes, be sure to also set +[`output.html.preferred-dark-theme`] in the config, which defaults to the +built-in `navy` theme. + +[`output.html.preferred-dark-theme`]: ../configuration/renderers.md#html-renderer-options +[newer browsers]: https://caniuse.com/#feat=link-icon-svg diff --git a/website/doc/es/src/format/theme/editor.md b/website/doc/es/src/format/theme/editor.md new file mode 100644 index 00000000..9294dd44 --- /dev/null +++ b/website/doc/es/src/format/theme/editor.md @@ -0,0 +1,48 @@ +# Editor + +In addition to providing runnable code playgrounds, mdBook optionally allows them +to be editable. In order to enable editable code blocks, the following needs to +be added to the ***book.toml***: + +```toml +[output.html.playground] +editable = true +``` + +To make a specific block available for editing, the attribute `editable` needs +to be added to it: + +~~~markdown +```rust,editable +fn main() { + let number = 5; + print!("{}", number); +} +``` +~~~ + +The above will result in this editable playground: + +```rust,editable +fn main() { + let number = 5; + print!("{}", number); +} +``` + +Note the new `Undo Changes` button in the editable playgrounds. + +## Customizing the Editor + +By default, the editor is the [Ace](https://ace.c9.io/) editor, but, if desired, +the functionality may be overridden by providing a different folder: + +```toml +[output.html.playground] +editable = true +editor = "/path/to/editor" +``` + +Note that for the editor changes to function correctly, the `book.js` inside of +the `theme` folder will need to be overridden as it has some couplings with the +default Ace editor. diff --git a/website/doc/es/src/format/theme/index-hbs.md b/website/doc/es/src/format/theme/index-hbs.md new file mode 100644 index 00000000..e5331dcc --- /dev/null +++ b/website/doc/es/src/format/theme/index-hbs.md @@ -0,0 +1,101 @@ +# index.hbs + +`index.hbs` is the handlebars template that is used to render the book. The +markdown files are processed to html and then injected in that template. + +If you want to change the layout or style of your book, chances are that you +will have to modify this template a little bit. Here is what you need to know. + +## Data + +A lot of data is exposed to the handlebars template with the "context". In the +handlebars template you can access this information by using + +```handlebars +{{name_of_property}} +``` + +Here is a list of the properties that are exposed: + +- ***language*** Language of the book in the form `en`, as specified in `book.toml` (if not specified, defaults to `en`). To use in <code + class="language-html">\<html lang="{{ language }}"></code> for example. +- ***title*** Title used for the current page. This is identical to `{{ chapter_title }} - {{ book_title }}` unless `book_title` is not set in which case it just defaults to the `chapter_title`. +- ***book_title*** Title of the book, as specified in `book.toml` +- ***chapter_title*** Title of the current chapter, as listed in `SUMMARY.md` + +- ***path*** Relative path to the original markdown file from the source + directory +- ***content*** This is the rendered markdown. +- ***path_to_root*** This is a path containing exclusively `../`'s that points + to the root of the book from the current file. Since the original directory + structure is maintained, it is useful to prepend relative links with this + `path_to_root`. + +- ***chapters*** Is an array of dictionaries of the form + ```json + {"section": "1.2.1", "name": "name of this chapter", "path": "dir/markdown.md"} + ``` + containing all the chapters of the book. It is used for example to construct + the table of contents (sidebar). + +## Handlebars Helpers + +In addition to the properties you can access, there are some handlebars helpers +at your disposal. + +### 1. toc + +The toc helper is used like this + +```handlebars +{{#toc}}{{/toc}} +``` + +and outputs something that looks like this, depending on the structure of your +book + +```html +<ul class="chapter"> + <li><a href="link/to/file.html">Some chapter</a></li> + <li> + <ul class="section"> + <li><a href="link/to/other_file.html">Some other Chapter</a></li> + </ul> + </li> +</ul> +``` + +If you would like to make a toc with another structure, you have access to the +chapters property containing all the data. The only limitation at the moment +is that you would have to do it with JavaScript instead of with a handlebars +helper. + +```html +<script> +var chapters = {{chapters}}; +// Processing here +</script> +``` + +### 2. previous / next + +The previous and next helpers expose a `link` and `name` property to the +previous and next chapters. + +They are used like this + +```handlebars +{{#previous}} + <a href="{{link}}" class="nav-chapters previous"> + <i class="fa fa-angle-left"></i> + </a> +{{/previous}} +``` + +The inner html will only be rendered if the previous / next chapter exists. +Of course the inner html can be changed to your liking. + +------ + +*If you would like other properties or helpers exposed, please [create a new +issue](https://github.com/rust-lang/mdBook/issues)* diff --git a/website/doc/es/src/format/theme/syntax-highlighting.md b/website/doc/es/src/format/theme/syntax-highlighting.md new file mode 100644 index 00000000..f57540f0 --- /dev/null +++ b/website/doc/es/src/format/theme/syntax-highlighting.md @@ -0,0 +1,121 @@ +# Syntax Highlighting + +mdBook uses [Highlight.js](https://highlightjs.org) with a custom theme +for syntax highlighting. + +Automatic language detection has been turned off, so you will probably want to +specify the programming language you use like this: + +~~~markdown +```rust +fn main() { + // Some code +} +``` +~~~ + +## Supported languages + +These languages are supported by default, but you can add more by supplying +your own `highlight.js` file: + +- apache +- armasm +- bash +- c +- coffeescript +- cpp +- csharp +- css +- d +- diff +- go +- handlebars +- haskell +- http +- ini +- java +- javascript +- json +- julia +- kotlin +- less +- lua +- makefile +- markdown +- nginx +- objectivec +- perl +- php +- plaintext +- properties +- python +- r +- ruby +- rust +- scala +- scss +- shell +- sql +- swift +- typescript +- x86asm +- xml +- yaml + +## Custom theme +Like the rest of the theme, the files used for syntax highlighting can be +overridden with your own. + +- ***highlight.js*** normally you shouldn't have to overwrite this file, unless + you want to use a more recent version. +- ***highlight.css*** theme used by highlight.js for syntax highlighting. + +If you want to use another theme for `highlight.js` download it from their +website, or make it yourself, rename it to `highlight.css` and put it in +the `theme` folder of your book. + +Now your theme will be used instead of the default theme. + +## Hiding code lines + +There is a feature in mdBook that lets you hide code lines by prepending them +with a `#`. + + +```bash +# fn main() { + let x = 5; + let y = 6; + + println!("{}", x + y); +# } +``` + +Will render as + +```rust +# fn main() { + let x = 5; + let y = 7; + + println!("{}", x + y); +# } +``` + +**At the moment, this only works for code examples that are annotated with +`rust`. Because it would collide with semantics of some programming languages. +In the future, we want to make this configurable through the `book.toml` so that +everyone can benefit from it.** + + +## Improve default theme + +If you think the default theme doesn't look quite right for a specific language, +or could be improved, feel free to [submit a new +issue](https://github.com/rust-lang/mdBook/issues) explaining what you +have in mind and I will take a look at it. + +You could also create a pull-request with the proposed improvements. + +Overall the theme should be light and sober, without too many flashy colors. diff --git a/website/doc/es/src/guide/README.md b/website/doc/es/src/guide/README.md new file mode 100644 index 00000000..90deb10e --- /dev/null +++ b/website/doc/es/src/guide/README.md @@ -0,0 +1,7 @@ +# User Guide + +This user guide provides an introduction to basic concepts of using mdBook. + +- [Installation](installation.md) +- [Reading Books](reading.md) +- [Creating a Book](creating.md) diff --git a/website/doc/es/src/guide/creating.md b/website/doc/es/src/guide/creating.md new file mode 100644 index 00000000..f68a8c60 --- /dev/null +++ b/website/doc/es/src/guide/creating.md @@ -0,0 +1,109 @@ +# Creating a Book + +Once you have the `mdbook` CLI tool installed, you can use it to create and render a book. + +## Initializing a book + +The `mdbook init` command will create a new directory containing an empty book for you to get started. +Give it the name of the directory that you want to create: + +```sh +mdbook init my-first-book +``` + +It will ask a few questions before generating the book. +After answering the questions, you can change the current directory into the new book: + +```sh +cd my-first-book +``` + +There are several ways to render a book, but one of the easiest methods is to use the `serve` command, which will build your book and start a local webserver: + +```sh +mdbook serve --open +``` + +The `--open` option will open your default web browser to view your new book. +You can leave the server running even while you edit the content of the book, and `mdbook` will automatically rebuild the output *and* automatically refresh your web browser. + +Check out the [CLI Guide](../cli/index.html) for more information about other `mdbook` commands and CLI options. + +## Anatomy of a book + +A book is built from several files which define the settings and layout of the book. + +### `book.toml` + +In the root of your book, there is a `book.toml` file which contains settings for describing how to build your book. +This is written in the [TOML markup language](https://toml.io/). +The default settings are usually good enough to get you started. +When you are interested in exploring more features and options that mdBook provides, check out the [Configuration chapter](../format/configuration/index.html) for more details. + +A very basic `book.toml` can be as simple as this: + +```toml +[book] +title = "My First Book" +``` + +### `SUMMARY.md` + +The next major part of a book is the summary file located at `src/SUMMARY.md`. +This file contains a list of all the chapters in the book. +Before a chapter can be viewed, it must be added to this list. + +Here's a basic summary file with a few chapters: + +```md +# Summary + +[Introduction](README.md) + +- [My First Chapter](my-first-chapter.md) +- [Nested example](nested/README.md) + - [Sub-chapter](nested/sub-chapter.md) +``` + +Try opening up `src/SUMMARY.md` in your editor and adding a few chapters. +If any of the chapter files do not exist, `mdbook` will automatically create them for you. + +For more details on other formatting options for the summary file, check out the [Summary chapter](../format/summary.md). + +### Source files + +The content of your book is all contained in the `src` directory. +Each chapter is a separate Markdown file. +Typically, each chapter starts with a level 1 heading with the title of the chapter. + +```md +# My First Chapter + +Fill out your content here. +``` + +The precise layout of the files is up to you. +The organization of the files will correspond to the HTML files generated, so keep in mind that the file layout is part of the URL of each chapter. + +While the `mdbook serve` command is running, you can open any of the chapter files and start editing them. +Each time you save the file, `mdbook` will rebuild the book and refresh your web browser. + +Check out the [Markdown chapter](../format/markdown.md) for more information on formatting the content of your chapters. + +All other files in the `src` directory will be included in the output. +So if you have images or other static files, just include them somewhere in the `src` directory. + +## Publishing a book + +Once you've written your book, you may want to host it somewhere for others to view. +The first step is to build the output of the book. +This can be done with the `mdbook build` command in the same directory where the `book.toml` file is located: + +```sh +mdbook build +``` + +This will generate a directory named `book` which contains the HTML content of your book. +You can then place this directory on any web server to host it. + +For more information about publishing and deploying, check out the [Continuous Integration chapter](../continuous-integration.md) for more. \ No newline at end of file diff --git a/website/doc/es/src/guide/installation.md b/website/doc/es/src/guide/installation.md new file mode 100644 index 00000000..128b1047 --- /dev/null +++ b/website/doc/es/src/guide/installation.md @@ -0,0 +1,52 @@ +# Installation + +There are multiple ways to install the mdBook CLI tool. +Choose any one of the methods below that best suit your needs. +If you are installing mdBook for automatic deployment, check out the [continuous integration] chapter for more examples on how to install. + +[continuous integration]: ../continuous-integration.md + +## Pre-compiled binaries + +Executable binaries are available for download on the [GitHub Releases page][releases]. +Download the binary for your platform (Windows, macOS, or Linux) and extract the archive. +The archive contains an `mdbook` executable which you can run to build your books. + +To make it easier to run, put the path to the binary into your `PATH`. + +[releases]: https://github.com/rust-lang/mdBook/releases + +## Build from source using Rust + +To build the `mdbook` executable from source, you will first need to install Rust and Cargo. +Follow the instructions on the [Rust installation page]. +mdBook currently requires at least Rust version 1.54. + +Once you have installed Rust, the following command can be used to build and install mdBook: + +```sh +cargo install mdbook +``` + +This will automatically download mdBook from [crates.io], build it, and install it in Cargo's global binary directory (`~/.cargo/bin/` by default). + +To uninstall, run the command `cargo uninstall mdbook`. + +[Rust installation page]: https://www.rust-lang.org/tools/install +[crates.io]: https://crates.io/ + +### Installing the latest master version + +The version published to crates.io will ever so slightly be behind the version hosted on GitHub. +If you need the latest version you can build the git version of mdBook yourself. +Cargo makes this ***super easy***! + +```sh +cargo install --git https://github.com/rust-lang/mdBook.git mdbook +``` + +Again, make sure to add the Cargo bin directory to your `PATH`. + +If you are interested in making modifications to mdBook itself, check out the [Contributing Guide] for more information. + +[Contributing Guide]: https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md diff --git a/website/doc/es/src/guide/reading.md b/website/doc/es/src/guide/reading.md new file mode 100644 index 00000000..cab3a865 --- /dev/null +++ b/website/doc/es/src/guide/reading.md @@ -0,0 +1,74 @@ +# Reading Books + +This chapter gives an introduction on how to interact with a book produced by mdBook. +This assumes you are reading an HTML book. +The options and formatting will be different for other output formats such as PDF. + +A book is organized into *chapters*. +Each chapter is a separate page. +Chapters can be nested into a hierarchy of sub-chapters. +Typically, each chapter will be organized into a series of *headings* to subdivide a chapter. + +## Navigation + +There are several methods for navigating through the chapters of a book. + +The **sidebar** on the left provides a list of all chapters. +Clicking on any of the chapter titles will load that page. + +The sidebar may not automatically appear if the window is too narrow, particularly on mobile displays. +In that situation, the menu icon (three horizontal bars) at the top-left of the page can be pressed to open and close the sidebar. + +The **arrow buttons** at the bottom of the page can be used to navigate to the previous or the next chapter. + +The **left and right arrow keys** on the keyboard can be used to navigate to the previous or the next chapter. + +## Top menu bar + +The menu bar at the top of the page provides some icons for interacting with the book. +The icons displayed will depend on the settings of how the book was generated. + +| Icon | Description | +|------|-------------| +| <i class="fa fa-bars"></i> | Opens and closes the chapter listing sidebar. | +| <i class="fa fa-paint-brush"></i> | Opens a picker to choose a different color theme. | +| <i class="fa fa-search"></i> | Opens a search bar for searching within the book. | +| <i class="fa fa-print"></i> | Instructs the web browser to print the entire book. | +| <i class="fa fa-github"></i> | Opens a link to the website that hosts the source code of the book. | +| <i class="fa fa-edit"></i> | Opens a page to directly edit the source of the page you are currently reading. | + +Tapping the menu bar will scroll the page to the top. + +## Search + +Each book has a built-in search system. +Pressing the search icon (<i class="fa fa-search"></i>) in the menu bar, or pressing the `S` key on the keyboard will open an input box for entering search terms. +Typing some terms will show matching chapters and sections in real time. + +Clicking any of the results will jump to that section. +The up and down arrow keys can be used to navigate the results, and enter will open the highlighted section. + +After loading a search result, the matching search terms will be highlighted in the text. +Clicking a highlighted word or pressing the `Esc` key will remove the highlighting. + +## Code blocks + +mdBook books are often used for programming projects, and thus support highlighting code blocks and samples. +Code blocks may contain several different icons for interacting with them: + +| Icon | Description | +|------|-------------| +| <i class="fa fa-copy"></i> | Copies the code block into your local clipboard, to allow pasting into another application. | +| <i class="fa fa-play"></i> | For Rust code examples, this will execute the sample code and display the compiler output just below the example (see [playground]). | +| <i class="fa fa-eye"></i> | For Rust code examples, this will toggle visibility of "hidden" lines. Sometimes, larger examples will hide lines which are not particularly relevant to what is being illustrated (see [hiding code lines]). | +| <i class="fa fa-history"></i> | For [editable code examples][editor], this will undo any changes you have made. | + +Here's an example: + +```rust +println!("Hello, World!"); +``` + +[editor]: ../format/theme/editor.md +[playground]: ../format/mdbook.md#rust-playground +[hiding code lines]: ../format/mdbook.md#hiding-code-lines diff --git a/website/doc/es/src/misc/contributors.md b/website/doc/es/src/misc/contributors.md new file mode 100644 index 00000000..362a21fe --- /dev/null +++ b/website/doc/es/src/misc/contributors.md @@ -0,0 +1,24 @@ +# Contributors + +Here is a list of the contributors who have helped improving mdBook. Big +shout-out to them! + +- [mdinger](https://github.com/mdinger) +- Kevin ([kbknapp](https://github.com/kbknapp)) +- Steve Klabnik ([steveklabnik](https://github.com/steveklabnik)) +- Adam Solove ([asolove](https://github.com/asolove)) +- Wayne Nilsen ([waynenilsen](https://github.com/waynenilsen)) +- [funnkill](https://github.com/funkill) +- Fu Gangqiang ([FuGangqiang](https://github.com/FuGangqiang)) +- [Michael-F-Bryan](https://github.com/Michael-F-Bryan) +- Chris Spiegel ([cspiegel](https://github.com/cspiegel)) +- [projektir](https://github.com/projektir) +- [Phaiax](https://github.com/Phaiax) +- Matt Ickstadt ([mattico](https://github.com/mattico)) +- Weihang Lo ([weihanglo](https://github.com/weihanglo)) +- Avision Ho ([avisionh](https://github.com/avisionh)) +- Vivek Akupatni ([apatniv](https://github.com/apatniv)) +- Eric Huss ([ehuss](https://github.com/ehuss)) +- Josh Rotenberg ([joshrotenberg](https://github.com/joshrotenberg)) + +If you feel you're missing from this list, feel free to add yourself in a PR. diff --git a/website/doc/es/theme/book.js b/website/doc/es/theme/book.js new file mode 100644 index 00000000..c4ab6988 --- /dev/null +++ b/website/doc/es/theme/book.js @@ -0,0 +1,679 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else { + return code_block.textContent; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on http://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + Array + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = "<button class=\"fa fa-eye\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'fa fa-copy clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = '<i class=\"tooltiptext\"></i>'; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'fa fa-copy clip-button'; + copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>'; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var html = document.querySelector("html"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + html.classList.remove('sidebar-hidden') + html.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + + function hideSidebar() { + html.classList.remove('sidebar-visible') + html.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (html.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (html.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + html.classList.add('sidebar-resizing'); + } + function resize(e) { + var viewportOffset = sidebar.getBoundingClientRect(); + var pos = (e.clientX - sidebar.offsetLeft - viewportOffset.left); + if (pos < 20) { + hideSidebar(); + } else { + if (html.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + html.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); + + // Try to show the full sidebar + if (html.classList.contains("sidebar-visible")) { + var realHeight = sidebar.querySelector(".sidebar-scrollbox").scrollHeight; + document.getElementById("page-wrapper").style.minHeight = realHeight + 80 + "px"; + } +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + break; + case 'ArrowLeft': + e.preventDefault(); + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'fa fa-copy clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'fa fa-copy tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + menu.classList.remove('bordered'); + document.addEventListener('scroll', function () { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + }, { passive: true }); + })(); +})(); diff --git a/website/doc/es/theme/css/chrome.css b/website/doc/es/theme/css/chrome.css new file mode 100644 index 00000000..7f9dc35d --- /dev/null +++ b/website/doc/es/theme/css/chrome.css @@ -0,0 +1,552 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +@import 'variables.css'; + +::-webkit-scrollbar { + background: var(--bg); +} +::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +#mdbook { + position: relative; + scrollbar-color: var(--scrollbar) var(--bg); +} +#mdbook .content { + position: relative; +} + +#mdbook #searchresults a, +#mdbook .content a:link, +#mdbook a:visited, +#mdbook a > .hljs { + color: var(--links); +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-bottom-color: var(--bg); + border-bottom-width: 1px; + border-bottom-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-bottom-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +#mdbook .icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +#mdbook .icon-button i { + margin: 0; +} + +#mdbook .right-buttons { + margin: 0 15px; +} +#mdbook .right-buttons a { + text-decoration: none; +} + +#mdbook .left-buttons { + display: flex; + margin: 0 5px; +} +.no-js #mdbook .left-buttons { + display: none; +} + +#mdbook .menu-title { + display: inline-block; + font-weight: 200; + font-size: 1.8rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js #mdbook .menu-title { + cursor: pointer; +} +@media only screen and (max-width: 640px) { + #mdbook .menu-title { + font-size: 1.5rem; + } +} +@media only screen and (max-width: 420px) { + #mdbook .menu-title { + font-size: 1.2rem; + } +} + +#mdbook .menu-bar, +#mdbook .menu-bar:visited, +#mdbook .nav-chapters, +#mdbook .nav-chapters:visited, +#mdbook .mobile-nav-chapters, +#mdbook .mobile-nav-chapters:visited, +#mdbook .menu-bar .icon-button, +#mdbook .menu-bar a i { + color: var(--icons); +} + +#mdbook .menu-bar i:hover, +#mdbook .menu-bar .icon-button:hover, +#mdbook .nav-chapters:hover, +#mdbook .mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +#mdbook .nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: absolute; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +#mdbook .nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +#mdbook .nav-wrapper { + margin-top: 50px; + display: none; +} + +#mdbook .mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +#mdbook .previous { + float: left; +} + +#mdbook .next { + float: right; + right: var(--page-padding); +} + +@media only screen and (max-width: 1080px) { + #mdbook .nav-wide-wrapper { display: none; } + #mdbook .nav-wrapper { display: block; } +} + +@media only screen and (max-width: 1380px) { + .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } + .sidebar-visible #mdbook .nav-wrapper { display: block; } +} + +/* Inline code */ + +#mdbook :not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +#mdbook :not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +#mdbook a:hover > .hljs { + text-decoration: underline; +} + +#mdbook pre { + position: relative; + font-size: 0.875rem; +} +#mdbook pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +#mdbook pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +#mdbook pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +#mdbook pre > .buttons i { + margin-left: 8px; +} +#mdbook pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + #mdbook pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } +} +#mdbook pre > code { + padding: 1rem; + font-size: 0.875rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +#mdbook .hljs.ace_editor { + padding: 0rem 0rem; +} + +#mdbook pre > .result { + margin-top: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +#mdbook mark { + border-radius: 2px; + padding: 0 3px 1px 3px; + margin: 0 -3px -1px -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +#mdbook mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +#mdbook .searchbar-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin: 5px auto 0px auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +#mdbook .searchresults-header { + font-weight: bold; + font-size: 1em; + padding: 18px 0 0 5px; + color: var(--searchresults-header-fg); +} + +#mdbook .searchresults-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); + border-bottom: 1px dashed var(--searchresults-border-color); +} + +#mdbook ul#searchresults { + list-style: none; + padding-left: 20px; +} +#mdbook ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +#mdbook ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +#mdbook ul#searchresults span.teaser { + display: block; + clear: both; + margin: 5px 0 0 20px; + font-size: 0.8em; +} +#mdbook ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ +#mdbook .sidebar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.js:not(.sidebar-resizing) #mdbook .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +#mdbook .sidebar code { + line-height: 2em; +} +#mdbook .sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +#mdbook .sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +.js #mdbook .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} +.sidebar-hidden #mdbook .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); +} +#mdbook .sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +#mdbook .sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +.sidebar-visible #mdbook .page-wrapper { + transform: translateX(var(--sidebar-width)); +} +@media only screen and (min-width: 620px) { + .sidebar-visible #mdbook .page-wrapper { + transform: none; + margin-left: var(--sidebar-width); + } +} + +#mdbook .chapter { + list-style: none outside none; + padding-left: 0; + line-height: 2.2em; +} + +#mdbook .chapter ol { + width: 100%; +} + +#mdbook .chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +#mdbook .chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +#mdbook .chapter li a:hover { + color: var(--sidebar-active); +} + +#mdbook .chapter li a.active { + color: var(--sidebar-active); +} + +#mdbook .chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +#mdbook .chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +#mdbook .chapter li:not(.expanded) + li > ol { + display: none; +} + +#mdbook .chapter li.chapter-item { + line-height: 1.5em; + margin-top: 0.6em; +} + +#mdbook .chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +#mdbook .spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +#mdbook .chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + #mdbook .chapter li a { padding: 5px 0; } + #mdbook .spacer { margin: 10px 0; } +} + +#mdbook .section { + list-style: none outside none; + margin: 0; + padding: 0 0 0 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +#mdbook .theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; +} +#mdbook .theme-popup .default { + color: var(--icons); +} +#mdbook .theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 10px; + line-height: 25px; + white-space: nowrap; + text-align: left; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +#mdbook .theme-popup .theme:hover { + background-color: var(--theme-hover); +} +#mdbook .theme-popup .theme:hover:first-child, +#mdbook .theme-popup .theme:hover:last-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} diff --git a/website/doc/es/theme/css/general.css b/website/doc/es/theme/css/general.css new file mode 100644 index 00000000..8ace6312 --- /dev/null +++ b/website/doc/es/theme/css/general.css @@ -0,0 +1,187 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +#mdbook { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; + overflow-x: hidden; +} + +#mdbook code { + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; +} + +/* make long words/inline code not x overflow */ +#mdbook main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +#mdbook .table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +#mdbook h1 code, +#mdbook h2 code, +#mdbook h3 code, +#mdbook h4 code, +#mdbook h5 code, +#mdbook h6 code { + font-size: unset; +} + +#mdbook .left { float: left; } +#mdbook .right { float: right; } +#mdbook .boring { opacity: 0.6; } +#mdbook .hide-boring .boring { display: none; } +#mdbook .hidden { display: none !important; } + +#mdbook h2, #mdbook h3 { margin-top: 2.5em; } +#mdbook h4, #mdbook h5 { margin-top: 2em; } + +#mdbook .header + .header h3, +#mdbook .header + .header h4, +#mdbook .header + .header h5 { + margin-top: 1em; +} + +#mdbook h1:target::before, +#mdbook h2:target::before, +#mdbook h3:target::before, +#mdbook h4:target::before, +#mdbook h5:target::before, +#mdbook h6:target::before { + display: inline-block; + content: "»"; + margin-left: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +#mdbook .page { + outline: 0; + padding: 0 var(--page-padding); + margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +#mdbook .page-wrapper { + box-sizing: border-box; +} +.js:not(.sidebar-resizing) #mdbook .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +#mdbook .content { + overflow-y: auto; + padding: 20px 5px 50px 5px; +} +#mdbook .content main { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} +#mdbook .content p { line-height: 1.45em; } +#mdbook .content ol { line-height: 1.45em; } +#mdbook .content ul { line-height: 1.45em; } +#mdbook .content a { text-decoration: none; } +#mdbook .content a:hover { text-decoration: underline; } +#mdbook .content img, .content video { max-width: 100%; } +#mdbook .content .header:link, +#mdbook .content .header:visited { + color: var(--fg); +} +#mdbook .content .header:link, +#mdbook .content .header:visited:hover { + text-decoration: none; +} + +#mdbook table { + margin: 0 auto; + border-collapse: collapse; +} +#mdbook table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +#mdbook table thead { + background: var(--table-header-bg); +} +#mdbook table thead td { + font-weight: 700; + border: none; +} +#mdbook table thead th { + padding: 3px 20px; +} +#mdbook table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +#mdbook table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +#mdbook blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-top: .1em solid var(--quote-border); + border-bottom: .1em solid var(--quote-border); +} +#mdbook blockquote p { + margin-top: 1rem; +} + +#mdbook :not(.footnote-definition) + .footnote-definition, +#mdbook .footnote-definition + :not(.footnote-definition) { + margin-top: 2em; +} +#mdbook .footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +#mdbook .footnote-definition p { + display: inline; +} + +#mdbook .tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +#mdbook .tooltipped .tooltiptext { + visibility: visible; +} + +#mdbook .chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +#mdbook .result-no-output { + font-style: italic; +} diff --git a/website/doc/es/theme/css/print.css b/website/doc/es/theme/css/print.css new file mode 100644 index 00000000..bd7c8da7 --- /dev/null +++ b/website/doc/es/theme/css/print.css @@ -0,0 +1,65 @@ +#sidebar, +#menu-bar, +#mdbook .nav-chapters, +#mdbook .mobile-nav-chapters { + display: none; +} + +#mdbook, +#page-wrapper { + margin: 0; + padding: 0; + max-width: none; + transform: none !important; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +#mdbook .page { + overflow-y: initial; +} + +#mdbook code { + background-color: #eeeeee; + border-radius: 5px; + + /* Force background to be printed in Chrome */ + -webkit-print-color-adjust: exact; +} + +#mdbook pre > .buttons { + z-index: 2; +} + +#mdbook a, +#mdbook a:visited, +#mdbook a:active, +#mdbook a:hover { + color: #4183c4; + text-decoration: none; +} + +#mdbook h1, +#mdbook h2, +#mdbook h3, +#mdbook h4, +#mdbook h5, +#mdbook h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +#mdbook pre, +#mdbook code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +#mdbook .fa { + display: none !important; +} diff --git a/website/doc/es/theme/css/variables.css b/website/doc/es/theme/css/variables.css new file mode 100644 index 00000000..7a68155a --- /dev/null +++ b/website/doc/es/theme/css/variables.css @@ -0,0 +1,253 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/website/doc/es/theme/highlight.css b/website/doc/es/theme/highlight.css new file mode 100644 index 00000000..ba57b82b --- /dev/null +++ b/website/doc/es/theme/highlight.css @@ -0,0 +1,82 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/website/doc/es/theme/highlight.js b/website/doc/es/theme/highlight.js new file mode 100644 index 00000000..180385b7 --- /dev/null +++ b/website/doc/es/theme/highlight.js @@ -0,0 +1,6 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/website/doc/es/theme/index.hbs b/website/doc/es/theme/index.hbs new file mode 100644 index 00000000..490b7ca1 --- /dev/null +++ b/website/doc/es/theme/index.hbs @@ -0,0 +1,261 @@ +<!-- Lang: {{ language }} --> +<!-- Title: {{ title }} --> +<!-- Print: {{#if print_enable}}enabled{{else}}disabled{{/if}} --> +<!-- MathJax: {{#if mathjax_support}}supported{{else}}unsupported{{/if}} --> + +<!-- mdBook --> + +<!-- Provide site root to javascript --> +<script type="text/javascript"> + var path_to_root = "{{ path_to_root }}"; + var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}"; +</script> + +<!-- Work around some values being stored in localStorage wrapped in quotes --> +<script type="text/javascript"> + try { + var theme = localStorage.getItem('mdbook-theme'); + var sidebar = localStorage.getItem('mdbook-sidebar'); + + if (theme.startsWith('"') && theme.endsWith('"')) { + localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); + } + + if (sidebar.startsWith('"') && sidebar.endsWith('"')) { + localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); + } + } catch (e) { } +</script> + +<!-- Set the theme before any content is loaded, prevents flash --> +<script type="text/javascript"> + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } + if (theme === null || theme === undefined) { theme = default_theme; } + var html = document.querySelector('html'); + html.classList.remove('no-js') + html.classList.remove('{{ default_theme }}') + html.classList.add(theme); + html.classList.add('js'); +</script> + +<!-- Hide / unhide sidebar before it is displayed --> +<script type="text/javascript"> + var html = document.querySelector('html'); + var sidebar = 'hidden'; + if (document.body.clientWidth >= 1080) { + try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } + sidebar = sidebar || 'visible'; + } + html.classList.remove('sidebar-visible'); + html.classList.add("sidebar-" + sidebar); +</script> + +<nav id="sidebar" class="sidebar" aria-label="Table of contents"> + <div class="sidebar-scrollbox"> + {{#toc}}{{/toc}} + </div> + <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> +</nav> + +<div id="page-wrapper" class="page-wrapper"> + + <div class="page"> + {{> header}} + <div id="menu-bar-hover-placeholder"></div> + <div id="menu-bar" class="menu-bar sticky bordered"> + <div class="left-buttons"> + <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> + <i class="fa fa-bars"></i> + </button> + <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> + <i class="fa fa-paint-brush"></i> + </button> + <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> + <li role="none"><button role="menuitem" class="theme" id="light">{{ theme_option "Light" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="rust">{{ theme_option "Rust" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="coal">{{ theme_option "Coal" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="navy">{{ theme_option "Navy" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="ayu">{{ theme_option "Ayu" }}</button></li> + </ul> + {{#if search_enabled}} + <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> + <i class="fa fa-search"></i> + </button> + {{/if}} + </div> + + <h1 class="menu-title">{{ book_title }}</h1> + + <div class="right-buttons"> + {{#if print_enable}} + <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book"> + <i id="print-button" class="fa fa-print"></i> + </a> + {{/if}} + {{#if git_repository_url}} + <a href="{{git_repository_url}}" title="Git repository" aria-label="Git repository"> + <i id="git-repository-button" class="fa {{git_repository_icon}}"></i> + </a> + {{/if}} + {{#if git_repository_edit_url}} + <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit"> + <i id="git-edit-button" class="fa fa-edit"></i> + </a> + {{/if}} + + </div> + </div> + + {{#if search_enabled}} + <div id="search-wrapper" class="hidden"> + <form id="searchbar-outer" class="searchbar-outer"> + <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> + </form> + <div id="searchresults-outer" class="searchresults-outer hidden"> + <div id="searchresults-header" class="searchresults-header"></div> + <ul id="searchresults"> + </ul> + </div> + </div> + {{/if}} + + <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> + <script type="text/javascript"> + document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); + document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); + Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { + link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); + }); + </script> + + <div id="content" class="content"> + <main> + {{{ content }}} + </main> + + <nav class="nav-wrapper" aria-label="Page navigation"> + <!-- Mobile navigation buttons --> + {{#previous}} + <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> + <i class="fa fa-angle-left"></i> + </a> + {{/previous}} + + {{#next}} + <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> + <i class="fa fa-angle-right"></i> + </a> + {{/next}} + + <div style="clear: both"></div> + </nav> + </div> + </div> + + <nav class="nav-wide-wrapper" aria-label="Page navigation"> + {{#previous}} + <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> + <i class="fa fa-angle-left"></i> + </a> + {{/previous}} + + {{#next}} + <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> + <i class="fa fa-angle-right"></i> + </a> + {{/next}} + </nav> + +</div> + +{{#if live_reload_endpoint}} +<!-- Livereload script (if served using the cli tool) --> +<script type="text/javascript"> + const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; + const wsAddress = wsProtocol + "//" + location.host + "/" + "{{{live_reload_endpoint}}}"; + const socket = new WebSocket(wsAddress); + socket.onmessage = function (event) { + if (event.data === "reload") { + socket.close(); + location.reload(); + } + }; + + window.onbeforeunload = function() { + socket.close(); + } +</script> +{{/if}} + +{{#if google_analytics}} +<!-- Google Analytics Tag --> +<script type="text/javascript"> + var localAddrs = ["localhost", "127.0.0.1", ""]; + + // make sure we don't activate google analytics if the developer is + // inspecting the book locally... + if (localAddrs.indexOf(document.location.hostname) === -1) { + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', '{{google_analytics}}', 'auto'); + ga('send', 'pageview'); + } +</script> +{{/if}} + +{{#if playground_line_numbers}} +<script type="text/javascript"> + window.playground_line_numbers = true; +</script> +{{/if}} + +{{#if playground_copyable}} +<script type="text/javascript"> + window.playground_copyable = true; +</script> +{{/if}} + +{{#if playground_js}} +<script src="{{ path_to_root }}ace.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}editor.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}mode-rust.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}theme-dawn.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}theme-tomorrow_night.js" type="text/javascript" charset="utf-8"></script> +{{/if}} + +{{#if search_js}} +<script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script> +{{/if}} + +<script src="{{ path_to_root }}clipboard.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}highlight.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script> + +<!-- Custom JS scripts --> +{{#each additional_js}} +<script type="text/javascript" src="{{ ../path_to_root }}{{this}}"></script> +{{/each}} + +{{#if is_print}} +{{#if mathjax_support}} +<script type="text/javascript"> +window.addEventListener('load', function() { + MathJax.Hub.Register.StartupHook('End', function() { + window.setTimeout(window.print, 100); + }); +}); +</script> +{{else}} +<script type="text/javascript"> +window.addEventListener('load', function() { + window.setTimeout(window.print, 100); +}); +</script> +{{/if}} +{{/if}} diff --git a/website/src/main.rs b/website/src/main.rs index a9736028..b59d8992 100644 --- a/website/src/main.rs +++ b/website/src/main.rs @@ -1,8 +1,14 @@ use pagetop::prelude::*; +use pagetop_mdbook::BookMapResources; +use pagetop_mdbook::MdBook; pub_const_handler!(APP_PAGETOP_WEBSITE); -mod mdbook; +include!(concat!(env!("OUT_DIR"), "/guides_en.rs")); +static GUIDES_EN: LazyStatic<BookMapResources> = LazyStatic::new(guides_en); + +include!(concat!(env!("OUT_DIR"), "/guias_es.rs")); +static GUIAS_ES: LazyStatic<BookMapResources> = LazyStatic::new(guias_es); struct PageTopWebSite; @@ -12,10 +18,12 @@ impl ModuleTrait for PageTopWebSite { } fn dependencies(&self) -> Vec<ModuleStaticRef> { - vec![ - &mdbook::MdBook, - &pagetop::base::module::homepage::DefaultHomePage, - ] + vec![&MdBook, &pagetop::base::module::homepage::DefaultHomePage] + } + + fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { + MdBook::configure_service_mdbook(cfg, "/doc/en", &GUIDES_EN); + MdBook::configure_service_mdbook(cfg, "/doc/es", &GUIAS_ES); } } diff --git a/website/src/mdbook.rs b/website/src/mdbook.rs deleted file mode 100644 index 13adc20b..00000000 --- a/website/src/mdbook.rs +++ /dev/null @@ -1,203 +0,0 @@ -use actix_web::ResponseError; -use pagetop::prelude::*; - -use static_files::Resource; - -use std::collections::HashMap; - -pub_const_handler!(MODULE_MDBOOK); - -include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); - -static MDBOOK: LazyStatic<HashMap<&'static str, Resource>> = LazyStatic::new(generate); - -pub struct MdBook; - -impl ModuleTrait for MdBook { - fn handler(&self) -> Handler { - MODULE_MDBOOK - } - - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - configure_mdbook_service(cfg, "/doc/", &MDBOOK); - } -} - -fn configure_mdbook_service( - cfg: &mut app::web::ServiceConfig, - url_root: &'static str, - book: &'static HashMap<&'static str, Resource>, -) { - let url = url_root.trim_end_matches('/'); - let url_len = url.len() + 1; - cfg.service( - app::web::scope(url) - .route( - "{tail:.*html$}", - app::web::get() - .to(move |request: app::HttpRequest| mdbook_page(request, url_len, book)), - ) - .route( - "{tail:.*$}", - app::web::get() - .to(move |request: app::HttpRequest| mdbook_resource(request, url_len, book)), - ), - ); -} - -async fn mdbook_page( - request: app::HttpRequest, - v: usize, - book: &HashMap<&'static str, Resource>, -) -> ResultPage<Markup, FatalError> { - // Remove initial "/doc/" from path: - let path = &request.path()[v..]; - - if let Some(content) = book.get(path) { - if let Ok(html) = std::str::from_utf8(content.data) { - let _lang = extract("Lang", html); - let title = match extract("Title", html) { - Some(title) => title, - _ => "Documentación", - }; - let _print = matches!(extract("Print", html), Some("enabled")); - let _mathjax = matches!(extract("MathJax", html), Some("supported")); - let beginning = { - let separator = "<!-- mdBook -->"; - match html.find(separator) { - Some(pos) => pos + separator.len(), - _ => 0, - } - }; - - Page::new() - .with_title(title) - .with_context(PageOp::AddMetadata("theme-color", "#ffffff")) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/css/variables.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/css/general.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/css/chrome.css", - ))) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/doc/css/print.css").for_media(TargetMedia::Print), - )) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/FontAwesome/css/font-awesome.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/fonts/fonts.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/highlight.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/tomorrow-night.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/doc/ayu-highlight.css", - ))) - .add_to( - "region-content", - Container::new() - .with_id("mdbook") - .with_component(Html::with(html! { (PreEscaped(&html[beginning..])) })), - ) - .render() - } else { - Err(FatalError::NotFound) - } - } else { - Err(FatalError::NotFound) - } -} - -async fn mdbook_resource( - request: app::HttpRequest, - v: usize, - book: &HashMap<&'static str, Resource>, -) -> app::HttpResponse { - // Remove initial "/doc/" from path: - let path = &request.path()[v..]; - - // From https://github.com/kilork/actix-web-static-files/blob/master/src/resource_files.rs, see - // functions respond_to(), any_match() and none_match(). - if let Some(file) = &book.get(path) { - let etag = Some(app::http::header::EntityTag::new_strong(format!( - "{:x}:{:x}", - file.data.len(), - file.modified - ))); - - let precondition_failed = !any_match(etag.as_ref(), &request); - - let not_modified = !none_match(etag.as_ref(), &request); - - let mut resp = app::HttpResponse::build(app::http::StatusCode::OK); - resp.insert_header((app::http::header::CONTENT_TYPE, file.mime_type)); - - if let Some(etag) = etag { - resp.insert_header(app::http::header::ETag(etag)); - } - - if precondition_failed { - return FatalError::PreconditionFailed.error_response(); - } else if not_modified { - return FatalError::NotModified.error_response(); - } - - resp.body(file.data) - } else { - FatalError::NotFound.error_response() - } -} - -/// Returns true if `request` has no `If-Match` header or one which matches `etag`. -fn any_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { - match request.get_header::<app::http::header::IfMatch>() { - None | Some(app::http::header::IfMatch::Any) => true, - Some(app::http::header::IfMatch::Items(ref items)) => { - if let Some(some_etag) = etag { - for item in items { - if item.strong_eq(some_etag) { - return true; - } - } - } - false - } - } -} - -/// Returns true if `request` doesn't have an `If-None-Match` header matching `req`. -fn none_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { - match request.get_header::<app::http::header::IfNoneMatch>() { - Some(app::http::header::IfNoneMatch::Any) => false, - Some(app::http::header::IfNoneMatch::Items(ref items)) => { - if let Some(some_etag) = etag { - for item in items { - if item.weak_eq(some_etag) { - return false; - } - } - } - true - } - None => true, - } -} - -fn extract(attr: &'static str, from: &'static str) -> Option<&'static str> { - let search = concat_string!("<!-- ", attr, ":"); - if let Some(ini) = from.find(&search) { - let ini = ini + search.len() + 1; - if let Some(end) = from[ini..].find("-->").map(|i| i + ini) { - let end = end - 1; - return Some(&from[ini..end]); - } - } - None -} From c0a269f0099709b8d2ac9f6e7ee868dea8932914 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 4 Aug 2022 02:54:57 +0200 Subject: [PATCH 171/853] =?UTF-8?q?Mejora=20el=20uso=20del=20nuevo=20m?= =?UTF-8?q?=C3=B3dulo=20mdBook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-mdbook/Cargo.toml | 3 + pagetop-mdbook/build.rs | 17 + pagetop-mdbook/src/lib.rs | 70 +- .../static/FontAwesome/css/font-awesome.css | 4 + .../static/FontAwesome/fonts/FontAwesome.ttf | Bin 0 -> 165548 bytes .../FontAwesome/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../FontAwesome/fonts/fontawesome-webfont.svg | 2671 +++++++++++++++++ .../FontAwesome/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes pagetop-mdbook/static/ayu-highlight.css | 78 + pagetop-mdbook/static/css/chrome.css | 552 ++++ pagetop-mdbook/static/css/general.css | 187 ++ pagetop-mdbook/static/css/print.css | 65 + pagetop-mdbook/static/css/variables.css | 253 ++ .../static/fonts/OPEN-SANS-LICENSE.txt | 202 ++ .../static/fonts/SOURCE-CODE-PRO-LICENSE.txt | 93 + pagetop-mdbook/static/fonts/fonts.css | 100 + .../open-sans-v17-all-charsets-300.woff2 | Bin 0 -> 44352 bytes ...open-sans-v17-all-charsets-300italic.woff2 | Bin 0 -> 40656 bytes .../open-sans-v17-all-charsets-600.woff2 | Bin 0 -> 44936 bytes ...open-sans-v17-all-charsets-600italic.woff2 | Bin 0 -> 42120 bytes .../open-sans-v17-all-charsets-700.woff2 | Bin 0 -> 44988 bytes ...open-sans-v17-all-charsets-700italic.woff2 | Bin 0 -> 40800 bytes .../open-sans-v17-all-charsets-800.woff2 | Bin 0 -> 44536 bytes ...open-sans-v17-all-charsets-800italic.woff2 | Bin 0 -> 40812 bytes .../open-sans-v17-all-charsets-italic.woff2 | Bin 0 -> 41076 bytes .../open-sans-v17-all-charsets-regular.woff2 | Bin 0 -> 43236 bytes ...source-code-pro-v11-all-charsets-500.woff2 | Bin 0 -> 59140 bytes pagetop-mdbook/static/highlight.css | 82 + pagetop-mdbook/static/tomorrow-night.css | 102 + pagetop-mdbook/template/book.toml | 8 + pagetop-mdbook/template/theme/book.js | 679 +++++ pagetop-mdbook/template/theme/css/chrome.css | 552 ++++ pagetop-mdbook/template/theme/css/general.css | 187 ++ pagetop-mdbook/template/theme/css/print.css | 65 + .../template/theme/css/variables.css | 253 ++ pagetop-mdbook/template/theme/highlight.css | 82 + pagetop-mdbook/template/theme/highlight.js | 6 + pagetop-mdbook/template/theme/index.hbs | 261 ++ pagetop/src/html/assets/javascript.rs | 2 +- website/src/main.rs | 5 +- 42 files changed, 6540 insertions(+), 39 deletions(-) create mode 100644 pagetop-mdbook/build.rs create mode 100644 pagetop-mdbook/static/FontAwesome/css/font-awesome.css create mode 100644 pagetop-mdbook/static/FontAwesome/fonts/FontAwesome.ttf create mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.eot create mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg create mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.ttf create mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff create mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff2 create mode 100644 pagetop-mdbook/static/ayu-highlight.css create mode 100644 pagetop-mdbook/static/css/chrome.css create mode 100644 pagetop-mdbook/static/css/general.css create mode 100644 pagetop-mdbook/static/css/print.css create mode 100644 pagetop-mdbook/static/css/variables.css create mode 100644 pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt create mode 100644 pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt create mode 100644 pagetop-mdbook/static/fonts/fonts.css create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300italic.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600italic.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700italic.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800italic.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-italic.woff2 create mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-regular.woff2 create mode 100644 pagetop-mdbook/static/fonts/source-code-pro-v11-all-charsets-500.woff2 create mode 100644 pagetop-mdbook/static/highlight.css create mode 100644 pagetop-mdbook/static/tomorrow-night.css create mode 100644 pagetop-mdbook/template/book.toml create mode 100644 pagetop-mdbook/template/theme/book.js create mode 100644 pagetop-mdbook/template/theme/css/chrome.css create mode 100644 pagetop-mdbook/template/theme/css/general.css create mode 100644 pagetop-mdbook/template/theme/css/print.css create mode 100644 pagetop-mdbook/template/theme/css/variables.css create mode 100644 pagetop-mdbook/template/theme/highlight.css create mode 100644 pagetop-mdbook/template/theme/highlight.js create mode 100644 pagetop-mdbook/template/theme/index.hbs diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml index 1b792aef..711af59b 100644 --- a/pagetop-mdbook/Cargo.toml +++ b/pagetop-mdbook/Cargo.toml @@ -17,3 +17,6 @@ license = "Apache-2.0 or MIT" pagetop = { path = "../pagetop" } static-files = "0.2.3" maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } + +[build-dependencies] +static-files = "0.2.3" diff --git a/pagetop-mdbook/build.rs b/pagetop-mdbook/build.rs new file mode 100644 index 00000000..c5425024 --- /dev/null +++ b/pagetop-mdbook/build.rs @@ -0,0 +1,17 @@ +use static_files::resource_dir; + +use std::env; +use std::path::Path; + +fn main() -> std::io::Result<()> { + build_resource_dir("./static", "mdbook") +} + +fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { + let mut resource = resource_dir(dir); + resource.with_generated_filename( + Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), + ); + resource.with_module_name(format!("resources_{}", name)); + resource.build() +} diff --git a/pagetop-mdbook/src/lib.rs b/pagetop-mdbook/src/lib.rs index c769efcb..577ac0a4 100644 --- a/pagetop-mdbook/src/lib.rs +++ b/pagetop-mdbook/src/lib.rs @@ -1,9 +1,11 @@ use pagetop::prelude::*; -pub type BookMapResources = std::collections::HashMap<&'static str, static_files::Resource>; - pub_const_handler!(MODULE_MDBOOK); +include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); + +pub type BookMapResources = std::collections::HashMap<&'static str, static_files::Resource>; + pub struct MdBook; impl ModuleTrait for MdBook { @@ -13,7 +15,11 @@ impl ModuleTrait for MdBook { } impl MdBook { - pub fn configure_service_mdbook( + pub fn configure_mdbook_common(cfg: &mut app::web::ServiceConfig) { + theme_static_files!(cfg, "/mdbook/static"); + } + + pub fn configure_mdbook_service( cfg: &mut app::web::ServiceConfig, mdbook_path: &'static str, mdbook_map: &'static BookMapResources, @@ -63,42 +69,34 @@ async fn mdbook_page( Page::new() .with_title(title) .with_context(PageOp::AddMetadata("theme-color", "#ffffff")) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/css/variables.css" - )))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/css/general.css" - )))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/css/chrome.css" - )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/css/variables.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/css/general.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/css/chrome.css", + ))) .with_context(PageOp::AddStyleSheet( - StyleSheet::located(concat_string!(mdbook_path, "/css/print.css")) + StyleSheet::located("/mdbook/static/css/print.css") .for_media(TargetMedia::Print), )) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/FontAwesome/css/font-awesome.css" - )))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/fonts/fonts.css" - )))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/highlight.css" - )))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/tomorrow-night.css" - )))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located(concat_string!( - mdbook_path, - "/ayu-highlight.css" - )))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/FontAwesome/css/font-awesome.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/fonts/fonts.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/highlight.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/tomorrow-night.css", + ))) + .with_context(PageOp::AddStyleSheet(StyleSheet::located( + "/mdbook/static/ayu-highlight.css", + ))) .add_to( "region-content", Container::new() diff --git a/pagetop-mdbook/static/FontAwesome/css/font-awesome.css b/pagetop-mdbook/static/FontAwesome/css/font-awesome.css new file mode 100644 index 00000000..540440ce --- /dev/null +++ b/pagetop-mdbook/static/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/pagetop-mdbook/static/FontAwesome/fonts/FontAwesome.ttf b/pagetop-mdbook/static/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 zcmd4434D~*)jxjkv&@#+*JQHIB(r2Agk&ZO5W=u;0Z~v85Ce*$fTDsRbs2>!AXP+E zv})s8XszXKwXa&S)7IKescosX*7l99R$G?_w7v?NC%^Bx&rC7|(E7f=|L^lpa-Zk9 z`?>d?d+s^so_oVMW6Z|VOlEVZPMtq{)pOIHX3~v25n48F@|3AkA5-983xDXec_W** zHg8HX#uvihecqa7Yb`$*a~)&Wy^KjmE?joS+JOO-B;B|Y@umw`Uv<H)|NZ!E#)6MA zsq5L5E0&$_-1gQ8#JvvJx)K2n+43aH^THolxn|wQDOVML8UCjjv-GXL^t@%#zaCt| znB!i?ikxefZCooiNM(p`NBYnu%hs&;>s>da><dw!a^u=duUPl(Tfh1MlUDVi&h?Di zrtn|x{ME*@&vkVCixn9Wz}TUdmzwkM0RU{~2J)JiByym5#tdu#L1u>d0W;5qQ!4Qz zJxL+bkEIe8*8}j>Q>BETG1+ht-^o+}utRA<*p2#Ix&jHe=hB??wf3sZuV5(_`d1DH zgI+ncCI1s*Tuw6@6DFOB@-mE3%l-{_4z<*f9!g8!<Nzo$=DrKcxk^p5OY&(bFU8Rt z;gl~Z%A@c!YZmEp@%ixloAN1Xkv~Q0WTyM+o65?Un}fkZ@K9VHCQ73qY%pE!oBStr zNKbWBp8Q+nrEoa<9xN}-Hi`D+(iX-WfD?e_9=JvMw)`9Klt`0iNtBfo_3CBYs2))l z>dcoz@f1eyoO9;V<o%)zh+8Ba(h`gUPQ1~VDavPpD=br#g?M`B!{xjmZwgcJ9*oDg zNSAx(VHIP+5SL~R=(BV4X=rQ&oQM;30S?4Tx$nU`MS99#=+ewb>5yN|*Pk0}XYPFk z!g(%@Qka**;2iW8;b{R|Dg0FbU_E9^hd3H%a#EV5;HVvgVS_k;c*=`1YN*`2lhZm3 zqOTF2Pfz8N%lA<(eJUSDWevumUJ;M<C?`d6<WSZKIGd7Yv&l(mHUe(YpRWUPG{zzi z!I6VSltbkXh9NEohn_Z<CtnWY2#yre+YmM)msbLu5|u%1%e}h+2ZLK~Kr_f8Jr{8Z zM|xX+e&Sn3ctn&%`3oGiAK_MtQ}9i36vlJk<VRd<J{<MS<O<6;**C$Na|!tde9KHB zc&Hw{+XwTcSruTbLbz}UuM#eu>ocT>zZ5W08%2JkP2szU{CP(((>LmzOmB>ZOpelu zIw>A5mu@gGU}>QA1RKFi-$*aQL_KL1GNuOxs0@)VEz<hv`#6Vi@+){#9VR%ckHRP~ zIhy-~?+9Cy52v^IPV4VHeK3B^YV&c0X#r=7%0=5myQsXuJo&O1b5d9?JVg1aZMnKd zeT8M8;ya#)IR}3TZx4Ov;1T@{ct#`4O?Bnc4VDjoC*q3>%g?77_AY_{e55-&2X`IC z!*9krPH>;hA+4QUe(ZB_4Z@L!DgUN;`X-m}3;G6(Mf9flyest6ciunvokm)?oZmzF z@?{e2C{v;^ys6AQy_IN=B99>#C*fPn3ra`%a_!FN6aIXi^rn1ymrrZ@gw3bA$$zqb zqOxiHDSsYDDkGmZpD$nT@HfSi%fmt6l*S0Iupll)-&7{*yFioy4w3x%G<fIxL6il* zAL;CPmlvcNOiwT)JWBNz#^=J%$itb7n^I6$h{E!IdLwNlpFaPlG`X_F2wR16YbXxk zL^t#{>VEpx@jWf@QO?itTs?#7)d3a-Ug&FLt_)FMnmOp5gGJy@z7B*(^RVW^e1dkQ zkMHw*dK%Ayu_({yrG6RifN!GjP=|nt${60CMrjDAK)0HZCYpnJB&8QF&0_TaoF9-S zu?&_mPAU0&@X=Qpc>I^~UdvKIk0usk``F{`3HAbeHC$CyQPtgN@2lwR?3>fKwC|F> zYx{2LyT9-8zVGxM?E7=y2YuRM`{9bijfXoA&pEvG@Fj<@J$%dI`wu^U__@Oe5C8e_ z2ZyyI_9GQXI*-gbvh>I$N3K0`%aQw!JbvW4BL|QC`N#+Vf_#9QLu~J`8d;ySFWi^v zo7>mjx3(|cx3jOOZ+~B=@8!PUzP`iku=8-}aMR(`;kk#q53fC(KD_gA&*A-tGlyS3 z+<Un12s`3D5<ZeTGWSULk+nzCM|K|RIkNvq=E%!Oda1^NzYZ)JSU50mVB)~2Kfm** z_y6>m)8@1~El#u3<TN@BPSvS6WvAr$m*XSHhmIqT!;U`3KOG-9-gms`c-Qd{$KM_A zINo;r&GDAwO~+pye{sCw=ym+r@h8XYjz2nHbNs>as^j;LR~)}{9CG~D_9MNw(aQga zKO~TeK}MY%7{tgG{veXj;r|am2GwFztR{2O|5v~?px`g+cB0=PQ}aFOx^-}vA95F5 zA7=4<%*Y5_FJ|j%P>qdnh_@iTs0Qv3Shg)-OV0=S+zU1vekc4cfZ>81?nWLD;PJf5 zm^TgA&zNr~$ZdkLfD=nH@)f_xSjk$*;M3uDgT;zqnj*X$`6@snD%LSpiMm2N;QAN~ z_kcBPVyrp@Qi?Q@UdCdRu{^&CvWYrt=QCD^e09&FD^N$nM_`>%e`5*`?~&bbh->n~ zJ<Qms-HbKwWUS?U#u5oQ_>(9*nTC4`EGNEOm%t%U8(?hP3%1b;hjQAV0Nc?8hxeG3 zaPKiTHp5uQTE@n~b#}l3uJMQ)kGfOHpF%kkn&43O#D#F5Fg6KwPr4VR9c4{M`YDK; z3jZ{uoAx?m(^2k>9gNLvXKdDEjCCQ+Y~-2K00%hd9AfOW{fx~8OmhL>=?S<V#?G+9 zt!8W<(#_k$*nGsFi82@TF}4upE;2E;I0d(Zu_YaFfaM&dTUrB$I?hEI-D??Jj{M6% z0&Aqey~o&!xo|IId3~O-3sL5UsPm#OxC~<#PsS2vg#%2h(_k@Ej9r5Kmm+@c7RD}n zn6b-I_Z1r%TjzvB-u1}yC6seDgL{^-YY=`7(p|fivFmm-mPXk1#c(?q+dQ4IEnYa3 z|7GO;@|#eYtY+*c)Uy?^Z_6-tGxG2F8Dn2T`dbipEAs3N!6ELp`Hbzd!Xa$e7C40M z>SyfsZaC!Gt-z(=`WU+-&Dfn0#_n3e*q()q-CYLpelpxsjC~b#-P^<1eJJmK#NGc1 zV_&<Mu^z-fFqg3h8{i&h?4fqJy^KA4K4XudoV`04`=*Jp$57T|?=ki*_`mfIV~?Y* zZx_SuXKep;xL(HoV<X&)jD05rw+`-SjD2?@+((Q(v6e9~KI}=9`#qHPy+e%s=M!*! zj6H>XPb2-)pD^|e^5@<6_cHeE7RC;w7<*1(><1_>^E_ievcm0P?8kubdDQj%vyA=3 z3HKCZFYIRQXH9UujQt#S{T$`}0_FTN4TrE7KVs}9q&bK>55B|Lul6(cGRpdO1Kd`| zeq(~e`?pp&g#Y$EXw}*o`yJwccQ0eFbi*Ov?^iSS>U6j#82bal{s6dMn-2#V{#Xo$ zI$lq~{fx0cA?=^g&OdKq?7tBAUym`?3z*+P_+QpC_SX>Hn~c4gX6!Ab|67K!w~_Ac z_ZWKz;eUUXv46n53-{h3#@>IKu@7En?4O7`qA>R1M~r=hy#Got_OTNVaQ-*)f3gq` zWqlf9>?rCwhC2Ie;GSYEYlZ8Edx9~|1c$Hz6P6|~v_elnBK`=R&nMuzUuN8VKI0ZA z+#be@iW#>ma1S$XYhc_CQta5uxC`H|9>(1-GVW=IdlO`OC*!^vIHdJ2gzINKkYT)d z3*#jl84q5~c<Fq`%MLMKo`S=>0(mMGIK+jJFO2k6NLvlqs#h}}L0klN#8)z2^A6*6 zU5q!Nj7Gdit%LiB@#bE}TbkhZGoIMXcoN~QNYfU9dezGK=;@4)al-X6K6WSL9b4dD zWqdqfOo0cRfI27sjPXfulka7G3er!7o3@tm>3GioJTpUZZ!$jX5aV4vjL$A+d`^n- zxp1e$e?~9k^CmMsKg9T%fbFbqIHX;GIu<72kY<qrx0Uh5=fffW614f8R~cW5xbEGI zFGF3+o@IPF;5-lc&VP*Y73&zkU?t-hzRvi{Cm6qI3F8-UWc-pXjIT{Geg(?8(#iOS zpE14>ZMzEPZ`#55myqXbyss&PdzkU-kng%ZaGx-qUd{ORDE9`W-<*I${1)W@@_xo| z#P?RjZA0Ge?Tp_{4)ER51-F;+Tjw*r6ZPHZW&C#J-;MVj3S2+qccSdOkoNAY8NUbR z-HUYhnc!Y!{C<Retr+ed#(SP;{6Q<@4<#6Xcq8MFpx#H*jDH<<>@9;sxqIIma{CrC z{*4;OzZrsik@3eKWBglt8Gju9$G0;6ZPfp5`1hya;Q!vUjQ{6qsNQ=S2c6;1ApV)% zjDJ4@_b}tnn&43HfiA|MBZsgbpsdVv#(xMHfA~D(KUU!0Wc>La#(y%O@fT{~-ede{ zR>pr0_Y2hXOT@kS3F8L=^RH0;%c~jx_4$nd=5@w@I~NXdzuUt2E2!)DYvKACfAu5A zUwe%4KcdXn;r@iOKr8s4QQm)bG5$uH@xLJ7o5hU3g}A?UF#a~+dV4S9??m7ZG5+_} zjQ<05{sZ6d0><|ea8JQ~#Q6It>z^jLhZ*lv;9g|>Fxqwm@O+4TAHKu*zfkVS4R9I8 z{~NIVcQ50g0KQKVb`<_&>lp7xn*Q?{2i@S=9gJ(JgXqP;%S_@4CSmVFk{g($tYngU z2omdDCYcd#!MC-SNwz*FIf|L&M40PMCV4uT<VAWP9QZ3K(8Q$Tb|#fXm=xT~q*8pB zKf$Dm`EV~XDRecH!YI4yF(yU2m=s0&*mNevk+$X|Ce`j>QXRtTUT0GMZYDM0-H5Up z-(yk}+^8)~YEHrRGpXe%CMDJ}DT(-2<Q*Mi(ir3)bBIY}t#Bx_qXzC(CXGulX*|-W z_AqGz+A*nzNt02=RQRWN!y*5S7a8_|{&$Y81rO_la3GW5*cNt$WmnkM%QISPt<<wt z4IN!;U`HAKaCXiBGd!fGSvfpjBX@<H{a!<LxGI)tZ3(-0ESc!!E#c-0Zg{9ZyOpPc zu~@J_O;4W6Zmo~h1k`k(CZbNQMs$|N5;6Q?b8BOLb)eK_Dy2HGOJrcEqaGfY*Dh5x zN{LRXr8(eIkM|~8+jwhBGjtM@S6;a2!j+Tp8gbEr?D5`Mg`BcFYueS&v7Y8R^*&$y zob&ODOC|4T#})?2Kdo%BaHh1AWCR$}fWgSZXt$Gv$Z<5aD$enU#3ZM?H4;+%ZXdeA zucWn4wOh1LxshKk8@m#%5pCahU%yp5cHq)W4{()NaP`2YSMvo?2?@ASPpqXAT`_*v z)k7&RJ)j-C_4V&+`=T@&Y#?nU-As^;W3wURy9`FfXqW2IAv_+7#^NroAAQ~G>W~^` zjDf-D4fq2U%2=tnQ*LW*>*Q@NeQ=U48Xk01IuzADy1ym0rit^WHK~^SwU449k4??k zJX|$cO-EBU&+R{a*)XQ6t<lT5x3R5ijN#=Uww{w-I`L>~;?kuP)y%}DA(=%g4sNM$ z8a1k^e#^m%NS4_=9;HTdn_VW0>ap!zx91UcR50pxM}wo(NA}d;)_n~5mQGZt41J8L zZE5Hkn1U{CRFZ(Oxk3tb${0}UQ~92RJG;|T-PJKt>+QV$(z%hy+)J<T?A6}N-j;St zi%gMo&%b5T>z~xmNJS#48TFsM{-?LHd-bxvg|X{pRq&u74~nC4i>i16LEAiprfpGA zYjeP(qECX_9cOW$*W=U1YvVDXKItrNcS$?{_zh2o=MDaGyL^>DsNJtwjW%Do^}YA3 z<vxR*f5exU`l99;{HL|G+UOai(-C;1*KH>3HS=f@249Y<c{olDhH@Ei))pN&pe^Ff zGx#Qc75}M#tM=4jNnT#t$*<LJ=+u6%E&l0GWlJ8+=FfnVa67G1-}`75M{^jGK*#$- zZOs)ja~eW1XKP4h*DUP+#=>h{jnme5ZRV>tcdeh+=o(;eXg_-64c@tJ&As=oIrFZ& z*Gx&Lr>wdAF8POg_#5blBAP!&nm-O!$wspA>@;>RyOdqWZe?F%--gC9nTXZ%DnmK< z`p0sh@aOosD-jbIo<n&)Ed2@o&q@Dz^$njmJRJ)PDt3y8!eYTJBQhuB*$-bnp<0kr z!}n0C&npvC?o%;o445>je0ec`&&fWsK?xPdf*L)Qp(MwKKIOtB+EDn(3w-9Ns9O~i z7MwnG8-?RZlv&XIJZUK*;)r!1@Bh4bnRO*JmgwqANa8v4EvHWvBQYYGT?tN4>BRz1 zf1&5N7@@!g89ym5LO{@=9>;Y8=^ExA9{+#aKfFGPwby8wn)db@o}%Z_x0EjQWsmb6 zA9uX(vr-n8$U~x9dhk~VKeI!h^3Z2NXu;>n6BHB%6e2u2VJ!ZykHWv-t19}tU-Yz$ zHXl2#_m7V&O!q(RtK+(Yads868*Wm*!~EzJtW!oq)kw}`iSZl@lNpanZn&u|+px84 zZrN7t&ayK4;4x_@`Q;;XMO4{VelhvW%CtX7w;>J6y=346)vfGe)zJBQ9o$eAhcOPy zjwRa6$CvN-8qHjFi;}h1wAb{Kcnn{;+ITEi`fCUk^_(hJ&q1Z=yo*jRs<94E#yX67 zRj)s)V&gd0VVZGcLALQ|_Lp<4{XEBIF-*yma#;%V*m^xSuqeG?H-<is<Gp4jPsMvl zy(i?PLjG33kUe?vtWz*#g>7=M0Cq%%W9`2Oe>Ov)OMv8yKrI^mZ$ql{A!!3mw_27Y zE=V#cA@HopguAWPAMhKDb__-Z_(TN7;*A`<V!-bvnypiC;;A<s)ZWy7roDM^(*wKe zFRBbV>XxrMefxoz4{Seu)$%$=sPf{vT@Pf_T`RlrC#CPDl$#FnvU|VBC$0(E>+3EG z&3xsml}L_UE3bNGX6T~2dV6S%_M9{`E9kgHPa+9mas{tj$S<&{z?nRzH2b4~4m^Wc zVF+o4`w9BO_!IohZO_=<;=$8j?7KUk(S5llK6wfy9m$GsiN5*e{q(ZS6vU4l6&{s5 zXrJJ@giK>(m%yKhRT;egW||O~pGJ&`7b8-QIchNCms)}88aL8Jh{cIp1uu`FMo!ZP z1fne;+5#%k3SM7Kqe|`%w1JI=6hJJrog4j?5Iq!j=b=0AJS5%ev_9?eR!_H>OLzLM z_U#QLoi=0npY1+gHmde37Kgp)+PKl=nC>pM|EJCAEPBRXQZvb74&LUs*^W<qi`ikb zULO&OgAOE?{8Yo8e9fP&eyOZA+Pu&jv_x+)uMRl2HkY|<PdR<7%te>CT5Q%L-{O+y zQKgd4Cek)Gjy~OLwb&xJT2>V%wrprI+4aOtWs*;<9pGE>o8u|RvPtYh;P$XlhlqF_ z77X`$AlrH?NJj1CJdEBA8;q*JG-T8nm>hL#38U9ZYO3UTNWdO3rg-pEe5d=<c84sd zWQRT5%`;6#i}quSQNGk|?_N5wAN*7|VF*u7b<CmleU4))Puksbr~r-Zr})lR$WQcl z0q0#&W#)RbB$@93ApKqQu3A4&eoBD$^=Kjy{W_r=@GXcAyFithN6dfGG&DTNpC!%Q z-v&ejc41|R6RwdY4OGg}W1lMki51+cmL34l6^wCdyfmKwSEtD)+f3Q6Y?sw)Gj*CI zi}b6|!q7)zGX2paNg*wS#A#x5c`sKue@%-?6K0wvqckD=0~43bGcBbiX+bdf;*Y5> zw3Xi@nV)1`P%F?Y4<N_71+4WAj)%^g1&pq6EY4%lIS>s9yVPgPYT9d#3SLD{*L0U{ z;TtVh?Wb0Lp4MH{o@L6GvhJE=Y2u>{DI_hMtZgl~^3m3#ZUrkn?-5E3A!m!Z>183- zpkovvg1$mQawcNKoQ*tW=gtZqYGqCd)D#K;$p113iB1uE#USvWT}QQ7kM7!al-C^P zmmk!=rY+UJcJLry#vkO%<X&wMhX@z48d4#x$RV9unDpR5F^<jPm*#*xx`6FaC(DhT z#3rNcGx$kv;@)Z~0OANH>BuM>pb)46x!{DkRYY7wGNK$v=np_sv7nfHZO_=eyqLSK zA6ebf$Bo&P&CR_C*7^|c<!)Ox)fnUtm?B<24<QbOJc=X^B;oVC5fgtPD3vK3tC+{8 zWfZH^2?^L^<BS3Z@SM@wsdznQ9$SV+Ib*};vG+PzPL9Ah8!?Nc&}*<rjuz(Mp5ul+ z;BOvJvyc0Y#K-U$$Xht4%<w_^r0N<ZPFkc`;!&Uj1{y>A>zl^hJ7z0?xu#wFzN=D8 zxm(>@s?z1E;|!Py8HuyHM}_W5*Ff>m5U0Jhy?txD<f<*#QXUV_l-I_2Mu=7^T_+=O zrI<wo4*<R`2iI80r~*}dE@&{M9I|wBXG|%;7p2>x{jjLGNXs}(CVxgu9Q4tPgE+Hm z*9ll7bz80456xzta(cX+@W!t7xTWR-OgnG_>YM~t&_#5vzC`Mp5aKlXsbO7O0HKAC z2iQF2_|0d6y4$Pu5P-bfZMRzac(Yl{IQgfa0V>u;BJRL(o0$1wD7WOWjKwP)2-6y$ zlPcRhIyDY>{PF<r;4(jy?Kp%N?>LvIr0!VoC<s-_2bN?|P6d;e4@#tzTqN;6&52j$ zL9K!Yk^iN0oK#a%RaKIGbzDIoIan!+0}vWdT67`CwzZ;fPBHD3o=~>e;c_}dp>U-X z`pii$Ju=g+Wy~f|R7yuZZjYAv<!8-$PP~x7F<7|MfT8{I*mxeRuChzu*;<-uy$7wX zfW)8-sv=vO6|DVW?SSA~s?O!A+`jwgdFE@wp&3S}!?MlHO>4AYJT}Ct-OfF$ZUBa> zOiKl0HSvn=+j1=4%5yD}dAq5^vgI~n>UcXZJGkl671v`D74kC?HVsgEVUZNBihyAm zQUE~mz%na<71JU=u_51}DT92@IPPX)0eiDweVeDWmD&fpw12L;-h=5Gq?za0HtmUJ zH@-8qs1E38^OR8g5Q^sI0)J}rOyKu$&o1s=bpx{TURBaQ(!P7i1=oA@B4P>8wu#ek zxZHJqz$1GoJ3_W^(*tZqZsoJlG*66B5j&D6kx@x^m6KxfD?_tCIgCRc?kD~(zmgCm zLGhpE_YBio<-2T9r;^qM0TO{u_N5@cU&P7is8f9-5vh4~t?zMqUEV!d@P{Y)%APE6 zC@k9|i%k6)6t2uJRQQTHt`P5Lgg%h*Fr*Hst8>_$<LHwKtiL1)`Z1k}WtCHTp*zG) zd@VPHYT9L%x%kdIFV=dq86xx&$bIH1Zqhz^D$`DQnaar#F4iXSa**JGiEagk!B1Ru zqf}j`tAlBt6VD8mxdq~os68b*H#O_xS!$-F^!N9SyJpGFGcsDA%NdMS`o_HX^r~mB zjWxGkcg{RpFs8EUv14}XPvuB#dUDpR^;xx~)V{7E(Xh)L3rc?r1?=S;$BgyVCF%&l zFuy_Xs4r#_gboRee-4jmoQc^ehr?t}CM0kelFwU7%lRN{rjzh-BqK;@Rc;%?knZq4 z?ccU=h)bPzW!2>J{ZI{mNBjN$^2t?KP8*6_xXu5xx8ufMp5R?P(R-t`{n6c{!t+*z zh;|Ek#vYp1VLf;GZf>~uUhU}a<>y*ErioacK@F{%7aq0y(Ytu@OPe;mq`jlJD+HtQ zUhr^&Zeh93@tZASEHr)@YqdxFu69(=VFRCysjBoGqZ!U;W1gn5D$myEAmK|$NsF>Z zoV+w>31}eE0iAN9QAY2O+;g%zc>2t#7Dq5vTvb&}E*5lHrk<o?&An%HnHnwimHSFY zP8?Z+cWG1wcZw|v(B!8vX4BBN5o`uq^+jO9@}GlL?8!jh7Q&l=w;&D@9uU#(ln_n( zJ72U#{LF9cuvtrE@pkXbdGls^+vBmI&9;MoL;I}_Xc{+G8XF^D+P?iukw$!q$lw0^ zz0jr|)UspMSTOD_ceFnA)I+U~a&H{iKlXcCLc4A;Vj=;>rj!I1b0=@+&c(qJcmok6 zS<GPZ0U@7op7t1v!25ZiLn#F<sK)L<i<qmv>ZAuQ496j<&@a6?K6ox1vRks+RqYD< zT9On_zdVf}IStW^#13*WV8wHQWz$L;0cm)|JDbh|f~*LV8N$;2oL|R99**#AT1smo zob=4dB_WB-D3}~I!ATFHzdW%WacH{qwv5Go2WzQzwRrv)ZajWMp{13T_u;Rz^V-VF z@#62k@#FD#t@v9ye*A%@ODWm-@oM_$_3Cy1BS+(+ujzNF@8a7?`$B^{iX2A-2_nA? zfi2=05XV^;D_2G}Up$eFW|Ofb^zuE)bWHkXR4Jm!Sz0O?)x6QD^kOuf<UNV5WGvfC zOct<!4cuW|m8%OHs?V-X)nS122bze@LS9Yu`tzXRX#rfMv4X!6B?!~W-hTr=v<5(z zRU#8AlYS9P>R`*v0=|sS?#*ZCvvr^VkV!zhLF3}FHf%+=#@ae1Qq<4~Y1EGYK$Ib1 zg!s~&&u27X&4Ks^(L3%}Npx!_-A)We=0v#yzv03fzxKZ8iV6KIX5U&?>^E?%iIUZ4 z2sD^vRg%kOU!B5@iV{&gBNc9vB)i{Wa@joIa2#4=oAl|-xqj_~$h33%zgk*UWGUV# zf3>{T#2buK?AZH?)h>10N)#VHvOV}%c|wR%HF|pgm8k`*=1l5P8ttZ1Ly@=C5?d9s z)R>B@43V`}=0??4tp?Y}Ox0$SH)yg(!|@V7H^}C-GyAXHFva04omv@`|LCuFRM2`U zxCM>41^p9U3cR>W>`h`{m^VWSL0SNz27{ske7TN<Sg(~G0be*C4|__Qs<mm_w8%)^ z?}L4T+16fl^uMdxZKe?4t1S$ZUp2!o_GpQgr^Wg!gD!bl2b82bF%f#7a2^$D3s9)6 zb&ide8nHa*q)+0%g`~$pefr^gpmInnX<ZP7Vp->1dTpM|P6Hn!^*}+fr>rJ*+GQN{ ziKp9Zda}CgnbNv#9^^&{MChK=E|Wr}tk?tP#Q?iZ%$2k;Eo9~}^tmv?g~<gBF2E!d z>PW^C$`N)|awe=5m{Xqd!M=ST?2~(mWjdOsXK#yVMN(qP6`q#tg+rQexf|*BeIU)a z^WuJyPR4WVsA<ziZ9SGIqXyk(0hNQt%J-j<&BZ9m&0w6`VyIog&iYuWAU%FJMvhDo z@BnM$s{+HX7{T~AcVgogi(AwHuBHMT&d^d)q@mg%{q7s#Uyb&}7WDr@3QTNjiCN$0 z#j}zo`K9o#TE|)CUWaG9!@$RDsV?mwab+_Pn0#iN+Ia@oI)f|9#>Tp2E{*y77*kZ9 zEB{*SRHSVGm8ThtES`9!v{E``H)^3d+TG_?{b|eytE1cy^QbPxY3KFTWh&NZi`C?O z;777FMti@+U+IRl7B{=SCc93nKp`>jeW38muw(9T3AqySM#x@9G|p?N;IiNy(KN7? zMz3hIS5SaXrGqD(NIR0ZMnJT%%^~}|cG(Ez!3#)*o{{QjPUIVFOQ%dccgC0*WnAJW zL*1k^HZ5-%bN;%C&2vpW`=;dB5iu4SR48yF$;K8{S<c_w99R^X`sJ&aw1-E`?@ZqF z($w`|+q<M;f5XMvC5{k3?ed8Y9buPZNghg=Hq1Ondc_zVzi$52i^i7Ont#z!dU3F^ zf9+DG*kP@RmW}i^tMV)LCYxDR_&mwOgJb4jGb^!R^q5d_^$T~L|FsLIlo|YDex?<M zz8J%pkH{U!UXaI=jZ(agL{ktw+FLN9g$4;v(nuSO7+*A$#@XdRZ9-|8jc>Y`7mu6c z@q{10W=zwHuav3wid&;5tHCUlUgeVf&>wKuUfEVuUsS%XZ2RPvr>;HI=<(RACmN-M zR8(DJD^lePC9|rUrFgR?>hO#VkFo8}zA@jt{ERalZl$!LP4-GTT`1w}QNUcvuEFRv z`)NyzRG!e-04~~Y1DK>70lGq9rD4J}>V(1*UxcCtBUmyi-Y8Q$NOTQ&VfJIlBRI;7 z5Dr6QNIl|8NTfO>Jf|kZVh7n>hL^)`@3r1BaPIKjxrLrjf8A>RDaI{wYlKG)6-7R~ zsZQ}Kk{T~BDVLo#Zm@cc<&x{X<~boVS5(zfvp1s3RbASf6EKpp>+IFV9s`#Yx#+I& zMz5zL9IUgaqrnG*_=_qm|JBcwfl`bw=c=uU^R>Nm%k4_TeDj<s++>y|&K2eKwx!u8 z9&lbdJ?yJ@)>!NgE_vN8+*}$8+Uxk4EBNje>!s2_nOCtE+ie>zl!9&!!I)?QPMD&P zm$5sb#Le|%L<#tZbz%~WWv&yUZH6NLl>OK#CBOp{e~$&fuqQd03DJfLrcWa}IvMu* zy;z7L)WxyINd`m}Fh=l&6EWmHUGLkeP{6Vc;Xq->+AS`1T*b9>SJ#<2Cf!N<)o7Ms z!Gj)CiteiY$f@_OT4C*IODVyil4|R)+8nCf&tw%_BEv!z3RSN|pG(k%hYGrU_Ec^& zNRpzS-nJ*v_QHeHPu}Iub>F_}G1*vdGR~ZSdaG(JEwXM{Df;~AK)j(<_O<)u)`qw* zQduoY)s+$7NdtxaGEAo-cGn7Z5yN#ApXWD1&-5uowpb7bR54QcA7kWG@gybdQQ<S- zDdN%;r{I|pU-aM?e9q_pBe-?*L>a&cxCKxup2Av3_#{04Z^J#@M&a}P$M<((Zx{A8 z!Ue=%xTpWEzWzKIhsO_xc?e$$ai{S63-$76>gtB?9usV&`qp=Kn*GE5C&Tx`^uyza zw{^ImGi-hkYkP`^0r5vgoSL$EjuxaoKBh2L;dk#~x%`TgefEDi7^(~<C<r}yHnA5! zj8>cmE)UEw*l#i+5f-;!v^P%ZowUbhH*3Av)CifOJX7KS6#d|_83fqJ#8VL=h2KMI z<X$qRpzLMz@O*B|3fjxC*>GYTbGm=Q=0lfc{$IDTn;IxIgLZ(Z?)#!mln$0r3A(um zzBIGw6?zmj=H#CkvRoT+C{T=_kfQQ!%8T;loQ5;tH?lZ%M{aG+z75&bhJE`sNSO`$ z`0eget1V7SqB@uA;kQ4UkJ-235xxryG*uzwDPikrWOi1;8WASslh$U4RY{JHgggsL zMaZ|PI2Ise8dMEpuPnW`XYJY^W$n>4PxVOPCO#DnHKfqe+Y7BA6(=QJn}un5MkM7S zkL?&Gvnj|DI!4xt6BV*t)Zv0YV-+(%$}7QcBMZ01jlLEiPk>A3;M^g%K=cNDF6d!7 z<aM&9@bguR-(8%RuJl`s*}oX^lq!s^yr(~-b*t}2AJw`ajkG3X??#boRa)-xQ!0y} zQvE{f?$7WZsW%yYl=nOmi~R%I4k0fIp4kYU*KwK-JLnPSlu&%jx{(IIGpy})j-Ni> zq1_(l4SX+ekaM;bY|YgEqv2RAEE}e-Im8<@oEZ?Z81Y?3(z-@nRbq?!xD9Hyn|7Gx z-NUw`yOor_DJLC1aqkf2(!i=2$ULNfg|s8bV^xB!_rY+bHA;KsWR@aB=!7n&LJq(} z!pqD3Wkv<EUKw=QUZ{YeNjs!1)DE3)xa{mp%FNA)7E{?JXJ2MGou?yVULS4?IGusE za6J!4pgDi?kcM_0y6pz@LpT57oC=&XKj#lOKV-g6pRa~b&`twzY&7d+(*cz}nmFc; zUG6sS0f8^TDzbqAV-Ci#0Q*4v!S4HIG2})JIE}Yg-neehx^9VuT-t-Kkc%%pecy(D z;Qzi2a%y}l3_7f%?CyY{3^<lfl!0RAl%uAbhqB#Tud-x`*1H5Ya(l{nH;QTRmNJ9o zWPkOXUdo1jB}S(U#TX2_A;{8+*V<5uQ+f$I87N9BTf#$2%1{bKYJoGfM*x|>o-Goy zx1edGgnc}u5V8cw&nvWyWU+wXqwinB#x7(uc>H44lXZQkk*w_q#i2O!s_A?a*?`Rx zoZW6Qtj)L1T^4kDeD7;%G5dS816OPqAqPx~(_-<DuB$fss>jZ`bo-MR_kd&sJv{A^ zs<mvsogQ1M8mv<Ct$f8}u@yT_X8yXC2EC}uY~H5r4-`o@d)0;ATiQp>@18qv!kD;U z5Evv$<lBB7#(Jc%96X*_<c5{DXipqiqGV{lSf@y=%UMwtHg|ADEjAhIx56>C*bD~m z+x@>Oo>;7%QCxfp-rOkNgx4j-(o*e5`6lW^X^{qpQo~SMWD`Gxyv6)+k)c@o6j`Yd z8c&XSiYbcmoCKe+82}>^CPM+?p@o&i(J*j0zsk}!P?!W%T5`ppk%)?&GxA`%4>0VX zKu?YB6Z)hFtj@u-icb&t5A1}BX!;~SqG5ARpVB>FEWPLW+C+QOf~G-Jj0r`0D6|0w zQUs5sE6PYc)!HWi))NeRvSZB3kWIW|R<H0_gGW<At4DglY{@PXl7rw}vx_Wdy?mi( z$0>^A%RfamB2jCbVX(Fn>y%#b1W%}W%qc)XVrwuvM!>Qur!Ooy2`n@?qMe3$`F2vx z9<=L}wP7@diWhCYTD?x)LZ>F6<rMsfn4>F?z8naL18P%1T9&P_d4p;u=(XW1LO3-< z`{|5@&Y=}7s<hKtKn``g07m^x2L<{euW5rmHASWqkln<y;G60p+yy1Vd~}>x3t1Zs zr9ZBmp}Yp<Mc)Mmn-+i$m0AeGjn*2BBdF_u2nszt)O{Ez!VomrO1NW@UJxJXIYe56 z(hC@vJZyP9IiY;2hPG1)J9VoU!%1sA9yL#0JHU99x=C-a^r*#L2#n~b{G2!*mf=7Q zwzqIf9N*qy6``%-9z_FAX#r2LDe2LPf*507Fz(b?J9;sPV>HLq7lwu?CXL8<aWMNg z?79jh7{F8S&wB>$Q65$Q29AlDCBJSxu5<ljsZ?&yzAt$^o=0gUg23{>;p0({^4skD z+4se#9)xg8qnEh|WnPdgQ&+te7@`9WlzAwMit$Julp+d80n+VM1JxwqS5H6*MPKA` zlJ*Z77B;K~;4JkO5eq(@D}tezez*w6g3ZSn?J1d9Z~&MKbf=b6F9;8H22TxRl%y1r z<-6(lJiLAw>r^-=F-AIEd1y|Aq2MggNo&>7<AhoY=YGA|J57w_WG(=uW_6WAD9gb5 zkllb$JpC=Oq9dIg7R5r|P`SqQ<dYuHB2Q_MK7ytAJTZiC9@ZoL{?AIDD}Wz7W#0sZ zofkn1HXLlFfEDzB*m2m)4H;LeihD7}U0eAVJQu^P`eK4ns&w}cgGjC_a|3kkqQ9Uu z?lK56cLJFz-7|;5K>Ln)S~iAF1;-4`A*9KlL*vleLO3vhEd(@RsIWp~O@>N4p91SI zb~+*jP?8B~MwmI0W$>ksF8DC*2y8K0o#te?D$z8nrfK{|B1L^TR5hlugr|o=-;>Yn zmL6Yt=NZ2%cAsysPA)D^gkz2Vvh|Z9RJdoH$L$+6a^|>UO=3fBBH0UidA&_JQz9K~ zuo1Z_(cB7CiQ}4loOL3DsdC<+wYysw@&UMl21+LY-(z=6j8fu5%ZQg-z6Bor^M}LX z9hxH}aVC%rodtoGcTh)zEd=yDfCu5mE)qIjw~K+zwn&5c!L-N+E=kwxVE<t-E%KoZ z<y&iLhOY@duv$!~)enS*2k<Lm!CRy6J|N;BcsF`0Wf&G9=@jB5xd)5m4ImV!$et^Y z=;6?K5$zg_9uNnA#Dfn1K!>ewN#vvx2WGCf^;C9<Gj>^mmTlYc*kz$NUdQ=gDzLmf z!LXG7{N$Mi3n}?5L&f9TlCzzrgGR*6>MhWBR=lS)qP$&OMAQ2<kLLosVT*|81)fcx z1+w&8<iP=6ky2!#yku<s8D`Xjeg0*f26T&a!7wAh4DXawVOI&H0$tS4$mGs-tDyy1 z`?j7-f4=Li{u1fKn;wA}t%hLg^jDmT`70Scfh4r^@|UE|58Rk_oV{SzFQ1i;EZ)_> z`$23{zM%a@9EPdjV|Y1zVVGf?mINO)i-q6;_Ev|n_JQ^Zy&BnUgV>NbY9xba1DlY@ zrg$_Kn?+^_+4V4^xS94tX2oLKAEiuU0<2S#v$WSDt0P^A+d-+M?XlR**u_Xdre&aY zNi~zJk9aLQUqaFZxCNRmu*wnxB_u*M6V0xVCtBhtpGUK)#Dob6DWm-n^~Vy)m~?Yg zO0^<MG&&0v@aU{0YUeT3jttrL)l^>+v~`x6Vqtjl4I5;=^o2jyOb~m+ER;lNwO$iN ziH4vk>E`OTRx~v#B|ifef|ceH)%hgqOy|#f=Q|VlN6i{!0CRndN~x8wS6Ppqq7NSH zO5hX{k5T{4ib@&8t)u=V9nY+2RC^75jU%TRix}FDTB%>t;5jpNRv;(KB|%{AI7Jc= zd%t9-AjNUAs?8m40SLOhrjbC_yZoznU$(rnT2);Rr`2e6$k!zwlz!d|sZ3%x@$Nw? zVn?i%t!J+9S<yDxP;GX2UFING%JN5ldLzG`I1!{O<N*T20}&)36oWiJP)STb(%fR) z^L!VP7mPfVZXa5-Cw8K;oHguD-UZ5Wxf}o}JGCe1+hXBel!A<K`TIeUe$XhF(j)l{ zVT(%{kUl6fAPK+$ziJ!!iu$2?1+-qoqn!edQ^74P`A!1JDd3h;Cj~^h{iI+Md>F@^ zO&TGun2&?VIygfH5ePk|!e&G3Zm-GUP(imiWzZu$9JU)Wot`}*RHV<<B{3C7B0`1| zb>-)vUhc6J6{w&PQIaSZ_N<(d>`C$yo#Ly&0Sr5gCkDY(4f@fY5!fLe57sH54#FF4 zg&hda`KjtJ8cTzz;DwFa#{$!}j~g$9zqFBC@To^}i#`b~xhU;p{x{^f1krbEFNqV^ zEq5c!C5XT0o_q{%p&0F@!I;9ejbs#P4q?R!i$?vl3~|GSyq4@q#3=wgsz+zkrIB<< z=HMWEBz?z??GvvT54YsDSnRLcEf!n>^0eKf4(CIT{qs4y$7_4e=JoIkq%~H9$z-r* zZ?`xgwL+DNAJE<u&KUS1Ezcw_$pu?O>`VB;S+w#NvBT{3;}{CD&@Ig*Ka2Acx)2Qx zL)V#$n@%vf1Zzms4Th~fS|(DKDT`?BKfX3tkCBvKZLg^hUh|_Gz8?%#d(ANnY`5U1 zo;qjq=5tn!OQ*-JqA&iG-Tg#6Ka|O64eceRrSgggD%<C_<FE1olnRcjTgNn5M5OHQ z&ChI}{m3J;@p6;=pWDOmu{ro8z!hi((IT*}WPJvM6IkXOn63i^qh*JA3M?7G0qW;I zX>%QBX$t=6?hPEK2|lL1{?|>I^Toc>rQU7a_`RSM^EPVl{_&OG-P;|z0?v{3o#pkl zC6Y;&J7;#5N#+H2J-4RqiSK^rj<_Z6t%?`N$A_FUESt{TcayIew5oWi=jxT*aPIP6 z?MG`?k5p%-x>D73irru{R?lu7<54DCT9Q}%=4%@wZij4+M=fzzz`SJ3I%*#AikLUh zn>k=5%IKUP4TrvZ!A{&Oh;BR}6r3t3cpzS(&|cEe&e{MQby|1#X`?17e9?|=i`sPG zL|OOsh`j@PD4sc6&Y3rT`r?-EH0QPR*IobE@_fkB8*(886ZkjkcO{K8Sz$H`^D-8P zjKG9G9A`O!>|!ivAeteRVIcyIGa#O<6I$^O7}9&*8mHd@Gw!WDU*@;*L;SYvlV#p( zzFSsPw&^UdyxO}%i)W8$@f}|84*mz&i2q@SlzMOd%B!BHOJ<(FYUTR(Ui$DuX>?85 zcdzl5m3hzFr2S@c_20C2x&N)|$<=RhzxI!}NN+yS16X^(_mtqY)g*Q%Fux5}bP3q$ zxQD|TB{+4C1gL>zI>g~-ajKMb{2s_cFhN2(I(q^X!$H(GFxpc6oCV9#maj|OhFZaI z;umX6E*fQVTQ@lyZauuv>%E)5z-?zQZne18V5A}}JEQmCz>7^h<Bd<fQ(OP%nTPmA zS6%V-@#lVf^v}OCKC_D2scF(BL(TlBQ96*dK6|!vDvF&o;ni)GU6t>0r)!zhinBG6 zMQghGt!Do5h%HmAQl~%m+!pr-&wlrcwW;qw)S$6*f}ZvXd<qjrVb%W}nk2)_bI{5Y zG!_yC8`{(bRk9VmUS!KrC7aBuqpq=4M_JWaSF~DYu8yf44}dUv?DXJU_%E%-q9UVR zYqQvF^8Tag@#D*@s>;cHw=xm|y~mHbT3yX>?hoYKfy--h<AH4|v7u4V$?TsF1POK# z2l~Z#K*f|-yBktn5A>+6w9%@_4ukf0Et^zr-DbPwFdyj0VJHi}4bqRetSNR`DoWd( z(%n5>8MQl+>3SeL-DB@IaM{NDwd{{v_HMIO)PKO}v{{##c@ihB0w$aaPTSP4^>n3Z zC8Il%(3dCLLX$-|SwWx1u7KVztXpzNhrOZQ78c$jd{B9lqsNHLr*9h;N9$i+vsrM1 zKzLB_gVdMCfxceejpIZat!MbR)GNZ%^n|fEQo?Xtq#Qa_gEWKTFxSL4b{g}<g5!pg zqjYvXf#WmS590a@AtEIYrKmWbO7RfxSqt%u{zj-2;vw3t)Ozvk|CUGsKto6|7(DwJ zqoP$jyJ=6RTYq*jeSO7zR(m1Ew81tMmn9k-6|A8-@s}tK@%iv#C$P~FZ*8kkTBv7; z8+H#yhOrc23fr;54Q3_NHJB(5rk3vMnC-7<X_?i~ODk9JQPqI6e6*h(y10E&qN{mg zVod4SToO7Foj>kJNd{QcoQ}HUP-A)Rq;U(***IA*V_0B5mr}Xp$q{YSYs-b2q~DHh z?+muRGn~std!VXuT>P9TL_8Km9G{do<P%hMjBo5*GjY+zxo5S6Mdsr|^yKI_%q!Y| z0XZbr6buPibb|^S7K<litua~z)i$~wp_60LRE(@oJO87pvtH1Sj+)>qRb-W0B&%d> z^3@hs6y5jaEq%P}dmr(8<wosc?GN8HeS4DK1fxZ+I2DI%mrTh(d*k$)v$^5U8{U6x z#W(eF!%R`r(0sLsle|8!;EM7q88jUgGH&h4`-Qy)R=WH?{fXNApJ)$g)3pbF0`?qg zhmjp;G}bkq(J@l@(gj3xY+Luy<wQe1DU<%W_S}<C@`*neDS)*xzoPg_5JC>=f}x~^ z*{I{tkBgYk@Td|Z{csd23pziZlPYt2RJW7D_C#&)OONEWyN`I19_cM;`Aa=y_)ldH z^co(O-xWIN0{y|@?wx@Y!MeVg3Ln%4ORu5~Dl6$h>AGSXrK3!pH%cpM?D|6#*6+A# zlsj;J0_~^?DHIceRC~0iMq)SJ&?R&if{fsdIb>y;H@M4AE`z8~dvz)(e}BqUWK^U~ zFy`PX+z*Bmv9VxAN;%CvMk(#kGBEMP;a-GgGZf~r$(ei(%yGqHa2dS3hxdTT!r>La zUrW2dCTZ!SjD_D(?9$SK02e_#ZOxdAhO%hgVhq54U=2$Hm+1^O^nH<>wS|&<)2TtD zN_MN@O>?A@_&l;U)*GY*5F_a~cgQb_3p`#77ax1iRxIx!r0HkDnA2G*{l|*}g_yI% zZdHt2`Hx^MA#VH7@BEN68Y_;<n>sAcCNgCY7S&dcQsp*$+uW7Dm@$Vl7!YA^51bi} z*Vy8uTj{neIhI<oWy=zdr_{4#i`<hHemO&-p)DvOH>L|PhditfC1Jeub(uy}w|wV5 zsQz)04y;BY2$7U4$~P{k)b`hZb>gv1RkD)L#g~$*N^1N1GfNMS)4r|pT*V<&KE1M9 zTh}rzSW#Kcci_#(^qf0gTW3&QN&zsW%VAQ+AZ%-3?E)kMdgL)kY~@mC>l?RH28u;Y zt-@_u^5(W>mDdt<VOYVgE#|A(uSEv@fOheek;xg_<rDOsNOl;gd)!Vja8=hch<)Lc z7C5x)TTnfC{Ty&89Y{5hHW8hoHQfdd*GFRp`xtUQY*_1G@JVU(0G!G`VL(RRLkFlN z{KC?h9ZQ4a9Zk#WEDGc4V`(K#V+h=(@|#!+B^!*`vNb|*0ka$cyGgGYw7@VL2ZaV- zNiT>qoe){#t;3NA7c@<nTry$GxFrj|q+b7*)5;f*OrAfZ+;0o|R!v@aTd;Wd<7=Pa zv0@Zt<2sl-2)ia3b{+ElCFYvhG26s1EhzUG*DY&qzkD1ok!G#8o0Rcq@I~^{X&b(} zZ@$|+f=ffW_Mv|;7CHE_1<Uh0i>{WoY9bYFNoq+sj&ru;Z`x>4ddY0y*`HRtHFEN% z@mFkp=x0C6zDGgA0s|mP^WNEwE4O}S?%DOtce3At%?ThxRp@`zCH6MyzM)dA9C7IP zI}t;YUV(Jcnw$4LoD4H(EM#!{L-Z|&fhNYnBlKcQ$UScR#HH>scYBTf2u|7Fd8q$R zy5Cbt=Pvf^e}m4?VVL@#Pi3z*q-Q0MG8pGTcbS|eeW%R5bRzKsHSH#G<xBsM(j4bg z-=NG2#y@lA_H_D~$e_|wjQMoK?HF?(ofQZ4Vzj9Zx`0FjEN<3>(#$9hj9}0O7lXsC zbZ7#UjJM^FcvdKK3MOEl+Pb-93Px}F$ID&jcvZdJ{d(D)x|*`=vi%1hdg(dd-1E>& zoB4U&a${9!xyxoT%$<MsXn8+O$mZ77dXQPXHRf6#s%oUnHFa~!q_1s$>7gFp{M<_q z9oVnk*Dcp$k#jA#7-pZbXd=L8nDhe<*t_*%gj^Vx>(~KyEY~i&(?@R~L_e^txnUyh z64-dU=Lc;eQ}vPX;g{GitTVZben7||wttapene^dB|oSGB~tmAGqE^`1Jxt$4uXUL zz5?7GEqvmLa{#mgN6la^gY<w3YLNeVW;rdeNWK%R0!+U2r<S&xzgpz0YBw4K8$3mp zE21?;R%76qA~z3I)m~||6<Kx~EuGGQb&th9nAE?Kl2+9hCN)_pskOrqC_+*xeTUWE zqHK~(U3Rb6Ywt2io0Jx}^^QAit`<e<Y|lls)EbnHN{h>O#}`eXyUJ)lFyTO8*iL~P z$A`A_X^V#!SJyU8Dl%J*6&s9;Jl54CiyfA`ExxmjrZ1P8E%rJ7hFCFo6%{5mRa|LY z<hHMFEJ$i9a(4NfssfTL+q=W*C@s0HM3JX0^+}R%=`>k^x76W8M0tQBa1Q(&L`|!e zrczv>+#&b<PjV6d3K}eU;V9%YaKm(oM4Zr(@CHXFAW14hML_r4VqzLAlt6`n@RklP z#|_mXnz0e!Du^;&6ZEY1{U4mQ=<0hS&2o_k$4F#Jm0_q5ahCfmSKsn1pTe)@Q>2bt zuD1Bfoe>oW0&!ju$-LI)$URptI!inJ^Dz|<@S1hk+!(n2PWfi-AMb5*F03&_^29MB zgJP7yn#Fw4n&Rod*>LlF+qPx5ZT$80;+m*0X5ffa3<jfYcXFe-W}$P7vS|L2z8h!H zn)b>d-;F72#5un;L$}RfmR5&xbOf(KNeD|gT1x6bw5t;~j}(oMHcSzkCgcpbd>5UN z7e8CV*di9kpy<pA5`bF4mH@m^LV0vfv)0p{>JAo1YyE9XtfV1Q8^?ViwrKgtK$H60 z%~xgAifVV#>j>4SN10>bP9OV9<ecvBe`%dx>m`EA-H{bzMimEQ_3@VZH%@KZzjDu` zRCG*Ax6B^%%dyLs2Cw{bePFWM97<M4+}X6j=rFmY8D9@pIA_cZHBTuS=i*BuXU_~r zW>50@SIoZoff4mJvyxIeIjeZ{tYpbmTk4_{wy!_uygk4J;wwSiK&OpZWguG$O082g z^a3rw)F1Q!*)rNy!Sqz9bk0u-kftk^q{FPl4N+eS@<V2$_#KjDfHky}YxE6v>0p1= zhaBFdyShSMz97B%x3GE|Sst~8Le6+?q@g6HwE1hJ#X)o^?{1!x-m`LlQ+4%?^IPIo zHATgqrm-s`+6SW3LjHB>=Pp{i<6FE#j+sX(Vl-kJt6sug<4UG9SH_|<oE5<{&zK>( zOb(+Vn|4R4lc8pHa-japR|c0ZAN$KOvzss6bKW^uPM$I$8eTr{EMN2N%{Yrl{Z`Y^ zaQ`-S_6omm((Fih26~Bjf^W$wm1J`8N+(=0ET@KFDy;S%{mF@!2&1UMxk>jTk49;@ z*g#0?*iga;P7abx1bh^d3MoAy*XQp{Hl*t(buU@DamDmvcc;5}`ihM!mvm36|GqRu zn*3}UmnOSUai6mM*y&f#XmqyBo>b=dmra`8;%uC8_33-RpM6;x`Rrc0RM~y9>y~ry zVnGanZLDD_lC%6!F%Jzk##j%?nW>JEaJ#U89t`?mGJS_kO5+5U1Gh;Lb3`{w<-DW; z;USPAm%*aQJ)UeYnLVb2V3MJ2vrxAZ@&#?W$vW)7$+L7~7HSzuF&0V95FC4H6Dy<( z!#o7mJKLMHTNn5)Lyn5l4oh2$s~VI~tlIjn09jE~8C#Ooei=J?K;D+-<8Cb>8RPx8 z-~O0ST{mOeXg+qjG~?}E8@JAo-j?OJjgF3nb^K5v>$yq#-Ybd8lM^jdru2WE-*V6W z>sL(7?%-Qu?&?wZNmmqdn?$FXlE!>2BAa^bWfD69lP0?L3kopYkc4>{m#H6t2d<oO zM-rb4RHzpm9{wcAncBP-$z|oGYL~V;7`yL0TF=DQi;45@lX^I`Bry3%;i)|iLA2cJ zD&=p*f?xWH#B@1NV?V)Q10EuyprvuT-(Wa1PPQ5t`ay%_ybUO&1G_V*CdltU4p|^e z0stB?-MU)8M=g!9-Je~j??XyE_G1Xia8c^kF+>LIEE47|jcI$tEuWzwjmRgqBPkzk zM+(?6)=);W6q<2z95fHMDFKxbhPD-r0IjdX_3EH*BFL|t3<dcW`!>))c7d~8v;<l` z9cOc4;PkP*doonyEp+5!5ObxBj=3fstp#093;Edqi3}76dI?B>{wU5p8nHUz9I?>l zVfn$bENo_I3JOh<pvs`XjXA{<Axd5<=D(OZzz!%s9$+)Sav(kLD=%GEmyDH<n>1^^ z+un~MSwCyixbj%C?y{G@G7mSZg_cf~&@djVX_vn8;IF&q?ESd=*AJHOJ(!-hbKPlb zYi-r+me!ezr_eCiQ&SetY;BocRokkbwr=ONG<Ls)CKFqlbRTn0h9dn%08(unJL%2r zdUhMy)*6q|wFvsNtu>zW2U@X=AUvS^E9eM^w~aztd4h$Q&kF;6EJ1O*M7tJfFi}R1 z6X@asDjL5w+#QEKQE<MUI6g|txm~6wNm96XWpM0snga=U?c*@C(Hv00gBVrANXdvx z>5V48#ASm?H7u5j%nDqi)iO@<OOjW*K|ky8{5@_LH+T{a^`=0Tq!!6Vc7wal>a1@F z*^R+bGpEOs#pRx9CBZQ}#uQa|dCH5EW%a3Xv1;ye-}5|Yh4g~YH5gI1(b#B|6_ZI; zMkxwTjmkKoZIp~AqhXp+k&SSQ)9C=jCWTKCM?(&MUHex;c3Knl(A%3UgJT_BEixIE zQh!;Q(J<0)C`q0-^|UdaGYzFqr^{vZR~Tk?jyY}gf@H+0RHkZ{OID|x;6>6+g)|BK zs6zLY0U>bcbRd6kU;cgkomCZdBSC8$a1H`pcu;XqH=5<F+D~<Z-#2~djpJ<Gc|QJ4 zafx3Y8ElfZ<^ZG1&3Fb^`teMqzPjsAXz8)fn!7rC`gCl=cGu)r3S4c*Gq4a$RR9I` zbygh!Z5_qV1J=<UxX}I*0+Cz_Mi`r=u*<^PZD0p*gr*iS3Qw#7?l#<~E5s~4t;h%> z+$oO3i&T_WpcYnVu*lchi>wxt#iE!!bG#kzjIF<LQv0?E-PesO@fZ7xmz9iuWAu|3 zUjMrd=^g!Fz4{lU|I&`I87urHks0Z;=G^n6O&xEK@pO4lpNSRFihC!e7aDFZttcB2 z3@r9X-Q3(1DE7CGn(_C4USHEw8(7d#?yroD_&xXD{D}7bV{HxP<(JMVUKpr(p!U+= z9sJ&evE$}6Sys%)<pH*0b4aPV4;?_ABJMbVL;$*lmZKAN<_+7HxW54NhyI}iov<Kw zuLAu-eIuHO(?9yvSv27=w*oMg@D}-2EL~EX7+*QpynOa`+6SjKRm&AcZevS(bIF2I zyU|@;6bm`za{K5>qb)`s?|OclRAnzUyW5*Py!P@srDXI}&s2lVYf2ZCG`F`H-9;60 zb<=6weckNk=DC&Q6QxU*uJ9FkaT>}qb##eRS8n%qG`G9WrS>Xm+w)!AXSASfd%5fg z#fqxk(5L9@fM};~Gk^Sgb;7|krF-an$kIROPt4HLqq6+EL+62d@~4Hsy9nIU?=Ue4 zJ69;q+5+73nU|TQu}$>#v(M&Vx1RD=6Lu`d?>zHN?P7J&XWwsvwJt|rr?CZu+l>m4 zTi^VLh6Uu2s392u(5DLaM%)Dr$%h3hRB>V7a9XG`B{ZsWgh4IyTO9R~TAR^h^~>ko z(k|Hy#@bP}7OyN92TKE%qNZfyWL32p-BJf1{jj0QU0V`yj=tRospvSewxGxoC=C|N zve$zAMuSaiyY)QTk9!VmwUK&<#b2fxMl_DX|5x$dKH3>6sdYCQ9@c)^A-Rn<Rh`_J zlt&lRB~G?jhWS|EX+K`5L9k`6=#nb!W7EW?%ai>9vG?s)0)lCR76kgoR>S;B=kl(v zzM}o+G41dh)%9=ezv$7*a9Mrb+S@13nK-B6D!%vy(}5dzbg$`-UUZJKa`_Z{*$rCu zga2G}o3dTHW|>+P_>c8UOm4Vk-ojaTeAg0-+<4#u-{>pGTYz(%ojZ`0e*nHo=)XZS zpp=$zi4|RBMGJDX{Db?>>fq71rX3t$122E;cJ(9elj+kBXs>3?(tq=s*PeL^<(M$8 zUl;u9e6|EP5Us-A>Lzvr+ln|?*}wt;+gUmd>%?@Wl@m%Qm{>Q0JqTcxtB`ROhd6TB z$VY<7t$^N6IC(s*<w33DF&yc0dj^+WeG%4|-2BQb-dJ|q62>Z@x2?Gi%eB8%(hYaC zKfY5M<cZOXmrbZWEjps?;&|+w7tV1eFE1MrJ*_siZ1L#0#n&`(LclZD>-9MeR-@5h zZ?V`qr%%FlPQlW5v_Bp^Q?^)S*<!9Xnk@#nh}mp1o88SOEB+m*%{oDLLdJDWayebj zF_P1%goGu~ua9Y$&Q^=v^6lf6jW86qp0@eS4GR`uX09nN4hD-tBg~gAUa;ZJ8|Jna z8zPe|mipRIjUt=vcHH^U9tgxn+Hm(pY=z=3R%i3uj{TZ1>%Y#Z$|{!Lpju=$s702T z(P}foXu(uuHN!cJRK*W-8=F*QlYB*zT#WI-SmQ_VYEgKw+>wHhm`ECQS`r3VKw`wi zxlcnn26L<!RA|D|NB?I8;L63FJ8~v}K7sD;$+XuL+<N#lUCD#$fb`H4r?HkfVB<kr z;(F9QtS+CxIxw-24Zzi6CHA+pfsJf|GxQQ~rvIxEo5uj_8Jp)*Ji9qdbCkPu;?S{L z1o!sZJjbvRCUxVYC=aekOVe%v0YWg)|4SMNPhKaD1BlcIKrK)np@qZ^L7+8mbudO^ zk)b#%tQ_22KM*Xfl|1h9n@S>*U;F-BC9u{Csy#e%+2uD$He5?mc55)ot>1w`?lr$J zsrI^qGB@!5dglADaHlvWto@|S>kF5>#i#hCNXbp*ZkO$*%P-Sjf3Vc+tuFaJ-^|Ou zW8=}1TOlafUitnrTA2D0<3}&zZz^%y5+t2`Tk`vBI93FqU`W!zY;M%AUoN1V1-I2I zPTVFqaw3Pr-`5HcEFWuD?!8Ybw)Y>g7c0tt=soTHiEBxlY;RlQ`iYY-qdd94zWjyD zFcskM^S{_!E?f3mEh9waR7tb6G&yl%GW%e&Sc5i;y@N)U5ZFLcAsma^K?Cg^%d{PO z=SHQq4a|<d>l`AakzEY;A{n6Rn1u`7v~#ufV<svwufaWPWUTy=#~N`~t5mkQHi<fW z`FA<Y1Jl}-+ID`GoTfY9u${~ohdoPI#lsU?#@1GhX)dh`T;Fl!{L5OGP6ViAJJBDJ zpV59(s~y2U9&jfGy;BDCu?YA(0fISrdk`{^7k>*6GZ$`Ef)d2%6apsU6^>QJl0@U& zq|wIBlBAgf0j!YaozAgmhAy0uy;AjRA2%(!`<c5JH7OZ1B!vm4rC_yi#=>#&e>`V` zg`MfSf5gWvJY#?8%&|`Aj0<@aZ;-q#tCx=-zkGE|_C4)TqKjr-SE6po?cX?Z^B%62 zdA!75;$my<*q)n@eB<^dfFGwRaWB25UL#~PNEV>F^c+e2Be*Df(-rIVB<p_t*#`AH zc;HqtB-Eb)2q$!amvSS&+P%HPVy$^LX{{`;eWuA$Yc*DSZ@Q_huGZ4@Ol^6kHTi6f z)l#v2SgP9cn{FzvJwA<;9+pk=Q?{bop~CCRjxV~_Vy(RS=87WAacOi}RN$2n`jVBy z^{K+DkdDvjzq*1DbPuc1pgxtv0iuigUWFeWRH#nH1!2Tz!W@wXmBa>Jo2o*an$1*1 zD$bsU<F&S$>C-BvObdmkKlhW<59G9{d=@bAu8a05VWCO=@_~oP=G3SmO91AK_F`#5 zwXLRV<oMV%5Bd3(h00X#=;XZmN#kyA@TE>ay<~JYok|rdQM-~C?dcq?Yfz_*)fIte zkE_g4CeLj1oza=9zH!s!4k%H@-n{6aB&Z;Cs8MK?#Jxl`?wD>^{fTL&eQHAQFtJ_% zNEfs|gGYh+39S{-@#MrPA!XpgWD;NLlne0-Vey1n0<q$-*MVI^cPLanp`)hUq)e}| z7juu>?=ww18{L)7G|$1kjI(sjs<Lds{1=|%D}}i9=&YpHJNDt{uDfMF=i}tCvhSk1 z_N?Sr`X9O`HhyGPjjeiuRBSKx6$dOll$@28(#6enVY7OA$`8RH91Dz_R6j2{+B+L& zz(TPanmNN+96IxiR7w}e=-SNWtg%zRx<l={!0#K~x#yw__jF9&bYpd@^9*0xOd0*> z@|a<tA^Ht;SLo>lUMcx*04*>=BWHv_W-t=rCAy0q6&*<vg?_<Mk?9T;qojT!H54tn zjcQJE0gFXPL4i}{Ab#X)g(-*L3C9g{qGk3lO!z;%y$4`h<+(qs_YCcQv@Cf@mL)k} zNxbC5j-$lRUd~QPNKAGdMiK}KWFR1{Kp_MOlodm1fl>;kW&ImkwWTe$lzHJRZJ{-{ zl-mK6+j}V`wobm^^B&2Tl?1r=yWbz;v-F<#y!(CT?-4K(($wWtmD6<j=8=JM78lKn z9fjlZOoMjWml&PHLwQvDG((TE9g7Z#cWwm0Wj{3E?2<NugeKbCX_Ln>31MN9?trDG zMI7;9U7|UsC;urLP%eH1h%U`LJxT3oM4=gpi%X@lpVR9N6Q(uhJ00RWXeL-Z*V(O8 zsIyyVUvf=RXLBKX`!peifjIMvMs1YT0n$0*B;K^yZf&HN8$N%e=EgOejqihLPBT|< zs)z`nNU}BOdT7wYLy}R10eXUksn9o)jG<NYa|-+p5j)^0ybo8gK3wABIrb0o2pu+4 z2ecT>)&=qteGc|XNI~h5R6UBfaPeIHbA32@*>orZsCB4`Q79}A<ha)q;YIYpFEUx^ zaVX0?Z>=z@najfekt-_eTg7a}Mcas^D1ELl<oB8@C{n9M4tgW}W3F5YY*Z*0FBmn} zuvaY)&M>N6(y28c{ur|tmueFvIDOQxXs1)_lKrA`L2-^^VNC#miFvO%l6w5uK2b<E zsxRS3%DZ8>Fyu?hyNLCjTCNRRVW^i+GX``giwc&TpV~OHu(yN&o)r2$K$1kjh@>iP z^&`?sCk#?xdFX+ilAb(;I7<$BQ#6j*jKsu%LEhQKe=>ki^ZICepr3#_2#pE`32i4Z zu%eXsgL)3x3Q-^OPPRhm<^!TEPoek6?O^j+qLQ*~#TBw4Aq~M2>U{>{jfojVPADAi zurKpW{7Ii5yqy6_1iXw3$aa!GLn|$~cnvQnv7{LMIFn!&d6K=3kH8+e90<Z&?075z z1r_Q*zeWit1|lMnj<hnhBCDkKn;(q04?fKL1js!s(I_kx2CW46P*4v*nxWEAq3IV| z?)g*Z<FSyUK9noj98da^{Nq^lsGOZJmS)W@c!8P+C2C9pGBDaoui|U`)Jkd{ECFad zh?~(ybdHOyBsRbubpmi70eu6@qz1_S&<k-Sup<;JGoU0?7nBT`kocElgoj7E*ey8p zf()Iv(;lyM34RDlM8Rrdde~%}%>Zq5K%6YfdLv}ZdQmTk7SZ7}>rJ9TW)6>NY{uEZ zY^9PI1UqUFm|h0Vqe60Ny<Ali(d!LXQ2?Ng)gVS4vQ09X71=JDtR_jaI*exKavGUQ zhUmD|tb`09Ac$JbHUUQ9HZ#5`%SO=<HcJ7QEJ;j+QFy~R_!~KeN~3Jo8&DyGAUW(t zr~b%F17HlnnCn@sBEUx631K*7(@YRuHd_QGcU$pEqu_^TpNS<vW0mwm&>=wCFBtKb zXtqOa3M?2OEN=zDX7z}2$Y{2@WJjr?N`au<Ajm-(2?4uW;f9P`kW2z#jy;0xlSLca zNnj?uV1bZ`k;=c)0NgMb6Ig+iiNd29nW0wiFvx-&5KCkcHIvN(gx*HrH!|ihz@N?T zlDvqb%h22=_(sVltI;4=hz3EFe1c09-8QpRw3<Yh;PAPgd--Nj5#6vcFgZoRELrph z>MDVG9kSH~FjfJRNfsR@yJQp4cQ8zaFkT4>5XQqSVt5c}`-A#Z=3-_mGZ^)Hqayei zhJ}wgZ5UDln%)!;Wz@u=m(6C_P@r9*IMPe7Db`CSqad3ky-5-EcG=*v8J&{RtLJ(E zw2h-ghGYcDtqj4Z^nU7ChgEXO0kox=oGaY;0EPqeW89T6htbZg4z!uU1hi;omVj+3 z0B%$+k$`oH5*SeoG`Ay&BAA%nAUjQxsMlNdq8%;SbEAPVC#qm!r7j75W=A)&a6)3% zdQq$fCN;@RqI!KPf<D>l9l=vmBFSFpD1cAxb@~K-$ZIlIL3W}?#3+|2p{|vZVq`YA zMbx|Xl57kJVwoetAo+opiewCkCIO=uBLEaG+!0U$MRdReNsx>+PIJWN6dW)pfeZ(u zQ8ei-Ht69)ZV`qv=vmorhOkF)Squ;)8AUfh<7A_xI8FGHMRW>~%o`1Wt3|8IMrM%& z8)|@=#ssro9=f9HtN0F#O085{Bf6PJnurfzS_yg?qqszmnQIYDP{N=xqPfvl;VN<X zBtysuidNKlPkQwSxNO8ro{)JGpCejxE8`^OaIj}3iwQu?gHDAbCxVheQH5)!kygSt zv&+awwGSrR4<~LH-u93E>sK^qpoy2&App~Fe<a_!*W_?%#5a2n$z$h|7pw5_y4%?e ziLR?3)Pzcra!aM<;el=9su_?-646cK4wO&x;|PILf>(MB7KCI)$p1!&YEB&%$9gTk zmvlt?t7!>_paNt_fYJvw^~LCqX{4opLy!n)md7}<_s?`gytfSAdoScQWTy&Tbr&~( zg9myGVv)l|4-umFBL0)Y(d}Rvt11)(O4ij#zeao~K$vh~JDn0_@3RjP2M0|79T&9+ z?>Vx&M30Sb15&<{RtpeYUf|n7n5GHyc+-FtA=7H$p6Mh=&M0O!so)tze7#WT>pp|x zfWae>0++DfscU2%>|@oiCQj+6O827)1}KsN^a><x=wCzi9Fge*mxaUxIYx)13FH|B zMp5H>NSI*4?#ylfG-{q?3MMXX$dUH^S6Ni=Ve1d0(janpz@WqGJ?cG&sewpq294Qa zL{huwuoARdt5F4Dbh#?<2ruzSS{VeDAOtY+52t^xJW=!(0f3P&G3Cs^%~Q~~Wq{YA z!QrEk#>oXK{sc&Z7VB1_>fA1^#YyU1Ff<^9G(!V0!JW`n@EDdj$$2SVK6*7$!BvXP zmAC;h-W75(Nnzpro3CE9eV=~Lp7yS(vXnk@$<WbDju^b**6AB3nWy$#eeKmfQ_Yh$ zPHzo+4MQ3(pSUb%9V<q*FS>g3{R`!(UG013==W*Hj{-*F!ujl+np%IX?E0*I&-K^u zY1z1I!`iOu+Ll`UtL|F6Vb?~vk=x9w6}eE^*<<q;?v;04Ul#M%*04VQBMm?DQ#-8R z4ja=5yhXO66^La4D_jmP4_(_JlBqNYDFNk@`w>)O?pZQ#8YKE#b($x>w$3E*F0Kfk zfnyCo#zOpX1(P2yeHG@f<zm>P7}}~GB|&S27%6=@G^V=rmeTB$(w9rC6J@uQmcAMq zQ=Ce?Z0RkF_gu30<;5#jEW32il2?}$-6PZ?au16Y)?kUFy3L?ia1A@%S3<!frNW<Z zQ5rf@nn0pZ#pp!YcRyZyWbx8h7Vp`+Y{d%XJo=XA1?FlRYgY(u#5sScFu0*BmQji7 zMsg%X%1Xa`Y%qi6^2Un<APnBiSo`$ezN2F<e~6`zy$grRgTHMpbwG3e_>G-M`{qn8 ze+|6jh0vqfkhdSb0MvIr!;;*AL}QX^gkc+q0RJ4i9IyOo+qAyHbl<c#_9^C%X0HO_ zzWRasvG9WWu_wJ^<z<(x6ie7m+8V9y=vEiAM=N6NCUr-QS4GFT%{MJT^P%PG)9uk+ zt-Ap~<uLz&|4#Bnn%$V=AkIO9(hZL|f!dN)FQ`^}MC5BLmOxTGVts&gG1uw1kwNFi zNl=HK2Kpz^(sXA>I+$VuZ3UT7&iIG7640a)fe&>NOVU@xZ*YE`oy!JGMY%j}bGq!= z`R5xY(8TK&AH4b6WoKCo>lPh6vbfu1yYy0<seAE}gNxP~<T15Nue<r+;&le3G@dU! zVRt!g>2g^t9bDbexN!A`*$M5`u&}WqF?+*m?ZoW85&MFmXqQ1J{i;_Oz>3*#0?lWa zf?{tv`_JzP7D3x2gX&ICRn(aR$#>;ciH#pO?<*}!<}cYh_r{hb6*kkXSteV>l9n6i zwx63=u%!9MdE>@2X)3$YXh=DuRh~mN2b<cf=#Xu1I#^T14?_P$OO?ksHYhql7O_8v zg;YvixTDu7NO1QGs+knK<B*6=1Dg=mFIvVbfJPC6pBExaFfK~Tt<Bm3jc^~(qjMQc zYZI_OfJLd$CPJf^?<K=GdcOXXMkqT#5g{0bgdntm?vAwjCac93i{taGLroLXfS{`u z-_kB6JkTHoSU4AZ0xu&E^_l87)i;Gl)Hl@!5JRt@+{+OWM_1iD^iL_R-C?vbAjKb) z_sRQ6|3ThU7;c)>QFEH&_nHWfU{q+4<w4yb%;Zj0qteU!?%j3GhM`Y)ynXE63x%`I zlbkkl_WlK%`i{&MjguFpmQ2omKUi57FJX7WAlzzJH%;CNDZMal!|l87-5?q-y!+Vi zc4Y52Tb+~4!rFO9`?k&<`gHP=)S}74v_QNp98x#ow@x#=6Vm*h$ZQ?$;W-_+h`Bpn zH%*K2!C=D&z*TU7!vqZ?^yEceBccS&2esJe&QDZYTGYXxC7t$|)qgjSb7&g5G@4sP zHvzzM819*(u;*fv_9OHM3zSw9Ata{l<ISwZ?8!U!59+8#(Mh@j?T#{perc<gk!N+O z`lr%f-Y5AwInY7F70{L<{V4T1>=t07pt+Jfj90Or;6JX{BCQrE8bZe&wi3fwEXHRp zz8{VAmxsWU)3nT;;77X7@GCm7_fL1p_xKEG&6G~luO;Bc3ZIa?2b(*uH7qJ!es71c z{Buj4(;Jds$o78u<3df_2~DLq`e9*$SGmrR9p<NOKaBabz7+pZ{Dh4lYirHwpm{HU z3hd(!-CV5N=j!%hIpDK~3twBB4GBmeS|AzWfvm6}DPEG|lUoxlypTiijSA8Y1hy)w zB;2lAnwp8))Eg48P%ZwwxU1Oy^A`3^oiKhvS?$)KaeS5HoZ{?b^VT+X2<lP&*r`*; zmX$O_mj>2OoVB5Q(KL3M{1>eq+;+lHK9N?xvyBPHni<#j$sZK{QrKEcdR9+eQD0V? zGPaq!#<-c#a>t4bt+R#Hu_|}dlIGeve@SR!d((u)Ga45+BuhHfA88G0cPrw>>(`ID zZ;aIyn|qmhuDXBthoW{J(WN+`Yud=y(wvd0rm&1*4<oZAz!P8_BUcs&>>6?#8&)Fz z&@V=a0w4)F{^!&W_l6<5xg|-0F!~>aCALbeVsZTd*)M*^tr*!)O8w)mzKThWyQW@X zw%BFs5_@CIic5EPcTJu8=CmynV;``)3}gJ`Vl#VY_3Yib@P-KvBk_%!9OVu<T3_4Q zJ}Wh6Uj5jGl>#8tG|Nc4I~A>8ch-~X%M@!>yk~ERI|QEcwzgI66IaaY>gx0~lm<@f z5-k^OY#SGC80Yr-tDRP(-FEJ{@_4LHsGJ=)PKZ@`eW75-r0ylN%0Q>&*M;@uZLdJ$ z)rw7Dt5ajr;P;~1P>jID!><(7R;w|Yf}qI&8klT?1dTfc@us5mKEe;qw;YKR(cp-D z6NmUMP8x7cM%~ytE@l*Mp^oN*mCF`gRNhw3gpO1PVi_^JzCJo>#mX(q+iJ(Ts$5=! z13b4<S-Zh5EO}|}9`O40iCKDwXte9Sh|o8C&bIT8Jh*Fj$0VQARU$8Q+egBv%Mn3X z!Qcx59^alanM&*z+Y<Ues(;!yzdbUx)E%iRZJRjj?gi^^S=Qd=jY1Hx%nT_;+-3+^ znMLmi8mcXddd*MHo7*sD;)HOdVeFi_yL;|o^NyEPowy?3H!$HRn;jju;n3DfLNQpY zqxhdU>5gILEULS!=)SmZ{<rUozc<?661*oo@wI@|+#<T*dh{>qsC1)$8-4eADGR?v z>~4k_SvdvPHAC}=4(!I^OLgQ@9EMDE7d$PvJbi+K%-H<G2&1&Ug-+g;!=q5Z4@4oy z0Kx|tUslEKy@~N5qtgl&^V3QJCBYfa(l=Oa8&KA2+$T;zZ}2m>Th`P0#Ea|Jm6zj> z?R)<Djt=~Zzso(z-kZA+zt7)&vz6Y(tF82|`)4=v_sZ9)L;Sst=d){aPlWQ^1%{oJ zi(g9gzf%{`%^Q&xF~Wi-7H`-s2S7+tJgON)@FNH^jqwAO(+Q(4a<$<K<6&oS^_MJt zug&xmldPHcv$;ma9<e4wvW_55HYFyk5xZgpyU$>(YWtZoIRx>AqzlG1UjT@6ba>yE z{Wf<5moh^-hu;ptAtPG}`h$4PWcOn>vy`#bH#Ss>OoAEE1gIbQwH#eG8+RHG0~TJ$ z>`C`c7KyM^gqsVNDXxT|1s;nTR&cCg6kd<-msrdE5Ofk=1BGDMlP2!93%0c@rg~4` zq)UFVW%s|`xb>;aR@L^*D>nkSLGNmM?cv)WzHZy3*>+<LzK@;DO4hrim(_e!_Jv%d z6Fz%J<#!SjuKW1t&KC|$?A?EL*Oq(3*05n5<oc7&y8YJ=T=~t9mQRZAT3OLJb?4Gq z<JC3Ox2<CP{tRm|3f4YSHz0Kk)BX9{xwYV6xysQ~=ny`qa$Gfwx@-Q!+1jOkQ=NBf z$CH1YzW1rVEl=)0t9HRWn^!W+dROBs58n3RHGLgaIbX~8NlOFk0<NbEeT*+%QTbS+ zjV1nV$vv0Mn$WxVs;Qgq4$EeHoy)Iut~mPU{g*%V!SasEUCS%RPua0}=6H48hC7EH zk@-H%b*K~}o1*GACtx_ngO^d~_>*xAJSX;>))*XRT0r9<#zIpug(}{rSC9T$42@gb zy8eb6)~}wl<=or)2L}4T{vum>-g)QaKjtnp5fyd^;|BxHt<f7_xUqfX29mzKzMGPr zFI+W>x~2W^YbKq1HfB7@>Hw@U5)?b^H=uNOpli?w6O#~V`eG;`irLcC(&Uxz`L_Cl zS8r24e*U71o@dV6Soupo-}Ttu*Dk&EwY`h4KdY-k55DSqR&o7nufO)%>%s-Es^5Q_ z60#cReEy=$4|nW)bLh=|4bxW4j}A?qOle+wjn88oAeYb~!eA+EQ;8Ggp-UldAt$3M z7*E590amz>YB9L(z?Xx&?I37XYw?Os-t+05x6Z4vkzBE6-hrbB=GAB?p{DQXV4CKg zls@_wh*&XC<3R(CEZxg8*Y(6a>cIOq9Nss7{=UQ7Nv%O_WxSyBqnH{@(<>A&2on@z zn57W4Dh*E)o#rJ2#tyxV2;C5#rl8%%As$4qB=IbMt-z|jnWi>>7Ymq37;AW!6Y4nx z1Ogx#!WVdA92mEipgUxzy_?ddg|x)KOCyK)P5v@usc;0sN3{=0slt4CuwaxK@20eO zhdp~Z8iJ7GWrkq_-X`~(eBpthn9|`tZEUCIG<FXgMLh*(G&pfz3`a<Ki+iFUHjfBn za2~?J_QLeBaKDq%gZ)6pk$MNyiuBTm!Q>iFpJjjxPVE9I)#z3Q$3tw`a69qxjuf+~ z*?v>d5~pcH-AQ~0)8PyIjumD^?SM8!<YujmU(k2xcdb41eaGof@IN|TkkCj*=Dp7k zzhR+W;JWWvD?x|pV5R~OT8J;>Wb>KZoD7hOlc2nA0_(eG!i<ZX7;CzC#)NOOnG<T) z%~G#jZJts)34rm;-#V#wig}g#&C1U67tfP3Q`U+Thu$ZWLky0O|6_g4*zx1X*6jUV zf-PHcxJeyM8OD}Xx!qM|V-2Yf12wlyp1)-c@AJp8o}G&;2WSM87$*7@|BstjLE%DD z7+TZFnkeFS!ZgGirKoZ~cDDKyTgx^t5f*LO{EZFLP3qGNmrY*kwWv>n>}Ru}>6)>5 z@*}T`Hw{I^-?PS9>(<Shea<;U?_^&P+*@}~YbtNb{)*kiJ{~vjaClr>#UFBQpW72* zsfj(2+_9@5x+57aN!`e`f(Mp_I(D>}p8)<OpI&$A%j$b~e@p$vc?M>@&g^g+X1%d{ z%X5boE<E(ymUZ8oeqDh?|B7u)x#ezF`m$IG7~A(=zVzmU<`Ux}lVD!E1<7B<TQjB} zDv;b?zVQNp*Fr!99oApvx5%a~lE-!>?hEoj0CiwTh9)#8^?~;|wgor_=Z1BI9_dI{ z&t*f95n?ZgZ5CnQa!v(p|JT?y0%KKgi`Smi9k5r!+!Mkz=&Z$%CFl;?AOzV`YBKrY z0#Y6~J6&dA=m>T@TYb8ukaV4z^Z?V<l9Xy&tR;4CEXGJPR?F}$JJbTm&uNY$Z;Q`l zA~9RF4PUi{@O|hTC9i<b;9I9AMX64c^uS47E$WgWDh~7xpBp6apy;in*&vIzoIO_l z%#_v!Xgc82N%kHf4&r$&VLnCPB91xHe&j#p%13@@WOqBKk6E<SryKR5#s<U2jx|nC z&z*-n&N^Wo|0Vk(KMA>X*MCKcp13-ye1*`gAj_Tm@r{fpm?K!U@Xg2AfndEo6jZN} z=XK0GRNXVLW2c?}B)rH^yR>u}b?|p(W$!TkQ<TY#AFJP^aZT$28UX8pkM=)U#1Ick zkn{$OZQ@U>TAgu1AIG>MFfNchMQB_^-AQxRE$Th5-E_tBP@v(Cy|ojjP5LEU|JrM8 zVF5;$><F9!()BUBoBfI1Ev11Nu>Hl^jlHWDPChrTH(vh%bARyj5#TPb>omAs-)4zN z9?9(wybd0$Z5s+}F<gh{I7;dJ925oi`S=N-ZN-&{uKtgE`g+faR+iSa%%AgBX1?d1 z?7f7WaQq9<737Iu3RU4oDZS;1O^fbmYg^(`D$MpRPyF(UKVA317eFlx{_~4b7WVFW z4eJ9tsT22MAB|u=g&r1D9P4{hA#ZpnClm;{NaF1=h%u}U;x4x(`<|^#GP_*TPt`uj z=(f4#e~|)CHd6`8kFXn{pBI1O2@LKn5#&;*SiO;19075H-Cg1`n$_{^Fu1U1<?wNq z7VbI(zC?}<g@X4pJ|oJeB~NN|kv!>iytv}-8U`IC<{6U2_NqEAkv;7lys5Qcq3EKt z0-!^Xy3idllgZ~qX^QTe=i*oGUCJNk>Y26?+9U(Ks|C81S{-v+6ebc`c(yibQbuB% zxM7mk>}dI-TfUi5Jqdu6b`4SqF)y5humuCaHhssdcR(jKf5ZGprx;Oe7VG#G6TA1+ z8oZLl<+ey(L+$Qsck^4fi{I|)p15MX73gHFUU!l${lN{)Ht_Wb%j#<CYLJugeD?U3 zJMP#*v}NP``He!iC2mv94Gpt9%vE}qOJ8N~m|b|?&|p?<vhXx>UE6cZ9}Wq^>+1wz z9TBA@%f~tby^0YWafmn&8Ppjn1Ng{d;S01WImtMzV<`!zU7;+8e-Xko>qM^OfOZ`Y zEZG#vcm>EGF??&G6+v(3l`X(xMn8ESv=@LdMfdcxFi%g1?0HDPG>blldR`OLlWN80 zz<$t+MM9%1K~JT@#aBZjOu9*G{W$u7cqTM|&a1)0wR8R^*r$<&AhuCq1Z{-aUhc5P zdyaaK{$P=Y6R{40FrWmLbDOCijqB(1PrKlnL)Tm|t=l}toVLAZOXJ*~-dx|_A&o65 zskcpT@bs+d@ia`f)t8ivl{(t%H?O?;=^s3O^GXqopx7E3kz06f^UQq<>gyNmo4Ij; zrOxuzn{WOqP75~PwPXC;3mZ#YW1&#2xy&DEXsl~)u4`-v_{*B<S!-$Ig>%R6xNH3* zJElz8@d#i4`#JV(ko%x;u{LMqLEEDmwD*(ccB9Wp;u*9I?=sC7g>%L{%$4m#zhbjm z)gK{LWQvE1>_yl|4T$nYKNVZ<)vza7FKU5*W~4)KNgN@;SA<9&ERxIfA&UZnB=r%N z5YD4fY$9Mkzy}!G+`KU<CJfhQQGh_2W0A_!>y>3l(FS<N0~Cz1mx58QH4Axd^9>i1 zw)t)*w$E4#ZSxfm3cZLC(o3aQQ7uHk>_@fMTHoM0=quh%mfN6%{`O($pyzg0kPf=2 zjA%M7bRl4BhV5{{d4HbnTh`HM&<gjN3kv%=W$Z`e^_r00Y6SpwKb4mCD(Z)4C?tx= z`KX-#*9u+lh(<?iI~uNH65?WVcc7IES~!dVUpR>YKw@N~47e7NFGr*9<B4Xn!7P`C z4LdYduN2qJHY~A;Te^J{r$gs6V?xP6HvM2p-_bDKd%_S{@$<BH$g<4FZpiB`Y9?pK z0nj}xQ~NJDbm)@q14l1h<!J7H(X(L^FvWT%ZScI<S+QkHMQ7@0-^#KYn&mZRD+x7Y z<gR;nrFlw4bB*Fyb>Yzi(7XQl-FJb4hPEKOC!K2x$nWy>8=PJYE)T$=Cqe(n*ChZE zklF{Ms}h0Jd|@o;Gz(~b;9d&c#0O^j{1?tF5dtMj9dG`|j0qZi^aF1r{<7KC5hZ`E zNX2nxJYEr@>u86|tPjTDet;fLn1R+IOm6&3b*}TOyN<p4?y-ZOw+?eijq)nceQx!9 zF1<VA#!XeZ0HYw?;kP^o`NQkI>pIaid@W9c9!jIfiJOgK-aw=xb5Kpb)`E9x%CU82 zEQg_v`e+tWYClJHl=_EsSW?LZO3)o#ox(#2UW9|V7I8fYnz5fRtph`u)dywWL9}UV z*hdU9-BBK5G&}j~O6&dSdWDIpFX;&Or5wNbm^Y+A-x6(K$$Of6JTVl9n0gFY&=T5p zZX?pCxA&w{J)eDSfb?Zh*LT#AdiPlB;A%p<Bq7W(aa{j)HJ#0%)g=?gRG9EDg#n7r zMdJ!BkA1LSHx=!UeGUUkV_RL?km58Crwq7P90nCp33RRX1Z{{!1>|-`Aw6RP2mYTh zLmL~zM^VS0V@*4LkOEG~nQR)<V(1f^1fm5Kg+gLui1gBt^%q}%mf;vP*kr}<!Q*k- zya`(hCk0Xh4Fh*E>HyRB+;*KWli%QqKt&%16HWyMXRhtwdCgyoTm*5#itgp(Wap66 zyr-dgKgjl&t?JLMuw}!Boz)TOa2|37p^FAcPmxX0apWmfp$B1WF_@-dsK+?1F6~yY zEwi!-))Q_CbOP%?p%bx|=d^nLBig-_$e!nh19^Ps`s{SNq{nnW)V-qnz3y+Ipd7HS zsb}z<Esk5=f)PZb3ECG4Ig2px3-625(}?@L-;2{1-~Zo!|BJp?Twmxx@PBTJIR%Re z(MX3;x<{^v+Dp+kh69X1hp)wg>%!+}y8izoy>Nyyj4m_br&8TGFcze#gP4?v*NEdl zzGBLM4qpvdu;5vC<mb=7`rk^Zp6)XvB|C8ofsPJn1YCh>Fi9^zXU;sW`>pPi|NFD# ze=<sQOFyXEk?~r>$xI@7q9B4WPsw4CAO~UJ(S)s@u41E>#9<Bwg!2FX=>D>!?<Ced z73<(hU49huS%eXpA9UI!*?DVYlclgqX21of{@2Fn7mTQ(TcmWD7VPj~nvW|nqnT9o z_Hu$dLq~pHKQes?&k9u=h=b@z<!}@<-D?LS1LdV~=))-4T^jP_oWi>=*N5m$%^0E` z<0RjkAj<jntkEX?s8M(5QB5~HybXimn$xGg2;HpR_!D@+==g&dL9KHY`T*@S!<X=g z4rcQD+B7W#LFH#kD%h`SarmoqNKGpkequFeALTMSL>02TN9RLX3Js+GArg=Nu>E5z zPa!vMuMV06#7$1dLbwv+VGT(5V_&A~Uy3T^+|y~Q2>lA|=hZZ)ex%G`rhkN54C5gq z>w?qN=A+LgB0-@s{OJs7Da|z%dK)uDH4?m5Y=K(N5KWL)uqDxwBt>QmOk(h~1u6_s z>9x>G_+@bJhBQ;(Rr?20>Tjn}^Y`|rQvI3Ua5$aGq{HFf4BhwAFVk2oHNbk)hmAri zjQ_!g*-c^AKM>A@je&H)i1PsJ5929F<8bLXvONK<o3lUBL*4;8FM<`KiLAf~s-eY| zNJf$okV!)Nq;5_N^iCk1kG-1;vw^Uf38%>4;-n6d;Zm7Q=G|k6Fp*AY!b1a`eoS*c zF413z6`x;!NZV1k5)sv<jba+WM9JofGjJc|L8)pdeoYe|k4D4$WS}2J^(h1fok?X! zE)Z%4XYv1x(%$CyrIB)JBAwwP4O<!IiiE;x6RWsfYDOy?eFNXpN`=plE}4)*S+r6W zzaUH;T`&Q3_B`=Fr6y2uV~C^0^dDAB@;H4aCY|n~aG|*ou!U*^{LNm+MWflQ?q=7q zL#KWGC{Mr>;-Dqjt?t&|JLNGSA2yWhU-RYC^oiWI1+idw;6*>m1&Io`^iPgF6c$sN zw9j3KFYs@%*HNz1Jr?F^RiLV%@DyQ^Dnc1h&59pWKhD#AMQV~3k7}>c@gdw=dyRf5 zHGNU7bA_hHWUnI-9SXt<YCy$e7oYYqZ?Ac}M^UZ|wQ`N<U!h>jM~LT<QF!MTJVd$9 zSl!dKf`Fc+mMQFWv=bHVG>>U5!uS#{<o!rmVUrdOvS5f|Ako0d4T|BcMYMo=njwO^ zGEh(RgvG;oe(6DQrrzdx&SN&INu+*7Ir%L3avjLdJ5!%9-8@#0JgHBp?zx%uB^qC> zKSOhB>l^nUa&S8kEFoAUIDG}(Lr#|uJCGb%29Xr>1S4yk0d)9hoJ7#4xNbi?5Dt?N zBp45evje1L)<Z`vghl*}Fd&pvoJS^Tv4xXtwCLD7dg5ykS^`N?DIMh2T)s%L%gB=+ zYcANh{8GyKUaYU&lMD}eS&0PX3oeL3xe?Hfm7XTnPoL(wP95wAN+|#QAU-em_G_?B z{o;0~vmZXE(4z||kcNIM_Kpa+m7&GGMCbHkm!e`pc7Xz>A;&Smy9J8MJe@<k!l|t` zQtX_c1^Y&>1#HwBFoYPv$=k%GOaq!kd58)tzBI~EkGG3Rqy>GOTce-p>jH0rb~c(K z1|9q=$3)Vdgcwyvy&>S3p(f~O;~?XK{)Kch&2!gs=%kNH#-Ee-i}S+a@DNWR(Xnv< zv7kIUUD(c?<t&Uq)Lc0kt^(j9G<@Q%>RS|JmPeXBC6cbxUl6qRxl;fFAiK%!>EzFa zJ$-mz?G%WqC+P-l!DLX&nfxzGAnLaFsOg^Vq~gaW2QQ<(qixj#J=;Y{m`?kHkfO)i zdxQ*`2Jr3iXdj4QE%|AlQ;|<Cw_QLv^TG%)Eu3^19@P*teSQK_cS?!3_b?PpOrPNg zDU(eVmzZAI-gAcMRBj_^`IJ5bd6Nm=goKJl^RGSUYd~ZagkpKGg8Z3e=p=q^^yQxv zpS2Vudw@jKJ_msT=JW}ZIK`d4o}Z*F4;9ciXQ*S%!8L0RN*`;#z6b&A_I}}tgR3d( z<LZMyL7W7{6j1-2Q|E%FNYCC#8P1s_{s+CfCi^w*$HUwKLEWjnd64P{IyPrBV!<6$ z==o8~Z6OPXpQzb3<}4kD?Gz!y<?(BoM})$O>Wx~pKrr7xu<l@1AcE8Eue`3NFwDSp zmx&I<t93eDvK;MPx8tjKts5Z2EFA(c=_s(R@Gtkbu>NnTe=t-AO)iha6xDYpH}>yZ z+FD^H2VS0x4us;Wo_95^kElZ$>j2HW@wyeLi3i%Q28NXxQT7V1{iHY}Llc~!Dkv8* zM><6X$}-pv0N#?+N%W`5%}K0Is%8kCOC~LuR6+;gtHYPi9=dqUoin~Q<Br;k52e-} zxq8t<i>^MhE;TSIe$6dEI=Xs(`oTlj_C-3c4K<znz_wfNzxCkO2evhZu4P+#mUMS7 z8GYEd=OM4f;(ch(iYw>T+wJvpu4Kkn_RZVg5jE+RF`XNx?0xmaV~bW?v}wVTXn4{5 zO&2X+*pF%!%qu@3SLRk-npU5?`f_cV9;|pa#ktlD9VuvRx;TK+fWUv_$vC8-@TcO4 zN_-D6?7|-4!VWMEgQ}TUe(c3w4{eyxe8C5t7pS0MFe;X@U&B?sVDIGR;u>?mPyb2F zV5WLiQ2mX&1v=E#B`oe9yk4Y2^CFRk8*rV6<p~YyuWOHV4Q7S|KY_E$w4UX22xmuY zE7aQp&S+f)+vfXTKUGt!$|J13W!l#|C#tu#OoO(7zZ*Wdx_^8_nA(-|tDKkc!0r-p zIEj}+VF`c`Mm1zkg^G1T?wp_6c~C!{vq1>k1!uW{m47&7E!m%(ANz&+i<mJGEE#Jo zx#pp3N{r(g1FD(NYXN*a{;@fm9{Erm`tXrWI5X+PN8T^Oeqb+Ma_g;^AOmF6vwnR~ zFaWEvSNQbi8O+J5^cuaM%LdE!8ui%A1@rdwb@Oo;KWrUv)+CDynmYfDx)}qF<8rkc zTM`Tysjh1BzgM@WlCjQwwT#BGC8(-k`k&U#0u2En5J1b1YS19#^8YVirF1-)1&;^s z+jLNk|MzO5DFxY+|E<F3=scXXU557eFCihx+jHdwN>xrB^ng(;#RLHnX%tfsjJWM- zyBo5Of=eNl8*;gm`o<fXBX1wcyrDvK{Dzo*gJn*6hhE>zE0weGdP7~Iz5$$pI`$C5 z`U46T|8cnpt;J+VO?%~H_`Ph??bcn%Jzu`2`z~tc^<e+UI)xP&$n(S3h}kuKjWp;t zq(Lp9T^N2|l;#Vc7k;bo8XAG&cR_IEuUn{03Tcc+h$jxoz|ziMC;p|K15W(Q-9eu` z1cFiQb!LZu=gCHrkGjo2R&`o#0GQH#*HO0HDgV#X21sN+15zA<W#P!S^AsN!9J7Tt z+O=BvD0h=PG3_TO&%mknQ!PGrlK<&Yn*QiRA|0vw2uBkIz<TaOe7t4oD^e$8O~BUa zBAXL|;{||*8KpMNX$SM(afGbLEi|#IQosu`d(HdDVR27CeBGkS8y;Ho==+}>PoA?r znJlfFuxIeRC?a>J?C!EC2Bn;dnhn3XeZ}<B)b#BWH>sbjb-10*a7A?aS00$P{m0wm zO_v_`nJOwO*k6S$tHR@xmt`N`;fR%l>^^ZvbfRm}PUBtryK5pTwRdIZgj<#_irORP zr7I?yj7m&+KkD(;PKtLXmF-s9=>`j_AFjI$YN7_w1g7hD(md1~ysZj9;u_Y4i3Ssz zgRH~g_UH9AHR4A!67Z@2zch=Odh*4WzWc2=ekK0-ueW&=xy{z7Gz9CSbv}Pk+4ST# z#ZxnW&!Z1tS0A}`@LT_*wh{sv=f-Dy+2cPoUi{nzYTGjx)eit9s#G5^D0+(|iNBlJ zV$vUX35MrZ8K19VAN|i75_}Z#DO`R~MZQy~2$6gqOvN0Js%d70SzJm|ER&Jy5k>-I z!fh9^fC*zr22w0EG6&Uqo`eqC7_L8gi(#?!A>;y86ak0F7|oHQIhmW!15hHkZ(*|o zF+vd5r!A(imA-b0<VBdKUN8Broi>}qc4-&FS58}j>!?PW$SEg*;W8H~a^e%b?2`O8 z*`i%!x17FmIo=X;^83K2Y3Hja(b_rMns6%ts^>=(bA-9V<9O1I>564?R3a}v1yYtH z*l6T7AY0T66-95WtZgaP8(}|MBGlfNdh@=~Y1m!IA7($BPUtE`qT@h@;M3Hd<i#;> z;_dtQw^?1x7-WaPK4XDxuqd5+qVz|PQlALGw|x}&MFa4RtVSK`(e|RtFN=u%s&M?) z7+HD3$diG_iYZuX{0ijc(*2C7cTX)p*3LRRtn3r@wq>%<@A9jY)yX*d<YnruVRt?I z$Ge`gQt!J6+3gm(PBfc4*wmp(6%VoXQ(238uWF6NtRH+}jYZghv3233VHW%Om@(>v zSq7pIH0)jCA$)wa^7RfPVlWXzzoH}vzHmu4?W&f|zEC#fi<;dYS!Z*G+=!O(wLx7} zkfS~!6{@R-(Uw86L(mJl7`6&&tfK<xNf=^6_XCUu8ur|r1N#l=VNU&`*4XA+3xiN6 zAyXvFc8Uio)C-HD%2=FzR7&R+I79uTG#BFHe_)iFOrH+GE=-4{zrkN`W+aW+i_JTK z`>Dx<)c+WIlqL)3pSX=7*`N5ysyr`8ap$bd^E3w89)ZgPiCBi|f{Ji<FG*G-wEW`% zb_kg0x8xoGG@_?1|4(>^U)|AMCk%95n_gVk3|_XmE_Z6(keo8NCgI|@0sfZs3_s1} z$KK|ZCF;AE#cQiOrv*z^HWTBHM`H8Hwdx20FDq8lu^{(Q!@5s%Urrmi_ZX=7)j%7* z2x#|wO+pMI^e#2DpLkU+erWUorFxiNlu1s>XIg^5wIEm|<NqYAKz#tgiff*fn0f}X zH6gqc8Y>joek2Rd2IsPtNkBRLQTFsnoh4v_<(`f@uV0I_G*I9RD+?L~j{1bx`#0ta zEeZiTNBzhh^|GEN+1vl7{w)Wm!`yhLKAuC&Ve`GhjRo0c|E^`tZXfkQW;&_kBLS|M z7!XYb?!E&&=u`h5Ld{_dyivFMQHW{aI!yVS7oS=ttZ_4U4sb{P=wmO6wCrO3g8Cir zRxN0ht{}^=kNOy`2fdgiLzr_8?$^fWMSdbcHb<)&+4+$`i%$>mB*aF7fv0tiFWhcK zRThLy0Mtx?A6Q34Vn$tJOcHkv?-ldg8_%9Jr8YX#=C;}%u*pWq^?L5VVi61EUkC^@ zTi3LAgna%bC9aB?Qos0?XlUZtnp9cISx)1AbGeO~JGb1<*DpHId@iRrT4e7+!$h07 zWDZ4FAXQ;*hdB%9)8U`#Aq1XW1`G)sm$Ol@ZCv2#2r5~I^BXuYJm%NgOkCQOAufat z)Mo2&C`TDc7EDz1sE;V{`=Bx<#5gYrDb+@@FE3>Yx=pZB79-7UjD-g%Z#qc&td6cl zI`S1u2Q2b!m^1LOg{LEV_eV*@<A9-FlOjf2A{_Fdsdcgdw<b}6Vv(B@15RD*qXZab zGz8+iNI;_yFaPJU0Fd^84av-oyHqv((`T<kWEsJWhoZ6M2FCV3^Go3`Syhyp=btsd zxqVDigWb0^7+bvc{A<V0Sur;${^`L7hiXh#(O?ohffEn1D04pao)ia0rM2e0htyBh zw}b~@4wbr7eO(CW9*K`nSVF5~Wm9&qZ(Gwov9=@9gC3;1kqw!61?mPZ^p~ldeCE1| zU%qZ1WK~HVUALZd&%bus`VF(CFRt3JUk=r?Q)@PLYuCi?1XT>cFW|i{!+a94itA#8 z2;?I%3?C8LQn5B+Ac|?$1Ejde^`AH_B}3`>#H=np*@<fr*CMXd1TQ1CRL&_K($$Tr z#96|b_DJ2yxA|JS1veOY96cL$3I;DApFr+o{Tp$trocX&{NOP{5|u43!pI<e402%B zM4wvdA3SVLdTD48)&_a0Vbti;D;JEJRo@*uKg@iV%FDJiOj;5h6Fqm~l8eh@<qff( zwMR`clMTp{LPbnGy0$0Qfae!4?Ku~zmP|_hX)FU+Y9Lxy@0&2br*_dQ_S8c9X<y=w zgbcF7+%h57T|aBgf|aWl)%J{^;H$5T1_TLMnM~3Zy_ze@gcd9{qrOIM4%wrWhI}}| z^)eJZg}gqrX-UgLOI%0m0vFBe!nteO62g2-2>XDR^y^=fZDd~Fz;wS>e@!M7JaPvv zPU?=U|2$6iw_+;&j{0oiARgl1!2p}_PMTg!Yxs?H%{HmJgU62_ghA}_;}{7x*brZc z@>!rSz|M}1YPdKizI;?B3~2O%LY`8A1SF;-m<K*j4Cd{v=p*LXNG=-ER`vGd2a~P6 z=bVdBB6x60efFOZY-#f%gsmbnc#&DXG<(bOgPXoCEZDgD0<8iqLb-Z-`rvV;w+SF> z+Oxu{+PYOU-V9O}bVd$T!;AU2M<2*KtciMEC29!H9V-u9ZUJ$M-4<ShIr|tXrKWbT z`D><Y{dE@|XmMIgt<IJM7hSi$OEY*8QbKz0rpdFP5g*U$mOXsszD2Ww2EfAxXD!-y z<-^Ogg%RH)dPz5o4-q9@fFG7wBX$sZ>#Nb$5QVy@LP8HyfiyK->WR(e1g77J;isq@ zxu$>@C(@*mf}RY@L8hJXBrWMOEKDqt3i8iwFSwpR$W>G_j=iMN>(!1>S7GdmXt%UH zpfdn%XxP3S<>d1=1{yBn9c@?(YZkyN<fb)6_r;Xwbe|ytusrg}0*9elmW$u80{>N1 zQx^M4-32#mo8SKR;r8t_CV3=RwbSNzS!Jbd%GS0L=qT*0!ERw05x~DzSsUKHYQ||Y zuwKD!+2nux!l3~g>0-F=;qnW{w$F|jqXuhZz#N`4WtzLDj_MYvu(*X@fb3G;s!oPE z?QMW|e7J7#=?C#3QWQRp-~(1;_=?J(Y^}oNmHRoN$^y4Pv2Z8cL)EmwWVNJh@>2ER z)el6y-IQ`!2h2{kx3}jwTf$_!N75)(mi|n=?Ylj_>QzqjfMiO67Wc4{rOcF4JS+{j z&z%duf1`r(U@ZlI{F=sZFnCG<!~p^JB1!~*BFX@ML;u<X>Jv}cN<(cA|5AP8m+HUK z@vG9%#_zOu)ChxFSxmKsBSSO9XX%g4SU79e4=G!|Cgo(;VeA8dsRxIZ$Eqhj(brh0 z>Jh)P2`<<#u_i^?L>%2jxXAxZX%?<7l073C+~1p!t{Dj_9ZxL$sz|_G{C#{Hv@t=B zP}EsMr62u$;U#=d%MRJHCiNv=5OI3(_o-A=G_9B~AsrRui@pzUDE@tHg#6PmWEuT^ ziPt|@8=kjTNmkqdOlyJS!m{E9I87hqn;%9rT0<0-L99QeURoy<D*!&^jevF<)nUT! z)AT`#`;NGXqh(2qEP|?uDsodxOo=2AYe<esea@j9#tIvJKYiZzn2+^IY;$9FpF?ev z)9LIFvOg9dc`W;v_gY$RQ2(-ltrx;ivNunxyZ?UFkLj$?i~bkZTu6LDXb4KgAR}J| zCS^>K-&OxH^mcao3^t~WeS^K<Jveis^lW@^CYHAs)lZm(ZMfyW``BVOh6XH+7pDP> zH`XC|VCLo6*duA78O!ugN@5Elxkhd!CmdSX&*f=utfmDFD9PkBHMk3&aFB&)R8NL4 zD&i)OQL<Xj-mUIXo7Ek=&j#eS(SsGU*Jm_3HgtV*TZUGd%*5$1jGR7EySeR?t_=>O z(Z_o2Zs~o#^$zu`{XU~$I{T&vAH3;ofJ*ZpJ&JR~s{J0}8cw}`t#a3NvWA?#tMY67 zLG}{Q{#6^CipQ<Ze@-_<(SF1-XcPlg5Dr;dBvQ`!fSM-T6Ddr(E3Sd74(BL?V2X$P z8c~UHEZ`K6=k+XAgTAh2(4>$*V2|W$g2v->Y9+4=(K+K`;I4$BFUb9!Nrk0B*fL+v z_lcdO1uEs@|8I@xoKCB{68@q=)}90JCVF33Lb?M@bC5mog<2~vPXXzk7B$|75Lya& zL)t=%E&Pk`S-PznN<)4iAI;NU!@f0_V&wOND{4!~b@1&pAN$<uq_`Xeq?hMesa(bP zh2<#7d$>Goqzvq>;o=lr=43Xx{tUtEaN3B>CWZ)Uac%%Y9--wFCA~Ek7aAC_APm}b zpXAnlNOIF+;t%pPlAxIkvv1neXa8*XxNLX6ZDDR(+U5bi-=^>US$+3TyUFaf{gSPI z&A@*!TUbRQ-p-3$KUDc=Hp9j|c+t%)Z{KNid2DyGia&p6lgtpOkDeM{Qy=)H&22V` zFBRKM=Etf98a&;o2pD`R2ctkyWxz`aTDZXBjY52aOspy*2=?xDIZi>&&))8y?Pe*( zt;DkFm|`@cFI!Kx=wFn7fh&cqy-f1RZb2KRCK7JNBsApYHWk=M5J&|wBQOdb+2_^g z*;b(s3o^wX$sWZHhUhNh^+UU2+hPaWw)eN~kHy66akHOp4#cDm_4zDet<qcA&k#)o zZ(%Dv>K1Mqx+sR1`nMz9wwQP*hL>=&Kei3+FtV>|yg%{T(6f`N5BR!MdXj8xHG^3) zqCJiEswQF>ZLP}3Hs3ciKciD63}0Z^MFL6+`V473sGm^=U1^Mx3`Y|Mrl>H0pEcT6 zg^H5MH*WeRUNMs9VN5fcZQ=>}GHBs};LS}+P-y~P#IlYJ0P8ym@R(0L;jYe*1D4ll zwDy~vES0HtyCCI2411OeiC>SA#1wX;8DRXzVihdy^T9BjrZUmN_=b)~n*!R4%Wps~ zkbFH!%W;I*pJZ#8%)c_#RUtKlOksrV!Y3i%vh>?b076sjL-)-NtH_t7E8;OBZOPa@ zAofQ3jdT&<%k!kzaG)7qW3j4HcvQe1&&jd+f8}J3!f+>UDx7H_B8^6hA&r*!PDQ-B za5jys`+BVIUd>7lmgi)Y&fyh!`yosPQAwyIh?7D-h2#b7);pTpdfDrCm->#&W_JPe zRvi?=>OgitOs_62y`!|JbhXf5STOdjJDPjj*#EK7D|Q>bl1&L=hPkN@2)(QE#vP@l zt9uJeTG&n{WG78N)aYu19%#`y%8i44oVsSwNLRxgR6hF`tsw;8VRy)COB4<JUN!)% z`7vdOk&d?<(g93fs3|PTNPor1pPNW$3<O#_EA7})G$BSpfHV?TmULI#dE$qx7wbVk z&~JAC_{wwIBIXAzc0go{b$tyF-B4|{28H;j=K3zuV<qS%wMu_t^4i`@H+DSvdn-bD zuywne$M!>`B4i4SsLAa4`Y(WRazi3X`V<D0HSABo{&CC0QDLaak%OFWRGk<uFflyE z01;aMG+U7Ux04Vvs_$?k#S`3MQCM3<V`66JXbM8S0++=Hls0KFaFn8zqPUf$OWb}n zqfAxQjNk357Sh#sz!o$`29{*=IlAY>v!fMiDilJX?r1a{9%U3-*f6J-iKJh{i^La~ z$yJ?ASG(MP>=IKImh$g9bD7xJqR}YghlfIHszUwEmoF2yQ`Xet0HgZCGNmYge2TvH z+d^IF=q3{GD`-m8K+R-7AdPA64e{l|c4AofbmD)4hUvwM1bw^%@mXLok{H%R#q;qz z+gU3h@JZH-G^8$-2?T_&a!E51(fhSa5<Hg^#*~Dm+3yoyjfz%;wzVmN5IR8li+ca$ zwbZv$1+j|?wXTbuGq7njBBY45qR%Et4o^v_!hYa|M)ro&WEKN*NJUs@_M!t6LI5%V zb^o{*FLPH_lzI_f#b&eq@tD<1VOkJ+2ytha{ElMVVN)iIbK7^?-LEs9AK$kfBlRpq z&WOB{-VPLkoxxbQ)#})8aqPMdAy#B$fM7_p2T*$qp*<$k%A*nEqb2)XX2TVMsJB6n z5Ki1z3o9gX8w9zYljMj)X!33V6x+^OOEq2l=?|Yh3Kn5AV(XaYn%?@QTiAGN3iTCs zuiJh<gakLKH&e=^81|Pbwkz%K-#_xZ{l*gWWfmrw<kG4&bARQwUujd+tDeM*C@Rx6 z11INo@J#D)1GU>Q$w^j>=mA9b7)O1^G1VKyM1v8fOAgDLfFwlSN7aDkBbh=1Vofi; z{_|sQ`!zOY>fWC264~Y0Y;ZbE!j3Cqv4wlfV?E8SiTe3tr;ceTaXo*JV!Oufp0KT} z!>xB&7aARQo9It=F0Wa;$5j)X(=fKBtv5LhYKFC6eJA)BwZ>zny85O7zI6@a-&ln8 zLF2LorHz$i{9dO!8mb#Jp?&t4L$8*9&!)KTkLxQVHBP<TbHssoPog_o=3mwwtV@KV zireEK8}FR5BG+eEpwBwd2D|})dgY_Q2B5wZpn|mygmgKlra{EZJY7yZo5m&j{9qWx zE8O;n{BL~oK~`lq8@)eqn$(vwfc@Bh@IIfql=_C<GvQxvrlJvD<F@~Ktm_eQgEgD% z?!({nJfYs{bi1wWf?t|!m)VqMi`;hnutTw3MQL$4X)*D9kQ|C9QC?8%5fYb^YdVz? zQsUed5GFXu0nNA15B60d*&xu`$hk}#W*VjtA8;PMu<BbF6azGv020K{|Bw1ZqtWdC zv10y}5;Ko6{LtwAq04MCsz3h~A9KHBmD(9qVYA)#%{FDJ+rGu72veO-r(0bfUmjTD zVh<=zyDR&gV%uVOFI8-tf#30zO(9x_m`T(DkVd$qEgFtgKq!btMoKn37>8FA!bZwX zC$1xtlq<lQLY=`b$iAR{i+x7zq#6|4gLxJ806iIiFMa3*aq|oN)D*i<J@8)_7aOwS z!EGq}F8Ih}GLQ%XWitXT(+PcVneKdy3?-^SzY91_c)LZK5>a{pU|8*e#v_V+#E4OT zjwi(7(vGZ$V!mG>tD`=FtRvSqWZ9$*B?GPmVd1ek!0@{$s=gg&_gx>I&W_E$e<7Y+ z5K(_sDS$qH^8rKPSita&*B->#;u88_rMf;Axsguitwh`|=XF8(EVlU^L*PKbu#TN~ zwj8|9X*SENE}$egSAG|3#!^5By}_`$$?RM3+{=QMMid7b`V01GIvvI+&E63R2wQNp zn}sc$*2c&2oUL%!tO4~7wk4n)tpFT)D3<_3R0r=|=}&0KCf!VqIpm|jC(z<~qb-#Q zZxk@2wJZtt%hiN1;J9w_Hzt9B+S-HzVkb8@NI<A}HToJm^>l-+0XLm`=_dDWyDqXB zn&w}0*`hmpYVLH;R9>jKpb<gg%(l4~ypf9Bxv2Wi1($A_^jdk{jE)tJ3yj8z@$T_c z8pf9^GfJvD8fVo`G05$eQ|sE}Rc<l;)ZEge*Uvb2`dFWIa*z!H{ov^)c7(Bt?gtnf z`c(L2$WYOKPWGOvwyF}VUQoZy5E{)Hgi*&oBTW%MqUJG((HKy}{S^(IPRAg^Fv|H$ zl9Jyq6L(c0ooR|lI@rqIVYg==f-`A&7$PDJcJM8`UEN~$g{#{J2S|)Sh!2=9q%X+l zTa9@$6Qj}xoq-Ra@}shb8xQ#d7qWH5Fx|!X@^O5#+Gp=BEK1u8r-Py>gr%Tssmku7 zB4?i;DJ=yE$<pA_cr!K(LE$dAB>6)n>a-tiWd=_(RksK=Y6Abz5;b5mLI|>)(FA9o zGzACes-Q@1Vend}5C)iY7*G)}1M%Udge?eW(1HnSXri;yq(~2bXQq`x;Yrz#0k&ke zS%JGlk~lDWC_ny*-Pvc@4#dzy&@`+2PkV%<dXwH^v75aAd|e%wGxk5n&Qaf;{{H>% zOIv<3)+u>drFF184*~^AoZL$_J<;#J>d$8hF1HEz)8d7HT$%mI=(a%Fw_CitukY~T zzCPh-wvU#V(e-YoddEiUO$O~Gr_8a91@$Jc+rpZOpW6;!qTct6s-1GiRv51Kzn!ku z>d;8_q{~ie0yF5Z-59^<YXgm6;>#vLXATUx*cq!zD=G$XZeu&u5Te*HqWE4IIDJ=3 z;X=s*MnE=AeJ9|E8#P5YEW>Y3>i7+gy{D`72zWgEJ6_;p$$k1u>hqEMJ4WhXT+1`J z2UoHdw1-mEKE?MEYBN#+HGKNk5c-SiJgPNDBrxIO3hq2zQ?Q-Gzn`%I_?VYp&dv2M zvIvf0jiNBnpf1lm=3_A6ApuPS)>4!*8O26GMgpxwaM6T-up7}x$fShgk;qe5v^RIo z>TaB#z4r{2{wUbivuj#sL%^MIIAif88=Zo8VO`(VhtJ#lK)G7`AVbhecjuza-rrB| zo4s>x>$20;IoY}UyhY=kM#Bz+WZSjeUwYHVtw){{#_rt79ybJJr`6`3xa`^N&f)n! zT=yimh90T==dW``)l)vNIle^QUoEWPPd=w1q+I0(zj?aa4;5EaZaQsy5FJ4LeF}5{ z$zg##sP#GwKG2!Ph}IYe2=jqBViZeEZy;=DiXR5O3_2O25<n7mLS%x7gM{b{!w(P? z0=P&Yp-_Zku~0DH4=E1BGjO^O2jfzI(jhjuT#kfkV(O}@xvr^qFQ2zJ8jM$!1h$Ot zj<|y+lfhEzQGyM##zq{lAXVH55h^k7{GA!f1bGUfVFwO8ST?yXJa<ytqzSR@)8+~l zp&)P=VnN~Zl9(XuOf8SNJ7P77x(<)xt!S+7C=bNv)>Y~Q9y=cg)D}9l1=&&Xw&3<J zxv^Z#!N+`F&J80}F^ph1oN<Eyev!9FzDcM(+C|I^#6zZb^PH(6wkFw*`RZRKqg{mf zl9?Qlv9lV2il@|KFqwkxNcZ?Hfs(3tFuHf%^1G+H=2l&mnrKQmT&@OD%(q1Lj~dJt zZ;!_&t(d>l?g{8))$`(k@{a1p3a{ens7utuI^2=vshxrlD-kY-br`D+hAM=))3(PZ zpyB3*357l{^D%K-(OTUkjEoJ4X>x<^UfmPAA7hlXG?QgK21ybCZk1lxS0Sifv<291 zEjcA#Q%-#E!a(4PJtQIWk)#atL{s*GU*JZt07Zc#S!1%fwV7fXkwZu$LI=?Jii9b& z9N7&))d3Vh8fPHy4GD@Ijl7yD&?%NGuJ_OccYXkIaDN7{Ux?ntALbeUyb?sbz03s# zLfJD@r)GcJGkZS!PFErpG3low5RJ#jCL63{qLHqyaMc*AVNejQp_b+{ucvHN$a_^~ zK+n|6Qz^l#n5WiWi;#UEURyWC?C}74{5m0i9bm^jS=(82np)-?!p5j&Hj8-6#y5q$ z-cZx{GVhaJT^!E3OK(B$?9)Oq;h*nmgonr@l}$~5ny#*74^BUz-dtT@>WZ;S_3r_} zQNaQi9BKB}jHzND-dA1Yeacj3_qnU%q4vw$L-Baogt=3ig3Ri*h;4T_HQn8u6~D8% zu3dIG<o3Gdk3PPnwu7!aYL~z(vic`K@vru8PX5cDD<+oV-HH4Z>R>z7KUO$}07IDA zm>ULZ#zLtQpB=zl`Xly=k@2w#_&57?*Xi!kJ;wQT><Q#XB7^vAZbYO9VC=e@BB$w= zeCM@bbhOZTYK^r-`GA32`zalZp2u(lBi6_x;2QK{K1ATnNuwgnM+j>Y(diU_s7c9> zJt9<SRq_L@|I`sGzL@a)eEtMmbk<oz6St`^Y~8@ZD_52yC@@=Tv^I=uWsjPGpIf_f zW&OBT*mo~lg=MYbyP-r^ccQc`F>NLo6(QTdY?<&%(7s~gGuhxX6Ia@TxNd)1c%NSn z1vg!?!9F%t+BbteRT}T^ikFtgySn40Y{9CQ#s-^l6%*Z|a#r=PT|QRt>uzZ1KDuU2 z_UG&)_39e07-r|Hmy8d@CawADtYBN~ud`dnC6l4WwkC7cwB?%@#G0C73m(O(B@{A= zKYo4MwAZI+m;dFW_8z_0tM6&w{t;apJRSqCB|8-3|G^xy4{cteem4EFg?KyO^H>jM zvPiWhJ7a++c1XQBBKT_Aev;X1adZCx?O6i7i}=MPVM!{DFhM1no>Vgi=FJObSSzE4 z!cz06q4?jt9&?tl`>Ym||8Lbn@fQ|L_G8v#F`IpVs|l!&x&>B}_z$1B(XGyIsHAWY znA8qOJ=@^)4xPoaU-h^g^}_jK@kTQ7$?aFf|5I6D)sIC2%qiC(coF8shYu$ie*)ue ze%G2{U`NRIn<&=&^cNmI;H`MZjd<VtpGTl)=d%@xm^8S)U#_Sd!ESrP&$tl*S{-6v zHU746f`VFpr_y3|y~WgT*zL9|aiKMuO$cfv3I?0K&4hn-UORfaaCwRu*tY+`)hv{_ zo+*t|1tZXVm`h?2D?`iK0qSQ5zZ8jAjTN+=1dHD!a2XVDzEj`SD*T+ir<OkZ5SuV- z7Nq}?K)BqlR}v^C0$dxa>~?#3I1s@KF{obqiu%g9@l{o^DS=Z{*u!j)-EktzHk%L~ zUeueNeuutfbuxAHnCfe9zB#!P8?xVF){CM-QK}``94<NKcSM~>{Bxq4Q=lI*@*(t$ z0*llTSuC3*FY_i0Esz=DU(#!`f?@wi{if=Z>r@~3asMrB8H6RvvkTcW)vbP8ZeWX4 zzxps+&i<@^TXl<*)K}C$u*vFs=c>O&LTuva_OepgZ3^mp(p%~u)K{5Z{k!@f>W^5N zctHJ;`gb-C%!>u<(kED#4A{XPx$+SHa}?%+(O6P8P)JhxL-2PKS-#1p!TbB=d;5nL zMMOs=yP`{Yvn%^wn}ki9e$C!VtI_NeVz`$Lz%L_RchA@F7J^6AM{gFM+M7MOSKOPu ztXH`F#C^w(VO);r;56Hd1-i|6n#b*T>ceqoYd9adu&Oc+x`?PF5k{oi7$_HEV@K2z zymA4)N+`DI{|3bN<-4D@&N)YxIVoqR5q@8N=Kc5COtz?XZfomYb%y==nU^drYn<z` zI3Op&P<B{6a~sQ+UNZCgGyf!<FPq<cb%olx;??)eGQVcOpliX$4LaBZ+E?D^A8Ad0 z$!te|Q9b|E{Q0*=&1>>b!5Ctr?PZ$sZJGC4(Lx<*GmYK3@9};69v2?xCz*86!x1fq z9-^Oe{|eU+0lSwM-%%oRlZiDYBcsgabpN8BFSM>vThx{{TLd#395z2-=dk<PIpPuZ z<pJTl*?Ij8p`A|kz3!1Om%j$N33*p`(O7_$HaZj{d(8I+3YLqBkKR<!&s8!;0~t<( zT2$=h4*{AQK~EBs8OR;j2r7DxyMPde5d7m8ikXqDf`1f1%EuaawIs?)<5jbg7ubKc zZt@&ax@GmMOW*U%tQ)VsqkdT1kaCx=PIkQa_T-k;%Zv_NUDdKze!96~#-fy`B&>J; zUPumj_0A`QOXa%S$dG#HKaV)PHrXJUqTZlMEURp*D&K#c?PX)`>TojQ>yzh(U5ggE z+}3v2ww-mQmrPrgHX82`E)7LZ#<AlK=E`7c)MO|tH5#Ks?%>9*S)OrYMVHZ2*%Ix2 z-f6n^R()lg_{@W9puD-%bs!$vZY>)VYBn{#u=iUtgZ1U*4oibOw!C4kr;~&cIo+d? zul5rmlh}%uY=)i|^mJ>IyR&mweFZIu_7x~{W-C@zr5Q1cK^!<Bg2VsRurR(%#1S|` zYwL0m&n4nj+@}zRJ&USpS#4s;Y~zZ9eWH-8pMKL*o~}gQT@TmAyS%oB%JQGR9;s?< zv&fG7)Gha0<)CBiJ)eEIvfOcv$yK}kEft6y@!BTI=&RB*quy=X`dubI8K|g`#<A+c zu_@eH+u-wTbt6*E)bp*YyT-5ZR4if>y+OU~frPEZqXZ04#L0$|tY}D-NPT^J>z!>2 zLk;VdDSg7vTYSmL<dC(};Tc!neZw!R<YrH$rN>jc%I1lCVSm>+G7BEY6w@(XH|*G{ zSt~)o`-!M-5J4aV2N@%gOd!0FRF<O!#m9U6kFVVF==S-Mhi2~V9_NvnLHaK?Pkq7` z?ix4$l@FtxOlVuZXU{|-{Hx&dvoBa)FB{YqL)jDM%`FJ%Sg7aMBFHANwZS6*`ZF@< zz`_T&TK=t0D6~iK%+mJGy7sE(5;H@Xh~q{km$Yo`zM^*dUF)Y^!|pF^zd29)n7?|A zpWXOlHr-seY|FBeud8b&T+}y3VB@5*h1DnfkCc!_-QhK%%f*~17U2n>IBn|vW}Drt z-eWVGJOi3H9hf$!nudR8+Nmhg011-@!@NC3DA2QVhVsnWtq@_vVUsn7Lgo{)!})lf zHnxUxXX|Z}q6~&9Cutz=WXN1iJCP;&D8)pBPR#N=xfBTp2pd7-lFF5XXBc!;f}%nR z1Ca6zjC^CAo!5Zpsbiu(lgpE2dZaZQmR3Pl1Nu#$p&}HOO1KhD0hr0cDxiUoC%PDR z<vY-xaqjh)W9Ntqi&lzo{m`gwqUSlshu<Mn0MU*M{Eu}I3!C5LlXoPRT%I1kYT1-Y z3l}!saoa6Bc04k3>z2y;b(?1FUenyXAUfrc`fgeI<kr?$mpEtk;|#$A*_8eJpAUy4 zmAH}r{@#(p<>i%?Q>s#3O>1`S`<Zm<q&agYx4JF*+s@rKMs&j5T(hOqaa(aQM;$-| z9D^wZApmG+;hWiI^rue`?IP1I!JXZ;240!}o;^=!$?hKdXuoiqc>d7)!ab-ztxcdp z<papg0lTFn@a$IMc_Ueo={-{J4E$-b`qaoyzz>i(oNgfzqrSy+Qa-h~$kCFl>tV#u zT0yo>Sj8|%X=Z5eLYl_j3H$wFA3GlQ`NIC8!J3ZtWgQ*Tf>iySj%6K(I%;b=*zAUs z@a=8sq4nu=XBezD!_2jBtet7FSq<zc{oYYi+aZ<tDIe|MD;+iJqS}s*TK4Ul4kf#( zA@v8k`-65&H3)aI+mb)swd<$JD{Th7^<YiSL95<i%iflMtG2xz`zX;}pP@;NXp2f_ z1S=4OdG##z9~jV(lIRI-$FGkYP$?Ftb;kfo9l{Z@1K8co2_kr~c7xu*T1`I^<->Qn zIF@m`p^X#2_+Y@)f(;Nc7NdxOl%T-$NRFKpzZ*Diiyv-9$byI~Y_VA7@fF$<pa<7J zoQP{X0=7?b9<h_eCQhT%F7PE0pP?tn5BcCd?VlbSw6_&I3|30yiO*>z<qF(Z+Jl-p z!EjK4ygq-UK@Z-SsswZd)TuRrV3meSy7YVSGVUO;uoKyjZJ$_InD&(mR2(Wd-~Gt| z!w#K3ZwmSVH3CtGtc4em3MWDlgDk0#BzL1+sV*peC+<=2B<`tft(1rwozi04<T=BL z0BuCgn#-8Jg^!fW!tE9lLhs6}C5IXQeCl1`0z}bZHo=n}-dHfmSeis|T~RQ=o!&e< z8i*{9SP~TuW-)o)HXE~7miQ#eV@WvL^+vs~Bvxv+xItC8N_@_3Ze|)&BC^WTP?^9? zE`wPwSqv`5JOP)7F`vnpU^axC^qE7xu}PsO6qZdESu|NavrKitl2&XB&XO8eyfPB< z*#tqaw-{_<>4H|Dx5g*3@-my-zW{NS^+s=4LU=S;5ULvFYRU7E$thNp8*A(h3CX5s zqQ~5@=c+ot#VX*Ndavjg1ef4*RI#r4+51F`-Xy>#L9~eMYl6w8mrb%>5bZT?ljVD6 ztEdNv0*uOqR@o*xU>7I~%q&O{-x-<HE+joZ!4UArf^lPfZK-Qh-0e44me(y)=6dR8 zR5g{BJ&;mTRkZ=xT*+W5%gpv=uJVAlCEQeLvbhB-ELJK-vC?ySG_YZczqVF%d(4-N z>#ny*Sp3}O21M?Rd(O98C84<|F{P!iYQi+&Y*nsLu5^Ihu$V)k)=GECZL$l#xZCMb z%xz~?w@;eYGR~3+M<Sw~*&RV=NZQC0rnlnOAzEyDbrCZHuFGga`<fBS3>_}0ce(?P zl902^TxqD4$DQx-Ouql3YC)>Mv?0+^0b7X9MdejK@03cTh{%+U%}ktHqQF-^C6`xw zO``FD0}P~L0z_&PDjancf@m?ZGR0TUYN{lM-RfudpltLzU;yJ{R+GzQ*P|q&zCuzY zP@pguLKr`*Q*oFilK?v&y$CF+j-b`jSz!_lC6mW>m+2px;ND~mcq=BCmMTz-PuXY< zOa5z2j)rQ{(LTN*&~0=Yh5whf_W+NhI=_eaPTAgjUu|FYx>|LuiX}^yT;wh{;oiU% z_p&Z@Y`}m`F<A5%LqajdV2A>N5C~v?rUXJU2@qOB4H#QH{+~N5*}@@#Jm2%V%+B2D zcW!yhdC$u$WMz8Y@Q7Sm;An!nZCaUSSuojY3}>m>9D|bq{)XtxPsx!lnpMKJ$><Xt zF&<MH<b>l0=VE#0Q${LhbVQ?(avB~M5H(A<6VIs~Hmen|XCr57cj;wDg~y7PjIZR* zau8CZLCaPfRJMsKeNi~1P;*LSAkgMF^Q=afBekooDqXYIppZJ`(kv}2%`0n&8lEg` z4=C(<tB0oZo?G5*zM^dDv)$`+EyUx>+1ET{^|A%kM<y1x#uz3LMy<<DY7ZaQj!U#` zY-r{E#X$#N%b`-Wx2k=mUYAOTQF%~~)=IKqH7Nk&Ngcc#Ga&^=*dTTKM`3wmBT>#z zXK7m|9Wcfc3=~;>1jcJfX#rU|Ppz!j;7pMyJxd%-z##=(QTY&BIZl!@lVSAb*KE2t zsC)F&?X{LH;g7;@GHG<l)t9c1ggN89H5)GN%OVBr+yD26iP=l8>Hi9oIy36f@s3g3 zRt#I$TBG}b-9;4UrV$&5Ij9vP)Y;Np6VLT3k-c!=P<<;z&y-p^C+_T2?PjhnuA3&) zZg_w4<Qu0qYc+&_{k1z9zTWdijqi((MtsPgOUPBXo9=$qIjp?KA_P8ufT$hG$~JdA zhqt47vCs~9=DDGlrxbV@Sx3ZS)=8#gMk^~|fsjK8G`t+Zh0s`6_`HyX5VAAko@iEd zOxp$Ui_zMov96iKTPO_CG{j;+9i$>iMx50MTey|GHd-~Qvv|JOonzEpncEx-<v9y0 zm)_IUoLbTpX`fKDtJ|72x}kJTaZZV+r1abUZ5J+SB#YkPw{?DJ+ZDpeCzj|(4{Q*g zZjd)i#+K*VRd$(7uXh?c?f!s0nV*<k;HzKKRy(C8tPNSU=2)~eD?dN0CV%R-aLf5u z?t6c<e#sMrzoM;k{?^QfaFTAI4p>PZbcYu(#|MF)Yep>~>mY?NK)j*MDlofYp2?IA zdWFjqQYB^@4u{F4kONMK_E=?Xxs$LThk3UpU19S{Nzmr?e_{2qb`9sV2yanqH0d@5 zKGJp8aZ;((RpJ-E(g5Ey-P)#3bab(6W+bgQb9J5E$fs<9fcfNuxIvFo=h1Dgwcy+w zPuTU(HesXi2ZPm;XEiGog3BROSUdQwi5UwQ_J3+1m1G-UYluB@01JOMr|AGf`7CDG z0ig`8Ee4)kL6qbPGy~CNdwL7bt`jNhr{b~f<0Mqx@25+$lS$DH(Vxp|&m0t?&qQTw z7?k*9V*W>p{DU=}4O&dJVTtJY(^>`^lPL~F6O|IFf&j!DWck6E9}tqnN<Dwe|6YM; zr^bTbf=2j?6yN9n%~Kky00C^<Jd&E%25u^$XWL`jwmn9G3&|zpw+nN0Mi6&@S<u*6 z0Af?8QAcjvE*!|Mh<WTJwP=x$va>z(gl(B;1+U04#Mx7H@PM!jr;8}`p8X5AFzRgZ z`H&lBbVagpDgs^cAL}3%1zD$XOne$PNmH;OFF;TKQt?TS2u1Xly;A5E%X>i&LS8)c z94WDnS|omqYiN=XeK3B}x+|c@HmfZ(WQ<~YG9AvJ!q|jbd#I*5WUrl&T>ys=H|eYa z=2P;fwY|sZguD`qxdX)M>uI;{{E0Cl55B`!K{}wLHeN|4VH*Yn<g*Q9SfO!lQOZw* zkafssaRZDwfN)YdGl3=tagv7+=p$jsl@<eJQy@3Ndeb-M#@9Z5?ZzpYAF_ng3vX+5 zTH)=3$}HtU;ccx>BfJf$tm5E77<2U`gq<XGP!UiZ1jtdRA)$etjOxr~aJ9IO?-5=C z+DtnAxJGk)x)g9UQqsfg4C>>@HG1qNC7Hcyb!M;d687pf$B(PUZ=T|xM7)L(EmRVw z;~E{-q~ZvOOr2pdE3KGuy*wmJ%9P@R0*A2yuAhIFS3E2{e{lXEPa&La>y?-<Bh!To zj_su>W>-8zjMwKGjQ$BzcAdCp)p^-It?U!LP5Hxpchm^Keq$?$57$5a!Z+()BJRD{ z6WgCQN}23z-^iC&TytVqsnMs6p-*RQ(ixw2F8vzfP=&GB|8F?{vwhrLatNCSGk0hY z#-0-r+MT6XGIxqGf<)4vq(!0^mfU%UhXXyCkz}3fmG;0s&`8l>X!W^JfDuz9HUo@{ zuuFqpp>Uv)!psk76{RqQDF$&!v^n_EC<X|E2=v1&tF#A99!*E!2roB2%bSypGmBEC zbK0u4x<|}zJLr=Q&sQCz4|MEa6Bt+TWjpQ#->T`}V@{zZoqC)oA7_w~`M~N|5Q|_k zJ;Up>vyh*=Kjn%>HQJW}(v6${w!9Z%lq8ZlF>@K=Ek<&|<By|*pF(_rY$Mkyxd0o` z9iYKb(<Rj`7^r%@G=jMiHcZZD2IK>IT4DB~B~Y_O;v9%9bdID;FI$4}a;O}@l!+Yy zZ67)fU;`NEa8WOT7DH7N_&*q17&?q>qwQXMcFgOOnF<0N*-^sEWbzzvC)kr_vv+i5 zgPm2{O*$B>IAd@{>+WUK><(pc@%$Y%QkK)@5Tn}4^Ln|tOsDsh=f>O`Mru?jc?N+S zjv9?oZ;e0J6*s%IG6n*@)S#6c137i!nnDgDIU_YINmjH(${tUCloc<{sdVK)q-C~s z^SX%F!SQCb+A?8SAq-ab;ILesL&}?2F1w-0Zdb;3_7dq1y_J`mAZv20%2Kk(?Wvhm z?B<C)R5iaX)~Hbj6pYoRaxz5C8+`t%vdIxuU7*mXU^r*)l)CwAl{!kS!UD{$Q^4vV zId!-6dwv9L%yh&nL{#kpc<3eJ(>gJojYahs`X@A7)HA9Qm5P}EkW30FIDr{C1ON{u z1g5dIMr=}b5GjQLE~kiOEsekhAqGW;iWew{c8QDP()f-j!!>b}0<_?aiq6~yI>*3B zi`CdXW~Cg76+JS8SL=N!|F26HjVUaAW#N(;&=GruQ@h?1{-Ra%60++(*a{-;SN={& z3m*yJzP9zU)P6F#y&<2IYIRcSWv>_H=QF%ksji&bymFkwB+s?s!OWBD?KvFpwAYaF z6HB9tl5(fq9jdFlXQI1E?Q^gHx<AmO(>ncuVOg#lH7*|HYd$Tnnm)HD6gV_v+Ekb4 zp_-m+TC}!*?8^M?Y`$XK{JN&qk1Sq6xYYg&+mlym)o2Awb#46$jTWSN#;OI(jOptu zaCbaIeUAorw`cR3Q9bDuE~l}?)pf9WSllS}RTN5{AmKP8TP%l##6<JOQyPLORCq}3 z29Olcq|6~?XvRQkK(r=z?ty21f8f%m1Hq?-8`FP!2rzXn{?MP&50cPbf$7sH9>4O+ z<9w~)>KD$L^#-v&PKLdn&JjL-V;0%hPd@a%E}(nDen@49b&%5#O-QsX6;-7Ym_{)3 zVl37&u%3X?ma&!7b)K&CFgV2vc<B9{78(wQr#j3(TH2ANbd_J1HEH_%S<^?==ncz+ zeMd}4A#*Ruof{fHebUScWBtpYyJ&g6Bkq)0TbpNeO-SZTTQ<*}P+RJ^@*sL}wN{jA zBc*NU)`WPe8U9wNN7};jNi()IGtt_S<HvPW8w|D*seQ!g)hl<B`$w;=&0@7)hf?{0 z@B?v19OSjbTBBT(*S=|Np*c9RBX3(TVHwuosc2u(;x?GFtLy8Fb^3K}QuDC(rOS3S zJK9EfPa4}&uG4W-oibZ}yvoPeMsDt^^%~KA*sCv=*{Ta7OtFNMSb%~446ZwhBsYuk zRicCis~|Pe!6av(|HFW>Wds-QvlU}1h5qyxV^(mlpUfHjzhVqKa?A?iY8<~>_=ad! zk8dO`rvOwQj>Y9oP2*Ot9wKK_hBC~WVtf!r`yU%(p%oD8e+cg4QUi%h2a{}O5}EG* zZ-HLS&Y#F<df>kWd<|*0G}o#4taLmE^k0-iGxUlg8Xl6I@jpH*%~?tx@JuRJn#pu1 z@%_I=rNM%Y&`YFTCG|8jY9=GAaO%H4EqhwG9gJlaZKg1oi{db>rau><CW$!BhD_L* z!AxUl|8p=H+efig>VdE^b)^5<Ul0$5R1wslIVkfQ|3k)r0e^1Jf6E&%5M57(#`gVt z`hbi~E}aIM+#)H*C}0!CF-T~}1m*#-7eOT@VVgJ_v1sWO#eq0Sn5yAvFu@5#qrFV* zskv3ck;nH6-{1Jk-G+6$z}U0tweuNQ)hRF{#tdHwF?*QpVdUBg<&D$lH;2hx!U8?{ zL(K32nf9j#-@TD2_C7>%>b8}?cL9itw!Y(Bo<jblcl>r%WpI?%Pj4J{j!bwjl?n=A z?##%PqWmuA8zS)5vCxk(#bC(9jFU0xQk5C=7R7TRzMFn&JpLe}gI6mL{C!MbWW0*I zJeV8RWO=t%FK{h(m362pOLR55=AN7W`u2&T{v&qlpQUo)8&gl^+xyG^_=H+E&E8{g zDtj>Tm&AiGOuNYD{?mSBc+fDm!jX{TQ=<NBX1I(RCaM@z=LO<@=z0bj?tw^8BS&Ps zWpKq%PSXQJW43asCxpYl?bRCJ01QK+v3)Z5Yt*8UtkyYg$mx>#IZQaQl<E7eaQF#e zqGvS{U^h}WdF!;(YbU5y`Or$<Ov~3!8(a|_2-ANO`{+1?d5FG4Ca>l|>^G`1^D^SV zM+ZBRqk?)b(96%pKAv6kG#;Gx_9RUJOrL=Ch#REmXQRXa?RfD@|1DZP<I73OQy90S zkbCMS;6<a}H!3?r3qeKzn7zdcj-$08UJ(+E2t_5b1SU5djr8?PVU5=T=|@1w1JhT~ zgyxT=-&`s0k1&hRyE&EAm}FI*omB`|N~Uf;kDHvcML&66e*U`2`Yk!qczjHA^U3k- z_iuhtxzyzbq;+zB&os|XH+iP@6ifoRmD3iMw1voX{fd>OH<>K-+Z~L-ZeSdCe_=8y zv$DF<yii`Lj<w4ALrX*6qHBtT*CRPa2-bo4PL7ac<OqezavHzGGCDcXKcL|v8UfgB zv>gjbD+f$Xn5p?QtF#T$_pgT|@$@QGPJGo8D>TeAt8fg6onA*w0M><Bp8uk5?6i9- zWaFv}J9P=+`GkC2O<{*FalOY<J0_90cfnq#wWcePcT+sG13<5G`FMJ8{8o##W_(TF zO$%<f_xF?X1;X>p@iDdM_^a=-IIAa==ijmLcDs$P+!j}iuEj;;q_SK-hF(6t&u*(3 zU!LE)pqCz!$h##W9aWv*rYjeIUm+JxEFjgC8ezyBN-_G-vS}?09R$E(jR6BMU5U^@ z(V0P0B}3^eADjeW+@$S6T2jX+!gXXQh=c{DMBthD%*Mu<g-;f$bCeY^HW{l(WcT;Q zDr&=p4@FtG)@`y|%oe)|Yb;R(>wk<jIeCm644SQ*Lc@k-t<920<U$7w70jIMs)|^6 zlp|}olQF@{O#wFeF)_ckjiT>`k2(;0!J{>|O2$aekt_pC0cNlWBQj*NqU$H3%h)ui z?qoV$6o>@NL$D;;M02ATJ{}%ng;dfcXd{fw1p6fDH854f8<GVBq~2IA$qJQYJA#Y_ zQfyl{H<2a3|0gf!b#fQiA$(epW73*TFOJx(Hb{}lWAvI|2_FxX$+DCS$k=DECaML> zL_5c+rAD;odO-?4m`z)jE@0QsIP#m%s{3yxi%G|qJ9mC592Bk*4$?J5vvrf&4==v> zL*Z%RPT^^~#-wiB-EW#fR>F=Qt#Nm25b;_CbGzR|l<+O7jV3LT3y%tNHaS?@`}o41 zF$uNZ<kET7A%4-(^jayOm&JAc`sr7MeRG*R_b<v}%6@d?4)I}rc;w;_N$pwBfcmHQ zwv-tAVx;U4#K1>Fw7Y~77Aa>jb2bAph2cqyb2hF{`0@kc^4I@JroH*5@Ck{3%HA7J ze{=QfTZrXPG(~C3e0zG=<=@}#yeD$(it9e|@}t3Eyl(l}7SBEY4FhdhBIcb^!*gCl znFlPvfq4vU4akQLkM!yPH0F@Xp4CK5WGsrIY#-Z~%66Yny0cS6LL^vZ{#CoPf547v zDOQeSMJf?e5Ldtea!LXg_#yu@^rU^*gZ%^VuaIC)(1`K^c$#TLNtk$0pons6AR0!$ zLUWQKxeJ{spst%xMbvmTKy*u_|1@&<2(Jsb3$Ne98JRk3nUx!DJ=x2tx%A513Tb^+ z6{A$>`g95<Q&rWVnkYPIwQ@b!&Gj&ch2IZbH4Ohq%|kL7qc4yP&<$S-+&CxHHY_5H z(yH)BOYV;hYm2<Re!jdwPI`bN?8W<^3mgKn!%|EOF-72@FoD^W`ZJ(r8R5!E(A8os z#zJ<ArY<)-sfh`v?weLslGjwf<99jXtGd?|md7iq+{xfb<u0ZvU8_<tPY)x{kl1B9 z-I9Oc$!b5j`o)P_ZFE-Eg@)s}4Q(&{`{EobA%5D+5MQ0?S)tM_n+#7Ok~2WgViSH= z!n~$_SoqCbH^IKOb}j5yH<7$IURnRhmcOJ@f7vo|*Yp;@ROn#-*;M<caG;MKK&puQ zrL}+j<La&N3CG{tS~PrWR~Xaw>2ZR_y#^#BMQ;Q?NEWr8Kwqc!wGt6zh&EFKrvp{{ zN~{S=Y!iu^0Jos91XK~^De&WAO?3BQ!NF<=uyq~mg=a<yj1E?=Rj;oT{#mC-oVK)R z?V4h#Q8-%G9*?(^-^Sa^uy(R#c4+HE_0Q45aJlmxlXTd@Ey1#qmN4x4_Gg|Yc9}Os z=Ke%~B+K-=x;mX+DlIOSzKV;XEp><KHOsn+TSDDZ;>r(~#oOa0#k@s$PSzc6DGpZY zT%MiJKfg1}p{soS^vIIw;22}*cuMOjV++=yo`T|dD%z@Ov!(S!t0^oRsA=_x^+YR- zRun2H5=~%|fM4gQs|vMD>7n5f8#?tsN@5RaH1W^l8V#@Kb6(2f^@31PSCF5~CtaD} zHvqx#ExV!o0Lk}Jze|zj2?JMi!xC>^ZcUbx|8oD`UrHT5QaV&bC3|pDTvIB|$&v2% z6%>eP4*a&})c8hn-$b+WaF^U1-Y9%4?aZpl@s?;DwsrU3yUt<P6q65z3bAMOB`-#w z8Z>6`1&HKhr(r4L3qt&ZY~Ue$d;q9YOJv}hM+5p1Omb%T%HEakh-=S^t}!cIW|NCt zvYY;N*Q~sC1sQXeEuA^!svEU*$tdANv&&^(v#x9Tve5*SsoPZk-nva@m)o@7>0Un? z!Atj^ZD6Nk^lh>fKMh(sMon0&1|FKqIv6qslh=z6Ed%72Dy!IIOJsI&k(zNe{r5j` zk_^X6`ZxFWKTWP6!%seNfB&|pQNmWNqVSmX-rpQQ`2bN0Cje~8WfmX!`rCUhuDV6| z?tzm(+(*>4Rl?Uf)zvuzW2UIDP+k<|WI}{Ib%x>RC*r31(n%p}+BT+-9GkW+IrRJX zl4DHYwrN6EI=PMW4E<6fuero2mvA4UMJq5i)7)epXyn;=e>z3@9f-LGcf5hMl*Uci zj^i)l8w{96&a4mrQ~Gl<d_B4T#TQ@fVl3&;$Z+9NT5tnn#-3IItdi@wkNUHjL)f=W zxB|ztGKYxwPhg|$@4Bt)_DtdF)gk?h+O>lC9!c~%TH#{M$B;EW?N3ttH6-F_R*bkE z%xs+9eK>1JJlEyUi3|T4SYbBZx6y2}B_?h-TH3hruKPE(H$8SVQM-|~4Xr_@In|BW zVgnhInnHim#YFuiJF;qqG`&6hB@?p%o1y+ku}Y5rxPFzA>{ANai<mpMN)Ah&m%Jo- zTk<!_-zA?&{vr7SbzJUcp*q;Kj0|)r6iMop!E}wy2z^yL{narTNvVnoVH4i-jNDD9 zM2!2QMokq~%nwo>BNe-q$cmhZ(g6f}5CD+Sf>5JC1{YNhE(3F0!pqbX3(RwM@_N|c zFzw=ol!l+B7sM0Mdy|AsMx{H<YCyb#Oc%ouRN_*U#w|Kh&v4I<xMbG6hFt%Ynqft2 z_lELnT+xDAZGhS+q<JzQZ)6b`Ph@ff8{D21^~2Cvoj^|v?WuLlS?ZQr1g}qTH)zR6 za+Ss8;yIgC=ak*1FgOglhY7jET6kq)qEOkK%Xih~C34IbrCnXZ#`1%tmN&?>Ql(76 z$#hO*p?1?0eXP0O(<)bIWm(nM?>D&fvK;|!P?al}G1;T~4{9s&3~cWA(L?15m&fK{ z)~>Hj3O^K`+eU6-gO#NfAS4*o;1-7UNR|0&(@~!?n_WwQKqAZxwy<UOIm0U!CThKj zdVP5By@#(ohk-AQ56e7iuOn>rJL|JM&?c06U%ORPS!-dO@oAf`H*?OVR=v)~F4S5z zN+5)YCd&}E8gy1RrguKlTO10oX1m^K%4>6G=~)DM_>yi%EXJsGuk#kUP6`2@0mFH& z*Y7NFja4Y}-Gp?I88a-Qs4d@6Y3k4^;uG$8HkVZ>6{d2Ts(+j_*H>Op!RM>kkox{2 z;Rsw5Iu&f8xr|1}tTY4tlHM>@EiDGFo?bbl;~Fu({1Z6Pa>+DgRgwURk+FuLorv&p zv=R76sC6XM%S1>W=qad%1G_wM3Sh6nDM0zsc0|E!6pSFE;zY!kd0?&wr8l1tn`~l0 zKjN<7P2T10Tav&7>10G6STwUFdt$Ckoo6!J;)Qlku~Vxs*jOESa`jr1$`w?}mAukM zx|OzkuRpal<Z2r=X=!4`?F`f5X=<t5y=q;Sb7VuSIarwG_QW?F5k3=+2p_$cidJ`x z=qfa6+k>^<P@a5CW!^oxmeBa7v59DjNox%hL&GpDv)nAp`CT&g_Cl>rsm`;T<uWs) z;grAxF*>czAm!Ag(3+p`9y^Z2s;Xjy+&E`xnc2|LnIxpPt&XsPg6uUf-7ft7w~JT& zfw+4o-?d@ch@?j;51V6l_vA4*Mm!^38vC%}t2Q0LXa*LS0U5%JS+ZNQ2IGMa4z4Ku z1XMXlM4({XWT3mXmejMX4KfvQpFUQG=p6zh1P(#hx0TaeK{z8y&FKjo3kEhe;iDcE zfcF9NrmRd+z#75I#zyOzI${$C4z8egkGJ98@%p80<JU|cW-Vw??@@)r;rU_jo?D(& zU#AYwZx4H}>)mt99&dA=tEGF*_>L9oaR=CWYsR-P*G_o6S+z$z#(P~a{(6#ymX0~h z+zw|!lNvkPaUB%ja-FB?(Fv**Bgd~HFZW*OO%_;My4Q{$zEnTq*A43HRN?uNFg=hl z(mS><pm)SyZ_}ZPIy~6gneFDnlh=-4JH6GN*DM~Axh}obz2j9YI9umR)%Zu62A((b zEZ(Mk=ZLv$GkH6p{9^nahJ21wkUwmmWFcY*Z$n+v>Jp)!boM~Ci|rMz6Z8QFl};xW z+VC;%K?kAOOY{Zm7ozQ4hK7!RFs<OIAU!GpmllpI;Su8(Ht@v8MltN#2yehAjN&M2 z{2H)}i04Aaqn!)TU}`&!mSJL}_emJ|l00-Gi-Fk*^s+fGSJuomHI1=zK33Xc*`hTx zGxE9eC|qWQciQYmB}b%TRaN0^M%k!RI5>`B9d6c9mQ-&9ZPv@IOdauhoi;5;SiiX_ zWHK;M)?aq=IP-A2oqKccL$m)pH~*+mz|;ySZZ3~)-BsluH|nc;xl+!#{ao9<tuwA1 zuk(eK<l6od+H`?T1JZlM`#}9IV4&z$g9_t$7V%+b4<Bddjhvwa_dPes{;<n?iGl<e zm7L=4l;FnV3{nFlW%c?X69fVdpgRjwQpuN$aZAe>QcRBNG&Y@@wdtJbh8!GYyZ)Aw zzW!rQ{z<yr$6V!0f9yN2fvtX&Y&c=i^fr!ls7Dsa6c{>;Ot{z+k{O^#r%wLyJLxwd z^XJOJx5<aJB=zihi!8!)G2R#sO|%1@7}M7(nTVFKT5^$OkK``NBa%L}hm55sW1~dR zLdKvUS$-gX)7(xLDi`7)kuQ@%k|>eNf7|~5`*>4^z8HR_EXsbFq6_{Qh=&*U_cl%k zwM=iU2Q-PXbe70@^dA>Q@*j7JJAQ6|4-hly6bGu#Guf4I3#=NJmMq+jRMnDLMGTM8 z6FZqoQTr`j5OI0-s_>JgLyrB~1ISJSSW>S5iIM8Fd`kT8G)kmiG74kB5_qw%knBSo z@oyzBOWuPdb_$`9K7a)3Pq%~9W`D><G{$o<wXhT{y#LcS`!nt1=i1NN`)PZ^!-?%r zv^)NPy#D{%KF@xhv$y#qH3*%Q&?V{1(Epra|M^dAsb6~Fnd2BV*db|w{?nDuoFJ~z zW}KuA@PAlH;lTSrv~x+Z6po!fRrvbnRv$Qhz!2V}pItpkX^Ap?GR&C={n^v{|A%9T zTnw@Z13Z(S>*IUiM@0O!f@)4ww;cr6QD5gESP1B%!6;MicH!*-Y@P77+wB?U{(vm~ z0JN-bp*I7tds}$B|2Yv_ml9GUw621L=mG8zKA<Ojn8DU%>?tYOyL8Y$OA*gF20al| zE!BG<J5s#_@O_9m17Z)-sFiR4wu<>;U}OpgXwsPQkfX7WgsEmUAWlI(Q%5G%c5JA@ zvU7cnaQC>*j%_XCf?T?a7#|JPH|92fQQw$ue`M)hN67HnNs*fMopiZ@%<df5vaN$I zxLD1ikt_DL(dCWlqoY?X+1oyP^^%(kpB6q@QBdnqbx+<k;pned9UZx-rv1hhShnq5 zF@N>w_PtA1jc&hb32b{w#B}vxOro)&kk4QYrL#`LlzCOWDbu%nMm`flvZfG|KV$j$ z-FNRE&whE;GvWRhXt!eH;b*Q&eRI=I-{8}UJ`2g|xFh(1d6<`@`9woMA|kP%%i+S5 zK1F0WhSZW`Qt4EZc`V(MZsAXaeCedS(Vb5ELclEaS@QrmjTB5H)0hpPEE5EQNlSt? z21ITlh|EwEWF@giEs@COAQx(+_op}^iJXqHgK<wZN*lX)$U%4xp2|b?H#)dYpNq$H z0iZarGVp+aDZ<<f`<XcTVga^Uw3{TkMp!H?=3gDMk(XINB(w^x{0|YokaQ#+LXu+{ zeqa?OjY0AN{`c7sebyJuB@cvhdiqG!?Mv^y_ull5!L>Da5asPlpLpVlbgj@6s?#6S zYL9`li=n^zx)AA&B=wJxE3xcTD*N=wh_LiAeKO-y5#$mc`A=Xw@xj(!AZfrCg?F2! z%%%|*5?(3e55O%Be>hdJWqz|Y>@NYc35+My#uxNsQ%rG0cZ281FRKs`l-S?BR7$Qh z-dVrO@Xl=E(CcZ!zjWz~bC~pbD^8Y^*o%J<{*O3DPI*%37d~UUCSH7g{XNT97LQ$? zYDwS3-Mc~fzXjb-ryofsKuafo;|MWb{O%<N?~=78cO87Pt@Fw^+)bONJk*tS=h_kL z$5lB8z9GJ#*#Eq+|K#CKTE#p+XZgRV4M;Rj;^7MzWbcBcY99FEF=F^p4qY*WN~cUs zY>5q#oGdD3s3+{Gu!C$mzxRqo(e`nj_uaPooI_7+V3f_n$&KXNEvegYzVOAmOI2;f z%Txl_vJgS~zx%NlOt`B5A1jvKoKv>6a#W5%c<Rya>B9YQE}Ng#F-&RRe*ZmNFS`A= zffzY&T}2~NcH;d+T}$M2l)?WJg&c4iEkTi+0V>Z^9RNlas=*@uckms`6J|+}MwkVl zE*N-dTsD!&Rw6C9;`uACcs{*j*L;_2erJQvcU_02%bc~Ubv}FK!A+YVd~oxo2X_nq zIxLJ(Kec`BV~&r=1*4{GtdwIw_4r|;;(YY{D^5OnWS2C@x2K~s>682AHEryBn;yjZ z4?M8>3E?~8cUvB~Zsk;R?@dJv+4DFYRsX`H578avc%LRj22up7SnVaEaV$dP+@Mb2 zq4CIrhOk<yv{1z(Our$0M;S}sp7uM6nufM0!ngn%cx!p@vSq!3eq~q1bVpf1%^HWj zw6@D??qd5hrm=g>SI?M#gOW_%ee~$=YyOXUUtt<iC%mzLHQTp(|Mxqe+p%NzoE>a- z@3Q5iMlTbdyK_ZVk=cxE)U2`ldFI@H5%zHXu&HY<pVxo%+TBNAxkh-BgjbVSLG3Q| z&fc-(xt%*CU>iR*LHY$S&l*@|^Pwk?pbS!QI|E{fuLT9l>Vn41g5I@&W>ri?f&GFo z2Mvui(Ha1iNH}VO&g<oAc2F4t;36nVu;By+uJPrN>aA?EjuED!@2g}wMSvNZckt@^ zbBcT{_aqY7%7ddWm!=M@i%rJXYvdmtmEHZ<%5=2wE#Ya?`{vOxdvUPHUc~Hq)u^&+ zVxd}piz@JUQn_L0+rqRxfv#aS1_Qa)SFTn?$r9m8tB0)&yDHj4Q)OzVO1NO^@T(S# zL(0QB&KiTUe&dAnr^5A~AR?Oh+sP8L@Ls*u%05spT>iM4%=WoC#%#@Vlnc)Y*M>(1 z%>k=bX=I0!#ZUiZtZ<om!sHvKH6b*Pb?J1qnKqKd_>{s3P3^i(18oF$Y@`P&pb7q@ zvO&%Rinll&IO>Nvk;2BP83HY%nxOt@^RQ6}1388?OVhV+Wsgs0?25ERVP|+&EE0^` z9;D*zmtfJOHEx^cUSPX*CM%hFt8IaM+BUL@o;Mw^gE?}ONuG9OHsL}9goCExOl6k9 zcBF9hZPPbzo-Rz=Cbo417-4=XMb6q`w5^}k)dn8)rye-Nvy7(}Gh*3HgK@Lu%)3+n z3oI%!*v)_P(IJ#lCcqSZfges}9(VST_vZX!8Iyu_9WRljFOkeF&%DGjD#;zAuOeiL z)kL;tDxm*yaTD@D7Ic(j;`>P;SyBFLyqBneU^?`pM<(c}IK9OD2nZ!U*T9lL1{g;P zQHC5spChCsLWwhCBD+2mm(S2;iqgWTOcCcZWEYknl3hS(8+Jq-!Js3u!vGXFx%%`X z1<rY#5E0H57emGxizFAgB#MO@V8aq)k0`{0ItI%VD5Y^YgQZzwsR^Ya(VjS14j=&z zuOmZZCAfLs-w7AokmIuQS=*QV^#HH|?w;U3gg;)tyC~?8dDm?rwpZ+0M{sd$lkmWO zf9kdQvVAJg1;5@$^5<Dhp4=DD@&l2UEYpgBBG>GZyXL7}pT{gaax|rmpxnPf6C{R0 zTib|2S=j5#k%yaW)!9?dat0A<n-h5qz>=*X;8^v`SQ&KeDAp3DgrAcLuh@xA;PZBR zg`=d<4p03_tdo51mGomi;T*5<g_jgEtzNRvOAKE0Jp=w<u8?pmC0fj|G^2eDF#F>W zBR30JjLniAk}JV|c8{b_@+!PN3ED$3pu<0a5gVJRMq0Nr)(md5j3YKqt%Cs={mM&V zt(QUujwTQ>MqnxgM4FbD0^omUM`j%X;ov|kMM@GAVteUvCTv*~XK!V8i8e-rGO=_w zoddypK}UkYEyU(oO|oKfA7hGR%Au_RIi%5mMX8P!NNn^DF#hO?MyUXe5YZ^CBuAyz zAaoLmQ4tEOMf%#4pPP{;jWHM)?Ifp@kt=LAg`7AKI~*z{W3ezw)pVPUQEMy~jk*Wh zTB*WpR!FsEi}0SsqLk?wqmj|el+#Tnl^ko>maAr>%xuC2=oZxEl4o@~9aI9XR%h1D z(rWcqJyENP-l}^|YjhfkRH_Dq0Csag*5}@Ne*Zr;M)&xhr-|1PuRQ<G+rMH|O08Cz z{?}JZP1#YVT`xyCt6rLZf_z4lGL=H6A&XO+6pBqLMa#=CD3s5?tU%BF>|g&-ss8aV zHQ)cOM)PgI#`o!W$Vm6yr&5JrWzH40e<xEJzatxrs!>ATw{n%~Tk@(&l_f~OwphL< zCqVa}HZY$G%oj?XR`mrDRG?uJ%%7|Dde!ITbG2SC$p5Y}8a2z$XEq>ISjNkZ>1)ov zgE4B@ZHNjMe(1B_iMB^&AdI3IXEcx*C<ChmAe{t;8VbdzMNHR!-Qp<3aNy9ga>hj7 zB70ZAgoM~V!p$$OCVPKo`w;0RGhZ4!{v}p2VcgvrJjUJQ`tKgHL2`y{a5*?8l{pSS zVw`E_9ZV7@{DRZbcUGeBT!b+Rqb4RXao8LXXKXTqpXO606l_ghxNxwE%@d7RW<mR= z`Ue~sncxs==LN)#+F)tSK{bPR4D&8t8w*GlT10``FvwwlB#ysPGhz&JD2%@_?;>#3 z3UEXjf7lI6*9ic+0Pae`^tPR>QL2SMsL3oEYnGOP$E&ou>S`~7xQVo(=)(GU4qQK3 zr?C@W$tk9f*D9E@M03cl(WrbDVpAIxG#Fl;5L{*BOWVj61YAL>qYM>lvf-j@87tpW z>Z<TEtL-a0inJWJT{N-LyHnEWn7diH*rO(u>JvtU!o^7M2?;aC>6H~*p<IC^KIXSq z3nyf1!YQ4xdHD(*!;D{g@usdDOJX`pA>z?_@A_f43oiSGu}SQ@oNif|jUiqc=UP!8 z=>_F32*pk3PFPZ*vcpA%CN-p;Wxmn4U-oTG7E0BO+K-oF$b+b15-I&yI4^>TevPA| z*`O%f1ySQ{Y5ZqvdO^$W`%*F%#Lt9hQ~Pdj5nk<{#WM`}1&EZna`}}EkJxL5;b(RK zf@)(^i_(k8hi0c<Zf66C_GGR_m}0xxX`y+9`78zFPrs+|feg=SCJzHmc&5K)>S63J zs|Oki5QJx-ntFo~>>H%pY^E}xqM$b5MkoYvA@~kW?9WyLsNftU=J84%FU=uI1-qz& z1e^PwZW2CepU0^YenL2@YGH@)Zu1jQ{eo)vbm78VWF|Q$<=}w5W#K|%AkIaL_Q^~f zi|eTOp-#ROKBVnH#1e_)P3HY8s08{;dZ}0gP%Po!hLQr;BV~334uMWAl-Bd--#Lr4 zPP?Qdr)gAseNmTi<y6A2UQ_0)sPp}@7raYnOLdJ|<1#Huzeemp2>QDw`*c6`PC1Bk z|3&YFAt(-S5J%N3gxme>D{!fPNgp+SjP6|uarzfLH$e)iK6*+D$1m-L*m8QjAGFH^ z!4#H29_}tYGe9>0-gpLnEkFNVf|O((Fhz<rz-WqL&;*)(OzX^m7|o<ozzNd-Y|Vci z15-#I#Ozokzv|tq<d#{fQP#j=G1nW1^aH2=ke?gKQYj2&uL!rf9AnQtcdWxzPdb4$ z6r2bwjFi!Dg^6xpzRR?~N@S;<{tLer1^rUF37IabB1Cl{c)J1W(nIM)FSJ?pBI`;N zMU+C8mf!^F+&}we34|P)JMvDXXF)QSJN4wC&$MNWzT9l#4YOy1%hvdW%RF(Su{;8f zu`&~5GXH|F&lbq7>0>mN<XxiO_%2<#)xM8hx6dLq7~+=o!c*%lalP&u^R)hHCMFa& zS6)+TjvJ{=dUijh*4JOwrq8ks@q@J{vSEUq=4YouF$=LEF4@JjTC@t`d!j%x&0q4$ z$YY#2m*5IWotf^V?@yH7M2WWlZ{I%w+rgAy_-1u9b`)c+jrz_Jj)?FTKPUynyhSiG zAUqMa21vOO6rdZ^W9iQ5&%QC~kvmnTDpvmR!*UiYPWfN8cv-FXuV<GFt28?1QpT#O zANc)6HG(TgaHVg)!IdMp1Ib4Su1Pq0c6nNgE3@>{pkLJV{|+nAL!+nm@Nc5q(1;$0 zM^XlI4futW(0Z&+Dmx`;z%>=+F$`--08{c%b07caoO2rfcx&P4E_cI%*(-V`x`@j; zY3;gE`&aF}^~k{oo~)8NnyMR&zN(UV^8aqFW1e}|cCqmFEzbNRLwxxa?}In<yqDh+ z_6T1*+q3^4!%6H=-@lIb?b}Q^bu??<n2Fu9rabn>fKOla<+Aw3N@!C?SkfJo8^8o_ zI-fw6;_#rs8M>Q+4?{*lf6ip$gGD1_2)F*3nIb$OJoLNYv87o1MtGo;=rMVHc^Mg* zzJq)5cfvzNlfHv34fMZg$+Pso7znVXSU~|SIp>ji?}fH(>3^H-I{4m&4?q0ywD-t7 z&`*A`g)pImWS4M#Zu;G9Tl!s%h6&iR8RREo0+8h2rQ~oF4^Cf%UjrF-Vx~<}RSZ*I zE(2MIVn4)+wu!iV_&KCBJ7WozHtAvFJ})oAL?hICnfWHzmC33lUvkOkcX2xQWGg~> z@BaL}sp{L$pV2vjL?679*l!~z{`9L2m(0`GtD8C#ot^Q#F%1oEW0p0nz3W%&ub4Tl zv7>Bsdu8sZhQ_w8CH3p>X8H^Mu<rIxi1P1uocCCHG<U_VRW}^IMfm(Ssa^PT-OgF& zHf=*wdAvENxvQ%==Ze*9cb>C2*;raREK{(9zN$DD5BT3H_a=?1Nud0!pn*^pUZupA z00^Tj5tSm3ES7<&%$QX!=9c9_0)sU3X6E^ShyF8t!uA7Cb=}?d)XA@&a=V}EW*W(c zOu_RclPZ>-{Zx1NQ$Vf%1X5Uw9d3Fmy}|)ud-_SSfJENUoGgFpK<0AjCt1h|evE%Z z;>VXe18_1@Fu#N{v}Dy$lYcahh+FBgOa3nO3B5w!-!FNJjDG1I;T;eXh*@fdciwr4 zjDCtq-A8v`@^_NF?=`aGOWz0iLhnbEgMcy@d_;QkKk$7ipcWA}i23ZFsLEMr>E*^m zNiljMCxS`D0CtQ<Gz=bkKMmiYre7M2rvpy~U_^9<GE^YqT?}?F;Gp%CT8q7Mn{fbJ zZj%4`83c>Rk`;cwZFtH2PC&AwZk-Esg4y{wTFw0ENVACmqI*lPKgx2}QEvCVye^Z; z7cdw4Cy!~hT58(tTvkqTwpOE+DP#Ggikowbz?sCpE1Y-gkZ|y`3z*$+64-JWdFkBM z*Ij#OYe`h^Gw4gVEuZc6IEwvFsdR;*#px<qlI45kp@L-rf4J3PSfL&6@l@P+D4Fjw z`wjZ|hSeLE&Kp~6FlfLX+E_BWeeV3Nt%&WO{n0hYNmoYh5!;#?dTtE%s%etNlC?nn zT#w1l5(z~CLBl^Nb)XlLMf3?9ti`Ze(I`e4EEqrn*~(coGn7*3jtxx^u^BRed}y<z zd$BCR1#lS*lmmxF%R^w&#cmOMi4zj^6!9$D6aZ>I9Sj47n+C_64wj)Xcy{3t;pT-^ zp1g)@-ZnI(|2o#{s+>8q(rfAp^75*M!p%o28Vqk=(~!6B6Rq}RU(=z=?xM1(WkubU zhnjpJYqg*F8xK`aD#}}&S2U^mP@|C3P(crm1S=Pk9!@{A(q$bR3U-;imDb8&gx;j0 z;T429XfFCd_&s7}e*eKm7kxl#5W7<I!Gk~1LFP6}U%n?$TvGX~ya{T?;I1k2A0#&% z^jB24XD>Zh_&9LS%OJK_PssaKWeGE7bk2mF(NjBbZ8CnPRDNY_y0vqvSTwEU)@I|E zO68Zv=36_MNF$?~kh8xcr^0{F%jpBc+=KqI8uz?&m(F%qRQMx)?AV_(LB-(KX^Hq` zc*ZkN%k29pbUyV*rbJ(s3^CW0uoy3ptf1(|FpOf9QHdS+wI<@yAcjwBu(VmQ6c=8m z6b?EH45R2<ETZM6QfdcJ1gU((;~b<8z#Lc_57IK4R)7w_r53>0DOnSoM;S*<`PnH@ znU-mbX3h<@cXoy%caE$qshO~<IxmvFEY{qSd#q=qtGKwcTN!S>gkdgW$q6rpc|}mM zfW4fn2@zHg?ak<`h$MyQiiQ`Lv=lS5hhmgJXsl0?YsZi4E)8$=c$QBnnXh9F&2c*$ zo}1qk)E{n2YI&bMPp&&}lpO)v=eQDNTY=41B&;b>thIE#&z#?7w)+at2l>OB;qvN; zop}qqD&bJPd~C*5L)|+2Gh=x(#-YO)hiLs$8|GplsgTtp7@+wT*fLZpU7<aLDhrSl zP%*qk?*|hJ>J+vUEW}w38eItqmZNf`rIh|C45<UGR&nt3V=fHH;*_2rdrB=dRhR)6 z%{aHj`HvZU$IbWbsjjKsuwgaPgmU$}HpHU&trI4+<_p&jTX$Z=!%g+WXFPd%PuEQH z@VgxMF2_u3ombag;*o<oPil$uNdG21psUo5pIDpza%5%I=uy>G*4gvtuv2ThuDXc4 z_`F(~o4xr#n>-TrA-kYAe{7|2#8J7Z{f-(gd;Ga>&c1)lWrqs;pUj`koHIS(pOU_D z^8LS$#%g*dRg)QD^LVnOJea-VNlv(W8>d}4abi{VBvc^g{(<%>=A~8;kSobx+W^dd z&`(FbE}}m!n<$swWH;yBxQ58)FmSG&`4)_se1oQtH<eTfCgCu9>6u;oagR#y4*UV% z$RlzEQQ?Bxx~K<?n!O@`;$~!w5)Ni~?1Ur>CmCdnIwnIbM2*apCK_K0`0o;qZC^gB zrnD~peLitnc+7HIOQfYaR@<sy)=U1mSNP`UWRu0l^C3%V<v9<eIyzDhJcXY!r6!WC zOitVT=T$co4QK9M7Hk?N>=5i$KjSiQ`sTL}ZLR4Z5zHCAtN<PR+r3&oj5~9hfz$DG z&hq)@m|1IDzjO7U_fFl5dC)j84=%u@NM#`aWfPQI1kK5dG{3abQ7#}$#*Y#J&u0YL zfhhkq#comz2`orhP_Hgp8!iCbA2hi*3JbwPhoi(witCA1ZUv4)duZcjhc39FxT~fl z;4`a9!pL%+6Qd!8#b8nCVGZM}+stDVazMkA|BSB~lhnzzNqP3YUBTv6;~LC9RkfKz zvdW@08lICI+p=MH0vY66Ccn8#Z>>{bMsjN!6PEI-ku9@ESMg(;v}J0-^JMuS7w0b5 znX@cD7-?=8W)2tRaCYfAMyrX35sT!5f6!STjzv9;6_lBvK768%HD@<*NHttQXnIdk z?y7^F`IN{L?uU%rCUVHqK1zo@akLs-EoXkZnBZUz#7i_Tpn#3a5+TYeLYd_#dc{U1 z(h#`k#S*5uBs;gUF*loal*U~7`L0;$=f#;4=AN=BEs2&1-}$2Zg%57C1^v#VI#-t> zJzRMAY0~-3eWdazv*eQV6Mxv<Ob@t?xcA>e+y^*iS4k<T<b)aSynL5CKaYHIcER1; z4Z;t5N4B%9k~1)y-+BSr<ca&X?VqIU&wp*=L+6Hfd`-Mx@7VDT+7Go0oI>A#R|fn- zu&3e;qG3vLMn`=l-=NG{P!dW@q#yXDaL&2329-vr{@Uo%C`>lC=j2i0{4mP|q$wR{ zgn!v%CnO%Y0uBjp+Bjf5$TTk4KkHU)cFe@~QB_pz^SCGfJ*?JQKf0@!=#AcW;GQ7N z<N;nCa^Lh<!s|wlR$;OVu`tU9rQkDo;hht6$!K<l5IA%9H-tkL@$SF>oi;maX8SBB zw0v&=GnX)%`~NoZ44HYcOdJ!a{DCi*(Pc}iWH`|I(H=k{g-Q{v<}ma?m=r%QWf!J} z8H0%E83q-u1cZqn?7c^L{#>B=FH!3BvbI-O&wt|5F=H-$V*bp7Etk-A)B;d}v8Z?J zB4WCFFCq`qCkDZL$3!R|>lU7)++0^}S32aEDj4OA`8fRuuF~3gDH32)EFsOzy=Bgl zbuV3)$<mete?bq7C_j2P9b`U<BumTaML8VgAwP;H+bZ;DBx_LwpL>8@b(Z6hmq6?u zdXVtQzxf91Fn&M9rzk%aFfXVsQ6;NGq(q#$=}<**)WJ{ZWib+A-;a)nqTVnf6_5cn z4t)>}4PzEXog;w~#$Z1ki{Lk<(<R+^_7UQBrMvR(&(FIr&+ZK5Rq6eNXu|1f5e@QK z=#wQehrRGnLGIl-His{}T!+0FqvTqJuBISlw-+2L$l0Ica0GHIbU~cxWF7~50|^?( zlsX)^WbQq=4o5J*3OfV(n!=DhC6i@4d|pnew5%o<S(F^7v<N$PT9NtE<8$W8WI1-P z7x_kQYbx1%w!l>qh}xw}&MofCb9!BjRB5?P=tIsR5L1!lWmvIA=!w|rhUdd}Y5$nj z@Zd2XuQLzdk4WtBzY3^hY>D1*R4J-QL@7{T4h1Gs&|F;1!b2qrcn-4Ri{yl`y@Yd0 z*^pzgBXmX3x!4)Jdgi9a<fKV!myi<jo+HFJwRw_6>QKc`rW~P=gL~>^9sMO=stc>u zp1<?XHLJ42AyJQ@{e|M%2J?<k1aT9PQ4(sSrs%?<9w&k_6Rf24mpyymS=%&g5lvG` zdW2r4kAnIJc-?yYdygHHO43=!&J?mhoemzrB##~I@1<ta!4e_?n*+8PNeV{eREqo2 z9s$_ZGn8=yhlyigW-JJ!eoL%0dkE@~^6X(G$2=OQ^J*5#F(&fRg!po<5A1BhcaJl| zbyGKC^@2@P$$W;=z0p<SIye&MPh}+ZkjF1jTMtg4yCxj8sxzly&5pt!_0_N>E|DPH z1|+>G%%}<4&@;lb7~m`>2842kdFnKRX;3oaB^xJ=tNn^$zN#HJY2(KGHZfn-jm65O zv2|Y|sE=$MDk`P#+f=niuhp-qLb%_?NizMK%8mDJtX!j)P1?vF8!9)6SVmEIG{8bp z2aE9}WF=dHrxwk=qJ>v<Ou!m!qda?v*+Xph8AT3NCjw<ns5mItXqNE6BW*Bs)1Tfd z&$L}?RW5-#4RbmjQQ=h=CnAx=4z3O}Gt6A%SbS%m((KTva*Tm3;~eax1>ZKCOv%Yh zo)At7f2FjnBAx2Pw<Jw*Q}aosTBDqzP$-?sZspr5yQ*8MRJasV6j{KxP;+yS_SZ(Y z5&!l~p@%AQm=k%?ZzwS<^X^>iC{psVaa#f^a&N&m&A4FlmWM^^S9%ZFIKlfmIcYLA zle~cwab?#R3c6H?C69~O?j5+5(Ku}I{&=DcPF1X14!C@Ld06RKKXaA|hyZ9WLm+u1 zYU9HRsSL0LRFN&gn`8*8j+(;EIWTVc&J}Lr|J??}oqO%vFY7Pd{Y6}OUwA+M#qNvh zzMOllm$Y2A^8D}4UwIj6VU8R*BHYKNenP=LIsAo_?BrvlN&QmChJE`sbiAY%o;Ws{ zJ^8}+nDF|rXml9KiJ>Kc>Yu7U7@IPDQ1zHiY1R;GVYn5!>kiY=A@hYZ6D5!jXKm9F zjgDUbX@8jR^5dZ3&mH;m`~C4Uo)bA9>NwaLyc_};espuXotf1sT)&St6D)?TGRdDT zPCw<2Figb7ochV#|KTi>N(;hPVQX42l#br<AW+J6M163_=u*R(t3+Hv$`zr>CNgD1 zvWp5s5{;f&-4$_d+2V?%|A$k^r5fdYhRjiF3}qc7I;+Crs?HH`C`>$a*KxQcE=)hS z=pzx^E@g3}=pCRZL~ZT#1ON~Xut5lx&eUcc*{uON08|U3d`6q&Pp<)B?F42E1NRRy zJM%GAHH^}96C?Sr?6UqhDb*1YaDnW1aE<FrV}H7j&ICXlFR-PPOkY1dX<|VVpm2$e zB#s@UbtW#wF&^zy)Bz#q!v2l%g^LnQP!S_6f<S|dh4_{JB^(x(?C!lys6Hg@euymG zP<UJKZeX4lwugnKpOUL03%TmZ0wAApOyLIckVE7dddyYf_C+}NQ*tF{61<1wlv?_C z+>>TLszQtvMYxNSj>v)_3QAO@Im7ql<stt7c!9s=HejI<Cn}X0>1+=foE6>vkVT=e zML-E2DW}+g0qxjgNR(UI1)Cq(jDO_2P2H0>Z=T$}>HXxWlfN2Uojav<O6g?xc&6DU z<(xs;629Kn9BD0Wt8IUF?a6VA8qc3Uaso%>ei`8=j+%dd!-BCV*E({dFq=<r;y!7b zZi(iw?y;*^j~%ya)wqFQ;W%^S#J1+C=^3_w6;Z1kaZ6c;a|&h6XQe8=&1b)Mp76JW z%Ys>jrOQYQES*I7_41O!tkCj<#5M2QaG8ryvdqK7=gu9TZr8csspKTHAy4i_ol!q6 z<&!|m64QwpObHr;Z$XeC@yn?D)x@T*VtiL!l|DIvw7dzSd8F_dSYno+%Z(I9k_YJj zv|M0aC;$HDo7~;~Dq$pkFC_j<8=icM@OSfRWQ@v%95YffhmKT`I%QJSENWZSf?);l z!poo|oEX;_!8Rr%>f(a^n0^QrUm-z17`_DZ-=T;mxdE-G&1&Sa35xRsy&xnq5mJN0 zK!wb!qvfZ98jkQ>%^p&%D|XmjyV>G3!aoc_lNykvoS^23*1T~x2U{uIUmA95?=I9L z*Jlw~^}<NGJKfD!S5*iX%3ax{vnr-wBg~DgM<+bn1QcF@*6Sth8%q@KaM5n*o0~yk zoF!LG&(T@bT4no#Ehd#h8TlZgi%wz!j*^atnwd_I5#T`KaQW+Itwl*Jot6?yF3^3A zE}4}XGuLdG#7qdfa;NE(L1X%N&qdA34xJqItk%L9nRB2~YBJc~q4+79r-u4*QsTEe zlMyZmxwQh{5noS~^60=orM;p5sSJx?UCQf#z<{BY4*odch18QzlftD_yafL8A^#!d z!O1O!|69c)9wfDN^bbJJ5;P<sbqWF?D-qAb+JHY^{OwP&ef>!~T5!peeSTkrd+Vf# zRppW?oSGxi$X>^L&`5?#8hsNQ=(QGe0tS<Sh=7NPNb!Cm5f~VHC_)i23-mxV03=1A zmKPIv3$RW_nIDyN=Gd-{T^r{!9h<jq9>E&-C`W$&(dQ$TdnBh+>We?VZv27Gv#S`x zZY2OyBt_P2SMC;6st1M5LWQvTL6yp|2gJf0<7BwUm3uT-o3rxrvdkMw@MpJCqwJhC zsZ*&j?k0Nqf?0WWb$PpuYUTD_yS6LUDAXx#+PCi}1wHVwKmF-3dLTu?Q9A&nV6oSo z@k-UhPdpYrmPL~F=$s-#*jh4}6K)VM{Y!r-HzX`A;+Gyg=WM=6{lGoW=DZ`R5fm3e zUJ!qT%nyqa{2SQ%$wGES$NUcb69&&849DX!S%_!9&{1|m^t$s{#zpXjSU!ThAZ`em zpMkBPEKH+)mURqx;F(k6X~?W8PDi4?A>1LBv62%KdYqIl(To)^r+k4rkHRibtuKrp z+A+}kFuI9BP}DF9=o3}v!~q124L~~#QGm2Yp#;K80}BN8x{HW(2&G>btrLYno+H9@ z35Jh4PFn1&B4`XL_{g>k=KW^r+_+su5K}zr`hwB#F1xI|d$y4oOH{&}z~X<*=X;n5 zfz3sWma*%`tr432PLpt_&gu7BDvm9EuOiIYq6=p1X{ncj7rFYuMO!}UiUBs)BTs*) z1o`Z5JrSoV`*u2pM+f-Tl<-D7;B|slWs{gddl4xwg@uU$RM2QL(h>#HgZf$A;YVLG zl0$wIQT7Opo4-^W&Ft;P9i#4#aYx_(jN}G|+H66>&7adGyzLmnne=3yCCIN}dz^55 z%q53NnLa4o_=l&E4%Pk62f{t%3gK|tBrIdDXQSypVUn<cDPjNuATGVbX%^<8rNj0t z@^H~SN_J$GsuQJG39Rs-z=p$+M?i>Q#)ZYSK&Dbq7n*`JDF?m)27D?iLX(kMOA%T@ zfiG0Ffqf_p6^<=Uz=~9Qb}N=Wa;dfq39?xAiLF(tr0^|+?3lV+4bD}=FZvDP!*|ZV zleuo#==FO+)Lay)iB4#-+S-?Fy@|QJIIp+>9J{11)nNVZ*TGkL-3_oO9~YaG97`l8 z*{J|YePRu82%1q-h4#rUt33k4Y)Nlow(4E0rq3O23t7Bbe$|x$vS#+eW=Ftc^%IBu z#`5&R9&0=M)JgGTyx2DFr|X7BOXMQjAPG%>5=Me~z-O<M?3Fw!`Ge#`$q&eT=Rlnz z6&9I<tc921Tcd(9$vL1LMi?V_>XC8J2#zo#gSvuEokmLq13>Ks;moLJ;z3yyYjIm? zg0+BGvYJ>*qa~#P6T$wBIE>PGX-G8vh!q|}3>8NeL~*NpU@c$^L@~tDK^DVraY>x& z?bc$O#cGkc2@KvrDU$WVlNFHR@nrPQ)cb{S2>N5OmC_7h^vhB+a6Q4DaVe_5(lU!# zw4+1&r_Wz*i%LbWS3HQz&{u#fCNW?^PSAZ(dZ*GecfnPx^t#xIhor9}Uia*q{^*2( zor4b~3k1>VM86!(%Z+PMc6V6DU}B5XdIGL@P}a@}*xZcN_4A&%c+8lK56{0owQc&0 z+cr&|vU&5AsnfR3n7%D_{rtmp-xKq$XXeNZGS<WKQYnu_OT3&xCL)lch<^YMWywja z)nv3<jV5wO4c|g8vO>Nw8Bf?kHe2W-ikXB#O|-cKR7uZ5(TT(GVQ1;IKD*BA^?N;j z@0}ix!ATR1xOEQ{YHbdiSq;J%Z=uHSbC@*_zsJ8-uF;r^io9-jp=FLI67~A6TB9W( zn-kh*Q+vJO4pAtKQNPEeH5!aIo6)4#n%(}Fki*jDi6SSb_5z#Q<DrMiH+wv~iYRhL zYe(W?;0=I83g|2Ft=JNukUsUip&f`jFdkJkk5<e0MPPHN89PfjD!e*t7Re*|>lcAS z@#%&1i23tyME{#Ci!?+UvreNCDv`Mgsb5hG8a^*#cNk6fiCMnPiX-Hp+aBztPl4Oh zyHn6D*0IHn$3DB=tiNbPC^UlpZ*J0?V|6jJJs@Q`rA}qn+Rc8tYS7vYi29IOYhBsd zuG*5FF<(~HWYziASy7zd5#-z)PSo2q#2&G$?fT0GFSTxP_hrrNTFu!t*=E!SBi0Cg z2=SRH$2YzncHm7u96A(;d=Z&(Qi-??nsK-hIGvf`4q1jA<d;frK%d8~gq}<LT-YqG z@RSGwC{+l@$U=^-f${Nlm%>~oib#XKO7tb8)6w1$r@c;e$bb_`&F~Ni2jzvZn2Fw$ zz~B)d_)khj<Q2VL{NKEWq%!0|)LE@NB>ggJGS~kwcJ`<lGurcOybTQ`nVs-hTo#W# zkX@Nq6DkPHO>S$EEhn$FG)b)C?Be?Rg4{?f);@1;dk*(~!#;TB_6ue~koujG{(Beh zUbt{KVXkcLp4__g$fK)QtXTahxoGr)j=G9-8WhCenK&*7rYIphp6F!0FZDa$cKI}A zbC$PH6CR9|P9~in$MVcdqgHQm<%JWmV76W(Ra?!jyjZd}yEEKSQq&abG|$;JC;bSc zi%r_K<?^Bk^Lu*Jg>o|C*fHU5MMZZ-d!_K;<@%9@Wx|6OFrky`ijgBLxNotf;yC;P z19KdM9L-wjp>Ck8BG5)h!T0r&<gXaPc@TewfP<L{Buy!}uIONlaV>0%+sf$hTN2Lv zkjxKXirD2~To#O4g3+K1RK6xdDPT%wEeGp9$`Bglw<U0z1u$iCfD9r(_2B4)iP0vG z^$`CP7=Zn8FH=5PXb4(x_h@E>rgN{jB|EL-iaRh)`YmW(^uJ7uLBa*m(&$7XGI-Ke zN;nA09{>_C7UNiom=;}hVi~*+tXPQjh2p-!$Alh2G7T7~LDWZk#B@Y`_||eS0j5c8 z+}MXS8)x<*jNC9-9f5cm&Im-bpfa@rDJ#}aeD&mfrlGy%ww*gk?W`wa<Hlwae@@q! zT;Wr?Bri<P>$f&eubjT!agn2CWzTsF$9FQ<sSIv=)Sj)_G<qzufN-O`UOrcN=gl{- zyXG4H)lA!3;z&5&GA%PR9;CIi*^=4g6^;tW-vSRGbR4q%Ff4YDy*Pb&Ztk<z{UbBY za80TA{)A2Vy|3aGTl1&oCBkiFVxsJ*rP}vvxtwDRmA+rqr1R}ohq1vP7}jt@QI+tS z!{RhFfGJCDGqxnJFNR+7=Rfbc<{IH2jm-CRH*E?42NNiZZCxD-78eJ<uqQWe^gF`2 zVMjc+WmTwZ)HPGrZFgSi7_sGodRdOn2Z~!)$TRhvb7w7QCoE21IBHaJqI~3eZ`SyS z#XPm-YfnvNaiQ?ltN2q>Lv-MyCyzdwe%0(XgSv}M>Fy@F$&>plh^`XnrC<3lF=|wT zxwE#mprEjD7ST?yA%cmit*xpe>+<l&ia+O^lb81(xriQ_?xqFwPgRw0VRiLn&D>d> ze4^cc(iT%F0-o}GzhxHDd0~0Nw%;391a(%WY$gC>p7cuGwE}l#_6uJTU3%q&Du-Sv z1BNQ6(xHc+GOV2wta51Ju2zM;w9pK?-$vo<7hb5Tx!}@jjIK(9#}tXZhOa3(4AZCt zeR8mWs=yNvM86y>IS;<HeUe{G4oUt<M^*?FnPCw_t28L18bJvp{h{R|>5hz*qP;<Q zsbfSh8E+~_!x!b9jCULP!7OGRfuR)TpuwU)D1uEQvm-&mzw}BJRDesF;usSk?aD+N zm;{U>0}qHi0D~PqBaSeil!iUQlCV3>8lbEi7?siLw38X7Ay0^wp7>Q~U9X90Kmz9u zGh;-Yf!@kam`UQ<v_#9gnupIBR^_fSa++Z#@|2wKRLK_R@rDt+9CQj@8f=2NW>aU~ zKC^g{E;aY>7jX`w7r}f$FY=D2T_qmcXkvb7<8v^QFe+0lBwIdIEMQiJi?iI}QvaG9 zFIlAGEc-(x;`Yw!xJj5VRhrI|!-jRvUkNW&`eTdRs$1-4wL%XTJcV-aZoPtMmT%{l z$~8)|v|`{C&B}j2h3Jt^>K>w12|Y-kXd<Sd6}PjI_kJ`LQya^`c&>!bQUbiuM2zE$ z5%+bO<i^ZAj0u%WzkHA`2Ik!Xi4zi}$jD8T#zaJ67OtB_Fs=iZHxot~M{BDE3n`s| zG5CV)5?3*aGdO&?a7_)cNhVHD$eHk0T$tizGU9I}T3UX#<|D1OnEW=Q$6ZMtK2KUw z`orgq&7rJFRim+~tFxe}p(*Ms@^tx(!+XXQm6E8bXN$4GP?r~J%PP!L=a5Tunyf;l za@%fag}!k2ZsxrFSZgva-@ZGPHMX=?$SY_pC}?EwD=L}Zv!p(;a89+pvNhLi<Bu~x z){@o^3kMa)yc1@AQr+OtSdp@3X;viKQq^GB+Vnn$aandan*^6!WLYks_m^=YuWFU7 z<Qd0hY?ik|fJfCQ{D!>o?z+mdio*1I#~xKh1Nl9@bD{9rvijuq<*AxPY@W|#D%3Lf z|LDW95-oJ%uc7PzKjz*$Fsdr;AD?r})J$)wlbIwl6Vlsc5+KPWKp=z?2qjWO?+|(s zVdyBJ6hQ>RtcW5iifb1!x@%WfU2)a5#9eiDS6yFsbs@=IzMtn#5`yBo@BZFDewoaj z+wVE&p7WfiejXa<gsfyi!lqOY>4W`Z0o=tf#%Y#8W@tEJz+IKR>U~HRPH7}){FA_g z2@RTRpp84qzJ|6Tbl~m%2s1O8`iyqZ5(?E!d*MNCf_fBIp0pN>Y$)^p^{g6c-qdT) z2G|`q!rdp`_EOQ1xd-;oeZW1skI7UsOBvE8XfB>qbJ|9n@GEyp#)N$*zuR$;iHTMl zMb6o*mJJixJe)xE3Q6_4>)`+&0VYGZT=+r_+-_y*&qQ=9TDu^?KY|vD9{9zI3DK(5 zME=Du$arMS#9PPZ2`ya}-Oqi0SJ|R6){pA<?<@LXXXV)6xC;%-E2hpbl)_RdTJa4} zG1C<3HsJ*7`=3>u>P<F}u$;#sYUc`)=Md#Clu0NwS|EndUjF-S=7F&00m=)QA@blu z3*og#A<KwLLZ3)_oMeUt0Xl`qet|_#n5LfVkyh4{r_xHl(W>}GuxC!H>S(E&)JRvc zK(%pLIt!%_Ggh;J!P3mN(C&zQ%b!{2zgdp>O3i+p(=nue_40cDaryCg10&jdx17tO z(^oG`_H-m)1cDqwb`64b;Smyx)_@t0hzGhdMCC4<9`|!TD8jm$rK?L{m%e7ES5xX| zjVv*(Fl`#N^Ymjk_TQ;du2gC}db*#$3;ZWOD(u{Xf?=5$H@|z8nKTK#24ycWnW{7M zAKQD&^LZK7DvgHE{3S1zo_>f1NH&P+M;%Csfl8EPu7x`aIkw>Sb*g?XAd3zsX^HUS z;UC1y6~<^aDLl9k{x&4~;8i-HtfOnX;mQ^KYx5>mteILiZ%SkHXs&4RwL5E-R@LO( zM6u}hNxwS1`A=KMZudb^r4d&kLjbo*jB_XUZm7xw()$Npp75WZModdD;0bDHwr`R1 z_{sVCpn^HUU7WwBZ2nzSn$~Q2(Y)xssf8Q^yiQfaGpCL)?csqTYl$*OC+Z@HVq^XB zOye(GF$~=Qgsvvqt>JX}F)?~g{W!WMD}jH~8i`yrp|6CFShk_1l1@(nOjnF*SpCVK zPZ>c(Klp(l_zKcZz|<cE@}QsDmHp35`ee3N`xeaWb0WvRfmbgnLSZjAeol1X?2jjQ zJkNz%A}vbA8R=gWKc0;f-_pwG0`5rhYCt|$-Z%S`No^td+?Hs0loDvFNyccFDWsxH z*A6uxdHy>T@YCZ0<co~tcgo?_bF!s}w@g{R?vV-Hx;`CG`nT0HLHhm=*PdP4Th+g$ z+}O(yR|zM2rD9@rMMGrAwd0>yA0EZ^D{lW`$b84Z^U^;j-tpQBvB00=t(w>;jRGNw zHbmPcyBkeUMyN*Dp&<=!4Z*9_kr2sB-A2w*DIcMAtDSr>qu8;Cw5OT*sv9K9fcGOK zSm!4y(a2K=dfsK5;!ihJii?WuI$xqIGc`8d;YdoW%gL@wbJ?B#*wjo{qOWdT^k9m- zk==Ptc1~SdlEaZs=lt{%`6zA(m=DT}5dFZ2(yka(5~#H%rX*T@<G7#Q2$NAKF(Ed= zVK7<a;uDkN;-JuRU`L|7S6*YGmgv#M_~_9eofsdN;Anxlr$q{NeVcgG(E8dyQdX=x zxwr4;AwRnz_n)wAuM&w5_aOCHA^aUZ_^K5b6flM`#l<jd;X+t#3k!;lFo(VuX;F}M z67zu)9Tr!bU_%5hhU`Fy>>g=_aAidv5RVz4Y)D3sGFSTS2r^}yJIAKH`4lg%ntx|R z@g|#cj@ugfX#OhfWp`jJqBtUbHkZ4DSHKDHin0O4ELt|2GH9gHaP!L}3}X%RMu9^v zuS(%Jt&VKN;Q3N&Y~gBXg}t%bWVW+k1Gq)5L#s5@ZkEsLIw^XNABqBodZ8Z+V-=0W zNfK@`WLS{B9Hl>p2R#J6Cms(mA4-IIVD5qlOg);Cpn%vztqY4NIw=`LQ{iB&^7#Wa z7a&uV)>V||WdnY{zt5auLkdb=`8s!>hE*dQPt81k<n)M=gi*#Mwn@6Q@B8gz_q;e~ z?Cx3c56|cw-+29qrM`-hV;csS==cW~4I7=uVjM1ELwurhaDFu(Ql=*LN`RNo|LlF% zTRgdL{qU`cBjz-uFM6o4`R|h}0tZvl*ukUFrO$cgmI=P{snfSE-CO+9l)8+*?qp|n zpE=bg^TIpfeVn07$QGyNLrYPGCLlV8)`I<ya8U{0C5Q7<)V-{mN_9YaD_i@B=cS>I ziO)fk1BII*_SGJx{lTuOLY^sHz={3|Pb?n%Yie4$M&R<(ilKI}PV{R%0}AWba;7QM zlhO+kSbd)<)y`7?fZ^f#8IR88g^8yYJUP*(>zlFUnxzNtoZYl6N1f{El@=@+k}>b# z?4Dj;?9=<Jw0dtMr`K_5xkh8!z+!EZZE2m#)Yy=uHYWCp7kgLl&fPzA<)Hkg$EUOT zk1k%A5WApm(5dBfPRv_rpWJ(VX@7sh4(_v_9$|97mu<X+9h(fRfZ~eGyJ@7@_fYB^ z*l^341+WfaadJ2ldI_N2m=NytV~zgsvRACMZsm?0E7?YP$-YTZUJ*stEXUIt7fX(> zS6nw@ob*rWHR+$@M%;ibXjl5MM&Dm&83`?45etEsp3Zfah6&wn{SbZWiSl#g2s8QF z!b4X)kx8BIv0a|9d#)&qO#jKn1JeLSU&g}PO{iQL9$?_n`%N@9{Doli;kV#$3Nk1^ z#U4<fk@*HUNQj$qlmV~{(<reE*h4ZKXge{6b`Mly@)`lI0ocDydLcbE_DtoV&1cSR zUi#p%CoQFHF>_1qX>;tNcxH3ovQtK_!)Q;noSJxssaap?qI9Elad>s5bi2j#ytCs3 za>OCS+>#mBw~`ecHs)WC{zzU^cx+5Je#R3lT<va8J|kT?v*+)lD{f}t&9nCZmZ{Ig zN*&H3gAN+)$s0GHVe)-(rz!VWOqDX@@B9FPt4omi>oHj6;g(tCOO%@6wkpq&GX4R1 zbtJ>0R7-sa=3topyX?tUg83mJE@(3F#$*?KY=Y=`;PXg{F}hsA=r<KnNU(fTxR}%G z=(G<DQHyZWATib1G1r+Y4ibGX!RPY*CD9fM+Y%FPT-e6$BV%wxfkilOmgY1v&y8UT zr!{k&OxMHy%f+y;Gbza_g<Uy0+`{z4#Pr0-_{i~aptd#;jxM?JO^etI!&da|yJDEs zd!{@uY{#5(0rNr*VGB@<4!Q!pMM&d*V)$vDP@v>60uXOmHR?c0m~v#F!u!V#*&AI! zFCAz1AzPG%yv`L)O!?wt1!<A0w1R>(?ra)UJ3BIHo!{9Yy?_5{>Guyf`FChX$Fc_I zzkl<0r)IOI1!<ein?8_!clQs{ylGF<(aqRq`6s?-`=^~rE8zZIU07IMIA+YKg4DEv zn@&6+y?wfCebxj2!#1ZDj2?Zr^t%r?G3|Q=Y4R4!|8SG^!+Ql3SD}N`*7ukT>D?xv z|1Xy@#d)U%ppGeWtaJ{l2B)wBCoHNdN?uM*O~xylSFjm1X(4SGMWdi;NKxSuf(5t$ z(yq)xWA3qIH}GW;dPcJn8YKu5f;{oiO;wizg-JCFwS~i3j<8^y&6ATjN8`%x<M=0* zEI;lmm3F##Z%Rx?s`UEpX1B5L>e@W3ZTPIsDF&xo?<=iJvK1bU>vQqQpAR2|98e;? zywn>Lli7c4!^k9)D%NBa68o3AL)UnD;d+hQ!;L5&d5@<^J+vey>4Buo;w7UeC9Ww; z>UC`7uuab)c08w7zw+VUfg^7(8}2hqI@xh>QPckSg{{)#cJ`ZoB^^z5>Wnx}rQ)|t zm9Bv?Y4QiD9p9(jwKLujJIq}-HB>Ae=~c1k&Xe~rE;Db4B|o4OT`5J0Rv@-mt!atz zj@X>-1Cp1zVgT55j#C)|HMfmO@q}V#n`2Twx+XYdZTw(Y`5GfTH>Yk!<SDb#w0_~9 z8H1+Q%$KT-<&!3c4oDqm7iN?)xPg$2kNHpLi{cUePB`(%e?pBXcU|zWsTiiR;t+Gc z_h*k3Lzzf3r_bXCTMHowZxHOR(;;}=1omFetl(pL^Y0AzY`o)%CwJa_LjS5*R#;l0 zjW703=H5AHIMKELHKDwK_6Pj=LAD?{TWL(>#zc-pZW=AdnU&ctSGLmPRA#Yl%*st2 zE5@3|99PQ)1!p??$QLg?_qS8cq3YGk^9J=x+wtQaLmvIzOJ(X93s+Gg81?GDFTVN4 zi)CtqLG-vQfkdF``vU)J8+thXfiD0dYXo1A1iUiY;}P;M1b7IG9<XMe8#L14A7-|p z$!NHDhK3+l4Opbk4Zc;*E!o^8eJig(V1HxVr(0Nf%ct9<Jd)I#A@-Y^;Q5FZez#<j zh5B!sn%l#)CPGHv@+qt7*o~_!2EIiW?iI~Vd=u7CO!*zkJd6=u4dlTiM-EUCyJT`v zHjF?&jGY9a4MDc+(ABoQIGu<y+;`+NWsS#=wR~c7LhLKCiHTSwNRG<Dmi~!}{Wk_G z?LelCn-rU9FLorxP65v!v~xqN0@8&*6;_igo(WW~+uqpzM&tJFjY3}IcJ9$7bQfAk zZGp<7qRK#<!|^%o`@H*i#i2lDWk8x~w?CXw$sM_T_4Y3QoOn2R*~ngmo&@Hhj|}JB z^<wa<9Q;1%{e54upmatWB%Ogj#(Hk<$rT-;6(>)w;9FLlWY2N_j$6R}D_C#tuFLyR zQg?8Y>?h+f4n;=rDT>*O1&SreUa?-W86MDk6bIlb(X6-=xcVo7u>QE>DaBdEvx-;o zHejCOiI7E?piCY_R(m?>8YV(eH+fkc1o9v@DE}J~P!EEwJy^lDDl0jm&=M6(WjI1} zhsug1OnxZaJWem}2`>S^DmBPMa~QOGSg}|L3CHQ+J#ajM_k+p-<rOY+nuBI10{)OX z$glLKicY(R^ZL!Asu1u~xg2^8@AGT80B=pTGF1gqzoASz<}6k#;%%?<akgi9<lHn# zP39uAwAdW)Oc9>7#qsBCaS65;S<0J2iW7)(J59wVcB6%k{?6%EJ!OsS@Utz_$(y8; zY_=t%V?5*DFrIlzZ{ki!YtM2>w{6Pe9$-Sq>~eHS?^dvtrb=lv8>;ST64@AOhk#MC zHzd7!<k@2<;J$jV>sHq5<Bx^cpHcEFO_6=)r9a?(rbn*b&OXl=&Ai`i=9xqNuBeu3 zS#d|pG5iT-c^lJz$MN@W7%Flb?8$<3n?_^9&jV_;GsR-F**vl87&cr;wrMnMx|nRk zInc8REX~N~Y1OeFJN`Ve${6Vo^EmVd>5P!v@j9C-9X0WZ0+LTk2bC|f@z1F_*7DLz zruI=vvH$QnNO|>oNZOsqiluu5BhEgp6xpgOR(aQlPoGxv0hs4a`qNCWlU_c;dVlqi zTDma!WiF=mlT6^9KFbP?yQEJ)%wpTyIW&YF?FBzULCQyRsUJR;KJU0*`iv#~`OnpC z4l-gG(E_)Pgd|FRRmT4(%sYi_RPEM6;$3%-Z%5%{n>c_iJhrLhpPL>N-gq#SBPHg9 zDzo{9P0z5IZB?7kp52`GFuR8^%q3e+zbL)g1bTBFEEJU4yBB)6py1I-C^!=N&1nNd zCbKBK(G8K1;))gUZ+7rVPAR3Vw7t$6-x$fJPaG&+8+m@w#PTMtSUR>8IWwlE8>A1U z(8^i-@18xi?eGFN_%(Z7r8sxBlq5ZS&Db~Cl-F;l9Je^~taR<5acm>kyS*=)&e>K> zn6*kON8)>1LFFjt>#TO+!OahJ(gx)D`j_ncOO%}4G{JPx7gXF@3{UmqLN~)yN9>Bc zpC>`rSsX-oGVPMHLph6`su_njt$XR&Kiz!upPqdwyjDEi%D68N9r}`S(*JBYcVz9o z&$k{p(E9wnYv-(faNH~R-S=Ja_ctH>=)vYCYu{Y{=JESp5mvRUOUK`Q^Y~KX!uq*$ z+wUr^<Rim&?Hbm>XJ)0&pP$0-5N<hK)lpwqFmoQ5XyT)fV{RTVbI}xm1zF>l^v=I{ zJj$bjzVt*|k!cGIjUTvd6KyVeA${ty&7gHGB<#Q1y14zTyV}$4`fA-A?XMQk9G1;8 zp5EWF&#>*j<J^aKm&+bWr5gaq3CqaWv}E_wQmU8N=gR8`u)OQ8ufDo#+4BgWTl}kj zkNtID$Ns7k&mTc^{b+-7S(Xq$+bK^QA>JebfrN6kWh2{r0A9OgK<yp?f4-sc-yMyZ zl!>6uv*5?N2oX#x;mx`pR@Uo*GrC8yA6OX273VP`NcBT5$Qr0j?G(M{{P7piqRt*) zN=el73s(VL`SV{oUT6>g%o)xA9Yvu3PritOk*PmT7!2X&#aO|Vk=pG~2a{1WGXR_p zgE>l4UMm$H7b0r$wzikJ{oJv(mqs9+QS`6EILDZbuS@=&Z5%$wIA;~Ut2=)?Dwi<Z zQf6PuY*@Lx-u}3EDbfsHx&PZ?OS|st^+vXDc>M7V8y|a2de7gte_wyolz2Y5-{hoV zNoufec(7NxJ*CD7ZahunGQ>M#l7ayb)Ka^pQ*2}<f3#z&^uCz>^2^dYOPAi<<Nv0V zT#q3oCxyOxPfkiojwg3gPD&1aC*~rg{mrx={Ym!?UwY-PrNh&%xF_zP`q;*3Y1wsY zy);0?w&xdCWM~~($vL?yrbFIgV3_r0MqbA&Ipo=*`JPALTZ-|w3$l(0e&Scku;6fi z5}YST8x_lp#^l>uj~;F1rK7F4-`>hvE3z-Vn_W?n%^t`Kao>fq*aO)WY&#u0N+&ig zJ}Q*7oyn@G$P)Y0@>jpY5>F&PG#&KoJ^YRX^+K*%Ss=<$$y_-}L{UXErgc(E5-&jp znr?_BbPwuI#L%IiL?tQGQxhLhEFNIO&2PPbbo8M$OJ>hnvg%;{q2Ii5`}B85i|$0V z!QOX<^!@rRpKN0Z=T@CRx@XJQ<Kt#-*)Z8P%WO+F|KaxD^U4a;MtfYJ2PZuv38nlK zuRXu_$eY0lt2S?0H6i%etw)}$EfbQgc0+8SVg9mrw!Y3xV|UzrV#nBPXG{)zT{g=w z+wE_7v%GerHKAWk`&n<2v6Gh#gY+dppOXo#9JM+eaY%gt2OrW9z~zSG2MCJ<5;w`) z1w!X9@u(_M&MN?JuZz?{84uAjDwn$iCyoe+Ln4JmnA9NAmB{B%5!BA*UzLAeb;q@T z#Z+P}e~?b;fP1&Y%bk8Lsx~pj8Fd1JU{1&T_$%*1w~O?2EazJ!MXZ-!qe_a^n(}b6 zFWyktU*LhL<I`J`9bT0WRqRpks6T$aTyHpTV5TNM92m$*hsF>I$o|_piwYoJ1MS+k z4@{;Nph^J0Rz&vw*R{6pWnO9y>5qG@xbr22mF}0)L#gr~)}4H_qp>6$<~$925GmFS z&0^K?9>3KCfKji9ml=9*)MPGa_6R~d<|%laTO_^BzGM?4)z`l!wMngf1bd$Dc#b>y zn)D5~h>eq4r8agA3&T>^5wi5Qbc9S$4}>iqA?)E5ky+fW9UZ(72IOS8<1gH;@(K&j zloXa+bBDra6BOoL3kUoHL_@>&^ECv-8f4FE#sp1<FO^@0qW<@bpi_>A{n>?AMziib z$qd)|3UYAtV1Drc0u&k(6_1!N+06DIJd)YHfVjlPDl1-ccwBwGrPxwmkM*Bj&`JO9 zczs)T=dI|h&|7Ak>vWhY=o3EevYFqaC&{<?#mBJ_G?3x2g#IFz%}Uo@^(z<Zsz>Tq z)3qak!8J0(ysUS8nYK5}M38q_I^SDc7B9UZ{n3JhIN{&iL_m^m`s*5hGQUi*X#Er` z6bg?OrWdP`5fltDi&4H2EUat@&_IR9LpUa5W4Rg%4tUpe(;Ger9WZ1j`qB}QTf#b^ z3yJPJRD~)R&xINrsUgCROu=#5G1XI4iK;2pV}O@}KOO%07*Vf-`?EeR$EwxqVsv_~ zH78B)v;dStjN$1NIP~7JcXh{s)q6EbIU@q&-f?ixy=5Md=FW1>?>pa><xU%5e(O0^ z!aE}?uE{VVq98;eQlT(cAaH6c$5{d0V$twOQ|D2~t8FS|43A4q0YXA566(dMY}n}$ zpsUh!99w<E4XewRT)%Ki{0E^>4E#k(Gs<^oc+1PZ8N16fN=wp54FANlzWFAaH=&b{ zfQAnN$J&Hh3yED}MWOIH7)ogV@}!cEsZ;SyN(m5WYD~`QDI`rOS`C|IRmP8uznuy3 z6YU4j3nT_Wj2)#Thq^tT0U!@=r>Blx9f|3`@u^wA`q~sTeE7h|h2DfqiUHkf@F7ED zuYDvW)BRyvr)4E^ilw7Jav_Gs7aQ@|s+U+3X3)W3FWt2JrdKY!z4Sq+^g^o5V&0dV z1qHkqhFbheojd#ItY@|lQRzNyUi9L?d3B#|Oz?MU#uKs^g5D++Bss#_E~hJT&JrXc zz?^emMMC_0k@h`{lHJLW=t%Jn&Ha_?_9*|MfFDXLc--MM6MEpA;3i*GXw={t1haxc zP`O~@;Da)-23idkDiZUq^f)0+6fq@S=PW6PuYLV{sqOpMudQ0PYG8bpASTE6ZY)hl zG*aHwjnBOO%*LsCJTs=3HujEB7KN<%fvc8PNnxb6k3uS-^=bnQO7TWH*Hy)gvgG8l z85Q}%i&JB8E8I|<5bHDvy5v-s&E`r=ju8y8&IB#)g!{#$77yo#OK1lAl0AaH(6h4> z(VSQ$yN2aB^90#@%0m!-u!JJq(ht2_FagGX;(L(h1it7V^eiZib?`<aYl4Tk9WX!~ z($izui3*kvd~rUq$5Ld8>=sRIu_INiKC4V|*i)2yOAx9uOS);1I@Ox3+wfauYF3K4 zOuA;4)LOn_QC(VE-J%WUtrDkDYIq@X0)YDCI7@<^#YJY=;(>PkSyL*zZ_nWm%{ET# zC5_}x+2RxIQr_V`A6&?+38kflYBDbn563}g9u_;~*cxbq6e@C1CRBO&B}a9MFmZHg z>&!U}3RApc!IDO{B7B9g^xk`|r1yg^5$eF`>Vbc3h|%r%WXnmGaS946*%m{#AHL;7 z=?R!_dYl?{EfP$pnC0-+&-WUwd!@fx$VwEwO6D^=?VyBEslcEkgpa6}lN3z`4yHZX z0PJK?bdvJ0Fj_W+No<Mt$q$e=t{Z>&{9n%>9*>{puinPiN$s+-au%71qGl-(Z(C}l zy-X=>xb4;D(X;8Ib!?q{o3`-fx)3Rmbs0h!^KMx*b`G$h3KiVGf3^t&K3Le`N(YJq z`T??m-Xc>Hm9neQeEFW!XjHi*jq+ootM5tgo!)c20)egr?CPwRuUfLyNo8iMvLbTl z<w^*@9VGqjZffPtJua13H^;JpAKuOEgBnkp5^QrfZk%gNFr9AiG?h^sMEiq0*Hi(M z8a8KnaCWsfP$1CWzfeEwBG9LR2p|B>7wD>#prGjauD7x7YW3UykBu=V=6-d>2Mvl# zTMd@Tw#(HL(Xa4!u(TMqUOM{n)hmcjWIp^F%XAv5s*(Aoy|L%plHZjaTRM->L;jn( z(Yu2hvm0`_bA)sevFNaIg4T5+6&Jg&Yy|O_8v!qQUC|6pyf#nEG;`oi7ov(2?tsOx zW$u{H1LI1Mvb{(D%T}Up@bb~XA}v#AsS~tIo6y!hUe3Hpod>3stXub!RwUgIXogZk z%z6oQ`n9kwl4ZuhA>I2=`@QF9hzRu%%$g3QTQ>nzmM@SQ5=@t%DGc~QxEVaeP4Jqc zE{Al<Qp|>b9FSjsl+J($zLMM^QvCIE_uhN%b>{Eb2iB!!>8wMCW-XNs%-qH6SFXIC z3q3(Y{R#O1|M$bvH>XTjkfI*9XHkN54q(mprAzIAYmU6KiOt`%2|=Delpg<6>)oYM zq5=0I!8m-lQR)EeDAT#pyIcQs9D(S9f?ZOoh&EIM?{pHpqp#BEz&<PCE0zWeq)b?& zqeiA-m=${tJXj#*0R=x0VpN>v%nL&nrW6Gbh|z9nE=Zz&d4Rf@@`|1|q{5LbefQW~ z(y@Na-`H2D*4*%?Z7cqGjog2Fym_fl%A<Sbod|Hf<9+;hgg-jYGsCNa54WKq`4%)F zb|91>@S)Jyb3{)5Cj6+>5ufz_Gs;=VK3ci$ultSBF&OH3*5JvSrRY&ov&|RRcDKAZ z(cw&Ty~QfLtM*D4J5(^?V^3o8Thg=GgEmxl+BF8F4JW{^@$+qnKJ#x0Zx>;LPPL%3 zDdoN=vwA^5&Z75q_c;@~T)1b`pb6d5zaIJc$>lpxad^4*pst56UgwNs`X^hT+<WTf z&QYmA7eqX^>WSqu4jr1Y{0Y7^+WF+oE2$aU?qR7TA!Y3_<4<X}`3aVC$5YIhl(Ke; zJR1Mf*$shrjY+cfZq{;lX-9Y0lR|eB27=6|$ac3rkQlC<GouhmB-PQ->M?r;FMCY> z>^ypYr$&<lBD8bZmGkMa`=a~rJOA(J)pvGk<8cGcuHjeCufy((?!WK6+^#>JXSqv) zJkOTO`5Ya<bmjoq2D7fEI2h<=Py({7+vWJ#<rI3kTX0by7ZVqLkNHnY@0{H7$qpS+ zmS%dV%@d-9cm)FEE7AH)h#t6jc_!l5#!63oc(?S|y;kGi&$k|CmQ$waYdbz6dd<sL z>&wv_O*k&sroHp^$Wtud4XmQ7u&@r=;Yy;MG736DQB|-W<WdRRm)6N`L7NKJF)D9( zI^UABYi3m~0Gj;!fP2c;YM+qam!G)#=gP=@PiVE-IJrG^xk?<eis2T~15dP4Q?z0p zI>j=&+b6p7iRe>0zW&L)D!&`j4@G&%F8+)rOvC}XxURy=?4n#mJfM>!i*&PxL}F-W zkK9IO;HJ||)yaiLUj5NCL14o|7!omTpTvmD-|p^AUS5hQg_f_|cA5JFKL-naH`m7n zI=RB=4=O-BzC3o)x<?KS>xBqV0Xqb!Tu66N_d)rAQ6f+M;=QQ_1*y{N7hRv__Fq%6 zbo;TFUW#~VpBOGkZ9AD-z}0_ob4dyNou+y3y<bG`$AK}aa9N2yOH^Qv7($jXk_!YH zl%x~%8-T$eJ2HY@lqCloi8{1XI0ns?@J@kKh!QIJ9KLq*eJ{*9%1kGHBUjuvtN+#{ zZJN&I$SCjvVK8%?%00WTtbfC}P;gR3euDmw556S*GcGC4<=~8k!!sTHz4M>Bady!b zsk!m-lN*MHO8omWr)7?;DG;?sk|%t|#<?nI*Y6!sUe#7!QC~1-_VPKo_dhE|Ud$Sq zm#Ik{#~Vk^TY&12e0^yR+HNc4iE=_LQNVbGVuNL(LZUjsXgV?nSOqY@a)mIn;RBT7 zZihHbZ>pff(gj0?OGPsDT8jDC;_neTvuR;&>6WRxhYVu;z}Q4(tjcOss|yB*Dg8?( z$7qdB>%TlPefo(nCH$-!{@qcKb>@6!)v8ydFK_+LNon%-`Kw;x3K}$`)|2TElxOd4 znm1NGzMq5F+ilxb_8P59T@woAsifhZH^I;PSC4-=bhbE?ZX%tNzI<iXq^)fKL%+Wj zcP6(x{K;}*6fejs>xlhm1xPGGD9ey)#?$3zhFH_?bxWu38Tp`)Pc?nRWaOu>(v7H@ zlDf9o9vj%k|G|rRTJ#G<8O$^XX>W<(?povI(@G+4a&HDuP4}|f?kLjO$)v~`g&X*S zz!hZRIEaPq;YHFl4|uw~M=0fi$Bt7-bx&?hoe~UINb3*u)8{@Rbbc<x8ueDIUTU`L zTl7|`nKoFXyb*B^DPoHLvq&|hvb&3`XOzL^>6V9X8E&&~9{n*uB*L8l|I+P0y*hf| zNK4U>ZwhW$9hk9v`s9A;<}&=58;4Mm8R~;!)xYHW6)Fhbu&aL56A>mLqh-iT)S*Hi zVh9wVw0xuvlQ9-lBDsDg<J`*?b-3v;;EK^ZFW2*tiyF;#jozTScu`}}W0h8Zv?pSJ z#OtlMJFlqlAvXAs&6=2$81L<_Z{*{jzscp>KH@D7c<cGgm0z<4!K^u+VsEE@3oJT3 zK;soezho{l>Zu={LF`@K&_guDLmGUhP(n_=q-cY(TUG*b2<bX-;B9ftC$~pJ@jecF z;n|L(0?xy_gN_~u-Tn#I!)Rd4X*ej`LLIV~3j+B(Drkt|#vbtaJ%K{fkt4Zbs#4L? zB7GBNHPQ^}Fg`O_O;Gx#r3KpBeryfvCn@H?t5is#mT*f)3r{}`AZxq=(-l33-fi?b zG}ok}egy(C$>3?^S5*O33rKQWp`|kc5{)N;`2O~X&znq+_Ev|<bpGLX@MYi1Nt|$J z(E6vgbc8oPF1}(+PdC0IKE9C;Z+WV%Mb6p8-XNGK`a`2$@oaf)|J?Jt5-`#8yR)4B zY+3#k%~=|Xz$z!NvQVVuXNna~^~#>3VnupxP#M8lT)F{tXa(Ls#n=<(4Vni86uEij zxr*|XIyD@2Vjt;y08EWu4f$<!T&&q7<=T^MR)dRO;zOJx@>gMAVxChP$i+o2Wl3vT ze{-rKhD#EJ@$K`FxbsVGu2WcMOEg|m@UuFOGA&o#{-?NP{RjMKe8)2bxiy?IQ7L@~ zEfdOxcE*?_JT62j^u$+(_uY>$)saQ&N+fmRWYqgDRx#?5Qhg_K4@cvaa~1tzS?^#< zW`Xyt7j(Wa8^}hmNx-38$$rhAWADKLBXMvj6bUJf)Gkm>Ad7i46SLo^49e>yI{B2* zb1>K990uf+PH-K6bk+q9Dnu<+IR{;@1H7{%dPl))ptQ$`M*zGUTr;9ez`u}u>kM>G zdt?g*8%I+e)b4ngzX&&rURUgJB1?hOLAO9)H9pXprr|v~f`#QgMR(BzNda6c;P(@r z03L%p=H<{f(h)kKOoh=j`b@ino(y9E)c&-jn&BEcOpjEmQv41l;wO9}o`;I#a@++C zlTUGFbVU%HM*z_j)J`r69t!#tAQWWU3>5J`RR9)gdB0CAhvqY&gwCAycq!YK3^4~= zgvuc}i__2?MdiRTvCB_ZqTYCjI#r4M&?vJKP&BlM1bzo!Ovr*hl!mHR9HfHCSApxH z_%)>}6=iY?K;_1Ud`+soz)RIq6(jc}KB$j;D-mGp)GFlBi{i77)ILjGfMX*QP^lu7 z&l(5Uruqbjqf|dOC42C;y!70*CHgVZ)g10+)+;q3rPx=LC^ij82I1Ce|5%%_=(-gn zxbM_f6&oKe&TDW)Mnrz=9GeeJT~4&Bm2rjyl}4AC<kCA6Q{yc*ohs0P{HexaT#7GI z)aMv@PTNasG&=jU^2Ld6yV^9^*&7fyNGqL?pI4B+Cbw+np6hKHMV|5)U||KO_8pzZ zL=~`N7~k7jW5G<BxTx>ISiqiVXrP|R(u;|{6mGadqmF3^XjRN+iBC;*8a(j{I;}cU z@07mRjC2VJi8lAJ)Hr=VmtN#c3XOwZh76tEVRBtO>l&%?SQ8V{lltr9QoY8)prCou z(8rpVof99&zo$0yyxyFi#bTw_FYdbQi@S>F%w;NV(uQP>AWGk<0n_p}Cn%M=l&#W1 zQ?F8^1u*a8faiGcX6C%>K4w4c0nm)O${1f#2u;08%PBRg8040<3Uf<^7?%ksjlYiN zigUAK)MicZBsK!MG5oz&H;Abliwno-ox*RPpL%?X(#a)jVzRVWpmSMAb2e^<bZSVQ zT3s1>;|)N>Gz+l?B(pIZGYpz!&J^?7uV3IA#fDWGz5!-lJEpLB;|`NorHQjTszjmC z-ebKXp;DtqKHLSOI69@rx=>|QXD6f<WIC;b=ghfz&if0p`}M6+rY~swK$q+^mn^R4 zxLg2r_sZk=!}ShJvQDdUBqeFI2Ad&C9g~PxW~||~0|LIxa*x@ojkAczOaOEfoiZJ` zMw}-(t*K;Pz~oF~@upY<Z{Ttg1xrrvK#g7v*Ixs_PWsoV8?;v55Nk9T5@XFp>q?ta z-5z8G>m>ry0eLfV$5^$`?5;@f6{yy5`LRZHqQn?YqRFDyXcJv_HU9u$kEVOCO|l9r zGPd;AyA6iW43kmImagUdZ_S_Xj!Uu#)}(89BpZ5f$xs?i(<{xDYZnP<%WLNGe%~&u zMWwcF>dSGPjxSq&{P^-^k`Em*VFd=2jvv(TNui+u&2AetQZ#Ze^;sFGR$5FqCvh8{ z`du#s^Pjs_ZwGu6VGOC*xC{(QwLV`|1K0^SVH%s+ssr4bxwJx~&e7|W($FlC%?8uJ z6}p(fyy8F|$MyZ7qGWMd(e^1woB-f1t5c`f)%Qzz-EQBPpX%Uwdt%=(%Pp?*dDze) z=s&SGi-0^1XD9X9Sv)Tgqgz>RGUTK9NQ_N9Lq83GlELp9$zvM%ysz-gU@o*P>@ot8 zBvrYXgP*h<mH5xb?Ng>~k1U<Cy|Hn7WL)XIZP)(>+C^6S?vCHzG9{bO7&w3J&?jaj zO`h0T?TZ<HNIHE&`rw17H!khp-;<k37vXYRiurx7sVz)*8UU*9&Mg@<V#fT+BjXB} zO`bWTu5V#7pyy1kqQb#_Mg>V?l6?;3_||BI3Sl44qHHcOwkQ$U=jhB-M2L<Q<J1jw zZ7l#R1iJ|4`9gubXrK`5GU1T(4Pc#dI<Ce|tRUvlC&-b}GS}a=<#Q{4jD;xll1@pl zeY|<|$E=8rWJR<VS@2V&=OreS8`-3<om-olB#Zb-sUzf=!frVKx8&Wh%*ns!qz}&V zjqqRz6H`fm>SD|0j}cLI<<ow96<p}ZFq1^jYBhyw1F5~uOGsa^#N0bIz}I#^jmZ&> z(l?ECuyNw1O%tPQd(WNgxDj3x#L3bUEsH+V89N2YUfIe7UX1~7qNg`14158Zn<A0B zOZJy#rUHj5d@-zo&d*}F&_a(>g(zOWHZZB`0%GAORjEQ%lLEDZf_T|T3sl8!I;#U` zLC?`F!N%B3r}6U1%@mY$MVS)1%M?`#QxH<mBG}_74#^i~=jA{p`1muhtehMl)Uy;n zDk6%b;96<}KPp0`@yaqX_y0wCc!;(Xwe<g&^1!L*|E_(&<97BTC**2KCecg;|H+$D z|NBz#|Izz_fOJU|u7xfs5l;uhl<I-&K{Qn+3B6DyAykc+ePMx|{$u0IT3hVtxIEo6 z(o5F(n3(kRn3x0$`x>b|q%`cV#bNea923nMVrzz3v?}Ns3Lcz1d|VaGZ6{zYv(1C0 z+pqM%ZPX1Mi9n&bNM3gq;|L#;TA-r{g+kJ|O$amzg;)r_FfI5sH8n9)NDQ}1jp0aZ zYk2S8a4Y8yvu1fU+MIZv9M{m5?SZ7OAgFjHo=><ikT2zcX@D~W$;%@GeG7g`0doMz zVJL{~1B+6^>Bx?N1NlS0B$s*YYK&MZ+^&$qq(y;2J`Akhi`c2ew>|nRVJ|Sf!+aP6 z1uA_3C6dCF3pjd}fa9HiZMXut9<ZdG5409Ri(!O?IT~ej0V<`XHq<E4h9tp8bwq{m zCZHS^@TBNjt1Ih<(8JCevYxesCejNDyQ`{{Js8=ki6TJl6m1|#;{gqd1UE8#@gFTZ zA4btJ&Z*WBMYs(`7V&LIT~P&mIfcBV>k>Xpb%|a}7jksHyp5k|E3{*c{y2Oi_|PAG zh`OFh4RBc&G$TqC@@WrJis+;irPD*bRt2ROlCzhji^!QyY1+f=I%C1(1tSq(+8Eti zlHSo+GH4`rLZ(DJcgdJa%=4rhKoU48cD#7g_!Jcr?WTl_Jqf3{>OxY?6EV_v%-xQT zUBX^UPkbEd+B+0ok7kMsTAXo&M~7hU^b)=q#~N`GGPzUHO7LiUnVon@I@HOJ-Z=_6 zDirXC>;@!6f{D&`N1+2C+EK9_`LL3i+Z(_!_!&XEfd~XsfPsT%7pdMLl?I|2w}EMg zTKqJ4TXlP~Q?0%AR;}8pcRBf(9XpU=*4aMi(;@xluMTYQmB9vauS}aUf6bctGp6Ou zPE1_?*wn17sgJFn!PktbDh-XS0y`;{vcC<Ud?iE?z*a<VCnr8okRq@ROlW0A(rdkI z`ZO7lT+6e#NTr_o<W#k)uqg)l>6PhqjmsMA(v`xE#REiM-7hCt#Y66{;ft@pA0iz} zSjM^~tb=&Orj}C=FhH${=v%+Jm=XiYNEry&a0^Th<d!2;Edtzx5SdEN)}zDl<K}MO z%uU^lr03(0NZ;MQ^1UMykKi4bGXs~n=<$DSl79c7^xgw7Wt?K!8@_*h5o_oPtHu1> zBfXyf>(lt}6&c)%y(v8>eTO@|xAJyoIC4Z9vg7-^8t;(adGcQAk0)o`^A)eWqB?S) zQ*`rc;4Q@;&B8y9Oe4?x%k#91=@+#jfR9jyt@?H-ORah#q_>7ARkh39fB@D3W3KC1 zv&<;a&PF<|bGI<`^2w7}d9$o<rJLb4bS{!?Qy*2R!}uXz)&M+KMk7iLx){>Zp~+O} zUY+{il&BYt2mU@3DjYROmt#gF2W44BEOhDDq81nEf`JhYWw1aXHH381y+hdo+Nrn* zGQlg@BZi7}u929YwicQ7X-uy$NOoFff3r_rJJrtqMjMfes@&YFTw(Xb8~1JAcjLtB zCDUgMmLV2l_Vgvy?TV}I6+)DKArj)lxMkb-GKVQIL>(R~uayoQSSqiWaPQozjwv<E zsyv>mWi`5;Z$A2@%HvTz`RJQFbywZnQ^%PNos)tAUBF@Ka(SRW84X)B!CJ#z22<*6 zFILV6JQ&l^M}Q6(c)JH(8`__uVljNax%qswO+r-n#_nxVZllNzLw7H&?od=O-96Om zbXsXk=-Lv)$T_oU?p$e+)PA|jkP`P`MC@VW<$aO9N$Vf_Zu92v9$KHI@}zrIS8hh> zCproGM>Y@@;Nkzjs$nMc*boqi&}q(}iu(OxwOTtA8vYwi|HV6pd_H97;{N}6O{&Vv z+WKw$`|0(`$?H%5eIwCdqWzc4PO((~o43<hcEmZN=<uxnr8k12kLJgWE-ij+*5|Vx z!yEih-@&<u9_ldcdO0KG<y}|yr-A>=5~p6-pOh*OVS)S?o$2~{+?jdTqg(ywmH0_V zD%`WDkb2Y=@4*P`b`9v^k4Q=o4#_!czsI0fA<MD#M@Pvo0;EA622=U?l-~JuMb~6y zW@cSeRF~g7C7u^LuC{mT<*Py#LzuR(2nA=4X$aM3R|3h|RheBIY8W#+c(r}xE7Nrm z>d?iXC@_o9#e0#hy+pL-V29`mXdqPPkfAXtkqjNQ(vnVrWf-TBTXy%VpThV+J86Ln zRRp#Xoy1s_v=%@m47R+Ohj8Q$<>ge#i&R$ZM_w6-#oGB=d2fN=puxe)0#QAxvb3tt z?34ue^qu+z%BH$Vc+`C9wIREv=|ts@$wfJXgfPG%Cg$}+WMsYTKKgCVO_kpDSCH5n z*DH-ZoYw0H+U>qBy;99p<%HK14i#CrAf-58b<^}83QMISvAK0k%SW;FnwhQBcCpDD z?E`46QTr&Aji3|xKw?*rVpx`w@f!#AEj1H04z&!L1u};mB|_q9*O}dIf%q}x+2Err znV;|_NIW5zU}}w{6RO-*6RHmRLV;Rx#SL)}rWC7&h}cK_-4AbHnrwAW+coDF^$^2# zBO-Nu7o<ty!UJ=M73`Ykv?hz;s+>p@XQJ@X$hVgiuNT$^GE*c)VO9#;?@nOf$#J9K zcAdcO&UtQNnXqe`S-EqLWJu4H<`178%;gmQ$ILyD!XBEoODLoI%RG#1>xFj%yd<Ym z9%Eqc`0+AH%>pNI*<~C9GFl(tM$4k0N>uX1e^R$82$DfY?lLM-#^|M8<&5`68_?lI zW}+zONRW(_aFD}MYD}OJQ}BB<$_SQq*+!ufh5XaUDxBptqSQY3z=64ovj&epFgGWg zTZWn7!2B`N{S$6Fe9V<rl>^`4k@*!YL~GJViIz;0siMG!tc|X;FCr^q9f8_xFK39z z5-I2WGH22Jku|J7vluFZ*S4ooyO$OX$ni<9gm>i!MAz~GJ}qp4=EO~Pa}SvReqe57 zdczL;XeamLz`=%~C#On#NLyEMNr9EkdUd?r>nI3mnhinTd_i3sNUt)y6hfHK+!rb` zXLcy8qjdwaxZ47?>pc0=yE*06Id8mCouwWT$QWb>#q8{RvOJh3<Kv+xVHkGugk{Xz z&8*N%pcjI!1a%g=maG~fj9CmdNQ!bNg|D^;W0H)*au>vil}EG_c8|{0VqtyR!Zfb$ zil#aV30<T=MLw!)x@RT3Gb1u``aX4KQ=PJ9V&pgeP)8*Ku1scaVKN`;Xu-OAP&OAH zpI#z{w7}~eP&El-Ip3sbWwA(5!7!?oijw?}f873(bOaWLy3;o`)wx&R6W%s$_$+r_ z)5R7x?Z|pwU*wB-r{>s_eQu;?G-UNINjDl>lDw0u-0?ouQGHIr^Rfa<9+R@KVF55$ zL9={*3VN0oWRD^8lK`fee&v8#z7vuJ@%hSBp1jjjG5tlyuC>Q18Vqs$7|RH0l1ZNm zcn$F|c17tRF2fKn^08NkuC~t5i_27NCz>~nt>0*?pJm%vf6W%dgjK3*wLwQ-N`Bm& z1EmF$*nf1suS|32`aPO5UtWmc96wD{?#r#>m#GBxbaj!3do&}3wU^WuVW_?y8pI2s zTz{EnS^NRM;*w%=E!$ICnC)O6Cb%YU*N&b)YlL(syKls-rDL@>OpHyH6sk;<OQ*Ye zPI;40+FYm%=lLRIxN*L`s$8Q!@*z9uEv(8h#7HTL%UseTcdvMMZDzlsn)uKEEU*}s zuD9rN`{(&27uRGk<n@=wx<d9DE|d{SDDMQ#2v?(YGy&j<%-?qr|L81$QR^qtFOxMQ zZCw+=PYItDq}0>-CEeXEy{d`^M~UA#L<dZWg<nT>iWpps$zpKvy!{UCw86PWiw7no zP1=|^!8E%nQV=DC`{xYobKtLT=B9rU^MRz0!mkt$p_Ww?B37WOaq4@$`j(`Z(L4|u z7aU$2XykeahldZ(`+yr@AFJ9n>AhtOq}`zrQ8GB^mQ*fv?g2RGft&C8cD51mja~(1 zv7Mp-OGapv@?00KVgP|-Q5U9UB8o&0sS$u?X_TP|<xb>8;v#u+1bLLF4)iOV(`qOG z_+Z!c5$&Z+J^^45xIOwhq5%T9hKM7@C1MbZ>b|+VoTKeK8Y0u@9{9WYz}&h`iDnS0 z1p9#HPkMre!2^Q@b)ZdE4>-K`c(s1Bwkij^n>C^KO7(@AnH4X9D%FNwGE}8QZ=0Ak zKsVaD%RDF}FhZSG{l*(P)#W+TyZN4VwE=#$v*Ot4NfV^|$IL$frkh)qoiq2q_`z9= zi4aTeVofm3b?k6OJ{xI^&#BsGGG$s4rH^Pm&BYomHehAXa>Pbf3|N%&CFdmlC=^Bp zZ+30l--<I?ea*=6(ks540Y#-W>!od%UJJ<jVT^eg3m%5aKMtBB8CT_Mo;wIMu|gS0 z@e+O=;d-UuM^5Ymg&=^dC<=ifiWnwq@-XDDf!EGE7X3DO?fgM+1*%J&-YOV|GL2Th zHO9hno>tpe*)(UenI&eMUaJ{~-y3b3542idFMO!6?b2KL*5!Ij$J_G7Sr+|rgT<=t zsL<=Q<``~>G#0^__eLIyF>AF3{@EC_HF6;~L6xdO(3hF2gbH=ySZWa2+&dbFKp^3e zwTe+xxh{U56e!Uk5YTuaB}C^z2aFt77)hW|=r)j$!9=k1^^Cgqj;cXLuOmT+^`K4t z++l<i5YNbb;quW_N7pE`rMIPTpI^TGd1gY^4U@d~{#C3Hd}V{jBK>9Xd(sZG!DMC& zq&w(71cMWseA~<k`_i<0@$%=TZ+~<@sTN-34}W{(jo-2%U1pS?_09&ZkuzN}Sm~h+ z^7}ABfy3w?LXIFQw){Czm5^1Qaufdtr~Ra9eq=x5Cf+*RpaX`HNhb(KTY}4L9Wu3X zuy=sTq%)e-0lkqoWd%lN-~8L>_!yk3%~qR#;naQ4Kj;5Z<<YE&SDDX-Q2nKcyIUf6 zw#711FK~L~B{CXfRMUqJnU-iU=ol9>%w`pUifwy#_ugmdESS=N;VdElD$UO9S3EG< z^u$wyF14y!M7QiyqR<FVm0!bx8r~mtYT!JoVq7Z`yGSF~e4=rX<YukUN*{C0Tyvxm z+pJY`Kg&FgQkZKc#VQ?;Pov$*bW-POblE43EKGe|mRDuH5&5zBK|1jyCwy_7LBB=} z`h!5MMP&b#U6*?uc?iC2XlazbWX|-l>!sd&7JEVJjVu68>}5{r%k;7QkgHVkQADXZ z8=k=_bYU2mRIwLu>Hpw%&){~rumKQyKkbyHtNsA`x-_(n6?TPamdyb`avHBdMaWsO zt5<eeRe|+Rd}~256nf~MSfhLavcc7XbL2Hd$5Utr)PCSC3YgF1R>4Qu4p-qWPhP7B zf;c!c(gu=82Sjrs^=VKnkxz(6PJYhqfFn&1ZtFo|V{lk7IIP3JxOp-Dg$;}AhA&y% z+%e$T(q+f){QQ`(@z}DZ$FR}yvGhOBT=(|cwQpbd41cdAA<jTr{`Rfo$L>GJjgY=W z7F48EVCw|7KC4`_@Q`%j@Rl#?a!2Y$yX(H(a#*@>XrZP&i!IpCZu?U!yMarHK0e6N z(~Bq3GZ!yrav56W2OndfA3OH>F)5v`W5%`T+s>~Qbc+^_KlJwUrEeab1kY#e#%sW1 z1)*?#;Vn<zCSAC-X<Es(j@902i*IG>+n&4y`=>8%LZ6ul2fRa=XEk^i@E2CN;a!ad zLb7BsK+ZYv2%?<jDzL>eA~Kv}WS~~$IVP{89HcxWKO`4m{y;*=fr#%bZI^yvS|Imm zr2~&|+VuD)mZcZ;>Dm6JFV!%e%N3J6Cb{2B()Y<@u$s(tgI-<Y&rZiF+O)ioN3>N9 zYAPLnm)GYB<)v}Ukzx7_?)1Z%r`X|56DMriG+|=o?u6{LUY@ub`ylx)dY7v|{EuBO zy=x5J&t4Pf>6Mn9U~?HP@q!^W-hrIw@fL$io(saV-<S#*aOJYMYNz!cvKAC+aIVRf z*U0k-xl~n3N|J>c6`NQhcNa(eFK6<(5t8fviTe2ViJK=*+{_BKX?>ElzO@@yBqSvF zNz*#g`_<o6cw@f9p>dQso>?*!OO3<vOwq1U{n7`XmHv75ED{2(=?QfT&pq5}V&n%~ ztQe<`O;58};>1{6cAu<(q3FiE&KoQp620ZwB10gn54_f5&eGl37agIM_uR9RZ^068 zmiYOw@^LW?KR)u|lLbf_jS&FekOCpqT;|9%GQOuQbSsl8$8G;idiH?_rDs3iJ|V<C zo14mR_72F0?Ekd%bZSoifHbz>BZkLUMlL=mwS2y9+vhCwAg2mVXn)s30E_tpJkl$y z*fSu%FhyERIvs|x90U!RMSV_0WD!gih+;(WMJf=%Jaz-H^c2Xf2DK-8TR^l&9k}3@ z<wFMX003AEu?zTO7AJ#pFd))vQmDjtr1#>a?<-kgq;!0Yef+X4#trn3C^E&f>#~#I zcUa#^@*U$?-+p$_eD}hN*#47Q==?rw`4Z20{bwrngkfNxc=j4&JIW*9d1i5s<wq`U zfy2qOyzP~OrDH^&x`0dUo!X~k_w+J$IK$6A4GiE4ST2{7Q~me;@9YoebE-5YWBFWp zfmH25>SO+*FW&%vPA*H>)gG#i^0hLJ*21Q<1YGUj9u$uxPlPzLa=~j;p(&6w0j|L+ zS^q(P!zq4BFh?|wXqPN68A-trBv@WZOt~0*LGpUX%neqUQlCHr0C5Y_z0Fa9fobB% z!=ooNa|I*AKjMjt_oWnoH<+YZzIDfBUOJ{)wRz_x?uOZXVw|AwGx)<zCh!ePW*Rj3 z#rs*TRgXc!Ek2q&K&un`8y0Y$1VJBXvkh(CY~=Jf&p5E+wFmq$I`5)elS{NZq0}&X z{X5dT(v#A=@2p?{4ogS!-1K)ozRCo{ZHo6%aXj_h0QG{k8^<dnXH*NX-88=M%O^RD zQLjyDI^yn!TlP23;k+(EpOntmezMsJ7y&$XP``8cGlwZgX^n|#I^@E6VwHYDiAEo) z{b*whM^(@d`iuN<6ytJ%xD8jCvSgaUI_Fl0B8AX#7+Kc5KD@5tG!1hILEeX%#N<UP zKu`=XE9U%Zgvo+giofpL-+!?x65lNSvrzgf%oaju95IMF4t@T%bk~c@-}dIGpS$UE z>7Q(WgKmaY(sufE+i9hOTeI~Wzvk|}?8NQ&OY<XhZn`;1D)U@q>px(+-~s6w>BC6< z76Z3v6RTLE#1*I8Xj~zV5_+VUWov?40ZdQ`)<E<kUYy1dJVJ@WshoZ#jDh83J3v%D z=0U%UmBTuSeue&mvI`2UgEKIJ-zI$~4Vd5CQhjiiPPas#@%6IeO{%!s!qIA@E>3ig zD>3e{*bD1=6;7)0mX&HCJ~?{D_r2%3!Ka(|&r8Tu_sbqTJ;Au=dIpjraHH>dSNigj zf@NRW#740JEOVmt7Xxn|v4qS1U0*eLL?(_%RXOvtPxs3lS_1FKLO&<;PUBP-y_%mq zLRXfVTr)E;{?$`HU;V(7Y}}%u(md(;^_LVM+&8V0#-aY0&r)I0R}c{s$Y&EKQGjz| zFc4@EU|0#>8?duTKq@c*n$yrK2BItHr(uKi#^;YecUbyrX6-eCa82z@W;^`c@zv7n z_aqq}kbe8=R^qWA<xjADcITn(vsYZd;?RpP99p?;<-BdTh=~jLuAkVpD`QvN#Pxd@ z&R@mUH-E$WpMI2hQ?|0>LW^|ox{6UHZ0e_fW>ZV+E3cF8L%B&lG2y*^3onlV>?GAh z6;vKl>Hz=(uK@)_A<5SwXz?m}ivrRK(C1|69|uod5tMf1oQo@D2Uq6FA=L|rV*7?a z-aPI80(N)FXVSS7Pu=tBU0-LLC%njPkN=|rsYT;lM#ZIvLbFHb)y}A%J8J&k)vpdH zy!gVDF-vb*^H|PQc7c0WeD|i^f8fTJ<n4Wa;;7sIxut#?Q!Q=odk>ra!*Haxu&~K& zd3<nc)v}Y1vIpy@R_ETcXj}W*F%#<teYEv;Zt#s~&!URa`9~GT{9`0^?H_xDMXj3l zE@NP~)-8ZFd3M4PmBOmO2m>Uj4$PD=Lq^=Jk;J18h({2%8Y6D<cv8YR$=tkrVh2vN z@~?Mb7rc~0bQ%`8ly8wOm{cwY=Ec9FTu!naTMNmSM*T(pbUqyka%7!gCM)Jes1%eG zCzt~ON{p*wj4H41hUcqG(%_LBYq1Jkp{sPV^le`M{=yfm2tRoby={^*Ia|ii;I%{C z8D%M{cCE!Wx^MQ-(n6$VdmEOj(CCsCTjm{^e2rD}&G>s~_s<h!>B6=z^7_BUrp?G6 zT%8{iUzO1R?6G4n4fFL1>0@-x+<f=+2dHi3+%@8ASzl7ExL5H!W>sQbsIx~uaN~w| zd9+gKA|&h41|$UX>Y>0*d5PJCqE~_#2Nb#j&t^)>Yal@%pFk=(qQm9f+!=92Mh841 zSWLm`=&O{olfYx_X7odvtfHF`HL0~aU!x5w1^AiMGf)EHb%IKE6_qZg`_Vx>e6@1% z-b2TZAG~?d;_{3bp{P(~mc)XYQ^T8g-?Sw>MX5E$*wZ9?RfRp#Y}9JXt3<8Q#97o; zRVJ53uT)i5T3iY2#hmOBb?<!lPTj~%BhwTWXuW+IKW)y<``&nSZ|~wnqX{yhPd9t_ zpn<dJ4Gb;Z-1yMenq50zd}(JOmQy4DuRYmr<`=kJ9p_p4+MESzR=-m>B0DEpqtnIf zHLAHY!Z&Z(kYEAn({H@z&V$$Ml#9zlp^B!ay|cz7s?~{%A2(p_%&EmCB|(%};H_S6 zq+DWcS(Rwwj0TmqvdWZX5vwZAu7trW7S0(_H(^5E$k`rMg4vWftv{>hwl~f?w|Czg zCS5_Hn&*`_&6-g?ux?O;G_7CF)(0oQuxsbeKnjQS=W5Yu<W3l!3#FutQP!LZbtC39 zu{YE<lRjQGKBFXGn;WM$38kUl)Mt`lbNK{)CIS6^8EM$O#RwcVfY{_vTHtbGc;Omf z?8Tgc55d%c+Xt+gfzRMDQ^;`-gxLpJDA~mX4*0T}UW9#t-aH11R}Me~NHx@MP%#8y z(=zZ%qtRj1mv6ZB;}t8vdHDGB6t$q#>cy7%YzsSdmLWT!Ev3+G(b#j%Fj>TBSu>f^ zpw__F0smj++=867(&hxO&!GQv`Y@|iXYj4uzI)T`@{)$@R_&ZtU{4vVwD&FQYmwg1 z8n^EB%;|Sbsf>#>R#(-GavA!}UQpRrsZ6q(f+PCnmycgQv6sdOggjw+{)1!E-!je1 zukU5hTC;C;s5Cr)iK5A3InI=)RK>7+lB)_bbh=jWP@7HX=rcB5nOA?)_)$A2*7Qo$ zaO*4G0nXta8BFNAV*bedf|`lLQzA#l<YqbIre>Gi!P#<wY7pfCW&Lj|=pcD$%>y-z zl9w(wls=@<?2OIrUh_f;N&dAMM$lX#_r#C38MM5ljfajDS}Y7rQe~BqGLvi;-M6$W z<z&dw#NZ%=L@c8}mteH)qL7gu>q58<jux#%J6q*5daR0yAw`${R~m`@Hg+zf$Qn_v z)E?_?779J&LO;HfeA6r1#|W8}+K4>ZI?bE1^#wBlgX7XKVt@AV>*=n26tghev}h|K z49Acbsu>qTZYYI_ssb#nyBT=J<#h&UrmM7CxM&D##>LSSBX0?cmY>wwAlHA`)f<XL zAk6=Y&OYG>=OXtB?`4oRisQZ<Nl(aVB#I+L(f?UHjHL+tGiRbP=1)HzjXLkzK66IX z;r{QM<`x9zU*&dkz(3tyYW@G#UN*>4=|BwuRxG^w2{Z{!MGYh`{_h${bV>?josn9j zE%O13HdTA$f7dKrUr7PbWp}i_aX0z4k>3ABV~{Kz<$04j=?Dpb;8r?+FhzH<P^<-k zm$7DN*U}e%F-*35C4w<Kwy^sR@LrGpv`6=28PzKSG=uU1$yrAf1;K7TIoAn(;FT>U z-72GEc6M{Q9QHYionTo|*EUFRa|#+Hd(T-CE%&e%V`MQsn!8EJj~<3v{KOC(JGYlk zTS+PlJll(L@ke=%@=}~dR0Y*tAx}4P1V4<i(5b$^OiiJ}rv6Y!F1^Y(wc1^Y>1{3Y zb3@UnR7HAX#~FtDqpEy}j<mI;C+?EZ<P=OH`~h!$S0c=-ig=%VJe1h}f$ZZS&$mPY z!f-mB)6ydI@r3QzjyW~ziHj1GEg2?JzgLu*CE|i$`E-ijV$m#`z4$Qvsy<D0SR&!r z*vP@iL9M}R#wLeNZZ<dD-5$$@+8d#4Z;iBy-`hNGVVhfpfJNO8KZrUTbT8Os@}~Y! zyY_S82YtKtJ>iG8i15RE?NGR0)(x9MQ3GA`4H;@>?i%F*Q6<NTEB165!f9Ahu{nj_ zYL?t8HGWvDO8DZ6&Gr*&C8w}h^=c)MbgW7+>un*M8VW`$=60JJjrr3({3V6f+6E?_ zXIK%zv(tMgdB_cUh$2^v;LFJ&wo?b(l~JYZ7aDC@IueOP0qa<<g8W0++-`xRTqw13 zSrp^6`{!F}`ac)WxL;~3N{O-YLagXDc#QD|qqz6(Z`p0^3w9ePUx!OC|Faw<seA8U z%l#!<fY<1Z4$))q#^>er^N)+%bc*@!y_d=@)A1hV&Y`*M#|WlEr?!!7C(z4)c>-EE zpq9Zhrvcs%0%=!;NKYN`75gBWmy6Ja!2^<^UM_akntdtFmX5r6)5ft0u{j5?%`6>I z_8Ob^=9_E;Rk*tL1*t8+QZ&X2yojLM7*3UE?-lFP9eL!k$%uQTM~$PkXW<=RUElQT z;DW~SBP!<ml<FN{G0Rudj#Fq1^#lD3YS0<MBpAUKssqlFoI&Z=Fy(=bU*9)l#(iJQ z?@=Qt#DAd&D&eKBCn^mLYBP&N8VUSz5WiqTmY1{+<Whg+wDc~&GIE-w3rA_48!o*^ zd(o0iG4fK2@_sQS$Du136#l%Aho(&BCxIeZ>~LDB9cdLiEuuqtzg9Xc{ra;Tr)D(_ z8f{rHH1<T!ZKEeIb7nb$m4&lrsP$_~L#tSQJKy$|G({T0RL!i4DThq8-;#cVTC-t? z^vRfuzxvha9r5gXotoZpRFA5FyvUQ^Jvo9i-s(XI2HvwmDEsik$kq=(WM!Bb6zn*+ zlJ%1Q5V>A@gRZ519o0R9v4Ahw=+5h5r*Q^hr$K^pAYa45O%)_JW!dBpq#2?hMh1s_ zNS)-d1Kf}l;-q2RVAu!lE@1XRlIuK=%E9l9sZEZXH!m)^HfD0b9gq&V<JhUxszLc% zHa8BjY4tU%WxrBH=-e~DzbFNPk4fNG6str|`r29Vj4@PG@r4#o{gSxS(zqq{p2o&w z?p%AY)@xXL-Jq~q+GvPjs)jKJ1WXD@>#`}VRPuER2}!z+-;9AM#K$N(^$dr~Cf#Vz za2h}+P~E4?x|v+~@r{7BhipAjgAC%wWFrj7Ir%bpVMBI`Q1V6<XaQuRanhUy^+xAB z11&r-f;$CM$czZe<)9Vzkq8RGLupef`V_>Rmv&2a(w_6W!t!PHqx-(kdM)E)4Q#Px zP-b~U!`iXZL$g`dAA66kU)FZV*tHD}<z)>#*n6!@*Q>d?xtGqR)#);Cnba`p7RTDL z4Q1sG+(W%5$K@2jXmcy<D2H=%<EHc;xxC__mec4>{0MJ0?lQJ~u#~R3rEIzM7x^I# zQlrkL(`qx)(=)VMZL%)2K%*(RKo1+c7JY&#23+ElPhpPBBke;u550~+o(>)t6n8<h zG6t+4)Zi8<@Km1S93dAH)Bt80z2_`rH~)n#Tr|7=Fq?DY_kVb~W`gv!bjPlzzvuW* zf1lUa#9ga)mk%G=-{IJH@r6U&XY2m*>i#jmf8nW1XBHhB>5lJLC~XT4=89`r<8QxX zqo(%VG->F%p(XKvpA?60yrrwZ%D(kcH2MUE0zD1Ak!E1(kZ^knV785N)rA@bqOc%O zP!I=&sVE@{{0sZsTw|meq5(^x*bM>FMr&&o+{dHyl3e#>)E@J@7ph2zpCI6rl)!;} zbZJoGMHSW{k6`f>o*oHDoqQ^Sg`fw6_kl9+{lVYw+IM01=shnk-1Oy;KP;4Pf8|%w z`){vX_crtW>O5O4g}6tS!BGCqqg|HrN0IE}_;t7Y8@Ic&W3<^nELwHL?hAVtzPM-f z>iO5*)3WYu>3vWS+~OUsT566+u-JE**QM{jl$JF!1d)`aqi?&xr?lc75>`tm9zoE< z{APq=n1Sfb#C?%N6Zo-hk325iZrd06icOGWI__c90jj(4mX42>@#7+Kjgvd>V#B%h z9UpOM3VF^}hM^NAd+v4UC~`(}NOzE4kg^8SU36W<8;LqX;upt~5M<c-8|eOpg|5&{ z#(qrmHkF-56ZAEOI9axzf>_!Mid`J8y?hPsg=j2!n+uy7P56f~wevR;29`yHc6Wcp z7?p{+Jy{-iw$DD)WbUgnRVP?#tmy^Jq>2%{&!hX8T1}V#BPJFihc&5%`_^P?;+n9K zze*Ja{BAR*{=e$p13ZrE>KosCXJ&hocD1XnRa^D8+FcdfvYO>?%e`AxSrw~V#f@Tt zu?;rW*bdEw&|3&4)Iba*Ku9Pdv_L|PA%!HAkP5cO-|x(fY}t^!$@f0r^MC%fcIM8V z+veVL&pr3tQ@lQ(H{B5hU3cf}4x7V@V;L~v)I?6_*wq6t@dtRqF(&Zxdh`_-87jFo zg{9(bQc^a6km*oxBtb82j0+|3Gt$9d#X?J%2b?W%t;(wOlfeAIqtZ25;A4nbqKVe@ z8qq%asL^OLI8WZ5S?G*P@uv8q)`9n^>;UDX_ULuK%KXB_tZ0`vF~1;IzRt6IISK77 z-|gv)Eyz#wx}viZ3-c>|-7zgy^wCu<G2Kyc+L#jMEX)*F`keedqu+Q`63x-0mED;c zRlW@8IwFawaES7|6T<#ESvjGKnQ4oAAbr%cIBjM{C?{)<Kb+vMn2u4IUg6B}Rb^y$ zSB}DF0Cme5`p*EL5~+wGN*NPJ2Xn%t(M6%NB?H6@=a-L-l{5b6c6t88V;A#X-*84F zR1M5yHu)b+d<^#DY^>`W4o?X0{{rKZ1(}3OoJ%xgbRfJ&Tt)B>$;bt~Ya)oH02^A> z?zHL{FI=YWUC4L_u%Zs96<+WowQSBTzrv!*aGs7Lwv$2y=zHr!2B#q>)@n^jG<&zc ze%{XG;hsiMezkXY7Y&E#ncsi?kFPxOhr2$1aeo!7dhU;Gm3R31ubRC%u~1x$o<2R= z8k`#4%yc`wIbK)1ExM;C+7=&Q70n)*)D%-t6q_iRE0U+rIPYg$_ijm?=dI57%-;XT z{{DGazWCW)*MH=B>?8TP-^D$-<^HQvZBbL>I~nhcugb8+Us*55zK~{%u8P0)+2_6; zKQ$`angE(21O97%3H)Kw^?{5e3Q?J>K!-R4#1|JrMzTtP{cS}&H-*?hL0I&l<9B)i z6o@xu<10Ov6^e?+7tRS`%uDbl8>L@f`0%!E4`2B4(2c2kKkj|(ycU=)HYFA;TE8$q z!RSrw$;uu&5M2;nyJlvhWBAIBoSaoVU)Z|&#fw(@lk>v)QC#ne4`vi5x*f|iGwWM( z&Hnlem(96g&CKF7mzmpEY}>YC<+g1<aNNIfR`tBxx}}R3mfBrKHKiHpMU%4ZX+;Ui zoV72EFUa=?3es$bvXz6Et(|xE_U4M<!u4IHg){S#%;so+cv;x#VytRjW~@J4JSi!z zB3xb85T1#{0)k(aZc_Evb?2TQ5HAR`T9IPLELU{C6s2_91{{rsXLp)A3|Dsc)95*> z-E18(f+jMBv@km*uT?$Ws`}>>XgO8h2Io!Cra!F>uk%$gXCXL2%;_N?C)hp_*NI3p zLO*9c^P;nL+SwtN{ng&RU&-&_%08v`D05%sR4GB}+=id{&fc$1=bESTv%dZrXyY0B zl{^}LttWv8RCRvzoLD`v1a|b__0`w<=ggRC@<{)xcgob>IE|eDZEy5ZXQ)H;UvvRJ zdjbx$K;{Ty_n9R3hq1t>(ZxW(1Ldb;KSs(Ir|$s|xUMuAwG~zi!?c<HSLuSwmGtFk z63&;>^=p=Xxp=9N5eEhR^|KX^olF;(A#aC4bl_-Q$^6);{6eB9CdQM<Dun4LzZ49y zsftXz=5aIi=2KuY5UYVO)Oh&t2OsEw7&M*b80_DRKq<{6Jv+b?;qh^02eR--VjN)8 z3x%MF6ftX>8S1<UgwG1QaM+9W73cRL1Q>*_Np2I_X^o_%P!ZYABl3X2mGHCDR>zQW zM&Suv;SA%DgXBtCBtD({cutV6nQ`n0z7>Datx)gle30qL!MpT$DK7KGg=;Q}xGrCL zhbpgr$I8oHkxSNCrWGK9?4#dNFioHy99v&Fd2%5?fZ)kv93s_6;?u<(n9`0*t40`| zB(GDt>P$EW@i}5Ty~yEd;=6Jidwh96CF)-;PiHsfms7YL@Sh4?@@vou0_@DgLsq&# zhhK2HffFY(<(4WC=bWG-{d9<+MByX3&V*<_<Md1@RfJqAL?sBnu9m9>x!eGAnboY! zVK$59QoQ{50z>REr`aUTlM(s=hgAsum~KePrdLx~Ny(-!FvJ~G-=7XqIVNI9;pqII z$6`<EtakgcSotw5Z%$S|e#gVHSf;*XGw7ZC;`rTar8yw#y0Ome2RM<wW)$Xu4$>h} zUU)nZq6Cr^WSIYowj~UDC{{Lwnfvzd-?yE;CcnZ0a`CA(tXe+0Mt6$8THSy5Gk<^P z?*8iW0Q+#?e&O={`%X5q*H{4mUmH89JGBO)3O_&wHUI?r!jI1{DLMbgtO5wHLJg~P zGaEJlV5LoKmoBp`3*P!%#3>-bN!<A2`|!`l+Qxn(zum)z<;#0m4o}!{@4c+=-h0RX zEZ;Qt5r08`r-zNOksfdjUKslb-#ET*sC=Xx=ojfubB;8QlFq4DtogZ!`$cCa*ora* zS&P~m9CCEdnbSFjAO6HSAE*`yFS4CD=JEjoZK6-PkFC?*{FKto5tQU}<dks(hDY7e zUya85<K58`Zcl2_=m1G4oSLp5lOD%RH$z_03!h)`2LmazGFJ`+iU>W00}QqoFh(U5 z_I3)fCvSpLkO+H)?~@-H`}}!1@Vqe~6-Nv>$hb*}RUVB()kzcIXv>RX!ILKas<E4R zn|Ex7{L`2`+t_a5A9(UAaG~<sj$uyFsSA1u8-aAD=#XcD>?#Y8)jb>rWA^~=6v($U zWv7;bzCwQyw=J5D9yuaR>)f;J%XMt|KlfcEXDhZ1Mq5|NV~=fprP4LWRr$)+$K<gU zt)H`l?6>UT=ltlgu{Ty{aMm<?U1Kw27aTkK<ZbQS4!+;DoU!Fy?;qUOe%q7eP#!A} z!HMbgc#iM0T;TraX*%D~lOWG#v@bpV1NO^<OL+qkm{@x~L>#cPR0)3*R$@YWTsR5O zIA6&3uq7mxJGM^9vKoEz&eva;clwN0t5JN%h%MXW@_N4KSGXKsT6H43YU$D{@tvxr ze8cFd?$owzGFd;+so|5iQjSx)d+x!UG@i&t8RFUl2M)N;WFt$Gv>s#A2-r`dRf$Bi z>AxOF>X6ofSS6jCQVeH>63_Bk5f4s)J_dd<Vd#kqqn+h@UQ5eZVb02`iYyQ1o5cLa z;h}41Uk~>op~SgAl^4$0uxL_c;p{9-qi0y?<J}9BCA-bW>N@4$dG>VPyZ;IP+7B1L zH0+AXb|$CfMJ`#pILf$q_uUtd_-ge+T1HGIX8whfFFttPFP~?DOJ@u`aOZFC{&3Uc z#a=jNOyaR{(}54sc%S$VvZg_HCpz$Th0GxOa8#?DCEGdhE2#WZ5~D0D1?v+*oGL@y z5~4St@wFK#p0gJL<uFlZ&42D*MQXDa#6w~B_wtGO0&7D2v%NeaKG9_M#F^~*PGdMK zH!5s&=G#qi9<wPiK7sc>8!tbqFgW?1{-==hxP0QN{{E++<P5ifPk~49qWsY-TerT# z5?MJ*R6;L))Ba~kFhO5crB4VJ=nJif-d{02Ca%~l=D7E4-n_@1BbtljVy3Tn|B$s% ze~ZFe-EdA#RA<lDSLBb*sZcKdhMg4AF!jLS#4Dmco`L?wsx!Wia?#{8WT_l5+{*y= zddR3K#{Q`P9V`>Ft;7OwL)25*Re+~}0H_}6{CX*0oRXs#@+*Y&tIGCWw(8|;cD7%( z`BrA!|Gm`Zm6GqX`1)k_`wVMT-pgz#XJ2RMzOIw+u3x!l?^F9u>>b`S`DOn1hN7`w z<d!p`E}z|J+_3GPn=Xs&yylhFy9X0k{<52srP}35Z+Z>U@^4~_>H@!av%5N}n6I9m zvS)bjSNp!dZ_o1HYhK1z(VlUf-X{s&m6#W&542T6n!zXlB-zx%Zsmv@<^mME79>ML zJ3<oTRfJ5q56-ZXxvvUpnY6y0rf-D-%|-DMvaFOmCC~3m@+wg=38g7Xq5NgR@~os% zlhb1CF^h(+A71p{r}D{9?rCqo=MyF>cXrLWL~$buQ;TKC1C5o*G0`w)>7%&%^hp`% zPFq|?O75ft_f)HXp&{OU^dVM<;wBa=KYGqq1O1V8N|07y+)a?xn6F!hKB9F>;pTuu zgG6>AWXypxT=3$F|H{5PfuwtsIfqT6p!g_fblgBT7%}xo@&{5J>HaLZjs@h<gP(aw zG$_QrGrD^9=qh&k<T|^24P-(DgJmnbxh~FO3xty51pb_~Bpn<Ix53~_iL!`=KliSj z?PGTuz_2mMy?Lu*V>9%YqV%e4vbA=;aBYfUvbgnw@=pZFuUNz%ud1nDwW_*iEIp78 zsn<uW1}+$Fd*nlM+0op1eSDm4azYee!H(SeeryJ;{BptSj&*RB$1X_A9{UH}K{4Cy z8;+Hit?@M^c&t8`)5MzO`$~)wmn=EvdtspyRt`<Xus2}Vd}z{%iNLfLP|qc>eHMX_ zOssGM6bn=xAm$numq;aA5H6YM&=B$gPUVSqYj_0A35IkspBaRNOlh)^@*l)_*+1`L z!t%(vaBx-6*t5)Kf5+~Ue^q9Vmj4#xvhjRVG@E003zJT~Ab(+ZyY0;SBD;<`5~t*q z`YYmL8HL&7%l&ydRY_6&al}`hiH{qPhc<?izFbW|9?y6(Gu^&yy?p*4duhx{rB^L* zWJK}5+1<~}7yc4+=&yFS+-Aw>Zr+qvu&HZRLV_`A)#~k&iZ*wwh>!m-<CS>}4xID_ zG^|!*hXR=*3CtZ5mh)o)CdLgc0m4fdEPG&&LCBw^P{FgO_mH~-?9zsr#KP#mvO2hc zvxrHAjG%kK*wcGJjUx&SASDKl6_f~UxKWN0g>ATjcg2IUFv4DDhIegjnoVz(j4U&g z86~scmKM9#o8d5-jErZ*FY~#vuc(+mH7P|el=%H6<q1=V1)(}E&h1-vINtBd%p{+G zvuDRV7KWd-fdP6taNrhtSlQgXk{)}9hkLKLtlex93lfZWi$#iYC5fZ3>I9dNlEq>- zCKQOK&1)^5DOO{2RMC>MI;)}kUHOZ5ySHYo%3v(oXq_V50rfescC*N3;p{hNyS_($ z<_6j1L5esaFF)`iMXdS*)BRx;MfGCI`>FhUYz4v5ql<AA`x=$jO##1+R*9)ti^-o> z6V~H?*!<h3+oih-9{q@*QnhM=8QPs|_jBXVeLkIzw!`S}@e|E+Pddk+|EK%E%FnoJ zx%k`4ZLM<U>H|}6V`n|7DZcb6R+jmIa+B5D*-w%hIi}vUr*BND<zwsAvXv`etK4Mu zre3wUvmQ>`6?@Q1GX~hzUw=5E#tG_8d-|q?Y7r{^tJ9yvIzVGg7UAc>DpVJI{$37J zKpTy)c84=_2JI+igw)j%EJDmdjF=*-sZBi{Y5Ne1L-ndKJ{HihqBxqi+G{X96iGlL z|G{@8Be)RJB-ucc0UeJ}_x-<BcK?f*ZY6fC_bCtjV{b4cJtfKS_yAMNAHV*9w=^Ry zJ1awVsem-&z8l7r^sE6lX!~4(+bb;N6}DTU=Ul0V`kP?sHYynND9bd(#96HQ&ebn_ z3{Gb-=8v~4Ootm()<eN5-Abn0r9S8;wJtBpN%vRP=D@}{xH9W2nwJ!36$YEjR4*#j zCe1O#drFpSiXjt^bccb*tBADoxE>rqMQFffI}}py(;M-K+BG>`$TJwnFg_$_(V_dU zLeDGQZ8H51d<H5vGYF{^bSrQj$a@l-1+PZIe{>)NtVcac%BMhudDsp>4h$Wvc*%4@ zB_<3{JjklBxfQ`oWI|$avv5WXcfRUy;5Gb@BO}I239C$V8ZsbNLdEKfQiTN%)(<qe zBtpufaZ+4VRc2^*hB>V`vnnc%4~>T=X>a7EQFGF(W|S5SHevO_?5Ko{=$M%3jD)D{ zgRAvU=plb*cVtH$vDiI7+ZVNeOUnF!A*G?{ysNXPic)d*;@O3vp^l7r;epdB;?oO~ z;?y*vF{5l^s_1`H6|*O@bgGM2bJ)b59V$;XrevjsF4pc`iDl90@lh#JtZh-o>?o5d zYIeq=HqH|^8`4>|x5T!IS#D%eZE=RGdGV8`EsjD9(N1%LIS@VjeEBG)kpFh0{8^hP zJw;8yiZf29$oLm!1Gf?ltM2PuuqZx{B-E7iYs@JhQQXAA2mQw3r&xPZW+JwBFm*)p zlny~C5zSLD`3o7iGvs22^zN_>I^cC4q*_4q(FB3rQ`|0j?2=CMIf5W2Km3toWM!vi zlzI=WCm25bfy1AalAaOtuDWsT+2dnRS<|d{TCMtOTt1GUUVG81S8Zwhs0QwPHSlL2 zl6yOPQ0GZmbFeV0cu8}`dWEfdIH$JCpPo~+ymb<0&)DTuEJ{tY>h-wVK8~Ayeb=g2 z!F@Wz4|c=GODFXP0G$2^7||CBNkB(Kevkr?=O9%lQ26Ma(f}5Hq)bnvvkt6}G@~@5 zCpaQkML$Sj9Q}2!bu^*H27(Y&q1#d!Y^YE4CPuN}&a=hXR_)?K$rrKtYxmE(`Pw)p zdhD|ca$}N`J%-q6Dd`n)9m^K(T@j;qNrGi#Z}EI4NT$cmQqCJos0+Lpu)rd9YxVMb z{q|J3!hW7)oXb7OYd+RTUGx2>y@&KXZBekLD7MHKhskO1B-JlWTi&yNZ=+|0$Eu$k z%}m^J@+>tyP^pl4lir0r`Z&<3I4dJT5Q855Kx$qdKm#EG;>&`pqBlw}67LtCL#LKr zP^n6%fyx4~<*FiG1V-UfAAC0&yp#+mgZ~~%Q{JqsuAZojX+>h9)otd^YNv~T;V|kw zjnyf4Jm%1wlZ@WA+aFxF>u}bxu>V$;T3G1A0dHd{&m$Qi&%i$XYT9{E^}!V4#yOG@ zxn-#*#kEy@H8v^5;jNVaaasPNc}0*Xu$t$x(A-sHcNlC;aGKT_T^V~)Ry}at+B+@{ zjds-~GH+I3hCelX>Y9z~a!p)de>>iD{Mjp9Ci%J+`P&&nMU~C)1Hcf&Ir}!q*G++s zxLxQS5{1Pd?SfIV21sPH1yE61Ks!KUYfG?<LlFV5<W&y7)xDv?Tg1UBSI-PnfQ3O? zg2{%Bl!KA>yMm_;z`P__1pOuD?$VxJ=s`*pE`x!CslJ5wr<Cl?w#?8M`M``kV#=xr z`<W<L=TyM*bQXJJ>>oJ+y}lyT%s!BB_805*;dH&79sLC)5WEie6Y2K2gqSDZl`=kM z0*kfyQf4Jw$@R<^E!^f19mUqN^*m>9sQUf1+|tZH#@W+S=f*-K_N$nf%=FprKVRyI zNz0rU^-RQ=91A7V@|>)4p(%P_cE#O=ljT-lo>=ZH&xX9AZ*opnkX1|7Iq3zH*P5qh zW)$#snXJ%ufp<Zw|D_8uxgUNHB$hHS&TC1$mPx#zhutCnedet9CMAZeite70yU&}+ z%2OA3Jx-r|guRg7=!%X_lUK6^>GPsoaB|xGLx<#c9?O}`6n}NPQ^}BrYr$x(!G2%> zr!KVMK$Rp|rN>f;J5Bo(?6!P5qU|vT%3c)Pch0badE&A0SC%xadgP)DLtKPqj?|r8 z?o4ln3%Y;A8_*G&Kvo5>0)u2`c_B+7F1@WH1_DY3yFQvf#;ko&!`5i?`K#NYoc!vw zZuhEF-$IndWj?=Jt~XTX2><-lWSdk0{(V+nEIZ#~zf4?zEI*C=4Br)kB`oTJhvkp! zW~`O_65UI;CT1r-cp*$5nG6r}itnyY&N8{3ZmY-W6;2F3Z*!TeoxgF(pZq>$PRf<P zu72L;HX&k@5H!SkB{?k55U}Sp2s0D2^Tz5#bH4sZ>|iJ)<Xh#(&F!oDp;i?$P<_|x z^-u9h*@;`1x)T%K7d{vz8i>rNwdGr)EOmirSOj@aI>%6ZNkal&y#akd%Z!h9PH=pX z<p%Q&8l-UZl;z2a@k7tg1+6!b3Fva<q7V=%bw2dX;;-HJ+u!fK_R=q|UANR{sGWPq zhaa$o$9%OFIX^vo*q)TSXxoeehfr2FbI0=Du|;#=o#EoS&vmD##TWKZTAMH{*0+Iu z=k3Ec-+cJ(YyYt~rK&pd?|0t)$tQQOm}|>unSE4#rHx6xEAD*#{#Db`j(nTHb$rq( z`SIDCw`IE4UK1Cdl({%QKiRpYvTI-Ol)2E3n83%6*X4lQTMw!im@x|=F;1LfZo~Bi zz8NanVFA(DOnN3USPvw4gNFtrRu0qgkpyHaDRvGISd351$@kpw`x|c>3KfXn$u&2; z`YH>)`XD!_1eR6A#F*dni;b15*+r!}i>5Wk&f1YAUQr*cES(1_$e9xt2lm;#X>q1N z^~f!^j11l7%FB=Wh5XVRZ?du2qN$s&8EW<jdzf>$xAD=en{wJ`EcLpk)nsQzwbcYS z`Gd1Uxu1V+O&I5g%~#~+ly9P;rmZu+8N?k8GcAjx>r1RXidKDjVTGVLT0Jn;=%&b4 z;Rg2DM0S{X%2U^#WXLMY%5+<^EuvA1%GkN&g*j1>MX_d^W76@)P`%T088<qd)>3<V zb^i36ycv1b>Go2a({ALKF?KFD>=KXUSYGYYJ3Q7Tk1Ni}n_TnL=PkP}eZH%SJ7V22 zNmh?T@7kRtc?vyJuFI61o{T@EJ6rOw6X){5n9c#d;0Ek*S7H2tlnGpED3z&Cv;vSa zF%Afdu{fd=#`T$~KS;8SP>%}g=rPh(qP!r9DH^uY8h5@~kzlghqids+!c%8YwPtRg zpBPMh53UQm?!}(WIA2w`YGpXMVoJCwB|bBDQB<7UXm}4v=IzL^PMtF~nB=H+N83#a z)$d57Y|nX>TZ*nWBxEG|@?BYpj>LtRrdlofq=r;Wd8SR0(sQyC60&pBCCQOlX-REJ z(p#*)-3yQ~%bk~!kQr~dvUqFdWm_=^&YauN$6lVGU&EvSYZy4!f`Oz{;h+$3V9B;B zaIj<P^K+xYK>;o02H~N=!ESD}J8h-5^cocoYSL{%o5NvbyP58+$p9d*FRvk~X$=Ub z2Ipk}2>f&XbGS231p<qmfS`zgz^np+$(1K~1j{*dfe~+5v2{&Y&n~It4}d%aBH&dF z+-@+JBxV03=!uqu@KzyY3WA{^hB;b?DIj^vszeagCf&4w+K|U1m`lBmhMGoWQKx*5 z{Oi>}FPi6cOn+?AjyX?&<~CXM`ez-!(c^n%-K7h6Hs)HHe)q>mS?`Y}S4F6yJZNv{ z{?h5q!P@gT)#`PHs~cwK7U`ouDNLH`&)28CXumgfp)=WFNSN)*w59lQ;%<@eNHWB( z;4HB)EeiZSeHrV6mm!lQtzc&11LE9u=UrX1aMP?*^-M*vpV|PLc`fWelWZH9{J`%M zerZ`{23RdQ^CPZ4aQlQG&?DU6o%IWH$X3#vA(W62?Na2jp^HF=uF6HqmHu?hmG#yG z`BM*eOqoC5?w{kg&zn`-ad1+}gKuTIj(s9YpMF3I3a1?EsGAAop5<3l9GX)2z?+#d zNRfO{{>!0F?;Kpc`rtd84l&!onPdH9{rnpK!?DR@lcgVy>BxTpA1z3+&zo7_acD}> zgKuYgKKfj*|Ma*k`|StwY7TWyn=#*>3&|$?{F!x~hbaXr|C3(-$p^0Nw;n8-a=5c< z{yck1;SuJ5q2+fsZ+e$3HamFo7?&?%+qlfOefbl1lTgOs9qi<fg;g+FUd@ieR{2qN zU!qfVuiRK$!suVP8B-4nv7v||k`mnC%u;688%XUHc$SsAplk=tY@9A;mBDq>BK}bP zSV!N%Eo;293od`*1>x8KkdwXXWuZBXda7=zaJ%IXKYCJFdh$1!Mt*y1V_f6{$v@*z z-^sD2{Vr+7i<b++<uAVb)fZEi^v_vPlFFZpzbP0B2l=nY9%WygxT`E$v@f|lsV?my zpaIp^yK-J=0M9QKmUSzD4f}MPbyw?thxZ!C2iqjbec*V6&?D^wzTsiw3veMwIi4_L z8J3G^FYu!JQ*JOd8l6QOG9Xbk1tHC_YM+jXF6>jV`Y20{@<zePn2!?a*Nc!|r!6fV z8!I>JRSICq&Z6Yl^wHK%S;Vm{VXvZ4>(mBX$~nkA!t_dmJi_9%^0c(_i*qJt=OiWP z+?zc)Cnq^6=Q}yLPaeN9>tgwx`_Fsx>V+|#7jI6UQl9K9!>`YmT%K5B8@Tw&8Bxhi z;p54R9^BjCYLgqPTdJqFP30rAztuAL>ayZh?V%MJ5PlVBFJa!g$(8b_tHeopS^;G! zq^Nvl&&D<3;D%|wtQE757RN>x)b!L&^0>U*EtunDoy)$wG(BO`vPBh=)dq0!I}c{Z zr5BW~6n|e?R8(2?)#AbAyu9SW<otYG{!NI#bmWDOdyZ{hzV!aLzb(HJsR$_lQsUM! z*F&@QuD>kZxNYBoUo{l-2Ltox2TJG9myfNxy{BQ);oi>mE`510-d+FPV88sw+UkSx zY%s4{&0kks-^g4k>kNfQ2g^GvF1zW%#X%hGK+&Mk@9w`utges@Qk28R^sz9avHSDn zlE#U9_&CUpkd#0$3$77pXRdG+A+HS>aAHI;VM6I}830cLF{KlU3}L@sKJW|c1&ytj zU*5WAa%a!}Bgc*%x$P%xMQ?8({;}wDNC>_uHRX~yE3SI}s!5SHlCOAu6Q%288_%T< z&>TfyjLy=t@Bnotz!;F60oD&mrd&BL(<{=?pc4Rg1Y{n)uH-wn&Xhk~a_cKcrp_6C zWOUBdr>}2qwLce}yWFzd9q)&}>f^=s;G|;tJJRyFf%;XWqpRu%;_CAqJSUoyvllx1 zUH}<a3RS>A<Z9hMoeus2G3g`-85>A53Fm5s9PM$y8v{hG1t?dc1>}<q&7esD^#y3w zr;}MaBqEgtEM{S_0YTCbRRjCzC{JCiLBT42S$1r3vlvNeDMwT!x{UdXOEP>O1U%O@ z`h1N(y~$h=A4o6sT(IawV+E^xz*Cty$FjQi(2bJMnqZGHvYerTc|{fdQL{pBABPLm z`V_+@>((5s?YLt_#m^EG@^<Dw6NkO4v(cT@ZGopvrC4T!7}mUmzJ}DMvfK-5Ctq@2 zf3f_5d;{@{*lqUOq)EAxt20Jg7cOkQBfYvLoL-s$(z`Vt!eMaTp|{OStIiF2FJCLJ zoAzM+D;Ah#t35P!43gb?i&6e%f04VqLLZ1O^O|$3=f`s0!*lBXlDasxln37R3Z*Ho z<*^xi9JRAh6kK6Io~CAzxwy_6su0sGS@lH>ayI-(yx(4*81yDu%FC@$8S$Z%8YhNJ zp`~;R4$V~dPG`0O5dH>X04mvw4)m}Lj1BP$Kwj7dAV=`I{a_A|5QCH~2C4)D)EmBn z%7evN71PkL^|n5#skpJSF|b<SciYy6hL|d&W$dTSu+Snvs5{>By8&r!3Er2im7X|g ziAS7ZSqK+sje&V{XU$zuyigcCSx8FM!s`x`p)9I0v}Q}AI3qPPGp#{t+_ENA8C7O5 zjotZ!DaJTU5QW~gK%lp&GlZSPC@W}*Gfw$|adKLL$5Z5+O6vvj-PCU_fxmO?zyV75 z8XTSrd1O{!wPc}r1WXntL63%)Wq{-1io(Zc7E&ro4K!}h1ZXDk*sy~@e<2g~7_2r) z&t@3~bKV^nidnhyXJs;$Icr|NU)p>}78;vrOt7qdLz<gEEtav^Y56b?&C4wD&##=e zN`6ad%x$3PhTKNs?H^Z$>;_UBRLp!(2j`r}o`(yqxwEOv*>ejs@{S*0p2Pb~@x^Hu zH48pp!0Qd9rig1UN>=(tG|jw4tV&5sOQ{l{&o>HVe&NWX@>##-waMw}$+i6U!zBT$ z;p9594|3nhbxNlnDfbVuW+^$nBsR7rJvrmvM-~#e;M_O{Jh?vtuZ+tb#p{w`2gr}T zXh63STn#UnT$x!C^9ork6B>4Sb`wJ$FeC|?tPIxED7q{QNAi%vD0A>E16flmB8hfr zD)>WLegPte{;ct9Sthtuo*0*+=pExF8yjV$%Sxs;Xd{cvY}QL@?|@MdZGj5yrymyo z4MgM=JJ>Q;H1Q7DE||B(Fg6u#apjN2cE@k|*avLHC9e=}a3AMa<DdYi!w<P#(~aUE z42BkiD8DCi<40l{H%wUz4<E+0JNP<oVh>0Ho1%B?H(n@7TO|ErL3%|m{Y~T!xA+4+ zd+Sec%BAoA?QOR6O*Z|fW5?fOFvE6B<7e}k!z2V7^!(6^>}U6#c<2wee$F>M%O1bw z<dYv?+0`UUn^wO+`cZ1hh$K8INsDflgg?NK+ZQ5>GKiT=^{mMt6|@=I>t<mWyB^K~ zOANx4C0u{rEKw})(+d|0!Y)xixJ!`u^}xCcj4L!;5->ls>ga$z-7b<L3s|8bZYbow zU?)dmiGWxEHKLeEP-I)x!+j_*VKGqUNk{<pOh|mdl2Y7Q3b&r6MTJGB$z}S|#^Myq z;wij(%HsR3f9rbu@$;dY0rwh!RCvcY3Qrm&@v-jomE~5nMWz>ssm@rlIo6pf7EF({ zRm^N|<~R0ScU@2Sb=S%BkJ_V;QFaO0p(3RSeUEBa?L0yGMiV67R^ZeRI|1d44$B%a zmPiy9Ed-#WCc*z)pbEB)=qu0q7VWFFq!Yh9=3JS2QB*&zxNv5X&uN%nJ9e~oKC}iF zgd{^CrXVTDpOaJ&6W|ZIZ0l$ijbG2|1)J*>^ng!P(|ZxKSvVh`+Ko?^A4{7ubH$vT zx{i*z;#KSC2E`PM*MxswO9~S)?G-o8>UCnTP+^1?NR=2@%})+=u1CQyPX$d<1Kq+A z%vs`_k3#@g0Dx=aWuOH7=&5nj+~KJI;aOdBkq8SjGNqmgjW4?p6wyWJG*;+~6Y_I& zbMq65^%add(X*g29bUBK`#W}gUrd`QN+07Gd(jaS<KX3vn2GTWtBHI>u_U1x;E<0H zEa(9dY{_VMYlWETaGOkSN1|BK+C932Po=_l$iJ;7aH9*0Mwu}Vx-iR`*m(q*>n6aY z3Z+oO14HrD=-2vh2YOHi5-^!cm8Gr>YIa=PT`1%{fNk6!M@R#{fA#FbPKml)6~P20 z1`0*f8q`8xKe-Wgv%<12JnQQnyXU{?Qb5p`3iPpcN(X5cJ;>$v=-S#Z(JNZ_zB#(& zYdy@KRJwO;-RX|}^mOn3?R4D907142<rBNuCBA$HACS7^gteHo+Ox54fO=D`D-lal zkxRqjAUK$cgd=EIKg6)Z5U%w|fAMVJRQLERkJoM5?pe=f!N}*V%QR_Y{=t=>$qzqz zTB}j9g!`i#Uv|z~v}l&|<r@#&e?NZ^>IamZg&|n@y+5C0C-@AF;Dly%K3Yn4d|@i} zw0S@>)vg&21d}bg6rRfie$4_Ve@V5ydj;9v-77!*8A=y>_n#4K++X|ocGk1~^SiVL z>vbec`N;R6hI!SMe`d3l>?fwb{MAjWtfl<XO<%ptrjL%^thM@d-zmHhl5Byt4Lb|v z5d%*VScmCSr3;}<M5m`bOYh5~(=$)0_(0K;HMRLKUUBm7D_+d6U9+TU{({|4z4p}Z z1@d7{7CUeG1qZLaM!xu(YY$$qoPTaFZrSnk?Kiyl-VNJ-zN4kse!;b!NR3RL*K(Kk zF<*UfRr_b)$!yzZkpJ{q`&HCd<?L6YeMl6rQaZ`?PMA%ez*$p?6l#_AX#!aVX*0AK zQ-hRI2)m3=g$3n}?=+S#$hmaa)4O&(&2EN+0~=X711yt`v$eGZ=0_pUxDFU&>FCm> zqdjdEvu9U88A1W&6Gx<VUmXFoN-q;tr7kuq&;mjsFQ?%Gk}b)Dp2=+R79xaCm2*gJ z-__%4T2B8JIz1P?LZC^*oaz^yi*6N!svrk+#6)pBk1*;;t1qg4th%T^%`r8f-JL&m zR1t*{A-FlF%s-BAm9a>w%8{gnN#=VHsa?*bB4?V>_AimbaQ4Kn53gAksICqyTN5su zJD1&}$mz((kWj;@r>z00&nlWd6UqA4QPPQ1{onQD=~bGSDuBTM6;91O2d7F3(W2s9 zLYn8|T-Uz<Bv1#VQ}gAe`BNwK=Kp;^j(!P{)2kpi0e#k^@5)a1BzsHg#jzu&d-03Y zp));qChp{e;<^(AmS>|(uGlC$j(HT1b)7sgrKj;IXEZj>WT+fM&LD1J_OR4Ls*l*q z(0*St?x?Cn66Xlq2=RBXfAIcmuf0F3!jl#b&CDrGE$O=Fk~`|^*v=7bS7u(Zditi- zwW-ZL2jmZbwQJY=ENTCiKfZAN(wlb|t*M++%RhlqRfYV#{G9wl`NvUtlN<7qoXx9x zBKzeX35|WLYW%Zc^=lYDzVEu5<-IgK<MOAzyzFWDN8JrGXOH892>1gx>U`KST(A29 z7zKa>5}U&3kmea3T`C7PP8?q(!vL&C%aPcrM^Mg1kzT=ZU_koGHY{==3Tvr$@}meu z(76{7H1?;&I71DJE<MRiU^7P?a8f96CrjuPOiSgNNlxqq)xvQiL_AGMb3xw}oeN`_ z*unhB7sISmTR(U+YryaFO>HUJbY5U7kF&c?($w^%6EDR3)04!Cc>mjVaVxT%7K77Y zh?pqBk>{-y%(hC8Bnm!1{Hf<A1t8BFtxwo=UCH!@lDMP<S59DZ&g85_r%^8$%`o8a zP0ThY)Xtc~f4<vQId8GgnOr&F^k`17vWt5xE{oCUYPhgvos~yoQU%8akk7xAErBL; zSAr{HYWu<$zLJ0U`jX{Byfe;oeiD2g;m2q0Z1pd2o2`0NZeU5_oN%sWEwXvy=Qt`I zaWQcfFkr!plQXLd3#&3)s`A{D#094%@0qP-TY7so1w%Q-PLtK0<SH$lRb31tL#Z(y zOQJV!vAbc;kzMkqzwtG$nUaF@f<>0!vV!feb#LkwVyxaMx5<@y*LL}%dvho98^~G} zG!Mgm12%DxTp%-y23ElgP>F!e<8u@r#M`blW%*7XNs4jC{))30i@_o{144R^Rr8*2 z&`0<U|6ab|DnDdNj5ADQu+Acx<;y<ubl#T1Z~P{O0!%EJ=b?4Vrko^~VqGOG4BEb; z44UEKJOLm86hyo!Am)Q!HsBasU~C_J&}j9L*3I~j6J}|s9Ib2^t)GnG<oYLJzI#*^ z@*7pcqeqp0r2Ia)Ek@XLawMj0^4y&Tf{vobbOk%-?s)Ra9goXjGQ;DKZ09e~(^$oJ zwp&%MQ50;b(f^;fo$nd@|83jZ9{K-C+e4*fZTJ5z%<S3oe*-a^ze)w(O$vQe1nYvJ zB*)<$Ysr7#Zov3|0_pQNY?%LF!?=@R+%O7ICr%Stt8aiL;ZmFgw&TQSqwYf8PTiHd z1G+<48zDTSi3ftw48#0%{!f-cl*4{6&dSM|CMS(y@ajcHD%j%&>p*=TzY~ufG2^DI z;q(2Q)BlV7<N5SjzVW+sz1ci=CCsEPG@J8hxXNd>uRm}~M}+kHr>C!dWnn&ErK*Cu zE0x>r%5_Y=!9E*3GS~n^U_5eSLiybZxnwPulF6?oQ?HO%i>G#=8S&=)RljeYeqj9x z@a&1IUpOl(sV3iSmhVvVt^C?Gs8pfKH-G)@yI)IBZS@Byro?W5#*<K263$NwAh|O| zHw`v1F3|1JU7_2rJE*%&cc1Qix~Is3FZS4m(<C2}16ik^u<sr}=L;+26At*byE<NH zp2y=S?${@R)kBNB0u&@YM|?;yAJ2eIz%yR{c>eMGzbgOS`0-~wIj{%qH??L=S2NXR ztHxf1SHsR<bmBtgTBuz2P6(?p;zE^L2N&(Y`kpz3ojD$h1=gA5=ari$!<2|KrrFXl zsJo7SE%)pHHb$+D9X)#2$g@PdZ}fQjqP*UyCr0i%%DzKwi!PjSRmwUmX6*F#fRC;} zFwbT8o!z*?;Xpe1T!OiY3FW9|F8sGKYF)}6l4Koql8m*v8oGWP01*m_=u=5KA9Iu2 z1jw=||H*uL2Ix42Vj~)o*!-aWNL(}wc0Ts=<D&gw3o0j4P;n<ITbyoy`#?t;bjkr` z9p(HL2T#KBsFYZbe9{vO@#&*HS^n!gMx+!(Xw@8k<`MbD@11}A<|f8|co>pw0yA>v zFz!3P#c0_0114N`D=T_$``GdAPi)`*1iPhsjS;ks*I=%!9eIAkj-xhnU5(igD{-f> zshbOzynpf4|Gb7RU)uk6%gU84Z}%;`lj%N}&tEE7O~uhZ@RAp>z+(@yf;-KIp8I}x z!DI5P^955(tf|OqvWk_zW+iuA#iVDpn#>zsli$mvI=7$FZGCgP-e?YHo6X_93;UmF zwmN>eWA&Yr&E}k-$*7<8?giVAU#2(g{Ie=s13AS}aA?3%B=_Db)9(y}j{!}bz<8*~ zJ?g%B6!NI+Chq$f<~O#PjBK3i&fUL_9~G&2j~%7mH(fB+3jam%K`7{~!1cNu7L~(+ zy=h;dw&bj>vBtMm9KnNrBUkX)?+a+$*pYEY0AHsXIp-+-6y9(hF$h$CqJVmdLqK&a zaz)CwldWB7-owEOwgIH1fMZBlS);Sa6aa|k1qDt}&g~oVTYJssk3Tk>_X4fr9*@9T z&wOZNx4r$Zl4;pQ*Tg=hzCoX2Y{;`c@qPYdySUmWO6x80W2*PAyVU04t~7VT^GVy+ zhnU@kPx*$lr}N4$i@LL5fcjI#@d_-FBkZq{^@S`jHYmR$t@{QVp0)EJjtpP>CVHKC zwK@aG`T<k;=#N6!kN%<V4fKg0<~}@-wjldSkZ;4r%?-C7inahL2>{8vN%%r}=W%B$ z(_Hb|gBcG?AUFkN5Y~VkE(GrtKO*q7;wN+fJOUo29}*gAigXo;osss59xv!U`MCtT z0Y-7tL3UXoH&ltG9z{;ZqrR6sUVoNd1cHI&I+7p&q;$?!N3uAwtrmOGDX%no4MwBE zYcw26x2D_tR;zm3LQw{z$I14jT^sfninHcc`?<&9(%S_|Fgz!CeQEma<<nfbRx5`e z7D31>*PGWbp4^j|Y{)20DOhSxob0p(vRs8Wo6THMV&gai%S?{*q({<HS3croFfSI9 zmzx7&R+BHvTOOMdV}n!S?DY~$wAsXDNVYq;DV=-ba$R<ttKj)ZQ<iQ_DC+K<n)P=K z<U<&-hZGNNbHUJ@`?;7A6_p(wC1t!}G#WkhNuGu2Hk;p;W=pqPv#jYGDc)#wdRA8F z`4i{1EOjSm@ECoJImY2}$I8*}B)i)@z07H|Fji3D&cVUa!ocDkW<zO7Y1^!@L#!_E z8H};GV&kFdpNLFJqLA3MCuH|Hdy5Lw9-Z#ASfk@AJyEVH$y{$@l0$;)v7F3MdvV8b zQm$Ta2;@wiR9BlEj*m?a`}2L4xCfbOU2t3Znk9<_&bE9L2<iyO0S^KOrvvVyNMD$w z?n(t0<N^UHVB!%svr0r94jB=Zo+^cC++q2Q%*2P_ycTi*kb}S@@%^~I;{n)}Du_z$ zup2s(9FxP#<bNz%$s*|`Q;Gt)(Q8)dOQpSkEXW_bT)uQ$T?xZMH!rH+#y0b(_xw@s z6s0x3l%)-0zf5#UGsiaIz*XP{Gp>Z?zGt@82bgi}jd`<0OI%h}?mL<C!YOe5Vr`GJ z6_@etZ0}#D6xw3jtqJvGYgV7XWdsD8avq}ihl&Cxycjh1B8>wImJ5vIN5RxqA_FrH zs@2572~8G=#8x69z5(NV=>~rmtP)1KN?i~;E|k*J)1YM>DD}XM1K28x)<y^k${_Ud zb$yi^7~_)BZZcu_4qrvEuW5nldr=VelHQ23*c0z>-O3(Ze>l-?J=9$=Cy(7F3C?I= zOiomcQC#KDxT_pC^QMT7w4}n6kv>CmQNZ``#3MQW;Ul8Q=rkAw7UD+1DS2AAFt5=8 zA(0!o*<jI=g8{uovVY3nfse6wezk8VZsjl~Gu2+_b;dcZl7NWP8><fQNb;pS(r%Em zlQX6W(G!t2))h%te2N=qOaH`*76bm>B50lJByg6<YMBR82m}id;C2x<VRX2lh-w<D zpjDkL82k`8Ac2A^PVl7=Cz3vkRIUkmAQNf2LD5~G?$Zen^o2hgyz&+b5Z6FDj_r=} zA8;4WfDMgkag$!M6<*jqk`i^OmMxUm+!^N+#KoD?*1WX*Wa-HHKbPM>e69S~^~sLO zw|{F_PIhXxNfa*p$t_zOL`Qkrd0#$!O=hMi9nQo;ugPP(9?98#=>=I?S8aao(^>ZT zhF`y0oHk=sMkaa7nFW=1eN=iTkVoP4?m&{jrHbrYIKMKwrruJ`EsJt?C59YnzC*C! zQE}jx$A82GV{%*XJ<Ei&H|4kZq{KOohC>Ultl`DgiwiySp_^I88y9q~t86c=iP4J! zOUleNTViVGPR`iymr8w3ZGBv<)8vY4j&06#i|cM)Q)97u{jKbLX4*CPHTjQ2sg`&c zEnW%xe1QwPR>j9#8~m4DwLLeN$2j6+6B4ZEl*vZl{wrR(WvDeV%`t1Tf8LPXfbq*b zW!1kU{S_xw#h^f!DHf-&ED-(&wMYUV2B<D_F@vbgDxpjt4}Z5HH4SbKkv*_ul>-?j z6~eSPWM;Y7&#Oer#)Pmg3sa{oS+olnaA``?^re-%BGFb@dQ7QI$e5a!8S92~PqrcW z%%9*w@2k%r?vR+n>=#QrVX2g@V=IT<{4WbG{r+p;zjT3mV*@q6gZa~+$nVMWBaO)= z(wr-w`rxy_AAe<bYUO0B{PsVMoX21A`lah)ylvNfaB0tzH@EQ5^Y5w1N^&Q7&5|HG z%(l$T?2Ob{8yow{wkMinOSd0o-dl5)<!rXSChwHx8>~0qngDl_DX%?Ehd@uOH~qD* zwHg;Z@OSyv7j9++e|`O1ksR-mTZaNy$`}2WEw7hQ^6Gt0{p{86?_I%@+xEVSsR4Ns z&@>7TC3|*7(9tHD?tbWIUj@DF`(gVBa;IdW66dL8xw7<s`%G5MfNC`<F<8=#ag+Rm z;^UU&9&ncMzj{78;4F6H4;DH9?OptCdG^VpWHVK$&MpUG^gm}&iUiBg>2&(=`%gnh zzCs1%*%DQD!bmw$!sq|PoyLagim<*d!1{JI(VBo(P%#kG@j!@A$c(}>yt)?AcAAc2 z@J=zY5+y+c4O{4OQ9sO*D%dbC07Zs_2{OW>#H3(>#ID;VMJbP904q|7Nu-?yy<RvP zCfmo55Gq3|MSh5?!!na;W0_&3&?n#Vgx6-X2fR;|*#gsT?ed>rbMn~K9OnSo4Fk@c z)L8C(P5yJcZF;~~_JlV8LqFap?nsI^<-%FC;u!KJ(Ug!T#wSog@j;JP4s(1%Im~fR zISKJ%T7pTGUs8NphLdtl@$8n=Zd<7rjaq-iUuw=|`8UZgd>Wmb;xa~$zD2TtZ;eJ9 zT`9TIpR$UZ<To<SrT!!9(JF7Ltvgj;Sd^--I(QI<&GU05Dyh(JR|}HgxQSJKb3yV8 zH?jP)3zBm4GZ+=5Pc15>aXdqZN7Igq5s^!a3Kj~lCj;(!JkeM~M1#cqv_}Ts%8;Hh zH12(EWca<?x(o>YY~)7fzL!mxZ`r)XY<Wa}<B^kbY?Tsb1&`dpZ{STEe{plfV3>E+ zt0PLtbgAx?I7Pm7M1JY^N97k^h`WTX8fIm;KgP;mi1REbqDk8un00no0QaC}BysLa zx3F|qR+-lT;-vs4*|IY6gBc`0&i*HwK019KPci|*!?%>)e^1Fn^I|@ak*BfZi{;nY zyPtP_#<u-n;nREyEokzy^7}tO|NNh`G=O8;&;RsI`;C+Gqin7GZMHGBq&>j9P|C%d zIzDS(x!~yqYn5Ecf2Jh9=^Lm*>{(AS!%FC^F4wi_dSGSZB6y*CRQIgzW!*cvk942n z8zGA2hoCFA71%OBmJ$;}uWT`($E@x(gc!ZDg-~`0;6^B1i7*L+hrI!1y{A<NoD8f# z$Wg_Z2Xjub0;{vDd<#rdio}G&1cC=U5D1h+%>YTqa2d@@6zTCo1Q!H`o@u428I<xU zs6?y9jHkf791l{8EXt^ONs_{1QLsRe=FF1p9R<nYj~E1lWFQ;p7Nf<YPtHhSPE(B4 z5>C!p?{x+;^E?Y0l5?UBS4;X7dxD;~Fnwu*TU^wrhboN7w;8N~lBoLGfs-|Qr^6m6 z2+l;l%xXx>v088$i^-UZMLaqhS4nhP%WM4Bgv6RlriFS|_PQ@RG{wp~{yIG%EZUUo zugVZZ>+5|x4?i${#-&@97wLlyF}@Rnc9YvxVpFd7iqUC_a7yKjN)&H{44Es<7~^)Q zj`cVli3wAjPDi+ke<eB{4r&G(^L+=LmWGqf`5{&q>t?a>MUOv_72z=D&!M?0i14E< znc=Akr;1+YFkp|BV2duyO}yg#tJ$<Rk;kXn*oe_$H#q#!f3f&8y?*1JhfPV$@07nx z47J6YY(mPN$!cZsdimX`oLFNNU4(Gh>WZ$8Pq0S2##myV-&$Vlc3FA#2Kmc5Q-#L0 z5<DDFFX)`P%D&;Mn=2<@I=INR<iZMXS&X5kY1d5W!gU>dz+Ga;S1VUEFbVF#@!6v5 z<Ro{RD8^)`NupO+pD-1losd|S<{Vq>h!ce<yCWVSf7}yxI?VZDAFTfCVws<ILdw4) z-8wA{9~`<nwJ^s{;)hyT0O$8}EiCFREM5ysI@tcv!g|DS(!vJa0-mLXjXEp8RtuYS zX8wp4hD<8|L<`$>$wCeIJWPazJe&>?M~T7=80Km%%z<$p*1`g0SAVL7MV*HckBHJs zx(s}m8rCDeNedfv-)7sjuu&Jww`gIL&drZ#VT&%8Kcj{1y2*k7-b6p-jkmzhX%}o^ zbi&7&51O0JIJbx(G##NnXf$m>H~<Q>1emZ8;TqtN9^B958d9Djx*_BnRC2c=rLL}j zV9Q`vN9VAwzIkKBH@&&9ZHq5ZToNwy)%5iElvhK(!N^c#aATwm85+=@KD43+_=!sE z2Spn}bbsG)&8Emue=i;uBBlfKE<I@7ARZ$fBR$OsG=M^z2d&dN$XyFN*7Ff=0PlV| zWUA*Q7xYmZ=FeL^r>3@Y{^Evd%Nyq}q^SR(#-++v4WW;ybv|7X-&TfSF~Z~hqFWjn z9O~-t^92jb3X7GG{Lcz+#D_%iDb#h;r4bw)Q78J)4gJcsQ+e}ELq&O7k#4+U?Z~0# zRP)d?btjcIh&tMkzE|nCZp1Ysmg2jxAdDb1UP>Qw(Nil@5796-_C%V8A{eLk$e?ey z-#6SD@tqmkp-Ag6eRz96UgAwV2Fo`**xVNBZ656QH4hIDcD0NsN&5PSyILbd+CUGY z76PVohI(+=cY3V92^Mu{U`eNd>@YyM5+r&NdQSb`=CjHyRK85tIXpZ7y&h^_vkFUv zUH$(}2}KwwwO9I-(JDgbZz{8>2Orrt6v2Ci#-ZE4`p2Kc8wN^9z$xJ#-EN#QU9GzY zwu1KRu406);cgXD<OXJhcUCjAV3%eCx#?g|r~pPY7jv^1EP7rR3x6%~ECJFMNgz{G zm=8?NH0)k8SSIsB|0J8`uv{3c$!BD8p@<d3WNCnvvLFkA=q!T`MQEMC4g<u~vHVVD z)vN|yR_a(iT);N4>1+m@36aLx@U1YH&13UfBU`{0vPIbGEn!R9GPWFkVOFwLY&BcM z*0Lt-|C(6~@Y!cN8*624EW+AZ2kT^AY(47+^Q{;9l>KagZGa7wAvO$?up8MXcq8A! zwzBiEF}?ueliS!RyNF%PwzEs%c5o-#1xb?2pt`z;UCypxSF)?v)$AI!mtD*DvHk1- z`xcC{UC(Y{H^N8IL0ITM%#N^|*|*s(>{fOgyPe$uPgi%byV*VLUUnb*4!fUymp#B9 zWDl{2+4tBZ>{0d@+^s&ro@C!=PqC-j57<#y<9wDq$9~9u#GYp_uou~n*-Pvv@Id`C zdxgCUBf39hud|=CH`tr(E%r8hhy8-R%id$ZWWQqXvtP4g>;rb3eaJpyzkxN?-@$Xy z$LtU6kL*wE6ZR?ljD61j%)VfMVSi<RV}ED=VE<%avai?)c9M-TnVsS~&N$}+7rDg2 zP2ome8aHt>x4=7)jl*ytck(D6&0XBhW4MQVc`T3P@jQVi@+1y^3#>Y)@-&{#GdL_q z@GPFqb9gS#<N3URL+6$k^AaB5r98+(Jj}~@Ij`WAd=j6`r*JTKcr~x#wY-kk^J%<+ zPv<lEOg@Xx=5zR5K9A4mjeG%L$QS8e=ZpCgzLYQH%lQhvlCR>c`5L~KH}Q46nYZv( z-o_)m9ZC<Kyo;~r-MokQ@;=_r2lxg)$cOkaAK@GMCcc?(;amB6{Cs`^zmRX^qx>R% zG2hNF;XC+FzKdVVFXOxU9)3B$f?vt6;#WgcbuYh`@8kRV0sbw19lsuQ|Bd`6evlvH zhxrkHGygWfh2P3=<G1rW_?`SNemB2|-^=gg-{JT3@A3!ugZv@>F#jHZgg?q3<B#(v z_>=tm{3-r4{{cVBpW)B)=lBo#kNETa1^y!cF@K5wg#VPk%wOTJ^4Iv!`0M=V{0;sl ze~Z7(-{HUD@ACKfFZr+d`~27Z82^AD=O6Nq_;2`c`S1Ae`N#YZ{Ez%k{1g5u|BQdm z|IEMOf8l@Sf8&4W|KR`RU-GZ`34W48H<q6gbfDRAcn7*o67(=fVT2`UvtSXdu<c|Q z9D);ep`!(t;1*(_i|rL+g*YKzNDvZ*BmvAg!6&2&X+pY?A!G`EAxp>>a)ewVPskSv z1n}a7VxdF`2&F<07AV6)nNTiN2$jMlVX`nqs1l|M)k2L>E7S?~!Ze{lm@do^W(u=} z*}@!Qt}suSFEk1ZgoVN)VX?48SSl<NmJ2I{mBK1vwXjB5D>Mn~gl3^dXcgLoh|n%{ z2%SQguwLjEdW2q~Pv{p0gbl)=FeD5MBf>^uldxIXB5W1T6V4YdfD*|zVN|$CxLDXO zTq5icb_%<MONGmX-NGK>a^VW$O5rNuYT+7TuW+rfPuMRU5WXc`CtNSwAlxY2BpehD z35SIv!p*|Bg<FJMh1-PNg*${hg}a2ig?og1h5Ll>2=@!$6&}#-lRA2uhlZryk)f_u z{ZOQNu(i_|>Dw6T=^uzlop>G=hlZO6&2(vs^bQPf5l29^i0xfHy~g3rCQu+95kA~$ zpm5jFFz@fy4@P?XH%1Iw`}=#Fy84XDy?<m_=x=Y=4|R3)HTMXu{T&jP%AroN6SR#H zrA3;Wdxpi~uHJ|^*x%e{ZR_9E*Mk5>8^<5?BLfsCb@jFMZ?+8dG;e8Y?HX+DiJ;Db zNb|4(OEsvfP9rr%DX^!%wOefOY3?xNW7-Bf`}-n8=8gS5BfXI(w8x?asREN09vRSY z7;Notix^ta9k>g_%^f0sLt;yRf47k?w8BdRgI#^Y`qt*&$Y8Tb%PZdZwCTHso3RjD zh9jGYn>r&z1)7!crmnW(PBY$h^fmQF+J~)b5KHE8WYD5MD3qa14X+;=8t!V}BGR{5 zy87CXPR*x<m9+Nu=GF-HTGPg^wn)EWpsRIwWH6#1i1f8~^_Y8`2b!p@kwJZP8x@Ei zMmr;IUBl8)XY*i0YVC}mhiJfTL&K4Qrk3W`?oG{uZMODibm91uaXcVWr%MCP00IC; z|9}D14<)xM$;Tg*lC%dYvL1wz74>W!>{q|sHvXV|f@z><WT=S%!`$1|rv)u45Gm1y z{%+-N+b|MAm!J?zZ0hQ3?^m-8wGKu=cy#s;+q7&dRG5%a4Vhb-`^JOKgM<B>l%BMx zL8TQ&H9Rt4Rs#w|C|yKwgysx&ZH+XwkM#6dweV1Hb5D;mvbnXVxwrXrv&4?B_F)l( zV>{-^V8j^N0zkuPm?+TN(?1lkqQCmO`Z|=hOX$zOh_SV~C(_r}Jg6VUR-wPw(AwYI zi}BX?Hh1(zhRx&sH8OCzAE|u+_u);E$gmBcJ}^K<wqn9s+X01<LA5fA_CQT=Xbs;O z83Z}n+!LieclHl<Z6)fk#{`IPY6V;jTZcDw4FfLKjwc`^uvea}D#SOT^1*(gJF-Q@ zY#uUdO&+ohcaHS73^k1mP{%p6Cu%M|n-oOS+1%4^QLu}OQw%hqKoPc{uD)&nr#ixh zfsvt3e3lI}DKZGO0SwdEt)P&uK0PWQ=-guI=t2!GDjcZTfvS;ufP?xZWxiV!5LYX* zk569p(X1p;G8?oHHjaO*UM*Qa0yNaxZ2^d3(ohGt34=pJLT6i>u?5h8&g&CfB0W8p zR_fMvbnI}%+=*dqQlVQ3(tI~4p^*WTa;FZ7Qh~GS3`9ns6{8g3I4f#o;OtCP3~+dV zOGLkE5Ocm$8g3ry9?}D&qR&h%gI$sKR%~L-1i9)wkvazZM+Sga`nn|m<Vc&oCDIHG zA+(MRV<-o<m<O5%6!_^H5QngTHPh%cwE$4N0df6<04_e#!~1)HF$TN3Bg362u%pv7 z0vt7nVk2lnOHV`s@OHHV&5yKpn=p)M52mmEbV%uTXGed32ax}19AKFcAz=(7Tg>S5 z$Z!*VDdq_UF-g?`b*n`UDt(1{1I*qxBo6ft0@QF(vKf>RCeQfFMj(PULWMOE?d}J_ zbO8R_uq3tgV~i~tI8#dNIB3%Y;rL;|>o9hC14cmlAjZBK7!f$n4BXxcq&d>lVgz2m zICn(sN*625pry;IKB|yvpry2_x6OjQ!=3#@==_LrXrybHM$AY+MK$VMu~0=KSYi5s zm1(6^mJ|AfmXWR=%$5!#G7r$YV`}b2?ah6y5q)o@t-EX3(oRi6E$bs_dIal0r_%3Y zdvSXts;z$n1J#6f;!2$veO8PLe`iGj{?2-)Q8Ay%Z&8CvMxz=gjH;ARNeyk0p>8Z2 z`kv+ix+#D%Z0+rDq3=>=qg8`<1>VdXM*4@<rdiaWI?njozCL`6npVQ<-?PQ6p#pS_ zb0P|)K6Fe#gY;~UY#yK~iXcW812{0G5FpY}FB&4XV}<AwdLx~N4y^72&22`YIR!3^ zL`zUMyAn`P3*frVh(5;Z)!c&_)D|%*4MMUW$7y`0As`?Vb+J$;z1RvYW}+-jST4H> z*#IiVra)PRWx~p085+Ti#PsbN09cQ-s39aPFSQPgY~4zI*A;1vU;(89iOR8`2@;{B zAL{Ii^t9Q>7aFxSQM5!g0lfl-M!JSN(W8Svb`e^5Hn+9`L20YDf&ml&IV(m5kh7u) zK~2o0AgIpa-ky-yIy6+O2W$dmnpLby9jRc^A*_xrz<bxgP}fk?nFT58blmu&B{r27 zmx5#f=|_#yV<kg-@wMZW1C^<vd?nJ@69G9(I71C65Q`?Zs;ikvLF-f$N-hbQ)g_;v zX%WV>rj<<vkTZ}1(52L6LS$r6=x7-bMuysiuD(HG{lFGsaHK`(9^53f47U=Q95J1q zvrYvMwQNBX2RfTuFe95v0~OJyV>OOZWXSXNDEchhc(j6pqt1Gw_b9G3NSBax3s%#S zmWaBvX%FIN46}(YO7!V8)R~4hzzv9MpmY#`<H!p%7M?o>n|t-`plQ1Yh32+CvAv|M z#NN_1+ycZ7Y^)9gFk#Q2Wmvf>QI4K|RCI=zvQ2m%8JPH%;L17Stvbawfz0jSG-SXu z9qjLFlQ1zxHlvwcEwr`_b#EEKqSik$IJ98|ivq|2fJ(o<9cZ~HBGQEx@ZqijVQ7Sg zHXJt4=B8_7L}(f5;2XQ8O_8paerz22@P`Ct0lV_;m<}rDrnq2?`T^r>aF0rY)2pz( ztsnG&vi;CHzpUK45u`Y%Ql(8uRbFgUS2iW0sh^?(bSb3^ja7MwE@8Tq(WRU&6^4<% zu7;ADV)S)$31TWJQ$;B~Ql<*ZR6&_4C{qPxs;Cf~g2hUX778Ipuo%?@i-T%uwJ0c9 zj7-5|WC|7|Q?Qsal@!y3-j-0N63SG9YJw%GCRjo_N+?GO<tWkGR#&W+T1WW;lrKQ} z0+cU6`JmZ`3*`$?z5vx!N;Q>I4p?)>g>sZ?&8yc6tS?auu2)h})>5rX_)S#0r9Q0P zsqi3`5u{p!RBMoG4Jt1vYf#HNjVcaN#UUy-M43XADMXn<lqp1+LX-)1TAG4k$`Pg< zuw#r1<p^s{ZBX7(rf?aCq+NMOnab!z8D%P?Ol9<<jH)T4Y9Q&1#H|#fYRV`_Iprv) z90V6Zf{P%*MUdbkNN^D(xCjzl1j{K$1?8xq90U|W00k~Vu|1#+BY*-S<pt#+pa=md za6yg`0Y!*_B2<hzLdB>fL=X`ohzJoxgo-PqjS=8d1PLTUR91*UB19k&B9I6XNQ4L^ zLIe__5~?IXl>{gU0Yiv@Aw<9sB47v+FoXygLIeyU0)`L)Lx_MOM8FUtU<eWV3c<7$ zE|jB`a+FezQpype96`zvq#QK#AsYG+4Lzh4=t4Pylp{zvLX?BXJw)RkqHzz=xQA%m zLp1Io8ut*5dx*w8MB^T!aSzeBhiKek?~E>#BTP9k=(tdha0PlBIdGvI7<7av2Mv0N z20es9$AxmxpoeJCLp10i8uSnidWZ%+M1vlpK@ZWOhiK44H0U83^biethz31GgC3$m z4`I-8p&Wz>LWBuIzy$4qvWPN20_EzA3Q$d98u~B|eOSW>fpT>^1*pC-0YI1lAWSGB zOt2KD@ekAZhiUx7H2z^4|1gbzn8rU$;~%E+57YREY5c=9{$U#bFpYnh#y?EsAExmS z)A)x2>a+~hXf3Q!=X{_hptiiGRJ*GaE>NR2wML!!ftoVyeYtiYFRw;>uGQ{!+Pz-8 zPgC!;TD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4s8qy5Z zY4z4=_10<i)@k+DY4z4=_10<i)@k+DY4z4=_10<i)@k+DY4z4=^=h~^pyAd)y;g6% zR&TvluZCd*8iozjYxUM^_10_k)@$|FYxUM^_10_k)@$`n)B1Uu_Px`zdZ%giPSfh0 zrhV@;?R%#Yq*Q2?PSYx#rd2vkt8|)H=`^j<Y17ohCU)u+&XpJ*?D)khk@U>?v$(?k d0m<LsAEnU!bjr71rTb6jPcEkW8zr5O{~!CE|H}XX literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.eot b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 GIT binary patch literal 165742 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg> +<metadata> +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. +</metadata> +<defs> +<font id="FontAwesome" horiz-adv-x="1536" > + <font-face + font-family="FontAwesome" + font-weight="400" + font-stretch="normal" + units-per-em="1792" + panose-1="0 0 0 0 0 0 0 0 0 0" + ascent="1536" + descent="-256" + bbox="-1.02083 -256.962 2304.6 1537.02" + underline-thickness="0" + underline-position="0" + unicode-range="U+0020-F500" + /> +<missing-glyph horiz-adv-x="896" +d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> + <glyph glyph-name=".notdef" horiz-adv-x="896" +d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" + /> + <glyph glyph-name="space" unicode=" " horiz-adv-x="448" + /> + <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792" + /> + <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792" + /> + <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792" + /> + <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792" + /> + <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792" + /> + <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792" + /> + <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792" + /> + <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792" + /> + <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792" + /> + <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792" +d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> + <glyph glyph-name="music" unicode="&#xf001;" +d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 +t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> + <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664" +d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 +t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> + <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792" +d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 +t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z +M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792" +d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 +q-18 -18 -44 -18z" /> + <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664" +d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 +l502 -73q56 -9 56 -46z" /> + <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664" +d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 +l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> + <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" +d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5 +t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" +d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 +q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 +t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 +q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 +t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664" +d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 +h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> + <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792" +d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 +h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 +q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> + <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792" +d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 +h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> + <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792" +d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> + <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408" +d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 +t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> + <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664" +d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 +q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 +t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> + <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664" +d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z +M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z +" /> + <glyph glyph-name="off" unicode="&#xf011;" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 +t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> + <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792" +d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 +v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> + <glyph glyph-name="cog" unicode="&#xf013;" +d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 +q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 +l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 +q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> + <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408" +d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 +q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 +q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> + <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664" +d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 +l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> + <glyph glyph-name="file_alt" unicode="&#xf016;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +" /> + <glyph glyph-name="time" unicode="&#xf017;" +d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920" +d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 +q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> + <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664" +d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 +q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> + <glyph glyph-name="download" unicode="&#xf01a;" +d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 +t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="upload" unicode="&#xf01b;" +d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 +t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="inbox" unicode="&#xf01c;" +d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 +q25 -61 25 -123z" /> + <glyph glyph-name="play_circle" unicode="&#xf01d;" +d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="repeat" unicode="&#xf01e;" +d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9 +l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> + <glyph glyph-name="refresh" unicode="&#xf021;" +d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 +q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 +q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792" +d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z +M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 +t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 +t47 -113z" /> + <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152" +d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> + <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792" +d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 +t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> + <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664" +d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 +t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 +t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> + <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 +t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> + <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664" +d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 +t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 +t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 +t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> + <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408" +d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z +M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> + <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792" +d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z +M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> + <glyph glyph-name="tag" unicode="&#xf02b;" +d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 +l715 -714q37 -39 37 -91z" /> + <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920" +d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 +l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> + <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664" +d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 +q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 +q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 +t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> + <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280" +d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> + <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664" +d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 +v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> + <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920" +d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 +q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664" +d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 +q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 +q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> + <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408" +d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 +q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 +t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 +t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> + <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024" +d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 +q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> + <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792" +d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 +t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 +q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 +q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> + <glyph glyph-name="text_width" unicode="&#xf035;" +d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 +t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 +q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 +t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 +t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> + <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 +t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 +h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 +t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792" +d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 +t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> + <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792" +d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 +t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 +q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 +t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 +q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792" +d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 +t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 +q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792" +d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 +t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 +q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792" +d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 +q39 -17 39 -59z" /> + <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920" +d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 +q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="pencil" unicode="&#xf040;" +d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 +q53 0 91 -38l235 -234q37 -39 37 -91z" /> + <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024" +d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> + <glyph glyph-name="adjust" unicode="&#xf042;" +d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024" +d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 +q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> + <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792" +d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 +q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 +l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> + <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664" +d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 +q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 +t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664" +d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 +q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 +q24 -24 24 -57t-24 -57z" /> + <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792" +d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 +t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024" +d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" /> + <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792" +d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710 +q19 19 32 13t13 -32v-710q4 10 13 19z" /> + <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664" +d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" /> + <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408" +d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> + <glyph glyph-name="pause" unicode="&#xf04c;" +d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> + <glyph glyph-name="stop" unicode="&#xf04d;" +d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> + <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710 +q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> + <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024" +d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" /> + <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538" +d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> + <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280" +d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280" +d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> + <glyph glyph-name="plus_sign" unicode="&#xf055;" +d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 +t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="minus_sign" unicode="&#xf056;" +d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="remove_sign" unicode="&#xf057;" +d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 +q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ok_sign" unicode="&#xf058;" +d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="question_sign" unicode="&#xf059;" +d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 +q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="info_sign" unicode="&#xf05a;" +d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 +t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="screenshot" unicode="&#xf05b;" +d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 +q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 +q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> + <glyph glyph-name="remove_circle" unicode="&#xf05c;" +d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 +l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 +t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ok_circle" unicode="&#xf05d;" +d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 +t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ban_circle" unicode="&#xf05e;" +d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 +t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> + <glyph glyph-name="arrow_left" unicode="&#xf060;" +d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 +t32.5 -90.5z" /> + <glyph glyph-name="arrow_right" unicode="&#xf061;" +d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> + <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664" +d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 +q37 -39 37 -91z" /> + <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664" +d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> + <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792" +d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 +t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> + <glyph glyph-name="resize_full" unicode="&#xf065;" +d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 +q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> + <glyph glyph-name="resize_small" unicode="&#xf066;" +d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 +t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> + <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408" +d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> + <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408" +d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> + <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664" +d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 +q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> + <glyph glyph-name="exclamation_sign" unicode="&#xf06a;" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 +q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> + <glyph glyph-name="gift" unicode="&#xf06b;" +d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 +q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 +t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> + <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792" +d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 +q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 +t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> + <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408" +d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 +q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> + <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792" +d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 +t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> + <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792" +d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 +q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 +q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z +" /> + <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792" +d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 +q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> + <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408" +d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 +q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> + <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664" +d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z +M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 +q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 +h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792" +d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 +t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 +v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 +t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> + <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792" +d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 +q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="magnet" unicode="&#xf076;" +d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 +q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> + <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792" +d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> + <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792" +d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> + <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920" +d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21 +zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z +" /> + <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664" +d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 +t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664" +d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> + <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920" +d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 +t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> + <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768" +d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792" +d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> + <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048" +d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> + <glyph glyph-name="twitter_sign" unicode="&#xf081;" +d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 +q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 +t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="facebook_sign" unicode="&#xf082;" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960z" /> + <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792" +d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 +t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 +q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792" +d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 +l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 +t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> + <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920" +d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 +l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 +l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 +q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 +t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 +q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 +q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> + <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792" +d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 +q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 +q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> + <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;" +d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 +t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 +q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 +q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> + <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;" +d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 +t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z +M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 +h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" /> + <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896" +d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> + <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792" +d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 +q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 +q224 0 351 -124t127 -344z" /> + <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664" +d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 +q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> + <glyph glyph-name="linkedin_sign" unicode="&#xf08c;" +d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 +q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152" +d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 +t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> + <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792" +d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 +q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> + <glyph glyph-name="signin" unicode="&#xf090;" +d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 +q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664" +d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 +t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 +q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> + <glyph glyph-name="github_sign" unicode="&#xf092;" +d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4 +q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4 +t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16 +q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664" +d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 +t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> + <glyph glyph-name="lemon" unicode="&#xf094;" +d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 +q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 +q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 +q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" /> + <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408" +d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186 +q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14 +t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> + <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408" +d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 +q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280" +d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 +q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> + <glyph glyph-name="phone_sign" unicode="&#xf098;" +d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5 +t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5 +t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z +" /> + <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664" +d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 +q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> + <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024" +d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> + <glyph glyph-name="github" unicode="&#xf09b;" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24 +q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5 +t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12 +q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z +M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" /> + <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664" +d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 +t316.5 -131.5t131.5 -316.5z" /> + <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920" +d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 +q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> + <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408" +d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 +t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 +q187 -186 294 -425.5t120 -501.5z" /> + <glyph glyph-name="hdd" unicode="&#xf0a0;" +d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 +h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 +l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> + <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792" +d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 +t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> + <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792" +d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z +M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 +t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> + <glyph glyph-name="certificate" unicode="&#xf0a3;" +d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 +l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 +l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> + <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792" +d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 +q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 +q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 +t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> + <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792" +d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5 +t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z +M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67 +q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="hand_up" unicode="&#xf0a6;" +d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 +q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 +t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 +q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> + <glyph glyph-name="hand_down" unicode="&#xf0a7;" +d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 +t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 +q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 +q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> + <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;" +d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;" +d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;" +d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;" +d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="globe" unicode="&#xf0ac;" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 +q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 +q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 +q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 +t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 +q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 +q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 +t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 +t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 +q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 +q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 +q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 +t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 +q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 +q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> + <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664" +d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 +t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> + <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792" +d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 +t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> + <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408" +d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> + <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792" +d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 +t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> + <glyph glyph-name="fullscreen" unicode="&#xf0b2;" +d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 +l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z +" /> + <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920" +d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 +t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 +t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 +t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> + <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664" +d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 +l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 +t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 +q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> + <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920" +d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z +" /> + <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664" +d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> + <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792" +d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 +q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 +q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 +q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 +q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> + <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792" +d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 +h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> + <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408" +d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 +l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 +z" /> + <glyph glyph-name="save" unicode="&#xf0c7;" +d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 +h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> + <glyph glyph-name="sign_blank" unicode="&#xf0c8;" +d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="reorder" unicode="&#xf0c9;" +d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 +t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792" +d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 +t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z +M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792" +d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 +q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 +t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216 +q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> + <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792" +d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 +l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 +l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> + <glyph glyph-name="underline" unicode="&#xf0cd;" +d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 +q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 +q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 +q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> + <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664" +d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 +v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 +q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 +q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 +z" /> + <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664" +d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 +l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> + <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792" +d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 +t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 +t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> + <glyph glyph-name="pinterest" unicode="&#xf0d2;" +d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 +q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 +q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 +t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 +t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> + <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;" +d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585 +h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304" +d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62 +q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" /> + <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920" +d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 +v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> + <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024" +d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> + <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024" +d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640" +d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> + <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640" +d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664" +d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> + <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024" +d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024" +d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> + <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024" +d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> + <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792" +d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 +q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> + <glyph glyph-name="linkedin" unicode="&#xf0e1;" +d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 +q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> + <glyph glyph-name="undo" unicode="&#xf0e2;" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 +t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> + <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792" +d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 +t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 +q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 +q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> + <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792" +d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 +t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 +t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 +q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792" +d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 +q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 +t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792" +d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 +t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 +t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 +q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> + <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896" +d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> + <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792" +d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 +q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 +z" /> + <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664" +d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 +q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 +q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> + <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792" +d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 +h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> + <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024" +d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 +q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 +q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 +t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> + <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792" +d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 +q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> + <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920" +d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 +q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> + <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920" +d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 +q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> + <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408" +d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 +t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 +t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 +t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408" +d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 +t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 +t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792" +d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 +t66 -158z" /> + <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792" +d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 +t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> + <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920" +d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 +t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408" +d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 +t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> + <glyph glyph-name="file_text_alt" unicode="&#xf0f6;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 +q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> + <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408" +d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> + <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408" +d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z +M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 +t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 +v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> + <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920" +d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 +q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792" +d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 +q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> + <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920" +d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 +q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" /> + <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664" +d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> + <glyph glyph-name="h_sign" unicode="&#xf0fd;" +d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="f0fe" unicode="&#xf0fe;" +d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024" +d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 +t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024" +d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 +l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152" +d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 +q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152" +d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 +t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640" +d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640" +d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152" +d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> + <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152" +d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> + <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920" +d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 +t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920" +d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z +M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> + <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152" +d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 +q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> + <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768" +d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 +q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> + <glyph glyph-name="circle_blank" unicode="&#xf10c;" +d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 +t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664" +d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z +M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> + <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664" +d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 +v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> + <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792" +d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 +t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z +M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 +q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" /> + <glyph glyph-name="circle" unicode="&#xf111;" +d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792" +d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 +l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> + <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664" +d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 +q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 +t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 +q0 -87 -27 -168q136 -160 136 -398z" /> + <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664" +d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 +q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> + <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920" +d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 +v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z +" /> + <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792" + /> + <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792" + /> + <glyph glyph-name="smile" unicode="&#xf118;" +d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 +t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="frown" unicode="&#xf119;" +d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 +t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="meh" unicode="&#xf11a;" +d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920" +d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 +t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 +t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> + <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920" +d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 +h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 +h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 +q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 +h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792" +d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 +h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 +q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> + <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792" +d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 +q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 +q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 +q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> + <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664" +d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 +t9 -23z" /> + <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920" +d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 +l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> + <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792" +d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 +q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> + <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664" +d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 +l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> + <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408" +d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> + <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664" +d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 +v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> + <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024" +d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 +q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 +q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664" +d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 +q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 +l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 +t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> + <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024" +d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 +t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> + <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640" +d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 +q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> + <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640" +d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> + <glyph glyph-name="superscript" unicode="&#xf12b;" +d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z +M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5 +t-65.5 -51.5t-30.5 -63h232v80h126z" /> + <glyph glyph-name="subscript" unicode="&#xf12c;" +d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z +M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73 +h232v80h126z" /> + <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920" +d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> + <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664" +d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 +t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 +q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 +q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> + <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152" +d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 +t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> + <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408" +d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 +q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 +t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> + <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280" +d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 +t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> + <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664" +d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 +q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408" +d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 +q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 +q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> + <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664" +d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 +q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> + <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792" +d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> + <glyph glyph-name="chevron_sign_left" unicode="&#xf137;" +d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_right" unicode="&#xf138;" +d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_up" unicode="&#xf139;" +d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;" +d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 +t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408" +d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> + <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792" +d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> + <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792" +d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 +q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 +t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> + <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152" +d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 +v-320h736z" /> + <glyph glyph-name="bullseye" unicode="&#xf140;" +d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 +t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 +q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408" +d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> + <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384" +d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 +q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> + <glyph glyph-name="_303" unicode="&#xf143;" +d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128 +q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="play_sign" unicode="&#xf144;" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 +q16 -8 32 -8q17 0 32 9z" /> + <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792" +d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 +t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> + <glyph glyph-name="minus_sign_alt" unicode="&#xf146;" +d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408" +d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 +t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024" +d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> + <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024" +d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> + <glyph glyph-name="check_sign" unicode="&#xf14a;" +d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 +t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="edit_sign" unicode="&#xf14b;" +d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_312" unicode="&#xf14c;" +d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 +q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="share_sign" unicode="&#xf14d;" +d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 +t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="compass" unicode="&#xf14e;" +d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="collapse" unicode="&#xf150;" +d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="collapse_top" unicode="&#xf151;" +d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_317" unicode="&#xf152;" +d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 +t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024" +d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 +t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 +l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> + <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024" +d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 +q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> + <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024" +d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 +t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 +t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 +t53 -63.5t31.5 -76.5t13 -94z" /> + <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898" +d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 +q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> + <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027" +d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 +l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> + <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280" +d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 +q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> + <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792" +d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 +t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 +q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> + <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280" +d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 +l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 +t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> + <glyph glyph-name="file" unicode="&#xf15b;" +d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> + <glyph glyph-name="file_text" unicode="&#xf15c;" +d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 +q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> + <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664" +d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 +v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 +l230 -662h70z" /> + <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664" +d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 +v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 +v119h121z" /> + <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792" +d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 +q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> + <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792" +d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 +q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> + <glyph glyph-name="sort_by_order" unicode="&#xf162;" +d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 +zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 +t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> + <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;" +d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 +t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 +q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> + <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664" +d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 +q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 +t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> + <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664" +d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 +t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 +t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> + <glyph glyph-name="youtube_sign" unicode="&#xf166;" +d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 +q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 +q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 +q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38 +q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5 +h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="youtube" unicode="&#xf167;" +d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 +q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 +q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 +q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51 +q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> + <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408" +d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 +q25 45 64 45h241q22 0 31 -15z" /> + <glyph glyph-name="xing_sign" unicode="&#xf169;" +d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 +l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792" +d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5 +l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136 +q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" /> + <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792" +d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> + <glyph glyph-name="stackexchange" unicode="&#xf16c;" +d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" /> + <glyph glyph-name="instagram" unicode="&#xf16d;" +d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270 +q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5 +t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317 +q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" /> + <glyph glyph-name="flickr" unicode="&#xf16e;" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 +t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> + <glyph glyph-name="adn" unicode="&#xf170;" +d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408" +d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 +t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 +t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 +t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> + <glyph glyph-name="bitbucket_sign" unicode="&#xf172;" +d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 +t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z +M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 +v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024" +d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 +q78 2 134 29z" /> + <glyph glyph-name="tumblr_sign" unicode="&#xf174;" +d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z +M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768" +d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> + <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768" +d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> + <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792" +d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> + <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792" +d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> + <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408" +d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 +q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> + <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664" +d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> + <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408" +d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 +t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 +h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> + <glyph glyph-name="linux" unicode="&#xf17c;" +d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z +M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 +q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 +q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 +t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 +q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 +q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 +q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 +q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4 +t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5 +t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43 +q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49 +t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54 +q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5 +t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5 +t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> + <glyph glyph-name="dribble" unicode="&#xf17d;" +d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 +t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 +q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 +t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="skype" unicode="&#xf17e;" +d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 +t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 +q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 +q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> + <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280" +d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z +M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 +l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> + <glyph glyph-name="trello" unicode="&#xf181;" +d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 +q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> + <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280" +d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 +q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024" +d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z +M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="gittip" unicode="&#xf184;" +d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792" +d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 +l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 +q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> + <glyph glyph-name="_366" unicode="&#xf186;" +d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 +t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> + <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792" +d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 +q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> + <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664" +d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 +q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 +t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> + <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920" +d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 +t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 +q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24 +q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 +q39 5 64 -2.5t31 -16.5z" /> + <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792" +d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 +q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 +q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 +q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z +M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> + <glyph glyph-name="renren" unicode="&#xf18b;" +d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 +q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> + <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408" +d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 +t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 +t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 +t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> + <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280" +d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z +" /> + <glyph glyph-name="_374" unicode="&#xf18e;" +d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 +t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;" +d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 +t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_376" unicode="&#xf191;" +d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z +M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="dot_circle_alt" unicode="&#xf192;" +d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 +t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664" +d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 +q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> + <glyph glyph-name="vimeo_square" unicode="&#xf194;" +d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 +q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152" +d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 +q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> + <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408" +d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 +q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176" +d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 +t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 +q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> + <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664" +d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 +q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 +t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> + <glyph glyph-name="_384" unicode="&#xf199;" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 +q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 +t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> + <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792" +d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 +t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 +t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 +t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 +t273 -182.5t331.5 -68z" /> + <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792" +d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> + <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048" +d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 +q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> + <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304" +d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 +q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> + <glyph glyph-name="_389" unicode="&#xf19e;" +d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 +q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> + <glyph glyph-name="uniF1A0" unicode="&#xf1a0;" +d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5 +t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" /> + <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792" +d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 +t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 +q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 +t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_392" unicode="&#xf1a2;" +d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 +q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 +q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_393" unicode="&#xf1a3;" +d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 +v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 +t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920" +d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 +v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> + <glyph glyph-name="_395" unicode="&#xf1a5;" +d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048" +d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 +v-369h123z" /> + <glyph glyph-name="_397" unicode="&#xf1a7;" +d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 +v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 +q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038" +d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 +q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 +q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 +q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 +t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 +q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 +t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 +t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> + <glyph glyph-name="_399" unicode="&#xf1a9;" +d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 +q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 +q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 +t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 +q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> + <glyph glyph-name="_400" unicode="&#xf1aa;" +d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z +M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 +t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 +q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 +t135.5 51q85 0 145 -60.5t60 -145.5z" /> + <glyph glyph-name="f1ab" unicode="&#xf1ab;" +d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 +q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 +q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z +M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 +q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 +q20 0 20 -21v-418z" /> + <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792" +d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 +l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 +t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 +q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 +q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> + <glyph glyph-name="_403" unicode="&#xf1ad;" +d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 +t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 +q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 +q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 +t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 +q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 +q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 +t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> + <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280" +d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152 +q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664" +d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 +q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 +q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 +t100.5 134t141.5 55.5z" /> + <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768" +d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> + <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792" +d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z +" /> + <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304" +d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 +t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 +v-400l434 -186q36 -16 57 -48t21 -70z" /> + <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048" +d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 +q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 +q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> + <glyph glyph-name="_410" unicode="&#xf1b5;" +d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 +t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 +t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> + <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792" +d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 +q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 +q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> + <glyph glyph-name="_412" unicode="&#xf1b7;" +d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 +q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 +q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z +" /> + <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792" +d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 +l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 +t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 +q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> + <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048" +d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 +q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 +l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048" +d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 +t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z +M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> + <glyph glyph-name="_416" unicode="&#xf1bb;" +d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 +q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> + <glyph glyph-name="_417" unicode="&#xf1bc;" +d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 +q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 +q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024" +d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" /> + <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304" +d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 +q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 +q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 +l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 +q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236 +q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786 +q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> + <glyph glyph-name="uniF1C0" unicode="&#xf1c0;" +d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 +t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 +t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> + <glyph glyph-name="uniF1C1" unicode="&#xf1c1;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 +q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 +q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> + <glyph glyph-name="_422" unicode="&#xf1c2;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5 +t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" /> + <glyph glyph-name="_423" unicode="&#xf1c3;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 +h-290v-107h68l189 -272l-194 -283h-68z" /> + <glyph glyph-name="_424" unicode="&#xf1c4;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> + <glyph glyph-name="_425" unicode="&#xf1c5;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> + <glyph glyph-name="_426" unicode="&#xf1c6;" +d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 +v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 +q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> + <glyph glyph-name="_427" unicode="&#xf1c7;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 +q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> + <glyph glyph-name="_428" unicode="&#xf1c8;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> + <glyph glyph-name="_429" unicode="&#xf1c9;" +d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z +M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 +l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> + <glyph glyph-name="_430" unicode="&#xf1ca;" +d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 +q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> + <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792" +d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 +q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> + <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048" +d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 +q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 +t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" /> + <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792" +d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 +q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 +t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> + <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792" +d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5 +t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" /> + <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792" +d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 +t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 +t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 +q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> + <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792" +d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 +l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 +q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 +q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 +t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 +t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF1D2" unicode="&#xf1d2;" +d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 +q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 +q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 +q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792" +d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 +q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 +q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 +v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> + <glyph glyph-name="_439" unicode="&#xf1d4;" +d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280" +d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 +t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 +t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> + <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792" +d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 +q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 +t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 +t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> + <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048" +d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 +q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 +q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 +q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> + <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792" +d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> + <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792" +d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 +l863 639l-478 -797z" /> + <glyph glyph-name="_445" unicode="&#xf1da;" +d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 +t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 +t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_446" unicode="&#xf1db;" +d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 +t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792" +d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 +t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 +t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 +q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 +q0 -26 -12 -48t-36 -22z" /> + <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280" +d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 +q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> + <glyph glyph-name="_449" unicode="&#xf1de;" +d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 +q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> + <glyph glyph-name="uniF1E0" unicode="&#xf1e0;" +d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 +t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> + <glyph glyph-name="_451" unicode="&#xf1e1;" +d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 +t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792" +d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 +t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 +q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 +t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> + <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792" +d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 +l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> + <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792" +d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 +v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 +q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 +zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 +t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> + <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792" +d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z +M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792" +d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234 +l401 400q38 37 91 37t90 -37z" /> + <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792" +d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 +t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z +M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7 +t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> + <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792" +d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> + <glyph glyph-name="_459" unicode="&#xf1e9;" +d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 +q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 +t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 +q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> + <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048" +d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 +t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> + <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048" +d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 +q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z +M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> + <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792" +d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 +t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 +t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 +t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z +M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 +h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_463" unicode="&#xf1ed;" +d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 +q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 +q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" /> + <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792" +d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640 +q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" /> + <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304" +d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 +q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 +q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304" +d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249 +q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z +M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32 +h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4 +q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75 +q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14 +q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22 +q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12 +q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122 +h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5 +t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304" +d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 +q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 +v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 +q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 +t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> + <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304" +d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z +M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 +l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 +v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 +q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 +q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 +t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 +h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 +t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> + <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304" +d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 +t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 +q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 +t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 +l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 +q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304" +d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 +q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 +q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 +q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 +q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048" +d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 +l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 +l418 363q10 8 23.5 7t21.5 -11z" /> + <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048" +d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 +q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 +q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> + <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408" +d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 +q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 +q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_474" unicode="&#xf1f9;" +d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 +t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 +t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_475" unicode="&#xf1fa;" +d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 +q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 +t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 +t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> + <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792" +d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 +t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> + <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792" +d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 +t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> + <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792" +d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5 +t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38 +t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448 +h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5 +q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> + <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048" +d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> + <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792" +d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048" +d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 +t9 -23z" /> + <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792" +d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 +q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 +t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 +q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> + <glyph glyph-name="_483" unicode="&#xf203;" +d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 +q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 +q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 +q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048" +d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 +t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 +t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> + <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048" +d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 +t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> + <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304" +d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 +q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 +q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 +q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> + <glyph glyph-name="_487" unicode="&#xf207;" +d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 +h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 +t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> + <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048" +d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 +q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 +q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> + <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280" +d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 +t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 +t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 +q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 +q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 +t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> + <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048" +d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 +q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 +t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 +t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> + <glyph glyph-name="_491" unicode="&#xf20b;" +d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 +t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> + <glyph glyph-name="_492" unicode="&#xf20c;" +d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 +q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 +q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> + <glyph glyph-name="_493" unicode="&#xf20d;" +d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" /> + <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048" +d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 +q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 +q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438 +h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66 +l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946 +l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82 +zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" /> + <glyph glyph-name="f210" unicode="&#xf210;" +d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" /> + <glyph glyph-name="_496" unicode="&#xf211;" +d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 +q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" /> + <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048" +d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 +q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 +q209 0 374 -102q172 107 374 102z" /> + <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048" +d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 +q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 +q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" /> + <glyph glyph-name="_499" unicode="&#xf214;" +d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 +l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 +v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z +M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 +v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 +h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 +t-43 -34t-16.5 -53.5z" /> + <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048" +d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 +q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" /> + <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048" +d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 +t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 +t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 +q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" /> + <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664" +d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 +q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664" +d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 +t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 +q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> + <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048" +d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 +l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" /> + <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048" +d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 +q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 +q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 +v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 +q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" /> + <glyph glyph-name="_506" unicode="&#xf21b;" +d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 +t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 +q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 +t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" /> + <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304" +d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 +t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 +l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 +t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" /> + <glyph glyph-name="_508" unicode="&#xf21d;" +d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 +q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 +q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 +t158.5 -65.5t65.5 -158.5z" /> + <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792" +d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 +q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 +t127 -344z" /> + <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280" +d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 +q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" /> + <glyph glyph-name="_511" unicode="&#xf222;" +d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 +q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280" +d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 +t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_513" unicode="&#xf224;" +d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 +q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792" +d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 +q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 +t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 +t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792" +d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 +t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 +q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 +q0 -226 -154 -391q103 -57 218 -57z" /> + <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920" +d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 +q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 +t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 +q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" /> + <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048" +d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 +t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 +t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 +t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" /> + <glyph glyph-name="_518" unicode="&#xf229;" +d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 +t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 +t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280" +d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 +t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 +t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048" +d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 +t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 +t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280" +d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 +t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> + <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280" +d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 +t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" /> + <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792" + /> + <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792" + /> + <glyph glyph-name="_525" unicode="&#xf230;" +d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" /> + <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280" +d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 +l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 +q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" /> + <glyph glyph-name="_527" unicode="&#xf232;" +d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 +t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 +l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" /> + <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792" +d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 +q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" /> + <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048" +d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 +t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 +t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" /> + <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048" +d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 +q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 +t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" /> + <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048" +d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 +q-26 0 -45 -19t-19 -45v-384h1152z" /> + <glyph glyph-name="_532" unicode="&#xf237;" +d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" /> + <glyph glyph-name="_533" unicode="&#xf238;" +d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 +t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" /> + <glyph glyph-name="_534" unicode="&#xf239;" +d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 +t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" /> + <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792" +d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 +q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" /> + <glyph glyph-name="_536" unicode="&#xf23b;" +d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" /> + <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296" +d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 +q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 +q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 +q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 +q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 +q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 +q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8 +t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 +q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 +q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z +M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86 +t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 +q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4 +l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130 +t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 +q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 +q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" /> + <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304" +d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 +t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 +t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" /> + <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792" +d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 +t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 +t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 +q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 +q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" /> + <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304" +d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 +v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" /> + <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304" +d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304" +d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304" +d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 +h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304" +d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 +v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> + <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280" +d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" /> + <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024" +d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" /> + <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048" +d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 +h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" /> + <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304" +d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 +v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" /> + <glyph glyph-name="_549" unicode="&#xf249;" +d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" /> + <glyph glyph-name="_550" unicode="&#xf24a;" +d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 +z" /> + <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304" +d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 +t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 +t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 +t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304" +d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 +t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z +M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792" +d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 +zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" /> + <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304" +d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 +q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 +t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 +t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" /> + <glyph glyph-name="_555" unicode="&#xf250;" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 +t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> + <glyph glyph-name="_556" unicode="&#xf251;" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" /> + <glyph glyph-name="_557" unicode="&#xf252;" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" /> + <glyph glyph-name="_558" unicode="&#xf253;" +d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 +t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 +h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> + <glyph glyph-name="_559" unicode="&#xf254;" +d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 +t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 +h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" /> + <glyph glyph-name="_560" unicode="&#xf255;" +d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 +q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 +t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 +q72 69 174 69z" /> + <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792" +d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 +t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 +h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" /> + <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792" +d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 +q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 +t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 +t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 +q0 -42 -23 -78t-61 -53l-310 -141h91z" /> + <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048" +d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 +q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 +q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" /> + <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048" +d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79 +t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24 +q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26 +l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" /> + <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792" +d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 +q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 +v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 +v-384h32z" /> + <glyph glyph-name="_566" unicode="&#xf25b;" +d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 +v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 +q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 +q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 +q0 -53 37.5 -90.5t90.5 -37.5h668z" /> + <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973" +d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 +t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 +q13 0 22 -8.5t10 -20.5z" /> + <glyph glyph-name="_568" unicode="&#xf25d;" horiz-adv-x="1792" +d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 +t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 +q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_569" unicode="&#xf25e;" horiz-adv-x="1792" +d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 +q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5 +t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 +q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 +t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" /> + <glyph glyph-name="f260" unicode="&#xf260;" horiz-adv-x="2048" +d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" /> + <glyph glyph-name="f261" unicode="&#xf261;" horiz-adv-x="1792" +d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 +t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_572" unicode="&#xf262;" horiz-adv-x="2304" +d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 +t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 +t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 +t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 +t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 +q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" /> + <glyph glyph-name="f263" unicode="&#xf263;" horiz-adv-x="1280" +d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 +t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 +q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" /> + <glyph glyph-name="_574" unicode="&#xf264;" +d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 +q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 +zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="_575" unicode="&#xf265;" horiz-adv-x="1720" +d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 +l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" /> + <glyph glyph-name="_576" unicode="&#xf266;" horiz-adv-x="2304" +d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 +q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 +l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" /> + <glyph glyph-name="_577" unicode="&#xf267;" horiz-adv-x="1792" +d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 +q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 +t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 +t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 +t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 +t191 -286t71 -348z" /> + <glyph glyph-name="_578" unicode="&#xf268;" horiz-adv-x="1792" +d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 +q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" /> + <glyph glyph-name="_579" unicode="&#xf269;" horiz-adv-x="1792" +d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 +q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 +q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" /> + <glyph glyph-name="_580" unicode="&#xf26a;" horiz-adv-x="1792" +d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339 +q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z +" /> + <glyph glyph-name="_581" unicode="&#xf26b;" horiz-adv-x="1792" +d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606 +q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z +M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" /> + <glyph glyph-name="_582" unicode="&#xf26c;" horiz-adv-x="2048" +d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 +v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> + <glyph glyph-name="_583" unicode="&#xf26d;" horiz-adv-x="1792" +d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 +h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 +q-68 175 -180 287z" /> + <glyph glyph-name="_584" unicode="&#xf26e;" +d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6 +q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13 +q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249 +q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183 +q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46 +t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" /> + <glyph glyph-name="_585" unicode="&#xf270;" horiz-adv-x="1792" +d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z +M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 +q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 +t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 +q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" /> + <glyph glyph-name="_586" unicode="&#xf271;" horiz-adv-x="1792" +d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 +h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 +v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" /> + <glyph glyph-name="_587" unicode="&#xf272;" horiz-adv-x="1792" +d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 +t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 +t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_588" unicode="&#xf273;" horiz-adv-x="1792" +d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z +M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 +q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_589" unicode="&#xf274;" horiz-adv-x="1792" +d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 +t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 +t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> + <glyph glyph-name="_590" unicode="&#xf275;" horiz-adv-x="1792" +d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" /> + <glyph glyph-name="_591" unicode="&#xf276;" horiz-adv-x="1024" +d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 +q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" /> + <glyph glyph-name="_592" unicode="&#xf277;" horiz-adv-x="1792" +d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 +q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" /> + <glyph glyph-name="_593" unicode="&#xf278;" horiz-adv-x="2048" +d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 +v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" /> + <glyph glyph-name="_594" unicode="&#xf279;" horiz-adv-x="1792" +d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 +q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" /> + <glyph glyph-name="_595" unicode="&#xf27a;" horiz-adv-x="1792" +d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 +t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 +t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> + <glyph glyph-name="_596" unicode="&#xf27b;" horiz-adv-x="1792" +d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 +t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 +t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 +t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" /> + <glyph glyph-name="_597" unicode="&#xf27c;" horiz-adv-x="1024" +d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" /> + <glyph glyph-name="_598" unicode="&#xf27d;" horiz-adv-x="1792" +d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 +q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" /> + <glyph glyph-name="f27e" unicode="&#xf27e;" +d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" /> + <glyph glyph-name="uniF280" unicode="&#xf280;" +d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 +h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 +l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" /> + <glyph glyph-name="uniF281" unicode="&#xf281;" horiz-adv-x="1792" +d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5 +l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44 +t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106 +q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" /> + <glyph glyph-name="_602" unicode="&#xf282;" horiz-adv-x="1792" +d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53 +q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" /> + <glyph glyph-name="_603" unicode="&#xf283;" horiz-adv-x="2304" +d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" /> + <glyph glyph-name="_604" unicode="&#xf284;" horiz-adv-x="1792" +d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308 +t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20 +t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" /> + <glyph glyph-name="uniF285" unicode="&#xf285;" horiz-adv-x="1792" +d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" /> + <glyph glyph-name="uniF286" unicode="&#xf286;" horiz-adv-x="1792" +d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96 +q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5 +q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96 +q16 0 16 -16z" /> + <glyph glyph-name="_607" unicode="&#xf287;" horiz-adv-x="2304" +d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96 +q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5 +t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" /> + <glyph glyph-name="_608" unicode="&#xf288;" horiz-adv-x="1792" +d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348 +t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_609" unicode="&#xf289;" horiz-adv-x="2304" +d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22 +q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5 +q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13 +q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" /> + <glyph glyph-name="_610" unicode="&#xf28a;" +d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83 +t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20 +q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5 +t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" /> + <glyph glyph-name="_611" unicode="&#xf28b;" +d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103 +t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_612" unicode="&#xf28c;" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 +t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" /> + <glyph glyph-name="_613" unicode="&#xf28d;" +d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="_614" unicode="&#xf28e;" +d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 +t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" /> + <glyph glyph-name="_615" unicode="&#xf290;" horiz-adv-x="1792" +d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5 +t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="_616" unicode="&#xf291;" horiz-adv-x="2048" +d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5 +t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416 +q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441 +h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" /> + <glyph glyph-name="_617" unicode="&#xf292;" horiz-adv-x="1792" +d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12 +q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311 +q15 0 25 -12q9 -12 6 -28z" /> + <glyph glyph-name="_618" unicode="&#xf293;" +d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5 +t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" /> + <glyph glyph-name="_619" unicode="&#xf294;" horiz-adv-x="1024" +d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" /> + <glyph glyph-name="_620" unicode="&#xf295;" +d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5 +t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 +t271.5 -112.5t112.5 -271.5z" /> + <glyph glyph-name="_621" unicode="&#xf296;" horiz-adv-x="1792" +d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" /> + <glyph glyph-name="_622" unicode="&#xf297;" horiz-adv-x="1792" +d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111 +q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" /> + <glyph glyph-name="_623" unicode="&#xf298;" +d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14 +t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" /> + <glyph glyph-name="_624" unicode="&#xf299;" horiz-adv-x="1792" +d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57 +q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285 +q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" /> + <glyph glyph-name="_625" unicode="&#xf29a;" horiz-adv-x="1792" +d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42 +q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z +M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298 +t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="_626" unicode="&#xf29b;" +d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300 +l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z +M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" /> + <glyph glyph-name="_627" unicode="&#xf29c;" +d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5 +t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5 +t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5 +t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="_628" unicode="&#xf29d;" horiz-adv-x="1408" +d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457 +q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521 +q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661 +q3 -1 7 1t7 4l3 2q11 9 11 17z" /> + <glyph glyph-name="_629" unicode="&#xf29e;" horiz-adv-x="2304" +d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10 +t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5 +t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5 +h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96 +t9.5 -70.5z" /> + <glyph glyph-name="uniF2A0" unicode="&#xf2a0;" horiz-adv-x="1408" +d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5 +q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127 +l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272 +t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249 +q-18 -19 -45 -19z" /> + <glyph glyph-name="uniF2A1" unicode="&#xf2a1;" horiz-adv-x="2176" +d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352 +q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864 +q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136 +t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56 +t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56 +t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136 +t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" /> + <glyph glyph-name="uniF2A2" unicode="&#xf2a2;" horiz-adv-x="1792" +d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z +M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72 +t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45 +t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4 +q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" /> + <glyph glyph-name="uniF2A3" unicode="&#xf2a3;" horiz-adv-x="2304" +d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55 +q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5 +q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101 +q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35 +q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5 +q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" /> + <glyph glyph-name="uniF2A4" unicode="&#xf2a4;" horiz-adv-x="1792" +d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19 +t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74 +t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233 +l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" /> + <glyph glyph-name="uniF2A5" unicode="&#xf2a5;" +d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2 +q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10 +q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5 +t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF2A6" unicode="&#xf2a6;" horiz-adv-x="1535" +d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5 +l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5 +q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9 +q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" /> + <glyph glyph-name="uniF2A7" unicode="&#xf2a7;" horiz-adv-x="1664" +d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37 +t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38 +l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148 +q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26 +l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" /> + <glyph glyph-name="uniF2A8" unicode="&#xf2a8;" horiz-adv-x="1792" +d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5 +q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841 +q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5 +q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" /> + <glyph glyph-name="uniF2A9" unicode="&#xf2a9;" horiz-adv-x="1280" +d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5 +q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z +M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" /> + <glyph glyph-name="uniF2AA" unicode="&#xf2aa;" +d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z +M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5 +q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 +t84.5 -203.5z" /> + <glyph glyph-name="uniF2AB" unicode="&#xf2ab;" +d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114 +q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5 +t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 +t103 -385.5z" /> + <glyph glyph-name="uniF2AC" unicode="&#xf2ac;" horiz-adv-x="1664" +d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35 +q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5 +t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" /> + <glyph glyph-name="uniF2AD" unicode="&#xf2ad;" +d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115 +q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15 +t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 +q119 0 203.5 -84.5t84.5 -203.5z" /> + <glyph glyph-name="uniF2AE" unicode="&#xf2ae;" horiz-adv-x="2304" +d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7 +q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158 +q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" /> + <glyph glyph-name="uniF2B0" unicode="&#xf2b0;" +d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104 +q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108 +l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z +M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" /> + <glyph glyph-name="uniF2B1" unicode="&#xf2b1;" horiz-adv-x="1664" +d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5 +t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" /> + <glyph glyph-name="uniF2B2" unicode="&#xf2b2;" horiz-adv-x="1792" +d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5 +t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114 +q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50 +q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5 +t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46 +q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5 +q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177 +t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" /> + <glyph glyph-name="uniF2B3" unicode="&#xf2b3;" +d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110 +h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> + <glyph glyph-name="uniF2B4" unicode="&#xf2b4;" +d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5 +q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" /> + <glyph glyph-name="uniF2B5" unicode="&#xf2b5;" horiz-adv-x="2304" +d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66 +l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180 +q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z +M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421 +q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" /> + <glyph glyph-name="uniF2B6" unicode="&#xf2b6;" horiz-adv-x="1792" +d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107 +t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39 +q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" /> + <glyph glyph-name="uniF2B7" unicode="&#xf2b7;" horiz-adv-x="1792" +d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5 +l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5 +h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94 +q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" /> + <glyph glyph-name="uniF2B8" unicode="&#xf2b8;" +d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465 +l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161 +q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74 +q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" /> + <glyph glyph-name="uniF2B9" unicode="&#xf2b9;" horiz-adv-x="1664" +d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576 +q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216 +q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" /> + <glyph glyph-name="uniF2BA" unicode="&#xf2ba;" horiz-adv-x="1664" +d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5 +t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96 +q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216 +q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" /> + <glyph glyph-name="uniF2BB" unicode="&#xf2bb;" horiz-adv-x="2048" +d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z +M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568 +q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9 +h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2BC" unicode="&#xf2bc;" horiz-adv-x="2048" +d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925 +q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568 +q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5 +t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113 +t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2BD" unicode="&#xf2bd;" horiz-adv-x="1792" +d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5 +t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2BE" unicode="&#xf2be;" horiz-adv-x="1792" +d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61 +t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" /> + <glyph glyph-name="uniF2C0" unicode="&#xf2c0;" +d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5 +t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145 +q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" /> + <glyph glyph-name="uniF2C1" unicode="&#xf2c1;" horiz-adv-x="1280" +d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5 +t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352 +q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C2" unicode="&#xf2c2;" horiz-adv-x="2048" +d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56 +t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23 +v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728 +q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C3" unicode="&#xf2c3;" horiz-adv-x="2048" +d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z +M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64 +q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47 +h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2C4" unicode="&#xf2c4;" horiz-adv-x="1792" +d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117 +q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5 +t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" /> + <glyph glyph-name="uniF2C5" unicode="&#xf2c5;" horiz-adv-x="2304" +d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21 +t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46 +t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54 +t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29 +q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5 +t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314 +q2 -42 2 -64z" /> + <glyph glyph-name="uniF2C6" unicode="&#xf2c6;" horiz-adv-x="1792" +d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 +t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2C7" unicode="&#xf2c7;" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2C8" unicode="&#xf2c8;" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2C9" unicode="&#xf2c9;" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2CA" unicode="&#xf2ca;" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 +t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 +v128h192z" /> + <glyph glyph-name="uniF2CB" unicode="&#xf2cb;" horiz-adv-x="1024" +d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z +M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" /> + <glyph glyph-name="uniF2CC" unicode="&#xf2cc;" horiz-adv-x="1920" +d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41 +t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19 +t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768 +q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19 +t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384 +q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" /> + <glyph glyph-name="uniF2CD" unicode="&#xf2cd;" horiz-adv-x="1792" +d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9 +t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9 +t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42 +q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9 +t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23 +t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" /> + <glyph glyph-name="uniF2CE" unicode="&#xf2ce;" +d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5 +t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70 +q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20 +q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5 +t72.5 -263.5z" /> + <glyph glyph-name="uniF2D0" unicode="&#xf2d0;" horiz-adv-x="1792" +d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D1" unicode="&#xf2d1;" horiz-adv-x="1792" +d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D2" unicode="&#xf2d2;" horiz-adv-x="2048" +d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47 +t47 -113z" /> + <glyph glyph-name="uniF2D3" unicode="&#xf2d3;" horiz-adv-x="1792" +d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10 +l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D4" unicode="&#xf2d4;" horiz-adv-x="1792" +d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 +l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D5" unicode="&#xf2d5;" horiz-adv-x="1792" +d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2D6" unicode="&#xf2d6;" horiz-adv-x="1794" +d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12 +t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5 +t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5 +q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5 +q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34 +q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5 +t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2D7" unicode="&#xf2d7;" +d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89 +q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5 +t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" /> + <glyph glyph-name="uniF2D8" unicode="&#xf2d8;" +d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7 +t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5 +h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113 +v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" /> + <glyph glyph-name="uniF2D9" unicode="&#xf2d9;" horiz-adv-x="2176" +d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584 +q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5 +q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15 +q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82 +q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104 +t302 11t306.5 -97q220 -115 333 -336t87 -474z" /> + <glyph glyph-name="uniF2DA" unicode="&#xf2da;" horiz-adv-x="1792" +d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178 +q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199 +t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297 +t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208 +t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" /> + <glyph glyph-name="uniF2DB" unicode="&#xf2db;" +d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16 +q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28 +t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32 +q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16 +h48q16 0 16 -16z" /> + <glyph glyph-name="uniF2DC" unicode="&#xf2dc;" horiz-adv-x="1664" +d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45 +t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33 +q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313 +l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106 +q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" /> + <glyph glyph-name="uniF2DD" unicode="&#xf2dd;" horiz-adv-x="1792" +d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321 +q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" /> + <glyph glyph-name="uniF2DE" unicode="&#xf2de;" horiz-adv-x="1792" +d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62 +t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71 +t286 -191t191 -286t71 -348z" /> + <glyph glyph-name="uniF2E0" unicode="&#xf2e0;" horiz-adv-x="1920" +d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3 +t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53 +q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5 +q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5 +t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5 +q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z +M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21 +q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16 +q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" /> + <glyph glyph-name="uniF2E1" unicode="&#xf2e1;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E2" unicode="&#xf2e2;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E3" unicode="&#xf2e3;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E4" unicode="&#xf2e4;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E5" unicode="&#xf2e5;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E6" unicode="&#xf2e6;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E7" unicode="&#xf2e7;" horiz-adv-x="1792" + /> + <glyph glyph-name="_698" unicode="&#xf2e8;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2E9" unicode="&#xf2e9;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EA" unicode="&#xf2ea;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EB" unicode="&#xf2eb;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EC" unicode="&#xf2ec;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2ED" unicode="&#xf2ed;" horiz-adv-x="1792" + /> + <glyph glyph-name="uniF2EE" unicode="&#xf2ee;" horiz-adv-x="1792" + /> + <glyph glyph-name="lessequal" unicode="&#xf500;" horiz-adv-x="1792" + /> + </font> +</defs></svg> diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.ttf b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b GIT binary patch literal 98024 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff2 b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/ayu-highlight.css b/pagetop-mdbook/static/ayu-highlight.css new file mode 100644 index 00000000..32c94322 --- /dev/null +++ b/pagetop-mdbook/static/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/pagetop-mdbook/static/css/chrome.css b/pagetop-mdbook/static/css/chrome.css new file mode 100644 index 00000000..7f9dc35d --- /dev/null +++ b/pagetop-mdbook/static/css/chrome.css @@ -0,0 +1,552 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +@import 'variables.css'; + +::-webkit-scrollbar { + background: var(--bg); +} +::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +#mdbook { + position: relative; + scrollbar-color: var(--scrollbar) var(--bg); +} +#mdbook .content { + position: relative; +} + +#mdbook #searchresults a, +#mdbook .content a:link, +#mdbook a:visited, +#mdbook a > .hljs { + color: var(--links); +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-bottom-color: var(--bg); + border-bottom-width: 1px; + border-bottom-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-bottom-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +#mdbook .icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +#mdbook .icon-button i { + margin: 0; +} + +#mdbook .right-buttons { + margin: 0 15px; +} +#mdbook .right-buttons a { + text-decoration: none; +} + +#mdbook .left-buttons { + display: flex; + margin: 0 5px; +} +.no-js #mdbook .left-buttons { + display: none; +} + +#mdbook .menu-title { + display: inline-block; + font-weight: 200; + font-size: 1.8rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js #mdbook .menu-title { + cursor: pointer; +} +@media only screen and (max-width: 640px) { + #mdbook .menu-title { + font-size: 1.5rem; + } +} +@media only screen and (max-width: 420px) { + #mdbook .menu-title { + font-size: 1.2rem; + } +} + +#mdbook .menu-bar, +#mdbook .menu-bar:visited, +#mdbook .nav-chapters, +#mdbook .nav-chapters:visited, +#mdbook .mobile-nav-chapters, +#mdbook .mobile-nav-chapters:visited, +#mdbook .menu-bar .icon-button, +#mdbook .menu-bar a i { + color: var(--icons); +} + +#mdbook .menu-bar i:hover, +#mdbook .menu-bar .icon-button:hover, +#mdbook .nav-chapters:hover, +#mdbook .mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +#mdbook .nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: absolute; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +#mdbook .nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +#mdbook .nav-wrapper { + margin-top: 50px; + display: none; +} + +#mdbook .mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +#mdbook .previous { + float: left; +} + +#mdbook .next { + float: right; + right: var(--page-padding); +} + +@media only screen and (max-width: 1080px) { + #mdbook .nav-wide-wrapper { display: none; } + #mdbook .nav-wrapper { display: block; } +} + +@media only screen and (max-width: 1380px) { + .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } + .sidebar-visible #mdbook .nav-wrapper { display: block; } +} + +/* Inline code */ + +#mdbook :not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +#mdbook :not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +#mdbook a:hover > .hljs { + text-decoration: underline; +} + +#mdbook pre { + position: relative; + font-size: 0.875rem; +} +#mdbook pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +#mdbook pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +#mdbook pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +#mdbook pre > .buttons i { + margin-left: 8px; +} +#mdbook pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + #mdbook pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } +} +#mdbook pre > code { + padding: 1rem; + font-size: 0.875rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +#mdbook .hljs.ace_editor { + padding: 0rem 0rem; +} + +#mdbook pre > .result { + margin-top: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +#mdbook mark { + border-radius: 2px; + padding: 0 3px 1px 3px; + margin: 0 -3px -1px -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +#mdbook mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +#mdbook .searchbar-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin: 5px auto 0px auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +#mdbook .searchresults-header { + font-weight: bold; + font-size: 1em; + padding: 18px 0 0 5px; + color: var(--searchresults-header-fg); +} + +#mdbook .searchresults-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); + border-bottom: 1px dashed var(--searchresults-border-color); +} + +#mdbook ul#searchresults { + list-style: none; + padding-left: 20px; +} +#mdbook ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +#mdbook ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +#mdbook ul#searchresults span.teaser { + display: block; + clear: both; + margin: 5px 0 0 20px; + font-size: 0.8em; +} +#mdbook ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ +#mdbook .sidebar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.js:not(.sidebar-resizing) #mdbook .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +#mdbook .sidebar code { + line-height: 2em; +} +#mdbook .sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +#mdbook .sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +.js #mdbook .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} +.sidebar-hidden #mdbook .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); +} +#mdbook .sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +#mdbook .sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +.sidebar-visible #mdbook .page-wrapper { + transform: translateX(var(--sidebar-width)); +} +@media only screen and (min-width: 620px) { + .sidebar-visible #mdbook .page-wrapper { + transform: none; + margin-left: var(--sidebar-width); + } +} + +#mdbook .chapter { + list-style: none outside none; + padding-left: 0; + line-height: 2.2em; +} + +#mdbook .chapter ol { + width: 100%; +} + +#mdbook .chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +#mdbook .chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +#mdbook .chapter li a:hover { + color: var(--sidebar-active); +} + +#mdbook .chapter li a.active { + color: var(--sidebar-active); +} + +#mdbook .chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +#mdbook .chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +#mdbook .chapter li:not(.expanded) + li > ol { + display: none; +} + +#mdbook .chapter li.chapter-item { + line-height: 1.5em; + margin-top: 0.6em; +} + +#mdbook .chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +#mdbook .spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +#mdbook .chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + #mdbook .chapter li a { padding: 5px 0; } + #mdbook .spacer { margin: 10px 0; } +} + +#mdbook .section { + list-style: none outside none; + margin: 0; + padding: 0 0 0 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +#mdbook .theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; +} +#mdbook .theme-popup .default { + color: var(--icons); +} +#mdbook .theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 10px; + line-height: 25px; + white-space: nowrap; + text-align: left; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +#mdbook .theme-popup .theme:hover { + background-color: var(--theme-hover); +} +#mdbook .theme-popup .theme:hover:first-child, +#mdbook .theme-popup .theme:hover:last-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} diff --git a/pagetop-mdbook/static/css/general.css b/pagetop-mdbook/static/css/general.css new file mode 100644 index 00000000..8ace6312 --- /dev/null +++ b/pagetop-mdbook/static/css/general.css @@ -0,0 +1,187 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +#mdbook { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; + overflow-x: hidden; +} + +#mdbook code { + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; +} + +/* make long words/inline code not x overflow */ +#mdbook main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +#mdbook .table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +#mdbook h1 code, +#mdbook h2 code, +#mdbook h3 code, +#mdbook h4 code, +#mdbook h5 code, +#mdbook h6 code { + font-size: unset; +} + +#mdbook .left { float: left; } +#mdbook .right { float: right; } +#mdbook .boring { opacity: 0.6; } +#mdbook .hide-boring .boring { display: none; } +#mdbook .hidden { display: none !important; } + +#mdbook h2, #mdbook h3 { margin-top: 2.5em; } +#mdbook h4, #mdbook h5 { margin-top: 2em; } + +#mdbook .header + .header h3, +#mdbook .header + .header h4, +#mdbook .header + .header h5 { + margin-top: 1em; +} + +#mdbook h1:target::before, +#mdbook h2:target::before, +#mdbook h3:target::before, +#mdbook h4:target::before, +#mdbook h5:target::before, +#mdbook h6:target::before { + display: inline-block; + content: "»"; + margin-left: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +#mdbook .page { + outline: 0; + padding: 0 var(--page-padding); + margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +#mdbook .page-wrapper { + box-sizing: border-box; +} +.js:not(.sidebar-resizing) #mdbook .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +#mdbook .content { + overflow-y: auto; + padding: 20px 5px 50px 5px; +} +#mdbook .content main { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} +#mdbook .content p { line-height: 1.45em; } +#mdbook .content ol { line-height: 1.45em; } +#mdbook .content ul { line-height: 1.45em; } +#mdbook .content a { text-decoration: none; } +#mdbook .content a:hover { text-decoration: underline; } +#mdbook .content img, .content video { max-width: 100%; } +#mdbook .content .header:link, +#mdbook .content .header:visited { + color: var(--fg); +} +#mdbook .content .header:link, +#mdbook .content .header:visited:hover { + text-decoration: none; +} + +#mdbook table { + margin: 0 auto; + border-collapse: collapse; +} +#mdbook table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +#mdbook table thead { + background: var(--table-header-bg); +} +#mdbook table thead td { + font-weight: 700; + border: none; +} +#mdbook table thead th { + padding: 3px 20px; +} +#mdbook table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +#mdbook table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +#mdbook blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-top: .1em solid var(--quote-border); + border-bottom: .1em solid var(--quote-border); +} +#mdbook blockquote p { + margin-top: 1rem; +} + +#mdbook :not(.footnote-definition) + .footnote-definition, +#mdbook .footnote-definition + :not(.footnote-definition) { + margin-top: 2em; +} +#mdbook .footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +#mdbook .footnote-definition p { + display: inline; +} + +#mdbook .tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +#mdbook .tooltipped .tooltiptext { + visibility: visible; +} + +#mdbook .chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +#mdbook .result-no-output { + font-style: italic; +} diff --git a/pagetop-mdbook/static/css/print.css b/pagetop-mdbook/static/css/print.css new file mode 100644 index 00000000..bd7c8da7 --- /dev/null +++ b/pagetop-mdbook/static/css/print.css @@ -0,0 +1,65 @@ +#sidebar, +#menu-bar, +#mdbook .nav-chapters, +#mdbook .mobile-nav-chapters { + display: none; +} + +#mdbook, +#page-wrapper { + margin: 0; + padding: 0; + max-width: none; + transform: none !important; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +#mdbook .page { + overflow-y: initial; +} + +#mdbook code { + background-color: #eeeeee; + border-radius: 5px; + + /* Force background to be printed in Chrome */ + -webkit-print-color-adjust: exact; +} + +#mdbook pre > .buttons { + z-index: 2; +} + +#mdbook a, +#mdbook a:visited, +#mdbook a:active, +#mdbook a:hover { + color: #4183c4; + text-decoration: none; +} + +#mdbook h1, +#mdbook h2, +#mdbook h3, +#mdbook h4, +#mdbook h5, +#mdbook h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +#mdbook pre, +#mdbook code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +#mdbook .fa { + display: none !important; +} diff --git a/pagetop-mdbook/static/css/variables.css b/pagetop-mdbook/static/css/variables.css new file mode 100644 index 00000000..7a68155a --- /dev/null +++ b/pagetop-mdbook/static/css/variables.css @@ -0,0 +1,253 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt b/pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt b/pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 00000000..366206f5 --- /dev/null +++ b/pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/pagetop-mdbook/static/fonts/fonts.css b/pagetop-mdbook/static/fonts/fonts.css new file mode 100644 index 00000000..858efa59 --- /dev/null +++ b/pagetop-mdbook/static/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9f51be370fa913ce6de2922b580c262c4822b337 GIT binary patch literal 44352 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2f545448418cba6668a2e7d49e9616e8c69dfd15 GIT binary patch literal 40656 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 bQBM5)6s%p?oy_T)f<heOvL9c)cYydmSX$yH literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f503d558d58dbd4dee1f6b962d23002c85893573 GIT binary patch literal 44936 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%0Dn1c<2_+E7q!}_WoeXk9?T@D7)yDCvAa+ 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 F{|Bsk2y6fV literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c99aabe80340fd88a6aeb5729251e76c9a6f35ec GIT binary patch literal 42120 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 E9}-z&tN;K2 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..421a1ab25fa88105ab776552d7201205f7899841 GIT binary patch literal 44988 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..12ce3d20d1ce2288206e8b4f31c20f76452efe37 GIT binary patch literal 40800 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%0DER>;wf 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 RRq@Zl18$4nbA$lE{{b1eG28$E literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c94a223b03321d4a6701f0f8f7bc16bc75081aab GIT binary patch literal 44536 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 R7pBogwbb+jh=72A{tv!<OMd_W literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..eed7d3c63d1f9bff356497c0b0fb79c50ac4dede GIT binary patch literal 40812 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..398b68a0853fbf6368758deb1da49d347e3e7d89 GIT binary patch literal 41076 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%0DJn02_FvL|5o&57{KZdtLiV+hN)O7G14 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%0A|ONvrtj~P(cVi2j(tV2B}bkG5nsF&tTs#Cjgc)T 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-regular.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8383e94c65478622baf43553262e0e31b8725e2b GIT binary patch literal 43236 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/fonts/source-code-pro-v11-all-charsets-500.woff2 b/pagetop-mdbook/static/fonts/source-code-pro-v11-all-charsets-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..722245682f59dfbf16d8cd95834db381ce022ebc GIT binary patch literal 59140 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 literal 0 HcmV?d00001 diff --git a/pagetop-mdbook/static/highlight.css b/pagetop-mdbook/static/highlight.css new file mode 100644 index 00000000..ba57b82b --- /dev/null +++ b/pagetop-mdbook/static/highlight.css @@ -0,0 +1,82 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/pagetop-mdbook/static/tomorrow-night.css b/pagetop-mdbook/static/tomorrow-night.css new file mode 100644 index 00000000..5b4aca77 --- /dev/null +++ b/pagetop-mdbook/static/tomorrow-night.css @@ -0,0 +1,102 @@ +/* Tomorrow Night Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/pagetop-mdbook/template/book.toml b/pagetop-mdbook/template/book.toml new file mode 100644 index 00000000..c9e4ad3d --- /dev/null +++ b/pagetop-mdbook/template/book.toml @@ -0,0 +1,8 @@ +[book] +authors = ["Author Name"] +language = "en" +src = "src" +title = "mdBook Title" + +[build] +build-dir = "../static/doc" diff --git a/pagetop-mdbook/template/theme/book.js b/pagetop-mdbook/template/theme/book.js new file mode 100644 index 00000000..c4ab6988 --- /dev/null +++ b/pagetop-mdbook/template/theme/book.js @@ -0,0 +1,679 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else { + return code_block.textContent; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on http://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + Array + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = "<button class=\"fa fa-eye\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'fa fa-copy clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = '<i class=\"tooltiptext\"></i>'; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'fa fa-copy clip-button'; + copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>'; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var html = document.querySelector("html"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + html.classList.remove('sidebar-hidden') + html.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + + function hideSidebar() { + html.classList.remove('sidebar-visible') + html.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (html.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (html.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + html.classList.add('sidebar-resizing'); + } + function resize(e) { + var viewportOffset = sidebar.getBoundingClientRect(); + var pos = (e.clientX - sidebar.offsetLeft - viewportOffset.left); + if (pos < 20) { + hideSidebar(); + } else { + if (html.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + html.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); + + // Try to show the full sidebar + if (html.classList.contains("sidebar-visible")) { + var realHeight = sidebar.querySelector(".sidebar-scrollbox").scrollHeight; + document.getElementById("page-wrapper").style.minHeight = realHeight + 80 + "px"; + } +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + break; + case 'ArrowLeft': + e.preventDefault(); + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'fa fa-copy clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'fa fa-copy tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + menu.classList.remove('bordered'); + document.addEventListener('scroll', function () { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + }, { passive: true }); + })(); +})(); diff --git a/pagetop-mdbook/template/theme/css/chrome.css b/pagetop-mdbook/template/theme/css/chrome.css new file mode 100644 index 00000000..7f9dc35d --- /dev/null +++ b/pagetop-mdbook/template/theme/css/chrome.css @@ -0,0 +1,552 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +@import 'variables.css'; + +::-webkit-scrollbar { + background: var(--bg); +} +::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +#mdbook { + position: relative; + scrollbar-color: var(--scrollbar) var(--bg); +} +#mdbook .content { + position: relative; +} + +#mdbook #searchresults a, +#mdbook .content a:link, +#mdbook a:visited, +#mdbook a > .hljs { + color: var(--links); +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-bottom-color: var(--bg); + border-bottom-width: 1px; + border-bottom-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-bottom-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +#mdbook .icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +#mdbook .icon-button i { + margin: 0; +} + +#mdbook .right-buttons { + margin: 0 15px; +} +#mdbook .right-buttons a { + text-decoration: none; +} + +#mdbook .left-buttons { + display: flex; + margin: 0 5px; +} +.no-js #mdbook .left-buttons { + display: none; +} + +#mdbook .menu-title { + display: inline-block; + font-weight: 200; + font-size: 1.8rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js #mdbook .menu-title { + cursor: pointer; +} +@media only screen and (max-width: 640px) { + #mdbook .menu-title { + font-size: 1.5rem; + } +} +@media only screen and (max-width: 420px) { + #mdbook .menu-title { + font-size: 1.2rem; + } +} + +#mdbook .menu-bar, +#mdbook .menu-bar:visited, +#mdbook .nav-chapters, +#mdbook .nav-chapters:visited, +#mdbook .mobile-nav-chapters, +#mdbook .mobile-nav-chapters:visited, +#mdbook .menu-bar .icon-button, +#mdbook .menu-bar a i { + color: var(--icons); +} + +#mdbook .menu-bar i:hover, +#mdbook .menu-bar .icon-button:hover, +#mdbook .nav-chapters:hover, +#mdbook .mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +#mdbook .nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: absolute; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +#mdbook .nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +#mdbook .nav-wrapper { + margin-top: 50px; + display: none; +} + +#mdbook .mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +#mdbook .previous { + float: left; +} + +#mdbook .next { + float: right; + right: var(--page-padding); +} + +@media only screen and (max-width: 1080px) { + #mdbook .nav-wide-wrapper { display: none; } + #mdbook .nav-wrapper { display: block; } +} + +@media only screen and (max-width: 1380px) { + .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } + .sidebar-visible #mdbook .nav-wrapper { display: block; } +} + +/* Inline code */ + +#mdbook :not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +#mdbook :not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +#mdbook a:hover > .hljs { + text-decoration: underline; +} + +#mdbook pre { + position: relative; + font-size: 0.875rem; +} +#mdbook pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +#mdbook pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +#mdbook pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +#mdbook pre > .buttons i { + margin-left: 8px; +} +#mdbook pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + #mdbook pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } +} +#mdbook pre > code { + padding: 1rem; + font-size: 0.875rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +#mdbook .hljs.ace_editor { + padding: 0rem 0rem; +} + +#mdbook pre > .result { + margin-top: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +#mdbook mark { + border-radius: 2px; + padding: 0 3px 1px 3px; + margin: 0 -3px -1px -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +#mdbook mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +#mdbook .searchbar-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin: 5px auto 0px auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +#mdbook .searchresults-header { + font-weight: bold; + font-size: 1em; + padding: 18px 0 0 5px; + color: var(--searchresults-header-fg); +} + +#mdbook .searchresults-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); + border-bottom: 1px dashed var(--searchresults-border-color); +} + +#mdbook ul#searchresults { + list-style: none; + padding-left: 20px; +} +#mdbook ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +#mdbook ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +#mdbook ul#searchresults span.teaser { + display: block; + clear: both; + margin: 5px 0 0 20px; + font-size: 0.8em; +} +#mdbook ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ +#mdbook .sidebar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.js:not(.sidebar-resizing) #mdbook .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +#mdbook .sidebar code { + line-height: 2em; +} +#mdbook .sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +#mdbook .sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +.js #mdbook .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} +.sidebar-hidden #mdbook .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); +} +#mdbook .sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +#mdbook .sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +.sidebar-visible #mdbook .page-wrapper { + transform: translateX(var(--sidebar-width)); +} +@media only screen and (min-width: 620px) { + .sidebar-visible #mdbook .page-wrapper { + transform: none; + margin-left: var(--sidebar-width); + } +} + +#mdbook .chapter { + list-style: none outside none; + padding-left: 0; + line-height: 2.2em; +} + +#mdbook .chapter ol { + width: 100%; +} + +#mdbook .chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +#mdbook .chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +#mdbook .chapter li a:hover { + color: var(--sidebar-active); +} + +#mdbook .chapter li a.active { + color: var(--sidebar-active); +} + +#mdbook .chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +#mdbook .chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +#mdbook .chapter li:not(.expanded) + li > ol { + display: none; +} + +#mdbook .chapter li.chapter-item { + line-height: 1.5em; + margin-top: 0.6em; +} + +#mdbook .chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +#mdbook .spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +#mdbook .chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + #mdbook .chapter li a { padding: 5px 0; } + #mdbook .spacer { margin: 10px 0; } +} + +#mdbook .section { + list-style: none outside none; + margin: 0; + padding: 0 0 0 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +#mdbook .theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; +} +#mdbook .theme-popup .default { + color: var(--icons); +} +#mdbook .theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 10px; + line-height: 25px; + white-space: nowrap; + text-align: left; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +#mdbook .theme-popup .theme:hover { + background-color: var(--theme-hover); +} +#mdbook .theme-popup .theme:hover:first-child, +#mdbook .theme-popup .theme:hover:last-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} diff --git a/pagetop-mdbook/template/theme/css/general.css b/pagetop-mdbook/template/theme/css/general.css new file mode 100644 index 00000000..8ace6312 --- /dev/null +++ b/pagetop-mdbook/template/theme/css/general.css @@ -0,0 +1,187 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +#mdbook { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; + overflow-x: hidden; +} + +#mdbook code { + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; +} + +/* make long words/inline code not x overflow */ +#mdbook main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +#mdbook .table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +#mdbook h1 code, +#mdbook h2 code, +#mdbook h3 code, +#mdbook h4 code, +#mdbook h5 code, +#mdbook h6 code { + font-size: unset; +} + +#mdbook .left { float: left; } +#mdbook .right { float: right; } +#mdbook .boring { opacity: 0.6; } +#mdbook .hide-boring .boring { display: none; } +#mdbook .hidden { display: none !important; } + +#mdbook h2, #mdbook h3 { margin-top: 2.5em; } +#mdbook h4, #mdbook h5 { margin-top: 2em; } + +#mdbook .header + .header h3, +#mdbook .header + .header h4, +#mdbook .header + .header h5 { + margin-top: 1em; +} + +#mdbook h1:target::before, +#mdbook h2:target::before, +#mdbook h3:target::before, +#mdbook h4:target::before, +#mdbook h5:target::before, +#mdbook h6:target::before { + display: inline-block; + content: "»"; + margin-left: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +#mdbook .page { + outline: 0; + padding: 0 var(--page-padding); + margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +#mdbook .page-wrapper { + box-sizing: border-box; +} +.js:not(.sidebar-resizing) #mdbook .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +#mdbook .content { + overflow-y: auto; + padding: 20px 5px 50px 5px; +} +#mdbook .content main { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} +#mdbook .content p { line-height: 1.45em; } +#mdbook .content ol { line-height: 1.45em; } +#mdbook .content ul { line-height: 1.45em; } +#mdbook .content a { text-decoration: none; } +#mdbook .content a:hover { text-decoration: underline; } +#mdbook .content img, .content video { max-width: 100%; } +#mdbook .content .header:link, +#mdbook .content .header:visited { + color: var(--fg); +} +#mdbook .content .header:link, +#mdbook .content .header:visited:hover { + text-decoration: none; +} + +#mdbook table { + margin: 0 auto; + border-collapse: collapse; +} +#mdbook table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +#mdbook table thead { + background: var(--table-header-bg); +} +#mdbook table thead td { + font-weight: 700; + border: none; +} +#mdbook table thead th { + padding: 3px 20px; +} +#mdbook table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +#mdbook table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +#mdbook blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-top: .1em solid var(--quote-border); + border-bottom: .1em solid var(--quote-border); +} +#mdbook blockquote p { + margin-top: 1rem; +} + +#mdbook :not(.footnote-definition) + .footnote-definition, +#mdbook .footnote-definition + :not(.footnote-definition) { + margin-top: 2em; +} +#mdbook .footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +#mdbook .footnote-definition p { + display: inline; +} + +#mdbook .tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +#mdbook .tooltipped .tooltiptext { + visibility: visible; +} + +#mdbook .chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +#mdbook .result-no-output { + font-style: italic; +} diff --git a/pagetop-mdbook/template/theme/css/print.css b/pagetop-mdbook/template/theme/css/print.css new file mode 100644 index 00000000..bd7c8da7 --- /dev/null +++ b/pagetop-mdbook/template/theme/css/print.css @@ -0,0 +1,65 @@ +#sidebar, +#menu-bar, +#mdbook .nav-chapters, +#mdbook .mobile-nav-chapters { + display: none; +} + +#mdbook, +#page-wrapper { + margin: 0; + padding: 0; + max-width: none; + transform: none !important; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +#mdbook .page { + overflow-y: initial; +} + +#mdbook code { + background-color: #eeeeee; + border-radius: 5px; + + /* Force background to be printed in Chrome */ + -webkit-print-color-adjust: exact; +} + +#mdbook pre > .buttons { + z-index: 2; +} + +#mdbook a, +#mdbook a:visited, +#mdbook a:active, +#mdbook a:hover { + color: #4183c4; + text-decoration: none; +} + +#mdbook h1, +#mdbook h2, +#mdbook h3, +#mdbook h4, +#mdbook h5, +#mdbook h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +#mdbook pre, +#mdbook code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +#mdbook .fa { + display: none !important; +} diff --git a/pagetop-mdbook/template/theme/css/variables.css b/pagetop-mdbook/template/theme/css/variables.css new file mode 100644 index 00000000..7a68155a --- /dev/null +++ b/pagetop-mdbook/template/theme/css/variables.css @@ -0,0 +1,253 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/pagetop-mdbook/template/theme/highlight.css b/pagetop-mdbook/template/theme/highlight.css new file mode 100644 index 00000000..ba57b82b --- /dev/null +++ b/pagetop-mdbook/template/theme/highlight.css @@ -0,0 +1,82 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/pagetop-mdbook/template/theme/highlight.js b/pagetop-mdbook/template/theme/highlight.js new file mode 100644 index 00000000..180385b7 --- /dev/null +++ b/pagetop-mdbook/template/theme/highlight.js @@ -0,0 +1,6 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/pagetop-mdbook/template/theme/index.hbs b/pagetop-mdbook/template/theme/index.hbs new file mode 100644 index 00000000..490b7ca1 --- /dev/null +++ b/pagetop-mdbook/template/theme/index.hbs @@ -0,0 +1,261 @@ +<!-- Lang: {{ language }} --> +<!-- Title: {{ title }} --> +<!-- Print: {{#if print_enable}}enabled{{else}}disabled{{/if}} --> +<!-- MathJax: {{#if mathjax_support}}supported{{else}}unsupported{{/if}} --> + +<!-- mdBook --> + +<!-- Provide site root to javascript --> +<script type="text/javascript"> + var path_to_root = "{{ path_to_root }}"; + var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}"; +</script> + +<!-- Work around some values being stored in localStorage wrapped in quotes --> +<script type="text/javascript"> + try { + var theme = localStorage.getItem('mdbook-theme'); + var sidebar = localStorage.getItem('mdbook-sidebar'); + + if (theme.startsWith('"') && theme.endsWith('"')) { + localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); + } + + if (sidebar.startsWith('"') && sidebar.endsWith('"')) { + localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); + } + } catch (e) { } +</script> + +<!-- Set the theme before any content is loaded, prevents flash --> +<script type="text/javascript"> + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } + if (theme === null || theme === undefined) { theme = default_theme; } + var html = document.querySelector('html'); + html.classList.remove('no-js') + html.classList.remove('{{ default_theme }}') + html.classList.add(theme); + html.classList.add('js'); +</script> + +<!-- Hide / unhide sidebar before it is displayed --> +<script type="text/javascript"> + var html = document.querySelector('html'); + var sidebar = 'hidden'; + if (document.body.clientWidth >= 1080) { + try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } + sidebar = sidebar || 'visible'; + } + html.classList.remove('sidebar-visible'); + html.classList.add("sidebar-" + sidebar); +</script> + +<nav id="sidebar" class="sidebar" aria-label="Table of contents"> + <div class="sidebar-scrollbox"> + {{#toc}}{{/toc}} + </div> + <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> +</nav> + +<div id="page-wrapper" class="page-wrapper"> + + <div class="page"> + {{> header}} + <div id="menu-bar-hover-placeholder"></div> + <div id="menu-bar" class="menu-bar sticky bordered"> + <div class="left-buttons"> + <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> + <i class="fa fa-bars"></i> + </button> + <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> + <i class="fa fa-paint-brush"></i> + </button> + <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> + <li role="none"><button role="menuitem" class="theme" id="light">{{ theme_option "Light" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="rust">{{ theme_option "Rust" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="coal">{{ theme_option "Coal" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="navy">{{ theme_option "Navy" }}</button></li> + <li role="none"><button role="menuitem" class="theme" id="ayu">{{ theme_option "Ayu" }}</button></li> + </ul> + {{#if search_enabled}} + <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> + <i class="fa fa-search"></i> + </button> + {{/if}} + </div> + + <h1 class="menu-title">{{ book_title }}</h1> + + <div class="right-buttons"> + {{#if print_enable}} + <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book"> + <i id="print-button" class="fa fa-print"></i> + </a> + {{/if}} + {{#if git_repository_url}} + <a href="{{git_repository_url}}" title="Git repository" aria-label="Git repository"> + <i id="git-repository-button" class="fa {{git_repository_icon}}"></i> + </a> + {{/if}} + {{#if git_repository_edit_url}} + <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit"> + <i id="git-edit-button" class="fa fa-edit"></i> + </a> + {{/if}} + + </div> + </div> + + {{#if search_enabled}} + <div id="search-wrapper" class="hidden"> + <form id="searchbar-outer" class="searchbar-outer"> + <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> + </form> + <div id="searchresults-outer" class="searchresults-outer hidden"> + <div id="searchresults-header" class="searchresults-header"></div> + <ul id="searchresults"> + </ul> + </div> + </div> + {{/if}} + + <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> + <script type="text/javascript"> + document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); + document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); + Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { + link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); + }); + </script> + + <div id="content" class="content"> + <main> + {{{ content }}} + </main> + + <nav class="nav-wrapper" aria-label="Page navigation"> + <!-- Mobile navigation buttons --> + {{#previous}} + <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> + <i class="fa fa-angle-left"></i> + </a> + {{/previous}} + + {{#next}} + <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> + <i class="fa fa-angle-right"></i> + </a> + {{/next}} + + <div style="clear: both"></div> + </nav> + </div> + </div> + + <nav class="nav-wide-wrapper" aria-label="Page navigation"> + {{#previous}} + <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> + <i class="fa fa-angle-left"></i> + </a> + {{/previous}} + + {{#next}} + <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> + <i class="fa fa-angle-right"></i> + </a> + {{/next}} + </nav> + +</div> + +{{#if live_reload_endpoint}} +<!-- Livereload script (if served using the cli tool) --> +<script type="text/javascript"> + const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; + const wsAddress = wsProtocol + "//" + location.host + "/" + "{{{live_reload_endpoint}}}"; + const socket = new WebSocket(wsAddress); + socket.onmessage = function (event) { + if (event.data === "reload") { + socket.close(); + location.reload(); + } + }; + + window.onbeforeunload = function() { + socket.close(); + } +</script> +{{/if}} + +{{#if google_analytics}} +<!-- Google Analytics Tag --> +<script type="text/javascript"> + var localAddrs = ["localhost", "127.0.0.1", ""]; + + // make sure we don't activate google analytics if the developer is + // inspecting the book locally... + if (localAddrs.indexOf(document.location.hostname) === -1) { + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', '{{google_analytics}}', 'auto'); + ga('send', 'pageview'); + } +</script> +{{/if}} + +{{#if playground_line_numbers}} +<script type="text/javascript"> + window.playground_line_numbers = true; +</script> +{{/if}} + +{{#if playground_copyable}} +<script type="text/javascript"> + window.playground_copyable = true; +</script> +{{/if}} + +{{#if playground_js}} +<script src="{{ path_to_root }}ace.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}editor.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}mode-rust.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}theme-dawn.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}theme-tomorrow_night.js" type="text/javascript" charset="utf-8"></script> +{{/if}} + +{{#if search_js}} +<script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script> +{{/if}} + +<script src="{{ path_to_root }}clipboard.min.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}highlight.js" type="text/javascript" charset="utf-8"></script> +<script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script> + +<!-- Custom JS scripts --> +{{#each additional_js}} +<script type="text/javascript" src="{{ ../path_to_root }}{{this}}"></script> +{{/each}} + +{{#if is_print}} +{{#if mathjax_support}} +<script type="text/javascript"> +window.addEventListener('load', function() { + MathJax.Hub.Register.StartupHook('End', function() { + window.setTimeout(window.print, 100); + }); +}); +</script> +{{else}} +<script type="text/javascript"> +window.addEventListener('load', function() { + window.setTimeout(window.print, 100); +}); +</script> +{{/if}} +{{/if}} diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 3ecd7e30..04a80c94 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -42,7 +42,7 @@ impl AssetsTrait for JavaScript { impl JavaScript { pub fn located<S>(source: S) -> Self where - S: Into<String> + S: Into<String>, { JavaScript { source: source.into(), diff --git a/website/src/main.rs b/website/src/main.rs index b59d8992..369955e4 100644 --- a/website/src/main.rs +++ b/website/src/main.rs @@ -22,8 +22,9 @@ impl ModuleTrait for PageTopWebSite { } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - MdBook::configure_service_mdbook(cfg, "/doc/en", &GUIDES_EN); - MdBook::configure_service_mdbook(cfg, "/doc/es", &GUIAS_ES); + MdBook::configure_mdbook_common(cfg); + MdBook::configure_mdbook_service(cfg, "/doc/en", &GUIDES_EN); + MdBook::configure_mdbook_service(cfg, "/doc/es", &GUIAS_ES); } } From 9997a6b0b1d5c21aa0c125a70b0acb2153f75ea7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 5 Aug 2022 00:05:26 +0200 Subject: [PATCH 172/853] =?UTF-8?q?Mejora=20gesti=C3=B3n=20de=20archivos?= =?UTF-8?q?=20est=C3=A1ticos=20en=20el=20binario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-mdbook/Cargo.toml | 2 +- pagetop-mdbook/build.rs | 16 +---- pagetop-mdbook/src/lib.rs | 16 ++--- pagetop-mdbook/src/util.rs | 21 +++++++ pagetop/build.rs | 25 ++++---- pagetop/src/base/theme/aliner.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/core/theme/all.rs | 4 +- pagetop/src/prelude.rs | 8 +-- pagetop/src/util.rs | 95 ++++++++++++++++++++++++++++-- website/Cargo.toml | 3 +- website/build.rs | 28 ++++----- website/src/main.rs | 11 ++-- 14 files changed, 163 insertions(+), 72 deletions(-) create mode 100644 pagetop-mdbook/src/util.rs diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml index 711af59b..faa155b8 100644 --- a/pagetop-mdbook/Cargo.toml +++ b/pagetop-mdbook/Cargo.toml @@ -19,4 +19,4 @@ static-files = "0.2.3" maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } [build-dependencies] -static-files = "0.2.3" +pagetop = { path = "../pagetop" } diff --git a/pagetop-mdbook/build.rs b/pagetop-mdbook/build.rs index c5425024..355abfb1 100644 --- a/pagetop-mdbook/build.rs +++ b/pagetop-mdbook/build.rs @@ -1,17 +1,5 @@ -use static_files::resource_dir; - -use std::env; -use std::path::Path; +use pagetop::util::bundle_resources; fn main() -> std::io::Result<()> { - build_resource_dir("./static", "mdbook") -} - -fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { - let mut resource = resource_dir(dir); - resource.with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), - ); - resource.with_module_name(format!("resources_{}", name)); - resource.build() + bundle_resources("./static", "mdbook", None) } diff --git a/pagetop-mdbook/src/lib.rs b/pagetop-mdbook/src/lib.rs index 577ac0a4..eeb4d483 100644 --- a/pagetop-mdbook/src/lib.rs +++ b/pagetop-mdbook/src/lib.rs @@ -1,11 +1,11 @@ use pagetop::prelude::*; +pub mod util; + pub_const_handler!(MODULE_MDBOOK); include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); -pub type BookMapResources = std::collections::HashMap<&'static str, static_files::Resource>; - pub struct MdBook; impl ModuleTrait for MdBook { @@ -15,14 +15,14 @@ impl ModuleTrait for MdBook { } impl MdBook { - pub fn configure_mdbook_common(cfg: &mut app::web::ServiceConfig) { - theme_static_files!(cfg, "/mdbook/static"); + pub fn configure_service_for_common_resources(cfg: &mut app::web::ServiceConfig) { + configure_service_for_static_files!(cfg, "/mdbook/static", bundle_mdbook); } - pub fn configure_mdbook_service( + pub fn configure_service_for_mdbook( cfg: &mut app::web::ServiceConfig, mdbook_path: &'static str, - mdbook_map: &'static BookMapResources, + mdbook_map: &'static HashMapResources, ) { let path = mdbook_path.trim_end_matches('/'); cfg.service( @@ -46,7 +46,7 @@ impl MdBook { async fn mdbook_page( request: app::HttpRequest, mdbook_path: &'static str, - mdbook_map: &'static BookMapResources, + mdbook_map: &'static HashMapResources, ) -> ResultPage<Markup, FatalError> { let path_len = mdbook_path.len() + 1; if let Some(content) = mdbook_map.get(&request.path()[path_len..]) { @@ -115,7 +115,7 @@ async fn mdbook_page( async fn mdbook_resource( request: app::HttpRequest, mdbook_path: &'static str, - mdbook_map: &'static BookMapResources, + mdbook_map: &'static HashMapResources, ) -> app::HttpResponse { let path_len = mdbook_path.len() + 1; // From https://github.com/kilork/actix-web-static-files/blob/master/src/resource_files.rs, see diff --git a/pagetop-mdbook/src/util.rs b/pagetop-mdbook/src/util.rs new file mode 100644 index 00000000..00689eef --- /dev/null +++ b/pagetop-mdbook/src/util.rs @@ -0,0 +1,21 @@ +use std::path::Path; + +pub fn except_mdbook_common_resources(p: &Path) -> bool { + match p.to_str() { + Some("ayu-highlight.css") => false, + Some("highlight.css") => false, + Some("tomorrow-niht.css") => false, + _ => { + if let Some(parent) = p.parent() { + match parent.to_str() { + Some("/css") => false, + Some("/FontAwesome") => false, + Some("/fonts") => false, + _ => true, + } + } else { + true + } + } + } +} diff --git a/pagetop/build.rs b/pagetop/build.rs index d27cb3cd..9e4b899a 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,20 +1,19 @@ -use static_files::resource_dir; - -use std::env; use std::path::Path; fn main() -> std::io::Result<()> { - build_resource_dir("./static/theme", "theme")?; - build_resource_dir("./static/aliner", "aliner")?; - build_resource_dir("./static/bootsier", "bootsier")?; - build_resource_dir("./static/bulmix", "bulmix") + bundle_resources("./static/theme", "theme")?; + bundle_resources("./static/aliner", "aliner")?; + bundle_resources("./static/bootsier", "bootsier")?; + bundle_resources("./static/bulmix", "bulmix") } -fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { - let mut resource = resource_dir(dir); - resource.with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), +/// This function is a simplified version of pagetop::util::bundle_resources(). +pub fn bundle_resources(from_dir: &str, with_name: &str) -> std::io::Result<()> { + let mut r = static_files::resource_dir(from_dir); + r.with_generated_filename( + Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), ); - resource.with_module_name(format!("resources_{}", name)); - resource.build() + r.with_module_name(format!("resources_{}", with_name)); + r.with_generated_fn(format!("bundle_{}", with_name)); + r.build() } diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 3c73701f..4afa2292 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -12,7 +12,7 @@ impl ThemeTrait for Aliner { } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - theme_static_files!(cfg, "/aliner"); + configure_service_for_static_files!(cfg, "/aliner", bundle_aliner); } fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index ffdad73f..cc93fe11 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -14,7 +14,7 @@ impl ThemeTrait for Bootsier { } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - theme_static_files!(cfg, "/bootsier"); + configure_service_for_static_files!(cfg, "/bootsier", bundle_bootsier); } fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 53b72c28..a7ba960a 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -12,7 +12,7 @@ impl ThemeTrait for Bulmix { } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - theme_static_files!(cfg, "/bulmix"); + configure_service_for_static_files!(cfg, "/bulmix", bundle_bulmix); } fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 99429838..64ae5b2b 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,5 +1,5 @@ use super::ThemeStaticRef; -use crate::{app, base, theme_static_files, trace, LazyStatic}; +use crate::{app, base, configure_service_for_static_files, trace, LazyStatic}; use std::sync::RwLock; @@ -41,7 +41,7 @@ pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { } pub fn configure_services(cfg: &mut app::web::ServiceConfig) { - theme_static_files!(cfg, "/theme"); + configure_service_for_static_files!(cfg, "/theme", bundle_theme); for t in THEMES.read().unwrap().iter() { t.configure_service(cfg); diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index b2b83648..a8e21580 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,9 +1,9 @@ -//! Re-exporta recursos comunes. - // Global macros and helpers. pub use crate::util; -pub use crate::util::Handler; -pub use crate::{args, concat_string, pub_const_handler, theme_static_files, LazyStatic}; +pub use crate::util::{Handler, HashMapResources}; +pub use crate::{ + args, concat_string, configure_service_for_static_files, pub_const_handler, LazyStatic, +}; pub use crate::config::SETTINGS; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 06ce3261..4af209a5 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,3 +1,90 @@ +pub use static_files::Resource as StaticResource; + +use std::path::Path; + +pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; + +/// This function uses the [static_files](https://docs.rs/static-files/latest/static_files/) library +/// to embed at compile time a bundle of static files in your binary. +/// +/// Just create the folder with static resources in your project (for example `static`): +/// +/// ```bash +/// cd project_dir +/// mkdir static +/// echo "Hello, world" > static/hello +/// ``` +/// +/// Add to `Cargo.toml` the required dependencies: +/// +/// ```toml +/// [dependencies] +/// pagetop = { ... } +/// static-files = "0.2.3" +/// +/// [build-dependencies] +/// pagetop = { ... } +/// ``` +/// +/// Add `build.rs` with call to bundle resources: +/// +/// ```rust#ignore +/// use pagetop::util::bundle_resources; +/// +/// fn main() -> std::io::Result<()> { +/// bundle_resources("./static", "guides", None) +/// } +/// ``` +/// +/// This will create the resources file "guides.rs" in the standard output directory from files +/// located at "./static" folder. +/// +/// Optionally, you can also pass a function to filter the files in the "./static" folder that +/// should be included in the resources file: +/// +/// ```rust#ignore +/// use pagetop::util::bundle_resources; +/// +/// fn main() -> std::io::Result<()> { +/// bundle_resources("./static", "guides", Some(except_css_dir)) +/// } +/// +/// fn except_css_dir(p: &Path) -> bool { +/// if let Some(parent) = p.parent() { +/// ! matches!(parent.to_str(), Some("/css")) +/// } +/// true +/// } +/// ``` +/// +/// Finally, a module called "resources_guides" will be compiled with your project. And the function +/// to embed the generated HashMap resources collection in your code will be "bundle_guides": +/// +/// ```rust#ignore +/// use pagetop::prelude::*; +/// +/// include!(concat!(env!("OUT_DIR"), "/guides.rs")); +/// static GUIDES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides); +/// ``` +/// +/// You can build more than one resources file to compile with your project. +pub fn bundle_resources( + from_dir: &str, + with_name: &str, + filtering: Option<fn(p: &Path) -> bool>, +) -> std::io::Result<()> { + let mut r = static_files::resource_dir(from_dir); + r.with_generated_filename( + Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), + ); + r.with_module_name(format!("resources_{}", with_name)); + r.with_generated_fn(format!("bundle_{}", with_name)); + if let Some(filter_files) = filtering { + r.with_filter(filter_files); + } + r.build() +} + pub type Handler = u64; // https://stackoverflow.com/a/71464396 @@ -60,7 +147,7 @@ pub fn single_type_name<T: ?Sized>() -> &'static str { #[macro_export] /// Macro para construir grupos de pares clave-valor. /// -/// ``` +/// ```rust#ignore /// let args = args![ /// "userName" => "Roberto", /// "photoCount" => 3, @@ -78,11 +165,11 @@ macro_rules! args { } #[macro_export] -macro_rules! theme_static_files { - ( $cfg:ident, $dir:expr ) => {{ +macro_rules! configure_service_for_static_files { + ( $cfg:ident, $dir:expr, $embed:ident ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service($crate::app::ResourceFiles::new($dir, generate())); + $cfg.service($crate::app::ResourceFiles::new($dir, $embed())); } else { $cfg.service( $crate::app::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) diff --git a/website/Cargo.toml b/website/Cargo.toml index 9f4db205..96ee2e96 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -23,4 +23,5 @@ pagetop-mdbook = { path = "../pagetop-mdbook" } maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } [build-dependencies] -static-files = "0.2.3" +pagetop = { path = "../pagetop" } +pagetop-mdbook = { path = "../pagetop-mdbook" } diff --git a/website/build.rs b/website/build.rs index 861014cf..08c2d29d 100644 --- a/website/build.rs +++ b/website/build.rs @@ -1,19 +1,15 @@ -use static_files::resource_dir; - -use std::env; -use std::path::Path; +use pagetop::util::bundle_resources; +use pagetop_mdbook::util::except_mdbook_common_resources; fn main() -> std::io::Result<()> { - build_resource_dir("./static/doc/en", "guides_en")?; - build_resource_dir("./static/doc/es", "guias_es") -} - -fn build_resource_dir(dir: &str, name: &str) -> std::io::Result<()> { - let mut resource = resource_dir(dir); - resource.with_generated_filename( - Path::new(env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), - ); - resource.with_module_name(format!("resources_{}", name)); - resource.with_generated_fn(name); - resource.build() + bundle_resources( + "./static/doc/en", + "guides_en", + Some(except_mdbook_common_resources), + )?; + bundle_resources( + "./static/doc/es", + "guias_es", + Some(except_mdbook_common_resources), + ) } diff --git a/website/src/main.rs b/website/src/main.rs index 369955e4..8bc871ed 100644 --- a/website/src/main.rs +++ b/website/src/main.rs @@ -1,14 +1,13 @@ use pagetop::prelude::*; -use pagetop_mdbook::BookMapResources; use pagetop_mdbook::MdBook; pub_const_handler!(APP_PAGETOP_WEBSITE); include!(concat!(env!("OUT_DIR"), "/guides_en.rs")); -static GUIDES_EN: LazyStatic<BookMapResources> = LazyStatic::new(guides_en); +static GUIDES_EN: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides_en); include!(concat!(env!("OUT_DIR"), "/guias_es.rs")); -static GUIAS_ES: LazyStatic<BookMapResources> = LazyStatic::new(guias_es); +static GUIAS_ES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guias_es); struct PageTopWebSite; @@ -22,9 +21,9 @@ impl ModuleTrait for PageTopWebSite { } fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - MdBook::configure_mdbook_common(cfg); - MdBook::configure_mdbook_service(cfg, "/doc/en", &GUIDES_EN); - MdBook::configure_mdbook_service(cfg, "/doc/es", &GUIAS_ES); + MdBook::configure_service_for_common_resources(cfg); + MdBook::configure_service_for_mdbook(cfg, "/doc/en", &GUIDES_EN); + MdBook::configure_service_for_mdbook(cfg, "/doc/es", &GUIAS_ES); } } From a3ef00526b312a71dad2d7d907e6d64791d75355 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 6 Aug 2022 13:12:56 +0200 Subject: [PATCH 173/853] =?UTF-8?q?Mejora=20documentaci=C3=B3n=20de=20bund?= =?UTF-8?q?le=5Fresources=20[pagetop]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/build.rs | 12 ++++++------ pagetop/src/util.rs | 31 ++++++++++++++++--------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/pagetop/build.rs b/pagetop/build.rs index 9e4b899a..92f494cf 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -7,13 +7,13 @@ fn main() -> std::io::Result<()> { bundle_resources("./static/bulmix", "bulmix") } -/// This function is a simplified version of pagetop::util::bundle_resources(). +/// This function is a simplified version of `pagetop::util::bundle_resources()`. pub fn bundle_resources(from_dir: &str, with_name: &str) -> std::io::Result<()> { - let mut r = static_files::resource_dir(from_dir); - r.with_generated_filename( + let mut bundle = static_files::resource_dir(from_dir); + bundle.with_generated_filename( Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), ); - r.with_module_name(format!("resources_{}", with_name)); - r.with_generated_fn(format!("bundle_{}", with_name)); - r.build() + bundle.with_module_name(format!("resources_{}", with_name)); + bundle.with_generated_fn(format!("bundle_{}", with_name)); + bundle.build() } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 4af209a5..e1aa44bc 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -26,7 +26,7 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour /// pagetop = { ... } /// ``` /// -/// Add `build.rs` with call to bundle resources: +/// Add `build.rs` with call to bundle resources (*guides* will be the magic word in this example): /// /// ```rust#ignore /// use pagetop::util::bundle_resources; @@ -36,10 +36,7 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour /// } /// ``` /// -/// This will create the resources file "guides.rs" in the standard output directory from files -/// located at "./static" folder. -/// -/// Optionally, you can also pass a function to filter the files in the "./static" folder that +/// Optionally, you can pass a function to filter those files into the `./static` folder which /// should be included in the resources file: /// /// ```rust#ignore @@ -51,20 +48,24 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour /// /// fn except_css_dir(p: &Path) -> bool { /// if let Some(parent) = p.parent() { -/// ! matches!(parent.to_str(), Some("/css")) +/// !matches!(parent.to_str(), Some("/css")) /// } /// true /// } /// ``` /// -/// Finally, a module called "resources_guides" will be compiled with your project. And the function -/// to embed the generated HashMap resources collection in your code will be "bundle_guides": +/// This will create a file called `guides.rs` where all output and intermediate artifacts are +/// placed, see [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html). +/// +/// You don't need to access this file, just include it in your source code and a module called +/// `resources_guides` will be added to your project. Use the function `bundle_guides` to embed the +/// generated HashMap resources collection: /// /// ```rust#ignore /// use pagetop::prelude::*; /// /// include!(concat!(env!("OUT_DIR"), "/guides.rs")); -/// static GUIDES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides); +/// static RESOURCES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides); /// ``` /// /// You can build more than one resources file to compile with your project. @@ -73,16 +74,16 @@ pub fn bundle_resources( with_name: &str, filtering: Option<fn(p: &Path) -> bool>, ) -> std::io::Result<()> { - let mut r = static_files::resource_dir(from_dir); - r.with_generated_filename( + let mut bundle = static_files::resource_dir(from_dir); + bundle.with_generated_filename( Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), ); - r.with_module_name(format!("resources_{}", with_name)); - r.with_generated_fn(format!("bundle_{}", with_name)); + bundle.with_module_name(format!("resources_{}", with_name)); + bundle.with_generated_fn(format!("bundle_{}", with_name)); if let Some(filter_files) = filtering { - r.with_filter(filter_files); + bundle.with_filter(filter_files); } - r.build() + bundle.build() } pub type Handler = u64; From 93beb620c7bc9921745b7201a89ab6a202966f64 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 7 Aug 2022 09:44:53 +0200 Subject: [PATCH 174/853] =?UTF-8?q?Libera=20la=20versi=C3=B3n=20de=20desar?= =?UTF-8?q?rollo=200.0.25=20[pagetop]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/config/default.toml | 2 +- pagetop/Cargo.toml | 8 ++--- pagetop/src/base/component/paragraph.rs | 25 +++++++------ pagetop/src/base/module/homepage.rs | 35 ++++++++++--------- .../homepage/locales/en-US/homepage.ftl | 8 +++-- .../homepage/locales/es-ES/homepage.ftl | 10 +++--- pagetop/src/util.rs | 13 +++---- .../static/theme/module/homepage/styles.css | 17 +++++++-- 8 files changed, 70 insertions(+), 48 deletions(-) diff --git a/drust/config/default.toml b/drust/config/default.toml index 6d6317f3..32684d4a 100644 --- a/drust/config/default.toml +++ b/drust/config/default.toml @@ -19,4 +19,4 @@ db_pass = "DrU__#3T" tracing = "Info,pagetop=Debug,sqlx::query=Warn" [dev] -#static_files = "pagetop/static" +#static_files = "../pagetop/static" diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 7e04ea35..e40b232f 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "pagetop" -version = "0.0.24" +version = "0.0.25" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - PageTop is an opinionated framework for using the most stable and popular \ - Rust packages to build modular, extensible and configurable web solutions.\ + PageTop is an opinionated web development framework that uses the most stable and popular Rust \ + packages to build modular, extensible and configurable Server-side rendered solutions.\ """ homepage = "https://suitepro.cillero.es/projects/pagetop" repository = "https://gitlab.com/manuelcillero/pagetop" @@ -28,7 +28,7 @@ doc-comment = "0.3.3" figlet-rs = "0.1.3" futures = "0.3.21" once_cell = "1.13.0" -paste = "1.0.7" +paste = "1.0.8" substring = "1.4.5" term_size = "0.3.2" url = "2.2.2" diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index ab1eccf7..52cb5c5d 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -20,7 +20,7 @@ pub struct Paragraph { renderable: Renderable, id : IdentifierValue, classes : Classes, - html : HtmlMarkup, + components: ComponentsBundle, display : ParagraphDisplay, template : String, } @@ -42,9 +42,14 @@ impl ComponentTrait for Paragraph { (self.renderable.check)(context) } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, context: &mut PageContext) -> Markup { html! { - p id=[self.id().get()] class=[self.classes().get()] { (*self.html()) } + p + id=[self.id().get()] + class=[self.classes().get()] + { + (self.components().render(context)) + } } } @@ -59,7 +64,7 @@ impl ComponentTrait for Paragraph { impl Paragraph { pub fn with(html: Markup) -> Self { - Paragraph::new().with_html(html) + Paragraph::new().with_component(Html::with(html)) } // Paragraph BUILDER. @@ -84,8 +89,8 @@ impl Paragraph { self } - pub fn with_html(mut self, html: Markup) -> Self { - self.alter_html(html); + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.alter_component(component); self } @@ -121,8 +126,8 @@ impl Paragraph { self } - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html.markup = html; + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); self } @@ -158,8 +163,8 @@ impl Paragraph { &self.classes } - pub fn html(&self) -> &Markup { - &self.html.markup + pub fn components(&self) -> &ComponentsBundle { + &self.components } pub fn display(&self) -> &ParagraphDisplay { diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index eb8e41dd..92a3628b 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -30,6 +30,7 @@ async fn demo() -> ResultPage<Markup, FatalError> { .with_context(PageOp::AddStyleSheet(StyleSheet::located( "/theme/module/homepage/styles.css", ))) + .with_body_classes(ClassesOp::AddFirst, "default-homepage") .add_to("region-content", hello_world()) .add_to("region-content", welcome()) .add_to("region-content", about_pagetop()) @@ -54,34 +55,32 @@ fn hello_world() -> Container { .with_component( Paragraph::with(html! { (e("hello_intro", &args![ - "app" => format!("<strong>{}</strong>", &SETTINGS.app.name) + "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) ])) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { - (e("hello_pagetop", &args![ - "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + (e("hello_powered", &args![ + "pagetop" => "<a href=\"https://pagetop.cillero.es\" target=\"_blank\">PageTop</a>" ])) })) .with_component( Anchor::button( - "#", - html! { - ("Offered services") - }, + "https://gitlab.com/manuelcillero/pagetop", + html! { (l("hello_code")) }, ) - .with_left_icon(Icon::with("card-checklist")) - .with_classes(ClassesOp::Add, "services-link"), + .with_target(AnchorTarget::Blank) + .with_left_icon(Icon::with("git")) + .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::button( - "#", - html! { - ("Get quote") - }, + Anchor::link( + "#welcome", + html! { (l("hello_welcome")) }, ) - .with_left_icon(Icon::with("envelope-open-heart-fill")), + .with_left_icon(Icon::with("arrow-down-circle-fill")) + .with_classes(ClassesOp::Add, "welcome-link"), ), ) .with_column( @@ -97,11 +96,13 @@ fn welcome() -> Container { .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") .with_component(Heading::h2(html! { - (t("welcome_to", &args!["app" => SETTINGS.app.name.as_str()])) + (l("welcome_page")) })) .with_component( Heading::h3(html! { - (l("welcome_subtitle")) + (e("welcome_subtitle", &args![ + "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) + ])) }) .with_display(HeadingDisplay::Subtitle), ) diff --git a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl index 87e0ddf0..e4e8dead 100644 --- a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl +++ b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl @@ -4,10 +4,12 @@ module_description = Displays a demo homepage when none is configured. page_title = Hello world! hello_intro = This page is used to test the proper operation of { $app } after installation. -hello_pagetop = This web solution is powered by { $pagetop }. +hello_powered = This web solution is powered by { $pagetop }. +hello_code = Code +hello_welcome = Welcome -welcome_to = Welcome to { $app } -welcome_subtitle = Are you user of this website? +welcome_page = Welcome Page +welcome_subtitle = Are you user of { $app }? welcome_text1 = If you don't know what this page is about, this probably means that the site is either experiencing problems or is undergoing routine maintenance. welcome_text2 = If the problem persists, please contact your system administrator. diff --git a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl index 67afd423..614a879e 100644 --- a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl +++ b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl @@ -3,11 +3,13 @@ module_description = Muestra una página de demostración predeterminada cuando page_title = ¡Hola mundo! -hello_intro = Esta página se utiliza para probar el correcto funcionamiento de { $app } después de la instalación. -hello_pagetop = Esta solución web funciona con { $pagetop }. +hello_intro = Esta página se utiliza para comprobar el correcto funcionamiento de { $app } después de la instalación. +hello_powered = Una solución web creada con { $pagetop }. +hello_code = Código +hello_welcome = Bienvenida -welcome_to = Bienvenido a { $app } -welcome_subtitle = ¿Eres usuario de este sitio web? +welcome_page = Página de bienvenida +welcome_subtitle = ¿Utilizas los servicios de { $app }? welcome_text1 = Si no sabes de qué trata esta página, probablemente significa que el sitio está experimentando problemas o está pasando por un mantenimiento de rutina. welcome_text2 = Si el problema persiste, póngase en contacto con el administrador del sistema. diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index e1aa44bc..68d20d3e 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -7,7 +7,7 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour /// This function uses the [static_files](https://docs.rs/static-files/latest/static_files/) library /// to embed at compile time a bundle of static files in your binary. /// -/// Just create the folder with static resources in your project (for example `static`): +/// Just create folder with static resources in your project (for example `static`): /// /// ```bash /// cd project_dir @@ -54,12 +54,13 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour /// } /// ``` /// -/// This will create a file called `guides.rs` where all output and intermediate artifacts are -/// placed, see [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html). +/// This will create a file called `guides.rs` in the standard directory +/// [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html) where all +/// intermediate and output artifacts are placed during compilation. /// -/// You don't need to access this file, just include it in your source code and a module called -/// `resources_guides` will be added to your project. Use the function `bundle_guides` to embed the -/// generated HashMap resources collection: +/// You don't need to access this file, just include it in your project source code and a module called +/// `resources_guides` will be added. Then simply reference the `bundle_guides` function to embed +/// the generated HashMap resources collection: /// /// ```rust#ignore /// use pagetop::prelude::*; diff --git a/pagetop/static/theme/module/homepage/styles.css b/pagetop/static/theme/module/homepage/styles.css index 08b28b02..6444fe44 100644 --- a/pagetop/static/theme/module/homepage/styles.css +++ b/pagetop/static/theme/module/homepage/styles.css @@ -1,13 +1,24 @@ +body.default-homepage span.app-name { + font-weight: bold; + color: inherit; +} + #hello-world { padding: 2em 5%; } #hello-world a { margin: .25em; } -#hello-world a.services-link { - padding-left: 1.5em; - padding-right: 1.5em; +#hello-world a.code-link { + padding-left: 2em; + padding-right: 2em; border-radius: 1.5em; + font-size: 112.5%; +} +#hello-world a.welcome-link { + text-decoration: none; + display: inline-block; + vertical-align: middle; } #welcome { From 671447398406de6f445883916b64b049546cb75e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 Aug 2022 16:58:49 +0200 Subject: [PATCH 175/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20Libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index e40b232f..92b11ab0 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.25" +version = "0.0.26" edition = "2021" authors = [ From 3f2f53a8f419a317066b3d50e9dec8fc39c4a503 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 18:18:08 +0200 Subject: [PATCH 176/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Actualiza=20versio?= =?UTF-8?q?nes=20de=20las=20dependencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 11 +++++++++++ drust/Cargo.toml | 2 +- pagetop-admin/Cargo.toml | 2 +- pagetop-mdbook/Cargo.toml | 2 +- pagetop/Cargo.toml | 24 ++++++++++++------------ pagetop/STARTER.bin.Cargo.toml | 14 +++++++++----- pagetop/STARTER.lib.Cargo.toml | 14 +++++++++----- pagetop/src/locale.rs | 6 +++--- website/Cargo.toml | 4 ++-- website/build.rs | 12 ++---------- 10 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 Cargo.toml diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..4fdc229c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[workspace] + +members = [ + "pagetop", + "pagetop-admin", + "pagetop-user", + "pagetop-node", + "pagetop-mdbook", + "website", + "drust", +] diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 983496c2..1ba79ded 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -19,7 +19,7 @@ features = ["mysql"] default-features = false [dependencies] -actix-web = "4.1.0" +actix-web = "4.2.1" pagetop-admin = { path = "../pagetop-admin" } pagetop-user = { path = "../pagetop-user" } pagetop-node = { path = "../pagetop-node" } diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 7eebf18a..2d916c6b 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -15,4 +15,4 @@ license = "Apache-2.0 or MIT" [dependencies] pagetop = { path = "../pagetop" } -maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } +maud = "0.24.0" diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml index faa155b8..f705d043 100644 --- a/pagetop-mdbook/Cargo.toml +++ b/pagetop-mdbook/Cargo.toml @@ -16,7 +16,7 @@ license = "Apache-2.0 or MIT" [dependencies] pagetop = { path = "../pagetop" } static-files = "0.2.3" -maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } +maud = "0.24.0" [build-dependencies] pagetop = { path = "../pagetop" } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 92b11ab0..554c43dd 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -25,13 +25,13 @@ categories = [ async-trait = "0.1.57" concat-string = "1.0.1" doc-comment = "0.3.3" -figlet-rs = "0.1.3" -futures = "0.3.21" -once_cell = "1.13.0" -paste = "1.0.8" +figlet-rs = "0.1.4" +futures = "0.3.24" +once_cell = "1.15.0" +paste = "1.0.9" substring = "1.4.5" term_size = "0.3.2" -url = "2.2.2" +url = "2.3.1" config_rs = { package = "config", version = "0.11.0", features = ["toml"] } @@ -39,27 +39,27 @@ tracing = "0.1.36" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.15", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } -tracing-actix-web = "0.6.0" +tracing-actix-web = "0.6.1" -fluent-templates = "0.7.1" +fluent-templates = "0.8.0" unic-langid = "0.9.0" -actix-web = "4.1.0" +actix-web = "4.2.1" actix-web-files = { package = "actix-files", version = "0.6.2" } actix-web-static-files = "4.0.0" static-files = "0.2.3" -maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6", features = ["actix-web"] } +maud = { version = "0.24.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.9.1" +version = "0.9.3" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.9.3" +version = "0.9.4" optional = true [features] @@ -73,7 +73,7 @@ sqlite = ["database", "sea-orm/sqlx-sqlite"] static-files = "0.2.3" [dev-dependencies] -tokio = { version = "1.20.1", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread"] } [lib] name = "pagetop" diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index f5d375c4..80f8a7e1 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -12,12 +12,16 @@ path = "../pagetop" features = ["mysql"] # features = ["postgres"] # features = ["sqlite"] -# En este caso hay que deshabilitar las características predeterminadas: +# En cuyo caso habrá que deshabilitar las características predeterminadas: default-features = false [dependencies] -actix-web = "4.1.0" -# Si se usa la macro html!: -maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } -# Si se requiere serialización de estructuras de datos: +actix-web = "4.2.1" +# Para usar la macro html! (opcional): +maud = "0.24.0" +# Para serializar estructuras de datos (opcional): serde = { version = "1.0", features = ["derive"] } + +[build-dependencies] +# Para incluir archivos y recursos binarios en el ejecutable (opcional): +pagetop = { path = "../pagetop" } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 0cdc858a..478f624d 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -8,13 +8,17 @@ edition = "2021" [dependencies.pagetop] path = "../pagetop" -# Para dar soporte a bases de datos: +# Si requiere base de datos: features = ["database"] -# En este caso hay que deshabilitar las características predeterminadas: +# En cuyo caso habrá que deshabilitar las características predeterminadas: default-features = false [dependencies] -# Si se usa la macro html!: -maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } -# Si se requiere serialización de estructuras de datos: +# Para usar la macro html! (opcional): +maud = "0.24.0" +# Para serializar estructuras de datos (opcional): serde = { version = "1.0", features = ["derive"] } + +[build-dependencies] +# Para incluir archivos y recursos binarios en la propia librería (opcional): +pagetop = { path = "../pagetop" } diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 355732be..f5dfb5f9 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -22,7 +22,7 @@ macro_rules! localize { #[allow(dead_code)] fn l(key: &str) -> String { - LOCALES.lookup(&LANGID, key) + LOCALES.lookup(&LANGID, key).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -30,7 +30,7 @@ macro_rules! localize { key: &str, args: &std::collections::HashMap<String, FluentValue> ) -> String { - LOCALES.lookup_with_args(&LANGID, key, args) + LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -39,7 +39,7 @@ macro_rules! localize { args: &std::collections::HashMap<String, FluentValue> ) -> $crate::html::PreEscaped<String> { $crate::html::PreEscaped( - LOCALES.lookup_with_args(&LANGID, key, args) + LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) ) } }; diff --git a/website/Cargo.toml b/website/Cargo.toml index 96ee2e96..ed924ecf 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -17,10 +17,10 @@ license = "Apache-2.0 or MIT" path = "../pagetop" [dependencies] -actix-web = "4.1.0" +actix-web = "4.2.1" static-files = "0.2.3" pagetop-mdbook = { path = "../pagetop-mdbook" } -maud = { git = "https://github.com/lambda-fairy/maud", rev = "e6787cd6" } +maud = "0.24.0" [build-dependencies] pagetop = { path = "../pagetop" } diff --git a/website/build.rs b/website/build.rs index 08c2d29d..ebc2fa83 100644 --- a/website/build.rs +++ b/website/build.rs @@ -2,14 +2,6 @@ use pagetop::util::bundle_resources; use pagetop_mdbook::util::except_mdbook_common_resources; fn main() -> std::io::Result<()> { - bundle_resources( - "./static/doc/en", - "guides_en", - Some(except_mdbook_common_resources), - )?; - bundle_resources( - "./static/doc/es", - "guias_es", - Some(except_mdbook_common_resources), - ) + bundle_resources("./doc/en", "guides_en", Some(except_mdbook_common_resources))?; + bundle_resources("./doc/es", "guias_es", Some(except_mdbook_common_resources)) } From 8ae24e8ea2b4834d1e563c00b21808a9294b43b6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 20:49:07 +0200 Subject: [PATCH 177/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20Libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.27?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 42 +++++++++++++++++++++++++++--------------- pagetop/Cargo.toml | 6 +++--- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 9f8d5024..44e2594e 100644 --- a/README.md +++ b/README.md @@ -17,32 +17,44 @@ son constantes. No puede considerarse listo para probar hasta que se libere la v El repositorio se organiza en un *workspace* con los siguientes subproyectos: -* [pagetop](pagetop/), es la librería esencial construida con *crates* estables y muy conocidos del - ecosistema Rust para proporcionar APIs, patrones de desarrollo y buenas prácticas para la creación - avanzada de soluciones web SSR (*Server-Side Rendering*). +* [pagetop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es la librería esencial + construida con *crates* estables y muy conocidos del ecosistema Rust para proporcionar APIs, + patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR + (*Server-Side Rendering*). -* [pagetop-admin](pagetop_admin/), módulo que proporciona a otros módulos un lugar común donde - presentar a los administradores sus opciones de configuración. +* [pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin), módulo que + proporciona a otros módulos un lugar común donde presentar a los administradores sus opciones de + configuración. -* [pagetop-user](pagetop_user/), módulo para añadir gestión de usuarios, roles, permisos y sesiones - en aplicaciones desarrolladas con PageTop. +* [pagetop-user](https://github.com/manuelcillero/pagetop/tree/main/pagetop-user), módulo para + añadir gestión de usuarios, roles, permisos y sesiones en aplicaciones desarrolladas con PageTop. -* [pagetop-node](pagetop_node/), módulo para crear, extender o personalizar los tipos de contenido - que puede administrar un sitio web. +* [pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node), módulo para + crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. -* [drust](drust/) es una aplicación inspirada modestamente en [Drupal](https://www.drupal.org) que - proporciona un CMS (*Content Management System*) o sistema de gestión de contenidos para construir - sitios web dinámicos, administrados y configurables. +* [pagetop-mdbook](https://github.com/manuelcillero/pagetop/tree/main/pagetop-mdbook), módulo para + integrar los archivos generados por la herramienta [mdBook](https://rust-lang.github.io/mdBook/) + en un proyecto web creado con PageTop. + +* [website](https://github.com/manuelcillero/pagetop/tree/main/website), es una aplicación creada + con PageTop para presentar el entorno a la comunidad y publicar la documentación de usuario + ([pagetop.cillero.es](https://pagetop.cillero.es)). + +* [drust](https://github.com/manuelcillero/pagetop/tree/main/drust), es una aplicación modestamente + inspirada en [Drupal](https://www.drupal.org) que utiliza PageTop para crear un CMS (*Content + Management System*) o sistema de gestión de contenidos para construir sitios web dinámicos, + administrados y configurables. # Licencia -Este proyecto tiene licencia, de hecho se puede aplicar cualquiera de las siguientes a tu elección: +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: * Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-APACHE) o + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o [http://www.apache.org/licenses/LICENSE-2.0]). * Licencia MIT - ([LICENSE-MIT](https://gitlab.com/manuelcillero/pagetop/-/blob/main/LICENSE-MIT) o + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o [http://opensource.org/licenses/MIT]). diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 554c43dd..37959ec0 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.26" +version = "0.0.27" edition = "2021" authors = [ @@ -10,8 +10,8 @@ description = """\ PageTop is an opinionated web development framework that uses the most stable and popular Rust \ packages to build modular, extensible and configurable Server-side rendered solutions.\ """ -homepage = "https://suitepro.cillero.es/projects/pagetop" -repository = "https://gitlab.com/manuelcillero/pagetop" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" keywords = [ From b6da4d1c32b2d1a3ff83c853170ebd916950b1a1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 20:59:08 +0200 Subject: [PATCH 178/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20Libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 2d916c6b..c3175413 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -7,12 +7,12 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - ...\ + Handles general site configuration for administrators.\ """ -homepage = "https://suitepro.cillero.es/projects/pagetop" -repository = "https://gitlab.com/manuelcillero/pagetop" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" [dependencies] -pagetop = { path = "../pagetop" } +pagetop = { path = "../pagetop", version = "0.0" } maud = "0.24.0" From d42dfaca4e1a1710f52ba3a9e4727dffa609a71f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 20:59:37 +0200 Subject: [PATCH 179/853] =?UTF-8?q?=F0=9F=94=96=20[mdbook]=20Libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-mdbook/Cargo.toml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml index f705d043..bf0ab952 100644 --- a/pagetop-mdbook/Cargo.toml +++ b/pagetop-mdbook/Cargo.toml @@ -7,16 +7,17 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - ...\ + Embeds the assets generated by mdBook into a PageTop application to create product or API \ + documentation, tutorials, course materials, or anything that requires a navigable presentation.\ """ -homepage = "https://suitepro.cillero.es/projects/pagetop" -repository = "https://gitlab.com/manuelcillero/pagetop" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" [dependencies] -pagetop = { path = "../pagetop" } +pagetop = { path = "../pagetop", version = "0.0" } static-files = "0.2.3" maud = "0.24.0" [build-dependencies] -pagetop = { path = "../pagetop" } +pagetop = { path = "../pagetop", version = "0.0" } From f59f815f8e1e8ca7a723d3f39d698ddc28fde074 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 21:00:08 +0200 Subject: [PATCH 180/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20Libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index b2fa9fec..c21d255d 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -9,11 +9,9 @@ authors = [ description = """\ Allows content to be submitted to the site and displayed on pages.\ """ -homepage = "https://suitepro.cillero.es/projects/pagetop" -repository = "https://gitlab.com/manuelcillero/pagetop" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" -[dependencies.pagetop] -path = "../pagetop" -features = ["database"] -default-features = false +[dependencies] +pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } From 763e53870ea00b5903b028d7a66cec51fd9c10cc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 21:00:27 +0200 Subject: [PATCH 181/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20Libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 01c28e4b..db3d053f 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -7,16 +7,12 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Allows content to be submitted to the site and displayed on pages.\ + Manages the user registration and login system.\ """ -homepage = "https://suitepro.cillero.es/projects/pagetop" -repository = "https://gitlab.com/manuelcillero/pagetop" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" -[dependencies.pagetop] -path = "../pagetop" -features = ["database"] -default-features = false - [dependencies] +pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } serde = { version = "1.0", features = ["derive"] } From 17583c90b6ffee9e16358b05c5b74e1cf58f4e56 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 21:00:50 +0200 Subject: [PATCH 182/853] =?UTF-8?q?=F0=9F=94=96=20[website]=20Libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/Cargo.toml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/website/Cargo.toml b/website/Cargo.toml index ed924ecf..200294a3 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -7,21 +7,19 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - PageTop and Drust website.\ + PageTop website.\ """ homepage = "https://pagetop.cillero.es" -repository = "https://gitlab.com/manuelcillero/pagetop/website" +repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" -[dependencies.pagetop] -path = "../pagetop" - [dependencies] actix-web = "4.2.1" static-files = "0.2.3" -pagetop-mdbook = { path = "../pagetop-mdbook" } +pagetop = { path = "../pagetop", version = "0.0" } +pagetop-mdbook = { path = "../pagetop-mdbook", version = "0.0" } maud = "0.24.0" [build-dependencies] -pagetop = { path = "../pagetop" } -pagetop-mdbook = { path = "../pagetop-mdbook" } +pagetop = { path = "../pagetop", version = "0.0" } +pagetop-mdbook = { path = "../pagetop-mdbook", version = "0.0" } From cb7075f6a289be290f4c1452ca8abd7fc5d170c9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 21:01:06 +0200 Subject: [PATCH 183/853] =?UTF-8?q?=F0=9F=94=96=20[drust]=20Libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/Cargo.toml | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 1ba79ded..9ad49f4f 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -9,17 +9,13 @@ authors = [ description = """\ A modern web Content Management System to share your world.\ """ -homepage = "https://suitepro.cillero.es/projects/drust" -repository = "https://gitlab.com/manuelcillero/drust" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 or MIT" -[dependencies.pagetop] -path = "../pagetop" -features = ["mysql"] -default-features = false - [dependencies] actix-web = "4.2.1" -pagetop-admin = { path = "../pagetop-admin" } -pagetop-user = { path = "../pagetop-user" } -pagetop-node = { path = "../pagetop-node" } +pagetop = { path = "../pagetop", version = "0.0", features = ["mysql"], default-features = false } +pagetop-admin = { path = "../pagetop-admin", version = "0.0" } +pagetop-user = { path = "../pagetop-user", version = "0.0" } +pagetop-node = { path = "../pagetop-node", version = "0.0" } From f241775aef1f32b59fb8faf733232c5f2489bec6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 21:19:19 +0200 Subject: [PATCH 184/853] =?UTF-8?q?=F0=9F=A9=B9=20Corrige=20"or"=20por=20"?= =?UTF-8?q?OR"=20en=20licencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 37959ec0..840ebde6 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -12,7 +12,7 @@ description = """\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 or MIT" +license = "Apache-2.0 OR MIT" keywords = [ "web", "cms", "framework", "frontend", "ssr" From 9b30f40092580ca986914953dde626092ed53f3c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Oct 2022 21:32:11 +0200 Subject: [PATCH 185/853] =?UTF-8?q?=F0=9F=A9=B9=20Corrige=20"or"=20por=20"?= =?UTF-8?q?OR"=20en=20licencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/Cargo.toml | 2 +- pagetop-admin/Cargo.toml | 2 +- pagetop-mdbook/Cargo.toml | 2 +- pagetop-node/Cargo.toml | 2 +- pagetop-user/Cargo.toml | 2 +- website/Cargo.toml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 9ad49f4f..a1f66688 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -11,7 +11,7 @@ description = """\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 or MIT" +license = "Apache-2.0 OR MIT" [dependencies] actix-web = "4.2.1" diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index c3175413..06fc361b 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -11,7 +11,7 @@ description = """\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 or MIT" +license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml index bf0ab952..e8d8047f 100644 --- a/pagetop-mdbook/Cargo.toml +++ b/pagetop-mdbook/Cargo.toml @@ -12,7 +12,7 @@ description = """\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 or MIT" +license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index c21d255d..1b58ff20 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -11,7 +11,7 @@ description = """\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 or MIT" +license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index db3d053f..3d6f39a4 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -11,7 +11,7 @@ description = """\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 or MIT" +license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } diff --git a/website/Cargo.toml b/website/Cargo.toml index 200294a3..55231683 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -11,7 +11,7 @@ description = """\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 or MIT" +license = "Apache-2.0 OR MIT" [dependencies] actix-web = "4.2.1" From ab99c559de7c5a3b0d28a3522cc4d21089f71db5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 14 Oct 2022 07:39:55 +0200 Subject: [PATCH 186/853] =?UTF-8?q?=F0=9F=93=9D=20A=C3=B1ade=20archivos=20?= =?UTF-8?q?README=20por=20proyecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 3 +++ drust/README.md | 29 +++++++++++++++++++++++++++++ pagetop-admin/README.md | 28 ++++++++++++++++++++++++++++ pagetop-mdbook/README.md | 28 ++++++++++++++++++++++++++++ pagetop-node/README.md | 28 ++++++++++++++++++++++++++++ pagetop-user/README.md | 28 ++++++++++++++++++++++++++++ pagetop/README.md | 24 ++++++++++++++++++++++++ website/README.md | 28 ++++++++++++++++++++++++++++ 8 files changed, 196 insertions(+) create mode 100644 drust/README.md create mode 100644 pagetop-admin/README.md create mode 100644 pagetop-mdbook/README.md create mode 100644 pagetop-node/README.md create mode 100644 pagetop-user/README.md create mode 100644 pagetop/README.md create mode 100644 website/README.md diff --git a/Cargo.toml b/Cargo.toml index 4fdc229c..9d32cfd4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,9 @@ members = [ "pagetop-user", "pagetop-node", "pagetop-mdbook", +] + +exclude = [ "website", "drust", ] diff --git a/drust/README.md b/drust/README.md new file mode 100644 index 00000000..dcab6911 --- /dev/null +++ b/drust/README.md @@ -0,0 +1,29 @@ +**Drust** es una aplicación modestamente inspirada en [Drupal](https://www.drupal.org) que utiliza +**PageTop** para crear un CMS (*Content Management System*) o sistema de gestión de contenidos para +construir sitios web dinámicos, administrados y configurables. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR +(*Server-Side Rendering*). + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-admin/README.md b/pagetop-admin/README.md new file mode 100644 index 00000000..48005e99 --- /dev/null +++ b/pagetop-admin/README.md @@ -0,0 +1,28 @@ +Módulo para **PageTop** que proporciona a otros módulos un lugar común donde presentar a los +administradores sus opciones de configuración. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR +(*Server-Side Rendering*). + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-mdbook/README.md b/pagetop-mdbook/README.md new file mode 100644 index 00000000..c940aba5 --- /dev/null +++ b/pagetop-mdbook/README.md @@ -0,0 +1,28 @@ +Módulo que permite integrar los archivos generados por la herramienta +[mdBook](https://rust-lang.github.io/mdBook/) en un proyecto web creado con **PageTop**. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR +(*Server-Side Rendering*). + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-node/README.md b/pagetop-node/README.md new file mode 100644 index 00000000..9fae02ce --- /dev/null +++ b/pagetop-node/README.md @@ -0,0 +1,28 @@ +Módulo para **PageTop** que permite crear, extender o personalizar los tipos de contenido que puede +administrar un sitio web. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR +(*Server-Side Rendering*). + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-user/README.md b/pagetop-user/README.md new file mode 100644 index 00000000..62b1cbdc --- /dev/null +++ b/pagetop-user/README.md @@ -0,0 +1,28 @@ +Módulo que permite añadir gestión de usuarios, roles, permisos y sesiones en aplicaciones +desarrolladas con **PageTop**. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR +(*Server-Side Rendering*). + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop/README.md b/pagetop/README.md new file mode 100644 index 00000000..14f0ee10 --- /dev/null +++ b/pagetop/README.md @@ -0,0 +1,24 @@ +**PageTop** es un entorno de desarrollo basado en [Rust](https://www.rust-lang.org/es/) que reúne +algunos de los crates más estables y populares para crear soluciones web modulares, extensibles y +configurables. + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..bae0748a --- /dev/null +++ b/website/README.md @@ -0,0 +1,28 @@ +Aplicación creada con **PageTop** para presentar el entorno a la comunidad y publicar la +documentación de usuario ([pagetop.cillero.es](https://pagetop.cillero.es)). + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR +(*Server-Side Rendering*). + + +# Advertencia + +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se +liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios +son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. + + +# Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas +cualquiera de las siguientes a tu elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). From 7a1535a87937f0adb087e7d06d98745c551f480d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 14 Oct 2022 18:05:58 +0200 Subject: [PATCH 187/853] =?UTF-8?q?=F0=9F=94=96=20Incrementa=20versi=C3=B3?= =?UTF-8?q?n=20de=20desarrollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- pagetop-mdbook/Cargo.toml | 2 +- pagetop-node/Cargo.toml | 2 +- pagetop-user/Cargo.toml | 2 +- pagetop/Cargo.toml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 06fc361b..81f78fe8 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml index e8d8047f..1bb097d3 100644 --- a/pagetop-mdbook/Cargo.toml +++ b/pagetop-mdbook/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-mdbook" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 1b58ff20..b069908a 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 3d6f39a4..7d74f89e 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 840ebde6..897ea673 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.27" +version = "0.0.28" edition = "2021" authors = [ From bd03d927683bec0436dac59c7fecf76ae9a86d79 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 15 Oct 2022 11:56:52 +0200 Subject: [PATCH 188/853] =?UTF-8?q?=F0=9F=8D=B1=20A=C3=B1ade=20banner=20of?= =?UTF-8?q?icial=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/static/pagetop-banner.png | Bin 0 -> 75138 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pagetop/static/pagetop-banner.png diff --git a/pagetop/static/pagetop-banner.png b/pagetop/static/pagetop-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad517414ff92fa54ccba9383d877d9ffb077f6a GIT binary patch literal 75138 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 R8GQE@R9<L4uaLJ4{x3A|;ZOho literal 0 HcmV?d00001 From bca6757b3d53ab8f127384672d5830dd95239f90 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 15 Oct 2022 12:15:51 +0200 Subject: [PATCH 189/853] =?UTF-8?q?=F0=9F=93=9D=20Actualiza=20archivos=20R?= =?UTF-8?q?EADME=20con=20gr=C3=A1ficos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 49 ++++++++++++++++++++++++---------------- drust/README.md | 18 +++++++-------- pagetop-admin/README.md | 14 ++++++------ pagetop-mdbook/README.md | 18 +++++++-------- pagetop-node/README.md | 16 ++++++------- pagetop-user/README.md | 18 +++++++-------- pagetop/README.md | 10 ++++---- website/README.md | 14 ++++++------ 8 files changed, 84 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 44e2594e..0cc5c55b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +<div align="center"> + + <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/pagetop/static/pagetop-banner.png" /> + + <h1>PageTop</h1> + + [![crate](https://img.shields.io/crates/v/pagetop.svg)](https://crates.io/crates/pagetop) + [![docs](https://docs.rs/pagetop/badge.svg)](https://docs.rs/pagetop) + +</div> + **PageTop** es un entorno de desarrollo basado en [Rust](https://www.rust-lang.org/es/) que reúne algunos de los crates más estables y populares para crear soluciones web modulares, extensibles y configurables. @@ -6,47 +17,47 @@ Incluye **Drust**, un sistema de gestión de contenidos basado en PageTop que pe mantener sitios web dinámicos, rápidos y seguros. -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Estructura del código +# 📂 Estructura del código El repositorio se organiza en un *workspace* con los siguientes subproyectos: -* [pagetop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es la librería esencial +* **[pagetop](https://github.com/manuelcillero/pagetop/tree/main/pagetop)**, es la librería esencial construida con *crates* estables y muy conocidos del ecosistema Rust para proporcionar APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR (*Server-Side Rendering*). -* [pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin), módulo que +* **[pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin)**, módulo que proporciona a otros módulos un lugar común donde presentar a los administradores sus opciones de configuración. -* [pagetop-user](https://github.com/manuelcillero/pagetop/tree/main/pagetop-user), módulo para +* **[pagetop-user](https://github.com/manuelcillero/pagetop/tree/main/pagetop-user)**, módulo para añadir gestión de usuarios, roles, permisos y sesiones en aplicaciones desarrolladas con PageTop. -* [pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node), módulo para +* **[pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node)**, módulo para crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. -* [pagetop-mdbook](https://github.com/manuelcillero/pagetop/tree/main/pagetop-mdbook), módulo para - integrar los archivos generados por la herramienta [mdBook](https://rust-lang.github.io/mdBook/) - en un proyecto web creado con PageTop. +* **[pagetop-mdbook](https://github.com/manuelcillero/pagetop/tree/main/pagetop-mdbook)**, módulo + que permite integrar los archivos generados por [mdBook](https://rust-lang.github.io/mdBook/) en + un proyecto web creado con PageTop. -* [website](https://github.com/manuelcillero/pagetop/tree/main/website), es una aplicación creada - con PageTop para presentar el entorno a la comunidad y publicar la documentación de usuario +* **[website](https://github.com/manuelcillero/pagetop/tree/main/website)**, es una aplicación + creada con PageTop para presentar el entorno a la comunidad y publicar la documentación de usuario ([pagetop.cillero.es](https://pagetop.cillero.es)). -* [drust](https://github.com/manuelcillero/pagetop/tree/main/drust), es una aplicación modestamente - inspirada en [Drupal](https://www.drupal.org) que utiliza PageTop para crear un CMS (*Content - Management System*) o sistema de gestión de contenidos para construir sitios web dinámicos, - administrados y configurables. +* **[drust](https://github.com/manuelcillero/pagetop/tree/main/drust)**, es una aplicación + inspirada modestamente en [Drupal](https://www.drupal.org) que utiliza PageTop para crear un CMS + (*Content Management System* o sistema de gestión de contenidos) para construir sitios web + dinámicos, administrados y configurables. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: diff --git a/drust/README.md b/drust/README.md index dcab6911..ad163034 100644 --- a/drust/README.md +++ b/drust/README.md @@ -1,21 +1,21 @@ -**Drust** es una aplicación modestamente inspirada en [Drupal](https://www.drupal.org) que utiliza -**PageTop** para crear un CMS (*Content Management System*) o sistema de gestión de contenidos para +**Drust** es una aplicación inspirada modestamente en [Drupal](https://www.drupal.org) que utiliza +**PageTop** para crear un CMS (*Content Management System* o sistema de gestión de contenidos) para construir sitios web dinámicos, administrados y configurables. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR -(*Server-Side Rendering*). +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: diff --git a/pagetop-admin/README.md b/pagetop-admin/README.md index 48005e99..f94e6bc3 100644 --- a/pagetop-admin/README.md +++ b/pagetop-admin/README.md @@ -3,18 +3,18 @@ administradores sus opciones de configuración. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR -(*Server-Side Rendering*). +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: diff --git a/pagetop-mdbook/README.md b/pagetop-mdbook/README.md index c940aba5..ce053f1d 100644 --- a/pagetop-mdbook/README.md +++ b/pagetop-mdbook/README.md @@ -1,20 +1,20 @@ -Módulo que permite integrar los archivos generados por la herramienta -[mdBook](https://rust-lang.github.io/mdBook/) en un proyecto web creado con **PageTop**. +Módulo que permite integrar los archivos generados por [mdBook](https://rust-lang.github.io/mdBook/) +en un proyecto web creado con **PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR -(*Server-Side Rendering*). +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: diff --git a/pagetop-node/README.md b/pagetop-node/README.md index 9fae02ce..78fb75f9 100644 --- a/pagetop-node/README.md +++ b/pagetop-node/README.md @@ -1,20 +1,20 @@ -Módulo para **PageTop** que permite crear, extender o personalizar los tipos de contenido que puede +Módulo para **PageTop** para crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR -(*Server-Side Rendering*). +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: diff --git a/pagetop-user/README.md b/pagetop-user/README.md index 62b1cbdc..1469bb3a 100644 --- a/pagetop-user/README.md +++ b/pagetop-user/README.md @@ -1,20 +1,20 @@ -Módulo que permite añadir gestión de usuarios, roles, permisos y sesiones en aplicaciones -desarrolladas con **PageTop**. +Módulo para añadir gestión de usuarios, roles, permisos y sesiones en aplicaciones desarrolladas con +**PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR -(*Server-Side Rendering*). +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: diff --git a/pagetop/README.md b/pagetop/README.md index 14f0ee10..bb05e077 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -3,14 +3,14 @@ algunos de los crates más estables y populares para crear soluciones web modula configurables. -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: diff --git a/website/README.md b/website/README.md index bae0748a..bb51c89e 100644 --- a/website/README.md +++ b/website/README.md @@ -3,18 +3,18 @@ documentación de usuario ([pagetop.cillero.es](https://pagetop.cillero.es)). [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR -(*Server-Side Rendering*). +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). -# Advertencia +# 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Ahora mismo sólo se -liberan versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios -son constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan +versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son +constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. -# Licencia +# 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas cualquiera de las siguientes a tu elección: From acdd0dae7b9ebdd0e6a5010e97debfdf173f7348 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 16 Oct 2022 10:23:56 +0200 Subject: [PATCH 190/853] =?UTF-8?q?=F0=9F=9A=9A=20Mueve=20mdbook/website?= =?UTF-8?q?=20a=20sus=20propios=20repositorios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 - Cargo.toml | 2 - README.md | 8 - pagetop-mdbook/Cargo.toml | 23 - pagetop-mdbook/README.md | 28 - pagetop-mdbook/build.rs | 5 - pagetop-mdbook/src/lib.rs | 198 -- pagetop-mdbook/src/util.rs | 21 - .../static/FontAwesome/css/font-awesome.css | 4 - .../static/FontAwesome/fonts/FontAwesome.ttf | Bin 165548 -> 0 bytes .../FontAwesome/fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes .../FontAwesome/fonts/fontawesome-webfont.svg | 2671 ----------------- .../FontAwesome/fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes pagetop-mdbook/static/ayu-highlight.css | 78 - pagetop-mdbook/static/css/chrome.css | 552 ---- pagetop-mdbook/static/css/general.css | 187 -- pagetop-mdbook/static/css/print.css | 65 - pagetop-mdbook/static/css/variables.css | 253 -- .../static/fonts/OPEN-SANS-LICENSE.txt | 202 -- .../static/fonts/SOURCE-CODE-PRO-LICENSE.txt | 93 - pagetop-mdbook/static/fonts/fonts.css | 100 - .../open-sans-v17-all-charsets-300.woff2 | Bin 44352 -> 0 bytes ...open-sans-v17-all-charsets-300italic.woff2 | Bin 40656 -> 0 bytes .../open-sans-v17-all-charsets-600.woff2 | Bin 44936 -> 0 bytes ...open-sans-v17-all-charsets-600italic.woff2 | Bin 42120 -> 0 bytes .../open-sans-v17-all-charsets-700.woff2 | Bin 44988 -> 0 bytes ...open-sans-v17-all-charsets-700italic.woff2 | Bin 40800 -> 0 bytes .../open-sans-v17-all-charsets-800.woff2 | Bin 44536 -> 0 bytes ...open-sans-v17-all-charsets-800italic.woff2 | Bin 40812 -> 0 bytes .../open-sans-v17-all-charsets-italic.woff2 | Bin 41076 -> 0 bytes .../open-sans-v17-all-charsets-regular.woff2 | Bin 43236 -> 0 bytes ...source-code-pro-v11-all-charsets-500.woff2 | Bin 59140 -> 0 bytes pagetop-mdbook/static/highlight.css | 82 - pagetop-mdbook/static/tomorrow-night.css | 102 - pagetop-mdbook/template/book.toml | 8 - pagetop-mdbook/template/theme/book.js | 679 ----- pagetop-mdbook/template/theme/css/chrome.css | 552 ---- pagetop-mdbook/template/theme/css/general.css | 187 -- pagetop-mdbook/template/theme/css/print.css | 65 - .../template/theme/css/variables.css | 253 -- pagetop-mdbook/template/theme/highlight.css | 82 - pagetop-mdbook/template/theme/highlight.js | 6 - pagetop-mdbook/template/theme/index.hbs | 261 -- website/Cargo.toml | 25 - website/README.md | 28 - website/build.rs | 7 - website/config/default.toml | 9 - website/doc/en/book.toml | 8 - website/doc/en/src/404.md | 3 - website/doc/en/src/README.md | 41 - website/doc/en/src/SUMMARY.md | 43 - website/doc/en/src/cli/README.md | 14 - website/doc/en/src/cli/build.md | 40 - website/doc/en/src/cli/clean.md | 30 - website/doc/en/src/cli/completions.md | 16 - website/doc/en/src/cli/init.md | 70 - website/doc/en/src/cli/serve.md | 56 - website/doc/en/src/cli/test.md | 63 - website/doc/en/src/cli/watch.md | 40 - website/doc/en/src/continuous-integration.md | 121 - website/doc/en/src/for_developers/README.md | 47 - website/doc/en/src/for_developers/backends.md | 346 --- .../mdbook-wordcount/Cargo.toml | 9 - .../mdbook-wordcount/src/main.rs | 49 - .../en/src/for_developers/preprocessors.md | 126 - website/doc/en/src/format/README.md | 8 - .../doc/en/src/format/configuration/README.md | 12 - .../configuration/environment-variables.md | 38 - .../en/src/format/configuration/general.md | 110 - .../src/format/configuration/preprocessors.md | 87 - .../en/src/format/configuration/renderers.md | 299 -- website/doc/en/src/format/example.rs | 6 - .../en/src/format/images/rust-logo-blk.svg | 1 - website/doc/en/src/format/markdown.md | 222 -- website/doc/en/src/format/mathjax.md | 43 - website/doc/en/src/format/mdbook.md | 276 -- website/doc/en/src/format/summary.md | 99 - website/doc/en/src/format/theme/README.md | 50 - website/doc/en/src/format/theme/editor.md | 48 - website/doc/en/src/format/theme/index-hbs.md | 101 - .../src/format/theme/syntax-highlighting.md | 121 - website/doc/en/src/guide/README.md | 7 - website/doc/en/src/guide/creating.md | 109 - website/doc/en/src/guide/installation.md | 52 - website/doc/en/src/guide/reading.md | 74 - website/doc/en/src/misc/contributors.md | 24 - website/doc/en/theme/book.js | 679 ----- website/doc/en/theme/css/chrome.css | 552 ---- website/doc/en/theme/css/general.css | 187 -- website/doc/en/theme/css/print.css | 65 - website/doc/en/theme/css/variables.css | 253 -- website/doc/en/theme/highlight.css | 82 - website/doc/en/theme/highlight.js | 6 - website/doc/en/theme/index.hbs | 261 -- website/doc/es/book.toml | 8 - website/doc/es/src/404.md | 3 - website/doc/es/src/README.md | 41 - website/doc/es/src/SUMMARY.md | 43 - website/doc/es/src/cli/README.md | 14 - website/doc/es/src/cli/build.md | 40 - website/doc/es/src/cli/clean.md | 30 - website/doc/es/src/cli/completions.md | 16 - website/doc/es/src/cli/init.md | 70 - website/doc/es/src/cli/serve.md | 56 - website/doc/es/src/cli/test.md | 63 - website/doc/es/src/cli/watch.md | 40 - website/doc/es/src/continuous-integration.md | 121 - website/doc/es/src/for_developers/README.md | 47 - website/doc/es/src/for_developers/backends.md | 346 --- .../mdbook-wordcount/Cargo.toml | 9 - .../mdbook-wordcount/src/main.rs | 49 - .../es/src/for_developers/preprocessors.md | 126 - website/doc/es/src/format/README.md | 8 - .../doc/es/src/format/configuration/README.md | 12 - .../configuration/environment-variables.md | 38 - .../es/src/format/configuration/general.md | 110 - .../src/format/configuration/preprocessors.md | 87 - .../es/src/format/configuration/renderers.md | 299 -- website/doc/es/src/format/example.rs | 6 - .../es/src/format/images/rust-logo-blk.svg | 1 - website/doc/es/src/format/markdown.md | 222 -- website/doc/es/src/format/mathjax.md | 43 - website/doc/es/src/format/mdbook.md | 276 -- website/doc/es/src/format/summary.md | 99 - website/doc/es/src/format/theme/README.md | 50 - website/doc/es/src/format/theme/editor.md | 48 - website/doc/es/src/format/theme/index-hbs.md | 101 - .../src/format/theme/syntax-highlighting.md | 121 - website/doc/es/src/guide/README.md | 7 - website/doc/es/src/guide/creating.md | 109 - website/doc/es/src/guide/installation.md | 52 - website/doc/es/src/guide/reading.md | 74 - website/doc/es/src/misc/contributors.md | 24 - website/doc/es/theme/book.js | 679 ----- website/doc/es/theme/css/chrome.css | 552 ---- website/doc/es/theme/css/general.css | 187 -- website/doc/es/theme/css/print.css | 65 - website/doc/es/theme/css/variables.css | 253 -- website/doc/es/theme/highlight.css | 82 - website/doc/es/theme/highlight.js | 6 - website/doc/es/theme/index.hbs | 261 -- website/src/main.rs | 33 - 144 files changed, 16862 deletions(-) delete mode 100644 pagetop-mdbook/Cargo.toml delete mode 100644 pagetop-mdbook/README.md delete mode 100644 pagetop-mdbook/build.rs delete mode 100644 pagetop-mdbook/src/lib.rs delete mode 100644 pagetop-mdbook/src/util.rs delete mode 100644 pagetop-mdbook/static/FontAwesome/css/font-awesome.css delete mode 100644 pagetop-mdbook/static/FontAwesome/fonts/FontAwesome.ttf delete mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.eot delete mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg delete mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.ttf delete mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff delete mode 100644 pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff2 delete mode 100644 pagetop-mdbook/static/ayu-highlight.css delete mode 100644 pagetop-mdbook/static/css/chrome.css delete mode 100644 pagetop-mdbook/static/css/general.css delete mode 100644 pagetop-mdbook/static/css/print.css delete mode 100644 pagetop-mdbook/static/css/variables.css delete mode 100644 pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt delete mode 100644 pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt delete mode 100644 pagetop-mdbook/static/fonts/fonts.css delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300italic.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600italic.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700italic.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800italic.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-italic.woff2 delete mode 100644 pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-regular.woff2 delete mode 100644 pagetop-mdbook/static/fonts/source-code-pro-v11-all-charsets-500.woff2 delete mode 100644 pagetop-mdbook/static/highlight.css delete mode 100644 pagetop-mdbook/static/tomorrow-night.css delete mode 100644 pagetop-mdbook/template/book.toml delete mode 100644 pagetop-mdbook/template/theme/book.js delete mode 100644 pagetop-mdbook/template/theme/css/chrome.css delete mode 100644 pagetop-mdbook/template/theme/css/general.css delete mode 100644 pagetop-mdbook/template/theme/css/print.css delete mode 100644 pagetop-mdbook/template/theme/css/variables.css delete mode 100644 pagetop-mdbook/template/theme/highlight.css delete mode 100644 pagetop-mdbook/template/theme/highlight.js delete mode 100644 pagetop-mdbook/template/theme/index.hbs delete mode 100644 website/Cargo.toml delete mode 100644 website/README.md delete mode 100644 website/build.rs delete mode 100644 website/config/default.toml delete mode 100644 website/doc/en/book.toml delete mode 100644 website/doc/en/src/404.md delete mode 100644 website/doc/en/src/README.md delete mode 100644 website/doc/en/src/SUMMARY.md delete mode 100644 website/doc/en/src/cli/README.md delete mode 100644 website/doc/en/src/cli/build.md delete mode 100644 website/doc/en/src/cli/clean.md delete mode 100644 website/doc/en/src/cli/completions.md delete mode 100644 website/doc/en/src/cli/init.md delete mode 100644 website/doc/en/src/cli/serve.md delete mode 100644 website/doc/en/src/cli/test.md delete mode 100644 website/doc/en/src/cli/watch.md delete mode 100644 website/doc/en/src/continuous-integration.md delete mode 100644 website/doc/en/src/for_developers/README.md delete mode 100644 website/doc/en/src/for_developers/backends.md delete mode 100644 website/doc/en/src/for_developers/mdbook-wordcount/Cargo.toml delete mode 100644 website/doc/en/src/for_developers/mdbook-wordcount/src/main.rs delete mode 100644 website/doc/en/src/for_developers/preprocessors.md delete mode 100644 website/doc/en/src/format/README.md delete mode 100644 website/doc/en/src/format/configuration/README.md delete mode 100644 website/doc/en/src/format/configuration/environment-variables.md delete mode 100644 website/doc/en/src/format/configuration/general.md delete mode 100644 website/doc/en/src/format/configuration/preprocessors.md delete mode 100644 website/doc/en/src/format/configuration/renderers.md delete mode 100644 website/doc/en/src/format/example.rs delete mode 100644 website/doc/en/src/format/images/rust-logo-blk.svg delete mode 100644 website/doc/en/src/format/markdown.md delete mode 100644 website/doc/en/src/format/mathjax.md delete mode 100644 website/doc/en/src/format/mdbook.md delete mode 100644 website/doc/en/src/format/summary.md delete mode 100644 website/doc/en/src/format/theme/README.md delete mode 100644 website/doc/en/src/format/theme/editor.md delete mode 100644 website/doc/en/src/format/theme/index-hbs.md delete mode 100644 website/doc/en/src/format/theme/syntax-highlighting.md delete mode 100644 website/doc/en/src/guide/README.md delete mode 100644 website/doc/en/src/guide/creating.md delete mode 100644 website/doc/en/src/guide/installation.md delete mode 100644 website/doc/en/src/guide/reading.md delete mode 100644 website/doc/en/src/misc/contributors.md delete mode 100644 website/doc/en/theme/book.js delete mode 100644 website/doc/en/theme/css/chrome.css delete mode 100644 website/doc/en/theme/css/general.css delete mode 100644 website/doc/en/theme/css/print.css delete mode 100644 website/doc/en/theme/css/variables.css delete mode 100644 website/doc/en/theme/highlight.css delete mode 100644 website/doc/en/theme/highlight.js delete mode 100644 website/doc/en/theme/index.hbs delete mode 100644 website/doc/es/book.toml delete mode 100644 website/doc/es/src/404.md delete mode 100644 website/doc/es/src/README.md delete mode 100644 website/doc/es/src/SUMMARY.md delete mode 100644 website/doc/es/src/cli/README.md delete mode 100644 website/doc/es/src/cli/build.md delete mode 100644 website/doc/es/src/cli/clean.md delete mode 100644 website/doc/es/src/cli/completions.md delete mode 100644 website/doc/es/src/cli/init.md delete mode 100644 website/doc/es/src/cli/serve.md delete mode 100644 website/doc/es/src/cli/test.md delete mode 100644 website/doc/es/src/cli/watch.md delete mode 100644 website/doc/es/src/continuous-integration.md delete mode 100644 website/doc/es/src/for_developers/README.md delete mode 100644 website/doc/es/src/for_developers/backends.md delete mode 100644 website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml delete mode 100644 website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs delete mode 100644 website/doc/es/src/for_developers/preprocessors.md delete mode 100644 website/doc/es/src/format/README.md delete mode 100644 website/doc/es/src/format/configuration/README.md delete mode 100644 website/doc/es/src/format/configuration/environment-variables.md delete mode 100644 website/doc/es/src/format/configuration/general.md delete mode 100644 website/doc/es/src/format/configuration/preprocessors.md delete mode 100644 website/doc/es/src/format/configuration/renderers.md delete mode 100644 website/doc/es/src/format/example.rs delete mode 100644 website/doc/es/src/format/images/rust-logo-blk.svg delete mode 100644 website/doc/es/src/format/markdown.md delete mode 100644 website/doc/es/src/format/mathjax.md delete mode 100644 website/doc/es/src/format/mdbook.md delete mode 100644 website/doc/es/src/format/summary.md delete mode 100644 website/doc/es/src/format/theme/README.md delete mode 100644 website/doc/es/src/format/theme/editor.md delete mode 100644 website/doc/es/src/format/theme/index-hbs.md delete mode 100644 website/doc/es/src/format/theme/syntax-highlighting.md delete mode 100644 website/doc/es/src/guide/README.md delete mode 100644 website/doc/es/src/guide/creating.md delete mode 100644 website/doc/es/src/guide/installation.md delete mode 100644 website/doc/es/src/guide/reading.md delete mode 100644 website/doc/es/src/misc/contributors.md delete mode 100644 website/doc/es/theme/book.js delete mode 100644 website/doc/es/theme/css/chrome.css delete mode 100644 website/doc/es/theme/css/general.css delete mode 100644 website/doc/es/theme/css/print.css delete mode 100644 website/doc/es/theme/css/variables.css delete mode 100644 website/doc/es/theme/highlight.css delete mode 100644 website/doc/es/theme/highlight.js delete mode 100644 website/doc/es/theme/index.hbs delete mode 100644 website/src/main.rs diff --git a/.gitignore b/.gitignore index a7ab8d0b..4ebc5a92 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,4 @@ **/target **/log/*.log* -**/update.sh Cargo.lock - -website/website -website/static/doc -.sitecopy workdir diff --git a/Cargo.toml b/Cargo.toml index 9d32cfd4..68596cc0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,8 @@ members = [ "pagetop-admin", "pagetop-user", "pagetop-node", - "pagetop-mdbook", ] exclude = [ - "website", "drust", ] diff --git a/README.md b/README.md index 0cc5c55b..454d166f 100644 --- a/README.md +++ b/README.md @@ -43,14 +43,6 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: * **[pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node)**, módulo para crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. -* **[pagetop-mdbook](https://github.com/manuelcillero/pagetop/tree/main/pagetop-mdbook)**, módulo - que permite integrar los archivos generados por [mdBook](https://rust-lang.github.io/mdBook/) en - un proyecto web creado con PageTop. - -* **[website](https://github.com/manuelcillero/pagetop/tree/main/website)**, es una aplicación - creada con PageTop para presentar el entorno a la comunidad y publicar la documentación de usuario - ([pagetop.cillero.es](https://pagetop.cillero.es)). - * **[drust](https://github.com/manuelcillero/pagetop/tree/main/drust)**, es una aplicación inspirada modestamente en [Drupal](https://www.drupal.org) que utiliza PageTop para crear un CMS (*Content Management System* o sistema de gestión de contenidos) para construir sitios web diff --git a/pagetop-mdbook/Cargo.toml b/pagetop-mdbook/Cargo.toml deleted file mode 100644 index 1bb097d3..00000000 --- a/pagetop-mdbook/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "pagetop-mdbook" -version = "0.0.2" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - Embeds the assets generated by mdBook into a PageTop application to create product or API \ - documentation, tutorials, course materials, or anything that requires a navigable presentation.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -pagetop = { path = "../pagetop", version = "0.0" } -static-files = "0.2.3" -maud = "0.24.0" - -[build-dependencies] -pagetop = { path = "../pagetop", version = "0.0" } diff --git a/pagetop-mdbook/README.md b/pagetop-mdbook/README.md deleted file mode 100644 index ce053f1d..00000000 --- a/pagetop-mdbook/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Módulo que permite integrar los archivos generados por [mdBook](https://rust-lang.github.io/mdBook/) -en un proyecto web creado con **PageTop**. - -[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo -basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side -Rendering*). - - -# 🚧 Advertencia - -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. - - -# 📜 Licencia - -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: - -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). - -* Licencia MIT - ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). diff --git a/pagetop-mdbook/build.rs b/pagetop-mdbook/build.rs deleted file mode 100644 index 355abfb1..00000000 --- a/pagetop-mdbook/build.rs +++ /dev/null @@ -1,5 +0,0 @@ -use pagetop::util::bundle_resources; - -fn main() -> std::io::Result<()> { - bundle_resources("./static", "mdbook", None) -} diff --git a/pagetop-mdbook/src/lib.rs b/pagetop-mdbook/src/lib.rs deleted file mode 100644 index eeb4d483..00000000 --- a/pagetop-mdbook/src/lib.rs +++ /dev/null @@ -1,198 +0,0 @@ -use pagetop::prelude::*; - -pub mod util; - -pub_const_handler!(MODULE_MDBOOK); - -include!(concat!(env!("OUT_DIR"), "/mdbook.rs")); - -pub struct MdBook; - -impl ModuleTrait for MdBook { - fn handler(&self) -> Handler { - MODULE_MDBOOK - } -} - -impl MdBook { - pub fn configure_service_for_common_resources(cfg: &mut app::web::ServiceConfig) { - configure_service_for_static_files!(cfg, "/mdbook/static", bundle_mdbook); - } - - pub fn configure_service_for_mdbook( - cfg: &mut app::web::ServiceConfig, - mdbook_path: &'static str, - mdbook_map: &'static HashMapResources, - ) { - let path = mdbook_path.trim_end_matches('/'); - cfg.service( - app::web::scope(path) - .route( - "{tail:.*html$}", - app::web::get().to(move |request: app::HttpRequest| { - mdbook_page(request, path, mdbook_map) - }), - ) - .route( - "{tail:.*$}", - app::web::get().to(move |request: app::HttpRequest| { - mdbook_resource(request, path, mdbook_map) - }), - ), - ); - } -} - -async fn mdbook_page( - request: app::HttpRequest, - mdbook_path: &'static str, - mdbook_map: &'static HashMapResources, -) -> ResultPage<Markup, FatalError> { - let path_len = mdbook_path.len() + 1; - if let Some(content) = mdbook_map.get(&request.path()[path_len..]) { - if let Ok(html) = std::str::from_utf8(content.data) { - let _lang = extract("Lang", html); - let title = match extract("Title", html) { - Some(title) => title, - _ => "Documentación", - }; - let _print = matches!(extract("Print", html), Some("enabled")); - let _mathjax = matches!(extract("MathJax", html), Some("supported")); - let beginning = { - let separator = "<!-- mdBook -->"; - match html.find(separator) { - Some(pos) => pos + separator.len(), - _ => 0, - } - }; - - Page::new() - .with_title(title) - .with_context(PageOp::AddMetadata("theme-color", "#ffffff")) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/css/variables.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/css/general.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/css/chrome.css", - ))) - .with_context(PageOp::AddStyleSheet( - StyleSheet::located("/mdbook/static/css/print.css") - .for_media(TargetMedia::Print), - )) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/FontAwesome/css/font-awesome.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/fonts/fonts.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/highlight.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/tomorrow-night.css", - ))) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( - "/mdbook/static/ayu-highlight.css", - ))) - .add_to( - "region-content", - Container::new() - .with_id("mdbook") - .with_component(Html::with(html! { (PreEscaped(&html[beginning..])) })), - ) - .render() - } else { - Err(FatalError::NotFound) - } - } else { - Err(FatalError::NotFound) - } -} - -async fn mdbook_resource( - request: app::HttpRequest, - mdbook_path: &'static str, - mdbook_map: &'static HashMapResources, -) -> app::HttpResponse { - let path_len = mdbook_path.len() + 1; - // From https://github.com/kilork/actix-web-static-files/blob/master/src/resource_files.rs, see - // functions respond_to(), any_match() and none_match(). - if let Some(file) = &mdbook_map.get(&request.path()[path_len..]) { - let etag = Some(app::http::header::EntityTag::new_strong(format!( - "{:x}:{:x}", - file.data.len(), - file.modified - ))); - - let precondition_failed = !any_match(etag.as_ref(), &request); - - let not_modified = !none_match(etag.as_ref(), &request); - - let mut resp = app::HttpResponse::build(app::http::StatusCode::OK); - resp.insert_header((app::http::header::CONTENT_TYPE, file.mime_type)); - - if let Some(etag) = etag { - resp.insert_header(app::http::header::ETag(etag)); - } - - if precondition_failed { - return FatalError::PreconditionFailed.error_response(); - } else if not_modified { - return FatalError::NotModified.error_response(); - } - - resp.body(file.data) - } else { - FatalError::NotFound.error_response() - } -} - -/// Returns true if `request` has no `If-Match` header or one which matches `etag`. -fn any_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { - match request.get_header::<app::http::header::IfMatch>() { - None | Some(app::http::header::IfMatch::Any) => true, - Some(app::http::header::IfMatch::Items(ref items)) => { - if let Some(some_etag) = etag { - for item in items { - if item.strong_eq(some_etag) { - return true; - } - } - } - false - } - } -} - -/// Returns true if `request` doesn't have an `If-None-Match` header matching `req`. -fn none_match(etag: Option<&app::http::header::EntityTag>, request: &app::HttpRequest) -> bool { - match request.get_header::<app::http::header::IfNoneMatch>() { - Some(app::http::header::IfNoneMatch::Any) => false, - Some(app::http::header::IfNoneMatch::Items(ref items)) => { - if let Some(some_etag) = etag { - for item in items { - if item.weak_eq(some_etag) { - return false; - } - } - } - true - } - None => true, - } -} - -fn extract(attr: &'static str, from: &'static str) -> Option<&'static str> { - let search = concat_string!("<!-- ", attr, ":"); - if let Some(ini) = from.find(&search) { - let ini = ini + search.len() + 1; - if let Some(end) = from[ini..].find("-->").map(|i| i + ini) { - let end = end - 1; - return Some(&from[ini..end]); - } - } - None -} diff --git a/pagetop-mdbook/src/util.rs b/pagetop-mdbook/src/util.rs deleted file mode 100644 index 00689eef..00000000 --- a/pagetop-mdbook/src/util.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::path::Path; - -pub fn except_mdbook_common_resources(p: &Path) -> bool { - match p.to_str() { - Some("ayu-highlight.css") => false, - Some("highlight.css") => false, - Some("tomorrow-niht.css") => false, - _ => { - if let Some(parent) = p.parent() { - match parent.to_str() { - Some("/css") => false, - Some("/FontAwesome") => false, - Some("/fonts") => false, - _ => true, - } - } else { - true - } - } - } -} diff --git a/pagetop-mdbook/static/FontAwesome/css/font-awesome.css b/pagetop-mdbook/static/FontAwesome/css/font-awesome.css deleted file mode 100644 index 540440ce..00000000 --- a/pagetop-mdbook/static/FontAwesome/css/font-awesome.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/pagetop-mdbook/static/FontAwesome/fonts/FontAwesome.ttf b/pagetop-mdbook/static/FontAwesome/fonts/FontAwesome.ttf deleted file mode 100644 index 35acda2fa1196aad98c2adf4378a7611dd713aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165548 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 diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.eot b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca953f93e35eab4108bd414bc02ddcf3928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165742 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 diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e..00000000 --- a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg> -<metadata> -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. -</metadata> -<defs> -<font id="FontAwesome" horiz-adv-x="1536" > - <font-face - font-family="FontAwesome" - font-weight="400" - font-stretch="normal" - units-per-em="1792" - panose-1="0 0 0 0 0 0 0 0 0 0" - ascent="1536" - descent="-256" - bbox="-1.02083 -256.962 2304.6 1537.02" - underline-thickness="0" - underline-position="0" - unicode-range="U+0020-F500" - /> -<missing-glyph horiz-adv-x="896" -d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> - <glyph glyph-name=".notdef" horiz-adv-x="896" -d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" /> - <glyph glyph-name=".null" horiz-adv-x="0" - /> - <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" - /> - <glyph glyph-name="space" unicode=" " horiz-adv-x="448" - /> - <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792" - /> - <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792" - /> - <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792" - /> - <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792" - /> - <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792" - /> - <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792" - /> - <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792" - /> - <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792" - /> - <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792" - /> - <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792" -d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> - <glyph glyph-name="music" unicode="&#xf001;" -d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 -t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> - <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664" -d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 -t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> - <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792" -d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 -t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z -M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> - <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792" -d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 -q-18 -18 -44 -18z" /> - <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664" -d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 -l502 -73q56 -9 56 -46z" /> - <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664" -d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 -l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> - <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" -d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5 -t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> - <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" -d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 -q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 -t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 -q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 -t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> - <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664" -d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 -h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> - <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792" -d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 -q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 -h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 -q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> - <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792" -d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 -q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 -h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> - <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792" -d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> - <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408" -d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 -t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> - <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664" -d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 -q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 -t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> - <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664" -d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z -M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z -" /> - <glyph glyph-name="off" unicode="&#xf011;" -d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 -t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> - <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792" -d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 -v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> - <glyph glyph-name="cog" unicode="&#xf013;" -d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 -q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 -l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 -q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> - <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408" -d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 -q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 -q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> - <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664" -d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 -l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> - <glyph glyph-name="file_alt" unicode="&#xf016;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -" /> - <glyph glyph-name="time" unicode="&#xf017;" -d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920" -d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 -q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> - <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664" -d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 -q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> - <glyph glyph-name="download" unicode="&#xf01a;" -d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 -t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="upload" unicode="&#xf01b;" -d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 -t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="inbox" unicode="&#xf01c;" -d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 -q25 -61 25 -123z" /> - <glyph glyph-name="play_circle" unicode="&#xf01d;" -d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="repeat" unicode="&#xf01e;" -d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9 -l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> - <glyph glyph-name="refresh" unicode="&#xf021;" -d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 -q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 -q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> - <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792" -d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z -M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 -t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 -t47 -113z" /> - <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152" -d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> - <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792" -d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 -t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> - <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664" -d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 -t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 -t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> - <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768" -d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> - <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152" -d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 -t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> - <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664" -d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36 -t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 -t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 -t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> - <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408" -d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z -M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> - <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792" -d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z -M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> - <glyph glyph-name="tag" unicode="&#xf02b;" -d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 -l715 -714q37 -39 37 -91z" /> - <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920" -d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 -l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> - <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664" -d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 -q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 -q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 -t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> - <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280" -d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> - <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664" -d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 -v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> - <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920" -d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 -q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664" -d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 -q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 -q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> - <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408" -d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 -q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 -t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 -t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> - <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024" -d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 -q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> - <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792" -d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 -t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 -q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 -q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> - <glyph glyph-name="text_width" unicode="&#xf035;" -d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 -t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 -q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 -t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 -t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> - <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792" -d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 -t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> - <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792" -d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 -h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> - <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792" -d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 -t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> - <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792" -d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 -t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> - <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792" -d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 -t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 -q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 -t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 -q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> - <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792" -d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 -t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 -q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> - <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792" -d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 -t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 -q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> - <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792" -d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 -q39 -17 39 -59z" /> - <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920" -d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 -q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> - <glyph glyph-name="pencil" unicode="&#xf040;" -d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 -q53 0 91 -38l235 -234q37 -39 37 -91z" /> - <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024" -d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> - <glyph glyph-name="adjust" unicode="&#xf042;" -d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024" -d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 -q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> - <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792" -d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 -q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 -l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> - <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664" -d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 -q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 -t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> - <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664" -d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 -q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 -q24 -24 24 -57t-24 -57z" /> - <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792" -d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 -t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> - <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024" -d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" /> - <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792" -d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710 -q19 19 32 13t13 -32v-710q4 10 13 19z" /> - <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664" -d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" /> - <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408" -d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> - <glyph glyph-name="pause" unicode="&#xf04c;" -d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> - <glyph glyph-name="stop" unicode="&#xf04d;" -d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> - <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664" -d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> - <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792" -d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710 -q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" /> - <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024" -d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" /> - <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538" -d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> - <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280" -d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> - <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280" -d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> - <glyph glyph-name="plus_sign" unicode="&#xf055;" -d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 -t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="minus_sign" unicode="&#xf056;" -d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 -t103 -385.5z" /> - <glyph glyph-name="remove_sign" unicode="&#xf057;" -d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 -q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="ok_sign" unicode="&#xf058;" -d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 -t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="question_sign" unicode="&#xf059;" -d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 -q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 -t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="info_sign" unicode="&#xf05a;" -d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 -t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="screenshot" unicode="&#xf05b;" -d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 -q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 -q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> - <glyph glyph-name="remove_circle" unicode="&#xf05c;" -d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 -l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 -t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="ok_circle" unicode="&#xf05d;" -d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 -t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="ban_circle" unicode="&#xf05e;" -d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 -t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> - <glyph glyph-name="arrow_left" unicode="&#xf060;" -d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 -t32.5 -90.5z" /> - <glyph glyph-name="arrow_right" unicode="&#xf061;" -d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> - <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664" -d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 -q37 -39 37 -91z" /> - <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664" -d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> - <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792" -d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 -t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> - <glyph glyph-name="resize_full" unicode="&#xf065;" -d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 -q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> - <glyph glyph-name="resize_small" unicode="&#xf066;" -d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 -t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> - <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408" -d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> - <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408" -d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> - <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664" -d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 -q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> - <glyph glyph-name="exclamation_sign" unicode="&#xf06a;" -d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 -q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> - <glyph glyph-name="gift" unicode="&#xf06b;" -d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 -q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 -t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> - <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792" -d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 -q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 -t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> - <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408" -d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 -q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> - <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792" -d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 -t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> - <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792" -d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 -q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 -q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z -" /> - <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792" -d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 -q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> - <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408" -d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 -q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> - <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664" -d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z -M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 -q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 -h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> - <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792" -d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 -t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 -v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 -t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> - <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792" -d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 -q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> - <glyph glyph-name="magnet" unicode="&#xf076;" -d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 -q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> - <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792" -d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> - <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792" -d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> - <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920" -d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21 -zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z -" /> - <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664" -d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 -t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" /> - <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664" -d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> - <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920" -d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 -t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> - <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768" -d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> - <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792" -d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> - <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048" -d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> - <glyph glyph-name="twitter_sign" unicode="&#xf081;" -d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 -q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 -t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="facebook_sign" unicode="&#xf082;" -d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 -q0 119 84.5 203.5t203.5 84.5h960z" /> - <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792" -d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 -t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 -q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> - <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792" -d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 -l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 -t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> - <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920" -d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 -t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 -l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 -l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 -q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 -t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 -q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 -q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> - <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792" -d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 -q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 -q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> - <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;" -d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 -t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 -q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 -q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> - <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;" -d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 -t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z -M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 -h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" /> - <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896" -d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> - <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792" -d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 -q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 -q224 0 351 -124t127 -344z" /> - <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664" -d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 -q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> - <glyph glyph-name="linkedin_sign" unicode="&#xf08c;" -d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 -q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152" -d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 -t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> - <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792" -d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 -q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> - <glyph glyph-name="signin" unicode="&#xf090;" -d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 -q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664" -d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 -t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 -q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> - <glyph glyph-name="github_sign" unicode="&#xf092;" -d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4 -q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4 -t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16 -q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960 -q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664" -d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 -t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> - <glyph glyph-name="lemon" unicode="&#xf094;" -d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 -q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 -q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 -q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" /> - <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408" -d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186 -q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14 -t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> - <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408" -d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 -q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280" -d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 -q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> - <glyph glyph-name="phone_sign" unicode="&#xf098;" -d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5 -t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5 -t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z -" /> - <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664" -d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 -q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> - <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024" -d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> - <glyph glyph-name="github" unicode="&#xf09b;" -d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24 -q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5 -t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12 -q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z -M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" /> - <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664" -d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 -t316.5 -131.5t131.5 -316.5z" /> - <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920" -d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 -q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> - <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408" -d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 -t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 -q187 -186 294 -425.5t120 -501.5z" /> - <glyph glyph-name="hdd" unicode="&#xf0a0;" -d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 -h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 -l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> - <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792" -d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 -t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> - <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792" -d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z -M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 -t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> - <glyph glyph-name="certificate" unicode="&#xf0a3;" -d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 -l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 -l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> - <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792" -d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 -q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 -q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 -t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> - <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792" -d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5 -t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z -M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67 -q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> - <glyph glyph-name="hand_up" unicode="&#xf0a6;" -d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 -q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 -t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 -q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> - <glyph glyph-name="hand_down" unicode="&#xf0a7;" -d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 -t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 -q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 -q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> - <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;" -d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;" -d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;" -d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;" -d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="globe" unicode="&#xf0ac;" -d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 -q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 -q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 -q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 -t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 -q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 -q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 -t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 -t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 -q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 -q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 -q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 -t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 -q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 -q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> - <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664" -d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 -t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> - <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792" -d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 -t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> - <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408" -d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> - <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792" -d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 -t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> - <glyph glyph-name="fullscreen" unicode="&#xf0b2;" -d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 -l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z -" /> - <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920" -d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 -t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 -t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 -t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> - <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664" -d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 -l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 -t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 -q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> - <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920" -d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z -" /> - <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664" -d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> - <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792" -d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 -q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 -q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 -q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 -q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> - <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792" -d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 -h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> - <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408" -d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 -l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 -z" /> - <glyph glyph-name="save" unicode="&#xf0c7;" -d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 -h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> - <glyph glyph-name="sign_blank" unicode="&#xf0c8;" -d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="reorder" unicode="&#xf0c9;" -d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 -t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> - <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792" -d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 -t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z -M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> - <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792" -d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 -q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 -t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216 -q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> - <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792" -d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 -l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 -l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> - <glyph glyph-name="underline" unicode="&#xf0cd;" -d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 -q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 -q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 -q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> - <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664" -d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 -v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 -q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 -q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 -z" /> - <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664" -d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 -l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> - <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792" -d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 -t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 -t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> - <glyph glyph-name="pinterest" unicode="&#xf0d2;" -d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 -q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 -q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;" -d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 -t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 -t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> - <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;" -d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585 -h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304" -d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62 -q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" /> - <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920" -d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 -v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> - <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024" -d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> - <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024" -d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> - <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640" -d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> - <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640" -d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> - <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664" -d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> - <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024" -d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> - <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024" -d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> - <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024" -d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> - <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792" -d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 -q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> - <glyph glyph-name="linkedin" unicode="&#xf0e1;" -d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 -q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> - <glyph glyph-name="undo" unicode="&#xf0e2;" -d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 -t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> - <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792" -d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 -t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 -q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 -q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> - <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792" -d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 -t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 -t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 -q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792" -d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 -q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 -t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> - <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792" -d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 -t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 -t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 -q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> - <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896" -d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> - <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792" -d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 -q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 -z" /> - <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664" -d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 -q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 -q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> - <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792" -d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 -h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> - <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024" -d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 -q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 -q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 -t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> - <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792" -d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 -q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> - <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920" -d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 -q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> - <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920" -d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 -q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> - <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408" -d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 -t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 -t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 -t271.5 -112.5t112.5 -271.5z" /> - <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408" -d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 -t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 -t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> - <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792" -d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 -t66 -158z" /> - <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792" -d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 -t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> - <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920" -d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 -t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> - <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408" -d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 -t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> - <glyph glyph-name="file_text_alt" unicode="&#xf0f6;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 -q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> - <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408" -d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> - <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408" -d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z -M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 -t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 -v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> - <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920" -d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 -t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 -q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> - <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792" -d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 -q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> - <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920" -d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 -q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" /> - <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664" -d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> - <glyph glyph-name="h_sign" unicode="&#xf0fd;" -d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 -q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="f0fe" unicode="&#xf0fe;" -d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 -q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024" -d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 -t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> - <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024" -d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 -l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> - <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152" -d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 -q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> - <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152" -d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 -t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> - <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640" -d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> - <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640" -d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> - <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152" -d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> - <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152" -d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> - <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920" -d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 -t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> - <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920" -d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z -M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> - <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152" -d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 -q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> - <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768" -d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 -q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> - <glyph glyph-name="circle_blank" unicode="&#xf10c;" -d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 -t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664" -d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z -M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> - <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664" -d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 -v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> - <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792" -d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 -t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z -M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 -q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" /> - <glyph glyph-name="circle" unicode="&#xf111;" -d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792" -d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 -l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> - <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664" -d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 -q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 -t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 -q0 -87 -27 -168q136 -160 136 -398z" /> - <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664" -d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 -q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> - <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920" -d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 -v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z -" /> - <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792" - /> - <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792" - /> - <glyph glyph-name="smile" unicode="&#xf118;" -d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 -t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 -t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="frown" unicode="&#xf119;" -d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 -t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 -t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="meh" unicode="&#xf11a;" -d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 -t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920" -d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 -t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 -t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> - <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920" -d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 -h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 -h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 -q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 -h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> - <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792" -d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 -h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 -q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> - <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792" -d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 -q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 -q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 -q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> - <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664" -d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 -t9 -23z" /> - <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920" -d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 -l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> - <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792" -d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 -q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> - <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664" -d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 -l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> - <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408" -d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> - <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664" -d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 -v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> - <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024" -d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 -q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 -q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> - <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664" -d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 -q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 -l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 -t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> - <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024" -d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 -t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> - <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640" -d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 -q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> - <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640" -d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> - <glyph glyph-name="superscript" unicode="&#xf12b;" -d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z -M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5 -t-65.5 -51.5t-30.5 -63h232v80h126z" /> - <glyph glyph-name="subscript" unicode="&#xf12c;" -d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z -M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73 -h232v80h126z" /> - <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920" -d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> - <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664" -d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 -t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 -q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 -q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> - <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152" -d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 -t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> - <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408" -d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 -q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 -t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> - <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280" -d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 -t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> - <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664" -d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 -q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> - <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408" -d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 -q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 -q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> - <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664" -d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 -q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> - <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792" -d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> - <glyph glyph-name="chevron_sign_left" unicode="&#xf137;" -d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 -t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="chevron_sign_right" unicode="&#xf138;" -d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 -t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="chevron_sign_up" unicode="&#xf139;" -d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 -t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;" -d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 -t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408" -d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> - <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792" -d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> - <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792" -d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 -q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 -t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> - <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152" -d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 -v-320h736z" /> - <glyph glyph-name="bullseye" unicode="&#xf140;" -d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 -t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 -q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408" -d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 -q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> - <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384" -d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 -q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> - <glyph glyph-name="_303" unicode="&#xf143;" -d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128 -q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960 -q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="play_sign" unicode="&#xf144;" -d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 -q16 -8 32 -8q17 0 32 9z" /> - <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792" -d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 -t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> - <glyph glyph-name="minus_sign_alt" unicode="&#xf146;" -d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 -t84.5 -203.5z" /> - <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408" -d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 -t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024" -d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> - <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024" -d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> - <glyph glyph-name="check_sign" unicode="&#xf14a;" -d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 -t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="edit_sign" unicode="&#xf14b;" -d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 -v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_312" unicode="&#xf14c;" -d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 -q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="share_sign" unicode="&#xf14d;" -d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 -t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="compass" unicode="&#xf14e;" -d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 -t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="collapse" unicode="&#xf150;" -d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 -v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="collapse_top" unicode="&#xf151;" -d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 -q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_317" unicode="&#xf152;" -d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 -t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024" -d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 -t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 -l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> - <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024" -d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 -q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> - <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024" -d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 -t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 -t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 -t53 -63.5t31.5 -76.5t13 -94z" /> - <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898" -d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 -q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> - <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027" -d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 -l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> - <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280" -d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 -q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> - <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792" -d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 -t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 -q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> - <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280" -d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 -l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 -t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> - <glyph glyph-name="file" unicode="&#xf15b;" -d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> - <glyph glyph-name="file_text" unicode="&#xf15c;" -d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 -q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> - <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664" -d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 -v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 -l230 -662h70z" /> - <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664" -d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 -v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 -v119h121z" /> - <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792" -d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 -q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 -q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> - <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792" -d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 -q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 -q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> - <glyph glyph-name="sort_by_order" unicode="&#xf162;" -d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 -zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 -t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> - <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;" -d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 -t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 -q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> - <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664" -d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 -q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 -t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> - <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664" -d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 -t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 -t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> - <glyph glyph-name="youtube_sign" unicode="&#xf166;" -d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 -q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 -q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 -q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38 -q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5 -h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="youtube" unicode="&#xf167;" -d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 -q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 -q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 -q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51 -q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> - <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408" -d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 -q25 45 64 45h241q22 0 31 -15z" /> - <glyph glyph-name="xing_sign" unicode="&#xf169;" -d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 -l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792" -d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5 -l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136 -q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" /> - <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792" -d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> - <glyph glyph-name="stackexchange" unicode="&#xf16c;" -d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" /> - <glyph glyph-name="instagram" unicode="&#xf16d;" -d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270 -q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5 -t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317 -q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" /> - <glyph glyph-name="flickr" unicode="&#xf16e;" -d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 -t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> - <glyph glyph-name="adn" unicode="&#xf170;" -d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408" -d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 -t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 -t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 -t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> - <glyph glyph-name="bitbucket_sign" unicode="&#xf172;" -d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 -t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z -M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 -v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024" -d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 -q78 2 134 29z" /> - <glyph glyph-name="tumblr_sign" unicode="&#xf174;" -d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z -M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768" -d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> - <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768" -d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> - <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792" -d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> - <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792" -d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> - <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408" -d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 -q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> - <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664" -d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> - <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408" -d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 -t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 -h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> - <glyph glyph-name="linux" unicode="&#xf17c;" -d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z -M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 -q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 -q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 -t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 -q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 -q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 -q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 -q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4 -t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5 -t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43 -q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49 -t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54 -q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5 -t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5 -t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> - <glyph glyph-name="dribble" unicode="&#xf17d;" -d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 -t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 -q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 -t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="skype" unicode="&#xf17e;" -d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 -t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 -q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 -q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> - <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280" -d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z -M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 -l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> - <glyph glyph-name="trello" unicode="&#xf181;" -d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 -q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> - <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280" -d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 -q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> - <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024" -d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z -M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> - <glyph glyph-name="gittip" unicode="&#xf184;" -d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 -t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792" -d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 -l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 -q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> - <glyph glyph-name="_366" unicode="&#xf186;" -d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 -t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> - <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792" -d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 -q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> - <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664" -d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 -q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 -t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> - <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920" -d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 -t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 -q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24 -q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 -q39 5 64 -2.5t31 -16.5z" /> - <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792" -d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 -q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 -q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 -q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z -M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> - <glyph glyph-name="renren" unicode="&#xf18b;" -d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 -q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> - <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408" -d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 -t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 -t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 -t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> - <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280" -d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z -" /> - <glyph glyph-name="_374" unicode="&#xf18e;" -d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 -t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;" -d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 -t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_376" unicode="&#xf191;" -d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z -M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="dot_circle_alt" unicode="&#xf192;" -d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 -t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664" -d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 -q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> - <glyph glyph-name="vimeo_square" unicode="&#xf194;" -d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 -q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152" -d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 -q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> - <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408" -d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 -q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176" -d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 -t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 -q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> - <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664" -d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 -q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 -t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> - <glyph glyph-name="_384" unicode="&#xf199;" -d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 -q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 -t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> - <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792" -d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 -t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 -t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 -t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 -t273 -182.5t331.5 -68z" /> - <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792" -d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> - <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048" -d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 -q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> - <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304" -d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 -q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> - <glyph glyph-name="_389" unicode="&#xf19e;" -d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 -q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> - <glyph glyph-name="uniF1A0" unicode="&#xf1a0;" -d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5 -t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" /> - <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792" -d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 -t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 -q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 -t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="_392" unicode="&#xf1a2;" -d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 -q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 -q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 -q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_393" unicode="&#xf1a3;" -d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 -v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 -t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920" -d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 -v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> - <glyph glyph-name="_395" unicode="&#xf1a5;" -d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 -t84.5 -203.5z" /> - <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048" -d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 -v-369h123z" /> - <glyph glyph-name="_397" unicode="&#xf1a7;" -d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 -v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 -q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038" -d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 -q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 -q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 -q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 -t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 -q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 -t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 -t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> - <glyph glyph-name="_399" unicode="&#xf1a9;" -d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 -q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 -q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 -t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 -q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> - <glyph glyph-name="_400" unicode="&#xf1aa;" -d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z -M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 -t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 -q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 -t135.5 51q85 0 145 -60.5t60 -145.5z" /> - <glyph glyph-name="f1ab" unicode="&#xf1ab;" -d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 -q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 -q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z -M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 -q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 -q20 0 20 -21v-418z" /> - <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792" -d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 -l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 -t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 -q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 -q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> - <glyph glyph-name="_403" unicode="&#xf1ad;" -d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 -t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 -q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 -q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 -t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 -q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 -q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 -t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> - <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280" -d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152 -q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> - <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664" -d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 -q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 -q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 -t100.5 134t141.5 55.5z" /> - <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768" -d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> - <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792" -d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z -" /> - <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304" -d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 -t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 -v-400l434 -186q36 -16 57 -48t21 -70z" /> - <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048" -d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 -q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 -q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> - <glyph glyph-name="_410" unicode="&#xf1b5;" -d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 -t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 -t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> - <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792" -d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 -q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 -q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> - <glyph glyph-name="_412" unicode="&#xf1b7;" -d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 -q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 -q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z -" /> - <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792" -d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 -l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 -t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 -q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> - <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048" -d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 -q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 -l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> - <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048" -d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 -t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z -M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> - <glyph glyph-name="_416" unicode="&#xf1bb;" -d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 -q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> - <glyph glyph-name="_417" unicode="&#xf1bc;" -d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 -q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 -q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024" -d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" /> - <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304" -d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 -q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 -q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 -l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 -q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236 -q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786 -q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> - <glyph glyph-name="uniF1C0" unicode="&#xf1c0;" -d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 -t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 -t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> - <glyph glyph-name="uniF1C1" unicode="&#xf1c1;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 -q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 -q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> - <glyph glyph-name="_422" unicode="&#xf1c2;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5 -t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" /> - <glyph glyph-name="_423" unicode="&#xf1c3;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 -h-290v-107h68l189 -272l-194 -283h-68z" /> - <glyph glyph-name="_424" unicode="&#xf1c4;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> - <glyph glyph-name="_425" unicode="&#xf1c5;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> - <glyph glyph-name="_426" unicode="&#xf1c6;" -d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 -v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 -q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> - <glyph glyph-name="_427" unicode="&#xf1c7;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 -q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> - <glyph glyph-name="_428" unicode="&#xf1c8;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> - <glyph glyph-name="_429" unicode="&#xf1c9;" -d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z -M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 -l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> - <glyph glyph-name="_430" unicode="&#xf1ca;" -d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 -q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> - <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792" -d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 -q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> - <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048" -d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 -q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 -t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" /> - <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792" -d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 -q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 -t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> - <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792" -d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5 -t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" /> - <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792" -d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 -t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 -t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 -q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> - <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792" -d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 -l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 -q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 -q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 -t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 -t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="uniF1D2" unicode="&#xf1d2;" -d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 -q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 -q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 -q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792" -d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 -q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 -q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 -v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> - <glyph glyph-name="_439" unicode="&#xf1d4;" -d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280" -d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 -t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 -t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> - <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792" -d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 -q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 -t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 -t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> - <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048" -d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 -q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 -q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 -q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> - <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792" -d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> - <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792" -d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 -l863 639l-478 -797z" /> - <glyph glyph-name="_445" unicode="&#xf1da;" -d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 -t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 -t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> - <glyph glyph-name="_446" unicode="&#xf1db;" -d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 -t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792" -d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 -t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 -t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 -q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 -q0 -26 -12 -48t-36 -22z" /> - <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280" -d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 -q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> - <glyph glyph-name="_449" unicode="&#xf1de;" -d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 -q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> - <glyph glyph-name="uniF1E0" unicode="&#xf1e0;" -d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 -t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> - <glyph glyph-name="_451" unicode="&#xf1e1;" -d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 -t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792" -d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 -t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 -q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 -t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> - <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792" -d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 -l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> - <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792" -d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 -v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 -q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 -zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 -t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> - <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792" -d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z -M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> - <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792" -d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234 -l401 400q38 37 91 37t90 -37z" /> - <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792" -d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 -t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z -M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7 -t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> - <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792" -d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> - <glyph glyph-name="_459" unicode="&#xf1e9;" -d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 -q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 -t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 -q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> - <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048" -d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 -t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> - <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048" -d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 -q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z -M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> - <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792" -d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 -t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 -t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 -t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z -M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 -h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_463" unicode="&#xf1ed;" -d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 -q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 -q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" /> - <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792" -d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640 -q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" /> - <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304" -d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 -q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 -q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304" -d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249 -q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z -M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32 -h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4 -q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75 -q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14 -q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22 -q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12 -q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122 -h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5 -t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304" -d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 -q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 -v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 -q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 -t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> - <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304" -d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z -M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 -l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 -v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 -q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 -q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 -t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 -h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 -t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> - <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304" -d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 -t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 -q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 -t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 -l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 -q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304" -d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 -q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 -q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 -q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 -q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048" -d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 -l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 -l418 363q10 8 23.5 7t21.5 -11z" /> - <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048" -d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 -q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 -q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> - <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408" -d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 -q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 -q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> - <glyph glyph-name="_474" unicode="&#xf1f9;" -d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 -t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 -t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_475" unicode="&#xf1fa;" -d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 -q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 -t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 -t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> - <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792" -d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 -t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> - <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792" -d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 -t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> - <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792" -d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5 -t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38 -t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448 -h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5 -q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> - <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048" -d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> - <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792" -d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048" -d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 -t9 -23z" /> - <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792" -d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 -q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 -t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 -q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> - <glyph glyph-name="_483" unicode="&#xf203;" -d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 -q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 -q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 -q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048" -d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 -t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 -t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> - <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048" -d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 -t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> - <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304" -d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 -q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 -q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 -q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> - <glyph glyph-name="_487" unicode="&#xf207;" -d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 -h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 -t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> - <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048" -d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 -q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 -q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> - <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280" -d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 -t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 -t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 -q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 -q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 -t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> - <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048" -d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 -q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 -t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 -t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> - <glyph glyph-name="_491" unicode="&#xf20b;" -d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 -t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> - <glyph glyph-name="_492" unicode="&#xf20c;" -d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 -q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 -q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> - <glyph glyph-name="_493" unicode="&#xf20d;" -d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" /> - <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048" -d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 -q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 -q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438 -h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66 -l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946 -l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82 -zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" /> - <glyph glyph-name="f210" unicode="&#xf210;" -d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" /> - <glyph glyph-name="_496" unicode="&#xf211;" -d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 -q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" /> - <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048" -d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 -q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 -q209 0 374 -102q172 107 374 102z" /> - <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048" -d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 -q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 -q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" /> - <glyph glyph-name="_499" unicode="&#xf214;" -d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 -l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 -v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z -M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 -v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 -h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 -t-43 -34t-16.5 -53.5z" /> - <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048" -d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 -q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" /> - <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048" -d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 -t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 -t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 -q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" /> - <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664" -d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 -t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 -q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> - <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664" -d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 -t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 -q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> - <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048" -d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 -l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" /> - <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048" -d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 -q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 -q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 -v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 -q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" /> - <glyph glyph-name="_506" unicode="&#xf21b;" -d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 -t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 -q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 -t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" /> - <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304" -d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 -t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 -l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 -t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" /> - <glyph glyph-name="_508" unicode="&#xf21d;" -d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 -q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 -q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 -t158.5 -65.5t65.5 -158.5z" /> - <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792" -d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 -q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 -t127 -344z" /> - <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280" -d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 -q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" /> - <glyph glyph-name="_511" unicode="&#xf222;" -d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 -q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280" -d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 -t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 -t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_513" unicode="&#xf224;" -d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 -q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 -t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792" -d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 -q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 -t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 -t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792" -d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 -t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 -q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 -q0 -226 -154 -391q103 -57 218 -57z" /> - <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920" -d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 -q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 -t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 -q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" /> - <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048" -d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 -t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 -t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 -t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" /> - <glyph glyph-name="_518" unicode="&#xf229;" -d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 -t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 -t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280" -d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 -t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 -t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048" -d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 -t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 -t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280" -d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 -t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> - <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280" -d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 -t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" /> - <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792" - /> - <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792" - /> - <glyph glyph-name="_525" unicode="&#xf230;" -d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" /> - <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280" -d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 -l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 -q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" /> - <glyph glyph-name="_527" unicode="&#xf232;" -d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 -t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 -l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" /> - <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792" -d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 -q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" /> - <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048" -d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 -t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 -t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" /> - <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048" -d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 -q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 -t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" /> - <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048" -d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 -q-26 0 -45 -19t-19 -45v-384h1152z" /> - <glyph glyph-name="_532" unicode="&#xf237;" -d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" /> - <glyph glyph-name="_533" unicode="&#xf238;" -d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 -t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" /> - <glyph glyph-name="_534" unicode="&#xf239;" -d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 -t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" /> - <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792" -d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 -q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" /> - <glyph glyph-name="_536" unicode="&#xf23b;" -d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" /> - <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296" -d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 -q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 -q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 -q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 -q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 -q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 -q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8 -t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 -q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 -q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z -M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86 -t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 -q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4 -l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130 -t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 -q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 -q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" /> - <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304" -d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 -t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 -t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" /> - <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792" -d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 -t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 -t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 -q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 -q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" /> - <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304" -d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 -v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" /> - <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304" -d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 -h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> - <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304" -d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 -h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> - <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304" -d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 -h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> - <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304" -d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 -v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" /> - <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280" -d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" /> - <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024" -d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" /> - <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048" -d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 -h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" /> - <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304" -d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 -v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" /> - <glyph glyph-name="_549" unicode="&#xf249;" -d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" /> - <glyph glyph-name="_550" unicode="&#xf24a;" -d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 -z" /> - <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304" -d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 -t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 -t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 -t90 38h2048q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304" -d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 -t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z -M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792" -d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 -zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" /> - <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304" -d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 -q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 -t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 -t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" /> - <glyph glyph-name="_555" unicode="&#xf250;" -d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 -t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 -t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> - <glyph glyph-name="_556" unicode="&#xf251;" -d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 -t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" /> - <glyph glyph-name="_557" unicode="&#xf252;" -d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 -t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" /> - <glyph glyph-name="_558" unicode="&#xf253;" -d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 -t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 -h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" /> - <glyph glyph-name="_559" unicode="&#xf254;" -d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 -t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 -h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" /> - <glyph glyph-name="_560" unicode="&#xf255;" -d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 -q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 -t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 -q72 69 174 69z" /> - <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792" -d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 -t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 -h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" /> - <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792" -d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 -q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 -t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 -t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 -q0 -42 -23 -78t-61 -53l-310 -141h91z" /> - <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048" -d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 -q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 -q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" /> - <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048" -d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79 -t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24 -q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26 -l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" /> - <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792" -d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 -q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 -v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 -v-384h32z" /> - <glyph glyph-name="_566" unicode="&#xf25b;" -d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 -v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 -q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 -q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 -q0 -53 37.5 -90.5t90.5 -37.5h668z" /> - <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973" -d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 -t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 -q13 0 22 -8.5t10 -20.5z" /> - <glyph glyph-name="_568" unicode="&#xf25d;" horiz-adv-x="1792" -d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 -t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 -q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="_569" unicode="&#xf25e;" horiz-adv-x="1792" -d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 -q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5 -t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 -q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 -t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" /> - <glyph glyph-name="f260" unicode="&#xf260;" horiz-adv-x="2048" -d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" /> - <glyph glyph-name="f261" unicode="&#xf261;" horiz-adv-x="1792" -d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 -t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="_572" unicode="&#xf262;" horiz-adv-x="2304" -d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 -t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 -t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 -t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 -t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 -q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" /> - <glyph glyph-name="f263" unicode="&#xf263;" horiz-adv-x="1280" -d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 -t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 -q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" /> - <glyph glyph-name="_574" unicode="&#xf264;" -d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 -q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 -zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="_575" unicode="&#xf265;" horiz-adv-x="1720" -d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 -l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" /> - <glyph glyph-name="_576" unicode="&#xf266;" horiz-adv-x="2304" -d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 -q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 -l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" /> - <glyph glyph-name="_577" unicode="&#xf267;" horiz-adv-x="1792" -d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 -q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 -t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 -t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 -t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 -t191 -286t71 -348z" /> - <glyph glyph-name="_578" unicode="&#xf268;" horiz-adv-x="1792" -d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 -q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" /> - <glyph glyph-name="_579" unicode="&#xf269;" horiz-adv-x="1792" -d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 -q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 -q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" /> - <glyph glyph-name="_580" unicode="&#xf26a;" horiz-adv-x="1792" -d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339 -q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z -" /> - <glyph glyph-name="_581" unicode="&#xf26b;" horiz-adv-x="1792" -d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606 -q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z -M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" /> - <glyph glyph-name="_582" unicode="&#xf26c;" horiz-adv-x="2048" -d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 -v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> - <glyph glyph-name="_583" unicode="&#xf26d;" horiz-adv-x="1792" -d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 -h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 -q-68 175 -180 287z" /> - <glyph glyph-name="_584" unicode="&#xf26e;" -d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6 -q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13 -q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249 -q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183 -q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46 -t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" /> - <glyph glyph-name="_585" unicode="&#xf270;" horiz-adv-x="1792" -d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z -M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 -q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 -t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 -q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" /> - <glyph glyph-name="_586" unicode="&#xf271;" horiz-adv-x="1792" -d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 -h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 -v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" /> - <glyph glyph-name="_587" unicode="&#xf272;" horiz-adv-x="1792" -d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 -t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 -t47 -113v-96h128q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_588" unicode="&#xf273;" horiz-adv-x="1792" -d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z -M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 -q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_589" unicode="&#xf274;" horiz-adv-x="1792" -d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 -t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 -t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> - <glyph glyph-name="_590" unicode="&#xf275;" horiz-adv-x="1792" -d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" /> - <glyph glyph-name="_591" unicode="&#xf276;" horiz-adv-x="1024" -d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 -q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" /> - <glyph glyph-name="_592" unicode="&#xf277;" horiz-adv-x="1792" -d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 -q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" /> - <glyph glyph-name="_593" unicode="&#xf278;" horiz-adv-x="2048" -d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 -v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" /> - <glyph glyph-name="_594" unicode="&#xf279;" horiz-adv-x="1792" -d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 -q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" /> - <glyph glyph-name="_595" unicode="&#xf27a;" horiz-adv-x="1792" -d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 -t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 -t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> - <glyph glyph-name="_596" unicode="&#xf27b;" horiz-adv-x="1792" -d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 -t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 -t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 -t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" /> - <glyph glyph-name="_597" unicode="&#xf27c;" horiz-adv-x="1024" -d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" /> - <glyph glyph-name="_598" unicode="&#xf27d;" horiz-adv-x="1792" -d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 -q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" /> - <glyph glyph-name="f27e" unicode="&#xf27e;" -d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" /> - <glyph glyph-name="uniF280" unicode="&#xf280;" -d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 -h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 -l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" /> - <glyph glyph-name="uniF281" unicode="&#xf281;" horiz-adv-x="1792" -d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5 -l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44 -t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106 -q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" /> - <glyph glyph-name="_602" unicode="&#xf282;" horiz-adv-x="1792" -d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53 -q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" /> - <glyph glyph-name="_603" unicode="&#xf283;" horiz-adv-x="2304" -d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" /> - <glyph glyph-name="_604" unicode="&#xf284;" horiz-adv-x="1792" -d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308 -t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20 -t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" /> - <glyph glyph-name="uniF285" unicode="&#xf285;" horiz-adv-x="1792" -d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" /> - <glyph glyph-name="uniF286" unicode="&#xf286;" horiz-adv-x="1792" -d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96 -q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5 -q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96 -q16 0 16 -16z" /> - <glyph glyph-name="_607" unicode="&#xf287;" horiz-adv-x="2304" -d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96 -q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5 -t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" /> - <glyph glyph-name="_608" unicode="&#xf288;" horiz-adv-x="1792" -d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348 -t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="_609" unicode="&#xf289;" horiz-adv-x="2304" -d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22 -q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5 -q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13 -q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" /> - <glyph glyph-name="_610" unicode="&#xf28a;" -d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83 -t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20 -q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5 -t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" /> - <glyph glyph-name="_611" unicode="&#xf28b;" -d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103 -t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_612" unicode="&#xf28c;" -d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 -t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" /> - <glyph glyph-name="_613" unicode="&#xf28d;" -d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 -t103 -385.5z" /> - <glyph glyph-name="_614" unicode="&#xf28e;" -d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 -t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" /> - <glyph glyph-name="_615" unicode="&#xf290;" horiz-adv-x="1792" -d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5 -t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> - <glyph glyph-name="_616" unicode="&#xf291;" horiz-adv-x="2048" -d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5 -t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416 -q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441 -h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" /> - <glyph glyph-name="_617" unicode="&#xf292;" horiz-adv-x="1792" -d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12 -q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311 -q15 0 25 -12q9 -12 6 -28z" /> - <glyph glyph-name="_618" unicode="&#xf293;" -d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5 -t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" /> - <glyph glyph-name="_619" unicode="&#xf294;" horiz-adv-x="1024" -d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" /> - <glyph glyph-name="_620" unicode="&#xf295;" -d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5 -t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 -t271.5 -112.5t112.5 -271.5z" /> - <glyph glyph-name="_621" unicode="&#xf296;" horiz-adv-x="1792" -d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" /> - <glyph glyph-name="_622" unicode="&#xf297;" horiz-adv-x="1792" -d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111 -q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" /> - <glyph glyph-name="_623" unicode="&#xf298;" -d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14 -t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" /> - <glyph glyph-name="_624" unicode="&#xf299;" horiz-adv-x="1792" -d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57 -q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285 -q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" /> - <glyph glyph-name="_625" unicode="&#xf29a;" horiz-adv-x="1792" -d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42 -q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z -M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298 -t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="_626" unicode="&#xf29b;" -d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300 -l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z -M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" /> - <glyph glyph-name="_627" unicode="&#xf29c;" -d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5 -t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5 -t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5 -t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="_628" unicode="&#xf29d;" horiz-adv-x="1408" -d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457 -q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521 -q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661 -q3 -1 7 1t7 4l3 2q11 9 11 17z" /> - <glyph glyph-name="_629" unicode="&#xf29e;" horiz-adv-x="2304" -d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10 -t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5 -t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5 -h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96 -t9.5 -70.5z" /> - <glyph glyph-name="uniF2A0" unicode="&#xf2a0;" horiz-adv-x="1408" -d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5 -q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127 -l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272 -t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249 -q-18 -19 -45 -19z" /> - <glyph glyph-name="uniF2A1" unicode="&#xf2a1;" horiz-adv-x="2176" -d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352 -q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864 -q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136 -t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56 -t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56 -t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136 -t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" /> - <glyph glyph-name="uniF2A2" unicode="&#xf2a2;" horiz-adv-x="1792" -d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z -M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72 -t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45 -t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4 -q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" /> - <glyph glyph-name="uniF2A3" unicode="&#xf2a3;" horiz-adv-x="2304" -d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55 -q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5 -q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101 -q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35 -q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5 -q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" /> - <glyph glyph-name="uniF2A4" unicode="&#xf2a4;" horiz-adv-x="1792" -d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19 -t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74 -t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233 -l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" /> - <glyph glyph-name="uniF2A5" unicode="&#xf2a5;" -d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2 -q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10 -q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5 -t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="uniF2A6" unicode="&#xf2a6;" horiz-adv-x="1535" -d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5 -l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5 -q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9 -q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" /> - <glyph glyph-name="uniF2A7" unicode="&#xf2a7;" horiz-adv-x="1664" -d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37 -t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38 -l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148 -q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26 -l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" /> - <glyph glyph-name="uniF2A8" unicode="&#xf2a8;" horiz-adv-x="1792" -d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5 -q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841 -q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5 -q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" /> - <glyph glyph-name="uniF2A9" unicode="&#xf2a9;" horiz-adv-x="1280" -d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5 -q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z -M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" /> - <glyph glyph-name="uniF2AA" unicode="&#xf2aa;" -d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z -M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5 -q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 -t84.5 -203.5z" /> - <glyph glyph-name="uniF2AB" unicode="&#xf2ab;" -d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114 -q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5 -t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 -t103 -385.5z" /> - <glyph glyph-name="uniF2AC" unicode="&#xf2ac;" horiz-adv-x="1664" -d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35 -q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5 -t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" /> - <glyph glyph-name="uniF2AD" unicode="&#xf2ad;" -d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115 -q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15 -t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 -q119 0 203.5 -84.5t84.5 -203.5z" /> - <glyph glyph-name="uniF2AE" unicode="&#xf2ae;" horiz-adv-x="2304" -d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7 -q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158 -q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" /> - <glyph glyph-name="uniF2B0" unicode="&#xf2b0;" -d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104 -q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108 -l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z -M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" /> - <glyph glyph-name="uniF2B1" unicode="&#xf2b1;" horiz-adv-x="1664" -d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5 -t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" /> - <glyph glyph-name="uniF2B2" unicode="&#xf2b2;" horiz-adv-x="1792" -d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5 -t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114 -q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50 -q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5 -t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46 -q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5 -q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177 -t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" /> - <glyph glyph-name="uniF2B3" unicode="&#xf2b3;" -d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110 -h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> - <glyph glyph-name="uniF2B4" unicode="&#xf2b4;" -d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5 -q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" /> - <glyph glyph-name="uniF2B5" unicode="&#xf2b5;" horiz-adv-x="2304" -d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66 -l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180 -q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z -M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421 -q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" /> - <glyph glyph-name="uniF2B6" unicode="&#xf2b6;" horiz-adv-x="1792" -d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107 -t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39 -q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" /> - <glyph glyph-name="uniF2B7" unicode="&#xf2b7;" horiz-adv-x="1792" -d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5 -l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5 -h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94 -q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" /> - <glyph glyph-name="uniF2B8" unicode="&#xf2b8;" -d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465 -l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161 -q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74 -q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" /> - <glyph glyph-name="uniF2B9" unicode="&#xf2b9;" horiz-adv-x="1664" -d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576 -q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216 -q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" /> - <glyph glyph-name="uniF2BA" unicode="&#xf2ba;" horiz-adv-x="1664" -d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5 -t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96 -q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216 -q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" /> - <glyph glyph-name="uniF2BB" unicode="&#xf2bb;" horiz-adv-x="2048" -d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z -M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568 -q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9 -h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2BC" unicode="&#xf2bc;" horiz-adv-x="2048" -d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925 -q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568 -q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5 -t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113 -t113 47h1728q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2BD" unicode="&#xf2bd;" horiz-adv-x="1792" -d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5 -t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="uniF2BE" unicode="&#xf2be;" horiz-adv-x="1792" -d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61 -t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" /> - <glyph glyph-name="uniF2C0" unicode="&#xf2c0;" -d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5 -t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145 -q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" /> - <glyph glyph-name="uniF2C1" unicode="&#xf2c1;" horiz-adv-x="1280" -d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5 -t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352 -q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2C2" unicode="&#xf2c2;" horiz-adv-x="2048" -d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56 -t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23 -v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728 -q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2C3" unicode="&#xf2c3;" horiz-adv-x="2048" -d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z -M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64 -q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47 -h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2C4" unicode="&#xf2c4;" horiz-adv-x="1792" -d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117 -q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5 -t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" /> - <glyph glyph-name="uniF2C5" unicode="&#xf2c5;" horiz-adv-x="2304" -d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21 -t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46 -t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54 -t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29 -q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5 -t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314 -q2 -42 2 -64z" /> - <glyph glyph-name="uniF2C6" unicode="&#xf2c6;" horiz-adv-x="1792" -d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 -t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="uniF2C7" unicode="&#xf2c7;" horiz-adv-x="1024" -d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 -t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 -v128h192z" /> - <glyph glyph-name="uniF2C8" unicode="&#xf2c8;" horiz-adv-x="1024" -d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 -t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 -v128h192z" /> - <glyph glyph-name="uniF2C9" unicode="&#xf2c9;" horiz-adv-x="1024" -d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 -t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 -v128h192z" /> - <glyph glyph-name="uniF2CA" unicode="&#xf2ca;" horiz-adv-x="1024" -d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5 -t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192 -v128h192z" /> - <glyph glyph-name="uniF2CB" unicode="&#xf2cb;" horiz-adv-x="1024" -d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z -M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" /> - <glyph glyph-name="uniF2CC" unicode="&#xf2cc;" horiz-adv-x="1920" -d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41 -t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19 -t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768 -q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19 -t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384 -q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" /> - <glyph glyph-name="uniF2CD" unicode="&#xf2cd;" horiz-adv-x="1792" -d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9 -t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9 -t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42 -q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9 -t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23 -t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" /> - <glyph glyph-name="uniF2CE" unicode="&#xf2ce;" -d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5 -t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70 -q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20 -q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5 -t72.5 -263.5z" /> - <glyph glyph-name="uniF2D0" unicode="&#xf2d0;" horiz-adv-x="1792" -d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2D1" unicode="&#xf2d1;" horiz-adv-x="1792" -d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2D2" unicode="&#xf2d2;" horiz-adv-x="2048" -d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47 -t47 -113z" /> - <glyph glyph-name="uniF2D3" unicode="&#xf2d3;" horiz-adv-x="1792" -d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10 -l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2D4" unicode="&#xf2d4;" horiz-adv-x="1792" -d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 -l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2D5" unicode="&#xf2d5;" horiz-adv-x="1792" -d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="uniF2D6" unicode="&#xf2d6;" horiz-adv-x="1794" -d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12 -t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5 -t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5 -q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5 -q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34 -q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5 -t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" /> - <glyph glyph-name="uniF2D7" unicode="&#xf2d7;" -d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89 -q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5 -t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" /> - <glyph glyph-name="uniF2D8" unicode="&#xf2d8;" -d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7 -t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5 -h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113 -v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" /> - <glyph glyph-name="uniF2D9" unicode="&#xf2d9;" horiz-adv-x="2176" -d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584 -q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5 -q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15 -q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82 -q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104 -t302 11t306.5 -97q220 -115 333 -336t87 -474z" /> - <glyph glyph-name="uniF2DA" unicode="&#xf2da;" horiz-adv-x="1792" -d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178 -q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199 -t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297 -t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208 -t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" /> - <glyph glyph-name="uniF2DB" unicode="&#xf2db;" -d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16 -q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28 -t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32 -q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16 -h48q16 0 16 -16z" /> - <glyph glyph-name="uniF2DC" unicode="&#xf2dc;" horiz-adv-x="1664" -d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45 -t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33 -q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313 -l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106 -q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" /> - <glyph glyph-name="uniF2DD" unicode="&#xf2dd;" horiz-adv-x="1792" -d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321 -q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" /> - <glyph glyph-name="uniF2DE" unicode="&#xf2de;" horiz-adv-x="1792" -d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62 -t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71 -t286 -191t191 -286t71 -348z" /> - <glyph glyph-name="uniF2E0" unicode="&#xf2e0;" horiz-adv-x="1920" -d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3 -t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53 -q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5 -q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5 -t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5 -q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z -M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21 -q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16 -q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" /> - <glyph glyph-name="uniF2E1" unicode="&#xf2e1;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2E2" unicode="&#xf2e2;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2E3" unicode="&#xf2e3;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2E4" unicode="&#xf2e4;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2E5" unicode="&#xf2e5;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2E6" unicode="&#xf2e6;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2E7" unicode="&#xf2e7;" horiz-adv-x="1792" - /> - <glyph glyph-name="_698" unicode="&#xf2e8;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2E9" unicode="&#xf2e9;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2EA" unicode="&#xf2ea;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2EB" unicode="&#xf2eb;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2EC" unicode="&#xf2ec;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2ED" unicode="&#xf2ed;" horiz-adv-x="1792" - /> - <glyph glyph-name="uniF2EE" unicode="&#xf2ee;" horiz-adv-x="1792" - /> - <glyph glyph-name="lessequal" unicode="&#xf500;" horiz-adv-x="1792" - /> - </font> -</defs></svg> diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.ttf b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa1196aad98c2adf4378a7611dd713aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165548 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 diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4b06eee3d0c0d54402a47ab2601b2862b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98024 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 SdSQM28?+M|D(2r_;{O0|uQ74} diff --git a/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff2 b/pagetop-mdbook/static/FontAwesome/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc60404b91e398a37200c4a77b645cfd9586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77160 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 diff --git a/pagetop-mdbook/static/ayu-highlight.css b/pagetop-mdbook/static/ayu-highlight.css deleted file mode 100644 index 32c94322..00000000 --- a/pagetop-mdbook/static/ayu-highlight.css +++ /dev/null @@ -1,78 +0,0 @@ -/* -Based off of the Ayu theme -Original by Dempfi (https://github.com/dempfi/ayu) -*/ - -.hljs { - display: block; - overflow-x: auto; - background: #191f26; - color: #e6e1cf; -} - -.hljs-comment, -.hljs-quote { - color: #5c6773; - font-style: italic; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-attr, -.hljs-regexp, -.hljs-link, -.hljs-selector-id, -.hljs-selector-class { - color: #ff7733; -} - -.hljs-number, -.hljs-meta, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #ffee99; -} - -.hljs-string, -.hljs-bullet { - color: #b8cc52; -} - -.hljs-title, -.hljs-built_in, -.hljs-section { - color: #ffb454; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-symbol { - color: #ff7733; -} - -.hljs-name { - color: #36a3d9; -} - -.hljs-tag { - color: #00568d; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #91b362; -} - -.hljs-deletion { - color: #d96c75; -} diff --git a/pagetop-mdbook/static/css/chrome.css b/pagetop-mdbook/static/css/chrome.css deleted file mode 100644 index 7f9dc35d..00000000 --- a/pagetop-mdbook/static/css/chrome.css +++ /dev/null @@ -1,552 +0,0 @@ -/* CSS for UI elements (a.k.a. chrome) */ - -@import 'variables.css'; - -::-webkit-scrollbar { - background: var(--bg); -} -::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -#mdbook { - position: relative; - scrollbar-color: var(--scrollbar) var(--bg); -} -#mdbook .content { - position: relative; -} - -#mdbook #searchresults a, -#mdbook .content a:link, -#mdbook a:visited, -#mdbook a > .hljs { - color: var(--links); -} - -/* Menu Bar */ - -#menu-bar, -#menu-bar-hover-placeholder { - z-index: 101; - margin: auto calc(0px - var(--page-padding)); -} -#menu-bar { - position: relative; - display: flex; - flex-wrap: wrap; - background-color: var(--bg); - border-bottom-color: var(--bg); - border-bottom-width: 1px; - border-bottom-style: solid; -} -#menu-bar.sticky, -.js #menu-bar-hover-placeholder:hover + #menu-bar, -.js #menu-bar:hover, -.js.sidebar-visible #menu-bar { - position: -webkit-sticky; - position: sticky; - top: 0 !important; -} -#menu-bar-hover-placeholder { - position: sticky; - position: -webkit-sticky; - top: 0; - height: var(--menu-bar-height); -} -#menu-bar.bordered { - border-bottom-color: var(--table-border-color); -} -#menu-bar i, #menu-bar .icon-button { - position: relative; - padding: 0 8px; - z-index: 10; - line-height: var(--menu-bar-height); - cursor: pointer; - transition: color 0.5s; -} -@media only screen and (max-width: 420px) { - #menu-bar i, #menu-bar .icon-button { - padding: 0 5px; - } -} - -#mdbook .icon-button { - border: none; - background: none; - padding: 0; - color: inherit; -} -#mdbook .icon-button i { - margin: 0; -} - -#mdbook .right-buttons { - margin: 0 15px; -} -#mdbook .right-buttons a { - text-decoration: none; -} - -#mdbook .left-buttons { - display: flex; - margin: 0 5px; -} -.no-js #mdbook .left-buttons { - display: none; -} - -#mdbook .menu-title { - display: inline-block; - font-weight: 200; - font-size: 1.8rem; - line-height: var(--menu-bar-height); - text-align: center; - margin: 0; - flex: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.js #mdbook .menu-title { - cursor: pointer; -} -@media only screen and (max-width: 640px) { - #mdbook .menu-title { - font-size: 1.5rem; - } -} -@media only screen and (max-width: 420px) { - #mdbook .menu-title { - font-size: 1.2rem; - } -} - -#mdbook .menu-bar, -#mdbook .menu-bar:visited, -#mdbook .nav-chapters, -#mdbook .nav-chapters:visited, -#mdbook .mobile-nav-chapters, -#mdbook .mobile-nav-chapters:visited, -#mdbook .menu-bar .icon-button, -#mdbook .menu-bar a i { - color: var(--icons); -} - -#mdbook .menu-bar i:hover, -#mdbook .menu-bar .icon-button:hover, -#mdbook .nav-chapters:hover, -#mdbook .mobile-nav-chapters i:hover { - color: var(--icons-hover); -} - -/* Nav Icons */ - -#mdbook .nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - - position: absolute; - top: 0; - bottom: 0; - margin: 0; - max-width: 150px; - min-width: 90px; - - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - - transition: color 0.5s, background-color 0.5s; -} - -#mdbook .nav-chapters:hover { - text-decoration: none; - background-color: var(--theme-hover); - transition: background-color 0.15s, color 0.15s; -} - -#mdbook .nav-wrapper { - margin-top: 50px; - display: none; -} - -#mdbook .mobile-nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - width: 90px; - border-radius: 5px; - background-color: var(--sidebar-bg); -} - -#mdbook .previous { - float: left; -} - -#mdbook .next { - float: right; - right: var(--page-padding); -} - -@media only screen and (max-width: 1080px) { - #mdbook .nav-wide-wrapper { display: none; } - #mdbook .nav-wrapper { display: block; } -} - -@media only screen and (max-width: 1380px) { - .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } - .sidebar-visible #mdbook .nav-wrapper { display: block; } -} - -/* Inline code */ - -#mdbook :not(pre) > .hljs { - display: inline; - padding: 0.1em 0.3em; - border-radius: 3px; -} - -#mdbook :not(pre):not(a) > .hljs { - color: var(--inline-code-color); - overflow-x: initial; -} - -#mdbook a:hover > .hljs { - text-decoration: underline; -} - -#mdbook pre { - position: relative; - font-size: 0.875rem; -} -#mdbook pre > .buttons { - position: absolute; - z-index: 100; - right: 0px; - top: 2px; - margin: 0px; - padding: 2px 0px; - - color: var(--sidebar-fg); - cursor: pointer; - visibility: hidden; - opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; -} -#mdbook pre:hover > .buttons { - visibility: visible; - opacity: 1 -} -#mdbook pre > .buttons :hover { - color: var(--sidebar-active); - border-color: var(--icons-hover); - background-color: var(--theme-hover); -} -#mdbook pre > .buttons i { - margin-left: 8px; -} -#mdbook pre > .buttons button { - cursor: inherit; - margin: 0px 5px; - padding: 3px 5px; - font-size: 14px; - - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: var(--icons); - background-color: var(--theme-popup-bg); - transition: 100ms; - transition-property: color,border-color,background-color; - color: var(--icons); -} -@media (pointer: coarse) { - #mdbook pre > .buttons button { - /* On mobile, make it easier to tap buttons. */ - padding: 0.3rem 1rem; - } -} -#mdbook pre > code { - padding: 1rem; - font-size: 0.875rem; -} - -/* FIXME: ACE editors overlap their buttons because ACE does absolute - positioning within the code block which breaks padding. The only solution I - can think of is to move the padding to the outer pre tag (or insert a div - wrapper), but that would require fixing a whole bunch of CSS rules. -*/ -#mdbook .hljs.ace_editor { - padding: 0rem 0rem; -} - -#mdbook pre > .result { - margin-top: 10px; -} - -/* Search */ - -#searchresults a { - text-decoration: none; -} - -#mdbook mark { - border-radius: 2px; - padding: 0 3px 1px 3px; - margin: 0 -3px -1px -3px; - background-color: var(--search-mark-bg); - transition: background-color 300ms linear; - cursor: pointer; -} - -#mdbook mark.fade-out { - background-color: rgba(0,0,0,0) !important; - cursor: auto; -} - -#mdbook .searchbar-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} - -#searchbar { - width: 100%; - margin: 5px auto 0px auto; - padding: 10px 16px; - transition: box-shadow 300ms ease-in-out; - border: 1px solid var(--searchbar-border-color); - border-radius: 3px; - background-color: var(--searchbar-bg); - color: var(--searchbar-fg); -} -#searchbar:focus, -#searchbar.active { - box-shadow: 0 0 3px var(--searchbar-shadow-color); -} - -#mdbook .searchresults-header { - font-weight: bold; - font-size: 1em; - padding: 18px 0 0 5px; - color: var(--searchresults-header-fg); -} - -#mdbook .searchresults-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); - border-bottom: 1px dashed var(--searchresults-border-color); -} - -#mdbook ul#searchresults { - list-style: none; - padding-left: 20px; -} -#mdbook ul#searchresults li { - margin: 10px 0px; - padding: 2px; - border-radius: 2px; -} -#mdbook ul#searchresults li.focus { - background-color: var(--searchresults-li-bg); -} -#mdbook ul#searchresults span.teaser { - display: block; - clear: both; - margin: 5px 0 0 20px; - font-size: 0.8em; -} -#mdbook ul#searchresults span.teaser em { - font-weight: bold; - font-style: normal; -} - -/* Sidebar */ -#mdbook .sidebar { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: var(--sidebar-width); - font-size: 0.875em; - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - overscroll-behavior-y: contain; - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); -} -.sidebar-resizing { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.js:not(.sidebar-resizing) #mdbook .sidebar { - transition: transform 0.3s; /* Animation: slide away */ -} -#mdbook .sidebar code { - line-height: 2em; -} -#mdbook .sidebar .sidebar-scrollbox { - overflow-y: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 10px 10px; -} -#mdbook .sidebar .sidebar-resize-handle { - position: absolute; - cursor: col-resize; - width: 0; - right: 0; - top: 0; - bottom: 0; -} -.js #mdbook .sidebar .sidebar-resize-handle { - cursor: col-resize; - width: 5px; -} -.sidebar-hidden #mdbook .sidebar { - transform: translateX(calc(0px - var(--sidebar-width))); -} -#mdbook .sidebar::-webkit-scrollbar { - background: var(--sidebar-bg); -} -#mdbook .sidebar::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -.sidebar-visible #mdbook .page-wrapper { - transform: translateX(var(--sidebar-width)); -} -@media only screen and (min-width: 620px) { - .sidebar-visible #mdbook .page-wrapper { - transform: none; - margin-left: var(--sidebar-width); - } -} - -#mdbook .chapter { - list-style: none outside none; - padding-left: 0; - line-height: 2.2em; -} - -#mdbook .chapter ol { - width: 100%; -} - -#mdbook .chapter li { - display: flex; - color: var(--sidebar-non-existant); -} -#mdbook .chapter li a { - display: block; - padding: 0; - text-decoration: none; - color: var(--sidebar-fg); -} - -#mdbook .chapter li a:hover { - color: var(--sidebar-active); -} - -#mdbook .chapter li a.active { - color: var(--sidebar-active); -} - -#mdbook .chapter li > a.toggle { - cursor: pointer; - display: block; - margin-left: auto; - padding: 0 10px; - user-select: none; - opacity: 0.68; -} - -#mdbook .chapter li > a.toggle div { - transition: transform 0.5s; -} - -/* collapse the section */ -#mdbook .chapter li:not(.expanded) + li > ol { - display: none; -} - -#mdbook .chapter li.chapter-item { - line-height: 1.5em; - margin-top: 0.6em; -} - -#mdbook .chapter li.expanded > a.toggle div { - transform: rotate(90deg); -} - -#mdbook .spacer { - width: 100%; - height: 3px; - margin: 5px 0px; -} -#mdbook .chapter .spacer { - background-color: var(--sidebar-spacer); -} - -@media (-moz-touch-enabled: 1), (pointer: coarse) { - #mdbook .chapter li a { padding: 5px 0; } - #mdbook .spacer { margin: 10px 0; } -} - -#mdbook .section { - list-style: none outside none; - margin: 0; - padding: 0 0 0 20px; - line-height: 1.9em; -} - -/* Theme Menu Popup */ - -#mdbook .theme-popup { - position: absolute; - left: 10px; - top: var(--menu-bar-height); - z-index: 1000; - border-radius: 4px; - font-size: 0.7em; - color: var(--fg); - background: var(--theme-popup-bg); - border: 1px solid var(--theme-popup-border); - margin: 0; - padding: 0; - list-style: none; - display: none; -} -#mdbook .theme-popup .default { - color: var(--icons); -} -#mdbook .theme-popup .theme { - width: 100%; - border: 0; - margin: 0; - padding: 2px 10px; - line-height: 25px; - white-space: nowrap; - text-align: left; - cursor: pointer; - color: inherit; - background: inherit; - font-size: inherit; -} -#mdbook .theme-popup .theme:hover { - background-color: var(--theme-hover); -} -#mdbook .theme-popup .theme:hover:first-child, -#mdbook .theme-popup .theme:hover:last-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} diff --git a/pagetop-mdbook/static/css/general.css b/pagetop-mdbook/static/css/general.css deleted file mode 100644 index 8ace6312..00000000 --- a/pagetop-mdbook/static/css/general.css +++ /dev/null @@ -1,187 +0,0 @@ -/* Base styles and content styles */ - -@import 'variables.css'; - -#mdbook { - font-family: "Open Sans", sans-serif; - color: var(--fg); - background-color: var(--bg); - text-size-adjust: none; - -webkit-text-size-adjust: none; - overflow-x: hidden; -} - -#mdbook code { - font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; -} - -/* make long words/inline code not x overflow */ -#mdbook main { - overflow-wrap: break-word; -} - -/* make wide tables scroll if they overflow */ -#mdbook .table-wrapper { - overflow-x: auto; -} - -/* Don't change font size in headers. */ -#mdbook h1 code, -#mdbook h2 code, -#mdbook h3 code, -#mdbook h4 code, -#mdbook h5 code, -#mdbook h6 code { - font-size: unset; -} - -#mdbook .left { float: left; } -#mdbook .right { float: right; } -#mdbook .boring { opacity: 0.6; } -#mdbook .hide-boring .boring { display: none; } -#mdbook .hidden { display: none !important; } - -#mdbook h2, #mdbook h3 { margin-top: 2.5em; } -#mdbook h4, #mdbook h5 { margin-top: 2em; } - -#mdbook .header + .header h3, -#mdbook .header + .header h4, -#mdbook .header + .header h5 { - margin-top: 1em; -} - -#mdbook h1:target::before, -#mdbook h2:target::before, -#mdbook h3:target::before, -#mdbook h4:target::before, -#mdbook h5:target::before, -#mdbook h6:target::before { - display: inline-block; - content: "»"; - margin-left: -30px; - width: 30px; -} - -/* This is broken on Safari as of version 14, but is fixed - in Safari Technology Preview 117 which I think will be Safari 14.2. - https://bugs.webkit.org/show_bug.cgi?id=218076 -*/ -:target { - scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); -} - -#mdbook .page { - outline: 0; - padding: 0 var(--page-padding); - margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ -} -#mdbook .page-wrapper { - box-sizing: border-box; -} -.js:not(.sidebar-resizing) #mdbook .page-wrapper { - transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ -} - -#mdbook .content { - overflow-y: auto; - padding: 20px 5px 50px 5px; -} -#mdbook .content main { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} -#mdbook .content p { line-height: 1.45em; } -#mdbook .content ol { line-height: 1.45em; } -#mdbook .content ul { line-height: 1.45em; } -#mdbook .content a { text-decoration: none; } -#mdbook .content a:hover { text-decoration: underline; } -#mdbook .content img, .content video { max-width: 100%; } -#mdbook .content .header:link, -#mdbook .content .header:visited { - color: var(--fg); -} -#mdbook .content .header:link, -#mdbook .content .header:visited:hover { - text-decoration: none; -} - -#mdbook table { - margin: 0 auto; - border-collapse: collapse; -} -#mdbook table td { - padding: 3px 20px; - border: 1px var(--table-border-color) solid; -} -#mdbook table thead { - background: var(--table-header-bg); -} -#mdbook table thead td { - font-weight: 700; - border: none; -} -#mdbook table thead th { - padding: 3px 20px; -} -#mdbook table thead tr { - border: 1px var(--table-header-bg) solid; -} -/* Alternate background colors for rows */ -#mdbook table tbody tr:nth-child(2n) { - background: var(--table-alternate-bg); -} - - -#mdbook blockquote { - margin: 20px 0; - padding: 0 20px; - color: var(--fg); - background-color: var(--quote-bg); - border-top: .1em solid var(--quote-border); - border-bottom: .1em solid var(--quote-border); -} -#mdbook blockquote p { - margin-top: 1rem; -} - -#mdbook :not(.footnote-definition) + .footnote-definition, -#mdbook .footnote-definition + :not(.footnote-definition) { - margin-top: 2em; -} -#mdbook .footnote-definition { - font-size: 0.9em; - margin: 0.5em 0; -} -#mdbook .footnote-definition p { - display: inline; -} - -#mdbook .tooltiptext { - position: absolute; - visibility: hidden; - color: #fff; - background-color: #333; - transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ - left: -8px; /* Half of the width of the icon */ - top: -35px; - font-size: 0.8em; - text-align: center; - border-radius: 6px; - padding: 5px 8px; - margin: 5px; - z-index: 1000; -} -#mdbook .tooltipped .tooltiptext { - visibility: visible; -} - -#mdbook .chapter li.part-title { - color: var(--sidebar-fg); - margin: 5px 0px; - font-weight: bold; -} - -#mdbook .result-no-output { - font-style: italic; -} diff --git a/pagetop-mdbook/static/css/print.css b/pagetop-mdbook/static/css/print.css deleted file mode 100644 index bd7c8da7..00000000 --- a/pagetop-mdbook/static/css/print.css +++ /dev/null @@ -1,65 +0,0 @@ -#sidebar, -#menu-bar, -#mdbook .nav-chapters, -#mdbook .mobile-nav-chapters { - display: none; -} - -#mdbook, -#page-wrapper { - margin: 0; - padding: 0; - max-width: none; - transform: none !important; - overflow-y: initial; -} - -#content { - max-width: none; - margin: 0; - padding: 0; -} - -#mdbook .page { - overflow-y: initial; -} - -#mdbook code { - background-color: #eeeeee; - border-radius: 5px; - - /* Force background to be printed in Chrome */ - -webkit-print-color-adjust: exact; -} - -#mdbook pre > .buttons { - z-index: 2; -} - -#mdbook a, -#mdbook a:visited, -#mdbook a:active, -#mdbook a:hover { - color: #4183c4; - text-decoration: none; -} - -#mdbook h1, -#mdbook h2, -#mdbook h3, -#mdbook h4, -#mdbook h5, -#mdbook h6 { - page-break-inside: avoid; - page-break-after: avoid; -} - -#mdbook pre, -#mdbook code { - page-break-inside: avoid; - white-space: pre-wrap; -} - -#mdbook .fa { - display: none !important; -} diff --git a/pagetop-mdbook/static/css/variables.css b/pagetop-mdbook/static/css/variables.css deleted file mode 100644 index 7a68155a..00000000 --- a/pagetop-mdbook/static/css/variables.css +++ /dev/null @@ -1,253 +0,0 @@ - -/* Globals */ - -:root { - --sidebar-width: 300px; - --page-padding: 15px; - --content-max-width: 750px; - --menu-bar-height: 50px; -} - -/* Themes */ - -.ayu { - --bg: hsl(210, 25%, 8%); - --fg: #c5c5c5; - - --sidebar-bg: #14191f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #5c6773; - --sidebar-active: #ffb454; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #0096cf; - - --inline-code-color: #ffb454; - - --theme-popup-bg: #14191f; - --theme-popup-border: #5c6773; - --theme-hover: #191f26; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(210, 25%, 13%); - --table-header-bg: hsl(210, 25%, 28%); - --table-alternate-bg: hsl(210, 25%, 11%); - - --searchbar-border-color: #848484; - --searchbar-bg: #424242; - --searchbar-fg: #fff; - --searchbar-shadow-color: #d4c89f; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #252932; - --search-mark-bg: #e3b171; -} - -.coal { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; -} - -.light { - --bg: hsl(0, 0%, 100%); - --fg: hsl(0, 0%, 0%); - - --sidebar-bg: #fafafa; - --sidebar-fg: hsl(0, 0%, 0%); - --sidebar-non-existant: #aaaaaa; - --sidebar-active: #1f1fff; - --sidebar-spacer: #f4f4f4; - - --scrollbar: #8F8F8F; - - --icons: #747474; - --icons-hover: #000000; - - --links: #20609f; - - --inline-code-color: #301900; - - --theme-popup-bg: #fafafa; - --theme-popup-border: #cccccc; - --theme-hover: #e6e6e6; - - --quote-bg: hsl(197, 37%, 96%); - --quote-border: hsl(197, 37%, 91%); - - --table-border-color: hsl(0, 0%, 95%); - --table-header-bg: hsl(0, 0%, 80%); - --table-alternate-bg: hsl(0, 0%, 97%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #e4f2fe; - --search-mark-bg: #a2cff5; -} - -.navy { - --bg: hsl(226, 23%, 11%); - --fg: #bcbdd0; - - --sidebar-bg: #282d3f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505274; - --sidebar-active: #2b79a2; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #161923; - --theme-popup-border: #737480; - --theme-hover: #282e40; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(226, 23%, 16%); - --table-header-bg: hsl(226, 23%, 31%); - --table-alternate-bg: hsl(226, 23%, 14%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #aeaec6; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #5f5f71; - --searchresults-border-color: #5c5c68; - --searchresults-li-bg: #242430; - --search-mark-bg: #a2cff5; -} - -.rust { - --bg: hsl(60, 9%, 87%); - --fg: #262625; - - --sidebar-bg: #3b2e2a; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505254; - --sidebar-active: #e69f67; - --sidebar-spacer: #45373a; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #262625; - - --links: #2b79a2; - - --inline-code-color: #6e6b5e; - - --theme-popup-bg: #e1e1db; - --theme-popup-border: #b38f6b; - --theme-hover: #99908a; - - --quote-bg: hsl(60, 5%, 75%); - --quote-border: hsl(60, 5%, 70%); - - --table-border-color: hsl(60, 9%, 82%); - --table-header-bg: #b3a497; - --table-alternate-bg: hsl(60, 9%, 84%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #dec2a2; - --search-mark-bg: #e69f67; -} - -@media (prefers-color-scheme: dark) { - .light.no-js { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - } -} diff --git a/pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt b/pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt deleted file mode 100644 index d6456956..00000000 --- a/pagetop-mdbook/static/fonts/OPEN-SANS-LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt b/pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt deleted file mode 100644 index 366206f5..00000000 --- a/pagetop-mdbook/static/fonts/SOURCE-CODE-PRO-LICENSE.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/pagetop-mdbook/static/fonts/fonts.css b/pagetop-mdbook/static/fonts/fonts.css deleted file mode 100644 index 858efa59..00000000 --- a/pagetop-mdbook/static/fonts/fonts.css +++ /dev/null @@ -1,100 +0,0 @@ -/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ -/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ - -/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - src: local('Open Sans Light'), local('OpenSans-Light'), - url('open-sans-v17-all-charsets-300.woff2') format('woff2'); -} - -/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), - url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); -} - -/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans Regular'), local('OpenSans-Regular'), - url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); -} - -/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: local('Open Sans Italic'), local('OpenSans-Italic'), - url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); -} - -/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), - url('open-sans-v17-all-charsets-600.woff2') format('woff2'); -} - -/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), - url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); -} - -/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: local('Open Sans Bold'), local('OpenSans-Bold'), - url('open-sans-v17-all-charsets-700.woff2') format('woff2'); -} - -/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 700; - src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), - url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); -} - -/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 800; - src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), - url('open-sans-v17-all-charsets-800.woff2') format('woff2'); -} - -/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 800; - src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), - url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); -} - -/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 500; - src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); -} diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300.woff2 deleted file mode 100644 index 9f51be370fa913ce6de2922b580c262c4822b337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44352 zcmV(;K-<4}Pew8T0RR910Ifg(5dZ)H0f7hr0Ib{q0RR9100000000000000000000 z0000QE*lUWfmQ}!0EY+&fhq})G!YOAg!yQMtSAeP3IG8%0we>R0t6rhgFFYi4Ge-h zTM$x_K;*{m=TyO<(oF`$dr#+gT@uRz<@OP72f1way{Ld4djxa`IG0*=K;{4c|Nq>i zF~-^s+Z{rPn$}0zLzV=G*ddk#MfRZCOSo7Svxg)@O1QTM(GtC{-8am>TkfXJ&}5JO zXokZnNWAaG&x#r1r&DFc3k@sfl$|@RDaX?kWW{EN@TZnHp}gCDd<u${`Af6YpbDS2 zlstVgmj^bNqeq8~;8iIRB)@)3!TC=GLD~2|a3l^i-r@EP-G=Yjw6VCb;L1vP<KnWB zbH+~VnmlR~1pQbfOI2=2#(>}u9PW@H>gZ142z+QEhtr+J1&#|>KAj6Y2`)3tZkB<U zzVxoOe>e+ebjmTS6=W*;+$iHPBB3Un)Qo?6q*dE(P3T9y565vHowfyevYxI9K2P(y z$<_L{@8?J5hBF;TxvX%vUMY{MW;AQOFw;MRE?UNs>(i)Pw#F30SO&%}gA&nV#5ynh z%lr4w|41^EwI78NR7X_&MdMPeXq|gj4oJ6}tzd{4Fvwwq1Zjy_sfS1l0YYgJLOuSa zG~qZt#{MG5VL1;uY?c0qywYwhjn*_`$CiZFZCFDFz-?kG;zz}gkK?(Z;(4Ip0|Y@p zL`0q-DhfWlFW)O~_Uv1l(z*7n%<Qb|%Iw+QYMoVE^Sbp`e3&{ix4!jtL&VPl1PFJR zU^&t624ib(D^Q}PvAqP~wX-S<=MU$|!oyY=$XS*|8psA7K@GUSNVBmAbOd+7K_N|z z*k5L8{mXh;sjE^|R+j3n?jE5)42UMUoKxMW8jYF3VUIonYk1f*EYR?HhPP{YLYl-$ zi#YYaeLTZk1f7a7W2eVojph{AObAmT&OH@yD0!{!iwJn|ZI%aQ^8m2%oA4;eFVgH5 zb(%75zq*NQqRo8w!mIeITqe*2$KYVWxXyQs@%W#r3ZzvjlP*a4xIZ$zQUqP-PUQ}8 z1?5I%@|5(k!rq1lyKh;uY<0CCw!N)P8Ock2AOZnzea$Y19aL8(OSZ8ww&alHB+D5C zW?+_CHo+$F4j0q>=kiif-51?{(S1>dTz;-%RXz{zW<tsNLp#*W^pY8Os0#i5Pp95L z83<&MLZA>_NG4PO<p9|!qKYs~-MiUafrh1BroL`@o!Zq$rdm~X*=|2Q7#M;SD6TWO zdmlX&Nf5cl<$F=6F#I6=|L68^aWU}sG=TQjEIY>WVdSfQ{H?gb&VPWmSuI@as@lXQ zCML+EVq_sv+K31qR)E!rHdbOZcI*#x`rpX1-FQZd<K{2&i2!8FP5PSx=K&}7T%2?< zd0jptkfHDiZhNH=fLgl9iim%Tu1|AwzPVTJeUaq*oFplpsCX?|?8)Z15693vJ%uBB z2e!3(pU>2?w2J5+HD^d^xN_9WLUu;R1_>$Sl2l1j{i_PqRoxBKXmEfAv5RRCG~gHz zoRPqp)jl)`>4DtY_ee=+oD0vBlrtv1+}R|)Aj>WYFNl--dsEGJL13vB!x?g<?#{6y z9i?&6NV4dZI**Gcb$Rjj?>=A&fDlOONKn#&pyZ<<^Gt#Y5O9+B{||V8CFK!GIY^G7 ziird-fZ=XPfYkAzOvx!^1&5rvR8_9Zlqy%TZCti4x_G(NsHD}UoUD}Q&&1ywU=hnR zK_eK;d!w1V-89?ZEBgl|7bFMOFTBI&;bU#pwZ9KM5d*ckoOlTrnn@#e=0bxf_LKF$ zd-0Mi4MXYT*CGx?Tq%ZXXdY`yIWWVJf|?K(5DNrL%GP_mZs@nw-vBb}Rw0W;wB!)N z5TjzUSNZXIA7943^nXK*r#Dw9|Mtf&ksu-=h_`Yp9V;Dkh;8<4psUZVb-$?#qp%T! ziAdB1b$5t5hjOzR8iD$*)2$e71R6>Zt8%DEY$Sg2KWN&b4Cqr8h>8`6#((@<dC`CM z1n?jbSV+}d2m}Iwfq{mGfq|`W@Grvv*qqXEAZVu<2x{Rjv|#C^i~b>8#L}XktLaTS zryU~vMx03nNxOB%uQY)H>VL7pz)zP2nhY%8WH@)-0RsdY-07d0c5ee-ah{%=QSM%u z*8s<Oxb8p#mrpf6e{I0AUn9@V%>o2)#K3GU!m!|?O$6+?&yD~(Fj>ZOxK05BApxGi zJ<B(8Kr4<^3jvPseZ77-AsD_tD<J^#Oj}dHroUa$OQOA7P*e*eF#<<XTmd?BHgK*7 z;9vlbIcFpPYV;9XRqV;+k0tMf?+wUBnM>r7YET6WG{j1<fMdJ=xAkfELV_nkyxBuH zGP5vW6PU=Vtv5xf&aA0XmIwOD)9#)A#y<p-QB2|YKMKQO3Y989KS^t~5D!$MxJp-3 z<yS%7s|G!gEEn&I*q>#TYt(MkW%SPIA4dOUU&zsN+<{}nS<W%%tmRm9)^j#+1f1VE zJ2+XKQqKQ4Redwh+|Iq6<vg$RRsOvga+zapamrKP^D+KG{L>6r*LQrr)v8tl?2R`* z6w<>(<C>odO>Dg>%+<`=H~%Re+D2bI267Gb@WPo}vT*tKE&#558ck{9tEK*~BMoW% zH1u#!Fgnv{uTh~<hf%lDd!v6gFAALPIQksU6RkK7bPFwcb(fK1)V$kR;w>Qj7=wBs zEV{oNz3jaM^fjm3f5p0ts}vL5&Hz2z`{vHMV{Y#7-q@n{XJgw;zp&JQG^?7_9F3|5 zb%A^H(zJleM37Kj^<5Rd-kNVveVMOa|7TD*sLAge+zbX~|NLN5zpCGgeo($uzEQqZ z_9`DLyOmwaX5}sVK+kAj84r{uR*J9v{)%bEgkn%}9d-mLYyw|;5&3g@gZ$38VhSK! z91j9#SN8o}-9Aj&E9v&zM3V<shevQ<267B3L$Q_N*v3d~XEb&&7CV<dYynSWXRmP_ zo<Jnca#mytl}2Cv1^8PT#_!iU>hC5uz|tJyNKbG|LC_~4)y^U{G4SDak_&pA0eTVu z6_eTTLGRuF#<9LN^II`5^`!oVKDX`#bi9rj!Vt-hn}{NUe<zJ%THwV(#BXQId6p(& z;CrrPTc)9Fsv`Hq>E(;(&z>F+PaZ#d_+WqkW_RyuJ*<|CwyCSK;CU7}Cc#Ffw>oIl zs^53W3J?t_hMIZBhO2(rN~Tq3m$?n+9&|-mEn~UAf5^ub3EssDPjy37EM!6ZHZp@m zNCrI-Ph2^<u;I_ev<s`_HW6Oc{Hcy`n#)vWY=`PAT5s~;5VS|s&%dd|g3sDvS)<j= zaeMIuTosX~9q5yIH@LhKq4k+$+PKv`dNj~6{riY{(^Lz{U;9j^w07<G01S~#qKf7$ zKc`wT2W3RP1U_x_f)hJ`TD#5=U7wta=Y?w8f~tIRa-bH%^ZnI23EDWb^$-7pMcXW* zGfWIR%wH)cyiFCZ|663WoM|wHe}IU*zX7{K6inmA9l&#dqSd$kD(BpX=dMn9;LXZz zbA2a2e1k)Su6usYcmm2>!1CkVodtev1twq1^)3hf`9uNh_*BuuvO#q<aZhjiob>~x zo3i&bCN&_SF$YDaBdznXwfezT+!n4u3btLsIYX@@ay@atqR6=)=k;Ella!UZXMGwf zN*n4pGr(t?9>{71QY`4|b%Dy<aPRGZnuDcD53f6&1p?*uE~%V_LOr9HK*qwz>~#ad zHcpe-Y@VZsd^gwabqyO2`rp(oNU^k7MLZ$IR@s7NL5)<UyJ}+Z_03A<&(&U5)Q6#m zS776`%sjk~>6KPfYTpi98%UgInDEW|x<)35StzjSF@3~6#5ED`klNtH9po~lK1bVv zV%1l-ys(6zR|}y15?Q4|9H8RZE;_Vj%4z$JTi-31_tUXO$;J4jec%(Iu=?}K7-NlL zpup*nGf*+dIQ9VRV8n`Uj4G4|bxxmXRv}7e-KnJjfmz44o+MeKj<(<TE}6wl9>T0~ zBcE5bcE4GO8p<A<G?jK~V7==D&qDIS-89Fhx7aU1D5l)SeVAzrOihdYLu7f89oI=h z#%zkn6VJAs7LL8F*})E9O&dTDD3t0jYFZoM6EO;NF~!h$29SgRgA`Peq70LS+!+)= znE{}=+#wH|swJSYFLGY#26K>xhU<%_j_OCo>XCs3%QnpuHMEuFv-;q%-y#a>+exG0 zh*26N@<3s`E)SH%r?F=ef__@I>lpByPhE^w*p$#YGK0aOcZP;ZJpnVSwo`j#CnwFw zd?)P0?E)G(r*aG|9GE7|v8+Jdk`;*>m8Hr_{5FaxcOU7+34$DRJ??r6)njjjA-#?# z-UKAn0&UPi4|5{rCfe6QY8(Vglu9viflq~oP!FB7`xNmfZ>66}2d`c+t(uE>m&DKl zVFo_AI*6|6wveNanfs8ehR8Dkls`fQtkBgpk;N3+NIE+6+<HEvAWDW6hy28oFr6C% z%!IS2tmX#j^S@%+FIjmdd31uQUL0EWSzr0#HGu|8&`_&kD*%W;o}{5Uuv6f$w*#Da zGQbXrw582Sk3aef{YnORjTjJYj(}Q}Bb1J*A>WFM81qg<7Z#~S?THA&<jm9nO9w>g zkXj9bvPS?TMFtRVHICx*MYb`(U{63GYD8itVkDD3>6duG_XUJ^h)=EtKp@8CtwrN8 z2{ybAz=5EC1WYyq)31l1ND%z2QqiANz_f;Hl8!o{b<hIM@P*B_JQ9eP$`j7CLdD$) zh6xf(*R2q!#$2gT6L@D-?zDsSp}@G5T@yF%niVP@U^J%wN$D;l!7KNUpPV#eyg$m8 zQ+Sw8t<l#4qLrTE0nvpQyne-{c@t5ZBRWa-VVocn><<$*<&}4L(b7x4Oc`D<+QiOC z@>BDwckq2I)!Rr;|1Ny0Qz9W+>0)*;(B(kh-@qgUxc25`Yk?d562!!qh)?<FgroAP z0$Tvz<p`Me2>K+0TcIW-Og6iUno+oZG88gzfgX}aM)Lh*O<2)vr=ybX$BL2YXHcy% zj*hvL5F-K8qqR5~jQOxg9>^llzb~%aKxSE_;FDXCX`>L(_TnyZ+#kb{7&<!xf+rZz z&#I;(9RZGr#5dLT9(yVA3{OwR?)diLf7HQW0jW0kuzcF*MU!TD4c+h@U7j!?dL^e$ zmjtiPN7gRf4KHwgfyls&j0iO)(<LG3^Ez5Gh!Cl$swgTP3}j%YG`tkm&p@TkA{<FS z$?Us30qF$PTyjU=n;D$rHGxNuhOX;6lKTV_RXi>Ds-<N>`+|z)O!jY0I_UWTmX<uN z$H)ES)5ph;{}puh%;N~OTyp;1*Dpf}|H3+rIoH1T0abip77k1H(HoBE7N!`&w$|F; zQZDu8Bg4}HkL`=OFF@#X6a&?1o=ZOY;CqVLwyBJD@Og4-nJc%&Y*|_x2B*zVeEITl zJ#4M*OGz)+Zsyf%^3}r(12D$>p3;!wDC^iTXzyT7<4Nw3GKghd(e|=9)u2-BmkM1< zY3IEH<Kc(m0t}$2<!eNRl>Mhs3sqJSRMgbWsnATY-KcBDs4YuisFSCrjexZ`n1fn} z9JArWjM>b`$o;5gle+H`5SXn-Q=4K^f<}35p6cyE8Fa+%UR?5p6Qt1?9Jrltzjo#- z)^<462JcPHCR7<tH{#VL(@T^7x?SsyG$;q95?a#612j9n(H9ylChajYe{vCFzivlv z##2M?q*;UxDVXpN-T!y8L*35UX;8!@LA|ZbCPY~2Do$$!cH{f_G6^MvcK6WvG#MR~ zZNcP|k_Q~WOs?>}Ic_0jM>zR#Zy1EoUT)?O+@0hUW?i3B<GPCoYYIF+53TfPM?|ol zrxHF%tbIGht!7*}@RFk{&$<H7y*$;oA(;41ZEfgdsXgGx@pxMv0H9cB%pd2xm*Bt7 zr`J$vW#EooxnLM)9Fl8wR7x_l6V7ql-~nG*Uw+-+?E?^LEs)+(nILJ=6wsew??BW? z;9keOEtJ^`a*C?Wag5dJJ~6yDeNv_juZ1h$WF=vJh)|z0N-D1F;<|-$Y9hJr9mA5D z(LL1EV(OKA@sa!VASlV`z1z255oo*N!-_`1@8-}g3+-ZN_A~HQ7rl;)Om5^+I=d(u zp#4eNba^2+TXsZOXmUpgQI1vA!9xhbr8w?lf3DIx?&KTN)<ahxPkYxMq=m@`^jy@6 zTx9*;YTo^2d8*A8Za)q6%upvfY;tpB5BJx#?rlYli-|?z*Gp0+CJDn%pHmeQE71iy z`-N8sqLW{uq0ThMoU$^zCXD$a<3jz3_0B_@X%_jgim8kHyExpZy&>(6&Z&!DzN*CH zJt?}VScA$mXRo|`tXT=2sev0;##!-$G1l@0g1&-rv`BtVXYG32o$GTYqFEK!cy63Y zs*h)o$tj4TM#VFLZeo{bQ#Bf|q4~g$-zUaY$C)xru-p`IX^fdmp!hD)gy^hT_pl6k zwrs-6U95auKw)<?Y5iJg2D2usdq3-p5pNY@h0;HYby_FCz)88&y40@EFML?4M&5G- znGD#^g?3Uj2GpD6{tomOF*(y{>=msV-n%}c%{|;V&KnIs)vm-gWAA`#1{7Nc&9M}2 zm4q&@ckt9B<cY`{nofnd^X!aaTt$BZ4L{GlNiYryyu-6CmF4zY%1}-?mK;bUD3;8Y zLSy)<Ku9nmLy7`rHmZerP_HPcj~orkEyV1iODeSrxVKno)j91|Fu;d2?yeA`ZkBP8 zyD=DWWcovlhx@d(L%Vypy@^3bk14N~fQbHv_1}kwMRRalgfI@*3XEYUMV>IxD3K4A zp#)&N0ddXFd!(sF8T7;)0aY$(5cHmA@Fp?sCJsD#EBxGBRL{?NwVMuP)K;i_s~t<! zUPgdJr_Bf$D1J2xlGAl38n__wn-cShd5a}llDst@+p}*r)k=n?T{Po{1_cW@|EPt% zJSQd>-H<(q=wQ?$FrmCm)_9bxXW_mko;)+|#pMUnVmKu<5mys)9)Y}3UwdK;b33ne zr>4Kg$$Ob~pG2(JD1JU<u=DzK>2=#1ce~j^*%71Oot)8H0cHt%=-|TS(P4+_qUdt} z<S3`D(r=8~!uo&Z$D&Qm@sDsdhF2f-bEBR}@N;z-sw<lF-=azF3>j^-@cS|MOwqAb z^W*p0XHI68OeM%iZ^A!M(~P24R;P&TA-ws9e(#N2t9NE(>}#f!eCxGwnXfnYU-oB- z*mK>#tL>>}^mCnDd*}#ncqqtohQ{4&AA#O0cHX?X^``C3x9n`c_4NTTli1qfd|pm% zY^sR^Hm>qL<WtIZ=BS8sjGVk*^v^s|DLLV#=incK1{G#lgT??v{=C;&sSvPVeq)nc z?P<x6dV=WsgmLD`PT-pN7T@oLttPf+wh}uwrX#*EHwPku|465VKY|$)qb0FLovNUt z-^qksX&_`HIE9AsXFDb{iMz8R_v6%$!{aoWD`SxPDSQ&N69(ZI0od|QTP(?mEJ||x z@uvqUGTCt~dJhE&TJs0Ml_*EyCZD5|l4laTK<-Ao>W08JHZK0x>P`zRb4bJ|LH7Ug zxcd%1qFxoiZFnV=q!_NUYvVZ&ehZn{JFpkZ!*nn{Ethn}zm9IgkbN!GaTj_@Xb+Y= zI3Vc_`1PovIgqsuk{!Dgy1-vuH3nAn(B;JwP_3L8uQ{#zhh^Anr^t19V|tMDXv%#~ zY{Rwwr{PVASo(jZUP|y|&<D2kJ0k;xMFSNDteGWY(ham2xl_Y<balo^cGCm{?nP8P z9Zv_|WyGT7EnobK&vRIR{tvzgQNny}K<>4;@!$eC5Wvx|hlt_B<$HmXDNh7neM0Ic z&!PPAN(77yI-)x#olk|kBu3Xn1lq~fD-rA>pm$Ob+~xpNfwQ*vyYD2<Xx^C>A2oTP zA&yY4x+s$>q`W}>$ldrOO}!$XdFRi>&=wk8z#G(e?_kB~*)5F|7S8LGLH+U<HyXao zm#0su2T_@%BH2g9CO0Kg9EmO58F!h`%b;x8iWOeqj4hlvo73JBVUa7PRvqP6!Hcj? zw*~)VkS1;SgK7jes^B`Wa8Z@u+vTSSE3rRv(GW17tyq8BQ_}nawk+NQJvD70>ucQb zqwMN%zJ0Tp=`=jC4DOrf;L}a_I&xC?_*tjLpK?#*>?5xvLQ2^=>YYgCjNP36S0UXy z$`SYhh6`DdVk_?MEHe@z;H)0T8uNVLii~?3L*Etw%`XIm-;QGk1K6$C&qX{%anO{3 zK`Y28K|LdXMUyZt*YyCbpzEx$H3sFHikaVURwe9N-;|Y}8wcGSs@|LRMOg=FJT7M| z@(xTCGu_fSJf&XKe_)<}_(ioeq}`<o|FXV@>!i1fyi)&6?mA*W5?SL!^$$&^Uv*I4 z5t{YlLLuOFtOSuEIjFH1Fi&RG!Fr>6%Knh6X(WC;wi$u8qv2l+q5!_`(+C*H(d@+n zu%nKC9~m;#wRw7LKXm;SyyBB3=4p!8j!!p2kFp9>|C~gxb-#-kU0IG;$vQZOD7q2$ z|L8N6iw;UU{SWkvFi=Oo&FC6k^~fF3m8*EoMehpobOCNp7!zG$hx~#>$1@8Nc5Csu zO0Vlpdx%PKAzVXZ)y77pO?oP$`CCgS2jyb-J6-f{TLD#au>*sM^LSib8#<R9-sbUW z?CJp*??xIiLTFJ8nW*3UzTjixW=GI1KuNdsJ0dy>cCy-2Bdh6CYk8iWbv-}Y#o_9{ zZR^O;^K8QV9)q_pH=T{mZKTwsP|iHoZgovzs-zU}mKUhKxI8Ju(T8(c*Rzc?xb0&Q zW+*!g<}{A@cPyxzCYan|Ow`?X(F@zd!}=xoEnNN_$T!U4M`PbGwQ#|XF<{zV?sh<K z1P`bqjcB*sAUto&m%k3Qwf|N56kqSiD&d533RT<+GzL-DZ->?22_+&fym3(0LFiy5 zIaNO{FkUDjo5;j()L_zp{Lt{n>{v}+t#HAW%!Rm>mqdZ_msb|1Lw%S`m06hY&{?=b z@s)sbztJ-W^wZn|Sn!LsEkd|?{U=)Mo$1kMl&H!0^&H)}5PFqp$0rPo7D}}}!)2-F z3Rg`C;2vlN5EvbNwfW;51tE6oaQHr~#Gl87NM8+-k^YR7=A)YrhVsVO;zP+NZ7B!g z<yt#KUNMQJKCQP)Fz^E#t5q|c1nlF=#8_WT4=Qn}D%;WzC_niO)-&W)vDTw><MIZq zFJb?2(Eks)=|L3s&SjG)C?Vs-U>G2AwpUcY2B1e^tVZmF!(9{<U{;@}e<b9l5!d5z zV#4!t4nWcp&jJE;l6<;_oqHS|!XE6@pbQi{euzcGm%1nPP|!!?8yBArE`A~i7hEbH zml)W*J4QYqgtY2=B@qoj5eaI~DNENy7)vkSL)PT(N@y6O=daVND;P`bj2j2!qO`bt z7PYfY2)$#N&OgrKEt7%#=US*bYYAM4E5$FrO6WWH$kewbbJt%l+~vK`r!r-*$YmA% ze}evovL(T}=t9UA27<EP>6oLSJ%4i~ZoUo`4|-=WMPrJ>_QZg?803S}k3!`nh9`eG zmVVMNRSvnsCMX%sw{E6MI^<&5k7q%pgCXr%#hbf(Jd?2d;86ljz-IGtJRf`uE|V7} zUx$Y$e`+tKI3c6d##|lX?T`{fatVcLeduw#dleQ&WduyWKgHjDA;w8QGIW|r>|7tP z5@9A_AHKBAdyj?OKyd|U`m-$ld}Y+C^~vS0e@CST1QyysF_r`bEJ%>k78(|XhFoaK zP?Cp|#)Yn@tjXrbC`p*CLRR${GGrJmFLCo}(AxJh_0zlFAo`p}0FU~z$Jt){4sne1 zX8>p8JYx!sNd}l78q0SSG67V#itGbFW^Z|qIG_B<nE{6G+M~Mj=WUN}HA@6ZZ6k_g zWKR{jv4?WiERRgW`arfjak5pyGN{UcpwF$OeT3bTNbum^t_O57jEdGL*nT_GgBzE~ zhG`iyVRkC~fbxMVc*-PW-J)$X%@m=E!(F0Y#lvou3ofnrIIzu{7sSL;uJt4KJG_Et z0?O#>-1`cYY;2Rxvl6f#Tr}R0NRF%c=I$e~8JY62rCrHnUG;n9`q;^Ep{8Zv9?u)3 zGOe%_UP|xG-C)uGIS%q>5fqH$`o_%m9PdP4@)mT_!`(o1Q`a*2_{`5}!a<2Ca;jq+ zRXP}UQVoai**$-yRBIUr9TxlV*I~En>&HvD5=pFxuP8Ms_Jgs_eUWwciga^Xta!5R zw6|XUuH=F@;`Cxv<!hX;eoMWudqG%lJY4{7!72%2xOI-;hrBcpK@+uRGnJuDGPrBz z=th9C9R-6wFaP4tN~PQ3p-MdZHg#D#cP8OtmKtDsxW9PZ^USB+|BJKf2D6K-sueOn zq%P0CdzER52aO0NisgqK<)(G(nYJ=JxqlI+V-wTI)R5w@Si5Rg3(XyGn~kY5w^!lE zz6{kgk`I4=Hc)CVv^f<FJx)vo?!+5nixn4}aDJ|AC%W*CZkn=o5V-vm(Zu@jW+kF; zp7b_w#**{)cL;2yuL?e+#={gC5S${JqGK@ZyzayPB<#ms2ZIS-|MZJY=f^cPu?diw z(qD7VMH#UsSLgiM*vwq8lfmcL`8ZuO>u2!f8;wuB(ehU&v??EGYSX#0e;ODcqWP%~ zQJK**y!2oE{`CqFg<48G;!ieNeK^XbIDW{5<vYt4@0Baq89zBBzcBY<Et)*P?-7R+ zF5a)gS3}LlH&`ul-ecfdZ>m}TSnsV-`TT>b<jt(oF2THI5OOr!r4;)S@i9IRNO%|) z_~j6a9o)E5!Gwwd4p^&eyEIrLA+>sJl8oAF?()RO8ogfzkiQkM*NbTaT(Y*vD1aQi z(ss~xLxxO#la=9AdmuJW5)?A!?v9A44(JpM${Y<sS^+_wq!vU3Yqp+^MzMwqGu!VW zSCoNjql^2k%(W#sJ11}WgTURJu!Y-zGAX~xBrrbe^0P*Dz;b$5QX<sxT(sI!Lgz(L z%wtU<*2ob79smb^F=_v*fK^s%Mz3j5eonHaj~L00;OI_7DA-6y%`8N5CbD4eIJpGh zkKawX0|uH*99}RZe54*{-4L%<%|SAhi6idvH#d62faEg51{5#oDe4|Qyi@%Gl40iR zxC(~`0yRv8^!ltG*_p*Q<megGrSRd%>q2fL#|K(Fo0zo~ODPE+v>9o)sHqj@NBXAI zHm@|E_)&C$ct=qNx*LIUQ19JjNlx=F9v2t}d>18tuakRc&X&Pz?<!yAVk8TAiY0I( zm;rdQf3vUK?chHN9fd_e6Dk4jZqTREfz4(Q1M${-LYr?6Cav~&C6xc3%l~0f);7t9 zD1@3_Grv0>tCvU{Q5R&E@S#&b&`iVDXFpO-yc|aZ-NsX`AUhbR57R9r_On)?rhT*q z#ZogsVof;Dvn`w_IcCodY7_fzKun41$C6X)Ga?!a4{mEKc5kWXCY>6d7sD;5B1ZKo zJ}?=2A;rpJa~MqVcaPd4f~4CUkYkqlG{Z7rQiImY_QJ^W`OYg3=jx~I2S@KRjs`XR zTEV<#i$`@xon<Rs+ulUhLPvwz`z%!hz5R*Ve1?){NNffwv~d@blJw7}xO$pBYAt{W z(*T89^LRZjQs32>R-r1pe>U^b;Wu+?x8+z|RRhw0^pmkXxMIqID=?xyllzF0ZQh^h zoQ}_a7pt_?bUGJ~wTc!wZA<Yfi|wtnu71WRCi!O%cRI>C5r5Z*0B8Xzsjy20QDG-# zq-T>lg62oPG@+deTVE5u(?DmXCAF!TU?Blb&a<~<NG>faR=ab<(QlJXkxY2VCVr`= z9RC?rEXT*MK04v~c}BBMG(7%QhLL_=Z}1a${v|0HqDq&SimqCYq``l+mbL!D;}z5l zrmGQwPgf~x%#zk8p2^Tgeby_}JN<{0M&^ziCE1l$?5trx+tqlwl(E1(vI~pu-J%-R zw2v|sdH{8iQl3WMUhOT&v8JMBQ+=XM*VnmLb9Fo*G1w_erKK-R?afNUHSRd6KzEac ziFBcmp6CXSRy!JpW6eT0n?qQ^1gXP^iesMRB%jM{oNQ>YrFzWzbxRCnUQA_QlqX+g z!7n<yM8Ek?lZ1}!?cskPZREzMoq0!lovLx4`=8VYeiNPYtJ|Y38LMJdoZL-2b(VJe zg4pQ@$CUQ)L%J`YNNyQ1D`i&Zwz%9YHE1u7J<U?eE0GtAjZ0MJhW;ClryS?c7abKI z<?&OFKF%Epna25rF20r%1XxViqP_%iEafPFK3_S{Pf<V49|@Yqp+c5lD#??Wz_0~z zyo>Lg8cr|vzsmAkd&_G~h_uKUY%{UzbUdAsMJE`wP30J$zw$YjxyPY^AMvH<@FD%? zvz1yYUG%*k^5qYWRW>zuAQH*5=K-J+aX=BZ>lj_6flj41=4FjD%KOrJ<%L=Kbp^Ei zO%*~z=?*WFQmy*ts0~5`Yx?qf_e5~7Jw)jYUnIp_q`o!b<$e#!vg)0R;9YYmh9LU; z4Ip)`cfTg>iaA|&xU3@P@1$I3)4Fa0=YCto&l&p6A*DliIhbUS^ZVJKAmP18vZ>=U zlhog$M|AV83Dx_{pp`pP4Kr6~!nD=U$WKqQr>#D`m~$<zdYSj`)zWSo4JBimFn1~i z98cI!J#{J(?7COz)}uf2VaIeZD5l+&<*3!iZWxG7^kIM5&Z*xQ8<-pC`-Y$%8Z7Ot zXOqas&$ZdtXc_s2`}11%<`XUe51Jo29Nu{LDNtUfBuetQiRP}XuwqFgl>TV=gt|Q? z*m-|1*6eUtUOXy_5%ZB=e)Um_Vl1ubS5ZvSU-(rFVCm;yk;UGI*EMY<gPKoWo%-_L z7%1C@&;9!~z1cm|MVcM3%RT+<tGd+K;rt43++B6>=vlbXQ*#6wQkQEt+;I8C0xZFT z9cLr`W*P@hG9(Gki{y(h1-zkU^ub#p(c2%TbB(15>_Q51Dn;5)$rE1R?LeU*cd|nH zGx5laat}nt((#dEhGqLcs{9$s$O-@K-RDpFGqvSDOm3>|1gU<vy-YTKTGbdKZ9N{A z0941IT}OupRgT0A?K_*)){%sEiiyZ7X0-)xi|E*7QnI^E4R@aCI9PxE*rH*wHS0i$ zk>fYZcw?qPT>63}_u8{TUjOEz_P@JAZQ+lF<0snl(^A<C{izg5e?k%W+N3q5tojpf zZOnT(Y$e#c__qe-N4gqiTRs+v@`*z0g+@+<+t!Eae#!xi5;+1tOGUHvk!!PS#OBJ3 zBjZZXy24kUHI9f9WI1s}%;r#H!@^aR>d65Vcq5GJjG)SW`W>i8mMc?a;2AhpYGTzF zLb$y^V3hBU>W}ouEaBbfS*J!)a<f5PEqBpYaZdl%vb4HI`1qee_sy5=Gov$U(z@4$ z71UdZ(UTLfOD9d<MJ4e3(oVyh{X|!(x6>NC^#R{Kg&p30?lV2}Giq7TCGS%G)>$%! zQEc)D4mPL+ebN$L)67I%JSmCLK3VWBUF(u|9!zeN?vM~>@P+C*@!z%M9>cqX&jF{b zckB+UJJL7TK*o7Q-8haSlUsdS?zO4dgG8_WG`}x-i$l|WgWXchj}ATMbo)N=7j$Gi z*{vLQ^j2pA*fn(v)tOFTSJaji^8iV;!E)re!jOnCj3EG_pYmNlH~<LBfp^TUm)Bcx zEE*#LB;~|Ak<*{vABK9idTHdghAv0ZBzdA%XPj7BC{}Y#J(Yaji7xgbMv{ZBw!hzS zIOLO5##%Cvi)15fqcqS_!QIPFFpK>J0@N@(h|*!Q5^kn-?y~y$4BxkI{miUm$uLX& zApt2q#&@8@%ws@0<#lnwcGdXx3?R_DhLfD6j6(f#5DY_z_$swSnu7FSZJm`JizL7t z3<MqCR-o&ha&ARCwci&l4hS!e*NyT`=_Ssmg;=tHAd95%FpET>woQ^N{vXpP4y&O4 z=uke&>!G%9Sor*^I5)A0(YtIDac<@A&ze8qkW(kE<24*ihJyVoDsBB~%LQv*=?aRh zr9NsOaxSUJO13<94WP$Yhm9<YTm+>@4DQO09uAR=MSYpQ1^6pR=ZvLn_IpC!I}-v3 zJ?P?P{XrzpktVm5hIlE4NE_+fg7=2(%cZpYlcj(ZKjPc*A0ZQw>X}^=miGV4mi@jW zow+TT?ra&KXe_!D^+lZr!>BnhbG6)3b8X{OsKSgGGUm=a3kYFCGF@8D*v71oRa1r; z%NnW925U~ezQBhtz!a%va{|P8yGm)A^uzb6dA32U>sC`OPbq;?bZ}2@qSf1f@1C$} zRdy@o7mmHLAFw&^m}_59i;;QR_ieQEBz`B`HtM1I$H|zTddi>_{C)uWt%^qkloQcG z=L-eHsHHHZ8tVIesD>x?7e|L=l$}{O0eZe$&+4$H)taS?|EivdPB%w2JdjPN96fs6 zq;m_gP?lsxwAu%vW$tGcPfW*>XkrI{;13AlNaa|27+o2`oJl%(I3u6i)-5}Ar7F|p zl+JTn)Akxkg@Wb^VLX3%6=M9!>~-O>bWF0Y?e+)&$rLrSHRCrhbixHwsU<0AclPb+ z%<aFM%VKX1KmRH<Th}quF*5P|(Bb*qCb``^^UC7-=<CMK8~yJ7T&b@!g1{)=$HYs4 z+LfivLO?Mit#*RSkG&qAJ7-|?*6nG^%*@vG1B0XcI@Wc5?0)<;$Lu}GL`UoQgX6RO zBf~+)8c%v=N}=u6+3uWFml3GWEO_h`??h8!acnyXv3*@=EN=bk#{~rAN^e2DW{Qmk zlWIjR<hKm#1J1ySvC&TrBl4QYnkzDX-ktiA<l|5ANjp7Vh{vX!J-%U4LB(0N_SxHL zg^+#at#qEVY%*v2jmiv@9ZrOAPyP3s2pf|JXCBdyR&8$eL=gjhFu`bl@8Dq1lyV?2 zn8eAd<g1GS#T0$i`co%Na4fkszvJ>NYY|qY@Zw_~oV>l@4p=1OZDJ;iU>3INkPyKU z0aCZQss}I<0Y~(=c<e4H*|*eet{O#5Z}l;~+5qStWX=2Jv*6<ZpS$SNQxi|i<+^3O zGW)e}q^eI{gr!6Jfu4yw*<y{jvsyOX8BzYsba7L)yq}J|#4!D3Cfj42-*Nc`zSl`l z!+ou*C(uS?kDi9>>eGKKZMOoSwrtnWR&FblRU7rQ73<u6W<T?9>1;^SjAxIF0A<NA z9R}td{Q7$MI>g|U`QzkW>J7PE^YnD{?DgN34<v)k{&;)I!0fH(<9D_PfF_$6fU*>h zmuXi5i%xwHYunu;O#gD}K|w~&#_Uk-)K_N&Bbs7p%EN=>+oor-0)4sAJ+Hx6ZQ^@k zYHfR0q8fTVqO!Ns)LY|>Q|JwOn=so#>KRd431!zi@-nEBh?Fgn8yhKV6lO`r!H8b} zMn+V&{~bIp+Bh-RlGoi5!7QPFobW_{@zcPvu!ky>RiWSu*t40jSLAR6VTsAWcndl% zJ>OwNz)Gy11$NlVfUeE%N~@=m$<J|D+xLH*jfZyvA@QEwe?N&eE5v3UC<<FQl><Z8 zZOBgsHShF;-WdA=b#SpZJM+Y*g;?@g?=s_j`~q%4UTECqUBG;v{9NvbmAnvSTG<MK zZZ*8$L#Yz`!jB<C)a)z_IXD`^+Jg5>@QD!9A0B$i0byN}cC*;`u&#Z(G4C5}B*o&+ z4XNjMghVMWz7P#6)yNizcpg%1&PJ_rSthzJxmo}L@y*y(<$(^Dths<?G1nr&xm?Kx zx-VhX^=N5XR;w0g>R4nbOq|0n(MWuuc|Uk$M<_?DU86)S4NQ2AE($B-Wy>qWvu(s4 zmBGBAtgt8izZ5R<g+sCBL7snH`l4~iS)~yz`wa0i=$3No*p=%}Z(lb&Jmxq>pERoP zdTXE5=qo*Ob#+o%vsqss@PR8295c8sN*~!Sw8djff{z=2jUk7WO*f0&7TtEcex9G3 z9w`lDjz+e2py(-2M(EV=Pq$BMWVW^^qi|;2!69Sr#*Sn(Rzo(}r;&S><IYI#*oYyw z1@xOc_|U(oBoI|x?&ojEf<hIQs>Bc3oQLMxYC>%3^hJ7887)K8=(NQM3!61akqD>8 zUtAWvx^i{RypqJN$w;Pmf}B=#wIMA%<{OO4acZ(oXzEla1^5zF;nnVEuw5<41IP53 zZp>_Y^D41Qd(4iBNS{j>+?I$)4MgLrBCEVE$91*nDIy~h`eF}8&|H(1xCktDbNm)` zqJ=Oo(Og^Z{mK!?V&SkAOx`aw`ydFRbD}7zAUKn(qI73xcxIirI^NyP-@K{H_CwGG zo`F5GE0>{Z3s-BPmlvQ{FP3YhE!}K_-Z-bhy*QKc)Mt8z_4Ls6vze)+C%#AKGM*or zenoNA^s<UgN-9pz6L7>^BojJ3O^*Z;k&v8&a*Qhs%zu85Lt(#-4iD#KinzFBtpe@R zut1u<f6K$YRF&+df0NV(({dGlp0x|p<b`|oYg#m#K=-@w&@xrZP1%3Ze0UN}E{Sz| z*W$D+-JO}CxZOo{!On;IoK=LAKn&;x=AhXL-;_A_DyjQ&zY6MhGc_7gODmIEW#wsH zRYeM?xEfv<kE8tkZg)vqS3)e8o{*D6L*a@gn=0C>@_ek5Ff2M(PxB1Yx#8X4<g7UJ zW1f?B8F(7eA(Y)5URO{oNKPtFP}MV<WinO*J}oh^rYONXx;AZlb+-y@)xR!J={!oq zN%-yGXTXZFGU?wW<|Ph_CST?jiCO|&wNfct;fB~~CoM6cZa$aK&tkv7=`XHseaHJ$ zqinAhn7Bz?N*HE8h@j8{{ds3?xCi)=g}V?g<}cLRIYPKdzj2V~<W07BdtS743yVOA zNKRl-(n<KJ)V&hWa<5p9s7fvuRUv(Sfwgg_umkLwHvS+Gx}HOBx;nZ+mynf|aXur3 z5*HR;Os&|y3FDUS^#c)*>(lQ*IeL?uB<GS%PH)KlhY)GU7Z`iHuiZshP+y>)Zh8&i zKK`m-G{g0-+KeZ4!|`wh(%4TMYQM*)kJUcn-v8tTY+?qsvIlvCWUfmES?eEBZ?Jh& zL|AA@Sa@jI!-onUEDH_1N*(l=@!hxsQxzYQQg!0875F=6ueUg6Z;B1g-F%v7o)y}< z_o>*hLAD55l7wFl4;se$>osI7XfI7-w$K8?f7U~n){tI6fcy)f>jrbJwpQ~*Y)G7o z=Tdwm&QnI@2tBj#qX(0sb;c3zvvJ5tpXmIOoUEjTQaQ1Tm9Aoi;Y9Jl@j*C#NLrhy zp@$ymaayE4z$+{+svt^^>-kqN;Sj_n<F|XmW#`SK$pA5OtLCRh2O%6O8`~HhrHo+i zPdcEDy_I|CU0&<ap`dHmwVAb+Ii8$U*B;v-FlWzvRi?>torknrB{h;#Mc{e$WxF2k z$>9#~bGUxti2UTk{N}CvV;dV8+(locjYkq9&{)Ikw~vjY$e(+d;ff&7#9o4!^t9!9 z(n875V0e(>%ieMzDW6@_P*B86V;8IiE<wiJJ@i?+dy6QMF7lt@+V+L^a2<Tc19k$Y zA~u+-D%t$6mp@2{ouujI@d477yk5-2KOO$1_Gbkt{j(M8@052z#rCJtXx+1w+l#Q4 zN#CH=ssDX_+9Mzkzd*Ym_*LJU?*FT3&+l*9()EAU6YqU33imxX6|K*x#xaDv<QNwM zGKw8zF%Cl?B2Yw(BK`{$U6KX*L&3*4h3p6P2UihSN0mmuW5`|+ppy{{{;4pM7_p3` zMoTeE#4yWAjAG-a%k5Zp{QcYD!CS{=aRxq!zK_sHuIgTWp!DDqq6_cV0D(Z~+qD3J zuv!CF6sV>-5Cqa$vS?wt#!u&YNZ#VFdz12C0B`VvP5RKACGOGZ>zZ^sYE(UA59Gr{ z;av-T%@n7_cK1fy-ym8z77>P?eg|&Bjq#fgF#uw4cyS8s13)(lhINdtSeWNlNBX<= zMy%v7o@__JN75oOI<+f3mD}!1$ppXUb-88oG7Gvwa7J>R$)_j30<9@Qp;k0r%2UYb zWB<2xA=MW*M&QA?P1Tt9t#S(|;C(%QXbiQCvjVhR7^pbcRQBqyB7d{$wfEutJ941u zcw=61Y`ejv4~{r*Eld|4mmZg-OTq)N`^UN-?D>Go9(6E=g>kA(R`F2V(q}#NdR%%v z3$cN+n8Ybsgfk%_6x;*k);@leTV3@BwBeLFdw|hv!MV&};72%an0{tC-azy&gy#cF zVtXql8yZ`X(KO1qz_!*J>0qE#g`5PFs6!8q3;d(&X*4O`4A!r<xqQm#<|%VHLyZR~ zNf|s<p+KlA&@{VzgKGoNu!wd^xp_vcATx?Y438iYqi_kturM--dQXy@JkcS3a+o$M zR~d`t22yAJomHUSYUDXQAni|p*$Y$!f@|oG?Bk1s+$a(;B7)euFEmW*4H7u0rnBo` zqFSf#M+xz&182lzO2tB1wo<{3aSgNp?>PY~6OyWTswHBSX<3SwV=`r8Jm?-)h#e31 z^ghuSvbaPxTO46VtVFvnj#@}LALn4=?PcbGGxKF0>WLtjhba4dAUSURwp3y2#@Im4 z9DeCIqb@wUoq)LWZ#%~;lwiV&*UgnxF;G-=kL^#p)!}hqI@!2DR_Y8!tUm=Q89Q1e znilMHVra&XeQ>AJlMYG@d|()_GBF{itobE}SUJ9^ByM-<Ei%PRj-g{h9<Xp&77L3z z%zWTS>-_N=P%&>}4p1}eq4c5fLvWH~|HUbl$mo-3MB_;tTLM2Dkp~so#k=d_eZKR) z&<00gqhX96ylGz4t9Fr?Y@w}RjaJBT24uTVHvIyxc}`d()nv;?ShUx`HRP;^nWy#7 zsn$KlfeS~JiL0jb2KzUzT^_}369*690gApFPr{eyuNDNuk0fr7zI}K+AoTeyLl`Kz zXln)2(p^h@@=VaNaBh=iljX<tj*&s+ny!hKr7aFUp#15wTKic&WaWf>Aa7HHUH6?| zKYFgvp15zl{4O;$WO)L5a!(Kp6ZgkdKJ+Ef#D}0~7XM$NNc`-c?lqICy<ItpIqSoH zh~#Ilub7zqh3v0Mx5ShH{h&=lKV2I&J|5OY?v0zr^qQOiMF{q!#JUbTTz^rYjV0z` zF8~i(?zvo8dr;AzTck@60m|y>-(TK_sgINw#+U~0@k%{$D;qFvDQ0Kw*u$V=QYnb5 zZ*{q$2=`(r!%wQ;P!R-VzBiU7Srfn>1z~6u{PupTdijL7?D%lVf3vP-p`OgVpmDb( zd6k&KkmVoE-pLzim)n{D;uoRl6a8|(xp!mh(PnIUoJt?OpOTu1YUfT~txm}-Z<gO8 zW3}&zbydg?sK&_EwsOC;Ci01^!*tTnhU0=ioDVfNQrPfOdlmwb)Q27EL>mb%$0X`! zoMtVOeow$yHMS$l;Hr8`J#@2URd6s9ABL`sVDgp2QglF(hs^9I^2kz=p6`*=sfM() z!bXlEP%|QA{#~lM{znt`yU0GHuD4`C<Moygp<_)~Fs}qghgXi&nSbdzlqRnq`bghv zE-W70fCV;jbF(6UhXl|Jkei!mvEmK}c6SH?J78I8dZZi5bA<HNkC5zz&+@Lfh7`OB zv2!RRK0*0MVXfo#z1Fd`$<cD)vF|z`zyeIM5>vQg;4lT)sVGk8Kl*=Kj&$|yGZ?%w zQ$~a0itCBnVF!>E83L7JkgpsS`NkKz$;@sbk6ok_X*}Wsy%KnSM_&D&652xo=rEf# zP6dx>r?qWE{$Fu|i@!;5A7N0vQY8gSEAw^X`pU;0wjWq4dS?Uibhzbrhxd$ff1Lk@ z4QU&Wy9wb2Ym6r=W0$VZvw{9;JA7DwnBe@W>DAH7`A>gp<VAOl>9j&8oa&|No>p{3 zyl)IYAU>qoH?k<Y4?1eUyOeyX@v46C*VfwSHpv8wMoafW4Biy@?>wjf&+TPjZC1b> z&a(bLaQTgs!}9zzJCie6_h9xi`0K~1cNi@!Yig&DX;ld+#*ERJH#D3`XFUknYU`O| z_UQf=xlzbl*wL0<oPQ8pZT-lxS!iEi_p<xzCpXKAxA*@Cdye|B%U=WSGd9LQDqmS# zlj-c0*zP=f{>yCrfxnJ!J$!%ZbJX=#ffYNYwR(TG-i5t}D@4#g0o;mXF6kHk3OkiI z@T=kZn?`gp2I0;oQ$j-$QBj$J?R%1`t(JDTL)Lt4qJrUev9UMf&@rX}qC+nJQfqvV z#bfvoKVnsP2{ghG{80E1phdGcun|I69?dr%1=Qh%n}8^*B`}_zv!sqE+kNaDaBHwW zu2~W}6aX50<TvJ;t?ciR5fNGnhjJ^bU)_&*s}(scji?VX*s)>GmZ}F$ziJ8rFnNEA z3mEdE&c+xr+G%`9Tnb2WBL4(m>lIa!lb#!sn_MXa^81npC!@`bK|BNP0FMM?W_-@5 zT$A04J1>VmJwwI4F+XT<0aBDJjL76(L=h4)@Or7f;R}?;^V?r;&0RcwwKOJ`UWn_@ z0LR=$pZoXQt;L3&S3{p~FSo(}0UMY73;-E@dZ9Er{rP12G9Xa1ymP0L6N|-UMm;LU z;B21<yvw%_1%Y0@vJxsEy?{n}U=(sY`q$69H|jR~Mj4rLVE9YOdma~0MJF>$ab4#~ z)cMU{HEv4LvaAoFjaeFm=K@kZ`2XA$%aCjLyhmgeuc_CoN#`#hFObex(=IAMHtRlr zfqWr;-uyeFpKtFS2_(hXE!aHW@V=Cp$@990=3jZ45*0o~8R~(r-l?Spxg8w{u{aiy zO%A3m4DDZ><oq@GLJ3bwbUu=H+NM%KQX=)XqbEQC7>L9h)YsNJC6GYOh0~mX3eMXd zqx@E5>Pk;dkI*1g2tr7BEAB=AWd6PUYe5T3&&<qJaduKBf*&VACFev`BgEuV+s~}! z1lxG6b{qWed^?7gr;s)&QZ?d(DGL7RGD1n0({B29NXoS&SFU$u6}*xL>P7R<z;=YJ zNrDP)0umK~cP!(0-wS%_IdafJT_|T>mLF-nIQh$;r#MP|^-<qcK46d?;!GQDfBwp@ z*ytM%t9RIFr|W7a5L-;>Ip%AYgm!79t$yRh7*NjZRok=h0?rnhm)H+Wc6UwPo^YL@ zs80B}Q#a`J;ym#sZ_@XokuA;87s%5xH%ECymDjCkllq;Jq)v^b@!gc^oH!Xsl0uNg z-dI6eux|2?9}7alLP4~Dzc1WKb*yNrC?D<)zp`r~0yxe+`@^qt<<pzC@T3?Hz4#2h zto;HW(FOyo6`GnbRTi#+Ji8|6%`SQXNUd7P$-Z)1cv|&g>6@qPzr5AFJUiN1AH$2X zz2B`+eVA>yr&bbMA1uu%%(u{~Gb$`mj@?M8uK%`pyuj~=;)<VeMuD`ymEN4#A}Qo- zu7`5`lGdT?B5buo)Ur~j#3_YKam}ZLHZY$4YQbtQ-4gm<8tqbu6@zaX@A$*``|7N} zoh`&Je>-RW>;A;7^p>$-oy_H$pgE%|aU+5PL(mQ+?3l?7@+mHV1uU_Xx8`hmoLXr- z<ytF}pax*f{vED`%CYS6O^`$r0@hUfIydP_!?$!p&E??vyY`zW2t~k_zcgHcYSeIc z$-riS115!QwO3kM<1H0tE|)n-xU%)}E#oksgR<}`vp(mISl(qGs@`->E8Oz{JwU?0 zrxzz9<QfNCZ?@eL!H+QM$F9uq5m=$YjDZLn9#zTwvb;KWC!l`acwM+&z``Oabf=$2 z7XO&M5Z?d1aIwqp@7?U1NrUk07oCMj9RKIt7praB)z`&ueR5FTZs}NUWgNOJe*0fv zZ-G*zti*~|Hx46KdtZXZ*qqizr#9hqbUJxOgcWIt$Y&!JyY{96jzPf_Jo{A<mX!!N zazt))(b}s$O$cQQu6QRy?-cT@y+-b)R0D#ato^RX=-vG;`B{zpom8trPKjVm^f!^J zLh9ILSDdrz@L3^N*x9O!I2TiN4muS6uqI@famVZmxmEsS7X+KgqcnCV_`>x%w(*uw zD7$zUGWs7~wvM5VAAxtyN$<mon-}KqZ1^{ZF2agd_=ayr4>b48K1MAA71i5CTQhd# zip<U8t!e9_<(08_1}-&ha_GO5lu-6fxInfFQFQ0@Mjhu@v?vIAapdF12S5drxvWZl zp!>_Bys4sB1j;viZ?s~At`++4h(hZ@X!4HU3#enaTf|Q(*+m-n`<Abdx%+ef7`Q~x z!#tDQEgr!~%Ix5;1w%Kowzid7Aa`*vj`<rG@7Vu?t~MU-wpI}X8HLV`tgu4tEtd;( zI10U)QDb66G7@1$w@9~ys6$qry{6@)Kvp5Li~#}#)~bbbSklYj)k+a6=&t&SsO^Lh zVe0g_bdDAWBHv}rC+Kyc{T6ZQ=B}aWEPy9!wV`jGeJxLD?#_v{6B7dUk}bj7>cckh zPbcYE7+7iPr~86B%pwHZWkk9p3Bj=P!<H7J`NKC<0z)@Wl${{b(<oy`)Pi6e&78kg zEzosgWg7^F3G{c6m}$)V71=17nSy3(Gf{+dNNl6@uP0h6>^AL1cABN41xx@VervE9 zEdu4be~y3=vX^f)5;^hliD@h*Ej=!dmS&G!+5XKtfO}>Kge|_dVAK9n0^bqzn6}Ds z11S8i`sJJ&W}iA2;kUiU(-?`&oK$&*kkdudO94iUJHCG_^scKYq8E8cJm%<g!QXfV z!fakP%lf>-y%8nFQ2kp}T=#_Ol=@#_O@o}ShzhZ#|K7Ov-=f0ME$+_e!f(HUy!o2y z!L;~%v*D2!y&e2UI=^F<V-T`>GqE6rLu-X(`C^Ku*0#CRUq$npNmh}VdHM;v`)`)7 z_oKh_5}jJDVxL=By6Ml-_hU$!8T;u+osAvP57|9VL>FgfeQa&oGG$^k8;_05p)q3E zSZsLCe6*{iR*;@iUsfTm<%`6%rtuT|*fF$%e3~BD9-7RsBbV0Hy4Dw!R*D%83?|~> z*1CEjkxz-;XZ@U_)ia#p(bWh5SETM~5QfY)75SsPVz8jFb~Cn!d-){Ot0}qM;7+tG zQ5GAIPcK;7^t*i(d^FP+0|x28+M)xJ!#{NNfI6>|j|;um7?b0P=m1J$96-&)pu^b$ zx{Ihnz!O)MRtRhP7dO=LSr1r>py#am2Y>Y_kCN*i!-1MtPAM%{K2Cd*R=LdT)V!h5 zA5AWSjs10`Vc*!kz<(bO4TLY}HHqvD6>IH`rq`<t6Ki5!1;h7UdRxyxwnefJlonbB z>+9?5-&nkJrXeRC^=5U9)Tpzn;}iX^XN>Zt-Vr3K_N{5Wqc?P2Xs}3Y%ZFbc+RkNd zH9Eyd+s$>m+dM|dA&vv(iB8&;!7{iu+<&tb!M)U~&>lmq{U1h1ffXb(>#_MFng7M` z>aX6fPmea?)w<xrUHeY-z@pWh`^rsVm}}B!uV()+RO{NB=V_y*m)f0$D~(Wf<?yO^ z9`X-}OLylba@rPI)-B_(?Yndm^Rol8ZnDdg$d(rK1(`+D$+9AWKt02giTQ%C!q9>O zVU*cykIx;{2<MTffZsg&ukCO#SxU%3#~*iuLe};_&ksJ$%gU|7DeY3-%7gg1`4#+Z zMU_RYPrkxphPUl+na1NkACeGd+JSW5=IC#9qb^jObA@gQoj(-)gPx?TTm0wz=!<h} z6$3B2{<P1z9laSC#PbIs6yKwLY$Lghlb4&7rk}-zSUH-E|19KSePQJ{=A<53Vf5DT zfIkIe-Fn#X#he~dX=Fi5+}r-v3i%Se$A5vYFft?4501XE()HIm%~5A%a_7zzYR_e6 zapv9@O%O+dBk@C1wGRfm2CuuBh1UKZ`ED$1kihq=eZ==YC`$ccxsd=N2zz$nT^bHV zhD$a(4DnQvmD$A-KC_UoBqm!r+YdidZ#2=Z^l~l8s-H~t#K+~)+O}9K%5v&_(9)rs zO*(8vtEzwSE}NZGnw~1kNadD^N%DdU@9psx=OMS*IK0JSH%IfvYfjzel9qk4BBW47 z&Kqw*p&~u4NbFLUE7KdtiOT4&`MD)FlaZ1ppvQ+YlCxcdxG+lk866Uv92pRoz;$HW zQ4@o(DdYfG2*c(E;ISW$!$|0#%n~~S!k32O>-s{x0_Zd!txh(1PuNtdG?$mk%@(9r ziDD$h^}gDK(<q<3v-8?d=Pghu`Md)7|C)?*XU!6y0@9n$nfV-%o5&sHMso1W|1-4n zNJZ@AoNbUB%keKRnt|ov8k2cOd7fItJaC>W&m@mozpOfz<{9VZJ=<K1iUG&>G*LXN zZ8j3wKhmSBc?e791_W>`?NfIMzF(dfm4x=fAJN+HgAbzRuz5>mf+%maBW%<sbZz)2 znusKF(zN}LNp@MYSiO~<>6yYmu`eMZ=l9~T%RL{r@A-P@=Nc;y91bO+#Z|JKk4G@U z#{y&AXwzH39P9%h42l?wNy3NZ5kqZEu`#hRQE_n*xY#&+93eIc6ba{P;apUjy`Soi zrKNv0Rv8r|1JA-;GHi%{#wRB8()^8NMp@MVHxx|0_akk{SUyikiX|7W@GX2gIp0#) zKTktja*E{{W8RYz`vJ6~4clg&A;3Gl;S5;2$FYjvwZBWc;^6G^J*0pr6eO!f;3C&T zWYvrF_Z=D=#4BwO?D7uTWt+qYT&0!R8KXJ5k})BFe&o9~y?!<MHsn~vp?WjrrUpJ@ zrO9z1`xi?Sr0Yr3Lw?$_w{56q&A{smOzop&2T_s!x+;bwBLf;(g(O&AL|?XcD0KA3 zL_4FLjx6Gy7YYzcN2}qy?veaGS+J}*;=Hk5(42ssIKm!zl0lX+%^MoU(|TPQTho!W z7R<zLEXC0%2tult)J^Gaokr98lf7wP=etly`gg6jqC}EXxj6~TBK63Tj>_DO8BiIv zu{f0vR$3(wsvk|AT)Z&Psjd2BeQ^~Ve@nL{QFoeclo;rVit?eLE>l7Sb4oaR1JB?% zXo(*OI{h`fm9$er{UP}x4?cXM$1rl94jmdW!1A14yQksd`L?llUc0jM3`f6ZoO4g` z*CP23yXXBdJfmcMt9kIF0E&aTr^UikEqt;k`c$Fk3C}Yae;XR&5H#~ChSaJMn|TxG zEaQ6toydthdN1z0hP;XE+j(GmI(_OlFYn^lXD{?)HU4=X6fOy0WvtR2erYsyRsa9^ zU6_x8t=Pk9@k~4r%^?pQjj|wMJ87Mz)vND8IP;^5Yp)UDW6JsTIve@B_$lTJiAyrn z_IIb6toIPbZ`9<j_u9_-70TRI6TcDIF*T6)zo7!i2aB+x2V&D#`osgL2^$PFnX%Ct zGjpR&{7f91tZ_%Se52phpL?nI5+^W!<~$2AbLQ4`o(twA+8KGWz^e~DNV}MP8!Gth z6h?(Zuuy+&#?8<9|HOXmTwF<7#=z!&kC52Alme|1z3cIex~1GE#L~?38+pDr9?2Kb zvgj0<J>T=TS7iypiQypr<R}(}h?@}+Sn*@CdWaBGy<#SLZ0ug-Uzw5%_u=>9N-JnO z(2D9^mqEFxhNvA&HjGD0H>SD?B4xeL9{2TFjKN<?U%}+%-n1MCY40<`)+<lPr0o+R z)rL7oR@h&>pk0P?{46$!S;z%e1hTU*4K*NHL$XJHMN$#cLF52aRV2A9no?vnu|DM~ z%Bqlb?c~BF-)`1nPPsgHKn<DmuGE~sOWHj8+G>n?pFQg8)ZYq!AbkKUD)UUpgr-aG zd?_umkp%c&iT7PK@{}tp>?x1B&!&o7h)ojKiyQpenZC6(pv;D3x10iExd&JX_NWL3 zb<Ju@k<`RiV#NK$r4JNK8)aBIlTx0qYxzpB&3^Z;i1M9lj^I&HYc#p{l2Q&RM<<~= z9ws}MZ5EfP2B!{=JF1E=RQ+KvL8lsm9v#=h^cx?%kSGM<h<o-(kkTWpx{{-)V1~JQ zGKTH^GUKDuX2A<*@LT7CyKz-|?Pmf4B*^(mCB@u=a(XDdopIIHFC#iKMbqQOj`}M{ znQeAuX3xd&<})M4B_R=kEFV5@*<hna4AEW^<t$3n_=9fM(t+S-ACz4%n=);d$#TZh z$2UQGF_s^Ru4^BJmSA<f!gbs&qQK_%Kg_KR?Sc&)EKmuMtrrNz)3nOj{m<TGk6IUL zkL#J`oyQucPc*l*{UPnlMBff6^X;=hAbC!A)n*o=D~xq`iO2TD_Xkg5&ro}KSR!hi zGv<wZdhW1z9CzG;4n))@ys0RF=Mc(Cm{9x6?8{IuJm0y<L=)+$r<Ztc1s2$A4Do4` zaszw7=3ZTq^Zf7+NiSb72Jmqo$uInF`3q5S$?o~ox>HnOFYA**Tatal$JZUSqU=Bl z%IRg5>>bW`%?cPuO6y(uhUqZ3gT#~KA@P<_OlM?7P&)()A;gm)1amt~8>I(l_k}(T z1yiY1aKbwD6NPR6nKTUD$b?hD)HUdLVo(gs>BIdS^H9@RBEc;B6!fvnoA+He&q57J z<OCDaIp|$v5bDhZ+S1=enPl6p&u;v4V`JLxm>ncC1`qE)_uG#B6;wpx4Ti>tB}GgG zr(d|IPjH?~7#$f$-ErcVYs@o|Yw<u*hC~7l8gq`lWaCiq+y=!PD5_9VR!I&~M#!Lb z5{LuJ%*>bgrd!wg6?zv`pw1!%L8X7JT?WsxewQ|xm(x5QnKXA&W83=pBzr2(Oco`N z%AGtoH7oGi*cnjp*)xlym1hn&Drp=xc)__-BlPL)SQo5`4uF#l1qIm9P+5r@2qGB4 z)wSqybjQ$?d_>EZy3YVpcr~!lAfWJ?zmtbQL$=zJN2iO^RK{Q2af!Om(7*6nfHaHY zUC(O!;3VS7!DYXVVZjV&^iY)az7t*6D5u_zK4r1w7_&I>U5|f_j7*TI{m9!_EI*{S zFlnAPyZ5wfy!YXEp)Y6M<4}js{h=;ess7WR@rmzssQ8xd98WNu{c9bHK1PpoaV<o9 z9}YZ9=Qz6-ID(_e;icAjo=q9{0pcu0mM%w^v>xOf2kr`}L@5mr_Dpp!CfdhQ<Y03N zebI_gg$&AoN+dQOjcVl#Nd`2i@*O$bHZlJ!C6j#p!f`&?B)$1os6q_nYJJt-o3IvJ zlqu!rXK1H>HV-HH`9<JRsbsAbG2It;8QeASW{<K|qH4TKCi;>>INO9zs$J>e2;d8X zLP5!5mFAoJJnANV%w>drm=y5Bc$?;(Q`CoBsRw?~(fjj*P>YkX*GMk{RL1c&;rI4F z+Cd^GMva>8zD2H!JriAiDNYoy-7K*a8&^J(-?*b2DW_thmufVl(C}<*oZBot+J?P* zv6;DAO}>73b;k|cI)$zr4iAw@;lPORkv_IzPG+h?AxqcKWLsFt)R(T|!xQc56*|n` z4-P#x8HknC;Gdicm5C?FC%aX4(>;Ftt99NX{S>cDC!>>rGJNNSG?M`XKAj(})7!Lw zqBH^${dY{UBsqlH_<v0I=AFz6DA`5uZ$6>t*zXKK(qgt6q;Pw*Z{1NvXKF`2e5t#? zAZiaCc3+R<u4w<VeJQAtWOlSujatUHX3n_`h_H=Enk8u+;T@SoI%kD$@J<l4Vo#5u zTvqN6(YGC}9Und7aM5bs5;@-@=Ne*c)18Yry_9d=N>oN&VD<d+6R-{f4$9$K94hRm ztyq82x>qyTCgZyX&qjCA>_{slSe%D1YU<sPzmv`N#4=%kIG1j$C1hP#4{u4N^s|Pf zXltS$va*}zOF|_^8@(zz25?i>vMYwSf;(Ed+*otVHtWGEn9m?)vhwGNM#!P9`1@Ar zvh-i7PI=--j(ui5F>xtx-&c{|?DsJ8KFhzRCHrYcYeIgEpG2Pg5%cZOe3m;GkbNZH zKBMDcjXCnj72PYfklGIiR%j!59>mv?M7jb%sAv|)@b~kh{KBkd$|6F=3h=jK9n0DQ zj-)#BikF1Savu#3S-ZVxRaK}_X}BLXT~x%12BcVeciDc>Y6b+iE@T=LCZx)xB>+tO za+0M*?m64>{yP^UjoDv&l&Flxz{<0KJT}obNB$^`u^@%t5^`;5KYsJW_0PZ$w_Y|S zKD(iHT`?M^6=wqyuHIzxThj%fa&9s|O0F@Pjn5{Exq|{hci3K$%jOIBkB%s<$f7&l z>L@lg=|s!CUz-B$soKswz1^9D0-xD0w~e+R$Q8@_KJi2H$HQvale0dc4m<gQkIs~R zL|lSz`iZKxxK8F?%iGaaN)pq(qo)UJ_uquxy44-}-;hXxY1p=do8yOIw`Z+tDBAmm zc5A!1-kyG?S-wUO`2=M$)HPy}eM(MBQ!R;<<-`o#-w2?$UDAsU0S|@0w&v^DcbM#2 z9|A=td}w-TpR6xDJv?-W8BGNFu`q+eL5$;Mf6Q@_fSVGQM9N@7hF|U{Iy-eEVmm;( zDbKPzChaeyS!eMnKALazm0cT$Sz8ap1X>GXE7yrE3@+{_@6~r%Zcj6dvqb2tpHHgF z8gYhk9g^|`vD20@EUYD$(>Km%<;DT~;kDjt5;?E94S_6lhgC;`JtM9wyUpqs>peVO zxWM2GB`G(_J+atXSolgB*t!!%lPfXFvCBX>tx3Gb<w8zQo5c&Lwh(L7cdwkhG;ilg zk;Nv#Q3(-r(9PnncKhd!nk!{d7}F4US1aC>of5&HiFz8t&M-==(P&fznG)X{JAe_F z-JkgL(SJcEKx_@oN?=iuAd)OL399baHh=mr(dw;HW#UBpvD;g28=3`pNYg|DZ$H~M z_RU5PdRZyTI0;=g*La=YlCMFxAVDBZuN?W_oldW8ww8AkEdql#X8qpZ=`t5wz54(H zMCjXeaa>7es?V~)I>zOzPp>;cz|(>sb9K&DoM7==iAzl9rp009v|v=5Y8^+!@rHVN zc6Ew!!|gK35dQ6578}v>j-)#Fk-o&@<RVC{9k0>1?B?~8un5+2p;tAtnx)a_DLk6# zLqLtT0_v++7$H9_r$Kf9(G2Uj2pjv3nhV`WS!nhrGlTx&py@HF(wosUkJsdma;0!d zW!H9tSd~(=kva(yaxL?OKZoXD=B3&M9sdDL=G`eU4Z4%;In(U&CF{;Jd2zM-QK&SY z-6VfHplo||{*-NgPB_L%V6Sbz2F4jeFS)!72zO{;_y$GqF9O~>h%MzG=5ZKl{Mj{E zrqOFFbK|5q588tuO?=adhQb0y=NG-x=Of$gKK7Wq=bJ7))ctaSF29(5|Hg14C2Xbe zML5Ji;5|Q|PmDMW+o1E{d9cgVr}mx8cxg$B`z|<VZn-Nzr9XAbHStGSF557kB{u<D zhTq@|zHEX&;$$MF#7AF@t!6>ngiAuD$VX3a{65P#)jye0`JCW>?!1erVz7KFFHWl) zExvYUs8|rXRb%@DrbjyRRM(hO2D4uNp6$!vq2kn<U>6i0MVFU)bQfoh8!GnUkRCp_ z<9N!)&ws|3rNfi|<P=By(~XWPF)YX)nQ!Pr4Z5p_E4)DM5Ny2Y=Iz}5X%T7l;4~fp za+nQILSSY~&ssRG*H=Jy8<C+tCWXZVeSHS2M_F~uS?FBJ9PRbRtiPjs0XjaK>aUI< zFce$T0@4X!N1Uj5x^#DoS#|F?NSJWyAU9#l?JY3v&(DzFm+Q%K{=CGep_hu&mnz`r zE;mF6yYJ~o8BB-eQG%#>wA-;&=N@t5aTGT3DsV4iVCwKT{i&knCa2<_0X}l|WO`Lx zX-0)uFL`+(0@`5K#Zq+i8HmzqWhLdKu?QL!Htf#cc_b)6OIVg}0aRFK78xrI1Oa&| zK56gJ1>DI!T)?(9lH6|AYLr{gOA4RmcMP$DuL1YMdUjIYj{y&&Z)7NZjHh>4!}2&b zixh<V*h;R3Ilfb=J-<5l(aiTUg_Vy;$NM1Eh!?CAa1FbA2_I-)g+-#MOzuTrKYWCb zB083C@5NFD?ka6-+UC8ItR5|>V-_TH>!pK~N-sdh-p)v{FyZ9>Dkh>wBDCvbjkT9p zI9=vo><e0#@7UPk$vs6wB|XjCoZ&Av&Z$exORK3-@)|4zFH8Kdrj<TE;wt+8;$4Hi zU}3_kDK0Z3om)=`Ix50a17It_a4J0BC0N)ccrmL?oBb2{)QtgmPNTxEc=BP?)PO*j zG~Lf5y0GDp?XVTX*Uvv@@a4{+1MMOPEytS}(hkW3k;mVN&J7MuuJ&a$mxln#SbQh` zlY4a6zK%u9SCZ8e>}p0~c4b4)2h7^KaaJf`W?ihPbl(ls?a9exVS;s^hvX>tFGCwl zPUZTh%x1kBE|2gd?4Eoa2fwhsS+OOokJ>z+u9`7O(E*y@yg;t0VqXL9gzh`=7k{^Z zZV@8FRb8hnsQ+G;6a4YRw8`r2J&W<90cOCdsK+_sfgLb^{y?s_KkpgIq?t05Q2sY< z(a~5)eUxf5BUsS~aZ`0A7+=k0(=W1n??M2#H)~h?b{p`H^<q?lQ%WQ$c<Y-#gAUN} z`J#keaHTiXBkGtnNUhASgK8!cbnD)<+(QoeI26TM`ZLmEN9Or_CUmkZ4tI%h`G1p5 zqE$`2AwN|~aUnQ=7`#HVs3Pl$dGaC3!*?RwnSdt#aK|vMeMx9;r3oRgWCsBb`?4bF zSC;vjRQjf|ANfNb`!I$ZvMRHyEIBc{DG#6B#R^?A;w*y_)8adyJ<z3()V{MK%FyEF z7QLH(p$q-?P3WnJi%1<T>P*fMvVsmWY*E?H@T9%menolPpMQmpnX{##dlW8t&I~q{ z(kRX>V>#NBsE)j7CdS8im)tcCULUJI*2W$e<JUKnn(emNqPIfc%Id#97%{bk`XSTD zqCul+q9iZ?4su&y9Y%MLE!y@0I+32koSlDBWY$4l0MkHM`jhpwr>qMf$&rssAPHc9 z3oZ2Xv4{~~n#!Ai-yJ6Mq-3-st{8e=;BAlsdkpay=ZrAFjR89x2*BJ_P?K@NGvhJ? zXbif%))u6&?ngf9qA4|G(Bnp6>*a-<qF{Ro4%*%@o7txY;1tS^4S>h)nLXJGh<7AN z_c-tn*RM``y}b!3pPxZIzD^#286!$BK_;)qr1Z2V;`*N%NLkUCpRpMl&pqkvZ$n(? zSqmu?<WMyP@8N%1PD=0d5Z6tu*Pnt9wJC)eBySW}dRM^umN1Y4QC9lX@KQcs6wzZo z>p~8Uhw%U8yTi8bKNg(!jC#Q4KLvou!*2aJ(T2EkB?KBVCvaP&KNy?yAKj>I3~p>8 zA*l3pvxsv2!4neletOIb47HcqI^zOOdnGG*USM*=1WFWB%-DD$dx_Nwn4zmwQ#*J2 z8?VS8o@(#p1B~l#-QUv<2C$ho*i|bsp5~cD(Rc=3an`V9`LGXtri~md#woA4Gs5T3 ztF!L&yzu>;LOg#9a1j2ESwCCil?7ea*)-gx0IhOo$QJ&BoOcMVE)3HV98e+;)yN?Q zs@1s^p!IA%gT_~(Tmz{~f_TFHHJpWrUT;v{kL<uA1M8o8Z8rf*3MxW%3$OJF-8zUa zVelQoQ62PPO8_KO7rcUJpMME`8uLFH1n=SR#rW<tuW;Yo7aAlNUcokgAy$Xb=TVE3 zLTJ&Yu#IETrV!EV?SgH!!9|Czf17DTTzhH`aeWo`eGo&Tbd1T^*mvvk-0gX?i%=~j z_Gx;zwlm#B;!mf}XZs;RWXA4kkJsNApHKM;{(inYM_0IS?RqTt@P+hQ;WgdAcG?mE zhgny{QUvW$sL+n4AIc~}uD>WPr0|B|AzVkxe;`_jz_>_%;0v73xk1Bt)oXZv7Yd)a zL{3)%!^el)^q*mZY~PF8he97DALzIL^`7hdWVO=cUiWlt-PVa+%N6T3|E~p(%mR1b zWZMJ0a&s#=c;qurce|BoqReviCj(sA0G6-{*1%d=2UcJQjt8$N@}4Q;df<HkB)U+& zTNlf{3UAUooL3FZrq9;Gzzl4a!9|NUNSSr3a{Ev_@ZRZVd_XN}#wgx#mNYPCLCDBQ zK(MugmAr$g3f1bsB5ICtJ-kUI^ohA`JA<RJCb0}|FS04V#5_ccB!&dsD=$-dPLQ-q z2tj}dJRnL&)+?L7o%+$rzj5etSKnDo2f(iyv`a5kVH9P({$k0sfX|P>c)-7=DYeN! z_ZYzWP|Ba$1}PM`fZuxxQLPL^d^pBIxV_{RrcoQ~t(PI6u~_}AzQ4j89saS7t<U6p zaa&fjL=c@~g)@(Eq*7m{eBmhnv97D&CA=bG=jWf=pg``}mj8S@(7pZ!2jvdYsY3Xw zXSWuL-b2@fR<b3oE;{itV?ibKGv(`&2o(^AVsLvzBA+ATHDONICWHg!y^|`oCDhkU z$sJ?Vhi*Wg{|@z=fp${|Aw(C4Y4NEH2(?-M3Y(Fx>VATFt?U*ZecMKJ{NgM-{-o2u z|7?yV_mKTrD#a@-R=cYXR?-UNs0<df5Tz~KDweR##?bRQvklCR!?nl2iu#?<iYLnM zL9fL~c~+2gU2MpZ;mjA2eKW4SYAcIXm+vPj38Lc@H1}!L{9glKGEt`*eslfTuErrH z6LkveI=$8OFwax|Pv3#Vsj6t$IXXh3DIC@3#4hz!S$$FQl0<(ckr}1=gKfO^ypTd4 zG5uBFlg|(AfGf4CL6mx3c7P0-om=`s(sSY0vuPEw*OvP#o)a+3cWHIvT}aO#No32< z-wf07AOtIZ>ZVw$0f|b{!s4`0AT59!@5Z|cZi1V*EV0i)e&eDaeU}F=Xm>;0x3DBF z7Bp?caI(Tpc2nFGH#JM`I>bdFTcA<gf&VdcLk2Z_(R8pZnqnOfNT*h8zE=-huWyI= zW8<!j+9=bL3OC+Oa1%xoQSt=vePn82XfORA7^JaGOmN9JXA_~cj+zwe;Ah(J4{V|0 z%tGwZtfGa*r5q7FMd8M~@os{f;3keHcC)rAjNL*vie&!|#6G9aM6D+x6E}t;EdSFn z<A8{89yf^)af2hA#RvmxVEc3BX9>%8U|JPu34_x^w2h{_PTwhsjL*lx^52N25jDhx zO+Z9IbQ(|xJ5o^UsF%s;8AV}JHD-}TrRbGO)2nL&tx^=?K}p4v-mMh0aDd%H50IHy zwe~}i|JeLFQcv1;ZHVjqXA)9yLxE2M!CgSmH6ZRefSD4&(2Vm22ds2008zSX!4WyB z7-K!@3&qGkGE~|N5LWhT$T=_UnGYi~_QyOUhgv=IVYSP}i~Y6b8!oU{&;IWMBKExd z$#&ntc<X<_^2;tg2Wp8S4dC`)PqRR`0k{PNYTN(MJp0DY=bqzY%gY)z%j#J^(;FOs z+B=;L5Zpvliao;!;rBjw<Zr2_b@0$#l$Siu?mvGsx<4eaS+?FzL$W7RM{go?VtNwH z=$)Xs!6LgS^V~ZLY}SGvcQwlXkSDZ*NbGMSj*hX-cW2m);T+p0Ga4%d7d_qgw>{b1 zZvp#7dNX9)>9$#?lZmp8GzTh`HqrT3mID*C0$l4#D7t@h$-`vEeh!TAT&w*z0$ZCO z#zZzS`C84}-a5Lz5+k{jn8kjVeSd~Hahll+rDH)@6Q?>}t@e8fY;ArR+cFy^_npai zl5%EJO(8Q&BF<Ejrx&c6OaU#Yc|vA8ko(SboXbUV*3o<6|Fh7je2)Vjm<#;`Fg0P@ z_o`Bc#pGMeO)AR%oxT>%d^e@i7q&52yJR|QvMJ_`cv8%>g9iZD(5Ra6JKiQ9Ypzep zYp9ZN%u#d+&Yhc+JJ#1<Uq*OH%Oe1a<lKd4M-F0~Ut@d8l1LBM(VEZg(LR#y_*XTv zOT3KR#J&#6BZiO8WIEaH^7FIBm<`kBPm@ck8PN99jIjgYiWqdge3%+T7UQ6^&6E2> z+h!YwGFVUN$sAikjGf8fLr|=NnsuHHWTn(Dbg0%aM-=Vz=0!k63bP#EWiHN~o{#fO zHk|Ss^-SNui|v?m6bg&9Y&!iSm9X^s`Sk1dWLAtJ5A>7w;9c{enq8^p?KoQnO<|({ z8_7tV6k|>An^itn2H+&lLfIl97ZJk^1>3<6fFH0apBuaw&qhd|noJp)@^b>IoNAWS zTFB)xbH%y2HrRYF&%5SN^)7O8Jh}3&<KMst9-(f-Y*Wor)9#<Qeg$3xMj^Bu6nJ=b z@57O&<%0SYyx@eBl?ptUQHg*oafJ`+=cl{4ACPN+DhOta<$`@BS|c0xrETFl-0oHA z8OF;+<OO3DmU5r@Rw~Z<q3>BwGFp1?x|`X5rXmMuTsfltG1G$5j}gqTh&9uF7R~gE zeP-%YO>UG2Cn(IG0I&3oeU{sfROWq_biEDDNxnO~vDG)xk<fDSC6wmzqJ}`^51VAE zjNUMed82cUM$zr_l~`T(MfPF?|ISpUsmS{)PR?;7!>4TgrM{^}8m~8m+<MqXupYG* z(V1h(LDfUVb3=CZWnNRtNfTS9zRo9o5n>*7pIy9miY8w`qMHUk0yoX3N9i`wn9(y( zP9qUgbuB+t))o|+trs+BWG*RHIZNPPIty)#<Rf=%bGGxMo)oDCXnXkGTJ7f<U~GQq z70-V|>Wh#X6yvco;#pJX4%sI3xd@Jd?Kr=BcC#gszIC2V={<2WPU=)Gb#t&vCz*NS zYJ%I*SpezHQr0Ga%=JEbxU#75+|ladGi#037X+~@@iKPihGcGx=a<Fz(r8xrn_p6_ zTE_Td+=#Db>1|sX=9|S5OgmaNmVIn5AhRf#-Pg<J3zhZwbqjG-i~O=Ox5UPSv3p@i zz#IP-HXABm+2$GXvLhlhMqw%4E=IfewWywdeC+R5Y&^g_b1M-QJYNRL>154bwev08 zs5@8hFN1<G7HfpNyyCi&7K*!6-d37?#AQ<b^J%g_>{YwVvW;?K=l(J&2xC#70BBbE z7WuSS!~AC1;v3&J=kSVQ=7>0!p}q3UnPEEJIBTxnJvr{|v|`rHHIY1`q1Uzfv|-yb z`K8tTPHTOArf!pO{8VcK%zZc@oB838>aW1DL*Rfa7S<*jRj0YbPlu9*dE5AW=nMT0 zWnc;voyicc+jP8L>I1pE^V_fZ^JjZSAX5mnAf`Y`f2ShsZlK$RyIX}hzr8x(4E#@u zuEB`ldHYG&`+NB)<|)xedSl|Wb>_6jrd=#K)dMAPqFq_)j;XgeWb9P8S_@ig`NKr2 z3pnq-rcZuXy*WRe|5^3y-$>ssShZBX%n_A9$GF`dw$^?>40o-$-S#HfZaINQ`{1IB z#0SfH@n*yR1g_S{LU)6->Sd9ZYtULiQh`eAp)}IIH{PPs5o6VB<UcjP8+DhF`?6mc zIvFR4o4iTj>hg{2_Oed1<bz?b{Qc1TCX%S{pM(Gt8vzCGWC-8J^>Q`Dx!*_{c+Je4 z<sfga()oOijQVyh4}s!LXc>aT7Epm`Yd$D@61d&Ba2f`VyU`bu4gjuFAnot_)GS4( z8Z@`i(MI(_y?8{?H)|6vD=MnWB(ftdD|YY?fFv9$Yd*33EFE%4MejvuHFb)&SPQ9H zj0+0<MjY?k`urhBD2!H9%&`wq1JQrwQ}Vq^BruEALgw}duznRg@osz=-}*27JO9Bq zak#$46G5T&th@VnOxzgYIw1_UI|wpfgg=pUH))Ro5H<N7%YaJi<URt10K!CJDr+a0 z53L3;s&MLLdX41NT@CyEW#m87P&y!%Y!Q!CYRQ<EjRNMIv3bZvQD;YozR1L;pIMHF zzk_sUOHc)<ep(I96GVPuz{-JMUt#V#wP`z|Df&;U^Yi&N=Uk1~sNT|ccl++)Ey&C_ zFkgA3r7=#%5NH<}i8RY{zNRdVj<xL;yzvmZn+8&dL_S2|aBNZTd%9de)O`SY$O8v? zeT?zvz)eEms(Oki#sJugmlu_5-TVgYK8y=R!?l#gUs1mA@pWrm_4#THP#_4o!Lcle z!Y`14@`0TXpW1wuw|JR)i?MH;Cv5wih2V#uY~Em>5Ka8A#{his8sO#rH71DC78cUF z<gBXTP4n_QyuPZl_v@#C|EYB1;%Uy~Yci*4{HQ7T=3*n50oI`G@2tA2H}O6`#J7nx zO0zZqD{A(;FA#ST*(u@_>UZmB|15o%{xkg~Rf6kVCb;zoZv#?E06BYmIz8jNf>fRQ zBKJM4C<o%`EPwbT8}Oh-Bu0ckSaK!r^Dpo_`~eF+Y`TAce0UphLvWKPWf1l4E`)vx zMk1ZAW`Mq}=+z}1h5+zo2>QnYJ>UF2=Ml5ofIseVPp<*~Ec_{JzN|J+p_<L*Q}$PX zuKw4#n|ybN&(uD?Ntn{Vo!u;-BRp?!x8d&g?aGdRCoo#oY!?vHvX};<f*wI_SVQdi z6Y&bXmC=M<W6*Y>QOCB>ZWwGsHFx93wdkGe9~+C4qh<^J?$i*VbGH*9O<K;`!FnfZ zI&=XZ1*-Lho*u+AyIRu-3`;1hpOnbW^+m(hG^LEGgbd(FwP<`{8D>(&5F`v1h)MK8 zf{!%zrxq~)WJ5~X(l*bmfN;q_gSPR}GV-n{>K&)&35Ev%IOp+*ro4ZI#y30V3d#}@ zL7-Hp7q^1AOHx89jZ$Dk+*&IRVKP(nfrxt8cu{FEA0m*lgV$Xkha#;O55z!iee`7| z09HeZUgrs<C<Xcvq>E^7t=6ctOTiZ^Xf|q~G;~0T`L+$rj%lQ-5LL}!aj301p+#zX z$7WXzo50}M%k+Sx)LmZ~2{1Ohh9sg2yQt_-lv1<l@0g<&4OIy&&@U<J0lWs*%x@O; z@IXyT+;{f~XRz*TRyQ<G2YIHdk|(bbL$F-=m=!emiLEd7u6}dTNUc!`6Wd2{JwTk~ z+6=M-%;9quK?58@NxwMP3ruNvBvJI2xCNkylY<NdNhvx`j!dtp!v+sqHnzdn&JksX zYw!ZO&P4iyZ%!%}4k(Q5RI(E=QT|xF2<+awPT(N;Xd)d(B{_~fmWzqXgL7ht646U4 z6DU(=po?=eTTG_J5Lnbxc5V*N5ky|_-I1XIl45WRYLp@f8VOR|Bl-S9Jmek%TjZRK zMfg>T!4dt{2#_hIL5Pa#t58!kJU2?f=zu_{8@fOs!ix-u638E17cgQ$29*l{kRuNW za67$z5>n34K?xl2PX&;3kty(VGG@q0Kj9X`CvE)Hnh^7_=r=-~BA%ZWu$kp6thtyX zQz;vy<c=g)4hPB>`*JNZ@E`18h3aH&DfHP!1qKz$2JHcGY;lA&)MMv0R^^ARk$lD6 zGW{NN;9oFr?Rk!YUN9C9-plohng#}GgQg>??iZp)QFAPM*=bD_7hFu8KC<216%a8D zOt)kEVx6#^j|r-#;YFZ%nb4udq}>q>g0^eOQDe19mZVE+1D-JbPnECD{3rB_)2H#e zCv@%SQ}&lXdcmjXb}hO6_bY(^tN){6CA0mNef|<_ebmLDzv9AO6{_OOwojI{<B+kx zRIimlPQUxdHW>w2&{W1f?qr)Pxp;cuodSs41|q*$3#7{)bYR5Z{<TO^4jm6<?D46M zX+w5Ul}DMxF+(Djw*82D2YC;AeDZGi^!V^08d5)oZe<I^8l^YVY8;W5VV8VY-p{x? zZHsV#{$OZwz|uiTcoK5woR@xsrzd0MyI>(MiJGH1SauF}TT2JNrpVK0iWSgJ(cbYe zWr&TDz4Lq4DLYZ>3ht-kD{wdss%<KiLnk8bYxXu;Xhvp!@WQXwsG+sff!ayyXK0QJ zs5VClYEY41E2~-_(9qkJ^uSWDXEtn_@_0;83r5r`8B+?=R|;}Z+boIBafCehl{qv# z1Sn^=oeBrR;ShP;RD5gJC<;#t&23$m9;XdQtQ9a~Ni;;Jl-pkpm4{)tC0x8}Vx@gr zy-h#)l-O!o@_8#7B&L8UiE4@11vc0{-?>P7?LUPEC8wt&B*7cUwhiTCLdtQUYOK{y zURv<Y_vl&BYQsyS=-C8k379gVsAZKmsYsczd){`#5)$F4N|3nFp{JdI-qr*4=uDB8 zP<XBf5^h#2+!iwJfjy{zZ4F>#i7v}tshk(2(_?$MHppIEQ}%-BIsoYYqqvQY9<6w@ z%uOC~HPfbv(TsyO)%wlaEbe5e_523jw-4=Siu!I=w+7dnx2xfkXc@OGrb3k+#RUhV z-T;)InEoAeKc2BC!SAO9n!|$5OKE?`ApT$c7{3}dQN{-j=P|v;jjQq5h(CG#)cNL& zjpKszhaSkE`nUffCt@ReZf_Lupw?8}TYw^7>b7L78LC!)HPyAPv3pJAg3b6ByaNvH zu3}GEM!q0thO-)i#L`C0gSxux!oJ@e<wO+)<}#Dqy3ysqNC|$=H}AD?H@Su-mS%(h zFZA#Jy|HqZTHv@N@PRs)+7JFryvr=a@CLxX&asfRMw3+C+pqYC$G81w9eXdhF>{37 zF07*^K@UI)NAr-e5Mho^WXuL&Y9YS?|BNy8KAgT7ua{r-e};j54nUeu<MK@Gzkh}a zUyPsOTFU;Bgtr&2ew~(;kRzC<ebU>jFPlJvH5eQmt~BU#V2<^V%kx&$Yr8Ce^d)%k z&i|h@>&0@<7yZZFq(ytZc|OqVO@tk-DWmDzfcTubiaadZ%-GW6$!4k4IsnkXg4#NN z5cvP?lgyZ=Bv&0-s)2KiT$Nid;(up?%hv0^3cZgE3&N;2sgwMJEwAOSd{;lzZ{-*A zo%|r12osR<uW)Rzt*+T?f#Lk18%$eBVDB}w?Etg#*3Z7+6M_qc4?g6`5U4!uHhUL@ zhv9Kx2B^B%-R>lb8&Y`Q{%gAo6Ooy3i=r%<_MNORMN3u@8ugVvg)&$6pf3%A=ohEh zG;g$b+ItQ4Hl`vaF|FrHyp2L#t)uD*bdW9HcKA~SsWpLPIQ#oHXEpS(GgZxgw0g^< zqX*7mV!Xfz|HiEmU;)XrI8wSdY4oCoE9tj}h8{_NvW8KCR$4>loE3DoaP2i+J~$|V zASNfLM+R@)j@G_XU4;XqOAl?WT+%AplFd`ok^_*16t#6nEPq!bDwQ_Z{fxh%V(DP_ z;>E9ny?3P6?{;b*p3JZm$)@E@udis|FPCAxKL2~xE;*Ebf?%1XP}FaNE6?HPg%>+< zvi2>%rQ#w$%cXDdId)<(davq+4lDv#MkrIGsuxyarj$?zK5~vQnKH6?4?}Eh2}YK^ z-rYiLg*SSVrr%)I3)zcF?caF=x!*_oZ3R=bEd|yc9s0z$z6h2-^LPDy|JHtH-x*hx z%s9rSP9lB6CT@5}{KVhjFe&6-T#IMk&1BiW-qF1T1*<2m<?s1n{tzR=>GmzdH@;<? zmosgq1||jKsZVxxIy+1)UH3MKl4(?o>e~k@N+)*04e1UV0mDP+t}T|~xCCcOS)Uve zYv{C(9GFOLRP2*%Bq^oBYuy@BiY7QfH`z%JBJ8!(#S*Il)t4)vuU3w<yGLuXS-G2T zWCMslY9m}zh#HlytTsKXdvPNSge!evf@E!G4&UBO;4G)&^>sfeN=%A=N9O*alxBU9 zDi7_~={V~;yOzGV_HRhg>I*FnvPNoH2Lb|q$_=teMHE2pM0_z3D{m*Z?MdLbg2X$# zs0$`p2v0MdPnKFw5>Uv1c_)zOorQfW286gXB<1Ras$%B?bPlS$+jRos8s}ft4y|V* z_3(SK_7*+0T|JAA7ex$~0kFnCaLIf8Z$m&L?mODgU8$I4?Q4#*z>*9sxfKq=_n&|F z{54@+q|Q|@KU5k$^;_hGtJ@jV7Qo?L*|=2<b4f99(xCSz)kb85>#+t*us!V_I4yHb zPkb*h!j+$xrQG~j5d>0dVeE*+^C=L82PA^@1SE<(qL2+Me+PxDMi)a%yFKk>_Q2)x ze|2#@gQ*=>t7hYg(>8CU-8~5S{_Q(&kw#wIi-N9RfoVpeh661cw@60{V$V<5w25kh zj7zMZd)bC2++v|D6bmsEQ<2)jQs_MEj(eR%RjsF#+cNjUE<L@vY-kHkNdKsk5i-mK z(*b}1E5JxF+VzoEY{!2Kzd_J6ht?7h*=CD_#}tZ_*oddh&uo|F^x89W;$A$l9T(Hz zye#TL6|BV<<(l#x>H>5?JB;o_>Jez)sW!xL563k+lIwf7ndIzBLS<0lDvno#^z9d^ zZf`$hMCBri2=_w9JSVzbv?<9xYLh>5#++(^xb^e^de^Ud>@7S?F?B1@Zdm<US}*0u zYv{d}*qFZ?MqfJk?s&9`Oj_=8ZE-%%ja3Nz8l{WhtG&-@&HxlE_l9hV!@D6s2y*fs zhE+d&sv8Y~JKc4z^N=ZtBxk&E;)h#*Vc!{5Crbj^VlcWIYHZfY;Md&kSi`<*ThQ|f zLOF2gP2;jhNFx;dMX||sV;gmM2$0*k`C`@R=4I5a)}^dPkL=heiuRzrmdU8p<)QQT z+%eyj;<qtt8)L5E0Rm=rbiK0S9&0hvjW4$_q!Cw0R40dRh#4DRbI3-_f3fTwUOdbB z;`4T`)P8Y6Uwq+^)qmt8_SyWb(DaXItoq@)x;_vpH=MH51He2Who@zyE=+k?*@m(( zplvRDT6#V!6rYQqi<jbsM*|T>U1EY*ZnC(23c}0j3NJFPF8P(oI-u^*tL>9}N=h%> z`#q|*O$#<J?E)4@48XBu{_fD8Z-hO@BOS@~fJ5g#t!hRqW}C`!VN2!M+QMRtPDp(f z9>Gt-9rIaP`?=Tm=P7EL>XY($L(fhv?Dp!9Rn)W_r|D!=Nu1c3Lh(%E7p7Mrym%#E ziLLj%d)AY21DVB9ctW9AS*w=)hy$7XC~+&*O$ix4@@s0TE!MaIvGj{_H7|n=uPJQb zvvz!q^)byo7>Crn`Flb7?(%vCL#1dB%<9_q*H5Js_Q?N`w@>$@c$_(G7pOjS))7f3 ze$VzqrP23JDgO2Iu6$qOWhrMIrR)s?MB-4&k(i~O`}bfL!JAq@x^Z`ZIselaDUOfF zU)(;u=EwW#)35C1yRx|ao6%Rq(Et3!^R!QWI0w=AzoI3UAMTbSp)=$vj#Pb__?Mo~ z3ay{zxR(WIN~P9h)LY_DRlt=b!&)&s9ft{p2okB)nC%n6^|_e?ad?)!f`oyN(%cGM zZ?;5R<Ul40DUg+q=92<kpAX;1q*1>YfSiJ73<s6GgYS33Nq+1hp86rO-G{q|#HrEr z#ftx=|FokuxZb{vmq#48S*n8?hqh8$KdpVhBp{YPGgA?>*M-Jl=%-~el4b}7G<+(s z#^|(Bir2ck)2G9tu0xQId6GYsUxxtj{NmT>?yR;nj3sE6{f-JfllxQI4*?lXac<i) zx3LSaTk2FnocLh^d|}}k-lg}6W&*HUPjQ`OtH?Q~9@D266b8H~1`@pT+uf<AOjr)& znQLiT#}0#u*}@>jl-<^=a8f6c82$|v9c40n#c(?}Q(8!;1V9>7{zq1b5y+YSCloOO zq!+La$~kuOblVkOe@#uP59~a$YQ-lv>yv!)NC5|zR~aoGas_wS_4OnA#}{d>0@oG) zFbPZK>EnMnhOPp@U6u^>fQxBFXRz#+ufVP5`z+ksz=}RTh$v=a-K5whVXd)k{lrc- z6O(?3B-lw2*)_(RC*`?MSsRV<dBfI=Pd&?fYX=He{KHcu?T6vKMSM`UKdkZQy1g*H z4g4Uu84TQ<8YfO{kg*4jgiQ4p<(h9Ua8|u@9@Vm;H`o1SE6}Htlg$x(LNtALQo%Ap zIs#DdUs2h$R4+KBX+Q>`X%m$+1LmTFQfP5hVwR3)R@wY+YR8pDIDr+e^5w!I#>0Z% zKApXlCj(>khQZy<kzx0UdBDRPGSmG=*tDewv$Ru5m73!8v^dT>oloT?Soi%bDtcE7 zvF08U!ts32f)Ha$c7yyLu;0`3vtDahPY@7p2;h(|{n3h*m4IE!^pvK=p={iMg)DYf z4>`<zx-6nGFsn)g4sEE8Y`6`DrWsIpzY&De4UU6%K&Ky4s}5WD#7Cks*rN|pI6Ai> z;(`g%DV&gb*05>zktWCZ3K@A|oE{R5xVQD>AsfvI=IjlsLFW=mxSrS3!uH`)e6hY5 zVOiB}IQ?WvGw8$e^n!i<tP!H!k*80|D^H)E)h8FHXQxNbCKvaDQIm`_Pxf3K;iA!o zN}ElYTa%)yM}6c{hbG&-irKuRCQv!U<J|Tf+gWEDmOJd_i(fo5g}4{CHl=riJ#R<c ztOKPNbJEWT`YaUZ0OO%^TVr$wwSs0k4<^feL|R%BIkd_01b@{(*63}}CKfKZ%^NgW ztv8xDg-Gk1i46BbtY>M5csn!OvU3IGj9YrFx(@oNDDaABr_93HO$r)ZRit*kWMWSY z(@3T6_EAO4xX&ZAkBnP?#M7=n$%82Q#O!H=<txC2%B6)6N(y-;**^FC!WGlHlU#T@ zk-BqgeIJ!waT*8UJ8RFRcZ`ssU$UpJQoJw?1s#Tba(a4ES2aCec%=>(cympwW5-V_ z`_S+`A1S;>F!uCOA)_$^TkW}Ecl7Z{pdsbb+t#zp*)uV=b=|2i%~;OMwo<;fg)<4s z2me4okXPW~QQh%^4!jH6r^s}nddYMgkiD>onTXn!;E<M7$IYm*!tnJBc^oO*fNpqJ z*Ppx8h@5GnBe@-y*n@<6eEY~b7UCk3R_I~onZg={&AG4_AL>`uy|;brU+o^ho|Z2a zmMP*R0$XSY(6-|3Hovz4E1{GswNIKF&@TW6t7f#$K5*e)S6hi$8`)dCiSEq;Be(zw z)smFxsT8jc91_E{NO(Y+X|+dFtL+>5k_?Z0EMG0&3oh(~=ALCxpw*>0UnL=}vIV71 z)dgYYR6r~h*&0$lDffWF4!V}U!T`e(?z0+X+DZw+wKnsBISo%lYD*b|G^AYs7EX~` zUaE!A1LKJ{+w0G(INl-+;7gFSt;>t^BDHOLz_yJXWe_JPi+fI}XpqBXr^FbI$%fIf zrRR1P?Ftk-4E*MII+0Rzhiq>PiI9wlfg_b1EG2evxT7a@?POdg0h*vEriO%o4+2V= zD%&dUz&ccvwx=a%MQLK+#oNH5IvmN79%X@UvMBjzW}qJg>nYzB2l$-=BQzPYh!_gm zi*tEJDGsrGRA(;s^r4&5mN2sI0y!h&3^HSjn3&0VHYNbhg%>AFr1qpaG#1+v#R1#4 zB+J<VAr_T(`Knl?k_ZrmS%^>#0D(hBL4bQN;Dt^d&1~ndvW5F$E};@mV?i`f7xW>5 zffGw1XLsHjh*vwLV1f1k9?7#71u}G9=9G3RNgDf}PGfHGv6<)%K?74zK}PGGZALXB zc4~Tv6~kynXr#y4s1QhpZyyuI>88^?aTNEOHc~7)sbX<+0^GDt7#3ELCO)(XyF}Gy zZg$NZwPM!@Es46?BByAIX0rj%6)(;=#_XM&r{;DoD`DS9X06eOy@T2ZOWI^`d}<mE zmg(&Z<21#WxQW>Nd0l;Ta3;W$c5E9Pn;YA<jg7gnZEbAZw)4hzHnwfQalXA@U0vOM zf6mm?Gd0~a-BnZF{m`-@2CpYS&{*1Rcl>g#<o+a@xjlZipEVMOC~a1D61_@f$!q2) zK*Hpz)S*>(bA-S^YO=`~2tO}zOd%hE`m^eyrK+uZHO*^JlPV(nJ0%}z>MGlZud)nb za%Um_*_!ZV$3^$^=jPh$t2XOK?(9iQ58tegY^a;3_EomBcqtmFO5%CBPgE_*_#h$Z z<P;ig2o2P5Qy0Rv8hNPUZjP<2n7dR?Db={T*Q^fREj4FHR8Jy`>3ZTj2v5EIuJ)G1 zUQMF18WJU*(NbWL)hAsFcri}HS+{b}EC#dkbtVT`pE7w0Mm%%puEs4gTot~<q=P1n zS9~(<CUle5ov^G)8)OMR6^vKa;D?)fV0PJZGjug>)X+TWznm|l%<dUv?a)@xZf>*6 z{cB!<irIL<<_iF;MYeEB*uuP~Y}Qxdnr0QcJV&sYd9N4>%(?~2o+uD)RVaB(Np{m! z{j`ozrHu-XBGp%!5=6(G(5RzuG}Z00pQ-X7$Es7PfZsYz1)y9C@Y_YYp>8f3)`!S> z4by3u%qQhEa{u!?ei7w{9t3Br-5J?TjIzPV?|O60LyVudOQTJ~_wS9^A%borj0)^3 z!Y=R${+Ev3?_X0h0Bx7{Hefp}bU$qPd23TrWqL{$h;jU&)0FtXFzES{&92b%PyHZk zT^uJdNG|3(ztem5IQY7N-l^j0@av(5Xv7{S_lP=Jn#LQ5hFyzJL9ryci*c%k2xt+a zC`XrbM-(daOfDlOcAOSxm&k%cUo)vcXH|_Z8QWewBPHBu>}1S+!l^mpE5(hxTq5-N zJ=sN-2-v4<V_2ozLhWNQbLR$Bwo&z?Icm$o&jgXtaixvU@zNqg??bxR-J(Kb&{V=! zC>0t*SaV0*D}F)#Ib`y+#M5mjLX4-3Muq8tVi5kVUZCR_n)yglAzjnrRYaemcI*)A z%^KeP8^0;B0=fR$(#v+s$3vh2=v|tf7mMImA}t-rB;wD|xfVV!^eEV?8<ggxosR1D z2k>6f?Pgp;|CEwpvjWE81T_%>cFr?6B#0AZs)@HK&0Ltf<B-IXOdDW0fvhB#E&<z1 zB$D5O&$plV7dw`0X$+jmw24aNFieZqL_l>Rtv`ttq0o3>z8wDpL8JP2`Lux9L=Ex| zxk((~su_dxBonciE9-aEkyZr*2}fp%&ZNOJW`nglkCXt56`Ko$LTn&&@Es_CYmjJy zNV>Ye5v}d*UQzH{);&l10&3vR<i5=R_1eR~Mel1`coKW?7W*t$H}9C3F98u*2^?LT zKS;q<kohon4J2?Yf}=QKj#ruqB9B~LzWh?anS)qu;2>GP_!$f(oZeX4e!cHmr$N=b zl|hKZ`f!fgr2ZM}(`&W3<>;pV$ywjjnqgd7y;sSGWiJyw$|+E@z$i_T<|vRBIS=b( z{~k;wYujO+C(U0>@bk;_b`NpUn?JT{C3@3i<_kV%73%%AmHMNsK_&reP10KwemSJe z3P*)2VWz}s<8-9Q0>(bw-WW$T8LG!OQ-UqR8cw1SqO%NR9Zva^6l54{nz;kp=|f!7 z2VFr$8eVx~eY`MDduAKz2(#+PUlYzk<z&D7oweTLyO#(b`CjAMRqIScVvI^IrMk+# ztja%<FuT4xzPd(w`u?R;7EU0VRYv-fLWJ7AI*P4Xj4-u&>b`Cib-|=5%x($jmd79( zC=38J)k;z;od#Q(sYi!OeBCJ&tmEcv;b@^>Yr-s2F3@`lJ6VKWj1Z2R3dV{|);BY# zfxLBBhvIR~@D$bC^=NIz_8V&;1vl3tp9?F^Q4IK)7||Df)Jng54!{|GkfQA~S79yW zD*{4vBuzzU6WnUi0wTN(Wc~Rh1uqPA`!E0K&<3w$oU^Fvv>x3sJzN2@qRj2g_l$Im z>9@88ZWNUeVi&LjeS-AYqga92%s%dS3lBY7QaQk~2-&DK>?k9O{>wX%6JE>n;IP51 z!hp-LRrBFLYmk4Xkc4C?(A(h>pCQ=yO5K6s6uUzQGqk(!ja*WF@mkV2;$mAXl!*NV z5OfXLBs#_|lx@5ccGE<}kz5H1Y83fsU^L<nVpFxJ4o@n=^6V8upwr9uqy?87FSzd? zxPBZuaQ3xz)3ot(Ik}AlK2nf<Pc<IbJDs9s7U56*?_PAi1Dhk6;lK^1LL|;1x7E3e zDjzov|7qMkGEVj7HlP4u*zs?u)}6QCr?m~1d)-7#3>T%B18$e1Mdw5)%{y!ifzHH0 zpvA>CXD^%OUHB3-c|N>*<wOO<Ne`ApTUejSq!0vptfv~O#CLFt=BwWqsUNm~1m=Yb z$SenGU}goMbZ`}9pZWXX&OXpiSdQ!bL{v&9cG5&bIT#|$;;>TZ-99~VLM}r`{$o5J zChIaha!SV)+q5%(#g*n<07sCS8V-8*(sTl5s&-L5l5HX$GriwMn}by+4?-pvfL?0? z)6BFe_PhMA3rUF>a&$|#<QJ5tGg5gz9f)l%B&FomzJ8LDErGrqsF32-JkuYxf`B>C z^QFasAt7}B8TFeV6S70^0Rwtt%IDM}lDiFkYw1Q<8!e$@PZl13^DVoc*xx_ap4QXY z{E;5=S1NzSQXP@7KAD571~~1%W=J=+xX3j16=p$tmXfq8pA6wcx6o-;PTo0b$iD-u zyRZpq`B%X2yS*M?PD|&X`r_YQZbdSStF>xt?XLxYfDZ+qZ-v{1x9MtV$?4B55!bZ( zm3W=~edAYWsLrbzI7TAfS`e_U>~M{cFet6;dR;ocODg+-^y^;lm+Nl~W>UbCh14B< zq3!K)_pggc#sO;!Rw{E%w_V?we($>5v42wRSvn85msM2!I$mB>in#cllK!V6pjoj* ze5W+FUv*H+X;E?!0X;(*r!vOokZ#c}W16*{;ZwU<$Vg;ulC$fmb2e+ZP_RKuDkj)q zk4t5tT9GZNnTzCU>*KHPdq9}m4}273+R_+4Y+Vot{ESq#Zb`H@ZKx{@JaTvE$jnlt z?p1|H8=jhTL+>Zkmg?V*`<Fw{UW#4<dm0?mSudHuej%iC29>{HdXhH5z-2We`NO6$ zq@1rhwQUwGeyBKC%~(;ak#9i<f}U@dRgy8mSiI&KR5Wmcc5TTRhMp{0wj&?ObRbhU z`eyD7uQh^}!3PAx$?aMx^XfuZy07bSF2$Ia=6m*bQveG;Y70+UX~Ns5^DDZ@dCsWy zcX_9V7vf$xO}^3fQ?YV|8>4ei!Vyc2roQg%yWIm^$+K~*E#6tb7I6`mj_r|WPl<IN zLFfgLH1Z_{+u`$(a%kep-xeQ>@D+$#lQGFseDGY&OE)0@TJ&>rpT&SwK!3R{tqr+Y zc47~fFggo{NdCzd&b3mpvpVbnMJDrkO}jR~Vs;8k716<t;X*aVMWKFj;ulnCo=egg zCE;wDgUeL35H>n83Sj{V;m60=ulVcqabFCkeX^OExfuUdVQR(l#>pS;E2m8OIX9A; z3$Oo*Wo}iGkn}A3bN%epbU$Ivb2VFdCOuQdu8pKC077o20(n-V)ARHbPm!TNu7wXI z!YPf=M^x7>FDU9V>md5WxZ4NwnIfsrPEYP1P4g4&8&j~gO(T_SE;QJoX`!P!4DLNm zbFpxIElZ%tEB$s**b)!GO2(qxj|bmc(-i^_g`$(0t}0vyurf)OnBYk979tfP8`Lnq z$I`1!?48zQX?%|GU@~)K++mGr-eTPV`Rq*FDifxjZbxix>o6l;(KhEi$iaBCJp6*S z!{3Znf3;W&S^amfuU|9WhABjV00vq07K_}GP4grk{+OWD;UDaRseYuN2P*AsQXxRs zW)923R@Vl!_}?|aqLQkhCC}7c^F|%HVK4oaE!#ZUn-EeemHr2=rRh~4a2QIgI+Mdf zE`^3f1`;Ey2|MY(iL1htx<^`X0=BD;L%FIXQDkH3L&xisaro<6BHF`Z$1uT$<YGi- zH(Z5rh1C5r7jTZL<ZDtvz|}Bc>u)td$<?}$&fR*edDNObDruc%-()POl}xYf(Y8LQ zL-KHei3gQ_+!75E({jei%;EWc?Dr3^VNxNe=6yp9?-HfEAIq-blH_s2jw<(xlCWtT zBa38MF@2d0BK-_9dW^;8w2{`ueXmsU#>$G5J2PF9_1Xa{xeS4u#naDUMHV@e?$){Z z)7O7r9k>85dkcdNti0PZ?yJqV&PJBV3`23t2F(R~mpQ~d{``P`?dWJ-Qo9n>)K@q} zCnhMFX2+Y09rWpm*`JLT+TT*_BJt`Qk|#4&_UqsRFshqZ4+|?N3okSR&?ne<lpU8X zpXUf%Ftpo7D<x!h2^(xz)KnU*ODab3!IIGn^0wIDYj5^G(FGJ@sYb;DdAjxPw>@?K zHBor2geqp)1>#8%Beubm#68jhYe<~pJ={T`Q-Uw{_{Ik7L8X-$)#CiHwZZ4LEJh{E zfCu&<GRO0wj)Y9LC%vS<Fc><-Da8+vdZDN}AqfHDr^)@@Xe??moz5bnBcPLmePFCm z)swtdC#jCJU_Z<wL$W(V9=;IIVS1Gnl2?a><Z<O`ZzP>^S7;ncg>s5Ku_eBSdc{Tf zQYSTR&fmDDI?G2c#E>O9RIr97tYZL)@~Y6I>K;p2IkC1;fW#SvCCVL^9*yqL=PQF{ z@jC_A2Z&+a`-)oMubZ-;zxW^pZ`uai3@YvYw)MZ-L3ta4Dc6^p%(?;bOc2Hl6ZK%& zBuylGEOZv<V}i<0SfHXIuZE)DJRi;a(K`|`|2RR~Je#z3{GYO(`)_XeJ?|Ypj;Gmi zARJ`FzL6I<u!}hJ&>u?`uF7APA;qhBDhie*;Zh)wTok4X;-VK0L0-L8aZUtlzOG=? zURm4`&&#Sx%rZcjYiSMafeUGQHpcYsr5)SSmDSG#K0oA?{5@TWZU_yi-3otK$G~rS zg_d}rvuS^JY1{Dxv^Z$4emZ25mQxnVcBZarXldM={y|#-^+Knt&U}2(%Ovw%SQzS` zLQ-x66O|r`o4rsxo)CX2y@c7Bbf7Eu-l@M?#Mx6WmN3BGoJpum6OV|A&4?W#Vv6mD zuI@%oPsgj=tLR^+%XS`v6gB*5+qfv!7pjd5kZCXtsT#$JOXi#pD20M;9a#aOmJe67 zh!+<xl{)=)AXk>m&Q$p5X@Dz%lpD!~nv+>L7;QacIv>obW=eW!sSuoBut%0)sQ>;P zusZ+ruc`LZb*@EjUAPK+LY@aAV?|apC-xKp^lx$jw{*331lj2`U+Y-0b4{*S+WU~7 z%abKh;w_&njbaqP#@qb??M+R704DZmLiAMA7Z*Ev#_Vy&(ZCLq*u+8q26+Wv6QKqR zy5)u|wS`{vyDbwtX@W!YK`)aelCLPey(~lz^AL+8FT-Ej&iY$S=Hje3;nRqoFT_Ci z_dJ4HBBB-7w5wU2PWJ<K-aUglWA{8XEJ~J>`tEb9!Ce8=(gmU+W*Qf6ckS_XeVGPG zLnr13J-g+}JfceEQwWgsvMG}$qM`&$Q6+pTA{PY}iP^c^-a-qznd-s<HE$oB5lT41 z6qQ7{IkB1=GF`^7yt*a2O0n1}B%p~2XK2o0un2o|=(#~VdvH>i+5*oC99agKSTnm^ zC^=|VJt?_@EzyEzlBASnE=E~~ApPYA<gcX~8G1JQMZ7rn>D}*9w}Rpa)=x+>eL+Jq zQTya*RX*UKcOAouCh6!}g4JXehhJw-f3?Umnui$VmPhimbnn?z>tlqOyyA^Q3a~^? zZ#6^o<*t|*v{+}prW~9NG82C3kF<t`8|k=f*^7uqZOuNt30>vGn;ktCA3`OA;#k@r zTemkl*sHC+HBq<51(LIBi6e&wi0VCP;+>(x+a!1=MT~kFD6hIG+wbeoNzh<!AapQm zWcONDvz2k9t<Ac0P(P53b$?xtGGPKK*`h86<sevjGDwgBTyFfg=O8GhXCN_dsO<4Y z{gp_Rk=S(X-9b^gI<bu&a81NrVqz1l4VyC939v$(5}7n=_z3kYUoDOa+TyywA$O$H znR4|C<?D<*iWw~w9K33oJ(x!bct$NxiH8zRZW(;1*((|We_>6Ll}w1}Jw~G&n#COV zOGB_rrY?7jLVO#Gg|ef6OVN-y9vhj#_ZK_@8e;m8#r|?}F&?(H^&68A<_d8*8yZ-m zTP;OR1--*)j58t-`j<|W7&1@bPBgnE7b0Zh8N)29=$902Pb9SCBFZVwOY4_JUpBw= zxm5Ua0OUvB@(Xr(Ew2keR52Gz^&%LhC)rTF5-Mt(X@)Gr#^h|tD04R^XcUW%@rz9g zosr_b4Wd>*xB8(OI50(wv0#i_&gxyIhE)Ewl>Ca!xwOWfu&;?AHFRsdK<QAYQA-RU zE@Wfey7lN{r<19K0r0vLSvi)^i79Y(D`0XD={3eD8rH}+v%4AFaVNm9C2(e#i^wf{ zZw#4VwiBrD6HKwA^`EMsZ}R`9uv7qGQZ-sd5V2{bjG_vJ2Ey%yabq_)T_LL8Z8yU$ zU7Lxz1*cv_R@RBT6w9y2)|#{PPiRzK2LjugfiFE_sv3x_-&W-|Bu}ChZGo*-Y=O(L zFp_bd$_|tRGOj{<qjH!I>*r5kdP{#0DVfVlvbI{an2QbebS625->qFi)rx~@f5n_U z0#1Xd_EWgGP0<!`XXJhewutx=<V?aVm9-KqM*TkfLZnp}I3>7VMBmD$H?4Y8)@g3V z{d@Z>?r_T!;=wQ^J*%)nk!?kpV2v0fWEgElL@^TxQz<{sB@?<eCya%#xW6akNs5L= z4J9zP#gtM{7S@;I<(xk~M>xZD?zD`RCoR(_ag91yA3CyW=2ia3xJ~aK-dbiz!EwM& zsDLxHW0b@ivH>-r&`W1>5yI?<5A|nv#Q|;M2C_HE-zd;tQCsee2XVd>^DD%QgzovH z!6)O^1;pGNq`ma8$yP2X3~n4?y}a{4__Wl=c4vAboH)pEB7N-$_DOmfW*!)l(^5ew z4wFS}&8AbzUPX*zvGr4FE1pw2EIKy&n6dUx7ATOWgx9OxbVnj&7!uy#Q3+_LyBT7; z8*AHcs!h7?(VhdBL!2|=XpJ8>N#xK9PgtVb=Yc4eYge{${`bdaSNNYDUn+vuuHE&d ziL`GvPC}YW9Ta>lV;C&UrtoMP-}g$)khWY|B$b`&d>Z;gju8#5vS1vm3!lxWc01N3 zsu>f($=1G&PtWA;gphcjTRD42$=Ye8)eTl+S(Zolj(-UZH*>tZ9@vU$@<p@NG^$zH zwf5I>K9=}4fhjuaw$gA5YG|-RkLV4yh6(ARo>4)HNW;LSx}+6xYY&yVH5*qWN~9S` zYe_Oy#Lq`I&Li<Xhn1xS^RY}R8|zTAv@SB9ZPOpt)(S{4;}S5!!9w$%rtOO%lqpuU z+L%!AiE^3l^%GN(x$l=szJl*O-uluO>eR=qGmP3wSVIdT#(udW1YVl2Eoq`evMJOu ze<`Q47i8|~{2`zl;f{fRdUmjz`(#*wo(hVGzk+bTNq0;NWMti#vO!T=<T~}_z>k<Q zCNCJ3!S<S``Q6Sj&US6Ww|<+ABgq*0l2!(95$yf2FOJpS`cdAocuIp64b}=h4;1%2 z_W~9T$xjkBpF)X3>=#Qr|GPvfr{$fgwzPZTFf;=9!In>42wbp15!K94%P%}&f;RfG zPyG0QO4&OP|3W7Jte4v?89Ei;)019aP4)`!pfFM|#HLGB;FW8YmJOK34Q0qtGi!<$ z-`pY=D^1{ULjefTdbc%=ux%;M7T4z+ivO9jMmNM-0)uDKU^wgSe528LUtdFDnN@;C zUDDD`Q!QHuD?5hZ*`ibfdWAzQ)0IcX?M_h)iN8Q&KQnU(iMt=oiK>u{88<yK-o+H- z*fG)!Yq`5HvGdfDLw%Y+BTxDg9iy0@z<2Djy<HRD(3Rev6S|qXBd3#IE)HztbS|V* zF=Bgh6}Esr0{iYbQW^5#_uqf_dMj)o^DPOQ{&+AjJM(|nU&EHyB&()gUQ7`s0`Kzy z5sLfD?8nk}v#Q3p?#l%2q5MbwLjWSmrbRemC5PB|y<5D~3~pL<?X+@4Mj-ptJx-mD zpPCnmeb$0>!AfWg#F;~5ndrI0HvVY+*Mk?=+{fZ`1}D7H=RQ-424$0uvFoih!#2+! z;zpi!X^ynSMls+g2w88uF!HpIRC~wO`vf%AXX@QW<66&zV=tpGe6od6>fECZUW0TD zn$>cv>{Tm<6CqPF^PECSdqZSa@&2FV)}1>orY%t0-wTaa^c$PBX_bV>A0r+X)jWr# zHw}5)9G4}ORwo>avi-tra(I_bgr%TTqf<2Sjw@6fkUBTY!YYW@>)d11nY_dxJC1Cm zj<lf21j5WW@3o#pe;B~Gsn14}Uu0=;ztNH+s-m$<<~Z=y=zyWO1ygvmEdl<frv*T& zKp9OvkZI=}kyxGu77qx{NxB>M$JhbQ(_vlr?RnKZ_2^J_L|w9J#p)qBW;B#(E`p`z zYVI9EIomOrwS^F_t4U?;7a_-DrNg}#f7Hb<F=2Bk?ap;b4z9jBZ7z2i^?&rua8>n7 zP>}<QiGNb^kAhHkp^b(5A$EU^1T{r!Y(~j~^OP&2JN*6q@)Cy5eN&En1oI@-@hC|9 zYN?K{7y#)BGDr}D7qt&da?T)Dodn+kY$r3VC1d5py%9m40G$y@pB%=is>gSQ7@)$D zB^oN0NtR~6rKILsp#XC%)gT2YW+_$CCZ24q(f8Xm9ORba&9TZ>#xyNt)Z6LA91kl9 zhN^6#go5`RU}Q7R;iJ6EHjOqTi&kdX#kwPQoz;T6flz^@GP-o=SE)&lG7~-<n)ran zJsg{cCj@tNws1Ej6O<ZG1+x~6vaTbEHMSv;^fvtD5rgz>AG#Kj^B%;C7To|K19G_@ z$KmSAW|^E!XbvOrv_!dJ*hRQ@oau^bwZUzmtI`v^6PvXr(wPrHd9#uZ0{xQE-x3Jr ziZKJWUmHV)!9i3e-XaQ|yo$5?)d|6$i&2O0Z$DueK#bM-3Z_t`{ZxRoELMG;^Bh+E zFpwdd5aI17_Y(Bj(*@{B1;Wu&Xv3b`5f2KG-RzgG%gx@rl=!Z~=ETgzyc5N(Gz`&$ z6uTzFA{b_&)QmyX3ZyKTGP!G0Xc02>Su%VU%M4Sb1CT-6Kl6yXyz;<5M!2RDhspaz zhUqSRXwcCIEzmTvkxtvypvkHD4q$ZV0_a+!!u8!cKhDBy+wanHvHTw%b=9P4>a;Ap z+LrH%fMS4-eV?})p)UliZMJ}Y1L?(oz{ixV>AVS4t7gRE?^x!Hx+=4W>)fA!+oEaB zY51vgp<uO#?r(I>a<w->KnGGkv`mc_qiQ)*rzzywv&rudq{$u2(0YFmpnbA@XART$ zW&xKU3wMOxL8bjMC|lg1T!=86)8+Z-U7r5uhJt1Fs<1aR6&!WT7EIp*X)g_~Nxs!; z{uJS5aLlD3v}{unbyCmQ3_Xeecbud}7`zJk>BQkGd+dSWsL~@Rk4ohAKx2%>Vbsoe zn+D*OwP3n;i{b>juE!Hn5}G$?H9~=D`ZfR=XDu$!4m1_!;f9Mk{)k_-fI$j<w&x6f zJG|*~mbftk@v;vkX?TMaB!u_n7*Bw!Q5_Xj)O-#-xI*yMXF)h|#GEhQwO5CM(`S3h zl@*dK;SYS~tCLeV;-wq=Neo#0Zc~qqtcv3f)d{*wOCKZ-g9cj{BP3U#;qB~{;R*>F z8yhZ?Yz7T}+%qC!%)g(n_k0&Is@x?AS9=X1g$GtJ2oTm6P+;Oek{ofP?|Hp^*s|Bz zoJk+Zyx}&a3r`+Jbzk_^C=^3<A$#6&kW_#_WIZf?&MSU<{2iDr@mG~N-d;q7Zx2LP z@gh-DR_bb%q?Ppely;ZRf%}psiSeX#26-BCo{=OhK(V>IaMhkAJ~g6sK@Lxp!AfAd z;LIg_+{2mKPZX3lD15LUplASr2A$CppL6uLg4Bb8m(%KUtqtp3TC0h@Q1_Ehw9z$` z?OK@)S46Z+;GwG%Bn)=B5X1?@C3cKgkNZkS_n{&by21Zc1Su80fd?5AxE97M_CcZ_ zRN$jkQbe7k%xq-<^V;VC1wLC@xr6YegT#CFCriX964XLd0&`4Z^$z}hZ?T;6euL|e zQLk|bQnA0j-KU2o$TUmp!mQMY>4iv;b(=>X8j5(tuRWqTO;n*zhI#Hqt|2#{?UJn; zr8BY82ML-<po^fvAZsMbG4Bug7B9f=-hrP%F~!v@4opJB6Tm9wyFp6bP**Y_8Wbj_ z679%)=XlX`8wvHGlHp1B)O>3s1~!NINf7HcFcu^O>b6gKN&GVQsy!MV9aoE#jW6Hv zXB-P5F@g*_uE#+t9h@$`?)iZUf5vd3<S-;ASRV?U5b8fd3SE!<jjW*se{fqV*(A#? zyx+*X0SJ7?wLHIPZXHKpVZfcO+&XELq2JJP#YBd+z>y)m%5d03F+ecXM3+~$pTVfR z+?{#_|J6}2(dnr|XB{+ruty?f0J>|Gv(nOWu&0CaXa2?*PeN9@mA4pR$c9KR(CmfD zz6%co6oa61g^sOC^2x!!${c~+oRJTQl8<xYUYD2&Npx;5ud4gq2mg6&9S%u1^kpp3 zn+_h$&<Tt@nY(qG*QQVaqaY`8o}nOFB3kG>efClNW7XRyG+9@AJslmJXX44R(01v? zqMP>9fMr$nP=U__sT0!Dqj3*Y&K-e=DHh9XAg1UoJ^z~5n$e?EkYKJhdBNKkx)5** z1z#|PX*K0BKp1cY#?(z-RDjjlbgHSMBv-59-nxCz0a2zMRpaB)q;D-D9v$J6J4eDp z?iMJ-lB{0%FA}BGz(T8ls}~|U96ikY8L(~8cIt)6rfB?B>%KFyg8hjtwQa^6lOGaz zKpAo%geTLAnyk)@-uTdhXnto^FQ~a1&I-VSC>PKOfrd*Xs$6C!3^T+Lj?*`;Lj&Ow z6sW)Gwhc%CRCu6cWu&acY3B!@cEg$|(KtUm2^hF!W+RVb(h7Dej*nya1xK+r0+3_Q zX8fh5-04w|lyuRxAuJv2As&bS2*^fjBW)aA?3z56x$DUzgjvRhCjg*`Px8a>%M@B% z7X#qRDO?Me(=uQ|=tHkPD4xcKrZ&Z0$1@Im&c5APG(YO0H7(Am@dzQ3+2z8@eF{*B zT3%E`HP$ix^eUVY{8?y-IEWlH7u3M;{Xs7f3;Hu@1l48dbikS3*(6xk#G%KuR=q&H zQL-j!q``*x*qjVir4LZR^^2{3xX==+%;Q)jLY}H|%f<zB(RzELKVQ&S(GFV`$K61U zAih`Hlx>L?lKwgqxh)V)Q;22uFhMJGOt<uo;i-psn<hWY470<tu?p&!NP#m&x;G3K z`tJRgCqS#Nx@594jIMPCCcjk(aMOjde#xj;mA%|QuU4FRSPycUD@7e;{6Qe(QeRhO zDHgk_7id`{Vme`w6gf)6&;VHs)%=q*J98H-1N008#LX2EMo*ctGK`|X)4oYQ)yn&H zSiR~<b@dl4S~Y_y{5)tz@WxcFuq^oD4CqM3ik)J-B!zO|gQ*W4!8vS3OD?w{F)csL zycpLt31J7~ks;DO*mQ=kc`J)K7Ml-NZl-i)p=S}`wv!qVG(`EXt_|0@$w#)cFX#7= z>iOAlIdv0aN-QlpLoZZrZWt^eVpmhNr0QHSUji*yzu4-yNE!x7`Icneg*8@QjxT?s z3`ya_;1VV`8>CxAbL@?__H)}9#+k0-MvoD3wm)#6|D^tsf2w%2Q`2p?4HPBHSLJL> z(WkHKBrpJeb`W7(Aa4F*t6A=qk2}p^R`vGPIa8QhDLtGmbtcU~2-6%ieFxtJ`Y$j3 ztks4gAl#?-m#;9kqqe((tBq{Z+W^v{GYjq$EawvS`hed!E}~JCGFWnMesb&IUlcp} zZW~3tomY?TQ?s{s^I`<_pVCFkmW}i*#`~%5uIfEN1I6pgFZGq~IWy@&oQ_k8)66?r zdH(T{L!fJ2Bvs=JQp4$WpCe|MFT8$L!IymuJ!p}_*VPRUCOaYn0Y5kyIx9RKJ})#C zHYf5=qTT>v9Vsm_jNqk0^(;4nPM3>{>F@BlI99{Ccq1~27+g-H`D81Is6q4ya+Xk; zBGz<zj_}C?_z=<tG1?>xWIZd7`8(K4&3)vKYc8Wjfp7w+ZHf}unglP&ZlG{(5|ZWf zGB38;+hGy+@K>E`7oG7Rmne7nAiB<IX_pPr?pm4qG_YB|JGI8P(jUn(lv#SQdgv_F zG>3Fb#Y)U6oUL@Km3k#`l9=NvB@(UD3wD&OYkaSV7lIE3m=?TtF|Kik9f}3>rwEi$ z(|h-Cb#-fyA_-cgDdU(j>he8Sa&psC4D_&czwvduuIG;Of{T)xqN=iZvBIfPq}8#< zF=%6E3>#Ood)|$dh|)%}VZ@F9s8P1nH#fF|V#r{YU#CjIpW$(s>UQMtN1q}}sQzT5 zKWP)R9w}^n!NtMD%}USA(ACn>1{XGj!GMw^R<=ZV?i-ar^1l53_`j;6OIB91j?u6% z`E7BtdwTfqnH^v6ogG~r$o_virTdqCCsDP4A5GZ=i4ulRZq~9!ppdq4@I)d<eIP<> zOV2g?4pX0Si2*%5K0G}*IXe4D!cj4;FPI#|(6ac-(iXgr$6zPM|2;Qx!`6^D+04B` z&@su+dEEN*gw=W<MzXW1tDVl@@vrCgHR1Kyuk6Ag)@<`ImRN__?}S<A*ar&RIv|o1 zy*1(M-Rslm!~3WcfLNxn(7Mw|r}e<g4@JT;(frl8L&si7S)<-gXVKQ(Tkg#$+uVyQ zcP8!P>dT`i03|vfM<E_#y8g${h{WphOuO{dtM*)?5asM*?O)02Tg_YMT^mHPWe-PQ zU4prFz>})8FsrqHM4Q4m!_t{Y;@V5{8&88=)9?|FBukxFqn=x{@2F9kk{Yx7eh!eh z;!7@r%{HS?A#q}*N>(mVNyEnuo<4y}<f&3-PN6C#%jy3y3!26<N2}X2Qmn!ZW3An_ z){k5v@&p<+yqtd125vn<17eIn6e<~;1M?H>P)gM5`8q|RF8}aMg`7C@=8OG*$GJUa zLP#CAoL!w21^M{8LH=XpZ*jTw8P-xQ6`e`a@GrhU04#IhcMdi)lpg%*eqA&nsNrTJ zNm-#Jr7(f}OK++CUR|os5Dg?RV$b@u#9AqF@_>$#enYyE=4Jy|1|kD9G+nF5RO-t` z6~-PsP$|q%7;2yyIWLZ<QBgJvH-m#t>?>;?rbtqH!Fy5JhThhlI+QEs`R+NuoZFpW z!U)<@hyJmPeUUq}gkp=iP|?p}V-omN@ylMLS(mA=!}-Pt=o5`|zrdRrD8=6vg+M0W z8P(rtvS+r;Vx!G{$?d($%a4V4)%FYfE?@L_pW7cB<2CMix2tDmGlLKAI5VucF4-4m z52<R$j5eEQz$Q*`U2aw^kDoxA!ekJ5lQ!MhbOLI!o%u{C^Bh>1kq<}9zz=<~J!&$s zyx1<I>Pbt)a8~AG`Fgfo0l3ss*%@Y2niEFJOPf}~W8=AmCyKObQnY!BTVu>7Qg_fk zT>|gSVOR832zIUG4Rm)A^Va*{TX0X`*~GWL@2Byv+NOa;FBf^<G!d&S09;S^B@By7 znac%ij9^J=kAt<)cB0zzoqPYE7u4a=4L1{A@d&BnHiG(sN88%NW4V?DXc)~0b#ECw ztL~ssTA2!#luPuL6fp0OVaLQ<zc~+!j8MHm2v^H2Iu~Se+E^{PoF3I)X;_6_O@hng zVC2|#2O>?R^gsFO0SeU6+6nBkE?{ArIE`x*p=&-C#PdfRKAa-%g_476yd-jH8)rqe z{f~Wf$$C7{^6$-ZZ{Vb_U*asED;DjNA&Zq!q~BWksfo(O$1RwslzPc)909@v7*~H6 ze}qt%|3oRUIR_z$4t@_P%ViqDK^K7`2|;OOS0BOYa?D4ebU6=jCj1K>!Bh|(RY65l zlB_a8WM>EV#&;wf0&AuxNAm*ask<k(IXq31%l{)!^X^^3574@w;%7_XNn<R9`SHNs z7Ow8X|BL2YV8yl5+zsfboJ(o4*}umM<p2@I%iv*c(U7c3@3R{hv@NG{YiC;P7S`Q& z94tL#sSLO6a|lJpf30dVO4=?MG;$vE<DoEMwl^D(-`5Ec(-@r7FbO}=4&3ifJyD%$ zve_w8ZTeTQZ&Dp=Q1>=9+NRt;Z|`h(sI2%r-hh%p5<Xk*wWkVN&5Q2E+Jm3nxo<>! zL}k)UYWM?CeCP-AUuT4`kgx|Fe*}5MO0+1u?H)c=e~GYNPFdFu!n+s|F}n3`8&&Zb zjjuen0(CA0KJho#uiR=Q>Sei3r}vf~i}#}Joo;L^H#f^hxnE$0sM1=h;v4Zu|J$AN zo;ZM@7>VFwt5}(=aU%x6pihLTt!ud{B>iXS=7!5`ETR9>s#Hmg*-10#|HzdE|AV&2 z%iz;>!4nUJurL<Sk2E@W{x1OZ|4gSfh5fHh!~;&pZ=fZW1MXhH3Z&>0CNO1EcmVRu z|Lu}GL@HFm-Kj_Z6J^y3)G7wM{(B%st4XbXerp%`e+0vg|7(>$@p(z6UEk^g*=+_I zT<=vIwpJ3i8R@|kf-gQS3V4Djj=TOoyBL&9vSw56plwAXH1NZ9v(@o~xj`H)ok;5@ zfG3n>-?ZPb&ewm0Kb0p`)|5W7Evqgn%_{^&aDv^F%XffFZDENjp_*ZckU<-;hLN7n zb>tDy2Zj~pNPGg>IVa9Rp4nKIeIeX-zOvRdYZ)}AtfX#X$mVSh)qQw1K?vBGo7u8T zI+_eN2ofyuIWl$@RIg9MbQY+GFzuE{N1ml9WbE?#n2|#y*#sy4$hog3!qd)&4WB22 zA@J}5Gjv>BU4~)eK?l(VZpt%-!X~NRI0k1dcspY5a0n4_zr|(;;W)f0K1yQaLq*YU zLAN<XCdg^rQsnCbcmyFmbU5kqbo5853i2C*nYhi!`Yuv_*4-OE8wY;P7Xk}SCa>!s hhfh%|@Ua&j`L*R)KmEEae+|!p_7!~^Xo7%%{6CxLlyCq5 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-300italic.woff2 deleted file mode 100644 index 2f545448418cba6668a2e7d49e9616e8c69dfd15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40656 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 bQBM5)6s%p?oy_T)f<heOvL9c)cYydmSX$yH diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600.woff2 deleted file mode 100644 index f503d558d58dbd4dee1f6b962d23002c85893573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44936 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%0Dn1c<2_+E7q!}_WoeXk9?T@D7)yDCvAa+ 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 F{|Bsk2y6fV diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-600italic.woff2 deleted file mode 100644 index c99aabe80340fd88a6aeb5729251e76c9a6f35ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42120 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 E9}-z&tN;K2 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700.woff2 deleted file mode 100644 index 421a1ab25fa88105ab776552d7201205f7899841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44988 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 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-700italic.woff2 deleted file mode 100644 index 12ce3d20d1ce2288206e8b4f31c20f76452efe37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40800 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%0DER>;wf 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 RRq@Zl18$4nbA$lE{{b1eG28$E diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800.woff2 deleted file mode 100644 index c94a223b03321d4a6701f0f8f7bc16bc75081aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44536 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 R7pBogwbb+jh=72A{tv!<OMd_W diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-800italic.woff2 deleted file mode 100644 index eed7d3c63d1f9bff356497c0b0fb79c50ac4dede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40812 zcmV(`K-0f>Pew8T0RR910H16C5dZ)H0bbw$0G|l}0RR9100000000000000000000 z0000QE*lUWfmQ}!0EY+&fi?+`U=a`sgtQ=o;T8*y3IG8%0we>R0t6rhgdPXF4Ge-n zTOKWO1>Lq?tddA~!c=vqY|mRPm~Jkf$3alKaSOQXz<GeUkF=}c|NsB<lP_`X-*&uh z7aXKZr1~E;=@Ah@cqRh8btd}ga%6CbA%}F{+~hdIbC5aUB{0nyy;#=!meD^j=(l92 zYE9IHtURkbCW_rvQjJ%VCmo)}L~Lw~6eoyEVW7WFt5^aTKWT$rRI+t<Z3gkyc6+xY zR(vQ3H={=RWr``x1qK_0DW_6C=wwVAM@fa^XR1-HAbANI2{y7WdQh{U+)bFQCJeU1 zF~=azKp&KbVw#=uDXAPg4kxjQKVh584#&SR;d-A^l*;exbd>(O&VE1f*VsgrOuq_d z>7|rXFs2MDsgf;tWK`v$8XMSJQ`@!-j9msLqK!39ygWoX{d!d`+Zo0Wd>RJ2A)Wvj zcN3}a)A=?tyOIGztUP}yb{JP$(I-%VZB~F4Kn3WyyQ=`}09RKuSM=BtRCykNcE+$J zPbgm`DwT-((W|0QNFws&d-CRcLyR%=Z1yu|k9{`wd^Y=Szdf&Q_P%#}?`F?C?e*fN z=3|!my?=InK6ZJDNRVO%L9k<a#){{eCI4)Z-(i>i-SP<%MC`KRM66lz5gR<oS@~Ud zh_zenwo8J^?nsy2#=;kypF3}sUx1J{s>1pzdETG@sVn6WdQ<I0fv@?c!|1hqpkr@l zq(k}8n~JzZ-F3y&g}bzAI_?q+w)we{DxpLXkN6!kjccQbIdbsfuxg9M{c)LnJ?SaL zl1f!l#qR93J)W^AY{>Se?(zJ&Zf^{L-J%ODvLj>xTzCW=U>UGOcbM+&UA9Uy81k~e z^>QC9VHwP;IO}whMP@FLy+Lx_+Ny1_t-#}V+dH7UyC~4vk7lq^Nir|n4x?WAZ&(%s z1E(8N*8)m3;WXqpkM{2EodO6zK{g2;?+A|+Om6E4aZC*L38wjT`(bY0w;i}hO2q(+ zMPDlb0Vw9iO4-2h+&{P?h-gxb216H2*`gnF*6;4k3Bx>siUP(9DHr80n-A~fqSg6% zNxEw_LL(4LAuIxUP94*MnhxU;{!l_gyT9Y14A#c?5orS(-=lpw05?6yRwHU)V}sRJ zYeX2>AU9fv@PGejzHG{%;tD7+Gk4)vC<U{fzn?-{d+<<%P0#7Ps=mPlDT);UK@ud$ zuI83d5?r3rh$MGp=*T6lPs>gF4YT{OeE(~<$D5Kra8A0|+gkL5EwYM!*W#Q@6`+u_ zVh6Stnv;!_HUxNhu(QB{|2WAW;7Y8vd#9qmYpSZiKjm@iG^o04>C66>IGF@o`Y>$y z`%<;8zX`O|R9KUy?c!u|BDGPPIb1AyQ#{;KIOgv6|L@-sY%~B0XoxZdN)`wzG(cH~ zNNSA+WDP*c9+IA&pxIz+lO|^nq-+ujLs7KlkR)xKkh8+X(}oalTYK8;HK*Gi4wt=L z(>b0NdTa0WZxZPle6uK<D@%8Hl;kA`{oZN4RMtpW?Df^(I{NGbx?&q9xCna3ny-7S znX7inZdxl!_XUNg!@$76^RVXX-EDsll@bY+)n=}VWRh5jq$u8<=l{7(pLrKQZA&GO zVzxKRiB`~9fC9LW{faLX!kQyVNs#Fs*IvK7nbT8JVq0NzxWK<XrFD@_=W<}xRANOA zxsljQpndHjK}2N!<`)$&nccg4jv$2u2@*s^B!r?rK4%$IyW_g^t*cDI10HS?j$Op5 z&z6kfF9g{TgCyJS7ZJd;oLEvQa{}XBlo)DUlG293qHiw8iUpTar)FQ?gx{3yav1Ns z)43A>P_$^h4F)uD+W0c40pcQq#dTnCu5qJ}bl<(&Rd5&X{MYqkfW~HY1aPrSRYtkw zRnOz)MA;s*!hta!vjQ6I;4sY@N9)ByQ)Er$3IUs8O!&g`Pq9T>wptX-g=^zbF3|hU zPUSOcx`mj5-UU4}8KdH7VtHLg79@!>DU~HT5&yxWUsn|OZNSK6Ml7__Pb3)A>f8RP zZqfWMOVwyFzBEspX1^Z8D8$53lXXBNFIWGn^^69KxkSY3%(@boAVqR)2r5p*Q0$IR zQBx*8kL1}rpAXZ(uYt|u`&+8hDuae>wasPM-O8%JxP7Pob=TAJrn}q~YdLsX^r&BF zp&0qfPnTgqMug77#=*%&A(hlK!WiQ=bK`0pch7#aC?X*#LzF3ZG)W&Xh=g@jTM46y zNo;h{)xZWhQetDAh>fu;KE?lY&TzOh+?~06&0JUG>awYEd%4zV#HSx?Jw6i9(8h9B zEa=2Ru&YZzfBLjh=b)MRwtQS8S{j_WvU56aQ+wO_=j=7d*bPq5$TaGg1yg^j(HyNu z8PzjsDgP~2N9{69UfGQ5yLwmERd%^mm7>UG6qV9G^?e&_gF4*$tydqkZdcqDFltZj zfbA)a+L7rW)7tiD{!07HhuVKf);ta^?0wuvjK11y?~Z%y?Y=MvxpLvio*hdT3~BNe zAF{<=#pv^)$HVyFz8-$T14n3>1}>n-Q$5c4I{4@I?&fXwyhn`63dv_|@tHp0bL|le z&a=Ze<-F+dxo|jRW0+w%%=1#_MJe~PRCrY?y)IQ}K3oBQh*K3uqdS&IPpl|)g^JGT zi~bmhl^L5YF%~aNQy~|9Nlp$smJ8A|WvS@H9EJ6m29*x)T{4c(+r>cSF{-aU(Y$U} zDO|~Z<g9NywWEJAc-(GQc1QA!1APdl8RLQ;aWN+rBfvjWA&7?X8%odvz^xIYz0|n6 z6x3+6o-0(x#j2E1ib#1xc$h3yDiMo>VtdbYef#?5^QVs=GTanF{QmCt=HmS9^yK*H zaLus}-dQoM|LS3KB?5R@gXz>NYt~%%AAKZryD82~YA!vrn$XJ)?(YYSYeHT%l2Pwz z2~M=v@{745D@o~!xS~s8$L8N3rZ2d6+-m6k+c?6nzQGVTrd%$lR1iA{PAf!i_fZoZ zU%YdZm`O|SEbV}mBBnDvbteu)neRj_UrQzlD(g$97$o<Xhk#SMUc|`Lr3<N)d-o0? zUn;VMKvsPxs1gaAdOjR9ysO2f-@@9fqL}yDu0>v~r!83Zj>>^K;hp=BCS|B_A*0X! z<WYaUgr!_)EK$D9OqeS%y5A`Y6g_1M{{kN7|Nm0>DpJJ)vVI^59JA`cElVzac&CX{ z88}t_(v9`t^3*AZ$Jy*Vr?e-)hy{-K^Ts|0?%Ey{eUof<7`V#`gDK-vPK9!entC8@ z7rf5uf>bTj9UA*BOCTYk5^XDmN6+djA!^-Kh(~QV(yGXH5XUnII&3iKyLr=Y&54<x zsAr|l)KoS+;`+cM>mI~v6>$w(eVZYR(`LN?q~b8SMHi1dmqr3pdXJ=HKy~(5I^f39 z4&hI!Lk_WDB^y$$eRPp)?RdD=nzdiMA2n^nH5$d?XJ}Y3u?9uaiHKUbl{&6G9t_rg z5A_OGFN76*2U9s08Pe<4y~^5B`}1RJ2XJ^{CnjA_FNbt!xNX8I7o(e2b1Bcr@VNa7 zYr2SMNWNbq&VVZ-xTbe3n6X~J-HXdu;N>DTzf4vt2nVb>wo48bQiaM7c+p*Z?V)Q; z#b$icUPvB}#P80yuKk_CR=T0+Nb1`hD>uy9=qA+kB1mN?%K4QddQd`?($KGh+QmZ* zot4ZHQB;1^t4S{v=Fsi+t|=OfbozsWp~k|AgSb?#4p<u04K|Y!kb>GaCIbDxASSNT z=ycLMgnq3}ZVp*qV#kf<h%s9u;Dm*ts9>3>yye|ah8nEXfQ9|t9YZw+H%s|PpT~Bb z?^&Z>vd*TEESV}qF?pXYK>7ec_ub+`OD-SKI1OCZYRY(>43EW)rm>q#-lC;}MJWcg zD^9QkIWOfiNcUu6lKyV~&W!|CEG2J8!_nlycshu$MIp2Y6Ly`Dq|aUK@rXmD`9vMT z4*smuAfP${b;*R2U&V|suH(9UcGtfk49!Uj7=AK}5$g=e!I7T_gcHa8Nnea#><HM^ zy0JqM+r)OUi*ht4VxPK>72hC0O7Jv`IlM-(ZzAyu<Hr$08gg-1xXep}6r#bTo#z05 zDSN8AJp1So-EP?Y7de_16_fSCHQ}%ubv-cs5$SbK0xVq<Ag&RS)a;{lX(>mhln>Wk z_g}A5Q9{Jv^yD*2j7d2LY=r7lR&fe#|98p7|AJY2vXj^g{XNQ`H^O+yOiIg0)aqP8 z+VO)h7_#!&S6JXWVcl1S+0GQEpLfmb$AU#KIrzyz$~z;GLecm*Q#&vwEw>Yc|I<W^ z@WlRtTRvPJA`-VFOsb-cTdlH&BKCBwKWuWXA5b*YC!86K#A2Dr(&8VU$@X<+!vBkh zC7{{(_-dVh%H$S>BHl0vqMfcxLI7VK0V8^KvJ8a<RHRHH$J0m#vXSolEiWvne65jX zl&>FuxuK6;A^t+|<7AoSd*e>B*6|ZpEeo}iJ=aq$jK&{MvwNPW?m?PmGXoz5Wz?Ur zcEcFr6O+~@=V?M*YJ`~3K2cUQ%X-Ph@_jF%>=oSsL@z?AviaW|e}Gmr2(sbZK&s-V zBoK%ux*&0BBHFB?$!%jE`daY=Azl76#ypBj27>?^ib#$4gw|g3U<}L%@2f62D_lFz zXS#O<Z1i?Zdb?G`h{+BK*&JR$3W=4Pu8Nar6YAqq?1E&j=rR+w%khLn^eAll5TaA6 zavVYcD4+8f&=|2wP1pvq4!u_3-)oo|1oW!1=|CbKQsXcjCOHrjj`GrIjV%L+-cc|> zTbRLYDss*fkw&Ac!=n=y`)0+(Vezb+Lw7$!oOns8n8Wqra9OzJ49jl6xeSteBm}m? zB)oLi@!+H3vsqrwW$qD_I?7istqqof9XpxT^?YHI-7i`b5$P9&^GZM4?H>ZxM_MUL z&8hHkM!+y~0Euq19#AO_;$$RuT~wr~B5yx3g%wd_hANPPsyaLUkU|I6mPXv0E=EAt ze<Xj@*<RM;XkPl3vpqe<9w_cbN>pg3mHz#1t$4{Hm6-eII=bCk@5U7MRc&kCrbQ{O zbXwUsJC6qwqy*>YxqtCKwy{_n(hJABntR;f&DUKB;cQ%{HRU5dF=u>crg1#XDTHw< zL*{Iz!I)_phNcmo<itK*U!GmwFY{2w)#){}tuq?9<QR`ksQdcwpr!wy49c^+Yoh`f z?OfW0E68jtXbM?}@198#XfUEtp}Ms}EuRUrS1Q3X4<ex&64qRbWiCh~eDZ^mRAb%P zm?_9{&DjFmKSi@5Dfw!Brhz#YGGp)1jURfN<`N#sG`}e7KB{M8rBM(5k!&Azug5Mu z;9l-eVnY76ygB>NY5eqOfI5c8U_SP<9^UyAl0mT6cUW)gjovV!SZ$bfQ$UCU1qfdM z&Cjn0T$3^;(mpCsM3Rqbo&*~Q)1SjP7EJSyLyk0k5^I5BM%4j|$JlABk+aZ(jZxy9 zfyUAhdB`({yjpcU4n_@E-Mb)!H65y$vttLWQNmp<#b{;Yb|5N5Jd7!QAdU`+q*te0 zmLF#w4Ro)G;4S(MnK(%|P4G_00uUhv+21X*Mwan}d?a_$XBkwKL$Z9pR&R5%OI}Qp zRE~3oeDe5Nrnk#hF7V3lBADJEsLX7vsn5Z|eH?ZIE32CWhr`mdk8e8X6q|q@b+Q=M z_xGhQZF#{8DI@uWvEE6L^x4=Wi$qC3cvX>_!C3-p@G_F$U7)U^prJaJa3&`4Jgy=} zjLmk2LXl768cFrO<1KbJ1eLA)wKhSzV%-RoHU`glBIwpamd)Buo4LtG4H^-;IK4YZ zwsQE;Y@wAN_X|p_K?W%>rkJ5792!7;DV1gZfHME->PC1(4nG#^=yb7)MyE+x%|hnj zo5C_o*HB-7=^#Ts5eyTM#18M79{`CglV<^k-FKbvUanNPb}+Hb<XPTpaP3wEd+BYS z4gD?*5_?(EWFLC<$n=Ls_T0vbJcC)&z;^WnLnxE-qH@oI>Atx)L-I<QH&Pzu6fJgP zQ!&msc@7myZBwPI^^j}<53o1FBb>#dlF_rOvr93U4%ukC#SsZBr<O~Yl4PMG+hUur zEMbrzYO4;5M*PCZ8jn>&@*H^*)GeA4QsF*zk3<kKQibG`vm?u5(-@s7Qqnsdk)KXK z)+RP%Z;#}wP8qZidTCE=0xmCDd5YcTo#@gLqFPTo_@1|fs_@(}=3f1Rji<s%YGG&M zL>G_aXyH}YwGrH%T|k5oJn$tU07VMyR1K1Nhc1$h9X;SgB~qUjOb#)WqF%Bw_Gm^# znfX&()YWtv%FW)|0|{w(hNJ9(6^V!t8*nik$gYG2Go8PgIs4Ic6cOr?2dfuaQFZ<M z7bksGoEyx5s!GJTW8sZxbrSRo@VwR-OV-B5!VZ!TQj^4lrtNFX$&Y7M&9I{37>A|D zIX&wZsw|URQpZdy`wRQCaCxqjo<zqua|2*;7(Qu6oTaNadf|IVId-g}7+{Zrc|S+{ zU-uaLA*i!2ygN?%r=7McTD?z>n=^X==ESKB+gQ2SphZOLak^q8iAzI_6HVuNxhvEn zbn?-0#!2OO1-K!M(r-@;qXi<RIERjev&ZVtk4r5bFvBp<9--YgaqkoAW9twC_X7Hl z5dG8cL%ND6O_6RJ_nuV3$Ps5{bBI;fONfm|D=&f;yLAz|RHH%=aPLP)m`f7$^Nyf| zl8X+I@e~M3m==)jQl=>Wvfdlq%$oy7<dDC$oCuBX^GMKW(fQC;Fhs!x0xiZunlN~8 zq<`JL8*Q&%0h}b%O!pqDpL8SK?1`8Bs8li)O6<8NDf`AiHBNt9vA)$CCI?2pv-l(k zTOkqvXX_5&R9y1*9nDI3u?`Bwz7<xP=y$17ng_#du@!cLNlR^N{<#NY2dI>SFg0;6 z1K8>6vE&;85#bS__t=L7cITv(vgbP%t3;PzA;YIWM~Ft)Q<&E}YH{LUEk+^O{iB+t zX)1KA=J_ju9y-;ThlHUA<Qt=8v$uEaw=?-#MF5EKF!b7ElyHAv{pv_B9c~*y53GT1 zziB3NmKj1?G~n=RU|(?7^v>LKv7@#}-K}lf*@}5DLZ~F4Ko{b+cqCkEyYA`d{S*oM zFlYuQuX!Fi;{2fzCTw<B37B-gz7!Gz067-2HdKyIBJk{5dT%;NFb)q(+!up~UcP~- zdJcw;3MmzOgr9BVVO+x7?rmWw*t<TZ%bQG><cNq#f={jUG}GvT=F7p>)zrbFrhr1f zIuJZ2B`dU4;su#x6a-g)Rwye8JOVqxJJNq@aHWq(VXlA}e!?086F6zctWj_g`Lc8w z+Y)l5b!@G=Lyfv^DBff(l)_Ud9->kCqzJrmSLHbbXDs{`0H9>WxJ~h-7hW8O<y1Rs zyn&+Zu7%f<m#@g$<p-^jORwWdEmFvYkp>MZ<6&Swtbnxa3zl^E-Ia$=H4P&w^uk7S z;kIJE>jWDxsuhTS&ziC15)#8OF0qs73HsTQOd8AGvXu(sz4?sG1e4ZxnY-{(Rl03i zrHJw3xY1Gz!y}|}`A+^5Zy&5?d>9Y6MI-*g5w*BuXuH%WEzbk%yxI{eT5$$p8S*@` zbfgy}6W?i`G$FY&jIVdts(g><KPmr-UNuBt4et#3&boCItCsyuc>BPm3wkG$h+z`c zd@yS;#fe}TQe~bP`qeQ}um|yGNnxpI?VpR6x^32g!5;lJVMaTqqhWh1(%IP|RUy@0 zuMe~nsK&QB<JeTJoD=P22TbEb5*i|i#M|2Lik2D~rVU-}L$bRl)-9{iXqsJv(W8n3 z?93dx<d`b^I9814GJP|O0`_R)F{&xUbEKYMS<L5<l$Q~+(%2LBcnFOsiM!GW-hnB1 z*Gl&$kutCwQ*@psmm%{kFFjS9N}r4jI1cu$U#Z^@Z8xzq^N@O%O_&Z<fd~PQQHS)w zYW7iaY&ggQJ9_MAV0f&Bf$L(`K}f~Vlw6`<#$|eB^EZYM?MQa*ihj+NCRN&JDH%{M z?&4fi;p!g&>#fk(OyR{1|F>4nAfS_Jh6`;AMyc`xZ;SzPYEa}-w+42z(b~xt^{DGl z&*t~m!axD!!!VbOdjSlZ<{DZ<&ZL3G=h`(<W?&*&Q3jOiOrX@I1k_#2v;x-37;rU) zKb-DzS+Uo+;s7iGE;k^pIqbG+*P!iP-aSB+#JO>?q!|#LpFG&dnIRE`%iV?=Ofw*u zJ~ee`XhQqp`l+VFcnnJq5UkEe=QB2&CW8h|2smh^K0Cb__svUrLr2#TZ4*s`$aSO0 z;$2h)+WNacx}<uit&?{0Q(0)A7gHBtk%Nt3F3lemMAnjo5|^0p6p<GO4U`;WrD@wg z($f7m9V_irtm=_-m<+I=VOrpkJ`7SQ@1R4Z^4>Kj&QFpjX@~e-#1O1;!98w2k~C>2 z@=p9ku9Fa#!v4ina@e$`SQce=5Y`u|Qr#akBoqEQoTnG1Pjrl@$!5MBOtjnu6sR5L zQtY}iYA*v|P)6)iO_o&U7a>9*W_thfolrI+Imw~WDm&!NWdt&3(ak;jFq@TEAwz_) za<Ig`3s#@E(NY#uJ{VJ1dXbXmM${5hlrR!rTYZ6F_ZhqqjHcgOc9M&GjK;|G<D}}I zrOwQt?I8cDyBq-bOo?KhI8Ta~B4VD7xNS74t22I9+$vNE#A>w_CxS#Ll54=%I0X3( zMh{689z`-5h?On(MtxaC^g7dR7ddNrNLg}#{f|FgGN^0a8!u>>K*M|j30#8Fyh$sz zS`v^jxM-7Ry(yhG#WS{UgR*%eUoXcwm+dIC;K97ZW~X2t5U~>}*_K`i445cg>~Vqm z0vmg@GF-W0G|esUvI`hLyj(hHZq(RkOAaX9+Lgtz>xyZxd}MVC=O30`TdWAWIyzhR z<c3S!np06hv#{@6stJ89h0F>~4)E-E;yM<7AG+k_ki4?oTjn>r!7F2de^ZHuFw5{5 za!Cy)!%Ex&0B#k7VTKb4V>(*etidx?fyG}4yYMzv&!2}BIH@+<Y=S#w6CXp^L-7~0 zUA{up&fWm3gJEEnlU+#hh6M(fSvRPa?w+{a&w}1aHkgaiSPf4>r7TjqOgEcL6XsrU z-jT3F9Vw`-ZcGeOs70F`6l77mGD&TS-qB-?kRXOcd6}HY%6Qig`W$W{gCA7KFN(RA zl$L-dUrskt19!vgBKx*zNn$qtNHskIgoItFUg&ITsY+u!-gr64z|^#M_R=-#v%%!^ z%EMlDz-NTQX&_&PWdQmO{0)TOpf{d!>tRY-l2u+=oD7c^qb2X=RuK*C_?qX%$-<93 zaWoN^D@vS<W#ybC!g-X?`)0$2KYP8pmtWuHsOx0m8!Nv&5V|^+4$gt_RmTGGT=N1o z7I<U2q{BEs>JueHdDK`ddp@7#uLZ3=c@$W>6YLXbiV*vZY=f6nNDl6X?OyV5G?$*g zv_Lm29hfWFI9R$Bo}Nk9L4y`Emvn*PFi*VQ`iocT8pTS4s343~mt+8h0lmRlBcnDn zb!uOQ+>?tU(LFwH{VINK&+h~)54<YdC|d7?gdx7k#M%IoXWE#N8TY-_C_pCiI0dE> zoc!#0kI_VUSjeYXZ%%w{A_BVBqT@}$M3cev%y7%nCI(qBAS*ycl=Elg<^I$RRqmGk zyXJVgyVsu&G%da)yFURw>Mj=hd;u2_3t-i-8@jht9}X(VBR_c$hv*590R!RNP<o<) zL1qLkAH7}7O<PMF%9AyFUTQg3Wm2uC`T*I=?CRHNFjjb>_AH+7oo;)`nzkz6Iw8+X zGHlz6ME~xH_!$&DFfHx01ZTjUNAnnW8qruRQeSOWiSVeRFI244y#?}sSUWB~td;t3 z3E?X%&{h)^k-o$3t#dxnc}J>x7Q5JN(1kl>t-3U!RViB35l-3~t2{DGS4eVWu6CJZ zdBNTHFI2}B(7*s)ajWQq?V~fH0Oo&BF4g7}Xuw1A`PHyioKOtsxABVwc2QN-mAr9E zF2w`<kW$)+q3<L;K!yd6wQ+9G82XX$zkBbinwahj1cpK^cP$JXLqgI%V!te>i|%xk zQIUqO%Z5mW?B{g5Cc(G3SGF*?`Zt6`+b0ntfgG>l0T&9$b)2Kj%ICu7k5_Lt&<fJZ zv0$1C(;!G0Ebe(nB@6(d&?qL{4JX2FZ*lL{C9p7$cBn{ijB2uRlrO<`L(dUxh+li^ zSWrf#U!vCNpn)EKqTO{3jyiZZwu*?fa|PYvhN^!%Q6=#^%b?~VqpF4+n@_Og(y=e= znziSYcvBNlTI<u{_DUh#9R9ofc=hLl3ns!gE%xZ{s*{CO!vjzqOSW?)iXWC4RprCa zWM;j@>fmxIq4hbh>6S1lL|(xXNeLj;^T3;}ra8q&SQ+u)qy!J-hYZAFWMlz*_;OZu zHaGn$eJG}O4A^v8tJ1N}+dKy%?U~5ci{G3K_YU-sO}EY2cp-MrkP7<Xnh)p4SVN2K zU+CbK<wl)jLy@%(M;jE$v%O0nfy4l{6TmIsbx)6YvQLwEgyS_FE$9jHL8>Q9r|o%{ zQ6q@hDCs36+$F}UUq>Wj@jIgI9)`BwOK<q}Hjq#CU(SMQPzYta@1=Z+;g_@rC?>Te z2~lI0;!eIzh<AotxvTcp-|@LrxcH*qq&5$}RaL?o^M~Y*Up;l7yHO{66voDr08(R% zOV+lO1Leu!)E4rM`I+)vSy=vJ(bDD8Q=7l2u_clHOhY%g%H0*k4-Q)R+jW;*)6Y1k zB-uxH?@STwqi3itB3P5pYKph7;p2^{=BVlakul6eVrwM$(pMksPsx|a!A!>`q?~*K z3sR<Vw6s2_49zgfNR{x&i8tLrp;$Tj8KF!Q$kjRMDhB{_**oJJ34#xyHbI8(2)HI7 z`dY{81mJ_jvd{|c&=|8lxwrI!sr>O?5XtHx+D4fF#SsP=l)B$}>5cV4n$NFH)FOGe zT(};d&~cLbYbMEffk5dJtWJbX{NN}f15J=-V{YlfO08M2Y6?*O0mi*BY7{k5s{3<{ zOXY{N5MTn@g%25lxx}W!X9LD$-7%h047ck%fwr)dSZsvFB>Oqp?YFQiT~_UCa7Mc- z8FuV0SW!a8;RyX}r@W{Omuv+xK?SGFq@d&w4-4Q}MEzQy35>{~>#Yxe=peuY>jT!6 zS2~_R0SIc*KBqQlfUGHBv;;cmyqWP5=Y_(s00O%BHiJt-2KpScYkV|%;1(|cq#IZp zz#W*s;y9u)VN;|GIiG>oWFw$LBUDo~0~@K`VHyD0b4YKht5Q)=I9;M7J-C@*={H<g zOq}|C7)Ev8h#g3Q$5U#MzQb@^+tH2zN`ked=*Lz{00in-QNm8zKtZ|zrh_&2r*xe> z?~RB31uoPk!d?SV-=ozSK796zjj;H0bg6+7^FK$gby2_}*t;F$GvU0(%311WYGG6y z68=te4hAD!mL9^n*q+1wWV-y4dih9L+z4G~egR|5m=NjsxP7%kwg3&;Sc!*Htyfsx zfgQpdly8XOv~uuSyF7~=U`%KXLzxB@zgmd9Qq2S)V%y~wCPWO#!w{U}P9$Hav?(vO zn_+lcjRI(fZB0g-rSX~2NV1T$s^d-_=vvZ<GS3hasnB6C6lEeu!w`J6ILi*z%Q^=4 zVUR;1jLc$*<x)q~QC~~Gl`Tk$9+(M%>0fc&cMUIRlr%|0ZEn2tY<5;^z>#9JQRTYf zH71G`;l}JJqq3UHS2iUN3uxg6^J2|YmP_w6N4jC(=jzyLn0i_Dme7lQYu(bBh?GJk zNthi-<RXD_b;S{MJ-n(1_>N>&8M^9dmu%xfvrG4Gl-W(AUPdb#4&P*|j?+M^cQQ$i z2h9<!0{)(u-#EaujlC)*)jW4D%(!knJ7&UZ#oxE9o7~CV?{u`5X@_hl6G^#Pq4x%S zRmhBFnR-WsxCu->Dg)~$Vp9ht>4`W7vGh0H@!1E&^bPTq&t5O1bfKvNaJu&RFV1e{ zXZ8Wd5LN&ugUvBYju#W9ke&WH!=Ury@4WzqtsDUcVHh?$+8%K^{)YHTCkjR6y&>O! zP)s5g@>f{C_|3TK`BUL0j&&WdwTwux?VgF5Fvt#lH}?e}hA=%nnC}1Aygv?hgIBTh zFh!jb8kxx-<jl<S7v)x`Oho206Rkp}^xVeU;+XgdNq${<zA7aY>KQz>4rFu!*{lUE z5`nCEdpZ7Rzk=U;=C@fFwr#;ltqa=j)4m7#pM6X78J6E{y{KE3Zn@g#hqRynp4}n` zzdcFu_B`n&onHWW9@@fx>;b4&O0Nx^rKa!9#&Wqiq@}F>nb>Z!`FWsg^A`5Djlfls z4y$z`?K}w`OO=Vr0y_AOJLS@!Pigc|2?*?`D7zm@gx+tmq*5dg8igtX!$%9j7gons zRW_D)_}HB5Pt9*`3GMk+fR^8SqyRj7wuYBFwj~W4I(LT@WWLK8r++_sK5^Ss5LdM^ zfNVGj3tQ_LS&!d10?x@hW_D=2%=F|p@SHEil*kk?LrHw0n?S=rPFV3b%g#^J>&QBG zqQn=kKakA%!IB?Ai!J#kPXEgI1KcEXlP9lSk&Zo0w)9SoR(@yww>ac~_-m+WfUBam zV?wIK)wZWC{ck?UNeW>0K2&Tk%~cuhJNos<fxpjiid1{{h+Bfy8F8{rvc_7YvC+g^ z+wFQETw>O72TZ9*Fvk`H9NO4)FAg10uWhU@j!FubmX#MYg(ZnC1;MkF^m&#1zq)}U z#ckZy%R-;eTtE8#8ng9*(7$I4laZ<Ox4?AmL%y;v3MRt`<{XhIN0q2}$Hgtc1-Oge zuUf|EU8ouOom)q@+xK4b|Dn_0A9RWnuoW9ujNE_y0JeXAv9+Xw^!ns_7vK#nB(11# zVx|@hXmIKo$KOePP0(Gy26={VPQAV~1rbA2mOAA|Q4nFhn-FqeA)QmYO0n+W+K4y2 zW#>N}r1N@Q1_Gg#45%mRf6=Bjo)(*Q{nmsNt~qX*<|GYUa`F`q_Up09>sL#UgP_F5 z7edj3FrQgcr2TYgT0%6n1ng3&zV%L+&$}IX0O`$~oON$<WBVpLse1Nnl=b=c1G2ZC zuWs6y?@FOGT5;;;{r9ig&V5maZGI-Yah`Hjc4NFCwkMBA;bD<Ja|P_+kj11IzRgz{ z@XAZ)o(~tslr2YM)FDYbN-sOV{^!Z!(;J1Qx-}I?Dl3jX^)cFO+#1_L6A73hQ3^qc z=|)0GSRmS0meMasrV$&kLhu34OQ(FF{47a=1*%a6hp%?<od5(T_JnCx?m8RojsyG{ z*zxR(-Bq|)vn*qIyd=Fdokt7D2|F8dN`7NyL1d~Vyu7qPAD$?2+|&{+5blb|kE2zM znB~~;B6c&c&9vuh`p26C<@~l-oVplz1<3qd4!Q#J%)7(>&4zk2Py88|Kip@?|37XW zPA!R1YdER^kr*2iS9d6{4Emz=*~*(f0-V;8ky9p2WkiL~zDY}%G5+FM5R)SF%3ok? zTgvfesHat|0qDoA<0O>!ZceMnr~S5kb$P#5>N<x6Z!ZitQxmvXcN2K;=V9E`h~dp1 zzq_Y`YBS9UMLthraX?zxHRk5+vX|XoAMO8Pk=mvH2^8lia@I#?g|R|2kZrz4vwf*U zcGESs1HLU&-<M2IMFomIZN`k1Qo5rO6%MsepL%(6RbK|issJ&rnai`E6Mi}&QHmCk zDpnemQO_wu2azJ9i#6ilAie@mhZyp9tZ}y8*czbER&2!<6ZjWm-<vvNZGaaJBc41V zz1@^A7EfD4b5!&$V?4b&^zNeDVCB?CT3>fUsyu(Z1GQ*#ZEi!d5I942Y)P|BnZ{*4 z^nHFrhk3*w{1CmxaP`bh<S}mtIP4R!r{MU#suW;}%g+dq8Qjm&;{Fc&<Ntt@IV&iu zVh5X7b3$E)0M|IdR-~8Dc{>b|inuz3r-UH@7GEEuHfZt1oE%q9ila1FTk2}Cvkx-Z zO%~(Mc3fY3*xsG$P}9(J&E2Xe1;oX4_3{_ZqKBM4HdBKj<q!F6+fZi!Z=+pep;P?j z(OGN_fIYLe2KP^)bSUCNz?F|AZYXEx$U>vDlOd)6SA<JlL$bv)|18zQZBo~_F0D;2 z@eqIeOQ!BvAn?oq<eQfiC@*vKONX6bHA)vJHK<cZ$DBP^e>s;lJc@9345JwRA#S+n z)MvRJjZzcH)8!p1>H=LHLn!1h;QpnT7P;a8P7CMf{N9fa)#zCMeO=8j9&~?mUMF+g zC<?Z@B(XRqW6O|}+m_-49l{A*2oCs{aQz>Pv*#-^pQkI%n_!Z*ouo0xl9LMZQrH46 zkBVj4o_NIb&yxHZLWpmof^tWwl1NzrE_KI}!gUGRGo|{b?RVI|kCWc5*ljTtTmhX% z<V7WfltvdF$CenZ=So-to@oe=Z67x}1t=K_bdp-aS}*$LpRVFsa4k#L7y#rRE52WS zWnxZ)OS8q-S_r#;iXg0<+DFtfg*V>oL0%3j0L(KF>6u<6V=@z7LcW?tIIVTwuqK@4 z`%{mZoZ9eRW4Xn>IqLSG$O#kssbcd7W<akSyK_IvKOaGo0grZ6htE;wrkUnYUf@-9 z*giDBzJg{br&-^q?{(e@^!@COY?)VQ-y?tXo@wGhJ&3V$T1mH~{k?5_lW}`d83r6< zYv<uP3u>8Hv3@>J79M-^2hpe6*j?6MW1cV}{H4O|JEmlMoN8v8dX0akzwN84A^-2g z0Oq&5@603}WB-Fr*R|XpOA3M%r=!j!24TW*p;dp@bbm!q&8q-(StB=c{ie&EzFgd+ zqsf-_5@Hm9(m}&42P>*M><9p%h71{i=m{@8cam!XzsAK*#5JRrJG~hJ^CyY<iKN&f z%89ffPZ^e&P#SO|X*v2Q`0S$(56_oqL#B4mwV718H8bMb*-89k@oGj?kf;?e#gN0j zcjFyVBaH^>Ohz04vbfzgjOAm1Y=)$ENB^)|j&e|M7G{2$7@1gry*vWwFE!K2-Dog) z?(Lhsy+(7y&f}9OZP_cbx3CPGz7dm^z8aEUf&U2~<FDPU?4`gMn6^4n;9iY3ew(j> z`aPjZqzo&r#X@7F;L#%}kQjITa(laJKU|!$<i8-KX)!3|MiAnf<&EQl#~%zrWfU#; z@&?#S+HsRN*9`vzPJ+GjL2b4>oK`kR+>UrnoBK7;>TFn+EfV4@#tGB4Y51m$iBq8G zuV951OEBNfqPNvH1yE5zC^?|mLI#Xt+I@v3@+rKwxFi;u&U4G<*EeL_%DCQ#;I#}? z306<{v84P!tfSNb(i+AyD_e`bovP|$U03UY-?S~tADLy@x#|>=Agv@%dmQXv+tn%Z z?{Z%O(sk)61+$px*XsaG<nPBQQCnPc9BO|CqF-7>8A|FgSJVkapBEo`^S?ZAYH5-y zMIhHhSA*9CwloD>$HEgug1A0-PboU`4-yr02*4~_8DCObm*boY;AW4d6)fv%Zg8^C ztx4B61mBinW8EcjE8Pb2-OxnD5AQ?p0L?NrRDun1A&YeYT4G;hUOAe+=qq<!0>1Y2 zW_Ooh4nI8I@!VL1ERNJU>}#=<m)lSB@I1$*;O>~^0E<!Yi=^**`_@>hMI9h%#c)N> z<=k4j`-^F!1qCjSm*EI8MYQAT{ZJ!~@WLQgf{vx=M{ye;<y68w0icOX{iU((Y0{I; z16kNd)5K(D?bSc3(Z5_#rwq=l>Vz-P{#?kbob3?+w_v3PLf_NA^zi1lM=i>9HE|tA zF5sg)kfhAO>;O%F-uUN(^XUELXlljpAY3Pj94dgl4M99Ez|s&roiEbByVzHP?+JA* zQ1q<kKYG`u?c)Q&Q+GDPLs16`b>+CfDDycFXK2>C8cNWwPP1GGpvLz_X_u{QEy54Q z{pH-#PVVyB9HMQ6#))eHRvyWo^6%E`(E_cb2s~{pvIAK}0vNBDYmYoDeuUC$jizRX z0`R-NO1Ix{r@0Ska2y4sFA9HlZa)?>qV;kYUKgIeqjnj$SsHLKVD_rYg3mb045e+s z5n(X^l-`;5<o{l;XMd6o{M~c_ag}_Z6O%8($+EnVp|}U%)8ctJZ_4M7;q|CpKB^+; z$o+d#GE_dIcEo_C3RXPDt-K%<l1TgRQmxSst5-F$93zZnG#eqs7@X9UUvCYFbqz03 z*{(utN^o)6YzZ=wX%LXWmpF?S2_dXQ6k|wAi?+%Fu$8vga)-xop1rD#>d4wMnUSb< zAGIUamZuVA1-MmKMS$aJ-%;Dnm9T_2Q)(FRU^#hfSSbz}Se{D)ltOOcw28m6M|Osj z1}$-mc645z6dUo3KW|92_2t^w<S^LxGH5LLIq8a(SU_@G`GOPP`vTlwX_x0;2@69d z+Y>pNDV!7e;Vc0|WFU$$^yRW43oO-hHg=b1u3tAU$Sny@MsBp?I~M)+clZNN0Eu(T z!ad@J;@@n4DMUplMB2z9Nk{x0jyN<p_mv)=vL+tAj=-xMYYrU1*CgShH8FlQjYoQ8 zVg%(`i8yst)znmERT5T}Cqq}2O-|vf@Uf-|TxAR=C{D#;sbcxus2Eqw*DI(O?Jv%U zp%>?w8|DR@DF4ywqAVPV1;&P_moLA2N6%xGUCsbOVh{}^1lgG{0HW00N{Z4egS_!& z)75a7Tk3pVKpQTI=>zjP!1ZbWT6i{9+N~ykM`Z<U`@8R@{|-|1&nWUPesXYxzaN^# z6=51fDu=YDJfC2Mw^$xS5R*b_B6*O#S=Qn6tx-qM+saulxUY=nsN@uN8voZrtpmWb z5$ejahL|Gt(sKUGT2AlHXFum3+<v;Uxxq|*v54V6{prF5l=}3!W#rlO$P1@u;0af* zZrWcwWj}nHPyw=8x4sgzdOhXF^%ayhYu6K~*RKZQ-KaC%L`<AHQh9dk_8f`QT$S9) zOk(?&$5zD7uZcyGeS<=gReWlm2Zk4cZV4hpc``{W&6doX%ksstwyASY^w@`o*X)T^ z>9V$yKW%v6xI9q&w2igw#(=%5IuUU_1-5}>$#u#_+`5#}@s=#?FpU-h4+b1HoAUGn zmH^Y@l9RV>cTG*%o|-(aNlDqd9hIEAeUvly&WRi*rBdYhWNK(QjUF0ib!O5DlpIDu zn#9+uc#QQGYsXu{Y1}OMdTyjpjv#Z8sYrF{F$H&bKtpSDSW*bPtg~ug5yy@k^+TPn zEq4W|9mMgx`YUVNyu08xpS()p^<NnwD5}7n&<LY(c-N!u;n_i{lab^#xXkuZ48}F; zQ&sx<3qzpOs7omnS4($rhHEImyv1`1#rGZ&eS@d1jN@}2PMN`1I+f|rdXTBs!>kIx z?{b%Tm>xG;EMAxYh&xV}3-8SS{B3j#-&NWbZ_jD0DT+*qkd!tR7DXq7Te!Wg9BD1a zg}Pq4<7n$7Ac~i}NLnw2?m=02+?@Jju{WP3&xNFWWQhaIWTpFUJV(|G=esi{J%v$p zhO`ru*P4Fm6t-nKp$LET)#LNsm6f#8r^ErXB^S+Q`65~S<OKvh_Q`k-OsGhgwx9fI zW4^@vYU(j-IlV*`pTLZPCi0xd*Br?$bAH<Ts%mXc&8ifiCO^+SLyvoKnKz)?JJ3A4 z!6-ezc6ck*djFeK6KXL*qc-zse^QZCp_@SBMqxjOW+o*aRlJ=bPdDJi*3;Ox!K5zi zhk_klNWfNIZf&xVZZaX@>?VA`1Nxt4({)z2Lr1}`NY`WgxlwM21Bbcb?y%;WPC@&A zX(~ZSUA(3&r6!~6{)1CTY(G4hj@Qg?-4Li-p40i1==>4H8}q#ryN1&ti9?%EE+c2Z zCJhZEoyV?fKX4!7rUUHLrwq{RzbzN$enq+YMElzs%;cQJyyV=#NC^)Qqu?P<^1=lY z)Kh+7A6k92IlU`5eM3H3NB4y-<slMDu`S7^y4{bQHx8kFyvJ9A{TbD+?l}pp7`iN9 z8n4h*@j@^GLZ84$rZg-s6|4cB+K8NVSvlVXKuH5+Z)Aa+dVyrNBFd#i#WT8sTG=Nr zT6d&9YenuBnu+0#TS~xY?|E9N?)y*>J`6{UDW;xG=_XxQQ94a741T^?pn@^yf(XTX z4T_1<_geYret1ZXGH6p4r2=#Q&D-tPNUN8<#c{eZy>`n&GHvSQW0vHj)Nqw=pEwky z^pmHYukJ&x%_Qk!n=3ZWa~5({s3bylJZh0~B8fr`Y`z9k6u3U0P})(KSJ0H8+jgba z((A~X6pVjX1>f+jDtXcBt2O4Bql-2*YLsaCGsfj%oj&WcavLv@9AuSUTBn`kQYHAM zkC3)<`_(MDDNRK`D_pQf)H`t~D;RT!=UXj$e<S+}19-)H*ynYiv~KjA?H9x&#zEQV zi5en&u8+qVmGJ_iFm^TAH^OH#(?nU~&ZZGOY9XonE4vwhZ_j?KI5X#Q!rPrd6y8uH zkE@d#tReVqzHi4l*BaQ@s^M$fzQbJl;$8ZDydd3fb$+FQl!hG{gx2B!$I_gy`aBb- z;TA;qyDm#QiL;36-U9nP=DtGDw!)J1nFs&?@a+2;2msg!w0hFVA!z43X;_&w;{D=7 zFR<w|&k<l{W#ce9l>*<i-LC0t#VMKYA&;G&@l1xU`E1+cfw?hkh0{H<HZ-{DV>c;r z*^i8yfeUoKvozYP<ofj{Cpu{~l~G`k6Y@_CTx}<9Y8C(>!``aqUEYZD19St9M$<yT zvT$1(B^PR##j&itVn5P0xV8P6oVnY`FB6<#<c9kH>Tc}~6IAOS2aQ7xkNwE^@ll<i zBLSd?LGB=p0z34Ro30t(<?1<lS6+A(GOI4AF1SvBXT4Kt1vxl52CwO^d4A-yEqhIF z4$ZLX+hh`tLQ%l9w<jMTzaycp%q)Xd94x<D9_-%1U&RWflEf>)>`Mi1hT6Ks??n6| zG4L&fA-TiT9ZcYQ?%C12sAj6`KpyFH9%9XE{^NITTHinLeeBLgdFaZIVfHVW72m<7 z-<<JTWLzhg%TS5bb+I*l?RET0dwWArK#t2p20C?@t?3Wk@rQ#9gYBP{<Yd+|ry5`? zWF`8-9ymA#cj#)*SYAj#mNVa-CH!bByB37KVv!n+-v4Y;SU7nN>K?fb=t-}&wLMT0 zdWkAMO(|Z{5nk5ciTVr`rX6o(gA&Zz#kj*2ig4*RKta^IP=|{IbT|^lL3<v<p$TGt zT*$Zjc$I40^5|u^RCfn;U{POZNM&yuuE$^>dQL!wKkhxkVT^5cnJKZxQp63Gq}>JH z(KdJZrE=^X!-SLjJ|AE0v5&~LfuKErqXmW*Kex6P?Kn2c9#VLSZ39g|Jt+2e4T*Gf zsN3QB!KJ2&#sc2PyJ{+qM48A9w*-IBxb_T{C=y&-aE%KA@TfPY&Y`#uFZY&?ns6r1 zor{3%g!%<LJxYLO7a7WvVp4l_QVV+2ZIAy?0z^JE_^9>>eEX`F7)~Dn@^LWSJq(q4 z%wzl77A7moUD&>*BP=EMxM1ZwQy76)vf3+DXHSR-d1B-K>`R~Gj!Qzk(?xm=LnTlb zzXI5_WF6jJ5Os97p^!Dm?Q!{srYB|))JJJMt%JQG=wNlbEaixY)i=|!NS4dK4GJ=; z6_E6=R}PbKccQQ3?`xADub&E1h#vpm-0l5*r%`3e^6cEb8$6uWwEEW<7EG*iwnKZZ z$5W^F5lv1-L(dq8v)0+9m|F+Yx4QDIt!H|vg-pnj8=7uDvzw4g=LVhU1fe?&z-J|K zAk&h;|47fZWBEJ%eM}k)1n=gtUm^M@YaRu$QR-2*GJb+JYHty0?{oUazt3We0@ExB zj|&NpU(lQWY`E_l9UEnq^}X4wdo9ccv1>bB=GSK9uC?L^3KgB7P0X*KFa$~RepcuF z1xY-8p9vfzE!Vxmta-(#RN)w@wlR6e)m0?i$<6B=n(L+>wB~l?%7T;!1r4-8AxB=^ z!{_Vscnz--&c_Ync0Y#5oj?6^i+(vmAI$HO7uN@`ai1(U82HWXpG7P^O&k3q;d~}Z z1n^EEN01{l-=US1_qX|39B8#i1iUV%IoLyF{Z>R(xpLNQyV@Sk_M1OO^fl2>l}|aG z$A^Xb5aY}IPb3NPLY(X^#OxQ{2J-*Z*t_xmy4k&2iYnXHhtr-@{Qa{fmR;yzf#mi_ zK)q!tIf}UGIH@($11?F*j|yP;@WiQ(`GoId7*^-!|6LE0*_@eblG{L^45<1ofRa!N z88zXnjGLU@W>&{WZW<#!`XY5rB9}1;j-st2_>)&*Fzj%Rq9{4zTFpc^xpmjUySH02 zQ)g6GoKWpZ8IPR&Q|*&KULYVzQIsc_+R^2HzJ8g+7<r$2Hpy#UsN-Ycu9cCSy1JME zdpRQmG@HNF-Sy7)E3%Vfx8vB+u}E)BEGoI16Et^;XV_u-cg1bCbAs>Or#)T{txw|> z!ediOwcPe${{+=|M#kDReJGe{E(GIK%`ZC&FI0Rfgwi6<3AZ&RL~k7x&Hp6g77B@Q z+Qr6L-oAPMVg8igiwWqjf$ejL-|p^YSfgR$Lh!88YhL4KO9QgE(NDSBb;TLb7tqy# zN5*p^+v(ug!PoIwvm?xohn-b&cU!k87s}!&mWqOY=xd(|ZJwH0WSvo`LHZfxOz0pi z7TK*V4-75!xng@7WA3iQL>$u%qZgZMt8qE>CZKMr35R;UTq?%L@84$?*7UCjI3Dz& zb=q<wQ&7ekkQcAcj*r=%p0@T>hnH7eXgNp6$s8-|?4HdO1xT>`OhJ4@6Be3k5i8+1 zNBUd&PT%rP<3=-ciE$ddo_lV6RzkWpBu2U65;<SeY@v|+LSLORlYcVuN0=(xW_eg# zNh;PuY<Fx9FL^srZe7H00hoom?h%ITt-b~N-0ph*47>g8i|^OjTuGf<H}0x)h>)f% zB0rWHJn#MMYn9W)t4O8R#U{p$rzWq7muIXDK;Dzk1gP=8a9mw!0NytduniOCT?Iww zqIk@Vn2?=LBD;{C>sUbDyU#v9yJFc`k;Du_ERM+^%&+KvG+`L1AVeoTJ`Q)SNn&xN zDOiB}OUC-F_zX^qtYY;Bcg)p8W-tx{sc4&LbpYRav^dRUo!*?^*cwwU7VrUISKiSt z&}b&(S%*A@IDqcDzXDu07+HLJy1)H*45NHF;S~PCr;C?PKYqJ+u~$L1=RR@L{Zi7t zgW5h4FRANN^|aEqu10X&6Oz{0ou9@wWE1nKa0*#sB|2ER1xw_Ckfo@`uC!d{?Jj3H zrc+)e8!1o=?rS{k1Jhw{6%(ElgdB0{5le7O3L2NhQ_I(_HJLTHPP$#1bo&j>*TZY| z>>`@0ru?EJfmcxZi)=<dm%5X7PpD;2sGIjp9&T%Y>+K2}>qsgy*^VbLQ(y+BdnMc5 zA%p5`gwYg-|Lk=uUuL(g_@LKW*Y+M)1Q0PlVLk~?3LxBV3NMWREP&qkXW!+f%w9Xy zL{G0$i%W)Qkb4-rVn<)OFn|s*q>Z#l*5BpPZhDlbH6<w4A_u6qRI>A4%4e|p1JBQ0 zwC>4|cQgx_DTq>ka>#;GBiyretk<GLE_NnfjsjEfb5cB%=|;N)qi7iHo!O(#WFu8# zqJkj+LO{L05(WwgJkG6AgdUT82hw6#%YTly54rc)-stj3r<!A<Y=r@Nc?~xyfUsM- z5CV`0<pSr5<E+0Gw}G{ql}YDn)6P{wrNL7?_FeoV?)r&=9|4#;W!~H}Ob(j0=e*N7 zYI5w4JRs6)V&DZZNrBaaP{scMQ?2aEnA=)=_9LSa1m2Z%o0Fh_&mJx9Y0GYl&23w4 z>nEOjblusvS+p6)9{NqY`oeSv1)$o+uqomt=RJA#H?L<Q60iGY-P*cnwWyreRLQ67 zmnCV4eMOweHM=7^!5vCF@!ISEj^XXor_!2Iof|k$0bcrZFKLuhX>|$kO^ka0uhfUH zsR6?~`!|a=)n(+2;4uvO4`f<@cJZGr(=_%|(1Tyi<9#yz!ggck^0YIb2amZGxR6sE z#fnHjOoVN-U3Z@22G`I%#D6yZtW7<)aI+~`950Vpo6AD6!%D@;9b^4X;+En}m-ggW z>%a^Ni%F~UOlrt(1A9(6c-VbUnfr>N)~AXaL3Pno!|2h4rav~qSB;n)>u)VWH-hgW zgsBqNq86V^guOF;c=DZ$xr-SHwYuw1poKj@)@?h6-I3mv4pvTWcL2#Q>BV-@%L1&` zcj?)DiPq=pv<EiLnMGxTgEpD|vEJtXwTm4*Z4cDsUipJ++w-+oDU^Dh_9LhEUm|kz zG6$YH;PB=J0EMxj{@SPi(DE_Xsvf<TR-D+NPTM@@gjx0FeB$sZ0!rErP6gliw@bw2 z4rDx~0Bs@Q(kTNL+*}qfOU+WqLIn&KHtdCmr!d_d3%kQDuYu+QNFlwEaf9nNr^c&Q z!CNQxpOgQ(z4NUx<X_K~4lcSEe(KDCT?v%e-iT!Je_5bJ>>(n4u5s~YYmSSqxtS9X zW1CW`7+-wYX5s(WsqID+&)vdNGJJD2IfxQaUG4v~JrR-a9-tB<)OcVsGQ#H`A@|h% z#-iYefkT-60Sae4)Nv~#@E|eP%T?`r!Kd-`PH#ib^zeaFkgeF`ng?B#-z~$2maN5% z>=u~2asA=Njln?p_4SF?y~$ot0I=J>qLm%+T$~i0<v!w^Z0#h%>^-WReb99eF)L1% zb*x{36^sW&B}x#w^H-lexW5Itvov96zwA}-&sSthD}fKjIaB|pBj1@Maid5*N-kY_ zb<^&!Uzf1ITka<A`!%V`D%g9+jOLeJ1%H`fnVr$4c;UQ?_~Mh^a!-ZBFXhL_cX?Uv z75XMVK!Q_zseFn$<GSpQDBlx(D)zzxik{_@*-8D52LzgG4;+?zO4@Rfy}(Uxy-%yp z1wf+o7D&~ot5_)s8z+o0E@e;l7*#||VR*i`FFS*Mo;h7`q8l?qZ*BVJtwcgazL(8C z?4dd#Kgar;*2s6kJa+*GLTU3tq%MsfEe;8xfY{3}*nL{%;6t0iW{{~?uiih8+^+{g zv``%ACE~-PE9%Q^MPI3+@8XYgS7R@8Qts>Q{}x*gT*|VMRtc<2%Pd!%&9{?P@T|QB z9vh3wj;S!9G5{-kW9HF7DdPZP%;lXFJQz#pcG$!A%ym{J2jz21KaR@EHNbq$u&hkR zF@zgF(Lw|2{hjvi6h_fDm02k~6Gi;kF87sXIlc+0po4(Gygp5NX?^x>pRrO4I#)C` zpd7R{8B6n9v6t$th<d<nrPd9jh&a@xTrUzv-2xOku|zM7z3Z5=V{__}#XheN>p~LB zC&H7LCtPv9?RN7`UAd*RPMW}ALXW!*iHz*y5lF5l-9Lm*BdtP15Az_ZZ5O(-wm`S- zFE7+o!l4Ci6?(!DbK^g%q!S4*X#`+k(CkK7EvUKH5J=L#TT}$O%lmBbrwfldp$g{S z+_-u1=J2pg$8+yFO@ph8mx|LRtBgWLAxYn1Ci^SNQEtDJe~-tKgWVyCe3)_b7C+_m z%E8r|=cx-f4z_+CN#3<WUMAwz5fh@LOTA)65@+xCP^^<RRmlhfiV@MJqSG#yEk0U* z)9PbZ5N>Tww#yInee4VTyF9ltlvOsSZ<W|<_T|b@StExY947;X6eD;q{(zt0GxM*H zH%kreCwEe=ndTWg<RN)IjQyUZ@9?moWQM4fEXBCpnq5x>$|8@b4Kcn2-g;A8VG6B~ zrEjv8sy(knL*bxwk&#0*c5&zVhumMFXrgD>hBXFOLH8AyaTh+=%sw>z=`?O{`F;R^ z+Mmvw(4;1=FgYm8cJ~@72cgPcb&WrKMtnn+1J{Il0JuQy+B?ti&^VMd5U{WN27lX3 zhHX7o^4N&`&0VhL-82k}t^M*!wWQ=kzsH-w&+hA}?YTbYn9`|I^^Hwr9v%_A@tA+i zcfAizcr^6CTuQ7j3<MykQ)Z4Ip|G?7b6~-9b9Cy7(!B30UO@=Oq^_7Rp*_yEnhrrn z>QsG^rK97PS&2$Lu*m@%`sG&qUtl83NF^(*81ZmsukwReu_YH-LV*DmdW=AdWjgc2 zAQlYk3||}8xmM3?pM_wFb8AA5MKU4Rg5gGkS{$}MAZym0v#zpW!N0;X+biG1cMgQn zoh=Vr?hk7&8MfGH#ez|smu&J<?kY<-KJHW8x1ua>cJ-n^wY=)L5Jc4=y>H&BPTC;^ zsG1dk<piLA9BKRh3jo=Eia*)5TO8>0EVRkM%nS6P#d@q{LM-~Po{<-jLvyK7iu}Sz zuWZ#(81DKX+{Hg6GXu@6wv$t9MPA6^v7gcYPH1sXk{qLqU^{dt4%qb&d9y5ICwg{S zaaDhOF8*?=`hlDMV->zt9=o&Qv0--n=}}^ux$3AdE|r|}hPf3d?OCB9H2q6o%_KKQ zSDD~1j$|;n3q|mBhzU^7J-R6~su^w-hr2MyGkMpx%jy%|*ft1i>DFw;M+DOR`&MTe zp7ip$NQD;sgPUD2*M><uP%<}3E%*7$^Sj4iI&rgF`>Gt@i=~P$EYo`>JBUi!pmVt_ zC~kC0qjU<xpPZsg{d48+zsZKOvc!Xf|L2<v%cb!c@vbD?7=#eAJ(;wJvhi44S#jdl zGU<po!S(?E)L*`XHzE;H%b@H<d-A~>&tqw@lOH898EWq@53anMI)1jHu*>(qUB1j4 zFHTRF4wpyK3*AFD_+Yb{#9%kRC;A_zQ#%(PS8lP;K^BI5XA_zGTNM&CGmDvZ#y(cI z(p(eO$$MKbzn|%<&X0B3<SwhKfc0kj+*wzzF1d%VBX?e4+2S6~+_MG9w%ts-w`sU{ z{{<xZE}!0EZ+}#9Nq21~M_&P0`PZicvF_7~=11$cr~doe(O>duS?hyQMw;npaHM|9 zGonF=O<sK`V#QKA$Z(KqN2Siu)1rED5|wl>-ggN4WcujI$$n=#_m}nS{bNw-^z`WP zLF@s)t7o{gKK?JjDte{W3#jWSG@uA#LR!GMx*RR?d5k@E^Ny(brr6^zw4DzB2BK}| z#+2_iTFhT9TbCIvG3+}e8=qa*ASJ-XC(jjWG;Y^8x8^_t<wp233-H+Lw%N>1qWD9` zuA@kho#OheL)6e9GJZ?d3T|+B2yfuP454IVA-CImd0>!1qUxKPk>UQ~GE>>9Tpye_ zK1y(c!%uz}!hqxO-Z-H*<`$$$OJmg&h`9CsSC4Hit;KlJSy}>x5J|jo{9pkHF3HKO zDR;`s+YnX@4}~|=vPiYua_8*a4Z+ne(TFBm)@*KVMYb>4PD{N;&2&GX^z3K<rU%v? z12L2bdjQsXZ~w_+H=P1-)C&C|XPz9!{5(CLanRv(ey~U()>o_{g~99}Y*#PllRx87 zb(+okvNa_9(TU5fnIr{xaK_|RIdw=u1k<|*Ed4noQ8YVPp^3Fk3Pm1;9kUEw`CBp- zZ0@DzF0Yy#2vJ_rEr|GFmA*A}2A-7zQT2CMzM~6hUA#m*4d&<Cht{m0d<US8B>w+i zFRp4CX{+`zKD|7qx?>FGN0(i%XIzH|MjmXBvL=0*DRQpzfL3+6?Rl*lT;@~M!}?$! z?0@3O^gA}UXD#`q(PbO&4$MzDQE%rmmWIXzlHxjSM3$9mMcJ5w^h{4Dzv+Ti&Q|jw z0gse%7VgD$;U1ah3R!(hO<mUd%ZtrT-MuwHJQaD!FOW|}E`s{8_(WH8q*{2jtzPWe zWB!Ae`zSpoX9<L`{MI3ru^TL0oZ(LSXzf%QCOW?+*S&(S@()uLt!J5|(+>K;UwaeY z!`yG7>)~)`dv0wois;O;vmj+@-k*0bX^udr0lIMTmlj)W(`|tnG}L*wyNeFt1A_gK zc2M7WDj#{Xkz-<h1=A-GpH39`5ws@?7ysv1aB|u&;**i~<Vioj{aRZsTx+ehdGTL? zb%C^0rDZPCg0%eSryVht?dD;okEx`<wxCQ_R_d<>*c4P2fC>tpu8QVrLu|x7t>w}6 z@HeE~yri<|I>TT_-a>Nn!hCY_wd1(9kf$K}2JHu2!t<%}JXPYAs$`xo(H*hYm$|T7 zpA_gRiAyk}9LyMVj*ebY+m)1+(#3fJ37pv`KeJU{zg2npZ$FYZmrKZyi)vMdL!}M2 zV}x*me9tnIJkDJ|DnTNoD)@l~5(d<c6Cw=Zi9~F!P{bDrgnodiloNEj-FS!I*~CfR z)aGcMZK$`G7w8EvZGIj%l&H%~@U{xG4uc^+2Lxm%tByOjuLr)Xte+{qV72h#>OJWq z$CYf4H8Yy&(b0?5ehFk1KE;1yxZVwk0cV{)^mDBygBfMr8;p%Q24my4UK!Gb2W&)W zxQXPJ@5?I~+V4pD8;t@GcNa}yw>dBEx3{^PR7hF$`(ysXNt5k(l$~du=l)8kJbSIL zuMH6ZSXWUzuq?EyyDdo9(;iwe&^79hwnBPZq0u|Mkye%vl!2QkK25jlxag93Jtg^k zxQ|tW7@)#9LN~`)A<z-@FusHfzTn(lZSl2H;>mVN42HgKCbbb@4_xT$z5JMf<Ym{n z9&ry)#p9hP+VAU#<^|;^;HCBfQS5Jj$+!Cqyxgh3`d~>SuEc^b_FXMQ2b`V6FK}I@ z@>b{Oyt4t9Z(j{cnTXZ(50Kcn(JAg-Ax>dc7M0ZpqyND^x=)l3^dBwY&vk0CPvb)b znGT&b=L5HFn0@NI$^@u)(O-|OC!qA5QdydTU3(+q){k9is)#6axu|xpY;X4hGCxON zS#V4g^RGQ|jSn#gRIi;(@cef_bL+j6YEN!YrTFf03l>U}`&OAd?)cTKPS-h?1(-Jm z{Oy?KC@M`JT5sn#_G@Ew0<YP5f8MnhU(jH?sU2F+u8N3G`>P*h6JMJ{w6$oWS-Ek_ z+jX4z8II>opCxJvm#>BxbxG3kZl*68*w{m{ju^`cZ2e8!!E$bgb+)p10+`N=z2|Vf zCkH>LbqRpFx%V3rZ!~Gb2L|*b_MrYzNxZQz3%ur(!EZygU-8{w{tfT)w5CMp@xte0 zKbSe<to<H>FgNdVw51MX*8566lhq$s#O?KA3EUyI$8xe~yNO1OiyN^@^P=bDlbG#Z z5nj2*=v*XEoF#J*c#xrPW)G4)r#Hold+DdA9@>shg~j5+%5e#0xKJhz_BF(tw+haS z(%Pf6<!T*UqEkt9oTs`~e$TYvpGG2kbL5|F1*c;J!b2v~LKfLhR@GR6i*IJ(+)Ta@ zf0b{JsSqn2u%KHB9{e0L*xI$pa~Z6;YG0Lzk>vQz%y^%^&;2=D(W^z4RdP+0k{lDp zO!>cOo5A0+gzvO7W1M62kg=<TcTio851D@L0CK-dJ$+w0EHHJYvHl)1Qa_c8w;NEn z_8?q(ToprJ;>8KdY>I^?pQKs;qV1AQ`G{PNZ0>8;|9K#LD|U_0;@m)G*5F*@CkUKl z^YsK*3Gbn$H9lNTW6iDabQSc34Hxwu?<DDy%b|<s+Jj7QfU9DYmvC`{GK<>$PjB|W zb0H0aK7$6mdu@S+*f*RLKXfvp*|<hF#!CiyhWkZvQXOVWOXX!X+hP)A$>RZDoT|_u zNw>%FWDu(Qqs=YE4VgpLl3W_i70u*zTlFB%9eYO2ZN>yFUox@e_|3lR1@I$#+h+5g za7EskLB#08-i<G{_XrLzcRX2IDvyiT%8I-MlHqYU)+ZL#Jg0ODN;-BE9#eicN>c^O z$Fnfzr+HeZbHq<S)r7hF=%coR6rT+*kmGi>R%u=skZA{!yy;IlizpLm+qa1K!(3e# zhihAMy3;hnoiYY=80_&j1f=IfWAT16X6Tj*dU}paw3pW)VImxzI7Z)ZdkhAfoBIll z^C)?aR|9wQ{3Ce?zN5C;Q}jPsA~Wps-m1?}<QKT`&|Ym+d=TxgBM_JwG`~AT;>!%& zrJw>Q44AnOdFlP@(Uw%ff2KVSM+P#ygBg8KSwH)6c(nb=Y>zaZ=kJ&K!JVX`3mCFn zW-gkCHO&>Y;0O`JJ<Yk?e<w#6fG=4z|Bl1#r#>AY&wv_Df6L&W6rT=GKIS(2Z|=d; z6+nTE&%_0VS_=JD_jN_Hoti-m42Nqgr6k`W@QYROwN2@s{AwQsZ3s*jHTp?@^Cx4R zwdhNs){sI2*ma%@LumTx-<Y-=mYdh6XFuA^oX)I%Fwo&S3gW^2a40lBnWK=#M;YU( z@5sUmc!p;b97W{cdk7rfyB4Qf=~?Mh?a51`+n#lci;Lt*OEsbsny7$ST0o-Gsg}8> z`e0_}xfMHwdR9}Tmxc`z{zhiT*;{YVmkacO2SzlPdaN#TvL*!OBrrD@rt_m^(iMr0 za|s=3_RC;}-AQTeOMUN0f1*be8~1J`+$34nZ2_z$f4c^n5f_x9an4Y4GZL}eU0Uq+ zt2jRE{rAZ4AaCFAPmQ3Tr3p8Gxi#l+*EpxEx#=2cdR$O?B6hoLvo{@L(C%38<UHCG zR^G%s;~r#hp^r3V-u(<T!I-*+W&t&MoAa^}yy{i`PO&j$YR_Wx{Q!T6a<h_n(^<nU z0R<$BR36mg+0s|f5>j5h&&1#Ry0r7#r)3T2@6u9UJxxe@bsHCVb{>=a?MX|_DXGW4 zyAY8#j}^r94~|tw)WZe7LN=F07pmjJtR21|lhmQLezBgR<qhq4|LqTHtQLiEZIu=& zgb_p|hxE=FIoa;sUSG_VFgyucE|70WIN#zf0%fh-8~_Xqz8jmXpV84}XPT?<Xip9f zf+nOhm+-KGto|MkeSv90iHEPSViC98EPiR>VuwZ7nwVEX$85JlR%3x#Vu`!EFyM<@ zxk>C&oljO%kx6{9N0NZCU{!9SGL(iZu4JYqcq4KJqLixfsZYa8S4Y}(^aix)l<r13 zO@)i%>wb|>iZFGwZ3#ObTvI)k)sVn??EN*OJ@{Z<b=<0)&P974sdOp!@vG~$?h6T~ zu%^9iqx!hJYihE_5*pyBz;$*ZqO)$?39lV4yVf4R(z2Zq3E&gg#h2RMSyM?F6nqRB zmgShNK783Iv_-b}9!zgbU=Mho2GxWlNaIyfO_D`yDB`f)G*U)UjigZ$Sk*w3;z)bG z)d`1lzuZ{gCGT1AQ7C(s7A7<{|5nRo6$#|-^XFs4(;=GB*q9pEdmMzE^ixLMR&&-J zOlW&iTHvesMhW`Tsr1%<xY4*vkv9Rr88wm*fzVH|GvYom4m=xr)QHiL`+d3!rTBP4 zaIe@>v-Ym1X`H5Ud2k3D5EZBpNjik`B3y#+NkU%-r}hTX!|qjhX48ZNlDq>KUu?{` zpqC~R($A><D<A|;TWDEtm`E*%DQWTO+i1vSggzH-@IfO>kii`HGLoT;)D_I>sN(t2 zJQvZ-8`KuJ&JRk6_wr`FX>(a1qB7|e5H0?lYwQ0D<Y4xBMCCPhqdZ=M*Gy>auHK!* zl{e+fm<dNcagGAsHNTwj=GTjRYxUx^k&CrKeqQC&&K0%2E%1!YI2bu3T&;gdfINB& zp4J@L)OByux7xIG1LWpKapatW(_5ZYB7?((jQ<9opbN&{*heKJcx*=|YjRcUxqdFH z<_V|%HtoBG$=@(Q*z`r#&{7eF;QYrnDO3W|F6kpKT<4zkIS%>0zapRXv)`NawQ=tC z9DM+Xw0Ai<YLCGvhodbaRde)<5rt(z6g~9rRM+DSZ0Z98#Xjq00#1iRrolc_6U@;t z9e*94Rej)XGt%7%`#kCfw4=|D?ib_^%rS!g_L<9h6Oljy*hrx*YtFcuA|*^jWgegv zaPWxSg3}2Vt^qDcTu9a-jqV8SKoLh*LiUyB+;<C;zJWy_y|GY*o>M{|3xp~$6n{OC znp0XP0&annkWIS2x@=_R^*@=mfm`Mtz6?j>w_K};y>(ah-UKK0`cc*N6Bb3m!NPF8 z1u}Bpf*)Dtz!!Oc%L(s(yu7=bKHY5HAC`9M86;lODhWAmSX>(A&#u?S8}E3)vs(7) zH~99%_I7_-*@GsHk{lH6j8K)>GBWniu3jl;;JD&Z5a89rPETHB;oOq~1&#?Nlj~ie zn`@KWqDlU&2^Eei5JAAAf;$2Y&3AjD3=yt5dg*YqsJkf>opB@@Z*T7%X1QdM3R<Yz zLG(`d*z)l8o0|=S7JBb-Cy|5Pwur+@)3PsVj~99S?;%V&O3U*SxC~rn_vg-~OGtm? z(*{@jEYz6m>Lf&KhdPB0(`_TkCb!9EZ}o0(Z_(*+xa}{e+e5&C``j|rX*iDquLl-# zJPTNeMc8wCuof{pMa${+2uUWg*UffL-BLI->|UO#Y2V5Hx6s-R=Qv<}{odECkY@^< z@oNF0iVdK&mN9vQtUS}pe7rnGmFrwuU5A}3)}4)Q`Pn-&O9r>(1~`?n>ED?MMm>0j z8*C@{jx#2%;)@Ux&<#ShARLiBBE>4#4!&Mw3$(X=hnUn2*2*=&Q{~=5{hIPvjwLY` zQ9&X~@=-v%=v1TPOP)w6b>Y!h1(72hio*=9q5<nr5aTQi$6Tnx9{-AN+0c*}0&ONW z55%CQQa|=czE7cKf|FQw^yhUuG$8Q?gYTch+OJa_-7`4YAZx+Pa&1q3HO#`0wp>6( zOlAPvPdQx}6}kZDMl~UZ7FZ8Z$%NXZu9nh@7#y@R5KWyrv|%s%^d1kL)DnavkGK!L zkhGB<vc&nsAFdH-g%%PHZec8*eYW2Fy#<gX5C=wWT+go4v<@JYDMaEY$gMZ;_bY&7 zT_H3#mEE6L4|sgjFR@+-{vW@U@rzxPn?p12!pPKHC$6W`hQmBNa!M*9jaaD<)aKk- zFTELj!3t!&lw#kaGPC#_M4-;t;MMh@=?&2HE5WkCBIu~g>l@o20AP`RY#~gT&x)BR z6y9lwkPB=RPVxFJ_{;obLtsp(NWa0YfCJ}5^@LTA%V2!5_du?nR~EHg-&$8;AD@9w zz9!HgE}n;fOJCr=VpM`HU3a*|=;{0uV%<*^`~TVj=Q3`lPgP!Cxl2p2tzf<~aQbH4 z*^aAg540n9y^+lzR3q_=>9a@D?anQJG3fZzlmv(Dm`(G@{g@Qn&JPI}@ecxoDn{KB z(p}BuV2$UoLysoOiG=4~Hb==l<y`HipXh!X?t;bbr7|(4U7PWpj-~FK^rGKGz}^?& z<y@3Q;rj2-Qfw&NbBnj?M5iu0ZGY~cJHoeDeAD=w5|mc#A?IBI#9q$va7bI2&{(|g z1|Il17)VFzvyIB{t}d#}l#RIPu>9k}AB~|{TcZoFQ12I3pRV-(Y+als5C<xUHnNo@ z8~RX+6f}0O@!<8_-5YmTji0sTZnpjOju<S*=K6!Psb~C*7dCxEZml9-g$Dk3q4b-H zAMohCQ1;6BKW6(q0bNKi?hGkyq}5t2t>z3GBws3hNBC?5>047gVQ9%#;)dI!WT~G1 z|7?wu%1JK+GnzZ1N;HF-jx2v@0^tA$F-Z9AI}{ShXW}mi-#DfDpB@#5KA>qLrk}R7 zF6S>42vpjR8{N25u@3*@?d5K&l?!Pqh$Z$Rr+{<oHMz6VsyJjDqz2#D@6NXJHQeH` zH;_^wxi#utUs^~qF-oy6Evfj?V@rIAX?B_7zkTHW=G$uOS@;j@MddP*J4`)C+1&|> z1|1ocJk003Kdid3$e3k3y+id~Fb9v#yO(!bIkZn1adur(qlV^$W>z_NLIrVZdriAQ z(B8K;HmJxvvpfE;`(oSqwj9~$lH{-ek%-NJhg^kxE!7&dYi7=#&i|3aa5<j0mWpA= zbSk_GLA+!Wq3AIn&-h&X_d-pxcWQ|?DKH=Jo0#GyjDR$36DI|ccXDFdcaNr^ZyroC zD;3ZpZv+2uTc>gQ;GPrEzyO|8k<TT)GQs!OpR+^{IzyS{ccS#xpdWoG$#WrkL0<`< zUOl){M@o#M$$}>WWcXI|SN+=k*KP9GXAYj7?gj#y-Rhc)V1tfr{672V!h@UFlO5n* zDkCT$Fp%$5=yOT0LcrhpbN0sRr(;_+6a9<QDc?(wq}OAUj;*lIK%Rz|ha4S3ik(s; z_Z+4K1^we{&b80{IxHtGi$5_C7t$c;HK@~<gI?}9j#7P%6GIbaiYbb*u3JRqP*NAK z%L@0xa<WezJ<BJngYtcKNvapltC1%?gO?&bobLSL$z5)CO5?0j3UAT>IqIMC-b^FQ z)fAGhUPwOL0Fz;-Y-0bPbOFn_rNcs!p~f+P+PQxE>Bx4;4ayB7b&oabKJPGjCA<nj zI@;VB-q-$3YB`myyPYUcC_Yh3@~~4j`rrM@Xqm;c&pLE6GAs#2<M*mwps#Yo4H0-J zZ*Q0Xw(%TX>RX%tn)6+Q4!wQ|dY)lU{`vR$&(9AowrB<JyENWvQsq|3sHz{GZ-Iv- z2n0zIyO1qRXY{!WcuwmVv^i{f{d%I)+%dZ@QE?PI6&%wM4ki*eCStn&7Qw@HEq+OZ zS@AtVBbXBbPwhIsaw|i3*$VxR(&OYBHZgQLdsP;f9{v81g-WOs7w1iQXOlTP!gci6 zZ}_Fjmi^7=;(!)xQ7t7@PV`c&!@vA+!4V#N(W+F3yrnRSm@O#!?DC()Pyyu!k87&9 zOi0$!Z_=?G#~;}l_`w4Ueix5^Eed^hci3FEY}*Q59BhQuzJl?9LfSRnLKo*g7T9V- zefGgBa{t|AopD92<D0;+;OG#}()4cx?zIo_es9Z{W0^7Y4F2CYzHlr5>Ff#2BV=3F z>?wGoUCdfKNSi7HF?d+YfPIWCK3Yr(j*hUs5};WZ7qfTn>DRms4HlBRxNmSe<wJ=7 zVAnyicv)7n<7+8XoWw4se-rzA?UQp6Sm-<UYUjF|x@_2=e}zZ{2QC?OX{fEC8>8`T zMg5NBh4Gwi`%L3QvM*u=a@ikZ`xjaLSi3BGvrEc1Jt+L2lyY;Z4KU9y$1-^}k;VeD z6Y+3QFRRKEVcm^RwXi0bG1}Q}^j_(F^L$nWtZkoOWI#z&wDbOHB-m?jBo~2oG6@=V zs?z1<6Qw9I%AF4ttadIdDZs>F{kM^^i147uyWQBqstql*Ap+Plp&RfdN%z^IO37u2 zc6k_OBX-9Xk3OGG$c-O&$RhSmxwV!QsFDerHB7amk1Otdx?hA&l3ibzn~}m`b_V+f zu<5Sd*a);JWsOU?M+OTHR!%LGu(IlamKE?g$Ve)wP-GMXFk}1R2u%8v_I5u_y@dV) zq7RopVl+ufd2p@Am1tFeU$)(5v&Ql*^nn-YG<sH_KAsby$UDHo3zZiIm`0(;^Q^xP zq0P_r(b;_4tI%&Sa4AdH7;IH<8EmE2Vwu=T82p5=6#fWNE!0~guq_cLED?@aBJ38r z7=&0llvz3-B558@3qw5&7yMWHVBH9)&1n7WD2Ap79_~aqeC&Jz4z{a`BP<lpo@;fq zIwG6nIfdZYI}N*&<e8`@2MoL4oZYZmaD+lVGsp+lt<+|;p@-sswf7zB&_Aab)YiTD ze?`wRA~LGsq#g(AK{N^Xg?9!~p_+(B4XkktUn;NVXUZ+N#2E#$%8;N{r5n>6y!>DR z#uN&>Jrv)avBMY0Um4bYQ)y}5FPNs{{ud^(C7zK!m#z=)3U)_`GD1DG#pb|X%YR!< z+a<Wp3gHW5H?CqzgyiB9OAe{Zy@gA2X2I<b^G2M_$M7Y?g#75d9bQxe|7hIhtOT%~ z-l4^7iuXd85()W;Ds180@~TOMZ&j;Z*}Y-uei*Aam?Sja_NIOg`$!*G-J(7*frp=r z*H^hDG7{FaZ#b%YSi<n&uIS*rPCqLvz@K5dt`hrg<p`;p*f93!WYpqFTLJ0|s`W21 zsu)mmL=^S9La-3LB|<B-2*FACWg_Nj#UjGCiOcbSO^ES=OGd7TEHUq4Ovrb9KP07p zz&<6%Ep*f_L?4k(xFJy%fe?yn@Z%`*q*gSc3WLfh51wFLLBWw+<?LxHMzD#J<W>%? z$^IAKLGyH`xu~b-Xo}x>4my>!QbePN+dN31i&qE`v*s;ym*HDxCafvG)G;Cd=Q~O# zoL|rQQ5#6~6giaQkZ==IWrhRn;c!!8txKPpFvuj}6l&Gyr~VAb3s{y342WNgUL#DQ zZNWo(Pv5M+OY>1Sh*n9<rkID~|91ab=E;Tn0H*q)=h;{K6$}3Ty&brZb1_`Zd(*D9 zzyCFsK-uQM&MdL2>fCl#>3JL@G-822+dY(Rt$1O(h7Kf`eHC2Gsb|o7Ni!=b!&X=V z%U}hpgjKK_*25OH`O~&*uahV=?SbBHp))$Ym?<lECvA`SR-BL2%sA?6RKf3Xz8IyM zDF`c<ZUB}G%R<jc=?%GUNf|5SU8S9ep}fGBg|KcNER_*P`oPyanrzekS@UWPa8`!d za0ymqON<+0)xOLyvBnk-Ai>LaT@a1<2P?3{2#kRP!?3T|``PQLkE3BnR?z*O{kPBz z7)ZZN$|)1l44>7YGJ}9!D;hYK92)2NQB3(!nEWt~?1o+n<1U7OMcq=dN$T(CO=LT5 z$RDsxmDJ#*8CIRrLsFQ@l(EBe?+J!?{yz!jP`mf~Zy&41W~5uhTr11BGl`#M5331$ zRg`SOf>tcH5=2M+B_pYa;t^h&-T!*j{}>-KWcz$XNjQ1mJJ;Kl><>F3DN?;8#=Dw0 z9$0tL()$1Rg^OtT!uT8E4HI4!T?~`!_Qgy3JFdJ^mwoK0)c4CQe1g@Q_A7#m$dfX> zBM_JSdZRG%)Z7$h3_VefMlb9M9UMVdiJIU(!li+8yfIuS5wBiPw~w(9XPIel-G+l_ z7*h~3EFk<wJl$WRzZ$_(tXL>h{9ET0?L5k>2M_AH0%6cZa%N+iR&+#wevXF^<UIoo zj3AV;(eR6Nz&k9yBe06~i4!{M&bRW}br#?Pvmf+vJIzXgg+&J&(u|s4V}$8Uf`;ts zKYicx(qF*t(UqgPriXd5RnaRqNpziV{vn<V`T1SFGVD3a?K3-jf`GgU!WCBUNdktA zljAo0M$_*$-KN_bYjq~Q?!O~+&nLcOzbn*Fv33ugX6@$4w>uoS<A!eN9<fJSg+bY8 z-+$pTXT1X%Ycg#nLNXst#`&F1ti`9_WxhvJdu?k!XFz?>iQ_ihhTC+TZfmuL+u<hh zs}S1AOv39<|IM#^Ra`9HxhftZh7E9$+X177SoQQ)4t60%4|G-zv?b;^$8ESxx9PT4 zTLE?=>PD>n&*-lDQyG3!jxr+Kkl|bEYwOmyF(Lv#;@3iP`V4y0Mhg+2h0r-#T8ptC z!cwiR#lTsSZvkal<kusypSOhIp^E>ba0J5Mi!T;L1pXhjB0dXYkPtTNzR%-?H7JZN zkh~VOl&J_P9xh$J#5CKZz0u&9M3Y+8m%>x6+#<ZF_D!Lv@+k;w_%wPo*tcr37S56t zdjb7$w+Du1=STxk)UY&f*PB$b_N8Fw;*SE$xAuuKXbO!<1r#Xc{UIlh9@Gtg9sjky zOuens)whrQIhS7g{aKBy06zTQtcX;1`+x7SU<<yL%2%Wrn2^X4*yXc%zrtCTksUcR z+A;D+9@YJM^wF^)Eb>^Xub)hRj%d&NjM_hv6Yf57*&3gp89xjn>x*)+YQLSESr;I4 zP2)m4c}bJ{QeBEm@+)x=2e#@YV2{9gzyepCMyie+BdwQ0Jg@DeI2f;yWaj#dL!y;l zz-FZGCO#PWku&2npBM6cl<ae0u-y)moHJiE{-Ww9g)A@*Llg9+zHeq9ZJcfqZmcn_ z^XAyd_n6(i_21#c(J(+TkI)Qme$;_UK%w((UjF_f`t1|%w{`XH7DnFY&XPHd<am6y z+gG~D7U;Z&KiZ_awkB*OrjEyX!9QbJTcq59L0z?n@t5d9B!+nv=zq%dZxu#j-Ps=W zH6OqtvAhX`|A9I_K?e`agRb`5-FZ20LlWWCFFXmNmy3cAPX6|fx6!!~Hpx%CGClI* zcXl3)1ah~$7uR?8h?$M`eeG@a$hA53{%{z{j&5N2g{*g0+yGC|O`%f@XSgYM&X_5> zY1?7^cqFYd#?YDtX}vt|-QLlwHpLe3auR!LGqMtz0v!j0GuOt5)i&@vW7j%}gO!g3 zdbH5LtN(y1>zU$EQ%my~>q^@kn7!w=nB985+j;y1NA~PK^^97nQBskktj8c<%t^bx zjwF{l73Z$;5z;>7%;6LFcP|+E!WXMc-a7NIsoBQ{v+k^g!-y%e#5Qs*um!D#1<I!R zCwXCXkSv4Tn_E%~V8E>@c5O{ie+hGh$N7;Z+=RXLNyc?ge;xJ89*2Lmhp(@zC$%@} z`NTBbXU?xv5dg+}80*utuIhOm3AnV1!W~xT%&YZv!ZIXR%4gSi){M~TJkd=MakTqC zEU2<Gt+AoCs}37{0iUoPqG3PH^-k@<@kv4b?FmxA0l5g`M$z<w=3_sc$qC0M!_C`R zaHo7o63ftT=bIBXrbdjP>AV^dk_qu*T`QuOJOdCXuo3bX5o<5?_KcSA(&6j31-C#L zbZ^D5CpIv97#L0LARVcgElR7`<k-0lT#s`7ONnrZ8Q?slquCqmfZPIr#xSsFp==Vr zTWw=D1xj`{6duqaKVdzeBQ-?M2Gmb@(sVZ+1KZxwRQp3};=VPVCx;%FhnZqm?{z&P zoS)-ay9kVYkNPm9uuI_C@;s&}uz=s41mYPh7nP)yI5%~u@}6_3(7vzez?nCa7Oxz% zKDmkYIz=BUo~tei(YZS7Z9PjqE2^x}6DRTajHln#$NE2(0{n^mwehI22=4|V2I5ct zc}({%P(>YxxDptclX@qSRv-iShwu);S+9S&`||EA$#eS*sk$B!I2NiJgt43;vul?O zu4`P~d-G_{tKu~|Qxq#im%JZHT`V{Zty!aLPH<HahB^o*L>q|H8haSVBk&4L?V!D5 zO%iR$nduIS_XEW~#`JS}Sl4`8$C`dn&KQYDf8w+uiO09%vu^m=&IRn@HueR$-ulbV zHErCIIwuU*2-abDP`{f*ggo~z%eHxlej<JM9y(BXH$DUn-sXX22Y#C`+j`k&xUc^B zmaW0NGoYLK_fP%Kk{E3(Y}9D$TWGf=o-E!^E%0ucWw=vT&_=X}B3tZ&nG~OnYnOF< zt$8}k%}9*^i(G=*(efk$MYd}t1vz;~K3hJa5`9|}dqkqoEiZy}DJ#-_ZrG|y0uRvw zEYbkg9zammuqFWSQ*3=}&)*M{)Ah@e5YJL`q3osB4&1PJQklcqZa~nPw=5kRHCX2J z7t*7b73VB97p}R~;J^)!9xmE#o~e#QzPp#zM-!?q<&sqrsyH3?49xT3^PotL?-_&& z^9IHR{BfGT_{gRomul+0h%!XF-a9)v0D4L8wLy>A&$%MQeExyQ<hHgmWb0p69X=?I zs4Ml4KnVzs>qe}WGAG1SFMrJ!ityMT5D$DkYF5j;N+piXG4X<Z%2_ezX5v>6aU2jw zWSXvl!X&2%Zf~<`8X{1V<O~o8xovAuZL5_-_j3Zf)epuFiY<5#e1ON+zWacH5AfE8 z9I%_JTzsexW20fCL_zyNvK7y~OQs{V%==g724RD5-b|;MLp>y8^%I)G;{oVfk8Ox} zh~4CBc|$GA%R0uLD`v0Zv3=6eHHWoS5h^0W6*sHp!_<TbM&V(bah(7UPpuF_qTl_% zU(*F3QnzNbA+05ITpNDMN>+Y~4cWkt10OqML<`cFj4P~IdG#}1(o9J1fB{AT+oj}= z4ZXO^Kk&mMRvZq4c{r5cI!F_L%7mv(#sB#CyAEl7HXRWf6Hol-f=mfYfxt?$fvMK* zPmrN_Abk%&bRGXrCxrhg5gO!>W}>}YuVZWH8fcR5H3Q)Ba(UG@X;;fQMWjE20$}B| zCW(5~b&G`!ZvF*#%V*sD021k&%$AJB_gojTioXA9NTz>|>0ZS1=OO=Eh#WAIty$|E z+sGt5ymH=4I1Eh#Uc-s68F|Z|j$V%boPSBq82oYnA4CZ}{Py&N4F3NRJF75qd?SsO z0obGc@@M;k%&!EN5tVW5UYh=~-CwBY>$NGKz<qI|Uf+X<sQ_i-4=HrTg(4S9p=T&@ z!e~ut$9)uC2;Gl_P(jtds1lSbfY36rxp@m`E%UO8_{I?W7Zd41Aa6b$PmLjTN)SqU zo1jRHjVClb7`Ib{p=UdJz<33KSsTwRW2G65HQu1kdOUv>+z2E*^*9i?B@8=TNZM6V z<rE=X;F^q9RRoX(yv$9D6^UA^p*mNh*h_{zq!k*%q(XTD|2eWdlMU3(Fkn<P)XcVF zOi0-ff1dm^8ezcn+sLQX$1?t^=ClC}AX76^?2?F{7Fv*_s}$hdwX-&hKD*R2G-pVc zcVSDV5*d07hBzH@k08kwSxqpW1NXsntM?i;AVW;ErTUxU`m7Qdv|ta=#t9!_h$e#P zZHBEeV*1~hhdnXXs=Y!>CwfOwD@qs>$kqTxeLg}UTq0j5TFIGcd%=+sWn46bYv<ds zA1l$<oGJ#7Pt-6Y`cU!+(LO!0fe(>Pae|-`SXdoV`0lwoobbbbay;M9OB5C<j`fov zdf+4#C&S|&Yvd{gvk)=s#i)bGu<XIiKxHPaA-GdKLSw|%z2R5{FN+o{D}Y7&v1&~2 zXVV0v>_2&1SP$M2Ful<%#;ns8dknF3A_0Dy@J;XzRa3ElRK7}Y!}LKoKC_KRd5~ZG zOv*!^f4p^w!Qq$kH2&k=hRm2$9W{bUX>^jJ1z>VJl09y)CH+T|&_FV-_z9P>d?6AQ zk|PG2=iV^KRLrb_UD(@<$M`J}28f7VX?6SneT{u*1s;tJCT}CHsIFgGtO@~7%d;Jn znTLt_)v=wfjiDZVyM&J_$O)!%DDNhg1qj_qC~D$?FD*&V@tptCuqGR<4K_KcOG|sH z=bWC&5$fmVoXUP{*VcX~RCVBR!dU}ij%y1iL#{fD(MAGY)eFuuzv9RZ3DAbx=to26 z@+wzX6&gPBR~*x%Rlv0gI-d@gi!81L8W_PVfKq^Elm*HRIyO0FiESBb##DjAoU|fu z2LGXuefj2(e>N*Hj*iWNDuRyf<{C1OVYA`N*h9*$^#}NnjlZpT0J-^gW7(Fr+1w7v zlqm?8gjkOO9-e^?y7mF^7_SK=T_^jgQK_k9zhK{@3mJdT$c3<oqJpFku;pP^^CJC$ zT`U4nyukZT?t%OnYM`_3jGFD4Wz{v9D^7DIb1w8Nco1)CaBzb!iPU&MB9LKdh{h&7 zrB$eYNrvFEaL9=C>E;oBKK9>z!rYi@^f6HwQZ3T=3bXm)a0TCquZslz<}^9V^MixU zk*9{6&F;BPF~VQbM8oPjY*EJgLci7WZc-Wroy3dwVVH%58rhYlP-CLl+ScQKP1jt- z(XdzWxu-#+xELE+8{ExrR#<_@^>+;Im5A^#nfHtHiYOx9b)!3|VEi%=@Q(-@DMM9p z!*wxWqM_PoGu=(7NQQ<-jr0Yz{jQcbA%Mr@yVng&0`lHj;vGGPfd@YJu%e~xtUWw- zS2JnXIm@SRjioSV?pMUzhy*d>Y7k{X0BEL!s=DU^O&2JA3&Am*JphdtG5et_f)%IW zc#hI7E!Mw=K*O7Fjgux2eD)9m*RWhkyp&gzsF1_WZw~VcxULJ{OR36n)j78Ux|}{f zz6sS?^VO7nGgfw*@C;kO5^ol>;%8U8-AfB|ZmIbJ?v69x^TjuI-<hr}anNmgg@ZU- zoe-SW;2Jc(oyatX2qe`RK~q{Y9A2m3!NHFJ;^xbXE#DeR%o&h*W^x>Ca2Ex@P&1yH zL^Hzk0!%>k>mMV`b$-Wh0#{P-cR52Kz|gEKaHM-Ibsk&GGuyyGqL{M<G5#*1Wj!!Y z+INr!zB)(N+Fj6AW@}5SO^}G<_yxyBC+xU*&qp6V_zSrIN<JMdi~W@o2awBb(GXj+ zU{jknb^d@}kvskE1*rVHN#(tazOmW*#y7yoPtTnCGpbRhV_cz*{ek@eK<m2`U0C+W z!=h#sroe{e8jObD@vj0m5B~Sgt@xwV@(vlYSY|uA!)x<&Af_C^s#-j&3KDpX#h~iE zl{kKsmw;adcH;fF&m8$|_~-k7qx|bj{=Op*O-nC3oSL16$UpDD?El^WvdP~R<gI@y zUJ7hI@gD5ZSvS9Zi+_l3>R2Dzu6dYQ<+(Y+VraL}(ed&L?#QUvl^MvG!IV_YX<PlI zEe@cCa=?KSNgv>^?~jJdS-5$DwhOi8*Zi8_@Ed;b-_K`x@bbJja#gKQs*>kDv0UX_ zxXR)|?Wjy3ym=SF3}fT33O4f%f6EvCwSTkFCw|HQfZzH*M*PF;zI1IKwfxg=X}j;h z9XXamr=JzHHiGNKqoGrUTxW4`fS!_a$I}T6Jl<N4S_*b)91v*X(hW##RudRP)+sdw z#s!)Cnkq7_Ea$$?2EOT9w*s3)RL$XIxj*HOQmOlK{FPUfPjoH&Z(rtP1)zNUs44e` z8_-%@Xh-5jeVG}c7AUMbM_Z%?3^`P<3H<2WJww@KGpUYO0jmW3lG4%$v|^Vd5;-S* z^w5mQGck+~yNSA6f6ba@<BYuK4rw8MRr^xyU#ROH@8g9>JICPyc55(^oY2#s-qd7< z*Y3lu`+E?=-6tV<YMEUhZIm0Lj9qCOvsACXmaP33Jj>SN9~QFZC;r~NYvy0`xBT0o z-t5VbxBmM}YtKtXu+H*$D3!bbrMOE(8BU|5@8)e|6hs|_Ikmm}Z17$*DL?{F1a_DI z9UyU6p2hP!e%Sup9J!-{2KXR%9oKIiuUr=M6kf9)t_45RflqwmYqM_VTVK0NnY$X? zU|Yu+_1N)_?Yd29PvwM>Y#v**t3S)6{<ztot2^1ti=4G&@b1pIH+PKoaGs_g7$f|S zFNEb>enj7S_&_M>aKpy~nR<Kq4f*D#_l+p3-iPvjG7g=Cf5LVu*2Pd~&Yp;WHs3V+ z?y?^oEU_YpXfLoa=%EBc2%38+t@@n49pLa!cwC5V44BcYs5Lh?gWjekZ(sw$g9l&C zDf3|mMwqsT*3Ux-Y0=A7kWDD7unA!)NiwpO26PTI&T4++L60==Db={odBoxOh*fp* z)2BqdD)=e%exa1BuinpQ?Yr(x{fctDdkSn2r`kx%Ng>N@yP;uuRK^Mn8{JQeocL$x zic4f^Fw9tNConmeF%PgI5qOr1gDX~xGvu5mph1_}3de{CG0y?YKjOkvV0j@hhzG%{ zhOyvAY7q7(Zi!M~tSKd98qbhfBA&E+)}?_2k}I*^Xw&MG4njLRJZxFM$(+HrYyQLV zeQjJ=t^DErE60p`xz`r3nD!P$4{%o^pneSpGPhZ*imY=AV>R<*sfWg9U_(XAtktp_ zov=2!pczRi7g`+8_KE@+v|-g5isqhi$Y{gte=NSTDCyiJ@<6`e4~x0t*x}#|Lpd0t zBaeK^;D^X2SA4*-p3{mMLQ3&W0<@=L?9r;qWCc}j2}NzzsvbQjROk9O;RtJ?T?P?b zf`*fg6<P;$6UacXvtrj2gB_Dvl7QfNt@l2a&&3C<lALK&?(dbO)4peo(KO9&HLK2C zL4b#Z9e$L0%6&VUWcc8ZLa>>3)4-izj*E3wDcmRi1?y-}Y&^+8DiX%CSd7!S%nx>0 z1A_WoKA3PM@0aDH>^fj+Y(t%>gQR%~dFM)M5x`&bfJaojPtbf6B9AKz>``Gd*4isC zUFO*NI%}C%vpWk4RA--t5QU~%3&3-L8O<jyluEm(HQ1tMYi?*U9uLQW;phqrJd&~> zPIgTYY}qmOm5royYdqd)FgoRA-FI#rcILg%PHA<f^WZG6LSTlWu9HIsiVMWpF>uzg zXwG8JKedeWE2o&+_o4mt=+cF2*zyHSPu`DaIfcm;tQBYZ2{5lwCDuIPqOe>LO0^yJ zsXquoMxpkPKn+|h4dxqP8DAFCT6$)a-mzPnL{98&ec9z4y>M;Nzqkua<+M5|C<oZC zwm9WloF?FeH%dFGo>2fTj1*ASf-<BB68Jo5#D0jQOGkC+vYDCsvUDRqZ=49vGz%zI zXUN%z^Knuov-ER0JdNGbixyRNp&D2iGT6L;ny5OVwisF@p|!x0Z3Kei>PRSpyLBh~ zJepw~_9C_#xf<diDmT}hphQ3q{7wG{RmCdojG*WgBh17TTw&kSPpcPN*X`ORTC73c zUajaFvUwpT%N$$A><(bU;0?ZLTM@|<;YC0DE{>at!I8v3-p2@>_01k#nh}qIJ*u<T zHi5>-y-#C+l*=1LeD8@Vsj!ndP(ubklCz?9c%ji9_Dnt(l^J3-&y1;|=Kbr@D}bB; znG)V7ZgFVm{#Hpl;QLRZ;KA?CK)jza#Ab9heis=YbOi>MLZ*As%5H^rG^>H*==Vm# z7QVCS!_B|c9WD-g^L1EGwf!fWbGglWNbi()C!WUe%;<M#)V?IfG@l8WM>w`2P_V`J z-5sP1M5m)*IPNA@kohh+uv_#<bMLp1eD9PEx!G4=!C66M{Q8Cw^^6dMHVBgsPp2`2 zNkCy*ccgfX8CY~myw7Hm0SFy<&?u@ZtnxUYs6w{3As-+P^myXE7Hz4X4RuK2v%byH zEd#&mXT7=)Y&O;lS(Rx#)IeTM`demVxVx*E*<mLdhb{(;roxuvqRl6iQcjHrb<m?a zx-R!lM<a8ts+PHMgX)l1D@037hrTj4?|tn)@T}UWdMhOzq(271NFMaB_<dDJE2#2O z6%E&NvW_Jqw!3ej7FGq;2M#NNO$9#NY@#HHvM=>PI(f^wMOH~3>UGd^x1ROZlMlNN zo+M+<XTf&j!6^?adxg-$YW{s)dmd<r>6Wcx1X5PdMAK<yVDKz$Lq42#GcVJdPXb+0 z>X1^k-=m{_WNEJ}<A>=isH_18=-0T<8cMs#cV(4p6q}M|K_E=<G{x~7J*@oo{I1Ta zYdeggRXb|qA)`8w?^H^q91*gChYXaby}g<(7$Yal5MogtOfl37$m%#?Ys_?=bI%)J zFNd<o|6b^!a;_-ZQM93(@S2f2^(jl<`oVPFSo+fl(dFQv^xbArp5)$gw_t`riiFGv zd)Z1kv&oB0h`2go3{>xxm{C`3&>3{v0+7`pIR@Ncj8#5B8Nf<U-dD10`}CW2{rB)7 z$SWQ?@J>eIlE6b)(rzyzIUQ{*Ppf%rO^oKvZ;m5Pz<^cQO#n}DzdUeN|CFj!#f|Yl zWd!$i!LFEmydrfo7iAI5OlvZkPJZN-rrNJXMRn>pXWton)ih-+5QeyOu-@!7wA^dU zW7YnYGH&-~lesFulL7s7q!67Tn4PS~R=!<*Wl$YJvn&wY-QC>+2iIW1_2BMKa1Fr; zaB%0K!QI{6U4y%OaC_YE$-VWe_SaPJ%x+E9{MhR4HfhazlezazPXI_A8mRv<NBHT$ zLiAB5O1cR1yyxeomgsocp%c?NOmSo*B597%IDWFn33(jN0dVJP40Hgt%F$g<GNag+ ziiKE6Cb5^B6cAVu*NUy{Z6VL{>`(u(mzv2aM3vo-h-LU>5iF1PuE0BEke4c+TM)GI zPVKHe=R38R@?_35r}7%JA2>qtbngxb2y5tv>WkDhn(Cju#tP3}!z)!eTGMlii~eFS zLdi3eBtsfd;FX0%gKZ{X0oNslu1VRES)_5~^?zS34gPMSa;k7TH51^bqZHMV7Q2dQ za6Ot!Yjgh=lfnB77MaHEUzv8dr3nI%i54oRPe@W$YRiNALc&^o)Yho{pg8<`R3bwJ z2vI=YN5Ms8w>ULeY{ELw<HQp0%m~l0;@6fcZbWVvu=VA5ot7{TyB@D;vy)R6C!Br} z3P$i%>YPtH{&#R<#)e~^%@!;ipJ?u>cTqg}kKWGTHc&(&!Y#lAB5$gN1~Gml@M+nW zfT;!=kHoD~X<;}Ck-z$B6?XC`ec}#g=^%w}hVc73&iw(SfE1*+fc{O=?fv&!_hKXz zKtac}8x&7_Nn;~3PenZ!8(R~N4&%fGs3|I8OxN}LTJEfS(la$PA%+P8y4JN?9D{=z zQf_z<*6Vg0loPbfjEV8|1N+C0ts&#x=UXb_*G3xX7-O8gEw*Nv`%wC8gy&!epY~`} zlT_(OEd7kbwzh`DmkVHd5d_)<?yq4xcgh6K`$~=|p4IZQ$<qfey7`O@H5RXL%e{lF zlakdX^*khOT(%7RVDfko^aP<F?L`VO_J-DFF?JAkcuqgmi8`*>Y7_$;Gmu*LeKuWu zT%`sxY&oct1_)_S5=%v7J^UYccdLHNklvP7dK8gK9Dw+|pHG@2h0kuS4<|6M3U6Sc z1i<}gj{1TLnUdek+?{u=t7Mg4N7k<gyT_yRq`EMZE$zarm>Ikj;L(s5LK|*^N8^0> zLF^2MeNVRT9t8;6-nfx}$oe3xb?UnGKmY=5w2Na`99Thuh$=^q@cH|Rzt`+}N3gIv zxyfOrBvymXe5n466tMzy>nk9$OQY=o*KJ6`DrkOOSJDS^mocW1RjJ#!fQqO$q4W@J zkwt2DqY?6p6l+oFt?(<-G9J_3!h$a|{*=K?N<J*kWlDMh8yvn{RFrJ?6wEy<@m|If zq(Ml$(aeGRy<cT@TFJ@aGkYp%QB}NfcZ}>0DM_?#Epswi+^i}B*QF|9lkkH)X;a;R zCi}AZmOsZ^B66S-|8aNaRIJ<fC8`<1FY=iN<qU!-Jk!@+CQ9eM4HMLXj=Bw26CC_T zCBI}O7-6$uvxS!K@lF71N_Io%g!7FK@KV#Iu<2XWq}z0UfTGBbSXB|+g-%*fz+NtH z4Z<)(nYDWFZxpfLN?yN7I;sk7o{`aQ57luvHTWF&$7WLp@*rG@Z^g@Bby6N9Aao|b z;B(o+nR9WJ1(GU`$dyI70ZSyT%BnOYAV_Z40m0u<FcF<WMU>-s!6_obA84B*w3R;l z6TGJH$KSDhjJ0yptiTC&>oI3oQQZ}}9gkn!{NBjWu6ZJ+ILA&}ZqG8xdU(3LJi+o| zLZ0tWOjMAaK2^$eQU|WLEz=cReK~`ZA~-h*NoWdAQ_W`g3ijBz8laUn&ME%k6POw; zUOlh7SVG&0COsjn0b~6P(N3jTZL!sX5mPZapo}<7-G%|I@S=v~HirzUsN>0U2Ab8k zX^Dq2PVMntf&+k(TduZ={4{f_1;#bmMbRx*Ke$9_J*h4VYhwgtw{sEYTo3XEeDtxP z{0zj-c)vCD6&BVX-rqs!e7SF9+kD&g_)w*@eZ4@s-hRz{-4Wk(cwkl6{Z;W->FT_` zJ(kYfGnL3XUm7k~h8?!U)c42ByUNKRn=l!hq3=FZg3_kn^*~HEtAI<}>M3Nfew5my zyMcQvfj3Q?#lpuDH8UcB?&pa|YTMH{!u;WrAKN;4e%?t7m&uNe7x!m1HluRa9#`3| z<rvXlf3H(B)HV|~BsaCkQ*()9M&VJ$SgTC)3cYVotp%qeE5A!f&IUj4TUI+Bs0Ohv z)HX<wKkKn*yV6L+ygI*zneGAhMnx&PNTb#c1i|06txr--`itlW_beFV6YBcKqMW>) z*af(_91u3J6y2|H#L?kno14p-v&?HRz{vz^-OoJ4&urr|{Q>zANe|$88{QtUUt{lR zmA|?F<Tp&{?N<prlaGtybV3}1B)HT1Fn|)2hc=OV_ncPWzLPOQ$D3p!e>{4ePtu$^ z+o&}yT8>sgQLJKtqm(%6(0~_3HeigBHYK0Z#OG+nrG8yS0+r_YIuw3KxjxSgMtI*o zHAMs?E~K(Q<iZTVUs3UmIz7Vg6(xH&dH||Ik$DWBHR~mFiys*kvqeVwkQ1&9Tc7=h zK`f%8n;sF$$~^utF$FoR<iWV6f8IGk!5ex}3aqO}cGQXd)SC%q_})%T@gdack!SQ= zF3Jz_fH^1$&UoV+Hq}9m5h%=;8T4hXBbykt=-Ql-g2KBxI^){gZqO<NYCC3l(odC{ z2J!Shqb>aU*(4}D>^#%Da4lf%iG^7bR`ddTz;vFN8U8gIa}aX@{0HJ<KMVP7I5y8D z9Gr)a5Xo+c&TQPU?H_DQ7q<1lFwt}&#TEA&5LA%zO<GRkKsN*|<0?K}DLnjSV#C3B zo{lF}HPEOShYEo83m)M%aPF+b<z}4EfMD+`(6$NURHTQvuV1XfaU304ghK<kS}rBG zO`Z5quiy<Tr-BSfAGUt7ya*R>TS;BgU-gQ+MvBb5TL60|tgvSC7rP(TCw!6KV5%7S z3P%q@+KT6~L+ZeNiW%S);?*)}HXVCs8hiWqZ`J^X7^h22EcbC82_OEkymDrm7WX<W z$%)gKb1dhtEX~wB{qFLvMLWZoUnZ>BnV869!rd<hZ%=MzG=^mi%KftV<plrOKlqI4 z2#PWcN9nWtK9Ip2hg=BZDJpU)HNC6)FVt>1;t_v<76%U0N!ALMB$rS-hxqE}g@UlE z9UDK1#(!fILZL~eWDZ=SQ3diMja>5P?#ZjHWpJ81fjuO(UCk7$4XI*;vi^nSTsT3Y zjXO*^kd-~C^S~Zq*ESRZn)bLrOhd}n=9(Jrt5IQiETuK7_54J+YQ-nB_}h?;N{Z1k zyutiNyxQFmDrhV4$DlQ_Mqxaw+TFM#d16*o29jEnr6RtU35~m?R@1sPj_A9PIBUDm z>5DF3qsx3POQ-e&UH-uVC@xp;LWEBbvKn!pZ|*b-4}wleKlknzwJHwqfa4e7#ql?3 zyugZS2wu?!`;K?rhYixqg@h<?W4u|fH#2dBTQ9=NTfG~<lEyQ*OGM-!!vtKF)VkH* zF7#>%x5u~vHqnq4LnDcp(RJ-o*WFe)Yx+_i`&h$eSVU7y0e)B$TGKJ!$lf;eb{%rb z$AHt{=oNMNnd%f+!U4QNtUFU*G%(}^Ij{~a!w0QPa=4Ak4qHlCaI-cc)qXoq1aBht z3W-Ax$Uq}c*RiEp_x72oY0T&kRk@DvP_}9@yI7SkBw;uCWnTrIx)_DPf!6;V+z&L3 zJ4@p)W>VE6_^&9C^!^ar!to%u<e^xx!oLX|{&E`I*K*pusx)VQXJ0l-f2=9nBXwqP z)jk-BPm8jB=x|B1#<0(HF6ji}*8ceql(e1b;3}F-FXP4SL$iqKFisMqEm3zmFxzTX zC8qcEfsK$nJynsrgTjpYOjPboY%Z#me9hY7Vh=@!r1lyb+;-sj8%~gq%20sn8b!hm z-R08H<0&iDWw0g8rFEkxV<?vSa*^40?-wol{z>Ac2z!UF5#*#o`*G!mK1)lFUZ9+^ zIH4qhz`gZyB<&OSQT1Dd7v6!L=TaSNrce?L_!1mN5oyV%d)?njssrsglY~!|rIQ+O z!TM=(265bTbloH9-^7C+M<k8fs*!P3%xcLcn@Q(MvjQ1a07fpY80Qsm=2o_+HuU@r ziSelpYzN?P(iQ)aq@xnud;PBL;fRZuiIE|YU%pb(Hn!a$DoHu`w4qzg2qCq-w*EWP z<T8`r?wQhL6cImIN7vQM>5H(jzRR_ucP1(wo&ismUmX6TEF{A48wUROMCl+uYG}ur z^aXDMlt&pNN;|{YJcM!QWK~THsd|0ms9hShM{$~(xb`TCR;?wa8-l|&t`VO$y#*xi zduf2dnLVJ7lBfWh71JRMNta^Hz&v0upL~z+djZ(-;dRo!{+fzsO2d)WpEfefAhzS| zE1I#QqbsYmc-RrAdgSC=F%zL+8{|eVre&6Sur#rRwunBr%i&2?oN2qrE{f;eQ?tX; zg9o-YpOo=RFylFEfo+Z3W9A883q^f>16e~gNA6yDXqI;tW0i~i*yC(&Pihv7wW`y) z=-gK)?%0ac%z~q4Dm2Tmb=-w?eITw@<Xb2dPF2UG+n%H&Gm^Jd%Ny44Z#o%(9>=MH z?qs?CbpzXyt>fe0rqjJZ%h`pYi!dFb`JP0LrjB}Bu6O;fOa@xeH{ZE*D@oR;yEel9 zId`G0KzDhAbV&(b(PkJE+I43d{MUVr_<So{c32*KK~+vvVK@M$a-i3KmtSnAzmGxX zK6w>Mz$@p7YUTc9SF{<MPfMJx7gf^u>?5Fa8}6bTfd_4rYpnPS&HRYUol=uO9*4B^ z7N3vSEwz%QC;pN}6Zgi8HeaJQt}QHieLe|0Ysv_O)71wX!9N3TQx>d;>(NGfy(4zD z)?ZA%q7oX%gO?s^TyTyztFvM_13Ee)IOjuya)@aD7$-9l;~H)XZR_pMH6!NFeG)J9 zJJd7FKa9h)Jz(v4ps6GiyV`D2T+aOy5Hrm;`=O6Ogk2NsN=CfCWbGBF9S^d1SBNe~ z(yL4%p1k32k`l*Iy??C0C%#k&<zEAV5`kZ~<%4fuW<7<&UOYFL(P%!n&(BH8q&rjM z(UUiI<CUi1(La@W{pU|VQbQcyx-7U=FQreF)WQ{>9KSnBI-CmpJ9vYN=v0M?a)Ydn zd40k2Tm`P(jRg`E8LOmuh$Ax_Elr^9yMqIn*elh0TV=m-Cn}mwJ>q`#8l&43<I>Y2 z7)-QnkL7@j*lR0Mjs3cOw<p^?#fbcAD5KZV*dq6FRAX9zW0_j1vfGZMnl^01I*#7^ z@)bVBJO2<IK9aijaDIUBy}Xhde*qR0Isy`l<Wu!dvOA~=OY;B=4Vz2ilIE&NDHX0p z$b7vM13u_q0PFlf7l-rQq1{q`&^L^K2PDomi@LrIt^@rHy`;5iepzxl;t>bsJ<H>& z|D06-D1NmEx9P03GUO#Pa0hktwNBEV!1tYdEFetihZLUJ1NT>hBJH9>><mYLtdw}W zI}=u>m+lrxu1~@r+Oo?qXlS^PMU%Osc;{*o$m8MoyUUj*j~sogvMnc$i>|qbTEvsA zjb{G&3opw(>mlfj4St%cpzyYP4sw}^?sfl+@o&hU6Im}(HMsj?wHX$v;SGl9$O&;o z@QMq<6Nc&x{%Z))S$mM3DDyX<SeOY^qn^BD5d62q#!|6%W46CXlXefSp0g%0u;ih! zU&1M0k-Z>D2@c&DnMp~^_=5J=Gt@_lf!O_oa|85O7-#hJA@SlA!}$H+`bl4|J=DA| zH@}$)_pz$Ng+I6Xp91JIg57`YXDOy)86ZR_xy{P9nw>WWerz=kp<9O&NMM`va!ECf zEk)6+mZdP1k@~#KwYHJbXR#_pDBBBeJs0&G*nJ<?2z84<)YP29C=EO)WE0o0R}2Y& z`#vUsG!64!iAc6>XnFrEYr<&GeQ!8%{BL5wsLO0er>x9S?w^$UR!KI6jSSS(b4hxr zAhCwNHas{s!^Vq3Xjtq^Fa6aIJ#W%|c3qpxJ^45a4DNwN24)`}&v|$;{#2QzleY_V zn*sI}+0+n>ETbW_6EF8r@UIH=If=d*jlbkSJ77>D$b14Np@M1^niO3E5!W-)mOQOt zeh$_tlK*8CoU)@lg&=34O8u1NbakL_esC8O&id=v*@NHOhJz=4F`bZ4kyOU#SxK}6 z<c{_qJ2ANx>`%|KeBI~|{8gY#F^f}5MrlO@tL`)1Ys)+#922tir710s-n)7>8QYyA zc*<|cIVTr2495P(+FC8|P?BS5xT?2R^^To<guuu&SKclkySyhmC05`%$^2{v#F3Jh z!u1!45NEndB1pw8?vcxUSF}hu%ZvBp_jj9V<mYY$;w!gjO%rG?r!0pBVzW!Rpt!H1 zwdd9F_$H-h30b&F!KX3;;aGddzsQaN5}r3hdDdrU^Y@`X8Y(Rd;FAlFS%qWyJcoa_ zcO#%YCQx_vaO*!cn}bnalA;}*sU}rMsh>k%Zs_GjczO#EYP)v-4GTHHy(_}cSC#rz zei<t*M9)~r<&nksb_HG-j%zP+em-qJ;BHp<eSa^(L3vg*DR#gd%y#u)7x1FxY!5c| z;#P0BMsDnXu#m`_waBY!?F`1mT$6%Ry{zh}#*0xYe?u+wLlG=)%-(*!=21q9RRS(# zV1mH~Bo$4rxCW6G%u>~;i=ktX<ta*k6OqyDw6Y5HTpC|Xs&)g?2%Ork5zUqR8Z6M6 z9fgvXa3!D^J?qdmWQ0@>4GxIKqABFkFS#35N}2emgfxdcJ{2m)?3B<k%am1@%Rb4l z<gmdkhq$$!r9Wl*gX(|dYL<&^9c~S*=;SegX<ZbHGTfHMs8T90r3f)Y2O-UZ+cc~8 zrz<z|5{3E057Qt?RP*SE8z?4L(SXN{(m7iU#)taSLww?`(JQlPc-^93IDWwo?*cP* zi&=_Mi}{A#x8siH&x=Tfezo=`eS14j+1HM;ER**2;NKj%z$t6TzPa<>Bel<8^lq_m zUIY;6t4(FZM^e7$q_h6H_aZGDPObe{uBF|ECpd2Rw9ey@(Pk4yDA17sg`nGXEaU8l zp>icm!R>@W)MglwQ}jvHSCZV=`hd5gTZ=0g9O`&A4$wVI4C2AL@yDZu3DI|K@{P%t zkD#AYT6!WtHN_8dZZ9A%PNR_gxkE58+nQP(A6g%7lyH*<_q7#?6MHkn%+DEb5a5jG zP@(CeGLF2|Rt$tKpmU@I7?`ebG8O68%eHb|pp3Z2!xb_r7prn)j77ApmI5)M@&X)Z zi=LxOukvxvh;H-Ce1{@&P|3?Ic!ZvOLq6tRz1JA1i*&>ts}cD-M}2&5^D&rIZYMz{ z;nnKq!GzRFo5~#bheZ%wEXgTtA2^Z8ot$z2_~z4<M#64k4G$2^4O6G{g2#e7y|#j5 z4>Px#8D?@Z4N#8jCp|}}kui24NYk$?OESlz%>1g+5gIa*K(g{n`5iC27e+#2d~#e; zf~K<B7%G0S5L`5vH^_M#aS#P8fCeu^pEb>1-M;17ce}sz^g#xNKmdb-lGz0jfS;<h z%-bAzb%g+pL_tkSOMxRxE8h(79EY7pFBzGO$rP>A4*fgcikhhDdmXMcif4gF3hJpH zcdh(Zra5BM-Sf^LDxl5R-MFb%`&<1*O9KJ0$D$&GDoct5u+@dtlcf(uQ@>8GP>I+f z%|$J_X~Q;!N|&`l@Cm@EoUdGiS>QUF=<`QBNp`_zf!9c;gCB)ZXte#-qP(QE#P%ox zC@e3h>oHGxguwrd@`v|(T|2#xpP?U8=$~sd{tUL{vIcd##<sWI(u{jge#6R8ViO;K zLBq?b2hEbj6HsA-5Z$?A(-Il7v?&=Mm10fC<U!BQ$@9Ve#ryX4F<;aUwLX7#WgTdo z<~~~UrJa{p$r6@O!2${2?gzc0!RCgDa95}Q&kv{`WnN6s0M>{)f1j@u=_$d-PS=K2 z<KIk&DiQqX!GvSG&T5O6*3OoWHh)iF@1I_NJ|B;-&+kufFKD5?aaPP(GKI5gcC3c< z$)ia&760E>t;)rWa|eHX7wx7u-m12&hnIqcU*8dvq%55{wCx;Fm8SpC%|p)gFHO%p zPUM&K=hDGu)$3`uadOd@;b+gaSrd3;NqvAb`^Gk*6c!-SznNm3MZ&oXrLLeMjrIDW zxhLn2b+W0Ym)kdn(n6v_bAif3IAd%&>*OGlh7CK9m%eM)P<SjIAh+$`%0m<UBCoiV z)AM)F&W-F#GzbcOF%B>}L%K1a0XmJg3imoY%jypy5%~Yzkg_|AwpFs|qT7A%Hj%8V zhr^ebAoQple8pJoiE3iD@c8oLbcfXB^X4qFU=?t_wn5_OiS$LH=KdS6*`z_mnZ^Rl zSl@PS5i-~k4@NN8lbJ&6rB|F~W*aSa_*+Sq2yh1<n6KaOwqG2+(W?_?_L$Z1>5&?e zWB;a6O(Ry;(q3KuyCT5L&-Y)|Ws?Z!tlYf8?D(JUJl;7u5PsYW;gU-#N_n_Cl`#|n zr5|zI&WuizWsl*j+$d{Y8tUl1#wDb%sy}C|lS<J`iHW7;jlg;`3UT$IAwN^?$duKL zvVOF88RMF!iBq-Jbzf2+rIyW&097URCM>z?L3Sk^zeowFHlpG}uKXA?Bu8Ms5y3}b z36bcG<z36_O1iOW&zFYDhN*uKTLf|#bPY=RV&5JA=}tzMjv05bXfRpcL|W8pDy=!d z_WIkkE~|@acqD@8?+QV7p#&CkEh-wG%J%s2g~IhHI)uz*#tprcV-11CL43={9Tg$i zI?>~tr<3bZz4sfI6p2~LZ&AUMyyqSJi^mwb2wy&d0QcBd6Iwbq+JxSDF(BbV?!<|U zultQ7i>w0bSk172A{zvMEDJq3FB1xcmslVJu^a=~om^S^9v(JtScScFv}*a$;?r;f zVCIQD?p}R3+(%WCF#?X-iD&UaA9XIq-{H)!1Ef=B15)AT@bJw!bwTuz);pb4<F~Gk zVjZF4BBzvj6g1p_X5eT|uUaT|Quxf7RT3#lo$X3I5YF@mF>dDoci8SObSTI9(y?f~ zG%Tr@hJGjKrQb}AYZ{v6hKJiHUnS8l9*~9QPvas*adVj$kt-g>G3q!gJUC6&b~wZE z>aEJ7PL*wDaUSeLZ!XKi1W}vfVZDW<=QVRlNrJf}It*?ycM?!-WXjs(k+OJa)9#f^ z8uMYW!YUWs01sJDkIc=?4#**nxz3Do?3T8C_e%N_r9lx%6qJ&Fn>nGK=RF&InEK|_ z7*$qUp+<aA=v1c>=uun26iX<gx%$}LacTtc;<2%O6!ZsN5Mu1icCgFVh@r;#Qs~fP zpDQ*esh=HLj$Z;jiWg;zH(D+gGS~=uz^OO(6oDL?ir$?WY&uG8WI+cd&K_vOYdp*y zY+6~xB#1=}p+WL=vfX-HaY58-D_%9|Ep8ZxZ-?l4DNx2g#(ToHt|BbFq%q{?3Jt&F zg%bhl?u|t&h9_M52ar&_2tF9cTiIE3URZG2=F^{I4(8QS`+D0-kPI+$Yq4qc`!hmV zYSSZx^KAxYhQur*Oc8+I9GGH7TC2p8GWa|ttr4lj<#78GnIm+YR9{5`{2MFcU3lY2 zNw9-t2vx)@8t*2Yt~Q)F%PTyDqG;YE?hB#2#l!C<zQZ-0bLR8*t6z2J!`m2NzN^g; z;$hGx{-Ds9i}CUBX`2H}cZZ<f{d*+0IU``(w1ceo)K+=<Hg<`yBonszv0u;BNc@q! zRQ&#Sxm1?gkQ0X$L^ZIBPx?6E`ux^$K4^vmTCyDx!gOhjPy>DruhHgMS)!o{0}=>I zdHP*(Mtfo&T}X6e@wEShftdeQItdV+Q2`aso*RW!QvYMkj$8CUlcoT)Yhn8dCBRd) z-rZY-{BMB%um6{L5lSLec`!u%FRw$J5X^taaiJuLI?42q{zqAq|C_6Mh44SX`N1D` zZvO*-N8TIE$(ld=8E%01oOSZq35829M4<!kH`eBYZ6xm2nE-EE(!R*UncES=6=|~Y z!Rjm_Cq?YZ{oBz+)Ipnrv;&PZ(rj(%C#im&4jl92e|ZOvlFKoL9>B;ws7dJ(-m15e zC5g$fU7JIyep&L55wFecF2LD~m3yD^gm?4)w)EcHdG`Jy_bUw2n_IP1f>C0O|HRZg znOkyUgRy<jW`@PgM1gHx_N124N4<JpNaR20zQl{b00wx!ghkM#wrk%OtmQ6-fD*D_ z1%0uWnRB;gbq)sJKD~vWk-%uBNgiOaZ~t_sb;0H6Z+At5HdXq<=1X%aPscUuc8q?V z(M39+nD$qeVhrr@X4thqh+u+v3;Jb3_X(%{G<9%KDtaKgS|tR`$@xv(N>o%#me9B& zXJ>B=sgk<3MJIJ@iI|NU;^S7Ffr6@uFD9crS>Ol*5r)X}?aA9i55HA)Ywa{D{{dk` m1l+D`T-(b--PwCk*h+wNwrKUml))AZ-%)c{&1xM4#Qy>;reb#h diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-italic.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-italic.woff2 deleted file mode 100644 index 398b68a0853fbf6368758deb1da49d347e3e7d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41076 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%0DJn02_FvL|5o&57{KZdtLiV+hN)O7G14 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%0A|ONvrtj~P(cVi2j(tV2B}bkG5nsF&tTs#Cjgc)T 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 diff --git a/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-regular.woff2 b/pagetop-mdbook/static/fonts/open-sans-v17-all-charsets-regular.woff2 deleted file mode 100644 index 8383e94c65478622baf43553262e0e31b8725e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43236 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 diff --git a/pagetop-mdbook/static/fonts/source-code-pro-v11-all-charsets-500.woff2 b/pagetop-mdbook/static/fonts/source-code-pro-v11-all-charsets-500.woff2 deleted file mode 100644 index 722245682f59dfbf16d8cd95834db381ce022ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59140 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 diff --git a/pagetop-mdbook/static/highlight.css b/pagetop-mdbook/static/highlight.css deleted file mode 100644 index ba57b82b..00000000 --- a/pagetop-mdbook/static/highlight.css +++ /dev/null @@ -1,82 +0,0 @@ -/* - * An increased contrast highlighting scheme loosely based on the - * "Base16 Atelier Dune Light" theme by Bram de Haan - * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) - * Original Base16 color scheme by Chris Kempson - * (https://github.com/chriskempson/base16) - */ - -/* Comment */ -.hljs-comment, -.hljs-quote { - color: #575757; -} - -/* Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d70025; -} - -/* Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b21e00; -} - -/* Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #008200; -} - -/* Blue */ -.hljs-title, -.hljs-section { - color: #0030f2; -} - -/* Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #9d00ec; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f6f7f6; - color: #000; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #22863a; - background-color: #f0fff4; -} - -.hljs-deletion { - color: #b31d28; - background-color: #ffeef0; -} diff --git a/pagetop-mdbook/static/tomorrow-night.css b/pagetop-mdbook/static/tomorrow-night.css deleted file mode 100644 index 5b4aca77..00000000 --- a/pagetop-mdbook/static/tomorrow-night.css +++ /dev/null @@ -1,102 +0,0 @@ -/* Tomorrow Night Theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ - -/* Tomorrow Comment */ -.hljs-comment { - color: #969896; -} - -/* Tomorrow Red */ -.hljs-variable, -.hljs-attribute, -.hljs-tag, -.hljs-regexp, -.ruby .hljs-constant, -.xml .hljs-tag .hljs-title, -.xml .hljs-pi, -.xml .hljs-doctype, -.html .hljs-doctype, -.css .hljs-id, -.css .hljs-class, -.css .hljs-pseudo { - color: #cc6666; -} - -/* Tomorrow Orange */ -.hljs-number, -.hljs-preprocessor, -.hljs-pragma, -.hljs-built_in, -.hljs-literal, -.hljs-params, -.hljs-constant { - color: #de935f; -} - -/* Tomorrow Yellow */ -.ruby .hljs-class .hljs-title, -.css .hljs-rule .hljs-attribute { - color: #f0c674; -} - -/* Tomorrow Green */ -.hljs-string, -.hljs-value, -.hljs-inheritance, -.hljs-header, -.hljs-name, -.ruby .hljs-symbol, -.xml .hljs-cdata { - color: #b5bd68; -} - -/* Tomorrow Aqua */ -.hljs-title, -.css .hljs-hexcolor { - color: #8abeb7; -} - -/* Tomorrow Blue */ -.hljs-function, -.python .hljs-decorator, -.python .hljs-title, -.ruby .hljs-function .hljs-title, -.ruby .hljs-title .hljs-keyword, -.perl .hljs-sub, -.javascript .hljs-title, -.coffeescript .hljs-title { - color: #81a2be; -} - -/* Tomorrow Purple */ -.hljs-keyword, -.javascript .hljs-function { - color: #b294bb; -} - -.hljs { - display: block; - overflow-x: auto; - background: #1d1f21; - color: #c5c8c6; -} - -.coffeescript .javascript, -.javascript .xml, -.tex .hljs-formula, -.xml .javascript, -.xml .vbscript, -.xml .css, -.xml .hljs-cdata { - opacity: 0.5; -} - -.hljs-addition { - color: #718c00; -} - -.hljs-deletion { - color: #c82829; -} diff --git a/pagetop-mdbook/template/book.toml b/pagetop-mdbook/template/book.toml deleted file mode 100644 index c9e4ad3d..00000000 --- a/pagetop-mdbook/template/book.toml +++ /dev/null @@ -1,8 +0,0 @@ -[book] -authors = ["Author Name"] -language = "en" -src = "src" -title = "mdBook Title" - -[build] -build-dir = "../static/doc" diff --git a/pagetop-mdbook/template/theme/book.js b/pagetop-mdbook/template/theme/book.js deleted file mode 100644 index c4ab6988..00000000 --- a/pagetop-mdbook/template/theme/book.js +++ /dev/null @@ -1,679 +0,0 @@ -"use strict"; - -// Fix back button cache problem -window.onunload = function () { }; - -// Global variable, shared between modules -function playground_text(playground) { - let code_block = playground.querySelector("code"); - - if (window.ace && code_block.classList.contains("editable")) { - let editor = window.ace.edit(code_block); - return editor.getValue(); - } else { - return code_block.textContent; - } -} - -(function codeSnippets() { - function fetch_with_timeout(url, options, timeout = 6000) { - return Promise.race([ - fetch(url, options), - new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) - ]); - } - - var playgrounds = Array.from(document.querySelectorAll(".playground")); - if (playgrounds.length > 0) { - fetch_with_timeout("https://play.rust-lang.org/meta/crates", { - headers: { - 'Content-Type': "application/json", - }, - method: 'POST', - mode: 'cors', - }) - .then(response => response.json()) - .then(response => { - // get list of crates available in the rust playground - let playground_crates = response.crates.map(item => item["id"]); - playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); - }); - } - - function handle_crate_list_update(playground_block, playground_crates) { - // update the play buttons after receiving the response - update_play_button(playground_block, playground_crates); - - // and install on change listener to dynamically update ACE editors - if (window.ace) { - let code_block = playground_block.querySelector("code"); - if (code_block.classList.contains("editable")) { - let editor = window.ace.edit(code_block); - editor.addEventListener("change", function (e) { - update_play_button(playground_block, playground_crates); - }); - // add Ctrl-Enter command to execute rust code - editor.commands.addCommand({ - name: "run", - bindKey: { - win: "Ctrl-Enter", - mac: "Ctrl-Enter" - }, - exec: _editor => run_rust_code(playground_block) - }); - } - } - } - - // updates the visibility of play button based on `no_run` class and - // used crates vs ones available on http://play.rust-lang.org - function update_play_button(pre_block, playground_crates) { - var play_button = pre_block.querySelector(".play-button"); - - // skip if code is `no_run` - if (pre_block.querySelector('code').classList.contains("no_run")) { - play_button.classList.add("hidden"); - return; - } - - // get list of `extern crate`'s from snippet - var txt = playground_text(pre_block); - var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; - var snippet_crates = []; - var item; - while (item = re.exec(txt)) { - snippet_crates.push(item[1]); - } - - // check if all used crates are available on play.rust-lang.org - var all_available = snippet_crates.every(function (elem) { - return playground_crates.indexOf(elem) > -1; - }); - - if (all_available) { - play_button.classList.remove("hidden"); - } else { - play_button.classList.add("hidden"); - } - } - - function run_rust_code(code_block) { - var result_block = code_block.querySelector(".result"); - if (!result_block) { - result_block = document.createElement('code'); - result_block.className = 'result hljs language-bash'; - - code_block.append(result_block); - } - - let text = playground_text(code_block); - let classes = code_block.querySelector('code').classList; - let edition = "2015"; - if(classes.contains("edition2018")) { - edition = "2018"; - } else if(classes.contains("edition2021")) { - edition = "2021"; - } - var params = { - version: "stable", - optimize: "0", - code: text, - edition: edition - }; - - if (text.indexOf("#![feature") !== -1) { - params.version = "nightly"; - } - - result_block.innerText = "Running..."; - - fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { - headers: { - 'Content-Type': "application/json", - }, - method: 'POST', - mode: 'cors', - body: JSON.stringify(params) - }) - .then(response => response.json()) - .then(response => { - if (response.result.trim() === '') { - result_block.innerText = "No output"; - result_block.classList.add("result-no-output"); - } else { - result_block.innerText = response.result; - result_block.classList.remove("result-no-output"); - } - }) - .catch(error => result_block.innerText = "Playground Communication: " + error.message); - } - - // Syntax highlighting Configuration - hljs.configure({ - tabReplace: ' ', // 4 spaces - languages: [], // Languages used for auto-detection - }); - - let code_nodes = Array - .from(document.querySelectorAll('code')) - // Don't highlight `inline code` blocks in headers. - .filter(function (node) {return !node.parentElement.classList.contains("header"); }); - - if (window.ace) { - // language-rust class needs to be removed for editable - // blocks or highlightjs will capture events - code_nodes - .filter(function (node) {return node.classList.contains("editable"); }) - .forEach(function (block) { block.classList.remove('language-rust'); }); - - Array - code_nodes - .filter(function (node) {return !node.classList.contains("editable"); }) - .forEach(function (block) { hljs.highlightBlock(block); }); - } else { - code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); - } - - // Adding the hljs class gives code blocks the color css - // even if highlighting doesn't apply - code_nodes.forEach(function (block) { block.classList.add('hljs'); }); - - Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { - - var lines = Array.from(block.querySelectorAll('.boring')); - // If no lines were hidden, return - if (!lines.length) { return; } - block.classList.add("hide-boring"); - - var buttons = document.createElement('div'); - buttons.className = 'buttons'; - buttons.innerHTML = "<button class=\"fa fa-eye\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; - - // add expand button - var pre_block = block.parentNode; - pre_block.insertBefore(buttons, pre_block.firstChild); - - pre_block.querySelector('.buttons').addEventListener('click', function (e) { - if (e.target.classList.contains('fa-eye')) { - e.target.classList.remove('fa-eye'); - e.target.classList.add('fa-eye-slash'); - e.target.title = 'Hide lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.remove('hide-boring'); - } else if (e.target.classList.contains('fa-eye-slash')) { - e.target.classList.remove('fa-eye-slash'); - e.target.classList.add('fa-eye'); - e.target.title = 'Show hidden lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.add('hide-boring'); - } - }); - }); - - if (window.playground_copyable) { - Array.from(document.querySelectorAll('pre code')).forEach(function (block) { - var pre_block = block.parentNode; - if (!pre_block.classList.contains('playground')) { - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var clipButton = document.createElement('button'); - clipButton.className = 'fa fa-copy clip-button'; - clipButton.title = 'Copy to clipboard'; - clipButton.setAttribute('aria-label', clipButton.title); - clipButton.innerHTML = '<i class=\"tooltiptext\"></i>'; - - buttons.insertBefore(clipButton, buttons.firstChild); - } - }); - } - - // Process playground code blocks - Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { - // Add play button - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var runCodeButton = document.createElement('button'); - runCodeButton.className = 'fa fa-play play-button'; - runCodeButton.hidden = true; - runCodeButton.title = 'Run this code'; - runCodeButton.setAttribute('aria-label', runCodeButton.title); - - buttons.insertBefore(runCodeButton, buttons.firstChild); - runCodeButton.addEventListener('click', function (e) { - run_rust_code(pre_block); - }); - - if (window.playground_copyable) { - var copyCodeClipboardButton = document.createElement('button'); - copyCodeClipboardButton.className = 'fa fa-copy clip-button'; - copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>'; - copyCodeClipboardButton.title = 'Copy to clipboard'; - copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); - - buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); - } - - let code_block = pre_block.querySelector("code"); - if (window.ace && code_block.classList.contains("editable")) { - var undoChangesButton = document.createElement('button'); - undoChangesButton.className = 'fa fa-history reset-button'; - undoChangesButton.title = 'Undo changes'; - undoChangesButton.setAttribute('aria-label', undoChangesButton.title); - - buttons.insertBefore(undoChangesButton, buttons.firstChild); - - undoChangesButton.addEventListener('click', function () { - let editor = window.ace.edit(code_block); - editor.setValue(editor.originalCode); - editor.clearSelection(); - }); - } - }); -})(); - -(function themes() { - var html = document.querySelector('html'); - var themeToggleButton = document.getElementById('theme-toggle'); - var themePopup = document.getElementById('theme-list'); - var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); - var stylesheets = { - ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), - tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), - highlight: document.querySelector("[href$='highlight.css']"), - }; - - function showThemes() { - themePopup.style.display = 'block'; - themeToggleButton.setAttribute('aria-expanded', true); - themePopup.querySelector("button#" + get_theme()).focus(); - } - - function hideThemes() { - themePopup.style.display = 'none'; - themeToggleButton.setAttribute('aria-expanded', false); - themeToggleButton.focus(); - } - - function get_theme() { - var theme; - try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } - if (theme === null || theme === undefined) { - return default_theme; - } else { - return theme; - } - } - - function set_theme(theme, store = true) { - let ace_theme; - - if (theme == 'coal' || theme == 'navy') { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = false; - stylesheets.highlight.disabled = true; - - ace_theme = "ace/theme/tomorrow_night"; - } else if (theme == 'ayu') { - stylesheets.ayuHighlight.disabled = false; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = true; - ace_theme = "ace/theme/tomorrow_night"; - } else { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = false; - ace_theme = "ace/theme/dawn"; - } - - setTimeout(function () { - themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; - }, 1); - - if (window.ace && window.editors) { - window.editors.forEach(function (editor) { - editor.setTheme(ace_theme); - }); - } - - var previousTheme = get_theme(); - - if (store) { - try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } - } - - html.classList.remove(previousTheme); - html.classList.add(theme); - } - - // Set theme - var theme = get_theme(); - - set_theme(theme, false); - - themeToggleButton.addEventListener('click', function () { - if (themePopup.style.display === 'block') { - hideThemes(); - } else { - showThemes(); - } - }); - - themePopup.addEventListener('click', function (e) { - var theme; - if (e.target.className === "theme") { - theme = e.target.id; - } else if (e.target.parentElement.className === "theme") { - theme = e.target.parentElement.id; - } else { - return; - } - set_theme(theme); - }); - - themePopup.addEventListener('focusout', function(e) { - // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) - if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { - hideThemes(); - } - }); - - // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 - document.addEventListener('click', function(e) { - if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { - hideThemes(); - } - }); - - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (!themePopup.contains(e.target)) { return; } - - switch (e.key) { - case 'Escape': - e.preventDefault(); - hideThemes(); - break; - case 'ArrowUp': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.previousElementSibling) { - li.previousElementSibling.querySelector('button').focus(); - } - break; - case 'ArrowDown': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.nextElementSibling) { - li.nextElementSibling.querySelector('button').focus(); - } - break; - case 'Home': - e.preventDefault(); - themePopup.querySelector('li:first-child button').focus(); - break; - case 'End': - e.preventDefault(); - themePopup.querySelector('li:last-child button').focus(); - break; - } - }); -})(); - -(function sidebar() { - var html = document.querySelector("html"); - var sidebar = document.getElementById("sidebar"); - var sidebarLinks = document.querySelectorAll('#sidebar a'); - var sidebarToggleButton = document.getElementById("sidebar-toggle"); - var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); - var firstContact = null; - - function showSidebar() { - html.classList.remove('sidebar-hidden') - html.classList.add('sidebar-visible'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', 0); - }); - sidebarToggleButton.setAttribute('aria-expanded', true); - sidebar.setAttribute('aria-hidden', false); - try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } - } - - - var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); - - function toggleSection(ev) { - ev.currentTarget.parentElement.classList.toggle('expanded'); - } - - Array.from(sidebarAnchorToggles).forEach(function (el) { - el.addEventListener('click', toggleSection); - }); - - function hideSidebar() { - html.classList.remove('sidebar-visible') - html.classList.add('sidebar-hidden'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', -1); - }); - sidebarToggleButton.setAttribute('aria-expanded', false); - sidebar.setAttribute('aria-hidden', true); - try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } - } - - // Toggle sidebar - sidebarToggleButton.addEventListener('click', function sidebarToggle() { - if (html.classList.contains("sidebar-hidden")) { - var current_width = parseInt( - document.documentElement.style.getPropertyValue('--sidebar-width'), 10); - if (current_width < 150) { - document.documentElement.style.setProperty('--sidebar-width', '150px'); - } - showSidebar(); - } else if (html.classList.contains("sidebar-visible")) { - hideSidebar(); - } else { - if (getComputedStyle(sidebar)['transform'] === 'none') { - hideSidebar(); - } else { - showSidebar(); - } - } - }); - - sidebarResizeHandle.addEventListener('mousedown', initResize, false); - - function initResize(e) { - window.addEventListener('mousemove', resize, false); - window.addEventListener('mouseup', stopResize, false); - html.classList.add('sidebar-resizing'); - } - function resize(e) { - var viewportOffset = sidebar.getBoundingClientRect(); - var pos = (e.clientX - sidebar.offsetLeft - viewportOffset.left); - if (pos < 20) { - hideSidebar(); - } else { - if (html.classList.contains("sidebar-hidden")) { - showSidebar(); - } - pos = Math.min(pos, window.innerWidth - 100); - document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); - } - } - //on mouseup remove windows functions mousemove & mouseup - function stopResize(e) { - html.classList.remove('sidebar-resizing'); - window.removeEventListener('mousemove', resize, false); - window.removeEventListener('mouseup', stopResize, false); - } - - document.addEventListener('touchstart', function (e) { - firstContact = { - x: e.touches[0].clientX, - time: Date.now() - }; - }, { passive: true }); - - document.addEventListener('touchmove', function (e) { - if (!firstContact) - return; - - var curX = e.touches[0].clientX; - var xDiff = curX - firstContact.x, - tDiff = Date.now() - firstContact.time; - - if (tDiff < 250 && Math.abs(xDiff) >= 150) { - if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) - showSidebar(); - else if (xDiff < 0 && curX < 300) - hideSidebar(); - - firstContact = null; - } - }, { passive: true }); - - // Try to show the full sidebar - if (html.classList.contains("sidebar-visible")) { - var realHeight = sidebar.querySelector(".sidebar-scrollbox").scrollHeight; - document.getElementById("page-wrapper").style.minHeight = realHeight + 80 + "px"; - } -})(); - -(function chapterNavigation() { - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (window.search && window.search.hasFocus()) { return; } - - switch (e.key) { - case 'ArrowRight': - e.preventDefault(); - var nextButton = document.querySelector('.nav-chapters.next'); - if (nextButton) { - window.location.href = nextButton.href; - } - break; - case 'ArrowLeft': - e.preventDefault(); - var previousButton = document.querySelector('.nav-chapters.previous'); - if (previousButton) { - window.location.href = previousButton.href; - } - break; - } - }); -})(); - -(function clipboard() { - var clipButtons = document.querySelectorAll('.clip-button'); - - function hideTooltip(elem) { - elem.firstChild.innerText = ""; - elem.className = 'fa fa-copy clip-button'; - } - - function showTooltip(elem, msg) { - elem.firstChild.innerText = msg; - elem.className = 'fa fa-copy tooltipped'; - } - - var clipboardSnippets = new ClipboardJS('.clip-button', { - text: function (trigger) { - hideTooltip(trigger); - let playground = trigger.closest("pre"); - return playground_text(playground); - } - }); - - Array.from(clipButtons).forEach(function (clipButton) { - clipButton.addEventListener('mouseout', function (e) { - hideTooltip(e.currentTarget); - }); - }); - - clipboardSnippets.on('success', function (e) { - e.clearSelection(); - showTooltip(e.trigger, "Copied!"); - }); - - clipboardSnippets.on('error', function (e) { - showTooltip(e.trigger, "Clipboard error!"); - }); -})(); - -(function scrollToTop () { - var menuTitle = document.querySelector('.menu-title'); - - menuTitle.addEventListener('click', function () { - document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); - }); -})(); - -(function controllMenu() { - var menu = document.getElementById('menu-bar'); - - (function controllPosition() { - var scrollTop = document.scrollingElement.scrollTop; - var prevScrollTop = scrollTop; - var minMenuY = -menu.clientHeight - 50; - // When the script loads, the page can be at any scroll (e.g. if you reforesh it). - menu.style.top = scrollTop + 'px'; - // Same as parseInt(menu.style.top.slice(0, -2), but faster - var topCache = menu.style.top.slice(0, -2); - menu.classList.remove('sticky'); - var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster - document.addEventListener('scroll', function () { - scrollTop = Math.max(document.scrollingElement.scrollTop, 0); - // `null` means that it doesn't need to be updated - var nextSticky = null; - var nextTop = null; - var scrollDown = scrollTop > prevScrollTop; - var menuPosAbsoluteY = topCache - scrollTop; - if (scrollDown) { - nextSticky = false; - if (menuPosAbsoluteY > 0) { - nextTop = prevScrollTop; - } - } else { - if (menuPosAbsoluteY > 0) { - nextSticky = true; - } else if (menuPosAbsoluteY < minMenuY) { - nextTop = prevScrollTop + minMenuY; - } - } - if (nextSticky === true && stickyCache === false) { - menu.classList.add('sticky'); - stickyCache = true; - } else if (nextSticky === false && stickyCache === true) { - menu.classList.remove('sticky'); - stickyCache = false; - } - if (nextTop !== null) { - menu.style.top = nextTop + 'px'; - topCache = nextTop; - } - prevScrollTop = scrollTop; - }, { passive: true }); - })(); - (function controllBorder() { - menu.classList.remove('bordered'); - document.addEventListener('scroll', function () { - if (menu.offsetTop === 0) { - menu.classList.remove('bordered'); - } else { - menu.classList.add('bordered'); - } - }, { passive: true }); - })(); -})(); diff --git a/pagetop-mdbook/template/theme/css/chrome.css b/pagetop-mdbook/template/theme/css/chrome.css deleted file mode 100644 index 7f9dc35d..00000000 --- a/pagetop-mdbook/template/theme/css/chrome.css +++ /dev/null @@ -1,552 +0,0 @@ -/* CSS for UI elements (a.k.a. chrome) */ - -@import 'variables.css'; - -::-webkit-scrollbar { - background: var(--bg); -} -::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -#mdbook { - position: relative; - scrollbar-color: var(--scrollbar) var(--bg); -} -#mdbook .content { - position: relative; -} - -#mdbook #searchresults a, -#mdbook .content a:link, -#mdbook a:visited, -#mdbook a > .hljs { - color: var(--links); -} - -/* Menu Bar */ - -#menu-bar, -#menu-bar-hover-placeholder { - z-index: 101; - margin: auto calc(0px - var(--page-padding)); -} -#menu-bar { - position: relative; - display: flex; - flex-wrap: wrap; - background-color: var(--bg); - border-bottom-color: var(--bg); - border-bottom-width: 1px; - border-bottom-style: solid; -} -#menu-bar.sticky, -.js #menu-bar-hover-placeholder:hover + #menu-bar, -.js #menu-bar:hover, -.js.sidebar-visible #menu-bar { - position: -webkit-sticky; - position: sticky; - top: 0 !important; -} -#menu-bar-hover-placeholder { - position: sticky; - position: -webkit-sticky; - top: 0; - height: var(--menu-bar-height); -} -#menu-bar.bordered { - border-bottom-color: var(--table-border-color); -} -#menu-bar i, #menu-bar .icon-button { - position: relative; - padding: 0 8px; - z-index: 10; - line-height: var(--menu-bar-height); - cursor: pointer; - transition: color 0.5s; -} -@media only screen and (max-width: 420px) { - #menu-bar i, #menu-bar .icon-button { - padding: 0 5px; - } -} - -#mdbook .icon-button { - border: none; - background: none; - padding: 0; - color: inherit; -} -#mdbook .icon-button i { - margin: 0; -} - -#mdbook .right-buttons { - margin: 0 15px; -} -#mdbook .right-buttons a { - text-decoration: none; -} - -#mdbook .left-buttons { - display: flex; - margin: 0 5px; -} -.no-js #mdbook .left-buttons { - display: none; -} - -#mdbook .menu-title { - display: inline-block; - font-weight: 200; - font-size: 1.8rem; - line-height: var(--menu-bar-height); - text-align: center; - margin: 0; - flex: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.js #mdbook .menu-title { - cursor: pointer; -} -@media only screen and (max-width: 640px) { - #mdbook .menu-title { - font-size: 1.5rem; - } -} -@media only screen and (max-width: 420px) { - #mdbook .menu-title { - font-size: 1.2rem; - } -} - -#mdbook .menu-bar, -#mdbook .menu-bar:visited, -#mdbook .nav-chapters, -#mdbook .nav-chapters:visited, -#mdbook .mobile-nav-chapters, -#mdbook .mobile-nav-chapters:visited, -#mdbook .menu-bar .icon-button, -#mdbook .menu-bar a i { - color: var(--icons); -} - -#mdbook .menu-bar i:hover, -#mdbook .menu-bar .icon-button:hover, -#mdbook .nav-chapters:hover, -#mdbook .mobile-nav-chapters i:hover { - color: var(--icons-hover); -} - -/* Nav Icons */ - -#mdbook .nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - - position: absolute; - top: 0; - bottom: 0; - margin: 0; - max-width: 150px; - min-width: 90px; - - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - - transition: color 0.5s, background-color 0.5s; -} - -#mdbook .nav-chapters:hover { - text-decoration: none; - background-color: var(--theme-hover); - transition: background-color 0.15s, color 0.15s; -} - -#mdbook .nav-wrapper { - margin-top: 50px; - display: none; -} - -#mdbook .mobile-nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - width: 90px; - border-radius: 5px; - background-color: var(--sidebar-bg); -} - -#mdbook .previous { - float: left; -} - -#mdbook .next { - float: right; - right: var(--page-padding); -} - -@media only screen and (max-width: 1080px) { - #mdbook .nav-wide-wrapper { display: none; } - #mdbook .nav-wrapper { display: block; } -} - -@media only screen and (max-width: 1380px) { - .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } - .sidebar-visible #mdbook .nav-wrapper { display: block; } -} - -/* Inline code */ - -#mdbook :not(pre) > .hljs { - display: inline; - padding: 0.1em 0.3em; - border-radius: 3px; -} - -#mdbook :not(pre):not(a) > .hljs { - color: var(--inline-code-color); - overflow-x: initial; -} - -#mdbook a:hover > .hljs { - text-decoration: underline; -} - -#mdbook pre { - position: relative; - font-size: 0.875rem; -} -#mdbook pre > .buttons { - position: absolute; - z-index: 100; - right: 0px; - top: 2px; - margin: 0px; - padding: 2px 0px; - - color: var(--sidebar-fg); - cursor: pointer; - visibility: hidden; - opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; -} -#mdbook pre:hover > .buttons { - visibility: visible; - opacity: 1 -} -#mdbook pre > .buttons :hover { - color: var(--sidebar-active); - border-color: var(--icons-hover); - background-color: var(--theme-hover); -} -#mdbook pre > .buttons i { - margin-left: 8px; -} -#mdbook pre > .buttons button { - cursor: inherit; - margin: 0px 5px; - padding: 3px 5px; - font-size: 14px; - - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: var(--icons); - background-color: var(--theme-popup-bg); - transition: 100ms; - transition-property: color,border-color,background-color; - color: var(--icons); -} -@media (pointer: coarse) { - #mdbook pre > .buttons button { - /* On mobile, make it easier to tap buttons. */ - padding: 0.3rem 1rem; - } -} -#mdbook pre > code { - padding: 1rem; - font-size: 0.875rem; -} - -/* FIXME: ACE editors overlap their buttons because ACE does absolute - positioning within the code block which breaks padding. The only solution I - can think of is to move the padding to the outer pre tag (or insert a div - wrapper), but that would require fixing a whole bunch of CSS rules. -*/ -#mdbook .hljs.ace_editor { - padding: 0rem 0rem; -} - -#mdbook pre > .result { - margin-top: 10px; -} - -/* Search */ - -#searchresults a { - text-decoration: none; -} - -#mdbook mark { - border-radius: 2px; - padding: 0 3px 1px 3px; - margin: 0 -3px -1px -3px; - background-color: var(--search-mark-bg); - transition: background-color 300ms linear; - cursor: pointer; -} - -#mdbook mark.fade-out { - background-color: rgba(0,0,0,0) !important; - cursor: auto; -} - -#mdbook .searchbar-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} - -#searchbar { - width: 100%; - margin: 5px auto 0px auto; - padding: 10px 16px; - transition: box-shadow 300ms ease-in-out; - border: 1px solid var(--searchbar-border-color); - border-radius: 3px; - background-color: var(--searchbar-bg); - color: var(--searchbar-fg); -} -#searchbar:focus, -#searchbar.active { - box-shadow: 0 0 3px var(--searchbar-shadow-color); -} - -#mdbook .searchresults-header { - font-weight: bold; - font-size: 1em; - padding: 18px 0 0 5px; - color: var(--searchresults-header-fg); -} - -#mdbook .searchresults-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); - border-bottom: 1px dashed var(--searchresults-border-color); -} - -#mdbook ul#searchresults { - list-style: none; - padding-left: 20px; -} -#mdbook ul#searchresults li { - margin: 10px 0px; - padding: 2px; - border-radius: 2px; -} -#mdbook ul#searchresults li.focus { - background-color: var(--searchresults-li-bg); -} -#mdbook ul#searchresults span.teaser { - display: block; - clear: both; - margin: 5px 0 0 20px; - font-size: 0.8em; -} -#mdbook ul#searchresults span.teaser em { - font-weight: bold; - font-style: normal; -} - -/* Sidebar */ -#mdbook .sidebar { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: var(--sidebar-width); - font-size: 0.875em; - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - overscroll-behavior-y: contain; - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); -} -.sidebar-resizing { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.js:not(.sidebar-resizing) #mdbook .sidebar { - transition: transform 0.3s; /* Animation: slide away */ -} -#mdbook .sidebar code { - line-height: 2em; -} -#mdbook .sidebar .sidebar-scrollbox { - overflow-y: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 10px 10px; -} -#mdbook .sidebar .sidebar-resize-handle { - position: absolute; - cursor: col-resize; - width: 0; - right: 0; - top: 0; - bottom: 0; -} -.js #mdbook .sidebar .sidebar-resize-handle { - cursor: col-resize; - width: 5px; -} -.sidebar-hidden #mdbook .sidebar { - transform: translateX(calc(0px - var(--sidebar-width))); -} -#mdbook .sidebar::-webkit-scrollbar { - background: var(--sidebar-bg); -} -#mdbook .sidebar::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -.sidebar-visible #mdbook .page-wrapper { - transform: translateX(var(--sidebar-width)); -} -@media only screen and (min-width: 620px) { - .sidebar-visible #mdbook .page-wrapper { - transform: none; - margin-left: var(--sidebar-width); - } -} - -#mdbook .chapter { - list-style: none outside none; - padding-left: 0; - line-height: 2.2em; -} - -#mdbook .chapter ol { - width: 100%; -} - -#mdbook .chapter li { - display: flex; - color: var(--sidebar-non-existant); -} -#mdbook .chapter li a { - display: block; - padding: 0; - text-decoration: none; - color: var(--sidebar-fg); -} - -#mdbook .chapter li a:hover { - color: var(--sidebar-active); -} - -#mdbook .chapter li a.active { - color: var(--sidebar-active); -} - -#mdbook .chapter li > a.toggle { - cursor: pointer; - display: block; - margin-left: auto; - padding: 0 10px; - user-select: none; - opacity: 0.68; -} - -#mdbook .chapter li > a.toggle div { - transition: transform 0.5s; -} - -/* collapse the section */ -#mdbook .chapter li:not(.expanded) + li > ol { - display: none; -} - -#mdbook .chapter li.chapter-item { - line-height: 1.5em; - margin-top: 0.6em; -} - -#mdbook .chapter li.expanded > a.toggle div { - transform: rotate(90deg); -} - -#mdbook .spacer { - width: 100%; - height: 3px; - margin: 5px 0px; -} -#mdbook .chapter .spacer { - background-color: var(--sidebar-spacer); -} - -@media (-moz-touch-enabled: 1), (pointer: coarse) { - #mdbook .chapter li a { padding: 5px 0; } - #mdbook .spacer { margin: 10px 0; } -} - -#mdbook .section { - list-style: none outside none; - margin: 0; - padding: 0 0 0 20px; - line-height: 1.9em; -} - -/* Theme Menu Popup */ - -#mdbook .theme-popup { - position: absolute; - left: 10px; - top: var(--menu-bar-height); - z-index: 1000; - border-radius: 4px; - font-size: 0.7em; - color: var(--fg); - background: var(--theme-popup-bg); - border: 1px solid var(--theme-popup-border); - margin: 0; - padding: 0; - list-style: none; - display: none; -} -#mdbook .theme-popup .default { - color: var(--icons); -} -#mdbook .theme-popup .theme { - width: 100%; - border: 0; - margin: 0; - padding: 2px 10px; - line-height: 25px; - white-space: nowrap; - text-align: left; - cursor: pointer; - color: inherit; - background: inherit; - font-size: inherit; -} -#mdbook .theme-popup .theme:hover { - background-color: var(--theme-hover); -} -#mdbook .theme-popup .theme:hover:first-child, -#mdbook .theme-popup .theme:hover:last-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} diff --git a/pagetop-mdbook/template/theme/css/general.css b/pagetop-mdbook/template/theme/css/general.css deleted file mode 100644 index 8ace6312..00000000 --- a/pagetop-mdbook/template/theme/css/general.css +++ /dev/null @@ -1,187 +0,0 @@ -/* Base styles and content styles */ - -@import 'variables.css'; - -#mdbook { - font-family: "Open Sans", sans-serif; - color: var(--fg); - background-color: var(--bg); - text-size-adjust: none; - -webkit-text-size-adjust: none; - overflow-x: hidden; -} - -#mdbook code { - font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; -} - -/* make long words/inline code not x overflow */ -#mdbook main { - overflow-wrap: break-word; -} - -/* make wide tables scroll if they overflow */ -#mdbook .table-wrapper { - overflow-x: auto; -} - -/* Don't change font size in headers. */ -#mdbook h1 code, -#mdbook h2 code, -#mdbook h3 code, -#mdbook h4 code, -#mdbook h5 code, -#mdbook h6 code { - font-size: unset; -} - -#mdbook .left { float: left; } -#mdbook .right { float: right; } -#mdbook .boring { opacity: 0.6; } -#mdbook .hide-boring .boring { display: none; } -#mdbook .hidden { display: none !important; } - -#mdbook h2, #mdbook h3 { margin-top: 2.5em; } -#mdbook h4, #mdbook h5 { margin-top: 2em; } - -#mdbook .header + .header h3, -#mdbook .header + .header h4, -#mdbook .header + .header h5 { - margin-top: 1em; -} - -#mdbook h1:target::before, -#mdbook h2:target::before, -#mdbook h3:target::before, -#mdbook h4:target::before, -#mdbook h5:target::before, -#mdbook h6:target::before { - display: inline-block; - content: "»"; - margin-left: -30px; - width: 30px; -} - -/* This is broken on Safari as of version 14, but is fixed - in Safari Technology Preview 117 which I think will be Safari 14.2. - https://bugs.webkit.org/show_bug.cgi?id=218076 -*/ -:target { - scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); -} - -#mdbook .page { - outline: 0; - padding: 0 var(--page-padding); - margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ -} -#mdbook .page-wrapper { - box-sizing: border-box; -} -.js:not(.sidebar-resizing) #mdbook .page-wrapper { - transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ -} - -#mdbook .content { - overflow-y: auto; - padding: 20px 5px 50px 5px; -} -#mdbook .content main { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} -#mdbook .content p { line-height: 1.45em; } -#mdbook .content ol { line-height: 1.45em; } -#mdbook .content ul { line-height: 1.45em; } -#mdbook .content a { text-decoration: none; } -#mdbook .content a:hover { text-decoration: underline; } -#mdbook .content img, .content video { max-width: 100%; } -#mdbook .content .header:link, -#mdbook .content .header:visited { - color: var(--fg); -} -#mdbook .content .header:link, -#mdbook .content .header:visited:hover { - text-decoration: none; -} - -#mdbook table { - margin: 0 auto; - border-collapse: collapse; -} -#mdbook table td { - padding: 3px 20px; - border: 1px var(--table-border-color) solid; -} -#mdbook table thead { - background: var(--table-header-bg); -} -#mdbook table thead td { - font-weight: 700; - border: none; -} -#mdbook table thead th { - padding: 3px 20px; -} -#mdbook table thead tr { - border: 1px var(--table-header-bg) solid; -} -/* Alternate background colors for rows */ -#mdbook table tbody tr:nth-child(2n) { - background: var(--table-alternate-bg); -} - - -#mdbook blockquote { - margin: 20px 0; - padding: 0 20px; - color: var(--fg); - background-color: var(--quote-bg); - border-top: .1em solid var(--quote-border); - border-bottom: .1em solid var(--quote-border); -} -#mdbook blockquote p { - margin-top: 1rem; -} - -#mdbook :not(.footnote-definition) + .footnote-definition, -#mdbook .footnote-definition + :not(.footnote-definition) { - margin-top: 2em; -} -#mdbook .footnote-definition { - font-size: 0.9em; - margin: 0.5em 0; -} -#mdbook .footnote-definition p { - display: inline; -} - -#mdbook .tooltiptext { - position: absolute; - visibility: hidden; - color: #fff; - background-color: #333; - transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ - left: -8px; /* Half of the width of the icon */ - top: -35px; - font-size: 0.8em; - text-align: center; - border-radius: 6px; - padding: 5px 8px; - margin: 5px; - z-index: 1000; -} -#mdbook .tooltipped .tooltiptext { - visibility: visible; -} - -#mdbook .chapter li.part-title { - color: var(--sidebar-fg); - margin: 5px 0px; - font-weight: bold; -} - -#mdbook .result-no-output { - font-style: italic; -} diff --git a/pagetop-mdbook/template/theme/css/print.css b/pagetop-mdbook/template/theme/css/print.css deleted file mode 100644 index bd7c8da7..00000000 --- a/pagetop-mdbook/template/theme/css/print.css +++ /dev/null @@ -1,65 +0,0 @@ -#sidebar, -#menu-bar, -#mdbook .nav-chapters, -#mdbook .mobile-nav-chapters { - display: none; -} - -#mdbook, -#page-wrapper { - margin: 0; - padding: 0; - max-width: none; - transform: none !important; - overflow-y: initial; -} - -#content { - max-width: none; - margin: 0; - padding: 0; -} - -#mdbook .page { - overflow-y: initial; -} - -#mdbook code { - background-color: #eeeeee; - border-radius: 5px; - - /* Force background to be printed in Chrome */ - -webkit-print-color-adjust: exact; -} - -#mdbook pre > .buttons { - z-index: 2; -} - -#mdbook a, -#mdbook a:visited, -#mdbook a:active, -#mdbook a:hover { - color: #4183c4; - text-decoration: none; -} - -#mdbook h1, -#mdbook h2, -#mdbook h3, -#mdbook h4, -#mdbook h5, -#mdbook h6 { - page-break-inside: avoid; - page-break-after: avoid; -} - -#mdbook pre, -#mdbook code { - page-break-inside: avoid; - white-space: pre-wrap; -} - -#mdbook .fa { - display: none !important; -} diff --git a/pagetop-mdbook/template/theme/css/variables.css b/pagetop-mdbook/template/theme/css/variables.css deleted file mode 100644 index 7a68155a..00000000 --- a/pagetop-mdbook/template/theme/css/variables.css +++ /dev/null @@ -1,253 +0,0 @@ - -/* Globals */ - -:root { - --sidebar-width: 300px; - --page-padding: 15px; - --content-max-width: 750px; - --menu-bar-height: 50px; -} - -/* Themes */ - -.ayu { - --bg: hsl(210, 25%, 8%); - --fg: #c5c5c5; - - --sidebar-bg: #14191f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #5c6773; - --sidebar-active: #ffb454; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #0096cf; - - --inline-code-color: #ffb454; - - --theme-popup-bg: #14191f; - --theme-popup-border: #5c6773; - --theme-hover: #191f26; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(210, 25%, 13%); - --table-header-bg: hsl(210, 25%, 28%); - --table-alternate-bg: hsl(210, 25%, 11%); - - --searchbar-border-color: #848484; - --searchbar-bg: #424242; - --searchbar-fg: #fff; - --searchbar-shadow-color: #d4c89f; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #252932; - --search-mark-bg: #e3b171; -} - -.coal { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; -} - -.light { - --bg: hsl(0, 0%, 100%); - --fg: hsl(0, 0%, 0%); - - --sidebar-bg: #fafafa; - --sidebar-fg: hsl(0, 0%, 0%); - --sidebar-non-existant: #aaaaaa; - --sidebar-active: #1f1fff; - --sidebar-spacer: #f4f4f4; - - --scrollbar: #8F8F8F; - - --icons: #747474; - --icons-hover: #000000; - - --links: #20609f; - - --inline-code-color: #301900; - - --theme-popup-bg: #fafafa; - --theme-popup-border: #cccccc; - --theme-hover: #e6e6e6; - - --quote-bg: hsl(197, 37%, 96%); - --quote-border: hsl(197, 37%, 91%); - - --table-border-color: hsl(0, 0%, 95%); - --table-header-bg: hsl(0, 0%, 80%); - --table-alternate-bg: hsl(0, 0%, 97%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #e4f2fe; - --search-mark-bg: #a2cff5; -} - -.navy { - --bg: hsl(226, 23%, 11%); - --fg: #bcbdd0; - - --sidebar-bg: #282d3f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505274; - --sidebar-active: #2b79a2; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #161923; - --theme-popup-border: #737480; - --theme-hover: #282e40; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(226, 23%, 16%); - --table-header-bg: hsl(226, 23%, 31%); - --table-alternate-bg: hsl(226, 23%, 14%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #aeaec6; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #5f5f71; - --searchresults-border-color: #5c5c68; - --searchresults-li-bg: #242430; - --search-mark-bg: #a2cff5; -} - -.rust { - --bg: hsl(60, 9%, 87%); - --fg: #262625; - - --sidebar-bg: #3b2e2a; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505254; - --sidebar-active: #e69f67; - --sidebar-spacer: #45373a; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #262625; - - --links: #2b79a2; - - --inline-code-color: #6e6b5e; - - --theme-popup-bg: #e1e1db; - --theme-popup-border: #b38f6b; - --theme-hover: #99908a; - - --quote-bg: hsl(60, 5%, 75%); - --quote-border: hsl(60, 5%, 70%); - - --table-border-color: hsl(60, 9%, 82%); - --table-header-bg: #b3a497; - --table-alternate-bg: hsl(60, 9%, 84%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #dec2a2; - --search-mark-bg: #e69f67; -} - -@media (prefers-color-scheme: dark) { - .light.no-js { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - } -} diff --git a/pagetop-mdbook/template/theme/highlight.css b/pagetop-mdbook/template/theme/highlight.css deleted file mode 100644 index ba57b82b..00000000 --- a/pagetop-mdbook/template/theme/highlight.css +++ /dev/null @@ -1,82 +0,0 @@ -/* - * An increased contrast highlighting scheme loosely based on the - * "Base16 Atelier Dune Light" theme by Bram de Haan - * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) - * Original Base16 color scheme by Chris Kempson - * (https://github.com/chriskempson/base16) - */ - -/* Comment */ -.hljs-comment, -.hljs-quote { - color: #575757; -} - -/* Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d70025; -} - -/* Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b21e00; -} - -/* Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #008200; -} - -/* Blue */ -.hljs-title, -.hljs-section { - color: #0030f2; -} - -/* Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #9d00ec; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f6f7f6; - color: #000; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #22863a; - background-color: #f0fff4; -} - -.hljs-deletion { - color: #b31d28; - background-color: #ffeef0; -} diff --git a/pagetop-mdbook/template/theme/highlight.js b/pagetop-mdbook/template/theme/highlight.js deleted file mode 100644 index 180385b7..00000000 --- a/pagetop-mdbook/template/theme/highlight.js +++ /dev/null @@ -1,6 +0,0 @@ -/* - Highlight.js 10.1.1 (93fd0d73) - License: BSD-3-Clause - Copyright (c) 2006-2020, Ivan Sagalaev -*/ -var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/pagetop-mdbook/template/theme/index.hbs b/pagetop-mdbook/template/theme/index.hbs deleted file mode 100644 index 490b7ca1..00000000 --- a/pagetop-mdbook/template/theme/index.hbs +++ /dev/null @@ -1,261 +0,0 @@ -<!-- Lang: {{ language }} --> -<!-- Title: {{ title }} --> -<!-- Print: {{#if print_enable}}enabled{{else}}disabled{{/if}} --> -<!-- MathJax: {{#if mathjax_support}}supported{{else}}unsupported{{/if}} --> - -<!-- mdBook --> - -<!-- Provide site root to javascript --> -<script type="text/javascript"> - var path_to_root = "{{ path_to_root }}"; - var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}"; -</script> - -<!-- Work around some values being stored in localStorage wrapped in quotes --> -<script type="text/javascript"> - try { - var theme = localStorage.getItem('mdbook-theme'); - var sidebar = localStorage.getItem('mdbook-sidebar'); - - if (theme.startsWith('"') && theme.endsWith('"')) { - localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); - } - - if (sidebar.startsWith('"') && sidebar.endsWith('"')) { - localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); - } - } catch (e) { } -</script> - -<!-- Set the theme before any content is loaded, prevents flash --> -<script type="text/javascript"> - var theme; - try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } - if (theme === null || theme === undefined) { theme = default_theme; } - var html = document.querySelector('html'); - html.classList.remove('no-js') - html.classList.remove('{{ default_theme }}') - html.classList.add(theme); - html.classList.add('js'); -</script> - -<!-- Hide / unhide sidebar before it is displayed --> -<script type="text/javascript"> - var html = document.querySelector('html'); - var sidebar = 'hidden'; - if (document.body.clientWidth >= 1080) { - try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } - sidebar = sidebar || 'visible'; - } - html.classList.remove('sidebar-visible'); - html.classList.add("sidebar-" + sidebar); -</script> - -<nav id="sidebar" class="sidebar" aria-label="Table of contents"> - <div class="sidebar-scrollbox"> - {{#toc}}{{/toc}} - </div> - <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> -</nav> - -<div id="page-wrapper" class="page-wrapper"> - - <div class="page"> - {{> header}} - <div id="menu-bar-hover-placeholder"></div> - <div id="menu-bar" class="menu-bar sticky bordered"> - <div class="left-buttons"> - <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> - <i class="fa fa-bars"></i> - </button> - <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> - <i class="fa fa-paint-brush"></i> - </button> - <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> - <li role="none"><button role="menuitem" class="theme" id="light">{{ theme_option "Light" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="rust">{{ theme_option "Rust" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="coal">{{ theme_option "Coal" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="navy">{{ theme_option "Navy" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="ayu">{{ theme_option "Ayu" }}</button></li> - </ul> - {{#if search_enabled}} - <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> - <i class="fa fa-search"></i> - </button> - {{/if}} - </div> - - <h1 class="menu-title">{{ book_title }}</h1> - - <div class="right-buttons"> - {{#if print_enable}} - <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book"> - <i id="print-button" class="fa fa-print"></i> - </a> - {{/if}} - {{#if git_repository_url}} - <a href="{{git_repository_url}}" title="Git repository" aria-label="Git repository"> - <i id="git-repository-button" class="fa {{git_repository_icon}}"></i> - </a> - {{/if}} - {{#if git_repository_edit_url}} - <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit"> - <i id="git-edit-button" class="fa fa-edit"></i> - </a> - {{/if}} - - </div> - </div> - - {{#if search_enabled}} - <div id="search-wrapper" class="hidden"> - <form id="searchbar-outer" class="searchbar-outer"> - <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> - </form> - <div id="searchresults-outer" class="searchresults-outer hidden"> - <div id="searchresults-header" class="searchresults-header"></div> - <ul id="searchresults"> - </ul> - </div> - </div> - {{/if}} - - <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> - <script type="text/javascript"> - document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); - document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); - Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { - link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); - }); - </script> - - <div id="content" class="content"> - <main> - {{{ content }}} - </main> - - <nav class="nav-wrapper" aria-label="Page navigation"> - <!-- Mobile navigation buttons --> - {{#previous}} - <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> - <i class="fa fa-angle-left"></i> - </a> - {{/previous}} - - {{#next}} - <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> - <i class="fa fa-angle-right"></i> - </a> - {{/next}} - - <div style="clear: both"></div> - </nav> - </div> - </div> - - <nav class="nav-wide-wrapper" aria-label="Page navigation"> - {{#previous}} - <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> - <i class="fa fa-angle-left"></i> - </a> - {{/previous}} - - {{#next}} - <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> - <i class="fa fa-angle-right"></i> - </a> - {{/next}} - </nav> - -</div> - -{{#if live_reload_endpoint}} -<!-- Livereload script (if served using the cli tool) --> -<script type="text/javascript"> - const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; - const wsAddress = wsProtocol + "//" + location.host + "/" + "{{{live_reload_endpoint}}}"; - const socket = new WebSocket(wsAddress); - socket.onmessage = function (event) { - if (event.data === "reload") { - socket.close(); - location.reload(); - } - }; - - window.onbeforeunload = function() { - socket.close(); - } -</script> -{{/if}} - -{{#if google_analytics}} -<!-- Google Analytics Tag --> -<script type="text/javascript"> - var localAddrs = ["localhost", "127.0.0.1", ""]; - - // make sure we don't activate google analytics if the developer is - // inspecting the book locally... - if (localAddrs.indexOf(document.location.hostname) === -1) { - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); - - ga('create', '{{google_analytics}}', 'auto'); - ga('send', 'pageview'); - } -</script> -{{/if}} - -{{#if playground_line_numbers}} -<script type="text/javascript"> - window.playground_line_numbers = true; -</script> -{{/if}} - -{{#if playground_copyable}} -<script type="text/javascript"> - window.playground_copyable = true; -</script> -{{/if}} - -{{#if playground_js}} -<script src="{{ path_to_root }}ace.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}editor.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}mode-rust.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}theme-dawn.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}theme-tomorrow_night.js" type="text/javascript" charset="utf-8"></script> -{{/if}} - -{{#if search_js}} -<script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script> -{{/if}} - -<script src="{{ path_to_root }}clipboard.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}highlight.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script> - -<!-- Custom JS scripts --> -{{#each additional_js}} -<script type="text/javascript" src="{{ ../path_to_root }}{{this}}"></script> -{{/each}} - -{{#if is_print}} -{{#if mathjax_support}} -<script type="text/javascript"> -window.addEventListener('load', function() { - MathJax.Hub.Register.StartupHook('End', function() { - window.setTimeout(window.print, 100); - }); -}); -</script> -{{else}} -<script type="text/javascript"> -window.addEventListener('load', function() { - window.setTimeout(window.print, 100); -}); -</script> -{{/if}} -{{/if}} diff --git a/website/Cargo.toml b/website/Cargo.toml deleted file mode 100644 index 55231683..00000000 --- a/website/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "pagetop-website" -version = "0.0.1" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - PageTop website.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -actix-web = "4.2.1" -static-files = "0.2.3" -pagetop = { path = "../pagetop", version = "0.0" } -pagetop-mdbook = { path = "../pagetop-mdbook", version = "0.0" } -maud = "0.24.0" - -[build-dependencies] -pagetop = { path = "../pagetop", version = "0.0" } -pagetop-mdbook = { path = "../pagetop-mdbook", version = "0.0" } diff --git a/website/README.md b/website/README.md deleted file mode 100644 index bb51c89e..00000000 --- a/website/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Aplicación creada con **PageTop** para presentar el entorno a la comunidad y publicar la -documentación de usuario ([pagetop.cillero.es](https://pagetop.cillero.es)). - -[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo -basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side -Rendering*). - - -# 🚧 Advertencia - -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. - - -# 📜 Licencia - -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: - -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). - -* Licencia MIT - ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). diff --git a/website/build.rs b/website/build.rs deleted file mode 100644 index ebc2fa83..00000000 --- a/website/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -use pagetop::util::bundle_resources; -use pagetop_mdbook::util::except_mdbook_common_resources; - -fn main() -> std::io::Result<()> { - bundle_resources("./doc/en", "guides_en", Some(except_mdbook_common_resources))?; - bundle_resources("./doc/es", "guias_es", Some(except_mdbook_common_resources)) -} diff --git a/website/config/default.toml b/website/config/default.toml deleted file mode 100644 index 3216329d..00000000 --- a/website/config/default.toml +++ /dev/null @@ -1,9 +0,0 @@ -[app] -name = "PageTop WebSite" -description = """\ - The definitive PageTop Guide for PageTop Users.\ -""" -language = "es-ES" - -[log] -rolling = "Daily" diff --git a/website/doc/en/book.toml b/website/doc/en/book.toml deleted file mode 100644 index c45397b9..00000000 --- a/website/doc/en/book.toml +++ /dev/null @@ -1,8 +0,0 @@ -[book] -authors = ["Manuel Cillero"] -language = "en" -src = "src" -title = "PageTop Guides" - -[build] -build-dir = "../../static/doc/en" diff --git a/website/doc/en/src/404.md b/website/doc/en/src/404.md deleted file mode 100644 index a55db44e..00000000 --- a/website/doc/en/src/404.md +++ /dev/null @@ -1,3 +0,0 @@ -# Document not found (404) - -This URL is invalid, sorry. Try the search instead! \ No newline at end of file diff --git a/website/doc/en/src/README.md b/website/doc/en/src/README.md deleted file mode 100644 index a3aeb68d..00000000 --- a/website/doc/en/src/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Introduction - -**mdBook** is a command line tool to create books with Markdown. -It is ideal for creating product or API documentation, tutorials, course materials or anything that requires a clean, -easily navigable and customizable presentation. - -* Lightweight [Markdown] syntax helps you focus more on your content -* Integrated [search] support -* Color [syntax highlighting] for code blocks for many different languages -* [Theme] files allow customizing the formatting of the output -* [Preprocessors] can provide extensions for custom syntax and modifying content -* [Backends] can render the output to multiple formats -* Written in [Rust] for speed, safety, and simplicity -* Automated testing of [Rust code samples] - -This guide is an example of what mdBook produces. -mdBook is used by the Rust programming language project, and [The Rust Programming Language][trpl] book is another fine example of mdBook in action. - -[Markdown]: format/markdown.md -[search]: guide/reading.md#search -[syntax highlighting]: format/theme/syntax-highlighting.md -[theme]: format/theme/index.html -[preprocessors]: format/configuration/preprocessors.md -[backends]: format/configuration/renderers.md -[Rust]: https://www.rust-lang.org/ -[trpl]: https://doc.rust-lang.org/book/ -[Rust code samples]: cli/test.md - -## Contributing - -mdBook is free and open source. You can find the source code on -[GitHub](https://github.com/rust-lang/mdBook) and issues and feature requests can be posted on -the [GitHub issue tracker](https://github.com/rust-lang/mdBook/issues). mdBook relies on the community to fix bugs and -add features: if you'd like to contribute, please read -the [CONTRIBUTING](https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md) guide and consider opening -a [pull request](https://github.com/rust-lang/mdBook/pulls). - -## License - -The mdBook source and documentation are released under -the [Mozilla Public License v2.0](https://www.mozilla.org/MPL/2.0/). diff --git a/website/doc/en/src/SUMMARY.md b/website/doc/en/src/SUMMARY.md deleted file mode 100644 index 974d65fa..00000000 --- a/website/doc/en/src/SUMMARY.md +++ /dev/null @@ -1,43 +0,0 @@ -# Summary - -[Introduction](README.md) - -# User Guide - -- [Installation](guide/installation.md) -- [Reading Books](guide/reading.md) -- [Creating a Book](guide/creating.md) - -# Reference Guide - -- [Command Line Tool](cli/README.md) - - [init](cli/init.md) - - [build](cli/build.md) - - [watch](cli/watch.md) - - [serve](cli/serve.md) - - [test](cli/test.md) - - [clean](cli/clean.md) - - [completions](cli/completions.md) -- [Format](format/README.md) - - [SUMMARY.md](format/summary.md) - - [Draft chapter]() - - [Configuration](format/configuration/README.md) - - [General](format/configuration/general.md) - - [Preprocessors](format/configuration/preprocessors.md) - - [Renderers](format/configuration/renderers.md) - - [Environment Variables](format/configuration/environment-variables.md) - - [Theme](format/theme/README.md) - - [index.hbs](format/theme/index-hbs.md) - - [Syntax highlighting](format/theme/syntax-highlighting.md) - - [Editor](format/theme/editor.md) - - [MathJax Support](format/mathjax.md) - - [mdBook-specific features](format/mdbook.md) - - [Markdown](format/markdown.md) -- [Continuous Integration](continuous-integration.md) -- [For Developers](for_developers/README.md) - - [Preprocessors](for_developers/preprocessors.md) - - [Alternative Backends](for_developers/backends.md) - ------------ - -[Contributors](misc/contributors.md) diff --git a/website/doc/en/src/cli/README.md b/website/doc/en/src/cli/README.md deleted file mode 100644 index 2fbe3781..00000000 --- a/website/doc/en/src/cli/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Command Line Tool - -The `mdbook` command-line tool is used to create and build books. -After you have [installed](../guide/installation.md) `mdbook`, you can run the `mdbook help` command in your terminal to view the available commands. - -This following sections provide in-depth information on the different commands available. - -* [`mdbook init <directory>`](init.md) — Creates a new book with minimal boilerplate to start with. -* [`mdbook build`](build.md) — Renders the book. -* [`mdbook watch`](watch.md) — Rebuilds the book any time a source file changes. -* [`mdbook serve`](serve.md) — Runs a web server to view the book, and rebuilds on changes. -* [`mdbook test`](test.md) — Tests Rust code samples. -* [`mdbook clean`](clean.md) — Deletes the rendered output. -* [`mdbook completions`](completions.md) — Support for shell auto-completion. diff --git a/website/doc/en/src/cli/build.md b/website/doc/en/src/cli/build.md deleted file mode 100644 index 71f1c48c..00000000 --- a/website/doc/en/src/cli/build.md +++ /dev/null @@ -1,40 +0,0 @@ -# The build command - -The build command is used to render your book: - -```bash -mdbook build -``` - -It will try to parse your `SUMMARY.md` file to understand the structure of your -book and fetch the corresponding files. Note that files mentioned in `SUMMARY.md` -but not present will be created. - -The rendered output will maintain the same directory structure as the source for -convenience. Large books will therefore remain structured when rendered. - -#### Specify a directory - -The `build` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook build path/to/book -``` - -#### --open - -When you use the `--open` (`-o`) flag, mdbook will open the rendered book in -your default web browser after building it. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. - -------------------- - -***Note:*** *The build command copies all files (excluding files with `.md` extension) from the source directory -into the build directory.* diff --git a/website/doc/en/src/cli/clean.md b/website/doc/en/src/cli/clean.md deleted file mode 100644 index 23efc450..00000000 --- a/website/doc/en/src/cli/clean.md +++ /dev/null @@ -1,30 +0,0 @@ -# The clean command - -The clean command is used to delete the generated book and any other build -artifacts. - -```bash -mdbook clean -``` - -#### Specify a directory - -The `clean` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook clean path/to/book -``` - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to override the book's output -directory, which will be deleted by this command. Relative paths are interpreted -relative to the book's root directory. If not specified it will default to the -value of the `build.build-dir` key in `book.toml`, or to `./book`. - -```bash -mdbook clean --dest-dir=path/to/book -``` - -`path/to/book` could be absolute or relative. \ No newline at end of file diff --git a/website/doc/en/src/cli/completions.md b/website/doc/en/src/cli/completions.md deleted file mode 100644 index 1246b1ee..00000000 --- a/website/doc/en/src/cli/completions.md +++ /dev/null @@ -1,16 +0,0 @@ -# The completions command - -The completions command is used to generate auto-completions for some common shells. -This means when you type `mdbook` in your shell, you can then press your shell's auto-complete key (usually the Tab key) and it may display what the valid options are, or finish partial input. - -The completions first need to be installed for your shell: - -```bash -mdbook completions bash > ~/.local/share/bash-completion/completions/mdbook -``` - -The command prints a completion script for the given shell. -Run `mdbook completions --help` for a list of supported shells. - -Where to place the completions depend on which shell you are using and your operating system. -Consult your shell's documentation for more information one where to place the script. diff --git a/website/doc/en/src/cli/init.md b/website/doc/en/src/cli/init.md deleted file mode 100644 index 99c0be09..00000000 --- a/website/doc/en/src/cli/init.md +++ /dev/null @@ -1,70 +0,0 @@ -# The init command - -There is some minimal boilerplate that is the same for every new book. It's for -this purpose that mdBook includes an `init` command. - -The `init` command is used like this: - -```bash -mdbook init -``` - -When using the `init` command for the first time, a couple of files will be set -up for you: -```bash -book-test/ -├── book -└── src - ├── chapter_1.md - └── SUMMARY.md -``` - -- The `src` directory is where you write your book in markdown. It contains all - the source files, configuration files, etc. - -- The `book` directory is where your book is rendered. All the output is ready - to be uploaded to a server to be seen by your audience. - -- The `SUMMARY.md` is the skeleton of your - book, and is discussed in more detail [in another - chapter](../format/summary.md). - -#### Tip: Generate chapters from SUMMARY.md - -When a `SUMMARY.md` file already exists, the `init` command will first parse it -and generate the missing files according to the paths used in the `SUMMARY.md`. -This allows you to think and create the whole structure of your book and then -let mdBook generate it for you. - -#### Specify a directory - -The `init` command can take a directory as an argument to use as the book's root -instead of the current working directory. - -```bash -mdbook init path/to/book -``` - -#### --theme - -When you use the `--theme` flag, the default theme will be copied into a -directory called `theme` in your source directory so that you can modify it. - -The theme is selectively overwritten, this means that if you don't want to -overwrite a specific file, just delete it and the default file will be used. - -#### --title - -Specify a title for the book. If not supplied, an interactive prompt will ask for -a title. - -```bash -mdbook init --title="my amazing book" -``` - -#### --ignore - -Create a `.gitignore` file configured to ignore the `book` directory created when [building] a book. -If not supplied, an interactive prompt will ask whether it should be created. - -[building]: build.md diff --git a/website/doc/en/src/cli/serve.md b/website/doc/en/src/cli/serve.md deleted file mode 100644 index 62ea26c2..00000000 --- a/website/doc/en/src/cli/serve.md +++ /dev/null @@ -1,56 +0,0 @@ -# The serve command - -The serve command is used to preview a book by serving it via HTTP at -`localhost:3000` by default: - -```bash -mdbook serve -``` - -The `serve` command watches the book's `src` directory for -changes, rebuilding the book and refreshing clients for each change; this includes -re-creating deleted files still mentioned in `SUMMARY.md`! A websocket -connection is used to trigger the client-side refresh. - -***Note:*** *The `serve` command is for testing a book's HTML output, and is not -intended to be a complete HTTP server for a website.* - -#### Specify a directory - -The `serve` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook serve path/to/book -``` - -### Server options - -The `serve` hostname defaults to `localhost`, and the port defaults to `3000`. Either option can be specified on the command line: - -```bash -mdbook serve path/to/book -p 8000 -n 127.0.0.1 -``` - -#### --open - -When you use the `--open` (`-o`) flag, mdbook will open the book in your -default web browser after starting the server. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. - -#### Specify exclude patterns - -The `serve` command will not automatically trigger a build for files listed in -the `.gitignore` file in the book root directory. The `.gitignore` file may -contain file patterns described in the [gitignore -documentation](https://git-scm.com/docs/gitignore). This can be useful for -ignoring temporary files created by some editors. - -***Note:*** *Only the `.gitignore` from the book root directory is used. Global -`$HOME/.gitignore` or `.gitignore` files in parent directories are not used.* diff --git a/website/doc/en/src/cli/test.md b/website/doc/en/src/cli/test.md deleted file mode 100644 index e134dc9b..00000000 --- a/website/doc/en/src/cli/test.md +++ /dev/null @@ -1,63 +0,0 @@ -# The test command - -When writing a book, you sometimes need to automate some tests. For example, -[The Rust Programming Book](https://doc.rust-lang.org/stable/book/) uses a lot -of code examples that could get outdated. Therefore it is very important for -them to be able to automatically test these code examples. - -mdBook supports a `test` command that will run all available tests in a book. At -the moment, only rustdoc tests are supported, but this may be expanded upon in -the future. - -#### Disable tests on a code block - -rustdoc doesn't test code blocks which contain the `ignore` attribute: - - ```rust,ignore - fn main() {} - ``` - -rustdoc also doesn't test code blocks which specify a language other than Rust: - - ```markdown - **Foo**: _bar_ - ``` - -rustdoc *does* test code blocks which have no language specified: - - ``` - This is going to cause an error! - ``` - -#### Specify a directory - -The `test` command can take a directory as an argument to use as the book's root -instead of the current working directory. - -```bash -mdbook test path/to/book -``` - -#### --library-path - -The `--library-path` (`-L`) option allows you to add directories to the library -search path used by `rustdoc` when it builds and tests the examples. Multiple -directories can be specified with multiple options (`-L foo -L bar`) or with a -comma-delimited list (`-L foo,bar`). The path should point to the Cargo -[build cache](https://doc.rust-lang.org/cargo/guide/build-cache.html) `deps` directory that -contains the build output of your project. For example, if your Rust project's book is in a directory -named `my-book`, the following command would include the crate's dependencies when running `test`: - -```shell -mdbook test my-book -L target/debug/deps/ -``` - -See the `rustdoc` command-line [documentation](https://doc.rust-lang.org/rustdoc/command-line-arguments.html#-l--library-path-where-to-look-for-dependencies) -for more information. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. diff --git a/website/doc/en/src/cli/watch.md b/website/doc/en/src/cli/watch.md deleted file mode 100644 index 3522f43c..00000000 --- a/website/doc/en/src/cli/watch.md +++ /dev/null @@ -1,40 +0,0 @@ -# The watch command - -The `watch` command is useful when you want your book to be rendered on every -file change. You could repeatedly issue `mdbook build` every time a file is -changed. But using `mdbook watch` once will watch your files and will trigger a -build automatically whenever you modify a file; this includes re-creating -deleted files still mentioned in `SUMMARY.md`! - -#### Specify a directory - -The `watch` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook watch path/to/book -``` - -#### --open - -When you use the `--open` (`-o`) option, mdbook will open the rendered book in -your default web browser. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. - - -#### Specify exclude patterns - -The `watch` command will not automatically trigger a build for files listed in -the `.gitignore` file in the book root directory. The `.gitignore` file may -contain file patterns described in the [gitignore -documentation](https://git-scm.com/docs/gitignore). This can be useful for -ignoring temporary files created by some editors. - -_Note: Only `.gitignore` from book root directory is used. Global -`$HOME/.gitignore` or `.gitignore` files in parent directories are not used._ diff --git a/website/doc/en/src/continuous-integration.md b/website/doc/en/src/continuous-integration.md deleted file mode 100644 index c39cb010..00000000 --- a/website/doc/en/src/continuous-integration.md +++ /dev/null @@ -1,121 +0,0 @@ -# Running `mdbook` in Continuous Integration - -There are a variety of services such as [GitHub Actions] or [GitLab CI/CD] which can be used to test and deploy your book automatically. - -The following provides some general guidelines on how to configure your service to run mdBook. -Specific recipes can be found at the [Automated Deployment] wiki page. - -[GitHub Actions]: https://docs.github.com/en/actions -[GitLab CI/CD]: https://docs.gitlab.com/ee/ci/ -[Automated Deployment]: https://github.com/rust-lang/mdBook/wiki/Automated-Deployment - -## Installing mdBook - -There are several different strategies for installing mdBook. -The particular method depends on your needs and preferences. - -### Pre-compiled binaries - -Perhaps the easiest method is to use the pre-compiled binaries found on the [GitHub Releases page][releases]. -A simple approach would be to use the popular `curl` CLI tool to download the executable: - -```sh -mkdir bin -curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.21/mdbook-v0.4.21-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin -bin/mdbook build -``` - -Some considerations for this approach: - -* This is relatively fast, and does not necessarily require dealing with caching. -* This does not require installing Rust. -* Specifying a specific URL means you have to manually update your script to get a new version. - This may be a benefit if you want to lock to a specific version. - However, some users prefer to automatically get a newer version when they are published. -* You are reliant on the GitHub CDN being available. - -[releases]: https://github.com/rust-lang/mdBook/releases - -### Building from source - -Building from source will require having Rust installed. -Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. - -After Rust is installed, `cargo install` can be used to build and install mdBook. -We recommend using a SemVer version specifier so that you get the latest **non-breaking** version of mdBook. -For example: - -```sh -cargo install mdbook --no-default-features --features search --vers "^0.4" --locked -``` - -This includes several recommended options: - -* `--no-default-features` — Disables features like the HTTP server used by `mdbook serve` that is likely not needed on CI. - This will speed up the build time significantly. -* `--features search` — Disabling default features means you should then manually enable features that you want, such as the built-in [search] capability. -* `--vers "^0.4"` — This will install the most recent version of the `0.4` series. - However, versions after like `0.5.0` won't be installed, as they may break your build. - Cargo will automatically upgrade mdBook if you have an older version already installed. -* `--locked` — This will use the dependencies that were used when mdBook was released. - Without `--locked`, it will use the latest version of all dependencies, which may include some fixes since the last release, but may also (rarely) cause build problems. - -You will likely want to investigate caching options, as building mdBook can be somewhat slow. - -[search]: guide/reading.md#search - -## Running tests - -You may want to run tests using [`mdbook test`] every time you push a change or create a pull request. -This can be used to validate Rust code examples in the book. - -This will require having Rust installed. -Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. - -Other than making sure the appropriate version of Rust is installed, there's not much more than just running `mdbook test` from the book directory. - -You may also want to consider running other kinds of tests, like [mdbook-linkcheck] which will check for broken links. -Or if you have your own style checks, spell checker, or any other tests it might be good to run them in CI. - -[`mdbook test`]: cli/test.md -[mdbook-linkcheck]: https://github.com/Michael-F-Bryan/mdbook-linkcheck#continuous-integration - -## Deploying - -You may want to automatically deploy your book. -Some may want to do this with every time a change is pushed, and others may want to only deploy when a specific release is tagged. - -You'll also need to understand the specifics on how to push a change to your web service. -For example, [GitHub Pages] just requires committing the output onto a specific git branch. -Other services may require using something like SSH to connect to a remote server. - -The basic outline is that you need to run `mdbook build` to generate the output, and then transfer the files (which are in the `book` directory) to the correct location. - -You may then want to consider if you need to invalidate any caches on your web service. - -See the [Automated Deployment] wiki page for examples of various different services. - -[GitHub Pages]: https://docs.github.com/en/pages - -### 404 handling - -mdBook automatically generates a 404 page to be used for broken links. -The default output is a file named `404.html` at the root of the book. -Some services like [GitHub Pages] will automatically use this page for broken links. -For other services, you may want to consider configuring the web server to use this page as it will provide the reader navigation to get back to the book. - -If your book is not deployed at the root of the domain, then you should set the [`output.html.site-url`] setting so that the 404 page works correctly. -It needs to know where the book is deployed in order to load the static files (like CSS) correctly. -For example, this guide is deployed at <https://rust-lang.github.io/mdBook/>, and the `site-url` setting is configured like this: - -```toml -# book.toml -[output.html] -site-url = "/mdBook/" -``` - -You can customize the look of the 404 page by creating a file named `src/404.md` in your book. -If you want to use a different filename, you can set [`output.html.input-404`] to a different filename. - -[`output.html.site-url`]: format/configuration/renderers.md#html-renderer-options -[`output.html.input-404`]: format/configuration/renderers.md#html-renderer-options diff --git a/website/doc/en/src/for_developers/README.md b/website/doc/en/src/for_developers/README.md deleted file mode 100644 index d8b97709..00000000 --- a/website/doc/en/src/for_developers/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# For Developers - -While `mdbook` is mainly used as a command line tool, you can also import the -underlying library directly and use that to manage a book. It also has a fairly -flexible plugin mechanism, allowing you to create your own custom tooling and -consumers (often referred to as *backends*) if you need to do some analysis of -the book or render it in a different format. - -The *For Developers* chapters are here to show you the more advanced usage of -`mdbook`. - -The two main ways a developer can hook into the book's build process is via, - -- [Preprocessors](preprocessors.md) -- [Alternative Backends](backends.md) - - -## The Build Process - -The process of rendering a book project goes through several steps. - -1. Load the book - - Parse the `book.toml`, falling back to the default `Config` if it doesn't - exist - - Load the book chapters into memory - - Discover which preprocessors/backends should be used -2. For each backend: - 1. Run all the preprocessors. - 2. Call the backend to render the processed result. - - -## Using `mdbook` as a Library - -The `mdbook` binary is just a wrapper around the `mdbook` crate, exposing its -functionality as a command-line program. As such it is quite easy to create your -own programs which use `mdbook` internally, adding your own functionality (e.g. -a custom preprocessor) or tweaking the build process. - -The easiest way to find out how to use the `mdbook` crate is by looking at the -[API Docs]. The top level documentation explains how one would use the -[`MDBook`] type to load and build a book, while the [config] module gives a good -explanation on the configuration system. - - -[`MDBook`]: https://docs.rs/mdbook/*/mdbook/book/struct.MDBook.html -[API Docs]: https://docs.rs/mdbook/*/mdbook/ -[config]: https://docs.rs/mdbook/*/mdbook/config/index.html diff --git a/website/doc/en/src/for_developers/backends.md b/website/doc/en/src/for_developers/backends.md deleted file mode 100644 index 78326a36..00000000 --- a/website/doc/en/src/for_developers/backends.md +++ /dev/null @@ -1,346 +0,0 @@ -# Alternative Backends - -A "backend" is simply a program which `mdbook` will invoke during the book -rendering process. This program is passed a JSON representation of the book and -configuration information via `stdin`. Once the backend receives this -information it is free to do whatever it wants. - -See [Configuring Renderers](../format/configuration/renderers.md) for more information about using backends. - -The community has developed several backends. -See the [Third Party Plugins] wiki page for a list of available backends. - -## Setting Up - -This page will step you through creating your own alternative backend in the form -of a simple word counting program. Although it will be written in Rust, there's -no reason why it couldn't be accomplished using something like Python or Ruby. - -First you'll want to create a new binary program and add `mdbook` as a -dependency. - -```shell -$ cargo new --bin mdbook-wordcount -$ cd mdbook-wordcount -$ cargo add mdbook -``` - -When our `mdbook-wordcount` plugin is invoked, `mdbook` will send it a JSON -version of [`RenderContext`] via our plugin's `stdin`. For convenience, there's -a [`RenderContext::from_json()`] constructor which will load a `RenderContext`. - -This is all the boilerplate necessary for our backend to load the book. - -```rust -// src/main.rs -extern crate mdbook; - -use std::io; -use mdbook::renderer::RenderContext; - -fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); -} -``` - -> **Note:** The `RenderContext` contains a `version` field. This lets backends - figure out whether they are compatible with the version of `mdbook` it's being - called by. This `version` comes directly from the corresponding field in - `mdbook`'s `Cargo.toml`. - - It is recommended that backends use the [`semver`] crate to inspect this field - and emit a warning if there may be a compatibility issue. - - -## Inspecting the Book - -Now our backend has a copy of the book, lets count how many words are in each -chapter! - -Because the `RenderContext` contains a [`Book`] field (`book`), and a `Book` has -the [`Book::iter()`] method for iterating over all items in a `Book`, this step -turns out to be just as easy as the first. - -```rust - -fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - } - } -} - -fn count_words(ch: &Chapter) -> usize { - ch.content.split_whitespace().count() -} -``` - - -## Enabling the Backend - -Now we've got the basics running, we want to actually use it. First, install the -program. - -```shell -$ cargo install --path . -``` - -Then `cd` to the particular book you'd like to count the words of and update its -`book.toml` file. - -```diff - [book] - title = "mdBook Documentation" - description = "Create book from markdown files. Like Gitbook but implemented in Rust" - authors = ["Mathieu David", "Michael-F-Bryan"] - -+ [output.html] - -+ [output.wordcount] -``` - -When it loads a book into memory, `mdbook` will inspect your `book.toml` file to -try and figure out which backends to use by looking for all `output.*` tables. -If none are provided it'll fall back to using the default HTML renderer. - -Notably, this means if you want to add your own custom backend you'll also need -to make sure to add the HTML backend, even if its table just stays empty. - -Now you just need to build your book like normal, and everything should *Just -Work*. - -```shell -$ mdbook build -... -2018-01-16 07:31:15 [INFO] (mdbook::renderer): Invoking the "mdbook-wordcount" renderer -mdBook: 126 -Command Line Tool: 224 -init: 283 -build: 145 -watch: 146 -serve: 292 -test: 139 -Format: 30 -SUMMARY.md: 259 -Configuration: 784 -Theme: 304 -index.hbs: 447 -Syntax highlighting: 314 -MathJax Support: 153 -Rust code specific features: 148 -For Developers: 788 -Alternative Backends: 710 -Contributors: 85 -``` - -The reason we didn't need to specify the full name/path of our `wordcount` -backend is because `mdbook` will try to *infer* the program's name via -convention. The executable for the `foo` backend is typically called -`mdbook-foo`, with an associated `[output.foo]` entry in the `book.toml`. To -explicitly tell `mdbook` what command to invoke (it may require command-line -arguments or be an interpreted script), you can use the `command` field. - -```diff - [book] - title = "mdBook Documentation" - description = "Create book from markdown files. Like Gitbook but implemented in Rust" - authors = ["Mathieu David", "Michael-F-Bryan"] - - [output.html] - - [output.wordcount] -+ command = "python /path/to/wordcount.py" -``` - - -## Configuration - -Now imagine you don't want to count the number of words on a particular chapter -(it might be generated text/code, etc). The canonical way to do this is via the -usual `book.toml` configuration file by adding items to your `[output.foo]` -table. - -The `Config` can be treated roughly as a nested hashmap which lets you call -methods like `get()` to access the config's contents, with a -`get_deserialized()` convenience method for retrieving a value and automatically -deserializing to some arbitrary type `T`. - -To implement this, we'll create our own serializable `WordcountConfig` struct -which will encapsulate all configuration for this backend. - -First add `serde` and `serde_derive` to your `Cargo.toml`, - -``` -$ cargo add serde serde_derive -``` - -And then you can create the config struct, - -```rust -extern crate serde; -#[macro_use] -extern crate serde_derive; - -... - -#[derive(Debug, Default, Serialize, Deserialize)] -#[serde(default, rename_all = "kebab-case")] -pub struct WordcountConfig { - pub ignores: Vec<String>, -} -``` - -Now we just need to deserialize the `WordcountConfig` from our `RenderContext` -and then add a check to make sure we skip ignored chapters. - -```diff - fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); -+ let cfg: WordcountConfig = ctx.config -+ .get_deserialized("output.wordcount") -+ .unwrap_or_default(); - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { -+ if cfg.ignores.contains(&ch.name) { -+ continue; -+ } -+ - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - } - } - } -``` - - -## Output and Signalling Failure - -While it's nice to print word counts to the terminal when a book is built, it -might also be a good idea to output them to a file somewhere. `mdbook` tells a -backend where it should place any generated output via the `destination` field -in [`RenderContext`]. - -```diff -+ use std::fs::{self, File}; -+ use std::io::{self, Write}; -- use std::io; - use mdbook::renderer::RenderContext; - use mdbook::book::{BookItem, Chapter}; - - fn main() { - ... - -+ let _ = fs::create_dir_all(&ctx.destination); -+ let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); -+ - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - ... - - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); -+ writeln!(f, "{}: {}", ch.name, num_words).unwrap(); - } - } - } -``` - -> **Note:** There is no guarantee that the destination directory exists or is -> empty (`mdbook` may leave the previous contents to let backends do caching), -> so it's always a good idea to create it with `fs::create_dir_all()`. -> -> If the destination directory already exists, don't assume it will be empty. -> To allow backends to cache the results from previous runs, `mdbook` may leave -> old content in the directory. - -There's always the possibility that an error will occur while processing a book -(just look at all the `unwrap()`'s we've written already), so `mdbook` will -interpret a non-zero exit code as a rendering failure. - -For example, if we wanted to make sure all chapters have an *even* number of -words, erroring out if an odd number is encountered, then you may do something -like this: - -```diff -+ use std::process; - ... - - fn main() { - ... - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - ... - - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - writeln!(f, "{}: {}", ch.name, num_words).unwrap(); - -+ if cfg.deny_odds && num_words % 2 == 1 { -+ eprintln!("{} has an odd number of words!", ch.name); -+ process::exit(1); - } - } - } - } - - #[derive(Debug, Default, Serialize, Deserialize)] - #[serde(default, rename_all = "kebab-case")] - pub struct WordcountConfig { - pub ignores: Vec<String>, -+ pub deny_odds: bool, - } -``` - -Now, if we reinstall the backend and build a book, - -```shell -$ cargo install --path . --force -$ mdbook build /path/to/book -... -2018-01-16 21:21:39 [INFO] (mdbook::renderer): Invoking the "wordcount" renderer -mdBook: 126 -Command Line Tool: 224 -init: 283 -init has an odd number of words! -2018-01-16 21:21:39 [ERROR] (mdbook::renderer): Renderer exited with non-zero return code. -2018-01-16 21:21:39 [ERROR] (mdbook::utils): Error: Rendering failed -2018-01-16 21:21:39 [ERROR] (mdbook::utils): Caused By: The "mdbook-wordcount" renderer failed -``` - -As you've probably already noticed, output from the plugin's subprocess is -immediately passed through to the user. It is encouraged for plugins to follow -the "rule of silence" and only generate output when necessary (e.g. an error in -generation or a warning). - -All environment variables are passed through to the backend, allowing you to use -the usual `RUST_LOG` to control logging verbosity. - -## Wrapping Up - -Although contrived, hopefully this example was enough to show how you'd create -an alternative backend for `mdbook`. If you feel it's missing something, don't -hesitate to create an issue in the [issue tracker] so we can improve the user -guide. - -The existing backends mentioned towards the start of this chapter should serve -as a good example of how it's done in real life, so feel free to skim through -the source code or ask questions. - - -[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins -[`RenderContext`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html -[`RenderContext::from_json()`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html#method.from_json -[`semver`]: https://crates.io/crates/semver -[`Book`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html -[`Book::iter()`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html#method.iter -[`Config`]: https://docs.rs/mdbook/*/mdbook/config/struct.Config.html -[issue tracker]: https://github.com/rust-lang/mdBook/issues diff --git a/website/doc/en/src/for_developers/mdbook-wordcount/Cargo.toml b/website/doc/en/src/for_developers/mdbook-wordcount/Cargo.toml deleted file mode 100644 index e58e73b6..00000000 --- a/website/doc/en/src/for_developers/mdbook-wordcount/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "mdbook-wordcount" -version = "0.1.0" -authors = ["Michael Bryan <michaelfbryan@gmail.com>"] - -[dependencies] -mdbook = { path = "../../../..", version = "*" } -serde = "1.0" -serde_derive = "1.0" diff --git a/website/doc/en/src/for_developers/mdbook-wordcount/src/main.rs b/website/doc/en/src/for_developers/mdbook-wordcount/src/main.rs deleted file mode 100644 index 607338dd..00000000 --- a/website/doc/en/src/for_developers/mdbook-wordcount/src/main.rs +++ /dev/null @@ -1,49 +0,0 @@ -extern crate mdbook; -extern crate serde; -#[macro_use] -extern crate serde_derive; - -use std::process; -use std::fs::{self, File}; -use std::io::{self, Write}; -use mdbook::renderer::RenderContext; -use mdbook::book::{BookItem, Chapter}; - -fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); - let cfg: WordcountConfig = ctx.config - .get_deserialized("output.wordcount") - .unwrap_or_default(); - - let _ = fs::create_dir_all(&ctx.destination); - let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - if cfg.ignores.contains(&ch.name) { - continue; - } - - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - writeln!(f, "{}: {}", ch.name, num_words).unwrap(); - - if cfg.deny_odds && num_words % 2 == 1 { - eprintln!("{} has an odd number of words!", ch.name); - process::exit(1); - } - } - } -} - -fn count_words(ch: &Chapter) -> usize { - ch.content.split_whitespace().count() -} - -#[derive(Debug, Default, Serialize, Deserialize)] -#[serde(default, rename_all = "kebab-case")] -pub struct WordcountConfig { - pub ignores: Vec<String>, - pub deny_odds: bool, -} diff --git a/website/doc/en/src/for_developers/preprocessors.md b/website/doc/en/src/for_developers/preprocessors.md deleted file mode 100644 index dbe78779..00000000 --- a/website/doc/en/src/for_developers/preprocessors.md +++ /dev/null @@ -1,126 +0,0 @@ -# Preprocessors - -A *preprocessor* is simply a bit of code which gets run immediately after the -book is loaded and before it gets rendered, allowing you to update and mutate -the book. Possible use cases are: - -- Creating custom helpers like `\{{#include /path/to/file.md}}` -- Substituting in latex-style expressions (`$$ \frac{1}{3} $$`) with their - mathjax equivalents - -See [Configuring Preprocessors](../format/configuration/preprocessors.md) for more information about using preprocessors. - -## Hooking Into MDBook - -MDBook uses a fairly simple mechanism for discovering third party plugins. -A new table is added to `book.toml` (e.g. `[preprocessor.foo]` for the `foo` -preprocessor) and then `mdbook` will try to invoke the `mdbook-foo` program as -part of the build process. - -Once the preprocessor has been defined and the build process starts, mdBook executes the command defined in the `preprocessor.foo.command` key twice. -The first time it runs the preprocessor to determine if it supports the given renderer. -mdBook passes two arguments to the process: the first argument is the string `supports` and the second argument is the renderer name. -The preprocessor should exit with a status code 0 if it supports the given renderer, or return a non-zero exit code if it does not. - -If the preprocessor supports the renderer, then mdbook runs it a second time, passing JSON data into stdin. -The JSON consists of an array of `[context, book]` where `context` is the serialized object [`PreprocessorContext`] and `book` is a [`Book`] object containing the content of the book. - -The preprocessor should return the JSON format of the [`Book`] object to stdout, with any modifications it wishes to perform. - -The easiest way to get started is by creating your own implementation of the -`Preprocessor` trait (e.g. in `lib.rs`) and then creating a shell binary which -translates inputs to the correct `Preprocessor` method. For convenience, there -is [an example no-op preprocessor] in the `examples/` directory which can easily -be adapted for other preprocessors. - -</details> - -## Hints For Implementing A Preprocessor - -By pulling in `mdbook` as a library, preprocessors can have access to the -existing infrastructure for dealing with books. - -For example, a custom preprocessor could use the -[`CmdPreprocessor::parse_input()`] function to deserialize the JSON written to -`stdin`. Then each chapter of the `Book` can be mutated in-place via -[`Book::for_each_mut()`], and then written to `stdout` with the `serde_json` -crate. - -Chapters can be accessed either directly (by recursively iterating over -chapters) or via the `Book::for_each_mut()` convenience method. - -The `chapter.content` is just a string which happens to be markdown. While it's -entirely possible to use regular expressions or do a manual find & replace, -you'll probably want to process the input into something more computer-friendly. -The [`pulldown-cmark`][pc] crate implements a production-quality event-based -Markdown parser, with the [`pulldown-cmark-to-cmark`][pctc] crate allowing you to -translate events back into markdown text. - -The following code block shows how to remove all emphasis from markdown, -without accidentally breaking the document. - -```rust -fn remove_emphasis( - num_removed_items: &mut usize, - chapter: &mut Chapter, -) -> Result<String> { - let mut buf = String::with_capacity(chapter.content.len()); - - let events = Parser::new(&chapter.content).filter(|e| { - let should_keep = match *e { - Event::Start(Tag::Emphasis) - | Event::Start(Tag::Strong) - | Event::End(Tag::Emphasis) - | Event::End(Tag::Strong) => false, - _ => true, - }; - if !should_keep { - *num_removed_items += 1; - } - should_keep - }); - - cmark(events, &mut buf, None).map(|_| buf).map_err(|err| { - Error::from(format!("Markdown serialization failed: {}", err)) - }) -} -``` - -For everything else, have a look [at the complete example][example]. - -## Implementing a preprocessor with a different language - -The fact that mdBook utilizes stdin and stdout to communicate with the preprocessors makes it easy to implement them in a language other than Rust. -The following code shows how to implement a simple preprocessor in Python, which will modify the content of the first chapter. -The example below follows the configuration shown above with `preprocessor.foo.command` actually pointing to a Python script. - -```python -import json -import sys - - -if __name__ == '__main__': - if len(sys.argv) > 1: # we check if we received any argument - if sys.argv[1] == "supports": - # then we are good to return an exit status code of 0, since the other argument will just be the renderer's name - sys.exit(0) - - # load both the context and the book representations from stdin - context, book = json.load(sys.stdin) - # and now, we can just modify the content of the first chapter - book['sections'][0]['Chapter']['content'] = '# Hello' - # we are done with the book's modification, we can just print it to stdout, - print(json.dumps(book)) -``` - - - -[preprocessor-docs]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html -[pc]: https://crates.io/crates/pulldown-cmark -[pctc]: https://crates.io/crates/pulldown-cmark-to-cmark -[example]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs -[an example no-op preprocessor]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs -[`CmdPreprocessor::parse_input()`]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html#method.parse_input -[`Book::for_each_mut()`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html#method.for_each_mut -[`PreprocessorContext`]: https://docs.rs/mdbook/latest/mdbook/preprocess/struct.PreprocessorContext.html -[`Book`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html diff --git a/website/doc/en/src/format/README.md b/website/doc/en/src/format/README.md deleted file mode 100644 index 35757252..00000000 --- a/website/doc/en/src/format/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Format - -In this section you will learn how to: - -- Structure your book correctly -- Format your `SUMMARY.md` file -- Configure your book using `book.toml` -- Customize your theme diff --git a/website/doc/en/src/format/configuration/README.md b/website/doc/en/src/format/configuration/README.md deleted file mode 100644 index 4dcb5852..00000000 --- a/website/doc/en/src/format/configuration/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Configuration - -This section details the configuration options available in the ***book.toml***: -- **[General]** configuration including the `book`, `rust`, `build` sections -- **[Preprocessor]** configuration for default and custom book preprocessors -- **[Renderer]** configuration for the HTML, Markdown and custom renderers -- **[Environment Variable]** configuration for overriding configuration options in your environment - -[General]: general.md -[Preprocessor]: preprocessors.md -[Renderer]: renderers.md -[Environment Variable]: environment-variables.md \ No newline at end of file diff --git a/website/doc/en/src/format/configuration/environment-variables.md b/website/doc/en/src/format/configuration/environment-variables.md deleted file mode 100644 index 3631769b..00000000 --- a/website/doc/en/src/format/configuration/environment-variables.md +++ /dev/null @@ -1,38 +0,0 @@ -# Environment Variables - -All configuration values can be overridden from the command line by setting the -corresponding environment variable. Because many operating systems restrict -environment variables to be alphanumeric characters or `_`, the configuration -key needs to be formatted slightly differently to the normal `foo.bar.baz` form. - -Variables starting with `MDBOOK_` are used for configuration. The key is created -by removing the `MDBOOK_` prefix and turning the resulting string into -`kebab-case`. Double underscores (`__`) separate nested keys, while a single -underscore (`_`) is replaced with a dash (`-`). - -For example: - -- `MDBOOK_foo` -> `foo` -- `MDBOOK_FOO` -> `foo` -- `MDBOOK_FOO__BAR` -> `foo.bar` -- `MDBOOK_FOO_BAR` -> `foo-bar` -- `MDBOOK_FOO_bar__baz` -> `foo-bar.baz` - -So by setting the `MDBOOK_BOOK__TITLE` environment variable you can override the -book's title without needing to touch your `book.toml`. - -> **Note:** To facilitate setting more complex config items, the value of an -> environment variable is first parsed as JSON, falling back to a string if the -> parse fails. -> -> This means, if you so desired, you could override all book metadata when -> building the book with something like -> -> ```shell -> $ export MDBOOK_BOOK="{'title': 'My Awesome Book', authors: ['Michael-F-Bryan']}" -> $ mdbook build -> ``` - -The latter case may be useful in situations where `mdbook` is invoked from a -script or CI, where it sometimes isn't possible to update the `book.toml` before -building. diff --git a/website/doc/en/src/format/configuration/general.md b/website/doc/en/src/format/configuration/general.md deleted file mode 100644 index a00247ec..00000000 --- a/website/doc/en/src/format/configuration/general.md +++ /dev/null @@ -1,110 +0,0 @@ -# General Configuration - -You can configure the parameters for your book in the ***book.toml*** file. - -Here is an example of what a ***book.toml*** file might look like: - -```toml -[book] -title = "Example book" -authors = ["John Doe"] -description = "The example book covers examples." - -[rust] -edition = "2018" - -[build] -build-dir = "my-example-book" -create-missing = false - -[preprocessor.index] - -[preprocessor.links] - -[output.html] -additional-css = ["custom.css"] - -[output.html.search] -limit-results = 15 -``` - -## Supported configuration options - -It is important to note that **any** relative path specified in the -configuration will always be taken relative from the root of the book where the -configuration file is located. - -### General metadata - -This is general information about your book. - -- **title:** The title of the book -- **authors:** The author(s) of the book -- **description:** A description for the book, which is added as meta - information in the html `<head>` of each page -- **src:** By default, the source directory is found in the directory named - `src` directly under the root folder. But this is configurable with the `src` - key in the configuration file. -- **language:** The main language of the book, which is used as a language attribute `<html lang="en">` for example. - -**book.toml** -```toml -[book] -title = "Example book" -authors = ["John Doe", "Jane Doe"] -description = "The example book covers examples." -src = "my-src" # the source files will be found in `root/my-src` instead of `root/src` -language = "en" -``` - -### Rust options - -Options for the Rust language, relevant to running tests and playground -integration. - -```toml -[rust] -edition = "2015" # the default edition for code blocks -``` - -- **edition**: Rust edition to use by default for the code snippets. Default - is "2015". Individual code blocks can be controlled with the `edition2015`, - `edition2018` or `edition2021` annotations, such as: - - ~~~text - ```rust,edition2015 - // This only works in 2015. - let try = true; - ``` - ~~~ - -### Build options - -This controls the build process of your book. - -```toml -[build] -build-dir = "book" # the directory where the output is placed -create-missing = true # whether or not to create missing pages -use-default-preprocessors = true # use the default preprocessors -``` - -- **build-dir:** The directory to put the rendered book in. By default this is - `book/` in the book's root directory. - This can overridden with the `--dest-dir` CLI option. -- **create-missing:** By default, any missing files specified in `SUMMARY.md` - will be created when the book is built (i.e. `create-missing = true`). If this - is `false` then the build process will instead exit with an error if any files - do not exist. -- **use-default-preprocessors:** Disable the default preprocessors of (`links` & - `index`) by setting this option to `false`. - - If you have the same, and/or other preprocessors declared via their table - of configuration, they will run instead. - - - For clarity, with no preprocessor configuration, the default `links` and - `index` will run. - - Setting `use-default-preprocessors = false` will disable these - default preprocessors from running. - - Adding `[preprocessor.links]`, for example, will ensure, regardless of - `use-default-preprocessors` that `links` it will run. diff --git a/website/doc/en/src/format/configuration/preprocessors.md b/website/doc/en/src/format/configuration/preprocessors.md deleted file mode 100644 index f44bdd4f..00000000 --- a/website/doc/en/src/format/configuration/preprocessors.md +++ /dev/null @@ -1,87 +0,0 @@ -# Configuring Preprocessors - -Preprocessors are extensions that can modify the raw Markdown source before it gets sent to the renderer. - -The following preprocessors are built-in and included by default: - -- `links`: Expands the `{{ #playground }}`, `{{ #include }}`, and `{{ #rustdoc_include }}` handlebars - helpers in a chapter to include the contents of a file. - See [Including files] for more. -- `index`: Convert all chapter files named `README.md` into `index.md`. That is - to say, all `README.md` would be rendered to an index file `index.html` in the - rendered book. - -The built-in preprocessors can be disabled with the [`build.use-default-preprocessors`] config option. - -The community has developed several preprocessors. -See the [Third Party Plugins] wiki page for a list of available preprocessors. - -For information on how to create a new preprocessor, see the [Preprocessors for Developers] chapter. - -[Including files]: ../mdbook.md#including-files -[`build.use-default-preprocessors`]: general.md#build-options -[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins -[Preprocessors for Developers]: ../../for_developers/preprocessors.md - -## Custom Preprocessor Configuration - -Preprocessors can be added by including a `preprocessor` table in `book.toml` with the name of the preprocessor. -For example, if you have a preprocessor called `mdbook-example`, then you can include it with: - -```toml -[preprocessor.example] -``` - -With this table, mdBook will execute the `mdbook-example` preprocessor. - -This table can include additional key-value pairs that are specific to the preprocessor. -For example, if our example prepocessor needed some extra configuration options: - -```toml -[preprocessor.example] -some-extra-feature = true -``` - -## Locking a Preprocessor dependency to a renderer - -You can explicitly specify that a preprocessor should run for a renderer by -binding the two together. - -```toml -[preprocessor.example] -renderers = ["html"] # example preprocessor only runs with the HTML renderer -``` - -## Provide Your Own Command - -By default when you add a `[preprocessor.foo]` table to your `book.toml` file, -`mdbook` will try to invoke the `mdbook-foo` executable. If you want to use a -different program name or pass in command-line arguments, this behaviour can -be overridden by adding a `command` field. - -```toml -[preprocessor.random] -command = "python random.py" -``` - -## Require A Certain Order - -The order in which preprocessors are run can be controlled with the `before` and `after` fields. -For example, suppose you want your `linenos` preprocessor to process lines that may have been `{{#include}}`d; then you want it to run after the built-in `links` preprocessor, which you can require using either the `before` or `after` field: - -```toml -[preprocessor.linenos] -after = [ "links" ] -``` - -or - -```toml -[preprocessor.links] -before = [ "linenos" ] -``` - -It would also be possible, though redundant, to specify both of the above in the same config file. - -Preprocessors having the same priority specified through `before` and `after` are sorted by name. -Any infinite loops will be detected and produce an error. diff --git a/website/doc/en/src/format/configuration/renderers.md b/website/doc/en/src/format/configuration/renderers.md deleted file mode 100644 index f1d5ee15..00000000 --- a/website/doc/en/src/format/configuration/renderers.md +++ /dev/null @@ -1,299 +0,0 @@ -# Configuring Renderers - -Renderers (also called "backends") are responsible for creating the output of the book. - -The following backends are built-in: - -* [`html`](#html-renderer-options) — This renders the book to HTML. - This is enabled by default if no other `[output]` tables are defined in `book.toml`. -* [`markdown`](#markdown-renderer) — This outputs the book as markdown after running the preprocessors. - This is useful for debugging preprocessors. - -The community has developed several backends. -See the [Third Party Plugins] wiki page for a list of available backends. - -For information on how to create a new backend, see the [Backends for Developers] chapter. - -[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins -[Backends for Developers]: ../../for_developers/backends.md - -## Output tables - -Backends can be added by including a `output` table in `book.toml` with the name of the backend. -For example, if you have a backend called `mdbook-wordcount`, then you can include it with: - -```toml -[output.wordcount] -``` - -With this table, mdBook will execute the `mdbook-wordcount` backend. - -This table can include additional key-value pairs that are specific to the backend. -For example, if our example backend needed some extra configuration options: - -```toml -[output.wordcount] -ignores = ["Example Chapter"] -``` - -If you define any `[output]` tables, then the `html` backend is not enabled by default. -If you want to keep the `html` backend running, then just include it in the `book.toml` file. -For example: - -```toml -[book] -title = "My Awesome Book" - -[output.wordcount] - -[output.html] -``` - -If more than one `output` table is included, this changes the behavior for the layout of the output directory. -If there is only one backend, then it places its output directly in the `book` directory (see [`build.build-dir`] to override this location). -If there is more than one backend, then each backend is placed in a separate directory underneath `book`. -For example, the above would have directories `book/html` and `book/wordcount`. - -[`build.build-dir`]: general.md#build-options - -### Custom backend commands - -By default when you add an `[output.foo]` table to your `book.toml` file, -`mdbook` will try to invoke the `mdbook-foo` executable. -If you want to use a different program name or pass in command-line arguments, -this behaviour can be overridden by adding a `command` field. - -```toml -[output.random] -command = "python random.py" -``` - -### Optional backends - -If you enable a backend that isn't installed, the default behavior is to throw an error. -This behavior can be changed by marking the backend as optional: - -```toml -[output.wordcount] -optional = true -``` - -This demotes the error to a warning. - - -## HTML renderer options - -The HTML renderer has a variety of options detailed below. -They should be specified in the `[output.html]` table of the `book.toml` file. - -```toml -# Example book.toml file with all output options. -[book] -title = "Example book" -authors = ["John Doe", "Jane Doe"] -description = "The example book covers examples." - -[output.html] -theme = "my-theme" -default-theme = "light" -preferred-dark-theme = "navy" -curly-quotes = true -mathjax-support = false -copy-fonts = true -additional-css = ["custom.css", "custom2.css"] -additional-js = ["custom.js"] -no-section-label = false -git-repository-url = "https://github.com/rust-lang/mdBook" -git-repository-icon = "fa-github" -edit-url-template = "https://github.com/rust-lang/mdBook/edit/master/guide/{path}" -site-url = "/example-book/" -cname = "myproject.rs" -input-404 = "not-found.md" -``` - -The following configuration options are available: - -- **theme:** mdBook comes with a default theme and all the resource files needed - for it. But if this option is set, mdBook will selectively overwrite the theme - files with the ones found in the specified folder. -- **default-theme:** The theme color scheme to select by default in the - 'Change Theme' dropdown. Defaults to `light`. -- **preferred-dark-theme:** The default dark theme. This theme will be used if - the browser requests the dark version of the site via the - ['prefers-color-scheme'](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme) - CSS media query. Defaults to `navy`. -- **curly-quotes:** Convert straight quotes to curly quotes, except for those - that occur in code blocks and code spans. Defaults to `false`. -- **mathjax-support:** Adds support for [MathJax](../mathjax.md). Defaults to - `false`. -- **copy-fonts:** Copies fonts.css and respective font files to the output directory and use them in the default theme. Defaults to `true`. -- **google-analytics:** This field has been deprecated and will be removed in a future release. - Use the `theme/head.hbs` file to add the appropriate Google Analytics code instead. -- **additional-css:** If you need to slightly change the appearance of your book - without overwriting the whole style, you can specify a set of stylesheets that - will be loaded after the default ones where you can surgically change the - style. -- **additional-js:** If you need to add some behaviour to your book without - removing the current behaviour, you can specify a set of JavaScript files that - will be loaded alongside the default one. -- **no-section-label:** mdBook by defaults adds numeric section labels in the table of - contents column. For example, "1.", "2.1". Set this option to true to disable - those labels. Defaults to `false`. -- **git-repository-url:** A url to the git repository for the book. If provided - an icon link will be output in the menu bar of the book. -- **git-repository-icon:** The FontAwesome icon class to use for the git - repository link. Defaults to `fa-github` which looks like <i class="fa fa-github"></i>. - If you are not using GitHub, another option to consider is `fa-code-fork` which looks like <i class="fa fa-code-fork"></i>. -- **edit-url-template:** Edit url template, when provided shows a - "Suggest an edit" button (which looks like <i class="fa fa-edit"></i>) for directly jumping to editing the currently - viewed page. For e.g. GitHub projects set this to - `https://github.com/<owner>/<repo>/edit/master/{path}` or for - Bitbucket projects set it to - `https://bitbucket.org/<owner>/<repo>/src/master/{path}?mode=edit` - where {path} will be replaced with the full path of the file in the - repository. -- **input-404:** The name of the markdown file used for missing files. - The corresponding output file will be the same, with the extension replaced with `html`. - Defaults to `404.md`. -- **site-url:** The url where the book will be hosted. This is required to ensure - navigation links and script/css imports in the 404 file work correctly, even when accessing - urls in subdirectories. Defaults to `/`. -- **cname:** The DNS subdomain or apex domain at which your book will be hosted. - This string will be written to a file named CNAME in the root of your site, as - required by GitHub Pages (see [*Managing a custom domain for your GitHub Pages - site*][custom domain]). - -[custom domain]: https://docs.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site - -### `[output.html.print]` - -The `[output.html.print]` table provides options for controlling the printable output. -By default, mdBook will include an icon on the top right of the book (which looks like <i class="fa fa-print"></i>) that will print the book as a single page. - -```toml -[output.html.print] -enable = true # include support for printable output -page-break = true # insert page-break after each chapter -``` - -- **enable:** Enable print support. When `false`, all print support will not be - rendered. Defaults to `true`. -- **page-break** Insert page breaks between chapters. Defaults to `true`. - -### `[output.html.fold]` - -The `[output.html.fold]` table provides options for controlling folding of the chapter listing in the navigation sidebar. - -```toml -[output.html.fold] -enable = false # whether or not to enable section folding -level = 0 # the depth to start folding -``` - -- **enable:** Enable section-folding. When off, all folds are open. - Defaults to `false`. -- **level:** The higher the more folded regions are open. When level is 0, all - folds are closed. Defaults to `0`. - -### `[output.html.playground]` - -The `[output.html.playground]` table provides options for controlling Rust sample code blocks, and their integration with the [Rust Playground]. - -[Rust Playground]: https://play.rust-lang.org/ - -```toml -[output.html.playground] -editable = false # allows editing the source code -copyable = true # include the copy button for copying code snippets -copy-js = true # includes the JavaScript for the code editor -line-numbers = false # displays line numbers for editable code -runnable = true # displays a run button for rust code -``` - -- **editable:** Allow editing the source code. Defaults to `false`. -- **copyable:** Display the copy button on code snippets. Defaults to `true`. -- **copy-js:** Copy JavaScript files for the editor to the output directory. - Defaults to `true`. -- **line-numbers** Display line numbers on editable sections of code. Requires both `editable` and `copy-js` to be `true`. Defaults to `false`. -- **runnable** Displays a run button for rust code snippets. Changing this to `false` will disable the run in playground feature globally. Defaults to `true`. - -[Ace]: https://ace.c9.io/ - -### `[output.html.search]` - -The `[output.html.search]` table provides options for controlling the built-in text [search]. -mdBook must be compiled with the `search` feature enabled (on by default). - -[search]: ../../guide/reading.md#search - -```toml -[output.html.search] -enable = true # enables the search feature -limit-results = 30 # maximum number of search results -teaser-word-count = 30 # number of words used for a search result teaser -use-boolean-and = true # multiple search terms must all match -boost-title = 2 # ranking boost factor for matches in headers -boost-hierarchy = 1 # ranking boost factor for matches in page names -boost-paragraph = 1 # ranking boost factor for matches in text -expand = true # partial words will match longer terms -heading-split-level = 3 # link results to heading levels -copy-js = true # include Javascript code for search -``` - -- **enable:** Enables the search feature. Defaults to `true`. -- **limit-results:** The maximum number of search results. Defaults to `30`. -- **teaser-word-count:** The number of words used for a search result teaser. - Defaults to `30`. -- **use-boolean-and:** Define the logical link between multiple search words. If - true, all search words must appear in each result. Defaults to `false`. -- **boost-title:** Boost factor for the search result score if a search word - appears in the header. Defaults to `2`. -- **boost-hierarchy:** Boost factor for the search result score if a search word - appears in the hierarchy. The hierarchy contains all titles of the parent - documents and all parent headings. Defaults to `1`. -- **boost-paragraph:** Boost factor for the search result score if a search word - appears in the text. Defaults to `1`. -- **expand:** True if search should match longer results e.g. search `micro` - should match `microwave`. Defaults to `true`. -- **heading-split-level:** Search results will link to a section of the document - which contains the result. Documents are split into sections by headings this - level or less. Defaults to `3`. (`### This is a level 3 heading`) -- **copy-js:** Copy JavaScript files for the search implementation to the output - directory. Defaults to `true`. - -### `[output.html.redirect]` - -The `[output.html.redirect]` table provides a way to add redirects. -This is useful when you move, rename, or remove a page to ensure that links to the old URL will go to the new location. - -```toml -[output.html.redirect] -"/appendices/bibliography.html" = "https://rustc-dev-guide.rust-lang.org/appendix/bibliography.html" -"/other-installation-methods.html" = "../infra/other-installation-methods.html" -``` - -The table contains key-value pairs where the key is where the redirect file needs to be created, as an absolute path from the build directory, (e.g. `/appendices/bibliography.html`). -The value can be any valid URI the browser should navigate to (e.g. `https://rust-lang.org/`, `/overview.html`, or `../bibliography.html`). - -This will generate an HTML page which will automatically redirect to the given location. -Note that the source location does not support `#` anchor redirects. - -## Markdown Renderer - -The Markdown renderer will run preprocessors and then output the resulting -Markdown. This is mostly useful for debugging preprocessors, especially in -conjunction with `mdbook test` to see the Markdown that `mdbook` is passing -to `rustdoc`. - -The Markdown renderer is included with `mdbook` but disabled by default. -Enable it by adding an empty table to your `book.toml` as follows: - -```toml -[output.markdown] -``` - -There are no configuration options for the Markdown renderer at this time; -only whether it is enabled or disabled. - -See [the preprocessors documentation](preprocessors.md) for how to -specify which preprocessors should run before the Markdown renderer. diff --git a/website/doc/en/src/format/example.rs b/website/doc/en/src/format/example.rs deleted file mode 100644 index a467cac1..00000000 --- a/website/doc/en/src/format/example.rs +++ /dev/null @@ -1,6 +0,0 @@ -fn main() { - println!("Hello World!"); -# -# // You can even hide lines! :D -# println!("I am hidden! Expand the code snippet to see me"); -} diff --git a/website/doc/en/src/format/images/rust-logo-blk.svg b/website/doc/en/src/format/images/rust-logo-blk.svg deleted file mode 100644 index 1a6c762d..00000000 --- a/website/doc/en/src/format/images/rust-logo-blk.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="144" width="144" xmlns="http://www.w3.org/2000/svg"><path d="m71.05 23.68c-26.06 0-47.27 21.22-47.27 47.27s21.22 47.27 47.27 47.27 47.27-21.22 47.27-47.27-21.22-47.27-47.27-47.27zm-.07 4.2a3.1 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm7.12 5.12a38.27 38.27 0 0 1 26.2 18.66l-3.67 8.28c-.63 1.43.02 3.11 1.44 3.75l7.06 3.13a38.27 38.27 0 0 1 .08 6.64h-3.93c-.39 0-.55.26-.55.64v1.8c0 4.24-2.39 5.17-4.49 5.4-2 .23-4.21-.84-4.49-2.06-1.18-6.63-3.14-8.04-6.24-10.49 3.85-2.44 7.85-6.05 7.85-10.87 0-5.21-3.57-8.49-6-10.1-3.42-2.25-7.2-2.7-8.22-2.7h-40.6a38.27 38.27 0 0 1 21.41-12.08l4.79 5.02c1.08 1.13 2.87 1.18 4 .09zm-44.2 23.02a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm74.15.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm-68.29.5h5.42v24.44h-10.94a38.27 38.27 0 0 1 -1.24-14.61l6.7-2.98c1.43-.64 2.08-2.31 1.44-3.74zm22.62.26h12.91c.67 0 4.71.77 4.71 3.8 0 2.51-3.1 3.41-5.65 3.41h-11.98zm0 17.56h9.89c.9 0 4.83.26 6.08 5.28.39 1.54 1.26 6.56 1.85 8.17.59 1.8 2.98 5.4 5.53 5.4h16.14a38.27 38.27 0 0 1 -3.54 4.1l-6.57-1.41c-1.53-.33-3.04.65-3.37 2.18l-1.56 7.28a38.27 38.27 0 0 1 -31.91-.15l-1.56-7.28c-.33-1.53-1.83-2.51-3.36-2.18l-6.43 1.38a38.27 38.27 0 0 1 -3.32-3.92h31.27c.35 0 .59-.06.59-.39v-11.06c0-.32-.24-.39-.59-.39h-9.15zm-14.43 25.33a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm46.05.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11z"/><path d="m115.68 70.95a44.63 44.63 0 0 1 -44.63 44.63 44.63 44.63 0 0 1 -44.63-44.63 44.63 44.63 0 0 1 44.63-44.63 44.63 44.63 0 0 1 44.63 44.63zm-.84-4.31 6.96 4.31-6.96 4.31 5.98 5.59-7.66 2.87 4.78 6.65-8.09 1.32 3.4 7.46-8.19-.29 1.88 7.98-7.98-1.88.29 8.19-7.46-3.4-1.32 8.09-6.65-4.78-2.87 7.66-5.59-5.98-4.31 6.96-4.31-6.96-5.59 5.98-2.87-7.66-6.65 4.78-1.32-8.09-7.46 3.4.29-8.19-7.98 1.88 1.88-7.98-8.19.29 3.4-7.46-8.09-1.32 4.78-6.65-7.66-2.87 5.98-5.59-6.96-4.31 6.96-4.31-5.98-5.59 7.66-2.87-4.78-6.65 8.09-1.32-3.4-7.46 8.19.29-1.88-7.98 7.98 1.88-.29-8.19 7.46 3.4 1.32-8.09 6.65 4.78 2.87-7.66 5.59 5.98 4.31-6.96 4.31 6.96 5.59-5.98 2.87 7.66 6.65-4.78 1.32 8.09 7.46-3.4-.29 8.19 7.98-1.88-1.88 7.98 8.19-.29-3.4 7.46 8.09 1.32-4.78 6.65 7.66 2.87z" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/></svg> \ No newline at end of file diff --git a/website/doc/en/src/format/markdown.md b/website/doc/en/src/format/markdown.md deleted file mode 100644 index 963a1538..00000000 --- a/website/doc/en/src/format/markdown.md +++ /dev/null @@ -1,222 +0,0 @@ -# Markdown - -mdBook's [parser](https://github.com/raphlinus/pulldown-cmark) adheres to the [CommonMark](https://commonmark.org/) specification with some extensions described below. -You can take a quick [tutorial](https://commonmark.org/help/tutorial/), -or [try out](https://spec.commonmark.org/dingus/) CommonMark in real time. A complete Markdown overview is out of scope for -this documentation, but below is a high level overview of some of the basics. For a more in-depth experience, check out the -[Markdown Guide](https://www.markdownguide.org). - -## Text and Paragraphs - -Text is rendered relatively predictably: - -```markdown -Here is a line of text. - -This is a new line. -``` - -Will look like you might expect: - -Here is a line of text. - -This is a new line. - -## Headings - -Headings use the `#` marker and should be on a line by themselves. More `#` mean smaller headings: - -```markdown -### A heading - -Some text. - -#### A smaller heading - -More text. -``` - -### A heading - -Some text. - -#### A smaller heading - -More text. - -## Lists - -Lists can be unordered or ordered. Ordered lists will order automatically: - -```markdown -* milk -* eggs -* butter - -1. carrots -1. celery -1. radishes -``` - -* milk -* eggs -* butter - -1. carrots -1. celery -1. radishes - -## Links - -Linking to a URL or local file is easy: - -```markdown -Use [mdBook](https://github.com/rust-lang/mdBook). - -Read about [mdBook](mdBook.md). - -A bare url: <https://www.rust-lang.org>. -``` - -Use [mdBook](https://github.com/rust-lang/mdBook). - -Read about [mdBook](mdBook.md). - -A bare url: <https://www.rust-lang.org>. - ----- - -Relative links that end with `.md` will be converted to the `.html` extension. -It is recommended to use `.md` links when possible. -This is useful when viewing the Markdown file outside of mdBook, for example on GitHub or GitLab which render Markdown automatically. - -Links to `README.md` will be converted to `index.html`. -This is done since some services like GitHub render README files automatically, but web servers typically expect the root file to be called `index.html`. - -You can link to individual headings with `#` fragments. -For example, `mdbook.md#text-and-paragraphs` would link to the [Text and Paragraphs](#text-and-paragraphs) section above. -The ID is created by transforming the heading such as converting to lowercase and replacing spaces with dashes. -You can click on any heading and look at the URL in your browser to see what the fragment looks like. - -## Images - -Including images is simply a matter of including a link to them, much like in the _Links_ section above. The following markdown -includes the Rust logo SVG image found in the `images` directory at the same level as this file: - -```markdown -![The Rust Logo](images/rust-logo-blk.svg) -``` - -Produces the following HTML when built with mdBook: - -```html -<p><img src="images/rust-logo-blk.svg" alt="The Rust Logo" /></p> -``` - -Which, of course displays the image like so: - -![The Rust Logo](images/rust-logo-blk.svg) - -## Extensions - -mdBook has several extensions beyond the standard CommonMark specification. - -### Strikethrough - -Text may be rendered with a horizontal line through the center by wrapping the -text with two tilde characters on each side: - -```text -An example of ~~strikethrough text~~. -``` - -This example will render as: - -> An example of ~~strikethrough text~~. - -This follows the [GitHub Strikethrough extension][strikethrough]. - -### Footnotes - -A footnote generates a small numbered link in the text which when clicked -takes the reader to the footnote text at the bottom of the item. The footnote -label is written similarly to a link reference with a caret at the front. The -footnote text is written like a link reference definition, with the text -following the label. Example: - -```text -This is an example of a footnote[^note]. - -[^note]: This text is the contents of the footnote, which will be rendered - towards the bottom. -``` - -This example will render as: - -> This is an example of a footnote[^note]. -> -> [^note]: This text is the contents of the footnote, which will be rendered -> towards the bottom. - -The footnotes are automatically numbered based on the order the footnotes are -written. - -### Tables - -Tables can be written using pipes and dashes to draw the rows and columns of -the table. These will be translated to HTML table matching the shape. Example: - -```text -| Header1 | Header2 | -|---------|---------| -| abc | def | -``` - -This example will render similarly to this: - -| Header1 | Header2 | -|---------|---------| -| abc | def | - -See the specification for the [GitHub Tables extension][tables] for more -details on the exact syntax supported. - -### Task lists - -Task lists can be used as a checklist of items that have been completed. -Example: - -```md -- [x] Complete task -- [ ] Incomplete task -``` - -This will render as: - -> - [x] Complete task -> - [ ] Incomplete task - -See the specification for the [task list extension] for more details. - -### Smart punctuation - -Some ASCII punctuation sequences will be automatically turned into fancy Unicode -characters: - -| ASCII sequence | Unicode | -|----------------|---------| -| `--` | – | -| `---` | — | -| `...` | … | -| `"` | “ or ”, depending on context | -| `'` | ‘ or ’, depending on context | - -So, no need to manually enter those Unicode characters! - -This feature is disabled by default. -To enable it, see the [`output.html.curly-quotes`] config option. - -[strikethrough]: https://github.github.com/gfm/#strikethrough-extension- -[tables]: https://github.github.com/gfm/#tables-extension- -[task list extension]: https://github.github.com/gfm/#task-list-items-extension- -[`output.html.curly-quotes`]: configuration/renderers.md#html-renderer-options diff --git a/website/doc/en/src/format/mathjax.md b/website/doc/en/src/format/mathjax.md deleted file mode 100644 index 3dd79215..00000000 --- a/website/doc/en/src/format/mathjax.md +++ /dev/null @@ -1,43 +0,0 @@ -# MathJax Support - -mdBook has optional support for math equations through -[MathJax](https://www.mathjax.org/). - -To enable MathJax, you need to add the `mathjax-support` key to your `book.toml` -under the `output.html` section. - -```toml -[output.html] -mathjax-support = true -``` - ->**Note:** The usual delimiters MathJax uses are not yet supported. You can't -currently use `$$ ... $$` as delimiters and the `\[ ... \]` delimiters need an -extra backslash to work. Hopefully this limitation will be lifted soon. - ->**Note:** When you use double backslashes in MathJax blocks (for example in -> commands such as `\begin{cases} \frac 1 2 \\ \frac 3 4 \end{cases}`) you need -> to add _two extra_ backslashes (e.g., `\begin{cases} \frac 1 2 \\\\ \frac 3 4 -> \end{cases}`). - - -### Inline equations -Inline equations are delimited by `\\(` and `\\)`. So for example, to render the -following inline equation \\( \int x dx = \frac{x^2}{2} + C \\) you would write -the following: -``` -\\( \int x dx = \frac{x^2}{2} + C \\) -``` - -### Block equations -Block equations are delimited by `\\[` and `\\]`. To render the following -equation - -\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] - - -you would write: - -```bash -\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] -``` diff --git a/website/doc/en/src/format/mdbook.md b/website/doc/en/src/format/mdbook.md deleted file mode 100644 index 62e89843..00000000 --- a/website/doc/en/src/format/mdbook.md +++ /dev/null @@ -1,276 +0,0 @@ -# mdBook-specific features - -## Hiding code lines - -There is a feature in mdBook that lets you hide code lines by prepending them -with a `#` [like you would with Rustdoc][rustdoc-hide]. -This currently only works with Rust language code blocks. - -[rustdoc-hide]: https://doc.rust-lang.org/stable/rustdoc/documentation-tests.html#hiding-portions-of-the-example - -```bash -# fn main() { - let x = 5; - let y = 6; - - println!("{}", x + y); -# } -``` - -Will render as - -```rust -# fn main() { - let x = 5; - let y = 6; - - println!("{}", x + y); -# } -``` - -The code block has an eyeball icon (<i class="fa fa-eye"></i>) which will toggle the visibility of the hidden lines. - -## Rust Playground - -Rust language code blocks will automatically get a play button (<i class="fa fa-play"></i>) which will execute the code and display the output just below the code block. -This works by sending the code to the [Rust Playground]. - -```rust -println!("Hello, World!"); -``` - -If there is no `main` function, then the code is automatically wrapped inside one. - -If you wish to disable the play button for a code block, you can include the `noplayground` option on the code block like this: - -~~~markdown -```rust,noplayground -let mut name = String::new(); -std::io::stdin().read_line(&mut name).expect("failed to read line"); -println!("Hello {}!", name); -``` -~~~ - -Or, if you wish to disable the play button for all code blocks in your book, you can write the config to the `book.toml` like this. - -```toml -[output.html.playground] -runnable = false -``` - -## Rust code block attributes - -Additional attributes can be included in Rust code blocks with comma, space, or tab-separated terms just after the language term. For example: - -~~~markdown -```rust,ignore -# This example won't be tested. -panic!("oops!"); -``` -~~~ - -These are particularly important when using [`mdbook test`] to test Rust examples. -These use the same attributes as [rustdoc attributes], with a few additions: - -* `editable` — Enables the [editor]. -* `noplayground` — Removes the play button, but will still be tested. -* `mdbook-runnable` — Forces the play button to be displayed. - This is intended to be combined with the `ignore` attribute for examples that should not be tested, but you want to allow the reader to run. -* `ignore` — Will not be tested and no play button is shown, but it is still highlighted as Rust syntax. -* `should_panic` — When executed, it should produce a panic. -* `no_run` — The code is compiled when tested, but it is not run. - The play button is also not shown. -* `compile_fail` — The code should fail to compile. -* `edition2015`, `edition2018`, `edition2021` — Forces the use of a specific Rust edition. - See [`rust.edition`] to set this globally. - -[`mdbook test`]: ../cli/test.md -[rustdoc attributes]: https://doc.rust-lang.org/rustdoc/documentation-tests.html#attributes -[editor]: theme/editor.md -[`rust.edition`]: configuration/general.md#rust-options - -## Including files - -With the following syntax, you can include files into your book: - -```hbs -\{{#include file.rs}} -``` - -The path to the file has to be relative from the current source file. - -mdBook will interpret included files as Markdown. Since the include command -is usually used for inserting code snippets and examples, you will often -wrap the command with ```` ``` ```` to display the file contents without -interpreting them. - -````hbs -``` -\{{#include file.rs}} -``` -```` - -## Including portions of a file -Often you only need a specific part of the file, e.g. relevant lines for an -example. We support four different modes of partial includes: - -```hbs -\{{#include file.rs:2}} -\{{#include file.rs::10}} -\{{#include file.rs:2:}} -\{{#include file.rs:2:10}} -``` - -The first command only includes the second line from file `file.rs`. The second -command includes all lines up to line 10, i.e. the lines from 11 till the end of -the file are omitted. The third command includes all lines from line 2, i.e. the -first line is omitted. The last command includes the excerpt of `file.rs` -consisting of lines 2 to 10. - -To avoid breaking your book when modifying included files, you can also -include a specific section using anchors instead of line numbers. -An anchor is a pair of matching lines. The line beginning an anchor must -match the regex `ANCHOR:\s*[\w_-]+` and similarly the ending line must match -the regex `ANCHOR_END:\s*[\w_-]+`. This allows you to put anchors in -any kind of commented line. - -Consider the following file to include: -```rs -/* ANCHOR: all */ - -// ANCHOR: component -struct Paddle { - hello: f32, -} -// ANCHOR_END: component - -////////// ANCHOR: system -impl System for MySystem { ... } -////////// ANCHOR_END: system - -/* ANCHOR_END: all */ -``` - -Then in the book, all you have to do is: -````hbs -Here is a component: -```rust,no_run,noplayground -\{{#include file.rs:component}} -``` - -Here is a system: -```rust,no_run,noplayground -\{{#include file.rs:system}} -``` - -This is the full file. -```rust,no_run,noplayground -\{{#include file.rs:all}} -``` -```` - -Lines containing anchor patterns inside the included anchor are ignored. - -## Including a file but initially hiding all except specified lines - -The `rustdoc_include` helper is for including code from external Rust files that contain complete -examples, but only initially showing particular lines specified with line numbers or anchors in the -same way as with `include`. - -The lines not in the line number range or between the anchors will still be included, but they will -be prefaced with `#`. This way, a reader can expand the snippet to see the complete example, and -Rustdoc will use the complete example when you run `mdbook test`. - -For example, consider a file named `file.rs` that contains this Rust program: - -```rust -fn main() { - let x = add_one(2); - assert_eq!(x, 3); -} - -fn add_one(num: i32) -> i32 { - num + 1 -} -``` - -We can include a snippet that initially shows only line 2 by using this syntax: - -````hbs -To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: - -```rust -\{{#rustdoc_include file.rs:2}} -``` -```` - -This would have the same effect as if we had manually inserted the code and hidden all but line 2 -using `#`: - -````hbs -To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: - -```rust -# fn main() { - let x = add_one(2); -# assert_eq!(x, 3); -# } -# -# fn add_one(num: i32) -> i32 { -# num + 1 -# } -``` -```` - -That is, it looks like this (click the "expand" icon to see the rest of the file): - -```rust -# fn main() { - let x = add_one(2); -# assert_eq!(x, 3); -# } -# -# fn add_one(num: i32) -> i32 { -# num + 1 -# } -``` - -## Inserting runnable Rust files - -With the following syntax, you can insert runnable Rust files into your book: - -```hbs -\{{#playground file.rs}} -``` - -The path to the Rust file has to be relative from the current source file. - -When play is clicked, the code snippet will be sent to the [Rust Playground] to be -compiled and run. The result is sent back and displayed directly underneath the -code. - -Here is what a rendered code snippet looks like: - -{{#playground example.rs}} - -Any additional values passed after the filename will be included as attributes of the code block. -For example `\{{#playground example.rs editable}}` will create the code block like the following: - -~~~markdown -```rust,editable -# Contents of example.rs here. -``` -~~~ - -And the `editable` attribute will enable the [editor] as described at [Rust code block attributes](#rust-code-block-attributes). - -[Rust Playground]: https://play.rust-lang.org/ - -## Controlling page \<title\> - -A chapter can set a \<title\> that is different from its entry in the table of -contents (sidebar) by including a `\{{#title ...}}` near the top of the page. - -```hbs -\{{#title My Title}} -``` diff --git a/website/doc/en/src/format/summary.md b/website/doc/en/src/format/summary.md deleted file mode 100644 index 0e138529..00000000 --- a/website/doc/en/src/format/summary.md +++ /dev/null @@ -1,99 +0,0 @@ -# SUMMARY.md - -The summary file is used by mdBook to know what chapters to include, in what -order they should appear, what their hierarchy is and where the source files -are. Without this file, there is no book. - -This markdown file must be named `SUMMARY.md`. Its formatting -is very strict and must follow the structure outlined below to allow for easy -parsing. Any element not specified below, be it formatting or textual, is likely -to be ignored at best, or may cause an error when attempting to build the book. - -### Structure - -1. ***Title*** - While optional, it's common practice to begin with a title, generally <code - class="language-markdown"># Summary</code>. This is ignored by the parser however, and - can be omitted. - ```markdown - # Summary - ``` - -1. ***Prefix Chapter*** - Before the main numbered chapters, prefix chapters can be added - that will not be numbered. This is useful for forewords, - introductions, etc. There are, however, some constraints. Prefix chapters cannot be - nested; they should all be on the root level. And you cannot add - prefix chapters once you have added numbered chapters. - ```markdown - [A Prefix Chapter](relative/path/to/markdown.md) - - - [First Chapter](relative/path/to/markdown2.md) - ``` - -1. ***Part Title*** - Headers can be used as a title for the following numbered - chapters. This can be used to logically separate different sections - of the book. The title is rendered as unclickable text. - Titles are optional, and the numbered chapters can be broken into as many - parts as desired. - ```markdown - # My Part Title - - - [First Chapter](relative/path/to/markdown.md) - ``` - -1. ***Numbered Chapter*** - Numbered chapters outline the main content of the book - and can be nested, resulting in a nice hierarchy - (chapters, sub-chapters, etc.). - ```markdown - # Title of Part - - - [First Chapter](relative/path/to/markdown.md) - - [Second Chapter](relative/path/to/markdown2.md) - - [Sub Chapter](relative/path/to/markdown3.md) - - # Title of Another Part - - - [Another Chapter](relative/path/to/markdown4.md) - ``` - Numbered chapters can be denoted with either `-` or `*` (do not mix delimiters). - -1. ***Suffix Chapter*** - Like prefix chapters, suffix chapters are unnumbered, but they come after - numbered chapters. - ```markdown - - [Last Chapter](relative/path/to/markdown.md) - - [Title of Suffix Chapter](relative/path/to/markdown2.md) - ``` - -1. ***Draft chapters*** - Draft chapters are chapters without a file and thus content. - The purpose of a draft chapter is to signal future chapters still to be written. - Or when still laying out the structure of the book to avoid creating the files - while you are still changing the structure of the book a lot. - Draft chapters will be rendered in the HTML renderer as disabled links in the table - of contents, as you can see for the next chapter in the table of contents on the left. - Draft chapters are written like normal chapters but without writing the path to the file. - ```markdown - - [Draft Chapter]() - ``` - -1. ***Separators*** - Separators can be added before, in between, and after any other element. They result - in an HTML rendered line in the built table of contents. A separator is - a line containing exclusively dashes and at least three of them: `---`. - ```markdown - # My Part Title - - [A Prefix Chapter](relative/path/to/markdown.md) - - --- - - - [First Chapter](relative/path/to/markdown2.md) - ``` - - -### Example - -Below is the markdown source for the `SUMMARY.md` for this guide, with the resulting table -of contents as rendered to the left. - -```markdown -{{#include ../SUMMARY.md}} -``` diff --git a/website/doc/en/src/format/theme/README.md b/website/doc/en/src/format/theme/README.md deleted file mode 100644 index 4a776e60..00000000 --- a/website/doc/en/src/format/theme/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Theme - -The default renderer uses a [handlebars](http://handlebarsjs.com/) template to -render your markdown files and comes with a default theme included in the mdBook -binary. - -The theme is totally customizable, you can selectively replace every file from -the theme by your own by adding a `theme` directory next to `src` folder in your -project root. Create a new file with the name of the file you want to override -and now that file will be used instead of the default file. - -Here are the files you can override: - -- **_index.hbs_** is the handlebars template. -- **_head.hbs_** is appended to the HTML `<head>` section. -- **_header.hbs_** content is appended on top of every book page. -- **_css/_** contains the CSS files for styling the book. - - **_css/chrome.css_** is for UI elements. - - **_css/general.css_** is the base styles. - - **_css/print.css_** is the style for printer output. - - **_css/variables.css_** contains variables used in other CSS files. -- **_book.js_** is mostly used to add client side functionality, like hiding / - un-hiding the sidebar, changing the theme, ... -- **_highlight.js_** is the JavaScript that is used to highlight code snippets, - you should not need to modify this. -- **_highlight.css_** is the theme used for the code highlighting. -- **_favicon.svg_** and **_favicon.png_** the favicon that will be used. The SVG - version is used by [newer browsers]. - -Generally, when you want to tweak the theme, you don't need to override all the -files. If you only need changes in the stylesheet, there is no point in -overriding all the other files. Because custom files take precedence over -built-in ones, they will not get updated with new fixes / features. - -**Note:** When you override a file, it is possible that you break some -functionality. Therefore I recommend to use the file from the default theme as -template and only add / modify what you need. You can copy the default theme -into your source directory automatically by using `mdbook init --theme` and just -remove the files you don't want to override. - -`mdbook init --theme` will not create every file listed above. -Some files, such as `head.hbs`, do not have built-in equivalents. -Just create the file if you need it. - -If you completely replace all built-in themes, be sure to also set -[`output.html.preferred-dark-theme`] in the config, which defaults to the -built-in `navy` theme. - -[`output.html.preferred-dark-theme`]: ../configuration/renderers.md#html-renderer-options -[newer browsers]: https://caniuse.com/#feat=link-icon-svg diff --git a/website/doc/en/src/format/theme/editor.md b/website/doc/en/src/format/theme/editor.md deleted file mode 100644 index 9294dd44..00000000 --- a/website/doc/en/src/format/theme/editor.md +++ /dev/null @@ -1,48 +0,0 @@ -# Editor - -In addition to providing runnable code playgrounds, mdBook optionally allows them -to be editable. In order to enable editable code blocks, the following needs to -be added to the ***book.toml***: - -```toml -[output.html.playground] -editable = true -``` - -To make a specific block available for editing, the attribute `editable` needs -to be added to it: - -~~~markdown -```rust,editable -fn main() { - let number = 5; - print!("{}", number); -} -``` -~~~ - -The above will result in this editable playground: - -```rust,editable -fn main() { - let number = 5; - print!("{}", number); -} -``` - -Note the new `Undo Changes` button in the editable playgrounds. - -## Customizing the Editor - -By default, the editor is the [Ace](https://ace.c9.io/) editor, but, if desired, -the functionality may be overridden by providing a different folder: - -```toml -[output.html.playground] -editable = true -editor = "/path/to/editor" -``` - -Note that for the editor changes to function correctly, the `book.js` inside of -the `theme` folder will need to be overridden as it has some couplings with the -default Ace editor. diff --git a/website/doc/en/src/format/theme/index-hbs.md b/website/doc/en/src/format/theme/index-hbs.md deleted file mode 100644 index e5331dcc..00000000 --- a/website/doc/en/src/format/theme/index-hbs.md +++ /dev/null @@ -1,101 +0,0 @@ -# index.hbs - -`index.hbs` is the handlebars template that is used to render the book. The -markdown files are processed to html and then injected in that template. - -If you want to change the layout or style of your book, chances are that you -will have to modify this template a little bit. Here is what you need to know. - -## Data - -A lot of data is exposed to the handlebars template with the "context". In the -handlebars template you can access this information by using - -```handlebars -{{name_of_property}} -``` - -Here is a list of the properties that are exposed: - -- ***language*** Language of the book in the form `en`, as specified in `book.toml` (if not specified, defaults to `en`). To use in <code - class="language-html">\<html lang="{{ language }}"></code> for example. -- ***title*** Title used for the current page. This is identical to `{{ chapter_title }} - {{ book_title }}` unless `book_title` is not set in which case it just defaults to the `chapter_title`. -- ***book_title*** Title of the book, as specified in `book.toml` -- ***chapter_title*** Title of the current chapter, as listed in `SUMMARY.md` - -- ***path*** Relative path to the original markdown file from the source - directory -- ***content*** This is the rendered markdown. -- ***path_to_root*** This is a path containing exclusively `../`'s that points - to the root of the book from the current file. Since the original directory - structure is maintained, it is useful to prepend relative links with this - `path_to_root`. - -- ***chapters*** Is an array of dictionaries of the form - ```json - {"section": "1.2.1", "name": "name of this chapter", "path": "dir/markdown.md"} - ``` - containing all the chapters of the book. It is used for example to construct - the table of contents (sidebar). - -## Handlebars Helpers - -In addition to the properties you can access, there are some handlebars helpers -at your disposal. - -### 1. toc - -The toc helper is used like this - -```handlebars -{{#toc}}{{/toc}} -``` - -and outputs something that looks like this, depending on the structure of your -book - -```html -<ul class="chapter"> - <li><a href="link/to/file.html">Some chapter</a></li> - <li> - <ul class="section"> - <li><a href="link/to/other_file.html">Some other Chapter</a></li> - </ul> - </li> -</ul> -``` - -If you would like to make a toc with another structure, you have access to the -chapters property containing all the data. The only limitation at the moment -is that you would have to do it with JavaScript instead of with a handlebars -helper. - -```html -<script> -var chapters = {{chapters}}; -// Processing here -</script> -``` - -### 2. previous / next - -The previous and next helpers expose a `link` and `name` property to the -previous and next chapters. - -They are used like this - -```handlebars -{{#previous}} - <a href="{{link}}" class="nav-chapters previous"> - <i class="fa fa-angle-left"></i> - </a> -{{/previous}} -``` - -The inner html will only be rendered if the previous / next chapter exists. -Of course the inner html can be changed to your liking. - ------- - -*If you would like other properties or helpers exposed, please [create a new -issue](https://github.com/rust-lang/mdBook/issues)* diff --git a/website/doc/en/src/format/theme/syntax-highlighting.md b/website/doc/en/src/format/theme/syntax-highlighting.md deleted file mode 100644 index f57540f0..00000000 --- a/website/doc/en/src/format/theme/syntax-highlighting.md +++ /dev/null @@ -1,121 +0,0 @@ -# Syntax Highlighting - -mdBook uses [Highlight.js](https://highlightjs.org) with a custom theme -for syntax highlighting. - -Automatic language detection has been turned off, so you will probably want to -specify the programming language you use like this: - -~~~markdown -```rust -fn main() { - // Some code -} -``` -~~~ - -## Supported languages - -These languages are supported by default, but you can add more by supplying -your own `highlight.js` file: - -- apache -- armasm -- bash -- c -- coffeescript -- cpp -- csharp -- css -- d -- diff -- go -- handlebars -- haskell -- http -- ini -- java -- javascript -- json -- julia -- kotlin -- less -- lua -- makefile -- markdown -- nginx -- objectivec -- perl -- php -- plaintext -- properties -- python -- r -- ruby -- rust -- scala -- scss -- shell -- sql -- swift -- typescript -- x86asm -- xml -- yaml - -## Custom theme -Like the rest of the theme, the files used for syntax highlighting can be -overridden with your own. - -- ***highlight.js*** normally you shouldn't have to overwrite this file, unless - you want to use a more recent version. -- ***highlight.css*** theme used by highlight.js for syntax highlighting. - -If you want to use another theme for `highlight.js` download it from their -website, or make it yourself, rename it to `highlight.css` and put it in -the `theme` folder of your book. - -Now your theme will be used instead of the default theme. - -## Hiding code lines - -There is a feature in mdBook that lets you hide code lines by prepending them -with a `#`. - - -```bash -# fn main() { - let x = 5; - let y = 6; - - println!("{}", x + y); -# } -``` - -Will render as - -```rust -# fn main() { - let x = 5; - let y = 7; - - println!("{}", x + y); -# } -``` - -**At the moment, this only works for code examples that are annotated with -`rust`. Because it would collide with semantics of some programming languages. -In the future, we want to make this configurable through the `book.toml` so that -everyone can benefit from it.** - - -## Improve default theme - -If you think the default theme doesn't look quite right for a specific language, -or could be improved, feel free to [submit a new -issue](https://github.com/rust-lang/mdBook/issues) explaining what you -have in mind and I will take a look at it. - -You could also create a pull-request with the proposed improvements. - -Overall the theme should be light and sober, without too many flashy colors. diff --git a/website/doc/en/src/guide/README.md b/website/doc/en/src/guide/README.md deleted file mode 100644 index 90deb10e..00000000 --- a/website/doc/en/src/guide/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# User Guide - -This user guide provides an introduction to basic concepts of using mdBook. - -- [Installation](installation.md) -- [Reading Books](reading.md) -- [Creating a Book](creating.md) diff --git a/website/doc/en/src/guide/creating.md b/website/doc/en/src/guide/creating.md deleted file mode 100644 index f68a8c60..00000000 --- a/website/doc/en/src/guide/creating.md +++ /dev/null @@ -1,109 +0,0 @@ -# Creating a Book - -Once you have the `mdbook` CLI tool installed, you can use it to create and render a book. - -## Initializing a book - -The `mdbook init` command will create a new directory containing an empty book for you to get started. -Give it the name of the directory that you want to create: - -```sh -mdbook init my-first-book -``` - -It will ask a few questions before generating the book. -After answering the questions, you can change the current directory into the new book: - -```sh -cd my-first-book -``` - -There are several ways to render a book, but one of the easiest methods is to use the `serve` command, which will build your book and start a local webserver: - -```sh -mdbook serve --open -``` - -The `--open` option will open your default web browser to view your new book. -You can leave the server running even while you edit the content of the book, and `mdbook` will automatically rebuild the output *and* automatically refresh your web browser. - -Check out the [CLI Guide](../cli/index.html) for more information about other `mdbook` commands and CLI options. - -## Anatomy of a book - -A book is built from several files which define the settings and layout of the book. - -### `book.toml` - -In the root of your book, there is a `book.toml` file which contains settings for describing how to build your book. -This is written in the [TOML markup language](https://toml.io/). -The default settings are usually good enough to get you started. -When you are interested in exploring more features and options that mdBook provides, check out the [Configuration chapter](../format/configuration/index.html) for more details. - -A very basic `book.toml` can be as simple as this: - -```toml -[book] -title = "My First Book" -``` - -### `SUMMARY.md` - -The next major part of a book is the summary file located at `src/SUMMARY.md`. -This file contains a list of all the chapters in the book. -Before a chapter can be viewed, it must be added to this list. - -Here's a basic summary file with a few chapters: - -```md -# Summary - -[Introduction](README.md) - -- [My First Chapter](my-first-chapter.md) -- [Nested example](nested/README.md) - - [Sub-chapter](nested/sub-chapter.md) -``` - -Try opening up `src/SUMMARY.md` in your editor and adding a few chapters. -If any of the chapter files do not exist, `mdbook` will automatically create them for you. - -For more details on other formatting options for the summary file, check out the [Summary chapter](../format/summary.md). - -### Source files - -The content of your book is all contained in the `src` directory. -Each chapter is a separate Markdown file. -Typically, each chapter starts with a level 1 heading with the title of the chapter. - -```md -# My First Chapter - -Fill out your content here. -``` - -The precise layout of the files is up to you. -The organization of the files will correspond to the HTML files generated, so keep in mind that the file layout is part of the URL of each chapter. - -While the `mdbook serve` command is running, you can open any of the chapter files and start editing them. -Each time you save the file, `mdbook` will rebuild the book and refresh your web browser. - -Check out the [Markdown chapter](../format/markdown.md) for more information on formatting the content of your chapters. - -All other files in the `src` directory will be included in the output. -So if you have images or other static files, just include them somewhere in the `src` directory. - -## Publishing a book - -Once you've written your book, you may want to host it somewhere for others to view. -The first step is to build the output of the book. -This can be done with the `mdbook build` command in the same directory where the `book.toml` file is located: - -```sh -mdbook build -``` - -This will generate a directory named `book` which contains the HTML content of your book. -You can then place this directory on any web server to host it. - -For more information about publishing and deploying, check out the [Continuous Integration chapter](../continuous-integration.md) for more. \ No newline at end of file diff --git a/website/doc/en/src/guide/installation.md b/website/doc/en/src/guide/installation.md deleted file mode 100644 index 128b1047..00000000 --- a/website/doc/en/src/guide/installation.md +++ /dev/null @@ -1,52 +0,0 @@ -# Installation - -There are multiple ways to install the mdBook CLI tool. -Choose any one of the methods below that best suit your needs. -If you are installing mdBook for automatic deployment, check out the [continuous integration] chapter for more examples on how to install. - -[continuous integration]: ../continuous-integration.md - -## Pre-compiled binaries - -Executable binaries are available for download on the [GitHub Releases page][releases]. -Download the binary for your platform (Windows, macOS, or Linux) and extract the archive. -The archive contains an `mdbook` executable which you can run to build your books. - -To make it easier to run, put the path to the binary into your `PATH`. - -[releases]: https://github.com/rust-lang/mdBook/releases - -## Build from source using Rust - -To build the `mdbook` executable from source, you will first need to install Rust and Cargo. -Follow the instructions on the [Rust installation page]. -mdBook currently requires at least Rust version 1.54. - -Once you have installed Rust, the following command can be used to build and install mdBook: - -```sh -cargo install mdbook -``` - -This will automatically download mdBook from [crates.io], build it, and install it in Cargo's global binary directory (`~/.cargo/bin/` by default). - -To uninstall, run the command `cargo uninstall mdbook`. - -[Rust installation page]: https://www.rust-lang.org/tools/install -[crates.io]: https://crates.io/ - -### Installing the latest master version - -The version published to crates.io will ever so slightly be behind the version hosted on GitHub. -If you need the latest version you can build the git version of mdBook yourself. -Cargo makes this ***super easy***! - -```sh -cargo install --git https://github.com/rust-lang/mdBook.git mdbook -``` - -Again, make sure to add the Cargo bin directory to your `PATH`. - -If you are interested in making modifications to mdBook itself, check out the [Contributing Guide] for more information. - -[Contributing Guide]: https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md diff --git a/website/doc/en/src/guide/reading.md b/website/doc/en/src/guide/reading.md deleted file mode 100644 index cab3a865..00000000 --- a/website/doc/en/src/guide/reading.md +++ /dev/null @@ -1,74 +0,0 @@ -# Reading Books - -This chapter gives an introduction on how to interact with a book produced by mdBook. -This assumes you are reading an HTML book. -The options and formatting will be different for other output formats such as PDF. - -A book is organized into *chapters*. -Each chapter is a separate page. -Chapters can be nested into a hierarchy of sub-chapters. -Typically, each chapter will be organized into a series of *headings* to subdivide a chapter. - -## Navigation - -There are several methods for navigating through the chapters of a book. - -The **sidebar** on the left provides a list of all chapters. -Clicking on any of the chapter titles will load that page. - -The sidebar may not automatically appear if the window is too narrow, particularly on mobile displays. -In that situation, the menu icon (three horizontal bars) at the top-left of the page can be pressed to open and close the sidebar. - -The **arrow buttons** at the bottom of the page can be used to navigate to the previous or the next chapter. - -The **left and right arrow keys** on the keyboard can be used to navigate to the previous or the next chapter. - -## Top menu bar - -The menu bar at the top of the page provides some icons for interacting with the book. -The icons displayed will depend on the settings of how the book was generated. - -| Icon | Description | -|------|-------------| -| <i class="fa fa-bars"></i> | Opens and closes the chapter listing sidebar. | -| <i class="fa fa-paint-brush"></i> | Opens a picker to choose a different color theme. | -| <i class="fa fa-search"></i> | Opens a search bar for searching within the book. | -| <i class="fa fa-print"></i> | Instructs the web browser to print the entire book. | -| <i class="fa fa-github"></i> | Opens a link to the website that hosts the source code of the book. | -| <i class="fa fa-edit"></i> | Opens a page to directly edit the source of the page you are currently reading. | - -Tapping the menu bar will scroll the page to the top. - -## Search - -Each book has a built-in search system. -Pressing the search icon (<i class="fa fa-search"></i>) in the menu bar, or pressing the `S` key on the keyboard will open an input box for entering search terms. -Typing some terms will show matching chapters and sections in real time. - -Clicking any of the results will jump to that section. -The up and down arrow keys can be used to navigate the results, and enter will open the highlighted section. - -After loading a search result, the matching search terms will be highlighted in the text. -Clicking a highlighted word or pressing the `Esc` key will remove the highlighting. - -## Code blocks - -mdBook books are often used for programming projects, and thus support highlighting code blocks and samples. -Code blocks may contain several different icons for interacting with them: - -| Icon | Description | -|------|-------------| -| <i class="fa fa-copy"></i> | Copies the code block into your local clipboard, to allow pasting into another application. | -| <i class="fa fa-play"></i> | For Rust code examples, this will execute the sample code and display the compiler output just below the example (see [playground]). | -| <i class="fa fa-eye"></i> | For Rust code examples, this will toggle visibility of "hidden" lines. Sometimes, larger examples will hide lines which are not particularly relevant to what is being illustrated (see [hiding code lines]). | -| <i class="fa fa-history"></i> | For [editable code examples][editor], this will undo any changes you have made. | - -Here's an example: - -```rust -println!("Hello, World!"); -``` - -[editor]: ../format/theme/editor.md -[playground]: ../format/mdbook.md#rust-playground -[hiding code lines]: ../format/mdbook.md#hiding-code-lines diff --git a/website/doc/en/src/misc/contributors.md b/website/doc/en/src/misc/contributors.md deleted file mode 100644 index 362a21fe..00000000 --- a/website/doc/en/src/misc/contributors.md +++ /dev/null @@ -1,24 +0,0 @@ -# Contributors - -Here is a list of the contributors who have helped improving mdBook. Big -shout-out to them! - -- [mdinger](https://github.com/mdinger) -- Kevin ([kbknapp](https://github.com/kbknapp)) -- Steve Klabnik ([steveklabnik](https://github.com/steveklabnik)) -- Adam Solove ([asolove](https://github.com/asolove)) -- Wayne Nilsen ([waynenilsen](https://github.com/waynenilsen)) -- [funnkill](https://github.com/funkill) -- Fu Gangqiang ([FuGangqiang](https://github.com/FuGangqiang)) -- [Michael-F-Bryan](https://github.com/Michael-F-Bryan) -- Chris Spiegel ([cspiegel](https://github.com/cspiegel)) -- [projektir](https://github.com/projektir) -- [Phaiax](https://github.com/Phaiax) -- Matt Ickstadt ([mattico](https://github.com/mattico)) -- Weihang Lo ([weihanglo](https://github.com/weihanglo)) -- Avision Ho ([avisionh](https://github.com/avisionh)) -- Vivek Akupatni ([apatniv](https://github.com/apatniv)) -- Eric Huss ([ehuss](https://github.com/ehuss)) -- Josh Rotenberg ([joshrotenberg](https://github.com/joshrotenberg)) - -If you feel you're missing from this list, feel free to add yourself in a PR. diff --git a/website/doc/en/theme/book.js b/website/doc/en/theme/book.js deleted file mode 100644 index c4ab6988..00000000 --- a/website/doc/en/theme/book.js +++ /dev/null @@ -1,679 +0,0 @@ -"use strict"; - -// Fix back button cache problem -window.onunload = function () { }; - -// Global variable, shared between modules -function playground_text(playground) { - let code_block = playground.querySelector("code"); - - if (window.ace && code_block.classList.contains("editable")) { - let editor = window.ace.edit(code_block); - return editor.getValue(); - } else { - return code_block.textContent; - } -} - -(function codeSnippets() { - function fetch_with_timeout(url, options, timeout = 6000) { - return Promise.race([ - fetch(url, options), - new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) - ]); - } - - var playgrounds = Array.from(document.querySelectorAll(".playground")); - if (playgrounds.length > 0) { - fetch_with_timeout("https://play.rust-lang.org/meta/crates", { - headers: { - 'Content-Type': "application/json", - }, - method: 'POST', - mode: 'cors', - }) - .then(response => response.json()) - .then(response => { - // get list of crates available in the rust playground - let playground_crates = response.crates.map(item => item["id"]); - playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); - }); - } - - function handle_crate_list_update(playground_block, playground_crates) { - // update the play buttons after receiving the response - update_play_button(playground_block, playground_crates); - - // and install on change listener to dynamically update ACE editors - if (window.ace) { - let code_block = playground_block.querySelector("code"); - if (code_block.classList.contains("editable")) { - let editor = window.ace.edit(code_block); - editor.addEventListener("change", function (e) { - update_play_button(playground_block, playground_crates); - }); - // add Ctrl-Enter command to execute rust code - editor.commands.addCommand({ - name: "run", - bindKey: { - win: "Ctrl-Enter", - mac: "Ctrl-Enter" - }, - exec: _editor => run_rust_code(playground_block) - }); - } - } - } - - // updates the visibility of play button based on `no_run` class and - // used crates vs ones available on http://play.rust-lang.org - function update_play_button(pre_block, playground_crates) { - var play_button = pre_block.querySelector(".play-button"); - - // skip if code is `no_run` - if (pre_block.querySelector('code').classList.contains("no_run")) { - play_button.classList.add("hidden"); - return; - } - - // get list of `extern crate`'s from snippet - var txt = playground_text(pre_block); - var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; - var snippet_crates = []; - var item; - while (item = re.exec(txt)) { - snippet_crates.push(item[1]); - } - - // check if all used crates are available on play.rust-lang.org - var all_available = snippet_crates.every(function (elem) { - return playground_crates.indexOf(elem) > -1; - }); - - if (all_available) { - play_button.classList.remove("hidden"); - } else { - play_button.classList.add("hidden"); - } - } - - function run_rust_code(code_block) { - var result_block = code_block.querySelector(".result"); - if (!result_block) { - result_block = document.createElement('code'); - result_block.className = 'result hljs language-bash'; - - code_block.append(result_block); - } - - let text = playground_text(code_block); - let classes = code_block.querySelector('code').classList; - let edition = "2015"; - if(classes.contains("edition2018")) { - edition = "2018"; - } else if(classes.contains("edition2021")) { - edition = "2021"; - } - var params = { - version: "stable", - optimize: "0", - code: text, - edition: edition - }; - - if (text.indexOf("#![feature") !== -1) { - params.version = "nightly"; - } - - result_block.innerText = "Running..."; - - fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { - headers: { - 'Content-Type': "application/json", - }, - method: 'POST', - mode: 'cors', - body: JSON.stringify(params) - }) - .then(response => response.json()) - .then(response => { - if (response.result.trim() === '') { - result_block.innerText = "No output"; - result_block.classList.add("result-no-output"); - } else { - result_block.innerText = response.result; - result_block.classList.remove("result-no-output"); - } - }) - .catch(error => result_block.innerText = "Playground Communication: " + error.message); - } - - // Syntax highlighting Configuration - hljs.configure({ - tabReplace: ' ', // 4 spaces - languages: [], // Languages used for auto-detection - }); - - let code_nodes = Array - .from(document.querySelectorAll('code')) - // Don't highlight `inline code` blocks in headers. - .filter(function (node) {return !node.parentElement.classList.contains("header"); }); - - if (window.ace) { - // language-rust class needs to be removed for editable - // blocks or highlightjs will capture events - code_nodes - .filter(function (node) {return node.classList.contains("editable"); }) - .forEach(function (block) { block.classList.remove('language-rust'); }); - - Array - code_nodes - .filter(function (node) {return !node.classList.contains("editable"); }) - .forEach(function (block) { hljs.highlightBlock(block); }); - } else { - code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); - } - - // Adding the hljs class gives code blocks the color css - // even if highlighting doesn't apply - code_nodes.forEach(function (block) { block.classList.add('hljs'); }); - - Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { - - var lines = Array.from(block.querySelectorAll('.boring')); - // If no lines were hidden, return - if (!lines.length) { return; } - block.classList.add("hide-boring"); - - var buttons = document.createElement('div'); - buttons.className = 'buttons'; - buttons.innerHTML = "<button class=\"fa fa-eye\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; - - // add expand button - var pre_block = block.parentNode; - pre_block.insertBefore(buttons, pre_block.firstChild); - - pre_block.querySelector('.buttons').addEventListener('click', function (e) { - if (e.target.classList.contains('fa-eye')) { - e.target.classList.remove('fa-eye'); - e.target.classList.add('fa-eye-slash'); - e.target.title = 'Hide lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.remove('hide-boring'); - } else if (e.target.classList.contains('fa-eye-slash')) { - e.target.classList.remove('fa-eye-slash'); - e.target.classList.add('fa-eye'); - e.target.title = 'Show hidden lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.add('hide-boring'); - } - }); - }); - - if (window.playground_copyable) { - Array.from(document.querySelectorAll('pre code')).forEach(function (block) { - var pre_block = block.parentNode; - if (!pre_block.classList.contains('playground')) { - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var clipButton = document.createElement('button'); - clipButton.className = 'fa fa-copy clip-button'; - clipButton.title = 'Copy to clipboard'; - clipButton.setAttribute('aria-label', clipButton.title); - clipButton.innerHTML = '<i class=\"tooltiptext\"></i>'; - - buttons.insertBefore(clipButton, buttons.firstChild); - } - }); - } - - // Process playground code blocks - Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { - // Add play button - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var runCodeButton = document.createElement('button'); - runCodeButton.className = 'fa fa-play play-button'; - runCodeButton.hidden = true; - runCodeButton.title = 'Run this code'; - runCodeButton.setAttribute('aria-label', runCodeButton.title); - - buttons.insertBefore(runCodeButton, buttons.firstChild); - runCodeButton.addEventListener('click', function (e) { - run_rust_code(pre_block); - }); - - if (window.playground_copyable) { - var copyCodeClipboardButton = document.createElement('button'); - copyCodeClipboardButton.className = 'fa fa-copy clip-button'; - copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>'; - copyCodeClipboardButton.title = 'Copy to clipboard'; - copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); - - buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); - } - - let code_block = pre_block.querySelector("code"); - if (window.ace && code_block.classList.contains("editable")) { - var undoChangesButton = document.createElement('button'); - undoChangesButton.className = 'fa fa-history reset-button'; - undoChangesButton.title = 'Undo changes'; - undoChangesButton.setAttribute('aria-label', undoChangesButton.title); - - buttons.insertBefore(undoChangesButton, buttons.firstChild); - - undoChangesButton.addEventListener('click', function () { - let editor = window.ace.edit(code_block); - editor.setValue(editor.originalCode); - editor.clearSelection(); - }); - } - }); -})(); - -(function themes() { - var html = document.querySelector('html'); - var themeToggleButton = document.getElementById('theme-toggle'); - var themePopup = document.getElementById('theme-list'); - var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); - var stylesheets = { - ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), - tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), - highlight: document.querySelector("[href$='highlight.css']"), - }; - - function showThemes() { - themePopup.style.display = 'block'; - themeToggleButton.setAttribute('aria-expanded', true); - themePopup.querySelector("button#" + get_theme()).focus(); - } - - function hideThemes() { - themePopup.style.display = 'none'; - themeToggleButton.setAttribute('aria-expanded', false); - themeToggleButton.focus(); - } - - function get_theme() { - var theme; - try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } - if (theme === null || theme === undefined) { - return default_theme; - } else { - return theme; - } - } - - function set_theme(theme, store = true) { - let ace_theme; - - if (theme == 'coal' || theme == 'navy') { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = false; - stylesheets.highlight.disabled = true; - - ace_theme = "ace/theme/tomorrow_night"; - } else if (theme == 'ayu') { - stylesheets.ayuHighlight.disabled = false; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = true; - ace_theme = "ace/theme/tomorrow_night"; - } else { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = false; - ace_theme = "ace/theme/dawn"; - } - - setTimeout(function () { - themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; - }, 1); - - if (window.ace && window.editors) { - window.editors.forEach(function (editor) { - editor.setTheme(ace_theme); - }); - } - - var previousTheme = get_theme(); - - if (store) { - try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } - } - - html.classList.remove(previousTheme); - html.classList.add(theme); - } - - // Set theme - var theme = get_theme(); - - set_theme(theme, false); - - themeToggleButton.addEventListener('click', function () { - if (themePopup.style.display === 'block') { - hideThemes(); - } else { - showThemes(); - } - }); - - themePopup.addEventListener('click', function (e) { - var theme; - if (e.target.className === "theme") { - theme = e.target.id; - } else if (e.target.parentElement.className === "theme") { - theme = e.target.parentElement.id; - } else { - return; - } - set_theme(theme); - }); - - themePopup.addEventListener('focusout', function(e) { - // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) - if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { - hideThemes(); - } - }); - - // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 - document.addEventListener('click', function(e) { - if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { - hideThemes(); - } - }); - - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (!themePopup.contains(e.target)) { return; } - - switch (e.key) { - case 'Escape': - e.preventDefault(); - hideThemes(); - break; - case 'ArrowUp': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.previousElementSibling) { - li.previousElementSibling.querySelector('button').focus(); - } - break; - case 'ArrowDown': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.nextElementSibling) { - li.nextElementSibling.querySelector('button').focus(); - } - break; - case 'Home': - e.preventDefault(); - themePopup.querySelector('li:first-child button').focus(); - break; - case 'End': - e.preventDefault(); - themePopup.querySelector('li:last-child button').focus(); - break; - } - }); -})(); - -(function sidebar() { - var html = document.querySelector("html"); - var sidebar = document.getElementById("sidebar"); - var sidebarLinks = document.querySelectorAll('#sidebar a'); - var sidebarToggleButton = document.getElementById("sidebar-toggle"); - var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); - var firstContact = null; - - function showSidebar() { - html.classList.remove('sidebar-hidden') - html.classList.add('sidebar-visible'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', 0); - }); - sidebarToggleButton.setAttribute('aria-expanded', true); - sidebar.setAttribute('aria-hidden', false); - try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } - } - - - var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); - - function toggleSection(ev) { - ev.currentTarget.parentElement.classList.toggle('expanded'); - } - - Array.from(sidebarAnchorToggles).forEach(function (el) { - el.addEventListener('click', toggleSection); - }); - - function hideSidebar() { - html.classList.remove('sidebar-visible') - html.classList.add('sidebar-hidden'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', -1); - }); - sidebarToggleButton.setAttribute('aria-expanded', false); - sidebar.setAttribute('aria-hidden', true); - try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } - } - - // Toggle sidebar - sidebarToggleButton.addEventListener('click', function sidebarToggle() { - if (html.classList.contains("sidebar-hidden")) { - var current_width = parseInt( - document.documentElement.style.getPropertyValue('--sidebar-width'), 10); - if (current_width < 150) { - document.documentElement.style.setProperty('--sidebar-width', '150px'); - } - showSidebar(); - } else if (html.classList.contains("sidebar-visible")) { - hideSidebar(); - } else { - if (getComputedStyle(sidebar)['transform'] === 'none') { - hideSidebar(); - } else { - showSidebar(); - } - } - }); - - sidebarResizeHandle.addEventListener('mousedown', initResize, false); - - function initResize(e) { - window.addEventListener('mousemove', resize, false); - window.addEventListener('mouseup', stopResize, false); - html.classList.add('sidebar-resizing'); - } - function resize(e) { - var viewportOffset = sidebar.getBoundingClientRect(); - var pos = (e.clientX - sidebar.offsetLeft - viewportOffset.left); - if (pos < 20) { - hideSidebar(); - } else { - if (html.classList.contains("sidebar-hidden")) { - showSidebar(); - } - pos = Math.min(pos, window.innerWidth - 100); - document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); - } - } - //on mouseup remove windows functions mousemove & mouseup - function stopResize(e) { - html.classList.remove('sidebar-resizing'); - window.removeEventListener('mousemove', resize, false); - window.removeEventListener('mouseup', stopResize, false); - } - - document.addEventListener('touchstart', function (e) { - firstContact = { - x: e.touches[0].clientX, - time: Date.now() - }; - }, { passive: true }); - - document.addEventListener('touchmove', function (e) { - if (!firstContact) - return; - - var curX = e.touches[0].clientX; - var xDiff = curX - firstContact.x, - tDiff = Date.now() - firstContact.time; - - if (tDiff < 250 && Math.abs(xDiff) >= 150) { - if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) - showSidebar(); - else if (xDiff < 0 && curX < 300) - hideSidebar(); - - firstContact = null; - } - }, { passive: true }); - - // Try to show the full sidebar - if (html.classList.contains("sidebar-visible")) { - var realHeight = sidebar.querySelector(".sidebar-scrollbox").scrollHeight; - document.getElementById("page-wrapper").style.minHeight = realHeight + 80 + "px"; - } -})(); - -(function chapterNavigation() { - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (window.search && window.search.hasFocus()) { return; } - - switch (e.key) { - case 'ArrowRight': - e.preventDefault(); - var nextButton = document.querySelector('.nav-chapters.next'); - if (nextButton) { - window.location.href = nextButton.href; - } - break; - case 'ArrowLeft': - e.preventDefault(); - var previousButton = document.querySelector('.nav-chapters.previous'); - if (previousButton) { - window.location.href = previousButton.href; - } - break; - } - }); -})(); - -(function clipboard() { - var clipButtons = document.querySelectorAll('.clip-button'); - - function hideTooltip(elem) { - elem.firstChild.innerText = ""; - elem.className = 'fa fa-copy clip-button'; - } - - function showTooltip(elem, msg) { - elem.firstChild.innerText = msg; - elem.className = 'fa fa-copy tooltipped'; - } - - var clipboardSnippets = new ClipboardJS('.clip-button', { - text: function (trigger) { - hideTooltip(trigger); - let playground = trigger.closest("pre"); - return playground_text(playground); - } - }); - - Array.from(clipButtons).forEach(function (clipButton) { - clipButton.addEventListener('mouseout', function (e) { - hideTooltip(e.currentTarget); - }); - }); - - clipboardSnippets.on('success', function (e) { - e.clearSelection(); - showTooltip(e.trigger, "Copied!"); - }); - - clipboardSnippets.on('error', function (e) { - showTooltip(e.trigger, "Clipboard error!"); - }); -})(); - -(function scrollToTop () { - var menuTitle = document.querySelector('.menu-title'); - - menuTitle.addEventListener('click', function () { - document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); - }); -})(); - -(function controllMenu() { - var menu = document.getElementById('menu-bar'); - - (function controllPosition() { - var scrollTop = document.scrollingElement.scrollTop; - var prevScrollTop = scrollTop; - var minMenuY = -menu.clientHeight - 50; - // When the script loads, the page can be at any scroll (e.g. if you reforesh it). - menu.style.top = scrollTop + 'px'; - // Same as parseInt(menu.style.top.slice(0, -2), but faster - var topCache = menu.style.top.slice(0, -2); - menu.classList.remove('sticky'); - var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster - document.addEventListener('scroll', function () { - scrollTop = Math.max(document.scrollingElement.scrollTop, 0); - // `null` means that it doesn't need to be updated - var nextSticky = null; - var nextTop = null; - var scrollDown = scrollTop > prevScrollTop; - var menuPosAbsoluteY = topCache - scrollTop; - if (scrollDown) { - nextSticky = false; - if (menuPosAbsoluteY > 0) { - nextTop = prevScrollTop; - } - } else { - if (menuPosAbsoluteY > 0) { - nextSticky = true; - } else if (menuPosAbsoluteY < minMenuY) { - nextTop = prevScrollTop + minMenuY; - } - } - if (nextSticky === true && stickyCache === false) { - menu.classList.add('sticky'); - stickyCache = true; - } else if (nextSticky === false && stickyCache === true) { - menu.classList.remove('sticky'); - stickyCache = false; - } - if (nextTop !== null) { - menu.style.top = nextTop + 'px'; - topCache = nextTop; - } - prevScrollTop = scrollTop; - }, { passive: true }); - })(); - (function controllBorder() { - menu.classList.remove('bordered'); - document.addEventListener('scroll', function () { - if (menu.offsetTop === 0) { - menu.classList.remove('bordered'); - } else { - menu.classList.add('bordered'); - } - }, { passive: true }); - })(); -})(); diff --git a/website/doc/en/theme/css/chrome.css b/website/doc/en/theme/css/chrome.css deleted file mode 100644 index 7f9dc35d..00000000 --- a/website/doc/en/theme/css/chrome.css +++ /dev/null @@ -1,552 +0,0 @@ -/* CSS for UI elements (a.k.a. chrome) */ - -@import 'variables.css'; - -::-webkit-scrollbar { - background: var(--bg); -} -::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -#mdbook { - position: relative; - scrollbar-color: var(--scrollbar) var(--bg); -} -#mdbook .content { - position: relative; -} - -#mdbook #searchresults a, -#mdbook .content a:link, -#mdbook a:visited, -#mdbook a > .hljs { - color: var(--links); -} - -/* Menu Bar */ - -#menu-bar, -#menu-bar-hover-placeholder { - z-index: 101; - margin: auto calc(0px - var(--page-padding)); -} -#menu-bar { - position: relative; - display: flex; - flex-wrap: wrap; - background-color: var(--bg); - border-bottom-color: var(--bg); - border-bottom-width: 1px; - border-bottom-style: solid; -} -#menu-bar.sticky, -.js #menu-bar-hover-placeholder:hover + #menu-bar, -.js #menu-bar:hover, -.js.sidebar-visible #menu-bar { - position: -webkit-sticky; - position: sticky; - top: 0 !important; -} -#menu-bar-hover-placeholder { - position: sticky; - position: -webkit-sticky; - top: 0; - height: var(--menu-bar-height); -} -#menu-bar.bordered { - border-bottom-color: var(--table-border-color); -} -#menu-bar i, #menu-bar .icon-button { - position: relative; - padding: 0 8px; - z-index: 10; - line-height: var(--menu-bar-height); - cursor: pointer; - transition: color 0.5s; -} -@media only screen and (max-width: 420px) { - #menu-bar i, #menu-bar .icon-button { - padding: 0 5px; - } -} - -#mdbook .icon-button { - border: none; - background: none; - padding: 0; - color: inherit; -} -#mdbook .icon-button i { - margin: 0; -} - -#mdbook .right-buttons { - margin: 0 15px; -} -#mdbook .right-buttons a { - text-decoration: none; -} - -#mdbook .left-buttons { - display: flex; - margin: 0 5px; -} -.no-js #mdbook .left-buttons { - display: none; -} - -#mdbook .menu-title { - display: inline-block; - font-weight: 200; - font-size: 1.8rem; - line-height: var(--menu-bar-height); - text-align: center; - margin: 0; - flex: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.js #mdbook .menu-title { - cursor: pointer; -} -@media only screen and (max-width: 640px) { - #mdbook .menu-title { - font-size: 1.5rem; - } -} -@media only screen and (max-width: 420px) { - #mdbook .menu-title { - font-size: 1.2rem; - } -} - -#mdbook .menu-bar, -#mdbook .menu-bar:visited, -#mdbook .nav-chapters, -#mdbook .nav-chapters:visited, -#mdbook .mobile-nav-chapters, -#mdbook .mobile-nav-chapters:visited, -#mdbook .menu-bar .icon-button, -#mdbook .menu-bar a i { - color: var(--icons); -} - -#mdbook .menu-bar i:hover, -#mdbook .menu-bar .icon-button:hover, -#mdbook .nav-chapters:hover, -#mdbook .mobile-nav-chapters i:hover { - color: var(--icons-hover); -} - -/* Nav Icons */ - -#mdbook .nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - - position: absolute; - top: 0; - bottom: 0; - margin: 0; - max-width: 150px; - min-width: 90px; - - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - - transition: color 0.5s, background-color 0.5s; -} - -#mdbook .nav-chapters:hover { - text-decoration: none; - background-color: var(--theme-hover); - transition: background-color 0.15s, color 0.15s; -} - -#mdbook .nav-wrapper { - margin-top: 50px; - display: none; -} - -#mdbook .mobile-nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - width: 90px; - border-radius: 5px; - background-color: var(--sidebar-bg); -} - -#mdbook .previous { - float: left; -} - -#mdbook .next { - float: right; - right: var(--page-padding); -} - -@media only screen and (max-width: 1080px) { - #mdbook .nav-wide-wrapper { display: none; } - #mdbook .nav-wrapper { display: block; } -} - -@media only screen and (max-width: 1380px) { - .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } - .sidebar-visible #mdbook .nav-wrapper { display: block; } -} - -/* Inline code */ - -#mdbook :not(pre) > .hljs { - display: inline; - padding: 0.1em 0.3em; - border-radius: 3px; -} - -#mdbook :not(pre):not(a) > .hljs { - color: var(--inline-code-color); - overflow-x: initial; -} - -#mdbook a:hover > .hljs { - text-decoration: underline; -} - -#mdbook pre { - position: relative; - font-size: 0.875rem; -} -#mdbook pre > .buttons { - position: absolute; - z-index: 100; - right: 0px; - top: 2px; - margin: 0px; - padding: 2px 0px; - - color: var(--sidebar-fg); - cursor: pointer; - visibility: hidden; - opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; -} -#mdbook pre:hover > .buttons { - visibility: visible; - opacity: 1 -} -#mdbook pre > .buttons :hover { - color: var(--sidebar-active); - border-color: var(--icons-hover); - background-color: var(--theme-hover); -} -#mdbook pre > .buttons i { - margin-left: 8px; -} -#mdbook pre > .buttons button { - cursor: inherit; - margin: 0px 5px; - padding: 3px 5px; - font-size: 14px; - - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: var(--icons); - background-color: var(--theme-popup-bg); - transition: 100ms; - transition-property: color,border-color,background-color; - color: var(--icons); -} -@media (pointer: coarse) { - #mdbook pre > .buttons button { - /* On mobile, make it easier to tap buttons. */ - padding: 0.3rem 1rem; - } -} -#mdbook pre > code { - padding: 1rem; - font-size: 0.875rem; -} - -/* FIXME: ACE editors overlap their buttons because ACE does absolute - positioning within the code block which breaks padding. The only solution I - can think of is to move the padding to the outer pre tag (or insert a div - wrapper), but that would require fixing a whole bunch of CSS rules. -*/ -#mdbook .hljs.ace_editor { - padding: 0rem 0rem; -} - -#mdbook pre > .result { - margin-top: 10px; -} - -/* Search */ - -#searchresults a { - text-decoration: none; -} - -#mdbook mark { - border-radius: 2px; - padding: 0 3px 1px 3px; - margin: 0 -3px -1px -3px; - background-color: var(--search-mark-bg); - transition: background-color 300ms linear; - cursor: pointer; -} - -#mdbook mark.fade-out { - background-color: rgba(0,0,0,0) !important; - cursor: auto; -} - -#mdbook .searchbar-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} - -#searchbar { - width: 100%; - margin: 5px auto 0px auto; - padding: 10px 16px; - transition: box-shadow 300ms ease-in-out; - border: 1px solid var(--searchbar-border-color); - border-radius: 3px; - background-color: var(--searchbar-bg); - color: var(--searchbar-fg); -} -#searchbar:focus, -#searchbar.active { - box-shadow: 0 0 3px var(--searchbar-shadow-color); -} - -#mdbook .searchresults-header { - font-weight: bold; - font-size: 1em; - padding: 18px 0 0 5px; - color: var(--searchresults-header-fg); -} - -#mdbook .searchresults-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); - border-bottom: 1px dashed var(--searchresults-border-color); -} - -#mdbook ul#searchresults { - list-style: none; - padding-left: 20px; -} -#mdbook ul#searchresults li { - margin: 10px 0px; - padding: 2px; - border-radius: 2px; -} -#mdbook ul#searchresults li.focus { - background-color: var(--searchresults-li-bg); -} -#mdbook ul#searchresults span.teaser { - display: block; - clear: both; - margin: 5px 0 0 20px; - font-size: 0.8em; -} -#mdbook ul#searchresults span.teaser em { - font-weight: bold; - font-style: normal; -} - -/* Sidebar */ -#mdbook .sidebar { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: var(--sidebar-width); - font-size: 0.875em; - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - overscroll-behavior-y: contain; - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); -} -.sidebar-resizing { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.js:not(.sidebar-resizing) #mdbook .sidebar { - transition: transform 0.3s; /* Animation: slide away */ -} -#mdbook .sidebar code { - line-height: 2em; -} -#mdbook .sidebar .sidebar-scrollbox { - overflow-y: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 10px 10px; -} -#mdbook .sidebar .sidebar-resize-handle { - position: absolute; - cursor: col-resize; - width: 0; - right: 0; - top: 0; - bottom: 0; -} -.js #mdbook .sidebar .sidebar-resize-handle { - cursor: col-resize; - width: 5px; -} -.sidebar-hidden #mdbook .sidebar { - transform: translateX(calc(0px - var(--sidebar-width))); -} -#mdbook .sidebar::-webkit-scrollbar { - background: var(--sidebar-bg); -} -#mdbook .sidebar::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -.sidebar-visible #mdbook .page-wrapper { - transform: translateX(var(--sidebar-width)); -} -@media only screen and (min-width: 620px) { - .sidebar-visible #mdbook .page-wrapper { - transform: none; - margin-left: var(--sidebar-width); - } -} - -#mdbook .chapter { - list-style: none outside none; - padding-left: 0; - line-height: 2.2em; -} - -#mdbook .chapter ol { - width: 100%; -} - -#mdbook .chapter li { - display: flex; - color: var(--sidebar-non-existant); -} -#mdbook .chapter li a { - display: block; - padding: 0; - text-decoration: none; - color: var(--sidebar-fg); -} - -#mdbook .chapter li a:hover { - color: var(--sidebar-active); -} - -#mdbook .chapter li a.active { - color: var(--sidebar-active); -} - -#mdbook .chapter li > a.toggle { - cursor: pointer; - display: block; - margin-left: auto; - padding: 0 10px; - user-select: none; - opacity: 0.68; -} - -#mdbook .chapter li > a.toggle div { - transition: transform 0.5s; -} - -/* collapse the section */ -#mdbook .chapter li:not(.expanded) + li > ol { - display: none; -} - -#mdbook .chapter li.chapter-item { - line-height: 1.5em; - margin-top: 0.6em; -} - -#mdbook .chapter li.expanded > a.toggle div { - transform: rotate(90deg); -} - -#mdbook .spacer { - width: 100%; - height: 3px; - margin: 5px 0px; -} -#mdbook .chapter .spacer { - background-color: var(--sidebar-spacer); -} - -@media (-moz-touch-enabled: 1), (pointer: coarse) { - #mdbook .chapter li a { padding: 5px 0; } - #mdbook .spacer { margin: 10px 0; } -} - -#mdbook .section { - list-style: none outside none; - margin: 0; - padding: 0 0 0 20px; - line-height: 1.9em; -} - -/* Theme Menu Popup */ - -#mdbook .theme-popup { - position: absolute; - left: 10px; - top: var(--menu-bar-height); - z-index: 1000; - border-radius: 4px; - font-size: 0.7em; - color: var(--fg); - background: var(--theme-popup-bg); - border: 1px solid var(--theme-popup-border); - margin: 0; - padding: 0; - list-style: none; - display: none; -} -#mdbook .theme-popup .default { - color: var(--icons); -} -#mdbook .theme-popup .theme { - width: 100%; - border: 0; - margin: 0; - padding: 2px 10px; - line-height: 25px; - white-space: nowrap; - text-align: left; - cursor: pointer; - color: inherit; - background: inherit; - font-size: inherit; -} -#mdbook .theme-popup .theme:hover { - background-color: var(--theme-hover); -} -#mdbook .theme-popup .theme:hover:first-child, -#mdbook .theme-popup .theme:hover:last-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} diff --git a/website/doc/en/theme/css/general.css b/website/doc/en/theme/css/general.css deleted file mode 100644 index 8ace6312..00000000 --- a/website/doc/en/theme/css/general.css +++ /dev/null @@ -1,187 +0,0 @@ -/* Base styles and content styles */ - -@import 'variables.css'; - -#mdbook { - font-family: "Open Sans", sans-serif; - color: var(--fg); - background-color: var(--bg); - text-size-adjust: none; - -webkit-text-size-adjust: none; - overflow-x: hidden; -} - -#mdbook code { - font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; -} - -/* make long words/inline code not x overflow */ -#mdbook main { - overflow-wrap: break-word; -} - -/* make wide tables scroll if they overflow */ -#mdbook .table-wrapper { - overflow-x: auto; -} - -/* Don't change font size in headers. */ -#mdbook h1 code, -#mdbook h2 code, -#mdbook h3 code, -#mdbook h4 code, -#mdbook h5 code, -#mdbook h6 code { - font-size: unset; -} - -#mdbook .left { float: left; } -#mdbook .right { float: right; } -#mdbook .boring { opacity: 0.6; } -#mdbook .hide-boring .boring { display: none; } -#mdbook .hidden { display: none !important; } - -#mdbook h2, #mdbook h3 { margin-top: 2.5em; } -#mdbook h4, #mdbook h5 { margin-top: 2em; } - -#mdbook .header + .header h3, -#mdbook .header + .header h4, -#mdbook .header + .header h5 { - margin-top: 1em; -} - -#mdbook h1:target::before, -#mdbook h2:target::before, -#mdbook h3:target::before, -#mdbook h4:target::before, -#mdbook h5:target::before, -#mdbook h6:target::before { - display: inline-block; - content: "»"; - margin-left: -30px; - width: 30px; -} - -/* This is broken on Safari as of version 14, but is fixed - in Safari Technology Preview 117 which I think will be Safari 14.2. - https://bugs.webkit.org/show_bug.cgi?id=218076 -*/ -:target { - scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); -} - -#mdbook .page { - outline: 0; - padding: 0 var(--page-padding); - margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ -} -#mdbook .page-wrapper { - box-sizing: border-box; -} -.js:not(.sidebar-resizing) #mdbook .page-wrapper { - transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ -} - -#mdbook .content { - overflow-y: auto; - padding: 20px 5px 50px 5px; -} -#mdbook .content main { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} -#mdbook .content p { line-height: 1.45em; } -#mdbook .content ol { line-height: 1.45em; } -#mdbook .content ul { line-height: 1.45em; } -#mdbook .content a { text-decoration: none; } -#mdbook .content a:hover { text-decoration: underline; } -#mdbook .content img, .content video { max-width: 100%; } -#mdbook .content .header:link, -#mdbook .content .header:visited { - color: var(--fg); -} -#mdbook .content .header:link, -#mdbook .content .header:visited:hover { - text-decoration: none; -} - -#mdbook table { - margin: 0 auto; - border-collapse: collapse; -} -#mdbook table td { - padding: 3px 20px; - border: 1px var(--table-border-color) solid; -} -#mdbook table thead { - background: var(--table-header-bg); -} -#mdbook table thead td { - font-weight: 700; - border: none; -} -#mdbook table thead th { - padding: 3px 20px; -} -#mdbook table thead tr { - border: 1px var(--table-header-bg) solid; -} -/* Alternate background colors for rows */ -#mdbook table tbody tr:nth-child(2n) { - background: var(--table-alternate-bg); -} - - -#mdbook blockquote { - margin: 20px 0; - padding: 0 20px; - color: var(--fg); - background-color: var(--quote-bg); - border-top: .1em solid var(--quote-border); - border-bottom: .1em solid var(--quote-border); -} -#mdbook blockquote p { - margin-top: 1rem; -} - -#mdbook :not(.footnote-definition) + .footnote-definition, -#mdbook .footnote-definition + :not(.footnote-definition) { - margin-top: 2em; -} -#mdbook .footnote-definition { - font-size: 0.9em; - margin: 0.5em 0; -} -#mdbook .footnote-definition p { - display: inline; -} - -#mdbook .tooltiptext { - position: absolute; - visibility: hidden; - color: #fff; - background-color: #333; - transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ - left: -8px; /* Half of the width of the icon */ - top: -35px; - font-size: 0.8em; - text-align: center; - border-radius: 6px; - padding: 5px 8px; - margin: 5px; - z-index: 1000; -} -#mdbook .tooltipped .tooltiptext { - visibility: visible; -} - -#mdbook .chapter li.part-title { - color: var(--sidebar-fg); - margin: 5px 0px; - font-weight: bold; -} - -#mdbook .result-no-output { - font-style: italic; -} diff --git a/website/doc/en/theme/css/print.css b/website/doc/en/theme/css/print.css deleted file mode 100644 index bd7c8da7..00000000 --- a/website/doc/en/theme/css/print.css +++ /dev/null @@ -1,65 +0,0 @@ -#sidebar, -#menu-bar, -#mdbook .nav-chapters, -#mdbook .mobile-nav-chapters { - display: none; -} - -#mdbook, -#page-wrapper { - margin: 0; - padding: 0; - max-width: none; - transform: none !important; - overflow-y: initial; -} - -#content { - max-width: none; - margin: 0; - padding: 0; -} - -#mdbook .page { - overflow-y: initial; -} - -#mdbook code { - background-color: #eeeeee; - border-radius: 5px; - - /* Force background to be printed in Chrome */ - -webkit-print-color-adjust: exact; -} - -#mdbook pre > .buttons { - z-index: 2; -} - -#mdbook a, -#mdbook a:visited, -#mdbook a:active, -#mdbook a:hover { - color: #4183c4; - text-decoration: none; -} - -#mdbook h1, -#mdbook h2, -#mdbook h3, -#mdbook h4, -#mdbook h5, -#mdbook h6 { - page-break-inside: avoid; - page-break-after: avoid; -} - -#mdbook pre, -#mdbook code { - page-break-inside: avoid; - white-space: pre-wrap; -} - -#mdbook .fa { - display: none !important; -} diff --git a/website/doc/en/theme/css/variables.css b/website/doc/en/theme/css/variables.css deleted file mode 100644 index 7a68155a..00000000 --- a/website/doc/en/theme/css/variables.css +++ /dev/null @@ -1,253 +0,0 @@ - -/* Globals */ - -:root { - --sidebar-width: 300px; - --page-padding: 15px; - --content-max-width: 750px; - --menu-bar-height: 50px; -} - -/* Themes */ - -.ayu { - --bg: hsl(210, 25%, 8%); - --fg: #c5c5c5; - - --sidebar-bg: #14191f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #5c6773; - --sidebar-active: #ffb454; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #0096cf; - - --inline-code-color: #ffb454; - - --theme-popup-bg: #14191f; - --theme-popup-border: #5c6773; - --theme-hover: #191f26; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(210, 25%, 13%); - --table-header-bg: hsl(210, 25%, 28%); - --table-alternate-bg: hsl(210, 25%, 11%); - - --searchbar-border-color: #848484; - --searchbar-bg: #424242; - --searchbar-fg: #fff; - --searchbar-shadow-color: #d4c89f; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #252932; - --search-mark-bg: #e3b171; -} - -.coal { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; -} - -.light { - --bg: hsl(0, 0%, 100%); - --fg: hsl(0, 0%, 0%); - - --sidebar-bg: #fafafa; - --sidebar-fg: hsl(0, 0%, 0%); - --sidebar-non-existant: #aaaaaa; - --sidebar-active: #1f1fff; - --sidebar-spacer: #f4f4f4; - - --scrollbar: #8F8F8F; - - --icons: #747474; - --icons-hover: #000000; - - --links: #20609f; - - --inline-code-color: #301900; - - --theme-popup-bg: #fafafa; - --theme-popup-border: #cccccc; - --theme-hover: #e6e6e6; - - --quote-bg: hsl(197, 37%, 96%); - --quote-border: hsl(197, 37%, 91%); - - --table-border-color: hsl(0, 0%, 95%); - --table-header-bg: hsl(0, 0%, 80%); - --table-alternate-bg: hsl(0, 0%, 97%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #e4f2fe; - --search-mark-bg: #a2cff5; -} - -.navy { - --bg: hsl(226, 23%, 11%); - --fg: #bcbdd0; - - --sidebar-bg: #282d3f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505274; - --sidebar-active: #2b79a2; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #161923; - --theme-popup-border: #737480; - --theme-hover: #282e40; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(226, 23%, 16%); - --table-header-bg: hsl(226, 23%, 31%); - --table-alternate-bg: hsl(226, 23%, 14%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #aeaec6; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #5f5f71; - --searchresults-border-color: #5c5c68; - --searchresults-li-bg: #242430; - --search-mark-bg: #a2cff5; -} - -.rust { - --bg: hsl(60, 9%, 87%); - --fg: #262625; - - --sidebar-bg: #3b2e2a; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505254; - --sidebar-active: #e69f67; - --sidebar-spacer: #45373a; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #262625; - - --links: #2b79a2; - - --inline-code-color: #6e6b5e; - - --theme-popup-bg: #e1e1db; - --theme-popup-border: #b38f6b; - --theme-hover: #99908a; - - --quote-bg: hsl(60, 5%, 75%); - --quote-border: hsl(60, 5%, 70%); - - --table-border-color: hsl(60, 9%, 82%); - --table-header-bg: #b3a497; - --table-alternate-bg: hsl(60, 9%, 84%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #dec2a2; - --search-mark-bg: #e69f67; -} - -@media (prefers-color-scheme: dark) { - .light.no-js { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - } -} diff --git a/website/doc/en/theme/highlight.css b/website/doc/en/theme/highlight.css deleted file mode 100644 index ba57b82b..00000000 --- a/website/doc/en/theme/highlight.css +++ /dev/null @@ -1,82 +0,0 @@ -/* - * An increased contrast highlighting scheme loosely based on the - * "Base16 Atelier Dune Light" theme by Bram de Haan - * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) - * Original Base16 color scheme by Chris Kempson - * (https://github.com/chriskempson/base16) - */ - -/* Comment */ -.hljs-comment, -.hljs-quote { - color: #575757; -} - -/* Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d70025; -} - -/* Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b21e00; -} - -/* Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #008200; -} - -/* Blue */ -.hljs-title, -.hljs-section { - color: #0030f2; -} - -/* Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #9d00ec; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f6f7f6; - color: #000; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #22863a; - background-color: #f0fff4; -} - -.hljs-deletion { - color: #b31d28; - background-color: #ffeef0; -} diff --git a/website/doc/en/theme/highlight.js b/website/doc/en/theme/highlight.js deleted file mode 100644 index 180385b7..00000000 --- a/website/doc/en/theme/highlight.js +++ /dev/null @@ -1,6 +0,0 @@ -/* - Highlight.js 10.1.1 (93fd0d73) - License: BSD-3-Clause - Copyright (c) 2006-2020, Ivan Sagalaev -*/ -var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/website/doc/en/theme/index.hbs b/website/doc/en/theme/index.hbs deleted file mode 100644 index 490b7ca1..00000000 --- a/website/doc/en/theme/index.hbs +++ /dev/null @@ -1,261 +0,0 @@ -<!-- Lang: {{ language }} --> -<!-- Title: {{ title }} --> -<!-- Print: {{#if print_enable}}enabled{{else}}disabled{{/if}} --> -<!-- MathJax: {{#if mathjax_support}}supported{{else}}unsupported{{/if}} --> - -<!-- mdBook --> - -<!-- Provide site root to javascript --> -<script type="text/javascript"> - var path_to_root = "{{ path_to_root }}"; - var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}"; -</script> - -<!-- Work around some values being stored in localStorage wrapped in quotes --> -<script type="text/javascript"> - try { - var theme = localStorage.getItem('mdbook-theme'); - var sidebar = localStorage.getItem('mdbook-sidebar'); - - if (theme.startsWith('"') && theme.endsWith('"')) { - localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); - } - - if (sidebar.startsWith('"') && sidebar.endsWith('"')) { - localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); - } - } catch (e) { } -</script> - -<!-- Set the theme before any content is loaded, prevents flash --> -<script type="text/javascript"> - var theme; - try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } - if (theme === null || theme === undefined) { theme = default_theme; } - var html = document.querySelector('html'); - html.classList.remove('no-js') - html.classList.remove('{{ default_theme }}') - html.classList.add(theme); - html.classList.add('js'); -</script> - -<!-- Hide / unhide sidebar before it is displayed --> -<script type="text/javascript"> - var html = document.querySelector('html'); - var sidebar = 'hidden'; - if (document.body.clientWidth >= 1080) { - try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } - sidebar = sidebar || 'visible'; - } - html.classList.remove('sidebar-visible'); - html.classList.add("sidebar-" + sidebar); -</script> - -<nav id="sidebar" class="sidebar" aria-label="Table of contents"> - <div class="sidebar-scrollbox"> - {{#toc}}{{/toc}} - </div> - <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> -</nav> - -<div id="page-wrapper" class="page-wrapper"> - - <div class="page"> - {{> header}} - <div id="menu-bar-hover-placeholder"></div> - <div id="menu-bar" class="menu-bar sticky bordered"> - <div class="left-buttons"> - <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> - <i class="fa fa-bars"></i> - </button> - <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> - <i class="fa fa-paint-brush"></i> - </button> - <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> - <li role="none"><button role="menuitem" class="theme" id="light">{{ theme_option "Light" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="rust">{{ theme_option "Rust" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="coal">{{ theme_option "Coal" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="navy">{{ theme_option "Navy" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="ayu">{{ theme_option "Ayu" }}</button></li> - </ul> - {{#if search_enabled}} - <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> - <i class="fa fa-search"></i> - </button> - {{/if}} - </div> - - <h1 class="menu-title">{{ book_title }}</h1> - - <div class="right-buttons"> - {{#if print_enable}} - <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book"> - <i id="print-button" class="fa fa-print"></i> - </a> - {{/if}} - {{#if git_repository_url}} - <a href="{{git_repository_url}}" title="Git repository" aria-label="Git repository"> - <i id="git-repository-button" class="fa {{git_repository_icon}}"></i> - </a> - {{/if}} - {{#if git_repository_edit_url}} - <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit"> - <i id="git-edit-button" class="fa fa-edit"></i> - </a> - {{/if}} - - </div> - </div> - - {{#if search_enabled}} - <div id="search-wrapper" class="hidden"> - <form id="searchbar-outer" class="searchbar-outer"> - <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> - </form> - <div id="searchresults-outer" class="searchresults-outer hidden"> - <div id="searchresults-header" class="searchresults-header"></div> - <ul id="searchresults"> - </ul> - </div> - </div> - {{/if}} - - <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> - <script type="text/javascript"> - document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); - document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); - Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { - link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); - }); - </script> - - <div id="content" class="content"> - <main> - {{{ content }}} - </main> - - <nav class="nav-wrapper" aria-label="Page navigation"> - <!-- Mobile navigation buttons --> - {{#previous}} - <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> - <i class="fa fa-angle-left"></i> - </a> - {{/previous}} - - {{#next}} - <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> - <i class="fa fa-angle-right"></i> - </a> - {{/next}} - - <div style="clear: both"></div> - </nav> - </div> - </div> - - <nav class="nav-wide-wrapper" aria-label="Page navigation"> - {{#previous}} - <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> - <i class="fa fa-angle-left"></i> - </a> - {{/previous}} - - {{#next}} - <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> - <i class="fa fa-angle-right"></i> - </a> - {{/next}} - </nav> - -</div> - -{{#if live_reload_endpoint}} -<!-- Livereload script (if served using the cli tool) --> -<script type="text/javascript"> - const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; - const wsAddress = wsProtocol + "//" + location.host + "/" + "{{{live_reload_endpoint}}}"; - const socket = new WebSocket(wsAddress); - socket.onmessage = function (event) { - if (event.data === "reload") { - socket.close(); - location.reload(); - } - }; - - window.onbeforeunload = function() { - socket.close(); - } -</script> -{{/if}} - -{{#if google_analytics}} -<!-- Google Analytics Tag --> -<script type="text/javascript"> - var localAddrs = ["localhost", "127.0.0.1", ""]; - - // make sure we don't activate google analytics if the developer is - // inspecting the book locally... - if (localAddrs.indexOf(document.location.hostname) === -1) { - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); - - ga('create', '{{google_analytics}}', 'auto'); - ga('send', 'pageview'); - } -</script> -{{/if}} - -{{#if playground_line_numbers}} -<script type="text/javascript"> - window.playground_line_numbers = true; -</script> -{{/if}} - -{{#if playground_copyable}} -<script type="text/javascript"> - window.playground_copyable = true; -</script> -{{/if}} - -{{#if playground_js}} -<script src="{{ path_to_root }}ace.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}editor.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}mode-rust.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}theme-dawn.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}theme-tomorrow_night.js" type="text/javascript" charset="utf-8"></script> -{{/if}} - -{{#if search_js}} -<script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script> -{{/if}} - -<script src="{{ path_to_root }}clipboard.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}highlight.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script> - -<!-- Custom JS scripts --> -{{#each additional_js}} -<script type="text/javascript" src="{{ ../path_to_root }}{{this}}"></script> -{{/each}} - -{{#if is_print}} -{{#if mathjax_support}} -<script type="text/javascript"> -window.addEventListener('load', function() { - MathJax.Hub.Register.StartupHook('End', function() { - window.setTimeout(window.print, 100); - }); -}); -</script> -{{else}} -<script type="text/javascript"> -window.addEventListener('load', function() { - window.setTimeout(window.print, 100); -}); -</script> -{{/if}} -{{/if}} diff --git a/website/doc/es/book.toml b/website/doc/es/book.toml deleted file mode 100644 index 6a171b33..00000000 --- a/website/doc/es/book.toml +++ /dev/null @@ -1,8 +0,0 @@ -[book] -authors = ["Manuel Cillero"] -language = "es" -src = "src" -title = "Guías de PageTop" - -[build] -build-dir = "../../static/doc/es" diff --git a/website/doc/es/src/404.md b/website/doc/es/src/404.md deleted file mode 100644 index a55db44e..00000000 --- a/website/doc/es/src/404.md +++ /dev/null @@ -1,3 +0,0 @@ -# Document not found (404) - -This URL is invalid, sorry. Try the search instead! \ No newline at end of file diff --git a/website/doc/es/src/README.md b/website/doc/es/src/README.md deleted file mode 100644 index a3aeb68d..00000000 --- a/website/doc/es/src/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Introduction - -**mdBook** is a command line tool to create books with Markdown. -It is ideal for creating product or API documentation, tutorials, course materials or anything that requires a clean, -easily navigable and customizable presentation. - -* Lightweight [Markdown] syntax helps you focus more on your content -* Integrated [search] support -* Color [syntax highlighting] for code blocks for many different languages -* [Theme] files allow customizing the formatting of the output -* [Preprocessors] can provide extensions for custom syntax and modifying content -* [Backends] can render the output to multiple formats -* Written in [Rust] for speed, safety, and simplicity -* Automated testing of [Rust code samples] - -This guide is an example of what mdBook produces. -mdBook is used by the Rust programming language project, and [The Rust Programming Language][trpl] book is another fine example of mdBook in action. - -[Markdown]: format/markdown.md -[search]: guide/reading.md#search -[syntax highlighting]: format/theme/syntax-highlighting.md -[theme]: format/theme/index.html -[preprocessors]: format/configuration/preprocessors.md -[backends]: format/configuration/renderers.md -[Rust]: https://www.rust-lang.org/ -[trpl]: https://doc.rust-lang.org/book/ -[Rust code samples]: cli/test.md - -## Contributing - -mdBook is free and open source. You can find the source code on -[GitHub](https://github.com/rust-lang/mdBook) and issues and feature requests can be posted on -the [GitHub issue tracker](https://github.com/rust-lang/mdBook/issues). mdBook relies on the community to fix bugs and -add features: if you'd like to contribute, please read -the [CONTRIBUTING](https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md) guide and consider opening -a [pull request](https://github.com/rust-lang/mdBook/pulls). - -## License - -The mdBook source and documentation are released under -the [Mozilla Public License v2.0](https://www.mozilla.org/MPL/2.0/). diff --git a/website/doc/es/src/SUMMARY.md b/website/doc/es/src/SUMMARY.md deleted file mode 100644 index 974d65fa..00000000 --- a/website/doc/es/src/SUMMARY.md +++ /dev/null @@ -1,43 +0,0 @@ -# Summary - -[Introduction](README.md) - -# User Guide - -- [Installation](guide/installation.md) -- [Reading Books](guide/reading.md) -- [Creating a Book](guide/creating.md) - -# Reference Guide - -- [Command Line Tool](cli/README.md) - - [init](cli/init.md) - - [build](cli/build.md) - - [watch](cli/watch.md) - - [serve](cli/serve.md) - - [test](cli/test.md) - - [clean](cli/clean.md) - - [completions](cli/completions.md) -- [Format](format/README.md) - - [SUMMARY.md](format/summary.md) - - [Draft chapter]() - - [Configuration](format/configuration/README.md) - - [General](format/configuration/general.md) - - [Preprocessors](format/configuration/preprocessors.md) - - [Renderers](format/configuration/renderers.md) - - [Environment Variables](format/configuration/environment-variables.md) - - [Theme](format/theme/README.md) - - [index.hbs](format/theme/index-hbs.md) - - [Syntax highlighting](format/theme/syntax-highlighting.md) - - [Editor](format/theme/editor.md) - - [MathJax Support](format/mathjax.md) - - [mdBook-specific features](format/mdbook.md) - - [Markdown](format/markdown.md) -- [Continuous Integration](continuous-integration.md) -- [For Developers](for_developers/README.md) - - [Preprocessors](for_developers/preprocessors.md) - - [Alternative Backends](for_developers/backends.md) - ------------ - -[Contributors](misc/contributors.md) diff --git a/website/doc/es/src/cli/README.md b/website/doc/es/src/cli/README.md deleted file mode 100644 index 2fbe3781..00000000 --- a/website/doc/es/src/cli/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Command Line Tool - -The `mdbook` command-line tool is used to create and build books. -After you have [installed](../guide/installation.md) `mdbook`, you can run the `mdbook help` command in your terminal to view the available commands. - -This following sections provide in-depth information on the different commands available. - -* [`mdbook init <directory>`](init.md) — Creates a new book with minimal boilerplate to start with. -* [`mdbook build`](build.md) — Renders the book. -* [`mdbook watch`](watch.md) — Rebuilds the book any time a source file changes. -* [`mdbook serve`](serve.md) — Runs a web server to view the book, and rebuilds on changes. -* [`mdbook test`](test.md) — Tests Rust code samples. -* [`mdbook clean`](clean.md) — Deletes the rendered output. -* [`mdbook completions`](completions.md) — Support for shell auto-completion. diff --git a/website/doc/es/src/cli/build.md b/website/doc/es/src/cli/build.md deleted file mode 100644 index 71f1c48c..00000000 --- a/website/doc/es/src/cli/build.md +++ /dev/null @@ -1,40 +0,0 @@ -# The build command - -The build command is used to render your book: - -```bash -mdbook build -``` - -It will try to parse your `SUMMARY.md` file to understand the structure of your -book and fetch the corresponding files. Note that files mentioned in `SUMMARY.md` -but not present will be created. - -The rendered output will maintain the same directory structure as the source for -convenience. Large books will therefore remain structured when rendered. - -#### Specify a directory - -The `build` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook build path/to/book -``` - -#### --open - -When you use the `--open` (`-o`) flag, mdbook will open the rendered book in -your default web browser after building it. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. - -------------------- - -***Note:*** *The build command copies all files (excluding files with `.md` extension) from the source directory -into the build directory.* diff --git a/website/doc/es/src/cli/clean.md b/website/doc/es/src/cli/clean.md deleted file mode 100644 index 23efc450..00000000 --- a/website/doc/es/src/cli/clean.md +++ /dev/null @@ -1,30 +0,0 @@ -# The clean command - -The clean command is used to delete the generated book and any other build -artifacts. - -```bash -mdbook clean -``` - -#### Specify a directory - -The `clean` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook clean path/to/book -``` - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to override the book's output -directory, which will be deleted by this command. Relative paths are interpreted -relative to the book's root directory. If not specified it will default to the -value of the `build.build-dir` key in `book.toml`, or to `./book`. - -```bash -mdbook clean --dest-dir=path/to/book -``` - -`path/to/book` could be absolute or relative. \ No newline at end of file diff --git a/website/doc/es/src/cli/completions.md b/website/doc/es/src/cli/completions.md deleted file mode 100644 index 1246b1ee..00000000 --- a/website/doc/es/src/cli/completions.md +++ /dev/null @@ -1,16 +0,0 @@ -# The completions command - -The completions command is used to generate auto-completions for some common shells. -This means when you type `mdbook` in your shell, you can then press your shell's auto-complete key (usually the Tab key) and it may display what the valid options are, or finish partial input. - -The completions first need to be installed for your shell: - -```bash -mdbook completions bash > ~/.local/share/bash-completion/completions/mdbook -``` - -The command prints a completion script for the given shell. -Run `mdbook completions --help` for a list of supported shells. - -Where to place the completions depend on which shell you are using and your operating system. -Consult your shell's documentation for more information one where to place the script. diff --git a/website/doc/es/src/cli/init.md b/website/doc/es/src/cli/init.md deleted file mode 100644 index 99c0be09..00000000 --- a/website/doc/es/src/cli/init.md +++ /dev/null @@ -1,70 +0,0 @@ -# The init command - -There is some minimal boilerplate that is the same for every new book. It's for -this purpose that mdBook includes an `init` command. - -The `init` command is used like this: - -```bash -mdbook init -``` - -When using the `init` command for the first time, a couple of files will be set -up for you: -```bash -book-test/ -├── book -└── src - ├── chapter_1.md - └── SUMMARY.md -``` - -- The `src` directory is where you write your book in markdown. It contains all - the source files, configuration files, etc. - -- The `book` directory is where your book is rendered. All the output is ready - to be uploaded to a server to be seen by your audience. - -- The `SUMMARY.md` is the skeleton of your - book, and is discussed in more detail [in another - chapter](../format/summary.md). - -#### Tip: Generate chapters from SUMMARY.md - -When a `SUMMARY.md` file already exists, the `init` command will first parse it -and generate the missing files according to the paths used in the `SUMMARY.md`. -This allows you to think and create the whole structure of your book and then -let mdBook generate it for you. - -#### Specify a directory - -The `init` command can take a directory as an argument to use as the book's root -instead of the current working directory. - -```bash -mdbook init path/to/book -``` - -#### --theme - -When you use the `--theme` flag, the default theme will be copied into a -directory called `theme` in your source directory so that you can modify it. - -The theme is selectively overwritten, this means that if you don't want to -overwrite a specific file, just delete it and the default file will be used. - -#### --title - -Specify a title for the book. If not supplied, an interactive prompt will ask for -a title. - -```bash -mdbook init --title="my amazing book" -``` - -#### --ignore - -Create a `.gitignore` file configured to ignore the `book` directory created when [building] a book. -If not supplied, an interactive prompt will ask whether it should be created. - -[building]: build.md diff --git a/website/doc/es/src/cli/serve.md b/website/doc/es/src/cli/serve.md deleted file mode 100644 index 62ea26c2..00000000 --- a/website/doc/es/src/cli/serve.md +++ /dev/null @@ -1,56 +0,0 @@ -# The serve command - -The serve command is used to preview a book by serving it via HTTP at -`localhost:3000` by default: - -```bash -mdbook serve -``` - -The `serve` command watches the book's `src` directory for -changes, rebuilding the book and refreshing clients for each change; this includes -re-creating deleted files still mentioned in `SUMMARY.md`! A websocket -connection is used to trigger the client-side refresh. - -***Note:*** *The `serve` command is for testing a book's HTML output, and is not -intended to be a complete HTTP server for a website.* - -#### Specify a directory - -The `serve` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook serve path/to/book -``` - -### Server options - -The `serve` hostname defaults to `localhost`, and the port defaults to `3000`. Either option can be specified on the command line: - -```bash -mdbook serve path/to/book -p 8000 -n 127.0.0.1 -``` - -#### --open - -When you use the `--open` (`-o`) flag, mdbook will open the book in your -default web browser after starting the server. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. - -#### Specify exclude patterns - -The `serve` command will not automatically trigger a build for files listed in -the `.gitignore` file in the book root directory. The `.gitignore` file may -contain file patterns described in the [gitignore -documentation](https://git-scm.com/docs/gitignore). This can be useful for -ignoring temporary files created by some editors. - -***Note:*** *Only the `.gitignore` from the book root directory is used. Global -`$HOME/.gitignore` or `.gitignore` files in parent directories are not used.* diff --git a/website/doc/es/src/cli/test.md b/website/doc/es/src/cli/test.md deleted file mode 100644 index e134dc9b..00000000 --- a/website/doc/es/src/cli/test.md +++ /dev/null @@ -1,63 +0,0 @@ -# The test command - -When writing a book, you sometimes need to automate some tests. For example, -[The Rust Programming Book](https://doc.rust-lang.org/stable/book/) uses a lot -of code examples that could get outdated. Therefore it is very important for -them to be able to automatically test these code examples. - -mdBook supports a `test` command that will run all available tests in a book. At -the moment, only rustdoc tests are supported, but this may be expanded upon in -the future. - -#### Disable tests on a code block - -rustdoc doesn't test code blocks which contain the `ignore` attribute: - - ```rust,ignore - fn main() {} - ``` - -rustdoc also doesn't test code blocks which specify a language other than Rust: - - ```markdown - **Foo**: _bar_ - ``` - -rustdoc *does* test code blocks which have no language specified: - - ``` - This is going to cause an error! - ``` - -#### Specify a directory - -The `test` command can take a directory as an argument to use as the book's root -instead of the current working directory. - -```bash -mdbook test path/to/book -``` - -#### --library-path - -The `--library-path` (`-L`) option allows you to add directories to the library -search path used by `rustdoc` when it builds and tests the examples. Multiple -directories can be specified with multiple options (`-L foo -L bar`) or with a -comma-delimited list (`-L foo,bar`). The path should point to the Cargo -[build cache](https://doc.rust-lang.org/cargo/guide/build-cache.html) `deps` directory that -contains the build output of your project. For example, if your Rust project's book is in a directory -named `my-book`, the following command would include the crate's dependencies when running `test`: - -```shell -mdbook test my-book -L target/debug/deps/ -``` - -See the `rustdoc` command-line [documentation](https://doc.rust-lang.org/rustdoc/command-line-arguments.html#-l--library-path-where-to-look-for-dependencies) -for more information. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. diff --git a/website/doc/es/src/cli/watch.md b/website/doc/es/src/cli/watch.md deleted file mode 100644 index 3522f43c..00000000 --- a/website/doc/es/src/cli/watch.md +++ /dev/null @@ -1,40 +0,0 @@ -# The watch command - -The `watch` command is useful when you want your book to be rendered on every -file change. You could repeatedly issue `mdbook build` every time a file is -changed. But using `mdbook watch` once will watch your files and will trigger a -build automatically whenever you modify a file; this includes re-creating -deleted files still mentioned in `SUMMARY.md`! - -#### Specify a directory - -The `watch` command can take a directory as an argument to use as the book's -root instead of the current working directory. - -```bash -mdbook watch path/to/book -``` - -#### --open - -When you use the `--open` (`-o`) option, mdbook will open the rendered book in -your default web browser. - -#### --dest-dir - -The `--dest-dir` (`-d`) option allows you to change the output directory for the -book. Relative paths are interpreted relative to the book's root directory. If -not specified it will default to the value of the `build.build-dir` key in -`book.toml`, or to `./book`. - - -#### Specify exclude patterns - -The `watch` command will not automatically trigger a build for files listed in -the `.gitignore` file in the book root directory. The `.gitignore` file may -contain file patterns described in the [gitignore -documentation](https://git-scm.com/docs/gitignore). This can be useful for -ignoring temporary files created by some editors. - -_Note: Only `.gitignore` from book root directory is used. Global -`$HOME/.gitignore` or `.gitignore` files in parent directories are not used._ diff --git a/website/doc/es/src/continuous-integration.md b/website/doc/es/src/continuous-integration.md deleted file mode 100644 index c39cb010..00000000 --- a/website/doc/es/src/continuous-integration.md +++ /dev/null @@ -1,121 +0,0 @@ -# Running `mdbook` in Continuous Integration - -There are a variety of services such as [GitHub Actions] or [GitLab CI/CD] which can be used to test and deploy your book automatically. - -The following provides some general guidelines on how to configure your service to run mdBook. -Specific recipes can be found at the [Automated Deployment] wiki page. - -[GitHub Actions]: https://docs.github.com/en/actions -[GitLab CI/CD]: https://docs.gitlab.com/ee/ci/ -[Automated Deployment]: https://github.com/rust-lang/mdBook/wiki/Automated-Deployment - -## Installing mdBook - -There are several different strategies for installing mdBook. -The particular method depends on your needs and preferences. - -### Pre-compiled binaries - -Perhaps the easiest method is to use the pre-compiled binaries found on the [GitHub Releases page][releases]. -A simple approach would be to use the popular `curl` CLI tool to download the executable: - -```sh -mkdir bin -curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.21/mdbook-v0.4.21-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin -bin/mdbook build -``` - -Some considerations for this approach: - -* This is relatively fast, and does not necessarily require dealing with caching. -* This does not require installing Rust. -* Specifying a specific URL means you have to manually update your script to get a new version. - This may be a benefit if you want to lock to a specific version. - However, some users prefer to automatically get a newer version when they are published. -* You are reliant on the GitHub CDN being available. - -[releases]: https://github.com/rust-lang/mdBook/releases - -### Building from source - -Building from source will require having Rust installed. -Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. - -After Rust is installed, `cargo install` can be used to build and install mdBook. -We recommend using a SemVer version specifier so that you get the latest **non-breaking** version of mdBook. -For example: - -```sh -cargo install mdbook --no-default-features --features search --vers "^0.4" --locked -``` - -This includes several recommended options: - -* `--no-default-features` — Disables features like the HTTP server used by `mdbook serve` that is likely not needed on CI. - This will speed up the build time significantly. -* `--features search` — Disabling default features means you should then manually enable features that you want, such as the built-in [search] capability. -* `--vers "^0.4"` — This will install the most recent version of the `0.4` series. - However, versions after like `0.5.0` won't be installed, as they may break your build. - Cargo will automatically upgrade mdBook if you have an older version already installed. -* `--locked` — This will use the dependencies that were used when mdBook was released. - Without `--locked`, it will use the latest version of all dependencies, which may include some fixes since the last release, but may also (rarely) cause build problems. - -You will likely want to investigate caching options, as building mdBook can be somewhat slow. - -[search]: guide/reading.md#search - -## Running tests - -You may want to run tests using [`mdbook test`] every time you push a change or create a pull request. -This can be used to validate Rust code examples in the book. - -This will require having Rust installed. -Some services have Rust pre-installed, but if your service does not, you will need to add a step to install it. - -Other than making sure the appropriate version of Rust is installed, there's not much more than just running `mdbook test` from the book directory. - -You may also want to consider running other kinds of tests, like [mdbook-linkcheck] which will check for broken links. -Or if you have your own style checks, spell checker, or any other tests it might be good to run them in CI. - -[`mdbook test`]: cli/test.md -[mdbook-linkcheck]: https://github.com/Michael-F-Bryan/mdbook-linkcheck#continuous-integration - -## Deploying - -You may want to automatically deploy your book. -Some may want to do this with every time a change is pushed, and others may want to only deploy when a specific release is tagged. - -You'll also need to understand the specifics on how to push a change to your web service. -For example, [GitHub Pages] just requires committing the output onto a specific git branch. -Other services may require using something like SSH to connect to a remote server. - -The basic outline is that you need to run `mdbook build` to generate the output, and then transfer the files (which are in the `book` directory) to the correct location. - -You may then want to consider if you need to invalidate any caches on your web service. - -See the [Automated Deployment] wiki page for examples of various different services. - -[GitHub Pages]: https://docs.github.com/en/pages - -### 404 handling - -mdBook automatically generates a 404 page to be used for broken links. -The default output is a file named `404.html` at the root of the book. -Some services like [GitHub Pages] will automatically use this page for broken links. -For other services, you may want to consider configuring the web server to use this page as it will provide the reader navigation to get back to the book. - -If your book is not deployed at the root of the domain, then you should set the [`output.html.site-url`] setting so that the 404 page works correctly. -It needs to know where the book is deployed in order to load the static files (like CSS) correctly. -For example, this guide is deployed at <https://rust-lang.github.io/mdBook/>, and the `site-url` setting is configured like this: - -```toml -# book.toml -[output.html] -site-url = "/mdBook/" -``` - -You can customize the look of the 404 page by creating a file named `src/404.md` in your book. -If you want to use a different filename, you can set [`output.html.input-404`] to a different filename. - -[`output.html.site-url`]: format/configuration/renderers.md#html-renderer-options -[`output.html.input-404`]: format/configuration/renderers.md#html-renderer-options diff --git a/website/doc/es/src/for_developers/README.md b/website/doc/es/src/for_developers/README.md deleted file mode 100644 index d8b97709..00000000 --- a/website/doc/es/src/for_developers/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# For Developers - -While `mdbook` is mainly used as a command line tool, you can also import the -underlying library directly and use that to manage a book. It also has a fairly -flexible plugin mechanism, allowing you to create your own custom tooling and -consumers (often referred to as *backends*) if you need to do some analysis of -the book or render it in a different format. - -The *For Developers* chapters are here to show you the more advanced usage of -`mdbook`. - -The two main ways a developer can hook into the book's build process is via, - -- [Preprocessors](preprocessors.md) -- [Alternative Backends](backends.md) - - -## The Build Process - -The process of rendering a book project goes through several steps. - -1. Load the book - - Parse the `book.toml`, falling back to the default `Config` if it doesn't - exist - - Load the book chapters into memory - - Discover which preprocessors/backends should be used -2. For each backend: - 1. Run all the preprocessors. - 2. Call the backend to render the processed result. - - -## Using `mdbook` as a Library - -The `mdbook` binary is just a wrapper around the `mdbook` crate, exposing its -functionality as a command-line program. As such it is quite easy to create your -own programs which use `mdbook` internally, adding your own functionality (e.g. -a custom preprocessor) or tweaking the build process. - -The easiest way to find out how to use the `mdbook` crate is by looking at the -[API Docs]. The top level documentation explains how one would use the -[`MDBook`] type to load and build a book, while the [config] module gives a good -explanation on the configuration system. - - -[`MDBook`]: https://docs.rs/mdbook/*/mdbook/book/struct.MDBook.html -[API Docs]: https://docs.rs/mdbook/*/mdbook/ -[config]: https://docs.rs/mdbook/*/mdbook/config/index.html diff --git a/website/doc/es/src/for_developers/backends.md b/website/doc/es/src/for_developers/backends.md deleted file mode 100644 index 78326a36..00000000 --- a/website/doc/es/src/for_developers/backends.md +++ /dev/null @@ -1,346 +0,0 @@ -# Alternative Backends - -A "backend" is simply a program which `mdbook` will invoke during the book -rendering process. This program is passed a JSON representation of the book and -configuration information via `stdin`. Once the backend receives this -information it is free to do whatever it wants. - -See [Configuring Renderers](../format/configuration/renderers.md) for more information about using backends. - -The community has developed several backends. -See the [Third Party Plugins] wiki page for a list of available backends. - -## Setting Up - -This page will step you through creating your own alternative backend in the form -of a simple word counting program. Although it will be written in Rust, there's -no reason why it couldn't be accomplished using something like Python or Ruby. - -First you'll want to create a new binary program and add `mdbook` as a -dependency. - -```shell -$ cargo new --bin mdbook-wordcount -$ cd mdbook-wordcount -$ cargo add mdbook -``` - -When our `mdbook-wordcount` plugin is invoked, `mdbook` will send it a JSON -version of [`RenderContext`] via our plugin's `stdin`. For convenience, there's -a [`RenderContext::from_json()`] constructor which will load a `RenderContext`. - -This is all the boilerplate necessary for our backend to load the book. - -```rust -// src/main.rs -extern crate mdbook; - -use std::io; -use mdbook::renderer::RenderContext; - -fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); -} -``` - -> **Note:** The `RenderContext` contains a `version` field. This lets backends - figure out whether they are compatible with the version of `mdbook` it's being - called by. This `version` comes directly from the corresponding field in - `mdbook`'s `Cargo.toml`. - - It is recommended that backends use the [`semver`] crate to inspect this field - and emit a warning if there may be a compatibility issue. - - -## Inspecting the Book - -Now our backend has a copy of the book, lets count how many words are in each -chapter! - -Because the `RenderContext` contains a [`Book`] field (`book`), and a `Book` has -the [`Book::iter()`] method for iterating over all items in a `Book`, this step -turns out to be just as easy as the first. - -```rust - -fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - } - } -} - -fn count_words(ch: &Chapter) -> usize { - ch.content.split_whitespace().count() -} -``` - - -## Enabling the Backend - -Now we've got the basics running, we want to actually use it. First, install the -program. - -```shell -$ cargo install --path . -``` - -Then `cd` to the particular book you'd like to count the words of and update its -`book.toml` file. - -```diff - [book] - title = "mdBook Documentation" - description = "Create book from markdown files. Like Gitbook but implemented in Rust" - authors = ["Mathieu David", "Michael-F-Bryan"] - -+ [output.html] - -+ [output.wordcount] -``` - -When it loads a book into memory, `mdbook` will inspect your `book.toml` file to -try and figure out which backends to use by looking for all `output.*` tables. -If none are provided it'll fall back to using the default HTML renderer. - -Notably, this means if you want to add your own custom backend you'll also need -to make sure to add the HTML backend, even if its table just stays empty. - -Now you just need to build your book like normal, and everything should *Just -Work*. - -```shell -$ mdbook build -... -2018-01-16 07:31:15 [INFO] (mdbook::renderer): Invoking the "mdbook-wordcount" renderer -mdBook: 126 -Command Line Tool: 224 -init: 283 -build: 145 -watch: 146 -serve: 292 -test: 139 -Format: 30 -SUMMARY.md: 259 -Configuration: 784 -Theme: 304 -index.hbs: 447 -Syntax highlighting: 314 -MathJax Support: 153 -Rust code specific features: 148 -For Developers: 788 -Alternative Backends: 710 -Contributors: 85 -``` - -The reason we didn't need to specify the full name/path of our `wordcount` -backend is because `mdbook` will try to *infer* the program's name via -convention. The executable for the `foo` backend is typically called -`mdbook-foo`, with an associated `[output.foo]` entry in the `book.toml`. To -explicitly tell `mdbook` what command to invoke (it may require command-line -arguments or be an interpreted script), you can use the `command` field. - -```diff - [book] - title = "mdBook Documentation" - description = "Create book from markdown files. Like Gitbook but implemented in Rust" - authors = ["Mathieu David", "Michael-F-Bryan"] - - [output.html] - - [output.wordcount] -+ command = "python /path/to/wordcount.py" -``` - - -## Configuration - -Now imagine you don't want to count the number of words on a particular chapter -(it might be generated text/code, etc). The canonical way to do this is via the -usual `book.toml` configuration file by adding items to your `[output.foo]` -table. - -The `Config` can be treated roughly as a nested hashmap which lets you call -methods like `get()` to access the config's contents, with a -`get_deserialized()` convenience method for retrieving a value and automatically -deserializing to some arbitrary type `T`. - -To implement this, we'll create our own serializable `WordcountConfig` struct -which will encapsulate all configuration for this backend. - -First add `serde` and `serde_derive` to your `Cargo.toml`, - -``` -$ cargo add serde serde_derive -``` - -And then you can create the config struct, - -```rust -extern crate serde; -#[macro_use] -extern crate serde_derive; - -... - -#[derive(Debug, Default, Serialize, Deserialize)] -#[serde(default, rename_all = "kebab-case")] -pub struct WordcountConfig { - pub ignores: Vec<String>, -} -``` - -Now we just need to deserialize the `WordcountConfig` from our `RenderContext` -and then add a check to make sure we skip ignored chapters. - -```diff - fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); -+ let cfg: WordcountConfig = ctx.config -+ .get_deserialized("output.wordcount") -+ .unwrap_or_default(); - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { -+ if cfg.ignores.contains(&ch.name) { -+ continue; -+ } -+ - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - } - } - } -``` - - -## Output and Signalling Failure - -While it's nice to print word counts to the terminal when a book is built, it -might also be a good idea to output them to a file somewhere. `mdbook` tells a -backend where it should place any generated output via the `destination` field -in [`RenderContext`]. - -```diff -+ use std::fs::{self, File}; -+ use std::io::{self, Write}; -- use std::io; - use mdbook::renderer::RenderContext; - use mdbook::book::{BookItem, Chapter}; - - fn main() { - ... - -+ let _ = fs::create_dir_all(&ctx.destination); -+ let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); -+ - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - ... - - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); -+ writeln!(f, "{}: {}", ch.name, num_words).unwrap(); - } - } - } -``` - -> **Note:** There is no guarantee that the destination directory exists or is -> empty (`mdbook` may leave the previous contents to let backends do caching), -> so it's always a good idea to create it with `fs::create_dir_all()`. -> -> If the destination directory already exists, don't assume it will be empty. -> To allow backends to cache the results from previous runs, `mdbook` may leave -> old content in the directory. - -There's always the possibility that an error will occur while processing a book -(just look at all the `unwrap()`'s we've written already), so `mdbook` will -interpret a non-zero exit code as a rendering failure. - -For example, if we wanted to make sure all chapters have an *even* number of -words, erroring out if an odd number is encountered, then you may do something -like this: - -```diff -+ use std::process; - ... - - fn main() { - ... - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - ... - - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - writeln!(f, "{}: {}", ch.name, num_words).unwrap(); - -+ if cfg.deny_odds && num_words % 2 == 1 { -+ eprintln!("{} has an odd number of words!", ch.name); -+ process::exit(1); - } - } - } - } - - #[derive(Debug, Default, Serialize, Deserialize)] - #[serde(default, rename_all = "kebab-case")] - pub struct WordcountConfig { - pub ignores: Vec<String>, -+ pub deny_odds: bool, - } -``` - -Now, if we reinstall the backend and build a book, - -```shell -$ cargo install --path . --force -$ mdbook build /path/to/book -... -2018-01-16 21:21:39 [INFO] (mdbook::renderer): Invoking the "wordcount" renderer -mdBook: 126 -Command Line Tool: 224 -init: 283 -init has an odd number of words! -2018-01-16 21:21:39 [ERROR] (mdbook::renderer): Renderer exited with non-zero return code. -2018-01-16 21:21:39 [ERROR] (mdbook::utils): Error: Rendering failed -2018-01-16 21:21:39 [ERROR] (mdbook::utils): Caused By: The "mdbook-wordcount" renderer failed -``` - -As you've probably already noticed, output from the plugin's subprocess is -immediately passed through to the user. It is encouraged for plugins to follow -the "rule of silence" and only generate output when necessary (e.g. an error in -generation or a warning). - -All environment variables are passed through to the backend, allowing you to use -the usual `RUST_LOG` to control logging verbosity. - -## Wrapping Up - -Although contrived, hopefully this example was enough to show how you'd create -an alternative backend for `mdbook`. If you feel it's missing something, don't -hesitate to create an issue in the [issue tracker] so we can improve the user -guide. - -The existing backends mentioned towards the start of this chapter should serve -as a good example of how it's done in real life, so feel free to skim through -the source code or ask questions. - - -[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins -[`RenderContext`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html -[`RenderContext::from_json()`]: https://docs.rs/mdbook/*/mdbook/renderer/struct.RenderContext.html#method.from_json -[`semver`]: https://crates.io/crates/semver -[`Book`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html -[`Book::iter()`]: https://docs.rs/mdbook/*/mdbook/book/struct.Book.html#method.iter -[`Config`]: https://docs.rs/mdbook/*/mdbook/config/struct.Config.html -[issue tracker]: https://github.com/rust-lang/mdBook/issues diff --git a/website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml b/website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml deleted file mode 100644 index e58e73b6..00000000 --- a/website/doc/es/src/for_developers/mdbook-wordcount/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "mdbook-wordcount" -version = "0.1.0" -authors = ["Michael Bryan <michaelfbryan@gmail.com>"] - -[dependencies] -mdbook = { path = "../../../..", version = "*" } -serde = "1.0" -serde_derive = "1.0" diff --git a/website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs b/website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs deleted file mode 100644 index 607338dd..00000000 --- a/website/doc/es/src/for_developers/mdbook-wordcount/src/main.rs +++ /dev/null @@ -1,49 +0,0 @@ -extern crate mdbook; -extern crate serde; -#[macro_use] -extern crate serde_derive; - -use std::process; -use std::fs::{self, File}; -use std::io::{self, Write}; -use mdbook::renderer::RenderContext; -use mdbook::book::{BookItem, Chapter}; - -fn main() { - let mut stdin = io::stdin(); - let ctx = RenderContext::from_json(&mut stdin).unwrap(); - let cfg: WordcountConfig = ctx.config - .get_deserialized("output.wordcount") - .unwrap_or_default(); - - let _ = fs::create_dir_all(&ctx.destination); - let mut f = File::create(ctx.destination.join("wordcounts.txt")).unwrap(); - - for item in ctx.book.iter() { - if let BookItem::Chapter(ref ch) = *item { - if cfg.ignores.contains(&ch.name) { - continue; - } - - let num_words = count_words(ch); - println!("{}: {}", ch.name, num_words); - writeln!(f, "{}: {}", ch.name, num_words).unwrap(); - - if cfg.deny_odds && num_words % 2 == 1 { - eprintln!("{} has an odd number of words!", ch.name); - process::exit(1); - } - } - } -} - -fn count_words(ch: &Chapter) -> usize { - ch.content.split_whitespace().count() -} - -#[derive(Debug, Default, Serialize, Deserialize)] -#[serde(default, rename_all = "kebab-case")] -pub struct WordcountConfig { - pub ignores: Vec<String>, - pub deny_odds: bool, -} diff --git a/website/doc/es/src/for_developers/preprocessors.md b/website/doc/es/src/for_developers/preprocessors.md deleted file mode 100644 index dbe78779..00000000 --- a/website/doc/es/src/for_developers/preprocessors.md +++ /dev/null @@ -1,126 +0,0 @@ -# Preprocessors - -A *preprocessor* is simply a bit of code which gets run immediately after the -book is loaded and before it gets rendered, allowing you to update and mutate -the book. Possible use cases are: - -- Creating custom helpers like `\{{#include /path/to/file.md}}` -- Substituting in latex-style expressions (`$$ \frac{1}{3} $$`) with their - mathjax equivalents - -See [Configuring Preprocessors](../format/configuration/preprocessors.md) for more information about using preprocessors. - -## Hooking Into MDBook - -MDBook uses a fairly simple mechanism for discovering third party plugins. -A new table is added to `book.toml` (e.g. `[preprocessor.foo]` for the `foo` -preprocessor) and then `mdbook` will try to invoke the `mdbook-foo` program as -part of the build process. - -Once the preprocessor has been defined and the build process starts, mdBook executes the command defined in the `preprocessor.foo.command` key twice. -The first time it runs the preprocessor to determine if it supports the given renderer. -mdBook passes two arguments to the process: the first argument is the string `supports` and the second argument is the renderer name. -The preprocessor should exit with a status code 0 if it supports the given renderer, or return a non-zero exit code if it does not. - -If the preprocessor supports the renderer, then mdbook runs it a second time, passing JSON data into stdin. -The JSON consists of an array of `[context, book]` where `context` is the serialized object [`PreprocessorContext`] and `book` is a [`Book`] object containing the content of the book. - -The preprocessor should return the JSON format of the [`Book`] object to stdout, with any modifications it wishes to perform. - -The easiest way to get started is by creating your own implementation of the -`Preprocessor` trait (e.g. in `lib.rs`) and then creating a shell binary which -translates inputs to the correct `Preprocessor` method. For convenience, there -is [an example no-op preprocessor] in the `examples/` directory which can easily -be adapted for other preprocessors. - -</details> - -## Hints For Implementing A Preprocessor - -By pulling in `mdbook` as a library, preprocessors can have access to the -existing infrastructure for dealing with books. - -For example, a custom preprocessor could use the -[`CmdPreprocessor::parse_input()`] function to deserialize the JSON written to -`stdin`. Then each chapter of the `Book` can be mutated in-place via -[`Book::for_each_mut()`], and then written to `stdout` with the `serde_json` -crate. - -Chapters can be accessed either directly (by recursively iterating over -chapters) or via the `Book::for_each_mut()` convenience method. - -The `chapter.content` is just a string which happens to be markdown. While it's -entirely possible to use regular expressions or do a manual find & replace, -you'll probably want to process the input into something more computer-friendly. -The [`pulldown-cmark`][pc] crate implements a production-quality event-based -Markdown parser, with the [`pulldown-cmark-to-cmark`][pctc] crate allowing you to -translate events back into markdown text. - -The following code block shows how to remove all emphasis from markdown, -without accidentally breaking the document. - -```rust -fn remove_emphasis( - num_removed_items: &mut usize, - chapter: &mut Chapter, -) -> Result<String> { - let mut buf = String::with_capacity(chapter.content.len()); - - let events = Parser::new(&chapter.content).filter(|e| { - let should_keep = match *e { - Event::Start(Tag::Emphasis) - | Event::Start(Tag::Strong) - | Event::End(Tag::Emphasis) - | Event::End(Tag::Strong) => false, - _ => true, - }; - if !should_keep { - *num_removed_items += 1; - } - should_keep - }); - - cmark(events, &mut buf, None).map(|_| buf).map_err(|err| { - Error::from(format!("Markdown serialization failed: {}", err)) - }) -} -``` - -For everything else, have a look [at the complete example][example]. - -## Implementing a preprocessor with a different language - -The fact that mdBook utilizes stdin and stdout to communicate with the preprocessors makes it easy to implement them in a language other than Rust. -The following code shows how to implement a simple preprocessor in Python, which will modify the content of the first chapter. -The example below follows the configuration shown above with `preprocessor.foo.command` actually pointing to a Python script. - -```python -import json -import sys - - -if __name__ == '__main__': - if len(sys.argv) > 1: # we check if we received any argument - if sys.argv[1] == "supports": - # then we are good to return an exit status code of 0, since the other argument will just be the renderer's name - sys.exit(0) - - # load both the context and the book representations from stdin - context, book = json.load(sys.stdin) - # and now, we can just modify the content of the first chapter - book['sections'][0]['Chapter']['content'] = '# Hello' - # we are done with the book's modification, we can just print it to stdout, - print(json.dumps(book)) -``` - - - -[preprocessor-docs]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html -[pc]: https://crates.io/crates/pulldown-cmark -[pctc]: https://crates.io/crates/pulldown-cmark-to-cmark -[example]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs -[an example no-op preprocessor]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs -[`CmdPreprocessor::parse_input()`]: https://docs.rs/mdbook/latest/mdbook/preprocess/trait.Preprocessor.html#method.parse_input -[`Book::for_each_mut()`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html#method.for_each_mut -[`PreprocessorContext`]: https://docs.rs/mdbook/latest/mdbook/preprocess/struct.PreprocessorContext.html -[`Book`]: https://docs.rs/mdbook/latest/mdbook/book/struct.Book.html diff --git a/website/doc/es/src/format/README.md b/website/doc/es/src/format/README.md deleted file mode 100644 index 35757252..00000000 --- a/website/doc/es/src/format/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Format - -In this section you will learn how to: - -- Structure your book correctly -- Format your `SUMMARY.md` file -- Configure your book using `book.toml` -- Customize your theme diff --git a/website/doc/es/src/format/configuration/README.md b/website/doc/es/src/format/configuration/README.md deleted file mode 100644 index 4dcb5852..00000000 --- a/website/doc/es/src/format/configuration/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Configuration - -This section details the configuration options available in the ***book.toml***: -- **[General]** configuration including the `book`, `rust`, `build` sections -- **[Preprocessor]** configuration for default and custom book preprocessors -- **[Renderer]** configuration for the HTML, Markdown and custom renderers -- **[Environment Variable]** configuration for overriding configuration options in your environment - -[General]: general.md -[Preprocessor]: preprocessors.md -[Renderer]: renderers.md -[Environment Variable]: environment-variables.md \ No newline at end of file diff --git a/website/doc/es/src/format/configuration/environment-variables.md b/website/doc/es/src/format/configuration/environment-variables.md deleted file mode 100644 index 3631769b..00000000 --- a/website/doc/es/src/format/configuration/environment-variables.md +++ /dev/null @@ -1,38 +0,0 @@ -# Environment Variables - -All configuration values can be overridden from the command line by setting the -corresponding environment variable. Because many operating systems restrict -environment variables to be alphanumeric characters or `_`, the configuration -key needs to be formatted slightly differently to the normal `foo.bar.baz` form. - -Variables starting with `MDBOOK_` are used for configuration. The key is created -by removing the `MDBOOK_` prefix and turning the resulting string into -`kebab-case`. Double underscores (`__`) separate nested keys, while a single -underscore (`_`) is replaced with a dash (`-`). - -For example: - -- `MDBOOK_foo` -> `foo` -- `MDBOOK_FOO` -> `foo` -- `MDBOOK_FOO__BAR` -> `foo.bar` -- `MDBOOK_FOO_BAR` -> `foo-bar` -- `MDBOOK_FOO_bar__baz` -> `foo-bar.baz` - -So by setting the `MDBOOK_BOOK__TITLE` environment variable you can override the -book's title without needing to touch your `book.toml`. - -> **Note:** To facilitate setting more complex config items, the value of an -> environment variable is first parsed as JSON, falling back to a string if the -> parse fails. -> -> This means, if you so desired, you could override all book metadata when -> building the book with something like -> -> ```shell -> $ export MDBOOK_BOOK="{'title': 'My Awesome Book', authors: ['Michael-F-Bryan']}" -> $ mdbook build -> ``` - -The latter case may be useful in situations where `mdbook` is invoked from a -script or CI, where it sometimes isn't possible to update the `book.toml` before -building. diff --git a/website/doc/es/src/format/configuration/general.md b/website/doc/es/src/format/configuration/general.md deleted file mode 100644 index a00247ec..00000000 --- a/website/doc/es/src/format/configuration/general.md +++ /dev/null @@ -1,110 +0,0 @@ -# General Configuration - -You can configure the parameters for your book in the ***book.toml*** file. - -Here is an example of what a ***book.toml*** file might look like: - -```toml -[book] -title = "Example book" -authors = ["John Doe"] -description = "The example book covers examples." - -[rust] -edition = "2018" - -[build] -build-dir = "my-example-book" -create-missing = false - -[preprocessor.index] - -[preprocessor.links] - -[output.html] -additional-css = ["custom.css"] - -[output.html.search] -limit-results = 15 -``` - -## Supported configuration options - -It is important to note that **any** relative path specified in the -configuration will always be taken relative from the root of the book where the -configuration file is located. - -### General metadata - -This is general information about your book. - -- **title:** The title of the book -- **authors:** The author(s) of the book -- **description:** A description for the book, which is added as meta - information in the html `<head>` of each page -- **src:** By default, the source directory is found in the directory named - `src` directly under the root folder. But this is configurable with the `src` - key in the configuration file. -- **language:** The main language of the book, which is used as a language attribute `<html lang="en">` for example. - -**book.toml** -```toml -[book] -title = "Example book" -authors = ["John Doe", "Jane Doe"] -description = "The example book covers examples." -src = "my-src" # the source files will be found in `root/my-src` instead of `root/src` -language = "en" -``` - -### Rust options - -Options for the Rust language, relevant to running tests and playground -integration. - -```toml -[rust] -edition = "2015" # the default edition for code blocks -``` - -- **edition**: Rust edition to use by default for the code snippets. Default - is "2015". Individual code blocks can be controlled with the `edition2015`, - `edition2018` or `edition2021` annotations, such as: - - ~~~text - ```rust,edition2015 - // This only works in 2015. - let try = true; - ``` - ~~~ - -### Build options - -This controls the build process of your book. - -```toml -[build] -build-dir = "book" # the directory where the output is placed -create-missing = true # whether or not to create missing pages -use-default-preprocessors = true # use the default preprocessors -``` - -- **build-dir:** The directory to put the rendered book in. By default this is - `book/` in the book's root directory. - This can overridden with the `--dest-dir` CLI option. -- **create-missing:** By default, any missing files specified in `SUMMARY.md` - will be created when the book is built (i.e. `create-missing = true`). If this - is `false` then the build process will instead exit with an error if any files - do not exist. -- **use-default-preprocessors:** Disable the default preprocessors of (`links` & - `index`) by setting this option to `false`. - - If you have the same, and/or other preprocessors declared via their table - of configuration, they will run instead. - - - For clarity, with no preprocessor configuration, the default `links` and - `index` will run. - - Setting `use-default-preprocessors = false` will disable these - default preprocessors from running. - - Adding `[preprocessor.links]`, for example, will ensure, regardless of - `use-default-preprocessors` that `links` it will run. diff --git a/website/doc/es/src/format/configuration/preprocessors.md b/website/doc/es/src/format/configuration/preprocessors.md deleted file mode 100644 index f44bdd4f..00000000 --- a/website/doc/es/src/format/configuration/preprocessors.md +++ /dev/null @@ -1,87 +0,0 @@ -# Configuring Preprocessors - -Preprocessors are extensions that can modify the raw Markdown source before it gets sent to the renderer. - -The following preprocessors are built-in and included by default: - -- `links`: Expands the `{{ #playground }}`, `{{ #include }}`, and `{{ #rustdoc_include }}` handlebars - helpers in a chapter to include the contents of a file. - See [Including files] for more. -- `index`: Convert all chapter files named `README.md` into `index.md`. That is - to say, all `README.md` would be rendered to an index file `index.html` in the - rendered book. - -The built-in preprocessors can be disabled with the [`build.use-default-preprocessors`] config option. - -The community has developed several preprocessors. -See the [Third Party Plugins] wiki page for a list of available preprocessors. - -For information on how to create a new preprocessor, see the [Preprocessors for Developers] chapter. - -[Including files]: ../mdbook.md#including-files -[`build.use-default-preprocessors`]: general.md#build-options -[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins -[Preprocessors for Developers]: ../../for_developers/preprocessors.md - -## Custom Preprocessor Configuration - -Preprocessors can be added by including a `preprocessor` table in `book.toml` with the name of the preprocessor. -For example, if you have a preprocessor called `mdbook-example`, then you can include it with: - -```toml -[preprocessor.example] -``` - -With this table, mdBook will execute the `mdbook-example` preprocessor. - -This table can include additional key-value pairs that are specific to the preprocessor. -For example, if our example prepocessor needed some extra configuration options: - -```toml -[preprocessor.example] -some-extra-feature = true -``` - -## Locking a Preprocessor dependency to a renderer - -You can explicitly specify that a preprocessor should run for a renderer by -binding the two together. - -```toml -[preprocessor.example] -renderers = ["html"] # example preprocessor only runs with the HTML renderer -``` - -## Provide Your Own Command - -By default when you add a `[preprocessor.foo]` table to your `book.toml` file, -`mdbook` will try to invoke the `mdbook-foo` executable. If you want to use a -different program name or pass in command-line arguments, this behaviour can -be overridden by adding a `command` field. - -```toml -[preprocessor.random] -command = "python random.py" -``` - -## Require A Certain Order - -The order in which preprocessors are run can be controlled with the `before` and `after` fields. -For example, suppose you want your `linenos` preprocessor to process lines that may have been `{{#include}}`d; then you want it to run after the built-in `links` preprocessor, which you can require using either the `before` or `after` field: - -```toml -[preprocessor.linenos] -after = [ "links" ] -``` - -or - -```toml -[preprocessor.links] -before = [ "linenos" ] -``` - -It would also be possible, though redundant, to specify both of the above in the same config file. - -Preprocessors having the same priority specified through `before` and `after` are sorted by name. -Any infinite loops will be detected and produce an error. diff --git a/website/doc/es/src/format/configuration/renderers.md b/website/doc/es/src/format/configuration/renderers.md deleted file mode 100644 index f1d5ee15..00000000 --- a/website/doc/es/src/format/configuration/renderers.md +++ /dev/null @@ -1,299 +0,0 @@ -# Configuring Renderers - -Renderers (also called "backends") are responsible for creating the output of the book. - -The following backends are built-in: - -* [`html`](#html-renderer-options) — This renders the book to HTML. - This is enabled by default if no other `[output]` tables are defined in `book.toml`. -* [`markdown`](#markdown-renderer) — This outputs the book as markdown after running the preprocessors. - This is useful for debugging preprocessors. - -The community has developed several backends. -See the [Third Party Plugins] wiki page for a list of available backends. - -For information on how to create a new backend, see the [Backends for Developers] chapter. - -[Third Party Plugins]: https://github.com/rust-lang/mdBook/wiki/Third-party-plugins -[Backends for Developers]: ../../for_developers/backends.md - -## Output tables - -Backends can be added by including a `output` table in `book.toml` with the name of the backend. -For example, if you have a backend called `mdbook-wordcount`, then you can include it with: - -```toml -[output.wordcount] -``` - -With this table, mdBook will execute the `mdbook-wordcount` backend. - -This table can include additional key-value pairs that are specific to the backend. -For example, if our example backend needed some extra configuration options: - -```toml -[output.wordcount] -ignores = ["Example Chapter"] -``` - -If you define any `[output]` tables, then the `html` backend is not enabled by default. -If you want to keep the `html` backend running, then just include it in the `book.toml` file. -For example: - -```toml -[book] -title = "My Awesome Book" - -[output.wordcount] - -[output.html] -``` - -If more than one `output` table is included, this changes the behavior for the layout of the output directory. -If there is only one backend, then it places its output directly in the `book` directory (see [`build.build-dir`] to override this location). -If there is more than one backend, then each backend is placed in a separate directory underneath `book`. -For example, the above would have directories `book/html` and `book/wordcount`. - -[`build.build-dir`]: general.md#build-options - -### Custom backend commands - -By default when you add an `[output.foo]` table to your `book.toml` file, -`mdbook` will try to invoke the `mdbook-foo` executable. -If you want to use a different program name or pass in command-line arguments, -this behaviour can be overridden by adding a `command` field. - -```toml -[output.random] -command = "python random.py" -``` - -### Optional backends - -If you enable a backend that isn't installed, the default behavior is to throw an error. -This behavior can be changed by marking the backend as optional: - -```toml -[output.wordcount] -optional = true -``` - -This demotes the error to a warning. - - -## HTML renderer options - -The HTML renderer has a variety of options detailed below. -They should be specified in the `[output.html]` table of the `book.toml` file. - -```toml -# Example book.toml file with all output options. -[book] -title = "Example book" -authors = ["John Doe", "Jane Doe"] -description = "The example book covers examples." - -[output.html] -theme = "my-theme" -default-theme = "light" -preferred-dark-theme = "navy" -curly-quotes = true -mathjax-support = false -copy-fonts = true -additional-css = ["custom.css", "custom2.css"] -additional-js = ["custom.js"] -no-section-label = false -git-repository-url = "https://github.com/rust-lang/mdBook" -git-repository-icon = "fa-github" -edit-url-template = "https://github.com/rust-lang/mdBook/edit/master/guide/{path}" -site-url = "/example-book/" -cname = "myproject.rs" -input-404 = "not-found.md" -``` - -The following configuration options are available: - -- **theme:** mdBook comes with a default theme and all the resource files needed - for it. But if this option is set, mdBook will selectively overwrite the theme - files with the ones found in the specified folder. -- **default-theme:** The theme color scheme to select by default in the - 'Change Theme' dropdown. Defaults to `light`. -- **preferred-dark-theme:** The default dark theme. This theme will be used if - the browser requests the dark version of the site via the - ['prefers-color-scheme'](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme) - CSS media query. Defaults to `navy`. -- **curly-quotes:** Convert straight quotes to curly quotes, except for those - that occur in code blocks and code spans. Defaults to `false`. -- **mathjax-support:** Adds support for [MathJax](../mathjax.md). Defaults to - `false`. -- **copy-fonts:** Copies fonts.css and respective font files to the output directory and use them in the default theme. Defaults to `true`. -- **google-analytics:** This field has been deprecated and will be removed in a future release. - Use the `theme/head.hbs` file to add the appropriate Google Analytics code instead. -- **additional-css:** If you need to slightly change the appearance of your book - without overwriting the whole style, you can specify a set of stylesheets that - will be loaded after the default ones where you can surgically change the - style. -- **additional-js:** If you need to add some behaviour to your book without - removing the current behaviour, you can specify a set of JavaScript files that - will be loaded alongside the default one. -- **no-section-label:** mdBook by defaults adds numeric section labels in the table of - contents column. For example, "1.", "2.1". Set this option to true to disable - those labels. Defaults to `false`. -- **git-repository-url:** A url to the git repository for the book. If provided - an icon link will be output in the menu bar of the book. -- **git-repository-icon:** The FontAwesome icon class to use for the git - repository link. Defaults to `fa-github` which looks like <i class="fa fa-github"></i>. - If you are not using GitHub, another option to consider is `fa-code-fork` which looks like <i class="fa fa-code-fork"></i>. -- **edit-url-template:** Edit url template, when provided shows a - "Suggest an edit" button (which looks like <i class="fa fa-edit"></i>) for directly jumping to editing the currently - viewed page. For e.g. GitHub projects set this to - `https://github.com/<owner>/<repo>/edit/master/{path}` or for - Bitbucket projects set it to - `https://bitbucket.org/<owner>/<repo>/src/master/{path}?mode=edit` - where {path} will be replaced with the full path of the file in the - repository. -- **input-404:** The name of the markdown file used for missing files. - The corresponding output file will be the same, with the extension replaced with `html`. - Defaults to `404.md`. -- **site-url:** The url where the book will be hosted. This is required to ensure - navigation links and script/css imports in the 404 file work correctly, even when accessing - urls in subdirectories. Defaults to `/`. -- **cname:** The DNS subdomain or apex domain at which your book will be hosted. - This string will be written to a file named CNAME in the root of your site, as - required by GitHub Pages (see [*Managing a custom domain for your GitHub Pages - site*][custom domain]). - -[custom domain]: https://docs.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site - -### `[output.html.print]` - -The `[output.html.print]` table provides options for controlling the printable output. -By default, mdBook will include an icon on the top right of the book (which looks like <i class="fa fa-print"></i>) that will print the book as a single page. - -```toml -[output.html.print] -enable = true # include support for printable output -page-break = true # insert page-break after each chapter -``` - -- **enable:** Enable print support. When `false`, all print support will not be - rendered. Defaults to `true`. -- **page-break** Insert page breaks between chapters. Defaults to `true`. - -### `[output.html.fold]` - -The `[output.html.fold]` table provides options for controlling folding of the chapter listing in the navigation sidebar. - -```toml -[output.html.fold] -enable = false # whether or not to enable section folding -level = 0 # the depth to start folding -``` - -- **enable:** Enable section-folding. When off, all folds are open. - Defaults to `false`. -- **level:** The higher the more folded regions are open. When level is 0, all - folds are closed. Defaults to `0`. - -### `[output.html.playground]` - -The `[output.html.playground]` table provides options for controlling Rust sample code blocks, and their integration with the [Rust Playground]. - -[Rust Playground]: https://play.rust-lang.org/ - -```toml -[output.html.playground] -editable = false # allows editing the source code -copyable = true # include the copy button for copying code snippets -copy-js = true # includes the JavaScript for the code editor -line-numbers = false # displays line numbers for editable code -runnable = true # displays a run button for rust code -``` - -- **editable:** Allow editing the source code. Defaults to `false`. -- **copyable:** Display the copy button on code snippets. Defaults to `true`. -- **copy-js:** Copy JavaScript files for the editor to the output directory. - Defaults to `true`. -- **line-numbers** Display line numbers on editable sections of code. Requires both `editable` and `copy-js` to be `true`. Defaults to `false`. -- **runnable** Displays a run button for rust code snippets. Changing this to `false` will disable the run in playground feature globally. Defaults to `true`. - -[Ace]: https://ace.c9.io/ - -### `[output.html.search]` - -The `[output.html.search]` table provides options for controlling the built-in text [search]. -mdBook must be compiled with the `search` feature enabled (on by default). - -[search]: ../../guide/reading.md#search - -```toml -[output.html.search] -enable = true # enables the search feature -limit-results = 30 # maximum number of search results -teaser-word-count = 30 # number of words used for a search result teaser -use-boolean-and = true # multiple search terms must all match -boost-title = 2 # ranking boost factor for matches in headers -boost-hierarchy = 1 # ranking boost factor for matches in page names -boost-paragraph = 1 # ranking boost factor for matches in text -expand = true # partial words will match longer terms -heading-split-level = 3 # link results to heading levels -copy-js = true # include Javascript code for search -``` - -- **enable:** Enables the search feature. Defaults to `true`. -- **limit-results:** The maximum number of search results. Defaults to `30`. -- **teaser-word-count:** The number of words used for a search result teaser. - Defaults to `30`. -- **use-boolean-and:** Define the logical link between multiple search words. If - true, all search words must appear in each result. Defaults to `false`. -- **boost-title:** Boost factor for the search result score if a search word - appears in the header. Defaults to `2`. -- **boost-hierarchy:** Boost factor for the search result score if a search word - appears in the hierarchy. The hierarchy contains all titles of the parent - documents and all parent headings. Defaults to `1`. -- **boost-paragraph:** Boost factor for the search result score if a search word - appears in the text. Defaults to `1`. -- **expand:** True if search should match longer results e.g. search `micro` - should match `microwave`. Defaults to `true`. -- **heading-split-level:** Search results will link to a section of the document - which contains the result. Documents are split into sections by headings this - level or less. Defaults to `3`. (`### This is a level 3 heading`) -- **copy-js:** Copy JavaScript files for the search implementation to the output - directory. Defaults to `true`. - -### `[output.html.redirect]` - -The `[output.html.redirect]` table provides a way to add redirects. -This is useful when you move, rename, or remove a page to ensure that links to the old URL will go to the new location. - -```toml -[output.html.redirect] -"/appendices/bibliography.html" = "https://rustc-dev-guide.rust-lang.org/appendix/bibliography.html" -"/other-installation-methods.html" = "../infra/other-installation-methods.html" -``` - -The table contains key-value pairs where the key is where the redirect file needs to be created, as an absolute path from the build directory, (e.g. `/appendices/bibliography.html`). -The value can be any valid URI the browser should navigate to (e.g. `https://rust-lang.org/`, `/overview.html`, or `../bibliography.html`). - -This will generate an HTML page which will automatically redirect to the given location. -Note that the source location does not support `#` anchor redirects. - -## Markdown Renderer - -The Markdown renderer will run preprocessors and then output the resulting -Markdown. This is mostly useful for debugging preprocessors, especially in -conjunction with `mdbook test` to see the Markdown that `mdbook` is passing -to `rustdoc`. - -The Markdown renderer is included with `mdbook` but disabled by default. -Enable it by adding an empty table to your `book.toml` as follows: - -```toml -[output.markdown] -``` - -There are no configuration options for the Markdown renderer at this time; -only whether it is enabled or disabled. - -See [the preprocessors documentation](preprocessors.md) for how to -specify which preprocessors should run before the Markdown renderer. diff --git a/website/doc/es/src/format/example.rs b/website/doc/es/src/format/example.rs deleted file mode 100644 index a467cac1..00000000 --- a/website/doc/es/src/format/example.rs +++ /dev/null @@ -1,6 +0,0 @@ -fn main() { - println!("Hello World!"); -# -# // You can even hide lines! :D -# println!("I am hidden! Expand the code snippet to see me"); -} diff --git a/website/doc/es/src/format/images/rust-logo-blk.svg b/website/doc/es/src/format/images/rust-logo-blk.svg deleted file mode 100644 index 1a6c762d..00000000 --- a/website/doc/es/src/format/images/rust-logo-blk.svg +++ /dev/null @@ -1 +0,0 @@ -<svg height="144" width="144" xmlns="http://www.w3.org/2000/svg"><path d="m71.05 23.68c-26.06 0-47.27 21.22-47.27 47.27s21.22 47.27 47.27 47.27 47.27-21.22 47.27-47.27-21.22-47.27-47.27-47.27zm-.07 4.2a3.1 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm7.12 5.12a38.27 38.27 0 0 1 26.2 18.66l-3.67 8.28c-.63 1.43.02 3.11 1.44 3.75l7.06 3.13a38.27 38.27 0 0 1 .08 6.64h-3.93c-.39 0-.55.26-.55.64v1.8c0 4.24-2.39 5.17-4.49 5.4-2 .23-4.21-.84-4.49-2.06-1.18-6.63-3.14-8.04-6.24-10.49 3.85-2.44 7.85-6.05 7.85-10.87 0-5.21-3.57-8.49-6-10.1-3.42-2.25-7.2-2.7-8.22-2.7h-40.6a38.27 38.27 0 0 1 21.41-12.08l4.79 5.02c1.08 1.13 2.87 1.18 4 .09zm-44.2 23.02a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm74.15.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm-68.29.5h5.42v24.44h-10.94a38.27 38.27 0 0 1 -1.24-14.61l6.7-2.98c1.43-.64 2.08-2.31 1.44-3.74zm22.62.26h12.91c.67 0 4.71.77 4.71 3.8 0 2.51-3.1 3.41-5.65 3.41h-11.98zm0 17.56h9.89c.9 0 4.83.26 6.08 5.28.39 1.54 1.26 6.56 1.85 8.17.59 1.8 2.98 5.4 5.53 5.4h16.14a38.27 38.27 0 0 1 -3.54 4.1l-6.57-1.41c-1.53-.33-3.04.65-3.37 2.18l-1.56 7.28a38.27 38.27 0 0 1 -31.91-.15l-1.56-7.28c-.33-1.53-1.83-2.51-3.36-2.18l-6.43 1.38a38.27 38.27 0 0 1 -3.32-3.92h31.27c.35 0 .59-.06.59-.39v-11.06c0-.32-.24-.39-.59-.39h-9.15zm-14.43 25.33a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm46.05.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11z"/><path d="m115.68 70.95a44.63 44.63 0 0 1 -44.63 44.63 44.63 44.63 0 0 1 -44.63-44.63 44.63 44.63 0 0 1 44.63-44.63 44.63 44.63 0 0 1 44.63 44.63zm-.84-4.31 6.96 4.31-6.96 4.31 5.98 5.59-7.66 2.87 4.78 6.65-8.09 1.32 3.4 7.46-8.19-.29 1.88 7.98-7.98-1.88.29 8.19-7.46-3.4-1.32 8.09-6.65-4.78-2.87 7.66-5.59-5.98-4.31 6.96-4.31-6.96-5.59 5.98-2.87-7.66-6.65 4.78-1.32-8.09-7.46 3.4.29-8.19-7.98 1.88 1.88-7.98-8.19.29 3.4-7.46-8.09-1.32 4.78-6.65-7.66-2.87 5.98-5.59-6.96-4.31 6.96-4.31-5.98-5.59 7.66-2.87-4.78-6.65 8.09-1.32-3.4-7.46 8.19.29-1.88-7.98 7.98 1.88-.29-8.19 7.46 3.4 1.32-8.09 6.65 4.78 2.87-7.66 5.59 5.98 4.31-6.96 4.31 6.96 5.59-5.98 2.87 7.66 6.65-4.78 1.32 8.09 7.46-3.4-.29 8.19 7.98-1.88-1.88 7.98 8.19-.29-3.4 7.46 8.09 1.32-4.78 6.65 7.66 2.87z" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/></svg> \ No newline at end of file diff --git a/website/doc/es/src/format/markdown.md b/website/doc/es/src/format/markdown.md deleted file mode 100644 index 963a1538..00000000 --- a/website/doc/es/src/format/markdown.md +++ /dev/null @@ -1,222 +0,0 @@ -# Markdown - -mdBook's [parser](https://github.com/raphlinus/pulldown-cmark) adheres to the [CommonMark](https://commonmark.org/) specification with some extensions described below. -You can take a quick [tutorial](https://commonmark.org/help/tutorial/), -or [try out](https://spec.commonmark.org/dingus/) CommonMark in real time. A complete Markdown overview is out of scope for -this documentation, but below is a high level overview of some of the basics. For a more in-depth experience, check out the -[Markdown Guide](https://www.markdownguide.org). - -## Text and Paragraphs - -Text is rendered relatively predictably: - -```markdown -Here is a line of text. - -This is a new line. -``` - -Will look like you might expect: - -Here is a line of text. - -This is a new line. - -## Headings - -Headings use the `#` marker and should be on a line by themselves. More `#` mean smaller headings: - -```markdown -### A heading - -Some text. - -#### A smaller heading - -More text. -``` - -### A heading - -Some text. - -#### A smaller heading - -More text. - -## Lists - -Lists can be unordered or ordered. Ordered lists will order automatically: - -```markdown -* milk -* eggs -* butter - -1. carrots -1. celery -1. radishes -``` - -* milk -* eggs -* butter - -1. carrots -1. celery -1. radishes - -## Links - -Linking to a URL or local file is easy: - -```markdown -Use [mdBook](https://github.com/rust-lang/mdBook). - -Read about [mdBook](mdBook.md). - -A bare url: <https://www.rust-lang.org>. -``` - -Use [mdBook](https://github.com/rust-lang/mdBook). - -Read about [mdBook](mdBook.md). - -A bare url: <https://www.rust-lang.org>. - ----- - -Relative links that end with `.md` will be converted to the `.html` extension. -It is recommended to use `.md` links when possible. -This is useful when viewing the Markdown file outside of mdBook, for example on GitHub or GitLab which render Markdown automatically. - -Links to `README.md` will be converted to `index.html`. -This is done since some services like GitHub render README files automatically, but web servers typically expect the root file to be called `index.html`. - -You can link to individual headings with `#` fragments. -For example, `mdbook.md#text-and-paragraphs` would link to the [Text and Paragraphs](#text-and-paragraphs) section above. -The ID is created by transforming the heading such as converting to lowercase and replacing spaces with dashes. -You can click on any heading and look at the URL in your browser to see what the fragment looks like. - -## Images - -Including images is simply a matter of including a link to them, much like in the _Links_ section above. The following markdown -includes the Rust logo SVG image found in the `images` directory at the same level as this file: - -```markdown -![The Rust Logo](images/rust-logo-blk.svg) -``` - -Produces the following HTML when built with mdBook: - -```html -<p><img src="images/rust-logo-blk.svg" alt="The Rust Logo" /></p> -``` - -Which, of course displays the image like so: - -![The Rust Logo](images/rust-logo-blk.svg) - -## Extensions - -mdBook has several extensions beyond the standard CommonMark specification. - -### Strikethrough - -Text may be rendered with a horizontal line through the center by wrapping the -text with two tilde characters on each side: - -```text -An example of ~~strikethrough text~~. -``` - -This example will render as: - -> An example of ~~strikethrough text~~. - -This follows the [GitHub Strikethrough extension][strikethrough]. - -### Footnotes - -A footnote generates a small numbered link in the text which when clicked -takes the reader to the footnote text at the bottom of the item. The footnote -label is written similarly to a link reference with a caret at the front. The -footnote text is written like a link reference definition, with the text -following the label. Example: - -```text -This is an example of a footnote[^note]. - -[^note]: This text is the contents of the footnote, which will be rendered - towards the bottom. -``` - -This example will render as: - -> This is an example of a footnote[^note]. -> -> [^note]: This text is the contents of the footnote, which will be rendered -> towards the bottom. - -The footnotes are automatically numbered based on the order the footnotes are -written. - -### Tables - -Tables can be written using pipes and dashes to draw the rows and columns of -the table. These will be translated to HTML table matching the shape. Example: - -```text -| Header1 | Header2 | -|---------|---------| -| abc | def | -``` - -This example will render similarly to this: - -| Header1 | Header2 | -|---------|---------| -| abc | def | - -See the specification for the [GitHub Tables extension][tables] for more -details on the exact syntax supported. - -### Task lists - -Task lists can be used as a checklist of items that have been completed. -Example: - -```md -- [x] Complete task -- [ ] Incomplete task -``` - -This will render as: - -> - [x] Complete task -> - [ ] Incomplete task - -See the specification for the [task list extension] for more details. - -### Smart punctuation - -Some ASCII punctuation sequences will be automatically turned into fancy Unicode -characters: - -| ASCII sequence | Unicode | -|----------------|---------| -| `--` | – | -| `---` | — | -| `...` | … | -| `"` | “ or ”, depending on context | -| `'` | ‘ or ’, depending on context | - -So, no need to manually enter those Unicode characters! - -This feature is disabled by default. -To enable it, see the [`output.html.curly-quotes`] config option. - -[strikethrough]: https://github.github.com/gfm/#strikethrough-extension- -[tables]: https://github.github.com/gfm/#tables-extension- -[task list extension]: https://github.github.com/gfm/#task-list-items-extension- -[`output.html.curly-quotes`]: configuration/renderers.md#html-renderer-options diff --git a/website/doc/es/src/format/mathjax.md b/website/doc/es/src/format/mathjax.md deleted file mode 100644 index 3dd79215..00000000 --- a/website/doc/es/src/format/mathjax.md +++ /dev/null @@ -1,43 +0,0 @@ -# MathJax Support - -mdBook has optional support for math equations through -[MathJax](https://www.mathjax.org/). - -To enable MathJax, you need to add the `mathjax-support` key to your `book.toml` -under the `output.html` section. - -```toml -[output.html] -mathjax-support = true -``` - ->**Note:** The usual delimiters MathJax uses are not yet supported. You can't -currently use `$$ ... $$` as delimiters and the `\[ ... \]` delimiters need an -extra backslash to work. Hopefully this limitation will be lifted soon. - ->**Note:** When you use double backslashes in MathJax blocks (for example in -> commands such as `\begin{cases} \frac 1 2 \\ \frac 3 4 \end{cases}`) you need -> to add _two extra_ backslashes (e.g., `\begin{cases} \frac 1 2 \\\\ \frac 3 4 -> \end{cases}`). - - -### Inline equations -Inline equations are delimited by `\\(` and `\\)`. So for example, to render the -following inline equation \\( \int x dx = \frac{x^2}{2} + C \\) you would write -the following: -``` -\\( \int x dx = \frac{x^2}{2} + C \\) -``` - -### Block equations -Block equations are delimited by `\\[` and `\\]`. To render the following -equation - -\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] - - -you would write: - -```bash -\\[ \mu = \frac{1}{N} \sum_{i=0} x_i \\] -``` diff --git a/website/doc/es/src/format/mdbook.md b/website/doc/es/src/format/mdbook.md deleted file mode 100644 index 62e89843..00000000 --- a/website/doc/es/src/format/mdbook.md +++ /dev/null @@ -1,276 +0,0 @@ -# mdBook-specific features - -## Hiding code lines - -There is a feature in mdBook that lets you hide code lines by prepending them -with a `#` [like you would with Rustdoc][rustdoc-hide]. -This currently only works with Rust language code blocks. - -[rustdoc-hide]: https://doc.rust-lang.org/stable/rustdoc/documentation-tests.html#hiding-portions-of-the-example - -```bash -# fn main() { - let x = 5; - let y = 6; - - println!("{}", x + y); -# } -``` - -Will render as - -```rust -# fn main() { - let x = 5; - let y = 6; - - println!("{}", x + y); -# } -``` - -The code block has an eyeball icon (<i class="fa fa-eye"></i>) which will toggle the visibility of the hidden lines. - -## Rust Playground - -Rust language code blocks will automatically get a play button (<i class="fa fa-play"></i>) which will execute the code and display the output just below the code block. -This works by sending the code to the [Rust Playground]. - -```rust -println!("Hello, World!"); -``` - -If there is no `main` function, then the code is automatically wrapped inside one. - -If you wish to disable the play button for a code block, you can include the `noplayground` option on the code block like this: - -~~~markdown -```rust,noplayground -let mut name = String::new(); -std::io::stdin().read_line(&mut name).expect("failed to read line"); -println!("Hello {}!", name); -``` -~~~ - -Or, if you wish to disable the play button for all code blocks in your book, you can write the config to the `book.toml` like this. - -```toml -[output.html.playground] -runnable = false -``` - -## Rust code block attributes - -Additional attributes can be included in Rust code blocks with comma, space, or tab-separated terms just after the language term. For example: - -~~~markdown -```rust,ignore -# This example won't be tested. -panic!("oops!"); -``` -~~~ - -These are particularly important when using [`mdbook test`] to test Rust examples. -These use the same attributes as [rustdoc attributes], with a few additions: - -* `editable` — Enables the [editor]. -* `noplayground` — Removes the play button, but will still be tested. -* `mdbook-runnable` — Forces the play button to be displayed. - This is intended to be combined with the `ignore` attribute for examples that should not be tested, but you want to allow the reader to run. -* `ignore` — Will not be tested and no play button is shown, but it is still highlighted as Rust syntax. -* `should_panic` — When executed, it should produce a panic. -* `no_run` — The code is compiled when tested, but it is not run. - The play button is also not shown. -* `compile_fail` — The code should fail to compile. -* `edition2015`, `edition2018`, `edition2021` — Forces the use of a specific Rust edition. - See [`rust.edition`] to set this globally. - -[`mdbook test`]: ../cli/test.md -[rustdoc attributes]: https://doc.rust-lang.org/rustdoc/documentation-tests.html#attributes -[editor]: theme/editor.md -[`rust.edition`]: configuration/general.md#rust-options - -## Including files - -With the following syntax, you can include files into your book: - -```hbs -\{{#include file.rs}} -``` - -The path to the file has to be relative from the current source file. - -mdBook will interpret included files as Markdown. Since the include command -is usually used for inserting code snippets and examples, you will often -wrap the command with ```` ``` ```` to display the file contents without -interpreting them. - -````hbs -``` -\{{#include file.rs}} -``` -```` - -## Including portions of a file -Often you only need a specific part of the file, e.g. relevant lines for an -example. We support four different modes of partial includes: - -```hbs -\{{#include file.rs:2}} -\{{#include file.rs::10}} -\{{#include file.rs:2:}} -\{{#include file.rs:2:10}} -``` - -The first command only includes the second line from file `file.rs`. The second -command includes all lines up to line 10, i.e. the lines from 11 till the end of -the file are omitted. The third command includes all lines from line 2, i.e. the -first line is omitted. The last command includes the excerpt of `file.rs` -consisting of lines 2 to 10. - -To avoid breaking your book when modifying included files, you can also -include a specific section using anchors instead of line numbers. -An anchor is a pair of matching lines. The line beginning an anchor must -match the regex `ANCHOR:\s*[\w_-]+` and similarly the ending line must match -the regex `ANCHOR_END:\s*[\w_-]+`. This allows you to put anchors in -any kind of commented line. - -Consider the following file to include: -```rs -/* ANCHOR: all */ - -// ANCHOR: component -struct Paddle { - hello: f32, -} -// ANCHOR_END: component - -////////// ANCHOR: system -impl System for MySystem { ... } -////////// ANCHOR_END: system - -/* ANCHOR_END: all */ -``` - -Then in the book, all you have to do is: -````hbs -Here is a component: -```rust,no_run,noplayground -\{{#include file.rs:component}} -``` - -Here is a system: -```rust,no_run,noplayground -\{{#include file.rs:system}} -``` - -This is the full file. -```rust,no_run,noplayground -\{{#include file.rs:all}} -``` -```` - -Lines containing anchor patterns inside the included anchor are ignored. - -## Including a file but initially hiding all except specified lines - -The `rustdoc_include` helper is for including code from external Rust files that contain complete -examples, but only initially showing particular lines specified with line numbers or anchors in the -same way as with `include`. - -The lines not in the line number range or between the anchors will still be included, but they will -be prefaced with `#`. This way, a reader can expand the snippet to see the complete example, and -Rustdoc will use the complete example when you run `mdbook test`. - -For example, consider a file named `file.rs` that contains this Rust program: - -```rust -fn main() { - let x = add_one(2); - assert_eq!(x, 3); -} - -fn add_one(num: i32) -> i32 { - num + 1 -} -``` - -We can include a snippet that initially shows only line 2 by using this syntax: - -````hbs -To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: - -```rust -\{{#rustdoc_include file.rs:2}} -``` -```` - -This would have the same effect as if we had manually inserted the code and hidden all but line 2 -using `#`: - -````hbs -To call the `add_one` function, we pass it an `i32` and bind the returned value to `x`: - -```rust -# fn main() { - let x = add_one(2); -# assert_eq!(x, 3); -# } -# -# fn add_one(num: i32) -> i32 { -# num + 1 -# } -``` -```` - -That is, it looks like this (click the "expand" icon to see the rest of the file): - -```rust -# fn main() { - let x = add_one(2); -# assert_eq!(x, 3); -# } -# -# fn add_one(num: i32) -> i32 { -# num + 1 -# } -``` - -## Inserting runnable Rust files - -With the following syntax, you can insert runnable Rust files into your book: - -```hbs -\{{#playground file.rs}} -``` - -The path to the Rust file has to be relative from the current source file. - -When play is clicked, the code snippet will be sent to the [Rust Playground] to be -compiled and run. The result is sent back and displayed directly underneath the -code. - -Here is what a rendered code snippet looks like: - -{{#playground example.rs}} - -Any additional values passed after the filename will be included as attributes of the code block. -For example `\{{#playground example.rs editable}}` will create the code block like the following: - -~~~markdown -```rust,editable -# Contents of example.rs here. -``` -~~~ - -And the `editable` attribute will enable the [editor] as described at [Rust code block attributes](#rust-code-block-attributes). - -[Rust Playground]: https://play.rust-lang.org/ - -## Controlling page \<title\> - -A chapter can set a \<title\> that is different from its entry in the table of -contents (sidebar) by including a `\{{#title ...}}` near the top of the page. - -```hbs -\{{#title My Title}} -``` diff --git a/website/doc/es/src/format/summary.md b/website/doc/es/src/format/summary.md deleted file mode 100644 index 0e138529..00000000 --- a/website/doc/es/src/format/summary.md +++ /dev/null @@ -1,99 +0,0 @@ -# SUMMARY.md - -The summary file is used by mdBook to know what chapters to include, in what -order they should appear, what their hierarchy is and where the source files -are. Without this file, there is no book. - -This markdown file must be named `SUMMARY.md`. Its formatting -is very strict and must follow the structure outlined below to allow for easy -parsing. Any element not specified below, be it formatting or textual, is likely -to be ignored at best, or may cause an error when attempting to build the book. - -### Structure - -1. ***Title*** - While optional, it's common practice to begin with a title, generally <code - class="language-markdown"># Summary</code>. This is ignored by the parser however, and - can be omitted. - ```markdown - # Summary - ``` - -1. ***Prefix Chapter*** - Before the main numbered chapters, prefix chapters can be added - that will not be numbered. This is useful for forewords, - introductions, etc. There are, however, some constraints. Prefix chapters cannot be - nested; they should all be on the root level. And you cannot add - prefix chapters once you have added numbered chapters. - ```markdown - [A Prefix Chapter](relative/path/to/markdown.md) - - - [First Chapter](relative/path/to/markdown2.md) - ``` - -1. ***Part Title*** - Headers can be used as a title for the following numbered - chapters. This can be used to logically separate different sections - of the book. The title is rendered as unclickable text. - Titles are optional, and the numbered chapters can be broken into as many - parts as desired. - ```markdown - # My Part Title - - - [First Chapter](relative/path/to/markdown.md) - ``` - -1. ***Numbered Chapter*** - Numbered chapters outline the main content of the book - and can be nested, resulting in a nice hierarchy - (chapters, sub-chapters, etc.). - ```markdown - # Title of Part - - - [First Chapter](relative/path/to/markdown.md) - - [Second Chapter](relative/path/to/markdown2.md) - - [Sub Chapter](relative/path/to/markdown3.md) - - # Title of Another Part - - - [Another Chapter](relative/path/to/markdown4.md) - ``` - Numbered chapters can be denoted with either `-` or `*` (do not mix delimiters). - -1. ***Suffix Chapter*** - Like prefix chapters, suffix chapters are unnumbered, but they come after - numbered chapters. - ```markdown - - [Last Chapter](relative/path/to/markdown.md) - - [Title of Suffix Chapter](relative/path/to/markdown2.md) - ``` - -1. ***Draft chapters*** - Draft chapters are chapters without a file and thus content. - The purpose of a draft chapter is to signal future chapters still to be written. - Or when still laying out the structure of the book to avoid creating the files - while you are still changing the structure of the book a lot. - Draft chapters will be rendered in the HTML renderer as disabled links in the table - of contents, as you can see for the next chapter in the table of contents on the left. - Draft chapters are written like normal chapters but without writing the path to the file. - ```markdown - - [Draft Chapter]() - ``` - -1. ***Separators*** - Separators can be added before, in between, and after any other element. They result - in an HTML rendered line in the built table of contents. A separator is - a line containing exclusively dashes and at least three of them: `---`. - ```markdown - # My Part Title - - [A Prefix Chapter](relative/path/to/markdown.md) - - --- - - - [First Chapter](relative/path/to/markdown2.md) - ``` - - -### Example - -Below is the markdown source for the `SUMMARY.md` for this guide, with the resulting table -of contents as rendered to the left. - -```markdown -{{#include ../SUMMARY.md}} -``` diff --git a/website/doc/es/src/format/theme/README.md b/website/doc/es/src/format/theme/README.md deleted file mode 100644 index 4a776e60..00000000 --- a/website/doc/es/src/format/theme/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Theme - -The default renderer uses a [handlebars](http://handlebarsjs.com/) template to -render your markdown files and comes with a default theme included in the mdBook -binary. - -The theme is totally customizable, you can selectively replace every file from -the theme by your own by adding a `theme` directory next to `src` folder in your -project root. Create a new file with the name of the file you want to override -and now that file will be used instead of the default file. - -Here are the files you can override: - -- **_index.hbs_** is the handlebars template. -- **_head.hbs_** is appended to the HTML `<head>` section. -- **_header.hbs_** content is appended on top of every book page. -- **_css/_** contains the CSS files for styling the book. - - **_css/chrome.css_** is for UI elements. - - **_css/general.css_** is the base styles. - - **_css/print.css_** is the style for printer output. - - **_css/variables.css_** contains variables used in other CSS files. -- **_book.js_** is mostly used to add client side functionality, like hiding / - un-hiding the sidebar, changing the theme, ... -- **_highlight.js_** is the JavaScript that is used to highlight code snippets, - you should not need to modify this. -- **_highlight.css_** is the theme used for the code highlighting. -- **_favicon.svg_** and **_favicon.png_** the favicon that will be used. The SVG - version is used by [newer browsers]. - -Generally, when you want to tweak the theme, you don't need to override all the -files. If you only need changes in the stylesheet, there is no point in -overriding all the other files. Because custom files take precedence over -built-in ones, they will not get updated with new fixes / features. - -**Note:** When you override a file, it is possible that you break some -functionality. Therefore I recommend to use the file from the default theme as -template and only add / modify what you need. You can copy the default theme -into your source directory automatically by using `mdbook init --theme` and just -remove the files you don't want to override. - -`mdbook init --theme` will not create every file listed above. -Some files, such as `head.hbs`, do not have built-in equivalents. -Just create the file if you need it. - -If you completely replace all built-in themes, be sure to also set -[`output.html.preferred-dark-theme`] in the config, which defaults to the -built-in `navy` theme. - -[`output.html.preferred-dark-theme`]: ../configuration/renderers.md#html-renderer-options -[newer browsers]: https://caniuse.com/#feat=link-icon-svg diff --git a/website/doc/es/src/format/theme/editor.md b/website/doc/es/src/format/theme/editor.md deleted file mode 100644 index 9294dd44..00000000 --- a/website/doc/es/src/format/theme/editor.md +++ /dev/null @@ -1,48 +0,0 @@ -# Editor - -In addition to providing runnable code playgrounds, mdBook optionally allows them -to be editable. In order to enable editable code blocks, the following needs to -be added to the ***book.toml***: - -```toml -[output.html.playground] -editable = true -``` - -To make a specific block available for editing, the attribute `editable` needs -to be added to it: - -~~~markdown -```rust,editable -fn main() { - let number = 5; - print!("{}", number); -} -``` -~~~ - -The above will result in this editable playground: - -```rust,editable -fn main() { - let number = 5; - print!("{}", number); -} -``` - -Note the new `Undo Changes` button in the editable playgrounds. - -## Customizing the Editor - -By default, the editor is the [Ace](https://ace.c9.io/) editor, but, if desired, -the functionality may be overridden by providing a different folder: - -```toml -[output.html.playground] -editable = true -editor = "/path/to/editor" -``` - -Note that for the editor changes to function correctly, the `book.js` inside of -the `theme` folder will need to be overridden as it has some couplings with the -default Ace editor. diff --git a/website/doc/es/src/format/theme/index-hbs.md b/website/doc/es/src/format/theme/index-hbs.md deleted file mode 100644 index e5331dcc..00000000 --- a/website/doc/es/src/format/theme/index-hbs.md +++ /dev/null @@ -1,101 +0,0 @@ -# index.hbs - -`index.hbs` is the handlebars template that is used to render the book. The -markdown files are processed to html and then injected in that template. - -If you want to change the layout or style of your book, chances are that you -will have to modify this template a little bit. Here is what you need to know. - -## Data - -A lot of data is exposed to the handlebars template with the "context". In the -handlebars template you can access this information by using - -```handlebars -{{name_of_property}} -``` - -Here is a list of the properties that are exposed: - -- ***language*** Language of the book in the form `en`, as specified in `book.toml` (if not specified, defaults to `en`). To use in <code - class="language-html">\<html lang="{{ language }}"></code> for example. -- ***title*** Title used for the current page. This is identical to `{{ chapter_title }} - {{ book_title }}` unless `book_title` is not set in which case it just defaults to the `chapter_title`. -- ***book_title*** Title of the book, as specified in `book.toml` -- ***chapter_title*** Title of the current chapter, as listed in `SUMMARY.md` - -- ***path*** Relative path to the original markdown file from the source - directory -- ***content*** This is the rendered markdown. -- ***path_to_root*** This is a path containing exclusively `../`'s that points - to the root of the book from the current file. Since the original directory - structure is maintained, it is useful to prepend relative links with this - `path_to_root`. - -- ***chapters*** Is an array of dictionaries of the form - ```json - {"section": "1.2.1", "name": "name of this chapter", "path": "dir/markdown.md"} - ``` - containing all the chapters of the book. It is used for example to construct - the table of contents (sidebar). - -## Handlebars Helpers - -In addition to the properties you can access, there are some handlebars helpers -at your disposal. - -### 1. toc - -The toc helper is used like this - -```handlebars -{{#toc}}{{/toc}} -``` - -and outputs something that looks like this, depending on the structure of your -book - -```html -<ul class="chapter"> - <li><a href="link/to/file.html">Some chapter</a></li> - <li> - <ul class="section"> - <li><a href="link/to/other_file.html">Some other Chapter</a></li> - </ul> - </li> -</ul> -``` - -If you would like to make a toc with another structure, you have access to the -chapters property containing all the data. The only limitation at the moment -is that you would have to do it with JavaScript instead of with a handlebars -helper. - -```html -<script> -var chapters = {{chapters}}; -// Processing here -</script> -``` - -### 2. previous / next - -The previous and next helpers expose a `link` and `name` property to the -previous and next chapters. - -They are used like this - -```handlebars -{{#previous}} - <a href="{{link}}" class="nav-chapters previous"> - <i class="fa fa-angle-left"></i> - </a> -{{/previous}} -``` - -The inner html will only be rendered if the previous / next chapter exists. -Of course the inner html can be changed to your liking. - ------- - -*If you would like other properties or helpers exposed, please [create a new -issue](https://github.com/rust-lang/mdBook/issues)* diff --git a/website/doc/es/src/format/theme/syntax-highlighting.md b/website/doc/es/src/format/theme/syntax-highlighting.md deleted file mode 100644 index f57540f0..00000000 --- a/website/doc/es/src/format/theme/syntax-highlighting.md +++ /dev/null @@ -1,121 +0,0 @@ -# Syntax Highlighting - -mdBook uses [Highlight.js](https://highlightjs.org) with a custom theme -for syntax highlighting. - -Automatic language detection has been turned off, so you will probably want to -specify the programming language you use like this: - -~~~markdown -```rust -fn main() { - // Some code -} -``` -~~~ - -## Supported languages - -These languages are supported by default, but you can add more by supplying -your own `highlight.js` file: - -- apache -- armasm -- bash -- c -- coffeescript -- cpp -- csharp -- css -- d -- diff -- go -- handlebars -- haskell -- http -- ini -- java -- javascript -- json -- julia -- kotlin -- less -- lua -- makefile -- markdown -- nginx -- objectivec -- perl -- php -- plaintext -- properties -- python -- r -- ruby -- rust -- scala -- scss -- shell -- sql -- swift -- typescript -- x86asm -- xml -- yaml - -## Custom theme -Like the rest of the theme, the files used for syntax highlighting can be -overridden with your own. - -- ***highlight.js*** normally you shouldn't have to overwrite this file, unless - you want to use a more recent version. -- ***highlight.css*** theme used by highlight.js for syntax highlighting. - -If you want to use another theme for `highlight.js` download it from their -website, or make it yourself, rename it to `highlight.css` and put it in -the `theme` folder of your book. - -Now your theme will be used instead of the default theme. - -## Hiding code lines - -There is a feature in mdBook that lets you hide code lines by prepending them -with a `#`. - - -```bash -# fn main() { - let x = 5; - let y = 6; - - println!("{}", x + y); -# } -``` - -Will render as - -```rust -# fn main() { - let x = 5; - let y = 7; - - println!("{}", x + y); -# } -``` - -**At the moment, this only works for code examples that are annotated with -`rust`. Because it would collide with semantics of some programming languages. -In the future, we want to make this configurable through the `book.toml` so that -everyone can benefit from it.** - - -## Improve default theme - -If you think the default theme doesn't look quite right for a specific language, -or could be improved, feel free to [submit a new -issue](https://github.com/rust-lang/mdBook/issues) explaining what you -have in mind and I will take a look at it. - -You could also create a pull-request with the proposed improvements. - -Overall the theme should be light and sober, without too many flashy colors. diff --git a/website/doc/es/src/guide/README.md b/website/doc/es/src/guide/README.md deleted file mode 100644 index 90deb10e..00000000 --- a/website/doc/es/src/guide/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# User Guide - -This user guide provides an introduction to basic concepts of using mdBook. - -- [Installation](installation.md) -- [Reading Books](reading.md) -- [Creating a Book](creating.md) diff --git a/website/doc/es/src/guide/creating.md b/website/doc/es/src/guide/creating.md deleted file mode 100644 index f68a8c60..00000000 --- a/website/doc/es/src/guide/creating.md +++ /dev/null @@ -1,109 +0,0 @@ -# Creating a Book - -Once you have the `mdbook` CLI tool installed, you can use it to create and render a book. - -## Initializing a book - -The `mdbook init` command will create a new directory containing an empty book for you to get started. -Give it the name of the directory that you want to create: - -```sh -mdbook init my-first-book -``` - -It will ask a few questions before generating the book. -After answering the questions, you can change the current directory into the new book: - -```sh -cd my-first-book -``` - -There are several ways to render a book, but one of the easiest methods is to use the `serve` command, which will build your book and start a local webserver: - -```sh -mdbook serve --open -``` - -The `--open` option will open your default web browser to view your new book. -You can leave the server running even while you edit the content of the book, and `mdbook` will automatically rebuild the output *and* automatically refresh your web browser. - -Check out the [CLI Guide](../cli/index.html) for more information about other `mdbook` commands and CLI options. - -## Anatomy of a book - -A book is built from several files which define the settings and layout of the book. - -### `book.toml` - -In the root of your book, there is a `book.toml` file which contains settings for describing how to build your book. -This is written in the [TOML markup language](https://toml.io/). -The default settings are usually good enough to get you started. -When you are interested in exploring more features and options that mdBook provides, check out the [Configuration chapter](../format/configuration/index.html) for more details. - -A very basic `book.toml` can be as simple as this: - -```toml -[book] -title = "My First Book" -``` - -### `SUMMARY.md` - -The next major part of a book is the summary file located at `src/SUMMARY.md`. -This file contains a list of all the chapters in the book. -Before a chapter can be viewed, it must be added to this list. - -Here's a basic summary file with a few chapters: - -```md -# Summary - -[Introduction](README.md) - -- [My First Chapter](my-first-chapter.md) -- [Nested example](nested/README.md) - - [Sub-chapter](nested/sub-chapter.md) -``` - -Try opening up `src/SUMMARY.md` in your editor and adding a few chapters. -If any of the chapter files do not exist, `mdbook` will automatically create them for you. - -For more details on other formatting options for the summary file, check out the [Summary chapter](../format/summary.md). - -### Source files - -The content of your book is all contained in the `src` directory. -Each chapter is a separate Markdown file. -Typically, each chapter starts with a level 1 heading with the title of the chapter. - -```md -# My First Chapter - -Fill out your content here. -``` - -The precise layout of the files is up to you. -The organization of the files will correspond to the HTML files generated, so keep in mind that the file layout is part of the URL of each chapter. - -While the `mdbook serve` command is running, you can open any of the chapter files and start editing them. -Each time you save the file, `mdbook` will rebuild the book and refresh your web browser. - -Check out the [Markdown chapter](../format/markdown.md) for more information on formatting the content of your chapters. - -All other files in the `src` directory will be included in the output. -So if you have images or other static files, just include them somewhere in the `src` directory. - -## Publishing a book - -Once you've written your book, you may want to host it somewhere for others to view. -The first step is to build the output of the book. -This can be done with the `mdbook build` command in the same directory where the `book.toml` file is located: - -```sh -mdbook build -``` - -This will generate a directory named `book` which contains the HTML content of your book. -You can then place this directory on any web server to host it. - -For more information about publishing and deploying, check out the [Continuous Integration chapter](../continuous-integration.md) for more. \ No newline at end of file diff --git a/website/doc/es/src/guide/installation.md b/website/doc/es/src/guide/installation.md deleted file mode 100644 index 128b1047..00000000 --- a/website/doc/es/src/guide/installation.md +++ /dev/null @@ -1,52 +0,0 @@ -# Installation - -There are multiple ways to install the mdBook CLI tool. -Choose any one of the methods below that best suit your needs. -If you are installing mdBook for automatic deployment, check out the [continuous integration] chapter for more examples on how to install. - -[continuous integration]: ../continuous-integration.md - -## Pre-compiled binaries - -Executable binaries are available for download on the [GitHub Releases page][releases]. -Download the binary for your platform (Windows, macOS, or Linux) and extract the archive. -The archive contains an `mdbook` executable which you can run to build your books. - -To make it easier to run, put the path to the binary into your `PATH`. - -[releases]: https://github.com/rust-lang/mdBook/releases - -## Build from source using Rust - -To build the `mdbook` executable from source, you will first need to install Rust and Cargo. -Follow the instructions on the [Rust installation page]. -mdBook currently requires at least Rust version 1.54. - -Once you have installed Rust, the following command can be used to build and install mdBook: - -```sh -cargo install mdbook -``` - -This will automatically download mdBook from [crates.io], build it, and install it in Cargo's global binary directory (`~/.cargo/bin/` by default). - -To uninstall, run the command `cargo uninstall mdbook`. - -[Rust installation page]: https://www.rust-lang.org/tools/install -[crates.io]: https://crates.io/ - -### Installing the latest master version - -The version published to crates.io will ever so slightly be behind the version hosted on GitHub. -If you need the latest version you can build the git version of mdBook yourself. -Cargo makes this ***super easy***! - -```sh -cargo install --git https://github.com/rust-lang/mdBook.git mdbook -``` - -Again, make sure to add the Cargo bin directory to your `PATH`. - -If you are interested in making modifications to mdBook itself, check out the [Contributing Guide] for more information. - -[Contributing Guide]: https://github.com/rust-lang/mdBook/blob/master/CONTRIBUTING.md diff --git a/website/doc/es/src/guide/reading.md b/website/doc/es/src/guide/reading.md deleted file mode 100644 index cab3a865..00000000 --- a/website/doc/es/src/guide/reading.md +++ /dev/null @@ -1,74 +0,0 @@ -# Reading Books - -This chapter gives an introduction on how to interact with a book produced by mdBook. -This assumes you are reading an HTML book. -The options and formatting will be different for other output formats such as PDF. - -A book is organized into *chapters*. -Each chapter is a separate page. -Chapters can be nested into a hierarchy of sub-chapters. -Typically, each chapter will be organized into a series of *headings* to subdivide a chapter. - -## Navigation - -There are several methods for navigating through the chapters of a book. - -The **sidebar** on the left provides a list of all chapters. -Clicking on any of the chapter titles will load that page. - -The sidebar may not automatically appear if the window is too narrow, particularly on mobile displays. -In that situation, the menu icon (three horizontal bars) at the top-left of the page can be pressed to open and close the sidebar. - -The **arrow buttons** at the bottom of the page can be used to navigate to the previous or the next chapter. - -The **left and right arrow keys** on the keyboard can be used to navigate to the previous or the next chapter. - -## Top menu bar - -The menu bar at the top of the page provides some icons for interacting with the book. -The icons displayed will depend on the settings of how the book was generated. - -| Icon | Description | -|------|-------------| -| <i class="fa fa-bars"></i> | Opens and closes the chapter listing sidebar. | -| <i class="fa fa-paint-brush"></i> | Opens a picker to choose a different color theme. | -| <i class="fa fa-search"></i> | Opens a search bar for searching within the book. | -| <i class="fa fa-print"></i> | Instructs the web browser to print the entire book. | -| <i class="fa fa-github"></i> | Opens a link to the website that hosts the source code of the book. | -| <i class="fa fa-edit"></i> | Opens a page to directly edit the source of the page you are currently reading. | - -Tapping the menu bar will scroll the page to the top. - -## Search - -Each book has a built-in search system. -Pressing the search icon (<i class="fa fa-search"></i>) in the menu bar, or pressing the `S` key on the keyboard will open an input box for entering search terms. -Typing some terms will show matching chapters and sections in real time. - -Clicking any of the results will jump to that section. -The up and down arrow keys can be used to navigate the results, and enter will open the highlighted section. - -After loading a search result, the matching search terms will be highlighted in the text. -Clicking a highlighted word or pressing the `Esc` key will remove the highlighting. - -## Code blocks - -mdBook books are often used for programming projects, and thus support highlighting code blocks and samples. -Code blocks may contain several different icons for interacting with them: - -| Icon | Description | -|------|-------------| -| <i class="fa fa-copy"></i> | Copies the code block into your local clipboard, to allow pasting into another application. | -| <i class="fa fa-play"></i> | For Rust code examples, this will execute the sample code and display the compiler output just below the example (see [playground]). | -| <i class="fa fa-eye"></i> | For Rust code examples, this will toggle visibility of "hidden" lines. Sometimes, larger examples will hide lines which are not particularly relevant to what is being illustrated (see [hiding code lines]). | -| <i class="fa fa-history"></i> | For [editable code examples][editor], this will undo any changes you have made. | - -Here's an example: - -```rust -println!("Hello, World!"); -``` - -[editor]: ../format/theme/editor.md -[playground]: ../format/mdbook.md#rust-playground -[hiding code lines]: ../format/mdbook.md#hiding-code-lines diff --git a/website/doc/es/src/misc/contributors.md b/website/doc/es/src/misc/contributors.md deleted file mode 100644 index 362a21fe..00000000 --- a/website/doc/es/src/misc/contributors.md +++ /dev/null @@ -1,24 +0,0 @@ -# Contributors - -Here is a list of the contributors who have helped improving mdBook. Big -shout-out to them! - -- [mdinger](https://github.com/mdinger) -- Kevin ([kbknapp](https://github.com/kbknapp)) -- Steve Klabnik ([steveklabnik](https://github.com/steveklabnik)) -- Adam Solove ([asolove](https://github.com/asolove)) -- Wayne Nilsen ([waynenilsen](https://github.com/waynenilsen)) -- [funnkill](https://github.com/funkill) -- Fu Gangqiang ([FuGangqiang](https://github.com/FuGangqiang)) -- [Michael-F-Bryan](https://github.com/Michael-F-Bryan) -- Chris Spiegel ([cspiegel](https://github.com/cspiegel)) -- [projektir](https://github.com/projektir) -- [Phaiax](https://github.com/Phaiax) -- Matt Ickstadt ([mattico](https://github.com/mattico)) -- Weihang Lo ([weihanglo](https://github.com/weihanglo)) -- Avision Ho ([avisionh](https://github.com/avisionh)) -- Vivek Akupatni ([apatniv](https://github.com/apatniv)) -- Eric Huss ([ehuss](https://github.com/ehuss)) -- Josh Rotenberg ([joshrotenberg](https://github.com/joshrotenberg)) - -If you feel you're missing from this list, feel free to add yourself in a PR. diff --git a/website/doc/es/theme/book.js b/website/doc/es/theme/book.js deleted file mode 100644 index c4ab6988..00000000 --- a/website/doc/es/theme/book.js +++ /dev/null @@ -1,679 +0,0 @@ -"use strict"; - -// Fix back button cache problem -window.onunload = function () { }; - -// Global variable, shared between modules -function playground_text(playground) { - let code_block = playground.querySelector("code"); - - if (window.ace && code_block.classList.contains("editable")) { - let editor = window.ace.edit(code_block); - return editor.getValue(); - } else { - return code_block.textContent; - } -} - -(function codeSnippets() { - function fetch_with_timeout(url, options, timeout = 6000) { - return Promise.race([ - fetch(url, options), - new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) - ]); - } - - var playgrounds = Array.from(document.querySelectorAll(".playground")); - if (playgrounds.length > 0) { - fetch_with_timeout("https://play.rust-lang.org/meta/crates", { - headers: { - 'Content-Type': "application/json", - }, - method: 'POST', - mode: 'cors', - }) - .then(response => response.json()) - .then(response => { - // get list of crates available in the rust playground - let playground_crates = response.crates.map(item => item["id"]); - playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); - }); - } - - function handle_crate_list_update(playground_block, playground_crates) { - // update the play buttons after receiving the response - update_play_button(playground_block, playground_crates); - - // and install on change listener to dynamically update ACE editors - if (window.ace) { - let code_block = playground_block.querySelector("code"); - if (code_block.classList.contains("editable")) { - let editor = window.ace.edit(code_block); - editor.addEventListener("change", function (e) { - update_play_button(playground_block, playground_crates); - }); - // add Ctrl-Enter command to execute rust code - editor.commands.addCommand({ - name: "run", - bindKey: { - win: "Ctrl-Enter", - mac: "Ctrl-Enter" - }, - exec: _editor => run_rust_code(playground_block) - }); - } - } - } - - // updates the visibility of play button based on `no_run` class and - // used crates vs ones available on http://play.rust-lang.org - function update_play_button(pre_block, playground_crates) { - var play_button = pre_block.querySelector(".play-button"); - - // skip if code is `no_run` - if (pre_block.querySelector('code').classList.contains("no_run")) { - play_button.classList.add("hidden"); - return; - } - - // get list of `extern crate`'s from snippet - var txt = playground_text(pre_block); - var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; - var snippet_crates = []; - var item; - while (item = re.exec(txt)) { - snippet_crates.push(item[1]); - } - - // check if all used crates are available on play.rust-lang.org - var all_available = snippet_crates.every(function (elem) { - return playground_crates.indexOf(elem) > -1; - }); - - if (all_available) { - play_button.classList.remove("hidden"); - } else { - play_button.classList.add("hidden"); - } - } - - function run_rust_code(code_block) { - var result_block = code_block.querySelector(".result"); - if (!result_block) { - result_block = document.createElement('code'); - result_block.className = 'result hljs language-bash'; - - code_block.append(result_block); - } - - let text = playground_text(code_block); - let classes = code_block.querySelector('code').classList; - let edition = "2015"; - if(classes.contains("edition2018")) { - edition = "2018"; - } else if(classes.contains("edition2021")) { - edition = "2021"; - } - var params = { - version: "stable", - optimize: "0", - code: text, - edition: edition - }; - - if (text.indexOf("#![feature") !== -1) { - params.version = "nightly"; - } - - result_block.innerText = "Running..."; - - fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { - headers: { - 'Content-Type': "application/json", - }, - method: 'POST', - mode: 'cors', - body: JSON.stringify(params) - }) - .then(response => response.json()) - .then(response => { - if (response.result.trim() === '') { - result_block.innerText = "No output"; - result_block.classList.add("result-no-output"); - } else { - result_block.innerText = response.result; - result_block.classList.remove("result-no-output"); - } - }) - .catch(error => result_block.innerText = "Playground Communication: " + error.message); - } - - // Syntax highlighting Configuration - hljs.configure({ - tabReplace: ' ', // 4 spaces - languages: [], // Languages used for auto-detection - }); - - let code_nodes = Array - .from(document.querySelectorAll('code')) - // Don't highlight `inline code` blocks in headers. - .filter(function (node) {return !node.parentElement.classList.contains("header"); }); - - if (window.ace) { - // language-rust class needs to be removed for editable - // blocks or highlightjs will capture events - code_nodes - .filter(function (node) {return node.classList.contains("editable"); }) - .forEach(function (block) { block.classList.remove('language-rust'); }); - - Array - code_nodes - .filter(function (node) {return !node.classList.contains("editable"); }) - .forEach(function (block) { hljs.highlightBlock(block); }); - } else { - code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); - } - - // Adding the hljs class gives code blocks the color css - // even if highlighting doesn't apply - code_nodes.forEach(function (block) { block.classList.add('hljs'); }); - - Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { - - var lines = Array.from(block.querySelectorAll('.boring')); - // If no lines were hidden, return - if (!lines.length) { return; } - block.classList.add("hide-boring"); - - var buttons = document.createElement('div'); - buttons.className = 'buttons'; - buttons.innerHTML = "<button class=\"fa fa-eye\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; - - // add expand button - var pre_block = block.parentNode; - pre_block.insertBefore(buttons, pre_block.firstChild); - - pre_block.querySelector('.buttons').addEventListener('click', function (e) { - if (e.target.classList.contains('fa-eye')) { - e.target.classList.remove('fa-eye'); - e.target.classList.add('fa-eye-slash'); - e.target.title = 'Hide lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.remove('hide-boring'); - } else if (e.target.classList.contains('fa-eye-slash')) { - e.target.classList.remove('fa-eye-slash'); - e.target.classList.add('fa-eye'); - e.target.title = 'Show hidden lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.add('hide-boring'); - } - }); - }); - - if (window.playground_copyable) { - Array.from(document.querySelectorAll('pre code')).forEach(function (block) { - var pre_block = block.parentNode; - if (!pre_block.classList.contains('playground')) { - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var clipButton = document.createElement('button'); - clipButton.className = 'fa fa-copy clip-button'; - clipButton.title = 'Copy to clipboard'; - clipButton.setAttribute('aria-label', clipButton.title); - clipButton.innerHTML = '<i class=\"tooltiptext\"></i>'; - - buttons.insertBefore(clipButton, buttons.firstChild); - } - }); - } - - // Process playground code blocks - Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { - // Add play button - var buttons = pre_block.querySelector(".buttons"); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - var runCodeButton = document.createElement('button'); - runCodeButton.className = 'fa fa-play play-button'; - runCodeButton.hidden = true; - runCodeButton.title = 'Run this code'; - runCodeButton.setAttribute('aria-label', runCodeButton.title); - - buttons.insertBefore(runCodeButton, buttons.firstChild); - runCodeButton.addEventListener('click', function (e) { - run_rust_code(pre_block); - }); - - if (window.playground_copyable) { - var copyCodeClipboardButton = document.createElement('button'); - copyCodeClipboardButton.className = 'fa fa-copy clip-button'; - copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>'; - copyCodeClipboardButton.title = 'Copy to clipboard'; - copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); - - buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); - } - - let code_block = pre_block.querySelector("code"); - if (window.ace && code_block.classList.contains("editable")) { - var undoChangesButton = document.createElement('button'); - undoChangesButton.className = 'fa fa-history reset-button'; - undoChangesButton.title = 'Undo changes'; - undoChangesButton.setAttribute('aria-label', undoChangesButton.title); - - buttons.insertBefore(undoChangesButton, buttons.firstChild); - - undoChangesButton.addEventListener('click', function () { - let editor = window.ace.edit(code_block); - editor.setValue(editor.originalCode); - editor.clearSelection(); - }); - } - }); -})(); - -(function themes() { - var html = document.querySelector('html'); - var themeToggleButton = document.getElementById('theme-toggle'); - var themePopup = document.getElementById('theme-list'); - var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); - var stylesheets = { - ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), - tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), - highlight: document.querySelector("[href$='highlight.css']"), - }; - - function showThemes() { - themePopup.style.display = 'block'; - themeToggleButton.setAttribute('aria-expanded', true); - themePopup.querySelector("button#" + get_theme()).focus(); - } - - function hideThemes() { - themePopup.style.display = 'none'; - themeToggleButton.setAttribute('aria-expanded', false); - themeToggleButton.focus(); - } - - function get_theme() { - var theme; - try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } - if (theme === null || theme === undefined) { - return default_theme; - } else { - return theme; - } - } - - function set_theme(theme, store = true) { - let ace_theme; - - if (theme == 'coal' || theme == 'navy') { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = false; - stylesheets.highlight.disabled = true; - - ace_theme = "ace/theme/tomorrow_night"; - } else if (theme == 'ayu') { - stylesheets.ayuHighlight.disabled = false; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = true; - ace_theme = "ace/theme/tomorrow_night"; - } else { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = false; - ace_theme = "ace/theme/dawn"; - } - - setTimeout(function () { - themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; - }, 1); - - if (window.ace && window.editors) { - window.editors.forEach(function (editor) { - editor.setTheme(ace_theme); - }); - } - - var previousTheme = get_theme(); - - if (store) { - try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } - } - - html.classList.remove(previousTheme); - html.classList.add(theme); - } - - // Set theme - var theme = get_theme(); - - set_theme(theme, false); - - themeToggleButton.addEventListener('click', function () { - if (themePopup.style.display === 'block') { - hideThemes(); - } else { - showThemes(); - } - }); - - themePopup.addEventListener('click', function (e) { - var theme; - if (e.target.className === "theme") { - theme = e.target.id; - } else if (e.target.parentElement.className === "theme") { - theme = e.target.parentElement.id; - } else { - return; - } - set_theme(theme); - }); - - themePopup.addEventListener('focusout', function(e) { - // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) - if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { - hideThemes(); - } - }); - - // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 - document.addEventListener('click', function(e) { - if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { - hideThemes(); - } - }); - - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (!themePopup.contains(e.target)) { return; } - - switch (e.key) { - case 'Escape': - e.preventDefault(); - hideThemes(); - break; - case 'ArrowUp': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.previousElementSibling) { - li.previousElementSibling.querySelector('button').focus(); - } - break; - case 'ArrowDown': - e.preventDefault(); - var li = document.activeElement.parentElement; - if (li && li.nextElementSibling) { - li.nextElementSibling.querySelector('button').focus(); - } - break; - case 'Home': - e.preventDefault(); - themePopup.querySelector('li:first-child button').focus(); - break; - case 'End': - e.preventDefault(); - themePopup.querySelector('li:last-child button').focus(); - break; - } - }); -})(); - -(function sidebar() { - var html = document.querySelector("html"); - var sidebar = document.getElementById("sidebar"); - var sidebarLinks = document.querySelectorAll('#sidebar a'); - var sidebarToggleButton = document.getElementById("sidebar-toggle"); - var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); - var firstContact = null; - - function showSidebar() { - html.classList.remove('sidebar-hidden') - html.classList.add('sidebar-visible'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', 0); - }); - sidebarToggleButton.setAttribute('aria-expanded', true); - sidebar.setAttribute('aria-hidden', false); - try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } - } - - - var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); - - function toggleSection(ev) { - ev.currentTarget.parentElement.classList.toggle('expanded'); - } - - Array.from(sidebarAnchorToggles).forEach(function (el) { - el.addEventListener('click', toggleSection); - }); - - function hideSidebar() { - html.classList.remove('sidebar-visible') - html.classList.add('sidebar-hidden'); - Array.from(sidebarLinks).forEach(function (link) { - link.setAttribute('tabIndex', -1); - }); - sidebarToggleButton.setAttribute('aria-expanded', false); - sidebar.setAttribute('aria-hidden', true); - try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } - } - - // Toggle sidebar - sidebarToggleButton.addEventListener('click', function sidebarToggle() { - if (html.classList.contains("sidebar-hidden")) { - var current_width = parseInt( - document.documentElement.style.getPropertyValue('--sidebar-width'), 10); - if (current_width < 150) { - document.documentElement.style.setProperty('--sidebar-width', '150px'); - } - showSidebar(); - } else if (html.classList.contains("sidebar-visible")) { - hideSidebar(); - } else { - if (getComputedStyle(sidebar)['transform'] === 'none') { - hideSidebar(); - } else { - showSidebar(); - } - } - }); - - sidebarResizeHandle.addEventListener('mousedown', initResize, false); - - function initResize(e) { - window.addEventListener('mousemove', resize, false); - window.addEventListener('mouseup', stopResize, false); - html.classList.add('sidebar-resizing'); - } - function resize(e) { - var viewportOffset = sidebar.getBoundingClientRect(); - var pos = (e.clientX - sidebar.offsetLeft - viewportOffset.left); - if (pos < 20) { - hideSidebar(); - } else { - if (html.classList.contains("sidebar-hidden")) { - showSidebar(); - } - pos = Math.min(pos, window.innerWidth - 100); - document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); - } - } - //on mouseup remove windows functions mousemove & mouseup - function stopResize(e) { - html.classList.remove('sidebar-resizing'); - window.removeEventListener('mousemove', resize, false); - window.removeEventListener('mouseup', stopResize, false); - } - - document.addEventListener('touchstart', function (e) { - firstContact = { - x: e.touches[0].clientX, - time: Date.now() - }; - }, { passive: true }); - - document.addEventListener('touchmove', function (e) { - if (!firstContact) - return; - - var curX = e.touches[0].clientX; - var xDiff = curX - firstContact.x, - tDiff = Date.now() - firstContact.time; - - if (tDiff < 250 && Math.abs(xDiff) >= 150) { - if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) - showSidebar(); - else if (xDiff < 0 && curX < 300) - hideSidebar(); - - firstContact = null; - } - }, { passive: true }); - - // Try to show the full sidebar - if (html.classList.contains("sidebar-visible")) { - var realHeight = sidebar.querySelector(".sidebar-scrollbox").scrollHeight; - document.getElementById("page-wrapper").style.minHeight = realHeight + 80 + "px"; - } -})(); - -(function chapterNavigation() { - document.addEventListener('keydown', function (e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } - if (window.search && window.search.hasFocus()) { return; } - - switch (e.key) { - case 'ArrowRight': - e.preventDefault(); - var nextButton = document.querySelector('.nav-chapters.next'); - if (nextButton) { - window.location.href = nextButton.href; - } - break; - case 'ArrowLeft': - e.preventDefault(); - var previousButton = document.querySelector('.nav-chapters.previous'); - if (previousButton) { - window.location.href = previousButton.href; - } - break; - } - }); -})(); - -(function clipboard() { - var clipButtons = document.querySelectorAll('.clip-button'); - - function hideTooltip(elem) { - elem.firstChild.innerText = ""; - elem.className = 'fa fa-copy clip-button'; - } - - function showTooltip(elem, msg) { - elem.firstChild.innerText = msg; - elem.className = 'fa fa-copy tooltipped'; - } - - var clipboardSnippets = new ClipboardJS('.clip-button', { - text: function (trigger) { - hideTooltip(trigger); - let playground = trigger.closest("pre"); - return playground_text(playground); - } - }); - - Array.from(clipButtons).forEach(function (clipButton) { - clipButton.addEventListener('mouseout', function (e) { - hideTooltip(e.currentTarget); - }); - }); - - clipboardSnippets.on('success', function (e) { - e.clearSelection(); - showTooltip(e.trigger, "Copied!"); - }); - - clipboardSnippets.on('error', function (e) { - showTooltip(e.trigger, "Clipboard error!"); - }); -})(); - -(function scrollToTop () { - var menuTitle = document.querySelector('.menu-title'); - - menuTitle.addEventListener('click', function () { - document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); - }); -})(); - -(function controllMenu() { - var menu = document.getElementById('menu-bar'); - - (function controllPosition() { - var scrollTop = document.scrollingElement.scrollTop; - var prevScrollTop = scrollTop; - var minMenuY = -menu.clientHeight - 50; - // When the script loads, the page can be at any scroll (e.g. if you reforesh it). - menu.style.top = scrollTop + 'px'; - // Same as parseInt(menu.style.top.slice(0, -2), but faster - var topCache = menu.style.top.slice(0, -2); - menu.classList.remove('sticky'); - var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster - document.addEventListener('scroll', function () { - scrollTop = Math.max(document.scrollingElement.scrollTop, 0); - // `null` means that it doesn't need to be updated - var nextSticky = null; - var nextTop = null; - var scrollDown = scrollTop > prevScrollTop; - var menuPosAbsoluteY = topCache - scrollTop; - if (scrollDown) { - nextSticky = false; - if (menuPosAbsoluteY > 0) { - nextTop = prevScrollTop; - } - } else { - if (menuPosAbsoluteY > 0) { - nextSticky = true; - } else if (menuPosAbsoluteY < minMenuY) { - nextTop = prevScrollTop + minMenuY; - } - } - if (nextSticky === true && stickyCache === false) { - menu.classList.add('sticky'); - stickyCache = true; - } else if (nextSticky === false && stickyCache === true) { - menu.classList.remove('sticky'); - stickyCache = false; - } - if (nextTop !== null) { - menu.style.top = nextTop + 'px'; - topCache = nextTop; - } - prevScrollTop = scrollTop; - }, { passive: true }); - })(); - (function controllBorder() { - menu.classList.remove('bordered'); - document.addEventListener('scroll', function () { - if (menu.offsetTop === 0) { - menu.classList.remove('bordered'); - } else { - menu.classList.add('bordered'); - } - }, { passive: true }); - })(); -})(); diff --git a/website/doc/es/theme/css/chrome.css b/website/doc/es/theme/css/chrome.css deleted file mode 100644 index 7f9dc35d..00000000 --- a/website/doc/es/theme/css/chrome.css +++ /dev/null @@ -1,552 +0,0 @@ -/* CSS for UI elements (a.k.a. chrome) */ - -@import 'variables.css'; - -::-webkit-scrollbar { - background: var(--bg); -} -::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -#mdbook { - position: relative; - scrollbar-color: var(--scrollbar) var(--bg); -} -#mdbook .content { - position: relative; -} - -#mdbook #searchresults a, -#mdbook .content a:link, -#mdbook a:visited, -#mdbook a > .hljs { - color: var(--links); -} - -/* Menu Bar */ - -#menu-bar, -#menu-bar-hover-placeholder { - z-index: 101; - margin: auto calc(0px - var(--page-padding)); -} -#menu-bar { - position: relative; - display: flex; - flex-wrap: wrap; - background-color: var(--bg); - border-bottom-color: var(--bg); - border-bottom-width: 1px; - border-bottom-style: solid; -} -#menu-bar.sticky, -.js #menu-bar-hover-placeholder:hover + #menu-bar, -.js #menu-bar:hover, -.js.sidebar-visible #menu-bar { - position: -webkit-sticky; - position: sticky; - top: 0 !important; -} -#menu-bar-hover-placeholder { - position: sticky; - position: -webkit-sticky; - top: 0; - height: var(--menu-bar-height); -} -#menu-bar.bordered { - border-bottom-color: var(--table-border-color); -} -#menu-bar i, #menu-bar .icon-button { - position: relative; - padding: 0 8px; - z-index: 10; - line-height: var(--menu-bar-height); - cursor: pointer; - transition: color 0.5s; -} -@media only screen and (max-width: 420px) { - #menu-bar i, #menu-bar .icon-button { - padding: 0 5px; - } -} - -#mdbook .icon-button { - border: none; - background: none; - padding: 0; - color: inherit; -} -#mdbook .icon-button i { - margin: 0; -} - -#mdbook .right-buttons { - margin: 0 15px; -} -#mdbook .right-buttons a { - text-decoration: none; -} - -#mdbook .left-buttons { - display: flex; - margin: 0 5px; -} -.no-js #mdbook .left-buttons { - display: none; -} - -#mdbook .menu-title { - display: inline-block; - font-weight: 200; - font-size: 1.8rem; - line-height: var(--menu-bar-height); - text-align: center; - margin: 0; - flex: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.js #mdbook .menu-title { - cursor: pointer; -} -@media only screen and (max-width: 640px) { - #mdbook .menu-title { - font-size: 1.5rem; - } -} -@media only screen and (max-width: 420px) { - #mdbook .menu-title { - font-size: 1.2rem; - } -} - -#mdbook .menu-bar, -#mdbook .menu-bar:visited, -#mdbook .nav-chapters, -#mdbook .nav-chapters:visited, -#mdbook .mobile-nav-chapters, -#mdbook .mobile-nav-chapters:visited, -#mdbook .menu-bar .icon-button, -#mdbook .menu-bar a i { - color: var(--icons); -} - -#mdbook .menu-bar i:hover, -#mdbook .menu-bar .icon-button:hover, -#mdbook .nav-chapters:hover, -#mdbook .mobile-nav-chapters i:hover { - color: var(--icons-hover); -} - -/* Nav Icons */ - -#mdbook .nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - - position: absolute; - top: 0; - bottom: 0; - margin: 0; - max-width: 150px; - min-width: 90px; - - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - - transition: color 0.5s, background-color 0.5s; -} - -#mdbook .nav-chapters:hover { - text-decoration: none; - background-color: var(--theme-hover); - transition: background-color 0.15s, color 0.15s; -} - -#mdbook .nav-wrapper { - margin-top: 50px; - display: none; -} - -#mdbook .mobile-nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - width: 90px; - border-radius: 5px; - background-color: var(--sidebar-bg); -} - -#mdbook .previous { - float: left; -} - -#mdbook .next { - float: right; - right: var(--page-padding); -} - -@media only screen and (max-width: 1080px) { - #mdbook .nav-wide-wrapper { display: none; } - #mdbook .nav-wrapper { display: block; } -} - -@media only screen and (max-width: 1380px) { - .sidebar-visible #mdbook .nav-wide-wrapper { display: none; } - .sidebar-visible #mdbook .nav-wrapper { display: block; } -} - -/* Inline code */ - -#mdbook :not(pre) > .hljs { - display: inline; - padding: 0.1em 0.3em; - border-radius: 3px; -} - -#mdbook :not(pre):not(a) > .hljs { - color: var(--inline-code-color); - overflow-x: initial; -} - -#mdbook a:hover > .hljs { - text-decoration: underline; -} - -#mdbook pre { - position: relative; - font-size: 0.875rem; -} -#mdbook pre > .buttons { - position: absolute; - z-index: 100; - right: 0px; - top: 2px; - margin: 0px; - padding: 2px 0px; - - color: var(--sidebar-fg); - cursor: pointer; - visibility: hidden; - opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; -} -#mdbook pre:hover > .buttons { - visibility: visible; - opacity: 1 -} -#mdbook pre > .buttons :hover { - color: var(--sidebar-active); - border-color: var(--icons-hover); - background-color: var(--theme-hover); -} -#mdbook pre > .buttons i { - margin-left: 8px; -} -#mdbook pre > .buttons button { - cursor: inherit; - margin: 0px 5px; - padding: 3px 5px; - font-size: 14px; - - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: var(--icons); - background-color: var(--theme-popup-bg); - transition: 100ms; - transition-property: color,border-color,background-color; - color: var(--icons); -} -@media (pointer: coarse) { - #mdbook pre > .buttons button { - /* On mobile, make it easier to tap buttons. */ - padding: 0.3rem 1rem; - } -} -#mdbook pre > code { - padding: 1rem; - font-size: 0.875rem; -} - -/* FIXME: ACE editors overlap their buttons because ACE does absolute - positioning within the code block which breaks padding. The only solution I - can think of is to move the padding to the outer pre tag (or insert a div - wrapper), but that would require fixing a whole bunch of CSS rules. -*/ -#mdbook .hljs.ace_editor { - padding: 0rem 0rem; -} - -#mdbook pre > .result { - margin-top: 10px; -} - -/* Search */ - -#searchresults a { - text-decoration: none; -} - -#mdbook mark { - border-radius: 2px; - padding: 0 3px 1px 3px; - margin: 0 -3px -1px -3px; - background-color: var(--search-mark-bg); - transition: background-color 300ms linear; - cursor: pointer; -} - -#mdbook mark.fade-out { - background-color: rgba(0,0,0,0) !important; - cursor: auto; -} - -#mdbook .searchbar-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} - -#searchbar { - width: 100%; - margin: 5px auto 0px auto; - padding: 10px 16px; - transition: box-shadow 300ms ease-in-out; - border: 1px solid var(--searchbar-border-color); - border-radius: 3px; - background-color: var(--searchbar-bg); - color: var(--searchbar-fg); -} -#searchbar:focus, -#searchbar.active { - box-shadow: 0 0 3px var(--searchbar-shadow-color); -} - -#mdbook .searchresults-header { - font-weight: bold; - font-size: 1em; - padding: 18px 0 0 5px; - color: var(--searchresults-header-fg); -} - -#mdbook .searchresults-outer { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); - border-bottom: 1px dashed var(--searchresults-border-color); -} - -#mdbook ul#searchresults { - list-style: none; - padding-left: 20px; -} -#mdbook ul#searchresults li { - margin: 10px 0px; - padding: 2px; - border-radius: 2px; -} -#mdbook ul#searchresults li.focus { - background-color: var(--searchresults-li-bg); -} -#mdbook ul#searchresults span.teaser { - display: block; - clear: both; - margin: 5px 0 0 20px; - font-size: 0.8em; -} -#mdbook ul#searchresults span.teaser em { - font-weight: bold; - font-style: normal; -} - -/* Sidebar */ -#mdbook .sidebar { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: var(--sidebar-width); - font-size: 0.875em; - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - overscroll-behavior-y: contain; - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); -} -.sidebar-resizing { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.js:not(.sidebar-resizing) #mdbook .sidebar { - transition: transform 0.3s; /* Animation: slide away */ -} -#mdbook .sidebar code { - line-height: 2em; -} -#mdbook .sidebar .sidebar-scrollbox { - overflow-y: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 10px 10px; -} -#mdbook .sidebar .sidebar-resize-handle { - position: absolute; - cursor: col-resize; - width: 0; - right: 0; - top: 0; - bottom: 0; -} -.js #mdbook .sidebar .sidebar-resize-handle { - cursor: col-resize; - width: 5px; -} -.sidebar-hidden #mdbook .sidebar { - transform: translateX(calc(0px - var(--sidebar-width))); -} -#mdbook .sidebar::-webkit-scrollbar { - background: var(--sidebar-bg); -} -#mdbook .sidebar::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -.sidebar-visible #mdbook .page-wrapper { - transform: translateX(var(--sidebar-width)); -} -@media only screen and (min-width: 620px) { - .sidebar-visible #mdbook .page-wrapper { - transform: none; - margin-left: var(--sidebar-width); - } -} - -#mdbook .chapter { - list-style: none outside none; - padding-left: 0; - line-height: 2.2em; -} - -#mdbook .chapter ol { - width: 100%; -} - -#mdbook .chapter li { - display: flex; - color: var(--sidebar-non-existant); -} -#mdbook .chapter li a { - display: block; - padding: 0; - text-decoration: none; - color: var(--sidebar-fg); -} - -#mdbook .chapter li a:hover { - color: var(--sidebar-active); -} - -#mdbook .chapter li a.active { - color: var(--sidebar-active); -} - -#mdbook .chapter li > a.toggle { - cursor: pointer; - display: block; - margin-left: auto; - padding: 0 10px; - user-select: none; - opacity: 0.68; -} - -#mdbook .chapter li > a.toggle div { - transition: transform 0.5s; -} - -/* collapse the section */ -#mdbook .chapter li:not(.expanded) + li > ol { - display: none; -} - -#mdbook .chapter li.chapter-item { - line-height: 1.5em; - margin-top: 0.6em; -} - -#mdbook .chapter li.expanded > a.toggle div { - transform: rotate(90deg); -} - -#mdbook .spacer { - width: 100%; - height: 3px; - margin: 5px 0px; -} -#mdbook .chapter .spacer { - background-color: var(--sidebar-spacer); -} - -@media (-moz-touch-enabled: 1), (pointer: coarse) { - #mdbook .chapter li a { padding: 5px 0; } - #mdbook .spacer { margin: 10px 0; } -} - -#mdbook .section { - list-style: none outside none; - margin: 0; - padding: 0 0 0 20px; - line-height: 1.9em; -} - -/* Theme Menu Popup */ - -#mdbook .theme-popup { - position: absolute; - left: 10px; - top: var(--menu-bar-height); - z-index: 1000; - border-radius: 4px; - font-size: 0.7em; - color: var(--fg); - background: var(--theme-popup-bg); - border: 1px solid var(--theme-popup-border); - margin: 0; - padding: 0; - list-style: none; - display: none; -} -#mdbook .theme-popup .default { - color: var(--icons); -} -#mdbook .theme-popup .theme { - width: 100%; - border: 0; - margin: 0; - padding: 2px 10px; - line-height: 25px; - white-space: nowrap; - text-align: left; - cursor: pointer; - color: inherit; - background: inherit; - font-size: inherit; -} -#mdbook .theme-popup .theme:hover { - background-color: var(--theme-hover); -} -#mdbook .theme-popup .theme:hover:first-child, -#mdbook .theme-popup .theme:hover:last-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} diff --git a/website/doc/es/theme/css/general.css b/website/doc/es/theme/css/general.css deleted file mode 100644 index 8ace6312..00000000 --- a/website/doc/es/theme/css/general.css +++ /dev/null @@ -1,187 +0,0 @@ -/* Base styles and content styles */ - -@import 'variables.css'; - -#mdbook { - font-family: "Open Sans", sans-serif; - color: var(--fg); - background-color: var(--bg); - text-size-adjust: none; - -webkit-text-size-adjust: none; - overflow-x: hidden; -} - -#mdbook code { - font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; -} - -/* make long words/inline code not x overflow */ -#mdbook main { - overflow-wrap: break-word; -} - -/* make wide tables scroll if they overflow */ -#mdbook .table-wrapper { - overflow-x: auto; -} - -/* Don't change font size in headers. */ -#mdbook h1 code, -#mdbook h2 code, -#mdbook h3 code, -#mdbook h4 code, -#mdbook h5 code, -#mdbook h6 code { - font-size: unset; -} - -#mdbook .left { float: left; } -#mdbook .right { float: right; } -#mdbook .boring { opacity: 0.6; } -#mdbook .hide-boring .boring { display: none; } -#mdbook .hidden { display: none !important; } - -#mdbook h2, #mdbook h3 { margin-top: 2.5em; } -#mdbook h4, #mdbook h5 { margin-top: 2em; } - -#mdbook .header + .header h3, -#mdbook .header + .header h4, -#mdbook .header + .header h5 { - margin-top: 1em; -} - -#mdbook h1:target::before, -#mdbook h2:target::before, -#mdbook h3:target::before, -#mdbook h4:target::before, -#mdbook h5:target::before, -#mdbook h6:target::before { - display: inline-block; - content: "»"; - margin-left: -30px; - width: 30px; -} - -/* This is broken on Safari as of version 14, but is fixed - in Safari Technology Preview 117 which I think will be Safari 14.2. - https://bugs.webkit.org/show_bug.cgi?id=218076 -*/ -:target { - scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); -} - -#mdbook .page { - outline: 0; - padding: 0 var(--page-padding); - margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ -} -#mdbook .page-wrapper { - box-sizing: border-box; -} -.js:not(.sidebar-resizing) #mdbook .page-wrapper { - transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ -} - -#mdbook .content { - overflow-y: auto; - padding: 20px 5px 50px 5px; -} -#mdbook .content main { - margin-left: auto; - margin-right: auto; - max-width: var(--content-max-width); -} -#mdbook .content p { line-height: 1.45em; } -#mdbook .content ol { line-height: 1.45em; } -#mdbook .content ul { line-height: 1.45em; } -#mdbook .content a { text-decoration: none; } -#mdbook .content a:hover { text-decoration: underline; } -#mdbook .content img, .content video { max-width: 100%; } -#mdbook .content .header:link, -#mdbook .content .header:visited { - color: var(--fg); -} -#mdbook .content .header:link, -#mdbook .content .header:visited:hover { - text-decoration: none; -} - -#mdbook table { - margin: 0 auto; - border-collapse: collapse; -} -#mdbook table td { - padding: 3px 20px; - border: 1px var(--table-border-color) solid; -} -#mdbook table thead { - background: var(--table-header-bg); -} -#mdbook table thead td { - font-weight: 700; - border: none; -} -#mdbook table thead th { - padding: 3px 20px; -} -#mdbook table thead tr { - border: 1px var(--table-header-bg) solid; -} -/* Alternate background colors for rows */ -#mdbook table tbody tr:nth-child(2n) { - background: var(--table-alternate-bg); -} - - -#mdbook blockquote { - margin: 20px 0; - padding: 0 20px; - color: var(--fg); - background-color: var(--quote-bg); - border-top: .1em solid var(--quote-border); - border-bottom: .1em solid var(--quote-border); -} -#mdbook blockquote p { - margin-top: 1rem; -} - -#mdbook :not(.footnote-definition) + .footnote-definition, -#mdbook .footnote-definition + :not(.footnote-definition) { - margin-top: 2em; -} -#mdbook .footnote-definition { - font-size: 0.9em; - margin: 0.5em 0; -} -#mdbook .footnote-definition p { - display: inline; -} - -#mdbook .tooltiptext { - position: absolute; - visibility: hidden; - color: #fff; - background-color: #333; - transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ - left: -8px; /* Half of the width of the icon */ - top: -35px; - font-size: 0.8em; - text-align: center; - border-radius: 6px; - padding: 5px 8px; - margin: 5px; - z-index: 1000; -} -#mdbook .tooltipped .tooltiptext { - visibility: visible; -} - -#mdbook .chapter li.part-title { - color: var(--sidebar-fg); - margin: 5px 0px; - font-weight: bold; -} - -#mdbook .result-no-output { - font-style: italic; -} diff --git a/website/doc/es/theme/css/print.css b/website/doc/es/theme/css/print.css deleted file mode 100644 index bd7c8da7..00000000 --- a/website/doc/es/theme/css/print.css +++ /dev/null @@ -1,65 +0,0 @@ -#sidebar, -#menu-bar, -#mdbook .nav-chapters, -#mdbook .mobile-nav-chapters { - display: none; -} - -#mdbook, -#page-wrapper { - margin: 0; - padding: 0; - max-width: none; - transform: none !important; - overflow-y: initial; -} - -#content { - max-width: none; - margin: 0; - padding: 0; -} - -#mdbook .page { - overflow-y: initial; -} - -#mdbook code { - background-color: #eeeeee; - border-radius: 5px; - - /* Force background to be printed in Chrome */ - -webkit-print-color-adjust: exact; -} - -#mdbook pre > .buttons { - z-index: 2; -} - -#mdbook a, -#mdbook a:visited, -#mdbook a:active, -#mdbook a:hover { - color: #4183c4; - text-decoration: none; -} - -#mdbook h1, -#mdbook h2, -#mdbook h3, -#mdbook h4, -#mdbook h5, -#mdbook h6 { - page-break-inside: avoid; - page-break-after: avoid; -} - -#mdbook pre, -#mdbook code { - page-break-inside: avoid; - white-space: pre-wrap; -} - -#mdbook .fa { - display: none !important; -} diff --git a/website/doc/es/theme/css/variables.css b/website/doc/es/theme/css/variables.css deleted file mode 100644 index 7a68155a..00000000 --- a/website/doc/es/theme/css/variables.css +++ /dev/null @@ -1,253 +0,0 @@ - -/* Globals */ - -:root { - --sidebar-width: 300px; - --page-padding: 15px; - --content-max-width: 750px; - --menu-bar-height: 50px; -} - -/* Themes */ - -.ayu { - --bg: hsl(210, 25%, 8%); - --fg: #c5c5c5; - - --sidebar-bg: #14191f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #5c6773; - --sidebar-active: #ffb454; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #0096cf; - - --inline-code-color: #ffb454; - - --theme-popup-bg: #14191f; - --theme-popup-border: #5c6773; - --theme-hover: #191f26; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(210, 25%, 13%); - --table-header-bg: hsl(210, 25%, 28%); - --table-alternate-bg: hsl(210, 25%, 11%); - - --searchbar-border-color: #848484; - --searchbar-bg: #424242; - --searchbar-fg: #fff; - --searchbar-shadow-color: #d4c89f; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #252932; - --search-mark-bg: #e3b171; -} - -.coal { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; -} - -.light { - --bg: hsl(0, 0%, 100%); - --fg: hsl(0, 0%, 0%); - - --sidebar-bg: #fafafa; - --sidebar-fg: hsl(0, 0%, 0%); - --sidebar-non-existant: #aaaaaa; - --sidebar-active: #1f1fff; - --sidebar-spacer: #f4f4f4; - - --scrollbar: #8F8F8F; - - --icons: #747474; - --icons-hover: #000000; - - --links: #20609f; - - --inline-code-color: #301900; - - --theme-popup-bg: #fafafa; - --theme-popup-border: #cccccc; - --theme-hover: #e6e6e6; - - --quote-bg: hsl(197, 37%, 96%); - --quote-border: hsl(197, 37%, 91%); - - --table-border-color: hsl(0, 0%, 95%); - --table-header-bg: hsl(0, 0%, 80%); - --table-alternate-bg: hsl(0, 0%, 97%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #e4f2fe; - --search-mark-bg: #a2cff5; -} - -.navy { - --bg: hsl(226, 23%, 11%); - --fg: #bcbdd0; - - --sidebar-bg: #282d3f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505274; - --sidebar-active: #2b79a2; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #161923; - --theme-popup-border: #737480; - --theme-hover: #282e40; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --table-border-color: hsl(226, 23%, 16%); - --table-header-bg: hsl(226, 23%, 31%); - --table-alternate-bg: hsl(226, 23%, 14%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #aeaec6; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #5f5f71; - --searchresults-border-color: #5c5c68; - --searchresults-li-bg: #242430; - --search-mark-bg: #a2cff5; -} - -.rust { - --bg: hsl(60, 9%, 87%); - --fg: #262625; - - --sidebar-bg: #3b2e2a; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505254; - --sidebar-active: #e69f67; - --sidebar-spacer: #45373a; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #262625; - - --links: #2b79a2; - - --inline-code-color: #6e6b5e; - - --theme-popup-bg: #e1e1db; - --theme-popup-border: #b38f6b; - --theme-hover: #99908a; - - --quote-bg: hsl(60, 5%, 75%); - --quote-border: hsl(60, 5%, 70%); - - --table-border-color: hsl(60, 9%, 82%); - --table-header-bg: #b3a497; - --table-alternate-bg: hsl(60, 9%, 84%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #dec2a2; - --search-mark-bg: #e69f67; -} - -@media (prefers-color-scheme: dark) { - .light.no-js { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - } -} diff --git a/website/doc/es/theme/highlight.css b/website/doc/es/theme/highlight.css deleted file mode 100644 index ba57b82b..00000000 --- a/website/doc/es/theme/highlight.css +++ /dev/null @@ -1,82 +0,0 @@ -/* - * An increased contrast highlighting scheme loosely based on the - * "Base16 Atelier Dune Light" theme by Bram de Haan - * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) - * Original Base16 color scheme by Chris Kempson - * (https://github.com/chriskempson/base16) - */ - -/* Comment */ -.hljs-comment, -.hljs-quote { - color: #575757; -} - -/* Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d70025; -} - -/* Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b21e00; -} - -/* Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #008200; -} - -/* Blue */ -.hljs-title, -.hljs-section { - color: #0030f2; -} - -/* Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #9d00ec; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f6f7f6; - color: #000; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #22863a; - background-color: #f0fff4; -} - -.hljs-deletion { - color: #b31d28; - background-color: #ffeef0; -} diff --git a/website/doc/es/theme/highlight.js b/website/doc/es/theme/highlight.js deleted file mode 100644 index 180385b7..00000000 --- a/website/doc/es/theme/highlight.js +++ /dev/null @@ -1,6 +0,0 @@ -/* - Highlight.js 10.1.1 (93fd0d73) - License: BSD-3-Clause - Copyright (c) 2006-2020, Ivan Sagalaev -*/ -var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/website/doc/es/theme/index.hbs b/website/doc/es/theme/index.hbs deleted file mode 100644 index 490b7ca1..00000000 --- a/website/doc/es/theme/index.hbs +++ /dev/null @@ -1,261 +0,0 @@ -<!-- Lang: {{ language }} --> -<!-- Title: {{ title }} --> -<!-- Print: {{#if print_enable}}enabled{{else}}disabled{{/if}} --> -<!-- MathJax: {{#if mathjax_support}}supported{{else}}unsupported{{/if}} --> - -<!-- mdBook --> - -<!-- Provide site root to javascript --> -<script type="text/javascript"> - var path_to_root = "{{ path_to_root }}"; - var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}"; -</script> - -<!-- Work around some values being stored in localStorage wrapped in quotes --> -<script type="text/javascript"> - try { - var theme = localStorage.getItem('mdbook-theme'); - var sidebar = localStorage.getItem('mdbook-sidebar'); - - if (theme.startsWith('"') && theme.endsWith('"')) { - localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); - } - - if (sidebar.startsWith('"') && sidebar.endsWith('"')) { - localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); - } - } catch (e) { } -</script> - -<!-- Set the theme before any content is loaded, prevents flash --> -<script type="text/javascript"> - var theme; - try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } - if (theme === null || theme === undefined) { theme = default_theme; } - var html = document.querySelector('html'); - html.classList.remove('no-js') - html.classList.remove('{{ default_theme }}') - html.classList.add(theme); - html.classList.add('js'); -</script> - -<!-- Hide / unhide sidebar before it is displayed --> -<script type="text/javascript"> - var html = document.querySelector('html'); - var sidebar = 'hidden'; - if (document.body.clientWidth >= 1080) { - try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } - sidebar = sidebar || 'visible'; - } - html.classList.remove('sidebar-visible'); - html.classList.add("sidebar-" + sidebar); -</script> - -<nav id="sidebar" class="sidebar" aria-label="Table of contents"> - <div class="sidebar-scrollbox"> - {{#toc}}{{/toc}} - </div> - <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> -</nav> - -<div id="page-wrapper" class="page-wrapper"> - - <div class="page"> - {{> header}} - <div id="menu-bar-hover-placeholder"></div> - <div id="menu-bar" class="menu-bar sticky bordered"> - <div class="left-buttons"> - <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> - <i class="fa fa-bars"></i> - </button> - <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> - <i class="fa fa-paint-brush"></i> - </button> - <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> - <li role="none"><button role="menuitem" class="theme" id="light">{{ theme_option "Light" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="rust">{{ theme_option "Rust" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="coal">{{ theme_option "Coal" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="navy">{{ theme_option "Navy" }}</button></li> - <li role="none"><button role="menuitem" class="theme" id="ayu">{{ theme_option "Ayu" }}</button></li> - </ul> - {{#if search_enabled}} - <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> - <i class="fa fa-search"></i> - </button> - {{/if}} - </div> - - <h1 class="menu-title">{{ book_title }}</h1> - - <div class="right-buttons"> - {{#if print_enable}} - <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book"> - <i id="print-button" class="fa fa-print"></i> - </a> - {{/if}} - {{#if git_repository_url}} - <a href="{{git_repository_url}}" title="Git repository" aria-label="Git repository"> - <i id="git-repository-button" class="fa {{git_repository_icon}}"></i> - </a> - {{/if}} - {{#if git_repository_edit_url}} - <a href="{{git_repository_edit_url}}" title="Suggest an edit" aria-label="Suggest an edit"> - <i id="git-edit-button" class="fa fa-edit"></i> - </a> - {{/if}} - - </div> - </div> - - {{#if search_enabled}} - <div id="search-wrapper" class="hidden"> - <form id="searchbar-outer" class="searchbar-outer"> - <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> - </form> - <div id="searchresults-outer" class="searchresults-outer hidden"> - <div id="searchresults-header" class="searchresults-header"></div> - <ul id="searchresults"> - </ul> - </div> - </div> - {{/if}} - - <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> - <script type="text/javascript"> - document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); - document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); - Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { - link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); - }); - </script> - - <div id="content" class="content"> - <main> - {{{ content }}} - </main> - - <nav class="nav-wrapper" aria-label="Page navigation"> - <!-- Mobile navigation buttons --> - {{#previous}} - <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> - <i class="fa fa-angle-left"></i> - </a> - {{/previous}} - - {{#next}} - <a rel="next" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> - <i class="fa fa-angle-right"></i> - </a> - {{/next}} - - <div style="clear: both"></div> - </nav> - </div> - </div> - - <nav class="nav-wide-wrapper" aria-label="Page navigation"> - {{#previous}} - <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> - <i class="fa fa-angle-left"></i> - </a> - {{/previous}} - - {{#next}} - <a rel="next" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> - <i class="fa fa-angle-right"></i> - </a> - {{/next}} - </nav> - -</div> - -{{#if live_reload_endpoint}} -<!-- Livereload script (if served using the cli tool) --> -<script type="text/javascript"> - const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; - const wsAddress = wsProtocol + "//" + location.host + "/" + "{{{live_reload_endpoint}}}"; - const socket = new WebSocket(wsAddress); - socket.onmessage = function (event) { - if (event.data === "reload") { - socket.close(); - location.reload(); - } - }; - - window.onbeforeunload = function() { - socket.close(); - } -</script> -{{/if}} - -{{#if google_analytics}} -<!-- Google Analytics Tag --> -<script type="text/javascript"> - var localAddrs = ["localhost", "127.0.0.1", ""]; - - // make sure we don't activate google analytics if the developer is - // inspecting the book locally... - if (localAddrs.indexOf(document.location.hostname) === -1) { - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); - - ga('create', '{{google_analytics}}', 'auto'); - ga('send', 'pageview'); - } -</script> -{{/if}} - -{{#if playground_line_numbers}} -<script type="text/javascript"> - window.playground_line_numbers = true; -</script> -{{/if}} - -{{#if playground_copyable}} -<script type="text/javascript"> - window.playground_copyable = true; -</script> -{{/if}} - -{{#if playground_js}} -<script src="{{ path_to_root }}ace.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}editor.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}mode-rust.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}theme-dawn.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}theme-tomorrow_night.js" type="text/javascript" charset="utf-8"></script> -{{/if}} - -{{#if search_js}} -<script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script> -{{/if}} - -<script src="{{ path_to_root }}clipboard.min.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}highlight.js" type="text/javascript" charset="utf-8"></script> -<script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script> - -<!-- Custom JS scripts --> -{{#each additional_js}} -<script type="text/javascript" src="{{ ../path_to_root }}{{this}}"></script> -{{/each}} - -{{#if is_print}} -{{#if mathjax_support}} -<script type="text/javascript"> -window.addEventListener('load', function() { - MathJax.Hub.Register.StartupHook('End', function() { - window.setTimeout(window.print, 100); - }); -}); -</script> -{{else}} -<script type="text/javascript"> -window.addEventListener('load', function() { - window.setTimeout(window.print, 100); -}); -</script> -{{/if}} -{{/if}} diff --git a/website/src/main.rs b/website/src/main.rs deleted file mode 100644 index 8bc871ed..00000000 --- a/website/src/main.rs +++ /dev/null @@ -1,33 +0,0 @@ -use pagetop::prelude::*; -use pagetop_mdbook::MdBook; - -pub_const_handler!(APP_PAGETOP_WEBSITE); - -include!(concat!(env!("OUT_DIR"), "/guides_en.rs")); -static GUIDES_EN: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides_en); - -include!(concat!(env!("OUT_DIR"), "/guias_es.rs")); -static GUIAS_ES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guias_es); - -struct PageTopWebSite; - -impl ModuleTrait for PageTopWebSite { - fn handler(&self) -> Handler { - APP_PAGETOP_WEBSITE - } - - fn dependencies(&self) -> Vec<ModuleStaticRef> { - vec![&MdBook, &pagetop::base::module::homepage::DefaultHomePage] - } - - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - MdBook::configure_service_for_common_resources(cfg); - MdBook::configure_service_for_mdbook(cfg, "/doc/en", &GUIDES_EN); - MdBook::configure_service_for_mdbook(cfg, "/doc/es", &GUIAS_ES); - } -} - -#[actix_web::main] -async fn main() -> std::io::Result<()> { - Application::prepare(&PageTopWebSite).await?.run()?.await -} From df6eaf19ccf22452f373cb3124f881cb7ff558fd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 16 Oct 2022 10:32:24 +0200 Subject: [PATCH 191/853] =?UTF-8?q?=F0=9F=93=9D=20Unifica=20y=20normaliza?= =?UTF-8?q?=20archivos=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- drust/README.md | 10 +++++----- pagetop-admin/README.md | 10 +++++----- pagetop-node/README.md | 10 +++++----- pagetop-user/README.md | 10 +++++----- pagetop/README.md | 10 +++++----- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 454d166f..34be8b35 100644 --- a/README.md +++ b/README.md @@ -51,8 +51,8 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: # 📜 Licencia -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: * Licencia Apache versión 2.0 ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o diff --git a/drust/README.md b/drust/README.md index ad163034..bf21c777 100644 --- a/drust/README.md +++ b/drust/README.md @@ -10,15 +10,15 @@ Rendering*). # 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene +ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta +que se libere la versión **0.1.0**. # 📜 Licencia -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: * Licencia Apache versión 2.0 ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o diff --git a/pagetop-admin/README.md b/pagetop-admin/README.md index f94e6bc3..db572f50 100644 --- a/pagetop-admin/README.md +++ b/pagetop-admin/README.md @@ -9,15 +9,15 @@ Rendering*). # 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene +ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta +que se libere la versión **0.1.0**. # 📜 Licencia -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: * Licencia Apache versión 2.0 ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o diff --git a/pagetop-node/README.md b/pagetop-node/README.md index 78fb75f9..25cb5e0c 100644 --- a/pagetop-node/README.md +++ b/pagetop-node/README.md @@ -9,15 +9,15 @@ Rendering*). # 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene +ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta +que se libere la versión **0.1.0**. # 📜 Licencia -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: * Licencia Apache versión 2.0 ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o diff --git a/pagetop-user/README.md b/pagetop-user/README.md index 1469bb3a..8cdef1dd 100644 --- a/pagetop-user/README.md +++ b/pagetop-user/README.md @@ -9,15 +9,15 @@ Rendering*). # 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene +ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta +que se libere la versión **0.1.0**. # 📜 Licencia -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: * Licencia Apache versión 2.0 ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o diff --git a/pagetop/README.md b/pagetop/README.md index bb05e077..b8260327 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -5,15 +5,15 @@ configurables. # 🚧 Advertencia -**PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene +ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta +que se libere la versión **0.1.0**. # 📜 Licencia -Este proyecto tiene licencia, de hecho tiene dos, puedes usarlo en tus propios proyectos si aplicas -cualquiera de las siguientes a tu elección: +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: * Licencia Apache versión 2.0 ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o From 68af9caef051aaebd04ca86709d1ae1646f506d3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 18 Oct 2022 21:22:28 +0200 Subject: [PATCH 192/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Sim?= =?UTF-8?q?plifica=20uso=20de=20archivos=20de=20configuraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/lib.rs | 2 +- pagetop/Cargo.toml | 5 +- pagetop/src/app/application.rs | 5 +- pagetop/src/app/banner.rs | 14 +- pagetop/src/app/banner/figfont.rs | 7 +- pagetop/src/app/db.rs | 28 +-- pagetop/src/app/locale.rs | 7 +- pagetop/src/app/tracing.rs | 17 +- pagetop/src/base/module/homepage.rs | 4 +- pagetop/src/config.rs | 255 +++++++++++------------- pagetop/src/core/theme/definition.rs | 6 +- pagetop/src/lib.rs | 52 ++++- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page/context.rs | 4 +- pagetop/src/response/page/definition.rs | 8 +- pagetop/src/util.rs | 2 +- 16 files changed, 216 insertions(+), 202 deletions(-) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 22c14c41..d45a2259 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -58,7 +58,7 @@ fn form_login() -> Form { t( "username_help", &args![ - "app" => SETTINGS.app.name.to_owned() + "app" => config::get("app.name").to_owned() ], ) .as_str(), diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 897ea673..59b051ca 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -24,7 +24,6 @@ categories = [ [dependencies] async-trait = "0.1.57" concat-string = "1.0.1" -doc-comment = "0.3.3" figlet-rs = "0.1.4" futures = "0.3.24" once_cell = "1.15.0" @@ -33,7 +32,7 @@ substring = "1.4.5" term_size = "0.3.2" url = "2.3.1" -config_rs = { package = "config", version = "0.11.0", features = ["toml"] } +config_rs = { package = "config", version = "0.13.2", features = ["toml"] } tracing = "0.1.36" tracing-appender = "0.2.2" @@ -51,8 +50,6 @@ static-files = "0.2.3" maud = { version = "0.24.0", features = ["actix-web"] } -serde = { version = "1.0", features = ["derive"] } - [dependencies.sea-orm] version = "0.9.3" features = ["debug-print", "macros", "runtime-async-std-native-tls"] diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index a5c18c4c..9d3c7c41 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,5 +1,5 @@ use super::fatal_error::FatalError; -use crate::config::SETTINGS; +use crate::config; use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; @@ -55,7 +55,8 @@ impl Application { }) .bind(format!( "{}:{}", - &SETTINGS.webserver.bind_address, &SETTINGS.webserver.bind_port + config::get("webserver.bind_address"), + config::get("webserver.bind_port") ))? .run(); diff --git a/pagetop/src/app/banner.rs b/pagetop/src/app/banner.rs index 1e50e54a..eb52f4a5 100644 --- a/pagetop/src/app/banner.rs +++ b/pagetop/src/app/banner.rs @@ -1,23 +1,23 @@ mod figfont; use figfont::FIGFONT; -use crate::config::SETTINGS; +use crate::config; use substring::Substring; pub fn print_on_startup() { - if SETTINGS.app.startup_banner.to_lowercase() != "off" { + if config::get("app.startup_banner").to_lowercase() != "off" { if let Some((term_width, _)) = term_size::dimensions() { if term_width >= 80 { let maxlen = (term_width / 10) - 2; - let mut app = SETTINGS.app.name.substring(0, maxlen).to_owned(); - if SETTINGS.app.name.len() > maxlen { + let mut app = config::get("app.name").substring(0, maxlen).to_owned(); + if config::get("app.name").len() > maxlen { app = format!("{}...", app); } println!( "\n{} {}\n\n Powered by PageTop {}\n", FIGFONT.convert(&app).unwrap(), - &SETTINGS.app.description, + config::get("app.description"), env!("CARGO_PKG_VERSION") ); return; @@ -25,8 +25,8 @@ pub fn print_on_startup() { } println!( "\n{}\n{}\n\nPowered by PageTop {}\n", - &SETTINGS.app.name, - &SETTINGS.app.description, + config::get("app.name"), + config::get("app.description"), env!("CARGO_PKG_VERSION") ); } diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index d92fe35a..48321dc8 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -1,5 +1,4 @@ -use crate::config::SETTINGS; -use crate::LazyStatic; +use crate::{config, LazyStatic}; use figlet_rs::FIGfont; @@ -9,7 +8,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { let speed = include_str!("speed.flf"); let starwars = include_str!("starwars.flf"); - FIGfont::from_content(match SETTINGS.app.startup_banner.to_lowercase().as_str() { + FIGfont::from_content(match config::get("app.startup_banner").to_lowercase().as_str() { "off" => slant, "slant" => slant, "small" => small, @@ -18,7 +17,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { _ => { println!( "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check the settings file.", - SETTINGS.app.startup_banner, + config::get("app.startup_banner"), ); slant } diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 98f96e47..61aec6fe 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,4 +1,4 @@ -use crate::config::SETTINGS; +use crate::config; use crate::db::*; use crate::{run_now, trace, LazyStatic}; @@ -8,38 +8,38 @@ use tracing_unwrap::ResultExt; pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", - &SETTINGS.database.db_name, - &SETTINGS.database.max_pool_size + config::get("database.db_name"), + config::get("database.max_pool_size") ); - let db_uri = match SETTINGS.database.db_type.as_str() { + let db_uri = match config::get("database.db_type").as_str() { "mysql" | "postgres" => { let mut tmp_uri = DbUri::parse( format!( "{}://{}/{}", - &SETTINGS.database.db_type, - &SETTINGS.database.db_host, - &SETTINGS.database.db_name + config::get("database.db_type"), + config::get("database.db_host"), + config::get("database.db_name") ) .as_str(), ) .unwrap(); tmp_uri - .set_username(SETTINGS.database.db_user.as_str()) + .set_username(config::get("database.db_user").as_str()) .unwrap(); // https://github.com/launchbadge/sqlx/issues/1624 tmp_uri - .set_password(Some(SETTINGS.database.db_pass.as_str())) + .set_password(Some(config::get("database.db_pass").as_str())) .unwrap(); - if SETTINGS.database.db_port != 0 { - tmp_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); + if config::get_value::<u16>("database.db_port") != 0 { + tmp_uri.set_port(Some(config::get_value::<u16>("database.db_port"))).unwrap(); } tmp_uri } "sqlite" => DbUri::parse( format!( "{}://{}", - &SETTINGS.database.db_type, &SETTINGS.database.db_name + config::get("database.db_type"), &config::get("database.db_name") ) .as_str(), ) @@ -47,7 +47,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { _ => { trace::error!( "Unrecognized database type \"{}\"", - &SETTINGS.database.db_type + config::get("database.db_type") ); DbUri::parse("").unwrap() } @@ -55,7 +55,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { run_now(Database::connect::<ConnectOptions>({ let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(SETTINGS.database.max_pool_size); + db_opt.max_connections(config::get_value::<u32>("database.max_pool_size")); db_opt })) .expect_or_log("Failed to connect to database") diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index 9775867f..55d3abf7 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -1,5 +1,4 @@ -use crate::config::SETTINGS; -use crate::{trace, LazyStatic}; +use crate::{config, trace, LazyStatic}; use unic_langid::LanguageIdentifier; @@ -7,14 +6,14 @@ use unic_langid::LanguageIdentifier; /// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de /// la aplicación, obtenido de `SETTINGS.app.language`. pub static LANGID: LazyStatic<LanguageIdentifier> = - LazyStatic::new(|| match SETTINGS.app.language.parse() { + LazyStatic::new(|| match config::get("app.language").parse() { Ok(language) => language, Err(_) => { trace::warn!( "{}, {} \"{}\"! {}, {}", "Failed to parse language", "unrecognized Unicode Language Identifier", - SETTINGS.app.language, + config::get("app.language"), "Using \"en-US\"", "check the settings file", ); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index bc6bf515..d2450ac3 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -1,5 +1,4 @@ -use crate::config::SETTINGS; -use crate::LazyStatic; +use crate::{config, LazyStatic}; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; @@ -20,14 +19,14 @@ use tracing_subscriber::EnvFilter; #[rustfmt::skip] pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { let env_filter = - EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); + EnvFilter::try_new(config::get("log.tracing")).unwrap_or_else(|_| EnvFilter::new("Info")); - let rolling = SETTINGS.log.rolling.to_lowercase(); + let rolling = config::get("log.rolling").to_lowercase(); let (non_blocking, guard) = match rolling.as_str() { "stdout" => tracing_appender::non_blocking(std::io::stdout()), _ => tracing_appender::non_blocking({ - let path = &SETTINGS.log.path; - let prefix = &SETTINGS.log.prefix; + let path = config::get("log.path"); + let prefix = config::get("log.prefix"); match rolling.as_str() { "daily" => tracing_appender::rolling::daily(path, prefix), "hourly" => tracing_appender::rolling::hourly(path, prefix), @@ -36,7 +35,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { _ => { println!( "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", - SETTINGS.log.rolling, + config::get("log.rolling"), ); tracing_appender::rolling::daily(path, prefix) } @@ -47,7 +46,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { .with_env_filter(env_filter) .with_writer(non_blocking) .with_ansi(rolling.as_str() == "stdout"); - match SETTINGS.log.format.to_lowercase().as_str() { + match config::get("log.format").to_lowercase().as_str() { "json" => subscriber.json().init(), "full" => subscriber.init(), "compact" => subscriber.compact().init(), @@ -55,7 +54,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { _ => { println!( "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", - SETTINGS.log.format, + config::get("log.format"), ); subscriber.init(); } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 92a3628b..e51fbbf4 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -55,7 +55,7 @@ fn hello_world() -> Container { .with_component( Paragraph::with(html! { (e("hello_intro", &args![ - "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) + "app" => format!("<span class=\"app-name\">{}</span>", config::get("app.name")) ])) }) .with_display(ParagraphDisplay::Small), @@ -101,7 +101,7 @@ fn welcome() -> Container { .with_component( Heading::h3(html! { (e("welcome_subtitle", &args![ - "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) + "app" => format!("<span class=\"app-name\">{}</span>", config::get("app.name")) ])) }) .with_display(HeadingDisplay::Subtitle), diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 76dd5777..aceee2ab 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,158 +1,139 @@ +//! Gestión de la configuración. +//! +//! Comprueba el modo de ejecución actual y carga la configuración asociada. +//! +//! PageTop aplica los principios de [The Twelve-Factor App](https://12factor.net/es/) cargando +//! archivos de configuración [TOML](https://toml.io) con pares `clave = valor` que pueden diferir +//! según el modo de ejecución del entorno actual, o al migrar a otros entornos (*desarrollo*, +//! *pre-producción*, *producción*, etc.). +//! +//! # ¿Cómo usar archivos de configuración? +//! +//! Si tu aplicación requiere opciones de configuración, primero debes crear un directorio llamado +//! *config* (ver [`CONFIG_DIR`]) al mismo nivel del archivo *Cargo.toml* de tu proyecto (o del +//! archivo binario ejecutable de la aplicación). +//! +//! Luego guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura +//! (todos los archivos son opcionales): +//! +//! 1. *config/common.toml*, útil para asignar valores comunes a cualquier entorno. Estos valores +//! pueden ser modificados al fusionar los siguientes archivos de configuración. +//! +//! 2. *config/{archivo}.toml*, donde *{archivo}* puede definirse mediante la variable de entorno +//! PAGETOP_RUN_MODE: +//! +//! * Si no está definido, se asumirá *default* como nombre predeterminado y PageTop cargará el +//! archivo de configuración *config/default.toml* si existe. +//! +//! * De esta manera, se podrían tener diferentes opciones de configuración para diferentes +//! entornos de ejecución. Por ejemplo, para *devel.toml*, *staging.toml* o *production.toml*. +//! O también para *server1.toml* o *server2.toml*. Sólo uno será cargado. +//! +//! 3. *config/local.toml*, para añadir o sobrescribir ajustes. + use crate::LazyStatic; use config_rs::{Config, File}; -use serde::Deserialize; +use std::collections::HashMap; +use std::default::Default; use std::env; +use std::fmt::Debug; +use std::str::FromStr; +use std::sync::RwLock; -/// Nombre del directorio donde se encuentra la configuración. -const CONFIG_DIR: &str = "config"; +#[macro_export] +macro_rules! default_settings { + ( $($key:literal => $value:literal),* ) => {{ + let mut a = std::collections::HashMap::new(); + $( + a.insert($key, $value); + )* + a + }}; +} -/// Al arrancar la aplicación, carga los valores originales "clave = valor" de -/// los archivos de configuración. Con [`config_map`] se asignarán los ajustes -/// globales ([`SETTINGS`]); y se podrán asignar los ajustes específicos de la -/// aplicación, o también de un tema, módulo o componente. -pub static CONFIG: LazyStatic<Config> = LazyStatic::new(|| { - // Establece el modo de ejecución según el valor de la variable de entorno - // PAGETOP_RUN_MODE. Asume "default" por defecto. +/// Directorio donde se encuentran los archivos de configuración. +pub const CONFIG_DIR: &str = "config"; + +/// Carga los valores originales "clave = valor" de los archivos de configuración. Con +/// [`config_map`] se asignarán los ajustes globales ([`SETTINGS`]); y se podrán asignar los ajustes +/// específicos de la aplicación, o también de un tema, módulo o componente. +static CONFIG: LazyStatic<Config> = LazyStatic::new(|| { + // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto 'default'. let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); // Inicializa los ajustes. - let mut settings = Config::default(); + let settings = Config::builder(); // Combina los archivos de configuración y asigna el modo de ejecución. settings - .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) - .unwrap() - .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, run_mode)).required(false)) - .unwrap() - .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "local")).required(false)) - .unwrap() - .set("app.run_mode", run_mode) - .unwrap(); + // Primero añade configuración común a todos los entornos. Opcional. + .add_source(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) - settings + // Combina la configuración específica del entorno. Por defecto 'default.toml'. Opcional. + .add_source(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, run_mode)).required(false)) + + // Combina la configuración local. Este archivo no debería incluirse en git. Opcional. + .add_source(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "local")).required(false)) + + // Salvaguarda el modo de ejecución. + .set_default("app.run_mode", run_mode) + + .unwrap() + .build() + .unwrap() }); -#[macro_export] -/// Asigna los ajustes específicos de la aplicación, o de un tema, módulo o -/// componente, en una estructura similar a [`SETTINGS`] con tipos de variables -/// seguros. Produce un *panic!* en caso de asignaciones no válidas. -macro_rules! config_map { - ( - $doc:expr, - $SETTINGS:ident, - $Type:tt - $(, $key:expr => $value:expr)* - ) => { - $crate::doc_comment! { - concat!($doc), +static DEFAULTS: LazyStatic<RwLock<HashMap<&str, &str>>> = LazyStatic::new(|| + RwLock::new(default_settings![ + // [app] + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Bootsier", + "app.language" => "en-US", + "app.direction" => "ltr", + "app.startup_banner" => "Slant", - pub static $SETTINGS: $crate::LazyStatic<$Type> = $crate::LazyStatic::new(|| { - let mut settings = $crate::config::CONFIG.clone(); - $( - settings.set_default($key, $value).unwrap(); - )* - match settings.try_into() { - Ok(c) => c, - Err(e) => panic!("Error parsing settings: {}", e), - } - }); - } - }; -} + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", -#[rustfmt::skip] -#[derive(Debug, Deserialize)] -pub struct App { - pub name : String, - pub description : String, - pub theme : String, - pub language : String, - pub direction : String, - pub startup_banner: String, - pub run_mode : String, -} + // [database] + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", + "database.db_host" => "localhost", + "database.db_port" => "0", + "database.max_pool_size" => "5", -#[rustfmt::skip] -#[derive(Debug, Deserialize)] -pub struct Log { - pub tracing : String, - pub rolling : String, - pub path : String, - pub prefix : String, - pub format : String, -} + // [webserver] + "webserver.bind_address" => "localhost", + "webserver.bind_port" => "8088", -#[rustfmt::skip] -#[derive(Debug, Deserialize)] -pub struct Database { - pub db_type : String, - pub db_name : String, - pub db_user : String, - pub db_pass : String, - pub db_host : String, - pub db_port : u16, - pub max_pool_size : u32, -} - -#[rustfmt::skip] -#[derive(Debug, Deserialize)] -pub struct Webserver { - pub bind_address : String, - pub bind_port : u16, -} - -#[rustfmt::skip] -#[derive(Debug, Deserialize)] -pub struct Dev { - pub static_files : String, -} - -#[rustfmt::skip] -#[derive(Debug, Deserialize)] -pub struct Settings { - pub app : App, - pub log : Log, - pub database : Database, - pub webserver : Webserver, - pub dev : Dev, -} - -config_map!(r#" -Ajustes globales y valores predeterminados para las secciones *\[app\]*, -*\[log\]* y *\[webserver\]* de PageTop. -"#, - SETTINGS, Settings, - - // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Bootsier", - "app.language" => "en-US", - "app.direction" => "ltr", - "app.startup_banner" => "Slant", - - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", - - // [database] - "database.db_type" => "", - "database.db_name" => "", - "database.db_user" => "", - "database.db_pass" => "", - "database.db_host" => "localhost", - "database.db_port" => 0, - "database.max_pool_size" => 5, - - // [webserver] - "webserver.bind_address" => "localhost", - "webserver.bind_port" => 8088, - - // [dev] - "dev.static_files" => "" + // [dev] + "dev.static_files" => "" + ]) ); + +pub fn add_defaults(defaults: HashMap<&'static str, &'static str>) { + DEFAULTS.write().unwrap().extend(defaults); +} + +pub fn get(key: &str) -> String { + match CONFIG.get_string(key) { + Ok(value) => value, + _ => match DEFAULTS.read().unwrap().get(key) { + Some(value) => String::from(*value), + _ => Default::default(), + }, + } +} + +pub fn get_value<T: FromStr + Default>(key: &str) -> T where <T as FromStr>::Err: Debug { + get(key).parse::<T>().unwrap_or(Default::default()) +} diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index ee3abcbf..68bf1368 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,7 @@ use crate::app; use crate::base::component::{Container, Html}; use crate::concat_string; -use crate::config::SETTINGS; +use crate::config; use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; @@ -43,9 +43,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { @match page.title().get() { Some(t) => title { - (concat_string!(SETTINGS.app.name, " | ", t)) + (concat_string!(config::get("app.name"), " | ", t)) }, - None => title { (SETTINGS.app.name) } + None => title { (config::get("app.name")) } } @match page.description().get() { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index cfcaf8ad..a61ee3ad 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,7 +1,45 @@ -// EXTERNAL RE-EXPORTS. +//! <div align="center"> +//! +//! <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/pagetop/static/pagetop-banner.png" /> +//! +//! <h1>PageTop</h1> +//! +//! [![crate](https://img.shields.io/crates/v/pagetop.svg)](https://crates.io/crates/pagetop) +//! [![docs](https://docs.rs/pagetop/badge.svg)](https://docs.rs/pagetop) +//! +//! </div> +//! +//! **PageTop** es un entorno de desarrollo basado en Rust que reúne algunos de los crates más +//! estables y populares para crear soluciones web modulares, extensibles y configurables. +//! +//! PageTop añade una capa de abstracción para definir una interfaz única que ofrezca de partida: +//! +//! * Gestión de la configuración ([`config`]). +//! +//! * Registro de trazas y eventos de la aplicación ([`trace`]). +//! +//! * Localización ([`locale`]). +//! +//! * HTML en código ([`html`]). +//! +//! * Acceso a base de datos ([`db`]). +//! +//! * APIs esenciales para crear componentes, acciones, módulos y temas ([`core`]). +//! +//! * Tipos de respuestas a peticiones web ([`response`]) +//! +//! * Base de componentes, módulos y temas ([`base`]). +//! +//! * Utilidades de carácter global ([`util`]). +//! +//! # 🚧 Advertencia +//! +//! **PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios +//! son constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + +// GLOBAL. pub use concat_string::concat_string; -pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; // LOCAL. @@ -9,7 +47,7 @@ pub use once_cell::sync::Lazy as LazyStatic; #[allow(unused_imports)] pub(crate) use futures::executor::block_on as run_now; -// PUBLIC APIs. +// APIs PÚBLICAS. // Gestión de la configuración. pub mod config; @@ -24,19 +62,19 @@ pub mod html; #[cfg(feature = "database")] pub mod db; -// Prepare and run the application. +// Prepara y ejecuta la aplicación. pub mod app; -// Main APIs for components, hooks, modules and themes. +// APIs esenciales para crear componentes, acciones, módulos y temas. pub mod core; -// Tipos de respuestas web. +// Tipos de respuestas a peticiones web. pub mod response; // Base de componentes, módulos y temas. pub mod base; // Macros y funciones útiles. pub mod util; -// INTERNAL RE-EXPORTS. +// RE-EXPORTA API ÚNICA. pub mod prelude; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index a8e21580..620dbcb9 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -5,7 +5,7 @@ pub use crate::{ args, concat_string, configure_service_for_static_files, pub_const_handler, LazyStatic, }; -pub use crate::config::SETTINGS; +pub use crate::config; pub use crate::trace; diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index 055fa781..4a9c3036 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -1,11 +1,11 @@ use super::PageOp; -use crate::config::SETTINGS; +use crate::config; use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; use crate::{base, concat_string, util, LazyStatic}; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = - LazyStatic::new(|| match theme_by_single_name(&SETTINGS.app.theme) { + LazyStatic::new(|| match theme_by_single_name(&config::get("app.theme")) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, }); diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 3617b40d..82e1c499 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,6 +1,6 @@ use super::{BeforeRenderPageHook, PageContext, PageOp, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::app::fatal_error::FatalError; -use crate::config::SETTINGS; +use crate::config; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; @@ -9,7 +9,7 @@ use crate::{trace, LazyStatic}; use std::collections::HashMap; static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { - let language = SETTINGS.app.language[..2].to_lowercase(); + let language = config::get("app.language")[..2].to_lowercase(); if !language.is_empty() { Some(language) } else { @@ -18,7 +18,7 @@ static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { }); static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { - let direction = SETTINGS.app.direction.to_lowercase(); + let direction = config::get("app.direction").to_lowercase(); match direction.as_str() { "auto" => Some("auto".to_owned()), "ltr" => Some("ltr".to_owned()), @@ -27,7 +27,7 @@ static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { _ => { trace::warn!( "Text direction \"{}\" not valid, {}", - SETTINGS.app.direction, + config::get("app.direction"), "check the settings file" ); None diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 68d20d3e..a4358c02 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -169,7 +169,7 @@ macro_rules! args { #[macro_export] macro_rules! configure_service_for_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ - let static_files = &$crate::config::SETTINGS.dev.static_files; + let static_files = $crate::config::get("dev.static_files"); if static_files.is_empty() { $cfg.service($crate::app::ResourceFiles::new($dir, $embed())); } else { From 421cce50f86576f6844040331c36104cb05acb0f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 18 Oct 2022 21:23:18 +0200 Subject: [PATCH 193/853] =?UTF-8?q?=F0=9F=93=9D=20Ajusta=20textos=20comune?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- drust/README.md | 5 ++--- pagetop-admin/README.md | 5 ++--- pagetop-node/README.md | 5 ++--- pagetop-user/README.md | 5 ++--- pagetop/README.md | 5 ++--- 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 34be8b35..3d3380a2 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,8 @@ mantener sitios web dinámicos, rápidos y seguros. # 🚧 Advertencia **PageTop** es un proyecto personal para aprender Rust y conocer su ecosistema. Sólo se liberan -versiones de desarrollo. En este contexto la API no tiene ninguna estabilidad y los cambios son -constantes. No puede considerarse listo para probar hasta que se libere la versión **0.1.0**. +versiones de desarrollo. En este contexto la API no es estable y los cambios son constantes. No +puede considerarse preparado hasta que se libere la versión **0.1.0**. # 📂 Estructura del código diff --git a/drust/README.md b/drust/README.md index bf21c777..25431d18 100644 --- a/drust/README.md +++ b/drust/README.md @@ -10,9 +10,8 @@ Rendering*). # 🚧 Advertencia -**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene -ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta -que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. # 📜 Licencia diff --git a/pagetop-admin/README.md b/pagetop-admin/README.md index db572f50..517b6f5b 100644 --- a/pagetop-admin/README.md +++ b/pagetop-admin/README.md @@ -9,9 +9,8 @@ Rendering*). # 🚧 Advertencia -**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene -ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta -que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. # 📜 Licencia diff --git a/pagetop-node/README.md b/pagetop-node/README.md index 25cb5e0c..105ec222 100644 --- a/pagetop-node/README.md +++ b/pagetop-node/README.md @@ -9,9 +9,8 @@ Rendering*). # 🚧 Advertencia -**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene -ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta -que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. # 📜 Licencia diff --git a/pagetop-user/README.md b/pagetop-user/README.md index 8cdef1dd..fb985e13 100644 --- a/pagetop-user/README.md +++ b/pagetop-user/README.md @@ -9,9 +9,8 @@ Rendering*). # 🚧 Advertencia -**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene -ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta -que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. # 📜 Licencia diff --git a/pagetop/README.md b/pagetop/README.md index b8260327..41ae4400 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -5,9 +5,8 @@ configurables. # 🚧 Advertencia -**PageTop** sólo libera actualmente versiones de desarrollo. En este contexto la API no tiene -ninguna estabilidad y los cambios son constantes. No puede considerarse listo para producción hasta -que se libere la versión **0.1.0**. +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. # 📜 Licencia From 100a1cbe6dd31da88ae0522401cfd48a802265cd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 19 Oct 2022 02:16:12 +0200 Subject: [PATCH 194/853] =?UTF-8?q?=F0=9F=8E=A8=20Mejora=20traza=20de=20er?= =?UTF-8?q?rores=20en=20ajustes=20de=20config.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config.rs | 63 ++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index aceee2ab..10cc6c5b 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,39 +1,49 @@ //! Gestión de la configuración. //! -//! Comprueba el modo de ejecución actual y carga la configuración asociada. +//! Comprueba el modo de ejecución activo y carga la configuración asociada en forma de pares +//! `clave = valor` incluidos en archivos [TOML](https://toml.io). //! -//! PageTop aplica los principios de [The Twelve-Factor App](https://12factor.net/es/) cargando -//! archivos de configuración [TOML](https://toml.io) con pares `clave = valor` que pueden diferir -//! según el modo de ejecución del entorno actual, o al migrar a otros entornos (*desarrollo*, -//! *pre-producción*, *producción*, etc.). +//! PageTop aplica los principios de [The Twelve-Factor App](https://12factor.net/es/). //! -//! # ¿Cómo usar archivos de configuración? +//! # ¿Cómo usar los archivos de configuración? //! -//! Si tu aplicación requiere opciones de configuración, primero debes crear un directorio llamado -//! *config* (ver [`CONFIG_DIR`]) al mismo nivel del archivo *Cargo.toml* de tu proyecto (o del -//! archivo binario ejecutable de la aplicación). +//! Si tu aplicación requiere ajustes de configuración debes crear un directorio llamado *config* +//! (ver [`CONFIG_DIR`]) al mismo nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable +//! binario de la aplicación). //! -//! Luego guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura -//! (todos los archivos son opcionales): +//! Guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura (todos los +//! archivos son opcionales): //! -//! 1. *config/common.toml*, útil para asignar valores comunes a cualquier entorno. Estos valores +//! 1. *config/common.toml*, útil para asignar valores comunes para cualquier entorno. Estos valores //! pueden ser modificados al fusionar los siguientes archivos de configuración. //! //! 2. *config/{archivo}.toml*, donde *{archivo}* puede definirse mediante la variable de entorno //! PAGETOP_RUN_MODE: //! -//! * Si no está definido, se asumirá *default* como nombre predeterminado y PageTop cargará el +//! * Si no está definida, se asumirá *default* como nombre predeterminado y PageTop cargará el //! archivo de configuración *config/default.toml* si existe. //! -//! * De esta manera, se podrían tener diferentes opciones de configuración para diferentes +//! * De esta manera, se pueden tener diferentes ajustes de configuración para diferentes //! entornos de ejecución. Por ejemplo, para *devel.toml*, *staging.toml* o *production.toml*. //! O también para *server1.toml* o *server2.toml*. Sólo uno será cargado. //! //! 3. *config/local.toml*, para añadir o sobrescribir ajustes. +//! +//! # ¿Cómo leer los valores de configuración? +//! +//! ``` +//! use pagetop::config; +//! +//! // Obtiene el valor (String) de una clave. +//! let app_name: String = config::get("app.name"); +//! +//! // Obtiene el valor (del tipo indicado) de una clave. +//! let db_port: u16 = config::get_value::<u16>("database.db_port"); +//! ``` -use crate::LazyStatic; +use crate::{trace, LazyStatic}; -use config_rs::{Config, File}; +use config_rs::{Config, ConfigError, File}; use std::collections::HashMap; use std::default::Default; @@ -124,16 +134,31 @@ pub fn add_defaults(defaults: HashMap<&'static str, &'static str>) { DEFAULTS.write().unwrap().extend(defaults); } +/// Devuelve el valor (String) de una clave. pub fn get(key: &str) -> String { match CONFIG.get_string(key) { Ok(value) => value, - _ => match DEFAULTS.read().unwrap().get(key) { + Err(ConfigError::NotFound(_)) => match DEFAULTS.read().unwrap().get(key) { Some(value) => String::from(*value), - _ => Default::default(), + _ => { + trace::debug!("Config value not found for key \"{}\"! Return empty string", key); + Default::default() + } }, + _ => { + trace::warn!("Can't read config value for key \"{}\"! Return empty string", key); + Default::default() + } } } +/// Devuelve el valor (del tipo indicado) de una clave. pub fn get_value<T: FromStr + Default>(key: &str) -> T where <T as FromStr>::Err: Debug { - get(key).parse::<T>().unwrap_or(Default::default()) + match get(key).parse::<T>() { + Ok(value) => value, + _ => { + trace::warn!("Failed to parse value for key \"{}\"! Return default empty value", key); + Default::default() + } + } } From 466ea97186dd43baa2f543e8018db9c3fb9c3c67 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 19 Oct 2022 03:19:15 +0200 Subject: [PATCH 195/853] =?UTF-8?q?=F0=9F=93=9D=20Refina=20la=20doc.=20de?= =?UTF-8?q?=20gesti=C3=B3n=20de=20la=20configuraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config.rs | 52 ++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 10cc6c5b..d41fc664 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,21 +1,28 @@ //! Gestión de la configuración. //! -//! Comprueba el modo de ejecución activo y carga la configuración asociada en forma de pares -//! `clave = valor` incluidos en archivos [TOML](https://toml.io). +//! Carga la configuración de la aplicación en forma de pares `clave = valor` incluidos en archivos +//! [TOML](https://toml.io). //! -//! PageTop aplica los principios de [The Twelve-Factor App](https://12factor.net/es/). +//! La metodología [The Twelve-Factor App](https://12factor.net/es/) define **la configuración de +//! una aplicación como todo lo que puede variar entre despliegues**, distinguiendo entornos de +//! desarrollo, pre-producción, producción, etc. +//! +//! A veces las aplicaciones guardan configuraciones como constantes en el código, lo que supone una +//! violación de esta metodología. Es necesaria una **estricta separación de configuración y +//! código**. La configuración varía sustancialmente en cada despliegue, el código no. +//! +//! PageTop aplica estos principios cargando la configuración asociada al modo de ejecución activo. //! //! # ¿Cómo usar los archivos de configuración? //! -//! Si tu aplicación requiere ajustes de configuración debes crear un directorio llamado *config* -//! (ver [`CONFIG_DIR`]) al mismo nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable -//! binario de la aplicación). +//! Si tu aplicación requiere ajustes de configuración debes crear un directorio llamado *config* al +//! mismo nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable binario de la aplicación). //! -//! Guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura (todos los -//! archivos son opcionales): +//! Guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura secuencial +//! (todos los archivos son opcionales): //! -//! 1. *config/common.toml*, útil para asignar valores comunes para cualquier entorno. Estos valores -//! pueden ser modificados al fusionar los siguientes archivos de configuración. +//! 1. *config/common.toml*, útil para asignar los valores comunes a cualquier entorno. Estos +//! valores pueden ser modificados al fusionar los archivos de configuración siguientes. //! //! 2. *config/{archivo}.toml*, donde *{archivo}* puede definirse mediante la variable de entorno //! PAGETOP_RUN_MODE: @@ -27,8 +34,26 @@ //! entornos de ejecución. Por ejemplo, para *devel.toml*, *staging.toml* o *production.toml*. //! O también para *server1.toml* o *server2.toml*. Sólo uno será cargado. //! +//! * Normalmente estos archivos suelen ser idóneos para incluir contraseñas o configuración +//! sensible asociada al entorno correspondiente. Estos archivos no deberían ser publicados en +//! el repositorio Git por razones de seguridad. +//! //! 3. *config/local.toml*, para añadir o sobrescribir ajustes. //! +//! # ¿Cómo añadir valores de configuración predeterminados? +//! +//! ``` +//! use pagetop::{config, default_settings}; +//! +//! // Una aplicación o un módulo podrá añadir nuevos valores de configuración predeterminados. +//! config::add_defaults(default_settings![ +//! // [my_app] +//! "my_app.test_1" => "Test 1", +//! "my_app.test_2" => "Test 2", +//! "my_app.passwd" => "Pass_1234", +//! ]); +//! ``` +//! //! # ¿Cómo leer los valores de configuración? //! //! ``` @@ -37,7 +62,7 @@ //! // Obtiene el valor (String) de una clave. //! let app_name: String = config::get("app.name"); //! -//! // Obtiene el valor (del tipo indicado) de una clave. +//! // Obtiene el valor (del tipo especificado) de una clave. //! let db_port: u16 = config::get_value::<u16>("database.db_port"); //! ``` @@ -64,7 +89,7 @@ macro_rules! default_settings { } /// Directorio donde se encuentran los archivos de configuración. -pub const CONFIG_DIR: &str = "config"; +const CONFIG_DIR: &str = "config"; /// Carga los valores originales "clave = valor" de los archivos de configuración. Con /// [`config_map`] se asignarán los ajustes globales ([`SETTINGS`]); y se podrán asignar los ajustes @@ -130,6 +155,7 @@ static DEFAULTS: LazyStatic<RwLock<HashMap<&str, &str>>> = LazyStatic::new(|| ]) ); +/// Una aplicación o un módulo podrá añadir nuevos valores de configuración predeterminados. pub fn add_defaults(defaults: HashMap<&'static str, &'static str>) { DEFAULTS.write().unwrap().extend(defaults); } @@ -152,7 +178,7 @@ pub fn get(key: &str) -> String { } } -/// Devuelve el valor (del tipo indicado) de una clave. +/// Devuelve el valor (del tipo especificado) de una clave. pub fn get_value<T: FromStr + Default>(key: &str) -> T where <T as FromStr>::Err: Debug { match get(key).parse::<T>() { Ok(value) => value, From 81852a66c881d878d0a8aa88841ef1628da41d72 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 19 Oct 2022 23:41:45 +0200 Subject: [PATCH 196/853] =?UTF-8?q?=E2=9C=A8=20Habilita=20a=20m=C3=B3dulos?= =?UTF-8?q?=20inicializar=20su=20conf.=20predet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 3 + pagetop/src/config.rs | 86 +++++++++++++++++---------- pagetop/src/core/module/all.rs | 28 ++++++--- pagetop/src/core/module/definition.rs | 10 +++- pagetop/src/prelude.rs | 1 + 5 files changed, 86 insertions(+), 42 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 9d3c7c41..2ad4d1f3 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -38,6 +38,9 @@ impl Application { // Registra acciones de los módulos. module::all::register_actions(); + // Inicializa valores predefinidos de configuración. + module::all::init_settings(); + // Inicializa los módulos. module::all::init_modules(); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index d41fc664..d982f7d3 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,34 +1,32 @@ //! Gestión de la configuración. //! -//! Carga la configuración de la aplicación en forma de pares `clave = valor` incluidos en archivos -//! [TOML](https://toml.io). +//! Carga durante el arranque la configuración de la aplicación en forma de pares `clave = valor` +//! recogidos en archivos [TOML](https://toml.io). //! //! La metodología [The Twelve-Factor App](https://12factor.net/es/) define **la configuración de -//! una aplicación como todo lo que puede variar entre despliegues**, distinguiendo entornos de -//! desarrollo, pre-producción, producción, etc. +//! una aplicación como todo lo que puede variar entre despliegues**, diferenciando entre entornos +//! de desarrollo, pre-producción, producción, etc. //! //! A veces las aplicaciones guardan configuraciones como constantes en el código, lo que supone una -//! violación de esta metodología. Es necesaria una **estricta separación de configuración y -//! código**. La configuración varía sustancialmente en cada despliegue, el código no. +//! violación de esta metodología. Debe existir una **estricta separación entre la configuración y +//! el código**. La configuración variará sustancialmente en cada despliegue, el código no. //! -//! PageTop aplica estos principios cargando la configuración asociada al modo de ejecución activo. +//! # Cómo usar archivos de configuración //! -//! # ¿Cómo usar los archivos de configuración? -//! -//! Si tu aplicación requiere ajustes de configuración debes crear un directorio llamado *config* al +//! Si tu aplicación requiere archivos de configuración debes crear un directorio llamado *config* al //! mismo nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable binario de la aplicación). //! //! Guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura secuencial //! (todos los archivos son opcionales): //! -//! 1. *config/common.toml*, útil para asignar los valores comunes a cualquier entorno. Estos -//! valores pueden ser modificados al fusionar los archivos de configuración siguientes. +//! 1. *config/common.toml*, útil para los ajustes comunes para cualquier entorno. Estos valores +//! podrán ser sobrescritos al fusionar los archivos de configuración siguientes. //! //! 2. *config/{archivo}.toml*, donde *{archivo}* puede definirse mediante la variable de entorno //! PAGETOP_RUN_MODE: //! -//! * Si no está definida, se asumirá *default* como nombre predeterminado y PageTop cargará el -//! archivo de configuración *config/default.toml* si existe. +//! * Si no está definida, se asumirá *default* por defecto, y PageTop cargará el archivo de +//! configuración *config/default.toml* si existe. //! //! * De esta manera, se pueden tener diferentes ajustes de configuración para diferentes //! entornos de ejecución. Por ejemplo, para *devel.toml*, *staging.toml* o *production.toml*. @@ -40,30 +38,53 @@ //! //! 3. *config/local.toml*, para añadir o sobrescribir ajustes. //! -//! # ¿Cómo añadir valores de configuración predeterminados? +//! # Cómo añadir valores predefinidos de configuración +//! +//! Si nuestra **aplicación** o **módulo** requiere sus propios ajustes de configuración, es +//! recomendable (aunque no imprescindible) inicializarlos antes de su uso. +//! +//! Sólo tienes que añadir el método [`settings()`](crate::core::module::ModuleTrait::settings) al +//! implementar [`ModuleTrait`](crate::core::module::ModuleTrait) para tu módulo, devolviendo los +//! nuevos valores predefinidos con la macro [`predefined_settings!`]. +//! +//! Cuando se carga la configuración de la aplicación, estos valores podrán ser sobrescritos con los +//! ajustes personalizados del entorno. Y sólo será realmente necesario incluir en los archivos de +//! configuración los ajustes que difieran de los predefinidos. //! //! ``` -//! use pagetop::{config, default_settings}; +//! use pagetop::prelude::*; //! -//! // Una aplicación o un módulo podrá añadir nuevos valores de configuración predeterminados. -//! config::add_defaults(default_settings![ -//! // [my_app] -//! "my_app.test_1" => "Test 1", -//! "my_app.test_2" => "Test 2", -//! "my_app.passwd" => "Pass_1234", -//! ]); +//! pub_const_handler!(MY_MODULE_HANDLER); +//! +//! pub struct MyModule; +//! +//! impl ModuleTrait for MyModule { +//! fn handler(&self) -> Handler { +//! MY_MODULE_HANDLER +//! } +//! +//! fn settings(&self) -> PredefinedSettings { +//! predefined_settings![ +//! // Valores predefinidos para "my_module". +//! "my_module.name" => "Name", +//! "my_module.desc" => "Description", +//! // Valores predefinidos para "my_module.database". +//! "my_module.database.db_port" => "3306" +//! ] +//! } +//! } //! ``` //! -//! # ¿Cómo leer los valores de configuración? +//! # Cómo obtener los valores de configuración //! //! ``` //! use pagetop::config; //! //! // Obtiene el valor (String) de una clave. -//! let app_name: String = config::get("app.name"); +//! let name: String = config::get("my_module.name"); //! //! // Obtiene el valor (del tipo especificado) de una clave. -//! let db_port: u16 = config::get_value::<u16>("database.db_port"); +//! let db_port: u16 = config::get_value::<u16>("my_module.database.db_port"); //! ``` use crate::{trace, LazyStatic}; @@ -77,9 +98,12 @@ use std::fmt::Debug; use std::str::FromStr; use std::sync::RwLock; +pub type PredefinedSettings = HashMap<&'static str, &'static str>; + #[macro_export] -macro_rules! default_settings { +macro_rules! predefined_settings { ( $($key:literal => $value:literal),* ) => {{ + #[allow(unused_mut)] let mut a = std::collections::HashMap::new(); $( a.insert($key, $value); @@ -120,8 +144,8 @@ static CONFIG: LazyStatic<Config> = LazyStatic::new(|| { .unwrap() }); -static DEFAULTS: LazyStatic<RwLock<HashMap<&str, &str>>> = LazyStatic::new(|| - RwLock::new(default_settings![ +static DEFAULTS: LazyStatic<RwLock<PredefinedSettings>> = LazyStatic::new(|| + RwLock::new(predefined_settings![ // [app] "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", @@ -155,8 +179,8 @@ static DEFAULTS: LazyStatic<RwLock<HashMap<&str, &str>>> = LazyStatic::new(|| ]) ); -/// Una aplicación o un módulo podrá añadir nuevos valores de configuración predeterminados. -pub fn add_defaults(defaults: HashMap<&'static str, &'static str>) { +/// Una aplicación o módulo podrá añadir nuevos valores predefinidos de configuración. +pub(crate) fn add_predefined_settings(defaults: PredefinedSettings) { DEFAULTS.write().unwrap().extend(defaults); } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index c4df3f0f..3ac7ff8b 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,4 +1,5 @@ use super::ModuleStaticRef; +use crate::config; use crate::core::hook::add_action; use crate::core::theme; use crate::{app, trace, LazyStatic}; @@ -85,6 +86,24 @@ pub fn register_actions() { } } +// INIT SETTINGS *********************************************************************************** + +pub fn init_settings() { + trace::info!("initializing custom predefined settings"); + for m in ENABLED_MODULES.read().unwrap().iter() { + config::add_predefined_settings(m.settings()); + } +} + +// INIT MODULES ************************************************************************************ + +pub fn init_modules() { + trace::info!("Calling application bootstrap"); + for m in ENABLED_MODULES.read().unwrap().iter() { + m.init(); + } +} + // RUN MIGRATIONS ********************************************************************************** #[cfg(feature = "database")] @@ -120,15 +139,6 @@ pub fn run_migrations() { .unwrap(); } -// INIT MODULES ************************************************************************************ - -pub fn init_modules() { - trace::info!("Calling application bootstrap"); - for m in ENABLED_MODULES.read().unwrap().iter() { - m.init(); - } -} - // CONFIGURE SERVICES ****************************************************************************** pub fn configure_services(cfg: &mut app::web::ServiceConfig) { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 5ca54cc1..8ad2bf71 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,4 +1,6 @@ use crate::app; +use crate::predefined_settings; +use crate::config::PredefinedSettings; use crate::core::hook::HookAction; use crate::core::theme::ThemeStaticRef; use crate::util::{single_type_name, Handler}; @@ -40,14 +42,18 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } + fn settings(&self) -> PredefinedSettings { + predefined_settings![] + } + + fn init(&self) {} + #[cfg(feature = "database")] #[allow(unused_variables)] fn migrations(&self) -> Vec<MigrationItem> { vec![] } - fn init(&self) {} - #[allow(unused_variables)] fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 620dbcb9..a461ffbb 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -6,6 +6,7 @@ pub use crate::{ }; pub use crate::config; +pub use crate::config::PredefinedSettings; pub use crate::trace; From 4daab33499eae6574bccb63382c199e7bf29336c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 00:55:53 +0200 Subject: [PATCH 197/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactoriza=20para?= =?UTF-8?q?=20integrar=20config-rs=20en=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 59b051ca..2273a760 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -24,6 +24,7 @@ categories = [ [dependencies] async-trait = "0.1.57" concat-string = "1.0.1" +doc-comment = "0.3.3" figlet-rs = "0.1.4" futures = "0.3.24" once_cell = "1.15.0" @@ -32,7 +33,9 @@ substring = "1.4.5" term_size = "0.3.2" url = "2.3.1" -config_rs = { package = "config", version = "0.13.2", features = ["toml"] } +serde = "1.0" +nom = "7.1.1" +toml = "0.5.9" tracing = "0.1.36" tracing-appender = "0.2.2" From 104efd116f66016a6b42e66ed182ae4b697d34d2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 00:59:17 +0200 Subject: [PATCH 198/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Integra=20config-r?= =?UTF-8?q?s=20s=C3=B3lo=20para=20archivos=20TOML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config/data.rs | 215 ++++++++++++ pagetop/src/config/de.rs | 462 +++++++++++++++++++++++++ pagetop/src/config/error.rs | 222 ++++++++++++ pagetop/src/config/file.rs | 90 +++++ pagetop/src/config/file/source.rs | 127 +++++++ pagetop/src/config/file/toml.rs | 51 +++ pagetop/src/config/path.rs | 254 ++++++++++++++ pagetop/src/config/path/parser.rs | 131 +++++++ pagetop/src/config/source.rs | 87 +++++ pagetop/src/config/value.rs | 546 ++++++++++++++++++++++++++++++ 10 files changed, 2185 insertions(+) create mode 100644 pagetop/src/config/data.rs create mode 100644 pagetop/src/config/de.rs create mode 100644 pagetop/src/config/error.rs create mode 100644 pagetop/src/config/file.rs create mode 100644 pagetop/src/config/file/source.rs create mode 100644 pagetop/src/config/file/toml.rs create mode 100644 pagetop/src/config/path.rs create mode 100644 pagetop/src/config/path/parser.rs create mode 100644 pagetop/src/config/source.rs create mode 100644 pagetop/src/config/value.rs diff --git a/pagetop/src/config/data.rs b/pagetop/src/config/data.rs new file mode 100644 index 00000000..b9f72de7 --- /dev/null +++ b/pagetop/src/config/data.rs @@ -0,0 +1,215 @@ +use crate::config::error::*; +use crate::config::path; +use crate::config::source::Source; +use crate::config::value::{Table, Value}; + +use serde::de::Deserialize; + +use std::collections::HashMap; +use std::fmt::Debug; + +#[derive(Clone, Debug)] +enum ConfigKind { + // A mutable configuration. This is the default. + Mutable { + defaults: HashMap<path::Expression, Value>, + overrides: HashMap<path::Expression, Value>, + sources: Vec<Box<dyn Source + Send + Sync>>, + }, +} + +impl Default for ConfigKind { + fn default() -> Self { + ConfigKind::Mutable { + defaults: HashMap::new(), + overrides: HashMap::new(), + sources: Vec::new(), + } + } +} + +/// A prioritized configuration repository. It maintains a set of configuration sources, fetches +/// values to populate those, and provides them according to the source's priority. +#[derive(Default, Clone, Debug)] +pub struct ConfigData { + kind: ConfigKind, + /// Root of the cached configuration. + pub cache: Value, +} + +impl ConfigData { + pub fn new() -> Self { + Self { + kind: ConfigKind::default(), + // Config root should be instantiated as an empty table to avoid deserialization errors. + cache: Value::new(None, Table::new()), + } + } + + /// Merge in a configuration property source. + pub fn merge<T>(&mut self, source: T) -> Result<&mut ConfigData> + where + T: 'static, + T: Source + Send + Sync, + { + match self.kind { + ConfigKind::Mutable { + ref mut sources, .. + } => { + sources.push(Box::new(source)); + } + } + + self.refresh() + } + + /// Merge in a configuration property source. + pub fn with_merged<T>(mut self, source: T) -> Result<Self> + where + T: 'static, + T: Source + Send + Sync, + { + match self.kind { + ConfigKind::Mutable { + ref mut sources, .. + } => { + sources.push(Box::new(source)); + } + } + + self.refresh()?; + Ok(self) + } + + /// Refresh the configuration cache with fresh data from added sources. + /// + /// Configuration is automatically refreshed after a mutation operation (`set`, `merge`, + /// `set_default`, etc.). + pub fn refresh(&mut self) -> Result<&mut ConfigData> { + self.cache = match self.kind { + // TODO: We need to actually merge in all the stuff. + ConfigKind::Mutable { + ref overrides, + ref sources, + ref defaults, + } => { + let mut cache: Value = HashMap::<String, Value>::new().into(); + + // Add defaults. + for (key, val) in defaults { + key.set(&mut cache, val.clone()); + } + + // Add sources. + sources.collect_to(&mut cache)?; + + // Add overrides. + for (key, val) in overrides { + key.set(&mut cache, val.clone()); + } + + cache + } + }; + + Ok(self) + } + + pub fn set_default<T>(&mut self, key: &str, value: T) -> Result<&mut ConfigData> + where + T: Into<Value>, + { + match self.kind { + ConfigKind::Mutable { + ref mut defaults, .. + } => { + defaults.insert(key.parse()?, value.into()); + } + }; + + self.refresh() + } + + pub fn set<T>(&mut self, key: &str, value: T) -> Result<&mut ConfigData> + where + T: Into<Value>, + { + match self.kind { + ConfigKind::Mutable { + ref mut overrides, .. + } => { + overrides.insert(key.parse()?, value.into()); + } + }; + + self.refresh() + } + + pub fn set_once(&mut self, key: &str, value: Value) -> Result<()> { + let expr: path::Expression = key.parse()?; + + // Traverse the cache using the path to (possibly) retrieve a value. + if let Some(ref mut val) = expr.get_mut(&mut self.cache) { + **val = value; + } else { + expr.set(&mut self.cache, value); + } + Ok(()) + } + + pub fn get<'de, T: Deserialize<'de>>(&self, key: &str) -> Result<T> { + // Parse the key into a path expression. + let expr: path::Expression = key.parse()?; + + // Traverse the cache using the path to (possibly) retrieve a value. + let value = expr.get(&self.cache).cloned(); + + match value { + Some(value) => { + // Deserialize the received value into the requested type. + T::deserialize(value).map_err(|e| e.extend_with_key(key)) + } + + None => Err(ConfigError::NotFound(key.into())), + } + } + + pub fn get_str(&self, key: &str) -> Result<String> { + self.get(key).and_then(Value::into_str) + } + + pub fn get_int(&self, key: &str) -> Result<i64> { + self.get(key).and_then(Value::into_int) + } + + pub fn get_float(&self, key: &str) -> Result<f64> { + self.get(key).and_then(Value::into_float) + } + + pub fn get_bool(&self, key: &str) -> Result<bool> { + self.get(key).and_then(Value::into_bool) + } + + pub fn get_table(&self, key: &str) -> Result<HashMap<String, Value>> { + self.get(key).and_then(Value::into_table) + } + + pub fn get_array(&self, key: &str) -> Result<Vec<Value>> { + self.get(key).and_then(Value::into_array) + } + + /// Attempt to deserialize the entire configuration into the requested type. + pub fn try_into<'de, T: Deserialize<'de>>(self) -> Result<T> { + T::deserialize(self) + } +} + +impl Source for ConfigData { + fn clone_into_box(&self) -> Box<dyn Source + Send + Sync> { + Box::new((*self).clone()) + } + + fn collect(&self) -> Result<HashMap<String, Value>> { + self.cache.clone().into_table() + } +} diff --git a/pagetop/src/config/de.rs b/pagetop/src/config/de.rs new file mode 100644 index 00000000..1eb2ac6e --- /dev/null +++ b/pagetop/src/config/de.rs @@ -0,0 +1,462 @@ +use crate::config::data::ConfigData; +use crate::config::error::*; +use crate::config::value::{Table, Value, ValueKind}; + +use serde::de; +use serde::forward_to_deserialize_any; + +use std::collections::{HashMap, VecDeque}; +use std::iter::Enumerate; + +impl<'de> de::Deserializer<'de> for Value { + type Error = ConfigError; + + #[inline] + fn deserialize_any<V>(self, visitor: V) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + // Deserialize based on the underlying type. + match self.kind { + ValueKind::Nil => visitor.visit_unit(), + ValueKind::Integer(i) => visitor.visit_i64(i), + ValueKind::Boolean(b) => visitor.visit_bool(b), + ValueKind::Float(f) => visitor.visit_f64(f), + ValueKind::String(s) => visitor.visit_string(s), + ValueKind::Array(values) => visitor.visit_seq(SeqAccess::new(values)), + ValueKind::Table(map) => visitor.visit_map(MapAccess::new(map)), + } + } + + #[inline] + fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_bool(self.into_bool()?) + } + + #[inline] + fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_i8(self.into_int()? as i8) + } + + #[inline] + fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_i16(self.into_int()? as i16) + } + + #[inline] + fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_i32(self.into_int()? as i32) + } + + #[inline] + fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_i64(self.into_int()?) + } + + #[inline] + fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u8(self.into_int()? as u8) + } + + #[inline] + fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u16(self.into_int()? as u16) + } + + #[inline] + fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u32(self.into_int()? as u32) + } + + #[inline] + fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u64(self.into_int()? as u64) + } + + #[inline] + fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_f32(self.into_float()? as f32) + } + + #[inline] + fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_f64(self.into_float()?) + } + + #[inline] + fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_string(self.into_str()?) + } + + #[inline] + fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_string(self.into_str()?) + } + + #[inline] + fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + // Match an explicit nil as None and everything else as Some. + match self.kind { + ValueKind::Nil => visitor.visit_none(), + _ => visitor.visit_some(self), + } + } + + fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + visitor.visit_newtype_struct(self) + } + + fn deserialize_enum<V>( + self, + name: &'static str, + variants: &'static [&'static str], + visitor: V, + ) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + visitor.visit_enum(EnumAccess { + value: self, + name, + variants, + }) + } + + forward_to_deserialize_any! { + char seq + bytes byte_buf map struct unit + identifier ignored_any unit_struct tuple_struct tuple + } +} + +struct StrDeserializer<'a>(&'a str); + +impl<'de, 'a> de::Deserializer<'de> for StrDeserializer<'a> { + type Error = ConfigError; + + #[inline] + fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_str(self.0) + } + + forward_to_deserialize_any! { + bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq + bytes byte_buf map struct unit enum newtype_struct + identifier ignored_any unit_struct tuple_struct tuple option + } +} + +struct SeqAccess { + elements: Enumerate<::std::vec::IntoIter<Value>>, +} + +impl SeqAccess { + fn new(elements: Vec<Value>) -> Self { + SeqAccess { + elements: elements.into_iter().enumerate(), + } + } +} + +impl<'de> de::SeqAccess<'de> for SeqAccess { + type Error = ConfigError; + + fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>> + where + T: de::DeserializeSeed<'de>, + { + match self.elements.next() { + Some((idx, value)) => seed + .deserialize(value) + .map(Some) + .map_err(|e| e.prepend_index(idx)), + None => Ok(None), + } + } + + fn size_hint(&self) -> Option<usize> { + match self.elements.size_hint() { + (lower, Some(upper)) if lower == upper => Some(upper), + _ => None, + } + } +} + +struct MapAccess { + elements: VecDeque<(String, Value)>, +} + +impl MapAccess { + fn new(table: HashMap<String, Value>) -> Self { + MapAccess { + elements: table.into_iter().collect(), + } + } +} + +impl<'de> de::MapAccess<'de> for MapAccess { + type Error = ConfigError; + + fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>> + where + K: de::DeserializeSeed<'de>, + { + if let Some(&(ref key_s, _)) = self.elements.front() { + let key_de = Value::new(None, key_s as &str); + let key = de::DeserializeSeed::deserialize(seed, key_de)?; + + Ok(Some(key)) + } else { + Ok(None) + } + } + + fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value> + where + V: de::DeserializeSeed<'de>, + { + let (key, value) = self.elements.pop_front().unwrap(); + de::DeserializeSeed::deserialize(seed, value).map_err(|e| e.prepend_key(key)) + } +} + +struct EnumAccess { + value: Value, + name: &'static str, + variants: &'static [&'static str], +} + +impl EnumAccess { + fn variant_deserializer(&self, name: &str) -> Result<StrDeserializer> { + self.variants + .iter() + .find(|&&s| s == name) + .map(|&s| StrDeserializer(s)) + .ok_or_else(|| self.no_constructor_error(name)) + } + + fn table_deserializer(&self, table: &Table) -> Result<StrDeserializer> { + if table.len() == 1 { + self.variant_deserializer(table.iter().next().unwrap().0) + } else { + Err(self.structural_error()) + } + } + + fn no_constructor_error(&self, supposed_variant: &str) -> ConfigError { + ConfigError::Message(format!( + "enum {} does not have variant constructor {}", + self.name, supposed_variant + )) + } + + fn structural_error(&self) -> ConfigError { + ConfigError::Message(format!( + "value of enum {} should be represented by either string or table with exactly one key", + self.name + )) + } +} + +impl<'de> de::EnumAccess<'de> for EnumAccess { + type Error = ConfigError; + type Variant = Self; + + fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)> + where + V: de::DeserializeSeed<'de>, + { + let value = { + let deserializer = match self.value.kind { + ValueKind::String(ref s) => self.variant_deserializer(s), + ValueKind::Table(ref t) => self.table_deserializer(&t), + _ => Err(self.structural_error()), + }?; + seed.deserialize(deserializer)? + }; + + Ok((value, self)) + } +} + +impl<'de> de::VariantAccess<'de> for EnumAccess { + type Error = ConfigError; + + fn unit_variant(self) -> Result<()> { + Ok(()) + } + + fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value> + where + T: de::DeserializeSeed<'de>, + { + match self.value.kind { + ValueKind::Table(t) => seed.deserialize(t.into_iter().next().unwrap().1), + _ => unreachable!(), + } + } + + fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + match self.value.kind { + ValueKind::Table(t) => { + de::Deserializer::deserialize_seq(t.into_iter().next().unwrap().1, visitor) + } + _ => unreachable!(), + } + } + + fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + match self.value.kind { + ValueKind::Table(t) => { + de::Deserializer::deserialize_map(t.into_iter().next().unwrap().1, visitor) + } + _ => unreachable!(), + } + } +} + +impl<'de> de::Deserializer<'de> for ConfigData { + type Error = ConfigError; + + #[inline] + fn deserialize_any<V>(self, visitor: V) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + // Deserialize based on the underlying type. + match self.cache.kind { + ValueKind::Nil => visitor.visit_unit(), + ValueKind::Integer(i) => visitor.visit_i64(i), + ValueKind::Boolean(b) => visitor.visit_bool(b), + ValueKind::Float(f) => visitor.visit_f64(f), + ValueKind::String(s) => visitor.visit_string(s), + ValueKind::Array(values) => visitor.visit_seq(SeqAccess::new(values)), + ValueKind::Table(map) => visitor.visit_map(MapAccess::new(map)), + } + } + + #[inline] + fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_bool(self.cache.into_bool()?) + } + + #[inline] + fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_i8(self.cache.into_int()? as i8) + } + + #[inline] + fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_i16(self.cache.into_int()? as i16) + } + + #[inline] + fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_i32(self.cache.into_int()? as i32) + } + + #[inline] + fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_i64(self.cache.into_int()?) + } + + #[inline] + fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u8(self.cache.into_int()? as u8) + } + + #[inline] + fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u16(self.cache.into_int()? as u16) + } + + #[inline] + fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u32(self.cache.into_int()? as u32) + } + + #[inline] + fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + // FIXME: This should *fail* if the value does not fit in the requets integer type. + visitor.visit_u64(self.cache.into_int()? as u64) + } + + #[inline] + fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_f32(self.cache.into_float()? as f32) + } + + #[inline] + fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_f64(self.cache.into_float()?) + } + + #[inline] + fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_string(self.cache.into_str()?) + } + + #[inline] + fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> { + visitor.visit_string(self.cache.into_str()?) + } + + #[inline] + fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + // Match an explicit nil as None and everything else as Some. + match self.cache.kind { + ValueKind::Nil => visitor.visit_none(), + _ => visitor.visit_some(self), + } + } + + fn deserialize_enum<V>( + self, + name: &'static str, + variants: &'static [&'static str], + visitor: V, + ) -> Result<V::Value> + where + V: de::Visitor<'de>, + { + visitor.visit_enum(EnumAccess { + value: self.cache, + name, + variants, + }) + } + + forward_to_deserialize_any! { + char seq + bytes byte_buf map struct unit newtype_struct + identifier ignored_any unit_struct tuple_struct tuple + } +} diff --git a/pagetop/src/config/error.rs b/pagetop/src/config/error.rs new file mode 100644 index 00000000..815d71c8 --- /dev/null +++ b/pagetop/src/config/error.rs @@ -0,0 +1,222 @@ +use nom; +use serde::de; +use serde::ser; + +use std::error::Error; +use std::fmt; +use std::result; + +#[derive(Debug)] +pub enum Unexpected { + Bool(bool), + Integer(i64), + Float(f64), + Str(String), + Unit, + Seq, + Map, +} + +impl fmt::Display for Unexpected { + fn fmt(&self, f: &mut fmt::Formatter) -> result::Result<(), fmt::Error> { + match *self { + Unexpected::Bool(b) => write!(f, "boolean `{}`", b), + Unexpected::Integer(i) => write!(f, "integer `{}`", i), + Unexpected::Float(v) => write!(f, "floating point `{}`", v), + Unexpected::Str(ref s) => write!(f, "string {:?}", s), + Unexpected::Unit => write!(f, "unit value"), + Unexpected::Seq => write!(f, "sequence"), + Unexpected::Map => write!(f, "map"), + } + } +} + +/// Represents all possible errors that can occur when working with configuration. +pub enum ConfigError { + /// Configuration is frozen and no further mutations can be made. + Frozen, + + /// Configuration property was not found. + NotFound(String), + + /// Configuration path could not be parsed. + PathParse(nom::error::ErrorKind), + + /// Configuration could not be parsed from file. + FileParse { + /// The URI used to access the file (if not loaded from a string). + /// Example: `/path/to/config.json` + uri: Option<String>, + + /// The captured error from attempting to parse the file in its desired format. + /// This is the actual error object from the library used for the parsing. + cause: Box<dyn Error + Send + Sync>, + }, + + /// Value could not be converted into the requested type. + Type { + /// The URI that references the source that the value came from. + /// Example: `/path/to/config.json` or `Environment` or `etcd://localhost` + // TODO: Why is this called Origin but FileParse has a uri field? + origin: Option<String>, + + /// What we found when parsing the value. + unexpected: Unexpected, + + /// What was expected when parsing the value. + expected: &'static str, + + /// The key in the configuration hash of this value (if available where the error is + /// generated). + key: Option<String>, + }, + + /// Custom message. + Message(String), + + /// Unadorned error from a foreign origin. + Foreign(Box<dyn Error + Send + Sync>), +} + +impl ConfigError { + // FIXME: pub(crate). + #[doc(hidden)] + pub fn invalid_type( + origin: Option<String>, + unexpected: Unexpected, + expected: &'static str, + ) -> Self { + ConfigError::Type { + origin, + unexpected, + expected, + key: None, + } + } + + // FIXME: pub(crate). + #[doc(hidden)] + pub fn extend_with_key(self, key: &str) -> Self { + match self { + ConfigError::Type { + origin, + unexpected, + expected, + .. + } => ConfigError::Type { + origin, + unexpected, + expected, + key: Some(key.into()), + }, + + _ => self, + } + } + + fn prepend(self, segment: String, add_dot: bool) -> Self { + let concat = |key: Option<String>| { + let key = key.unwrap_or_else(String::new); + let dot = if add_dot && key.as_bytes().get(0).unwrap_or(&b'[') != &b'[' { + "." + } else { + "" + }; + format!("{}{}{}", segment, dot, key) + }; + match self { + ConfigError::Type { + origin, + unexpected, + expected, + key, + } => ConfigError::Type { + origin, + unexpected, + expected, + key: Some(concat(key)), + }, + ConfigError::NotFound(key) => ConfigError::NotFound(concat(Some(key))), + _ => self, + } + } + + pub(crate) fn prepend_key(self, key: String) -> Self { + self.prepend(key, true) + } + + pub(crate) fn prepend_index(self, idx: usize) -> Self { + self.prepend(format!("[{}]", idx), false) + } +} + +/// Alias for a `Result` with the error type set to `ConfigError`. +pub type Result<T> = result::Result<T, ConfigError>; + +// Forward Debug to Display for readable panic! messages. +impl fmt::Debug for ConfigError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", *self) + } +} + +impl fmt::Display for ConfigError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + ConfigError::Frozen => write!(f, "configuration is frozen"), + + ConfigError::PathParse(ref kind) => write!(f, "{}", kind.description()), + + ConfigError::Message(ref s) => write!(f, "{}", s), + + ConfigError::Foreign(ref cause) => write!(f, "{}", cause), + + ConfigError::NotFound(ref key) => { + write!(f, "configuration property {:?} not found", key) + } + + ConfigError::Type { + ref origin, + ref unexpected, + expected, + ref key, + } => { + write!(f, "invalid type: {}, expected {}", unexpected, expected)?; + + if let Some(ref key) = *key { + write!(f, " for key `{}`", key)?; + } + + if let Some(ref origin) = *origin { + write!(f, " in {}", origin)?; + } + + Ok(()) + } + + ConfigError::FileParse { ref cause, ref uri } => { + write!(f, "{}", cause)?; + + if let Some(ref uri) = *uri { + write!(f, " in {}", uri)?; + } + + Ok(()) + } + } + } +} + +impl Error for ConfigError {} + +impl de::Error for ConfigError { + fn custom<T: fmt::Display>(msg: T) -> Self { + ConfigError::Message(msg.to_string()) + } +} + +impl ser::Error for ConfigError { + fn custom<T: fmt::Display>(msg: T) -> Self { + ConfigError::Message(msg.to_string()) + } +} diff --git a/pagetop/src/config/file.rs b/pagetop/src/config/file.rs new file mode 100644 index 00000000..8f05bffb --- /dev/null +++ b/pagetop/src/config/file.rs @@ -0,0 +1,90 @@ +mod source; +mod toml; + +use crate::config::error::*; +use crate::config::source::Source; +use crate::config::value::Value; + +use std::collections::HashMap; +use std::path::{Path, PathBuf}; + +use self::source::FileSource; + +#[derive(Clone, Debug)] +pub struct File<T> +where + T: FileSource, +{ + source: T, + + /// A required File will error if it cannot be found. + required: bool, +} + +impl File<source::FileSourceFile> { + /// Given the basename of a file, will attempt to locate a file by setting its extension to a + /// registered format. + pub fn with_name(name: &str) -> Self { + File { + required: true, + source: source::FileSourceFile::new(name.into()), + } + } +} + +impl<'a> From<&'a Path> for File<source::FileSourceFile> { + fn from(path: &'a Path) -> Self { + File { + required: true, + source: source::FileSourceFile::new(path.to_path_buf()), + } + } +} + +impl From<PathBuf> for File<source::FileSourceFile> { + fn from(path: PathBuf) -> Self { + File { + required: true, + source: source::FileSourceFile::new(path), + } + } +} + +impl<T: FileSource> File<T> { + pub fn required(mut self, required: bool) -> Self { + self.required = required; + self + } +} + +impl<T: FileSource> Source for File<T> +where + T: 'static, + T: Sync + Send, +{ + fn clone_into_box(&self) -> Box<dyn Source + Send + Sync> { + Box::new((*self).clone()) + } + + fn collect(&self) -> Result<HashMap<String, Value>> { + // Coerce the file contents to a string. + let (uri, contents) = match self + .source + .resolve() + .map_err(|err| ConfigError::Foreign(err)) + { + Ok((uri, contents)) => (uri, contents), + + Err(error) => { + if !self.required { + return Ok(HashMap::new()); + } + + return Err(error); + } + }; + + // Parse the string using the given format. + toml::parse(uri.as_ref(), &contents).map_err(|cause| ConfigError::FileParse { uri, cause }) + } +} diff --git a/pagetop/src/config/file/source.rs b/pagetop/src/config/file/source.rs new file mode 100644 index 00000000..e793f4ec --- /dev/null +++ b/pagetop/src/config/file/source.rs @@ -0,0 +1,127 @@ +use std::error::Error; +use std::env; +use std::fmt::Debug; +use std::fs; +use std::io::{self, Read}; +use std::iter::Iterator; +use std::path::{Path, PathBuf}; + + +/// Describes where the file is sourced. +pub trait FileSource: Debug + Clone { + fn resolve(&self) -> Result<(Option<String>, String), Box<dyn Error + Send + Sync>>; +} + +/// Describes a file sourced from a file. +#[derive(Clone, Debug)] +pub struct FileSourceFile { + /// Path of configuration file. + name: PathBuf, +} + +impl FileSourceFile { + pub fn new(name: PathBuf) -> FileSourceFile { + FileSourceFile { name } + } + + fn find_file(&self) -> Result<PathBuf, Box<dyn Error + Send + Sync>> { + // First check for an _exact_ match. + let mut filename = env::current_dir()?.as_path().join(self.name.clone()); + if filename.is_file() { + if vec!["toml"].contains( + &filename + .extension() + .unwrap_or_default() + .to_string_lossy() + .as_ref(), + ) { + return Ok(filename); + } + + Err(Box::new(io::Error::new( + io::ErrorKind::NotFound, + format!( + "configuration file \"{}\" is not of a registered file format", + filename.to_string_lossy() + ), + ))) + } else { + filename.set_extension("toml"); + + if filename.is_file() { + return Ok(filename); + } + + Err(Box::new(io::Error::new( + io::ErrorKind::NotFound, + format!( + "configuration file \"{}\" not found", + self.name.to_string_lossy() + ), + ))) + } + } +} + +impl FileSource for FileSourceFile { + fn resolve(&self) -> Result<(Option<String>, String), Box<dyn Error + Send + Sync>> { + // Find file. + let filename = self.find_file()?; + + // Attempt to use a relative path for the URI. + let base = env::current_dir()?; + let uri = match path_relative_from(&filename, &base) { + Some(value) => value, + None => filename.clone(), + }; + + // Read contents from file. + let mut file = fs::File::open(filename)?; + let mut text = String::new(); + file.read_to_string(&mut text)?; + + Ok((Some(uri.to_string_lossy().into_owned()), text)) + } +} + +// TODO: This should probably be a crate. +// https://github.com/rust-lang/rust/blob/master/src/librustc_trans/back/rpath.rs#L128 +fn path_relative_from(path: &Path, base: &Path) -> Option<PathBuf> { + use std::path::Component; + + if path.is_absolute() != base.is_absolute() { + if path.is_absolute() { + Some(PathBuf::from(path)) + } else { + None + } + } else { + let mut ita = path.components(); + let mut itb = base.components(); + let mut comps: Vec<Component> = vec![]; + loop { + match (ita.next(), itb.next()) { + (None, None) => break, + (Some(a), None) => { + comps.push(a); + comps.extend(ita.by_ref()); + break; + } + (None, _) => comps.push(Component::ParentDir), + (Some(a), Some(b)) if comps.is_empty() && a == b => (), + (Some(a), Some(b)) if b == Component::CurDir => comps.push(a), + (Some(_), Some(b)) if b == Component::ParentDir => return None, + (Some(a), Some(_)) => { + comps.push(Component::ParentDir); + for _ in itb { + comps.push(Component::ParentDir); + } + comps.push(a); + comps.extend(ita.by_ref()); + break; + } + } + } + Some(comps.iter().map(|c| c.as_os_str()).collect()) + } +} diff --git a/pagetop/src/config/file/toml.rs b/pagetop/src/config/file/toml.rs new file mode 100644 index 00000000..e8fa06c6 --- /dev/null +++ b/pagetop/src/config/file/toml.rs @@ -0,0 +1,51 @@ +use crate::config::value::{Value, ValueKind}; + +use toml; + +use std::collections::HashMap; +use std::error::Error; + +pub fn parse( + uri: Option<&String>, + text: &str, +) -> Result<HashMap<String, Value>, Box<dyn Error + Send + Sync>> { + // Parse a TOML value from the provided text. + // TODO: Have a proper error fire if the root of a file is ever not a Table + let value = from_toml_value(uri, &toml::from_str(text)?); + match value.kind { + ValueKind::Table(map) => Ok(map), + + _ => Ok(HashMap::new()), + } +} + +fn from_toml_value(uri: Option<&String>, value: &toml::Value) -> Value { + match *value { + toml::Value::String(ref value) => Value::new(uri, value.to_string()), + toml::Value::Float(value) => Value::new(uri, value), + toml::Value::Integer(value) => Value::new(uri, value), + toml::Value::Boolean(value) => Value::new(uri, value), + + toml::Value::Table(ref table) => { + let mut m = HashMap::new(); + + for (key, value) in table { + m.insert(key.clone(), from_toml_value(uri, value)); + } + + Value::new(uri, m) + } + + toml::Value::Array(ref array) => { + let mut l = Vec::new(); + + for value in array { + l.push(from_toml_value(uri, value)); + } + + Value::new(uri, l) + } + + toml::Value::Datetime(ref datetime) => Value::new(uri, datetime.to_string()), + } +} diff --git a/pagetop/src/config/path.rs b/pagetop/src/config/path.rs new file mode 100644 index 00000000..1afe2ddd --- /dev/null +++ b/pagetop/src/config/path.rs @@ -0,0 +1,254 @@ +use crate::config::error::*; +use crate::config::value::{Value, ValueKind}; + +use std::collections::HashMap; +use std::str::FromStr; + +mod parser; + +#[derive(Debug, Eq, PartialEq, Clone, Hash)] +pub enum Expression { + Identifier(String), + Child(Box<Expression>, String), + Subscript(Box<Expression>, isize), +} + +impl FromStr for Expression { + type Err = ConfigError; + + fn from_str(s: &str) -> Result<Expression> { + parser::from_str(s).map_err(ConfigError::PathParse) + } +} + +fn sindex_to_uindex(index: isize, len: usize) -> usize { + if index >= 0 { + index as usize + } else { + len - (index.abs() as usize) + } +} + +impl Expression { + pub fn get(self, root: &Value) -> Option<&Value> { + match self { + Expression::Identifier(id) => { + match root.kind { + // `x` access on a table is equivalent to: map[x]. + ValueKind::Table(ref map) => map.get(&id), + + // All other variants return None. + _ => None, + } + } + + Expression::Child(expr, key) => { + match expr.get(root) { + Some(value) => { + match value.kind { + // Access on a table is identical to Identifier, it just forwards. + ValueKind::Table(ref map) => map.get(&key), + + // All other variants return None. + _ => None, + } + } + + _ => None, + } + } + + Expression::Subscript(expr, index) => match expr.get(root) { + Some(value) => match value.kind { + ValueKind::Array(ref array) => { + let index = sindex_to_uindex(index, array.len()); + + if index >= array.len() { + None + } else { + Some(&array[index]) + } + } + + _ => None, + }, + + _ => None, + }, + } + } + + pub fn get_mut<'a>(&self, root: &'a mut Value) -> Option<&'a mut Value> { + match *self { + Expression::Identifier(ref id) => match root.kind { + ValueKind::Table(ref mut map) => map.get_mut(id), + + _ => None, + }, + + Expression::Child(ref expr, ref key) => match expr.get_mut(root) { + Some(value) => match value.kind { + ValueKind::Table(ref mut map) => map.get_mut(key), + + _ => None, + }, + + _ => None, + }, + + Expression::Subscript(ref expr, index) => match expr.get_mut(root) { + Some(value) => match value.kind { + ValueKind::Array(ref mut array) => { + let index = sindex_to_uindex(index, array.len()); + + if index >= array.len() { + None + } else { + Some(&mut array[index]) + } + } + + _ => None, + }, + + _ => None, + }, + } + } + + pub fn get_mut_forcibly<'a>(&self, root: &'a mut Value) -> Option<&'a mut Value> { + match *self { + Expression::Identifier(ref id) => match root.kind { + ValueKind::Table(ref mut map) => Some( + map.entry(id.clone()) + .or_insert_with(|| Value::new(None, ValueKind::Nil)), + ), + + _ => None, + }, + + Expression::Child(ref expr, ref key) => match expr.get_mut_forcibly(root) { + Some(value) => match value.kind { + ValueKind::Table(ref mut map) => Some( + map.entry(key.clone()) + .or_insert_with(|| Value::new(None, ValueKind::Nil)), + ), + + _ => { + *value = HashMap::<String, Value>::new().into(); + + if let ValueKind::Table(ref mut map) = value.kind { + Some( + map.entry(key.clone()) + .or_insert_with(|| Value::new(None, ValueKind::Nil)), + ) + } else { + unreachable!(); + } + } + }, + + _ => None, + }, + + Expression::Subscript(ref expr, index) => match expr.get_mut_forcibly(root) { + Some(value) => { + match value.kind { + ValueKind::Array(_) => (), + _ => *value = Vec::<Value>::new().into(), + } + + match value.kind { + ValueKind::Array(ref mut array) => { + let index = sindex_to_uindex(index, array.len()); + + if index >= array.len() { + array + .resize((index + 1) as usize, Value::new(None, ValueKind::Nil)); + } + + Some(&mut array[index]) + } + + _ => None, + } + } + _ => None, + }, + } + } + + pub fn set(&self, root: &mut Value, value: Value) { + match *self { + Expression::Identifier(ref id) => { + // Ensure that root is a table. + match root.kind { + ValueKind::Table(_) => {} + + _ => { + *root = HashMap::<String, Value>::new().into(); + } + } + + match value.kind { + ValueKind::Table(ref incoming_map) => { + // Pull out another table. + let mut target = if let ValueKind::Table(ref mut map) = root.kind { + map.entry(id.clone()) + .or_insert_with(|| HashMap::<String, Value>::new().into()) + } else { + unreachable!(); + }; + + // Continue the deep merge. + for (key, val) in incoming_map { + Expression::Identifier(key.clone()).set(&mut target, val.clone()); + } + } + + _ => { + if let ValueKind::Table(ref mut map) = root.kind { + // Just do a simple set. + map.insert(id.clone(), value); + } + } + } + } + + Expression::Child(ref expr, ref key) => { + if let Some(parent) = expr.get_mut_forcibly(root) { + match parent.kind { + ValueKind::Table(_) => { + Expression::Identifier(key.clone()).set(parent, value); + } + + _ => { + // Didn't find a table. Oh well. Make a table and do this anyway. + *parent = HashMap::<String, Value>::new().into(); + + Expression::Identifier(key.clone()).set(parent, value); + } + } + } + } + + Expression::Subscript(ref expr, index) => { + if let Some(parent) = expr.get_mut_forcibly(root) { + match parent.kind { + ValueKind::Array(_) => (), + _ => *parent = Vec::<Value>::new().into(), + } + + if let ValueKind::Array(ref mut array) = parent.kind { + let uindex = sindex_to_uindex(index, array.len()); + if uindex >= array.len() { + array.resize((uindex + 1) as usize, Value::new(None, ValueKind::Nil)); + } + + array[uindex] = value; + } + } + } + } + } +} diff --git a/pagetop/src/config/path/parser.rs b/pagetop/src/config/path/parser.rs new file mode 100644 index 00000000..6bc95276 --- /dev/null +++ b/pagetop/src/config/path/parser.rs @@ -0,0 +1,131 @@ +use super::Expression; + +use nom::{ + branch::alt, + bytes::complete::{is_a, tag}, + character::complete::{char, digit1, space0}, + combinator::{map, map_res, opt, recognize}, + error::ErrorKind, + sequence::{delimited, pair, preceded}, + Err, IResult, +}; + +use std::str::FromStr; + +fn raw_ident(i: &str) -> IResult<&str, String> { + map( + is_a( + "abcdefghijklmnopqrstuvwxyz \ + ABCDEFGHIJKLMNOPQRSTUVWXYZ \ + 0123456789 \ + _-", + ), + |s: &str| s.to_string(), + )(i) +} + +fn integer(i: &str) -> IResult<&str, isize> { + map_res( + delimited(space0, recognize(pair(opt(tag("-")), digit1)), space0), + FromStr::from_str, + )(i) +} + +fn ident(i: &str) -> IResult<&str, Expression> { + map(raw_ident, Expression::Identifier)(i) +} + +fn postfix<'a>(expr: Expression) -> impl FnMut(&'a str) -> IResult<&'a str, Expression> { + let e2 = expr.clone(); + let child = map(preceded(tag("."), raw_ident), move |id| { + Expression::Child(Box::new(expr.clone()), id) + }); + + let subscript = map(delimited(char('['), integer, char(']')), move |num| { + Expression::Subscript(Box::new(e2.clone()), num) + }); + + alt((child, subscript)) +} + +pub fn from_str(input: &str) -> Result<Expression, ErrorKind> { + match ident(input) { + Ok((mut rem, mut expr)) => { + while !rem.is_empty() { + match postfix(expr)(rem) { + Ok((rem_, expr_)) => { + rem = rem_; + expr = expr_; + } + + // Forward Incomplete and Error + result => { + return result.map(|(_, o)| o).map_err(to_error_kind); + } + } + } + + Ok(expr) + } + + // Forward Incomplete and Error + result => result.map(|(_, o)| o).map_err(to_error_kind), + } +} + +pub fn to_error_kind(e: Err<nom::error::Error<&str>>) -> ErrorKind { + match e { + Err::Incomplete(_) => ErrorKind::Complete, + Err::Failure(e) | Err::Error(e) => e.code, + } +} + +#[cfg(test)] +mod test { + use super::Expression::*; + use super::*; + + #[test] + fn test_id() { + let parsed: Expression = from_str("abcd").unwrap(); + assert_eq!(parsed, Identifier("abcd".into())); + } + + #[test] + fn test_id_dash() { + let parsed: Expression = from_str("abcd-efgh").unwrap(); + assert_eq!(parsed, Identifier("abcd-efgh".into())); + } + + #[test] + fn test_child() { + let parsed: Expression = from_str("abcd.efgh").unwrap(); + let expected = Child(Box::new(Identifier("abcd".into())), "efgh".into()); + + assert_eq!(parsed, expected); + + let parsed: Expression = from_str("abcd.efgh.ijkl").unwrap(); + let expected = Child( + Box::new(Child(Box::new(Identifier("abcd".into())), "efgh".into())), + "ijkl".into(), + ); + + assert_eq!(parsed, expected); + } + + #[test] + fn test_subscript() { + let parsed: Expression = from_str("abcd[12]").unwrap(); + let expected = Subscript(Box::new(Identifier("abcd".into())), 12); + + assert_eq!(parsed, expected); + } + + #[test] + fn test_subscript_neg() { + let parsed: Expression = from_str("abcd[-1]").unwrap(); + let expected = Subscript(Box::new(Identifier("abcd".into())), -1); + + assert_eq!(parsed, expected); + } +} diff --git a/pagetop/src/config/source.rs b/pagetop/src/config/source.rs new file mode 100644 index 00000000..5e693b68 --- /dev/null +++ b/pagetop/src/config/source.rs @@ -0,0 +1,87 @@ +use crate::config::error::*; +use crate::config::path; +use crate::config::value::{Value, ValueKind}; + +use std::collections::HashMap; +use std::fmt::Debug; +use std::str::FromStr; + +/// Describes a generic _source_ of configuration properties. +pub trait Source: Debug { + fn clone_into_box(&self) -> Box<dyn Source + Send + Sync>; + + /// Collect all configuration properties available from this source and return a HashMap. + fn collect(&self) -> Result<HashMap<String, Value>>; + + fn collect_to(&self, cache: &mut Value) -> Result<()> { + let props = match self.collect() { + Ok(props) => props, + Err(error) => { + return Err(error); + } + }; + + for (key, val) in &props { + match path::Expression::from_str(key) { + // Set using the path. + Ok(expr) => expr.set(cache, val.clone()), + + // Set diretly anyway. + _ => path::Expression::Identifier(key.clone()).set(cache, val.clone()), + } + } + + Ok(()) + } +} + +impl Clone for Box<dyn Source + Send + Sync> { + fn clone(&self) -> Box<dyn Source + Send + Sync> { + self.clone_into_box() + } +} + +impl Source for Vec<Box<dyn Source + Send + Sync>> { + fn clone_into_box(&self) -> Box<dyn Source + Send + Sync> { + Box::new((*self).clone()) + } + + fn collect(&self) -> Result<HashMap<String, Value>> { + let mut cache: Value = HashMap::<String, Value>::new().into(); + + for source in self { + source.collect_to(&mut cache)?; + } + + if let ValueKind::Table(table) = cache.kind { + Ok(table) + } else { + unreachable!(); + } + } +} + +impl<T> Source for Vec<T> +where + T: Source + Sync + Send, + T: Clone, + T: 'static, +{ + fn clone_into_box(&self) -> Box<dyn Source + Send + Sync> { + Box::new((*self).clone()) + } + + fn collect(&self) -> Result<HashMap<String, Value>> { + let mut cache: Value = HashMap::<String, Value>::new().into(); + + for source in self { + source.collect_to(&mut cache)?; + } + + if let ValueKind::Table(table) = cache.kind { + Ok(table) + } else { + unreachable!(); + } + } +} diff --git a/pagetop/src/config/value.rs b/pagetop/src/config/value.rs new file mode 100644 index 00000000..1e1e6e67 --- /dev/null +++ b/pagetop/src/config/value.rs @@ -0,0 +1,546 @@ +use crate::config::error::*; + +use serde::de::{Deserialize, Deserializer, Visitor}; + +use std::collections::HashMap; +use std::fmt; +use std::fmt::Display; + +/// Underlying kind of the configuration value. +#[derive(Debug, Clone, PartialEq)] +pub enum ValueKind { + Nil, + Boolean(bool), + Integer(i64), + Float(f64), + String(String), + Table(Table), + Array(Array), +} + +pub type Array = Vec<Value>; +pub type Table = HashMap<String, Value>; + +impl Default for ValueKind { + fn default() -> Self { + ValueKind::Nil + } +} + +impl<T> From<Option<T>> for ValueKind +where + T: Into<ValueKind>, +{ + fn from(value: Option<T>) -> Self { + match value { + Some(value) => value.into(), + None => ValueKind::Nil, + } + } +} + +impl From<String> for ValueKind { + fn from(value: String) -> Self { + ValueKind::String(value) + } +} + +impl<'a> From<&'a str> for ValueKind { + fn from(value: &'a str) -> Self { + ValueKind::String(value.into()) + } +} + +impl From<i64> for ValueKind { + fn from(value: i64) -> Self { + ValueKind::Integer(value) + } +} + +impl From<f64> for ValueKind { + fn from(value: f64) -> Self { + ValueKind::Float(value) + } +} + +impl From<bool> for ValueKind { + fn from(value: bool) -> Self { + ValueKind::Boolean(value) + } +} + +impl<T> From<HashMap<String, T>> for ValueKind +where + T: Into<Value>, +{ + fn from(values: HashMap<String, T>) -> Self { + let mut r = HashMap::new(); + + for (k, v) in values { + r.insert(k.clone(), v.into()); + } + + ValueKind::Table(r) + } +} + +impl<T> From<Vec<T>> for ValueKind +where + T: Into<Value>, +{ + fn from(values: Vec<T>) -> Self { + let mut l = Vec::new(); + + for v in values { + l.push(v.into()); + } + + ValueKind::Array(l) + } +} + +impl Display for ValueKind { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + ValueKind::String(ref value) => write!(f, "{}", value), + ValueKind::Boolean(value) => write!(f, "{}", value), + ValueKind::Integer(value) => write!(f, "{}", value), + ValueKind::Float(value) => write!(f, "{}", value), + ValueKind::Nil => write!(f, "nil"), + + // TODO: Figure out a nice Display for these + ValueKind::Table(ref table) => write!(f, "{:?}", table), + ValueKind::Array(ref array) => write!(f, "{:?}", array), + } + } +} + +/// A configuration value. +#[derive(Default, Debug, Clone, PartialEq)] +pub struct Value { + /// A description of the original location of the value. + /// + /// A Value originating from a File might contain: + /// ```text + /// Settings.toml + /// ``` + /// + /// A Value originating from the environment would contain: + /// ```text + /// the envrionment + /// ``` + /// + /// A Value originating from a remote source might contain: + /// ```text + /// etcd+http://127.0.0.1:2379 + /// ``` + origin: Option<String>, + + /// Underlying kind of the configuration value. + pub kind: ValueKind, +} + +impl Value { + /// Create a new value instance that will remember its source uri. + pub fn new<V>(origin: Option<&String>, kind: V) -> Self + where + V: Into<ValueKind>, + { + Value { + origin: origin.cloned(), + kind: kind.into(), + } + } + + /// Attempt to deserialize this value into the requested type. + pub fn try_into<'de, T: Deserialize<'de>>(self) -> Result<T> { + T::deserialize(self) + } + + /// Returns `self` as a bool, if possible. + // FIXME: Should this not be `try_into_*` ? + pub fn into_bool(self) -> Result<bool> { + match self.kind { + ValueKind::Boolean(value) => Ok(value), + ValueKind::Integer(value) => Ok(value != 0), + ValueKind::Float(value) => Ok(value != 0.0), + + ValueKind::String(ref value) => { + match value.to_lowercase().as_ref() { + "1" | "true" | "on" | "yes" => Ok(true), + "0" | "false" | "off" | "no" => Ok(false), + + // Unexpected string value + s => Err(ConfigError::invalid_type( + self.origin.clone(), + Unexpected::Str(s.into()), + "a boolean", + )), + } + } + + // Unexpected type + ValueKind::Nil => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Unit, + "a boolean", + )), + ValueKind::Table(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Map, + "a boolean", + )), + ValueKind::Array(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Seq, + "a boolean", + )), + } + } + + /// Returns `self` into an i64, if possible. + // FIXME: Should this not be `try_into_*` ? + pub fn into_int(self) -> Result<i64> { + match self.kind { + ValueKind::Integer(value) => Ok(value), + + ValueKind::String(ref s) => { + match s.to_lowercase().as_ref() { + "true" | "on" | "yes" => Ok(1), + "false" | "off" | "no" => Ok(0), + _ => { + s.parse().map_err(|_| { + // Unexpected string + ConfigError::invalid_type( + self.origin.clone(), + Unexpected::Str(s.clone()), + "an integer", + ) + }) + } + } + } + + ValueKind::Boolean(value) => Ok(if value { 1 } else { 0 }), + ValueKind::Float(value) => Ok(value.round() as i64), + + // Unexpected type + ValueKind::Nil => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Unit, + "an integer", + )), + ValueKind::Table(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Map, + "an integer", + )), + ValueKind::Array(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Seq, + "an integer", + )), + } + } + + /// Returns `self` into a f64, if possible. + // FIXME: Should this not be `try_into_*` ? + pub fn into_float(self) -> Result<f64> { + match self.kind { + ValueKind::Float(value) => Ok(value), + + ValueKind::String(ref s) => { + match s.to_lowercase().as_ref() { + "true" | "on" | "yes" => Ok(1.0), + "false" | "off" | "no" => Ok(0.0), + _ => { + s.parse().map_err(|_| { + // Unexpected string + ConfigError::invalid_type( + self.origin.clone(), + Unexpected::Str(s.clone()), + "a floating point", + ) + }) + } + } + } + + ValueKind::Integer(value) => Ok(value as f64), + ValueKind::Boolean(value) => Ok(if value { 1.0 } else { 0.0 }), + + // Unexpected type. + ValueKind::Nil => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Unit, + "a floating point", + )), + ValueKind::Table(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Map, + "a floating point", + )), + ValueKind::Array(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Seq, + "a floating point", + )), + } + } + + /// Returns `self` into a str, if possible. + // FIXME: Should this not be `try_into_*` ? + pub fn into_str(self) -> Result<String> { + match self.kind { + ValueKind::String(value) => Ok(value), + + ValueKind::Boolean(value) => Ok(value.to_string()), + ValueKind::Integer(value) => Ok(value.to_string()), + ValueKind::Float(value) => Ok(value.to_string()), + + // Cannot convert. + ValueKind::Nil => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Unit, + "a string", + )), + ValueKind::Table(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Map, + "a string", + )), + ValueKind::Array(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Seq, + "a string", + )), + } + } + + /// Returns `self` into an array, if possible. + // FIXME: Should this not be `try_into_*` ? + pub fn into_array(self) -> Result<Vec<Value>> { + match self.kind { + ValueKind::Array(value) => Ok(value), + + // Cannot convert. + ValueKind::Float(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Float(value), + "an array", + )), + ValueKind::String(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Str(value), + "an array", + )), + ValueKind::Integer(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Integer(value), + "an array", + )), + ValueKind::Boolean(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Bool(value), + "an array", + )), + ValueKind::Nil => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Unit, + "an array", + )), + ValueKind::Table(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Map, + "an array", + )), + } + } + + /// If the `Value` is a Table, returns the associated Map. + // FIXME: Should this not be `try_into_*` ? + pub fn into_table(self) -> Result<HashMap<String, Value>> { + match self.kind { + ValueKind::Table(value) => Ok(value), + + // Cannot convert. + ValueKind::Float(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Float(value), + "a map", + )), + ValueKind::String(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Str(value), + "a map", + )), + ValueKind::Integer(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Integer(value), + "a map", + )), + ValueKind::Boolean(value) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Bool(value), + "a map", + )), + ValueKind::Nil => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Unit, + "a map", + )), + ValueKind::Array(_) => Err(ConfigError::invalid_type( + self.origin, + Unexpected::Seq, + "a map", + )), + } + } +} + +impl<'de> Deserialize<'de> for Value { + #[inline] + fn deserialize<D>(deserializer: D) -> ::std::result::Result<Value, D::Error> + where + D: Deserializer<'de>, + { + struct ValueVisitor; + + impl<'de> Visitor<'de> for ValueVisitor { + type Value = Value; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("any valid configuration value") + } + + #[inline] + fn visit_bool<E>(self, value: bool) -> ::std::result::Result<Value, E> { + Ok(value.into()) + } + + #[inline] + fn visit_i8<E>(self, value: i8) -> ::std::result::Result<Value, E> { + Ok((value as i64).into()) + } + + #[inline] + fn visit_i16<E>(self, value: i16) -> ::std::result::Result<Value, E> { + Ok((value as i64).into()) + } + + #[inline] + fn visit_i32<E>(self, value: i32) -> ::std::result::Result<Value, E> { + Ok((value as i64).into()) + } + + #[inline] + fn visit_i64<E>(self, value: i64) -> ::std::result::Result<Value, E> { + Ok(value.into()) + } + + #[inline] + fn visit_u8<E>(self, value: u8) -> ::std::result::Result<Value, E> { + Ok((value as i64).into()) + } + + #[inline] + fn visit_u16<E>(self, value: u16) -> ::std::result::Result<Value, E> { + Ok((value as i64).into()) + } + + #[inline] + fn visit_u32<E>(self, value: u32) -> ::std::result::Result<Value, E> { + Ok((value as i64).into()) + } + + #[inline] + fn visit_u64<E>(self, value: u64) -> ::std::result::Result<Value, E> { + // FIXME: This is bad + Ok((value as i64).into()) + } + + #[inline] + fn visit_f64<E>(self, value: f64) -> ::std::result::Result<Value, E> { + Ok(value.into()) + } + + #[inline] + fn visit_str<E>(self, value: &str) -> ::std::result::Result<Value, E> + where + E: ::serde::de::Error, + { + self.visit_string(String::from(value)) + } + + #[inline] + fn visit_string<E>(self, value: String) -> ::std::result::Result<Value, E> { + Ok(value.into()) + } + + #[inline] + fn visit_none<E>(self) -> ::std::result::Result<Value, E> { + Ok(Value::new(None, ValueKind::Nil)) + } + + #[inline] + fn visit_some<D>(self, deserializer: D) -> ::std::result::Result<Value, D::Error> + where + D: Deserializer<'de>, + { + Deserialize::deserialize(deserializer) + } + + #[inline] + fn visit_unit<E>(self) -> ::std::result::Result<Value, E> { + Ok(Value::new(None, ValueKind::Nil)) + } + + #[inline] + fn visit_seq<V>(self, mut visitor: V) -> ::std::result::Result<Value, V::Error> + where + V: ::serde::de::SeqAccess<'de>, + { + let mut vec = Array::new(); + + while let Some(elem) = visitor.next_element()? { + vec.push(elem); + } + + Ok(vec.into()) + } + + fn visit_map<V>(self, mut visitor: V) -> ::std::result::Result<Value, V::Error> + where + V: ::serde::de::MapAccess<'de>, + { + let mut values = Table::new(); + + while let Some((key, value)) = visitor.next_entry()? { + values.insert(key, value); + } + + Ok(values.into()) + } + } + + deserializer.deserialize_any(ValueVisitor) + } +} + +impl<T> From<T> for Value +where + T: Into<ValueKind>, +{ + fn from(value: T) -> Self { + Value { + origin: None, + kind: value.into(), + } + } +} + +impl Display for Value { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.kind) + } +} From a11a24ceee73eee4ad7b4a764efb2b89f71eb617 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 01:00:24 +0200 Subject: [PATCH 199/853] =?UTF-8?q?=E2=8F=AA=20Revierte=20lectura=20de=20l?= =?UTF-8?q?os=20ajustes=20de=20configuraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/lib.rs | 2 +- pagetop/src/app/application.rs | 8 +++---- pagetop/src/app/banner.rs | 14 ++++++------ pagetop/src/app/banner/figfont.rs | 7 +++--- pagetop/src/app/db.rs | 29 +++++++++++++------------ pagetop/src/app/locale.rs | 7 +++--- pagetop/src/app/tracing.rs | 17 ++++++++------- pagetop/src/base/module/homepage.rs | 4 ++-- pagetop/src/core/module/all.rs | 7 +++--- pagetop/src/core/module/definition.rs | 8 +++---- pagetop/src/core/theme/definition.rs | 6 ++--- pagetop/src/lib.rs | 1 + pagetop/src/prelude.rs | 3 +-- pagetop/src/response/page/context.rs | 4 ++-- pagetop/src/response/page/definition.rs | 8 +++---- pagetop/src/util.rs | 2 +- 16 files changed, 65 insertions(+), 62 deletions(-) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index d45a2259..22c14c41 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -58,7 +58,7 @@ fn form_login() -> Form { t( "username_help", &args![ - "app" => config::get("app.name").to_owned() + "app" => SETTINGS.app.name.to_owned() ], ) .as_str(), diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 2ad4d1f3..4875a0ee 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,5 +1,5 @@ use super::fatal_error::FatalError; -use crate::config; +use crate::config::SETTINGS; use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; @@ -39,7 +39,7 @@ impl Application { module::all::register_actions(); // Inicializa valores predefinidos de configuración. - module::all::init_settings(); + // module::all::init_settings(); // Inicializa los módulos. module::all::init_modules(); @@ -58,8 +58,8 @@ impl Application { }) .bind(format!( "{}:{}", - config::get("webserver.bind_address"), - config::get("webserver.bind_port") + &SETTINGS.webserver.bind_address, + &SETTINGS.webserver.bind_port ))? .run(); diff --git a/pagetop/src/app/banner.rs b/pagetop/src/app/banner.rs index eb52f4a5..1e50e54a 100644 --- a/pagetop/src/app/banner.rs +++ b/pagetop/src/app/banner.rs @@ -1,23 +1,23 @@ mod figfont; use figfont::FIGFONT; -use crate::config; +use crate::config::SETTINGS; use substring::Substring; pub fn print_on_startup() { - if config::get("app.startup_banner").to_lowercase() != "off" { + if SETTINGS.app.startup_banner.to_lowercase() != "off" { if let Some((term_width, _)) = term_size::dimensions() { if term_width >= 80 { let maxlen = (term_width / 10) - 2; - let mut app = config::get("app.name").substring(0, maxlen).to_owned(); - if config::get("app.name").len() > maxlen { + let mut app = SETTINGS.app.name.substring(0, maxlen).to_owned(); + if SETTINGS.app.name.len() > maxlen { app = format!("{}...", app); } println!( "\n{} {}\n\n Powered by PageTop {}\n", FIGFONT.convert(&app).unwrap(), - config::get("app.description"), + &SETTINGS.app.description, env!("CARGO_PKG_VERSION") ); return; @@ -25,8 +25,8 @@ pub fn print_on_startup() { } println!( "\n{}\n{}\n\nPowered by PageTop {}\n", - config::get("app.name"), - config::get("app.description"), + &SETTINGS.app.name, + &SETTINGS.app.description, env!("CARGO_PKG_VERSION") ); } diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index 48321dc8..d92fe35a 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -1,4 +1,5 @@ -use crate::{config, LazyStatic}; +use crate::config::SETTINGS; +use crate::LazyStatic; use figlet_rs::FIGfont; @@ -8,7 +9,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { let speed = include_str!("speed.flf"); let starwars = include_str!("starwars.flf"); - FIGfont::from_content(match config::get("app.startup_banner").to_lowercase().as_str() { + FIGfont::from_content(match SETTINGS.app.startup_banner.to_lowercase().as_str() { "off" => slant, "slant" => slant, "small" => small, @@ -17,7 +18,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { _ => { println!( "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check the settings file.", - config::get("app.startup_banner"), + SETTINGS.app.startup_banner, ); slant } diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 61aec6fe..37b3b505 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,4 +1,4 @@ -use crate::config; +use crate::config::SETTINGS; use crate::db::*; use crate::{run_now, trace, LazyStatic}; @@ -8,38 +8,39 @@ use tracing_unwrap::ResultExt; pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", - config::get("database.db_name"), - config::get("database.max_pool_size") + &SETTINGS.database.db_name, + &SETTINGS.database.max_pool_size ); - let db_uri = match config::get("database.db_type").as_str() { + let db_uri = match SETTINGS.database.db_type.as_str() { "mysql" | "postgres" => { let mut tmp_uri = DbUri::parse( format!( "{}://{}/{}", - config::get("database.db_type"), - config::get("database.db_host"), - config::get("database.db_name") + &SETTINGS.database.db_type, + &SETTINGS.database.db_host, + &SETTINGS.database.db_name ) .as_str(), ) .unwrap(); tmp_uri - .set_username(config::get("database.db_user").as_str()) + .set_username(SETTINGS.database.db_user.as_str()) .unwrap(); // https://github.com/launchbadge/sqlx/issues/1624 tmp_uri - .set_password(Some(config::get("database.db_pass").as_str())) + .set_password(Some(SETTINGS.database.db_pass.as_str())) .unwrap(); - if config::get_value::<u16>("database.db_port") != 0 { - tmp_uri.set_port(Some(config::get_value::<u16>("database.db_port"))).unwrap(); + if SETTINGS.database.db_port != 0 { + tmp_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); } tmp_uri } "sqlite" => DbUri::parse( format!( "{}://{}", - config::get("database.db_type"), &config::get("database.db_name") + &SETTINGS.database.db_type, + &SETTINGS.database.db_name ) .as_str(), ) @@ -47,7 +48,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { _ => { trace::error!( "Unrecognized database type \"{}\"", - config::get("database.db_type") + &SETTINGS.database.db_type ); DbUri::parse("").unwrap() } @@ -55,7 +56,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { run_now(Database::connect::<ConnectOptions>({ let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(config::get_value::<u32>("database.max_pool_size")); + db_opt.max_connections(SETTINGS.database.max_pool_size); db_opt })) .expect_or_log("Failed to connect to database") diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index 55d3abf7..9775867f 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -1,4 +1,5 @@ -use crate::{config, trace, LazyStatic}; +use crate::config::SETTINGS; +use crate::{trace, LazyStatic}; use unic_langid::LanguageIdentifier; @@ -6,14 +7,14 @@ use unic_langid::LanguageIdentifier; /// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de /// la aplicación, obtenido de `SETTINGS.app.language`. pub static LANGID: LazyStatic<LanguageIdentifier> = - LazyStatic::new(|| match config::get("app.language").parse() { + LazyStatic::new(|| match SETTINGS.app.language.parse() { Ok(language) => language, Err(_) => { trace::warn!( "{}, {} \"{}\"! {}, {}", "Failed to parse language", "unrecognized Unicode Language Identifier", - config::get("app.language"), + SETTINGS.app.language, "Using \"en-US\"", "check the settings file", ); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index d2450ac3..bc6bf515 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -1,4 +1,5 @@ -use crate::{config, LazyStatic}; +use crate::config::SETTINGS; +use crate::LazyStatic; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; @@ -19,14 +20,14 @@ use tracing_subscriber::EnvFilter; #[rustfmt::skip] pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { let env_filter = - EnvFilter::try_new(config::get("log.tracing")).unwrap_or_else(|_| EnvFilter::new("Info")); + EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); - let rolling = config::get("log.rolling").to_lowercase(); + let rolling = SETTINGS.log.rolling.to_lowercase(); let (non_blocking, guard) = match rolling.as_str() { "stdout" => tracing_appender::non_blocking(std::io::stdout()), _ => tracing_appender::non_blocking({ - let path = config::get("log.path"); - let prefix = config::get("log.prefix"); + let path = &SETTINGS.log.path; + let prefix = &SETTINGS.log.prefix; match rolling.as_str() { "daily" => tracing_appender::rolling::daily(path, prefix), "hourly" => tracing_appender::rolling::hourly(path, prefix), @@ -35,7 +36,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { _ => { println!( "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", - config::get("log.rolling"), + SETTINGS.log.rolling, ); tracing_appender::rolling::daily(path, prefix) } @@ -46,7 +47,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { .with_env_filter(env_filter) .with_writer(non_blocking) .with_ansi(rolling.as_str() == "stdout"); - match config::get("log.format").to_lowercase().as_str() { + match SETTINGS.log.format.to_lowercase().as_str() { "json" => subscriber.json().init(), "full" => subscriber.init(), "compact" => subscriber.compact().init(), @@ -54,7 +55,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { _ => { println!( "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", - config::get("log.format"), + SETTINGS.log.format, ); subscriber.init(); } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index e51fbbf4..92a3628b 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -55,7 +55,7 @@ fn hello_world() -> Container { .with_component( Paragraph::with(html! { (e("hello_intro", &args![ - "app" => format!("<span class=\"app-name\">{}</span>", config::get("app.name")) + "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) ])) }) .with_display(ParagraphDisplay::Small), @@ -101,7 +101,7 @@ fn welcome() -> Container { .with_component( Heading::h3(html! { (e("welcome_subtitle", &args![ - "app" => format!("<span class=\"app-name\">{}</span>", config::get("app.name")) + "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) ])) }) .with_display(HeadingDisplay::Subtitle), diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 3ac7ff8b..12e461d1 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,5 +1,4 @@ use super::ModuleStaticRef; -use crate::config; use crate::core::hook::add_action; use crate::core::theme; use crate::{app, trace, LazyStatic}; @@ -87,14 +86,14 @@ pub fn register_actions() { } // INIT SETTINGS *********************************************************************************** - +/* pub fn init_settings() { trace::info!("initializing custom predefined settings"); for m in ENABLED_MODULES.read().unwrap().iter() { - config::add_predefined_settings(m.settings()); + settings::add_predefined_settings(m.settings()); } } - +*/ // INIT MODULES ************************************************************************************ pub fn init_modules() { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 8ad2bf71..110fe9bb 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,6 +1,6 @@ use crate::app; -use crate::predefined_settings; -use crate::config::PredefinedSettings; +//use crate::predefined_settings; +//use crate::settings::PredefinedSettings; use crate::core::hook::HookAction; use crate::core::theme::ThemeStaticRef; use crate::util::{single_type_name, Handler}; @@ -41,11 +41,11 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn actions(&self) -> Vec<HookAction> { vec![] } - +/* fn settings(&self) -> PredefinedSettings { predefined_settings![] } - +*/ fn init(&self) {} #[cfg(feature = "database")] diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 68bf1368..ee3abcbf 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,7 @@ use crate::app; use crate::base::component::{Container, Html}; use crate::concat_string; -use crate::config; +use crate::config::SETTINGS; use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; @@ -43,9 +43,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { @match page.title().get() { Some(t) => title { - (concat_string!(config::get("app.name"), " | ", t)) + (concat_string!(SETTINGS.app.name, " | ", t)) }, - None => title { (config::get("app.name")) } + None => title { (SETTINGS.app.name) } } @match page.description().get() { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index a61ee3ad..e9b2c650 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -40,6 +40,7 @@ // GLOBAL. pub use concat_string::concat_string; +pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; // LOCAL. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index a461ffbb..a8e21580 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -5,8 +5,7 @@ pub use crate::{ args, concat_string, configure_service_for_static_files, pub_const_handler, LazyStatic, }; -pub use crate::config; -pub use crate::config::PredefinedSettings; +pub use crate::config::SETTINGS; pub use crate::trace; diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index 4a9c3036..055fa781 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -1,11 +1,11 @@ use super::PageOp; -use crate::config; +use crate::config::SETTINGS; use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; use crate::{base, concat_string, util, LazyStatic}; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = - LazyStatic::new(|| match theme_by_single_name(&config::get("app.theme")) { + LazyStatic::new(|| match theme_by_single_name(&SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, }); diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 82e1c499..3617b40d 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,6 +1,6 @@ use super::{BeforeRenderPageHook, PageContext, PageOp, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::app::fatal_error::FatalError; -use crate::config; +use crate::config::SETTINGS; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; @@ -9,7 +9,7 @@ use crate::{trace, LazyStatic}; use std::collections::HashMap; static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { - let language = config::get("app.language")[..2].to_lowercase(); + let language = SETTINGS.app.language[..2].to_lowercase(); if !language.is_empty() { Some(language) } else { @@ -18,7 +18,7 @@ static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { }); static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { - let direction = config::get("app.direction").to_lowercase(); + let direction = SETTINGS.app.direction.to_lowercase(); match direction.as_str() { "auto" => Some("auto".to_owned()), "ltr" => Some("ltr".to_owned()), @@ -27,7 +27,7 @@ static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { _ => { trace::warn!( "Text direction \"{}\" not valid, {}", - config::get("app.direction"), + SETTINGS.app.direction, "check the settings file" ); None diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index a4358c02..68d20d3e 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -169,7 +169,7 @@ macro_rules! args { #[macro_export] macro_rules! configure_service_for_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ - let static_files = $crate::config::get("dev.static_files"); + let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { $cfg.service($crate::app::ResourceFiles::new($dir, $embed())); } else { From 183b9ff6a15bbf0ba596c0b3b434d026976d630c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 01:01:54 +0200 Subject: [PATCH 200/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Trabajando=20en=20?= =?UTF-8?q?la=20gesti=C3=B3n=20de=20la=20configuraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config.rs | 345 +++++++++++++++++++++++++++++++----------- 1 file changed, 260 insertions(+), 85 deletions(-) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index d982f7d3..d0b1ec0c 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -45,7 +45,7 @@ //! //! Sólo tienes que añadir el método [`settings()`](crate::core::module::ModuleTrait::settings) al //! implementar [`ModuleTrait`](crate::core::module::ModuleTrait) para tu módulo, devolviendo los -//! nuevos valores predefinidos con la macro [`predefined_settings!`]. +//! nuevos valores predefinidos con la macro [`predefined_settings!`](crate::predefined_settings). //! //! Cuando se carga la configuración de la aplicación, estos valores podrán ser sobrescritos con los //! ajustes personalizados del entorno. Y sólo será realmente necesario incluir en los archivos de @@ -86,129 +86,304 @@ //! // Obtiene el valor (del tipo especificado) de una clave. //! let db_port: u16 = config::get_value::<u16>("my_module.database.db_port"); //! ``` +//! +//! +//! +//! +//! +//! +//! +//! +//! +//! +//! # Loading specific type-safe settings +//! +//! You can use the TOML syntax to create new sections in your configuration +//! files, just as *\[app\]*, *\[webserver\]* or *\[database\]* exist in global +//! settings. Or also add new settings in existing sections. +//! +//! Then you just have to load the configuration to use it from your module or +//! application. +//! +//! To do this, add [*serde*](https://docs.rs/serde) in your application's +//! *Cargo.toml*: +//! +//! ``` +//! [dependencies] +//! serde = { version = "1.0", features = ["derive"] } +//! ``` +//! +//! and use the [`config_map!`] macro to create a new static as follows: +//! +//! ``` +//! use pagetop::config_map; +//! use serde::Deserialize; +//! +//! #[derive(Debug, Deserialize)] +//! pub struct Section1 { +//! pub var1: String, +//! pub var2: u16, +//! } +//! +//! #[derive(Debug, Deserialize)] +//! pub struct MySettings { +//! pub section1: Section1, +//! } +//! +//! config_map!("Application settings.", MYSETTINGS, MySettings); +//! ``` +//! +//! Use the first argument of [`config_map!`] for documentation purposes. +//! +//! If `MYSETTINGS` contains variables that are not defined in the configuration +//! files, the application will *panic!*. To avoid this, you can initialize the +//! key=value settings with default values: +//! +//! ``` +//! config_map!(r#" +//! My configuration settings for *section1* section. +//! "#, +//! MYSETTINGS, +//! MySettings, +//! "section1.var1" => "seven", +//! "section1.var2" => 7 +//! ); +//! ``` +//! +//! # How to access configuration +//! +//! * **Using the** [`config_get!`] **macro** +//! +//! It will return the value assigned for a given key or an empty String ("") +//! if it doesn't exist: +//! +//! ``` +//! use pagetop::config_get; +//! +//! fn demo() { +//! println!("Address: {}", config_get!("webserver.bind_address")); +//! println!("Port: {}", config_get!("webserver.bind_port")); +//! } +//! ``` +//! +//! * Or **using the static** [`SETTINGS`] **to get type-safe global settings** +//! +//! ``` +//! use pagetop::config::SETTINGS; +//! +//! fn demo() { +//! println!("App name: {}", &SETTINGS.app.name); +//! println!("App description: {}", &SETTINGS.app.description); +//! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); +//! } +//! ``` +//! +//! * Or **using statics to get specific type-safe settings** +//! +//! Use this for your module or application specific configuration settings. +//! +//! ``` +//! fn demo() { +//! println!("{}", &MYSETTINGS.section1.var1); +//! println!("{}", &MYSETTINGS.section1.var2); +//! } +//! ``` + +mod data; +mod de; +mod error; +mod file; +mod path; +mod source; +mod value; use crate::{trace, LazyStatic}; -use config_rs::{Config, ConfigError, File}; +use crate::config::data::ConfigData; +use crate::config::file::File; + +use serde::Deserialize; -use std::collections::HashMap; -use std::default::Default; use std::env; use std::fmt::Debug; use std::str::FromStr; -use std::sync::RwLock; - -pub type PredefinedSettings = HashMap<&'static str, &'static str>; - -#[macro_export] -macro_rules! predefined_settings { - ( $($key:literal => $value:literal),* ) => {{ - #[allow(unused_mut)] - let mut a = std::collections::HashMap::new(); - $( - a.insert($key, $value); - )* - a - }}; -} /// Directorio donde se encuentran los archivos de configuración. const CONFIG_DIR: &str = "config"; -/// Carga los valores originales "clave = valor" de los archivos de configuración. Con -/// [`config_map`] se asignarán los ajustes globales ([`SETTINGS`]); y se podrán asignar los ajustes -/// específicos de la aplicación, o también de un tema, módulo o componente. -static CONFIG: LazyStatic<Config> = LazyStatic::new(|| { +/// Original key=value settings loaded on application startup. +/// Asigna los ajustes específicos de la aplicación, o de un tema, módulo o componente, en una +/// estructura similar a [`SETTINGS`] con tipos de variables seguros. Produce un *panic!* en caso de +/// asignaciones no válidas. +pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto 'default'. let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); // Inicializa los ajustes. - let settings = Config::builder(); + let mut settings = ConfigData::default(); // Combina los archivos de configuración y asigna el modo de ejecución. settings // Primero añade configuración común a todos los entornos. Opcional. - .add_source(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) + .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) + .unwrap() // Combina la configuración específica del entorno. Por defecto 'default.toml'. Opcional. - .add_source(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, run_mode)).required(false)) + .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, run_mode)).required(false)) + .unwrap() // Combina la configuración local. Este archivo no debería incluirse en git. Opcional. - .add_source(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "local")).required(false)) + .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "local")).required(false)) + .unwrap() // Salvaguarda el modo de ejecución. - .set_default("app.run_mode", run_mode) + .set("app.run_mode", run_mode) + .unwrap(); - .unwrap() - .build() - .unwrap() + settings }); -static DEFAULTS: LazyStatic<RwLock<PredefinedSettings>> = LazyStatic::new(|| - RwLock::new(predefined_settings![ - // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Bootsier", - "app.language" => "en-US", - "app.direction" => "ltr", - "app.startup_banner" => "Slant", +#[macro_export] +/// Loads specific type-safe settings for your module or application in a structure similar to +/// [`SETTINGS`]. +/// +/// See [`How to load specific type-safe settings`](config/index.html#loading-specific-type-safe-settings). +macro_rules! pub_config_map { + ( + $doc:expr, + $SETTINGS:ident, + $Type:tt + $(, $key:expr => $value:expr)* + ) => { + $crate::doc_comment! { + concat!($doc), - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", - - // [database] - "database.db_type" => "", - "database.db_name" => "", - "database.db_user" => "", - "database.db_pass" => "", - "database.db_host" => "localhost", - "database.db_port" => "0", - "database.max_pool_size" => "5", - - // [webserver] - "webserver.bind_address" => "localhost", - "webserver.bind_port" => "8088", - - // [dev] - "dev.static_files" => "" - ]) -); - -/// Una aplicación o módulo podrá añadir nuevos valores predefinidos de configuración. -pub(crate) fn add_predefined_settings(defaults: PredefinedSettings) { - DEFAULTS.write().unwrap().extend(defaults); + pub static $SETTINGS: $crate::LazyStatic<$Type> = $crate::LazyStatic::new(|| { + let mut settings = $crate::config::CONFIG.clone(); + $( + settings.set_default($key, $value).unwrap(); + )* + match settings.try_into() { + Ok(c) => c, + Err(e) => panic!("Error parsing settings: {}", e), + } + }); + } + }; } -/// Devuelve el valor (String) de una clave. -pub fn get(key: &str) -> String { - match CONFIG.get_string(key) { - Ok(value) => value, - Err(ConfigError::NotFound(_)) => match DEFAULTS.read().unwrap().get(key) { - Some(value) => String::from(*value), +/// Devuelve el valor (del tipo especificado) de una clave. +/// +/// See [`How to access configuration`](config/index.html#how-to-access-configuration). +pub fn get<T: FromStr + Default>(key: &str) -> T where <T as FromStr>::Err: Debug { + match CONFIG.get_str(key) { + Ok(value) => match value.parse::<T>() { + Ok(value) => value, _ => { - trace::debug!("Config value not found for key \"{}\"! Return empty string", key); + trace::warn!("Failed to parse value for key \"{}\"! Return default empty value", key); Default::default() } }, _ => { - trace::warn!("Can't read config value for key \"{}\"! Return empty string", key); + trace::warn!("Can't get config value for key \"{}\"! Return default empty value", key); Default::default() } } } -/// Devuelve el valor (del tipo especificado) de una clave. -pub fn get_value<T: FromStr + Default>(key: &str) -> T where <T as FromStr>::Err: Debug { - match get(key).parse::<T>() { - Ok(value) => value, - _ => { - trace::warn!("Failed to parse value for key \"{}\"! Return default empty value", key); - Default::default() - } - } +#[rustfmt::skip] +#[derive(Debug, Deserialize)] +pub struct App { + pub name : String, + pub description : String, + pub theme : String, + pub language : String, + pub direction : String, + pub startup_banner: String, + pub run_mode : String, } + +#[rustfmt::skip] +#[derive(Debug, Deserialize)] +pub struct Log { + pub tracing : String, + pub rolling : String, + pub path : String, + pub prefix : String, + pub format : String, +} + +#[rustfmt::skip] +#[derive(Debug, Deserialize)] +pub struct Database { + pub db_type : String, + pub db_name : String, + pub db_user : String, + pub db_pass : String, + pub db_host : String, + pub db_port : u16, + pub max_pool_size : u32, +} + +#[rustfmt::skip] +#[derive(Debug, Deserialize)] +pub struct Webserver { + pub bind_address : String, + pub bind_port : u16, +} + +#[rustfmt::skip] +#[derive(Debug, Deserialize)] +pub struct Dev { + pub static_files : String, +} + +#[rustfmt::skip] +#[derive(Debug, Deserialize)] +pub struct Settings { + pub app : App, + pub log : Log, + pub database : Database, + pub webserver : Webserver, + pub dev : Dev, +} + +pub_config_map!(r#" +Ajustes globales con tipos seguros y valores predefinidos para las secciones *\[app\]*, *\[log\]*, +*\[database\]*, *\[webserver\]* y *\[dev\]* de PageTop. + +See [`How to access configuration`](index.html#how-to-access-configuration). +"#, + SETTINGS, Settings, + + // [app] + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Bootsier", + "app.language" => "en-US", + "app.direction" => "ltr", + "app.startup_banner" => "Slant", + + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", + + // [database] + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", + "database.db_host" => "localhost", + "database.db_port" => 0, + "database.max_pool_size" => 5, + + // [webserver] + "webserver.bind_address" => "localhost", + "webserver.bind_port" => 8088, + + // [dev] + "dev.static_files" => "" +); From 1ef709ab9726a353bf1e081a986f729679b83748 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 14:12:26 +0200 Subject: [PATCH 201/853] =?UTF-8?q?=F0=9F=8E=A8=20Un=20poco=20de=20orden?= =?UTF-8?q?=20en=20el=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config/file.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pagetop/src/config/file.rs b/pagetop/src/config/file.rs index 8f05bffb..b644d196 100644 --- a/pagetop/src/config/file.rs +++ b/pagetop/src/config/file.rs @@ -16,7 +16,6 @@ where T: FileSource, { source: T, - /// A required File will error if it cannot be found. required: bool, } @@ -26,8 +25,8 @@ impl File<source::FileSourceFile> { /// registered format. pub fn with_name(name: &str) -> Self { File { - required: true, source: source::FileSourceFile::new(name.into()), + required: true, } } } @@ -35,8 +34,8 @@ impl File<source::FileSourceFile> { impl<'a> From<&'a Path> for File<source::FileSourceFile> { fn from(path: &'a Path) -> Self { File { - required: true, source: source::FileSourceFile::new(path.to_path_buf()), + required: true, } } } @@ -44,8 +43,8 @@ impl<'a> From<&'a Path> for File<source::FileSourceFile> { impl From<PathBuf> for File<source::FileSourceFile> { fn from(path: PathBuf) -> Self { File { - required: true, source: source::FileSourceFile::new(path), + required: true, } } } From 3167c3780d5b185639b6ac3e75cf0b1e8e8a3a31 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 20:45:10 +0200 Subject: [PATCH 202/853] =?UTF-8?q?=F0=9F=93=9D=20[config]=20Finalizada=20?= =?UTF-8?q?documentaci=C3=B3n=20b=C3=A1sica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 1 - pagetop/src/app/application.rs | 3 - pagetop/src/config.rs | 454 +++++++++++--------------- pagetop/src/core/module/all.rs | 9 - pagetop/src/core/module/definition.rs | 6 +- pagetop/src/lib.rs | 1 - 6 files changed, 200 insertions(+), 274 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 2273a760..45fc2c74 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -24,7 +24,6 @@ categories = [ [dependencies] async-trait = "0.1.57" concat-string = "1.0.1" -doc-comment = "0.3.3" figlet-rs = "0.1.4" futures = "0.3.24" once_cell = "1.15.0" diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 4875a0ee..2512da8f 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -38,9 +38,6 @@ impl Application { // Registra acciones de los módulos. module::all::register_actions(); - // Inicializa valores predefinidos de configuración. - // module::all::init_settings(); - // Inicializa los módulos. module::all::init_modules(); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index d0b1ec0c..a372b835 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,34 +1,36 @@ //! Gestión de la configuración. //! -//! Carga durante el arranque la configuración de la aplicación en forma de pares `clave = valor` -//! recogidos en archivos [TOML](https://toml.io). +//! Carga la configuración de la aplicación en forma de pares `clave = valor` recogidos en archivos +//! [TOML](https://toml.io). //! //! La metodología [The Twelve-Factor App](https://12factor.net/es/) define **la configuración de //! una aplicación como todo lo que puede variar entre despliegues**, diferenciando entre entornos //! de desarrollo, pre-producción, producción, etc. //! -//! A veces las aplicaciones guardan configuraciones como constantes en el código, lo que supone una -//! violación de esta metodología. Debe existir una **estricta separación entre la configuración y -//! el código**. La configuración variará sustancialmente en cada despliegue, el código no. +//! A veces las aplicaciones guardan configuraciones como constantes en el código, lo que implica +//! una violación de esta metodología. PageTop recomienda una **estricta separación entre código y +//! configuración**. La configuración variará en cada tipo de despliegue, y el código no. +//! //! //! # Cómo usar archivos de configuración //! -//! Si tu aplicación requiere archivos de configuración debes crear un directorio llamado *config* al -//! mismo nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable binario de la aplicación). +//! Si tu aplicación requiere archivos de configuración debes crear un directorio llamado *config* +//! al mismo nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable binario de la +//! aplicación). //! //! Guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura secuencial //! (todos los archivos son opcionales): //! -//! 1. *config/common.toml*, útil para los ajustes comunes para cualquier entorno. Estos valores +//! 1. **config/common.toml**, útil para los ajustes comunes para cualquier entorno. Estos valores //! podrán ser sobrescritos al fusionar los archivos de configuración siguientes. //! -//! 2. *config/{archivo}.toml*, donde *{archivo}* puede definirse mediante la variable de entorno +//! 2. **config/{archivo}.toml**, donde *{archivo}* puede definirse mediante la variable de entorno //! PAGETOP_RUN_MODE: //! -//! * Si no está definida, se asumirá *default* por defecto, y PageTop cargará el archivo de +//! * Si no lo está, se asumirá *default* por defecto, y PageTop cargará el archivo de //! configuración *config/default.toml* si existe. //! -//! * De esta manera, se pueden tener diferentes ajustes de configuración para diferentes +//! * De esta manera se pueden tener diferentes ajustes de configuración para diferentes //! entornos de ejecución. Por ejemplo, para *devel.toml*, *staging.toml* o *production.toml*. //! O también para *server1.toml* o *server2.toml*. Sólo uno será cargado. //! @@ -36,158 +38,90 @@ //! sensible asociada al entorno correspondiente. Estos archivos no deberían ser publicados en //! el repositorio Git por razones de seguridad. //! -//! 3. *config/local.toml*, para añadir o sobrescribir ajustes. +//! 3. **config/local.toml**, para añadir o sobrescribir ajustes previos. //! -//! # Cómo añadir valores predefinidos de configuración -//! -//! Si nuestra **aplicación** o **módulo** requiere sus propios ajustes de configuración, es -//! recomendable (aunque no imprescindible) inicializarlos antes de su uso. -//! -//! Sólo tienes que añadir el método [`settings()`](crate::core::module::ModuleTrait::settings) al -//! implementar [`ModuleTrait`](crate::core::module::ModuleTrait) para tu módulo, devolviendo los -//! nuevos valores predefinidos con la macro [`predefined_settings!`](crate::predefined_settings). -//! -//! Cuando se carga la configuración de la aplicación, estos valores podrán ser sobrescritos con los -//! ajustes personalizados del entorno. Y sólo será realmente necesario incluir en los archivos de -//! configuración los ajustes que difieran de los predefinidos. -//! -//! ``` -//! use pagetop::prelude::*; -//! -//! pub_const_handler!(MY_MODULE_HANDLER); -//! -//! pub struct MyModule; -//! -//! impl ModuleTrait for MyModule { -//! fn handler(&self) -> Handler { -//! MY_MODULE_HANDLER -//! } -//! -//! fn settings(&self) -> PredefinedSettings { -//! predefined_settings![ -//! // Valores predefinidos para "my_module". -//! "my_module.name" => "Name", -//! "my_module.desc" => "Description", -//! // Valores predefinidos para "my_module.database". -//! "my_module.database.db_port" => "3306" -//! ] -//! } -//! } -//! ``` -//! -//! # Cómo obtener los valores de configuración -//! -//! ``` -//! use pagetop::config; -//! -//! // Obtiene el valor (String) de una clave. -//! let name: String = config::get("my_module.name"); -//! -//! // Obtiene el valor (del tipo especificado) de una clave. -//! let db_port: u16 = config::get_value::<u16>("my_module.database.db_port"); -//! ``` +//! Los ajustes de configuración siempre son de sólo lectura. //! //! +//! # Cómo añadir ajustes de configuración //! +//! Puedes usar la sintaxis de TOML para crear nuevas secciones en los archivos de configuración, +//! del mismo modo que *\[app\]* o *\[webserver\]* existen en la configuración predeterminada (ver +//! [`SETTINGS`]). //! -//! -//! -//! -//! -//! -//! -//! # Loading specific type-safe settings -//! -//! You can use the TOML syntax to create new sections in your configuration -//! files, just as *\[app\]*, *\[webserver\]* or *\[database\]* exist in global -//! settings. Or also add new settings in existing sections. -//! -//! Then you just have to load the configuration to use it from your module or -//! application. -//! -//! To do this, add [*serde*](https://docs.rs/serde) in your application's -//! *Cargo.toml*: +//! Para cargar y usar esta nueva configuración desde tu **aplicación** o **módulo** tienes que +//! incluir [*serde*](https://docs.rs/serde) en las dependencias de tu archivo *Cargo.toml*: //! //! ``` //! [dependencies] //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! and use the [`config_map!`] macro to create a new static as follows: +//! y añadir en tu código una declaración similar a la que utiliza [`SETTINGS`] para instanciar +//! ([`LazyStatic`]) e inicializar ([`init_settings()`]) los nuevos ajustes con tipos seguros y +//! valores predefinidos ([`predefined_settings!`](crate::predefined_settings)): //! //! ``` -//! use pagetop::config_map; +//! use pagetop::prelude::*; //! use serde::Deserialize; +//! use std::fmt::Debug; //! //! #[derive(Debug, Deserialize)] -//! pub struct Section1 { -//! pub var1: String, -//! pub var2: u16, +//! pub struct Id { +//! pub name: String, +//! pub desc: String, //! } //! //! #[derive(Debug, Deserialize)] -//! pub struct MySettings { -//! pub section1: Section1, +//! pub struct Size { +//! pub width: u16, +//! pub height: u16, //! } //! -//! config_map!("Application settings.", MYSETTINGS, MySettings); +//! #[derive(Debug, Deserialize)] +//! pub struct MyApp { +//! pub id: Id, +//! pub size: Size, +//! } +//! +//! pub static MY_APP: LazyStatic<MyApp> = LazyStatic::new(|| { +//! init_settings::<MyApp>(predefined_settings!( +//! // [id] +//! "id.name" => "Value Name", +//! "id.desc" => "Value Description", +//! +//! // [size] +//! "size.width" => "900", +//! "size.height" => "320" +//! )) +//! }); //! ``` //! -//! Use the first argument of [`config_map!`] for documentation purposes. +//! Es importante inicializar todos los ajustes con valores predefinidos (aunque sea con valores +//! vacíos como *""* o *"0"*, por ejemplo) para evitar *panic!*'s no deseados. //! -//! If `MYSETTINGS` contains variables that are not defined in the configuration -//! files, the application will *panic!*. To avoid this, you can initialize the -//! key=value settings with default values: +//! +//! # Cómo obtener los valores de configuración +//! +//! Basta con acceder directamente a la variable estática. Por ejemplo, con [`SETTINGS`]: //! //! ``` -//! config_map!(r#" -//! My configuration settings for *section1* section. -//! "#, -//! MYSETTINGS, -//! MySettings, -//! "section1.var1" => "seven", -//! "section1.var2" => 7 -//! ); +//! use pagetop::prelude::*; +//! +//! fn demo() { +//! println!("App name: {}", &SETTINGS.app.name); +//! println!("App description: {}", &SETTINGS.app.description); +//! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); +//! } //! ``` +//! O a valores específicos de la configuración de tu **aplicación** o **módulo**: //! -//! # How to access configuration -//! -//! * **Using the** [`config_get!`] **macro** -//! -//! It will return the value assigned for a given key or an empty String ("") -//! if it doesn't exist: -//! -//! ``` -//! use pagetop::config_get; -//! -//! fn demo() { -//! println!("Address: {}", config_get!("webserver.bind_address")); -//! println!("Port: {}", config_get!("webserver.bind_port")); -//! } -//! ``` -//! -//! * Or **using the static** [`SETTINGS`] **to get type-safe global settings** -//! -//! ``` -//! use pagetop::config::SETTINGS; -//! -//! fn demo() { -//! println!("App name: {}", &SETTINGS.app.name); -//! println!("App description: {}", &SETTINGS.app.description); -//! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); -//! } -//! ``` -//! -//! * Or **using statics to get specific type-safe settings** -//! -//! Use this for your module or application specific configuration settings. -//! -//! ``` -//! fn demo() { -//! println!("{}", &MYSETTINGS.section1.var1); -//! println!("{}", &MYSETTINGS.section1.var2); -//! } -//! ``` +//! ``` +//! fn demo() { +//! println!("{}", &MY_APP.id.name); +//! println!("{}", &MY_APP.size.width); +//! } +//! ``` mod data; mod de; @@ -197,25 +131,45 @@ mod path; mod source; mod value; -use crate::{trace, LazyStatic}; +use crate::LazyStatic; use crate::config::data::ConfigData; use crate::config::file::File; -use serde::Deserialize; - use std::env; use std::fmt::Debug; -use std::str::FromStr; +use std::collections::HashMap; + +use serde::Deserialize; + +/// Un *HashMap* con una lista de literales `"clave" => "valor"` para asignar ajustes de +/// configuración predefinidos. +/// +/// Ver [`cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). +pub type PredefinedSettings = HashMap<&'static str, &'static str>; + +#[macro_export] +/// Macro para crear e inicializar un *HashMap* ([`PredefinedSettings`]) con una lista de literales +/// `"clave" => "valor"` para asignar ajustes de configuración predefinidos. +/// +/// Ver [`cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). +macro_rules! predefined_settings { + ( $($key:literal => $value:literal),* ) => {{ + #[allow(unused_mut)] + let mut a = PredefinedSettings::new(); + $( + a.insert($key, $value); + )* + a + }}; +} /// Directorio donde se encuentran los archivos de configuración. const CONFIG_DIR: &str = "config"; -/// Original key=value settings loaded on application startup. -/// Asigna los ajustes específicos de la aplicación, o de un tema, módulo o componente, en una -/// estructura similar a [`SETTINGS`] con tipos de variables seguros. Produce un *panic!* en caso de -/// asignaciones no válidas. -pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { +/// Todos los valores originales de la configuración en forma de pares `clave = valor` recogidos de +/// los archivos de configuración. +static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto 'default'. let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); @@ -224,7 +178,7 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { // Combina los archivos de configuración y asigna el modo de ejecución. settings - // Primero añade configuración común a todos los entornos. Opcional. + // Primero añade la configuración común a todos los entornos. Opcional. .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) .unwrap() @@ -243,147 +197,137 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { settings }); -#[macro_export] -/// Loads specific type-safe settings for your module or application in a structure similar to -/// [`SETTINGS`]. +/// Carga ajustes con tipos seguros y valores predefinidos para tu aplicación o módulo en una +/// estructura similiar a [`SETTINGS`]. /// -/// See [`How to load specific type-safe settings`](config/index.html#loading-specific-type-safe-settings). -macro_rules! pub_config_map { - ( - $doc:expr, - $SETTINGS:ident, - $Type:tt - $(, $key:expr => $value:expr)* - ) => { - $crate::doc_comment! { - concat!($doc), - - pub static $SETTINGS: $crate::LazyStatic<$Type> = $crate::LazyStatic::new(|| { - let mut settings = $crate::config::CONFIG.clone(); - $( - settings.set_default($key, $value).unwrap(); - )* - match settings.try_into() { - Ok(c) => c, - Err(e) => panic!("Error parsing settings: {}", e), - } - }); - } - }; -} - -/// Devuelve el valor (del tipo especificado) de una clave. -/// -/// See [`How to access configuration`](config/index.html#how-to-access-configuration). -pub fn get<T: FromStr + Default>(key: &str) -> T where <T as FromStr>::Err: Debug { - match CONFIG.get_str(key) { - Ok(value) => match value.parse::<T>() { - Ok(value) => value, - _ => { - trace::warn!("Failed to parse value for key \"{}\"! Return default empty value", key); - Default::default() - } - }, - _ => { - trace::warn!("Can't get config value for key \"{}\"! Return default empty value", key); - Default::default() - } +/// Ver [`Cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). +pub fn init_settings<T>(values: PredefinedSettings) -> T +where T: Deserialize<'static> +{ + let mut settings = CONFIG_DATA.clone(); + for (key, value) in values.iter() { + settings.set_default(*key, *value).unwrap(); + } + match settings.try_into() { + Ok(c) => c, + Err(e) => panic!("Error parsing settings: {}", e), } } -#[rustfmt::skip] #[derive(Debug, Deserialize)] +/// Sección *\[app\]* de la configuración global. pub struct App { - pub name : String, - pub description : String, - pub theme : String, - pub language : String, - pub direction : String, + /// Valor predefinido: *"PageTop Application"* + pub name: String, + /// Valor predefinido: *"Developed with the amazing PageTop framework."* + pub description: String, + /// Valor predefinido: *"Bootsier"* + pub theme: String, + /// Valor predefinido: *"en-US"* + pub language: String, + /// Valor predefinido: *"ltr"* + pub direction: String, + /// Valor predefinido: *"Slant"* pub startup_banner: String, - pub run_mode : String, + /// Valor predefinido: según variable de entorno PAGETOP_RUN_MODE, o *"default"* si no lo está + pub run_mode: String, } -#[rustfmt::skip] #[derive(Debug, Deserialize)] +/// Sección *\[log\]* de la configuración global. pub struct Log { - pub tracing : String, - pub rolling : String, - pub path : String, - pub prefix : String, - pub format : String, + /// Valor predefinido: *"Info"* + pub tracing: String, + /// Valor predefinido: *"Stdout"* + pub rolling: String, + /// Valor predefinido: *"log"* + pub path: String, + /// Valor predefinido: *"tracing.log"* + pub prefix: String, + /// Valor predefinido: *"Full"* + pub format: String, } -#[rustfmt::skip] #[derive(Debug, Deserialize)] +/// Sección *\[database\]* de la configuración global. pub struct Database { - pub db_type : String, - pub db_name : String, - pub db_user : String, - pub db_pass : String, - pub db_host : String, - pub db_port : u16, - pub max_pool_size : u32, + /// Valor predefinido: *""* + pub db_type: String, + /// Valor predefinido: *""* + pub db_name: String, + /// Valor predefinido: *""* + pub db_user: String, + /// Valor predefinido: *""* + pub db_pass: String, + /// Valor predefinido: *"localhost"* + pub db_host: String, + /// Valor predefinido: *"0"* + pub db_port: u16, + /// Valor predefinido: *"5"* + pub max_pool_size: u32, } -#[rustfmt::skip] #[derive(Debug, Deserialize)] +/// Sección *\[webserver\]* de la configuración global. pub struct Webserver { - pub bind_address : String, - pub bind_port : u16, + /// Valor predefinido: *"localhost"* + pub bind_address: String, + /// Valor predefinido: *"8088"* + pub bind_port: u16, } -#[rustfmt::skip] #[derive(Debug, Deserialize)] +/// Sección *\[dev\]* de la configuración global. pub struct Dev { + /// Valor predefinido: *""* pub static_files : String, } -#[rustfmt::skip] #[derive(Debug, Deserialize)] +/// Ajustes globales para las secciones *\[app\]*, *\[log\]*, *\[database\]*, *\[webserver\]* y +/// *\[dev\]* requeridas por PageTop (ver [`SETTINGS`]). pub struct Settings { - pub app : App, - pub log : Log, - pub database : Database, - pub webserver : Webserver, - pub dev : Dev, + pub app: App, + pub log: Log, + pub database: Database, + pub webserver: Webserver, + pub dev: Dev, } -pub_config_map!(r#" -Ajustes globales con tipos seguros y valores predefinidos para las secciones *\[app\]*, *\[log\]*, -*\[database\]*, *\[webserver\]* y *\[dev\]* de PageTop. +/// Instancia los ajustes globales para la estructura [`Settings`]. +/// +/// Ver [`Cómo obtener los valores de configuración`](index.html#cómo-obtener-los-valores-de-configuración). +pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { + init_settings::<Settings>(predefined_settings!( + // [app] + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Bootsier", + "app.language" => "en-US", + "app.direction" => "ltr", + "app.startup_banner" => "Slant", -See [`How to access configuration`](index.html#how-to-access-configuration). -"#, - SETTINGS, Settings, + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", - // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Bootsier", - "app.language" => "en-US", - "app.direction" => "ltr", - "app.startup_banner" => "Slant", + // [database] + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", + "database.db_host" => "localhost", + "database.db_port" => "0", + "database.max_pool_size" => "5", - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", + // [webserver] + "webserver.bind_address" => "localhost", + "webserver.bind_port" => "8088", - // [database] - "database.db_type" => "", - "database.db_name" => "", - "database.db_user" => "", - "database.db_pass" => "", - "database.db_host" => "localhost", - "database.db_port" => 0, - "database.max_pool_size" => 5, - - // [webserver] - "webserver.bind_address" => "localhost", - "webserver.bind_port" => 8088, - - // [dev] - "dev.static_files" => "" -); + // [dev] + "dev.static_files" => "" + )) +}); diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 12e461d1..3fa88947 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -85,15 +85,6 @@ pub fn register_actions() { } } -// INIT SETTINGS *********************************************************************************** -/* -pub fn init_settings() { - trace::info!("initializing custom predefined settings"); - for m in ENABLED_MODULES.read().unwrap().iter() { - settings::add_predefined_settings(m.settings()); - } -} -*/ // INIT MODULES ************************************************************************************ pub fn init_modules() { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 110fe9bb..16d9d712 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -41,11 +41,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn actions(&self) -> Vec<HookAction> { vec![] } -/* - fn settings(&self) -> PredefinedSettings { - predefined_settings![] - } -*/ + fn init(&self) {} #[cfg(feature = "database")] diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index e9b2c650..a61ee3ad 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -40,7 +40,6 @@ // GLOBAL. pub use concat_string::concat_string; -pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; // LOCAL. From 33415a14bbe1ecee01aa78981b55fff956202491 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 20:48:14 +0200 Subject: [PATCH 203/853] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20[config]=20Elimina?= =?UTF-8?q?=20c=C3=B3digo=20no=20usado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config/data.rs | 81 +---------------------------------- pagetop/src/config/path.rs | 86 -------------------------------------- 2 files changed, 1 insertion(+), 166 deletions(-) diff --git a/pagetop/src/config/data.rs b/pagetop/src/config/data.rs index b9f72de7..22fe8359 100644 --- a/pagetop/src/config/data.rs +++ b/pagetop/src/config/data.rs @@ -1,7 +1,7 @@ use crate::config::error::*; use crate::config::path; use crate::config::source::Source; -use crate::config::value::{Table, Value}; +use crate::config::value::Value; use serde::de::Deserialize; @@ -38,14 +38,6 @@ pub struct ConfigData { } impl ConfigData { - pub fn new() -> Self { - Self { - kind: ConfigKind::default(), - // Config root should be instantiated as an empty table to avoid deserialization errors. - cache: Value::new(None, Table::new()), - } - } - /// Merge in a configuration property source. pub fn merge<T>(&mut self, source: T) -> Result<&mut ConfigData> where @@ -63,24 +55,6 @@ impl ConfigData { self.refresh() } - /// Merge in a configuration property source. - pub fn with_merged<T>(mut self, source: T) -> Result<Self> - where - T: 'static, - T: Source + Send + Sync, - { - match self.kind { - ConfigKind::Mutable { - ref mut sources, .. - } => { - sources.push(Box::new(source)); - } - } - - self.refresh()?; - Ok(self) - } - /// Refresh the configuration cache with fresh data from added sources. /// /// Configuration is automatically refreshed after a mutation operation (`set`, `merge`, @@ -145,59 +119,6 @@ impl ConfigData { self.refresh() } - pub fn set_once(&mut self, key: &str, value: Value) -> Result<()> { - let expr: path::Expression = key.parse()?; - - // Traverse the cache using the path to (possibly) retrieve a value. - if let Some(ref mut val) = expr.get_mut(&mut self.cache) { - **val = value; - } else { - expr.set(&mut self.cache, value); - } - Ok(()) - } - - pub fn get<'de, T: Deserialize<'de>>(&self, key: &str) -> Result<T> { - // Parse the key into a path expression. - let expr: path::Expression = key.parse()?; - - // Traverse the cache using the path to (possibly) retrieve a value. - let value = expr.get(&self.cache).cloned(); - - match value { - Some(value) => { - // Deserialize the received value into the requested type. - T::deserialize(value).map_err(|e| e.extend_with_key(key)) - } - - None => Err(ConfigError::NotFound(key.into())), - } - } - - pub fn get_str(&self, key: &str) -> Result<String> { - self.get(key).and_then(Value::into_str) - } - - pub fn get_int(&self, key: &str) -> Result<i64> { - self.get(key).and_then(Value::into_int) - } - - pub fn get_float(&self, key: &str) -> Result<f64> { - self.get(key).and_then(Value::into_float) - } - - pub fn get_bool(&self, key: &str) -> Result<bool> { - self.get(key).and_then(Value::into_bool) - } - - pub fn get_table(&self, key: &str) -> Result<HashMap<String, Value>> { - self.get(key).and_then(Value::into_table) - } - - pub fn get_array(&self, key: &str) -> Result<Vec<Value>> { - self.get(key).and_then(Value::into_array) - } - /// Attempt to deserialize the entire configuration into the requested type. pub fn try_into<'de, T: Deserialize<'de>>(self) -> Result<T> { T::deserialize(self) diff --git a/pagetop/src/config/path.rs b/pagetop/src/config/path.rs index 1afe2ddd..e99c6d68 100644 --- a/pagetop/src/config/path.rs +++ b/pagetop/src/config/path.rs @@ -30,92 +30,6 @@ fn sindex_to_uindex(index: isize, len: usize) -> usize { } impl Expression { - pub fn get(self, root: &Value) -> Option<&Value> { - match self { - Expression::Identifier(id) => { - match root.kind { - // `x` access on a table is equivalent to: map[x]. - ValueKind::Table(ref map) => map.get(&id), - - // All other variants return None. - _ => None, - } - } - - Expression::Child(expr, key) => { - match expr.get(root) { - Some(value) => { - match value.kind { - // Access on a table is identical to Identifier, it just forwards. - ValueKind::Table(ref map) => map.get(&key), - - // All other variants return None. - _ => None, - } - } - - _ => None, - } - } - - Expression::Subscript(expr, index) => match expr.get(root) { - Some(value) => match value.kind { - ValueKind::Array(ref array) => { - let index = sindex_to_uindex(index, array.len()); - - if index >= array.len() { - None - } else { - Some(&array[index]) - } - } - - _ => None, - }, - - _ => None, - }, - } - } - - pub fn get_mut<'a>(&self, root: &'a mut Value) -> Option<&'a mut Value> { - match *self { - Expression::Identifier(ref id) => match root.kind { - ValueKind::Table(ref mut map) => map.get_mut(id), - - _ => None, - }, - - Expression::Child(ref expr, ref key) => match expr.get_mut(root) { - Some(value) => match value.kind { - ValueKind::Table(ref mut map) => map.get_mut(key), - - _ => None, - }, - - _ => None, - }, - - Expression::Subscript(ref expr, index) => match expr.get_mut(root) { - Some(value) => match value.kind { - ValueKind::Array(ref mut array) => { - let index = sindex_to_uindex(index, array.len()); - - if index >= array.len() { - None - } else { - Some(&mut array[index]) - } - } - - _ => None, - }, - - _ => None, - }, - } - } - pub fn get_mut_forcibly<'a>(&self, root: &'a mut Value) -> Option<&'a mut Value> { match *self { Expression::Identifier(ref id) => match root.kind { From 3f735f7f5634e93e71c0f9602d58ae60311578b7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 20:52:44 +0200 Subject: [PATCH 204/853] =?UTF-8?q?=F0=9F=8E=A8=20Ejecuta=20cargo=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 3 +-- pagetop/src/app/db.rs | 3 +-- pagetop/src/config.rs | 10 ++++------ pagetop/src/config/file/source.rs | 3 +-- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 2512da8f..a5c18c4c 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -55,8 +55,7 @@ impl Application { }) .bind(format!( "{}:{}", - &SETTINGS.webserver.bind_address, - &SETTINGS.webserver.bind_port + &SETTINGS.webserver.bind_address, &SETTINGS.webserver.bind_port ))? .run(); diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 37b3b505..98f96e47 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -39,8 +39,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { "sqlite" => DbUri::parse( format!( "{}://{}", - &SETTINGS.database.db_type, - &SETTINGS.database.db_name + &SETTINGS.database.db_type, &SETTINGS.database.db_name ) .as_str(), ) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index a372b835..14b6652f 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -136,9 +136,9 @@ use crate::LazyStatic; use crate::config::data::ConfigData; use crate::config::file::File; +use std::collections::HashMap; use std::env; use std::fmt::Debug; -use std::collections::HashMap; use serde::Deserialize; @@ -181,15 +181,12 @@ static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { // Primero añade la configuración común a todos los entornos. Opcional. .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) .unwrap() - // Combina la configuración específica del entorno. Por defecto 'default.toml'. Opcional. .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, run_mode)).required(false)) .unwrap() - // Combina la configuración local. Este archivo no debería incluirse en git. Opcional. .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "local")).required(false)) .unwrap() - // Salvaguarda el modo de ejecución. .set("app.run_mode", run_mode) .unwrap(); @@ -202,7 +199,8 @@ static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { /// /// Ver [`Cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). pub fn init_settings<T>(values: PredefinedSettings) -> T -where T: Deserialize<'static> +where + T: Deserialize<'static>, { let mut settings = CONFIG_DATA.clone(); for (key, value) in values.iter() { @@ -280,7 +278,7 @@ pub struct Webserver { /// Sección *\[dev\]* de la configuración global. pub struct Dev { /// Valor predefinido: *""* - pub static_files : String, + pub static_files: String, } #[derive(Debug, Deserialize)] diff --git a/pagetop/src/config/file/source.rs b/pagetop/src/config/file/source.rs index e793f4ec..80052c87 100644 --- a/pagetop/src/config/file/source.rs +++ b/pagetop/src/config/file/source.rs @@ -1,12 +1,11 @@ -use std::error::Error; use std::env; +use std::error::Error; use std::fmt::Debug; use std::fs; use std::io::{self, Read}; use std::iter::Iterator; use std::path::{Path, PathBuf}; - /// Describes where the file is sourced. pub trait FileSource: Debug + Clone { fn resolve(&self) -> Result<(Option<String>, String), Box<dyn Error + Send + Sync>>; From edc81ccf3b1a19d854ef81257c876e645c896138 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 21:00:54 +0200 Subject: [PATCH 205/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 45fc2c74..2f32a219 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.28" +version = "0.0.29" edition = "2021" authors = [ @@ -22,10 +22,10 @@ categories = [ ] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.58" concat-string = "1.0.1" figlet-rs = "0.1.4" -futures = "0.3.24" +futures = "0.3.25" once_cell = "1.15.0" paste = "1.0.9" substring = "1.4.5" @@ -36,14 +36,14 @@ serde = "1.0" nom = "7.1.1" toml = "0.5.9" -tracing = "0.1.36" +tracing = "0.1.37" tracing-appender = "0.2.2" -tracing-subscriber = { version = "0.3.15", features = ["json", "env-filter"] } +tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.9.2", default-features = false } tracing-actix-web = "0.6.1" fluent-templates = "0.8.0" -unic-langid = "0.9.0" +unic-langid = "0.9.1" actix-web = "4.2.1" actix-web-files = { package = "actix-files", version = "0.6.2" } From 3d9db9f9554f8dfe2581a8bfb18f52d434bdd37a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Oct 2022 21:08:59 +0200 Subject: [PATCH 206/853] =?UTF-8?q?=F0=9F=94=A7=20[pagetop]=20Correcci?= =?UTF-8?q?=C3=B3n=20para=20publicar=20en=20crates.io?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 2f32a219..2024c8df 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -26,16 +26,14 @@ async-trait = "0.1.58" concat-string = "1.0.1" figlet-rs = "0.1.4" futures = "0.3.25" +nom = "7.1.1" once_cell = "1.15.0" paste = "1.0.9" substring = "1.4.5" term_size = "0.3.2" +toml = "0.5.9" url = "2.3.1" -serde = "1.0" -nom = "7.1.1" -toml = "0.5.9" - tracing = "0.1.37" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } @@ -52,6 +50,8 @@ static-files = "0.2.3" maud = { version = "0.24.0", features = ["actix-web"] } +serde = { version = "1.0", features = ["derive"] } + [dependencies.sea-orm] version = "0.9.3" features = ["debug-print", "macros", "runtime-async-std-native-tls"] From d4f6cbbd3bbd6201ca4ba7d129a12e834dda2714 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 22 Oct 2022 11:20:43 +0200 Subject: [PATCH 207/853] =?UTF-8?q?=F0=9F=94=A7=20Ajusta=20archivos=20de?= =?UTF-8?q?=20configuraci=C3=B3n=20a=20directrices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/config/common.toml | 8 ++++++++ drust/config/default.toml | 18 ------------------ drust/config/local.toml | 12 ++++++++++++ ...s.default.toml => settings.predefined.toml} | 0 4 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 drust/config/common.toml create mode 100644 drust/config/local.toml rename pagetop/config/{settings.default.toml => settings.predefined.toml} (100%) diff --git a/drust/config/common.toml b/drust/config/common.toml new file mode 100644 index 00000000..1562e469 --- /dev/null +++ b/drust/config/common.toml @@ -0,0 +1,8 @@ +[app] +name = "Drust" +description = """\ + A modern web Content Management System to share your world.\ +""" + +[database] +db_type = "mysql" diff --git a/drust/config/default.toml b/drust/config/default.toml index 32684d4a..1cbcbfea 100644 --- a/drust/config/default.toml +++ b/drust/config/default.toml @@ -1,22 +1,4 @@ -[app] -name = "Drust" -description = """\ - A modern web Content Management System to share your world.\ -""" -#theme = "Aliner" -#theme = "Minimal" -theme = "Bootsier" -#theme = "Bulmix" -language = "es-ES" - [database] -db_type = "mysql" db_name = "drust" db_user = "drust" db_pass = "DrU__#3T" - -[log] -tracing = "Info,pagetop=Debug,sqlx::query=Warn" - -[dev] -#static_files = "../pagetop/static" diff --git a/drust/config/local.toml b/drust/config/local.toml new file mode 100644 index 00000000..8bf0fa36 --- /dev/null +++ b/drust/config/local.toml @@ -0,0 +1,12 @@ +[app] +#theme = "Aliner" +#theme = "Minimal" +theme = "Bootsier" +#theme = "Bulmix" +language = "es-ES" + +[log] +tracing = "Info,pagetop=Debug,sqlx::query=Warn" + +[dev] +#static_files = "../pagetop/static" diff --git a/pagetop/config/settings.default.toml b/pagetop/config/settings.predefined.toml similarity index 100% rename from pagetop/config/settings.default.toml rename to pagetop/config/settings.predefined.toml From 424547241b5f71793c0b2beb648cecb6dc25c09c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 22 Oct 2022 12:43:50 +0200 Subject: [PATCH 208/853] =?UTF-8?q?=F0=9F=93=9D=20[trace]=20Inicia=20la=20?= =?UTF-8?q?documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/trace.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pagetop/src/trace.rs b/pagetop/src/trace.rs index f2e355ce..2b2f3fb1 100644 --- a/pagetop/src/trace.rs +++ b/pagetop/src/trace.rs @@ -1,2 +1,19 @@ +//! Registro de trazas y eventos de la aplicación. +//! +//! PageTop recopila la información de diagnóstico de la aplicación de manera estructurada y basada +//! en eventos. +//! +//! En sistemas asíncronos, interpretar los mensajes de registro tradicionales (*log*) a menudo +//! resulta complicado. Las tareas individuales se multiplexan para el mismo subproceso y los +//! eventos y mensajes de registro asociados se entremezclan, dificultando el seguimiento de la +//! secuencia lógica. +//! +//! PageTop usa [`tracing`](https://docs.rs/tracing) para permitir a las **aplicaciones** y los +//! **módulos** registrar eventos estructurados con información añadida sobre *temporalidad* y +//! *causalidad*. A diferencia de un mensaje de registro, un intervalo (*span*) tiene una hora de +//! inicio y de finalización, puede entrar y salir del flujo de la ejecución y puede existir dentro +//! de un árbol anidado de intervalos similares. Además, estos intervalos están *estructurados*, con +//! capacidad para grabar tipos de datos y mensajes de texto. + pub use tracing::{debug, error, info, trace, warn}; pub use tracing::{event, span, Level}; From af93cb0ea153ad1e3c09df541c7573a409720227 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 30 Oct 2022 23:22:28 +0100 Subject: [PATCH 209/853] =?UTF-8?q?=F0=9F=93=9D=20[locale]=20Inicia=20la?= =?UTF-8?q?=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/locale.rs | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index f5dfb5f9..2f9f3ef2 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -1,3 +1,100 @@ +//! Localización (¿i18n ó l10n?). +//! +//! Proporciona soporte a [Fluent](https://www.projectfluent.org/), un conjunto de especificaciones +//! para la localización de aplicaciones, así como implementaciones y buenas prácticas originalmente +//! desarrolladas por Mozilla. +//! +//! +//! # Sintaxis Fluent (FTL) +//! +//! El formato utilizado para describir los recursos de traducción utilizados por Fluent se llama +//! [FTL](https://www.projectfluent.org/fluent/guide/). FTL está diseñado para ser fácil de leer, +//! pero al mismo tiempo permite representar conceptos complejos del lenguaje natural para tratar +//! género, plurales, conjugaciones, y otros. +//! +//! +//! # Recursos Fluent +//! +//! PageTop utiliza [fluent-templates](https://docs.rs/fluent-templates/) para integrar durante la +//! compilación los recursos de localización en el binario de la aplicación. Básicamente agrupa +//! todos los archivos de los subdirectorios del directorio *src/locales* que tienen un +//! [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido y los asigna a su +//! identificador correspondiente: +//! +//! ```text +//! resources/locales +//! ├── common.ftl +//! ├── en-US +//! │ └── main.ftl +//! ├── es-ES +//! │ └── main.ftl +//! ├── es-MX +//! │ └── main.ftl +//! └── fr +//! └── main.ftl +//! ``` +//! +//! Ejemplo de un archivo *src/locales/en-US/main.ftl*: +//! +//! ```text +//! hello-world = Hello world! +//! hello-user = Hello, {$userName}! +//! shared-photos = +//! {$userName} {$photoCount -> +//! [one] added a new photo +//! *[other] added {$photoCount} new photos +//! } of {$userGender -> +//! [male] him and his family +//! [female] her and her family +//! *[other] the family +//! }. +//! ``` +//! +//! Ejemplo de un archivo *src/locales/es-ES/main.ftl*: +//! +//! ```text +//! hello-world = Hola mundo! +//! hello-user = ¡Hola, {$userName}! +//! shared-photos = +//! {$userName} {$photoCount -> +//! [one] ha añadido una nueva foto +//! *[other] ha añadido {$photoCount} nuevas fotos +//! } de {$userGender -> +//! [male] él y su familia +//! [female] ella y su familia +//! *[other] la familia +//! }. +//! ``` +//! +//! # Cómo aplicar la localización en tu código +//! +//! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la +//! poderosa macro [`localize!`] para integrar fácilmente tus recursos de +//! localización. +//! +//! Esta macro crea dos funciones para el ámbito donde se ejecuta. Por un lado +//! la función `l()` para traducciones directas de etiquetas. Y por otro la +//! función `t()` para traducciones que requieren argumentos: +//! +//! ``` +//! use pagetop::{args, localize}; +//! +//! localize!("en-US"); +//! +//! fn demo() { +//! println!("* {}", l("hello-world")); +//! println!("* {}", t("hello-world", &args![])); +//! println!("* {}", t("hello-user", &args!["userName" => "Julia"])); +//! +//! let args = args![ +//! "userName" => "Roberto", +//! "photoCount" => 3, +//! "userGender" => "male" +//! ]; +//! println!("* {}\n", t("shared-photos", &args)); +//! } +//! ``` + pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; From 483774e6c13e6e1903cc7f3f11f2b9d63c093f2d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 30 Oct 2022 23:23:47 +0100 Subject: [PATCH 210/853] =?UTF-8?q?=F0=9F=93=9D=20[config]=20Reordena=20ap?= =?UTF-8?q?artados=20de=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config.rs | 203 +++++++++++++++++++++--------------------- 1 file changed, 103 insertions(+), 100 deletions(-) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 14b6652f..8b3fe1d1 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -12,98 +12,38 @@ //! configuración**. La configuración variará en cada tipo de despliegue, y el código no. //! //! -//! # Cómo usar archivos de configuración +//! # Cómo cargar los ajustes de configuración //! -//! Si tu aplicación requiere archivos de configuración debes crear un directorio llamado *config* -//! al mismo nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable binario de la -//! aplicación). +//! Si tu aplicación requiere archivos de configuración debes crear un directorio *config* al mismo +//! nivel del archivo *Cargo.toml* de tu proyecto (o del ejecutable binario de la aplicación). //! -//! Guarda la configuración usando archivos TOML asumiendo el siguiente orden de lectura secuencial -//! (todos los archivos son opcionales): +//! PageTop se encargará de cargar todos los ajustes de configuración de tu aplicación leyendo los +//! siguientes archivos TOML en este orden (todos los archivos son opcionales): //! -//! 1. **config/common.toml**, útil para los ajustes comunes para cualquier entorno. Estos valores -//! podrán ser sobrescritos al fusionar los archivos de configuración siguientes. +//! 1. **config/common.toml**, útil para los ajustes comunes a cualquier entorno. Estos valores +//! podrán ser sobrescritos al fusionar los archivos de configuración restantes. //! -//! 2. **config/{archivo}.toml**, donde *{archivo}* puede definirse mediante la variable de entorno -//! PAGETOP_RUN_MODE: +//! 2. **config/{file}.toml**, donde *{file}* se define con la variable de entorno PAGETOP_RUN_MODE: //! -//! * Si no lo está, se asumirá *default* por defecto, y PageTop cargará el archivo de -//! configuración *config/default.toml* si existe. +//! * Si no está definida se asumirá *default* por defecto y PageTop intentará cargar el archivo +//! *config/default.toml* si existe. //! -//! * De esta manera se pueden tener diferentes ajustes de configuración para diferentes -//! entornos de ejecución. Por ejemplo, para *devel.toml*, *staging.toml* o *production.toml*. -//! O también para *server1.toml* o *server2.toml*. Sólo uno será cargado. +//! * De esta manera podrás tener diferentes ajustes de configuración para diferentes entornos +//! de ejecución. Por ejemplo, para *devel.toml*, *staging.toml* o *production.toml*. O +//! también para *server1.toml* o *server2.toml*. Sólo uno será cargado. //! //! * Normalmente estos archivos suelen ser idóneos para incluir contraseñas o configuración //! sensible asociada al entorno correspondiente. Estos archivos no deberían ser publicados en //! el repositorio Git por razones de seguridad. //! -//! 3. **config/local.toml**, para añadir o sobrescribir ajustes previos. -//! -//! Los ajustes de configuración siempre son de sólo lectura. +//! 3. **config/local.toml**, para añadir o sobrescribir ajustes de los archivos anteriores. //! //! -//! # Cómo añadir ajustes de configuración +//! # Cómo usar los ajustes globales de la configuración //! -//! Puedes usar la sintaxis de TOML para crear nuevas secciones en los archivos de configuración, -//! del mismo modo que *\[app\]* o *\[webserver\]* existen en la configuración predeterminada (ver -//! [`SETTINGS`]). -//! -//! Para cargar y usar esta nueva configuración desde tu **aplicación** o **módulo** tienes que -//! incluir [*serde*](https://docs.rs/serde) en las dependencias de tu archivo *Cargo.toml*: -//! -//! ``` -//! [dependencies] -//! serde = { version = "1.0", features = ["derive"] } -//! ``` -//! -//! y añadir en tu código una declaración similar a la que utiliza [`SETTINGS`] para instanciar -//! ([`LazyStatic`]) e inicializar ([`init_settings()`]) los nuevos ajustes con tipos seguros y -//! valores predefinidos ([`predefined_settings!`](crate::predefined_settings)): -//! -//! ``` -//! use pagetop::prelude::*; -//! use serde::Deserialize; -//! use std::fmt::Debug; -//! -//! #[derive(Debug, Deserialize)] -//! pub struct Id { -//! pub name: String, -//! pub desc: String, -//! } -//! -//! #[derive(Debug, Deserialize)] -//! pub struct Size { -//! pub width: u16, -//! pub height: u16, -//! } -//! -//! #[derive(Debug, Deserialize)] -//! pub struct MyApp { -//! pub id: Id, -//! pub size: Size, -//! } -//! -//! pub static MY_APP: LazyStatic<MyApp> = LazyStatic::new(|| { -//! init_settings::<MyApp>(predefined_settings!( -//! // [id] -//! "id.name" => "Value Name", -//! "id.desc" => "Value Description", -//! -//! // [size] -//! "size.width" => "900", -//! "size.height" => "320" -//! )) -//! }); -//! ``` -//! -//! Es importante inicializar todos los ajustes con valores predefinidos (aunque sea con valores -//! vacíos como *""* o *"0"*, por ejemplo) para evitar *panic!*'s no deseados. -//! -//! -//! # Cómo obtener los valores de configuración -//! -//! Basta con acceder directamente a la variable estática. Por ejemplo, con [`SETTINGS`]: +//! PageTop incluye un conjunto de ajustes propios ([`Settings`]) accesibles vía [`SETTINGS`] para +//! las secciones reservadas [`[app]`](App), [`[log]`](Log), [`[database]`](Database), +//! [`[webserver]`](Webserver) y [`[dev]`](Dev) de la configuración: //! //! ``` //! use pagetop::prelude::*; @@ -114,12 +54,65 @@ //! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); //! } //! ``` -//! O a valores específicos de la configuración de tu **aplicación** o **módulo**: +//! +//! Los ajustes de configuración siempre son de sólo lectura. +//! +//! +//! # Cómo añadir ajustes de configuración +//! +//! Para proporcionar a tu **aplicación** o **módulo** sus propios ajustes de configuración, añade +//! [*serde*](https://docs.rs/serde) en las dependencias de tu archivo *Cargo.toml*: +//! +//! ```toml +//! [dependencies] +//! serde = { version = "1.0", features = ["derive"] } +//! ``` +//! +//! Incluye en tu código una asignación similar a la que usa [`SETTINGS`] para declarar +//! ([`LazyStatic`]) e inicializar tus nuevos ajustes ([`init_settings()`]) con tipos seguros y +//! valores predefinidos ([`predefined_settings!`](crate::predefined_settings)): +//! +//! ``` +//! use pagetop::prelude::*; +//! use serde::Deserialize; +//! use std::fmt::Debug; +//! +//! #[derive(Debug, Deserialize)] +//! pub struct MySettings { +//! pub myapp: MyApp, +//! } +//! +//! #[derive(Debug, Deserialize)] +//! pub struct MyApp { +//! pub name: String, +//! pub description: Option<String>, +//! pub width: u16, +//! pub height: u16, +//! } +//! +//! pub static MY_SETTINGS: LazyStatic<MySettings> = LazyStatic::new(|| { +//! init_settings::<MySettings>(predefined_settings!( +//! // [myapp] +//! "myapp.name" => "Value Name", +//! "myapp.width" => "900", +//! "myapp.height" => "320" +//! )) +//! }); +//! ``` +//! +//! Y usa la sintaxis TOML para añadir tu nueva sección `[myapp]` en los archivos de configuración, +//! del mismo modo que `[app]` o `[webserver]` hacen para los ajustes globales ([`Settings`]). +//! +//! Se recomienda inicializar todos los ajustes con valores predefinidos, o utilizar la notación +//! `Option<T>` si van a ser tratados en el código como opcionales. +//! +//! +//! # Cómo usar los nuevos ajustes de configuración //! //! ``` //! fn demo() { -//! println!("{}", &MY_APP.id.name); -//! println!("{}", &MY_APP.size.width); +//! println!("{} - {:?}", &MY_SETTINGS.myapp.name, &MY_SETTINGS.myapp.description); +//! println!("{}", &MY_SETTINGS.myapp.width); //! } //! ``` @@ -150,7 +143,7 @@ pub type PredefinedSettings = HashMap<&'static str, &'static str>; #[macro_export] /// Macro para crear e inicializar un *HashMap* ([`PredefinedSettings`]) con una lista de literales -/// `"clave" => "valor"` para asignar ajustes de configuración predefinidos. +/// `"clave" => "valor"` para asignar los ajustes de configuración predefinidos. /// /// Ver [`cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). macro_rules! predefined_settings { @@ -213,7 +206,20 @@ where } #[derive(Debug, Deserialize)] -/// Sección *\[app\]* de la configuración global. +/// Ajustes globales para las secciones [`[app]`](App), [`[log]`](Log), [`[database]`](Database), +/// [`[webserver]`](Webserver) y [`[dev]`](Dev) reservadas para PageTop ([`SETTINGS`]). +pub struct Settings { + pub app: App, + pub log: Log, + pub database: Database, + pub webserver: Webserver, + pub dev: Dev, +} + +#[derive(Debug, Deserialize)] +/// Sección `[app]` de los ajustes globales. +/// +/// Ver [`Settings`]. pub struct App { /// Valor predefinido: *"PageTop Application"* pub name: String, @@ -232,7 +238,9 @@ pub struct App { } #[derive(Debug, Deserialize)] -/// Sección *\[log\]* de la configuración global. +/// Sección `[log]` de los ajustes globales. +/// +/// Ver [`Settings`]. pub struct Log { /// Valor predefinido: *"Info"* pub tracing: String, @@ -247,7 +255,9 @@ pub struct Log { } #[derive(Debug, Deserialize)] -/// Sección *\[database\]* de la configuración global. +/// Sección `[database]` de los ajustes globales. +/// +/// Ver [`Settings`]. pub struct Database { /// Valor predefinido: *""* pub db_type: String, @@ -266,7 +276,9 @@ pub struct Database { } #[derive(Debug, Deserialize)] -/// Sección *\[webserver\]* de la configuración global. +/// Sección `[webserver]` de los ajustes globales. +/// +/// Ver [`Settings`]. pub struct Webserver { /// Valor predefinido: *"localhost"* pub bind_address: String, @@ -275,26 +287,17 @@ pub struct Webserver { } #[derive(Debug, Deserialize)] -/// Sección *\[dev\]* de la configuración global. +/// Sección `[dev]` de los ajustes globales. +/// +/// Ver [`Settings`]. pub struct Dev { /// Valor predefinido: *""* pub static_files: String, } -#[derive(Debug, Deserialize)] -/// Ajustes globales para las secciones *\[app\]*, *\[log\]*, *\[database\]*, *\[webserver\]* y -/// *\[dev\]* requeridas por PageTop (ver [`SETTINGS`]). -pub struct Settings { - pub app: App, - pub log: Log, - pub database: Database, - pub webserver: Webserver, - pub dev: Dev, -} - -/// Instancia los ajustes globales para la estructura [`Settings`]. +/// Declara los ajustes globales para la estructura [`Settings`]. /// -/// Ver [`Cómo obtener los valores de configuración`](index.html#cómo-obtener-los-valores-de-configuración). +/// Ver [`Cómo usar los ajustes globales de la configuración`](index.html#cómo-usar-los-ajustes-globales-de-la-configuración). pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { init_settings::<Settings>(predefined_settings!( // [app] From 0e3c7dd6c652ba3ded40be2d233f87473248fc9a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 4 Nov 2022 19:26:31 +0100 Subject: [PATCH 211/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Inicializa=20confi?= =?UTF-8?q?guraci=C3=B3n=20global=20en=20m=C3=B3dulo=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 3 + pagetop/src/app/application.rs | 2 +- pagetop/src/app/banner.rs | 2 +- pagetop/src/app/banner/figfont.rs | 4 +- pagetop/src/app/config.rs | 133 +++++++++++++++++++++++ pagetop/src/app/db.rs | 2 +- pagetop/src/app/locale.rs | 2 +- pagetop/src/app/tracing.rs | 2 +- pagetop/src/config.rs | 138 +----------------------- pagetop/src/core/module/definition.rs | 2 - pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/prelude.rs | 16 ++- pagetop/src/response/page/context.rs | 2 +- pagetop/src/response/page/definition.rs | 2 +- pagetop/src/util.rs | 2 +- 15 files changed, 162 insertions(+), 152 deletions(-) create mode 100644 pagetop/src/app/config.rs diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 843a32b5..931a71e9 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -4,6 +4,9 @@ pub use actix_web::{ pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; +mod config; +pub use config::SETTINGS; + mod banner; mod tracing; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index a5c18c4c..5c20228d 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,5 +1,5 @@ use super::fatal_error::FatalError; -use crate::config::SETTINGS; +use super::SETTINGS; use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; diff --git a/pagetop/src/app/banner.rs b/pagetop/src/app/banner.rs index 1e50e54a..43222d2b 100644 --- a/pagetop/src/app/banner.rs +++ b/pagetop/src/app/banner.rs @@ -1,7 +1,7 @@ mod figfont; use figfont::FIGFONT; -use crate::config::SETTINGS; +use super::SETTINGS; use substring::Substring; diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index d92fe35a..31c6c8e2 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -1,4 +1,4 @@ -use crate::config::SETTINGS; +use crate::app::SETTINGS; use crate::LazyStatic; use figlet_rs::FIGfont; @@ -17,7 +17,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { "starwars" => starwars, _ => { println!( - "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check the settings file.", + "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check settings files.", SETTINGS.app.startup_banner, ); slant diff --git a/pagetop/src/app/config.rs b/pagetop/src/app/config.rs new file mode 100644 index 00000000..f7ba57b7 --- /dev/null +++ b/pagetop/src/app/config.rs @@ -0,0 +1,133 @@ +use crate::config; +use crate::predefined_settings; +use crate::LazyStatic; + +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +/// Ajustes globales para las secciones [`[app]`](App), [`[log]`](Log), [`[database]`](Database), +/// [`[webserver]`](Webserver) y [`[dev]`](Dev) reservadas para PageTop ([`SETTINGS`]). +pub struct Settings { + pub app: App, + pub log: Log, + pub database: Database, + pub webserver: Webserver, + pub dev: Dev, +} + +#[derive(Debug, Deserialize)] +/// Sección `[app]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct App { + /// Valor predefinido: *"PageTop Application"* + pub name: String, + /// Valor predefinido: *"Developed with the amazing PageTop framework."* + pub description: String, + /// Valor predefinido: *"Bootsier"* + pub theme: String, + /// Valor predefinido: *"en-US"* + pub language: String, + /// Valor predefinido: *"ltr"* + pub direction: String, + /// Valor predefinido: *"Slant"* + pub startup_banner: String, + /// Valor predefinido: según variable de entorno PAGETOP_RUN_MODE, o *"default"* si no lo está + pub run_mode: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[log]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Log { + /// Valor predefinido: *"Info"* + pub tracing: String, + /// Valor predefinido: *"Stdout"* + pub rolling: String, + /// Valor predefinido: *"log"* + pub path: String, + /// Valor predefinido: *"tracing.log"* + pub prefix: String, + /// Valor predefinido: *"Full"* + pub format: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[database]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Database { + /// Valor predefinido: *""* + pub db_type: String, + /// Valor predefinido: *""* + pub db_name: String, + /// Valor predefinido: *""* + pub db_user: String, + /// Valor predefinido: *""* + pub db_pass: String, + /// Valor predefinido: *"localhost"* + pub db_host: String, + /// Valor predefinido: *"0"* + pub db_port: u16, + /// Valor predefinido: *"5"* + pub max_pool_size: u32, +} + +#[derive(Debug, Deserialize)] +/// Sección `[webserver]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Webserver { + /// Valor predefinido: *"localhost"* + pub bind_address: String, + /// Valor predefinido: *"8088"* + pub bind_port: u16, +} + +#[derive(Debug, Deserialize)] +/// Sección `[dev]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Dev { + /// Valor predefinido: *""* + pub static_files: String, +} + +/// Declara los ajustes globales para la estructura [`Settings`]. +/// +/// Ver [`Cómo usar los ajustes globales de la configuración`](index.html#cómo-usar-los-ajustes-globales-de-la-configuración). +pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { + config::try_into::<Settings>(predefined_settings!( + // [app] + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Bootsier", + "app.language" => "en-US", + "app.direction" => "ltr", + "app.startup_banner" => "Slant", + + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", + + // [database] + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", + "database.db_host" => "localhost", + "database.db_port" => "0", + "database.max_pool_size" => "5", + + // [webserver] + "webserver.bind_address" => "localhost", + "webserver.bind_port" => "8088", + + // [dev] + "dev.static_files" => "" + )) +}); diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 98f96e47..1073e609 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,4 +1,4 @@ -use crate::config::SETTINGS; +use super::SETTINGS; use crate::db::*; use crate::{run_now, trace, LazyStatic}; diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index 9775867f..8517f86b 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -1,4 +1,4 @@ -use crate::config::SETTINGS; +use super::SETTINGS; use crate::{trace, LazyStatic}; use unic_langid::LanguageIdentifier; diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index bc6bf515..264623ef 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -1,4 +1,4 @@ -use crate::config::SETTINGS; +use super::SETTINGS; use crate::LazyStatic; use tracing_appender::non_blocking::WorkerGuard; diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 8b3fe1d1..e75ee7d7 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -69,13 +69,12 @@ //! ``` //! //! Incluye en tu código una asignación similar a la que usa [`SETTINGS`] para declarar -//! ([`LazyStatic`]) e inicializar tus nuevos ajustes ([`init_settings()`]) con tipos seguros y +//! ([`LazyStatic`]) e inicializar tus nuevos ajustes ([`try_into()`]) con tipos seguros y //! valores predefinidos ([`predefined_settings!`](crate::predefined_settings)): //! //! ``` //! use pagetop::prelude::*; //! use serde::Deserialize; -//! use std::fmt::Debug; //! //! #[derive(Debug, Deserialize)] //! pub struct MySettings { @@ -91,7 +90,7 @@ //! } //! //! pub static MY_SETTINGS: LazyStatic<MySettings> = LazyStatic::new(|| { -//! init_settings::<MySettings>(predefined_settings!( +//! config::try_into::<MySettings>(predefined_settings!( //! // [myapp] //! "myapp.name" => "Value Name", //! "myapp.width" => "900", @@ -131,7 +130,6 @@ use crate::config::file::File; use std::collections::HashMap; use std::env; -use std::fmt::Debug; use serde::Deserialize; @@ -149,7 +147,7 @@ pub type PredefinedSettings = HashMap<&'static str, &'static str>; macro_rules! predefined_settings { ( $($key:literal => $value:literal),* ) => {{ #[allow(unused_mut)] - let mut a = PredefinedSettings::new(); + let mut a = $crate::config::PredefinedSettings::new(); $( a.insert($key, $value); )* @@ -191,7 +189,7 @@ static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { /// estructura similiar a [`SETTINGS`]. /// /// Ver [`Cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). -pub fn init_settings<T>(values: PredefinedSettings) -> T +pub fn try_into<T>(values: PredefinedSettings) -> T where T: Deserialize<'static>, { @@ -204,131 +202,3 @@ where Err(e) => panic!("Error parsing settings: {}", e), } } - -#[derive(Debug, Deserialize)] -/// Ajustes globales para las secciones [`[app]`](App), [`[log]`](Log), [`[database]`](Database), -/// [`[webserver]`](Webserver) y [`[dev]`](Dev) reservadas para PageTop ([`SETTINGS`]). -pub struct Settings { - pub app: App, - pub log: Log, - pub database: Database, - pub webserver: Webserver, - pub dev: Dev, -} - -#[derive(Debug, Deserialize)] -/// Sección `[app]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct App { - /// Valor predefinido: *"PageTop Application"* - pub name: String, - /// Valor predefinido: *"Developed with the amazing PageTop framework."* - pub description: String, - /// Valor predefinido: *"Bootsier"* - pub theme: String, - /// Valor predefinido: *"en-US"* - pub language: String, - /// Valor predefinido: *"ltr"* - pub direction: String, - /// Valor predefinido: *"Slant"* - pub startup_banner: String, - /// Valor predefinido: según variable de entorno PAGETOP_RUN_MODE, o *"default"* si no lo está - pub run_mode: String, -} - -#[derive(Debug, Deserialize)] -/// Sección `[log]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Log { - /// Valor predefinido: *"Info"* - pub tracing: String, - /// Valor predefinido: *"Stdout"* - pub rolling: String, - /// Valor predefinido: *"log"* - pub path: String, - /// Valor predefinido: *"tracing.log"* - pub prefix: String, - /// Valor predefinido: *"Full"* - pub format: String, -} - -#[derive(Debug, Deserialize)] -/// Sección `[database]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Database { - /// Valor predefinido: *""* - pub db_type: String, - /// Valor predefinido: *""* - pub db_name: String, - /// Valor predefinido: *""* - pub db_user: String, - /// Valor predefinido: *""* - pub db_pass: String, - /// Valor predefinido: *"localhost"* - pub db_host: String, - /// Valor predefinido: *"0"* - pub db_port: u16, - /// Valor predefinido: *"5"* - pub max_pool_size: u32, -} - -#[derive(Debug, Deserialize)] -/// Sección `[webserver]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Webserver { - /// Valor predefinido: *"localhost"* - pub bind_address: String, - /// Valor predefinido: *"8088"* - pub bind_port: u16, -} - -#[derive(Debug, Deserialize)] -/// Sección `[dev]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Dev { - /// Valor predefinido: *""* - pub static_files: String, -} - -/// Declara los ajustes globales para la estructura [`Settings`]. -/// -/// Ver [`Cómo usar los ajustes globales de la configuración`](index.html#cómo-usar-los-ajustes-globales-de-la-configuración). -pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { - init_settings::<Settings>(predefined_settings!( - // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Bootsier", - "app.language" => "en-US", - "app.direction" => "ltr", - "app.startup_banner" => "Slant", - - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", - - // [database] - "database.db_type" => "", - "database.db_name" => "", - "database.db_user" => "", - "database.db_pass" => "", - "database.db_host" => "localhost", - "database.db_port" => "0", - "database.max_pool_size" => "5", - - // [webserver] - "webserver.bind_address" => "localhost", - "webserver.bind_port" => "8088", - - // [dev] - "dev.static_files" => "" - )) -}); diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 16d9d712..b15d1f26 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,6 +1,4 @@ use crate::app; -//use crate::predefined_settings; -//use crate::settings::PredefinedSettings; use crate::core::hook::HookAction; use crate::core::theme::ThemeStaticRef; use crate::util::{single_type_name, Handler}; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index ee3abcbf..6e6301e6 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,7 @@ use crate::app; +use crate::app::SETTINGS; use crate::base::component::{Container, Html}; use crate::concat_string; -use crate::config::SETTINGS; use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index a8e21580..241f1e82 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,11 +1,16 @@ -// Global macros and helpers. +// Re-exports. +pub use crate::{concat_string, LazyStatic}; + +// Macros. +pub use crate::{args, configure_service_for_static_files, predefined_settings, pub_const_handler}; + +// Helpers. pub use crate::util; pub use crate::util::{Handler, HashMapResources}; -pub use crate::{ - args, concat_string, configure_service_for_static_files, pub_const_handler, LazyStatic, -}; -pub use crate::config::SETTINGS; +// ************************************************************************************************* + +pub use crate::config; pub use crate::trace; @@ -20,6 +25,7 @@ pub use crate::app; pub use crate::app::application::Application; pub use crate::app::fatal_error::FatalError; pub use crate::app::HttpMessage; +pub use crate::app::SETTINGS; pub use crate::core::{component::*, hook::*, module::*, theme::*}; diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index 055fa781..cc7d5f36 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -1,5 +1,5 @@ use super::PageOp; -use crate::config::SETTINGS; +use crate::app::SETTINGS; use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; use crate::{base, concat_string, util, LazyStatic}; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 3617b40d..118dbfed 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,6 +1,6 @@ use super::{BeforeRenderPageHook, PageContext, PageOp, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::app::fatal_error::FatalError; -use crate::config::SETTINGS; +use crate::app::SETTINGS; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 68d20d3e..5caa741b 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -169,7 +169,7 @@ macro_rules! args { #[macro_export] macro_rules! configure_service_for_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ - let static_files = &$crate::config::SETTINGS.dev.static_files; + let static_files = &$crate::app::SETTINGS.dev.static_files; if static_files.is_empty() { $cfg.service($crate::app::ResourceFiles::new($dir, $embed())); } else { From 62153ca39a01303c2658bcda013f5fe1aa215bcb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 4 Nov 2022 20:47:20 +0100 Subject: [PATCH 212/853] =?UTF-8?q?=F0=9F=93=9D=20Elimina=20warnings=20de?= =?UTF-8?q?=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/locale.rs | 6 +++--- pagetop/src/app/tracing.rs | 2 +- pagetop/src/locale.rs | 11 +++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index 8517f86b..06172362 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -3,9 +3,9 @@ use crate::{trace, LazyStatic}; use unic_langid::LanguageIdentifier; -/// Almacena el Identificador de Idioma Unicode ([Unicode Language Identifier] -/// (https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) de -/// la aplicación, obtenido de `SETTINGS.app.language`. +/// Almacena el Identificador de Idioma Unicode +/// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) +/// de la aplicación, obtenido de `SETTINGS.app.language`. pub static LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| match SETTINGS.app.language.parse() { Ok(language) => language, diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index 264623ef..86f1f682 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -9,7 +9,7 @@ use tracing_subscriber::EnvFilter; /// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de /// escritura sin bloqueo (*non-blocking writer*) que actúa periódicamente en /// vez de enviar cada traza o evento al instante. Si el programa termina -/// abruptamente (por ejemplo, por un `panic!` o un `std::process::exit`), es +/// abruptamente (por ejemplo, por un panic! o un std::process::exit), es /// posible que algunas trazas o eventos no se envíen. /// /// Puesto que las trazas o eventos registrados poco antes de la caída de una diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 2f9f3ef2..664ad870 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -68,13 +68,12 @@ //! //! # Cómo aplicar la localización en tu código //! -//! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la -//! poderosa macro [`localize!`] para integrar fácilmente tus recursos de -//! localización. +//! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la poderosa macro +//! [`localize!`](crate::localize) para integrar fácilmente tus recursos de localización. //! -//! Esta macro crea dos funciones para el ámbito donde se ejecuta. Por un lado -//! la función `l()` para traducciones directas de etiquetas. Y por otro la -//! función `t()` para traducciones que requieren argumentos: +//! Esta macro crea dos funciones para el ámbito donde se ejecuta. Por un lado la función `l()` para +//! traducciones directas de etiquetas. Y por otro la función `t()` para traducciones que requieren +//! argumentos: //! //! ``` //! use pagetop::{args, localize}; From b728a74ee4b1504f7fcaedd76bcfce71fe3bf4b1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 4 Nov 2022 20:47:37 +0100 Subject: [PATCH 213/853] =?UTF-8?q?=F0=9F=93=9D=20[config]=20Ajustes=20fin?= =?UTF-8?q?ales=20de=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/config/settings.predefined.toml | 36 ++++----- pagetop/src/app.rs | 2 +- pagetop/src/app/application.rs | 5 +- pagetop/src/app/config.rs | 102 +++++++++++++----------- pagetop/src/config.rs | 46 ++++------- 5 files changed, 93 insertions(+), 98 deletions(-) diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index 115b4cb7..19db0a27 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -10,19 +10,6 @@ direction = "ltr" # Rótulo al inicio: "Off", "Slant", "Small", "Speed" o "Starwars". startup_banner = "Slant" -[log] -# Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". -# Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". -tracing = "Info" -# En terminal ("Stdout") o archivos "Daily", "Hourly", "Minutely" o "Endless". -rolling = "Stdout" -# Directorio para los archivos de traza (si rolling != "Stdout"). -path = "log" -# Prefijo para los archivos de traza (si rolling != "Stdout"). -prefix = "tracing.log" -# Presentación de las trazas: "Full", "Compact", "Pretty" o "Json". -format = "Full" - [database] # Conecta con una base de datos (opcional). # Tipo de base de datos (mysql, postgres ó sqlite). @@ -39,11 +26,6 @@ db_port = 0 # Número máximo de conexiones habilitadas. max_pool_size = 5 -[webserver] -# Configuración del servidor web. -bind_address = "localhost" -bind_port = 8088 - [dev] # Los archivos estáticos requeridos por temas y componentes incluidos en PageTop # se integran de manera predeterminada en el binario ejecutable. Sin embargo, es @@ -51,3 +33,21 @@ bind_port = 8088 # que no requiere compilar cada vez que se modifican. En este caso, normalmente, # basta con indicar el directorio "pagetop/static". static_files = "" + +[log] +# Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". +# Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". +tracing = "Info" +# En terminal ("Stdout") o archivos "Daily", "Hourly", "Minutely" o "Endless". +rolling = "Stdout" +# Directorio para los archivos de traza (si rolling != "Stdout"). +path = "log" +# Prefijo para los archivos de traza (si rolling != "Stdout"). +prefix = "tracing.log" +# Presentación de las trazas: "Full", "Compact", "Pretty" o "Json". +format = "Full" + +[server] +# Configuración del servidor web. +bind_address = "localhost" +bind_port = 8088 diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 931a71e9..cb5a3f79 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -4,7 +4,7 @@ pub use actix_web::{ pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; -mod config; +pub mod config; pub use config::SETTINGS; mod banner; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 5c20228d..a889822e 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -53,10 +53,7 @@ impl Application { .configure(&theme::all::configure_services) .default_service(super::web::route().to(service_not_found)) }) - .bind(format!( - "{}:{}", - &SETTINGS.webserver.bind_address, &SETTINGS.webserver.bind_port - ))? + .bind(format!("{}:{}", &SETTINGS.server.bind_address, &SETTINGS.server.bind_port))? .run(); Ok(Self { server }) diff --git a/pagetop/src/app/config.rs b/pagetop/src/app/config.rs index f7ba57b7..37c50815 100644 --- a/pagetop/src/app/config.rs +++ b/pagetop/src/app/config.rs @@ -1,3 +1,5 @@ +//! Ajustes globales de la configuración. + use crate::config; use crate::predefined_settings; use crate::LazyStatic; @@ -5,14 +7,14 @@ use crate::LazyStatic; use serde::Deserialize; #[derive(Debug, Deserialize)] -/// Ajustes globales para las secciones [`[app]`](App), [`[log]`](Log), [`[database]`](Database), -/// [`[webserver]`](Webserver) y [`[dev]`](Dev) reservadas para PageTop ([`SETTINGS`]). +/// Ajustes globales para las secciones reservadas [`[app]`](App), [`[database]`](Database), +/// [`[dev]`](Dev), [`[log]`](Log) y [`[server]`](Server) (ver [`SETTINGS`]). pub struct Settings { pub app: App, - pub log: Log, pub database: Database, - pub webserver: Webserver, pub dev: Dev, + pub log: Log, + pub server: Server, } #[derive(Debug, Deserialize)] @@ -36,23 +38,6 @@ pub struct App { pub run_mode: String, } -#[derive(Debug, Deserialize)] -/// Sección `[log]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Log { - /// Valor predefinido: *"Info"* - pub tracing: String, - /// Valor predefinido: *"Stdout"* - pub rolling: String, - /// Valor predefinido: *"log"* - pub path: String, - /// Valor predefinido: *"tracing.log"* - pub prefix: String, - /// Valor predefinido: *"Full"* - pub format: String, -} - #[derive(Debug, Deserialize)] /// Sección `[database]` de los ajustes globales. /// @@ -74,17 +59,6 @@ pub struct Database { pub max_pool_size: u32, } -#[derive(Debug, Deserialize)] -/// Sección `[webserver]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Webserver { - /// Valor predefinido: *"localhost"* - pub bind_address: String, - /// Valor predefinido: *"8088"* - pub bind_port: u16, -} - #[derive(Debug, Deserialize)] /// Sección `[dev]` de los ajustes globales. /// @@ -94,9 +68,45 @@ pub struct Dev { pub static_files: String, } -/// Declara los ajustes globales para la estructura [`Settings`]. +#[derive(Debug, Deserialize)] +/// Sección `[log]` de los ajustes globales. /// -/// Ver [`Cómo usar los ajustes globales de la configuración`](index.html#cómo-usar-los-ajustes-globales-de-la-configuración). +/// Ver [`Settings`]. +pub struct Log { + /// Valor predefinido: *"Info"* + pub tracing: String, + /// Valor predefinido: *"Stdout"* + pub rolling: String, + /// Valor predefinido: *"log"* + pub path: String, + /// Valor predefinido: *"tracing.log"* + pub prefix: String, + /// Valor predefinido: *"Full"* + pub format: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[server]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Server { + /// Valor predefinido: *"localhost"* + pub bind_address: String, + /// Valor predefinido: *"8088"* + pub bind_port: u16, +} + +/// Declara e inicializa los ajustes globales para la estructura [`Settings`]. +/// +/// ``` +/// use pagetop::prelude::*; +/// +/// fn demo() { +/// println!("App name: {}", &SETTINGS.app.name); +/// println!("App description: {}", &SETTINGS.app.description); +/// println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); +/// } +/// ``` pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { config::try_into::<Settings>(predefined_settings!( // [app] @@ -107,13 +117,6 @@ pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { "app.direction" => "ltr", "app.startup_banner" => "Slant", - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", - // [database] "database.db_type" => "", "database.db_name" => "", @@ -123,11 +126,18 @@ pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { "database.db_port" => "0", "database.max_pool_size" => "5", - // [webserver] - "webserver.bind_address" => "localhost", - "webserver.bind_port" => "8088", - // [dev] - "dev.static_files" => "" + "dev.static_files" => "", + + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", + + // [server] + "server.bind_address" => "localhost", + "server.bind_port" => "8088" )) }); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index e75ee7d7..1f077384 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -39,25 +39,6 @@ //! 3. **config/local.toml**, para añadir o sobrescribir ajustes de los archivos anteriores. //! //! -//! # Cómo usar los ajustes globales de la configuración -//! -//! PageTop incluye un conjunto de ajustes propios ([`Settings`]) accesibles vía [`SETTINGS`] para -//! las secciones reservadas [`[app]`](App), [`[log]`](Log), [`[database]`](Database), -//! [`[webserver]`](Webserver) y [`[dev]`](Dev) de la configuración: -//! -//! ``` -//! use pagetop::prelude::*; -//! -//! fn demo() { -//! println!("App name: {}", &SETTINGS.app.name); -//! println!("App description: {}", &SETTINGS.app.description); -//! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); -//! } -//! ``` -//! -//! Los ajustes de configuración siempre son de sólo lectura. -//! -//! //! # Cómo añadir ajustes de configuración //! //! Para proporcionar a tu **aplicación** o **módulo** sus propios ajustes de configuración, añade @@ -68,9 +49,9 @@ //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Incluye en tu código una asignación similar a la que usa [`SETTINGS`] para declarar -//! ([`LazyStatic`]) e inicializar tus nuevos ajustes ([`try_into()`]) con tipos seguros y -//! valores predefinidos ([`predefined_settings!`](crate::predefined_settings)): +//! Declara ([`LazyStatic`]) e inicializa tus nuevos ajustes con tipos seguros +//! ([`config::try_into<S>()`](try_into)) y valores predefinidos +//! ([`predefined_settings!`](crate::predefined_settings)): //! //! ``` //! use pagetop::prelude::*; @@ -99,14 +80,20 @@ //! }); //! ``` //! -//! Y usa la sintaxis TOML para añadir tu nueva sección `[myapp]` en los archivos de configuración, -//! del mismo modo que `[app]` o `[webserver]` hacen para los ajustes globales ([`Settings`]). +//! De hecho, así se declaran e inicializan los ajustes globales de la configuración +//! ([`SETTINGS`](crate::app::config::SETTINGS)). +//! +//! Usa la sintaxis TOML para añadir tu nueva sección `[myapp]` en los archivos de configuración, +//! del mismo modo que `[log]` o `[server]` hacen para los ajustes globales +//! ([`Settings`](crate::app::config::Settings)). //! //! Se recomienda inicializar todos los ajustes con valores predefinidos, o utilizar la notación //! `Option<T>` si van a ser tratados en el código como opcionales. //! +//! Los ajustes de configuración siempre son de sólo lectura. //! -//! # Cómo usar los nuevos ajustes de configuración +//! +//! # Cómo usar tus nuevos ajustes de configuración //! //! ``` //! fn demo() { @@ -185,13 +172,14 @@ static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { settings }); -/// Carga ajustes con tipos seguros y valores predefinidos para tu aplicación o módulo en una -/// estructura similiar a [`SETTINGS`]. +/// Carga ajustes con tipos seguros y valores predefinidos para tu aplicación o módulo. +/// +/// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// /// Ver [`Cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). -pub fn try_into<T>(values: PredefinedSettings) -> T +pub fn try_into<S>(values: PredefinedSettings) -> S where - T: Deserialize<'static>, + S: Deserialize<'static>, { let mut settings = CONFIG_DATA.clone(); for (key, value) in values.iter() { From a43206bb0f1a7868f87a03b260587b776b1a2da7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 4 Nov 2022 21:01:25 +0100 Subject: [PATCH 214/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Actualiza=20depend?= =?UTF-8?q?iencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 2024c8df..d6307e50 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -27,7 +27,7 @@ concat-string = "1.0.1" figlet-rs = "0.1.4" futures = "0.3.25" nom = "7.1.1" -once_cell = "1.15.0" +once_cell = "1.16.0" paste = "1.0.9" substring = "1.4.5" term_size = "0.3.2" @@ -37,8 +37,8 @@ url = "2.3.1" tracing = "0.1.37" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } -tracing-unwrap = { version = "0.9.2", default-features = false } -tracing-actix-web = "0.6.1" +tracing-unwrap = { version = "0.10.0", default-features = false } +tracing-actix-web = "0.6.2" fluent-templates = "0.8.0" unic-langid = "0.9.1" @@ -53,12 +53,12 @@ maud = { version = "0.24.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.9.3" +version = "0.10.1" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.9.4" +version = "0.10.2" optional = true [features] From 9a8182508cda213fa4089a65f622b48483f6c625 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 4 Nov 2022 21:42:43 +0100 Subject: [PATCH 215/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Revisa=20c=C3=B3di?= =?UTF-8?q?go=20con=20cargo=20fmt=20y=20cargo=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 9 ++++++--- pagetop/src/base/component/block.rs | 5 ++--- .../src/base/component/form_element/button.rs | 5 +---- .../src/base/component/form_element/date.rs | 19 ++++++++----------- .../src/base/component/form_element/input.rs | 19 ++++++++----------- pagetop/src/config.rs | 2 +- pagetop/src/config/de.rs | 2 +- pagetop/src/config/error.rs | 4 ++-- pagetop/src/config/path.rs | 6 +++--- pagetop/src/config/value.rs | 4 ++++ pagetop/src/core/theme/definition.rs | 6 ++---- pagetop/src/db/migration/migrator.rs | 2 +- pagetop/src/db/migration/seaql_migrations.rs | 2 +- pagetop/src/html/assets/javascript.rs | 2 +- 14 files changed, 41 insertions(+), 46 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index a889822e..293b1e0d 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -49,11 +49,14 @@ impl Application { let server = super::HttpServer::new(move || { super::App::new() .wrap(tracing_actix_web::TracingLogger::default()) - .configure(&module::all::configure_services) - .configure(&theme::all::configure_services) + .configure(module::all::configure_services) + .configure(theme::all::configure_services) .default_service(super::web::route().to(service_not_found)) }) - .bind(format!("{}:{}", &SETTINGS.server.bind_address, &SETTINGS.server.bind_port))? + .bind(format!( + "{}:{}", + &SETTINGS.server.bind_address, &SETTINGS.server.bind_port + ))? .run(); Ok(Self { server }) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 818b80c8..c1b8a39f 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -41,9 +41,8 @@ impl ComponentTrait for Block { let id = context.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes().get()] { - @match self.title().get() { - Some(title) => h2 class="block-title" { (title) }, - None => {} + @if let Some(title) = self.title().get() { + h2 class="block-title" { (title) } } div class="block-body" { (self.components().render(context)) diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index 14382227..d99305f9 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -60,10 +60,7 @@ impl ComponentTrait for Button { autofocus=[self.autofocus().get()] disabled=[self.disabled().get()] { - @match self.value().get() { - Some(value) => { (value) }, - None => {}, - } + @if let Some(value) = self.value().get() { (value) } } } } diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 35b8f5d8..0b6fb935 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -44,17 +44,15 @@ impl ComponentTrait for Date { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { - @match self.label().get() { - Some(label) => label class="form-label" for=[&id] { + @if let Some(label) = self.label().get() { + label class="form-label" for=[&id] { (label) " " - @match self.required().get() { - Some(_) => span + @if self.required().get().is_some() { + span class="form-required" - title="Este campo es obligatorio." { "*" } " ", - None => {} + title="Este campo es obligatorio." { "*" } " "; } - }, - None => {} + } } input type="date" @@ -68,9 +66,8 @@ impl ComponentTrait for Date { readonly=[self.readonly().get()] required=[self.required().get()] disabled=[self.disabled().get()]; - @match self.help_text().get() { - Some(help_text) => div class="form-text" { (help_text) }, - None => {} + @if let Some(help_text) = self.help_text().get() { + div class="form-text" { (help_text) } } } } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 51533327..5418e0ed 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -70,17 +70,15 @@ impl ComponentTrait for Input { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { - @match self.label().get() { - Some(label) => label class="form-label" for=[&id] { + @if let Some(label) = self.label().get() { + label class="form-label" for=[&id] { (label) " " - @match self.required().get() { - Some(_) => span + @if self.required().get().is_some() { + span class="form-required" - title="Este campo es obligatorio." { "*" } " ", - None => {} + title="Este campo es obligatorio." { "*" } " "; } - }, - None => {} + } } input type=(type_input) @@ -97,9 +95,8 @@ impl ComponentTrait for Input { readonly=[self.readonly().get()] required=[self.required().get()] disabled=[self.disabled().get()]; - @match self.help_text().get() { - Some(help_text) => div class="form-text" { (help_text) }, - None => {} + @if let Some(help_text) = self.help_text().get() { + div class="form-text" { (help_text) } } } } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 1f077384..dfb7df49 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -183,7 +183,7 @@ where { let mut settings = CONFIG_DATA.clone(); for (key, value) in values.iter() { - settings.set_default(*key, *value).unwrap(); + settings.set_default(key, *value).unwrap(); } match settings.try_into() { Ok(c) => c, diff --git a/pagetop/src/config/de.rs b/pagetop/src/config/de.rs index 1eb2ac6e..79836863 100644 --- a/pagetop/src/config/de.rs +++ b/pagetop/src/config/de.rs @@ -282,7 +282,7 @@ impl<'de> de::EnumAccess<'de> for EnumAccess { let value = { let deserializer = match self.value.kind { ValueKind::String(ref s) => self.variant_deserializer(s), - ValueKind::Table(ref t) => self.table_deserializer(&t), + ValueKind::Table(ref t) => self.table_deserializer(t), _ => Err(self.structural_error()), }?; seed.deserialize(deserializer)? diff --git a/pagetop/src/config/error.rs b/pagetop/src/config/error.rs index 815d71c8..be3649c0 100644 --- a/pagetop/src/config/error.rs +++ b/pagetop/src/config/error.rs @@ -116,8 +116,8 @@ impl ConfigError { fn prepend(self, segment: String, add_dot: bool) -> Self { let concat = |key: Option<String>| { - let key = key.unwrap_or_else(String::new); - let dot = if add_dot && key.as_bytes().get(0).unwrap_or(&b'[') != &b'[' { + let key = key.unwrap_or_default(); + let dot = if add_dot && key.as_bytes().first().unwrap_or(&b'[') != &b'[' { "." } else { "" diff --git a/pagetop/src/config/path.rs b/pagetop/src/config/path.rs index e99c6d68..32599ee7 100644 --- a/pagetop/src/config/path.rs +++ b/pagetop/src/config/path.rs @@ -25,7 +25,7 @@ fn sindex_to_uindex(index: isize, len: usize) -> usize { if index >= 0 { index as usize } else { - len - (index.abs() as usize) + len - (index.unsigned_abs()) } } @@ -107,7 +107,7 @@ impl Expression { match value.kind { ValueKind::Table(ref incoming_map) => { // Pull out another table. - let mut target = if let ValueKind::Table(ref mut map) = root.kind { + let target = if let ValueKind::Table(ref mut map) = root.kind { map.entry(id.clone()) .or_insert_with(|| HashMap::<String, Value>::new().into()) } else { @@ -116,7 +116,7 @@ impl Expression { // Continue the deep merge. for (key, val) in incoming_map { - Expression::Identifier(key.clone()).set(&mut target, val.clone()); + Expression::Identifier(key.clone()).set(target, val.clone()); } } diff --git a/pagetop/src/config/value.rs b/pagetop/src/config/value.rs index 1e1e6e67..42929ffa 100644 --- a/pagetop/src/config/value.rs +++ b/pagetop/src/config/value.rs @@ -221,7 +221,9 @@ impl Value { } } + #[allow(clippy::bool_to_int_with_if)] ValueKind::Boolean(value) => Ok(if value { 1 } else { 0 }), + ValueKind::Float(value) => Ok(value.round() as i64), // Unexpected type @@ -230,11 +232,13 @@ impl Value { Unexpected::Unit, "an integer", )), + ValueKind::Table(_) => Err(ConfigError::invalid_type( self.origin, Unexpected::Map, "an integer", )), + ValueKind::Array(_) => Err(ConfigError::invalid_type( self.origin, Unexpected::Seq, diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 6e6301e6..f33be422 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -48,11 +48,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { None => title { (SETTINGS.app.name) } } - @match page.description().get() { - Some(d) => meta name="description" content=(d);, - None => {} + @if let Some(d) = page.description().get() { + meta name="description" content=(d); } - meta http-equiv="X-UA-Compatible" content="IE=edge"; meta name="viewport" content=(viewport); diff --git a/pagetop/src/db/migration/migrator.rs b/pagetop/src/db/migration/migrator.rs index ef881cae..5efdcd09 100644 --- a/pagetop/src/db/migration/migrator.rs +++ b/pagetop/src/db/migration/migrator.rs @@ -12,7 +12,7 @@ use sea_schema::{mysql::MySql, postgres::Postgres, probe::SchemaProbe, sqlite::S use super::{seaql_migrations, MigrationTrait, SchemaManager}; -#[derive(Debug, PartialEq)] +#[derive(Debug, Eq, PartialEq)] /// Status of migration pub enum MigrationStatus { /// Not yet applied diff --git a/pagetop/src/db/migration/seaql_migrations.rs b/pagetop/src/db/migration/seaql_migrations.rs index 43f044ec..cc06c44d 100644 --- a/pagetop/src/db/migration/seaql_migrations.rs +++ b/pagetop/src/db/migration/seaql_migrations.rs @@ -1,6 +1,6 @@ use sea_orm::entity::prelude::*; -#[derive(Clone, Debug, PartialEq, DeriveEntityModel)] +#[derive(Clone, Debug, Eq, PartialEq, DeriveEntityModel)] #[sea_orm(table_name = "seaql_migrations")] pub struct Model { #[sea_orm(primary_key, auto_increment = false)] diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 04a80c94..9a9393ce 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,7 +1,7 @@ use super::AssetsTrait; use crate::html::{html, Markup}; -#[derive(Default, PartialEq)] +#[derive(Default, Eq, PartialEq)] pub enum ModeJS { Async, #[default] From 4241b2179f0380303c215e11cff89ba9f71212b2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 4 Nov 2022 21:47:41 +0100 Subject: [PATCH 216/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.30?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index d6307e50..dca3a63b 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.29" +version = "0.0.30" edition = "2021" authors = [ From db45044eb98998cc3205356d2e8e45d2b6354494 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 6 Nov 2022 14:41:53 +0100 Subject: [PATCH 217/853] =?UTF-8?q?=F0=9F=8D=B1=20[homepage]=20Nombres=20m?= =?UTF-8?q?=C3=A1s=20apropiados=20para=20im=C3=A1genes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/static/theme/images/demo-pagetop.svg | 1 - .../{demo-about.svg => homepage-about.svg} | 0 .../{demo-header.svg => homepage-header.svg} | 0 .../static/theme/images/homepage-pagetop.png | Bin 0 -> 73977 bytes .../static/theme/images/homepage-support.jpg | Bin 0 -> 83250 bytes .../{demo-welcome.jpg => homepage-welcome.jpg} | Bin 6 files changed, 1 deletion(-) delete mode 100644 pagetop/static/theme/images/demo-pagetop.svg rename pagetop/static/theme/images/{demo-about.svg => homepage-about.svg} (100%) rename pagetop/static/theme/images/{demo-header.svg => homepage-header.svg} (100%) create mode 100644 pagetop/static/theme/images/homepage-pagetop.png create mode 100644 pagetop/static/theme/images/homepage-support.jpg rename pagetop/static/theme/images/{demo-welcome.jpg => homepage-welcome.jpg} (100%) diff --git a/pagetop/static/theme/images/demo-pagetop.svg b/pagetop/static/theme/images/demo-pagetop.svg deleted file mode 100644 index 08fbbb09..00000000 --- a/pagetop/static/theme/images/demo-pagetop.svg +++ /dev/null @@ -1 +0,0 @@ -<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 658.099 325.932"><defs><style>.cls-1{fill:none;}.cls-1,.cls-2,.cls-3{stroke:#394599;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.785px;}.cls-2{fill:#fff;}.cls-3{fill:#d3d5f9;}</style></defs><title>details-2</title><line class="cls-1" x1="94.914" y1="299.503" x2="613.96" y2="300.329"/><line class="cls-1" x1="46.984" y1="299.426" x2="73.565" y2="299.469"/><rect class="cls-1" x="308.149" y="170.126" width="139.98" height="128.937" transform="translate(1.267 0.291) rotate(0.091)"/><rect class="cls-2" x="190.277" y="158.431" width="87.839" height="165.138" transform="translate(1.277 0.52) rotate(0.091)"/><rect class="cls-3" x="278.116" y="158.516" width="19.029" height="165.138" transform="translate(1.277 0.435) rotate(0.091)"/><rect class="cls-3" x="208.401" y="174.282" width="19.52" height="21.641" transform="translate(1.188 0.545) rotate(0.091)"/><rect class="cls-3" x="240.651" y="174.333" width="19.52" height="21.641" transform="translate(1.188 0.494) rotate(0.091)"/><rect class="cls-3" x="208.344" y="209.502" width="19.52" height="21.641" transform="translate(1.244 0.546) rotate(0.091)"/><rect class="cls-3" x="240.595" y="209.554" width="19.52" height="21.641" transform="translate(1.244 0.494) rotate(0.091)"/><rect class="cls-2" x="509.427" y="213.189" width="65.247" height="110.871" transform="translate(1.321 0.03) rotate(0.091)"/><rect class="cls-3" x="574.673" y="213.258" width="22.222" height="110.871" transform="translate(1.321 -0.04) rotate(0.091)"/><rect class="cls-3" x="522.877" y="226.25" width="14.499" height="16.075" transform="translate(1.266 0.049) rotate(0.091)"/><rect class="cls-3" x="546.833" y="226.288" width="14.499" height="16.075" transform="translate(1.267 0.01) rotate(0.091)"/><rect class="cls-3" x="522.836" y="252.412" width="14.499" height="16.075" transform="translate(1.308 0.049) rotate(0.091)"/><rect class="cls-3" x="546.791" y="252.45" width="14.499" height="16.075" transform="translate(1.308 0.011) rotate(0.091)"/><polygon class="cls-3" points="387.247 0.926 366.423 0.893 366.395 18.212 376.569 18.229 350.467 60.524 387.152 60.583 423.836 60.641 387.247 0.926"/><rect class="cls-2" x="323.029" y="83.472" width="84.434" height="240.306" transform="translate(1.217 0.311) rotate(0.091)"/><rect class="cls-3" x="407.463" y="83.552" width="16.959" height="240.306" transform="translate(1.218 0.23) rotate(0.091)"/><rect class="cls-3" x="387.427" y="59.705" width="16.959" height="23.815" transform="translate(1.007 0.262) rotate(0.091)"/><line class="cls-1" x1="344.005" y1="306.325" x2="344.238" y2="110.068"/><line class="cls-1" x1="366.016" y1="306.36" x2="366.249" y2="110.104"/><line class="cls-1" x1="388.026" y1="306.395" x2="388.259" y2="110.139"/><rect class="cls-1" x="343.406" y="59.657" width="44.021" height="23.815" transform="translate(1.007 0.311) rotate(0.091)"/><polygon class="cls-2" points="366.423 0.893 329.643 60.491 366.328 60.55 403.012 60.608 366.423 0.893"/><circle class="cls-3" cx="448.084" cy="262.515" r="30.044" transform="translate(185.749 711.073) rotate(-89.909)"/><line class="cls-3" x1="448.879" y1="324.803" x2="448.946" y2="282.984"/><path class="cls-2" d="M494.42,182.269s-23.679,65.633-23.714,87.644,7.521,35.734,23.517,35.76,23.6-13.674,23.631-35.685S494.42,182.269,494.42,182.269Z" transform="translate(0.893 0.893)"/><line class="cls-3" x1="495.087" y1="324.876" x2="495.154" y2="283.057"/><polyline class="cls-1" points="165.563 324.351 165.637 277.665 165.679 251.296"/><path class="cls-2" d="M137.45,245.293a10.134,10.134,0,0,0-10.15,10.118l20.268,0.032A10.134,10.134,0,0,0,137.45,245.293Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M137.418,265.561a10.134,10.134,0,0,0,10.15-10.118l-20.268-.032A10.134,10.134,0,0,0,137.418,265.561Z" transform="translate(0.893 0.893)"/><path class="cls-2" d="M192.139,245.38a10.134,10.134,0,0,0-10.15,10.118l20.268,0.032A10.134,10.134,0,0,0,192.139,245.38Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M192.107,265.648a10.134,10.134,0,0,0,10.15-10.118l-20.268-.032A10.134,10.134,0,0,0,192.107,265.648Z" transform="translate(0.893 0.893)"/><path class="cls-2" d="M164.822,228.306a10.134,10.134,0,0,0-10.15,10.118l20.268,0.032A10.134,10.134,0,0,0,164.822,228.306Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M164.789,248.573a10.134,10.134,0,0,0,10.15-10.118l-20.268-.032A10.134,10.134,0,0,0,164.789,248.573Z" transform="translate(0.893 0.893)"/><path class="cls-1" d="M164.738,281.089l-17.211-.027c-7.889-.013-10.127-4.457-10.109-15.5" transform="translate(0.893 0.893)"/><path class="cls-1" d="M164.738,281.089l17.211,0.027c7.889,0.013,10.141-4.424,10.159-15.468" transform="translate(0.893 0.893)"/><rect class="cls-2" x="221.7" y="277.478" width="28.542" height="27.784" transform="translate(1.357 0.517) rotate(0.091)"/><rect class="cls-3" x="250.241" y="277.508" width="9.76" height="27.784" transform="translate(1.357 0.487) rotate(0.091)"/><line class="cls-2" x1="222.57" y1="306.131" x2="222.541" y2="324.442"/><line class="cls-2" x1="251.112" y1="306.177" x2="251.083" y2="324.488"/><line class="cls-2" x1="232.914" y1="306.148" x2="232.885" y2="324.459"/><line class="cls-2" x1="260.872" y1="306.192" x2="260.843" y2="324.503"/><path class="cls-2" d="M94.33,104.534l85.772,0.137S137.287,60.491,94.33,104.534Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M143.962,104.613l85.772,0.137S186.918,60.57,143.962,104.613Z" transform="translate(0.893 0.893)"/><path class="cls-2" d="M504.1,139.769l85.772,0.137S547.053,95.726,504.1,139.769Z" transform="translate(0.893 0.893)"/><path class="cls-3" d="M552.726,139.847l60.625,0.1S583.089,108.716,552.726,139.847Z" transform="translate(0.893 0.893)"/><line class="cls-1" x1="657.207" y1="325.04" x2="0.893" y2="325.04"/></svg> \ No newline at end of file diff --git a/pagetop/static/theme/images/demo-about.svg b/pagetop/static/theme/images/homepage-about.svg similarity index 100% rename from pagetop/static/theme/images/demo-about.svg rename to pagetop/static/theme/images/homepage-about.svg diff --git a/pagetop/static/theme/images/demo-header.svg b/pagetop/static/theme/images/homepage-header.svg similarity index 100% rename from pagetop/static/theme/images/demo-header.svg rename to pagetop/static/theme/images/homepage-header.svg diff --git a/pagetop/static/theme/images/homepage-pagetop.png b/pagetop/static/theme/images/homepage-pagetop.png new file mode 100644 index 0000000000000000000000000000000000000000..71242a864ef9bae4a51deea147e0ccb93a9c7925 GIT binary patch literal 73977 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%0ABT)-ath6QQJ+{OiIG?7mY}}uBRJ?s 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 I8Klp@0JK1*W&i*H literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/images/homepage-support.jpg b/pagetop/static/theme/images/homepage-support.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7b79a930918770de35444f3d3739bc8970496b6 GIT binary patch literal 83250 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 P4_POJd>thHv+{oc;-5)n literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/images/demo-welcome.jpg b/pagetop/static/theme/images/homepage-welcome.jpg similarity index 100% rename from pagetop/static/theme/images/demo-welcome.jpg rename to pagetop/static/theme/images/homepage-welcome.jpg From e2f72fdb0ef0e10e86f1f4711e95526aff5d9f45 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 6 Nov 2022 14:43:20 +0100 Subject: [PATCH 218/853] =?UTF-8?q?=F0=9F=92=84=20[homepage]=20Mejor=20aju?= =?UTF-8?q?ste=20"responsive"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/theme/module/homepage/styles.css | 114 ++++++++++-------- 1 file changed, 67 insertions(+), 47 deletions(-) diff --git a/pagetop/static/theme/module/homepage/styles.css b/pagetop/static/theme/module/homepage/styles.css index 6444fe44..fda3e2d4 100644 --- a/pagetop/static/theme/module/homepage/styles.css +++ b/pagetop/static/theme/module/homepage/styles.css @@ -3,17 +3,30 @@ body.default-homepage span.app-name { color: inherit; } -#hello-world { - padding: 2em 5%; +#hello-world, +#welcome, +#pagetop, +#promo, +#reporting { + padding: 2rem 5%; } + +body.default-homepage [class$="-col-text"] { + padding: 0 5%; + text-align: center; +} +body.default-homepage [class$="-col-image"] { + padding: 1rem 5%; +} + #hello-world a { - margin: .25em; + margin: .25rem; } #hello-world a.code-link { - padding-left: 2em; - padding-right: 2em; - border-radius: 1.5em; - font-size: 112.5%; + padding-left: 2rem; + padding-right: 2rem; + border-radius: 1.5rem; + font-size: 1.125rem; } #hello-world a.welcome-link { text-decoration: none; @@ -21,16 +34,12 @@ body.default-homepage span.app-name { vertical-align: middle; } -#welcome { - padding: 2em 10%; -} #welcome > div.container { - padding: 3rem 8rem; + padding: 2rem 1rem; border-radius: 28px; - background: url("/theme/images/demo-welcome.jpg") center center no-repeat; + background: url("/theme/images/homepage-welcome.jpg") center center no-repeat; background-size: auto; background-size: cover; - text-align: center; color: #fff; } #welcome > div.container > h2 { @@ -40,44 +49,55 @@ body.default-homepage span.app-name { color: #ccc; } -#pagetop { - padding: 2em 5%; -} -#pagetop .pagetop-col-text { - padding-top: 2em; - padding-left: 5%; -} - -#promo { - padding: 4em 5% 2em; -} -#promo .promo-col-text { - padding-top: 2em; - padding-left: 5%; -} - -#reporting { - padding: 4em 5%; -} -#reporting .reporting-col-text { - text-align: center; +#reporting .reporting-col-image img { + border-radius: 40px; } /* Responsiveness */ -@media (min-width: 993px) { - #reporting .reporting-col-text { - padding-right: 3em; - text-align: right; - } -} -@media (max-width: 992px) { - [class$="-col-text"] { - text-align: center; - } - #hello-world .hello-col-image { +@media (min-width: 768px) { + body.default-homepage [class$="-col-image"] { padding-top: 5%; } - #welcome > div.container { - padding: 3rem 1rem; + + #hello-world .hello-col-text { + padding-left: 1rem; + padding-right: 1rem; + } + #hello-world .hello-col-image { + padding-top: 3rem; + } +} +@media (min-width: 992px) { + body.default-homepage [class$="-col-image"] { + padding-top: 1rem; + } + + #hello-world .hello-col-text { + padding-top: 2rem; + padding-left: 10%; + text-align: left; + } + + #welcome { + padding-left: 10%; + padding-right: 10%; + } + #welcome > div.container { + padding: 2rem 8rem; + } + + #pagetop .pagetop-col-text { + padding-left: 2rem; + text-align: left; + } + + #promo .promo-col-text { + padding-right: 0; + text-align: right; + } + + #reporting .reporting-col-text { + padding-left: 1rem; + text-align: left; } } From 62cc2a62011a6a911172d2d535359c2f09be6d88 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 6 Nov 2022 14:46:06 +0100 Subject: [PATCH 219/853] =?UTF-8?q?=F0=9F=9A=B8=20[homepage]=20Mejora=20pr?= =?UTF-8?q?esentaci=C3=B3n=20de=20la=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/config/settings.predefined.toml | 2 +- pagetop/src/base/module/homepage.rs | 63 ++++++++++++------- .../homepage/locales/en-US/homepage.ftl | 11 ++-- .../homepage/locales/es-ES/homepage.ftl | 15 ++--- 4 files changed, 55 insertions(+), 36 deletions(-) diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index 19db0a27..87ebbc75 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -31,7 +31,7 @@ max_pool_size = 5 # se integran de manera predeterminada en el binario ejecutable. Sin embargo, es # útil servir estos archivos desde su propio directorio durante el desarrollo ya # que no requiere compilar cada vez que se modifican. En este caso, normalmente, -# basta con indicar el directorio "pagetop/static". +# basta con indicar el directorio "../pagetop/static". static_files = "" [log] diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 92a3628b..d48a0975 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -45,7 +45,7 @@ fn hello_world() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "hello-col-text") - .with_size(grid::ColumnSize::Is4of12) + .with_size(grid::ColumnSize::Is5of12) .with_component( Heading::h1(html! { (l("page_title")) @@ -55,19 +55,26 @@ fn hello_world() -> Container { .with_component( Paragraph::with(html! { (e("hello_intro", &args![ - "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) + "app" => format!( + "<span class=\"app-name\">{}</span>", + &SETTINGS.app.name, + ) ])) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { (e("hello_powered", &args![ - "pagetop" => "<a href=\"https://pagetop.cillero.es\" target=\"_blank\">PageTop</a>" + "pagetop" => format!( + "<a href=\"{}\" target=\"_blank\">{}</a>", + "https://pagetop.cillero.es", + "PageTop", + ) ])) })) .with_component( Anchor::button( - "https://gitlab.com/manuelcillero/pagetop", + "https://github.com/manuelcillero/pagetop", html! { (l("hello_code")) }, ) .with_target(AnchorTarget::Blank) @@ -86,8 +93,8 @@ fn hello_world() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "hello-col-image") - .with_component(Image::new_with_source("/theme/images/demo-header.svg")), - ), + .with_component(Image::new_with_source("/theme/images/homepage-header.svg")), + ) ) } @@ -122,7 +129,7 @@ fn about_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-image") .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::new_with_source("/theme/images/demo-about.svg")), + .with_component(Image::new_with_source("/theme/images/homepage-about.svg")), ) .with_column( grid::Column::new() @@ -140,21 +147,21 @@ fn about_pagetop() -> Container { (l("pagetop_text2")) })) .with_component(Paragraph::with(html! { - (l("pagetop_text3")) + (e("pagetop_text3", &args![ + "pagetop_website" => format!( + "<a href=\"{}\" target=\"_blank\">{}</a>", + "https://docs.rs/pagetop/latest/pagetop", + l("pagetop_website"), + ) + ])) })), - ), + ) ) } fn promo_pagetop() -> Container { Container::new().with_id("promo").with_component( grid::Row::new() - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "promo-col-image") - .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::new_with_source("/theme/images/demo-pagetop.svg")), - ) .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-text") @@ -164,22 +171,37 @@ fn promo_pagetop() -> Container { .with_component( Paragraph::with(html! { (e("pagetop_promo_text1", &args![ - "pagetop" => "<a href=\"https://pagetop-rs\">PageTop</a>" + "pagetop" => format!( + "<a href=\"{}\" target=\"_blank\">{}</a>", + "https://crates.io/crates/pagetop", + "PageTop", + ) ])) }) .with_display(ParagraphDisplay::Small), ), - ), + ) + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "promo-col-image") + .with_size(grid::ColumnSize::Is6of12) + .with_component(Image::new_with_source("/theme/images/homepage-pagetop.png")), + ) ) } fn reporting_problems() -> Container { Container::new().with_id("reporting").with_component( grid::Row::new() + .with_column( + grid::Column::new() + .with_classes(ClassesOp::Add, "reporting-col-image") + .with_component(Image::new_with_source("/theme/images/homepage-support.jpg")), + ) .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "reporting-col-text") - .with_size(grid::ColumnSize::Is7of12) + .with_size(grid::ColumnSize::Is6of12) .with_component(Heading::h2(html! { (l("report_problems_title")) })) @@ -193,10 +215,5 @@ fn reporting_problems() -> Container { (l("report_problems_text2")) })), ) - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "reporting-col-image") - .with_component(Image::new_with_source("/theme/images/demo-pagetop.svg")), - ), ) } diff --git a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl index e4e8dead..b97672a1 100644 --- a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl +++ b/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl @@ -8,7 +8,7 @@ hello_powered = This web solution is powered by { $pagetop }. hello_code = Code hello_welcome = Welcome -welcome_page = Welcome Page +welcome_page = Welcome page welcome_subtitle = Are you user of { $app }? welcome_text1 = If you don't know what this page is about, this probably means that the site is either experiencing problems or is undergoing routine maintenance. welcome_text2 = If the problem persists, please contact your system administrator. @@ -16,11 +16,12 @@ welcome_text2 = If the problem persists, please contact your system administrato pagetop_title = About PageTop pagetop_text1 = If you can read this page, it means that the PageTop server is working properly, but has not yet been configured. pagetop_text2 = PageTop defines an interface for the most stable and popular Rust packages to build modular, extensible and configurable web solutions. -pagetop_text3 = For information on PageTop please visit the "PageTop website". +pagetop_text3 = For more information on PageTop please visit the { $pagetop_website }. +pagetop_website = technical documentation pagetop_promo_title = Promoting PageTop pagetop_promo_text1 = You are free to use the image below on applications powered by { $pagetop }. Thanks for using PageTop! -report_problems_title = Reporting Problems -report_problems_text1 = Please use the GitLab tool to report bugs in PageTop. However, check "existing bug reports" before reporting a new bug. -report_problems_text2 = Please report bugs specific to modules (such as admin, and others) to respective packages, not to PageTop itself. +report_problems_title = Reporting problems +report_problems_text1 = Please use the GitHub tool to report bugs in PageTop. However, check "existing bug reports" before reporting a new bug. +report_problems_text2 = Please report bugs specific to modules (such as admin, and others) to respective repositories, not to PageTop itself. diff --git a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl index 614a879e..32a56621 100644 --- a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl +++ b/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl @@ -4,23 +4,24 @@ module_description = Muestra una página de demostración predeterminada cuando page_title = ¡Hola mundo! hello_intro = Esta página se utiliza para comprobar el correcto funcionamiento de { $app } después de la instalación. -hello_powered = Una solución web creada con { $pagetop }. +hello_powered = Esta solución web funciona con { $pagetop }. hello_code = Código hello_welcome = Bienvenida welcome_page = Página de bienvenida -welcome_subtitle = ¿Utilizas los servicios de { $app }? +welcome_subtitle = ¿Eres usuario de { $app }? welcome_text1 = Si no sabes de qué trata esta página, probablemente significa que el sitio está experimentando problemas o está pasando por un mantenimiento de rutina. welcome_text2 = Si el problema persiste, póngase en contacto con el administrador del sistema. pagetop_title = Sobre PageTop pagetop_text1 = Si puedes leer esta página, significa que el servidor PageTop funciona correctamente, pero aún no se ha configurado. pagetop_text2 = PageTop define una interfaz para los paquetes Rust más estables y populares para crear soluciones web modulares, extensibles y configurables. -pagetop_text3 = Para obtener información sobre PageTop, visita el "sitio web de PageTop". +pagetop_text3 = Para más información sobre PageTop, por favor visita la { $pagetop_website }. +pagetop_website = documentación técnica pagetop_promo_title = Promociona PageTop -pagetop_promo_text1 = Puedes usar la siguiente imagen en aplicaciones desarrolladas sobre { $pagetop }. ¡Gracias por usar PageTop! +pagetop_promo_text1 = Eres libre de usar la siguiente imagen en aplicaciones desarrolladas con { $pagetop }. ¡Gracias por usar PageTop! -report_problems_title = Informando Problemas -report_problems_text1 = Utilice la herramienta GitLab para informar errores en PageTop. Sin embargo, verifique los "informes de errores existentes" antes de informar de un nuevo error. -report_problems_text2 = Informe los errores específicos de los módulos (como admin y otros) a los paquetes respectivos, no a PageTop en sí. +report_problems_title = Informando problemas +report_problems_text1 = Utiliza la herramienta GitHub para informar errores en PageTop. Sin embargo, comprueba los "informes de errores existentes" antes de informar de un nuevo error. +report_problems_text2 = Informa de errores específicos de los módulos (como admin y otros) en sus repositorios respectivos, no a PageTop en sí. From 65c290a240346a33ac76024ea5c8c16f3fb83b77 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 8 Nov 2022 20:38:02 +0100 Subject: [PATCH 220/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[config]=20Inicial?= =?UTF-8?q?iza=20la=20configuraci=C3=B3n=20global?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 3 +++ pagetop/src/config.rs | 16 ++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 293b1e0d..db912a99 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -19,6 +19,9 @@ impl Application { // Rótulo de presentación. super::banner::print_on_startup(); + // Inicializa la configuración global. + LazyStatic::force(&super::config::SETTINGS); + // Inicia registro de trazas y eventos. LazyStatic::force(&super::tracing::TRACING); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index dfb7df49..41d4d211 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -42,14 +42,15 @@ //! # Cómo añadir ajustes de configuración //! //! Para proporcionar a tu **aplicación** o **módulo** sus propios ajustes de configuración, añade -//! [*serde*](https://docs.rs/serde) en las dependencias de tu archivo *Cargo.toml*: +//! [*serde*](https://docs.rs/serde) en las dependencias de tu archivo *Cargo.toml* habilitando la +//! característica `derive`: //! //! ```toml //! [dependencies] //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Declara ([`LazyStatic`]) e inicializa tus nuevos ajustes con tipos seguros +//! Y luego declara ([`LazyStatic`]) e inicializa tus ajustes con tipos seguros //! ([`config::try_into<S>()`](try_into)) y valores predefinidos //! ([`predefined_settings!`](crate::predefined_settings)): //! @@ -80,16 +81,19 @@ //! }); //! ``` //! -//! De hecho, así se declaran e inicializan los ajustes globales de la configuración -//! ([`SETTINGS`](crate::app::config::SETTINGS)). +//! De hecho, esta es la forma en la que se declaran e inicializan los ajustes globales de la +//! configuración ([`SETTINGS`](crate::app::config::SETTINGS)). //! //! Usa la sintaxis TOML para añadir tu nueva sección `[myapp]` en los archivos de configuración, -//! del mismo modo que `[log]` o `[server]` hacen para los ajustes globales +//! del mismo modo que se añaden `[log]` o `[server]` en los ajustes globales //! ([`Settings`](crate::app::config::Settings)). //! //! Se recomienda inicializar todos los ajustes con valores predefinidos, o utilizar la notación //! `Option<T>` si van a ser tratados en el código como opcionales. //! +//! Si no pueden inicializarse correctamente los ajustes de configuración, entonces la aplicación +//! ejecutará un panic! y detendrá la ejecución. +//! //! Los ajustes de configuración siempre son de sólo lectura. //! //! @@ -186,7 +190,7 @@ where settings.set_default(key, *value).unwrap(); } match settings.try_into() { - Ok(c) => c, + Ok(s) => s, Err(e) => panic!("Error parsing settings: {}", e), } } From bb6cb076034dd62031258b07cda6332400b26d9e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 8 Nov 2022 21:25:44 +0100 Subject: [PATCH 221/853] =?UTF-8?q?=F0=9F=94=A5=20Elimina=20async=20innece?= =?UTF-8?q?sario=20(=C2=BFseguro=3F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- pagetop/src/app/application.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 9f45fc65..3f2073d2 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -27,5 +27,5 @@ impl ModuleTrait for Drust { #[actix_web::main] async fn main() -> std::io::Result<()> { - Application::prepare(&Drust).await?.run()?.await + Application::prepare(&Drust).unwrap().run()?.await } diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index db912a99..5482992c 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -15,7 +15,7 @@ pub struct Application { } impl Application { - pub async fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { + pub fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { // Rótulo de presentación. super::banner::print_on_startup(); From 9c29240c34e856df1ab0995e74bd170afff78dc2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 01:50:53 +0100 Subject: [PATCH 222/853] =?UTF-8?q?=F0=9F=93=9D=20[config]=20Mejora=20reda?= =?UTF-8?q?cci=C3=B3n=20de=20algunos=20textos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/config.rs | 3 ++- pagetop/src/config.rs | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/pagetop/src/app/config.rs b/pagetop/src/app/config.rs index 37c50815..c95ff3ae 100644 --- a/pagetop/src/app/config.rs +++ b/pagetop/src/app/config.rs @@ -96,7 +96,8 @@ pub struct Server { pub bind_port: u16, } -/// Declara e inicializa los ajustes globales para la estructura [`Settings`]. +/// Declara y asigna los valores predefinidos de los ajustes globales para la estructura +/// [`Settings`]. /// /// ``` /// use pagetop::prelude::*; diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 41d4d211..cff20237 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -41,7 +41,7 @@ //! //! # Cómo añadir ajustes de configuración //! -//! Para proporcionar a tu **aplicación** o **módulo** sus propios ajustes de configuración, añade +//! Para proporcionar a tu **módulo** sus propios ajustes de configuración, añade //! [*serde*](https://docs.rs/serde) en las dependencias de tu archivo *Cargo.toml* habilitando la //! característica `derive`: //! @@ -50,9 +50,9 @@ //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Y luego declara ([`LazyStatic`]) e inicializa tus ajustes con tipos seguros -//! ([`config::try_into<S>()`](try_into)) y valores predefinidos -//! ([`predefined_settings!`](crate::predefined_settings)): +//! Y luego declara con [`LazyStatic`] tus ajustes, usando tipos seguros mediante +//! [`config::try_into<S>()`](try_into) y asignando los valores predefinidos directamente con la +//! macro [`predefined_settings!`](crate::predefined_settings) para la estructura asociada: //! //! ``` //! use pagetop::prelude::*; @@ -81,12 +81,12 @@ //! }); //! ``` //! -//! De hecho, esta es la forma en la que se declaran e inicializan los ajustes globales de la -//! configuración ([`SETTINGS`](crate::app::config::SETTINGS)). +//! De hecho, así se declaran los ajustes globales de la configuración (ver +//! [`SETTINGS`](crate::app::config::SETTINGS)). //! -//! Usa la sintaxis TOML para añadir tu nueva sección `[myapp]` en los archivos de configuración, -//! del mismo modo que se añaden `[log]` o `[server]` en los ajustes globales -//! ([`Settings`](crate::app::config::Settings)). +//! Puedes usar la [sintaxis TOML](https://toml.io/en/v1.0.0#table) para añadir tu nueva sección +//! `[myapp]` en los archivos de configuración, del mismo modo que se añaden `[log]` o `[server]` en +//! los ajustes globales (ver [`Settings`](crate::app::config::Settings)). //! //! Se recomienda inicializar todos los ajustes con valores predefinidos, o utilizar la notación //! `Option<T>` si van a ser tratados en el código como opcionales. @@ -94,7 +94,7 @@ //! Si no pueden inicializarse correctamente los ajustes de configuración, entonces la aplicación //! ejecutará un panic! y detendrá la ejecución. //! -//! Los ajustes de configuración siempre son de sólo lectura. +//! Los ajustes de configuración siempre serán de sólo lectura. //! //! //! # Cómo usar tus nuevos ajustes de configuración @@ -176,7 +176,8 @@ static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { settings }); -/// Carga ajustes con tipos seguros y valores predefinidos para tu aplicación o módulo. +/// Asigna los ajustes de configuración de tu módulo usando tipos seguros y valores predefinidos +/// para la estructura asociada S. /// /// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// From 680a61247ae403e4cd4f8413b60c851fc46bc286 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 19:16:04 +0100 Subject: [PATCH 223/853] =?UTF-8?q?=F0=9F=8E=A8=20Ahora=20son=20pub=5Fhand?= =?UTF-8?q?le!()=20y=20pub=5Flocale!()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 4 ++-- pagetop-admin/src/lib.rs | 6 +++--- pagetop-node/src/lib.rs | 6 +++--- pagetop-user/src/lib.rs | 6 +++--- pagetop/src/base/component/anchor.rs | 4 ++-- pagetop/src/base/component/block.rs | 4 ++-- pagetop/src/base/component/container.rs | 4 ++-- pagetop/src/base/component/form_element/button.rs | 4 ++-- pagetop/src/base/component/form_element/date.rs | 4 ++-- pagetop/src/base/component/form_element/form.rs | 4 ++-- pagetop/src/base/component/form_element/hidden.rs | 4 ++-- pagetop/src/base/component/form_element/input.rs | 4 ++-- pagetop/src/base/component/grid/column.rs | 4 ++-- pagetop/src/base/component/grid/row.rs | 4 ++-- pagetop/src/base/component/heading.rs | 4 ++-- pagetop/src/base/component/html.rs | 4 ++-- pagetop/src/base/component/icon.rs | 4 ++-- pagetop/src/base/component/image.rs | 4 ++-- pagetop/src/base/component/menu.rs | 8 ++++---- pagetop/src/base/component/paragraph.rs | 4 ++-- pagetop/src/base/module/homepage.rs | 6 +++--- pagetop/src/base/theme/aliner.rs | 4 ++-- pagetop/src/base/theme/bootsier.rs | 8 ++++---- pagetop/src/base/theme/bulmix.rs | 8 ++++---- pagetop/src/base/theme/minimal.rs | 4 ++-- pagetop/src/core/component/definition.rs | 8 ++++---- pagetop/src/core/hook/all.rs | 14 +++++++------- pagetop/src/core/hook/definition.rs | 4 ++-- pagetop/src/core/module/all.rs | 6 +++--- pagetop/src/core/module/definition.rs | 4 ++-- pagetop/src/core/theme/all.rs | 2 +- pagetop/src/core/theme/definition.rs | 8 ++++---- pagetop/src/locale.rs | 8 ++++---- pagetop/src/prelude.rs | 8 ++++---- pagetop/src/response/page/hook.rs | 8 ++++---- pagetop/src/util.rs | 14 +++++++------- 36 files changed, 102 insertions(+), 102 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 3f2073d2..f5167f33 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,11 +1,11 @@ use pagetop::prelude::*; -pub_const_handler!(APP_DRUST); +pub_handle!(APP_DRUST); struct Drust; impl ModuleTrait for Drust { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { APP_DRUST } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 4ddd3279..20aeac6e 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,15 +1,15 @@ use pagetop::prelude::*; -pub_const_handler!(MODULE_ADMIN); +pub_handle!(MODULE_ADMIN); -localize!("src/locales"); +pub_locale!("src/locales"); mod summary; pub struct Admin; impl ModuleTrait for Admin { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { MODULE_ADMIN } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index ff4755fd..db9c1b44 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,8 +1,8 @@ use pagetop::prelude::*; -pub_const_handler!(MODULE_NODE); +pub_handle!(MODULE_NODE); -localize!("src/locales"); +pub_locale!("src/locales"); //mod entity; mod migration; @@ -10,7 +10,7 @@ mod migration; pub struct Node; impl ModuleTrait for Node { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { MODULE_NODE } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 22c14c41..6b192af8 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,15 +1,15 @@ use pagetop::prelude::*; -pub_const_handler!(MODULE_USER); +pub_handle!(MODULE_USER); -localize!("src/locales"); +pub_locale!("src/locales"); mod migration; pub struct User; impl ModuleTrait for User { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { MODULE_USER } diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 110aa5ff..b91e939e 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_ANCHOR); +pub_handle!(COMPONENT_ANCHOR); #[derive(Default)] pub enum AnchorType { @@ -43,7 +43,7 @@ impl ComponentTrait for Anchor { Anchor::default() } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_ANCHOR } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index c1b8a39f..af89daca 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_BLOCK); +pub_handle!(COMPONENT_BLOCK); hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); @@ -21,7 +21,7 @@ impl ComponentTrait for Block { Block::default().with_classes(ClassesOp::SetDefault, "block") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_BLOCK } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index b3522957..1024e4de 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_CONTAINER); +pub_handle!(COMPONENT_CONTAINER); hook_before_render_component!(HOOK_BEFORE_RENDER_CONTAINER, Container); @@ -34,7 +34,7 @@ impl ComponentTrait for Container { .with_inner_classes(ClassesOp::SetDefault, "container") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_CONTAINER } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index d99305f9..e20c920e 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_BUTTON); +pub_handle!(COMPONENT_BUTTON); #[derive(Default)] pub enum ButtonType { @@ -31,7 +31,7 @@ impl ComponentTrait for Button { .with_classes(ClassesOp::AddFirst, "form-button") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_BUTTON } diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 0b6fb935..910e989a 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_DATE); +pub_handle!(COMPONENT_DATE); #[rustfmt::skip] #[derive(Default)] @@ -28,7 +28,7 @@ impl ComponentTrait for Date { .with_classes(ClassesOp::AddFirst, "form-type-date") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_DATE } diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 9ff1593e..8f24800e 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_FORM); +pub_handle!(COMPONENT_FORM); hook_before_render_component!(HOOK_BEFORE_RENDER_FORM, Form); @@ -32,7 +32,7 @@ impl ComponentTrait for Form { .with_charset("UTF-8") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_FORM } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 0ee11d83..88584cdd 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_HIDDEN); +pub_handle!(COMPONENT_HIDDEN); #[rustfmt::skip] #[derive(Default)] @@ -15,7 +15,7 @@ impl ComponentTrait for Hidden { Hidden::default() } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_HIDDEN } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 5418e0ed..1109ac3b 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_INPUT); +pub_handle!(COMPONENT_INPUT); #[derive(Default)] pub enum InputType { @@ -45,7 +45,7 @@ impl ComponentTrait for Input { .with_maxlength(Some(128)) } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_INPUT } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 898141f2..bb78e9c4 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_COLUMN); +pub_handle!(COMPONENT_COLUMN); hook_before_render_component!(HOOK_BEFORE_RENDER_COLUMN, Column); @@ -53,7 +53,7 @@ impl ComponentTrait for Column { Column::default().with_classes(ClassesOp::SetDefault, SIZE__DEFAULT) } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_COLUMN } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 76919287..bd2ddd94 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_ROW); +pub_handle!(COMPONENT_ROW); hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); @@ -20,7 +20,7 @@ impl ComponentTrait for Row { Row::default().with_classes(ClassesOp::SetDefault, "row") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_ROW } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index b3c643b6..bf90567d 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_HEADING); +pub_handle!(COMPONENT_HEADING); #[derive(Default)] pub enum HeadingType { @@ -43,7 +43,7 @@ impl ComponentTrait for Heading { Heading::default() } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_HEADING } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 881ef29c..dfc51289 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_HTML); +pub_handle!(COMPONENT_HTML); #[rustfmt::skip] #[derive(Default)] @@ -16,7 +16,7 @@ impl ComponentTrait for Html { Html::default() } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_HTML } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 657a4f7f..368fb4cc 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_ICON); +pub_handle!(COMPONENT_ICON); #[rustfmt::skip] #[derive(Default)] @@ -16,7 +16,7 @@ impl ComponentTrait for Icon { Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_ICON } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index b3afe450..cb59442f 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_IMAGE); +pub_handle!(COMPONENT_IMAGE); #[rustfmt::skip] #[derive(Default)] @@ -18,7 +18,7 @@ impl ComponentTrait for Image { Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_IMAGE } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 2076d3fc..a95ade58 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_MENUITEM); +pub_handle!(COMPONENT_MENUITEM); #[derive(Default)] pub enum MenuItemType { @@ -29,7 +29,7 @@ impl ComponentTrait for MenuItem { MenuItem::default() } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_MENUITEM } @@ -170,7 +170,7 @@ impl MenuItem { // Menu. -pub_const_handler!(COMPONENT_MENU); +pub_handle!(COMPONENT_MENU); hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, Menu); @@ -190,7 +190,7 @@ impl ComponentTrait for Menu { Menu::default().with_classes(ClassesOp::SetDefault, "sm sm-clean") } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_MENU } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 52cb5c5d..fa60c233 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub_const_handler!(COMPONENT_PARAGRAPH); +pub_handle!(COMPONENT_PARAGRAPH); #[derive(Default)] pub enum ParagraphDisplay { @@ -30,7 +30,7 @@ impl ComponentTrait for Paragraph { Paragraph::default() } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { COMPONENT_PARAGRAPH } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index d48a0975..dee2e7b3 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -1,13 +1,13 @@ use crate::prelude::*; -pub_const_handler!(MODULE_DEFAULT_HOMEPAGE); +pub_handle!(MODULE_DEFAULT_HOMEPAGE); -localize!("src/base/module/homepage/locales"); +pub_locale!("src/base/module/homepage/locales"); pub struct DefaultHomePage; impl ModuleTrait for DefaultHomePage { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { MODULE_DEFAULT_HOMEPAGE } diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 4afa2292..23c9c65c 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -1,13 +1,13 @@ use crate::prelude::*; -pub_const_handler!(THEME_ALINER); +pub_handle!(THEME_ALINER); include!(concat!(env!("OUT_DIR"), "/aliner.rs")); pub struct Aliner; impl ThemeTrait for Aliner { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { THEME_ALINER } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index cc93fe11..04327b8f 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -1,15 +1,15 @@ use crate::prelude::*; -pub_const_handler!(THEME_BOOTSIER); +pub_handle!(THEME_BOOTSIER); + +pub_locale!("src/base/theme/bootsier/locales"); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); -localize!("src/base/theme/bootsier/locales"); - pub struct Bootsier; impl ThemeTrait for Bootsier { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { THEME_BOOTSIER } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index a7ba960a..acac7d12 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -1,13 +1,13 @@ use crate::prelude::*; -pub_const_handler!(THEME_BULMIX); +pub_handle!(THEME_BULMIX); include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); pub struct Bulmix; impl ThemeTrait for Bulmix { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { THEME_BULMIX } @@ -33,7 +33,7 @@ impl ThemeTrait for Bulmix { component: &mut dyn ComponentTrait, _context: &mut PageContext, ) { - match component.handler() { + match component.handle() { COMPONENT_ANCHOR => { let a = component_mut::<Anchor>(component); a.alter_classes( @@ -112,7 +112,7 @@ impl ThemeTrait for Bulmix { component: &dyn ComponentTrait, _context: &mut PageContext, ) -> Option<Markup> { - match component.handler() { + match component.handle() { COMPONENT_ICON => { let icon = component_ref::<Icon>(component); Some(html! { diff --git a/pagetop/src/base/theme/minimal.rs b/pagetop/src/base/theme/minimal.rs index 63c90976..fab264f1 100644 --- a/pagetop/src/base/theme/minimal.rs +++ b/pagetop/src/base/theme/minimal.rs @@ -1,11 +1,11 @@ use crate::prelude::*; -pub_const_handler!(THEME_MINIMAL); +pub_handle!(THEME_MINIMAL); pub struct Minimal; impl ThemeTrait for Minimal { - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { THEME_MINIMAL } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 6786ca9b..2b61cc3d 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,6 +1,6 @@ use crate::html::{html, Markup}; use crate::response::page::PageContext; -use crate::util::{single_type_name, Handler}; +use crate::util::{single_type_name, Handle}; pub use std::any::Any as AnyComponent; @@ -13,7 +13,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { where Self: Sized; - fn handler(&self) -> Handler; + fn handle(&self) -> Handle; fn name(&self) -> String { single_type_name::<Self>().to_owned() @@ -75,7 +75,7 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { macro_rules! hook_before_render_component { ( $ACTION_HANDLER:ident, $Component:ty ) => { paste::paste! { - $crate::pub_const_handler!($ACTION_HANDLER); + $crate::pub_handle!($ACTION_HANDLER); type Action = fn(&$Component, &mut PageContext); @@ -92,7 +92,7 @@ macro_rules! hook_before_render_component { } } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { $ACTION_HANDLER } diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index a5eeb5a7..a48399fd 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,29 +1,29 @@ use super::{ActionsHolder, HookAction}; -use crate::util::Handler; +use crate::util::Handle; use crate::LazyStatic; use std::collections::HashMap; use std::sync::RwLock; // Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<Handler, ActionsHolder>>> = +static ACTIONS: LazyStatic<RwLock<HashMap<Handle, ActionsHolder>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); pub fn add_action(action: HookAction) { let mut actions = ACTIONS.write().unwrap(); - let action_handler = action.handler(); - if let Some(holder) = actions.get_mut(&action_handler) { + let action_handle = action.handle(); + if let Some(holder) = actions.get_mut(&action_handle) { holder.add(action); } else { - actions.insert(action_handler, ActionsHolder::new_with(action)); + actions.insert(action_handle, ActionsHolder::new_with(action)); } } -pub fn run_actions<B, F>(action_handler: Handler, f: F) +pub fn run_actions<B, F>(action_handle: Handle, f: F) where F: FnMut(&HookAction) -> B, { - if let Some(holder) = ACTIONS.read().unwrap().get(&action_handler) { + if let Some(holder) = ACTIONS.read().unwrap().get(&action_handle) { holder.iter_map(f) } } diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index 5808b6c9..6feb0f76 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -1,4 +1,4 @@ -use crate::util::Handler; +use crate::util::Handle; pub use std::any::Any as AnyHookAction; @@ -7,7 +7,7 @@ pub trait HookActionTrait: AnyHookAction + Send + Sync { where Self: Sized; - fn handler(&self) -> Handler; + fn handle(&self) -> Handle; fn weight(&self) -> isize { 0 diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 3fa88947..2bbc21e2 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -31,7 +31,7 @@ pub fn register_modules(app: ModuleStaticRef) { fn add_to_discarded(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { for u in module.uninstall_modules().iter() { - if !list.iter().any(|m| m.handler() == u.handler()) { + if !list.iter().any(|m| m.handle() == u.handle()) { list.push(*u); trace::debug!("Module \"{}\" discarded", u.single_name()); } @@ -42,12 +42,12 @@ fn add_to_discarded(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { } fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { - if !list.iter().any(|m| m.handler() == module.handler()) { + if !list.iter().any(|m| m.handle() == module.handle()) { if DISCARDED_MODULES .read() .unwrap() .iter() - .any(|m| m.handler() == module.handler()) + .any(|m| m.handle() == module.handle()) { panic!( "Trying to enable \"{}\" module which is disabled", diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index b15d1f26..ce425622 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,7 +1,7 @@ use crate::app; use crate::core::hook::HookAction; use crate::core::theme::ThemeStaticRef; -use crate::util::{single_type_name, Handler}; +use crate::util::{single_type_name, Handle}; #[cfg(feature = "database")] use crate::db::MigrationItem; @@ -14,7 +14,7 @@ pub trait BaseModule { /// Los módulos deben implementar este *trait*. pub trait ModuleTrait: BaseModule + Send + Sync { - fn handler(&self) -> Handler; + fn handle(&self) -> Handle; fn name(&self) -> String { self.single_name().to_owned() diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 64ae5b2b..17e9bbe1 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -20,7 +20,7 @@ pub fn register_themes(themes: Vec<ThemeStaticRef>) { for theme in themes { if !registered_themes .iter() - .any(|t| t.handler() == theme.handler()) + .any(|t| t.handle() == theme.handle()) { trace::debug!("Registering theme \"{}\"", theme.single_name()); registered_themes.push(theme); diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index f33be422..112bab37 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -5,7 +5,7 @@ use crate::concat_string; use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; -use crate::util::{single_type_name, Handler}; +use crate::util::{single_type_name, Handle}; pub type ThemeStaticRef = &'static dyn ThemeTrait; @@ -15,7 +15,7 @@ pub trait BaseTheme { /// Los temas deben implementar este "trait". pub trait ThemeTrait: BaseTheme + Send + Sync { - fn handler(&self) -> Handler; + fn handle(&self) -> Handle; fn name(&self) -> String { self.single_name().to_owned() @@ -91,7 +91,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { /* Cómo usarlo: - match component.handler() { + match component.handle() { BLOCK_COMPONENT => { let block = component_mut::<Block>(component); block.alter_title("New title"); @@ -111,7 +111,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { /* Cómo usarlo: - match component.handler() { + match component.handle() { BLOCK_COMPONENT => { let block = component_ref::<Block>(component); match block.template() { diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 664ad870..5b8b53da 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -69,16 +69,16 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la poderosa macro -//! [`localize!`](crate::localize) para integrar fácilmente tus recursos de localización. +//! [`pub_locale!`](crate::pub_locale) para integrar fácilmente tus recursos de localización. //! //! Esta macro crea dos funciones para el ámbito donde se ejecuta. Por un lado la función `l()` para //! traducciones directas de etiquetas. Y por otro la función `t()` para traducciones que requieren //! argumentos: //! //! ``` -//! use pagetop::{args, localize}; +//! use pagetop::{args, pub_locale}; //! -//! localize!("en-US"); +//! pub_locale!("en-US"); //! //! fn demo() { //! println!("* {}", l("hello-world")); @@ -100,7 +100,7 @@ pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. -macro_rules! localize { +macro_rules! pub_locale { ( $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; use $crate::app::locale::LANGID; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 241f1e82..ab2d1df4 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,11 +2,13 @@ pub use crate::{concat_string, LazyStatic}; // Macros. -pub use crate::{args, configure_service_for_static_files, predefined_settings, pub_const_handler}; +pub use crate::{ + args, configure_service_for_static_files, predefined_settings, pub_handle, pub_locale, +}; // Helpers. pub use crate::util; -pub use crate::util::{Handler, HashMapResources}; +pub use crate::util::{Handle, HashMapResources}; // ************************************************************************************************* @@ -14,8 +16,6 @@ pub use crate::config; pub use crate::trace; -pub use crate::localize; - pub use crate::html::*; #[cfg(feature = "database")] diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index 09363f35..0c01f27d 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,9 +1,9 @@ use super::Page; use crate::core::hook::{AnyHookAction, HookActionTrait}; -use crate::pub_const_handler; -use crate::util::Handler; +use crate::pub_handle; +use crate::util::Handle; -pub_const_handler!(HOOK_BEFORE_RENDER_PAGE); +pub_handle!(HOOK_BEFORE_RENDER_PAGE); type Hook = fn(&mut Page); @@ -20,7 +20,7 @@ impl HookActionTrait for BeforeRenderPageHook { } } - fn handler(&self) -> Handler { + fn handle(&self) -> Handle { HOOK_BEFORE_RENDER_PAGE } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 5caa741b..91d9c07d 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -87,15 +87,15 @@ pub fn bundle_resources( bundle.build() } -pub type Handler = u64; +pub type Handle = u64; // https://stackoverflow.com/a/71464396 -pub const fn handler( +pub const fn handle( module_path: &'static str, file: &'static str, line: u32, column: u32, -) -> Handler { +) -> Handle { let mut hash = 0xcbf29ce484222325; let prime = 0x00000100000001B3; @@ -124,10 +124,10 @@ pub const fn handler( } #[macro_export] -macro_rules! pub_const_handler { - ( $HANDLER:ident ) => { - pub const $HANDLER: $crate::util::Handler = - $crate::util::handler(module_path!(), file!(), line!(), column!()); +macro_rules! pub_handle { + ( $HANDLE:ident ) => { + pub const $HANDLE: $crate::util::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); }; } From 885710e0c30004421fe132b1f334f170e8a08c5a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 21:14:57 +0100 Subject: [PATCH 224/853] =?UTF-8?q?=F0=9F=8E=A8=20Y=20a=C3=B1ade=20pub=5Fc?= =?UTF-8?q?onfig!()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 1 + pagetop/src/app/config.rs | 80 ++++++++++++++-------------------- pagetop/src/config.rs | 91 ++++++++++++++++----------------------- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 4 +- 5 files changed, 73 insertions(+), 105 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index dca3a63b..6376768f 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -24,6 +24,7 @@ categories = [ [dependencies] async-trait = "0.1.58" concat-string = "1.0.1" +doc-comment = "0.3.3" figlet-rs = "0.1.4" futures = "0.3.25" nom = "7.1.1" diff --git a/pagetop/src/app/config.rs b/pagetop/src/app/config.rs index c95ff3ae..4bdac5a2 100644 --- a/pagetop/src/app/config.rs +++ b/pagetop/src/app/config.rs @@ -1,8 +1,6 @@ //! Ajustes globales de la configuración. -use crate::config; -use crate::predefined_settings; -use crate::LazyStatic; +use crate::pub_config; use serde::Deserialize; @@ -53,9 +51,9 @@ pub struct Database { pub db_pass: String, /// Valor predefinido: *"localhost"* pub db_host: String, - /// Valor predefinido: *"0"* + /// Valor predefinido: *0* pub db_port: u16, - /// Valor predefinido: *"5"* + /// Valor predefinido: *5* pub max_pool_size: u32, } @@ -92,53 +90,39 @@ pub struct Log { pub struct Server { /// Valor predefinido: *"localhost"* pub bind_address: String, - /// Valor predefinido: *"8088"* + /// Valor predefinido: *8088* pub bind_port: u16, } -/// Declara y asigna los valores predefinidos de los ajustes globales para la estructura -/// [`Settings`]. -/// -/// ``` -/// use pagetop::prelude::*; -/// -/// fn demo() { -/// println!("App name: {}", &SETTINGS.app.name); -/// println!("App description: {}", &SETTINGS.app.description); -/// println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); -/// } -/// ``` -pub static SETTINGS: LazyStatic<Settings> = LazyStatic::new(|| { - config::try_into::<Settings>(predefined_settings!( - // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Bootsier", - "app.language" => "en-US", - "app.direction" => "ltr", - "app.startup_banner" => "Slant", +pub_config!(SETTINGS: Settings, + // [app] + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Bootsier", + "app.language" => "en-US", + "app.direction" => "ltr", + "app.startup_banner" => "Slant", - // [database] - "database.db_type" => "", - "database.db_name" => "", - "database.db_user" => "", - "database.db_pass" => "", - "database.db_host" => "localhost", - "database.db_port" => "0", - "database.max_pool_size" => "5", + // [database] + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", + "database.db_host" => "localhost", + "database.db_port" => 0, + "database.max_pool_size" => 5, - // [dev] - "dev.static_files" => "", + // [dev] + "dev.static_files" => "", - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", - // [server] - "server.bind_address" => "localhost", - "server.bind_port" => "8088" - )) -}); + // [server] + "server.bind_address" => "localhost", + "server.bind_port" => 8088, +); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index cff20237..318e47e5 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -50,9 +50,8 @@ //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Y luego declara con [`LazyStatic`] tus ajustes, usando tipos seguros mediante -//! [`config::try_into<S>()`](try_into) y asignando los valores predefinidos directamente con la -//! macro [`predefined_settings!`](crate::predefined_settings) para la estructura asociada: +//! Y luego declara con la macro [`pub_config!`](crate::pub_config) tus ajustes, usando tipos +//! seguros y asignando los valores predefinidos para la estructura asociada: //! //! ``` //! use pagetop::prelude::*; @@ -71,14 +70,12 @@ //! pub height: u16, //! } //! -//! pub static MY_SETTINGS: LazyStatic<MySettings> = LazyStatic::new(|| { -//! config::try_into::<MySettings>(predefined_settings!( -//! // [myapp] -//! "myapp.name" => "Value Name", -//! "myapp.width" => "900", -//! "myapp.height" => "320" -//! )) -//! }); +//! pub_config!(MY_SETTINGS: MySettings, +//! // [myapp] +//! "myapp.name" => "Value Name", +//! "myapp.width" => 900, +//! "myapp.height" => 320, +//! ); //! ``` //! //! De hecho, así se declaran los ajustes globales de la configuración (ver @@ -100,7 +97,15 @@ //! # Cómo usar tus nuevos ajustes de configuración //! //! ``` -//! fn demo() { +//! use pagetop::prelude::*; +//! +//! fn global_settings() { +//! println!("App name: {}", &SETTINGS.app.name); +//! println!("App description: {}", &SETTINGS.app.description); +//! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); +//! } +//! +//! fn module_settings() { //! println!("{} - {:?}", &MY_SETTINGS.myapp.name, &MY_SETTINGS.myapp.description); //! println!("{}", &MY_SETTINGS.myapp.width); //! } @@ -119,39 +124,14 @@ use crate::LazyStatic; use crate::config::data::ConfigData; use crate::config::file::File; -use std::collections::HashMap; use std::env; -use serde::Deserialize; - -/// Un *HashMap* con una lista de literales `"clave" => "valor"` para asignar ajustes de -/// configuración predefinidos. -/// -/// Ver [`cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). -pub type PredefinedSettings = HashMap<&'static str, &'static str>; - -#[macro_export] -/// Macro para crear e inicializar un *HashMap* ([`PredefinedSettings`]) con una lista de literales -/// `"clave" => "valor"` para asignar los ajustes de configuración predefinidos. -/// -/// Ver [`cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). -macro_rules! predefined_settings { - ( $($key:literal => $value:literal),* ) => {{ - #[allow(unused_mut)] - let mut a = $crate::config::PredefinedSettings::new(); - $( - a.insert($key, $value); - )* - a - }}; -} - /// Directorio donde se encuentran los archivos de configuración. const CONFIG_DIR: &str = "config"; /// Todos los valores originales de la configuración en forma de pares `clave = valor` recogidos de /// los archivos de configuración. -static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { +pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto 'default'. let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); @@ -176,22 +156,27 @@ static CONFIG_DATA: LazyStatic<ConfigData> = LazyStatic::new(|| { settings }); -/// Asigna los ajustes de configuración de tu módulo usando tipos seguros y valores predefinidos -/// para la estructura asociada S. +#[macro_export] +/// Asigna los ajustes de configuración de tu módulo usando tipos seguros y valores predefinidos. /// /// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// -/// Ver [`Cómo añadir ajustes de configuración`](index.html#cómo-añadir-ajustes-de-configuración). -pub fn try_into<S>(values: PredefinedSettings) -> S -where - S: Deserialize<'static>, -{ - let mut settings = CONFIG_DATA.clone(); - for (key, value) in values.iter() { - settings.set_default(key, *value).unwrap(); - } - match settings.try_into() { - Ok(s) => s, - Err(e) => panic!("Error parsing settings: {}", e), - } +/// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). +macro_rules! pub_config { + ( $S:ident: $t:ty $(, $k:literal => $v:literal)*$(,)* ) => { crate::doc_comment! { + concat!( + "Declara y asigna los valores predefinidos para los ajustes de configuración ", + "asociados a la estructura [`", stringify!($t), "`]." + ), + pub static $S: $crate::LazyStatic<$t> = $crate::LazyStatic::new(|| { + let mut settings = $crate::config::CONFIG.clone(); + $( + settings.set_default($k, $v).unwrap(); + )* + match settings.try_into() { + Ok(s) => s, + Err(e) => panic!("Error parsing settings: {}", e), + } + }); + }}; } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index a61ee3ad..ff543aed 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -40,11 +40,11 @@ // GLOBAL. pub use concat_string::concat_string; +pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; // LOCAL. -#[allow(unused_imports)] pub(crate) use futures::executor::block_on as run_now; // APIs PÚBLICAS. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index ab2d1df4..de5b762f 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,9 +2,7 @@ pub use crate::{concat_string, LazyStatic}; // Macros. -pub use crate::{ - args, configure_service_for_static_files, predefined_settings, pub_handle, pub_locale, -}; +pub use crate::{args, configure_service_for_static_files, pub_config, pub_handle, pub_locale}; // Helpers. pub use crate::util; From aa9f392ba92f15201186bd0f7b79842027bff656 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 21:43:38 +0100 Subject: [PATCH 225/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[global]=20Para=20?= =?UTF-8?q?acceder=20a=20elementos=20globales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/lib.rs | 2 +- pagetop/src/app.rs | 3 --- pagetop/src/app/application.rs | 9 +++----- pagetop/src/app/banner.rs | 14 ++++++------ pagetop/src/app/banner/figfont.rs | 7 +++--- pagetop/src/app/db.rs | 29 ++++++++++++------------ pagetop/src/app/locale.rs | 7 +++--- pagetop/src/app/tracing.rs | 17 +++++++------- pagetop/src/base/module/homepage.rs | 7 ++++-- pagetop/src/config.rs | 6 ++--- pagetop/src/core/theme/definition.rs | 8 +++---- pagetop/src/{app/config.rs => global.rs} | 2 -- pagetop/src/lib.rs | 3 +++ pagetop/src/prelude.rs | 3 ++- pagetop/src/response/page/context.rs | 6 ++--- pagetop/src/response/page/definition.rs | 10 ++++---- pagetop/src/util.rs | 2 +- 17 files changed, 64 insertions(+), 71 deletions(-) rename pagetop/src/{app/config.rs => global.rs} (98%) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 6b192af8..b527b7c6 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -58,7 +58,7 @@ fn form_login() -> Form { t( "username_help", &args![ - "app" => SETTINGS.app.name.to_owned() + "app" => global::SETTINGS.app.name.to_owned() ], ) .as_str(), diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index cb5a3f79..843a32b5 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -4,9 +4,6 @@ pub use actix_web::{ pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; -pub mod config; -pub use config::SETTINGS; - mod banner; mod tracing; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 5482992c..4b0e0ff9 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,10 +1,10 @@ use super::fatal_error::FatalError; -use super::SETTINGS; + use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; -use crate::LazyStatic; +use crate::{global, LazyStatic}; use actix_web::dev::Server; @@ -19,9 +19,6 @@ impl Application { // Rótulo de presentación. super::banner::print_on_startup(); - // Inicializa la configuración global. - LazyStatic::force(&super::config::SETTINGS); - // Inicia registro de trazas y eventos. LazyStatic::force(&super::tracing::TRACING); @@ -58,7 +55,7 @@ impl Application { }) .bind(format!( "{}:{}", - &SETTINGS.server.bind_address, &SETTINGS.server.bind_port + &global::SETTINGS.server.bind_address, &global::SETTINGS.server.bind_port ))? .run(); diff --git a/pagetop/src/app/banner.rs b/pagetop/src/app/banner.rs index 43222d2b..40697c71 100644 --- a/pagetop/src/app/banner.rs +++ b/pagetop/src/app/banner.rs @@ -1,23 +1,23 @@ mod figfont; use figfont::FIGFONT; -use super::SETTINGS; +use crate::global; use substring::Substring; pub fn print_on_startup() { - if SETTINGS.app.startup_banner.to_lowercase() != "off" { + if global::SETTINGS.app.startup_banner.to_lowercase() != "off" { if let Some((term_width, _)) = term_size::dimensions() { if term_width >= 80 { let maxlen = (term_width / 10) - 2; - let mut app = SETTINGS.app.name.substring(0, maxlen).to_owned(); - if SETTINGS.app.name.len() > maxlen { + let mut app = global::SETTINGS.app.name.substring(0, maxlen).to_owned(); + if global::SETTINGS.app.name.len() > maxlen { app = format!("{}...", app); } println!( "\n{} {}\n\n Powered by PageTop {}\n", FIGFONT.convert(&app).unwrap(), - &SETTINGS.app.description, + &global::SETTINGS.app.description, env!("CARGO_PKG_VERSION") ); return; @@ -25,8 +25,8 @@ pub fn print_on_startup() { } println!( "\n{}\n{}\n\nPowered by PageTop {}\n", - &SETTINGS.app.name, - &SETTINGS.app.description, + &global::SETTINGS.app.name, + &global::SETTINGS.app.description, env!("CARGO_PKG_VERSION") ); } diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index 31c6c8e2..880a3342 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -1,5 +1,4 @@ -use crate::app::SETTINGS; -use crate::LazyStatic; +use crate::{global, LazyStatic}; use figlet_rs::FIGfont; @@ -9,7 +8,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { let speed = include_str!("speed.flf"); let starwars = include_str!("starwars.flf"); - FIGfont::from_content(match SETTINGS.app.startup_banner.to_lowercase().as_str() { + FIGfont::from_content(match global::SETTINGS.app.startup_banner.to_lowercase().as_str() { "off" => slant, "slant" => slant, "small" => small, @@ -18,7 +17,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { _ => { println!( "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check settings files.", - SETTINGS.app.startup_banner, + global::SETTINGS.app.startup_banner, ); slant } diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 1073e609..44491b67 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,6 +1,5 @@ -use super::SETTINGS; use crate::db::*; -use crate::{run_now, trace, LazyStatic}; +use crate::{global, run_now, trace, LazyStatic}; use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; use tracing_unwrap::ResultExt; @@ -8,38 +7,38 @@ use tracing_unwrap::ResultExt; pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", - &SETTINGS.database.db_name, - &SETTINGS.database.max_pool_size + &global::SETTINGS.database.db_name, + &global::SETTINGS.database.max_pool_size ); - let db_uri = match SETTINGS.database.db_type.as_str() { + let db_uri = match global::SETTINGS.database.db_type.as_str() { "mysql" | "postgres" => { let mut tmp_uri = DbUri::parse( format!( "{}://{}/{}", - &SETTINGS.database.db_type, - &SETTINGS.database.db_host, - &SETTINGS.database.db_name + &global::SETTINGS.database.db_type, + &global::SETTINGS.database.db_host, + &global::SETTINGS.database.db_name ) .as_str(), ) .unwrap(); tmp_uri - .set_username(SETTINGS.database.db_user.as_str()) + .set_username(global::SETTINGS.database.db_user.as_str()) .unwrap(); // https://github.com/launchbadge/sqlx/issues/1624 tmp_uri - .set_password(Some(SETTINGS.database.db_pass.as_str())) + .set_password(Some(global::SETTINGS.database.db_pass.as_str())) .unwrap(); - if SETTINGS.database.db_port != 0 { - tmp_uri.set_port(Some(SETTINGS.database.db_port)).unwrap(); + if global::SETTINGS.database.db_port != 0 { + tmp_uri.set_port(Some(global::SETTINGS.database.db_port)).unwrap(); } tmp_uri } "sqlite" => DbUri::parse( format!( "{}://{}", - &SETTINGS.database.db_type, &SETTINGS.database.db_name + &global::SETTINGS.database.db_type, &global::SETTINGS.database.db_name ) .as_str(), ) @@ -47,7 +46,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { _ => { trace::error!( "Unrecognized database type \"{}\"", - &SETTINGS.database.db_type + &global::SETTINGS.database.db_type ); DbUri::parse("").unwrap() } @@ -55,7 +54,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { run_now(Database::connect::<ConnectOptions>({ let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(SETTINGS.database.max_pool_size); + db_opt.max_connections(global::SETTINGS.database.max_pool_size); db_opt })) .expect_or_log("Failed to connect to database") diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index 06172362..e6e1c4ef 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -1,5 +1,4 @@ -use super::SETTINGS; -use crate::{trace, LazyStatic}; +use crate::{global, trace, LazyStatic}; use unic_langid::LanguageIdentifier; @@ -7,14 +6,14 @@ use unic_langid::LanguageIdentifier; /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// de la aplicación, obtenido de `SETTINGS.app.language`. pub static LANGID: LazyStatic<LanguageIdentifier> = - LazyStatic::new(|| match SETTINGS.app.language.parse() { + LazyStatic::new(|| match global::SETTINGS.app.language.parse() { Ok(language) => language, Err(_) => { trace::warn!( "{}, {} \"{}\"! {}, {}", "Failed to parse language", "unrecognized Unicode Language Identifier", - SETTINGS.app.language, + global::SETTINGS.app.language, "Using \"en-US\"", "check the settings file", ); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index 86f1f682..3c7b58a8 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -1,5 +1,4 @@ -use super::SETTINGS; -use crate::LazyStatic; +use crate::{global, LazyStatic}; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; @@ -20,14 +19,14 @@ use tracing_subscriber::EnvFilter; #[rustfmt::skip] pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { let env_filter = - EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); + EnvFilter::try_new(&global::SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); - let rolling = SETTINGS.log.rolling.to_lowercase(); + let rolling = global::SETTINGS.log.rolling.to_lowercase(); let (non_blocking, guard) = match rolling.as_str() { "stdout" => tracing_appender::non_blocking(std::io::stdout()), _ => tracing_appender::non_blocking({ - let path = &SETTINGS.log.path; - let prefix = &SETTINGS.log.prefix; + let path = &global::SETTINGS.log.path; + let prefix = &global::SETTINGS.log.prefix; match rolling.as_str() { "daily" => tracing_appender::rolling::daily(path, prefix), "hourly" => tracing_appender::rolling::hourly(path, prefix), @@ -36,7 +35,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { _ => { println!( "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", - SETTINGS.log.rolling, + global::SETTINGS.log.rolling, ); tracing_appender::rolling::daily(path, prefix) } @@ -47,7 +46,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { .with_env_filter(env_filter) .with_writer(non_blocking) .with_ansi(rolling.as_str() == "stdout"); - match SETTINGS.log.format.to_lowercase().as_str() { + match global::SETTINGS.log.format.to_lowercase().as_str() { "json" => subscriber.json().init(), "full" => subscriber.init(), "compact" => subscriber.compact().init(), @@ -55,7 +54,7 @@ pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { _ => { println!( "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", - SETTINGS.log.format, + global::SETTINGS.log.format, ); subscriber.init(); } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index dee2e7b3..4152acb9 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -57,7 +57,7 @@ fn hello_world() -> Container { (e("hello_intro", &args![ "app" => format!( "<span class=\"app-name\">{}</span>", - &SETTINGS.app.name, + &global::SETTINGS.app.name, ) ])) }) @@ -108,7 +108,10 @@ fn welcome() -> Container { .with_component( Heading::h3(html! { (e("welcome_subtitle", &args![ - "app" => format!("<span class=\"app-name\">{}</span>", &SETTINGS.app.name) + "app" => format!( + "<span class=\"app-name\">{}</span>", + &global::SETTINGS.app.name + ) ])) }) .with_display(HeadingDisplay::Subtitle), diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 318e47e5..a49b0a71 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -100,9 +100,9 @@ //! use pagetop::prelude::*; //! //! fn global_settings() { -//! println!("App name: {}", &SETTINGS.app.name); -//! println!("App description: {}", &SETTINGS.app.description); -//! println!("Value of PAGETOP_RUN_MODE: {}", &SETTINGS.app.run_mode); +//! println!("App name: {}", &global::SETTINGS.app.name); +//! println!("App description: {}", &global::SETTINGS.app.description); +//! println!("Value of PAGETOP_RUN_MODE: {}", &global::SETTINGS.app.run_mode); //! } //! //! fn module_settings() { diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 112bab37..744006d8 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,5 @@ -use crate::app; -use crate::app::SETTINGS; +use crate::{app, concat_string, global}; use crate::base::component::{Container, Html}; -use crate::concat_string; use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; @@ -43,9 +41,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { @match page.title().get() { Some(t) => title { - (concat_string!(SETTINGS.app.name, " | ", t)) + (concat_string!(global::SETTINGS.app.name, " | ", t)) }, - None => title { (SETTINGS.app.name) } + None => title { (global::SETTINGS.app.name) } } @if let Some(d) = page.description().get() { diff --git a/pagetop/src/app/config.rs b/pagetop/src/global.rs similarity index 98% rename from pagetop/src/app/config.rs rename to pagetop/src/global.rs index 4bdac5a2..041216db 100644 --- a/pagetop/src/app/config.rs +++ b/pagetop/src/global.rs @@ -1,5 +1,3 @@ -//! Ajustes globales de la configuración. - use crate::pub_config; use serde::Deserialize; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index ff543aed..d1a06327 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -62,6 +62,9 @@ pub mod html; #[cfg(feature = "database")] pub mod db; +// Acceso a declaraciones globales. +pub mod global; + // Prepara y ejecuta la aplicación. pub mod app; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index de5b762f..852b070f 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -19,11 +19,12 @@ pub use crate::html::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; +pub use crate::global; + pub use crate::app; pub use crate::app::application::Application; pub use crate::app::fatal_error::FatalError; pub use crate::app::HttpMessage; -pub use crate::app::SETTINGS; pub use crate::core::{component::*, hook::*, module::*, theme::*}; diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index cc7d5f36..76a39450 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -1,11 +1,11 @@ use super::PageOp; -use crate::app::SETTINGS; + use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; -use crate::{base, concat_string, util, LazyStatic}; +use crate::{base, concat_string, global, util, LazyStatic}; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = - LazyStatic::new(|| match theme_by_single_name(&SETTINGS.app.theme) { + LazyStatic::new(|| match theme_by_single_name(&global::SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, }); diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 118dbfed..97e58645 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,15 +1,15 @@ use super::{BeforeRenderPageHook, PageContext, PageOp, ResultPage, HOOK_BEFORE_RENDER_PAGE}; + use crate::app::fatal_error::FatalError; -use crate::app::SETTINGS; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; -use crate::{trace, LazyStatic}; +use crate::{global, trace, LazyStatic}; use std::collections::HashMap; static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { - let language = SETTINGS.app.language[..2].to_lowercase(); + let language = global::SETTINGS.app.language[..2].to_lowercase(); if !language.is_empty() { Some(language) } else { @@ -18,7 +18,7 @@ static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { }); static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { - let direction = SETTINGS.app.direction.to_lowercase(); + let direction = global::SETTINGS.app.direction.to_lowercase(); match direction.as_str() { "auto" => Some("auto".to_owned()), "ltr" => Some("ltr".to_owned()), @@ -27,7 +27,7 @@ static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { _ => { trace::warn!( "Text direction \"{}\" not valid, {}", - SETTINGS.app.direction, + global::SETTINGS.app.direction, "check the settings file" ); None diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 91d9c07d..e926966e 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -169,7 +169,7 @@ macro_rules! args { #[macro_export] macro_rules! configure_service_for_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ - let static_files = &$crate::app::SETTINGS.dev.static_files; + let static_files = &$crate::global::SETTINGS.dev.static_files; if static_files.is_empty() { $cfg.service($crate::app::ResourceFiles::new($dir, $embed())); } else { From c7bf549434abe86481d8f2c29bb4a21893c33c5d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 21:55:53 +0100 Subject: [PATCH 226/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[global]=20Incorpo?= =?UTF-8?q?ra=20registro=20de=20trazas=20y=20eventos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 2 - pagetop/src/app/application.rs | 2 +- pagetop/src/app/tracing.rs | 64 -------------------------------- pagetop/src/config.rs | 4 +- pagetop/src/global.rs | 67 +++++++++++++++++++++++++++++++++- 5 files changed, 69 insertions(+), 70 deletions(-) delete mode 100644 pagetop/src/app/tracing.rs diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 843a32b5..45ebc351 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,8 +6,6 @@ pub use actix_web_static_files::ResourceFiles; mod banner; -mod tracing; - pub mod locale; #[cfg(feature = "database")] diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 4b0e0ff9..28145164 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -20,7 +20,7 @@ impl Application { super::banner::print_on_startup(); // Inicia registro de trazas y eventos. - LazyStatic::force(&super::tracing::TRACING); + LazyStatic::force(&global::TRACING); // Valida el identificador de idioma. LazyStatic::force(&super::locale::LANGID); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs deleted file mode 100644 index 3c7b58a8..00000000 --- a/pagetop/src/app/tracing.rs +++ /dev/null @@ -1,64 +0,0 @@ -use crate::{global, LazyStatic}; - -use tracing_appender::non_blocking::WorkerGuard; -use tracing_subscriber::EnvFilter; - -/// Registro de trazas y eventos de la aplicación. -/// -/// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de -/// escritura sin bloqueo (*non-blocking writer*) que actúa periódicamente en -/// vez de enviar cada traza o evento al instante. Si el programa termina -/// abruptamente (por ejemplo, por un panic! o un std::process::exit), es -/// posible que algunas trazas o eventos no se envíen. -/// -/// Puesto que las trazas o eventos registrados poco antes de la caída de una -/// aplicación suelen ser importantes para diagnosticar la causa del fallo, con -/// `Lazy<WorkerGuard>` se garantiza que todos los registros almacenados se -/// enviarán antes de terminar la ejecución. - -#[rustfmt::skip] -pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { - let env_filter = - EnvFilter::try_new(&global::SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); - - let rolling = global::SETTINGS.log.rolling.to_lowercase(); - let (non_blocking, guard) = match rolling.as_str() { - "stdout" => tracing_appender::non_blocking(std::io::stdout()), - _ => tracing_appender::non_blocking({ - let path = &global::SETTINGS.log.path; - let prefix = &global::SETTINGS.log.prefix; - match rolling.as_str() { - "daily" => tracing_appender::rolling::daily(path, prefix), - "hourly" => tracing_appender::rolling::hourly(path, prefix), - "minutely" => tracing_appender::rolling::minutely(path, prefix), - "endless" => tracing_appender::rolling::never(path, prefix), - _ => { - println!( - "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", - global::SETTINGS.log.rolling, - ); - tracing_appender::rolling::daily(path, prefix) - } - } - }), - }; - let subscriber = tracing_subscriber::fmt() - .with_env_filter(env_filter) - .with_writer(non_blocking) - .with_ansi(rolling.as_str() == "stdout"); - match global::SETTINGS.log.format.to_lowercase().as_str() { - "json" => subscriber.json().init(), - "full" => subscriber.init(), - "compact" => subscriber.compact().init(), - "pretty" => subscriber.pretty().init(), - _ => { - println!( - "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", - global::SETTINGS.log.format, - ); - subscriber.init(); - } - } - - guard -}); diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index a49b0a71..f70276d8 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -79,11 +79,11 @@ //! ``` //! //! De hecho, así se declaran los ajustes globales de la configuración (ver -//! [`SETTINGS`](crate::app::config::SETTINGS)). +//! [`SETTINGS`](crate::global::SETTINGS)). //! //! Puedes usar la [sintaxis TOML](https://toml.io/en/v1.0.0#table) para añadir tu nueva sección //! `[myapp]` en los archivos de configuración, del mismo modo que se añaden `[log]` o `[server]` en -//! los ajustes globales (ver [`Settings`](crate::app::config::Settings)). +//! los ajustes globales (ver [`Settings`](crate::global::Settings)). //! //! Se recomienda inicializar todos los ajustes con valores predefinidos, o utilizar la notación //! `Option<T>` si van a ser tratados en el código como opcionales. diff --git a/pagetop/src/global.rs b/pagetop/src/global.rs index 041216db..ce687ff4 100644 --- a/pagetop/src/global.rs +++ b/pagetop/src/global.rs @@ -1,7 +1,12 @@ -use crate::pub_config; +use crate::{pub_config, LazyStatic}; use serde::Deserialize; +use tracing_appender::non_blocking::WorkerGuard; +use tracing_subscriber::EnvFilter; + +// CONFIGURACIÓN *********************************************************************************** + #[derive(Debug, Deserialize)] /// Ajustes globales para las secciones reservadas [`[app]`](App), [`[database]`](Database), /// [`[dev]`](Dev), [`[log]`](Log) y [`[server]`](Server) (ver [`SETTINGS`]). @@ -124,3 +129,63 @@ pub_config!(SETTINGS: Settings, "server.bind_address" => "localhost", "server.bind_port" => 8088, ); + +// REGISTRO DE TRAZAS Y EVENTOS ******************************************************************** + +/// Registro de trazas y eventos de la aplicación. +/// +/// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de escritura sin bloqueo +/// (*non-blocking writer*) que actúa periódicamente en vez de enviar cada traza o evento al +/// instante. Si el programa termina abruptamente (por ejemplo, por un panic! o un +/// std::process::exit), es posible que algunas trazas o eventos no se envíen. +/// +/// Puesto que las trazas o eventos registrados poco antes de la caída de una aplicación suelen ser +/// importantes para diagnosticar la causa del fallo, con `Lazy<WorkerGuard>` se garantiza que todos +/// los registros almacenados se enviarán antes de terminar la ejecución. + +#[rustfmt::skip] +pub(crate) static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { + let env_filter = + EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); + + let rolling = SETTINGS.log.rolling.to_lowercase(); + let (non_blocking, guard) = match rolling.as_str() { + "stdout" => tracing_appender::non_blocking(std::io::stdout()), + _ => tracing_appender::non_blocking({ + let path = &SETTINGS.log.path; + let prefix = &SETTINGS.log.prefix; + match rolling.as_str() { + "daily" => tracing_appender::rolling::daily(path, prefix), + "hourly" => tracing_appender::rolling::hourly(path, prefix), + "minutely" => tracing_appender::rolling::minutely(path, prefix), + "endless" => tracing_appender::rolling::never(path, prefix), + _ => { + println!( + "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", + SETTINGS.log.rolling, + ); + tracing_appender::rolling::daily(path, prefix) + } + } + }), + }; + let subscriber = tracing_subscriber::fmt() + .with_env_filter(env_filter) + .with_writer(non_blocking) + .with_ansi(rolling.as_str() == "stdout"); + match SETTINGS.log.format.to_lowercase().as_str() { + "json" => subscriber.json().init(), + "full" => subscriber.init(), + "compact" => subscriber.compact().init(), + "pretty" => subscriber.pretty().init(), + _ => { + println!( + "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", + SETTINGS.log.format, + ); + subscriber.init(); + } + } + + guard +}); From e143ee57ac8729a97062c2a259363b28b7b9757d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 22:02:12 +0100 Subject: [PATCH 227/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[global]=20Incorpo?= =?UTF-8?q?ra=20identificador=20de=20idioma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 2 -- pagetop/src/app/application.rs | 2 +- pagetop/src/app/locale.rs | 22 ---------------------- pagetop/src/global.rs | 25 ++++++++++++++++++++++++- pagetop/src/locale.rs | 8 ++++---- 5 files changed, 29 insertions(+), 30 deletions(-) delete mode 100644 pagetop/src/app/locale.rs diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 45ebc351..5654cea6 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,8 +6,6 @@ pub use actix_web_static_files::ResourceFiles; mod banner; -pub mod locale; - #[cfg(feature = "database")] pub mod db; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 28145164..97b9cf26 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -23,7 +23,7 @@ impl Application { LazyStatic::force(&global::TRACING); // Valida el identificador de idioma. - LazyStatic::force(&super::locale::LANGID); + LazyStatic::force(&global::LANGID); #[cfg(feature = "database")] // Conecta con la base de datos. diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs deleted file mode 100644 index e6e1c4ef..00000000 --- a/pagetop/src/app/locale.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::{global, trace, LazyStatic}; - -use unic_langid::LanguageIdentifier; - -/// Almacena el Identificador de Idioma Unicode -/// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) -/// de la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: LazyStatic<LanguageIdentifier> = - LazyStatic::new(|| match global::SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "{}, {} \"{}\"! {}, {}", - "Failed to parse language", - "unrecognized Unicode Language Identifier", - global::SETTINGS.app.language, - "Using \"en-US\"", - "check the settings file", - ); - "en-US".parse().unwrap() - } - }); diff --git a/pagetop/src/global.rs b/pagetop/src/global.rs index ce687ff4..de87ceb5 100644 --- a/pagetop/src/global.rs +++ b/pagetop/src/global.rs @@ -1,10 +1,12 @@ -use crate::{pub_config, LazyStatic}; +use crate::{pub_config, trace, LazyStatic}; use serde::Deserialize; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; +use unic_langid::LanguageIdentifier; + // CONFIGURACIÓN *********************************************************************************** #[derive(Debug, Deserialize)] @@ -189,3 +191,24 @@ pub(crate) static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { guard }); + +// LOCALIZACIÓN ************************************************************************************ + +/// Almacena el Identificador de Idioma Unicode +/// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) +/// de la aplicación, obtenido de `SETTINGS.app.language`. +pub static LANGID: LazyStatic<LanguageIdentifier> = + LazyStatic::new(|| match SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "{}, {} \"{}\"! {}, {}", + "Failed to parse language", + "unrecognized Unicode Language Identifier", + SETTINGS.app.language, + "Using \"en-US\"", + "check the settings file", + ); + "en-US".parse().unwrap() + } + }); diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 5b8b53da..9750d314 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -102,8 +102,8 @@ pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; /// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! pub_locale { ( $dir_locales:literal $(, $core_locales:literal)? ) => { + use $crate::global; use $crate::locale::*; - use $crate::app::locale::LANGID; static_locale! { static LOCALES = { @@ -118,7 +118,7 @@ macro_rules! pub_locale { #[allow(dead_code)] fn l(key: &str) -> String { - LOCALES.lookup(&LANGID, key).unwrap_or(key.to_string()) + LOCALES.lookup(&global::LANGID, key).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -126,7 +126,7 @@ macro_rules! pub_locale { key: &str, args: &std::collections::HashMap<String, FluentValue> ) -> String { - LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) + LOCALES.lookup_with_args(&global::LANGID, key, args).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -135,7 +135,7 @@ macro_rules! pub_locale { args: &std::collections::HashMap<String, FluentValue> ) -> $crate::html::PreEscaped<String> { $crate::html::PreEscaped( - LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) + LOCALES.lookup_with_args(&global::LANGID, key, args).unwrap_or(key.to_string()) ) } }; From 19b4c251b0b3ce99c10d834d87e916495ebecb70 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 22:41:44 +0100 Subject: [PATCH 228/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20[global]=20Despivo?= =?UTF-8?q?ta=20acceso=20a=20base=20de=20datos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m20220312_000001_create_table_role.rs | 2 +- pagetop/src/app.rs | 3 - pagetop/src/app/application.rs | 2 +- pagetop/src/app/db.rs | 95 ----------------- pagetop/src/core/module/all.rs | 5 +- pagetop/src/db.rs | 100 ++++++++++++++++++ 6 files changed, 105 insertions(+), 102 deletions(-) delete mode 100644 pagetop/src/app/db.rs diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index eeb3abed..f1fa802c 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -51,7 +51,7 @@ impl MigrationTrait for Migration { .await?; // Built-in roles. - app::db::exec::<InsertStatement>( + db::exec::<InsertStatement>( Query::insert() .into_table(Role::Table) .columns(vec![Role::Name, Role::Weight]) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 5654cea6..901b50bf 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,9 +6,6 @@ pub use actix_web_static_files::ResourceFiles; mod banner; -#[cfg(feature = "database")] -pub mod db; - pub mod application; pub mod fatal_error; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 97b9cf26..14a32d45 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -27,7 +27,7 @@ impl Application { #[cfg(feature = "database")] // Conecta con la base de datos. - LazyStatic::force(&super::db::DBCONN); + LazyStatic::force(&crate::db::DBCONN); // Registra los módulos de la aplicación. module::all::register_modules(app); diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs deleted file mode 100644 index 44491b67..00000000 --- a/pagetop/src/app/db.rs +++ /dev/null @@ -1,95 +0,0 @@ -use crate::db::*; -use crate::{global, run_now, trace, LazyStatic}; - -use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; -use tracing_unwrap::ResultExt; - -pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { - trace::info!( - "Connecting to database \"{}\" using a pool of {} connections", - &global::SETTINGS.database.db_name, - &global::SETTINGS.database.max_pool_size - ); - - let db_uri = match global::SETTINGS.database.db_type.as_str() { - "mysql" | "postgres" => { - let mut tmp_uri = DbUri::parse( - format!( - "{}://{}/{}", - &global::SETTINGS.database.db_type, - &global::SETTINGS.database.db_host, - &global::SETTINGS.database.db_name - ) - .as_str(), - ) - .unwrap(); - tmp_uri - .set_username(global::SETTINGS.database.db_user.as_str()) - .unwrap(); - // https://github.com/launchbadge/sqlx/issues/1624 - tmp_uri - .set_password(Some(global::SETTINGS.database.db_pass.as_str())) - .unwrap(); - if global::SETTINGS.database.db_port != 0 { - tmp_uri.set_port(Some(global::SETTINGS.database.db_port)).unwrap(); - } - tmp_uri - } - "sqlite" => DbUri::parse( - format!( - "{}://{}", - &global::SETTINGS.database.db_type, &global::SETTINGS.database.db_name - ) - .as_str(), - ) - .unwrap(), - _ => { - trace::error!( - "Unrecognized database type \"{}\"", - &global::SETTINGS.database.db_type - ); - DbUri::parse("").unwrap() - } - }; - - run_now(Database::connect::<ConnectOptions>({ - let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(global::SETTINGS.database.max_pool_size); - db_opt - })) - .expect_or_log("Failed to connect to database") -}); - -static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| DBCONN.get_database_backend()); - -pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { - DBCONN - .query_all(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await -} - -pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { - DBCONN - .query_one(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await -} - -pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { - DBCONN - .execute(Statement::from_string(*DBBACKEND, stmt)) - .await -} diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 2bbc21e2..021e7df9 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,4 +1,5 @@ use super::ModuleStaticRef; + use crate::core::hook::add_action; use crate::core::theme; use crate::{app, trace, LazyStatic}; @@ -109,7 +110,7 @@ pub fn run_migrations() { migrations } } - Migrator::up(&app::db::DBCONN, None) + Migrator::up(&DBCONN, None) }) .unwrap(); @@ -124,7 +125,7 @@ pub fn run_migrations() { migrations } } - Migrator::down(&app::db::DBCONN, None) + Migrator::down(&DBCONN, None) }) .unwrap(); } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index a6639943..06638114 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,7 +1,13 @@ +use crate::{global, run_now, trace, LazyStatic}; + pub use url::Url as DbUri; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; +use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; +use tracing_unwrap::ResultExt; + + // El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.9.1) // https://github.com/SeaQL/sea-orm/tree/0.9.1/sea-orm-migration para evitar los errores generados // por el paradigma modular de PageTop. Se copian los siguientes archivos del original: @@ -36,3 +42,97 @@ macro_rules! migration_item { Box::new(migration::$migration_module::Migration) }}; } + + +pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { + trace::info!( + "Connecting to database \"{}\" using a pool of {} connections", + &global::SETTINGS.database.db_name, + &global::SETTINGS.database.max_pool_size + ); + + let db_uri = match global::SETTINGS.database.db_type.as_str() { + "mysql" | "postgres" => { + let mut tmp_uri = DbUri::parse( + format!( + "{}://{}/{}", + &global::SETTINGS.database.db_type, + &global::SETTINGS.database.db_host, + &global::SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(); + tmp_uri + .set_username(global::SETTINGS.database.db_user.as_str()) + .unwrap(); + // https://github.com/launchbadge/sqlx/issues/1624 + tmp_uri + .set_password(Some(global::SETTINGS.database.db_pass.as_str())) + .unwrap(); + if global::SETTINGS.database.db_port != 0 { + tmp_uri.set_port(Some(global::SETTINGS.database.db_port)).unwrap(); + } + tmp_uri + } + "sqlite" => DbUri::parse( + format!( + "{}://{}", + &global::SETTINGS.database.db_type, &global::SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(), + _ => { + trace::error!( + "Unrecognized database type \"{}\"", + &global::SETTINGS.database.db_type + ); + DbUri::parse("").unwrap() + } + }; + + run_now(Database::connect::<ConnectOptions>({ + let mut db_opt = ConnectOptions::new(db_uri.to_string()); + db_opt.max_connections(global::SETTINGS.database.max_pool_size); + db_opt + })) + .expect_or_log("Failed to connect to database") +}); + + +static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| + DBCONN.get_database_backend() +); + +pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { + DBCONN + .query_all(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await +} + +pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { + DBCONN + .query_one(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await +} + +pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { + DBCONN + .execute(Statement::from_string(*DBBACKEND, stmt)) + .await +} From da8604980dfece8c0c2b8987cb3fccd17e13ca95 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 23:41:18 +0100 Subject: [PATCH 229/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Revierte=20parcial?= =?UTF-8?q?mente=20=C3=BAltimos=20cambios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/lib.rs | 2 +- .../m20220312_000001_create_table_role.rs | 2 +- pagetop/src/app.rs | 7 + pagetop/src/app/application.rs | 10 +- pagetop/src/app/banner.rs | 15 +- pagetop/src/app/banner/figfont.rs | 6 +- pagetop/src/app/db.rs | 99 ++++++++ pagetop/src/app/locale.rs | 24 ++ pagetop/src/app/tracing.rs | 63 ++++++ pagetop/src/base/module/homepage.rs | 4 +- pagetop/src/config.rs | 127 +++++++++++ pagetop/src/core/module/all.rs | 4 +- pagetop/src/core/theme/definition.rs | 6 +- pagetop/src/db.rs | 99 -------- pagetop/src/global.rs | 214 ------------------ pagetop/src/lib.rs | 3 - pagetop/src/locale.rs | 8 +- pagetop/src/prelude.rs | 2 - pagetop/src/response/page/context.rs | 4 +- pagetop/src/response/page/definition.rs | 8 +- pagetop/src/util.rs | 2 +- 21 files changed, 356 insertions(+), 353 deletions(-) create mode 100644 pagetop/src/app/db.rs create mode 100644 pagetop/src/app/locale.rs create mode 100644 pagetop/src/app/tracing.rs delete mode 100644 pagetop/src/global.rs diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index b527b7c6..0bf8df5c 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -58,7 +58,7 @@ fn form_login() -> Form { t( "username_help", &args![ - "app" => global::SETTINGS.app.name.to_owned() + "app" => config::SETTINGS.app.name.to_owned() ], ) .as_str(), diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index f1fa802c..eeb3abed 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -51,7 +51,7 @@ impl MigrationTrait for Migration { .await?; // Built-in roles. - db::exec::<InsertStatement>( + app::db::exec::<InsertStatement>( Query::insert() .into_table(Role::Table) .columns(vec![Role::Name, Role::Weight]) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 901b50bf..843a32b5 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,6 +6,13 @@ pub use actix_web_static_files::ResourceFiles; mod banner; +mod tracing; + +pub mod locale; + +#[cfg(feature = "database")] +pub mod db; + pub mod application; pub mod fatal_error; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 14a32d45..2bd53e00 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -4,7 +4,7 @@ use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; -use crate::{global, LazyStatic}; +use crate::{config, LazyStatic}; use actix_web::dev::Server; @@ -20,14 +20,14 @@ impl Application { super::banner::print_on_startup(); // Inicia registro de trazas y eventos. - LazyStatic::force(&global::TRACING); + LazyStatic::force(&super::tracing::TRACING); // Valida el identificador de idioma. - LazyStatic::force(&global::LANGID); + LazyStatic::force(&super::locale::LANGID); #[cfg(feature = "database")] // Conecta con la base de datos. - LazyStatic::force(&crate::db::DBCONN); + LazyStatic::force(&super::db::DBCONN); // Registra los módulos de la aplicación. module::all::register_modules(app); @@ -55,7 +55,7 @@ impl Application { }) .bind(format!( "{}:{}", - &global::SETTINGS.server.bind_address, &global::SETTINGS.server.bind_port + &config::SETTINGS.server.bind_address, &config::SETTINGS.server.bind_port ))? .run(); diff --git a/pagetop/src/app/banner.rs b/pagetop/src/app/banner.rs index 40697c71..01b8aee2 100644 --- a/pagetop/src/app/banner.rs +++ b/pagetop/src/app/banner.rs @@ -1,23 +1,24 @@ mod figfont; use figfont::FIGFONT; -use crate::global; +use crate::config; use substring::Substring; + pub fn print_on_startup() { - if global::SETTINGS.app.startup_banner.to_lowercase() != "off" { + if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { if let Some((term_width, _)) = term_size::dimensions() { if term_width >= 80 { let maxlen = (term_width / 10) - 2; - let mut app = global::SETTINGS.app.name.substring(0, maxlen).to_owned(); - if global::SETTINGS.app.name.len() > maxlen { + let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); + if config::SETTINGS.app.name.len() > maxlen { app = format!("{}...", app); } println!( "\n{} {}\n\n Powered by PageTop {}\n", FIGFONT.convert(&app).unwrap(), - &global::SETTINGS.app.description, + &config::SETTINGS.app.description, env!("CARGO_PKG_VERSION") ); return; @@ -25,8 +26,8 @@ pub fn print_on_startup() { } println!( "\n{}\n{}\n\nPowered by PageTop {}\n", - &global::SETTINGS.app.name, - &global::SETTINGS.app.description, + &config::SETTINGS.app.name, + &config::SETTINGS.app.description, env!("CARGO_PKG_VERSION") ); } diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index 880a3342..f024c7f9 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -1,4 +1,4 @@ -use crate::{global, LazyStatic}; +use crate::{config, LazyStatic}; use figlet_rs::FIGfont; @@ -8,7 +8,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { let speed = include_str!("speed.flf"); let starwars = include_str!("starwars.flf"); - FIGfont::from_content(match global::SETTINGS.app.startup_banner.to_lowercase().as_str() { + FIGfont::from_content(match config::SETTINGS.app.startup_banner.to_lowercase().as_str() { "off" => slant, "slant" => slant, "small" => small, @@ -17,7 +17,7 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { _ => { println!( "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check settings files.", - global::SETTINGS.app.startup_banner, + config::SETTINGS.app.startup_banner, ); slant } diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs new file mode 100644 index 00000000..8fca109c --- /dev/null +++ b/pagetop/src/app/db.rs @@ -0,0 +1,99 @@ +use crate::{config, run_now, trace, LazyStatic}; +use crate::db::*; + +use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; +use tracing_unwrap::ResultExt; + + +pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { + trace::info!( + "Connecting to database \"{}\" using a pool of {} connections", + &config::SETTINGS.database.db_name, + &config::SETTINGS.database.max_pool_size + ); + + let db_uri = match config::SETTINGS.database.db_type.as_str() { + "mysql" | "postgres" => { + let mut tmp_uri = DbUri::parse( + format!( + "{}://{}/{}", + &config::SETTINGS.database.db_type, + &config::SETTINGS.database.db_host, + &config::SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(); + tmp_uri + .set_username(config::SETTINGS.database.db_user.as_str()) + .unwrap(); + // https://github.com/launchbadge/sqlx/issues/1624 + tmp_uri + .set_password(Some(config::SETTINGS.database.db_pass.as_str())) + .unwrap(); + if config::SETTINGS.database.db_port != 0 { + tmp_uri.set_port(Some(config::SETTINGS.database.db_port)).unwrap(); + } + tmp_uri + } + "sqlite" => DbUri::parse( + format!( + "{}://{}", + &config::SETTINGS.database.db_type, &config::SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(), + _ => { + trace::error!( + "Unrecognized database type \"{}\"", + &config::SETTINGS.database.db_type + ); + DbUri::parse("").unwrap() + } + }; + + run_now(Database::connect::<ConnectOptions>({ + let mut db_opt = ConnectOptions::new(db_uri.to_string()); + db_opt.max_connections(config::SETTINGS.database.max_pool_size); + db_opt + })) + .expect_or_log("Failed to connect to database") +}); + + +static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| + DBCONN.get_database_backend() +); + +pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { + DBCONN + .query_all(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await +} + +pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { + DBCONN + .query_one(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await +} + +pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { + DBCONN + .execute(Statement::from_string(*DBBACKEND, stmt)) + .await +} diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs new file mode 100644 index 00000000..d079791a --- /dev/null +++ b/pagetop/src/app/locale.rs @@ -0,0 +1,24 @@ +use crate::{config, trace, LazyStatic}; + +use unic_langid::LanguageIdentifier; + +// LOCALIZACIÓN ************************************************************************************ + +/// Almacena el Identificador de Idioma Unicode +/// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) +/// global para la aplicación, obtenido de `SETTINGS.app.language`. +pub static LANGID: LazyStatic<LanguageIdentifier> = + LazyStatic::new(|| match config::SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "{}, {} \"{}\"! {}, {}", + "Failed to parse language", + "unrecognized Unicode Language Identifier", + config::SETTINGS.app.language, + "Using \"en-US\"", + "check the settings file", + ); + "en-US".parse().unwrap() + } + }); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs new file mode 100644 index 00000000..01f5ed28 --- /dev/null +++ b/pagetop/src/app/tracing.rs @@ -0,0 +1,63 @@ +use crate::{config, LazyStatic}; + +use tracing_appender::non_blocking::WorkerGuard; +use tracing_subscriber::EnvFilter; + + +/// Registro de trazas y eventos de la aplicación. +/// +/// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de escritura sin bloqueo +/// (*non-blocking writer*) que actúa periódicamente en vez de enviar cada traza o evento al +/// instante. Si el programa termina abruptamente (por ejemplo, por un panic! o un +/// std::process::exit), es posible que algunas trazas o eventos no se envíen. +/// +/// Puesto que las trazas o eventos registrados poco antes de la caída de una aplicación suelen ser +/// importantes para diagnosticar la causa del fallo, con `Lazy<WorkerGuard>` se garantiza que todos +/// los registros almacenados se enviarán antes de terminar la ejecución. + +#[rustfmt::skip] +pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { + let env_filter = + EnvFilter::try_new(&config::SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); + + let rolling = config::SETTINGS.log.rolling.to_lowercase(); + let (non_blocking, guard) = match rolling.as_str() { + "stdout" => tracing_appender::non_blocking(std::io::stdout()), + _ => tracing_appender::non_blocking({ + let path = &config::SETTINGS.log.path; + let prefix = &config::SETTINGS.log.prefix; + match rolling.as_str() { + "daily" => tracing_appender::rolling::daily(path, prefix), + "hourly" => tracing_appender::rolling::hourly(path, prefix), + "minutely" => tracing_appender::rolling::minutely(path, prefix), + "endless" => tracing_appender::rolling::never(path, prefix), + _ => { + println!( + "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", + config::SETTINGS.log.rolling, + ); + tracing_appender::rolling::daily(path, prefix) + } + } + }), + }; + let subscriber = tracing_subscriber::fmt() + .with_env_filter(env_filter) + .with_writer(non_blocking) + .with_ansi(rolling.as_str() == "stdout"); + match config::SETTINGS.log.format.to_lowercase().as_str() { + "json" => subscriber.json().init(), + "full" => subscriber.init(), + "compact" => subscriber.compact().init(), + "pretty" => subscriber.pretty().init(), + _ => { + println!( + "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", + config::SETTINGS.log.format, + ); + subscriber.init(); + } + } + + guard +}); diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 4152acb9..36ebae3c 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -57,7 +57,7 @@ fn hello_world() -> Container { (e("hello_intro", &args![ "app" => format!( "<span class=\"app-name\">{}</span>", - &global::SETTINGS.app.name, + &config::SETTINGS.app.name, ) ])) }) @@ -110,7 +110,7 @@ fn welcome() -> Container { (e("welcome_subtitle", &args![ "app" => format!( "<span class=\"app-name\">{}</span>", - &global::SETTINGS.app.name + &config::SETTINGS.app.name ) ])) }) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index f70276d8..a94499d4 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -124,8 +124,11 @@ use crate::LazyStatic; use crate::config::data::ConfigData; use crate::config::file::File; +use serde::Deserialize; + use std::env; + /// Directorio donde se encuentran los archivos de configuración. const CONFIG_DIR: &str = "config"; @@ -180,3 +183,127 @@ macro_rules! pub_config { }); }}; } + + +#[derive(Debug, Deserialize)] +/// Ajustes globales para las secciones reservadas [`[app]`](App), [`[database]`](Database), +/// [`[dev]`](Dev), [`[log]`](Log) y [`[server]`](Server) (ver [`SETTINGS`]). +pub struct Settings { + pub app: App, + pub database: Database, + pub dev: Dev, + pub log: Log, + pub server: Server, +} + +#[derive(Debug, Deserialize)] +/// Sección `[app]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct App { + /// Valor predefinido: *"PageTop Application"* + pub name: String, + /// Valor predefinido: *"Developed with the amazing PageTop framework."* + pub description: String, + /// Valor predefinido: *"Bootsier"* + pub theme: String, + /// Valor predefinido: *"en-US"* + pub language: String, + /// Valor predefinido: *"ltr"* + pub direction: String, + /// Valor predefinido: *"Slant"* + pub startup_banner: String, + /// Valor predefinido: según variable de entorno PAGETOP_RUN_MODE, o *"default"* si no lo está + pub run_mode: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[database]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Database { + /// Valor predefinido: *""* + pub db_type: String, + /// Valor predefinido: *""* + pub db_name: String, + /// Valor predefinido: *""* + pub db_user: String, + /// Valor predefinido: *""* + pub db_pass: String, + /// Valor predefinido: *"localhost"* + pub db_host: String, + /// Valor predefinido: *0* + pub db_port: u16, + /// Valor predefinido: *5* + pub max_pool_size: u32, +} + +#[derive(Debug, Deserialize)] +/// Sección `[dev]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Dev { + /// Valor predefinido: *""* + pub static_files: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[log]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Log { + /// Valor predefinido: *"Info"* + pub tracing: String, + /// Valor predefinido: *"Stdout"* + pub rolling: String, + /// Valor predefinido: *"log"* + pub path: String, + /// Valor predefinido: *"tracing.log"* + pub prefix: String, + /// Valor predefinido: *"Full"* + pub format: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[server]` de los ajustes globales. +/// +/// Ver [`Settings`]. +pub struct Server { + /// Valor predefinido: *"localhost"* + pub bind_address: String, + /// Valor predefinido: *8088* + pub bind_port: u16, +} + +pub_config!(SETTINGS: Settings, + // [app] + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Bootsier", + "app.language" => "en-US", + "app.direction" => "ltr", + "app.startup_banner" => "Slant", + + // [database] + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", + "database.db_host" => "localhost", + "database.db_port" => 0, + "database.max_pool_size" => 5, + + // [dev] + "dev.static_files" => "", + + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", + + // [server] + "server.bind_address" => "localhost", + "server.bind_port" => 8088, +); diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 021e7df9..2dc3efa1 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -110,7 +110,7 @@ pub fn run_migrations() { migrations } } - Migrator::up(&DBCONN, None) + Migrator::up(&app::db::DBCONN, None) }) .unwrap(); @@ -125,7 +125,7 @@ pub fn run_migrations() { migrations } } - Migrator::down(&DBCONN, None) + Migrator::down(&app::db::DBCONN, None) }) .unwrap(); } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 744006d8..c26ebae5 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,4 +1,4 @@ -use crate::{app, concat_string, global}; +use crate::{app, concat_string, config}; use crate::base::component::{Container, Html}; use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; @@ -41,9 +41,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { @match page.title().get() { Some(t) => title { - (concat_string!(global::SETTINGS.app.name, " | ", t)) + (concat_string!(config::SETTINGS.app.name, " | ", t)) }, - None => title { (global::SETTINGS.app.name) } + None => title { (config::SETTINGS.app.name) } } @if let Some(d) = page.description().get() { diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 06638114..37a560eb 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,12 +1,7 @@ -use crate::{global, run_now, trace, LazyStatic}; - pub use url::Url as DbUri; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; -use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; -use tracing_unwrap::ResultExt; - // El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.9.1) // https://github.com/SeaQL/sea-orm/tree/0.9.1/sea-orm-migration para evitar los errores generados @@ -42,97 +37,3 @@ macro_rules! migration_item { Box::new(migration::$migration_module::Migration) }}; } - - -pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { - trace::info!( - "Connecting to database \"{}\" using a pool of {} connections", - &global::SETTINGS.database.db_name, - &global::SETTINGS.database.max_pool_size - ); - - let db_uri = match global::SETTINGS.database.db_type.as_str() { - "mysql" | "postgres" => { - let mut tmp_uri = DbUri::parse( - format!( - "{}://{}/{}", - &global::SETTINGS.database.db_type, - &global::SETTINGS.database.db_host, - &global::SETTINGS.database.db_name - ) - .as_str(), - ) - .unwrap(); - tmp_uri - .set_username(global::SETTINGS.database.db_user.as_str()) - .unwrap(); - // https://github.com/launchbadge/sqlx/issues/1624 - tmp_uri - .set_password(Some(global::SETTINGS.database.db_pass.as_str())) - .unwrap(); - if global::SETTINGS.database.db_port != 0 { - tmp_uri.set_port(Some(global::SETTINGS.database.db_port)).unwrap(); - } - tmp_uri - } - "sqlite" => DbUri::parse( - format!( - "{}://{}", - &global::SETTINGS.database.db_type, &global::SETTINGS.database.db_name - ) - .as_str(), - ) - .unwrap(), - _ => { - trace::error!( - "Unrecognized database type \"{}\"", - &global::SETTINGS.database.db_type - ); - DbUri::parse("").unwrap() - } - }; - - run_now(Database::connect::<ConnectOptions>({ - let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(global::SETTINGS.database.max_pool_size); - db_opt - })) - .expect_or_log("Failed to connect to database") -}); - - -static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| - DBCONN.get_database_backend() -); - -pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { - DBCONN - .query_all(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await -} - -pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { - DBCONN - .query_one(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await -} - -pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { - DBCONN - .execute(Statement::from_string(*DBBACKEND, stmt)) - .await -} diff --git a/pagetop/src/global.rs b/pagetop/src/global.rs deleted file mode 100644 index de87ceb5..00000000 --- a/pagetop/src/global.rs +++ /dev/null @@ -1,214 +0,0 @@ -use crate::{pub_config, trace, LazyStatic}; - -use serde::Deserialize; - -use tracing_appender::non_blocking::WorkerGuard; -use tracing_subscriber::EnvFilter; - -use unic_langid::LanguageIdentifier; - -// CONFIGURACIÓN *********************************************************************************** - -#[derive(Debug, Deserialize)] -/// Ajustes globales para las secciones reservadas [`[app]`](App), [`[database]`](Database), -/// [`[dev]`](Dev), [`[log]`](Log) y [`[server]`](Server) (ver [`SETTINGS`]). -pub struct Settings { - pub app: App, - pub database: Database, - pub dev: Dev, - pub log: Log, - pub server: Server, -} - -#[derive(Debug, Deserialize)] -/// Sección `[app]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct App { - /// Valor predefinido: *"PageTop Application"* - pub name: String, - /// Valor predefinido: *"Developed with the amazing PageTop framework."* - pub description: String, - /// Valor predefinido: *"Bootsier"* - pub theme: String, - /// Valor predefinido: *"en-US"* - pub language: String, - /// Valor predefinido: *"ltr"* - pub direction: String, - /// Valor predefinido: *"Slant"* - pub startup_banner: String, - /// Valor predefinido: según variable de entorno PAGETOP_RUN_MODE, o *"default"* si no lo está - pub run_mode: String, -} - -#[derive(Debug, Deserialize)] -/// Sección `[database]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Database { - /// Valor predefinido: *""* - pub db_type: String, - /// Valor predefinido: *""* - pub db_name: String, - /// Valor predefinido: *""* - pub db_user: String, - /// Valor predefinido: *""* - pub db_pass: String, - /// Valor predefinido: *"localhost"* - pub db_host: String, - /// Valor predefinido: *0* - pub db_port: u16, - /// Valor predefinido: *5* - pub max_pool_size: u32, -} - -#[derive(Debug, Deserialize)] -/// Sección `[dev]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Dev { - /// Valor predefinido: *""* - pub static_files: String, -} - -#[derive(Debug, Deserialize)] -/// Sección `[log]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Log { - /// Valor predefinido: *"Info"* - pub tracing: String, - /// Valor predefinido: *"Stdout"* - pub rolling: String, - /// Valor predefinido: *"log"* - pub path: String, - /// Valor predefinido: *"tracing.log"* - pub prefix: String, - /// Valor predefinido: *"Full"* - pub format: String, -} - -#[derive(Debug, Deserialize)] -/// Sección `[server]` de los ajustes globales. -/// -/// Ver [`Settings`]. -pub struct Server { - /// Valor predefinido: *"localhost"* - pub bind_address: String, - /// Valor predefinido: *8088* - pub bind_port: u16, -} - -pub_config!(SETTINGS: Settings, - // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Bootsier", - "app.language" => "en-US", - "app.direction" => "ltr", - "app.startup_banner" => "Slant", - - // [database] - "database.db_type" => "", - "database.db_name" => "", - "database.db_user" => "", - "database.db_pass" => "", - "database.db_host" => "localhost", - "database.db_port" => 0, - "database.max_pool_size" => 5, - - // [dev] - "dev.static_files" => "", - - // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", - - // [server] - "server.bind_address" => "localhost", - "server.bind_port" => 8088, -); - -// REGISTRO DE TRAZAS Y EVENTOS ******************************************************************** - -/// Registro de trazas y eventos de la aplicación. -/// -/// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de escritura sin bloqueo -/// (*non-blocking writer*) que actúa periódicamente en vez de enviar cada traza o evento al -/// instante. Si el programa termina abruptamente (por ejemplo, por un panic! o un -/// std::process::exit), es posible que algunas trazas o eventos no se envíen. -/// -/// Puesto que las trazas o eventos registrados poco antes de la caída de una aplicación suelen ser -/// importantes para diagnosticar la causa del fallo, con `Lazy<WorkerGuard>` se garantiza que todos -/// los registros almacenados se enviarán antes de terminar la ejecución. - -#[rustfmt::skip] -pub(crate) static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { - let env_filter = - EnvFilter::try_new(&SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); - - let rolling = SETTINGS.log.rolling.to_lowercase(); - let (non_blocking, guard) = match rolling.as_str() { - "stdout" => tracing_appender::non_blocking(std::io::stdout()), - _ => tracing_appender::non_blocking({ - let path = &SETTINGS.log.path; - let prefix = &SETTINGS.log.prefix; - match rolling.as_str() { - "daily" => tracing_appender::rolling::daily(path, prefix), - "hourly" => tracing_appender::rolling::hourly(path, prefix), - "minutely" => tracing_appender::rolling::minutely(path, prefix), - "endless" => tracing_appender::rolling::never(path, prefix), - _ => { - println!( - "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", - SETTINGS.log.rolling, - ); - tracing_appender::rolling::daily(path, prefix) - } - } - }), - }; - let subscriber = tracing_subscriber::fmt() - .with_env_filter(env_filter) - .with_writer(non_blocking) - .with_ansi(rolling.as_str() == "stdout"); - match SETTINGS.log.format.to_lowercase().as_str() { - "json" => subscriber.json().init(), - "full" => subscriber.init(), - "compact" => subscriber.compact().init(), - "pretty" => subscriber.pretty().init(), - _ => { - println!( - "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", - SETTINGS.log.format, - ); - subscriber.init(); - } - } - - guard -}); - -// LOCALIZACIÓN ************************************************************************************ - -/// Almacena el Identificador de Idioma Unicode -/// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) -/// de la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: LazyStatic<LanguageIdentifier> = - LazyStatic::new(|| match SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "{}, {} \"{}\"! {}, {}", - "Failed to parse language", - "unrecognized Unicode Language Identifier", - SETTINGS.app.language, - "Using \"en-US\"", - "check the settings file", - ); - "en-US".parse().unwrap() - } - }); diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index d1a06327..ff543aed 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -62,9 +62,6 @@ pub mod html; #[cfg(feature = "database")] pub mod db; -// Acceso a declaraciones globales. -pub mod global; - // Prepara y ejecuta la aplicación. pub mod app; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 9750d314..1574d0b6 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -102,7 +102,7 @@ pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; /// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! pub_locale { ( $dir_locales:literal $(, $core_locales:literal)? ) => { - use $crate::global; + use $crate::app; use $crate::locale::*; static_locale! { @@ -118,7 +118,7 @@ macro_rules! pub_locale { #[allow(dead_code)] fn l(key: &str) -> String { - LOCALES.lookup(&global::LANGID, key).unwrap_or(key.to_string()) + LOCALES.lookup(&app::locale::LANGID, key).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -126,7 +126,7 @@ macro_rules! pub_locale { key: &str, args: &std::collections::HashMap<String, FluentValue> ) -> String { - LOCALES.lookup_with_args(&global::LANGID, key, args).unwrap_or(key.to_string()) + LOCALES.lookup_with_args(&app::locale::LANGID, key, args).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -135,7 +135,7 @@ macro_rules! pub_locale { args: &std::collections::HashMap<String, FluentValue> ) -> $crate::html::PreEscaped<String> { $crate::html::PreEscaped( - LOCALES.lookup_with_args(&global::LANGID, key, args).unwrap_or(key.to_string()) + LOCALES.lookup_with_args(&app::locale::LANGID, key, args).unwrap_or(key.to_string()) ) } }; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 852b070f..05f2ad0f 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -19,8 +19,6 @@ pub use crate::html::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; -pub use crate::global; - pub use crate::app; pub use crate::app::application::Application; pub use crate::app::fatal_error::FatalError; diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/response/page/context.rs index 76a39450..1e5e7a06 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/response/page/context.rs @@ -2,10 +2,10 @@ use super::PageOp; use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; -use crate::{base, concat_string, global, util, LazyStatic}; +use crate::{base, concat_string, config, util, LazyStatic}; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = - LazyStatic::new(|| match theme_by_single_name(&global::SETTINGS.app.theme) { + LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, None => &base::theme::bootsier::Bootsier, }); diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 97e58645..56549374 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -4,12 +4,12 @@ use crate::app::fatal_error::FatalError; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; -use crate::{global, trace, LazyStatic}; +use crate::{config, trace, LazyStatic}; use std::collections::HashMap; static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { - let language = global::SETTINGS.app.language[..2].to_lowercase(); + let language = config::SETTINGS.app.language[..2].to_lowercase(); if !language.is_empty() { Some(language) } else { @@ -18,7 +18,7 @@ static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { }); static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { - let direction = global::SETTINGS.app.direction.to_lowercase(); + let direction = config::SETTINGS.app.direction.to_lowercase(); match direction.as_str() { "auto" => Some("auto".to_owned()), "ltr" => Some("ltr".to_owned()), @@ -27,7 +27,7 @@ static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { _ => { trace::warn!( "Text direction \"{}\" not valid, {}", - global::SETTINGS.app.direction, + config::SETTINGS.app.direction, "check the settings file" ); None diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index e926966e..07fc1f89 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -169,7 +169,7 @@ macro_rules! args { #[macro_export] macro_rules! configure_service_for_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ - let static_files = &$crate::global::SETTINGS.dev.static_files; + let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { $cfg.service($crate::app::ResourceFiles::new($dir, $embed())); } else { From 46d4e19c39466e943b7049e847d95ad4e0c2ce72 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 23:52:32 +0100 Subject: [PATCH 230/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Ajustes=20menores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/banner.rs | 1 - pagetop/src/app/db.rs | 2 -- pagetop/src/app/locale.rs | 4 +--- pagetop/src/app/tracing.rs | 1 - pagetop/src/config.rs | 12 +++++------- pagetop/src/db.rs | 1 - 6 files changed, 6 insertions(+), 15 deletions(-) diff --git a/pagetop/src/app/banner.rs b/pagetop/src/app/banner.rs index 01b8aee2..aa36fb70 100644 --- a/pagetop/src/app/banner.rs +++ b/pagetop/src/app/banner.rs @@ -5,7 +5,6 @@ use crate::config; use substring::Substring; - pub fn print_on_startup() { if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { if let Some((term_width, _)) = term_size::dimensions() { diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 8fca109c..5827e7b0 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -4,7 +4,6 @@ use crate::db::*; use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; use tracing_unwrap::ResultExt; - pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", @@ -61,7 +60,6 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { .expect_or_log("Failed to connect to database") }); - static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| DBCONN.get_database_backend() ); diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs index d079791a..613e6dc8 100644 --- a/pagetop/src/app/locale.rs +++ b/pagetop/src/app/locale.rs @@ -2,11 +2,9 @@ use crate::{config, trace, LazyStatic}; use unic_langid::LanguageIdentifier; -// LOCALIZACIÓN ************************************************************************************ - /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) -/// global para la aplicación, obtenido de `SETTINGS.app.language`. +/// para la aplicación, obtenido de `SETTINGS.app.language`. pub static LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| match config::SETTINGS.app.language.parse() { Ok(language) => language, diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs index 01f5ed28..baac884d 100644 --- a/pagetop/src/app/tracing.rs +++ b/pagetop/src/app/tracing.rs @@ -3,7 +3,6 @@ use crate::{config, LazyStatic}; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; - /// Registro de trazas y eventos de la aplicación. /// /// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de escritura sin bloqueo diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index a94499d4..c795c27a 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -78,12 +78,11 @@ //! ); //! ``` //! -//! De hecho, así se declaran los ajustes globales de la configuración (ver -//! [`SETTINGS`](crate::global::SETTINGS)). +//! De hecho, así se declaran los ajustes globales de la configuración (ver [`SETTINGS`]). //! //! Puedes usar la [sintaxis TOML](https://toml.io/en/v1.0.0#table) para añadir tu nueva sección //! `[myapp]` en los archivos de configuración, del mismo modo que se añaden `[log]` o `[server]` en -//! los ajustes globales (ver [`Settings`](crate::global::Settings)). +//! los ajustes globales (ver [`Settings`]). //! //! Se recomienda inicializar todos los ajustes con valores predefinidos, o utilizar la notación //! `Option<T>` si van a ser tratados en el código como opcionales. @@ -100,9 +99,9 @@ //! use pagetop::prelude::*; //! //! fn global_settings() { -//! println!("App name: {}", &global::SETTINGS.app.name); -//! println!("App description: {}", &global::SETTINGS.app.description); -//! println!("Value of PAGETOP_RUN_MODE: {}", &global::SETTINGS.app.run_mode); +//! println!("App name: {}", &config::SETTINGS.app.name); +//! println!("App description: {}", &config::SETTINGS.app.description); +//! println!("Value of PAGETOP_RUN_MODE: {}", &config::SETTINGS.app.run_mode); //! } //! //! fn module_settings() { @@ -128,7 +127,6 @@ use serde::Deserialize; use std::env; - /// Directorio donde se encuentran los archivos de configuración. const CONFIG_DIR: &str = "config"; diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 37a560eb..a6639943 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -2,7 +2,6 @@ pub use url::Url as DbUri; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; - // El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.9.1) // https://github.com/SeaQL/sea-orm/tree/0.9.1/sea-orm-migration para evitar los errores generados // por el paradigma modular de PageTop. Se copian los siguientes archivos del original: From f1932d6749e1e94dbc08f8d2fb84a9c918180edf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Nov 2022 23:56:49 +0100 Subject: [PATCH 231/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Revisa=20c=C3=B3di?= =?UTF-8?q?go=20con=20cargo=20fmt=20y=20cargo=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app/application.rs | 3 ++- pagetop/src/app/banner/figfont.rs | 30 +++++++++++++++------------- pagetop/src/app/db.rs | 13 ++++++------ pagetop/src/base/module/homepage.rs | 17 +++++++--------- pagetop/src/config.rs | 3 +-- pagetop/src/core/theme/definition.rs | 2 +- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 2bd53e00..2c0b9c4c 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -55,7 +55,8 @@ impl Application { }) .bind(format!( "{}:{}", - &config::SETTINGS.server.bind_address, &config::SETTINGS.server.bind_port + &config::SETTINGS.server.bind_address, + &config::SETTINGS.server.bind_port ))? .run(); diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/app/banner/figfont.rs index f024c7f9..48ce038b 100644 --- a/pagetop/src/app/banner/figfont.rs +++ b/pagetop/src/app/banner/figfont.rs @@ -8,19 +8,21 @@ pub static FIGFONT: LazyStatic<FIGfont> = LazyStatic::new(|| { let speed = include_str!("speed.flf"); let starwars = include_str!("starwars.flf"); - FIGfont::from_content(match config::SETTINGS.app.startup_banner.to_lowercase().as_str() { - "off" => slant, - "slant" => slant, - "small" => small, - "speed" => speed, - "starwars" => starwars, - _ => { - println!( - "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check settings files.", - config::SETTINGS.app.startup_banner, - ); - slant - } - }) + FIGfont::from_content( + match config::SETTINGS.app.startup_banner.to_lowercase().as_str() { + "off" => slant, + "slant" => slant, + "small" => small, + "speed" => speed, + "starwars" => starwars, + _ => { + println!( + "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check settings files.", + config::SETTINGS.app.startup_banner, + ); + slant + } + }, + ) .unwrap() }); diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 5827e7b0..59e73156 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,5 +1,5 @@ -use crate::{config, run_now, trace, LazyStatic}; use crate::db::*; +use crate::{config, run_now, trace, LazyStatic}; use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; use tracing_unwrap::ResultExt; @@ -31,14 +31,17 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { .set_password(Some(config::SETTINGS.database.db_pass.as_str())) .unwrap(); if config::SETTINGS.database.db_port != 0 { - tmp_uri.set_port(Some(config::SETTINGS.database.db_port)).unwrap(); + tmp_uri + .set_port(Some(config::SETTINGS.database.db_port)) + .unwrap(); } tmp_uri } "sqlite" => DbUri::parse( format!( "{}://{}", - &config::SETTINGS.database.db_type, &config::SETTINGS.database.db_name + &config::SETTINGS.database.db_type, + &config::SETTINGS.database.db_name ) .as_str(), ) @@ -60,9 +63,7 @@ pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { .expect_or_log("Failed to connect to database") }); -static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| - DBCONN.get_database_backend() -); +static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| DBCONN.get_database_backend()); pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { DBCONN diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 36ebae3c..c2830b91 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -82,19 +82,16 @@ fn hello_world() -> Container { .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::link( - "#welcome", - html! { (l("hello_welcome")) }, - ) - .with_left_icon(Icon::with("arrow-down-circle-fill")) - .with_classes(ClassesOp::Add, "welcome-link"), + Anchor::link("#welcome", html! { (l("hello_welcome")) }) + .with_left_icon(Icon::with("arrow-down-circle-fill")) + .with_classes(ClassesOp::Add, "welcome-link"), ), ) .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "hello-col-image") .with_component(Image::new_with_source("/theme/images/homepage-header.svg")), - ) + ), ) } @@ -158,7 +155,7 @@ fn about_pagetop() -> Container { ) ])) })), - ) + ), ) } @@ -189,7 +186,7 @@ fn promo_pagetop() -> Container { .with_classes(ClassesOp::Add, "promo-col-image") .with_size(grid::ColumnSize::Is6of12) .with_component(Image::new_with_source("/theme/images/homepage-pagetop.png")), - ) + ), ) } @@ -217,6 +214,6 @@ fn reporting_problems() -> Container { .with_component(Paragraph::with(html! { (l("report_problems_text2")) })), - ) + ), ) } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index c795c27a..8269123d 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -164,7 +164,7 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { /// /// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). macro_rules! pub_config { - ( $S:ident: $t:ty $(, $k:literal => $v:literal)*$(,)* ) => { crate::doc_comment! { + ( $S:ident: $t:ty $(, $k:literal => $v:literal)*$(,)* ) => { $crate::doc_comment! { concat!( "Declara y asigna los valores predefinidos para los ajustes de configuración ", "asociados a la estructura [`", stringify!($t), "`]." @@ -182,7 +182,6 @@ macro_rules! pub_config { }}; } - #[derive(Debug, Deserialize)] /// Ajustes globales para las secciones reservadas [`[app]`](App), [`[database]`](Database), /// [`[dev]`](Dev), [`[log]`](Log) y [`[server]`](Server) (ver [`SETTINGS`]). diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index c26ebae5..37b270ae 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,9 +1,9 @@ -use crate::{app, concat_string, config}; use crate::base::component::{Container, Html}; use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; use crate::util::{single_type_name, Handle}; +use crate::{app, concat_string, config}; pub type ThemeStaticRef = &'static dyn ThemeTrait; From b4122565f1f0257234913e32f4e565a9e2c4d264 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 11 Nov 2022 00:01:32 +0100 Subject: [PATCH 232/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 6376768f..e0ad95c1 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.30" +version = "0.0.31" edition = "2021" authors = [ @@ -54,7 +54,7 @@ maud = { version = "0.24.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.10.1" +version = "0.10.2" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true From fed3248e338d59c1837286ef07487ac0dd74afe6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 11 Nov 2022 00:08:44 +0100 Subject: [PATCH 233/853] =?UTF-8?q?=F0=9F=94=96=20Incrementa=20versi=C3=B3?= =?UTF-8?q?n=20de=20desarrollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- pagetop-node/Cargo.toml | 2 +- pagetop-user/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 81f78fe8..badb11db 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index b069908a..3a31481a 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 7d74f89e..81011e40 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ From 047a2ec76e322776e9b3b17d128d96c6ad89f466 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 11 Nov 2022 00:09:34 +0100 Subject: [PATCH 234/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Eli?= =?UTF-8?q?mina=20advertencia=20de=20uso=20para=20run=5Fnow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index ff543aed..e9b2c650 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -45,6 +45,7 @@ pub use once_cell::sync::Lazy as LazyStatic; // LOCAL. +#[allow(unused_imports)] pub(crate) use futures::executor::block_on as run_now; // APIs PÚBLICAS. From 61e3f42c2a7ebf2534e48370c3164d13eb446841 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 12:46:37 +0100 Subject: [PATCH 235/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Simplifica=20estru?= =?UTF-8?q?ctura=20API=20de=20acceso=20a=20BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m20220312_000001_create_table_role.rs | 2 +- pagetop/src/app.rs | 3 - pagetop/src/app/application.rs | 4 +- pagetop/src/app/db.rs | 98 ------------------- pagetop/src/core/module/all.rs | 6 +- pagetop/src/db.rs | 98 +++++++++++++++++++ 6 files changed, 104 insertions(+), 107 deletions(-) delete mode 100644 pagetop/src/app/db.rs diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index eeb3abed..f1fa802c 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -51,7 +51,7 @@ impl MigrationTrait for Migration { .await?; // Built-in roles. - app::db::exec::<InsertStatement>( + db::exec::<InsertStatement>( Query::insert() .into_table(Role::Table) .columns(vec![Role::Name, Role::Weight]) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 843a32b5..702a5a45 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -10,9 +10,6 @@ mod tracing; pub mod locale; -#[cfg(feature = "database")] -pub mod db; - pub mod application; pub mod fatal_error; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 2c0b9c4c..7213ddae 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -4,7 +4,7 @@ use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; -use crate::{config, LazyStatic}; +use crate::{config, db, LazyStatic}; use actix_web::dev::Server; @@ -27,7 +27,7 @@ impl Application { #[cfg(feature = "database")] // Conecta con la base de datos. - LazyStatic::force(&super::db::DBCONN); + LazyStatic::force(&db::DBCONN); // Registra los módulos de la aplicación. module::all::register_modules(app); diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs deleted file mode 100644 index 59e73156..00000000 --- a/pagetop/src/app/db.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::db::*; -use crate::{config, run_now, trace, LazyStatic}; - -use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; -use tracing_unwrap::ResultExt; - -pub static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { - trace::info!( - "Connecting to database \"{}\" using a pool of {} connections", - &config::SETTINGS.database.db_name, - &config::SETTINGS.database.max_pool_size - ); - - let db_uri = match config::SETTINGS.database.db_type.as_str() { - "mysql" | "postgres" => { - let mut tmp_uri = DbUri::parse( - format!( - "{}://{}/{}", - &config::SETTINGS.database.db_type, - &config::SETTINGS.database.db_host, - &config::SETTINGS.database.db_name - ) - .as_str(), - ) - .unwrap(); - tmp_uri - .set_username(config::SETTINGS.database.db_user.as_str()) - .unwrap(); - // https://github.com/launchbadge/sqlx/issues/1624 - tmp_uri - .set_password(Some(config::SETTINGS.database.db_pass.as_str())) - .unwrap(); - if config::SETTINGS.database.db_port != 0 { - tmp_uri - .set_port(Some(config::SETTINGS.database.db_port)) - .unwrap(); - } - tmp_uri - } - "sqlite" => DbUri::parse( - format!( - "{}://{}", - &config::SETTINGS.database.db_type, - &config::SETTINGS.database.db_name - ) - .as_str(), - ) - .unwrap(), - _ => { - trace::error!( - "Unrecognized database type \"{}\"", - &config::SETTINGS.database.db_type - ); - DbUri::parse("").unwrap() - } - }; - - run_now(Database::connect::<ConnectOptions>({ - let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(config::SETTINGS.database.max_pool_size); - db_opt - })) - .expect_or_log("Failed to connect to database") -}); - -static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| DBCONN.get_database_backend()); - -pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { - DBCONN - .query_all(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await -} - -pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { - DBCONN - .query_one(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await -} - -pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { - DBCONN - .execute(Statement::from_string(*DBBACKEND, stmt)) - .await -} diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 2dc3efa1..1023a860 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -2,7 +2,7 @@ use super::ModuleStaticRef; use crate::core::hook::add_action; use crate::core::theme; -use crate::{app, trace, LazyStatic}; +use crate::{app, db, trace, LazyStatic}; #[cfg(feature = "database")] use crate::{db::*, run_now}; @@ -110,7 +110,7 @@ pub fn run_migrations() { migrations } } - Migrator::up(&app::db::DBCONN, None) + Migrator::up(&db::DBCONN, None) }) .unwrap(); @@ -125,7 +125,7 @@ pub fn run_migrations() { migrations } } - Migrator::down(&app::db::DBCONN, None) + Migrator::down(&db::DBCONN, None) }) .unwrap(); } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index a6639943..c7aeb879 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,7 +1,105 @@ +use crate::{config, run_now, trace, LazyStatic}; + pub use url::Url as DbUri; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; +use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; +use tracing_unwrap::ResultExt; + +pub(crate) static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { + trace::info!( + "Connecting to database \"{}\" using a pool of {} connections", + &config::SETTINGS.database.db_name, + &config::SETTINGS.database.max_pool_size + ); + + let db_uri = match config::SETTINGS.database.db_type.as_str() { + "mysql" | "postgres" => { + let mut tmp_uri = DbUri::parse( + format!( + "{}://{}/{}", + &config::SETTINGS.database.db_type, + &config::SETTINGS.database.db_host, + &config::SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(); + tmp_uri + .set_username(config::SETTINGS.database.db_user.as_str()) + .unwrap(); + // https://github.com/launchbadge/sqlx/issues/1624 + tmp_uri + .set_password(Some(config::SETTINGS.database.db_pass.as_str())) + .unwrap(); + if config::SETTINGS.database.db_port != 0 { + tmp_uri + .set_port(Some(config::SETTINGS.database.db_port)) + .unwrap(); + } + tmp_uri + } + "sqlite" => DbUri::parse( + format!( + "{}://{}", + &config::SETTINGS.database.db_type, + &config::SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(), + _ => { + trace::error!( + "Unrecognized database type \"{}\"", + &config::SETTINGS.database.db_type + ); + DbUri::parse("").unwrap() + } + }; + + run_now(Database::connect::<ConnectOptions>({ + let mut db_opt = ConnectOptions::new(db_uri.to_string()); + db_opt.max_connections(config::SETTINGS.database.max_pool_size); + db_opt + })) + .expect_or_log("Failed to connect to database") +}); + +static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| DBCONN.get_database_backend()); + +pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { + DBCONN + .query_all(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await +} + +pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { + DBCONN + .query_one(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await +} + +pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { + DBCONN + .execute(Statement::from_string(*DBBACKEND, stmt)) + .await +} + // El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.9.1) // https://github.com/SeaQL/sea-orm/tree/0.9.1/sea-orm-migration para evitar los errores generados // por el paradigma modular de PageTop. Se copian los siguientes archivos del original: From 7149980e5de043104b48b3c8a4bf158e6556f51c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 13:04:20 +0100 Subject: [PATCH 236/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Simplifica=20estru?= =?UTF-8?q?ctura=20API=20de=20tracing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 2 -- pagetop/src/app/application.rs | 4 +-- pagetop/src/app/tracing.rs | 62 --------------------------------- pagetop/src/trace.rs | 63 ++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 66 deletions(-) delete mode 100644 pagetop/src/app/tracing.rs diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 702a5a45..1c9218c3 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,8 +6,6 @@ pub use actix_web_static_files::ResourceFiles; mod banner; -mod tracing; - pub mod locale; pub mod application; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index 7213ddae..c15e4971 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -4,7 +4,7 @@ use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; -use crate::{config, db, LazyStatic}; +use crate::{config, db, trace, LazyStatic}; use actix_web::dev::Server; @@ -20,7 +20,7 @@ impl Application { super::banner::print_on_startup(); // Inicia registro de trazas y eventos. - LazyStatic::force(&super::tracing::TRACING); + LazyStatic::force(&trace::TRACING); // Valida el identificador de idioma. LazyStatic::force(&super::locale::LANGID); diff --git a/pagetop/src/app/tracing.rs b/pagetop/src/app/tracing.rs deleted file mode 100644 index baac884d..00000000 --- a/pagetop/src/app/tracing.rs +++ /dev/null @@ -1,62 +0,0 @@ -use crate::{config, LazyStatic}; - -use tracing_appender::non_blocking::WorkerGuard; -use tracing_subscriber::EnvFilter; - -/// Registro de trazas y eventos de la aplicación. -/// -/// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de escritura sin bloqueo -/// (*non-blocking writer*) que actúa periódicamente en vez de enviar cada traza o evento al -/// instante. Si el programa termina abruptamente (por ejemplo, por un panic! o un -/// std::process::exit), es posible que algunas trazas o eventos no se envíen. -/// -/// Puesto que las trazas o eventos registrados poco antes de la caída de una aplicación suelen ser -/// importantes para diagnosticar la causa del fallo, con `Lazy<WorkerGuard>` se garantiza que todos -/// los registros almacenados se enviarán antes de terminar la ejecución. - -#[rustfmt::skip] -pub static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { - let env_filter = - EnvFilter::try_new(&config::SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); - - let rolling = config::SETTINGS.log.rolling.to_lowercase(); - let (non_blocking, guard) = match rolling.as_str() { - "stdout" => tracing_appender::non_blocking(std::io::stdout()), - _ => tracing_appender::non_blocking({ - let path = &config::SETTINGS.log.path; - let prefix = &config::SETTINGS.log.prefix; - match rolling.as_str() { - "daily" => tracing_appender::rolling::daily(path, prefix), - "hourly" => tracing_appender::rolling::hourly(path, prefix), - "minutely" => tracing_appender::rolling::minutely(path, prefix), - "endless" => tracing_appender::rolling::never(path, prefix), - _ => { - println!( - "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", - config::SETTINGS.log.rolling, - ); - tracing_appender::rolling::daily(path, prefix) - } - } - }), - }; - let subscriber = tracing_subscriber::fmt() - .with_env_filter(env_filter) - .with_writer(non_blocking) - .with_ansi(rolling.as_str() == "stdout"); - match config::SETTINGS.log.format.to_lowercase().as_str() { - "json" => subscriber.json().init(), - "full" => subscriber.init(), - "compact" => subscriber.compact().init(), - "pretty" => subscriber.pretty().init(), - _ => { - println!( - "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", - config::SETTINGS.log.format, - ); - subscriber.init(); - } - } - - guard -}); diff --git a/pagetop/src/trace.rs b/pagetop/src/trace.rs index 2b2f3fb1..14e9bfe2 100644 --- a/pagetop/src/trace.rs +++ b/pagetop/src/trace.rs @@ -15,5 +15,68 @@ //! de un árbol anidado de intervalos similares. Además, estos intervalos están *estructurados*, con //! capacidad para grabar tipos de datos y mensajes de texto. +use crate::{config, LazyStatic}; + pub use tracing::{debug, error, info, trace, warn}; pub use tracing::{event, span, Level}; + +use tracing_appender::non_blocking::WorkerGuard; +use tracing_subscriber::EnvFilter; + +/// Registro de trazas y eventos de la aplicación. +/// +/// Para aumentar el rendimiento, un subproceso dedicado utiliza un sistema de escritura sin bloqueo +/// (*non-blocking writer*) que actúa periódicamente en vez de enviar cada traza o evento al +/// instante. Si el programa termina abruptamente (por ejemplo, por un panic! o un +/// std::process::exit), es posible que algunas trazas o eventos no se envíen. +/// +/// Puesto que las trazas o eventos registrados poco antes de la caída de una aplicación suelen ser +/// importantes para diagnosticar la causa del fallo, con `Lazy<WorkerGuard>` se garantiza que todos +/// los registros almacenados se enviarán antes de terminar la ejecución. + +#[rustfmt::skip] +pub(crate) static TRACING: LazyStatic<WorkerGuard> = LazyStatic::new(|| { + let env_filter = + EnvFilter::try_new(&config::SETTINGS.log.tracing).unwrap_or_else(|_| EnvFilter::new("Info")); + + let rolling = config::SETTINGS.log.rolling.to_lowercase(); + let (non_blocking, guard) = match rolling.as_str() { + "stdout" => tracing_appender::non_blocking(std::io::stdout()), + _ => tracing_appender::non_blocking({ + let path = &config::SETTINGS.log.path; + let prefix = &config::SETTINGS.log.prefix; + match rolling.as_str() { + "daily" => tracing_appender::rolling::daily(path, prefix), + "hourly" => tracing_appender::rolling::hourly(path, prefix), + "minutely" => tracing_appender::rolling::minutely(path, prefix), + "endless" => tracing_appender::rolling::never(path, prefix), + _ => { + println!( + "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", + config::SETTINGS.log.rolling, + ); + tracing_appender::rolling::daily(path, prefix) + } + } + }), + }; + let subscriber = tracing_subscriber::fmt() + .with_env_filter(env_filter) + .with_writer(non_blocking) + .with_ansi(rolling.as_str() == "stdout"); + match config::SETTINGS.log.format.to_lowercase().as_str() { + "json" => subscriber.json().init(), + "full" => subscriber.init(), + "compact" => subscriber.compact().init(), + "pretty" => subscriber.pretty().init(), + _ => { + println!( + "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", + config::SETTINGS.log.format, + ); + subscriber.init(); + } + } + + guard +}); From bdedede3f1bffb8659169269aeaad9933bd3e191 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 13:29:14 +0100 Subject: [PATCH 237/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Reestructura=20la?= =?UTF-8?q?=20API=20del=20servidor=20web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +-- pagetop-node/src/lib.rs | 4 +-- pagetop-user/src/lib.rs | 4 +-- pagetop/src/app.rs | 10 ------- pagetop/src/app/application.rs | 13 ++++----- pagetop/src/app/locale.rs | 22 -------------- pagetop/src/base/module/homepage.rs | 4 +-- pagetop/src/base/theme/aliner.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/core/module/all.rs | 4 +-- pagetop/src/core/module/definition.rs | 4 +-- pagetop/src/core/theme/all.rs | 4 +-- pagetop/src/core/theme/definition.rs | 4 +-- pagetop/src/lib.rs | 9 ++++-- pagetop/src/locale.rs | 30 +++++++++++++++++--- pagetop/src/prelude.rs | 12 ++++---- pagetop/src/response.rs | 3 ++ pagetop/src/{app => response}/fatal_error.rs | 4 +-- pagetop/src/response/page/definition.rs | 2 +- pagetop/src/server.rs | 5 ++++ pagetop/src/util.rs | 4 +-- 22 files changed, 77 insertions(+), 75 deletions(-) delete mode 100644 pagetop/src/app/locale.rs rename pagetop/src/{app => response}/fatal_error.rs (96%) create mode 100644 pagetop/src/server.rs diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 20aeac6e..6892e49d 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -21,8 +21,8 @@ impl ModuleTrait for Admin { Some(l("module_description")) } - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - cfg.service(app::web::scope("/admin").route("", app::web::get().to(summary::summary))); + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service(server::web::scope("/admin").route("", server::web::get().to(summary::summary))); } fn actions(&self) -> Vec<HookAction> { diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index db9c1b44..aef94a93 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -22,8 +22,8 @@ impl ModuleTrait for Node { Some(l("module_description")) } - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - cfg.route("/node", app::web::get().to(node)); + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + cfg.route("/node", server::web::get().to(node)); } fn actions(&self) -> Vec<HookAction> { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 0bf8df5c..5ea54320 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -21,8 +21,8 @@ impl ModuleTrait for User { Some(l("module_description")) } - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - cfg.route("/user/login", app::web::get().to(login)); + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + cfg.route("/user/login", server::web::get().to(login)); } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 1c9218c3..4d1d98b7 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,13 +1,3 @@ -pub use actix_web::{ - http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, -}; -pub use actix_web_files::Files as ActixFiles; -pub use actix_web_static_files::ResourceFiles; - mod banner; -pub mod locale; - pub mod application; - -pub mod fatal_error; diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs index c15e4971..db219b63 100644 --- a/pagetop/src/app/application.rs +++ b/pagetop/src/app/application.rs @@ -1,10 +1,9 @@ -use super::fatal_error::FatalError; - use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; +use crate::response::FatalError; use crate::response::page::ResultPage; -use crate::{config, db, trace, LazyStatic}; +use crate::{config, db, locale, server, trace, LazyStatic}; use actix_web::dev::Server; @@ -23,7 +22,7 @@ impl Application { LazyStatic::force(&trace::TRACING); // Valida el identificador de idioma. - LazyStatic::force(&super::locale::LANGID); + LazyStatic::force(&locale::LANGID); #[cfg(feature = "database")] // Conecta con la base de datos. @@ -46,12 +45,12 @@ impl Application { module::all::run_migrations(); // Prepara el servidor web. - let server = super::HttpServer::new(move || { - super::App::new() + let server = server::HttpServer::new(move || { + server::App::new() .wrap(tracing_actix_web::TracingLogger::default()) .configure(module::all::configure_services) .configure(theme::all::configure_services) - .default_service(super::web::route().to(service_not_found)) + .default_service(server::web::route().to(service_not_found)) }) .bind(format!( "{}:{}", diff --git a/pagetop/src/app/locale.rs b/pagetop/src/app/locale.rs deleted file mode 100644 index 613e6dc8..00000000 --- a/pagetop/src/app/locale.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::{config, trace, LazyStatic}; - -use unic_langid::LanguageIdentifier; - -/// Almacena el Identificador de Idioma Unicode -/// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) -/// para la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: LazyStatic<LanguageIdentifier> = - LazyStatic::new(|| match config::SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "{}, {} \"{}\"! {}, {}", - "Failed to parse language", - "unrecognized Unicode Language Identifier", - config::SETTINGS.app.language, - "Using \"en-US\"", - "check the settings file", - ); - "en-US".parse().unwrap() - } - }); diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index c2830b91..bf282187 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -19,8 +19,8 @@ impl ModuleTrait for DefaultHomePage { Some(l("module_description")) } - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { - cfg.route("/", app::web::get().to(demo)); + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + cfg.route("/", server::web::get().to(demo)); } } diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 23c9c65c..daa58761 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -11,7 +11,7 @@ impl ThemeTrait for Aliner { THEME_ALINER } - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { configure_service_for_static_files!(cfg, "/aliner", bundle_aliner); } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 04327b8f..090c0085 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -13,7 +13,7 @@ impl ThemeTrait for Bootsier { THEME_BOOTSIER } - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { configure_service_for_static_files!(cfg, "/bootsier", bundle_bootsier); } diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index acac7d12..41edb458 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -11,7 +11,7 @@ impl ThemeTrait for Bulmix { THEME_BULMIX } - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { configure_service_for_static_files!(cfg, "/bulmix", bundle_bulmix); } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 1023a860..c1162c60 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -2,7 +2,7 @@ use super::ModuleStaticRef; use crate::core::hook::add_action; use crate::core::theme; -use crate::{app, db, trace, LazyStatic}; +use crate::{db, server, trace, LazyStatic}; #[cfg(feature = "database")] use crate::{db::*, run_now}; @@ -132,7 +132,7 @@ pub fn run_migrations() { // CONFIGURE SERVICES ****************************************************************************** -pub fn configure_services(cfg: &mut app::web::ServiceConfig) { +pub fn configure_services(cfg: &mut server::web::ServiceConfig) { for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(cfg); } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index ce425622..e50acae6 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,6 +1,6 @@ -use crate::app; use crate::core::hook::HookAction; use crate::core::theme::ThemeStaticRef; +use crate::server; use crate::util::{single_type_name, Handle}; #[cfg(feature = "database")] @@ -49,7 +49,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { } #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) {} } impl<M: ?Sized + ModuleTrait> BaseModule for M { diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 17e9bbe1..ca75e785 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,5 +1,5 @@ use super::ThemeStaticRef; -use crate::{app, base, configure_service_for_static_files, trace, LazyStatic}; +use crate::{base, configure_service_for_static_files, server, trace, LazyStatic}; use std::sync::RwLock; @@ -40,7 +40,7 @@ pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { } } -pub fn configure_services(cfg: &mut app::web::ServiceConfig) { +pub fn configure_services(cfg: &mut server::web::ServiceConfig) { configure_service_for_static_files!(cfg, "/theme", bundle_theme); for t in THEMES.read().unwrap().iter() { diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 37b270ae..7dd880f0 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -3,7 +3,7 @@ use crate::core::component::ComponentTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::{Page, PageContext, PageOp}; use crate::util::{single_type_name, Handle}; -use crate::{app, concat_string, config}; +use crate::{concat_string, config, server}; pub type ThemeStaticRef = &'static dyn ThemeTrait; @@ -24,7 +24,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { } #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut app::web::ServiceConfig) {} + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) {} #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index e9b2c650..0a84639a 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -63,12 +63,12 @@ pub mod html; #[cfg(feature = "database")] pub mod db; -// Prepara y ejecuta la aplicación. -pub mod app; - // APIs esenciales para crear componentes, acciones, módulos y temas. pub mod core; +// API del servidor web. +pub mod server; + // Tipos de respuestas a peticiones web. pub mod response; // Base de componentes, módulos y temas. @@ -76,6 +76,9 @@ pub mod base; // Macros y funciones útiles. pub mod util; +// Prepara y ejecuta la aplicación. +pub mod app; + // RE-EXPORTA API ÚNICA. pub mod prelude; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 1574d0b6..c793af8b 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -94,15 +94,37 @@ //! } //! ``` +use crate::{config, trace, LazyStatic}; + +use unic_langid::LanguageIdentifier; + pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; +/// Almacena el Identificador de Idioma Unicode +/// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) +/// para la aplicación, obtenido de `SETTINGS.app.language`. +pub static LANGID: LazyStatic<LanguageIdentifier> = + LazyStatic::new(|| match config::SETTINGS.app.language.parse() { + Ok(language) => language, + Err(_) => { + trace::warn!( + "{}, {} \"{}\"! {}, {}", + "Failed to parse language", + "unrecognized Unicode Language Identifier", + config::SETTINGS.app.language, + "Using \"en-US\"", + "check the settings file", + ); + "en-US".parse().unwrap() + } + }); + #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. macro_rules! pub_locale { ( $dir_locales:literal $(, $core_locales:literal)? ) => { - use $crate::app; use $crate::locale::*; static_locale! { @@ -118,7 +140,7 @@ macro_rules! pub_locale { #[allow(dead_code)] fn l(key: &str) -> String { - LOCALES.lookup(&app::locale::LANGID, key).unwrap_or(key.to_string()) + LOCALES.lookup(&LANGID, key).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -126,7 +148,7 @@ macro_rules! pub_locale { key: &str, args: &std::collections::HashMap<String, FluentValue> ) -> String { - LOCALES.lookup_with_args(&app::locale::LANGID, key, args).unwrap_or(key.to_string()) + LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) } #[allow(dead_code)] @@ -135,7 +157,7 @@ macro_rules! pub_locale { args: &std::collections::HashMap<String, FluentValue> ) -> $crate::html::PreEscaped<String> { $crate::html::PreEscaped( - LOCALES.lookup_with_args(&app::locale::LANGID, key, args).unwrap_or(key.to_string()) + LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) ) } }; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 05f2ad0f..27aacf34 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -19,16 +19,18 @@ pub use crate::html::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; -pub use crate::app; -pub use crate::app::application::Application; -pub use crate::app::fatal_error::FatalError; -pub use crate::app::HttpMessage; - pub use crate::core::{component::*, hook::*, module::*, theme::*}; pub use crate::{hook_action, hook_before_render_component}; +pub use crate::server; +pub use crate::server::HttpMessage; + pub use crate::response::page::*; +pub use crate::response::FatalError; pub use crate::response::ResponseError; pub use crate::base::component::*; + +pub use crate::app; +pub use crate::app::application::Application; diff --git a/pagetop/src/response.rs b/pagetop/src/response.rs index cdce7ee2..5c165979 100644 --- a/pagetop/src/response.rs +++ b/pagetop/src/response.rs @@ -1,3 +1,6 @@ pub use actix_web::ResponseError; pub mod page; + +mod fatal_error; +pub use fatal_error::FatalError; diff --git a/pagetop/src/app/fatal_error.rs b/pagetop/src/response/fatal_error.rs similarity index 96% rename from pagetop/src/app/fatal_error.rs rename to pagetop/src/response/fatal_error.rs index a6e7c29d..303861fd 100644 --- a/pagetop/src/app/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -1,5 +1,5 @@ -use crate::app::http::{header::ContentType, StatusCode}; -use crate::app::HttpResponse; +use crate::server::http::{header::ContentType, StatusCode}; +use crate::server::HttpResponse; use crate::response::{page::Page, ResponseError}; use std::fmt; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 56549374..1ba7389d 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,9 +1,9 @@ use super::{BeforeRenderPageHook, PageContext, PageOp, ResultPage, HOOK_BEFORE_RENDER_PAGE}; -use crate::app::fatal_error::FatalError; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; +use crate::response::FatalError; use crate::{config, trace, LazyStatic}; use std::collections::HashMap; diff --git a/pagetop/src/server.rs b/pagetop/src/server.rs new file mode 100644 index 00000000..06c63242 --- /dev/null +++ b/pagetop/src/server.rs @@ -0,0 +1,5 @@ +pub use actix_web::{ + http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, +}; +pub use actix_web_files::Files as ActixFiles; +pub use actix_web_static_files::ResourceFiles; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 07fc1f89..f7b78a18 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -171,10 +171,10 @@ macro_rules! configure_service_for_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service($crate::app::ResourceFiles::new($dir, $embed())); + $cfg.service($crate::server::ResourceFiles::new($dir, $embed())); } else { $cfg.service( - $crate::app::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) + $crate::server::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) .show_files_listing(), ); } From ee4534253b6588d0403ac73087817fce8af9d625 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 13:43:54 +0100 Subject: [PATCH 238/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Reestructura=20API?= =?UTF-8?q?=20para=20instanciar=20la=20aplicaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 74 ++++++++++++++++++- pagetop/src/app/application.rs | 72 ------------------ pagetop/src/base.rs | 2 + pagetop/src/{app => base}/banner.rs | 0 pagetop/src/{app => base}/banner/figfont.rs | 0 pagetop/src/{app => base}/banner/slant.flf | 0 pagetop/src/{app => base}/banner/small.flf | 0 pagetop/src/{app => base}/banner/speed.flf | 0 pagetop/src/{app => base}/banner/starwars.flf | 0 pagetop/src/prelude.rs | 3 +- 10 files changed, 75 insertions(+), 76 deletions(-) delete mode 100644 pagetop/src/app/application.rs rename pagetop/src/{app => base}/banner.rs (100%) rename pagetop/src/{app => base}/banner/figfont.rs (100%) rename pagetop/src/{app => base}/banner/slant.flf (100%) rename pagetop/src/{app => base}/banner/small.flf (100%) rename pagetop/src/{app => base}/banner/speed.flf (100%) rename pagetop/src/{app => base}/banner/starwars.flf (100%) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 4d1d98b7..eddda642 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,3 +1,73 @@ -mod banner; +use crate::base::banner; +use crate::core::module::ModuleStaticRef; +use crate::core::{module, theme}; +use crate::html::Markup; +use crate::response::FatalError; +use crate::response::page::ResultPage; +use crate::{config, db, locale, server, trace, LazyStatic}; -pub mod application; +use actix_web::dev::Server; + +use std::io::Error; + +pub struct Application { + server: Server, +} + +impl Application { + pub fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { + // Rótulo de presentación. + banner::print_on_startup(); + + // Inicia registro de trazas y eventos. + LazyStatic::force(&trace::TRACING); + + // Valida el identificador de idioma. + LazyStatic::force(&locale::LANGID); + + #[cfg(feature = "database")] + // Conecta con la base de datos. + LazyStatic::force(&db::DBCONN); + + // Registra los módulos de la aplicación. + module::all::register_modules(app); + + // Registra los temas de los módulos. + module::all::register_themes(); + + // Registra acciones de los módulos. + module::all::register_actions(); + + // Inicializa los módulos. + module::all::init_modules(); + + #[cfg(feature = "database")] + // Ejecuta actualizaciones pendientes de la base de datos. + module::all::run_migrations(); + + // Prepara el servidor web. + let server = server::HttpServer::new(move || { + server::App::new() + .wrap(tracing_actix_web::TracingLogger::default()) + .configure(module::all::configure_services) + .configure(theme::all::configure_services) + .default_service(server::web::route().to(service_not_found)) + }) + .bind(format!( + "{}:{}", + &config::SETTINGS.server.bind_address, + &config::SETTINGS.server.bind_port + ))? + .run(); + + Ok(Self { server }) + } + + pub fn run(self) -> Result<Server, Error> { + Ok(self.server) + } +} + +async fn service_not_found() -> ResultPage<Markup, FatalError> { + Err(FatalError::NotFound) +} diff --git a/pagetop/src/app/application.rs b/pagetop/src/app/application.rs deleted file mode 100644 index db219b63..00000000 --- a/pagetop/src/app/application.rs +++ /dev/null @@ -1,72 +0,0 @@ -use crate::core::module::ModuleStaticRef; -use crate::core::{module, theme}; -use crate::html::Markup; -use crate::response::FatalError; -use crate::response::page::ResultPage; -use crate::{config, db, locale, server, trace, LazyStatic}; - -use actix_web::dev::Server; - -use std::io::Error; - -pub struct Application { - server: Server, -} - -impl Application { - pub fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { - // Rótulo de presentación. - super::banner::print_on_startup(); - - // Inicia registro de trazas y eventos. - LazyStatic::force(&trace::TRACING); - - // Valida el identificador de idioma. - LazyStatic::force(&locale::LANGID); - - #[cfg(feature = "database")] - // Conecta con la base de datos. - LazyStatic::force(&db::DBCONN); - - // Registra los módulos de la aplicación. - module::all::register_modules(app); - - // Registra los temas de los módulos. - module::all::register_themes(); - - // Registra acciones de los módulos. - module::all::register_actions(); - - // Inicializa los módulos. - module::all::init_modules(); - - #[cfg(feature = "database")] - // Ejecuta actualizaciones pendientes de la base de datos. - module::all::run_migrations(); - - // Prepara el servidor web. - let server = server::HttpServer::new(move || { - server::App::new() - .wrap(tracing_actix_web::TracingLogger::default()) - .configure(module::all::configure_services) - .configure(theme::all::configure_services) - .default_service(server::web::route().to(service_not_found)) - }) - .bind(format!( - "{}:{}", - &config::SETTINGS.server.bind_address, - &config::SETTINGS.server.bind_port - ))? - .run(); - - Ok(Self { server }) - } - - pub fn run(self) -> Result<Server, Error> { - Ok(self.server) - } -} - -async fn service_not_found() -> ResultPage<Markup, FatalError> { - Err(FatalError::NotFound) -} diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index d58aa565..4fba6995 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,3 +1,5 @@ +pub(crate) mod banner; + pub mod component; pub mod module; pub mod theme; diff --git a/pagetop/src/app/banner.rs b/pagetop/src/base/banner.rs similarity index 100% rename from pagetop/src/app/banner.rs rename to pagetop/src/base/banner.rs diff --git a/pagetop/src/app/banner/figfont.rs b/pagetop/src/base/banner/figfont.rs similarity index 100% rename from pagetop/src/app/banner/figfont.rs rename to pagetop/src/base/banner/figfont.rs diff --git a/pagetop/src/app/banner/slant.flf b/pagetop/src/base/banner/slant.flf similarity index 100% rename from pagetop/src/app/banner/slant.flf rename to pagetop/src/base/banner/slant.flf diff --git a/pagetop/src/app/banner/small.flf b/pagetop/src/base/banner/small.flf similarity index 100% rename from pagetop/src/app/banner/small.flf rename to pagetop/src/base/banner/small.flf diff --git a/pagetop/src/app/banner/speed.flf b/pagetop/src/base/banner/speed.flf similarity index 100% rename from pagetop/src/app/banner/speed.flf rename to pagetop/src/base/banner/speed.flf diff --git a/pagetop/src/app/banner/starwars.flf b/pagetop/src/base/banner/starwars.flf similarity index 100% rename from pagetop/src/app/banner/starwars.flf rename to pagetop/src/base/banner/starwars.flf diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 27aacf34..79be1bab 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -32,5 +32,4 @@ pub use crate::response::ResponseError; pub use crate::base::component::*; -pub use crate::app; -pub use crate::app::application::Application; +pub use crate::app::Application; From f81404c68daa68def54a54d28e1172ee11e49be6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 13:45:38 +0100 Subject: [PATCH 239/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20C=C3=B3digo=20revi?= =?UTF-8?q?sado=20con=20cargo=20fmt/clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +++- pagetop/src/app.rs | 2 +- pagetop/src/response/fatal_error.rs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 6892e49d..80e3b17e 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -22,7 +22,9 @@ impl ModuleTrait for Admin { } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service(server::web::scope("/admin").route("", server::web::get().to(summary::summary))); + cfg.service( + server::web::scope("/admin").route("", server::web::get().to(summary::summary)), + ); } fn actions(&self) -> Vec<HookAction> { diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index eddda642..bef02b29 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -2,8 +2,8 @@ use crate::base::banner; use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; -use crate::response::FatalError; use crate::response::page::ResultPage; +use crate::response::FatalError; use crate::{config, db, locale, server, trace, LazyStatic}; use actix_web::dev::Server; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 303861fd..00b82e91 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -1,6 +1,6 @@ +use crate::response::{page::Page, ResponseError}; use crate::server::http::{header::ContentType, StatusCode}; use crate::server::HttpResponse; -use crate::response::{page::Page, ResponseError}; use std::fmt; From 283354776feaed06f96633a74a80a47a349b8be3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 18:36:33 +0100 Subject: [PATCH 240/853] =?UTF-8?q?=F0=9F=92=84=20Favicon.ico=20en=20lugar?= =?UTF-8?q?=20de=20PNG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/theme/aliner.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/core/theme/definition.rs | 2 +- pagetop/static/theme/favicon.ico | Bin 0 -> 10206 bytes pagetop/static/theme/favicon.png | Bin 11471 -> 0 bytes 6 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 pagetop/static/theme/favicon.ico delete mode 100644 pagetop/static/theme/favicon.png diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index daa58761..28bdf386 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -17,7 +17,7 @@ impl ThemeTrait for Aliner { fn before_render_page(&self, page: &mut Page) { page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.png"), + Favicon::new().with_icon("/theme/favicon.ico"), )) .alter_context(PageOp::AddStyleSheet( StyleSheet::located("/aliner/css/styles.css").with_weight(-99), diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 090c0085..a824b0da 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -19,7 +19,7 @@ impl ThemeTrait for Bootsier { fn before_render_page(&self, page: &mut Page) { page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.png"), + Favicon::new().with_icon("/theme/favicon.ico"), )) .alter_context(PageOp::AddStyleSheet( StyleSheet::located("/bootsier/css/bootstrap.min.css") diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 41edb458..90ce8c9c 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -17,7 +17,7 @@ impl ThemeTrait for Bulmix { fn before_render_page(&self, page: &mut Page) { page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.png"), + Favicon::new().with_icon("/theme/favicon.ico"), )) .alter_context(PageOp::AddStyleSheet( StyleSheet::located("/bulmix/css/bulma.min.css") diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 7dd880f0..3234fe78 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -29,7 +29,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.png"), + Favicon::new().with_icon("/theme/favicon.ico"), )); } diff --git a/pagetop/static/theme/favicon.ico b/pagetop/static/theme/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..95e1affa748f69b77f95490649836e9861036325 GIT binary patch literal 10206 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 Yo2E{c#pzo8UZDq&kyMnZ6f+L`AAO+n{{R30 literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/favicon.png b/pagetop/static/theme/favicon.png deleted file mode 100644 index 7d38ea4a847b5697db4437972cfc28baba5e05e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11471 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 From 514490f5f27a09dccfe6e489030c9c106f983277 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 18:38:07 +0100 Subject: [PATCH 241/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index e0ad95c1..fc11be06 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.31" +version = "0.0.32" edition = "2021" authors = [ From e38cfca945233ebe6f5cea4e6d99bd96dd44c892 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Nov 2022 18:53:59 +0100 Subject: [PATCH 242/853] =?UTF-8?q?=F0=9F=9A=A8=20Acceso=20a=20db=20es=20c?= =?UTF-8?q?aracter=C3=ADstica=20de=20compilaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 5 ++++- pagetop/src/core/module/all.rs | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index bef02b29..8e856131 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -4,7 +4,10 @@ use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; use crate::response::FatalError; -use crate::{config, db, locale, server, trace, LazyStatic}; +use crate::{config, locale, server, trace, LazyStatic}; + +#[cfg(feature = "database")] +use crate::db; use actix_web::dev::Server; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index c1162c60..84f55b47 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -2,7 +2,7 @@ use super::ModuleStaticRef; use crate::core::hook::add_action; use crate::core::theme; -use crate::{db, server, trace, LazyStatic}; +use crate::{server, trace, LazyStatic}; #[cfg(feature = "database")] use crate::{db::*, run_now}; @@ -110,7 +110,7 @@ pub fn run_migrations() { migrations } } - Migrator::up(&db::DBCONN, None) + Migrator::up(&DBCONN, None) }) .unwrap(); @@ -125,7 +125,7 @@ pub fn run_migrations() { migrations } } - Migrator::down(&db::DBCONN, None) + Migrator::down(&DBCONN, None) }) .unwrap(); } From 12d79c8437c6a360d9124daec35a0c1f3c15cdf7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Nov 2022 19:17:15 +0100 Subject: [PATCH 243/853] =?UTF-8?q?=F0=9F=92=AC=20Corrige=20referencias=20?= =?UTF-8?q?en=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config.rs | 34 +++++++++++++----------- pagetop/src/core/component/definition.rs | 12 ++++----- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 8269123d..756ffd7d 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -164,22 +164,24 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { /// /// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). macro_rules! pub_config { - ( $S:ident: $t:ty $(, $k:literal => $v:literal)*$(,)* ) => { $crate::doc_comment! { - concat!( - "Declara y asigna los valores predefinidos para los ajustes de configuración ", - "asociados a la estructura [`", stringify!($t), "`]." - ), - pub static $S: $crate::LazyStatic<$t> = $crate::LazyStatic::new(|| { - let mut settings = $crate::config::CONFIG.clone(); - $( - settings.set_default($k, $v).unwrap(); - )* - match settings.try_into() { - Ok(s) => s, - Err(e) => panic!("Error parsing settings: {}", e), - } - }); - }}; + ( $SETTINGS:ident: $Settings:ty $(, $key:literal => $value:literal)*$(,)* ) => { + $crate::doc_comment! { + concat!( + "Declara y asigna los valores predefinidos para los ajustes de configuración ", + "asociados a la estructura [`", stringify!($Settings), "`]." + ), + pub static $SETTINGS: $crate::LazyStatic<$Settings> = $crate::LazyStatic::new(|| { + let mut settings = $crate::config::CONFIG.clone(); + $( + settings.set_default($key, $value).unwrap(); + )* + match settings.try_into() { + Ok(s) => s, + Err(e) => panic!("Error parsing settings: {}", e), + } + }); + } + }; } #[derive(Debug, Deserialize)] diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 2b61cc3d..f7df0561 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -73,9 +73,9 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { #[macro_export] macro_rules! hook_before_render_component { - ( $ACTION_HANDLER:ident, $Component:ty ) => { + ( $ACTION_HANDLE:ident, $Component:ty ) => { paste::paste! { - $crate::pub_handle!($ACTION_HANDLER); + $crate::pub_handle!($ACTION_HANDLE); type Action = fn(&$Component, &mut PageContext); @@ -93,7 +93,7 @@ macro_rules! hook_before_render_component { } fn handle(&self) -> Handle { - $ACTION_HANDLER + $ACTION_HANDLE } fn weight(&self) -> isize { @@ -127,9 +127,9 @@ macro_rules! hook_before_render_component { #[inline(always)] fn before_render_inline(component: &mut $Component, context: &mut PageContext) { - run_actions( - $ACTION_HANDLER, - |action| action_ref::<[< BeforeRender $Component >]>(&**action).run(component, context) + run_actions($ACTION_HANDLE, |action| + action_ref::<[< BeforeRender $Component >]>(&**action) + .run(component, context) ); } } From 420b17bb836074f0ca7a7b4a76f00f511c7745c2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 14 Nov 2022 00:09:42 +0100 Subject: [PATCH 244/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8FNuevo=20tipo=20"Na?= =?UTF-8?q?meValue"=20para=20atributo=20"name"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/base/component/form_element/hidden.rs | 4 +-- .../src/base/component/form_element/input.rs | 4 +-- pagetop/src/html.rs | 9 ++++-- pagetop/src/html/name.rs | 32 +++++++++++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 pagetop/src/html/name.rs diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 88584cdd..2d105bf0 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -6,7 +6,7 @@ pub_handle!(COMPONENT_HIDDEN); #[derive(Default)] pub struct Hidden { weight: isize, - name : IdentifierValue, + name : NameValue, value : AttributeValue, } @@ -80,7 +80,7 @@ impl Hidden { // Hidden GETTERS. - pub fn name(&self) -> &IdentifierValue { + pub fn name(&self) -> &NameValue { &self.name } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 1109ac3b..edbf171a 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -20,7 +20,7 @@ pub struct Input { renderable : Renderable, classes : Classes, input_type : InputType, - name : IdentifierValue, + name : NameValue, value : AttributeValue, label : AttributeValue, size : Option<u16>, @@ -369,7 +369,7 @@ impl Input { &self.input_type } - pub fn name(&self) -> &IdentifierValue { + pub fn name(&self) -> &NameValue { &self.name } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 3551caa2..6792820c 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -8,11 +8,14 @@ pub use assets::Assets; mod favicon; pub use favicon::Favicon; -mod attribute; -pub use attribute::AttributeValue; - mod identifier; pub use identifier::IdentifierValue; +mod name; +pub use name::NameValue; + +mod attribute; +pub use attribute::AttributeValue; + mod classes; pub use classes::{Classes, ClassesOp}; diff --git a/pagetop/src/html/name.rs b/pagetop/src/html/name.rs new file mode 100644 index 00000000..5f8f2195 --- /dev/null +++ b/pagetop/src/html/name.rs @@ -0,0 +1,32 @@ +#[derive(Default)] +pub struct NameValue(String); + +impl NameValue { + pub fn new() -> Self { + NameValue::default() + } + + // NameValue BUILDER. + + pub fn with_value(mut self, value: &str) -> Self { + self.alter_value(value); + self + } + + // NameValue ALTER. + + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.0 = value.trim().replace(' ', "_"); + self + } + + // NameValue GETTERS. + + pub fn get(&self) -> Option<String> { + if self.0.is_empty() { + None + } else { + Some(self.0.to_owned()) + } + } +} From 0b4d2b413dd4fca873dc54cf1ce531b302ff8b89 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 14 Nov 2022 21:09:44 +0100 Subject: [PATCH 245/853] =?UTF-8?q?=F0=9F=A5=85=20Incorpora=20ResultExt=20?= =?UTF-8?q?para=20captura/traza=20de=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/db.rs | 3 +-- pagetop/src/lib.rs | 1 + pagetop/src/prelude.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index c7aeb879..fee92181 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,11 +1,10 @@ -use crate::{config, run_now, trace, LazyStatic}; +use crate::{config, run_now, trace, LazyStatic, ResultExt}; pub use url::Url as DbUri; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; -use tracing_unwrap::ResultExt; pub(crate) static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { trace::info!( diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 0a84639a..fb92a186 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -42,6 +42,7 @@ pub use concat_string::concat_string; pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; +pub use tracing_unwrap::ResultExt; // LOCAL. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 79be1bab..1c976151 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,5 +1,5 @@ // Re-exports. -pub use crate::{concat_string, LazyStatic}; +pub use crate::{concat_string, LazyStatic, ResultExt}; // Macros. pub use crate::{args, configure_service_for_static_files, pub_config, pub_handle, pub_locale}; From a687c646f21a13d78217baae063dbe4704f7da53 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 16 Nov 2022 00:32:41 +0100 Subject: [PATCH 246/853] =?UTF-8?q?=F0=9F=8E=A8=20Refina=20algunos=20const?= =?UTF-8?q?ructores=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/base/component/form_element/button.rs | 2 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu.rs | 36 +++++++------------ pagetop/src/base/module/homepage.rs | 12 +++---- 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index e20c920e..32f7c9f7 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -75,7 +75,7 @@ impl ComponentTrait for Button { } impl Button { - pub fn new_with_value(value: &str) -> Self { + pub fn with(value: &str) -> Self { Button::new().with_value(value) } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index cb59442f..eb0b79f8 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -49,7 +49,7 @@ impl ComponentTrait for Image { } impl Image { - pub fn new_with_source(source: &str) -> Self { + pub fn with(source: &str) -> Self { Image::new().with_source(source) } diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index a95ade58..81a0c348 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -83,57 +83,45 @@ impl ComponentTrait for MenuItem { } impl MenuItem { - #[rustfmt::skip] pub fn label(label: &str) -> Self { MenuItem { - weight : 0, - renderable: Renderable::default(), - item_type : MenuItemType::Label(label.to_owned()), + item_type: MenuItemType::Label(label.to_owned()), + ..Default::default() } } - #[rustfmt::skip] pub fn link(label: &str, path: &str) -> Self { MenuItem { - weight : 0, - renderable: Renderable::default(), - item_type : MenuItemType::Link(label.to_owned(), path.to_owned()), + item_type: MenuItemType::Link(label.to_owned(), path.to_owned()), + ..Default::default() } } - #[rustfmt::skip] pub fn link_blank(label: &str, path: &str) -> Self { MenuItem { - weight : 0, - renderable: Renderable::default(), - item_type : MenuItemType::LinkBlank(label.to_owned(), path.to_owned()), + item_type: MenuItemType::LinkBlank(label.to_owned(), path.to_owned()), + ..Default::default() } } - #[rustfmt::skip] pub fn html(html: Markup) -> Self { MenuItem { - weight : 0, - renderable: Renderable::default(), - item_type : MenuItemType::Html(html), + item_type: MenuItemType::Html(html), + ..Default::default() } } - #[rustfmt::skip] pub fn submenu(label: &str, menu: Menu) -> Self { MenuItem { - weight : 0, - renderable: Renderable::default(), - item_type : MenuItemType::Submenu(label.to_owned(), menu), + item_type: MenuItemType::Submenu(label.to_owned(), menu), + ..Default::default() } } - #[rustfmt::skip] pub fn separator() -> Self { MenuItem { - weight : 0, - renderable: Renderable::default(), - item_type : MenuItemType::Separator, + item_type: MenuItemType::Separator, + ..Default::default() } } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index bf282187..5fb37d63 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -35,7 +35,7 @@ async fn demo() -> ResultPage<Markup, FatalError> { .add_to("region-content", welcome()) .add_to("region-content", about_pagetop()) .add_to("region-content", promo_pagetop()) - .add_to("region-content", reporting_problems()) + .add_to("region-content", reporting_issues()) .render() } @@ -90,7 +90,7 @@ fn hello_world() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "hello-col-image") - .with_component(Image::new_with_source("/theme/images/homepage-header.svg")), + .with_component(Image::with("/theme/images/homepage-header.svg")), ), ) } @@ -129,7 +129,7 @@ fn about_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-image") .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::new_with_source("/theme/images/homepage-about.svg")), + .with_component(Image::with("/theme/images/homepage-about.svg")), ) .with_column( grid::Column::new() @@ -185,18 +185,18 @@ fn promo_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-image") .with_size(grid::ColumnSize::Is6of12) - .with_component(Image::new_with_source("/theme/images/homepage-pagetop.png")), + .with_component(Image::with("/theme/images/homepage-pagetop.png")), ), ) } -fn reporting_problems() -> Container { +fn reporting_issues() -> Container { Container::new().with_id("reporting").with_component( grid::Row::new() .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "reporting-col-image") - .with_component(Image::new_with_source("/theme/images/homepage-support.jpg")), + .with_component(Image::with("/theme/images/homepage-support.jpg")), ) .with_column( grid::Column::new() From b0446c720613385f1630a0311e39383955723b3a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 18 Dec 2022 14:09:53 +0100 Subject: [PATCH 247/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20PageContext=20p?= =?UTF-8?q?asa=20a=20ser=20RenderResources?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ahora los componentes no tendrán acceso al contexto de la página (PageContext) porque podrían usarse en otros tipos de respuesta que no sean sólo páginas. En su lugar se usará RenderResources que formarán también parte de la página. --- pagetop-admin/src/summary.rs | 2 +- pagetop/src/base/component/anchor.rs | 10 +- pagetop/src/base/component/block.rs | 14 +-- pagetop/src/base/component/container.rs | 20 ++-- .../src/base/component/form_element/button.rs | 6 +- .../src/base/component/form_element/date.rs | 6 +- .../src/base/component/form_element/form.rs | 12 +-- .../src/base/component/form_element/hidden.rs | 2 +- .../src/base/component/form_element/input.rs | 6 +- pagetop/src/base/component/grid/column.rs | 12 +-- pagetop/src/base/component/grid/row.rs | 12 +-- pagetop/src/base/component/heading.rs | 6 +- pagetop/src/base/component/html.rs | 6 +- pagetop/src/base/component/icon.rs | 10 +- pagetop/src/base/component/image.rs | 6 +- pagetop/src/base/component/menu.rs | 43 +++++---- pagetop/src/base/component/paragraph.rs | 8 +- pagetop/src/base/module/homepage.rs | 2 +- pagetop/src/base/theme/aliner.rs | 10 +- pagetop/src/base/theme/bootsier.rs | 26 +++--- pagetop/src/base/theme/bulmix.rs | 20 ++-- pagetop/src/core/component.rs | 3 + pagetop/src/core/component/bundle.rs | 8 +- pagetop/src/core/component/definition.rs | 33 +++---- pagetop/src/core/component/renderable.rs | 6 +- .../component/resources.rs} | 75 +++++---------- pagetop/src/core/theme/definition.rs | 33 +++++-- pagetop/src/response/fatal_error.rs | 4 +- pagetop/src/response/page.rs | 22 ----- pagetop/src/response/page/definition.rs | 92 ++++++++++++++----- 30 files changed, 263 insertions(+), 252 deletions(-) rename pagetop/src/{response/page/context.rs => core/component/resources.rs} (59%) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index c91b31db..4d10d42e 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -41,7 +41,7 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { .with_item(MenuItem::label("Opción 4")); Page::new() - .with_context(PageOp::SetTheme("Bootsier")) + .with_resource(ResourceOp::SetTheme("Bootsier")) .with_title("Admin") .add_to("top-menu", top_menu) .add_to( diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index b91e939e..5e3c5070 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -51,12 +51,12 @@ impl ComponentTrait for Anchor { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } #[rustfmt::skip] - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Parent => Some("_parent"), @@ -71,9 +71,9 @@ impl ComponentTrait for Anchor { href=[self.href().get()] target=[target] { - (self.left_icon().render(context)) + (self.left_icon().render(rsx)) span { (*self.html()) } - (self.right_icon().render(context)) + (self.right_icon().render(rsx)) } } } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index af89daca..c419df63 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -29,23 +29,23 @@ impl ComponentTrait for Block { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn before_render(&mut self, context: &mut PageContext) { - before_render_inline(self, context); + fn before_render(&mut self, rsx: &mut RenderResources) { + before_render_inline(self, rsx); } - fn default_render(&self, context: &mut PageContext) -> Markup { - let id = context.required_id::<Block>(self.id()); + fn default_render(&self, rsx: &mut RenderResources) -> Markup { + let id = rsx.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes().get()] { @if let Some(title) = self.title().get() { h2 class="block-title" { (title) } } div class="block-body" { - (self.components().render(context)) + (self.components().render(rsx)) } } } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 1024e4de..64e461cf 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -42,47 +42,47 @@ impl ComponentTrait for Container { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn before_render(&mut self, context: &mut PageContext) { - before_render_inline(self, context); + fn before_render(&mut self, rsx: &mut RenderResources) { + before_render_inline(self, rsx); } - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { match self.container_type() { ContainerType::Header => html! { header id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(context)) + (self.components().render(rsx)) } } }, ContainerType::Footer => html! { footer id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(context)) + (self.components().render(rsx)) } } }, ContainerType::Main => html! { main id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(context)) + (self.components().render(rsx)) } } }, ContainerType::Section => html! { section id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(context)) + (self.components().render(rsx)) } } }, _ => html! { div id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(context)) + (self.components().render(rsx)) } }, } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index 32f7c9f7..dfa9b771 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -39,11 +39,11 @@ impl ComponentTrait for Button { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Submit => "submit", diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 910e989a..260daa11 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -36,11 +36,11 @@ impl ComponentTrait for Date { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 8f24800e..b47df647 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -40,15 +40,15 @@ impl ComponentTrait for Form { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn before_render(&mut self, context: &mut PageContext) { - before_render_inline(self, context); + fn before_render(&mut self, rsx: &mut RenderResources) { + before_render_inline(self, rsx); } - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { let method = match self.method() { FormMethod::Post => Some("post".to_owned()), FormMethod::Get => None, @@ -61,7 +61,7 @@ impl ComponentTrait for Form { method=[method] accept-charset=[self.charset().get()] { - div { (self.elements().render(context)) } + div { (self.elements().render(rsx)) } } } } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 2d105bf0..fab1e35f 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -23,7 +23,7 @@ impl ComponentTrait for Hidden { self.weight } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { let id = self.name().get().map(|name| concat_string!("value-", name)); html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index edbf171a..40c16ce3 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -53,12 +53,12 @@ impl ComponentTrait for Input { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } #[rustfmt::skip] - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { let type_input = match self.input_type() { InputType::Textfield => "text", InputType::Password => "password", diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index bb78e9c4..da203229 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -61,18 +61,18 @@ impl ComponentTrait for Column { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn before_render(&mut self, context: &mut PageContext) { - before_render_inline(self, context); + fn before_render(&mut self, rsx: &mut RenderResources) { + before_render_inline(self, rsx); } - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(context)) + (self.components().render(rsx)) } } } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index bd2ddd94..4382fc1b 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -28,18 +28,18 @@ impl ComponentTrait for Row { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn before_render(&mut self, context: &mut PageContext) { - before_render_inline(self, context); + fn before_render(&mut self, rsx: &mut RenderResources) { + before_render_inline(self, rsx); } - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { - (self.columns().render(context)) + (self.columns().render(rsx)) } } } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index bf90567d..1108355b 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -51,11 +51,11 @@ impl ComponentTrait for Heading { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { let id = self.id().get(); let classes = self.classes().get(); html! { @match &self.heading_type() { diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index dfc51289..b169bf2a 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -24,11 +24,11 @@ impl ComponentTrait for Html { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { html! { (*self.html()) } } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 368fb4cc..1cb41331 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -24,17 +24,17 @@ impl ComponentTrait for Icon { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn before_render(&mut self, context: &mut PageContext) { - context.alter(PageOp::AddStyleSheet( + fn before_render(&mut self, rsx: &mut RenderResources) { + rsx.alter(ResourceOp::AddStyleSheet( StyleSheet::located("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), )); } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { html! { i class=[self.classes().get()] {}; } } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index eb0b79f8..0272289e 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -26,11 +26,11 @@ impl ComponentTrait for Image { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn default_render(&self, _: &mut PageContext) -> Markup { + fn default_render(&self, _: &mut RenderResources) -> Markup { html! { img src=[self.source().get()] diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 81a0c348..23f389a4 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -37,11 +37,11 @@ impl ComponentTrait for MenuItem { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { match self.item_type() { MenuItemType::Void => html! {}, @@ -63,7 +63,7 @@ impl ComponentTrait for MenuItem { li class="submenu" { a href="#" { (label) } ul { - (menu.items().render(context)) + (menu.items().render(rsx)) } } }, @@ -186,32 +186,31 @@ impl ComponentTrait for Menu { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn before_render(&mut self, context: &mut PageContext) { - before_render_inline(self, context); + fn before_render(&mut self, rsx: &mut RenderResources) { + before_render_inline(self, rsx); } - fn default_render(&self, context: &mut PageContext) -> Markup { - context - .alter(PageOp::AddStyleSheet( - StyleSheet::located("/theme/menu/css/menu.css").with_version("1.1.1"), - )) - .alter(PageOp::AddStyleSheet( - StyleSheet::located("/theme/menu/css/menu-clean.css").with_version("1.1.1"), - )) - .alter(PageOp::AddJavaScript( - JavaScript::located("/theme/menu/js/menu.min.js").with_version("1.1.1"), - )) - .alter(PageOp::AddJQuery); + fn default_render(&self, rsx: &mut RenderResources) -> Markup { + rsx.alter(ResourceOp::AddStyleSheet( + StyleSheet::located("/theme/menu/css/menu.css").with_version("1.1.1"), + )) + .alter(ResourceOp::AddStyleSheet( + StyleSheet::located("/theme/menu/css/menu-clean.css").with_version("1.1.1"), + )) + .alter(ResourceOp::AddJavaScript( + JavaScript::located("/theme/menu/js/menu.min.js").with_version("1.1.1"), + )) + .alter(ResourceOp::AddJQuery); - let id = context.required_id::<Menu>(self.id()); + let id = rsx.required_id::<Menu>(self.id()); html! { ul id=(id) class=[self.classes().get()] { - (self.items().render(context)) + (self.items().render(rsx)) } script type="text/javascript" defer { "jQuery(function(){jQuery('#" (id) "').smartmenus({" diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index fa60c233..65c932dd 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -38,17 +38,17 @@ impl ComponentTrait for Paragraph { self.weight } - fn is_renderable(&self, context: &PageContext) -> bool { - (self.renderable.check)(context) + fn is_renderable(&self, rsx: &RenderResources) -> bool { + (self.renderable.check)(rsx) } - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { html! { p id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(context)) + (self.components().render(rsx)) } } } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 5fb37d63..d8b37051 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -27,7 +27,7 @@ impl ModuleTrait for DefaultHomePage { async fn demo() -> ResultPage<Markup, FatalError> { Page::new() .with_title(l("page_title").as_str()) - .with_context(PageOp::AddStyleSheet(StyleSheet::located( + .with_resource(ResourceOp::AddStyleSheet(StyleSheet::located( "/theme/module/homepage/styles.css", ))) .with_body_classes(ClassesOp::AddFirst, "default-homepage") diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index 28bdf386..bc94a621 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -16,11 +16,9 @@ impl ThemeTrait for Aliner { } fn before_render_page(&self, page: &mut Page) { - page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.ico"), - )) - .alter_context(PageOp::AddStyleSheet( - StyleSheet::located("/aliner/css/styles.css").with_weight(-99), - )); + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_resource(ResourceOp::AddStyleSheet( + StyleSheet::located("/aliner/css/styles.css").with_weight(-99), + )); } } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index a824b0da..8e2d4bdd 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -18,20 +18,18 @@ impl ThemeTrait for Bootsier { } fn before_render_page(&self, page: &mut Page) { - page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.ico"), - )) - .alter_context(PageOp::AddStyleSheet( - StyleSheet::located("/bootsier/css/bootstrap.min.css") - .with_version("5.1.3") - .with_weight(-99), - )) - .alter_context(PageOp::AddJavaScript( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") - .with_version("5.1.3") - .with_weight(-99), - )) - .alter_context(PageOp::AddJQuery); + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_resource(ResourceOp::AddStyleSheet( + StyleSheet::located("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_resource(ResourceOp::AddJavaScript( + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_resource(ResourceOp::AddJQuery); } fn error_404_not_found(&self) -> Container { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 90ce8c9c..4fa0c702 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -16,22 +16,20 @@ impl ThemeTrait for Bulmix { } fn before_render_page(&self, page: &mut Page) { - page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.ico"), - )) - .alter_context(PageOp::AddStyleSheet( - StyleSheet::located("/bulmix/css/bulma.min.css") - .with_version("0.9.4") - .with_weight(-99), - )) - .alter_context(PageOp::AddJQuery); + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_resource(ResourceOp::AddStyleSheet( + StyleSheet::located("/bulmix/css/bulma.min.css") + .with_version("0.9.4") + .with_weight(-99), + )) + .alter_resource(ResourceOp::AddJQuery); } #[rustfmt::skip] fn before_render_component( &self, component: &mut dyn ComponentTrait, - _context: &mut PageContext, + _rsx: &mut RenderResources, ) { match component.handle() { COMPONENT_ANCHOR => { @@ -110,7 +108,7 @@ impl ThemeTrait for Bulmix { fn render_component( &self, component: &dyn ComponentTrait, - _context: &mut PageContext, + _rsx: &mut RenderResources, ) -> Option<Markup> { match component.handle() { COMPONENT_ICON => { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index cd596397..8f712325 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,3 +1,6 @@ +mod resources; +pub use resources::{RenderResources, ResourceOp}; + mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 2927ff29..44a5280f 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,6 +1,6 @@ -use super::ComponentTrait; +use super::{ComponentTrait, RenderResources}; + use crate::html::{html, Markup}; -use crate::response::page::PageContext; use std::sync::{Arc, RwLock}; @@ -26,12 +26,12 @@ impl ComponentsBundle { self.0.clear(); } - pub fn render(&self, context: &mut PageContext) -> Markup { + pub fn render(&self, rsx: &mut RenderResources) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (" ")(c.write().unwrap().render(context))(" ") + (" ")(c.write().unwrap().render(rsx))(" ") } } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index f7df0561..84181a9e 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,11 +1,12 @@ +use super::RenderResources; + use crate::html::{html, Markup}; -use crate::response::page::PageContext; use crate::util::{single_type_name, Handle}; pub use std::any::Any as AnyComponent; pub trait BaseComponent { - fn render(&mut self, context: &mut PageContext) -> Markup; + fn render(&mut self, rsx: &mut RenderResources) -> Markup; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -28,15 +29,15 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn is_renderable(&self, context: &PageContext) -> bool { + fn is_renderable(&self, rsx: &RenderResources) -> bool { true } #[allow(unused_variables)] - fn before_render(&mut self, context: &mut PageContext) {} + fn before_render(&mut self, rsx: &mut RenderResources) {} #[allow(unused_variables)] - fn default_render(&self, context: &mut PageContext) -> Markup { + fn default_render(&self, rsx: &mut RenderResources) -> Markup { html! {} } @@ -46,17 +47,17 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } impl<C: ComponentTrait> BaseComponent for C { - fn render(&mut self, context: &mut PageContext) -> Markup { + fn render(&mut self, rsx: &mut RenderResources) -> Markup { // Acciones del componente antes de renderizar. - self.before_render(context); + self.before_render(rsx); // Acciones del tema antes de renderizar el componente. - context.theme().before_render_component(self, context); + rsx.theme().before_render_component(self, rsx); - match self.is_renderable(context) { - true => match context.theme().render_component(self, context) { + match self.is_renderable(rsx) { + true => match rsx.theme().render_component(self, rsx) { Some(html) => html, - None => self.default_render(context), + None => self.default_render(rsx), }, false => html! {}, } @@ -77,7 +78,7 @@ macro_rules! hook_before_render_component { paste::paste! { $crate::pub_handle!($ACTION_HANDLE); - type Action = fn(&$Component, &mut PageContext); + type Action = fn(&$Component, &mut RenderResources); pub struct [< BeforeRender $Component >] { action: Option<Action>, @@ -118,18 +119,18 @@ macro_rules! hook_before_render_component { self } - pub fn run(&self, component: &mut $Component, context: &mut PageContext) { + pub fn run(&self, component: &mut $Component, rsx: &mut RenderResources) { if let Some(action) = self.action { - action(component, context) + action(component, rsx) } } } #[inline(always)] - fn before_render_inline(component: &mut $Component, context: &mut PageContext) { + fn before_render_inline(component: &mut $Component, rsx: &mut RenderResources) { run_actions($ACTION_HANDLE, |action| action_ref::<[< BeforeRender $Component >]>(&**action) - .run(component, context) + .run(component, rsx) ); } } diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index c93da898..039b5887 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -1,6 +1,6 @@ -use crate::response::page::PageContext; +use crate::core::component::RenderResources; -pub type IsRenderable = fn(&PageContext) -> bool; +pub type IsRenderable = fn(&RenderResources) -> bool; pub struct Renderable { pub check: IsRenderable, @@ -14,6 +14,6 @@ impl Default for Renderable { } } -fn render_always(_: &PageContext) -> bool { +fn render_always(_: &RenderResources) -> bool { true } diff --git a/pagetop/src/response/page/context.rs b/pagetop/src/core/component/resources.rs similarity index 59% rename from pagetop/src/response/page/context.rs rename to pagetop/src/core/component/resources.rs index 1e5e7a06..1130372d 100644 --- a/pagetop/src/response/page/context.rs +++ b/pagetop/src/core/component/resources.rs @@ -1,7 +1,5 @@ -use super::PageOp; - use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; -use crate::html::{html, Assets, Favicon, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; +use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; use crate::{base, concat_string, config, util, LazyStatic}; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = @@ -10,26 +8,29 @@ static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = None => &base::theme::bootsier::Bootsier, }); +pub enum ResourceOp { + SetTheme(&'static str), + AddStyleSheet(StyleSheet), + RemoveStyleSheet(&'static str), + AddJavaScript(JavaScript), + RemoveJavaScript(&'static str), + AddJQuery, +} + #[rustfmt::skip] -pub struct PageContext { +pub struct RenderResources { theme : ThemeStaticRef, - favicon : Option<Favicon>, - metadata : Vec<(&'static str, &'static str)>, - properties : Vec<(&'static str, &'static str)>, stylesheets: Assets<StyleSheet>, javascripts: Assets<JavaScript>, with_jquery: bool, id_counter : usize, } -impl Default for PageContext { +impl Default for RenderResources { #[rustfmt::skip] fn default() -> Self { - PageContext { + RenderResources { theme : *DEFAULT_THEME, - favicon : None, - metadata : Vec::new(), - properties : Vec::new(), stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), with_jquery: false, @@ -38,45 +39,29 @@ impl Default for PageContext { } } -impl PageContext { +impl RenderResources { pub fn new() -> Self { - PageContext::default() + RenderResources::default() } - pub fn alter(&mut self, op: PageOp) -> &mut Self { + pub fn alter(&mut self, op: ResourceOp) -> &mut Self { match op { - PageOp::SetTheme(theme_name) => { + ResourceOp::SetTheme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); } - - PageOp::AddFavicon(favicon) => { - self.favicon = Some(favicon); - } - PageOp::RemoveFavicon => { - self.favicon = None; - } - - PageOp::AddMetadata(name, content) => { - self.metadata.push((name, content)); - } - PageOp::AddProperty(property, content) => { - self.properties.push((property, content)); - } - - PageOp::AddStyleSheet(css) => { + ResourceOp::AddStyleSheet(css) => { self.stylesheets.add(css); } - PageOp::RemoveStyleSheet(source) => { + ResourceOp::RemoveStyleSheet(source) => { self.stylesheets.remove(source); } - - PageOp::AddJavaScript(js) => { + ResourceOp::AddJavaScript(js) => { self.javascripts.add(js); } - PageOp::RemoveJavaScript(source) => { + ResourceOp::RemoveJavaScript(source) => { self.javascripts.remove(source); } - PageOp::AddJQuery => { + ResourceOp::AddJQuery => { if !self.with_jquery { self.javascripts.add( JavaScript::located("/theme/js/jquery.min.js") @@ -91,32 +76,22 @@ impl PageContext { self } - /// PageContext GETTERS. + /// Resources GETTERS. pub(crate) fn theme(&mut self) -> ThemeStaticRef { self.theme } - /// PageContext RENDER. + /// Resources RENDER. pub fn render(&mut self) -> Markup { html! { - @match &self.favicon { - Some(favicon) => (favicon.render()), - None => "", - } - @for (name, content) in &self.metadata { - meta name=(name) content=(content) {} - } - @for (property, content) in &self.properties { - meta property=(property) content=(content) {} - } (self.stylesheets.render()) (self.javascripts.render()) } } - // PageContext EXTRAS. + // Resources EXTRAS. pub fn required_id<T>(&mut self, id: &IdentifierValue) -> String { match id.get() { diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 3234fe78..f5da0564 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,7 +1,7 @@ use crate::base::component::{Container, Html}; -use crate::core::component::ComponentTrait; +use crate::core::component::{ComponentTrait, RenderResources}; use crate::html::{html, Favicon, Markup}; -use crate::response::page::{Page, PageContext, PageOp}; +use crate::response::page::Page; use crate::util::{single_type_name, Handle}; use crate::{concat_string, config, server}; @@ -28,9 +28,9 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { - page.alter_context(PageOp::AddFavicon( - Favicon::new().with_icon("/theme/favicon.ico"), - )); + if page.favicon().is_none() { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); + } } fn render_page_head(&self, page: &mut Page) -> Markup { @@ -49,10 +49,22 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { @if let Some(d) = page.description().get() { meta name="description" content=(d); } - meta http-equiv="X-UA-Compatible" content="IE=edge"; - meta name="viewport" content=(viewport); - (page.context().render()) + meta name="viewport" content=(viewport); + @for (name, content) in page.metadata() { + meta name=(name) content=(content) {} + } + + meta http-equiv="X-UA-Compatible" content="IE=edge"; + @for (property, content) in page.properties() { + meta property=(property) content=(content) {} + } + + @if let Some(f) = page.favicon() { + (f.render()) + } + + (page.resources().render()) } } } @@ -84,7 +96,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn before_render_component( &self, component: &mut dyn ComponentTrait, - context: &mut PageContext, + rsx: &mut RenderResources, ) { /* Cómo usarlo: @@ -99,11 +111,12 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { */ } + #[rustfmt::skip] #[allow(unused_variables)] fn render_component( &self, component: &dyn ComponentTrait, - context: &mut PageContext, + rsx: &mut RenderResources, ) -> Option<Markup> { None /* diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 00b82e91..29e39077 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -25,7 +25,7 @@ impl fmt::Display for FatalError { // Error 403. FatalError::AccessDenied => { let mut error_page = Page::new(); - let error_content = error_page.context().theme().error_403_access_denied(); + let error_content = error_page.resources().theme().error_403_access_denied(); if let Ok(page) = error_page .with_title("Error FORBIDDEN") .using_template("error") @@ -40,7 +40,7 @@ impl fmt::Display for FatalError { // Error 404. FatalError::NotFound => { let mut error_page = Page::new(); - let error_content = error_page.context().theme().error_404_not_found(); + let error_content = error_page.resources().theme().error_404_not_found(); if let Ok(page) = error_page .with_title("Error RESOURCE NOT FOUND") .using_template("error") diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 92a8241f..3f82c157 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,27 +1,5 @@ -use crate::html::{Favicon, JavaScript, StyleSheet}; - pub use actix_web::Result as ResultPage; -pub enum PageOp { - SetTheme(&'static str), - - AddFavicon(Favicon), - RemoveFavicon, - - AddMetadata(&'static str, &'static str), - AddProperty(&'static str, &'static str), - - AddStyleSheet(StyleSheet), - RemoveStyleSheet(&'static str), - - AddJavaScript(JavaScript), - RemoveJavaScript(&'static str), - AddJQuery, -} - -mod context; -pub use context::PageContext; - mod hook; pub use hook::{BeforeRenderPageHook, HOOK_BEFORE_RENDER_PAGE}; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 1ba7389d..2ae4a63d 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,8 +1,8 @@ -use super::{BeforeRenderPageHook, PageContext, PageOp, ResultPage, HOOK_BEFORE_RENDER_PAGE}; +use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; -use crate::html::{html, AttributeValue, Classes, ClassesOp, Markup, DOCTYPE}; +use crate::html::{html, AttributeValue, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::FatalError; use crate::{config, trace, LazyStatic}; @@ -43,11 +43,14 @@ pub enum TextDirection { #[rustfmt::skip] pub struct Page { - context : PageContext, language : AttributeValue, direction : AttributeValue, title : AttributeValue, description : AttributeValue, + metadata : Vec<(&'static str, &'static str)>, + properties : Vec<(&'static str, &'static str)>, + favicon : Option<Favicon>, + resources : RenderResources, body_classes: Classes, regions : HashMap<&'static str, ComponentsBundle>, template : String, @@ -57,7 +60,6 @@ impl Default for Page { #[rustfmt::skip] fn default() -> Self { Page { - context : PageContext::new(), language : match &*DEFAULT_LANGUAGE { Some(language) => AttributeValue::new().with_value(language), _ => AttributeValue::new(), @@ -68,6 +70,10 @@ impl Default for Page { }, title : AttributeValue::new(), description : AttributeValue::new(), + metadata : Vec::new(), + properties : Vec::new(), + favicon : None, + resources : RenderResources::new(), body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), regions : common_components(), template : "default".to_owned(), @@ -82,11 +88,6 @@ impl Page { // Page BUILDER. - pub fn with_context(mut self, op: PageOp) -> Self { - self.alter_context(op); - self - } - pub fn with_language(mut self, language: &str) -> Self { self.alter_language(language); self @@ -107,6 +108,26 @@ impl Page { self } + pub fn with_metadata(mut self, name: &'static str, content: &'static str) -> Self { + self.alter_metadata(name, content); + self + } + + pub fn with_property(mut self, property: &'static str, content: &'static str) -> Self { + self.alter_property(property, content); + self + } + + pub fn with_favicon(mut self, favicon: Option<Favicon>) -> Self { + self.alter_favicon(favicon); + self + } + + pub fn with_resource(mut self, op: ResourceOp) -> Self { + self.alter_resource(op); + self + } + pub fn with_body_classes(mut self, op: ClassesOp, classes: &str) -> Self { self.alter_body_classes(op, classes); self @@ -129,11 +150,6 @@ impl Page { // Page ALTER. - pub fn alter_context(&mut self, op: PageOp) -> &mut Self { - self.context.alter(op); - self - } - pub fn alter_language(&mut self, language: &str) -> &mut Self { self.language.alter_value(language); self @@ -158,6 +174,26 @@ impl Page { self } + pub fn alter_metadata(&mut self, name: &'static str, content: &'static str) -> &mut Self { + self.metadata.push((name, content)); + self + } + + pub fn alter_property(&mut self, property: &'static str, content: &'static str) -> &mut Self { + self.metadata.push((property, content)); + self + } + + pub fn alter_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { + self.favicon = favicon; + self + } + + pub fn alter_resource(&mut self, op: ResourceOp) -> &mut Self { + self.resources.alter(op); + self + } + pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.body_classes.alter_value(op, classes); self @@ -170,10 +206,6 @@ impl Page { // Page GETTERS. - pub fn context(&mut self) -> &mut PageContext { - &mut self.context - } - pub fn language(&self) -> &AttributeValue { &self.language } @@ -190,6 +222,22 @@ impl Page { &self.description } + pub fn metadata(&self) -> &Vec<(&str, &str)> { + &self.metadata + } + + pub fn properties(&self) -> &Vec<(&str, &str)> { + &self.properties + } + + pub fn favicon(&self) -> &Option<Favicon> { + &self.favicon + } + + pub fn resources(&mut self) -> &mut RenderResources { + &mut self.resources + } + pub fn body_classes(&self) -> &Classes { &self.body_classes } @@ -207,13 +255,13 @@ impl Page { }); // Acciones del tema antes de renderizar la página. - self.context.theme().before_render_page(self); + self.resources.theme().before_render_page(self); // Primero, renderizar el cuerpo. - let body = self.context.theme().render_page_body(self); + let body = self.resources.theme().render_page_body(self); // Luego, renderizar la cabecera. - let head = self.context.theme().render_page_head(self); + let head = self.resources.theme().render_page_head(self); // Finalmente, renderizar la página. Ok(html! { @@ -227,7 +275,7 @@ impl Page { pub fn render_region(&mut self, region: &str) -> Option<Markup> { match self.regions.get_mut(region) { - Some(components) => Some(components.render(&mut self.context)), + Some(components) => Some(components.render(&mut self.resources)), None => None, } } From 6d49830717d324bc40b0208aace2dacf52b90ce5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 19 Dec 2022 16:54:36 +0100 Subject: [PATCH 248/853] =?UTF-8?q?=F0=9F=8E=A8=20Los=20m=C3=B3dulos=20b?= =?UTF-8?q?=C3=A1sicos=20se=20instalan=20por=20defecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Los módulos básicos de PageTop no requieren acceso a ninguna base de datos, pero pueden extenderse para añadir funcionalidades avanzadas que lo requieran. --- drust/src/main.rs | 1 - pagetop/src/core/module/all.rs | 11 +++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index f5167f33..7210dcdf 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -14,7 +14,6 @@ impl ModuleTrait for Drust { &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, - &pagetop::base::module::homepage::DefaultHomePage, ] } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 84f55b47..b820d6a4 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,5 +1,6 @@ use super::ModuleStaticRef; +use crate::base::module; use crate::core::hook::add_action; use crate::core::theme; use crate::{server, trace, LazyStatic}; @@ -18,14 +19,20 @@ static DISCARDED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); pub fn register_modules(app: ModuleStaticRef) { - // Revisa los módulos a deshabilitar. + // List of modules to disable. let mut list: Vec<ModuleStaticRef> = Vec::new(); add_to_discarded(&mut list, app); DISCARDED_MODULES.write().unwrap().append(&mut list); - // Habilita los módulos de la aplicación. + // List of modules to enable. let mut list: Vec<ModuleStaticRef> = Vec::new(); + + // Enable application modules. add_to_enabled(&mut list, app); + + // Enable default homepage. + add_to_enabled(&mut list, &module::homepage::DefaultHomePage); + list.reverse(); ENABLED_MODULES.write().unwrap().append(&mut list); } From a25a7f4dfa12b317044d11237ca4c5562312d359 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 19 Dec 2022 17:16:33 +0100 Subject: [PATCH 249/853] =?UTF-8?q?=F0=9F=9A=A7=20Prepara=20m=C3=B3dulo=20?= =?UTF-8?q?dedicado=20a=20la=20gesti=C3=B3n=20de=20men=C3=BAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/module.rs | 1 + pagetop/src/base/module/menu.rs | 21 +++++++++++++++++++ .../base/module/menu/locales/en-US/menu.ftl | 2 ++ .../base/module/menu/locales/es-ES/menu.ftl | 2 ++ pagetop/src/core/module/all.rs | 3 +++ 5 files changed, 29 insertions(+) create mode 100644 pagetop/src/base/module/menu.rs create mode 100644 pagetop/src/base/module/menu/locales/en-US/menu.ftl create mode 100644 pagetop/src/base/module/menu/locales/es-ES/menu.ftl diff --git a/pagetop/src/base/module.rs b/pagetop/src/base/module.rs index 070e5b82..1d28f868 100644 --- a/pagetop/src/base/module.rs +++ b/pagetop/src/base/module.rs @@ -1 +1,2 @@ +pub mod menu; pub mod homepage; diff --git a/pagetop/src/base/module/menu.rs b/pagetop/src/base/module/menu.rs new file mode 100644 index 00000000..2894bdda --- /dev/null +++ b/pagetop/src/base/module/menu.rs @@ -0,0 +1,21 @@ +use crate::prelude::*; + +pub_handle!(MODULE_MENU); + +pub_locale!("src/base/module/menu/locales"); + +pub struct Menu; + +impl ModuleTrait for Menu { + fn handle(&self) -> Handle { + MODULE_MENU + } + + fn name(&self) -> String { + l("module_name") + } + + fn description(&self) -> Option<String> { + Some(l("module_description")) + } +} diff --git a/pagetop/src/base/module/menu/locales/en-US/menu.ftl b/pagetop/src/base/module/menu/locales/en-US/menu.ftl new file mode 100644 index 00000000..b35e9677 --- /dev/null +++ b/pagetop/src/base/module/menu/locales/en-US/menu.ftl @@ -0,0 +1,2 @@ +module_name = Menu +module_description = ... diff --git a/pagetop/src/base/module/menu/locales/es-ES/menu.ftl b/pagetop/src/base/module/menu/locales/es-ES/menu.ftl new file mode 100644 index 00000000..a36de8ac --- /dev/null +++ b/pagetop/src/base/module/menu/locales/es-ES/menu.ftl @@ -0,0 +1,2 @@ +module_name = Menú +module_description = ... diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index b820d6a4..3f6a73d9 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -27,6 +27,9 @@ pub fn register_modules(app: ModuleStaticRef) { // List of modules to enable. let mut list: Vec<ModuleStaticRef> = Vec::new(); + // Enable base modules. + add_to_enabled(&mut list, &module::menu::Menu); + // Enable application modules. add_to_enabled(&mut list, app); From a73491de70435915a4ba0523081537589d9aac89 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 3 Jan 2023 19:18:12 +0100 Subject: [PATCH 250/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20RenderResources?= =?UTF-8?q?=20pasa=20a=20ser=20RenderContext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 2 +- pagetop/src/base/component/anchor.rs | 10 +++--- pagetop/src/base/component/block.rs | 14 ++++---- pagetop/src/base/component/container.rs | 20 ++++++------ .../src/base/component/form_element/button.rs | 6 ++-- .../src/base/component/form_element/date.rs | 6 ++-- .../src/base/component/form_element/form.rs | 12 +++---- .../src/base/component/form_element/hidden.rs | 2 +- .../src/base/component/form_element/input.rs | 6 ++-- pagetop/src/base/component/grid/column.rs | 12 +++---- pagetop/src/base/component/grid/row.rs | 12 +++---- pagetop/src/base/component/heading.rs | 6 ++-- pagetop/src/base/component/html.rs | 6 ++-- pagetop/src/base/component/icon.rs | 10 +++--- pagetop/src/base/component/image.rs | 6 ++-- pagetop/src/base/component/menu.rs | 30 ++++++++--------- pagetop/src/base/component/paragraph.rs | 8 ++--- pagetop/src/base/module/homepage.rs | 2 +- pagetop/src/base/theme/aliner.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 6 ++-- pagetop/src/base/theme/bulmix.rs | 8 ++--- pagetop/src/core/component.rs | 4 +-- pagetop/src/core/component/bundle.rs | 6 ++-- .../component/{resources.rs => context.rs} | 32 +++++++++---------- pagetop/src/core/component/definition.rs | 32 +++++++++---------- pagetop/src/core/component/renderable.rs | 6 ++-- pagetop/src/core/theme/definition.rs | 8 ++--- pagetop/src/response/fatal_error.rs | 4 +-- pagetop/src/response/page/definition.rs | 24 +++++++------- 29 files changed, 151 insertions(+), 151 deletions(-) rename pagetop/src/core/component/{resources.rs => context.rs} (82%) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 4d10d42e..168d5a10 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -41,7 +41,7 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { .with_item(MenuItem::label("Opción 4")); Page::new() - .with_resource(ResourceOp::SetTheme("Bootsier")) + .with_context(ContextOp::SetTheme("Bootsier")) .with_title("Admin") .add_to("top-menu", top_menu) .add_to( diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 5e3c5070..07c6c1af 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -51,12 +51,12 @@ impl ComponentTrait for Anchor { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } #[rustfmt::skip] - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Parent => Some("_parent"), @@ -71,9 +71,9 @@ impl ComponentTrait for Anchor { href=[self.href().get()] target=[target] { - (self.left_icon().render(rsx)) + (self.left_icon().render(rcx)) span { (*self.html()) } - (self.right_icon().render(rsx)) + (self.right_icon().render(rcx)) } } } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index c419df63..f6094fc5 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -29,23 +29,23 @@ impl ComponentTrait for Block { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn before_render(&mut self, rsx: &mut RenderResources) { - before_render_inline(self, rsx); + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { - let id = rsx.required_id::<Block>(self.id()); + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + let id = rcx.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes().get()] { @if let Some(title) = self.title().get() { h2 class="block-title" { (title) } } div class="block-body" { - (self.components().render(rsx)) + (self.components().render(rcx)) } } } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 64e461cf..a502eda8 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -42,47 +42,47 @@ impl ComponentTrait for Container { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn before_render(&mut self, rsx: &mut RenderResources) { - before_render_inline(self, rsx); + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { match self.container_type() { ContainerType::Header => html! { header id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rsx)) + (self.components().render(rcx)) } } }, ContainerType::Footer => html! { footer id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rsx)) + (self.components().render(rcx)) } } }, ContainerType::Main => html! { main id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rsx)) + (self.components().render(rcx)) } } }, ContainerType::Section => html! { section id=[self.id().get()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rsx)) + (self.components().render(rcx)) } } }, _ => html! { div id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(rsx)) + (self.components().render(rcx)) } }, } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index dfa9b771..f32f5082 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -39,11 +39,11 @@ impl ComponentTrait for Button { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Submit => "submit", diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 260daa11..a6e5b598 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -36,11 +36,11 @@ impl ComponentTrait for Date { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index b47df647..d658cc64 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -40,15 +40,15 @@ impl ComponentTrait for Form { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn before_render(&mut self, rsx: &mut RenderResources) { - before_render_inline(self, rsx); + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { let method = match self.method() { FormMethod::Post => Some("post".to_owned()), FormMethod::Get => None, @@ -61,7 +61,7 @@ impl ComponentTrait for Form { method=[method] accept-charset=[self.charset().get()] { - div { (self.elements().render(rsx)) } + div { (self.elements().render(rcx)) } } } } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index fab1e35f..f7c554e6 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -23,7 +23,7 @@ impl ComponentTrait for Hidden { self.weight } - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { let id = self.name().get().map(|name| concat_string!("value-", name)); html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 40c16ce3..ee79d1bf 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -53,12 +53,12 @@ impl ComponentTrait for Input { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } #[rustfmt::skip] - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { let type_input = match self.input_type() { InputType::Textfield => "text", InputType::Password => "password", diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index da203229..95e92e57 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -61,18 +61,18 @@ impl ComponentTrait for Column { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn before_render(&mut self, rsx: &mut RenderResources) { - before_render_inline(self, rsx); + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(rsx)) + (self.components().render(rcx)) } } } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 4382fc1b..ba9ccd93 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -28,18 +28,18 @@ impl ComponentTrait for Row { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn before_render(&mut self, rsx: &mut RenderResources) { - before_render_inline(self, rsx); + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { html! { div id=[self.id().get()] class=[self.classes().get()] { - (self.columns().render(rsx)) + (self.columns().render(rcx)) } } } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 1108355b..de396e46 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -51,11 +51,11 @@ impl ComponentTrait for Heading { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { let id = self.id().get(); let classes = self.classes().get(); html! { @match &self.heading_type() { diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index b169bf2a..6e7f8bdc 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -24,11 +24,11 @@ impl ComponentTrait for Html { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { html! { (*self.html()) } } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 1cb41331..db028475 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -24,17 +24,17 @@ impl ComponentTrait for Icon { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn before_render(&mut self, rsx: &mut RenderResources) { - rsx.alter(ResourceOp::AddStyleSheet( + fn before_render(&mut self, rcx: &mut RenderContext) { + rcx.alter(ContextOp::AddStyleSheet( StyleSheet::located("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), )); } - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { html! { i class=[self.classes().get()] {}; } } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 0272289e..0cd54804 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -26,11 +26,11 @@ impl ComponentTrait for Image { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderResources) -> Markup { + fn default_render(&self, _: &mut RenderContext) -> Markup { html! { img src=[self.source().get()] diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 23f389a4..d5df0272 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -37,11 +37,11 @@ impl ComponentTrait for MenuItem { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { match self.item_type() { MenuItemType::Void => html! {}, @@ -63,7 +63,7 @@ impl ComponentTrait for MenuItem { li class="submenu" { a href="#" { (label) } ul { - (menu.items().render(rsx)) + (menu.items().render(rcx)) } } }, @@ -186,31 +186,31 @@ impl ComponentTrait for Menu { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn before_render(&mut self, rsx: &mut RenderResources) { - before_render_inline(self, rsx); + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { - rsx.alter(ResourceOp::AddStyleSheet( + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + rcx.alter(ContextOp::AddStyleSheet( StyleSheet::located("/theme/menu/css/menu.css").with_version("1.1.1"), )) - .alter(ResourceOp::AddStyleSheet( + .alter(ContextOp::AddStyleSheet( StyleSheet::located("/theme/menu/css/menu-clean.css").with_version("1.1.1"), )) - .alter(ResourceOp::AddJavaScript( + .alter(ContextOp::AddJavaScript( JavaScript::located("/theme/menu/js/menu.min.js").with_version("1.1.1"), )) - .alter(ResourceOp::AddJQuery); + .alter(ContextOp::AddJQuery); - let id = rsx.required_id::<Menu>(self.id()); + let id = rcx.required_id::<Menu>(self.id()); html! { ul id=(id) class=[self.classes().get()] { - (self.items().render(rsx)) + (self.items().render(rcx)) } script type="text/javascript" defer { "jQuery(function(){jQuery('#" (id) "').smartmenus({" diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 65c932dd..6ab208f0 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -38,17 +38,17 @@ impl ComponentTrait for Paragraph { self.weight } - fn is_renderable(&self, rsx: &RenderResources) -> bool { - (self.renderable.check)(rsx) + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) } - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { html! { p id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(rsx)) + (self.components().render(rcx)) } } } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index d8b37051..f71a04a4 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -27,7 +27,7 @@ impl ModuleTrait for DefaultHomePage { async fn demo() -> ResultPage<Markup, FatalError> { Page::new() .with_title(l("page_title").as_str()) - .with_resource(ResourceOp::AddStyleSheet(StyleSheet::located( + .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/theme/module/homepage/styles.css", ))) .with_body_classes(ClassesOp::AddFirst, "default-homepage") diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index bc94a621..e9ef98b3 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -17,7 +17,7 @@ impl ThemeTrait for Aliner { fn before_render_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_resource(ResourceOp::AddStyleSheet( + .alter_context(ContextOp::AddStyleSheet( StyleSheet::located("/aliner/css/styles.css").with_weight(-99), )); } diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 8e2d4bdd..36ca54e9 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -19,17 +19,17 @@ impl ThemeTrait for Bootsier { fn before_render_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_resource(ResourceOp::AddStyleSheet( + .alter_context(ContextOp::AddStyleSheet( StyleSheet::located("/bootsier/css/bootstrap.min.css") .with_version("5.1.3") .with_weight(-99), )) - .alter_resource(ResourceOp::AddJavaScript( + .alter_context(ContextOp::AddJavaScript( JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") .with_version("5.1.3") .with_weight(-99), )) - .alter_resource(ResourceOp::AddJQuery); + .alter_context(ContextOp::AddJQuery); } fn error_404_not_found(&self) -> Container { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index 4fa0c702..cef1d6a9 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -17,19 +17,19 @@ impl ThemeTrait for Bulmix { fn before_render_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_resource(ResourceOp::AddStyleSheet( + .alter_context(ContextOp::AddStyleSheet( StyleSheet::located("/bulmix/css/bulma.min.css") .with_version("0.9.4") .with_weight(-99), )) - .alter_resource(ResourceOp::AddJQuery); + .alter_context(ContextOp::AddJQuery); } #[rustfmt::skip] fn before_render_component( &self, component: &mut dyn ComponentTrait, - _rsx: &mut RenderResources, + _rcx: &mut RenderContext, ) { match component.handle() { COMPONENT_ANCHOR => { @@ -108,7 +108,7 @@ impl ThemeTrait for Bulmix { fn render_component( &self, component: &dyn ComponentTrait, - _rsx: &mut RenderResources, + _rcx: &mut RenderContext, ) -> Option<Markup> { match component.handle() { COMPONENT_ICON => { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 8f712325..28733bb3 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,5 +1,5 @@ -mod resources; -pub use resources::{RenderResources, ResourceOp}; +mod context; +pub use context::{RenderContext, ContextOp}; mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 44a5280f..3e16092d 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,4 +1,4 @@ -use super::{ComponentTrait, RenderResources}; +use super::{ComponentTrait, RenderContext}; use crate::html::{html, Markup}; @@ -26,12 +26,12 @@ impl ComponentsBundle { self.0.clear(); } - pub fn render(&self, rsx: &mut RenderResources) -> Markup { + pub fn render(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (" ")(c.write().unwrap().render(rsx))(" ") + (" ")(c.write().unwrap().render(rcx))(" ") } } } diff --git a/pagetop/src/core/component/resources.rs b/pagetop/src/core/component/context.rs similarity index 82% rename from pagetop/src/core/component/resources.rs rename to pagetop/src/core/component/context.rs index 1130372d..88a3368e 100644 --- a/pagetop/src/core/component/resources.rs +++ b/pagetop/src/core/component/context.rs @@ -8,7 +8,7 @@ static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = None => &base::theme::bootsier::Bootsier, }); -pub enum ResourceOp { +pub enum ContextOp { SetTheme(&'static str), AddStyleSheet(StyleSheet), RemoveStyleSheet(&'static str), @@ -18,7 +18,7 @@ pub enum ResourceOp { } #[rustfmt::skip] -pub struct RenderResources { +pub struct RenderContext { theme : ThemeStaticRef, stylesheets: Assets<StyleSheet>, javascripts: Assets<JavaScript>, @@ -26,10 +26,10 @@ pub struct RenderResources { id_counter : usize, } -impl Default for RenderResources { +impl Default for RenderContext { #[rustfmt::skip] fn default() -> Self { - RenderResources { + RenderContext { theme : *DEFAULT_THEME, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), @@ -39,29 +39,29 @@ impl Default for RenderResources { } } -impl RenderResources { +impl RenderContext { pub fn new() -> Self { - RenderResources::default() + RenderContext::default() } - pub fn alter(&mut self, op: ResourceOp) -> &mut Self { + pub fn alter(&mut self, op: ContextOp) -> &mut Self { match op { - ResourceOp::SetTheme(theme_name) => { + ContextOp::SetTheme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); } - ResourceOp::AddStyleSheet(css) => { + ContextOp::AddStyleSheet(css) => { self.stylesheets.add(css); } - ResourceOp::RemoveStyleSheet(source) => { + ContextOp::RemoveStyleSheet(source) => { self.stylesheets.remove(source); } - ResourceOp::AddJavaScript(js) => { + ContextOp::AddJavaScript(js) => { self.javascripts.add(js); } - ResourceOp::RemoveJavaScript(source) => { + ContextOp::RemoveJavaScript(source) => { self.javascripts.remove(source); } - ResourceOp::AddJQuery => { + ContextOp::AddJQuery => { if !self.with_jquery { self.javascripts.add( JavaScript::located("/theme/js/jquery.min.js") @@ -76,13 +76,13 @@ impl RenderResources { self } - /// Resources GETTERS. + /// Context GETTERS. pub(crate) fn theme(&mut self) -> ThemeStaticRef { self.theme } - /// Resources RENDER. + /// Context RENDER. pub fn render(&mut self) -> Markup { html! { @@ -91,7 +91,7 @@ impl RenderResources { } } - // Resources EXTRAS. + // Context EXTRAS. pub fn required_id<T>(&mut self, id: &IdentifierValue) -> String { match id.get() { diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 84181a9e..14608885 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,4 +1,4 @@ -use super::RenderResources; +use super::RenderContext; use crate::html::{html, Markup}; use crate::util::{single_type_name, Handle}; @@ -6,7 +6,7 @@ use crate::util::{single_type_name, Handle}; pub use std::any::Any as AnyComponent; pub trait BaseComponent { - fn render(&mut self, rsx: &mut RenderResources) -> Markup; + fn render(&mut self, rcx: &mut RenderContext) -> Markup; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -29,15 +29,15 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn is_renderable(&self, rsx: &RenderResources) -> bool { + fn is_renderable(&self, rcx: &RenderContext) -> bool { true } #[allow(unused_variables)] - fn before_render(&mut self, rsx: &mut RenderResources) {} + fn before_render(&mut self, rcx: &mut RenderContext) {} #[allow(unused_variables)] - fn default_render(&self, rsx: &mut RenderResources) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { html! {} } @@ -47,17 +47,17 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } impl<C: ComponentTrait> BaseComponent for C { - fn render(&mut self, rsx: &mut RenderResources) -> Markup { + fn render(&mut self, rcx: &mut RenderContext) -> Markup { // Acciones del componente antes de renderizar. - self.before_render(rsx); + self.before_render(rcx); // Acciones del tema antes de renderizar el componente. - rsx.theme().before_render_component(self, rsx); + rcx.theme().before_render_component(self, rcx); - match self.is_renderable(rsx) { - true => match rsx.theme().render_component(self, rsx) { + match self.is_renderable(rcx) { + true => match rcx.theme().render_component(self, rcx) { Some(html) => html, - None => self.default_render(rsx), + None => self.default_render(rcx), }, false => html! {}, } @@ -78,7 +78,7 @@ macro_rules! hook_before_render_component { paste::paste! { $crate::pub_handle!($ACTION_HANDLE); - type Action = fn(&$Component, &mut RenderResources); + type Action = fn(&$Component, &mut RenderContext); pub struct [< BeforeRender $Component >] { action: Option<Action>, @@ -119,18 +119,18 @@ macro_rules! hook_before_render_component { self } - pub fn run(&self, component: &mut $Component, rsx: &mut RenderResources) { + pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { if let Some(action) = self.action { - action(component, rsx) + action(component, rcx) } } } #[inline(always)] - fn before_render_inline(component: &mut $Component, rsx: &mut RenderResources) { + fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { run_actions($ACTION_HANDLE, |action| action_ref::<[< BeforeRender $Component >]>(&**action) - .run(component, rsx) + .run(component, rcx) ); } } diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index 039b5887..ce2f302c 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -1,6 +1,6 @@ -use crate::core::component::RenderResources; +use crate::core::component::RenderContext; -pub type IsRenderable = fn(&RenderResources) -> bool; +pub type IsRenderable = fn(&RenderContext) -> bool; pub struct Renderable { pub check: IsRenderable, @@ -14,6 +14,6 @@ impl Default for Renderable { } } -fn render_always(_: &RenderResources) -> bool { +fn render_always(_: &RenderContext) -> bool { true } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index f5da0564..57c14833 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,5 +1,5 @@ use crate::base::component::{Container, Html}; -use crate::core::component::{ComponentTrait, RenderResources}; +use crate::core::component::{ComponentTrait, RenderContext}; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; use crate::util::{single_type_name, Handle}; @@ -64,7 +64,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { (f.render()) } - (page.resources().render()) + (page.context().render()) } } } @@ -96,7 +96,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn before_render_component( &self, component: &mut dyn ComponentTrait, - rsx: &mut RenderResources, + rcx: &mut RenderContext, ) { /* Cómo usarlo: @@ -116,7 +116,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { fn render_component( &self, component: &dyn ComponentTrait, - rsx: &mut RenderResources, + rcx: &mut RenderContext, ) -> Option<Markup> { None /* diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 29e39077..00b82e91 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -25,7 +25,7 @@ impl fmt::Display for FatalError { // Error 403. FatalError::AccessDenied => { let mut error_page = Page::new(); - let error_content = error_page.resources().theme().error_403_access_denied(); + let error_content = error_page.context().theme().error_403_access_denied(); if let Ok(page) = error_page .with_title("Error FORBIDDEN") .using_template("error") @@ -40,7 +40,7 @@ impl fmt::Display for FatalError { // Error 404. FatalError::NotFound => { let mut error_page = Page::new(); - let error_content = error_page.resources().theme().error_404_not_found(); + let error_content = error_page.context().theme().error_404_not_found(); if let Ok(page) = error_page .with_title("Error RESOURCE NOT FOUND") .using_template("error") diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 2ae4a63d..0adcd6be 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -50,7 +50,7 @@ pub struct Page { metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, favicon : Option<Favicon>, - resources : RenderResources, + context : RenderContext, body_classes: Classes, regions : HashMap<&'static str, ComponentsBundle>, template : String, @@ -73,7 +73,7 @@ impl Default for Page { metadata : Vec::new(), properties : Vec::new(), favicon : None, - resources : RenderResources::new(), + context : RenderContext::new(), body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), regions : common_components(), template : "default".to_owned(), @@ -123,8 +123,8 @@ impl Page { self } - pub fn with_resource(mut self, op: ResourceOp) -> Self { - self.alter_resource(op); + pub fn with_context(mut self, op: ContextOp) -> Self { + self.alter_context(op); self } @@ -189,8 +189,8 @@ impl Page { self } - pub fn alter_resource(&mut self, op: ResourceOp) -> &mut Self { - self.resources.alter(op); + pub fn alter_context(&mut self, op: ContextOp) -> &mut Self { + self.context.alter(op); self } @@ -234,8 +234,8 @@ impl Page { &self.favicon } - pub fn resources(&mut self) -> &mut RenderResources { - &mut self.resources + pub fn context(&mut self) -> &mut RenderContext { + &mut self.context } pub fn body_classes(&self) -> &Classes { @@ -255,13 +255,13 @@ impl Page { }); // Acciones del tema antes de renderizar la página. - self.resources.theme().before_render_page(self); + self.context.theme().before_render_page(self); // Primero, renderizar el cuerpo. - let body = self.resources.theme().render_page_body(self); + let body = self.context.theme().render_page_body(self); // Luego, renderizar la cabecera. - let head = self.resources.theme().render_page_head(self); + let head = self.context.theme().render_page_head(self); // Finalmente, renderizar la página. Ok(html! { @@ -275,7 +275,7 @@ impl Page { pub fn render_region(&mut self, region: &str) -> Option<Markup> { match self.regions.get_mut(region) { - Some(components) => Some(components.render(&mut self.resources)), + Some(components) => Some(components.render(&mut self.context)), None => None, } } From 5bef90600f02c20981ce26913d024c5295461c88 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 23 Jan 2023 20:38:59 +0100 Subject: [PATCH 251/853] =?UTF-8?q?=F0=9F=8E=89=20[pagetop-build]=20incluy?= =?UTF-8?q?e=20recursos=20en=20binarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Estandariza la forma de incluir recursos en los binarios de las aplicaciones creadas con PageTop. --- Cargo.toml | 2 ++ pagetop-build/Cargo.toml | 17 +++++++++ pagetop-build/README.md | 27 ++++++++++++++ pagetop-build/src/lib.rs | 77 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 pagetop-build/Cargo.toml create mode 100644 pagetop-build/README.md create mode 100644 pagetop-build/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 68596cc0..3e647964 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,8 @@ members = [ "pagetop", + "pagetop-build", + # Modules. "pagetop-admin", "pagetop-user", "pagetop-node", diff --git a/pagetop-build/Cargo.toml b/pagetop-build/Cargo.toml new file mode 100644 index 00000000..b3a960fc --- /dev/null +++ b/pagetop-build/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "pagetop-build" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Allows including resources in binaries when compiling applications built with PageTop.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +static-files = "0.2.3" diff --git a/pagetop-build/README.md b/pagetop-build/README.md new file mode 100644 index 00000000..7b97d5de --- /dev/null +++ b/pagetop-build/README.md @@ -0,0 +1,27 @@ +Proporciona funcionalidades para incluir recursos en los binarios al compilar aplicaciones creadas +con **PageTop**. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-build/src/lib.rs b/pagetop-build/src/lib.rs new file mode 100644 index 00000000..126a798b --- /dev/null +++ b/pagetop-build/src/lib.rs @@ -0,0 +1,77 @@ +//! This function uses the [static_files](https://docs.rs/static-files/latest/static_files/) library +//! to embed at compile time a bundle of static files in your binary. +//! +//! Just create folder with static resources in your project (for example `static`): +//! +//! ```bash +//! cd project_dir +//! mkdir static +//! echo "Hello, world" > static/hello +//! ``` +//! +//! Add to `Cargo.toml` the required dependencies: +//! +//! ```toml +//! [build-dependencies] +//! pagetop-build = { ... } +//! ``` +//! +//! Add `build.rs` with call to bundle resources (*guides* will be the magic word in this example): +//! +//! ```rust#ignore +//! fn main() -> std::io::Result<()> { +//! pagetop_build::bundle_resources("./static", "guides", None) +//! } +//! ``` +//! +//! Optionally, you can pass a function to filter those files into the `./static` folder which +//! should be excluded in the resources file: +//! +//! ```rust#ignore +//! fn main() -> std::io::Result<()> { +//! pagetop_build::bundle_resources("./static", "guides", Some(except_css_dir)) +//! } +//! +//! fn except_css_dir(p: &Path) -> bool { +//! if let Some(parent) = p.parent() { +//! !matches!(parent.to_str(), Some("/css")) +//! } +//! true +//! } +//! ``` +//! +//! This will create a file called `guides.rs` in the standard directory +//! [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html) where all +//! intermediate and output artifacts are placed during compilation. +//! +//! You don't need to access this file, just include it in your project source code and a module +//! called `resources_guides` will be added. Then simply reference the `bundle_guides` function to +//! embed the generated HashMap resources collection: +//! +//! ```rust#ignore +//! use pagetop::prelude::*; +//! +//! include!(concat!(env!("OUT_DIR"), "/guides.rs")); +//! static RESOURCES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides); +//! ``` +//! +//! You can build more than one resources file to compile with your project. + +use std::path::Path; + +pub fn bundle_resources( + from_dir: &str, + with_name: &str, + filtering: Option<fn(p: &Path) -> bool>, +) -> std::io::Result<()> { + let mut bundle = static_files::resource_dir(from_dir); + bundle.with_generated_filename( + Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), + ); + bundle.with_module_name(format!("resources_{}", with_name)); + bundle.with_generated_fn(format!("bundle_{}", with_name)); + if let Some(filter_files) = filtering { + bundle.with_filter(filter_files); + } + bundle.build() +} From 7ed2d37e52531dbe3cc49e07d86d7be455875e74 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 23 Jan 2023 20:41:02 +0100 Subject: [PATCH 252/853] =?UTF-8?q?=F0=9F=94=A5=20Quita=20c=C3=B3digo=20in?= =?UTF-8?q?cluido=20ahora=20en=20[pagetop-build]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- pagetop/build.rs | 21 +++-------- pagetop/src/util.rs | 85 --------------------------------------------- 3 files changed, 5 insertions(+), 103 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index fc11be06..ea87b851 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -70,7 +70,7 @@ postgres = ["database", "sea-orm/sqlx-postgres"] sqlite = ["database", "sea-orm/sqlx-sqlite"] [build-dependencies] -static-files = "0.2.3" +pagetop-build = { path = "../pagetop-build", version = "0.0" } [dev-dependencies] tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread"] } diff --git a/pagetop/build.rs b/pagetop/build.rs index 92f494cf..b20b2739 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,19 +1,6 @@ -use std::path::Path; - fn main() -> std::io::Result<()> { - bundle_resources("./static/theme", "theme")?; - bundle_resources("./static/aliner", "aliner")?; - bundle_resources("./static/bootsier", "bootsier")?; - bundle_resources("./static/bulmix", "bulmix") -} - -/// This function is a simplified version of `pagetop::util::bundle_resources()`. -pub fn bundle_resources(from_dir: &str, with_name: &str) -> std::io::Result<()> { - let mut bundle = static_files::resource_dir(from_dir); - bundle.with_generated_filename( - Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), - ); - bundle.with_module_name(format!("resources_{}", with_name)); - bundle.with_generated_fn(format!("bundle_{}", with_name)); - bundle.build() + pagetop_build::bundle_resources("./static/theme", "theme", None)?; + pagetop_build::bundle_resources("./static/aliner", "aliner", None)?; + pagetop_build::bundle_resources("./static/bootsier", "bootsier", None)?; + pagetop_build::bundle_resources("./static/bulmix", "bulmix", None) } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index f7b78a18..1fe37b80 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,92 +1,7 @@ pub use static_files::Resource as StaticResource; -use std::path::Path; - pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; -/// This function uses the [static_files](https://docs.rs/static-files/latest/static_files/) library -/// to embed at compile time a bundle of static files in your binary. -/// -/// Just create folder with static resources in your project (for example `static`): -/// -/// ```bash -/// cd project_dir -/// mkdir static -/// echo "Hello, world" > static/hello -/// ``` -/// -/// Add to `Cargo.toml` the required dependencies: -/// -/// ```toml -/// [dependencies] -/// pagetop = { ... } -/// static-files = "0.2.3" -/// -/// [build-dependencies] -/// pagetop = { ... } -/// ``` -/// -/// Add `build.rs` with call to bundle resources (*guides* will be the magic word in this example): -/// -/// ```rust#ignore -/// use pagetop::util::bundle_resources; -/// -/// fn main() -> std::io::Result<()> { -/// bundle_resources("./static", "guides", None) -/// } -/// ``` -/// -/// Optionally, you can pass a function to filter those files into the `./static` folder which -/// should be included in the resources file: -/// -/// ```rust#ignore -/// use pagetop::util::bundle_resources; -/// -/// fn main() -> std::io::Result<()> { -/// bundle_resources("./static", "guides", Some(except_css_dir)) -/// } -/// -/// fn except_css_dir(p: &Path) -> bool { -/// if let Some(parent) = p.parent() { -/// !matches!(parent.to_str(), Some("/css")) -/// } -/// true -/// } -/// ``` -/// -/// This will create a file called `guides.rs` in the standard directory -/// [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html) where all -/// intermediate and output artifacts are placed during compilation. -/// -/// You don't need to access this file, just include it in your project source code and a module called -/// `resources_guides` will be added. Then simply reference the `bundle_guides` function to embed -/// the generated HashMap resources collection: -/// -/// ```rust#ignore -/// use pagetop::prelude::*; -/// -/// include!(concat!(env!("OUT_DIR"), "/guides.rs")); -/// static RESOURCES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides); -/// ``` -/// -/// You can build more than one resources file to compile with your project. -pub fn bundle_resources( - from_dir: &str, - with_name: &str, - filtering: Option<fn(p: &Path) -> bool>, -) -> std::io::Result<()> { - let mut bundle = static_files::resource_dir(from_dir); - bundle.with_generated_filename( - Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), - ); - bundle.with_module_name(format!("resources_{}", with_name)); - bundle.with_generated_fn(format!("bundle_{}", with_name)); - if let Some(filter_files) = filtering { - bundle.with_filter(filter_files); - } - bundle.build() -} - pub type Handle = u64; // https://stackoverflow.com/a/71464396 From 06276b618c32eb013a5d44bad74e70b2adca114a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 23 Jan 2023 21:09:36 +0100 Subject: [PATCH 253/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20El=20r=C3=B3tulo?= =?UTF-8?q?=20de=20inicio=20pasa=20a=20ser=20una=20utilidad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La función para la presentación del nombre del proyecto en forma de rótulo ASCII pasa a las utilidades fuera de la API de PageTop. --- pagetop/src/app.rs | 5 ++- pagetop/src/base.rs | 2 -- pagetop/src/base/banner.rs | 33 ------------------- pagetop/src/util.rs | 33 +++++++++++++++++++ pagetop/src/{base/banner => util}/figfont.rs | 0 pagetop/src/{base/banner => util}/slant.flf | 0 pagetop/src/{base/banner => util}/small.flf | 0 pagetop/src/{base/banner => util}/speed.flf | 0 .../src/{base/banner => util}/starwars.flf | 0 9 files changed, 35 insertions(+), 38 deletions(-) delete mode 100644 pagetop/src/base/banner.rs rename pagetop/src/{base/banner => util}/figfont.rs (100%) rename pagetop/src/{base/banner => util}/slant.flf (100%) rename pagetop/src/{base/banner => util}/small.flf (100%) rename pagetop/src/{base/banner => util}/speed.flf (100%) rename pagetop/src/{base/banner => util}/starwars.flf (100%) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 8e856131..39f6f3dc 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,10 +1,9 @@ -use crate::base::banner; use crate::core::module::ModuleStaticRef; use crate::core::{module, theme}; use crate::html::Markup; use crate::response::page::ResultPage; use crate::response::FatalError; -use crate::{config, locale, server, trace, LazyStatic}; +use crate::{config, locale, server, trace, util, LazyStatic}; #[cfg(feature = "database")] use crate::db; @@ -20,7 +19,7 @@ pub struct Application { impl Application { pub fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { // Rótulo de presentación. - banner::print_on_startup(); + util::print_on_startup(); // Inicia registro de trazas y eventos. LazyStatic::force(&trace::TRACING); diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index 4fba6995..d58aa565 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,5 +1,3 @@ -pub(crate) mod banner; - pub mod component; pub mod module; pub mod theme; diff --git a/pagetop/src/base/banner.rs b/pagetop/src/base/banner.rs deleted file mode 100644 index aa36fb70..00000000 --- a/pagetop/src/base/banner.rs +++ /dev/null @@ -1,33 +0,0 @@ -mod figfont; -use figfont::FIGFONT; - -use crate::config; - -use substring::Substring; - -pub fn print_on_startup() { - if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { - if let Some((term_width, _)) = term_size::dimensions() { - if term_width >= 80 { - let maxlen = (term_width / 10) - 2; - let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); - if config::SETTINGS.app.name.len() > maxlen { - app = format!("{}...", app); - } - println!( - "\n{} {}\n\n Powered by PageTop {}\n", - FIGFONT.convert(&app).unwrap(), - &config::SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - return; - } - } - println!( - "\n{}\n{}\n\nPowered by PageTop {}\n", - &config::SETTINGS.app.name, - &config::SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - } -} diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 1fe37b80..2088dc24 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,9 +1,42 @@ +mod figfont; + +use crate::config; + +use substring::Substring; + pub use static_files::Resource as StaticResource; pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; pub type Handle = u64; +pub(crate) fn print_on_startup() { + if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { + if let Some((term_width, _)) = term_size::dimensions() { + if term_width >= 80 { + let maxlen = (term_width / 10) - 2; + let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); + if config::SETTINGS.app.name.len() > maxlen { + app = format!("{}...", app); + } + println!( + "\n{} {}\n\n Powered by PageTop {}\n", + figfont::FIGFONT.convert(&app).unwrap(), + &config::SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + return; + } + } + println!( + "\n{}\n{}\n\nPowered by PageTop {}\n", + &config::SETTINGS.app.name, + &config::SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + } +} + // https://stackoverflow.com/a/71464396 pub const fn handle( module_path: &'static str, diff --git a/pagetop/src/base/banner/figfont.rs b/pagetop/src/util/figfont.rs similarity index 100% rename from pagetop/src/base/banner/figfont.rs rename to pagetop/src/util/figfont.rs diff --git a/pagetop/src/base/banner/slant.flf b/pagetop/src/util/slant.flf similarity index 100% rename from pagetop/src/base/banner/slant.flf rename to pagetop/src/util/slant.flf diff --git a/pagetop/src/base/banner/small.flf b/pagetop/src/util/small.flf similarity index 100% rename from pagetop/src/base/banner/small.flf rename to pagetop/src/util/small.flf diff --git a/pagetop/src/base/banner/speed.flf b/pagetop/src/util/speed.flf similarity index 100% rename from pagetop/src/base/banner/speed.flf rename to pagetop/src/util/speed.flf diff --git a/pagetop/src/base/banner/starwars.flf b/pagetop/src/util/starwars.flf similarity index 100% rename from pagetop/src/base/banner/starwars.flf rename to pagetop/src/util/starwars.flf From 065fe9eaab69b90475adab5dac323d9c9e65ab39 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 25 Jan 2023 18:47:40 +0100 Subject: [PATCH 254/853] =?UTF-8?q?=F0=9F=92=A5=20Renombra=20configure=5Fs?= =?UTF-8?q?ervice=5Ffor=5Fstatic=5Ffiles!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La macro se usará ahora con el nombre serve_static_files!. --- pagetop/src/base/theme/aliner.rs | 2 +- pagetop/src/base/theme/bootsier.rs | 2 +- pagetop/src/base/theme/bulmix.rs | 2 +- pagetop/src/core/theme/all.rs | 4 ++-- pagetop/src/prelude.rs | 2 +- pagetop/src/util.rs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs index e9ef98b3..192c9026 100644 --- a/pagetop/src/base/theme/aliner.rs +++ b/pagetop/src/base/theme/aliner.rs @@ -12,7 +12,7 @@ impl ThemeTrait for Aliner { } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - configure_service_for_static_files!(cfg, "/aliner", bundle_aliner); + serve_static_files!(cfg, "/aliner", bundle_aliner); } fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs index 36ca54e9..7a0ab305 100644 --- a/pagetop/src/base/theme/bootsier.rs +++ b/pagetop/src/base/theme/bootsier.rs @@ -14,7 +14,7 @@ impl ThemeTrait for Bootsier { } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - configure_service_for_static_files!(cfg, "/bootsier", bundle_bootsier); + serve_static_files!(cfg, "/bootsier", bundle_bootsier); } fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs index cef1d6a9..d1026840 100644 --- a/pagetop/src/base/theme/bulmix.rs +++ b/pagetop/src/base/theme/bulmix.rs @@ -12,7 +12,7 @@ impl ThemeTrait for Bulmix { } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - configure_service_for_static_files!(cfg, "/bulmix", bundle_bulmix); + serve_static_files!(cfg, "/bulmix", bundle_bulmix); } fn before_render_page(&self, page: &mut Page) { diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index ca75e785..5da50c59 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,5 +1,5 @@ use super::ThemeStaticRef; -use crate::{base, configure_service_for_static_files, server, trace, LazyStatic}; +use crate::{base, serve_static_files, server, trace, LazyStatic}; use std::sync::RwLock; @@ -41,7 +41,7 @@ pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { } pub fn configure_services(cfg: &mut server::web::ServiceConfig) { - configure_service_for_static_files!(cfg, "/theme", bundle_theme); + serve_static_files!(cfg, "/theme", bundle_theme); for t in THEMES.read().unwrap().iter() { t.configure_service(cfg); diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 1c976151..e2d66bc8 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,7 +2,7 @@ pub use crate::{concat_string, LazyStatic, ResultExt}; // Macros. -pub use crate::{args, configure_service_for_static_files, pub_config, pub_handle, pub_locale}; +pub use crate::{args, pub_config, pub_handle, pub_locale, serve_static_files}; // Helpers. pub use crate::util; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 2088dc24..c743cf5d 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -115,7 +115,7 @@ macro_rules! args { } #[macro_export] -macro_rules! configure_service_for_static_files { +macro_rules! serve_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { From aa2638977780154359b9533c01ffbf846b9150d7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Jan 2023 00:30:13 +0100 Subject: [PATCH 255/853] =?UTF-8?q?=F0=9F=8E=89=20[pagetop-macros]=20Macro?= =?UTF-8?q?s=20para=20facilitar=20la=20vida?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/Cargo.toml | 23 +++++++++++++++++++ pagetop-macros/README.md | 26 ++++++++++++++++++++++ pagetop-macros/src/lib.rs | 47 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 pagetop-macros/Cargo.toml create mode 100644 pagetop-macros/README.md create mode 100644 pagetop-macros/src/lib.rs diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml new file mode 100644 index 00000000..2aa4ec10 --- /dev/null +++ b/pagetop-macros/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "pagetop-macros" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Useful macros for creating web solutions using the PageTop framework.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[lib] +proc-macro = true + +[dependencies] +concat-string = "1.0.1" +proc-macro2 = "1.0" +quote = "1.0" +syn = { version = "1.0", features = ["full"] } diff --git a/pagetop-macros/README.md b/pagetop-macros/README.md new file mode 100644 index 00000000..c8d634b8 --- /dev/null +++ b/pagetop-macros/README.md @@ -0,0 +1,26 @@ +Macros útiles para la creación de soluciones web con **PageTop**. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs new file mode 100644 index 00000000..d3fa4f51 --- /dev/null +++ b/pagetop-macros/src/lib.rs @@ -0,0 +1,47 @@ +use concat_string::concat_string; +use proc_macro::TokenStream; +use quote::{quote, quote_spanned, ToTokens}; +use syn::{parse_macro_input, parse_str, ItemFn}; + +#[proc_macro_attribute] +pub fn fn_with(_attr: TokenStream, item: TokenStream) -> TokenStream { + let fn_item = parse_macro_input!(item as ItemFn); + let fn_name = fn_item.sig.ident.to_string(); + + if !fn_name.starts_with("alter_") { + let expanded = quote_spanned! { + fn_item.sig.ident.span() => + compile_error!("expected a \"pub fn alter_...() -> &mut Self\" method"); + }; + return expanded.into(); + } + + let args: Vec<String> = fn_item + .sig + .inputs + .iter() + .skip(1) + .map(|arg| arg.to_token_stream().to_string()) + .collect(); + + let param: Vec<String> = args + .iter() + .map(|arg| arg.split_whitespace().next().unwrap().to_string()) + .collect(); + + #[rustfmt::skip] + let fn_builder = parse_str::<ItemFn>(concat_string!(" + pub fn ", fn_name.replace("alter_", "with_"), "(mut self, ", args.join(", "), ") -> Self { + self.", fn_name, "(", param.join(", "), "); + self + } + ").as_str()).unwrap(); + + let fn_original = fn_item.into_token_stream(); + + let expanded = quote! { + #fn_builder + #fn_original + }; + expanded.into() +} From efc59216b4179f83ededdbe24a26b43811dfdfb8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Jan 2023 00:37:27 +0100 Subject: [PATCH 256/853] =?UTF-8?q?=E2=9E=95=20A=C3=B1ade=20macro=20para?= =?UTF-8?q?=20patr=C3=B3n=20"builder"=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + pagetop/Cargo.toml | 2 + pagetop/src/base/component/anchor.rs | 68 ++---------- pagetop/src/base/component/block.rs | 44 ++------ pagetop/src/base/component/container.rs | 44 ++------ .../src/base/component/form_element/button.rs | 50 ++------- .../src/base/component/form_element/date.rs | 86 +++------------ .../src/base/component/form_element/form.rs | 56 ++-------- .../src/base/component/form_element/hidden.rs | 20 +--- .../src/base/component/form_element/input.rs | 104 +++--------------- pagetop/src/base/component/grid/column.rs | 45 ++------ pagetop/src/base/component/grid/row.rs | 38 +------ pagetop/src/base/component/heading.rs | 50 ++------- pagetop/src/base/component/html.rs | 26 +---- pagetop/src/base/component/icon.rs | 26 +---- pagetop/src/base/component/image.rs | 38 +------ pagetop/src/base/component/menu.rs | 52 ++------- pagetop/src/base/component/paragraph.rs | 44 ++------ pagetop/src/lib.rs | 2 + pagetop/src/prelude.rs | 2 +- 20 files changed, 133 insertions(+), 665 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3e647964..57bc0683 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "pagetop", + "pagetop-macros", "pagetop-build", # Modules. "pagetop-admin", diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index ea87b851..b9d956c0 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -49,6 +49,8 @@ actix-web-files = { package = "actix-files", version = "0.6.2" } actix-web-static-files = "4.0.0" static-files = "0.2.3" +pagetop-macros = { path = "../pagetop-macros", version = "0.0" } + maud = { version = "0.24.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 07c6c1af..b5e46117 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -105,83 +105,31 @@ impl Anchor { // Anchor BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_type(mut self, anchor_type: AnchorType) -> Self { - self.alter_type(anchor_type); - self - } - - pub fn with_href(mut self, href: &str) -> Self { - self.alter_href(href); - self - } - - pub fn with_html(mut self, html: Markup) -> Self { - self.alter_html(html); - self - } - - pub fn with_left_icon(mut self, icon: Icon) -> Self { - self.alter_left_icon(icon); - self - } - - pub fn with_right_icon(mut self, icon: Icon) -> Self { - self.alter_right_icon(icon); - self - } - - pub fn with_target(mut self, target: AnchorTarget) -> Self { - self.alter_target(target); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Anchor ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { self.anchor_type = anchor_type; self.classes.alter_value( @@ -194,33 +142,39 @@ impl Anchor { self } + #[fn_with] pub fn alter_href(&mut self, href: &str) -> &mut Self { self.href.alter_value(href); self } + #[fn_with] pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.html.markup = html; self } + #[fn_with] pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { self.left_icon.clear(); self.left_icon.add(icon); self } + #[fn_with] pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { self.right_icon.clear(); self.right_icon.add(icon); self } + #[fn_with] pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { self.target = target; self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index f6094fc5..412a147c 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -63,73 +63,43 @@ impl ComponentTrait for Block { impl Block { // Block BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_title(mut self, title: &str) -> Self { - self.alter_title(title); - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.alter_component(component); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Block ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_title(&mut self, title: &str) -> &mut Self { self.title.alter_value(title); self } + #[fn_with] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index a502eda8..53aff0a8 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -124,73 +124,43 @@ impl Container { // Container BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_inner_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_inner_classes(op, classes); - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.alter_component(component); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Container ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.inner_classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index f32f5082..ba6d2a66 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -97,73 +97,37 @@ impl Button { // Button BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_name(mut self, name: &str) -> Self { - self.alter_name(name); - self - } - - pub fn with_value(mut self, value: &str) -> Self { - self.alter_value(value); - self - } - - pub fn with_autofocus(mut self, toggle: bool) -> Self { - self.alter_autofocus(toggle); - self - } - - pub fn with_disabled(mut self, toggle: bool) -> Self { - self.alter_disabled(toggle); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Button ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } + #[fn_with] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } + #[fn_with] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -172,6 +136,7 @@ impl Button { self } + #[fn_with] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -180,6 +145,7 @@ impl Button { self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index a6e5b598..d49762d6 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -85,113 +85,49 @@ impl ComponentTrait for Date { impl Date { // Date BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_name(mut self, name: &str) -> Self { - self.alter_name(name); - self - } - - pub fn with_value(mut self, value: &str) -> Self { - self.alter_value(value); - self - } - - pub fn with_label(mut self, label: &str) -> Self { - self.alter_label(label); - self - } - - pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.alter_placeholder(placeholder); - self - } - - pub fn with_autofocus(mut self, toggle: bool) -> Self { - self.alter_autofocus(toggle); - self - } - - pub fn with_autocomplete(mut self, toggle: bool) -> Self { - self.alter_autocomplete(toggle); - self - } - - pub fn with_disabled(mut self, toggle: bool) -> Self { - self.alter_disabled(toggle); - self - } - - pub fn with_readonly(mut self, toggle: bool) -> Self { - self.alter_readonly(toggle); - self - } - - pub fn with_required(mut self, toggle: bool) -> Self { - self.alter_required(toggle); - self - } - - pub fn with_help_text(mut self, help_text: &str) -> Self { - self.alter_help_text(help_text); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Date ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } + #[fn_with] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } + #[fn_with] pub fn alter_label(&mut self, label: &str) -> &mut Self { self.label.alter_value(label); self } + #[fn_with] pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { self.placeholder.alter_value(placeholder); self } + #[fn_with] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -200,6 +136,7 @@ impl Date { self } + #[fn_with] pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.alter_value(match toggle { true => "", @@ -208,6 +145,7 @@ impl Date { self } + #[fn_with] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -216,6 +154,7 @@ impl Date { self } + #[fn_with] pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.alter_value(match toggle { true => "readonly", @@ -224,6 +163,7 @@ impl Date { self } + #[fn_with] pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.alter_value(match toggle { true => "required", @@ -232,11 +172,13 @@ impl Date { self } + #[fn_with] pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { self.help_text.alter_value(help_text); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index d658cc64..f1661455 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -78,93 +78,55 @@ impl ComponentTrait for Form { impl Form { // Form BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_action(mut self, action: &str) -> Self { - self.alter_action(action); - self - } - - pub fn with_charset(mut self, charset: &str) -> Self { - self.alter_charset(charset); - self - } - - pub fn with_method(mut self, method: FormMethod) -> Self { - self.alter_method(method); - self - } - - pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.alter_element(element); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Form ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_action(&mut self, action: &str) -> &mut Self { self.action.alter_value(action); self } + #[fn_with] pub fn alter_charset(&mut self, charset: &str) -> &mut Self { self.charset.alter_value(charset); self } + #[fn_with] pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { self.method = method; self } + #[fn_with] pub fn alter_element(&mut self, element: impl ComponentTrait) -> &mut Self { self.elements.add(element); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index f7c554e6..6fb063c1 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -46,33 +46,19 @@ impl Hidden { // Hidden BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_name(mut self, name: &str) -> Self { - self.alter_name(name); - self - } - - pub fn with_value(mut self, value: &str) -> Self { - self.alter_value(value); - self - } - - // Hidden ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } + #[fn_with] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index ee79d1bf..1177df93 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -168,108 +168,25 @@ impl Input { // Input BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_name(mut self, name: &str) -> Self { - self.alter_name(name); - self - } - - pub fn with_value(mut self, value: &str) -> Self { - self.alter_value(value); - self - } - - pub fn with_label(mut self, label: &str) -> Self { - self.alter_label(label); - self - } - - pub fn with_size(mut self, size: Option<u16>) -> Self { - self.alter_size(size); - self - } - - pub fn with_minlength(mut self, minlength: Option<u16>) -> Self { - self.alter_minlength(minlength); - self - } - - pub fn with_maxlength(mut self, maxlength: Option<u16>) -> Self { - self.alter_maxlength(maxlength); - self - } - - pub fn with_placeholder(mut self, placeholder: &str) -> Self { - self.alter_placeholder(placeholder); - self - } - - pub fn with_autofocus(mut self, toggle: bool) -> Self { - self.alter_autofocus(toggle); - self - } - - pub fn with_autocomplete(mut self, toggle: bool) -> Self { - self.alter_autocomplete(toggle); - self - } - - pub fn with_disabled(mut self, toggle: bool) -> Self { - self.alter_disabled(toggle); - self - } - - pub fn with_readonly(mut self, toggle: bool) -> Self { - self.alter_readonly(toggle); - self - } - - pub fn with_required(mut self, toggle: bool) -> Self { - self.alter_required(toggle); - self - } - - pub fn with_help_text(mut self, help_text: &str) -> Self { - self.alter_help_text(help_text); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Input ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self.alter_classes( @@ -279,36 +196,43 @@ impl Input { self } + #[fn_with] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } + #[fn_with] pub fn alter_label(&mut self, label: &str) -> &mut Self { self.label.alter_value(label); self } + #[fn_with] pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { self.size = size; self } + #[fn_with] pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { self.minlength = minlength; self } + #[fn_with] pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { self.maxlength = maxlength; self } + #[fn_with] pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { self.placeholder.alter_value(placeholder); self } + #[fn_with] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -317,6 +241,7 @@ impl Input { self } + #[fn_with] pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.alter_value(match toggle { true => "", @@ -325,6 +250,7 @@ impl Input { self } + #[fn_with] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -333,6 +259,7 @@ impl Input { self } + #[fn_with] pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.alter_value(match toggle { true => "readonly", @@ -341,6 +268,7 @@ impl Input { self } + #[fn_with] pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.alter_value(match toggle { true => "required", @@ -349,11 +277,13 @@ impl Input { self } + #[fn_with] pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { self.help_text.alter_value(help_text); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 95e92e57..738b9c7f 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -89,64 +89,32 @@ impl ComponentTrait for Column { impl Column { // Column BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_size(mut self, size: ColumnSize) -> Self { - self.alter_size(size); - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.alter_component(component); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Column ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } #[rustfmt::skip] + #[fn_with] pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { match size { ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE__DEFAULT), @@ -167,10 +135,13 @@ impl Column { self } + #[fn_with] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } + + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index ba9ccd93..dd50f08e 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -56,63 +56,37 @@ impl ComponentTrait for Row { impl Row { // Row BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_column(mut self, column: grid::Column) -> Self { - self.alter_column(column); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Row ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_column(&mut self, column: grid::Column) -> &mut Self { self.columns.add(column); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index de396e46..b2de7ebe 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -116,79 +116,44 @@ impl Heading { // Heading BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_heading_type(mut self, heading_type: HeadingType) -> Self { - self.alter_heading_type(heading_type); - self - } - - pub fn with_html(mut self, html: Markup) -> Self { - self.alter_html(html); - self - } - - pub fn with_display(mut self, display: HeadingDisplay) -> Self { - self.alter_display(display); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Heading ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { self.heading_type = heading_type; self } + #[fn_with] pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.html.markup = html; self } #[rustfmt::skip] + #[fn_with] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; self.classes.alter_value( @@ -206,6 +171,7 @@ impl Heading { self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 6e7f8bdc..1f23b00e 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -48,43 +48,25 @@ impl Html { // Html BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_html(mut self, html: Markup) -> Self { - self.alter_html(html); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Html ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.html.markup = html; self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index db028475..e953549c 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -54,38 +54,19 @@ impl Icon { // Icon BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_icon_name(mut self, name: &str) -> Self { - self.alter_icon_name(name); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - // Icon ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { self.icon_name = name.to_owned(); self.alter_classes( @@ -95,6 +76,7 @@ impl Icon { self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 0cd54804..6f1a2c0d 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -55,63 +55,37 @@ impl Image { // Image BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_source(mut self, source: &str) -> Self { - self.alter_source(source); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Image ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_source(&mut self, source: &str) -> &mut Self { self.source.alter_value(source); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index d5df0272..34ab7efc 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -127,23 +127,13 @@ impl MenuItem { // MenuItem BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - // MenuItem ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self @@ -233,63 +223,37 @@ impl ComponentTrait for Menu { impl Menu { // Menu BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_item(mut self, item: MenuItem) -> Self { - self.alter_item(item); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Menu ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_item(&mut self, item: MenuItem) -> &mut Self { self.items.add(item); self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 6ab208f0..5a4eef80 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -69,69 +69,38 @@ impl Paragraph { // Paragraph BUILDER. - pub fn with_weight(mut self, weight: isize) -> Self { - self.alter_weight(weight); - self - } - - pub fn with_renderable(mut self, check: IsRenderable) -> Self { - self.alter_renderable(check); - self - } - - pub fn with_id(mut self, id: &str) -> Self { - self.alter_id(id); - self - } - - pub fn with_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_classes(op, classes); - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.alter_component(component); - self - } - - pub fn with_display(mut self, display: ParagraphDisplay) -> Self { - self.alter_display(display); - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Paragraph ALTER. - + #[fn_with] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } + #[fn_with] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } + #[fn_with] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } + #[fn_with] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } + #[fn_with] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } #[rustfmt::skip] + #[fn_with] pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { self.display = display; self.classes.alter_value( @@ -148,6 +117,7 @@ impl Paragraph { self } + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index fb92a186..2d74b95c 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -44,6 +44,8 @@ pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; pub use tracing_unwrap::ResultExt; +pub use pagetop_macros::fn_with; + // LOCAL. #[allow(unused_imports)] diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index e2d66bc8..b44f7de6 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,5 +1,5 @@ // Re-exports. -pub use crate::{concat_string, LazyStatic, ResultExt}; +pub use crate::{concat_string, fn_with, LazyStatic, ResultExt}; // Macros. pub use crate::{args, pub_config, pub_handle, pub_locale, serve_static_files}; From 09195c746634f394b5144970ba95930259eceb17 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 28 Jan 2023 08:43:57 +0100 Subject: [PATCH 257/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20#[fn=5Fwith]=20?= =?UTF-8?q?pasa=20a=20ser=20#[fn=5Fbuilder]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/src/lib.rs | 10 +++--- pagetop/src/base/component/anchor.rs | 22 ++++++------ pagetop/src/base/component/block.rs | 14 ++++---- pagetop/src/base/component/container.rs | 14 ++++---- .../src/base/component/form_element/button.rs | 16 ++++----- .../src/base/component/form_element/date.rs | 28 +++++++-------- .../src/base/component/form_element/form.rs | 18 +++++----- .../src/base/component/form_element/hidden.rs | 6 ++-- .../src/base/component/form_element/input.rs | 34 +++++++++---------- pagetop/src/base/component/grid/column.rs | 14 ++++---- pagetop/src/base/component/grid/row.rs | 12 +++---- pagetop/src/base/component/heading.rs | 16 ++++----- pagetop/src/base/component/html.rs | 8 ++--- pagetop/src/base/component/icon.rs | 8 ++--- pagetop/src/base/component/image.rs | 12 +++---- pagetop/src/base/component/menu.rs | 16 ++++----- pagetop/src/base/component/paragraph.rs | 14 ++++---- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 2 +- 19 files changed, 133 insertions(+), 133 deletions(-) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index d3fa4f51..67f5f2ec 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -4,7 +4,7 @@ use quote::{quote, quote_spanned, ToTokens}; use syn::{parse_macro_input, parse_str, ItemFn}; #[proc_macro_attribute] -pub fn fn_with(_attr: TokenStream, item: TokenStream) -> TokenStream { +pub fn fn_builder(_attr: TokenStream, item: TokenStream) -> TokenStream { let fn_item = parse_macro_input!(item as ItemFn); let fn_name = fn_item.sig.ident.to_string(); @@ -30,18 +30,18 @@ pub fn fn_with(_attr: TokenStream, item: TokenStream) -> TokenStream { .collect(); #[rustfmt::skip] - let fn_builder = parse_str::<ItemFn>(concat_string!(" + let fn_with = parse_str::<ItemFn>(concat_string!(" pub fn ", fn_name.replace("alter_", "with_"), "(mut self, ", args.join(", "), ") -> Self { self.", fn_name, "(", param.join(", "), "); self } ").as_str()).unwrap(); - let fn_original = fn_item.into_token_stream(); + let fn_alter = fn_item.into_token_stream(); let expanded = quote! { - #fn_builder - #fn_original + #fn_with + #fn_alter }; expanded.into() } diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index b5e46117..0ab91907 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -105,31 +105,31 @@ impl Anchor { // Anchor BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { self.anchor_type = anchor_type; self.classes.alter_value( @@ -142,39 +142,39 @@ impl Anchor { self } - #[fn_with] + #[fn_builder] pub fn alter_href(&mut self, href: &str) -> &mut Self { self.href.alter_value(href); self } - #[fn_with] + #[fn_builder] pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.html.markup = html; self } - #[fn_with] + #[fn_builder] pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { self.left_icon.clear(); self.left_icon.add(icon); self } - #[fn_with] + #[fn_builder] pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { self.right_icon.clear(); self.right_icon.add(icon); self } - #[fn_with] + #[fn_builder] pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { self.target = target; self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 412a147c..a97b18f4 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -63,43 +63,43 @@ impl ComponentTrait for Block { impl Block { // Block BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_title(&mut self, title: &str) -> &mut Self { self.title.alter_value(title); self } - #[fn_with] + #[fn_builder] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 53aff0a8..55081a9d 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -124,43 +124,43 @@ impl Container { // Container BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.inner_classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index ba6d2a66..c9eb1fc1 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -97,37 +97,37 @@ impl Button { // Button BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } - #[fn_with] + #[fn_builder] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } - #[fn_with] + #[fn_builder] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -136,7 +136,7 @@ impl Button { self } - #[fn_with] + #[fn_builder] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -145,7 +145,7 @@ impl Button { self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index d49762d6..c35cc185 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -85,49 +85,49 @@ impl ComponentTrait for Date { impl Date { // Date BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } - #[fn_with] + #[fn_builder] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } - #[fn_with] + #[fn_builder] pub fn alter_label(&mut self, label: &str) -> &mut Self { self.label.alter_value(label); self } - #[fn_with] + #[fn_builder] pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { self.placeholder.alter_value(placeholder); self } - #[fn_with] + #[fn_builder] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -136,7 +136,7 @@ impl Date { self } - #[fn_with] + #[fn_builder] pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.alter_value(match toggle { true => "", @@ -145,7 +145,7 @@ impl Date { self } - #[fn_with] + #[fn_builder] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -154,7 +154,7 @@ impl Date { self } - #[fn_with] + #[fn_builder] pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.alter_value(match toggle { true => "readonly", @@ -163,7 +163,7 @@ impl Date { self } - #[fn_with] + #[fn_builder] pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.alter_value(match toggle { true => "required", @@ -172,13 +172,13 @@ impl Date { self } - #[fn_with] + #[fn_builder] pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { self.help_text.alter_value(help_text); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index f1661455..78a90c52 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -78,55 +78,55 @@ impl ComponentTrait for Form { impl Form { // Form BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_action(&mut self, action: &str) -> &mut Self { self.action.alter_value(action); self } - #[fn_with] + #[fn_builder] pub fn alter_charset(&mut self, charset: &str) -> &mut Self { self.charset.alter_value(charset); self } - #[fn_with] + #[fn_builder] pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { self.method = method; self } - #[fn_with] + #[fn_builder] pub fn alter_element(&mut self, element: impl ComponentTrait) -> &mut Self { self.elements.add(element); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 6fb063c1..034b0bde 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -46,19 +46,19 @@ impl Hidden { // Hidden BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } - #[fn_with] + #[fn_builder] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 1177df93..6ff17690 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -168,25 +168,25 @@ impl Input { // Input BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self.alter_classes( @@ -196,43 +196,43 @@ impl Input { self } - #[fn_with] + #[fn_builder] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } - #[fn_with] + #[fn_builder] pub fn alter_label(&mut self, label: &str) -> &mut Self { self.label.alter_value(label); self } - #[fn_with] + #[fn_builder] pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { self.size = size; self } - #[fn_with] + #[fn_builder] pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { self.minlength = minlength; self } - #[fn_with] + #[fn_builder] pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { self.maxlength = maxlength; self } - #[fn_with] + #[fn_builder] pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { self.placeholder.alter_value(placeholder); self } - #[fn_with] + #[fn_builder] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -241,7 +241,7 @@ impl Input { self } - #[fn_with] + #[fn_builder] pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.alter_value(match toggle { true => "", @@ -250,7 +250,7 @@ impl Input { self } - #[fn_with] + #[fn_builder] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -259,7 +259,7 @@ impl Input { self } - #[fn_with] + #[fn_builder] pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.alter_value(match toggle { true => "readonly", @@ -268,7 +268,7 @@ impl Input { self } - #[fn_with] + #[fn_builder] pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.alter_value(match toggle { true => "required", @@ -277,13 +277,13 @@ impl Input { self } - #[fn_with] + #[fn_builder] pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { self.help_text.alter_value(help_text); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 738b9c7f..51271c5d 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -89,32 +89,32 @@ impl ComponentTrait for Column { impl Column { // Column BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } #[rustfmt::skip] - #[fn_with] + #[fn_builder] pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { match size { ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE__DEFAULT), @@ -135,13 +135,13 @@ impl Column { self } - #[fn_with] + #[fn_builder] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index dd50f08e..8371dadd 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -56,37 +56,37 @@ impl ComponentTrait for Row { impl Row { // Row BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_column(&mut self, column: grid::Column) -> &mut Self { self.columns.add(column); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index b2de7ebe..fb554b32 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -116,44 +116,44 @@ impl Heading { // Heading BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { self.heading_type = heading_type; self } - #[fn_with] + #[fn_builder] pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.html.markup = html; self } #[rustfmt::skip] - #[fn_with] + #[fn_builder] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { self.display = display; self.classes.alter_value( @@ -171,7 +171,7 @@ impl Heading { self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 1f23b00e..2f135d46 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -48,25 +48,25 @@ impl Html { // Html BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.html.markup = html; self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index e953549c..8282c631 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -54,19 +54,19 @@ impl Icon { // Icon BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { self.icon_name = name.to_owned(); self.alter_classes( @@ -76,7 +76,7 @@ impl Icon { self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 6f1a2c0d..e8e9def6 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -55,37 +55,37 @@ impl Image { // Image BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_source(&mut self, source: &str) -> &mut Self { self.source.alter_value(source); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 34ab7efc..3e2acfd4 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -127,13 +127,13 @@ impl MenuItem { // MenuItem BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self @@ -223,37 +223,37 @@ impl ComponentTrait for Menu { impl Menu { // Menu BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_item(&mut self, item: MenuItem) -> &mut Self { self.items.add(item); self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 5a4eef80..2ae521f8 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -69,38 +69,38 @@ impl Paragraph { // Paragraph BUILDER. - #[fn_with] + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; self } - #[fn_with] + #[fn_builder] pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_with] + #[fn_builder] pub fn alter_id(&mut self, id: &str) -> &mut Self { self.id.alter_value(id); self } - #[fn_with] + #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); self } - #[fn_with] + #[fn_builder] pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { self.components.add(component); self } #[rustfmt::skip] - #[fn_with] + #[fn_builder] pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { self.display = display; self.classes.alter_value( @@ -117,7 +117,7 @@ impl Paragraph { self } - #[fn_with] + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 2d74b95c..3fd846bc 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -44,7 +44,7 @@ pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; pub use tracing_unwrap::ResultExt; -pub use pagetop_macros::fn_with; +pub use pagetop_macros::fn_builder; // LOCAL. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index b44f7de6..0a4a4869 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,5 +1,5 @@ // Re-exports. -pub use crate::{concat_string, fn_with, LazyStatic, ResultExt}; +pub use crate::{concat_string, fn_builder, LazyStatic, ResultExt}; // Macros. pub use crate::{args, pub_config, pub_handle, pub_locale, serve_static_files}; From f081a00bd42caf5c0d9f47070e4df5d65bc48d63 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 28 Jan 2023 09:05:10 +0100 Subject: [PATCH 258/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Macro=20#[fn=5Fbui?= =?UTF-8?q?lder]=20para=20constructor=20de=20p=C3=A1ginas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 6 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/base/module/homepage.rs | 10 +-- pagetop/src/response/fatal_error.rs | 8 +-- pagetop/src/response/page/definition.rs | 88 +++++++------------------ 5 files changed, 38 insertions(+), 76 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 168d5a10..e3de92be 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -43,8 +43,8 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { Page::new() .with_context(ContextOp::SetTheme("Bootsier")) .with_title("Admin") - .add_to("top-menu", top_menu) - .add_to( + .with_this_in("top-menu", top_menu) + .with_this_in( "region-content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) @@ -52,6 +52,6 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { p { "Columna 2"} }))), ) - .using_template("admin") + .with_template("admin") .render() } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 5ea54320..0d01c771 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -38,7 +38,7 @@ impl ModuleTrait for User { async fn login() -> ResultPage<Markup, FatalError> { Page::new() .with_title("Identificación del usuario") - .add_to( + .with_this_in( "region-content", Container::new() .with_id("welcome") diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index f71a04a4..7ccebc69 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -31,11 +31,11 @@ async fn demo() -> ResultPage<Markup, FatalError> { "/theme/module/homepage/styles.css", ))) .with_body_classes(ClassesOp::AddFirst, "default-homepage") - .add_to("region-content", hello_world()) - .add_to("region-content", welcome()) - .add_to("region-content", about_pagetop()) - .add_to("region-content", promo_pagetop()) - .add_to("region-content", reporting_issues()) + .with_this_in("region-content", hello_world()) + .with_this_in("region-content", welcome()) + .with_this_in("region-content", about_pagetop()) + .with_this_in("region-content", promo_pagetop()) + .with_this_in("region-content", reporting_issues()) .render() } diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 00b82e91..591b0472 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -28,8 +28,8 @@ impl fmt::Display for FatalError { let error_content = error_page.context().theme().error_403_access_denied(); if let Ok(page) = error_page .with_title("Error FORBIDDEN") - .using_template("error") - .add_to("region-content", error_content) + .with_this_in("region-content", error_content) + .with_template("error") .render() { write!(f, "{}", page.into_string()) @@ -43,8 +43,8 @@ impl fmt::Display for FatalError { let error_content = error_page.context().theme().error_404_not_found(); if let Ok(page) = error_page .with_title("Error RESOURCE NOT FOUND") - .using_template("error") - .add_to("region-content", error_content) + .with_this_in("region-content", error_content) + .with_template("error") .render() { write!(f, "{}", page.into_string()) diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 0adcd6be..5b6360e2 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -4,7 +4,7 @@ use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::FatalError; -use crate::{config, trace, LazyStatic}; +use crate::{config, fn_builder, trace, LazyStatic}; use std::collections::HashMap; @@ -88,73 +88,13 @@ impl Page { // Page BUILDER. - pub fn with_language(mut self, language: &str) -> Self { - self.alter_language(language); - self - } - - pub fn with_direction(mut self, dir: TextDirection) -> Self { - self.alter_direction(dir); - self - } - - pub fn with_title(mut self, title: &str) -> Self { - self.alter_title(title); - self - } - - pub fn with_description(mut self, description: &str) -> Self { - self.alter_description(description); - self - } - - pub fn with_metadata(mut self, name: &'static str, content: &'static str) -> Self { - self.alter_metadata(name, content); - self - } - - pub fn with_property(mut self, property: &'static str, content: &'static str) -> Self { - self.alter_property(property, content); - self - } - - pub fn with_favicon(mut self, favicon: Option<Favicon>) -> Self { - self.alter_favicon(favicon); - self - } - - pub fn with_context(mut self, op: ContextOp) -> Self { - self.alter_context(op); - self - } - - pub fn with_body_classes(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_body_classes(op, classes); - self - } - - pub fn add_to(mut self, region: &'static str, component: impl ComponentTrait) -> Self { - if let Some(regions) = self.regions.get_mut(region) { - regions.add(component); - } else { - self.regions - .insert(region, ComponentsBundle::new_with(component)); - } - self - } - - pub fn using_template(mut self, template: &str) -> Self { - self.alter_template(template); - self - } - - // Page ALTER. - + #[fn_builder] pub fn alter_language(&mut self, language: &str) -> &mut Self { self.language.alter_value(language); self } + #[fn_builder] pub fn alter_direction(&mut self, dir: TextDirection) -> &mut Self { self.direction.alter_value(match dir { TextDirection::Auto => "auto", @@ -164,41 +104,63 @@ impl Page { self } + #[fn_builder] pub fn alter_title(&mut self, title: &str) -> &mut Self { self.title.alter_value(title); self } + #[fn_builder] pub fn alter_description(&mut self, description: &str) -> &mut Self { self.description.alter_value(description); self } + #[fn_builder] pub fn alter_metadata(&mut self, name: &'static str, content: &'static str) -> &mut Self { self.metadata.push((name, content)); self } + #[fn_builder] pub fn alter_property(&mut self, property: &'static str, content: &'static str) -> &mut Self { self.metadata.push((property, content)); self } + #[fn_builder] pub fn alter_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { self.favicon = favicon; self } + #[fn_builder] pub fn alter_context(&mut self, op: ContextOp) -> &mut Self { self.context.alter(op); self } + #[fn_builder] pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.body_classes.alter_value(op, classes); self } + #[fn_builder] + pub fn alter_this_in( + &mut self, + region: &'static str, + component: impl ComponentTrait, + ) -> &mut Self { + if let Some(regions) = self.regions.get_mut(region) { + regions.add(component); + } else { + self.regions.insert(region, ComponentsBundle::new_with(component)); + } + self + } + + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self From c5de6f4b6dd9eaf6b35b72e73b1973e59ca1d63d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Jan 2023 10:39:05 +0100 Subject: [PATCH 259/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20la=20petici?= =?UTF-8?q?=C3=B3n=20de=20entrada=20al=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Si la respuesta (Response) va a ser una página (Page) entonces hay que añadir la petición de entrada (HttpRequest) al contexto de renderizado (RenderContext) para que los componentes puedan consultarla durante la preparación de la página. Por ejemplo para consultar la URL de entrada y decidir si se renderiza o no un componente dado. --- pagetop-admin/src/summary.rs | 6 +-- pagetop-node/src/lib.rs | 4 +- pagetop-user/src/lib.rs | 4 +- pagetop/src/app.rs | 4 +- pagetop/src/base/module/homepage.rs | 4 +- pagetop/src/core/component/context.rs | 19 +++++++-- pagetop/src/response/fatal_error.rs | 52 ++++++++++++------------- pagetop/src/response/page/definition.rs | 8 ++-- 8 files changed, 57 insertions(+), 44 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index e3de92be..9b763b50 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,7 +1,7 @@ use super::l; use pagetop::prelude::*; -pub async fn summary() -> ResultPage<Markup, FatalError> { +pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = Menu::new() .with_item(MenuItem::label(l("module_name").as_str())) .with_item(MenuItem::link("Opción 2", "https://www.google.es")) @@ -40,8 +40,8 @@ pub async fn summary() -> ResultPage<Markup, FatalError> { )) .with_item(MenuItem::label("Opción 4")); - Page::new() - .with_context(ContextOp::SetTheme("Bootsier")) + Page::new(request) + .with_context(ContextOp::Theme("Bootsier")) .with_title("Admin") .with_this_in("top-menu", top_menu) .with_this_in( diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index aef94a93..f6a09d16 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -40,8 +40,8 @@ impl ModuleTrait for Node { } } -async fn node() -> ResultPage<Markup, FatalError> { - Page::new().with_title("Nodo").render() +async fn node(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { + Page::new(request).with_title("Nodo").render() } fn before_render_page(page: &mut Page) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 0d01c771..845928fd 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -35,8 +35,8 @@ impl ModuleTrait for User { } } -async fn login() -> ResultPage<Markup, FatalError> { - Page::new() +async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { + Page::new(request) .with_title("Identificación del usuario") .with_this_in( "region-content", diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 39f6f3dc..ba4bbd89 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -70,6 +70,6 @@ impl Application { } } -async fn service_not_found() -> ResultPage<Markup, FatalError> { - Err(FatalError::NotFound) +async fn service_not_found(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { + Err(FatalError::NotFound(request)) } diff --git a/pagetop/src/base/module/homepage.rs b/pagetop/src/base/module/homepage.rs index 7ccebc69..7b395f78 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop/src/base/module/homepage.rs @@ -24,8 +24,8 @@ impl ModuleTrait for DefaultHomePage { } } -async fn demo() -> ResultPage<Markup, FatalError> { - Page::new() +async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { + Page::new(request) .with_title(l("page_title").as_str()) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/theme/module/homepage/styles.css", diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 88a3368e..4fecb209 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,5 +1,6 @@ use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; +use crate::server::HttpRequest; use crate::{base, concat_string, config, util, LazyStatic}; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = @@ -9,7 +10,8 @@ static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = }); pub enum ContextOp { - SetTheme(&'static str), + Theme(&'static str), + Request(Option<HttpRequest>), AddStyleSheet(StyleSheet), RemoveStyleSheet(&'static str), AddJavaScript(JavaScript), @@ -20,6 +22,7 @@ pub enum ContextOp { #[rustfmt::skip] pub struct RenderContext { theme : ThemeStaticRef, + request : Option<HttpRequest>, stylesheets: Assets<StyleSheet>, javascripts: Assets<JavaScript>, with_jquery: bool, @@ -31,6 +34,7 @@ impl Default for RenderContext { fn default() -> Self { RenderContext { theme : *DEFAULT_THEME, + request : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), with_jquery: false, @@ -40,15 +44,18 @@ impl Default for RenderContext { } impl RenderContext { - pub fn new() -> Self { + pub(crate) fn new() -> Self { RenderContext::default() } pub fn alter(&mut self, op: ContextOp) -> &mut Self { match op { - ContextOp::SetTheme(theme_name) => { + ContextOp::Theme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); } + ContextOp::Request(request) => { + self.request = request; + } ContextOp::AddStyleSheet(css) => { self.stylesheets.add(css); } @@ -78,10 +85,14 @@ impl RenderContext { /// Context GETTERS. - pub(crate) fn theme(&mut self) -> ThemeStaticRef { + pub(crate) fn theme(&self) -> ThemeStaticRef { self.theme } + pub fn request(&self) -> &Option<HttpRequest> { + &self.request + } + /// Context RENDER. pub fn render(&mut self) -> Markup { diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 591b0472..0c17dd8e 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -1,30 +1,30 @@ use crate::response::{page::Page, ResponseError}; use crate::server::http::{header::ContentType, StatusCode}; -use crate::server::HttpResponse; +use crate::server::{HttpRequest, HttpResponse}; use std::fmt; #[derive(Debug)] pub enum FatalError { - NotModified, - BadRequest, - AccessDenied, - NotFound, - PreconditionFailed, - InternalError, - Timeout, + NotModified(HttpRequest), + BadRequest(HttpRequest), + AccessDenied(HttpRequest), + NotFound(HttpRequest), + PreconditionFailed(HttpRequest), + InternalError(HttpRequest), + Timeout(HttpRequest), } impl fmt::Display for FatalError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { + match self { // Error 304. - FatalError::NotModified => write!(f, "Not Modified"), + FatalError::NotModified(_) => write!(f, "Not Modified"), // Error 400. - FatalError::BadRequest => write!(f, "Bad Client Data"), + FatalError::BadRequest(_) => write!(f, "Bad Client Data"), // Error 403. - FatalError::AccessDenied => { - let mut error_page = Page::new(); + FatalError::AccessDenied(request) => { + let mut error_page = Page::new(request.clone()); let error_content = error_page.context().theme().error_403_access_denied(); if let Ok(page) = error_page .with_title("Error FORBIDDEN") @@ -38,8 +38,8 @@ impl fmt::Display for FatalError { } } // Error 404. - FatalError::NotFound => { - let mut error_page = Page::new(); + FatalError::NotFound(request) => { + let mut error_page = Page::new(request.clone()); let error_content = error_page.context().theme().error_404_not_found(); if let Ok(page) = error_page .with_title("Error RESOURCE NOT FOUND") @@ -53,11 +53,11 @@ impl fmt::Display for FatalError { } } // Error 412. - FatalError::PreconditionFailed => write!(f, "Precondition Failed"), + FatalError::PreconditionFailed(_) => write!(f, "Precondition Failed"), // Error 500. - FatalError::InternalError => write!(f, "Internal Error"), + FatalError::InternalError(_) => write!(f, "Internal Error"), // Error 504. - FatalError::Timeout => write!(f, "Timeout"), + FatalError::Timeout(_) => write!(f, "Timeout"), } } } @@ -71,14 +71,14 @@ impl ResponseError for FatalError { #[rustfmt::skip] fn status_code(&self) -> StatusCode { - match *self { - FatalError::NotModified => StatusCode::NOT_MODIFIED, - FatalError::BadRequest => StatusCode::BAD_REQUEST, - FatalError::AccessDenied => StatusCode::FORBIDDEN, - FatalError::NotFound => StatusCode::NOT_FOUND, - FatalError::PreconditionFailed => StatusCode::PRECONDITION_FAILED, - FatalError::InternalError => StatusCode::INTERNAL_SERVER_ERROR, - FatalError::Timeout => StatusCode::GATEWAY_TIMEOUT, + match self { + FatalError::NotModified(_) => StatusCode::NOT_MODIFIED, + FatalError::BadRequest(_) => StatusCode::BAD_REQUEST, + FatalError::AccessDenied(_) => StatusCode::FORBIDDEN, + FatalError::NotFound(_) => StatusCode::NOT_FOUND, + FatalError::PreconditionFailed(_) => StatusCode::PRECONDITION_FAILED, + FatalError::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR, + FatalError::Timeout(_) => StatusCode::GATEWAY_TIMEOUT, } } } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 5b6360e2..c772cbfd 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -4,7 +4,7 @@ use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::FatalError; -use crate::{config, fn_builder, trace, LazyStatic}; +use crate::{config, fn_builder, server, trace, LazyStatic}; use std::collections::HashMap; @@ -82,8 +82,10 @@ impl Default for Page { } impl Page { - pub fn new() -> Self { - Page::default() + pub fn new(request: server::HttpRequest) -> Self { + let mut page = Page::default(); + page.context.alter(ContextOp::Request(Some(request))); + page } // Page BUILDER. From 14bf2807ae86f2b3fa7e9d56348c2bf71ac84aeb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Jan 2023 10:44:34 +0100 Subject: [PATCH 260/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20C=C3=B3digo=20revi?= =?UTF-8?q?sado=20con=20cargo=20fmt/clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/module.rs | 1 + pagetop/src/core/component.rs | 2 +- pagetop/src/core/theme/definition.rs | 1 + pagetop/src/response/page/definition.rs | 3 ++- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pagetop/src/base/module.rs b/pagetop/src/base/module.rs index 1d28f868..ca296b77 100644 --- a/pagetop/src/base/module.rs +++ b/pagetop/src/base/module.rs @@ -1,2 +1,3 @@ pub mod menu; + pub mod homepage; diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 28733bb3..f348ecf3 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,5 +1,5 @@ mod context; -pub use context::{RenderContext, ContextOp}; +pub use context::{ContextOp, RenderContext}; mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 57c14833..10802da9 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -92,6 +92,7 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { } } + #[rustfmt::skip] #[allow(unused_variables)] fn before_render_component( &self, diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index c772cbfd..05122f3c 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -157,7 +157,8 @@ impl Page { if let Some(regions) = self.regions.get_mut(region) { regions.add(component); } else { - self.regions.insert(region, ComponentsBundle::new_with(component)); + self.regions + .insert(region, ComponentsBundle::new_with(component)); } self } From c31600a310eda2702a913be3f15908a7be4bbfea Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Jan 2023 10:55:48 +0100 Subject: [PATCH 261/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.33?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index b9d956c0..141f40f4 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.32" +version = "0.0.33" edition = "2021" authors = [ @@ -22,24 +22,24 @@ categories = [ ] [dependencies] -async-trait = "0.1.58" +async-trait = "0.1.63" concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.4" futures = "0.3.25" -nom = "7.1.1" -once_cell = "1.16.0" -paste = "1.0.9" +nom = "7.1.3" +once_cell = "1.17.0" +paste = "1.0.11" substring = "1.4.5" term_size = "0.3.2" -toml = "0.5.9" +toml = "0.7.0" url = "2.3.1" tracing = "0.1.37" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.10.0", default-features = false } -tracing-actix-web = "0.6.2" +tracing-actix-web = "0.7.2" fluent-templates = "0.8.0" unic-langid = "0.9.1" @@ -56,12 +56,12 @@ maud = { version = "0.24.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.10.2" +version = "0.10.7" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.10.2" +version = "0.10.3" optional = true [features] @@ -75,7 +75,7 @@ sqlite = ["database", "sea-orm/sqlx-sqlite"] pagetop-build = { path = "../pagetop-build", version = "0.0" } [dev-dependencies] -tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.24.2", features = ["macros", "rt-multi-thread"] } [lib] name = "pagetop" From b242f852f347c5869c66ece8cef536140c3207e3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Jan 2023 14:26:08 +0100 Subject: [PATCH 262/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop-admin]=20libera?= =?UTF-8?q?=20versi=C3=B3n=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index badb11db..6ae6ff0d 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From 770e662910a59540371452a16e203c17cbc2e5ab Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Jan 2023 14:47:55 +0100 Subject: [PATCH 263/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop-node]=20libera?= =?UTF-8?q?=20versi=C3=B3n=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 3a31481a..e36a0e65 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From f8a4e82297799ecae74da41db142b296b9c557aa Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Jan 2023 14:56:23 +0100 Subject: [PATCH 264/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop-user]=20libera?= =?UTF-8?q?=20versi=C3=B3n=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 81011e40..231393ac 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From 80e433b20d0b48eaeea0d899550273000f4d8c98 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 1 Feb 2023 20:22:50 +0100 Subject: [PATCH 265/853] =?UTF-8?q?=F0=9F=94=A5=20[pagetop]=20Saca=20temas?= =?UTF-8?q?=20y=20jQuery=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 7 + drust/Cargo.toml | 6 + drust/src/main.rs | 6 + pagetop/build.rs | 5 +- pagetop/config/settings.predefined.toml | 2 +- pagetop/src/app.rs | 4 +- pagetop/src/base/component.rs | 4 +- pagetop/src/base/theme.rs | 31 ++++- pagetop/src/base/theme/aliner.rs | 24 ---- pagetop/src/base/theme/bootsier.rs | 61 --------- .../theme/bootsier/locales/en-US/bootsier.ftl | 5 - .../theme/bootsier/locales/es-ES/bootsier.ftl | 5 - pagetop/src/base/theme/bulmix.rs | 125 ------------------ pagetop/src/base/theme/minimal.rs | 11 -- pagetop/src/core/component/context.rs | 36 ++--- pagetop/src/core/module/all.rs | 3 +- pagetop/src/core/module/definition.rs | 8 +- pagetop/src/core/theme/all.rs | 40 ++---- pagetop/src/core/theme/definition.rs | 17 +-- pagetop/static/bootsier/css/bootstrap.min.css | 7 - .../static/bootsier/css/bootstrap.min.css.map | 1 - pagetop/static/bootsier/images/caution.png | Bin 12481 -> 0 bytes .../bootsier/js/bootstrap.bundle.min.js | 7 - .../bootsier/js/bootstrap.bundle.min.js.map | 1 - pagetop/static/bulmix/css/bulma-rtl.min.css | 1 - .../static/bulmix/css/bulma-rtl.min.css.map | 1 - pagetop/static/bulmix/css/bulma.min.css | 1 - pagetop/static/bulmix/css/bulma.min.css.map | 1 - .../static/{aliner => theme}/css/styles.css | 0 29 files changed, 90 insertions(+), 330 deletions(-) delete mode 100644 pagetop/src/base/theme/aliner.rs delete mode 100644 pagetop/src/base/theme/bootsier.rs delete mode 100644 pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl delete mode 100644 pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl delete mode 100644 pagetop/src/base/theme/bulmix.rs delete mode 100644 pagetop/src/base/theme/minimal.rs delete mode 100644 pagetop/static/bootsier/css/bootstrap.min.css delete mode 100644 pagetop/static/bootsier/css/bootstrap.min.css.map delete mode 100644 pagetop/static/bootsier/images/caution.png delete mode 100644 pagetop/static/bootsier/js/bootstrap.bundle.min.js delete mode 100644 pagetop/static/bootsier/js/bootstrap.bundle.min.js.map delete mode 100644 pagetop/static/bulmix/css/bulma-rtl.min.css delete mode 100644 pagetop/static/bulmix/css/bulma-rtl.min.css.map delete mode 100644 pagetop/static/bulmix/css/bulma.min.css delete mode 100644 pagetop/static/bulmix/css/bulma.min.css.map rename pagetop/static/{aliner => theme}/css/styles.css (100%) diff --git a/Cargo.toml b/Cargo.toml index 57bc0683..99c94fa6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,12 +2,19 @@ members = [ "pagetop", + # Utilities. "pagetop-macros", "pagetop-build", + "pagetop-jquery", # Modules. "pagetop-admin", "pagetop-user", "pagetop-node", + # Themes. + "pagetop-minimal", + "pagetop-aliner", + "pagetop-bootsier", + "pagetop-bulmix", ] exclude = [ diff --git a/drust/Cargo.toml b/drust/Cargo.toml index a1f66688..5df5d78f 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -16,6 +16,12 @@ license = "Apache-2.0 OR MIT" [dependencies] actix-web = "4.2.1" pagetop = { path = "../pagetop", version = "0.0", features = ["mysql"], default-features = false } +# Modules. pagetop-admin = { path = "../pagetop-admin", version = "0.0" } pagetop-user = { path = "../pagetop-user", version = "0.0" } pagetop-node = { path = "../pagetop-node", version = "0.0" } +# Themes. +pagetop-minimal = { path = "../pagetop-minimal", version = "0.0" } +pagetop-aliner = { path = "../pagetop-aliner", version = "0.0" } +pagetop-bootsier = { path = "../pagetop-bootsier", version = "0.0" } +pagetop-bulmix = { path = "../pagetop-bulmix", version = "0.0" } diff --git a/drust/src/main.rs b/drust/src/main.rs index 7210dcdf..91f4cc8e 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -11,9 +11,15 @@ impl ModuleTrait for Drust { fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![ + // Modules. &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, + // Themes. + &pagetop_minimal::Minimal, + &pagetop_aliner::Aliner, + &pagetop_bootsier::Bootsier, + &pagetop_bulmix::Bulmix, ] } diff --git a/pagetop/build.rs b/pagetop/build.rs index b20b2739..b3903037 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,6 +1,3 @@ fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static/theme", "theme", None)?; - pagetop_build::bundle_resources("./static/aliner", "aliner", None)?; - pagetop_build::bundle_resources("./static/bootsier", "bootsier", None)?; - pagetop_build::bundle_resources("./static/bulmix", "bulmix", None) + pagetop_build::bundle_resources("./static/theme", "theme", None) } diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index 87ebbc75..5ad12743 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -2,7 +2,7 @@ name = "PageTop Application" description = "Developed with the amazing PageTop framework." # Tema predeterminado. -theme = "Bootsier" +theme = "Saturn" # Idioma (localización) predeterminado. language = "en-US" # Dirección predeterminada para el texto: "ltr", "rtl" o "auto". diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index ba4bbd89..eebc7041 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,5 +1,4 @@ -use crate::core::module::ModuleStaticRef; -use crate::core::{module, theme}; +use crate::core::{module, module::ModuleStaticRef}; use crate::html::Markup; use crate::response::page::ResultPage; use crate::response::FatalError; @@ -52,7 +51,6 @@ impl Application { server::App::new() .wrap(tracing_actix_web::TracingLogger::default()) .configure(module::all::configure_services) - .configure(theme::all::configure_services) .default_service(server::web::route().to(service_not_found)) }) .bind(format!( diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index f01900e4..8aef9edb 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -17,8 +17,8 @@ mod block; pub use block::{Block, COMPONENT_BLOCK}; mod image; pub use image::{Image, COMPONENT_IMAGE}; -mod menu; -pub use menu::{Menu, MenuItem, MenuItemType, COMPONENT_MENU, COMPONENT_MENUITEM}; +//mod menu; +//pub use menu::{Menu, MenuItem, MenuItemType, COMPONENT_MENU, COMPONENT_MENUITEM}; pub mod form_element; pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs index 164a8177..dad1099e 100644 --- a/pagetop/src/base/theme.rs +++ b/pagetop/src/base/theme.rs @@ -1,7 +1,30 @@ -pub mod aliner; +use crate::prelude::*; -pub mod minimal; +pub_handle!(THEME_SATURN); -pub mod bootsier; +include!(concat!(env!("OUT_DIR"), "/theme.rs")); -pub mod bulmix; +pub struct Saturn; + +impl ModuleTrait for Saturn { + fn handle(&self) -> Handle { + THEME_SATURN + } + + fn theme(&self) -> Option<ThemeStaticRef> { + Some(&Saturn) + } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/theme", bundle_theme); + } +} + +impl ThemeTrait for Saturn { + fn before_render_page(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::located("/theme/css/styles.css").with_weight(-99), + )); + } +} diff --git a/pagetop/src/base/theme/aliner.rs b/pagetop/src/base/theme/aliner.rs deleted file mode 100644 index 192c9026..00000000 --- a/pagetop/src/base/theme/aliner.rs +++ /dev/null @@ -1,24 +0,0 @@ -use crate::prelude::*; - -pub_handle!(THEME_ALINER); - -include!(concat!(env!("OUT_DIR"), "/aliner.rs")); - -pub struct Aliner; - -impl ThemeTrait for Aliner { - fn handle(&self) -> Handle { - THEME_ALINER - } - - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - serve_static_files!(cfg, "/aliner", bundle_aliner); - } - - fn before_render_page(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/aliner/css/styles.css").with_weight(-99), - )); - } -} diff --git a/pagetop/src/base/theme/bootsier.rs b/pagetop/src/base/theme/bootsier.rs deleted file mode 100644 index 7a0ab305..00000000 --- a/pagetop/src/base/theme/bootsier.rs +++ /dev/null @@ -1,61 +0,0 @@ -use crate::prelude::*; - -pub_handle!(THEME_BOOTSIER); - -pub_locale!("src/base/theme/bootsier/locales"); - -include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); - -pub struct Bootsier; - -impl ThemeTrait for Bootsier { - fn handle(&self) -> Handle { - THEME_BOOTSIER - } - - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - serve_static_files!(cfg, "/bootsier", bundle_bootsier); - } - - fn before_render_page(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bootsier/css/bootstrap.min.css") - .with_version("5.1.3") - .with_weight(-99), - )) - .alter_context(ContextOp::AddJavaScript( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") - .with_version("5.1.3") - .with_weight(-99), - )) - .alter_context(ContextOp::AddJQuery); - } - - fn error_404_not_found(&self) -> Container { - Container::new().with_component(Html::with(html! { - div class="jumbotron" { - div class="media" { - img - src="/bootsier/images/caution.png" - class="mr-4" - style="width: 20%; max-width: 188px" - alt="Caution!"; - div class="media-body" { - h1 class="display-4" { ("RESOURCE NOT FOUND") } - p class="lead" { (l("e404-description")) } - hr class="my-4"; - p { (l("e404-description")) } - a - class="btn btn-primary btn-lg" - href="/" - role="button" - { - (l("back-homepage")) - } - } - } - } - })) - } -} diff --git a/pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl deleted file mode 100644 index 0e8969cd..00000000 --- a/pagetop/src/base/theme/bootsier/locales/en-US/bootsier.ftl +++ /dev/null @@ -1,5 +0,0 @@ -e404-description = Oops! Page Not Found -e404-message = The page you are looking for may have been removed, had its name changed, or is temporarily unavailable. -e500-description = Oops! Unexpected Error -e500-message = We're having an issue. Please report this error to an administrator. -back-homepage = Back to homepage diff --git a/pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl b/pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl deleted file mode 100644 index 998b54f2..00000000 --- a/pagetop/src/base/theme/bootsier/locales/es-ES/bootsier.ftl +++ /dev/null @@ -1,5 +0,0 @@ -e404-description = ¡Vaya! Página No Encontrada -e404-message = La página que está buscando puede haber sido eliminada, cambiada de nombre o no está disponible temporalmente. -e500-description = ¡Vaya! Error Inesperado -e500-message = Está ocurriendo una incidencia. Por favor, informe de este error a un administrador. -back-homepage = Volver al inicio diff --git a/pagetop/src/base/theme/bulmix.rs b/pagetop/src/base/theme/bulmix.rs deleted file mode 100644 index d1026840..00000000 --- a/pagetop/src/base/theme/bulmix.rs +++ /dev/null @@ -1,125 +0,0 @@ -use crate::prelude::*; - -pub_handle!(THEME_BULMIX); - -include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); - -pub struct Bulmix; - -impl ThemeTrait for Bulmix { - fn handle(&self) -> Handle { - THEME_BULMIX - } - - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - serve_static_files!(cfg, "/bulmix", bundle_bulmix); - } - - fn before_render_page(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bulmix/css/bulma.min.css") - .with_version("0.9.4") - .with_weight(-99), - )) - .alter_context(ContextOp::AddJQuery); - } - - #[rustfmt::skip] - fn before_render_component( - &self, - component: &mut dyn ComponentTrait, - _rcx: &mut RenderContext, - ) { - match component.handle() { - COMPONENT_ANCHOR => { - let a = component_mut::<Anchor>(component); - a.alter_classes( - ClassesOp::SetDefault, - match a.anchor_type() { - AnchorType::Button => "button is-primary", - _ => "", - }, - ); - } - COMPONENT_HEADING => { - let h = component_mut::<Heading>(component); - h.alter_classes( - ClassesOp::SetDefault, - match h.display() { - HeadingDisplay::XxLarge => "title is-1", - HeadingDisplay::Large => "title is-2", - HeadingDisplay::Medium => "title is-3", - HeadingDisplay::Small => "title is-4", - HeadingDisplay::XxSmall => "title is-5", - HeadingDisplay::Normal => "title", - HeadingDisplay::Subtitle => "subtitle", - }, - ); - } - COMPONENT_PARAGRAPH => { - let p = component_mut::<Paragraph>(component); - p.alter_classes( - ClassesOp::SetDefault, - match p.display() { - ParagraphDisplay::XxLarge => "is-size-2", - ParagraphDisplay::Large => "is-size-3", - ParagraphDisplay::Medium => "is-size-4", - ParagraphDisplay::Small => "is-size-5", - ParagraphDisplay::XxSmall => "is-size-6", - ParagraphDisplay::Normal => "", - }, - ); - } - grid::COMPONENT_COLUMN => { - let col = component_mut::<grid::Column>(component); - col.alter_classes( - ClassesOp::SetDefault, - concat_string!( - "column", - match col.size() { - grid::ColumnSize::Default => "", - grid::ColumnSize::Is1of12 => " is-1", - grid::ColumnSize::Is2of12 => " is-2", - grid::ColumnSize::Is3of12 => " is-3", - grid::ColumnSize::Is4of12 => " is-4", - grid::ColumnSize::Is5of12 => " is-5", - grid::ColumnSize::Is6of12 => " is-6", - grid::ColumnSize::Is7of12 => " is-7", - grid::ColumnSize::Is8of12 => " is-8", - grid::ColumnSize::Is9of12 => " is-9", - grid::ColumnSize::Is10of12 => " is-10", - grid::ColumnSize::Is11of12 => " is-11", - grid::ColumnSize::IsFull => " is-12", - }, - " content" - ) - .as_str(), - ); - } - grid::COMPONENT_ROW => { - let row = component_mut::<grid::Row>(component); - row.alter_classes(ClassesOp::SetDefault, "columns"); - } - _ => {} - } - } - - fn render_component( - &self, - component: &dyn ComponentTrait, - _rcx: &mut RenderContext, - ) -> Option<Markup> { - match component.handle() { - COMPONENT_ICON => { - let icon = component_ref::<Icon>(component); - Some(html! { - span class="icon" { - i class=[icon.classes().get()] {}; - } - }) - } - _ => None, - } - } -} diff --git a/pagetop/src/base/theme/minimal.rs b/pagetop/src/base/theme/minimal.rs deleted file mode 100644 index fab264f1..00000000 --- a/pagetop/src/base/theme/minimal.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::prelude::*; - -pub_handle!(THEME_MINIMAL); - -pub struct Minimal; - -impl ThemeTrait for Minimal { - fn handle(&self) -> Handle { - THEME_MINIMAL - } -} diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 4fecb209..8e25858a 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,12 +1,15 @@ use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; -use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, ModeJS, StyleSheet}; +use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; use crate::server::HttpRequest; use crate::{base, concat_string, config, util, LazyStatic}; +use std::collections::HashMap; +use std::str::FromStr; + static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &base::theme::bootsier::Bootsier, + None => &base::theme::Saturn, }); pub enum ContextOp { @@ -16,7 +19,6 @@ pub enum ContextOp { RemoveStyleSheet(&'static str), AddJavaScript(JavaScript), RemoveJavaScript(&'static str), - AddJQuery, } #[rustfmt::skip] @@ -25,7 +27,7 @@ pub struct RenderContext { request : Option<HttpRequest>, stylesheets: Assets<StyleSheet>, javascripts: Assets<JavaScript>, - with_jquery: bool, + params : HashMap<&'static str, String>, id_counter : usize, } @@ -37,7 +39,7 @@ impl Default for RenderContext { request : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), - with_jquery: false, + params : HashMap::<&str, String>::new(), id_counter : 0, } } @@ -68,21 +70,15 @@ impl RenderContext { ContextOp::RemoveJavaScript(source) => { self.javascripts.remove(source); } - ContextOp::AddJQuery => { - if !self.with_jquery { - self.javascripts.add( - JavaScript::located("/theme/js/jquery.min.js") - .with_version("3.6.0") - .with_weight(isize::MIN) - .with_mode(ModeJS::Normal), - ); - self.with_jquery = true; - } - } } self } + pub fn set_param<T: FromStr + ToString>(&mut self, key: &'static str, value: T) -> &mut Self { + self.params.insert(key, value.to_string()); + self + } + /// Context GETTERS. pub(crate) fn theme(&self) -> ThemeStaticRef { @@ -93,6 +89,14 @@ impl RenderContext { &self.request } + pub fn get_param<T: FromStr + ToString>(&mut self, key: &'static str) -> Option<T> { + if let Some(value) = self.params.get(key) { + if let Ok(value) = T::from_str(value) { + return Some(value); + } + } + None + } /// Context RENDER. pub fn render(&mut self) -> Markup { diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 3f6a73d9..50bee917 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -35,6 +35,7 @@ pub fn register_modules(app: ModuleStaticRef) { // Enable default homepage. add_to_enabled(&mut list, &module::homepage::DefaultHomePage); + add_to_enabled(&mut list, &crate::base::theme::Saturn); list.reverse(); ENABLED_MODULES.write().unwrap().append(&mut list); @@ -82,7 +83,7 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { pub fn register_themes() { for m in ENABLED_MODULES.read().unwrap().iter() { - theme::all::register_themes(m.themes()); + theme::all::register_theme(m.handle(), m.theme()); } } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index e50acae6..31d7a566 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -24,6 +24,10 @@ pub trait ModuleTrait: BaseModule + Send + Sync { None } + fn theme(&self) -> Option<ThemeStaticRef> { + None + } + fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![] } @@ -32,10 +36,6 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } - fn themes(&self) -> Vec<ThemeStaticRef> { - vec![] - } - fn actions(&self) -> Vec<HookAction> { vec![] } diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 5da50c59..2bbc81a7 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,29 +1,19 @@ use super::ThemeStaticRef; -use crate::{base, serve_static_files, server, trace, LazyStatic}; +use crate::util::Handle; +use crate::{trace, LazyStatic}; use std::sync::RwLock; -include!(concat!(env!("OUT_DIR"), "/theme.rs")); - // Temas registrados. -static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = LazyStatic::new(|| { - RwLock::new(vec![ - &base::theme::aliner::Aliner, - &base::theme::minimal::Minimal, - &base::theme::bootsier::Bootsier, - &base::theme::bulmix::Bulmix, - ]) -}); +static THEMES: LazyStatic<RwLock<Vec<(Handle, ThemeStaticRef)>>> = + LazyStatic::new(|| RwLock::new(Vec::new())); -pub fn register_themes(themes: Vec<ThemeStaticRef>) { - let mut registered_themes = THEMES.write().unwrap(); - for theme in themes { - if !registered_themes - .iter() - .any(|t| t.handle() == theme.handle()) - { +pub fn register_theme(handle: Handle, theme: Option<ThemeStaticRef>) { + if let Some(theme) = theme { + let mut registered_themes = THEMES.write().unwrap(); + if !registered_themes.iter().any(|t| t.0 == handle) { trace::debug!("Registering theme \"{}\"", theme.single_name()); - registered_themes.push(theme); + registered_themes.push((handle, theme)); } } } @@ -33,17 +23,9 @@ pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { .write() .unwrap() .iter() - .find(|t| t.single_name().to_lowercase() == single_name.to_lowercase()) + .find(|t| t.1.single_name().to_lowercase() == single_name.to_lowercase()) { - Some(theme) => Some(*theme), + Some((_, theme)) => Some(*theme), _ => None, } } - -pub fn configure_services(cfg: &mut server::web::ServiceConfig) { - serve_static_files!(cfg, "/theme", bundle_theme); - - for t in THEMES.read().unwrap().iter() { - t.configure_service(cfg); - } -} diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 10802da9..ddec7246 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -2,8 +2,8 @@ use crate::base::component::{Container, Html}; use crate::core::component::{ComponentTrait, RenderContext}; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; -use crate::util::{single_type_name, Handle}; -use crate::{concat_string, config, server}; +use crate::util::single_type_name; +use crate::{concat_string, config}; pub type ThemeStaticRef = &'static dyn ThemeTrait; @@ -13,19 +13,6 @@ pub trait BaseTheme { /// Los temas deben implementar este "trait". pub trait ThemeTrait: BaseTheme + Send + Sync { - fn handle(&self) -> Handle; - - fn name(&self) -> String { - self.single_name().to_owned() - } - - fn description(&self) -> Option<String> { - None - } - - #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) {} - #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { if page.favicon().is_none() { diff --git a/pagetop/static/bootsier/css/bootstrap.min.css b/pagetop/static/bootsier/css/bootstrap.min.css deleted file mode 100644 index 1472dec0..00000000 --- a/pagetop/static/bootsier/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--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-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-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",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, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--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-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;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:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-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[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{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{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}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 (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-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 (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-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 (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;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)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.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 (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.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:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.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 (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.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:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.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 (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.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:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.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 (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.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:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.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 (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.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:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.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-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.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)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--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:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--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:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--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:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--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:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@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:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;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::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.2rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.3rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.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 rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-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 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-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{background-color:#0d6efd;border-color:#0d6efd;background-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")}.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{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image: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-position:left center;border-radius:2em;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{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image: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")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){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:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);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.73L.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.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e"),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.73L.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.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);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-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e"),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,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;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){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.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;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.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{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;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:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-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%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-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%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-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-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{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-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor: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,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%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-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left: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-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.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:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent 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 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-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% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.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 0z'/%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-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.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.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.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}.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}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display: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:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;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:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!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}.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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left: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}.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-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!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:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-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:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left: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}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left: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}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left: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}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left: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}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left: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}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-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-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}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/pagetop/static/bootsier/css/bootstrap.min.css.map b/pagetop/static/bootsier/css/bootstrap.min.css.map deleted file mode 100644 index c84afa43..00000000 --- a/pagetop/static/bootsier/css/bootstrap.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$variable-prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`<button>` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow in Chrome from inputs built with datalists.\n// See https://stackoverflow.com/a/54997118\n\n[list]::-webkit-calendar-picker-indicator {\n display: none;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. Correct the outline style in Safari.\n// 2. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\n[type=\"search\"] {\n outline-offset: -2px; // 1\n -webkit-appearance: textfield; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// Inherit font family and line height for file input buttons\n\n::file-selector-button {\n font: inherit;\n}\n\n// 1. Change font properties to `inherit`\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::-webkit-file-upload-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","@charset \"UTF-8\";\n/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n background-color: currentColor;\n border: 0;\n opacity: 0.25;\n}\n\nhr:not([size]) {\n height: 1px;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1, .h1 {\n font-size: 2.5rem;\n }\n}\n\nh2, .h2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2, .h2 {\n font-size: 2rem;\n }\n}\n\nh3, .h3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3, .h3 {\n font-size: 1.75rem;\n }\n}\n\nh4, .h4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4, .h4 {\n font-size: 1.5rem;\n }\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-bs-original-title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall, .small {\n font-size: 0.875em;\n}\n\nmark, .mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: #0d6efd;\n text-decoration: underline;\n}\na:hover {\n color: #0a58ca;\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n direction: ltr /* rtl:ignore */;\n unicode-bidi: bidi-override;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: #d63384;\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 0.875em;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n font-weight: 700;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: #6c757d;\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]::-webkit-calendar-picker-indicator {\n display: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n outline-offset: -2px;\n -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n}\n\n::file-selector-button {\n font: inherit;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: calc(1.625rem + 4.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-1 {\n font-size: 5rem;\n }\n}\n\n.display-2 {\n font-size: calc(1.575rem + 3.9vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-2 {\n font-size: 4.5rem;\n }\n}\n\n.display-3 {\n font-size: calc(1.525rem + 3.3vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-3 {\n font-size: 4rem;\n }\n}\n\n.display-4 {\n font-size: calc(1.475rem + 2.7vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-4 {\n font-size: 3.5rem;\n }\n}\n\n.display-5 {\n font-size: calc(1.425rem + 2.1vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-5 {\n font-size: 3rem;\n }\n}\n\n.display-6 {\n font-size: calc(1.375rem + 1.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-6 {\n font-size: 2.5rem;\n }\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 0.875em;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n.blockquote > :last-child {\n margin-bottom: 0;\n}\n\n.blockquote-footer {\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n.blockquote-footer::before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 0.875em;\n color: #6c757d;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n width: 100%;\n padding-right: var(--bs-gutter-x, 0.75rem);\n padding-left: var(--bs-gutter-x, 0.75rem);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-sm-0 {\n margin-left: 0;\n }\n\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-sm-3 {\n margin-left: 25%;\n }\n\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-sm-6 {\n margin-left: 50%;\n }\n\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-sm-9 {\n margin-left: 75%;\n }\n\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n\n .g-sm-0,\n.gx-sm-0 {\n --bs-gutter-x: 0;\n }\n\n .g-sm-0,\n.gy-sm-0 {\n --bs-gutter-y: 0;\n }\n\n .g-sm-1,\n.gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-sm-1,\n.gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-sm-2,\n.gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-sm-2,\n.gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-sm-3,\n.gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-sm-3,\n.gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-sm-4,\n.gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-sm-4,\n.gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-sm-5,\n.gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-sm-5,\n.gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-md-0 {\n margin-left: 0;\n }\n\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-md-3 {\n margin-left: 25%;\n }\n\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-md-6 {\n margin-left: 50%;\n }\n\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-md-9 {\n margin-left: 75%;\n }\n\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n\n .g-md-0,\n.gx-md-0 {\n --bs-gutter-x: 0;\n }\n\n .g-md-0,\n.gy-md-0 {\n --bs-gutter-y: 0;\n }\n\n .g-md-1,\n.gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-md-1,\n.gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-md-2,\n.gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-md-2,\n.gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-md-3,\n.gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-md-3,\n.gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-md-4,\n.gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-md-4,\n.gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-md-5,\n.gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-md-5,\n.gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-lg-0 {\n margin-left: 0;\n }\n\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-lg-3 {\n margin-left: 25%;\n }\n\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-lg-6 {\n margin-left: 50%;\n }\n\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-lg-9 {\n margin-left: 75%;\n }\n\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n\n .g-lg-0,\n.gx-lg-0 {\n --bs-gutter-x: 0;\n }\n\n .g-lg-0,\n.gy-lg-0 {\n --bs-gutter-y: 0;\n }\n\n .g-lg-1,\n.gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-lg-1,\n.gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-lg-2,\n.gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-lg-2,\n.gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-lg-3,\n.gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-lg-3,\n.gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-lg-4,\n.gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-lg-4,\n.gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-lg-5,\n.gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-lg-5,\n.gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-xl-0 {\n margin-left: 0;\n }\n\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-xl-3 {\n margin-left: 25%;\n }\n\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-xl-6 {\n margin-left: 50%;\n }\n\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-xl-9 {\n margin-left: 75%;\n }\n\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n\n .g-xl-0,\n.gx-xl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xl-0,\n.gy-xl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xl-1,\n.gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-xl-1,\n.gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-xl-2,\n.gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-xl-2,\n.gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-xl-3,\n.gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xl-3,\n.gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xl-4,\n.gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xl-4,\n.gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xl-5,\n.gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xl-5,\n.gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-xxl-0 {\n margin-left: 0;\n }\n\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-xxl-3 {\n margin-left: 25%;\n }\n\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-xxl-6 {\n margin-left: 50%;\n }\n\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-xxl-9 {\n margin-left: 75%;\n }\n\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n\n .g-xxl-0,\n.gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xxl-0,\n.gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xxl-1,\n.gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-xxl-1,\n.gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-xxl-2,\n.gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-xxl-2,\n.gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-xxl-3,\n.gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xxl-3,\n.gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xxl-4,\n.gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xxl-4,\n.gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xxl-5,\n.gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xxl-5,\n.gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.table {\n --bs-table-bg: transparent;\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: #212529;\n --bs-table-striped-bg: rgba(0, 0, 0, 0.05);\n --bs-table-active-color: #212529;\n --bs-table-active-bg: rgba(0, 0, 0, 0.1);\n --bs-table-hover-color: #212529;\n --bs-table-hover-bg: rgba(0, 0, 0, 0.075);\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n vertical-align: top;\n border-color: #dee2e6;\n}\n.table > :not(caption) > * > * {\n padding: 0.5rem 0.5rem;\n background-color: var(--bs-table-bg);\n border-bottom-width: 1px;\n box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);\n}\n.table > tbody {\n vertical-align: inherit;\n}\n.table > thead {\n vertical-align: bottom;\n}\n.table > :not(:first-child) {\n border-top: 2px solid currentColor;\n}\n\n.caption-top {\n caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n border-width: 1px 0;\n}\n.table-bordered > :not(caption) > * > * {\n border-width: 0 1px;\n}\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n --bs-table-accent-bg: var(--bs-table-striped-bg);\n color: var(--bs-table-striped-color);\n}\n\n.table-active {\n --bs-table-accent-bg: var(--bs-table-active-bg);\n color: var(--bs-table-active-color);\n}\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-accent-bg: var(--bs-table-hover-bg);\n color: var(--bs-table-hover-color);\n}\n\n.table-primary {\n --bs-table-bg: #cfe2ff;\n --bs-table-striped-bg: #c5d7f2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bacbe6;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfd1ec;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bacbe6;\n}\n\n.table-secondary {\n --bs-table-bg: #e2e3e5;\n --bs-table-striped-bg: #d7d8da;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #cbccce;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #d1d2d4;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #cbccce;\n}\n\n.table-success {\n --bs-table-bg: #d1e7dd;\n --bs-table-striped-bg: #c7dbd2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bcd0c7;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #c1d6cc;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bcd0c7;\n}\n\n.table-info {\n --bs-table-bg: #cff4fc;\n --bs-table-striped-bg: #c5e8ef;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #badce3;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfe2e9;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #badce3;\n}\n\n.table-warning {\n --bs-table-bg: #fff3cd;\n --bs-table-striped-bg: #f2e7c3;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #e6dbb9;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #ece1be;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #e6dbb9;\n}\n\n.table-danger {\n --bs-table-bg: #f8d7da;\n --bs-table-striped-bg: #eccccf;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfc2c4;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5c7ca;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfc2c4;\n}\n\n.table-light {\n --bs-table-bg: #f8f9fa;\n --bs-table-striped-bg: #ecedee;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfe0e1;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5e6e7;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfe0e1;\n}\n\n.table-dark {\n --bs-table-bg: #212529;\n --bs-table-striped-bg: #2c3034;\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: #373b3e;\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: #323539;\n --bs-table-hover-color: #fff;\n color: #fff;\n border-color: #373b3e;\n}\n\n.table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 767.98px) {\n .table-responsive-md {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1399.98px) {\n .table-responsive-xxl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n.form-label {\n margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n}\n\n.form-text {\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n.form-control[type=file] {\n overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control:focus {\n color: #212529;\n background-color: #fff;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n height: 1.5em;\n}\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n.form-control::file-selector-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n .form-control::file-selector-button {\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: #dde0e3;\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: #dde0e3;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: #dde0e3;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n min-height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::file-selector-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n min-height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::file-selector-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n min-height: calc(1.5em + 0.75rem + 2px);\n}\ntextarea.form-control-sm {\n min-height: calc(1.5em + 0.5rem + 2px);\n}\ntextarea.form-control-lg {\n min-height: calc(1.5em + 1rem + 2px);\n}\n\n.form-control-color {\n width: 3rem;\n height: auto;\n padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n height: 1.5em;\n border-radius: 0.25rem;\n}\n.form-control-color::-webkit-color-swatch {\n height: 1.5em;\n border-radius: 0.25rem;\n}\n\n.form-select {\n display: block;\n width: 100%;\n padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n -moz-padding-start: calc(0.75rem - 3px);\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right 0.75rem center;\n background-size: 16px 12px;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none;\n }\n}\n.form-select:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n padding-right: 0.75rem;\n background-image: none;\n}\n.form-select:disabled {\n background-color: #e9ecef;\n}\n.form-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #212529;\n}\n\n.form-select-sm {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.form-select-lg {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.form-check {\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5em;\n margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n float: left;\n margin-left: -1.5em;\n}\n\n.form-check-input {\n width: 1em;\n height: 1em;\n margin-top: 0.25em;\n vertical-align: top;\n background-color: #fff;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: 1px solid rgba(0, 0, 0, 0.25);\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-print-color-adjust: exact;\n color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n border-radius: 50%;\n}\n.form-check-input:active {\n filter: brightness(90%);\n}\n.form-check-input:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n background-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 10l3 3l6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n background-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\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n background-color: #0d6efd;\n border-color: #0d6efd;\n background-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\");\n}\n.form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n opacity: 0.5;\n}\n\n.form-switch {\n padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n width: 2em;\n margin-left: -2.5em;\n background-image: 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\");\n background-position: left center;\n border-radius: 2em;\n transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none;\n }\n}\n.form-switch .form-check-input:focus {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n background-position: right center;\n background-image: 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\");\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: 1rem;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n pointer-events: none;\n filter: none;\n opacity: 0.65;\n}\n\n.form-range {\n width: 100%;\n height: 1.5rem;\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.form-range:focus {\n outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n border: 0;\n}\n.form-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-range::-webkit-slider-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n -moz-transition: none;\n transition: none;\n }\n}\n.form-range::-moz-range-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range:disabled {\n pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n.form-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.form-floating {\n position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-select {\n height: calc(3.5rem + 2px);\n line-height: 1.25;\n}\n.form-floating > label {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n padding: 1rem 0.75rem;\n pointer-events: none;\n border: 1px solid transparent;\n transform-origin: 0 0;\n transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none;\n }\n}\n.form-floating > .form-control {\n padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::-moz-placeholder {\n color: transparent;\n}\n.form-floating > .form-control::placeholder {\n color: transparent;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-select ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus {\n z-index: 3;\n}\n.input-group .btn {\n position: relative;\n z-index: 2;\n}\n.input-group .btn:focus {\n z-index: 3;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #198754;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(25, 135, 84, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #198754;\n padding-right: calc(1.5em + 0.75rem);\n 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.73L.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.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n border-color: #198754;\n}\n.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\"] {\n padding-right: 4.125rem;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\"), 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.73L.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.1z'/%3e%3c/svg%3e\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n border-color: #198754;\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n background-color: #198754;\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #198754;\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid,\n.was-validated .input-group .form-select:valid,\n.input-group .form-select.is-valid {\n z-index: 1;\n}\n.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus,\n.was-validated .input-group .form-select:valid:focus,\n.input-group .form-select.is-valid:focus {\n z-index: 3;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n 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\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n border-color: #dc3545;\n}\n.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\"] {\n padding-right: 4.125rem;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\"), 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\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n border-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n background-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid,\n.was-validated .input-group .form-select:invalid,\n.input-group .form-select.is-invalid {\n z-index: 2;\n}\n.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus,\n.was-validated .input-group .form-select:invalid:focus,\n.input-group .form-select.is-invalid:focus {\n z-index: 3;\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n.btn:hover {\n color: #212529;\n}\n.btn-check:focus + .btn, .btn:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n pointer-events: none;\n opacity: 0.65;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #0b5ed7;\n border-color: #0a58ca;\n}\n.btn-check:focus + .btn-primary, .btn-primary:focus {\n color: #fff;\n background-color: #0b5ed7;\n border-color: #0a58ca;\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0a58ca;\n border-color: #0a53be;\n}\n.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-primary:disabled, .btn-primary.disabled {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-secondary:hover {\n color: #fff;\n background-color: #5c636a;\n border-color: #565e64;\n}\n.btn-check:focus + .btn-secondary, .btn-secondary:focus {\n color: #fff;\n background-color: #5c636a;\n border-color: #565e64;\n box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #565e64;\n border-color: #51585e;\n}\n.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-secondary:disabled, .btn-secondary.disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-success {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #157347;\n border-color: #146c43;\n}\n.btn-check:focus + .btn-success, .btn-success:focus {\n color: #fff;\n background-color: #157347;\n border-color: #146c43;\n box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #146c43;\n border-color: #13653f;\n}\n.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-success:disabled, .btn-success.disabled {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n\n.btn-info {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-info:hover {\n color: #000;\n background-color: #31d2f2;\n border-color: #25cff2;\n}\n.btn-check:focus + .btn-info, .btn-info:focus {\n color: #000;\n background-color: #31d2f2;\n border-color: #25cff2;\n box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle {\n color: #000;\n background-color: #3dd5f3;\n border-color: #25cff2;\n}\n.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-info:disabled, .btn-info.disabled {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n\n.btn-warning {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-warning:hover {\n color: #000;\n background-color: #ffca2c;\n border-color: #ffc720;\n}\n.btn-check:focus + .btn-warning, .btn-warning:focus {\n color: #000;\n background-color: #ffca2c;\n border-color: #ffc720;\n box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle {\n color: #000;\n background-color: #ffcd39;\n border-color: #ffc720;\n}\n.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-warning:disabled, .btn-warning.disabled {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #bb2d3b;\n border-color: #b02a37;\n}\n.btn-check:focus + .btn-danger, .btn-danger:focus {\n color: #fff;\n background-color: #bb2d3b;\n border-color: #b02a37;\n box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #b02a37;\n border-color: #a52834;\n}\n.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-danger:disabled, .btn-danger.disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-light {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-light:hover {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n}\n.btn-check:focus + .btn-light, .btn-light:focus {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n}\n.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-light:disabled, .btn-light.disabled {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-dark {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-dark:hover {\n color: #fff;\n background-color: #1c1f23;\n border-color: #1a1e21;\n}\n.btn-check:focus + .btn-dark, .btn-dark:focus {\n color: #fff;\n background-color: #1c1f23;\n border-color: #1a1e21;\n box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1a1e21;\n border-color: #191c1f;\n}\n.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-dark:disabled, .btn-dark.disabled {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n\n.btn-outline-primary {\n color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-outline-primary:disabled, .btn-outline-primary.disabled {\n color: #0d6efd;\n background-color: transparent;\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {\n box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-secondary:disabled, .btn-outline-secondary.disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-success {\n color: #198754;\n border-color: #198754;\n}\n.btn-outline-success:hover {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-check:focus + .btn-outline-success, .btn-outline-success:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-outline-success:disabled, .btn-outline-success.disabled {\n color: #198754;\n background-color: transparent;\n}\n\n.btn-outline-info {\n color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-outline-info:hover {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-check:focus + .btn-outline-info, .btn-outline-info:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-outline-info:disabled, .btn-outline-info.disabled {\n color: #0dcaf0;\n background-color: transparent;\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n.btn-outline-warning:hover {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {\n box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-warning:disabled, .btn-outline-warning.disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-danger:disabled, .btn-outline-danger.disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-outline-light:hover {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-check:focus + .btn-outline-light, .btn-outline-light:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-light:disabled, .btn-outline-light.disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-dark {\n color: #212529;\n border-color: #212529;\n}\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus {\n box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-outline-dark:disabled, .btn-outline-dark.disabled {\n color: #212529;\n background-color: transparent;\n}\n\n.btn-link {\n font-weight: 400;\n color: #0d6efd;\n text-decoration: underline;\n}\n.btn-link:hover {\n color: #0a58ca;\n}\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n.collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none;\n }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n z-index: 1000;\n display: none;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n.dropdown-menu[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: 0.125rem;\n}\n\n.dropdown-menu-start {\n --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-end {\n --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start;\n }\n .dropdown-menu-sm-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-sm-end {\n --bs-position: end;\n }\n .dropdown-menu-sm-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 768px) {\n .dropdown-menu-md-start {\n --bs-position: start;\n }\n .dropdown-menu-md-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-md-end {\n --bs-position: end;\n }\n .dropdown-menu-md-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start;\n }\n .dropdown-menu-lg-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-lg-end {\n --bs-position: end;\n }\n .dropdown-menu-lg-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start;\n }\n .dropdown-menu-xl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-xl-end {\n --bs-position: end;\n }\n .dropdown-menu-xl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start;\n }\n .dropdown-menu-xxl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-xxl-end {\n --bs-position: end;\n }\n .dropdown-menu-xxl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n.dropend .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n.dropstart .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n display: none;\n}\n.dropstart .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n text-decoration: none;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n.dropdown-item:hover, .dropdown-item:focus {\n color: #1e2125;\n background-color: #e9ecef;\n}\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #0d6efd;\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #adb5bd;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1rem;\n color: #212529;\n}\n\n.dropdown-menu-dark {\n color: #dee2e6;\n background-color: #343a40;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item {\n color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.15);\n}\n.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {\n color: #fff;\n background-color: #0d6efd;\n}\n.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {\n color: #adb5bd;\n}\n.dropdown-menu-dark .dropdown-divider {\n border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item-text {\n color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-header {\n color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn ~ .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n color: #0d6efd;\n text-decoration: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: #0a58ca;\n}\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n.nav-tabs .nav-link {\n margin-bottom: -1px;\n background: none;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n isolation: isolate;\n}\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n background: none;\n border: 0;\n border-radius: 0.25rem;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #0d6efd;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n}\n.navbar-brand {\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n text-decoration: none;\n white-space: nowrap;\n}\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n.navbar-nav .dropdown-menu {\n position: static;\n}\n\n.navbar-text {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n transition: box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none;\n }\n}\n.navbar-toggler:hover {\n text-decoration: none;\n}\n.navbar-toggler:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 0.25rem;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n .navbar-expand-sm .offcanvas-header {\n display: none;\n }\n .navbar-expand-sm .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .offcanvas-top,\n.navbar-expand-sm .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-sm .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n .navbar-expand-md .offcanvas-header {\n display: none;\n }\n .navbar-expand-md .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-md .offcanvas-top,\n.navbar-expand-md .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-md .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n .navbar-expand-lg .offcanvas-header {\n display: none;\n }\n .navbar-expand-lg .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .offcanvas-top,\n.navbar-expand-lg .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-lg .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xl .offcanvas-header {\n display: none;\n }\n .navbar-expand-xl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .offcanvas-top,\n.navbar-expand-xl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-xl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xxl .offcanvas-header {\n display: none;\n }\n .navbar-expand-xxl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .offcanvas-top,\n.navbar-expand-xxl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-xxl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n display: none;\n}\n.navbar-expand .offcanvas-header {\n display: none;\n}\n.navbar-expand .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n}\n.navbar-expand .offcanvas-top,\n.navbar-expand .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n}\n.navbar-expand .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.55);\n border-color: rgba(0, 0, 0, 0.1);\n}\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-text a,\n.navbar-light .navbar-text a:hover,\n.navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.55);\n border-color: rgba(255, 255, 255, 0.1);\n}\n.navbar-dark .navbar-toggler-icon {\n background-image: 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\");\n}\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-text a,\n.navbar-dark .navbar-text a:hover,\n.navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1rem 1rem;\n}\n\n.card-title {\n margin-bottom: 0.5rem;\n}\n\n.card-subtitle {\n margin-top: -0.25rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link + .card-link {\n margin-left: 1rem;\n}\n\n.card-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.5rem 1rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.5rem;\n margin-bottom: -0.5rem;\n margin-left: -0.5rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.5rem;\n margin-left: -0.5rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1rem;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-group > .card {\n margin-bottom: 0.75rem;\n}\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n.card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n.card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n.card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n.card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem 1.25rem;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n background-color: #fff;\n border: 0;\n border-radius: 0;\n overflow-anchor: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none;\n }\n}\n.accordion-button:not(.collapsed) {\n color: #0c63e4;\n background-color: #e7f1ff;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125);\n}\n.accordion-button:not(.collapsed)::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%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-.708z'/%3e%3c/svg%3e\");\n transform: rotate(-180deg);\n}\n.accordion-button::after {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: auto;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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-.708z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-size: 1.25rem;\n transition: transform 0.2s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button::after {\n transition: none;\n }\n}\n.accordion-button:hover {\n z-index: 2;\n}\n.accordion-button:focus {\n z-index: 3;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.accordion-item:first-of-type {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.accordion-item:first-of-type .accordion-button {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.accordion-item:not(:first-of-type) {\n border-top: 0;\n}\n.accordion-item:last-of-type {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n.accordion-item:last-of-type .accordion-button.collapsed {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.accordion-item:last-of-type .accordion-collapse {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.accordion-body {\n padding: 1rem 1.25rem;\n}\n\n.accordion-flush .accordion-collapse {\n border-width: 0;\n}\n.accordion-flush .accordion-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n.accordion-flush .accordion-item:first-child {\n border-top: 0;\n}\n.accordion-flush .accordion-item:last-child {\n border-bottom: 0;\n}\n.accordion-flush .accordion-item .accordion-button {\n border-radius: 0;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0 0;\n margin-bottom: 1rem;\n list-style: none;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: 0.5rem;\n color: #6c757d;\n content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n color: #0d6efd;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #dee2e6;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none;\n }\n}\n.page-link:hover {\n z-index: 2;\n color: #0a58ca;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n.page-link:focus {\n z-index: 3;\n color: #0a58ca;\n background-color: #e9ecef;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.page-item:not(:first-child) .page-link {\n margin-left: -1px;\n}\n.page-item.active .page-link {\n z-index: 3;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.page-link {\n padding: 0.375rem 0.75rem;\n}\n\n.page-item:first-child .page-link {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n}\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n}\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.35em 0.65em;\n font-size: 0.75em;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.alert {\n position: relative;\n padding: 1rem 1rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n color: #084298;\n background-color: #cfe2ff;\n border-color: #b6d4fe;\n}\n.alert-primary .alert-link {\n color: #06357a;\n}\n\n.alert-secondary {\n color: #41464b;\n background-color: #e2e3e5;\n border-color: #d3d6d8;\n}\n.alert-secondary .alert-link {\n color: #34383c;\n}\n\n.alert-success {\n color: #0f5132;\n background-color: #d1e7dd;\n border-color: #badbcc;\n}\n.alert-success .alert-link {\n color: #0c4128;\n}\n\n.alert-info {\n color: #055160;\n background-color: #cff4fc;\n border-color: #b6effb;\n}\n.alert-info .alert-link {\n color: #04414d;\n}\n\n.alert-warning {\n color: #664d03;\n background-color: #fff3cd;\n border-color: #ffecb5;\n}\n.alert-warning .alert-link {\n color: #523e02;\n}\n\n.alert-danger {\n color: #842029;\n background-color: #f8d7da;\n border-color: #f5c2c7;\n}\n.alert-danger .alert-link {\n color: #6a1a21;\n}\n\n.alert-light {\n color: #636464;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n.alert-light .alert-link {\n color: #4f5050;\n}\n\n.alert-dark {\n color: #141619;\n background-color: #d3d3d4;\n border-color: #bcbebf;\n}\n.alert-dark .alert-link {\n color: #101214;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #0d6efd;\n transition: width 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: 1s linear infinite progress-bar-stripes;\n animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: 0.25rem;\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n}\n.list-group-numbered > li::before {\n content: counters(section, \".\") \". \";\n counter-increment: section;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.5rem 1rem;\n color: #212529;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n margin-top: -1px;\n border-top-width: 1px;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n.list-group-flush {\n border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n border-width: 0 0 1px;\n}\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n color: #084298;\n background-color: #cfe2ff;\n}\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #084298;\n background-color: #bacbe6;\n}\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #084298;\n border-color: #084298;\n}\n\n.list-group-item-secondary {\n color: #41464b;\n background-color: #e2e3e5;\n}\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #41464b;\n background-color: #cbccce;\n}\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #41464b;\n border-color: #41464b;\n}\n\n.list-group-item-success {\n color: #0f5132;\n background-color: #d1e7dd;\n}\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #0f5132;\n background-color: #bcd0c7;\n}\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #0f5132;\n border-color: #0f5132;\n}\n\n.list-group-item-info {\n color: #055160;\n background-color: #cff4fc;\n}\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #055160;\n background-color: #badce3;\n}\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #055160;\n border-color: #055160;\n}\n\n.list-group-item-warning {\n color: #664d03;\n background-color: #fff3cd;\n}\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #664d03;\n background-color: #e6dbb9;\n}\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #664d03;\n border-color: #664d03;\n}\n\n.list-group-item-danger {\n color: #842029;\n background-color: #f8d7da;\n}\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #842029;\n background-color: #dfc2c4;\n}\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #842029;\n border-color: #842029;\n}\n\n.list-group-item-light {\n color: #636464;\n background-color: #fefefe;\n}\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #636464;\n background-color: #e5e5e5;\n}\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #636464;\n border-color: #636464;\n}\n\n.list-group-item-dark {\n color: #141619;\n background-color: #d3d3d4;\n}\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #141619;\n background-color: #bebebf;\n}\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #141619;\n border-color: #141619;\n}\n\n.btn-close {\n box-sizing: content-box;\n width: 1em;\n height: 1em;\n padding: 0.25em 0.25em;\n color: #000;\n background: transparent 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 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e\") center/1em auto no-repeat;\n border: 0;\n border-radius: 0.25rem;\n opacity: 0.5;\n}\n.btn-close:hover {\n color: #000;\n text-decoration: none;\n opacity: 0.75;\n}\n.btn-close:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n opacity: 1;\n}\n.btn-close:disabled, .btn-close.disabled {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n opacity: 0.25;\n}\n\n.btn-close-white {\n filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n width: 350px;\n max-width: 100%;\n font-size: 0.875rem;\n pointer-events: auto;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n.toast.showing {\n opacity: 0;\n}\n.toast:not(.show) {\n display: none;\n}\n\n.toast-container {\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.toast-header .btn-close {\n margin-right: -0.375rem;\n margin-left: 0.75rem;\n}\n\n.toast-body {\n padding: 0.75rem;\n word-wrap: break-word;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1055;\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n.modal.show .modal-dialog {\n transform: none;\n}\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n height: calc(100% - 1rem);\n}\n.modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n}\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.modal-header .btn-close {\n padding: 0.5rem 0.5rem;\n margin: -0.5rem -0.5rem -0.5rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center;\n justify-content: flex-end;\n padding: 0.75rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: calc(0.3rem - 1px);\n border-bottom-left-radius: calc(0.3rem - 1px);\n}\n.modal-footer > * {\n margin: 0.25rem;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n\n .modal-dialog-scrollable {\n height: calc(100% - 3.5rem);\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n\n .modal-sm {\n max-width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg,\n.modal-xl {\n max-width: 800px;\n }\n}\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n}\n.modal-fullscreen .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n}\n.modal-fullscreen .modal-header {\n border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n overflow-y: auto;\n}\n.modal-fullscreen .modal-footer {\n border-radius: 0;\n}\n\n@media (max-width: 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-sm-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-sm-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-md-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-md-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-lg-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-lg-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-xl-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xxl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-xxl-down .modal-footer {\n border-radius: 0;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1080;\n display: block;\n margin: 0;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n.tooltip.show {\n opacity: 0.9;\n}\n.tooltip .tooltip-arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n.tooltip .tooltip-arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n bottom: 0;\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n top: -1px;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n right: -1px;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n top: 0;\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n bottom: -1px;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n left: -1px;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0 /* rtl:ignore */;\n z-index: 1070;\n display: block;\n max-width: 276px;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n.popover .popover-arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n bottom: calc(-0.5rem - 1px);\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n left: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n top: calc(-0.5rem - 1px);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f0f0f0;\n}\n\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n right: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f0f0f0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 1rem 1rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n/* rtl:end:ignore */\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n.carousel-control-next {\n transition: none;\n }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n 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 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n 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-.708z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n margin-right: 15%;\n margin-bottom: 1rem;\n margin-left: 15%;\n list-style: none;\n}\n.carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n padding: 0;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none;\n }\n}\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 1.25rem;\n left: 15%;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n color: #fff;\n text-align: center;\n}\n\n.carousel-dark .carousel-control-prev-icon,\n.carousel-dark .carousel-control-next-icon {\n filter: invert(1) grayscale(100);\n}\n.carousel-dark .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n.carousel-dark .carousel-caption {\n color: #000;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: 0.75s linear infinite spinner-border;\n animation: 0.75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: 0.75s linear infinite spinner-grow;\n animation: 0.75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n.spinner-grow {\n -webkit-animation-duration: 1.5s;\n animation-duration: 1.5s;\n }\n}\n.offcanvas {\n position: fixed;\n bottom: 0;\n z-index: 1045;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n visibility: hidden;\n background-color: #fff;\n background-clip: padding-box;\n outline: 0;\n transition: transform 0.3s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none;\n }\n}\n\n.offcanvas-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.offcanvas-backdrop.fade {\n opacity: 0;\n}\n.offcanvas-backdrop.show {\n opacity: 0.5;\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem;\n}\n.offcanvas-header .btn-close {\n padding: 0.5rem 0.5rem;\n margin-top: -0.5rem;\n margin-right: -0.5rem;\n margin-bottom: -0.5rem;\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: 1rem 1rem;\n overflow-y: auto;\n}\n\n.offcanvas-start {\n top: 0;\n left: 0;\n width: 400px;\n border-right: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(-100%);\n}\n\n.offcanvas-end {\n top: 0;\n right: 0;\n width: 400px;\n border-left: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(100%);\n}\n\n.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-top: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(100%);\n}\n\n.offcanvas.show {\n transform: none;\n}\n\n.placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentColor;\n opacity: 0.5;\n}\n.placeholder.btn::before {\n display: inline-block;\n content: \"\";\n}\n\n.placeholder-xs {\n min-height: 0.6em;\n}\n\n.placeholder-sm {\n min-height: 0.8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n -webkit-animation: placeholder-glow 2s ease-in-out infinite;\n animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@-webkit-keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n.placeholder-wave {\n -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n -webkit-mask-size: 200% 100%;\n mask-size: 200% 100%;\n -webkit-animation: placeholder-wave 2s linear infinite;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@-webkit-keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n\n@keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.link-primary {\n color: #0d6efd;\n}\n.link-primary:hover, .link-primary:focus {\n color: #0a58ca;\n}\n\n.link-secondary {\n color: #6c757d;\n}\n.link-secondary:hover, .link-secondary:focus {\n color: #565e64;\n}\n\n.link-success {\n color: #198754;\n}\n.link-success:hover, .link-success:focus {\n color: #146c43;\n}\n\n.link-info {\n color: #0dcaf0;\n}\n.link-info:hover, .link-info:focus {\n color: #3dd5f3;\n}\n\n.link-warning {\n color: #ffc107;\n}\n.link-warning:hover, .link-warning:focus {\n color: #ffcd39;\n}\n\n.link-danger {\n color: #dc3545;\n}\n.link-danger:hover, .link-danger:focus {\n color: #b02a37;\n}\n\n.link-light {\n color: #f8f9fa;\n}\n.link-light:hover, .link-light:focus {\n color: #f9fafb;\n}\n\n.link-dark {\n color: #212529;\n}\n.link-dark:hover, .link-dark:focus {\n color: #1a1e21;\n}\n\n.ratio {\n position: relative;\n width: 100%;\n}\n.ratio::before {\n display: block;\n padding-top: var(--bs-aspect-ratio);\n content: \"\";\n}\n.ratio > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n@media (min-width: 576px) {\n .sticky-sm-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 768px) {\n .sticky-md-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 992px) {\n .sticky-lg-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1200px) {\n .sticky-xl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1400px) {\n .sticky-xxl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentColor;\n opacity: 0.25;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.float-start {\n float: left !important;\n}\n\n.float-end {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n.opacity-0 {\n opacity: 0 !important;\n}\n\n.opacity-25 {\n opacity: 0.25 !important;\n}\n\n.opacity-50 {\n opacity: 0.5 !important;\n}\n\n.opacity-75 {\n opacity: 0.75 !important;\n}\n\n.opacity-100 {\n opacity: 1 !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.overflow-visible {\n overflow: visible !important;\n}\n\n.overflow-scroll {\n overflow: scroll !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.top-0 {\n top: 0 !important;\n}\n\n.top-50 {\n top: 50% !important;\n}\n\n.top-100 {\n top: 100% !important;\n}\n\n.bottom-0 {\n bottom: 0 !important;\n}\n\n.bottom-50 {\n bottom: 50% !important;\n}\n\n.bottom-100 {\n bottom: 100% !important;\n}\n\n.start-0 {\n left: 0 !important;\n}\n\n.start-50 {\n left: 50% !important;\n}\n\n.start-100 {\n left: 100% !important;\n}\n\n.end-0 {\n right: 0 !important;\n}\n\n.end-50 {\n right: 50% !important;\n}\n\n.end-100 {\n right: 100% !important;\n}\n\n.translate-middle {\n transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n transform: translateY(-50%) !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-end {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-end-0 {\n border-right: 0 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-start {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-start-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #0d6efd !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #198754 !important;\n}\n\n.border-info {\n border-color: #0dcaf0 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #212529 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.border-1 {\n border-width: 1px !important;\n}\n\n.border-2 {\n border-width: 2px !important;\n}\n\n.border-3 {\n border-width: 3px !important;\n}\n\n.border-4 {\n border-width: 4px !important;\n}\n\n.border-5 {\n border-width: 5px !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.gap-0 {\n gap: 0 !important;\n}\n\n.gap-1 {\n gap: 0.25rem !important;\n}\n\n.gap-2 {\n gap: 0.5rem !important;\n}\n\n.gap-3 {\n gap: 1rem !important;\n}\n\n.gap-4 {\n gap: 1.5rem !important;\n}\n\n.gap-5 {\n gap: 3rem !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n font-size: 1.25rem !important;\n}\n\n.fs-6 {\n font-size: 1rem !important;\n}\n\n.fst-italic {\n font-style: italic !important;\n}\n\n.fst-normal {\n font-style: normal !important;\n}\n\n.fw-light {\n font-weight: 300 !important;\n}\n\n.fw-lighter {\n font-weight: lighter !important;\n}\n\n.fw-normal {\n font-weight: 400 !important;\n}\n\n.fw-bold {\n font-weight: 700 !important;\n}\n\n.fw-bolder {\n font-weight: bolder !important;\n}\n\n.lh-1 {\n line-height: 1 !important;\n}\n\n.lh-sm {\n line-height: 1.25 !important;\n}\n\n.lh-base {\n line-height: 1.5 !important;\n}\n\n.lh-lg {\n line-height: 2 !important;\n}\n\n.text-start {\n text-align: left !important;\n}\n\n.text-end {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-decoration-underline {\n text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n text-decoration: line-through !important;\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n --bs-text-opacity: 1;\n color: #6c757d !important;\n}\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important;\n}\n\n.text-opacity-25 {\n --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n --bs-text-opacity: 1;\n}\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: transparent !important;\n}\n\n.bg-opacity-10 {\n --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1;\n}\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n -webkit-user-select: all !important;\n -moz-user-select: all !important;\n user-select: all !important;\n}\n\n.user-select-auto {\n -webkit-user-select: auto !important;\n -moz-user-select: auto !important;\n user-select: auto !important;\n}\n\n.user-select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n user-select: none !important;\n}\n\n.pe-none {\n pointer-events: none !important;\n}\n\n.pe-auto {\n pointer-events: auto !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.rounded-1 {\n border-radius: 0.2rem !important;\n}\n\n.rounded-2 {\n border-radius: 0.25rem !important;\n}\n\n.rounded-3 {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-end {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-start {\n border-bottom-left-radius: 0.25rem !important;\n border-top-left-radius: 0.25rem !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-start {\n float: left !important;\n }\n\n .float-sm-end {\n float: right !important;\n }\n\n .float-sm-none {\n float: none !important;\n }\n\n .d-sm-inline {\n display: inline !important;\n }\n\n .d-sm-inline-block {\n display: inline-block !important;\n }\n\n .d-sm-block {\n display: block !important;\n }\n\n .d-sm-grid {\n display: grid !important;\n }\n\n .d-sm-table {\n display: table !important;\n }\n\n .d-sm-table-row {\n display: table-row !important;\n }\n\n .d-sm-table-cell {\n display: table-cell !important;\n }\n\n .d-sm-flex {\n display: flex !important;\n }\n\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n\n .d-sm-none {\n display: none !important;\n }\n\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-sm-row {\n flex-direction: row !important;\n }\n\n .flex-sm-column {\n flex-direction: column !important;\n }\n\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-sm-0 {\n gap: 0 !important;\n }\n\n .gap-sm-1 {\n gap: 0.25rem !important;\n }\n\n .gap-sm-2 {\n gap: 0.5rem !important;\n }\n\n .gap-sm-3 {\n gap: 1rem !important;\n }\n\n .gap-sm-4 {\n gap: 1.5rem !important;\n }\n\n .gap-sm-5 {\n gap: 3rem !important;\n }\n\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-sm-center {\n justify-content: center !important;\n }\n\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n\n .align-items-sm-center {\n align-items: center !important;\n }\n\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n\n .align-content-sm-center {\n align-content: center !important;\n }\n\n .align-content-sm-between {\n align-content: space-between !important;\n }\n\n .align-content-sm-around {\n align-content: space-around !important;\n }\n\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n\n .align-self-sm-auto {\n align-self: auto !important;\n }\n\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n\n .align-self-sm-center {\n align-self: center !important;\n }\n\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n\n .order-sm-first {\n order: -1 !important;\n }\n\n .order-sm-0 {\n order: 0 !important;\n }\n\n .order-sm-1 {\n order: 1 !important;\n }\n\n .order-sm-2 {\n order: 2 !important;\n }\n\n .order-sm-3 {\n order: 3 !important;\n }\n\n .order-sm-4 {\n order: 4 !important;\n }\n\n .order-sm-5 {\n order: 5 !important;\n }\n\n .order-sm-last {\n order: 6 !important;\n }\n\n .m-sm-0 {\n margin: 0 !important;\n }\n\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n\n .m-sm-3 {\n margin: 1rem !important;\n }\n\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n\n .m-sm-5 {\n margin: 3rem !important;\n }\n\n .m-sm-auto {\n margin: auto !important;\n }\n\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n\n .mt-sm-auto {\n margin-top: auto !important;\n }\n\n .me-sm-0 {\n margin-right: 0 !important;\n }\n\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n\n .me-sm-auto {\n margin-right: auto !important;\n }\n\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n\n .ms-sm-auto {\n margin-left: auto !important;\n }\n\n .p-sm-0 {\n padding: 0 !important;\n }\n\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n\n .p-sm-3 {\n padding: 1rem !important;\n }\n\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n\n .p-sm-5 {\n padding: 3rem !important;\n }\n\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n\n .text-sm-start {\n text-align: left !important;\n }\n\n .text-sm-end {\n text-align: right !important;\n }\n\n .text-sm-center {\n text-align: center !important;\n }\n}\n@media (min-width: 768px) {\n .float-md-start {\n float: left !important;\n }\n\n .float-md-end {\n float: right !important;\n }\n\n .float-md-none {\n float: none !important;\n }\n\n .d-md-inline {\n display: inline !important;\n }\n\n .d-md-inline-block {\n display: inline-block !important;\n }\n\n .d-md-block {\n display: block !important;\n }\n\n .d-md-grid {\n display: grid !important;\n }\n\n .d-md-table {\n display: table !important;\n }\n\n .d-md-table-row {\n display: table-row !important;\n }\n\n .d-md-table-cell {\n display: table-cell !important;\n }\n\n .d-md-flex {\n display: flex !important;\n }\n\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n\n .d-md-none {\n display: none !important;\n }\n\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-md-row {\n flex-direction: row !important;\n }\n\n .flex-md-column {\n flex-direction: column !important;\n }\n\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-md-0 {\n gap: 0 !important;\n }\n\n .gap-md-1 {\n gap: 0.25rem !important;\n }\n\n .gap-md-2 {\n gap: 0.5rem !important;\n }\n\n .gap-md-3 {\n gap: 1rem !important;\n }\n\n .gap-md-4 {\n gap: 1.5rem !important;\n }\n\n .gap-md-5 {\n gap: 3rem !important;\n }\n\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-md-center {\n justify-content: center !important;\n }\n\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-md-start {\n align-items: flex-start !important;\n }\n\n .align-items-md-end {\n align-items: flex-end !important;\n }\n\n .align-items-md-center {\n align-items: center !important;\n }\n\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n\n .align-content-md-start {\n align-content: flex-start !important;\n }\n\n .align-content-md-end {\n align-content: flex-end !important;\n }\n\n .align-content-md-center {\n align-content: center !important;\n }\n\n .align-content-md-between {\n align-content: space-between !important;\n }\n\n .align-content-md-around {\n align-content: space-around !important;\n }\n\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n\n .align-self-md-auto {\n align-self: auto !important;\n }\n\n .align-self-md-start {\n align-self: flex-start !important;\n }\n\n .align-self-md-end {\n align-self: flex-end !important;\n }\n\n .align-self-md-center {\n align-self: center !important;\n }\n\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n\n .order-md-first {\n order: -1 !important;\n }\n\n .order-md-0 {\n order: 0 !important;\n }\n\n .order-md-1 {\n order: 1 !important;\n }\n\n .order-md-2 {\n order: 2 !important;\n }\n\n .order-md-3 {\n order: 3 !important;\n }\n\n .order-md-4 {\n order: 4 !important;\n }\n\n .order-md-5 {\n order: 5 !important;\n }\n\n .order-md-last {\n order: 6 !important;\n }\n\n .m-md-0 {\n margin: 0 !important;\n }\n\n .m-md-1 {\n margin: 0.25rem !important;\n }\n\n .m-md-2 {\n margin: 0.5rem !important;\n }\n\n .m-md-3 {\n margin: 1rem !important;\n }\n\n .m-md-4 {\n margin: 1.5rem !important;\n }\n\n .m-md-5 {\n margin: 3rem !important;\n }\n\n .m-md-auto {\n margin: auto !important;\n }\n\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-md-0 {\n margin-top: 0 !important;\n }\n\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n\n .mt-md-auto {\n margin-top: auto !important;\n }\n\n .me-md-0 {\n margin-right: 0 !important;\n }\n\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-md-3 {\n margin-right: 1rem !important;\n }\n\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-md-5 {\n margin-right: 3rem !important;\n }\n\n .me-md-auto {\n margin-right: auto !important;\n }\n\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n\n .ms-md-0 {\n margin-left: 0 !important;\n }\n\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n\n .ms-md-auto {\n margin-left: auto !important;\n }\n\n .p-md-0 {\n padding: 0 !important;\n }\n\n .p-md-1 {\n padding: 0.25rem !important;\n }\n\n .p-md-2 {\n padding: 0.5rem !important;\n }\n\n .p-md-3 {\n padding: 1rem !important;\n }\n\n .p-md-4 {\n padding: 1.5rem !important;\n }\n\n .p-md-5 {\n padding: 3rem !important;\n }\n\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-md-0 {\n padding-top: 0 !important;\n }\n\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n\n .pe-md-0 {\n padding-right: 0 !important;\n }\n\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-md-0 {\n padding-left: 0 !important;\n }\n\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n\n .text-md-start {\n text-align: left !important;\n }\n\n .text-md-end {\n text-align: right !important;\n }\n\n .text-md-center {\n text-align: center !important;\n }\n}\n@media (min-width: 992px) {\n .float-lg-start {\n float: left !important;\n }\n\n .float-lg-end {\n float: right !important;\n }\n\n .float-lg-none {\n float: none !important;\n }\n\n .d-lg-inline {\n display: inline !important;\n }\n\n .d-lg-inline-block {\n display: inline-block !important;\n }\n\n .d-lg-block {\n display: block !important;\n }\n\n .d-lg-grid {\n display: grid !important;\n }\n\n .d-lg-table {\n display: table !important;\n }\n\n .d-lg-table-row {\n display: table-row !important;\n }\n\n .d-lg-table-cell {\n display: table-cell !important;\n }\n\n .d-lg-flex {\n display: flex !important;\n }\n\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n\n .d-lg-none {\n display: none !important;\n }\n\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-lg-row {\n flex-direction: row !important;\n }\n\n .flex-lg-column {\n flex-direction: column !important;\n }\n\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-lg-0 {\n gap: 0 !important;\n }\n\n .gap-lg-1 {\n gap: 0.25rem !important;\n }\n\n .gap-lg-2 {\n gap: 0.5rem !important;\n }\n\n .gap-lg-3 {\n gap: 1rem !important;\n }\n\n .gap-lg-4 {\n gap: 1.5rem !important;\n }\n\n .gap-lg-5 {\n gap: 3rem !important;\n }\n\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-lg-center {\n justify-content: center !important;\n }\n\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n\n .align-items-lg-center {\n align-items: center !important;\n }\n\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n\n .align-content-lg-center {\n align-content: center !important;\n }\n\n .align-content-lg-between {\n align-content: space-between !important;\n }\n\n .align-content-lg-around {\n align-content: space-around !important;\n }\n\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n\n .align-self-lg-auto {\n align-self: auto !important;\n }\n\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n\n .align-self-lg-center {\n align-self: center !important;\n }\n\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n\n .order-lg-first {\n order: -1 !important;\n }\n\n .order-lg-0 {\n order: 0 !important;\n }\n\n .order-lg-1 {\n order: 1 !important;\n }\n\n .order-lg-2 {\n order: 2 !important;\n }\n\n .order-lg-3 {\n order: 3 !important;\n }\n\n .order-lg-4 {\n order: 4 !important;\n }\n\n .order-lg-5 {\n order: 5 !important;\n }\n\n .order-lg-last {\n order: 6 !important;\n }\n\n .m-lg-0 {\n margin: 0 !important;\n }\n\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n\n .m-lg-3 {\n margin: 1rem !important;\n }\n\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n\n .m-lg-5 {\n margin: 3rem !important;\n }\n\n .m-lg-auto {\n margin: auto !important;\n }\n\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n\n .mt-lg-auto {\n margin-top: auto !important;\n }\n\n .me-lg-0 {\n margin-right: 0 !important;\n }\n\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n\n .me-lg-auto {\n margin-right: auto !important;\n }\n\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n\n .ms-lg-auto {\n margin-left: auto !important;\n }\n\n .p-lg-0 {\n padding: 0 !important;\n }\n\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n\n .p-lg-3 {\n padding: 1rem !important;\n }\n\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n\n .p-lg-5 {\n padding: 3rem !important;\n }\n\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n\n .text-lg-start {\n text-align: left !important;\n }\n\n .text-lg-end {\n text-align: right !important;\n }\n\n .text-lg-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .float-xl-start {\n float: left !important;\n }\n\n .float-xl-end {\n float: right !important;\n }\n\n .float-xl-none {\n float: none !important;\n }\n\n .d-xl-inline {\n display: inline !important;\n }\n\n .d-xl-inline-block {\n display: inline-block !important;\n }\n\n .d-xl-block {\n display: block !important;\n }\n\n .d-xl-grid {\n display: grid !important;\n }\n\n .d-xl-table {\n display: table !important;\n }\n\n .d-xl-table-row {\n display: table-row !important;\n }\n\n .d-xl-table-cell {\n display: table-cell !important;\n }\n\n .d-xl-flex {\n display: flex !important;\n }\n\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xl-none {\n display: none !important;\n }\n\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-xl-row {\n flex-direction: row !important;\n }\n\n .flex-xl-column {\n flex-direction: column !important;\n }\n\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-xl-0 {\n gap: 0 !important;\n }\n\n .gap-xl-1 {\n gap: 0.25rem !important;\n }\n\n .gap-xl-2 {\n gap: 0.5rem !important;\n }\n\n .gap-xl-3 {\n gap: 1rem !important;\n }\n\n .gap-xl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xl-5 {\n gap: 3rem !important;\n }\n\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xl-center {\n justify-content: center !important;\n }\n\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xl-center {\n align-items: center !important;\n }\n\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xl-center {\n align-content: center !important;\n }\n\n .align-content-xl-between {\n align-content: space-between !important;\n }\n\n .align-content-xl-around {\n align-content: space-around !important;\n }\n\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xl-auto {\n align-self: auto !important;\n }\n\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xl-center {\n align-self: center !important;\n }\n\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n\n .order-xl-first {\n order: -1 !important;\n }\n\n .order-xl-0 {\n order: 0 !important;\n }\n\n .order-xl-1 {\n order: 1 !important;\n }\n\n .order-xl-2 {\n order: 2 !important;\n }\n\n .order-xl-3 {\n order: 3 !important;\n }\n\n .order-xl-4 {\n order: 4 !important;\n }\n\n .order-xl-5 {\n order: 5 !important;\n }\n\n .order-xl-last {\n order: 6 !important;\n }\n\n .m-xl-0 {\n margin: 0 !important;\n }\n\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n\n .m-xl-3 {\n margin: 1rem !important;\n }\n\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xl-5 {\n margin: 3rem !important;\n }\n\n .m-xl-auto {\n margin: auto !important;\n }\n\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xl-auto {\n margin-top: auto !important;\n }\n\n .me-xl-0 {\n margin-right: 0 !important;\n }\n\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xl-auto {\n margin-right: auto !important;\n }\n\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xl-auto {\n margin-left: auto !important;\n }\n\n .p-xl-0 {\n padding: 0 !important;\n }\n\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n\n .p-xl-3 {\n padding: 1rem !important;\n }\n\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xl-5 {\n padding: 3rem !important;\n }\n\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n\n .text-xl-start {\n text-align: left !important;\n }\n\n .text-xl-end {\n text-align: right !important;\n }\n\n .text-xl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1400px) {\n .float-xxl-start {\n float: left !important;\n }\n\n .float-xxl-end {\n float: right !important;\n }\n\n .float-xxl-none {\n float: none !important;\n }\n\n .d-xxl-inline {\n display: inline !important;\n }\n\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n\n .d-xxl-block {\n display: block !important;\n }\n\n .d-xxl-grid {\n display: grid !important;\n }\n\n .d-xxl-table {\n display: table !important;\n }\n\n .d-xxl-table-row {\n display: table-row !important;\n }\n\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n\n .d-xxl-flex {\n display: flex !important;\n }\n\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xxl-none {\n display: none !important;\n }\n\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-xxl-row {\n flex-direction: row !important;\n }\n\n .flex-xxl-column {\n flex-direction: column !important;\n }\n\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-xxl-0 {\n gap: 0 !important;\n }\n\n .gap-xxl-1 {\n gap: 0.25rem !important;\n }\n\n .gap-xxl-2 {\n gap: 0.5rem !important;\n }\n\n .gap-xxl-3 {\n gap: 1rem !important;\n }\n\n .gap-xxl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xxl-5 {\n gap: 3rem !important;\n }\n\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xxl-center {\n align-items: center !important;\n }\n\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xxl-center {\n align-content: center !important;\n }\n\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xxl-center {\n align-self: center !important;\n }\n\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n\n .order-xxl-first {\n order: -1 !important;\n }\n\n .order-xxl-0 {\n order: 0 !important;\n }\n\n .order-xxl-1 {\n order: 1 !important;\n }\n\n .order-xxl-2 {\n order: 2 !important;\n }\n\n .order-xxl-3 {\n order: 3 !important;\n }\n\n .order-xxl-4 {\n order: 4 !important;\n }\n\n .order-xxl-5 {\n order: 5 !important;\n }\n\n .order-xxl-last {\n order: 6 !important;\n }\n\n .m-xxl-0 {\n margin: 0 !important;\n }\n\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n\n .m-xxl-3 {\n margin: 1rem !important;\n }\n\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xxl-5 {\n margin: 3rem !important;\n }\n\n .m-xxl-auto {\n margin: auto !important;\n }\n\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xxl-auto {\n margin-right: auto !important;\n }\n\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n\n .p-xxl-0 {\n padding: 0 !important;\n }\n\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n\n .p-xxl-3 {\n padding: 1rem !important;\n }\n\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xxl-5 {\n padding: 3rem !important;\n }\n\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n\n .text-xxl-start {\n text-align: left !important;\n }\n\n .text-xxl-end {\n text-align: right !important;\n }\n\n .text-xxl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .fs-1 {\n font-size: 2.5rem !important;\n }\n\n .fs-2 {\n font-size: 2rem !important;\n }\n\n .fs-3 {\n font-size: 1.75rem !important;\n }\n\n .fs-4 {\n font-size: 1.5rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n\n .d-print-inline-block {\n display: inline-block !important;\n }\n\n .d-print-block {\n display: block !important;\n }\n\n .d-print-grid {\n display: grid !important;\n }\n\n .d-print-table {\n display: table !important;\n }\n\n .d-print-table-row {\n display: table-row !important;\n }\n\n .d-print-table-cell {\n display: table-cell !important;\n }\n\n .d-print-flex {\n display: flex !important;\n }\n\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","//\n// Headings\n//\n.h1 {\n @extend h1;\n}\n\n.h2 {\n @extend h2;\n}\n\n.h3 {\n @extend h3;\n}\n\n.h4 {\n @extend h4;\n}\n\n.h5 {\n @extend h5;\n}\n\n.h6 {\n @extend h6;\n}\n\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n@each $display, $font-size in $display-font-sizes {\n .display-#{$display} {\n @include font-size($font-size);\n font-weight: $display-font-weight;\n line-height: $display-line-height;\n }\n}\n\n//\n// Emphasis\n//\n.small {\n @extend small;\n}\n\n.mark {\n @extend mark;\n}\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled();\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size($initialism-font-size);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-font-size);\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n.blockquote-footer {\n margin-top: -$blockquote-margin-y;\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-footer-font-size);\n color: $blockquote-footer-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer * .5;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n width: 100%;\n padding-right: var(--#{$variable-prefix}gutter-x, #{$gutter});\n padding-left: var(--#{$variable-prefix}gutter-x, #{$gutter});\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$variable-prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$variable-prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$variable-prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$variable-prefix}gutter-x: #{$gutter};\n --#{$variable-prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$variable-prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$variable-prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$variable-prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$variable-prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n --#{$variable-prefix}table-bg: #{$table-bg};\n --#{$variable-prefix}table-accent-bg: #{$table-accent-bg};\n --#{$variable-prefix}table-striped-color: #{$table-striped-color};\n --#{$variable-prefix}table-striped-bg: #{$table-striped-bg};\n --#{$variable-prefix}table-active-color: #{$table-active-color};\n --#{$variable-prefix}table-active-bg: #{$table-active-bg};\n --#{$variable-prefix}table-hover-color: #{$table-hover-color};\n --#{$variable-prefix}table-hover-bg: #{$table-hover-bg};\n\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n vertical-align: $table-cell-vertical-align;\n border-color: $table-border-color;\n\n // Target th & td\n // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.\n // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\n // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y $table-cell-padding-x;\n background-color: var(--#{$variable-prefix}table-bg);\n border-bottom-width: $table-border-width;\n box-shadow: inset 0 0 0 9999px var(--#{$variable-prefix}table-accent-bg);\n }\n\n > tbody {\n vertical-align: inherit;\n }\n\n > thead {\n vertical-align: bottom;\n }\n\n // Highlight border color between thead, tbody and tfoot.\n > :not(:first-child) {\n border-top: (2 * $table-border-width) solid $table-group-separator-color;\n }\n}\n\n\n//\n// Change placement of captions with a class\n//\n\n.caption-top {\n caption-side: top;\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n//\n// When borders are added on all sides of the cells, the corners can render odd when\n// these borders do not have the same color or if they are semi-transparent.\n// Therefor we add top and border bottoms to the `tr`s and left and right borders\n// to the `td`s or `th`s\n\n.table-bordered {\n > :not(caption) > * {\n border-width: $table-border-width 0;\n\n // stylelint-disable-next-line selector-max-universal\n > * {\n border-width: 0 $table-border-width;\n }\n }\n}\n\n.table-borderless {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n border-bottom-width: 0;\n }\n\n > :not(:first-child) {\n border-top-width: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-striped-bg);\n color: var(--#{$variable-prefix}table-striped-color);\n }\n}\n\n// Active table\n//\n// The `.table-active` class can be added to highlight rows or cells\n\n.table-active {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-active-bg);\n color: var(--#{$variable-prefix}table-active-color);\n}\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover > * {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-hover-bg);\n color: var(--#{$variable-prefix}table-hover-color);\n }\n}\n\n\n// Table variants\n//\n// Table variants set the table cell backgrounds, border colors\n// and the colors of the striped, hovered & active tables\n\n@each $color, $value in $table-variants {\n @include table-variant($color, $value);\n}\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @include media-breakpoint-down($breakpoint) {\n .table-responsive#{$infix} {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n }\n}\n","// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n\n --#{$variable-prefix}table-bg: #{$background};\n --#{$variable-prefix}table-striped-bg: #{$striped-bg};\n --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$variable-prefix}table-active-bg: #{$active-bg};\n --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$variable-prefix}table-hover-bg: #{$hover-bg};\n --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: $color;\n border-color: mix($color, $background, percentage($table-border-factor));\n }\n}\n// scss-docs-end table-variant\n","//\n// Labels\n//\n\n.form-label {\n margin-bottom: $form-label-margin-bottom;\n @include font-size($form-label-font-size);\n font-style: $form-label-font-style;\n font-weight: $form-label-font-weight;\n color: $form-label-color;\n}\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: add($input-padding-y, $input-border-width);\n padding-bottom: add($input-padding-y, $input-border-width);\n margin-bottom: 0; // Override the `<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n font-style: $form-label-font-style;\n font-weight: $form-label-font-weight;\n line-height: $input-line-height;\n color: $form-label-color;\n}\n\n.col-form-label-lg {\n padding-top: add($input-padding-y-lg, $input-border-width);\n padding-bottom: add($input-padding-y-lg, $input-border-width);\n @include font-size($input-font-size-lg);\n}\n\n.col-form-label-sm {\n padding-top: add($input-padding-y-sm, $input-border-width);\n padding-bottom: add($input-padding-y-sm, $input-border-width);\n @include font-size($input-font-size-sm);\n}\n","//\n// Form text\n//\n\n.form-text {\n margin-top: $form-text-margin-top;\n @include font-size($form-text-font-size);\n font-style: $form-text-font-style;\n font-weight: $form-text-font-weight;\n color: $form-text-color;\n}\n","//\n// General form controls (plus a few specific high-level interventions)\n//\n\n.form-control {\n display: block;\n width: 100%;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n appearance: none; // Fix appearance for date inputs in Safari\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n &[type=\"file\"] {\n overflow: hidden; // prevent pseudo element button overlap\n\n &:not(:disabled):not([readonly]) {\n cursor: pointer;\n }\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($input-box-shadow, $input-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $input-focus-box-shadow;\n }\n }\n\n // Add some height to date inputs on iOS\n // https://github.com/twbs/bootstrap/issues/23307\n // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved\n &::-webkit-date-and-time-value {\n // Multiply line-height by 1em if it has no unit\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n }\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n border-color: $input-disabled-border-color;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n\n // File input buttons theming\n &::file-selector-button {\n padding: $input-padding-y $input-padding-x;\n margin: (-$input-padding-y) (-$input-padding-x);\n margin-inline-end: $input-padding-x;\n color: $form-file-button-color;\n @include gradient-bg($form-file-button-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: $input-border-width;\n border-radius: 0; // stylelint-disable-line property-disallowed-list\n @include transition($btn-transition);\n }\n\n &:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: $form-file-button-hover-bg;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y $input-padding-x;\n margin: (-$input-padding-y) (-$input-padding-x);\n margin-inline-end: $input-padding-x;\n color: $form-file-button-color;\n @include gradient-bg($form-file-button-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: $input-border-width;\n border-radius: 0; // stylelint-disable-line property-disallowed-list\n @include transition($btn-transition);\n }\n\n &:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: $form-file-button-hover-bg;\n }\n}\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: $input-padding-y 0;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n min-height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n @include border-radius($input-border-radius-sm);\n\n &::file-selector-button {\n padding: $input-padding-y-sm $input-padding-x-sm;\n margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\n margin-inline-end: $input-padding-x-sm;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y-sm $input-padding-x-sm;\n margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\n margin-inline-end: $input-padding-x-sm;\n }\n}\n\n.form-control-lg {\n min-height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n @include border-radius($input-border-radius-lg);\n\n &::file-selector-button {\n padding: $input-padding-y-lg $input-padding-x-lg;\n margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\n margin-inline-end: $input-padding-x-lg;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y-lg $input-padding-x-lg;\n margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\n margin-inline-end: $input-padding-x-lg;\n }\n}\n\n// Make sure textareas don't shrink too much when resized\n// https://github.com/twbs/bootstrap/pull/29124\n// stylelint-disable selector-no-qualifying-type\ntextarea {\n &.form-control {\n min-height: $input-height;\n }\n\n &.form-control-sm {\n min-height: $input-height-sm;\n }\n\n &.form-control-lg {\n min-height: $input-height-lg;\n }\n}\n// stylelint-enable selector-no-qualifying-type\n\n.form-control-color {\n width: $form-color-width;\n height: auto; // Override fixed browser height\n padding: $input-padding-y;\n\n &:not(:disabled):not([readonly]) {\n cursor: pointer;\n }\n\n &::-moz-color-swatch {\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n @include border-radius($input-border-radius);\n }\n\n &::-webkit-color-swatch {\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n @include border-radius($input-border-radius);\n }\n}\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$variable-prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n","// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n\n.form-select {\n display: block;\n width: 100%;\n padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;\n // stylelint-disable-next-line property-no-vendor-prefix\n -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636\n font-family: $form-select-font-family;\n @include font-size($form-select-font-size);\n font-weight: $form-select-font-weight;\n line-height: $form-select-line-height;\n color: $form-select-color;\n background-color: $form-select-bg;\n background-image: escape-svg($form-select-indicator);\n background-repeat: no-repeat;\n background-position: $form-select-bg-position;\n background-size: $form-select-bg-size;\n border: $form-select-border-width solid $form-select-border-color;\n @include border-radius($form-select-border-radius, 0);\n @include box-shadow($form-select-box-shadow);\n @include transition($form-select-transition);\n appearance: none;\n\n &:focus {\n border-color: $form-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $form-select-focus-box-shadow;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n padding-right: $form-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $form-select-disabled-color;\n background-color: $form-select-disabled-bg;\n border-color: $form-select-disabled-border-color;\n }\n\n // Remove outline from select box in FF\n &:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 $form-select-color;\n }\n}\n\n.form-select-sm {\n padding-top: $form-select-padding-y-sm;\n padding-bottom: $form-select-padding-y-sm;\n padding-left: $form-select-padding-x-sm;\n @include font-size($form-select-font-size-sm);\n @include border-radius($form-select-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: $form-select-padding-y-lg;\n padding-bottom: $form-select-padding-y-lg;\n padding-left: $form-select-padding-x-lg;\n @include font-size($form-select-font-size-lg);\n @include border-radius($form-select-border-radius-lg);\n}\n","//\n// Check/radio\n//\n\n.form-check {\n display: block;\n min-height: $form-check-min-height;\n padding-left: $form-check-padding-start;\n margin-bottom: $form-check-margin-bottom;\n\n .form-check-input {\n float: left;\n margin-left: $form-check-padding-start * -1;\n }\n}\n\n.form-check-input {\n width: $form-check-input-width;\n height: $form-check-input-width;\n margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height\n vertical-align: top;\n background-color: $form-check-input-bg;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: $form-check-input-border;\n appearance: none;\n color-adjust: exact; // Keep themed appearance for print\n @include transition($form-check-transition);\n\n &[type=\"checkbox\"] {\n @include border-radius($form-check-input-border-radius);\n }\n\n &[type=\"radio\"] {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: $form-check-radio-border-radius;\n }\n\n &:active {\n filter: $form-check-input-active-filter;\n }\n\n &:focus {\n border-color: $form-check-input-focus-border;\n outline: 0;\n box-shadow: $form-check-input-focus-box-shadow;\n }\n\n &:checked {\n background-color: $form-check-input-checked-bg-color;\n border-color: $form-check-input-checked-border-color;\n\n &[type=\"checkbox\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-checked-bg-image);\n }\n }\n\n &[type=\"radio\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-radio-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-radio-checked-bg-image);\n }\n }\n }\n\n &[type=\"checkbox\"]:indeterminate {\n background-color: $form-check-input-indeterminate-bg-color;\n border-color: $form-check-input-indeterminate-border-color;\n\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-indeterminate-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-indeterminate-bg-image);\n }\n }\n\n &:disabled {\n pointer-events: none;\n filter: none;\n opacity: $form-check-input-disabled-opacity;\n }\n\n // Use disabled attribute in addition of :disabled pseudo-class\n // See: https://github.com/twbs/bootstrap/issues/28247\n &[disabled],\n &:disabled {\n ~ .form-check-label {\n opacity: $form-check-label-disabled-opacity;\n }\n }\n}\n\n.form-check-label {\n color: $form-check-label-color;\n cursor: $form-check-label-cursor;\n}\n\n//\n// Switch\n//\n\n.form-switch {\n padding-left: $form-switch-padding-start;\n\n .form-check-input {\n width: $form-switch-width;\n margin-left: $form-switch-padding-start * -1;\n background-image: escape-svg($form-switch-bg-image);\n background-position: left center;\n @include border-radius($form-switch-border-radius);\n @include transition($form-switch-transition);\n\n &:focus {\n background-image: escape-svg($form-switch-focus-bg-image);\n }\n\n &:checked {\n background-position: $form-switch-checked-bg-position;\n\n @if $enable-gradients {\n background-image: escape-svg($form-switch-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-switch-checked-bg-image);\n }\n }\n }\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: $form-check-inline-margin-end;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n\n &[disabled],\n &:disabled {\n + .btn {\n pointer-events: none;\n filter: none;\n opacity: $form-check-btn-check-disabled-opacity;\n }\n }\n}\n","// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.form-range {\n width: 100%;\n height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: 0;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $form-range-thumb-width;\n height: $form-range-thumb-height;\n margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific\n @include gradient-bg($form-range-thumb-bg);\n border: $form-range-thumb-border;\n @include border-radius($form-range-thumb-border-radius);\n @include box-shadow($form-range-thumb-box-shadow);\n @include transition($form-range-thumb-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($form-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $form-range-track-width;\n height: $form-range-track-height;\n color: transparent; // Why?\n cursor: $form-range-track-cursor;\n background-color: $form-range-track-bg;\n border-color: transparent;\n @include border-radius($form-range-track-border-radius);\n @include box-shadow($form-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $form-range-thumb-width;\n height: $form-range-thumb-height;\n @include gradient-bg($form-range-thumb-bg);\n border: $form-range-thumb-border;\n @include border-radius($form-range-thumb-border-radius);\n @include box-shadow($form-range-thumb-box-shadow);\n @include transition($form-range-thumb-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($form-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $form-range-track-width;\n height: $form-range-track-height;\n color: transparent;\n cursor: $form-range-track-cursor;\n background-color: $form-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($form-range-track-border-radius);\n @include box-shadow($form-range-track-box-shadow);\n }\n\n &:disabled {\n pointer-events: none;\n\n &::-webkit-slider-thumb {\n background-color: $form-range-thumb-disabled-bg;\n }\n\n &::-moz-range-thumb {\n background-color: $form-range-thumb-disabled-bg;\n }\n }\n}\n",".form-floating {\n position: relative;\n\n > .form-control,\n > .form-select {\n height: $form-floating-height;\n line-height: $form-floating-line-height;\n }\n\n > label {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%; // allow textareas\n padding: $form-floating-padding-y $form-floating-padding-x;\n pointer-events: none;\n border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model\n transform-origin: 0 0;\n @include transition($form-floating-transition);\n }\n\n // stylelint-disable no-duplicate-selectors\n > .form-control {\n padding: $form-floating-padding-y $form-floating-padding-x;\n\n &::placeholder {\n color: transparent;\n }\n\n &:focus,\n &:not(:placeholder-shown) {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n &:-webkit-autofill {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n }\n\n > .form-select {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n\n > .form-control:focus,\n > .form-control:not(:placeholder-shown),\n > .form-select {\n ~ label {\n opacity: $form-floating-label-opacity;\n transform: $form-floating-label-transform;\n }\n }\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n > .form-control:-webkit-autofill {\n ~ label {\n opacity: $form-floating-label-opacity;\n transform: $form-floating-label-transform;\n }\n }\n // stylelint-enable no-duplicate-selectors\n}\n","//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-select {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n width: 1%;\n min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .form-select:focus {\n z-index: 3;\n }\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-group-addon-padding-y $input-group-addon-padding-x;\n @include font-size($input-font-size); // Match inputs\n font-weight: $input-group-addon-font-weight;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: $form-select-padding-x + $form-select-indicator-padding;\n}\n\n\n// Rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.input-group {\n &:not(.has-validation) {\n > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n > .dropdown-toggle:nth-last-child(n + 3) {\n @include border-end-radius(0);\n }\n }\n\n &.has-validation {\n > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),\n > .dropdown-toggle:nth-last-child(n + 4) {\n @include border-end-radius(0);\n }\n }\n\n $validation-messages: \"\";\n @each $state in map-keys($form-validation-states) {\n $validation-messages: $validation-messages + \":not(.\" + unquote($state) + \"-tooltip)\" + \":not(.\" + unquote($state) + \"-feedback)\";\n }\n\n > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {\n margin-left: -$input-border-width;\n @include border-start-radius(0);\n }\n}\n","// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n padding-right: $form-select-feedback-icon-padding-end;\n background-image: escape-svg($form-select-indicator), escape-svg($icon);\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group .form-control,\n .input-group .form-select {\n @include form-validation-state-selector($state) {\n @if $state == \"valid\" {\n z-index: 1;\n } @else if $state == \"invalid\" {\n z-index: 2;\n }\n &:focus {\n z-index: 3;\n }\n }\n }\n}\n// scss-docs-end form-validation-mixins\n","//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n line-height: $btn-line-height;\n color: $body-color;\n text-align: center;\n text-decoration: if($link-decoration == none, null, none);\n white-space: $btn-white-space;\n vertical-align: middle;\n cursor: if($enable-button-pointers, pointer, null);\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius);\n @include transition($btn-transition);\n\n &:hover {\n color: $body-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n .btn-check:focus + &,\n &:focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n\n &:disabled,\n &.disabled,\n fieldset:disabled & {\n pointer-events: none;\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n}\n\n\n//\n// Alternate buttons\n//\n\n// scss-docs-start btn-variant-loops\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n// scss-docs-end btn-variant-loops\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $btn-link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $btn-link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n text-decoration: $link-hover-decoration;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n &:hover {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n @if $enable-shadows {\n @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n color: $active-color;\n background-color: $active-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $disabled-color;\n background-color: $disabled-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $disabled-border;\n }\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n color: $color;\n border-color: $color;\n\n &:hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n &.dropdown-toggle.show {\n color: $active-color;\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $color;\n background-color: transparent;\n }\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n// scss-docs-end btn-size-mixin\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n// scss-docs-start collapse-classes\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n\n &.collapse-horizontal {\n width: 0;\n height: auto;\n @include transition($transition-collapse-width);\n }\n}\n// scss-docs-end collapse-classes\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y $dropdown-padding-x;\n margin: 0; // Override default margin of ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n\n &[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: $dropdown-spacer;\n }\n}\n\n// scss-docs-start responsive-breakpoints\n// We deliberately hardcode the `bs-` prefix because we check\n// this custom property in JS to determine Popper's positioning\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-start {\n --bs-position: start;\n\n &[data-bs-popper] {\n right: auto;\n left: 0;\n }\n }\n\n .dropdown-menu#{$infix}-end {\n --bs-position: end;\n\n &[data-bs-popper] {\n right: 0;\n left: auto;\n }\n }\n }\n}\n// scss-docs-end responsive-breakpoints\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropend {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(end);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropstart {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(start);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n height: 0;\n margin: $dropdown-divider-margin-y 0;\n overflow: hidden;\n border-top: 1px solid $dropdown-divider-bg;\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n &:hover,\n &:focus {\n color: $dropdown-link-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-header-padding;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n\n// Dark dropdowns\n.dropdown-menu-dark {\n color: $dropdown-dark-color;\n background-color: $dropdown-dark-bg;\n border-color: $dropdown-dark-border-color;\n @include box-shadow($dropdown-dark-box-shadow);\n\n .dropdown-item {\n color: $dropdown-dark-link-color;\n\n &:hover,\n &:focus {\n color: $dropdown-dark-link-hover-color;\n @include gradient-bg($dropdown-dark-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-dark-link-active-color;\n @include gradient-bg($dropdown-dark-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-dark-link-disabled-color;\n }\n }\n\n .dropdown-divider {\n border-color: $dropdown-dark-divider-bg;\n }\n\n .dropdown-item-text {\n color: $dropdown-dark-link-color;\n }\n\n .dropdown-header {\n color: $dropdown-dark-header-color;\n }\n}\n","// scss-docs-start caret-mixins\n@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-end {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-start {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down();\n } @else if $direction == up {\n @include caret-up();\n } @else if $direction == end {\n @include caret-end();\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-start();\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n","// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n }\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n > .btn-check:checked + .btn,\n > .btn-check:focus + .btn,\n > .btn:hover,\n > .btn:focus,\n > .btn:active,\n > .btn.active {\n z-index: 1;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-end-radius(0);\n }\n\n // The left radius should be 0 if the button is:\n // - the \"third or more\" child\n // - the second child and the previous element isn't `.btn-check` (making it the first child visually)\n // - part of a btn-group which isn't the first child\n > .btn:nth-child(n + 3),\n > :not(.btn-check) + .btn,\n > .btn-group:not(:first-child) > .btn {\n @include border-start-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropend &::after {\n margin-left: 0;\n }\n\n .dropstart &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn ~ .btn,\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s, `<ul>`s or `<ol>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n @include font-size($nav-link-font-size);\n font-weight: $nav-link-font-weight;\n color: $nav-link-color;\n text-decoration: if($link-decoration == none, null, none);\n @include transition($nav-link-transition);\n\n &:hover,\n &:focus {\n color: $nav-link-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-link {\n margin-bottom: -$nav-tabs-border-width;\n background: none;\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n &:hover,\n &:focus {\n border-color: $nav-tabs-link-hover-border-color;\n // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\n isolation: isolate;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n background: none;\n border: 0;\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n @include gradient-bg($nav-pills-link-active-bg);\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n > .nav-link,\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n > .nav-link,\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n.nav-fill,\n.nav-justified {\n .nav-item .nav-link {\n width: 100%; // Make sure button will grow\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding-top: $navbar-padding-y;\n padding-right: $navbar-padding-x; // default: null\n padding-bottom: $navbar-padding-y;\n padding-left: $navbar-padding-x; // default: null\n @include gradient-bg();\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n // The `flex-wrap` property is inherited to simplify the expanded navbars\n %container-flex-properties {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n }\n\n > .container,\n > .container-fluid {\n @extend %container-flex-properties;\n }\n\n @each $breakpoint, $container-max-width in $container-max-widths {\n > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n @extend %container-flex-properties;\n }\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-brand-margin-end;\n @include font-size($navbar-brand-font-size);\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap;\n\n &:hover,\n &:focus {\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n @include transition($navbar-toggler-transition);\n\n &:hover {\n text-decoration: none;\n }\n\n &:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 $navbar-toggler-focus-width;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--#{$variable-prefix}scroll-height, 75vh);\n overflow-y: auto;\n}\n\n// scss-docs-start navbar-expand-loop\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n // stylelint-disable-next-line scss/selector-no-union-class-name\n &#{$infix} {\n @include media-breakpoint-up($next) {\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: $navbar-nav-link-padding-x;\n padding-left: $navbar-nav-link-padding-x;\n }\n }\n\n .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n\n .offcanvas-header {\n display: none;\n }\n\n .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important; // stylelint-disable-line declaration-no-important\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n @include transition(none);\n transform: none;\n }\n .offcanvas-top,\n .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n\n .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n }\n }\n }\n}\n// scss-docs-end navbar-expand-loop\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n &:hover,\n &:focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n &:hover,\n &:focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: escape-svg($navbar-light-toggler-icon-bg);\n }\n\n .navbar-text {\n color: $navbar-light-color;\n\n a,\n a:hover,\n a:focus {\n color: $navbar-light-active-color;\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n &:hover,\n &:focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n &:hover,\n &:focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: escape-svg($navbar-dark-toggler-icon-bg);\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a,\n a:hover,\n a:focus {\n color: $navbar-dark-active-color;\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n height: $card-height;\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n @include box-shadow($card-box-shadow);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n\n &:first-child {\n border-top-width: 0;\n @include border-top-radius($card-inner-border-radius);\n }\n\n &:last-child {\n border-bottom-width: 0;\n @include border-bottom-radius($card-inner-border-radius);\n }\n }\n\n // Due to specificity of the above selector (`.card > .list-group`), we must\n // use a child selector here to prevent double borders.\n > .card-header + .list-group,\n > .list-group + .card-footer {\n border-top: 0;\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-y $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-title-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-title-spacer-y * .5;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n &:hover {\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-cap-padding-y $card-cap-padding-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n}\n\n.card-footer {\n padding: $card-cap-padding-y $card-cap-padding-x;\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-cap-padding-x * .5;\n margin-bottom: -$card-cap-padding-y;\n margin-left: -$card-cap-padding-x * .5;\n border-bottom: 0;\n\n @if $nav-tabs-link-active-bg != $card-bg {\n .nav-link.active {\n background-color: $card-bg;\n border-bottom-color: $card-bg;\n }\n }\n}\n\n.card-header-pills {\n margin-right: -$card-cap-padding-x * .5;\n margin-left: -$card-cap-padding-x * .5;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n @include border-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n}\n\n.card-img,\n.card-img-top {\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n display: flex;\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-end-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-disallowed-list\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-disallowed-list\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-start-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-disallowed-list\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-disallowed-list\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: $accordion-button-padding-y $accordion-button-padding-x;\n @include font-size($font-size-base);\n color: $accordion-button-color;\n text-align: left; // Reset button style\n background-color: $accordion-button-bg;\n border: 0;\n @include border-radius(0);\n overflow-anchor: none;\n @include transition($accordion-transition);\n\n &:not(.collapsed) {\n color: $accordion-button-active-color;\n background-color: $accordion-button-active-bg;\n box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color;\n\n &::after {\n background-image: escape-svg($accordion-button-active-icon);\n transform: $accordion-icon-transform;\n }\n }\n\n // Accordion icon\n &::after {\n flex-shrink: 0;\n width: $accordion-icon-width;\n height: $accordion-icon-width;\n margin-left: auto;\n content: \"\";\n background-image: escape-svg($accordion-button-icon);\n background-repeat: no-repeat;\n background-size: $accordion-icon-width;\n @include transition($accordion-icon-transition);\n }\n\n &:hover {\n z-index: 2;\n }\n\n &:focus {\n z-index: 3;\n border-color: $accordion-button-focus-border-color;\n outline: 0;\n box-shadow: $accordion-button-focus-box-shadow;\n }\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n background-color: $accordion-bg;\n border: $accordion-border-width solid $accordion-border-color;\n\n &:first-of-type {\n @include border-top-radius($accordion-border-radius);\n\n .accordion-button {\n @include border-top-radius($accordion-inner-border-radius);\n }\n }\n\n &:not(:first-of-type) {\n border-top: 0;\n }\n\n // Only set a border-radius on the last item if the accordion is collapsed\n &:last-of-type {\n @include border-bottom-radius($accordion-border-radius);\n\n .accordion-button {\n &.collapsed {\n @include border-bottom-radius($accordion-inner-border-radius);\n }\n }\n\n .accordion-collapse {\n @include border-bottom-radius($accordion-border-radius);\n }\n }\n}\n\n.accordion-body {\n padding: $accordion-body-padding-y $accordion-body-padding-x;\n}\n\n\n// Flush accordion items\n//\n// Remove borders and border-radius to keep accordion items edge-to-edge.\n\n.accordion-flush {\n .accordion-collapse {\n border-width: 0;\n }\n\n .accordion-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:first-child { border-top: 0; }\n &:last-child { border-bottom: 0; }\n\n .accordion-button {\n @include border-radius(0);\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: $breadcrumb-margin-bottom;\n @include font-size($breadcrumb-font-size);\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n padding-left: $breadcrumb-item-padding-x;\n\n &::before {\n float: left; // Suppress inline spacings and underlining of the separator\n padding-right: $breadcrumb-item-padding-x;\n color: $breadcrumb-divider-color;\n content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{\"/* rtl:\"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{\"*/\"};\n }\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n}\n\n.page-link {\n position: relative;\n display: block;\n color: $pagination-color;\n text-decoration: if($link-decoration == none, null, none);\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n @include transition($pagination-transition);\n\n &:hover {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n\n &:focus {\n z-index: 3;\n color: $pagination-focus-color;\n background-color: $pagination-focus-bg;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n}\n\n.page-item {\n &:not(:first-child) .page-link {\n margin-left: $pagination-margin-start;\n }\n\n &.active .page-link {\n z-index: 3;\n color: $pagination-active-color;\n @include gradient-bg($pagination-active-bg);\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);\n}\n","// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n }\n\n .page-item {\n @if $pagination-margin-start == (-$pagination-border-width) {\n &:first-child {\n .page-link {\n @include border-start-radius($border-radius);\n }\n }\n\n &:last-child {\n .page-link {\n @include border-end-radius($border-radius);\n }\n }\n } @else {\n //Add border-radius to all pageLinks in case they have left margin\n .page-link {\n @include border-radius($border-radius);\n }\n }\n }\n}\n// scss-docs-end pagination-mixin\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n color: $badge-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include gradient-bg();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n","//\n// Base styles\n//\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $alert-dismissible-padding-r;\n\n // Adjust close link position\n .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: $stretched-link-z-index + 1;\n padding: $alert-padding-y * 1.25 $alert-padding-x;\n }\n}\n\n\n// scss-docs-start alert-modifiers\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $state, $value in $theme-colors {\n $alert-background: shift-color($value, $alert-bg-scale);\n $alert-border: shift-color($value, $alert-border-scale);\n $alert-color: shift-color($value, $alert-color-scale);\n @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {\n $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));\n }\n .alert-#{$state} {\n @include alert-variant($alert-background, $alert-border, $alert-color);\n }\n}\n// scss-docs-end alert-modifiers\n","// scss-docs-start alert-variant-mixin\n@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n .alert-link {\n color: shade-color($color, 20%);\n }\n}\n// scss-docs-end alert-variant-mixin\n","// Disable animation if transitions are disabled\n\n// scss-docs-start progress-keyframes\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n 0% { background-position-x: $progress-height; }\n }\n}\n// scss-docs-end progress-keyframes\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: $progress-bar-animation-timing progress-bar-stripes;\n\n @if $enable-reduced-motion {\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n }\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n @include border-radius($list-group-border-radius);\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n\n > li::before {\n // Increments only this instance of the section counter\n content: counters(section, \".\") \". \";\n counter-increment: section;\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n &:hover,\n &:focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n color: $list-group-color;\n text-decoration: if($link-decoration == none, null, none);\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius(inherit);\n }\n\n &:last-child {\n @include border-bottom-radius(inherit);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n\n & + & {\n border-top-width: 0;\n\n &.active {\n margin-top: -$list-group-border-width;\n border-top-width: $list-group-border-width;\n }\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n > .list-group-item {\n &:first-child {\n @include border-bottom-start-radius($list-group-border-radius);\n @include border-top-end-radius(0);\n }\n\n &:last-child {\n @include border-top-end-radius($list-group-border-radius);\n @include border-bottom-start-radius(0);\n }\n\n &.active {\n margin-top: 0;\n }\n\n + .list-group-item {\n border-top-width: $list-group-border-width;\n border-left-width: 0;\n\n &.active {\n margin-left: -$list-group-border-width;\n border-left-width: $list-group-border-width;\n }\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n @include border-radius(0);\n\n > .list-group-item {\n border-width: 0 0 $list-group-border-width;\n\n &:last-child {\n border-bottom-width: 0;\n }\n }\n}\n\n\n// scss-docs-start list-group-modifiers\n// List group contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $state, $value in $theme-colors {\n $list-group-variant-bg: shift-color($value, $list-group-item-bg-scale);\n $list-group-variant-color: shift-color($value, $list-group-item-color-scale);\n @if (contrast-ratio($list-group-variant-bg, $list-group-variant-color) < $min-contrast-ratio) {\n $list-group-variant-color: mix($value, color-contrast($list-group-variant-bg), abs($list-group-item-color-scale));\n }\n\n @include list-group-item-variant($state, $list-group-variant-bg, $list-group-variant-color);\n}\n// scss-docs-end list-group-modifiers\n","// List Groups\n\n// scss-docs-start list-group-mixin\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n &:hover,\n &:focus {\n color: $color;\n background-color: shade-color($background, 10%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n// scss-docs-end list-group-mixin\n","// transparent background and border properties included for button version.\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n.btn-close {\n box-sizing: content-box;\n width: $btn-close-width;\n height: $btn-close-height;\n padding: $btn-close-padding-y $btn-close-padding-x;\n color: $btn-close-color;\n background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements\n border: 0; // for button elements\n @include border-radius();\n opacity: $btn-close-opacity;\n\n // Override <a>'s hover style\n &:hover {\n color: $btn-close-color;\n text-decoration: none;\n opacity: $btn-close-hover-opacity;\n }\n\n &:focus {\n outline: 0;\n box-shadow: $btn-close-focus-shadow;\n opacity: $btn-close-focus-opacity;\n }\n\n &:disabled,\n &.disabled {\n pointer-events: none;\n user-select: none;\n opacity: $btn-close-disabled-opacity;\n }\n}\n\n.btn-close-white {\n filter: $btn-close-white-filter;\n}\n",".toast {\n width: $toast-max-width;\n max-width: 100%;\n @include font-size($toast-font-size);\n color: $toast-color;\n pointer-events: auto;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n @include border-radius($toast-border-radius);\n\n &.showing {\n opacity: 0;\n }\n\n &:not(.show) {\n display: none;\n }\n}\n\n.toast-container {\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n\n > :not(:last-child) {\n margin-bottom: $toast-spacing;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n @include border-top-radius(subtract($toast-border-radius, $toast-border-width));\n\n .btn-close {\n margin-right: $toast-padding-x * -.5;\n margin-left: $toast-padding-x;\n }\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n word-wrap: break-word;\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n\n // When trying to close, animate focus to scale\n .modal.modal-static & {\n transform: $modal-scale-transform;\n }\n}\n\n.modal-dialog-scrollable {\n height: subtract(100%, $modal-dialog-margin * 2);\n\n .modal-content {\n max-height: 100%;\n overflow: hidden;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: subtract(100%, $modal-dialog-margin * 2);\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n @include overlay-backdrop($zindex-modal-backdrop, $modal-backdrop-bg, $modal-backdrop-opacity);\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-inner-border-radius);\n\n .btn-close {\n padding: ($modal-header-padding-y * .5) ($modal-header-padding-x * .5);\n margin: ($modal-header-padding-y * -.5) ($modal-header-padding-x * -.5) ($modal-header-padding-y * -.5) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when there should be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding - $modal-footer-margin-between * .5;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-inner-border-radius);\n\n // Place margin between footer elements\n // This solution is far from ideal because of the universal selector usage,\n // but is needed to fix https://github.com/twbs/bootstrap/issues/24800\n > * {\n margin: $modal-footer-margin-between * .5;\n }\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n }\n\n .modal-dialog-centered {\n min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n\n// scss-docs-start modal-fullscreen-loop\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n $postfix: if($infix != \"\", $infix + \"-down\", \"\");\n\n @include media-breakpoint-down($breakpoint) {\n .modal-fullscreen#{$postfix} {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n\n .modal-content {\n height: 100%;\n border: 0;\n @include border-radius(0);\n }\n\n .modal-header {\n @include border-radius(0);\n }\n\n .modal-body {\n overflow-y: auto;\n }\n\n .modal-footer {\n @include border-radius(0);\n }\n }\n }\n}\n// scss-docs-end modal-fullscreen-loop\n","// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex;\n width: 100vw;\n height: 100vh;\n background-color: $backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $backdrop-opacity; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .tooltip-arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .tooltip-arrow {\n bottom: 0;\n\n &::before {\n top: -1px;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-end {\n padding: 0 $tooltip-arrow-height;\n\n .tooltip-arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: -1px;\n border-width: ($tooltip-arrow-width * .5) $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .tooltip-arrow {\n top: 0;\n\n &::before {\n bottom: -1px;\n border-width: 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-start {\n padding: 0 $tooltip-arrow-height;\n\n .tooltip-arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: -1px;\n border-width: ($tooltip-arrow-width * .5) 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[data-popper-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[data-popper-placement^=\"right\"] {\n @extend .bs-tooltip-end;\n }\n &[data-popper-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[data-popper-placement^=\"left\"] {\n @extend .bs-tooltip-start;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0 #{\"/* rtl:ignore */\"};\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .popover-arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n > .popover-arrow {\n bottom: subtract(-$popover-arrow-height, $popover-border-width);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-end {\n > .popover-arrow {\n left: subtract(-$popover-arrow-height, $popover-border-width);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n > .popover-arrow {\n top: subtract(-$popover-arrow-height, $popover-border-width);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width * .5;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-start {\n > .popover-arrow {\n right: subtract(-$popover-arrow-height, $popover-border-width);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[data-popper-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[data-popper-placement^=\"right\"] {\n @extend .bs-popover-end;\n }\n &[data-popper-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[data-popper-placement^=\"left\"] {\n @extend .bs-popover-start;\n }\n}\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid $popover-border-color;\n @include border-top-radius($popover-inner-border-radius);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-start and .carousel-item-end is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-start and .active.carousel-item-end is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n/* rtl:end:ignore */\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-start,\n .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-start,\n .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n @include transition(opacity 0s $carousel-transition-duration);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n padding: 0;\n color: $carousel-control-color;\n text-align: center;\n background: none;\n border: 0;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n &:hover,\n &:focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);\n}\n.carousel-control-next {\n right: 0;\n background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n background-image: escape-svg($carousel-control-prev-icon-bg);\n}\n.carousel-control-next-icon {\n background-image: escape-svg($carousel-control-next-icon-bg);\n}\n\n// Optional indicator pips/controls\n//\n// Add a container (such as a list) with the following class and add an item (ideally a focusable control,\n// like a button) with data-bs-target for each slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-bottom: 1rem;\n margin-left: $carousel-control-width;\n list-style: none;\n\n [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n padding: 0;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n border: 0;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: $carousel-indicator-opacity;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: $carousel-indicator-active-opacity;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) * .5;\n bottom: $carousel-caption-spacer;\n left: (100% - $carousel-caption-width) * .5;\n padding-top: $carousel-caption-padding-y;\n padding-bottom: $carousel-caption-padding-y;\n color: $carousel-caption-color;\n text-align: center;\n}\n\n// Dark mode carousel\n\n.carousel-dark {\n .carousel-control-prev-icon,\n .carousel-control-next-icon {\n filter: $carousel-dark-control-icon-filter;\n }\n\n .carousel-indicators [data-bs-target] {\n background-color: $carousel-dark-indicator-active-bg;\n }\n\n .carousel-caption {\n color: $carousel-dark-caption-color;\n }\n}\n","// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n","//\n// Rotating border\n//\n\n// scss-docs-start spinner-border-keyframes\n@keyframes spinner-border {\n to { transform: rotate(360deg) #{\"/* rtl:ignore */\"}; }\n}\n// scss-docs-end spinner-border-keyframes\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: $spinner-vertical-align;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 50%;\n animation: $spinner-animation-speed linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n// scss-docs-start spinner-grow-keyframes\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n// scss-docs-end spinner-grow-keyframes\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: $spinner-vertical-align;\n background-color: currentColor;\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 50%;\n opacity: 0;\n animation: $spinner-animation-speed linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n\n@if $enable-reduced-motion {\n @media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n animation-duration: $spinner-animation-speed * 2;\n }\n }\n}\n",".offcanvas {\n position: fixed;\n bottom: 0;\n z-index: $zindex-offcanvas;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: $offcanvas-color;\n visibility: hidden;\n background-color: $offcanvas-bg-color;\n background-clip: padding-box;\n outline: 0;\n @include box-shadow($offcanvas-box-shadow);\n @include transition(transform $offcanvas-transition-duration ease-in-out);\n}\n\n.offcanvas-backdrop {\n @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity);\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $offcanvas-padding-y $offcanvas-padding-x;\n\n .btn-close {\n padding: ($offcanvas-padding-y * .5) ($offcanvas-padding-x * .5);\n margin-top: $offcanvas-padding-y * -.5;\n margin-right: $offcanvas-padding-x * -.5;\n margin-bottom: $offcanvas-padding-y * -.5;\n }\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: $offcanvas-title-line-height;\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: $offcanvas-padding-y $offcanvas-padding-x;\n overflow-y: auto;\n}\n\n.offcanvas-start {\n top: 0;\n left: 0;\n width: $offcanvas-horizontal-width;\n border-right: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateX(-100%);\n}\n\n.offcanvas-end {\n top: 0;\n right: 0;\n width: $offcanvas-horizontal-width;\n border-left: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateX(100%);\n}\n\n.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: $offcanvas-vertical-height;\n max-height: 100%;\n border-bottom: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n right: 0;\n left: 0;\n height: $offcanvas-vertical-height;\n max-height: 100%;\n border-top: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateY(100%);\n}\n\n.offcanvas.show {\n transform: none;\n}\n",".placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentColor;\n opacity: $placeholder-opacity-max;\n\n &.btn::before {\n display: inline-block;\n content: \"\";\n }\n}\n\n// Sizing\n.placeholder-xs {\n min-height: .6em;\n}\n\n.placeholder-sm {\n min-height: .8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n// Animation\n.placeholder-glow {\n .placeholder {\n animation: placeholder-glow 2s ease-in-out infinite;\n }\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: $placeholder-opacity-min;\n }\n}\n\n.placeholder-wave {\n mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);\n mask-size: 200% 100%;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n 100% {\n mask-position: -200% 0%;\n }\n}\n","@each $color, $value in $theme-colors {\n .link-#{$color} {\n color: $value;\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\n }\n }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.ratio {\n position: relative;\n width: 100%;\n\n &::before {\n display: block;\n padding-top: var(--#{$variable-prefix}aspect-ratio);\n content: \"\";\n }\n\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n\n@each $key, $ratio in $aspect-ratios {\n .ratio-#{$key} {\n --#{$variable-prefix}aspect-ratio: #{$ratio};\n }\n}\n","// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n// Responsive sticky top\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .sticky#{$infix}-top {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n }\n}\n","// scss-docs-start stacks\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n// scss-docs-end stacks\n","//\n// Visually hidden\n//\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n @include visually-hidden();\n}\n","// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::#{$stretched-link-pseudo-element} {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $stretched-link-z-index;\n content: \"\";\n }\n}\n","//\n// Text truncation\n//\n\n.text-truncate {\n @include text-truncate();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",".vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentColor;\n opacity: $hr-opacity;\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (eg. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$variable-prefix}#{$property-class}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$variable-prefix}#{$property-class}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $value in $is-local-vars {\n --#{$variable-prefix}#{$local-var}: #{$value};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/pagetop/static/bootsier/images/caution.png b/pagetop/static/bootsier/images/caution.png deleted file mode 100644 index d059f6292c976a198c441cfda66e33ca79d3b76c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12481 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 LNkvXXu0mjf`&SGI diff --git a/pagetop/static/bootsier/js/bootstrap.bundle.min.js b/pagetop/static/bootsier/js/bootstrap.bundle.min.js deleted file mode 100644 index cc0a2556..00000000 --- a/pagetop/static/bootsier/js/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=(t,e,i)=>{Object.keys(i).forEach((n=>{const s=i[n],r=e[n],a=r&&o(r)?"element":null==(l=r)?`${l}`:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}))},l=t=>!(!o(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",(()=>{p.forEach((t=>t()))})),p.push(e)):e()},_=t=>{"function"==typeof t&&t()},b=(e,i,n=!0)=>{if(!n)return void _(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),_(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},v=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,E=/::\d+$/,A={};let T=1;const O={mouseenter:"mouseover",mouseleave:"mouseout"},C=/^(mouseenter|mouseleave)/i,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"]);function L(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function x(t){const e=L(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function D(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;s<o;s++){const o=t[n[s]];if(o.originalHandler===e&&o.delegationSelector===i)return o}return null}function S(t,e,i){const n="string"==typeof e,s=n?i:e;let o=P(t);return k.has(o)||(o=t),[n,s,o]}function N(t,e,i,n,s){if("string"!=typeof e||!t)return;if(i||(i=n,n=null),C.test(e)){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=S(e,i,n),l=x(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=L(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&j.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&j.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function I(t,e,i,n,s){const o=D(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function P(t){return t=t.replace(w,""),O[t]||t}const j={on(t,e,i,n){N(t,e,i,n,!1)},one(t,e,i,n){N(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void I(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach((o=>{if(o.includes(n)){const n=s[o];I(t,e,i,n.originalHandler,n.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const n=i.replace(E,"");if(!a||e.includes(n)){const e=h[i];I(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f(),s=P(e),o=e!==s,r=k.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};class B{constructor(t){(t=r(t))&&(this._element=t,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){b(t,e,i)}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class W extends B{static get NAME(){return"alert"}close(){if(j.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(W,"close"),g(W);const $='[data-bs-toggle="button"]';class z extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function q(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}j.on(document,"click.bs.button.data-api",$,(t=>{t.preventDefault();const e=t.target.closest($);z.getOrCreateInstance(e).toggle()})),g(z);const U={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=q(t.dataset[i])})),e},getDataAttribute:(t,e)=>q(t.getAttribute(`data-bs-${F(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!c(t)&&l(t)))}},K="carousel",X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Y={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Q="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z},et="slid.bs.carousel",it="active",nt=".active.carousel-item";class st extends B{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return K}next(){this._slide(Q)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),V.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(s(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=V.findOne(nt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,et,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?Q:G;this._slide(i,this._items[t])}_getConfig(t){return t={...X,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(K,t,Y),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&j.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),j.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};V.find(".carousel-item img",this._element).forEach((t=>{j.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?(j.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),j.on(this._element,"pointerup.bs.carousel",(t=>n(t))),this._element.classList.add("pointer-event")):(j.on(this._element,"touchstart.bs.carousel",(t=>e(t))),j.on(this._element,"touchmove.bs.carousel",(t=>i(t))),j.on(this._element,"touchend.bs.carousel",(t=>n(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?V.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===Q;return v(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),n=this._getItemIndex(V.findOne(nt,this._element));return j.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=V.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=V.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e<i.length;e++)if(Number.parseInt(i[e].getAttribute("data-bs-slide-to"),10)===this._getItemIndex(t)){i[e].classList.add(it),i[e].setAttribute("aria-current","true");break}}}_updateInterval(){const t=this._activeElement||V.findOne(nt,this._element);if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}_slide(t,e){const i=this._directionToOrder(t),n=V.findOne(nt,this._element),s=this._getItemIndex(n),o=e||this._getItemByOrder(i,n),r=this._getItemIndex(o),a=Boolean(this._interval),l=i===Q,c=l?"carousel-item-start":"carousel-item-end",h=l?"carousel-item-next":"carousel-item-prev",d=this._orderToDirection(i);if(o&&o.classList.contains(it))return void(this._isSliding=!1);if(this._isSliding)return;if(this._triggerSlideEvent(o,d).defaultPrevented)return;if(!n||!o)return;this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(o),this._activeElement=o;const f=()=>{j.trigger(this._element,et,{relatedTarget:o,direction:d,from:s,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),u(o),n.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(it),n.classList.remove(it,h,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,n,!0)}else n.classList.remove(it),o.classList.add(it),this._isSliding=!1,f();a&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?m()?t===Z?G:Q:t===Z?Q:G:t}_orderToDirection(t){return[Q,G].includes(t)?m()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const i=st.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){st.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=n(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),st.carouselInterface(e,i),s&&st.getInstance(e).to(s),t.preventDefault()}}j.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",st.dataApiClickHandler),j.on(window,"load.bs.carousel.data-api",(()=>{const t=V.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;e<i;e++)st.carouselInterface(t[e],st.getInstance(t[e]))})),g(st);const ot="collapse",rt={toggle:!0,parent:null},at={toggle:"boolean",parent:"(null|element)"},lt="show",ct="collapse",ht="collapsing",dt="collapsed",ut=":scope .collapse .collapse",ft='[data-bs-toggle="collapse"]';class pt extends B{constructor(t,e){super(t),this._isTransitioning=!1,this._config=this._getConfig(e),this._triggerArray=[];const n=V.find(ft);for(let t=0,e=n.length;t<e;t++){const e=n[t],s=i(e),o=V.find(s).filter((t=>t===this._element));null!==s&&o.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return rt}static get NAME(){return ot}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=V.find(ut,this._config.parent);e=V.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=V.findOne(this._selector);if(e.length){const n=e.find((t=>i!==t));if(t=n?pt.getInstance(n):null,t&&t._isTransitioning)return}if(j.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&pt.getOrCreateInstance(e,{toggle:!1}).hide(),t||H.set(e,"bs.collapse",null)}));const n=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const s=`scroll${n[0].toUpperCase()+n.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[n]="",j.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[n]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);const e=this._triggerArray.length;for(let t=0;t<e;t++){const e=this._triggerArray[t],i=n(e);i&&!this._isShown(i)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),j.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_getConfig(t){return(t={...rt,...U.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=r(t.parent),a(ot,t,at),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=V.find(ut,this._config.parent);V.find(ft,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=n(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(dt):t.classList.add(dt),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,"click.bs.collapse.data-api",ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this);V.find(e).forEach((t=>{pt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),g(pt);var mt="top",gt="bottom",_t="right",bt="left",vt="auto",yt=[mt,gt,_t,bt],wt="start",Et="end",At="clippingParents",Tt="viewport",Ot="popper",Ct="reference",kt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+Et])}),[]),Lt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+Et])}),[]),xt="beforeRead",Dt="read",St="afterRead",Nt="beforeMain",It="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",Bt=[xt,Dt,St,Nt,It,Pt,jt,Mt,Ht];function Rt(t){return t?(t.nodeName||"").toLowerCase():null}function Wt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function $t(t){return t instanceof Wt(t).Element||t instanceof Element}function zt(t){return t instanceof Wt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Wt(t).ShadowRoot||t instanceof ShadowRoot)}const Ft={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Rt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Rt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Ut(t){return t.split("-")[0]}function Vt(t,e){var i=t.getBoundingClientRect();return{width:i.width/1,height:i.height/1,top:i.top/1,right:i.right/1,bottom:i.bottom/1,left:i.left/1,x:i.left/1,y:i.top/1}}function Kt(t){var e=Vt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Xt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Yt(t){return Wt(t).getComputedStyle(t)}function Qt(t){return["table","td","th"].indexOf(Rt(t))>=0}function Gt(t){return(($t(t)?t.ownerDocument:t.document)||window.document).documentElement}function Zt(t){return"html"===Rt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||Gt(t)}function Jt(t){return zt(t)&&"fixed"!==Yt(t).position?t.offsetParent:null}function te(t){for(var e=Wt(t),i=Jt(t);i&&Qt(i)&&"static"===Yt(i).position;)i=Jt(i);return i&&("html"===Rt(i)||"body"===Rt(i)&&"static"===Yt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Yt(t).position)return null;for(var i=Zt(t);zt(i)&&["html","body"].indexOf(Rt(i))<0;){var n=Yt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function ee(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var ie=Math.max,ne=Math.min,se=Math.round;function oe(t,e,i){return ie(t,ne(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Ut(i.placement),l=ee(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Kt(o),u="y"===l?mt:bt,f="y"===l?gt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=te(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=oe(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Xt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:se(se(e*n)/n)||0,y:se(se(i*n)/n)||0}}(r):"function"==typeof h?h(r):r,u=d.x,f=void 0===u?0:u,p=d.y,m=void 0===p?0:p,g=r.hasOwnProperty("x"),_=r.hasOwnProperty("y"),b=bt,v=mt,y=window;if(c){var w=te(i),E="clientHeight",A="clientWidth";w===Wt(i)&&"static"!==Yt(w=Gt(i)).position&&"absolute"===a&&(E="scrollHeight",A="scrollWidth"),w=w,s!==mt&&(s!==bt&&s!==_t||o!==Et)||(v=gt,m-=w[E]-n.height,m*=l?1:-1),s!==bt&&(s!==mt&&s!==gt||o!==Et)||(b=_t,f-=w[A]-n.width,f*=l?1:-1)}var T,O=Object.assign({position:a},c&&he);return l?Object.assign({},O,((T={})[v]=_?"0":"",T[b]=g?"0":"",T.transform=(y.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",T)):Object.assign({},O,((e={})[v]=_?m+"px":"",e[b]=g?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Ut(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Wt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var me={left:"right",right:"left",bottom:"top",top:"bottom"};function ge(t){return t.replace(/left|right|bottom|top/g,(function(t){return me[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Wt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Vt(Gt(t)).left+ve(t).scrollLeft}function we(t){var e=Yt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Rt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ee(Zt(t))}function Ae(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Wt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ae(Zt(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e){return e===Tt?Te(function(t){var e=Wt(t),i=Gt(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):zt(e)?function(t){var e=Vt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=Gt(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ie(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ie(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Yt(s||i).direction&&(a+=ie(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Gt(t)))}function Ce(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Ut(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case mt:e={x:a,y:i.y-n.height};break;case gt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?ee(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Et:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?At:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ot:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=re("number"!=typeof p?p:ae(p,yt)),g=h===Ot?Ct:Ot,_=t.rects.popper,b=t.elements[u?g:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ae(Zt(t)),i=["absolute","fixed"].indexOf(Yt(t).position)>=0&&zt(t)?te(t):t;return $t(i)?e.filter((function(t){return $t(t)&&Xt(t,i)&&"body"!==Rt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Oe(t,i);return e.top=ie(n.top,e.top),e.right=ne(n.right,e.right),e.bottom=ne(n.bottom,e.bottom),e.left=ie(n.left,e.left),e}),Oe(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}($t(b)?b:b.contextElement||Gt(t.elements.popper),r,l),y=Vt(t.elements.reference),w=Ce({reference:y,element:_,strategy:"absolute",placement:s}),E=Te(Object.assign({},_,w)),A=h===Ot?E:y,T={top:v.top-A.top+m.top,bottom:A.bottom-v.bottom+m.bottom,left:v.left-A.left+m.left,right:A.right-v.right+m.right},O=t.modifiersData.offset;if(h===Ot&&O){var C=O[s];Object.keys(T).forEach((function(t){var e=[_t,gt].indexOf(t)>=0?1:-1,i=[mt,gt].indexOf(t)>=0?"y":"x";T[t]+=C[i]*e}))}return T}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?Lt:l,h=ce(n),d=h?a?kt:kt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Ut(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const xe={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=Ut(g),b=l||(_!==g&&p?function(t){if(Ut(t)===vt)return[];var e=ge(t);return[be(t),e,be(e)]}(g):[ge(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(Ut(i)===vt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O<v.length;O++){var C=v[O],k=Ut(C),L=ce(C)===wt,x=[mt,gt].indexOf(k)>=0,D=x?"width":"height",S=ke(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),N=x?L?_t:bt:L?gt:mt;y[D]>w[D]&&(N=ge(N));var I=ge(N),P=[];if(o&&P.push(S[k]<=0),a&&P.push(S[N]<=0,S[I]<=0),P.every((function(t){return t}))){T=C,A=!1;break}E.set(C,P)}if(A)for(var j=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[mt,_t,gt,bt].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ie={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=Lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Ut(t),s=[bt,mt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Ce({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Ut(e.placement),b=ce(e.placement),v=!b,y=ee(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?mt:bt,L="y"===y?gt:_t,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],N=E[y]-g[L],I=f?-T[x]/2:0,P=b===wt?A[x]:T[x],j=b===wt?-T[x]:-A[x],M=e.elements.arrow,H=f&&M?Kt(M):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=B[k],W=B[L],$=oe(0,A[x],H[x]),z=v?A[x]/2-I-$-R-O:P-$-R-O,q=v?-A[x]/2+I+$+W+O:j+$+W+O,F=e.elements.arrow&&te(e.elements.arrow),U=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-U,X=E[y]+q-V;if(o){var Y=oe(f?ne(S,K):S,D,f?ie(N,X):N);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?mt:bt,G="x"===y?gt:_t,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=oe(f?ne(J,K):J,Z,f?ie(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n=zt(e);zt(e)&&function(t){var e=t.getBoundingClientRect();e.width,t.offsetWidth,e.height,t.offsetHeight}(e);var s,o,r=Gt(e),a=Vt(t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(n||!n&&!i)&&(("body"!==Rt(e)||we(r))&&(l=(s=e)!==Wt(s)&&zt(s)?{scrollLeft:(o=s).scrollLeft,scrollTop:o.scrollTop}:ve(s)),zt(e)?((c=Vt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=ye(r))),{x:a.left+l.scrollLeft-c.x,y:a.top+l.scrollTop-c.y,width:a.width,height:a.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Re(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function We(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?Be:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},Be,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:$t(t)?Ae(t):t.contextElement?Ae(t.contextElement):[],popper:Ae(e)};var r,c,u=function(t){var e=He(t);return Bt.reduce((function(t,i){return t.concat(e.filter((function(t){return t.phase===i})))}),[])}((r=[].concat(n,a.options.modifiers),c=r.reduce((function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=u.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}})),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(Re(e,i)){a.rects={reference:Me(e,te(i),"fixed"===a.options.strategy),popper:Kt(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise((function(t){h.forceUpdate(),t(a)}))},function(){return r||(r=new Promise((function(t){Promise.resolve().then((function(){r=void 0,t(s())}))}))),r}),destroy:function(){d(),c=!0}};if(!Re(t,e))return h;function d(){l.forEach((function(t){return t()})),l=[]}return h.setOptions(i).then((function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)})),h}}var $e=We(),ze=We({defaultModifiers:[pe,Pe,ue,Ft]}),qe=We({defaultModifiers:[pe,Pe,ue,Ft,Ie,xe,je,le,Ne]});const Fe=Object.freeze({__proto__:null,popperGenerator:We,detectOverflow:ke,createPopperBase:$e,createPopper:qe,createPopperLite:ze,top:mt,bottom:gt,right:_t,left:bt,auto:vt,basePlacements:yt,start:wt,end:Et,clippingParents:At,viewport:Tt,popper:Ot,reference:Ct,variationPlacements:kt,placements:Lt,beforeRead:xt,read:Dt,afterRead:St,beforeMain:Nt,main:It,afterMain:Pt,beforeWrite:jt,write:Mt,afterWrite:Ht,modifierPhases:Bt,applyStyles:Ft,arrow:le,computeStyles:ue,eventListeners:pe,flip:xe,hide:Ne,offset:Ie,popperOffsets:Pe,preventOverflow:je}),Ue="dropdown",Ve="Escape",Ke="Space",Xe="ArrowUp",Ye="ArrowDown",Qe=new RegExp("ArrowUp|ArrowDown|Escape"),Ge="click.bs.dropdown.data-api",Ze="keydown.bs.dropdown.data-api",Je="show",ti='[data-bs-toggle="dropdown"]',ei=".dropdown-menu",ii=m()?"top-end":"top-start",ni=m()?"top-start":"top-end",si=m()?"bottom-end":"bottom-start",oi=m()?"bottom-start":"bottom-end",ri=m()?"left-start":"right-start",ai=m()?"right-start":"left-start",li={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},ci={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class hi extends B{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar()}static get Default(){return li}static get DefaultType(){return ci}static get NAME(){return Ue}toggle(){return this._isShown()?this.hide():this.show()}show(){if(c(this._element)||this._isShown(this._menu))return;const t={relatedTarget:this._element};if(j.trigger(this._element,"show.bs.dropdown",t).defaultPrevented)return;const e=hi.getParentFromElement(this._element);this._inNavbar?U.setDataAttribute(this._menu,"popper","none"):this._createPopper(e),"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach((t=>j.on(t,"mouseover",d))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Je),this._element.classList.add(Je),j.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(c(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){j.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._popper&&this._popper.destroy(),this._menu.classList.remove(Je),this._element.classList.remove(Je),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},a(Ue,t,this.constructor.DefaultType),"object"==typeof t.reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===Fe)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:o(this._config.reference)?e=r(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=qe(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(Je)}_getMenuElement(){return V.next(this._element,ei)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ri;if(t.classList.contains("dropstart"))return ai;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ni:ii:e?oi:si}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(l);i.length&&v(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=V.find(ti);for(let i=0,n=e.length;i<n;i++){const n=hi.getInstance(e[i]);if(!n||!1===n._config.autoClose)continue;if(!n._isShown())continue;const s={relatedTarget:n._element};if(t){const e=t.composedPath(),i=e.includes(n._menu);if(e.includes(n._element)||"inside"===n._config.autoClose&&!i||"outside"===n._config.autoClose&&i)continue;if(n._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;"click"===t.type&&(s.clickEvent=t)}n._completeHide(s)}}static getParentFromElement(t){return n(t)||t.parentNode}static dataApiKeydownHandler(t){if(/input|textarea/i.test(t.target.tagName)?t.key===Ke||t.key!==Ve&&(t.key!==Ye&&t.key!==Xe||t.target.closest(ei)):!Qe.test(t.key))return;const e=this.classList.contains(Je);if(!e&&t.key===Ve)return;if(t.preventDefault(),t.stopPropagation(),c(this))return;const i=this.matches(ti)?this:V.prev(this,ti)[0],n=hi.getOrCreateInstance(i);if(t.key!==Ve)return t.key===Xe||t.key===Ye?(e||n.show(),void n._selectMenuItem(t)):void(e&&t.key!==Ke||hi.clearMenus());n.hide()}}j.on(document,Ze,ti,hi.dataApiKeydownHandler),j.on(document,Ze,ei,hi.dataApiKeydownHandler),j.on(document,Ge,hi.clearMenus),j.on(document,"keyup.bs.dropdown.data-api",hi.clearMenus),j.on(document,Ge,ti,(function(t){t.preventDefault(),hi.getOrCreateInstance(this).toggle()})),g(hi);const di=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",ui=".sticky-top";class fi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",(e=>e+t)),this._setElementAttributes(di,"paddingRight",(e=>e+t)),this._setElementAttributes(ui,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(s))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(di,"paddingRight"),this._resetElementAttributes(ui,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&U.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=U.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(U.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){o(t)?e(t):V.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const pi={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},mi={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},gi="show",_i="mousedown.bs.backdrop";class bi{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&u(this._getElement()),this._getElement().classList.add(gi),this._emulateAnimation((()=>{_(t)}))):_(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(gi),this._emulateAnimation((()=>{this.dispose(),_(t)}))):_(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...pi,..."object"==typeof t?t:{}}).rootElement=r(t.rootElement),a("backdrop",t,mi),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),j.on(this._getElement(),_i,(()=>{_(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&(j.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const vi={trapElement:null,autofocus:!0},yi={trapElement:"element",autofocus:"boolean"},wi=".bs.focustrap",Ei="backward";class Ai{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),j.off(document,wi),j.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),j.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,wi))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const n=V.focusableChildren(i);0===n.length?i.focus():this._lastTabNavDirection===Ei?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ei:"forward")}_getConfig(t){return t={...vi,..."object"==typeof t?t:{}},a("focustrap",t,yi),t}}const Ti="modal",Oi="Escape",Ci={backdrop:!0,keyboard:!0,focus:!0},ki={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},Li="hidden.bs.modal",xi="show.bs.modal",Di="resize.bs.modal",Si="click.dismiss.bs.modal",Ni="keydown.dismiss.bs.modal",Ii="mousedown.dismiss.bs.modal",Pi="modal-open",ji="show",Mi="modal-static";class Hi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new fi}static get Default(){return Ci}static get NAME(){return Ti}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(Pi),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),j.on(this._dialog,Ii,(()=>{j.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if(j.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(ji),j.off(this._element,Si),j.off(this._dialog,Ii),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>j.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_getConfig(t){return t={...Ci,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Ti,t,ki),t}_showElement(t){const e=this._isAnimated(),i=V.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||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,i&&(i.scrollTop=0),e&&u(this._element),this._element.classList.add(ji),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?j.on(this._element,Ni,(t=>{this._config.keyboard&&t.key===Oi?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Oi||this._triggerBackdropTransition()})):j.off(this._element,Ni)}_setResizeEvent(){this._isShown?j.on(window,Di,(()=>this._adjustDialog())):j.off(window,Di)}_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(Pi),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,Li)}))}_showBackdrop(t){j.on(this._element,Si,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains(Mi)||(n||(i.overflowY="hidden"),t.add(Mi),this._queueCallback((()=>{t.remove(Mi),n||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!m()||i&&!t&&m())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!m()||!i&&t&&m())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,xi,(t=>{t.defaultPrevented||j.one(e,Li,(()=>{l(this)&&this.focus()}))}));const i=V.findOne(".modal.show");i&&Hi.getInstance(i).hide(),Hi.getOrCreateInstance(e).toggle(this)})),R(Hi),g(Hi);const Bi="offcanvas",Ri={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},$i="show",zi=".offcanvas.show",qi="hidden.bs.offcanvas";class Fi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return Bi}static get Default(){return Ri}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($i),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),j.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove($i),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new fi).reset(),j.trigger(this._element,qi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...Ri,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Bi,t,Wi),t}_initializeBackDrop(){return new bi({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_addEventListeners(){j.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;j.one(e,qi,(()=>{l(this)&&this.focus()}));const i=V.findOne(zi);i&&i!==e&&Fi.getInstance(i).hide(),Fi.getOrCreateInstance(e).toggle(this)})),j.on(window,"load.bs.offcanvas.data-api",(()=>V.find(zi).forEach((t=>Fi.getOrCreateInstance(t).show())))),R(Fi),g(Fi);const Ui=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ki=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Xi=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!Ui.has(i)||Boolean(Vi.test(t.nodeValue)||Ki.test(t.nodeValue));const n=e.filter((t=>t instanceof RegExp));for(let t=0,e=n.length;t<e;t++)if(n[t].test(i))return!0;return!1};function Yi(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(let t=0,i=s.length;t<i;t++){const i=s[t],n=i.nodeName.toLowerCase();if(!Object.keys(e).includes(n)){i.remove();continue}const o=[].concat(...i.attributes),r=[].concat(e["*"]||[],e[n]||[]);o.forEach((t=>{Xi(t,r)||i.removeAttribute(t.nodeName)}))}return n.body.innerHTML}const Qi="tooltip",Gi=new Set(["sanitize","allowList","sanitizeFn"]),Zi={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Ji={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},tn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],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:[]},popperConfig:null},en={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},nn="fade",sn="show",on="show",rn="out",an=".tooltip-inner",ln=".modal",cn="hide.bs.modal",hn="hover",dn="focus";class un extends B{constructor(t,e){if(void 0===Fe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return tn}static get NAME(){return Qi}static get Event(){return en}static get DefaultType(){return Zi}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(sn))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ln),cn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.Event.SHOW),e=h(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(an).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),s=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this._config.animation&&n.classList.add(nn);const o="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,r=this._getAttachment(o);this._addAttachmentClass(r);const{container:a}=this._config;H.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(a.append(n),j.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=qe(this._element,n,this._getPopperConfig(r)),n.classList.add(sn);const l=this._resolvePossibleFunction(this._config.customClass);l&&n.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{j.on(t,"mouseover",d)}));const c=this.tip.classList.contains(nn);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,j.trigger(this._element,this.constructor.Event.SHOWN),t===rn&&this._leave(null,this)}),this.tip,c)}hide(){if(!this._popper)return;const t=this.getTipElement();if(j.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(sn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(nn);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==on&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(nn,sn),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),an)}_sanitizeAndSetContent(t,e,i){const n=V.findOne(i,t);e||!n?this.setElementContent(n,e):n.remove()}setElementContent(t,e){if(null!==t)return o(e)?(e=r(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Yi(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,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:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return Ji[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)j.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===hn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===hn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;j.on(this._element,e,this._config.selector,(t=>this._enter(t))),j.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ln),cn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?dn:hn]=!0),e.getTipElement().classList.contains(sn)||e._hoverState===on?e._hoverState=on:(clearTimeout(e._timeout),e._hoverState=on,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===on&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?dn:hn]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=rn,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===rn&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Gi.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a(Qi,t,this.constructor.DefaultType),t.sanitize&&(t.template=Yi(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn={...un.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'},pn={...un.DefaultType,content:"(string|element|function)"},mn={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class gn extends un{static get Default(){return fn}static get NAME(){return"popover"}static get Event(){return mn}static get DefaultType(){return pn}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=gn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(gn);const _n="scrollspy",bn={offset:10,method:"auto",target:""},vn={offset:"number",method:"string",target:"(string|element)"},yn="active",wn=".nav-link, .list-group-item, .dropdown-item",En="position";class An extends B{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,j.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return bn}static get NAME(){return _n}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":En,e="auto"===this._config.method?t:this._config.method,n=e===En?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),V.find(wn,this._config.target).map((t=>{const s=i(t),o=s?V.findOne(s):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[U[e](o).top+n,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){j.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...bn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=r(t.target)||document.documentElement,a(_n,t,vn),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t<this._offsets[e+1])&&this._activate(this._targets[e])}}_activate(t){this._activeTarget=t,this._clear();const e=wn.split(",").map((e=>`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=V.findOne(e.join(","),this._config.target);i.classList.add(yn),i.classList.contains("dropdown-item")?V.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(yn):V.parents(i,".nav, .list-group").forEach((t=>{V.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(yn))),V.prev(t,".nav-item").forEach((t=>{V.children(t,".nav-link").forEach((t=>t.classList.add(yn)))}))})),j.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){V.find(wn,this._config.target).filter((t=>t.classList.contains(yn))).forEach((t=>t.classList.remove(yn)))}static jQueryInterface(t){return this.each((function(){const e=An.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,"load.bs.scrollspy.data-api",(()=>{V.find('[data-bs-spy="scroll"]').forEach((t=>new An(t)))})),g(An);const Tn="active",On="fade",Cn="show",kn=".active",Ln=":scope > li > .active";class xn extends B{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Tn))return;let t;const e=n(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?Ln:kn;t=V.find(e,i),t=t[t.length-1]}const s=t?j.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(j.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const o=()=>{j.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),j.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?V.children(e,kn):V.find(Ln,e))[0],s=i&&n&&n.classList.contains(On),o=()=>this._transitionComplete(t,n,i);n&&s?(n.classList.remove(Cn),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Tn);const t=V.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Tn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Tn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),u(t),t.classList.contains(On)&&t.classList.add(Cn);let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&V.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Tn))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||xn.getOrCreateInstance(this).show()})),g(xn);const Dn="toast",Sn="hide",Nn="show",In="showing",Pn={animation:"boolean",autohide:"boolean",delay:"number"},jn={animation:!0,autohide:!0,delay:5e3};class Mn extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Pn}static get Default(){return jn}static get NAME(){return Dn}show(){j.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Sn),u(this._element),this._element.classList.add(Nn),this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.remove(In),j.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(Nn)&&(j.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.add(Sn),this._element.classList.remove(In),this._element.classList.remove(Nn),j.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(Nn)&&this._element.classList.remove(Nn),super.dispose()}_getConfig(t){return t={...jn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},a(Dn,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),j.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Mn),g(Mn),{Alert:W,Button:z,Carousel:st,Collapse:pt,Dropdown:hi,Modal:Hi,Offcanvas:Fi,Popover:gn,ScrollSpy:An,Tab:xn,Toast:Mn,Tooltip:un}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/pagetop/static/bootsier/js/bootstrap.bundle.min.js.map b/pagetop/static/bootsier/js/bootstrap.bundle.min.js.map deleted file mode 100644 index 7d78e32a..00000000 --- a/pagetop/static/bootsier/js/bootstrap.bundle.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["TRANSITION_END","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","document","querySelector","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","querySelectorAll","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","static","getInstance","VERSION","Error","enableDismissTrigger","component","method","clickEvent","tagName","closest","getOrCreateInstance","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","position","offsetTop","offsetLeft","SelectorEngine","find","concat","Element","prototype","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","EVENT_SLID","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE_ITEM","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","hasPointerPenTouch","pointerType","start","clientX","touches","move","end","clearTimeout","itemImg","add","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElem","_selector","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activesData","actives","container","tempActiveData","elemActive","dimension","_getDimension","style","scrollSize","triggerArrayLength","selected","triggerArray","isOpen","bottom","right","auto","basePlacements","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","styles","assign","effect","_ref2","initialStyles","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","includeScale","width","height","x","y","getLayoutRect","clientRect","offsetWidth","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","userAgent","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","round","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","_ref3","dpr","devicePixelRatio","roundOffsetsByDPR","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","computeStyles$1","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","scrollTop","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","visualViewport","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","html","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_min","_max","_preventedOffset","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","_len","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref3$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ESCAPE_KEY","SPACE_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","REGEXP_KEYDOWN","EVENT_CLICK_DATA_API","EVENT_KEYDOWN_DATA_API","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","isDisplayStatic","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","items","toggles","context","composedPath","isMenuTarget","isActive","stopPropagation","getToggleButton","clearMenus","dataApiKeydownHandler","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","styleProp","scrollbarWidth","_applyManipulationCallback","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","className","rootElement","clickCallback","EVENT_MOUSEDOWN","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","trapElement","autofocus","TAB_NAV_BACKWARD","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","EVENT_HIDDEN","EVENT_SHOW","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","_triggerBackdropTransition","_resetAdjustments","currentTarget","isModalOverflowing","isBodyOverflowing","paddingLeft","paddingRight","showEvent","allReadyOpen","OPEN_SELECTOR","Offcanvas","visibility","blur","uriAttributes","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","regExp","attributeRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","DISALLOWED_ATTRIBUTES","animation","template","title","delay","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","CLASS_NAME_FADE","HOVER_STATE_SHOW","HOVER_STATE_OUT","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","_disposePopper","isWithContent","shadowRoot","isInTheDom","getTitle","tipId","prefix","floor","random","getElementById","getUID","attachment","_getAttachment","_addAttachmentClass","_resolvePossibleFunction","prevHoverState","_cleanTipClass","setContent","_sanitizeAndSetContent","content","templateElement","setElementContent","textContent","updateAttachment","_getDelegateConfig","_handlePopperPlacementChange","_getBasicClassPrefix","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","basicClassPrefixRegex","tabClass","token","tClass","Popover","_getContent","SELECTOR_LINK_ITEMS","METHOD_POSITION","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","listGroup","navItem","spy","SELECTOR_ACTIVE","SELECTOR_ACTIVE_UL","Tab","listElement","itemSelector","hideEvent","complete","active","isTransitioning","_transitionComplete","dropdownChild","dropdownElement","dropdown","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.3'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + window.pageYOffset,\n left: rect.left + window.pageXOffset\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const hasPointerPenTouch = event => {\n return this._pointerEvent &&\n (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n const start = event => {\n if (hasPointerPenTouch(event)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (hasPointerPenTouch(event)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: null\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let actives = []\n let activesData\n\n if (this._config.parent) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives.length) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !this._isShown(elem)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n })\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","// import { isHTMLElement } from './instanceOf';\nexport default function getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars\nincludeScale) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n var rect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1; // FIXME:\n // `offsetWidth` returns an integer while `getBoundingClientRect`\n // returns a float. This results in `scaleX` or `scaleY` being\n // non-1 when it should be for elements that aren't a full pixel in\n // width or height.\n // if (isHTMLElement(element) && includeScale) {\n // const offsetHeight = element.offsetHeight;\n // const offsetWidth = element.offsetWidth;\n // // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n // // Fallback to 1 in case both values are `0`\n // if (offsetWidth > 0) {\n // scaleX = rect.width / offsetWidth || 1;\n // }\n // if (offsetHeight > 0) {\n // scaleY = rect.height / offsetHeight || 1;\n // }\n // }\n\n return {\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n top: rect.top / scaleY,\n right: rect.right / scaleX,\n bottom: rect.bottom / scaleY,\n left: rect.left / scaleX,\n x: rect.left / scaleX,\n y: rect.top / scaleY\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport default function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport within from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(round(x * dpr) / dpr) || 0,\n y: round(round(y * dpr) / dpr) || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets;\n\n var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n _ref3$x = _ref3.x,\n x = _ref3$x === void 0 ? 0 : _ref3$x,\n _ref3$y = _ref3.y,\n y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom; // $FlowFixMe[prop-missing]\n\n y -= offsetParent[heightProp] - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right; // $FlowFixMe[prop-missing]\n\n x -= offsetParent[widthProp] - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n var state = _ref4.state,\n options = _ref4.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport within from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { max as mathMax, min as mathMin } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis || checkAltAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n if (checkMainAxis) {\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(tether ? mathMin(_min, tetherMin) : _min, _offset, tether ? mathMax(_max, tetherMax) : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = rect.width / element.offsetWidth || 1;\n var scaleY = rect.height / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n this._createPopper(parent)\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper(parent) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._isShown()) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (event.key === ESCAPE_KEY) {\n instance.hide()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n instance.show()\n }\n\n instance._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n className: 'modal-backdrop',\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n className: 'string',\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.append(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n trapElement: null, // The element to trap focus inside of\n autofocus: true\n}\n\nconst DefaultType = {\n trapElement: 'element',\n autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n activate() {\n const { trapElement, autofocus } = this._config\n\n if (this._isActive) {\n return\n }\n\n if (autofocus) {\n trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n\n _handleFocusin(event) {\n const { target } = event\n const { trapElement } = this._config\n\n if (target === document || target === trapElement || trapElement.contains(target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking moddal toggler while another one is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen) {\n Modal.getInstance(allReadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n if (!this._config.scroll) {\n this._focustrap.activate()\n }\n\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attributeName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i]\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n attributeList.forEach(attribute => {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n // This will be removed later in favor of a `setContent` method\n if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n this._disposePopper()\n this.tip.remove()\n this.tip = null\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = this._resolvePossibleFunction(this._config.customClass)\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n this._disposePopper()\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n const tip = element.children[0]\n this.setContent(tip)\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n this.tip = tip\n return this.tip\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n }\n\n _sanitizeAndSetContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!content && templateElement) {\n templateElement.remove()\n return\n }\n\n // we use append for html objects to maintain js events\n this.setElementContent(templateElement, content)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.append(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n return this._resolvePossibleFunction(title)\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(content) {\n return typeof content === 'function' ? content.call(this._element) : content\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n }\n\n // Private\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n\n // Handle special case when .nav-link is inside .nav-item\n SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)\n .forEach(navItem => {\n SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n })\n })\n }\n\n EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n SelectorEngine.find(SELECTOR_DATA_SPY)\n .forEach(spy => new ScrollSpy(spy))\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n reflow\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_UL = ':scope > li > .active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n if ((this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n this._element.classList.contains(CLASS_NAME_ACTIVE))) {\n return\n }\n\n let previous\n const target = getElementFromSelector(this._element)\n const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE\n previous = SelectorEngine.find(itemSelector, listElement)\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = previous ?\n EventHandler.trigger(previous, EVENT_HIDE, {\n relatedTarget: this._element\n }) :\n null\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget: previous\n })\n\n if (showEvent.defaultPrevented || (hideEvent !== null && hideEvent.defaultPrevented)) {\n return\n }\n\n this._activate(this._element, listElement)\n\n const complete = () => {\n EventHandler.trigger(previous, EVENT_HIDDEN, {\n relatedTarget: this._element\n })\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget: previous\n })\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?\n SelectorEngine.find(SELECTOR_ACTIVE_UL, container) :\n SelectorEngine.children(container, SELECTOR_ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && active.classList.contains(CLASS_NAME_FADE))\n\n const complete = () => this._transitionComplete(element, active, callback)\n\n if (active && isTransitioning) {\n active.classList.remove(CLASS_NAME_SHOW)\n this._queueCallback(complete, element, true)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n active.classList.remove(CLASS_NAME_ACTIVE)\n\n const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode)\n\n if (dropdownChild) {\n dropdownChild.classList.remove(CLASS_NAME_ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n\n reflow(element)\n\n if (element.classList.contains(CLASS_NAME_FADE)) {\n element.classList.add(CLASS_NAME_SHOW)\n }\n\n let parent = element.parentNode\n if (parent && parent.nodeName === 'LI') {\n parent = parent.parentNode\n }\n\n if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n const dropdownElement = element.closest(SELECTOR_DROPDOWN)\n\n if (dropdownElement) {\n SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)\n .forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE))\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const data = Tab.getOrCreateInstance(this)\n data.show()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tab to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING)\n this._element.classList.remove(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n return config\n }\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout':\n this._hasMouseInteraction = isInteracting\n break\n case 'focusin':\n case 'focusout':\n this._hasKeyboardInteraction = isInteracting\n break\n default:\n break\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\nenableDismissTrigger(Toast)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Toast to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert'\nimport Button from './src/button'\nimport Carousel from './src/carousel'\nimport Collapse from './src/collapse'\nimport Dropdown from './src/dropdown'\nimport Modal from './src/modal'\nimport Offcanvas from './src/offcanvas'\nimport Popover from './src/popover'\nimport ScrollSpy from './src/scrollspy'\nimport Tab from './src/tab'\nimport Toast from './src/toast'\nimport Tooltip from './src/tooltip'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"]} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma-rtl.min.css b/pagetop/static/bulmix/css/bulma-rtl.min.css deleted file mode 100644 index 65f54069..00000000 --- a/pagetop/static/bulmix/css/bulma-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-right:calc(-.5em - 1px);margin-left:.25em}.button .icon:last-child:not(:first-child){margin-right:.25em;margin-left:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:#00d1b2;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:#485fc7;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:#3e8ed0;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:#48c78e;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:#ffe08a;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:#f14668;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-left:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-left:-1px}.buttons.has-addons .button:last-child{margin-left:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.button.is-responsive.is-small{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-right:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-right:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-right:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-right:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-left:.25em}.icon-text .icon:not(:first-child){margin-right:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 1.5rem 1.25rem 2.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{left:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-left:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-left:0}.tags.has-addons .tag:not(:first-child){margin-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.tags.has-addons .tag:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-right:.25rem;margin-left:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-right:-.375em;margin-left:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-right:.1875em;margin-left:-.375em}.tag:not(body) .icon:first-child:last-child{margin-right:-.375em;margin-left:-.375em}.tag:not(body).is-delete{margin-right:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-right:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;left:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-right:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-left:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a!important;opacity:.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;left:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-left:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-left:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-left:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-left:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-left:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;left:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-right:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-left:.5em}.breadcrumb .icon:last-child{margin-right:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-left:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;right:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-left:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-left:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-left:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-left:1rem}.media-right{margin-right:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-right:1px solid #dbdbdb;margin:.75em;padding-right:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-right:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;left:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-left:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-right:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-left:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;left:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-left:auto}.navbar-end{justify-content:flex-end;margin-right:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;right:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-left:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-right:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-left:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link.is-disabled,.pagination-link[disabled],.pagination-next.is-disabled,.pagination-next[disabled],.pagination-previous.is-disabled,.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-left:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-left:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-left:.5em}.tabs .icon:last-child{margin-right:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:0 0 4px 4px}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-right:-1px}.tabs.is-toggle li:first-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li:last-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-right:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-right:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-right:50%}.columns.is-mobile>.column.is-offset-one-third{margin-right:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-right:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-right:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-right:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-right:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-right:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-right:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-right:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-right:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-right:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-right:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-right:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-right:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-right:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-right:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-right:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-right:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-right:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-right:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-right:75%}.column.is-offset-two-thirds-mobile{margin-right:66.6666%}.column.is-offset-half-mobile{margin-right:50%}.column.is-offset-one-third-mobile{margin-right:33.3333%}.column.is-offset-one-quarter-mobile{margin-right:25%}.column.is-offset-one-fifth-mobile{margin-right:20%}.column.is-offset-two-fifths-mobile{margin-right:40%}.column.is-offset-three-fifths-mobile{margin-right:60%}.column.is-offset-four-fifths-mobile{margin-right:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-right:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-right:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-right:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-right:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-right:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-right:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-right:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-right:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-right:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-right:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-right:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-right:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-right:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-right:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-right:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-right:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-right:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-right:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-right:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-right:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-right:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-right:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-right:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-right:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-right:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-right:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-right:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-right:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-right:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-right:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-right:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-right:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-right:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-right:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-right:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-right:75%}.column.is-offset-two-thirds-touch{margin-right:66.6666%}.column.is-offset-half-touch{margin-right:50%}.column.is-offset-one-third-touch{margin-right:33.3333%}.column.is-offset-one-quarter-touch{margin-right:25%}.column.is-offset-one-fifth-touch{margin-right:20%}.column.is-offset-two-fifths-touch{margin-right:40%}.column.is-offset-three-fifths-touch{margin-right:60%}.column.is-offset-four-fifths-touch{margin-right:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-right:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-right:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-right:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-right:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-right:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-right:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-right:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-right:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-right:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-right:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-right:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-right:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-right:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-right:75%}.column.is-offset-two-thirds-desktop{margin-right:66.6666%}.column.is-offset-half-desktop{margin-right:50%}.column.is-offset-one-third-desktop{margin-right:33.3333%}.column.is-offset-one-quarter-desktop{margin-right:25%}.column.is-offset-one-fifth-desktop{margin-right:20%}.column.is-offset-two-fifths-desktop{margin-right:40%}.column.is-offset-three-fifths-desktop{margin-right:60%}.column.is-offset-four-fifths-desktop{margin-right:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-right:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-right:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-right:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-right:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-right:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-right:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-right:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-right:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-right:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-right:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-right:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-right:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-right:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-right:75%}.column.is-offset-two-thirds-widescreen{margin-right:66.6666%}.column.is-offset-half-widescreen{margin-right:50%}.column.is-offset-one-third-widescreen{margin-right:33.3333%}.column.is-offset-one-quarter-widescreen{margin-right:25%}.column.is-offset-one-fifth-widescreen{margin-right:20%}.column.is-offset-two-fifths-widescreen{margin-right:40%}.column.is-offset-three-fifths-widescreen{margin-right:60%}.column.is-offset-four-fifths-widescreen{margin-right:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-right:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-right:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-right:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-right:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-right:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-right:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-right:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-right:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-right:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-right:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-right:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-right:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-right:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-right:75%}.column.is-offset-two-thirds-fullhd{margin-right:66.6666%}.column.is-offset-half-fullhd{margin-right:50%}.column.is-offset-one-third-fullhd{margin-right:33.3333%}.column.is-offset-one-quarter-fullhd{margin-right:25%}.column.is-offset-one-fifth-fullhd{margin-right:20%}.column.is-offset-two-fifths-fullhd{margin-right:40%}.column.is-offset-three-fifths-fullhd{margin-right:60%}.column.is-offset-four-fifths-fullhd{margin-right:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-right:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-right:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-right:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-right:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-right:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-right:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-right:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-right:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-right:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-right:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-right:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-right:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-right:100%}}.columns{margin-right:-.75rem;margin-left:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-right:0;margin-left:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-right:calc(-1 * var(--columnGap));margin-left:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-left:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma-rtl.min.css.map b/pagetop/static/bulmix/css/bulma-rtl.min.css.map deleted file mode 100644 index 726415ee..00000000 --- a/pagetop/static/bulmix/css/bulma-rtl.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma-rtl.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EHvDE,iCAAiC;EGyDjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTyDgB;ESxDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AS/ZA;EAGE,uBVhD6B;EUiD7B,qBVtD4B;EUuD5B,iBX5DwB;EW6DxB,cV5D4B;EU6D5B,eAAe;EAGf,uBAAuB;EACvB,iCA7D6D;EA8D7D,iBA7D6B;EA8D7B,kBA9D6B;EA+D7B,8BAhE6D;EAiE7D,kBAAkB;EAClB,mBAAmB;AT8ZrB;;AS9aA;EAkBI,cAAc;ATgalB;;ASlbA;EAwBM,aAAa;EACb,YAAY;AT8ZlB;;ASvbA;ERsHI,gCQ3FsG;ER2FtG,mBQ1FmE;ATgavE;;AS5bA;ERsHI,oBQxFmE;ERwFnE,+BQvFsG;ATka1G;;ASjcA;EAiCM,+BAAiF;EACjF,gCAAkF;AToaxF;;AStcA;EAsCI,qBVzF0B;EU0F1B,cV7F0B;ACigB9B;;AS3cA;EA0CI,qBVhF8B;EUiF9B,cVjG0B;ACsgB9B;;AShdA;EA6CM,iDVnF4B;AC0flC;;ASpdA;EAgDI,qBVrG0B;EUsG1B,cVvG0B;AC+gB9B;;ASzdA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV3G0B;EU4G1B,0BA1F8B;ATmgBlC;;ASheA;EA4DM,4BV3GwB;EU4GxB,cVnHwB;AC2hB9B;;ASreA;EAgEM,yBChB2B;EDiB3B,cVvHwB;ACgiB9B;;AS1eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT2atB;;ASjfA;EAwEI,gBAvG0B;EAwG1B,yBAvGmC;EAwGnC,cVhH8B;EUiH9B,qBAvG0B;ATohB9B;;ASxfA;EA8EM,cVpH4B;EUqH5B,0BAzGmC;ATuhBzC;;AS7fA;EAoFM,uBVjIyB;EUkIzB,yBAAyB;EACzB,cVhJuB;AC6jB7B;;ASngBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,cVrJqB;ACmkB7B;;ASzgBA;EA8FQ,yBAAyB;EACzB,cVzJqB;ACwkB7B;;AS9gBA;EAiGU,mDV9IqB;AC+jB/B;;ASlhBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,cVhKqB;ACklB7B;;ASxhBA;;EAyGQ,uBVtJuB;EUuJvB,mBVvJuB;EUwJvB,gBAAgB;ATobxB;;AS/hBA;EA6GQ,yBVvKqB;EUwKrB,YV3JuB;ACilB/B;;ASpiBA;EAiHU,uBCjEuB;AVwfjC;;ASxiBA;;EAoHU,yBV9KmB;EU+KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVpKqB;AC6lB/B;;AShjBA;EA0HU,gEAA4E;AT0btF;;ASpjBA;EA4HQ,6BAA6B;EAC7B,mBV1KuB;EU2KvB,YV3KuB;ACumB/B;;AS1jBA;EAmIU,uBVhLqB;EUiLrB,mBVjLqB;EUkLrB,cV/LmB;AC0nB7B;;AShkBA;EAwIY,4DAA8D;AT4b1E;;ASpkBA;EA8Ic,gEAA4E;AT0b1F;;ASxkBA;;EAiJU,6BAA6B;EAC7B,mBV/LqB;EUgMrB,gBAAgB;EAChB,YVjMqB;AC6nB/B;;AShlBA;EAsJQ,6BAA6B;EAC7B,qBVjNqB;EUkNrB,cVlNqB;ACgpB7B;;AStlBA;EA6JU,yBVvNmB;EUwNnB,YV3MqB;ACwoB/B;;AS3lBA;EAqKc,4DAA8D;AT0b5E;;AS/lBA;;EAwKU,6BAA6B;EAC7B,qBVnOmB;EUoOnB,gBAAgB;EAChB,cVrOmB;ACiqB7B;;ASvmBA;EAoFM,yBV9IuB;EU+IvB,yBAAyB;EACzB,YVnIyB;AC0pB/B;;AS7mBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,YVxIuB;ACgqB/B;;ASnnBA;EA8FQ,yBAAyB;EACzB,YV5IuB;ACqqB/B;;ASxnBA;EAiGU,gDV3JmB;ACsrB7B;;AS5nBA;EAoGQ,uBCpDyB;EDqDzB,yBAAyB;EACzB,YVnJuB;AC+qB/B;;ASloBA;;EAyGQ,yBVnKqB;EUoKrB,qBVpKqB;EUqKrB,gBAAgB;AT8hBxB;;ASzoBA;EA6GQ,uBV1JuB;EU2JvB,cVxKqB;ACwsB7B;;AS9oBA;EAiHU,yBCjEuB;AVkmBjC;;ASlpBA;;EAoHU,uBVjKqB;EUkKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVjLmB;ACotB7B;;AS1pBA;EA0HU,4DAA4E;AToiBtF;;AS9pBA;EA4HQ,6BAA6B;EAC7B,qBVvLqB;EUwLrB,cVxLqB;AC8tB7B;;ASpqBA;EAmIU,yBV7LmB;EU8LnB,qBV9LmB;EU+LnB,YVlLqB;ACutB/B;;AS1qBA;EAwIY,gEAA8D;ATsiB1E;;AS9qBA;EA8Ic,4DAA4E;AToiB1F;;ASlrBA;;EAiJU,6BAA6B;EAC7B,qBV5MmB;EU6MnB,gBAAgB;EAChB,cV9MmB;ACovB7B;;AS1rBA;EAsJQ,6BAA6B;EAC7B,mBVpMuB;EUqMvB,YVrMuB;AC6uB/B;;AShsBA;EA6JU,uBV1MqB;EU2MrB,cVxNmB;AC+vB7B;;ASrsBA;EAqKc,gEAA8D;AToiB5E;;ASzsBA;;EAwKU,6BAA6B;EAC7B,mBVtNqB;EUuNrB,gBAAgB;EAChB,YVxNqB;AC8vB/B;;ASjtBA;EAoFM,4BVnIwB;EUoIxB,yBAAyB;EACzB,yBClEe;AVmsBrB;;ASvtBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVysBrB;;AS7tBA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV8sBrB;;ASluBA;EAiGU,mDVhJoB;ACqxB9B;;AStuBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVwtBrB;;AS5uBA;;EAyGQ,4BVxJsB;EUyJtB,wBVzJsB;EU0JtB,gBAAgB;ATwoBxB;;ASnvBA;EA6GQ,oCCzFa;ED0Fb,iBV7JsB;ACuyB9B;;ASxvBA;EAiHU,oCCjEuB;AV4sBjC;;AS5vBA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVtKoB;ACmzB9B;;ASpwBA;EA0HU,sFAA4E;AT8oBtF;;ASxwBA;EA4HQ,6BAA6B;EAC7B,wBV5KsB;EU6KtB,iBV7KsB;AC6zB9B;;AS9wBA;EAmIU,4BVlLoB;EUmLpB,wBVnLoB;EUoLpB,yBCjHW;AVgwBrB;;ASpxBA;EAwIY,sEAA8D;ATgpB1E;;ASxxBA;EA8Ic,sFAA4E;AT8oB1F;;AS5xBA;;EAiJU,6BAA6B;EAC7B,wBVjMoB;EUkMpB,gBAAgB;EAChB,iBVnMoB;ACm1B9B;;ASpyBA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVsxBrB;;AS1yBA;EA6JU,oCCzIW;ED0IX,iBV7MoB;AC81B9B;;AS/yBA;EAqKc,sEAA8D;AT8oB5E;;ASnzBA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVuyBrB;;AS3zBA;EAoFM,yBV1IwB;EU2IxB,yBAAyB;EACzB,WChEU;AV2yBhB;;ASj0BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVizBhB;;ASv0BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVszBhB;;AS50BA;EAiGU,gDVvJoB;ACs4B9B;;ASh1BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVg0BhB;;ASt1BA;;EAyGQ,yBV/JsB;EUgKtB,qBVhKsB;EUiKtB,gBAAgB;ATkvBxB;;AS71BA;EA6GQ,sBCvFQ;EDwFR,cVpKsB;ACw5B9B;;ASl2BA;EAiHU,yBCjEuB;AVszBjC;;ASt2BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7KoB;ACo6B9B;;AS92BA;EA0HU,0DAA4E;ATwvBtF;;ASl3BA;EA4HQ,6BAA6B;EAC7B,qBVnLsB;EUoLtB,cVpLsB;AC86B9B;;ASx3BA;EAmIU,yBVzLoB;EU0LpB,qBV1LoB;EU2LpB,WC/GM;AVw2BhB;;AS93BA;EAwIY,gEAA8D;AT0vB1E;;ASl4BA;EA8Ic,0DAA4E;ATwvB1F;;ASt4BA;;EAiJU,6BAA6B;EAC7B,qBVxMoB;EUyMpB,gBAAgB;EAChB,cV1MoB;ACo8B9B;;AS94BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV83BhB;;ASp5BA;EA6JU,sBCvIM;EDwIN,cVpNoB;AC+8B9B;;ASz5BA;EAqKc,gEAA8D;ATwvB5E;;AS75BA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+4BhB;;ASr6BA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WChEU;AVq5BhB;;AS36BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV25BhB;;ASj7BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVg6BhB;;ASt7BA;EAiGU,iDVzIwB;ACk+BlC;;AS17BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV06BhB;;ASh8BA;;EAyGQ,yBVjJ0B;EUkJ1B,qBVlJ0B;EUmJ1B,gBAAgB;AT41BxB;;ASv8BA;EA6GQ,sBCvFQ;EDwFR,cVtJ0B;ACo/BlC;;AS58BA;EAiHU,yBCjEuB;AVg6BjC;;ASh9BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACggClC;;ASx9BA;EA0HU,0DAA4E;ATk2BtF;;AS59BA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC0gClC;;ASl+BA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC/GM;AVk9BhB;;ASx+BA;EAwIY,gEAA8D;ATo2B1E;;AS5+BA;EA8Ic,0DAA4E;ATk2B1F;;ASh/BA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACgiClC;;ASx/BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVw+BhB;;AS9/BA;EA6JU,sBCvIM;EDwIN,cVtMwB;AC2iClC;;ASngCA;EAqKc,gEAA8D;ATk2B5E;;ASvgCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVy/BhB;;AS/gCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV++BrE;;ASphCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVq/BrE;;AS1hCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV2/BrE;;AShiCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WChEU;AVghChB;;AStiCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVshChB;;AS5iCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AV2hChB;;ASjjCA;EAiGU,iDVvIwB;AC2lClC;;ASrjCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVqiChB;;AS3jCA;;EAyGQ,yBV/I0B;EUgJ1B,qBVhJ0B;EUiJ1B,gBAAgB;ATu9BxB;;ASlkCA;EA6GQ,sBCvFQ;EDwFR,cVpJ0B;AC6mClC;;ASvkCA;EAiHU,yBCjEuB;AV2hCjC;;AS3kCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACynClC;;ASnlCA;EA0HU,0DAA4E;AT69BtF;;ASvlCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;ACmoClC;;AS7lCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC/GM;AV6kChB;;ASnmCA;EAwIY,gEAA8D;AT+9B1E;;ASvmCA;EA8Ic,0DAA4E;AT69B1F;;AS3mCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACypClC;;ASnnCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVmmChB;;ASznCA;EA6JU,sBCvIM;EDwIN,cVpMwB;ACoqClC;;AS9nCA;EAqKc,gEAA8D;AT69B5E;;ASloCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVonChB;;AS1oCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV0mCrE;;AS/oCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVgnCrE;;ASrpCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVsnCrE;;AS3pCA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WChEU;AV2oChB;;ASjqCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVipChB;;ASvqCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVspChB;;AS5qCA;EAiGU,kDVxIwB;ACutClC;;AShrCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVgqChB;;AStrCA;;EAyGQ,yBVhJ0B;EUiJ1B,qBVjJ0B;EUkJ1B,gBAAgB;ATklCxB;;AS7rCA;EA6GQ,sBCvFQ;EDwFR,cVrJ0B;ACyuClC;;ASlsCA;EAiHU,yBCjEuB;AVspCjC;;AStsCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACqvClC;;AS9sCA;EA0HU,0DAA4E;ATwlCtF;;ASltCA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC+vClC;;ASxtCA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC/GM;AVwsChB;;AS9tCA;EAwIY,gEAA8D;AT0lC1E;;ASluCA;EA8Ic,0DAA4E;ATwlC1F;;AStuCA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACqxClC;;AS9uCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV8tChB;;ASpvCA;EA6JU,sBCvIM;EDwIN,cVrMwB;ACgyClC;;ASzvCA;EAqKc,gEAA8D;ATwlC5E;;AS7vCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+uChB;;ASrwCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVquCrE;;AS1wCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV2uCrE;;AShxCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVivCrE;;AStxCA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,WChEU;AVswChB;;AS5xCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV4wChB;;ASlyCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVixChB;;ASvyCA;EAiGU,kDV1IwB;ACo1ClC;;AS3yCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV2xChB;;ASjzCA;;EAyGQ,yBVlJ0B;EUmJ1B,qBVnJ0B;EUoJ1B,gBAAgB;AT6sCxB;;ASxzCA;EA6GQ,sBCvFQ;EDwFR,cVvJ0B;ACs2ClC;;AS7zCA;EAiHU,yBCjEuB;AVixCjC;;ASj0CA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;ACk3ClC;;ASz0CA;EA0HU,0DAA4E;ATmtCtF;;AS70CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;AC43ClC;;ASn1CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,WC/GM;AVm0ChB;;ASz1CA;EAwIY,gEAA8D;ATqtC1E;;AS71CA;EA8Ic,0DAA4E;ATmtC1F;;ASj2CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;ACk5ClC;;ASz2CA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVy1ChB;;AS/2CA;EA6JU,sBCvIM;EDwIN,cVvMwB;AC65ClC;;ASp3CA;EAqKc,gEAA8D;ATmtC5E;;ASx3CA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV02ChB;;ASh4CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVg2CrE;;ASr4CA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVs2CrE;;AS34CA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV42CrE;;ASj5CA;EAoFM,yBV9H4B;EU+H5B,yBAAyB;EACzB,yBClEe;AVm4CrB;;ASv5CA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVy4CrB;;AS75CA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV84CrB;;ASl6CA;EAiGU,mDV3IwB;ACg9ClC;;ASt6CA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVw5CrB;;AS56CA;;EAyGQ,yBVnJ0B;EUoJ1B,qBVpJ0B;EUqJ1B,gBAAgB;ATw0CxB;;ASn7CA;EA6GQ,oCCzFa;ED0Fb,cVxJ0B;ACk+ClC;;ASx7CA;EAiHU,oCCjEuB;AV44CjC;;AS57CA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,cVjKwB;AC8+ClC;;ASp8CA;EA0HU,sFAA4E;AT80CtF;;ASx8CA;EA4HQ,6BAA6B;EAC7B,qBVvK0B;EUwK1B,cVxK0B;ACw/ClC;;AS98CA;EAmIU,yBV7KwB;EU8KxB,qBV9KwB;EU+KxB,yBCjHW;AVg8CrB;;ASp9CA;EAwIY,gEAA8D;ATg1C1E;;ASx9CA;EA8Ic,sFAA4E;AT80C1F;;AS59CA;;EAiJU,6BAA6B;EAC7B,qBV5LwB;EU6LxB,gBAAgB;EAChB,cV9LwB;AC8gDlC;;ASp+CA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVs9CrB;;AS1+CA;EA6JU,oCCzIW;ED0IX,cVxMwB;ACyhDlC;;AS/+CA;EAqKc,gEAA8D;AT80C5E;;ASn/CA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVu+CrB;;AS3/CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV29CrE;;AShgDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVi+CrE;;AStgDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVu+CrE;;AS5gDA;EAoFM,yBVxH2B;EUyH3B,yBAAyB;EACzB,WChEU;AV4/ChB;;ASlhDA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVkgDhB;;ASxhDA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVugDhB;;AS7hDA;EAiGU,kDVrIuB;ACqkDjC;;ASjiDA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVihDhB;;ASviDA;;EAyGQ,yBV7IyB;EU8IzB,qBV9IyB;EU+IzB,gBAAgB;ATm8CxB;;AS9iDA;EA6GQ,sBCvFQ;EDwFR,cVlJyB;ACulDjC;;ASnjDA;EAiHU,yBCjEuB;AVugDjC;;ASvjDA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV3JuB;ACmmDjC;;AS/jDA;EA0HU,0DAA4E;ATy8CtF;;ASnkDA;EA4HQ,6BAA6B;EAC7B,qBVjKyB;EUkKzB,cVlKyB;AC6mDjC;;ASzkDA;EAmIU,yBVvKuB;EUwKvB,qBVxKuB;EUyKvB,WC/GM;AVyjDhB;;AS/kDA;EAwIY,gEAA8D;AT28C1E;;ASnlDA;EA8Ic,0DAA4E;ATy8C1F;;ASvlDA;;EAiJU,6BAA6B;EAC7B,qBVtLuB;EUuLvB,gBAAgB;EAChB,cVxLuB;ACmoDjC;;AS/lDA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV+kDhB;;ASrmDA;EA6JU,sBCvIM;EDwIN,cVlMuB;AC8oDjC;;AS1mDA;EAqKc,gEAA8D;ATy8C5E;;AS9mDA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVgmDhB;;AStnDA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVslDrE;;AS3nDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV4lDrE;;ASjoDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVkmDrE;;ASvoDA;EARE,kBVdc;ACiqDhB;;ASrpDE;EACE,kBVkBc;ACsoDlB;;AS/oDA;EANE,eVjBW;AC0qDb;;ASnpDA;EAJE,kBVpBc;AC+qDhB;;ASvpDA;EAFE,iBVvBa;ACorDf;;AS3pDA;;EAyMI,uBVtP2B;EUuP3B,qBV5P0B;EU6P1B,gBAjOyB;EAkOzB,YAjOyB;ATwrD7B;;ASnqDA;EA8MI,aAAa;EACb,WAAW;ATy9Cf;;ASxqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT29CxB;;AS7qDA;ERnDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQmQhC,6BAA6B;AT89CnC;;ASprDA;EAwNI,4BVvQ0B;EUwQ1B,qBV3Q0B;EU4Q1B,cV9Q0B;EU+Q1B,gBAAgB;EAChB,oBAAoB;ATg+CxB;;AS5rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATk+C/D;;ASh+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATm+C7B;;ASv+CA;EAMI,qBAAqB;ATq+CzB;;AS3+CA;ER5GI,mBQoHwC;ATu+C5C;;AS/+CA;EAUI,sBAAsB;ATy+C1B;;ASn/CA;EAYI,mBAAmB;AT2+CvB;;ASv/CA;EA1OE,kBVdc;ACmvDhB;;ASvuDE;EACE,kBVkBc;ACwtDlB;;AS//CA;EAtOE,kBVpBc;AC6vDhB;;ASngDA;EApOE,iBVvBa;ACkwDf;;ASvgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATi/CjC;;AS5gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ER1I9B,iBQ2IwC;ATm/C5C;;ASlhDA;ER5GI,cQ6IqC;ATq/CzC;;ASthDA;EAoCQ,UAAU;ATs/ClB;;AS1hDA;EA0CQ,UAAU;ATo/ClB;;AS9hDA;EA4CU,UAAU;ATs/CpB;;ASliDA;EA8CQ,YAAY;EACZ,cAAc;ATw/CtB;;ASviDA;EAiDI,uBAAuB;AT0/C3B;;AS3iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT2/C7B;;AShjDA;EAuDI,yBAAyB;AT6/C7B;;ASpjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT8/C7B;;ACzvDE;EQiQM;IACE,oBAlTyD;ET8yDjE;ES1/CM;;IAEE,qBAtT0F;ETkzDlG;ESjgDM;IACE,kBV1TM;EC6zDd;ESpgDM;IACE,eV3TG;ECi0DX;AACF;;ACrwDE;EQ6PM;IACE,qBAlTyL;ET8zDjM;ES1gDM;;IAEE,kBV9TM;EC00Dd;ESjhDM;IACE,eV3TG;EC80DX;ESphDM;IACE,kBV5TM;ECk1Dd;AACF;;AWl3DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WAAW;AXq3Db;;AWz3DA;EAMI,0BAA0B;EAC1B,kBZyCM;EYxCN,mBZwCM;EYvCN,WAAW;AXu3Df;;AC/wDE;EUjHF;IAWI,gBAAuC;EX03DzC;AACF;;AC3wDI;EU3HJ;IAcM,iBAAqE;EX63DzE;AACF;;AClwDI;EU1IJ;IAiBM,iBAAiE;EXg4DrE;AACF;;AClxDI;EUhIJ;IAoBM,iBAAqE;EXm4DzE;AACF;;ACzwDI;EU/IJ;IAuBM,iBAAiE;EXs4DrE;AACF;;AY34DA;EAII,kBAAkB;AZ24DtB;;AY/4DA;;;;;;;EAcM,kBAhC2B;AZ26DjC;;AYz5DA;;;;;;EAqBI,cbvC0B;EawC1B,gBbHiB;EaIjB,kBA3C+B;AZw7DnC;;AYp6DA;EAyBI,cAAc;EACd,oBAAoB;AZ+4DxB;;AYz6DA;EA4BM,eAAe;AZi5DrB;;AY76DA;EA8BI,iBAAiB;EACjB,uBAAuB;AZm5D3B;;AYl7DA;EAiCM,oBAAoB;AZq5D1B;;AYt7DA;EAmCI,gBAAgB;EAChB,uBAAuB;AZu5D3B;;AY37DA;EAsCM,oBAAoB;AZy5D1B;;AY/7DA;EAwCI,iBAAiB;EACjB,oBAAoB;AZ25DxB;;AYp8DA;EA2CI,kBAAkB;EAClB,uBAAuB;AZ65D3B;;AYz8DA;EA8CI,cAAc;EACd,kBAAkB;AZ+5DtB;;AY98DA;EAiDI,4Bb5D0B;EEqK1B,+BFxK0B;EaiE1B,qBAjEqC;AZk+DzC;;AYp9DA;EAqDI,4BAA4B;EXqG5B,iBWpGmC;EACnC,eAAe;AZm6DnB;;AY19DA;EAyDM,wBAAwB;AZq6D9B;;AY99DA;EA2DQ,4BAA4B;AZu6DpC;;AYl+DA;EA6DQ,4BAA4B;AZy6DpC;;AYt+DA;EA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kBI,uBAAuB;AfyyE3B;;Ae3zEA;Ed+KI,Yc3J4B;EAC5B,kBAAkB;EAClB,WAAW;Af2yEf;;Aej0EA;;;EA0BI,mBAAmB;Af6yEvB;;Aev0EA;EAgCM,uBhB5ByB;EgB6BzB,chB1CuB;ACq1E7B;;Ae50EA;EAgCM,yBhBzCuB;EgB0CvB,YhB7ByB;AC60E/B;;Aej1EA;EAgCM,4BhB9BwB;EgB+BxB,yBLoCe;AVixErB;;Aet1EA;EAgCM,yBhBrCwB;EgBsCxB,WLsCU;AVoxEhB;;Ae31EA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyxEhB;;Aeh2EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV+wErE;;Aer2EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmyEhB;;Ae12EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVyxErE;;Ae/2EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6yEhB;;Aep3EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVmyErE;;Aez3EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuzEhB;;Ae93EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV6yErE;;Aen4EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVm0ErB;;Aex4EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVuzErE;;Ae74EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV20EhB;;Ael5EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVi0ErE;;AgBx5EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjByDqB;EiBxDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB05Eb;;AgBp6EA;EAYI,yBjBX2B;ACu6E/B;;AgBx6EA;EAcI,yBjBjB0B;AC+6E9B;;AgB56EA;EAgBI,yBjBnB0B;ACm7E9B;;AgBh7EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk6EhB;;AgBr7EA;EAyBQ,uBjBpBuB;ACo7E/B;;AgBz7EA;EA2BQ,uBjBtBuB;ACw7E/B;;AgB77EA;EA6BQ,uBjBxBuB;AC47E/B;;AgBj8EA;EA+BQ,mEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjBjCqB;ACi9E7B;;AgBz8EA;EA2BQ,yBjBnCqB;ACq9E7B;;AgB78EA;EA6BQ,yBjBrCqB;ACy9E7B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,4BjBtBsB;ACs9E9B;;AgBz9EA;EA2BQ,4BjBxBsB;AC09E9B;;AgB79EA;EA6BQ,4BjB1BsB;AC89E9B;;AgBj+EA;EA+BQ,wEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjB7BsB;AC6+E9B;;AgBz+EA;EA2BQ,yBjB/BsB;ACi/E9B;;AgB7+EA;EA6BQ,yBjBjCsB;ACq/E9B;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBf0B;AC++ElC;;AgBz/EA;EA2BQ,yBjBjB0B;ACm/ElC;;AgB7/EA;EA6BQ,yBjBnB0B;ACu/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBb0B;AC6/ElC;;AgBzgFA;EA2BQ,yBjBf0B;ACigFlC;;AgB7gFA;EA6BQ,yBjBjB0B;ACqgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBd0B;AC8gFlC;;AgBzhFA;EA2BQ,yBjBhB0B;ACkhFlC;;AgB7hFA;EA6BQ,yBjBlB0B;ACshFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBhB0B;ACgiFlC;;AgBziFA;EA2BQ,yBjBlB0B;ACoiFlC;;AgB7iFA;EA6BQ,yBjBpB0B;ACwiFlC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAyBQ,yBjBjB0B;ACijFlC;;AgBzjFA;EA2BQ,yBjBnB0B;ACqjFlC;;AgB7jFA;EA6BQ,yBjBrB0B;ACyjFlC;;AgBjkFA;EA+BQ,qEAA2F;AhBsiFnG;;AgBrkFA;EAyBQ,yBjBXyB;AC2jFjC;;AgBzkFA;EA2BQ,yBjBbyB;AC+jFjC;;AgB7kFA;EA6BQ,yBjBfyB;ACmkFjC;;AgBjlFA;EA+BQ,qEAA2F;AhBsjFnG;;AgBrlFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBujF9B;;AgBjmFA;EA4CM,6BAA6B;AhByjFnC;;AgBrmFA;EA8CM,6BAA6B;AhB2jFnC;;AgBzmFA;EAgDM,oBAAoB;AhB6jF1B;;AgB7mFA;EAoDI,ejBxBY;ACqlFhB;;AgBjnFA;EAsDI,ejB5BY;AC2lFhB;;AgBrnFA;EAwDI,cjB/BW;ACgmFf;;AgB/jFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AgBxkFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AiB9mFA;EAEE,uBlBjB6B;EkBkB7B,clB3B4B;AC2oF9B;;AiBnnFA;;EAMI,yBlB1B0B;EkB2B1B,qBA/B6B;EAgC7B,qBA/B6B;EAgC7B,mBAAmB;AjBknFvB;;AiB3nFA;;EAeQ,uBlB9BuB;EkB+BvB,mBlB/BuB;EkBgCvB,clB7CqB;AC8pF7B;;AiBloFA;;EAeQ,yBlB3CqB;EkB4CrB,qBlB5CqB;EkB6CrB,YlBhCuB;ACwpF/B;;AiBzoFA;;EAeQ,4BlBhCsB;EkBiCtB,wBlBjCsB;EkBkCtB,yBPiCa;AV8lFrB;;AiBhpFA;;EAeQ,yBlBvCsB;EkBwCtB,qBlBxCsB;EkByCtB,WPmCQ;AVmmFhB;;AiBvpFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPmCQ;AV0mFhB;;AiB9pFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPmCQ;AVinFhB;;AiBrqFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPmCQ;AVwnFhB;;AiB5qFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,WPmCQ;AV+nFhB;;AiBnrFA;;EAeQ,yBlB3B0B;EkB4B1B,qBlB5B0B;EkB6B1B,yBPiCa;AVwoFrB;;AiB1rFA;;EAeQ,yBlBrByB;EkBsBzB,qBlBtByB;EkBuBzB,WPmCQ;AV6oFhB;;AiBjsFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBkrFf;;AiBvsFA;;EAuBM,yBlBjC4B;EkBkC5B,WP4BU;AVypFhB;;AiB7sFA;;;;EA2BQ,mBAAmB;AjByrF3B;;AiBptFA;;EA6BM,sBAAsB;AjB4rF5B;;AiBztFA;EA+BI,clBvD0B;ACqvF9B;;AiB7tFA;EAiCM,gBAtDsB;AjBsvF5B;;AiBjuFA;EAoCM,yBlB9C4B;EkB+C5B,WPeU;AVkrFhB;;AiBtuFA;;EAwCQ,mBAAmB;AjBmsF3B;;AiB3uFA;;EA2CQ,kBPSQ;EORR,mBAAmB;AjBqsF3B;;AiBjvFA;EA8CI,6BA5DqC;AjBmwFzC;;AiBrvFA;;EAiDM,qBApEgC;EAqEhC,clB1EwB;ACmxF9B;;AiB3vFA;EAoDI,6BAhEqC;AjB2wFzC;;AiB/vFA;;EAuDM,qBAxEgC;EAyEhC,clBhFwB;AC6xF9B;;AiBrwFA;EA0DI,6BAvEqC;AjBsxFzC;;AiBzwFA;;EA+DU,sBAAsB;AjB+sFhC;;AiB9wFA;;EAoEM,iBAAiB;AjB+sFvB;;AiBnxFA;;EAyEU,wBAAwB;AjB+sFlC;;AiBxxFA;EA2EI,WAAW;AjBitFf;;AiB5xFA;EAgFU,yBlBhGoB;ACgzF9B;;AiBhyFA;EAqFY,yBlBrGkB;ACozF9B;;AiBpyFA;EAuFc,4BlBxGgB;ACyzF9B;;AiBxyFA;;EA2FM,qBAAqB;AjBktF3B;;AiB7yFA;EAgGU,yBlBhHoB;ACi0F9B;;AiB/sFA;EhB7DE,iCAAiC;EgBgEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBitFjB;;AkB70FA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBg1F7B;;AkBp1FA;EAMI,qBAAqB;AlBk1FzB;;AkBx1FA;EjByKI,mBiBjKwC;AlBo1F5C;;AkB51FA;EAUI,sBAAsB;AlBs1F1B;;AkBh2FA;EAYI,mBAAmB;AlBw1FvB;;AkBp2FA;EAgBM,enBYO;AC40Fb;;AkBx2FA;EAmBM,kBnBQU;ACi1FhB;;AkB52FA;EAqBI,uBAAuB;AlB21F3B;;AkBh3FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB61F1B;;AkBr3FA;EA0BI,yBAAyB;AlB+1F7B;;AkBz3FA;EA6BQ,mBAAmB;AlBg2F3B;;AkB73FA;EA+BQ,eAAe;AlBk2FvB;;AkBj4FA;EjByKI,ciBvImC;AlBm2FvC;;AkBr4FA;EjByKI,eiBrIqC;EAK/B,0BAA0B;EAC1B,6BAA6B;AlBi2FvC;;AkB34FA;EAgDU,yBAAyB;EACzB,4BAA4B;AlB+1FtC;;AkB71FA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBOU;EmBNV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg2FrB;;AkB52FA;EjBsHI,qBiBxGuC;EjBwGvC,sBiBvGyC;AlBk2F7C;;AkBj3FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg7F7B;;AkBt3FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw6F/B;;AkB33FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV42FrB;;AkBh4FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+2FhB;;AkBr4FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo3FhB;;AkB14FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV02FrE;;AkB/4FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV83FhB;;AkBp5FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVo3FrE;;AkBz5FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw4FhB;;AkB95FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV83FrE;;AkBn6FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk5FhB;;AkBx6FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVw4FrE;;AkB76FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV85FrB;;AkBl7FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVk5FrE;;AkBv7FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs6FhB;;AkB57FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV45FrE;;AkBj8FA;EAgCI,kBnBtDY;AC29FhB;;AkBr8FA;EAkCI,enBzDS;ACg+Fb;;AkBz8FA;EAoCI,kBnB5DY;ACq+FhB;;AkB78FA;EjBsHI,sBiB/E0C;EjB+E1C,qBiB9E0C;AlB06F9C;;AkBl9FA;EjBsHI,sBiB5E0C;EjB4E1C,qBiB3E0C;AlB46F9C;;AkBv9FA;EjBsHI,sBiBzE0C;EjByE1C,qBiBxE0C;AlB86F9C;;AkB59FA;EjBsHI,iBiB7KmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+6Fd;;AkBn+FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg7FrC;;AkB9+FA;EAgEM,WAAW;EACX,UAAU;AlBk7FhB;;AkBn/FA;EAmEM,WAAW;EACX,UAAU;AlBo7FhB;;AkBx/FA;EAuEM,yBAAmD;AlBq7FzD;;AkB5/FA;EAyEM,yBAAoD;AlBu7F1D;;AkBhgGA;EA2EI,qBnB/DmB;ACw/FvB;;AkBv7FA;EAEI,0BAA0B;AlBy7F9B;;AmB/iGA;;EAGE,sBAAsB;AnBijGxB;;AmBpjGA;;;;EAMI,oBAAoB;AnBqjGxB;;AmB3jGA;;EAQI,iBApBmB;AnB4kGvB;;AmBhkGA;;EAUI,iBArBmB;AnBglGvB;;AmBrkGA;;EAYI,sBAAsB;AnB8jG1B;;AmB5jGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgmGzB;;AmBnkGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmmG7B;;AmBxkGA;EAWI,oBA3B+B;AnB4lGnC;;AmB5kGA;EAgBM,epBnBO;ACmlGb;;AmBhlGA;EAgBM,iBpBlBS;ACslGf;;AmBplGA;EAgBM,epBjBO;ACylGb;;AmBxlGA;EAgBM,iBpBhBS;AC4lGf;;AmB5lGA;EAgBM,kBpBfU;AC+lGhB;;AmBhmGA;EAgBM,epBdO;ACkmGb;;AmBpmGA;EAgBM,kBpBbU;ACqmGhB;;AmBtlGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkoG3B;;AmB7lGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4mGrB;;AmBlmGA;EAWI,oBA7C+B;AnBwoGnC;;AmBtmGA;EAgBM,epBrCO;AC+nGb;;AmB1mGA;EAgBM,iBpBpCS;ACkoGf;;AmB9mGA;EAgBM,epBnCO;ACqoGb;;AmBlnGA;EAgBM,iBpBlCS;ACwoGf;;AmBtnGA;EAgBM,kBpBjCU;AC2oGhB;;AmB1nGA;EAgBM,epBhCO;AC8oGb;;AmB9nGA;EAgBM,kBpB/BU;ACipGhB;;AoB/qGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkrG3B;;AoB7qGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBmDqB;EqBlDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgrGrB;;AqB9sGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBkCU;EuBjCV,cvB/B4B;ACgtG9B;;AC9oGI;EqBjCA,4BvBjC0B;ACotG9B;;AClpGI;EqBjCA,4BvBjC0B;ACwtG9B;;ACtpGI;EqBjCA,4BvBjC0B;AC4tG9B;;AC1pGI;EqBjCA,4BvBjC0B;ACguG9B;;AsB9rGE;EAEE,qBvBjC0B;ACiuG9B;;AsB/rGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACytGlC;;AsB9rGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACkvG9B;;AClrGI;;;;;EqBhBE,+BvBhDwB;AC0vG9B;;AC1rGI;;;;;EqBhBE,+BvBhDwB;ACkwG9B;;AClsGI;;;;;EqBhBE,+BvBhDwB;AC0wG9B;;AC1sGI;;;;;EqBhBE,+BvBhDwB;ACkxG9B;;AuBpxGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsxGb;;AuBrxGE;EACE,gBAAgB;AvBwxGpB;;AuBpxGI;EACE,mBxBFyB;ACyxG/B;;AuBxxGK;EAMG,mDxBPuB;AC6xG/B;;AuB5xGI;EACE,qBxBfuB;AC8yG7B;;AuBhyGK;EAMG,gDxBpBqB;ACkzG7B;;AuBpyGI;EACE,wBxBJwB;AC2yG9B;;AuBxyGK;EAMG,mDxBTsB;AC+yG9B;;AuB5yGI;EACE,qBxBXwB;AC0zG9B;;AuBhzGK;EAMG,gDxBhBsB;AC8zG9B;;AuBpzGI;EACE,qBxBG4B;ACozGlC;;AuBxzGK;EAMG,iDxBF0B;ACwzGlC;;AuB5zGI;EACE,qBxBK4B;AC0zGlC;;AuBh0GK;EAMG,iDxBA0B;AC8zGlC;;AuBp0GI;EACE,qBxBI4B;ACm0GlC;;AuBx0GK;EAMG,kDxBD0B;ACu0GlC;;AuB50GI;EACE,qBxBE4B;AC60GlC;;AuBh1GK;EAMG,kDxBH0B;ACi1GlC;;AuBp1GI;EACE,qBxBC4B;ACs1GlC;;AuBx1GK;EAMG,mDxBJ0B;AC01GlC;;AuB51GI;EACE,qBxBO2B;ACw1GjC;;AuBh2GK;EAMG,kDxBEyB;AC41GjC;;AuB51GE;EzBmBA,kBC0BgB;EDzBhB,kBCNc;ACm1GhB;;AuB/1GE;EzBoBA,kBCVc;ACy1GhB;;AuBj2GE;EzBoBA,iBCba;AC81Gf;;AuBl2GE;EACE,cAAc;EACd,WAAW;AvBq2Gf;;AuBp2GE;EACE,eAAe;EACf,WAAW;AvBu2Gf;;AuBr2GA;EAGI,qBxB+BmB;EwB9BnB,gDAA4D;EAC5D,iDAA6D;AvBs2GjE;;AuB32GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw2GpB;;AuBt2GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw2GlB;;AuB92GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo6GzB;;AuBn3GA;EAWI,eAAe;AvB42GnB;;AuBv3GA;EAcI,YAAY;AvB62GhB;;AwB96GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi7GpB;;AwBh7GE;EACE,eAAe;AxBm7GnB;;AwBl7GE;EACE,czBF0B;ACu7G9B;;AwBp7GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy7GvB;;AwBp7GA;EvBgKI,mBuB7JqC;AxBq7GzC;;AyBx8GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB28GrB;;AyB/8GA;EAMI,a3BDkB;AE88GtB;;AyBn9GA;EAUM,qB1BU4B;EEoK9B,awB7K+B;EAC7B,UAAU;AzB68GhB;;AyBz9GA;EAeM,qB1BuDiB;EE0GnB,kBwBhKsC;AzB88G1C;;AyB99GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+8GjB;;AyBt+GA;EAyBM,aAAa;AzBi9GnB;;AyB1+GA;;EA4BM,wB1BjBwB;ACo+G9B;;AyB/+GA;ExBgLI,mBwBlJwC;AzBq9G5C;;AyBn/GA;EAgCM,YAAY;EACZ,UAAU;AzBu9GhB;;AyBx/GA;EAmCQ,kBAAkB;AzBy9G1B;;AyB5/GA;EAuCM,qB1BnCwB;AC4/G9B;;AyBhgHA;EA6CQ,mB1BhCuB;ACu/G/B;;AyBpgHA;EA+CQ,mB1BlCuB;AC2/G/B;;AyBxgHA;EAkDU,qBfwDuB;AVk6GjC;;AyB5gHA;EAuDU,mD1B1CqB;ACmgH/B;;AyBhhHA;EA6CQ,qB1B7CqB;ACohH7B;;AyBphHA;EA+CQ,qB1B/CqB;ACwhH7B;;AyBxhHA;EAkDU,mBfwDuB;AVk7GjC;;AyB5hHA;EAuDU,gD1BvDmB;ACgiH7B;;AyBhiHA;EA6CQ,wB1BlCsB;ACyhH9B;;AyBpiHA;EA+CQ,wB1BpCsB;AC6hH9B;;AyBxiHA;EAkDU,qBfwDuB;AVk8GjC;;AyB5iHA;EAuDU,mD1B5CoB;ACqiH9B;;AyBhjHA;EA6CQ,qB1BzCsB;ACgjH9B;;AyBpjHA;EA+CQ,qB1B3CsB;ACojH9B;;AyBxjHA;EAkDU,qBfwDuB;AVk9GjC;;AyB5jHA;EAuDU,gD1BnDoB;AC4jH9B;;AyBhkHA;EA6CQ,qB1B3B0B;ACkjHlC;;AyBpkHA;EA+CQ,qB1B7B0B;ACsjHlC;;AyBxkHA;EAkDU,qBfwDuB;AVk+GjC;;AyB5kHA;EAuDU,iD1BrCwB;AC8jHlC;;AyBhlHA;EA6CQ,qB1BzB0B;ACgkHlC;;AyBplHA;EA+CQ,qB1B3B0B;ACokHlC;;AyBxlHA;EAkDU,qBfwDuB;AVk/GjC;;AyB5lHA;EAuDU,iD1BnCwB;AC4kHlC;;AyBhmHA;EA6CQ,qB1B1B0B;ACilHlC;;AyBpmHA;EA+CQ,qB1B5B0B;ACqlHlC;;AyBxmHA;EAkDU,qBfwDuB;AVkgHjC;;AyB5mHA;EAuDU,kD1BpCwB;AC6lHlC;;AyBhnHA;EA6CQ,qB1B5B0B;ACmmHlC;;AyBpnHA;EA+CQ,qB1B9B0B;ACumHlC;;AyBxnHA;EAkDU,qBfwDuB;AVkhHjC;;AyB5nHA;EAuDU,kD1BtCwB;AC+mHlC;;AyBhoHA;EA6CQ,qB1B7B0B;AConHlC;;AyBpoHA;EA+CQ,qB1B/B0B;ACwnHlC;;AyBxoHA;EAkDU,qBfwDuB;AVkiHjC;;AyB5oHA;EAuDU,mD1BvCwB;ACgoHlC;;AyBhpHA;EA6CQ,qB1BvByB;AC8nHjC;;AyBppHA;EA+CQ,qB1BzByB;ACkoHjC;;AyBxpHA;EAkDU,qBfwDuB;AVkjHjC;;AyB5pHA;EAuDU,kD1BjCuB;AC0oHjC;;AyBhqHA;E3ByCE,kBC0BgB;EDzBhB,kBCNc;ACioHhB;;AyBrqHA;E3B4CE,kBCVc;ACuoHhB;;AyBzqHA;E3B8CE,iBCba;AC4oHf;;AyB7qHA;EAkEM,gCAA8C;EAC9C,YAAY;AzB+mHlB;;AyBlrHA;EAqEI,WAAW;AzBinHf;;AyBtrHA;EAuEM,WAAW;AzBmnHjB;;AyB1rHA;EA2EM,aAAa;EACb,kBAAkB;ExB4GpB,awB3G+B;EAC7B,YAAY;EACZ,eAAe;AzBmnHrB;;AyBlsHA;EAiFM,kB1B7CU;ACkqHhB;;AyBtsHA;EAmFM,kB1BjDU;ACwqHhB;;AyB1sHA;EAqFM,iB1BpDS;AC6qHf;;A0BjsHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BmsHpB;;A0BxsHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC2tH7B;;A0B9sHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,c3BjCmB;ACiuH7B;;A0BptHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACuuH7B;;A0B1tHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,c3B7CmB;AC6uH7B;;A0BhuHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACsuH/B;;A0BtuHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,Y3BpBqB;AC4uH/B;;A0B5uHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACkvH/B;;A0BlvHA;EA8BU,uBhB+DuB;EgB9DvB,yBAAyB;EACzB,Y3BhCqB;ACwvH/B;;A0BxvHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV6rHrB;;A0B9vHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVmsHrB;;A0BpwHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVysHrB;;A0B1wHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+sHrB;;A0BhxHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVmtHhB;;A0BtxHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVytHhB;;A0B5xHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV+tHhB;;A0BlyHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVquHhB;;A0BxyHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV2uHhB;;A0B9yHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVivHhB;;A0BpzHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVuvHhB;;A0B1zHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6vHhB;;A0Bh0HA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVmwHhB;;A0Bt0HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVywHhB;;A0B50HA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV+wHhB;;A0Bl1HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVqxHhB;;A0Bx1HA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV2xHhB;;A0B91HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AViyHhB;;A0Bp2HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVuyHhB;;A0B12HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6yHhB;;A0Bh3HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVmzHhB;;A0Bt3HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVyzHhB;;A0B53HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV+zHhB;;A0Bl4HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq0HhB;;A0Bx4HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV60HrB;;A0B94HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVm1HrB;;A0Bp5HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVy1HrB;;A0B15HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+1HrB;;A0Bh6HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVm2HhB;;A0Bt6HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVy2HhB;;A0B56HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV+2HhB;;A0Bl7HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq3HhB;;A0Bx7HA;EAmCI,kB3BZY;ACq6HhB;;A0B57HA;EAqCI,e3BfS;AC06Hb;;A0Bh8HA;EAuCI,kB3BlBY;AC+6HhB;;A0Bp8HA;EA0CQ,eAAe;A1B85HvB;;A0Bx8HA;EA4CI,iB3BxBW;ACw7Hf;;A0B58HA;EA+CQ,eAAe;A1Bi6HvB;;A0Bh9HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bi6HhC;;A0Br9HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bm6H/B;;A0B19HA;EA0DQ,kB3BHI;ACu6HZ;;A0B99HA;EA4DQ,aAAa;A1Bs6HrB;;A0Bl+HA;EA+DM,sBAAsB;A1Bu6H5B;;A0Bt+HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1By6HtB;;A0B5+HA;EAqEM,uBAAuB;A1B26H7B;;A0Bh/HA;EAuEM,aAAa;EACb,YAAY;A1B66HlB;;A0Br/HA;EA0EQ,eAAe;A1B+6HvB;;A0Bz/HA;EA6EQ,eAAe;A1Bg7HvB;;A0B7/HA;EAgFQ,eAAe;A1Bi7HvB;;A0BjgIA;EAmFQ,eAAe;A1Bk7HvB;;A0BrgIA;EAsFQ,0BAA4C;A1Bm7HpD;;A0BzgIA;EAwFQ,0B3BjCI;E2BkCJ,uBAAuB;A1Bq7H/B;;A0B9gIA;EA2FI,uBAAuB;A1Bu7H3B;;A0BlhIA;EA8FM,WAAW;A1Bw7HjB;;A0BthIA;EAgGM,YAAY;EACZ,eAAe;A1B07HrB;;A0B3hIA;EAmGI,yBAAyB;A1B47H7B;;A0B/hIA;EAqGM,0BAA4C;A1B87HlD;;A0BniIA;EAuGM,0B3BhDM;E2BiDN,2BAA2B;EAC3B,SAAS;A1Bg8Hf;;A0B97HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bi8HpB;;A0Bv8HA;EASM,yBhBvB2B;EgBwB3B,c3B9HwB;ACgkI9B;;A0B58HA;EAYM,qBhB1B2B;AV89HjC;;A0Bh9HA;EAeM,yBhB7B2B;EgB8B3B,c3BpIwB;ACykI9B;;A0Br9HA;EAkBM,qBhBhC2B;AVu+HjC;;A0Br8HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bw8Hb;;A0Bt8HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BrFU;E2BsFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bw8HrB;;A0Bt8HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACqmI9B;;A0Bv8HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1B08HzB;;A0Bx8HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBDrB,kByBEmC;EACrC,UAAU;A1B28HZ;;A0Bj9HA;EAQI,eAAe;A1B68HnB;;A2B7nIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC+lIjB;;A2BpoIA;EAMI,oBAAoB;A3BkoIxB;;A2BxoIA;EASI,kB5BsBY;AC6mIhB;;A2B5oIA;EAWI,kB5BkBY;ACmnIhB;;A2BhpIA;EAaI,iB5BeW;ACwnIf;;A2BroIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BwoIrB;;A2B3oIA;EAOM,Y5BdyB;ACspI/B;;A2B/oIA;EAOM,c5B3BuB;ACuqI7B;;A2BnpIA;EAOM,iB5BhBwB;ACgqI9B;;A2BvpIA;EAOM,c5BvBwB;AC2qI9B;;A2B3pIA;EAOM,c5BT4B;ACiqIlC;;A2B/pIA;EAOM,c5BP4B;ACmqIlC;;A2BnqIA;EAOM,c5BR4B;ACwqIlC;;A2BvqIA;EAOM,c5BV4B;AC8qIlC;;A2B3qIA;EAOM,c5BX4B;ACmrIlC;;A2B/qIA;EAOM,c5BL2B;ACirIjC;;A2BxqIA;EAEI,sBAAsB;A3B0qI1B;;A2B5qIA;EAKI,aAAa;EACb,2BAA2B;A3B2qI/B;;A2BjrIA;E1BiJI,iB0BxIwC;A3B4qI5C;;A2BrrIA;;;EAcU,gBAAgB;A3B6qI1B;;A2B3rIA;;;EAuBY,4BAA4B;EAC5B,yBAAyB;A3B0qIrC;;A2BlsIA;;;EAiCY,6BAA6B;EAC7B,0BAA0B;A3BuqItC;;A2BzsIA;;;;;EAyCY,UAAU;A3BwqItB;;A2BjtIA;;;;;;;;;EA8CY,UAAU;A3B+qItB;;A2B7tIA;;;;;;;;;EAgDc,UAAU;A3ByrIxB;;A2BzuIA;EAkDQ,YAAY;EACZ,cAAc;A3B2rItB;;A2B9uIA;EAqDM,uBAAuB;A3B6rI7B;;A2BlvIA;EAuDM,yBAAyB;A3B+rI/B;;A2BtvIA;EA0DQ,YAAY;EACZ,cAAc;A3BgsItB;;A2B3vIA;EA6DI,aAAa;EACb,2BAA2B;A3BksI/B;;A2BhwIA;EAgEM,cAAc;A3BosIpB;;A2BpwIA;EAkEQ,gBAAgB;E1B+EpB,oB0B9E2C;A3BssI/C;;A2BzwIA;EAqEQ,YAAY;EACZ,cAAc;A3BwsItB;;A2B9wIA;EAwEM,uBAAuB;A3B0sI7B;;A2BlxIA;EA0EM,yBAAyB;A3B4sI/B;;A2BtxIA;EA4EM,eAAe;A3B8sIrB;;A2B1xIA;EAgFU,sBAAsB;A3B8sIhC;;A2B9xIA;EAkFQ,uBAAuB;A3BgtI/B;;A2BlyIA;EAoFQ,gBAAgB;A3BktIxB;;AC7tIE;E0BzEF;IAuFM,aAAa;E3BotIjB;AACF;;A2BntIA;EAEI,kBAAkB;A3BqtItB;;AC3uIE;E0BoBF;IAII,qBAAqB;E3BwtIvB;AACF;;AC7uIE;E0BgBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BgDd,mB0B/CsC;IACtC,iBAAiB;E3B4tInB;E2BtuIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B6tIxB;E2B1uIF;IAeM,oBAAoB;E3B8tIxB;E2B7uIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B+tIxB;E2BjvIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3BguIxB;AACF;;A2B/tIA;EAEI,gBAAgB;A3BiuIpB;;AC1wIE;E0BuCF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BouIhB;E2B3uIF;IASM,gBAAgB;E3BquIpB;E2B9uIF;IAWM,cAAc;E3BsuIlB;E2BjvIF;IAaQ,YAAY;E3BuuIlB;E2BpvIF;I1BiCI,oB0BlB2C;E3BwuI7C;AACF;;A2BvuIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3B0uIrB;;A2B/uIA;;;EAaU,c5BxKoB;ACg5I9B;;A2BrvIA;;;EAeQ,kB5B3IQ;ACu3IhB;;A2B3vIA;;;EAiBQ,kB5B/IQ;AC+3IhB;;A2BjwIA;;;EAmBQ,iB5BlJO;ACs4If;;A2BvwIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BsvIhB;;A2BjxIA;;EA+BM,mB7B1LgB;AEi7ItB;;A2BtxIA;EAiCM,OAAO;A3ByvIb;;A2B1xIA;;EAqCM,oB7BhMgB;AE07ItB;;A2B/xIA;EAuCM,QAAQ;A3B4vId;;A2BnyIA;EA2CM,6BAA6B;E1BnB/B,a0BoB+B;EAC7B,YAAY;EACZ,UAAU;A3B4vIhB;;A2B1yIA;EAgDM,kB5B5KU;AC06IhB;;A2B9yIA;EAkDM,kB5BhLU;ACg7IhB;;A2BlzIA;EAoDM,iB5BnLS;ACq7If;;A4Bx9IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B+8IrB;;A6Bn9IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B+9I3C;;A6B39IA;EAYM,c9BjBwB;ACo+I9B;;A6B/9IA;EAcI,mBAAmB;EACnB,aAAa;A7Bq9IjB;;A6Bp+IA;E5BuKI,gB4BtJoC;A7Bu9IxC;;A6Bx+IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bw9I5B;;A6B9+IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7B09IvB;;A6Bn/IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B49I/B;;A6B3/IA;E5BuKI,kB4BrIuC;A7B69I3C;;A6B//IA;E5BuKI,mB4BnIuC;A7B+9I3C;;A6BngJA;;EAyCM,uBAAuB;A7B+9I7B;;A6BxgJA;;EA6CM,yBAAyB;A7Bg+I/B;;A6B7gJA;EAgDI,kB9BrBY;ACs/IhB;;A6BjhJA;EAkDI,kB9BzBY;AC4/IhB;;A6BrhJA;EAoDI,iB9B5BW;ACigJf;;A6BzhJA;EAwDM,iBAAiB;A7Bq+IvB;;A6B7hJA;EA2DM,iBAAiB;A7Bs+IvB;;A6BjiJA;EA8DM,iBAAiB;A7Bu+IvB;;A6BriJA;EAiEM,iBAAiB;A7Bw+IvB;;A8B9hJA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,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CnwJA;EACE,mBAAmB;EACnB,yBAAyB;AhCswJ3B;;ACvuJE;E+BjCF;IAKI,aAAa;EhCwwJf;AACF;;AiC50JA;EACE,uBAAuB;EACvB,aAAa;EACb,mBAAmB;AjC+0JrB;;AiCl1JA;EAKI,sBAV2B;AjC21J/B;;AiCt1JA;EAOI,8ClCR0B;EkCS1B,aAAa;EACb,oBAb2B;AjCg2J/B;;AiC51JA;;EAYM,qBAfgC;AjCo2JtC;;AiCj2JA;EAcM,mBAhBwB;AjCu2J9B;;AiCr2JA;EAgBQ,kBAlBsB;AjC22J9B;;AiCz2JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCs3JpB;;AiC/2JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjC03J5B;;AiCz1JA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC41JhB;;AiC11JA;EhCsII,iBgC9KgB;AjCs4JpB;;AiC31JA;EhCmII,kBgC9KgB;AjC04JpB;;AiC51JA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC+1JrB;;AC/yJE;EgCpDF;IAQI,gBAAgB;EjCg2JlB;AACF;;AkCv4JA;EACE,enCgBW;AC03Jb;;AkC34JA;EAII,kBnCcY;AC63JhB;;AkC/4JA;EAMI,kBnCUY;ACm4JhB;;AkCn5JA;EAQI,iBnCOW;ACw4Jf;;AkC74JA;EACE,iBArB0B;AlCq6J5B;;AkCj5JA;EAGI,kBnCoCc;EmCnCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC26JrC;;AkCx5JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACq7J9B;;AkC75JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV82JhB;;AkCl6JA;EjCoJI,+BFxK0B;EmCqCxB,cAnC0B;EjCsK5B,qBiCrKkC;AlCy7JtC;;AkCp5JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCu5J3B;;AkC35JA;EAMI,eAtCoB;AlC+7JxB;;AkC/5JA;EAQI,kBAxCoB;AlCm8JxB;;AmC97JA;EAEE,4BpCZ4B;EoCa5B,kBpC4CU;EoC3CV,epCUW;ACs7Jb;;AmCp8JA;EAMI,mBAAmB;AnCk8JvB;;AmCx8JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCo8J9B;;AmC78JA;EAYI,kBpCGY;ACk8JhB;;AmCj9JA;EAcI,kBpCDY;ACw8JhB;;AmCr9JA;EAgBI,iBpCJW;AC68Jf;;AmCz9JA;EAsCM,uBAH+C;AnC07JrD;;AmC79JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACu/J7B;;AmCl+JA;EA2CQ,mBpCnDuB;AC8+J/B;;AmCt+JA;EAsCM,yBAH+C;AnCu8JrD;;AmC1+JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACu/J/B;;AmC/+JA;EA2CQ,qBpChEqB;ACwgK7B;;AmCn/JA;EAsCM,yBAH+C;AnCo9JrD;;AmCv/JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVm8JrB;;AmC5/JA;EA2CQ,wBpCrDsB;AC0gK9B;;AmChgKA;EAsCM,yBAH+C;AnCi+JrD;;AmCpgKA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV88JhB;;AmCzgKA;EA2CQ,qBpC5DsB;AC8hK9B;;AmC7gKA;EAsCM,yBzB4B0C;AV+8JhD;;AmCjhKA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV29JhB;;AmCthKA;EA2CQ,qBpC9C0B;EoC+C1B,czB8B6D;AVi9JrE;;AmC3hKA;EAsCM,yBzB4B0C;AV69JhD;;AmC/hKA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVy+JhB;;AmCpiKA;EA2CQ,qBpC5C0B;EoC6C1B,czB8B6D;AV+9JrE;;AmCziKA;EAsCM,yBzB4B0C;AV2+JhD;;AmC7iKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVu/JhB;;AmCljKA;EA2CQ,qBpC7C0B;EoC8C1B,czB8B6D;AV6+JrE;;AmCvjKA;EAsCM,yBzB4B0C;AVy/JhD;;AmC3jKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVqgKhB;;AmChkKA;EA2CQ,qBpC/C0B;EoCgD1B,czB8B6D;AV2/JrE;;AmCrkKA;EAsCM,yBzB4B0C;AVugKhD;;AmCzkKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVqhKrB;;AmC9kKA;EA2CQ,qBpChD0B;EoCiD1B,czB8B6D;AVygKrE;;AmCnlKA;EAsCM,yBzB4B0C;AVqhKhD;;AmCvlKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AViiKhB;;AmC5lKA;EA2CQ,qBpC1CyB;EoC2CzB,czB8B6D;AVuhKrE;;AmCnjKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCsjKpB;;AmChkKA;EAYI,YAAY;EACZ,cAAc;ElCgGd,oBkC/FsC;AnCwjK1C;;AmCtkKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnC0jK9B;;AmCxjKA;EACE,qBpChF4B;EoCiF5B,kBpCrBU;EoCsBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC4oKnC;;AmCjkKA;;EASI,uBpCnF2B;ACgpK/B;;AmCtkKA;EAWI,6BAlFgD;AnCipKpD;;AoCjoKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC2qKZ;;AoC3oKA;EAWI,aAAa;ApCooKjB;;AoCloKA;EAEE,wCrC/C2B;ACmrK7B;;AoCloKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApCqoKb;;ACpmKE;EmCvCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpCgsKzB;AACF;;AoCvoKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCsHb,UmC9KoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCqsK7B;;AoCvoKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApC0oKzB;;AoCxoKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC2oKpB;;AoCzoKA;EACE,gCrCjF4B;EqCkF5B,2BrCrBgB;EqCsBhB,4BrCtBgB;ACkqKlB;;AoC1oKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApC0tKhC;;AoC3oKA;EACE,8BrChCgB;EqCiChB,+BrCjCgB;EqCkChB,6BrC/F4B;AC6uK9B;;AoCjpKA;EnC4EI,kBmCtEuC;ApC+oK3C;;AoC7oKA;EnC3CE,iCAAiC;EmC6CjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCsuK9B;;AqC1sKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCmwKb;;AqCjtKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC8wK7B;;AqCttKA;;EAcU,ctCtEmB;ACmxK7B;;AqC3tKA;;;;EAoBY,yB3B8BqB;E2B7BrB,ctC7EiB;AC2xK7B;;AqCnuKA;EAwBY,qBtChFiB;AC+xK7B;;AqCvuKA;EA0BQ,ctClFqB;ACmyK7B;;AC3sKE;EoChCF;;;;IAgCY,ctCxFiB;EC2yK3B;EqCnvKF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,ctC/Fe;ECwzK3B;EqChwKF;;IA0Cc,qBtClGe;EC4zK3B;EqCpwKF;;;IA8CU,yB3BIuB;I2BHvB,ctCvGmB;ECk0K3B;EqC1wKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECs0K3B;AACF;;AqC/wKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC+zK/B;;AqCpxKA;;EAcU,YtCzDqB;ACo0K/B;;AqCzxKA;;;;EAoBY,uB3B8BqB;E2B7BrB,YtChEmB;AC40K/B;;AqCjyKA;EAwBY,mBtCnEmB;ACg1K/B;;AqCryKA;EA0BQ,YtCrEuB;ACo1K/B;;ACzwKE;EoChCF;;;;IAgCY,YtC3EmB;EC41K7B;EqCjzKF;;;;;;;;;;IAsCc,uB3BYmB;I2BXnB,YtClFiB;ECy2K7B;EqC9zKF;;IA0Cc,mBtCrFiB;EC62K7B;EqCl0KF;;;IA8CU,uB3BIuB;I2BHvB,YtC1FqB;ECm3K7B;EqCx0KF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECu3K7B;AACF;;AqC70KA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV4zKrB;;AqCl1KA;;EAcU,yB3BQW;AVi0KrB;;AqCv1KA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AVy0KrB;;AqC/1KA;EAwBY,gC3BFS;AV60KrB;;AqCn2KA;EA0BQ,yB3BJa;AVi1KrB;;ACv0KE;EoChCF;;;;IAgCY,yB3BVS;EVy1KnB;EqC/2KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EVs2KnB;EqC53KF;;IA0Cc,gC3BpBO;EV02KnB;EqCh4KF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVg3KnB;EqCt4KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVo3KnB;AACF;;AqC34KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVw3KhB;;AqCh5KA;;EAcU,W3BUM;AV63KhB;;AqCr5KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVq4KhB;;AqC75KA;EAwBY,kB3BAI;AVy4KhB;;AqCj6KA;EA0BQ,W3BFQ;AV64KhB;;ACr4KE;EoChCF;;;;IAgCY,W3BRI;EVq5Kd;EqC76KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVk6Kd;EqC17KF;;IA0Cc,kB3BlBE;EVs6Kd;EqC97KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV46Kd;EqCp8KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EVg7Kd;AACF;;AqCz8KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVs7KhB;;AqC98KA;;EAcU,W3BUM;AV27KhB;;AqCn9KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVm8KhB;;AqC39KA;EAwBY,kB3BAI;AVu8KhB;;AqC/9KA;EA0BQ,W3BFQ;AV28KhB;;ACn8KE;EoChCF;;;;IAgCY,W3BRI;EVm9Kd;EqC3+KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVg+Kd;EqCx/KF;;IA0Cc,kB3BlBE;EVo+Kd;EqC5/KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV0+Kd;EqClgLF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV8+Kd;AACF;;AqCvgLA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVo/KhB;;AqC5gLA;;EAcU,W3BUM;AVy/KhB;;AqCjhLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVigLhB;;AqCzhLA;EAwBY,kB3BAI;AVqgLhB;;AqC7hLA;EA0BQ,W3BFQ;AVygLhB;;ACjgLE;EoChCF;;;;IAgCY,W3BRI;EVihLd;EqCziLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV8hLd;EqCtjLF;;IA0Cc,kB3BlBE;EVkiLd;EqC1jLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVwiLd;EqChkLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV4iLd;AACF;;AqCrkLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVkjLhB;;AqC1kLA;;EAcU,W3BUM;AVujLhB;;AqC/kLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV+jLhB;;AqCvlLA;EAwBY,kB3BAI;AVmkLhB;;AqC3lLA;EA0BQ,W3BFQ;AVukLhB;;AC/jLE;EoChCF;;;;IAgCY,W3BRI;EV+kLd;EqCvmLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV4lLd;EqCpnLF;;IA0Cc,kB3BlBE;EVgmLd;EqCxnLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVsmLd;EqC9nLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EV0mLd;AACF;;AqCnoLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AVgnLhB;;AqCxoLA;;EAcU,W3BUM;AVqnLhB;;AqC7oLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV6nLhB;;AqCrpLA;EAwBY,kB3BAI;AVioLhB;;AqCzpLA;EA0BQ,W3BFQ;AVqoLhB;;AC7nLE;EoChCF;;;;IAgCY,W3BRI;EV6oLd;EqCrqLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV0pLd;EqClrLF;;IA0Cc,kB3BlBE;EV8pLd;EqCtrLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVoqLd;EqC5rLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVwqLd;AACF;;AqCjsLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AVgrLrB;;AqCtsLA;;EAcU,yB3BQW;AVqrLrB;;AqC3sLA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AV6rLrB;;AqCntLA;EAwBY,gC3BFS;AVisLrB;;AqCvtLA;EA0BQ,yB3BJa;AVqsLrB;;AC3rLE;EoChCF;;;;IAgCY,yB3BVS;EV6sLnB;EqCnuLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EV0tLnB;EqChvLF;;IA0Cc,gC3BpBO;EV8tLnB;EqCpvLF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVouLnB;EqC1vLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVwuLnB;AACF;;AqC/vLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV4uLhB;;AqCpwLA;;EAcU,W3BUM;AVivLhB;;AqCzwLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVyvLhB;;AqCjxLA;EAwBY,kB3BAI;AV6vLhB;;AqCrxLA;EA0BQ,W3BFQ;AViwLhB;;ACzvLE;EoChCF;;;;IAgCY,W3BRI;EVywLd;EqCjyLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVsxLd;EqC9yLF;;IA0Cc,kB3BlBE;EV0xLd;EqClzLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVgyLd;EqCxzLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVoyLd;AACF;;AqC7zLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC2wLf;;AqCp0LA;EA2DI,gCtCxG0B;ACq3L9B;;AqCx0LA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArCg4LnB;;AqC/0LA;EAgEI,SAAS;ArCmxLb;;AqCn1LA;EAkEM,iCtC/GwB;ACo4L9B;;AqCv1LA;EAoEI,MAAM;ArCuxLV;;AqCrxLA;;EAGI,oBA9HmB;ArCq5LvB;;AqC1xLA;;EAKI,uBAhImB;ArC05LvB;;AqCxxLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCk6LvB;;AqCzxLA;EAIM,6BAA6B;ArCyxLnC;;AqCvxLA;EpCjFE,iCAAiC;EoCmFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArC0xLpB;;AqCxxLA;EAEE,ctCrJ4B;EEoB5B,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eoC7BqB;EpC8BrB,kBAAkB;EAClB,coC/BqB;EpC6KnB,kBoCpBkC;ArCmyLtC;;AC55LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBF6BQ;EE5BR,yDAAyD;EACzD,oCFsBa;EErBb,WAAW;AD+5Lf;;AC95LI;EACE,oBAAoB;ADi6L1B;;ACh6LI;EACE,oBAAoB;ADm6L1B;;ACl6LI;EACE,oBAAoB;ADq6L1B;;ACp6LE;EACE,qCAAiC;ADu6LrC;;ACn6LM;EACE,wCAAwC;ADs6LhD;;ACr6LM;EACE,UAAU;ADw6LlB;;ACv6LM;EACE,0CAA0C;AD06LlD;;AqC10LA;EACE,aAAa;ArC60Lf;;AqC30LA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArC80LpB;;AqCp1LA;;EASM,qBAAqB;EACrB,sBAAsB;ArCg1L5B;;AqC90LA;;EAEE,eAAe;ArCi1LjB;;AqCn1LA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;ACq/LlC;;AqCl1LA;EACE,YAAY;EACZ,cAAc;ArCq1LhB;;AqCv1LA;EAII,mBA7KgC;ArCogMpC;;AqC31LA;EAMI,UAAU;ArCy1Ld;;AqC/1LA;EAQI,YAAY;EACZ,cAAc;ArC21LlB;;AqCp2LA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArC61LtC;;AqC12LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;ACkhMlC;;AqC/2LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArCg2L9E;;AqC91LA;EACE,YAAY;EACZ,cAAc;ArCi2LhB;;AqC/1LA;EpCrCI,mBoCsCoC;ArCk2LxC;;AqCn2LA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpClCpB,aoCmC6B;ArCm2LjC;;AqCj2LA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArCo2LrB;;AqCv2LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCs2LzB;;AqCp2LA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCu2LlB;;ACr/LE;EoCpCF;IAsLI,cAAc;ErCw2LhB;EqCv2LA;;IAGI,mBAAmB;IACnB,aAAa;ErCw2LjB;EqCv2LA;IAEI,aAAa;ErCw2LjB;EqCh8LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCy2LnB;EqC52LA;IAKI,cAAc;ErC02LlB;EqCx2LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCqmMjB;EqC92LA;IAKI,SAAS;ErC42Lb;EqCj3LA;IAOM,4CtCrQqB;ECknM3B;EqCp3LA;IASI,MAAM;ErC82LV;EqCv3LA;IpC7LA,iCAAiC;IoC2M3B,iCAA2C;IAC3C,cAAc;ErC62LpB;EqC52LA;;IAGI,oBA9QiB;ErC2nMrB;EqCh3LA;;IAKI,uBAhRiB;ErC+nMrB;AACF;;AC3iME;EoC8LA;;;;IAIE,oBAAoB;IACpB,aAAa;ErCi3Lf;EqCplMF;IAqOI,mBA1RmB;ErC4oMrB;EqCn3LA;IAGI,kBA1R0B;ErC6oM9B;EqCt3LA;;IAMM,mBAAmB;ErCo3LzB;EqC13LA;;IASM,kBtCjOI;ECslMV;EqC93LA;;;;IAgBQ,wCAAwC;ErCo3LhD;EqCp4LA;IAuBU,wCAAwC;ErCg3LlD;EqCv4LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECuqM3B;EqC34LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECupMhC;EqCnhMF;IAsKI,aAAa;ErCg3Lf;EqC7gMF;;IAgKI,mBAAmB;IACnB,aAAa;ErCi3Lf;EqC5/LF;IA8IM,oBAAoB;ErCi3LxB;EqCn3LA;IAKM,oDAAoD;ErCi3L1D;EqCt3LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErCk3Lf;EqC93LA;IAkBM,cAAc;ErC+2LpB;EqC92LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErC+2LhC;EqC3iMF;IA8LI,YAAY;IACZ,cAAc;ErCg3LhB;EqC/2LA;IACE,2BAA2B;IpC/K3B,iBoCgLoC;ErCi3LtC;EqCh3LA;IACE,yBAAyB;IpClLzB,kBoCmLoC;ErCk3LtC;EqCx/LF;IAwII,uBtCxV2B;IsCyV3B,8BtCjSc;IsCkSd,+BtClSc;IsCmSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCnLnB,QoCoLuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErCosMpB;EqCtgMF;IAqJM,sBAAsB;IACtB,mBAAmB;ErCo3LvB;EqCn4LA;IpCpLE,kBoCqMuC;ErCq3LzC;EqCt4LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;EC8uM3B;EqC14LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;EC8tMhC;EqCr3LE;IAEE,kBtC1TY;IsC2TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtChUM;IsCiUN,uCAAuC;ErCs3L3C;EqC15LA;IAsCI,UAAU;IACV,QAAQ;ErCu3LZ;EqC7hMF;IAwKI,cAAc;ErCw3LhB;EqCv3LA;;IpC9NE,sBoCiOyC;ErCw3L3C;EqC33LA;;IpC9NE,qBoCmOyC;ErC03L3C;EqCx3LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC4wMjB;EqC93LA;IAKI,SAAS;ErC43Lb;EqCj4LA;IAOM,4CtC5ZqB;ECyxM3B;EqCp4LA;IASI,MAAM;ErC83LV;EqC73LA;;IAGI,oBA/ZiB;ErC6xMrB;EqCj4LA;;IAKI,uBAjaiB;ErCiyMrB;EqCr4LA;;IAOI,oBAA4D;ErCk4LhE;EqCz4LA;;IASI,uBAA+D;ErCo4LnE;EqCl4LA;;IAGI,ctC7auB;ECgzM3B;EqCt4LA;;IAKI,6BAla2C;ErCuyM/C;EqCp4LA;IAKM,yBtCzasB;EC2yM5B;AACF;;AqC/3LA;EAEI,iCAA2C;ArCi4L/C;;AsCzxMA;EAEE,evCFW;EuCGX,gBAnC0B;AtC8zM5B;;AsC9xMA;EAMI,kBvCLY;ACiyMhB;;AsClyMA;EAQI,kBvCTY;ACuyMhB;;AsCtyMA;EAUI,iBvCZW;AC4yMf;;AsC1yMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCmBiB;AC8wMvB;;AsCjzMA;EAkBM,qBvCiBiB;ACkxMvB;;AsCjyMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtCoyMpB;;AsClyMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtCmyMpB;;AsCjyMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AE+2MtB;;AsCzyMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACu3M9B;;AsChzMA;;;EAUI,qBvCjE8B;AC62MlC;;AsCtzMA;;;EAYI,iDvCvFyB;ACu4M7B;;AsC5zMA;;;;;EAeI,yBvClF0B;EuCmF1B,qBvCnF0B;EuCoF1B,gBAAgB;EAChB,cvCvF0B;EuCwF1B,YAAY;AtCqzMhB;;AsCnzMA;;EAEE,oBAvFkC;EAwFlC,qBAvFmC;EAwFnC,mBAAmB;AtCszMrB;;AsCpzMA;EAEI,yBvCpF8B;EuCqF9B,qBvCrF8B;EuCsF9B,W5B1BY;AVg1MhB;;AsCpzMA;EACE,cvCtG4B;EuCuG5B,oBAAoB;AtCuzMtB;;AsCrzMA;EACE,eAAe;AtCwzMjB;;AsCzzMA;EAGI,gBAAgB;AtC0zMpB;;ACz0ME;EqCjEF;IAoFI,eAAe;EtC2zMjB;EsCl1MF;;IA0BI,YAAY;IACZ,cAAc;EtC4zMhB;EsCv0MF;IAcM,YAAY;IACZ,cAAc;EtC4zMlB;AACF;;ACp1ME;EqCQF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtC8zMV;EsCt4MF;;;;IA6EI,gBAAgB;IAChB,aAAa;EtC+zMf;EsC9zMA;IACE,QAAQ;EtCg0MV;EsC/zMA;IACE,QAAQ;EtCi0MV;EsC96MF;IA+GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtCk0Mf;EsCr0MA;IAMM,QAAQ;EtCk0Md;EsCx0MA;IAQM,uBAAuB;IACvB,QAAQ;EtCm0Md;EsC50MA;IAWM,QAAQ;EtCo0Md;EsC/0MA;IAcM,QAAQ;EtCo0Md;EsCl1MA;IAgBM,QAAQ;EtCq0Md;EsCr1MA;IAkBM,yBAAyB;IACzB,QAAQ;EtCs0Md;AACF;;AuC78MA;EACE,kBxCsCgB;EwCrChB,0FxChC2B;EwCiC3B,exCEW;AC88Mb;;AuCn9MA;EAKI,qBxCWkB;ACu8MtB;;AuCv9MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;AC0/M7B;;AuC59MA;EAeQ,0BxChCuB;ACi/M/B;;AuCh+MA;EAiBQ,YxClCuB;ACq/M/B;;AuCp+MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;AC0/M/B;;AuCz+MA;EAeQ,4BxC7CqB;AC2gN7B;;AuC7+MA;EAiBQ,cxC/CqB;AC+gN7B;;AuCj/MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AVs8MrB;;AuCt/MA;EAeQ,+BxClCsB;AC6gN9B;;AuC1/MA;EAiBQ,iBxCpCsB;ACihN9B;;AuC9/MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVi9MhB;;AuCngNA;EAeQ,4BxCzCsB;ACiiN9B;;AuCvgNA;EAiBQ,cxC3CsB;ACqiN9B;;AuC3gNA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AV89MhB;;AuChhNA;EAeQ,4BxC3B0B;ACgiNlC;;AuCphNA;EAiBQ,cxC7B0B;ACoiNlC;;AuCxhNA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AV2+MhB;;AuC7hNA;EAeQ,4BxCzB0B;AC2iNlC;;AuCjiNA;EAiBQ,cxC3B0B;AC+iNlC;;AuCriNA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVw/MhB;;AuC1iNA;EAeQ,4BxC1B0B;ACyjNlC;;AuC9iNA;EAiBQ,cxC5B0B;AC6jNlC;;AuCljNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AVqgNhB;;AuCvjNA;EAeQ,4BxC5B0B;ACwkNlC;;AuC3jNA;EAiBQ,cxC9B0B;AC4kNlC;;AuC/jNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AVohNrB;;AuCpkNA;EAeQ,4BxC7B0B;ACslNlC;;AuCxkNA;EAiBQ,cxC/B0B;AC0lNlC;;AuC5kNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AV+hNhB;;AuCjlNA;EAeQ,4BxCvByB;AC6lNjC;;AuCrlNA;EAiBQ,cxCzByB;ACimNjC;;AuCtkNA;;EAGI,gCxC3C2B;ACmnN/B;;AuCtkNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvC8nNlC;;AuCvkNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvC0kNzB;;AuC9kNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvC4kNlB;;AuCplNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;ACopN9B;;AuC3kNA;EAEI,cxC1E0B;ACupN9B;;AuC/kNA;EAIM,cxC7D4B;AC4oNlC;;AuC7kNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCglNvB;;AuCrlNA;EtC6FI,mBsCtFsC;AvCklN1C;;AuCzlNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvColNf;;AuC/lNA;EAaI,eAAe;AvCslNnB;;AuCnmNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;ACurN9B;;AuCxmNA;EAkBM,cxCjF4B;AC2qNlC;;AuC5mNA;EAoBI,8BxClCc;EwCmCd,+BxCnCc;AC+nNlB;;AuC1lNA;;EAEE,eAAe;AvC6lNjB;;AuC/lNA;;EAII,4BxCnG0B;ACmsN9B;;AuC9lNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EE0K1B,mBsC7DoC;AvCumNxC;;AuC1mNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCymNxB;;AwCnsNA;EvCqCE,iCAAiC;EuCjCjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxCosNrB;;AwC9sNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxCssNvB;;AwC3tNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACwvN9B;;AwChuNA;EA0BI,cAAc;AxC0sNlB;;AwCpuNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACivNlC;;AwCzuNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxC6sN/B;;AwCpvNA;EAyCM,qBAAqB;AxC+sN3B;;AwCxvNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCitN3B;;AwC/vNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxCmtN1B;;AwCpwNA;EvCoJI,kBuChGuC;AxCotN3C;;AwCxwNA;EvCoJI,mBuC9FuC;AxCstN3C;;AwC5wNA;EA0DM,uBAAuB;AxCstN7B;;AwChxNA;EA6DM,yBAAyB;AxCutN/B;;AwCpxNA;EAiEM,6BAA6B;EAI3B,0BzC7BI;ACivNZ;;AwCzxNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;ACkzN9B;;AwC9xNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxCstNrF;;AwCpyNA;EAiFM,YAAY;EACZ,cAAc;AxCutNpB;;AwCzyNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCwtNxB;;AwCjzNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxC0tNlB;;AwCvzNA;EvCoJI,kBuCpDuE;AxC2tN3E;;AwC3zNA;EAsGU,4BzC9DE;EyC+DF,+BzC/DE;ACwxNZ;;AwCh0NA;EA6GU,2BzCrEE;EyCsEF,8BzCtEE;AC6xNZ;;AwCr0NA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCwtNpB;;AwC50NA;EAsHM,mBAAmB;AxC0tNzB;;AwCh1NA;EA+HY,kCzCrFW;EyCsFX,+BzCtFW;EyCuFX,qBAAqB;AxCqtNjC;;AwCt1NA;EAwIY,iCzC9FW;EyC+FX,8BzC/FW;EyCgGX,oBAAoB;AxCktNhC;;AwC51NA;EA6II,kBzCrIY;ACw1NhB;;AwCh2NA;EA+II,kBzCzIY;AC81NhB;;AwCp2NA;EAiJI,iBzC5IW;ACm2Nf;;AyCt4NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1C64NpB;;A0Cr4NE;EACE,UAAU;EACV,YAAY;A1Cw4NhB;;A0Cv4NE;EACE,UAAU;EACV,WAAW;A1C04Nf;;A0Cz4NE;EACE,UAAU;EACV,UAAU;A1C44Nd;;A0C34NE;EACE,UAAU;EACV,eAAe;A1C84NnB;;A0C74NE;EACE,UAAU;EACV,UAAU;A1Cg5Nd;;A0C/4NE;EACE,UAAU;EACV,eAAe;A1Ck5NnB;;A0Cj5NE;EACE,UAAU;EACV,UAAU;A1Co5Nd;;A0Cn5NE;EACE,UAAU;EACV,UAAU;A1Cs5Nd;;A0Cr5NE;EACE,UAAU;EACV,UAAU;A1Cw5Nd;;A0Cv5NE;EACE,UAAU;EACV,UAAU;A1C05Nd;;A0Cz5NE;EACE,UAAU;EACV,UAAU;A1C45Nd;;A0C35NE;EzCuIE,iByCtImC;A1C85NvC;;A0C75NE;EzCqIE,sByCpIwC;A1Cg6N5C;;A0C/5NE;EzCmIE,iByClImC;A1Ck6NvC;;A0Cj6NE;EzCiIE,sByChIwC;A1Co6N5C;;A0Cn6NE;EzC+HE,iByC9HmC;A1Cs6NvC;;A0Cr6NE;EzC6HE,iByC5HmC;A1Cw6NvC;;A0Cv6NE;EzC2HE,iByC1HmC;A1C06NvC;;A0Cz6NE;EzCyHE,iByCxHmC;A1C46NvC;;A0C36NE;EzCuHE,iByCtHmC;A1C86NvC;;A0C56NI;EACE,UAAU;EACV,SAAiC;A1C+6NvC;;A0C96NI;EzCiHA,gByChH4D;A1Ci7NhE;;A0Cr7NI;EACE,UAAU;EACV,eAAiC;A1Cw7NvC;;A0Cv7NI;EzCiHA,sByChH4D;A1C07NhE;;A0C97NI;EACE,UAAU;EACV,gBAAiC;A1Ci8NvC;;A0Ch8NI;EzCiHA,uByChH4D;A1Cm8NhE;;A0Cv8NI;EACE,UAAU;EACV,UAAiC;A1C08NvC;;A0Cz8NI;EzCiHA,iByChH4D;A1C48NhE;;A0Ch9NI;EACE,UAAU;EACV,gBAAiC;A1Cm9NvC;;A0Cl9NI;EzCiHA,uByChH4D;A1Cq9NhE;;A0Cz9NI;EACE,UAAU;EACV,gBAAiC;A1C49NvC;;A0C39NI;EzCiHA,uByChH4D;A1C89NhE;;A0Cl+NI;EACE,UAAU;EACV,UAAiC;A1Cq+NvC;;A0Cp+NI;EzCiHA,iByChH4D;A1Cu+NhE;;A0C3+NI;EACE,UAAU;EACV,gBAAiC;A1C8+NvC;;A0C7+NI;EzCiHA,uByChH4D;A1Cg/NhE;;A0Cp/NI;EACE,UAAU;EACV,gBAAiC;A1Cu/NvC;;A0Ct/NI;EzCiHA,uByChH4D;A1Cy/NhE;;A0C7/NI;EACE,UAAU;EACV,UAAiC;A1CggOvC;;A0C//NI;EzCiHA,iByChH4D;A1CkgOhE;;A0CtgOI;EACE,UAAU;EACV,gBAAiC;A1CygOvC;;A0CxgOI;EzCiHA,uByChH4D;A1C2gOhE;;A0C/gOI;EACE,UAAU;EACV,gBAAiC;A1CkhOvC;;A0CjhOI;EzCiHA,uByChH4D;A1CohOhE;;A0CxhOI;EACE,UAAU;EACV,WAAiC;A1C2hOvC;;A0C1hOI;EzCiHA,kByChH4D;A1C6hOhE;;ACz/NE;EyClGF;IAiEM,UAAU;IACV,YAAY;E1C+hOhB;E0CjmOF;IAoEM,UAAU;IACV,WAAW;E1CgiOf;E0CrmOF;IAuEM,UAAU;IACV,UAAU;E1CiiOd;E0CzmOF;IA0EM,UAAU;IACV,eAAe;E1CkiOnB;E0C7mOF;IA6EM,UAAU;IACV,UAAU;E1CmiOd;E0CjnOF;IAgFM,UAAU;IACV,eAAe;E1CoiOnB;E0CrnOF;IAmFM,UAAU;IACV,UAAU;E1CqiOd;E0CznOF;IAsFM,UAAU;IACV,UAAU;E1CsiOd;E0C7nOF;IAyFM,UAAU;IACV,UAAU;E1CuiOd;E0CjoOF;IA4FM,UAAU;IACV,UAAU;E1CwiOd;E0CroOF;IA+FM,UAAU;IACV,UAAU;E1CyiOd;E0CzoOF;IzC8KI,iByC5EqC;E1C0iOvC;E0C5oOF;IzC8KI,sByC1E0C;E1C2iO5C;E0C/oOF;IzC8KI,iByCxEqC;E1C4iOvC;E0ClpOF;IzC8KI,sByCtE0C;E1C6iO5C;E0CrpOF;IzC8KI,iByCpEqC;E1C8iOvC;E0CxpOF;IzC8KI,iByClEqC;E1C+iOvC;E0C3pOF;IzC8KI,iByChEqC;E1CgjOvC;E0C9pOF;IzC8KI,iByC9DqC;E1CijOvC;E0CjqOF;IzC8KI,iByC5DqC;E1CkjOvC;E0CpqOF;IAqHQ,UAAU;IACV,SAAiC;E1CkjOvC;E0CxqOF;IzC8KI,gByCtD8D;E1CmjOhE;E0C3qOF;IAqHQ,UAAU;IACV,eAAiC;E1CyjOvC;E0C/qOF;IzC8KI,sByCtD8D;E1C0jOhE;E0ClrOF;IAqHQ,UAAU;IACV,gBAAiC;E1CgkOvC;E0CtrOF;IzC8KI,uByCtD8D;E1CikOhE;E0CzrOF;IAqHQ,UAAU;IACV,UAAiC;E1CukOvC;E0C7rOF;IzC8KI,iByCtD8D;E1CwkOhE;E0ChsOF;IAqHQ,UAAU;IACV,gBAAiC;E1C8kOvC;E0CpsOF;IzC8KI,uByCtD8D;E1C+kOhE;E0CvsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CqlOvC;E0C3sOF;IzC8KI,uByCtD8D;E1CslOhE;E0C9sOF;IAqHQ,UAAU;IACV,UAAiC;E1C4lOvC;E0CltOF;IzC8KI,iByCtD8D;E1C6lOhE;E0CrtOF;IAqHQ,UAAU;IACV,gBAAiC;E1CmmOvC;E0CztOF;IzC8KI,uByCtD8D;E1ComOhE;E0C5tOF;IAqHQ,UAAU;IACV,gBAAiC;E1C0mOvC;E0ChuOF;IzC8KI,uByCtD8D;E1C2mOhE;E0CnuOF;IAqHQ,UAAU;IACV,UAAiC;E1CinOvC;E0CvuOF;IzC8KI,iByCtD8D;E1CknOhE;E0C1uOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwnOvC;E0C9uOF;IzC8KI,uByCtD8D;E1CynOhE;E0CjvOF;IAqHQ,UAAU;IACV,gBAAiC;E1C+nOvC;E0CrvOF;IzC8KI,uByCtD8D;E1CgoOhE;E0CxvOF;IAqHQ,UAAU;IACV,WAAiC;E1CsoOvC;E0C5vOF;IzC8KI,kByCtD8D;E1CuoOhE;AACF;;AC1pOE;EyCtGF;IA4HM,UAAU;IACV,YAAY;E1CyoOhB;E0CtwOF;IAgIM,UAAU;IACV,WAAW;E1CyoOf;E0C1wOF;IAoIM,UAAU;IACV,UAAU;E1CyoOd;E0C9wOF;IAwIM,UAAU;IACV,eAAe;E1CyoOnB;E0ClxOF;IA4IM,UAAU;IACV,UAAU;E1CyoOd;E0CtxOF;IAgJM,UAAU;IACV,eAAe;E1CyoOnB;E0C1xOF;IAoJM,UAAU;IACV,UAAU;E1CyoOd;E0C9xOF;IAwJM,UAAU;IACV,UAAU;E1CyoOd;E0ClyOF;IA4JM,UAAU;IACV,UAAU;E1CyoOd;E0CtyOF;IAgKM,UAAU;IACV,UAAU;E1CyoOd;E0C1yOF;IAoKM,UAAU;IACV,UAAU;E1CyoOd;E0C9yOF;IzC8KI,iByCNqC;E1CyoOvC;E0CjzOF;IzC8KI,sByCH0C;E1CyoO5C;E0CpzOF;IzC8KI,iByCAqC;E1CyoOvC;E0CvzOF;IzC8KI,sByCG0C;E1CyoO5C;E0C1zOF;IzC8KI,iByCMqC;E1CyoOvC;E0C7zOF;IzC8KI,iByCSqC;E1CyoOvC;E0Ch0OF;IzC8KI,iByCYqC;E1CyoOvC;E0Cn0OF;IzC8KI,iByCeqC;E1CyoOvC;E0Ct0OF;IzC8KI,iByCkBqC;E1CyoOvC;E0Cz0OF;IAoMQ,UAAU;IACV,SAAiC;E1CwoOvC;E0C70OF;IzC8KI,gByC0B8D;E1CwoOhE;E0Ch1OF;IAoMQ,UAAU;IACV,eAAiC;E1C+oOvC;E0Cp1OF;IzC8KI,sByC0B8D;E1C+oOhE;E0Cv1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CspOvC;E0C31OF;IzC8KI,uByC0B8D;E1CspOhE;E0C91OF;IAoMQ,UAAU;IACV,UAAiC;E1C6pOvC;E0Cl2OF;IzC8KI,iByC0B8D;E1C6pOhE;E0Cr2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CoqOvC;E0Cz2OF;IzC8KI,uByC0B8D;E1CoqOhE;E0C52OF;IAoMQ,UAAU;IACV,gBAAiC;E1C2qOvC;E0Ch3OF;IzC8KI,uByC0B8D;E1C2qOhE;E0Cn3OF;IAoMQ,UAAU;IACV,UAAiC;E1CkrOvC;E0Cv3OF;IzC8KI,iByC0B8D;E1CkrOhE;E0C13OF;IAoMQ,UAAU;IACV,gBAAiC;E1CyrOvC;E0C93OF;IzC8KI,uByC0B8D;E1CyrOhE;E0Cj4OF;IAoMQ,UAAU;IACV,gBAAiC;E1CgsOvC;E0Cr4OF;IzC8KI,uByC0B8D;E1CgsOhE;E0Cx4OF;IAoMQ,UAAU;IACV,UAAiC;E1CusOvC;E0C54OF;IzC8KI,iByC0B8D;E1CusOhE;E0C/4OF;IAoMQ,UAAU;IACV,gBAAiC;E1C8sOvC;E0Cn5OF;IzC8KI,uByC0B8D;E1C8sOhE;E0Ct5OF;IAoMQ,UAAU;IACV,gBAAiC;E1CqtOvC;E0C15OF;IzC8KI,uByC0B8D;E1CqtOhE;E0C75OF;IAoMQ,UAAU;IACV,WAAiC;E1C4tOvC;E0Cj6OF;IzC8KI,kByC0B8D;E1C4tOhE;AACF;;ACvzOE;EyC9GF;IA2MM,UAAU;IACV,YAAY;E1C+tOhB;E0C36OF;IA8MM,UAAU;IACV,WAAW;E1CguOf;E0C/6OF;IAiNM,UAAU;IACV,UAAU;E1CiuOd;E0Cn7OF;IAoNM,UAAU;IACV,eAAe;E1CkuOnB;E0Cv7OF;IAuNM,UAAU;IACV,UAAU;E1CmuOd;E0C37OF;IA0NM,UAAU;IACV,eAAe;E1CouOnB;E0C/7OF;IA6NM,UAAU;IACV,UAAU;E1CquOd;E0Cn8OF;IAgOM,UAAU;IACV,UAAU;E1CsuOd;E0Cv8OF;IAmOM,UAAU;IACV,UAAU;E1CuuOd;E0C38OF;IAsOM,UAAU;IACV,UAAU;E1CwuOd;E0C/8OF;IAyOM,UAAU;IACV,UAAU;E1CyuOd;E0Cn9OF;IzC8KI,iByC8DqC;E1C0uOvC;E0Ct9OF;IzC8KI,sByCgE0C;E1C2uO5C;E0Cz9OF;IzC8KI,iByCkEqC;E1C4uOvC;E0C59OF;IzC8KI,sByCoE0C;E1C6uO5C;E0C/9OF;IzC8KI,iByCsEqC;E1C8uOvC;E0Cl+OF;IzC8KI,iByCwEqC;E1C+uOvC;E0Cr+OF;IzC8KI,iByC0EqC;E1CgvOvC;E0Cx+OF;IzC8KI,iByC4EqC;E1CivOvC;E0C3+OF;IzC8KI,iByC8EqC;E1CkvOvC;E0C9+OF;IA+PQ,UAAU;IACV,SAAiC;E1CkvOvC;E0Cl/OF;IzC8KI,gByCoF8D;E1CmvOhE;E0Cr/OF;IA+PQ,UAAU;IACV,eAAiC;E1CyvOvC;E0Cz/OF;IzC8KI,sByCoF8D;E1C0vOhE;E0C5/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CgwOvC;E0ChgPF;IzC8KI,uByCoF8D;E1CiwOhE;E0CngPF;IA+PQ,UAAU;IACV,UAAiC;E1CuwOvC;E0CvgPF;IzC8KI,iByCoF8D;E1CwwOhE;E0C1gPF;IA+PQ,UAAU;IACV,gBAAiC;E1C8wOvC;E0C9gPF;IzC8KI,uByCoF8D;E1C+wOhE;E0CjhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CqxOvC;E0CrhPF;IzC8KI,uByCoF8D;E1CsxOhE;E0CxhPF;IA+PQ,UAAU;IACV,UAAiC;E1C4xOvC;E0C5hPF;IzC8KI,iByCoF8D;E1C6xOhE;E0C/hPF;IA+PQ,UAAU;IACV,gBAAiC;E1CmyOvC;E0CniPF;IzC8KI,uByCoF8D;E1CoyOhE;E0CtiPF;IA+PQ,UAAU;IACV,gBAAiC;E1C0yOvC;E0C1iPF;IzC8KI,uByCoF8D;E1C2yOhE;E0C7iPF;IA+PQ,UAAU;IACV,UAAiC;E1CizOvC;E0CjjPF;IzC8KI,iByCoF8D;E1CkzOhE;E0CpjPF;IA+PQ,UAAU;IACV,gBAAiC;E1CwzOvC;E0CxjPF;IzC8KI,uByCoF8D;E1CyzOhE;E0C3jPF;IA+PQ,UAAU;IACV,gBAAiC;E1C+zOvC;E0C/jPF;IzC8KI,uByCoF8D;E1Cg0OhE;E0ClkPF;IA+PQ,UAAU;IACV,WAAiC;E1Cs0OvC;E0CtkPF;IzC8KI,kByCoF8D;E1Cu0OhE;AACF;;ACx9OE;EyClHF;IAqQM,UAAU;IACV,YAAY;E1C00OhB;E0ChlPF;IAwQM,UAAU;IACV,WAAW;E1C20Of;E0CplPF;IA2QM,UAAU;IACV,UAAU;E1C40Od;E0CxlPF;IA8QM,UAAU;IACV,eAAe;E1C60OnB;E0C5lPF;IAiRM,UAAU;IACV,UAAU;E1C80Od;E0ChmPF;IAoRM,UAAU;IACV,eAAe;E1C+0OnB;E0CpmPF;IAuRM,UAAU;IACV,UAAU;E1Cg1Od;E0CxmPF;IA0RM,UAAU;IACV,UAAU;E1Ci1Od;E0C5mPF;IA6RM,UAAU;IACV,UAAU;E1Ck1Od;E0ChnPF;IAgSM,UAAU;IACV,UAAU;E1Cm1Od;E0CpnPF;IAmSM,UAAU;IACV,UAAU;E1Co1Od;E0CxnPF;IzC8KI,iByCwHqC;E1Cq1OvC;E0C3nPF;IzC8KI,sByC0H0C;E1Cs1O5C;E0C9nPF;IzC8KI,iByC4HqC;E1Cu1OvC;E0CjoPF;IzC8KI,sByC8H0C;E1Cw1O5C;E0CpoPF;IzC8KI,iByCgIqC;E1Cy1OvC;E0CvoPF;IzC8KI,iByCkIqC;E1C01OvC;E0C1oPF;IzC8KI,iByCoIqC;E1C21OvC;E0C7oPF;IzC8KI,iByCsIqC;E1C41OvC;E0ChpPF;IzC8KI,iByCwIqC;E1C61OvC;E0CnpPF;IAyTQ,UAAU;IACV,SAAiC;E1C61OvC;E0CvpPF;IzC8KI,gByC8I8D;E1C81OhE;E0C1pPF;IAyTQ,UAAU;IACV,eAAiC;E1Co2OvC;E0C9pPF;IzC8KI,sByC8I8D;E1Cq2OhE;E0CjqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C22OvC;E0CrqPF;IzC8KI,uByC8I8D;E1C42OhE;E0CxqPF;IAyTQ,UAAU;IACV,UAAiC;E1Ck3OvC;E0C5qPF;IzC8KI,iByC8I8D;E1Cm3OhE;E0C/qPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cy3OvC;E0CnrPF;IzC8KI,uByC8I8D;E1C03OhE;E0CtrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cg4OvC;E0C1rPF;IzC8KI,uByC8I8D;E1Ci4OhE;E0C7rPF;IAyTQ,UAAU;IACV,UAAiC;E1Cu4OvC;E0CjsPF;IzC8KI,iByC8I8D;E1Cw4OhE;E0CpsPF;IAyTQ,UAAU;IACV,gBAAiC;E1C84OvC;E0CxsPF;IzC8KI,uByC8I8D;E1C+4OhE;E0C3sPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cq5OvC;E0C/sPF;IzC8KI,uByC8I8D;E1Cs5OhE;E0CltPF;IAyTQ,UAAU;IACV,UAAiC;E1C45OvC;E0CttPF;IzC8KI,iByC8I8D;E1C65OhE;E0CztPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm6OvC;E0C7tPF;IzC8KI,uByC8I8D;E1Co6OhE;E0ChuPF;IAyTQ,UAAU;IACV,gBAAiC;E1C06OvC;E0CpuPF;IzC8KI,uByC8I8D;E1C26OhE;E0CvuPF;IAyTQ,UAAU;IACV,WAAiC;E1Ci7OvC;E0C3uPF;IzC8KI,kByC8I8D;E1Ck7OhE;AACF;;AC9mPI;EyCjIJ;IA+TM,UAAU;IACV,YAAY;E1Cq7OhB;E0CrvPF;IAkUM,UAAU;IACV,WAAW;E1Cs7Of;E0CzvPF;IAqUM,UAAU;IACV,UAAU;E1Cu7Od;E0C7vPF;IAwUM,UAAU;IACV,eAAe;E1Cw7OnB;E0CjwPF;IA2UM,UAAU;IACV,UAAU;E1Cy7Od;E0CrwPF;IA8UM,UAAU;IACV,eAAe;E1C07OnB;E0CzwPF;IAiVM,UAAU;IACV,UAAU;E1C27Od;E0C7wPF;IAoVM,UAAU;IACV,UAAU;E1C47Od;E0CjxPF;IAuVM,UAAU;IACV,UAAU;E1C67Od;E0CrxPF;IA0VM,UAAU;IACV,UAAU;E1C87Od;E0CzxPF;IA6VM,UAAU;IACV,UAAU;E1C+7Od;E0C7xPF;IzC8KI,iByCkLqC;E1Cg8OvC;E0ChyPF;IzC8KI,sByCoL0C;E1Ci8O5C;E0CnyPF;IzC8KI,iByCsLqC;E1Ck8OvC;E0CtyPF;IzC8KI,sByCwL0C;E1Cm8O5C;E0CzyPF;IzC8KI,iByC0LqC;E1Co8OvC;E0C5yPF;IzC8KI,iByC4LqC;E1Cq8OvC;E0C/yPF;IzC8KI,iByC8LqC;E1Cs8OvC;E0ClzPF;IzC8KI,iByCgMqC;E1Cu8OvC;E0CrzPF;IzC8KI,iByCkMqC;E1Cw8OvC;E0CxzPF;IAmXQ,UAAU;IACV,SAAiC;E1Cw8OvC;E0C5zPF;IzC8KI,gByCwM8D;E1Cy8OhE;E0C/zPF;IAmXQ,UAAU;IACV,eAAiC;E1C+8OvC;E0Cn0PF;IzC8KI,sByCwM8D;E1Cg9OhE;E0Ct0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs9OvC;E0C10PF;IzC8KI,uByCwM8D;E1Cu9OhE;E0C70PF;IAmXQ,UAAU;IACV,UAAiC;E1C69OvC;E0Cj1PF;IzC8KI,iByCwM8D;E1C89OhE;E0Cp1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Co+OvC;E0Cx1PF;IzC8KI,uByCwM8D;E1Cq+OhE;E0C31PF;IAmXQ,UAAU;IACV,gBAAiC;E1C2+OvC;E0C/1PF;IzC8KI,uByCwM8D;E1C4+OhE;E0Cl2PF;IAmXQ,UAAU;IACV,UAAiC;E1Ck/OvC;E0Ct2PF;IzC8KI,iByCwM8D;E1Cm/OhE;E0Cz2PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cy/OvC;E0C72PF;IzC8KI,uByCwM8D;E1C0/OhE;E0Ch3PF;IAmXQ,UAAU;IACV,gBAAiC;E1CggPvC;E0Cp3PF;IzC8KI,uByCwM8D;E1CigPhE;E0Cv3PF;IAmXQ,UAAU;IACV,UAAiC;E1CugPvC;E0C33PF;IzC8KI,iByCwM8D;E1CwgPhE;E0C93PF;IAmXQ,UAAU;IACV,gBAAiC;E1C8gPvC;E0Cl4PF;IzC8KI,uByCwM8D;E1C+gPhE;E0Cr4PF;IAmXQ,UAAU;IACV,gBAAiC;E1CqhPvC;E0Cz4PF;IzC8KI,uByCwM8D;E1CshPhE;E0C54PF;IAmXQ,UAAU;IACV,WAAiC;E1C4hPvC;E0Ch5PF;IzC8KI,kByCwM8D;E1C6hPhE;AACF;;ACpwPI;EyChJJ;IAyXM,UAAU;IACV,YAAY;E1CgiPhB;E0C15PF;IA4XM,UAAU;IACV,WAAW;E1CiiPf;E0C95PF;IA+XM,UAAU;IACV,UAAU;E1CkiPd;E0Cl6PF;IAkYM,UAAU;IACV,eAAe;E1CmiPnB;E0Ct6PF;IAqYM,UAAU;IACV,UAAU;E1CoiPd;E0C16PF;IAwYM,UAAU;IACV,eAAe;E1CqiPnB;E0C96PF;IA2YM,UAAU;IACV,UAAU;E1CsiPd;E0Cl7PF;IA8YM,UAAU;IACV,UAAU;E1CuiPd;E0Ct7PF;IAiZM,UAAU;IACV,UAAU;E1CwiPd;E0C17PF;IAoZM,UAAU;IACV,UAAU;E1CyiPd;E0C97PF;IAuZM,UAAU;IACV,UAAU;E1C0iPd;E0Cl8PF;IzC8KI,iByC4OqC;E1C2iPvC;E0Cr8PF;IzC8KI,sByC8O0C;E1C4iP5C;E0Cx8PF;IzC8KI,iByCgPqC;E1C6iPvC;E0C38PF;IzC8KI,sByCkP0C;E1C8iP5C;E0C98PF;IzC8KI,iByCoPqC;E1C+iPvC;E0Cj9PF;IzC8KI,iByCsPqC;E1CgjPvC;E0Cp9PF;IzC8KI,iByCwPqC;E1CijPvC;E0Cv9PF;IzC8KI,iByC0PqC;E1CkjPvC;E0C19PF;IzC8KI,iByC4PqC;E1CmjPvC;E0C79PF;IA6aQ,UAAU;IACV,SAAiC;E1CmjPvC;E0Cj+PF;IzC8KI,gByCkQ8D;E1CojPhE;E0Cp+PF;IA6aQ,UAAU;IACV,eAAiC;E1C0jPvC;E0Cx+PF;IzC8KI,sByCkQ8D;E1C2jPhE;E0C3+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CikPvC;E0C/+PF;IzC8KI,uByCkQ8D;E1CkkPhE;E0Cl/PF;IA6aQ,UAAU;IACV,UAAiC;E1CwkPvC;E0Ct/PF;IzC8KI,iByCkQ8D;E1CykPhE;E0Cz/PF;IA6aQ,UAAU;IACV,gBAAiC;E1C+kPvC;E0C7/PF;IzC8KI,uByCkQ8D;E1CglPhE;E0ChgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CslPvC;E0CpgQF;IzC8KI,uByCkQ8D;E1CulPhE;E0CvgQF;IA6aQ,UAAU;IACV,UAAiC;E1C6lPvC;E0C3gQF;IzC8KI,iByCkQ8D;E1C8lPhE;E0C9gQF;IA6aQ,UAAU;IACV,gBAAiC;E1ComPvC;E0ClhQF;IzC8KI,uByCkQ8D;E1CqmPhE;E0CrhQF;IA6aQ,UAAU;IACV,gBAAiC;E1C2mPvC;E0CzhQF;IzC8KI,uByCkQ8D;E1C4mPhE;E0C5hQF;IA6aQ,UAAU;IACV,UAAiC;E1CknPvC;E0ChiQF;IzC8KI,iByCkQ8D;E1CmnPhE;E0CniQF;IA6aQ,UAAU;IACV,gBAAiC;E1CynPvC;E0CviQF;IzC8KI,uByCkQ8D;E1C0nPhE;E0C1iQF;IA6aQ,UAAU;IACV,gBAAiC;E1CgoPvC;E0C9iQF;IzC8KI,uByCkQ8D;E1CioPhE;E0CjjQF;IA6aQ,UAAU;IACV,WAAiC;E1CuoPvC;E0CrjQF;IzC8KI,kByCkQ8D;E1CwoPhE;AACF;;A0CvoPA;EzCpQI,sByChLgB;EzCgLhB,qByChLgB;EAublB,oBAvbkB;A1CikQpB;;A0C7oPA;EAKI,uBAzbgB;A1CqkQpB;;A0CjpPA;EAOI,qCAA4C;A1C8oPhD;;A0CrpPA;EAUI,uBAAuB;A1C+oP3B;;A0CzpPA;EzCpQI,eyCgRiC;EzChRjC,cyCiRiC;EACjC,aAAa;A1CipPjB;;A0C/pPA;EAgBM,SAAS;EACT,qBAAqB;A1CmpP3B;;A0CpqPA;EAmBM,qBAAqB;A1CqpP3B;;A0CxqPA;EAqBM,gBAAgB;A1CupPtB;;A0C5qPA;EAuBI,aAAa;A1CypPjB;;A0ChrPA;EAyBI,eAAe;A1C2pPnB;;A0CprPA;EA2BI,mBAAmB;A1C6pPvB;;ACpgQE;EyC4UF;IA+BM,aAAa;E1C8pPjB;AACF;;AC9/PE;EyCgUF;IAmCM,aAAa;E1CgqPjB;AACF;;A0C9pPE;EACE,oBAAY;EzC3SZ,yCyC4S2D;EzC5S3D,wCyC6S2D;A1CiqP/D;;A0CpqPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1CmqPrC;;A0CzqPE;EASM,iBAAY;A1CoqPpB;;ACniQE;EyCsXA;IAYQ,iBAAY;E1CsqPpB;AACF;;ACriQE;EyCkXA;IAeQ,iBAAY;E1CyqPpB;AACF;;ACviQE;EyC8WA;IAkBQ,iBAAY;E1C4qPpB;AACF;;ACziQE;EyC0WA;IAqBQ,iBAAY;E1C+qPpB;AACF;;AC3iQE;EyCsWA;IAwBQ,iBAAY;E1CkrPpB;AACF;;AC5iQI;EyCiWF;IA2BQ,iBAAY;E1CqrPpB;AACF;;ACxiQI;EyCuVF;IA8BQ,iBAAY;E1CwrPpB;AACF;;ACziQI;EyCkVF;IAiCQ,iBAAY;E1C2rPpB;AACF;;ACriQI;EyCwUF;IAoCQ,iBAAY;E1C8rPpB;AACF;;A0CnuPE;EASM,oBAAY;A1C8tPpB;;AC7lQE;EyCsXA;IAYQ,oBAAY;E1CguPpB;AACF;;AC/lQE;EyCkXA;IAeQ,oBAAY;E1CmuPpB;AACF;;ACjmQE;EyC8WA;IAkBQ,oBAAY;E1CsuPpB;AACF;;ACnmQE;EyC0WA;IAqBQ,oBAAY;E1CyuPpB;AACF;;ACrmQE;EyCsWA;IAwBQ,oBAAY;E1C4uPpB;AACF;;ACtmQI;EyCiWF;IA2BQ,oBAAY;E1C+uPpB;AACF;;AClmQI;EyCuVF;IA8BQ,oBAAY;E1CkvPpB;AACF;;ACnmQI;EyCkVF;IAiCQ,oBAAY;E1CqvPpB;AACF;;AC/lQI;EyCwUF;IAoCQ,oBAAY;E1CwvPpB;AACF;;A0C7xPE;EASM,mBAAY;A1CwxPpB;;ACvpQE;EyCsXA;IAYQ,mBAAY;E1C0xPpB;AACF;;ACzpQE;EyCkXA;IAeQ,mBAAY;E1C6xPpB;AACF;;AC3pQE;EyC8WA;IAkBQ,mBAAY;E1CgyPpB;AACF;;AC7pQE;EyC0WA;IAqBQ,mBAAY;E1CmyPpB;AACF;;AC/pQE;EyCsWA;IAwBQ,mBAAY;E1CsyPpB;AACF;;AChqQI;EyCiWF;IA2BQ,mBAAY;E1CyyPpB;AACF;;AC5pQI;EyCuVF;IA8BQ,mBAAY;E1C4yPpB;AACF;;AC7pQI;EyCkVF;IAiCQ,mBAAY;E1C+yPpB;AACF;;ACzpQI;EyCwUF;IAoCQ,mBAAY;E1CkzPpB;AACF;;A0Cv1PE;EASM,oBAAY;A1Ck1PpB;;ACjtQE;EyCsXA;IAYQ,oBAAY;E1Co1PpB;AACF;;ACntQE;EyCkXA;IAeQ,oBAAY;E1Cu1PpB;AACF;;ACrtQE;EyC8WA;IAkBQ,oBAAY;E1C01PpB;AACF;;ACvtQE;EyC0WA;IAqBQ,oBAAY;E1C61PpB;AACF;;ACztQE;EyCsWA;IAwBQ,oBAAY;E1Cg2PpB;AACF;;AC1tQI;EyCiWF;IA2BQ,oBAAY;E1Cm2PpB;AACF;;ACttQI;EyCuVF;IA8BQ,oBAAY;E1Cs2PpB;AACF;;ACvtQI;EyCkVF;IAiCQ,oBAAY;E1Cy2PpB;AACF;;ACntQI;EyCwUF;IAoCQ,oBAAY;E1C42PpB;AACF;;A0Cj5PE;EASM,iBAAY;A1C44PpB;;AC3wQE;EyCsXA;IAYQ,iBAAY;E1C84PpB;AACF;;AC7wQE;EyCkXA;IAeQ,iBAAY;E1Ci5PpB;AACF;;AC/wQE;EyC8WA;IAkBQ,iBAAY;E1Co5PpB;AACF;;ACjxQE;EyC0WA;IAqBQ,iBAAY;E1Cu5PpB;AACF;;ACnxQE;EyCsWA;IAwBQ,iBAAY;E1C05PpB;AACF;;ACpxQI;EyCiWF;IA2BQ,iBAAY;E1C65PpB;AACF;;AChxQI;EyCuVF;IA8BQ,iBAAY;E1Cg6PpB;AACF;;ACjxQI;EyCkVF;IAiCQ,iBAAY;E1Cm6PpB;AACF;;AC7wQI;EyCwUF;IAoCQ,iBAAY;E1Cs6PpB;AACF;;A0C38PE;EASM,oBAAY;A1Cs8PpB;;ACr0QE;EyCsXA;IAYQ,oBAAY;E1Cw8PpB;AACF;;ACv0QE;EyCkXA;IAeQ,oBAAY;E1C28PpB;AACF;;ACz0QE;EyC8WA;IAkBQ,oBAAY;E1C88PpB;AACF;;AC30QE;EyC0WA;IAqBQ,oBAAY;E1Ci9PpB;AACF;;AC70QE;EyCsWA;IAwBQ,oBAAY;E1Co9PpB;AACF;;AC90QI;EyCiWF;IA2BQ,oBAAY;E1Cu9PpB;AACF;;AC10QI;EyCuVF;IA8BQ,oBAAY;E1C09PpB;AACF;;AC30QI;EyCkVF;IAiCQ,oBAAY;E1C69PpB;AACF;;ACv0QI;EyCwUF;IAoCQ,oBAAY;E1Cg+PpB;AACF;;A0CrgQE;EASM,mBAAY;A1CggQpB;;AC/3QE;EyCsXA;IAYQ,mBAAY;E1CkgQpB;AACF;;ACj4QE;EyCkXA;IAeQ,mBAAY;E1CqgQpB;AACF;;ACn4QE;EyC8WA;IAkBQ,mBAAY;E1CwgQpB;AACF;;ACr4QE;EyC0WA;IAqBQ,mBAAY;E1C2gQpB;AACF;;ACv4QE;EyCsWA;IAwBQ,mBAAY;E1C8gQpB;AACF;;ACx4QI;EyCiWF;IA2BQ,mBAAY;E1CihQpB;AACF;;ACp4QI;EyCuVF;IA8BQ,mBAAY;E1CohQpB;AACF;;ACr4QI;EyCkVF;IAiCQ,mBAAY;E1CuhQpB;AACF;;ACj4QI;EyCwUF;IAoCQ,mBAAY;E1C0hQpB;AACF;;A0C/jQE;EASM,oBAAY;A1C0jQpB;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AGI,yBAAgD;A7Cg0RxD;;A6C/zRI;EACE,oCAAyC;A7Ck0R/C;;A6Ch0RI;EACE,yBAA6B;A7Cm0RnC;;A6Cl0RI;EAGI,yBAAgD;A7Cm0RxD;;A6Cl0RI;EACE,oCAAwC;A7Cq0R9C;;A6Cj2RE;EACE,yBAAwB;A7Co2R5B;;A6Cn2RE;EAGI,yBAA0C;A7Co2RhD;;A6Cn2RE;EACE,oCAAmC;A7Cs2RvC;;A6Cj2RI;EACE,yBAA8B;A7Co2RpC;;A6Cn2RI;EAGI,yBAAgD;A7Co2RxD;;A6Cn2RI;EACE,oCAAyC;A7Cs2R/C;;A6Cp2RI;EACE,yBAA6B;A7Cu2RnC;;A6Ct2RI;EAGI,yBAAgD;A7Cu2RxD;;A6Ct2RI;EACE,oCAAwC;A7Cy2R9C;;A6Cr4RE;EACE,yBAAwB;A7Cw4R5B;;A6Cv4RE;EAGI,yBAA0C;A7Cw4RhD;;A6Cv4RE;EACE,oCAAmC;A7C04RvC;;A6Cr4RI;EACE,yBAA8B;A7Cw4RpC;;A6Cv4RI;EAGI,yBAAgD;A7Cw4RxD;;A6Cv4RI;EACE,oCAAyC;A7C04R/C;;A6Cx4RI;EACE,yBAA6B;A7C24RnC;;A6C14RI;EAGI,yBAAgD;A7C24RxD;;A6C14RI;EACE,oCAAwC;A7C64R9C;;A6Cz6RE;EACE,yBAAwB;A7C46R5B;;A6C36RE;EAGI,yBAA0C;A7C46RhD;;A6C36RE;EACE,oCAAmC;A7C86RvC;;A6Cz6RI;EACE,yBAA8B;A7C46RpC;;A6C36RI;EAGI,yBAAgD;A7C46RxD;;A6C36RI;EACE,oCAAyC;A7C86R/C;;A6C56RI;EACE,yBAA6B;A7C+6RnC;;A6C96RI;EAGI,yBAAgD;A7C+6RxD;;A6C96RI;EACE,oCAAwC;A7Ci7R9C;;A6C78RE;EACE,yBAAwB;A7Cg9R5B;;A6C/8RE;EAGI,yBAA0C;A7Cg9RhD;;A6C/8RE;EACE,oCAAmC;A7Ck9RvC;;A6C78RI;EACE,yBAA8B;A7Cg9RpC;;A6C/8RI;EAGI,yBAAgD;A7Cg9RxD;;A6C/8RI;EACE,oCAAyC;A7Ck9R/C;;A6Ch9RI;EACE,yBAA6B;A7Cm9RnC;;A6Cl9RI;EAGI,yBAAgD;A7Cm9RxD;;A6Cl9RI;EACE,oCAAwC;A7Cq9R9C;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,yBAAwB;A7Cq+R5B;;A6Cp+RE;EACE,oCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A6Cl/RE;EACE,yBAAwB;A7Cq/R5B;;A6Cp/RE;EACE,oCAAmC;A7Cu/RvC;;A6C1/RE;EACE,yBAAwB;A7C6/R5B;;A6C5/RE;EACE,oCAAmC;A7C+/RvC;;A6ClgSE;EACE,yBAAwB;A7CqgS5B;;A6CpgSE;EACE,oCAAmC;A7CugSvC;;A6C1gSE;EACE,4BAAwB;A7C6gS5B;;A6C5gSE;EACE,uCAAmC;A7C+gSvC;;A6ClhSE;EACE,yBAAwB;A7CqhS5B;;A6CphSE;EACE,oCAAmC;A7CuhSvC;;A8C3jSE;EACE,8BAAiC;A9C8jSrC;;A8C/jSE;EACE,sCAAiC;A9CkkSrC;;A8CnkSE;EACE,iCAAiC;A9CskSrC;;A8CvkSE;EACE,yCAAiC;A9C0kSrC;;A8CtkSE;EACE,4BAA4B;A9CykShC;;A8C1kSE;EACE,0BAA4B;A9C6kShC;;A8C9kSE;EACE,kCAA4B;A9CilShC;;A8C7kSE;EACE,sCAAkC;A9CglStC;;A8CjlSE;EACE,oCAAkC;A9ColStC;;A8CrlSE;EACE,kCAAkC;A9CwlStC;;A8CzlSE;EACE,yCAAkC;A9C4lStC;;A8C7lSE;EACE,wCAAkC;A9CgmStC;;A8CjmSE;EACE,wCAAkC;A9ComStC;;A8CrmSE;EACE,iCAAkC;A9CwmStC;;A8CzmSE;EACE,+BAAkC;A9C4mStC;;A8C7mSE;EACE,gCAAkC;A9CgnStC;;A8CjnSE;EACE,iCAAkC;A9ConStC;;A8ChnSE;EACE,oCAAgC;A9CmnSpC;;A8CpnSE;EACE,kCAAgC;A9CunSpC;;A8CxnSE;EACE,gCAAgC;A9C2nSpC;;A8C5nSE;EACE,uCAAgC;A9C+nSpC;;A8ChoSE;E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4T/B;EoDv4TE;IACE,0BAA2B;EpDy4T/B;EoD14TE;IACE,4BAA2B;EpD44T/B;EoD74TE;IACE,6BAA2B;EpD+4T/B;EoDh5TE;IACE,0BAA2B;EpDk5T/B;EoDn5TE;IACE,6BAA2B;EpDq5T/B;AACF;;ACvxTI;EmDhIA;IACE,0BAA2B;EpD25T/B;EoD55TE;IACE,4BAA2B;EpD85T/B;EoD/5TE;IACE,0BAA2B;EpDi6T/B;EoDl6TE;IACE,4BAA2B;EpDo6T/B;EoDr6TE;IACE,6BAA2B;EpDu6T/B;EoDx6TE;IACE,0BAA2B;EpD06T/B;EoD36TE;IACE,6BAA2B;EpD66T/B;AACF;;AChyTI;EmD/IA;IACE,0BAA2B;EpDm7T/B;EoDp7TE;IACE,4BAA2B;EpDs7T/B;EoDv7TE;IACE,0BAA2B;EpDy7T/B;EoD17TE;IACE,4BAA2B;EpD47T/B;EoD77TE;IACE,6BAA2B;EpD+7T/B;EoDh8TE;IACE,0BAA2B;EpDk8T/B;EoDn8TE;IACE,6BAA2B;EpDq8T/B;AACF;;AoD76TE;EACE,6BAAqC;ApDg7TzC;;AoDj7TE;EACE,8BAAqC;ApDo7TzC;;AoDr7TE;EACE,2BAAqC;ApDw7TzC;;AoDz7TE;EACE,4BAAqC;ApD47TzC;;ACt3TE;EmDlEE;IACE,6BAAqC;EpD47TzC;AACF;;ACx3TE;EmDnEE;IACE,6BAAqC;EpD+7TzC;AACF;;AC13TE;EmDpEE;IACE,6BAAqC;EpDk8TzC;AACF;;AC53TE;EmDrEE;IACE,6BAAqC;EpDq8TzC;AACF;;AC93TE;EmDtEE;IACE,6BAAqC;EpDw8TzC;AACF;;AC/3TI;EmDxEA;IACE,6BAAqC;EpD28TzC;AACF;;AC33TI;EmD/EA;IACE,6BAAqC;EpD88TzC;AACF;;AC53TI;EmDjFA;IACE,6BAAqC;EpDi9TzC;AACF;;ACx3TI;EmDxFA;IACE,6BAAqC;EpDo9TzC;AACF;;AC56TE;EmDlEE;IACE,8BAAqC;EpDk/TzC;AACF;;AC96TE;EmDnEE;IACE,8BAAqC;EpDq/TzC;AACF;;ACh7TE;EmDpEE;IACE,8BAAqC;EpDw/TzC;AACF;;ACl7TE;EmDrEE;IACE,8BAAqC;EpD2/TzC;AACF;;ACp7TE;EmDtEE;IACE,8BAAqC;EpD8/TzC;AACF;;ACr7TI;EmDxEA;IACE,8BAAqC;EpDigUzC;AACF;;ACj7TI;EmD/EA;IACE,8BAAqC;EpDogUzC;AACF;;ACl7TI;EmDjFA;IACE,8BAAqC;EpDugUzC;AACF;;AC96TI;EmDxFA;IACE,8BAAqC;EpD0gUzC;AACF;;ACl+TE;EmDlEE;IACE,2BAAqC;EpDwiUzC;AACF;;ACp+TE;EmDnEE;IACE,2BAAqC;EpD2iUzC;AACF;;ACt+TE;EmDpEE;IACE,2BAAqC;EpD8iUzC;AACF;;ACx+TE;EmDrEE;IACE,2BAAqC;EpDijUzC;AACF;;AC1+TE;EmDtEE;IACE,2BAAqC;EpDojUzC;AACF;;AC3+TI;EmDxEA;IACE,2BAAqC;EpDujUzC;AACF;;ACv+TI;EmD/EA;IACE,2BAAqC;EpD0jUzC;AACF;;ACx+TI;EmDjFA;IACE,2BAAqC;EpD6jUzC;AACF;;ACp+TI;EmDxFA;IACE,2BAAqC;EpDgkUzC;AACF;;ACxhUE;EmDlEE;IACE,4BAAqC;EpD8lUzC;AACF;;AC1hUE;EmDnEE;IACE,4BAAqC;EpDimUzC;AACF;;AC5hUE;EmDpEE;IACE,4BAAqC;EpDomUzC;AACF;;AC9hUE;EmDrEE;IACE,4BAAqC;EpDumUzC;AACF;;AChiUE;EmDtEE;IACE,4BAAqC;EpD0mUzC;AACF;;ACjiUI;EmDxEA;IACE,4BAAqC;EpD6mUzC;AACF;;AC7hUI;EmD/EA;IACE,4BAAqC;EpDgnUzC;AACF;;AC9hUI;EmDjFA;IACE,4BAAqC;EpDmnUzC;AACF;;AC1hUI;EmDxFA;IACE,4BAAqC;EpDsnUzC;AACF;;AoDrnUA;EACE,qCAAqC;ApDwnUvC;;AoDtnUA;EACE,oCAAoC;ApDynUtC;;AoDvnUA;EACE,oCAAoC;ApD0nUtC;;AoDxnUA;EACE,6BAA6B;ApD2nU/B;;AoDznUA;EACE,qCAAqC;ApD4nUvC;;AoD1nUA;EACE,2BAAqC;ApD6nUvC;;AoD5nUA;EACE,2BAAsC;ApD+nUxC;;AoD9nUA;EACE,2BAAsC;ApDioUxC;;AoDhoUA;EACE,2BAAwC;ApDmoU1C;;AoDloUA;EACE,2BAAoC;ApDqoUtC;;AoDnoUA;EACE,+LAAuC;ApDsoUzC;;AoDpoUA;EACE,+LAAyC;ApDuoU3C;;AoDroUA;EACE,+LAA0C;ApDwoU5C;;AoDtoUA;EACE,iCAAyC;ApDyoU3C;;AoDvoUA;EACE,iCAAoC;ApD0oUtC;;AqD3uUE;EACE,yBAA+B;ArD8uUnC;;AC9oUE;EoD9FE;IACE,yBAA+B;ErDgvUnC;AACF;;AChpUE;EoD/FE;IACE,yBAA+B;ErDmvUnC;AACF;;AClpUE;EoDhGE;IACE,yBAA+B;ErDsvUnC;AACF;;ACppUE;EoDjGE;IACE,yBAA+B;ErDyvUnC;AACF;;ACtpUE;EoDlGE;IACE,yBAA+B;ErD4vUnC;AACF;;ACvpUI;EoDpGA;IACE,yBAA+B;ErD+vUnC;AACF;;ACnpUI;EoD3GA;IACE,yBAA+B;ErDkwUnC;AACF;;ACppUI;EoD7GA;IACE,yBAA+B;ErDqwUnC;AACF;;AChpUI;EoDpHA;IACE,yBAA+B;ErDwwUnC;AACF;;AqDryUE;EACE,wBAA+B;ArDwyUnC;;ACxsUE;EoD9FE;IACE,wBAA+B;ErD0yUnC;AACF;;AC1sUE;EoD/FE;IACE,wBAA+B;ErD6yUnC;AACF;;AC5sUE;EoDhGE;IACE,wBAA+B;ErDgzUnC;AACF;;AC9sUE;EoDjGE;IACE,wBAA+B;ErDmzUnC;AACF;;AChtUE;EoDlGE;IACE,wBAA+B;ErDszUnC;AACF;;ACjtUI;EoDpGA;IACE,wBAA+B;ErDyzUnC;AACF;;AC7sUI;EoD3GA;IACE,wBAA+B;ErD4zUnC;AACF;;AC9sUI;EoD7GA;IACE,wBAA+B;ErD+zUnC;AACF;;AC1sUI;EoDpHA;IACE,wBAA+B;ErDk0UnC;AACF;;AqD/1UE;EACE,0BAA+B;ArDk2UnC;;AClwUE;EoD9FE;IACE,0BAA+B;ErDo2UnC;AACF;;ACpwUE;EoD/FE;IACE,0BAA+B;ErDu2UnC;AACF;;ACtwUE;EoDhGE;IACE,0BAA+B;ErD02UnC;AACF;;ACxwUE;EoDjGE;IACE,0BAA+B;ErD62UnC;AACF;;AC1wUE;EoDlGE;IACE,0BAA+B;ErDg3UnC;AACF;;AC3wUI;EoDpGA;IACE,0BAA+B;ErDm3UnC;AACF;;ACvwUI;EoD3GA;IACE,0BAA+B;ErDs3UnC;AACF;;ACxwUI;EoD7GA;IACE,0BAA+B;ErDy3UnC;AACF;;ACpwUI;EoDpHA;IACE,0BAA+B;ErD43UnC;AACF;;AqDz5UE;EACE,gCAA+B;ArD45UnC;;AC5zUE;EoD9FE;IACE,gCAA+B;ErD85UnC;AACF;;AC9zUE;EoD/FE;IACE,gCAA+B;ErDi6UnC;AACF;;ACh0UE;EoDhGE;IACE,gCAA+B;ErDo6UnC;AACF;;ACl0UE;EoDjGE;IACE,gCAA+B;ErDu6UnC;AACF;;ACp0UE;EoDlGE;IACE,gCAA+B;ErD06UnC;AACF;;ACr0UI;EoDpGA;IACE,gCAA+B;ErD66UnC;AACF;;ACj0UI;EoD3GA;IACE,gCAA+B;ErDg7UnC;AACF;;ACl0UI;EoD7GA;IACE,gCAA+B;ErDm7UnC;AACF;;AC9zUI;EoDpHA;IACE,gCAA+B;ErDs7UnC;AACF;;AqDn9UE;EACE,+BAA+B;ArDs9UnC;;ACt3UE;EoD9FE;IACE,+BAA+B;ErDw9UnC;AACF;;ACx3UE;EoD/FE;IACE,+BAA+B;ErD29UnC;AACF;;AC13UE;EoDhGE;IACE,+BAA+B;ErD89UnC;AACF;;AC53UE;EoDjGE;IACE,+BAA+B;ErDi+UnC;AACF;;AC93UE;EoDlGE;IACE,+BAA+B;ErDo+UnC;AACF;;AC/3UI;EoDpGA;IACE,+BAA+B;ErDu+UnC;AACF;;AC33UI;EoD3GA;IACE,+BAA+B;ErD0+UnC;AACF;;AC53UI;EoD7GA;IACE,+BAA+B;ErD6+UnC;AACF;;ACx3UI;EoDpHA;IACE,+BAA+B;ErDg/UnC;AACF;;AqD/+UA;EACE,wBAAwB;ArDk/U1B;;AqDh/UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArDm/U1B;;AC37UE;EoDrDA;IACE,wBAAwB;ErDo/U1B;AACF;;AC77UE;EoDrDA;IACE,wBAAwB;ErDs/U1B;AACF;;AC/7UE;EoDrDA;IACE,wBAAwB;ErDw/U1B;AACF;;ACj8UE;EoDrDA;IACE,wBAAwB;ErD0/U1B;AACF;;ACn8UE;EoDrDA;IACE,wBAAwB;ErD4/U1B;AACF;;ACp8UI;EoDtDF;IACE,wBAAwB;ErD8/U1B;AACF;;ACh8UI;EoD5DF;IACE,wBAAwB;ErDggV1B;AACF;;ACj8UI;EoD7DF;IACE,wBAAwB;ErDkgV1B;AACF;;AC77UI;EoDnEF;IACE,wBAAwB;ErDogV1B;AACF;;AqDngVA;EACE,6BAA6B;ArDsgV/B;;ACr/UE;EoDdA;IACE,6BAA6B;ErDugV/B;AACF;;ACv/UE;EoDdA;IACE,6BAA6B;ErDygV/B;AACF;;ACz/UE;EoDdA;IACE,6BAA6B;ErD2gV/B;AACF;;AC3/UE;EoDdA;IACE,6BAA6B;ErD6gV/B;AACF;;AC7/UE;EoDdA;IACE,6BAA6B;ErD+gV/B;AACF;;AC9/UI;EoDfF;IACE,6BAA6B;ErDihV/B;AACF;;AC1/UI;EoDrBF;IACE,6BAA6B;ErDmhV/B;AACF;;AC3/UI;EoDtBF;IACE,6BAA6B;ErDqhV/B;AACF;;ACv/UI;EoD5BF;IACE,6BAA6B;ErDuhV/B;AACF;;AsDjpVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvD0oVhC;;AuD9oVA;EAMI,gBAAgB;AvD4oVpB;;AuDlpVA;EASM,mBAAmB;AvD6oVzB;;AuDtpVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;ACoqV7B;;AuD3pVA;;EAmBQ,cAAc;AvD6oVtB;;AuDhqVA;EAqBQ,cxD9BqB;AC6qV7B;;AuDpqVA;EAuBQ,4BxDhCqB;ACirV7B;;AuDxqVA;;EA0BU,cxDnCmB;ACsrV7B;;ACtkVE;EsDvGF;IA6BU,uBxDzBqB;EC8qV7B;AACF;;AuDnrVA;;EAgCQ,4BxDzCqB;ACisV7B;;AuDxrVA;;;EAqCU,yB7C4DuB;E6C3DvB,cxD/CmB;ACwsV7B;;AuD/rVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvD0pVtB;;AuDpsVA;EA4CY,UAAU;AvD4pVtB;;AuDxsVA;EA+CY,uBAAwB;EACxB,UAAU;AvD6pVtB;;AuD7sVA;EAoDY,cxD7DiB;AC0tV7B;;AuDjtVA;EAsDc,uCxD/De;AC8tV7B;;AuDrtVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;ACutV/B;;AuD3tVA;EAkEU,4EAAyG;AvD6pVnH;;ACpoVE;EsD3FF;IAqEc,4EAAyG;EvD+pVrH;AACF;;AuDruVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;ACsuV/B;;AuD1uVA;;EAmBQ,cAAc;AvD4tVtB;;AuD/uVA;EAqBQ,YxDjBuB;AC+uV/B;;AuDnvVA;EAuBQ,+BxDnBuB;ACmvV/B;;AuDvvVA;;EA0BU,YxDtBqB;ACwvV/B;;ACrpVE;EsDvGF;IA6BU,yBxDtCmB;EC0wV3B;AACF;;AuDlwVA;;EAgCQ,+BxD5BuB;ACmwV/B;;AuDvwVA;;;EAqCU,uB7C4DuB;E6C3DvB,YxDlCqB;AC0wV/B;;AuD9wVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDyuVtB;;AuDnxVA;EA4CY,UAAU;AvD2uVtB;;AuDvxVA;EA+CY,yBAAwB;EACxB,UAAU;AvD4uVtB;;AuD5xVA;EAoDY,YxDhDmB;AC4xV/B;;AuDhyVA;EAsDc,uCxD/De;AC6yV7B;;AuDpyVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;ACmzV7B;;AuD1yVA;EAkEU,8EAAyG;AvD4uVnH;;ACntVE;EsD3FF;IAqEc,8EAAyG;EvD8uVrH;AACF;;AuDpzVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AVovVrB;;AuDzzVA;;EAmBQ,cAAc;AvD2yVtB;;AuD9zVA;EAqBQ,yB7CgDa;AV6vVrB;;AuDl0VA;EAuBQ,yB7C8Ca;AViwVrB;;AuDt0VA;;EA0BU,yB7C2CW;AVswVrB;;ACpuVE;EsDvGF;IA6BU,4BxD3BoB;EC80V5B;AACF;;AuDj1VA;;EAgCQ,yB7CqCa;AVixVrB;;AuDt1VA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVwxVrB;;AuD71VA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDwzVtB;;AuDl2VA;EA4CY,UAAU;AvD0zVtB;;AuDt2VA;EA+CY,4BAAwB;EACxB,UAAU;AvD2zVtB;;AuD32VA;EAoDY,yB7CiBS;AV0yVrB;;AuD/2VA;EAsDc,uCxD/De;AC43V7B;;AuDn3VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;ACu3V9B;;AuDz3VA;EAkEU,iFAAyG;AvD2zVnH;;AClyVE;EsD3FF;IAqEc,iFAAyG;EvD6zVrH;AACF;;AuDn4VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVi0VhB;;AuDx4VA;;EAmBQ,cAAc;AvD03VtB;;AuD74VA;EAqBQ,W7CkDQ;AV00VhB;;AuDj5VA;EAuBQ,+B7CgDQ;AV80VhB;;AuDr5VA;;EA0BU,W7C6CM;AVm1VhB;;ACnzVE;EsDvGF;IA6BU,yBxDlCoB;ECo6V5B;AACF;;AuDh6VA;;EAgCQ,+B7CuCQ;AV81VhB;;AuDr6VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVq2VhB;;AuD56VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDu4VtB;;AuDj7VA;EA4CY,UAAU;AvDy4VtB;;AuDr7VA;EA+CY,yBAAwB;EACxB,UAAU;AvD04VtB;;AuD17VA;EAoDY,W7CmBI;AVu3VhB;;AuD97VA;EAsDc,uCxD/De;AC28V7B;;AuDl8VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;AC68V9B;;AuDx8VA;EAkEU,gFAAyG;AvD04VnH;;ACj3VE;EsD3FF;IAqEc,gFAAyG;EvD44VrH;AACF;;AuDl9VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVg5VhB;;AuDv9VA;;EAmBQ,cAAc;AvDy8VtB;;AuD59VA;EAqBQ,W7CkDQ;AVy5VhB;;AuDh+VA;EAuBQ,+B7CgDQ;AV65VhB;;AuDp+VA;;EA0BU,W7C6CM;AVk6VhB;;ACl4VE;EsDvGF;IA6BU,yBxDpBwB;ECq+VhC;AACF;;AuD/+VA;;EAgCQ,+B7CuCQ;AV66VhB;;AuDp/VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVo7VhB;;AuD3/VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDs9VtB;;AuDhgWA;EA4CY,UAAU;AvDw9VtB;;AuDpgWA;EA+CY,yBAAwB;EACxB,UAAU;AvDy9VtB;;AuDzgWA;EAoDY,W7CmBI;AVs8VhB;;AuD7gWA;EAsDc,uCxD/De;AC0hW7B;;AuDjhWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;AC8gWlC;;AuDvhWA;EAkEU,gFAAyG;AvDy9VnH;;ACh8VE;EsD3FF;IAqEc,gFAAyG;EvD29VrH;AACF;;AuDjiWA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AV+9VhB;;AuDtiWA;;EAmBQ,cAAc;AvDwhWtB;;AuD3iWA;EAqBQ,W7CkDQ;AVw+VhB;;AuD/iWA;EAuBQ,+B7CgDQ;AV4+VhB;;AuDnjWA;;EA0BU,W7C6CM;AVi/VhB;;ACj9VE;EsDvGF;IA6BU,yBxDlBwB;ECkjWhC;AACF;;AuD9jWA;;EAgCQ,+B7CuCQ;AV4/VhB;;AuDnkWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVmgWhB;;AuD1kWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDqiWtB;;AuD/kWA;EA4CY,UAAU;AvDuiWtB;;AuDnlWA;EA+CY,yBAAwB;EACxB,UAAU;AvDwiWtB;;AuDxlWA;EAoDY,W7CmBI;AVqhWhB;;AuD5lWA;EAsDc,uCxD/De;ACymW7B;;AuDhmWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;AC2lWlC;;AuDtmWA;EAkEU,gFAAyG;AvDwiWnH;;AC/gWE;EsD3FF;IAqEc,gFAAyG;EvD0iWrH;AACF;;AuDhnWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AV8iWhB;;AuDrnWA;;EAmBQ,cAAc;AvDumWtB;;AuD1nWA;EAqBQ,W7CkDQ;AVujWhB;;AuD9nWA;EAuBQ,+B7CgDQ;AV2jWhB;;AuDloWA;;EA0BU,W7C6CM;AVgkWhB;;AChiWE;EsDvGF;IA6BU,yBxDnBwB;ECkoWhC;AACF;;AuD7oWA;;EAgCQ,+B7CuCQ;AV2kWhB;;AuDlpWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVklWhB;;AuDzpWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDonWtB;;AuD9pWA;EA4CY,UAAU;AvDsnWtB;;AuDlqWA;EA+CY,yBAAwB;EACxB,UAAU;AvDunWtB;;AuDvqWA;EAoDY,W7CmBI;AVomWhB;;AuD3qWA;EAsDc,uCxD/De;ACwrW7B;;AuD/qWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;AC2qWlC;;AuDrrWA;EAkEU,gFAAyG;AvDunWnH;;AC9lWE;EsD3FF;IAqEc,gFAAyG;EvDynWrH;AACF;;AuD/rWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AV6nWhB;;AuDpsWA;;EAmBQ,cAAc;AvDsrWtB;;AuDzsWA;EAqBQ,W7CkDQ;AVsoWhB;;AuD7sWA;EAuBQ,+B7CgDQ;AV0oWhB;;AuDjtWA;;EA0BU,W7C6CM;AV+oWhB;;AC/mWE;EsDvGF;IA6BU,yBxDrBwB;ECmtWhC;AACF;;AuD5tWA;;EAgCQ,+B7CuCQ;AV0pWhB;;AuDjuWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AViqWhB;;AuDxuWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDmsWtB;;AuD7uWA;EA4CY,UAAU;AvDqsWtB;;AuDjvWA;EA+CY,yBAAwB;EACxB,UAAU;AvDssWtB;;AuDtvWA;EAoDY,W7CmBI;AVmrWhB;;AuD1vWA;EAsDc,uCxD/De;ACuwW7B;;AuD9vWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;AC4vWlC;;AuDpwWA;EAkEU,gFAAyG;AvDssWnH;;AC7qWE;EsD3FF;IAqEc,gFAAyG;EvDwsWrH;AACF;;AuD9wWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AV8sWrB;;AuDnxWA;;EAmBQ,cAAc;AvDqwWtB;;AuDxxWA;EAqBQ,yB7CgDa;AVutWrB;;AuD5xWA;EAuBQ,yB7C8Ca;AV2tWrB;;AuDhyWA;;EA0BU,yB7C2CW;AVguWrB;;AC9rWE;EsDvGF;IA6BU,yBxDtBwB;ECmyWhC;AACF;;AuD3yWA;;EAgCQ,yB7CqCa;AV2uWrB;;AuDhzWA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVkvWrB;;AuDvzWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDkxWtB;;AuD5zWA;EA4CY,UAAU;AvDoxWtB;;AuDh0WA;EA+CY,yBAAwB;EACxB,UAAU;AvDqxWtB;;AuDr0WA;EAoDY,yB7CiBS;AVowWrB;;AuDz0WA;EAsDc,uCxD/De;ACs1W7B;;AuD70WA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;AC40WlC;;AuDn1WA;EAkEU,gFAAyG;AvDqxWnH;;AC5vWE;EsD3FF;IAqEc,gFAAyG;EvDuxWrH;AACF;;AuD71WA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AV2xWhB;;AuDl2WA;;EAmBQ,cAAc;AvDo1WtB;;AuDv2WA;EAqBQ,W7CkDQ;AVoyWhB;;AuD32WA;EAuBQ,+B7CgDQ;AVwyWhB;;AuD/2WA;;EA0BU,W7C6CM;AV6yWhB;;AC7wWE;EsDvGF;IA6BU,yBxDhBuB;EC42W/B;AACF;;AuD13WA;;EAgCQ,+B7CuCQ;AVwzWhB;;AuD/3WA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AV+zWhB;;AuDt4WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDi2WtB;;AuD34WA;EA4CY,UAAU;AvDm2WtB;;AuD/4WA;EA+CY,yBAAwB;EACxB,UAAU;AvDo2WtB;;AuDp5WA;EAoDY,W7CmBI;AVi1WhB;;AuDx5WA;EAsDc,uCxD/De;ACq6W7B;;AuD55WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;ACq5WjC;;AuDl6WA;EAkEU,gFAAyG;AvDo2WnH;;AC30WE;EsD3FF;IAqEc,gFAAyG;EvDs2WrH;AACF;;AuD56WA;EAyEM,eAhF0B;AvDu7WhC;;ACj1WE;EsD/FF;IA6EQ,oBAnF8B;EvD27WpC;AACF;;ACv1WE;EsD/FF;IAiFQ,mBAtF4B;EvDg8WlC;AACF;;AuD57WA;EAsFM,mBAAmB;EACnB,aAAa;AvD02WnB;;AuDj8WA;EAyFQ,YAAY;EACZ,cAAc;AvD42WtB;;AuDt8WA;EA4FI,gBAAgB;AvD82WpB;;AuD18WA;EA8FI,iBAAiB;AvDg3WrB;;AuD52WA;EAEE,gBAAgB;AvD82WlB;;AuDh3WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDg3WzC;;AuDz3WA;EAYI,YAAY;AvDi3WhB;;ACp4WE;EsDOF;IAeI,aAAa;EvDm3Wf;AACF;;AuDl3WA;EACE,kBAAkB;AvDq3WpB;;AC94WE;EsDwBF;IAKM,aAAa;EvDs3WjB;EuD33WF;IAOQ,sBAAsB;EvDu3W5B;AACF;;ACn5WE;EsDoBF;IASI,aAAa;IACb,uBAAuB;EvD23WzB;EuDr4WF;ItDoDI,mBsDxCwC;EvD43W1C;AACF;;AuDz3WA;;EAEE,YAAY;EACZ,cAAc;AvD43WhB;;AuD13WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDihX/B;;ACz6WE;EsDyCF;IAKI,kBArJgC;EvDqhXlC;AACF;;AwDlhXA;EACE,oBAN2B;AxD2hX7B;;ACv6WE;EuD/GF;IAII,kBAR+B;ExD+hXjC;EwD3hXF;IAOM,oBAV8B;ExDiiXlC;EwD9hXF;IASM,mBAX4B;ExDmiXhC;AACF;;AyDniXA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzD0iXjC","file":"bulma-rtl.css"} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma.min.css b/pagetop/static/bulmix/css/bulma.min.css deleted file mode 100644 index 86ad2ff1..00000000 --- a/pagetop/static/bulmix/css/bulma.min.css +++ /dev/null @@ -1 +0,0 @@ -/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:#00d1b2;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:#485fc7;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:#3e8ed0;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:#48c78e;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:#ffe08a;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:#f14668;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.button.is-responsive.is-small{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{right:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;right:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a!important;opacity:.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link.is-disabled,.pagination-link[disabled],.pagination-next.is-disabled,.pagination-next[disabled],.pagination-previous.is-disabled,.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop/static/bulmix/css/bulma.min.css.map b/pagetop/static/bulmix/css/bulma.min.css.map deleted file mode 100644 index dbe97a3f..00000000 --- a/pagetop/static/bulmix/css/bulma.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EHvDE,iCAAiC;EGyDjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTyDgB;ESxDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AS/ZA;EAGE,uBVhD6B;EUiD7B,qBVtD4B;EUuD5B,iBX5DwB;EW6DxB,cV5D4B;EU6D5B,eAAe;EAGf,uBAAuB;EACvB,iCA7D6D;EA8D7D,iBA7D6B;EA8D7B,kBA9D6B;EA+D7B,8BAhE6D;EAiE7D,kBAAkB;EAClB,mBAAmB;AT8ZrB;;AS9aA;EAkBI,cAAc;ATgalB;;ASlbA;EAwBM,aAAa;EACb,YAAY;AT8ZlB;;ASvbA;ERwHI,+BQ7FsG;ER6FtG,oBQ5FmE;ATgavE;;AS5bA;ERwHI,mBQ1FmE;ER0FnE,gCQzFsG;ATka1G;;ASjcA;EAiCM,+BAAiF;EACjF,gCAAkF;AToaxF;;AStcA;EAsCI,qBVzF0B;EU0F1B,cV7F0B;ACigB9B;;AS3cA;EA0CI,qBVhF8B;EUiF9B,cVjG0B;ACsgB9B;;AShdA;EA6CM,iDVnF4B;AC0flC;;ASpdA;EAgDI,qBVrG0B;EUsG1B,cVvG0B;AC+gB9B;;ASzdA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV3G0B;EU4G1B,0BA1F8B;ATmgBlC;;ASheA;EA4DM,4BV3GwB;EU4GxB,cVnHwB;AC2hB9B;;ASreA;EAgEM,yBChB2B;EDiB3B,cVvHwB;ACgiB9B;;AS1eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT2atB;;ASjfA;EAwEI,gBAvG0B;EAwG1B,yBAvGmC;EAwGnC,cVhH8B;EUiH9B,qBAvG0B;ATohB9B;;ASxfA;EA8EM,cVpH4B;EUqH5B,0BAzGmC;ATuhBzC;;AS7fA;EAoFM,uBVjIyB;EUkIzB,yBAAyB;EACzB,cVhJuB;AC6jB7B;;ASngBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,cVrJqB;ACmkB7B;;ASzgBA;EA8FQ,yBAAyB;EACzB,cVzJqB;ACwkB7B;;AS9gBA;EAiGU,mDV9IqB;AC+jB/B;;ASlhBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,cVhKqB;ACklB7B;;ASxhBA;;EAyGQ,uBVtJuB;EUuJvB,mBVvJuB;EUwJvB,gBAAgB;ATobxB;;AS/hBA;EA6GQ,yBVvKqB;EUwKrB,YV3JuB;ACilB/B;;ASpiBA;EAiHU,uBCjEuB;AVwfjC;;ASxiBA;;EAoHU,yBV9KmB;EU+KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVpKqB;AC6lB/B;;AShjBA;EA0HU,gEAA4E;AT0btF;;ASpjBA;EA4HQ,6BAA6B;EAC7B,mBV1KuB;EU2KvB,YV3KuB;ACumB/B;;AS1jBA;EAmIU,uBVhLqB;EUiLrB,mBVjLqB;EUkLrB,cV/LmB;AC0nB7B;;AShkBA;EAwIY,4DAA8D;AT4b1E;;ASpkBA;EA8Ic,gEAA4E;AT0b1F;;ASxkBA;;EAiJU,6BAA6B;EAC7B,mBV/LqB;EUgMrB,gBAAgB;EAChB,YVjMqB;AC6nB/B;;AShlBA;EAsJQ,6BAA6B;EAC7B,qBVjNqB;EUkNrB,cVlNqB;ACgpB7B;;AStlBA;EA6JU,yBVvNmB;EUwNnB,YV3MqB;ACwoB/B;;AS3lBA;EAqKc,4DAA8D;AT0b5E;;AS/lBA;;EAwKU,6BAA6B;EAC7B,qBVnOmB;EUoOnB,gBAAgB;EAChB,cVrOmB;ACiqB7B;;ASvmBA;EAoFM,yBV9IuB;EU+IvB,yBAAyB;EACzB,YVnIyB;AC0pB/B;;AS7mBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,YVxIuB;ACgqB/B;;ASnnBA;EA8FQ,yBAAyB;EACzB,YV5IuB;ACqqB/B;;ASxnBA;EAiGU,gDV3JmB;ACsrB7B;;AS5nBA;EAoGQ,uBCpDyB;EDqDzB,yBAAyB;EACzB,YVnJuB;AC+qB/B;;ASloBA;;EAyGQ,yBVnKqB;EUoKrB,qBVpKqB;EUqKrB,gBAAgB;AT8hBxB;;ASzoBA;EA6GQ,uBV1JuB;EU2JvB,cVxKqB;ACwsB7B;;AS9oBA;EAiHU,yBCjEuB;AVkmBjC;;ASlpBA;;EAoHU,uBVjKqB;EUkKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVjLmB;ACotB7B;;AS1pBA;EA0HU,4DAA4E;AToiBtF;;AS9pBA;EA4HQ,6BAA6B;EAC7B,qBVvLqB;EUwLrB,cVxLqB;AC8tB7B;;ASpqBA;EAmIU,yBV7LmB;EU8LnB,qBV9LmB;EU+LnB,YVlLqB;ACutB/B;;AS1qBA;EAwIY,gEAA8D;ATsiB1E;;AS9qBA;EA8Ic,4DAA4E;AToiB1F;;ASlrBA;;EAiJU,6BAA6B;EAC7B,qBV5MmB;EU6MnB,gBAAgB;EAChB,cV9MmB;ACovB7B;;AS1rBA;EAsJQ,6BAA6B;EAC7B,mBVpMuB;EUqMvB,YVrMuB;AC6uB/B;;AShsBA;EA6JU,uBV1MqB;EU2MrB,cVxNmB;AC+vB7B;;ASrsBA;EAqKc,gEAA8D;AToiB5E;;ASzsBA;;EAwKU,6BAA6B;EAC7B,mBVtNqB;EUuNrB,gBAAgB;EAChB,YVxNqB;AC8vB/B;;ASjtBA;EAoFM,4BVnIwB;EUoIxB,yBAAyB;EACzB,yBClEe;AVmsBrB;;ASvtBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVysBrB;;AS7tBA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV8sBrB;;ASluBA;EAiGU,mDVhJoB;ACqxB9B;;AStuBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVwtBrB;;AS5uBA;;EAyGQ,4BVxJsB;EUyJtB,wBVzJsB;EU0JtB,gBAAgB;ATwoBxB;;ASnvBA;EA6GQ,oCCzFa;ED0Fb,iBV7JsB;ACuyB9B;;ASxvBA;EAiHU,oCCjEuB;AV4sBjC;;AS5vBA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVtKoB;ACmzB9B;;ASpwBA;EA0HU,sFAA4E;AT8oBtF;;ASxwBA;EA4HQ,6BAA6B;EAC7B,wBV5KsB;EU6KtB,iBV7KsB;AC6zB9B;;AS9wBA;EAmIU,4BVlLoB;EUmLpB,wBVnLoB;EUoLpB,yBCjHW;AVgwBrB;;ASpxBA;EAwIY,sEAA8D;ATgpB1E;;ASxxBA;EA8Ic,sFAA4E;AT8oB1F;;AS5xBA;;EAiJU,6BAA6B;EAC7B,wBVjMoB;EUkMpB,gBAAgB;EAChB,iBVnMoB;ACm1B9B;;ASpyBA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVsxBrB;;AS1yBA;EA6JU,oCCzIW;ED0IX,iBV7MoB;AC81B9B;;AS/yBA;EAqKc,sEAA8D;AT8oB5E;;ASnzBA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVuyBrB;;AS3zBA;EAoFM,yBV1IwB;EU2IxB,yBAAyB;EACzB,WChEU;AV2yBhB;;ASj0BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVizBhB;;ASv0BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVszBhB;;AS50BA;EAiGU,gDVvJoB;ACs4B9B;;ASh1BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVg0BhB;;ASt1BA;;EAyGQ,yBV/JsB;EUgKtB,qBVhKsB;EUiKtB,gBAAgB;ATkvBxB;;AS71BA;EA6GQ,sBCvFQ;EDwFR,cVpKsB;ACw5B9B;;ASl2BA;EAiHU,yBCjEuB;AVszBjC;;ASt2BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7KoB;ACo6B9B;;AS92BA;EA0HU,0DAA4E;ATwvBtF;;ASl3BA;EA4HQ,6BAA6B;EAC7B,qBVnLsB;EUoLtB,cVpLsB;AC86B9B;;ASx3BA;EAmIU,yBVzLoB;EU0LpB,qBV1LoB;EU2LpB,WC/GM;AVw2BhB;;AS93BA;EAwIY,gEAA8D;AT0vB1E;;ASl4BA;EA8Ic,0DAA4E;ATwvB1F;;ASt4BA;;EAiJU,6BAA6B;EAC7B,qBVxMoB;EUyMpB,gBAAgB;EAChB,cV1MoB;ACo8B9B;;AS94BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV83BhB;;ASp5BA;EA6JU,sBCvIM;EDwIN,cVpNoB;AC+8B9B;;ASz5BA;EAqKc,gEAA8D;ATwvB5E;;AS75BA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+4BhB;;ASr6BA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WChEU;AVq5BhB;;AS36BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV25BhB;;ASj7BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVg6BhB;;ASt7BA;EAiGU,iDVzIwB;ACk+BlC;;AS17BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV06BhB;;ASh8BA;;EAyGQ,yBVjJ0B;EUkJ1B,qBVlJ0B;EUmJ1B,gBAAgB;AT41BxB;;ASv8BA;EA6GQ,sBCvFQ;EDwFR,cVtJ0B;ACo/BlC;;AS58BA;EAiHU,yBCjEuB;AVg6BjC;;ASh9BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACggClC;;ASx9BA;EA0HU,0DAA4E;ATk2BtF;;AS59BA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC0gClC;;ASl+BA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC/GM;AVk9BhB;;ASx+BA;EAwIY,gEAA8D;ATo2B1E;;AS5+BA;EA8Ic,0DAA4E;ATk2B1F;;ASh/BA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACgiClC;;ASx/BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVw+BhB;;AS9/BA;EA6JU,sBCvIM;EDwIN,cVtMwB;AC2iClC;;ASngCA;EAqKc,gEAA8D;ATk2B5E;;ASvgCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVy/BhB;;AS/gCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV++BrE;;ASphCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVq/BrE;;AS1hCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV2/BrE;;AShiCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WChEU;AVghChB;;AStiCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVshChB;;AS5iCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AV2hChB;;ASjjCA;EAiGU,iDVvIwB;AC2lClC;;ASrjCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVqiChB;;AS3jCA;;EAyGQ,yBV/I0B;EUgJ1B,qBVhJ0B;EUiJ1B,gBAAgB;ATu9BxB;;ASlkCA;EA6GQ,sBCvFQ;EDwFR,cVpJ0B;AC6mClC;;ASvkCA;EAiHU,yBCjEuB;AV2hCjC;;AS3kCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACynClC;;ASnlCA;EA0HU,0DAA4E;AT69BtF;;ASvlCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;ACmoClC;;AS7lCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC/GM;AV6kChB;;ASnmCA;EAwIY,gEAA8D;AT+9B1E;;ASvmCA;EA8Ic,0DAA4E;AT69B1F;;AS3mCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACypClC;;ASnnCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVmmChB;;ASznCA;EA6JU,sBCvIM;EDwIN,cVpMwB;ACoqClC;;AS9nCA;EAqKc,gEAA8D;AT69B5E;;ASloCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVonChB;;AS1oCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV0mCrE;;AS/oCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVgnCrE;;ASrpCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVsnCrE;;AS3pCA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WChEU;AV2oChB;;ASjqCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVipChB;;ASvqCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVspChB;;AS5qCA;EAiGU,kDVxIwB;ACutClC;;AShrCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVgqChB;;AStrCA;;EAyGQ,yBVhJ0B;EUiJ1B,qBVjJ0B;EUkJ1B,gBAAgB;ATklCxB;;AS7rCA;EA6GQ,sBCvFQ;EDwFR,cVrJ0B;ACyuClC;;ASlsCA;EAiHU,yBCjEuB;AVspCjC;;AStsCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACqvClC;;AS9sCA;EA0HU,0DAA4E;ATwlCtF;;ASltCA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC+vClC;;ASxtCA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC/GM;AVwsChB;;AS9tCA;EAwIY,gEAA8D;AT0lC1E;;ASluCA;EA8Ic,0DAA4E;ATwlC1F;;AStuCA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACqxClC;;AS9uCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV8tChB;;ASpvCA;EA6JU,sBCvIM;EDwIN,cVrMwB;ACgyClC;;ASzvCA;EAqKc,gEAA8D;ATwlC5E;;AS7vCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+uChB;;ASrwCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVquCrE;;AS1wCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV2uCrE;;AShxCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVivCrE;;AStxCA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,WChEU;AVswChB;;AS5xCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV4wChB;;ASlyCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVixChB;;ASvyCA;EAiGU,kDV1IwB;ACo1ClC;;AS3yCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV2xChB;;ASjzCA;;EAyGQ,yBVlJ0B;EUmJ1B,qBVnJ0B;EUoJ1B,gBAAgB;AT6sCxB;;ASxzCA;EA6GQ,sBCvFQ;EDwFR,cVvJ0B;ACs2ClC;;AS7zCA;EAiHU,yBCjEuB;AVixCjC;;ASj0CA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;ACk3ClC;;ASz0CA;EA0HU,0DAA4E;ATmtCtF;;AS70CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;AC43ClC;;ASn1CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,WC/GM;AVm0ChB;;ASz1CA;EAwIY,gEAA8D;ATqtC1E;;AS71CA;EA8Ic,0DAA4E;ATmtC1F;;ASj2CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;ACk5ClC;;ASz2CA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVy1ChB;;AS/2CA;EA6JU,sBCvIM;EDwIN,cVvMwB;AC65ClC;;ASp3CA;EAqKc,gEAA8D;ATmtC5E;;ASx3CA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV02ChB;;ASh4CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVg2CrE;;ASr4CA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVs2CrE;;AS34CA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV42CrE;;ASj5CA;EAoFM,yBV9H4B;EU+H5B,yBAAyB;EACzB,yBClEe;AVm4CrB;;ASv5CA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVy4CrB;;AS75CA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV84CrB;;ASl6CA;EAiGU,mDV3IwB;ACg9ClC;;ASt6CA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVw5CrB;;AS56CA;;EAyGQ,yBVnJ0B;EUoJ1B,qBVpJ0B;EUqJ1B,gBAAgB;ATw0CxB;;ASn7CA;EA6GQ,oCCzFa;ED0Fb,cVxJ0B;ACk+ClC;;ASx7CA;EAiHU,oCCjEuB;AV44CjC;;AS57CA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,cVjKwB;AC8+ClC;;ASp8CA;EA0HU,sFAA4E;AT80CtF;;ASx8CA;EA4HQ,6BAA6B;EAC7B,qBVvK0B;EUwK1B,cVxK0B;ACw/ClC;;AS98CA;EAmIU,yBV7KwB;EU8KxB,qBV9KwB;EU+KxB,yBCjHW;AVg8CrB;;ASp9CA;EAwIY,gEAA8D;ATg1C1E;;ASx9CA;EA8Ic,sFAA4E;AT80C1F;;AS59CA;;EAiJU,6BAA6B;EAC7B,qBV5LwB;EU6LxB,gBAAgB;EAChB,cV9LwB;AC8gDlC;;ASp+CA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVs9CrB;;AS1+CA;EA6JU,oCCzIW;ED0IX,cVxMwB;ACyhDlC;;AS/+CA;EAqKc,gEAA8D;AT80C5E;;ASn/CA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVu+CrB;;AS3/CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV29CrE;;AShgDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVi+CrE;;AStgDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVu+CrE;;AS5gDA;EAoFM,yBVxH2B;EUyH3B,yBAAyB;EACzB,WChEU;AV4/ChB;;ASlhDA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVkgDhB;;ASxhDA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVugDhB;;AS7hDA;EAiGU,kDVrIuB;ACqkDjC;;ASjiDA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVihDhB;;ASviDA;;EAyGQ,yBV7IyB;EU8IzB,qBV9IyB;EU+IzB,gBAAgB;ATm8CxB;;AS9iDA;EA6GQ,sBCvFQ;EDwFR,cVlJyB;ACulDjC;;ASnjDA;EAiHU,yBCjEuB;AVugDjC;;ASvjDA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV3JuB;ACmmDjC;;AS/jDA;EA0HU,0DAA4E;ATy8CtF;;ASnkDA;EA4HQ,6BAA6B;EAC7B,qBVjKyB;EUkKzB,cVlKyB;AC6mDjC;;ASzkDA;EAmIU,yBVvKuB;EUwKvB,qBVxKuB;EUyKvB,WC/GM;AVyjDhB;;AS/kDA;EAwIY,gEAA8D;AT28C1E;;ASnlDA;EA8Ic,0DAA4E;ATy8C1F;;ASvlDA;;EAiJU,6BAA6B;EAC7B,qBVtLuB;EUuLvB,gBAAgB;EAChB,cVxLuB;ACmoDjC;;AS/lDA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV+kDhB;;ASrmDA;EA6JU,sBCvIM;EDwIN,cVlMuB;AC8oDjC;;AS1mDA;EAqKc,gEAA8D;ATy8C5E;;AS9mDA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVgmDhB;;AStnDA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVslDrE;;AS3nDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV4lDrE;;ASjoDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVkmDrE;;ASvoDA;EARE,kBVdc;ACiqDhB;;ASrpDE;EACE,kBVkBc;ACsoDlB;;AS/oDA;EANE,eVjBW;AC0qDb;;ASnpDA;EAJE,kBVpBc;AC+qDhB;;ASvpDA;EAFE,iBVvBa;ACorDf;;AS3pDA;;EAyMI,uBVtP2B;EUuP3B,qBV5P0B;EU6P1B,gBAjOyB;EAkOzB,YAjOyB;ATwrD7B;;ASnqDA;EA8MI,aAAa;EACb,WAAW;ATy9Cf;;ASxqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT29CxB;;AS7qDA;ERnDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQmQhC,6BAA6B;AT89CnC;;ASprDA;EAwNI,4BVvQ0B;EUwQ1B,qBV3Q0B;EU4Q1B,cV9Q0B;EU+Q1B,gBAAgB;EAChB,oBAAoB;ATg+CxB;;AS5rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATk+C/D;;ASh+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATm+C7B;;ASv+CA;EAMI,qBAAqB;ATq+CzB;;AS3+CA;ER1GI,oBQkHwC;ATu+C5C;;AS/+CA;EAUI,sBAAsB;ATy+C1B;;ASn/CA;EAYI,mBAAmB;AT2+CvB;;ASv/CA;EA1OE,kBVdc;ACmvDhB;;ASvuDE;EACE,kBVkBc;ACwtDlB;;AS//CA;EAtOE,kBVpBc;AC6vDhB;;ASngDA;EApOE,iBVvBa;ACkwDf;;ASvgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATi/CjC;;AS5gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ERxI9B,kBQyIwC;ATm/C5C;;ASlhDA;ER1GI,eQ2IqC;ATq/CzC;;ASthDA;EAoCQ,UAAU;ATs/ClB;;AS1hDA;EA0CQ,UAAU;ATo/ClB;;AS9hDA;EA4CU,UAAU;ATs/CpB;;ASliDA;EA8CQ,YAAY;EACZ,cAAc;ATw/CtB;;ASviDA;EAiDI,uBAAuB;AT0/C3B;;AS3iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT2/C7B;;AShjDA;EAuDI,yBAAyB;AT6/C7B;;ASpjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT8/C7B;;ACzvDE;EQiQM;IACE,oBAlTyD;ET8yDjE;ES1/CM;;IAEE,qBAtT0F;ETkzDlG;ESjgDM;IACE,kBV1TM;EC6zDd;ESpgDM;IACE,eV3TG;ECi0DX;AACF;;ACrwDE;EQ6PM;IACE,qBAlTyL;ET8zDjM;ES1gDM;;IAEE,kBV9TM;EC00Dd;ESjhDM;IACE,eV3TG;EC80DX;ESphDM;IACE,kBV5TM;ECk1Dd;AACF;;AWl3DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WAAW;AXq3Db;;AWz3DA;EAMI,0BAA0B;EAC1B,kBZyCM;EYxCN,mBZwCM;EYvCN,WAAW;AXu3Df;;AC/wDE;EUjHF;IAWI,gBAAuC;EX03DzC;AACF;;AC3wDI;EU3HJ;IAcM,iBAAqE;EX63DzE;AACF;;AClwDI;EU1IJ;IAiBM,iBAAiE;EXg4DrE;AACF;;AClxDI;EUhIJ;IAoBM,iBAAqE;EXm4DzE;AACF;;ACzwDI;EU/IJ;IAuBM,iBAAiE;EXs4DrE;AACF;;AY34DA;EAII,kBAAkB;AZ24DtB;;AY/4DA;;;;;;;EAcM,kBAhC2B;AZ26DjC;;AYz5DA;;;;;;EAqBI,cbvC0B;EawC1B,gBbHiB;EaIjB,kBA3C+B;AZw7DnC;;AYp6DA;EAyBI,cAAc;EACd,oBAAoB;AZ+4DxB;;AYz6DA;EA4BM,eAAe;AZi5DrB;;AY76DA;EA8BI,iBAAiB;EACjB,uBAAuB;AZm5D3B;;AYl7DA;EAiCM,oBAAoB;AZq5D1B;;AYt7DA;EAmCI,gBAAgB;EAChB,uBAAuB;AZu5D3B;;AY37DA;EAsCM,oBAAoB;AZy5D1B;;AY/7DA;EAwCI,iBAAiB;EACjB,oBAAoB;AZ25DxB;;AYp8DA;EA2CI,kBAAkB;EAClB,uBAAuB;AZ65D3B;;AYz8DA;EA8CI,cAAc;EACd,kBAAkB;AZ+5DtB;;AY98DA;EAiDI,4Bb5D0B;EEuK1B,8BF1K0B;EaiE1B,qBAjEqC;AZk+DzC;;AYp9DA;EAqDI,4BAA4B;EXuG5B,gBWtGmC;EACnC,eAAe;AZm6DnB;;AY19DA;EAyDM,wBAAwB;AZq6D9B;;AY99DA;EA2DQ,4BAA4B;AZu6DpC;;AYl+DA;EA6DQ,4BAA4B;AZy6DpC;;AYt+DA;EA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kBI,uBAAuB;AfyyE3B;;Ae3zEA;EdiLI,ac7J4B;EAC5B,kBAAkB;EAClB,WAAW;Af2yEf;;Aej0EA;;;EA0BI,mBAAmB;Af6yEvB;;Aev0EA;EAgCM,uBhB5ByB;EgB6BzB,chB1CuB;ACq1E7B;;Ae50EA;EAgCM,yBhBzCuB;EgB0CvB,YhB7ByB;AC60E/B;;Aej1EA;EAgCM,4BhB9BwB;EgB+BxB,yBLoCe;AVixErB;;Aet1EA;EAgCM,yBhBrCwB;EgBsCxB,WLsCU;AVoxEhB;;Ae31EA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyxEhB;;Aeh2EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV+wErE;;Aer2EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmyEhB;;Ae12EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVyxErE;;Ae/2EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6yEhB;;Aep3EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVmyErE;;Aez3EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuzEhB;;Ae93EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV6yErE;;Aen4EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVm0ErB;;Aex4EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVuzErE;;Ae74EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV20EhB;;Ael5EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVi0ErE;;AgBx5EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjByDqB;EiBxDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB05Eb;;AgBp6EA;EAYI,yBjBX2B;ACu6E/B;;AgBx6EA;EAcI,yBjBjB0B;AC+6E9B;;AgB56EA;EAgBI,yBjBnB0B;ACm7E9B;;AgBh7EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk6EhB;;AgBr7EA;EAyBQ,uBjBpBuB;ACo7E/B;;AgBz7EA;EA2BQ,uBjBtBuB;ACw7E/B;;AgB77EA;EA6BQ,uBjBxBuB;AC47E/B;;AgBj8EA;EA+BQ,mEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjBjCqB;ACi9E7B;;AgBz8EA;EA2BQ,yBjBnCqB;ACq9E7B;;AgB78EA;EA6BQ,yBjBrCqB;ACy9E7B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,4BjBtBsB;ACs9E9B;;AgBz9EA;EA2BQ,4BjBxBsB;AC09E9B;;AgB79EA;EA6BQ,4BjB1BsB;AC89E9B;;AgBj+EA;EA+BQ,wEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjB7BsB;AC6+E9B;;AgBz+EA;EA2BQ,yBjB/BsB;ACi/E9B;;AgB7+EA;EA6BQ,yBjBjCsB;ACq/E9B;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBf0B;AC++ElC;;AgBz/EA;EA2BQ,yBjBjB0B;ACm/ElC;;AgB7/EA;EA6BQ,yBjBnB0B;ACu/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBb0B;AC6/ElC;;AgBzgFA;EA2BQ,yBjBf0B;ACigFlC;;AgB7gFA;EA6BQ,yBjBjB0B;ACqgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBd0B;AC8gFlC;;AgBzhFA;EA2BQ,yBjBhB0B;ACkhFlC;;AgB7hFA;EA6BQ,yBjBlB0B;ACshFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBhB0B;ACgiFlC;;AgBziFA;EA2BQ,yBjBlB0B;ACoiFlC;;AgB7iFA;EA6BQ,yBjBpB0B;ACwiFlC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAyBQ,yBjBjB0B;ACijFlC;;AgBzjFA;EA2BQ,yBjBnB0B;ACqjFlC;;AgB7jFA;EA6BQ,yBjBrB0B;ACyjFlC;;AgBjkFA;EA+BQ,qEAA2F;AhBsiFnG;;AgBrkFA;EAyBQ,yBjBXyB;AC2jFjC;;AgBzkFA;EA2BQ,yBjBbyB;AC+jFjC;;AgB7kFA;EA6BQ,yBjBfyB;ACmkFjC;;AgBjlFA;EA+BQ,qEAA2F;AhBsjFnG;;AgBrlFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBujF9B;;AgBjmFA;EA4CM,6BAA6B;AhByjFnC;;AgBrmFA;EA8CM,6BAA6B;AhB2jFnC;;AgBzmFA;EAgDM,oBAAoB;AhB6jF1B;;AgB7mFA;EAoDI,ejBxBY;ACqlFhB;;AgBjnFA;EAsDI,ejB5BY;AC2lFhB;;AgBrnFA;EAwDI,cjB/BW;ACgmFf;;AgB/jFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AgBxkFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AiB9mFA;EAEE,uBlBjB6B;EkBkB7B,clB3B4B;AC2oF9B;;AiBnnFA;;EAMI,yBlB1B0B;EkB2B1B,qBA/B6B;EAgC7B,qBA/B6B;EAgC7B,mBAAmB;AjBknFvB;;AiB3nFA;;EAeQ,uBlB9BuB;EkB+BvB,mBlB/BuB;EkBgCvB,clB7CqB;AC8pF7B;;AiBloFA;;EAeQ,yBlB3CqB;EkB4CrB,qBlB5CqB;EkB6CrB,YlBhCuB;ACwpF/B;;AiBzoFA;;EAeQ,4BlBhCsB;EkBiCtB,wBlBjCsB;EkBkCtB,yBPiCa;AV8lFrB;;AiBhpFA;;EAeQ,yBlBvCsB;EkBwCtB,qBlBxCsB;EkByCtB,WPmCQ;AVmmFhB;;AiBvpFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPmCQ;AV0mFhB;;AiB9pFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPmCQ;AVinFhB;;AiBrqFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPmCQ;AVwnFhB;;AiB5qFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,WPmCQ;AV+nFhB;;AiBnrFA;;EAeQ,yBlB3B0B;EkB4B1B,qBlB5B0B;EkB6B1B,yBPiCa;AVwoFrB;;AiB1rFA;;EAeQ,yBlBrByB;EkBsBzB,qBlBtByB;EkBuBzB,WPmCQ;AV6oFhB;;AiBjsFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBkrFf;;AiBvsFA;;EAuBM,yBlBjC4B;EkBkC5B,WP4BU;AVypFhB;;AiB7sFA;;;;EA2BQ,mBAAmB;AjByrF3B;;AiBptFA;;EA6BM,sBAAsB;AjB4rF5B;;AiBztFA;EA+BI,clBvD0B;ACqvF9B;;AiB7tFA;EAiCM,gBAtDsB;AjBsvF5B;;AiBjuFA;EAoCM,yBlB9C4B;EkB+C5B,WPeU;AVkrFhB;;AiBtuFA;;EAwCQ,mBAAmB;AjBmsF3B;;AiB3uFA;;EA2CQ,kBPSQ;EORR,mBAAmB;AjBqsF3B;;AiBjvFA;EA8CI,6BA5DqC;AjBmwFzC;;AiBrvFA;;EAiDM,qBApEgC;EAqEhC,clB1EwB;ACmxF9B;;AiB3vFA;EAoDI,6BAhEqC;AjB2wFzC;;AiB/vFA;;EAuDM,qBAxEgC;EAyEhC,clBhFwB;AC6xF9B;;AiBrwFA;EA0DI,6BAvEqC;AjBsxFzC;;AiBzwFA;;EA+DU,sBAAsB;AjB+sFhC;;AiB9wFA;;EAoEM,iBAAiB;AjB+sFvB;;AiBnxFA;;EAyEU,wBAAwB;AjB+sFlC;;AiBxxFA;EA2EI,WAAW;AjBitFf;;AiB5xFA;EAgFU,yBlBhGoB;ACgzF9B;;AiBhyFA;EAqFY,yBlBrGkB;ACozF9B;;AiBpyFA;EAuFc,4BlBxGgB;ACyzF9B;;AiBxyFA;;EA2FM,qBAAqB;AjBktF3B;;AiB7yFA;EAgGU,yBlBhHoB;ACi0F9B;;AiB/sFA;EhB7DE,iCAAiC;EgBgEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBitFjB;;AkB70FA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBg1F7B;;AkBp1FA;EAMI,qBAAqB;AlBk1FzB;;AkBx1FA;EjB2KI,oBiBnKwC;AlBo1F5C;;AkB51FA;EAUI,sBAAsB;AlBs1F1B;;AkBh2FA;EAYI,mBAAmB;AlBw1FvB;;AkBp2FA;EAgBM,enBYO;AC40Fb;;AkBx2FA;EAmBM,kBnBQU;ACi1FhB;;AkB52FA;EAqBI,uBAAuB;AlB21F3B;;AkBh3FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB61F1B;;AkBr3FA;EA0BI,yBAAyB;AlB+1F7B;;AkBz3FA;EA6BQ,mBAAmB;AlBg2F3B;;AkB73FA;EA+BQ,eAAe;AlBk2FvB;;AkBj4FA;EjB2KI,eiBzImC;AlBm2FvC;;AkBr4FA;EjB2KI,ciBvIqC;EAE/B,yBAAyB;EACzB,4BAA4B;AlBo2FtC;;AkB34FA;EA6CU,0BAA0B;EAC1B,6BAA6B;AlBk2FvC;;AkB71FA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBOU;EmBNV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg2FrB;;AkB52FA;EjBwHI,oBiB1GuC;EjB0GvC,uBiBzGyC;AlBk2F7C;;AkBj3FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg7F7B;;AkBt3FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw6F/B;;AkB33FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV42FrB;;AkBh4FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+2FhB;;AkBr4FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo3FhB;;AkB14FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV02FrE;;AkB/4FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV83FhB;;AkBp5FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVo3FrE;;AkBz5FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw4FhB;;AkB95FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV83FrE;;AkBn6FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk5FhB;;AkBx6FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVw4FrE;;AkB76FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV85FrB;;AkBl7FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVk5FrE;;AkBv7FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs6FhB;;AkB57FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV45FrE;;AkBj8FA;EAgCI,kBnBtDY;AC29FhB;;AkBr8FA;EAkCI,enBzDS;ACg+Fb;;AkBz8FA;EAoCI,kBnB5DY;ACq+FhB;;AkB78FA;EjBwHI,qBiBjF0C;EjBiF1C,sBiBhF0C;AlB06F9C;;AkBl9FA;EjBwHI,qBiB9E0C;EjB8E1C,sBiB7E0C;AlB46F9C;;AkBv9FA;EjBwHI,qBiB3E0C;EjB2E1C,sBiB1E0C;AlB86F9C;;AkB59FA;EjBwHI,gBiB/KmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+6Fd;;AkBn+FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg7FrC;;AkB9+FA;EAgEM,WAAW;EACX,UAAU;AlBk7FhB;;AkBn/FA;EAmEM,WAAW;EACX,UAAU;AlBo7FhB;;AkBx/FA;EAuEM,yBAAmD;AlBq7FzD;;AkB5/FA;EAyEM,yBAAoD;AlBu7F1D;;AkBhgGA;EA2EI,qBnB/DmB;ACw/FvB;;AkBv7FA;EAEI,0BAA0B;AlBy7F9B;;AmB/iGA;;EAGE,sBAAsB;AnBijGxB;;AmBpjGA;;;;EAMI,oBAAoB;AnBqjGxB;;AmB3jGA;;EAQI,iBApBmB;AnB4kGvB;;AmBhkGA;;EAUI,iBArBmB;AnBglGvB;;AmBrkGA;;EAYI,sBAAsB;AnB8jG1B;;AmB5jGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgmGzB;;AmBnkGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmmG7B;;AmBxkGA;EAWI,oBA3B+B;AnB4lGnC;;AmB5kGA;EAgBM,epBnBO;ACmlGb;;AmBhlGA;EAgBM,iBpBlBS;ACslGf;;AmBplGA;EAgBM,epBjBO;ACylGb;;AmBxlGA;EAgBM,iBpBhBS;AC4lGf;;AmB5lGA;EAgBM,kBpBfU;AC+lGhB;;AmBhmGA;EAgBM,epBdO;ACkmGb;;AmBpmGA;EAgBM,kBpBbU;ACqmGhB;;AmBtlGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkoG3B;;AmB7lGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4mGrB;;AmBlmGA;EAWI,oBA7C+B;AnBwoGnC;;AmBtmGA;EAgBM,epBrCO;AC+nGb;;AmB1mGA;EAgBM,iBpBpCS;ACkoGf;;AmB9mGA;EAgBM,epBnCO;ACqoGb;;AmBlnGA;EAgBM,iBpBlCS;ACwoGf;;AmBtnGA;EAgBM,kBpBjCU;AC2oGhB;;AmB1nGA;EAgBM,epBhCO;AC8oGb;;AmB9nGA;EAgBM,kBpB/BU;ACipGhB;;AoB/qGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkrG3B;;AoB7qGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBmDqB;EqBlDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgrGrB;;AqB9sGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBkCU;EuBjCV,cvB/B4B;ACgtG9B;;AC9oGI;EqBjCA,4BvBjC0B;ACotG9B;;AClpGI;EqBjCA,4BvBjC0B;ACwtG9B;;ACtpGI;EqBjCA,4BvBjC0B;AC4tG9B;;AC1pGI;EqBjCA,4BvBjC0B;ACguG9B;;AsB9rGE;EAEE,qBvBjC0B;ACiuG9B;;AsB/rGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACytGlC;;AsB9rGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACkvG9B;;AClrGI;;;;;EqBhBE,+BvBhDwB;AC0vG9B;;AC1rGI;;;;;EqBhBE,+BvBhDwB;ACkwG9B;;AClsGI;;;;;EqBhBE,+BvBhDwB;AC0wG9B;;AC1sGI;;;;;EqBhBE,+BvBhDwB;ACkxG9B;;AuBpxGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsxGb;;AuBrxGE;EACE,gBAAgB;AvBwxGpB;;AuBpxGI;EACE,mBxBFyB;ACyxG/B;;AuBxxGK;EAMG,mDxBPuB;AC6xG/B;;AuB5xGI;EACE,qBxBfuB;AC8yG7B;;AuBhyGK;EAMG,gDxBpBqB;ACkzG7B;;AuBpyGI;EACE,wBxBJwB;AC2yG9B;;AuBxyGK;EAMG,mDxBTsB;AC+yG9B;;AuB5yGI;EACE,qBxBXwB;AC0zG9B;;AuBhzGK;EAMG,gDxBhBsB;AC8zG9B;;AuBpzGI;EACE,qBxBG4B;ACozGlC;;AuBxzGK;EAMG,iDxBF0B;ACwzGlC;;AuB5zGI;EACE,qBxBK4B;AC0zGlC;;AuBh0GK;EAMG,iDxBA0B;AC8zGlC;;AuBp0GI;EACE,qBxBI4B;ACm0GlC;;AuBx0GK;EAMG,kDxBD0B;ACu0GlC;;AuB50GI;EACE,qBxBE4B;AC60GlC;;AuBh1GK;EAMG,kDxBH0B;ACi1GlC;;AuBp1GI;EACE,qBxBC4B;ACs1GlC;;AuBx1GK;EAMG,mDxBJ0B;AC01GlC;;AuB51GI;EACE,qBxBO2B;ACw1GjC;;AuBh2GK;EAMG,kDxBEyB;AC41GjC;;AuB51GE;EzBmBA,kBC0BgB;EDzBhB,kBCNc;ACm1GhB;;AuB/1GE;EzBoBA,kBCVc;ACy1GhB;;AuBj2GE;EzBoBA,iBCba;AC81Gf;;AuBl2GE;EACE,cAAc;EACd,WAAW;AvBq2Gf;;AuBp2GE;EACE,eAAe;EACf,WAAW;AvBu2Gf;;AuBr2GA;EAGI,qBxB+BmB;EwB9BnB,gDAA4D;EAC5D,iDAA6D;AvBs2GjE;;AuB32GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw2GpB;;AuBt2GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw2GlB;;AuB92GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo6GzB;;AuBn3GA;EAWI,eAAe;AvB42GnB;;AuBv3GA;EAcI,YAAY;AvB62GhB;;AwB96GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi7GpB;;AwBh7GE;EACE,eAAe;AxBm7GnB;;AwBl7GE;EACE,czBF0B;ACu7G9B;;AwBp7GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy7GvB;;AwBp7GA;EvBkKI,kBuB/JqC;AxBq7GzC;;AyBx8GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB28GrB;;AyB/8GA;EAMI,a3BDkB;AE88GtB;;AyBn9GA;EAUM,qB1BU4B;EEsK9B,cwB/K+B;EAC7B,UAAU;AzB68GhB;;AyBz9GA;EAeM,qB1BuDiB;EE4GnB,iBwBlKsC;AzB88G1C;;AyB99GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+8GjB;;AyBt+GA;EAyBM,aAAa;AzBi9GnB;;AyB1+GA;;EA4BM,wB1BjBwB;ACo+G9B;;AyB/+GA;ExBkLI,oBwBpJwC;AzBq9G5C;;AyBn/GA;EAgCM,YAAY;EACZ,UAAU;AzBu9GhB;;AyBx/GA;EAmCQ,kBAAkB;AzBy9G1B;;AyB5/GA;EAuCM,qB1BnCwB;AC4/G9B;;AyBhgHA;EA6CQ,mB1BhCuB;ACu/G/B;;AyBpgHA;EA+CQ,mB1BlCuB;AC2/G/B;;AyBxgHA;EAkDU,qBfwDuB;AVk6GjC;;AyB5gHA;EAuDU,mD1B1CqB;ACmgH/B;;AyBhhHA;EA6CQ,qB1B7CqB;ACohH7B;;AyBphHA;EA+CQ,qB1B/CqB;ACwhH7B;;AyBxhHA;EAkDU,mBfwDuB;AVk7GjC;;AyB5hHA;EAuDU,gD1BvDmB;ACgiH7B;;AyBhiHA;EA6CQ,wB1BlCsB;ACyhH9B;;AyBpiHA;EA+CQ,wB1BpCsB;AC6hH9B;;AyBxiHA;EAkDU,qBfwDuB;AVk8GjC;;AyB5iHA;EAuDU,mD1B5CoB;ACqiH9B;;AyBhjHA;EA6CQ,qB1BzCsB;ACgjH9B;;AyBpjHA;EA+CQ,qB1B3CsB;ACojH9B;;AyBxjHA;EAkDU,qBfwDuB;AVk9GjC;;AyB5jHA;EAuDU,gD1BnDoB;AC4jH9B;;AyBhkHA;EA6CQ,qB1B3B0B;ACkjHlC;;AyBpkHA;EA+CQ,qB1B7B0B;ACsjHlC;;AyBxkHA;EAkDU,qBfwDuB;AVk+GjC;;AyB5kHA;EAuDU,iD1BrCwB;AC8jHlC;;AyBhlHA;EA6CQ,qB1BzB0B;ACgkHlC;;AyBplHA;EA+CQ,qB1B3B0B;ACokHlC;;AyBxlHA;EAkDU,qBfwDuB;AVk/GjC;;AyB5lHA;EAuDU,iD1BnCwB;AC4kHlC;;AyBhmHA;EA6CQ,qB1B1B0B;ACilHlC;;AyBpmHA;EA+CQ,qB1B5B0B;ACqlHlC;;AyBxmHA;EAkDU,qBfwDuB;AVkgHjC;;AyB5mHA;EAuDU,kD1BpCwB;AC6lHlC;;AyBhnHA;EA6CQ,qB1B5B0B;ACmmHlC;;AyBpnHA;EA+CQ,qB1B9B0B;ACumHlC;;AyBxnHA;EAkDU,qBfwDuB;AVkhHjC;;AyB5nHA;EAuDU,kD1BtCwB;AC+mHlC;;AyBhoHA;EA6CQ,qB1B7B0B;AConHlC;;AyBpoHA;EA+CQ,qB1B/B0B;ACwnHlC;;AyBxoHA;EAkDU,qBfwDuB;AVkiHjC;;AyB5oHA;EAuDU,mD1BvCwB;ACgoHlC;;AyBhpHA;EA6CQ,qB1BvByB;AC8nHjC;;AyBppHA;EA+CQ,qB1BzByB;ACkoHjC;;AyBxpHA;EAkDU,qBfwDuB;AVkjHjC;;AyB5pHA;EAuDU,kD1BjCuB;AC0oHjC;;AyBhqHA;E3ByCE,kBC0BgB;EDzBhB,kBCNc;ACioHhB;;AyBrqHA;E3B4CE,kBCVc;ACuoHhB;;AyBzqHA;E3B8CE,iBCba;AC4oHf;;AyB7qHA;EAkEM,gCAA8C;EAC9C,YAAY;AzB+mHlB;;AyBlrHA;EAqEI,WAAW;AzBinHf;;AyBtrHA;EAuEM,WAAW;AzBmnHjB;;AyB1rHA;EA2EM,aAAa;EACb,kBAAkB;ExB8GpB,cwB7G+B;EAC7B,YAAY;EACZ,eAAe;AzBmnHrB;;AyBlsHA;EAiFM,kB1B7CU;ACkqHhB;;AyBtsHA;EAmFM,kB1BjDU;ACwqHhB;;AyB1sHA;EAqFM,iB1BpDS;AC6qHf;;A0BjsHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BmsHpB;;A0BxsHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC2tH7B;;A0B9sHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,c3BjCmB;ACiuH7B;;A0BptHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACuuH7B;;A0B1tHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,c3B7CmB;AC6uH7B;;A0BhuHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACsuH/B;;A0BtuHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,Y3BpBqB;AC4uH/B;;A0B5uHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACkvH/B;;A0BlvHA;EA8BU,uBhB+DuB;EgB9DvB,yBAAyB;EACzB,Y3BhCqB;ACwvH/B;;A0BxvHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV6rHrB;;A0B9vHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVmsHrB;;A0BpwHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVysHrB;;A0B1wHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+sHrB;;A0BhxHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVmtHhB;;A0BtxHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVytHhB;;A0B5xHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV+tHhB;;A0BlyHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVquHhB;;A0BxyHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV2uHhB;;A0B9yHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVivHhB;;A0BpzHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVuvHhB;;A0B1zHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6vHhB;;A0Bh0HA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVmwHhB;;A0Bt0HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVywHhB;;A0B50HA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV+wHhB;;A0Bl1HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVqxHhB;;A0Bx1HA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV2xHhB;;A0B91HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AViyHhB;;A0Bp2HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVuyHhB;;A0B12HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6yHhB;;A0Bh3HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVmzHhB;;A0Bt3HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVyzHhB;;A0B53HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV+zHhB;;A0Bl4HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq0HhB;;A0Bx4HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV60HrB;;A0B94HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVm1HrB;;A0Bp5HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVy1HrB;;A0B15HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+1HrB;;A0Bh6HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVm2HhB;;A0Bt6HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVy2HhB;;A0B56HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV+2HhB;;A0Bl7HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq3HhB;;A0Bx7HA;EAmCI,kB3BZY;ACq6HhB;;A0B57HA;EAqCI,e3BfS;AC06Hb;;A0Bh8HA;EAuCI,kB3BlBY;AC+6HhB;;A0Bp8HA;EA0CQ,eAAe;A1B85HvB;;A0Bx8HA;EA4CI,iB3BxBW;ACw7Hf;;A0B58HA;EA+CQ,eAAe;A1Bi6HvB;;A0Bh9HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bi6HhC;;A0Br9HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bm6H/B;;A0B19HA;EA0DQ,kB3BHI;ACu6HZ;;A0B99HA;EA4DQ,aAAa;A1Bs6HrB;;A0Bl+HA;EA+DM,sBAAsB;A1Bu6H5B;;A0Bt+HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1By6HtB;;A0B5+HA;EAqEM,uBAAuB;A1B26H7B;;A0Bh/HA;EAuEM,aAAa;EACb,YAAY;A1B66HlB;;A0Br/HA;EA0EQ,eAAe;A1B+6HvB;;A0Bz/HA;EA6EQ,eAAe;A1Bg7HvB;;A0B7/HA;EAgFQ,eAAe;A1Bi7HvB;;A0BjgIA;EAmFQ,eAAe;A1Bk7HvB;;A0BrgIA;EAsFQ,0BAA4C;A1Bm7HpD;;A0BzgIA;EAwFQ,0B3BjCI;E2BkCJ,uBAAuB;A1Bq7H/B;;A0B9gIA;EA2FI,uBAAuB;A1Bu7H3B;;A0BlhIA;EA8FM,WAAW;A1Bw7HjB;;A0BthIA;EAgGM,YAAY;EACZ,eAAe;A1B07HrB;;A0B3hIA;EAmGI,yBAAyB;A1B47H7B;;A0B/hIA;EAqGM,0BAA4C;A1B87HlD;;A0BniIA;EAuGM,0B3BhDM;E2BiDN,2BAA2B;EAC3B,SAAS;A1Bg8Hf;;A0B97HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bi8HpB;;A0Bv8HA;EASM,yBhBvB2B;EgBwB3B,c3B9HwB;ACgkI9B;;A0B58HA;EAYM,qBhB1B2B;AV89HjC;;A0Bh9HA;EAeM,yBhB7B2B;EgB8B3B,c3BpIwB;ACykI9B;;A0Br9HA;EAkBM,qBhBhC2B;AVu+HjC;;A0Br8HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bw8Hb;;A0Bt8HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BrFU;E2BsFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bw8HrB;;A0Bt8HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACqmI9B;;A0Bv8HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1B08HzB;;A0Bx8HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBCrB,mByBAmC;EACrC,UAAU;A1B28HZ;;A0Bj9HA;EAQI,eAAe;A1B68HnB;;A2B7nIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC+lIjB;;A2BpoIA;EAMI,oBAAoB;A3BkoIxB;;A2BxoIA;EASI,kB5BsBY;AC6mIhB;;A2B5oIA;EAWI,kB5BkBY;ACmnIhB;;A2BhpIA;EAaI,iB5BeW;ACwnIf;;A2BroIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BwoIrB;;A2B3oIA;EAOM,Y5BdyB;ACspI/B;;A2B/oIA;EAOM,c5B3BuB;ACuqI7B;;A2BnpIA;EAOM,iB5BhBwB;ACgqI9B;;A2BvpIA;EAOM,c5BvBwB;AC2qI9B;;A2B3pIA;EAOM,c5BT4B;ACiqIlC;;A2B/pIA;EAOM,c5BP4B;ACmqIlC;;A2BnqIA;EAOM,c5BR4B;ACwqIlC;;A2BvqIA;EAOM,c5BV4B;AC8qIlC;;A2B3qIA;EAOM,c5BX4B;ACmrIlC;;A2B/qIA;EAOM,c5BL2B;ACirIjC;;A2BxqIA;EAEI,sBAAsB;A3B0qI1B;;A2B5qIA;EAKI,aAAa;EACb,2BAA2B;A3B2qI/B;;A2BjrIA;E1BmJI,kB0B1IwC;A3B4qI5C;;A2BrrIA;;;EAcU,gBAAgB;A3B6qI1B;;A2B3rIA;;;EAoBY,6BAA6B;EAC7B,0BAA0B;A3B6qItC;;A2BlsIA;;;EA8BY,4BAA4B;EAC5B,yBAAyB;A3B0qIrC;;A2BzsIA;;;;;EAyCY,UAAU;A3BwqItB;;A2BjtIA;;;;;;;;;EA8CY,UAAU;A3B+qItB;;A2B7tIA;;;;;;;;;EAgDc,UAAU;A3ByrIxB;;A2BzuIA;EAkDQ,YAAY;EACZ,cAAc;A3B2rItB;;A2B9uIA;EAqDM,uBAAuB;A3B6rI7B;;A2BlvIA;EAuDM,yBAAyB;A3B+rI/B;;A2BtvIA;EA0DQ,YAAY;EACZ,cAAc;A3BgsItB;;A2B3vIA;EA6DI,aAAa;EACb,2BAA2B;A3BksI/B;;A2BhwIA;EAgEM,cAAc;A3BosIpB;;A2BpwIA;EAkEQ,gBAAgB;E1BiFpB,qB0BhF2C;A3BssI/C;;A2BzwIA;EAqEQ,YAAY;EACZ,cAAc;A3BwsItB;;A2B9wIA;EAwEM,uBAAuB;A3B0sI7B;;A2BlxIA;EA0EM,yBAAyB;A3B4sI/B;;A2BtxIA;EA4EM,eAAe;A3B8sIrB;;A2B1xIA;EAgFU,sBAAsB;A3B8sIhC;;A2B9xIA;EAkFQ,uBAAuB;A3BgtI/B;;A2BlyIA;EAoFQ,gBAAgB;A3BktIxB;;AC7tIE;E0BzEF;IAuFM,aAAa;E3BotIjB;AACF;;A2BntIA;EAEI,kBAAkB;A3BqtItB;;AC3uIE;E0BoBF;IAII,qBAAqB;E3BwtIvB;AACF;;AC7uIE;E0BgBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BkDd,oB0BjDsC;IACtC,iBAAiB;E3B4tInB;E2BtuIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B6tIxB;E2B1uIF;IAeM,oBAAoB;E3B8tIxB;E2B7uIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B+tIxB;E2BjvIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3BguIxB;AACF;;A2B/tIA;EAEI,gBAAgB;A3BiuIpB;;AC1wIE;E0BuCF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BouIhB;E2B3uIF;IASM,gBAAgB;E3BquIpB;E2B9uIF;IAWM,cAAc;E3BsuIlB;E2BjvIF;IAaQ,YAAY;E3BuuIlB;E2BpvIF;I1BmCI,qB0BpB2C;E3BwuI7C;AACF;;A2BvuIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3B0uIrB;;A2B/uIA;;;EAaU,c5BxKoB;ACg5I9B;;A2BrvIA;;;EAeQ,kB5B3IQ;ACu3IhB;;A2B3vIA;;;EAiBQ,kB5B/IQ;AC+3IhB;;A2BjwIA;;;EAmBQ,iB5BlJO;ACs4If;;A2BvwIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BsvIhB;;A2BjxIA;;EA+BM,mB7B1LgB;AEi7ItB;;A2BtxIA;EAiCM,OAAO;A3ByvIb;;A2B1xIA;;EAqCM,oB7BhMgB;AE07ItB;;A2B/xIA;EAuCM,QAAQ;A3B4vId;;A2BnyIA;EA2CM,6BAA6B;E1BjB/B,c0BkB+B;EAC7B,YAAY;EACZ,UAAU;A3B4vIhB;;A2B1yIA;EAgDM,kB5B5KU;AC06IhB;;A2B9yIA;EAkDM,kB5BhLU;ACg7IhB;;A2BlzIA;EAoDM,iB5BnLS;ACq7If;;A4Bx9IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B+8IrB;;A6Bn9IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B+9I3C;;A6B39IA;EAYM,c9BjBwB;ACo+I9B;;A6B/9IA;EAcI,mBAAmB;EACnB,aAAa;A7Bq9IjB;;A6Bp+IA;E5ByKI,e4BxJoC;A7Bu9IxC;;A6Bx+IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bw9I5B;;A6B9+IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7B09IvB;;A6Bn/IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B49I/B;;A6B3/IA;E5ByKI,mB4BvIuC;A7B69I3C;;A6B//IA;E5ByKI,kB4BrIuC;A7B+9I3C;;A6BngJA;;EAyCM,uBAAuB;A7B+9I7B;;A6BxgJA;;EA6CM,yBAAyB;A7Bg+I/B;;A6B7gJA;EAgDI,kB9BrBY;ACs/IhB;;A6BjhJA;EAkDI,kB9BzBY;AC4/IhB;;A6BrhJA;EAoDI,iB9B5BW;ACigJf;;A6BzhJA;EAwDM,iBAAiB;A7Bq+IvB;;A6B7hJA;EA2DM,iBAAiB;A7Bs+IvB;;A6BjiJA;EA8DM,iBAAiB;A7Bu+IvB;;A6BriJA;EAiEM,iBAAiB;A7Bw+IvB;;A8B9hJA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,e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nwJA;EACE,mBAAmB;EACnB,yBAAyB;AhCswJ3B;;ACvuJE;E+BjCF;IAKI,aAAa;EhCwwJf;AACF;;AiC50JA;EACE,uBAAuB;EACvB,aAAa;EACb,mBAAmB;AjC+0JrB;;AiCl1JA;EAKI,sBAV2B;AjC21J/B;;AiCt1JA;EAOI,8ClCR0B;EkCS1B,aAAa;EACb,oBAb2B;AjCg2J/B;;AiC51JA;;EAYM,qBAfgC;AjCo2JtC;;AiCj2JA;EAcM,mBAhBwB;AjCu2J9B;;AiCr2JA;EAgBQ,kBAlBsB;AjC22J9B;;AiCz2JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCs3JpB;;AiC/2JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjC03J5B;;AiCz1JA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC41JhB;;AiC11JA;EhCwII,kBgChLgB;AjCs4JpB;;AiC31JA;EhCqII,iBgChLgB;AjC04JpB;;AiC51JA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC+1JrB;;AC/yJE;EgCpDF;IAQI,gBAAgB;EjCg2JlB;AACF;;AkCv4JA;EACE,enCgBW;AC03Jb;;AkC34JA;EAII,kBnCcY;AC63JhB;;AkC/4JA;EAMI,kBnCUY;ACm4JhB;;AkCn5JA;EAQI,iBnCOW;ACw4Jf;;AkC74JA;EACE,iBArB0B;AlCq6J5B;;AkCj5JA;EAGI,kBnCoCc;EmCnCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC26JrC;;AkCx5JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACq7J9B;;AkC75JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV82JhB;;AkCl6JA;EjCsJI,8BF1K0B;EmCqCxB,cAnC0B;EjCwK5B,oBiCvKkC;AlCy7JtC;;AkCp5JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCu5J3B;;AkC35JA;EAMI,eAtCoB;AlC+7JxB;;AkC/5JA;EAQI,kBAxCoB;AlCm8JxB;;AmC97JA;EAEE,4BpCZ4B;EoCa5B,kBpC4CU;EoC3CV,epCUW;ACs7Jb;;AmCp8JA;EAMI,mBAAmB;AnCk8JvB;;AmCx8JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCo8J9B;;AmC78JA;EAYI,kBpCGY;ACk8JhB;;AmCj9JA;EAcI,kBpCDY;ACw8JhB;;AmCr9JA;EAgBI,iBpCJW;AC68Jf;;AmCz9JA;EAsCM,uBAH+C;AnC07JrD;;AmC79JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACu/J7B;;AmCl+JA;EA2CQ,mBpCnDuB;AC8+J/B;;AmCt+JA;EAsCM,yBAH+C;AnCu8JrD;;AmC1+JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACu/J/B;;AmC/+JA;EA2CQ,qBpChEqB;ACwgK7B;;AmCn/JA;EAsCM,yBAH+C;AnCo9JrD;;AmCv/JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVm8JrB;;AmC5/JA;EA2CQ,wBpCrDsB;AC0gK9B;;AmChgKA;EAsCM,yBAH+C;AnCi+JrD;;AmCpgKA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV88JhB;;AmCzgKA;EA2CQ,qBpC5DsB;AC8hK9B;;AmC7gKA;EAsCM,yBzB4B0C;AV+8JhD;;AmCjhKA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV29JhB;;AmCthKA;EA2CQ,qBpC9C0B;EoC+C1B,czB8B6D;AVi9JrE;;AmC3hKA;EAsCM,yBzB4B0C;AV69JhD;;AmC/hKA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVy+JhB;;AmCpiKA;EA2CQ,qBpC5C0B;EoC6C1B,czB8B6D;AV+9JrE;;AmCziKA;EAsCM,yBzB4B0C;AV2+JhD;;AmC7iKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVu/JhB;;AmCljKA;EA2CQ,qBpC7C0B;EoC8C1B,czB8B6D;AV6+JrE;;AmCvjKA;EAsCM,yBzB4B0C;AVy/JhD;;AmC3jKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVqgKhB;;AmChkKA;EA2CQ,qBpC/C0B;EoCgD1B,czB8B6D;AV2/JrE;;AmCrkKA;EAsCM,yBzB4B0C;AVugKhD;;AmCzkKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVqhKrB;;AmC9kKA;EA2CQ,qBpChD0B;EoCiD1B,czB8B6D;AVygKrE;;AmCnlKA;EAsCM,yBzB4B0C;AVqhKhD;;AmCvlKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AViiKhB;;AmC5lKA;EA2CQ,qBpC1CyB;EoC2CzB,czB8B6D;AVuhKrE;;AmCnjKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCsjKpB;;AmChkKA;EAYI,YAAY;EACZ,cAAc;ElCkGd,mBkCjGsC;AnCwjK1C;;AmCtkKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnC0jK9B;;AmCxjKA;EACE,qBpChF4B;EoCiF5B,kBpCrBU;EoCsBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC4oKnC;;AmCjkKA;;EASI,uBpCnF2B;ACgpK/B;;AmCtkKA;EAWI,6BAlFgD;AnCipKpD;;AoCjoKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC2qKZ;;AoC3oKA;EAWI,aAAa;ApCooKjB;;AoCloKA;EAEE,wCrC/C2B;ACmrK7B;;AoCloKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApCqoKb;;ACpmKE;EmCvCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpCgsKzB;AACF;;AoCvoKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCwHb,WmChLoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCqsK7B;;AoCvoKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApC0oKzB;;AoCxoKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC2oKpB;;AoCzoKA;EACE,gCrCjF4B;EqCkF5B,2BrCrBgB;EqCsBhB,4BrCtBgB;ACkqKlB;;AoC1oKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApC0tKhC;;AoC3oKA;EACE,8BrChCgB;EqCiChB,+BrCjCgB;EqCkChB,6BrC/F4B;AC6uK9B;;AoCjpKA;EnC8EI,mBmCxEuC;ApC+oK3C;;AoC7oKA;EnC3CE,iCAAiC;EmC6CjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCsuK9B;;AqC1sKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCmwKb;;AqCjtKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC8wK7B;;AqCttKA;;EAcU,ctCtEmB;ACmxK7B;;AqC3tKA;;;;EAoBY,yB3B8BqB;E2B7BrB,ctC7EiB;AC2xK7B;;AqCnuKA;EAwBY,qBtChFiB;AC+xK7B;;AqCvuKA;EA0BQ,ctClFqB;ACmyK7B;;AC3sKE;EoChCF;;;;IAgCY,ctCxFiB;EC2yK3B;EqCnvKF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,ctC/Fe;ECwzK3B;EqChwKF;;IA0Cc,qBtClGe;EC4zK3B;EqCpwKF;;;IA8CU,yB3BIuB;I2BHvB,ctCvGmB;ECk0K3B;EqC1wKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECs0K3B;AACF;;AqC/wKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC+zK/B;;AqCpxKA;;EAcU,YtCzDqB;ACo0K/B;;AqCzxKA;;;;EAoBY,uB3B8BqB;E2B7BrB,YtChEmB;AC40K/B;;AqCjyKA;EAwBY,mBtCnEmB;ACg1K/B;;AqCryKA;EA0BQ,YtCrEuB;ACo1K/B;;ACzwKE;EoChCF;;;;IAgCY,YtC3EmB;EC41K7B;EqCjzKF;;;;;;;;;;IAsCc,uB3BYmB;I2BXnB,YtClFiB;ECy2K7B;EqC9zKF;;IA0Cc,mBtCrFiB;EC62K7B;EqCl0KF;;;IA8CU,uB3BIuB;I2BHvB,YtC1FqB;ECm3K7B;EqCx0KF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECu3K7B;AACF;;AqC70KA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV4zKrB;;AqCl1KA;;EAcU,yB3BQW;AVi0KrB;;AqCv1KA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AVy0KrB;;AqC/1KA;EAwBY,gC3BFS;AV60KrB;;AqCn2KA;EA0BQ,yB3BJa;AVi1KrB;;ACv0KE;EoChCF;;;;IAgCY,yB3BVS;EVy1KnB;EqC/2KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EVs2KnB;EqC53KF;;IA0Cc,gC3BpBO;EV02KnB;EqCh4KF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVg3KnB;EqCt4KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVo3KnB;AACF;;AqC34KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVw3KhB;;AqCh5KA;;EAcU,W3BUM;AV63KhB;;AqCr5KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVq4KhB;;AqC75KA;EAwBY,kB3BAI;AVy4KhB;;AqCj6KA;EA0BQ,W3BFQ;AV64KhB;;ACr4KE;EoChCF;;;;IAgCY,W3BRI;EVq5Kd;EqC76KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVk6Kd;EqC17KF;;IA0Cc,kB3BlBE;EVs6Kd;EqC97KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV46Kd;EqCp8KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EVg7Kd;AACF;;AqCz8KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVs7KhB;;AqC98KA;;EAcU,W3BUM;AV27KhB;;AqCn9KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVm8KhB;;AqC39KA;EAwBY,kB3BAI;AVu8KhB;;AqC/9KA;EA0BQ,W3BFQ;AV28KhB;;ACn8KE;EoChCF;;;;IAgCY,W3BRI;EVm9Kd;EqC3+KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVg+Kd;EqCx/KF;;IA0Cc,kB3BlBE;EVo+Kd;EqC5/KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV0+Kd;EqClgLF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV8+Kd;AACF;;AqCvgLA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVo/KhB;;AqC5gLA;;EAcU,W3BUM;AVy/KhB;;AqCjhLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVigLhB;;AqCzhLA;EAwBY,kB3BAI;AVqgLhB;;AqC7hLA;EA0BQ,W3BFQ;AVygLhB;;ACjgLE;EoChCF;;;;IAgCY,W3BRI;EVihLd;EqCziLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV8hLd;EqCtjLF;;IA0Cc,kB3BlBE;EVkiLd;EqC1jLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVwiLd;EqChkLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV4iLd;AACF;;AqCrkLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVkjLhB;;AqC1kLA;;EAcU,W3BUM;AVujLhB;;AqC/kLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV+jLhB;;AqCvlLA;EAwBY,kB3BAI;AVmkLhB;;AqC3lLA;EA0BQ,W3BFQ;AVukLhB;;AC/jLE;EoChCF;;;;IAgCY,W3BRI;EV+kLd;EqCvmLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV4lLd;EqCpnLF;;IA0Cc,kB3BlBE;EVgmLd;EqCxnLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVsmLd;EqC9nLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EV0mLd;AACF;;AqCnoLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AVgnLhB;;AqCxoLA;;EAcU,W3BUM;AVqnLhB;;AqC7oLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV6nLhB;;AqCrpLA;EAwBY,kB3BAI;AVioLhB;;AqCzpLA;EA0BQ,W3BFQ;AVqoLhB;;AC7nLE;EoChCF;;;;IAgCY,W3BRI;EV6oLd;EqCrqLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV0pLd;EqClrLF;;IA0Cc,kB3BlBE;EV8pLd;EqCtrLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVoqLd;EqC5rLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVwqLd;AACF;;AqCjsLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AVgrLrB;;AqCtsLA;;EAcU,yB3BQW;AVqrLrB;;AqC3sLA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AV6rLrB;;AqCntLA;EAwBY,gC3BFS;AVisLrB;;AqCvtLA;EA0BQ,yB3BJa;AVqsLrB;;AC3rLE;EoChCF;;;;IAgCY,yB3BVS;EV6sLnB;EqCnuLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EV0tLnB;EqChvLF;;IA0Cc,gC3BpBO;EV8tLnB;EqCpvLF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVouLnB;EqC1vLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVwuLnB;AACF;;AqC/vLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV4uLhB;;AqCpwLA;;EAcU,W3BUM;AVivLhB;;AqCzwLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVyvLhB;;AqCjxLA;EAwBY,kB3BAI;AV6vLhB;;AqCrxLA;EA0BQ,W3BFQ;AViwLhB;;ACzvLE;EoChCF;;;;IAgCY,W3BRI;EVywLd;EqCjyLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVsxLd;EqC9yLF;;IA0Cc,kB3BlBE;EV0xLd;EqClzLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVgyLd;EqCxzLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVoyLd;AACF;;AqC7zLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC2wLf;;AqCp0LA;EA2DI,gCtCxG0B;ACq3L9B;;AqCx0LA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArCg4LnB;;AqC/0LA;EAgEI,SAAS;ArCmxLb;;AqCn1LA;EAkEM,iCtC/GwB;ACo4L9B;;AqCv1LA;EAoEI,MAAM;ArCuxLV;;AqCrxLA;;EAGI,oBA9HmB;ArCq5LvB;;AqC1xLA;;EAKI,uBAhImB;ArC05LvB;;AqCxxLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCk6LvB;;AqCzxLA;EAIM,6BAA6B;ArCyxLnC;;AqCvxLA;EpCjFE,iCAAiC;EoCmFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArC0xLpB;;AqCxxLA;EAEE,ctCrJ4B;EEoB5B,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eoC7BqB;EpC8BrB,kBAAkB;EAClB,coC/BqB;EpC+KnB,iBoCtBkC;ArCmyLtC;;AC55LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBF6BQ;EE5BR,yDAAyD;EACzD,oCFsBa;EErBb,WAAW;AD+5Lf;;AC95LI;EACE,oBAAoB;ADi6L1B;;ACh6LI;EACE,oBAAoB;ADm6L1B;;ACl6LI;EACE,oBAAoB;ADq6L1B;;ACp6LE;EACE,qCAAiC;ADu6LrC;;ACn6LM;EACE,wCAAwC;ADs6LhD;;ACr6LM;EACE,UAAU;ADw6LlB;;ACv6LM;EACE,0CAA0C;AD06LlD;;AqC10LA;EACE,aAAa;ArC60Lf;;AqC30LA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArC80LpB;;AqCp1LA;;EASM,qBAAqB;EACrB,sBAAsB;ArCg1L5B;;AqC90LA;;EAEE,eAAe;ArCi1LjB;;AqCn1LA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;ACq/LlC;;AqCl1LA;EACE,YAAY;EACZ,cAAc;ArCq1LhB;;AqCv1LA;EAII,mBA7KgC;ArCogMpC;;AqC31LA;EAMI,UAAU;ArCy1Ld;;AqC/1LA;EAQI,YAAY;EACZ,cAAc;ArC21LlB;;AqCp2LA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArC61LtC;;AqC12LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;ACkhMlC;;AqC/2LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArCg2L9E;;AqC91LA;EACE,YAAY;EACZ,cAAc;ArCi2LhB;;AqC/1LA;EpCnCI,oBoCoCoC;ArCk2LxC;;AqCn2LA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpChCpB,coCiC6B;ArCm2LjC;;AqCj2LA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArCo2LrB;;AqCv2LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCs2LzB;;AqCp2LA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCu2LlB;;ACr/LE;EoCpCF;IAsLI,cAAc;ErCw2LhB;EqCv2LA;;IAGI,mBAAmB;IACnB,aAAa;ErCw2LjB;EqCv2LA;IAEI,aAAa;ErCw2LjB;EqCh8LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCy2LnB;EqC52LA;IAKI,cAAc;ErC02LlB;EqCx2LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCqmMjB;EqC92LA;IAKI,SAAS;ErC42Lb;EqCj3LA;IAOM,4CtCrQqB;ECknM3B;EqCp3LA;IASI,MAAM;ErC82LV;EqCv3LA;IpC7LA,iCAAiC;IoC2M3B,iCAA2C;IAC3C,cAAc;ErC62LpB;EqC52LA;;IAGI,oBA9QiB;ErC2nMrB;EqCh3LA;;IAKI,uBAhRiB;ErC+nMrB;AACF;;AC3iME;EoC8LA;;;;IAIE,oBAAoB;IACpB,aAAa;ErCi3Lf;EqCplMF;IAqOI,mBA1RmB;ErC4oMrB;EqCn3LA;IAGI,kBA1R0B;ErC6oM9B;EqCt3LA;;IAMM,mBAAmB;ErCo3LzB;EqC13LA;;IASM,kBtCjOI;ECslMV;EqC93LA;;;;IAgBQ,wCAAwC;ErCo3LhD;EqCp4LA;IAuBU,wCAAwC;ErCg3LlD;EqCv4LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECuqM3B;EqC34LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECupMhC;EqCnhMF;IAsKI,aAAa;ErCg3Lf;EqC7gMF;;IAgKI,mBAAmB;IACnB,aAAa;ErCi3Lf;EqC5/LF;IA8IM,oBAAoB;ErCi3LxB;EqCn3LA;IAKM,oDAAoD;ErCi3L1D;EqCt3LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErCk3Lf;EqC93LA;IAkBM,cAAc;ErC+2LpB;EqC92LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErC+2LhC;EqC3iMF;IA8LI,YAAY;IACZ,cAAc;ErCg3LhB;EqC/2LA;IACE,2BAA2B;IpC7K3B,kBoC8KoC;ErCi3LtC;EqCh3LA;IACE,yBAAyB;IpChLzB,iBoCiLoC;ErCk3LtC;EqCx/LF;IAwII,uBtCxV2B;IsCyV3B,8BtCjSc;IsCkSd,+BtClSc;IsCmSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCjLnB,OoCkLuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErCosMpB;EqCtgMF;IAqJM,sBAAsB;IACtB,mBAAmB;ErCo3LvB;EqCn4LA;IpClLE,mBoCmMuC;ErCq3LzC;EqCt4LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;EC8uM3B;EqC14LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;EC8tMhC;EqCr3LE;IAEE,kBtC1TY;IsC2TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtChUM;IsCiUN,uCAAuC;ErCs3L3C;EqC15LA;IAsCI,UAAU;IACV,QAAQ;ErCu3LZ;EqC7hMF;IAwKI,cAAc;ErCw3LhB;EqCv3LA;;IpC5NE,qBoC+NyC;ErCw3L3C;EqC33LA;;IpC5NE,sBoCiOyC;ErC03L3C;EqCx3LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC4wMjB;EqC93LA;IAKI,SAAS;ErC43Lb;EqCj4LA;IAOM,4CtC5ZqB;ECyxM3B;EqCp4LA;IASI,MAAM;ErC83LV;EqC73LA;;IAGI,oBA/ZiB;ErC6xMrB;EqCj4LA;;IAKI,uBAjaiB;ErCiyMrB;EqCr4LA;;IAOI,oBAA4D;ErCk4LhE;EqCz4LA;;IASI,uBAA+D;ErCo4LnE;EqCl4LA;;IAGI,ctC7auB;ECgzM3B;EqCt4LA;;IAKI,6BAla2C;ErCuyM/C;EqCp4LA;IAKM,yBtCzasB;EC2yM5B;AACF;;AqC/3LA;EAEI,iCAA2C;ArCi4L/C;;AsCzxMA;EAEE,evCFW;EuCGX,gBAnC0B;AtC8zM5B;;AsC9xMA;EAMI,kBvCLY;ACiyMhB;;AsClyMA;EAQI,kBvCTY;ACuyMhB;;AsCtyMA;EAUI,iBvCZW;AC4yMf;;AsC1yMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCmBiB;AC8wMvB;;AsCjzMA;EAkBM,qBvCiBiB;ACkxMvB;;AsCjyMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtCoyMpB;;AsClyMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtCmyMpB;;AsCjyMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AE+2MtB;;AsCzyMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACu3M9B;;AsChzMA;;;EAUI,qBvCjE8B;AC62MlC;;AsCtzMA;;;EAYI,iDvCvFyB;ACu4M7B;;AsC5zMA;;;;;EAeI,yBvClF0B;EuCmF1B,qBvCnF0B;EuCoF1B,gBAAgB;EAChB,cvCvF0B;EuCwF1B,YAAY;AtCqzMhB;;AsCnzMA;;EAEE,oBAvFkC;EAwFlC,qBAvFmC;EAwFnC,mBAAmB;AtCszMrB;;AsCpzMA;EAEI,yBvCpF8B;EuCqF9B,qBvCrF8B;EuCsF9B,W5B1BY;AVg1MhB;;AsCpzMA;EACE,cvCtG4B;EuCuG5B,oBAAoB;AtCuzMtB;;AsCrzMA;EACE,eAAe;AtCwzMjB;;AsCzzMA;EAGI,gBAAgB;AtC0zMpB;;ACz0ME;EqCjEF;IAoFI,eAAe;EtC2zMjB;EsCl1MF;;IA0BI,YAAY;IACZ,cAAc;EtC4zMhB;EsCv0MF;IAcM,YAAY;IACZ,cAAc;EtC4zMlB;AACF;;ACp1ME;EqCQF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtC8zMV;EsCt4MF;;;;IA6EI,gBAAgB;IAChB,aAAa;EtC+zMf;EsC9zMA;IACE,QAAQ;EtCg0MV;EsC/zMA;IACE,QAAQ;EtCi0MV;EsC96MF;IA+GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtCk0Mf;EsCr0MA;IAMM,QAAQ;EtCk0Md;EsCx0MA;IAQM,uBAAuB;IACvB,QAAQ;EtCm0Md;EsC50MA;IAWM,QAAQ;EtCo0Md;EsC/0MA;IAcM,QAAQ;EtCo0Md;EsCl1MA;IAgBM,QAAQ;EtCq0Md;EsCr1MA;IAkBM,yBAAyB;IACzB,QAAQ;EtCs0Md;AACF;;AuC78MA;EACE,kBxCsCgB;EwCrChB,0FxChC2B;EwCiC3B,exCEW;AC88Mb;;AuCn9MA;EAKI,qBxCWkB;ACu8MtB;;AuCv9MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;AC0/M7B;;AuC59MA;EAeQ,0BxChCuB;ACi/M/B;;AuCh+MA;EAiBQ,YxClCuB;ACq/M/B;;AuCp+MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;AC0/M/B;;AuCz+MA;EAeQ,4BxC7CqB;AC2gN7B;;AuC7+MA;EAiBQ,cxC/CqB;AC+gN7B;;AuCj/MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AVs8MrB;;AuCt/MA;EAeQ,+BxClCsB;AC6gN9B;;AuC1/MA;EAiBQ,iBxCpCsB;ACihN9B;;AuC9/MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVi9MhB;;AuCngNA;EAeQ,4BxCzCsB;ACiiN9B;;AuCvgNA;EAiBQ,cxC3CsB;ACqiN9B;;AuC3gNA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AV89MhB;;AuChhNA;EAeQ,4BxC3B0B;ACgiNlC;;AuCphNA;EAiBQ,cxC7B0B;ACoiNlC;;AuCxhNA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AV2+MhB;;AuC7hNA;EAeQ,4BxCzB0B;AC2iNlC;;AuCjiNA;EAiBQ,cxC3B0B;AC+iNlC;;AuCriNA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVw/MhB;;AuC1iNA;EAeQ,4BxC1B0B;ACyjNlC;;AuC9iNA;EAiBQ,cxC5B0B;AC6jNlC;;AuCljNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AVqgNhB;;AuCvjNA;EAeQ,4BxC5B0B;ACwkNlC;;AuC3jNA;EAiBQ,cxC9B0B;AC4kNlC;;AuC/jNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AVohNrB;;AuCpkNA;EAeQ,4BxC7B0B;ACslNlC;;AuCxkNA;EAiBQ,cxC/B0B;AC0lNlC;;AuC5kNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AV+hNhB;;AuCjlNA;EAeQ,4BxCvByB;AC6lNjC;;AuCrlNA;EAiBQ,cxCzByB;ACimNjC;;AuCtkNA;;EAGI,gCxC3C2B;ACmnN/B;;AuCtkNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvC8nNlC;;AuCvkNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvC0kNzB;;AuC9kNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvC4kNlB;;AuCplNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;ACopN9B;;AuC3kNA;EAEI,cxC1E0B;ACupN9B;;AuC/kNA;EAIM,cxC7D4B;AC4oNlC;;AuC7kNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCglNvB;;AuCrlNA;EtC+FI,oBsCxFsC;AvCklN1C;;AuCzlNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvColNf;;AuC/lNA;EAaI,eAAe;AvCslNnB;;AuCnmNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;ACurN9B;;AuCxmNA;EAkBM,cxCjF4B;AC2qNlC;;AuC5mNA;EAoBI,8BxClCc;EwCmCd,+BxCnCc;AC+nNlB;;AuC1lNA;;EAEE,eAAe;AvC6lNjB;;AuC/lNA;;EAII,4BxCnG0B;ACmsN9B;;AuC9lNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EE4K1B,oBsC/DoC;AvCumNxC;;AuC1mNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCymNxB;;AwCnsNA;EvCqCE,iCAAiC;EuCjCjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxCosNrB;;AwC9sNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxCssNvB;;AwC3tNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACwvN9B;;AwChuNA;EA0BI,cAAc;AxC0sNlB;;AwCpuNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACivNlC;;AwCzuNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxC6sN/B;;AwCpvNA;EAyCM,qBAAqB;AxC+sN3B;;AwCxvNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCitN3B;;AwC/vNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxCmtN1B;;AwCpwNA;EvCsJI,mBuClGuC;AxCotN3C;;AwCxwNA;EvCsJI,kBuChGuC;AxCstN3C;;AwC5wNA;EA0DM,uBAAuB;AxCstN7B;;AwChxNA;EA6DM,yBAAyB;AxCutN/B;;AwCpxNA;EAiEM,6BAA6B;EAE3B,0BAAkE;AxCstN1E;;AwCzxNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;ACkzN9B;;AwC9xNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxCstNrF;;AwCpyNA;EAiFM,YAAY;EACZ,cAAc;AxCutNpB;;AwCzyNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCwtNxB;;AwCjzNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxC0tNlB;;AwCvzNA;EvCsJI,iBuCtDuE;AxC2tN3E;;AwC3zNA;EAmGU,2BzC3DE;EyC4DF,8BzC5DE;ACwxNZ;;AwCh0NA;EA0GU,4BzClEE;EyCmEF,+BzCnEE;AC6xNZ;;AwCr0NA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCwtNpB;;AwC50NA;EAsHM,mBAAmB;AxC0tNzB;;AwCh1NA;EA2HY,iCzCjFW;EyCkFX,8BzClFW;EyCmFX,oBAAoB;AxCytNhC;;AwCt1NA;EAoIY,kCzC1FW;EyC2FX,+BzC3FW;EyC4FX,qBAAqB;AxCstNjC;;AwC51NA;EA6II,kBzCrIY;ACw1NhB;;AwCh2NA;EA+II,kBzCzIY;AC81NhB;;AwCp2NA;EAiJI,iBzC5IW;ACm2Nf;;AyCt4NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1C64NpB;;A0Cr4NE;EACE,UAAU;EACV,YAAY;A1Cw4NhB;;A0Cv4NE;EACE,UAAU;EACV,WAAW;A1C04Nf;;A0Cz4NE;EACE,UAAU;EACV,UAAU;A1C44Nd;;A0C34NE;EACE,UAAU;EACV,eAAe;A1C84NnB;;A0C74NE;EACE,UAAU;EACV,UAAU;A1Cg5Nd;;A0C/4NE;EACE,UAAU;EACV,eAAe;A1Ck5NnB;;A0Cj5NE;EACE,UAAU;EACV,UAAU;A1Co5Nd;;A0Cn5NE;EACE,UAAU;EACV,UAAU;A1Cs5Nd;;A0Cr5NE;EACE,UAAU;EACV,UAAU;A1Cw5Nd;;A0Cv5NE;EACE,UAAU;EACV,UAAU;A1C05Nd;;A0Cz5NE;EACE,UAAU;EACV,UAAU;A1C45Nd;;A0C35NE;EzCyIE,gByCxImC;A1C85NvC;;A0C75NE;EzCuIE,qByCtIwC;A1Cg6N5C;;A0C/5NE;EzCqIE,gByCpImC;A1Ck6NvC;;A0Cj6NE;EzCmIE,qByClIwC;A1Co6N5C;;A0Cn6NE;EzCiIE,gByChImC;A1Cs6NvC;;A0Cr6NE;EzC+HE,gByC9HmC;A1Cw6NvC;;A0Cv6NE;EzC6HE,gByC5HmC;A1C06NvC;;A0Cz6NE;EzC2HE,gByC1HmC;A1C46NvC;;A0C36NE;EzCyHE,gByCxHmC;A1C86NvC;;A0C56NI;EACE,UAAU;EACV,SAAiC;A1C+6NvC;;A0C96NI;EzCmHA,eyClH4D;A1Ci7NhE;;A0Cr7NI;EACE,UAAU;EACV,eAAiC;A1Cw7NvC;;A0Cv7NI;EzCmHA,qByClH4D;A1C07NhE;;A0C97NI;EACE,UAAU;EACV,gBAAiC;A1Ci8NvC;;A0Ch8NI;EzCmHA,sByClH4D;A1Cm8NhE;;A0Cv8NI;EACE,UAAU;EACV,UAAiC;A1C08NvC;;A0Cz8NI;EzCmHA,gByClH4D;A1C48NhE;;A0Ch9NI;EACE,UAAU;EACV,gBAAiC;A1Cm9NvC;;A0Cl9NI;EzCmHA,sByClH4D;A1Cq9NhE;;A0Cz9NI;EACE,UAAU;EACV,gBAAiC;A1C49NvC;;A0C39NI;EzCmHA,sByClH4D;A1C89NhE;;A0Cl+NI;EACE,UAAU;EACV,UAAiC;A1Cq+NvC;;A0Cp+NI;EzCmHA,gByClH4D;A1Cu+NhE;;A0C3+NI;EACE,UAAU;EACV,gBAAiC;A1C8+NvC;;A0C7+NI;EzCmHA,sByClH4D;A1Cg/NhE;;A0Cp/NI;EACE,UAAU;EACV,gBAAiC;A1Cu/NvC;;A0Ct/NI;EzCmHA,sByClH4D;A1Cy/NhE;;A0C7/NI;EACE,UAAU;EACV,UAAiC;A1CggOvC;;A0C//NI;EzCmHA,gByClH4D;A1CkgOhE;;A0CtgOI;EACE,UAAU;EACV,gBAAiC;A1CygOvC;;A0CxgOI;EzCmHA,sByClH4D;A1C2gOhE;;A0C/gOI;EACE,UAAU;EACV,gBAAiC;A1CkhOvC;;A0CjhOI;EzCmHA,sByClH4D;A1CohOhE;;A0CxhOI;EACE,UAAU;EACV,WAAiC;A1C2hOvC;;A0C1hOI;EzCmHA,iByClH4D;A1C6hOhE;;ACz/NE;EyClGF;IAiEM,UAAU;IACV,YAAY;E1C+hOhB;E0CjmOF;IAoEM,UAAU;IACV,WAAW;E1CgiOf;E0CrmOF;IAuEM,UAAU;IACV,UAAU;E1CiiOd;E0CzmOF;IA0EM,UAAU;IACV,eAAe;E1CkiOnB;E0C7mOF;IA6EM,UAAU;IACV,UAAU;E1CmiOd;E0CjnOF;IAgFM,UAAU;IACV,eAAe;E1CoiOnB;E0CrnOF;IAmFM,UAAU;IACV,UAAU;E1CqiOd;E0CznOF;IAsFM,UAAU;IACV,UAAU;E1CsiOd;E0C7nOF;IAyFM,UAAU;IACV,UAAU;E1CuiOd;E0CjoOF;IA4FM,UAAU;IACV,UAAU;E1CwiOd;E0CroOF;IA+FM,UAAU;IACV,UAAU;E1CyiOd;E0CzoOF;IzCgLI,gByC9EqC;E1C0iOvC;E0C5oOF;IzCgLI,qByC5E0C;E1C2iO5C;E0C/oOF;IzCgLI,gByC1EqC;E1C4iOvC;E0ClpOF;IzCgLI,qByCxE0C;E1C6iO5C;E0CrpOF;IzCgLI,gByCtEqC;E1C8iOvC;E0CxpOF;IzCgLI,gByCpEqC;E1C+iOvC;E0C3pOF;IzCgLI,gByClEqC;E1CgjOvC;E0C9pOF;IzCgLI,gByChEqC;E1CijOvC;E0CjqOF;IzCgLI,gByC9DqC;E1CkjOvC;E0CpqOF;IAqHQ,UAAU;IACV,SAAiC;E1CkjOvC;E0CxqOF;IzCgLI,eyCxD8D;E1CmjOhE;E0C3qOF;IAqHQ,UAAU;IACV,eAAiC;E1CyjOvC;E0C/qOF;IzCgLI,qByCxD8D;E1C0jOhE;E0ClrOF;IAqHQ,UAAU;IACV,gBAAiC;E1CgkOvC;E0CtrOF;IzCgLI,sByCxD8D;E1CikOhE;E0CzrOF;IAqHQ,UAAU;IACV,UAAiC;E1CukOvC;E0C7rOF;IzCgLI,gByCxD8D;E1CwkOhE;E0ChsOF;IAqHQ,UAAU;IACV,gBAAiC;E1C8kOvC;E0CpsOF;IzCgLI,sByCxD8D;E1C+kOhE;E0CvsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CqlOvC;E0C3sOF;IzCgLI,sByCxD8D;E1CslOhE;E0C9sOF;IAqHQ,UAAU;IACV,UAAiC;E1C4lOvC;E0CltOF;IzCgLI,gByCxD8D;E1C6lOhE;E0CrtOF;IAqHQ,UAAU;IACV,gBAAiC;E1CmmOvC;E0CztOF;IzCgLI,sByCxD8D;E1ComOhE;E0C5tOF;IAqHQ,UAAU;IACV,gBAAiC;E1C0mOvC;E0ChuOF;IzCgLI,sByCxD8D;E1C2mOhE;E0CnuOF;IAqHQ,UAAU;IACV,UAAiC;E1CinOvC;E0CvuOF;IzCgLI,gByCxD8D;E1CknOhE;E0C1uOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwnOvC;E0C9uOF;IzCgLI,sByCxD8D;E1CynOhE;E0CjvOF;IAqHQ,UAAU;IACV,gBAAiC;E1C+nOvC;E0CrvOF;IzCgLI,sByCxD8D;E1CgoOhE;E0CxvOF;IAqHQ,UAAU;IACV,WAAiC;E1CsoOvC;E0C5vOF;IzCgLI,iByCxD8D;E1CuoOhE;AACF;;AC1pOE;EyCtGF;IA4HM,UAAU;IACV,YAAY;E1CyoOhB;E0CtwOF;IAgIM,UAAU;IACV,WAAW;E1CyoOf;E0C1wOF;IAoIM,UAAU;IACV,UAAU;E1CyoOd;E0C9wOF;IAwIM,UAAU;IACV,eAAe;E1CyoOnB;E0ClxOF;IA4IM,UAAU;IACV,UAAU;E1CyoOd;E0CtxOF;IAgJM,UAAU;IACV,eAAe;E1CyoOnB;E0C1xOF;IAoJM,UAAU;IACV,UAAU;E1CyoOd;E0C9xOF;IAwJM,UAAU;IACV,UAAU;E1CyoOd;E0ClyOF;IA4JM,UAAU;IACV,UAAU;E1CyoOd;E0CtyOF;IAgKM,UAAU;IACV,UAAU;E1CyoOd;E0C1yOF;IAoKM,UAAU;IACV,UAAU;E1CyoOd;E0C9yOF;IzCgLI,gByCRqC;E1CyoOvC;E0CjzOF;IzCgLI,qByCL0C;E1CyoO5C;E0CpzOF;IzCgLI,gByCFqC;E1CyoOvC;E0CvzOF;IzCgLI,qByCC0C;E1CyoO5C;E0C1zOF;IzCgLI,gByCIqC;E1CyoOvC;E0C7zOF;IzCgLI,gByCOqC;E1CyoOvC;E0Ch0OF;IzCgLI,gByCUqC;E1CyoOvC;E0Cn0OF;IzCgLI,gByCaqC;E1CyoOvC;E0Ct0OF;IzCgLI,gByCgBqC;E1CyoOvC;E0Cz0OF;IAoMQ,UAAU;IACV,SAAiC;E1CwoOvC;E0C70OF;IzCgLI,eyCwB8D;E1CwoOhE;E0Ch1OF;IAoMQ,UAAU;IACV,eAAiC;E1C+oOvC;E0Cp1OF;IzCgLI,qByCwB8D;E1C+oOhE;E0Cv1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CspOvC;E0C31OF;IzCgLI,sByCwB8D;E1CspOhE;E0C91OF;IAoMQ,UAAU;IACV,UAAiC;E1C6pOvC;E0Cl2OF;IzCgLI,gByCwB8D;E1C6pOhE;E0Cr2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CoqOvC;E0Cz2OF;IzCgLI,sByCwB8D;E1CoqOhE;E0C52OF;IAoMQ,UAAU;IACV,gBAAiC;E1C2qOvC;E0Ch3OF;IzCgLI,sByCwB8D;E1C2qOhE;E0Cn3OF;IAoMQ,UAAU;IACV,UAAiC;E1CkrOvC;E0Cv3OF;IzCgLI,gByCwB8D;E1CkrOhE;E0C13OF;IAoMQ,UAAU;IACV,gBAAiC;E1CyrOvC;E0C93OF;IzCgLI,sByCwB8D;E1CyrOhE;E0Cj4OF;IAoMQ,UAAU;IACV,gBAAiC;E1CgsOvC;E0Cr4OF;IzCgLI,sByCwB8D;E1CgsOhE;E0Cx4OF;IAoMQ,UAAU;IACV,UAAiC;E1CusOvC;E0C54OF;IzCgLI,gByCwB8D;E1CusOhE;E0C/4OF;IAoMQ,UAAU;IACV,gBAAiC;E1C8sOvC;E0Cn5OF;IzCgLI,sByCwB8D;E1C8sOhE;E0Ct5OF;IAoMQ,UAAU;IACV,gBAAiC;E1CqtOvC;E0C15OF;IzCgLI,sByCwB8D;E1CqtOhE;E0C75OF;IAoMQ,UAAU;IACV,WAAiC;E1C4tOvC;E0Cj6OF;IzCgLI,iByCwB8D;E1C4tOhE;AACF;;ACvzOE;EyC9GF;IA2MM,UAAU;IACV,YAAY;E1C+tOhB;E0C36OF;IA8MM,UAAU;IACV,WAAW;E1CguOf;E0C/6OF;IAiNM,UAAU;IACV,UAAU;E1CiuOd;E0Cn7OF;IAoNM,UAAU;IACV,eAAe;E1CkuOnB;E0Cv7OF;IAuNM,UAAU;IACV,UAAU;E1CmuOd;E0C37OF;IA0NM,UAAU;IACV,eAAe;E1CouOnB;E0C/7OF;IA6NM,UAAU;IACV,UAAU;E1CquOd;E0Cn8OF;IAgOM,UAAU;IACV,UAAU;E1CsuOd;E0Cv8OF;IAmOM,UAAU;IACV,UAAU;E1CuuOd;E0C38OF;IAsOM,UAAU;IACV,UAAU;E1CwuOd;E0C/8OF;IAyOM,UAAU;IACV,UAAU;E1CyuOd;E0Cn9OF;IzCgLI,gByC4DqC;E1C0uOvC;E0Ct9OF;IzCgLI,qByC8D0C;E1C2uO5C;E0Cz9OF;IzCgLI,gByCgEqC;E1C4uOvC;E0C59OF;IzCgLI,qByCkE0C;E1C6uO5C;E0C/9OF;IzCgLI,gByCoEqC;E1C8uOvC;E0Cl+OF;IzCgLI,gByCsEqC;E1C+uOvC;E0Cr+OF;IzCgLI,gByCwEqC;E1CgvOvC;E0Cx+OF;IzCgLI,gByC0EqC;E1CivOvC;E0C3+OF;IzCgLI,gByC4EqC;E1CkvOvC;E0C9+OF;IA+PQ,UAAU;IACV,SAAiC;E1CkvOvC;E0Cl/OF;IzCgLI,eyCkF8D;E1CmvOhE;E0Cr/OF;IA+PQ,UAAU;IACV,eAAiC;E1CyvOvC;E0Cz/OF;IzCgLI,qByCkF8D;E1C0vOhE;E0C5/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CgwOvC;E0ChgPF;IzCgLI,sByCkF8D;E1CiwOhE;E0CngPF;IA+PQ,UAAU;IACV,UAAiC;E1CuwOvC;E0CvgPF;IzCgLI,gByCkF8D;E1CwwOhE;E0C1gPF;IA+PQ,UAAU;IACV,gBAAiC;E1C8wOvC;E0C9gPF;IzCgLI,sByCkF8D;E1C+wOhE;E0CjhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CqxOvC;E0CrhPF;IzCgLI,sByCkF8D;E1CsxOhE;E0CxhPF;IA+PQ,UAAU;IACV,UAAiC;E1C4xOvC;E0C5hPF;IzCgLI,gByCkF8D;E1C6xOhE;E0C/hPF;IA+PQ,UAAU;IACV,gBAAiC;E1CmyOvC;E0CniPF;IzCgLI,sByCkF8D;E1CoyOhE;E0CtiPF;IA+PQ,UAAU;IACV,gBAAiC;E1C0yOvC;E0C1iPF;IzCgLI,sByCkF8D;E1C2yOhE;E0C7iPF;IA+PQ,UAAU;IACV,UAAiC;E1CizOvC;E0CjjPF;IzCgLI,gByCkF8D;E1CkzOhE;E0CpjPF;IA+PQ,UAAU;IACV,gBAAiC;E1CwzOvC;E0CxjPF;IzCgLI,sByCkF8D;E1CyzOhE;E0C3jPF;IA+PQ,UAAU;IACV,gBAAiC;E1C+zOvC;E0C/jPF;IzCgLI,sByCkF8D;E1Cg0OhE;E0ClkPF;IA+PQ,UAAU;IACV,WAAiC;E1Cs0OvC;E0CtkPF;IzCgLI,iByCkF8D;E1Cu0OhE;AACF;;ACx9OE;EyClHF;IAqQM,UAAU;IACV,YAAY;E1C00OhB;E0ChlPF;IAwQM,UAAU;IACV,WAAW;E1C20Of;E0CplPF;IA2QM,UAAU;IACV,UAAU;E1C40Od;E0CxlPF;IA8QM,UAAU;IACV,eAAe;E1C60OnB;E0C5lPF;IAiRM,UAAU;IACV,UAAU;E1C80Od;E0ChmPF;IAoRM,UAAU;IACV,eAAe;E1C+0OnB;E0CpmPF;IAuRM,UAAU;IACV,UAAU;E1Cg1Od;E0CxmPF;IA0RM,UAAU;IACV,UAAU;E1Ci1Od;E0C5mPF;IA6RM,UAAU;IACV,UAAU;E1Ck1Od;E0ChnPF;IAgSM,UAAU;IACV,UAAU;E1Cm1Od;E0CpnPF;IAmSM,UAAU;IACV,UAAU;E1Co1Od;E0CxnPF;IzCgLI,gByCsHqC;E1Cq1OvC;E0C3nPF;IzCgLI,qByCwH0C;E1Cs1O5C;E0C9nPF;IzCgLI,gByC0HqC;E1Cu1OvC;E0CjoPF;IzCgLI,qByC4H0C;E1Cw1O5C;E0CpoPF;IzCgLI,gByC8HqC;E1Cy1OvC;E0CvoPF;IzCgLI,gByCgIqC;E1C01OvC;E0C1oPF;IzCgLI,gByCkIqC;E1C21OvC;E0C7oPF;IzCgLI,gByCoIqC;E1C41OvC;E0ChpPF;IzCgLI,gByCsIqC;E1C61OvC;E0CnpPF;IAyTQ,UAAU;IACV,SAAiC;E1C61OvC;E0CvpPF;IzCgLI,eyC4I8D;E1C81OhE;E0C1pPF;IAyTQ,UAAU;IACV,eAAiC;E1Co2OvC;E0C9pPF;IzCgLI,qByC4I8D;E1Cq2OhE;E0CjqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C22OvC;E0CrqPF;IzCgLI,sByC4I8D;E1C42OhE;E0CxqPF;IAyTQ,UAAU;IACV,UAAiC;E1Ck3OvC;E0C5qPF;IzCgLI,gByC4I8D;E1Cm3OhE;E0C/qPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cy3OvC;E0CnrPF;IzCgLI,sByC4I8D;E1C03OhE;E0CtrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cg4OvC;E0C1rPF;IzCgLI,sByC4I8D;E1Ci4OhE;E0C7rPF;IAyTQ,UAAU;IACV,UAAiC;E1Cu4OvC;E0CjsPF;IzCgLI,gByC4I8D;E1Cw4OhE;E0CpsPF;IAyTQ,UAAU;IACV,gBAAiC;E1C84OvC;E0CxsPF;IzCgLI,sByC4I8D;E1C+4OhE;E0C3sPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cq5OvC;E0C/sPF;IzCgLI,sByC4I8D;E1Cs5OhE;E0CltPF;IAyTQ,UAAU;IACV,UAAiC;E1C45OvC;E0CttPF;IzCgLI,gByC4I8D;E1C65OhE;E0CztPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm6OvC;E0C7tPF;IzCgLI,sByC4I8D;E1Co6OhE;E0ChuPF;IAyTQ,UAAU;IACV,gBAAiC;E1C06OvC;E0CpuPF;IzCgLI,sByC4I8D;E1C26OhE;E0CvuPF;IAyTQ,UAAU;IACV,WAAiC;E1Ci7OvC;E0C3uPF;IzCgLI,iByC4I8D;E1Ck7OhE;AACF;;AC9mPI;EyCjIJ;IA+TM,UAAU;IACV,YAAY;E1Cq7OhB;E0CrvPF;IAkUM,UAAU;IACV,WAAW;E1Cs7Of;E0CzvPF;IAqUM,UAAU;IACV,UAAU;E1Cu7Od;E0C7vPF;IAwUM,UAAU;IACV,eAAe;E1Cw7OnB;E0CjwPF;IA2UM,UAAU;IACV,UAAU;E1Cy7Od;E0CrwPF;IA8UM,UAAU;IACV,eAAe;E1C07OnB;E0CzwPF;IAiVM,UAAU;IACV,UAAU;E1C27Od;E0C7wPF;IAoVM,UAAU;IACV,UAAU;E1C47Od;E0CjxPF;IAuVM,UAAU;IACV,UAAU;E1C67Od;E0CrxPF;IA0VM,UAAU;IACV,UAAU;E1C87Od;E0CzxPF;IA6VM,UAAU;IACV,UAAU;E1C+7Od;E0C7xPF;IzCgLI,gByCgLqC;E1Cg8OvC;E0ChyPF;IzCgLI,qByCkL0C;E1Ci8O5C;E0CnyPF;IzCgLI,gByCoLqC;E1Ck8OvC;E0CtyPF;IzCgLI,qByCsL0C;E1Cm8O5C;E0CzyPF;IzCgLI,gByCwLqC;E1Co8OvC;E0C5yPF;IzCgLI,gByC0LqC;E1Cq8OvC;E0C/yPF;IzCgLI,gByC4LqC;E1Cs8OvC;E0ClzPF;IzCgLI,gByC8LqC;E1Cu8OvC;E0CrzPF;IzCgLI,gByCgMqC;E1Cw8OvC;E0CxzPF;IAmXQ,UAAU;IACV,SAAiC;E1Cw8OvC;E0C5zPF;IzCgLI,eyCsM8D;E1Cy8OhE;E0C/zPF;IAmXQ,UAAU;IACV,eAAiC;E1C+8OvC;E0Cn0PF;IzCgLI,qByCsM8D;E1Cg9OhE;E0Ct0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs9OvC;E0C10PF;IzCgLI,sByCsM8D;E1Cu9OhE;E0C70PF;IAmXQ,UAAU;IACV,UAAiC;E1C69OvC;E0Cj1PF;IzCgLI,gByCsM8D;E1C89OhE;E0Cp1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Co+OvC;E0Cx1PF;IzCgLI,sByCsM8D;E1Cq+OhE;E0C31PF;IAmXQ,UAAU;IACV,gBAAiC;E1C2+OvC;E0C/1PF;IzCgLI,sByCsM8D;E1C4+OhE;E0Cl2PF;IAmXQ,UAAU;IACV,UAAiC;E1Ck/OvC;E0Ct2PF;IzCgLI,gByCsM8D;E1Cm/OhE;E0Cz2PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cy/OvC;E0C72PF;IzCgLI,sByCsM8D;E1C0/OhE;E0Ch3PF;IAmXQ,UAAU;IACV,gBAAiC;E1CggPvC;E0Cp3PF;IzCgLI,sByCsM8D;E1CigPhE;E0Cv3PF;IAmXQ,UAAU;IACV,UAAiC;E1CugPvC;E0C33PF;IzCgLI,gByCsM8D;E1CwgPhE;E0C93PF;IAmXQ,UAAU;IACV,gBAAiC;E1C8gPvC;E0Cl4PF;IzCgLI,sByCsM8D;E1C+gPhE;E0Cr4PF;IAmXQ,UAAU;IACV,gBAAiC;E1CqhPvC;E0Cz4PF;IzCgLI,sByCsM8D;E1CshPhE;E0C54PF;IAmXQ,UAAU;IACV,WAAiC;E1C4hPvC;E0Ch5PF;IzCgLI,iByCsM8D;E1C6hPhE;AACF;;ACpwPI;EyChJJ;IAyXM,UAAU;IACV,YAAY;E1CgiPhB;E0C15PF;IA4XM,UAAU;IACV,WAAW;E1CiiPf;E0C95PF;IA+XM,UAAU;IACV,UAAU;E1CkiPd;E0Cl6PF;IAkYM,UAAU;IACV,eAAe;E1CmiPnB;E0Ct6PF;IAqYM,UAAU;IACV,UAAU;E1CoiPd;E0C16PF;IAwYM,UAAU;IACV,eAAe;E1CqiPnB;E0C96PF;IA2YM,UAAU;IACV,UAAU;E1CsiPd;E0Cl7PF;IA8YM,UAAU;IACV,UAAU;E1CuiPd;E0Ct7PF;IAiZM,UAAU;IACV,UAAU;E1CwiPd;E0C17PF;IAoZM,UAAU;IACV,UAAU;E1CyiPd;E0C97PF;IAuZM,UAAU;IACV,UAAU;E1C0iPd;E0Cl8PF;IzCgLI,gByC0OqC;E1C2iPvC;E0Cr8PF;IzCgLI,qByC4O0C;E1C4iP5C;E0Cx8PF;IzCgLI,gByC8OqC;E1C6iPvC;E0C38PF;IzCgLI,qByCgP0C;E1C8iP5C;E0C98PF;IzCgLI,gByCkPqC;E1C+iPvC;E0Cj9PF;IzCgLI,gByCoPqC;E1CgjPvC;E0Cp9PF;IzCgLI,gByCsPqC;E1CijPvC;E0Cv9PF;IzCgLI,gByCwPqC;E1CkjPvC;E0C19PF;IzCgLI,gByC0PqC;E1CmjPvC;E0C79PF;IA6aQ,UAAU;IACV,SAAiC;E1CmjPvC;E0Cj+PF;IzCgLI,eyCgQ8D;E1CojPhE;E0Cp+PF;IA6aQ,UAAU;IACV,eAAiC;E1C0jPvC;E0Cx+PF;IzCgLI,qByCgQ8D;E1C2jPhE;E0C3+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CikPvC;E0C/+PF;IzCgLI,sByCgQ8D;E1CkkPhE;E0Cl/PF;IA6aQ,UAAU;IACV,UAAiC;E1CwkPvC;E0Ct/PF;IzCgLI,gByCgQ8D;E1CykPhE;E0Cz/PF;IA6aQ,UAAU;IACV,gBAAiC;E1C+kPvC;E0C7/PF;IzCgLI,sByCgQ8D;E1CglPhE;E0ChgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CslPvC;E0CpgQF;IzCgLI,sByCgQ8D;E1CulPhE;E0CvgQF;IA6aQ,UAAU;IACV,UAAiC;E1C6lPvC;E0C3gQF;IzCgLI,gByCgQ8D;E1C8lPhE;E0C9gQF;IA6aQ,UAAU;IACV,gBAAiC;E1ComPvC;E0ClhQF;IzCgLI,sByCgQ8D;E1CqmPhE;E0CrhQF;IA6aQ,UAAU;IACV,gBAAiC;E1C2mPvC;E0CzhQF;IzCgLI,sByCgQ8D;E1C4mPhE;E0C5hQF;IA6aQ,UAAU;IACV,UAAiC;E1CknPvC;E0ChiQF;IzCgLI,gByCgQ8D;E1CmnPhE;E0CniQF;IA6aQ,UAAU;IACV,gBAAiC;E1CynPvC;E0CviQF;IzCgLI,sByCgQ8D;E1C0nPhE;E0C1iQF;IA6aQ,UAAU;IACV,gBAAiC;E1CgoPvC;E0C9iQF;IzCgLI,sByCgQ8D;E1CioPhE;E0CjjQF;IA6aQ,UAAU;IACV,WAAiC;E1CuoPvC;E0CrjQF;IzCgLI,iByCgQ8D;E1CwoPhE;AACF;;A0CvoPA;EzClQI,qByClLgB;EzCkLhB,sByClLgB;EAublB,oBAvbkB;A1CikQpB;;A0C7oPA;EAKI,uBAzbgB;A1CqkQpB;;A0CjpPA;EAOI,qCAA4C;A1C8oPhD;;A0CrpPA;EAUI,uBAAuB;A1C+oP3B;;A0CzpPA;EzClQI,cyC8QiC;EzC9QjC,eyC+QiC;EACjC,aAAa;A1CipPjB;;A0C/pPA;EAgBM,SAAS;EACT,qBAAqB;A1CmpP3B;;A0CpqPA;EAmBM,qBAAqB;A1CqpP3B;;A0CxqPA;EAqBM,gBAAgB;A1CupPtB;;A0C5qPA;EAuBI,aAAa;A1CypPjB;;A0ChrPA;EAyBI,eAAe;A1C2pPnB;;A0CprPA;EA2BI,mBAAmB;A1C6pPvB;;ACpgQE;EyC4UF;IA+BM,aAAa;E1C8pPjB;AACF;;AC9/PE;EyCgUF;IAmCM,aAAa;E1CgqPjB;AACF;;A0C9pPE;EACE,oBAAY;EzCzSZ,wCyC0S2D;EzC1S3D,yCyC2S2D;A1CiqP/D;;A0CpqPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1CmqPrC;;A0CzqPE;EASM,iBAAY;A1CoqPpB;;ACniQE;EyCsXA;IAYQ,iBAAY;E1CsqPpB;AACF;;ACriQE;EyCkXA;IAeQ,iBAAY;E1CyqPpB;AACF;;ACviQE;EyC8WA;IAkBQ,iBAAY;E1C4qPpB;AACF;;ACziQE;EyC0WA;IAqBQ,iBAAY;E1C+qPpB;AACF;;AC3iQE;EyCsWA;IAwBQ,iBAAY;E1CkrPpB;AACF;;AC5iQI;EyCiWF;IA2BQ,iBAAY;E1CqrPpB;AACF;;ACxiQI;EyCuVF;IA8BQ,iBAAY;E1CwrPpB;AACF;;ACziQI;EyCkVF;IAiCQ,iBAAY;E1C2rPpB;AACF;;ACriQI;EyCwUF;IAoCQ,iBAAY;E1C8rPpB;AACF;;A0CnuPE;EASM,oBAAY;A1C8tPpB;;AC7lQE;EyCsXA;IAYQ,oBAAY;E1CguPpB;AACF;;AC/lQE;EyCkXA;IAeQ,oBAAY;E1CmuPpB;AACF;;ACjmQE;EyC8WA;IAkBQ,oBAAY;E1CsuPpB;AACF;;ACnmQE;EyC0WA;IAqBQ,oBAAY;E1CyuPpB;AACF;;ACrmQE;EyCsWA;IAwBQ,oBAAY;E1C4uPpB;AACF;;ACtmQI;EyCiWF;IA2BQ,oBAAY;E1C+uPpB;AACF;;AClmQI;EyCuVF;IA8BQ,oBAAY;E1CkvPpB;AACF;;ACnmQI;EyCkVF;IAiCQ,oBAAY;E1CqvPpB;AACF;;AC/lQI;EyCwUF;IAoCQ,oBAAY;E1CwvPpB;AACF;;A0C7xPE;EASM,mBAAY;A1CwxPpB;;ACvpQE;EyCsXA;IAYQ,mBAAY;E1C0xPpB;AACF;;ACzpQE;EyCkXA;IAeQ,mBAAY;E1C6xPpB;AACF;;AC3pQE;EyC8WA;IAkBQ,mBAAY;E1CgyPpB;AACF;;AC7pQE;EyC0WA;IAqBQ,mBAAY;E1CmyPpB;AACF;;AC/pQE;EyCsWA;IAwBQ,mBAAY;E1CsyPpB;AACF;;AChqQI;EyCiWF;IA2BQ,mBAAY;E1CyyPpB;AACF;;AC5pQI;EyCuVF;IA8BQ,mBAAY;E1C4yPpB;AACF;;AC7pQI;EyCkVF;IAiCQ,mBAAY;E1C+yPpB;AACF;;ACzpQI;EyCwUF;IAoCQ,mBAAY;E1CkzPpB;AACF;;A0Cv1PE;EASM,oBAAY;A1Ck1PpB;;ACjtQE;EyCsXA;IAYQ,oBAAY;E1Co1PpB;AACF;;ACntQE;EyCkXA;IAeQ,oBAAY;E1Cu1PpB;AACF;;ACrtQE;EyC8WA;IAkBQ,oBAAY;E1C01PpB;AACF;;ACvtQE;EyC0WA;IAqBQ,oBAAY;E1C61PpB;AACF;;ACztQE;EyCsWA;IAwBQ,oBAAY;E1Cg2PpB;AACF;;AC1tQI;EyCiWF;IA2BQ,oBAAY;E1Cm2PpB;AACF;;ACttQI;EyCuVF;IA8BQ,oBAAY;E1Cs2PpB;AACF;;ACvtQI;EyCkVF;IAiCQ,oBAAY;E1Cy2PpB;AACF;;ACntQI;EyCwUF;IAoCQ,oBAAY;E1C42PpB;AACF;;A0Cj5PE;EASM,iBAAY;A1C44PpB;;AC3wQE;EyCsXA;IAYQ,iBAAY;E1C84PpB;AACF;;AC7wQE;EyCkXA;IAeQ,iBAAY;E1Ci5PpB;AACF;;AC/wQE;EyC8WA;IAkBQ,iBAAY;E1Co5PpB;AACF;;ACjxQE;EyC0WA;IAqBQ,iBAAY;E1Cu5PpB;AACF;;ACnxQE;EyCsWA;IAwBQ,iBAAY;E1C05PpB;AACF;;ACpxQI;EyCiWF;IA2BQ,iBAAY;E1C65PpB;AACF;;AChxQI;EyCuVF;IA8BQ,iBAAY;E1Cg6PpB;AACF;;ACjxQI;EyCkVF;IAiCQ,iBAAY;E1Cm6PpB;AACF;;AC7wQI;EyCwUF;IAoCQ,iBAAY;E1Cs6PpB;AACF;;A0C38PE;EASM,oBAAY;A1Cs8PpB;;ACr0QE;EyCsXA;IAYQ,oBAAY;E1Cw8PpB;AACF;;ACv0QE;EyCkXA;IAeQ,oBAAY;E1C28PpB;AACF;;ACz0QE;EyC8WA;IAkBQ,oBAAY;E1C88PpB;AACF;;AC30QE;EyC0WA;IAqBQ,oBAAY;E1Ci9PpB;AACF;;AC70QE;EyCsWA;IAwBQ,oBAAY;E1Co9PpB;AACF;;AC90QI;EyCiWF;IA2BQ,oBAAY;E1Cu9PpB;AACF;;AC10QI;EyCuVF;IA8BQ,oBAAY;E1C09PpB;AACF;;AC30QI;EyCkVF;IAiCQ,oBAAY;E1C69PpB;AACF;;ACv0QI;EyCwUF;IAoCQ,oBAAY;E1Cg+PpB;AACF;;A0CrgQE;EASM,mBAAY;A1CggQpB;;AC/3QE;EyCsXA;IAYQ,mBAAY;E1CkgQpB;AACF;;ACj4QE;EyCkXA;IAeQ,mBAAY;E1CqgQpB;AACF;;ACn4QE;EyC8WA;IAkBQ,mBAAY;E1CwgQpB;AACF;;ACr4QE;EyC0WA;IAqBQ,mBAAY;E1C2gQpB;AACF;;ACv4QE;EyCsWA;IAwBQ,mBAAY;E1C8gQpB;AACF;;ACx4QI;EyCiWF;IA2BQ,mBAAY;E1CihQpB;AACF;;ACp4QI;EyCuVF;IA8BQ,mBAAY;E1CohQpB;AACF;;ACr4QI;EyCkVF;IAiCQ,mBAAY;E1CuhQpB;AACF;;ACj4QI;EyCwUF;IAoCQ,mBAAY;E1C0hQpB;AACF;;A0C/jQE;EASM,oBAAY;A1C0jQpB;;ACz7QE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AgD;A7Cg0RxD;;A6C/zRI;EACE,oCAAyC;A7Ck0R/C;;A6Ch0RI;EACE,yBAA6B;A7Cm0RnC;;A6Cl0RI;EAGI,yBAAgD;A7Cm0RxD;;A6Cl0RI;EACE,oCAAwC;A7Cq0R9C;;A6Cj2RE;EACE,yBAAwB;A7Co2R5B;;A6Cn2RE;EAGI,yBAA0C;A7Co2RhD;;A6Cn2RE;EACE,oCAAmC;A7Cs2RvC;;A6Cj2RI;EACE,yBAA8B;A7Co2RpC;;A6Cn2RI;EAGI,yBAAgD;A7Co2RxD;;A6Cn2RI;EACE,oCAAyC;A7Cs2R/C;;A6Cp2RI;EACE,yBAA6B;A7Cu2RnC;;A6Ct2RI;EAGI,yBAAgD;A7Cu2RxD;;A6Ct2RI;EACE,oCAAwC;A7Cy2R9C;;A6Cr4RE;EACE,yBAAwB;A7Cw4R5B;;A6Cv4RE;EAGI,yBAA0C;A7Cw4RhD;;A6Cv4RE;EACE,oCAAmC;A7C04RvC;;A6Cr4RI;EACE,yBAA8B;A7Cw4RpC;;A6Cv4RI;EAGI,yBAAgD;A7Cw4RxD;;A6Cv4RI;EACE,oCAAyC;A7C04R/C;;A6Cx4RI;EACE,yBAA6B;A7C24RnC;;A6C14RI;EAGI,yBAAgD;A7C24RxD;;A6C14RI;EACE,oCAAwC;A7C64R9C;;A6Cz6RE;EACE,yBAAwB;A7C46R5B;;A6C36RE;EAGI,yBAA0C;A7C46RhD;;A6C36RE;EACE,oCAAmC;A7C86RvC;;A6Cz6RI;EACE,yBAA8B;A7C46RpC;;A6C36RI;EAGI,yBAAgD;A7C46RxD;;A6C36RI;EACE,oCAAyC;A7C86R/C;;A6C56RI;EACE,yBAA6B;A7C+6RnC;;A6C96RI;EAGI,yBAAgD;A7C+6RxD;;A6C96RI;EACE,oCAAwC;A7Ci7R9C;;A6C78RE;EACE,yBAAwB;A7Cg9R5B;;A6C/8RE;EAGI,yBAA0C;A7Cg9RhD;;A6C/8RE;EACE,oCAAmC;A7Ck9RvC;;A6C78RI;EACE,yBAA8B;A7Cg9RpC;;A6C/8RI;EAGI,yBAAgD;A7Cg9RxD;;A6C/8RI;EACE,oCAAyC;A7Ck9R/C;;A6Ch9RI;EACE,yBAA6B;A7Cm9RnC;;A6Cl9RI;EAGI,yBAAgD;A7Cm9RxD;;A6Cl9RI;EACE,oCAAwC;A7Cq9R9C;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,yBAAwB;A7Cq+R5B;;A6Cp+RE;EACE,oCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A6Cl/RE;EACE,yBAAwB;A7Cq/R5B;;A6Cp/RE;EACE,oCAAmC;A7Cu/RvC;;A6C1/RE;EACE,yBAAwB;A7C6/R5B;;A6C5/RE;EACE,oCAAmC;A7C+/RvC;;A6ClgSE;EACE,yBAAwB;A7CqgS5B;;A6CpgSE;EACE,oCAAmC;A7CugSvC;;A6C1gSE;EACE,4BAAwB;A7C6gS5B;;A6C5gSE;EACE,uCAAmC;A7C+gSvC;;A6ClhSE;EACE,yBAAwB;A7CqhS5B;;A6CphSE;EACE,oCAAmC;A7CuhSvC;;A8C3jSE;EACE,8BAAiC;A9C8jSrC;;A8C/jSE;EACE,sCAAiC;A9CkkSrC;;A8CnkSE;EACE,iCAAiC;A9CskSrC;;A8CvkSE;EACE,yCAAiC;A9C0kSrC;;A8CtkSE;EACE,4BAA4B;A9CykShC;;A8C1kSE;EACE,0BAA4B;A9C6kShC;;A8C9kSE;EACE,kCAA4B;A9CilShC;;A8C7kSE;EACE,sCAAkC;A9CglStC;;A8CjlSE;EACE,oCAAkC;A9ColStC;;A8CrlSE;EACE,kCAAkC;A9CwlStC;;A8CzlSE;EACE,yCAAkC;A9C4lStC;;A8C7lSE;EACE,wCAAkC;A9CgmStC;;A8CjmSE;EACE,wCAAkC;A9ComStC;;A8CrmSE;EACE,iCAAkC;A9CwmStC;;A8CzmSE;EACE,+BAAkC;A9C4mStC;;A8C7mSE;EACE,gCAAkC;A9CgnStC;;A8CjnSE;EACE,iCAAkC;A9ConStC;;A8ChnSE;EACE,oCAAgC;A9CmnSpC;;A8CpnSE;EACE,kCAAgC;A9CunSpC;;A8CxnSE;EACE,gCAAgC;A9C2nSpC;;A8C5nSE;EACE,uCAAgC;A9C+nSpC;;A8ChoSE;EACE,sCA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Dv4TE;IACE,0BAA2B;EpDy4T/B;EoD14TE;IACE,4BAA2B;EpD44T/B;EoD74TE;IACE,6BAA2B;EpD+4T/B;EoDh5TE;IACE,0BAA2B;EpDk5T/B;EoDn5TE;IACE,6BAA2B;EpDq5T/B;AACF;;ACvxTI;EmDhIA;IACE,0BAA2B;EpD25T/B;EoD55TE;IACE,4BAA2B;EpD85T/B;EoD/5TE;IACE,0BAA2B;EpDi6T/B;EoDl6TE;IACE,4BAA2B;EpDo6T/B;EoDr6TE;IACE,6BAA2B;EpDu6T/B;EoDx6TE;IACE,0BAA2B;EpD06T/B;EoD36TE;IACE,6BAA2B;EpD66T/B;AACF;;AChyTI;EmD/IA;IACE,0BAA2B;EpDm7T/B;EoDp7TE;IACE,4BAA2B;EpDs7T/B;EoDv7TE;IACE,0BAA2B;EpDy7T/B;EoD17TE;IACE,4BAA2B;EpD47T/B;EoD77TE;IACE,6BAA2B;EpD+7T/B;EoDh8TE;IACE,0BAA2B;EpDk8T/B;EoDn8TE;IACE,6BAA2B;EpDq8T/B;AACF;;AoD76TE;EACE,6BAAqC;ApDg7TzC;;AoDj7TE;EACE,8BAAqC;ApDo7TzC;;AoDr7TE;EACE,2BAAqC;ApDw7TzC;;AoDz7TE;EACE,4BAAqC;ApD47TzC;;ACt3TE;EmDlEE;IACE,6BAAqC;EpD47TzC;AACF;;ACx3TE;EmDnEE;IACE,6BAAqC;EpD+7TzC;AACF;;AC13TE;EmDpEE;IACE,6BAAqC;EpDk8TzC;AACF;;AC53TE;EmDrEE;IACE,6BAAqC;EpDq8TzC;AACF;;AC93TE;EmDtEE;IACE,6BAAqC;EpDw8TzC;AACF;;AC/3TI;EmDxEA;IACE,6BAAqC;EpD28TzC;AACF;;AC33TI;EmD/EA;IACE,6BAAqC;EpD88TzC;AACF;;AC53TI;EmDjFA;IACE,6BAAqC;EpDi9TzC;AACF;;ACx3TI;EmDxFA;IACE,6BAAqC;EpDo9TzC;AACF;;AC56TE;EmDlEE;IACE,8BAAqC;EpDk/TzC;AACF;;AC96TE;EmDnEE;IACE,8BAAqC;EpDq/TzC;AACF;;ACh7TE;EmDpEE;IACE,8BAAqC;EpDw/TzC;AACF;;ACl7TE;EmDrEE;IACE,8BAAqC;EpD2/TzC;AACF;;ACp7TE;EmDtEE;IACE,8BAAqC;EpD8/TzC;AACF;;ACr7TI;EmDxEA;IACE,8BAAqC;EpDigUzC;AACF;;ACj7TI;EmD/EA;IACE,8BAAqC;EpDogUzC;AACF;;ACl7TI;EmDjFA;IACE,8BAAqC;EpDugUzC;AACF;;AC96TI;EmDxFA;IACE,8BAAqC;EpD0gUzC;AACF;;ACl+TE;EmDlEE;IACE,2BAAqC;EpDwiUzC;AACF;;ACp+TE;EmDnEE;IACE,2BAAqC;EpD2iUzC;AACF;;ACt+TE;EmDpEE;IACE,2BAAqC;EpD8iUzC;AACF;;ACx+TE;EmDrEE;IACE,2BAAqC;EpDijUzC;AACF;;AC1+TE;EmDtEE;IACE,2BAAqC;EpDojUzC;AACF;;AC3+TI;EmDxEA;IACE,2BAAqC;EpDujUzC;AACF;;ACv+TI;EmD/EA;IACE,2BAAqC;EpD0jUzC;AACF;;ACx+TI;EmDjFA;IACE,2BAAqC;EpD6jUzC;AACF;;ACp+TI;EmDxFA;IACE,2BAAqC;EpDgkUzC;AACF;;ACxhUE;EmDlEE;IACE,4BAAqC;EpD8lUzC;AACF;;AC1hUE;EmDnEE;IACE,4BAAqC;EpDimUzC;AACF;;AC5hUE;EmDpEE;IACE,4BAAqC;EpDomUzC;AACF;;AC9hUE;EmDrEE;IACE,4BAAqC;EpDumUzC;AACF;;AChiUE;EmDtEE;IACE,4BAAqC;EpD0mUzC;AACF;;ACjiUI;EmDxEA;IACE,4BAAqC;EpD6mUzC;AACF;;AC7hUI;EmD/EA;IACE,4BAAqC;EpDgnUzC;AACF;;AC9hUI;EmDjFA;IACE,4BAAqC;EpDmnUzC;AACF;;AC1hUI;EmDxFA;IACE,4BAAqC;EpDsnUzC;AACF;;AoDrnUA;EACE,qCAAqC;ApDwnUvC;;AoDtnUA;EACE,oCAAoC;ApDynUtC;;AoDvnUA;EACE,oCAAoC;ApD0nUtC;;AoDxnUA;EACE,6BAA6B;ApD2nU/B;;AoDznUA;EACE,qCAAqC;ApD4nUvC;;AoD1nUA;EACE,2BAAqC;ApD6nUvC;;AoD5nUA;EACE,2BAAsC;ApD+nUxC;;AoD9nUA;EACE,2BAAsC;ApDioUxC;;AoDhoUA;EACE,2BAAwC;ApDmoU1C;;AoDloUA;EACE,2BAAoC;ApDqoUtC;;AoDnoUA;EACE,+LAAuC;ApDsoUzC;;AoDpoUA;EACE,+LAAyC;ApDuoU3C;;AoDroUA;EACE,+LAA0C;ApDwoU5C;;AoDtoUA;EACE,iCAAyC;ApDyoU3C;;AoDvoUA;EACE,iCAAoC;ApD0oUtC;;AqD3uUE;EACE,yBAA+B;ArD8uUnC;;AC9oUE;EoD9FE;IACE,yBAA+B;ErDgvUnC;AACF;;AChpUE;EoD/FE;IACE,yBAA+B;ErDmvUnC;AACF;;AClpUE;EoDhGE;IACE,yBAA+B;ErDsvUnC;AACF;;ACppUE;EoDjGE;IACE,yBAA+B;ErDyvUnC;AACF;;ACtpUE;EoDlGE;IACE,yBAA+B;ErD4vUnC;AACF;;ACvpUI;EoDpGA;IACE,yBAA+B;ErD+vUnC;AACF;;ACnpUI;EoD3GA;IACE,yBAA+B;ErDkwUnC;AACF;;ACppUI;EoD7GA;IACE,yBAA+B;ErDqwUnC;AACF;;AChpUI;EoDpHA;IACE,yBAA+B;ErDwwUnC;AACF;;AqDryUE;EACE,wBAA+B;ArDwyUnC;;ACxsUE;EoD9FE;IACE,wBAA+B;ErD0yUnC;AACF;;AC1sUE;EoD/FE;IACE,wBAA+B;ErD6yUnC;AACF;;AC5sUE;EoDhGE;IACE,wBAA+B;ErDgzUnC;AACF;;AC9sUE;EoDjGE;IACE,wBAA+B;ErDmzUnC;AACF;;AChtUE;EoDlGE;IACE,wBAA+B;ErDszUnC;AACF;;ACjtUI;EoDpGA;IACE,wBAA+B;ErDyzUnC;AACF;;AC7sUI;EoD3GA;IACE,wBAA+B;ErD4zUnC;AACF;;AC9sUI;EoD7GA;IACE,wBAA+B;ErD+zUnC;AACF;;AC1sUI;EoDpHA;IACE,wBAA+B;ErDk0UnC;AACF;;AqD/1UE;EACE,0BAA+B;ArDk2UnC;;AClwUE;EoD9FE;IACE,0BAA+B;ErDo2UnC;AACF;;ACpwUE;EoD/FE;IACE,0BAA+B;ErDu2UnC;AACF;;ACtwUE;EoDhGE;IACE,0BAA+B;ErD02UnC;AACF;;ACxwUE;EoDjGE;IACE,0BAA+B;ErD62UnC;AACF;;AC1wUE;EoDlGE;IACE,0BAA+B;ErDg3UnC;AACF;;AC3wUI;EoDpGA;IACE,0BAA+B;ErDm3UnC;AACF;;ACvwUI;EoD3GA;IACE,0BAA+B;ErDs3UnC;AACF;;ACxwUI;EoD7GA;IACE,0BAA+B;ErDy3UnC;AACF;;ACpwUI;EoDpHA;IACE,0BAA+B;ErD43UnC;AACF;;AqDz5UE;EACE,gCAA+B;ArD45UnC;;AC5zUE;EoD9FE;IACE,gCAA+B;ErD85UnC;AACF;;AC9zUE;EoD/FE;IACE,gCAA+B;ErDi6UnC;AACF;;ACh0UE;EoDhGE;IACE,gCAA+B;ErDo6UnC;AACF;;ACl0UE;EoDjGE;IACE,gCAA+B;ErDu6UnC;AACF;;ACp0UE;EoDlGE;IACE,gCAA+B;ErD06UnC;AACF;;ACr0UI;EoDpGA;IACE,gCAA+B;ErD66UnC;AACF;;ACj0UI;EoD3GA;IACE,gCAA+B;ErDg7UnC;AACF;;ACl0UI;EoD7GA;IACE,gCAA+B;ErDm7UnC;AACF;;AC9zUI;EoDpHA;IACE,gCAA+B;ErDs7UnC;AACF;;AqDn9UE;EACE,+BAA+B;ArDs9UnC;;ACt3UE;EoD9FE;IACE,+BAA+B;ErDw9UnC;AACF;;ACx3UE;EoD/FE;IACE,+BAA+B;ErD29UnC;AACF;;AC13UE;EoDhGE;IACE,+BAA+B;ErD89UnC;AACF;;AC53UE;EoDjGE;IACE,+BAA+B;ErDi+UnC;AACF;;AC93UE;EoDlGE;IACE,+BAA+B;ErDo+UnC;AACF;;AC/3UI;EoDpGA;IACE,+BAA+B;ErDu+UnC;AACF;;AC33UI;EoD3GA;IACE,+BAA+B;ErD0+UnC;AACF;;AC53UI;EoD7GA;IACE,+BAA+B;ErD6+UnC;AACF;;ACx3UI;EoDpHA;IACE,+BAA+B;ErDg/UnC;AACF;;AqD/+UA;EACE,wBAAwB;ArDk/U1B;;AqDh/UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArDm/U1B;;AC37UE;EoDrDA;IACE,wBAAwB;ErDo/U1B;AACF;;AC77UE;EoDrDA;IACE,wBAAwB;ErDs/U1B;AACF;;AC/7UE;EoDrDA;IACE,wBAAwB;ErDw/U1B;AACF;;ACj8UE;EoDrDA;IACE,wBAAwB;ErD0/U1B;AACF;;ACn8UE;EoDrDA;IACE,wBAAwB;ErD4/U1B;AACF;;ACp8UI;EoDtDF;IACE,wBAAwB;ErD8/U1B;AACF;;ACh8UI;EoD5DF;IACE,wBAAwB;ErDggV1B;AACF;;ACj8UI;EoD7DF;IACE,wBAAwB;ErDkgV1B;AACF;;AC77UI;EoDnEF;IACE,wBAAwB;ErDogV1B;AACF;;AqDngVA;EACE,6BAA6B;ArDsgV/B;;ACr/UE;EoDdA;IACE,6BAA6B;ErDugV/B;AACF;;ACv/UE;EoDdA;IACE,6BAA6B;ErDygV/B;AACF;;ACz/UE;EoDdA;IACE,6BAA6B;ErD2gV/B;AACF;;AC3/UE;EoDdA;IACE,6BAA6B;ErD6gV/B;AACF;;AC7/UE;EoDdA;IACE,6BAA6B;ErD+gV/B;AACF;;AC9/UI;EoDfF;IACE,6BAA6B;ErDihV/B;AACF;;AC1/UI;EoDrBF;IACE,6BAA6B;ErDmhV/B;AACF;;AC3/UI;EoDtBF;IACE,6BAA6B;ErDqhV/B;AACF;;ACv/UI;EoD5BF;IACE,6BAA6B;ErDuhV/B;AACF;;AsDjpVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvD0oVhC;;AuD9oVA;EAMI,gBAAgB;AvD4oVpB;;AuDlpVA;EASM,mBAAmB;AvD6oVzB;;AuDtpVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;ACoqV7B;;AuD3pVA;;EAmBQ,cAAc;AvD6oVtB;;AuDhqVA;EAqBQ,cxD9BqB;AC6qV7B;;AuDpqVA;EAuBQ,4BxDhCqB;ACirV7B;;AuDxqVA;;EA0BU,cxDnCmB;ACsrV7B;;ACtkVE;EsDvGF;IA6BU,uBxDzBqB;EC8qV7B;AACF;;AuDnrVA;;EAgCQ,4BxDzCqB;ACisV7B;;AuDxrVA;;;EAqCU,yB7C4DuB;E6C3DvB,cxD/CmB;ACwsV7B;;AuD/rVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvD0pVtB;;AuDpsVA;EA4CY,UAAU;AvD4pVtB;;AuDxsVA;EA+CY,uBAAwB;EACxB,UAAU;AvD6pVtB;;AuD7sVA;EAoDY,cxD7DiB;AC0tV7B;;AuDjtVA;EAsDc,uCxD/De;AC8tV7B;;AuDrtVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;ACutV/B;;AuD3tVA;EAkEU,4EAAyG;AvD6pVnH;;ACpoVE;EsD3FF;IAqEc,4EAAyG;EvD+pVrH;AACF;;AuDruVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;ACsuV/B;;AuD1uVA;;EAmBQ,cAAc;AvD4tVtB;;AuD/uVA;EAqBQ,YxDjBuB;AC+uV/B;;AuDnvVA;EAuBQ,+BxDnBuB;ACmvV/B;;AuDvvVA;;EA0BU,YxDtBqB;ACwvV/B;;ACrpVE;EsDvGF;IA6BU,yBxDtCmB;EC0wV3B;AACF;;AuDlwVA;;EAgCQ,+BxD5BuB;ACmwV/B;;AuDvwVA;;;EAqCU,uB7C4DuB;E6C3DvB,YxDlCqB;AC0wV/B;;AuD9wVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDyuVtB;;AuDnxVA;EA4CY,UAAU;AvD2uVtB;;AuDvxVA;EA+CY,yBAAwB;EACxB,UAAU;AvD4uVtB;;AuD5xVA;EAoDY,YxDhDmB;AC4xV/B;;AuDhyVA;EAsDc,uCxD/De;AC6yV7B;;AuDpyVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;ACmzV7B;;AuD1yVA;EAkEU,8EAAyG;AvD4uVnH;;ACntVE;EsD3FF;IAqEc,8EAAyG;EvD8uVrH;AACF;;AuDpzVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AVovVrB;;AuDzzVA;;EAmBQ,cAAc;AvD2yVtB;;AuD9zVA;EAqBQ,yB7CgDa;AV6vVrB;;AuDl0VA;EAuBQ,yB7C8Ca;AViwVrB;;AuDt0VA;;EA0BU,yB7C2CW;AVswVrB;;ACpuVE;EsDvGF;IA6BU,4BxD3BoB;EC80V5B;AACF;;AuDj1VA;;EAgCQ,yB7CqCa;AVixVrB;;AuDt1VA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVwxVrB;;AuD71VA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDwzVtB;;AuDl2VA;EA4CY,UAAU;AvD0zVtB;;AuDt2VA;EA+CY,4BAAwB;EACxB,UAAU;AvD2zVtB;;AuD32VA;EAoDY,yB7CiBS;AV0yVrB;;AuD/2VA;EAsDc,uCxD/De;AC43V7B;;AuDn3VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;ACu3V9B;;AuDz3VA;EAkEU,iFAAyG;AvD2zVnH;;AClyVE;EsD3FF;IAqEc,iFAAyG;EvD6zVrH;AACF;;AuDn4VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVi0VhB;;AuDx4VA;;EAmBQ,cAAc;AvD03VtB;;AuD74VA;EAqBQ,W7CkDQ;AV00VhB;;AuDj5VA;EAuBQ,+B7CgDQ;AV80VhB;;AuDr5VA;;EA0BU,W7C6CM;AVm1VhB;;ACnzVE;EsDvGF;IA6BU,yBxDlCoB;ECo6V5B;AACF;;AuDh6VA;;EAgCQ,+B7CuCQ;AV81VhB;;AuDr6VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVq2VhB;;AuD56VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDu4VtB;;AuDj7VA;EA4CY,UAAU;AvDy4VtB;;AuDr7VA;EA+CY,yBAAwB;EACxB,UAAU;AvD04VtB;;AuD17VA;EAoDY,W7CmBI;AVu3VhB;;AuD97VA;EAsDc,uCxD/De;AC28V7B;;AuDl8VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;AC68V9B;;AuDx8VA;EAkEU,gFAAyG;AvD04VnH;;ACj3VE;EsD3FF;IAqEc,gFAAyG;EvD44VrH;AACF;;AuDl9VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVg5VhB;;AuDv9VA;;EAmBQ,cAAc;AvDy8VtB;;AuD59VA;EAqBQ,W7CkDQ;AVy5VhB;;AuDh+VA;EAuBQ,+B7CgDQ;AV65VhB;;AuDp+VA;;EA0BU,W7C6CM;AVk6VhB;;ACl4VE;EsDvGF;IA6BU,yBxDpBwB;ECq+VhC;AACF;;AuD/+VA;;EAgCQ,+B7CuCQ;AV66VhB;;AuDp/VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVo7VhB;;AuD3/VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDs9VtB;;AuDhgWA;EA4CY,UAAU;AvDw9VtB;;AuDpgWA;EA+CY,yBAAwB;EACxB,UAAU;AvDy9VtB;;AuDzgWA;EAoDY,W7CmBI;AVs8VhB;;AuD7gWA;EAsDc,uCxD/De;AC0hW7B;;AuDjhWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;AC8gWlC;;AuDvhWA;EAkEU,gFAAyG;AvDy9VnH;;ACh8VE;EsD3FF;IAqEc,gFAAyG;EvD29VrH;AACF;;AuDjiWA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AV+9VhB;;AuDtiWA;;EAmBQ,cAAc;AvDwhWtB;;AuD3iWA;EAqBQ,W7CkDQ;AVw+VhB;;AuD/iWA;EAuBQ,+B7CgDQ;AV4+VhB;;AuDnjWA;;EA0BU,W7C6CM;AVi/VhB;;ACj9VE;EsDvGF;IA6BU,yBxDlBwB;ECkjWhC;AACF;;AuD9jWA;;EAgCQ,+B7CuCQ;AV4/VhB;;AuDnkWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVmgWhB;;AuD1kWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDqiWtB;;AuD/kWA;EA4CY,UAAU;AvDuiWtB;;AuDnlWA;EA+CY,yBAAwB;EACxB,UAAU;AvDwiWtB;;AuDxlWA;EAoDY,W7CmBI;AVqhWhB;;AuD5lWA;EAsDc,uCxD/De;ACymW7B;;AuDhmWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;AC2lWlC;;AuDtmWA;EAkEU,gFAAyG;AvDwiWnH;;AC/gWE;EsD3FF;IAqEc,gFAAyG;EvD0iWrH;AACF;;AuDhnWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AV8iWhB;;AuDrnWA;;EAmBQ,cAAc;AvDumWtB;;AuD1nWA;EAqBQ,W7CkDQ;AVujWhB;;AuD9nWA;EAuBQ,+B7CgDQ;AV2jWhB;;AuDloWA;;EA0BU,W7C6CM;AVgkWhB;;AChiWE;EsDvGF;IA6BU,yBxDnBwB;ECkoWhC;AACF;;AuD7oWA;;EAgCQ,+B7CuCQ;AV2kWhB;;AuDlpWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVklWhB;;AuDzpWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDonWtB;;AuD9pWA;EA4CY,UAAU;AvDsnWtB;;AuDlqWA;EA+CY,yBAAwB;EACxB,UAAU;AvDunWtB;;AuDvqWA;EAoDY,W7CmBI;AVomWhB;;AuD3qWA;EAsDc,uCxD/De;ACwrW7B;;AuD/qWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;AC2qWlC;;AuDrrWA;EAkEU,gFAAyG;AvDunWnH;;AC9lWE;EsD3FF;IAqEc,gFAAyG;EvDynWrH;AACF;;AuD/rWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AV6nWhB;;AuDpsWA;;EAmBQ,cAAc;AvDsrWtB;;AuDzsWA;EAqBQ,W7CkDQ;AVsoWhB;;AuD7sWA;EAuBQ,+B7CgDQ;AV0oWhB;;AuDjtWA;;EA0BU,W7C6CM;AV+oWhB;;AC/mWE;EsDvGF;IA6BU,yBxDrBwB;ECmtWhC;AACF;;AuD5tWA;;EAgCQ,+B7CuCQ;AV0pWhB;;AuDjuWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AViqWhB;;AuDxuWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDmsWtB;;AuD7uWA;EA4CY,UAAU;AvDqsWtB;;AuDjvWA;EA+CY,yBAAwB;EACxB,UAAU;AvDssWtB;;AuDtvWA;EAoDY,W7CmBI;AVmrWhB;;AuD1vWA;EAsDc,uCxD/De;ACuwW7B;;AuD9vWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;AC4vWlC;;AuDpwWA;EAkEU,gFAAyG;AvDssWnH;;AC7qWE;EsD3FF;IAqEc,gFAAyG;EvDwsWrH;AACF;;AuD9wWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AV8sWrB;;AuDnxWA;;EAmBQ,cAAc;AvDqwWtB;;AuDxxWA;EAqBQ,yB7CgDa;AVutWrB;;AuD5xWA;EAuBQ,yB7C8Ca;AV2tWrB;;AuDhyWA;;EA0BU,yB7C2CW;AVguWrB;;AC9rWE;EsDvGF;IA6BU,yBxDtBwB;ECmyWhC;AACF;;AuD3yWA;;EAgCQ,yB7CqCa;AV2uWrB;;AuDhzWA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVkvWrB;;AuDvzWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDkxWtB;;AuD5zWA;EA4CY,UAAU;AvDoxWtB;;AuDh0WA;EA+CY,yBAAwB;EACxB,UAAU;AvDqxWtB;;AuDr0WA;EAoDY,yB7CiBS;AVowWrB;;AuDz0WA;EAsDc,uCxD/De;ACs1W7B;;AuD70WA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;AC40WlC;;AuDn1WA;EAkEU,gFAAyG;AvDqxWnH;;AC5vWE;EsD3FF;IAqEc,gFAAyG;EvDuxWrH;AACF;;AuD71WA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AV2xWhB;;AuDl2WA;;EAmBQ,cAAc;AvDo1WtB;;AuDv2WA;EAqBQ,W7CkDQ;AVoyWhB;;AuD32WA;EAuBQ,+B7CgDQ;AVwyWhB;;AuD/2WA;;EA0BU,W7C6CM;AV6yWhB;;AC7wWE;EsDvGF;IA6BU,yBxDhBuB;EC42W/B;AACF;;AuD13WA;;EAgCQ,+B7CuCQ;AVwzWhB;;AuD/3WA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AV+zWhB;;AuDt4WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDi2WtB;;AuD34WA;EA4CY,UAAU;AvDm2WtB;;AuD/4WA;EA+CY,yBAAwB;EACxB,UAAU;AvDo2WtB;;AuDp5WA;EAoDY,W7CmBI;AVi1WhB;;AuDx5WA;EAsDc,uCxD/De;ACq6W7B;;AuD55WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;ACq5WjC;;AuDl6WA;EAkEU,gFAAyG;AvDo2WnH;;AC30WE;EsD3FF;IAqEc,gFAAyG;EvDs2WrH;AACF;;AuD56WA;EAyEM,eAhF0B;AvDu7WhC;;ACj1WE;EsD/FF;IA6EQ,oBAnF8B;EvD27WpC;AACF;;ACv1WE;EsD/FF;IAiFQ,mBAtF4B;EvDg8WlC;AACF;;AuD57WA;EAsFM,mBAAmB;EACnB,aAAa;AvD02WnB;;AuDj8WA;EAyFQ,YAAY;EACZ,cAAc;AvD42WtB;;AuDt8WA;EA4FI,gBAAgB;AvD82WpB;;AuD18WA;EA8FI,iBAAiB;AvDg3WrB;;AuD52WA;EAEE,gBAAgB;AvD82WlB;;AuDh3WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDg3WzC;;AuDz3WA;EAYI,YAAY;AvDi3WhB;;ACp4WE;EsDOF;IAeI,aAAa;EvDm3Wf;AACF;;AuDl3WA;EACE,kBAAkB;AvDq3WpB;;AC94WE;EsDwBF;IAKM,aAAa;EvDs3WjB;EuD33WF;IAOQ,sBAAsB;EvDu3W5B;AACF;;ACn5WE;EsDoBF;IASI,aAAa;IACb,uBAAuB;EvD23WzB;EuDr4WF;ItDsDI,oBsD1CwC;EvD43W1C;AACF;;AuDz3WA;;EAEE,YAAY;EACZ,cAAc;AvD43WhB;;AuD13WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDihX/B;;ACz6WE;EsDyCF;IAKI,kBArJgC;EvDqhXlC;AACF;;AwDlhXA;EACE,oBAN2B;AxD2hX7B;;ACv6WE;EuD/GF;IAII,kBAR+B;ExD+hXjC;EwD3hXF;IAOM,oBAV8B;ExDiiXlC;EwD9hXF;IASM,mBAX4B;ExDmiXhC;AACF;;AyDniXA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzD0iXjC","file":"bulma.css"} \ No newline at end of file diff --git a/pagetop/static/aliner/css/styles.css b/pagetop/static/theme/css/styles.css similarity index 100% rename from pagetop/static/aliner/css/styles.css rename to pagetop/static/theme/css/styles.css From e98141281a79ea15bb6743f2f91fc620a7a0dd2a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Feb 2023 08:41:33 +0100 Subject: [PATCH 266/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20[admin]=20Quita?= =?UTF-8?q?=20men=C3=BA=20que=20pasar=C3=A1=20a=20m=C3=B3dulo=20externo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 9b763b50..a0f98401 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,7 +1,8 @@ -use super::l; +//use super::l; use pagetop::prelude::*; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { + /* let top_menu = Menu::new() .with_item(MenuItem::label(l("module_name").as_str())) .with_item(MenuItem::link("Opción 2", "https://www.google.es")) @@ -39,19 +40,21 @@ pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalEr .with_item(MenuItem::label("Opción 2")), )) .with_item(MenuItem::label("Opción 4")); + */ Page::new(request) .with_context(ContextOp::Theme("Bootsier")) .with_title("Admin") - .with_this_in("top-menu", top_menu) - .with_this_in( - "region-content", - grid::Row::new() - .with_column(grid::Column::new().with_component(side_menu)) - .with_column(grid::Column::new().with_component(Html::with(html! { - p { "Columna 2"} - }))), - ) + /* .with_this_in("top-menu", top_menu) + .with_this_in( + "region-content", + grid::Row::new() + .with_column(grid::Column::new().with_component(side_menu)) + .with_column(grid::Column::new().with_component(Html::with(html! { + p { "Columna 2"} + }))), + ) + */ .with_template("admin") .render() } From fd54389cd515fda18392d8b47738a99c90f4696e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Feb 2023 08:45:52 +0100 Subject: [PATCH 267/853] =?UTF-8?q?=F0=9F=8E=89=20[aliner]=20Saca=20tema?= =?UTF-8?q?=20del=20c=C3=B3digo=20base=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/Cargo.toml | 23 ++ pagetop-aliner/README.md | 27 ++ pagetop-aliner/build.rs | 3 + pagetop-aliner/src/lib.rs | 30 +++ pagetop-aliner/static/css/styles.css | 356 +++++++++++++++++++++++++++ 5 files changed, 439 insertions(+) create mode 100644 pagetop-aliner/Cargo.toml create mode 100644 pagetop-aliner/README.md create mode 100644 pagetop-aliner/build.rs create mode 100644 pagetop-aliner/src/lib.rs create mode 100644 pagetop-aliner/static/css/styles.css diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml new file mode 100644 index 00000000..17a359fa --- /dev/null +++ b/pagetop-aliner/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "pagetop-aliner" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Theme for PageTop that uses minimal CSS with bounding boxes for page layout and component \ + display.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +pagetop = { path = "../pagetop", version = "0.0" } +static-files = "0.2.3" +maud = "0.24.0" + +[build-dependencies] +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-aliner/README.md b/pagetop-aliner/README.md new file mode 100644 index 00000000..f35e4f1a --- /dev/null +++ b/pagetop-aliner/README.md @@ -0,0 +1,27 @@ +Tema para **PageTop** que define un conjunto mínimo de estilos con cajas delimitadas por bordes para +la composición de páginas y visualización de componentes. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-aliner/build.rs b/pagetop-aliner/build.rs new file mode 100644 index 00000000..ba1cd204 --- /dev/null +++ b/pagetop-aliner/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static", "aliner", None) +} diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs new file mode 100644 index 00000000..c4fe9935 --- /dev/null +++ b/pagetop-aliner/src/lib.rs @@ -0,0 +1,30 @@ +use pagetop::prelude::*; + +pub_handle!(THEME_ALINER); + +include!(concat!(env!("OUT_DIR"), "/aliner.rs")); + +pub struct Aliner; + +impl ModuleTrait for Aliner { + fn handle(&self) -> Handle { + THEME_ALINER + } + + fn theme(&self) -> Option<ThemeStaticRef> { + Some(&Aliner) + } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/aliner", bundle_aliner); + } +} + +impl ThemeTrait for Aliner { + fn before_render_page(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::located("/aliner/css/styles.css").with_weight(-99), + )); + } +} diff --git a/pagetop-aliner/static/css/styles.css b/pagetop-aliner/static/css/styles.css new file mode 100644 index 00000000..1cc2f5dc --- /dev/null +++ b/pagetop-aliner/static/css/styles.css @@ -0,0 +1,356 @@ +html { + background-color: white; + padding: 1px 3px; +} +body { + padding: 1px 3px; +} +div { + padding: 1px 3px; + margin: 5px; +} +h1, h2, h3, h4,h5, h6, p { + background-color: snow; +} +* * { + outline: 5px solid rgba(255,0,0,.1); +} +* * * { + outline: 3px dashed rgba(255,0,0,.4); +} +* * * * { + outline: 2px dotted rgba(255,0,0,.6); +} +* * * * * { + outline: 1px dotted rgba(255,0,0,.9); +} +* * * * * * { + outline-color: gray; +} + +*::before, *::after { + background: #faa; + border-radius: 3px; + font: normal normal 400 10px/1.2 monospace; + vertical-align: middle; + padding: 1px 3px; + margin: 0 3px; +} +*::before { + content: "("; +} +*::after { + content: ")"; +} + +a::before { content: "<a>"; } +a::after { content: "</a>"; } +abbr::before { content: "<abbr>"; } +abbr::after { content: "</abbr>"; } +acronym::before { content: "<acronym>"; } +acronym::after { content: "</acronym>"; } +address::before { content: "<address>"; } +address::after { content: "</address>"; } +applet::before { content: "<applet>"; } +applet::after { content: "</applet>"; } +area::before { content: "<area>"; } +area::after { content: "</area>"; } +article::before { content: "<article>"; } +article::after { content: "</article>"; } +aside::before { content: "<aside>"; } +aside::after { content: "</aside>"; } +audio::before { content: "<audio>"; } +audio::after { content: "</audio>"; } + +b::before { content: "<b>"; } +b::after { content: "</b>"; } +base::before { content: "<base>"; } +base::after { content: "</base>"; } +basefont::before { content: "<basefont>"; } +basefont::after { content: "</basefont>"; } +bdi::before { content: "<bdi>"; } +bdi::after { content: "</bdi>"; } +bdo::before { content: "<bdo>"; } +bdo::after { content: "</bdo>"; } +bgsound::before { content: "<bgsound>"; } +bgsound::after { content: "</bgsound>"; } +big::before { content: "<big>"; } +big::after { content: "</big>"; } +blink::before { content: "<blink>"; } +blink::after { content: "</blink>"; } +blockquote::before { content: "<blockquote>"; } +blockquote::after { content: "</blockquote>"; } +body::before { content: "<body>"; } +body::after { content: "</body>"; } +br::before { content: "<br>"; } +br::after { content: "</br>"; } +button::before { content: "<button>"; } +button::after { content: "</button>"; } + +caption::before { content: "<caption>"; } +caption::after { content: "</caption>"; } +canvas::before { content: "<canvas>"; } +canvas::after { content: "</canvas>"; } +center::before { content: "<center>"; } +center::after { content: "</center>"; } +cite::before { content: "<cite>"; } +cite::after { content: "</cite>"; } +code::before { content: "<code>"; } +code::after { content: "</code>"; } +col::before { content: "<col>"; } +col::after { content: "</col>"; } +colgroup::before { content: "<colgroup>"; } +colgroup::after { content: "</colgroup>"; } +command::before { content: "<command>"; } +command::after { content: "</command>"; } +content::before { content: "<content>"; } +content::after { content: "</content>"; } + +data::before { content: "<data>"; } +data::after { content: "</data>"; } +datalist::before { content: "<datalist>"; } +datalist::after { content: "</datalist>"; } +dd::before { content: "<dd>"; } +dd::after { content: "</dd>"; } +del::before { content: "<del>"; } +del::after { content: "</del>"; } +details::before { content: "<details>"; } +details::after { content: "</details>"; } +dfn::before { content: "<dfn>"; } +dfn::after { content: "</dfn>"; } +dialog::before { content: "<dialog>"; } +dialog::after { content: "</dialog>"; } +dir::before { content: "<dir>"; } +dir::after { content: "</dir>"; } +div::before { content: "<div>"; } +div::after { content: "</div>"; } +dl::before { content: "<dl>"; } +dl::after { content: "</dl>"; } +dt::before { content: "<dt>"; } +dt::after { content: "</dt>"; } + +element::before { content: "<element>"; } +element::after { content: "</element>"; } +em::before { content: "<em>"; } +em::after { content: "</em>"; } +embed::before { content: "<embed>"; } +embed::after { content: "</embed>"; } + +fieldset::before { content: "<fieldset>"; } +fieldset::after { content: "</fieldset>"; } +figcaption::before { content: "<figcaption>"; } +figcaption::after { content: "</figcaption>"; } +figure::before { content: "<figure>"; } +figure::after { content: "</figure>"; } +font::before { content: "<font>"; } +font::after { content: "</font>"; } +footer::before { content: "<footer>"; } +footer::after { content: "</footer>"; } +form::before { content: "<form>"; } +form::after { content: "</form>"; } +frame::before { content: "<frame>"; } +frame::after { content: "</frame>"; } +frameset::before { content: "<frameset>"; } +frameset::after { content: "</frameset>"; } + +h1::before { content: "<h1>"; } +h1::after { content: "</h1>"; } +h2::before { content: "<h2>"; } +h2::after { content: "</h2>"; } +h3::before { content: "<h3>"; } +h3::after { content: "</h3>"; } +h4::before { content: "<h4>"; } +h4::after { content: "</h4>"; } +h5::before { content: "<h5>"; } +h5::after { content: "</h5>"; } +h6::before { content: "<h6>"; } +h6::after { content: "</h6>"; } +head::before { content: "<head>"; } +head::after { content: "</head>"; } +header::before { content: "<header>"; } +header::after { content: "</header>"; } +hgroup::before { content: "<hgroup>"; } +hgroup::after { content: "</hgroup>"; } +hr::before { content: "<hr>"; } +hr::after { content: "</hr>"; } +html::before { content: "<html>"; } +html::after { content: "</html>"; } + +i::before { content: "<i>"; } +i::after { content: "</i>"; } +iframe::before { content: "<iframe>"; } +iframe::after { content: "</iframe>"; } +image::before { content: "<image>"; } +image::after { content: "</image>"; } +img::before { content: "<img>"; } +img::after { content: "</img>"; } +input::before { content: "<input>"; } +input::after { content: "</input>"; } +ins::before { content: "<ins>"; } +ins::after { content: "</ins>"; } +isindex::before { content: "<isindex>"; } +isindex::after { content: "</isindex>"; } + +kbd::before { content: "<kbd>"; } +kbd::after { content: "</kbd>"; } +keygen::before { content: "<keygen>"; } +keygen::after { content: "</keygen>"; } + +label::before { content: "<label>"; } +label::after { content: "</label>"; } +legend::before { content: "<legend>"; } +legend::after { content: "</legend>"; } +li::before { content: "<li>"; } +li::after { content: "</li>"; } +link::before { content: "<link>"; } +link::after { content: "</link>"; } +listing::before { content: "<listing>"; } +listing::after { content: "</listing>"; } + +main::before { content: "<main>"; } +main::after { content: "</main>"; } +map::before { content: "<map>"; } +map::after { content: "</map>"; } +mark::before { content: "<mark>"; } +mark::after { content: "</mark>"; } +marquee::before { content: "<marquee>"; } +marquee::after { content: "</marquee>"; } +menu::before { content: "<menu>"; } +menu::after { content: "</menu>"; } +menuitem::before { content: "<menuitem>"; } +menuitem::after { content: "</menuitem>"; } +meta::before { content: "<meta>"; } +meta::after { content: "</meta>"; } +meter::before { content: "<meter>"; } +meter::after { content: "</meter>"; } +multicol::before { content: "<multicol>"; } +multicol::after { content: "</multicol>"; } + +nav::before { content: "<nav>"; } +nav::after { content: "</nav>"; } +nextid::before { content: "<nextid>"; } +nextid::after { content: "</nextid>"; } +nobr::before { content: "<nobr>"; } +nobr::after { content: "</nobr>"; } +noembed::before { content: "<noembed>"; } +noembed::after { content: "</noembed>"; } +noframes::before { content: "<noframes>"; } +noframes::after { content: "</noframes>"; } +noscript::before { content: "<noscript>"; } +noscript::after { content: "</noscript>"; } + +object::before { content: "<object>"; } +object::after { content: "</object>"; } +ol::before { content: "<ol>"; } +ol::after { content: "</ol>"; } +optgroup::before { content: "<optgroup>"; } +optgroup::after { content: "</optgroup>"; } +option::before { content: "<option>"; } +option::after { content: "</option>"; } +output::before { content: "<output>"; } +output::after { content: "</output>"; } + +p::before { content: "<p>"; } +p::after { content: "</p>"; } +param::before { content: "<param>"; } +param::after { content: "</param>"; } +picture::before { content: "<picture>"; } +picture::after { content: "</picture>"; } +plaintext::before { content: "<plaintext>"; } +plaintext::after { content: "</plaintext>"; } +pre::before { content: "<pre>"; } +pre::after { content: "</pre>"; } +progress::before { content: "<progress>"; } +progress::after { content: "</progress>"; } + +q::before { content: "<q>"; } +q::after { content: "</q>"; } + +rb::before { content: "<rb>"; } +rb::after { content: "</rb>"; } +rp::before { content: "<rp>"; } +rp::after { content: "</rp>"; } +rt::before { content: "<rt>"; } +rt::after { content: "</rt>"; } +rtc::before { content: "<rtc>"; } +rtc::after { content: "</rtc>"; } +ruby::before { content: "<ruby>"; } +ruby::after { content: "</ruby>"; } + +s::before { content: "<s>"; } +s::after { content: "</s>"; } +samp::before { content: "<samp>"; } +samp::after { content: "</samp>"; } +script::before { content: "<script>"; } +script::after { content: "</script>"; } +section::before { content: "<section>"; } +section::after { content: "</section>"; } +select::before { content: "<select>"; } +select::after { content: "</select>"; } +shadow::before { content: "<shadow>"; } +shadow::after { content: "</shadow>"; } +slot::before { content: "<slot>"; } +slot::after { content: "</slot>"; } +small::before { content: "<small>"; } +small::after { content: "</small>"; } +source::before { content: "<source>"; } +source::after { content: "</source>"; } +spacer::before { content: "<spacer>"; } +spacer::after { content: "</spacer>"; } +span::before { content: "<span>"; } +span::after { content: "</span>"; } +strike::before { content: "<strike>"; } +strike::after { content: "</strike>"; } +strong::before { content: "<strong>"; } +strong::after { content: "</strong>"; } +style::before { content: "<style>"; } +style::after { content: "<\/style>"; } +sub::before { content: "<sub>"; } +sub::after { content: "</sub>"; } +summary::before { content: "<summary>"; } +summary::after { content: "</summary>"; } +sup::before { content: "<sup>"; } +sup::after { content: "</sup>"; } + +table::before { content: "<table>"; } +table::after { content: "</table>"; } +tbody::before { content: "<tbody>"; } +tbody::after { content: "</tbody>"; } +td::before { content: "<td>"; } +td::after { content: "</td>"; } +template::before { content: "<template>"; } +template::after { content: "</template>"; } +textarea::before { content: "<textarea>"; } +textarea::after { content: "</textarea>"; } +tfoot::before { content: "<tfoot>"; } +tfoot::after { content: "</tfoot>"; } +th::before { content: "<th>"; } +th::after { content: "</th>"; } +thead::before { content: "<thead>"; } +thead::after { content: "</thead>"; } +time::before { content: "<time>"; } +time::after { content: "</time>"; } +title::before { content: "<title>"; } +title::after { content: "</title>"; } +tr::before { content: "<tr>"; } +tr::after { content: "</tr>"; } +track::before { content: "<track>"; } +track::after { content: "</track>"; } +tt::before { content: "<tt>"; } +tt::after { content: "</tt>"; } + +u::before { content: "<u>"; } +u::after { content: "</u>"; } +ul::before { content: "<ul>"; } +ul::after { content: "</ul>"; } + +var::before { content: "<var>"; } +var::after { content: "</var>"; } +video::before { content: "<video>"; } +video::after { content: "</video>"; } + +wbr::before { content: "<wbr>"; } +wbr::after { content: "</wbr>"; } + +xmp::before { content: "<xmp>"; } +xmp::after { content: "</xmp>"; } From 20f6c85e682db0d88202239ddeb9376afc121c92 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Feb 2023 08:47:21 +0100 Subject: [PATCH 268/853] =?UTF-8?q?=F0=9F=8E=89=20[minimal]=20Saca=20tema?= =?UTF-8?q?=20del=20c=C3=B3digo=20base=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/build.rs | 3 +++ pagetop-minimal/Cargo.toml | 18 ++++++++++++++++++ pagetop-minimal/README.md | 27 +++++++++++++++++++++++++++ pagetop-minimal/src/lib.rs | 17 +++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 pagetop-bootsier/build.rs create mode 100644 pagetop-minimal/Cargo.toml create mode 100644 pagetop-minimal/README.md create mode 100644 pagetop-minimal/src/lib.rs diff --git a/pagetop-bootsier/build.rs b/pagetop-bootsier/build.rs new file mode 100644 index 00000000..43a25bd1 --- /dev/null +++ b/pagetop-bootsier/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static", "bootsier", None) +} diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml new file mode 100644 index 00000000..a24da3ba --- /dev/null +++ b/pagetop-minimal/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "pagetop-minimal" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Theme for PageTop that uses minimal CSS for page layout and component display.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +pagetop = { path = "../pagetop", version = "0.0" } +maud = "0.24.0" diff --git a/pagetop-minimal/README.md b/pagetop-minimal/README.md new file mode 100644 index 00000000..0cc87d10 --- /dev/null +++ b/pagetop-minimal/README.md @@ -0,0 +1,27 @@ +Tema para **PageTop** que define un conjunto mínimo de estilos para la composición de páginas y +visualización de componentes. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs new file mode 100644 index 00000000..15c6c3a2 --- /dev/null +++ b/pagetop-minimal/src/lib.rs @@ -0,0 +1,17 @@ +use pagetop::prelude::*; + +pub_handle!(THEME_MINIMAL); + +pub struct Minimal; + +impl ModuleTrait for Minimal { + fn handle(&self) -> Handle { + THEME_MINIMAL + } + + fn theme(&self) -> Option<ThemeStaticRef> { + Some(&Minimal) + } +} + +impl ThemeTrait for Minimal {} From b95a154a347d2e1bf7833d8b013978de7d75c42d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Feb 2023 08:53:24 +0100 Subject: [PATCH 269/853] =?UTF-8?q?=F0=9F=8E=89=20[jquery]=20M=C3=B3dulo?= =?UTF-8?q?=20para=20incluir=20jQuery=20en=20p=C3=A1ginas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/Cargo.toml | 21 ++++++++++++ pagetop-jquery/README.md | 26 +++++++++++++++ pagetop-jquery/build.rs | 3 ++ pagetop-jquery/src/lib.rs | 44 +++++++++++++++++++++++++ pagetop-jquery/static/js/jquery.min.js | 2 ++ pagetop-jquery/static/js/jquery.min.map | 1 + 6 files changed, 97 insertions(+) create mode 100644 pagetop-jquery/Cargo.toml create mode 100644 pagetop-jquery/README.md create mode 100644 pagetop-jquery/build.rs create mode 100644 pagetop-jquery/src/lib.rs create mode 100644 pagetop-jquery/static/js/jquery.min.js create mode 100644 pagetop-jquery/static/js/jquery.min.map diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml new file mode 100644 index 00000000..dece2332 --- /dev/null +++ b/pagetop-jquery/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "pagetop-jquery" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Manages the user registration and login system.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } +static-files = "0.2.3" + +[build-dependencies] +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-jquery/README.md b/pagetop-jquery/README.md new file mode 100644 index 00000000..6b98b412 --- /dev/null +++ b/pagetop-jquery/README.md @@ -0,0 +1,26 @@ +Módulo para añadir jQuery a las páginas generadas con **PageTop**. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-jquery/build.rs b/pagetop-jquery/build.rs new file mode 100644 index 00000000..7ebea757 --- /dev/null +++ b/pagetop-jquery/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static", "jquery", None) +} diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs new file mode 100644 index 00000000..20280e44 --- /dev/null +++ b/pagetop-jquery/src/lib.rs @@ -0,0 +1,44 @@ +use pagetop::prelude::*; + +pub_handle!(MODULE_JQUERY); + +include!(concat!(env!("OUT_DIR"), "/jquery.rs")); + +const JQUERY_PARAM: &str = "jquery.add"; +const JQUERY_SOURCE: &str = "/jquery/js/jquery.min.js"; + +pub struct JQuery; + +impl ModuleTrait for JQuery { + fn handle(&self) -> Handle { + MODULE_JQUERY + } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/jquery", bundle_jquery); + } +} + +impl JQuery { + pub fn add_jquery(rcx: &mut RenderContext) { + match rcx.get_param::<bool>(JQUERY_PARAM) { + Some(true) => {} + _ => { + rcx.alter(ContextOp::AddJavaScript( + JavaScript::located(JQUERY_SOURCE) + .with_version("3.6.0") + .with_weight(isize::MIN) + .with_mode(ModeJS::Normal), + )); + rcx.set_param::<bool>(JQUERY_PARAM, true); + } + } + } + + pub fn remove_jquery(rcx: &mut RenderContext) { + if let Some(true) = rcx.get_param::<bool>(JQUERY_PARAM) { + rcx.alter(ContextOp::RemoveJavaScript(JQUERY_SOURCE)); + rcx.set_param::<bool>(JQUERY_PARAM, false); + } + } +} diff --git a/pagetop-jquery/static/js/jquery.min.js b/pagetop-jquery/static/js/jquery.min.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/pagetop-jquery/static/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); diff --git a/pagetop-jquery/static/js/jquery.min.map b/pagetop-jquery/static/js/jquery.min.map new file mode 100644 index 00000000..7d86eb16 --- /dev/null +++ b/pagetop-jquery/static/js/jquery.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file From da4c1e097e5c952be3c897c5fe3440701f7d8805 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Feb 2023 08:54:43 +0100 Subject: [PATCH 270/853] =?UTF-8?q?=F0=9F=8E=89=20[bootsier]=20Saca=20tema?= =?UTF-8?q?=20del=20c=C3=B3digo=20base=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 23 ++++++ pagetop-bootsier/README.md | 27 +++++++ pagetop-bootsier/locales/en-US/bootsier.ftl | 5 ++ pagetop-bootsier/locales/es-ES/bootsier.ftl | 5 ++ pagetop-bootsier/src/lib.rs | 71 ++++++++++++++++++ pagetop-bootsier/static/css/bootstrap.min.css | 7 ++ .../static/css/bootstrap.min.css.map | 1 + pagetop-bootsier/static/images/caution.png | Bin 0 -> 12481 bytes .../static/js/bootstrap.bundle.min.js | 7 ++ .../static/js/bootstrap.bundle.min.js.map | 1 + 10 files changed, 147 insertions(+) create mode 100644 pagetop-bootsier/Cargo.toml create mode 100644 pagetop-bootsier/README.md create mode 100644 pagetop-bootsier/locales/en-US/bootsier.ftl create mode 100644 pagetop-bootsier/locales/es-ES/bootsier.ftl create mode 100644 pagetop-bootsier/src/lib.rs create mode 100644 pagetop-bootsier/static/css/bootstrap.min.css create mode 100644 pagetop-bootsier/static/css/bootstrap.min.css.map create mode 100644 pagetop-bootsier/static/images/caution.png create mode 100644 pagetop-bootsier/static/js/bootstrap.bundle.min.js create mode 100644 pagetop-bootsier/static/js/bootstrap.bundle.min.js.map diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml new file mode 100644 index 00000000..8bc69bad --- /dev/null +++ b/pagetop-bootsier/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "pagetop-bootsier" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Theme for PageTop that uses the Bootstrap framework for page layout and component display.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +pagetop = { path = "../pagetop", version = "0.0" } +pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } +static-files = "0.2.3" +maud = "0.24.0" + +[build-dependencies] +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-bootsier/README.md b/pagetop-bootsier/README.md new file mode 100644 index 00000000..d39acb13 --- /dev/null +++ b/pagetop-bootsier/README.md @@ -0,0 +1,27 @@ +Tema para **PageTop** que utiliza el *framework* [Bootstrap](https://getbootstrap.com/) para la +composición de páginas y visualización de componentes. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-bootsier/locales/en-US/bootsier.ftl b/pagetop-bootsier/locales/en-US/bootsier.ftl new file mode 100644 index 00000000..0e8969cd --- /dev/null +++ b/pagetop-bootsier/locales/en-US/bootsier.ftl @@ -0,0 +1,5 @@ +e404-description = Oops! Page Not Found +e404-message = The page you are looking for may have been removed, had its name changed, or is temporarily unavailable. +e500-description = Oops! Unexpected Error +e500-message = We're having an issue. Please report this error to an administrator. +back-homepage = Back to homepage diff --git a/pagetop-bootsier/locales/es-ES/bootsier.ftl b/pagetop-bootsier/locales/es-ES/bootsier.ftl new file mode 100644 index 00000000..998b54f2 --- /dev/null +++ b/pagetop-bootsier/locales/es-ES/bootsier.ftl @@ -0,0 +1,5 @@ +e404-description = ¡Vaya! Página No Encontrada +e404-message = La página que está buscando puede haber sido eliminada, cambiada de nombre o no está disponible temporalmente. +e500-description = ¡Vaya! Error Inesperado +e500-message = Está ocurriendo una incidencia. Por favor, informe de este error a un administrador. +back-homepage = Volver al inicio diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs new file mode 100644 index 00000000..54fb8e02 --- /dev/null +++ b/pagetop-bootsier/src/lib.rs @@ -0,0 +1,71 @@ +use pagetop::prelude::*; + +pub_handle!(THEME_BOOTSIER); + +pub_locale!("locales"); + +include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); + +pub struct Bootsier; + +impl ModuleTrait for Bootsier { + fn handle(&self) -> Handle { + THEME_BOOTSIER + } + + fn theme(&self) -> Option<ThemeStaticRef> { + Some(&Bootsier) + } + + fn dependencies(&self) -> Vec<ModuleStaticRef> { + vec![&pagetop_jquery::JQuery] + } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/bootsier", bundle_bootsier); + } +} + +impl ThemeTrait for Bootsier { + fn before_render_page(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::located("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_context(ContextOp::AddJavaScript( + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") + .with_weight(-99), + )); + pagetop_jquery::JQuery::add_jquery(page.context()); + } + + fn error_404_not_found(&self) -> Container { + Container::new().with_component(Html::with(html! { + div class="jumbotron" { + div class="media" { + img + src="/bootsier/images/caution.png" + class="mr-4" + style="width: 20%; max-width: 188px" + alt="Caution!"; + div class="media-body" { + h1 class="display-4" { ("RESOURCE NOT FOUND") } + p class="lead" { (l("e404-description")) } + hr class="my-4"; + p { (l("e404-description")) } + a + class="btn btn-primary btn-lg" + href="/" + role="button" + { + (l("back-homepage")) + } + } + } + } + })) + } +} diff --git a/pagetop-bootsier/static/css/bootstrap.min.css b/pagetop-bootsier/static/css/bootstrap.min.css new file mode 100644 index 00000000..1472dec0 --- /dev/null +++ b/pagetop-bootsier/static/css/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--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-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-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",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, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--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-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;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:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-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[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{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{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}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 (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-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 (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-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 (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;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)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.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 (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.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:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.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 (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.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:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.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 (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.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:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.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 (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.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:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.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 (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.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:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.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-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.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)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--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:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--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:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--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:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--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:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@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:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;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::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;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::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.2rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.3rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.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 rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-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 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-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{background-color:#0d6efd;border-color:#0d6efd;background-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")}.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{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image: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-position:left center;border-radius:2em;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{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image: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")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){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:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);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.73L.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.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e"),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.73L.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.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);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-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image: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 5l6 6 6-6'/%3e%3c/svg%3e"),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,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;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){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.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;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.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{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-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:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;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:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-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%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-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%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-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-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{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-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor: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,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%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-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left: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-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.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:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent 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 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-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% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.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 0z'/%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-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.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.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.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}.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}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display: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:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;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:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!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}.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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left: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}.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-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!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:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-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:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left: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}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left: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}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left: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}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left: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}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float: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-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:1 1 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}.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}.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-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left: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-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left: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}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-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-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}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/pagetop-bootsier/static/css/bootstrap.min.css.map b/pagetop-bootsier/static/css/bootstrap.min.css.map new file mode 100644 index 00000000..c84afa43 --- /dev/null +++ b/pagetop-bootsier/static/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"iBAAA;;;;;ACAA,MAQI,UAAA,QAAA,YAAA,QAAA,YAAA,QAAA,UAAA,QAAA,SAAA,QAAA,YAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAAA,UAAA,QAAA,WAAA,KAAA,UAAA,QAAA,eAAA,QAIA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAIA,aAAA,QAAA,eAAA,QAAA,aAAA,QAAA,UAAA,QAAA,aAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAIA,iBAAA,EAAA,CAAA,GAAA,CAAA,IAAA,mBAAA,GAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,EAAA,CAAA,GAAA,CAAA,GAAA,cAAA,EAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,GAAA,CAAA,GAAA,CAAA,EAAA,gBAAA,GAAA,CAAA,EAAA,CAAA,GAAA,eAAA,GAAA,CAAA,GAAA,CAAA,IAAA,cAAA,EAAA,CAAA,EAAA,CAAA,GAGF,eAAA,GAAA,CAAA,GAAA,CAAA,IACA,eAAA,CAAA,CAAA,CAAA,CAAA,EACA,oBAAA,EAAA,CAAA,EAAA,CAAA,GACA,iBAAA,GAAA,CAAA,GAAA,CAAA,IAMA,qBAAA,SAAA,CAAA,aAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WAAA,CAAA,iBAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,iBAAA,CAAA,mBACA,oBAAA,cAAA,CAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UACA,cAAA,2EAQA,sBAAA,0BACA,oBAAA,KACA,sBAAA,IACA,sBAAA,IACA,gBAAA,QAIA,aAAA,KCnCF,ECgDA,QADA,SD5CE,WAAA,WAeE,8CANJ,MAOM,gBAAA,QAcN,KACE,OAAA,EACA,YAAA,2BEmPI,UAAA,yBFjPJ,YAAA,2BACA,YAAA,2BACA,MAAA,qBACA,WAAA,0BACA,iBAAA,kBACA,yBAAA,KACA,4BAAA,YAUF,GACE,OAAA,KAAA,EACA,MAAA,QACA,iBAAA,aACA,OAAA,EACA,QAAA,IAGF,eACE,OAAA,IAUF,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAGA,YAAA,IACA,YAAA,IAIF,IAAA,GEwMQ,UAAA,uBAlKJ,0BFtCJ,IAAA,GE+MQ,UAAA,QF1MR,IAAA,GEmMQ,UAAA,sBAlKJ,0BFjCJ,IAAA,GE0MQ,UAAA,MFrMR,IAAA,GE8LQ,UAAA,oBAlKJ,0BF5BJ,IAAA,GEqMQ,UAAA,SFhMR,IAAA,GEyLQ,UAAA,sBAlKJ,0BFvBJ,IAAA,GEgMQ,UAAA,QF3LR,IAAA,GEgLM,UAAA,QF3KN,IAAA,GE2KM,UAAA,KFhKN,EACE,WAAA,EACA,cAAA,KCoBF,6BDTA,YAEE,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,iCAAA,KAAA,yBAAA,KAMF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QAMF,GCKA,GDHE,aAAA,KCSF,GDNA,GCKA,GDFE,WAAA,EACA,cAAA,KAGF,MCMA,MACA,MAFA,MDDE,cAAA,EAGF,GACE,YAAA,IAKF,GACE,cAAA,MACA,YAAA,EAMF,WACE,OAAA,EAAA,EAAA,KAQF,ECLA,ODOE,YAAA,OAQF,OAAA,ME4EM,UAAA,OFrEN,MAAA,KACE,QAAA,KACA,iBAAA,QASF,ICnBA,IDqBE,SAAA,SEwDI,UAAA,MFtDJ,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAKN,EACE,MAAA,QACA,gBAAA,UAEA,QACE,MAAA,QAWF,2BAAA,iCAEE,MAAA,QACA,gBAAA,KCvBJ,KACA,ID6BA,IC5BA,KDgCE,YAAA,yBEcI,UAAA,IFZJ,UAAA,IACA,aAAA,cAOF,IACE,QAAA,MACA,WAAA,EACA,cAAA,KACA,SAAA,KEAI,UAAA,OFKJ,SELI,UAAA,QFOF,MAAA,QACA,WAAA,OAIJ,KEZM,UAAA,OFcJ,MAAA,QACA,UAAA,WAGA,OACE,MAAA,QAIJ,IACE,QAAA,MAAA,MExBI,UAAA,OF0BJ,MAAA,KACA,iBAAA,QG7SE,cAAA,MHgTF,QACE,QAAA,EE/BE,UAAA,IFiCF,YAAA,IASJ,OACE,OAAA,EAAA,EAAA,KAMF,IChDA,IDkDE,eAAA,OAQF,MACE,aAAA,OACA,gBAAA,SAGF,QACE,YAAA,MACA,eAAA,MACA,MAAA,QACA,WAAA,KAOF,GAEE,WAAA,QACA,WAAA,qBCvDF,MAGA,GAFA,MAGA,GDsDA,MCxDA,GD8DE,aAAA,QACA,aAAA,MACA,aAAA,EAQF,MACE,QAAA,aAMF,OAEE,cAAA,EAQF,iCACE,QAAA,ECrEF,OD0EA,MCxEA,SADA,OAEA,SD4EE,OAAA,EACA,YAAA,QE9HI,UAAA,QFgIJ,YAAA,QAIF,OC3EA,OD6EE,eAAA,KAKF,cACE,OAAA,QAGF,OAGE,UAAA,OAGA,gBACE,QAAA,EAOJ,0CACE,QAAA,KCjFF,cACA,aACA,cDuFA,OAIE,mBAAA,OCvFF,6BACA,4BACA,6BDwFI,sBACE,OAAA,QAON,mBACE,QAAA,EACA,aAAA,KAKF,SACE,OAAA,SAUF,SACE,UAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EAQF,OACE,MAAA,KACA,MAAA,KACA,QAAA,EACA,cAAA,MEnNM,UAAA,sBFsNN,YAAA,QExXE,0BFiXJ,OExMQ,UAAA,QFiNN,SACE,MAAA,KC/FJ,kCDsGA,uCCvGA,mCADA,+BAGA,oCAJA,6BAKA,mCD2GE,QAAA,EAGF,4BACE,OAAA,KASF,cACE,eAAA,KACA,mBAAA,UAmBF,4BACE,mBAAA,KAKF,+BACE,QAAA,EAMF,6BACE,KAAA,QADF,uBACE,KAAA,QAMF,6BACE,KAAA,QACA,mBAAA,OAKF,OACE,QAAA,aAKF,OACE,OAAA,EAOF,QACE,QAAA,UACA,OAAA,QAQF,SACE,eAAA,SAQF,SACE,QAAA,eInlBF,MFyQM,UAAA,QEvQJ,YAAA,IAKA,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,ME7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,QE7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,ME7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,QE7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,ME7QN,WFsQM,UAAA,uBEpQJ,YAAA,IACA,YAAA,IFiGA,0BEpGF,WF6QM,UAAA,QEvPR,eCrDE,aAAA,EACA,WAAA,KDyDF,aC1DE,aAAA,EACA,WAAA,KD4DF,kBACE,QAAA,aAEA,mCACE,aAAA,MAUJ,YFsNM,UAAA,OEpNJ,eAAA,UAIF,YACE,cAAA,KF+MI,UAAA,QE5MJ,wBACE,cAAA,EAIJ,mBACE,WAAA,MACA,cAAA,KFqMI,UAAA,OEnMJ,MAAA,QAEA,2BACE,QAAA,KE9FJ,WCIE,UAAA,KAGA,OAAA,KDDF,eACE,QAAA,OACA,iBAAA,KACA,OAAA,IAAA,MAAA,QHGE,cAAA,OIRF,UAAA,KAGA,OAAA,KDcF,QAEE,QAAA,aAGF,YACE,cAAA,MACA,YAAA,EAGF,gBJ+PM,UAAA,OI7PJ,MAAA,QElCA,WP0mBF,iBAGA,cACA,cACA,cAHA,cADA,eQ9mBE,MAAA,KACA,cAAA,0BACA,aAAA,0BACA,aAAA,KACA,YAAA,KCwDE,yBF5CE,WAAA,cACE,UAAA,OE2CJ,yBF5CE,WAAA,cAAA,cACE,UAAA,OE2CJ,yBF5CE,WAAA,cAAA,cAAA,cACE,UAAA,OE2CJ,0BF5CE,WAAA,cAAA,cAAA,cAAA,cACE,UAAA,QE2CJ,0BF5CE,WAAA,cAAA,cAAA,cAAA,cAAA,eACE,UAAA,QGfN,KCAA,cAAA,OACA,cAAA,EACA,QAAA,KACA,UAAA,KAEA,WAAA,8BACA,aAAA,+BACA,YAAA,+BDJE,OCaF,YAAA,EACA,MAAA,KACA,UAAA,KACA,cAAA,8BACA,aAAA,8BACA,WAAA,mBA+CI,KACE,KAAA,EAAA,EAAA,GAGF,iBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,cACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,UAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,UAxDV,YAAA,YAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,WAxDV,YAAA,aAwDU,WAxDV,YAAA,aAmEM,KX2sBR,MWzsBU,cAAA,EAGF,KX2sBR,MWzsBU,cAAA,EAPF,KXqtBR,MWntBU,cAAA,QAGF,KXqtBR,MWntBU,cAAA,QAPF,KX+tBR,MW7tBU,cAAA,OAGF,KX+tBR,MW7tBU,cAAA,OAPF,KXyuBR,MWvuBU,cAAA,KAGF,KXyuBR,MWvuBU,cAAA,KAPF,KXmvBR,MWjvBU,cAAA,OAGF,KXmvBR,MWjvBU,cAAA,OAPF,KX6vBR,MW3vBU,cAAA,KAGF,KX6vBR,MW3vBU,cAAA,KF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QXg6BR,SW95BU,cAAA,EAGF,QXg6BR,SW95BU,cAAA,EAPF,QX06BR,SWx6BU,cAAA,QAGF,QX06BR,SWx6BU,cAAA,QAPF,QXo7BR,SWl7BU,cAAA,OAGF,QXo7BR,SWl7BU,cAAA,OAPF,QX87BR,SW57BU,cAAA,KAGF,QX87BR,SW57BU,cAAA,KAPF,QXw8BR,SWt8BU,cAAA,OAGF,QXw8BR,SWt8BU,cAAA,OAPF,QXk9BR,SWh9BU,cAAA,KAGF,QXk9BR,SWh9BU,cAAA,MF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QXqnCR,SWnnCU,cAAA,EAGF,QXqnCR,SWnnCU,cAAA,EAPF,QX+nCR,SW7nCU,cAAA,QAGF,QX+nCR,SW7nCU,cAAA,QAPF,QXyoCR,SWvoCU,cAAA,OAGF,QXyoCR,SWvoCU,cAAA,OAPF,QXmpCR,SWjpCU,cAAA,KAGF,QXmpCR,SWjpCU,cAAA,KAPF,QX6pCR,SW3pCU,cAAA,OAGF,QX6pCR,SW3pCU,cAAA,OAPF,QXuqCR,SWrqCU,cAAA,KAGF,QXuqCR,SWrqCU,cAAA,MF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QX00CR,SWx0CU,cAAA,EAGF,QX00CR,SWx0CU,cAAA,EAPF,QXo1CR,SWl1CU,cAAA,QAGF,QXo1CR,SWl1CU,cAAA,QAPF,QX81CR,SW51CU,cAAA,OAGF,QX81CR,SW51CU,cAAA,OAPF,QXw2CR,SWt2CU,cAAA,KAGF,QXw2CR,SWt2CU,cAAA,KAPF,QXk3CR,SWh3CU,cAAA,OAGF,QXk3CR,SWh3CU,cAAA,OAPF,QX43CR,SW13CU,cAAA,KAGF,QX43CR,SW13CU,cAAA,MF1DN,0BEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QX+hDR,SW7hDU,cAAA,EAGF,QX+hDR,SW7hDU,cAAA,EAPF,QXyiDR,SWviDU,cAAA,QAGF,QXyiDR,SWviDU,cAAA,QAPF,QXmjDR,SWjjDU,cAAA,OAGF,QXmjDR,SWjjDU,cAAA,OAPF,QX6jDR,SW3jDU,cAAA,KAGF,QX6jDR,SW3jDU,cAAA,KAPF,QXukDR,SWrkDU,cAAA,OAGF,QXukDR,SWrkDU,cAAA,OAPF,QXilDR,SW/kDU,cAAA,KAGF,QXilDR,SW/kDU,cAAA,MF1DN,0BEUE,SACE,KAAA,EAAA,EAAA,GAGF,qBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,cAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,cAxDV,YAAA,EAwDU,cAxDV,YAAA,YAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,eAxDV,YAAA,aAwDU,eAxDV,YAAA,aAmEM,SXovDR,UWlvDU,cAAA,EAGF,SXovDR,UWlvDU,cAAA,EAPF,SX8vDR,UW5vDU,cAAA,QAGF,SX8vDR,UW5vDU,cAAA,QAPF,SXwwDR,UWtwDU,cAAA,OAGF,SXwwDR,UWtwDU,cAAA,OAPF,SXkxDR,UWhxDU,cAAA,KAGF,SXkxDR,UWhxDU,cAAA,KAPF,SX4xDR,UW1xDU,cAAA,OAGF,SX4xDR,UW1xDU,cAAA,OAPF,SXsyDR,UWpyDU,cAAA,KAGF,SXsyDR,UWpyDU,cAAA,MCrHV,OACE,cAAA,YACA,qBAAA,YACA,yBAAA,QACA,sBAAA,oBACA,wBAAA,QACA,qBAAA,mBACA,uBAAA,QACA,oBAAA,qBAEA,MAAA,KACA,cAAA,KACA,MAAA,QACA,eAAA,IACA,aAAA,QAOA,yBACE,QAAA,MAAA,MACA,iBAAA,mBACA,oBAAA,IACA,WAAA,MAAA,EAAA,EAAA,EAAA,OAAA,0BAGF,aACE,eAAA,QAGF,aACE,eAAA,OAIF,0BACE,WAAA,IAAA,MAAA,aASJ,aACE,aAAA,IAUA,4BACE,QAAA,OAAA,OAeF,gCACE,aAAA,IAAA,EAGA,kCACE,aAAA,EAAA,IAOJ,oCACE,oBAAA,EAGF,qCACE,iBAAA,EASF,2CACE,qBAAA,2BACA,MAAA,8BAQJ,cACE,qBAAA,0BACA,MAAA,6BAQA,8BACE,qBAAA,yBACA,MAAA,4BC5HF,eAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,iBAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,eAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,YAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,eAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,cAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,aAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QAfF,YAME,cAAA,QACA,sBAAA,QACA,yBAAA,KACA,qBAAA,QACA,wBAAA,KACA,oBAAA,QACA,uBAAA,KAEA,MAAA,KACA,aAAA,QDoIA,kBACE,WAAA,KACA,2BAAA,MH3EF,4BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,4BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,4BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,6BGyEA,qBACE,WAAA,KACA,2BAAA,OH3EF,6BGyEA,sBACE,WAAA,KACA,2BAAA,OEnJN,YACE,cAAA,MASF,gBACE,YAAA,oBACA,eAAA,oBACA,cAAA,EboRI,UAAA,QahRJ,YAAA,IAIF,mBACE,YAAA,kBACA,eAAA,kBb0QI,UAAA,QatQN,mBACE,YAAA,mBACA,eAAA,mBboQI,UAAA,QcjSN,WACE,WAAA,OdgSI,UAAA,Oc5RJ,MAAA,QCLF,cACE,QAAA,MACA,MAAA,KACA,QAAA,QAAA,Of8RI,UAAA,Ke3RJ,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,QACA,mBAAA,KAAA,gBAAA,KAAA,WAAA,KdGE,cAAA,OeHE,WAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCDhBN,cCiBQ,WAAA,MDGN,yBACE,SAAA,OAEA,wDACE,OAAA,QAKJ,oBACE,MAAA,QACA,iBAAA,KACA,aAAA,QACA,QAAA,EAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAOJ,2CAEE,OAAA,MAIF,gCACE,MAAA,QAEA,QAAA,EAHF,2BACE,MAAA,QAEA,QAAA,EAQF,uBAAA,wBAEE,iBAAA,QAGA,QAAA,EAIF,0CACE,QAAA,QAAA,OACA,OAAA,SAAA,QACA,mBAAA,OAAA,kBAAA,OACA,MAAA,QE3EF,iBAAA,QF6EE,eAAA,KACA,aAAA,QACA,aAAA,MACA,aAAA,EACA,wBAAA,IACA,cAAA,ECtEE,mBAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YD2DJ,oCACE,QAAA,QAAA,OACA,OAAA,SAAA,QACA,mBAAA,OAAA,kBAAA,OACA,MAAA,QE3EF,iBAAA,QF6EE,eAAA,KACA,aAAA,QACA,aAAA,MACA,aAAA,EACA,wBAAA,IACA,cAAA,ECtEE,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCDuDJ,0CCtDM,mBAAA,KAAA,WAAA,KDsDN,oCCtDM,WAAA,MDqEN,+EACE,iBAAA,QADF,yEACE,iBAAA,QAGF,0CACE,QAAA,QAAA,OACA,OAAA,SAAA,QACA,mBAAA,OAAA,kBAAA,OACA,MAAA,QE9FF,iBAAA,QFgGE,eAAA,KACA,aAAA,QACA,aAAA,MACA,aAAA,EACA,wBAAA,IACA,cAAA,ECzFE,mBAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCD0EJ,0CCzEM,mBAAA,KAAA,WAAA,MDwFN,+EACE,iBAAA,QASJ,wBACE,QAAA,MACA,MAAA,KACA,QAAA,QAAA,EACA,cAAA,EACA,YAAA,IACA,MAAA,QACA,iBAAA,YACA,OAAA,MAAA,YACA,aAAA,IAAA,EAEA,wCAAA,wCAEE,cAAA,EACA,aAAA,EAWJ,iBACE,WAAA,0BACA,QAAA,OAAA,MfmJI,UAAA,QClRF,cAAA,McmIF,6CACE,QAAA,OAAA,MACA,OAAA,QAAA,OACA,mBAAA,MAAA,kBAAA,MAHF,uCACE,QAAA,OAAA,MACA,OAAA,QAAA,OACA,mBAAA,MAAA,kBAAA,MAGF,6CACE,QAAA,OAAA,MACA,OAAA,QAAA,OACA,mBAAA,MAAA,kBAAA,MAIJ,iBACE,WAAA,yBACA,QAAA,MAAA,KfgII,UAAA,QClRF,cAAA,McsJF,6CACE,QAAA,MAAA,KACA,OAAA,OAAA,MACA,mBAAA,KAAA,kBAAA,KAHF,uCACE,QAAA,MAAA,KACA,OAAA,OAAA,MACA,mBAAA,KAAA,kBAAA,KAGF,6CACE,QAAA,MAAA,KACA,OAAA,OAAA,MACA,mBAAA,KAAA,kBAAA,KAQF,sBACE,WAAA,2BAGF,yBACE,WAAA,0BAGF,yBACE,WAAA,yBAKJ,oBACE,MAAA,KACA,OAAA,KACA,QAAA,QAEA,mDACE,OAAA,QAGF,uCACE,OAAA,Md/LA,cAAA,OcmMF,0CACE,OAAA,MdpMA,cAAA,OiBdJ,aACE,QAAA,MACA,MAAA,KACA,QAAA,QAAA,QAAA,QAAA,OAEA,mBAAA,oBlB2RI,UAAA,KkBxRJ,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KACA,iBAAA,gOACA,kBAAA,UACA,oBAAA,MAAA,OAAA,OACA,gBAAA,KAAA,KACA,OAAA,IAAA,MAAA,QjBFE,cAAA,OeHE,WAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YESJ,mBAAA,KAAA,gBAAA,KAAA,WAAA,KFLI,uCEfN,aFgBQ,WAAA,MEMN,mBACE,aAAA,QACA,QAAA,EAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,uBAAA,mCAEE,cAAA,OACA,iBAAA,KAGF,sBAEE,iBAAA,QAKF,4BACE,MAAA,YACA,YAAA,EAAA,EAAA,EAAA,QAIJ,gBACE,YAAA,OACA,eAAA,OACA,aAAA,MlByOI,UAAA,QClRF,cAAA,MiB8CJ,gBACE,YAAA,MACA,eAAA,MACA,aAAA,KlBiOI,UAAA,QClRF,cAAA,MkBfJ,YACE,QAAA,MACA,WAAA,OACA,aAAA,MACA,cAAA,QAEA,8BACE,MAAA,KACA,YAAA,OAIJ,kBACE,MAAA,IACA,OAAA,IACA,WAAA,MACA,eAAA,IACA,iBAAA,KACA,kBAAA,UACA,oBAAA,OACA,gBAAA,QACA,OAAA,IAAA,MAAA,gBACA,mBAAA,KAAA,gBAAA,KAAA,WAAA,KACA,2BAAA,MAAA,aAAA,MAGA,iClBXE,cAAA,MkBeF,8BAEE,cAAA,IAGF,yBACE,OAAA,gBAGF,wBACE,aAAA,QACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAGF,0BACE,iBAAA,QACA,aAAA,QAEA,yCAII,iBAAA,8NAIJ,sCAII,iBAAA,sIAKN,+CACE,iBAAA,QACA,aAAA,QAKE,iBAAA,wNAIJ,2BACE,eAAA,KACA,OAAA,KACA,QAAA,GAOA,6CAAA,8CACE,QAAA,GAcN,aACE,aAAA,MAEA,+BACE,MAAA,IACA,YAAA,OACA,iBAAA,uJACA,oBAAA,KAAA,OlB9FA,cAAA,IeHE,WAAA,oBAAA,KAAA,YAIA,uCGyFJ,+BHxFM,WAAA,MGgGJ,qCACE,iBAAA,yIAGF,uCACE,oBAAA,MAAA,OAKE,iBAAA,sIAMR,mBACE,QAAA,aACA,aAAA,KAGF,WACE,SAAA,SACA,KAAA,cACA,eAAA,KAIE,yBAAA,0BACE,eAAA,KACA,OAAA,KACA,QAAA,IC9IN,YACE,MAAA,KACA,OAAA,OACA,QAAA,EACA,iBAAA,YACA,mBAAA,KAAA,gBAAA,KAAA,WAAA,KAEA,kBACE,QAAA,EAIA,wCAA0B,WAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,OAAA,qBAC1B,oCAA0B,WAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,OAAA,qBAG5B,8BACE,OAAA,EAGF,kCACE,MAAA,KACA,OAAA,KACA,WAAA,QHzBF,iBAAA,QG2BE,OAAA,EnBZA,cAAA,KeHE,mBAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YImBF,mBAAA,KAAA,WAAA,KJfE,uCIMJ,kCJLM,mBAAA,KAAA,WAAA,MIgBJ,yCHjCF,iBAAA,QGsCA,2CACE,MAAA,KACA,OAAA,MACA,MAAA,YACA,OAAA,QACA,iBAAA,QACA,aAAA,YnB7BA,cAAA,KmBkCF,8BACE,MAAA,KACA,OAAA,KHnDF,iBAAA,QGqDE,OAAA,EnBtCA,cAAA,KeHE,gBAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAAA,WAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YI6CF,gBAAA,KAAA,WAAA,KJzCE,uCIiCJ,8BJhCM,gBAAA,KAAA,WAAA,MI0CJ,qCH3DF,iBAAA,QGgEA,8BACE,MAAA,KACA,OAAA,MACA,MAAA,YACA,OAAA,QACA,iBAAA,QACA,aAAA,YnBvDA,cAAA,KmB4DF,qBACE,eAAA,KAEA,2CACE,iBAAA,QAGF,uCACE,iBAAA,QCvFN,eACE,SAAA,SAEA,6BtB4lFF,4BsB1lFI,OAAA,mBACA,YAAA,KAGF,qBACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,OAAA,KACA,QAAA,KAAA,OACA,eAAA,KACA,OAAA,IAAA,MAAA,YACA,iBAAA,EAAA,ELDE,WAAA,QAAA,IAAA,WAAA,CAAA,UAAA,IAAA,YAIA,uCKXJ,qBLYM,WAAA,MKCN,6BACE,QAAA,KAAA,OAEA,+CACE,MAAA,YADF,0CACE,MAAA,YAGF,0DAEE,YAAA,SACA,eAAA,QAHF,mCAAA,qDAEE,YAAA,SACA,eAAA,QAGF,8CACE,YAAA,SACA,eAAA,QAIJ,4BACE,YAAA,SACA,eAAA,QAMA,gEACE,QAAA,IACA,UAAA,WAAA,mBAAA,mBAFF,yCtBgmFJ,2DACA,kCsBhmFM,QAAA,IACA,UAAA,WAAA,mBAAA,mBAKF,oDACE,QAAA,IACA,UAAA,WAAA,mBAAA,mBCtDN,aACE,SAAA,SACA,QAAA,KACA,UAAA,KACA,YAAA,QACA,MAAA,KAEA,2BvBwpFF,0BuBtpFI,SAAA,SACA,KAAA,EAAA,EAAA,KACA,MAAA,GACA,UAAA,EAIF,iCvBspFF,gCuBppFI,QAAA,EAMF,kBACE,SAAA,SACA,QAAA,EAEA,wBACE,QAAA,EAWN,kBACE,QAAA,KACA,YAAA,OACA,QAAA,QAAA,OtBsPI,UAAA,KsBpPJ,YAAA,IACA,YAAA,IACA,MAAA,QACA,WAAA,OACA,YAAA,OACA,iBAAA,QACA,OAAA,IAAA,MAAA,QrBpCE,cAAA,OForFJ,qBuBtoFA,8BvBooFA,6BACA,kCuBjoFE,QAAA,MAAA,KtBgOI,UAAA,QClRF,cAAA,MF6rFJ,qBuBtoFA,8BvBooFA,6BACA,kCuBjoFE,QAAA,OAAA,MtBuNI,UAAA,QClRF,cAAA,MqBgEJ,6BvBooFA,6BuBloFE,cAAA,KvBuoFF,uEuB1nFI,8FrB/DA,wBAAA,EACA,2BAAA,EF6rFJ,iEuBxnFI,2FrBtEA,wBAAA,EACA,2BAAA,EqBgFF,0IACE,YAAA,KrBpEA,uBAAA,EACA,0BAAA,EsBzBF,gBACE,QAAA,KACA,MAAA,KACA,WAAA,OvByQE,UAAA,OuBtQF,MAAA,QAGF,eACE,SAAA,SACA,IAAA,KACA,QAAA,EACA,QAAA,KACA,UAAA,KACA,QAAA,OAAA,MACA,WAAA,MvB4PE,UAAA,QuBzPF,MAAA,KACA,iBAAA,mBtB1BA,cAAA,OFgvFJ,0BACA,yBwBltFI,sCxBgtFJ,qCwB9sFM,QAAA,MA9CF,uBAAA,mCAoDE,aAAA,QAGE,cAAA,qBACA,iBAAA,2OACA,kBAAA,UACA,oBAAA,MAAA,wBAAA,OACA,gBAAA,sBAAA,sBAGF,6BAAA,yCACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBAhEJ,2CAAA,+BAyEI,cAAA,qBACA,oBAAA,IAAA,wBAAA,MAAA,wBA1EJ,sBAAA,kCAiFE,aAAA,QAGE,kDAAA,gDAAA,8DAAA,4DAEE,cAAA,SACA,iBAAA,+NAAA,CAAA,2OACA,oBAAA,MAAA,OAAA,MAAA,CAAA,OAAA,MAAA,QACA,gBAAA,KAAA,IAAA,CAAA,sBAAA,sBAIJ,4BAAA,wCACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBA/FJ,2BAAA,uCAsGE,aAAA,QAEA,mCAAA,+CACE,iBAAA,QAGF,iCAAA,6CACE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,6CAAA,yDACE,MAAA,QAKJ,qDACE,YAAA,KAvHF,oCxBqzFJ,mCwBrzFI,gDxBozFJ,+CwBrrFQ,QAAA,EAIF,0CxBurFN,yCwBvrFM,sDxBsrFN,qDwBrrFQ,QAAA,EAjHN,kBACE,QAAA,KACA,MAAA,KACA,WAAA,OvByQE,UAAA,OuBtQF,MAAA,QAGF,iBACE,SAAA,SACA,IAAA,KACA,QAAA,EACA,QAAA,KACA,UAAA,KACA,QAAA,OAAA,MACA,WAAA,MvB4PE,UAAA,QuBzPF,MAAA,KACA,iBAAA,mBtB1BA,cAAA,OFy0FJ,8BACA,6BwB3yFI,0CxByyFJ,yCwBvyFM,QAAA,MA9CF,yBAAA,qCAoDE,aAAA,QAGE,cAAA,qBACA,iBAAA,2TACA,kBAAA,UACA,oBAAA,MAAA,wBAAA,OACA,gBAAA,sBAAA,sBAGF,+BAAA,2CACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBAhEJ,6CAAA,iCAyEI,cAAA,qBACA,oBAAA,IAAA,wBAAA,MAAA,wBA1EJ,wBAAA,oCAiFE,aAAA,QAGE,oDAAA,kDAAA,gEAAA,8DAEE,cAAA,SACA,iBAAA,+NAAA,CAAA,2TACA,oBAAA,MAAA,OAAA,MAAA,CAAA,OAAA,MAAA,QACA,gBAAA,KAAA,IAAA,CAAA,sBAAA,sBAIJ,8BAAA,0CACE,aAAA,QACA,WAAA,EAAA,EAAA,EAAA,OAAA,oBA/FJ,6BAAA,yCAsGE,aAAA,QAEA,qCAAA,iDACE,iBAAA,QAGF,mCAAA,+CACE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,+CAAA,2DACE,MAAA,QAKJ,uDACE,YAAA,KAvHF,sCxB84FJ,qCwB94FI,kDxB64FJ,iDwB5wFQ,QAAA,EAEF,4CxBgxFN,2CwBhxFM,wDxB+wFN,uDwB9wFQ,QAAA,ECtIR,KACE,QAAA,aAEA,YAAA,IACA,YAAA,IACA,MAAA,QACA,WAAA,OACA,gBAAA,KAEA,eAAA,OACA,OAAA,QACA,oBAAA,KAAA,iBAAA,KAAA,YAAA,KACA,iBAAA,YACA,OAAA,IAAA,MAAA,YC8GA,QAAA,QAAA,OzBsKI,UAAA,KClRF,cAAA,OeHE,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCQhBN,KRiBQ,WAAA,MQAN,WACE,MAAA,QAIF,sBAAA,WAEE,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAcF,cAAA,cAAA,uBAGE,eAAA,KACA,QAAA,IAYF,aCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,mBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,8BAAA,mBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAIJ,+BAAA,gCAAA,oBAAA,oBAAA,mCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,qCAAA,sCAAA,0BAAA,0BAAA,yCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,sBAAA,sBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,eCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,qBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,gCAAA,qBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,iCAAA,kCAAA,sBAAA,sBAAA,qCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,uCAAA,wCAAA,4BAAA,4BAAA,2CAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,wBAAA,wBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,aCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,mBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,8BAAA,mBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAIJ,+BAAA,gCAAA,oBAAA,oBAAA,mCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,qCAAA,sCAAA,0BAAA,0BAAA,yCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,sBAAA,sBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,UCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,gBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,2BAAA,gBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAIJ,4BAAA,6BAAA,iBAAA,iBAAA,gCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,kCAAA,mCAAA,uBAAA,uBAAA,sCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,mBAAA,mBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,aCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,mBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,8BAAA,mBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAIJ,+BAAA,gCAAA,oBAAA,oBAAA,mCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,qCAAA,sCAAA,0BAAA,0BAAA,yCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,sBAAA,sBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,YCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,kBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,6BAAA,kBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAIJ,8BAAA,+BAAA,mBAAA,mBAAA,kCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,oCAAA,qCAAA,yBAAA,yBAAA,wCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,qBAAA,qBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,WCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,iBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,4BAAA,iBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,6BAAA,8BAAA,kBAAA,kBAAA,iCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,mCAAA,oCAAA,wBAAA,wBAAA,uCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,oBAAA,oBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDZF,UCvCA,MAAA,KRhBA,iBAAA,QQkBA,aAAA,QAGA,gBACE,MAAA,KRtBF,iBAAA,QQwBE,aAAA,QAGF,2BAAA,gBAEE,MAAA,KR7BF,iBAAA,QQ+BE,aAAA,QAKE,WAAA,EAAA,EAAA,EAAA,OAAA,kBAIJ,4BAAA,6BAAA,iBAAA,iBAAA,gCAKE,MAAA,KACA,iBAAA,QAGA,aAAA,QAEA,kCAAA,mCAAA,uBAAA,uBAAA,sCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,kBAKN,mBAAA,mBAEE,MAAA,KACA,iBAAA,QAGA,aAAA,QDNF,qBCmBA,MAAA,QACA,aAAA,QAEA,2BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,sCAAA,2BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,uCAAA,wCAAA,4BAAA,0CAAA,4BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,6CAAA,8CAAA,kCAAA,gDAAA,kCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,8BAAA,8BAEE,MAAA,QACA,iBAAA,YDvDF,uBCmBA,MAAA,QACA,aAAA,QAEA,6BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,wCAAA,6BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAGF,yCAAA,0CAAA,8BAAA,4CAAA,8BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,+CAAA,gDAAA,oCAAA,kDAAA,oCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,gCAAA,gCAEE,MAAA,QACA,iBAAA,YDvDF,qBCmBA,MAAA,QACA,aAAA,QAEA,2BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,sCAAA,2BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAGF,uCAAA,wCAAA,4BAAA,0CAAA,4BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,6CAAA,8CAAA,kCAAA,gDAAA,kCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,8BAAA,8BAEE,MAAA,QACA,iBAAA,YDvDF,kBCmBA,MAAA,QACA,aAAA,QAEA,wBACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,mCAAA,wBAEE,WAAA,EAAA,EAAA,EAAA,OAAA,oBAGF,oCAAA,qCAAA,yBAAA,uCAAA,yBAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,0CAAA,2CAAA,+BAAA,6CAAA,+BAKI,WAAA,EAAA,EAAA,EAAA,OAAA,oBAKN,2BAAA,2BAEE,MAAA,QACA,iBAAA,YDvDF,qBCmBA,MAAA,QACA,aAAA,QAEA,2BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,sCAAA,2BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAGF,uCAAA,wCAAA,4BAAA,0CAAA,4BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,6CAAA,8CAAA,kCAAA,gDAAA,kCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,8BAAA,8BAEE,MAAA,QACA,iBAAA,YDvDF,oBCmBA,MAAA,QACA,aAAA,QAEA,0BACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,qCAAA,0BAEE,WAAA,EAAA,EAAA,EAAA,OAAA,mBAGF,sCAAA,uCAAA,2BAAA,yCAAA,2BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,4CAAA,6CAAA,iCAAA,+CAAA,iCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,mBAKN,6BAAA,6BAEE,MAAA,QACA,iBAAA,YDvDF,mBCmBA,MAAA,QACA,aAAA,QAEA,yBACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,oCAAA,yBAEE,WAAA,EAAA,EAAA,EAAA,OAAA,qBAGF,qCAAA,sCAAA,0BAAA,wCAAA,0BAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,2CAAA,4CAAA,gCAAA,8CAAA,gCAKI,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKN,4BAAA,4BAEE,MAAA,QACA,iBAAA,YDvDF,kBCmBA,MAAA,QACA,aAAA,QAEA,wBACE,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,mCAAA,wBAEE,WAAA,EAAA,EAAA,EAAA,OAAA,kBAGF,oCAAA,qCAAA,yBAAA,uCAAA,yBAKE,MAAA,KACA,iBAAA,QACA,aAAA,QAEA,0CAAA,2CAAA,+BAAA,6CAAA,+BAKI,WAAA,EAAA,EAAA,EAAA,OAAA,kBAKN,2BAAA,2BAEE,MAAA,QACA,iBAAA,YD3CJ,UACE,YAAA,IACA,MAAA,QACA,gBAAA,UAEA,gBACE,MAAA,QAQF,mBAAA,mBAEE,MAAA,QAWJ,mBAAA,QCuBE,QAAA,MAAA,KzBsKI,UAAA,QClRF,cAAA,MuByFJ,mBAAA,QCmBE,QAAA,OAAA,MzBsKI,UAAA,QClRF,cAAA,MyBnBJ,MVgBM,WAAA,QAAA,KAAA,OAIA,uCUpBN,MVqBQ,WAAA,MUlBN,iBACE,QAAA,EAMF,qBACE,QAAA,KAIJ,YACE,OAAA,EACA,SAAA,OVDI,WAAA,OAAA,KAAA,KAIA,uCULN,YVMQ,WAAA,MUDN,gCACE,MAAA,EACA,OAAA,KVNE,WAAA,MAAA,KAAA,KAIA,uCUAJ,gCVCM,WAAA,MjBm6GR,UADA,SAEA,W4Bx7GA,QAIE,SAAA,SAGF,iBACE,YAAA,OCqBE,wBACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAhCJ,WAAA,KAAA,MACA,aAAA,KAAA,MAAA,YACA,cAAA,EACA,YAAA,KAAA,MAAA,YAqDE,8BACE,YAAA,ED3CN,eACE,SAAA,SACA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,MAAA,EACA,OAAA,E3B+QI,UAAA,K2B7QJ,MAAA,QACA,WAAA,KACA,WAAA,KACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,gB1BVE,cAAA,O0BcF,+BACE,IAAA,KACA,KAAA,EACA,WAAA,QAYA,qBACE,cAAA,MAEA,qCACE,MAAA,KACA,KAAA,EAIJ,mBACE,cAAA,IAEA,mCACE,MAAA,EACA,KAAA,KnBCJ,yBmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,yBmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,yBmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,0BmBfA,wBACE,cAAA,MAEA,wCACE,MAAA,KACA,KAAA,EAIJ,sBACE,cAAA,IAEA,sCACE,MAAA,EACA,KAAA,MnBCJ,0BmBfA,yBACE,cAAA,MAEA,yCACE,MAAA,KACA,KAAA,EAIJ,uBACE,cAAA,IAEA,uCACE,MAAA,EACA,KAAA,MAUN,uCACE,IAAA,KACA,OAAA,KACA,WAAA,EACA,cAAA,QC9CA,gCACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAzBJ,WAAA,EACA,aAAA,KAAA,MAAA,YACA,cAAA,KAAA,MACA,YAAA,KAAA,MAAA,YA8CE,sCACE,YAAA,ED0BJ,wCACE,IAAA,EACA,MAAA,KACA,KAAA,KACA,WAAA,EACA,YAAA,QC5DA,iCACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAlBJ,WAAA,KAAA,MAAA,YACA,aAAA,EACA,cAAA,KAAA,MAAA,YACA,YAAA,KAAA,MAuCE,uCACE,YAAA,EDoCF,iCACE,eAAA,EAMJ,0CACE,IAAA,EACA,MAAA,KACA,KAAA,KACA,WAAA,EACA,aAAA,QC7EA,mCACE,QAAA,aACA,YAAA,OACA,eAAA,OACA,QAAA,GAWA,mCACE,QAAA,KAGF,oCACE,QAAA,aACA,aAAA,OACA,eAAA,OACA,QAAA,GA9BN,WAAA,KAAA,MAAA,YACA,aAAA,KAAA,MACA,cAAA,KAAA,MAAA,YAiCE,yCACE,YAAA,EDqDF,oCACE,eAAA,EAON,kBACE,OAAA,EACA,OAAA,MAAA,EACA,SAAA,OACA,WAAA,IAAA,MAAA,gBAMF,eACE,QAAA,MACA,MAAA,KACA,QAAA,OAAA,KACA,MAAA,KACA,YAAA,IACA,MAAA,QACA,WAAA,QACA,gBAAA,KACA,YAAA,OACA,iBAAA,YACA,OAAA,EAcA,qBAAA,qBAEE,MAAA,QVzJF,iBAAA,QU8JA,sBAAA,sBAEE,MAAA,KACA,gBAAA,KVjKF,iBAAA,QUqKA,wBAAA,wBAEE,MAAA,QACA,eAAA,KACA,iBAAA,YAMJ,oBACE,QAAA,MAIF,iBACE,QAAA,MACA,QAAA,MAAA,KACA,cAAA,E3B0GI,UAAA,Q2BxGJ,MAAA,QACA,YAAA,OAIF,oBACE,QAAA,MACA,QAAA,OAAA,KACA,MAAA,QAIF,oBACE,MAAA,QACA,iBAAA,QACA,aAAA,gBAGA,mCACE,MAAA,QAEA,yCAAA,yCAEE,MAAA,KVhNJ,iBAAA,sBUoNE,0CAAA,0CAEE,MAAA,KVtNJ,iBAAA,QU0NE,4CAAA,4CAEE,MAAA,QAIJ,sCACE,aAAA,gBAGF,wCACE,MAAA,QAGF,qCACE,MAAA,QE5OJ,W9BwuHA,oB8BtuHE,SAAA,SACA,QAAA,YACA,eAAA,O9B0uHF,yB8BxuHE,gBACE,SAAA,SACA,KAAA,EAAA,EAAA,K9BgvHJ,4CACA,0CAIA,gCADA,gCADA,+BADA,+B8B7uHE,mC9BsuHF,iCAIA,uBADA,uBADA,sBADA,sB8BjuHI,QAAA,EAKJ,aACE,QAAA,KACA,UAAA,KACA,gBAAA,WAEA,0BACE,MAAA,K9B6uHJ,wC8BvuHE,kCAEE,YAAA,K9ByuHJ,4C8BruHE,uD5BRE,wBAAA,EACA,2BAAA,EFkvHJ,6C8BluHE,+B9BiuHF,iCEpuHI,uBAAA,EACA,0BAAA,E4BqBJ,uBACE,cAAA,SACA,aAAA,SAEA,8BAAA,uCAAA,sCAGE,YAAA,EAGF,0CACE,aAAA,EAIJ,0CAAA,+BACE,cAAA,QACA,aAAA,QAGF,0CAAA,+BACE,cAAA,OACA,aAAA,OAoBF,oBACE,eAAA,OACA,YAAA,WACA,gBAAA,OAEA,yB9BgsHF,+B8B9rHI,MAAA,K9BksHJ,iD8B/rHE,2CAEE,WAAA,K9BisHJ,qD8B7rHE,gE5BvFE,2BAAA,EACA,0BAAA,EFwxHJ,sD8B7rHE,8B5B1GE,uBAAA,EACA,wBAAA,E6BxBJ,KACE,QAAA,KACA,UAAA,KACA,aAAA,EACA,cAAA,EACA,WAAA,KAGF,UACE,QAAA,MACA,QAAA,MAAA,KAGA,MAAA,QACA,gBAAA,KdHI,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,YAIA,uCcPN,UdQQ,WAAA,McCN,gBAAA,gBAEE,MAAA,QAKF,mBACE,MAAA,QACA,eAAA,KACA,OAAA,QAQJ,UACE,cAAA,IAAA,MAAA,QAEA,oBACE,cAAA,KACA,WAAA,IACA,OAAA,IAAA,MAAA,Y7BlBA,uBAAA,OACA,wBAAA,O6BoBA,0BAAA,0BAEE,aAAA,QAAA,QAAA,QAEA,UAAA,QAGF,6BACE,MAAA,QACA,iBAAA,YACA,aAAA,Y/B8zHN,mC+B1zHE,2BAEE,MAAA,QACA,iBAAA,KACA,aAAA,QAAA,QAAA,KAGF,yBAEE,WAAA,K7B5CA,uBAAA,EACA,wBAAA,E6BuDF,qBACE,WAAA,IACA,OAAA,E7BnEA,cAAA,O6BuEF,4B/BgzHF,2B+B9yHI,MAAA,KbxFF,iBAAA,QlB44HF,oB+BzyHE,oBAEE,KAAA,EAAA,EAAA,KACA,WAAA,O/B4yHJ,yB+BvyHE,yBAEE,WAAA,EACA,UAAA,EACA,WAAA,OAMF,8B/BoyHF,mC+BnyHI,MAAA,KAUF,uBACE,QAAA,KAEF,qBACE,QAAA,MCxHJ,QACE,SAAA,SACA,QAAA,KACA,UAAA,KACA,YAAA,OACA,gBAAA,cACA,YAAA,MAEA,eAAA,MAOA,mBhCm5HF,yBAGA,sBADA,sBADA,sBAGA,sBACA,uBgCv5HI,QAAA,KACA,UAAA,QACA,YAAA,OACA,gBAAA,cAoBJ,cACE,YAAA,SACA,eAAA,SACA,aAAA,K/B2OI,UAAA,Q+BzOJ,gBAAA,KACA,YAAA,OAaF,YACE,QAAA,KACA,eAAA,OACA,aAAA,EACA,cAAA,EACA,WAAA,KAEA,sBACE,cAAA,EACA,aAAA,EAGF,2BACE,SAAA,OASJ,aACE,YAAA,MACA,eAAA,MAYF,iBACE,WAAA,KACA,UAAA,EAGA,YAAA,OAIF,gBACE,QAAA,OAAA,O/B6KI,UAAA,Q+B3KJ,YAAA,EACA,iBAAA,YACA,OAAA,IAAA,MAAA,Y9BzGE,cAAA,OeHE,WAAA,WAAA,KAAA,YAIA,uCemGN,gBflGQ,WAAA,Me2GN,sBACE,gBAAA,KAGF,sBACE,gBAAA,KACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAMJ,qBACE,QAAA,aACA,MAAA,MACA,OAAA,MACA,eAAA,OACA,kBAAA,UACA,oBAAA,OACA,gBAAA,KAGF,mBACE,WAAA,6BACA,WAAA,KvB1FE,yBuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhC41HV,oCgC11HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,yBuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhCi5HV,oCgC/4HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,yBuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhCs8HV,oCgCp8HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,0BuBsGA,kBAEI,UAAA,OACA,gBAAA,WAEA,8BACE,eAAA,IAEA,6CACE,SAAA,SAGF,wCACE,cAAA,MACA,aAAA,MAIJ,qCACE,SAAA,QAGF,mCACE,QAAA,eACA,WAAA,KAGF,kCACE,QAAA,KAGF,oCACE,QAAA,KAGF,6BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhC2/HV,oCgCz/HQ,iCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,kCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SvBhKN,0BuBsGA,mBAEI,UAAA,OACA,gBAAA,WAEA,+BACE,eAAA,IAEA,8CACE,SAAA,SAGF,yCACE,cAAA,MACA,aAAA,MAIJ,sCACE,SAAA,QAGF,oCACE,QAAA,eACA,WAAA,KAGF,mCACE,QAAA,KAGF,qCACE,QAAA,KAGF,8BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhCgjIV,qCgC9iIQ,kCAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,mCACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,SA1DN,eAEI,UAAA,OACA,gBAAA,WAEA,2BACE,eAAA,IAEA,0CACE,SAAA,SAGF,qCACE,cAAA,MACA,aAAA,MAIJ,kCACE,SAAA,QAGF,gCACE,QAAA,eACA,WAAA,KAGF,+BACE,QAAA,KAGF,iCACE,QAAA,KAGF,0BACE,SAAA,QACA,OAAA,EACA,QAAA,KACA,UAAA,EACA,WAAA,kBACA,iBAAA,YACA,aAAA,EACA,YAAA,EfhMJ,WAAA,KekMI,UAAA,KhComIV,iCgClmIQ,8BAEE,OAAA,KACA,WAAA,EACA,cAAA,EAGF,+BACE,QAAA,KACA,UAAA,EACA,QAAA,EACA,WAAA,QAcR,4BACE,MAAA,eAEA,kCAAA,kCAEE,MAAA,eAKF,oCACE,MAAA,gBAEA,0CAAA,0CAEE,MAAA,eAGF,6CACE,MAAA,ehCklIR,2CgC9kII,0CAEE,MAAA,eAIJ,8BACE,MAAA,gBACA,aAAA,eAGF,mCACE,iBAAA,4OAGF,2BACE,MAAA,gBAEA,6BhC2kIJ,mCADA,mCgCvkIM,MAAA,eAOJ,2BACE,MAAA,KAEA,iCAAA,iCAEE,MAAA,KAKF,mCACE,MAAA,sBAEA,yCAAA,yCAEE,MAAA,sBAGF,4CACE,MAAA,sBhCkkIR,0CgC9jII,yCAEE,MAAA,KAIJ,6BACE,MAAA,sBACA,aAAA,qBAGF,kCACE,iBAAA,kPAGF,0BACE,MAAA,sBACA,4BhC4jIJ,kCADA,kCgCxjIM,MAAA,KCvUN,MACE,SAAA,SACA,QAAA,KACA,eAAA,OACA,UAAA,EAEA,UAAA,WACA,iBAAA,KACA,gBAAA,WACA,OAAA,IAAA,MAAA,iB/BME,cAAA,O+BFF,SACE,aAAA,EACA,YAAA,EAGF,kBACE,WAAA,QACA,cAAA,QAEA,8BACE,iBAAA,E/BCF,uBAAA,mBACA,wBAAA,mB+BEA,6BACE,oBAAA,E/BUF,2BAAA,mBACA,0BAAA,mB+BJF,+BjC+3IF,+BiC73II,WAAA,EAIJ,WAGE,KAAA,EAAA,EAAA,KACA,QAAA,KAAA,KAIF,YACE,cAAA,MAGF,eACE,WAAA,QACA,cAAA,EAGF,sBACE,cAAA,EAQA,sBACE,YAAA,KAQJ,aACE,QAAA,MAAA,KACA,cAAA,EAEA,iBAAA,gBACA,cAAA,IAAA,MAAA,iBAEA,yB/BpEE,cAAA,mBAAA,mBAAA,EAAA,E+ByEJ,aACE,QAAA,MAAA,KAEA,iBAAA,gBACA,WAAA,IAAA,MAAA,iBAEA,wB/B/EE,cAAA,EAAA,EAAA,mBAAA,mB+ByFJ,kBACE,aAAA,OACA,cAAA,OACA,YAAA,OACA,cAAA,EAUF,mBACE,aAAA,OACA,YAAA,OAIF,kBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,K/BnHE,cAAA,mB+BuHJ,UjCi2IA,iBADA,ciC71IE,MAAA,KAGF,UjCg2IA,cEp9II,uBAAA,mBACA,wBAAA,mB+BwHJ,UjCi2IA,iBE58II,2BAAA,mBACA,0BAAA,mB+BuHF,kBACE,cAAA,OxBpGA,yBwBgGJ,YAQI,QAAA,KACA,UAAA,IAAA,KAGA,kBAEE,KAAA,EAAA,EAAA,GACA,cAAA,EAEA,wBACE,YAAA,EACA,YAAA,EAKA,mC/BpJJ,wBAAA,EACA,2BAAA,EF4+IJ,gDiCt1IU,iDAGE,wBAAA,EjCu1IZ,gDiCr1IU,oDAGE,2BAAA,EAIJ,oC/BrJJ,uBAAA,EACA,0BAAA,EF0+IJ,iDiCn1IU,kDAGE,uBAAA,EjCo1IZ,iDiCl1IU,qDAGE,0BAAA,GC7MZ,kBACE,SAAA,SACA,QAAA,KACA,YAAA,OACA,MAAA,KACA,QAAA,KAAA,QjC4RI,UAAA,KiC1RJ,MAAA,QACA,WAAA,KACA,iBAAA,KACA,OAAA,EhCKE,cAAA,EgCHF,gBAAA,KjBAI,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,WAAA,CAAA,cAAA,KAAA,KAIA,uCiBhBN,kBjBiBQ,WAAA,MiBFN,kCACE,MAAA,QACA,iBAAA,QACA,WAAA,MAAA,EAAA,KAAA,EAAA,iBAEA,yCACE,iBAAA,gRACA,UAAA,gBAKJ,yBACE,YAAA,EACA,MAAA,QACA,OAAA,QACA,YAAA,KACA,QAAA,GACA,iBAAA,gRACA,kBAAA,UACA,gBAAA,QjBvBE,WAAA,UAAA,IAAA,YAIA,uCiBWJ,yBjBVM,WAAA,MiBsBN,wBACE,QAAA,EAGF,wBACE,QAAA,EACA,aAAA,QACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAIJ,kBACE,cAAA,EAGF,gBACE,iBAAA,KACA,OAAA,IAAA,MAAA,iBAEA,8BhCnCE,uBAAA,OACA,wBAAA,OgCqCA,gDhCtCA,uBAAA,mBACA,wBAAA,mBgC0CF,oCACE,WAAA,EAIF,6BhClCE,2BAAA,OACA,0BAAA,OgCqCE,yDhCtCF,2BAAA,mBACA,0BAAA,mBgC0CA,iDhC3CA,2BAAA,OACA,0BAAA,OgCgDJ,gBACE,QAAA,KAAA,QASA,qCACE,aAAA,EAGF,iCACE,aAAA,EACA,YAAA,EhCxFA,cAAA,EgC2FA,6CAAgB,WAAA,EAChB,4CAAe,cAAA,EAEf,mDhC9FA,cAAA,EiCnBJ,YACE,QAAA,KACA,UAAA,KACA,QAAA,EAAA,EACA,cAAA,KAEA,WAAA,KAOA,kCACE,aAAA,MAEA,0CACE,MAAA,KACA,cAAA,MACA,MAAA,QACA,QAAA,kCAIJ,wBACE,MAAA,QCzBJ,YACE,QAAA,KhCGA,aAAA,EACA,WAAA,KgCAF,WACE,SAAA,SACA,QAAA,MACA,MAAA,QACA,gBAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,QnBKI,WAAA,MAAA,KAAA,WAAA,CAAA,iBAAA,KAAA,WAAA,CAAA,aAAA,KAAA,WAAA,CAAA,WAAA,KAAA,YAIA,uCmBfN,WnBgBQ,WAAA,MmBPN,iBACE,QAAA,EACA,MAAA,QAEA,iBAAA,QACA,aAAA,QAGF,iBACE,QAAA,EACA,MAAA,QACA,iBAAA,QACA,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBAKF,wCACE,YAAA,KAGF,6BACE,QAAA,EACA,MAAA,KlBlCF,iBAAA,QkBoCE,aAAA,QAGF,+BACE,MAAA,QACA,eAAA,KACA,iBAAA,KACA,aAAA,QC3CF,WACE,QAAA,QAAA,OAOI,kCnCqCJ,uBAAA,OACA,0BAAA,OmChCI,iCnCiBJ,wBAAA,OACA,2BAAA,OmChCF,0BACE,QAAA,OAAA,OpCgSE,UAAA,QoCzRE,iDnCqCJ,uBAAA,MACA,0BAAA,MmChCI,gDnCiBJ,wBAAA,MACA,2BAAA,MmChCF,0BACE,QAAA,OAAA,MpCgSE,UAAA,QoCzRE,iDnCqCJ,uBAAA,MACA,0BAAA,MmChCI,gDnCiBJ,wBAAA,MACA,2BAAA,MoC/BJ,OACE,QAAA,aACA,QAAA,MAAA,MrC8RI,UAAA,MqC5RJ,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,eAAA,SpCKE,cAAA,OoCAF,aACE,QAAA,KAKJ,YACE,SAAA,SACA,IAAA,KCvBF,OACE,SAAA,SACA,QAAA,KAAA,KACA,cAAA,KACA,OAAA,IAAA,MAAA,YrCWE,cAAA,OqCNJ,eAEE,MAAA,QAIF,YACE,YAAA,IAQF,mBACE,cAAA,KAGA,8BACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,QAAA,KAeF,eClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,2BACE,MAAA,QD6CF,iBClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,6BACE,MAAA,QD6CF,eClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,2BACE,MAAA,QD6CF,YClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,wBACE,MAAA,QD6CF,eClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,2BACE,MAAA,QD6CF,cClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,0BACE,MAAA,QD6CF,aClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,yBACE,MAAA,QD6CF,YClDA,MAAA,QtBEA,iBAAA,QsBAA,aAAA,QAEA,wBACE,MAAA,QCHF,wCACE,GAAK,sBAAA,MADP,gCACE,GAAK,sBAAA,MAKT,UACE,QAAA,KACA,OAAA,KACA,SAAA,OxCwRI,UAAA,OwCtRJ,iBAAA,QvCIE,cAAA,OuCCJ,cACE,QAAA,KACA,eAAA,OACA,gBAAA,OACA,SAAA,OACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,iBAAA,QxBZI,WAAA,MAAA,IAAA,KAIA,uCwBAN,cxBCQ,WAAA,MwBWR,sBvBYE,iBAAA,iKuBVA,gBAAA,KAAA,KAIA,uBACE,kBAAA,GAAA,OAAA,SAAA,qBAAA,UAAA,GAAA,OAAA,SAAA,qBAGE,uCAJJ,uBAKM,kBAAA,KAAA,UAAA,MCvCR,YACE,QAAA,KACA,eAAA,OAGA,aAAA,EACA,cAAA,ExCSE,cAAA,OwCLJ,qBACE,gBAAA,KACA,cAAA,QAEA,gCAEE,QAAA,uBAAA,KACA,kBAAA,QAUJ,wBACE,MAAA,KACA,MAAA,QACA,WAAA,QAGA,8BAAA,8BAEE,QAAA,EACA,MAAA,QACA,gBAAA,KACA,iBAAA,QAGF,+BACE,MAAA,QACA,iBAAA,QASJ,iBACE,SAAA,SACA,QAAA,MACA,QAAA,MAAA,KACA,MAAA,QACA,gBAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,iBAEA,6BxCrCE,uBAAA,QACA,wBAAA,QwCwCF,4BxC3BE,2BAAA,QACA,0BAAA,QwC8BF,0BAAA,0BAEE,MAAA,QACA,eAAA,KACA,iBAAA,KAIF,wBACE,QAAA,EACA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,kCACE,iBAAA,EAEA,yCACE,WAAA,KACA,iBAAA,IAcF,uBACE,eAAA,IAGE,oDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,mDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,+CACE,WAAA,EAGF,yDACE,iBAAA,IACA,kBAAA,EAEA,gEACE,YAAA,KACA,kBAAA,IjCpER,yBiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,yBiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,yBiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,0BiC4CA,0BACE,eAAA,IAGE,uDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,sDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,kDACE,WAAA,EAGF,4DACE,iBAAA,IACA,kBAAA,EAEA,mEACE,YAAA,KACA,kBAAA,KjCpER,0BiC4CA,2BACE,eAAA,IAGE,wDxCrCJ,0BAAA,OAZA,wBAAA,EwCsDI,uDxCtDJ,wBAAA,OAYA,0BAAA,EwC+CI,mDACE,WAAA,EAGF,6DACE,iBAAA,IACA,kBAAA,EAEA,oEACE,YAAA,KACA,kBAAA,KAcZ,kBxC9HI,cAAA,EwCiIF,mCACE,aAAA,EAAA,EAAA,IAEA,8CACE,oBAAA,ECpJJ,yBACE,MAAA,QACA,iBAAA,QAGE,sDAAA,sDAEE,MAAA,QACA,iBAAA,QAGF,uDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,2BACE,MAAA,QACA,iBAAA,QAGE,wDAAA,wDAEE,MAAA,QACA,iBAAA,QAGF,yDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,yBACE,MAAA,QACA,iBAAA,QAGE,sDAAA,sDAEE,MAAA,QACA,iBAAA,QAGF,uDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,sBACE,MAAA,QACA,iBAAA,QAGE,mDAAA,mDAEE,MAAA,QACA,iBAAA,QAGF,oDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,yBACE,MAAA,QACA,iBAAA,QAGE,sDAAA,sDAEE,MAAA,QACA,iBAAA,QAGF,uDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,wBACE,MAAA,QACA,iBAAA,QAGE,qDAAA,qDAEE,MAAA,QACA,iBAAA,QAGF,sDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,uBACE,MAAA,QACA,iBAAA,QAGE,oDAAA,oDAEE,MAAA,QACA,iBAAA,QAGF,qDACE,MAAA,KACA,iBAAA,QACA,aAAA,QAdN,sBACE,MAAA,QACA,iBAAA,QAGE,mDAAA,mDAEE,MAAA,QACA,iBAAA,QAGF,oDACE,MAAA,KACA,iBAAA,QACA,aAAA,QCbR,WACE,WAAA,YACA,MAAA,IACA,OAAA,IACA,QAAA,MAAA,MACA,MAAA,KACA,WAAA,YAAA,0TAAA,MAAA,CAAA,IAAA,KAAA,UACA,OAAA,E1COE,cAAA,O0CLF,QAAA,GAGA,iBACE,MAAA,KACA,gBAAA,KACA,QAAA,IAGF,iBACE,QAAA,EACA,WAAA,EAAA,EAAA,EAAA,OAAA,qBACA,QAAA,EAGF,oBAAA,oBAEE,eAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,YAAA,KACA,QAAA,IAIJ,iBACE,OAAA,UAAA,gBAAA,iBCtCF,OACE,MAAA,MACA,UAAA,K5CmSI,UAAA,Q4ChSJ,eAAA,KACA,iBAAA,sBACA,gBAAA,YACA,OAAA,IAAA,MAAA,eACA,WAAA,EAAA,MAAA,KAAA,gB3CUE,cAAA,O2CPF,eACE,QAAA,EAGF,kBACE,QAAA,KAIJ,iBACE,MAAA,oBAAA,MAAA,iBAAA,MAAA,YACA,UAAA,KACA,eAAA,KAEA,mCACE,cAAA,OAIJ,cACE,QAAA,KACA,YAAA,OACA,QAAA,MAAA,OACA,MAAA,QACA,iBAAA,sBACA,gBAAA,YACA,cAAA,IAAA,MAAA,gB3CVE,uBAAA,mBACA,wBAAA,mB2CYF,yBACE,aAAA,SACA,YAAA,OAIJ,YACE,QAAA,OACA,UAAA,WC1CF,OACE,SAAA,MACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,OAAA,KACA,WAAA,OACA,WAAA,KAGA,QAAA,EAOF,cACE,SAAA,SACA,MAAA,KACA,OAAA,MAEA,eAAA,KAGA,0B7BlBI,WAAA,UAAA,IAAA,S6BoBF,UAAA,mB7BhBE,uC6BcJ,0B7BbM,WAAA,M6BiBN,0BACE,UAAA,KAIF,kCACE,UAAA,YAIJ,yBACE,OAAA,kBAEA,wCACE,WAAA,KACA,SAAA,OAGF,qCACE,WAAA,KAIJ,uBACE,QAAA,KACA,YAAA,OACA,WAAA,kBAIF,eACE,SAAA,SACA,QAAA,KACA,eAAA,OACA,MAAA,KAGA,eAAA,KACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,e5C3DE,cAAA,M4C+DF,QAAA,EAIF,gBCpFE,SAAA,MACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,MAAA,MACA,OAAA,MACA,iBAAA,KAGA,qBAAS,QAAA,EACT,qBAAS,QAAA,GDgFX,cACE,QAAA,KACA,YAAA,EACA,YAAA,OACA,gBAAA,cACA,QAAA,KAAA,KACA,cAAA,IAAA,MAAA,Q5CtEE,uBAAA,kBACA,wBAAA,kB4CwEF,yBACE,QAAA,MAAA,MACA,OAAA,OAAA,OAAA,OAAA,KAKJ,aACE,cAAA,EACA,YAAA,IAKF,YACE,SAAA,SAGA,KAAA,EAAA,EAAA,KACA,QAAA,KAIF,cACE,QAAA,KACA,UAAA,KACA,YAAA,EACA,YAAA,OACA,gBAAA,SACA,QAAA,OACA,WAAA,IAAA,MAAA,Q5CzFE,2BAAA,kBACA,0BAAA,kB4C8FF,gBACE,OAAA,OrC3EA,yBqCkFF,cACE,UAAA,MACA,OAAA,QAAA,KAGF,yBACE,OAAA,oBAGF,uBACE,WAAA,oBAOF,UAAY,UAAA,OrCnGV,yBqCuGF,U9CszKF,U8CpzKI,UAAA,OrCzGA,0BqC8GF,UAAY,UAAA,QASV,kBACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,iCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,gC5C/KF,cAAA,E4CmLE,8BACE,WAAA,KAGF,gC5CvLF,cAAA,EOyDA,4BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,4BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,4BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,6BqC0GA,0BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,yCACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,wC5C/KF,cAAA,E4CmLE,sCACE,WAAA,KAGF,wC5CvLF,cAAA,GOyDA,6BqC0GA,2BACE,MAAA,MACA,UAAA,KACA,OAAA,KACA,OAAA,EAEA,0CACE,OAAA,KACA,OAAA,E5C3KJ,cAAA,E4C+KE,yC5C/KF,cAAA,E4CmLE,uCACE,WAAA,KAGF,yC5CvLF,cAAA,G8ClBJ,SACE,SAAA,SACA,QAAA,KACA,QAAA,MACA,OAAA,ECJA,YAAA,0BAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KhDsRI,UAAA,Q+C1RJ,UAAA,WACA,QAAA,EAEA,cAAS,QAAA,GAET,wBACE,SAAA,SACA,QAAA,MACA,MAAA,MACA,OAAA,MAEA,gCACE,SAAA,SACA,QAAA,GACA,aAAA,YACA,aAAA,MAKN,6CAAA,gBACE,QAAA,MAAA,EAEA,4DAAA,+BACE,OAAA,EAEA,oEAAA,uCACE,IAAA,KACA,aAAA,MAAA,MAAA,EACA,iBAAA,KAKN,+CAAA,gBACE,QAAA,EAAA,MAEA,8DAAA,+BACE,KAAA,EACA,MAAA,MACA,OAAA,MAEA,sEAAA,uCACE,MAAA,KACA,aAAA,MAAA,MAAA,MAAA,EACA,mBAAA,KAKN,gDAAA,mBACE,QAAA,MAAA,EAEA,+DAAA,kCACE,IAAA,EAEA,uEAAA,0CACE,OAAA,KACA,aAAA,EAAA,MAAA,MACA,oBAAA,KAKN,8CAAA,kBACE,QAAA,EAAA,MAEA,6DAAA,iCACE,MAAA,EACA,MAAA,MACA,OAAA,MAEA,qEAAA,yCACE,KAAA,KACA,aAAA,MAAA,EAAA,MAAA,MACA,kBAAA,KAqBN,eACE,UAAA,MACA,QAAA,OAAA,MACA,MAAA,KACA,WAAA,OACA,iBAAA,K9C7FE,cAAA,OgDnBJ,SACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,MACA,UAAA,MDLA,YAAA,0BAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KhDsRI,UAAA,QiDzRJ,UAAA,WACA,iBAAA,KACA,gBAAA,YACA,OAAA,IAAA,MAAA,ehDIE,cAAA,MgDAF,wBACE,SAAA,SACA,QAAA,MACA,MAAA,KACA,OAAA,MAEA,+BAAA,gCAEE,SAAA,SACA,QAAA,MACA,QAAA,GACA,aAAA,YACA,aAAA,MAMJ,4DAAA,+BACE,OAAA,mBAEA,oEAAA,uCACE,OAAA,EACA,aAAA,MAAA,MAAA,EACA,iBAAA,gBAGF,mEAAA,sCACE,OAAA,IACA,aAAA,MAAA,MAAA,EACA,iBAAA,KAMJ,8DAAA,+BACE,KAAA,mBACA,MAAA,MACA,OAAA,KAEA,sEAAA,uCACE,KAAA,EACA,aAAA,MAAA,MAAA,MAAA,EACA,mBAAA,gBAGF,qEAAA,sCACE,KAAA,IACA,aAAA,MAAA,MAAA,MAAA,EACA,mBAAA,KAMJ,+DAAA,kCACE,IAAA,mBAEA,uEAAA,0CACE,IAAA,EACA,aAAA,EAAA,MAAA,MAAA,MACA,oBAAA,gBAGF,sEAAA,yCACE,IAAA,IACA,aAAA,EAAA,MAAA,MAAA,MACA,oBAAA,KAKJ,wEAAA,2CACE,SAAA,SACA,IAAA,EACA,KAAA,IACA,QAAA,MACA,MAAA,KACA,YAAA,OACA,QAAA,GACA,cAAA,IAAA,MAAA,QAKF,6DAAA,iCACE,MAAA,mBACA,MAAA,MACA,OAAA,KAEA,qEAAA,yCACE,MAAA,EACA,aAAA,MAAA,EAAA,MAAA,MACA,kBAAA,gBAGF,oEAAA,wCACE,MAAA,IACA,aAAA,MAAA,EAAA,MAAA,MACA,kBAAA,KAqBN,gBACE,QAAA,MAAA,KACA,cAAA,EjDuJI,UAAA,KiDpJJ,iBAAA,QACA,cAAA,IAAA,MAAA,ehDtHE,uBAAA,kBACA,wBAAA,kBgDwHF,sBACE,QAAA,KAIJ,cACE,QAAA,KAAA,KACA,MAAA,QC/IF,UACE,SAAA,SAGF,wBACE,aAAA,MAGF,gBACE,SAAA,SACA,MAAA,KACA,SAAA,OCtBA,uBACE,QAAA,MACA,MAAA,KACA,QAAA,GDuBJ,eACE,SAAA,SACA,QAAA,KACA,MAAA,KACA,MAAA,KACA,aAAA,MACA,4BAAA,OAAA,oBAAA,OlClBI,WAAA,UAAA,IAAA,YAIA,uCkCQN,elCPQ,WAAA,MjB61LR,oBACA,oBmD70LA,sBAGE,QAAA,MnDg1LF,0BmD50LA,8CAEE,UAAA,iBnD+0LF,4BmD50LA,4CAEE,UAAA,kBAWA,8BACE,QAAA,EACA,oBAAA,QACA,UAAA,KnDu0LJ,uDACA,qDmDr0LE,qCAGE,QAAA,EACA,QAAA,EnDs0LJ,yCmDn0LE,2CAEE,QAAA,EACA,QAAA,ElC/DE,WAAA,QAAA,GAAA,IAIA,uCjBk4LN,yCmD10LE,2ClCvDM,WAAA,MjBu4LR,uBmDn0LA,uBAEE,SAAA,SACA,IAAA,EACA,OAAA,EACA,QAAA,EAEA,QAAA,KACA,YAAA,OACA,gBAAA,OACA,MAAA,IACA,QAAA,EACA,MAAA,KACA,WAAA,OACA,WAAA,IACA,OAAA,EACA,QAAA,GlCzFI,WAAA,QAAA,KAAA,KAIA,uCjB25LN,uBmDt1LA,uBlCpEQ,WAAA,MjBg6LR,6BADA,6BmDv0LE,6BAAA,6BAEE,MAAA,KACA,gBAAA,KACA,QAAA,EACA,QAAA,GAGJ,uBACE,KAAA,EAGF,uBACE,MAAA,EnD20LF,4BmDt0LA,4BAEE,QAAA,aACA,MAAA,KACA,OAAA,KACA,kBAAA,UACA,oBAAA,IACA,gBAAA,KAAA,KAWF,4BACE,iBAAA,wPAEF,4BACE,iBAAA,yPAQF,qBACE,SAAA,SACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,KACA,gBAAA,OACA,QAAA,EAEA,aAAA,IACA,cAAA,KACA,YAAA,IACA,WAAA,KAEA,sCACE,WAAA,YACA,KAAA,EAAA,EAAA,KACA,MAAA,KACA,OAAA,IACA,QAAA,EACA,aAAA,IACA,YAAA,IACA,YAAA,OACA,OAAA,QACA,iBAAA,KACA,gBAAA,YACA,OAAA,EAEA,WAAA,KAAA,MAAA,YACA,cAAA,KAAA,MAAA,YACA,QAAA,GlC5KE,WAAA,QAAA,IAAA,KAIA,uCkCwJJ,sClCvJM,WAAA,MkC2KN,6BACE,QAAA,EASJ,kBACE,SAAA,SACA,MAAA,IACA,OAAA,QACA,KAAA,IACA,YAAA,QACA,eAAA,QACA,MAAA,KACA,WAAA,OnDi0LF,2CmD3zLE,2CAEE,OAAA,UAAA,eAGF,qDACE,iBAAA,KAGF,iCACE,MAAA,KE7NJ,kCACE,GAAK,UAAA,gBADP,0BACE,GAAK,UAAA,gBAIP,gBACE,QAAA,aACA,MAAA,KACA,OAAA,KACA,eAAA,QACA,OAAA,MAAA,MAAA,aACA,mBAAA,YAEA,cAAA,IACA,kBAAA,KAAA,OAAA,SAAA,eAAA,UAAA,KAAA,OAAA,SAAA,eAGF,mBACE,MAAA,KACA,OAAA,KACA,aAAA,KAQF,gCACE,GACE,UAAA,SAEF,IACE,QAAA,EACA,UAAA,MANJ,wBACE,GACE,UAAA,SAEF,IACE,QAAA,EACA,UAAA,MAKJ,cACE,QAAA,aACA,MAAA,KACA,OAAA,KACA,eAAA,QACA,iBAAA,aAEA,cAAA,IACA,QAAA,EACA,kBAAA,KAAA,OAAA,SAAA,aAAA,UAAA,KAAA,OAAA,SAAA,aAGF,iBACE,MAAA,KACA,OAAA,KAIA,uCACE,gBrDiiMJ,cqD/hMM,2BAAA,KAAA,mBAAA,MCjEN,WACE,SAAA,MACA,OAAA,EACA,QAAA,KACA,QAAA,KACA,eAAA,OACA,UAAA,KAEA,WAAA,OACA,iBAAA,KACA,gBAAA,YACA,QAAA,ErCKI,WAAA,UAAA,IAAA,YAIA,uCqCpBN,WrCqBQ,WAAA,MqCLR,oBPdE,SAAA,MACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,MAAA,MACA,OAAA,MACA,iBAAA,KAGA,yBAAS,QAAA,EACT,yBAAS,QAAA,GOQX,kBACE,QAAA,KACA,YAAA,OACA,gBAAA,cACA,QAAA,KAAA,KAEA,6BACE,QAAA,MAAA,MACA,WAAA,OACA,aAAA,OACA,cAAA,OAIJ,iBACE,cAAA,EACA,YAAA,IAGF,gBACE,UAAA,EACA,QAAA,KAAA,KACA,WAAA,KAGF,iBACE,IAAA,EACA,KAAA,EACA,MAAA,MACA,aAAA,IAAA,MAAA,eACA,UAAA,kBAGF,eACE,IAAA,EACA,MAAA,EACA,MAAA,MACA,YAAA,IAAA,MAAA,eACA,UAAA,iBAGF,eACE,IAAA,EACA,MAAA,EACA,KAAA,EACA,OAAA,KACA,WAAA,KACA,cAAA,IAAA,MAAA,eACA,UAAA,kBAGF,kBACE,MAAA,EACA,KAAA,EACA,OAAA,KACA,WAAA,KACA,WAAA,IAAA,MAAA,eACA,UAAA,iBAGF,gBACE,UAAA,KCjFF,aACE,QAAA,aACA,WAAA,IACA,eAAA,OACA,OAAA,KACA,iBAAA,aACA,QAAA,GAEA,yBACE,QAAA,aACA,QAAA,GAKJ,gBACE,WAAA,KAGF,gBACE,WAAA,KAGF,gBACE,WAAA,MAKA,+BACE,kBAAA,iBAAA,GAAA,YAAA,SAAA,UAAA,iBAAA,GAAA,YAAA,SAIJ,oCACE,IACE,QAAA,IAFJ,4BACE,IACE,QAAA,IAIJ,kBACE,mBAAA,8DAAA,WAAA,8DACA,kBAAA,KAAA,KAAA,UAAA,KAAA,KACA,kBAAA,iBAAA,GAAA,OAAA,SAAA,UAAA,iBAAA,GAAA,OAAA,SAGF,oCACE,KACE,sBAAA,MAAA,GAAA,cAAA,MAAA,IAFJ,4BACE,KACE,sBAAA,MAAA,GAAA,cAAA,MAAA,IH9CF,iBACE,QAAA,MACA,MAAA,KACA,QAAA,GIJF,cACE,MAAA,QAGE,oBAAA,oBAEE,MAAA,QANN,gBACE,MAAA,QAGE,sBAAA,sBAEE,MAAA,QANN,cACE,MAAA,QAGE,oBAAA,oBAEE,MAAA,QANN,WACE,MAAA,QAGE,iBAAA,iBAEE,MAAA,QANN,cACE,MAAA,QAGE,oBAAA,oBAEE,MAAA,QANN,aACE,MAAA,QAGE,mBAAA,mBAEE,MAAA,QANN,YACE,MAAA,QAGE,kBAAA,kBAEE,MAAA,QANN,WACE,MAAA,QAGE,iBAAA,iBAEE,MAAA,QCLR,OACE,SAAA,SACA,MAAA,KAEA,eACE,QAAA,MACA,YAAA,uBACA,QAAA,GAGF,SACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,MAAA,KACA,OAAA,KAKF,WACE,kBAAA,KADF,WACE,kBAAA,IADF,YACE,kBAAA,OADF,YACE,kBAAA,eCrBJ,WACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,KAGF,cACE,SAAA,MACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KAQE,YACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,KjDqCF,yBiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,yBiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,yBiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,0BiDxCA,eACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MjDqCF,0BiDxCA,gBACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,MCzBN,QACE,QAAA,KACA,eAAA,IACA,YAAA,OACA,WAAA,QAGF,QACE,QAAA,KACA,KAAA,EAAA,EAAA,KACA,eAAA,OACA,WAAA,QCRF,iB5D+6MA,0D6D36ME,SAAA,mBACA,MAAA,cACA,OAAA,cACA,QAAA,YACA,OAAA,eACA,SAAA,iBACA,KAAA,wBACA,YAAA,iBACA,OAAA,YCXA,uBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,GCRJ,eCAE,SAAA,OACA,cAAA,SACA,YAAA,OCNF,IACE,QAAA,aACA,WAAA,QACA,MAAA,IACA,WAAA,IACA,iBAAA,aACA,QAAA,ICyDM,gBAOI,eAAA,mBAPJ,WAOI,eAAA,cAPJ,cAOI,eAAA,iBAPJ,cAOI,eAAA,iBAPJ,mBAOI,eAAA,sBAPJ,gBAOI,eAAA,mBAPJ,aAOI,MAAA,eAPJ,WAOI,MAAA,gBAPJ,YAOI,MAAA,eAPJ,WAOI,QAAA,YAPJ,YAOI,QAAA,cAPJ,YAOI,QAAA,aAPJ,YAOI,QAAA,cAPJ,aAOI,QAAA,YAPJ,eAOI,SAAA,eAPJ,iBAOI,SAAA,iBAPJ,kBAOI,SAAA,kBAPJ,iBAOI,SAAA,iBAPJ,UAOI,QAAA,iBAPJ,gBAOI,QAAA,uBAPJ,SAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,SAOI,QAAA,gBAPJ,aAOI,QAAA,oBAPJ,cAOI,QAAA,qBAPJ,QAOI,QAAA,eAPJ,eAOI,QAAA,sBAPJ,QAOI,QAAA,eAPJ,QAOI,WAAA,EAAA,MAAA,KAAA,0BAPJ,WAOI,WAAA,EAAA,QAAA,OAAA,2BAPJ,WAOI,WAAA,EAAA,KAAA,KAAA,2BAPJ,aAOI,WAAA,eAPJ,iBAOI,SAAA,iBAPJ,mBAOI,SAAA,mBAPJ,mBAOI,SAAA,mBAPJ,gBAOI,SAAA,gBAPJ,iBAOI,SAAA,yBAAA,SAAA,iBAPJ,OAOI,IAAA,YAPJ,QAOI,IAAA,cAPJ,SAOI,IAAA,eAPJ,UAOI,OAAA,YAPJ,WAOI,OAAA,cAPJ,YAOI,OAAA,eAPJ,SAOI,KAAA,YAPJ,UAOI,KAAA,cAPJ,WAOI,KAAA,eAPJ,OAOI,MAAA,YAPJ,QAOI,MAAA,cAPJ,SAOI,MAAA,eAPJ,kBAOI,UAAA,+BAPJ,oBAOI,UAAA,2BAPJ,oBAOI,UAAA,2BAPJ,QAOI,OAAA,IAAA,MAAA,kBAPJ,UAOI,OAAA,YAPJ,YAOI,WAAA,IAAA,MAAA,kBAPJ,cAOI,WAAA,YAPJ,YAOI,aAAA,IAAA,MAAA,kBAPJ,cAOI,aAAA,YAPJ,eAOI,cAAA,IAAA,MAAA,kBAPJ,iBAOI,cAAA,YAPJ,cAOI,YAAA,IAAA,MAAA,kBAPJ,gBAOI,YAAA,YAPJ,gBAOI,aAAA,kBAPJ,kBAOI,aAAA,kBAPJ,gBAOI,aAAA,kBAPJ,aAOI,aAAA,kBAPJ,gBAOI,aAAA,kBAPJ,eAOI,aAAA,kBAPJ,cAOI,aAAA,kBAPJ,aAOI,aAAA,kBAPJ,cAOI,aAAA,eAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,UAOI,aAAA,cAPJ,MAOI,MAAA,cAPJ,MAOI,MAAA,cAPJ,MAOI,MAAA,cAPJ,OAOI,MAAA,eAPJ,QAOI,MAAA,eAPJ,QAOI,UAAA,eAPJ,QAOI,MAAA,gBAPJ,YAOI,UAAA,gBAPJ,MAOI,OAAA,cAPJ,MAOI,OAAA,cAPJ,MAOI,OAAA,cAPJ,OAOI,OAAA,eAPJ,QAOI,OAAA,eAPJ,QAOI,WAAA,eAPJ,QAOI,OAAA,gBAPJ,YAOI,WAAA,gBAPJ,WAOI,KAAA,EAAA,EAAA,eAPJ,UAOI,eAAA,cAPJ,aAOI,eAAA,iBAPJ,kBAOI,eAAA,sBAPJ,qBAOI,eAAA,yBAPJ,aAOI,UAAA,YAPJ,aAOI,UAAA,YAPJ,eAOI,YAAA,YAPJ,eAOI,YAAA,YAPJ,WAOI,UAAA,eAPJ,aAOI,UAAA,iBAPJ,mBAOI,UAAA,uBAPJ,OAOI,IAAA,YAPJ,OAOI,IAAA,iBAPJ,OAOI,IAAA,gBAPJ,OAOI,IAAA,eAPJ,OAOI,IAAA,iBAPJ,OAOI,IAAA,eAPJ,uBAOI,gBAAA,qBAPJ,qBAOI,gBAAA,mBAPJ,wBAOI,gBAAA,iBAPJ,yBAOI,gBAAA,wBAPJ,wBAOI,gBAAA,uBAPJ,wBAOI,gBAAA,uBAPJ,mBAOI,YAAA,qBAPJ,iBAOI,YAAA,mBAPJ,oBAOI,YAAA,iBAPJ,sBAOI,YAAA,mBAPJ,qBAOI,YAAA,kBAPJ,qBAOI,cAAA,qBAPJ,mBAOI,cAAA,mBAPJ,sBAOI,cAAA,iBAPJ,uBAOI,cAAA,wBAPJ,sBAOI,cAAA,uBAPJ,uBAOI,cAAA,kBAPJ,iBAOI,WAAA,eAPJ,kBAOI,WAAA,qBAPJ,gBAOI,WAAA,mBAPJ,mBAOI,WAAA,iBAPJ,qBAOI,WAAA,mBAPJ,oBAOI,WAAA,kBAPJ,aAOI,MAAA,aAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,KAOI,OAAA,YAPJ,KAOI,OAAA,iBAPJ,KAOI,OAAA,gBAPJ,KAOI,OAAA,eAPJ,KAOI,OAAA,iBAPJ,KAOI,OAAA,eAPJ,QAOI,OAAA,eAPJ,MAOI,aAAA,YAAA,YAAA,YAPJ,MAOI,aAAA,iBAAA,YAAA,iBAPJ,MAOI,aAAA,gBAAA,YAAA,gBAPJ,MAOI,aAAA,eAAA,YAAA,eAPJ,MAOI,aAAA,iBAAA,YAAA,iBAPJ,MAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,MAOI,WAAA,YAAA,cAAA,YAPJ,MAOI,WAAA,iBAAA,cAAA,iBAPJ,MAOI,WAAA,gBAAA,cAAA,gBAPJ,MAOI,WAAA,eAAA,cAAA,eAPJ,MAOI,WAAA,iBAAA,cAAA,iBAPJ,MAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,MAOI,WAAA,YAPJ,MAOI,WAAA,iBAPJ,MAOI,WAAA,gBAPJ,MAOI,WAAA,eAPJ,MAOI,WAAA,iBAPJ,MAOI,WAAA,eAPJ,SAOI,WAAA,eAPJ,MAOI,aAAA,YAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,gBAPJ,MAOI,aAAA,eAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,eAPJ,SAOI,aAAA,eAPJ,MAOI,cAAA,YAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,gBAPJ,MAOI,cAAA,eAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,eAPJ,SAOI,cAAA,eAPJ,MAOI,YAAA,YAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,gBAPJ,MAOI,YAAA,eAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,eAPJ,SAOI,YAAA,eAPJ,KAOI,QAAA,YAPJ,KAOI,QAAA,iBAPJ,KAOI,QAAA,gBAPJ,KAOI,QAAA,eAPJ,KAOI,QAAA,iBAPJ,KAOI,QAAA,eAPJ,MAOI,cAAA,YAAA,aAAA,YAPJ,MAOI,cAAA,iBAAA,aAAA,iBAPJ,MAOI,cAAA,gBAAA,aAAA,gBAPJ,MAOI,cAAA,eAAA,aAAA,eAPJ,MAOI,cAAA,iBAAA,aAAA,iBAPJ,MAOI,cAAA,eAAA,aAAA,eAPJ,MAOI,YAAA,YAAA,eAAA,YAPJ,MAOI,YAAA,iBAAA,eAAA,iBAPJ,MAOI,YAAA,gBAAA,eAAA,gBAPJ,MAOI,YAAA,eAAA,eAAA,eAPJ,MAOI,YAAA,iBAAA,eAAA,iBAPJ,MAOI,YAAA,eAAA,eAAA,eAPJ,MAOI,YAAA,YAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,gBAPJ,MAOI,YAAA,eAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,eAPJ,MAOI,cAAA,YAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,gBAPJ,MAOI,cAAA,eAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,eAPJ,MAOI,eAAA,YAPJ,MAOI,eAAA,iBAPJ,MAOI,eAAA,gBAPJ,MAOI,eAAA,eAPJ,MAOI,eAAA,iBAPJ,MAOI,eAAA,eAPJ,MAOI,aAAA,YAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,gBAPJ,MAOI,aAAA,eAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,eAPJ,gBAOI,YAAA,mCAPJ,MAOI,UAAA,iCAPJ,MAOI,UAAA,gCAPJ,MAOI,UAAA,8BAPJ,MAOI,UAAA,gCAPJ,MAOI,UAAA,kBAPJ,MAOI,UAAA,eAPJ,YAOI,WAAA,iBAPJ,YAOI,WAAA,iBAPJ,UAOI,YAAA,cAPJ,YAOI,YAAA,kBAPJ,WAOI,YAAA,cAPJ,SAOI,YAAA,cAPJ,WAOI,YAAA,iBAPJ,MAOI,YAAA,YAPJ,OAOI,YAAA,eAPJ,SAOI,YAAA,cAPJ,OAOI,YAAA,YAPJ,YAOI,WAAA,eAPJ,UAOI,WAAA,gBAPJ,aAOI,WAAA,iBAPJ,sBAOI,gBAAA,eAPJ,2BAOI,gBAAA,oBAPJ,8BAOI,gBAAA,uBAPJ,gBAOI,eAAA,oBAPJ,gBAOI,eAAA,oBAPJ,iBAOI,eAAA,qBAPJ,WAOI,YAAA,iBAPJ,aAOI,YAAA,iBAPJ,YAOI,UAAA,qBAAA,WAAA,qBAPJ,cAIQ,kBAAA,EAGJ,MAAA,6DAPJ,gBAIQ,kBAAA,EAGJ,MAAA,+DAPJ,cAIQ,kBAAA,EAGJ,MAAA,6DAPJ,WAIQ,kBAAA,EAGJ,MAAA,0DAPJ,cAIQ,kBAAA,EAGJ,MAAA,6DAPJ,aAIQ,kBAAA,EAGJ,MAAA,4DAPJ,YAIQ,kBAAA,EAGJ,MAAA,2DAPJ,WAIQ,kBAAA,EAGJ,MAAA,0DAPJ,YAIQ,kBAAA,EAGJ,MAAA,2DAPJ,YAIQ,kBAAA,EAGJ,MAAA,2DAPJ,WAIQ,kBAAA,EAGJ,MAAA,gEAPJ,YAIQ,kBAAA,EAGJ,MAAA,kBAPJ,eAIQ,kBAAA,EAGJ,MAAA,yBAPJ,eAIQ,kBAAA,EAGJ,MAAA,+BAPJ,YAIQ,kBAAA,EAGJ,MAAA,kBAjBJ,iBACE,kBAAA,KADF,iBACE,kBAAA,IADF,iBACE,kBAAA,KADF,kBACE,kBAAA,EASF,YAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,cAIQ,gBAAA,EAGJ,iBAAA,6DAPJ,YAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,SAIQ,gBAAA,EAGJ,iBAAA,wDAPJ,YAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,WAIQ,gBAAA,EAGJ,iBAAA,0DAPJ,UAIQ,gBAAA,EAGJ,iBAAA,yDAPJ,SAIQ,gBAAA,EAGJ,iBAAA,wDAPJ,UAIQ,gBAAA,EAGJ,iBAAA,yDAPJ,UAIQ,gBAAA,EAGJ,iBAAA,yDAPJ,SAIQ,gBAAA,EAGJ,iBAAA,2DAPJ,gBAIQ,gBAAA,EAGJ,iBAAA,sBAjBJ,eACE,gBAAA,IADF,eACE,gBAAA,KADF,eACE,gBAAA,IADF,eACE,gBAAA,KADF,gBACE,gBAAA,EASF,aAOI,iBAAA,6BAPJ,iBAOI,oBAAA,cAAA,iBAAA,cAAA,YAAA,cAPJ,kBAOI,oBAAA,eAAA,iBAAA,eAAA,YAAA,eAPJ,kBAOI,oBAAA,eAAA,iBAAA,eAAA,YAAA,eAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,eAPJ,SAOI,cAAA,iBAPJ,WAOI,cAAA,YAPJ,WAOI,cAAA,gBAPJ,WAOI,cAAA,iBAPJ,WAOI,cAAA,gBAPJ,gBAOI,cAAA,cAPJ,cAOI,cAAA,gBAPJ,aAOI,uBAAA,iBAAA,wBAAA,iBAPJ,aAOI,wBAAA,iBAAA,2BAAA,iBAPJ,gBAOI,2BAAA,iBAAA,0BAAA,iBAPJ,eAOI,0BAAA,iBAAA,uBAAA,iBAPJ,SAOI,WAAA,kBAPJ,WAOI,WAAA,iBzDPR,yByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,yByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,yByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,0ByDAI,gBAOI,MAAA,eAPJ,cAOI,MAAA,gBAPJ,eAOI,MAAA,eAPJ,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,UAOI,IAAA,YAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,gBAPJ,UAOI,IAAA,eAPJ,UAOI,IAAA,iBAPJ,UAOI,IAAA,eAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,eAOI,WAAA,eAPJ,aAOI,WAAA,gBAPJ,gBAOI,WAAA,kBzDPR,0ByDAI,iBAOI,MAAA,eAPJ,eAOI,MAAA,gBAPJ,gBAOI,MAAA,eAPJ,cAOI,QAAA,iBAPJ,oBAOI,QAAA,uBAPJ,aAOI,QAAA,gBAPJ,YAOI,QAAA,eAPJ,aAOI,QAAA,gBAPJ,iBAOI,QAAA,oBAPJ,kBAOI,QAAA,qBAPJ,YAOI,QAAA,eAPJ,mBAOI,QAAA,sBAPJ,YAOI,QAAA,eAPJ,eAOI,KAAA,EAAA,EAAA,eAPJ,cAOI,eAAA,cAPJ,iBAOI,eAAA,iBAPJ,sBAOI,eAAA,sBAPJ,yBAOI,eAAA,yBAPJ,iBAOI,UAAA,YAPJ,iBAOI,UAAA,YAPJ,mBAOI,YAAA,YAPJ,mBAOI,YAAA,YAPJ,eAOI,UAAA,eAPJ,iBAOI,UAAA,iBAPJ,uBAOI,UAAA,uBAPJ,WAOI,IAAA,YAPJ,WAOI,IAAA,iBAPJ,WAOI,IAAA,gBAPJ,WAOI,IAAA,eAPJ,WAOI,IAAA,iBAPJ,WAOI,IAAA,eAPJ,2BAOI,gBAAA,qBAPJ,yBAOI,gBAAA,mBAPJ,4BAOI,gBAAA,iBAPJ,6BAOI,gBAAA,wBAPJ,4BAOI,gBAAA,uBAPJ,4BAOI,gBAAA,uBAPJ,uBAOI,YAAA,qBAPJ,qBAOI,YAAA,mBAPJ,wBAOI,YAAA,iBAPJ,0BAOI,YAAA,mBAPJ,yBAOI,YAAA,kBAPJ,yBAOI,cAAA,qBAPJ,uBAOI,cAAA,mBAPJ,0BAOI,cAAA,iBAPJ,2BAOI,cAAA,wBAPJ,0BAOI,cAAA,uBAPJ,2BAOI,cAAA,kBAPJ,qBAOI,WAAA,eAPJ,sBAOI,WAAA,qBAPJ,oBAOI,WAAA,mBAPJ,uBAOI,WAAA,iBAPJ,yBAOI,WAAA,mBAPJ,wBAOI,WAAA,kBAPJ,iBAOI,MAAA,aAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,gBAOI,MAAA,YAPJ,SAOI,OAAA,YAPJ,SAOI,OAAA,iBAPJ,SAOI,OAAA,gBAPJ,SAOI,OAAA,eAPJ,SAOI,OAAA,iBAPJ,SAOI,OAAA,eAPJ,YAOI,OAAA,eAPJ,UAOI,aAAA,YAAA,YAAA,YAPJ,UAOI,aAAA,iBAAA,YAAA,iBAPJ,UAOI,aAAA,gBAAA,YAAA,gBAPJ,UAOI,aAAA,eAAA,YAAA,eAPJ,UAOI,aAAA,iBAAA,YAAA,iBAPJ,UAOI,aAAA,eAAA,YAAA,eAPJ,aAOI,aAAA,eAAA,YAAA,eAPJ,UAOI,WAAA,YAAA,cAAA,YAPJ,UAOI,WAAA,iBAAA,cAAA,iBAPJ,UAOI,WAAA,gBAAA,cAAA,gBAPJ,UAOI,WAAA,eAAA,cAAA,eAPJ,UAOI,WAAA,iBAAA,cAAA,iBAPJ,UAOI,WAAA,eAAA,cAAA,eAPJ,aAOI,WAAA,eAAA,cAAA,eAPJ,UAOI,WAAA,YAPJ,UAOI,WAAA,iBAPJ,UAOI,WAAA,gBAPJ,UAOI,WAAA,eAPJ,UAOI,WAAA,iBAPJ,UAOI,WAAA,eAPJ,aAOI,WAAA,eAPJ,UAOI,aAAA,YAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,gBAPJ,UAOI,aAAA,eAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,eAPJ,aAOI,aAAA,eAPJ,UAOI,cAAA,YAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,gBAPJ,UAOI,cAAA,eAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,eAPJ,aAOI,cAAA,eAPJ,UAOI,YAAA,YAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,gBAPJ,UAOI,YAAA,eAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,eAPJ,aAOI,YAAA,eAPJ,SAOI,QAAA,YAPJ,SAOI,QAAA,iBAPJ,SAOI,QAAA,gBAPJ,SAOI,QAAA,eAPJ,SAOI,QAAA,iBAPJ,SAOI,QAAA,eAPJ,UAOI,cAAA,YAAA,aAAA,YAPJ,UAOI,cAAA,iBAAA,aAAA,iBAPJ,UAOI,cAAA,gBAAA,aAAA,gBAPJ,UAOI,cAAA,eAAA,aAAA,eAPJ,UAOI,cAAA,iBAAA,aAAA,iBAPJ,UAOI,cAAA,eAAA,aAAA,eAPJ,UAOI,YAAA,YAAA,eAAA,YAPJ,UAOI,YAAA,iBAAA,eAAA,iBAPJ,UAOI,YAAA,gBAAA,eAAA,gBAPJ,UAOI,YAAA,eAAA,eAAA,eAPJ,UAOI,YAAA,iBAAA,eAAA,iBAPJ,UAOI,YAAA,eAAA,eAAA,eAPJ,UAOI,YAAA,YAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,gBAPJ,UAOI,YAAA,eAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,eAPJ,UAOI,cAAA,YAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,gBAPJ,UAOI,cAAA,eAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,eAPJ,UAOI,eAAA,YAPJ,UAOI,eAAA,iBAPJ,UAOI,eAAA,gBAPJ,UAOI,eAAA,eAPJ,UAOI,eAAA,iBAPJ,UAOI,eAAA,eAPJ,UAOI,aAAA,YAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,gBAPJ,UAOI,aAAA,eAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,eAPJ,gBAOI,WAAA,eAPJ,cAOI,WAAA,gBAPJ,iBAOI,WAAA,kBCnDZ,0BD4CQ,MAOI,UAAA,iBAPJ,MAOI,UAAA,eAPJ,MAOI,UAAA,kBAPJ,MAOI,UAAA,kBChCZ,aDyBQ,gBAOI,QAAA,iBAPJ,sBAOI,QAAA,uBAPJ,eAOI,QAAA,gBAPJ,cAOI,QAAA,eAPJ,eAOI,QAAA,gBAPJ,mBAOI,QAAA,oBAPJ,oBAOI,QAAA,qBAPJ,cAOI,QAAA,eAPJ,qBAOI,QAAA,sBAPJ,cAOI,QAAA","sourcesContent":["/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$variable-prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`<button>` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n // Remove the inheritance of word-wrap in Safari.\n // See https://github.com/twbs/bootstrap/issues/24990\n word-wrap: normal;\n\n // Undo the opacity change from Chrome\n &:disabled {\n opacity: 1;\n }\n}\n\n// Remove the dropdown arrow in Chrome from inputs built with datalists.\n// See https://stackoverflow.com/a/54997118\n\n[list]::-webkit-calendar-picker-indicator {\n display: none;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n\n @if $enable-button-pointers {\n &:not(:disabled) {\n cursor: pointer; // 3\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n// unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n// So we reset that to ensure fieldsets behave more like a standard block element.\n// See https://github.com/twbs/bootstrap/issues/12359\n// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n min-width: 0; // 1\n padding: 0; // 2\n margin: 0; // 2\n border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n// This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n// See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n float: left; // 1\n width: 100%;\n padding: 0;\n margin-bottom: $legend-margin-bottom;\n @include font-size($legend-font-size);\n font-weight: $legend-font-weight;\n line-height: inherit;\n\n + * {\n clear: left; // 2\n }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n// 1. Correct the outline style in Safari.\n// 2. This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\n[type=\"search\"] {\n outline-offset: -2px; // 1\n -webkit-appearance: textfield; // 2\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n\n// Inherit font family and line height for file input buttons\n\n::file-selector-button {\n font: inherit;\n}\n\n// 1. Change font properties to `inherit`\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::-webkit-file-upload-button {\n font: inherit; // 1\n -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n display: list-item; // 1\n cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n display: none !important;\n}\n","@charset \"UTF-8\";\n/*!\n * Bootstrap v5.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n background-color: currentColor;\n border: 0;\n opacity: 0.25;\n}\n\nhr:not([size]) {\n height: 1px;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1, .h1 {\n font-size: 2.5rem;\n }\n}\n\nh2, .h2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2, .h2 {\n font-size: 2rem;\n }\n}\n\nh3, .h3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3, .h3 {\n font-size: 1.75rem;\n }\n}\n\nh4, .h4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4, .h4 {\n font-size: 1.5rem;\n }\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-bs-original-title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall, .small {\n font-size: 0.875em;\n}\n\nmark, .mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: #0d6efd;\n text-decoration: underline;\n}\na:hover {\n color: #0a58ca;\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n direction: ltr /* rtl:ignore */;\n unicode-bidi: bidi-override;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: #d63384;\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 0.875em;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n font-weight: 700;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: #6c757d;\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]::-webkit-calendar-picker-indicator {\n display: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n outline-offset: -2px;\n -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n}\n\n::file-selector-button {\n font: inherit;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: calc(1.625rem + 4.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-1 {\n font-size: 5rem;\n }\n}\n\n.display-2 {\n font-size: calc(1.575rem + 3.9vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-2 {\n font-size: 4.5rem;\n }\n}\n\n.display-3 {\n font-size: calc(1.525rem + 3.3vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-3 {\n font-size: 4rem;\n }\n}\n\n.display-4 {\n font-size: calc(1.475rem + 2.7vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-4 {\n font-size: 3.5rem;\n }\n}\n\n.display-5 {\n font-size: calc(1.425rem + 2.1vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-5 {\n font-size: 3rem;\n }\n}\n\n.display-6 {\n font-size: calc(1.375rem + 1.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-6 {\n font-size: 2.5rem;\n }\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 0.875em;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n.blockquote > :last-child {\n margin-bottom: 0;\n}\n\n.blockquote-footer {\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n.blockquote-footer::before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 0.875em;\n color: #6c757d;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n width: 100%;\n padding-right: var(--bs-gutter-x, 0.75rem);\n padding-left: var(--bs-gutter-x, 0.75rem);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-sm-0 {\n margin-left: 0;\n }\n\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-sm-3 {\n margin-left: 25%;\n }\n\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-sm-6 {\n margin-left: 50%;\n }\n\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-sm-9 {\n margin-left: 75%;\n }\n\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n\n .g-sm-0,\n.gx-sm-0 {\n --bs-gutter-x: 0;\n }\n\n .g-sm-0,\n.gy-sm-0 {\n --bs-gutter-y: 0;\n }\n\n .g-sm-1,\n.gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-sm-1,\n.gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-sm-2,\n.gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-sm-2,\n.gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-sm-3,\n.gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-sm-3,\n.gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-sm-4,\n.gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-sm-4,\n.gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-sm-5,\n.gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-sm-5,\n.gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-md-0 {\n margin-left: 0;\n }\n\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-md-3 {\n margin-left: 25%;\n }\n\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-md-6 {\n margin-left: 50%;\n }\n\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-md-9 {\n margin-left: 75%;\n }\n\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n\n .g-md-0,\n.gx-md-0 {\n --bs-gutter-x: 0;\n }\n\n .g-md-0,\n.gy-md-0 {\n --bs-gutter-y: 0;\n }\n\n .g-md-1,\n.gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-md-1,\n.gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-md-2,\n.gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-md-2,\n.gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-md-3,\n.gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-md-3,\n.gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-md-4,\n.gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-md-4,\n.gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-md-5,\n.gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-md-5,\n.gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-lg-0 {\n margin-left: 0;\n }\n\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-lg-3 {\n margin-left: 25%;\n }\n\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-lg-6 {\n margin-left: 50%;\n }\n\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-lg-9 {\n margin-left: 75%;\n }\n\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n\n .g-lg-0,\n.gx-lg-0 {\n --bs-gutter-x: 0;\n }\n\n .g-lg-0,\n.gy-lg-0 {\n --bs-gutter-y: 0;\n }\n\n .g-lg-1,\n.gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-lg-1,\n.gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-lg-2,\n.gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-lg-2,\n.gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-lg-3,\n.gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-lg-3,\n.gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-lg-4,\n.gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-lg-4,\n.gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-lg-5,\n.gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-lg-5,\n.gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-xl-0 {\n margin-left: 0;\n }\n\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-xl-3 {\n margin-left: 25%;\n }\n\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-xl-6 {\n margin-left: 50%;\n }\n\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-xl-9 {\n margin-left: 75%;\n }\n\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n\n .g-xl-0,\n.gx-xl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xl-0,\n.gy-xl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xl-1,\n.gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-xl-1,\n.gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-xl-2,\n.gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-xl-2,\n.gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-xl-3,\n.gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xl-3,\n.gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xl-4,\n.gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xl-4,\n.gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xl-5,\n.gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xl-5,\n.gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n\n .offset-xxl-0 {\n margin-left: 0;\n }\n\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n\n .offset-xxl-3 {\n margin-left: 25%;\n }\n\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n\n .offset-xxl-6 {\n margin-left: 50%;\n }\n\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n\n .offset-xxl-9 {\n margin-left: 75%;\n }\n\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n\n .g-xxl-0,\n.gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n\n .g-xxl-0,\n.gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n\n .g-xxl-1,\n.gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n\n .g-xxl-1,\n.gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n\n .g-xxl-2,\n.gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n\n .g-xxl-2,\n.gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n\n .g-xxl-3,\n.gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n\n .g-xxl-3,\n.gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n\n .g-xxl-4,\n.gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n\n .g-xxl-4,\n.gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n\n .g-xxl-5,\n.gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n\n .g-xxl-5,\n.gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.table {\n --bs-table-bg: transparent;\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: #212529;\n --bs-table-striped-bg: rgba(0, 0, 0, 0.05);\n --bs-table-active-color: #212529;\n --bs-table-active-bg: rgba(0, 0, 0, 0.1);\n --bs-table-hover-color: #212529;\n --bs-table-hover-bg: rgba(0, 0, 0, 0.075);\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n vertical-align: top;\n border-color: #dee2e6;\n}\n.table > :not(caption) > * > * {\n padding: 0.5rem 0.5rem;\n background-color: var(--bs-table-bg);\n border-bottom-width: 1px;\n box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);\n}\n.table > tbody {\n vertical-align: inherit;\n}\n.table > thead {\n vertical-align: bottom;\n}\n.table > :not(:first-child) {\n border-top: 2px solid currentColor;\n}\n\n.caption-top {\n caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n border-width: 1px 0;\n}\n.table-bordered > :not(caption) > * > * {\n border-width: 0 1px;\n}\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n --bs-table-accent-bg: var(--bs-table-striped-bg);\n color: var(--bs-table-striped-color);\n}\n\n.table-active {\n --bs-table-accent-bg: var(--bs-table-active-bg);\n color: var(--bs-table-active-color);\n}\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-accent-bg: var(--bs-table-hover-bg);\n color: var(--bs-table-hover-color);\n}\n\n.table-primary {\n --bs-table-bg: #cfe2ff;\n --bs-table-striped-bg: #c5d7f2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bacbe6;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfd1ec;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bacbe6;\n}\n\n.table-secondary {\n --bs-table-bg: #e2e3e5;\n --bs-table-striped-bg: #d7d8da;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #cbccce;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #d1d2d4;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #cbccce;\n}\n\n.table-success {\n --bs-table-bg: #d1e7dd;\n --bs-table-striped-bg: #c7dbd2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bcd0c7;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #c1d6cc;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #bcd0c7;\n}\n\n.table-info {\n --bs-table-bg: #cff4fc;\n --bs-table-striped-bg: #c5e8ef;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #badce3;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfe2e9;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #badce3;\n}\n\n.table-warning {\n --bs-table-bg: #fff3cd;\n --bs-table-striped-bg: #f2e7c3;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #e6dbb9;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #ece1be;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #e6dbb9;\n}\n\n.table-danger {\n --bs-table-bg: #f8d7da;\n --bs-table-striped-bg: #eccccf;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfc2c4;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5c7ca;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfc2c4;\n}\n\n.table-light {\n --bs-table-bg: #f8f9fa;\n --bs-table-striped-bg: #ecedee;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfe0e1;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5e6e7;\n --bs-table-hover-color: #000;\n color: #000;\n border-color: #dfe0e1;\n}\n\n.table-dark {\n --bs-table-bg: #212529;\n --bs-table-striped-bg: #2c3034;\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: #373b3e;\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: #323539;\n --bs-table-hover-color: #fff;\n color: #fff;\n border-color: #373b3e;\n}\n\n.table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 767.98px) {\n .table-responsive-md {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1399.98px) {\n .table-responsive-xxl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n.form-label {\n margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n}\n\n.form-text {\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n.form-control[type=file] {\n overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control:focus {\n color: #212529;\n background-color: #fff;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n height: 1.5em;\n}\n.form-control::-moz-placeholder {\n color: #6c757d;\n opacity: 1;\n}\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n.form-control::file-selector-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n .form-control::file-selector-button {\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: #dde0e3;\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: #dde0e3;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: #212529;\n background-color: #e9ecef;\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: 1px;\n border-radius: 0;\n -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: #dde0e3;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n min-height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::file-selector-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n min-height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::file-selector-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n min-height: calc(1.5em + 0.75rem + 2px);\n}\ntextarea.form-control-sm {\n min-height: calc(1.5em + 0.5rem + 2px);\n}\ntextarea.form-control-lg {\n min-height: calc(1.5em + 1rem + 2px);\n}\n\n.form-control-color {\n width: 3rem;\n height: auto;\n padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n height: 1.5em;\n border-radius: 0.25rem;\n}\n.form-control-color::-webkit-color-swatch {\n height: 1.5em;\n border-radius: 0.25rem;\n}\n\n.form-select {\n display: block;\n width: 100%;\n padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n -moz-padding-start: calc(0.75rem - 3px);\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right 0.75rem center;\n background-size: 16px 12px;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none;\n }\n}\n.form-select:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n padding-right: 0.75rem;\n background-image: none;\n}\n.form-select:disabled {\n background-color: #e9ecef;\n}\n.form-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 #212529;\n}\n\n.form-select-sm {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.form-select-lg {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.form-check {\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5em;\n margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n float: left;\n margin-left: -1.5em;\n}\n\n.form-check-input {\n width: 1em;\n height: 1em;\n margin-top: 0.25em;\n vertical-align: top;\n background-color: #fff;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: 1px solid rgba(0, 0, 0, 0.25);\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-print-color-adjust: exact;\n color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n border-radius: 50%;\n}\n.form-check-input:active {\n filter: brightness(90%);\n}\n.form-check-input:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n background-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 10l3 3l6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n background-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\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n background-color: #0d6efd;\n border-color: #0d6efd;\n background-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\");\n}\n.form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n opacity: 0.5;\n}\n\n.form-switch {\n padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n width: 2em;\n margin-left: -2.5em;\n background-image: 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\");\n background-position: left center;\n border-radius: 2em;\n transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none;\n }\n}\n.form-switch .form-check-input:focus {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n background-position: right center;\n background-image: 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\");\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: 1rem;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n pointer-events: none;\n filter: none;\n opacity: 0.65;\n}\n\n.form-range {\n width: 100%;\n height: 1.5rem;\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.form-range:focus {\n outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n border: 0;\n}\n.form-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-range::-webkit-slider-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n -moz-transition: none;\n transition: none;\n }\n}\n.form-range::-moz-range-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range:disabled {\n pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n.form-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.form-floating {\n position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-select {\n height: calc(3.5rem + 2px);\n line-height: 1.25;\n}\n.form-floating > label {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n padding: 1rem 0.75rem;\n pointer-events: none;\n border: 1px solid transparent;\n transform-origin: 0 0;\n transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none;\n }\n}\n.form-floating > .form-control {\n padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::-moz-placeholder {\n color: transparent;\n}\n.form-floating > .form-control::placeholder {\n color: transparent;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-select ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n opacity: 0.65;\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus {\n z-index: 3;\n}\n.input-group .btn {\n position: relative;\n z-index: 2;\n}\n.input-group .btn:focus {\n z-index: 3;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #198754;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(25, 135, 84, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #198754;\n padding-right: calc(1.5em + 0.75rem);\n 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.73L.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.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n border-color: #198754;\n}\n.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\"] {\n padding-right: 4.125rem;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\"), 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.73L.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.1z'/%3e%3c/svg%3e\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n border-color: #198754;\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n border-color: #198754;\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n background-color: #198754;\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #198754;\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid,\n.was-validated .input-group .form-select:valid,\n.input-group .form-select.is-valid {\n z-index: 1;\n}\n.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus,\n.was-validated .input-group .form-select:valid:focus,\n.input-group .form-select.is-valid:focus {\n z-index: 3;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n 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\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n border-color: #dc3545;\n}\n.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\"] {\n padding-right: 4.125rem;\n background-image: 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 5l6 6 6-6'/%3e%3c/svg%3e\"), 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\");\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n border-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n background-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid,\n.was-validated .input-group .form-select:invalid,\n.input-group .form-select.is-invalid {\n z-index: 2;\n}\n.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus,\n.was-validated .input-group .form-select:invalid:focus,\n.input-group .form-select.is-invalid:focus {\n z-index: 3;\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n.btn:hover {\n color: #212529;\n}\n.btn-check:focus + .btn, .btn:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n pointer-events: none;\n opacity: 0.65;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #0b5ed7;\n border-color: #0a58ca;\n}\n.btn-check:focus + .btn-primary, .btn-primary:focus {\n color: #fff;\n background-color: #0b5ed7;\n border-color: #0a58ca;\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0a58ca;\n border-color: #0a53be;\n}\n.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-primary:disabled, .btn-primary.disabled {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-secondary:hover {\n color: #fff;\n background-color: #5c636a;\n border-color: #565e64;\n}\n.btn-check:focus + .btn-secondary, .btn-secondary:focus {\n color: #fff;\n background-color: #5c636a;\n border-color: #565e64;\n box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #565e64;\n border-color: #51585e;\n}\n.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-secondary:disabled, .btn-secondary.disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-success {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #157347;\n border-color: #146c43;\n}\n.btn-check:focus + .btn-success, .btn-success:focus {\n color: #fff;\n background-color: #157347;\n border-color: #146c43;\n box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #146c43;\n border-color: #13653f;\n}\n.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-success:disabled, .btn-success.disabled {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n\n.btn-info {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-info:hover {\n color: #000;\n background-color: #31d2f2;\n border-color: #25cff2;\n}\n.btn-check:focus + .btn-info, .btn-info:focus {\n color: #000;\n background-color: #31d2f2;\n border-color: #25cff2;\n box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle {\n color: #000;\n background-color: #3dd5f3;\n border-color: #25cff2;\n}\n.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-info:disabled, .btn-info.disabled {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n\n.btn-warning {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-warning:hover {\n color: #000;\n background-color: #ffca2c;\n border-color: #ffc720;\n}\n.btn-check:focus + .btn-warning, .btn-warning:focus {\n color: #000;\n background-color: #ffca2c;\n border-color: #ffc720;\n box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle {\n color: #000;\n background-color: #ffcd39;\n border-color: #ffc720;\n}\n.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-warning:disabled, .btn-warning.disabled {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #bb2d3b;\n border-color: #b02a37;\n}\n.btn-check:focus + .btn-danger, .btn-danger:focus {\n color: #fff;\n background-color: #bb2d3b;\n border-color: #b02a37;\n box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #b02a37;\n border-color: #a52834;\n}\n.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-danger:disabled, .btn-danger.disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-light {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-light:hover {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n}\n.btn-check:focus + .btn-light, .btn-light:focus {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle {\n color: #000;\n background-color: #f9fafb;\n border-color: #f9fafb;\n}\n.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-light:disabled, .btn-light.disabled {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-dark {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-dark:hover {\n color: #fff;\n background-color: #1c1f23;\n border-color: #1a1e21;\n}\n.btn-check:focus + .btn-dark, .btn-dark:focus {\n color: #fff;\n background-color: #1c1f23;\n border-color: #1a1e21;\n box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1a1e21;\n border-color: #191c1f;\n}\n.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-dark:disabled, .btn-dark.disabled {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n\n.btn-outline-primary {\n color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-outline-primary:disabled, .btn-outline-primary.disabled {\n color: #0d6efd;\n background-color: transparent;\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {\n box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-secondary:disabled, .btn-outline-secondary.disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-success {\n color: #198754;\n border-color: #198754;\n}\n.btn-outline-success:hover {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-check:focus + .btn-outline-success, .btn-outline-success:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {\n color: #fff;\n background-color: #198754;\n border-color: #198754;\n}\n.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-outline-success:disabled, .btn-outline-success.disabled {\n color: #198754;\n background-color: transparent;\n}\n\n.btn-outline-info {\n color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-outline-info:hover {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-check:focus + .btn-outline-info, .btn-outline-info:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {\n color: #000;\n background-color: #0dcaf0;\n border-color: #0dcaf0;\n}\n.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-outline-info:disabled, .btn-outline-info.disabled {\n color: #0dcaf0;\n background-color: transparent;\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n.btn-outline-warning:hover {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {\n box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {\n color: #000;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-warning:disabled, .btn-outline-warning.disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-danger:disabled, .btn-outline-danger.disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-outline-light:hover {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-check:focus + .btn-outline-light, .btn-outline-light:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show {\n color: #000;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-light:disabled, .btn-outline-light.disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-dark {\n color: #212529;\n border-color: #212529;\n}\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus {\n box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show {\n color: #fff;\n background-color: #212529;\n border-color: #212529;\n}\n.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus {\n box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-outline-dark:disabled, .btn-outline-dark.disabled {\n color: #212529;\n background-color: transparent;\n}\n\n.btn-link {\n font-weight: 400;\n color: #0d6efd;\n text-decoration: underline;\n}\n.btn-link:hover {\n color: #0a58ca;\n}\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n.collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none;\n }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n z-index: 1000;\n display: none;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n.dropdown-menu[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: 0.125rem;\n}\n\n.dropdown-menu-start {\n --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-end {\n --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start;\n }\n .dropdown-menu-sm-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-sm-end {\n --bs-position: end;\n }\n .dropdown-menu-sm-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 768px) {\n .dropdown-menu-md-start {\n --bs-position: start;\n }\n .dropdown-menu-md-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-md-end {\n --bs-position: end;\n }\n .dropdown-menu-md-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start;\n }\n .dropdown-menu-lg-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-lg-end {\n --bs-position: end;\n }\n .dropdown-menu-lg-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start;\n }\n .dropdown-menu-xl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-xl-end {\n --bs-position: end;\n }\n .dropdown-menu-xl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start;\n }\n .dropdown-menu-xxl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n\n .dropdown-menu-xxl-end {\n --bs-position: end;\n }\n .dropdown-menu-xxl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n.dropend .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n.dropstart .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n display: none;\n}\n.dropstart .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n text-decoration: none;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n.dropdown-item:hover, .dropdown-item:focus {\n color: #1e2125;\n background-color: #e9ecef;\n}\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #0d6efd;\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #adb5bd;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1rem;\n color: #212529;\n}\n\n.dropdown-menu-dark {\n color: #dee2e6;\n background-color: #343a40;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item {\n color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.15);\n}\n.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {\n color: #fff;\n background-color: #0d6efd;\n}\n.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {\n color: #adb5bd;\n}\n.dropdown-menu-dark .dropdown-divider {\n border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item-text {\n color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-header {\n color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn ~ .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n color: #0d6efd;\n text-decoration: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: #0a58ca;\n}\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n.nav-tabs .nav-link {\n margin-bottom: -1px;\n background: none;\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n isolation: isolate;\n}\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n background: none;\n border: 0;\n border-radius: 0.25rem;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #0d6efd;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n}\n.navbar-brand {\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n text-decoration: none;\n white-space: nowrap;\n}\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n.navbar-nav .dropdown-menu {\n position: static;\n}\n\n.navbar-text {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n transition: box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none;\n }\n}\n.navbar-toggler:hover {\n text-decoration: none;\n}\n.navbar-toggler:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 0.25rem;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n .navbar-expand-sm .offcanvas-header {\n display: none;\n }\n .navbar-expand-sm .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-sm .offcanvas-top,\n.navbar-expand-sm .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-sm .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n .navbar-expand-md .offcanvas-header {\n display: none;\n }\n .navbar-expand-md .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-md .offcanvas-top,\n.navbar-expand-md .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-md .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n .navbar-expand-lg .offcanvas-header {\n display: none;\n }\n .navbar-expand-lg .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-lg .offcanvas-top,\n.navbar-expand-lg .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-lg .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xl .offcanvas-header {\n display: none;\n }\n .navbar-expand-xl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-xl .offcanvas-top,\n.navbar-expand-xl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-xl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xxl .offcanvas-header {\n display: none;\n }\n .navbar-expand-xxl .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n }\n .navbar-expand-xxl .offcanvas-top,\n.navbar-expand-xxl .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n .navbar-expand-xxl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n display: none;\n}\n.navbar-expand .offcanvas-header {\n display: none;\n}\n.navbar-expand .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important;\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n transition: none;\n transform: none;\n}\n.navbar-expand .offcanvas-top,\n.navbar-expand .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n}\n.navbar-expand .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.55);\n border-color: rgba(0, 0, 0, 0.1);\n}\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-text a,\n.navbar-light .navbar-text a:hover,\n.navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.55);\n border-color: rgba(255, 255, 255, 0.1);\n}\n.navbar-dark .navbar-toggler-icon {\n background-image: 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\");\n}\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-text a,\n.navbar-dark .navbar-text a:hover,\n.navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1rem 1rem;\n}\n\n.card-title {\n margin-bottom: 0.5rem;\n}\n\n.card-subtitle {\n margin-top: -0.25rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link + .card-link {\n margin-left: 1rem;\n}\n\n.card-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.5rem 1rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.5rem;\n margin-bottom: -0.5rem;\n margin-left: -0.5rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.5rem;\n margin-left: -0.5rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1rem;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-group > .card {\n margin-bottom: 0.75rem;\n}\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n.card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n.card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n.card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n.card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem 1.25rem;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n background-color: #fff;\n border: 0;\n border-radius: 0;\n overflow-anchor: none;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none;\n }\n}\n.accordion-button:not(.collapsed) {\n color: #0c63e4;\n background-color: #e7f1ff;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125);\n}\n.accordion-button:not(.collapsed)::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%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-.708z'/%3e%3c/svg%3e\");\n transform: rotate(-180deg);\n}\n.accordion-button::after {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: auto;\n content: \"\";\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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-.708z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-size: 1.25rem;\n transition: transform 0.2s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button::after {\n transition: none;\n }\n}\n.accordion-button:hover {\n z-index: 2;\n}\n.accordion-button:focus {\n z-index: 3;\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.accordion-item:first-of-type {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n.accordion-item:first-of-type .accordion-button {\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.accordion-item:not(:first-of-type) {\n border-top: 0;\n}\n.accordion-item:last-of-type {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n.accordion-item:last-of-type .accordion-button.collapsed {\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.accordion-item:last-of-type .accordion-collapse {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.accordion-body {\n padding: 1rem 1.25rem;\n}\n\n.accordion-flush .accordion-collapse {\n border-width: 0;\n}\n.accordion-flush .accordion-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n.accordion-flush .accordion-item:first-child {\n border-top: 0;\n}\n.accordion-flush .accordion-item:last-child {\n border-bottom: 0;\n}\n.accordion-flush .accordion-item .accordion-button {\n border-radius: 0;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0 0;\n margin-bottom: 1rem;\n list-style: none;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: 0.5rem;\n color: #6c757d;\n content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n color: #0d6efd;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #dee2e6;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none;\n }\n}\n.page-link:hover {\n z-index: 2;\n color: #0a58ca;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n.page-link:focus {\n z-index: 3;\n color: #0a58ca;\n background-color: #e9ecef;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.page-item:not(:first-child) .page-link {\n margin-left: -1px;\n}\n.page-item.active .page-link {\n z-index: 3;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.page-link {\n padding: 0.375rem 0.75rem;\n}\n\n.page-item:first-child .page-link {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n}\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n}\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.35em 0.65em;\n font-size: 0.75em;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.alert {\n position: relative;\n padding: 1rem 1rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n color: #084298;\n background-color: #cfe2ff;\n border-color: #b6d4fe;\n}\n.alert-primary .alert-link {\n color: #06357a;\n}\n\n.alert-secondary {\n color: #41464b;\n background-color: #e2e3e5;\n border-color: #d3d6d8;\n}\n.alert-secondary .alert-link {\n color: #34383c;\n}\n\n.alert-success {\n color: #0f5132;\n background-color: #d1e7dd;\n border-color: #badbcc;\n}\n.alert-success .alert-link {\n color: #0c4128;\n}\n\n.alert-info {\n color: #055160;\n background-color: #cff4fc;\n border-color: #b6effb;\n}\n.alert-info .alert-link {\n color: #04414d;\n}\n\n.alert-warning {\n color: #664d03;\n background-color: #fff3cd;\n border-color: #ffecb5;\n}\n.alert-warning .alert-link {\n color: #523e02;\n}\n\n.alert-danger {\n color: #842029;\n background-color: #f8d7da;\n border-color: #f5c2c7;\n}\n.alert-danger .alert-link {\n color: #6a1a21;\n}\n\n.alert-light {\n color: #636464;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n.alert-light .alert-link {\n color: #4f5050;\n}\n\n.alert-dark {\n color: #141619;\n background-color: #d3d3d4;\n border-color: #bcbebf;\n}\n.alert-dark .alert-link {\n color: #101214;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #0d6efd;\n transition: width 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: 1s linear infinite progress-bar-stripes;\n animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n -webkit-animation: none;\n animation: none;\n }\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: 0.25rem;\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n}\n.list-group-numbered > li::before {\n content: counters(section, \".\") \". \";\n counter-increment: section;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.5rem 1rem;\n color: #212529;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n margin-top: -1px;\n border-top-width: 1px;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n@media (min-width: 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl > .list-group-item:first-child {\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item:last-child {\n border-top-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: 1px;\n border-left-width: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: -1px;\n border-left-width: 1px;\n }\n}\n.list-group-flush {\n border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n border-width: 0 0 1px;\n}\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n color: #084298;\n background-color: #cfe2ff;\n}\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #084298;\n background-color: #bacbe6;\n}\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #084298;\n border-color: #084298;\n}\n\n.list-group-item-secondary {\n color: #41464b;\n background-color: #e2e3e5;\n}\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #41464b;\n background-color: #cbccce;\n}\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #41464b;\n border-color: #41464b;\n}\n\n.list-group-item-success {\n color: #0f5132;\n background-color: #d1e7dd;\n}\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #0f5132;\n background-color: #bcd0c7;\n}\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #0f5132;\n border-color: #0f5132;\n}\n\n.list-group-item-info {\n color: #055160;\n background-color: #cff4fc;\n}\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #055160;\n background-color: #badce3;\n}\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #055160;\n border-color: #055160;\n}\n\n.list-group-item-warning {\n color: #664d03;\n background-color: #fff3cd;\n}\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #664d03;\n background-color: #e6dbb9;\n}\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #664d03;\n border-color: #664d03;\n}\n\n.list-group-item-danger {\n color: #842029;\n background-color: #f8d7da;\n}\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #842029;\n background-color: #dfc2c4;\n}\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #842029;\n border-color: #842029;\n}\n\n.list-group-item-light {\n color: #636464;\n background-color: #fefefe;\n}\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #636464;\n background-color: #e5e5e5;\n}\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #636464;\n border-color: #636464;\n}\n\n.list-group-item-dark {\n color: #141619;\n background-color: #d3d3d4;\n}\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #141619;\n background-color: #bebebf;\n}\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #141619;\n border-color: #141619;\n}\n\n.btn-close {\n box-sizing: content-box;\n width: 1em;\n height: 1em;\n padding: 0.25em 0.25em;\n color: #000;\n background: transparent 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 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e\") center/1em auto no-repeat;\n border: 0;\n border-radius: 0.25rem;\n opacity: 0.5;\n}\n.btn-close:hover {\n color: #000;\n text-decoration: none;\n opacity: 0.75;\n}\n.btn-close:focus {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n opacity: 1;\n}\n.btn-close:disabled, .btn-close.disabled {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n opacity: 0.25;\n}\n\n.btn-close-white {\n filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n width: 350px;\n max-width: 100%;\n font-size: 0.875rem;\n pointer-events: auto;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n.toast.showing {\n opacity: 0;\n}\n.toast:not(.show) {\n display: none;\n}\n\n.toast-container {\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.5rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n.toast-header .btn-close {\n margin-right: -0.375rem;\n margin-left: 0.75rem;\n}\n\n.toast-body {\n padding: 0.75rem;\n word-wrap: break-word;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1055;\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n.modal.show .modal-dialog {\n transform: none;\n}\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n height: calc(100% - 1rem);\n}\n.modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n}\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.modal-header .btn-close {\n padding: 0.5rem 0.5rem;\n margin: -0.5rem -0.5rem -0.5rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center;\n justify-content: flex-end;\n padding: 0.75rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: calc(0.3rem - 1px);\n border-bottom-left-radius: calc(0.3rem - 1px);\n}\n.modal-footer > * {\n margin: 0.25rem;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n\n .modal-dialog-scrollable {\n height: calc(100% - 3.5rem);\n }\n\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n\n .modal-sm {\n max-width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg,\n.modal-xl {\n max-width: 800px;\n }\n}\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n}\n.modal-fullscreen .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n}\n.modal-fullscreen .modal-header {\n border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n overflow-y: auto;\n}\n.modal-fullscreen .modal-footer {\n border-radius: 0;\n}\n\n@media (max-width: 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-sm-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-sm-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-md-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-md-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-lg-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-lg-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-xl-down .modal-footer {\n border-radius: 0;\n }\n}\n@media (max-width: 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xxl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-header {\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto;\n }\n .modal-fullscreen-xxl-down .modal-footer {\n border-radius: 0;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1080;\n display: block;\n margin: 0;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n.tooltip.show {\n opacity: 0.9;\n}\n.tooltip .tooltip-arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n.tooltip .tooltip-arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n bottom: 0;\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n top: -1px;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n right: -1px;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] {\n padding: 0.4rem 0;\n}\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n top: 0;\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n bottom: -1px;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] {\n padding: 0 0.4rem;\n}\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n left: -1px;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0 /* rtl:ignore */;\n z-index: 1070;\n display: block;\n max-width: 276px;\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n.popover .popover-arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n bottom: calc(-0.5rem - 1px);\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n left: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n top: calc(-0.5rem - 1px);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f0f0f0;\n}\n\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n right: calc(-0.5rem - 1px);\n width: 0.5rem;\n height: 1rem;\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f0f0f0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 1rem 1rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n/* rtl:end:ignore */\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n.carousel-control-next {\n transition: none;\n }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n 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 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n 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-.708z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n margin-right: 15%;\n margin-bottom: 1rem;\n margin-left: 15%;\n list-style: none;\n}\n.carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n padding: 0;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none;\n }\n}\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 1.25rem;\n left: 15%;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n color: #fff;\n text-align: center;\n}\n\n.carousel-dark .carousel-control-prev-icon,\n.carousel-dark .carousel-control-next-icon {\n filter: invert(1) grayscale(100);\n}\n.carousel-dark .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n.carousel-dark .carousel-caption {\n color: #000;\n}\n\n@-webkit-keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n -webkit-animation: 0.75s linear infinite spinner-border;\n animation: 0.75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: -0.125em;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n -webkit-animation: 0.75s linear infinite spinner-grow;\n animation: 0.75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n.spinner-grow {\n -webkit-animation-duration: 1.5s;\n animation-duration: 1.5s;\n }\n}\n.offcanvas {\n position: fixed;\n bottom: 0;\n z-index: 1045;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n visibility: hidden;\n background-color: #fff;\n background-clip: padding-box;\n outline: 0;\n transition: transform 0.3s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none;\n }\n}\n\n.offcanvas-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.offcanvas-backdrop.fade {\n opacity: 0;\n}\n.offcanvas-backdrop.show {\n opacity: 0.5;\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1rem;\n}\n.offcanvas-header .btn-close {\n padding: 0.5rem 0.5rem;\n margin-top: -0.5rem;\n margin-right: -0.5rem;\n margin-bottom: -0.5rem;\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: 1rem 1rem;\n overflow-y: auto;\n}\n\n.offcanvas-start {\n top: 0;\n left: 0;\n width: 400px;\n border-right: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(-100%);\n}\n\n.offcanvas-end {\n top: 0;\n right: 0;\n width: 400px;\n border-left: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateX(100%);\n}\n\n.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n right: 0;\n left: 0;\n height: 30vh;\n max-height: 100%;\n border-top: 1px solid rgba(0, 0, 0, 0.2);\n transform: translateY(100%);\n}\n\n.offcanvas.show {\n transform: none;\n}\n\n.placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentColor;\n opacity: 0.5;\n}\n.placeholder.btn::before {\n display: inline-block;\n content: \"\";\n}\n\n.placeholder-xs {\n min-height: 0.6em;\n}\n\n.placeholder-sm {\n min-height: 0.8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n -webkit-animation: placeholder-glow 2s ease-in-out infinite;\n animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@-webkit-keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n.placeholder-wave {\n -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n -webkit-mask-size: 200% 100%;\n mask-size: 200% 100%;\n -webkit-animation: placeholder-wave 2s linear infinite;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@-webkit-keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n\n@keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.link-primary {\n color: #0d6efd;\n}\n.link-primary:hover, .link-primary:focus {\n color: #0a58ca;\n}\n\n.link-secondary {\n color: #6c757d;\n}\n.link-secondary:hover, .link-secondary:focus {\n color: #565e64;\n}\n\n.link-success {\n color: #198754;\n}\n.link-success:hover, .link-success:focus {\n color: #146c43;\n}\n\n.link-info {\n color: #0dcaf0;\n}\n.link-info:hover, .link-info:focus {\n color: #3dd5f3;\n}\n\n.link-warning {\n color: #ffc107;\n}\n.link-warning:hover, .link-warning:focus {\n color: #ffcd39;\n}\n\n.link-danger {\n color: #dc3545;\n}\n.link-danger:hover, .link-danger:focus {\n color: #b02a37;\n}\n\n.link-light {\n color: #f8f9fa;\n}\n.link-light:hover, .link-light:focus {\n color: #f9fafb;\n}\n\n.link-dark {\n color: #212529;\n}\n.link-dark:hover, .link-dark:focus {\n color: #1a1e21;\n}\n\n.ratio {\n position: relative;\n width: 100%;\n}\n.ratio::before {\n display: block;\n padding-top: var(--bs-aspect-ratio);\n content: \"\";\n}\n.ratio > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n@media (min-width: 576px) {\n .sticky-sm-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 768px) {\n .sticky-md-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 992px) {\n .sticky-lg-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1200px) {\n .sticky-xl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1400px) {\n .sticky-xxl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentColor;\n opacity: 0.25;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.float-start {\n float: left !important;\n}\n\n.float-end {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n.opacity-0 {\n opacity: 0 !important;\n}\n\n.opacity-25 {\n opacity: 0.25 !important;\n}\n\n.opacity-50 {\n opacity: 0.5 !important;\n}\n\n.opacity-75 {\n opacity: 0.75 !important;\n}\n\n.opacity-100 {\n opacity: 1 !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.overflow-visible {\n overflow: visible !important;\n}\n\n.overflow-scroll {\n overflow: scroll !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.top-0 {\n top: 0 !important;\n}\n\n.top-50 {\n top: 50% !important;\n}\n\n.top-100 {\n top: 100% !important;\n}\n\n.bottom-0 {\n bottom: 0 !important;\n}\n\n.bottom-50 {\n bottom: 50% !important;\n}\n\n.bottom-100 {\n bottom: 100% !important;\n}\n\n.start-0 {\n left: 0 !important;\n}\n\n.start-50 {\n left: 50% !important;\n}\n\n.start-100 {\n left: 100% !important;\n}\n\n.end-0 {\n right: 0 !important;\n}\n\n.end-50 {\n right: 50% !important;\n}\n\n.end-100 {\n right: 100% !important;\n}\n\n.translate-middle {\n transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n transform: translateY(-50%) !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-end {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-end-0 {\n border-right: 0 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-start {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-start-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #0d6efd !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #198754 !important;\n}\n\n.border-info {\n border-color: #0dcaf0 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #212529 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.border-1 {\n border-width: 1px !important;\n}\n\n.border-2 {\n border-width: 2px !important;\n}\n\n.border-3 {\n border-width: 3px !important;\n}\n\n.border-4 {\n border-width: 4px !important;\n}\n\n.border-5 {\n border-width: 5px !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.gap-0 {\n gap: 0 !important;\n}\n\n.gap-1 {\n gap: 0.25rem !important;\n}\n\n.gap-2 {\n gap: 0.5rem !important;\n}\n\n.gap-3 {\n gap: 1rem !important;\n}\n\n.gap-4 {\n gap: 1.5rem !important;\n}\n\n.gap-5 {\n gap: 3rem !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n font-size: 1.25rem !important;\n}\n\n.fs-6 {\n font-size: 1rem !important;\n}\n\n.fst-italic {\n font-style: italic !important;\n}\n\n.fst-normal {\n font-style: normal !important;\n}\n\n.fw-light {\n font-weight: 300 !important;\n}\n\n.fw-lighter {\n font-weight: lighter !important;\n}\n\n.fw-normal {\n font-weight: 400 !important;\n}\n\n.fw-bold {\n font-weight: 700 !important;\n}\n\n.fw-bolder {\n font-weight: bolder !important;\n}\n\n.lh-1 {\n line-height: 1 !important;\n}\n\n.lh-sm {\n line-height: 1.25 !important;\n}\n\n.lh-base {\n line-height: 1.5 !important;\n}\n\n.lh-lg {\n line-height: 2 !important;\n}\n\n.text-start {\n text-align: left !important;\n}\n\n.text-end {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-decoration-underline {\n text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n text-decoration: line-through !important;\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n --bs-text-opacity: 1;\n color: #6c757d !important;\n}\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important;\n}\n\n.text-opacity-25 {\n --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n --bs-text-opacity: 1;\n}\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: transparent !important;\n}\n\n.bg-opacity-10 {\n --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1;\n}\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n -webkit-user-select: all !important;\n -moz-user-select: all !important;\n user-select: all !important;\n}\n\n.user-select-auto {\n -webkit-user-select: auto !important;\n -moz-user-select: auto !important;\n user-select: auto !important;\n}\n\n.user-select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n user-select: none !important;\n}\n\n.pe-none {\n pointer-events: none !important;\n}\n\n.pe-auto {\n pointer-events: auto !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.rounded-1 {\n border-radius: 0.2rem !important;\n}\n\n.rounded-2 {\n border-radius: 0.25rem !important;\n}\n\n.rounded-3 {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-end {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-start {\n border-bottom-left-radius: 0.25rem !important;\n border-top-left-radius: 0.25rem !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-start {\n float: left !important;\n }\n\n .float-sm-end {\n float: right !important;\n }\n\n .float-sm-none {\n float: none !important;\n }\n\n .d-sm-inline {\n display: inline !important;\n }\n\n .d-sm-inline-block {\n display: inline-block !important;\n }\n\n .d-sm-block {\n display: block !important;\n }\n\n .d-sm-grid {\n display: grid !important;\n }\n\n .d-sm-table {\n display: table !important;\n }\n\n .d-sm-table-row {\n display: table-row !important;\n }\n\n .d-sm-table-cell {\n display: table-cell !important;\n }\n\n .d-sm-flex {\n display: flex !important;\n }\n\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n\n .d-sm-none {\n display: none !important;\n }\n\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-sm-row {\n flex-direction: row !important;\n }\n\n .flex-sm-column {\n flex-direction: column !important;\n }\n\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-sm-0 {\n gap: 0 !important;\n }\n\n .gap-sm-1 {\n gap: 0.25rem !important;\n }\n\n .gap-sm-2 {\n gap: 0.5rem !important;\n }\n\n .gap-sm-3 {\n gap: 1rem !important;\n }\n\n .gap-sm-4 {\n gap: 1.5rem !important;\n }\n\n .gap-sm-5 {\n gap: 3rem !important;\n }\n\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-sm-center {\n justify-content: center !important;\n }\n\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n\n .align-items-sm-center {\n align-items: center !important;\n }\n\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n\n .align-content-sm-center {\n align-content: center !important;\n }\n\n .align-content-sm-between {\n align-content: space-between !important;\n }\n\n .align-content-sm-around {\n align-content: space-around !important;\n }\n\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n\n .align-self-sm-auto {\n align-self: auto !important;\n }\n\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n\n .align-self-sm-center {\n align-self: center !important;\n }\n\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n\n .order-sm-first {\n order: -1 !important;\n }\n\n .order-sm-0 {\n order: 0 !important;\n }\n\n .order-sm-1 {\n order: 1 !important;\n }\n\n .order-sm-2 {\n order: 2 !important;\n }\n\n .order-sm-3 {\n order: 3 !important;\n }\n\n .order-sm-4 {\n order: 4 !important;\n }\n\n .order-sm-5 {\n order: 5 !important;\n }\n\n .order-sm-last {\n order: 6 !important;\n }\n\n .m-sm-0 {\n margin: 0 !important;\n }\n\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n\n .m-sm-3 {\n margin: 1rem !important;\n }\n\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n\n .m-sm-5 {\n margin: 3rem !important;\n }\n\n .m-sm-auto {\n margin: auto !important;\n }\n\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n\n .mt-sm-auto {\n margin-top: auto !important;\n }\n\n .me-sm-0 {\n margin-right: 0 !important;\n }\n\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n\n .me-sm-auto {\n margin-right: auto !important;\n }\n\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n\n .ms-sm-auto {\n margin-left: auto !important;\n }\n\n .p-sm-0 {\n padding: 0 !important;\n }\n\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n\n .p-sm-3 {\n padding: 1rem !important;\n }\n\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n\n .p-sm-5 {\n padding: 3rem !important;\n }\n\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n\n .text-sm-start {\n text-align: left !important;\n }\n\n .text-sm-end {\n text-align: right !important;\n }\n\n .text-sm-center {\n text-align: center !important;\n }\n}\n@media (min-width: 768px) {\n .float-md-start {\n float: left !important;\n }\n\n .float-md-end {\n float: right !important;\n }\n\n .float-md-none {\n float: none !important;\n }\n\n .d-md-inline {\n display: inline !important;\n }\n\n .d-md-inline-block {\n display: inline-block !important;\n }\n\n .d-md-block {\n display: block !important;\n }\n\n .d-md-grid {\n display: grid !important;\n }\n\n .d-md-table {\n display: table !important;\n }\n\n .d-md-table-row {\n display: table-row !important;\n }\n\n .d-md-table-cell {\n display: table-cell !important;\n }\n\n .d-md-flex {\n display: flex !important;\n }\n\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n\n .d-md-none {\n display: none !important;\n }\n\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-md-row {\n flex-direction: row !important;\n }\n\n .flex-md-column {\n flex-direction: column !important;\n }\n\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-md-0 {\n gap: 0 !important;\n }\n\n .gap-md-1 {\n gap: 0.25rem !important;\n }\n\n .gap-md-2 {\n gap: 0.5rem !important;\n }\n\n .gap-md-3 {\n gap: 1rem !important;\n }\n\n .gap-md-4 {\n gap: 1.5rem !important;\n }\n\n .gap-md-5 {\n gap: 3rem !important;\n }\n\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-md-center {\n justify-content: center !important;\n }\n\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-md-start {\n align-items: flex-start !important;\n }\n\n .align-items-md-end {\n align-items: flex-end !important;\n }\n\n .align-items-md-center {\n align-items: center !important;\n }\n\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n\n .align-content-md-start {\n align-content: flex-start !important;\n }\n\n .align-content-md-end {\n align-content: flex-end !important;\n }\n\n .align-content-md-center {\n align-content: center !important;\n }\n\n .align-content-md-between {\n align-content: space-between !important;\n }\n\n .align-content-md-around {\n align-content: space-around !important;\n }\n\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n\n .align-self-md-auto {\n align-self: auto !important;\n }\n\n .align-self-md-start {\n align-self: flex-start !important;\n }\n\n .align-self-md-end {\n align-self: flex-end !important;\n }\n\n .align-self-md-center {\n align-self: center !important;\n }\n\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n\n .order-md-first {\n order: -1 !important;\n }\n\n .order-md-0 {\n order: 0 !important;\n }\n\n .order-md-1 {\n order: 1 !important;\n }\n\n .order-md-2 {\n order: 2 !important;\n }\n\n .order-md-3 {\n order: 3 !important;\n }\n\n .order-md-4 {\n order: 4 !important;\n }\n\n .order-md-5 {\n order: 5 !important;\n }\n\n .order-md-last {\n order: 6 !important;\n }\n\n .m-md-0 {\n margin: 0 !important;\n }\n\n .m-md-1 {\n margin: 0.25rem !important;\n }\n\n .m-md-2 {\n margin: 0.5rem !important;\n }\n\n .m-md-3 {\n margin: 1rem !important;\n }\n\n .m-md-4 {\n margin: 1.5rem !important;\n }\n\n .m-md-5 {\n margin: 3rem !important;\n }\n\n .m-md-auto {\n margin: auto !important;\n }\n\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-md-0 {\n margin-top: 0 !important;\n }\n\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n\n .mt-md-auto {\n margin-top: auto !important;\n }\n\n .me-md-0 {\n margin-right: 0 !important;\n }\n\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-md-3 {\n margin-right: 1rem !important;\n }\n\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-md-5 {\n margin-right: 3rem !important;\n }\n\n .me-md-auto {\n margin-right: auto !important;\n }\n\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n\n .ms-md-0 {\n margin-left: 0 !important;\n }\n\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n\n .ms-md-auto {\n margin-left: auto !important;\n }\n\n .p-md-0 {\n padding: 0 !important;\n }\n\n .p-md-1 {\n padding: 0.25rem !important;\n }\n\n .p-md-2 {\n padding: 0.5rem !important;\n }\n\n .p-md-3 {\n padding: 1rem !important;\n }\n\n .p-md-4 {\n padding: 1.5rem !important;\n }\n\n .p-md-5 {\n padding: 3rem !important;\n }\n\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-md-0 {\n padding-top: 0 !important;\n }\n\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n\n .pe-md-0 {\n padding-right: 0 !important;\n }\n\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-md-0 {\n padding-left: 0 !important;\n }\n\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n\n .text-md-start {\n text-align: left !important;\n }\n\n .text-md-end {\n text-align: right !important;\n }\n\n .text-md-center {\n text-align: center !important;\n }\n}\n@media (min-width: 992px) {\n .float-lg-start {\n float: left !important;\n }\n\n .float-lg-end {\n float: right !important;\n }\n\n .float-lg-none {\n float: none !important;\n }\n\n .d-lg-inline {\n display: inline !important;\n }\n\n .d-lg-inline-block {\n display: inline-block !important;\n }\n\n .d-lg-block {\n display: block !important;\n }\n\n .d-lg-grid {\n display: grid !important;\n }\n\n .d-lg-table {\n display: table !important;\n }\n\n .d-lg-table-row {\n display: table-row !important;\n }\n\n .d-lg-table-cell {\n display: table-cell !important;\n }\n\n .d-lg-flex {\n display: flex !important;\n }\n\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n\n .d-lg-none {\n display: none !important;\n }\n\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-lg-row {\n flex-direction: row !important;\n }\n\n .flex-lg-column {\n flex-direction: column !important;\n }\n\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-lg-0 {\n gap: 0 !important;\n }\n\n .gap-lg-1 {\n gap: 0.25rem !important;\n }\n\n .gap-lg-2 {\n gap: 0.5rem !important;\n }\n\n .gap-lg-3 {\n gap: 1rem !important;\n }\n\n .gap-lg-4 {\n gap: 1.5rem !important;\n }\n\n .gap-lg-5 {\n gap: 3rem !important;\n }\n\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-lg-center {\n justify-content: center !important;\n }\n\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n\n .align-items-lg-center {\n align-items: center !important;\n }\n\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n\n .align-content-lg-center {\n align-content: center !important;\n }\n\n .align-content-lg-between {\n align-content: space-between !important;\n }\n\n .align-content-lg-around {\n align-content: space-around !important;\n }\n\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n\n .align-self-lg-auto {\n align-self: auto !important;\n }\n\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n\n .align-self-lg-center {\n align-self: center !important;\n }\n\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n\n .order-lg-first {\n order: -1 !important;\n }\n\n .order-lg-0 {\n order: 0 !important;\n }\n\n .order-lg-1 {\n order: 1 !important;\n }\n\n .order-lg-2 {\n order: 2 !important;\n }\n\n .order-lg-3 {\n order: 3 !important;\n }\n\n .order-lg-4 {\n order: 4 !important;\n }\n\n .order-lg-5 {\n order: 5 !important;\n }\n\n .order-lg-last {\n order: 6 !important;\n }\n\n .m-lg-0 {\n margin: 0 !important;\n }\n\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n\n .m-lg-3 {\n margin: 1rem !important;\n }\n\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n\n .m-lg-5 {\n margin: 3rem !important;\n }\n\n .m-lg-auto {\n margin: auto !important;\n }\n\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n\n .mt-lg-auto {\n margin-top: auto !important;\n }\n\n .me-lg-0 {\n margin-right: 0 !important;\n }\n\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n\n .me-lg-auto {\n margin-right: auto !important;\n }\n\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n\n .ms-lg-auto {\n margin-left: auto !important;\n }\n\n .p-lg-0 {\n padding: 0 !important;\n }\n\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n\n .p-lg-3 {\n padding: 1rem !important;\n }\n\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n\n .p-lg-5 {\n padding: 3rem !important;\n }\n\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n\n .text-lg-start {\n text-align: left !important;\n }\n\n .text-lg-end {\n text-align: right !important;\n }\n\n .text-lg-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .float-xl-start {\n float: left !important;\n }\n\n .float-xl-end {\n float: right !important;\n }\n\n .float-xl-none {\n float: none !important;\n }\n\n .d-xl-inline {\n display: inline !important;\n }\n\n .d-xl-inline-block {\n display: inline-block !important;\n }\n\n .d-xl-block {\n display: block !important;\n }\n\n .d-xl-grid {\n display: grid !important;\n }\n\n .d-xl-table {\n display: table !important;\n }\n\n .d-xl-table-row {\n display: table-row !important;\n }\n\n .d-xl-table-cell {\n display: table-cell !important;\n }\n\n .d-xl-flex {\n display: flex !important;\n }\n\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xl-none {\n display: none !important;\n }\n\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-xl-row {\n flex-direction: row !important;\n }\n\n .flex-xl-column {\n flex-direction: column !important;\n }\n\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-xl-0 {\n gap: 0 !important;\n }\n\n .gap-xl-1 {\n gap: 0.25rem !important;\n }\n\n .gap-xl-2 {\n gap: 0.5rem !important;\n }\n\n .gap-xl-3 {\n gap: 1rem !important;\n }\n\n .gap-xl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xl-5 {\n gap: 3rem !important;\n }\n\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xl-center {\n justify-content: center !important;\n }\n\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xl-center {\n align-items: center !important;\n }\n\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xl-center {\n align-content: center !important;\n }\n\n .align-content-xl-between {\n align-content: space-between !important;\n }\n\n .align-content-xl-around {\n align-content: space-around !important;\n }\n\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xl-auto {\n align-self: auto !important;\n }\n\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xl-center {\n align-self: center !important;\n }\n\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n\n .order-xl-first {\n order: -1 !important;\n }\n\n .order-xl-0 {\n order: 0 !important;\n }\n\n .order-xl-1 {\n order: 1 !important;\n }\n\n .order-xl-2 {\n order: 2 !important;\n }\n\n .order-xl-3 {\n order: 3 !important;\n }\n\n .order-xl-4 {\n order: 4 !important;\n }\n\n .order-xl-5 {\n order: 5 !important;\n }\n\n .order-xl-last {\n order: 6 !important;\n }\n\n .m-xl-0 {\n margin: 0 !important;\n }\n\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n\n .m-xl-3 {\n margin: 1rem !important;\n }\n\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xl-5 {\n margin: 3rem !important;\n }\n\n .m-xl-auto {\n margin: auto !important;\n }\n\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xl-auto {\n margin-top: auto !important;\n }\n\n .me-xl-0 {\n margin-right: 0 !important;\n }\n\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xl-auto {\n margin-right: auto !important;\n }\n\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xl-auto {\n margin-left: auto !important;\n }\n\n .p-xl-0 {\n padding: 0 !important;\n }\n\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n\n .p-xl-3 {\n padding: 1rem !important;\n }\n\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xl-5 {\n padding: 3rem !important;\n }\n\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n\n .text-xl-start {\n text-align: left !important;\n }\n\n .text-xl-end {\n text-align: right !important;\n }\n\n .text-xl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1400px) {\n .float-xxl-start {\n float: left !important;\n }\n\n .float-xxl-end {\n float: right !important;\n }\n\n .float-xxl-none {\n float: none !important;\n }\n\n .d-xxl-inline {\n display: inline !important;\n }\n\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n\n .d-xxl-block {\n display: block !important;\n }\n\n .d-xxl-grid {\n display: grid !important;\n }\n\n .d-xxl-table {\n display: table !important;\n }\n\n .d-xxl-table-row {\n display: table-row !important;\n }\n\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n\n .d-xxl-flex {\n display: flex !important;\n }\n\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n\n .d-xxl-none {\n display: none !important;\n }\n\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n\n .flex-xxl-row {\n flex-direction: row !important;\n }\n\n .flex-xxl-column {\n flex-direction: column !important;\n }\n\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n\n .gap-xxl-0 {\n gap: 0 !important;\n }\n\n .gap-xxl-1 {\n gap: 0.25rem !important;\n }\n\n .gap-xxl-2 {\n gap: 0.5rem !important;\n }\n\n .gap-xxl-3 {\n gap: 1rem !important;\n }\n\n .gap-xxl-4 {\n gap: 1.5rem !important;\n }\n\n .gap-xxl-5 {\n gap: 3rem !important;\n }\n\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n\n .align-items-xxl-center {\n align-items: center !important;\n }\n\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n\n .align-content-xxl-center {\n align-content: center !important;\n }\n\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n\n .align-self-xxl-center {\n align-self: center !important;\n }\n\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n\n .order-xxl-first {\n order: -1 !important;\n }\n\n .order-xxl-0 {\n order: 0 !important;\n }\n\n .order-xxl-1 {\n order: 1 !important;\n }\n\n .order-xxl-2 {\n order: 2 !important;\n }\n\n .order-xxl-3 {\n order: 3 !important;\n }\n\n .order-xxl-4 {\n order: 4 !important;\n }\n\n .order-xxl-5 {\n order: 5 !important;\n }\n\n .order-xxl-last {\n order: 6 !important;\n }\n\n .m-xxl-0 {\n margin: 0 !important;\n }\n\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n\n .m-xxl-3 {\n margin: 1rem !important;\n }\n\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n\n .m-xxl-5 {\n margin: 3rem !important;\n }\n\n .m-xxl-auto {\n margin: auto !important;\n }\n\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n\n .me-xxl-auto {\n margin-right: auto !important;\n }\n\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n\n .p-xxl-0 {\n padding: 0 !important;\n }\n\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n\n .p-xxl-3 {\n padding: 1rem !important;\n }\n\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n\n .p-xxl-5 {\n padding: 3rem !important;\n }\n\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n\n .text-xxl-start {\n text-align: left !important;\n }\n\n .text-xxl-end {\n text-align: right !important;\n }\n\n .text-xxl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .fs-1 {\n font-size: 2.5rem !important;\n }\n\n .fs-2 {\n font-size: 2rem !important;\n }\n\n .fs-3 {\n font-size: 1.75rem !important;\n }\n\n .fs-4 {\n font-size: 1.5rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n\n .d-print-inline-block {\n display: inline-block !important;\n }\n\n .d-print-block {\n display: block !important;\n }\n\n .d-print-grid {\n display: grid !important;\n }\n\n .d-print-table {\n display: table !important;\n }\n\n .d-print-table-row {\n display: table-row !important;\n }\n\n .d-print-table-cell {\n display: table-cell !important;\n }\n\n .d-print-flex {\n display: flex !important;\n }\n\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n $return: ();\n @each $value in $radius {\n @if type-of($value) == number {\n $return: append($return, max($value, 0));\n } @else {\n $return: append($return, $value);\n }\n }\n @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: valid-radius($radius);\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-left-radius: valid-radius($radius);\n }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-top-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-right-radius: valid-radius($radius);\n }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-bottom-left-radius: valid-radius($radius);\n }\n}\n// scss-docs-end border-radius-mixins\n","//\n// Headings\n//\n.h1 {\n @extend h1;\n}\n\n.h2 {\n @extend h2;\n}\n\n.h3 {\n @extend h3;\n}\n\n.h4 {\n @extend h4;\n}\n\n.h5 {\n @extend h5;\n}\n\n.h6 {\n @extend h6;\n}\n\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n@each $display, $font-size in $display-font-sizes {\n .display-#{$display} {\n @include font-size($font-size);\n font-weight: $display-font-weight;\n line-height: $display-line-height;\n }\n}\n\n//\n// Emphasis\n//\n.small {\n @extend small;\n}\n\n.mark {\n @extend mark;\n}\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled();\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size($initialism-font-size);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-font-size);\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n.blockquote-footer {\n margin-top: -$blockquote-margin-y;\n margin-bottom: $blockquote-margin-y;\n @include font-size($blockquote-footer-font-size);\n color: $blockquote-footer-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer * .5;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n width: 100%;\n padding-right: var(--#{$variable-prefix}gutter-x, #{$gutter});\n padding-left: var(--#{$variable-prefix}gutter-x, #{$gutter});\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$variable-prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$variable-prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$variable-prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$variable-prefix}gutter-x: #{$gutter};\n --#{$variable-prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$variable-prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$variable-prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$variable-prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$variable-prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$variable-prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n --#{$variable-prefix}table-bg: #{$table-bg};\n --#{$variable-prefix}table-accent-bg: #{$table-accent-bg};\n --#{$variable-prefix}table-striped-color: #{$table-striped-color};\n --#{$variable-prefix}table-striped-bg: #{$table-striped-bg};\n --#{$variable-prefix}table-active-color: #{$table-active-color};\n --#{$variable-prefix}table-active-bg: #{$table-active-bg};\n --#{$variable-prefix}table-hover-color: #{$table-hover-color};\n --#{$variable-prefix}table-hover-bg: #{$table-hover-bg};\n\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n vertical-align: $table-cell-vertical-align;\n border-color: $table-border-color;\n\n // Target th & td\n // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.\n // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\n // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y $table-cell-padding-x;\n background-color: var(--#{$variable-prefix}table-bg);\n border-bottom-width: $table-border-width;\n box-shadow: inset 0 0 0 9999px var(--#{$variable-prefix}table-accent-bg);\n }\n\n > tbody {\n vertical-align: inherit;\n }\n\n > thead {\n vertical-align: bottom;\n }\n\n // Highlight border color between thead, tbody and tfoot.\n > :not(:first-child) {\n border-top: (2 * $table-border-width) solid $table-group-separator-color;\n }\n}\n\n\n//\n// Change placement of captions with a class\n//\n\n.caption-top {\n caption-side: top;\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n//\n// When borders are added on all sides of the cells, the corners can render odd when\n// these borders do not have the same color or if they are semi-transparent.\n// Therefor we add top and border bottoms to the `tr`s and left and right borders\n// to the `td`s or `th`s\n\n.table-bordered {\n > :not(caption) > * {\n border-width: $table-border-width 0;\n\n // stylelint-disable-next-line selector-max-universal\n > * {\n border-width: 0 $table-border-width;\n }\n }\n}\n\n.table-borderless {\n // stylelint-disable-next-line selector-max-universal\n > :not(caption) > * > * {\n border-bottom-width: 0;\n }\n\n > :not(:first-child) {\n border-top-width: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-striped-bg);\n color: var(--#{$variable-prefix}table-striped-color);\n }\n}\n\n// Active table\n//\n// The `.table-active` class can be added to highlight rows or cells\n\n.table-active {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-active-bg);\n color: var(--#{$variable-prefix}table-active-color);\n}\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover > * {\n --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-hover-bg);\n color: var(--#{$variable-prefix}table-hover-color);\n }\n}\n\n\n// Table variants\n//\n// Table variants set the table cell backgrounds, border colors\n// and the colors of the striped, hovered & active tables\n\n@each $color, $value in $table-variants {\n @include table-variant($color, $value);\n}\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @include media-breakpoint-down($breakpoint) {\n .table-responsive#{$infix} {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n }\n}\n","// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n .table-#{$state} {\n $color: color-contrast(opaque($body-bg, $background));\n $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n\n --#{$variable-prefix}table-bg: #{$background};\n --#{$variable-prefix}table-striped-bg: #{$striped-bg};\n --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)};\n --#{$variable-prefix}table-active-bg: #{$active-bg};\n --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)};\n --#{$variable-prefix}table-hover-bg: #{$hover-bg};\n --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)};\n\n color: $color;\n border-color: mix($color, $background, percentage($table-border-factor));\n }\n}\n// scss-docs-end table-variant\n","//\n// Labels\n//\n\n.form-label {\n margin-bottom: $form-label-margin-bottom;\n @include font-size($form-label-font-size);\n font-style: $form-label-font-style;\n font-weight: $form-label-font-weight;\n color: $form-label-color;\n}\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: add($input-padding-y, $input-border-width);\n padding-bottom: add($input-padding-y, $input-border-width);\n margin-bottom: 0; // Override the `<legend>` default\n @include font-size(inherit); // Override the `<legend>` default\n font-style: $form-label-font-style;\n font-weight: $form-label-font-weight;\n line-height: $input-line-height;\n color: $form-label-color;\n}\n\n.col-form-label-lg {\n padding-top: add($input-padding-y-lg, $input-border-width);\n padding-bottom: add($input-padding-y-lg, $input-border-width);\n @include font-size($input-font-size-lg);\n}\n\n.col-form-label-sm {\n padding-top: add($input-padding-y-sm, $input-border-width);\n padding-bottom: add($input-padding-y-sm, $input-border-width);\n @include font-size($input-font-size-sm);\n}\n","//\n// Form text\n//\n\n.form-text {\n margin-top: $form-text-margin-top;\n @include font-size($form-text-font-size);\n font-style: $form-text-font-style;\n font-weight: $form-text-font-weight;\n color: $form-text-color;\n}\n","//\n// General form controls (plus a few specific high-level interventions)\n//\n\n.form-control {\n display: block;\n width: 100%;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n appearance: none; // Fix appearance for date inputs in Safari\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n &[type=\"file\"] {\n overflow: hidden; // prevent pseudo element button overlap\n\n &:not(:disabled):not([readonly]) {\n cursor: pointer;\n }\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($input-box-shadow, $input-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $input-focus-box-shadow;\n }\n }\n\n // Add some height to date inputs on iOS\n // https://github.com/twbs/bootstrap/issues/23307\n // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved\n &::-webkit-date-and-time-value {\n // Multiply line-height by 1em if it has no unit\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n }\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n border-color: $input-disabled-border-color;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n\n // File input buttons theming\n &::file-selector-button {\n padding: $input-padding-y $input-padding-x;\n margin: (-$input-padding-y) (-$input-padding-x);\n margin-inline-end: $input-padding-x;\n color: $form-file-button-color;\n @include gradient-bg($form-file-button-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: $input-border-width;\n border-radius: 0; // stylelint-disable-line property-disallowed-list\n @include transition($btn-transition);\n }\n\n &:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: $form-file-button-hover-bg;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y $input-padding-x;\n margin: (-$input-padding-y) (-$input-padding-x);\n margin-inline-end: $input-padding-x;\n color: $form-file-button-color;\n @include gradient-bg($form-file-button-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: $input-border-width;\n border-radius: 0; // stylelint-disable-line property-disallowed-list\n @include transition($btn-transition);\n }\n\n &:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: $form-file-button-hover-bg;\n }\n}\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: $input-padding-y 0;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-line-height;\n color: $input-plaintext-color;\n background-color: transparent;\n border: solid transparent;\n border-width: $input-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n min-height: $input-height-sm;\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n @include border-radius($input-border-radius-sm);\n\n &::file-selector-button {\n padding: $input-padding-y-sm $input-padding-x-sm;\n margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\n margin-inline-end: $input-padding-x-sm;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y-sm $input-padding-x-sm;\n margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\n margin-inline-end: $input-padding-x-sm;\n }\n}\n\n.form-control-lg {\n min-height: $input-height-lg;\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n @include border-radius($input-border-radius-lg);\n\n &::file-selector-button {\n padding: $input-padding-y-lg $input-padding-x-lg;\n margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\n margin-inline-end: $input-padding-x-lg;\n }\n\n &::-webkit-file-upload-button {\n padding: $input-padding-y-lg $input-padding-x-lg;\n margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\n margin-inline-end: $input-padding-x-lg;\n }\n}\n\n// Make sure textareas don't shrink too much when resized\n// https://github.com/twbs/bootstrap/pull/29124\n// stylelint-disable selector-no-qualifying-type\ntextarea {\n &.form-control {\n min-height: $input-height;\n }\n\n &.form-control-sm {\n min-height: $input-height-sm;\n }\n\n &.form-control-lg {\n min-height: $input-height-lg;\n }\n}\n// stylelint-enable selector-no-qualifying-type\n\n.form-control-color {\n width: $form-color-width;\n height: auto; // Override fixed browser height\n padding: $input-padding-y;\n\n &:not(:disabled):not([readonly]) {\n cursor: pointer;\n }\n\n &::-moz-color-swatch {\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n @include border-radius($input-border-radius);\n }\n\n &::-webkit-color-swatch {\n height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n @include border-radius($input-border-radius);\n }\n}\n","// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n @if length($transition) == 0 {\n $transition: $transition-base;\n }\n\n @if length($transition) > 1 {\n @each $value in $transition {\n @if $value == null or $value == none {\n @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n }\n }\n }\n\n @if $enable-transitions {\n @if nth($transition, 1) != null {\n transition: $transition;\n }\n\n @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n }\n }\n}\n","// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n background-color: $color;\n\n @if $enable-gradients {\n background-image: var(--#{$variable-prefix}gradient);\n }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n","// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n\n.form-select {\n display: block;\n width: 100%;\n padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;\n // stylelint-disable-next-line property-no-vendor-prefix\n -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636\n font-family: $form-select-font-family;\n @include font-size($form-select-font-size);\n font-weight: $form-select-font-weight;\n line-height: $form-select-line-height;\n color: $form-select-color;\n background-color: $form-select-bg;\n background-image: escape-svg($form-select-indicator);\n background-repeat: no-repeat;\n background-position: $form-select-bg-position;\n background-size: $form-select-bg-size;\n border: $form-select-border-width solid $form-select-border-color;\n @include border-radius($form-select-border-radius, 0);\n @include box-shadow($form-select-box-shadow);\n @include transition($form-select-transition);\n appearance: none;\n\n &:focus {\n border-color: $form-select-focus-border-color;\n outline: 0;\n @if $enable-shadows {\n @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: $form-select-focus-box-shadow;\n }\n }\n\n &[multiple],\n &[size]:not([size=\"1\"]) {\n padding-right: $form-select-padding-x;\n background-image: none;\n }\n\n &:disabled {\n color: $form-select-disabled-color;\n background-color: $form-select-disabled-bg;\n border-color: $form-select-disabled-border-color;\n }\n\n // Remove outline from select box in FF\n &:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 $form-select-color;\n }\n}\n\n.form-select-sm {\n padding-top: $form-select-padding-y-sm;\n padding-bottom: $form-select-padding-y-sm;\n padding-left: $form-select-padding-x-sm;\n @include font-size($form-select-font-size-sm);\n @include border-radius($form-select-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: $form-select-padding-y-lg;\n padding-bottom: $form-select-padding-y-lg;\n padding-left: $form-select-padding-x-lg;\n @include font-size($form-select-font-size-lg);\n @include border-radius($form-select-border-radius-lg);\n}\n","//\n// Check/radio\n//\n\n.form-check {\n display: block;\n min-height: $form-check-min-height;\n padding-left: $form-check-padding-start;\n margin-bottom: $form-check-margin-bottom;\n\n .form-check-input {\n float: left;\n margin-left: $form-check-padding-start * -1;\n }\n}\n\n.form-check-input {\n width: $form-check-input-width;\n height: $form-check-input-width;\n margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height\n vertical-align: top;\n background-color: $form-check-input-bg;\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: $form-check-input-border;\n appearance: none;\n color-adjust: exact; // Keep themed appearance for print\n @include transition($form-check-transition);\n\n &[type=\"checkbox\"] {\n @include border-radius($form-check-input-border-radius);\n }\n\n &[type=\"radio\"] {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: $form-check-radio-border-radius;\n }\n\n &:active {\n filter: $form-check-input-active-filter;\n }\n\n &:focus {\n border-color: $form-check-input-focus-border;\n outline: 0;\n box-shadow: $form-check-input-focus-box-shadow;\n }\n\n &:checked {\n background-color: $form-check-input-checked-bg-color;\n border-color: $form-check-input-checked-border-color;\n\n &[type=\"checkbox\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-checked-bg-image);\n }\n }\n\n &[type=\"radio\"] {\n @if $enable-gradients {\n background-image: escape-svg($form-check-radio-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-radio-checked-bg-image);\n }\n }\n }\n\n &[type=\"checkbox\"]:indeterminate {\n background-color: $form-check-input-indeterminate-bg-color;\n border-color: $form-check-input-indeterminate-border-color;\n\n @if $enable-gradients {\n background-image: escape-svg($form-check-input-indeterminate-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-check-input-indeterminate-bg-image);\n }\n }\n\n &:disabled {\n pointer-events: none;\n filter: none;\n opacity: $form-check-input-disabled-opacity;\n }\n\n // Use disabled attribute in addition of :disabled pseudo-class\n // See: https://github.com/twbs/bootstrap/issues/28247\n &[disabled],\n &:disabled {\n ~ .form-check-label {\n opacity: $form-check-label-disabled-opacity;\n }\n }\n}\n\n.form-check-label {\n color: $form-check-label-color;\n cursor: $form-check-label-cursor;\n}\n\n//\n// Switch\n//\n\n.form-switch {\n padding-left: $form-switch-padding-start;\n\n .form-check-input {\n width: $form-switch-width;\n margin-left: $form-switch-padding-start * -1;\n background-image: escape-svg($form-switch-bg-image);\n background-position: left center;\n @include border-radius($form-switch-border-radius);\n @include transition($form-switch-transition);\n\n &:focus {\n background-image: escape-svg($form-switch-focus-bg-image);\n }\n\n &:checked {\n background-position: $form-switch-checked-bg-position;\n\n @if $enable-gradients {\n background-image: escape-svg($form-switch-checked-bg-image), var(--#{$variable-prefix}gradient);\n } @else {\n background-image: escape-svg($form-switch-checked-bg-image);\n }\n }\n }\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: $form-check-inline-margin-end;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n\n &[disabled],\n &:disabled {\n + .btn {\n pointer-events: none;\n filter: none;\n opacity: $form-check-btn-check-disabled-opacity;\n }\n }\n}\n","// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.form-range {\n width: 100%;\n height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);\n padding: 0; // Need to reset padding\n background-color: transparent;\n appearance: none;\n\n &:focus {\n outline: 0;\n\n // Pseudo-elements must be split across multiple rulesets to have an effect.\n // No box-shadow() mixin for focus accessibility.\n &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\n &::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n width: $form-range-thumb-width;\n height: $form-range-thumb-height;\n margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific\n @include gradient-bg($form-range-thumb-bg);\n border: $form-range-thumb-border;\n @include border-radius($form-range-thumb-border-radius);\n @include box-shadow($form-range-thumb-box-shadow);\n @include transition($form-range-thumb-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($form-range-thumb-active-bg);\n }\n }\n\n &::-webkit-slider-runnable-track {\n width: $form-range-track-width;\n height: $form-range-track-height;\n color: transparent; // Why?\n cursor: $form-range-track-cursor;\n background-color: $form-range-track-bg;\n border-color: transparent;\n @include border-radius($form-range-track-border-radius);\n @include box-shadow($form-range-track-box-shadow);\n }\n\n &::-moz-range-thumb {\n width: $form-range-thumb-width;\n height: $form-range-thumb-height;\n @include gradient-bg($form-range-thumb-bg);\n border: $form-range-thumb-border;\n @include border-radius($form-range-thumb-border-radius);\n @include box-shadow($form-range-thumb-box-shadow);\n @include transition($form-range-thumb-transition);\n appearance: none;\n\n &:active {\n @include gradient-bg($form-range-thumb-active-bg);\n }\n }\n\n &::-moz-range-track {\n width: $form-range-track-width;\n height: $form-range-track-height;\n color: transparent;\n cursor: $form-range-track-cursor;\n background-color: $form-range-track-bg;\n border-color: transparent; // Firefox specific?\n @include border-radius($form-range-track-border-radius);\n @include box-shadow($form-range-track-box-shadow);\n }\n\n &:disabled {\n pointer-events: none;\n\n &::-webkit-slider-thumb {\n background-color: $form-range-thumb-disabled-bg;\n }\n\n &::-moz-range-thumb {\n background-color: $form-range-thumb-disabled-bg;\n }\n }\n}\n",".form-floating {\n position: relative;\n\n > .form-control,\n > .form-select {\n height: $form-floating-height;\n line-height: $form-floating-line-height;\n }\n\n > label {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%; // allow textareas\n padding: $form-floating-padding-y $form-floating-padding-x;\n pointer-events: none;\n border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model\n transform-origin: 0 0;\n @include transition($form-floating-transition);\n }\n\n // stylelint-disable no-duplicate-selectors\n > .form-control {\n padding: $form-floating-padding-y $form-floating-padding-x;\n\n &::placeholder {\n color: transparent;\n }\n\n &:focus,\n &:not(:placeholder-shown) {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n &:-webkit-autofill {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n }\n\n > .form-select {\n padding-top: $form-floating-input-padding-t;\n padding-bottom: $form-floating-input-padding-b;\n }\n\n > .form-control:focus,\n > .form-control:not(:placeholder-shown),\n > .form-select {\n ~ label {\n opacity: $form-floating-label-opacity;\n transform: $form-floating-label-transform;\n }\n }\n // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n > .form-control:-webkit-autofill {\n ~ label {\n opacity: $form-floating-label-opacity;\n transform: $form-floating-label-transform;\n }\n }\n // stylelint-enable no-duplicate-selectors\n}\n","//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap; // For form validation feedback\n align-items: stretch;\n width: 100%;\n\n > .form-control,\n > .form-select {\n position: relative; // For focus state's z-index\n flex: 1 1 auto;\n width: 1%;\n min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\n }\n\n // Bring the \"active\" form control to the top of surrounding elements\n > .form-control:focus,\n > .form-select:focus {\n z-index: 3;\n }\n\n // Ensure buttons are always above inputs for more visually pleasing borders.\n // This isn't needed for `.input-group-text` since it shares the same border-color\n // as our inputs.\n .btn {\n position: relative;\n z-index: 2;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: $input-group-addon-padding-y $input-group-addon-padding-x;\n @include font-size($input-font-size); // Match inputs\n font-weight: $input-group-addon-font-weight;\n line-height: $input-line-height;\n color: $input-group-addon-color;\n text-align: center;\n white-space: nowrap;\n background-color: $input-group-addon-bg;\n border: $input-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: $input-padding-y-lg $input-padding-x-lg;\n @include font-size($input-font-size-lg);\n @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: $input-padding-y-sm $input-padding-x-sm;\n @include font-size($input-font-size-sm);\n @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: $form-select-padding-x + $form-select-indicator-padding;\n}\n\n\n// Rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.input-group {\n &:not(.has-validation) {\n > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n > .dropdown-toggle:nth-last-child(n + 3) {\n @include border-end-radius(0);\n }\n }\n\n &.has-validation {\n > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),\n > .dropdown-toggle:nth-last-child(n + 4) {\n @include border-end-radius(0);\n }\n }\n\n $validation-messages: \"\";\n @each $state in map-keys($form-validation-states) {\n $validation-messages: $validation-messages + \":not(.\" + unquote($state) + \"-tooltip)\" + \":not(.\" + unquote($state) + \"-feedback)\";\n }\n\n > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {\n margin-left: -$input-border-width;\n @include border-start-radius(0);\n }\n}\n","// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n @if ($state == \"valid\" or $state == \"invalid\") {\n .was-validated #{if(&, \"&\", \"\")}:#{$state},\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n } @else {\n #{if(&, \"&\", \"\")}.is-#{$state} {\n @content;\n }\n }\n}\n\n@mixin form-validation-state(\n $state,\n $color,\n $icon,\n $tooltip-color: color-contrast($color),\n $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)\n) {\n .#{$state}-feedback {\n display: none;\n width: 100%;\n margin-top: $form-feedback-margin-top;\n @include font-size($form-feedback-font-size);\n font-style: $form-feedback-font-style;\n color: $color;\n }\n\n .#{$state}-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%; // Contain to parent when possible\n padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n margin-top: .1rem;\n @include font-size($form-feedback-tooltip-font-size);\n line-height: $form-feedback-tooltip-line-height;\n color: $tooltip-color;\n background-color: $tooltip-bg-color;\n @include border-radius($form-feedback-tooltip-border-radius);\n }\n\n @include form-validation-state-selector($state) {\n ~ .#{$state}-feedback,\n ~ .#{$state}-tooltip {\n display: block;\n }\n }\n\n .form-control {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-image: escape-svg($icon);\n background-repeat: no-repeat;\n background-position: right $input-height-inner-quarter center;\n background-size: $input-height-inner-half $input-height-inner-half;\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n // stylelint-disable-next-line selector-no-qualifying-type\n textarea.form-control {\n @include form-validation-state-selector($state) {\n @if $enable-validation-icons {\n padding-right: $input-height-inner;\n background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n }\n }\n }\n\n .form-select {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n @if $enable-validation-icons {\n &:not([multiple]):not([size]),\n &:not([multiple])[size=\"1\"] {\n padding-right: $form-select-feedback-icon-padding-end;\n background-image: escape-svg($form-select-indicator), escape-svg($icon);\n background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n }\n }\n\n &:focus {\n border-color: $color;\n box-shadow: $focus-box-shadow;\n }\n }\n }\n\n .form-check-input {\n @include form-validation-state-selector($state) {\n border-color: $color;\n\n &:checked {\n background-color: $color;\n }\n\n &:focus {\n box-shadow: $focus-box-shadow;\n }\n\n ~ .form-check-label {\n color: $color;\n }\n }\n }\n .form-check-inline .form-check-input {\n ~ .#{$state}-feedback {\n margin-left: .5em;\n }\n }\n\n .input-group .form-control,\n .input-group .form-select {\n @include form-validation-state-selector($state) {\n @if $state == \"valid\" {\n z-index: 1;\n } @else if $state == \"invalid\" {\n z-index: 2;\n }\n &:focus {\n z-index: 3;\n }\n }\n }\n}\n// scss-docs-end form-validation-mixins\n","//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-family: $btn-font-family;\n font-weight: $btn-font-weight;\n line-height: $btn-line-height;\n color: $body-color;\n text-align: center;\n text-decoration: if($link-decoration == none, null, none);\n white-space: $btn-white-space;\n vertical-align: middle;\n cursor: if($enable-button-pointers, pointer, null);\n user-select: none;\n background-color: transparent;\n border: $btn-border-width solid transparent;\n @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius);\n @include transition($btn-transition);\n\n &:hover {\n color: $body-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n .btn-check:focus + &,\n &:focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active {\n @include box-shadow($btn-active-box-shadow);\n\n &:focus {\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n }\n\n &:disabled,\n &.disabled,\n fieldset:disabled & {\n pointer-events: none;\n opacity: $btn-disabled-opacity;\n @include box-shadow(none);\n }\n}\n\n\n//\n// Alternate buttons\n//\n\n// scss-docs-start btn-variant-loops\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value);\n }\n}\n// scss-docs-end btn-variant-loops\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $btn-link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $btn-link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n text-decoration: $link-hover-decoration;\n }\n\n &:disabled,\n &.disabled {\n color: $btn-link-disabled-color;\n }\n\n // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n $background,\n $border,\n $color: color-contrast($background),\n $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n $hover-color: color-contrast($hover-background),\n $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n $active-color: color-contrast($active-background),\n $disabled-background: $background,\n $disabled-border: $border,\n $disabled-color: color-contrast($disabled-background)\n) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n &:hover {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n color: $hover-color;\n @include gradient-bg($hover-background);\n border-color: $hover-border;\n @if $enable-shadows {\n @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n color: $active-color;\n background-color: $active-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $disabled-color;\n background-color: $disabled-background;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n border-color: $disabled-border;\n }\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n $color,\n $color-hover: color-contrast($color),\n $active-background: $color,\n $active-border: $color,\n $active-color: color-contrast($active-background)\n) {\n color: $color;\n border-color: $color;\n\n &:hover {\n color: $color-hover;\n background-color: $active-background;\n border-color: $active-border;\n }\n\n .btn-check:focus + &,\n &:focus {\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n\n .btn-check:checked + &,\n .btn-check:active + &,\n &:active,\n &.active,\n &.dropdown-toggle.show {\n color: $active-color;\n background-color: $active-background;\n border-color: $active-border;\n\n &:focus {\n @if $enable-shadows {\n @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5));\n } @else {\n // Avoid using mixin so we can pass custom focus shadow properly\n box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n }\n }\n }\n\n &:disabled,\n &.disabled {\n color: $color;\n background-color: transparent;\n }\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n // Manually declare to provide an override to the browser default\n @include border-radius($border-radius, 0);\n}\n// scss-docs-end btn-size-mixin\n",".fade {\n @include transition($transition-fade);\n\n &:not(.show) {\n opacity: 0;\n }\n}\n\n// scss-docs-start collapse-classes\n.collapse {\n &:not(.show) {\n display: none;\n }\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n\n &.collapse-horizontal {\n width: 0;\n height: auto;\n @include transition($transition-collapse-width);\n }\n}\n// scss-docs-end collapse-classes\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n\n // Generate the caret automatically\n @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y $dropdown-padding-x;\n margin: 0; // Override default margin of ul\n @include font-size($dropdown-font-size);\n color: $dropdown-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($dropdown-border-radius);\n @include box-shadow($dropdown-box-shadow);\n\n &[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: $dropdown-spacer;\n }\n}\n\n// scss-docs-start responsive-breakpoints\n// We deliberately hardcode the `bs-` prefix because we check\n// this custom property in JS to determine Popper's positioning\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .dropdown-menu#{$infix}-start {\n --bs-position: start;\n\n &[data-bs-popper] {\n right: auto;\n left: 0;\n }\n }\n\n .dropdown-menu#{$infix}-end {\n --bs-position: end;\n\n &[data-bs-popper] {\n right: 0;\n left: auto;\n }\n }\n }\n}\n// scss-docs-end responsive-breakpoints\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(up);\n }\n}\n\n.dropend {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(end);\n &::after {\n vertical-align: 0;\n }\n }\n}\n\n.dropstart {\n .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n @include caret(start);\n &::before {\n vertical-align: 0;\n }\n }\n}\n\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n height: 0;\n margin: $dropdown-divider-margin-y 0;\n overflow: hidden;\n border-top: 1px solid $dropdown-divider-bg;\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background-color: transparent; // For `<button>`s\n border: 0; // For `<button>`s\n\n // Prevent dropdown overflow if there's no padding\n // See https://github.com/twbs/bootstrap/pull/27703\n @if $dropdown-padding-y == 0 {\n &:first-child {\n @include border-top-radius($dropdown-inner-border-radius);\n }\n\n &:last-child {\n @include border-bottom-radius($dropdown-inner-border-radius);\n }\n }\n\n &:hover,\n &:focus {\n color: $dropdown-link-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n @include gradient-bg($dropdown-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n @include gradient-bg($dropdown-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n pointer-events: none;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n background-image: if($enable-gradients, none, null);\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-header-padding;\n margin-bottom: 0; // for use with heading elements\n @include font-size($font-size-sm);\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n display: block;\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n color: $dropdown-link-color;\n}\n\n// Dark dropdowns\n.dropdown-menu-dark {\n color: $dropdown-dark-color;\n background-color: $dropdown-dark-bg;\n border-color: $dropdown-dark-border-color;\n @include box-shadow($dropdown-dark-box-shadow);\n\n .dropdown-item {\n color: $dropdown-dark-link-color;\n\n &:hover,\n &:focus {\n color: $dropdown-dark-link-hover-color;\n @include gradient-bg($dropdown-dark-link-hover-bg);\n }\n\n &.active,\n &:active {\n color: $dropdown-dark-link-active-color;\n @include gradient-bg($dropdown-dark-link-active-bg);\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-dark-link-disabled-color;\n }\n }\n\n .dropdown-divider {\n border-color: $dropdown-dark-divider-bg;\n }\n\n .dropdown-item-text {\n color: $dropdown-dark-link-color;\n }\n\n .dropdown-header {\n color: $dropdown-dark-header-color;\n }\n}\n","// scss-docs-start caret-mixins\n@mixin caret-down {\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-bottom: 0;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up {\n border-top: 0;\n border-right: $caret-width solid transparent;\n border-bottom: $caret-width solid;\n border-left: $caret-width solid transparent;\n}\n\n@mixin caret-end {\n border-top: $caret-width solid transparent;\n border-right: 0;\n border-bottom: $caret-width solid transparent;\n border-left: $caret-width solid;\n}\n\n@mixin caret-start {\n border-top: $caret-width solid transparent;\n border-right: $caret-width solid;\n border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n @if $enable-caret {\n &::after {\n display: inline-block;\n margin-left: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @if $direction == down {\n @include caret-down();\n } @else if $direction == up {\n @include caret-up();\n } @else if $direction == end {\n @include caret-end();\n }\n }\n\n @if $direction == start {\n &::after {\n display: none;\n }\n\n &::before {\n display: inline-block;\n margin-right: $caret-spacing;\n vertical-align: $caret-vertical-align;\n content: \"\";\n @include caret-start();\n }\n }\n\n &:empty::after {\n margin-left: 0;\n }\n }\n}\n// scss-docs-end caret-mixins\n","// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 1 1 auto;\n }\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n > .btn-check:checked + .btn,\n > .btn-check:focus + .btn,\n > .btn:hover,\n > .btn:focus,\n > .btn:active,\n > .btn.active {\n z-index: 1;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group {\n // Prevent double borders when buttons are next to each other\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-left: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-end-radius(0);\n }\n\n // The left radius should be 0 if the button is:\n // - the \"third or more\" child\n // - the second child and the previous element isn't `.btn-check` (making it the first child visually)\n // - part of a btn-group which isn't the first child\n > .btn:nth-child(n + 3),\n > :not(.btn-check) + .btn,\n > .btn-group:not(:first-child) > .btn {\n @include border-start-radius(0);\n }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n padding-right: $btn-padding-x * .75;\n padding-left: $btn-padding-x * .75;\n\n &::after,\n .dropup &::after,\n .dropend &::after {\n margin-left: 0;\n }\n\n .dropstart &::before {\n margin-right: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $btn-padding-x-sm * .75;\n padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $btn-padding-x-lg * .75;\n padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n > .btn,\n > .btn-group {\n width: 100%;\n }\n\n > .btn:not(:first-child),\n > .btn-group:not(:first-child) {\n margin-top: -$btn-border-width;\n }\n\n // Reset rounded corners\n > .btn:not(:last-child):not(.dropdown-toggle),\n > .btn-group:not(:last-child) > .btn {\n @include border-bottom-radius(0);\n }\n\n > .btn ~ .btn,\n > .btn-group:not(:first-child) > .btn {\n @include border-top-radius(0);\n }\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s, `<ul>`s or `<ol>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n @include font-size($nav-link-font-size);\n font-weight: $nav-link-font-weight;\n color: $nav-link-color;\n text-decoration: if($link-decoration == none, null, none);\n @include transition($nav-link-transition);\n\n &:hover,\n &:focus {\n color: $nav-link-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n pointer-events: none;\n cursor: default;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-link {\n margin-bottom: -$nav-tabs-border-width;\n background: none;\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n &:hover,\n &:focus {\n border-color: $nav-tabs-link-hover-border-color;\n // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\n isolation: isolate;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n background: none;\n border: 0;\n @include border-radius($nav-pills-border-radius);\n }\n\n .nav-link.active,\n .show > .nav-link {\n color: $nav-pills-link-active-color;\n @include gradient-bg($nav-pills-link-active-bg);\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n > .nav-link,\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n > .nav-link,\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n.nav-fill,\n.nav-justified {\n .nav-item .nav-link {\n width: 100%; // Make sure button will grow\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding-top: $navbar-padding-y;\n padding-right: $navbar-padding-x; // default: null\n padding-bottom: $navbar-padding-y;\n padding-left: $navbar-padding-x; // default: null\n @include gradient-bg();\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properties so that content nested within behave properly.\n // The `flex-wrap` property is inherited to simplify the expanded navbars\n %container-flex-properties {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n }\n\n > .container,\n > .container-fluid {\n @extend %container-flex-properties;\n }\n\n @each $breakpoint, $container-max-width in $container-max-widths {\n > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n @extend %container-flex-properties;\n }\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-brand-margin-end;\n @include font-size($navbar-brand-font-size);\n text-decoration: if($link-decoration == none, null, none);\n white-space: nowrap;\n\n &:hover,\n &:focus {\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n @include font-size($navbar-toggler-font-size);\n line-height: 1;\n background-color: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n @include transition($navbar-toggler-transition);\n\n &:hover {\n text-decoration: none;\n }\n\n &:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 $navbar-toggler-focus-width;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--#{$variable-prefix}scroll-height, 75vh);\n overflow-y: auto;\n}\n\n// scss-docs-start navbar-expand-loop\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n // stylelint-disable-next-line scss/selector-no-union-class-name\n &#{$infix} {\n @include media-breakpoint-up($next) {\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .nav-link {\n padding-right: $navbar-nav-link-padding-x;\n padding-left: $navbar-nav-link-padding-x;\n }\n }\n\n .navbar-nav-scroll {\n overflow: visible;\n }\n\n .navbar-collapse {\n display: flex !important; // stylelint-disable-line declaration-no-important\n flex-basis: auto;\n }\n\n .navbar-toggler {\n display: none;\n }\n\n .offcanvas-header {\n display: none;\n }\n\n .offcanvas {\n position: inherit;\n bottom: 0;\n z-index: 1000;\n flex-grow: 1;\n visibility: visible !important; // stylelint-disable-line declaration-no-important\n background-color: transparent;\n border-right: 0;\n border-left: 0;\n @include transition(none);\n transform: none;\n }\n .offcanvas-top,\n .offcanvas-bottom {\n height: auto;\n border-top: 0;\n border-bottom: 0;\n }\n\n .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n }\n }\n }\n}\n// scss-docs-end navbar-expand-loop\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-brand-color;\n\n &:hover,\n &:focus {\n color: $navbar-light-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n &:hover,\n &:focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: escape-svg($navbar-light-toggler-icon-bg);\n }\n\n .navbar-text {\n color: $navbar-light-color;\n\n a,\n a:hover,\n a:focus {\n color: $navbar-light-active-color;\n }\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-brand-color;\n\n &:hover,\n &:focus {\n color: $navbar-dark-brand-hover-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n &:hover,\n &:focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: escape-svg($navbar-dark-toggler-icon-bg);\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n a,\n a:hover,\n a:focus {\n color: $navbar-dark-active-color;\n }\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n height: $card-height;\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n @include box-shadow($card-box-shadow);\n\n > hr {\n margin-right: 0;\n margin-left: 0;\n }\n\n > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n\n &:first-child {\n border-top-width: 0;\n @include border-top-radius($card-inner-border-radius);\n }\n\n &:last-child {\n border-bottom-width: 0;\n @include border-bottom-radius($card-inner-border-radius);\n }\n }\n\n // Due to specificity of the above selector (`.card > .list-group`), we must\n // use a child selector here to prevent double borders.\n > .card-header + .list-group,\n > .list-group + .card-footer {\n border-top: 0;\n }\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-y $card-spacer-x;\n color: $card-color;\n}\n\n.card-title {\n margin-bottom: $card-title-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -$card-title-spacer-y * .5;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n &:hover {\n text-decoration: if($link-hover-decoration == underline, none, null);\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-cap-padding-y $card-cap-padding-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n}\n\n.card-footer {\n padding: $card-cap-padding-y $card-cap-padding-x;\n color: $card-cap-color;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -$card-cap-padding-x * .5;\n margin-bottom: -$card-cap-padding-y;\n margin-left: -$card-cap-padding-x * .5;\n border-bottom: 0;\n\n @if $nav-tabs-link-active-bg != $card-bg {\n .nav-link.active {\n background-color: $card-bg;\n border-bottom-color: $card-bg;\n }\n }\n}\n\n.card-header-pills {\n margin-right: -$card-cap-padding-x * .5;\n margin-left: -$card-cap-padding-x * .5;\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n @include border-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n}\n\n.card-img,\n.card-img-top {\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n margin-bottom: $card-group-margin;\n }\n\n @include media-breakpoint-up(sm) {\n display: flex;\n flex-flow: row wrap;\n // The child selector allows nested `.card` within `.card-group`\n // to display properly.\n > .card {\n // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n flex: 1 0 0%;\n margin-bottom: 0;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:not(:last-child) {\n @include border-end-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-disallowed-list\n border-top-right-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-disallowed-list\n border-bottom-right-radius: 0;\n }\n }\n\n &:not(:first-child) {\n @include border-start-radius(0);\n\n .card-img-top,\n .card-header {\n // stylelint-disable-next-line property-disallowed-list\n border-top-left-radius: 0;\n }\n .card-img-bottom,\n .card-footer {\n // stylelint-disable-next-line property-disallowed-list\n border-bottom-left-radius: 0;\n }\n }\n }\n }\n }\n}\n","//\n// Base styles\n//\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: $accordion-button-padding-y $accordion-button-padding-x;\n @include font-size($font-size-base);\n color: $accordion-button-color;\n text-align: left; // Reset button style\n background-color: $accordion-button-bg;\n border: 0;\n @include border-radius(0);\n overflow-anchor: none;\n @include transition($accordion-transition);\n\n &:not(.collapsed) {\n color: $accordion-button-active-color;\n background-color: $accordion-button-active-bg;\n box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color;\n\n &::after {\n background-image: escape-svg($accordion-button-active-icon);\n transform: $accordion-icon-transform;\n }\n }\n\n // Accordion icon\n &::after {\n flex-shrink: 0;\n width: $accordion-icon-width;\n height: $accordion-icon-width;\n margin-left: auto;\n content: \"\";\n background-image: escape-svg($accordion-button-icon);\n background-repeat: no-repeat;\n background-size: $accordion-icon-width;\n @include transition($accordion-icon-transition);\n }\n\n &:hover {\n z-index: 2;\n }\n\n &:focus {\n z-index: 3;\n border-color: $accordion-button-focus-border-color;\n outline: 0;\n box-shadow: $accordion-button-focus-box-shadow;\n }\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n background-color: $accordion-bg;\n border: $accordion-border-width solid $accordion-border-color;\n\n &:first-of-type {\n @include border-top-radius($accordion-border-radius);\n\n .accordion-button {\n @include border-top-radius($accordion-inner-border-radius);\n }\n }\n\n &:not(:first-of-type) {\n border-top: 0;\n }\n\n // Only set a border-radius on the last item if the accordion is collapsed\n &:last-of-type {\n @include border-bottom-radius($accordion-border-radius);\n\n .accordion-button {\n &.collapsed {\n @include border-bottom-radius($accordion-inner-border-radius);\n }\n }\n\n .accordion-collapse {\n @include border-bottom-radius($accordion-border-radius);\n }\n }\n}\n\n.accordion-body {\n padding: $accordion-body-padding-y $accordion-body-padding-x;\n}\n\n\n// Flush accordion items\n//\n// Remove borders and border-radius to keep accordion items edge-to-edge.\n\n.accordion-flush {\n .accordion-collapse {\n border-width: 0;\n }\n\n .accordion-item {\n border-right: 0;\n border-left: 0;\n @include border-radius(0);\n\n &:first-child { border-top: 0; }\n &:last-child { border-bottom: 0; }\n\n .accordion-button {\n @include border-radius(0);\n }\n }\n}\n",".breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: $breadcrumb-margin-bottom;\n @include font-size($breadcrumb-font-size);\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item {\n padding-left: $breadcrumb-item-padding-x;\n\n &::before {\n float: left; // Suppress inline spacings and underlining of the separator\n padding-right: $breadcrumb-item-padding-x;\n color: $breadcrumb-divider-color;\n content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{\"/* rtl:\"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{\"*/\"};\n }\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n",".pagination {\n display: flex;\n @include list-unstyled();\n}\n\n.page-link {\n position: relative;\n display: block;\n color: $pagination-color;\n text-decoration: if($link-decoration == none, null, none);\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n @include transition($pagination-transition);\n\n &:hover {\n z-index: 2;\n color: $pagination-hover-color;\n text-decoration: if($link-hover-decoration == underline, none, null);\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n\n &:focus {\n z-index: 3;\n color: $pagination-focus-color;\n background-color: $pagination-focus-bg;\n outline: $pagination-focus-outline;\n box-shadow: $pagination-focus-box-shadow;\n }\n}\n\n.page-item {\n &:not(:first-child) .page-link {\n margin-left: $pagination-margin-start;\n }\n\n &.active .page-link {\n z-index: 3;\n color: $pagination-active-color;\n @include gradient-bg($pagination-active-bg);\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);\n}\n","// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n @include font-size($font-size);\n }\n\n .page-item {\n @if $pagination-margin-start == (-$pagination-border-width) {\n &:first-child {\n .page-link {\n @include border-start-radius($border-radius);\n }\n }\n\n &:last-child {\n .page-link {\n @include border-end-radius($border-radius);\n }\n }\n } @else {\n //Add border-radius to all pageLinks in case they have left margin\n .page-link {\n @include border-radius($border-radius);\n }\n }\n }\n}\n// scss-docs-end pagination-mixin\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n @include font-size($badge-font-size);\n font-weight: $badge-font-weight;\n line-height: 1;\n color: $badge-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius($badge-border-radius);\n @include gradient-bg();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n","//\n// Base styles\n//\n\n.alert {\n position: relative;\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n padding-right: $alert-dismissible-padding-r;\n\n // Adjust close link position\n .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: $stretched-link-z-index + 1;\n padding: $alert-padding-y * 1.25 $alert-padding-x;\n }\n}\n\n\n// scss-docs-start alert-modifiers\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $state, $value in $theme-colors {\n $alert-background: shift-color($value, $alert-bg-scale);\n $alert-border: shift-color($value, $alert-border-scale);\n $alert-color: shift-color($value, $alert-color-scale);\n @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {\n $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));\n }\n .alert-#{$state} {\n @include alert-variant($alert-background, $alert-border, $alert-color);\n }\n}\n// scss-docs-end alert-modifiers\n","// scss-docs-start alert-variant-mixin\n@mixin alert-variant($background, $border, $color) {\n color: $color;\n @include gradient-bg($background);\n border-color: $border;\n\n .alert-link {\n color: shade-color($color, 20%);\n }\n}\n// scss-docs-end alert-variant-mixin\n","// Disable animation if transitions are disabled\n\n// scss-docs-start progress-keyframes\n@if $enable-transitions {\n @keyframes progress-bar-stripes {\n 0% { background-position-x: $progress-height; }\n }\n}\n// scss-docs-end progress-keyframes\n\n.progress {\n display: flex;\n height: $progress-height;\n overflow: hidden; // force rounded corners by cropping it\n @include font-size($progress-font-size);\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: $progress-bar-color;\n text-align: center;\n white-space: nowrap;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n .progress-bar-animated {\n animation: $progress-bar-animation-timing progress-bar-stripes;\n\n @if $enable-reduced-motion {\n @media (prefers-reduced-motion: reduce) {\n animation: none;\n }\n }\n }\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n @include border-radius($list-group-border-radius);\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n\n > li::before {\n // Increments only this instance of the section counter\n content: counters(section, \".\") \". \";\n counter-increment: section;\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n &:hover,\n &:focus {\n z-index: 1; // Place hover/focus items above their siblings for proper border styling\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n color: $list-group-color;\n text-decoration: if($link-decoration == none, null, none);\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius(inherit);\n }\n\n &:last-child {\n @include border-bottom-radius(inherit);\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n pointer-events: none;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n\n & + & {\n border-top-width: 0;\n\n &.active {\n margin-top: -$list-group-border-width;\n border-top-width: $list-group-border-width;\n }\n }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .list-group-horizontal#{$infix} {\n flex-direction: row;\n\n > .list-group-item {\n &:first-child {\n @include border-bottom-start-radius($list-group-border-radius);\n @include border-top-end-radius(0);\n }\n\n &:last-child {\n @include border-top-end-radius($list-group-border-radius);\n @include border-bottom-start-radius(0);\n }\n\n &.active {\n margin-top: 0;\n }\n\n + .list-group-item {\n border-top-width: $list-group-border-width;\n border-left-width: 0;\n\n &.active {\n margin-left: -$list-group-border-width;\n border-left-width: $list-group-border-width;\n }\n }\n }\n }\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n @include border-radius(0);\n\n > .list-group-item {\n border-width: 0 0 $list-group-border-width;\n\n &:last-child {\n border-bottom-width: 0;\n }\n }\n}\n\n\n// scss-docs-start list-group-modifiers\n// List group contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $state, $value in $theme-colors {\n $list-group-variant-bg: shift-color($value, $list-group-item-bg-scale);\n $list-group-variant-color: shift-color($value, $list-group-item-color-scale);\n @if (contrast-ratio($list-group-variant-bg, $list-group-variant-color) < $min-contrast-ratio) {\n $list-group-variant-color: mix($value, color-contrast($list-group-variant-bg), abs($list-group-item-color-scale));\n }\n\n @include list-group-item-variant($state, $list-group-variant-bg, $list-group-variant-color);\n}\n// scss-docs-end list-group-modifiers\n","// List Groups\n\n// scss-docs-start list-group-mixin\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n &.list-group-item-action {\n &:hover,\n &:focus {\n color: $color;\n background-color: shade-color($background, 10%);\n }\n\n &.active {\n color: $white;\n background-color: $color;\n border-color: $color;\n }\n }\n }\n}\n// scss-docs-end list-group-mixin\n","// transparent background and border properties included for button version.\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n.btn-close {\n box-sizing: content-box;\n width: $btn-close-width;\n height: $btn-close-height;\n padding: $btn-close-padding-y $btn-close-padding-x;\n color: $btn-close-color;\n background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements\n border: 0; // for button elements\n @include border-radius();\n opacity: $btn-close-opacity;\n\n // Override <a>'s hover style\n &:hover {\n color: $btn-close-color;\n text-decoration: none;\n opacity: $btn-close-hover-opacity;\n }\n\n &:focus {\n outline: 0;\n box-shadow: $btn-close-focus-shadow;\n opacity: $btn-close-focus-opacity;\n }\n\n &:disabled,\n &.disabled {\n pointer-events: none;\n user-select: none;\n opacity: $btn-close-disabled-opacity;\n }\n}\n\n.btn-close-white {\n filter: $btn-close-white-filter;\n}\n",".toast {\n width: $toast-max-width;\n max-width: 100%;\n @include font-size($toast-font-size);\n color: $toast-color;\n pointer-events: auto;\n background-color: $toast-background-color;\n background-clip: padding-box;\n border: $toast-border-width solid $toast-border-color;\n box-shadow: $toast-box-shadow;\n @include border-radius($toast-border-radius);\n\n &.showing {\n opacity: 0;\n }\n\n &:not(.show) {\n display: none;\n }\n}\n\n.toast-container {\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n\n > :not(:last-child) {\n margin-bottom: $toast-spacing;\n }\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: $toast-padding-y $toast-padding-x;\n color: $toast-header-color;\n background-color: $toast-header-background-color;\n background-clip: padding-box;\n border-bottom: $toast-border-width solid $toast-header-border-color;\n @include border-top-radius(subtract($toast-border-radius, $toast-border-width));\n\n .btn-close {\n margin-right: $toast-padding-x * -.5;\n margin-left: $toast-padding-x;\n }\n}\n\n.toast-body {\n padding: $toast-padding-x; // apply to both vertical and horizontal\n word-wrap: break-word;\n}\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n // allow clicks to pass through for custom click handling to close modal\n pointer-events: none;\n\n // When fading in the modal, animate it to slide down\n .modal.fade & {\n @include transition($modal-transition);\n transform: $modal-fade-transform;\n }\n .modal.show & {\n transform: $modal-show-transform;\n }\n\n // When trying to close, animate focus to scale\n .modal.modal-static & {\n transform: $modal-scale-transform;\n }\n}\n\n.modal-dialog-scrollable {\n height: subtract(100%, $modal-dialog-margin * 2);\n\n .modal-content {\n max-height: 100%;\n overflow: hidden;\n }\n\n .modal-body {\n overflow-y: auto;\n }\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: subtract(100%, $modal-dialog-margin * 2);\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n // counteract the pointer-events: none; in the .modal-dialog\n color: $modal-content-color;\n pointer-events: auto;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($modal-content-border-radius);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n @include overlay-backdrop($zindex-modal-backdrop, $modal-backdrop-bg, $modal-backdrop-opacity);\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n @include border-top-radius($modal-content-inner-border-radius);\n\n .btn-close {\n padding: ($modal-header-padding-y * .5) ($modal-header-padding-x * .5);\n margin: ($modal-header-padding-y * -.5) ($modal-header-padding-x * -.5) ($modal-header-padding-y * -.5) auto;\n }\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when there should be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n flex-wrap: wrap;\n flex-shrink: 0;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding - $modal-footer-margin-between * .5;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n @include border-bottom-radius($modal-content-inner-border-radius);\n\n // Place margin between footer elements\n // This solution is far from ideal because of the universal selector usage,\n // but is needed to fix https://github.com/twbs/bootstrap/issues/24800\n > * {\n margin: $modal-footer-margin-between * .5;\n }\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-dialog-scrollable {\n height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n }\n\n .modal-dialog-centered {\n min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg,\n .modal-xl {\n max-width: $modal-lg;\n }\n}\n\n@include media-breakpoint-up(xl) {\n .modal-xl { max-width: $modal-xl; }\n}\n\n// scss-docs-start modal-fullscreen-loop\n@each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n $postfix: if($infix != \"\", $infix + \"-down\", \"\");\n\n @include media-breakpoint-down($breakpoint) {\n .modal-fullscreen#{$postfix} {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n\n .modal-content {\n height: 100%;\n border: 0;\n @include border-radius(0);\n }\n\n .modal-header {\n @include border-radius(0);\n }\n\n .modal-body {\n overflow-y: auto;\n }\n\n .modal-footer {\n @include border-radius(0);\n }\n }\n }\n}\n// scss-docs-end modal-fullscreen-loop\n","// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n position: fixed;\n top: 0;\n left: 0;\n z-index: $zindex;\n width: 100vw;\n height: 100vh;\n background-color: $backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $backdrop-opacity; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($tooltip-font-size);\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .tooltip-arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n\n &::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-tooltip-top {\n padding: $tooltip-arrow-height 0;\n\n .tooltip-arrow {\n bottom: 0;\n\n &::before {\n top: -1px;\n border-width: $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-end {\n padding: 0 $tooltip-arrow-height;\n\n .tooltip-arrow {\n left: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n right: -1px;\n border-width: ($tooltip-arrow-width * .5) $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-bottom {\n padding: $tooltip-arrow-height 0;\n\n .tooltip-arrow {\n top: 0;\n\n &::before {\n bottom: -1px;\n border-width: 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-start {\n padding: 0 $tooltip-arrow-height;\n\n .tooltip-arrow {\n right: 0;\n width: $tooltip-arrow-height;\n height: $tooltip-arrow-width;\n\n &::before {\n left: -1px;\n border-width: ($tooltip-arrow-width * .5) 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;\n border-left-color: $tooltip-arrow-color;\n }\n }\n}\n\n.bs-tooltip-auto {\n &[data-popper-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[data-popper-placement^=\"right\"] {\n @extend .bs-tooltip-end;\n }\n &[data-popper-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[data-popper-placement^=\"left\"] {\n @extend .bs-tooltip-start;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($tooltip-border-radius);\n}\n","@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0 #{\"/* rtl:ignore */\"};\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n @include font-size($popover-font-size);\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($popover-border-radius);\n @include box-shadow($popover-box-shadow);\n\n .popover-arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n\n &::before,\n &::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n }\n }\n}\n\n.bs-popover-top {\n > .popover-arrow {\n bottom: subtract(-$popover-arrow-height, $popover-border-width);\n\n &::before {\n bottom: 0;\n border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-top-color: $popover-arrow-outer-color;\n }\n\n &::after {\n bottom: $popover-border-width;\n border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-top-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-end {\n > .popover-arrow {\n left: subtract(-$popover-arrow-height, $popover-border-width);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n\n &::before {\n left: 0;\n border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-right-color: $popover-arrow-outer-color;\n }\n\n &::after {\n left: $popover-border-width;\n border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;\n border-right-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-bottom {\n > .popover-arrow {\n top: subtract(-$popover-arrow-height, $popover-border-width);\n\n &::before {\n top: 0;\n border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n &::after {\n top: $popover-border-width;\n border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: $popover-arrow-width;\n margin-left: -$popover-arrow-width * .5;\n content: \"\";\n border-bottom: $popover-border-width solid $popover-header-bg;\n }\n}\n\n.bs-popover-start {\n > .popover-arrow {\n right: subtract(-$popover-arrow-height, $popover-border-width);\n width: $popover-arrow-height;\n height: $popover-arrow-width;\n\n &::before {\n right: 0;\n border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;\n border-left-color: $popover-arrow-outer-color;\n }\n\n &::after {\n right: $popover-border-width;\n border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;\n border-left-color: $popover-arrow-color;\n }\n }\n}\n\n.bs-popover-auto {\n &[data-popper-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[data-popper-placement^=\"right\"] {\n @extend .bs-popover-end;\n }\n &[data-popper-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[data-popper-placement^=\"left\"] {\n @extend .bs-popover-start;\n }\n}\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n @include font-size($font-size-base);\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid $popover-border-color;\n @include border-top-radius($popover-inner-border-radius);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n// even when their scroll action started on a carousel, but for compatibility (with Firefox)\n// we're preventing all actions instead\n// 2. The .carousel-item-start and .carousel-item-end is used to indicate where\n// the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-start and .active.carousel-item-end is the current\n// slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end\n// is the upcoming slide in transition.\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n @include clearfix();\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n/* rtl:end:ignore */\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n }\n\n .carousel-item.active,\n .carousel-item-next.carousel-item-start,\n .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n }\n\n .active.carousel-item-start,\n .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n @include transition(opacity 0s $carousel-transition-duration);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n padding: 0;\n color: $carousel-control-color;\n text-align: center;\n background: none;\n border: 0;\n opacity: $carousel-control-opacity;\n @include transition($carousel-control-transition);\n\n // Hover/focus state\n &:hover,\n &:focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: $carousel-control-hover-opacity;\n }\n}\n.carousel-control-prev {\n left: 0;\n background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);\n}\n.carousel-control-next {\n right: 0;\n background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n background-image: escape-svg($carousel-control-prev-icon-bg);\n}\n.carousel-control-next-icon {\n background-image: escape-svg($carousel-control-next-icon-bg);\n}\n\n// Optional indicator pips/controls\n//\n// Add a container (such as a list) with the following class and add an item (ideally a focusable control,\n// like a button) with data-bs-target for each slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-bottom: 1rem;\n margin-left: $carousel-control-width;\n list-style: none;\n\n [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n padding: 0;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n cursor: pointer;\n background-color: $carousel-indicator-active-bg;\n background-clip: padding-box;\n border: 0;\n // Use transparent borders to increase the hit area by 10px on top and bottom.\n border-top: $carousel-indicator-hit-area-height solid transparent;\n border-bottom: $carousel-indicator-hit-area-height solid transparent;\n opacity: $carousel-indicator-opacity;\n @include transition($carousel-indicator-transition);\n }\n\n .active {\n opacity: $carousel-indicator-active-opacity;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: (100% - $carousel-caption-width) * .5;\n bottom: $carousel-caption-spacer;\n left: (100% - $carousel-caption-width) * .5;\n padding-top: $carousel-caption-padding-y;\n padding-bottom: $carousel-caption-padding-y;\n color: $carousel-caption-color;\n text-align: center;\n}\n\n// Dark mode carousel\n\n.carousel-dark {\n .carousel-control-prev-icon,\n .carousel-control-next-icon {\n filter: $carousel-dark-control-icon-filter;\n }\n\n .carousel-indicators [data-bs-target] {\n background-color: $carousel-dark-indicator-active-bg;\n }\n\n .carousel-caption {\n color: $carousel-dark-caption-color;\n }\n}\n","// scss-docs-start clearfix\n@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n// scss-docs-end clearfix\n","//\n// Rotating border\n//\n\n// scss-docs-start spinner-border-keyframes\n@keyframes spinner-border {\n to { transform: rotate(360deg) #{\"/* rtl:ignore */\"}; }\n}\n// scss-docs-end spinner-border-keyframes\n\n.spinner-border {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: $spinner-vertical-align;\n border: $spinner-border-width solid currentColor;\n border-right-color: transparent;\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 50%;\n animation: $spinner-animation-speed linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n// scss-docs-start spinner-grow-keyframes\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n// scss-docs-end spinner-grow-keyframes\n\n.spinner-grow {\n display: inline-block;\n width: $spinner-width;\n height: $spinner-height;\n vertical-align: $spinner-vertical-align;\n background-color: currentColor;\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 50%;\n opacity: 0;\n animation: $spinner-animation-speed linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n width: $spinner-width-sm;\n height: $spinner-height-sm;\n}\n\n@if $enable-reduced-motion {\n @media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n animation-duration: $spinner-animation-speed * 2;\n }\n }\n}\n",".offcanvas {\n position: fixed;\n bottom: 0;\n z-index: $zindex-offcanvas;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: $offcanvas-color;\n visibility: hidden;\n background-color: $offcanvas-bg-color;\n background-clip: padding-box;\n outline: 0;\n @include box-shadow($offcanvas-box-shadow);\n @include transition(transform $offcanvas-transition-duration ease-in-out);\n}\n\n.offcanvas-backdrop {\n @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity);\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: $offcanvas-padding-y $offcanvas-padding-x;\n\n .btn-close {\n padding: ($offcanvas-padding-y * .5) ($offcanvas-padding-x * .5);\n margin-top: $offcanvas-padding-y * -.5;\n margin-right: $offcanvas-padding-x * -.5;\n margin-bottom: $offcanvas-padding-y * -.5;\n }\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: $offcanvas-title-line-height;\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: $offcanvas-padding-y $offcanvas-padding-x;\n overflow-y: auto;\n}\n\n.offcanvas-start {\n top: 0;\n left: 0;\n width: $offcanvas-horizontal-width;\n border-right: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateX(-100%);\n}\n\n.offcanvas-end {\n top: 0;\n right: 0;\n width: $offcanvas-horizontal-width;\n border-left: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateX(100%);\n}\n\n.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: $offcanvas-vertical-height;\n max-height: 100%;\n border-bottom: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n right: 0;\n left: 0;\n height: $offcanvas-vertical-height;\n max-height: 100%;\n border-top: $offcanvas-border-width solid $offcanvas-border-color;\n transform: translateY(100%);\n}\n\n.offcanvas.show {\n transform: none;\n}\n",".placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentColor;\n opacity: $placeholder-opacity-max;\n\n &.btn::before {\n display: inline-block;\n content: \"\";\n }\n}\n\n// Sizing\n.placeholder-xs {\n min-height: .6em;\n}\n\n.placeholder-sm {\n min-height: .8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n// Animation\n.placeholder-glow {\n .placeholder {\n animation: placeholder-glow 2s ease-in-out infinite;\n }\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: $placeholder-opacity-min;\n }\n}\n\n.placeholder-wave {\n mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);\n mask-size: 200% 100%;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n 100% {\n mask-position: -200% 0%;\n }\n}\n","@each $color, $value in $theme-colors {\n .link-#{$color} {\n color: $value;\n\n @if $link-shade-percentage != 0 {\n &:hover,\n &:focus {\n color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\n }\n }\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.ratio {\n position: relative;\n width: 100%;\n\n &::before {\n display: block;\n padding-top: var(--#{$variable-prefix}aspect-ratio);\n content: \"\";\n }\n\n > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n}\n\n@each $key, $ratio in $aspect-ratios {\n .ratio-#{$key} {\n --#{$variable-prefix}aspect-ratio: #{$ratio};\n }\n}\n","// Shorthand\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n// Responsive sticky top\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .sticky#{$infix}-top {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n }\n}\n","// scss-docs-start stacks\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n// scss-docs-end stacks\n","//\n// Visually hidden\n//\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n @include visually-hidden();\n}\n","// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n\n@mixin visually-hidden-focusable() {\n &:not(:focus):not(:focus-within) {\n @include visually-hidden();\n }\n}\n","//\n// Stretched link\n//\n\n.stretched-link {\n &::#{$stretched-link-pseudo-element} {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $stretched-link-z-index;\n content: \"\";\n }\n}\n","//\n// Text truncation\n//\n\n.text-truncate {\n @include text-truncate();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n",".vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentColor;\n opacity: $hr-opacity;\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (eg. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$variable-prefix}#{$property-class}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$variable-prefix}#{$property-class}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $value in $is-local-vars {\n --#{$variable-prefix}#{$local-var}: #{$value};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/pagetop-bootsier/static/images/caution.png b/pagetop-bootsier/static/images/caution.png new file mode 100644 index 0000000000000000000000000000000000000000..d059f6292c976a198c441cfda66e33ca79d3b76c GIT binary patch literal 12481 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 LNkvXXu0mjf`&SGI literal 0 HcmV?d00001 diff --git a/pagetop-bootsier/static/js/bootstrap.bundle.min.js b/pagetop-bootsier/static/js/bootstrap.bundle.min.js new file mode 100644 index 00000000..cc0a2556 --- /dev/null +++ b/pagetop-bootsier/static/js/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=(t,e,i)=>{Object.keys(i).forEach((n=>{const s=i[n],r=e[n],a=r&&o(r)?"element":null==(l=r)?`${l}`:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}))},l=t=>!(!o(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",(()=>{p.forEach((t=>t()))})),p.push(e)):e()},_=t=>{"function"==typeof t&&t()},b=(e,i,n=!0)=>{if(!n)return void _(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),_(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},v=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,E=/::\d+$/,A={};let T=1;const O={mouseenter:"mouseover",mouseleave:"mouseout"},C=/^(mouseenter|mouseleave)/i,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"]);function L(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function x(t){const e=L(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function D(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;s<o;s++){const o=t[n[s]];if(o.originalHandler===e&&o.delegationSelector===i)return o}return null}function S(t,e,i){const n="string"==typeof e,s=n?i:e;let o=P(t);return k.has(o)||(o=t),[n,s,o]}function N(t,e,i,n,s){if("string"!=typeof e||!t)return;if(i||(i=n,n=null),C.test(e)){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=S(e,i,n),l=x(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=L(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&j.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&j.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function I(t,e,i,n,s){const o=D(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function P(t){return t=t.replace(w,""),O[t]||t}const j={on(t,e,i,n){N(t,e,i,n,!1)},one(t,e,i,n){N(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void I(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach((o=>{if(o.includes(n)){const n=s[o];I(t,e,i,n.originalHandler,n.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const n=i.replace(E,"");if(!a||e.includes(n)){const e=h[i];I(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f(),s=P(e),o=e!==s,r=k.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};class B{constructor(t){(t=r(t))&&(this._element=t,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){b(t,e,i)}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class W extends B{static get NAME(){return"alert"}close(){if(j.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(W,"close"),g(W);const $='[data-bs-toggle="button"]';class z extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function q(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}j.on(document,"click.bs.button.data-api",$,(t=>{t.preventDefault();const e=t.target.closest($);z.getOrCreateInstance(e).toggle()})),g(z);const U={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=q(t.dataset[i])})),e},getDataAttribute:(t,e)=>q(t.getAttribute(`data-bs-${F(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!c(t)&&l(t)))}},K="carousel",X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Y={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Q="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z},et="slid.bs.carousel",it="active",nt=".active.carousel-item";class st extends B{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return K}next(){this._slide(Q)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),V.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(s(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=V.findOne(nt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,et,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?Q:G;this._slide(i,this._items[t])}_getConfig(t){return t={...X,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(K,t,Y),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&j.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),j.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};V.find(".carousel-item img",this._element).forEach((t=>{j.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?(j.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),j.on(this._element,"pointerup.bs.carousel",(t=>n(t))),this._element.classList.add("pointer-event")):(j.on(this._element,"touchstart.bs.carousel",(t=>e(t))),j.on(this._element,"touchmove.bs.carousel",(t=>i(t))),j.on(this._element,"touchend.bs.carousel",(t=>n(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?V.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===Q;return v(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),n=this._getItemIndex(V.findOne(nt,this._element));return j.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=V.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=V.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e<i.length;e++)if(Number.parseInt(i[e].getAttribute("data-bs-slide-to"),10)===this._getItemIndex(t)){i[e].classList.add(it),i[e].setAttribute("aria-current","true");break}}}_updateInterval(){const t=this._activeElement||V.findOne(nt,this._element);if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}_slide(t,e){const i=this._directionToOrder(t),n=V.findOne(nt,this._element),s=this._getItemIndex(n),o=e||this._getItemByOrder(i,n),r=this._getItemIndex(o),a=Boolean(this._interval),l=i===Q,c=l?"carousel-item-start":"carousel-item-end",h=l?"carousel-item-next":"carousel-item-prev",d=this._orderToDirection(i);if(o&&o.classList.contains(it))return void(this._isSliding=!1);if(this._isSliding)return;if(this._triggerSlideEvent(o,d).defaultPrevented)return;if(!n||!o)return;this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(o),this._activeElement=o;const f=()=>{j.trigger(this._element,et,{relatedTarget:o,direction:d,from:s,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),u(o),n.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(it),n.classList.remove(it,h,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,n,!0)}else n.classList.remove(it),o.classList.add(it),this._isSliding=!1,f();a&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?m()?t===Z?G:Q:t===Z?Q:G:t}_orderToDirection(t){return[Q,G].includes(t)?m()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const i=st.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){st.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=n(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),st.carouselInterface(e,i),s&&st.getInstance(e).to(s),t.preventDefault()}}j.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",st.dataApiClickHandler),j.on(window,"load.bs.carousel.data-api",(()=>{const t=V.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;e<i;e++)st.carouselInterface(t[e],st.getInstance(t[e]))})),g(st);const ot="collapse",rt={toggle:!0,parent:null},at={toggle:"boolean",parent:"(null|element)"},lt="show",ct="collapse",ht="collapsing",dt="collapsed",ut=":scope .collapse .collapse",ft='[data-bs-toggle="collapse"]';class pt extends B{constructor(t,e){super(t),this._isTransitioning=!1,this._config=this._getConfig(e),this._triggerArray=[];const n=V.find(ft);for(let t=0,e=n.length;t<e;t++){const e=n[t],s=i(e),o=V.find(s).filter((t=>t===this._element));null!==s&&o.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return rt}static get NAME(){return ot}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=V.find(ut,this._config.parent);e=V.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=V.findOne(this._selector);if(e.length){const n=e.find((t=>i!==t));if(t=n?pt.getInstance(n):null,t&&t._isTransitioning)return}if(j.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&pt.getOrCreateInstance(e,{toggle:!1}).hide(),t||H.set(e,"bs.collapse",null)}));const n=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const s=`scroll${n[0].toUpperCase()+n.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[n]="",j.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[n]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);const e=this._triggerArray.length;for(let t=0;t<e;t++){const e=this._triggerArray[t],i=n(e);i&&!this._isShown(i)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),j.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_getConfig(t){return(t={...rt,...U.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=r(t.parent),a(ot,t,at),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=V.find(ut,this._config.parent);V.find(ft,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=n(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(dt):t.classList.add(dt),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,"click.bs.collapse.data-api",ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this);V.find(e).forEach((t=>{pt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),g(pt);var mt="top",gt="bottom",_t="right",bt="left",vt="auto",yt=[mt,gt,_t,bt],wt="start",Et="end",At="clippingParents",Tt="viewport",Ot="popper",Ct="reference",kt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+Et])}),[]),Lt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+Et])}),[]),xt="beforeRead",Dt="read",St="afterRead",Nt="beforeMain",It="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",Bt=[xt,Dt,St,Nt,It,Pt,jt,Mt,Ht];function Rt(t){return t?(t.nodeName||"").toLowerCase():null}function Wt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function $t(t){return t instanceof Wt(t).Element||t instanceof Element}function zt(t){return t instanceof Wt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Wt(t).ShadowRoot||t instanceof ShadowRoot)}const Ft={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Rt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Rt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Ut(t){return t.split("-")[0]}function Vt(t,e){var i=t.getBoundingClientRect();return{width:i.width/1,height:i.height/1,top:i.top/1,right:i.right/1,bottom:i.bottom/1,left:i.left/1,x:i.left/1,y:i.top/1}}function Kt(t){var e=Vt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Xt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Yt(t){return Wt(t).getComputedStyle(t)}function Qt(t){return["table","td","th"].indexOf(Rt(t))>=0}function Gt(t){return(($t(t)?t.ownerDocument:t.document)||window.document).documentElement}function Zt(t){return"html"===Rt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||Gt(t)}function Jt(t){return zt(t)&&"fixed"!==Yt(t).position?t.offsetParent:null}function te(t){for(var e=Wt(t),i=Jt(t);i&&Qt(i)&&"static"===Yt(i).position;)i=Jt(i);return i&&("html"===Rt(i)||"body"===Rt(i)&&"static"===Yt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Yt(t).position)return null;for(var i=Zt(t);zt(i)&&["html","body"].indexOf(Rt(i))<0;){var n=Yt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function ee(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var ie=Math.max,ne=Math.min,se=Math.round;function oe(t,e,i){return ie(t,ne(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Ut(i.placement),l=ee(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Kt(o),u="y"===l?mt:bt,f="y"===l?gt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=te(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=oe(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Xt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:se(se(e*n)/n)||0,y:se(se(i*n)/n)||0}}(r):"function"==typeof h?h(r):r,u=d.x,f=void 0===u?0:u,p=d.y,m=void 0===p?0:p,g=r.hasOwnProperty("x"),_=r.hasOwnProperty("y"),b=bt,v=mt,y=window;if(c){var w=te(i),E="clientHeight",A="clientWidth";w===Wt(i)&&"static"!==Yt(w=Gt(i)).position&&"absolute"===a&&(E="scrollHeight",A="scrollWidth"),w=w,s!==mt&&(s!==bt&&s!==_t||o!==Et)||(v=gt,m-=w[E]-n.height,m*=l?1:-1),s!==bt&&(s!==mt&&s!==gt||o!==Et)||(b=_t,f-=w[A]-n.width,f*=l?1:-1)}var T,O=Object.assign({position:a},c&&he);return l?Object.assign({},O,((T={})[v]=_?"0":"",T[b]=g?"0":"",T.transform=(y.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",T)):Object.assign({},O,((e={})[v]=_?m+"px":"",e[b]=g?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Ut(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Wt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var me={left:"right",right:"left",bottom:"top",top:"bottom"};function ge(t){return t.replace(/left|right|bottom|top/g,(function(t){return me[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Wt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Vt(Gt(t)).left+ve(t).scrollLeft}function we(t){var e=Yt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Rt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ee(Zt(t))}function Ae(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Wt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ae(Zt(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e){return e===Tt?Te(function(t){var e=Wt(t),i=Gt(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):zt(e)?function(t){var e=Vt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=Gt(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ie(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ie(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Yt(s||i).direction&&(a+=ie(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Gt(t)))}function Ce(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Ut(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case mt:e={x:a,y:i.y-n.height};break;case gt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?ee(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Et:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?At:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ot:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=re("number"!=typeof p?p:ae(p,yt)),g=h===Ot?Ct:Ot,_=t.rects.popper,b=t.elements[u?g:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ae(Zt(t)),i=["absolute","fixed"].indexOf(Yt(t).position)>=0&&zt(t)?te(t):t;return $t(i)?e.filter((function(t){return $t(t)&&Xt(t,i)&&"body"!==Rt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Oe(t,i);return e.top=ie(n.top,e.top),e.right=ne(n.right,e.right),e.bottom=ne(n.bottom,e.bottom),e.left=ie(n.left,e.left),e}),Oe(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}($t(b)?b:b.contextElement||Gt(t.elements.popper),r,l),y=Vt(t.elements.reference),w=Ce({reference:y,element:_,strategy:"absolute",placement:s}),E=Te(Object.assign({},_,w)),A=h===Ot?E:y,T={top:v.top-A.top+m.top,bottom:A.bottom-v.bottom+m.bottom,left:v.left-A.left+m.left,right:A.right-v.right+m.right},O=t.modifiersData.offset;if(h===Ot&&O){var C=O[s];Object.keys(T).forEach((function(t){var e=[_t,gt].indexOf(t)>=0?1:-1,i=[mt,gt].indexOf(t)>=0?"y":"x";T[t]+=C[i]*e}))}return T}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?Lt:l,h=ce(n),d=h?a?kt:kt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Ut(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const xe={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=Ut(g),b=l||(_!==g&&p?function(t){if(Ut(t)===vt)return[];var e=ge(t);return[be(t),e,be(e)]}(g):[ge(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(Ut(i)===vt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O<v.length;O++){var C=v[O],k=Ut(C),L=ce(C)===wt,x=[mt,gt].indexOf(k)>=0,D=x?"width":"height",S=ke(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),N=x?L?_t:bt:L?gt:mt;y[D]>w[D]&&(N=ge(N));var I=ge(N),P=[];if(o&&P.push(S[k]<=0),a&&P.push(S[N]<=0,S[I]<=0),P.every((function(t){return t}))){T=C,A=!1;break}E.set(C,P)}if(A)for(var j=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[mt,_t,gt,bt].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ie={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=Lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Ut(t),s=[bt,mt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Ce({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Ut(e.placement),b=ce(e.placement),v=!b,y=ee(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?mt:bt,L="y"===y?gt:_t,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],N=E[y]-g[L],I=f?-T[x]/2:0,P=b===wt?A[x]:T[x],j=b===wt?-T[x]:-A[x],M=e.elements.arrow,H=f&&M?Kt(M):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=B[k],W=B[L],$=oe(0,A[x],H[x]),z=v?A[x]/2-I-$-R-O:P-$-R-O,q=v?-A[x]/2+I+$+W+O:j+$+W+O,F=e.elements.arrow&&te(e.elements.arrow),U=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-U,X=E[y]+q-V;if(o){var Y=oe(f?ne(S,K):S,D,f?ie(N,X):N);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?mt:bt,G="x"===y?gt:_t,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=oe(f?ne(J,K):J,Z,f?ie(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n=zt(e);zt(e)&&function(t){var e=t.getBoundingClientRect();e.width,t.offsetWidth,e.height,t.offsetHeight}(e);var s,o,r=Gt(e),a=Vt(t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(n||!n&&!i)&&(("body"!==Rt(e)||we(r))&&(l=(s=e)!==Wt(s)&&zt(s)?{scrollLeft:(o=s).scrollLeft,scrollTop:o.scrollTop}:ve(s)),zt(e)?((c=Vt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=ye(r))),{x:a.left+l.scrollLeft-c.x,y:a.top+l.scrollTop-c.y,width:a.width,height:a.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Re(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function We(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?Be:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},Be,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:$t(t)?Ae(t):t.contextElement?Ae(t.contextElement):[],popper:Ae(e)};var r,c,u=function(t){var e=He(t);return Bt.reduce((function(t,i){return t.concat(e.filter((function(t){return t.phase===i})))}),[])}((r=[].concat(n,a.options.modifiers),c=r.reduce((function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=u.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}})),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(Re(e,i)){a.rects={reference:Me(e,te(i),"fixed"===a.options.strategy),popper:Kt(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise((function(t){h.forceUpdate(),t(a)}))},function(){return r||(r=new Promise((function(t){Promise.resolve().then((function(){r=void 0,t(s())}))}))),r}),destroy:function(){d(),c=!0}};if(!Re(t,e))return h;function d(){l.forEach((function(t){return t()})),l=[]}return h.setOptions(i).then((function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)})),h}}var $e=We(),ze=We({defaultModifiers:[pe,Pe,ue,Ft]}),qe=We({defaultModifiers:[pe,Pe,ue,Ft,Ie,xe,je,le,Ne]});const Fe=Object.freeze({__proto__:null,popperGenerator:We,detectOverflow:ke,createPopperBase:$e,createPopper:qe,createPopperLite:ze,top:mt,bottom:gt,right:_t,left:bt,auto:vt,basePlacements:yt,start:wt,end:Et,clippingParents:At,viewport:Tt,popper:Ot,reference:Ct,variationPlacements:kt,placements:Lt,beforeRead:xt,read:Dt,afterRead:St,beforeMain:Nt,main:It,afterMain:Pt,beforeWrite:jt,write:Mt,afterWrite:Ht,modifierPhases:Bt,applyStyles:Ft,arrow:le,computeStyles:ue,eventListeners:pe,flip:xe,hide:Ne,offset:Ie,popperOffsets:Pe,preventOverflow:je}),Ue="dropdown",Ve="Escape",Ke="Space",Xe="ArrowUp",Ye="ArrowDown",Qe=new RegExp("ArrowUp|ArrowDown|Escape"),Ge="click.bs.dropdown.data-api",Ze="keydown.bs.dropdown.data-api",Je="show",ti='[data-bs-toggle="dropdown"]',ei=".dropdown-menu",ii=m()?"top-end":"top-start",ni=m()?"top-start":"top-end",si=m()?"bottom-end":"bottom-start",oi=m()?"bottom-start":"bottom-end",ri=m()?"left-start":"right-start",ai=m()?"right-start":"left-start",li={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},ci={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class hi extends B{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar()}static get Default(){return li}static get DefaultType(){return ci}static get NAME(){return Ue}toggle(){return this._isShown()?this.hide():this.show()}show(){if(c(this._element)||this._isShown(this._menu))return;const t={relatedTarget:this._element};if(j.trigger(this._element,"show.bs.dropdown",t).defaultPrevented)return;const e=hi.getParentFromElement(this._element);this._inNavbar?U.setDataAttribute(this._menu,"popper","none"):this._createPopper(e),"ontouchstart"in document.documentElement&&!e.closest(".navbar-nav")&&[].concat(...document.body.children).forEach((t=>j.on(t,"mouseover",d))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Je),this._element.classList.add(Je),j.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(c(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){j.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._popper&&this._popper.destroy(),this._menu.classList.remove(Je),this._element.classList.remove(Je),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},a(Ue,t,this.constructor.DefaultType),"object"==typeof t.reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===Fe)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:o(this._config.reference)?e=r(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=qe(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(Je)}_getMenuElement(){return V.next(this._element,ei)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ri;if(t.classList.contains("dropstart"))return ai;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ni:ii:e?oi:si}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(l);i.length&&v(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=V.find(ti);for(let i=0,n=e.length;i<n;i++){const n=hi.getInstance(e[i]);if(!n||!1===n._config.autoClose)continue;if(!n._isShown())continue;const s={relatedTarget:n._element};if(t){const e=t.composedPath(),i=e.includes(n._menu);if(e.includes(n._element)||"inside"===n._config.autoClose&&!i||"outside"===n._config.autoClose&&i)continue;if(n._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;"click"===t.type&&(s.clickEvent=t)}n._completeHide(s)}}static getParentFromElement(t){return n(t)||t.parentNode}static dataApiKeydownHandler(t){if(/input|textarea/i.test(t.target.tagName)?t.key===Ke||t.key!==Ve&&(t.key!==Ye&&t.key!==Xe||t.target.closest(ei)):!Qe.test(t.key))return;const e=this.classList.contains(Je);if(!e&&t.key===Ve)return;if(t.preventDefault(),t.stopPropagation(),c(this))return;const i=this.matches(ti)?this:V.prev(this,ti)[0],n=hi.getOrCreateInstance(i);if(t.key!==Ve)return t.key===Xe||t.key===Ye?(e||n.show(),void n._selectMenuItem(t)):void(e&&t.key!==Ke||hi.clearMenus());n.hide()}}j.on(document,Ze,ti,hi.dataApiKeydownHandler),j.on(document,Ze,ei,hi.dataApiKeydownHandler),j.on(document,Ge,hi.clearMenus),j.on(document,"keyup.bs.dropdown.data-api",hi.clearMenus),j.on(document,Ge,ti,(function(t){t.preventDefault(),hi.getOrCreateInstance(this).toggle()})),g(hi);const di=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",ui=".sticky-top";class fi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",(e=>e+t)),this._setElementAttributes(di,"paddingRight",(e=>e+t)),this._setElementAttributes(ui,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(s))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(di,"paddingRight"),this._resetElementAttributes(ui,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&U.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=U.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(U.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){o(t)?e(t):V.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const pi={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},mi={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},gi="show",_i="mousedown.bs.backdrop";class bi{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&u(this._getElement()),this._getElement().classList.add(gi),this._emulateAnimation((()=>{_(t)}))):_(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(gi),this._emulateAnimation((()=>{this.dispose(),_(t)}))):_(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...pi,..."object"==typeof t?t:{}}).rootElement=r(t.rootElement),a("backdrop",t,mi),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),j.on(this._getElement(),_i,(()=>{_(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&(j.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const vi={trapElement:null,autofocus:!0},yi={trapElement:"element",autofocus:"boolean"},wi=".bs.focustrap",Ei="backward";class Ai{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),j.off(document,wi),j.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),j.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,wi))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const n=V.focusableChildren(i);0===n.length?i.focus():this._lastTabNavDirection===Ei?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ei:"forward")}_getConfig(t){return t={...vi,..."object"==typeof t?t:{}},a("focustrap",t,yi),t}}const Ti="modal",Oi="Escape",Ci={backdrop:!0,keyboard:!0,focus:!0},ki={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},Li="hidden.bs.modal",xi="show.bs.modal",Di="resize.bs.modal",Si="click.dismiss.bs.modal",Ni="keydown.dismiss.bs.modal",Ii="mousedown.dismiss.bs.modal",Pi="modal-open",ji="show",Mi="modal-static";class Hi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new fi}static get Default(){return Ci}static get NAME(){return Ti}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(Pi),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),j.on(this._dialog,Ii,(()=>{j.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if(j.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(ji),j.off(this._element,Si),j.off(this._dialog,Ii),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>j.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_getConfig(t){return t={...Ci,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Ti,t,ki),t}_showElement(t){const e=this._isAnimated(),i=V.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||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,i&&(i.scrollTop=0),e&&u(this._element),this._element.classList.add(ji),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?j.on(this._element,Ni,(t=>{this._config.keyboard&&t.key===Oi?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Oi||this._triggerBackdropTransition()})):j.off(this._element,Ni)}_setResizeEvent(){this._isShown?j.on(window,Di,(()=>this._adjustDialog())):j.off(window,Di)}_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(Pi),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,Li)}))}_showBackdrop(t){j.on(this._element,Si,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains(Mi)||(n||(i.overflowY="hidden"),t.add(Mi),this._queueCallback((()=>{t.remove(Mi),n||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!m()||i&&!t&&m())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!m()||!i&&t&&m())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,xi,(t=>{t.defaultPrevented||j.one(e,Li,(()=>{l(this)&&this.focus()}))}));const i=V.findOne(".modal.show");i&&Hi.getInstance(i).hide(),Hi.getOrCreateInstance(e).toggle(this)})),R(Hi),g(Hi);const Bi="offcanvas",Ri={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},$i="show",zi=".offcanvas.show",qi="hidden.bs.offcanvas";class Fi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return Bi}static get Default(){return Ri}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($i),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),j.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove($i),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new fi).reset(),j.trigger(this._element,qi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...Ri,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Bi,t,Wi),t}_initializeBackDrop(){return new bi({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_addEventListeners(){j.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;j.one(e,qi,(()=>{l(this)&&this.focus()}));const i=V.findOne(zi);i&&i!==e&&Fi.getInstance(i).hide(),Fi.getOrCreateInstance(e).toggle(this)})),j.on(window,"load.bs.offcanvas.data-api",(()=>V.find(zi).forEach((t=>Fi.getOrCreateInstance(t).show())))),R(Fi),g(Fi);const Ui=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ki=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Xi=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!Ui.has(i)||Boolean(Vi.test(t.nodeValue)||Ki.test(t.nodeValue));const n=e.filter((t=>t instanceof RegExp));for(let t=0,e=n.length;t<e;t++)if(n[t].test(i))return!0;return!1};function Yi(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(let t=0,i=s.length;t<i;t++){const i=s[t],n=i.nodeName.toLowerCase();if(!Object.keys(e).includes(n)){i.remove();continue}const o=[].concat(...i.attributes),r=[].concat(e["*"]||[],e[n]||[]);o.forEach((t=>{Xi(t,r)||i.removeAttribute(t.nodeName)}))}return n.body.innerHTML}const Qi="tooltip",Gi=new Set(["sanitize","allowList","sanitizeFn"]),Zi={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Ji={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},tn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],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:[]},popperConfig:null},en={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},nn="fade",sn="show",on="show",rn="out",an=".tooltip-inner",ln=".modal",cn="hide.bs.modal",hn="hover",dn="focus";class un extends B{constructor(t,e){if(void 0===Fe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return tn}static get NAME(){return Qi}static get Event(){return en}static get DefaultType(){return Zi}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(sn))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ln),cn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.Event.SHOW),e=h(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(an).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),s=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this._config.animation&&n.classList.add(nn);const o="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,r=this._getAttachment(o);this._addAttachmentClass(r);const{container:a}=this._config;H.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(a.append(n),j.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=qe(this._element,n,this._getPopperConfig(r)),n.classList.add(sn);const l=this._resolvePossibleFunction(this._config.customClass);l&&n.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{j.on(t,"mouseover",d)}));const c=this.tip.classList.contains(nn);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,j.trigger(this._element,this.constructor.Event.SHOWN),t===rn&&this._leave(null,this)}),this.tip,c)}hide(){if(!this._popper)return;const t=this.getTipElement();if(j.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(sn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(nn);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==on&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(nn,sn),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),an)}_sanitizeAndSetContent(t,e,i){const n=V.findOne(i,t);e||!n?this.setElementContent(n,e):n.remove()}setElementContent(t,e){if(null!==t)return o(e)?(e=r(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Yi(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,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:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return Ji[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)j.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===hn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===hn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;j.on(this._element,e,this._config.selector,(t=>this._enter(t))),j.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ln),cn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?dn:hn]=!0),e.getTipElement().classList.contains(sn)||e._hoverState===on?e._hoverState=on:(clearTimeout(e._timeout),e._hoverState=on,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===on&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?dn:hn]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=rn,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===rn&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Gi.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a(Qi,t,this.constructor.DefaultType),t.sanitize&&(t.template=Yi(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn={...un.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'},pn={...un.DefaultType,content:"(string|element|function)"},mn={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class gn extends un{static get Default(){return fn}static get NAME(){return"popover"}static get Event(){return mn}static get DefaultType(){return pn}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=gn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(gn);const _n="scrollspy",bn={offset:10,method:"auto",target:""},vn={offset:"number",method:"string",target:"(string|element)"},yn="active",wn=".nav-link, .list-group-item, .dropdown-item",En="position";class An extends B{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,j.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return bn}static get NAME(){return _n}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":En,e="auto"===this._config.method?t:this._config.method,n=e===En?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),V.find(wn,this._config.target).map((t=>{const s=i(t),o=s?V.findOne(s):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[U[e](o).top+n,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){j.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...bn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=r(t.target)||document.documentElement,a(_n,t,vn),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t<this._offsets[e+1])&&this._activate(this._targets[e])}}_activate(t){this._activeTarget=t,this._clear();const e=wn.split(",").map((e=>`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=V.findOne(e.join(","),this._config.target);i.classList.add(yn),i.classList.contains("dropdown-item")?V.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(yn):V.parents(i,".nav, .list-group").forEach((t=>{V.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(yn))),V.prev(t,".nav-item").forEach((t=>{V.children(t,".nav-link").forEach((t=>t.classList.add(yn)))}))})),j.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){V.find(wn,this._config.target).filter((t=>t.classList.contains(yn))).forEach((t=>t.classList.remove(yn)))}static jQueryInterface(t){return this.each((function(){const e=An.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,"load.bs.scrollspy.data-api",(()=>{V.find('[data-bs-spy="scroll"]').forEach((t=>new An(t)))})),g(An);const Tn="active",On="fade",Cn="show",kn=".active",Ln=":scope > li > .active";class xn extends B{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Tn))return;let t;const e=n(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?Ln:kn;t=V.find(e,i),t=t[t.length-1]}const s=t?j.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(j.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const o=()=>{j.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),j.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?V.children(e,kn):V.find(Ln,e))[0],s=i&&n&&n.classList.contains(On),o=()=>this._transitionComplete(t,n,i);n&&s?(n.classList.remove(Cn),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Tn);const t=V.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Tn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Tn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),u(t),t.classList.contains(On)&&t.classList.add(Cn);let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&V.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Tn))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||xn.getOrCreateInstance(this).show()})),g(xn);const Dn="toast",Sn="hide",Nn="show",In="showing",Pn={animation:"boolean",autohide:"boolean",delay:"number"},jn={animation:!0,autohide:!0,delay:5e3};class Mn extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Pn}static get Default(){return jn}static get NAME(){return Dn}show(){j.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Sn),u(this._element),this._element.classList.add(Nn),this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.remove(In),j.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(Nn)&&(j.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.add(Sn),this._element.classList.remove(In),this._element.classList.remove(Nn),j.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(Nn)&&this._element.classList.remove(Nn),super.dispose()}_getConfig(t){return t={...jn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},a(Dn,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),j.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Mn),g(Mn),{Alert:W,Button:z,Carousel:st,Collapse:pt,Dropdown:hi,Modal:Hi,Offcanvas:Fi,Popover:gn,ScrollSpy:An,Tab:xn,Toast:Mn,Tooltip:un}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map b/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map new file mode 100644 index 00000000..7d78e32a --- /dev/null +++ b/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/dom/selector-engine.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["TRANSITION_END","getSelector","element","selector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","document","querySelector","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","nodeType","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","call","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","querySelectorAll","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","static","getInstance","VERSION","Error","enableDismissTrigger","component","method","clickEvent","tagName","closest","getOrCreateInstance","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","filter","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","pageYOffset","left","pageXOffset","position","offsetTop","offsetLeft","SelectorEngine","find","concat","Element","prototype","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","EVENT_SLID","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE_ITEM","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","hasPointerPenTouch","pointerType","start","clientX","touches","move","end","clearTimeout","itemImg","add","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElem","_selector","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activesData","actives","container","tempActiveData","elemActive","dimension","_getDimension","style","scrollSize","triggerArrayLength","selected","triggerArray","isOpen","bottom","right","auto","basePlacements","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","styles","assign","effect","_ref2","initialStyles","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","includeScale","width","height","x","y","getLayoutRect","clientRect","offsetWidth","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","userAgent","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","round","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","_ref3","dpr","devicePixelRatio","roundOffsetsByDPR","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","computeStyles$1","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","scrollTop","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","visualViewport","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","html","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_min","_max","_preventedOffset","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","_len","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref3$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ESCAPE_KEY","SPACE_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","REGEXP_KEYDOWN","EVENT_CLICK_DATA_API","EVENT_KEYDOWN_DATA_API","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","isDisplayStatic","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","items","toggles","context","composedPath","isMenuTarget","isActive","stopPropagation","getToggleButton","clearMenus","dataApiKeydownHandler","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","styleProp","scrollbarWidth","_applyManipulationCallback","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","className","rootElement","clickCallback","EVENT_MOUSEDOWN","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","trapElement","autofocus","TAB_NAV_BACKWARD","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","EVENT_HIDDEN","EVENT_SHOW","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","_triggerBackdropTransition","_resetAdjustments","currentTarget","isModalOverflowing","isBodyOverflowing","paddingLeft","paddingRight","showEvent","allReadyOpen","OPEN_SELECTOR","Offcanvas","visibility","blur","uriAttributes","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","regExp","attributeRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","DISALLOWED_ATTRIBUTES","animation","template","title","delay","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","CLASS_NAME_FADE","HOVER_STATE_SHOW","HOVER_STATE_OUT","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","_disposePopper","isWithContent","shadowRoot","isInTheDom","getTitle","tipId","prefix","floor","random","getElementById","getUID","attachment","_getAttachment","_addAttachmentClass","_resolvePossibleFunction","prevHoverState","_cleanTipClass","setContent","_sanitizeAndSetContent","content","templateElement","setElementContent","textContent","updateAttachment","_getDelegateConfig","_handlePopperPlacementChange","_getBasicClassPrefix","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","basicClassPrefixRegex","tabClass","token","tClass","Popover","_getContent","SELECTOR_LINK_ITEMS","METHOD_POSITION","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","listGroup","navItem","spy","SELECTOR_ACTIVE","SELECTOR_ACTIVE_UL","Tab","listElement","itemSelector","hideEvent","complete","active","isTransitioning","_transitionComplete","dropdownChild","dropdownElement","dropdown","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return document.querySelector(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight\n}\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.3'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + window.pageYOffset,\n left: rect.left + window.pageXOffset\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible } from '../util/index'\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const hasPointerPenTouch = event => {\n return this._pointerEvent &&\n (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n const start = event => {\n if (hasPointerPenTouch(event)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (hasPointerPenTouch(event)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: null\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(null|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let actives = []\n let activesData\n\n if (this._config.parent) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives.length) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !this._isShown(elem)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n })\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","// import { isHTMLElement } from './instanceOf';\nexport default function getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars\nincludeScale) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n var rect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1; // FIXME:\n // `offsetWidth` returns an integer while `getBoundingClientRect`\n // returns a float. This results in `scaleX` or `scaleY` being\n // non-1 when it should be for elements that aren't a full pixel in\n // width or height.\n // if (isHTMLElement(element) && includeScale) {\n // const offsetHeight = element.offsetHeight;\n // const offsetWidth = element.offsetWidth;\n // // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n // // Fallback to 1 in case both values are `0`\n // if (offsetWidth > 0) {\n // scaleX = rect.width / offsetWidth || 1;\n // }\n // if (offsetHeight > 0) {\n // scaleY = rect.height / offsetHeight || 1;\n // }\n // }\n\n return {\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n top: rect.top / scaleY,\n right: rect.right / scaleX,\n bottom: rect.bottom / scaleY,\n left: rect.left / scaleX,\n x: rect.left / scaleX,\n y: rect.top / scaleY\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport default function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport within from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(round(x * dpr) / dpr) || 0,\n y: round(round(y * dpr) / dpr) || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets;\n\n var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n _ref3$x = _ref3.x,\n x = _ref3$x === void 0 ? 0 : _ref3$x,\n _ref3$y = _ref3.y,\n y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom; // $FlowFixMe[prop-missing]\n\n y -= offsetParent[heightProp] - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right; // $FlowFixMe[prop-missing]\n\n x -= offsetParent[widthProp] - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n var state = _ref4.state,\n options = _ref4.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport within from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { max as mathMax, min as mathMin } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis || checkAltAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n if (checkMainAxis) {\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(tether ? mathMin(_min, tetherMin) : _min, _offset, tether ? mathMax(_max, tetherMax) : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = rect.width / element.offsetWidth || 1;\n var scaleY = rect.height / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n this._createPopper(parent)\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown(this._menu)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper(parent) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._isShown()) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (event.key === ESCAPE_KEY) {\n instance.hide()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n instance.show()\n }\n\n instance._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n className: 'modal-backdrop',\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n className: 'string',\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.append(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport SelectorEngine from '../dom/selector-engine'\nimport { typeCheckConfig } from './index'\n\nconst Default = {\n trapElement: null, // The element to trap focus inside of\n autofocus: true\n}\n\nconst DefaultType = {\n trapElement: 'element',\n autofocus: 'boolean'\n}\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nclass FocusTrap {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n activate() {\n const { trapElement, autofocus } = this._config\n\n if (this._isActive) {\n return\n }\n\n if (autofocus) {\n trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n\n _handleFocusin(event) {\n const { target } = event\n const { trapElement } = this._config\n\n if (target === document || target === trapElement || trapElement.contains(target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking moddal toggler while another one is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen) {\n Modal.getInstance(allReadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\nimport FocusTrap from './util/focustrap'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n if (!this._config.scroll) {\n this._focustrap.activate()\n }\n\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\nenableDismissTrigger(Offcanvas)\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attributeName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const element = elements[i]\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n attributeList.forEach(attribute => {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport { DefaultAllowlist, sanitizeHtml } from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n // This will be removed later in favor of a `setContent` method\n if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n this._disposePopper()\n this.tip.remove()\n this.tip = null\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = this._resolvePossibleFunction(this._config.customClass)\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n this._disposePopper()\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n const tip = element.children[0]\n this.setContent(tip)\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n\n this.tip = tip\n return this.tip\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER)\n }\n\n _sanitizeAndSetContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!content && templateElement) {\n templateElement.remove()\n return\n }\n\n // we use append for html objects to maintain js events\n this.setElementContent(templateElement, content)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.append(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n const title = this._element.getAttribute('data-bs-original-title') || this._config.title\n\n return this._resolvePossibleFunction(title)\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(content) {\n return typeof content === 'function' ? content.call(this._element) : content\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g')\n const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n setContent(tip) {\n this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE)\n this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT)\n }\n\n // Private\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n _getBasicClassPrefix() {\n return CLASS_PREFIX\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n\n // Handle special case when .nav-link is inside .nav-item\n SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)\n .forEach(navItem => {\n SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n })\n })\n }\n\n EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n SelectorEngine.find(SELECTOR_DATA_SPY)\n .forEach(spy => new ScrollSpy(spy))\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n reflow\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_UL = ':scope > li > .active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n if ((this._element.parentNode &&\n this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n this._element.classList.contains(CLASS_NAME_ACTIVE))) {\n return\n }\n\n let previous\n const target = getElementFromSelector(this._element)\n const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP)\n\n if (listElement) {\n const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE\n previous = SelectorEngine.find(itemSelector, listElement)\n previous = previous[previous.length - 1]\n }\n\n const hideEvent = previous ?\n EventHandler.trigger(previous, EVENT_HIDE, {\n relatedTarget: this._element\n }) :\n null\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget: previous\n })\n\n if (showEvent.defaultPrevented || (hideEvent !== null && hideEvent.defaultPrevented)) {\n return\n }\n\n this._activate(this._element, listElement)\n\n const complete = () => {\n EventHandler.trigger(previous, EVENT_HIDDEN, {\n relatedTarget: this._element\n })\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget: previous\n })\n }\n\n if (target) {\n this._activate(target, target.parentNode, complete)\n } else {\n complete()\n }\n }\n\n // Private\n\n _activate(element, container, callback) {\n const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?\n SelectorEngine.find(SELECTOR_ACTIVE_UL, container) :\n SelectorEngine.children(container, SELECTOR_ACTIVE)\n\n const active = activeElements[0]\n const isTransitioning = callback && (active && active.classList.contains(CLASS_NAME_FADE))\n\n const complete = () => this._transitionComplete(element, active, callback)\n\n if (active && isTransitioning) {\n active.classList.remove(CLASS_NAME_SHOW)\n this._queueCallback(complete, element, true)\n } else {\n complete()\n }\n }\n\n _transitionComplete(element, active, callback) {\n if (active) {\n active.classList.remove(CLASS_NAME_ACTIVE)\n\n const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode)\n\n if (dropdownChild) {\n dropdownChild.classList.remove(CLASS_NAME_ACTIVE)\n }\n\n if (active.getAttribute('role') === 'tab') {\n active.setAttribute('aria-selected', false)\n }\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n if (element.getAttribute('role') === 'tab') {\n element.setAttribute('aria-selected', true)\n }\n\n reflow(element)\n\n if (element.classList.contains(CLASS_NAME_FADE)) {\n element.classList.add(CLASS_NAME_SHOW)\n }\n\n let parent = element.parentNode\n if (parent && parent.nodeName === 'LI') {\n parent = parent.parentNode\n }\n\n if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n const dropdownElement = element.closest(SELECTOR_DROPDOWN)\n\n if (dropdownElement) {\n SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)\n .forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE))\n }\n\n element.setAttribute('aria-expanded', true)\n }\n\n if (callback) {\n callback()\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const data = Tab.getOrCreateInstance(this)\n data.show()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tab to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING)\n this._element.classList.remove(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n return config\n }\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout':\n this._hasMouseInteraction = isInteracting\n break\n case 'focusin':\n case 'focusout':\n this._hasKeyboardInteraction = isInteracting\n break\n default:\n break\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\nenableDismissTrigger(Toast)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Toast to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert'\nimport Button from './src/button'\nimport Carousel from './src/carousel'\nimport Collapse from './src/collapse'\nimport Dropdown from './src/dropdown'\nimport Modal from './src/modal'\nimport Offcanvas from './src/offcanvas'\nimport Popover from './src/popover'\nimport ScrollSpy from './src/scrollspy'\nimport Tab from './src/tab'\nimport Toast from './src/toast'\nimport Tooltip from './src/tooltip'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"]} \ No newline at end of file From 541b024d8e462f7fda2d0ef81b4b165b13d06207 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Feb 2023 08:55:04 +0100 Subject: [PATCH 271/853] =?UTF-8?q?=F0=9F=8E=89=20[bulmix]=20Saca=20tema?= =?UTF-8?q?=20del=20c=C3=B3digo=20base=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 23 +++ pagetop-bulmix/README.md | 27 ++++ pagetop-bulmix/build.rs | 3 + pagetop-bulmix/src/lib.rs | 135 ++++++++++++++++++ pagetop-bulmix/static/css/bulma-rtl.min.css | 1 + .../static/css/bulma-rtl.min.css.map | 1 + pagetop-bulmix/static/css/bulma.min.css | 1 + pagetop-bulmix/static/css/bulma.min.css.map | 1 + 8 files changed, 192 insertions(+) create mode 100644 pagetop-bulmix/Cargo.toml create mode 100644 pagetop-bulmix/README.md create mode 100644 pagetop-bulmix/build.rs create mode 100644 pagetop-bulmix/src/lib.rs create mode 100644 pagetop-bulmix/static/css/bulma-rtl.min.css create mode 100644 pagetop-bulmix/static/css/bulma-rtl.min.css.map create mode 100644 pagetop-bulmix/static/css/bulma.min.css create mode 100644 pagetop-bulmix/static/css/bulma.min.css.map diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml new file mode 100644 index 00000000..042d296c --- /dev/null +++ b/pagetop-bulmix/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "pagetop-bulmix" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Theme for PageTop that uses the Bulma framework for page layout and component display.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +pagetop = { path = "../pagetop", version = "0.0" } +pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } +static-files = "0.2.3" +maud = "0.24.0" + +[build-dependencies] +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-bulmix/README.md b/pagetop-bulmix/README.md new file mode 100644 index 00000000..ead90161 --- /dev/null +++ b/pagetop-bulmix/README.md @@ -0,0 +1,27 @@ +Tema para **PageTop** que utiliza el *framework* [Bulma](https://bulma.io/) para la composición de +páginas y visualización de componentes. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-bulmix/build.rs b/pagetop-bulmix/build.rs new file mode 100644 index 00000000..60a4c39f --- /dev/null +++ b/pagetop-bulmix/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static", "bulmix", None) +} diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs new file mode 100644 index 00000000..8c7f1e96 --- /dev/null +++ b/pagetop-bulmix/src/lib.rs @@ -0,0 +1,135 @@ +use pagetop::prelude::*; + +pub_handle!(THEME_BULMIX); + +include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); + +pub struct Bulmix; + +impl ModuleTrait for Bulmix { + fn handle(&self) -> Handle { + THEME_BULMIX + } + + fn theme(&self) -> Option<ThemeStaticRef> { + Some(&Bulmix) + } + + fn dependencies(&self) -> Vec<ModuleStaticRef> { + vec![&pagetop_jquery::JQuery] + } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/bulmix", bundle_bulmix); + } +} + +impl ThemeTrait for Bulmix { + fn before_render_page(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::located("/bulmix/css/bulma.min.css") + .with_version("0.9.4") + .with_weight(-99), + )); + pagetop_jquery::JQuery::add_jquery(page.context()); + } + + #[rustfmt::skip] + fn before_render_component( + &self, + component: &mut dyn ComponentTrait, + _rcx: &mut RenderContext, + ) { + match component.handle() { + COMPONENT_ANCHOR => { + let a = component_mut::<Anchor>(component); + a.alter_classes( + ClassesOp::SetDefault, + match a.anchor_type() { + AnchorType::Button => "button is-primary", + _ => "", + }, + ); + } + COMPONENT_HEADING => { + let h = component_mut::<Heading>(component); + h.alter_classes( + ClassesOp::SetDefault, + match h.display() { + HeadingDisplay::XxLarge => "title is-1", + HeadingDisplay::Large => "title is-2", + HeadingDisplay::Medium => "title is-3", + HeadingDisplay::Small => "title is-4", + HeadingDisplay::XxSmall => "title is-5", + HeadingDisplay::Normal => "title", + HeadingDisplay::Subtitle => "subtitle", + }, + ); + } + COMPONENT_PARAGRAPH => { + let p = component_mut::<Paragraph>(component); + p.alter_classes( + ClassesOp::SetDefault, + match p.display() { + ParagraphDisplay::XxLarge => "is-size-2", + ParagraphDisplay::Large => "is-size-3", + ParagraphDisplay::Medium => "is-size-4", + ParagraphDisplay::Small => "is-size-5", + ParagraphDisplay::XxSmall => "is-size-6", + ParagraphDisplay::Normal => "", + }, + ); + } + grid::COMPONENT_COLUMN => { + let col = component_mut::<grid::Column>(component); + col.alter_classes( + ClassesOp::SetDefault, + concat_string!( + "column", + match col.size() { + grid::ColumnSize::Default => "", + grid::ColumnSize::Is1of12 => " is-1", + grid::ColumnSize::Is2of12 => " is-2", + grid::ColumnSize::Is3of12 => " is-3", + grid::ColumnSize::Is4of12 => " is-4", + grid::ColumnSize::Is5of12 => " is-5", + grid::ColumnSize::Is6of12 => " is-6", + grid::ColumnSize::Is7of12 => " is-7", + grid::ColumnSize::Is8of12 => " is-8", + grid::ColumnSize::Is9of12 => " is-9", + grid::ColumnSize::Is10of12 => " is-10", + grid::ColumnSize::Is11of12 => " is-11", + grid::ColumnSize::IsFull => " is-12", + }, + " content" + ) + .as_str(), + ); + } + grid::COMPONENT_ROW => { + let row = component_mut::<grid::Row>(component); + row.alter_classes(ClassesOp::SetDefault, "columns"); + } + _ => {} + } + } + + fn render_component( + &self, + component: &dyn ComponentTrait, + _rcx: &mut RenderContext, + ) -> Option<Markup> { + match component.handle() { + COMPONENT_ICON => { + let icon = component_ref::<Icon>(component); + Some(html! { + span class="icon" { + i class=[icon.classes().get()] {}; + } + }) + } + _ => None, + } + } +} diff --git a/pagetop-bulmix/static/css/bulma-rtl.min.css b/pagetop-bulmix/static/css/bulma-rtl.min.css new file mode 100644 index 00000000..65f54069 --- /dev/null +++ b/pagetop-bulmix/static/css/bulma-rtl.min.css @@ -0,0 +1 @@ +/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-right:calc(-.5em - 1px);margin-left:.25em}.button .icon:last-child:not(:first-child){margin-right:.25em;margin-left:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:#00d1b2;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:#485fc7;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:#3e8ed0;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:#48c78e;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:#ffe08a;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:#f14668;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-left:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-left:-1px}.buttons.has-addons .button:last-child{margin-left:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.button.is-responsive.is-small{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-right:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-right:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-right:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-right:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-left:.25em}.icon-text .icon:not(:first-child){margin-right:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 1.5rem 1.25rem 2.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{left:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-left:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-left:0}.tags.has-addons .tag:not(:first-child){margin-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.tags.has-addons .tag:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-right:.25rem;margin-left:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-right:-.375em;margin-left:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-right:.1875em;margin-left:-.375em}.tag:not(body) .icon:first-child:last-child{margin-right:-.375em;margin-left:-.375em}.tag:not(body).is-delete{margin-right:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-right:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;left:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-right:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-left:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a!important;opacity:.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;left:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-left:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-left:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-left:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-left:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-left:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;left:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-right:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-left:.5em}.breadcrumb .icon:last-child{margin-right:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-left:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;right:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-left:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-left:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-left:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-left:1rem}.media-right{margin-right:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-right:1px solid #dbdbdb;margin:.75em;padding-right:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-right:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;left:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-left:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-right:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-left:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;left:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-left:auto}.navbar-end{justify-content:flex-end;margin-right:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;right:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-left:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-right:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-left:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link.is-disabled,.pagination-link[disabled],.pagination-next.is-disabled,.pagination-next[disabled],.pagination-previous.is-disabled,.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-left:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-left:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-left:.5em}.tabs .icon:last-child{margin-right:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:0 0 4px 4px}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-right:-1px}.tabs.is-toggle li:first-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li:last-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-right:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-right:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-right:50%}.columns.is-mobile>.column.is-offset-one-third{margin-right:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-right:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-right:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-right:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-right:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-right:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-right:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-right:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-right:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-right:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-right:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-right:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-right:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-right:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-right:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-right:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-right:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-right:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-right:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-right:75%}.column.is-offset-two-thirds-mobile{margin-right:66.6666%}.column.is-offset-half-mobile{margin-right:50%}.column.is-offset-one-third-mobile{margin-right:33.3333%}.column.is-offset-one-quarter-mobile{margin-right:25%}.column.is-offset-one-fifth-mobile{margin-right:20%}.column.is-offset-two-fifths-mobile{margin-right:40%}.column.is-offset-three-fifths-mobile{margin-right:60%}.column.is-offset-four-fifths-mobile{margin-right:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-right:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-right:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-right:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-right:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-right:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-right:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-right:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-right:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-right:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-right:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-right:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-right:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-right:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-right:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-right:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-right:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-right:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-right:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-right:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-right:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-right:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-right:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-right:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-right:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-right:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-right:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-right:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-right:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-right:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-right:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-right:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-right:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-right:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-right:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-right:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-right:75%}.column.is-offset-two-thirds-touch{margin-right:66.6666%}.column.is-offset-half-touch{margin-right:50%}.column.is-offset-one-third-touch{margin-right:33.3333%}.column.is-offset-one-quarter-touch{margin-right:25%}.column.is-offset-one-fifth-touch{margin-right:20%}.column.is-offset-two-fifths-touch{margin-right:40%}.column.is-offset-three-fifths-touch{margin-right:60%}.column.is-offset-four-fifths-touch{margin-right:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-right:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-right:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-right:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-right:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-right:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-right:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-right:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-right:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-right:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-right:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-right:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-right:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-right:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-right:75%}.column.is-offset-two-thirds-desktop{margin-right:66.6666%}.column.is-offset-half-desktop{margin-right:50%}.column.is-offset-one-third-desktop{margin-right:33.3333%}.column.is-offset-one-quarter-desktop{margin-right:25%}.column.is-offset-one-fifth-desktop{margin-right:20%}.column.is-offset-two-fifths-desktop{margin-right:40%}.column.is-offset-three-fifths-desktop{margin-right:60%}.column.is-offset-four-fifths-desktop{margin-right:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-right:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-right:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-right:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-right:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-right:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-right:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-right:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-right:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-right:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-right:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-right:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-right:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-right:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-right:75%}.column.is-offset-two-thirds-widescreen{margin-right:66.6666%}.column.is-offset-half-widescreen{margin-right:50%}.column.is-offset-one-third-widescreen{margin-right:33.3333%}.column.is-offset-one-quarter-widescreen{margin-right:25%}.column.is-offset-one-fifth-widescreen{margin-right:20%}.column.is-offset-two-fifths-widescreen{margin-right:40%}.column.is-offset-three-fifths-widescreen{margin-right:60%}.column.is-offset-four-fifths-widescreen{margin-right:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-right:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-right:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-right:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-right:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-right:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-right:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-right:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-right:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-right:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-right:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-right:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-right:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-right:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-right:75%}.column.is-offset-two-thirds-fullhd{margin-right:66.6666%}.column.is-offset-half-fullhd{margin-right:50%}.column.is-offset-one-third-fullhd{margin-right:33.3333%}.column.is-offset-one-quarter-fullhd{margin-right:25%}.column.is-offset-one-fifth-fullhd{margin-right:20%}.column.is-offset-two-fifths-fullhd{margin-right:40%}.column.is-offset-three-fifths-fullhd{margin-right:60%}.column.is-offset-four-fifths-fullhd{margin-right:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-right:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-right:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-right:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-right:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-right:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-right:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-right:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-right:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-right:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-right:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-right:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-right:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-right:100%}}.columns{margin-right:-.75rem;margin-left:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-right:0;margin-left:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-right:calc(-1 * var(--columnGap));margin-left:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-left:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop-bulmix/static/css/bulma-rtl.min.css.map b/pagetop-bulmix/static/css/bulma-rtl.min.css.map new file mode 100644 index 00000000..726415ee --- /dev/null +++ b/pagetop-bulmix/static/css/bulma-rtl.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma-rtl.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EHvDE,iCAAiC;EGyDjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTyDgB;ESxDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AS/ZA;EAGE,uBVhD6B;EUiD7B,qBVtD4B;EUuD5B,iBX5DwB;EW6DxB,cV5D4B;EU6D5B,eAAe;EAGf,uBAAuB;EACvB,iCA7D6D;EA8D7D,iBA7D6B;EA8D7B,kBA9D6B;EA+D7B,8BAhE6D;EAiE7D,kBAAkB;EAClB,mBAAmB;AT8ZrB;;AS9aA;EAkBI,cAAc;ATgalB;;ASlbA;EAwBM,aAAa;EACb,YAAY;AT8ZlB;;ASvbA;ERsHI,gCQ3FsG;ER2FtG,mBQ1FmE;ATgavE;;AS5bA;ERsHI,oBQxFmE;ERwFnE,+BQvFsG;ATka1G;;ASjcA;EAiCM,+BAAiF;EACjF,gCAAkF;AToaxF;;AStcA;EAsCI,qBVzF0B;EU0F1B,cV7F0B;ACigB9B;;AS3cA;EA0CI,qBVhF8B;EUiF9B,cVjG0B;ACsgB9B;;AShdA;EA6CM,iDVnF4B;AC0flC;;ASpdA;EAgDI,qBVrG0B;EUsG1B,cVvG0B;AC+gB9B;;ASzdA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV3G0B;EU4G1B,0BA1F8B;ATmgBlC;;ASheA;EA4DM,4BV3GwB;EU4GxB,cVnHwB;AC2hB9B;;ASreA;EAgEM,yBChB2B;EDiB3B,cVvHwB;ACgiB9B;;AS1eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT2atB;;ASjfA;EAwEI,gBAvG0B;EAwG1B,yBAvGmC;EAwGnC,cVhH8B;EUiH9B,qBAvG0B;ATohB9B;;ASxfA;EA8EM,cVpH4B;EUqH5B,0BAzGmC;ATuhBzC;;AS7fA;EAoFM,uBVjIyB;EUkIzB,yBAAyB;EACzB,cVhJuB;AC6jB7B;;ASngBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,cVrJqB;ACmkB7B;;ASzgBA;EA8FQ,yBAAyB;EACzB,cVzJqB;ACwkB7B;;AS9gBA;EAiGU,mDV9IqB;AC+jB/B;;ASlhBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,cVhKqB;ACklB7B;;ASxhBA;;EAyGQ,uBVtJuB;EUuJvB,mBVvJuB;EUwJvB,gBAAgB;ATobxB;;AS/hBA;EA6GQ,yBVvKqB;EUwKrB,YV3JuB;ACilB/B;;ASpiBA;EAiHU,uBCjEuB;AVwfjC;;ASxiBA;;EAoHU,yBV9KmB;EU+KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVpKqB;AC6lB/B;;AShjBA;EA0HU,gEAA4E;AT0btF;;ASpjBA;EA4HQ,6BAA6B;EAC7B,mBV1KuB;EU2KvB,YV3KuB;ACumB/B;;AS1jBA;EAmIU,uBVhLqB;EUiLrB,mBVjLqB;EUkLrB,cV/LmB;AC0nB7B;;AShkBA;EAwIY,4DAA8D;AT4b1E;;ASpkBA;EA8Ic,gEAA4E;AT0b1F;;ASxkBA;;EAiJU,6BAA6B;EAC7B,mBV/LqB;EUgMrB,gBAAgB;EAChB,YVjMqB;AC6nB/B;;AShlBA;EAsJQ,6BAA6B;EAC7B,qBVjNqB;EUkNrB,cVlNqB;ACgpB7B;;AStlBA;EA6JU,yBVvNmB;EUwNnB,YV3MqB;ACwoB/B;;AS3lBA;EAqKc,4DAA8D;AT0b5E;;AS/lBA;;EAwKU,6BAA6B;EAC7B,qBVnOmB;EUoOnB,gBAAgB;EAChB,cVrOmB;ACiqB7B;;ASvmBA;EAoFM,yBV9IuB;EU+IvB,yBAAyB;EACzB,YVnIyB;AC0pB/B;;AS7mBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,YVxIuB;ACgqB/B;;ASnnBA;EA8FQ,yBAAyB;EACzB,YV5IuB;ACqqB/B;;ASxnBA;EAiGU,gDV3JmB;ACsrB7B;;AS5nBA;EAoGQ,uBCpDyB;EDqDzB,yBAAyB;EACzB,YVnJuB;AC+qB/B;;ASloBA;;EAyGQ,yBVnKqB;EUoKrB,qBVpKqB;EUqKrB,gBAAgB;AT8hBxB;;ASzoBA;EA6GQ,uBV1JuB;EU2JvB,cVxKqB;ACwsB7B;;AS9oBA;EAiHU,yBCjEuB;AVkmBjC;;ASlpBA;;EAoHU,uBVjKqB;EUkKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVjLmB;ACotB7B;;AS1pBA;EA0HU,4DAA4E;AToiBtF;;AS9pBA;EA4HQ,6BAA6B;EAC7B,qBVvLqB;EUwLrB,cVxLqB;AC8tB7B;;ASpqBA;EAmIU,yBV7LmB;EU8LnB,qBV9LmB;EU+LnB,YVlLqB;ACutB/B;;AS1qBA;EAwIY,gEAA8D;ATsiB1E;;AS9qBA;EA8Ic,4DAA4E;AToiB1F;;ASlrBA;;EAiJU,6BAA6B;EAC7B,qBV5MmB;EU6MnB,gBAAgB;EAChB,cV9MmB;ACovB7B;;AS1rBA;EAsJQ,6BAA6B;EAC7B,mBVpMuB;EUqMvB,YVrMuB;AC6uB/B;;AShsBA;EA6JU,uBV1MqB;EU2MrB,cVxNmB;AC+vB7B;;ASrsBA;EAqKc,gEAA8D;AToiB5E;;ASzsBA;;EAwKU,6BAA6B;EAC7B,mBVtNqB;EUuNrB,gBAAgB;EAChB,YVxNqB;AC8vB/B;;ASjtBA;EAoFM,4BVnIwB;EUoIxB,yBAAyB;EACzB,yBClEe;AVmsBrB;;ASvtBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVysBrB;;AS7tBA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV8sBrB;;ASluBA;EAiGU,mDVhJoB;ACqxB9B;;AStuBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVwtBrB;;AS5uBA;;EAyGQ,4BVxJsB;EUyJtB,wBVzJsB;EU0JtB,gBAAgB;ATwoBxB;;ASnvBA;EA6GQ,oCCzFa;ED0Fb,iBV7JsB;ACuyB9B;;ASxvBA;EAiHU,oCCjEuB;AV4sBjC;;AS5vBA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVtKoB;ACmzB9B;;ASpwBA;EA0HU,sFAA4E;AT8oBtF;;ASxwBA;EA4HQ,6BAA6B;EAC7B,wBV5KsB;EU6KtB,iBV7KsB;AC6zB9B;;AS9wBA;EAmIU,4BVlLoB;EUmLpB,wBVnLoB;EUoLpB,yBCjHW;AVgwBrB;;ASpxBA;EAwIY,sEAA8D;ATgpB1E;;ASxxBA;EA8Ic,sFAA4E;AT8oB1F;;AS5xBA;;EAiJU,6BAA6B;EAC7B,wBVjMoB;EUkMpB,gBAAgB;EAChB,iBVnMoB;ACm1B9B;;ASpyBA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVsxBrB;;AS1yBA;EA6JU,oCCzIW;ED0IX,iBV7MoB;AC81B9B;;AS/yBA;EAqKc,sEAA8D;AT8oB5E;;ASnzBA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVuyBrB;;AS3zBA;EAoFM,yBV1IwB;EU2IxB,yBAAyB;EACzB,WChEU;AV2yBhB;;ASj0BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVizBhB;;ASv0BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVszBhB;;AS50BA;EAiGU,gDVvJoB;ACs4B9B;;ASh1BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVg0BhB;;ASt1BA;;EAyGQ,yBV/JsB;EUgKtB,qBVhKsB;EUiKtB,gBAAgB;ATkvBxB;;AS71BA;EA6GQ,sBCvFQ;EDwFR,cVpKsB;ACw5B9B;;ASl2BA;EAiHU,yBCjEuB;AVszBjC;;ASt2BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7KoB;ACo6B9B;;AS92BA;EA0HU,0DAA4E;ATwvBtF;;ASl3BA;EA4HQ,6BAA6B;EAC7B,qBVnLsB;EUoLtB,cVpLsB;AC86B9B;;ASx3BA;EAmIU,yBVzLoB;EU0LpB,qBV1LoB;EU2LpB,WC/GM;AVw2BhB;;AS93BA;EAwIY,gEAA8D;AT0vB1E;;ASl4BA;EA8Ic,0DAA4E;ATwvB1F;;ASt4BA;;EAiJU,6BAA6B;EAC7B,qBVxMoB;EUyMpB,gBAAgB;EAChB,cV1MoB;ACo8B9B;;AS94BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV83BhB;;ASp5BA;EA6JU,sBCvIM;EDwIN,cVpNoB;AC+8B9B;;ASz5BA;EAqKc,gEAA8D;ATwvB5E;;AS75BA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+4BhB;;ASr6BA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WChEU;AVq5BhB;;AS36BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV25BhB;;ASj7BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVg6BhB;;ASt7BA;EAiGU,iDVzIwB;ACk+BlC;;AS17BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV06BhB;;ASh8BA;;EAyGQ,yBVjJ0B;EUkJ1B,qBVlJ0B;EUmJ1B,gBAAgB;AT41BxB;;ASv8BA;EA6GQ,sBCvFQ;EDwFR,cVtJ0B;ACo/BlC;;AS58BA;EAiHU,yBCjEuB;AVg6BjC;;ASh9BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACggClC;;ASx9BA;EA0HU,0DAA4E;ATk2BtF;;AS59BA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC0gClC;;ASl+BA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC/GM;AVk9BhB;;ASx+BA;EAwIY,gEAA8D;ATo2B1E;;AS5+BA;EA8Ic,0DAA4E;ATk2B1F;;ASh/BA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACgiClC;;ASx/BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVw+BhB;;AS9/BA;EA6JU,sBCvIM;EDwIN,cVtMwB;AC2iClC;;ASngCA;EAqKc,gEAA8D;ATk2B5E;;ASvgCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVy/BhB;;AS/gCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV++BrE;;ASphCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVq/BrE;;AS1hCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV2/BrE;;AShiCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WChEU;AVghChB;;AStiCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVshChB;;AS5iCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AV2hChB;;ASjjCA;EAiGU,iDVvIwB;AC2lClC;;ASrjCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVqiChB;;AS3jCA;;EAyGQ,yBV/I0B;EUgJ1B,qBVhJ0B;EUiJ1B,gBAAgB;ATu9BxB;;ASlkCA;EA6GQ,sBCvFQ;EDwFR,cVpJ0B;AC6mClC;;ASvkCA;EAiHU,yBCjEuB;AV2hCjC;;AS3kCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACynClC;;ASnlCA;EA0HU,0DAA4E;AT69BtF;;ASvlCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;ACmoClC;;AS7lCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC/GM;AV6kChB;;ASnmCA;EAwIY,gEAA8D;AT+9B1E;;ASvmCA;EA8Ic,0DAA4E;AT69B1F;;AS3mCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACypClC;;ASnnCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVmmChB;;ASznCA;EA6JU,sBCvIM;EDwIN,cVpMwB;ACoqClC;;AS9nCA;EAqKc,gEAA8D;AT69B5E;;ASloCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVonChB;;AS1oCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV0mCrE;;AS/oCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVgnCrE;;ASrpCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVsnCrE;;AS3pCA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WChEU;AV2oChB;;ASjqCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVipChB;;ASvqCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVspChB;;AS5qCA;EAiGU,kDVxIwB;ACutClC;;AShrCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVgqChB;;AStrCA;;EAyGQ,yBVhJ0B;EUiJ1B,qBVjJ0B;EUkJ1B,gBAAgB;ATklCxB;;AS7rCA;EA6GQ,sBCvFQ;EDwFR,cVrJ0B;ACyuClC;;ASlsCA;EAiHU,yBCjEuB;AVspCjC;;AStsCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACqvClC;;AS9sCA;EA0HU,0DAA4E;ATwlCtF;;ASltCA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC+vClC;;ASxtCA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC/GM;AVwsChB;;AS9tCA;EAwIY,gEAA8D;AT0lC1E;;ASluCA;EA8Ic,0DAA4E;ATwlC1F;;AStuCA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACqxClC;;AS9uCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV8tChB;;ASpvCA;EA6JU,sBCvIM;EDwIN,cVrMwB;ACgyClC;;ASzvCA;EAqKc,gEAA8D;ATwlC5E;;AS7vCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+uChB;;ASrwCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVquCrE;;AS1wCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV2uCrE;;AShxCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVivCrE;;AStxCA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,WChEU;AVswChB;;AS5xCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV4wChB;;ASlyCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVixChB;;ASvyCA;EAiGU,kDV1IwB;ACo1ClC;;AS3yCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV2xChB;;ASjzCA;;EAyGQ,yBVlJ0B;EUmJ1B,qBVnJ0B;EUoJ1B,gBAAgB;AT6sCxB;;ASxzCA;EA6GQ,sBCvFQ;EDwFR,cVvJ0B;ACs2ClC;;AS7zCA;EAiHU,yBCjEuB;AVixCjC;;ASj0CA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;ACk3ClC;;ASz0CA;EA0HU,0DAA4E;ATmtCtF;;AS70CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;AC43ClC;;ASn1CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,WC/GM;AVm0ChB;;ASz1CA;EAwIY,gEAA8D;ATqtC1E;;AS71CA;EA8Ic,0DAA4E;ATmtC1F;;ASj2CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;ACk5ClC;;ASz2CA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVy1ChB;;AS/2CA;EA6JU,sBCvIM;EDwIN,cVvMwB;AC65ClC;;ASp3CA;EAqKc,gEAA8D;ATmtC5E;;ASx3CA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV02ChB;;ASh4CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVg2CrE;;ASr4CA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVs2CrE;;AS34CA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV42CrE;;ASj5CA;EAoFM,yBV9H4B;EU+H5B,yBAAyB;EACzB,yBClEe;AVm4CrB;;ASv5CA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVy4CrB;;AS75CA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV84CrB;;ASl6CA;EAiGU,mDV3IwB;ACg9ClC;;ASt6CA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVw5CrB;;AS56CA;;EAyGQ,yBVnJ0B;EUoJ1B,qBVpJ0B;EUqJ1B,gBAAgB;ATw0CxB;;ASn7CA;EA6GQ,oCCzFa;ED0Fb,cVxJ0B;ACk+ClC;;ASx7CA;EAiHU,oCCjEuB;AV44CjC;;AS57CA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,cVjKwB;AC8+ClC;;ASp8CA;EA0HU,sFAA4E;AT80CtF;;ASx8CA;EA4HQ,6BAA6B;EAC7B,qBVvK0B;EUwK1B,cVxK0B;ACw/ClC;;AS98CA;EAmIU,yBV7KwB;EU8KxB,qBV9KwB;EU+KxB,yBCjHW;AVg8CrB;;ASp9CA;EAwIY,gEAA8D;ATg1C1E;;ASx9CA;EA8Ic,sFAA4E;AT80C1F;;AS59CA;;EAiJU,6BAA6B;EAC7B,qBV5LwB;EU6LxB,gBAAgB;EAChB,cV9LwB;AC8gDlC;;ASp+CA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVs9CrB;;AS1+CA;EA6JU,oCCzIW;ED0IX,cVxMwB;ACyhDlC;;AS/+CA;EAqKc,gEAA8D;AT80C5E;;ASn/CA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVu+CrB;;AS3/CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV29CrE;;AShgDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVi+CrE;;AStgDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVu+CrE;;AS5gDA;EAoFM,yBVxH2B;EUyH3B,yBAAyB;EACzB,WChEU;AV4/ChB;;ASlhDA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVkgDhB;;ASxhDA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVugDhB;;AS7hDA;EAiGU,kDVrIuB;ACqkDjC;;ASjiDA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVihDhB;;ASviDA;;EAyGQ,yBV7IyB;EU8IzB,qBV9IyB;EU+IzB,gBAAgB;ATm8CxB;;AS9iDA;EA6GQ,sBCvFQ;EDwFR,cVlJyB;ACulDjC;;ASnjDA;EAiHU,yBCjEuB;AVugDjC;;ASvjDA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV3JuB;ACmmDjC;;AS/jDA;EA0HU,0DAA4E;ATy8CtF;;ASnkDA;EA4HQ,6BAA6B;EAC7B,qBVjKyB;EUkKzB,cVlKyB;AC6mDjC;;ASzkDA;EAmIU,yBVvKuB;EUwKvB,qBVxKuB;EUyKvB,WC/GM;AVyjDhB;;AS/kDA;EAwIY,gEAA8D;AT28C1E;;ASnlDA;EA8Ic,0DAA4E;ATy8C1F;;ASvlDA;;EAiJU,6BAA6B;EAC7B,qBVtLuB;EUuLvB,gBAAgB;EAChB,cVxLuB;ACmoDjC;;AS/lDA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV+kDhB;;ASrmDA;EA6JU,sBCvIM;EDwIN,cVlMuB;AC8oDjC;;AS1mDA;EAqKc,gEAA8D;ATy8C5E;;AS9mDA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVgmDhB;;AStnDA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVslDrE;;AS3nDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV4lDrE;;ASjoDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVkmDrE;;ASvoDA;EARE,kBVdc;ACiqDhB;;ASrpDE;EACE,kBVkBc;ACsoDlB;;AS/oDA;EANE,eVjBW;AC0qDb;;ASnpDA;EAJE,kBVpBc;AC+qDhB;;ASvpDA;EAFE,iBVvBa;ACorDf;;AS3pDA;;EAyMI,uBVtP2B;EUuP3B,qBV5P0B;EU6P1B,gBAjOyB;EAkOzB,YAjOyB;ATwrD7B;;ASnqDA;EA8MI,aAAa;EACb,WAAW;ATy9Cf;;ASxqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT29CxB;;AS7qDA;ERnDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQmQhC,6BAA6B;AT89CnC;;ASprDA;EAwNI,4BVvQ0B;EUwQ1B,qBV3Q0B;EU4Q1B,cV9Q0B;EU+Q1B,gBAAgB;EAChB,oBAAoB;ATg+CxB;;AS5rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATk+C/D;;ASh+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATm+C7B;;ASv+CA;EAMI,qBAAqB;ATq+CzB;;AS3+CA;ER5GI,mBQoHwC;ATu+C5C;;AS/+CA;EAUI,sBAAsB;ATy+C1B;;ASn/CA;EAYI,mBAAmB;AT2+CvB;;ASv/CA;EA1OE,kBVdc;ACmvDhB;;ASvuDE;EACE,kBVkBc;ACwtDlB;;AS//CA;EAtOE,kBVpBc;AC6vDhB;;ASngDA;EApOE,iBVvBa;ACkwDf;;ASvgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATi/CjC;;AS5gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ER1I9B,iBQ2IwC;ATm/C5C;;ASlhDA;ER5GI,cQ6IqC;ATq/CzC;;ASthDA;EAoCQ,UAAU;ATs/ClB;;AS1hDA;EA0CQ,UAAU;ATo/ClB;;AS9hDA;EA4CU,UAAU;ATs/CpB;;ASliDA;EA8CQ,YAAY;EACZ,cAAc;ATw/CtB;;ASviDA;EAiDI,uBAAuB;AT0/C3B;;AS3iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT2/C7B;;AShjDA;EAuDI,yBAAyB;AT6/C7B;;ASpjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT8/C7B;;ACzvDE;EQiQM;IACE,oBAlTyD;ET8yDjE;ES1/CM;;IAEE,qBAtT0F;ETkzDlG;ESjgDM;IACE,kBV1TM;EC6zDd;ESpgDM;IACE,eV3TG;ECi0DX;AACF;;ACrwDE;EQ6PM;IACE,qBAlTyL;ET8zDjM;ES1gDM;;IAEE,kBV9TM;EC00Dd;ESjhDM;IACE,eV3TG;EC80DX;ESphDM;IACE,kBV5TM;ECk1Dd;AACF;;AWl3DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WAAW;AXq3Db;;AWz3DA;EAMI,0BAA0B;EAC1B,kBZyCM;EYxCN,mBZwCM;EYvCN,WAAW;AXu3Df;;AC/wDE;EUjHF;IAWI,gBAAuC;EX03DzC;AACF;;AC3wDI;EU3HJ;IAcM,iBAAqE;EX63DzE;AACF;;AClwDI;EU1IJ;IAiBM,iBAAiE;EXg4DrE;AACF;;AClxDI;EUhIJ;IAoBM,iBAAqE;EXm4DzE;AACF;;ACzwDI;EU/IJ;IAuBM,iBAAiE;EXs4DrE;AACF;;AY34DA;EAII,kBAAkB;AZ24DtB;;AY/4DA;;;;;;;EAcM,kBAhC2B;AZ26DjC;;AYz5DA;;;;;;EAqBI,cbvC0B;EawC1B,gBbHiB;EaIjB,kBA3C+B;AZw7DnC;;AYp6DA;EAyBI,cAAc;EACd,oBAAoB;AZ+4DxB;;AYz6DA;EA4BM,eAAe;AZi5DrB;;AY76DA;EA8BI,iBAAiB;EACjB,uBAAuB;AZm5D3B;;AYl7DA;EAiCM,oBAAoB;AZq5D1B;;AYt7DA;EAmCI,gBAAgB;EAChB,uBAAuB;AZu5D3B;;AY37DA;EAsCM,oBAAoB;AZy5D1B;;AY/7DA;EAwCI,iBAAiB;EACjB,oBAAoB;AZ25DxB;;AYp8DA;EA2CI,kBAAkB;EAClB,uBAAuB;AZ65D3B;;AYz8DA;EA8CI,cAAc;EACd,kBAAkB;AZ+5DtB;;AY98DA;EAiDI,4Bb5D0B;EEqK1B,+BFxK0B;EaiE1B,qBAjEqC;AZk+DzC;;AYp9DA;EAqDI,4BAA4B;EXqG5B,iBWpGmC;EACnC,eAAe;AZm6DnB;;AY19DA;EAyDM,wBAAwB;AZq6D9B;;AY99DA;EA2DQ,4BAA4B;AZu6DpC;;AYl+DA;EA6DQ,4BAA4B;AZy6DpC;;AYt+DA;EA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kBI,uBAAuB;AfyyE3B;;Ae3zEA;Ed+KI,Yc3J4B;EAC5B,kBAAkB;EAClB,WAAW;Af2yEf;;Aej0EA;;;EA0BI,mBAAmB;Af6yEvB;;Aev0EA;EAgCM,uBhB5ByB;EgB6BzB,chB1CuB;ACq1E7B;;Ae50EA;EAgCM,yBhBzCuB;EgB0CvB,YhB7ByB;AC60E/B;;Aej1EA;EAgCM,4BhB9BwB;EgB+BxB,yBLoCe;AVixErB;;Aet1EA;EAgCM,yBhBrCwB;EgBsCxB,WLsCU;AVoxEhB;;Ae31EA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyxEhB;;Aeh2EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV+wErE;;Aer2EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmyEhB;;Ae12EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVyxErE;;Ae/2EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6yEhB;;Aep3EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVmyErE;;Aez3EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuzEhB;;Ae93EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV6yErE;;Aen4EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVm0ErB;;Aex4EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVuzErE;;Ae74EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV20EhB;;Ael5EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVi0ErE;;AgBx5EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjByDqB;EiBxDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB05Eb;;AgBp6EA;EAYI,yBjBX2B;ACu6E/B;;AgBx6EA;EAcI,yBjBjB0B;AC+6E9B;;AgB56EA;EAgBI,yBjBnB0B;ACm7E9B;;AgBh7EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk6EhB;;AgBr7EA;EAyBQ,uBjBpBuB;ACo7E/B;;AgBz7EA;EA2BQ,uBjBtBuB;ACw7E/B;;AgB77EA;EA6BQ,uBjBxBuB;AC47E/B;;AgBj8EA;EA+BQ,mEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjBjCqB;ACi9E7B;;AgBz8EA;EA2BQ,yBjBnCqB;ACq9E7B;;AgB78EA;EA6BQ,yBjBrCqB;ACy9E7B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,4BjBtBsB;ACs9E9B;;AgBz9EA;EA2BQ,4BjBxBsB;AC09E9B;;AgB79EA;EA6BQ,4BjB1BsB;AC89E9B;;AgBj+EA;EA+BQ,wEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjB7BsB;AC6+E9B;;AgBz+EA;EA2BQ,yBjB/BsB;ACi/E9B;;AgB7+EA;EA6BQ,yBjBjCsB;ACq/E9B;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBf0B;AC++ElC;;AgBz/EA;EA2BQ,yBjBjB0B;ACm/ElC;;AgB7/EA;EA6BQ,yBjBnB0B;ACu/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBb0B;AC6/ElC;;AgBzgFA;EA2BQ,yBjBf0B;ACigFlC;;AgB7gFA;EA6BQ,yBjBjB0B;ACqgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBd0B;AC8gFlC;;AgBzhFA;EA2BQ,yBjBhB0B;ACkhFlC;;AgB7hFA;EA6BQ,yBjBlB0B;ACshFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBhB0B;ACgiFlC;;AgBziFA;EA2BQ,yBjBlB0B;ACoiFlC;;AgB7iFA;EA6BQ,yBjBpB0B;ACwiFlC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAyBQ,yBjBjB0B;ACijFlC;;AgBzjFA;EA2BQ,yBjBnB0B;ACqjFlC;;AgB7jFA;EA6BQ,yBjBrB0B;ACyjFlC;;AgBjkFA;EA+BQ,qEAA2F;AhBsiFnG;;AgBrkFA;EAyBQ,yBjBXyB;AC2jFjC;;AgBzkFA;EA2BQ,yBjBbyB;AC+jFjC;;AgB7kFA;EA6BQ,yBjBfyB;ACmkFjC;;AgBjlFA;EA+BQ,qEAA2F;AhBsjFnG;;AgBrlFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBujF9B;;AgBjmFA;EA4CM,6BAA6B;AhByjFnC;;AgBrmFA;EA8CM,6BAA6B;AhB2jFnC;;AgBzmFA;EAgDM,oBAAoB;AhB6jF1B;;AgB7mFA;EAoDI,ejBxBY;ACqlFhB;;AgBjnFA;EAsDI,ejB5BY;AC2lFhB;;AgBrnFA;EAwDI,cjB/BW;ACgmFf;;AgB/jFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AgBxkFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AiB9mFA;EAEE,uBlBjB6B;EkBkB7B,clB3B4B;AC2oF9B;;AiBnnFA;;EAMI,yBlB1B0B;EkB2B1B,qBA/B6B;EAgC7B,qBA/B6B;EAgC7B,mBAAmB;AjBknFvB;;AiB3nFA;;EAeQ,uBlB9BuB;EkB+BvB,mBlB/BuB;EkBgCvB,clB7CqB;AC8pF7B;;AiBloFA;;EAeQ,yBlB3CqB;EkB4CrB,qBlB5CqB;EkB6CrB,YlBhCuB;ACwpF/B;;AiBzoFA;;EAeQ,4BlBhCsB;EkBiCtB,wBlBjCsB;EkBkCtB,yBPiCa;AV8lFrB;;AiBhpFA;;EAeQ,yBlBvCsB;EkBwCtB,qBlBxCsB;EkByCtB,WPmCQ;AVmmFhB;;AiBvpFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPmCQ;AV0mFhB;;AiB9pFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPmCQ;AVinFhB;;AiBrqFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPmCQ;AVwnFhB;;AiB5qFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,WPmCQ;AV+nFhB;;AiBnrFA;;EAeQ,yBlB3B0B;EkB4B1B,qBlB5B0B;EkB6B1B,yBPiCa;AVwoFrB;;AiB1rFA;;EAeQ,yBlBrByB;EkBsBzB,qBlBtByB;EkBuBzB,WPmCQ;AV6oFhB;;AiBjsFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBkrFf;;AiBvsFA;;EAuBM,yBlBjC4B;EkBkC5B,WP4BU;AVypFhB;;AiB7sFA;;;;EA2BQ,mBAAmB;AjByrF3B;;AiBptFA;;EA6BM,sBAAsB;AjB4rF5B;;AiBztFA;EA+BI,clBvD0B;ACqvF9B;;AiB7tFA;EAiCM,gBAtDsB;AjBsvF5B;;AiBjuFA;EAoCM,yBlB9C4B;EkB+C5B,WPeU;AVkrFhB;;AiBtuFA;;EAwCQ,mBAAmB;AjBmsF3B;;AiB3uFA;;EA2CQ,kBPSQ;EORR,mBAAmB;AjBqsF3B;;AiBjvFA;EA8CI,6BA5DqC;AjBmwFzC;;AiBrvFA;;EAiDM,qBApEgC;EAqEhC,clB1EwB;ACmxF9B;;AiB3vFA;EAoDI,6BAhEqC;AjB2wFzC;;AiB/vFA;;EAuDM,qBAxEgC;EAyEhC,clBhFwB;AC6xF9B;;AiBrwFA;EA0DI,6BAvEqC;AjBsxFzC;;AiBzwFA;;EA+DU,sBAAsB;AjB+sFhC;;AiB9wFA;;EAoEM,iBAAiB;AjB+sFvB;;AiBnxFA;;EAyEU,wBAAwB;AjB+sFlC;;AiBxxFA;EA2EI,WAAW;AjBitFf;;AiB5xFA;EAgFU,yBlBhGoB;ACgzF9B;;AiBhyFA;EAqFY,yBlBrGkB;ACozF9B;;AiBpyFA;EAuFc,4BlBxGgB;ACyzF9B;;AiBxyFA;;EA2FM,qBAAqB;AjBktF3B;;AiB7yFA;EAgGU,yBlBhHoB;ACi0F9B;;AiB/sFA;EhB7DE,iCAAiC;EgBgEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBitFjB;;AkB70FA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBg1F7B;;AkBp1FA;EAMI,qBAAqB;AlBk1FzB;;AkBx1FA;EjByKI,mBiBjKwC;AlBo1F5C;;AkB51FA;EAUI,sBAAsB;AlBs1F1B;;AkBh2FA;EAYI,mBAAmB;AlBw1FvB;;AkBp2FA;EAgBM,enBYO;AC40Fb;;AkBx2FA;EAmBM,kBnBQU;ACi1FhB;;AkB52FA;EAqBI,uBAAuB;AlB21F3B;;AkBh3FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB61F1B;;AkBr3FA;EA0BI,yBAAyB;AlB+1F7B;;AkBz3FA;EA6BQ,mBAAmB;AlBg2F3B;;AkB73FA;EA+BQ,eAAe;AlBk2FvB;;AkBj4FA;EjByKI,ciBvImC;AlBm2FvC;;AkBr4FA;EjByKI,eiBrIqC;EAK/B,0BAA0B;EAC1B,6BAA6B;AlBi2FvC;;AkB34FA;EAgDU,yBAAyB;EACzB,4BAA4B;AlB+1FtC;;AkB71FA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBOU;EmBNV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg2FrB;;AkB52FA;EjBsHI,qBiBxGuC;EjBwGvC,sBiBvGyC;AlBk2F7C;;AkBj3FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg7F7B;;AkBt3FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw6F/B;;AkB33FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV42FrB;;AkBh4FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+2FhB;;AkBr4FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo3FhB;;AkB14FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV02FrE;;AkB/4FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV83FhB;;AkBp5FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVo3FrE;;AkBz5FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw4FhB;;AkB95FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV83FrE;;AkBn6FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk5FhB;;AkBx6FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVw4FrE;;AkB76FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV85FrB;;AkBl7FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVk5FrE;;AkBv7FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs6FhB;;AkB57FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV45FrE;;AkBj8FA;EAgCI,kBnBtDY;AC29FhB;;AkBr8FA;EAkCI,enBzDS;ACg+Fb;;AkBz8FA;EAoCI,kBnB5DY;ACq+FhB;;AkB78FA;EjBsHI,sBiB/E0C;EjB+E1C,qBiB9E0C;AlB06F9C;;AkBl9FA;EjBsHI,sBiB5E0C;EjB4E1C,qBiB3E0C;AlB46F9C;;AkBv9FA;EjBsHI,sBiBzE0C;EjByE1C,qBiBxE0C;AlB86F9C;;AkB59FA;EjBsHI,iBiB7KmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+6Fd;;AkBn+FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg7FrC;;AkB9+FA;EAgEM,WAAW;EACX,UAAU;AlBk7FhB;;AkBn/FA;EAmEM,WAAW;EACX,UAAU;AlBo7FhB;;AkBx/FA;EAuEM,yBAAmD;AlBq7FzD;;AkB5/FA;EAyEM,yBAAoD;AlBu7F1D;;AkBhgGA;EA2EI,qBnB/DmB;ACw/FvB;;AkBv7FA;EAEI,0BAA0B;AlBy7F9B;;AmB/iGA;;EAGE,sBAAsB;AnBijGxB;;AmBpjGA;;;;EAMI,oBAAoB;AnBqjGxB;;AmB3jGA;;EAQI,iBApBmB;AnB4kGvB;;AmBhkGA;;EAUI,iBArBmB;AnBglGvB;;AmBrkGA;;EAYI,sBAAsB;AnB8jG1B;;AmB5jGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgmGzB;;AmBnkGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmmG7B;;AmBxkGA;EAWI,oBA3B+B;AnB4lGnC;;AmB5kGA;EAgBM,epBnBO;ACmlGb;;AmBhlGA;EAgBM,iBpBlBS;ACslGf;;AmBplGA;EAgBM,epBjBO;ACylGb;;AmBxlGA;EAgBM,iBpBhBS;AC4lGf;;AmB5lGA;EAgBM,kBpBfU;AC+lGhB;;AmBhmGA;EAgBM,epBdO;ACkmGb;;AmBpmGA;EAgBM,kBpBbU;ACqmGhB;;AmBtlGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkoG3B;;AmB7lGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4mGrB;;AmBlmGA;EAWI,oBA7C+B;AnBwoGnC;;AmBtmGA;EAgBM,epBrCO;AC+nGb;;AmB1mGA;EAgBM,iBpBpCS;ACkoGf;;AmB9mGA;EAgBM,epBnCO;ACqoGb;;AmBlnGA;EAgBM,iBpBlCS;ACwoGf;;AmBtnGA;EAgBM,kBpBjCU;AC2oGhB;;AmB1nGA;EAgBM,epBhCO;AC8oGb;;AmB9nGA;EAgBM,kBpB/BU;ACipGhB;;AoB/qGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkrG3B;;AoB7qGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBmDqB;EqBlDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgrGrB;;AqB9sGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBkCU;EuBjCV,cvB/B4B;ACgtG9B;;AC9oGI;EqBjCA,4BvBjC0B;ACotG9B;;AClpGI;EqBjCA,4BvBjC0B;ACwtG9B;;ACtpGI;EqBjCA,4BvBjC0B;AC4tG9B;;AC1pGI;EqBjCA,4BvBjC0B;ACguG9B;;AsB9rGE;EAEE,qBvBjC0B;ACiuG9B;;AsB/rGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACytGlC;;AsB9rGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACkvG9B;;AClrGI;;;;;EqBhBE,+BvBhDwB;AC0vG9B;;AC1rGI;;;;;EqBhBE,+BvBhDwB;ACkwG9B;;AClsGI;;;;;EqBhBE,+BvBhDwB;AC0wG9B;;AC1sGI;;;;;EqBhBE,+BvBhDwB;ACkxG9B;;AuBpxGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsxGb;;AuBrxGE;EACE,gBAAgB;AvBwxGpB;;AuBpxGI;EACE,mBxBFyB;ACyxG/B;;AuBxxGK;EAMG,mDxBPuB;AC6xG/B;;AuB5xGI;EACE,qBxBfuB;AC8yG7B;;AuBhyGK;EAMG,gDxBpBqB;ACkzG7B;;AuBpyGI;EACE,wBxBJwB;AC2yG9B;;AuBxyGK;EAMG,mDxBTsB;AC+yG9B;;AuB5yGI;EACE,qBxBXwB;AC0zG9B;;AuBhzGK;EAMG,gDxBhBsB;AC8zG9B;;AuBpzGI;EACE,qBxBG4B;ACozGlC;;AuBxzGK;EAMG,iDxBF0B;ACwzGlC;;AuB5zGI;EACE,qBxBK4B;AC0zGlC;;AuBh0GK;EAMG,iDxBA0B;AC8zGlC;;AuBp0GI;EACE,qBxBI4B;ACm0GlC;;AuBx0GK;EAMG,kDxBD0B;ACu0GlC;;AuB50GI;EACE,qBxBE4B;AC60GlC;;AuBh1GK;EAMG,kDxBH0B;ACi1GlC;;AuBp1GI;EACE,qBxBC4B;ACs1GlC;;AuBx1GK;EAMG,mDxBJ0B;AC01GlC;;AuB51GI;EACE,qBxBO2B;ACw1GjC;;AuBh2GK;EAMG,kDxBEyB;AC41GjC;;AuB51GE;EzBmBA,kBC0BgB;EDzBhB,kBCNc;ACm1GhB;;AuB/1GE;EzBoBA,kBCVc;ACy1GhB;;AuBj2GE;EzBoBA,iBCba;AC81Gf;;AuBl2GE;EACE,cAAc;EACd,WAAW;AvBq2Gf;;AuBp2GE;EACE,eAAe;EACf,WAAW;AvBu2Gf;;AuBr2GA;EAGI,qBxB+BmB;EwB9BnB,gDAA4D;EAC5D,iDAA6D;AvBs2GjE;;AuB32GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw2GpB;;AuBt2GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw2GlB;;AuB92GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo6GzB;;AuBn3GA;EAWI,eAAe;AvB42GnB;;AuBv3GA;EAcI,YAAY;AvB62GhB;;AwB96GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi7GpB;;AwBh7GE;EACE,eAAe;AxBm7GnB;;AwBl7GE;EACE,czBF0B;ACu7G9B;;AwBp7GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy7GvB;;AwBp7GA;EvBgKI,mBuB7JqC;AxBq7GzC;;AyBx8GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB28GrB;;AyB/8GA;EAMI,a3BDkB;AE88GtB;;AyBn9GA;EAUM,qB1BU4B;EEoK9B,awB7K+B;EAC7B,UAAU;AzB68GhB;;AyBz9GA;EAeM,qB1BuDiB;EE0GnB,kBwBhKsC;AzB88G1C;;AyB99GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+8GjB;;AyBt+GA;EAyBM,aAAa;AzBi9GnB;;AyB1+GA;;EA4BM,wB1BjBwB;ACo+G9B;;AyB/+GA;ExBgLI,mBwBlJwC;AzBq9G5C;;AyBn/GA;EAgCM,YAAY;EACZ,UAAU;AzBu9GhB;;AyBx/GA;EAmCQ,kBAAkB;AzBy9G1B;;AyB5/GA;EAuCM,qB1BnCwB;AC4/G9B;;AyBhgHA;EA6CQ,mB1BhCuB;ACu/G/B;;AyBpgHA;EA+CQ,mB1BlCuB;AC2/G/B;;AyBxgHA;EAkDU,qBfwDuB;AVk6GjC;;AyB5gHA;EAuDU,mD1B1CqB;ACmgH/B;;AyBhhHA;EA6CQ,qB1B7CqB;ACohH7B;;AyBphHA;EA+CQ,qB1B/CqB;ACwhH7B;;AyBxhHA;EAkDU,mBfwDuB;AVk7GjC;;AyB5hHA;EAuDU,gD1BvDmB;ACgiH7B;;AyBhiHA;EA6CQ,wB1BlCsB;ACyhH9B;;AyBpiHA;EA+CQ,wB1BpCsB;AC6hH9B;;AyBxiHA;EAkDU,qBfwDuB;AVk8GjC;;AyB5iHA;EAuDU,mD1B5CoB;ACqiH9B;;AyBhjHA;EA6CQ,qB1BzCsB;ACgjH9B;;AyBpjHA;EA+CQ,qB1B3CsB;ACojH9B;;AyBxjHA;EAkDU,qBfwDuB;AVk9GjC;;AyB5jHA;EAuDU,gD1BnDoB;AC4jH9B;;AyBhkHA;EA6CQ,qB1B3B0B;ACkjHlC;;AyBpkHA;EA+CQ,qB1B7B0B;ACsjHlC;;AyBxkHA;EAkDU,qBfwDuB;AVk+GjC;;AyB5kHA;EAuDU,iD1BrCwB;AC8jHlC;;AyBhlHA;EA6CQ,qB1BzB0B;ACgkHlC;;AyBplHA;EA+CQ,qB1B3B0B;ACokHlC;;AyBxlHA;EAkDU,qBfwDuB;AVk/GjC;;AyB5lHA;EAuDU,iD1BnCwB;AC4kHlC;;AyBhmHA;EA6CQ,qB1B1B0B;ACilHlC;;AyBpmHA;EA+CQ,qB1B5B0B;ACqlHlC;;AyBxmHA;EAkDU,qBfwDuB;AVkgHjC;;AyB5mHA;EAuDU,kD1BpCwB;AC6lHlC;;AyBhnHA;EA6CQ,qB1B5B0B;ACmmHlC;;AyBpnHA;EA+CQ,qB1B9B0B;ACumHlC;;AyBxnHA;EAkDU,qBfwDuB;AVkhHjC;;AyB5nHA;EAuDU,kD1BtCwB;AC+mHlC;;AyBhoHA;EA6CQ,qB1B7B0B;AConHlC;;AyBpoHA;EA+CQ,qB1B/B0B;ACwnHlC;;AyBxoHA;EAkDU,qBfwDuB;AVkiHjC;;AyB5oHA;EAuDU,mD1BvCwB;ACgoHlC;;AyBhpHA;EA6CQ,qB1BvByB;AC8nHjC;;AyBppHA;EA+CQ,qB1BzByB;ACkoHjC;;AyBxpHA;EAkDU,qBfwDuB;AVkjHjC;;AyB5pHA;EAuDU,kD1BjCuB;AC0oHjC;;AyBhqHA;E3ByCE,kBC0BgB;EDzBhB,kBCNc;ACioHhB;;AyBrqHA;E3B4CE,kBCVc;ACuoHhB;;AyBzqHA;E3B8CE,iBCba;AC4oHf;;AyB7qHA;EAkEM,gCAA8C;EAC9C,YAAY;AzB+mHlB;;AyBlrHA;EAqEI,WAAW;AzBinHf;;AyBtrHA;EAuEM,WAAW;AzBmnHjB;;AyB1rHA;EA2EM,aAAa;EACb,kBAAkB;ExB4GpB,awB3G+B;EAC7B,YAAY;EACZ,eAAe;AzBmnHrB;;AyBlsHA;EAiFM,kB1B7CU;ACkqHhB;;AyBtsHA;EAmFM,kB1BjDU;ACwqHhB;;AyB1sHA;EAqFM,iB1BpDS;AC6qHf;;A0BjsHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BmsHpB;;A0BxsHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC2tH7B;;A0B9sHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,c3BjCmB;ACiuH7B;;A0BptHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACuuH7B;;A0B1tHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,c3B7CmB;AC6uH7B;;A0BhuHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACsuH/B;;A0BtuHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,Y3BpBqB;AC4uH/B;;A0B5uHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACkvH/B;;A0BlvHA;EA8BU,uBhB+DuB;EgB9DvB,yBAAyB;EACzB,Y3BhCqB;ACwvH/B;;A0BxvHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV6rHrB;;A0B9vHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVmsHrB;;A0BpwHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVysHrB;;A0B1wHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+sHrB;;A0BhxHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVmtHhB;;A0BtxHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVytHhB;;A0B5xHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV+tHhB;;A0BlyHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVquHhB;;A0BxyHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV2uHhB;;A0B9yHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVivHhB;;A0BpzHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVuvHhB;;A0B1zHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6vHhB;;A0Bh0HA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVmwHhB;;A0Bt0HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVywHhB;;A0B50HA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV+wHhB;;A0Bl1HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVqxHhB;;A0Bx1HA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV2xHhB;;A0B91HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AViyHhB;;A0Bp2HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVuyHhB;;A0B12HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6yHhB;;A0Bh3HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVmzHhB;;A0Bt3HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVyzHhB;;A0B53HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV+zHhB;;A0Bl4HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq0HhB;;A0Bx4HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV60HrB;;A0B94HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVm1HrB;;A0Bp5HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVy1HrB;;A0B15HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+1HrB;;A0Bh6HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVm2HhB;;A0Bt6HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVy2HhB;;A0B56HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV+2HhB;;A0Bl7HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq3HhB;;A0Bx7HA;EAmCI,kB3BZY;ACq6HhB;;A0B57HA;EAqCI,e3BfS;AC06Hb;;A0Bh8HA;EAuCI,kB3BlBY;AC+6HhB;;A0Bp8HA;EA0CQ,eAAe;A1B85HvB;;A0Bx8HA;EA4CI,iB3BxBW;ACw7Hf;;A0B58HA;EA+CQ,eAAe;A1Bi6HvB;;A0Bh9HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bi6HhC;;A0Br9HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bm6H/B;;A0B19HA;EA0DQ,kB3BHI;ACu6HZ;;A0B99HA;EA4DQ,aAAa;A1Bs6HrB;;A0Bl+HA;EA+DM,sBAAsB;A1Bu6H5B;;A0Bt+HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1By6HtB;;A0B5+HA;EAqEM,uBAAuB;A1B26H7B;;A0Bh/HA;EAuEM,aAAa;EACb,YAAY;A1B66HlB;;A0Br/HA;EA0EQ,eAAe;A1B+6HvB;;A0Bz/HA;EA6EQ,eAAe;A1Bg7HvB;;A0B7/HA;EAgFQ,eAAe;A1Bi7HvB;;A0BjgIA;EAmFQ,eAAe;A1Bk7HvB;;A0BrgIA;EAsFQ,0BAA4C;A1Bm7HpD;;A0BzgIA;EAwFQ,0B3BjCI;E2BkCJ,uBAAuB;A1Bq7H/B;;A0B9gIA;EA2FI,uBAAuB;A1Bu7H3B;;A0BlhIA;EA8FM,WAAW;A1Bw7HjB;;A0BthIA;EAgGM,YAAY;EACZ,eAAe;A1B07HrB;;A0B3hIA;EAmGI,yBAAyB;A1B47H7B;;A0B/hIA;EAqGM,0BAA4C;A1B87HlD;;A0BniIA;EAuGM,0B3BhDM;E2BiDN,2BAA2B;EAC3B,SAAS;A1Bg8Hf;;A0B97HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bi8HpB;;A0Bv8HA;EASM,yBhBvB2B;EgBwB3B,c3B9HwB;ACgkI9B;;A0B58HA;EAYM,qBhB1B2B;AV89HjC;;A0Bh9HA;EAeM,yBhB7B2B;EgB8B3B,c3BpIwB;ACykI9B;;A0Br9HA;EAkBM,qBhBhC2B;AVu+HjC;;A0Br8HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bw8Hb;;A0Bt8HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BrFU;E2BsFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bw8HrB;;A0Bt8HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACqmI9B;;A0Bv8HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1B08HzB;;A0Bx8HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBDrB,kByBEmC;EACrC,UAAU;A1B28HZ;;A0Bj9HA;EAQI,eAAe;A1B68HnB;;A2B7nIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC+lIjB;;A2BpoIA;EAMI,oBAAoB;A3BkoIxB;;A2BxoIA;EASI,kB5BsBY;AC6mIhB;;A2B5oIA;EAWI,kB5BkBY;ACmnIhB;;A2BhpIA;EAaI,iB5BeW;ACwnIf;;A2BroIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BwoIrB;;A2B3oIA;EAOM,Y5BdyB;ACspI/B;;A2B/oIA;EAOM,c5B3BuB;ACuqI7B;;A2BnpIA;EAOM,iB5BhBwB;ACgqI9B;;A2BvpIA;EAOM,c5BvBwB;AC2qI9B;;A2B3pIA;EAOM,c5BT4B;ACiqIlC;;A2B/pIA;EAOM,c5BP4B;ACmqIlC;;A2BnqIA;EAOM,c5BR4B;ACwqIlC;;A2BvqIA;EAOM,c5BV4B;AC8qIlC;;A2B3qIA;EAOM,c5BX4B;ACmrIlC;;A2B/qIA;EAOM,c5BL2B;ACirIjC;;A2BxqIA;EAEI,sBAAsB;A3B0qI1B;;A2B5qIA;EAKI,aAAa;EACb,2BAA2B;A3B2qI/B;;A2BjrIA;E1BiJI,iB0BxIwC;A3B4qI5C;;A2BrrIA;;;EAcU,gBAAgB;A3B6qI1B;;A2B3rIA;;;EAuBY,4BAA4B;EAC5B,yBAAyB;A3B0qIrC;;A2BlsIA;;;EAiCY,6BAA6B;EAC7B,0BAA0B;A3BuqItC;;A2BzsIA;;;;;EAyCY,UAAU;A3BwqItB;;A2BjtIA;;;;;;;;;EA8CY,UAAU;A3B+qItB;;A2B7tIA;;;;;;;;;EAgDc,UAAU;A3ByrIxB;;A2BzuIA;EAkDQ,YAAY;EACZ,cAAc;A3B2rItB;;A2B9uIA;EAqDM,uBAAuB;A3B6rI7B;;A2BlvIA;EAuDM,yBAAyB;A3B+rI/B;;A2BtvIA;EA0DQ,YAAY;EACZ,cAAc;A3BgsItB;;A2B3vIA;EA6DI,aAAa;EACb,2BAA2B;A3BksI/B;;A2BhwIA;EAgEM,cAAc;A3BosIpB;;A2BpwIA;EAkEQ,gBAAgB;E1B+EpB,oB0B9E2C;A3BssI/C;;A2BzwIA;EAqEQ,YAAY;EACZ,cAAc;A3BwsItB;;A2B9wIA;EAwEM,uBAAuB;A3B0sI7B;;A2BlxIA;EA0EM,yBAAyB;A3B4sI/B;;A2BtxIA;EA4EM,eAAe;A3B8sIrB;;A2B1xIA;EAgFU,sBAAsB;A3B8sIhC;;A2B9xIA;EAkFQ,uBAAuB;A3BgtI/B;;A2BlyIA;EAoFQ,gBAAgB;A3BktIxB;;AC7tIE;E0BzEF;IAuFM,aAAa;E3BotIjB;AACF;;A2BntIA;EAEI,kBAAkB;A3BqtItB;;AC3uIE;E0BoBF;IAII,qBAAqB;E3BwtIvB;AACF;;AC7uIE;E0BgBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BgDd,mB0B/CsC;IACtC,iBAAiB;E3B4tInB;E2BtuIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B6tIxB;E2B1uIF;IAeM,oBAAoB;E3B8tIxB;E2B7uIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B+tIxB;E2BjvIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3BguIxB;AACF;;A2B/tIA;EAEI,gBAAgB;A3BiuIpB;;AC1wIE;E0BuCF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BouIhB;E2B3uIF;IASM,gBAAgB;E3BquIpB;E2B9uIF;IAWM,cAAc;E3BsuIlB;E2BjvIF;IAaQ,YAAY;E3BuuIlB;E2BpvIF;I1BiCI,oB0BlB2C;E3BwuI7C;AACF;;A2BvuIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3B0uIrB;;A2B/uIA;;;EAaU,c5BxKoB;ACg5I9B;;A2BrvIA;;;EAeQ,kB5B3IQ;ACu3IhB;;A2B3vIA;;;EAiBQ,kB5B/IQ;AC+3IhB;;A2BjwIA;;;EAmBQ,iB5BlJO;ACs4If;;A2BvwIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BsvIhB;;A2BjxIA;;EA+BM,mB7B1LgB;AEi7ItB;;A2BtxIA;EAiCM,OAAO;A3ByvIb;;A2B1xIA;;EAqCM,oB7BhMgB;AE07ItB;;A2B/xIA;EAuCM,QAAQ;A3B4vId;;A2BnyIA;EA2CM,6BAA6B;E1BnB/B,a0BoB+B;EAC7B,YAAY;EACZ,UAAU;A3B4vIhB;;A2B1yIA;EAgDM,kB5B5KU;AC06IhB;;A2B9yIA;EAkDM,kB5BhLU;ACg7IhB;;A2BlzIA;EAoDM,iB5BnLS;ACq7If;;A4Bx9IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B+8IrB;;A6Bn9IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B+9I3C;;A6B39IA;EAYM,c9BjBwB;ACo+I9B;;A6B/9IA;EAcI,mBAAmB;EACnB,aAAa;A7Bq9IjB;;A6Bp+IA;E5BuKI,gB4BtJoC;A7Bu9IxC;;A6Bx+IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bw9I5B;;A6B9+IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7B09IvB;;A6Bn/IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B49I/B;;A6B3/IA;E5BuKI,kB4BrIuC;A7B69I3C;;A6B//IA;E5BuKI,mB4BnIuC;A7B+9I3C;;A6BngJA;;EAyCM,uBAAuB;A7B+9I7B;;A6BxgJA;;EA6CM,yBAAyB;A7Bg+I/B;;A6B7gJA;EAgDI,kB9BrBY;ACs/IhB;;A6BjhJA;EAkDI,kB9BzBY;AC4/IhB;;A6BrhJA;EAoDI,iB9B5BW;ACigJf;;A6BzhJA;EAwDM,iBAAiB;A7Bq+IvB;;A6B7hJA;EA2DM,iBAAiB;A7Bs+IvB;;A6BjiJA;EA8DM,iBAAiB;A7Bu+IvB;;A6BriJA;EAiEM,iBAAiB;A7Bw+IvB;;A8B9hJA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,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CnwJA;EACE,mBAAmB;EACnB,yBAAyB;AhCswJ3B;;ACvuJE;E+BjCF;IAKI,aAAa;EhCwwJf;AACF;;AiC50JA;EACE,uBAAuB;EACvB,aAAa;EACb,mBAAmB;AjC+0JrB;;AiCl1JA;EAKI,sBAV2B;AjC21J/B;;AiCt1JA;EAOI,8ClCR0B;EkCS1B,aAAa;EACb,oBAb2B;AjCg2J/B;;AiC51JA;;EAYM,qBAfgC;AjCo2JtC;;AiCj2JA;EAcM,mBAhBwB;AjCu2J9B;;AiCr2JA;EAgBQ,kBAlBsB;AjC22J9B;;AiCz2JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCs3JpB;;AiC/2JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjC03J5B;;AiCz1JA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC41JhB;;AiC11JA;EhCsII,iBgC9KgB;AjCs4JpB;;AiC31JA;EhCmII,kBgC9KgB;AjC04JpB;;AiC51JA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC+1JrB;;AC/yJE;EgCpDF;IAQI,gBAAgB;EjCg2JlB;AACF;;AkCv4JA;EACE,enCgBW;AC03Jb;;AkC34JA;EAII,kBnCcY;AC63JhB;;AkC/4JA;EAMI,kBnCUY;ACm4JhB;;AkCn5JA;EAQI,iBnCOW;ACw4Jf;;AkC74JA;EACE,iBArB0B;AlCq6J5B;;AkCj5JA;EAGI,kBnCoCc;EmCnCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC26JrC;;AkCx5JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACq7J9B;;AkC75JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV82JhB;;AkCl6JA;EjCoJI,+BFxK0B;EmCqCxB,cAnC0B;EjCsK5B,qBiCrKkC;AlCy7JtC;;AkCp5JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCu5J3B;;AkC35JA;EAMI,eAtCoB;AlC+7JxB;;AkC/5JA;EAQI,kBAxCoB;AlCm8JxB;;AmC97JA;EAEE,4BpCZ4B;EoCa5B,kBpC4CU;EoC3CV,epCUW;ACs7Jb;;AmCp8JA;EAMI,mBAAmB;AnCk8JvB;;AmCx8JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCo8J9B;;AmC78JA;EAYI,kBpCGY;ACk8JhB;;AmCj9JA;EAcI,kBpCDY;ACw8JhB;;AmCr9JA;EAgBI,iBpCJW;AC68Jf;;AmCz9JA;EAsCM,uBAH+C;AnC07JrD;;AmC79JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACu/J7B;;AmCl+JA;EA2CQ,mBpCnDuB;AC8+J/B;;AmCt+JA;EAsCM,yBAH+C;AnCu8JrD;;AmC1+JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACu/J/B;;AmC/+JA;EA2CQ,qBpChEqB;ACwgK7B;;AmCn/JA;EAsCM,yBAH+C;AnCo9JrD;;AmCv/JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVm8JrB;;AmC5/JA;EA2CQ,wBpCrDsB;AC0gK9B;;AmChgKA;EAsCM,yBAH+C;AnCi+JrD;;AmCpgKA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV88JhB;;AmCzgKA;EA2CQ,qBpC5DsB;AC8hK9B;;AmC7gKA;EAsCM,yBzB4B0C;AV+8JhD;;AmCjhKA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV29JhB;;AmCthKA;EA2CQ,qBpC9C0B;EoC+C1B,czB8B6D;AVi9JrE;;AmC3hKA;EAsCM,yBzB4B0C;AV69JhD;;AmC/hKA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVy+JhB;;AmCpiKA;EA2CQ,qBpC5C0B;EoC6C1B,czB8B6D;AV+9JrE;;AmCziKA;EAsCM,yBzB4B0C;AV2+JhD;;AmC7iKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVu/JhB;;AmCljKA;EA2CQ,qBpC7C0B;EoC8C1B,czB8B6D;AV6+JrE;;AmCvjKA;EAsCM,yBzB4B0C;AVy/JhD;;AmC3jKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVqgKhB;;AmChkKA;EA2CQ,qBpC/C0B;EoCgD1B,czB8B6D;AV2/JrE;;AmCrkKA;EAsCM,yBzB4B0C;AVugKhD;;AmCzkKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVqhKrB;;AmC9kKA;EA2CQ,qBpChD0B;EoCiD1B,czB8B6D;AVygKrE;;AmCnlKA;EAsCM,yBzB4B0C;AVqhKhD;;AmCvlKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AViiKhB;;AmC5lKA;EA2CQ,qBpC1CyB;EoC2CzB,czB8B6D;AVuhKrE;;AmCnjKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCsjKpB;;AmChkKA;EAYI,YAAY;EACZ,cAAc;ElCgGd,oBkC/FsC;AnCwjK1C;;AmCtkKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnC0jK9B;;AmCxjKA;EACE,qBpChF4B;EoCiF5B,kBpCrBU;EoCsBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC4oKnC;;AmCjkKA;;EASI,uBpCnF2B;ACgpK/B;;AmCtkKA;EAWI,6BAlFgD;AnCipKpD;;AoCjoKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC2qKZ;;AoC3oKA;EAWI,aAAa;ApCooKjB;;AoCloKA;EAEE,wCrC/C2B;ACmrK7B;;AoCloKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApCqoKb;;ACpmKE;EmCvCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpCgsKzB;AACF;;AoCvoKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCsHb,UmC9KoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCqsK7B;;AoCvoKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApC0oKzB;;AoCxoKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC2oKpB;;AoCzoKA;EACE,gCrCjF4B;EqCkF5B,2BrCrBgB;EqCsBhB,4BrCtBgB;ACkqKlB;;AoC1oKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApC0tKhC;;AoC3oKA;EACE,8BrChCgB;EqCiChB,+BrCjCgB;EqCkChB,6BrC/F4B;AC6uK9B;;AoCjpKA;EnC4EI,kBmCtEuC;ApC+oK3C;;AoC7oKA;EnC3CE,iCAAiC;EmC6CjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCsuK9B;;AqC1sKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCmwKb;;AqCjtKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC8wK7B;;AqCttKA;;EAcU,ctCtEmB;ACmxK7B;;AqC3tKA;;;;EAoBY,yB3B8BqB;E2B7BrB,ctC7EiB;AC2xK7B;;AqCnuKA;EAwBY,qBtChFiB;AC+xK7B;;AqCvuKA;EA0BQ,ctClFqB;ACmyK7B;;AC3sKE;EoChCF;;;;IAgCY,ctCxFiB;EC2yK3B;EqCnvKF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,ctC/Fe;ECwzK3B;EqChwKF;;IA0Cc,qBtClGe;EC4zK3B;EqCpwKF;;;IA8CU,yB3BIuB;I2BHvB,ctCvGmB;ECk0K3B;EqC1wKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECs0K3B;AACF;;AqC/wKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC+zK/B;;AqCpxKA;;EAcU,YtCzDqB;ACo0K/B;;AqCzxKA;;;;EAoBY,uB3B8BqB;E2B7BrB,YtChEmB;AC40K/B;;AqCjyKA;EAwBY,mBtCnEmB;ACg1K/B;;AqCryKA;EA0BQ,YtCrEuB;ACo1K/B;;ACzwKE;EoChCF;;;;IAgCY,YtC3EmB;EC41K7B;EqCjzKF;;;;;;;;;;IAsCc,uB3BYmB;I2BXnB,YtClFiB;ECy2K7B;EqC9zKF;;IA0Cc,mBtCrFiB;EC62K7B;EqCl0KF;;;IA8CU,uB3BIuB;I2BHvB,YtC1FqB;ECm3K7B;EqCx0KF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECu3K7B;AACF;;AqC70KA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV4zKrB;;AqCl1KA;;EAcU,yB3BQW;AVi0KrB;;AqCv1KA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AVy0KrB;;AqC/1KA;EAwBY,gC3BFS;AV60KrB;;AqCn2KA;EA0BQ,yB3BJa;AVi1KrB;;ACv0KE;EoChCF;;;;IAgCY,yB3BVS;EVy1KnB;EqC/2KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EVs2KnB;EqC53KF;;IA0Cc,gC3BpBO;EV02KnB;EqCh4KF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVg3KnB;EqCt4KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVo3KnB;AACF;;AqC34KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVw3KhB;;AqCh5KA;;EAcU,W3BUM;AV63KhB;;AqCr5KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVq4KhB;;AqC75KA;EAwBY,kB3BAI;AVy4KhB;;AqCj6KA;EA0BQ,W3BFQ;AV64KhB;;ACr4KE;EoChCF;;;;IAgCY,W3BRI;EVq5Kd;EqC76KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVk6Kd;EqC17KF;;IA0Cc,kB3BlBE;EVs6Kd;EqC97KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV46Kd;EqCp8KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EVg7Kd;AACF;;AqCz8KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVs7KhB;;AqC98KA;;EAcU,W3BUM;AV27KhB;;AqCn9KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVm8KhB;;AqC39KA;EAwBY,kB3BAI;AVu8KhB;;AqC/9KA;EA0BQ,W3BFQ;AV28KhB;;ACn8KE;EoChCF;;;;IAgCY,W3BRI;EVm9Kd;EqC3+KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVg+Kd;EqCx/KF;;IA0Cc,kB3BlBE;EVo+Kd;EqC5/KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV0+Kd;EqClgLF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV8+Kd;AACF;;AqCvgLA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVo/KhB;;AqC5gLA;;EAcU,W3BUM;AVy/KhB;;AqCjhLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVigLhB;;AqCzhLA;EAwBY,kB3BAI;AVqgLhB;;AqC7hLA;EA0BQ,W3BFQ;AVygLhB;;ACjgLE;EoChCF;;;;IAgCY,W3BRI;EVihLd;EqCziLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV8hLd;EqCtjLF;;IA0Cc,kB3BlBE;EVkiLd;EqC1jLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVwiLd;EqChkLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV4iLd;AACF;;AqCrkLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVkjLhB;;AqC1kLA;;EAcU,W3BUM;AVujLhB;;AqC/kLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV+jLhB;;AqCvlLA;EAwBY,kB3BAI;AVmkLhB;;AqC3lLA;EA0BQ,W3BFQ;AVukLhB;;AC/jLE;EoChCF;;;;IAgCY,W3BRI;EV+kLd;EqCvmLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV4lLd;EqCpnLF;;IA0Cc,kB3BlBE;EVgmLd;EqCxnLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVsmLd;EqC9nLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EV0mLd;AACF;;AqCnoLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AVgnLhB;;AqCxoLA;;EAcU,W3BUM;AVqnLhB;;AqC7oLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV6nLhB;;AqCrpLA;EAwBY,kB3BAI;AVioLhB;;AqCzpLA;EA0BQ,W3BFQ;AVqoLhB;;AC7nLE;EoChCF;;;;IAgCY,W3BRI;EV6oLd;EqCrqLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV0pLd;EqClrLF;;IA0Cc,kB3BlBE;EV8pLd;EqCtrLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVoqLd;EqC5rLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVwqLd;AACF;;AqCjsLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AVgrLrB;;AqCtsLA;;EAcU,yB3BQW;AVqrLrB;;AqC3sLA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AV6rLrB;;AqCntLA;EAwBY,gC3BFS;AVisLrB;;AqCvtLA;EA0BQ,yB3BJa;AVqsLrB;;AC3rLE;EoChCF;;;;IAgCY,yB3BVS;EV6sLnB;EqCnuLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EV0tLnB;EqChvLF;;IA0Cc,gC3BpBO;EV8tLnB;EqCpvLF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVouLnB;EqC1vLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVwuLnB;AACF;;AqC/vLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV4uLhB;;AqCpwLA;;EAcU,W3BUM;AVivLhB;;AqCzwLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVyvLhB;;AqCjxLA;EAwBY,kB3BAI;AV6vLhB;;AqCrxLA;EA0BQ,W3BFQ;AViwLhB;;ACzvLE;EoChCF;;;;IAgCY,W3BRI;EVywLd;EqCjyLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVsxLd;EqC9yLF;;IA0Cc,kB3BlBE;EV0xLd;EqClzLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVgyLd;EqCxzLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVoyLd;AACF;;AqC7zLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC2wLf;;AqCp0LA;EA2DI,gCtCxG0B;ACq3L9B;;AqCx0LA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArCg4LnB;;AqC/0LA;EAgEI,SAAS;ArCmxLb;;AqCn1LA;EAkEM,iCtC/GwB;ACo4L9B;;AqCv1LA;EAoEI,MAAM;ArCuxLV;;AqCrxLA;;EAGI,oBA9HmB;ArCq5LvB;;AqC1xLA;;EAKI,uBAhImB;ArC05LvB;;AqCxxLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCk6LvB;;AqCzxLA;EAIM,6BAA6B;ArCyxLnC;;AqCvxLA;EpCjFE,iCAAiC;EoCmFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArC0xLpB;;AqCxxLA;EAEE,ctCrJ4B;EEoB5B,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eoC7BqB;EpC8BrB,kBAAkB;EAClB,coC/BqB;EpC6KnB,kBoCpBkC;ArCmyLtC;;AC55LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBF6BQ;EE5BR,yDAAyD;EACzD,oCFsBa;EErBb,WAAW;AD+5Lf;;AC95LI;EACE,oBAAoB;ADi6L1B;;ACh6LI;EACE,oBAAoB;ADm6L1B;;ACl6LI;EACE,oBAAoB;ADq6L1B;;ACp6LE;EACE,qCAAiC;ADu6LrC;;ACn6LM;EACE,wCAAwC;ADs6LhD;;ACr6LM;EACE,UAAU;ADw6LlB;;ACv6LM;EACE,0CAA0C;AD06LlD;;AqC10LA;EACE,aAAa;ArC60Lf;;AqC30LA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArC80LpB;;AqCp1LA;;EASM,qBAAqB;EACrB,sBAAsB;ArCg1L5B;;AqC90LA;;EAEE,eAAe;ArCi1LjB;;AqCn1LA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;ACq/LlC;;AqCl1LA;EACE,YAAY;EACZ,cAAc;ArCq1LhB;;AqCv1LA;EAII,mBA7KgC;ArCogMpC;;AqC31LA;EAMI,UAAU;ArCy1Ld;;AqC/1LA;EAQI,YAAY;EACZ,cAAc;ArC21LlB;;AqCp2LA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArC61LtC;;AqC12LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;ACkhMlC;;AqC/2LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArCg2L9E;;AqC91LA;EACE,YAAY;EACZ,cAAc;ArCi2LhB;;AqC/1LA;EpCrCI,mBoCsCoC;ArCk2LxC;;AqCn2LA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpClCpB,aoCmC6B;ArCm2LjC;;AqCj2LA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArCo2LrB;;AqCv2LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCs2LzB;;AqCp2LA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCu2LlB;;ACr/LE;EoCpCF;IAsLI,cAAc;ErCw2LhB;EqCv2LA;;IAGI,mBAAmB;IACnB,aAAa;ErCw2LjB;EqCv2LA;IAEI,aAAa;ErCw2LjB;EqCh8LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCy2LnB;EqC52LA;IAKI,cAAc;ErC02LlB;EqCx2LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCqmMjB;EqC92LA;IAKI,SAAS;ErC42Lb;EqCj3LA;IAOM,4CtCrQqB;ECknM3B;EqCp3LA;IASI,MAAM;ErC82LV;EqCv3LA;IpC7LA,iCAAiC;IoC2M3B,iCAA2C;IAC3C,cAAc;ErC62LpB;EqC52LA;;IAGI,oBA9QiB;ErC2nMrB;EqCh3LA;;IAKI,uBAhRiB;ErC+nMrB;AACF;;AC3iME;EoC8LA;;;;IAIE,oBAAoB;IACpB,aAAa;ErCi3Lf;EqCplMF;IAqOI,mBA1RmB;ErC4oMrB;EqCn3LA;IAGI,kBA1R0B;ErC6oM9B;EqCt3LA;;IAMM,mBAAmB;ErCo3LzB;EqC13LA;;IASM,kBtCjOI;ECslMV;EqC93LA;;;;IAgBQ,wCAAwC;ErCo3LhD;EqCp4LA;IAuBU,wCAAwC;ErCg3LlD;EqCv4LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECuqM3B;EqC34LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECupMhC;EqCnhMF;IAsKI,aAAa;ErCg3Lf;EqC7gMF;;IAgKI,mBAAmB;IACnB,aAAa;ErCi3Lf;EqC5/LF;IA8IM,oBAAoB;ErCi3LxB;EqCn3LA;IAKM,oDAAoD;ErCi3L1D;EqCt3LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErCk3Lf;EqC93LA;IAkBM,cAAc;ErC+2LpB;EqC92LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErC+2LhC;EqC3iMF;IA8LI,YAAY;IACZ,cAAc;ErCg3LhB;EqC/2LA;IACE,2BAA2B;IpC/K3B,iBoCgLoC;ErCi3LtC;EqCh3LA;IACE,yBAAyB;IpClLzB,kBoCmLoC;ErCk3LtC;EqCx/LF;IAwII,uBtCxV2B;IsCyV3B,8BtCjSc;IsCkSd,+BtClSc;IsCmSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCnLnB,QoCoLuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErCosMpB;EqCtgMF;IAqJM,sBAAsB;IACtB,mBAAmB;ErCo3LvB;EqCn4LA;IpCpLE,kBoCqMuC;ErCq3LzC;EqCt4LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;EC8uM3B;EqC14LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;EC8tMhC;EqCr3LE;IAEE,kBtC1TY;IsC2TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtChUM;IsCiUN,uCAAuC;ErCs3L3C;EqC15LA;IAsCI,UAAU;IACV,QAAQ;ErCu3LZ;EqC7hMF;IAwKI,cAAc;ErCw3LhB;EqCv3LA;;IpC9NE,sBoCiOyC;ErCw3L3C;EqC33LA;;IpC9NE,qBoCmOyC;ErC03L3C;EqCx3LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC4wMjB;EqC93LA;IAKI,SAAS;ErC43Lb;EqCj4LA;IAOM,4CtC5ZqB;ECyxM3B;EqCp4LA;IASI,MAAM;ErC83LV;EqC73LA;;IAGI,oBA/ZiB;ErC6xMrB;EqCj4LA;;IAKI,uBAjaiB;ErCiyMrB;EqCr4LA;;IAOI,oBAA4D;ErCk4LhE;EqCz4LA;;IASI,uBAA+D;ErCo4LnE;EqCl4LA;;IAGI,ctC7auB;ECgzM3B;EqCt4LA;;IAKI,6BAla2C;ErCuyM/C;EqCp4LA;IAKM,yBtCzasB;EC2yM5B;AACF;;AqC/3LA;EAEI,iCAA2C;ArCi4L/C;;AsCzxMA;EAEE,evCFW;EuCGX,gBAnC0B;AtC8zM5B;;AsC9xMA;EAMI,kBvCLY;ACiyMhB;;AsClyMA;EAQI,kBvCTY;ACuyMhB;;AsCtyMA;EAUI,iBvCZW;AC4yMf;;AsC1yMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCmBiB;AC8wMvB;;AsCjzMA;EAkBM,qBvCiBiB;ACkxMvB;;AsCjyMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtCoyMpB;;AsClyMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtCmyMpB;;AsCjyMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AE+2MtB;;AsCzyMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACu3M9B;;AsChzMA;;;EAUI,qBvCjE8B;AC62MlC;;AsCtzMA;;;EAYI,iDvCvFyB;ACu4M7B;;AsC5zMA;;;;;EAeI,yBvClF0B;EuCmF1B,qBvCnF0B;EuCoF1B,gBAAgB;EAChB,cvCvF0B;EuCwF1B,YAAY;AtCqzMhB;;AsCnzMA;;EAEE,oBAvFkC;EAwFlC,qBAvFmC;EAwFnC,mBAAmB;AtCszMrB;;AsCpzMA;EAEI,yBvCpF8B;EuCqF9B,qBvCrF8B;EuCsF9B,W5B1BY;AVg1MhB;;AsCpzMA;EACE,cvCtG4B;EuCuG5B,oBAAoB;AtCuzMtB;;AsCrzMA;EACE,eAAe;AtCwzMjB;;AsCzzMA;EAGI,gBAAgB;AtC0zMpB;;ACz0ME;EqCjEF;IAoFI,eAAe;EtC2zMjB;EsCl1MF;;IA0BI,YAAY;IACZ,cAAc;EtC4zMhB;EsCv0MF;IAcM,YAAY;IACZ,cAAc;EtC4zMlB;AACF;;ACp1ME;EqCQF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtC8zMV;EsCt4MF;;;;IA6EI,gBAAgB;IAChB,aAAa;EtC+zMf;EsC9zMA;IACE,QAAQ;EtCg0MV;EsC/zMA;IACE,QAAQ;EtCi0MV;EsC96MF;IA+GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtCk0Mf;EsCr0MA;IAMM,QAAQ;EtCk0Md;EsCx0MA;IAQM,uBAAuB;IACvB,QAAQ;EtCm0Md;EsC50MA;IAWM,QAAQ;EtCo0Md;EsC/0MA;IAcM,QAAQ;EtCo0Md;EsCl1MA;IAgBM,QAAQ;EtCq0Md;EsCr1MA;IAkBM,yBAAyB;IACzB,QAAQ;EtCs0Md;AACF;;AuC78MA;EACE,kBxCsCgB;EwCrChB,0FxChC2B;EwCiC3B,exCEW;AC88Mb;;AuCn9MA;EAKI,qBxCWkB;ACu8MtB;;AuCv9MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;AC0/M7B;;AuC59MA;EAeQ,0BxChCuB;ACi/M/B;;AuCh+MA;EAiBQ,YxClCuB;ACq/M/B;;AuCp+MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;AC0/M/B;;AuCz+MA;EAeQ,4BxC7CqB;AC2gN7B;;AuC7+MA;EAiBQ,cxC/CqB;AC+gN7B;;AuCj/MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AVs8MrB;;AuCt/MA;EAeQ,+BxClCsB;AC6gN9B;;AuC1/MA;EAiBQ,iBxCpCsB;ACihN9B;;AuC9/MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVi9MhB;;AuCngNA;EAeQ,4BxCzCsB;ACiiN9B;;AuCvgNA;EAiBQ,cxC3CsB;ACqiN9B;;AuC3gNA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AV89MhB;;AuChhNA;EAeQ,4BxC3B0B;ACgiNlC;;AuCphNA;EAiBQ,cxC7B0B;ACoiNlC;;AuCxhNA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AV2+MhB;;AuC7hNA;EAeQ,4BxCzB0B;AC2iNlC;;AuCjiNA;EAiBQ,cxC3B0B;AC+iNlC;;AuCriNA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVw/MhB;;AuC1iNA;EAeQ,4BxC1B0B;ACyjNlC;;AuC9iNA;EAiBQ,cxC5B0B;AC6jNlC;;AuCljNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AVqgNhB;;AuCvjNA;EAeQ,4BxC5B0B;ACwkNlC;;AuC3jNA;EAiBQ,cxC9B0B;AC4kNlC;;AuC/jNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AVohNrB;;AuCpkNA;EAeQ,4BxC7B0B;ACslNlC;;AuCxkNA;EAiBQ,cxC/B0B;AC0lNlC;;AuC5kNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AV+hNhB;;AuCjlNA;EAeQ,4BxCvByB;AC6lNjC;;AuCrlNA;EAiBQ,cxCzByB;ACimNjC;;AuCtkNA;;EAGI,gCxC3C2B;ACmnN/B;;AuCtkNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvC8nNlC;;AuCvkNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvC0kNzB;;AuC9kNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvC4kNlB;;AuCplNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;ACopN9B;;AuC3kNA;EAEI,cxC1E0B;ACupN9B;;AuC/kNA;EAIM,cxC7D4B;AC4oNlC;;AuC7kNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCglNvB;;AuCrlNA;EtC6FI,mBsCtFsC;AvCklN1C;;AuCzlNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvColNf;;AuC/lNA;EAaI,eAAe;AvCslNnB;;AuCnmNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;ACurN9B;;AuCxmNA;EAkBM,cxCjF4B;AC2qNlC;;AuC5mNA;EAoBI,8BxClCc;EwCmCd,+BxCnCc;AC+nNlB;;AuC1lNA;;EAEE,eAAe;AvC6lNjB;;AuC/lNA;;EAII,4BxCnG0B;ACmsN9B;;AuC9lNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EE0K1B,mBsC7DoC;AvCumNxC;;AuC1mNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCymNxB;;AwCnsNA;EvCqCE,iCAAiC;EuCjCjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxCosNrB;;AwC9sNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxCssNvB;;AwC3tNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACwvN9B;;AwChuNA;EA0BI,cAAc;AxC0sNlB;;AwCpuNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACivNlC;;AwCzuNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxC6sN/B;;AwCpvNA;EAyCM,qBAAqB;AxC+sN3B;;AwCxvNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCitN3B;;AwC/vNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxCmtN1B;;AwCpwNA;EvCoJI,kBuChGuC;AxCotN3C;;AwCxwNA;EvCoJI,mBuC9FuC;AxCstN3C;;AwC5wNA;EA0DM,uBAAuB;AxCstN7B;;AwChxNA;EA6DM,yBAAyB;AxCutN/B;;AwCpxNA;EAiEM,6BAA6B;EAI3B,0BzC7BI;ACivNZ;;AwCzxNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;ACkzN9B;;AwC9xNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxCstNrF;;AwCpyNA;EAiFM,YAAY;EACZ,cAAc;AxCutNpB;;AwCzyNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCwtNxB;;AwCjzNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxC0tNlB;;AwCvzNA;EvCoJI,kBuCpDuE;AxC2tN3E;;AwC3zNA;EAsGU,4BzC9DE;EyC+DF,+BzC/DE;ACwxNZ;;AwCh0NA;EA6GU,2BzCrEE;EyCsEF,8BzCtEE;AC6xNZ;;AwCr0NA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCwtNpB;;AwC50NA;EAsHM,mBAAmB;AxC0tNzB;;AwCh1NA;EA+HY,kCzCrFW;EyCsFX,+BzCtFW;EyCuFX,qBAAqB;AxCqtNjC;;AwCt1NA;EAwIY,iCzC9FW;EyC+FX,8BzC/FW;EyCgGX,oBAAoB;AxCktNhC;;AwC51NA;EA6II,kBzCrIY;ACw1NhB;;AwCh2NA;EA+II,kBzCzIY;AC81NhB;;AwCp2NA;EAiJI,iBzC5IW;ACm2Nf;;AyCt4NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1C64NpB;;A0Cr4NE;EACE,UAAU;EACV,YAAY;A1Cw4NhB;;A0Cv4NE;EACE,UAAU;EACV,WAAW;A1C04Nf;;A0Cz4NE;EACE,UAAU;EACV,UAAU;A1C44Nd;;A0C34NE;EACE,UAAU;EACV,eAAe;A1C84NnB;;A0C74NE;EACE,UAAU;EACV,UAAU;A1Cg5Nd;;A0C/4NE;EACE,UAAU;EACV,eAAe;A1Ck5NnB;;A0Cj5NE;EACE,UAAU;EACV,UAAU;A1Co5Nd;;A0Cn5NE;EACE,UAAU;EACV,UAAU;A1Cs5Nd;;A0Cr5NE;EACE,UAAU;EACV,UAAU;A1Cw5Nd;;A0Cv5NE;EACE,UAAU;EACV,UAAU;A1C05Nd;;A0Cz5NE;EACE,UAAU;EACV,UAAU;A1C45Nd;;A0C35NE;EzCuIE,iByCtImC;A1C85NvC;;A0C75NE;EzCqIE,sByCpIwC;A1Cg6N5C;;A0C/5NE;EzCmIE,iByClImC;A1Ck6NvC;;A0Cj6NE;EzCiIE,sByChIwC;A1Co6N5C;;A0Cn6NE;EzC+HE,iByC9HmC;A1Cs6NvC;;A0Cr6NE;EzC6HE,iByC5HmC;A1Cw6NvC;;A0Cv6NE;EzC2HE,iByC1HmC;A1C06NvC;;A0Cz6NE;EzCyHE,iByCxHmC;A1C46NvC;;A0C36NE;EzCuHE,iByCtHmC;A1C86NvC;;A0C56NI;EACE,UAAU;EACV,SAAiC;A1C+6NvC;;A0C96NI;EzCiHA,gByChH4D;A1Ci7NhE;;A0Cr7NI;EACE,UAAU;EACV,eAAiC;A1Cw7NvC;;A0Cv7NI;EzCiHA,sByChH4D;A1C07NhE;;A0C97NI;EACE,UAAU;EACV,gBAAiC;A1Ci8NvC;;A0Ch8NI;EzCiHA,uByChH4D;A1Cm8NhE;;A0Cv8NI;EACE,UAAU;EACV,UAAiC;A1C08NvC;;A0Cz8NI;EzCiHA,iByChH4D;A1C48NhE;;A0Ch9NI;EACE,UAAU;EACV,gBAAiC;A1Cm9NvC;;A0Cl9NI;EzCiHA,uByChH4D;A1Cq9NhE;;A0Cz9NI;EACE,UAAU;EACV,gBAAiC;A1C49NvC;;A0C39NI;EzCiHA,uByChH4D;A1C89NhE;;A0Cl+NI;EACE,UAAU;EACV,UAAiC;A1Cq+NvC;;A0Cp+NI;EzCiHA,iByChH4D;A1Cu+NhE;;A0C3+NI;EACE,UAAU;EACV,gBAAiC;A1C8+NvC;;A0C7+NI;EzCiHA,uByChH4D;A1Cg/NhE;;A0Cp/NI;EACE,UAAU;EACV,gBAAiC;A1Cu/NvC;;A0Ct/NI;EzCiHA,uByChH4D;A1Cy/NhE;;A0C7/NI;EACE,UAAU;EACV,UAAiC;A1CggOvC;;A0C//NI;EzCiHA,iByChH4D;A1CkgOhE;;A0CtgOI;EACE,UAAU;EACV,gBAAiC;A1CygOvC;;A0CxgOI;EzCiHA,uByChH4D;A1C2gOhE;;A0C/gOI;EACE,UAAU;EACV,gBAAiC;A1CkhOvC;;A0CjhOI;EzCiHA,uByChH4D;A1CohOhE;;A0CxhOI;EACE,UAAU;EACV,WAAiC;A1C2hOvC;;A0C1hOI;EzCiHA,kByChH4D;A1C6hOhE;;ACz/NE;EyClGF;IAiEM,UAAU;IACV,YAAY;E1C+hOhB;E0CjmOF;IAoEM,UAAU;IACV,WAAW;E1CgiOf;E0CrmOF;IAuEM,UAAU;IACV,UAAU;E1CiiOd;E0CzmOF;IA0EM,UAAU;IACV,eAAe;E1CkiOnB;E0C7mOF;IA6EM,UAAU;IACV,UAAU;E1CmiOd;E0CjnOF;IAgFM,UAAU;IACV,eAAe;E1CoiOnB;E0CrnOF;IAmFM,UAAU;IACV,UAAU;E1CqiOd;E0CznOF;IAsFM,UAAU;IACV,UAAU;E1CsiOd;E0C7nOF;IAyFM,UAAU;IACV,UAAU;E1CuiOd;E0CjoOF;IA4FM,UAAU;IACV,UAAU;E1CwiOd;E0CroOF;IA+FM,UAAU;IACV,UAAU;E1CyiOd;E0CzoOF;IzC8KI,iByC5EqC;E1C0iOvC;E0C5oOF;IzC8KI,sByC1E0C;E1C2iO5C;E0C/oOF;IzC8KI,iByCxEqC;E1C4iOvC;E0ClpOF;IzC8KI,sByCtE0C;E1C6iO5C;E0CrpOF;IzC8KI,iByCpEqC;E1C8iOvC;E0CxpOF;IzC8KI,iByClEqC;E1C+iOvC;E0C3pOF;IzC8KI,iByChEqC;E1CgjOvC;E0C9pOF;IzC8KI,iByC9DqC;E1CijOvC;E0CjqOF;IzC8KI,iByC5DqC;E1CkjOvC;E0CpqOF;IAqHQ,UAAU;IACV,SAAiC;E1CkjOvC;E0CxqOF;IzC8KI,gByCtD8D;E1CmjOhE;E0C3qOF;IAqHQ,UAAU;IACV,eAAiC;E1CyjOvC;E0C/qOF;IzC8KI,sByCtD8D;E1C0jOhE;E0ClrOF;IAqHQ,UAAU;IACV,gBAAiC;E1CgkOvC;E0CtrOF;IzC8KI,uByCtD8D;E1CikOhE;E0CzrOF;IAqHQ,UAAU;IACV,UAAiC;E1CukOvC;E0C7rOF;IzC8KI,iByCtD8D;E1CwkOhE;E0ChsOF;IAqHQ,UAAU;IACV,gBAAiC;E1C8kOvC;E0CpsOF;IzC8KI,uByCtD8D;E1C+kOhE;E0CvsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CqlOvC;E0C3sOF;IzC8KI,uByCtD8D;E1CslOhE;E0C9sOF;IAqHQ,UAAU;IACV,UAAiC;E1C4lOvC;E0CltOF;IzC8KI,iByCtD8D;E1C6lOhE;E0CrtOF;IAqHQ,UAAU;IACV,gBAAiC;E1CmmOvC;E0CztOF;IzC8KI,uByCtD8D;E1ComOhE;E0C5tOF;IAqHQ,UAAU;IACV,gBAAiC;E1C0mOvC;E0ChuOF;IzC8KI,uByCtD8D;E1C2mOhE;E0CnuOF;IAqHQ,UAAU;IACV,UAAiC;E1CinOvC;E0CvuOF;IzC8KI,iByCtD8D;E1CknOhE;E0C1uOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwnOvC;E0C9uOF;IzC8KI,uByCtD8D;E1CynOhE;E0CjvOF;IAqHQ,UAAU;IACV,gBAAiC;E1C+nOvC;E0CrvOF;IzC8KI,uByCtD8D;E1CgoOhE;E0CxvOF;IAqHQ,UAAU;IACV,WAAiC;E1CsoOvC;E0C5vOF;IzC8KI,kByCtD8D;E1CuoOhE;AACF;;AC1pOE;EyCtGF;IA4HM,UAAU;IACV,YAAY;E1CyoOhB;E0CtwOF;IAgIM,UAAU;IACV,WAAW;E1CyoOf;E0C1wOF;IAoIM,UAAU;IACV,UAAU;E1CyoOd;E0C9wOF;IAwIM,UAAU;IACV,eAAe;E1CyoOnB;E0ClxOF;IA4IM,UAAU;IACV,UAAU;E1CyoOd;E0CtxOF;IAgJM,UAAU;IACV,eAAe;E1CyoOnB;E0C1xOF;IAoJM,UAAU;IACV,UAAU;E1CyoOd;E0C9xOF;IAwJM,UAAU;IACV,UAAU;E1CyoOd;E0ClyOF;IA4JM,UAAU;IACV,UAAU;E1CyoOd;E0CtyOF;IAgKM,UAAU;IACV,UAAU;E1CyoOd;E0C1yOF;IAoKM,UAAU;IACV,UAAU;E1CyoOd;E0C9yOF;IzC8KI,iByCNqC;E1CyoOvC;E0CjzOF;IzC8KI,sByCH0C;E1CyoO5C;E0CpzOF;IzC8KI,iByCAqC;E1CyoOvC;E0CvzOF;IzC8KI,sByCG0C;E1CyoO5C;E0C1zOF;IzC8KI,iByCMqC;E1CyoOvC;E0C7zOF;IzC8KI,iByCSqC;E1CyoOvC;E0Ch0OF;IzC8KI,iByCYqC;E1CyoOvC;E0Cn0OF;IzC8KI,iByCeqC;E1CyoOvC;E0Ct0OF;IzC8KI,iByCkBqC;E1CyoOvC;E0Cz0OF;IAoMQ,UAAU;IACV,SAAiC;E1CwoOvC;E0C70OF;IzC8KI,gByC0B8D;E1CwoOhE;E0Ch1OF;IAoMQ,UAAU;IACV,eAAiC;E1C+oOvC;E0Cp1OF;IzC8KI,sByC0B8D;E1C+oOhE;E0Cv1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CspOvC;E0C31OF;IzC8KI,uByC0B8D;E1CspOhE;E0C91OF;IAoMQ,UAAU;IACV,UAAiC;E1C6pOvC;E0Cl2OF;IzC8KI,iByC0B8D;E1C6pOhE;E0Cr2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CoqOvC;E0Cz2OF;IzC8KI,uByC0B8D;E1CoqOhE;E0C52OF;IAoMQ,UAAU;IACV,gBAAiC;E1C2qOvC;E0Ch3OF;IzC8KI,uByC0B8D;E1C2qOhE;E0Cn3OF;IAoMQ,UAAU;IACV,UAAiC;E1CkrOvC;E0Cv3OF;IzC8KI,iByC0B8D;E1CkrOhE;E0C13OF;IAoMQ,UAAU;IACV,gBAAiC;E1CyrOvC;E0C93OF;IzC8KI,uByC0B8D;E1CyrOhE;E0Cj4OF;IAoMQ,UAAU;IACV,gBAAiC;E1CgsOvC;E0Cr4OF;IzC8KI,uByC0B8D;E1CgsOhE;E0Cx4OF;IAoMQ,UAAU;IACV,UAAiC;E1CusOvC;E0C54OF;IzC8KI,iByC0B8D;E1CusOhE;E0C/4OF;IAoMQ,UAAU;IACV,gBAAiC;E1C8sOvC;E0Cn5OF;IzC8KI,uByC0B8D;E1C8sOhE;E0Ct5OF;IAoMQ,UAAU;IACV,gBAAiC;E1CqtOvC;E0C15OF;IzC8KI,uByC0B8D;E1CqtOhE;E0C75OF;IAoMQ,UAAU;IACV,WAAiC;E1C4tOvC;E0Cj6OF;IzC8KI,kByC0B8D;E1C4tOhE;AACF;;ACvzOE;EyC9GF;IA2MM,UAAU;IACV,YAAY;E1C+tOhB;E0C36OF;IA8MM,UAAU;IACV,WAAW;E1CguOf;E0C/6OF;IAiNM,UAAU;IACV,UAAU;E1CiuOd;E0Cn7OF;IAoNM,UAAU;IACV,eAAe;E1CkuOnB;E0Cv7OF;IAuNM,UAAU;IACV,UAAU;E1CmuOd;E0C37OF;IA0NM,UAAU;IACV,eAAe;E1CouOnB;E0C/7OF;IA6NM,UAAU;IACV,UAAU;E1CquOd;E0Cn8OF;IAgOM,UAAU;IACV,UAAU;E1CsuOd;E0Cv8OF;IAmOM,UAAU;IACV,UAAU;E1CuuOd;E0C38OF;IAsOM,UAAU;IACV,UAAU;E1CwuOd;E0C/8OF;IAyOM,UAAU;IACV,UAAU;E1CyuOd;E0Cn9OF;IzC8KI,iByC8DqC;E1C0uOvC;E0Ct9OF;IzC8KI,sByCgE0C;E1C2uO5C;E0Cz9OF;IzC8KI,iByCkEqC;E1C4uOvC;E0C59OF;IzC8KI,sByCoE0C;E1C6uO5C;E0C/9OF;IzC8KI,iByCsEqC;E1C8uOvC;E0Cl+OF;IzC8KI,iByCwEqC;E1C+uOvC;E0Cr+OF;IzC8KI,iByC0EqC;E1CgvOvC;E0Cx+OF;IzC8KI,iByC4EqC;E1CivOvC;E0C3+OF;IzC8KI,iByC8EqC;E1CkvOvC;E0C9+OF;IA+PQ,UAAU;IACV,SAAiC;E1CkvOvC;E0Cl/OF;IzC8KI,gByCoF8D;E1CmvOhE;E0Cr/OF;IA+PQ,UAAU;IACV,eAAiC;E1CyvOvC;E0Cz/OF;IzC8KI,sByCoF8D;E1C0vOhE;E0C5/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CgwOvC;E0ChgPF;IzC8KI,uByCoF8D;E1CiwOhE;E0CngPF;IA+PQ,UAAU;IACV,UAAiC;E1CuwOvC;E0CvgPF;IzC8KI,iByCoF8D;E1CwwOhE;E0C1gPF;IA+PQ,UAAU;IACV,gBAAiC;E1C8wOvC;E0C9gPF;IzC8KI,uByCoF8D;E1C+wOhE;E0CjhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CqxOvC;E0CrhPF;IzC8KI,uByCoF8D;E1CsxOhE;E0CxhPF;IA+PQ,UAAU;IACV,UAAiC;E1C4xOvC;E0C5hPF;IzC8KI,iByCoF8D;E1C6xOhE;E0C/hPF;IA+PQ,UAAU;IACV,gBAAiC;E1CmyOvC;E0CniPF;IzC8KI,uByCoF8D;E1CoyOhE;E0CtiPF;IA+PQ,UAAU;IACV,gBAAiC;E1C0yOvC;E0C1iPF;IzC8KI,uByCoF8D;E1C2yOhE;E0C7iPF;IA+PQ,UAAU;IACV,UAAiC;E1CizOvC;E0CjjPF;IzC8KI,iByCoF8D;E1CkzOhE;E0CpjPF;IA+PQ,UAAU;IACV,gBAAiC;E1CwzOvC;E0CxjPF;IzC8KI,uByCoF8D;E1CyzOhE;E0C3jPF;IA+PQ,UAAU;IACV,gBAAiC;E1C+zOvC;E0C/jPF;IzC8KI,uByCoF8D;E1Cg0OhE;E0ClkPF;IA+PQ,UAAU;IACV,WAAiC;E1Cs0OvC;E0CtkPF;IzC8KI,kByCoF8D;E1Cu0OhE;AACF;;ACx9OE;EyClHF;IAqQM,UAAU;IACV,YAAY;E1C00OhB;E0ChlPF;IAwQM,UAAU;IACV,WAAW;E1C20Of;E0CplPF;IA2QM,UAAU;IACV,UAAU;E1C40Od;E0CxlPF;IA8QM,UAAU;IACV,eAAe;E1C60OnB;E0C5lPF;IAiRM,UAAU;IACV,UAAU;E1C80Od;E0ChmPF;IAoRM,UAAU;IACV,eAAe;E1C+0OnB;E0CpmPF;IAuRM,UAAU;IACV,UAAU;E1Cg1Od;E0CxmPF;IA0RM,UAAU;IACV,UAAU;E1Ci1Od;E0C5mPF;IA6RM,UAAU;IACV,UAAU;E1Ck1Od;E0ChnPF;IAgSM,UAAU;IACV,UAAU;E1Cm1Od;E0CpnPF;IAmSM,UAAU;IACV,UAAU;E1Co1Od;E0CxnPF;IzC8KI,iByCwHqC;E1Cq1OvC;E0C3nPF;IzC8KI,sByC0H0C;E1Cs1O5C;E0C9nPF;IzC8KI,iByC4HqC;E1Cu1OvC;E0CjoPF;IzC8KI,sByC8H0C;E1Cw1O5C;E0CpoPF;IzC8KI,iByCgIqC;E1Cy1OvC;E0CvoPF;IzC8KI,iByCkIqC;E1C01OvC;E0C1oPF;IzC8KI,iByCoIqC;E1C21OvC;E0C7oPF;IzC8KI,iByCsIqC;E1C41OvC;E0ChpPF;IzC8KI,iByCwIqC;E1C61OvC;E0CnpPF;IAyTQ,UAAU;IACV,SAAiC;E1C61OvC;E0CvpPF;IzC8KI,gByC8I8D;E1C81OhE;E0C1pPF;IAyTQ,UAAU;IACV,eAAiC;E1Co2OvC;E0C9pPF;IzC8KI,sByC8I8D;E1Cq2OhE;E0CjqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C22OvC;E0CrqPF;IzC8KI,uByC8I8D;E1C42OhE;E0CxqPF;IAyTQ,UAAU;IACV,UAAiC;E1Ck3OvC;E0C5qPF;IzC8KI,iByC8I8D;E1Cm3OhE;E0C/qPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cy3OvC;E0CnrPF;IzC8KI,uByC8I8D;E1C03OhE;E0CtrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cg4OvC;E0C1rPF;IzC8KI,uByC8I8D;E1Ci4OhE;E0C7rPF;IAyTQ,UAAU;IACV,UAAiC;E1Cu4OvC;E0CjsPF;IzC8KI,iByC8I8D;E1Cw4OhE;E0CpsPF;IAyTQ,UAAU;IACV,gBAAiC;E1C84OvC;E0CxsPF;IzC8KI,uByC8I8D;E1C+4OhE;E0C3sPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cq5OvC;E0C/sPF;IzC8KI,uByC8I8D;E1Cs5OhE;E0CltPF;IAyTQ,UAAU;IACV,UAAiC;E1C45OvC;E0CttPF;IzC8KI,iByC8I8D;E1C65OhE;E0CztPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm6OvC;E0C7tPF;IzC8KI,uByC8I8D;E1Co6OhE;E0ChuPF;IAyTQ,UAAU;IACV,gBAAiC;E1C06OvC;E0CpuPF;IzC8KI,uByC8I8D;E1C26OhE;E0CvuPF;IAyTQ,UAAU;IACV,WAAiC;E1Ci7OvC;E0C3uPF;IzC8KI,kByC8I8D;E1Ck7OhE;AACF;;AC9mPI;EyCjIJ;IA+TM,UAAU;IACV,YAAY;E1Cq7OhB;E0CrvPF;IAkUM,UAAU;IACV,WAAW;E1Cs7Of;E0CzvPF;IAqUM,UAAU;IACV,UAAU;E1Cu7Od;E0C7vPF;IAwUM,UAAU;IACV,eAAe;E1Cw7OnB;E0CjwPF;IA2UM,UAAU;IACV,UAAU;E1Cy7Od;E0CrwPF;IA8UM,UAAU;IACV,eAAe;E1C07OnB;E0CzwPF;IAiVM,UAAU;IACV,UAAU;E1C27Od;E0C7wPF;IAoVM,UAAU;IACV,UAAU;E1C47Od;E0CjxPF;IAuVM,UAAU;IACV,UAAU;E1C67Od;E0CrxPF;IA0VM,UAAU;IACV,UAAU;E1C87Od;E0CzxPF;IA6VM,UAAU;IACV,UAAU;E1C+7Od;E0C7xPF;IzC8KI,iByCkLqC;E1Cg8OvC;E0ChyPF;IzC8KI,sByCoL0C;E1Ci8O5C;E0CnyPF;IzC8KI,iByCsLqC;E1Ck8OvC;E0CtyPF;IzC8KI,sByCwL0C;E1Cm8O5C;E0CzyPF;IzC8KI,iByC0LqC;E1Co8OvC;E0C5yPF;IzC8KI,iByC4LqC;E1Cq8OvC;E0C/yPF;IzC8KI,iByC8LqC;E1Cs8OvC;E0ClzPF;IzC8KI,iByCgMqC;E1Cu8OvC;E0CrzPF;IzC8KI,iByCkMqC;E1Cw8OvC;E0CxzPF;IAmXQ,UAAU;IACV,SAAiC;E1Cw8OvC;E0C5zPF;IzC8KI,gByCwM8D;E1Cy8OhE;E0C/zPF;IAmXQ,UAAU;IACV,eAAiC;E1C+8OvC;E0Cn0PF;IzC8KI,sByCwM8D;E1Cg9OhE;E0Ct0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs9OvC;E0C10PF;IzC8KI,uByCwM8D;E1Cu9OhE;E0C70PF;IAmXQ,UAAU;IACV,UAAiC;E1C69OvC;E0Cj1PF;IzC8KI,iByCwM8D;E1C89OhE;E0Cp1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Co+OvC;E0Cx1PF;IzC8KI,uByCwM8D;E1Cq+OhE;E0C31PF;IAmXQ,UAAU;IACV,gBAAiC;E1C2+OvC;E0C/1PF;IzC8KI,uByCwM8D;E1C4+OhE;E0Cl2PF;IAmXQ,UAAU;IACV,UAAiC;E1Ck/OvC;E0Ct2PF;IzC8KI,iByCwM8D;E1Cm/OhE;E0Cz2PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cy/OvC;E0C72PF;IzC8KI,uByCwM8D;E1C0/OhE;E0Ch3PF;IAmXQ,UAAU;IACV,gBAAiC;E1CggPvC;E0Cp3PF;IzC8KI,uByCwM8D;E1CigPhE;E0Cv3PF;IAmXQ,UAAU;IACV,UAAiC;E1CugPvC;E0C33PF;IzC8KI,iByCwM8D;E1CwgPhE;E0C93PF;IAmXQ,UAAU;IACV,gBAAiC;E1C8gPvC;E0Cl4PF;IzC8KI,uByCwM8D;E1C+gPhE;E0Cr4PF;IAmXQ,UAAU;IACV,gBAAiC;E1CqhPvC;E0Cz4PF;IzC8KI,uByCwM8D;E1CshPhE;E0C54PF;IAmXQ,UAAU;IACV,WAAiC;E1C4hPvC;E0Ch5PF;IzC8KI,kByCwM8D;E1C6hPhE;AACF;;ACpwPI;EyChJJ;IAyXM,UAAU;IACV,YAAY;E1CgiPhB;E0C15PF;IA4XM,UAAU;IACV,WAAW;E1CiiPf;E0C95PF;IA+XM,UAAU;IACV,UAAU;E1CkiPd;E0Cl6PF;IAkYM,UAAU;IACV,eAAe;E1CmiPnB;E0Ct6PF;IAqYM,UAAU;IACV,UAAU;E1CoiPd;E0C16PF;IAwYM,UAAU;IACV,eAAe;E1CqiPnB;E0C96PF;IA2YM,UAAU;IACV,UAAU;E1CsiPd;E0Cl7PF;IA8YM,UAAU;IACV,UAAU;E1CuiPd;E0Ct7PF;IAiZM,UAAU;IACV,UAAU;E1CwiPd;E0C17PF;IAoZM,UAAU;IACV,UAAU;E1CyiPd;E0C97PF;IAuZM,UAAU;IACV,UAAU;E1C0iPd;E0Cl8PF;IzC8KI,iByC4OqC;E1C2iPvC;E0Cr8PF;IzC8KI,sByC8O0C;E1C4iP5C;E0Cx8PF;IzC8KI,iByCgPqC;E1C6iPvC;E0C38PF;IzC8KI,sByCkP0C;E1C8iP5C;E0C98PF;IzC8KI,iByCoPqC;E1C+iPvC;E0Cj9PF;IzC8KI,iByCsPqC;E1CgjPvC;E0Cp9PF;IzC8KI,iByCwPqC;E1CijPvC;E0Cv9PF;IzC8KI,iByC0PqC;E1CkjPvC;E0C19PF;IzC8KI,iByC4PqC;E1CmjPvC;E0C79PF;IA6aQ,UAAU;IACV,SAAiC;E1CmjPvC;E0Cj+PF;IzC8KI,gByCkQ8D;E1CojPhE;E0Cp+PF;IA6aQ,UAAU;IACV,eAAiC;E1C0jPvC;E0Cx+PF;IzC8KI,sByCkQ8D;E1C2jPhE;E0C3+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CikPvC;E0C/+PF;IzC8KI,uByCkQ8D;E1CkkPhE;E0Cl/PF;IA6aQ,UAAU;IACV,UAAiC;E1CwkPvC;E0Ct/PF;IzC8KI,iByCkQ8D;E1CykPhE;E0Cz/PF;IA6aQ,UAAU;IACV,gBAAiC;E1C+kPvC;E0C7/PF;IzC8KI,uByCkQ8D;E1CglPhE;E0ChgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CslPvC;E0CpgQF;IzC8KI,uByCkQ8D;E1CulPhE;E0CvgQF;IA6aQ,UAAU;IACV,UAAiC;E1C6lPvC;E0C3gQF;IzC8KI,iByCkQ8D;E1C8lPhE;E0C9gQF;IA6aQ,UAAU;IACV,gBAAiC;E1ComPvC;E0ClhQF;IzC8KI,uByCkQ8D;E1CqmPhE;E0CrhQF;IA6aQ,UAAU;IACV,gBAAiC;E1C2mPvC;E0CzhQF;IzC8KI,uByCkQ8D;E1C4mPhE;E0C5hQF;IA6aQ,UAAU;IACV,UAAiC;E1CknPvC;E0ChiQF;IzC8KI,iByCkQ8D;E1CmnPhE;E0CniQF;IA6aQ,UAAU;IACV,gBAAiC;E1CynPvC;E0CviQF;IzC8KI,uByCkQ8D;E1C0nPhE;E0C1iQF;IA6aQ,UAAU;IACV,gBAAiC;E1CgoPvC;E0C9iQF;IzC8KI,uByCkQ8D;E1CioPhE;E0CjjQF;IA6aQ,UAAU;IACV,WAAiC;E1CuoPvC;E0CrjQF;IzC8KI,kByCkQ8D;E1CwoPhE;AACF;;A0CvoPA;EzCpQI,sByChLgB;EzCgLhB,qByChLgB;EAublB,oBAvbkB;A1CikQpB;;A0C7oPA;EAKI,uBAzbgB;A1CqkQpB;;A0CjpPA;EAOI,qCAA4C;A1C8oPhD;;A0CrpPA;EAUI,uBAAuB;A1C+oP3B;;A0CzpPA;EzCpQI,eyCgRiC;EzChRjC,cyCiRiC;EACjC,aAAa;A1CipPjB;;A0C/pPA;EAgBM,SAAS;EACT,qBAAqB;A1CmpP3B;;A0CpqPA;EAmBM,qBAAqB;A1CqpP3B;;A0CxqPA;EAqBM,gBAAgB;A1CupPtB;;A0C5qPA;EAuBI,aAAa;A1CypPjB;;A0ChrPA;EAyBI,eAAe;A1C2pPnB;;A0CprPA;EA2BI,mBAAmB;A1C6pPvB;;ACpgQE;EyC4UF;IA+BM,aAAa;E1C8pPjB;AACF;;AC9/PE;EyCgUF;IAmCM,aAAa;E1CgqPjB;AACF;;A0C9pPE;EACE,oBAAY;EzC3SZ,yCyC4S2D;EzC5S3D,wCyC6S2D;A1CiqP/D;;A0CpqPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1CmqPrC;;A0CzqPE;EASM,iBAAY;A1CoqPpB;;ACniQE;EyCsXA;IAYQ,iBAAY;E1CsqPpB;AACF;;ACriQE;EyCkXA;IAeQ,iBAAY;E1CyqPpB;AACF;;ACviQE;EyC8WA;IAkBQ,iBAAY;E1C4qPpB;AACF;;ACziQE;EyC0WA;IAqBQ,iBAAY;E1C+qPpB;AACF;;AC3iQE;EyCsWA;IAwBQ,iBAAY;E1CkrPpB;AACF;;AC5iQI;EyCiWF;IA2BQ,iBAAY;E1CqrPpB;AACF;;ACxiQI;EyCuVF;IA8BQ,iBAAY;E1CwrPpB;AACF;;ACziQI;EyCkVF;IAiCQ,iBAAY;E1C2rPpB;AACF;;ACriQI;EyCwUF;IAoCQ,iBAAY;E1C8rPpB;AACF;;A0CnuPE;EASM,oBAAY;A1C8tPpB;;AC7lQE;EyCsXA;IAYQ,oBAAY;E1CguPpB;AACF;;AC/lQE;EyCkXA;IAeQ,oBAAY;E1CmuPpB;AACF;;ACjmQE;EyC8WA;IAkBQ,oBAAY;E1CsuPpB;AACF;;ACnmQE;EyC0WA;IAqBQ,oBAAY;E1CyuPpB;AACF;;ACrmQE;EyCsWA;IAwBQ,oBAAY;E1C4uPpB;AACF;;ACtmQI;EyCiWF;IA2BQ,oBAAY;E1C+uPpB;AACF;;AClmQI;EyCuVF;IA8BQ,oBAAY;E1CkvPpB;AACF;;ACnmQI;EyCkVF;IAiCQ,oBAAY;E1CqvPpB;AACF;;AC/lQI;EyCwUF;IAoCQ,oBAAY;E1CwvPpB;AACF;;A0C7xPE;EASM,mBAAY;A1CwxPpB;;ACvpQE;EyCsXA;IAYQ,mBAAY;E1C0xPpB;AACF;;ACzpQE;EyCkXA;IAeQ,mBAAY;E1C6xPpB;AACF;;AC3pQE;EyC8WA;IAkBQ,mBAAY;E1CgyPpB;AACF;;AC7pQE;EyC0WA;IAqBQ,mBAAY;E1CmyPpB;AACF;;AC/pQE;EyCsWA;IAwBQ,mBAAY;E1CsyPpB;AACF;;AChqQI;EyCiWF;IA2BQ,mBAAY;E1CyyPpB;AACF;;AC5pQI;EyCuVF;IA8BQ,mBAAY;E1C4yPpB;AACF;;AC7pQI;EyCkVF;IAiCQ,mBAAY;E1C+yPpB;AACF;;ACzpQI;EyCwUF;IAoCQ,mBAAY;E1CkzPpB;AACF;;A0Cv1PE;EASM,oBAAY;A1Ck1PpB;;ACjtQE;EyCsXA;IAYQ,oBAAY;E1Co1PpB;AACF;;ACntQE;EyCkXA;IAeQ,oBAAY;E1Cu1PpB;AACF;;ACrtQE;EyC8WA;IAkBQ,oBAAY;E1C01PpB;AACF;;ACvtQE;EyC0WA;IAqBQ,oBAAY;E1C61PpB;AACF;;ACztQE;EyCsWA;IAwBQ,oBAAY;E1Cg2PpB;AACF;;AC1tQI;EyCiWF;IA2BQ,oBAAY;E1Cm2PpB;AACF;;ACttQI;EyCuVF;IA8BQ,oBAAY;E1Cs2PpB;AACF;;ACvtQI;EyCkVF;IAiCQ,oBAAY;E1Cy2PpB;AACF;;ACntQI;EyCwUF;IAoCQ,oBAAY;E1C42PpB;AACF;;A0Cj5PE;EASM,iBAAY;A1C44PpB;;AC3wQE;EyCsXA;IAYQ,iBAAY;E1C84PpB;AACF;;AC7wQE;EyCkXA;IAeQ,iBAAY;E1Ci5PpB;AACF;;AC/wQE;EyC8WA;IAkBQ,iBAAY;E1Co5PpB;AACF;;ACjxQE;EyC0WA;IAqBQ,iBAAY;E1Cu5PpB;AACF;;ACnxQE;EyCsWA;IAwBQ,iBAAY;E1C05PpB;AACF;;ACpxQI;EyCiWF;IA2BQ,iBAAY;E1C65PpB;AACF;;AChxQI;EyCuVF;IA8BQ,iBAAY;E1Cg6PpB;AACF;;ACjxQI;EyCkVF;IAiCQ,iBAAY;E1Cm6PpB;AACF;;AC7wQI;EyCwUF;IAoCQ,iBAAY;E1Cs6PpB;AACF;;A0C38PE;EASM,oBAAY;A1Cs8PpB;;ACr0QE;EyCsXA;IAYQ,oBAAY;E1Cw8PpB;AACF;;ACv0QE;EyCkXA;IAeQ,oBAAY;E1C28PpB;AACF;;ACz0QE;EyC8WA;IAkBQ,oBAAY;E1C88PpB;AACF;;AC30QE;EyC0WA;IAqBQ,oBAAY;E1Ci9PpB;AACF;;AC70QE;EyCsWA;IAwBQ,oBAAY;E1Co9PpB;AACF;;AC90QI;EyCiWF;IA2BQ,oBAAY;E1Cu9PpB;AACF;;AC10QI;EyCuVF;IA8BQ,oBAAY;E1C09PpB;AACF;;AC30QI;EyCkVF;IAiCQ,oBAAY;E1C69PpB;AACF;;ACv0QI;EyCwUF;IAoCQ,oBAAY;E1Cg+PpB;AACF;;A0CrgQE;EASM,mBAAY;A1CggQpB;;AC/3QE;EyCsXA;IAYQ,mBAAY;E1CkgQpB;AACF;;ACj4QE;EyCkXA;IAeQ,mBAAY;E1CqgQpB;AACF;;ACn4QE;EyC8WA;IAkBQ,mBAAY;E1CwgQpB;AACF;;ACr4QE;EyC0WA;IAqBQ,mBAAY;E1C2gQpB;AACF;;ACv4QE;EyCsWA;IAwBQ,mBAAY;E1C8gQpB;AACF;;ACx4QI;EyCiWF;IA2BQ,mBAAY;E1CihQpB;AACF;;ACp4QI;EyCuVF;IA8BQ,mBAAY;E1CohQpB;AACF;;ACr4QI;EyCkVF;IAiCQ,mBAAY;E1CuhQpB;AACF;;ACj4QI;EyCwUF;IAoCQ,mBAAY;E1C0hQpB;AACF;;A0C/jQE;EASM,oBAAY;A1C0jQpB;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AGI,yBAAgD;A7Cg0RxD;;A6C/zRI;EACE,oCAAyC;A7Ck0R/C;;A6Ch0RI;EACE,yBAA6B;A7Cm0RnC;;A6Cl0RI;EAGI,yBAAgD;A7Cm0RxD;;A6Cl0RI;EACE,oCAAwC;A7Cq0R9C;;A6Cj2RE;EACE,yBAAwB;A7Co2R5B;;A6Cn2RE;EAGI,yBAA0C;A7Co2RhD;;A6Cn2RE;EACE,oCAAmC;A7Cs2RvC;;A6Cj2RI;EACE,yBAA8B;A7Co2RpC;;A6Cn2RI;EAGI,yBAAgD;A7Co2RxD;;A6Cn2RI;EACE,oCAAyC;A7Cs2R/C;;A6Cp2RI;EACE,yBAA6B;A7Cu2RnC;;A6Ct2RI;EAGI,yBAAgD;A7Cu2RxD;;A6Ct2RI;EACE,oCAAwC;A7Cy2R9C;;A6Cr4RE;EACE,yBAAwB;A7Cw4R5B;;A6Cv4RE;EAGI,yBAA0C;A7Cw4RhD;;A6Cv4RE;EACE,oCAAmC;A7C04RvC;;A6Cr4RI;EACE,yBAA8B;A7Cw4RpC;;A6Cv4RI;EAGI,yBAAgD;A7Cw4RxD;;A6Cv4RI;EACE,oCAAyC;A7C04R/C;;A6Cx4RI;EACE,yBAA6B;A7C24RnC;;A6C14RI;EAGI,yBAAgD;A7C24RxD;;A6C14RI;EACE,oCAAwC;A7C64R9C;;A6Cz6RE;EACE,yBAAwB;A7C46R5B;;A6C36RE;EAGI,yBAA0C;A7C46RhD;;A6C36RE;EACE,oCAAmC;A7C86RvC;;A6Cz6RI;EACE,yBAA8B;A7C46RpC;;A6C36RI;EAGI,yBAAgD;A7C46RxD;;A6C36RI;EACE,oCAAyC;A7C86R/C;;A6C56RI;EACE,yBAA6B;A7C+6RnC;;A6C96RI;EAGI,yBAAgD;A7C+6RxD;;A6C96RI;EACE,oCAAwC;A7Ci7R9C;;A6C78RE;EACE,yBAAwB;A7Cg9R5B;;A6C/8RE;EAGI,yBAA0C;A7Cg9RhD;;A6C/8RE;EACE,oCAAmC;A7Ck9RvC;;A6C78RI;EACE,yBAA8B;A7Cg9RpC;;A6C/8RI;EAGI,yBAAgD;A7Cg9RxD;;A6C/8RI;EACE,oCAAyC;A7Ck9R/C;;A6Ch9RI;EACE,yBAA6B;A7Cm9RnC;;A6Cl9RI;EAGI,yBAAgD;A7Cm9RxD;;A6Cl9RI;EACE,oCAAwC;A7Cq9R9C;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,yBAAwB;A7Cq+R5B;;A6Cp+RE;EACE,oCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A6Cl/RE;EACE,yBAAwB;A7Cq/R5B;;A6Cp/RE;EACE,oCAAmC;A7Cu/RvC;;A6C1/RE;EACE,yBAAwB;A7C6/R5B;;A6C5/RE;EACE,oCAAmC;A7C+/RvC;;A6ClgSE;EACE,yBAAwB;A7CqgS5B;;A6CpgSE;EACE,oCAAmC;A7CugSvC;;A6C1gSE;EACE,4BAAwB;A7C6gS5B;;A6C5gSE;EACE,uCAAmC;A7C+gSvC;;A6ClhSE;EACE,yBAAwB;A7CqhS5B;;A6CphSE;EACE,oCAAmC;A7CuhSvC;;A8C3jSE;EACE,8BAAiC;A9C8jSrC;;A8C/jSE;EACE,sCAAiC;A9CkkSrC;;A8CnkSE;EACE,iCAAiC;A9CskSrC;;A8CvkSE;EACE,yCAAiC;A9C0kSrC;;A8CtkSE;EACE,4BAA4B;A9CykShC;;A8C1kSE;EACE,0BAA4B;A9C6kShC;;A8C9kSE;EACE,kCAA4B;A9CilShC;;A8C7kSE;EACE,sCAAkC;A9CglStC;;A8CjlSE;EACE,oCAAkC;A9ColStC;;A8CrlSE;EACE,kCAAkC;A9CwlStC;;A8CzlSE;EACE,yCAAkC;A9C4lStC;;A8C7lSE;EACE,wCAAkC;A9CgmStC;;A8CjmSE;EACE,wCAAkC;A9ComStC;;A8CrmSE;EACE,iCAAkC;A9CwmStC;;A8CzmSE;EACE,+BAAkC;A9C4mStC;;A8C7mSE;EACE,gCAAkC;A9CgnStC;;A8CjnSE;EACE,iCAAkC;A9ConStC;;A8ChnSE;EACE,oCAAgC;A9CmnSpC;;A8CpnSE;EACE,kCAAgC;A9CunSpC;;A8CxnSE;EACE,gCAAgC;A9C2nSpC;;A8C5nSE;EACE,uCAAgC;A9C+nSpC;;A8ChoSE;E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4T/B;EoDv4TE;IACE,0BAA2B;EpDy4T/B;EoD14TE;IACE,4BAA2B;EpD44T/B;EoD74TE;IACE,6BAA2B;EpD+4T/B;EoDh5TE;IACE,0BAA2B;EpDk5T/B;EoDn5TE;IACE,6BAA2B;EpDq5T/B;AACF;;ACvxTI;EmDhIA;IACE,0BAA2B;EpD25T/B;EoD55TE;IACE,4BAA2B;EpD85T/B;EoD/5TE;IACE,0BAA2B;EpDi6T/B;EoDl6TE;IACE,4BAA2B;EpDo6T/B;EoDr6TE;IACE,6BAA2B;EpDu6T/B;EoDx6TE;IACE,0BAA2B;EpD06T/B;EoD36TE;IACE,6BAA2B;EpD66T/B;AACF;;AChyTI;EmD/IA;IACE,0BAA2B;EpDm7T/B;EoDp7TE;IACE,4BAA2B;EpDs7T/B;EoDv7TE;IACE,0BAA2B;EpDy7T/B;EoD17TE;IACE,4BAA2B;EpD47T/B;EoD77TE;IACE,6BAA2B;EpD+7T/B;EoDh8TE;IACE,0BAA2B;EpDk8T/B;EoDn8TE;IACE,6BAA2B;EpDq8T/B;AACF;;AoD76TE;EACE,6BAAqC;ApDg7TzC;;AoDj7TE;EACE,8BAAqC;ApDo7TzC;;AoDr7TE;EACE,2BAAqC;ApDw7TzC;;AoDz7TE;EACE,4BAAqC;ApD47TzC;;ACt3TE;EmDlEE;IACE,6BAAqC;EpD47TzC;AACF;;ACx3TE;EmDnEE;IACE,6BAAqC;EpD+7TzC;AACF;;AC13TE;EmDpEE;IACE,6BAAqC;EpDk8TzC;AACF;;AC53TE;EmDrEE;IACE,6BAAqC;EpDq8TzC;AACF;;AC93TE;EmDtEE;IACE,6BAAqC;EpDw8TzC;AACF;;AC/3TI;EmDxEA;IACE,6BAAqC;EpD28TzC;AACF;;AC33TI;EmD/EA;IACE,6BAAqC;EpD88TzC;AACF;;AC53TI;EmDjFA;IACE,6BAAqC;EpDi9TzC;AACF;;ACx3TI;EmDxFA;IACE,6BAAqC;EpDo9TzC;AACF;;AC56TE;EmDlEE;IACE,8BAAqC;EpDk/TzC;AACF;;AC96TE;EmDnEE;IACE,8BAAqC;EpDq/TzC;AACF;;ACh7TE;EmDpEE;IACE,8BAAqC;EpDw/TzC;AACF;;ACl7TE;EmDrEE;IACE,8BAAqC;EpD2/TzC;AACF;;ACp7TE;EmDtEE;IACE,8BAAqC;EpD8/TzC;AACF;;ACr7TI;EmDxEA;IACE,8BAAqC;EpDigUzC;AACF;;ACj7TI;EmD/EA;IACE,8BAAqC;EpDogUzC;AACF;;ACl7TI;EmDjFA;IACE,8BAAqC;EpDugUzC;AACF;;AC96TI;EmDxFA;IACE,8BAAqC;EpD0gUzC;AACF;;ACl+TE;EmDlEE;IACE,2BAAqC;EpDwiUzC;AACF;;ACp+TE;EmDnEE;IACE,2BAAqC;EpD2iUzC;AACF;;ACt+TE;EmDpEE;IACE,2BAAqC;EpD8iUzC;AACF;;ACx+TE;EmDrEE;IACE,2BAAqC;EpDijUzC;AACF;;AC1+TE;EmDtEE;IACE,2BAAqC;EpDojUzC;AACF;;AC3+TI;EmDxEA;IACE,2BAAqC;EpDujUzC;AACF;;ACv+TI;EmD/EA;IACE,2BAAqC;EpD0jUzC;AACF;;ACx+TI;EmDjFA;IACE,2BAAqC;EpD6jUzC;AACF;;ACp+TI;EmDxFA;IACE,2BAAqC;EpDgkUzC;AACF;;ACxhUE;EmDlEE;IACE,4BAAqC;EpD8lUzC;AACF;;AC1hUE;EmDnEE;IACE,4BAAqC;EpDimUzC;AACF;;AC5hUE;EmDpEE;IACE,4BAAqC;EpDomUzC;AACF;;AC9hUE;EmDrEE;IACE,4BAAqC;EpDumUzC;AACF;;AChiUE;EmDtEE;IACE,4BAAqC;EpD0mUzC;AACF;;ACjiUI;EmDxEA;IACE,4BAAqC;EpD6mUzC;AACF;;AC7hUI;EmD/EA;IACE,4BAAqC;EpDgnUzC;AACF;;AC9hUI;EmDjFA;IACE,4BAAqC;EpDmnUzC;AACF;;AC1hUI;EmDxFA;IACE,4BAAqC;EpDsnUzC;AACF;;AoDrnUA;EACE,qCAAqC;ApDwnUvC;;AoDtnUA;EACE,oCAAoC;ApDynUtC;;AoDvnUA;EACE,oCAAoC;ApD0nUtC;;AoDxnUA;EACE,6BAA6B;ApD2nU/B;;AoDznUA;EACE,qCAAqC;ApD4nUvC;;AoD1nUA;EACE,2BAAqC;ApD6nUvC;;AoD5nUA;EACE,2BAAsC;ApD+nUxC;;AoD9nUA;EACE,2BAAsC;ApDioUxC;;AoDhoUA;EACE,2BAAwC;ApDmoU1C;;AoDloUA;EACE,2BAAoC;ApDqoUtC;;AoDnoUA;EACE,+LAAuC;ApDsoUzC;;AoDpoUA;EACE,+LAAyC;ApDuoU3C;;AoDroUA;EACE,+LAA0C;ApDwoU5C;;AoDtoUA;EACE,iCAAyC;ApDyoU3C;;AoDvoUA;EACE,iCAAoC;ApD0oUtC;;AqD3uUE;EACE,yBAA+B;ArD8uUnC;;AC9oUE;EoD9FE;IACE,yBAA+B;ErDgvUnC;AACF;;AChpUE;EoD/FE;IACE,yBAA+B;ErDmvUnC;AACF;;AClpUE;EoDhGE;IACE,yBAA+B;ErDsvUnC;AACF;;ACppUE;EoDjGE;IACE,yBAA+B;ErDyvUnC;AACF;;ACtpUE;EoDlGE;IACE,yBAA+B;ErD4vUnC;AACF;;ACvpUI;EoDpGA;IACE,yBAA+B;ErD+vUnC;AACF;;ACnpUI;EoD3GA;IACE,yBAA+B;ErDkwUnC;AACF;;ACppUI;EoD7GA;IACE,yBAA+B;ErDqwUnC;AACF;;AChpUI;EoDpHA;IACE,yBAA+B;ErDwwUnC;AACF;;AqDryUE;EACE,wBAA+B;ArDwyUnC;;ACxsUE;EoD9FE;IACE,wBAA+B;ErD0yUnC;AACF;;AC1sUE;EoD/FE;IACE,wBAA+B;ErD6yUnC;AACF;;AC5sUE;EoDhGE;IACE,wBAA+B;ErDgzUnC;AACF;;AC9sUE;EoDjGE;IACE,wBAA+B;ErDmzUnC;AACF;;AChtUE;EoDlGE;IACE,wBAA+B;ErDszUnC;AACF;;ACjtUI;EoDpGA;IACE,wBAA+B;ErDyzUnC;AACF;;AC7sUI;EoD3GA;IACE,wBAA+B;ErD4zUnC;AACF;;AC9sUI;EoD7GA;IACE,wBAA+B;ErD+zUnC;AACF;;AC1sUI;EoDpHA;IACE,wBAA+B;ErDk0UnC;AACF;;AqD/1UE;EACE,0BAA+B;ArDk2UnC;;AClwUE;EoD9FE;IACE,0BAA+B;ErDo2UnC;AACF;;ACpwUE;EoD/FE;IACE,0BAA+B;ErDu2UnC;AACF;;ACtwUE;EoDhGE;IACE,0BAA+B;ErD02UnC;AACF;;ACxwUE;EoDjGE;IACE,0BAA+B;ErD62UnC;AACF;;AC1wUE;EoDlGE;IACE,0BAA+B;ErDg3UnC;AACF;;AC3wUI;EoDpGA;IACE,0BAA+B;ErDm3UnC;AACF;;ACvwUI;EoD3GA;IACE,0BAA+B;ErDs3UnC;AACF;;ACxwUI;EoD7GA;IACE,0BAA+B;ErDy3UnC;AACF;;ACpwUI;EoDpHA;IACE,0BAA+B;ErD43UnC;AACF;;AqDz5UE;EACE,gCAA+B;ArD45UnC;;AC5zUE;EoD9FE;IACE,gCAA+B;ErD85UnC;AACF;;AC9zUE;EoD/FE;IACE,gCAA+B;ErDi6UnC;AACF;;ACh0UE;EoDhGE;IACE,gCAA+B;ErDo6UnC;AACF;;ACl0UE;EoDjGE;IACE,gCAA+B;ErDu6UnC;AACF;;ACp0UE;EoDlGE;IACE,gCAA+B;ErD06UnC;AACF;;ACr0UI;EoDpGA;IACE,gCAA+B;ErD66UnC;AACF;;ACj0UI;EoD3GA;IACE,gCAA+B;ErDg7UnC;AACF;;ACl0UI;EoD7GA;IACE,gCAA+B;ErDm7UnC;AACF;;AC9zUI;EoDpHA;IACE,gCAA+B;ErDs7UnC;AACF;;AqDn9UE;EACE,+BAA+B;ArDs9UnC;;ACt3UE;EoD9FE;IACE,+BAA+B;ErDw9UnC;AACF;;ACx3UE;EoD/FE;IACE,+BAA+B;ErD29UnC;AACF;;AC13UE;EoDhGE;IACE,+BAA+B;ErD89UnC;AACF;;AC53UE;EoDjGE;IACE,+BAA+B;ErDi+UnC;AACF;;AC93UE;EoDlGE;IACE,+BAA+B;ErDo+UnC;AACF;;AC/3UI;EoDpGA;IACE,+BAA+B;ErDu+UnC;AACF;;AC33UI;EoD3GA;IACE,+BAA+B;ErD0+UnC;AACF;;AC53UI;EoD7GA;IACE,+BAA+B;ErD6+UnC;AACF;;ACx3UI;EoDpHA;IACE,+BAA+B;ErDg/UnC;AACF;;AqD/+UA;EACE,wBAAwB;ArDk/U1B;;AqDh/UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArDm/U1B;;AC37UE;EoDrDA;IACE,wBAAwB;ErDo/U1B;AACF;;AC77UE;EoDrDA;IACE,wBAAwB;ErDs/U1B;AACF;;AC/7UE;EoDrDA;IACE,wBAAwB;ErDw/U1B;AACF;;ACj8UE;EoDrDA;IACE,wBAAwB;ErD0/U1B;AACF;;ACn8UE;EoDrDA;IACE,wBAAwB;ErD4/U1B;AACF;;ACp8UI;EoDtDF;IACE,wBAAwB;ErD8/U1B;AACF;;ACh8UI;EoD5DF;IACE,wBAAwB;ErDggV1B;AACF;;ACj8UI;EoD7DF;IACE,wBAAwB;ErDkgV1B;AACF;;AC77UI;EoDnEF;IACE,wBAAwB;ErDogV1B;AACF;;AqDngVA;EACE,6BAA6B;ArDsgV/B;;ACr/UE;EoDdA;IACE,6BAA6B;ErDugV/B;AACF;;ACv/UE;EoDdA;IACE,6BAA6B;ErDygV/B;AACF;;ACz/UE;EoDdA;IACE,6BAA6B;ErD2gV/B;AACF;;AC3/UE;EoDdA;IACE,6BAA6B;ErD6gV/B;AACF;;AC7/UE;EoDdA;IACE,6BAA6B;ErD+gV/B;AACF;;AC9/UI;EoDfF;IACE,6BAA6B;ErDihV/B;AACF;;AC1/UI;EoDrBF;IACE,6BAA6B;ErDmhV/B;AACF;;AC3/UI;EoDtBF;IACE,6BAA6B;ErDqhV/B;AACF;;ACv/UI;EoD5BF;IACE,6BAA6B;ErDuhV/B;AACF;;AsDjpVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvD0oVhC;;AuD9oVA;EAMI,gBAAgB;AvD4oVpB;;AuDlpVA;EASM,mBAAmB;AvD6oVzB;;AuDtpVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;ACoqV7B;;AuD3pVA;;EAmBQ,cAAc;AvD6oVtB;;AuDhqVA;EAqBQ,cxD9BqB;AC6qV7B;;AuDpqVA;EAuBQ,4BxDhCqB;ACirV7B;;AuDxqVA;;EA0BU,cxDnCmB;ACsrV7B;;ACtkVE;EsDvGF;IA6BU,uBxDzBqB;EC8qV7B;AACF;;AuDnrVA;;EAgCQ,4BxDzCqB;ACisV7B;;AuDxrVA;;;EAqCU,yB7C4DuB;E6C3DvB,cxD/CmB;ACwsV7B;;AuD/rVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvD0pVtB;;AuDpsVA;EA4CY,UAAU;AvD4pVtB;;AuDxsVA;EA+CY,uBAAwB;EACxB,UAAU;AvD6pVtB;;AuD7sVA;EAoDY,cxD7DiB;AC0tV7B;;AuDjtVA;EAsDc,uCxD/De;AC8tV7B;;AuDrtVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;ACutV/B;;AuD3tVA;EAkEU,4EAAyG;AvD6pVnH;;ACpoVE;EsD3FF;IAqEc,4EAAyG;EvD+pVrH;AACF;;AuDruVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;ACsuV/B;;AuD1uVA;;EAmBQ,cAAc;AvD4tVtB;;AuD/uVA;EAqBQ,YxDjBuB;AC+uV/B;;AuDnvVA;EAuBQ,+BxDnBuB;ACmvV/B;;AuDvvVA;;EA0BU,YxDtBqB;ACwvV/B;;ACrpVE;EsDvGF;IA6BU,yBxDtCmB;EC0wV3B;AACF;;AuDlwVA;;EAgCQ,+BxD5BuB;ACmwV/B;;AuDvwVA;;;EAqCU,uB7C4DuB;E6C3DvB,YxDlCqB;AC0wV/B;;AuD9wVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDyuVtB;;AuDnxVA;EA4CY,UAAU;AvD2uVtB;;AuDvxVA;EA+CY,yBAAwB;EACxB,UAAU;AvD4uVtB;;AuD5xVA;EAoDY,YxDhDmB;AC4xV/B;;AuDhyVA;EAsDc,uCxD/De;AC6yV7B;;AuDpyVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;ACmzV7B;;AuD1yVA;EAkEU,8EAAyG;AvD4uVnH;;ACntVE;EsD3FF;IAqEc,8EAAyG;EvD8uVrH;AACF;;AuDpzVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AVovVrB;;AuDzzVA;;EAmBQ,cAAc;AvD2yVtB;;AuD9zVA;EAqBQ,yB7CgDa;AV6vVrB;;AuDl0VA;EAuBQ,yB7C8Ca;AViwVrB;;AuDt0VA;;EA0BU,yB7C2CW;AVswVrB;;ACpuVE;EsDvGF;IA6BU,4BxD3BoB;EC80V5B;AACF;;AuDj1VA;;EAgCQ,yB7CqCa;AVixVrB;;AuDt1VA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVwxVrB;;AuD71VA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDwzVtB;;AuDl2VA;EA4CY,UAAU;AvD0zVtB;;AuDt2VA;EA+CY,4BAAwB;EACxB,UAAU;AvD2zVtB;;AuD32VA;EAoDY,yB7CiBS;AV0yVrB;;AuD/2VA;EAsDc,uCxD/De;AC43V7B;;AuDn3VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;ACu3V9B;;AuDz3VA;EAkEU,iFAAyG;AvD2zVnH;;AClyVE;EsD3FF;IAqEc,iFAAyG;EvD6zVrH;AACF;;AuDn4VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVi0VhB;;AuDx4VA;;EAmBQ,cAAc;AvD03VtB;;AuD74VA;EAqBQ,W7CkDQ;AV00VhB;;AuDj5VA;EAuBQ,+B7CgDQ;AV80VhB;;AuDr5VA;;EA0BU,W7C6CM;AVm1VhB;;ACnzVE;EsDvGF;IA6BU,yBxDlCoB;ECo6V5B;AACF;;AuDh6VA;;EAgCQ,+B7CuCQ;AV81VhB;;AuDr6VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVq2VhB;;AuD56VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDu4VtB;;AuDj7VA;EA4CY,UAAU;AvDy4VtB;;AuDr7VA;EA+CY,yBAAwB;EACxB,UAAU;AvD04VtB;;AuD17VA;EAoDY,W7CmBI;AVu3VhB;;AuD97VA;EAsDc,uCxD/De;AC28V7B;;AuDl8VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;AC68V9B;;AuDx8VA;EAkEU,gFAAyG;AvD04VnH;;ACj3VE;EsD3FF;IAqEc,gFAAyG;EvD44VrH;AACF;;AuDl9VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVg5VhB;;AuDv9VA;;EAmBQ,cAAc;AvDy8VtB;;AuD59VA;EAqBQ,W7CkDQ;AVy5VhB;;AuDh+VA;EAuBQ,+B7CgDQ;AV65VhB;;AuDp+VA;;EA0BU,W7C6CM;AVk6VhB;;ACl4VE;EsDvGF;IA6BU,yBxDpBwB;ECq+VhC;AACF;;AuD/+VA;;EAgCQ,+B7CuCQ;AV66VhB;;AuDp/VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVo7VhB;;AuD3/VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDs9VtB;;AuDhgWA;EA4CY,UAAU;AvDw9VtB;;AuDpgWA;EA+CY,yBAAwB;EACxB,UAAU;AvDy9VtB;;AuDzgWA;EAoDY,W7CmBI;AVs8VhB;;AuD7gWA;EAsDc,uCxD/De;AC0hW7B;;AuDjhWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;AC8gWlC;;AuDvhWA;EAkEU,gFAAyG;AvDy9VnH;;ACh8VE;EsD3FF;IAqEc,gFAAyG;EvD29VrH;AACF;;AuDjiWA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AV+9VhB;;AuDtiWA;;EAmBQ,cAAc;AvDwhWtB;;AuD3iWA;EAqBQ,W7CkDQ;AVw+VhB;;AuD/iWA;EAuBQ,+B7CgDQ;AV4+VhB;;AuDnjWA;;EA0BU,W7C6CM;AVi/VhB;;ACj9VE;EsDvGF;IA6BU,yBxDlBwB;ECkjWhC;AACF;;AuD9jWA;;EAgCQ,+B7CuCQ;AV4/VhB;;AuDnkWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVmgWhB;;AuD1kWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDqiWtB;;AuD/kWA;EA4CY,UAAU;AvDuiWtB;;AuDnlWA;EA+CY,yBAAwB;EACxB,UAAU;AvDwiWtB;;AuDxlWA;EAoDY,W7CmBI;AVqhWhB;;AuD5lWA;EAsDc,uCxD/De;ACymW7B;;AuDhmWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;AC2lWlC;;AuDtmWA;EAkEU,gFAAyG;AvDwiWnH;;AC/gWE;EsD3FF;IAqEc,gFAAyG;EvD0iWrH;AACF;;AuDhnWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AV8iWhB;;AuDrnWA;;EAmBQ,cAAc;AvDumWtB;;AuD1nWA;EAqBQ,W7CkDQ;AVujWhB;;AuD9nWA;EAuBQ,+B7CgDQ;AV2jWhB;;AuDloWA;;EA0BU,W7C6CM;AVgkWhB;;AChiWE;EsDvGF;IA6BU,yBxDnBwB;ECkoWhC;AACF;;AuD7oWA;;EAgCQ,+B7CuCQ;AV2kWhB;;AuDlpWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVklWhB;;AuDzpWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDonWtB;;AuD9pWA;EA4CY,UAAU;AvDsnWtB;;AuDlqWA;EA+CY,yBAAwB;EACxB,UAAU;AvDunWtB;;AuDvqWA;EAoDY,W7CmBI;AVomWhB;;AuD3qWA;EAsDc,uCxD/De;ACwrW7B;;AuD/qWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;AC2qWlC;;AuDrrWA;EAkEU,gFAAyG;AvDunWnH;;AC9lWE;EsD3FF;IAqEc,gFAAyG;EvDynWrH;AACF;;AuD/rWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AV6nWhB;;AuDpsWA;;EAmBQ,cAAc;AvDsrWtB;;AuDzsWA;EAqBQ,W7CkDQ;AVsoWhB;;AuD7sWA;EAuBQ,+B7CgDQ;AV0oWhB;;AuDjtWA;;EA0BU,W7C6CM;AV+oWhB;;AC/mWE;EsDvGF;IA6BU,yBxDrBwB;ECmtWhC;AACF;;AuD5tWA;;EAgCQ,+B7CuCQ;AV0pWhB;;AuDjuWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AViqWhB;;AuDxuWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDmsWtB;;AuD7uWA;EA4CY,UAAU;AvDqsWtB;;AuDjvWA;EA+CY,yBAAwB;EACxB,UAAU;AvDssWtB;;AuDtvWA;EAoDY,W7CmBI;AVmrWhB;;AuD1vWA;EAsDc,uCxD/De;ACuwW7B;;AuD9vWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;AC4vWlC;;AuDpwWA;EAkEU,gFAAyG;AvDssWnH;;AC7qWE;EsD3FF;IAqEc,gFAAyG;EvDwsWrH;AACF;;AuD9wWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AV8sWrB;;AuDnxWA;;EAmBQ,cAAc;AvDqwWtB;;AuDxxWA;EAqBQ,yB7CgDa;AVutWrB;;AuD5xWA;EAuBQ,yB7C8Ca;AV2tWrB;;AuDhyWA;;EA0BU,yB7C2CW;AVguWrB;;AC9rWE;EsDvGF;IA6BU,yBxDtBwB;ECmyWhC;AACF;;AuD3yWA;;EAgCQ,yB7CqCa;AV2uWrB;;AuDhzWA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVkvWrB;;AuDvzWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDkxWtB;;AuD5zWA;EA4CY,UAAU;AvDoxWtB;;AuDh0WA;EA+CY,yBAAwB;EACxB,UAAU;AvDqxWtB;;AuDr0WA;EAoDY,yB7CiBS;AVowWrB;;AuDz0WA;EAsDc,uCxD/De;ACs1W7B;;AuD70WA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;AC40WlC;;AuDn1WA;EAkEU,gFAAyG;AvDqxWnH;;AC5vWE;EsD3FF;IAqEc,gFAAyG;EvDuxWrH;AACF;;AuD71WA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AV2xWhB;;AuDl2WA;;EAmBQ,cAAc;AvDo1WtB;;AuDv2WA;EAqBQ,W7CkDQ;AVoyWhB;;AuD32WA;EAuBQ,+B7CgDQ;AVwyWhB;;AuD/2WA;;EA0BU,W7C6CM;AV6yWhB;;AC7wWE;EsDvGF;IA6BU,yBxDhBuB;EC42W/B;AACF;;AuD13WA;;EAgCQ,+B7CuCQ;AVwzWhB;;AuD/3WA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AV+zWhB;;AuDt4WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDi2WtB;;AuD34WA;EA4CY,UAAU;AvDm2WtB;;AuD/4WA;EA+CY,yBAAwB;EACxB,UAAU;AvDo2WtB;;AuDp5WA;EAoDY,W7CmBI;AVi1WhB;;AuDx5WA;EAsDc,uCxD/De;ACq6W7B;;AuD55WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;ACq5WjC;;AuDl6WA;EAkEU,gFAAyG;AvDo2WnH;;AC30WE;EsD3FF;IAqEc,gFAAyG;EvDs2WrH;AACF;;AuD56WA;EAyEM,eAhF0B;AvDu7WhC;;ACj1WE;EsD/FF;IA6EQ,oBAnF8B;EvD27WpC;AACF;;ACv1WE;EsD/FF;IAiFQ,mBAtF4B;EvDg8WlC;AACF;;AuD57WA;EAsFM,mBAAmB;EACnB,aAAa;AvD02WnB;;AuDj8WA;EAyFQ,YAAY;EACZ,cAAc;AvD42WtB;;AuDt8WA;EA4FI,gBAAgB;AvD82WpB;;AuD18WA;EA8FI,iBAAiB;AvDg3WrB;;AuD52WA;EAEE,gBAAgB;AvD82WlB;;AuDh3WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDg3WzC;;AuDz3WA;EAYI,YAAY;AvDi3WhB;;ACp4WE;EsDOF;IAeI,aAAa;EvDm3Wf;AACF;;AuDl3WA;EACE,kBAAkB;AvDq3WpB;;AC94WE;EsDwBF;IAKM,aAAa;EvDs3WjB;EuD33WF;IAOQ,sBAAsB;EvDu3W5B;AACF;;ACn5WE;EsDoBF;IASI,aAAa;IACb,uBAAuB;EvD23WzB;EuDr4WF;ItDoDI,mBsDxCwC;EvD43W1C;AACF;;AuDz3WA;;EAEE,YAAY;EACZ,cAAc;AvD43WhB;;AuD13WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDihX/B;;ACz6WE;EsDyCF;IAKI,kBArJgC;EvDqhXlC;AACF;;AwDlhXA;EACE,oBAN2B;AxD2hX7B;;ACv6WE;EuD/GF;IAII,kBAR+B;ExD+hXjC;EwD3hXF;IAOM,oBAV8B;ExDiiXlC;EwD9hXF;IASM,mBAX4B;ExDmiXhC;AACF;;AyDniXA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzD0iXjC","file":"bulma-rtl.css"} \ No newline at end of file diff --git a/pagetop-bulmix/static/css/bulma.min.css b/pagetop-bulmix/static/css/bulma.min.css new file mode 100644 index 00000000..86ad2ff1 --- /dev/null +++ b/pagetop-bulmix/static/css/bulma.min.css @@ -0,0 +1 @@ +/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.5em - 1px);padding-left:calc(.75em - 1px);padding-right:calc(.75em - 1px);padding-top:calc(.5em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .button,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .input,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-previous,fieldset[disabled] .select select,fieldset[disabled] .textarea{cursor:not-allowed}.breadcrumb,.button,.file,.is-unselectable,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.pagination:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1em;font-weight:400;line-height:1.5}a{color:#485fc7;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#da1039;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#363636}@-webkit-keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}@keyframes spinAround{from{transform:rotate(0)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px #485fc7}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #485fc7}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.5em - 1px);margin-right:calc(-.5em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#485fc7;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:0 0;border-color:transparent;color:#485fc7;text-decoration:none}.button.is-ghost.is-hovered,.button.is-ghost:hover{color:#485fc7;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-dark{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#fff}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],fieldset[disabled] .button.is-dark{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled],fieldset[disabled] .button.is-primary{background-color:#00d1b2;border-color:#00d1b2;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-hovered,.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],fieldset[disabled] .button.is-primary.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined.is-focused,.button.is-primary.is-outlined.is-hovered,.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined.is-loading.is-focused::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-outlined.is-loading:focus::after,.button.is-primary.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined.is-focused,.button.is-primary.is-inverted.is-outlined.is-hovered,.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light{background-color:#ebfffc;color:#00947e}.button.is-primary.is-light.is-hovered,.button.is-primary.is-light:hover{background-color:#defffa;border-color:transparent;color:#00947e}.button.is-primary.is-light.is-active,.button.is-primary.is-light:active{background-color:#d1fff8;border-color:transparent;color:#00947e}.button.is-link{background-color:#485fc7;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#3e56c4;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#3a51bb;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#485fc7;border-color:#485fc7;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#485fc7}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;color:#485fc7}.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#485fc7;border-color:#485fc7;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#485fc7;box-shadow:none;color:#485fc7}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#485fc7}.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #485fc7 #485fc7!important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff1fa;color:#3850b7}.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover{background-color:#e6e9f7;border-color:transparent;color:#3850b7}.button.is-link.is-light.is-active,.button.is-link.is-light:active{background-color:#dce0f4;border-color:transparent;color:#3850b7}.button.is-info{background-color:#3e8ed0;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#3488ce;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#3082c5;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#3e8ed0;border-color:#3e8ed0;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#3e8ed0}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;color:#3e8ed0}.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#3e8ed0;box-shadow:none;color:#3e8ed0}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#3e8ed0}.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #3e8ed0 #3e8ed0!important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#eff5fb;color:#296fa8}.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover{background-color:#e4eff9;border-color:transparent;color:#296fa8}.button.is-info.is-light.is-active,.button.is-info.is-light:active{background-color:#dae9f6;border-color:transparent;color:#296fa8}.button.is-success{background-color:#48c78e;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#3ec487;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#3abb81;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#48c78e;border-color:#48c78e;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#48c78e}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;color:#48c78e}.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#48c78e;border-color:#48c78e;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#48c78e;box-shadow:none;color:#48c78e}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#48c78e}.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #48c78e #48c78e!important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#effaf5;color:#257953}.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover{background-color:#e6f7ef;border-color:transparent;color:#257953}.button.is-success.is-light.is-active,.button.is-success.is-light:active{background-color:#dcf4e9;border-color:transparent;color:#257953}.button.is-warning{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffe08a;border-color:#ffe08a;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffe08a}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;color:#ffe08a}.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffe08a;box-shadow:none;color:#ffe08a}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffe08a}.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #ffe08a #ffe08a!important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-warning.is-light{background-color:#fffaeb;color:#946c00}.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover{background-color:#fff6de;border-color:transparent;color:#946c00}.button.is-warning.is-light.is-active,.button.is-warning.is-light:active{background-color:#fff3d1;border-color:transparent;color:#946c00}.button.is-danger{background-color:#f14668;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#f03a5f;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ef2e55;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#f14668;border-color:#f14668;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#f14668}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;color:#f14668}.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#f14668;border-color:#f14668;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#f14668;box-shadow:none;color:#f14668}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#f14668}.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after{border-color:transparent transparent #f14668 #f14668!important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover{background-color:#fde0e6;border-color:transparent;color:#cc0f35}.button.is-danger.is-light.is-active,.button.is-danger.is-light:active{background-color:#fcd4dc;border-color:transparent;color:#cc0f35}.button.is-small{font-size:.75rem}.button.is-small:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * .5));top:calc(50% - (1em * .5));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:9999px;padding-left:calc(1em + .25em);padding-right:calc(1em + .25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:.25rem;margin-right:.25rem}@media screen and (max-width:768px){.button.is-responsive.is-small{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.button.is-responsive.is-small{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none!important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width:1024px){.container{max-width:960px}}@media screen and (max-width:1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width:1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width:1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width:1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:9999px}.image.is-fullwidth{width:100%}.image.is-16by9 .has-ratio,.image.is-16by9 img,.image.is-1by1 .has-ratio,.image.is-1by1 img,.image.is-1by2 .has-ratio,.image.is-1by2 img,.image.is-1by3 .has-ratio,.image.is-1by3 img,.image.is-2by1 .has-ratio,.image.is-2by1 img,.image.is-2by3 .has-ratio,.image.is-2by3 img,.image.is-3by1 .has-ratio,.image.is-3by1 img,.image.is-3by2 .has-ratio,.image.is-3by2 img,.image.is-3by4 .has-ratio,.image.is-3by4 img,.image.is-3by5 .has-ratio,.image.is-3by5 img,.image.is-4by3 .has-ratio,.image.is-4by3 img,.image.is-4by5 .has-ratio,.image.is-4by5 img,.image.is-5by3 .has-ratio,.image.is-5by3 img,.image.is-5by4 .has-ratio,.image.is-5by4 img,.image.is-9by16 .has-ratio,.image.is-9by16 img,.image.is-square .has-ratio,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{right:.5rem;position:absolute;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.notification.is-dark{background-color:#363636;color:#fff}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-primary.is-light{background-color:#ebfffc;color:#00947e}.notification.is-link{background-color:#485fc7;color:#fff}.notification.is-link.is-light{background-color:#eff1fa;color:#3850b7}.notification.is-info{background-color:#3e8ed0;color:#fff}.notification.is-info.is-light{background-color:#eff5fb;color:#296fa8}.notification.is-success{background-color:#48c78e;color:#fff}.notification.is-success.is-light{background-color:#effaf5;color:#257953}.notification.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.notification.is-warning.is-light{background-color:#fffaeb;color:#946c00}.notification.is-danger{background-color:#f14668;color:#fff}.notification.is-danger.is-light{background-color:#feecf0;color:#cc0f35}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right,#fff 30%,#ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right,#0a0a0a 30%,#ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right,#f5f5f5 30%,#ededed 30%)}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate{background-image:linear-gradient(to right,#363636 30%,#ededed 30%)}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-primary:indeterminate{background-image:linear-gradient(to right,#00d1b2 30%,#ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#485fc7}.progress.is-link::-moz-progress-bar{background-color:#485fc7}.progress.is-link::-ms-fill{background-color:#485fc7}.progress.is-link:indeterminate{background-image:linear-gradient(to right,#485fc7 30%,#ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#3e8ed0}.progress.is-info::-moz-progress-bar{background-color:#3e8ed0}.progress.is-info::-ms-fill{background-color:#3e8ed0}.progress.is-info:indeterminate{background-image:linear-gradient(to right,#3e8ed0 30%,#ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#48c78e}.progress.is-success::-moz-progress-bar{background-color:#48c78e}.progress.is-success::-ms-fill{background-color:#48c78e}.progress.is-success:indeterminate{background-image:linear-gradient(to right,#48c78e 30%,#ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffe08a}.progress.is-warning::-moz-progress-bar{background-color:#ffe08a}.progress.is-warning::-ms-fill{background-color:#ffe08a}.progress.is-warning:indeterminate{background-image:linear-gradient(to right,#ffe08a 30%,#ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#f14668}.progress.is-danger::-moz-progress-bar{background-color:#f14668}.progress.is-danger::-ms-fill{background-color:#f14668}.progress.is-danger:indeterminate{background-image:linear-gradient(to right,#f14668 30%,#ededed 30%)}.progress:indeterminate{-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moveIndeterminate;animation-name:moveIndeterminate;-webkit-animation-timing-function:linear;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right,#4a4a4a 30%,#ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@-webkit-keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#485fc7;border-color:#485fc7;color:#fff}.table td.is-info,.table th.is-info{background-color:#3e8ed0;border-color:#3e8ed0;color:#fff}.table td.is-success,.table th.is-success{background-color:#48c78e;border-color:#48c78e;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffe08a;border-color:#ffe08a;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#f14668;border-color:#f14668;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#363636}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:transparent}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot{background-color:transparent}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody{background-color:transparent}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(2n){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(2n){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.tag:not(body).is-dark{background-color:#363636;color:#fff}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-primary.is-light{background-color:#ebfffc;color:#00947e}.tag:not(body).is-link{background-color:#485fc7;color:#fff}.tag:not(body).is-link.is-light{background-color:#eff1fa;color:#3850b7}.tag:not(body).is-info{background-color:#3e8ed0;color:#fff}.tag:not(body).is-info.is-light{background-color:#eff5fb;color:#296fa8}.tag:not(body).is-success{background-color:#48c78e;color:#fff}.tag:not(body).is-success.is-light{background-color:#effaf5;color:#257953}.tag:not(body).is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.tag:not(body).is-warning.is-light{background-color:#fffaeb;color:#946c00}.tag:not(body).is-danger{background-color:#f14668;color:#fff}.tag:not(body).is-danger.is-light{background-color:#feecf0;color:#cc0f35}.tag:not(body).is-normal{font-size:.75rem}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:9999px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.input,.select select,.textarea{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.input::-moz-placeholder,.select select::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.select select:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input:hover,.is-hovered.input,.is-hovered.textarea,.select select.is-hovered,.select select:hover,.textarea:hover{border-color:#b5b5b5}.input:active,.input:focus,.is-active.input,.is-active.textarea,.is-focused.input,.is-focused.textarea,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{border-color:#485fc7;box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.input[disabled],.select fieldset[disabled] select,.select select[disabled],.textarea[disabled],fieldset[disabled] .input,fieldset[disabled] .select select,fieldset[disabled] .textarea{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input,.textarea{box-shadow:inset 0 .0625em .125em rgba(10,10,10,.05);max-width:100%;width:100%}.input[readonly],.textarea[readonly]{box-shadow:none}.is-white.input,.is-white.textarea{border-color:#fff}.is-white.input:active,.is-white.input:focus,.is-white.is-active.input,.is-white.is-active.textarea,.is-white.is-focused.input,.is-white.is-focused.textarea,.is-white.textarea:active,.is-white.textarea:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.is-black.input,.is-black.textarea{border-color:#0a0a0a}.is-black.input:active,.is-black.input:focus,.is-black.is-active.input,.is-black.is-active.textarea,.is-black.is-focused.input,.is-black.is-focused.textarea,.is-black.textarea:active,.is-black.textarea:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.is-light.input,.is-light.textarea{border-color:#f5f5f5}.is-light.input:active,.is-light.input:focus,.is-light.is-active.input,.is-light.is-active.textarea,.is-light.is-focused.input,.is-light.is-focused.textarea,.is-light.textarea:active,.is-light.textarea:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.is-dark.input,.is-dark.textarea{border-color:#363636}.is-dark.input:active,.is-dark.input:focus,.is-dark.is-active.input,.is-dark.is-active.textarea,.is-dark.is-focused.input,.is-dark.is-focused.textarea,.is-dark.textarea:active,.is-dark.textarea:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.is-primary.input,.is-primary.textarea{border-color:#00d1b2}.is-primary.input:active,.is-primary.input:focus,.is-primary.is-active.input,.is-primary.is-active.textarea,.is-primary.is-focused.input,.is-primary.is-focused.textarea,.is-primary.textarea:active,.is-primary.textarea:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.is-link.input,.is-link.textarea{border-color:#485fc7}.is-link.input:active,.is-link.input:focus,.is-link.is-active.input,.is-link.is-active.textarea,.is-link.is-focused.input,.is-link.is-focused.textarea,.is-link.textarea:active,.is-link.textarea:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.is-info.input,.is-info.textarea{border-color:#3e8ed0}.is-info.input:active,.is-info.input:focus,.is-info.is-active.input,.is-info.is-active.textarea,.is-info.is-focused.input,.is-info.is-focused.textarea,.is-info.textarea:active,.is-info.textarea:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.is-success.input,.is-success.textarea{border-color:#48c78e}.is-success.input:active,.is-success.input:focus,.is-success.is-active.input,.is-success.is-active.textarea,.is-success.is-focused.input,.is-success.is-focused.textarea,.is-success.textarea:active,.is-success.textarea:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.is-warning.input,.is-warning.textarea{border-color:#ffe08a}.is-warning.input:active,.is-warning.input:focus,.is-warning.is-active.input,.is-warning.is-active.textarea,.is-warning.is-focused.input,.is-warning.is-focused.textarea,.is-warning.textarea:active,.is-warning.textarea:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.is-danger.input,.is-danger.textarea{border-color:#f14668}.is-danger.input:active,.is-danger.input:focus,.is-danger.is-active.input,.is-danger.is-active.textarea,.is-danger.is-focused.input,.is-danger.is-focused.textarea,.is-danger.textarea:active,.is-danger.textarea:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.is-small.input,.is-small.textarea{border-radius:2px;font-size:.75rem}.is-medium.input,.is-medium.textarea{font-size:1.25rem}.is-large.input,.is-large.textarea{font-size:1.5rem}.is-fullwidth.input,.is-fullwidth.textarea{display:block;width:100%}.is-inline.input,.is-inline.textarea{display:inline;width:auto}.input.is-rounded{border-radius:9999px;padding-left:calc(calc(.75em - 1px) + .375em);padding-right:calc(calc(.75em - 1px) + .375em)}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox input[disabled],.checkbox[disabled],.radio input[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .radio{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#485fc7;right:1.125em;z-index:4}.select.is-rounded select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#485fc7}.select.is-link select{border-color:#485fc7}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#3a51bb}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(72,95,199,.25)}.select.is-info:not(:hover)::after{border-color:#3e8ed0}.select.is-info select{border-color:#3e8ed0}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#3082c5}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(62,142,208,.25)}.select.is-success:not(:hover)::after{border-color:#48c78e}.select.is-success select{border-color:#48c78e}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#3abb81}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(72,199,142,.25)}.select.is-warning:not(:hover)::after{border-color:#ffe08a}.select.is-warning select{border-color:#ffe08a}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd970}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,224,138,.25)}.select.is-danger:not(:hover)::after{border-color:#f14668}.select.is-danger select{border-color:#f14668}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ef2e55}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(241,70,104,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a!important;opacity:.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:rgba(0,0,0,.7)}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#fff}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#485fc7;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#3e56c4;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,95,199,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#3a51bb;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#3e8ed0;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#3488ce;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(62,142,208,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#3082c5;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#48c78e;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#3ec487;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(72,199,142,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#3abb81;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffe08a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdc7d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,224,138,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd970;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#f14668;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#f03a5f;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(241,70,104,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ef2e55;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#485fc7}.help.is-info{color:#3e8ed0}.help.is-success{color:#48c78e}.help.is-warning{color:#ffe08a}.help.is-danger{color:#f14668}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#4a4a4a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#485fc7;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);color:#4a4a4a;max-width:100%;position:relative}.card-content:first-child,.card-footer:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-content:last-child,.card-footer:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 .125em .25em rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#485fc7;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#485fc7;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body{border-color:#363636}.message.is-primary{background-color:#ebfffc}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#00947e}.message.is-link{background-color:#eff1fa}.message.is-link .message-header{background-color:#485fc7;color:#fff}.message.is-link .message-body{border-color:#485fc7;color:#3850b7}.message.is-info{background-color:#eff5fb}.message.is-info .message-header{background-color:#3e8ed0;color:#fff}.message.is-info .message-body{border-color:#3e8ed0;color:#296fa8}.message.is-success{background-color:#effaf5}.message.is-success .message-header{background-color:#48c78e;color:#fff}.message.is-success .message-body{border-color:#48c78e;color:#257953}.message.is-warning{background-color:#fffaeb}.message.is-warning .message-header{background-color:#ffe08a;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffe08a;color:#946c00}.message.is-danger{background-color:#feecf0}.message.is-danger .message-header{background-color:#f14668;color:#fff}.message.is-danger .message-body{border-color:#f14668;color:#cc0f35}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px){.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,.7)}}.navbar.is-dark{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#fff}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#fff}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#fff}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#485fc7;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#3a51bb;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#485fc7;color:#fff}}.navbar.is-info{background-color:#3e8ed0;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#3082c5;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#3e8ed0;color:#fff}}.navbar.is-success{background-color:#48c78e;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#3abb81;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#48c78e;color:#fff}}.navbar.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd970;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffe08a;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#f14668;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ef2e55;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#f14668;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:0 0;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:first-child{top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:first-child{transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover{background-color:#fafafa;color:#485fc7}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#485fc7}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#485fc7;border-bottom-style:solid;border-bottom-width:3px;color:#485fc7;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#485fc7;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#485fc7}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:focus):not(:hover),a.navbar-item.is-active:not(:focus):not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.5em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#485fc7}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link.is-disabled,.pagination-link[disabled],.pagination-next.is-disabled,.pagination-next[disabled],.pagination-previous.is-disabled,.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#485fc7;border-color:#485fc7;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:0 .5em 1em -.125em rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.02);font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading{background-color:#00d1b2;color:#fff}.panel.is-primary .panel-tabs a.is-active{border-bottom-color:#00d1b2}.panel.is-primary .panel-block.is-active .panel-icon{color:#00d1b2}.panel.is-link .panel-heading{background-color:#485fc7;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#485fc7}.panel.is-link .panel-block.is-active .panel-icon{color:#485fc7}.panel.is-info .panel-heading{background-color:#3e8ed0;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#3e8ed0}.panel.is-info .panel-block.is-active .panel-icon{color:#3e8ed0}.panel.is-success .panel-heading{background-color:#48c78e;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#48c78e}.panel.is-success .panel-block.is-active .panel-icon{color:#48c78e}.panel.is-warning .panel-heading{background-color:#ffe08a;color:rgba(0,0,0,.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffe08a}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffe08a}.panel.is-danger .panel-heading{background-color:#f14668;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#f14668}.panel.is-danger .panel-block.is-active .panel-icon{color:#f14668}.panel-block:not(:last-child),.panel-tabs:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#363636;font-size:1.25em;font-weight:700;line-height:1.25;padding:.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#485fc7}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#485fc7;color:#363636}.panel-block.is-active .panel-icon{color:#485fc7}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#485fc7;color:#485fc7}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#485fc7;border-color:#485fc7;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1023px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1024px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1216px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1408px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1023px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1024px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1216px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1408px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1023px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1024px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1216px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1408px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1023px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1024px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1216px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1408px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1023px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1024px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1216px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1408px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1023px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1023px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1024px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1024px) and (max-width:1215px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1216px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1216px) and (max-width:1407px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1408px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-primary-light{color:#ebfffc!important}a.has-text-primary-light:focus,a.has-text-primary-light:hover{color:#b8fff4!important}.has-background-primary-light{background-color:#ebfffc!important}.has-text-primary-dark{color:#00947e!important}a.has-text-primary-dark:focus,a.has-text-primary-dark:hover{color:#00c7a9!important}.has-background-primary-dark{background-color:#00947e!important}.has-text-link{color:#485fc7!important}a.has-text-link:focus,a.has-text-link:hover{color:#3449a8!important}.has-background-link{background-color:#485fc7!important}.has-text-link-light{color:#eff1fa!important}a.has-text-link-light:focus,a.has-text-link-light:hover{color:#c8cfee!important}.has-background-link-light{background-color:#eff1fa!important}.has-text-link-dark{color:#3850b7!important}a.has-text-link-dark:focus,a.has-text-link-dark:hover{color:#576dcb!important}.has-background-link-dark{background-color:#3850b7!important}.has-text-info{color:#3e8ed0!important}a.has-text-info:focus,a.has-text-info:hover{color:#2b74b1!important}.has-background-info{background-color:#3e8ed0!important}.has-text-info-light{color:#eff5fb!important}a.has-text-info-light:focus,a.has-text-info-light:hover{color:#c6ddf1!important}.has-background-info-light{background-color:#eff5fb!important}.has-text-info-dark{color:#296fa8!important}a.has-text-info-dark:focus,a.has-text-info-dark:hover{color:#368ace!important}.has-background-info-dark{background-color:#296fa8!important}.has-text-success{color:#48c78e!important}a.has-text-success:focus,a.has-text-success:hover{color:#34a873!important}.has-background-success{background-color:#48c78e!important}.has-text-success-light{color:#effaf5!important}a.has-text-success-light:focus,a.has-text-success-light:hover{color:#c8eedd!important}.has-background-success-light{background-color:#effaf5!important}.has-text-success-dark{color:#257953!important}a.has-text-success-dark:focus,a.has-text-success-dark:hover{color:#31a06e!important}.has-background-success-dark{background-color:#257953!important}.has-text-warning{color:#ffe08a!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd257!important}.has-background-warning{background-color:#ffe08a!important}.has-text-warning-light{color:#fffaeb!important}a.has-text-warning-light:focus,a.has-text-warning-light:hover{color:#ffecb8!important}.has-background-warning-light{background-color:#fffaeb!important}.has-text-warning-dark{color:#946c00!important}a.has-text-warning-dark:focus,a.has-text-warning-dark:hover{color:#c79200!important}.has-background-warning-dark{background-color:#946c00!important}.has-text-danger{color:#f14668!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ee1742!important}.has-background-danger{background-color:#f14668!important}.has-text-danger-light{color:#feecf0!important}a.has-text-danger-light:focus,a.has-text-danger-light:hover{color:#fabdc9!important}.has-background-danger-light{background-color:#feecf0!important}.has-text-danger-dark{color:#cc0f35!important}a.has-text-danger-dark:focus,a.has-text-danger-dark:hover{color:#ee2049!important}.has-background-danger-dark{background-color:#cc0f35!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.is-flex-direction-row{flex-direction:row!important}.is-flex-direction-row-reverse{flex-direction:row-reverse!important}.is-flex-direction-column{flex-direction:column!important}.is-flex-direction-column-reverse{flex-direction:column-reverse!important}.is-flex-wrap-nowrap{flex-wrap:nowrap!important}.is-flex-wrap-wrap{flex-wrap:wrap!important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse!important}.is-justify-content-flex-start{justify-content:flex-start!important}.is-justify-content-flex-end{justify-content:flex-end!important}.is-justify-content-center{justify-content:center!important}.is-justify-content-space-between{justify-content:space-between!important}.is-justify-content-space-around{justify-content:space-around!important}.is-justify-content-space-evenly{justify-content:space-evenly!important}.is-justify-content-start{justify-content:start!important}.is-justify-content-end{justify-content:end!important}.is-justify-content-left{justify-content:left!important}.is-justify-content-right{justify-content:right!important}.is-align-content-flex-start{align-content:flex-start!important}.is-align-content-flex-end{align-content:flex-end!important}.is-align-content-center{align-content:center!important}.is-align-content-space-between{align-content:space-between!important}.is-align-content-space-around{align-content:space-around!important}.is-align-content-space-evenly{align-content:space-evenly!important}.is-align-content-stretch{align-content:stretch!important}.is-align-content-start{align-content:start!important}.is-align-content-end{align-content:end!important}.is-align-content-baseline{align-content:baseline!important}.is-align-items-stretch{align-items:stretch!important}.is-align-items-flex-start{align-items:flex-start!important}.is-align-items-flex-end{align-items:flex-end!important}.is-align-items-center{align-items:center!important}.is-align-items-baseline{align-items:baseline!important}.is-align-items-start{align-items:start!important}.is-align-items-end{align-items:end!important}.is-align-items-self-start{align-items:self-start!important}.is-align-items-self-end{align-items:self-end!important}.is-align-self-auto{align-self:auto!important}.is-align-self-flex-start{align-self:flex-start!important}.is-align-self-flex-end{align-self:flex-end!important}.is-align-self-center{align-self:center!important}.is-align-self-baseline{align-self:baseline!important}.is-align-self-stretch{align-self:stretch!important}.is-flex-grow-0{flex-grow:0!important}.is-flex-grow-1{flex-grow:1!important}.is-flex-grow-2{flex-grow:2!important}.is-flex-grow-3{flex-grow:3!important}.is-flex-grow-4{flex-grow:4!important}.is-flex-grow-5{flex-grow:5!important}.is-flex-shrink-0{flex-shrink:0!important}.is-flex-shrink-1{flex-shrink:1!important}.is-flex-shrink-2{flex-shrink:2!important}.is-flex-shrink-3{flex-shrink:3!important}.is-flex-shrink-4{flex-shrink:4!important}.is-flex-shrink-5{flex-shrink:5!important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.is-clickable{cursor:pointer!important;pointer-events:all!important}.is-clipped{overflow:hidden!important}.is-relative{position:relative!important}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:.75rem!important}.mt-3{margin-top:.75rem!important}.mr-3{margin-right:.75rem!important}.mb-3{margin-bottom:.75rem!important}.ml-3{margin-left:.75rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}.m-4{margin:1rem!important}.mt-4{margin-top:1rem!important}.mr-4{margin-right:1rem!important}.mb-4{margin-bottom:1rem!important}.ml-4{margin-left:1rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.my-4{margin-top:1rem!important;margin-bottom:1rem!important}.m-5{margin:1.5rem!important}.mt-5{margin-top:1.5rem!important}.mr-5{margin-right:1.5rem!important}.mb-5{margin-bottom:1.5rem!important}.ml-5{margin-left:1.5rem!important}.mx-5{margin-left:1.5rem!important;margin-right:1.5rem!important}.my-5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-6{margin:3rem!important}.mt-6{margin-top:3rem!important}.mr-6{margin-right:3rem!important}.mb-6{margin-bottom:3rem!important}.ml-6{margin-left:3rem!important}.mx-6{margin-left:3rem!important;margin-right:3rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:.75rem!important}.pt-3{padding-top:.75rem!important}.pr-3{padding-right:.75rem!important}.pb-3{padding-bottom:.75rem!important}.pl-3{padding-left:.75rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.p-4{padding:1rem!important}.pt-4{padding-top:1rem!important}.pr-4{padding-right:1rem!important}.pb-4{padding-bottom:1rem!important}.pl-4{padding-left:1rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.py-4{padding-top:1rem!important;padding-bottom:1rem!important}.p-5{padding:1.5rem!important}.pt-5{padding-top:1.5rem!important}.pr-5{padding-right:1.5rem!important}.pb-5{padding-bottom:1.5rem!important}.pl-5{padding-left:1.5rem!important}.px-5{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-6{padding:3rem!important}.pt-6{padding-top:3rem!important}.pr-6{padding-right:3rem!important}.pb-6{padding-bottom:3rem!important}.pl-6{padding-left:3rem!important}.px-6{padding-left:3rem!important;padding-right:3rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.p-auto{padding:auto!important}.pt-auto{padding-top:auto!important}.pr-auto{padding-right:auto!important}.pb-auto{padding-bottom:auto!important}.pl-auto{padding-left:auto!important}.px-auto{padding-left:auto!important;padding-right:auto!important}.py-auto{padding-top:auto!important;padding-bottom:auto!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.is-underlined{text-decoration:underline!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-medium{font-weight:500!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-family-primary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-secondary{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-sans-serif{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif!important}.is-family-monospace{font-family:monospace!important}.is-family-code{font-family:monospace!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff!important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a!important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,.7)}.hero.is-light .subtitle{color:rgba(0,0,0,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:rgba(0,0,0,.7)}.hero.is-light .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5!important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#fff}.hero.is-dark .subtitle{color:rgba(255,255,255,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(255,255,255,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#fff}.hero.is-dark .tabs a{color:#fff;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{color:#363636!important;opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{color:#00d1b2!important;opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#485fc7;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#485fc7}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#3a51bb;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#485fc7!important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#485fc7}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#2959b3 0,#485fc7 71%,#5658d2 100%)}}.hero.is-info{background-color:#3e8ed0;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#3e8ed0}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#3082c5;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#3e8ed0!important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3e8ed0}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#208fbc 0,#3e8ed0 71%,#4d83db 100%)}}.hero.is-success{background-color:#48c78e;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#48c78e}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#3abb81;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#48c78e!important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#48c78e}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#29b35e 0,#48c78e 71%,#56d2af 100%)}}.hero.is-warning{background-color:#ffe08a;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffe08a}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd970;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffe08a!important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffe08a}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffb657 0,#ffe08a 71%,#fff6a3 100%)}}.hero.is-danger{background-color:#f14668;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#f14668}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ef2e55;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#f14668!important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#f14668}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#fa0a62 0,#f14668 71%,#f7595f 100%)}}.hero.is-small .hero-body{padding:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width:769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/pagetop-bulmix/static/css/bulma.min.css.map b/pagetop-bulmix/static/css/bulma.min.css.map new file mode 100644 index 00000000..dbe97a3f --- /dev/null +++ b/pagetop-bulmix/static/css/bulma.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../bulma.sass","../sass/utilities/_all.sass","../sass/utilities/extends.sass","../sass/utilities/controls.sass","../sass/utilities/initial-variables.sass","bulma.css","../sass/utilities/mixins.sass","../sass/base/_all.sass","../sass/base/minireset.sass","../sass/base/generic.sass","../sass/utilities/derived-variables.sass","../sass/base/animations.sass","../sass/elements/_all.sass","../sass/elements/box.sass","../sass/elements/button.sass","../sass/utilities/functions.sass","../sass/elements/container.sass","../sass/elements/content.sass","../sass/elements/icon.sass","../sass/elements/image.sass","../sass/elements/notification.sass","../sass/elements/progress.sass","../sass/elements/table.sass","../sass/elements/tag.sass","../sass/elements/title.sass","../sass/elements/other.sass","../sass/form/_all.sass","../sass/form/shared.sass","../sass/form/input-textarea.sass","../sass/form/checkbox-radio.sass","../sass/form/select.sass","../sass/form/file.sass","../sass/form/tools.sass","../sass/components/_all.sass","../sass/components/breadcrumb.sass","../sass/components/card.sass","../sass/components/dropdown.sass","../sass/components/level.sass","../sass/components/media.sass","../sass/components/menu.sass","../sass/components/message.sass","../sass/components/modal.sass","../sass/components/navbar.sass","../sass/components/pagination.sass","../sass/components/panel.sass","../sass/components/tabs.sass","../sass/grid/_all.sass","../sass/grid/columns.sass","../sass/grid/tiles.sass","../sass/helpers/_all.sass","../sass/helpers/color.sass","../sass/helpers/flexbox.sass","../sass/helpers/float.sass","../sass/helpers/other.sass","../sass/helpers/overflow.sass","../sass/helpers/position.sass","../sass/helpers/spacing.sass","../sass/helpers/typography.sass","../sass/helpers/visibility.sass","../sass/layout/_all.sass","../sass/layout/hero.sass","../sass/layout/section.sass","../sass/layout/footer.sass"],"names":[],"mappings":"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,4BAA4B;EAC5B,sBLpC0B;ACkU5B;;AI5RA;EACE,cL7D4B;EK8D5B,cA1DkB;EA2DlB,gBL7BiB;EK8BjB,gBA1DoB;AJyVtB;;AI3RA;EACE,cLtDgC;EKuDhC,eAAe;EACf,qBAAqB;AJ8RvB;;AIjSA;EAKI,mBAAmB;AJgSvB;;AIrSA;EAOI,cL5E0B;AC8W9B;;AIhSA;EACE,4BLxE4B;EKyE5B,cCnBsB;EDoBtB,kBArEiB;EAsEjB,mBAvEkB;EAwElB,4BAzEgC;AJ4WlC;;AIjSA;EACE,4BL/E4B;EKgF5B,YAAY;EACZ,cAAc;EACd,WAxEa;EAyEb,gBAxEkB;AJ4WpB;;AIlSA;EACE,YAAY;EACZ,eAAe;AJqSjB;;AInSA;;EAEE,wBAAwB;AJsS1B;;AIpSA;EACE,kBAvFuB;AJ8XzB;;AIrSA;EACE,mBAAmB;EACnB,oBAAoB;AJwStB;;AItSA;EACE,cL5G4B;EK6G5B,gBLvEe;ACgXjB;;AIrSA;EACE,YAAY;AJwSd;;AItSA;EHvDE,iCAAiC;EGyDjC,4BL/G4B;EKgH5B,cLtH4B;EKuH5B,kBAjGqB;EAkGrB,gBAAgB;EAChB,uBAlG0B;EAmG1B,gBAAgB;EAChB,iBAAiB;AJySnB;;AIjTA;EAUI,6BAA6B;EAC7B,mBAAmB;EACnB,cAvGoB;EAwGpB,UAAU;AJ2Sd;;AIzSA;;EAGI,mBAAmB;AJ2SvB;;AI9SA;;EAKM,mBAAmB;AJ8SzB;;AInTA;EAOI,cL1I0B;AC0b9B;;AMhcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AMzcA;EACE;IACE,uBAAuB;ENmczB;EMlcA;IACE,yBAAyB;ENoc3B;AACF;;AOzcA,mBAAA;ACWA;EAEE,uBTE6B;ESD7B,kBTyDgB;ESxDhB,0FTb2B;ESc3B,cTT4B;ESU5B,cAAc;EACd,gBAZmB;AR6crB;;AQ/bA;EAGI,yETD8B;ACiclC;;AQncA;EAKI,oETH8B;ACqclC;;AS/ZA;EAGE,uBVhD6B;EUiD7B,qBVtD4B;EUuD5B,iBX5DwB;EW6DxB,cV5D4B;EU6D5B,eAAe;EAGf,uBAAuB;EACvB,iCA7D6D;EA8D7D,iBA7D6B;EA8D7B,kBA9D6B;EA+D7B,8BAhE6D;EAiE7D,kBAAkB;EAClB,mBAAmB;AT8ZrB;;AS9aA;EAkBI,cAAc;ATgalB;;ASlbA;EAwBM,aAAa;EACb,YAAY;AT8ZlB;;ASvbA;ERwHI,+BQ7FsG;ER6FtG,oBQ5FmE;ATgavE;;AS5bA;ERwHI,mBQ1FmE;ER0FnE,gCQzFsG;ATka1G;;ASjcA;EAiCM,+BAAiF;EACjF,gCAAkF;AToaxF;;AStcA;EAsCI,qBVzF0B;EU0F1B,cV7F0B;ACigB9B;;AS3cA;EA0CI,qBVhF8B;EUiF9B,cVjG0B;ACsgB9B;;AShdA;EA6CM,iDVnF4B;AC0flC;;ASpdA;EAgDI,qBVrG0B;EUsG1B,cVvG0B;AC+gB9B;;ASzdA;EAoDI,6BAA6B;EAC7B,yBAAyB;EACzB,cV3G0B;EU4G1B,0BA1F8B;ATmgBlC;;ASheA;EA4DM,4BV3GwB;EU4GxB,cVnHwB;AC2hB9B;;ASreA;EAgEM,yBChB2B;EDiB3B,cVvHwB;ACgiB9B;;AS1eA;;EAoEM,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;AT2atB;;ASjfA;EAwEI,gBAvG0B;EAwG1B,yBAvGmC;EAwGnC,cVhH8B;EUiH9B,qBAvG0B;ATohB9B;;ASxfA;EA8EM,cVpH4B;EUqH5B,0BAzGmC;ATuhBzC;;AS7fA;EAoFM,uBVjIyB;EUkIzB,yBAAyB;EACzB,cVhJuB;AC6jB7B;;ASngBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,cVrJqB;ACmkB7B;;ASzgBA;EA8FQ,yBAAyB;EACzB,cVzJqB;ACwkB7B;;AS9gBA;EAiGU,mDV9IqB;AC+jB/B;;ASlhBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,cVhKqB;ACklB7B;;ASxhBA;;EAyGQ,uBVtJuB;EUuJvB,mBVvJuB;EUwJvB,gBAAgB;ATobxB;;AS/hBA;EA6GQ,yBVvKqB;EUwKrB,YV3JuB;ACilB/B;;ASpiBA;EAiHU,uBCjEuB;AVwfjC;;ASxiBA;;EAoHU,yBV9KmB;EU+KnB,yBAAyB;EACzB,gBAAgB;EAChB,YVpKqB;AC6lB/B;;AShjBA;EA0HU,gEAA4E;AT0btF;;ASpjBA;EA4HQ,6BAA6B;EAC7B,mBV1KuB;EU2KvB,YV3KuB;ACumB/B;;AS1jBA;EAmIU,uBVhLqB;EUiLrB,mBVjLqB;EUkLrB,cV/LmB;AC0nB7B;;AShkBA;EAwIY,4DAA8D;AT4b1E;;ASpkBA;EA8Ic,gEAA4E;AT0b1F;;ASxkBA;;EAiJU,6BAA6B;EAC7B,mBV/LqB;EUgMrB,gBAAgB;EAChB,YVjMqB;AC6nB/B;;AShlBA;EAsJQ,6BAA6B;EAC7B,qBVjNqB;EUkNrB,cVlNqB;ACgpB7B;;AStlBA;EA6JU,yBVvNmB;EUwNnB,YV3MqB;ACwoB/B;;AS3lBA;EAqKc,4DAA8D;AT0b5E;;AS/lBA;;EAwKU,6BAA6B;EAC7B,qBVnOmB;EUoOnB,gBAAgB;EAChB,cVrOmB;ACiqB7B;;ASvmBA;EAoFM,yBV9IuB;EU+IvB,yBAAyB;EACzB,YVnIyB;AC0pB/B;;AS7mBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,YVxIuB;ACgqB/B;;ASnnBA;EA8FQ,yBAAyB;EACzB,YV5IuB;ACqqB/B;;ASxnBA;EAiGU,gDV3JmB;ACsrB7B;;AS5nBA;EAoGQ,uBCpDyB;EDqDzB,yBAAyB;EACzB,YVnJuB;AC+qB/B;;ASloBA;;EAyGQ,yBVnKqB;EUoKrB,qBVpKqB;EUqKrB,gBAAgB;AT8hBxB;;ASzoBA;EA6GQ,uBV1JuB;EU2JvB,cVxKqB;ACwsB7B;;AS9oBA;EAiHU,yBCjEuB;AVkmBjC;;ASlpBA;;EAoHU,uBVjKqB;EUkKrB,yBAAyB;EACzB,gBAAgB;EAChB,cVjLmB;ACotB7B;;AS1pBA;EA0HU,4DAA4E;AToiBtF;;AS9pBA;EA4HQ,6BAA6B;EAC7B,qBVvLqB;EUwLrB,cVxLqB;AC8tB7B;;ASpqBA;EAmIU,yBV7LmB;EU8LnB,qBV9LmB;EU+LnB,YVlLqB;ACutB/B;;AS1qBA;EAwIY,gEAA8D;ATsiB1E;;AS9qBA;EA8Ic,4DAA4E;AToiB1F;;ASlrBA;;EAiJU,6BAA6B;EAC7B,qBV5MmB;EU6MnB,gBAAgB;EAChB,cV9MmB;ACovB7B;;AS1rBA;EAsJQ,6BAA6B;EAC7B,mBVpMuB;EUqMvB,YVrMuB;AC6uB/B;;AShsBA;EA6JU,uBV1MqB;EU2MrB,cVxNmB;AC+vB7B;;ASrsBA;EAqKc,gEAA8D;AToiB5E;;ASzsBA;;EAwKU,6BAA6B;EAC7B,mBVtNqB;EUuNrB,gBAAgB;EAChB,YVxNqB;AC8vB/B;;ASjtBA;EAoFM,4BVnIwB;EUoIxB,yBAAyB;EACzB,yBClEe;AVmsBrB;;ASvtBA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVysBrB;;AS7tBA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV8sBrB;;ASluBA;EAiGU,mDVhJoB;ACqxB9B;;AStuBA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVwtBrB;;AS5uBA;;EAyGQ,4BVxJsB;EUyJtB,wBVzJsB;EU0JtB,gBAAgB;ATwoBxB;;ASnvBA;EA6GQ,oCCzFa;ED0Fb,iBV7JsB;ACuyB9B;;ASxvBA;EAiHU,oCCjEuB;AV4sBjC;;AS5vBA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,iBVtKoB;ACmzB9B;;ASpwBA;EA0HU,sFAA4E;AT8oBtF;;ASxwBA;EA4HQ,6BAA6B;EAC7B,wBV5KsB;EU6KtB,iBV7KsB;AC6zB9B;;AS9wBA;EAmIU,4BVlLoB;EUmLpB,wBVnLoB;EUoLpB,yBCjHW;AVgwBrB;;ASpxBA;EAwIY,sEAA8D;ATgpB1E;;ASxxBA;EA8Ic,sFAA4E;AT8oB1F;;AS5xBA;;EAiJU,6BAA6B;EAC7B,wBVjMoB;EUkMpB,gBAAgB;EAChB,iBVnMoB;ACm1B9B;;ASpyBA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVsxBrB;;AS1yBA;EA6JU,oCCzIW;ED0IX,iBV7MoB;AC81B9B;;AS/yBA;EAqKc,sEAA8D;AT8oB5E;;ASnzBA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVuyBrB;;AS3zBA;EAoFM,yBV1IwB;EU2IxB,yBAAyB;EACzB,WChEU;AV2yBhB;;ASj0BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVizBhB;;ASv0BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVszBhB;;AS50BA;EAiGU,gDVvJoB;ACs4B9B;;ASh1BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVg0BhB;;ASt1BA;;EAyGQ,yBV/JsB;EUgKtB,qBVhKsB;EUiKtB,gBAAgB;ATkvBxB;;AS71BA;EA6GQ,sBCvFQ;EDwFR,cVpKsB;ACw5B9B;;ASl2BA;EAiHU,yBCjEuB;AVszBjC;;ASt2BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7KoB;ACo6B9B;;AS92BA;EA0HU,0DAA4E;ATwvBtF;;ASl3BA;EA4HQ,6BAA6B;EAC7B,qBVnLsB;EUoLtB,cVpLsB;AC86B9B;;ASx3BA;EAmIU,yBVzLoB;EU0LpB,qBV1LoB;EU2LpB,WC/GM;AVw2BhB;;AS93BA;EAwIY,gEAA8D;AT0vB1E;;ASl4BA;EA8Ic,0DAA4E;ATwvB1F;;ASt4BA;;EAiJU,6BAA6B;EAC7B,qBVxMoB;EUyMpB,gBAAgB;EAChB,cV1MoB;ACo8B9B;;AS94BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV83BhB;;ASp5BA;EA6JU,sBCvIM;EDwIN,cVpNoB;AC+8B9B;;ASz5BA;EAqKc,gEAA8D;ATwvB5E;;AS75BA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+4BhB;;ASr6BA;EAoFM,yBV5H4B;EU6H5B,yBAAyB;EACzB,WChEU;AVq5BhB;;AS36BA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV25BhB;;ASj7BA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVg6BhB;;ASt7BA;EAiGU,iDVzIwB;ACk+BlC;;AS17BA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV06BhB;;ASh8BA;;EAyGQ,yBVjJ0B;EUkJ1B,qBVlJ0B;EUmJ1B,gBAAgB;AT41BxB;;ASv8BA;EA6GQ,sBCvFQ;EDwFR,cVtJ0B;ACo/BlC;;AS58BA;EAiHU,yBCjEuB;AVg6BjC;;ASh9BA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV/JwB;ACggClC;;ASx9BA;EA0HU,0DAA4E;ATk2BtF;;AS59BA;EA4HQ,6BAA6B;EAC7B,qBVrK0B;EUsK1B,cVtK0B;AC0gClC;;ASl+BA;EAmIU,yBV3KwB;EU4KxB,qBV5KwB;EU6KxB,WC/GM;AVk9BhB;;ASx+BA;EAwIY,gEAA8D;ATo2B1E;;AS5+BA;EA8Ic,0DAA4E;ATk2B1F;;ASh/BA;;EAiJU,6BAA6B;EAC7B,qBV1LwB;EU2LxB,gBAAgB;EAChB,cV5LwB;ACgiClC;;ASx/BA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVw+BhB;;AS9/BA;EA6JU,sBCvIM;EDwIN,cVtMwB;AC2iClC;;ASngCA;EAqKc,gEAA8D;ATk2B5E;;ASvgCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVy/BhB;;AS/gCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV++BrE;;ASphCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVq/BrE;;AS1hCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV2/BrE;;AShiCA;EAoFM,yBV1H4B;EU2H5B,yBAAyB;EACzB,WChEU;AVghChB;;AStiCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVshChB;;AS5iCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AV2hChB;;ASjjCA;EAiGU,iDVvIwB;AC2lClC;;ASrjCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVqiChB;;AS3jCA;;EAyGQ,yBV/I0B;EUgJ1B,qBVhJ0B;EUiJ1B,gBAAgB;ATu9BxB;;ASlkCA;EA6GQ,sBCvFQ;EDwFR,cVpJ0B;AC6mClC;;ASvkCA;EAiHU,yBCjEuB;AV2hCjC;;AS3kCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV7JwB;ACynClC;;ASnlCA;EA0HU,0DAA4E;AT69BtF;;ASvlCA;EA4HQ,6BAA6B;EAC7B,qBVnK0B;EUoK1B,cVpK0B;ACmoClC;;AS7lCA;EAmIU,yBVzKwB;EU0KxB,qBV1KwB;EU2KxB,WC/GM;AV6kChB;;ASnmCA;EAwIY,gEAA8D;AT+9B1E;;ASvmCA;EA8Ic,0DAA4E;AT69B1F;;AS3mCA;;EAiJU,6BAA6B;EAC7B,qBVxLwB;EUyLxB,gBAAgB;EAChB,cV1LwB;ACypClC;;ASnnCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVmmChB;;ASznCA;EA6JU,sBCvIM;EDwIN,cVpMwB;ACoqClC;;AS9nCA;EAqKc,gEAA8D;AT69B5E;;ASloCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVonChB;;AS1oCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV0mCrE;;AS/oCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVgnCrE;;ASrpCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVsnCrE;;AS3pCA;EAoFM,yBV3H4B;EU4H5B,yBAAyB;EACzB,WChEU;AV2oChB;;ASjqCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVipChB;;ASvqCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVspChB;;AS5qCA;EAiGU,kDVxIwB;ACutClC;;AShrCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVgqChB;;AStrCA;;EAyGQ,yBVhJ0B;EUiJ1B,qBVjJ0B;EUkJ1B,gBAAgB;ATklCxB;;AS7rCA;EA6GQ,sBCvFQ;EDwFR,cVrJ0B;ACyuClC;;ASlsCA;EAiHU,yBCjEuB;AVspCjC;;AStsCA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV9JwB;ACqvClC;;AS9sCA;EA0HU,0DAA4E;ATwlCtF;;ASltCA;EA4HQ,6BAA6B;EAC7B,qBVpK0B;EUqK1B,cVrK0B;AC+vClC;;ASxtCA;EAmIU,yBV1KwB;EU2KxB,qBV3KwB;EU4KxB,WC/GM;AVwsChB;;AS9tCA;EAwIY,gEAA8D;AT0lC1E;;ASluCA;EA8Ic,0DAA4E;ATwlC1F;;AStuCA;;EAiJU,6BAA6B;EAC7B,qBVzLwB;EU0LxB,gBAAgB;EAChB,cV3LwB;ACqxClC;;AS9uCA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV8tChB;;ASpvCA;EA6JU,sBCvIM;EDwIN,cVrMwB;ACgyClC;;ASzvCA;EAqKc,gEAA8D;ATwlC5E;;AS7vCA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV+uChB;;ASrwCA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVquCrE;;AS1wCA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV2uCrE;;AShxCA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVivCrE;;AStxCA;EAoFM,yBV7H4B;EU8H5B,yBAAyB;EACzB,WChEU;AVswChB;;AS5xCA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AV4wChB;;ASlyCA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVixChB;;ASvyCA;EAiGU,kDV1IwB;ACo1ClC;;AS3yCA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AV2xChB;;ASjzCA;;EAyGQ,yBVlJ0B;EUmJ1B,qBVnJ0B;EUoJ1B,gBAAgB;AT6sCxB;;ASxzCA;EA6GQ,sBCvFQ;EDwFR,cVvJ0B;ACs2ClC;;AS7zCA;EAiHU,yBCjEuB;AVixCjC;;ASj0CA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cVhKwB;ACk3ClC;;ASz0CA;EA0HU,0DAA4E;ATmtCtF;;AS70CA;EA4HQ,6BAA6B;EAC7B,qBVtK0B;EUuK1B,cVvK0B;AC43ClC;;ASn1CA;EAmIU,yBV5KwB;EU6KxB,qBV7KwB;EU8KxB,WC/GM;AVm0ChB;;ASz1CA;EAwIY,gEAA8D;ATqtC1E;;AS71CA;EA8Ic,0DAA4E;ATmtC1F;;ASj2CA;;EAiJU,6BAA6B;EAC7B,qBV3LwB;EU4LxB,gBAAgB;EAChB,cV7LwB;ACk5ClC;;ASz2CA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AVy1ChB;;AS/2CA;EA6JU,sBCvIM;EDwIN,cVvMwB;AC65ClC;;ASp3CA;EAqKc,gEAA8D;ATmtC5E;;ASx3CA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AV02ChB;;ASh4CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVg2CrE;;ASr4CA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVs2CrE;;AS34CA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AV42CrE;;ASj5CA;EAoFM,yBV9H4B;EU+H5B,yBAAyB;EACzB,yBClEe;AVm4CrB;;ASv5CA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,yBCvEa;AVy4CrB;;AS75CA;EA8FQ,yBAAyB;EACzB,yBC3Ea;AV84CrB;;ASl6CA;EAiGU,mDV3IwB;ACg9ClC;;ASt6CA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,yBClFa;AVw5CrB;;AS56CA;;EAyGQ,yBVnJ0B;EUoJ1B,qBVpJ0B;EUqJ1B,gBAAgB;ATw0CxB;;ASn7CA;EA6GQ,oCCzFa;ED0Fb,cVxJ0B;ACk+ClC;;ASx7CA;EAiHU,oCCjEuB;AV44CjC;;AS57CA;;EAoHU,oCChGW;EDiGX,yBAAyB;EACzB,gBAAgB;EAChB,cVjKwB;AC8+ClC;;ASp8CA;EA0HU,sFAA4E;AT80CtF;;ASx8CA;EA4HQ,6BAA6B;EAC7B,qBVvK0B;EUwK1B,cVxK0B;ACw/ClC;;AS98CA;EAmIU,yBV7KwB;EU8KxB,qBV9KwB;EU+KxB,yBCjHW;AVg8CrB;;ASp9CA;EAwIY,gEAA8D;ATg1C1E;;ASx9CA;EA8Ic,sFAA4E;AT80C1F;;AS59CA;;EAiJU,6BAA6B;EAC7B,qBV5LwB;EU6LxB,gBAAgB;EAChB,cV9LwB;AC8gDlC;;ASp+CA;EAsJQ,6BAA6B;EAC7B,gCCnIa;EDoIb,yBCpIa;AVs9CrB;;AS1+CA;EA6JU,oCCzIW;ED0IX,cVxMwB;ACyhDlC;;AS/+CA;EAqKc,gEAA8D;AT80C5E;;ASn/CA;;EAwKU,6BAA6B;EAC7B,gCCrJW;EDsJX,gBAAgB;EAChB,yBCvJW;AVu+CrB;;AS3/CA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AV29CrE;;AShgDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AVi+CrE;;AStgDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVu+CrE;;AS5gDA;EAoFM,yBVxH2B;EUyH3B,yBAAyB;EACzB,WChEU;AV4/ChB;;ASlhDA;EAyFQ,yBCzCyB;ED0CzB,yBAAyB;EACzB,WCrEQ;AVkgDhB;;ASxhDA;EA8FQ,yBAAyB;EACzB,WCzEQ;AVugDhB;;AS7hDA;EAiGU,kDVrIuB;ACqkDjC;;ASjiDA;EAoGQ,yBCpDyB;EDqDzB,yBAAyB;EACzB,WChFQ;AVihDhB;;ASviDA;;EAyGQ,yBV7IyB;EU8IzB,qBV9IyB;EU+IzB,gBAAgB;ATm8CxB;;AS9iDA;EA6GQ,sBCvFQ;EDwFR,cVlJyB;ACulDjC;;ASnjDA;EAiHU,yBCjEuB;AVugDjC;;ASvjDA;;EAoHU,sBC9FM;ED+FN,yBAAyB;EACzB,gBAAgB;EAChB,cV3JuB;ACmmDjC;;AS/jDA;EA0HU,0DAA4E;ATy8CtF;;ASnkDA;EA4HQ,6BAA6B;EAC7B,qBVjKyB;EUkKzB,cVlKyB;AC6mDjC;;ASzkDA;EAmIU,yBVvKuB;EUwKvB,qBVxKuB;EUyKvB,WC/GM;AVyjDhB;;AS/kDA;EAwIY,gEAA8D;AT28C1E;;ASnlDA;EA8Ic,0DAA4E;ATy8C1F;;ASvlDA;;EAiJU,6BAA6B;EAC7B,qBVtLuB;EUuLvB,gBAAgB;EAChB,cVxLuB;ACmoDjC;;AS/lDA;EAsJQ,6BAA6B;EAC7B,kBCjIQ;EDkIR,WClIQ;AV+kDhB;;ASrmDA;EA6JU,sBCvIM;EDwIN,cVlMuB;AC8oDjC;;AS1mDA;EAqKc,gEAA8D;ATy8C5E;;AS9mDA;;EAwKU,6BAA6B;EAC7B,kBCnJM;EDoJN,gBAAgB;EAChB,WCrJM;AVgmDhB;;AStnDA;EAiLU,yBCpJsC;EDqJtC,cC7I2D;AVslDrE;;AS3nDA;EAqLY,yBCrIqB;EDsIrB,yBAAyB;EACzB,cClJyD;AV4lDrE;;ASjoDA;EA0LY,yBC1IqB;ED2IrB,yBAAyB;EACzB,cCvJyD;AVkmDrE;;ASvoDA;EARE,kBVdc;ACiqDhB;;ASrpDE;EACE,kBVkBc;ACsoDlB;;AS/oDA;EANE,eVjBW;AC0qDb;;ASnpDA;EAJE,kBVpBc;AC+qDhB;;ASvpDA;EAFE,iBVvBa;ACorDf;;AS3pDA;;EAyMI,uBVtP2B;EUuP3B,qBV5P0B;EU6P1B,gBAjOyB;EAkOzB,YAjOyB;ATwrD7B;;ASnqDA;EA8MI,aAAa;EACb,WAAW;ATy9Cf;;ASxqDA;EAiNI,6BAA6B;EAC7B,oBAAoB;AT29CxB;;AS7qDA;ERnDE,kBAAkB;EAKhB,6BAAmC;EACnC,4BAAkC;EQmQhC,6BAA6B;AT89CnC;;ASprDA;EAwNI,4BVvQ0B;EUwQ1B,qBV3Q0B;EU4Q1B,cV9Q0B;EU+Q1B,gBAAgB;EAChB,oBAAoB;ATg+CxB;;AS5rDA;EA8NI,qBVlNmB;EUmNnB,gCAA0D;EAC1D,iCAA2D;ATk+C/D;;ASh+CA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;ATm+C7B;;ASv+CA;EAMI,qBAAqB;ATq+CzB;;AS3+CA;ER1GI,oBQkHwC;ATu+C5C;;AS/+CA;EAUI,sBAAsB;ATy+C1B;;ASn/CA;EAYI,mBAAmB;AT2+CvB;;ASv/CA;EA1OE,kBVdc;ACmvDhB;;ASvuDE;EACE,kBVkBc;ACwtDlB;;AS//CA;EAtOE,kBVpBc;AC6vDhB;;ASngDA;EApOE,iBVvBa;ACkwDf;;ASvgDA;EA0BQ,4BAA4B;EAC5B,yBAAyB;ATi/CjC;;AS5gDA;EA6BQ,6BAA6B;EAC7B,0BAA0B;ERxI9B,kBQyIwC;ATm/C5C;;ASlhDA;ER1GI,eQ2IqC;ATq/CzC;;ASthDA;EAoCQ,UAAU;ATs/ClB;;AS1hDA;EA0CQ,UAAU;ATo/ClB;;AS9hDA;EA4CU,UAAU;ATs/CpB;;ASliDA;EA8CQ,YAAY;EACZ,cAAc;ATw/CtB;;ASviDA;EAiDI,uBAAuB;AT0/C3B;;AS3iDA;EAoDQ,oBAAoB;EACpB,qBAAqB;AT2/C7B;;AShjDA;EAuDI,yBAAyB;AT6/C7B;;ASpjDA;EA0DQ,oBAAoB;EACpB,qBAAqB;AT8/C7B;;ACzvDE;EQiQM;IACE,oBAlTyD;ET8yDjE;ES1/CM;;IAEE,qBAtT0F;ETkzDlG;ESjgDM;IACE,kBV1TM;EC6zDd;ESpgDM;IACE,eV3TG;ECi0DX;AACF;;ACrwDE;EQ6PM;IACE,qBAlTyL;ET8zDjM;ES1gDM;;IAEE,kBV9TM;EC00Dd;ESjhDM;IACE,eV3TG;EC80DX;ESphDM;IACE,kBV5TM;ECk1Dd;AACF;;AWl3DA;EACE,YAAY;EACZ,cAAc;EACd,kBAAkB;EAClB,WAAW;AXq3Db;;AWz3DA;EAMI,0BAA0B;EAC1B,kBZyCM;EYxCN,mBZwCM;EYvCN,WAAW;AXu3Df;;AC/wDE;EUjHF;IAWI,gBAAuC;EX03DzC;AACF;;AC3wDI;EU3HJ;IAcM,iBAAqE;EX63DzE;AACF;;AClwDI;EU1IJ;IAiBM,iBAAiE;EXg4DrE;AACF;;AClxDI;EUhIJ;IAoBM,iBAAqE;EXm4DzE;AACF;;ACzwDI;EU/IJ;IAuBM,iBAAiE;EXs4DrE;AACF;;AY34DA;EAII,kBAAkB;AZ24DtB;;AY/4DA;;;;;;;EAcM,kBAhC2B;AZ26DjC;;AYz5DA;;;;;;EAqBI,cbvC0B;EawC1B,gBbHiB;EaIjB,kBA3C+B;AZw7DnC;;AYp6DA;EAyBI,cAAc;EACd,oBAAoB;AZ+4DxB;;AYz6DA;EA4BM,eAAe;AZi5DrB;;AY76DA;EA8BI,iBAAiB;EACjB,uBAAuB;AZm5D3B;;AYl7DA;EAiCM,oBAAoB;AZq5D1B;;AYt7DA;EAmCI,gBAAgB;EAChB,uBAAuB;AZu5D3B;;AY37DA;EAsCM,oBAAoB;AZy5D1B;;AY/7DA;EAwCI,iBAAiB;EACjB,oBAAoB;AZ25DxB;;AYp8DA;EA2CI,kBAAkB;EAClB,uBAAuB;AZ65D3B;;AYz8DA;EA8CI,cAAc;EACd,kBAAkB;AZ+5DtB;;AY98DA;EAiDI,4Bb5D0B;EEuK1B,8BF1K0B;EaiE1B,qBAjEqC;AZk+DzC;;AYp9DA;EAqDI,4BAA4B;EXuG5B,gBWtGmC;EACnC,eAAe;AZm6DnB;;AY19DA;EAyDM,wBAAwB;AZq6D9B;;AY99DA;EA2DQ,4BAA4B;AZu6DpC;;AYl+DA;EA6DQ,4BAA4B;AZy6DpC;;AYt+DA;EA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kBI,uBAAuB;AfyyE3B;;Ae3zEA;EdiLI,ac7J4B;EAC5B,kBAAkB;EAClB,WAAW;Af2yEf;;Aej0EA;;;EA0BI,mBAAmB;Af6yEvB;;Aev0EA;EAgCM,uBhB5ByB;EgB6BzB,chB1CuB;ACq1E7B;;Ae50EA;EAgCM,yBhBzCuB;EgB0CvB,YhB7ByB;AC60E/B;;Aej1EA;EAgCM,4BhB9BwB;EgB+BxB,yBLoCe;AVixErB;;Aet1EA;EAgCM,yBhBrCwB;EgBsCxB,WLsCU;AVoxEhB;;Ae31EA;EAgCM,yBhBvB4B;EgBwB5B,WLsCU;AVyxEhB;;Aeh2EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV+wErE;;Aer2EA;EAgCM,yBhBrB4B;EgBsB5B,WLsCU;AVmyEhB;;Ae12EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVyxErE;;Ae/2EA;EAgCM,yBhBtB4B;EgBuB5B,WLsCU;AV6yEhB;;Aep3EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVmyErE;;Aez3EA;EAgCM,yBhBxB4B;EgByB5B,WLsCU;AVuzEhB;;Ae93EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AV6yErE;;Aen4EA;EAgCM,yBhBzB4B;EgB0B5B,yBLoCe;AVm0ErB;;Aex4EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVuzErE;;Ae74EA;EAgCM,yBhBnB2B;EgBoB3B,WLsCU;AV20EhB;;Ael5EA;EAuCU,yBLuCsC;EKtCtC,cL8C2D;AVi0ErE;;AgBx5EA;EAEE,qBAAqB;EACrB,wBAAwB;EACxB,YAAY;EACZ,qBjByDqB;EiBxDrB,cAAc;EACd,YjBoBW;EiBnBX,gBAAgB;EAChB,UAAU;EACV,WAAW;AhB05Eb;;AgBp6EA;EAYI,yBjBX2B;ACu6E/B;;AgBx6EA;EAcI,yBjBjB0B;AC+6E9B;;AgB56EA;EAgBI,yBjBnB0B;ACm7E9B;;AgBh7EA;EAkBI,yBjBrB0B;EiBsB1B,YAAY;AhBk6EhB;;AgBr7EA;EAyBQ,uBjBpBuB;ACo7E/B;;AgBz7EA;EA2BQ,uBjBtBuB;ACw7E/B;;AgB77EA;EA6BQ,uBjBxBuB;AC47E/B;;AgBj8EA;EA+BQ,mEAA2F;AhBs6EnG;;AgBr8EA;EAyBQ,yBjBjCqB;ACi9E7B;;AgBz8EA;EA2BQ,yBjBnCqB;ACq9E7B;;AgB78EA;EA6BQ,yBjBrCqB;ACy9E7B;;AgBj9EA;EA+BQ,qEAA2F;AhBs7EnG;;AgBr9EA;EAyBQ,4BjBtBsB;ACs9E9B;;AgBz9EA;EA2BQ,4BjBxBsB;AC09E9B;;AgB79EA;EA6BQ,4BjB1BsB;AC89E9B;;AgBj+EA;EA+BQ,wEAA2F;AhBs8EnG;;AgBr+EA;EAyBQ,yBjB7BsB;AC6+E9B;;AgBz+EA;EA2BQ,yBjB/BsB;ACi/E9B;;AgB7+EA;EA6BQ,yBjBjCsB;ACq/E9B;;AgBj/EA;EA+BQ,qEAA2F;AhBs9EnG;;AgBr/EA;EAyBQ,yBjBf0B;AC++ElC;;AgBz/EA;EA2BQ,yBjBjB0B;ACm/ElC;;AgB7/EA;EA6BQ,yBjBnB0B;ACu/ElC;;AgBjgFA;EA+BQ,qEAA2F;AhBs+EnG;;AgBrgFA;EAyBQ,yBjBb0B;AC6/ElC;;AgBzgFA;EA2BQ,yBjBf0B;ACigFlC;;AgB7gFA;EA6BQ,yBjBjB0B;ACqgFlC;;AgBjhFA;EA+BQ,qEAA2F;AhBs/EnG;;AgBrhFA;EAyBQ,yBjBd0B;AC8gFlC;;AgBzhFA;EA2BQ,yBjBhB0B;ACkhFlC;;AgB7hFA;EA6BQ,yBjBlB0B;ACshFlC;;AgBjiFA;EA+BQ,qEAA2F;AhBsgFnG;;AgBriFA;EAyBQ,yBjBhB0B;ACgiFlC;;AgBziFA;EA2BQ,yBjBlB0B;ACoiFlC;;AgB7iFA;EA6BQ,yBjBpB0B;ACwiFlC;;AgBjjFA;EA+BQ,qEAA2F;AhBshFnG;;AgBrjFA;EAyBQ,yBjBjB0B;ACijFlC;;AgBzjFA;EA2BQ,yBjBnB0B;ACqjFlC;;AgB7jFA;EA6BQ,yBjBrB0B;ACyjFlC;;AgBjkFA;EA+BQ,qEAA2F;AhBsiFnG;;AgBrkFA;EAyBQ,yBjBXyB;AC2jFjC;;AgBzkFA;EA2BQ,yBjBbyB;AC+jFjC;;AgB7kFA;EA6BQ,yBjBfyB;ACmkFjC;;AgBjlFA;EA+BQ,qEAA2F;AhBsjFnG;;AgBrlFA;EAkCI,gCAtCkC;UAsClC,wBAtCkC;EAuClC,2CAAmC;UAAnC,mCAAmC;EACnC,yCAAiC;UAAjC,iCAAiC;EACjC,yCAAiC;UAAjC,iCAAiC;EACjC,yBjBrC2B;EiBsC3B,qEAA0F;EAC1F,6BAA6B;EAC7B,4BAA4B;EAC5B,0BAA0B;AhBujF9B;;AgBjmFA;EA4CM,6BAA6B;AhByjFnC;;AgBrmFA;EA8CM,6BAA6B;AhB2jFnC;;AgBzmFA;EAgDM,oBAAoB;AhB6jF1B;;AgB7mFA;EAoDI,ejBxBY;ACqlFhB;;AgBjnFA;EAsDI,ejB5BY;AC2lFhB;;AgBrnFA;EAwDI,cjB/BW;ACgmFf;;AgB/jFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AgBxkFA;EACE;IACE,2BAA2B;EhBkkF7B;EgBjkFA;IACE,4BAA4B;EhBmkF9B;AACF;;AiB9mFA;EAEE,uBlBjB6B;EkBkB7B,clB3B4B;AC2oF9B;;AiBnnFA;;EAMI,yBlB1B0B;EkB2B1B,qBA/B6B;EAgC7B,qBA/B6B;EAgC7B,mBAAmB;AjBknFvB;;AiB3nFA;;EAeQ,uBlB9BuB;EkB+BvB,mBlB/BuB;EkBgCvB,clB7CqB;AC8pF7B;;AiBloFA;;EAeQ,yBlB3CqB;EkB4CrB,qBlB5CqB;EkB6CrB,YlBhCuB;ACwpF/B;;AiBzoFA;;EAeQ,4BlBhCsB;EkBiCtB,wBlBjCsB;EkBkCtB,yBPiCa;AV8lFrB;;AiBhpFA;;EAeQ,yBlBvCsB;EkBwCtB,qBlBxCsB;EkByCtB,WPmCQ;AVmmFhB;;AiBvpFA;;EAeQ,yBlBzB0B;EkB0B1B,qBlB1B0B;EkB2B1B,WPmCQ;AV0mFhB;;AiB9pFA;;EAeQ,yBlBvB0B;EkBwB1B,qBlBxB0B;EkByB1B,WPmCQ;AVinFhB;;AiBrqFA;;EAeQ,yBlBxB0B;EkByB1B,qBlBzB0B;EkB0B1B,WPmCQ;AVwnFhB;;AiB5qFA;;EAeQ,yBlB1B0B;EkB2B1B,qBlB3B0B;EkB4B1B,WPmCQ;AV+nFhB;;AiBnrFA;;EAeQ,yBlB3B0B;EkB4B1B,qBlB5B0B;EkB6B1B,yBPiCa;AVwoFrB;;AiB1rFA;;EAeQ,yBlBrByB;EkBsBzB,qBlBtByB;EkBuBzB,WPmCQ;AV6oFhB;;AiBjsFA;;EAoBM,mBAAmB;EACnB,SAAS;AjBkrFf;;AiBvsFA;;EAuBM,yBlBjC4B;EkBkC5B,WP4BU;AVypFhB;;AiB7sFA;;;;EA2BQ,mBAAmB;AjByrF3B;;AiBptFA;;EA6BM,sBAAsB;AjB4rF5B;;AiBztFA;EA+BI,clBvD0B;ACqvF9B;;AiB7tFA;EAiCM,gBAtDsB;AjBsvF5B;;AiBjuFA;EAoCM,yBlB9C4B;EkB+C5B,WPeU;AVkrFhB;;AiBtuFA;;EAwCQ,mBAAmB;AjBmsF3B;;AiB3uFA;;EA2CQ,kBPSQ;EORR,mBAAmB;AjBqsF3B;;AiBjvFA;EA8CI,6BA5DqC;AjBmwFzC;;AiBrvFA;;EAiDM,qBApEgC;EAqEhC,clB1EwB;ACmxF9B;;AiB3vFA;EAoDI,6BAhEqC;AjB2wFzC;;AiB/vFA;;EAuDM,qBAxEgC;EAyEhC,clBhFwB;AC6xF9B;;AiBrwFA;EA0DI,6BAvEqC;AjBsxFzC;;AiBzwFA;;EA+DU,sBAAsB;AjB+sFhC;;AiB9wFA;;EAoEM,iBAAiB;AjB+sFvB;;AiBnxFA;;EAyEU,wBAAwB;AjB+sFlC;;AiBxxFA;EA2EI,WAAW;AjBitFf;;AiB5xFA;EAgFU,yBlBhGoB;ACgzF9B;;AiBhyFA;EAqFY,yBlBrGkB;ACozF9B;;AiBpyFA;EAuFc,4BlBxGgB;ACyzF9B;;AiBxyFA;;EA2FM,qBAAqB;AjBktF3B;;AiB7yFA;EAgGU,yBlBhHoB;ACi0F9B;;AiB/sFA;EhB7DE,iCAAiC;EgBgEjC,cAAc;EACd,kBAAkB;EAClB,eAAe;AjBitFjB;;AkB70FA;EACE,mBAAmB;EACnB,aAAa;EACb,eAAe;EACf,2BAA2B;AlBg1F7B;;AkBp1FA;EAMI,qBAAqB;AlBk1FzB;;AkBx1FA;EjB2KI,oBiBnKwC;AlBo1F5C;;AkB51FA;EAUI,sBAAsB;AlBs1F1B;;AkBh2FA;EAYI,mBAAmB;AlBw1FvB;;AkBp2FA;EAgBM,enBYO;AC40Fb;;AkBx2FA;EAmBM,kBnBQU;ACi1FhB;;AkB52FA;EAqBI,uBAAuB;AlB21F3B;;AkBh3FA;EAuBM,qBAAqB;EACrB,oBAAoB;AlB61F1B;;AkBr3FA;EA0BI,yBAAyB;AlB+1F7B;;AkBz3FA;EA6BQ,mBAAmB;AlBg2F3B;;AkB73FA;EA+BQ,eAAe;AlBk2FvB;;AkBj4FA;EjB2KI,eiBzImC;AlBm2FvC;;AkBr4FA;EjB2KI,ciBvIqC;EAE/B,yBAAyB;EACzB,4BAA4B;AlBo2FtC;;AkB34FA;EA6CU,0BAA0B;EAC1B,6BAA6B;AlBk2FvC;;AkB71FA;EACE,mBAAmB;EACnB,4BnBjD4B;EmBkD5B,kBnBOU;EmBNV,cnBzD4B;EmB0D5B,oBAAoB;EACpB,kBnB5Bc;EmB6Bd,WAAW;EACX,uBAAuB;EACvB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,mBAAmB;AlBg2FrB;;AkB52FA;EjBwHI,oBiB1GuC;EjB0GvC,uBiBzGyC;AlBk2F7C;;AkBj3FA;EAqBM,uBnBlEyB;EmBmEzB,cnBhFuB;ACg7F7B;;AkBt3FA;EAqBM,yBnB/EuB;EmBgFvB,YnBnEyB;ACw6F/B;;AkB33FA;EAqBM,4BnBpEwB;EmBqExB,yBRFe;AV42FrB;;AkBh4FA;EAqBM,yBnB3EwB;EmB4ExB,WRAU;AV+2FhB;;AkBr4FA;EAqBM,yBnB7D4B;EmB8D5B,WRAU;AVo3FhB;;AkB14FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV02FrE;;AkB/4FA;EAqBM,yBnB3D4B;EmB4D5B,WRAU;AV83FhB;;AkBp5FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVo3FrE;;AkBz5FA;EAqBM,yBnB5D4B;EmB6D5B,WRAU;AVw4FhB;;AkB95FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV83FrE;;AkBn6FA;EAqBM,yBnB9D4B;EmB+D5B,WRAU;AVk5FhB;;AkBx6FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVw4FrE;;AkB76FA;EAqBM,yBnB/D4B;EmBgE5B,yBRFe;AV85FrB;;AkBl7FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AVk5FrE;;AkBv7FA;EAqBM,yBnBzD2B;EmB0D3B,WRAU;AVs6FhB;;AkB57FA;EA4BU,yBRCsC;EQAtC,cRQ2D;AV45FrE;;AkBj8FA;EAgCI,kBnBtDY;AC29FhB;;AkBr8FA;EAkCI,enBzDS;ACg+Fb;;AkBz8FA;EAoCI,kBnB5DY;ACq+FhB;;AkB78FA;EjBwHI,qBiBjF0C;EjBiF1C,sBiBhF0C;AlB06F9C;;AkBl9FA;EjBwHI,qBiB9E0C;EjB8E1C,sBiB7E0C;AlB46F9C;;AkBv9FA;EjBwHI,qBiB3E0C;EjB2E1C,sBiB1E0C;AlB86F9C;;AkB59FA;EjBwHI,gBiB/KmB;EAyGnB,UAAU;EACV,kBAAkB;EAClB,UAAU;AlB+6Fd;;AkBn+FA;EAuDM,8BAA8B;EAC9B,WAAW;EACX,cAAc;EACd,SAAS;EACT,kBAAkB;EAClB,QAAQ;EACR,0DAA0D;EAC1D,+BAA+B;AlBg7FrC;;AkB9+FA;EAgEM,WAAW;EACX,UAAU;AlBk7FhB;;AkBn/FA;EAmEM,WAAW;EACX,UAAU;AlBo7FhB;;AkBx/FA;EAuEM,yBAAmD;AlBq7FzD;;AkB5/FA;EAyEM,yBAAoD;AlBu7F1D;;AkBhgGA;EA2EI,qBnB/DmB;ACw/FvB;;AkBv7FA;EAEI,0BAA0B;AlBy7F9B;;AmB/iGA;;EAGE,sBAAsB;AnBijGxB;;AmBpjGA;;;;EAMI,oBAAoB;AnBqjGxB;;AmB3jGA;;EAQI,iBApBmB;AnB4kGvB;;AmBhkGA;;EAUI,iBArBmB;AnBglGvB;;AmBrkGA;;EAYI,sBAAsB;AnB8jG1B;;AmB5jGA;EACE,cpB9B4B;EoBiC5B,epBLW;EoBMX,gBpBGmB;EoBFnB,kBAnCuB;AnBgmGzB;;AmBnkGA;EAQI,cApCwB;EAqCxB,oBApCyB;AnBmmG7B;;AmBxkGA;EAWI,oBA3B+B;AnB4lGnC;;AmB5kGA;EAgBM,epBnBO;ACmlGb;;AmBhlGA;EAgBM,iBpBlBS;ACslGf;;AmBplGA;EAgBM,epBjBO;ACylGb;;AmBxlGA;EAgBM,iBpBhBS;AC4lGf;;AmB5lGA;EAgBM,kBpBfU;AC+lGhB;;AmBhmGA;EAgBM,epBdO;ACkmGb;;AmBpmGA;EAgBM,kBpBbU;ACqmGhB;;AmBtlGA;EACE,cpB/C4B;EoBkD5B,kBpBrBc;EoBsBd,gBpBjBiB;EoBkBjB,iBA3CyB;AnBkoG3B;;AmB7lGA;EAQI,cpBvD0B;EoBwD1B,gBpBnBiB;AC4mGrB;;AmBlmGA;EAWI,oBA7C+B;AnBwoGnC;;AmBtmGA;EAgBM,epBrCO;AC+nGb;;AmB1mGA;EAgBM,iBpBpCS;ACkoGf;;AmB9mGA;EAgBM,epBnCO;ACqoGb;;AmBlnGA;EAgBM,iBpBlCS;ACwoGf;;AmBtnGA;EAgBM,kBpBjCU;AC2oGhB;;AmB1nGA;EAgBM,epBhCO;AC8oGb;;AmB9nGA;EAgBM,kBpB/BU;ACipGhB;;AoB/qGA;EACE,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,yBAAyB;ApBkrG3B;;AoB7qGA;EACE,mBAAmB;EACnB,4BrBP4B;EqBQ5B,qBrBmDqB;EqBlDrB,oBAAoB;EACpB,kBrBac;EqBZd,WAAW;EACX,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;EAClB,mBAAmB;ApBgrGrB;;AqB9sGA,eAAA;AC0DA;EAxBE,uBvBnB6B;EuBoB7B,qBvBzB4B;EuB0B5B,kBvBkCU;EuBjCV,cvB/B4B;ACgtG9B;;AC9oGI;EqBjCA,4BvBjC0B;ACotG9B;;AClpGI;EqBjCA,4BvBjC0B;ACwtG9B;;ACtpGI;EqBjCA,4BvBjC0B;AC4tG9B;;AC1pGI;EqBjCA,4BvBjC0B;ACguG9B;;AsB9rGE;EAEE,qBvBjC0B;ACiuG9B;;AsB/rGE;EAIE,qBvBzB8B;EuB0B9B,iDvB1B8B;ACytGlC;;AsB9rGE;;;;;EAEE,4BvBtC0B;EuBuC1B,wBvBvC0B;EuBwC1B,gBAAgB;EAChB,cvB9C0B;ACkvG9B;;AClrGI;;;;;EqBhBE,+BvBhDwB;AC0vG9B;;AC1rGI;;;;;EqBhBE,+BvBhDwB;ACkwG9B;;AClsGI;;;;;EqBhBE,+BvBhDwB;AC0wG9B;;AC1sGI;;;;;EqBhBE,+BvBhDwB;ACkxG9B;;AuBpxGA;EAEE,2DxBN2B;EwBO3B,eAAe;EACf,WAAW;AvBsxGb;;AuBrxGE;EACE,gBAAgB;AvBwxGpB;;AuBpxGI;EACE,mBxBFyB;ACyxG/B;;AuBxxGK;EAMG,mDxBPuB;AC6xG/B;;AuB5xGI;EACE,qBxBfuB;AC8yG7B;;AuBhyGK;EAMG,gDxBpBqB;ACkzG7B;;AuBpyGI;EACE,wBxBJwB;AC2yG9B;;AuBxyGK;EAMG,mDxBTsB;AC+yG9B;;AuB5yGI;EACE,qBxBXwB;AC0zG9B;;AuBhzGK;EAMG,gDxBhBsB;AC8zG9B;;AuBpzGI;EACE,qBxBG4B;ACozGlC;;AuBxzGK;EAMG,iDxBF0B;ACwzGlC;;AuB5zGI;EACE,qBxBK4B;AC0zGlC;;AuBh0GK;EAMG,iDxBA0B;AC8zGlC;;AuBp0GI;EACE,qBxBI4B;ACm0GlC;;AuBx0GK;EAMG,kDxBD0B;ACu0GlC;;AuB50GI;EACE,qBxBE4B;AC60GlC;;AuBh1GK;EAMG,kDxBH0B;ACi1GlC;;AuBp1GI;EACE,qBxBC4B;ACs1GlC;;AuBx1GK;EAMG,mDxBJ0B;AC01GlC;;AuB51GI;EACE,qBxBO2B;ACw1GjC;;AuBh2GK;EAMG,kDxBEyB;AC41GjC;;AuB51GE;EzBmBA,kBC0BgB;EDzBhB,kBCNc;ACm1GhB;;AuB/1GE;EzBoBA,kBCVc;ACy1GhB;;AuBj2GE;EzBoBA,iBCba;AC81Gf;;AuBl2GE;EACE,cAAc;EACd,WAAW;AvBq2Gf;;AuBp2GE;EACE,eAAe;EACf,WAAW;AvBu2Gf;;AuBr2GA;EAGI,qBxB+BmB;EwB9BnB,gDAA4D;EAC5D,iDAA6D;AvBs2GjE;;AuB32GA;EAOI,6BAA6B;EAC7B,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AvBw2GpB;;AuBt2GA;EAEE,cAAc;EACd,eAAe;EACf,eAAe;EACf,2BzB7CkE;EyB8ClE,gBAAgB;AvBw2GlB;;AuB92GA;EAQI,gBA1DsB;EA2DtB,eA1DqB;AvBo6GzB;;AuBn3GA;EAWI,eAAe;AvB42GnB;;AuBv3GA;EAcI,YAAY;AvB62GhB;;AwB96GA;EACE,eAAe;EACf,qBAAqB;EACrB,iBAAiB;EACjB,kBAAkB;AxBi7GpB;;AwBh7GE;EACE,eAAe;AxBm7GnB;;AwBl7GE;EACE,czBF0B;ACu7G9B;;AwBp7GE;;;;;EAGE,czBJ0B;EyBK1B,mBAAmB;AxBy7GvB;;AwBp7GA;EvBkKI,kBuB/JqC;AxBq7GzC;;AyBx8GA;EACE,qBAAqB;EACrB,eAAe;EACf,kBAAkB;EAClB,mBAAmB;AzB28GrB;;AyB/8GA;EAMI,a3BDkB;AE88GtB;;AyBn9GA;EAUM,qB1BU4B;EEsK9B,cwB/K+B;EAC7B,UAAU;AzB68GhB;;AyBz9GA;EAeM,qB1BuDiB;EE4GnB,iBwBlKsC;AzB88G1C;;AyB99GA;EAmBI,eAAe;EACf,cAAc;EACd,cAAc;EACd,eAAe;EACf,aAAa;AzB+8GjB;;AyBt+GA;EAyBM,aAAa;AzBi9GnB;;AyB1+GA;;EA4BM,wB1BjBwB;ACo+G9B;;AyB/+GA;ExBkLI,oBwBpJwC;AzBq9G5C;;AyBn/GA;EAgCM,YAAY;EACZ,UAAU;AzBu9GhB;;AyBx/GA;EAmCQ,kBAAkB;AzBy9G1B;;AyB5/GA;EAuCM,qB1BnCwB;AC4/G9B;;AyBhgHA;EA6CQ,mB1BhCuB;ACu/G/B;;AyBpgHA;EA+CQ,mB1BlCuB;AC2/G/B;;AyBxgHA;EAkDU,qBfwDuB;AVk6GjC;;AyB5gHA;EAuDU,mD1B1CqB;ACmgH/B;;AyBhhHA;EA6CQ,qB1B7CqB;ACohH7B;;AyBphHA;EA+CQ,qB1B/CqB;ACwhH7B;;AyBxhHA;EAkDU,mBfwDuB;AVk7GjC;;AyB5hHA;EAuDU,gD1BvDmB;ACgiH7B;;AyBhiHA;EA6CQ,wB1BlCsB;ACyhH9B;;AyBpiHA;EA+CQ,wB1BpCsB;AC6hH9B;;AyBxiHA;EAkDU,qBfwDuB;AVk8GjC;;AyB5iHA;EAuDU,mD1B5CoB;ACqiH9B;;AyBhjHA;EA6CQ,qB1BzCsB;ACgjH9B;;AyBpjHA;EA+CQ,qB1B3CsB;ACojH9B;;AyBxjHA;EAkDU,qBfwDuB;AVk9GjC;;AyB5jHA;EAuDU,gD1BnDoB;AC4jH9B;;AyBhkHA;EA6CQ,qB1B3B0B;ACkjHlC;;AyBpkHA;EA+CQ,qB1B7B0B;ACsjHlC;;AyBxkHA;EAkDU,qBfwDuB;AVk+GjC;;AyB5kHA;EAuDU,iD1BrCwB;AC8jHlC;;AyBhlHA;EA6CQ,qB1BzB0B;ACgkHlC;;AyBplHA;EA+CQ,qB1B3B0B;ACokHlC;;AyBxlHA;EAkDU,qBfwDuB;AVk/GjC;;AyB5lHA;EAuDU,iD1BnCwB;AC4kHlC;;AyBhmHA;EA6CQ,qB1B1B0B;ACilHlC;;AyBpmHA;EA+CQ,qB1B5B0B;ACqlHlC;;AyBxmHA;EAkDU,qBfwDuB;AVkgHjC;;AyB5mHA;EAuDU,kD1BpCwB;AC6lHlC;;AyBhnHA;EA6CQ,qB1B5B0B;ACmmHlC;;AyBpnHA;EA+CQ,qB1B9B0B;ACumHlC;;AyBxnHA;EAkDU,qBfwDuB;AVkhHjC;;AyB5nHA;EAuDU,kD1BtCwB;AC+mHlC;;AyBhoHA;EA6CQ,qB1B7B0B;AConHlC;;AyBpoHA;EA+CQ,qB1B/B0B;ACwnHlC;;AyBxoHA;EAkDU,qBfwDuB;AVkiHjC;;AyB5oHA;EAuDU,mD1BvCwB;ACgoHlC;;AyBhpHA;EA6CQ,qB1BvByB;AC8nHjC;;AyBppHA;EA+CQ,qB1BzByB;ACkoHjC;;AyBxpHA;EAkDU,qBfwDuB;AVkjHjC;;AyB5pHA;EAuDU,kD1BjCuB;AC0oHjC;;AyBhqHA;E3ByCE,kBC0BgB;EDzBhB,kBCNc;ACioHhB;;AyBrqHA;E3B4CE,kBCVc;ACuoHhB;;AyBzqHA;E3B8CE,iBCba;AC4oHf;;AyB7qHA;EAkEM,gCAA8C;EAC9C,YAAY;AzB+mHlB;;AyBlrHA;EAqEI,WAAW;AzBinHf;;AyBtrHA;EAuEM,WAAW;AzBmnHjB;;AyB1rHA;EA2EM,aAAa;EACb,kBAAkB;ExB8GpB,cwB7G+B;EAC7B,YAAY;EACZ,eAAe;AzBmnHrB;;AyBlsHA;EAiFM,kB1B7CU;ACkqHhB;;AyBtsHA;EAmFM,kB1BjDU;ACwqHhB;;AyB1sHA;EAqFM,iB1BpDS;AC6qHf;;A0BjsHA;EAEE,oBAAoB;EACpB,aAAa;EACb,2BAA2B;EAC3B,kBAAkB;A1BmsHpB;;A0BxsHA;EAYQ,uB3BZuB;E2BavB,yBAAyB;EACzB,c3B3BqB;AC2tH7B;;A0B9sHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,c3BjCmB;ACiuH7B;;A0BptHA;EAwBU,yBAAyB;EACzB,+C3BzBqB;E2B0BrB,c3BvCmB;ACuuH7B;;A0B1tHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,c3B7CmB;AC6uH7B;;A0BhuHA;EAYQ,yB3BzBqB;E2B0BrB,yBAAyB;EACzB,Y3BduB;ACsuH/B;;A0BtuHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,Y3BpBqB;AC4uH/B;;A0B5uHA;EAwBU,yBAAyB;EACzB,4C3BtCmB;E2BuCnB,Y3B1BqB;ACkvH/B;;A0BlvHA;EA8BU,uBhB+DuB;EgB9DvB,yBAAyB;EACzB,Y3BhCqB;ACwvH/B;;A0BxvHA;EAYQ,4B3BdsB;E2BetB,yBAAyB;EACzB,yBhBmDa;AV6rHrB;;A0B9vHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVmsHrB;;A0BpwHA;EAwBU,yBAAyB;EACzB,+C3B3BoB;E2B4BpB,yBhBuCW;AVysHrB;;A0B1wHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+sHrB;;A0BhxHA;EAYQ,yB3BrBsB;E2BsBtB,yBAAyB;EACzB,WhBqDQ;AVmtHhB;;A0BtxHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVytHhB;;A0B5xHA;EAwBU,yBAAyB;EACzB,4C3BlCoB;E2BmCpB,WhByCM;AV+tHhB;;A0BlyHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVquHhB;;A0BxyHA;EAYQ,yB3BP0B;E2BQ1B,yBAAyB;EACzB,WhBqDQ;AV2uHhB;;A0B9yHA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVivHhB;;A0BpzHA;EAwBU,yBAAyB;EACzB,6C3BpBwB;E2BqBxB,WhByCM;AVuvHhB;;A0B1zHA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6vHhB;;A0Bh0HA;EAYQ,yB3BL0B;E2BM1B,yBAAyB;EACzB,WhBqDQ;AVmwHhB;;A0Bt0HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVywHhB;;A0B50HA;EAwBU,yBAAyB;EACzB,6C3BlBwB;E2BmBxB,WhByCM;AV+wHhB;;A0Bl1HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVqxHhB;;A0Bx1HA;EAYQ,yB3BN0B;E2BO1B,yBAAyB;EACzB,WhBqDQ;AV2xHhB;;A0B91HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AViyHhB;;A0Bp2HA;EAwBU,yBAAyB;EACzB,8C3BnBwB;E2BoBxB,WhByCM;AVuyHhB;;A0B12HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AV6yHhB;;A0Bh3HA;EAYQ,yB3BR0B;E2BS1B,yBAAyB;EACzB,WhBqDQ;AVmzHhB;;A0Bt3HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVyzHhB;;A0B53HA;EAwBU,yBAAyB;EACzB,8C3BrBwB;E2BsBxB,WhByCM;AV+zHhB;;A0Bl4HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq0HhB;;A0Bx4HA;EAYQ,yB3BT0B;E2BU1B,yBAAyB;EACzB,yBhBmDa;AV60HrB;;A0B94HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,yBhB6CW;AVm1HrB;;A0Bp5HA;EAwBU,yBAAyB;EACzB,+C3BtBwB;E2BuBxB,yBhBuCW;AVy1HrB;;A0B15HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,yBhBiCW;AV+1HrB;;A0Bh6HA;EAYQ,yB3BHyB;E2BIzB,yBAAyB;EACzB,WhBqDQ;AVm2HhB;;A0Bt6HA;EAkBU,yBhB2EuB;EgB1EvB,yBAAyB;EACzB,WhB+CM;AVy2HhB;;A0B56HA;EAwBU,yBAAyB;EACzB,8C3BhBuB;E2BiBvB,WhByCM;AV+2HhB;;A0Bl7HA;EA8BU,yBhB+DuB;EgB9DvB,yBAAyB;EACzB,WhBmCM;AVq3HhB;;A0Bx7HA;EAmCI,kB3BZY;ACq6HhB;;A0B57HA;EAqCI,e3BfS;AC06Hb;;A0Bh8HA;EAuCI,kB3BlBY;AC+6HhB;;A0Bp8HA;EA0CQ,eAAe;A1B85HvB;;A0Bx8HA;EA4CI,iB3BxBW;ACw7Hf;;A0B58HA;EA+CQ,eAAe;A1Bi6HvB;;A0Bh9HA;EAmDM,6BAA6B;EAC7B,0BAA0B;A1Bi6HhC;;A0Br9HA;EAsDM,4BAA4B;EAC5B,yBAAyB;A1Bm6H/B;;A0B19HA;EA0DQ,kB3BHI;ACu6HZ;;A0B99HA;EA4DQ,aAAa;A1Bs6HrB;;A0Bl+HA;EA+DM,sBAAsB;A1Bu6H5B;;A0Bt+HA;EAiEM,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;A1By6HtB;;A0B5+HA;EAqEM,uBAAuB;A1B26H7B;;A0Bh/HA;EAuEM,aAAa;EACb,YAAY;A1B66HlB;;A0Br/HA;EA0EQ,eAAe;A1B+6HvB;;A0Bz/HA;EA6EQ,eAAe;A1Bg7HvB;;A0B7/HA;EAgFQ,eAAe;A1Bi7HvB;;A0BjgIA;EAmFQ,eAAe;A1Bk7HvB;;A0BrgIA;EAsFQ,0BAA4C;A1Bm7HpD;;A0BzgIA;EAwFQ,0B3BjCI;E2BkCJ,uBAAuB;A1Bq7H/B;;A0B9gIA;EA2FI,uBAAuB;A1Bu7H3B;;A0BlhIA;EA8FM,WAAW;A1Bw7HjB;;A0BthIA;EAgGM,YAAY;EACZ,eAAe;A1B07HrB;;A0B3hIA;EAmGI,yBAAyB;A1B47H7B;;A0B/hIA;EAqGM,0BAA4C;A1B87HlD;;A0BniIA;EAuGM,0B3BhDM;E2BiDN,2BAA2B;EAC3B,SAAS;A1Bg8Hf;;A0B97HA;EACE,oBAAoB;EACpB,aAAa;EACb,eAAe;EACf,2BAA2B;EAC3B,gBAAgB;EAChB,kBAAkB;A1Bi8HpB;;A0Bv8HA;EASM,yBhBvB2B;EgBwB3B,c3B9HwB;ACgkI9B;;A0B58HA;EAYM,qBhB1B2B;AV89HjC;;A0Bh9HA;EAeM,yBhB7B2B;EgB8B3B,c3BpIwB;ACykI9B;;A0Br9HA;EAkBM,qBhBhC2B;AVu+HjC;;A0Br8HA;EACE,YAAY;EACZ,OAAO;EACP,UAAU;EACV,aAAa;EACb,kBAAkB;EAClB,MAAM;EACN,WAAW;A1Bw8Hb;;A0Bt8HA;;EAGE,qB3BhJ4B;E2BiJ5B,kB3BrFU;E2BsFV,cAAc;EACd,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;A1Bw8HrB;;A0Bt8HA;EACE,4B3BrJ4B;E2BsJ5B,c3B5J4B;ACqmI9B;;A0Bv8HA;EACE,qB3B5J4B;E2B6J5B,mBA9J4B;EA+J5B,2BA9JoC;EA+JpC,cAAc;EACd,eA/JwB;EAgKxB,gBAAgB;EAChB,mBAAmB;EACnB,uBAAuB;A1B08HzB;;A0Bx8HA;EACE,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,uBAAuB;EzBCrB,mByBAmC;EACrC,UAAU;A1B28HZ;;A0Bj9HA;EAQI,eAAe;A1B68HnB;;A2B7nIA;EACE,c5BF4B;E4BG5B,cAAc;EACd,e5B2BW;E4B1BX,gB5BiCe;AC+lIjB;;A2BpoIA;EAMI,oBAAoB;A3BkoIxB;;A2BxoIA;EASI,kB5BsBY;AC6mIhB;;A2B5oIA;EAWI,kB5BkBY;ACmnIhB;;A2BhpIA;EAaI,iB5BeW;ACwnIf;;A2BroIA;EACE,cAAc;EACd,kB5Bcc;E4Bbd,mBAAmB;A3BwoIrB;;A2B3oIA;EAOM,Y5BdyB;ACspI/B;;A2B/oIA;EAOM,c5B3BuB;ACuqI7B;;A2BnpIA;EAOM,iB5BhBwB;ACgqI9B;;A2BvpIA;EAOM,c5BvBwB;AC2qI9B;;A2B3pIA;EAOM,c5BT4B;ACiqIlC;;A2B/pIA;EAOM,c5BP4B;ACmqIlC;;A2BnqIA;EAOM,c5BR4B;ACwqIlC;;A2BvqIA;EAOM,c5BV4B;AC8qIlC;;A2B3qIA;EAOM,c5BX4B;ACmrIlC;;A2B/qIA;EAOM,c5BL2B;ACirIjC;;A2BxqIA;EAEI,sBAAsB;A3B0qI1B;;A2B5qIA;EAKI,aAAa;EACb,2BAA2B;A3B2qI/B;;A2BjrIA;E1BmJI,kB0B1IwC;A3B4qI5C;;A2BrrIA;;;EAcU,gBAAgB;A3B6qI1B;;A2B3rIA;;;EAoBY,6BAA6B;EAC7B,0BAA0B;A3B6qItC;;A2BlsIA;;;EA8BY,4BAA4B;EAC5B,yBAAyB;A3B0qIrC;;A2BzsIA;;;;;EAyCY,UAAU;A3BwqItB;;A2BjtIA;;;;;;;;;EA8CY,UAAU;A3B+qItB;;A2B7tIA;;;;;;;;;EAgDc,UAAU;A3ByrIxB;;A2BzuIA;EAkDQ,YAAY;EACZ,cAAc;A3B2rItB;;A2B9uIA;EAqDM,uBAAuB;A3B6rI7B;;A2BlvIA;EAuDM,yBAAyB;A3B+rI/B;;A2BtvIA;EA0DQ,YAAY;EACZ,cAAc;A3BgsItB;;A2B3vIA;EA6DI,aAAa;EACb,2BAA2B;A3BksI/B;;A2BhwIA;EAgEM,cAAc;A3BosIpB;;A2BpwIA;EAkEQ,gBAAgB;E1BiFpB,qB0BhF2C;A3BssI/C;;A2BzwIA;EAqEQ,YAAY;EACZ,cAAc;A3BwsItB;;A2B9wIA;EAwEM,uBAAuB;A3B0sI7B;;A2BlxIA;EA0EM,yBAAyB;A3B4sI/B;;A2BtxIA;EA4EM,eAAe;A3B8sIrB;;A2B1xIA;EAgFU,sBAAsB;A3B8sIhC;;A2B9xIA;EAkFQ,uBAAuB;A3BgtI/B;;A2BlyIA;EAoFQ,gBAAgB;A3BktIxB;;AC7tIE;E0BzEF;IAuFM,aAAa;E3BotIjB;AACF;;A2BntIA;EAEI,kBAAkB;A3BqtItB;;AC3uIE;E0BoBF;IAII,qBAAqB;E3BwtIvB;AACF;;AC7uIE;E0BgBF;IAMI,aAAa;IACb,YAAY;IACZ,cAAc;I1BkDd,oB0BjDsC;IACtC,iBAAiB;E3B4tInB;E2BtuIF;IAYM,kB5BhGU;I4BiGV,oBAAoB;E3B6tIxB;E2B1uIF;IAeM,oBAAoB;E3B8tIxB;E2B7uIF;IAiBM,kB5BvGU;I4BwGV,oBAAoB;E3B+tIxB;E2BjvIF;IAoBM,iB5B3GS;I4B4GT,oBAAoB;E3BguIxB;AACF;;A2B/tIA;EAEI,gBAAgB;A3BiuIpB;;AC1wIE;E0BuCF;IAII,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;E3BouIhB;E2B3uIF;IASM,gBAAgB;E3BquIpB;E2B9uIF;IAWM,cAAc;E3BsuIlB;E2BjvIF;IAaQ,YAAY;E3BuuIlB;E2BpvIF;I1BmCI,qB0BpB2C;E3BwuI7C;AACF;;A2BvuIA;EACE,sBAAsB;EACtB,WAAW;EACX,e5BhIW;E4BiIX,kBAAkB;EAClB,mBAAmB;A3B0uIrB;;A2B/uIA;;;EAaU,c5BxKoB;ACg5I9B;;A2BrvIA;;;EAeQ,kB5B3IQ;ACu3IhB;;A2B3vIA;;;EAiBQ,kB5B/IQ;AC+3IhB;;A2BjwIA;;;EAmBQ,iB5BlJO;ACs4If;;A2BvwIA;EAqBM,c5B7KwB;E4B8KxB,a7BjLgB;E6BkLhB,oBAAoB;EACpB,kBAAkB;EAClB,MAAM;EACN,Y7BrLgB;E6BsLhB,UAAU;A3BsvIhB;;A2BjxIA;;EA+BM,mB7B1LgB;AEi7ItB;;A2BtxIA;EAiCM,OAAO;A3ByvIb;;A2B1xIA;;EAqCM,oB7BhMgB;AE07ItB;;A2B/xIA;EAuCM,QAAQ;A3B4vId;;A2BnyIA;EA2CM,6BAA6B;E1BjB/B,c0BkB+B;EAC7B,YAAY;EACZ,UAAU;A3B4vIhB;;A2B1yIA;EAgDM,kB5B5KU;AC06IhB;;A2B9yIA;EAkDM,kB5BhLU;ACg7IhB;;A2BlzIA;EAoDM,iB5BnLS;ACq7If;;A4Bx9IA,qBAAA;ACWA;EAGE,e9BuBW;E8BtBX,mBAAmB;A7B+8IrB;;A6Bn9IA;EAMI,mBAAmB;EACnB,c9BI8B;E8BH9B,aAAa;EACb,uBAAuB;EACvB,iBAduC;A7B+9I3C;;A6B39IA;EAYM,c9BjBwB;ACo+I9B;;A6B/9IA;EAcI,mBAAmB;EACnB,aAAa;A7Bq9IjB;;A6Bp+IA;E5ByKI,e4BxJoC;A7Bu9IxC;;A6Bx+IA;EAoBQ,c9BzBsB;E8B0BtB,eAAe;EACf,oBAAoB;A7Bw9I5B;;A6B9+IA;EAwBM,c9B1BwB;E8B2BxB,iBAAiB;A7B09IvB;;A6Bn/IA;;EA4BI,uBAAuB;EACvB,aAAa;EACb,eAAe;EACf,2BAA2B;A7B49I/B;;A6B3/IA;E5ByKI,mB4BvIuC;A7B69I3C;;A6B//IA;E5ByKI,kB4BrIuC;A7B+9I3C;;A6BngJA;;EAyCM,uBAAuB;A7B+9I7B;;A6BxgJA;;EA6CM,yBAAyB;A7Bg+I/B;;A6B7gJA;EAgDI,kB9BrBY;ACs/IhB;;A6BjhJA;EAkDI,kB9BzBY;AC4/IhB;;A6BrhJA;EAoDI,iB9B5BW;ACigJf;;A6BzhJA;EAwDM,iBAAiB;A7Bq+IvB;;A6B7hJA;EA2DM,iBAAiB;A7Bs+IvB;;A6BjiJA;EA8DM,iBAAiB;A7Bu+IvB;;A6BriJA;EAiEM,iBAAiB;A7Bw+IvB;;A8B9hJA;EACE,uB/BR6B;E+BS7B,sBAnBmB;EAoBnB,0F/BvB2B;E+BwB3B,c/BnB4B;E+BoB5B,e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nwJA;EACE,mBAAmB;EACnB,yBAAyB;AhCswJ3B;;ACvuJE;E+BjCF;IAKI,aAAa;EhCwwJf;AACF;;AiC50JA;EACE,uBAAuB;EACvB,aAAa;EACb,mBAAmB;AjC+0JrB;;AiCl1JA;EAKI,sBAV2B;AjC21J/B;;AiCt1JA;EAOI,8ClCR0B;EkCS1B,aAAa;EACb,oBAb2B;AjCg2J/B;;AiC51JA;;EAYM,qBAfgC;AjCo2JtC;;AiCj2JA;EAcM,mBAhBwB;AjCu2J9B;;AiCr2JA;EAgBQ,kBAlBsB;AjC22J9B;;AiCz2JA;EAkBI,8ClCnB0B;EkCoB1B,gBA1BgB;EA2BhB,iBA3BgB;AjCs3JpB;;AiC/2JA;EAwBM,kBA9BsB;EA+BtB,mBA/BsB;AjC03J5B;;AiCz1JA;;EAEE,gBAAgB;EAChB,YAAY;EACZ,cAAc;AjC41JhB;;AiC11JA;EhCwII,kBgChLgB;AjCs4JpB;;AiC31JA;EhCqII,iBgChLgB;AjC04JpB;;AiC51JA;EACE,gBAAgB;EAChB,YAAY;EACZ,cAAc;EACd,mBAAmB;AjC+1JrB;;AC/yJE;EgCpDF;IAQI,gBAAgB;EjCg2JlB;AACF;;AkCv4JA;EACE,enCgBW;AC03Jb;;AkC34JA;EAII,kBnCcY;AC63JhB;;AkC/4JA;EAMI,kBnCUY;ACm4JhB;;AkCn5JA;EAQI,iBnCOW;ACw4Jf;;AkC74JA;EACE,iBArB0B;AlCq6J5B;;AkCj5JA;EAGI,kBnCoCc;EmCnCd,cnC3B0B;EmC4B1B,cAAc;EACd,qBAzBiC;AlC26JrC;;AkCx5JA;EAQM,4BnCzBwB;EmC0BxB,cnCjCwB;ACq7J9B;;AkC75JA;EAYM,yBnCpB4B;EmCqB5B,WxBuCU;AV82JhB;;AkCl6JA;EjCsJI,8BF1K0B;EmCqCxB,cAnC0B;EjCwK5B,oBiCvKkC;AlCy7JtC;;AkCp5JA;EACE,cnC3C4B;EmC4C5B,iBApC2B;EAqC3B,qBApC+B;EAqC/B,yBAAyB;AlCu5J3B;;AkC35JA;EAMI,eAtCoB;AlC+7JxB;;AkC/5JA;EAQI,kBAxCoB;AlCm8JxB;;AmC97JA;EAEE,4BpCZ4B;EoCa5B,kBpC4CU;EoC3CV,epCUW;ACs7Jb;;AmCp8JA;EAMI,mBAAmB;AnCk8JvB;;AmCx8JA;EAQI,mBAAmB;EACnB,0BAA0B;AnCo8J9B;;AmC78JA;EAYI,kBpCGY;ACk8JhB;;AmCj9JA;EAcI,kBpCDY;ACw8JhB;;AmCr9JA;EAgBI,iBpCJW;AC68Jf;;AmCz9JA;EAsCM,uBAH+C;AnC07JrD;;AmC79JA;EAwCQ,uBpChDuB;EoCiDvB,cpC9DqB;ACu/J7B;;AmCl+JA;EA2CQ,mBpCnDuB;AC8+J/B;;AmCt+JA;EAsCM,yBAH+C;AnCu8JrD;;AmC1+JA;EAwCQ,yBpC7DqB;EoC8DrB,YpCjDuB;ACu/J/B;;AmC/+JA;EA2CQ,qBpChEqB;ACwgK7B;;AmCn/JA;EAsCM,yBAH+C;AnCo9JrD;;AmCv/JA;EAwCQ,4BpClDsB;EoCmDtB,yBzBgBa;AVm8JrB;;AmC5/JA;EA2CQ,wBpCrDsB;AC0gK9B;;AmChgKA;EAsCM,yBAH+C;AnCi+JrD;;AmCpgKA;EAwCQ,yBpCzDsB;EoC0DtB,WzBkBQ;AV88JhB;;AmCzgKA;EA2CQ,qBpC5DsB;AC8hK9B;;AmC7gKA;EAsCM,yBzB4B0C;AV+8JhD;;AmCjhKA;EAwCQ,yBpC3C0B;EoC4C1B,WzBkBQ;AV29JhB;;AmCthKA;EA2CQ,qBpC9C0B;EoC+C1B,czB8B6D;AVi9JrE;;AmC3hKA;EAsCM,yBzB4B0C;AV69JhD;;AmC/hKA;EAwCQ,yBpCzC0B;EoC0C1B,WzBkBQ;AVy+JhB;;AmCpiKA;EA2CQ,qBpC5C0B;EoC6C1B,czB8B6D;AV+9JrE;;AmCziKA;EAsCM,yBzB4B0C;AV2+JhD;;AmC7iKA;EAwCQ,yBpC1C0B;EoC2C1B,WzBkBQ;AVu/JhB;;AmCljKA;EA2CQ,qBpC7C0B;EoC8C1B,czB8B6D;AV6+JrE;;AmCvjKA;EAsCM,yBzB4B0C;AVy/JhD;;AmC3jKA;EAwCQ,yBpC5C0B;EoC6C1B,WzBkBQ;AVqgKhB;;AmChkKA;EA2CQ,qBpC/C0B;EoCgD1B,czB8B6D;AV2/JrE;;AmCrkKA;EAsCM,yBzB4B0C;AVugKhD;;AmCzkKA;EAwCQ,yBpC7C0B;EoC8C1B,yBzBgBa;AVqhKrB;;AmC9kKA;EA2CQ,qBpChD0B;EoCiD1B,czB8B6D;AVygKrE;;AmCnlKA;EAsCM,yBzB4B0C;AVqhKhD;;AmCvlKA;EAwCQ,yBpCvCyB;EoCwCzB,WzBkBQ;AViiKhB;;AmC5lKA;EA2CQ,qBpC1CyB;EoC2CzB,czB8B6D;AVuhKrE;;AmCnjKA;EACE,mBAAmB;EACnB,yBpChE4B;EoCiE5B,0BAAgE;EAChE,WzBSc;EyBRd,aAAa;EACb,gBpC/Be;EoCgCf,8BAA8B;EAC9B,iBAAiB;EACjB,mBAtEiC;EAuEjC,kBAAkB;AnCsjKpB;;AmChkKA;EAYI,YAAY;EACZ,cAAc;ElCkGd,mBkCjGsC;AnCwjK1C;;AmCtkKA;EAgBI,eAjEgC;EAkEhC,yBAAyB;EACzB,0BAA0B;AnC0jK9B;;AmCxjKA;EACE,qBpChF4B;EoCiF5B,kBpCrBU;EoCsBV,mBAAmB;EACnB,uBAjFmC;EAkFnC,cpCvF4B;EoCwF5B,qBAjFiC;AnC4oKnC;;AmCjkKA;;EASI,uBpCnF2B;ACgpK/B;;AmCtkKA;EAWI,6BAlFgD;AnCipKpD;;AoCjoKA;EAEE,mBAAmB;EACnB,aAAa;EACb,sBAAsB;EACtB,uBAAuB;EACvB,gBAAgB;EAChB,eAAe;EACf,WAxCU;ApC2qKZ;;AoC3oKA;EAWI,aAAa;ApCooKjB;;AoCloKA;EAEE,wCrC/C2B;ACmrK7B;;AoCloKA;;EAEE,cA9CgC;EA+ChC,+BAA0D;EAC1D,cAAc;EACd,kBAAkB;EAClB,WAAW;ApCqoKb;;ACpmKE;EmCvCF;;IASI,cAAc;IACd,8BAA0D;IAC1D,YAxDuB;EpCgsKzB;AACF;;AoCvoKA;EAEE,gBAAgB;EAChB,YAxD2B;EAyD3B,eAAe;EnCwHb,WmChLoB;EA0DtB,SAzDoB;EA0DpB,WA5D2B;ApCqsK7B;;AoCvoKA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAAgD;EAChD,gBAAgB;EAChB,uBAAuB;ApC0oKzB;;AoCxoKA;;EAEE,mBAAmB;EACnB,4BrCtE4B;EqCuE5B,aAAa;EACb,cAAc;EACd,2BAA2B;EAC3B,aApE4B;EAqE5B,kBAAkB;ApC2oKpB;;AoCzoKA;EACE,gCrCjF4B;EqCkF5B,2BrCrBgB;EqCsBhB,4BrCtBgB;ACkqKlB;;AoC1oKA;EACE,crC1F4B;EqC2F5B,YAAY;EACZ,cAAc;EACd,iBrChEa;EqCiEb,cA7E8B;ApC0tKhC;;AoC3oKA;EACE,8BrChCgB;EqCiChB,+BrCjCgB;EqCkChB,6BrC/F4B;AC6uK9B;;AoCjpKA;EnC8EI,mBmCxEuC;ApC+oK3C;;AoC7oKA;EnC3CE,iCAAiC;EmC6CjC,uBrCjG6B;EqCkG7B,YAAY;EACZ,cAAc;EACd,cAAc;EACd,aAtF4B;ApCsuK9B;;AqC1sKA;EACE,uBtC5C6B;EsC6C7B,mBAvDqB;EAwDrB,kBAAkB;EAClB,WAtDW;ArCmwKb;;AqCjtKA;EASM,uBtCpDyB;EsCqDzB,ctClEuB;AC8wK7B;;AqCttKA;;EAcU,ctCtEmB;ACmxK7B;;AqC3tKA;;;;EAoBY,yB3B8BqB;E2B7BrB,ctC7EiB;AC2xK7B;;AqCnuKA;EAwBY,qBtChFiB;AC+xK7B;;AqCvuKA;EA0BQ,ctClFqB;ACmyK7B;;AC3sKE;EoChCF;;;;IAgCY,ctCxFiB;EC2yK3B;EqCnvKF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,ctC/Fe;ECwzK3B;EqChwKF;;IA0Cc,qBtClGe;EC4zK3B;EqCpwKF;;;IA8CU,yB3BIuB;I2BHvB,ctCvGmB;ECk0K3B;EqC1wKF;IAmDc,uBtC9FiB;IsC+FjB,ctC5Ge;ECs0K3B;AACF;;AqC/wKA;EASM,yBtCjEuB;EsCkEvB,YtCrDyB;AC+zK/B;;AqCpxKA;;EAcU,YtCzDqB;ACo0K/B;;AqCzxKA;;;;EAoBY,uB3B8BqB;E2B7BrB,YtChEmB;AC40K/B;;AqCjyKA;EAwBY,mBtCnEmB;ACg1K/B;;AqCryKA;EA0BQ,YtCrEuB;ACo1K/B;;ACzwKE;EoChCF;;;;IAgCY,YtC3EmB;EC41K7B;EqCjzKF;;;;;;;;;;IAsCc,uB3BYmB;I2BXnB,YtClFiB;ECy2K7B;EqC9zKF;;IA0Cc,mBtCrFiB;EC62K7B;EqCl0KF;;;IA8CU,uB3BIuB;I2BHvB,YtC1FqB;ECm3K7B;EqCx0KF;IAmDc,yBtC3Ge;IsC4Gf,YtC/FiB;ECu3K7B;AACF;;AqC70KA;EASM,4BtCtDwB;EsCuDxB,yB3BYe;AV4zKrB;;AqCl1KA;;EAcU,yB3BQW;AVi0KrB;;AqCv1KA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AVy0KrB;;AqC/1KA;EAwBY,gC3BFS;AV60KrB;;AqCn2KA;EA0BQ,yB3BJa;AVi1KrB;;ACv0KE;EoChCF;;;;IAgCY,yB3BVS;EVy1KnB;EqC/2KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EVs2KnB;EqC53KF;;IA0Cc,gC3BpBO;EV02KnB;EqCh4KF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVg3KnB;EqCt4KF;IAmDc,4BtChGgB;IsCiGhB,yB3B9BO;EVo3KnB;AACF;;AqC34KA;EASM,yBtC7DwB;EsC8DxB,W3BcU;AVw3KhB;;AqCh5KA;;EAcU,W3BUM;AV63KhB;;AqCr5KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVq4KhB;;AqC75KA;EAwBY,kB3BAI;AVy4KhB;;AqCj6KA;EA0BQ,W3BFQ;AV64KhB;;ACr4KE;EoChCF;;;;IAgCY,W3BRI;EVq5Kd;EqC76KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVk6Kd;EqC17KF;;IA0Cc,kB3BlBE;EVs6Kd;EqC97KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV46Kd;EqCp8KF;IAmDc,yBtCvGgB;IsCwGhB,W3B5BE;EVg7Kd;AACF;;AqCz8KA;EASM,yBtC/C4B;EsCgD5B,W3BcU;AVs7KhB;;AqC98KA;;EAcU,W3BUM;AV27KhB;;AqCn9KA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVm8KhB;;AqC39KA;EAwBY,kB3BAI;AVu8KhB;;AqC/9KA;EA0BQ,W3BFQ;AV28KhB;;ACn8KE;EoChCF;;;;IAgCY,W3BRI;EVm9Kd;EqC3+KF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVg+Kd;EqCx/KF;;IA0Cc,kB3BlBE;EVo+Kd;EqC5/KF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EV0+Kd;EqClgLF;IAmDc,yBtCzFoB;IsC0FpB,W3B5BE;EV8+Kd;AACF;;AqCvgLA;EASM,yBtC7C4B;EsC8C5B,W3BcU;AVo/KhB;;AqC5gLA;;EAcU,W3BUM;AVy/KhB;;AqCjhLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVigLhB;;AqCzhLA;EAwBY,kB3BAI;AVqgLhB;;AqC7hLA;EA0BQ,W3BFQ;AVygLhB;;ACjgLE;EoChCF;;;;IAgCY,W3BRI;EVihLd;EqCziLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV8hLd;EqCtjLF;;IA0Cc,kB3BlBE;EVkiLd;EqC1jLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVwiLd;EqChkLF;IAmDc,yBtCvFoB;IsCwFpB,W3B5BE;EV4iLd;AACF;;AqCrkLA;EASM,yBtC9C4B;EsC+C5B,W3BcU;AVkjLhB;;AqC1kLA;;EAcU,W3BUM;AVujLhB;;AqC/kLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV+jLhB;;AqCvlLA;EAwBY,kB3BAI;AVmkLhB;;AqC3lLA;EA0BQ,W3BFQ;AVukLhB;;AC/jLE;EoChCF;;;;IAgCY,W3BRI;EV+kLd;EqCvmLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV4lLd;EqCpnLF;;IA0Cc,kB3BlBE;EVgmLd;EqCxnLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVsmLd;EqC9nLF;IAmDc,yBtCxFoB;IsCyFpB,W3B5BE;EV0mLd;AACF;;AqCnoLA;EASM,yBtChD4B;EsCiD5B,W3BcU;AVgnLhB;;AqCxoLA;;EAcU,W3BUM;AVqnLhB;;AqC7oLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AV6nLhB;;AqCrpLA;EAwBY,kB3BAI;AVioLhB;;AqCzpLA;EA0BQ,W3BFQ;AVqoLhB;;AC7nLE;EoChCF;;;;IAgCY,W3BRI;EV6oLd;EqCrqLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EV0pLd;EqClrLF;;IA0Cc,kB3BlBE;EV8pLd;EqCtrLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVoqLd;EqC5rLF;IAmDc,yBtC1FoB;IsC2FpB,W3B5BE;EVwqLd;AACF;;AqCjsLA;EASM,yBtCjD4B;EsCkD5B,yB3BYe;AVgrLrB;;AqCtsLA;;EAcU,yB3BQW;AVqrLrB;;AqC3sLA;;;;EAoBY,yB3B8BqB;E2B7BrB,yB3BCS;AV6rLrB;;AqCntLA;EAwBY,gC3BFS;AVisLrB;;AqCvtLA;EA0BQ,yB3BJa;AVqsLrB;;AC3rLE;EoChCF;;;;IAgCY,yB3BVS;EV6sLnB;EqCnuLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,yB3BjBO;EV0tLnB;EqChvLF;;IA0Cc,gC3BpBO;EV8tLnB;EqCpvLF;;;IA8CU,yB3BIuB;I2BHvB,yB3BzBW;EVouLnB;EqC1vLF;IAmDc,yBtC3FoB;IsC4FpB,yB3B9BO;EVwuLnB;AACF;;AqC/vLA;EASM,yBtC3C2B;EsC4C3B,W3BcU;AV4uLhB;;AqCpwLA;;EAcU,W3BUM;AVivLhB;;AqCzwLA;;;;EAoBY,yB3B8BqB;E2B7BrB,W3BGI;AVyvLhB;;AqCjxLA;EAwBY,kB3BAI;AV6vLhB;;AqCrxLA;EA0BQ,W3BFQ;AViwLhB;;ACzvLE;EoChCF;;;;IAgCY,W3BRI;EVywLd;EqCjyLF;;;;;;;;;;IAsCc,yB3BYmB;I2BXnB,W3BfE;EVsxLd;EqC9yLF;;IA0Cc,kB3BlBE;EV0xLd;EqClzLF;;;IA8CU,yB3BIuB;I2BHvB,W3BvBM;EVgyLd;EqCxzLF;IAmDc,yBtCrFmB;IsCsFnB,W3B5BE;EVoyLd;AACF;;AqC7zLA;EAsDI,oBAAoB;EACpB,aAAa;EACb,mBA7GmB;EA8GnB,WAAW;ArC2wLf;;AqCp0LA;EA2DI,gCtCxG0B;ACq3L9B;;AqCx0LA;EALE,OAAO;EACP,eAAe;EACf,QAAQ;EACR,WA/CiB;ArCg4LnB;;AqC/0LA;EAgEI,SAAS;ArCmxLb;;AqCn1LA;EAkEM,iCtC/GwB;ACo4L9B;;AqCv1LA;EAoEI,MAAM;ArCuxLV;;AqCrxLA;;EAGI,oBA9HmB;ArCq5LvB;;AqC1xLA;;EAKI,uBAhImB;ArC05LvB;;AqCxxLA;;EAEE,oBAAoB;EACpB,aAAa;EACb,cAAc;EACd,mBAvIqB;ArCk6LvB;;AqCzxLA;EAIM,6BAA6B;ArCyxLnC;;AqCvxLA;EpCjFE,iCAAiC;EoCmFjC,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;ArC0xLpB;;AqCxxLA;EAEE,ctCrJ4B;EEoB5B,qBAAqB;EACrB,wBAAwB;EACxB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,eAAe;EACf,cAAc;EACd,eoC7BqB;EpC8BrB,kBAAkB;EAClB,coC/BqB;EpC+KnB,iBoCtBkC;ArCmyLtC;;AC55LE;EACE,8BAA8B;EAC9B,cAAc;EACd,WAAW;EACX,qBAAqB;EACrB,kBAAkB;EAClB,wBAAwB;EACxB,yBF6BQ;EE5BR,yDAAyD;EACzD,oCFsBa;EErBb,WAAW;AD+5Lf;;AC95LI;EACE,oBAAoB;ADi6L1B;;ACh6LI;EACE,oBAAoB;ADm6L1B;;ACl6LI;EACE,oBAAoB;ADq6L1B;;ACp6LE;EACE,qCAAiC;ADu6LrC;;ACn6LM;EACE,wCAAwC;ADs6LhD;;ACr6LM;EACE,UAAU;ADw6LlB;;ACv6LM;EACE,0CAA0C;AD06LlD;;AqC10LA;EACE,aAAa;ArC60Lf;;AqC30LA;;EAEE,ctC9J4B;EsC+J5B,cAAc;EACd,gBAAgB;EAChB,uBAAuB;EACvB,kBAAkB;ArC80LpB;;AqCp1LA;;EASM,qBAAqB;EACrB,sBAAsB;ArCg1L5B;;AqC90LA;;EAEE,eAAe;ArCi1LjB;;AqCn1LA;;;;;EAOI,yBtCxK0B;EsCyK1B,ctCjK8B;ACq/LlC;;AqCl1LA;EACE,YAAY;EACZ,cAAc;ArCq1LhB;;AqCv1LA;EAII,mBA7KgC;ArCogMpC;;AqC31LA;EAMI,UAAU;ArCy1Ld;;AqC/1LA;EAQI,YAAY;EACZ,cAAc;ArC21LlB;;AqCp2LA;EAWI,oCAAoC;EACpC,mBAhMmB;EAiMnB,kCAAkC;ArC61LtC;;AqC12LA;EAgBM,6BArLyC;EAsLzC,4BtCpL4B;ACkhMlC;;AqC/2LA;EAmBM,6BArL0C;EAsL1C,4BtCvL4B;EsCwL5B,0BArLuC;EAsLvC,wBArLqC;EAsLrC,ctC1L4B;EsC2L5B,kCAAwE;ArCg2L9E;;AqC91LA;EACE,YAAY;EACZ,cAAc;ArCi2LhB;;AqC/1LA;EpCnCI,oBoCoCoC;ArCk2LxC;;AqCn2LA;EAII,qBtCrM8B;EsCsM9B,oBAAoB;EpChCpB,coCiC6B;ArCm2LjC;;AqCj2LA;EACE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;ArCo2LrB;;AqCv2LA;EAKI,oBAAoB;EACpB,qBAAqB;ArCs2LzB;;AqCp2LA;EACE,4BtC3N4B;EsC4N5B,YAAY;EACZ,aAAa;EACb,WA/LyB;EAgMzB,gBAAgB;ArCu2LlB;;ACr/LE;EoCpCF;IAsLI,cAAc;ErCw2LhB;EqCv2LA;;IAGI,mBAAmB;IACnB,aAAa;ErCw2LjB;EqCv2LA;IAEI,aAAa;ErCw2LjB;EqCh8LF;IA0FI,uBtC3O2B;IsC4O3B,4CtCzPyB;IsC0PzB,iBAAiB;ErCy2LnB;EqC52LA;IAKI,cAAc;ErC02LlB;EqCx2LA;IA3MA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErCqmMjB;EqC92LA;IAKI,SAAS;ErC42Lb;EqCj3LA;IAOM,4CtCrQqB;ECknM3B;EqCp3LA;IASI,MAAM;ErC82LV;EqCv3LA;IpC7LA,iCAAiC;IoC2M3B,iCAA2C;IAC3C,cAAc;ErC62LpB;EqC52LA;;IAGI,oBA9QiB;ErC2nMrB;EqCh3LA;;IAKI,uBAhRiB;ErC+nMrB;AACF;;AC3iME;EoC8LA;;;;IAIE,oBAAoB;IACpB,aAAa;ErCi3Lf;EqCplMF;IAqOI,mBA1RmB;ErC4oMrB;EqCn3LA;IAGI,kBA1R0B;ErC6oM9B;EqCt3LA;;IAMM,mBAAmB;ErCo3LzB;EqC13LA;;IASM,kBtCjOI;ECslMV;EqC93LA;;;;IAgBQ,wCAAwC;ErCo3LhD;EqCp4LA;IAuBU,wCAAwC;ErCg3LlD;EqCv4LA;IA4BU,4BtC7SkB;IsC8SlB,ctCzTiB;ECuqM3B;EqC34LA;IA+BU,4BtChTkB;IsCiTlB,ctCxSsB;ECupMhC;EqCnhMF;IAsKI,aAAa;ErCg3Lf;EqC7gMF;;IAgKI,mBAAmB;IACnB,aAAa;ErCi3Lf;EqC5/LF;IA8IM,oBAAoB;ErCi3LxB;EqCn3LA;IAKM,oDAAoD;ErCi3L1D;EqCt3LA;IAOM,gCtClUsB;IsCmUtB,0BAAkE;IAClE,gBAAgB;IAChB,YAAY;IACZ,4CtC9UqB;IsC+UrB,SAAS;ErCk3Lf;EqC93LA;IAkBM,cAAc;ErC+2LpB;EqC92LM;IAEE,UAAU;IACV,oBAAoB;IACpB,wBAAwB;ErC+2LhC;EqC3iMF;IA8LI,YAAY;IACZ,cAAc;ErCg3LhB;EqC/2LA;IACE,2BAA2B;IpC7K3B,kBoC8KoC;ErCi3LtC;EqCh3LA;IACE,yBAAyB;IpChLzB,iBoCiLoC;ErCk3LtC;EqCx/LF;IAwII,uBtCxV2B;IsCyV3B,8BtCjSc;IsCkSd,+BtClSc;IsCmSd,6BtChW0B;IsCiW1B,2CtCzWyB;IsC0WzB,aAAa;IACb,mBAAmB;IpCjLnB,OoCkLuB;IACvB,eAAe;IACf,kBAAkB;IAClB,SAAS;IACT,WAjVkB;ErCosMpB;EqCtgMF;IAqJM,sBAAsB;IACtB,mBAAmB;ErCo3LvB;EqCn4LA;IpClLE,mBoCmMuC;ErCq3LzC;EqCt4LA;IAoBM,4BtC7WsB;IsC8WtB,ctCzXqB;EC8uM3B;EqC14LA;IAuBM,4BtChXsB;IsCiXtB,ctCxW0B;EC8tMhC;EqCr3LE;IAEE,kBtC1TY;IsC2TZ,gBAAgB;IAChB,4EtCjYuB;IsCkYvB,cAAc;IACd,UAAU;IACV,oBAAoB;IACpB,wBAA8C;IAC9C,2BAA2B;IAC3B,yBtChUM;IsCiUN,uCAAuC;ErCs3L3C;EqC15LA;IAsCI,UAAU;IACV,QAAQ;ErCu3LZ;EqC7hMF;IAwKI,cAAc;ErCw3LhB;EqCv3LA;;IpC5NE,qBoC+NyC;ErCw3L3C;EqC33LA;;IpC5NE,sBoCiOyC;ErC03L3C;EqCx3LA;IAlWA,OAAO;IACP,eAAe;IACf,QAAQ;IACR,WA/CiB;ErC4wMjB;EqC93LA;IAKI,SAAS;ErC43Lb;EqCj4LA;IAOM,4CtC5ZqB;ECyxM3B;EqCp4LA;IASI,MAAM;ErC83LV;EqC73LA;;IAGI,oBA/ZiB;ErC6xMrB;EqCj4LA;;IAKI,uBAjaiB;ErCiyMrB;EqCr4LA;;IAOI,oBAA4D;ErCk4LhE;EqCz4LA;;IASI,uBAA+D;ErCo4LnE;EqCl4LA;;IAGI,ctC7auB;ECgzM3B;EqCt4LA;;IAKI,6BAla2C;ErCuyM/C;EqCp4LA;IAKM,yBtCzasB;EC2yM5B;AACF;;AqC/3LA;EAEI,iCAA2C;ArCi4L/C;;AsCzxMA;EAEE,evCFW;EuCGX,gBAnC0B;AtC8zM5B;;AsC9xMA;EAMI,kBvCLY;ACiyMhB;;AsClyMA;EAQI,kBvCTY;ACuyMhB;;AsCtyMA;EAUI,iBvCZW;AC4yMf;;AsC1yMA;;EAcM,iBAAiB;EACjB,kBAAkB;EAClB,qBvCmBiB;AC8wMvB;;AsCjzMA;EAkBM,qBvCiBiB;ACkxMvB;;AsCjyMA;;EAEE,mBAAmB;EACnB,aAAa;EACb,uBAAuB;EACvB,kBAAkB;AtCoyMpB;;AsClyMA;;;;EAME,cA9D6B;EA+D7B,uBAAuB;EACvB,eA/D8B;EAgE9B,mBA/DkC;EAgElC,oBA/DmC;EAgEnC,kBAAkB;AtCmyMpB;;AsCjyMA;;;EAGE,qBvCtE4B;EuCuE5B,cvC3E4B;EuC4E5B,gBxC3EoB;AE+2MtB;;AsCzyMA;;;EAOI,qBvC3E0B;EuC4E1B,cvC/E0B;ACu3M9B;;AsChzMA;;;EAUI,qBvCjE8B;AC62MlC;;AsCtzMA;;;EAYI,iDvCvFyB;ACu4M7B;;AsC5zMA;;;;;EAeI,yBvClF0B;EuCmF1B,qBvCnF0B;EuCoF1B,gBAAgB;EAChB,cvCvF0B;EuCwF1B,YAAY;AtCqzMhB;;AsCnzMA;;EAEE,oBAvFkC;EAwFlC,qBAvFmC;EAwFnC,mBAAmB;AtCszMrB;;AsCpzMA;EAEI,yBvCpF8B;EuCqF9B,qBvCrF8B;EuCsF9B,W5B1BY;AVg1MhB;;AsCpzMA;EACE,cvCtG4B;EuCuG5B,oBAAoB;AtCuzMtB;;AsCrzMA;EACE,eAAe;AtCwzMjB;;AsCzzMA;EAGI,gBAAgB;AtC0zMpB;;ACz0ME;EqCjEF;IAoFI,eAAe;EtC2zMjB;EsCl1MF;;IA0BI,YAAY;IACZ,cAAc;EtC4zMhB;EsCv0MF;IAcM,YAAY;IACZ,cAAc;EtC4zMlB;AACF;;ACp1ME;EqCQF;IAmBI,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,QAAQ;EtC8zMV;EsCt4MF;;;;IA6EI,gBAAgB;IAChB,aAAa;EtC+zMf;EsC9zMA;IACE,QAAQ;EtCg0MV;EsC/zMA;IACE,QAAQ;EtCi0MV;EsC96MF;IA+GI,8BAA8B;IAC9B,gBAAgB;IAChB,aAAa;EtCk0Mf;EsCr0MA;IAMM,QAAQ;EtCk0Md;EsCx0MA;IAQM,uBAAuB;IACvB,QAAQ;EtCm0Md;EsC50MA;IAWM,QAAQ;EtCo0Md;EsC/0MA;IAcM,QAAQ;EtCo0Md;EsCl1MA;IAgBM,QAAQ;EtCq0Md;EsCr1MA;IAkBM,yBAAyB;IACzB,QAAQ;EtCs0Md;AACF;;AuC78MA;EACE,kBxCsCgB;EwCrChB,0FxChC2B;EwCiC3B,exCEW;AC88Mb;;AuCn9MA;EAKI,qBxCWkB;ACu8MtB;;AuCv9MA;EAYQ,uBxC7BuB;EwC8BvB,cxC3CqB;AC0/M7B;;AuC59MA;EAeQ,0BxChCuB;ACi/M/B;;AuCh+MA;EAiBQ,YxClCuB;ACq/M/B;;AuCp+MA;EAYQ,yBxC1CqB;EwC2CrB,YxC9BuB;AC0/M/B;;AuCz+MA;EAeQ,4BxC7CqB;AC2gN7B;;AuC7+MA;EAiBQ,cxC/CqB;AC+gN7B;;AuCj/MA;EAYQ,4BxC/BsB;EwCgCtB,yB7BmCa;AVs8MrB;;AuCt/MA;EAeQ,+BxClCsB;AC6gN9B;;AuC1/MA;EAiBQ,iBxCpCsB;ACihN9B;;AuC9/MA;EAYQ,yBxCtCsB;EwCuCtB,W7BqCQ;AVi9MhB;;AuCngNA;EAeQ,4BxCzCsB;ACiiN9B;;AuCvgNA;EAiBQ,cxC3CsB;ACqiN9B;;AuC3gNA;EAYQ,yBxCxB0B;EwCyB1B,W7BqCQ;AV89MhB;;AuChhNA;EAeQ,4BxC3B0B;ACgiNlC;;AuCphNA;EAiBQ,cxC7B0B;ACoiNlC;;AuCxhNA;EAYQ,yBxCtB0B;EwCuB1B,W7BqCQ;AV2+MhB;;AuC7hNA;EAeQ,4BxCzB0B;AC2iNlC;;AuCjiNA;EAiBQ,cxC3B0B;AC+iNlC;;AuCriNA;EAYQ,yBxCvB0B;EwCwB1B,W7BqCQ;AVw/MhB;;AuC1iNA;EAeQ,4BxC1B0B;ACyjNlC;;AuC9iNA;EAiBQ,cxC5B0B;AC6jNlC;;AuCljNA;EAYQ,yBxCzB0B;EwC0B1B,W7BqCQ;AVqgNhB;;AuCvjNA;EAeQ,4BxC5B0B;ACwkNlC;;AuC3jNA;EAiBQ,cxC9B0B;AC4kNlC;;AuC/jNA;EAYQ,yBxC1B0B;EwC2B1B,yB7BmCa;AVohNrB;;AuCpkNA;EAeQ,4BxC7B0B;ACslNlC;;AuCxkNA;EAiBQ,cxC/B0B;AC0lNlC;;AuC5kNA;EAYQ,yBxCpByB;EwCqBzB,W7BqCQ;AV+hNhB;;AuCjlNA;EAeQ,4BxCvByB;AC6lNjC;;AuCrlNA;EAiBQ,cxCzByB;ACimNjC;;AuCtkNA;;EAGI,gCxC3C2B;ACmnN/B;;AuCtkNA;EACE,yBxC9C6B;EwC+C7B,0BAA8C;EAC9C,cxCrD4B;EwCsD5B,iBAhDyB;EAiDzB,gBxCjBe;EwCkBf,iBArD8B;EAsD9B,mBArDgC;AvC8nNlC;;AuCvkNA;EACE,qBAAqB;EACrB,aAAa;EACb,kBArD4B;EAsD5B,uBAAuB;AvC0kNzB;;AuC9kNA;EAMI,gCxC7D0B;EwC8D1B,mBAAmB;EACnB,cAAc;AvC4kNlB;;AuCplNA;EAWM,4BxCrEwB;EwCsExB,cxCvEwB;ACopN9B;;AuC3kNA;EAEI,cxC1E0B;ACupN9B;;AuC/kNA;EAIM,cxC7D4B;AC4oNlC;;AuC7kNA;EACE,mBAAmB;EACnB,cxCjF4B;EwCkF5B,aAAa;EACb,2BAA2B;EAC3B,qBAAqB;AvCglNvB;;AuCrlNA;EtC+FI,oBsCxFsC;AvCklN1C;;AuCzlNA;EASI,YAAY;EACZ,cAAc;EACd,WAAW;AvColNf;;AuC/lNA;EAaI,eAAe;AvCslNnB;;AuCnmNA;EAeI,0BxC9E8B;EwC+E9B,cxC/F0B;ACurN9B;;AuCxmNA;EAkBM,cxCjF4B;AC2qNlC;;AuC5mNA;EAoBI,8BxClCc;EwCmCd,+BxCnCc;AC+nNlB;;AuC1lNA;;EAEE,eAAe;AvC6lNjB;;AuC/lNA;;EAII,4BxCnG0B;ACmsN9B;;AuC9lNA;EtChGE,qBAAqB;EACrB,esCgGgB;EtC/FhB,WsC+FqB;EtC9FrB,gBsC8FqB;EtC7FrB,kBAAkB;EAClB,mBAAmB;EACnB,UsC2FqB;EACrB,cxC5G4B;EE4K1B,oBsC/DoC;AvCumNxC;;AuC1mNA;EAKI,kBAAkB;EAClB,oBAAoB;AvCymNxB;;AwCnsNA;EvCqCE,iCAAiC;EuCjCjC,oBAAoB;EACpB,aAAa;EACb,ezCCW;EyCAX,8BAA8B;EAC9B,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AxCosNrB;;AwC9sNA;EAYI,mBAAmB;EACnB,4BzCjC0B;EyCkC1B,0BAzC4B;EA0C5B,wBAzC0B;EA0C1B,czCvC0B;EyCwC1B,aAAa;EACb,uBAAuB;EACvB,mBAA6C;EAC7C,kBAxCyB;EAyCzB,mBAAmB;AxCssNvB;;AwC3tNA;EAuBM,4BzC/CwB;EyCgDxB,czChDwB;ACwvN9B;;AwChuNA;EA0BI,cAAc;AxC0sNlB;;AwCpuNA;EA6BQ,4BzCrC0B;EyCsC1B,czCtC0B;ACivNlC;;AwCzuNA;EAgCI,mBAAmB;EACnB,4BzCrD0B;EyCsD1B,0BA7D4B;EA8D5B,wBA7D0B;EA8D1B,aAAa;EACb,YAAY;EACZ,cAAc;EACd,2BAA2B;AxC6sN/B;;AwCpvNA;EAyCM,qBAAqB;AxC+sN3B;;AwCxvNA;EA2CM,UAAU;EACV,uBAAuB;EACvB,oBAAoB;EACpB,qBAAqB;AxCitN3B;;AwC/vNA;EAgDM,yBAAyB;EACzB,oBAAoB;AxCmtN1B;;AwCpwNA;EvCsJI,mBuClGuC;AxCotN3C;;AwCxwNA;EvCsJI,kBuChGuC;AxCstN3C;;AwC5wNA;EA0DM,uBAAuB;AxCstN7B;;AwChxNA;EA6DM,yBAAyB;AxCutN/B;;AwCpxNA;EAiEM,6BAA6B;EAE3B,0BAAkE;AxCstN1E;;AwCzxNA;EAuEQ,4BzCxFsB;EyCyFtB,4BzC5FsB;ACkzN9B;;AwC9xNA;EA4EU,uBzC3FqB;EyC4FrB,qBzCjGoB;EyCkGpB,2CAA2E;AxCstNrF;;AwCpyNA;EAiFM,YAAY;EACZ,cAAc;AxCutNpB;;AwCzyNA;EAqFM,qBzCzGwB;EyC0GxB,mBA/F+B;EAgG/B,iBA/F6B;EAgG7B,gBAAgB;EAChB,kBAAkB;AxCwtNxB;;AwCjzNA;EA2FQ,4BzC5GsB;EyC6GtB,qBzCjHsB;EyCkHtB,UAAU;AxC0tNlB;;AwCvzNA;EvCsJI,iBuCtDuE;AxC2tN3E;;AwC3zNA;EAmGU,2BzC3DE;EyC4DF,8BzC5DE;ACwxNZ;;AwCh0NA;EA0GU,4BzClEE;EyCmEF,+BzCnEE;AC6xNZ;;AwCr0NA;EAiHU,yBzCzHwB;EyC0HxB,qBzC1HwB;EyC2HxB,W9B/DM;E8BgEN,UAAU;AxCwtNpB;;AwC50NA;EAsHM,mBAAmB;AxC0tNzB;;AwCh1NA;EA2HY,iCzCjFW;EyCkFX,8BzClFW;EyCmFX,oBAAoB;AxCytNhC;;AwCt1NA;EAoIY,kCzC1FW;EyC2FX,+BzC3FW;EyC4FX,qBAAqB;AxCstNjC;;AwC51NA;EA6II,kBzCrIY;ACw1NhB;;AwCh2NA;EA+II,kBzCzIY;AC81NhB;;AwCp2NA;EAiJI,iBzC5IW;ACm2Nf;;AyCt4NA,eAAA;ACIA;EACE,cAAc;EACd,aAAa;EACb,YAAY;EACZ,cAAc;EACd,gBAPkB;A1C64NpB;;A0Cr4NE;EACE,UAAU;EACV,YAAY;A1Cw4NhB;;A0Cv4NE;EACE,UAAU;EACV,WAAW;A1C04Nf;;A0Cz4NE;EACE,UAAU;EACV,UAAU;A1C44Nd;;A0C34NE;EACE,UAAU;EACV,eAAe;A1C84NnB;;A0C74NE;EACE,UAAU;EACV,UAAU;A1Cg5Nd;;A0C/4NE;EACE,UAAU;EACV,eAAe;A1Ck5NnB;;A0Cj5NE;EACE,UAAU;EACV,UAAU;A1Co5Nd;;A0Cn5NE;EACE,UAAU;EACV,UAAU;A1Cs5Nd;;A0Cr5NE;EACE,UAAU;EACV,UAAU;A1Cw5Nd;;A0Cv5NE;EACE,UAAU;EACV,UAAU;A1C05Nd;;A0Cz5NE;EACE,UAAU;EACV,UAAU;A1C45Nd;;A0C35NE;EzCyIE,gByCxImC;A1C85NvC;;A0C75NE;EzCuIE,qByCtIwC;A1Cg6N5C;;A0C/5NE;EzCqIE,gByCpImC;A1Ck6NvC;;A0Cj6NE;EzCmIE,qByClIwC;A1Co6N5C;;A0Cn6NE;EzCiIE,gByChImC;A1Cs6NvC;;A0Cr6NE;EzC+HE,gByC9HmC;A1Cw6NvC;;A0Cv6NE;EzC6HE,gByC5HmC;A1C06NvC;;A0Cz6NE;EzC2HE,gByC1HmC;A1C46NvC;;A0C36NE;EzCyHE,gByCxHmC;A1C86NvC;;A0C56NI;EACE,UAAU;EACV,SAAiC;A1C+6NvC;;A0C96NI;EzCmHA,eyClH4D;A1Ci7NhE;;A0Cr7NI;EACE,UAAU;EACV,eAAiC;A1Cw7NvC;;A0Cv7NI;EzCmHA,qByClH4D;A1C07NhE;;A0C97NI;EACE,UAAU;EACV,gBAAiC;A1Ci8NvC;;A0Ch8NI;EzCmHA,sByClH4D;A1Cm8NhE;;A0Cv8NI;EACE,UAAU;EACV,UAAiC;A1C08NvC;;A0Cz8NI;EzCmHA,gByClH4D;A1C48NhE;;A0Ch9NI;EACE,UAAU;EACV,gBAAiC;A1Cm9NvC;;A0Cl9NI;EzCmHA,sByClH4D;A1Cq9NhE;;A0Cz9NI;EACE,UAAU;EACV,gBAAiC;A1C49NvC;;A0C39NI;EzCmHA,sByClH4D;A1C89NhE;;A0Cl+NI;EACE,UAAU;EACV,UAAiC;A1Cq+NvC;;A0Cp+NI;EzCmHA,gByClH4D;A1Cu+NhE;;A0C3+NI;EACE,UAAU;EACV,gBAAiC;A1C8+NvC;;A0C7+NI;EzCmHA,sByClH4D;A1Cg/NhE;;A0Cp/NI;EACE,UAAU;EACV,gBAAiC;A1Cu/NvC;;A0Ct/NI;EzCmHA,sByClH4D;A1Cy/NhE;;A0C7/NI;EACE,UAAU;EACV,UAAiC;A1CggOvC;;A0C//NI;EzCmHA,gByClH4D;A1CkgOhE;;A0CtgOI;EACE,UAAU;EACV,gBAAiC;A1CygOvC;;A0CxgOI;EzCmHA,sByClH4D;A1C2gOhE;;A0C/gOI;EACE,UAAU;EACV,gBAAiC;A1CkhOvC;;A0CjhOI;EzCmHA,sByClH4D;A1CohOhE;;A0CxhOI;EACE,UAAU;EACV,WAAiC;A1C2hOvC;;A0C1hOI;EzCmHA,iByClH4D;A1C6hOhE;;ACz/NE;EyClGF;IAiEM,UAAU;IACV,YAAY;E1C+hOhB;E0CjmOF;IAoEM,UAAU;IACV,WAAW;E1CgiOf;E0CrmOF;IAuEM,UAAU;IACV,UAAU;E1CiiOd;E0CzmOF;IA0EM,UAAU;IACV,eAAe;E1CkiOnB;E0C7mOF;IA6EM,UAAU;IACV,UAAU;E1CmiOd;E0CjnOF;IAgFM,UAAU;IACV,eAAe;E1CoiOnB;E0CrnOF;IAmFM,UAAU;IACV,UAAU;E1CqiOd;E0CznOF;IAsFM,UAAU;IACV,UAAU;E1CsiOd;E0C7nOF;IAyFM,UAAU;IACV,UAAU;E1CuiOd;E0CjoOF;IA4FM,UAAU;IACV,UAAU;E1CwiOd;E0CroOF;IA+FM,UAAU;IACV,UAAU;E1CyiOd;E0CzoOF;IzCgLI,gByC9EqC;E1C0iOvC;E0C5oOF;IzCgLI,qByC5E0C;E1C2iO5C;E0C/oOF;IzCgLI,gByC1EqC;E1C4iOvC;E0ClpOF;IzCgLI,qByCxE0C;E1C6iO5C;E0CrpOF;IzCgLI,gByCtEqC;E1C8iOvC;E0CxpOF;IzCgLI,gByCpEqC;E1C+iOvC;E0C3pOF;IzCgLI,gByClEqC;E1CgjOvC;E0C9pOF;IzCgLI,gByChEqC;E1CijOvC;E0CjqOF;IzCgLI,gByC9DqC;E1CkjOvC;E0CpqOF;IAqHQ,UAAU;IACV,SAAiC;E1CkjOvC;E0CxqOF;IzCgLI,eyCxD8D;E1CmjOhE;E0C3qOF;IAqHQ,UAAU;IACV,eAAiC;E1CyjOvC;E0C/qOF;IzCgLI,qByCxD8D;E1C0jOhE;E0ClrOF;IAqHQ,UAAU;IACV,gBAAiC;E1CgkOvC;E0CtrOF;IzCgLI,sByCxD8D;E1CikOhE;E0CzrOF;IAqHQ,UAAU;IACV,UAAiC;E1CukOvC;E0C7rOF;IzCgLI,gByCxD8D;E1CwkOhE;E0ChsOF;IAqHQ,UAAU;IACV,gBAAiC;E1C8kOvC;E0CpsOF;IzCgLI,sByCxD8D;E1C+kOhE;E0CvsOF;IAqHQ,UAAU;IACV,gBAAiC;E1CqlOvC;E0C3sOF;IzCgLI,sByCxD8D;E1CslOhE;E0C9sOF;IAqHQ,UAAU;IACV,UAAiC;E1C4lOvC;E0CltOF;IzCgLI,gByCxD8D;E1C6lOhE;E0CrtOF;IAqHQ,UAAU;IACV,gBAAiC;E1CmmOvC;E0CztOF;IzCgLI,sByCxD8D;E1ComOhE;E0C5tOF;IAqHQ,UAAU;IACV,gBAAiC;E1C0mOvC;E0ChuOF;IzCgLI,sByCxD8D;E1C2mOhE;E0CnuOF;IAqHQ,UAAU;IACV,UAAiC;E1CinOvC;E0CvuOF;IzCgLI,gByCxD8D;E1CknOhE;E0C1uOF;IAqHQ,UAAU;IACV,gBAAiC;E1CwnOvC;E0C9uOF;IzCgLI,sByCxD8D;E1CynOhE;E0CjvOF;IAqHQ,UAAU;IACV,gBAAiC;E1C+nOvC;E0CrvOF;IzCgLI,sByCxD8D;E1CgoOhE;E0CxvOF;IAqHQ,UAAU;IACV,WAAiC;E1CsoOvC;E0C5vOF;IzCgLI,iByCxD8D;E1CuoOhE;AACF;;AC1pOE;EyCtGF;IA4HM,UAAU;IACV,YAAY;E1CyoOhB;E0CtwOF;IAgIM,UAAU;IACV,WAAW;E1CyoOf;E0C1wOF;IAoIM,UAAU;IACV,UAAU;E1CyoOd;E0C9wOF;IAwIM,UAAU;IACV,eAAe;E1CyoOnB;E0ClxOF;IA4IM,UAAU;IACV,UAAU;E1CyoOd;E0CtxOF;IAgJM,UAAU;IACV,eAAe;E1CyoOnB;E0C1xOF;IAoJM,UAAU;IACV,UAAU;E1CyoOd;E0C9xOF;IAwJM,UAAU;IACV,UAAU;E1CyoOd;E0ClyOF;IA4JM,UAAU;IACV,UAAU;E1CyoOd;E0CtyOF;IAgKM,UAAU;IACV,UAAU;E1CyoOd;E0C1yOF;IAoKM,UAAU;IACV,UAAU;E1CyoOd;E0C9yOF;IzCgLI,gByCRqC;E1CyoOvC;E0CjzOF;IzCgLI,qByCL0C;E1CyoO5C;E0CpzOF;IzCgLI,gByCFqC;E1CyoOvC;E0CvzOF;IzCgLI,qByCC0C;E1CyoO5C;E0C1zOF;IzCgLI,gByCIqC;E1CyoOvC;E0C7zOF;IzCgLI,gByCOqC;E1CyoOvC;E0Ch0OF;IzCgLI,gByCUqC;E1CyoOvC;E0Cn0OF;IzCgLI,gByCaqC;E1CyoOvC;E0Ct0OF;IzCgLI,gByCgBqC;E1CyoOvC;E0Cz0OF;IAoMQ,UAAU;IACV,SAAiC;E1CwoOvC;E0C70OF;IzCgLI,eyCwB8D;E1CwoOhE;E0Ch1OF;IAoMQ,UAAU;IACV,eAAiC;E1C+oOvC;E0Cp1OF;IzCgLI,qByCwB8D;E1C+oOhE;E0Cv1OF;IAoMQ,UAAU;IACV,gBAAiC;E1CspOvC;E0C31OF;IzCgLI,sByCwB8D;E1CspOhE;E0C91OF;IAoMQ,UAAU;IACV,UAAiC;E1C6pOvC;E0Cl2OF;IzCgLI,gByCwB8D;E1C6pOhE;E0Cr2OF;IAoMQ,UAAU;IACV,gBAAiC;E1CoqOvC;E0Cz2OF;IzCgLI,sByCwB8D;E1CoqOhE;E0C52OF;IAoMQ,UAAU;IACV,gBAAiC;E1C2qOvC;E0Ch3OF;IzCgLI,sByCwB8D;E1C2qOhE;E0Cn3OF;IAoMQ,UAAU;IACV,UAAiC;E1CkrOvC;E0Cv3OF;IzCgLI,gByCwB8D;E1CkrOhE;E0C13OF;IAoMQ,UAAU;IACV,gBAAiC;E1CyrOvC;E0C93OF;IzCgLI,sByCwB8D;E1CyrOhE;E0Cj4OF;IAoMQ,UAAU;IACV,gBAAiC;E1CgsOvC;E0Cr4OF;IzCgLI,sByCwB8D;E1CgsOhE;E0Cx4OF;IAoMQ,UAAU;IACV,UAAiC;E1CusOvC;E0C54OF;IzCgLI,gByCwB8D;E1CusOhE;E0C/4OF;IAoMQ,UAAU;IACV,gBAAiC;E1C8sOvC;E0Cn5OF;IzCgLI,sByCwB8D;E1C8sOhE;E0Ct5OF;IAoMQ,UAAU;IACV,gBAAiC;E1CqtOvC;E0C15OF;IzCgLI,sByCwB8D;E1CqtOhE;E0C75OF;IAoMQ,UAAU;IACV,WAAiC;E1C4tOvC;E0Cj6OF;IzCgLI,iByCwB8D;E1C4tOhE;AACF;;ACvzOE;EyC9GF;IA2MM,UAAU;IACV,YAAY;E1C+tOhB;E0C36OF;IA8MM,UAAU;IACV,WAAW;E1CguOf;E0C/6OF;IAiNM,UAAU;IACV,UAAU;E1CiuOd;E0Cn7OF;IAoNM,UAAU;IACV,eAAe;E1CkuOnB;E0Cv7OF;IAuNM,UAAU;IACV,UAAU;E1CmuOd;E0C37OF;IA0NM,UAAU;IACV,eAAe;E1CouOnB;E0C/7OF;IA6NM,UAAU;IACV,UAAU;E1CquOd;E0Cn8OF;IAgOM,UAAU;IACV,UAAU;E1CsuOd;E0Cv8OF;IAmOM,UAAU;IACV,UAAU;E1CuuOd;E0C38OF;IAsOM,UAAU;IACV,UAAU;E1CwuOd;E0C/8OF;IAyOM,UAAU;IACV,UAAU;E1CyuOd;E0Cn9OF;IzCgLI,gByC4DqC;E1C0uOvC;E0Ct9OF;IzCgLI,qByC8D0C;E1C2uO5C;E0Cz9OF;IzCgLI,gByCgEqC;E1C4uOvC;E0C59OF;IzCgLI,qByCkE0C;E1C6uO5C;E0C/9OF;IzCgLI,gByCoEqC;E1C8uOvC;E0Cl+OF;IzCgLI,gByCsEqC;E1C+uOvC;E0Cr+OF;IzCgLI,gByCwEqC;E1CgvOvC;E0Cx+OF;IzCgLI,gByC0EqC;E1CivOvC;E0C3+OF;IzCgLI,gByC4EqC;E1CkvOvC;E0C9+OF;IA+PQ,UAAU;IACV,SAAiC;E1CkvOvC;E0Cl/OF;IzCgLI,eyCkF8D;E1CmvOhE;E0Cr/OF;IA+PQ,UAAU;IACV,eAAiC;E1CyvOvC;E0Cz/OF;IzCgLI,qByCkF8D;E1C0vOhE;E0C5/OF;IA+PQ,UAAU;IACV,gBAAiC;E1CgwOvC;E0ChgPF;IzCgLI,sByCkF8D;E1CiwOhE;E0CngPF;IA+PQ,UAAU;IACV,UAAiC;E1CuwOvC;E0CvgPF;IzCgLI,gByCkF8D;E1CwwOhE;E0C1gPF;IA+PQ,UAAU;IACV,gBAAiC;E1C8wOvC;E0C9gPF;IzCgLI,sByCkF8D;E1C+wOhE;E0CjhPF;IA+PQ,UAAU;IACV,gBAAiC;E1CqxOvC;E0CrhPF;IzCgLI,sByCkF8D;E1CsxOhE;E0CxhPF;IA+PQ,UAAU;IACV,UAAiC;E1C4xOvC;E0C5hPF;IzCgLI,gByCkF8D;E1C6xOhE;E0C/hPF;IA+PQ,UAAU;IACV,gBAAiC;E1CmyOvC;E0CniPF;IzCgLI,sByCkF8D;E1CoyOhE;E0CtiPF;IA+PQ,UAAU;IACV,gBAAiC;E1C0yOvC;E0C1iPF;IzCgLI,sByCkF8D;E1C2yOhE;E0C7iPF;IA+PQ,UAAU;IACV,UAAiC;E1CizOvC;E0CjjPF;IzCgLI,gByCkF8D;E1CkzOhE;E0CpjPF;IA+PQ,UAAU;IACV,gBAAiC;E1CwzOvC;E0CxjPF;IzCgLI,sByCkF8D;E1CyzOhE;E0C3jPF;IA+PQ,UAAU;IACV,gBAAiC;E1C+zOvC;E0C/jPF;IzCgLI,sByCkF8D;E1Cg0OhE;E0ClkPF;IA+PQ,UAAU;IACV,WAAiC;E1Cs0OvC;E0CtkPF;IzCgLI,iByCkF8D;E1Cu0OhE;AACF;;ACx9OE;EyClHF;IAqQM,UAAU;IACV,YAAY;E1C00OhB;E0ChlPF;IAwQM,UAAU;IACV,WAAW;E1C20Of;E0CplPF;IA2QM,UAAU;IACV,UAAU;E1C40Od;E0CxlPF;IA8QM,UAAU;IACV,eAAe;E1C60OnB;E0C5lPF;IAiRM,UAAU;IACV,UAAU;E1C80Od;E0ChmPF;IAoRM,UAAU;IACV,eAAe;E1C+0OnB;E0CpmPF;IAuRM,UAAU;IACV,UAAU;E1Cg1Od;E0CxmPF;IA0RM,UAAU;IACV,UAAU;E1Ci1Od;E0C5mPF;IA6RM,UAAU;IACV,UAAU;E1Ck1Od;E0ChnPF;IAgSM,UAAU;IACV,UAAU;E1Cm1Od;E0CpnPF;IAmSM,UAAU;IACV,UAAU;E1Co1Od;E0CxnPF;IzCgLI,gByCsHqC;E1Cq1OvC;E0C3nPF;IzCgLI,qByCwH0C;E1Cs1O5C;E0C9nPF;IzCgLI,gByC0HqC;E1Cu1OvC;E0CjoPF;IzCgLI,qByC4H0C;E1Cw1O5C;E0CpoPF;IzCgLI,gByC8HqC;E1Cy1OvC;E0CvoPF;IzCgLI,gByCgIqC;E1C01OvC;E0C1oPF;IzCgLI,gByCkIqC;E1C21OvC;E0C7oPF;IzCgLI,gByCoIqC;E1C41OvC;E0ChpPF;IzCgLI,gByCsIqC;E1C61OvC;E0CnpPF;IAyTQ,UAAU;IACV,SAAiC;E1C61OvC;E0CvpPF;IzCgLI,eyC4I8D;E1C81OhE;E0C1pPF;IAyTQ,UAAU;IACV,eAAiC;E1Co2OvC;E0C9pPF;IzCgLI,qByC4I8D;E1Cq2OhE;E0CjqPF;IAyTQ,UAAU;IACV,gBAAiC;E1C22OvC;E0CrqPF;IzCgLI,sByC4I8D;E1C42OhE;E0CxqPF;IAyTQ,UAAU;IACV,UAAiC;E1Ck3OvC;E0C5qPF;IzCgLI,gByC4I8D;E1Cm3OhE;E0C/qPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cy3OvC;E0CnrPF;IzCgLI,sByC4I8D;E1C03OhE;E0CtrPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cg4OvC;E0C1rPF;IzCgLI,sByC4I8D;E1Ci4OhE;E0C7rPF;IAyTQ,UAAU;IACV,UAAiC;E1Cu4OvC;E0CjsPF;IzCgLI,gByC4I8D;E1Cw4OhE;E0CpsPF;IAyTQ,UAAU;IACV,gBAAiC;E1C84OvC;E0CxsPF;IzCgLI,sByC4I8D;E1C+4OhE;E0C3sPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cq5OvC;E0C/sPF;IzCgLI,sByC4I8D;E1Cs5OhE;E0CltPF;IAyTQ,UAAU;IACV,UAAiC;E1C45OvC;E0CttPF;IzCgLI,gByC4I8D;E1C65OhE;E0CztPF;IAyTQ,UAAU;IACV,gBAAiC;E1Cm6OvC;E0C7tPF;IzCgLI,sByC4I8D;E1Co6OhE;E0ChuPF;IAyTQ,UAAU;IACV,gBAAiC;E1C06OvC;E0CpuPF;IzCgLI,sByC4I8D;E1C26OhE;E0CvuPF;IAyTQ,UAAU;IACV,WAAiC;E1Ci7OvC;E0C3uPF;IzCgLI,iByC4I8D;E1Ck7OhE;AACF;;AC9mPI;EyCjIJ;IA+TM,UAAU;IACV,YAAY;E1Cq7OhB;E0CrvPF;IAkUM,UAAU;IACV,WAAW;E1Cs7Of;E0CzvPF;IAqUM,UAAU;IACV,UAAU;E1Cu7Od;E0C7vPF;IAwUM,UAAU;IACV,eAAe;E1Cw7OnB;E0CjwPF;IA2UM,UAAU;IACV,UAAU;E1Cy7Od;E0CrwPF;IA8UM,UAAU;IACV,eAAe;E1C07OnB;E0CzwPF;IAiVM,UAAU;IACV,UAAU;E1C27Od;E0C7wPF;IAoVM,UAAU;IACV,UAAU;E1C47Od;E0CjxPF;IAuVM,UAAU;IACV,UAAU;E1C67Od;E0CrxPF;IA0VM,UAAU;IACV,UAAU;E1C87Od;E0CzxPF;IA6VM,UAAU;IACV,UAAU;E1C+7Od;E0C7xPF;IzCgLI,gByCgLqC;E1Cg8OvC;E0ChyPF;IzCgLI,qByCkL0C;E1Ci8O5C;E0CnyPF;IzCgLI,gByCoLqC;E1Ck8OvC;E0CtyPF;IzCgLI,qByCsL0C;E1Cm8O5C;E0CzyPF;IzCgLI,gByCwLqC;E1Co8OvC;E0C5yPF;IzCgLI,gByC0LqC;E1Cq8OvC;E0C/yPF;IzCgLI,gByC4LqC;E1Cs8OvC;E0ClzPF;IzCgLI,gByC8LqC;E1Cu8OvC;E0CrzPF;IzCgLI,gByCgMqC;E1Cw8OvC;E0CxzPF;IAmXQ,UAAU;IACV,SAAiC;E1Cw8OvC;E0C5zPF;IzCgLI,eyCsM8D;E1Cy8OhE;E0C/zPF;IAmXQ,UAAU;IACV,eAAiC;E1C+8OvC;E0Cn0PF;IzCgLI,qByCsM8D;E1Cg9OhE;E0Ct0PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cs9OvC;E0C10PF;IzCgLI,sByCsM8D;E1Cu9OhE;E0C70PF;IAmXQ,UAAU;IACV,UAAiC;E1C69OvC;E0Cj1PF;IzCgLI,gByCsM8D;E1C89OhE;E0Cp1PF;IAmXQ,UAAU;IACV,gBAAiC;E1Co+OvC;E0Cx1PF;IzCgLI,sByCsM8D;E1Cq+OhE;E0C31PF;IAmXQ,UAAU;IACV,gBAAiC;E1C2+OvC;E0C/1PF;IzCgLI,sByCsM8D;E1C4+OhE;E0Cl2PF;IAmXQ,UAAU;IACV,UAAiC;E1Ck/OvC;E0Ct2PF;IzCgLI,gByCsM8D;E1Cm/OhE;E0Cz2PF;IAmXQ,UAAU;IACV,gBAAiC;E1Cy/OvC;E0C72PF;IzCgLI,sByCsM8D;E1C0/OhE;E0Ch3PF;IAmXQ,UAAU;IACV,gBAAiC;E1CggPvC;E0Cp3PF;IzCgLI,sByCsM8D;E1CigPhE;E0Cv3PF;IAmXQ,UAAU;IACV,UAAiC;E1CugPvC;E0C33PF;IzCgLI,gByCsM8D;E1CwgPhE;E0C93PF;IAmXQ,UAAU;IACV,gBAAiC;E1C8gPvC;E0Cl4PF;IzCgLI,sByCsM8D;E1C+gPhE;E0Cr4PF;IAmXQ,UAAU;IACV,gBAAiC;E1CqhPvC;E0Cz4PF;IzCgLI,sByCsM8D;E1CshPhE;E0C54PF;IAmXQ,UAAU;IACV,WAAiC;E1C4hPvC;E0Ch5PF;IzCgLI,iByCsM8D;E1C6hPhE;AACF;;ACpwPI;EyChJJ;IAyXM,UAAU;IACV,YAAY;E1CgiPhB;E0C15PF;IA4XM,UAAU;IACV,WAAW;E1CiiPf;E0C95PF;IA+XM,UAAU;IACV,UAAU;E1CkiPd;E0Cl6PF;IAkYM,UAAU;IACV,eAAe;E1CmiPnB;E0Ct6PF;IAqYM,UAAU;IACV,UAAU;E1CoiPd;E0C16PF;IAwYM,UAAU;IACV,eAAe;E1CqiPnB;E0C96PF;IA2YM,UAAU;IACV,UAAU;E1CsiPd;E0Cl7PF;IA8YM,UAAU;IACV,UAAU;E1CuiPd;E0Ct7PF;IAiZM,UAAU;IACV,UAAU;E1CwiPd;E0C17PF;IAoZM,UAAU;IACV,UAAU;E1CyiPd;E0C97PF;IAuZM,UAAU;IACV,UAAU;E1C0iPd;E0Cl8PF;IzCgLI,gByC0OqC;E1C2iPvC;E0Cr8PF;IzCgLI,qByC4O0C;E1C4iP5C;E0Cx8PF;IzCgLI,gByC8OqC;E1C6iPvC;E0C38PF;IzCgLI,qByCgP0C;E1C8iP5C;E0C98PF;IzCgLI,gByCkPqC;E1C+iPvC;E0Cj9PF;IzCgLI,gByCoPqC;E1CgjPvC;E0Cp9PF;IzCgLI,gByCsPqC;E1CijPvC;E0Cv9PF;IzCgLI,gByCwPqC;E1CkjPvC;E0C19PF;IzCgLI,gByC0PqC;E1CmjPvC;E0C79PF;IA6aQ,UAAU;IACV,SAAiC;E1CmjPvC;E0Cj+PF;IzCgLI,eyCgQ8D;E1CojPhE;E0Cp+PF;IA6aQ,UAAU;IACV,eAAiC;E1C0jPvC;E0Cx+PF;IzCgLI,qByCgQ8D;E1C2jPhE;E0C3+PF;IA6aQ,UAAU;IACV,gBAAiC;E1CikPvC;E0C/+PF;IzCgLI,sByCgQ8D;E1CkkPhE;E0Cl/PF;IA6aQ,UAAU;IACV,UAAiC;E1CwkPvC;E0Ct/PF;IzCgLI,gByCgQ8D;E1CykPhE;E0Cz/PF;IA6aQ,UAAU;IACV,gBAAiC;E1C+kPvC;E0C7/PF;IzCgLI,sByCgQ8D;E1CglPhE;E0ChgQF;IA6aQ,UAAU;IACV,gBAAiC;E1CslPvC;E0CpgQF;IzCgLI,sByCgQ8D;E1CulPhE;E0CvgQF;IA6aQ,UAAU;IACV,UAAiC;E1C6lPvC;E0C3gQF;IzCgLI,gByCgQ8D;E1C8lPhE;E0C9gQF;IA6aQ,UAAU;IACV,gBAAiC;E1ComPvC;E0ClhQF;IzCgLI,sByCgQ8D;E1CqmPhE;E0CrhQF;IA6aQ,UAAU;IACV,gBAAiC;E1C2mPvC;E0CzhQF;IzCgLI,sByCgQ8D;E1C4mPhE;E0C5hQF;IA6aQ,UAAU;IACV,UAAiC;E1CknPvC;E0ChiQF;IzCgLI,gByCgQ8D;E1CmnPhE;E0CniQF;IA6aQ,UAAU;IACV,gBAAiC;E1CynPvC;E0CviQF;IzCgLI,sByCgQ8D;E1C0nPhE;E0C1iQF;IA6aQ,UAAU;IACV,gBAAiC;E1CgoPvC;E0C9iQF;IzCgLI,sByCgQ8D;E1CioPhE;E0CjjQF;IA6aQ,UAAU;IACV,WAAiC;E1CuoPvC;E0CrjQF;IzCgLI,iByCgQ8D;E1CwoPhE;AACF;;A0CvoPA;EzClQI,qByClLgB;EzCkLhB,sByClLgB;EAublB,oBAvbkB;A1CikQpB;;A0C7oPA;EAKI,uBAzbgB;A1CqkQpB;;A0CjpPA;EAOI,qCAA4C;A1C8oPhD;;A0CrpPA;EAUI,uBAAuB;A1C+oP3B;;A0CzpPA;EzClQI,cyC8QiC;EzC9QjC,eyC+QiC;EACjC,aAAa;A1CipPjB;;A0C/pPA;EAgBM,SAAS;EACT,qBAAqB;A1CmpP3B;;A0CpqPA;EAmBM,qBAAqB;A1CqpP3B;;A0CxqPA;EAqBM,gBAAgB;A1CupPtB;;A0C5qPA;EAuBI,aAAa;A1CypPjB;;A0ChrPA;EAyBI,eAAe;A1C2pPnB;;A0CprPA;EA2BI,mBAAmB;A1C6pPvB;;ACpgQE;EyC4UF;IA+BM,aAAa;E1C8pPjB;AACF;;AC9/PE;EyCgUF;IAmCM,aAAa;E1CgqPjB;AACF;;A0C9pPE;EACE,oBAAY;EzCzSZ,wCyC0S2D;EzC1S3D,yCyC2S2D;A1CiqP/D;;A0CpqPE;EAKI,8BAA8B;EAC9B,+BAA+B;A1CmqPrC;;A0CzqPE;EASM,iBAAY;A1CoqPpB;;ACniQE;EyCsXA;IAYQ,iBAAY;E1CsqPpB;AACF;;ACriQE;EyCkXA;IAeQ,iBAAY;E1CyqPpB;AACF;;ACviQE;EyC8WA;IAkBQ,iBAAY;E1C4qPpB;AACF;;ACziQE;EyC0WA;IAqBQ,iBAAY;E1C+qPpB;AACF;;AC3iQE;EyCsWA;IAwBQ,iBAAY;E1CkrPpB;AACF;;AC5iQI;EyCiWF;IA2BQ,iBAAY;E1CqrPpB;AACF;;ACxiQI;EyCuVF;IA8BQ,iBAAY;E1CwrPpB;AACF;;ACziQI;EyCkVF;IAiCQ,iBAAY;E1C2rPpB;AACF;;ACriQI;EyCwUF;IAoCQ,iBAAY;E1C8rPpB;AACF;;A0CnuPE;EASM,oBAAY;A1C8tPpB;;AC7lQE;EyCsXA;IAYQ,oBAAY;E1CguPpB;AACF;;AC/lQE;EyCkXA;IAeQ,oBAAY;E1CmuPpB;AACF;;ACjmQE;EyC8WA;IAkBQ,oBAAY;E1CsuPpB;AACF;;ACnmQE;EyC0WA;IAqBQ,oBAAY;E1CyuPpB;AACF;;ACrmQE;EyCsWA;IAwBQ,oBAAY;E1C4uPpB;AACF;;ACtmQI;EyCiWF;IA2BQ,oBAAY;E1C+uPpB;AACF;;AClmQI;EyCuVF;IA8BQ,oBAAY;E1CkvPpB;AACF;;ACnmQI;EyCkVF;IAiCQ,oBAAY;E1CqvPpB;AACF;;AC/lQI;EyCwUF;IAoCQ,oBAAY;E1CwvPpB;AACF;;A0C7xPE;EASM,mBAAY;A1CwxPpB;;ACvpQE;EyCsXA;IAYQ,mBAAY;E1C0xPpB;AACF;;ACzpQE;EyCkXA;IAeQ,mBAAY;E1C6xPpB;AACF;;AC3pQE;EyC8WA;IAkBQ,mBAAY;E1CgyPpB;AACF;;AC7pQE;EyC0WA;IAqBQ,mBAAY;E1CmyPpB;AACF;;AC/pQE;EyCsWA;IAwBQ,mBAAY;E1CsyPpB;AACF;;AChqQI;EyCiWF;IA2BQ,mBAAY;E1CyyPpB;AACF;;AC5pQI;EyCuVF;IA8BQ,mBAAY;E1C4yPpB;AACF;;AC7pQI;EyCkVF;IAiCQ,mBAAY;E1C+yPpB;AACF;;ACzpQI;EyCwUF;IAoCQ,mBAAY;E1CkzPpB;AACF;;A0Cv1PE;EASM,oBAAY;A1Ck1PpB;;ACjtQE;EyCsXA;IAYQ,oBAAY;E1Co1PpB;AACF;;ACntQE;EyCkXA;IAeQ,oBAAY;E1Cu1PpB;AACF;;ACrtQE;EyC8WA;IAkBQ,oBAAY;E1C01PpB;AACF;;ACvtQE;EyC0WA;IAqBQ,oBAAY;E1C61PpB;AACF;;ACztQE;EyCsWA;IAwBQ,oBAAY;E1Cg2PpB;AACF;;AC1tQI;EyCiWF;IA2BQ,oBAAY;E1Cm2PpB;AACF;;ACttQI;EyCuVF;IA8BQ,oBAAY;E1Cs2PpB;AACF;;ACvtQI;EyCkVF;IAiCQ,oBAAY;E1Cy2PpB;AACF;;ACntQI;EyCwUF;IAoCQ,oBAAY;E1C42PpB;AACF;;A0Cj5PE;EASM,iBAAY;A1C44PpB;;AC3wQE;EyCsXA;IAYQ,iBAAY;E1C84PpB;AACF;;AC7wQE;EyCkXA;IAeQ,iBAAY;E1Ci5PpB;AACF;;AC/wQE;EyC8WA;IAkBQ,iBAAY;E1Co5PpB;AACF;;ACjxQE;EyC0WA;IAqBQ,iBAAY;E1Cu5PpB;AACF;;ACnxQE;EyCsWA;IAwBQ,iBAAY;E1C05PpB;AACF;;ACpxQI;EyCiWF;IA2BQ,iBAAY;E1C65PpB;AACF;;AChxQI;EyCuVF;IA8BQ,iBAAY;E1Cg6PpB;AACF;;ACjxQI;EyCkVF;IAiCQ,iBAAY;E1Cm6PpB;AACF;;AC7wQI;EyCwUF;IAoCQ,iBAAY;E1Cs6PpB;AACF;;A0C38PE;EASM,oBAAY;A1Cs8PpB;;ACr0QE;EyCsXA;IAYQ,oBAAY;E1Cw8PpB;AACF;;ACv0QE;EyCkXA;IAeQ,oBAAY;E1C28PpB;AACF;;ACz0QE;EyC8WA;IAkBQ,oBAAY;E1C88PpB;AACF;;AC30QE;EyC0WA;IAqBQ,oBAAY;E1Ci9PpB;AACF;;AC70QE;EyCsWA;IAwBQ,oBAAY;E1Co9PpB;AACF;;AC90QI;EyCiWF;IA2BQ,oBAAY;E1Cu9PpB;AACF;;AC10QI;EyCuVF;IA8BQ,oBAAY;E1C09PpB;AACF;;AC30QI;EyCkVF;IAiCQ,oBAAY;E1C69PpB;AACF;;ACv0QI;EyCwUF;IAoCQ,oBAAY;E1Cg+PpB;AACF;;A0CrgQE;EASM,mBAAY;A1CggQpB;;AC/3QE;EyCsXA;IAYQ,mBAAY;E1CkgQpB;AACF;;ACj4QE;EyCkXA;IAeQ,mBAAY;E1CqgQpB;AACF;;ACn4QE;EyC8WA;IAkBQ,mBAAY;E1CwgQpB;AACF;;ACr4QE;EyC0WA;IAqBQ,mBAAY;E1C2gQpB;AACF;;ACv4QE;EyCsWA;IAwBQ,mBAAY;E1C8gQpB;AACF;;ACx4QI;EyCiWF;IA2BQ,mBAAY;E1CihQpB;AACF;;ACp4QI;EyCuVF;IA8BQ,mBAAY;E1CohQpB;AACF;;ACr4QI;EyCkVF;IAiCQ,mBAAY;E1CuhQpB;AACF;;ACj4QI;EyCwUF;IAoCQ,mBAAY;E1C0hQpB;AACF;;A0C/jQE;EASM,oBAAY;A1C0jQpB;;ACz7QE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AgD;A7Cg0RxD;;A6C/zRI;EACE,oCAAyC;A7Ck0R/C;;A6Ch0RI;EACE,yBAA6B;A7Cm0RnC;;A6Cl0RI;EAGI,yBAAgD;A7Cm0RxD;;A6Cl0RI;EACE,oCAAwC;A7Cq0R9C;;A6Cj2RE;EACE,yBAAwB;A7Co2R5B;;A6Cn2RE;EAGI,yBAA0C;A7Co2RhD;;A6Cn2RE;EACE,oCAAmC;A7Cs2RvC;;A6Cj2RI;EACE,yBAA8B;A7Co2RpC;;A6Cn2RI;EAGI,yBAAgD;A7Co2RxD;;A6Cn2RI;EACE,oCAAyC;A7Cs2R/C;;A6Cp2RI;EACE,yBAA6B;A7Cu2RnC;;A6Ct2RI;EAGI,yBAAgD;A7Cu2RxD;;A6Ct2RI;EACE,oCAAwC;A7Cy2R9C;;A6Cr4RE;EACE,yBAAwB;A7Cw4R5B;;A6Cv4RE;EAGI,yBAA0C;A7Cw4RhD;;A6Cv4RE;EACE,oCAAmC;A7C04RvC;;A6Cr4RI;EACE,yBAA8B;A7Cw4RpC;;A6Cv4RI;EAGI,yBAAgD;A7Cw4RxD;;A6Cv4RI;EACE,oCAAyC;A7C04R/C;;A6Cx4RI;EACE,yBAA6B;A7C24RnC;;A6C14RI;EAGI,yBAAgD;A7C24RxD;;A6C14RI;EACE,oCAAwC;A7C64R9C;;A6Cz6RE;EACE,yBAAwB;A7C46R5B;;A6C36RE;EAGI,yBAA0C;A7C46RhD;;A6C36RE;EACE,oCAAmC;A7C86RvC;;A6Cz6RI;EACE,yBAA8B;A7C46RpC;;A6C36RI;EAGI,yBAAgD;A7C46RxD;;A6C36RI;EACE,oCAAyC;A7C86R/C;;A6C56RI;EACE,yBAA6B;A7C+6RnC;;A6C96RI;EAGI,yBAAgD;A7C+6RxD;;A6C96RI;EACE,oCAAwC;A7Ci7R9C;;A6C78RE;EACE,yBAAwB;A7Cg9R5B;;A6C/8RE;EAGI,yBAA0C;A7Cg9RhD;;A6C/8RE;EACE,oCAAmC;A7Ck9RvC;;A6C78RI;EACE,yBAA8B;A7Cg9RpC;;A6C/8RI;EAGI,yBAAgD;A7Cg9RxD;;A6C/8RI;EACE,oCAAyC;A7Ck9R/C;;A6Ch9RI;EACE,yBAA6B;A7Cm9RnC;;A6Cl9RI;EAGI,yBAAgD;A7Cm9RxD;;A6Cl9RI;EACE,oCAAwC;A7Cq9R9C;;A6Cl9RE;EACE,yBAAwB;A7Cq9R5B;;A6Cp9RE;EACE,oCAAmC;A7Cu9RvC;;A6C19RE;EACE,yBAAwB;A7C69R5B;;A6C59RE;EACE,oCAAmC;A7C+9RvC;;A6Cl+RE;EACE,yBAAwB;A7Cq+R5B;;A6Cp+RE;EACE,oCAAmC;A7Cu+RvC;;A6C1+RE;EACE,yBAAwB;A7C6+R5B;;A6C5+RE;EACE,oCAAmC;A7C++RvC;;A6Cl/RE;EACE,yBAAwB;A7Cq/R5B;;A6Cp/RE;EACE,oCAAmC;A7Cu/RvC;;A6C1/RE;EACE,yBAAwB;A7C6/R5B;;A6C5/RE;EACE,oCAAmC;A7C+/RvC;;A6ClgSE;EACE,yBAAwB;A7CqgS5B;;A6CpgSE;EACE,oCAAmC;A7CugSvC;;A6C1gSE;EACE,4BAAwB;A7C6gS5B;;A6C5gSE;EACE,uCAAmC;A7C+gSvC;;A6ClhSE;EACE,yBAAwB;A7CqhS5B;;A6CphSE;EACE,oCAAmC;A7CuhSvC;;A8C3jSE;EACE,8BAAiC;A9C8jSrC;;A8C/jSE;EACE,sCAAiC;A9CkkSrC;;A8CnkSE;EACE,iCAAiC;A9CskSrC;;A8CvkSE;EACE,yCAAiC;A9C0kSrC;;A8CtkSE;EACE,4BAA4B;A9CykShC;;A8C1kSE;EACE,0BAA4B;A9C6kShC;;A8C9kSE;EACE,kCAA4B;A9CilShC;;A8C7kSE;EACE,sCAAkC;A9CglStC;;A8CjlSE;EACE,oCAAkC;A9ColStC;;A8CrlSE;EACE,kCAAkC;A9CwlStC;;A8CzlSE;EACE,yCAAkC;A9C4lStC;;A8C7lSE;EACE,wCAAkC;A9CgmStC;;A8CjmSE;EACE,wCAAkC;A9ComStC;;A8CrmSE;EACE,iCAAkC;A9CwmStC;;A8CzmSE;EACE,+BAAkC;A9C4mStC;;A8C7mSE;EACE,gCAAkC;A9CgnStC;;A8CjnSE;EACE,iCAAkC;A9ConStC;;A8ChnSE;EACE,oCAAgC;A9CmnSpC;;A8CpnSE;EACE,kCAAgC;A9CunSpC;;A8CxnSE;EACE,gCAAgC;A9C2nSpC;;A8C5nSE;EACE,uCAAgC;A9C+nSpC;;A8ChoSE;EACE,sCA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Dv4TE;IACE,0BAA2B;EpDy4T/B;EoD14TE;IACE,4BAA2B;EpD44T/B;EoD74TE;IACE,6BAA2B;EpD+4T/B;EoDh5TE;IACE,0BAA2B;EpDk5T/B;EoDn5TE;IACE,6BAA2B;EpDq5T/B;AACF;;ACvxTI;EmDhIA;IACE,0BAA2B;EpD25T/B;EoD55TE;IACE,4BAA2B;EpD85T/B;EoD/5TE;IACE,0BAA2B;EpDi6T/B;EoDl6TE;IACE,4BAA2B;EpDo6T/B;EoDr6TE;IACE,6BAA2B;EpDu6T/B;EoDx6TE;IACE,0BAA2B;EpD06T/B;EoD36TE;IACE,6BAA2B;EpD66T/B;AACF;;AChyTI;EmD/IA;IACE,0BAA2B;EpDm7T/B;EoDp7TE;IACE,4BAA2B;EpDs7T/B;EoDv7TE;IACE,0BAA2B;EpDy7T/B;EoD17TE;IACE,4BAA2B;EpD47T/B;EoD77TE;IACE,6BAA2B;EpD+7T/B;EoDh8TE;IACE,0BAA2B;EpDk8T/B;EoDn8TE;IACE,6BAA2B;EpDq8T/B;AACF;;AoD76TE;EACE,6BAAqC;ApDg7TzC;;AoDj7TE;EACE,8BAAqC;ApDo7TzC;;AoDr7TE;EACE,2BAAqC;ApDw7TzC;;AoDz7TE;EACE,4BAAqC;ApD47TzC;;ACt3TE;EmDlEE;IACE,6BAAqC;EpD47TzC;AACF;;ACx3TE;EmDnEE;IACE,6BAAqC;EpD+7TzC;AACF;;AC13TE;EmDpEE;IACE,6BAAqC;EpDk8TzC;AACF;;AC53TE;EmDrEE;IACE,6BAAqC;EpDq8TzC;AACF;;AC93TE;EmDtEE;IACE,6BAAqC;EpDw8TzC;AACF;;AC/3TI;EmDxEA;IACE,6BAAqC;EpD28TzC;AACF;;AC33TI;EmD/EA;IACE,6BAAqC;EpD88TzC;AACF;;AC53TI;EmDjFA;IACE,6BAAqC;EpDi9TzC;AACF;;ACx3TI;EmDxFA;IACE,6BAAqC;EpDo9TzC;AACF;;AC56TE;EmDlEE;IACE,8BAAqC;EpDk/TzC;AACF;;AC96TE;EmDnEE;IACE,8BAAqC;EpDq/TzC;AACF;;ACh7TE;EmDpEE;IACE,8BAAqC;EpDw/TzC;AACF;;ACl7TE;EmDrEE;IACE,8BAAqC;EpD2/TzC;AACF;;ACp7TE;EmDtEE;IACE,8BAAqC;EpD8/TzC;AACF;;ACr7TI;EmDxEA;IACE,8BAAqC;EpDigUzC;AACF;;ACj7TI;EmD/EA;IACE,8BAAqC;EpDogUzC;AACF;;ACl7TI;EmDjFA;IACE,8BAAqC;EpDugUzC;AACF;;AC96TI;EmDxFA;IACE,8BAAqC;EpD0gUzC;AACF;;ACl+TE;EmDlEE;IACE,2BAAqC;EpDwiUzC;AACF;;ACp+TE;EmDnEE;IACE,2BAAqC;EpD2iUzC;AACF;;ACt+TE;EmDpEE;IACE,2BAAqC;EpD8iUzC;AACF;;ACx+TE;EmDrEE;IACE,2BAAqC;EpDijUzC;AACF;;AC1+TE;EmDtEE;IACE,2BAAqC;EpDojUzC;AACF;;AC3+TI;EmDxEA;IACE,2BAAqC;EpDujUzC;AACF;;ACv+TI;EmD/EA;IACE,2BAAqC;EpD0jUzC;AACF;;ACx+TI;EmDjFA;IACE,2BAAqC;EpD6jUzC;AACF;;ACp+TI;EmDxFA;IACE,2BAAqC;EpDgkUzC;AACF;;ACxhUE;EmDlEE;IACE,4BAAqC;EpD8lUzC;AACF;;AC1hUE;EmDnEE;IACE,4BAAqC;EpDimUzC;AACF;;AC5hUE;EmDpEE;IACE,4BAAqC;EpDomUzC;AACF;;AC9hUE;EmDrEE;IACE,4BAAqC;EpDumUzC;AACF;;AChiUE;EmDtEE;IACE,4BAAqC;EpD0mUzC;AACF;;ACjiUI;EmDxEA;IACE,4BAAqC;EpD6mUzC;AACF;;AC7hUI;EmD/EA;IACE,4BAAqC;EpDgnUzC;AACF;;AC9hUI;EmDjFA;IACE,4BAAqC;EpDmnUzC;AACF;;AC1hUI;EmDxFA;IACE,4BAAqC;EpDsnUzC;AACF;;AoDrnUA;EACE,qCAAqC;ApDwnUvC;;AoDtnUA;EACE,oCAAoC;ApDynUtC;;AoDvnUA;EACE,oCAAoC;ApD0nUtC;;AoDxnUA;EACE,6BAA6B;ApD2nU/B;;AoDznUA;EACE,qCAAqC;ApD4nUvC;;AoD1nUA;EACE,2BAAqC;ApD6nUvC;;AoD5nUA;EACE,2BAAsC;ApD+nUxC;;AoD9nUA;EACE,2BAAsC;ApDioUxC;;AoDhoUA;EACE,2BAAwC;ApDmoU1C;;AoDloUA;EACE,2BAAoC;ApDqoUtC;;AoDnoUA;EACE,+LAAuC;ApDsoUzC;;AoDpoUA;EACE,+LAAyC;ApDuoU3C;;AoDroUA;EACE,+LAA0C;ApDwoU5C;;AoDtoUA;EACE,iCAAyC;ApDyoU3C;;AoDvoUA;EACE,iCAAoC;ApD0oUtC;;AqD3uUE;EACE,yBAA+B;ArD8uUnC;;AC9oUE;EoD9FE;IACE,yBAA+B;ErDgvUnC;AACF;;AChpUE;EoD/FE;IACE,yBAA+B;ErDmvUnC;AACF;;AClpUE;EoDhGE;IACE,yBAA+B;ErDsvUnC;AACF;;ACppUE;EoDjGE;IACE,yBAA+B;ErDyvUnC;AACF;;ACtpUE;EoDlGE;IACE,yBAA+B;ErD4vUnC;AACF;;ACvpUI;EoDpGA;IACE,yBAA+B;ErD+vUnC;AACF;;ACnpUI;EoD3GA;IACE,yBAA+B;ErDkwUnC;AACF;;ACppUI;EoD7GA;IACE,yBAA+B;ErDqwUnC;AACF;;AChpUI;EoDpHA;IACE,yBAA+B;ErDwwUnC;AACF;;AqDryUE;EACE,wBAA+B;ArDwyUnC;;ACxsUE;EoD9FE;IACE,wBAA+B;ErD0yUnC;AACF;;AC1sUE;EoD/FE;IACE,wBAA+B;ErD6yUnC;AACF;;AC5sUE;EoDhGE;IACE,wBAA+B;ErDgzUnC;AACF;;AC9sUE;EoDjGE;IACE,wBAA+B;ErDmzUnC;AACF;;AChtUE;EoDlGE;IACE,wBAA+B;ErDszUnC;AACF;;ACjtUI;EoDpGA;IACE,wBAA+B;ErDyzUnC;AACF;;AC7sUI;EoD3GA;IACE,wBAA+B;ErD4zUnC;AACF;;AC9sUI;EoD7GA;IACE,wBAA+B;ErD+zUnC;AACF;;AC1sUI;EoDpHA;IACE,wBAA+B;ErDk0UnC;AACF;;AqD/1UE;EACE,0BAA+B;ArDk2UnC;;AClwUE;EoD9FE;IACE,0BAA+B;ErDo2UnC;AACF;;ACpwUE;EoD/FE;IACE,0BAA+B;ErDu2UnC;AACF;;ACtwUE;EoDhGE;IACE,0BAA+B;ErD02UnC;AACF;;ACxwUE;EoDjGE;IACE,0BAA+B;ErD62UnC;AACF;;AC1wUE;EoDlGE;IACE,0BAA+B;ErDg3UnC;AACF;;AC3wUI;EoDpGA;IACE,0BAA+B;ErDm3UnC;AACF;;ACvwUI;EoD3GA;IACE,0BAA+B;ErDs3UnC;AACF;;ACxwUI;EoD7GA;IACE,0BAA+B;ErDy3UnC;AACF;;ACpwUI;EoDpHA;IACE,0BAA+B;ErD43UnC;AACF;;AqDz5UE;EACE,gCAA+B;ArD45UnC;;AC5zUE;EoD9FE;IACE,gCAA+B;ErD85UnC;AACF;;AC9zUE;EoD/FE;IACE,gCAA+B;ErDi6UnC;AACF;;ACh0UE;EoDhGE;IACE,gCAA+B;ErDo6UnC;AACF;;ACl0UE;EoDjGE;IACE,gCAA+B;ErDu6UnC;AACF;;ACp0UE;EoDlGE;IACE,gCAA+B;ErD06UnC;AACF;;ACr0UI;EoDpGA;IACE,gCAA+B;ErD66UnC;AACF;;ACj0UI;EoD3GA;IACE,gCAA+B;ErDg7UnC;AACF;;ACl0UI;EoD7GA;IACE,gCAA+B;ErDm7UnC;AACF;;AC9zUI;EoDpHA;IACE,gCAA+B;ErDs7UnC;AACF;;AqDn9UE;EACE,+BAA+B;ArDs9UnC;;ACt3UE;EoD9FE;IACE,+BAA+B;ErDw9UnC;AACF;;ACx3UE;EoD/FE;IACE,+BAA+B;ErD29UnC;AACF;;AC13UE;EoDhGE;IACE,+BAA+B;ErD89UnC;AACF;;AC53UE;EoDjGE;IACE,+BAA+B;ErDi+UnC;AACF;;AC93UE;EoDlGE;IACE,+BAA+B;ErDo+UnC;AACF;;AC/3UI;EoDpGA;IACE,+BAA+B;ErDu+UnC;AACF;;AC33UI;EoD3GA;IACE,+BAA+B;ErD0+UnC;AACF;;AC53UI;EoD7GA;IACE,+BAA+B;ErD6+UnC;AACF;;ACx3UI;EoDpHA;IACE,+BAA+B;ErDg/UnC;AACF;;AqD/+UA;EACE,wBAAwB;ArDk/U1B;;AqDh/UA;EACE,uBAAuB;EACvB,iCAAiC;EACjC,yBAAyB;EACzB,2BAA2B;EAC3B,qBAAqB;EACrB,6BAA6B;EAC7B,8BAA8B;EAC9B,wBAAwB;ArDm/U1B;;AC37UE;EoDrDA;IACE,wBAAwB;ErDo/U1B;AACF;;AC77UE;EoDrDA;IACE,wBAAwB;ErDs/U1B;AACF;;AC/7UE;EoDrDA;IACE,wBAAwB;ErDw/U1B;AACF;;ACj8UE;EoDrDA;IACE,wBAAwB;ErD0/U1B;AACF;;ACn8UE;EoDrDA;IACE,wBAAwB;ErD4/U1B;AACF;;ACp8UI;EoDtDF;IACE,wBAAwB;ErD8/U1B;AACF;;ACh8UI;EoD5DF;IACE,wBAAwB;ErDggV1B;AACF;;ACj8UI;EoD7DF;IACE,wBAAwB;ErDkgV1B;AACF;;AC77UI;EoDnEF;IACE,wBAAwB;ErDogV1B;AACF;;AqDngVA;EACE,6BAA6B;ArDsgV/B;;ACr/UE;EoDdA;IACE,6BAA6B;ErDugV/B;AACF;;ACv/UE;EoDdA;IACE,6BAA6B;ErDygV/B;AACF;;ACz/UE;EoDdA;IACE,6BAA6B;ErD2gV/B;AACF;;AC3/UE;EoDdA;IACE,6BAA6B;ErD6gV/B;AACF;;AC7/UE;EoDdA;IACE,6BAA6B;ErD+gV/B;AACF;;AC9/UI;EoDfF;IACE,6BAA6B;ErDihV/B;AACF;;AC1/UI;EoDrBF;IACE,6BAA6B;ErDmhV/B;AACF;;AC3/UI;EoDtBF;IACE,6BAA6B;ErDqhV/B;AACF;;ACv/UI;EoD5BF;IACE,6BAA6B;ErDuhV/B;AACF;;AsDjpVA,iBAAA;ACWA;EACE,oBAAoB;EACpB,aAAa;EACb,sBAAsB;EACtB,8BAA8B;AvD0oVhC;;AuD9oVA;EAMI,gBAAgB;AvD4oVpB;;AuDlpVA;EASM,mBAAmB;AvD6oVzB;;AuDtpVA;EAeM,uBxDXyB;EwDYzB,cxDzBuB;ACoqV7B;;AuD3pVA;;EAmBQ,cAAc;AvD6oVtB;;AuDhqVA;EAqBQ,cxD9BqB;AC6qV7B;;AuDpqVA;EAuBQ,4BxDhCqB;ACirV7B;;AuDxqVA;;EA0BU,cxDnCmB;ACsrV7B;;ACtkVE;EsDvGF;IA6BU,uBxDzBqB;EC8qV7B;AACF;;AuDnrVA;;EAgCQ,4BxDzCqB;ACisV7B;;AuDxrVA;;;EAqCU,yB7C4DuB;E6C3DvB,cxD/CmB;ACwsV7B;;AuD/rVA;EAyCU,cxDlDmB;EwDmDnB,YAAY;AvD0pVtB;;AuDpsVA;EA4CY,UAAU;AvD4pVtB;;AuDxsVA;EA+CY,uBAAwB;EACxB,UAAU;AvD6pVtB;;AuD7sVA;EAoDY,cxD7DiB;AC0tV7B;;AuDjtVA;EAsDc,uCxD/De;AC8tV7B;;AuDrtVA;EA0Dc,yBxDnEe;EwDoEf,qBxDpEe;EwDqEf,YxDxDiB;ACutV/B;;AuD3tVA;EAkEU,4EAAyG;AvD6pVnH;;ACpoVE;EsD3FF;IAqEc,4EAAyG;EvD+pVrH;AACF;;AuDruVA;EAeM,yBxDxBuB;EwDyBvB,YxDZyB;ACsuV/B;;AuD1uVA;;EAmBQ,cAAc;AvD4tVtB;;AuD/uVA;EAqBQ,YxDjBuB;AC+uV/B;;AuDnvVA;EAuBQ,+BxDnBuB;ACmvV/B;;AuDvvVA;;EA0BU,YxDtBqB;ACwvV/B;;ACrpVE;EsDvGF;IA6BU,yBxDtCmB;EC0wV3B;AACF;;AuDlwVA;;EAgCQ,+BxD5BuB;ACmwV/B;;AuDvwVA;;;EAqCU,uB7C4DuB;E6C3DvB,YxDlCqB;AC0wV/B;;AuD9wVA;EAyCU,YxDrCqB;EwDsCrB,YAAY;AvDyuVtB;;AuDnxVA;EA4CY,UAAU;AvD2uVtB;;AuDvxVA;EA+CY,yBAAwB;EACxB,UAAU;AvD4uVtB;;AuD5xVA;EAoDY,YxDhDmB;AC4xV/B;;AuDhyVA;EAsDc,uCxD/De;AC6yV7B;;AuDpyVA;EA0Dc,uBxDtDiB;EwDuDjB,mBxDvDiB;EwDwDjB,cxDrEe;ACmzV7B;;AuD1yVA;EAkEU,8EAAyG;AvD4uVnH;;ACntVE;EsD3FF;IAqEc,8EAAyG;EvD8uVrH;AACF;;AuDpzVA;EAeM,4BxDbwB;EwDcxB,yB7CqDe;AVovVrB;;AuDzzVA;;EAmBQ,cAAc;AvD2yVtB;;AuD9zVA;EAqBQ,yB7CgDa;AV6vVrB;;AuDl0VA;EAuBQ,yB7C8Ca;AViwVrB;;AuDt0VA;;EA0BU,yB7C2CW;AVswVrB;;ACpuVE;EsDvGF;IA6BU,4BxD3BoB;EC80V5B;AACF;;AuDj1VA;;EAgCQ,yB7CqCa;AVixVrB;;AuDt1VA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVwxVrB;;AuD71VA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDwzVtB;;AuDl2VA;EA4CY,UAAU;AvD0zVtB;;AuDt2VA;EA+CY,4BAAwB;EACxB,UAAU;AvD2zVtB;;AuD32VA;EAoDY,yB7CiBS;AV0yVrB;;AuD/2VA;EAsDc,uCxD/De;AC43V7B;;AuDn3VA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,iBxD1DgB;ACu3V9B;;AuDz3VA;EAkEU,iFAAyG;AvD2zVnH;;AClyVE;EsD3FF;IAqEc,iFAAyG;EvD6zVrH;AACF;;AuDn4VA;EAeM,yBxDpBwB;EwDqBxB,W7CuDU;AVi0VhB;;AuDx4VA;;EAmBQ,cAAc;AvD03VtB;;AuD74VA;EAqBQ,W7CkDQ;AV00VhB;;AuDj5VA;EAuBQ,+B7CgDQ;AV80VhB;;AuDr5VA;;EA0BU,W7C6CM;AVm1VhB;;ACnzVE;EsDvGF;IA6BU,yBxDlCoB;ECo6V5B;AACF;;AuDh6VA;;EAgCQ,+B7CuCQ;AV81VhB;;AuDr6VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVq2VhB;;AuD56VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDu4VtB;;AuDj7VA;EA4CY,UAAU;AvDy4VtB;;AuDr7VA;EA+CY,yBAAwB;EACxB,UAAU;AvD04VtB;;AuD17VA;EAoDY,W7CmBI;AVu3VhB;;AuD97VA;EAsDc,uCxD/De;AC28V7B;;AuDl8VA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjEgB;AC68V9B;;AuDx8VA;EAkEU,gFAAyG;AvD04VnH;;ACj3VE;EsD3FF;IAqEc,gFAAyG;EvD44VrH;AACF;;AuDl9VA;EAeM,yBxDN4B;EwDO5B,W7CuDU;AVg5VhB;;AuDv9VA;;EAmBQ,cAAc;AvDy8VtB;;AuD59VA;EAqBQ,W7CkDQ;AVy5VhB;;AuDh+VA;EAuBQ,+B7CgDQ;AV65VhB;;AuDp+VA;;EA0BU,W7C6CM;AVk6VhB;;ACl4VE;EsDvGF;IA6BU,yBxDpBwB;ECq+VhC;AACF;;AuD/+VA;;EAgCQ,+B7CuCQ;AV66VhB;;AuDp/VA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVo7VhB;;AuD3/VA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDs9VtB;;AuDhgWA;EA4CY,UAAU;AvDw9VtB;;AuDpgWA;EA+CY,yBAAwB;EACxB,UAAU;AvDy9VtB;;AuDzgWA;EAoDY,W7CmBI;AVs8VhB;;AuD7gWA;EAsDc,uCxD/De;AC0hW7B;;AuDjhWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDnDoB;AC8gWlC;;AuDvhWA;EAkEU,gFAAyG;AvDy9VnH;;ACh8VE;EsD3FF;IAqEc,gFAAyG;EvD29VrH;AACF;;AuDjiWA;EAeM,yBxDJ4B;EwDK5B,W7CuDU;AV+9VhB;;AuDtiWA;;EAmBQ,cAAc;AvDwhWtB;;AuD3iWA;EAqBQ,W7CkDQ;AVw+VhB;;AuD/iWA;EAuBQ,+B7CgDQ;AV4+VhB;;AuDnjWA;;EA0BU,W7C6CM;AVi/VhB;;ACj9VE;EsDvGF;IA6BU,yBxDlBwB;ECkjWhC;AACF;;AuD9jWA;;EAgCQ,+B7CuCQ;AV4/VhB;;AuDnkWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVmgWhB;;AuD1kWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDqiWtB;;AuD/kWA;EA4CY,UAAU;AvDuiWtB;;AuDnlWA;EA+CY,yBAAwB;EACxB,UAAU;AvDwiWtB;;AuDxlWA;EAoDY,W7CmBI;AVqhWhB;;AuD5lWA;EAsDc,uCxD/De;ACymW7B;;AuDhmWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDjDoB;AC2lWlC;;AuDtmWA;EAkEU,gFAAyG;AvDwiWnH;;AC/gWE;EsD3FF;IAqEc,gFAAyG;EvD0iWrH;AACF;;AuDhnWA;EAeM,yBxDL4B;EwDM5B,W7CuDU;AV8iWhB;;AuDrnWA;;EAmBQ,cAAc;AvDumWtB;;AuD1nWA;EAqBQ,W7CkDQ;AVujWhB;;AuD9nWA;EAuBQ,+B7CgDQ;AV2jWhB;;AuDloWA;;EA0BU,W7C6CM;AVgkWhB;;AChiWE;EsDvGF;IA6BU,yBxDnBwB;ECkoWhC;AACF;;AuD7oWA;;EAgCQ,+B7CuCQ;AV2kWhB;;AuDlpWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AVklWhB;;AuDzpWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDonWtB;;AuD9pWA;EA4CY,UAAU;AvDsnWtB;;AuDlqWA;EA+CY,yBAAwB;EACxB,UAAU;AvDunWtB;;AuDvqWA;EAoDY,W7CmBI;AVomWhB;;AuD3qWA;EAsDc,uCxD/De;ACwrW7B;;AuD/qWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDlDoB;AC2qWlC;;AuDrrWA;EAkEU,gFAAyG;AvDunWnH;;AC9lWE;EsD3FF;IAqEc,gFAAyG;EvDynWrH;AACF;;AuD/rWA;EAeM,yBxDP4B;EwDQ5B,W7CuDU;AV6nWhB;;AuDpsWA;;EAmBQ,cAAc;AvDsrWtB;;AuDzsWA;EAqBQ,W7CkDQ;AVsoWhB;;AuD7sWA;EAuBQ,+B7CgDQ;AV0oWhB;;AuDjtWA;;EA0BU,W7C6CM;AV+oWhB;;AC/mWE;EsDvGF;IA6BU,yBxDrBwB;ECmtWhC;AACF;;AuD5tWA;;EAgCQ,+B7CuCQ;AV0pWhB;;AuDjuWA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AViqWhB;;AuDxuWA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDmsWtB;;AuD7uWA;EA4CY,UAAU;AvDqsWtB;;AuDjvWA;EA+CY,yBAAwB;EACxB,UAAU;AvDssWtB;;AuDtvWA;EAoDY,W7CmBI;AVmrWhB;;AuD1vWA;EAsDc,uCxD/De;ACuwW7B;;AuD9vWA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxDpDoB;AC4vWlC;;AuDpwWA;EAkEU,gFAAyG;AvDssWnH;;AC7qWE;EsD3FF;IAqEc,gFAAyG;EvDwsWrH;AACF;;AuD9wWA;EAeM,yBxDR4B;EwDS5B,yB7CqDe;AV8sWrB;;AuDnxWA;;EAmBQ,cAAc;AvDqwWtB;;AuDxxWA;EAqBQ,yB7CgDa;AVutWrB;;AuD5xWA;EAuBQ,yB7C8Ca;AV2tWrB;;AuDhyWA;;EA0BU,yB7C2CW;AVguWrB;;AC9rWE;EsDvGF;IA6BU,yBxDtBwB;ECmyWhC;AACF;;AuD3yWA;;EAgCQ,yB7CqCa;AV2uWrB;;AuDhzWA;;;EAqCU,yB7C4DuB;E6C3DvB,yB7C+BW;AVkvWrB;;AuDvzWA;EAyCU,yB7C4BW;E6C3BX,YAAY;AvDkxWtB;;AuD5zWA;EA4CY,UAAU;AvDoxWtB;;AuDh0WA;EA+CY,yBAAwB;EACxB,UAAU;AvDqxWtB;;AuDr0WA;EAoDY,yB7CiBS;AVowWrB;;AuDz0WA;EAsDc,uCxD/De;ACs1W7B;;AuD70WA;EA0Dc,oC7CWO;E6CVP,gC7CUO;E6CTP,cxDrDoB;AC40WlC;;AuDn1WA;EAkEU,gFAAyG;AvDqxWnH;;AC5vWE;EsD3FF;IAqEc,gFAAyG;EvDuxWrH;AACF;;AuD71WA;EAeM,yBxDF2B;EwDG3B,W7CuDU;AV2xWhB;;AuDl2WA;;EAmBQ,cAAc;AvDo1WtB;;AuDv2WA;EAqBQ,W7CkDQ;AVoyWhB;;AuD32WA;EAuBQ,+B7CgDQ;AVwyWhB;;AuD/2WA;;EA0BU,W7C6CM;AV6yWhB;;AC7wWE;EsDvGF;IA6BU,yBxDhBuB;EC42W/B;AACF;;AuD13WA;;EAgCQ,+B7CuCQ;AVwzWhB;;AuD/3WA;;;EAqCU,yB7C4DuB;E6C3DvB,W7CiCM;AV+zWhB;;AuDt4WA;EAyCU,W7C8BM;E6C7BN,YAAY;AvDi2WtB;;AuD34WA;EA4CY,UAAU;AvDm2WtB;;AuD/4WA;EA+CY,yBAAwB;EACxB,UAAU;AvDo2WtB;;AuDp5WA;EAoDY,W7CmBI;AVi1WhB;;AuDx5WA;EAsDc,uCxD/De;ACq6W7B;;AuD55WA;EA0Dc,sB7CaE;E6CZF,kB7CYE;E6CXF,cxD/CmB;ACq5WjC;;AuDl6WA;EAkEU,gFAAyG;AvDo2WnH;;AC30WE;EsD3FF;IAqEc,gFAAyG;EvDs2WrH;AACF;;AuD56WA;EAyEM,eAhF0B;AvDu7WhC;;ACj1WE;EsD/FF;IA6EQ,oBAnF8B;EvD27WpC;AACF;;ACv1WE;EsD/FF;IAiFQ,mBAtF4B;EvDg8WlC;AACF;;AuD57WA;EAsFM,mBAAmB;EACnB,aAAa;AvD02WnB;;AuDj8WA;EAyFQ,YAAY;EACZ,cAAc;AvD42WtB;;AuDt8WA;EA4FI,gBAAgB;AvD82WpB;;AuD18WA;EA8FI,iBAAiB;AvDg3WrB;;AuD52WA;EAEE,gBAAgB;AvD82WlB;;AuDh3WA;EAII,SAAS;EACT,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,QAAQ;EACR,qCAAqC;AvDg3WzC;;AuDz3WA;EAYI,YAAY;AvDi3WhB;;ACp4WE;EsDOF;IAeI,aAAa;EvDm3Wf;AACF;;AuDl3WA;EACE,kBAAkB;AvDq3WpB;;AC94WE;EsDwBF;IAKM,aAAa;EvDs3WjB;EuD33WF;IAOQ,sBAAsB;EvDu3W5B;AACF;;ACn5WE;EsDoBF;IASI,aAAa;IACb,uBAAuB;EvD23WzB;EuDr4WF;ItDsDI,oBsD1CwC;EvD43W1C;AACF;;AuDz3WA;;EAEE,YAAY;EACZ,cAAc;AvD43WhB;;AuD13WA;EACE,YAAY;EACZ,cAAc;EACd,oBApJ6B;AvDihX/B;;ACz6WE;EsDyCF;IAKI,kBArJgC;EvDqhXlC;AACF;;AwDlhXA;EACE,oBAN2B;AxD2hX7B;;ACv6WE;EuD/GF;IAII,kBAR+B;ExD+hXjC;EwD3hXF;IAOM,oBAV8B;ExDiiXlC;EwD9hXF;IASM,mBAX4B;ExDmiXhC;AACF;;AyDniXA;EACE,yB1DO4B;E0DN5B,yBAJ+B;AzD0iXjC","file":"bulma.css"} \ No newline at end of file From 9372edb526bbbaefff1fcc34a3d243f1979ab859 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 11:57:29 +0100 Subject: [PATCH 272/853] =?UTF-8?q?=F0=9F=94=A5=20[pagetop]=20jQuery=20ya?= =?UTF-8?q?=20no=20est=C3=A1=20incluido=20en=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/static/theme/js/jquery.min.js | 2 -- pagetop/static/theme/js/jquery.min.map | 1 - 2 files changed, 3 deletions(-) delete mode 100644 pagetop/static/theme/js/jquery.min.js delete mode 100644 pagetop/static/theme/js/jquery.min.map diff --git a/pagetop/static/theme/js/jquery.min.js b/pagetop/static/theme/js/jquery.min.js deleted file mode 100644 index c4c6022f..00000000 --- a/pagetop/static/theme/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); diff --git a/pagetop/static/theme/js/jquery.min.map b/pagetop/static/theme/js/jquery.min.map deleted file mode 100644 index 7d86eb16..00000000 --- a/pagetop/static/theme/js/jquery.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file From ce4a97b18f5e5690fa39ad9fdb011906ad3ef03f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 14:31:18 +0100 Subject: [PATCH 273/853] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20[pagetop]=20Mejor?= =?UTF-8?q?=20uso=20de=20traits=20en=20m=C3=B3dulos/temas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/theme.rs | 2 +- pagetop/src/core/theme/all.rs | 17 +++++++++-------- pagetop/src/core/theme/definition.rs | 14 ++------------ 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 50bee917..8bed3f28 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -83,7 +83,7 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { pub fn register_themes() { for m in ENABLED_MODULES.read().unwrap().iter() { - theme::all::register_theme(m.handle(), m.theme()); + theme::all::register_theme(m.theme()); } } diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 6e008d80..67902dcb 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -1,4 +1,4 @@ mod definition; -pub use definition::{BaseTheme, ThemeStaticRef, ThemeTrait}; +pub use definition::{ThemeStaticRef, ThemeTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 2bbc81a7..9b876356 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,31 +1,32 @@ use super::ThemeStaticRef; -use crate::util::Handle; use crate::{trace, LazyStatic}; use std::sync::RwLock; // Temas registrados. -static THEMES: LazyStatic<RwLock<Vec<(Handle, ThemeStaticRef)>>> = +static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); -pub fn register_theme(handle: Handle, theme: Option<ThemeStaticRef>) { +pub fn register_theme(theme: Option<ThemeStaticRef>) { if let Some(theme) = theme { + let handle = theme.handle(); let mut registered_themes = THEMES.write().unwrap(); - if !registered_themes.iter().any(|t| t.0 == handle) { + if !registered_themes.iter().any(|t| t.handle() == handle) { trace::debug!("Registering theme \"{}\"", theme.single_name()); - registered_themes.push((handle, theme)); + registered_themes.push(theme); } } } pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { + let single_name = single_name.to_lowercase(); match THEMES - .write() + .read() .unwrap() .iter() - .find(|t| t.1.single_name().to_lowercase() == single_name.to_lowercase()) + .find(|t| t.single_name().to_lowercase() == single_name) { - Some((_, theme)) => Some(*theme), + Some(theme) => Some(*theme), _ => None, } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index ddec7246..6c130878 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,18 +1,14 @@ use crate::base::component::{Container, Html}; use crate::core::component::{ComponentTrait, RenderContext}; +use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; -use crate::util::single_type_name; use crate::{concat_string, config}; pub type ThemeStaticRef = &'static dyn ThemeTrait; -pub trait BaseTheme { - fn single_name(&self) -> &'static str; -} - /// Los temas deben implementar este "trait". -pub trait ThemeTrait: BaseTheme + Send + Sync { +pub trait ThemeTrait: ModuleTrait + Send + Sync { #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { if page.favicon().is_none() { @@ -139,9 +135,3 @@ pub trait ThemeTrait: BaseTheme + Send + Sync { })) } } - -impl<T: ?Sized + ThemeTrait> BaseTheme for T { - fn single_name(&self) -> &'static str { - single_type_name::<Self>() - } -} From 3839d1c51cc9d6ae6dcb9fa5aad8b0286b489d32 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 14:40:36 +0100 Subject: [PATCH 274/853] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20[pagetop]=20Mejor?= =?UTF-8?q?=20uso=20de=20traits=20en=20m=C3=B3dulos/comp.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 10 ++++++---- pagetop/src/base/component/block.rs | 10 ++++++---- pagetop/src/base/component/container.rs | 10 ++++++---- pagetop/src/base/component/form_element/button.rs | 10 ++++++---- pagetop/src/base/component/form_element/date.rs | 10 ++++++---- pagetop/src/base/component/form_element/form.rs | 10 ++++++---- pagetop/src/base/component/form_element/hidden.rs | 10 ++++++---- pagetop/src/base/component/form_element/input.rs | 10 ++++++---- pagetop/src/base/component/grid/column.rs | 10 ++++++---- pagetop/src/base/component/grid/row.rs | 10 ++++++---- pagetop/src/base/component/heading.rs | 10 ++++++---- pagetop/src/base/component/html.rs | 10 ++++++---- pagetop/src/base/component/icon.rs | 10 ++++++---- pagetop/src/base/component/image.rs | 10 ++++++---- pagetop/src/base/component/paragraph.rs | 10 ++++++---- pagetop/src/core/component/definition.rs | 14 ++------------ 16 files changed, 92 insertions(+), 72 deletions(-) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 0ab91907..6f345a81 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -38,15 +38,17 @@ pub struct Anchor { template : String, } +impl ModuleTrait for Anchor { + fn handle(&self) -> Handle { + COMPONENT_ANCHOR + } +} + impl ComponentTrait for Anchor { fn new() -> Self { Anchor::default() } - fn handle(&self) -> Handle { - COMPONENT_ANCHOR - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index a97b18f4..06f955df 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -16,15 +16,17 @@ pub struct Block { template : String, } +impl ModuleTrait for Block { + fn handle(&self) -> Handle { + COMPONENT_BLOCK + } +} + impl ComponentTrait for Block { fn new() -> Self { Block::default().with_classes(ClassesOp::SetDefault, "block") } - fn handle(&self) -> Handle { - COMPONENT_BLOCK - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index 55081a9d..c351a1e5 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -27,6 +27,12 @@ pub struct Container { template : String, } +impl ModuleTrait for Container { + fn handle(&self) -> Handle { + COMPONENT_CONTAINER + } +} + impl ComponentTrait for Container { fn new() -> Self { Container::default() @@ -34,10 +40,6 @@ impl ComponentTrait for Container { .with_inner_classes(ClassesOp::SetDefault, "container") } - fn handle(&self) -> Handle { - COMPONENT_CONTAINER - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index c9eb1fc1..616df9c1 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -24,6 +24,12 @@ pub struct Button { template : String, } +impl ModuleTrait for Button { + fn handle(&self) -> Handle { + COMPONENT_BUTTON + } +} + impl ComponentTrait for Button { fn new() -> Self { Button::default() @@ -31,10 +37,6 @@ impl ComponentTrait for Button { .with_classes(ClassesOp::AddFirst, "form-button") } - fn handle(&self) -> Handle { - COMPONENT_BUTTON - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index c35cc185..b6f675bd 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -21,6 +21,12 @@ pub struct Date { template : String, } +impl ModuleTrait for Date { + fn handle(&self) -> Handle { + COMPONENT_DATE + } +} + impl ComponentTrait for Date { fn new() -> Self { Date::default() @@ -28,10 +34,6 @@ impl ComponentTrait for Date { .with_classes(ClassesOp::AddFirst, "form-type-date") } - fn handle(&self) -> Handle { - COMPONENT_DATE - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 78a90c52..12d3c384 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -25,6 +25,12 @@ pub struct Form { template : String, } +impl ModuleTrait for Form { + fn handle(&self) -> Handle { + COMPONENT_FORM + } +} + impl ComponentTrait for Form { fn new() -> Self { Form::default() @@ -32,10 +38,6 @@ impl ComponentTrait for Form { .with_charset("UTF-8") } - fn handle(&self) -> Handle { - COMPONENT_FORM - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 034b0bde..298bbdcd 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -10,15 +10,17 @@ pub struct Hidden { value : AttributeValue, } +impl ModuleTrait for Hidden { + fn handle(&self) -> Handle { + COMPONENT_HIDDEN + } +} + impl ComponentTrait for Hidden { fn new() -> Self { Hidden::default() } - fn handle(&self) -> Handle { - COMPONENT_HIDDEN - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 6ff17690..73840429 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -36,6 +36,12 @@ pub struct Input { template : String, } +impl ModuleTrait for Input { + fn handle(&self) -> Handle { + COMPONENT_INPUT + } +} + impl ComponentTrait for Input { fn new() -> Self { Input::default() @@ -45,10 +51,6 @@ impl ComponentTrait for Input { .with_maxlength(Some(128)) } - fn handle(&self) -> Handle { - COMPONENT_INPUT - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index 51271c5d..cb8b1087 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -48,15 +48,17 @@ pub struct Column { template : String, } +impl ModuleTrait for Column { + fn handle(&self) -> Handle { + COMPONENT_COLUMN + } +} + impl ComponentTrait for Column { fn new() -> Self { Column::default().with_classes(ClassesOp::SetDefault, SIZE__DEFAULT) } - fn handle(&self) -> Handle { - COMPONENT_COLUMN - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 8371dadd..899c50f7 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -15,15 +15,17 @@ pub struct Row { template : String, } +impl ModuleTrait for Row { + fn handle(&self) -> Handle { + COMPONENT_ROW + } +} + impl ComponentTrait for Row { fn new() -> Self { Row::default().with_classes(ClassesOp::SetDefault, "row") } - fn handle(&self) -> Handle { - COMPONENT_ROW - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index fb554b32..888fa4cb 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -38,15 +38,17 @@ pub struct Heading { template : String, } +impl ModuleTrait for Heading { + fn handle(&self) -> Handle { + COMPONENT_HEADING + } +} + impl ComponentTrait for Heading { fn new() -> Self { Heading::default() } - fn handle(&self) -> Handle { - COMPONENT_HEADING - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 2f135d46..7c403f5b 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -11,15 +11,17 @@ pub struct Html { template : String, } +impl ModuleTrait for Html { + fn handle(&self) -> Handle { + COMPONENT_HTML + } +} + impl ComponentTrait for Html { fn new() -> Self { Html::default() } - fn handle(&self) -> Handle { - COMPONENT_HTML - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 8282c631..c1612836 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -11,15 +11,17 @@ pub struct Icon { classes : Classes, } +impl ModuleTrait for Icon { + fn handle(&self) -> Handle { + COMPONENT_ICON + } +} + impl ComponentTrait for Icon { fn new() -> Self { Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") } - fn handle(&self) -> Handle { - COMPONENT_ICON - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index e8e9def6..e2dd1ba7 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -13,15 +13,17 @@ pub struct Image { template : String, } +impl ModuleTrait for Image { + fn handle(&self) -> Handle { + COMPONENT_IMAGE + } +} + impl ComponentTrait for Image { fn new() -> Self { Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") } - fn handle(&self) -> Handle { - COMPONENT_IMAGE - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 2ae521f8..46edaa31 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -25,15 +25,17 @@ pub struct Paragraph { template : String, } +impl ModuleTrait for Paragraph { + fn handle(&self) -> Handle { + COMPONENT_PARAGRAPH + } +} + impl ComponentTrait for Paragraph { fn new() -> Self { Paragraph::default() } - fn handle(&self) -> Handle { - COMPONENT_PARAGRAPH - } - fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 14608885..78943fe1 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,7 @@ use super::RenderContext; +use crate::core::module::ModuleTrait; use crate::html::{html, Markup}; -use crate::util::{single_type_name, Handle}; pub use std::any::Any as AnyComponent; @@ -9,21 +9,11 @@ pub trait BaseComponent { fn render(&mut self, rcx: &mut RenderContext) -> Markup; } -pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { +pub trait ComponentTrait: AnyComponent + BaseComponent + ModuleTrait + Send + Sync { fn new() -> Self where Self: Sized; - fn handle(&self) -> Handle; - - fn name(&self) -> String { - single_type_name::<Self>().to_owned() - } - - fn description(&self) -> Option<String> { - None - } - fn weight(&self) -> isize { 0 } From a28269796a89fbede2662129c413a737a409212b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 19:09:44 +0100 Subject: [PATCH 275/853] =?UTF-8?q?=E2=8F=AA=20Revierte=20=C3=BAltima=20co?= =?UTF-8?q?nfirmaci=C3=B3n=20de=20cambios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 10 ++++------ pagetop/src/base/component/block.rs | 10 ++++------ pagetop/src/base/component/container.rs | 10 ++++------ pagetop/src/base/component/form_element/button.rs | 10 ++++------ pagetop/src/base/component/form_element/date.rs | 10 ++++------ pagetop/src/base/component/form_element/form.rs | 10 ++++------ pagetop/src/base/component/form_element/hidden.rs | 10 ++++------ pagetop/src/base/component/form_element/input.rs | 10 ++++------ pagetop/src/base/component/grid/column.rs | 10 ++++------ pagetop/src/base/component/grid/row.rs | 10 ++++------ pagetop/src/base/component/heading.rs | 10 ++++------ pagetop/src/base/component/html.rs | 10 ++++------ pagetop/src/base/component/icon.rs | 10 ++++------ pagetop/src/base/component/image.rs | 10 ++++------ pagetop/src/base/component/paragraph.rs | 10 ++++------ pagetop/src/core/component/definition.rs | 14 ++++++++++++-- 16 files changed, 72 insertions(+), 92 deletions(-) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 6f345a81..0ab91907 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -38,17 +38,15 @@ pub struct Anchor { template : String, } -impl ModuleTrait for Anchor { - fn handle(&self) -> Handle { - COMPONENT_ANCHOR - } -} - impl ComponentTrait for Anchor { fn new() -> Self { Anchor::default() } + fn handle(&self) -> Handle { + COMPONENT_ANCHOR + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 06f955df..a97b18f4 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -16,17 +16,15 @@ pub struct Block { template : String, } -impl ModuleTrait for Block { - fn handle(&self) -> Handle { - COMPONENT_BLOCK - } -} - impl ComponentTrait for Block { fn new() -> Self { Block::default().with_classes(ClassesOp::SetDefault, "block") } + fn handle(&self) -> Handle { + COMPONENT_BLOCK + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs index c351a1e5..55081a9d 100644 --- a/pagetop/src/base/component/container.rs +++ b/pagetop/src/base/component/container.rs @@ -27,12 +27,6 @@ pub struct Container { template : String, } -impl ModuleTrait for Container { - fn handle(&self) -> Handle { - COMPONENT_CONTAINER - } -} - impl ComponentTrait for Container { fn new() -> Self { Container::default() @@ -40,6 +34,10 @@ impl ComponentTrait for Container { .with_inner_classes(ClassesOp::SetDefault, "container") } + fn handle(&self) -> Handle { + COMPONENT_CONTAINER + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index 616df9c1..c9eb1fc1 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -24,12 +24,6 @@ pub struct Button { template : String, } -impl ModuleTrait for Button { - fn handle(&self) -> Handle { - COMPONENT_BUTTON - } -} - impl ComponentTrait for Button { fn new() -> Self { Button::default() @@ -37,6 +31,10 @@ impl ComponentTrait for Button { .with_classes(ClassesOp::AddFirst, "form-button") } + fn handle(&self) -> Handle { + COMPONENT_BUTTON + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index b6f675bd..c35cc185 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -21,12 +21,6 @@ pub struct Date { template : String, } -impl ModuleTrait for Date { - fn handle(&self) -> Handle { - COMPONENT_DATE - } -} - impl ComponentTrait for Date { fn new() -> Self { Date::default() @@ -34,6 +28,10 @@ impl ComponentTrait for Date { .with_classes(ClassesOp::AddFirst, "form-type-date") } + fn handle(&self) -> Handle { + COMPONENT_DATE + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index 12d3c384..78a90c52 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -25,12 +25,6 @@ pub struct Form { template : String, } -impl ModuleTrait for Form { - fn handle(&self) -> Handle { - COMPONENT_FORM - } -} - impl ComponentTrait for Form { fn new() -> Self { Form::default() @@ -38,6 +32,10 @@ impl ComponentTrait for Form { .with_charset("UTF-8") } + fn handle(&self) -> Handle { + COMPONENT_FORM + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 298bbdcd..034b0bde 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -10,17 +10,15 @@ pub struct Hidden { value : AttributeValue, } -impl ModuleTrait for Hidden { - fn handle(&self) -> Handle { - COMPONENT_HIDDEN - } -} - impl ComponentTrait for Hidden { fn new() -> Self { Hidden::default() } + fn handle(&self) -> Handle { + COMPONENT_HIDDEN + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 73840429..6ff17690 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -36,12 +36,6 @@ pub struct Input { template : String, } -impl ModuleTrait for Input { - fn handle(&self) -> Handle { - COMPONENT_INPUT - } -} - impl ComponentTrait for Input { fn new() -> Self { Input::default() @@ -51,6 +45,10 @@ impl ComponentTrait for Input { .with_maxlength(Some(128)) } + fn handle(&self) -> Handle { + COMPONENT_INPUT + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs index cb8b1087..51271c5d 100644 --- a/pagetop/src/base/component/grid/column.rs +++ b/pagetop/src/base/component/grid/column.rs @@ -48,17 +48,15 @@ pub struct Column { template : String, } -impl ModuleTrait for Column { - fn handle(&self) -> Handle { - COMPONENT_COLUMN - } -} - impl ComponentTrait for Column { fn new() -> Self { Column::default().with_classes(ClassesOp::SetDefault, SIZE__DEFAULT) } + fn handle(&self) -> Handle { + COMPONENT_COLUMN + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs index 899c50f7..8371dadd 100644 --- a/pagetop/src/base/component/grid/row.rs +++ b/pagetop/src/base/component/grid/row.rs @@ -15,17 +15,15 @@ pub struct Row { template : String, } -impl ModuleTrait for Row { - fn handle(&self) -> Handle { - COMPONENT_ROW - } -} - impl ComponentTrait for Row { fn new() -> Self { Row::default().with_classes(ClassesOp::SetDefault, "row") } + fn handle(&self) -> Handle { + COMPONENT_ROW + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 888fa4cb..fb554b32 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -38,17 +38,15 @@ pub struct Heading { template : String, } -impl ModuleTrait for Heading { - fn handle(&self) -> Handle { - COMPONENT_HEADING - } -} - impl ComponentTrait for Heading { fn new() -> Self { Heading::default() } + fn handle(&self) -> Handle { + COMPONENT_HEADING + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 7c403f5b..2f135d46 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -11,17 +11,15 @@ pub struct Html { template : String, } -impl ModuleTrait for Html { - fn handle(&self) -> Handle { - COMPONENT_HTML - } -} - impl ComponentTrait for Html { fn new() -> Self { Html::default() } + fn handle(&self) -> Handle { + COMPONENT_HTML + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index c1612836..8282c631 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -11,17 +11,15 @@ pub struct Icon { classes : Classes, } -impl ModuleTrait for Icon { - fn handle(&self) -> Handle { - COMPONENT_ICON - } -} - impl ComponentTrait for Icon { fn new() -> Self { Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") } + fn handle(&self) -> Handle { + COMPONENT_ICON + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index e2dd1ba7..e8e9def6 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -13,17 +13,15 @@ pub struct Image { template : String, } -impl ModuleTrait for Image { - fn handle(&self) -> Handle { - COMPONENT_IMAGE - } -} - impl ComponentTrait for Image { fn new() -> Self { Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") } + fn handle(&self) -> Handle { + COMPONENT_IMAGE + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 46edaa31..2ae521f8 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -25,17 +25,15 @@ pub struct Paragraph { template : String, } -impl ModuleTrait for Paragraph { - fn handle(&self) -> Handle { - COMPONENT_PARAGRAPH - } -} - impl ComponentTrait for Paragraph { fn new() -> Self { Paragraph::default() } + fn handle(&self) -> Handle { + COMPONENT_PARAGRAPH + } + fn weight(&self) -> isize { self.weight } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 78943fe1..14608885 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,7 @@ use super::RenderContext; -use crate::core::module::ModuleTrait; use crate::html::{html, Markup}; +use crate::util::{single_type_name, Handle}; pub use std::any::Any as AnyComponent; @@ -9,11 +9,21 @@ pub trait BaseComponent { fn render(&mut self, rcx: &mut RenderContext) -> Markup; } -pub trait ComponentTrait: AnyComponent + BaseComponent + ModuleTrait + Send + Sync { +pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { fn new() -> Self where Self: Sized; + fn handle(&self) -> Handle; + + fn name(&self) -> String { + single_type_name::<Self>().to_owned() + } + + fn description(&self) -> Option<String> { + None + } + fn weight(&self) -> isize { 0 } From e7ca8f53b0d6269d301854f6cd72348df0457372 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 19:37:13 +0100 Subject: [PATCH 276/853] =?UTF-8?q?=F0=9F=8E=A8=20[jquery]=20Carga=20la=20?= =?UTF-8?q?librer=C3=ADa=20seg=C3=BAn=20versi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/src/lib.rs | 3 +-- pagetop-jquery/static/{js => 3.6.0}/jquery.min.js | 0 pagetop-jquery/static/{js => 3.6.0}/jquery.min.map | 0 3 files changed, 1 insertion(+), 2 deletions(-) rename pagetop-jquery/static/{js => 3.6.0}/jquery.min.js (100%) rename pagetop-jquery/static/{js => 3.6.0}/jquery.min.map (100%) diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 20280e44..63322f49 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -5,7 +5,7 @@ pub_handle!(MODULE_JQUERY); include!(concat!(env!("OUT_DIR"), "/jquery.rs")); const JQUERY_PARAM: &str = "jquery.add"; -const JQUERY_SOURCE: &str = "/jquery/js/jquery.min.js"; +const JQUERY_SOURCE: &str = "/jquery/3.6.0/jquery.min.js"; pub struct JQuery; @@ -26,7 +26,6 @@ impl JQuery { _ => { rcx.alter(ContextOp::AddJavaScript( JavaScript::located(JQUERY_SOURCE) - .with_version("3.6.0") .with_weight(isize::MIN) .with_mode(ModeJS::Normal), )); diff --git a/pagetop-jquery/static/js/jquery.min.js b/pagetop-jquery/static/3.6.0/jquery.min.js similarity index 100% rename from pagetop-jquery/static/js/jquery.min.js rename to pagetop-jquery/static/3.6.0/jquery.min.js diff --git a/pagetop-jquery/static/js/jquery.min.map b/pagetop-jquery/static/3.6.0/jquery.min.map similarity index 100% rename from pagetop-jquery/static/js/jquery.min.map rename to pagetop-jquery/static/3.6.0/jquery.min.map From 84f1fc4a5c0bb8b3b14269cb29c94e1b6b11f426 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 19:56:47 +0100 Subject: [PATCH 277/853] =?UTF-8?q?=F0=9F=A9=B9=20Corrige=20orden=20de=20m?= =?UTF-8?q?=C3=B3dulos=20y=20tema=20predefinidos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/all.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 8bed3f28..0a4efb55 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,6 +1,6 @@ use super::ModuleStaticRef; -use crate::base::module; +use crate::base; use crate::core::hook::add_action; use crate::core::theme; use crate::{server, trace, LazyStatic}; @@ -27,15 +27,15 @@ pub fn register_modules(app: ModuleStaticRef) { // List of modules to enable. let mut list: Vec<ModuleStaticRef> = Vec::new(); - // Enable base modules. - add_to_enabled(&mut list, &module::menu::Menu); + // 1 of 3. Enable base modules. + add_to_enabled(&mut list, &base::module::menu::Menu); + add_to_enabled(&mut list, &base::theme::Saturn); - // Enable application modules. + // 2 of 3. Enable application modules. add_to_enabled(&mut list, app); - // Enable default homepage. - add_to_enabled(&mut list, &module::homepage::DefaultHomePage); - add_to_enabled(&mut list, &crate::base::theme::Saturn); + // 3 of 3. Enable default homepage. + add_to_enabled(&mut list, &base::module::homepage::DefaultHomePage); list.reverse(); ENABLED_MODULES.write().unwrap().append(&mut list); From 8ec2c698c83d3a0f091e8b51be77b60a4d74e24a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 21:46:21 +0100 Subject: [PATCH 278/853] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20[pagetop]=20Un=20t?= =?UTF-8?q?ema=20es=20ahora=20un=20tipo=20de=20m=C3=B3dulo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- pagetop/src/app.rs | 3 - pagetop/src/base.rs | 1 - pagetop/src/base/module.rs | 2 +- .../src/base/{theme.rs => module/saturn.rs} | 0 pagetop/src/core.rs | 5 +- pagetop/src/core/component/context.rs | 4 +- pagetop/src/core/module.rs | 7 +- pagetop/src/core/module/all.rs | 71 ++++++++++++------- .../core/module/{definition.rs => module.rs} | 5 +- .../{theme/definition.rs => module/theme.rs} | 3 +- pagetop/src/core/theme.rs | 4 -- pagetop/src/core/theme/all.rs | 32 --------- pagetop/src/prelude.rs | 2 +- 14 files changed, 61 insertions(+), 80 deletions(-) rename pagetop/src/base/{theme.rs => module/saturn.rs} (100%) rename pagetop/src/core/module/{definition.rs => module.rs} (92%) rename pagetop/src/core/{theme/definition.rs => module/theme.rs} (99%) delete mode 100644 pagetop/src/core/theme.rs delete mode 100644 pagetop/src/core/theme/all.rs diff --git a/drust/src/main.rs b/drust/src/main.rs index 91f4cc8e..4d12012c 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -23,7 +23,7 @@ impl ModuleTrait for Drust { ] } - fn uninstall_modules(&self) -> Vec<ModuleStaticRef> { + fn drop_modules(&self) -> Vec<ModuleStaticRef> { vec![ // &pagetop_node::Node ] diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index eebc7041..f4f08b3a 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -33,9 +33,6 @@ impl Application { // Registra los módulos de la aplicación. module::all::register_modules(app); - // Registra los temas de los módulos. - module::all::register_themes(); - // Registra acciones de los módulos. module::all::register_actions(); diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index d58aa565..74a98984 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,3 +1,2 @@ pub mod component; pub mod module; -pub mod theme; diff --git a/pagetop/src/base/module.rs b/pagetop/src/base/module.rs index ca296b77..b3ec2650 100644 --- a/pagetop/src/base/module.rs +++ b/pagetop/src/base/module.rs @@ -1,3 +1,3 @@ +pub mod saturn; pub mod menu; - pub mod homepage; diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/module/saturn.rs similarity index 100% rename from pagetop/src/base/theme.rs rename to pagetop/src/base/module/saturn.rs diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index 3d09c260..616ebedb 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -4,8 +4,5 @@ pub mod component; // API to define functions that alter the behavior of PageTop core. pub mod hook; -// API to add new features with modules. +// API to add new features with modules and themes. pub mod module; - -// API to create themes. -pub mod theme; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 8e25858a..c426424b 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,4 +1,4 @@ -use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; +use crate::core::module::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; use crate::server::HttpRequest; use crate::{base, concat_string, config, util, LazyStatic}; @@ -9,7 +9,7 @@ use std::str::FromStr; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &base::theme::Saturn, + None => &base::module::saturn::Saturn, }); pub enum ContextOp { diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index 0ecfbc65..53b54c84 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,4 +1,7 @@ -mod definition; -pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait}; +mod module; +pub use module::{BaseModule, ModuleStaticRef, ModuleTrait}; + +mod theme; +pub use theme::{ThemeStaticRef, ThemeTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 0a4efb55..453d07ff 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,8 +1,7 @@ -use super::ModuleStaticRef; +use super::{ModuleStaticRef, ThemeStaticRef}; use crate::base; use crate::core::hook::add_action; -use crate::core::theme; use crate::{server, trace, LazyStatic}; #[cfg(feature = "database")] @@ -10,26 +9,46 @@ use crate::{db::*, run_now}; use std::sync::RwLock; -// REGISTER MODULES ******************************************************************************** +// MODULES ***************************************************************************************** static ENABLED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); -static DISCARDED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = +static DROPPED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); +// THEMES ****************************************************************************************** + +static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = + LazyStatic::new(|| RwLock::new(Vec::new())); + +pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { + let single_name = single_name.to_lowercase(); + match THEMES + .read() + .unwrap() + .iter() + .find(|t| t.single_name().to_lowercase() == single_name) + { + Some(theme) => Some(*theme), + _ => None, + } +} + +// REGISTER MODULES ******************************************************************************** + pub fn register_modules(app: ModuleStaticRef) { - // List of modules to disable. + // List of modules to drop. let mut list: Vec<ModuleStaticRef> = Vec::new(); - add_to_discarded(&mut list, app); - DISCARDED_MODULES.write().unwrap().append(&mut list); + add_to_dropped(&mut list, app); + DROPPED_MODULES.write().unwrap().append(&mut list); // List of modules to enable. let mut list: Vec<ModuleStaticRef> = Vec::new(); // 1 of 3. Enable base modules. add_to_enabled(&mut list, &base::module::menu::Menu); - add_to_enabled(&mut list, &base::theme::Saturn); + add_to_enabled(&mut list, &base::module::saturn::Saturn); // 2 of 3. Enable application modules. add_to_enabled(&mut list, app); @@ -41,28 +60,28 @@ pub fn register_modules(app: ModuleStaticRef) { ENABLED_MODULES.write().unwrap().append(&mut list); } -fn add_to_discarded(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { - for u in module.uninstall_modules().iter() { - if !list.iter().any(|m| m.handle() == u.handle()) { - list.push(*u); - trace::debug!("Module \"{}\" discarded", u.single_name()); +fn add_to_dropped(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { + for d in module.drop_modules().iter() { + if !list.iter().any(|m| m.handle() == d.handle()) { + list.push(*d); + trace::debug!("Module \"{}\" dropped", d.single_name()); } } for d in module.dependencies().iter() { - add_to_discarded(list, *d); + add_to_dropped(list, *d); } } fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { if !list.iter().any(|m| m.handle() == module.handle()) { - if DISCARDED_MODULES + if DROPPED_MODULES .read() .unwrap() .iter() .any(|m| m.handle() == module.handle()) { panic!( - "Trying to enable \"{}\" module which is disabled", + "Trying to enable \"{}\" module which is dropped", module.single_name() ); } else { @@ -74,19 +93,19 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { add_to_enabled(list, *d); } - trace::debug!("Enabling \"{}\" module", module.single_name()); + if let Some(theme) = module.theme() { + let mut registered_themes = THEMES.write().unwrap(); + if !registered_themes.iter().any(|t| t.handle() == theme.handle()) { + registered_themes.push(theme); + trace::debug!("Enabling \"{}\" theme", theme.single_name()); + } + } else { + trace::debug!("Enabling \"{}\" module", module.single_name()); + } } } } -// REGISTER THEMES ********************************************************************************* - -pub fn register_themes() { - for m in ENABLED_MODULES.read().unwrap().iter() { - theme::all::register_theme(m.theme()); - } -} - // REGISTER ACTIONS ******************************************************************************** pub fn register_actions() { @@ -130,7 +149,7 @@ pub fn run_migrations() { impl MigratorTrait for Migrator { fn migrations() -> Vec<MigrationItem> { let mut migrations = vec![]; - for m in DISCARDED_MODULES.read().unwrap().iter() { + for m in DROPPED_MODULES.read().unwrap().iter() { migrations.append(&mut m.migrations()); } migrations diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/module.rs similarity index 92% rename from pagetop/src/core/module/definition.rs rename to pagetop/src/core/module/module.rs index 31d7a566..db155221 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/module.rs @@ -1,5 +1,6 @@ +use super::ThemeStaticRef; + use crate::core::hook::HookAction; -use crate::core::theme::ThemeStaticRef; use crate::server; use crate::util::{single_type_name, Handle}; @@ -32,7 +33,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } - fn uninstall_modules(&self) -> Vec<ModuleStaticRef> { + fn drop_modules(&self) -> Vec<ModuleStaticRef> { vec![] } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/module/theme.rs similarity index 99% rename from pagetop/src/core/theme/definition.rs rename to pagetop/src/core/module/theme.rs index 6c130878..77918dab 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/module/theme.rs @@ -1,6 +1,7 @@ +use super::ModuleTrait; + use crate::base::component::{Container, Html}; use crate::core::component::{ComponentTrait, RenderContext}; -use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; use crate::{concat_string, config}; diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs deleted file mode 100644 index 67902dcb..00000000 --- a/pagetop/src/core/theme.rs +++ /dev/null @@ -1,4 +0,0 @@ -mod definition; -pub use definition::{ThemeStaticRef, ThemeTrait}; - -pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs deleted file mode 100644 index 9b876356..00000000 --- a/pagetop/src/core/theme/all.rs +++ /dev/null @@ -1,32 +0,0 @@ -use super::ThemeStaticRef; -use crate::{trace, LazyStatic}; - -use std::sync::RwLock; - -// Temas registrados. -static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = - LazyStatic::new(|| RwLock::new(Vec::new())); - -pub fn register_theme(theme: Option<ThemeStaticRef>) { - if let Some(theme) = theme { - let handle = theme.handle(); - let mut registered_themes = THEMES.write().unwrap(); - if !registered_themes.iter().any(|t| t.handle() == handle) { - trace::debug!("Registering theme \"{}\"", theme.single_name()); - registered_themes.push(theme); - } - } -} - -pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { - let single_name = single_name.to_lowercase(); - match THEMES - .read() - .unwrap() - .iter() - .find(|t| t.single_name().to_lowercase() == single_name) - { - Some(theme) => Some(*theme), - _ => None, - } -} diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 0a4a4869..1e6a7cce 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -19,7 +19,7 @@ pub use crate::html::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; -pub use crate::core::{component::*, hook::*, module::*, theme::*}; +pub use crate::core::{component::*, hook::*, module::*}; pub use crate::{hook_action, hook_before_render_component}; From b02c72986457f73a2c0949c32611ab31b3c4346c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 22:25:34 +0100 Subject: [PATCH 279/853] =?UTF-8?q?=F0=9F=8E=89=20[megamenu]=20Nuevo=20com?= =?UTF-8?q?ponente=20para=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + pagetop-admin/Cargo.toml | 2 + pagetop-admin/src/lib.rs | 12 +- pagetop-admin/src/summary.rs | 80 +++++++------ pagetop-megamenu/Cargo.toml | 23 ++++ pagetop-megamenu/README.md | 26 +++++ pagetop-megamenu/build.rs | 3 + .../src/component.rs | 110 +++++++++--------- pagetop-megamenu/src/lib.rs | 23 ++++ .../static}/css/menu-blue.css | 0 .../static}/css/menu-clean.css | 0 .../static}/css/menu-mint.css | 0 .../static}/css/menu-simple.css | 0 .../static}/css/menu.css | 0 .../static}/js/menu.min.js | 0 pagetop/src/base/component.rs | 2 - pagetop/src/core/component/definition.rs | 4 +- pagetop/src/lib.rs | 1 + pagetop/src/prelude.rs | 2 +- 19 files changed, 184 insertions(+), 105 deletions(-) create mode 100644 pagetop-megamenu/Cargo.toml create mode 100644 pagetop-megamenu/README.md create mode 100644 pagetop-megamenu/build.rs rename pagetop/src/base/component/menu.rs => pagetop-megamenu/src/component.rs (65%) create mode 100644 pagetop-megamenu/src/lib.rs rename {pagetop/static/theme/menu => pagetop-megamenu/static}/css/menu-blue.css (100%) rename {pagetop/static/theme/menu => pagetop-megamenu/static}/css/menu-clean.css (100%) rename {pagetop/static/theme/menu => pagetop-megamenu/static}/css/menu-mint.css (100%) rename {pagetop/static/theme/menu => pagetop-megamenu/static}/css/menu-simple.css (100%) rename {pagetop/static/theme/menu => pagetop-megamenu/static}/css/menu.css (100%) rename {pagetop/static/theme/menu => pagetop-megamenu/static}/js/menu.min.js (100%) diff --git a/Cargo.toml b/Cargo.toml index 99c94fa6..fa5648e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "pagetop-macros", "pagetop-build", "pagetop-jquery", + "pagetop-megamenu", # Modules. "pagetop-admin", "pagetop-user", diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 6ae6ff0d..66da0dfe 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -15,4 +15,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } +pagetop-megamenu = { path = "../pagetop-megamenu", version = "0.0" } + maud = "0.24.0" diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 80e3b17e..89cfdaa4 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -21,15 +21,19 @@ impl ModuleTrait for Admin { Some(l("module_description")) } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - cfg.service( - server::web::scope("/admin").route("", server::web::get().to(summary::summary)), - ); + fn dependencies(&self) -> Vec<ModuleStaticRef> { + vec![&pagetop_megamenu::MegaMenu] } fn actions(&self) -> Vec<HookAction> { vec![hook_action!(BeforeRenderPageHook => before_render_page)] } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + cfg.service( + server::web::scope("/admin").route("", server::web::get().to(summary::summary)), + ); + } } fn before_render_page(page: &mut Page) { diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index a0f98401..1851b773 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,60 +1,58 @@ -//use super::l; +use super::l; use pagetop::prelude::*; +use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { - /* - let top_menu = Menu::new() - .with_item(MenuItem::label(l("module_name").as_str())) - .with_item(MenuItem::link("Opción 2", "https://www.google.es")) - .with_item(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .with_item(MenuItem::submenu( + let top_menu = MegaMenu::new() + .with_item(MegaMenuItem::label(l("module_name").as_str())) + .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) + .with_item(MegaMenuItem::link_blank("Opción 3", "https://www.google.es")) + .with_item(MegaMenuItem::submenu( "Submenú 1", - Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")), + MegaMenu::new() + .with_item(MegaMenuItem::label("Opción 1")) + .with_item(MegaMenuItem::label("Opción 2")), )) - .with_item(MenuItem::separator()) - .with_item(MenuItem::submenu( + .with_item(MegaMenuItem::separator()) + .with_item(MegaMenuItem::submenu( "Submenú 2", - Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")), + MegaMenu::new() + .with_item(MegaMenuItem::label("Opción 1")) + .with_item(MegaMenuItem::label("Opción 2")), )) - .with_item(MenuItem::label("Opción 4")); + .with_item(MegaMenuItem::label("Opción 4")); - let side_menu = Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::link("Opción 2", "https://www.google.es")) - .with_item(MenuItem::link_blank("Opción 3", "https://www.google.es")) - .with_item(MenuItem::submenu( + let side_menu = MegaMenu::new() + .with_item(MegaMenuItem::label("Opción 1")) + .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) + .with_item(MegaMenuItem::link_blank("Opción 3", "https://www.google.es")) + .with_item(MegaMenuItem::submenu( "Submenú 1", - Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")), + MegaMenu::new() + .with_item(MegaMenuItem::label("Opción 1")) + .with_item(MegaMenuItem::label("Opción 2")), )) - .with_item(MenuItem::separator()) - .with_item(MenuItem::submenu( + .with_item(MegaMenuItem::separator()) + .with_item(MegaMenuItem::submenu( "Submenú 2", - Menu::new() - .with_item(MenuItem::label("Opción 1")) - .with_item(MenuItem::label("Opción 2")), + MegaMenu::new() + .with_item(MegaMenuItem::label("Opción 1")) + .with_item(MegaMenuItem::label("Opción 2")), )) - .with_item(MenuItem::label("Opción 4")); - */ + .with_item(MegaMenuItem::label("Opción 4")); Page::new(request) .with_context(ContextOp::Theme("Bootsier")) .with_title("Admin") - /* .with_this_in("top-menu", top_menu) - .with_this_in( - "region-content", - grid::Row::new() - .with_column(grid::Column::new().with_component(side_menu)) - .with_column(grid::Column::new().with_component(Html::with(html! { - p { "Columna 2"} - }))), - ) - */ + .with_this_in("top-menu", top_menu) + .with_this_in( + "region-content", + grid::Row::new() + .with_column(grid::Column::new().with_component(side_menu)) + .with_column(grid::Column::new().with_component(Html::with(html! { + p { "Columna 2"} + }))), + ) .with_template("admin") .render() } diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml new file mode 100644 index 00000000..f507f80c --- /dev/null +++ b/pagetop-megamenu/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "pagetop-megamenu" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Component MegaMenu for PageTop applications.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +pagetop = { path = "../pagetop", version = "0.0" } +pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } +static-files = "0.2.3" +maud = "0.24.0" + +[build-dependencies] +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-megamenu/README.md b/pagetop-megamenu/README.md new file mode 100644 index 00000000..1382edf9 --- /dev/null +++ b/pagetop-megamenu/README.md @@ -0,0 +1,26 @@ +Componente MegaMenu para aplicaciones desarrolladas con **PageTop**. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-megamenu/build.rs b/pagetop-megamenu/build.rs new file mode 100644 index 00000000..54e156ac --- /dev/null +++ b/pagetop-megamenu/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static", "mengamenu", None) +} diff --git a/pagetop/src/base/component/menu.rs b/pagetop-megamenu/src/component.rs similarity index 65% rename from pagetop/src/base/component/menu.rs rename to pagetop-megamenu/src/component.rs index 3e2acfd4..99c8eefb 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop-megamenu/src/component.rs @@ -1,36 +1,36 @@ -use crate::prelude::*; +use pagetop::prelude::*; -pub_handle!(COMPONENT_MENUITEM); +pub_handle!(COMPONENT_MEGAMENUITEM); #[derive(Default)] -pub enum MenuItemType { +pub enum MegaMenuItemType { #[default] Void, Label(String), Link(String, String), LinkBlank(String, String), Html(Markup), - Submenu(String, Menu), + Submenu(String, MegaMenu), Separator, } -// MenuItem. +// MegaMenuItem. #[rustfmt::skip] #[derive(Default)] -pub struct MenuItem { +pub struct MegaMenuItem { weight : isize, renderable: Renderable, - item_type : MenuItemType, + item_type : MegaMenuItemType, } -impl ComponentTrait for MenuItem { +impl ComponentTrait for MegaMenuItem { fn new() -> Self { - MenuItem::default() + MegaMenuItem::default() } fn handle(&self) -> Handle { - COMPONENT_MENUITEM + COMPONENT_MEGAMENUITEM } fn weight(&self) -> isize { @@ -43,23 +43,23 @@ impl ComponentTrait for MenuItem { fn default_render(&self, rcx: &mut RenderContext) -> Markup { match self.item_type() { - MenuItemType::Void => html! {}, + MegaMenuItemType::Void => html! {}, - MenuItemType::Label(label) => html! { + MegaMenuItemType::Label(label) => html! { li class="label" { a href="#" { (label) } } }, - MenuItemType::Link(label, path) => html! { + MegaMenuItemType::Link(label, path) => html! { li class="link" { a href=(path) { (label) } } }, - MenuItemType::LinkBlank(label, path) => html! { + MegaMenuItemType::LinkBlank(label, path) => html! { li class="link_blank" { a href=(path) target="_blank" { (label) } } }, - MenuItemType::Html(html) => html! { + MegaMenuItemType::Html(html) => html! { li class="html" { (*html) } }, - MenuItemType::Submenu(label, menu) => html! { + MegaMenuItemType::Submenu(label, menu) => html! { li class="submenu" { a href="#" { (label) } ul { @@ -67,7 +67,7 @@ impl ComponentTrait for MenuItem { } } }, - MenuItemType::Separator => html! { + MegaMenuItemType::Separator => html! { li class="separator" { } }, } @@ -82,50 +82,50 @@ impl ComponentTrait for MenuItem { } } -impl MenuItem { +impl MegaMenuItem { pub fn label(label: &str) -> Self { - MenuItem { - item_type: MenuItemType::Label(label.to_owned()), + MegaMenuItem { + item_type: MegaMenuItemType::Label(label.to_owned()), ..Default::default() } } pub fn link(label: &str, path: &str) -> Self { - MenuItem { - item_type: MenuItemType::Link(label.to_owned(), path.to_owned()), + MegaMenuItem { + item_type: MegaMenuItemType::Link(label.to_owned(), path.to_owned()), ..Default::default() } } pub fn link_blank(label: &str, path: &str) -> Self { - MenuItem { - item_type: MenuItemType::LinkBlank(label.to_owned(), path.to_owned()), + MegaMenuItem { + item_type: MegaMenuItemType::LinkBlank(label.to_owned(), path.to_owned()), ..Default::default() } } pub fn html(html: Markup) -> Self { - MenuItem { - item_type: MenuItemType::Html(html), + MegaMenuItem { + item_type: MegaMenuItemType::Html(html), ..Default::default() } } - pub fn submenu(label: &str, menu: Menu) -> Self { - MenuItem { - item_type: MenuItemType::Submenu(label.to_owned(), menu), + pub fn submenu(label: &str, menu: MegaMenu) -> Self { + MegaMenuItem { + item_type: MegaMenuItemType::Submenu(label.to_owned(), menu), ..Default::default() } } pub fn separator() -> Self { - MenuItem { - item_type: MenuItemType::Separator, + MegaMenuItem { + item_type: MegaMenuItemType::Separator, ..Default::default() } } - // MenuItem BUILDER. + // MegaMenuItem BUILDER. #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { @@ -139,22 +139,22 @@ impl MenuItem { self } - // MenuItem GETTERS. + // MegaMenuItem GETTERS. - pub fn item_type(&self) -> &MenuItemType { + pub fn item_type(&self) -> &MegaMenuItemType { &self.item_type } } -// Menu. +// MegaMenu. -pub_handle!(COMPONENT_MENU); +pub_handle!(COMPONENT_MEGAMENU); -hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, Menu); +hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, MegaMenu); #[rustfmt::skip] #[derive(Default)] -pub struct Menu { +pub struct MegaMenu { weight : isize, renderable: Renderable, id : IdentifierValue, @@ -163,13 +163,13 @@ pub struct Menu { template : String, } -impl ComponentTrait for Menu { +impl ComponentTrait for MegaMenu { fn new() -> Self { - Menu::default().with_classes(ClassesOp::SetDefault, "sm sm-clean") + MegaMenu::default().with_classes(ClassesOp::SetDefault, "sm sm-clean") } fn handle(&self) -> Handle { - COMPONENT_MENU + COMPONENT_MEGAMENU } fn weight(&self) -> isize { @@ -186,17 +186,17 @@ impl ComponentTrait for Menu { fn default_render(&self, rcx: &mut RenderContext) -> Markup { rcx.alter(ContextOp::AddStyleSheet( - StyleSheet::located("/theme/menu/css/menu.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddStyleSheet( - StyleSheet::located("/theme/menu/css/menu-clean.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddJavaScript( - JavaScript::located("/theme/menu/js/menu.min.js").with_version("1.1.1"), - )) - .alter(ContextOp::AddJQuery); + StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), + )) + .alter(ContextOp::AddStyleSheet( + StyleSheet::located("/megamenu/css/menu-clean.css").with_version("1.1.1"), + )) + .alter(ContextOp::AddJavaScript( + JavaScript::located("/megamenu/js/menu.min.js").with_version("1.1.1"), + )); + pagetop_jquery::JQuery::add_jquery(rcx); - let id = rcx.required_id::<Menu>(self.id()); + let id = rcx.required_id::<MegaMenu>(self.id()); html! { ul id=(id) class=[self.classes().get()] { @@ -220,8 +220,8 @@ impl ComponentTrait for Menu { } } -impl Menu { - // Menu BUILDER. +impl MegaMenu { + // MegaMenu BUILDER. #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { @@ -248,7 +248,7 @@ impl Menu { } #[fn_builder] - pub fn alter_item(&mut self, item: MenuItem) -> &mut Self { + pub fn alter_item(&mut self, item: MegaMenuItem) -> &mut Self { self.items.add(item); self } @@ -259,7 +259,7 @@ impl Menu { self } - // Menu GETTERS. + // MegaMenu GETTERS. pub fn id(&self) -> &IdentifierValue { &self.id diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs new file mode 100644 index 00000000..747c124c --- /dev/null +++ b/pagetop-megamenu/src/lib.rs @@ -0,0 +1,23 @@ +use pagetop::prelude::*; + +pub mod component; + +pub_handle!(MODULE_MEGAMENU); + +include!(concat!(env!("OUT_DIR"), "/megamenu.rs")); + +pub struct MegaMenu; + +impl ModuleTrait for MegaMenu { + fn handle(&self) -> Handle { + MODULE_MEGAMENU + } + + fn dependencies(&self) -> Vec<ModuleStaticRef> { + vec![&pagetop_jquery::JQuery] + } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/megamenu", bundle_megamenu); + } +} diff --git a/pagetop/static/theme/menu/css/menu-blue.css b/pagetop-megamenu/static/css/menu-blue.css similarity index 100% rename from pagetop/static/theme/menu/css/menu-blue.css rename to pagetop-megamenu/static/css/menu-blue.css diff --git a/pagetop/static/theme/menu/css/menu-clean.css b/pagetop-megamenu/static/css/menu-clean.css similarity index 100% rename from pagetop/static/theme/menu/css/menu-clean.css rename to pagetop-megamenu/static/css/menu-clean.css diff --git a/pagetop/static/theme/menu/css/menu-mint.css b/pagetop-megamenu/static/css/menu-mint.css similarity index 100% rename from pagetop/static/theme/menu/css/menu-mint.css rename to pagetop-megamenu/static/css/menu-mint.css diff --git a/pagetop/static/theme/menu/css/menu-simple.css b/pagetop-megamenu/static/css/menu-simple.css similarity index 100% rename from pagetop/static/theme/menu/css/menu-simple.css rename to pagetop-megamenu/static/css/menu-simple.css diff --git a/pagetop/static/theme/menu/css/menu.css b/pagetop-megamenu/static/css/menu.css similarity index 100% rename from pagetop/static/theme/menu/css/menu.css rename to pagetop-megamenu/static/css/menu.css diff --git a/pagetop/static/theme/menu/js/menu.min.js b/pagetop-megamenu/static/js/menu.min.js similarity index 100% rename from pagetop/static/theme/menu/js/menu.min.js rename to pagetop-megamenu/static/js/menu.min.js diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 8aef9edb..781a47ee 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -17,8 +17,6 @@ mod block; pub use block::{Block, COMPONENT_BLOCK}; mod image; pub use image::{Image, COMPONENT_IMAGE}; -//mod menu; -//pub use menu::{Menu, MenuItem, MenuItemType, COMPONENT_MENU, COMPONENT_MENUITEM}; pub mod form_element; pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 14608885..176651e0 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -75,7 +75,7 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { #[macro_export] macro_rules! hook_before_render_component { ( $ACTION_HANDLE:ident, $Component:ty ) => { - paste::paste! { + $crate::paste! { $crate::pub_handle!($ACTION_HANDLE); type Action = fn(&$Component, &mut RenderContext); @@ -127,7 +127,7 @@ macro_rules! hook_before_render_component { } #[inline(always)] - fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { + pub fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { run_actions($ACTION_HANDLE, |action| action_ref::<[< BeforeRender $Component >]>(&**action) .run(component, rcx) diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 3fd846bc..a91e59e6 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -42,6 +42,7 @@ pub use concat_string::concat_string; pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; +pub use paste::paste; pub use tracing_unwrap::ResultExt; pub use pagetop_macros::fn_builder; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 1e6a7cce..187d2116 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,7 +2,7 @@ pub use crate::{concat_string, fn_builder, LazyStatic, ResultExt}; // Macros. -pub use crate::{args, pub_config, pub_handle, pub_locale, serve_static_files}; +pub use crate::{args, paste, pub_config, pub_handle, pub_locale, serve_static_files}; // Helpers. pub use crate::util; From 0ec0f1a961c7ec1f40df86570f6b8b6d9d0d2fb8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Feb 2023 22:42:49 +0100 Subject: [PATCH 280/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20C=C3=B3digo=20revi?= =?UTF-8?q?sado=20con=20cargo=20fmt/clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 10 ++++++++-- pagetop-megamenu/build.rs | 2 +- pagetop-megamenu/src/component.rs | 16 ++++++++-------- pagetop/src/base/module.rs | 2 ++ pagetop/src/core/module.rs | 4 ++-- pagetop/src/core/module/all.rs | 5 ++++- .../src/core/module/{module.rs => definition.rs} | 0 7 files changed, 25 insertions(+), 14 deletions(-) rename pagetop/src/core/module/{module.rs => definition.rs} (100%) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 1851b773..4058bd2b 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -6,7 +6,10 @@ pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalEr let top_menu = MegaMenu::new() .with_item(MegaMenuItem::label(l("module_name").as_str())) .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) - .with_item(MegaMenuItem::link_blank("Opción 3", "https://www.google.es")) + .with_item(MegaMenuItem::link_blank( + "Opción 3", + "https://www.google.es", + )) .with_item(MegaMenuItem::submenu( "Submenú 1", MegaMenu::new() @@ -25,7 +28,10 @@ pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalEr let side_menu = MegaMenu::new() .with_item(MegaMenuItem::label("Opción 1")) .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) - .with_item(MegaMenuItem::link_blank("Opción 3", "https://www.google.es")) + .with_item(MegaMenuItem::link_blank( + "Opción 3", + "https://www.google.es", + )) .with_item(MegaMenuItem::submenu( "Submenú 1", MegaMenu::new() diff --git a/pagetop-megamenu/build.rs b/pagetop-megamenu/build.rs index 54e156ac..e981103b 100644 --- a/pagetop-megamenu/build.rs +++ b/pagetop-megamenu/build.rs @@ -1,3 +1,3 @@ fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "mengamenu", None) + pagetop_build::bundle_resources("./static", "megamenu", None) } diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 99c8eefb..96bc7f76 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -186,14 +186,14 @@ impl ComponentTrait for MegaMenu { fn default_render(&self, rcx: &mut RenderContext) -> Markup { rcx.alter(ContextOp::AddStyleSheet( - StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddStyleSheet( - StyleSheet::located("/megamenu/css/menu-clean.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddJavaScript( - JavaScript::located("/megamenu/js/menu.min.js").with_version("1.1.1"), - )); + StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), + )) + .alter(ContextOp::AddStyleSheet( + StyleSheet::located("/megamenu/css/menu-clean.css").with_version("1.1.1"), + )) + .alter(ContextOp::AddJavaScript( + JavaScript::located("/megamenu/js/menu.min.js").with_version("1.1.1"), + )); pagetop_jquery::JQuery::add_jquery(rcx); let id = rcx.required_id::<MegaMenu>(self.id()); diff --git a/pagetop/src/base/module.rs b/pagetop/src/base/module.rs index b3ec2650..83a30b73 100644 --- a/pagetop/src/base/module.rs +++ b/pagetop/src/base/module.rs @@ -1,3 +1,5 @@ pub mod saturn; + pub mod menu; + pub mod homepage; diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index 53b54c84..24fe5016 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,5 +1,5 @@ -mod module; -pub use module::{BaseModule, ModuleStaticRef, ModuleTrait}; +mod definition; +pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait}; mod theme; pub use theme::{ThemeStaticRef, ThemeTrait}; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 453d07ff..2e5ad048 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -95,7 +95,10 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { if let Some(theme) = module.theme() { let mut registered_themes = THEMES.write().unwrap(); - if !registered_themes.iter().any(|t| t.handle() == theme.handle()) { + if !registered_themes + .iter() + .any(|t| t.handle() == theme.handle()) + { registered_themes.push(theme); trace::debug!("Enabling \"{}\" theme", theme.single_name()); } diff --git a/pagetop/src/core/module/module.rs b/pagetop/src/core/module/definition.rs similarity index 100% rename from pagetop/src/core/module/module.rs rename to pagetop/src/core/module/definition.rs From 1d9934c08400c6f54a33c3eeb3342e222f43c7d1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Feb 2023 00:07:48 +0100 Subject: [PATCH 281/853] =?UTF-8?q?=F0=9F=94=96=20Libera=20versiones=20des?= =?UTF-8?q?arrollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/Cargo.toml | 2 +- pagetop-admin/Cargo.toml | 3 +-- pagetop-build/Cargo.toml | 2 +- pagetop-jquery/Cargo.toml | 2 +- pagetop-node/Cargo.toml | 2 +- pagetop-user/Cargo.toml | 2 +- pagetop/Cargo.toml | 2 +- 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 5df5d78f..5e3dd81b 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drust" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 66da0dfe..e76687dc 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ @@ -16,5 +16,4 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } pagetop-megamenu = { path = "../pagetop-megamenu", version = "0.0" } - maud = "0.24.0" diff --git a/pagetop-build/Cargo.toml b/pagetop-build/Cargo.toml index b3a960fc..8af50c4b 100644 --- a/pagetop-build/Cargo.toml +++ b/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index dece2332..f8b6b6ab 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -14,7 +14,7 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } +pagetop = { path = "../pagetop", version = "0.0" } static-files = "0.2.3" [build-dependencies] diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index e36a0e65..52ac6b6e 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 231393ac..b0b5ddc1 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 141f40f4..73a7d5bd 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.33" +version = "0.0.34" edition = "2021" authors = [ From c4aef7e2fa0656732f6e44cf2febe8a6cf1ce749 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Feb 2023 10:06:45 +0100 Subject: [PATCH 282/853] =?UTF-8?q?=F0=9F=93=9D=20Revisa=20documentaci?= =?UTF-8?q?=C3=B3n=20y=20libera=20nuevas=20versiones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 37 +++++++++++++++++++++++++++++++++++++ pagetop-admin/Cargo.toml | 5 +++-- pagetop-aliner/Cargo.toml | 6 +++--- pagetop-aliner/README.md | 4 ++-- pagetop-bootsier/Cargo.toml | 4 ++-- pagetop-build/README.md | 2 +- pagetop-bulmix/Cargo.toml | 4 ++-- pagetop-jquery/Cargo.toml | 5 +++-- pagetop-jquery/README.md | 6 +++++- pagetop-macros/Cargo.toml | 4 ++-- pagetop-macros/README.md | 2 +- pagetop-megamenu/Cargo.toml | 4 ++-- pagetop-megamenu/README.md | 3 ++- pagetop-minimal/Cargo.toml | 5 +++-- pagetop-minimal/README.md | 4 ++-- pagetop-node/Cargo.toml | 5 +++-- pagetop-user/Cargo.toml | 5 +++-- pagetop/Cargo.toml | 2 +- pagetop/src/config.rs | 4 ++-- 19 files changed, 79 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 3d3380a2..9f72111e 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,24 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR (*Server-Side Rendering*). +## Utilidades + +* **[pagetop-macros](https://github.com/manuelcillero/pagetop/tree/main/pagetop-macros)**, agrupa + las principales macros procedurales y declarativas para usar desde **PageTop**. + +* **[pagetop-build](https://github.com/manuelcillero/pagetop/tree/main/pagetop-build)**, utilidad + para incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con + **PageTop**. + +* **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo + que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería + JavaScript para interactuar con el documento HTML.​ + +* **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, + módulo que proporciona un nuevo componente para incluir menús avanzados en las soluciones web. + +## Módulos + * **[pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin)**, módulo que proporciona a otros módulos un lugar común donde presentar a los administradores sus opciones de configuración. @@ -43,6 +61,25 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: * **[pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node)**, módulo para crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. +## Temas + +* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, tema de + prueba con un conjunto mínimo de estilos para ver la composición básica de páginas y componentes. + +* **[pagetop-aliner](https://github.com/manuelcillero/pagetop/tree/main/pagetop-aliner)**, tema de + prueba con un conjunto básico de estilos que delimita con cajas los elementos HTML para visualizar + esquemáticamente la composición de páginas y componentes. + +* **[pagetop-bootsier](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bootsier)**, tema + que utiliza el *framework* [Bootstrap](https://getbootstrap.com/) para la composición de páginas y + visualización de componentes. + +* **[pagetop-bulmix](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bulmix)**, tema que + utiliza el *framework* [Bulma](https://bulma.io/) para la composición de páginas y visualización + de componentes. + +## Aplicación + * **[drust](https://github.com/manuelcillero/pagetop/tree/main/drust)**, es una aplicación inspirada modestamente en [Drupal](https://www.drupal.org) que utiliza PageTop para crear un CMS (*Content Management System* o sistema de gestión de contenidos) para construir sitios web diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index e76687dc..e4e09b4a 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,13 +1,14 @@ [package] name = "pagetop-admin" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Handles general site configuration for administrators.\ + Module for PageTop that provides a common place for other modules to handle general site \ + settings for administrators.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index 17a359fa..5592265d 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "pagetop-aliner" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Theme for PageTop that uses minimal CSS with bounding boxes for page layout and component \ - display.\ + Theme for PageTop with a basic set of styles that encloses HTML elements with boxes to show an \ + outline of the page layout and components display.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-aliner/README.md b/pagetop-aliner/README.md index f35e4f1a..4ead7970 100644 --- a/pagetop-aliner/README.md +++ b/pagetop-aliner/README.md @@ -1,5 +1,5 @@ -Tema para **PageTop** que define un conjunto mínimo de estilos con cajas delimitadas por bordes para -la composición de páginas y visualización de componentes. +Tema de prueba para **PageTop** con un conjunto básico de estilos que delimita con cajas los +elementos HTML para visualizar esquemáticamente la composición de páginas y componentes. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 8bc69bad..82efe6a7 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "pagetop-bootsier" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Theme for PageTop that uses the Bootstrap framework for page layout and component display.\ + Theme for PageTop that uses the Bootstrap framework for page layout and components display.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-build/README.md b/pagetop-build/README.md index 7b97d5de..71fc545e 100644 --- a/pagetop-build/README.md +++ b/pagetop-build/README.md @@ -1,4 +1,4 @@ -Proporciona funcionalidades para incluir recursos en los binarios al compilar aplicaciones creadas +Utilidad para incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con **PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index 042d296c..f091b01a 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "pagetop-bulmix" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Theme for PageTop that uses the Bulma framework for page layout and component display.\ + Theme for PageTop that uses the Bulma framework for page layout and components display.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index f8b6b6ab..6fdb652e 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -1,13 +1,14 @@ [package] name = "pagetop-jquery" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Manages the user registration and login system.\ + Module for PageTop that allows adding jQuery in pages that include components or themes that \ + use this JavaScript library to interact with the HTML document.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-jquery/README.md b/pagetop-jquery/README.md index 6b98b412..e332b6c9 100644 --- a/pagetop-jquery/README.md +++ b/pagetop-jquery/README.md @@ -1,4 +1,8 @@ -Módulo para añadir jQuery a las páginas generadas con **PageTop**. +Módulo para **PageTop** que permite añadir jQuery en las páginas que incluyen componentes o temas +que usen esta librería JavaScript para interactuar con el documento HTML.​ + +Por defecto **PageTop** no requiere jQuery para el funcionamiento de sus componentes base y tema +predefinido. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml index 2aa4ec10..1564d64f 100644 --- a/pagetop-macros/Cargo.toml +++ b/pagetop-macros/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "pagetop-macros" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Useful macros for creating web solutions using the PageTop framework.\ + Group the main procedural and declarative macros for use from PageTop.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-macros/README.md b/pagetop-macros/README.md index c8d634b8..b9155ea7 100644 --- a/pagetop-macros/README.md +++ b/pagetop-macros/README.md @@ -1,4 +1,4 @@ -Macros útiles para la creación de soluciones web con **PageTop**. +Agrupa las principales macros procedurales y declarativas para usar desde **PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index f507f80c..37922a41 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "pagetop-megamenu" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Component MegaMenu for PageTop applications.\ + Module for PageTop that provides a new component to include advanced menus in web solutions.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-megamenu/README.md b/pagetop-megamenu/README.md index 1382edf9..3f02cca4 100644 --- a/pagetop-megamenu/README.md +++ b/pagetop-megamenu/README.md @@ -1,4 +1,5 @@ -Componente MegaMenu para aplicaciones desarrolladas con **PageTop**. +Módulo para **PageTop** que proporciona un nuevo componente para incluir menús avanzados en las +soluciones web. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index a24da3ba..dcc21a1b 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,13 +1,14 @@ [package] name = "pagetop-minimal" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Theme for PageTop that uses minimal CSS for page layout and component display.\ + Theme for PageTop with a minimal set of styles to view the basic composition of pages and \ + components.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-minimal/README.md b/pagetop-minimal/README.md index 0cc87d10..7562929a 100644 --- a/pagetop-minimal/README.md +++ b/pagetop-minimal/README.md @@ -1,5 +1,5 @@ -Tema para **PageTop** que define un conjunto mínimo de estilos para la composición de páginas y -visualización de componentes. +Tema de prueba para **PageTop** con un conjunto mínimo de estilos para ver la composición básica de +páginas y componentes. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 52ac6b6e..4018d5c2 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,13 +1,14 @@ [package] name = "pagetop-node" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Allows content to be submitted to the site and displayed on pages.\ + Module for PageTop to create, extend or customize the types of content that a website can \ + handle.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index b0b5ddc1..7810794c 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,13 +1,14 @@ [package] name = "pagetop-user" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Manages the user registration and login system.\ + Module to add user management, roles, permissions and sessions in applications developed with \ + PageTop.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 73a7d5bd..8218156c 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.34" +version = "0.0.35" edition = "2021" authors = [ diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 756ffd7d..496b2d31 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -204,7 +204,7 @@ pub struct App { pub name: String, /// Valor predefinido: *"Developed with the amazing PageTop framework."* pub description: String, - /// Valor predefinido: *"Bootsier"* + /// Valor predefinido: *"Saturn"* pub theme: String, /// Valor predefinido: *"en-US"* pub language: String, @@ -278,7 +278,7 @@ pub_config!(SETTINGS: Settings, // [app] "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Bootsier", + "app.theme" => "Saturn", "app.language" => "en-US", "app.direction" => "ltr", "app.startup_banner" => "Slant", From 2134d4955b8dfed1685a9baae3d91f4e79b54dea Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Feb 2023 20:50:39 +0100 Subject: [PATCH 283/853] =?UTF-8?q?=F0=9F=8E=89=20[homedemo]=20Saca=20p?= =?UTF-8?q?=C3=A1g.=20demo=20de=20inicio=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + README.md | 3 ++ drust/Cargo.toml | 1 + drust/src/main.rs | 1 + pagetop-homedemo/Cargo.toml | 22 +++++++++++++++ pagetop-homedemo/README.md | 26 ++++++++++++++++++ pagetop-homedemo/build.rs | 3 ++ .../src/lib.rs | 25 +++++++++-------- .../src}/locales/en-US/homepage.ftl | 0 .../src}/locales/es-ES/homepage.ftl | 0 .../static/css}/styles.css | 2 +- .../static/images/about.svg | 0 .../static/images/header.svg | 0 .../static/images/pagetop.png | Bin .../static/images/support.jpg | Bin .../static/images/welcome.jpg | Bin pagetop/src/base/module.rs | 2 -- pagetop/src/core/module/all.rs | 7 ++--- 18 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 pagetop-homedemo/Cargo.toml create mode 100644 pagetop-homedemo/README.md create mode 100644 pagetop-homedemo/build.rs rename pagetop/src/base/module/homepage.rs => pagetop-homedemo/src/lib.rs (92%) rename {pagetop/src/base/module/homepage => pagetop-homedemo/src}/locales/en-US/homepage.ftl (100%) rename {pagetop/src/base/module/homepage => pagetop-homedemo/src}/locales/es-ES/homepage.ftl (100%) rename {pagetop/static/theme/module/homepage => pagetop-homedemo/static/css}/styles.css (95%) rename pagetop/static/theme/images/homepage-about.svg => pagetop-homedemo/static/images/about.svg (100%) rename pagetop/static/theme/images/homepage-header.svg => pagetop-homedemo/static/images/header.svg (100%) rename pagetop/static/theme/images/homepage-pagetop.png => pagetop-homedemo/static/images/pagetop.png (100%) rename pagetop/static/theme/images/homepage-support.jpg => pagetop-homedemo/static/images/support.jpg (100%) rename pagetop/static/theme/images/homepage-welcome.jpg => pagetop-homedemo/static/images/welcome.jpg (100%) diff --git a/Cargo.toml b/Cargo.toml index fa5648e7..0f0a32eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "pagetop-macros", "pagetop-build", "pagetop-jquery", + "pagetop-homedemo", "pagetop-megamenu", # Modules. "pagetop-admin", diff --git a/README.md b/README.md index 9f72111e..18405171 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,9 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: * **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, módulo que proporciona un nuevo componente para incluir menús avanzados en las soluciones web. +* **[pagetop-homedemo](https://github.com/manuelcillero/pagetop/tree/main/pagetop-homedemo)**, + módulo que muestra una página de inicio de demostración para presentar **PageTop**. + ## Módulos * **[pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin)**, módulo que diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 5e3dd81b..59572845 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -17,6 +17,7 @@ license = "Apache-2.0 OR MIT" actix-web = "4.2.1" pagetop = { path = "../pagetop", version = "0.0", features = ["mysql"], default-features = false } # Modules. +pagetop-homedemo = { path = "../pagetop-homedemo", version = "0.0" } pagetop-admin = { path = "../pagetop-admin", version = "0.0" } pagetop-user = { path = "../pagetop-user", version = "0.0" } pagetop-node = { path = "../pagetop-node", version = "0.0" } diff --git a/drust/src/main.rs b/drust/src/main.rs index 4d12012c..f2698e93 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -12,6 +12,7 @@ impl ModuleTrait for Drust { fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![ // Modules. + &pagetop_homedemo::HomeDemo, &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml new file mode 100644 index 00000000..50cf1433 --- /dev/null +++ b/pagetop-homedemo/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "pagetop-homedemo" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Module that shows a demo home page to present PageTop.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +pagetop = { path = "../pagetop", version = "0.0" } +static-files = "0.2.3" +maud = "0.24.0" + +[build-dependencies] +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-homedemo/README.md b/pagetop-homedemo/README.md new file mode 100644 index 00000000..29faf1d7 --- /dev/null +++ b/pagetop-homedemo/README.md @@ -0,0 +1,26 @@ +Módulo que muestra una página de inicio de demostración para presentar **PageTop**. + +[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo +basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar +APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side +Rendering*). + + +# 🚧 Advertencia + +**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son +constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. + + +# 📜 Licencia + +Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu +elección: + +* Licencia Apache versión 2.0 + ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o + [http://www.apache.org/licenses/LICENSE-2.0]). + +* Licencia MIT + ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o + [http://opensource.org/licenses/MIT]). diff --git a/pagetop-homedemo/build.rs b/pagetop-homedemo/build.rs new file mode 100644 index 00000000..c0c4e274 --- /dev/null +++ b/pagetop-homedemo/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static", "homedemo", None) +} diff --git a/pagetop/src/base/module/homepage.rs b/pagetop-homedemo/src/lib.rs similarity index 92% rename from pagetop/src/base/module/homepage.rs rename to pagetop-homedemo/src/lib.rs index 7b395f78..b2f9cdea 100644 --- a/pagetop/src/base/module/homepage.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,14 +1,16 @@ -use crate::prelude::*; +use pagetop::prelude::*; -pub_handle!(MODULE_DEFAULT_HOMEPAGE); +pub_handle!(MODULE_DEMOHOME); -pub_locale!("src/base/module/homepage/locales"); +pub_locale!("src/locales"); -pub struct DefaultHomePage; +include!(concat!(env!("OUT_DIR"), "/homedemo.rs")); -impl ModuleTrait for DefaultHomePage { +pub struct HomeDemo; + +impl ModuleTrait for HomeDemo { fn handle(&self) -> Handle { - MODULE_DEFAULT_HOMEPAGE + MODULE_DEMOHOME } fn name(&self) -> String { @@ -20,6 +22,7 @@ impl ModuleTrait for DefaultHomePage { } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/homedemo", bundle_homedemo); cfg.route("/", server::web::get().to(demo)); } } @@ -28,7 +31,7 @@ async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) .with_title(l("page_title").as_str()) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( - "/theme/module/homepage/styles.css", + "/homedemo/css/styles.css", ))) .with_body_classes(ClassesOp::AddFirst, "default-homepage") .with_this_in("region-content", hello_world()) @@ -90,7 +93,7 @@ fn hello_world() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "hello-col-image") - .with_component(Image::with("/theme/images/homepage-header.svg")), + .with_component(Image::with("/homedemo/images/header.svg")), ), ) } @@ -129,7 +132,7 @@ fn about_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-image") .with_size(grid::ColumnSize::Is5of12) - .with_component(Image::with("/theme/images/homepage-about.svg")), + .with_component(Image::with("/homedemo/images/about.svg")), ) .with_column( grid::Column::new() @@ -185,7 +188,7 @@ fn promo_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-image") .with_size(grid::ColumnSize::Is6of12) - .with_component(Image::with("/theme/images/homepage-pagetop.png")), + .with_component(Image::with("/homedemo/images/pagetop.png")), ), ) } @@ -196,7 +199,7 @@ fn reporting_issues() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "reporting-col-image") - .with_component(Image::with("/theme/images/homepage-support.jpg")), + .with_component(Image::with("/homedemo/images/support.jpg")), ) .with_column( grid::Column::new() diff --git a/pagetop/src/base/module/homepage/locales/en-US/homepage.ftl b/pagetop-homedemo/src/locales/en-US/homepage.ftl similarity index 100% rename from pagetop/src/base/module/homepage/locales/en-US/homepage.ftl rename to pagetop-homedemo/src/locales/en-US/homepage.ftl diff --git a/pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl b/pagetop-homedemo/src/locales/es-ES/homepage.ftl similarity index 100% rename from pagetop/src/base/module/homepage/locales/es-ES/homepage.ftl rename to pagetop-homedemo/src/locales/es-ES/homepage.ftl diff --git a/pagetop/static/theme/module/homepage/styles.css b/pagetop-homedemo/static/css/styles.css similarity index 95% rename from pagetop/static/theme/module/homepage/styles.css rename to pagetop-homedemo/static/css/styles.css index fda3e2d4..8db5d8d2 100644 --- a/pagetop/static/theme/module/homepage/styles.css +++ b/pagetop-homedemo/static/css/styles.css @@ -37,7 +37,7 @@ body.default-homepage [class$="-col-image"] { #welcome > div.container { padding: 2rem 1rem; border-radius: 28px; - background: url("/theme/images/homepage-welcome.jpg") center center no-repeat; + background: url("/homedemo/images/welcome.jpg") center center no-repeat; background-size: auto; background-size: cover; color: #fff; diff --git a/pagetop/static/theme/images/homepage-about.svg b/pagetop-homedemo/static/images/about.svg similarity index 100% rename from pagetop/static/theme/images/homepage-about.svg rename to pagetop-homedemo/static/images/about.svg diff --git a/pagetop/static/theme/images/homepage-header.svg b/pagetop-homedemo/static/images/header.svg similarity index 100% rename from pagetop/static/theme/images/homepage-header.svg rename to pagetop-homedemo/static/images/header.svg diff --git a/pagetop/static/theme/images/homepage-pagetop.png b/pagetop-homedemo/static/images/pagetop.png similarity index 100% rename from pagetop/static/theme/images/homepage-pagetop.png rename to pagetop-homedemo/static/images/pagetop.png diff --git a/pagetop/static/theme/images/homepage-support.jpg b/pagetop-homedemo/static/images/support.jpg similarity index 100% rename from pagetop/static/theme/images/homepage-support.jpg rename to pagetop-homedemo/static/images/support.jpg diff --git a/pagetop/static/theme/images/homepage-welcome.jpg b/pagetop-homedemo/static/images/welcome.jpg similarity index 100% rename from pagetop/static/theme/images/homepage-welcome.jpg rename to pagetop-homedemo/static/images/welcome.jpg diff --git a/pagetop/src/base/module.rs b/pagetop/src/base/module.rs index 83a30b73..362794e5 100644 --- a/pagetop/src/base/module.rs +++ b/pagetop/src/base/module.rs @@ -1,5 +1,3 @@ pub mod saturn; pub mod menu; - -pub mod homepage; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 2e5ad048..0329df44 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -46,16 +46,13 @@ pub fn register_modules(app: ModuleStaticRef) { // List of modules to enable. let mut list: Vec<ModuleStaticRef> = Vec::new(); - // 1 of 3. Enable base modules. + // Enable base modules. add_to_enabled(&mut list, &base::module::menu::Menu); add_to_enabled(&mut list, &base::module::saturn::Saturn); - // 2 of 3. Enable application modules. + // Enable application modules. add_to_enabled(&mut list, app); - // 3 of 3. Enable default homepage. - add_to_enabled(&mut list, &base::module::homepage::DefaultHomePage); - list.reverse(); ENABLED_MODULES.write().unwrap().append(&mut list); } From a007225faecf46ba7cb85a431d2bb767152e0757 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Feb 2023 20:59:46 +0100 Subject: [PATCH 284/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 8218156c..8723ad23 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.35" +version = "0.0.36" edition = "2021" authors = [ @@ -22,17 +22,17 @@ categories = [ ] [dependencies] -async-trait = "0.1.63" +async-trait = "0.1.64" concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.4" -futures = "0.3.25" +futures = "0.3.26" nom = "7.1.3" once_cell = "1.17.0" paste = "1.0.11" substring = "1.4.5" term_size = "0.3.2" -toml = "0.7.0" +toml = "0.7.1" url = "2.3.1" tracing = "0.1.37" From 2a8946d9486837cbb7c61ed2426a5c67dd638d38 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Feb 2023 22:46:17 +0100 Subject: [PATCH 285/853] =?UTF-8?q?=F0=9F=9A=9A=20Directorio=20"locales"?= =?UTF-8?q?=20debe=20estar=20en=20"src"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bootsier/{ => src}/locales/en-US/bootsier.ftl | 0 pagetop-bootsier/{ => src}/locales/es-ES/bootsier.ftl | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename pagetop-bootsier/{ => src}/locales/en-US/bootsier.ftl (100%) rename pagetop-bootsier/{ => src}/locales/es-ES/bootsier.ftl (100%) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 54fb8e02..9432fb9d 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; pub_handle!(THEME_BOOTSIER); -pub_locale!("locales"); +pub_locale!("src/locales"); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); diff --git a/pagetop-bootsier/locales/en-US/bootsier.ftl b/pagetop-bootsier/src/locales/en-US/bootsier.ftl similarity index 100% rename from pagetop-bootsier/locales/en-US/bootsier.ftl rename to pagetop-bootsier/src/locales/en-US/bootsier.ftl diff --git a/pagetop-bootsier/locales/es-ES/bootsier.ftl b/pagetop-bootsier/src/locales/es-ES/bootsier.ftl similarity index 100% rename from pagetop-bootsier/locales/es-ES/bootsier.ftl rename to pagetop-bootsier/src/locales/es-ES/bootsier.ftl From 27e79ee3cce9ef2ff5a54ee7a1a32bb8c4d3ea40 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 22 Mar 2023 18:27:09 +0100 Subject: [PATCH 286/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20[pagetop]=20Actual?= =?UTF-8?q?iza=20SeaORM=20a=20la=20versi=C3=B3n=200.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 4 +- pagetop/src/core/module/all.rs | 4 +- pagetop/src/db/migration.rs | 2 + pagetop/src/db/migration/connection.rs | 148 +++++ pagetop/src/db/migration/manager.rs | 18 +- pagetop/src/db/migration/migrator.rs | 543 +++++++++++++------ pagetop/src/db/migration/prelude.rs | 3 + pagetop/src/db/migration/seaql_migrations.rs | 2 +- 8 files changed, 536 insertions(+), 188 deletions(-) create mode 100644 pagetop/src/db/migration/connection.rs diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 8723ad23..a5710ee2 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -56,12 +56,12 @@ maud = { version = "0.24.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.10.7" +version = "0.11.1" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.10.3" +version = "0.11.0" optional = true [features] diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 0329df44..84b1a085 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -140,7 +140,7 @@ pub fn run_migrations() { migrations } } - Migrator::up(&DBCONN, None) + Migrator::up(SchemaManagerConnection::Connection(&DBCONN), None) }) .unwrap(); @@ -155,7 +155,7 @@ pub fn run_migrations() { migrations } } - Migrator::down(&DBCONN, None) + Migrator::down(SchemaManagerConnection::Connection(&DBCONN), None) }) .unwrap(); } diff --git a/pagetop/src/db/migration.rs b/pagetop/src/db/migration.rs index eb9ee6dc..7670de69 100644 --- a/pagetop/src/db/migration.rs +++ b/pagetop/src/db/migration.rs @@ -1,10 +1,12 @@ //pub mod cli; +pub mod connection; pub mod manager; pub mod migrator; pub mod prelude; pub mod seaql_migrations; //pub mod util; +pub use connection::*; pub use manager::*; //pub use migrator::*; diff --git a/pagetop/src/db/migration/connection.rs b/pagetop/src/db/migration/connection.rs new file mode 100644 index 00000000..116185e4 --- /dev/null +++ b/pagetop/src/db/migration/connection.rs @@ -0,0 +1,148 @@ +use futures::Future; +use sea_orm::{ + AccessMode, ConnectionTrait, DatabaseConnection, DatabaseTransaction, DbBackend, DbErr, + ExecResult, IsolationLevel, QueryResult, Statement, TransactionError, TransactionTrait, +}; +use std::pin::Pin; + +pub enum SchemaManagerConnection<'c> { + Connection(&'c DatabaseConnection), + Transaction(&'c DatabaseTransaction), +} + +#[async_trait::async_trait] +impl<'c> ConnectionTrait for SchemaManagerConnection<'c> { + fn get_database_backend(&self) -> DbBackend { + match self { + SchemaManagerConnection::Connection(conn) => conn.get_database_backend(), + SchemaManagerConnection::Transaction(trans) => trans.get_database_backend(), + } + } + + async fn execute(&self, stmt: Statement) -> Result<ExecResult, DbErr> { + match self { + SchemaManagerConnection::Connection(conn) => conn.execute(stmt).await, + SchemaManagerConnection::Transaction(trans) => trans.execute(stmt).await, + } + } + + async fn execute_unprepared(&self, sql: &str) -> Result<ExecResult, DbErr> { + match self { + SchemaManagerConnection::Connection(conn) => conn.execute_unprepared(sql).await, + SchemaManagerConnection::Transaction(trans) => trans.execute_unprepared(sql).await, + } + } + + async fn query_one(&self, stmt: Statement) -> Result<Option<QueryResult>, DbErr> { + match self { + SchemaManagerConnection::Connection(conn) => conn.query_one(stmt).await, + SchemaManagerConnection::Transaction(trans) => trans.query_one(stmt).await, + } + } + + async fn query_all(&self, stmt: Statement) -> Result<Vec<QueryResult>, DbErr> { + match self { + SchemaManagerConnection::Connection(conn) => conn.query_all(stmt).await, + SchemaManagerConnection::Transaction(trans) => trans.query_all(stmt).await, + } + } + + fn is_mock_connection(&self) -> bool { + match self { + SchemaManagerConnection::Connection(conn) => conn.is_mock_connection(), + SchemaManagerConnection::Transaction(trans) => trans.is_mock_connection(), + } + } +} + +#[async_trait::async_trait] +impl<'c> TransactionTrait for SchemaManagerConnection<'c> { + async fn begin(&self) -> Result<DatabaseTransaction, DbErr> { + match self { + SchemaManagerConnection::Connection(conn) => conn.begin().await, + SchemaManagerConnection::Transaction(trans) => trans.begin().await, + } + } + + async fn begin_with_config( + &self, + isolation_level: Option<IsolationLevel>, + access_mode: Option<AccessMode>, + ) -> Result<DatabaseTransaction, DbErr> { + match self { + SchemaManagerConnection::Connection(conn) => { + conn.begin_with_config(isolation_level, access_mode).await + } + SchemaManagerConnection::Transaction(trans) => { + trans.begin_with_config(isolation_level, access_mode).await + } + } + } + + async fn transaction<F, T, E>(&self, callback: F) -> Result<T, TransactionError<E>> + where + F: for<'a> FnOnce( + &'a DatabaseTransaction, + ) -> Pin<Box<dyn Future<Output = Result<T, E>> + Send + 'a>> + + Send, + T: Send, + E: std::error::Error + Send, + { + match self { + SchemaManagerConnection::Connection(conn) => conn.transaction(callback).await, + SchemaManagerConnection::Transaction(trans) => trans.transaction(callback).await, + } + } + + async fn transaction_with_config<F, T, E>( + &self, + callback: F, + isolation_level: Option<IsolationLevel>, + access_mode: Option<AccessMode>, + ) -> Result<T, TransactionError<E>> + where + F: for<'a> FnOnce( + &'a DatabaseTransaction, + ) -> Pin<Box<dyn Future<Output = Result<T, E>> + Send + 'a>> + + Send, + T: Send, + E: std::error::Error + Send, + { + match self { + SchemaManagerConnection::Connection(conn) => { + conn.transaction_with_config(callback, isolation_level, access_mode) + .await + } + SchemaManagerConnection::Transaction(trans) => { + trans + .transaction_with_config(callback, isolation_level, access_mode) + .await + } + } + } +} + +pub trait IntoSchemaManagerConnection<'c>: Send +where + Self: 'c, +{ + fn into_schema_manager_connection(self) -> SchemaManagerConnection<'c>; +} + +impl<'c> IntoSchemaManagerConnection<'c> for SchemaManagerConnection<'c> { + fn into_schema_manager_connection(self) -> SchemaManagerConnection<'c> { + self + } +} + +impl<'c> IntoSchemaManagerConnection<'c> for &'c DatabaseConnection { + fn into_schema_manager_connection(self) -> SchemaManagerConnection<'c> { + SchemaManagerConnection::Connection(self) + } +} + +impl<'c> IntoSchemaManagerConnection<'c> for &'c DatabaseTransaction { + fn into_schema_manager_connection(self) -> SchemaManagerConnection<'c> { + SchemaManagerConnection::Transaction(self) + } +} diff --git a/pagetop/src/db/migration/manager.rs b/pagetop/src/db/migration/manager.rs index 71e91b37..f70c9212 100644 --- a/pagetop/src/db/migration/manager.rs +++ b/pagetop/src/db/migration/manager.rs @@ -1,20 +1,26 @@ +use super::{IntoSchemaManagerConnection, SchemaManagerConnection}; use sea_orm::sea_query::{ extension::postgres::{TypeAlterStatement, TypeCreateStatement, TypeDropStatement}, ForeignKeyCreateStatement, ForeignKeyDropStatement, IndexCreateStatement, IndexDropStatement, TableAlterStatement, TableCreateStatement, TableDropStatement, TableRenameStatement, TableTruncateStatement, }; -use sea_orm::{ConnectionTrait, DbBackend, DbConn, DbErr, StatementBuilder}; +use sea_orm::{ConnectionTrait, DbBackend, DbErr, StatementBuilder}; use sea_schema::{mysql::MySql, postgres::Postgres, probe::SchemaProbe, sqlite::Sqlite}; /// Helper struct for writing migration scripts in migration file pub struct SchemaManager<'c> { - conn: &'c DbConn, + conn: SchemaManagerConnection<'c>, } impl<'c> SchemaManager<'c> { - pub fn new(conn: &'c DbConn) -> Self { - Self { conn } + pub fn new<T>(conn: T) -> Self + where + T: IntoSchemaManagerConnection<'c>, + { + Self { + conn: conn.into_schema_manager_connection(), + } } pub async fn exec_stmt<S>(&self, stmt: S) -> Result<(), DbErr> @@ -29,8 +35,8 @@ impl<'c> SchemaManager<'c> { self.conn.get_database_backend() } - pub fn get_connection(&self) -> &'c DbConn { - self.conn + pub fn get_connection(&self) -> &SchemaManagerConnection<'c> { + &self.conn } } diff --git a/pagetop/src/db/migration/migrator.rs b/pagetop/src/db/migration/migrator.rs index 5efdcd09..5ed18f0b 100644 --- a/pagetop/src/db/migration/migrator.rs +++ b/pagetop/src/db/migration/migrator.rs @@ -1,18 +1,23 @@ +use futures::Future; use std::collections::HashSet; use std::fmt::Display; +use std::pin::Pin; use std::time::SystemTime; use tracing::info; -use sea_orm::sea_query::{Alias, Expr, ForeignKey, Query, SelectStatement, SimpleExpr, Table}; +use sea_orm::sea_query::{ + self, extension::postgres::Type, Alias, Expr, ForeignKey, Iden, JoinType, Query, + SelectStatement, SimpleExpr, Table, +}; use sea_orm::{ - ActiveModelTrait, ActiveValue, ColumnTrait, Condition, ConnectionTrait, DbBackend, DbConn, - DbErr, EntityTrait, QueryFilter, QueryOrder, Schema, Statement, + ActiveModelTrait, ActiveValue, ColumnTrait, Condition, ConnectionTrait, DbBackend, DbErr, + EntityTrait, QueryFilter, QueryOrder, Schema, Statement, TransactionTrait, }; use sea_schema::{mysql::MySql, postgres::Postgres, probe::SchemaProbe, sqlite::Sqlite}; -use super::{seaql_migrations, MigrationTrait, SchemaManager}; +use super::{seaql_migrations, IntoSchemaManagerConnection, MigrationTrait, SchemaManager}; -#[derive(Debug, Eq, PartialEq)] +#[derive(Debug, PartialEq, Eq)] /// Status of migration pub enum MigrationStatus { /// Not yet applied @@ -32,7 +37,7 @@ impl Display for MigrationStatus { MigrationStatus::Pending => "Pending", MigrationStatus::Applied => "Applied", }; - write!(f, "{}", status) + write!(f, "{status}") } } @@ -54,7 +59,10 @@ pub trait MigratorTrait: Send { } /// Get list of applied migrations from database - async fn get_migration_models(db: &DbConn) -> Result<Vec<seaql_migrations::Model>, DbErr> { + async fn get_migration_models<C>(db: &C) -> Result<Vec<seaql_migrations::Model>, DbErr> + where + C: ConnectionTrait, + { Self::install(db).await?; seaql_migrations::Entity::find() .order_by_asc(seaql_migrations::Column::Version) @@ -63,7 +71,10 @@ pub trait MigratorTrait: Send { } /// Get list of migrations with status - async fn get_migration_with_status(db: &DbConn) -> Result<Vec<Migration>, DbErr> { + async fn get_migration_with_status<C>(db: &C) -> Result<Vec<Migration>, DbErr> + where + C: ConnectionTrait, + { Self::install(db).await?; let mut migration_files = Self::get_migration_files(); let migration_models = Self::get_migration_models(db).await?; @@ -88,7 +99,7 @@ pub trait MigratorTrait: Send { let errors: Vec<String> = missing_migrations_in_fs .iter() .map(|missing_migration| { - format!("Migration file of version '{}' is missing, this migration has been applied but its file is missing", missing_migration) + format!("Migration file of version '{missing_migration}' is missing, this migration has been applied but its file is missing") }).collect(); if !errors.is_empty() { @@ -99,7 +110,10 @@ pub trait MigratorTrait: Send { } /// Get list of pending migrations - async fn get_pending_migrations(db: &DbConn) -> Result<Vec<Migration>, DbErr> { + async fn get_pending_migrations<C>(db: &C) -> Result<Vec<Migration>, DbErr> + where + C: ConnectionTrait, + { Self::install(db).await?; Ok(Self::get_migration_with_status(db) .await? @@ -109,7 +123,10 @@ pub trait MigratorTrait: Send { } /// Get list of applied migrations - async fn get_applied_migrations(db: &DbConn) -> Result<Vec<Migration>, DbErr> { + async fn get_applied_migrations<C>(db: &C) -> Result<Vec<Migration>, DbErr> + where + C: ConnectionTrait, + { Self::install(db).await?; Ok(Self::get_migration_with_status(db) .await? @@ -119,7 +136,10 @@ pub trait MigratorTrait: Send { } /// Create migration table `seaql_migrations` in the database - async fn install(db: &DbConn) -> Result<(), DbErr> { + async fn install<C>(db: &C) -> Result<(), DbErr> + where + C: ConnectionTrait, + { let builder = db.get_database_backend(); let schema = Schema::new(builder); let mut stmt = schema.create_table_from_entity(seaql_migrations::Entity); @@ -127,103 +147,11 @@ pub trait MigratorTrait: Send { db.execute(builder.build(&stmt)).await.map(|_| ()) } - /// Drop all tables from the database, then reapply all migrations - async fn fresh(db: &DbConn) -> Result<(), DbErr> { - Self::install(db).await?; - let db_backend = db.get_database_backend(); - - // Temporarily disable the foreign key check - if db_backend == DbBackend::Sqlite { - info!("Disabling foreign key check"); - db.execute(Statement::from_string( - db_backend, - "PRAGMA foreign_keys = OFF".to_owned(), - )) - .await?; - info!("Foreign key check disabled"); - } - - // Drop all foreign keys - if db_backend == DbBackend::MySql { - info!("Dropping all foreign keys"); - let mut stmt = Query::select(); - stmt.columns([Alias::new("TABLE_NAME"), Alias::new("CONSTRAINT_NAME")]) - .from(( - Alias::new("information_schema"), - Alias::new("table_constraints"), - )) - .cond_where( - Condition::all() - .add( - Expr::expr(get_current_schema(db)).equals( - Alias::new("table_constraints"), - Alias::new("table_schema"), - ), - ) - .add(Expr::expr(Expr::value("FOREIGN KEY")).equals( - Alias::new("table_constraints"), - Alias::new("constraint_type"), - )), - ); - let rows = db.query_all(db_backend.build(&stmt)).await?; - for row in rows.into_iter() { - let constraint_name: String = row.try_get("", "CONSTRAINT_NAME")?; - let table_name: String = row.try_get("", "TABLE_NAME")?; - info!( - "Dropping foreign key '{}' from table '{}'", - constraint_name, table_name - ); - let mut stmt = ForeignKey::drop(); - stmt.table(Alias::new(table_name.as_str())) - .name(constraint_name.as_str()); - db.execute(db_backend.build(&stmt)).await?; - info!("Foreign key '{}' has been dropped", constraint_name); - } - info!("All foreign keys dropped"); - } - - // Drop all tables - let stmt = query_tables(db); - let rows = db.query_all(db_backend.build(&stmt)).await?; - for row in rows.into_iter() { - let table_name: String = row.try_get("", "table_name")?; - info!("Dropping table '{}'", table_name); - let mut stmt = Table::drop(); - stmt.table(Alias::new(table_name.as_str())) - .if_exists() - .cascade(); - db.execute(db_backend.build(&stmt)).await?; - info!("Table '{}' has been dropped", table_name); - } - - // Restore the foreign key check - if db_backend == DbBackend::Sqlite { - info!("Restoring foreign key check"); - db.execute(Statement::from_string( - db_backend, - "PRAGMA foreign_keys = ON".to_owned(), - )) - .await?; - info!("Foreign key check restored"); - } - - // Reapply all migrations - Self::up(db, None).await - } - - /// Rollback all applied migrations, then reapply all migrations - async fn refresh(db: &DbConn) -> Result<(), DbErr> { - Self::down(db, None).await?; - Self::up(db, None).await - } - - /// Rollback all applied migrations - async fn reset(db: &DbConn) -> Result<(), DbErr> { - Self::down(db, None).await - } - /// Check the status of all migrations - async fn status(db: &DbConn) -> Result<(), DbErr> { + async fn status<C>(db: &C) -> Result<(), DbErr> + where + C: ConnectionTrait, + { Self::install(db).await?; info!("Checking migration status"); @@ -235,81 +163,257 @@ pub trait MigratorTrait: Send { Ok(()) } + /// Drop all tables from the database, then reapply all migrations + async fn fresh<'c, C>(db: C) -> Result<(), DbErr> + where + C: IntoSchemaManagerConnection<'c>, + { + exec_with_connection::<'_, _, _, Self>(db, move |manager| { + Box::pin(async move { exec_fresh::<Self>(manager).await }) + }) + .await + } + + /// Rollback all applied migrations, then reapply all migrations + async fn refresh<'c, C>(db: C) -> Result<(), DbErr> + where + C: IntoSchemaManagerConnection<'c>, + { + exec_with_connection::<'_, _, _, Self>(db, move |manager| { + Box::pin(async move { + exec_down::<Self>(manager, None).await?; + exec_up::<Self>(manager, None).await + }) + }) + .await + } + + /// Rollback all applied migrations + async fn reset<'c, C>(db: C) -> Result<(), DbErr> + where + C: IntoSchemaManagerConnection<'c>, + { + exec_with_connection::<'_, _, _, Self>(db, move |manager| { + Box::pin(async move { exec_down::<Self>(manager, None).await }) + }) + .await + } + /// Apply pending migrations - async fn up(db: &DbConn, mut steps: Option<u32>) -> Result<(), DbErr> { - Self::install(db).await?; - let manager = SchemaManager::new(db); - - if let Some(steps) = steps { - info!("Applying {} pending migrations", steps); - } else { - info!("Applying all pending migrations"); - } - - let migrations = Self::get_pending_migrations(db).await?.into_iter(); - if migrations.len() == 0 { - info!("No pending migrations"); - } - for Migration { migration, .. } in migrations { - if let Some(steps) = steps.as_mut() { - if steps == &0 { - break; - } - *steps -= 1; - } - info!("Applying migration '{}'", migration.name()); - migration.up(&manager).await?; - info!("Migration '{}' has been applied", migration.name()); - let now = SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .expect("SystemTime before UNIX EPOCH!"); - seaql_migrations::ActiveModel { - version: ActiveValue::Set(migration.name().to_owned()), - applied_at: ActiveValue::Set(now.as_secs() as i64), - } - .insert(db) - .await?; - } - - Ok(()) + async fn up<'c, C>(db: C, steps: Option<u32>) -> Result<(), DbErr> + where + C: IntoSchemaManagerConnection<'c>, + { + exec_with_connection::<'_, _, _, Self>(db, move |manager| { + Box::pin(async move { exec_up::<Self>(manager, steps).await }) + }) + .await } /// Rollback applied migrations - async fn down(db: &DbConn, mut steps: Option<u32>) -> Result<(), DbErr> { - Self::install(db).await?; - let manager = SchemaManager::new(db); - - if let Some(steps) = steps { - info!("Rolling back {} applied migrations", steps); - } else { - info!("Rolling back all applied migrations"); - } - - let migrations = Self::get_applied_migrations(db).await?.into_iter().rev(); - if migrations.len() == 0 { - info!("No applied migrations"); - } - for Migration { migration, .. } in migrations { - if let Some(steps) = steps.as_mut() { - if steps == &0 { - break; - } - *steps -= 1; - } - info!("Rolling back migration '{}'", migration.name()); - migration.down(&manager).await?; - info!("Migration '{}' has been rollbacked", migration.name()); - seaql_migrations::Entity::delete_many() - .filter(seaql_migrations::Column::Version.eq(migration.name())) - .exec(db) - .await?; - } - - Ok(()) + async fn down<'c, C>(db: C, steps: Option<u32>) -> Result<(), DbErr> + where + C: IntoSchemaManagerConnection<'c>, + { + exec_with_connection::<'_, _, _, Self>(db, move |manager| { + Box::pin(async move { exec_down::<Self>(manager, steps).await }) + }) + .await } } -pub(crate) fn query_tables(db: &DbConn) -> SelectStatement { +async fn exec_with_connection<'c, C, F, M>(db: C, f: F) -> Result<(), DbErr> +where + C: IntoSchemaManagerConnection<'c>, + F: for<'b> Fn( + &'b SchemaManager<'_>, + ) -> Pin<Box<dyn Future<Output = Result<(), DbErr>> + Send + 'b>>, + M: MigratorTrait + ?Sized, +{ + let db = db.into_schema_manager_connection(); + + match db.get_database_backend() { + DbBackend::Postgres => { + let transaction = db.begin().await?; + let manager = SchemaManager::new(&transaction); + f(&manager).await?; + transaction.commit().await + } + DbBackend::MySql | DbBackend::Sqlite => { + let manager = SchemaManager::new(db); + f(&manager).await + } + } +} + +async fn exec_fresh<M>(manager: &SchemaManager<'_>) -> Result<(), DbErr> +where + M: MigratorTrait + ?Sized, +{ + let db = manager.get_connection(); + + M::install(db).await?; + let db_backend = db.get_database_backend(); + + // Temporarily disable the foreign key check + if db_backend == DbBackend::Sqlite { + info!("Disabling foreign key check"); + db.execute(Statement::from_string( + db_backend, + "PRAGMA foreign_keys = OFF".to_owned(), + )) + .await?; + info!("Foreign key check disabled"); + } + + // Drop all foreign keys + if db_backend == DbBackend::MySql { + info!("Dropping all foreign keys"); + let stmt = query_mysql_foreign_keys(db); + let rows = db.query_all(db_backend.build(&stmt)).await?; + for row in rows.into_iter() { + let constraint_name: String = row.try_get("", "CONSTRAINT_NAME")?; + let table_name: String = row.try_get("", "TABLE_NAME")?; + info!( + "Dropping foreign key '{}' from table '{}'", + constraint_name, table_name + ); + let mut stmt = ForeignKey::drop(); + stmt.table(Alias::new(table_name.as_str())) + .name(constraint_name.as_str()); + db.execute(db_backend.build(&stmt)).await?; + info!("Foreign key '{}' has been dropped", constraint_name); + } + info!("All foreign keys dropped"); + } + + // Drop all tables + let stmt = query_tables(db); + let rows = db.query_all(db_backend.build(&stmt)).await?; + for row in rows.into_iter() { + let table_name: String = row.try_get("", "table_name")?; + info!("Dropping table '{}'", table_name); + let mut stmt = Table::drop(); + stmt.table(Alias::new(table_name.as_str())) + .if_exists() + .cascade(); + db.execute(db_backend.build(&stmt)).await?; + info!("Table '{}' has been dropped", table_name); + } + + // Drop all types + if db_backend == DbBackend::Postgres { + info!("Dropping all types"); + let stmt = query_pg_types(db); + let rows = db.query_all(db_backend.build(&stmt)).await?; + for row in rows { + let type_name: String = row.try_get("", "typname")?; + info!("Dropping type '{}'", type_name); + let mut stmt = Type::drop(); + stmt.name(Alias::new(&type_name as &str)); + db.execute(db_backend.build(&stmt)).await?; + info!("Type '{}' has been dropped", type_name); + } + } + + // Restore the foreign key check + if db_backend == DbBackend::Sqlite { + info!("Restoring foreign key check"); + db.execute(Statement::from_string( + db_backend, + "PRAGMA foreign_keys = ON".to_owned(), + )) + .await?; + info!("Foreign key check restored"); + } + + // Reapply all migrations + exec_up::<M>(manager, None).await +} + +async fn exec_up<M>(manager: &SchemaManager<'_>, mut steps: Option<u32>) -> Result<(), DbErr> +where + M: MigratorTrait + ?Sized, +{ + let db = manager.get_connection(); + + M::install(db).await?; + + if let Some(steps) = steps { + info!("Applying {} pending migrations", steps); + } else { + info!("Applying all pending migrations"); + } + + let migrations = M::get_pending_migrations(db).await?.into_iter(); + if migrations.len() == 0 { + info!("No pending migrations"); + } + for Migration { migration, .. } in migrations { + if let Some(steps) = steps.as_mut() { + if steps == &0 { + break; + } + *steps -= 1; + } + info!("Applying migration '{}'", migration.name()); + migration.up(manager).await?; + info!("Migration '{}' has been applied", migration.name()); + let now = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("SystemTime before UNIX EPOCH!"); + seaql_migrations::ActiveModel { + version: ActiveValue::Set(migration.name().to_owned()), + applied_at: ActiveValue::Set(now.as_secs() as i64), + } + .insert(db) + .await?; + } + + Ok(()) +} + +async fn exec_down<M>(manager: &SchemaManager<'_>, mut steps: Option<u32>) -> Result<(), DbErr> +where + M: MigratorTrait + ?Sized, +{ + let db = manager.get_connection(); + + M::install(db).await?; + + if let Some(steps) = steps { + info!("Rolling back {} applied migrations", steps); + } else { + info!("Rolling back all applied migrations"); + } + + let migrations = M::get_applied_migrations(db).await?.into_iter().rev(); + if migrations.len() == 0 { + info!("No applied migrations"); + } + for Migration { migration, .. } in migrations { + if let Some(steps) = steps.as_mut() { + if steps == &0 { + break; + } + *steps -= 1; + } + info!("Rolling back migration '{}'", migration.name()); + migration.down(manager).await?; + info!("Migration '{}' has been rollbacked", migration.name()); + seaql_migrations::Entity::delete_many() + .filter(seaql_migrations::Column::Version.eq(migration.name())) + .exec(db) + .await?; + } + + Ok(()) +} + +fn query_tables<C>(db: &C) -> SelectStatement +where + C: ConnectionTrait, +{ match db.get_database_backend() { DbBackend::MySql => MySql::query_tables(), DbBackend::Postgres => Postgres::query_tables(), @@ -317,10 +421,95 @@ pub(crate) fn query_tables(db: &DbConn) -> SelectStatement { } } -pub(crate) fn get_current_schema(db: &DbConn) -> SimpleExpr { +fn get_current_schema<C>(db: &C) -> SimpleExpr +where + C: ConnectionTrait, +{ match db.get_database_backend() { DbBackend::MySql => MySql::get_current_schema(), DbBackend::Postgres => Postgres::get_current_schema(), DbBackend::Sqlite => unimplemented!(), } } + +#[derive(Iden)] +enum InformationSchema { + #[iden = "information_schema"] + Schema, + #[iden = "TABLE_NAME"] + TableName, + #[iden = "CONSTRAINT_NAME"] + ConstraintName, + TableConstraints, + TableSchema, + ConstraintType, +} + +fn query_mysql_foreign_keys<C>(db: &C) -> SelectStatement +where + C: ConnectionTrait, +{ + let mut stmt = Query::select(); + stmt.columns([ + InformationSchema::TableName, + InformationSchema::ConstraintName, + ]) + .from(( + InformationSchema::Schema, + InformationSchema::TableConstraints, + )) + .cond_where( + Condition::all() + .add(Expr::expr(get_current_schema(db)).equals(( + InformationSchema::TableConstraints, + InformationSchema::TableSchema, + ))) + .add( + Expr::col(( + InformationSchema::TableConstraints, + InformationSchema::ConstraintType, + )) + .eq("FOREIGN KEY"), + ), + ); + stmt +} + +#[derive(Iden)] +enum PgType { + Table, + Typname, + Typnamespace, + Typelem, +} + +#[derive(Iden)] +enum PgNamespace { + Table, + Oid, + Nspname, +} + +fn query_pg_types<C>(db: &C) -> SelectStatement +where + C: ConnectionTrait, +{ + let mut stmt = Query::select(); + stmt.column(PgType::Typname) + .from(PgType::Table) + .join( + JoinType::LeftJoin, + PgNamespace::Table, + Expr::col((PgNamespace::Table, PgNamespace::Oid)) + .equals((PgType::Table, PgType::Typnamespace)), + ) + .cond_where( + Condition::all() + .add( + Expr::expr(get_current_schema(db)) + .equals((PgNamespace::Table, PgNamespace::Nspname)), + ) + .add(Expr::col((PgType::Table, PgType::Typelem)).eq(0)), + ); + stmt +} diff --git a/pagetop/src/db/migration/prelude.rs b/pagetop/src/db/migration/prelude.rs index 5d1e6f49..fac0e132 100644 --- a/pagetop/src/db/migration/prelude.rs +++ b/pagetop/src/db/migration/prelude.rs @@ -1,4 +1,7 @@ //pub use super::cli; + +pub use super::connection::IntoSchemaManagerConnection; +pub use super::connection::SchemaManagerConnection; pub use super::manager::SchemaManager; pub use super::migrator::MigratorTrait; pub use super::{MigrationName, MigrationTrait}; diff --git a/pagetop/src/db/migration/seaql_migrations.rs b/pagetop/src/db/migration/seaql_migrations.rs index cc06c44d..9926ea9c 100644 --- a/pagetop/src/db/migration/seaql_migrations.rs +++ b/pagetop/src/db/migration/seaql_migrations.rs @@ -1,6 +1,6 @@ use sea_orm::entity::prelude::*; -#[derive(Clone, Debug, Eq, PartialEq, DeriveEntityModel)] +#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)] #[sea_orm(table_name = "seaql_migrations")] pub struct Model { #[sea_orm(primary_key, auto_increment = false)] From 794d48b5ea027e5249e7852fa779352ee760694c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 24 Mar 2023 00:01:19 +0100 Subject: [PATCH 287/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Actualiza=20depend?= =?UTF-8?q?iencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/Cargo.toml | 2 +- pagetop/Cargo.toml | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 59572845..8a6d2eaf 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -14,7 +14,7 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -actix-web = "4.2.1" +actix-web = "4.3.1" pagetop = { path = "../pagetop", version = "0.0", features = ["mysql"], default-features = false } # Modules. pagetop-homedemo = { path = "../pagetop-homedemo", version = "0.0" } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index a5710ee2..c02df41a 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -22,31 +22,31 @@ categories = [ ] [dependencies] -async-trait = "0.1.64" +async-trait = "0.1.67" concat-string = "1.0.1" doc-comment = "0.3.3" -figlet-rs = "0.1.4" -futures = "0.3.26" +figlet-rs = "0.1.5" +futures = "0.3.27" nom = "7.1.3" -once_cell = "1.17.0" -paste = "1.0.11" +once_cell = "1.17.1" +paste = "1.0.12" substring = "1.4.5" term_size = "0.3.2" -toml = "0.7.1" +toml = "0.7.3" url = "2.3.1" tracing = "0.1.37" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.10.0", default-features = false } -tracing-actix-web = "0.7.2" +tracing-actix-web = "0.7.3" fluent-templates = "0.8.0" unic-langid = "0.9.1" -actix-web = "4.2.1" +actix-web = "4.3.1" actix-web-files = { package = "actix-files", version = "0.6.2" } -actix-web-static-files = "4.0.0" +actix-web-static-files = "4.0.1" static-files = "0.2.3" pagetop-macros = { path = "../pagetop-macros", version = "0.0" } @@ -75,7 +75,7 @@ sqlite = ["database", "sea-orm/sqlx-sqlite"] pagetop-build = { path = "../pagetop-build", version = "0.0" } [dev-dependencies] -tokio = { version = "1.24.2", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } [lib] name = "pagetop" From eea5d5b5f9521fa7aa703e489c4165687d4f6000 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 07:50:39 +0200 Subject: [PATCH 288/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Actualiza=20maud?= =?UTF-8?q?=20a=20la=20versi=C3=B3n=200.25.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- pagetop-aliner/Cargo.toml | 2 +- pagetop-bootsier/Cargo.toml | 2 +- pagetop-bulmix/Cargo.toml | 2 +- pagetop-homedemo/Cargo.toml | 2 +- pagetop-megamenu/Cargo.toml | 2 +- pagetop-minimal/Cargo.toml | 2 +- pagetop/Cargo.toml | 2 +- pagetop/STARTER.bin.Cargo.toml | 4 ++-- pagetop/STARTER.lib.Cargo.toml | 4 ++-- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index e4e09b4a..05ed0f19 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -17,4 +17,4 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } pagetop-megamenu = { path = "../pagetop-megamenu", version = "0.0" } -maud = "0.24.0" +maud = "0.25.0" diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index 5592265d..5d0ba9fc 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -17,7 +17,7 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } static-files = "0.2.3" -maud = "0.24.0" +maud = "0.25.0" [build-dependencies] pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 82efe6a7..50b628d6 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -17,7 +17,7 @@ license = "Apache-2.0 OR MIT" pagetop = { path = "../pagetop", version = "0.0" } pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } static-files = "0.2.3" -maud = "0.24.0" +maud = "0.25.0" [build-dependencies] pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index f091b01a..b3353cbc 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -17,7 +17,7 @@ license = "Apache-2.0 OR MIT" pagetop = { path = "../pagetop", version = "0.0" } pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } static-files = "0.2.3" -maud = "0.24.0" +maud = "0.25.0" [build-dependencies] pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 50cf1433..9afed5da 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -16,7 +16,7 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } static-files = "0.2.3" -maud = "0.24.0" +maud = "0.25.0" [build-dependencies] pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index 37922a41..c203b9fa 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -17,7 +17,7 @@ license = "Apache-2.0 OR MIT" pagetop = { path = "../pagetop", version = "0.0" } pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } static-files = "0.2.3" -maud = "0.24.0" +maud = "0.25.0" [build-dependencies] pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index dcc21a1b..e4b69669 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -16,4 +16,4 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { path = "../pagetop", version = "0.0" } -maud = "0.24.0" +maud = "0.25.0" diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index c02df41a..11088849 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -51,7 +51,7 @@ static-files = "0.2.3" pagetop-macros = { path = "../pagetop-macros", version = "0.0" } -maud = { version = "0.24.0", features = ["actix-web"] } +maud = { version = "0.25.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index 80f8a7e1..cf814730 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies.pagetop] path = "../pagetop" -# Si requiere base de datos (MySql, Postgres y/o SQLite): +# Si requiere base de datos (MySql, Postgres y/o SQLite) añadir: features = ["mysql"] # features = ["postgres"] # features = ["sqlite"] @@ -18,7 +18,7 @@ default-features = false [dependencies] actix-web = "4.2.1" # Para usar la macro html! (opcional): -maud = "0.24.0" +maud = "0.25.0" # Para serializar estructuras de datos (opcional): serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 478f624d..5cab880e 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -8,14 +8,14 @@ edition = "2021" [dependencies.pagetop] path = "../pagetop" -# Si requiere base de datos: +# Si requiere base de datos añadir: features = ["database"] # En cuyo caso habrá que deshabilitar las características predeterminadas: default-features = false [dependencies] # Para usar la macro html! (opcional): -maud = "0.24.0" +maud = "0.25.0" # Para serializar estructuras de datos (opcional): serde = { version = "1.0", features = ["derive"] } From efdd72f4ad5066f39d743ff9c010c8c73ecd8712 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 07:54:55 +0200 Subject: [PATCH 289/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Actualiza=20depend?= =?UTF-8?q?iencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 11088849..0bbd2a77 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -22,11 +22,11 @@ categories = [ ] [dependencies] -async-trait = "0.1.67" +async-trait = "0.1.68" concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.5" -futures = "0.3.27" +futures = "0.3.28" nom = "7.1.3" once_cell = "1.17.1" paste = "1.0.12" @@ -37,9 +37,9 @@ url = "2.3.1" tracing = "0.1.37" tracing-appender = "0.2.2" -tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } +tracing-subscriber = { version = "0.3.17", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.10.0", default-features = false } -tracing-actix-web = "0.7.3" +tracing-actix-web = "0.7.4" fluent-templates = "0.8.0" unic-langid = "0.9.1" @@ -56,7 +56,7 @@ maud = { version = "0.25.0", features = ["actix-web"] } serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] -version = "0.11.1" +version = "0.11.3" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true @@ -75,7 +75,7 @@ sqlite = ["database", "sea-orm/sqlx-sqlite"] pagetop-build = { path = "../pagetop-build", version = "0.0" } [dev-dependencies] -tokio = { version = "1.26.0", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.28.1", features = ["macros", "rt-multi-thread"] } [lib] name = "pagetop" From f0a32d746790d8fed2e9ff4f526d3e2e6a6879a4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 10:10:43 +0200 Subject: [PATCH 290/853] =?UTF-8?q?=E2=99=BB=EF=B8=8FExtrae=20los=20compon?= =?UTF-8?q?entes=20base=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../pagetop-banner.png => banner/pagetop.png | Bin pagetop/Cargo.toml | 3 - pagetop/STARTER.bin.Cargo.toml | 2 +- pagetop/STARTER.lib.Cargo.toml | 2 +- pagetop/build.rs | 3 - pagetop/config/settings.predefined.toml | 14 +- pagetop/src/base.rs | 2 - pagetop/src/base/component.rs | 22 - pagetop/src/base/component/anchor.rs | 220 --- pagetop/src/base/component/block.rs | 129 -- pagetop/src/base/component/container.rs | 194 -- pagetop/src/base/component/form_element.rs | 11 - .../src/base/component/form_element/button.rs | 183 -- .../src/base/component/form_element/date.rs | 236 --- .../src/base/component/form_element/form.rs | 164 -- .../src/base/component/form_element/hidden.rs | 76 - .../src/base/component/form_element/input.rs | 357 ---- pagetop/src/base/component/grid.rs | 4 - pagetop/src/base/component/grid/column.rs | 171 -- pagetop/src/base/component/grid/row.rs | 112 -- pagetop/src/base/component/heading.rs | 205 -- pagetop/src/base/component/html.rs | 84 - pagetop/src/base/component/icon.rs | 94 - pagetop/src/base/component/image.rs | 111 -- pagetop/src/base/component/paragraph.rs | 147 -- pagetop/src/base/module.rs | 3 - pagetop/src/base/module/menu.rs | 21 - .../base/module/menu/locales/en-US/menu.ftl | 2 - .../base/module/menu/locales/es-ES/menu.ftl | 2 - pagetop/src/base/module/saturn.rs | 30 - pagetop/src/config.rs | 4 +- pagetop/src/core.rs | 3 + pagetop/src/core/basic.rs | 19 + pagetop/src/core/component/context.rs | 4 +- pagetop/src/core/component/html_markup.rs | 36 + pagetop/src/core/module/all.rs | 6 +- pagetop/src/core/module/theme.rs | 15 +- pagetop/src/lib.rs | 3 +- pagetop/src/prelude.rs | 2 - pagetop/static/theme/css/styles.css | 356 ---- pagetop/static/theme/favicon.ico | Bin 10206 -> 0 bytes .../static/theme/icons/bootstrap-icons.css | 1705 ----------------- .../static/theme/icons/bootstrap-icons.woff | Bin 137216 -> 0 bytes .../static/theme/icons/bootstrap-icons.woff2 | Bin 102380 -> 0 bytes 45 files changed, 82 insertions(+), 4677 deletions(-) rename pagetop/static/pagetop-banner.png => banner/pagetop.png (100%) delete mode 100644 pagetop/build.rs delete mode 100644 pagetop/src/base.rs delete mode 100644 pagetop/src/base/component.rs delete mode 100644 pagetop/src/base/component/anchor.rs delete mode 100644 pagetop/src/base/component/block.rs delete mode 100644 pagetop/src/base/component/container.rs delete mode 100644 pagetop/src/base/component/form_element.rs delete mode 100644 pagetop/src/base/component/form_element/button.rs delete mode 100644 pagetop/src/base/component/form_element/date.rs delete mode 100644 pagetop/src/base/component/form_element/form.rs delete mode 100644 pagetop/src/base/component/form_element/hidden.rs delete mode 100644 pagetop/src/base/component/form_element/input.rs delete mode 100644 pagetop/src/base/component/grid.rs delete mode 100644 pagetop/src/base/component/grid/column.rs delete mode 100644 pagetop/src/base/component/grid/row.rs delete mode 100644 pagetop/src/base/component/heading.rs delete mode 100644 pagetop/src/base/component/html.rs delete mode 100644 pagetop/src/base/component/icon.rs delete mode 100644 pagetop/src/base/component/image.rs delete mode 100644 pagetop/src/base/component/paragraph.rs delete mode 100644 pagetop/src/base/module.rs delete mode 100644 pagetop/src/base/module/menu.rs delete mode 100644 pagetop/src/base/module/menu/locales/en-US/menu.ftl delete mode 100644 pagetop/src/base/module/menu/locales/es-ES/menu.ftl delete mode 100644 pagetop/src/base/module/saturn.rs create mode 100644 pagetop/src/core/basic.rs delete mode 100644 pagetop/static/theme/css/styles.css delete mode 100644 pagetop/static/theme/favicon.ico delete mode 100644 pagetop/static/theme/icons/bootstrap-icons.css delete mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff delete mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff2 diff --git a/README.md b/README.md index 18405171..a1fbff0c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ <div align="center"> - <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/pagetop/static/pagetop-banner.png" /> + <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/banner/pagetop.png" /> <h1>PageTop</h1> diff --git a/pagetop/static/pagetop-banner.png b/banner/pagetop.png similarity index 100% rename from pagetop/static/pagetop-banner.png rename to banner/pagetop.png diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 0bbd2a77..f96ea207 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -71,9 +71,6 @@ mysql = ["database", "sea-orm/sqlx-mysql"] postgres = ["database", "sea-orm/sqlx-postgres"] sqlite = ["database", "sea-orm/sqlx-sqlite"] -[build-dependencies] -pagetop-build = { path = "../pagetop-build", version = "0.0" } - [dev-dependencies] tokio = { version = "1.28.1", features = ["macros", "rt-multi-thread"] } diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index cf814730..da5d40af 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -24,4 +24,4 @@ serde = { version = "1.0", features = ["derive"] } [build-dependencies] # Para incluir archivos y recursos binarios en el ejecutable (opcional): -pagetop = { path = "../pagetop" } +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 5cab880e..7d396774 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -21,4 +21,4 @@ serde = { version = "1.0", features = ["derive"] } [build-dependencies] # Para incluir archivos y recursos binarios en la propia librería (opcional): -pagetop = { path = "../pagetop" } +pagetop-build = { path = "../pagetop-build", version = "0.0" } diff --git a/pagetop/build.rs b/pagetop/build.rs deleted file mode 100644 index b3903037..00000000 --- a/pagetop/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static/theme", "theme", None) -} diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index 5ad12743..f275018f 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -2,7 +2,7 @@ name = "PageTop Application" description = "Developed with the amazing PageTop framework." # Tema predeterminado. -theme = "Saturn" +theme = "Basic" # Idioma (localización) predeterminado. language = "en-US" # Dirección predeterminada para el texto: "ltr", "rtl" o "auto". @@ -21,17 +21,17 @@ db_user = "" db_pass = "" # Servidor (para mysql/postgres). db_host = "localhost" -# Puerto (para mysql/postgres), siendo 0 el puerto predeterminado (3306 ó 5432). +# Puerto, normalmente 3306 (para mysql) ó 5432 (para postgres). db_port = 0 # Número máximo de conexiones habilitadas. max_pool_size = 5 [dev] -# Los archivos estáticos requeridos por temas y componentes incluidos en PageTop -# se integran de manera predeterminada en el binario ejecutable. Sin embargo, es -# útil servir estos archivos desde su propio directorio durante el desarrollo ya -# que no requiere compilar cada vez que se modifican. En este caso, normalmente, -# basta con indicar el directorio "../pagetop/static". +# Los archivos estáticos requeridos por la aplicación se integran de manera +# predeterminada en el binario ejecutable. Sin embargo, durante el desarrollo +# puede resultar útil servir estos archivos desde su propio directorio para +# evitar compilar cada vez que se modifican. En este caso, normalmente, basta +# con indicar la ruta "../ruta/static". static_files = "" [log] diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs deleted file mode 100644 index 74a98984..00000000 --- a/pagetop/src/base.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod component; -pub mod module; diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs deleted file mode 100644 index 781a47ee..00000000 --- a/pagetop/src/base/component.rs +++ /dev/null @@ -1,22 +0,0 @@ -mod container; -pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; - -pub mod grid; - -mod html; -pub use html::{Html, COMPONENT_HTML}; -mod icon; -pub use icon::{Icon, COMPONENT_ICON}; -mod heading; -pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; -mod paragraph; -pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; -mod anchor; -pub use anchor::{Anchor, AnchorIcon, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; -mod block; -pub use block::{Block, COMPONENT_BLOCK}; -mod image; -pub use image::{Image, COMPONENT_IMAGE}; - -pub mod form_element; -pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs deleted file mode 100644 index 0ab91907..00000000 --- a/pagetop/src/base/component/anchor.rs +++ /dev/null @@ -1,220 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_ANCHOR); - -#[derive(Default)] -pub enum AnchorType { - #[default] - Link, - Button, - Location, -} - -#[derive(Default)] -pub enum AnchorTarget { - #[default] - Default, - Blank, - Parent, - Top, - Context(String), -} - -pub type AnchorIcon = ComponentsBundle; - -#[rustfmt::skip] -#[derive(Default)] -pub struct Anchor { - weight : isize, - renderable : Renderable, - id : IdentifierValue, - classes : Classes, - anchor_type: AnchorType, - href : AttributeValue, - html : HtmlMarkup, - left_icon : AnchorIcon, - right_icon : AnchorIcon, - target : AnchorTarget, - template : String, -} - -impl ComponentTrait for Anchor { - fn new() -> Self { - Anchor::default() - } - - fn handle(&self) -> Handle { - COMPONENT_ANCHOR - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - #[rustfmt::skip] - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - let target = match &self.target() { - AnchorTarget::Blank => Some("_blank"), - AnchorTarget::Parent => Some("_parent"), - AnchorTarget::Top => Some("_top"), - AnchorTarget::Context(name) => Some(name.as_str()), - _ => None, - }; - html! { - a - id=[self.id().get()] - class=[self.classes().get()] - href=[self.href().get()] - target=[target] - { - (self.left_icon().render(rcx)) - span { (*self.html()) } - (self.right_icon().render(rcx)) - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Anchor { - pub fn link(href: &str, html: Markup) -> Self { - Anchor::new().with_href(href).with_html(html) - } - - pub fn button(href: &str, html: Markup) -> Self { - Anchor::new() - .with_type(AnchorType::Button) - .with_href(href) - .with_html(html) - } - - pub fn location(id: &str) -> Self { - Anchor::new().with_type(AnchorType::Location).with_id(id) - } - - // Anchor BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { - self.anchor_type = anchor_type; - self.classes.alter_value( - ClassesOp::SetDefault, - match self.anchor_type { - AnchorType::Button => "btn btn-primary", - _ => "", - }, - ); - self - } - - #[fn_builder] - pub fn alter_href(&mut self, href: &str) -> &mut Self { - self.href.alter_value(href); - self - } - - #[fn_builder] - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html.markup = html; - self - } - - #[fn_builder] - pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { - self.left_icon.clear(); - self.left_icon.add(icon); - self - } - - #[fn_builder] - pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { - self.right_icon.clear(); - self.right_icon.add(icon); - self - } - - #[fn_builder] - pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { - self.target = target; - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Anchor GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn anchor_type(&self) -> &AnchorType { - &self.anchor_type - } - - pub fn href(&self) -> &AttributeValue { - &self.href - } - - pub fn html(&self) -> &Markup { - &self.html.markup - } - - pub fn left_icon(&self) -> &AnchorIcon { - &self.left_icon - } - - pub fn right_icon(&self) -> &AnchorIcon { - &self.right_icon - } - - pub fn target(&self) -> &AnchorTarget { - &self.target - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs deleted file mode 100644 index a97b18f4..00000000 --- a/pagetop/src/base/component/block.rs +++ /dev/null @@ -1,129 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_BLOCK); - -hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Block { - weight : isize, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - title : AttributeValue, - components: ComponentsBundle, - template : String, -} - -impl ComponentTrait for Block { - fn new() -> Self { - Block::default().with_classes(ClassesOp::SetDefault, "block") - } - - fn handle(&self) -> Handle { - COMPONENT_BLOCK - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - let id = rcx.required_id::<Block>(self.id()); - html! { - div id=(id) class=[self.classes().get()] { - @if let Some(title) = self.title().get() { - h2 class="block-title" { (title) } - } - div class="block-body" { - (self.components().render(rcx)) - } - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Block { - // Block BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_title(&mut self, title: &str) -> &mut Self { - self.title.alter_value(title); - self - } - - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Block GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn title(&self) -> &AttributeValue { - &self.title - } - - pub fn components(&self) -> &ComponentsBundle { - &self.components - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/container.rs b/pagetop/src/base/component/container.rs deleted file mode 100644 index 55081a9d..00000000 --- a/pagetop/src/base/component/container.rs +++ /dev/null @@ -1,194 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_CONTAINER); - -hook_before_render_component!(HOOK_BEFORE_RENDER_CONTAINER, Container); - -#[derive(Default)] -pub enum ContainerType { - #[default] - Wrapper, - Header, - Footer, - Main, - Section, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Container { - weight : isize, - renderable : Renderable, - id : IdentifierValue, - classes : Classes, - inner_classes : Classes, - container_type: ContainerType, - components : ComponentsBundle, - template : String, -} - -impl ComponentTrait for Container { - fn new() -> Self { - Container::default() - .with_classes(ClassesOp::SetDefault, "container") - .with_inner_classes(ClassesOp::SetDefault, "container") - } - - fn handle(&self) -> Handle { - COMPONENT_CONTAINER - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - match self.container_type() { - ContainerType::Header => html! { - header id=[self.id().get()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().render(rcx)) - } - } - }, - ContainerType::Footer => html! { - footer id=[self.id().get()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().render(rcx)) - } - } - }, - ContainerType::Main => html! { - main id=[self.id().get()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().render(rcx)) - } - } - }, - ContainerType::Section => html! { - section id=[self.id().get()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().render(rcx)) - } - } - }, - _ => html! { - div id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(rcx)) - } - }, - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Container { - pub fn header() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "header"); - c.container_type = ContainerType::Header; - c - } - - pub fn footer() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "footer"); - c.container_type = ContainerType::Footer; - c - } - - pub fn main() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "main"); - c.container_type = ContainerType::Main; - c - } - - pub fn section() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "section"); - c.container_type = ContainerType::Section; - c - } - - // Container BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.inner_classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Container GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn inner_classes(&self) -> &Classes { - &self.inner_classes - } - - pub fn container_type(&self) -> &ContainerType { - &self.container_type - } - - pub fn components(&self) -> &ComponentsBundle { - &self.components - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/form_element.rs b/pagetop/src/base/component/form_element.rs deleted file mode 100644 index bbd4e309..00000000 --- a/pagetop/src/base/component/form_element.rs +++ /dev/null @@ -1,11 +0,0 @@ -mod form; -pub use form::{Form, FormMethod, COMPONENT_FORM}; - -mod input; -pub use input::{Input, InputType, COMPONENT_INPUT}; -mod hidden; -pub use hidden::{Hidden, COMPONENT_HIDDEN}; -mod date; -pub use date::{Date, COMPONENT_DATE}; -mod button; -pub use button::{Button, ButtonType, COMPONENT_BUTTON}; diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs deleted file mode 100644 index c9eb1fc1..00000000 --- a/pagetop/src/base/component/form_element/button.rs +++ /dev/null @@ -1,183 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_BUTTON); - -#[derive(Default)] -pub enum ButtonType { - #[default] - Button, - Submit, - Reset, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Button { - weight : isize, - renderable : Renderable, - classes : Classes, - button_type: ButtonType, - name : AttributeValue, - value : AttributeValue, - autofocus : AttributeValue, - disabled : AttributeValue, - template : String, -} - -impl ComponentTrait for Button { - fn new() -> Self { - Button::default() - .with_classes(ClassesOp::SetDefault, "btn btn-primary") - .with_classes(ClassesOp::AddFirst, "form-button") - } - - fn handle(&self) -> Handle { - COMPONENT_BUTTON - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - let button_type = match self.button_type() { - ButtonType::Button => "button", - ButtonType::Submit => "submit", - ButtonType::Reset => "reset", - }; - let id = self.name().get().map(|name| concat_string!("edit-", name)); - html! { - button - type=(button_type) - id=[id] - class=[self.classes().get()] - name=[self.name().get()] - value=[self.value().get()] - autofocus=[self.autofocus().get()] - disabled=[self.disabled().get()] - { - @if let Some(value) = self.value().get() { (value) } - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Button { - pub fn with(value: &str) -> Self { - Button::new().with_value(value) - } - - pub fn submit(value: &str) -> Self { - let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button"), "form-submit") - .with_value(value); - button.button_type = ButtonType::Submit; - button - } - - pub fn reset(value: &str) -> Self { - let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button"), "form-reset") - .with_value(value); - button.button_type = ButtonType::Reset; - button - } - - // Button BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.alter_value(name); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); - self - } - - #[fn_builder] - pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.alter_value(match toggle { - true => "autofocus", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.alter_value(match toggle { - true => "disabled", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Button GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn button_type(&self) -> &ButtonType { - &self.button_type - } - - pub fn name(&self) -> &AttributeValue { - &self.name - } - - pub fn value(&self) -> &AttributeValue { - &self.value - } - - pub fn autofocus(&self) -> &AttributeValue { - &self.autofocus - } - - pub fn disabled(&self) -> &AttributeValue { - &self.disabled - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs deleted file mode 100644 index c35cc185..00000000 --- a/pagetop/src/base/component/form_element/date.rs +++ /dev/null @@ -1,236 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_DATE); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Date { - weight : isize, - renderable : Renderable, - classes : Classes, - name : AttributeValue, - value : AttributeValue, - label : AttributeValue, - placeholder : AttributeValue, - autofocus : AttributeValue, - autocomplete: AttributeValue, - disabled : AttributeValue, - readonly : AttributeValue, - required : AttributeValue, - help_text : AttributeValue, - template : String, -} - -impl ComponentTrait for Date { - fn new() -> Self { - Date::default() - .with_classes(ClassesOp::SetDefault, "form-item") - .with_classes(ClassesOp::AddFirst, "form-type-date") - } - - fn handle(&self) -> Handle { - COMPONENT_DATE - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - let id = self.name().get().map(|name| concat_string!("edit-", name)); - html! { - div class=[self.classes().get()] { - @if let Some(label) = self.label().get() { - label class="form-label" for=[&id] { - (label) " " - @if self.required().get().is_some() { - span - class="form-required" - title="Este campo es obligatorio." { "*" } " "; - } - } - } - input - type="date" - id=[id] - class="form-control" - name=[self.name().get()] - value=[self.value().get()] - placeholder=[self.placeholder().get()] - autofocus=[self.autofocus().get()] - autocomplete=[self.autocomplete().get()] - readonly=[self.readonly().get()] - required=[self.required().get()] - disabled=[self.disabled().get()]; - @if let Some(help_text) = self.help_text().get() { - div class="form-text" { (help_text) } - } - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Date { - // Date BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.alter_value(name); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); - self - } - - #[fn_builder] - pub fn alter_label(&mut self, label: &str) -> &mut Self { - self.label.alter_value(label); - self - } - - #[fn_builder] - pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { - self.placeholder.alter_value(placeholder); - self - } - - #[fn_builder] - pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.alter_value(match toggle { - true => "autofocus", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { - self.autocomplete.alter_value(match toggle { - true => "", - false => "off", - }); - self - } - - #[fn_builder] - pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.alter_value(match toggle { - true => "disabled", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { - self.readonly.alter_value(match toggle { - true => "readonly", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_required(&mut self, toggle: bool) -> &mut Self { - self.required.alter_value(match toggle { - true => "required", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { - self.help_text.alter_value(help_text); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Date GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn name(&self) -> &AttributeValue { - &self.name - } - - pub fn value(&self) -> &AttributeValue { - &self.value - } - - pub fn label(&self) -> &AttributeValue { - &self.label - } - - pub fn placeholder(&self) -> &AttributeValue { - &self.placeholder - } - - pub fn autofocus(&self) -> &AttributeValue { - &self.autofocus - } - - pub fn autocomplete(&self) -> &AttributeValue { - &self.autocomplete - } - - pub fn disabled(&self) -> &AttributeValue { - &self.disabled - } - - pub fn readonly(&self) -> &AttributeValue { - &self.readonly - } - - pub fn required(&self) -> &AttributeValue { - &self.required - } - - pub fn help_text(&self) -> &AttributeValue { - &self.help_text - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs deleted file mode 100644 index 78a90c52..00000000 --- a/pagetop/src/base/component/form_element/form.rs +++ /dev/null @@ -1,164 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_FORM); - -hook_before_render_component!(HOOK_BEFORE_RENDER_FORM, Form); - -#[derive(Default)] -pub enum FormMethod { - #[default] - Post, - Get, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Form { - weight : isize, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - action : AttributeValue, - charset : AttributeValue, - method : FormMethod, - elements : ComponentsBundle, - template : String, -} - -impl ComponentTrait for Form { - fn new() -> Self { - Form::default() - .with_classes(ClassesOp::SetDefault, "form") - .with_charset("UTF-8") - } - - fn handle(&self) -> Handle { - COMPONENT_FORM - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - let method = match self.method() { - FormMethod::Post => Some("post".to_owned()), - FormMethod::Get => None, - }; - html! { - form - id=[self.id().get()] - class=[self.classes().get()] - action=[self.action().get()] - method=[method] - accept-charset=[self.charset().get()] - { - div { (self.elements().render(rcx)) } - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Form { - // Form BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_action(&mut self, action: &str) -> &mut Self { - self.action.alter_value(action); - self - } - - #[fn_builder] - pub fn alter_charset(&mut self, charset: &str) -> &mut Self { - self.charset.alter_value(charset); - self - } - - #[fn_builder] - pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { - self.method = method; - self - } - - #[fn_builder] - pub fn alter_element(&mut self, element: impl ComponentTrait) -> &mut Self { - self.elements.add(element); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Form GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn action(&self) -> &AttributeValue { - &self.action - } - - pub fn charset(&self) -> &AttributeValue { - &self.charset - } - - pub fn method(&self) -> &FormMethod { - &self.method - } - - pub fn elements(&self) -> &ComponentsBundle { - &self.elements - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs deleted file mode 100644 index 034b0bde..00000000 --- a/pagetop/src/base/component/form_element/hidden.rs +++ /dev/null @@ -1,76 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_HIDDEN); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Hidden { - weight: isize, - name : NameValue, - value : AttributeValue, -} - -impl ComponentTrait for Hidden { - fn new() -> Self { - Hidden::default() - } - - fn handle(&self) -> Handle { - COMPONENT_HIDDEN - } - - fn weight(&self) -> isize { - self.weight - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - let id = self.name().get().map(|name| concat_string!("value-", name)); - html! { - input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Hidden { - pub fn set(name: &str, value: &str) -> Self { - Hidden::new().with_name(name).with_value(value) - } - - // Hidden BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.alter_value(name); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); - self - } - - // Hidden GETTERS. - - pub fn name(&self) -> &NameValue { - &self.name - } - - pub fn value(&self) -> &AttributeValue { - &self.value - } -} diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs deleted file mode 100644 index 6ff17690..00000000 --- a/pagetop/src/base/component/form_element/input.rs +++ /dev/null @@ -1,357 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_INPUT); - -#[derive(Default)] -pub enum InputType { - #[default] - Textfield, - Password, - Search, - Email, - Telephone, - Url, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Input { - weight : isize, - renderable : Renderable, - classes : Classes, - input_type : InputType, - name : NameValue, - value : AttributeValue, - label : AttributeValue, - size : Option<u16>, - minlength : Option<u16>, - maxlength : Option<u16>, - placeholder : AttributeValue, - autofocus : AttributeValue, - autocomplete: AttributeValue, - disabled : AttributeValue, - readonly : AttributeValue, - required : AttributeValue, - help_text : AttributeValue, - template : String, -} - -impl ComponentTrait for Input { - fn new() -> Self { - Input::default() - .with_classes(ClassesOp::SetDefault, "form-item") - .with_classes(ClassesOp::AddFirst, "form-type-textfield") - .with_size(Some(60)) - .with_maxlength(Some(128)) - } - - fn handle(&self) -> Handle { - COMPONENT_INPUT - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - #[rustfmt::skip] - fn default_render(&self, _: &mut RenderContext) -> Markup { - let type_input = match self.input_type() { - InputType::Textfield => "text", - InputType::Password => "password", - InputType::Search => "search", - InputType::Email => "email", - InputType::Telephone => "tel", - InputType::Url => "url", - }; - let id = self.name().get().map(|name| concat_string!("edit-", name)); - html! { - div class=[self.classes().get()] { - @if let Some(label) = self.label().get() { - label class="form-label" for=[&id] { - (label) " " - @if self.required().get().is_some() { - span - class="form-required" - title="Este campo es obligatorio." { "*" } " "; - } - } - } - input - type=(type_input) - id=[id] - class="form-control" - name=[self.name().get()] - value=[self.value().get()] - size=[self.size()] - minlength=[self.minlength()] - maxlength=[self.maxlength()] - placeholder=[self.placeholder().get()] - autofocus=[self.autofocus().get()] - autocomplete=[self.autocomplete().get()] - readonly=[self.readonly().get()] - required=[self.required().get()] - disabled=[self.disabled().get()]; - @if let Some(help_text) = self.help_text().get() { - div class="form-text" { (help_text) } - } - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Input { - pub fn textfield() -> Self { - Input::new() - } - - #[rustfmt::skip] - pub fn password() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), - "form-type-password", - ); - input.input_type = InputType::Password; - input - } - - #[rustfmt::skip] - pub fn search() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), - "form-type-search", - ); - input.input_type = InputType::Search; - input - } - - #[rustfmt::skip] - pub fn email() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), - "form-type-email" - ); - input.input_type = InputType::Email; - input - } - - #[rustfmt::skip] - pub fn telephone() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), - "form-type-telephone", - ); - input.input_type = InputType::Telephone; - input - } - - #[rustfmt::skip] - pub fn url() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), - "form-type-url" - ); - input.input_type = InputType::Url; - input - } - - // Input BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.alter_value(name); - self.alter_classes( - ClassesOp::SetDefault, - concat_string!("form-item form-item-", name).as_str(), - ); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); - self - } - - #[fn_builder] - pub fn alter_label(&mut self, label: &str) -> &mut Self { - self.label.alter_value(label); - self - } - - #[fn_builder] - pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { - self.size = size; - self - } - - #[fn_builder] - pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { - self.minlength = minlength; - self - } - - #[fn_builder] - pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { - self.maxlength = maxlength; - self - } - - #[fn_builder] - pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { - self.placeholder.alter_value(placeholder); - self - } - - #[fn_builder] - pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.alter_value(match toggle { - true => "autofocus", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { - self.autocomplete.alter_value(match toggle { - true => "", - false => "off", - }); - self - } - - #[fn_builder] - pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.alter_value(match toggle { - true => "disabled", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { - self.readonly.alter_value(match toggle { - true => "readonly", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_required(&mut self, toggle: bool) -> &mut Self { - self.required.alter_value(match toggle { - true => "required", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { - self.help_text.alter_value(help_text); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Input GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn input_type(&self) -> &InputType { - &self.input_type - } - - pub fn name(&self) -> &NameValue { - &self.name - } - - pub fn value(&self) -> &AttributeValue { - &self.value - } - - pub fn label(&self) -> &AttributeValue { - &self.label - } - - pub fn size(&self) -> Option<u16> { - self.size - } - - pub fn minlength(&self) -> Option<u16> { - self.minlength - } - - pub fn maxlength(&self) -> Option<u16> { - self.maxlength - } - - pub fn placeholder(&self) -> &AttributeValue { - &self.placeholder - } - - pub fn autofocus(&self) -> &AttributeValue { - &self.autofocus - } - - pub fn autocomplete(&self) -> &AttributeValue { - &self.autocomplete - } - - pub fn disabled(&self) -> &AttributeValue { - &self.disabled - } - - pub fn readonly(&self) -> &AttributeValue { - &self.readonly - } - - pub fn required(&self) -> &AttributeValue { - &self.required - } - - pub fn help_text(&self) -> &AttributeValue { - &self.help_text - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/grid.rs b/pagetop/src/base/component/grid.rs deleted file mode 100644 index b85bf837..00000000 --- a/pagetop/src/base/component/grid.rs +++ /dev/null @@ -1,4 +0,0 @@ -mod row; -pub use row::{Row, COMPONENT_ROW}; -mod column; -pub use column::{Column, ColumnSize, COMPONENT_COLUMN}; diff --git a/pagetop/src/base/component/grid/column.rs b/pagetop/src/base/component/grid/column.rs deleted file mode 100644 index 51271c5d..00000000 --- a/pagetop/src/base/component/grid/column.rs +++ /dev/null @@ -1,171 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_COLUMN); - -hook_before_render_component!(HOOK_BEFORE_RENDER_COLUMN, Column); - -const SIZE__DEFAULT: &str = "col-md"; -const SIZE__1_OF_12: &str = "col-md-1"; -const SIZE__2_OF_12: &str = "col-md-2"; -const SIZE__3_OF_12: &str = "col-md-3"; -const SIZE__4_OF_12: &str = "col-md-4"; -const SIZE__5_OF_12: &str = "col-md-5"; -const SIZE__6_OF_12: &str = "col-md-6"; -const SIZE__7_OF_12: &str = "col-md-7"; -const SIZE__8_OF_12: &str = "col-md-8"; -const SIZE__9_OF_12: &str = "col-md-9"; -const SIZE_10_OF_12: &str = "col-md-10"; -const SIZE_11_OF_12: &str = "col-md-11"; -const SIZE_12_OF_12: &str = "col-md-12"; - -#[derive(Default)] -pub enum ColumnSize { - #[default] - Default, - Is1of12, - Is2of12, - Is3of12, - Is4of12, - Is5of12, - Is6of12, - Is7of12, - Is8of12, - Is9of12, - Is10of12, - Is11of12, - IsFull, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Column { - weight : isize, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - size : ColumnSize, - components: ComponentsBundle, - template : String, -} - -impl ComponentTrait for Column { - fn new() -> Self { - Column::default().with_classes(ClassesOp::SetDefault, SIZE__DEFAULT) - } - - fn handle(&self) -> Handle { - COMPONENT_COLUMN - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - html! { - div id=[self.id().get()] class=[self.classes().get()] { - (self.components().render(rcx)) - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Column { - // Column BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[rustfmt::skip] - #[fn_builder] - pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { - match size { - ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE__DEFAULT), - ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__1_OF_12), - ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__2_OF_12), - ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__3_OF_12), - ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__4_OF_12), - ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__5_OF_12), - ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__6_OF_12), - ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__7_OF_12), - ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__8_OF_12), - ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__9_OF_12), - ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), - ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), - ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), - }; - self.size = size; - self - } - - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Column GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn size(&self) -> &ColumnSize { - &self.size - } - - pub fn components(&self) -> &ComponentsBundle { - &self.components - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/grid/row.rs b/pagetop/src/base/component/grid/row.rs deleted file mode 100644 index 8371dadd..00000000 --- a/pagetop/src/base/component/grid/row.rs +++ /dev/null @@ -1,112 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_ROW); - -hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Row { - weight : isize, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - columns : ComponentsBundle, - template : String, -} - -impl ComponentTrait for Row { - fn new() -> Self { - Row::default().with_classes(ClassesOp::SetDefault, "row") - } - - fn handle(&self) -> Handle { - COMPONENT_ROW - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - html! { - div id=[self.id().get()] class=[self.classes().get()] { - (self.columns().render(rcx)) - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Row { - // Row BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_column(&mut self, column: grid::Column) -> &mut Self { - self.columns.add(column); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Row GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn columns(&self) -> &ComponentsBundle { - &self.columns - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs deleted file mode 100644 index fb554b32..00000000 --- a/pagetop/src/base/component/heading.rs +++ /dev/null @@ -1,205 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_HEADING); - -#[derive(Default)] -pub enum HeadingType { - #[default] - H1, - H2, - H3, - H4, - H5, - H6, -} - -#[derive(Default)] -pub enum HeadingDisplay { - #[default] - Normal, - XxLarge, - Large, - Medium, - Small, - XxSmall, - Subtitle, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Heading { - weight : isize, - renderable : Renderable, - id : IdentifierValue, - classes : Classes, - heading_type: HeadingType, - html : HtmlMarkup, - display : HeadingDisplay, - template : String, -} - -impl ComponentTrait for Heading { - fn new() -> Self { - Heading::default() - } - - fn handle(&self) -> Handle { - COMPONENT_HEADING - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - let id = self.id().get(); - let classes = self.classes().get(); - html! { @match &self.heading_type() { - HeadingType::H1 => h1 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H2 => h2 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H3 => h3 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H4 => h4 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H5 => h5 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H6 => h6 id=[id] class=[classes] { (*self.html()) }, - }} - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Heading { - pub fn h1(html: Markup) -> Self { - Heading::new() - .with_heading_type(HeadingType::H1) - .with_html(html) - } - - pub fn h2(html: Markup) -> Self { - Heading::new() - .with_heading_type(HeadingType::H2) - .with_html(html) - } - - pub fn h3(html: Markup) -> Self { - Heading::new() - .with_heading_type(HeadingType::H3) - .with_html(html) - } - - pub fn h4(html: Markup) -> Self { - Heading::new() - .with_heading_type(HeadingType::H4) - .with_html(html) - } - - pub fn h5(html: Markup) -> Self { - Heading::new() - .with_heading_type(HeadingType::H5) - .with_html(html) - } - - pub fn h6(html: Markup) -> Self { - Heading::new() - .with_heading_type(HeadingType::H6) - .with_html(html) - } - - // Heading BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { - self.heading_type = heading_type; - self - } - - #[fn_builder] - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html.markup = html; - self - } - - #[rustfmt::skip] - #[fn_builder] - pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { - self.display = display; - self.classes.alter_value( - ClassesOp::SetDefault, - match &self.display() { - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::Large => "display-3", - HeadingDisplay::Medium => "display-4", - HeadingDisplay::Small => "display-5", - HeadingDisplay::XxSmall => "display-6", - HeadingDisplay::Normal => "", - HeadingDisplay::Subtitle => "", - }, - ); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Paragraph GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn heading_type(&self) -> &HeadingType { - &self.heading_type - } - - pub fn html(&self) -> &Markup { - &self.html.markup - } - - pub fn display(&self) -> &HeadingDisplay { - &self.display - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs deleted file mode 100644 index 2f135d46..00000000 --- a/pagetop/src/base/component/html.rs +++ /dev/null @@ -1,84 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_HTML); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Html { - weight : isize, - renderable: Renderable, - html : HtmlMarkup, - template : String, -} - -impl ComponentTrait for Html { - fn new() -> Self { - Html::default() - } - - fn handle(&self) -> Handle { - COMPONENT_HTML - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - html! { (*self.html()) } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Html { - pub fn with(html: Markup) -> Self { - Html::new().with_html(html) - } - - // Html BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html.markup = html; - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Html GETTERS. - - pub fn html(&self) -> &Markup { - &self.html.markup - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs deleted file mode 100644 index 8282c631..00000000 --- a/pagetop/src/base/component/icon.rs +++ /dev/null @@ -1,94 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_ICON); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Icon { - weight : isize, - renderable: Renderable, - icon_name : String, - classes : Classes, -} - -impl ComponentTrait for Icon { - fn new() -> Self { - Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") - } - - fn handle(&self) -> Handle { - COMPONENT_ICON - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn before_render(&mut self, rcx: &mut RenderContext) { - rcx.alter(ContextOp::AddStyleSheet( - StyleSheet::located("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), - )); - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - html! { i class=[self.classes().get()] {}; } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Icon { - pub fn with(icon_name: &str) -> Self { - Icon::new().with_icon_name(icon_name) - } - - // Icon BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { - self.icon_name = name.to_owned(); - self.alter_classes( - ClassesOp::SetDefault, - concat_string!("bi-", self.icon_name).as_str(), - ); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - // Icon GETTERS. - - pub fn icon_name(&self) -> &str { - self.icon_name.as_str() - } - - pub fn classes(&self) -> &Classes { - &self.classes - } -} diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs deleted file mode 100644 index e8e9def6..00000000 --- a/pagetop/src/base/component/image.rs +++ /dev/null @@ -1,111 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_IMAGE); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Image { - weight : isize, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - source : AttributeValue, - template : String, -} - -impl ComponentTrait for Image { - fn new() -> Self { - Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") - } - - fn handle(&self) -> Handle { - COMPONENT_IMAGE - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - html! { - img - src=[self.source().get()] - id=[self.id().get()] - class=[self.classes().get()]; - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Image { - pub fn with(source: &str) -> Self { - Image::new().with_source(source) - } - - // Image BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_source(&mut self, source: &str) -> &mut Self { - self.source.alter_value(source); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Image GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn source(&self) -> &AttributeValue { - &self.source - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs deleted file mode 100644 index 2ae521f8..00000000 --- a/pagetop/src/base/component/paragraph.rs +++ /dev/null @@ -1,147 +0,0 @@ -use crate::prelude::*; - -pub_handle!(COMPONENT_PARAGRAPH); - -#[derive(Default)] -pub enum ParagraphDisplay { - #[default] - Normal, - XxLarge, - Large, - Medium, - Small, - XxSmall, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Paragraph { - weight : isize, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - components: ComponentsBundle, - display : ParagraphDisplay, - template : String, -} - -impl ComponentTrait for Paragraph { - fn new() -> Self { - Paragraph::default() - } - - fn handle(&self) -> Handle { - COMPONENT_PARAGRAPH - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - html! { - p - id=[self.id().get()] - class=[self.classes().get()] - { - (self.components().render(rcx)) - } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Paragraph { - pub fn with(html: Markup) -> Self { - Paragraph::new().with_component(Html::with(html)) - } - - // Paragraph BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); - self - } - - #[rustfmt::skip] - #[fn_builder] - pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { - self.display = display; - self.classes.alter_value( - ClassesOp::SetDefault, - match &self.display() { - ParagraphDisplay::XxLarge => "fs-2", - ParagraphDisplay::Large => "fs-3", - ParagraphDisplay::Medium => "fs-4", - ParagraphDisplay::Small => "fs-5", - ParagraphDisplay::XxSmall => "fs-6", - ParagraphDisplay::Normal => "", - }, - ); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Paragraph GETTERS. - - pub fn id(&self) -> &IdentifierValue { - &self.id - } - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn components(&self) -> &ComponentsBundle { - &self.components - } - - pub fn display(&self) -> &ParagraphDisplay { - &self.display - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop/src/base/module.rs b/pagetop/src/base/module.rs deleted file mode 100644 index 362794e5..00000000 --- a/pagetop/src/base/module.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod saturn; - -pub mod menu; diff --git a/pagetop/src/base/module/menu.rs b/pagetop/src/base/module/menu.rs deleted file mode 100644 index 2894bdda..00000000 --- a/pagetop/src/base/module/menu.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::prelude::*; - -pub_handle!(MODULE_MENU); - -pub_locale!("src/base/module/menu/locales"); - -pub struct Menu; - -impl ModuleTrait for Menu { - fn handle(&self) -> Handle { - MODULE_MENU - } - - fn name(&self) -> String { - l("module_name") - } - - fn description(&self) -> Option<String> { - Some(l("module_description")) - } -} diff --git a/pagetop/src/base/module/menu/locales/en-US/menu.ftl b/pagetop/src/base/module/menu/locales/en-US/menu.ftl deleted file mode 100644 index b35e9677..00000000 --- a/pagetop/src/base/module/menu/locales/en-US/menu.ftl +++ /dev/null @@ -1,2 +0,0 @@ -module_name = Menu -module_description = ... diff --git a/pagetop/src/base/module/menu/locales/es-ES/menu.ftl b/pagetop/src/base/module/menu/locales/es-ES/menu.ftl deleted file mode 100644 index a36de8ac..00000000 --- a/pagetop/src/base/module/menu/locales/es-ES/menu.ftl +++ /dev/null @@ -1,2 +0,0 @@ -module_name = Menú -module_description = ... diff --git a/pagetop/src/base/module/saturn.rs b/pagetop/src/base/module/saturn.rs deleted file mode 100644 index dad1099e..00000000 --- a/pagetop/src/base/module/saturn.rs +++ /dev/null @@ -1,30 +0,0 @@ -use crate::prelude::*; - -pub_handle!(THEME_SATURN); - -include!(concat!(env!("OUT_DIR"), "/theme.rs")); - -pub struct Saturn; - -impl ModuleTrait for Saturn { - fn handle(&self) -> Handle { - THEME_SATURN - } - - fn theme(&self) -> Option<ThemeStaticRef> { - Some(&Saturn) - } - - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - serve_static_files!(cfg, "/theme", bundle_theme); - } -} - -impl ThemeTrait for Saturn { - fn before_render_page(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/theme/css/styles.css").with_weight(-99), - )); - } -} diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 496b2d31..0a36a0be 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -204,7 +204,7 @@ pub struct App { pub name: String, /// Valor predefinido: *"Developed with the amazing PageTop framework."* pub description: String, - /// Valor predefinido: *"Saturn"* + /// Valor predefinido: *"Basic"* pub theme: String, /// Valor predefinido: *"en-US"* pub language: String, @@ -278,7 +278,7 @@ pub_config!(SETTINGS: Settings, // [app] "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Saturn", + "app.theme" => "Basic", "app.language" => "en-US", "app.direction" => "ltr", "app.startup_banner" => "Slant", diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index 616ebedb..2ca529f6 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -6,3 +6,6 @@ pub mod hook; // API to add new features with modules and themes. pub mod module; + +// Basic theme. +mod basic; diff --git a/pagetop/src/core/basic.rs b/pagetop/src/core/basic.rs new file mode 100644 index 00000000..11f566df --- /dev/null +++ b/pagetop/src/core/basic.rs @@ -0,0 +1,19 @@ +use crate::core::module::{ModuleTrait, ThemeStaticRef, ThemeTrait}; +use crate::pub_handle; +use crate::util::Handle; + +pub_handle!(THEME_BASIC); + +pub struct Basic; + +impl ModuleTrait for Basic { + fn handle(&self) -> Handle { + THEME_BASIC + } + + fn theme(&self) -> Option<ThemeStaticRef> { + Some(&Basic) + } +} + +impl ThemeTrait for Basic {} diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index c426424b..fb39bd90 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,7 +1,7 @@ use crate::core::module::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; use crate::server::HttpRequest; -use crate::{base, concat_string, config, util, LazyStatic}; +use crate::{concat_string, config, util, LazyStatic}; use std::collections::HashMap; use std::str::FromStr; @@ -9,7 +9,7 @@ use std::str::FromStr; static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &base::module::saturn::Saturn, + None => &crate::core::basic::Basic, }); pub enum ContextOp { diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs index 20eacf96..346b8352 100644 --- a/pagetop/src/core/component/html_markup.rs +++ b/pagetop/src/core/component/html_markup.rs @@ -1,4 +1,9 @@ +use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; use crate::html::{html, Markup}; +use crate::pub_handle; +use crate::util::Handle; + +pub_handle!(HTML_MARKUP); pub struct HtmlMarkup { pub markup: Markup, @@ -9,3 +14,34 @@ impl Default for HtmlMarkup { HtmlMarkup { markup: html! {} } } } + +impl ComponentTrait for HtmlMarkup { + fn new() -> Self { + HtmlMarkup::default() + } + + fn handle(&self) -> Handle { + HTML_MARKUP + } + + fn default_render(&self, _rcx: &mut RenderContext) -> Markup { + html! { + (self.markup) + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl HtmlMarkup { + pub fn with(mut self, html: Markup) -> Self { + self.markup = html; + self + } +} diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 84b1a085..8468741e 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,6 +1,5 @@ use super::{ModuleStaticRef, ThemeStaticRef}; -use crate::base; use crate::core::hook::add_action; use crate::{server, trace, LazyStatic}; @@ -46,9 +45,8 @@ pub fn register_modules(app: ModuleStaticRef) { // List of modules to enable. let mut list: Vec<ModuleStaticRef> = Vec::new(); - // Enable base modules. - add_to_enabled(&mut list, &base::module::menu::Menu); - add_to_enabled(&mut list, &base::module::saturn::Saturn); + // Enable basic theme. + add_to_enabled(&mut list, &crate::core::basic::Basic); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/module/theme.rs b/pagetop/src/core/module/theme.rs index 77918dab..feeb012d 100644 --- a/pagetop/src/core/module/theme.rs +++ b/pagetop/src/core/module/theme.rs @@ -1,7 +1,6 @@ use super::ModuleTrait; -use crate::base::component::{Container, Html}; -use crate::core::component::{ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, HtmlMarkup, RenderContext}; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; use crate::{concat_string, config}; @@ -120,19 +119,19 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { */ } - fn error_404_not_found(&self) -> Container { - Container::new().with_component(Html::with(html! { + fn error_404_not_found(&self) -> HtmlMarkup { + HtmlMarkup::new().with(html! { div { h1 { ("RESOURCE NOT FOUND") } } - })) + }) } - fn error_403_access_denied(&self) -> Container { - Container::new().with_component(Html::with(html! { + fn error_403_access_denied(&self) -> HtmlMarkup { + HtmlMarkup::new().with(html! { div { h1 { ("FORBIDDEN ACCESS") } } - })) + }) } } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index a91e59e6..1808868e 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -75,8 +75,7 @@ pub mod server; // Tipos de respuestas a peticiones web. pub mod response; -// Base de componentes, módulos y temas. -pub mod base; + // Macros y funciones útiles. pub mod util; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 187d2116..d76e9ee7 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -30,6 +30,4 @@ pub use crate::response::page::*; pub use crate::response::FatalError; pub use crate::response::ResponseError; -pub use crate::base::component::*; - pub use crate::app::Application; diff --git a/pagetop/static/theme/css/styles.css b/pagetop/static/theme/css/styles.css deleted file mode 100644 index 1cc2f5dc..00000000 --- a/pagetop/static/theme/css/styles.css +++ /dev/null @@ -1,356 +0,0 @@ -html { - background-color: white; - padding: 1px 3px; -} -body { - padding: 1px 3px; -} -div { - padding: 1px 3px; - margin: 5px; -} -h1, h2, h3, h4,h5, h6, p { - background-color: snow; -} -* * { - outline: 5px solid rgba(255,0,0,.1); -} -* * * { - outline: 3px dashed rgba(255,0,0,.4); -} -* * * * { - outline: 2px dotted rgba(255,0,0,.6); -} -* * * * * { - outline: 1px dotted rgba(255,0,0,.9); -} -* * * * * * { - outline-color: gray; -} - -*::before, *::after { - background: #faa; - border-radius: 3px; - font: normal normal 400 10px/1.2 monospace; - vertical-align: middle; - padding: 1px 3px; - margin: 0 3px; -} -*::before { - content: "("; -} -*::after { - content: ")"; -} - -a::before { content: "<a>"; } -a::after { content: "</a>"; } -abbr::before { content: "<abbr>"; } -abbr::after { content: "</abbr>"; } -acronym::before { content: "<acronym>"; } -acronym::after { content: "</acronym>"; } -address::before { content: "<address>"; } -address::after { content: "</address>"; } -applet::before { content: "<applet>"; } -applet::after { content: "</applet>"; } -area::before { content: "<area>"; } -area::after { content: "</area>"; } -article::before { content: "<article>"; } -article::after { content: "</article>"; } -aside::before { content: "<aside>"; } -aside::after { content: "</aside>"; } -audio::before { content: "<audio>"; } -audio::after { content: "</audio>"; } - -b::before { content: "<b>"; } -b::after { content: "</b>"; } -base::before { content: "<base>"; } -base::after { content: "</base>"; } -basefont::before { content: "<basefont>"; } -basefont::after { content: "</basefont>"; } -bdi::before { content: "<bdi>"; } -bdi::after { content: "</bdi>"; } -bdo::before { content: "<bdo>"; } -bdo::after { content: "</bdo>"; } -bgsound::before { content: "<bgsound>"; } -bgsound::after { content: "</bgsound>"; } -big::before { content: "<big>"; } -big::after { content: "</big>"; } -blink::before { content: "<blink>"; } -blink::after { content: "</blink>"; } -blockquote::before { content: "<blockquote>"; } -blockquote::after { content: "</blockquote>"; } -body::before { content: "<body>"; } -body::after { content: "</body>"; } -br::before { content: "<br>"; } -br::after { content: "</br>"; } -button::before { content: "<button>"; } -button::after { content: "</button>"; } - -caption::before { content: "<caption>"; } -caption::after { content: "</caption>"; } -canvas::before { content: "<canvas>"; } -canvas::after { content: "</canvas>"; } -center::before { content: "<center>"; } -center::after { content: "</center>"; } -cite::before { content: "<cite>"; } -cite::after { content: "</cite>"; } -code::before { content: "<code>"; } -code::after { content: "</code>"; } -col::before { content: "<col>"; } -col::after { content: "</col>"; } -colgroup::before { content: "<colgroup>"; } -colgroup::after { content: "</colgroup>"; } -command::before { content: "<command>"; } -command::after { content: "</command>"; } -content::before { content: "<content>"; } -content::after { content: "</content>"; } - -data::before { content: "<data>"; } -data::after { content: "</data>"; } -datalist::before { content: "<datalist>"; } -datalist::after { content: "</datalist>"; } -dd::before { content: "<dd>"; } -dd::after { content: "</dd>"; } -del::before { content: "<del>"; } -del::after { content: "</del>"; } -details::before { content: "<details>"; } -details::after { content: "</details>"; } -dfn::before { content: "<dfn>"; } -dfn::after { content: "</dfn>"; } -dialog::before { content: "<dialog>"; } -dialog::after { content: "</dialog>"; } -dir::before { content: "<dir>"; } -dir::after { content: "</dir>"; } -div::before { content: "<div>"; } -div::after { content: "</div>"; } -dl::before { content: "<dl>"; } -dl::after { content: "</dl>"; } -dt::before { content: "<dt>"; } -dt::after { content: "</dt>"; } - -element::before { content: "<element>"; } -element::after { content: "</element>"; } -em::before { content: "<em>"; } -em::after { content: "</em>"; } -embed::before { content: "<embed>"; } -embed::after { content: "</embed>"; } - -fieldset::before { content: "<fieldset>"; } -fieldset::after { content: "</fieldset>"; } -figcaption::before { content: "<figcaption>"; } -figcaption::after { content: "</figcaption>"; } -figure::before { content: "<figure>"; } -figure::after { content: "</figure>"; } -font::before { content: "<font>"; } -font::after { content: "</font>"; } -footer::before { content: "<footer>"; } -footer::after { content: "</footer>"; } -form::before { content: "<form>"; } -form::after { content: "</form>"; } -frame::before { content: "<frame>"; } -frame::after { content: "</frame>"; } -frameset::before { content: "<frameset>"; } -frameset::after { content: "</frameset>"; } - -h1::before { content: "<h1>"; } -h1::after { content: "</h1>"; } -h2::before { content: "<h2>"; } -h2::after { content: "</h2>"; } -h3::before { content: "<h3>"; } -h3::after { content: "</h3>"; } -h4::before { content: "<h4>"; } -h4::after { content: "</h4>"; } -h5::before { content: "<h5>"; } -h5::after { content: "</h5>"; } -h6::before { content: "<h6>"; } -h6::after { content: "</h6>"; } -head::before { content: "<head>"; } -head::after { content: "</head>"; } -header::before { content: "<header>"; } -header::after { content: "</header>"; } -hgroup::before { content: "<hgroup>"; } -hgroup::after { content: "</hgroup>"; } -hr::before { content: "<hr>"; } -hr::after { content: "</hr>"; } -html::before { content: "<html>"; } -html::after { content: "</html>"; } - -i::before { content: "<i>"; } -i::after { content: "</i>"; } -iframe::before { content: "<iframe>"; } -iframe::after { content: "</iframe>"; } -image::before { content: "<image>"; } -image::after { content: "</image>"; } -img::before { content: "<img>"; } -img::after { content: "</img>"; } -input::before { content: "<input>"; } -input::after { content: "</input>"; } -ins::before { content: "<ins>"; } -ins::after { content: "</ins>"; } -isindex::before { content: "<isindex>"; } -isindex::after { content: "</isindex>"; } - -kbd::before { content: "<kbd>"; } -kbd::after { content: "</kbd>"; } -keygen::before { content: "<keygen>"; } -keygen::after { content: "</keygen>"; } - -label::before { content: "<label>"; } -label::after { content: "</label>"; } -legend::before { content: "<legend>"; } -legend::after { content: "</legend>"; } -li::before { content: "<li>"; } -li::after { content: "</li>"; } -link::before { content: "<link>"; } -link::after { content: "</link>"; } -listing::before { content: "<listing>"; } -listing::after { content: "</listing>"; } - -main::before { content: "<main>"; } -main::after { content: "</main>"; } -map::before { content: "<map>"; } -map::after { content: "</map>"; } -mark::before { content: "<mark>"; } -mark::after { content: "</mark>"; } -marquee::before { content: "<marquee>"; } -marquee::after { content: "</marquee>"; } -menu::before { content: "<menu>"; } -menu::after { content: "</menu>"; } -menuitem::before { content: "<menuitem>"; } -menuitem::after { content: "</menuitem>"; } -meta::before { content: "<meta>"; } -meta::after { content: "</meta>"; } -meter::before { content: "<meter>"; } -meter::after { content: "</meter>"; } -multicol::before { content: "<multicol>"; } -multicol::after { content: "</multicol>"; } - -nav::before { content: "<nav>"; } -nav::after { content: "</nav>"; } -nextid::before { content: "<nextid>"; } -nextid::after { content: "</nextid>"; } -nobr::before { content: "<nobr>"; } -nobr::after { content: "</nobr>"; } -noembed::before { content: "<noembed>"; } -noembed::after { content: "</noembed>"; } -noframes::before { content: "<noframes>"; } -noframes::after { content: "</noframes>"; } -noscript::before { content: "<noscript>"; } -noscript::after { content: "</noscript>"; } - -object::before { content: "<object>"; } -object::after { content: "</object>"; } -ol::before { content: "<ol>"; } -ol::after { content: "</ol>"; } -optgroup::before { content: "<optgroup>"; } -optgroup::after { content: "</optgroup>"; } -option::before { content: "<option>"; } -option::after { content: "</option>"; } -output::before { content: "<output>"; } -output::after { content: "</output>"; } - -p::before { content: "<p>"; } -p::after { content: "</p>"; } -param::before { content: "<param>"; } -param::after { content: "</param>"; } -picture::before { content: "<picture>"; } -picture::after { content: "</picture>"; } -plaintext::before { content: "<plaintext>"; } -plaintext::after { content: "</plaintext>"; } -pre::before { content: "<pre>"; } -pre::after { content: "</pre>"; } -progress::before { content: "<progress>"; } -progress::after { content: "</progress>"; } - -q::before { content: "<q>"; } -q::after { content: "</q>"; } - -rb::before { content: "<rb>"; } -rb::after { content: "</rb>"; } -rp::before { content: "<rp>"; } -rp::after { content: "</rp>"; } -rt::before { content: "<rt>"; } -rt::after { content: "</rt>"; } -rtc::before { content: "<rtc>"; } -rtc::after { content: "</rtc>"; } -ruby::before { content: "<ruby>"; } -ruby::after { content: "</ruby>"; } - -s::before { content: "<s>"; } -s::after { content: "</s>"; } -samp::before { content: "<samp>"; } -samp::after { content: "</samp>"; } -script::before { content: "<script>"; } -script::after { content: "</script>"; } -section::before { content: "<section>"; } -section::after { content: "</section>"; } -select::before { content: "<select>"; } -select::after { content: "</select>"; } -shadow::before { content: "<shadow>"; } -shadow::after { content: "</shadow>"; } -slot::before { content: "<slot>"; } -slot::after { content: "</slot>"; } -small::before { content: "<small>"; } -small::after { content: "</small>"; } -source::before { content: "<source>"; } -source::after { content: "</source>"; } -spacer::before { content: "<spacer>"; } -spacer::after { content: "</spacer>"; } -span::before { content: "<span>"; } -span::after { content: "</span>"; } -strike::before { content: "<strike>"; } -strike::after { content: "</strike>"; } -strong::before { content: "<strong>"; } -strong::after { content: "</strong>"; } -style::before { content: "<style>"; } -style::after { content: "<\/style>"; } -sub::before { content: "<sub>"; } -sub::after { content: "</sub>"; } -summary::before { content: "<summary>"; } -summary::after { content: "</summary>"; } -sup::before { content: "<sup>"; } -sup::after { content: "</sup>"; } - -table::before { content: "<table>"; } -table::after { content: "</table>"; } -tbody::before { content: "<tbody>"; } -tbody::after { content: "</tbody>"; } -td::before { content: "<td>"; } -td::after { content: "</td>"; } -template::before { content: "<template>"; } -template::after { content: "</template>"; } -textarea::before { content: "<textarea>"; } -textarea::after { content: "</textarea>"; } -tfoot::before { content: "<tfoot>"; } -tfoot::after { content: "</tfoot>"; } -th::before { content: "<th>"; } -th::after { content: "</th>"; } -thead::before { content: "<thead>"; } -thead::after { content: "</thead>"; } -time::before { content: "<time>"; } -time::after { content: "</time>"; } -title::before { content: "<title>"; } -title::after { content: "</title>"; } -tr::before { content: "<tr>"; } -tr::after { content: "</tr>"; } -track::before { content: "<track>"; } -track::after { content: "</track>"; } -tt::before { content: "<tt>"; } -tt::after { content: "</tt>"; } - -u::before { content: "<u>"; } -u::after { content: "</u>"; } -ul::before { content: "<ul>"; } -ul::after { content: "</ul>"; } - -var::before { content: "<var>"; } -var::after { content: "</var>"; } -video::before { content: "<video>"; } -video::after { content: "</video>"; } - -wbr::before { content: "<wbr>"; } -wbr::after { content: "</wbr>"; } - -xmp::before { content: "<xmp>"; } -xmp::after { content: "</xmp>"; } diff --git a/pagetop/static/theme/favicon.ico b/pagetop/static/theme/favicon.ico deleted file mode 100644 index 95e1affa748f69b77f95490649836e9861036325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10206 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 Yo2E{c#pzo8UZDq&kyMnZ6f+L`AAO+n{{R30 diff --git a/pagetop/static/theme/icons/bootstrap-icons.css b/pagetop/static/theme/icons/bootstrap-icons.css deleted file mode 100644 index 9a7d8ae2..00000000 --- a/pagetop/static/theme/icons/bootstrap-icons.css +++ /dev/null @@ -1,1705 +0,0 @@ -@font-face { - font-family: "bootstrap-icons"; - src: url("bootstrap-icons.woff2?ver=1.8.2") format("woff2"), - url("bootstrap-icons.woff?ver=1.8.2") format("woff"); -} - -.bi::before, -[class^="bi-"]::before, -[class*=" bi-"]::before { - display: inline-block; - font-display: block; - font-family: bootstrap-icons !important; - font-style: normal; - font-weight: normal !important; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: -.125em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.bi-123::before { content: "\f67f"; } -.bi-alarm-fill::before { content: "\f101"; } -.bi-alarm::before { content: "\f102"; } -.bi-align-bottom::before { content: "\f103"; } -.bi-align-center::before { content: "\f104"; } -.bi-align-end::before { content: "\f105"; } -.bi-align-middle::before { content: "\f106"; } -.bi-align-start::before { content: "\f107"; } -.bi-align-top::before { content: "\f108"; } -.bi-alt::before { content: "\f109"; } -.bi-app-indicator::before { content: "\f10a"; } -.bi-app::before { content: "\f10b"; } -.bi-archive-fill::before { content: "\f10c"; } -.bi-archive::before { content: "\f10d"; } -.bi-arrow-90deg-down::before { content: "\f10e"; } -.bi-arrow-90deg-left::before { content: "\f10f"; } -.bi-arrow-90deg-right::before { content: "\f110"; } -.bi-arrow-90deg-up::before { content: "\f111"; } -.bi-arrow-bar-down::before { content: "\f112"; } -.bi-arrow-bar-left::before { content: "\f113"; } -.bi-arrow-bar-right::before { content: "\f114"; } -.bi-arrow-bar-up::before { content: "\f115"; } -.bi-arrow-clockwise::before { content: "\f116"; } -.bi-arrow-counterclockwise::before { content: "\f117"; } -.bi-arrow-down-circle-fill::before { content: "\f118"; } -.bi-arrow-down-circle::before { content: "\f119"; } -.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } -.bi-arrow-down-left-circle::before { content: "\f11b"; } -.bi-arrow-down-left-square-fill::before { content: "\f11c"; } -.bi-arrow-down-left-square::before { content: "\f11d"; } -.bi-arrow-down-left::before { content: "\f11e"; } -.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } -.bi-arrow-down-right-circle::before { content: "\f120"; } -.bi-arrow-down-right-square-fill::before { content: "\f121"; } -.bi-arrow-down-right-square::before { content: "\f122"; } -.bi-arrow-down-right::before { content: "\f123"; } -.bi-arrow-down-short::before { content: "\f124"; } -.bi-arrow-down-square-fill::before { content: "\f125"; } -.bi-arrow-down-square::before { content: "\f126"; } -.bi-arrow-down-up::before { content: "\f127"; } -.bi-arrow-down::before { content: "\f128"; } -.bi-arrow-left-circle-fill::before { content: "\f129"; } -.bi-arrow-left-circle::before { content: "\f12a"; } -.bi-arrow-left-right::before { content: "\f12b"; } -.bi-arrow-left-short::before { content: "\f12c"; } -.bi-arrow-left-square-fill::before { content: "\f12d"; } -.bi-arrow-left-square::before { content: "\f12e"; } -.bi-arrow-left::before { content: "\f12f"; } -.bi-arrow-repeat::before { content: "\f130"; } -.bi-arrow-return-left::before { content: "\f131"; } -.bi-arrow-return-right::before { content: "\f132"; } -.bi-arrow-right-circle-fill::before { content: "\f133"; } -.bi-arrow-right-circle::before { content: "\f134"; } -.bi-arrow-right-short::before { content: "\f135"; } -.bi-arrow-right-square-fill::before { content: "\f136"; } -.bi-arrow-right-square::before { content: "\f137"; } -.bi-arrow-right::before { content: "\f138"; } -.bi-arrow-up-circle-fill::before { content: "\f139"; } -.bi-arrow-up-circle::before { content: "\f13a"; } -.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } -.bi-arrow-up-left-circle::before { content: "\f13c"; } -.bi-arrow-up-left-square-fill::before { content: "\f13d"; } -.bi-arrow-up-left-square::before { content: "\f13e"; } -.bi-arrow-up-left::before { content: "\f13f"; } -.bi-arrow-up-right-circle-fill::before { content: "\f140"; } -.bi-arrow-up-right-circle::before { content: "\f141"; } -.bi-arrow-up-right-square-fill::before { content: "\f142"; } -.bi-arrow-up-right-square::before { content: "\f143"; } -.bi-arrow-up-right::before { content: "\f144"; } -.bi-arrow-up-short::before { content: "\f145"; } -.bi-arrow-up-square-fill::before { content: "\f146"; } -.bi-arrow-up-square::before { content: "\f147"; } -.bi-arrow-up::before { content: "\f148"; } -.bi-arrows-angle-contract::before { content: "\f149"; } -.bi-arrows-angle-expand::before { content: "\f14a"; } -.bi-arrows-collapse::before { content: "\f14b"; } -.bi-arrows-expand::before { content: "\f14c"; } -.bi-arrows-fullscreen::before { content: "\f14d"; } -.bi-arrows-move::before { content: "\f14e"; } -.bi-aspect-ratio-fill::before { content: "\f14f"; } -.bi-aspect-ratio::before { content: "\f150"; } -.bi-asterisk::before { content: "\f151"; } -.bi-at::before { content: "\f152"; } -.bi-award-fill::before { content: "\f153"; } -.bi-award::before { content: "\f154"; } -.bi-back::before { content: "\f155"; } -.bi-backspace-fill::before { content: "\f156"; } -.bi-backspace-reverse-fill::before { content: "\f157"; } -.bi-backspace-reverse::before { content: "\f158"; } -.bi-backspace::before { content: "\f159"; } -.bi-badge-3d-fill::before { content: "\f15a"; } -.bi-badge-3d::before { content: "\f15b"; } -.bi-badge-4k-fill::before { content: "\f15c"; } -.bi-badge-4k::before { content: "\f15d"; } -.bi-badge-8k-fill::before { content: "\f15e"; } -.bi-badge-8k::before { content: "\f15f"; } -.bi-badge-ad-fill::before { content: "\f160"; } -.bi-badge-ad::before { content: "\f161"; } -.bi-badge-ar-fill::before { content: "\f162"; } -.bi-badge-ar::before { content: "\f163"; } -.bi-badge-cc-fill::before { content: "\f164"; } -.bi-badge-cc::before { content: "\f165"; } -.bi-badge-hd-fill::before { content: "\f166"; } -.bi-badge-hd::before { content: "\f167"; } -.bi-badge-tm-fill::before { content: "\f168"; } -.bi-badge-tm::before { content: "\f169"; } -.bi-badge-vo-fill::before { content: "\f16a"; } -.bi-badge-vo::before { content: "\f16b"; } -.bi-badge-vr-fill::before { content: "\f16c"; } -.bi-badge-vr::before { content: "\f16d"; } -.bi-badge-wc-fill::before { content: "\f16e"; } -.bi-badge-wc::before { content: "\f16f"; } -.bi-bag-check-fill::before { content: "\f170"; } -.bi-bag-check::before { content: "\f171"; } -.bi-bag-dash-fill::before { content: "\f172"; } -.bi-bag-dash::before { content: "\f173"; } -.bi-bag-fill::before { content: "\f174"; } -.bi-bag-plus-fill::before { content: "\f175"; } -.bi-bag-plus::before { content: "\f176"; } -.bi-bag-x-fill::before { content: "\f177"; } -.bi-bag-x::before { content: "\f178"; } -.bi-bag::before { content: "\f179"; } -.bi-bar-chart-fill::before { content: "\f17a"; } -.bi-bar-chart-line-fill::before { content: "\f17b"; } -.bi-bar-chart-line::before { content: "\f17c"; } -.bi-bar-chart-steps::before { content: "\f17d"; } -.bi-bar-chart::before { content: "\f17e"; } -.bi-basket-fill::before { content: "\f17f"; } -.bi-basket::before { content: "\f180"; } -.bi-basket2-fill::before { content: "\f181"; } -.bi-basket2::before { content: "\f182"; } -.bi-basket3-fill::before { content: "\f183"; } -.bi-basket3::before { content: "\f184"; } -.bi-battery-charging::before { content: "\f185"; } -.bi-battery-full::before { content: "\f186"; } -.bi-battery-half::before { content: "\f187"; } -.bi-battery::before { content: "\f188"; } -.bi-bell-fill::before { content: "\f189"; } -.bi-bell::before { content: "\f18a"; } -.bi-bezier::before { content: "\f18b"; } -.bi-bezier2::before { content: "\f18c"; } -.bi-bicycle::before { content: "\f18d"; } -.bi-binoculars-fill::before { content: "\f18e"; } -.bi-binoculars::before { content: "\f18f"; } -.bi-blockquote-left::before { content: "\f190"; } -.bi-blockquote-right::before { content: "\f191"; } -.bi-book-fill::before { content: "\f192"; } -.bi-book-half::before { content: "\f193"; } -.bi-book::before { content: "\f194"; } -.bi-bookmark-check-fill::before { content: "\f195"; } -.bi-bookmark-check::before { content: "\f196"; } -.bi-bookmark-dash-fill::before { content: "\f197"; } -.bi-bookmark-dash::before { content: "\f198"; } -.bi-bookmark-fill::before { content: "\f199"; } -.bi-bookmark-heart-fill::before { content: "\f19a"; } -.bi-bookmark-heart::before { content: "\f19b"; } -.bi-bookmark-plus-fill::before { content: "\f19c"; } -.bi-bookmark-plus::before { content: "\f19d"; } -.bi-bookmark-star-fill::before { content: "\f19e"; } -.bi-bookmark-star::before { content: "\f19f"; } -.bi-bookmark-x-fill::before { content: "\f1a0"; } -.bi-bookmark-x::before { content: "\f1a1"; } -.bi-bookmark::before { content: "\f1a2"; } -.bi-bookmarks-fill::before { content: "\f1a3"; } -.bi-bookmarks::before { content: "\f1a4"; } -.bi-bookshelf::before { content: "\f1a5"; } -.bi-bootstrap-fill::before { content: "\f1a6"; } -.bi-bootstrap-reboot::before { content: "\f1a7"; } -.bi-bootstrap::before { content: "\f1a8"; } -.bi-border-all::before { content: "\f1a9"; } -.bi-border-bottom::before { content: "\f1aa"; } -.bi-border-center::before { content: "\f1ab"; } -.bi-border-inner::before { content: "\f1ac"; } -.bi-border-left::before { content: "\f1ad"; } -.bi-border-middle::before { content: "\f1ae"; } -.bi-border-outer::before { content: "\f1af"; } -.bi-border-right::before { content: "\f1b0"; } -.bi-border-style::before { content: "\f1b1"; } -.bi-border-top::before { content: "\f1b2"; } -.bi-border-width::before { content: "\f1b3"; } -.bi-border::before { content: "\f1b4"; } -.bi-bounding-box-circles::before { content: "\f1b5"; } -.bi-bounding-box::before { content: "\f1b6"; } -.bi-box-arrow-down-left::before { content: "\f1b7"; } -.bi-box-arrow-down-right::before { content: "\f1b8"; } -.bi-box-arrow-down::before { content: "\f1b9"; } -.bi-box-arrow-in-down-left::before { content: "\f1ba"; } -.bi-box-arrow-in-down-right::before { content: "\f1bb"; } -.bi-box-arrow-in-down::before { content: "\f1bc"; } -.bi-box-arrow-in-left::before { content: "\f1bd"; } -.bi-box-arrow-in-right::before { content: "\f1be"; } -.bi-box-arrow-in-up-left::before { content: "\f1bf"; } -.bi-box-arrow-in-up-right::before { content: "\f1c0"; } -.bi-box-arrow-in-up::before { content: "\f1c1"; } -.bi-box-arrow-left::before { content: "\f1c2"; } -.bi-box-arrow-right::before { content: "\f1c3"; } -.bi-box-arrow-up-left::before { content: "\f1c4"; } -.bi-box-arrow-up-right::before { content: "\f1c5"; } -.bi-box-arrow-up::before { content: "\f1c6"; } -.bi-box-seam::before { content: "\f1c7"; } -.bi-box::before { content: "\f1c8"; } -.bi-braces::before { content: "\f1c9"; } -.bi-bricks::before { content: "\f1ca"; } -.bi-briefcase-fill::before { content: "\f1cb"; } -.bi-briefcase::before { content: "\f1cc"; } -.bi-brightness-alt-high-fill::before { content: "\f1cd"; } -.bi-brightness-alt-high::before { content: "\f1ce"; } -.bi-brightness-alt-low-fill::before { content: "\f1cf"; } -.bi-brightness-alt-low::before { content: "\f1d0"; } -.bi-brightness-high-fill::before { content: "\f1d1"; } -.bi-brightness-high::before { content: "\f1d2"; } -.bi-brightness-low-fill::before { content: "\f1d3"; } -.bi-brightness-low::before { content: "\f1d4"; } -.bi-broadcast-pin::before { content: "\f1d5"; } -.bi-broadcast::before { content: "\f1d6"; } -.bi-brush-fill::before { content: "\f1d7"; } -.bi-brush::before { content: "\f1d8"; } -.bi-bucket-fill::before { content: "\f1d9"; } -.bi-bucket::before { content: "\f1da"; } -.bi-bug-fill::before { content: "\f1db"; } -.bi-bug::before { content: "\f1dc"; } -.bi-building::before { content: "\f1dd"; } -.bi-bullseye::before { content: "\f1de"; } -.bi-calculator-fill::before { content: "\f1df"; } -.bi-calculator::before { content: "\f1e0"; } -.bi-calendar-check-fill::before { content: "\f1e1"; } -.bi-calendar-check::before { content: "\f1e2"; } -.bi-calendar-date-fill::before { content: "\f1e3"; } -.bi-calendar-date::before { content: "\f1e4"; } -.bi-calendar-day-fill::before { content: "\f1e5"; } -.bi-calendar-day::before { content: "\f1e6"; } -.bi-calendar-event-fill::before { content: "\f1e7"; } -.bi-calendar-event::before { content: "\f1e8"; } -.bi-calendar-fill::before { content: "\f1e9"; } -.bi-calendar-minus-fill::before { content: "\f1ea"; } -.bi-calendar-minus::before { content: "\f1eb"; } -.bi-calendar-month-fill::before { content: "\f1ec"; } -.bi-calendar-month::before { content: "\f1ed"; } -.bi-calendar-plus-fill::before { content: "\f1ee"; } -.bi-calendar-plus::before { content: "\f1ef"; } -.bi-calendar-range-fill::before { content: "\f1f0"; } -.bi-calendar-range::before { content: "\f1f1"; } -.bi-calendar-week-fill::before { content: "\f1f2"; } -.bi-calendar-week::before { content: "\f1f3"; } -.bi-calendar-x-fill::before { content: "\f1f4"; } -.bi-calendar-x::before { content: "\f1f5"; } -.bi-calendar::before { content: "\f1f6"; } -.bi-calendar2-check-fill::before { content: "\f1f7"; } -.bi-calendar2-check::before { content: "\f1f8"; } -.bi-calendar2-date-fill::before { content: "\f1f9"; } -.bi-calendar2-date::before { content: "\f1fa"; } -.bi-calendar2-day-fill::before { content: "\f1fb"; } -.bi-calendar2-day::before { content: "\f1fc"; } -.bi-calendar2-event-fill::before { content: "\f1fd"; } -.bi-calendar2-event::before { content: "\f1fe"; } -.bi-calendar2-fill::before { content: "\f1ff"; } -.bi-calendar2-minus-fill::before { content: "\f200"; } -.bi-calendar2-minus::before { content: "\f201"; } -.bi-calendar2-month-fill::before { content: "\f202"; } -.bi-calendar2-month::before { content: "\f203"; } -.bi-calendar2-plus-fill::before { content: "\f204"; } -.bi-calendar2-plus::before { content: "\f205"; } -.bi-calendar2-range-fill::before { content: "\f206"; } -.bi-calendar2-range::before { content: "\f207"; } -.bi-calendar2-week-fill::before { content: "\f208"; } -.bi-calendar2-week::before { content: "\f209"; } -.bi-calendar2-x-fill::before { content: "\f20a"; } -.bi-calendar2-x::before { content: "\f20b"; } -.bi-calendar2::before { content: "\f20c"; } -.bi-calendar3-event-fill::before { content: "\f20d"; } -.bi-calendar3-event::before { content: "\f20e"; } -.bi-calendar3-fill::before { content: "\f20f"; } -.bi-calendar3-range-fill::before { content: "\f210"; } -.bi-calendar3-range::before { content: "\f211"; } -.bi-calendar3-week-fill::before { content: "\f212"; } -.bi-calendar3-week::before { content: "\f213"; } -.bi-calendar3::before { content: "\f214"; } -.bi-calendar4-event::before { content: "\f215"; } -.bi-calendar4-range::before { content: "\f216"; } -.bi-calendar4-week::before { content: "\f217"; } -.bi-calendar4::before { content: "\f218"; } -.bi-camera-fill::before { content: "\f219"; } -.bi-camera-reels-fill::before { content: "\f21a"; } -.bi-camera-reels::before { content: "\f21b"; } -.bi-camera-video-fill::before { content: "\f21c"; } -.bi-camera-video-off-fill::before { content: "\f21d"; } -.bi-camera-video-off::before { content: "\f21e"; } -.bi-camera-video::before { content: "\f21f"; } -.bi-camera::before { content: "\f220"; } -.bi-camera2::before { content: "\f221"; } -.bi-capslock-fill::before { content: "\f222"; } -.bi-capslock::before { content: "\f223"; } -.bi-card-checklist::before { content: "\f224"; } -.bi-card-heading::before { content: "\f225"; } -.bi-card-image::before { content: "\f226"; } -.bi-card-list::before { content: "\f227"; } -.bi-card-text::before { content: "\f228"; } -.bi-caret-down-fill::before { content: "\f229"; } -.bi-caret-down-square-fill::before { content: "\f22a"; } -.bi-caret-down-square::before { content: "\f22b"; } -.bi-caret-down::before { content: "\f22c"; } -.bi-caret-left-fill::before { content: "\f22d"; } -.bi-caret-left-square-fill::before { content: "\f22e"; } -.bi-caret-left-square::before { content: "\f22f"; } -.bi-caret-left::before { content: "\f230"; } -.bi-caret-right-fill::before { content: "\f231"; } -.bi-caret-right-square-fill::before { content: "\f232"; } -.bi-caret-right-square::before { content: "\f233"; } -.bi-caret-right::before { content: "\f234"; } -.bi-caret-up-fill::before { content: "\f235"; } -.bi-caret-up-square-fill::before { content: "\f236"; } -.bi-caret-up-square::before { content: "\f237"; } -.bi-caret-up::before { content: "\f238"; } -.bi-cart-check-fill::before { content: "\f239"; } -.bi-cart-check::before { content: "\f23a"; } -.bi-cart-dash-fill::before { content: "\f23b"; } -.bi-cart-dash::before { content: "\f23c"; } -.bi-cart-fill::before { content: "\f23d"; } -.bi-cart-plus-fill::before { content: "\f23e"; } -.bi-cart-plus::before { content: "\f23f"; } -.bi-cart-x-fill::before { content: "\f240"; } -.bi-cart-x::before { content: "\f241"; } -.bi-cart::before { content: "\f242"; } -.bi-cart2::before { content: "\f243"; } -.bi-cart3::before { content: "\f244"; } -.bi-cart4::before { content: "\f245"; } -.bi-cash-stack::before { content: "\f246"; } -.bi-cash::before { content: "\f247"; } -.bi-cast::before { content: "\f248"; } -.bi-chat-dots-fill::before { content: "\f249"; } -.bi-chat-dots::before { content: "\f24a"; } -.bi-chat-fill::before { content: "\f24b"; } -.bi-chat-left-dots-fill::before { content: "\f24c"; } -.bi-chat-left-dots::before { content: "\f24d"; } -.bi-chat-left-fill::before { content: "\f24e"; } -.bi-chat-left-quote-fill::before { content: "\f24f"; } -.bi-chat-left-quote::before { content: "\f250"; } -.bi-chat-left-text-fill::before { content: "\f251"; } -.bi-chat-left-text::before { content: "\f252"; } -.bi-chat-left::before { content: "\f253"; } -.bi-chat-quote-fill::before { content: "\f254"; } -.bi-chat-quote::before { content: "\f255"; } -.bi-chat-right-dots-fill::before { content: "\f256"; } -.bi-chat-right-dots::before { content: "\f257"; } -.bi-chat-right-fill::before { content: "\f258"; } -.bi-chat-right-quote-fill::before { content: "\f259"; } -.bi-chat-right-quote::before { content: "\f25a"; } -.bi-chat-right-text-fill::before { content: "\f25b"; } -.bi-chat-right-text::before { content: "\f25c"; } -.bi-chat-right::before { content: "\f25d"; } -.bi-chat-square-dots-fill::before { content: "\f25e"; } -.bi-chat-square-dots::before { content: "\f25f"; } -.bi-chat-square-fill::before { content: "\f260"; } -.bi-chat-square-quote-fill::before { content: "\f261"; } -.bi-chat-square-quote::before { content: "\f262"; } -.bi-chat-square-text-fill::before { content: "\f263"; } -.bi-chat-square-text::before { content: "\f264"; } -.bi-chat-square::before { content: "\f265"; } -.bi-chat-text-fill::before { content: "\f266"; } -.bi-chat-text::before { content: "\f267"; } -.bi-chat::before { content: "\f268"; } -.bi-check-all::before { content: "\f269"; } -.bi-check-circle-fill::before { content: "\f26a"; } -.bi-check-circle::before { content: "\f26b"; } -.bi-check-square-fill::before { content: "\f26c"; } -.bi-check-square::before { content: "\f26d"; } -.bi-check::before { content: "\f26e"; } -.bi-check2-all::before { content: "\f26f"; } -.bi-check2-circle::before { content: "\f270"; } -.bi-check2-square::before { content: "\f271"; } -.bi-check2::before { content: "\f272"; } -.bi-chevron-bar-contract::before { content: "\f273"; } -.bi-chevron-bar-down::before { content: "\f274"; } -.bi-chevron-bar-expand::before { content: "\f275"; } -.bi-chevron-bar-left::before { content: "\f276"; } -.bi-chevron-bar-right::before { content: "\f277"; } -.bi-chevron-bar-up::before { content: "\f278"; } -.bi-chevron-compact-down::before { content: "\f279"; } -.bi-chevron-compact-left::before { content: "\f27a"; } -.bi-chevron-compact-right::before { content: "\f27b"; } -.bi-chevron-compact-up::before { content: "\f27c"; } -.bi-chevron-contract::before { content: "\f27d"; } -.bi-chevron-double-down::before { content: "\f27e"; } -.bi-chevron-double-left::before { content: "\f27f"; } -.bi-chevron-double-right::before { content: "\f280"; } -.bi-chevron-double-up::before { content: "\f281"; } -.bi-chevron-down::before { content: "\f282"; } -.bi-chevron-expand::before { content: "\f283"; } -.bi-chevron-left::before { content: "\f284"; } -.bi-chevron-right::before { content: "\f285"; } -.bi-chevron-up::before { content: "\f286"; } -.bi-circle-fill::before { content: "\f287"; } -.bi-circle-half::before { content: "\f288"; } -.bi-circle-square::before { content: "\f289"; } -.bi-circle::before { content: "\f28a"; } -.bi-clipboard-check::before { content: "\f28b"; } -.bi-clipboard-data::before { content: "\f28c"; } -.bi-clipboard-minus::before { content: "\f28d"; } -.bi-clipboard-plus::before { content: "\f28e"; } -.bi-clipboard-x::before { content: "\f28f"; } -.bi-clipboard::before { content: "\f290"; } -.bi-clock-fill::before { content: "\f291"; } -.bi-clock-history::before { content: "\f292"; } -.bi-clock::before { content: "\f293"; } -.bi-cloud-arrow-down-fill::before { content: "\f294"; } -.bi-cloud-arrow-down::before { content: "\f295"; } -.bi-cloud-arrow-up-fill::before { content: "\f296"; } -.bi-cloud-arrow-up::before { content: "\f297"; } -.bi-cloud-check-fill::before { content: "\f298"; } -.bi-cloud-check::before { content: "\f299"; } -.bi-cloud-download-fill::before { content: "\f29a"; } -.bi-cloud-download::before { content: "\f29b"; } -.bi-cloud-drizzle-fill::before { content: "\f29c"; } -.bi-cloud-drizzle::before { content: "\f29d"; } -.bi-cloud-fill::before { content: "\f29e"; } -.bi-cloud-fog-fill::before { content: "\f29f"; } -.bi-cloud-fog::before { content: "\f2a0"; } -.bi-cloud-fog2-fill::before { content: "\f2a1"; } -.bi-cloud-fog2::before { content: "\f2a2"; } -.bi-cloud-hail-fill::before { content: "\f2a3"; } -.bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-1::before { content: "\f2a5"; } -.bi-cloud-haze-fill::before { content: "\f2a6"; } -.bi-cloud-haze::before { content: "\f2a7"; } -.bi-cloud-haze2-fill::before { content: "\f2a8"; } -.bi-cloud-lightning-fill::before { content: "\f2a9"; } -.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } -.bi-cloud-lightning-rain::before { content: "\f2ab"; } -.bi-cloud-lightning::before { content: "\f2ac"; } -.bi-cloud-minus-fill::before { content: "\f2ad"; } -.bi-cloud-minus::before { content: "\f2ae"; } -.bi-cloud-moon-fill::before { content: "\f2af"; } -.bi-cloud-moon::before { content: "\f2b0"; } -.bi-cloud-plus-fill::before { content: "\f2b1"; } -.bi-cloud-plus::before { content: "\f2b2"; } -.bi-cloud-rain-fill::before { content: "\f2b3"; } -.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } -.bi-cloud-rain-heavy::before { content: "\f2b5"; } -.bi-cloud-rain::before { content: "\f2b6"; } -.bi-cloud-slash-fill::before { content: "\f2b7"; } -.bi-cloud-slash::before { content: "\f2b8"; } -.bi-cloud-sleet-fill::before { content: "\f2b9"; } -.bi-cloud-sleet::before { content: "\f2ba"; } -.bi-cloud-snow-fill::before { content: "\f2bb"; } -.bi-cloud-snow::before { content: "\f2bc"; } -.bi-cloud-sun-fill::before { content: "\f2bd"; } -.bi-cloud-sun::before { content: "\f2be"; } -.bi-cloud-upload-fill::before { content: "\f2bf"; } -.bi-cloud-upload::before { content: "\f2c0"; } -.bi-cloud::before { content: "\f2c1"; } -.bi-clouds-fill::before { content: "\f2c2"; } -.bi-clouds::before { content: "\f2c3"; } -.bi-cloudy-fill::before { content: "\f2c4"; } -.bi-cloudy::before { content: "\f2c5"; } -.bi-code-slash::before { content: "\f2c6"; } -.bi-code-square::before { content: "\f2c7"; } -.bi-code::before { content: "\f2c8"; } -.bi-collection-fill::before { content: "\f2c9"; } -.bi-collection-play-fill::before { content: "\f2ca"; } -.bi-collection-play::before { content: "\f2cb"; } -.bi-collection::before { content: "\f2cc"; } -.bi-columns-gap::before { content: "\f2cd"; } -.bi-columns::before { content: "\f2ce"; } -.bi-command::before { content: "\f2cf"; } -.bi-compass-fill::before { content: "\f2d0"; } -.bi-compass::before { content: "\f2d1"; } -.bi-cone-striped::before { content: "\f2d2"; } -.bi-cone::before { content: "\f2d3"; } -.bi-controller::before { content: "\f2d4"; } -.bi-cpu-fill::before { content: "\f2d5"; } -.bi-cpu::before { content: "\f2d6"; } -.bi-credit-card-2-back-fill::before { content: "\f2d7"; } -.bi-credit-card-2-back::before { content: "\f2d8"; } -.bi-credit-card-2-front-fill::before { content: "\f2d9"; } -.bi-credit-card-2-front::before { content: "\f2da"; } -.bi-credit-card-fill::before { content: "\f2db"; } -.bi-credit-card::before { content: "\f2dc"; } -.bi-crop::before { content: "\f2dd"; } -.bi-cup-fill::before { content: "\f2de"; } -.bi-cup-straw::before { content: "\f2df"; } -.bi-cup::before { content: "\f2e0"; } -.bi-cursor-fill::before { content: "\f2e1"; } -.bi-cursor-text::before { content: "\f2e2"; } -.bi-cursor::before { content: "\f2e3"; } -.bi-dash-circle-dotted::before { content: "\f2e4"; } -.bi-dash-circle-fill::before { content: "\f2e5"; } -.bi-dash-circle::before { content: "\f2e6"; } -.bi-dash-square-dotted::before { content: "\f2e7"; } -.bi-dash-square-fill::before { content: "\f2e8"; } -.bi-dash-square::before { content: "\f2e9"; } -.bi-dash::before { content: "\f2ea"; } -.bi-diagram-2-fill::before { content: "\f2eb"; } -.bi-diagram-2::before { content: "\f2ec"; } -.bi-diagram-3-fill::before { content: "\f2ed"; } -.bi-diagram-3::before { content: "\f2ee"; } -.bi-diamond-fill::before { content: "\f2ef"; } -.bi-diamond-half::before { content: "\f2f0"; } -.bi-diamond::before { content: "\f2f1"; } -.bi-dice-1-fill::before { content: "\f2f2"; } -.bi-dice-1::before { content: "\f2f3"; } -.bi-dice-2-fill::before { content: "\f2f4"; } -.bi-dice-2::before { content: "\f2f5"; } -.bi-dice-3-fill::before { content: "\f2f6"; } -.bi-dice-3::before { content: "\f2f7"; } -.bi-dice-4-fill::before { content: "\f2f8"; } -.bi-dice-4::before { content: "\f2f9"; } -.bi-dice-5-fill::before { content: "\f2fa"; } -.bi-dice-5::before { content: "\f2fb"; } -.bi-dice-6-fill::before { content: "\f2fc"; } -.bi-dice-6::before { content: "\f2fd"; } -.bi-disc-fill::before { content: "\f2fe"; } -.bi-disc::before { content: "\f2ff"; } -.bi-discord::before { content: "\f300"; } -.bi-display-fill::before { content: "\f301"; } -.bi-display::before { content: "\f302"; } -.bi-distribute-horizontal::before { content: "\f303"; } -.bi-distribute-vertical::before { content: "\f304"; } -.bi-door-closed-fill::before { content: "\f305"; } -.bi-door-closed::before { content: "\f306"; } -.bi-door-open-fill::before { content: "\f307"; } -.bi-door-open::before { content: "\f308"; } -.bi-dot::before { content: "\f309"; } -.bi-download::before { content: "\f30a"; } -.bi-droplet-fill::before { content: "\f30b"; } -.bi-droplet-half::before { content: "\f30c"; } -.bi-droplet::before { content: "\f30d"; } -.bi-earbuds::before { content: "\f30e"; } -.bi-easel-fill::before { content: "\f30f"; } -.bi-easel::before { content: "\f310"; } -.bi-egg-fill::before { content: "\f311"; } -.bi-egg-fried::before { content: "\f312"; } -.bi-egg::before { content: "\f313"; } -.bi-eject-fill::before { content: "\f314"; } -.bi-eject::before { content: "\f315"; } -.bi-emoji-angry-fill::before { content: "\f316"; } -.bi-emoji-angry::before { content: "\f317"; } -.bi-emoji-dizzy-fill::before { content: "\f318"; } -.bi-emoji-dizzy::before { content: "\f319"; } -.bi-emoji-expressionless-fill::before { content: "\f31a"; } -.bi-emoji-expressionless::before { content: "\f31b"; } -.bi-emoji-frown-fill::before { content: "\f31c"; } -.bi-emoji-frown::before { content: "\f31d"; } -.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } -.bi-emoji-heart-eyes::before { content: "\f31f"; } -.bi-emoji-laughing-fill::before { content: "\f320"; } -.bi-emoji-laughing::before { content: "\f321"; } -.bi-emoji-neutral-fill::before { content: "\f322"; } -.bi-emoji-neutral::before { content: "\f323"; } -.bi-emoji-smile-fill::before { content: "\f324"; } -.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } -.bi-emoji-smile-upside-down::before { content: "\f326"; } -.bi-emoji-smile::before { content: "\f327"; } -.bi-emoji-sunglasses-fill::before { content: "\f328"; } -.bi-emoji-sunglasses::before { content: "\f329"; } -.bi-emoji-wink-fill::before { content: "\f32a"; } -.bi-emoji-wink::before { content: "\f32b"; } -.bi-envelope-fill::before { content: "\f32c"; } -.bi-envelope-open-fill::before { content: "\f32d"; } -.bi-envelope-open::before { content: "\f32e"; } -.bi-envelope::before { content: "\f32f"; } -.bi-eraser-fill::before { content: "\f330"; } -.bi-eraser::before { content: "\f331"; } -.bi-exclamation-circle-fill::before { content: "\f332"; } -.bi-exclamation-circle::before { content: "\f333"; } -.bi-exclamation-diamond-fill::before { content: "\f334"; } -.bi-exclamation-diamond::before { content: "\f335"; } -.bi-exclamation-octagon-fill::before { content: "\f336"; } -.bi-exclamation-octagon::before { content: "\f337"; } -.bi-exclamation-square-fill::before { content: "\f338"; } -.bi-exclamation-square::before { content: "\f339"; } -.bi-exclamation-triangle-fill::before { content: "\f33a"; } -.bi-exclamation-triangle::before { content: "\f33b"; } -.bi-exclamation::before { content: "\f33c"; } -.bi-exclude::before { content: "\f33d"; } -.bi-eye-fill::before { content: "\f33e"; } -.bi-eye-slash-fill::before { content: "\f33f"; } -.bi-eye-slash::before { content: "\f340"; } -.bi-eye::before { content: "\f341"; } -.bi-eyedropper::before { content: "\f342"; } -.bi-eyeglasses::before { content: "\f343"; } -.bi-facebook::before { content: "\f344"; } -.bi-file-arrow-down-fill::before { content: "\f345"; } -.bi-file-arrow-down::before { content: "\f346"; } -.bi-file-arrow-up-fill::before { content: "\f347"; } -.bi-file-arrow-up::before { content: "\f348"; } -.bi-file-bar-graph-fill::before { content: "\f349"; } -.bi-file-bar-graph::before { content: "\f34a"; } -.bi-file-binary-fill::before { content: "\f34b"; } -.bi-file-binary::before { content: "\f34c"; } -.bi-file-break-fill::before { content: "\f34d"; } -.bi-file-break::before { content: "\f34e"; } -.bi-file-check-fill::before { content: "\f34f"; } -.bi-file-check::before { content: "\f350"; } -.bi-file-code-fill::before { content: "\f351"; } -.bi-file-code::before { content: "\f352"; } -.bi-file-diff-fill::before { content: "\f353"; } -.bi-file-diff::before { content: "\f354"; } -.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } -.bi-file-earmark-arrow-down::before { content: "\f356"; } -.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } -.bi-file-earmark-arrow-up::before { content: "\f358"; } -.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } -.bi-file-earmark-bar-graph::before { content: "\f35a"; } -.bi-file-earmark-binary-fill::before { content: "\f35b"; } -.bi-file-earmark-binary::before { content: "\f35c"; } -.bi-file-earmark-break-fill::before { content: "\f35d"; } -.bi-file-earmark-break::before { content: "\f35e"; } -.bi-file-earmark-check-fill::before { content: "\f35f"; } -.bi-file-earmark-check::before { content: "\f360"; } -.bi-file-earmark-code-fill::before { content: "\f361"; } -.bi-file-earmark-code::before { content: "\f362"; } -.bi-file-earmark-diff-fill::before { content: "\f363"; } -.bi-file-earmark-diff::before { content: "\f364"; } -.bi-file-earmark-easel-fill::before { content: "\f365"; } -.bi-file-earmark-easel::before { content: "\f366"; } -.bi-file-earmark-excel-fill::before { content: "\f367"; } -.bi-file-earmark-excel::before { content: "\f368"; } -.bi-file-earmark-fill::before { content: "\f369"; } -.bi-file-earmark-font-fill::before { content: "\f36a"; } -.bi-file-earmark-font::before { content: "\f36b"; } -.bi-file-earmark-image-fill::before { content: "\f36c"; } -.bi-file-earmark-image::before { content: "\f36d"; } -.bi-file-earmark-lock-fill::before { content: "\f36e"; } -.bi-file-earmark-lock::before { content: "\f36f"; } -.bi-file-earmark-lock2-fill::before { content: "\f370"; } -.bi-file-earmark-lock2::before { content: "\f371"; } -.bi-file-earmark-medical-fill::before { content: "\f372"; } -.bi-file-earmark-medical::before { content: "\f373"; } -.bi-file-earmark-minus-fill::before { content: "\f374"; } -.bi-file-earmark-minus::before { content: "\f375"; } -.bi-file-earmark-music-fill::before { content: "\f376"; } -.bi-file-earmark-music::before { content: "\f377"; } -.bi-file-earmark-person-fill::before { content: "\f378"; } -.bi-file-earmark-person::before { content: "\f379"; } -.bi-file-earmark-play-fill::before { content: "\f37a"; } -.bi-file-earmark-play::before { content: "\f37b"; } -.bi-file-earmark-plus-fill::before { content: "\f37c"; } -.bi-file-earmark-plus::before { content: "\f37d"; } -.bi-file-earmark-post-fill::before { content: "\f37e"; } -.bi-file-earmark-post::before { content: "\f37f"; } -.bi-file-earmark-ppt-fill::before { content: "\f380"; } -.bi-file-earmark-ppt::before { content: "\f381"; } -.bi-file-earmark-richtext-fill::before { content: "\f382"; } -.bi-file-earmark-richtext::before { content: "\f383"; } -.bi-file-earmark-ruled-fill::before { content: "\f384"; } -.bi-file-earmark-ruled::before { content: "\f385"; } -.bi-file-earmark-slides-fill::before { content: "\f386"; } -.bi-file-earmark-slides::before { content: "\f387"; } -.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } -.bi-file-earmark-spreadsheet::before { content: "\f389"; } -.bi-file-earmark-text-fill::before { content: "\f38a"; } -.bi-file-earmark-text::before { content: "\f38b"; } -.bi-file-earmark-word-fill::before { content: "\f38c"; } -.bi-file-earmark-word::before { content: "\f38d"; } -.bi-file-earmark-x-fill::before { content: "\f38e"; } -.bi-file-earmark-x::before { content: "\f38f"; } -.bi-file-earmark-zip-fill::before { content: "\f390"; } -.bi-file-earmark-zip::before { content: "\f391"; } -.bi-file-earmark::before { content: "\f392"; } -.bi-file-easel-fill::before { content: "\f393"; } -.bi-file-easel::before { content: "\f394"; } -.bi-file-excel-fill::before { content: "\f395"; } -.bi-file-excel::before { content: "\f396"; } -.bi-file-fill::before { content: "\f397"; } -.bi-file-font-fill::before { content: "\f398"; } -.bi-file-font::before { content: "\f399"; } -.bi-file-image-fill::before { content: "\f39a"; } -.bi-file-image::before { content: "\f39b"; } -.bi-file-lock-fill::before { content: "\f39c"; } -.bi-file-lock::before { content: "\f39d"; } -.bi-file-lock2-fill::before { content: "\f39e"; } -.bi-file-lock2::before { content: "\f39f"; } -.bi-file-medical-fill::before { content: "\f3a0"; } -.bi-file-medical::before { content: "\f3a1"; } -.bi-file-minus-fill::before { content: "\f3a2"; } -.bi-file-minus::before { content: "\f3a3"; } -.bi-file-music-fill::before { content: "\f3a4"; } -.bi-file-music::before { content: "\f3a5"; } -.bi-file-person-fill::before { content: "\f3a6"; } -.bi-file-person::before { content: "\f3a7"; } -.bi-file-play-fill::before { content: "\f3a8"; } -.bi-file-play::before { content: "\f3a9"; } -.bi-file-plus-fill::before { content: "\f3aa"; } -.bi-file-plus::before { content: "\f3ab"; } -.bi-file-post-fill::before { content: "\f3ac"; } -.bi-file-post::before { content: "\f3ad"; } -.bi-file-ppt-fill::before { content: "\f3ae"; } -.bi-file-ppt::before { content: "\f3af"; } -.bi-file-richtext-fill::before { content: "\f3b0"; } -.bi-file-richtext::before { content: "\f3b1"; } -.bi-file-ruled-fill::before { content: "\f3b2"; } -.bi-file-ruled::before { content: "\f3b3"; } -.bi-file-slides-fill::before { content: "\f3b4"; } -.bi-file-slides::before { content: "\f3b5"; } -.bi-file-spreadsheet-fill::before { content: "\f3b6"; } -.bi-file-spreadsheet::before { content: "\f3b7"; } -.bi-file-text-fill::before { content: "\f3b8"; } -.bi-file-text::before { content: "\f3b9"; } -.bi-file-word-fill::before { content: "\f3ba"; } -.bi-file-word::before { content: "\f3bb"; } -.bi-file-x-fill::before { content: "\f3bc"; } -.bi-file-x::before { content: "\f3bd"; } -.bi-file-zip-fill::before { content: "\f3be"; } -.bi-file-zip::before { content: "\f3bf"; } -.bi-file::before { content: "\f3c0"; } -.bi-files-alt::before { content: "\f3c1"; } -.bi-files::before { content: "\f3c2"; } -.bi-film::before { content: "\f3c3"; } -.bi-filter-circle-fill::before { content: "\f3c4"; } -.bi-filter-circle::before { content: "\f3c5"; } -.bi-filter-left::before { content: "\f3c6"; } -.bi-filter-right::before { content: "\f3c7"; } -.bi-filter-square-fill::before { content: "\f3c8"; } -.bi-filter-square::before { content: "\f3c9"; } -.bi-filter::before { content: "\f3ca"; } -.bi-flag-fill::before { content: "\f3cb"; } -.bi-flag::before { content: "\f3cc"; } -.bi-flower1::before { content: "\f3cd"; } -.bi-flower2::before { content: "\f3ce"; } -.bi-flower3::before { content: "\f3cf"; } -.bi-folder-check::before { content: "\f3d0"; } -.bi-folder-fill::before { content: "\f3d1"; } -.bi-folder-minus::before { content: "\f3d2"; } -.bi-folder-plus::before { content: "\f3d3"; } -.bi-folder-symlink-fill::before { content: "\f3d4"; } -.bi-folder-symlink::before { content: "\f3d5"; } -.bi-folder-x::before { content: "\f3d6"; } -.bi-folder::before { content: "\f3d7"; } -.bi-folder2-open::before { content: "\f3d8"; } -.bi-folder2::before { content: "\f3d9"; } -.bi-fonts::before { content: "\f3da"; } -.bi-forward-fill::before { content: "\f3db"; } -.bi-forward::before { content: "\f3dc"; } -.bi-front::before { content: "\f3dd"; } -.bi-fullscreen-exit::before { content: "\f3de"; } -.bi-fullscreen::before { content: "\f3df"; } -.bi-funnel-fill::before { content: "\f3e0"; } -.bi-funnel::before { content: "\f3e1"; } -.bi-gear-fill::before { content: "\f3e2"; } -.bi-gear-wide-connected::before { content: "\f3e3"; } -.bi-gear-wide::before { content: "\f3e4"; } -.bi-gear::before { content: "\f3e5"; } -.bi-gem::before { content: "\f3e6"; } -.bi-geo-alt-fill::before { content: "\f3e7"; } -.bi-geo-alt::before { content: "\f3e8"; } -.bi-geo-fill::before { content: "\f3e9"; } -.bi-geo::before { content: "\f3ea"; } -.bi-gift-fill::before { content: "\f3eb"; } -.bi-gift::before { content: "\f3ec"; } -.bi-github::before { content: "\f3ed"; } -.bi-globe::before { content: "\f3ee"; } -.bi-globe2::before { content: "\f3ef"; } -.bi-google::before { content: "\f3f0"; } -.bi-graph-down::before { content: "\f3f1"; } -.bi-graph-up::before { content: "\f3f2"; } -.bi-grid-1x2-fill::before { content: "\f3f3"; } -.bi-grid-1x2::before { content: "\f3f4"; } -.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } -.bi-grid-3x2-gap::before { content: "\f3f6"; } -.bi-grid-3x2::before { content: "\f3f7"; } -.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } -.bi-grid-3x3-gap::before { content: "\f3f9"; } -.bi-grid-3x3::before { content: "\f3fa"; } -.bi-grid-fill::before { content: "\f3fb"; } -.bi-grid::before { content: "\f3fc"; } -.bi-grip-horizontal::before { content: "\f3fd"; } -.bi-grip-vertical::before { content: "\f3fe"; } -.bi-hammer::before { content: "\f3ff"; } -.bi-hand-index-fill::before { content: "\f400"; } -.bi-hand-index-thumb-fill::before { content: "\f401"; } -.bi-hand-index-thumb::before { content: "\f402"; } -.bi-hand-index::before { content: "\f403"; } -.bi-hand-thumbs-down-fill::before { content: "\f404"; } -.bi-hand-thumbs-down::before { content: "\f405"; } -.bi-hand-thumbs-up-fill::before { content: "\f406"; } -.bi-hand-thumbs-up::before { content: "\f407"; } -.bi-handbag-fill::before { content: "\f408"; } -.bi-handbag::before { content: "\f409"; } -.bi-hash::before { content: "\f40a"; } -.bi-hdd-fill::before { content: "\f40b"; } -.bi-hdd-network-fill::before { content: "\f40c"; } -.bi-hdd-network::before { content: "\f40d"; } -.bi-hdd-rack-fill::before { content: "\f40e"; } -.bi-hdd-rack::before { content: "\f40f"; } -.bi-hdd-stack-fill::before { content: "\f410"; } -.bi-hdd-stack::before { content: "\f411"; } -.bi-hdd::before { content: "\f412"; } -.bi-headphones::before { content: "\f413"; } -.bi-headset::before { content: "\f414"; } -.bi-heart-fill::before { content: "\f415"; } -.bi-heart-half::before { content: "\f416"; } -.bi-heart::before { content: "\f417"; } -.bi-heptagon-fill::before { content: "\f418"; } -.bi-heptagon-half::before { content: "\f419"; } -.bi-heptagon::before { content: "\f41a"; } -.bi-hexagon-fill::before { content: "\f41b"; } -.bi-hexagon-half::before { content: "\f41c"; } -.bi-hexagon::before { content: "\f41d"; } -.bi-hourglass-bottom::before { content: "\f41e"; } -.bi-hourglass-split::before { content: "\f41f"; } -.bi-hourglass-top::before { content: "\f420"; } -.bi-hourglass::before { content: "\f421"; } -.bi-house-door-fill::before { content: "\f422"; } -.bi-house-door::before { content: "\f423"; } -.bi-house-fill::before { content: "\f424"; } -.bi-house::before { content: "\f425"; } -.bi-hr::before { content: "\f426"; } -.bi-hurricane::before { content: "\f427"; } -.bi-image-alt::before { content: "\f428"; } -.bi-image-fill::before { content: "\f429"; } -.bi-image::before { content: "\f42a"; } -.bi-images::before { content: "\f42b"; } -.bi-inbox-fill::before { content: "\f42c"; } -.bi-inbox::before { content: "\f42d"; } -.bi-inboxes-fill::before { content: "\f42e"; } -.bi-inboxes::before { content: "\f42f"; } -.bi-info-circle-fill::before { content: "\f430"; } -.bi-info-circle::before { content: "\f431"; } -.bi-info-square-fill::before { content: "\f432"; } -.bi-info-square::before { content: "\f433"; } -.bi-info::before { content: "\f434"; } -.bi-input-cursor-text::before { content: "\f435"; } -.bi-input-cursor::before { content: "\f436"; } -.bi-instagram::before { content: "\f437"; } -.bi-intersect::before { content: "\f438"; } -.bi-journal-album::before { content: "\f439"; } -.bi-journal-arrow-down::before { content: "\f43a"; } -.bi-journal-arrow-up::before { content: "\f43b"; } -.bi-journal-bookmark-fill::before { content: "\f43c"; } -.bi-journal-bookmark::before { content: "\f43d"; } -.bi-journal-check::before { content: "\f43e"; } -.bi-journal-code::before { content: "\f43f"; } -.bi-journal-medical::before { content: "\f440"; } -.bi-journal-minus::before { content: "\f441"; } -.bi-journal-plus::before { content: "\f442"; } -.bi-journal-richtext::before { content: "\f443"; } -.bi-journal-text::before { content: "\f444"; } -.bi-journal-x::before { content: "\f445"; } -.bi-journal::before { content: "\f446"; } -.bi-journals::before { content: "\f447"; } -.bi-joystick::before { content: "\f448"; } -.bi-justify-left::before { content: "\f449"; } -.bi-justify-right::before { content: "\f44a"; } -.bi-justify::before { content: "\f44b"; } -.bi-kanban-fill::before { content: "\f44c"; } -.bi-kanban::before { content: "\f44d"; } -.bi-key-fill::before { content: "\f44e"; } -.bi-key::before { content: "\f44f"; } -.bi-keyboard-fill::before { content: "\f450"; } -.bi-keyboard::before { content: "\f451"; } -.bi-ladder::before { content: "\f452"; } -.bi-lamp-fill::before { content: "\f453"; } -.bi-lamp::before { content: "\f454"; } -.bi-laptop-fill::before { content: "\f455"; } -.bi-laptop::before { content: "\f456"; } -.bi-layer-backward::before { content: "\f457"; } -.bi-layer-forward::before { content: "\f458"; } -.bi-layers-fill::before { content: "\f459"; } -.bi-layers-half::before { content: "\f45a"; } -.bi-layers::before { content: "\f45b"; } -.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } -.bi-layout-sidebar-inset::before { content: "\f45d"; } -.bi-layout-sidebar-reverse::before { content: "\f45e"; } -.bi-layout-sidebar::before { content: "\f45f"; } -.bi-layout-split::before { content: "\f460"; } -.bi-layout-text-sidebar-reverse::before { content: "\f461"; } -.bi-layout-text-sidebar::before { content: "\f462"; } -.bi-layout-text-window-reverse::before { content: "\f463"; } -.bi-layout-text-window::before { content: "\f464"; } -.bi-layout-three-columns::before { content: "\f465"; } -.bi-layout-wtf::before { content: "\f466"; } -.bi-life-preserver::before { content: "\f467"; } -.bi-lightbulb-fill::before { content: "\f468"; } -.bi-lightbulb-off-fill::before { content: "\f469"; } -.bi-lightbulb-off::before { content: "\f46a"; } -.bi-lightbulb::before { content: "\f46b"; } -.bi-lightning-charge-fill::before { content: "\f46c"; } -.bi-lightning-charge::before { content: "\f46d"; } -.bi-lightning-fill::before { content: "\f46e"; } -.bi-lightning::before { content: "\f46f"; } -.bi-link-45deg::before { content: "\f470"; } -.bi-link::before { content: "\f471"; } -.bi-linkedin::before { content: "\f472"; } -.bi-list-check::before { content: "\f473"; } -.bi-list-nested::before { content: "\f474"; } -.bi-list-ol::before { content: "\f475"; } -.bi-list-stars::before { content: "\f476"; } -.bi-list-task::before { content: "\f477"; } -.bi-list-ul::before { content: "\f478"; } -.bi-list::before { content: "\f479"; } -.bi-lock-fill::before { content: "\f47a"; } -.bi-lock::before { content: "\f47b"; } -.bi-mailbox::before { content: "\f47c"; } -.bi-mailbox2::before { content: "\f47d"; } -.bi-map-fill::before { content: "\f47e"; } -.bi-map::before { content: "\f47f"; } -.bi-markdown-fill::before { content: "\f480"; } -.bi-markdown::before { content: "\f481"; } -.bi-mask::before { content: "\f482"; } -.bi-megaphone-fill::before { content: "\f483"; } -.bi-megaphone::before { content: "\f484"; } -.bi-menu-app-fill::before { content: "\f485"; } -.bi-menu-app::before { content: "\f486"; } -.bi-menu-button-fill::before { content: "\f487"; } -.bi-menu-button-wide-fill::before { content: "\f488"; } -.bi-menu-button-wide::before { content: "\f489"; } -.bi-menu-button::before { content: "\f48a"; } -.bi-menu-down::before { content: "\f48b"; } -.bi-menu-up::before { content: "\f48c"; } -.bi-mic-fill::before { content: "\f48d"; } -.bi-mic-mute-fill::before { content: "\f48e"; } -.bi-mic-mute::before { content: "\f48f"; } -.bi-mic::before { content: "\f490"; } -.bi-minecart-loaded::before { content: "\f491"; } -.bi-minecart::before { content: "\f492"; } -.bi-moisture::before { content: "\f493"; } -.bi-moon-fill::before { content: "\f494"; } -.bi-moon-stars-fill::before { content: "\f495"; } -.bi-moon-stars::before { content: "\f496"; } -.bi-moon::before { content: "\f497"; } -.bi-mouse-fill::before { content: "\f498"; } -.bi-mouse::before { content: "\f499"; } -.bi-mouse2-fill::before { content: "\f49a"; } -.bi-mouse2::before { content: "\f49b"; } -.bi-mouse3-fill::before { content: "\f49c"; } -.bi-mouse3::before { content: "\f49d"; } -.bi-music-note-beamed::before { content: "\f49e"; } -.bi-music-note-list::before { content: "\f49f"; } -.bi-music-note::before { content: "\f4a0"; } -.bi-music-player-fill::before { content: "\f4a1"; } -.bi-music-player::before { content: "\f4a2"; } -.bi-newspaper::before { content: "\f4a3"; } -.bi-node-minus-fill::before { content: "\f4a4"; } -.bi-node-minus::before { content: "\f4a5"; } -.bi-node-plus-fill::before { content: "\f4a6"; } -.bi-node-plus::before { content: "\f4a7"; } -.bi-nut-fill::before { content: "\f4a8"; } -.bi-nut::before { content: "\f4a9"; } -.bi-octagon-fill::before { content: "\f4aa"; } -.bi-octagon-half::before { content: "\f4ab"; } -.bi-octagon::before { content: "\f4ac"; } -.bi-option::before { content: "\f4ad"; } -.bi-outlet::before { content: "\f4ae"; } -.bi-paint-bucket::before { content: "\f4af"; } -.bi-palette-fill::before { content: "\f4b0"; } -.bi-palette::before { content: "\f4b1"; } -.bi-palette2::before { content: "\f4b2"; } -.bi-paperclip::before { content: "\f4b3"; } -.bi-paragraph::before { content: "\f4b4"; } -.bi-patch-check-fill::before { content: "\f4b5"; } -.bi-patch-check::before { content: "\f4b6"; } -.bi-patch-exclamation-fill::before { content: "\f4b7"; } -.bi-patch-exclamation::before { content: "\f4b8"; } -.bi-patch-minus-fill::before { content: "\f4b9"; } -.bi-patch-minus::before { content: "\f4ba"; } -.bi-patch-plus-fill::before { content: "\f4bb"; } -.bi-patch-plus::before { content: "\f4bc"; } -.bi-patch-question-fill::before { content: "\f4bd"; } -.bi-patch-question::before { content: "\f4be"; } -.bi-pause-btn-fill::before { content: "\f4bf"; } -.bi-pause-btn::before { content: "\f4c0"; } -.bi-pause-circle-fill::before { content: "\f4c1"; } -.bi-pause-circle::before { content: "\f4c2"; } -.bi-pause-fill::before { content: "\f4c3"; } -.bi-pause::before { content: "\f4c4"; } -.bi-peace-fill::before { content: "\f4c5"; } -.bi-peace::before { content: "\f4c6"; } -.bi-pen-fill::before { content: "\f4c7"; } -.bi-pen::before { content: "\f4c8"; } -.bi-pencil-fill::before { content: "\f4c9"; } -.bi-pencil-square::before { content: "\f4ca"; } -.bi-pencil::before { content: "\f4cb"; } -.bi-pentagon-fill::before { content: "\f4cc"; } -.bi-pentagon-half::before { content: "\f4cd"; } -.bi-pentagon::before { content: "\f4ce"; } -.bi-people-fill::before { content: "\f4cf"; } -.bi-people::before { content: "\f4d0"; } -.bi-percent::before { content: "\f4d1"; } -.bi-person-badge-fill::before { content: "\f4d2"; } -.bi-person-badge::before { content: "\f4d3"; } -.bi-person-bounding-box::before { content: "\f4d4"; } -.bi-person-check-fill::before { content: "\f4d5"; } -.bi-person-check::before { content: "\f4d6"; } -.bi-person-circle::before { content: "\f4d7"; } -.bi-person-dash-fill::before { content: "\f4d8"; } -.bi-person-dash::before { content: "\f4d9"; } -.bi-person-fill::before { content: "\f4da"; } -.bi-person-lines-fill::before { content: "\f4db"; } -.bi-person-plus-fill::before { content: "\f4dc"; } -.bi-person-plus::before { content: "\f4dd"; } -.bi-person-square::before { content: "\f4de"; } -.bi-person-x-fill::before { content: "\f4df"; } -.bi-person-x::before { content: "\f4e0"; } -.bi-person::before { content: "\f4e1"; } -.bi-phone-fill::before { content: "\f4e2"; } -.bi-phone-landscape-fill::before { content: "\f4e3"; } -.bi-phone-landscape::before { content: "\f4e4"; } -.bi-phone-vibrate-fill::before { content: "\f4e5"; } -.bi-phone-vibrate::before { content: "\f4e6"; } -.bi-phone::before { content: "\f4e7"; } -.bi-pie-chart-fill::before { content: "\f4e8"; } -.bi-pie-chart::before { content: "\f4e9"; } -.bi-pin-angle-fill::before { content: "\f4ea"; } -.bi-pin-angle::before { content: "\f4eb"; } -.bi-pin-fill::before { content: "\f4ec"; } -.bi-pin::before { content: "\f4ed"; } -.bi-pip-fill::before { content: "\f4ee"; } -.bi-pip::before { content: "\f4ef"; } -.bi-play-btn-fill::before { content: "\f4f0"; } -.bi-play-btn::before { content: "\f4f1"; } -.bi-play-circle-fill::before { content: "\f4f2"; } -.bi-play-circle::before { content: "\f4f3"; } -.bi-play-fill::before { content: "\f4f4"; } -.bi-play::before { content: "\f4f5"; } -.bi-plug-fill::before { content: "\f4f6"; } -.bi-plug::before { content: "\f4f7"; } -.bi-plus-circle-dotted::before { content: "\f4f8"; } -.bi-plus-circle-fill::before { content: "\f4f9"; } -.bi-plus-circle::before { content: "\f4fa"; } -.bi-plus-square-dotted::before { content: "\f4fb"; } -.bi-plus-square-fill::before { content: "\f4fc"; } -.bi-plus-square::before { content: "\f4fd"; } -.bi-plus::before { content: "\f4fe"; } -.bi-power::before { content: "\f4ff"; } -.bi-printer-fill::before { content: "\f500"; } -.bi-printer::before { content: "\f501"; } -.bi-puzzle-fill::before { content: "\f502"; } -.bi-puzzle::before { content: "\f503"; } -.bi-question-circle-fill::before { content: "\f504"; } -.bi-question-circle::before { content: "\f505"; } -.bi-question-diamond-fill::before { content: "\f506"; } -.bi-question-diamond::before { content: "\f507"; } -.bi-question-octagon-fill::before { content: "\f508"; } -.bi-question-octagon::before { content: "\f509"; } -.bi-question-square-fill::before { content: "\f50a"; } -.bi-question-square::before { content: "\f50b"; } -.bi-question::before { content: "\f50c"; } -.bi-rainbow::before { content: "\f50d"; } -.bi-receipt-cutoff::before { content: "\f50e"; } -.bi-receipt::before { content: "\f50f"; } -.bi-reception-0::before { content: "\f510"; } -.bi-reception-1::before { content: "\f511"; } -.bi-reception-2::before { content: "\f512"; } -.bi-reception-3::before { content: "\f513"; } -.bi-reception-4::before { content: "\f514"; } -.bi-record-btn-fill::before { content: "\f515"; } -.bi-record-btn::before { content: "\f516"; } -.bi-record-circle-fill::before { content: "\f517"; } -.bi-record-circle::before { content: "\f518"; } -.bi-record-fill::before { content: "\f519"; } -.bi-record::before { content: "\f51a"; } -.bi-record2-fill::before { content: "\f51b"; } -.bi-record2::before { content: "\f51c"; } -.bi-reply-all-fill::before { content: "\f51d"; } -.bi-reply-all::before { content: "\f51e"; } -.bi-reply-fill::before { content: "\f51f"; } -.bi-reply::before { content: "\f520"; } -.bi-rss-fill::before { content: "\f521"; } -.bi-rss::before { content: "\f522"; } -.bi-rulers::before { content: "\f523"; } -.bi-save-fill::before { content: "\f524"; } -.bi-save::before { content: "\f525"; } -.bi-save2-fill::before { content: "\f526"; } -.bi-save2::before { content: "\f527"; } -.bi-scissors::before { content: "\f528"; } -.bi-screwdriver::before { content: "\f529"; } -.bi-search::before { content: "\f52a"; } -.bi-segmented-nav::before { content: "\f52b"; } -.bi-server::before { content: "\f52c"; } -.bi-share-fill::before { content: "\f52d"; } -.bi-share::before { content: "\f52e"; } -.bi-shield-check::before { content: "\f52f"; } -.bi-shield-exclamation::before { content: "\f530"; } -.bi-shield-fill-check::before { content: "\f531"; } -.bi-shield-fill-exclamation::before { content: "\f532"; } -.bi-shield-fill-minus::before { content: "\f533"; } -.bi-shield-fill-plus::before { content: "\f534"; } -.bi-shield-fill-x::before { content: "\f535"; } -.bi-shield-fill::before { content: "\f536"; } -.bi-shield-lock-fill::before { content: "\f537"; } -.bi-shield-lock::before { content: "\f538"; } -.bi-shield-minus::before { content: "\f539"; } -.bi-shield-plus::before { content: "\f53a"; } -.bi-shield-shaded::before { content: "\f53b"; } -.bi-shield-slash-fill::before { content: "\f53c"; } -.bi-shield-slash::before { content: "\f53d"; } -.bi-shield-x::before { content: "\f53e"; } -.bi-shield::before { content: "\f53f"; } -.bi-shift-fill::before { content: "\f540"; } -.bi-shift::before { content: "\f541"; } -.bi-shop-window::before { content: "\f542"; } -.bi-shop::before { content: "\f543"; } -.bi-shuffle::before { content: "\f544"; } -.bi-signpost-2-fill::before { content: "\f545"; } -.bi-signpost-2::before { content: "\f546"; } -.bi-signpost-fill::before { content: "\f547"; } -.bi-signpost-split-fill::before { content: "\f548"; } -.bi-signpost-split::before { content: "\f549"; } -.bi-signpost::before { content: "\f54a"; } -.bi-sim-fill::before { content: "\f54b"; } -.bi-sim::before { content: "\f54c"; } -.bi-skip-backward-btn-fill::before { content: "\f54d"; } -.bi-skip-backward-btn::before { content: "\f54e"; } -.bi-skip-backward-circle-fill::before { content: "\f54f"; } -.bi-skip-backward-circle::before { content: "\f550"; } -.bi-skip-backward-fill::before { content: "\f551"; } -.bi-skip-backward::before { content: "\f552"; } -.bi-skip-end-btn-fill::before { content: "\f553"; } -.bi-skip-end-btn::before { content: "\f554"; } -.bi-skip-end-circle-fill::before { content: "\f555"; } -.bi-skip-end-circle::before { content: "\f556"; } -.bi-skip-end-fill::before { content: "\f557"; } -.bi-skip-end::before { content: "\f558"; } -.bi-skip-forward-btn-fill::before { content: "\f559"; } -.bi-skip-forward-btn::before { content: "\f55a"; } -.bi-skip-forward-circle-fill::before { content: "\f55b"; } -.bi-skip-forward-circle::before { content: "\f55c"; } -.bi-skip-forward-fill::before { content: "\f55d"; } -.bi-skip-forward::before { content: "\f55e"; } -.bi-skip-start-btn-fill::before { content: "\f55f"; } -.bi-skip-start-btn::before { content: "\f560"; } -.bi-skip-start-circle-fill::before { content: "\f561"; } -.bi-skip-start-circle::before { content: "\f562"; } -.bi-skip-start-fill::before { content: "\f563"; } -.bi-skip-start::before { content: "\f564"; } -.bi-slack::before { content: "\f565"; } -.bi-slash-circle-fill::before { content: "\f566"; } -.bi-slash-circle::before { content: "\f567"; } -.bi-slash-square-fill::before { content: "\f568"; } -.bi-slash-square::before { content: "\f569"; } -.bi-slash::before { content: "\f56a"; } -.bi-sliders::before { content: "\f56b"; } -.bi-smartwatch::before { content: "\f56c"; } -.bi-snow::before { content: "\f56d"; } -.bi-snow2::before { content: "\f56e"; } -.bi-snow3::before { content: "\f56f"; } -.bi-sort-alpha-down-alt::before { content: "\f570"; } -.bi-sort-alpha-down::before { content: "\f571"; } -.bi-sort-alpha-up-alt::before { content: "\f572"; } -.bi-sort-alpha-up::before { content: "\f573"; } -.bi-sort-down-alt::before { content: "\f574"; } -.bi-sort-down::before { content: "\f575"; } -.bi-sort-numeric-down-alt::before { content: "\f576"; } -.bi-sort-numeric-down::before { content: "\f577"; } -.bi-sort-numeric-up-alt::before { content: "\f578"; } -.bi-sort-numeric-up::before { content: "\f579"; } -.bi-sort-up-alt::before { content: "\f57a"; } -.bi-sort-up::before { content: "\f57b"; } -.bi-soundwave::before { content: "\f57c"; } -.bi-speaker-fill::before { content: "\f57d"; } -.bi-speaker::before { content: "\f57e"; } -.bi-speedometer::before { content: "\f57f"; } -.bi-speedometer2::before { content: "\f580"; } -.bi-spellcheck::before { content: "\f581"; } -.bi-square-fill::before { content: "\f582"; } -.bi-square-half::before { content: "\f583"; } -.bi-square::before { content: "\f584"; } -.bi-stack::before { content: "\f585"; } -.bi-star-fill::before { content: "\f586"; } -.bi-star-half::before { content: "\f587"; } -.bi-star::before { content: "\f588"; } -.bi-stars::before { content: "\f589"; } -.bi-stickies-fill::before { content: "\f58a"; } -.bi-stickies::before { content: "\f58b"; } -.bi-sticky-fill::before { content: "\f58c"; } -.bi-sticky::before { content: "\f58d"; } -.bi-stop-btn-fill::before { content: "\f58e"; } -.bi-stop-btn::before { content: "\f58f"; } -.bi-stop-circle-fill::before { content: "\f590"; } -.bi-stop-circle::before { content: "\f591"; } -.bi-stop-fill::before { content: "\f592"; } -.bi-stop::before { content: "\f593"; } -.bi-stoplights-fill::before { content: "\f594"; } -.bi-stoplights::before { content: "\f595"; } -.bi-stopwatch-fill::before { content: "\f596"; } -.bi-stopwatch::before { content: "\f597"; } -.bi-subtract::before { content: "\f598"; } -.bi-suit-club-fill::before { content: "\f599"; } -.bi-suit-club::before { content: "\f59a"; } -.bi-suit-diamond-fill::before { content: "\f59b"; } -.bi-suit-diamond::before { content: "\f59c"; } -.bi-suit-heart-fill::before { content: "\f59d"; } -.bi-suit-heart::before { content: "\f59e"; } -.bi-suit-spade-fill::before { content: "\f59f"; } -.bi-suit-spade::before { content: "\f5a0"; } -.bi-sun-fill::before { content: "\f5a1"; } -.bi-sun::before { content: "\f5a2"; } -.bi-sunglasses::before { content: "\f5a3"; } -.bi-sunrise-fill::before { content: "\f5a4"; } -.bi-sunrise::before { content: "\f5a5"; } -.bi-sunset-fill::before { content: "\f5a6"; } -.bi-sunset::before { content: "\f5a7"; } -.bi-symmetry-horizontal::before { content: "\f5a8"; } -.bi-symmetry-vertical::before { content: "\f5a9"; } -.bi-table::before { content: "\f5aa"; } -.bi-tablet-fill::before { content: "\f5ab"; } -.bi-tablet-landscape-fill::before { content: "\f5ac"; } -.bi-tablet-landscape::before { content: "\f5ad"; } -.bi-tablet::before { content: "\f5ae"; } -.bi-tag-fill::before { content: "\f5af"; } -.bi-tag::before { content: "\f5b0"; } -.bi-tags-fill::before { content: "\f5b1"; } -.bi-tags::before { content: "\f5b2"; } -.bi-telegram::before { content: "\f5b3"; } -.bi-telephone-fill::before { content: "\f5b4"; } -.bi-telephone-forward-fill::before { content: "\f5b5"; } -.bi-telephone-forward::before { content: "\f5b6"; } -.bi-telephone-inbound-fill::before { content: "\f5b7"; } -.bi-telephone-inbound::before { content: "\f5b8"; } -.bi-telephone-minus-fill::before { content: "\f5b9"; } -.bi-telephone-minus::before { content: "\f5ba"; } -.bi-telephone-outbound-fill::before { content: "\f5bb"; } -.bi-telephone-outbound::before { content: "\f5bc"; } -.bi-telephone-plus-fill::before { content: "\f5bd"; } -.bi-telephone-plus::before { content: "\f5be"; } -.bi-telephone-x-fill::before { content: "\f5bf"; } -.bi-telephone-x::before { content: "\f5c0"; } -.bi-telephone::before { content: "\f5c1"; } -.bi-terminal-fill::before { content: "\f5c2"; } -.bi-terminal::before { content: "\f5c3"; } -.bi-text-center::before { content: "\f5c4"; } -.bi-text-indent-left::before { content: "\f5c5"; } -.bi-text-indent-right::before { content: "\f5c6"; } -.bi-text-left::before { content: "\f5c7"; } -.bi-text-paragraph::before { content: "\f5c8"; } -.bi-text-right::before { content: "\f5c9"; } -.bi-textarea-resize::before { content: "\f5ca"; } -.bi-textarea-t::before { content: "\f5cb"; } -.bi-textarea::before { content: "\f5cc"; } -.bi-thermometer-half::before { content: "\f5cd"; } -.bi-thermometer-high::before { content: "\f5ce"; } -.bi-thermometer-low::before { content: "\f5cf"; } -.bi-thermometer-snow::before { content: "\f5d0"; } -.bi-thermometer-sun::before { content: "\f5d1"; } -.bi-thermometer::before { content: "\f5d2"; } -.bi-three-dots-vertical::before { content: "\f5d3"; } -.bi-three-dots::before { content: "\f5d4"; } -.bi-toggle-off::before { content: "\f5d5"; } -.bi-toggle-on::before { content: "\f5d6"; } -.bi-toggle2-off::before { content: "\f5d7"; } -.bi-toggle2-on::before { content: "\f5d8"; } -.bi-toggles::before { content: "\f5d9"; } -.bi-toggles2::before { content: "\f5da"; } -.bi-tools::before { content: "\f5db"; } -.bi-tornado::before { content: "\f5dc"; } -.bi-trash-fill::before { content: "\f5dd"; } -.bi-trash::before { content: "\f5de"; } -.bi-trash2-fill::before { content: "\f5df"; } -.bi-trash2::before { content: "\f5e0"; } -.bi-tree-fill::before { content: "\f5e1"; } -.bi-tree::before { content: "\f5e2"; } -.bi-triangle-fill::before { content: "\f5e3"; } -.bi-triangle-half::before { content: "\f5e4"; } -.bi-triangle::before { content: "\f5e5"; } -.bi-trophy-fill::before { content: "\f5e6"; } -.bi-trophy::before { content: "\f5e7"; } -.bi-tropical-storm::before { content: "\f5e8"; } -.bi-truck-flatbed::before { content: "\f5e9"; } -.bi-truck::before { content: "\f5ea"; } -.bi-tsunami::before { content: "\f5eb"; } -.bi-tv-fill::before { content: "\f5ec"; } -.bi-tv::before { content: "\f5ed"; } -.bi-twitch::before { content: "\f5ee"; } -.bi-twitter::before { content: "\f5ef"; } -.bi-type-bold::before { content: "\f5f0"; } -.bi-type-h1::before { content: "\f5f1"; } -.bi-type-h2::before { content: "\f5f2"; } -.bi-type-h3::before { content: "\f5f3"; } -.bi-type-italic::before { content: "\f5f4"; } -.bi-type-strikethrough::before { content: "\f5f5"; } -.bi-type-underline::before { content: "\f5f6"; } -.bi-type::before { content: "\f5f7"; } -.bi-ui-checks-grid::before { content: "\f5f8"; } -.bi-ui-checks::before { content: "\f5f9"; } -.bi-ui-radios-grid::before { content: "\f5fa"; } -.bi-ui-radios::before { content: "\f5fb"; } -.bi-umbrella-fill::before { content: "\f5fc"; } -.bi-umbrella::before { content: "\f5fd"; } -.bi-union::before { content: "\f5fe"; } -.bi-unlock-fill::before { content: "\f5ff"; } -.bi-unlock::before { content: "\f600"; } -.bi-upc-scan::before { content: "\f601"; } -.bi-upc::before { content: "\f602"; } -.bi-upload::before { content: "\f603"; } -.bi-vector-pen::before { content: "\f604"; } -.bi-view-list::before { content: "\f605"; } -.bi-view-stacked::before { content: "\f606"; } -.bi-vinyl-fill::before { content: "\f607"; } -.bi-vinyl::before { content: "\f608"; } -.bi-voicemail::before { content: "\f609"; } -.bi-volume-down-fill::before { content: "\f60a"; } -.bi-volume-down::before { content: "\f60b"; } -.bi-volume-mute-fill::before { content: "\f60c"; } -.bi-volume-mute::before { content: "\f60d"; } -.bi-volume-off-fill::before { content: "\f60e"; } -.bi-volume-off::before { content: "\f60f"; } -.bi-volume-up-fill::before { content: "\f610"; } -.bi-volume-up::before { content: "\f611"; } -.bi-vr::before { content: "\f612"; } -.bi-wallet-fill::before { content: "\f613"; } -.bi-wallet::before { content: "\f614"; } -.bi-wallet2::before { content: "\f615"; } -.bi-watch::before { content: "\f616"; } -.bi-water::before { content: "\f617"; } -.bi-whatsapp::before { content: "\f618"; } -.bi-wifi-1::before { content: "\f619"; } -.bi-wifi-2::before { content: "\f61a"; } -.bi-wifi-off::before { content: "\f61b"; } -.bi-wifi::before { content: "\f61c"; } -.bi-wind::before { content: "\f61d"; } -.bi-window-dock::before { content: "\f61e"; } -.bi-window-sidebar::before { content: "\f61f"; } -.bi-window::before { content: "\f620"; } -.bi-wrench::before { content: "\f621"; } -.bi-x-circle-fill::before { content: "\f622"; } -.bi-x-circle::before { content: "\f623"; } -.bi-x-diamond-fill::before { content: "\f624"; } -.bi-x-diamond::before { content: "\f625"; } -.bi-x-octagon-fill::before { content: "\f626"; } -.bi-x-octagon::before { content: "\f627"; } -.bi-x-square-fill::before { content: "\f628"; } -.bi-x-square::before { content: "\f629"; } -.bi-x::before { content: "\f62a"; } -.bi-youtube::before { content: "\f62b"; } -.bi-zoom-in::before { content: "\f62c"; } -.bi-zoom-out::before { content: "\f62d"; } -.bi-bank::before { content: "\f62e"; } -.bi-bank2::before { content: "\f62f"; } -.bi-bell-slash-fill::before { content: "\f630"; } -.bi-bell-slash::before { content: "\f631"; } -.bi-cash-coin::before { content: "\f632"; } -.bi-check-lg::before { content: "\f633"; } -.bi-coin::before { content: "\f634"; } -.bi-currency-bitcoin::before { content: "\f635"; } -.bi-currency-dollar::before { content: "\f636"; } -.bi-currency-euro::before { content: "\f637"; } -.bi-currency-exchange::before { content: "\f638"; } -.bi-currency-pound::before { content: "\f639"; } -.bi-currency-yen::before { content: "\f63a"; } -.bi-dash-lg::before { content: "\f63b"; } -.bi-exclamation-lg::before { content: "\f63c"; } -.bi-file-earmark-pdf-fill::before { content: "\f63d"; } -.bi-file-earmark-pdf::before { content: "\f63e"; } -.bi-file-pdf-fill::before { content: "\f63f"; } -.bi-file-pdf::before { content: "\f640"; } -.bi-gender-ambiguous::before { content: "\f641"; } -.bi-gender-female::before { content: "\f642"; } -.bi-gender-male::before { content: "\f643"; } -.bi-gender-trans::before { content: "\f644"; } -.bi-headset-vr::before { content: "\f645"; } -.bi-info-lg::before { content: "\f646"; } -.bi-mastodon::before { content: "\f647"; } -.bi-messenger::before { content: "\f648"; } -.bi-piggy-bank-fill::before { content: "\f649"; } -.bi-piggy-bank::before { content: "\f64a"; } -.bi-pin-map-fill::before { content: "\f64b"; } -.bi-pin-map::before { content: "\f64c"; } -.bi-plus-lg::before { content: "\f64d"; } -.bi-question-lg::before { content: "\f64e"; } -.bi-recycle::before { content: "\f64f"; } -.bi-reddit::before { content: "\f650"; } -.bi-safe-fill::before { content: "\f651"; } -.bi-safe2-fill::before { content: "\f652"; } -.bi-safe2::before { content: "\f653"; } -.bi-sd-card-fill::before { content: "\f654"; } -.bi-sd-card::before { content: "\f655"; } -.bi-skype::before { content: "\f656"; } -.bi-slash-lg::before { content: "\f657"; } -.bi-translate::before { content: "\f658"; } -.bi-x-lg::before { content: "\f659"; } -.bi-safe::before { content: "\f65a"; } -.bi-apple::before { content: "\f65b"; } -.bi-microsoft::before { content: "\f65d"; } -.bi-windows::before { content: "\f65e"; } -.bi-behance::before { content: "\f65c"; } -.bi-dribbble::before { content: "\f65f"; } -.bi-line::before { content: "\f660"; } -.bi-medium::before { content: "\f661"; } -.bi-paypal::before { content: "\f662"; } -.bi-pinterest::before { content: "\f663"; } -.bi-signal::before { content: "\f664"; } -.bi-snapchat::before { content: "\f665"; } -.bi-spotify::before { content: "\f666"; } -.bi-stack-overflow::before { content: "\f667"; } -.bi-strava::before { content: "\f668"; } -.bi-wordpress::before { content: "\f669"; } -.bi-vimeo::before { content: "\f66a"; } -.bi-activity::before { content: "\f66b"; } -.bi-easel2-fill::before { content: "\f66c"; } -.bi-easel2::before { content: "\f66d"; } -.bi-easel3-fill::before { content: "\f66e"; } -.bi-easel3::before { content: "\f66f"; } -.bi-fan::before { content: "\f670"; } -.bi-fingerprint::before { content: "\f671"; } -.bi-graph-down-arrow::before { content: "\f672"; } -.bi-graph-up-arrow::before { content: "\f673"; } -.bi-hypnotize::before { content: "\f674"; } -.bi-magic::before { content: "\f675"; } -.bi-person-rolodex::before { content: "\f676"; } -.bi-person-video::before { content: "\f677"; } -.bi-person-video2::before { content: "\f678"; } -.bi-person-video3::before { content: "\f679"; } -.bi-person-workspace::before { content: "\f67a"; } -.bi-radioactive::before { content: "\f67b"; } -.bi-webcam-fill::before { content: "\f67c"; } -.bi-webcam::before { content: "\f67d"; } -.bi-yin-yang::before { content: "\f67e"; } -.bi-bandaid-fill::before { content: "\f680"; } -.bi-bandaid::before { content: "\f681"; } -.bi-bluetooth::before { content: "\f682"; } -.bi-body-text::before { content: "\f683"; } -.bi-boombox::before { content: "\f684"; } -.bi-boxes::before { content: "\f685"; } -.bi-dpad-fill::before { content: "\f686"; } -.bi-dpad::before { content: "\f687"; } -.bi-ear-fill::before { content: "\f688"; } -.bi-ear::before { content: "\f689"; } -.bi-envelope-check-1::before { content: "\f68a"; } -.bi-envelope-check-fill::before { content: "\f68b"; } -.bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-1::before { content: "\f68d"; } -.bi-envelope-dash-fill::before { content: "\f68e"; } -.bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-1::before { content: "\f690"; } -.bi-envelope-exclamation-fill::before { content: "\f691"; } -.bi-envelope-exclamation::before { content: "\f692"; } -.bi-envelope-plus-fill::before { content: "\f693"; } -.bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-1::before { content: "\f695"; } -.bi-envelope-slash-fill::before { content: "\f696"; } -.bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-1::before { content: "\f698"; } -.bi-envelope-x-fill::before { content: "\f699"; } -.bi-envelope-x::before { content: "\f69a"; } -.bi-explicit-fill::before { content: "\f69b"; } -.bi-explicit::before { content: "\f69c"; } -.bi-git::before { content: "\f69d"; } -.bi-infinity::before { content: "\f69e"; } -.bi-list-columns-reverse::before { content: "\f69f"; } -.bi-list-columns::before { content: "\f6a0"; } -.bi-meta::before { content: "\f6a1"; } -.bi-mortorboard-fill::before { content: "\f6a2"; } -.bi-mortorboard::before { content: "\f6a3"; } -.bi-nintendo-switch::before { content: "\f6a4"; } -.bi-pc-display-horizontal::before { content: "\f6a5"; } -.bi-pc-display::before { content: "\f6a6"; } -.bi-pc-horizontal::before { content: "\f6a7"; } -.bi-pc::before { content: "\f6a8"; } -.bi-playstation::before { content: "\f6a9"; } -.bi-plus-slash-minus::before { content: "\f6aa"; } -.bi-projector-fill::before { content: "\f6ab"; } -.bi-projector::before { content: "\f6ac"; } -.bi-qr-code-scan::before { content: "\f6ad"; } -.bi-qr-code::before { content: "\f6ae"; } -.bi-quora::before { content: "\f6af"; } -.bi-quote::before { content: "\f6b0"; } -.bi-robot::before { content: "\f6b1"; } -.bi-send-check-fill::before { content: "\f6b2"; } -.bi-send-check::before { content: "\f6b3"; } -.bi-send-dash-fill::before { content: "\f6b4"; } -.bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-1::before { content: "\f6b6"; } -.bi-send-exclamation-fill::before { content: "\f6b7"; } -.bi-send-exclamation::before { content: "\f6b8"; } -.bi-send-fill::before { content: "\f6b9"; } -.bi-send-plus-fill::before { content: "\f6ba"; } -.bi-send-plus::before { content: "\f6bb"; } -.bi-send-slash-fill::before { content: "\f6bc"; } -.bi-send-slash::before { content: "\f6bd"; } -.bi-send-x-fill::before { content: "\f6be"; } -.bi-send-x::before { content: "\f6bf"; } -.bi-send::before { content: "\f6c0"; } -.bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash-1::before { content: "\f6c2"; } -.bi-terminal-dash::before { content: "\f6c3"; } -.bi-terminal-plus::before { content: "\f6c4"; } -.bi-terminal-split::before { content: "\f6c5"; } -.bi-ticket-detailed-fill::before { content: "\f6c6"; } -.bi-ticket-detailed::before { content: "\f6c7"; } -.bi-ticket-fill::before { content: "\f6c8"; } -.bi-ticket-perforated-fill::before { content: "\f6c9"; } -.bi-ticket-perforated::before { content: "\f6ca"; } -.bi-ticket::before { content: "\f6cb"; } -.bi-tiktok::before { content: "\f6cc"; } -.bi-window-dash::before { content: "\f6cd"; } -.bi-window-desktop::before { content: "\f6ce"; } -.bi-window-fullscreen::before { content: "\f6cf"; } -.bi-window-plus::before { content: "\f6d0"; } -.bi-window-split::before { content: "\f6d1"; } -.bi-window-stack::before { content: "\f6d2"; } -.bi-window-x::before { content: "\f6d3"; } -.bi-xbox::before { content: "\f6d4"; } -.bi-ethernet::before { content: "\f6d5"; } -.bi-hdmi-fill::before { content: "\f6d6"; } -.bi-hdmi::before { content: "\f6d7"; } -.bi-usb-c-fill::before { content: "\f6d8"; } -.bi-usb-c::before { content: "\f6d9"; } -.bi-usb-fill::before { content: "\f6da"; } -.bi-usb-plug-fill::before { content: "\f6db"; } -.bi-usb-plug::before { content: "\f6dc"; } -.bi-usb-symbol::before { content: "\f6dd"; } -.bi-usb::before { content: "\f6de"; } -.bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport-1::before { content: "\f6e0"; } -.bi-displayport::before { content: "\f6e1"; } -.bi-gpu-card::before { content: "\f6e2"; } -.bi-memory::before { content: "\f6e3"; } -.bi-modem-fill::before { content: "\f6e4"; } -.bi-modem::before { content: "\f6e5"; } -.bi-motherboard-fill::before { content: "\f6e6"; } -.bi-motherboard::before { content: "\f6e7"; } -.bi-optical-audio-fill::before { content: "\f6e8"; } -.bi-optical-audio::before { content: "\f6e9"; } -.bi-pci-card::before { content: "\f6ea"; } -.bi-router-fill::before { content: "\f6eb"; } -.bi-router::before { content: "\f6ec"; } -.bi-ssd-fill::before { content: "\f6ed"; } -.bi-ssd::before { content: "\f6ee"; } -.bi-thunderbolt-fill::before { content: "\f6ef"; } -.bi-thunderbolt::before { content: "\f6f0"; } -.bi-usb-drive-fill::before { content: "\f6f1"; } -.bi-usb-drive::before { content: "\f6f2"; } -.bi-usb-micro-fill::before { content: "\f6f3"; } -.bi-usb-micro::before { content: "\f6f4"; } -.bi-usb-mini-fill::before { content: "\f6f5"; } -.bi-usb-mini::before { content: "\f6f6"; } -.bi-cloud-haze2::before { content: "\f6f7"; } -.bi-device-hdd-fill::before { content: "\f6f8"; } -.bi-device-hdd::before { content: "\f6f9"; } -.bi-device-ssd-fill::before { content: "\f6fa"; } -.bi-device-ssd::before { content: "\f6fb"; } -.bi-displayport-fill::before { content: "\f6fc"; } -.bi-mortarboard-fill::before { content: "\f6fd"; } -.bi-mortarboard::before { content: "\f6fe"; } -.bi-terminal-x::before { content: "\f6ff"; } -.bi-arrow-through-heart-fill::before { content: "\f700"; } -.bi-arrow-through-heart::before { content: "\f701"; } -.bi-badge-sd-fill::before { content: "\f702"; } -.bi-badge-sd::before { content: "\f703"; } -.bi-bag-heart-fill::before { content: "\f704"; } -.bi-bag-heart::before { content: "\f705"; } -.bi-balloon-fill::before { content: "\f706"; } -.bi-balloon-heart-fill::before { content: "\f707"; } -.bi-balloon-heart::before { content: "\f708"; } -.bi-balloon::before { content: "\f709"; } -.bi-box2-fill::before { content: "\f70a"; } -.bi-box2-heart-fill::before { content: "\f70b"; } -.bi-box2-heart::before { content: "\f70c"; } -.bi-box2::before { content: "\f70d"; } -.bi-braces-asterisk::before { content: "\f70e"; } -.bi-calendar-heart-fill::before { content: "\f70f"; } -.bi-calendar-heart::before { content: "\f710"; } -.bi-calendar2-heart-fill::before { content: "\f711"; } -.bi-calendar2-heart::before { content: "\f712"; } -.bi-chat-heart-fill::before { content: "\f713"; } -.bi-chat-heart::before { content: "\f714"; } -.bi-chat-left-heart-fill::before { content: "\f715"; } -.bi-chat-left-heart::before { content: "\f716"; } -.bi-chat-right-heart-fill::before { content: "\f717"; } -.bi-chat-right-heart::before { content: "\f718"; } -.bi-chat-square-heart-fill::before { content: "\f719"; } -.bi-chat-square-heart::before { content: "\f71a"; } -.bi-clipboard-check-fill::before { content: "\f71b"; } -.bi-clipboard-data-fill::before { content: "\f71c"; } -.bi-clipboard-fill::before { content: "\f71d"; } -.bi-clipboard-heart-fill::before { content: "\f71e"; } -.bi-clipboard-heart::before { content: "\f71f"; } -.bi-clipboard-minus-fill::before { content: "\f720"; } -.bi-clipboard-plus-fill::before { content: "\f721"; } -.bi-clipboard-pulse::before { content: "\f722"; } -.bi-clipboard-x-fill::before { content: "\f723"; } -.bi-clipboard2-check-fill::before { content: "\f724"; } -.bi-clipboard2-check::before { content: "\f725"; } -.bi-clipboard2-data-fill::before { content: "\f726"; } -.bi-clipboard2-data::before { content: "\f727"; } -.bi-clipboard2-fill::before { content: "\f728"; } -.bi-clipboard2-heart-fill::before { content: "\f729"; } -.bi-clipboard2-heart::before { content: "\f72a"; } -.bi-clipboard2-minus-fill::before { content: "\f72b"; } -.bi-clipboard2-minus::before { content: "\f72c"; } -.bi-clipboard2-plus-fill::before { content: "\f72d"; } -.bi-clipboard2-plus::before { content: "\f72e"; } -.bi-clipboard2-pulse-fill::before { content: "\f72f"; } -.bi-clipboard2-pulse::before { content: "\f730"; } -.bi-clipboard2-x-fill::before { content: "\f731"; } -.bi-clipboard2-x::before { content: "\f732"; } -.bi-clipboard2::before { content: "\f733"; } -.bi-emoji-kiss-fill::before { content: "\f734"; } -.bi-emoji-kiss::before { content: "\f735"; } -.bi-envelope-heart-fill::before { content: "\f736"; } -.bi-envelope-heart::before { content: "\f737"; } -.bi-envelope-open-heart-fill::before { content: "\f738"; } -.bi-envelope-open-heart::before { content: "\f739"; } -.bi-envelope-paper-fill::before { content: "\f73a"; } -.bi-envelope-paper-heart-fill::before { content: "\f73b"; } -.bi-envelope-paper-heart::before { content: "\f73c"; } -.bi-envelope-paper::before { content: "\f73d"; } -.bi-filetype-aac::before { content: "\f73e"; } -.bi-filetype-ai::before { content: "\f73f"; } -.bi-filetype-bmp::before { content: "\f740"; } -.bi-filetype-cs::before { content: "\f741"; } -.bi-filetype-css::before { content: "\f742"; } -.bi-filetype-csv::before { content: "\f743"; } -.bi-filetype-doc::before { content: "\f744"; } -.bi-filetype-docx::before { content: "\f745"; } -.bi-filetype-exe::before { content: "\f746"; } -.bi-filetype-gif::before { content: "\f747"; } -.bi-filetype-heic::before { content: "\f748"; } -.bi-filetype-html::before { content: "\f749"; } -.bi-filetype-java::before { content: "\f74a"; } -.bi-filetype-jpg::before { content: "\f74b"; } -.bi-filetype-js::before { content: "\f74c"; } -.bi-filetype-jsx::before { content: "\f74d"; } -.bi-filetype-key::before { content: "\f74e"; } -.bi-filetype-m4p::before { content: "\f74f"; } -.bi-filetype-md::before { content: "\f750"; } -.bi-filetype-mdx::before { content: "\f751"; } -.bi-filetype-mov::before { content: "\f752"; } -.bi-filetype-mp3::before { content: "\f753"; } -.bi-filetype-mp4::before { content: "\f754"; } -.bi-filetype-otf::before { content: "\f755"; } -.bi-filetype-pdf::before { content: "\f756"; } -.bi-filetype-php::before { content: "\f757"; } -.bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt-1::before { content: "\f759"; } -.bi-filetype-ppt::before { content: "\f75a"; } -.bi-filetype-psd::before { content: "\f75b"; } -.bi-filetype-py::before { content: "\f75c"; } -.bi-filetype-raw::before { content: "\f75d"; } -.bi-filetype-rb::before { content: "\f75e"; } -.bi-filetype-sass::before { content: "\f75f"; } -.bi-filetype-scss::before { content: "\f760"; } -.bi-filetype-sh::before { content: "\f761"; } -.bi-filetype-svg::before { content: "\f762"; } -.bi-filetype-tiff::before { content: "\f763"; } -.bi-filetype-tsx::before { content: "\f764"; } -.bi-filetype-ttf::before { content: "\f765"; } -.bi-filetype-txt::before { content: "\f766"; } -.bi-filetype-wav::before { content: "\f767"; } -.bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls-1::before { content: "\f769"; } -.bi-filetype-xls::before { content: "\f76a"; } -.bi-filetype-xml::before { content: "\f76b"; } -.bi-filetype-yml::before { content: "\f76c"; } -.bi-heart-arrow::before { content: "\f76d"; } -.bi-heart-pulse-fill::before { content: "\f76e"; } -.bi-heart-pulse::before { content: "\f76f"; } -.bi-heartbreak-fill::before { content: "\f770"; } -.bi-heartbreak::before { content: "\f771"; } -.bi-hearts::before { content: "\f772"; } -.bi-hospital-fill::before { content: "\f773"; } -.bi-hospital::before { content: "\f774"; } -.bi-house-heart-fill::before { content: "\f775"; } -.bi-house-heart::before { content: "\f776"; } -.bi-incognito::before { content: "\f777"; } -.bi-magnet-fill::before { content: "\f778"; } -.bi-magnet::before { content: "\f779"; } -.bi-person-heart::before { content: "\f77a"; } -.bi-person-hearts::before { content: "\f77b"; } -.bi-phone-flip::before { content: "\f77c"; } -.bi-plugin::before { content: "\f77d"; } -.bi-postage-fill::before { content: "\f77e"; } -.bi-postage-heart-fill::before { content: "\f77f"; } -.bi-postage-heart::before { content: "\f780"; } -.bi-postage::before { content: "\f781"; } -.bi-postcard-fill::before { content: "\f782"; } -.bi-postcard-heart-fill::before { content: "\f783"; } -.bi-postcard-heart::before { content: "\f784"; } -.bi-postcard::before { content: "\f785"; } -.bi-search-heart-fill::before { content: "\f786"; } -.bi-search-heart::before { content: "\f787"; } -.bi-sliders2-vertical::before { content: "\f788"; } -.bi-sliders2::before { content: "\f789"; } -.bi-trash3-fill::before { content: "\f78a"; } -.bi-trash3::before { content: "\f78b"; } -.bi-valentine::before { content: "\f78c"; } -.bi-valentine2::before { content: "\f78d"; } -.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } -.bi-wrench-adjustable-circle::before { content: "\f78f"; } -.bi-wrench-adjustable::before { content: "\f790"; } -.bi-filetype-json::before { content: "\f791"; } -.bi-filetype-pptx::before { content: "\f792"; } -.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff b/pagetop/static/theme/icons/bootstrap-icons.woff deleted file mode 100644 index 4cd66b71ad5f51be58843c52c66f78a8f7b89e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137216 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 NrT!1{z<Eso003f9u}}a2 diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff2 b/pagetop/static/theme/icons/bootstrap-icons.woff2 deleted file mode 100644 index de01cad9d15e664cde293ac71d80f5cb2e0c1860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102380 zcmZ^pV~}Otwx)O5wpp1wZCBd1ZQHhO+jdskR;6uLqS9u6=XBrOCvHd2KTEOZc*paO z6>~(a=`JtE3;+QD03h*~0JwjS5FNz-oTvT!-anWBbKt8$8UO-2L1B|VIpfp$K-fXa z!CK(qT95(Y#1J7?P=OP++6vVzU~l@vGh3h17!!6OUjBj{C?J3AaxIOQZVf0+<YbQf z=PvNGo%W!sQsH_63Eu;}I&1+Px1Q$jahKo!XZZWxk$L^j{N-+M=5BvYe}^VXO*C8% zP8X%1RS2W&8I#l$B`ev#IUDF*59M@ZRIv(=8`rOKP$Gj-EJGYWAT!+`iL7|yOyztY zDpjR9>%S(^MN>?=AMuAZQ>#?YNTqIdVoT;7(w5^V*y&L8cBzRZaU~7MpAdqdS*i*3 zV9KBLA)9#B%djk$4-~^zE!BJN*+(_XpMF9oInHTfS#R5eN>Wr+i8@_8ww=p~?^0L6 zMA%=@P{9KQwwrQNboK)^DM~Ii+YD4d&$ivWk~|tB?Hgl7=c?_`ndtbh3Ur^DJr>Bm zyuOEmzJssEc@&C4jNoP{`7PMTNf;U0b|hka9KJyNXH5#aQhvM%9tor-FgGJ&FB)qC zo@1{8*k7B=3i^ku8~C^$0~@r1{P5h?hae&OA)&1#!AK#a8;k)r#3Esup9%ZsH#arU zStP$LY=Z%6_hIQCqqWSYMnb{at-Ud7x})0dPJ7JT-G^-(UD__)-r;uRv0>9P@3h=b z(N{6}<GU1(#>WMzYwe29E<y57;Gqj><e=&zu`VZcs&JU+Lk~?Rjt=Bzd$LiL!)i@b z<;;a%uvW)#N|Yl3DD%&ga}*)Vk0M-ZD=Gpl>c39QNIS}QzLOhWs3%cNAH{lIDRUpF zO*4ZAK-dGz)t9HM^Q$X&YJU^;nQ$kf`c=e{Kr-yd-1L3aPtaf=c0xfCGh!4$ni<LJ z;PL(u{cDpq^ZWkedexptrh6Zz-X8@u@j+OSbOtZAL{(&=;H@9(gM@wcJ8x-O|Cwj| zT58+rmlkOhG2VpWXi?~KVk8Y0!g#}M2Kl&IFb>Ch-UK^SWG;5hGt^+oADD^hQSfY1 zww;6y^;K=az!{)tho~U#)q(trCZir_U8)^;t*fc4sD}!eL%QvJO+Pv|y-ZJs0BO=7 zOQy?=Ax4G<DIq39#n%AAIWVJ|Z34AGLBR*AMH}zet8H1(bXvCtxY1JXc4lf+e+pNJ zD5=fJg#~)fSGU;2+z3iTSxLU7BVbF=OShG*#u4PX-0M3rbfh2c(YwQtPah@WD?`Hw z&Bc+E$AG6KHh_cA1LzS&L0W@A;M%J!D%LPZtU}lJ&p}(>tT`6!Y^(iRj5iAjl&kiJ z`v}4`hLtZGrzcHnf`w7JFR${}x5tw4pZNH(Cz+W*l~OLBroY+Le|WeT^wn9ZMPdXr z$L{Ui25~S1$y7n_5ryG@<ePdoNWCylYE1-9Qe)%!^hu=9X?XW6lC?k}Cj~$l_fN$8 zD}(nRU+H&*tZs??NEv_+n8-=nSW7!_8EtHVPQ!$YPV>jZ8tXkYnO`8~f_jMgwCbuK zB%5O3;R<>16xhSRi-+6;02G8VFqpK?9^<|#<2~-3ieIAFKwDb^U)UjdE&adwf#vJY z*uX!jVC3k5vh-)j@86D942#WR(LdK?TMvtrLwDkpRsxoql45ewmYWvttTpMZ1?*lS zA*mDCp8`^zk~#c_ax9H)YvNz^@w%n}XKFL#%G$UF&?ZU(A>=IuG}4J_jS1ih5O6;P z1%HD}438{0z>Nqsv(EL7s2ODU73n$pZ-=S3)79pi^*u-*nr^d98ydr2YZ}arlC?C- z{s^xM<_9>Xhf9>RY1K|j1ub7iQ5!acb+s$S7?r4y&nS@dAeuqS*c^dE^3Y4zVRwNc z)=|YJ1~1@Kz81)~D)R$Nxo1k)iD!O<MoU)SeWz1@_u0viBXZ-}A}1k>#pQBFD(7fh z<@d0^wZfl#e!tcBlFnX|mbsIVr+n(~l_n`I-1V88hPe=pS~;0Chtk>91L{j4cE}1% z?ni$6xv(uJ>^VIXoHeI6NW=^SiBdtK_g+u0`)WI`FJ+BK6#F4mFcl1+UKMvVVEkm? z`n1mdmv8INKej`0s1Ro@Or~I_V7X#cbv^6(t@mfzyf=I3u#v&dG?Ktjwfz8$jLVvh zAl!YnJAK6X3&iL*4|LmCq3luF{ALUlo56W%1f_T&xQ6O$HYT()(yR=|))jN&9|1=j zFP$)bg6^kSyvz{+Osk<fzsjQe0xh721rX+hrP-Cw&4RP#UZLs$kdP-_lHrO*+Q=z^ zJw%VvpY_Int4g*l#K>?oL`X7$CQw~nA5I){4~ES>t$%ltSnv7a@K0H;5(WzZ@L%8T z#YnTe15YrLQd+3jPf3otvPwCbxXCk^ZQa{BG~iOb06{6O$r4>D$h|fTgiMtIx))yL zanuGAY5_mJU-D~L13Fw71xBZBP)fI!L8;T*eKM{`GRWUXiSU33c@V&B9u_uW{J!n| z^f$+j=U!$Rx<Ov#IjX8<09t1O+*_`!cAEZad@v%Q;=4X6S>|F<ZKEAnaGJxBW<2|I zy3gK9-x7mFq2L0t^vi#VSMIZxb@s@~b_*MeyUY8o^Q0%-9PT&f6bLO?LMSN^6P6ez zAVIIkt6t$+6{N}w7yyuXoRh#+s=fO0TKT2aC0YoGDoBJ@h%<U_yS@L;RE=*=(%P<e z+`0dj;6HrZi8X8H-#5d%T6YPyXto)IF>gi~MBtFPN5GXr5i5eIdT7_1{{>Pw;|d3( zATUJayR5@dn`W4jvGAT12_OXc0=|brQ?kj`rR-9SrCaLH?f~02H(waksk0?E=`%a@ zo2hCiwC|?VX)%o-$29Cs?aF{6dS~Y*_GFAceFv}n=Y^+Sn>^46Pe2r?!Iymb@}wRt zKBqQ{ins#nlCJwU#wSMX*EH}HXFXE9shN<*U_CIkdoK|zt%r-W3NQuC_Qm=ku2m2f z{kCz4*?v^l_sz1%{OHU)YmRlaH#fd6QJ4h1eax9rcLl*D%!drfg_^l?`rZE4=cnqf z{><7SeD@Ua_|x2$8m;tBu&$ieLLn~2rwtav1UBdf7X}hFlYHs7I}-+fI&vE7Bu}G$ z=yPV_UBTI$<N{QTZ!bmO-Qn-oYc3MRKhP#9VdTV<ZCX4_R@XiDHNStc)F$+Jvvptw z)n^(6!Hhzagdhtk@2Ep&Hsgl<wH|xsj8_s>6GD{;08DBfw2!ug`B>74k^xNxF*Ty} zdY6u_XF`6?9Cq0D-a-FJQIbj|CM7)(;*Te2oZ%(0_)T^m2*rn-iEYh-HIz|Z?&;mi zCfJ`!5r>*^%)zkv7GC~LL%+a-k_bU&B?4zW5-+$?^9^Igvngl3>tj7nO)V}V6ci-h znn$b-3NtpFA8-4J^gH%~Nc&k`J`rE4VI?3hFtU4hJ(%LAH@}%fIB808P#u=Bi>JCG zpg=`Xlqzk@mo?~Nuibd&?s+0xm1l!rt~yS`oRh_(*?Hp|Q_XhL^k$Ch53r!}R2J~X zg~4@p!EAhMx?47<RL!lx6SS|a)$vxR^{B7C+1EHZzSVcQ?-IgO&~O_U(NK$a?#wRz zz~^U_nrBK^f1!@wlN}$^IHeV;)#rs8IGSh)8eQ+pVcC%I@!fhQU)%srEo^hYTln6h z@j8vja1BB~vIlCyoGDb6gkyrKDML@WnwUOby##U|GXD)%Bwy2#kv4SJ#H$A-PHBz> zSsVjb+0r<BAIun)%sLg_RF&O!5$>3k?z$O&@5v89p-6EgNo8MoMSec)4v82+n^56S zo;ijaQR+~tUB;VH>slp(7eAbEVb`Zs-`wVd{?AE%eRAe9tZshZ`t<Pc?(W_Uan4M2 z{vGrDr>y{l7=VvB1eI8X9eW6-n20XB47J#dJ$}$KOjg-#)DewZ>aE!F&tACs|5QZ` zF+j&12t>nTxBKY<B9fsn8mh9Pffb^dQ=+MtqPpFp%OA7YU9;(zv-;Uh1Q22jGOB-u zqLhd-(}=?okyKNW<&c?j)A@}w2$XB?23EISlzVFaqpkiO37iZVhQ>PN)J-haRCFF@ zxgK}%Du_KInRP6xxh%W+_;1De*9<WgS#}v|f7|nj{yVDMXZ73n;)vb<M%B4Z1p7!% zl{I3<+2L_>G%^#;5CDxf*`6SUckz=Sx|p-_UtIr5>cVda2|$7^*tq&0j7BcXLOUki zRAkj@*qKK(BKdz~{$2e95dT|UcL}6n%0G#!xh}eWGBRAW5uJW^|Nj9J#~hH)+!fWF zml6C2!yd^LlT@wwrG-M}^fo(Qum7g_FKLqhg3@W(<%j)WT>Ssd^uEdN-BIruEC4yC z09!5reWn4QA>!X0y!?>MGv`mEkF9#vub#pW&wM&|uHsKGK40IyV8Dg<C0G+DP2f_k zYIiK$I(xnhIJ0I?rk1^$xBu?uUtjB=KG~p;x7eg_-ag#zFQ)&p=lA<>L8t$NKix%} z{`0*b0NU{1o`xMmC?;X3ve0ebegNebYW}NM{{G`8hye8H|5H-33;&~}P9MLDu;mo~ zZ8}Yr;s17=Qd4h9cJpr*aD7NxpWh#+dgkiM0|Yq;1$_u6sR)NqpEzam2)9<wo^j*S zug7-}njAKE;NS+FG*YH;;SW4T^vwP(gixXeY3c-qRH|0-@)?3y^14y$I)PmJCKw=) zgpm_8a$p}u1T|BrbRI_rGkfUxUoVJID+5)nV*i;pYZ~*Ppbni|(gXbVL;z&)FoAR$ z_&9;0Ic!=)dE%sTbn4hygQhin`gjK9sA1GhsoMGT2gu?Ho5qbx#PX>bu&kA~r?}a= zyd7eh|H}D4zRimnw_p7D@~2aezgOLVCd!nutn2hD(5BKXYxOK&xp;rhyL9~P`NiKa z4?iuArO08-iw^#{9sVd_aTIq}M)jrV=WYC6QvGMns-wES?p@pSVu|IVx>cqV>W4xo zMT;Sfb<mxG@H=J=QvdOzZqLc@KZ*Ip_maJrQ;9LhHriE}i6Lu;nx?t3+ox_L>R#z+ z>-}Nu-HEY$8gwr%{Qe;A+eE)t`FkE%CR!?rqN&>252onLx9%qE3(B$>p7R1xN<Hfh zLTR*a<J^1feQr1$P-pqd2S^NuLgSH{l#YOk#iH?v``YH&x?dNU=PQ<8n^M-bzt+_@ z|I)pmY!)?C*pyDHR&ncjHK%3Vsg$v7pV>3M&l}$P_93OG(C8N)T(#^8!7(%`EoQkr z(ME~zY(Jj3^y=*L_4=L6s{3lZM6%QEFQ&Pk#i6hOPdlbv?VPf^Jc9R4xU(5nRyf#y zwYj@JAB^hElsET%`Xi5y%t(I>yn_S~GlIk3-#rDADOkW`hEpO-n!u)x{)dy5GKCMj z-4N1gwQFsM!<CJ0`Rs2p9Gg}v&fB)nyiZ%!*8~x_Q)1^wT7~wos>N!$KdSYdWe60% zTS2}V&db3dDc#A6aMcQN)Qa)Kh=&-%48fZX(cy-$)508U;L$YjC>oh$49zn}3C$b= zH1Q1)DKo}!FdYI#bqpse$M6!^!4?e_I^pHwNzPbU!NN?(Z(^_$naEfSRmx&!W0*2o z*x^P^CthkY64=n14VBttX5*;VS=gY;j>jKzG7?!>oDJ3Lre|ZhI#@W6PL3x&x-}9w z;O-3-dueCmf4nxg0ManVogf;825MBGtI;Q|LL0^QYgEB6&?me^8v~2h6_{*FG}zVf zvw?ZCsr_bBCeA+^LzC8(sBB7A+SG72fw{J+18$Qh-lmPgP3wwWmnAxGYJ^?Dd|lOk zJ8Bbm!8KupC-j&eaC3W-HF1e2jHu5LGk-%)0S!d-xZsde0~AgX5k!p0A(0aYMNT1= zIP}<Jky8sMPBED{jOfGR6AwpDK^-~Fc;(?!6&OxgA-VJj7V;ArNls~{*|ZpEmEn#g z=REWrh96iGBcV#piL5#`M)Zm>=~XFHDx(<Gr&6j8sni`>syfA1b*c!fm1!5MV+d8J zVr&k{xE-3ZTSaDes&Kz5Q#Y4K39L@#TpiN6JG6DTitVmck)A8l-<QY0&QApqZW16p zHH3c_84@l-$6Kb1;T=YfdN#r2StXTcA7qw!w&CPir=4aWhMssfLg-l~rfVOhrg^qv z=vk+(Y9Gd~cs3*KSSA13JjiYH{6(;1o&LOe82t3w0LFKo5YKav9QWFS#&?nOo98fk z_O%JF_dKb->ma-CwGFTLBJH~CF#PHj<w2l8+z*uZmgP^Tz5v4qtk*He9A01W&MVl% zKz@Pz7pU(o$DeF}0sarTw`2Y}qVMPHxPSV;8|**eFX%_`5BQg$AE@WBZ@4FrPncJT zUxfQ0w<u>YuQ<mLj~IUuJ_!!N?$Ivb-tlJLw}?FWXUyRA0V1FznBb8H5}^VV=uU<T z(BVqpDx`&&5U~~(BLb9|UXF|r;fkO#sD^3a(Iy(D{S+8(mJSl(%8)wD`)LsIHXg_Q zlvsYA(Bt9?AVRPxY9SFuBB{h>=#HimKyf7qCF(@A&=@O|W#V#7Pgh`txFVPouHs5a zl$lCvK^catt%ZfSGL#ng{7Pt?oy%iEIhL<4_MfpifEXkbdq||AOss(!`iYpaCA`|G zku5&^sIfJu8^wVIsvO0k4Xj<+fgLVk*`Xz*p4ovdCZE}%HKO0ifjyz%G-U=vNJD}G zCd#PMpr#PGbfgIm6D?&L#&BbjhgxF46{@B%s<osU0aXoUDndzPB0PKIgjv&?5WDt- zAzp_KWjw)Ab26x#;<#PZnlO_$l_62-WqAx(igN-iqT+;M6{irJc;!BJD}H$#+LCh; zq}=?tWfrF}i@D`Ker-;9ES!r&B0c^5Z&S#QL1=ZHV_a(;^ISX|hh$m1#u3}Ljv++% z^<zTsE%SUR{F?+}LdRj_IL|>Cd9Gs|^Pi_VSUNXJ(t6G#cy*pr2-oe0yw5&+1LB0f z2NULbzWXEUdcKD<?mM4*L-Kr|2UGUFpZjC_exHZG{Ry2~zd`@(27H6OG2DC$d?9fI z*rEBrnc%rV*<g7gSrB<Z_#+uZIb&Iae?~KhbH}#@^hPv>bi}j<^+Yv?b;bP(?2~K| zZI^8k?v`#6@052FI8C@h=`ntzgqOp~W8yP+8hA)r$GEU&=diI~-)`(Xz3IPATtquH zr)SX7@91&#KfN8ePhQ2kw)g41{~Wlc^baQiD1ifi2q;0)vJopmQ6m^EfYZ|<FF;Ze zC@etG2{ST-(il51gE2TmHw6H-C7Ob1y@5^v)Z!LSLG<R>PJvYF8cxA<?wof4H1ZyI zK@9fbcfvq_5m<p50diQODgzT(!8!$WSm8<sl_-H)305hAY7-YJ;d&u>>cI*l8S0T5 zW?Jg8Dp;GU!8$Aas)0%^ovNW)ub)=^)nYzY1NCa4R%8`!Lg&Oaa-`>^RfI<8KkE2U z&nYWGlyJ#wNtkgds!^P9f7CO<;+9vyNM)7OP*G=<RpD4=mDX|LW|db$Xla$y{@~Us ztH$usDy?UO)H1I?5Zf@Rp`+L^t0FMlFs<Xo+%T^MQ{y(NC1d9{t44F<Hmzqt<UXx{ zlj}UHp`q_Qslv1CJg(y*^g61f)bl#2#p3fiuIBLbI;}?nc|)&Y5PZX|AtHIhsNy$# z!@2^X?FWz&NTh&8yCE|nQm+gQbG3VfC+sDl5=bQpOS@rHA<``GmvD8vh$rkvFcV0o zkxjXwbH!1w&L44g`iv>;Wxx_hCmPeZ;s1!MUb;=;Ds-Y$+8?IQ6-iC5a${zbt6QO3 z;wtqjU)Wp1%@s>tv~uI7ldE6GY2hk%Ghf)B=FSyOZ$5Wp=bf!v<$B;M_d8|Y+k(s; zOSs2%;~}%NUm}R<D0Xyb-k+t|9!crSa&u?7GF;)E=}7l{ZrkI-++Iz3*L3rzAv9P9 ztMyE9MQYn8Vdq^+3txY7;2|_zCHw1{;v4U_$Arkck~qfo<UyIYw}h7KndB_*zK=uC zyO?U;@npl1cerxD<=N}aaI+Um*fX4*?)l`zptrwF)8m=yUjMYu#@DlwzWVy)#lN$+ ziudW6?7Tpi5B@?sjz!W7doLSuUG#x`SkBo;{z5lFMD-<gFCX^Z1aJzt6M*fHB9<zc zM5b1#Vzg>FhsFhFRcKjk{Ncv#%<$rTYlrj*dl3U44WSSzD={-UIl@dyQ&C%5VP$V| z`*XRlY25JpGGK%xo6KztUyd`^iR<trrwfjd-jlEEaSOnT6mSp9O4NT3)&wYk18qaz zg9B@XPKX9=#h!}>YX)zS2K|M8BOTlTA2Aiwf<HbL+yq)d6V!(KhbFiYHlsSI6?d&V zxEZqDI_MYXi?whAV#tM13*qpEa1%%go=_Xg5uR`(OiH#;E6!53a5F@Uw$Lw(2koH- zgqY327J})`p(ZdJp21!;e4e2WxSw5vU3flSLw!)7-lXkVLf&NENC)qvjYLWBWUhb( zC{kzSCa7Wu=&0}_A8hLIVlQwj@ghHTT=8O0c&)J_Z+x$@Vt-IbN+TE4QA%Ss*pqT2 zN8Ge>V^_#0^8*LWIP*gn#M#pWC&IeZLpP8stOG}sJgh@k7{2raZydk$Lw^VmbyN=w zL3K1A1d>%$KLV6hG*2)^4pd(>CJr=jILBY8{&+CIl0Bd#-IIK<sN9pikSw2*{D^R# zlV1UvNJ*c_Tu909(4O&1Z`h{s%3t6Z@=CAhs`AR8@NB=8-tk?3D}RF`Ff6>F$}%i| zz|z$(yy4o`FMdH1*e|?d>e?^9Bl=!1d=my=vpj(u5;5PRBoncG!m#8szvDRPvwTCq z={LP#(C9b6Az1G=y%KEhHs6DF@i#rAz4JTYz=iiYJ>XIHIln=j`a9iXrTaVIBmMez zdM0}QzIVj40kq2pT)`#0LtK6Z;FHn;NwG;eNx|<zMM8u^#6ko^j*s?`e+mgiK*Nxb zp@&4xA#)E3WI)3ilHrF$dkc^P2vI=uBLoD7iOHRiQ6M5BQOQN1l!~Bmm;!RJ1qEda z$juZ`peiEKSjj=?B!$G4=8{?A$-&4b21T40lYi2d0BEQN#iSaNnej_NDJus>tsIiM zf0lqSSPqJ7-6XSvmIM=@k&1XhC-ae-1ORbJ#6}~MVNgw?$TLYqPb88dm`x&SHA%!* z#*-0XO`=KH3q_uQ$zaq+5!76TVzU*=aJWZN6di@4R~E@o+((i0o`vE&f0B_PkD^Il z4Mo1Nl>rp!5mXSyVk8;LKuq+wAEE}Li5kl2?C8;SBgWz|Ys#dEDIsJ(4n?Rqm8t1d z!e~kl#c<k{DF{<SDNPSWxjdBV`BK6ejt|8lUX)2dR78j|&_qhXm2pT^<bbNEVyYp^ zY$z(i<jbg{k0Q!oOiL29Y$)P0!^&_lOH!n*i6Vc=m7%DXB&l5!#kNb7k#K(2%bb%% zzfF{ZI9Vj<;F89NO_Za+TBHc!7Dt>yDaahA%z>A(O5(^W$}OtQ!KboHW6UVZ-Y?Dl z^Fu&_fKE|<iggY)wnYl9c3$S9We&2oMH0_;UT)K64l%by8td=8?EAwUNRNvI5y8Ct z82lVeu*)QJE{n`+%p5|o%M|uDliah+T(G1UtEhb0**bhrMya~<gIV4V-CVfnTZ@Q( z+Sw-Tr-rG4hVh<;Ir5r8!kUS~n$g^v8RME^!<y;Mnlbd6c?73{1gA*_r;!Dx*&j|r zY);b*PGb#D^R;#Z&UTabb|a5=vzK;5@OIOXc4Lut^I;DIau1Ud4<i!~vm*~fbPv-M z4`US%^Q9L9))$kO7bBM!vxgT$_!rZd7h{?BCY#$I0rr9)$b<5RAE+P{QR&z_2mL<; zB!W^ve;{Z<#?WeTIo$1G5Cer&f=b{uA)=^N*euTH*bFQOSAvQW)S>d|eRxIQBoGvE zi#P@iV&=h<smxevPS$7}v=15vEn~+Z`~C_<xk_-_OK@F}bLNk8=>t7Zl<r)LNL{QB zWQBb!A{hv7iz&b0$paFBnd5rXM_h281Cx&ihf#nnb^$vc<W-pIzkq$cP^aDg3=__K zh@g&06T89;Z;KPYuva+gTh8;iazgNP@e+_r)`Z|H&dRLlmHjg7n+6v>HyEPFQ+xH( z7pTB{kQ6FF%qQxNG#|DraVB~}#$N#zeh}qW!@}&qVxGWqFyguIz;SxeNVec<n1H+1 zP?ZqY5SI{mTG_CHBelShzfjp-aQIjGd(2`t8O?hvr^E(g#3r-C!#V*O3jkDhC?$5R zrcKqop8&2?2#8aRAE$U2r%-ICNC>AyQ4=;P2|rVkxPWA$6~q^cnuzMMhHMG46*Rre z${Jut)~rc(tjV?(B)k@6oAYvB^MZ(l$@pTcUHTl)Y-fg~Md^_-d=yZ@)6DQ}8)24f z&@x0~nSL=$@{F?|u`nlKnI?QmRA%Gvr*y8IJM)Y?i_m-uQSs>ak*IviX$&ccc*n1D z5Pk|M{FNd4Dx>yQdq}Fc=~ge|t{>%)0B-OiYlBXRLLP-TC}RS|9M>QNU1CiR;0jpQ zW02vL!8$Bw8)ROsut7HRIwpA=LgrsV5_W3$xKZ7LX5?Ve4BF@ssRm6P#Oi)iRgWBf z&?K?()`$#nqq3NgN@7#)@eF#WGWh{`AWnAF!ct0MvA)-vu>ljAbcRM;=CP(mU@AuA zZO$6Z5phJa0liRrBKnmK98y^<<#wMGZooar_$&DEEBy2;=-?~t<SXRpE8^@c$iOSi z#4E(eE5ghx*w8E7)GO53E7I;@oPe<iHV7)2h}jcx8YH!&fJxm2GhhIeNfRA2derPM zXAN4q>tQ3I&x&;a8}vE=1&`Ehh}<S7B{sPc#)(~WpbWUqijiGt*34=Xmo~H52;tQ> z-k*lO&WxsQXjV<DL!?&6fX9)Tn>{=ryMI*X<ha<;f%9`qM$Zm&x6%58EilVKwt_+j ztunGIvM#bRvNp0hvR<-6vPLoqe<B%_DhZV;8MZPBw=y|QTG>xF&_yEsK_VZ1JRxR0 zLuNc>dOU|#C+*xC*F?B2!%~c8#<~!qwxuLCt#vU9abrc2r}K{pNA7tcWzSDV-=9pM z-F9Hzgu&fZ!rd%G-B4uR;>A67?2y;%oYy1Z*URMBGw9dbtl=@A@SZt-aX$sWiRBmg zB{{f-yyln|qUjU(Tq146e~%+R1YL^MkJF!HEXenWLF!#hEb#>Fu(1>T&h`)g#_zp* zcRj?=U?TC3DMn&rk~!ryj*7y#pA~{OI4}kIh!?R5>f|b>;E)y$t?n}X*_00Zcy6lg z#Cz4sp1ml>)M%?SvK8pmx?TnkOCZ!{c-6FhCP(#+pZ{s#&SzEmh13P#95wol&I7$Y ztaZoa*k4^Lz|`i0<FBEY)!Xugv6hb!Dd3QRs}xfcIs}b$hqGfKap$EIX-}FgpwAb7 za8FuFLPNpjAMp7XlWGx+7EK$qvzCEd$#xJ?2)J}$PTLeGmNnt(FAI~1ULXmlSW}nO zR;sBZfU0nIu;IcXl)n;<*&!zl7Y$rcq7BDY7W#?ylT(~qdES@!fmg2YSbvdOw?sUS zk$D#xMIr;vU>`P>gc7efq>|OY`4hX6X|W}`JO1QW<u0GuM6Ri{bNnGy*bK)NNgDRm zR(Q(BSm}07HTp4LbP(Rg_>y#3z1;B$jl_|nKGrmE&y-sPic3>#m{9n5&gIW0`vtU} z=usloIc6L>IFG2HY^W3U@zSXD)-_*%UF;+<k(JJido2D>)#&WQ#<<tlK6kDp;q$Ww zAKki(ix!BER)}Cz=?q=8?LFLiI%I!uzMDukC-OdH8CP{J303;En3N2Bg7_D#48I>| zlpaP#>_P#%?8={2MrvV$_l@QjU9Y8f@Dy&x=|wmr9HgTpx0!CqHM*_!Wio+Z<<7-> zRg9r!F`v|yt0q<(eRxdx;uOn1(h3*EI1z1lQ)=*3&HLup4E>C`?2jutxMnSDA1np( zSieattKGP|%UEVC1lBZstGdcQ&!Tw8mzel%^F9PQs{5P7T(wbL(3$nEApfX}w(Nfn zu5fC`d_}=n_iubC(SlJHX|Lsk1=XJ9TCcSXW)-apd$$akUsH65(y^f!NOXKyM2kyc zoTfyfs8srVN4`h1B~@W`#LCQlSZX-$^3(HdN|~A)6&TqJX&kO<vJL)Kxyu8|=H`6( zVyrkB&G8}4#J@TyzJKy~mN|V{b0^3ijX*Ae{tF~l=QxlQin8yRrD|qbqwx<7O$$n^ z0mVVd9l@M6kvrh(0k)whv$Qu^>Zz;~Ay&+Ym)&=5vOnOolIOuRg(4VDFiN?>3KQ3R zecDR0AAf{8;$7gr7ahmCHvho$dNH$~q+Pp8mPbf#rTB3XQ~GFSlf-lKgKqg;&cZub zr+`tg%DR@iIqZ}@hX))jK`7<OMhS>P75QtzvAM48$ri!&^sCj+3(aGnSdI2Rl1(gz zAOiMA(7TJNziya5BFV>xbu<8;b@V9npb5&npO+9=<e5J`K=6^X;bN&J>=d9GCbzoN zG7>6wh;i&jYtlS@uYR<dj(6zo?lg0s>D}sFw|vPtIc>&b50=#7uI9XfY$Tun#pIPg z&SrqX!9l3sCPWOLqGl|EK8g;NBhd+WfN5Nl`*K8AE6eJ!*U2(kaiX9?-`^BCV;f$i z96}$ng?-uvq^WeVE4KEIZXzeCwtkZLjL#n4SIA>%SF58UojB{5`E~D{_Ug>XZ_M)h zccJ5K0b)7RD0!m%L~PJARo60hGYhT1Z?1FxGd#L^IB0)?)#_Ap8>x|PzBLG*Y7C5H zb&vL(>`+2bMf$t<TXeL|XKLr!a=O1IuDfYB3GD0v1nOGlJT)yk*5Ck!qb7OuuL;e= zZUk$>i;3Vay4h=Eta6R~(TZkEbJ@;G81>bHUlH5LEK4cpab6CaEW=<_P;KyQGXPV@ z@^{8FvU#G4apz(-?oDxlYVlRl4cyLwsRxoj$8Bw>Mm$)+0~?qYc6DUR>K2K?bfTPM z*eHasRN7@hlgPM;LW!~r{FsTbR#=gzplNtqND+~PAlxK97!)pfd0@xcz{OBlL;G{S z=y)?qp>37aK!;9k+tXjnj|tLf6w0fOMQkl3&?nh0XSMN)nlVj>DAPO&eg?mUw7tEk zp*_h@1x!RL1Sw)D4~L8?W`@vrZuQfqw$M~amXTN^DnChIswpKU>L`1v8;!{vn=CAV zGb#oO_8^rif;U<m31Sp7S}IdsN&K*hLLms|8i)zZzJwB(lmslzX0rH>Hu{B`E*pPd z(2A1baSFkGvrFOlZ=>_=ru(V&^xPA3(Ml;*xk*VX*-d8<hHQ45_8ic_q<a61mJpA9 z;WtjOIg4}%Muf&KA`ry|JmW~$wZNhQ5XaLB1sIuOX7N+1P7?$UZEOzmaj5}?4$y_p z`d~?IXQ7A<wtVz}#xeXLNx?4qD7#k9&3LGD#w9~-993g-WBC0}OArsxs*od-oMIR* z1nrgF7|voGLzO?oaw5BZ``@?UlH5lwIaHd0s8r^!@T)@yh|t;5W{y`_*73G4IG?_O zo0ok)#~8aU2pw`(H0X0HxD91m!cD71f>J*~7|>TROPL=7A*E<p;ZT|c9ZAUo9;|cv zvBi}{0A(V^QousoWedtw@PC?*wVU4Ysp>;U*`Xi(e-0@#V{Eift*lLE>Z!8dT310_ zd)(G%w9m!U?UXySN6yEFEH!4<GhtTg$DMYe<ogN-5=a@tB5W}V>>#)?1;&8`mLdg9 znw45dPey1BUE4b2bD(c?U<2OJC;=7TKh^`uA{VxiueZc-?^s0F3q-p&TqF)O0Kx<_ z)yWubFt)oMdhZR1Gh6+4n@5(EEw!Y;*M*`-rn`VW%(e3~Yoiu~9{0_5&aN=1VzFmO zND4q?*+WReL61p`UG{29lrp|5mj4Q#jPhbeRVNEa^WKvZ;W6|sNG?DJGs&|f=aX1g zSkV&qhi<t<B#GWFXmuTQjBK87%54qQDUc|ef_*c0RNR)E&cengHej~Kp*B8d=Jk@f zO}mKMn~E<kR^Y<|C);xHZho|4$+_OE+zKATQgY%7m$UrnP<Ry>mnP{GH$!3TYOCl} z6#0Y<4|9)9EMfC!xutgAt3^wSg545^gd8K3+KcJQdtIpw<p;ZG*6{ADL|#75_+P0u z>C%K?0Zt94G^zx(=Oq05ItV2}<{wSg`yTRqh&^Gb6qAb74J)!I6xbFxpv9%&s(P?4 zW;tAFtjk$hV1q556p@mjz&%3k=T-3*6(!DN$-%@NTFRy^O=H>C(G;N2-}5P5U+&%; zNNtI7cS*6IZ&i91#g1ok%jB&#3k?JchfG%qI7)*Owes`o6*MBo&1ap1c)lc-Qx`re z6E9(qTI$POsc}~7gj7;NIkFp;=DxnvQ!c5RIykk4kL*z;&e2Z~NqSd#`sdMUl<yj~ zj&*#?2+HcUzd~2mL>6wrdS57bUq`WimvOSQUOFkfRNj<86^#qSWC`sthM>FnoaPRR zn?&&Xn29|#Jw2o#jrSrc+I6+Nutd_=ORG-~!q+l;tU90T9;-;>Yf{LHOlkHde@j_! zM1OB2Tz?VUOhXFoqHJB=V&#&{ke=06JniXh^0gQ1czl}c=m+k>)lN3G2~Ob(8z64( zM5~~jW*M_M-=+3Oui4t&>L%H49z3?!KOzJq6)NHHWO-OB`MPuadU+j3yZAf|m@kGE zFMXDWk$#1y=#3YfiJ`}pG~WjW{eel96jqygTe9c>0=_fXtX}n^KlLKb(~R9Z*)&hc z`h6YEr}+75>pgxw<URTkj6OgAcK1CURO{h)D~7XNGVfT+h=%(h1%pyWWOkG&I&v9F zNOivXt%oUy+<yjXh+K8UfCeYhfoTz$=r!%eK)Rz#ZluHsf^O_HBMB@i&=eguzK%Kr zxFwAl>79{}1>dmmdqe6YET#UEx>qyT<(6Ayoej77XP1ZO>7Hhl!pPq724>h<OjqH) z#k#*s=IBn`Hr_CvVIG^gjrh@Kr|vJ-Isi0@ky?8uonoS8fmE@MfC!^cQsjnfm7JvU zL4P!AF41Wuy_q%E{SZ@fOu-vc8%j~_B9DZ-rkrwavZOMdQtT6QN<fB8LN2Qoy*k)q z4Tr7u!>G5j8a8I~jzJvqE)Gx9nO<3R-R9pXSFCmwC8h~Gkm;{Dz&hO!OQnH@_E?!? z)8y0PACA#TM?gPW$sFs4P2GG087njWE$kYKI!0HjW_HbZ$Ap>*QsAY#v7fhxr!1!b z58{sMq1kaNzGXc1>(CeVYr*0Am?EunZmFmDKGfb0WH$k}>D^lKC}jl^MRN+3oO<q6 zJ-xQSE$v+wTixznF(>fpF&h&=MKK0D2Y%MZU|6yN)`MwO@l$dpSWr})Vu`y+4lWKM zZ$p=AYkzev3_}dFG4_^GiH-QCdceF$<)dNsPZa=LUP;K}ZpxFNar|xMU(uI|WM7Z= zHQuWQxrIZ~&o_cQ=@Ka+kUwJLqtCnU`r8VW)aTOL>bmL!si`{ZUzBIx!Y8~lIU5Rv z&?-m;iS=)_OS<Ju>x~ikx-dMh4plr~+q>XbYn||2pt8oeHMg^@vBG$iAmuRt3PN2z z$u`erqGo(2$QmupG|!)HfO@~vlV=8tw39}LgrlQw?Eqp@eLs1!_aVKq^Kx$8U3u4~ zxBU}S?3Y(vOq`08bk`U~4K{fDi!(m$2q@b%HLm^PX`h7f-*)^PJnQZ#b4;R9j(2{e z(6}5L!<NAn#u0(l#ckYc7`nWjs5|T><+iY{e$6DFWb~7r(UHVo)H<FW3)Nn&mvv#T z9Lf%PY*#+^D;rIlYNs(n_uT2HJ99oY!KG=)ZhDP_?mL~`TgBfB7`mx6wnxZ^mE)gz z!-Smhf1dGpWXUNE^2%a)y*<9;FflC>2YayHOX3eA95!yo{on4@<ZslxXHT+RZR+xy zsS^sR%^E!&Ca|;X|H=f$U={}aEJp<8RT0KV#l#A}T}W&RyL7uTtkhWW)4%pYL7XIE zSL{mxD{+X@@DVm(*xfURmbb{tM!K44seeY2XUKSc%=HVS5GdpJs*Sn%r0B%3msGyv zLo5<GCD%h-aISx7U%$o@!s2Rq_RBxMAZ%=S8uNJ3_-9f6%)~F}BI27T#s&e+xZwS{ zWmiio3LnBK^1#yzkFDs&1dEqCzLfLy=TZLAg&7bR)_D&dav@z7(d0~V33qhupISq; zr3Z#<+o_h^eb#FO<=_o9a+`tF=TUAO>72x3SN4e$FU)ZF@<KyBO1+YSrB$t`{%CiQ zjceTmxB4Y0ur;<^V3KwG+n<74J#MVoUddDmLcjS=AeZS#O<b-nWx~b~!t|TP(#N1u z(N@wd;fjTH>a&tHTcAlo#0C3&FNr9JnhOxxkkT-$X=;NV=OJQ=8MSq1C3!Y;G;}l1 z<*GMU(!ObD`lrj<aiv2$xx^(`UAv)?ZSizNO;FORs(W&b-(jbA6^~2+auf5%FXObV z-`g#wv=K5hvm1}J1kA@jsKk7Y!CYwgg&LHpJwj*Oj~MHOL5L9{20YeSH`UaY4OMHp z_Qn!b^q1i*qf%@v{aaIF%~iHAhBGo-k4)1Gqf%0eIhD?Wl0XRKq)p%M#e+^wsMU{F z=3SLn^_zBoHtrPla5J98QZroA8c6u0{#8gGFk&7&j<tTTo%Pby*y=dngBG0=^8W~k zBwvtVdsl8Yn=eV)ddhUevdJWftRQ6Tcw3?Oeb;VwpyvO80C%Rn;!%Mwr#EZpv=y>H z>ORy#h3(?yP7*O4!Xx_24dVW;)Bhs=tAe<c`R_Q2lvy7zo4-*GRqQ1A);vPEv|(u) z#&*p8Fm%x1n`17FoLo<cr2XAv^y#VA6`R<EshKIP4K<{JS4_=Z)i#c_+g<x?-+K0= zB!_*tGs}|89uqarCFE>xDO8_e?k`ub!?I6rALq}tS4rQ@a$&=Z;DYgITY`g;JS0C4 z$g%qCfVX1jWmN#sS&L~9#@Q+alPM81cNL7Ef;7CEaVlc62tu`WF-JODZS|S=04RHo zauASxY$OeMR<0SHPNJ?gBgQLj=92imE<cS;1l`~dUa5j_9Vu}az`B}*oAlni#C7Rs zM4nD2g<gi6FKO+jYDIe~jjqZZnzL)mwN#1ftYH~?P>;eO$2lx3(mPHY1Ir}Gmt;Vv zU&zi|0zJrcqTy&XswW~x-b<eYtR7gS+zL)aMV?QT$>R+ruxn71c}nQvXTCYo7#*&Y zix9fnVI>WxS0HgiisurxcM1K$*_;oCLv$nnjgoST+1Gf<U;4cK;{g5USQw9k%9>6q zmgy?i9Y%oO*IL_O=8AesW_~Do4AGKlL+7S!0xrZy?r7!<Bs&E+hD4}^@$@P<wDd#R zp~iqCp3kO0%>rDu`O5d=lU06HerZ^P5}c`w2@<-~AjFtu2392CHMq>gK5Qq*2hizx zssuqv1HtXKski~$iSw7I{wm}d*5;brd<uYCB0(>)Z5Jb{*)kRYjaM`UCc&;{tbnhZ zwpAF}mqn*XEW;*iQ`h=^O{l~v*v}xd6y^3t?<J-l^G%;B-H@tUt{OYJCXAv76=?Ox z3^hW58boly_|wWRVrfIW5}mXu`MCx`mR1coRO5i@O@Zb@kb`Sez+(ywR}QBs&4m2% zaJdM{ZV?MuD8CsJV~XKg%H0;vV8hE&NaW&z9GU<xFAje|f##O91JF6=uSpo?#!b_R zVle=KcTX2v*X|U%fv<n-l|*G$-l9pdU--LI=^v-8B-m${X>>uFrRnB@Nbm{mB4@Lb zPR|%WuQ~>0PM?_2ycM`2;r6dlj3=O|lSC-tvy)nfjwZot)?pgUo##&rW}vDi?9GiP z{L#SNMquRc6eNyN6#Al3-Er;9z|^0RK0b6xFuiqjh+3=fp9<vvid@~kWB2fI|1s#! z+cdKY8J=0(`L-*kQgnnKonJ>b==J|=@SziQEU<ofH33%)K4aSPuEw#r>9?>icO+7o zhNF8TUnL-9o};l66cHue$`@ZBkk1lDD**UshZ0l;I!ff9LTZJhnsbhIpu!`u3;kCS zwWANw!-f*0>xt&Vf?Rv1;2r_@QDG+2c?&y)hg{2Zdn-3DaUqoKMv>}92rZ70+rHaL zi0SKz(67{Cs1<!>yEk}wC#LL6glVZQ@v$80WWI!P0S^OG3Ty`!6bMudHYcj2YD;c( z1VR!yyqO<P67(!6oCw$FAv-jByqISbb*}qQaR8#rg0^*>v?4oawrHJcd}-9N3ZEed zp$O!lD;+8froW64+)EdYTshY%GLmrQ6*k^I^1z=VFIx6L|2`oYWpYv$r5KcKJDkWY zpZyZzkFq3oE<2FFD01;_(|2L>*kLNfq)r==p)}J~C_kKD=u~&vX1P3d(L35O@rg<j z#hgvE`UJbtavkGus*E%jJ2i@1R83vMNQ(X$pMDFJLe&InR<Xvu!+y9w?1qTQ>D-KC zcOW-}ABT?*L@c!%c#BML)k$}JYVIKxC67~yz(p}b)Frj|{2V3-scp&MHg{-gU|=_3 z#{B`?_y>9379^yqS5>Iv6-n%lCpSWd$jR~~FJj5|et;THncB7*S5jTksly9&$L84S z!?oZqO>9+3Sq_cb*)KgRW6`A2wH#;If=vwu%kfqlM<ZB}zU_@h8;%7LP>`6j3(Z~c znkPt551cB^?pyFk@#XL#m!gSRlwkhrT?=*oOxh)5Tc#QQmlcnL8DGsAoD$6`sRgeg zq5$LoiAX60N@tNY7>Bw-<RWO0G-@mu`2B%j5GnC8GL(9hIP}%gNc`3-e?lrqz#Skl ztj{o0qE1C^|1^TTd8z5%3OAuPQ;cdtu-(lc#gqa-XsE~Mu~|H##EL}5%WPU(e)(Ne zt8S*MC*ab_o~~I^k75s>aNmYwn%ebhS1I&M5VhO-<w(sc<tiYzs<~+t7*6n3WJtJe zddRk!U@@n`tIDGG|FHldNvblbzCi>T`A~6BkI+W(b;w$Bg>|m<9thd+;%bO0l{zu; zv<+o(DJIh=0xUq-wwG8`;2gy80tW4|2cSfy?C{{(52&n(?u&{jJ;I-j@WQPu)Soy| zc@QzF1RIBI(U!n2iuOd9L4_=6Z(`f;zDh2-tIkJ^g&ddD$A7GpF^4(?m4o0-6%y}I zDQV5=gC2QnEM<5Y;HTj(CJ+yQ1g(AK>gMdUWtbtWXt&EuM+`x%(4MbPn_#{+=nwzd z!ONG&VSV)W8na<0C}5vE5rC*7vId!%C^?~=)2FjhLDRz0c3Uk?@vBsRKHi?LS<OJ; z_$%63u`I2{xQ&}%)3>{%>yS`KC7f!eE@Y^M8ku3iswhNg>TRZavv#opa{<}o`Wd)1 z(;Oy;;;?;^biq;j5FnK&uDj-SGU)%twEJ{_N%y$l4X9byP9cRbVGkc>j^!euTp*Vc zT|^lf%^A4Xy4uYr`i14bd`{81nbGt1bp1(R{L@mvdf2JTlhKr;q$pNat<4YOs?n5} zU0>-X-&{QR;EN;aVN>4z{j|ROwaYUk>c}UP!-FN0L~K^2iMk2ui%~Ac)p2<7)GcoM zGiU(Hp0W5VJD$7K7P6tUo4G2v2}Fak+{ce~b0^5|&)~$Zk9j)fdq7Wl_W(MATdOIk z(br<~+#$G!)%v=gH8gPHQNE$PNS-9~<=S-Vd{hu63%N*gThl?)U8%uc_@+_jF^dq^ zr?jr^m&VZ5G0vF4)v2ZhDc$=`U322gM+O@;alagpQ!wI*b%jYf73-vv8dLyUD+-aG z8QG;&f@rzEM69*dfz2tpqe$si)hZWc;gOi?{u~iYl5yv+sSyG!ZXl1G$T<cG59Xq; z5EJmE;#W44AN}5*v2!{%;?83Uvtkz=2=<^MpRgcwa9!*sLl`a=Q*8`LqC_#v&iF4O z4*uHkD@>X4$vD0Y0;B8lmd5>eUIq!s^F68678qaf<!I01Kc^S%0%<;yX`l=*2touG z*Y9#@`885~_;=!#Wur7fqllmq9AXkOjXqtWNm1v;-nB+lvqCk#D1OI_81%}G+KO_9 z-jeVnSwUH+u+51Wihn{e@1*sXX*}bkusmedM{oET40|kL=$i@AQQM9i9D9*nsk1%_ z>xAUC2Awq^ZSuLPh#o_XG*q4H_7#|Xj4VqEjHKq2c(z)b9X#Py#IdL`@BO$m7`v#h zNnn?YtL18nPEkl{SLjG?+`O);w}5Ip(XmLJo-DgSKh@1>y-mKLI>&_0#xt@IeUHZX zNXqFo|9bUz6WwJa2<8=n){}k4($?$gyRd`n)v}A|<-xXib747GXd`FzkL2kDJ|DFQ z@*A`s?MUEv+y3<(N%@L&m)6Z_xYUssW+6s>?0`~j(1YSCS$i4XA#dH0FN%<nuhZO| zq+UgE$>C6P;wTCFj<`~JxGcs<QJoTv^DPdo6Q3B4x2CKdudWUWmvD@!6v$)4m83Pp z+o`uAD)&TBqUNgTB?W!!5NbDLo!s*;xp*YEb>2bwDMe4tylZ;74TOnALbkPqsZFbL zYUT2p&A+h}XuX{5f<G_zo@uAyctfJXl4Y=m3fwUmhVpX}7`GEYfma!(>L-Ys4l%DI z5s+cXMRw6;0WAqf6$b_)DNaHqnV)nAreo4Fpp5IJ5u1y#j)tgd8me(>wC|x!RYHw; zBBo^@0}W>wIAKK1MRsyLA!WHBqR2NTxp*I82;>ogW7Enr&#l50liDgO(4GBIcq7^D ztHaVx)w+&mTl{z43;vI^<K9D@1S+|!`=8NYv9rZ=Jy-+Fp7xK?dLgp-+mos0_;4V_ zL<}=DskDWsgpWtpD{0$q=L%@d7gjg64Au~vkE-@R5`V}j_FeiPYFnVli*g7GYZDdd z8Gd5es!bp<D8LHXK}!tkqt)bSoA`ozfGRD?AUxB~jb8y1oR82LP`GzEVX}TT^Mds> z3oCF}%0e8^UGCL>Tvgj}v`nFm%36c7IoJh(!NJE~zwkAM$~;1h5GwsD#%(Bdo9jsh zB9sv-WQ(9l(6_4Z`A&LqopBWT0}U0dPD{qoF=%j%cZMW~o=_~{))r<L%i3*#$8%hh zEiNlf-OQz(OFxHy8jZe)gNB`akFdhST}TNJAYg!h4s{X6U~Z%xTzZu!NJh_ZOE75# z!-N|gw_nGl-4Dv`U=7UZp<uu^=B1ni%ihFYEgdK<3gDt!(9P3>_ks-wb2@`r$jUXc z75tUrqYTY{*ZjgKwzNy7V~vma%^Cbeg3Q6R6sRS+e@lAADG6tZsPBuZLkrm=&rC!U z4lh9knOIe%5?%4~p=<cIK)E*MfTB<aH0qs##$s;x&c-oOe<~Z}&hTmC09H~}klRB1 z7Q$OIp#rN<sqWs==fzs`NG`U|$LdON;9+BNH*CWr&I=MSVSL1A`3AJ@qTURE1H#3b z*j#2pOA^5k@EAR@!7T77M#;V)DZ$9|!+f(rtcbbPAG0kM7TJGqaaq;!`%Nc87<P#0 zZo&8M`d*$p%Qob`5wX{22&m2P+760_eC=SyT&`60<Z^7s!7(>?s$rUb1}G)lr_~Z9 zbDqqcqP?-??I)6McIs7i-1Y9DHQrjQjOonJ=s{zhnC)0>=3}meGK?b`A#vYT>Lh_@ zIZp~ql_*w-n`gs|e?Oa71jim55{;ZJ-Waqwk-c^FduCfTT}s*Cyg7&AcN1!iEH)|J z>l{!F1k_P>lk_`dS@sQ@|Ac~8L+Y=vHW&?P&vw~hz>{AXzh0!HScyyW`d<JqK+wNo za40@I*4^jztX<^1$#gg-l^f0b1C}+B_bJcUK!B!L4cvZ$`C6?9=3pWr^MVY~D$FYF zv#Jn00gfR7Lh6%hO4VL$nW{CF6J;<STsdmkvc9b%k)2*Fpv#d)7Nd@d5VS@>dxmEU z!wY;65~{5rgU>M*d2Lji)KX<LmgX1+LR<8lsKZENqaM7f;-gQ;tsqtWa|{ov$f^nH z2{+<b5OM31auAs<bdqe{MhleZK(RB=fYRkTDn<#XsjAa2H57UC5YO^+(T<#e*1agi z{9awsrnD&SIjIhZ!ZHI(WQuyL!mcBKX3&wFcgk{_afQnMBGqfN34J#sLlGX5Dn}7Y z%}KJ_r;7dh1T>62N-AB#3G>py`ty|>BLIC88s??jvwWaQ2DzBj>M{Vt__jmAa-ykQ zD3J-?&n?KdLAaBlTZRuwB7jN>ihPVA?(|G@%trv}%jtM(F%k%IN7Tvu+`-9Sa~Dcy zfkc8XJ|6QbUDMLipBvTDSv`_{;uEiM9i3<^dW5go2S9Vjk3Rm?ek9(=r}%92y2&SX z`3XTJSLsM%98huI-NL={JP5tDO3S^XK5g`~V6k|ZH2_<$K!1OvKgG&$pdf3bo)kJG zyPB{%=%dXs(;-*)1)#c%cK&vH-X<yz^15=~{Gu~|lv|}*5-*r2Zg;3p#Og~hmCpe# zI>D!|N-}(`u-X$Qm#qmrI64(3HqP`_aYsU<PTao;T1x<Yj0hXkAC6=|s4o|ni?10w zI!7~Pby_vmv~kyWmZ=Vwvp}ky#a*Vj63;S*i6J4Q6Nn0T+repdejtIiWolnG`^WC$ zm;>-FXyRM_xX5z<AO&zFahk+jyep4&>sQ=eonGJREB{|Yv47@5&W$W7U=hR@)k`cW zK&ByYK4Z3Wic_l$n2E`#Bdv|T&4uvS%A5DfA2fn1w_s-*mp9N}xyy(ZmvOh)vh<L7 ze}^c1S)!+>f8vy&+Y&*iY^<5I3`vsypK1cz>dP^&so{1(c=NDU8V$m;SoW!xNeuM! zMbFlILcf1rW#h#*RZWsWmT)myX1k%<-abFSD0q`+f>cI0f{<=j#-w<X0cNwv-n-P? zmF^X$Xq1LT9(Q0z(Dtao<e|2+U{VyI?dv<TL4Sy;9VxU8Ofx&00Lp<GqtzX^++kfe zn-d!`i`;eI5O*rmZZHR^;jUn71y{fNGtPUP=SXo54)VmRfND6Yn1R}0BI>EQM4i}> zZrf65`(8GNC$x!HAr`-JMm5EAs!!=LvoxJ~>I6kjXa;e{IZe0={70Woy6AoCrRLyt z_t%Rj(D+?oge}zYb+5i;r2$UZ@b8vO@bZ3FSY3VXR=@v!lv(BPekbB6bIK*fTl-;n ze+FB~{kj->=sM(f;hOIls?bBDZhAoMo6gBl*Tc<vz~^Kw#|vm67IWn-jKQ_(5t5xy ze7c;dHC7UD^LrafO(x~p6bi{tT-nAqCKn#jtdFyc@t);~8k!V=n^+$Z3(^H!)n7{n z73*@Llch2vAPbp)KMrRhmRj7woWHDW2>Q~p;2<63oEDHL{hyq3h3PztiYQ}v9-_e9 zd8n(Ppww>LbmH?K>wrDmZ2?I}Vj<^vVHO?v3X3-0KZo?{P7iFK1K+^fPX;;bFh>?W z6hMr5R-`pZe`5YA9IMisD)}Z(u5*8il~6>vGXsVy@!eduj^h$4`>(C6ilnB`81o?7 zN~YH)W=T9qzn}`%lMPQnC8f&$bV-7?T&wbtrj*2cE^k-|#nn!32Mr3h$RqroWonOn zY2$qt>+uuPi$SAM2p(+5Tj;ZKH}`9NUhgU#LW-L2O>@!#&Ywwm_BO_Hee14!?t-qy z4f{4D^HkrfU&^eF&1qHgtVX(9ST{Mvz;m+Z*m&)m&@!qCYG9sfI5%osny1hPJ8*2y zklW^LV;Fo{R8h(iM1E5;l$CHADK)0sQH9l(p39bO7;TMW-CI}xbE?>+=9|0GE{C?` z%B*peD<#vOQm=b2hw<!hVYo`9h>2-4n)d0EZ`Dv=&hh?`3@*2Te5d-qTbWxtM>hvc zpO)uqx4l0_EJbIv`Z>()rz~^Fir=b3TD>jJx(lsWiFERf(%ln;9guSG2%CAi$mD{+ zbVAeeZSVl2@O1DLiJ>W9;n!C@K?v)S0;vYw->zx)^^nC(tM1_LY*sfPiis71k__Fk z_a46nAcYdc^5}T4{JF5*79OLZ>UoC7t9>~tM@or21J1?V67+pZ3sj&6XRhD)2Ss6` zJy~1k+pnxRRgx<FlyhOq=o1K=@)j|Dr7KvL1rO%oXxh{);7;$$d(~bsdstBsNVqH+ z2Yxcz^vAf6umV1!TJf_SN9mBSzVm<B!j02b73uir#`rUtpC_p<vpEch^wI@)47r^# zspH=_N;|I^MZyYR`!cyYZ5DQloyBY>6UcDZoM^0N^t<frd>dWQQX+?R@ux>%To*`| zD+$(6viVR#gsTjq$UJDI$g$X)@>7w5Nq})#o|TCv#tx8<O#|gc9Fa=br6XX(#W0N- z*h4~Y`^kZd1%pkftTz`&NoiLPzH*e{oWX#eGNu(Ed|^nRi9HL5*CykbON5a1jyZ|m zm?;b)<;oNBR9ujhix^734~VW<EXf!L&zgroX=T(6{kTz@8d~6YskpEgTATL4d87;3 zuDL^i1#}3PBsKAEo9=58>rfCrlRlhx2tufibouC<d{ayzF;6&Zj}AyC2LhmVg!_{& zAKvYSVkw4H2<DKBDH5EcQHLZRG|n18C<vcHUxGxIs%?>C%4>OP?BA7GR)odsTS}bJ zBNQ)IQa%?IzwLnM3bX^EFnNF{RzQb0mtfyMXy@SPN}bA`<!D}$H&wz|W`H|(gQ6SV zTa;1@L!nwV34;n(FdJK@y2VZ+i-Jbf0Ao(r=?5cOb>w8_t`Sej+k2=`-`fwpR(H4v zo7vpJ$VwI8pt_EUT8Bi7pjZ_ViDd%<JfjLXX4eEEZ^>-GWF4My<*FiXLDLua{*n-p z4k}O7s|S3BO+gey<1&(yMQS4jrU0Ry6${lM+nCRyB>)+~#jtK#S*?&7DSf3WWyj{O zBTB}@ZV$KOD502c*fK3wR99w}isqG|%z`%L=??drILiTQDb=5|m3%s_XaqiU#fSX| zScv`Q+Jw01Y>uRT%n<QUWd!%-{H9fkV1e-N`g#U`I#{{sIW&T8xs5$ehu3DF0o40u zyD5HLJ1*oU)4fbM>62J?3*Q@10JE75xgxAGK8IG;Qs@Q&4eFPZC=P+7Mpjqjyp`BJ z0Qs1&snd#5{#~N??0~jqgiGffqFa2{E0L@m<<Fu)0EU{kokGzp&<TJK=P-Nq_4^t{ z2or`-<*!<aakcVv#!fSoEXxH~IHbJqIn|!mFV@Pd1}xi?Uw?05X1!h7EfZq20$ZG1 zlRi`@A-Y=pzhQ#kFG=zlvJAy5ebqtC^48<^a!(p57|U%sqBA^tL9O`BvlTxaIfn>= z71?r;s5}&+7@4&!e^JV~@@zr*dE6y)s6L9Sl^oN&ug=w9XY4+Tsw*7qh~n-cGspF^ z6Z2YtK>(|$?ffn%_t5YGGqVOEZX~fbPvnqU9Y}=SDm+h=<WK<u8vQXsPel1;jDFx! z7^P^bhFc`&WUm!t6I-2buMAfWDE`1BN)ztgmKeVcOk)Vn9sczcLD(mlO=P0F+BPt< zyd8)Yj#3!79Cv{XNqC%@&AEEeco)d!A~Q*0b{Q`b(Xd_{*_igSL&IYl7F>Jw8)ze^ zNabhQjrG<3*{{-jSB}VAyb6Vm;*xzjz%Wm5XlF82Z(FJmAh0=X`-#lPB}*wf5@zS+ zMrK6Wf@Z*8f7>j`%P)G4eU;)c=Y?!2-1lPSa)2@1L0x1E<WhE_j}yWhlfovE!X5I= z!$OLbCC&vXF_}?tB@vrE2ov^OE;(VGSHgMx!WNYC;my;G!a9m?_%PUDk$G?>B>X^x z8p?qY4s_$Kp^15R;V6yXu*<x?zYMTs>;G*g052(1R$}a$<p>Ua;3k(y1@iWd^?TBH zDViG5>poh7;Tl9C#T5cAdC>-3P!-)URY>kWY8=)A-^G`I@{a_@;Y52~4&4#xm<%Pa z=wsRxs0u7b&2~ZvC&+Zvv29<!RGBA{h(6*DE-p0HJtxh+9Z)zN56!2lRCx$Dh~UwG zY#HdQnwCd(7uj}R$wShatB=#%)21cqJEriPB1#?1FEedFX$%Rr9c;$`?&S~&As?!f zq^iKyoCYj$qG*;qjE9~NT^N(weaN3$8Wzx=Ac5g0Vp+?KLHp{k83vZLm=}#9tEkIF zVP_HF)N*E2a{|F);|b9{l(kw&h#`yje86*x63|l4J>bpuMLy)v#4i0es6*l)bA`%- z+|0LmhIB*yUv_Ex|HXboyq=kKBk$bvYq|J?_BDUP>#bc>sX0vh$P(wNg61=;>@;@4 zwVioWq%VdO2XatV17+`y8ddShGbkO=JUd1~)=9Q+Wzjyv`YCyf2-c*@7dNG^E`Jx- z6uJI_HqV?CC?3|ttM2N0SJ1N=yRpM$7wu3mPfOKr7yOW&0K~975URL0eIU|~Ru)I+ ztteLnf@jVctn2Edi%*<Hfu~i+6Q64~xt`UbP#Hw$yqZfp?r_?MSlBQtOCorU)Dx~s z-G~;*XemH;3-Z-4Zw*>vEnU9%jA_@X=Kd&*#V@!vXy(`u9Ae<<&jeW<q7oTi5>e|% zLLmNph)@HFksHkRRpmRT@%H1n$=$EB$HmEXYv!d#e)j;t$t>MAsqy|*F(nm?lH(nP z$Xr~zpso3_AVwUtH+#|@lc|fkCVe}cA8rwNj<Qyjew@|I)9ZGYrFh}V#p3%*fpfbc zrrv>(<mAruP07L1;v<38j6GnB8(+TL$S)8BAC*41+Jjq@`;({noJI7;!TgUSYAs$Z zagd1;qG<z$7cnWBej=^Hy9@!tUJih{O?H!iM5tn4gYX2jQp+6Nuna6|%eKBkwh`k3 zzvmN+;Zo@Gdd+d6GzdoE>Fi+p%(@o{-(ZC02mL4)`#js7owb*Jl+)|wPv_4Lc3fJd zeE}h4u8N^2ey$u$bZXjyqE<H4IwoDYL!%!B2S^)}Z%$oHZoXK}2>JeWNb+f}uLx;0 zJ_fExFO>7C#Wlz_(kIZ1t~+YQl;!w?b!*rT!v4tkM)J`dPW?P~x#)O*)t#V%6I%)6 zLac0d<{)wxpD+dw#$w>fMRCg@-@x9{anMTRm&tyW-#Wu7s#d6ID;TZkVyi~KlVaLU zKxs#L@7y}4t9zE}7908ydPDlOhCV`GQyU`w<mZjcY6SlVFyVooW~l(cBJ5L*B8<jz z>9v1+i=5~>FX~aR3n+PiXI@Pk)7h!ykQ~A5;=@?g;;ou!1wyn#fy?EDor@(%kmPq& z%ko9@TMC&0QYm(BuTw!`I(56->Cc)~wcXw9V<5$1^mhUzC-ry;6JfzJG&sf5RzvLE z=~S>{s1aAAYSt}!Jztp=g`8!xQLGyi5<o;ij7hD)TouTSy@Z)7_1NOHW6C)p{k>@2 zAe6p4I@!&RS>AAF#;Prdv9`pRoGggC)+>^!lD7u5VnO@Wl9w6t2Z)6S=`Lm2Hbto1 zMvEGDJYJ$W#^T9EOxw$^Y)<C^{bwiVSgnoxhej;T2c_6LGZKa-7u1$<TBOZvvBEUP z!k{%`!7tUxx+&$~-(I*qb)1=NNeDPg1}3gi!CS$`Km;Gld7N=AgiL|PuXviR+ryC4 z#%d2?yDUI4?KG&IST`9C=Q2=6H7*zWa59E44K#J&s7~E?b^BfBLZ04`W=?Z~L+JSU z)i)OL^T8ew_*u>#m(faInNIyfA`chPC`l(SNvF!BKfIElogK=G(ecuvI;#HF#a+%H zzAegBZYr|J*L%5Gnf93RHX@+J!>^ii0YLN&ZwbLoKmvjDc8cHJVb-^ou(!2^=!$v* z%rTS}<(F`(d2i<+9#<}|aIsoBD>*6Ue+cx|P^%fEDm7x8@)}XA)emFCahI_>cgdI0 zrgC11Zpv>Q+?OrEm)_W@inTzeyoO{At}#8x`eziF6tDkMt%xInQOcNY-e?h3bdy@T zV@*)puQ?K^>nZ2a?4YsAi#3IcCb%8t8<ZJ`w_oW3NQcA8#eROzA|}7Fct%IVmS0Zi zFYsx#O<L#`is9n2g7e}SoO9Oy#R72e3`(?07M}reQfW+Em*%G4dDagZO?6@y1j?10 z^v=?WeHR0N2sItHbpTst3kFpg-4Ll;ti8oVQWe{rLejOgdPTN|R{<{8^-ol)AOi*O zGrFTCF;r!cR;<UD)gf~a3p73Xy2(}QMyP758*9p$4U2O*inmh(sq)L;ib>1dTNDHX zE`EBgla$qo-wZiK0{Rc<(+(wM5ra${%`4OlgqNj`W%2dw!qp)TPxt<h9e~eE=+#jw z=!-uyZb`C=ixPrh=>~n223M7?GU~QGbN*xmidtec2w9?p@MV>Ln?i=0Brrxosb?cI zj)hmnDwTwyDbWO~lftQJOVX?pRIn<NUEX!zPCNA|V;)YNag&W(AoehwN!3u^-TvSS zgk^o}2iH{@l=lJ2(_-%#ZO`#ExBk<}Izd;<*j_@k{t0D=)N|Ht5KkW86juk2V=rw$ z#M59e8-V1gZ@M>iu_;*>r4F@5KnG3E<ta~7#`BWpQS4}eF!An<cfC`Vs_#5@@bj^1 z3gZvi*e9^U1^>_jeq)x9?8xT>?HK>NhkttnbOp>l>AGS9NA;z$8{lbt%Ai?VyVXW% zzCY~Fk6Ruuv9;fR$Oz}ylrUa&;nhWxMWYCXA6~HAzZ_;=zW2i);@i?)^_J^pg;_LW zyt{mGs@@6!hmXFw=xD63j*pH{3EQ?-H7t^2akt5~EreX&ajAXGj1(5R^b-~1G;I;3 zk@3xV<MJ`ahA)9p&{O@0ySwC@x2nl{{hSS$c+-1e^>uj;SGHE7DgX$2e2Y1e&KeHY zNnKelG-MN5l;#CS=>57k3KObY(^XlVi6gYm=g<kK#Sf7LRvo}MDRABnDJO2Puq}Q= zaN(-tFx(a^gcQ^;CpEJ6WMSCl<6q@h+*Y?78mhQ4=}!uizyuA1V0#&MkKWU*Fx@DQ zcZ&p6791sad;`}nh;*_{GZH-mu9soJWio|rzT_EIM>J%7rVK^qUGp;Xrk(FQkA=;< zyxbF(WT_2OA%ih%qFgW3G@+6Ui<%~wQIOOoEHI?j>pS!4Nddy_YYr1oMF|UfQb`B^ zw4kw+G<IiwvO;{bMrwTQ-)C0-*3ye*{pagrx9PFXRZX<le{Now+Vj+8At~k5{?p&p z|DTyo68#|r{W#P0LW(d`cd%nBOY6jjRD|vGUsMPYrIn`dXVwzfk0>nuya0-O*_z(f zY-XD$lKg|zPVK6gm#$96vGr;F!Z}&91>!#363!LZi`t0WIx!V$E*fXQ$9}<v+)Iai zlD0~RY&$0l+LycobrbM$q0O={o{F__-3=>lw-d}n^L}1LQ8A|UNx^H&@gC8(tVlY8 zGUANZB^0^Yg$a=2uMo@6h(iSlNn6AMz`>;eOAqXZl08I7lw-YrX3rW#*=-8BGX*K^ zZbGzyDH93YLYTj|RHw+;9nXvus>NFod4wT#6C7Bh`B9_{<XKV)9eO@t^Ig%@e%Y;8 z6W&UfZ4m43yVqn}d;98FYfA^ydxO)#x0|fUeD!;4Z*gSf*$Q{IoBFq3T>h@&+Y6|A zC}#&ceeDj8+ccK%+J2VZ_3(}N#?rgLgA&BdYZo2fZW`r$grn0XTkDznJMzE!r@#BV zYp+W)i;9N0NmqlaXF;^PO{b?EtafVN8RoQ7N?sAN>w-rY%VF_gyZJLLILfwi2t86n z2CJAhD~Recs)lF1p*otdSnRLY=9~n&!C%^?)m;#^*$rd?nq($meMz|EgVwS?nT-*^ z08v`(FFMtwX=%UjyS<(}I&7~7)9C^rT4c_}-h8FJur(PBLa*D+D^-P2i2?Um`}2^N z=F7@x(3Q&FVtX9@AzuI=)hHsyU8&^oqL&&QBDxxZk$;G&mA#55+|XnA{D(s}06(ak zN}J)?Ybcbux*%D6kxsYEs7)ouS-A3oC?$Gd#n>{%Lq@Vvu<R^KB!!TgE{WgceuYP( zfDr1GqJSdhuulu~*|XA^Yp0K#CvHV`?iQDBdUXEFxniAny=${~|HPF1e6hPU#xv$O z0THWp1pt5;PlrSR>rbwnW!B&4#yb~n)S<I|*WMR@_(7Gv`;HemO5S~+<T_eiKcs8h z2f-q>aS-T3i1Bf{b~Jd%gy*za2QuS*L@0X)bDPLk;$q<KP2_Aubu|S57fG6?-kg(K zKobMs1s;aX+|)CSySpr|s?!Fbb3y_cmI!>n79^$zGsQ$Cr3_lnnr!TaJz_O!oLi~` z;zK4ByHMb(olMb~CNr`viB&!ITq?%Ya?L{A2+IiLrDV81I}8?76j4H0%Nb%z;pc*h zqRl?;L_OVS)Y$6UW`2Db@IqPbx0dSfW!n&D7uER^F}7BwlR57JbT@5EM<I?lC?{x! z<6_dLz4vE|cQH72gD@rhK?(B$IY(~!PRs%*F<+uZ(F8&`CC{>?TJ<w%Py@|TWX;jQ zwPNM5bj-SCv<c?*C&``j%@2P`^IN-t^7T`<&~{IM7-$OvsP_tqYn>{y4q>{EifRaF zfymG}d=OCtGOv?l&6Xf+l5i$)@v$SdMO+4<qa=eWw{VY=jNt4+*W_c=s&0^B0XPN0 z^E5=P>IM5U87MqZtE*H6Vo#=-RTtNb6H3Z}Ev=kg37mvKC6Vem8=2wHvj<WL$bs{y zlS_m0M+|C^X>1+#=rXV?J%%_m1y>`F^UJAS$WFAHyGknycQDstm&G9_ST7)Y6J{(T z+YRELtS1Twg^7T4`yivpAR<?ZAYz`Y58yFA>I)wr;dRCmGL-^A_9BzSu8Gm>6O!;- z!56=c)wX?h%`6sYRm<@e-03C(TyirOy7(&75F|M*mUtx+<<?r4UZYmd$r0F53LJm# zD48}%P6R*@ZpZ;2z|6J5fbckvL^#5-xaTF(f>ZNhl%^`j+~TbD_#&H393?}#GJV&k z*~q$N%!Vc{G@F5doBX3v(!2a$T}l)g@XMEp6YJ0AOH*HpiAIA^=Z%Hc<yMxK(De{& ziLhz^ugPlIs5oy|r%h{P=s(3#OS*BMub@QkM2b7nVl&98t+0VYy64uuI?9x4P{s3B z+`dzeATWWgL?5VP3J0K4`D`Vp1x|x=VdZw}h}$vo|NBVZIwe|sB3Gn3Cx(cX2udfr zJ`LS+?|N}dJ7f_Ovt~}Jq9DTE=@{BjM+{x69_xL;HDYGj)zvPY?_m9alACapn<g6I z215W-8teNXb~@S(?Pf}GbRh<rJvZ;gWIb>>NT2P>%N8%~Em&?~9;7wbiFCGSPjGv7 zG#CH7!5!7kG0^^#$G9^+bd5O>1q>aSqY-*g5+7OLyYNfPIEq5YG|2oJnysmb*-R{z zH`^bIdCghF)INnAQ+Mr$hjAro3)Jt-#+f;KJL-vy7$-Gut7pKqq!7bt{q0yDT8$-4 zWH4BIm52aipeou#)x&GE%`@D<K}~w#hJq-cO340s#IFt#(p}jWE{0b6>dOd#4fceK zCvdsun8Z>p&;<N7+Q2Kgsws&WBNR`boFJ+w!j<s|Vt&9@#}e}!c#)tCC{fcX5xqJE zO={&O6h_VRu<G1#U@pY+9x}U1GlqBYqp^nxrDHrPD<fYlr80^?b6I)Qv=hakN|^S_ zXd!(T#jLv|5v`Q>*QQ!S?b`BezO%gFXAC-@OOE@R%%N(!zn<q%j$7AY9!7j{#Cho1 z;A7rSSUXY+pib1XmCMmII&GPmFn!z1o@T+Wh0pA{PL{>mYb&QCZW>q@3FrA4LA=)q zeSFTc3m!?xPqiJ^|6EMAo+F6#wZ8_&8($<NDV#__g))nI=-4cW0$5g9q4Z1GEx9{3 z{2}*((p2@R&A}qqO*abuq2tSwMH7ft8|SoK@@kX%_z)<vqX3$wgOpp4o_XG82&~ab zS`o{0Tx9zD`w#{miN)B3Q3O$YQBC~fXvMr3qBR6D7czBqyllRjMm4i+bKq!h)7~H3 zacJg;ZU1^gfAgn3*1Yi8DhC=e#)y1E0?uXT%q*Qm*N{g#h>ujG6UtENBpvroC6)+i zuJL0W`mfr75CTVw>l*JB;r!!7gmgb7c9{|J7R{1tURoC|J43Ian{24dls>*dbBUG! z0pG;3kf*flSKXp_|JY5kyE9Rv9GroZyfitG_XW{Vs>lfaFW%A(sS+kx9+RV2fp{RS zwt~8a%lrcmRM+LEUgODRn`RZZsq-IK*@Rh{jL^LU9iNX7Qb8IxGU@^**sn%j%v3Tz ze4_u$t}4+KUvngrm6Z5jw&c68$H1(ku$t+7?X1tWBxD*2LROQjWW*^k7aSp*y+)%f zhbpslI(ZZ!ib!*2NZ4sl9w@Fj21nh(L)2p~0oK?t4FV0m_#put3yG<NPieIH)6{Ik zVz5sOY!~6(`6Lz>ddxQ6y3hz$J`vx?z^&ZzRG-3?qC6r<!389|qut1IP=`u)TTWqM zjt(!tfm%wIl8>RsV?z=rXGm1Mh>Z+9L=Kasg*@scyN43s=#xVAgkP0F6AfV>omh+A zKVVZ||L8Fc{qD$5pNQtJc>GA0#_yNt$<u-)Y=6c$PTuASh{z>gsnjqb3ZQY~*v*4d zz9>xyb_xVhwTDL%2Gp9KNc=D0bIst<0|GdtGO`b{;#SOm{Rd;{b_*1>)|m$vrRb*y zw?~JB@EZjyQNW|m%i=_^?jeDORMHa0y!4^8Gl{=Jge&+bya6Q4I$|+F!s}NJ@Q+H8 z>VAhNd^xKuV&gL?J99Y75>=TtrhWjGJq>8{WhkH;4C8xId>I`&FvW??S~4>OEb^qd zx}Zg#=plGG)uE9yf+m2lg|i}^`!|vJFjl3eTS~(eDu0|sWB#!`l_|~xFPE(>95H(g zvMhHRS1>J>s{!UX<<$C60i=omq@&2M5SZi4gACxm+(0|7xaI}V7{`~PZYTgeg>%-# zU@d5sDpmr#E-(ftn7+X8vL*$;jS^*w1S@3(DWs$3Dk!DDk#p_0s39uUDgz_z&&TqS zDvfD<PGISd7B%}i#B`x9*gBd;$nwY~<!s0kjPALlEHKs^dZ_l}R@xGpOMGwOcpa0p zq_iFZMf6*~&Ze9zeWS^7F5XICyeRM%@9Q0~yq^T>yupLohiA<T+ns`f&-9c~S`opA zO@uBel}s}UsO1!dZc67m{3+x^Z(m(d^AFfT3DifK9Q;!SF)}q=hsAI_P7_65L>s#d z5GI2BNHLmB`t<EJLnR7u-SU)I7DDbnzkV#xpRp+|48f8{5FN#<2O*DWAgd`Lk}Ci| zHjqDQ=r8%qT(2#j^JEZu#mDzAKpb2pk0QT@oDIHYHc5kbx#SczKan|1REXjnmv4~m z>b4sZdNBh-cH)MAOEBp_o|^UEnh;T&h#PX6;lcO!p`xMJ>eL-w<4^-afld^PGTY(( zAnFLYDgCQh?`5<|UG&^T5G_J?cq%>%9$Q1S@X$w-X@leBjpkixZr+uriU)kiS3+Z1 z&DBN;l0mt8p8!AuyN%_D&E6E{y0D%HjBll1S4~j_aDtp#1Pnl-aV*t;gqm_LsQnIK zd8r%AoX)?o2NTcfn#Q5mua|92;cXj=Lv9ggZcawQdbbA%DJQeF;AiRGv`5*-U2TnL z&8K4wjsB&U+8wpp$g7N-y9#Zz_{-*@;|<&(h+Rt8(?7#!KtY4IAYXZoMruQsD)=+M zgjaDj0|zx9JWu(zS;s{Z2-=Vxse{7T5*jsCP)Kc{EpaMqwfmw~)7j3EwnhKFY6zT4 zjdZ>EI#k-#9n;}!6GrN+8U8`kd&>$N&h0UP+AWVuQL8;X$3XEy=hb-AiIcNmswZVs zo0Wr?qwfOn;k%}X&`Tko2H;z{;yQB5E!~$=%gv~sQ|d%+es!8613YIYr}}Qv%!$YS z785zFufeGV&}f9>wEH}?6A)WyzFLkj)fM>4_%pR0jL;}-;JO8Em8$WM-UZH#g!O#% zlV5O739-$>0-74HlrybXe43#HRL?#%63dYT){)*C>I6_1con6bo?0hFv<ybE@+%8C z^68FR`uYXI#97k#8~<9rZpZ?$zh4UApX;?GPGyV=P1|TpirL0uo)kGi9j4erHf1}q z`t9%@lOF_X2jQVMtF<R~O}g4rq(9kG^G`lbqF{hG6(Iyn;X?q}J_?lEjAm&b7v1ZG zx8OIn+^}?__~HwYfTGeTL?no+K2V4wEZMpi>D}Ipw=N3isymq8<aBa5$S(FJf$?<O zRv4!sr77`{a56Gt;z2Z|27*Zv#QS(?=$C-!j9}XsH)y5|B;hHJVXv;I7@y$De(TTM zvTJ2ZWn)v#%qN|<xAa&7Sg$1pt(kikd2>T&o64<&**2yfPj^OckV0Lv1l>xaPrQ29 zfR8299e{a5<KDU~vv_f)iFxs30_j&MKSaG<?s;M7PM0$2;R%o!%B;5Z61g1~l6#6> zagq8|D_`ZdaM8af2UX&!K(cs>IOATO^lG;lOiB`*M~y*6vcol~;barR!+*q3bW|eQ zwMgDFbFLx5ksrs9Lpd5{-!!ZVKpq1^ctTqh$&xHU_7-c7H!ku1shfJsM@x+4_{f`G zlAM8}>}ZbRJokU(5tf!3zEU989O2B{-*$jEc+1m-PQ>a#BA(V}`|-^iDJBsAlvyw% zMO+?cA_?!Y3}3U4_u;FliTzAad`*m2MM}lusTQT*Fvp|(VU%=6zHDKSvS_uL@q5(X zh$f{V&YeI>o<q=PdXo^z2(+3LSerF1ZsjGcWG`u-ipmW{YOBsh{@GU{kL8KR6PCOB z{T=#ky0@1Ff_60?-=;rwmao!URmf@gSm()1FgeVi9-*w6D8?jjrl~y!2Q*G)tZwcv zPNQ#}?d!+=e5{uI1r_9)+<5VL9bZ@BIP9p!*WnHN7B|mVmjoV!ic+Vg*kHBFd^4de zH-A4=6_n<N-Uok_-_)($0!6`Q<Sq9`XVhEL&-j~D{#K*4^7dzkqHC_G36@Z(cUS-V zN3FbrJ@&;yO(jm5GI|}*iE{%Lh1&x?HuM_$@;zdh!Jb2-3Wx`IkVW={ZF=@OxzX$% z$7|fA_OHL#>}6?etcpCZPeO_e{6fnsLmy}@X9oAYQiBxs6!7Jg#t*!bO-a5apOApE z)VaT$AhsLHw$q|UZ7Y)GVLLm}U0j|1PM`ZxNR46QQJ^a2RgEU&Z>3jf=(%qUCv{%a zmMQ^VxF_6%G(|sFBW)IX7M#Zn89}ib0w299Sb@29M5)#WfF!KQ6qKr90n!SK?3u&g zJq{fU#Z%+;XA<8Crv}1Z{KLfvVwBDH3B?NT*_|<eP{sny&ZwQ<cT=j5rwxebHm3-V z5pqsTRVawUHjd`6rww{f<puNv*9_vJ7?YhPM4?IOg*+OYZPUz5EI6Z_hXK={rnv^} zqw}hz<WmF5!OjxrnAw;RyFj4pBC=}TyeS?rV%#n(y1lc_r4tn?;gwxo0W0u&hT87{ zn=ITUQOY9GO#{{vp?4t**oCUAX}!>zouSwQhZmzB=tdXrj=(5(hlFL0DVKE;PQK63 z-2qclz841*Bmze36A+`;yk%dM-0)*E7@cf0%Db}PcIxao!^K70O_yxVNJ6zEj7Hq? zX4y678^&8dip-5-J|;Zq8pk*hp7FVq5&?u<-d9>CQvnvC1~*y#cGYVoK(tQLx`i5E zf(<!8kA_$qAH#%gM3l<Dvva9=*c40&4lQhKS%C_e>z1C>q)4kqPUtgrDX4}}8oAyI zK@pIWkL~)lkXW-Tui<<uDw-C<C`HD#`6Qa30|Wt1IyN7j68~7pfzq^KctvnBbI(YU zBAF=|bPNT+ucT(yV5yocq$!kWCWE~)xRosq$+*?P91a+Mi%YAbrjRX(Ajqy{34@6H z0>FKN4#bRnF#`^VfR@2%s&f4fo#gS||B?TC#~>prRVq-lbJs!lMw2ZEm~!c;a)M8m zVS$f+PErLyobEPCr0aDA>SJ-*TtR*JRuB|&k0J$iX*zwLe-l~|IAf{dEC#!zr4x>y z0sK4y1bDAI#ek6>8h(y}Gkrl^M#y?$lu$HEeqbh}29q$CE4ZL;6rk31!H{7Y{Lrhc z6TD(@mqYQX3>ma7{=nu$UCa>hOH#mh(&x@a=U5_ynVSoi=9xP}j>6b6S4iYsCStjf zD<p?MWM6syMC*YZJTK*q%3h<ciM9(d7_s7w5V2n;>1}}jySmV_DTFR(5lY5C+!67h zwj?T3LTZHhlEDtQBayiX%DMW#=OSAdT3Y4tYB}jXQCc_j2q#9wK+U~Co+xPYAE6f$ zJE&ymr!0a9fRBJA0_W_USzThCsy^2Z+jN#)ErwtqqhpPNtufG^6Pru(5qr)9JfEQ0 zLRt*SQHprlN3mpLG6n+$i9Es__A?gCLoDq^LkXnd;l{Lk9_BIbo!FBj3V{0uL~e2u zixOVM-5>zOT>&CDOC+A0G@(TVz@r0f<fz=~>BXG~{t0X9yKKb-4h><a*v1^}ut{j% zXMJ`h0tXWh*fWe>f}fAND}m3)5sV!`f?xF6mB8ooz$Z6=OnfqGANN3Blu#1BXk!%> z!LiK(3+?*pCz`n=E=oGkfev=C!yWF>7NXzA1UnNC{*0Uue3(y2F`!jWp-Zx4>lng+ zpPcNUQTx0*jyav%6*a`HIw`v^lPXHM5=^J9!gijsyRYwD{7U+Vu;7Bc<>+EJUr!YH z#)U%YV!yfk`_)xFOgWw4>HyhN$Gcm150CHd?Ed8BsGUP@tGD%k34?H75ErWJOyRL2 zxx1d1{I_NjN@Qq1q3GF^S*qAOKh#ZcC+|D&ZF}!N9X!^Zug+gR9j%^LbVrvA?A?qv z?L~4Z$Jixk%irMg1|;$1?Dxu0vJ|q;?raY*Hz*=f^0!ZD)^gU+R-%L}M=c2f`CG}h z0RwrhO2s9>SAzk@x@J4N?Pz*Y+^e%SzYA6S){i|aFC?Qzd%;uwCAbeY2%S%LN6L?2 zNNtSmJ9AW|!%*_Edz1|Cj_v(0M(*?EJFq6a&(i>k9-D{LyO(Wbi4*UxA_jjA)~rjl zv8~f(bz^zum1(nPSBe#4ZfOWzwDtzbm7WnUPxNnU?2~yQGza4XUkzi?QAb{$xj1d@ zFls$L$Eod#ocH9tsz|9HUtYA;aVvg1QCYwr2&Q#upwDCf@ZgYyQoq~4B}VrW0#UtH z@3)-ta){IE@XG6@Z*1K4ET_k<>O*qgD>}QuC$CUKAWm1*1%7$Nv-1flh<6#~Cd%!q zmUuM=vFl>J>F*kD|5vf}&Z>O-g%E{QEJI9RO20>iiZ|aj<?(IZk;5RNsKgr_j?kU& zqsPs(0xEPjC`_%hY2nuOQ+DUo^iL@gGtMLLEnblebJQ}5#@BIt>(BnEnQPGSaa06u zYjD`sO9hV&&|HU<_Rr*qzL4E_!r-%vR)7$z(SXN>%sGqFF}FsiphN9{x{fbM$3!wn z%^*1&WmnTjY+d6)wi?0N?JD~^;D>8m4)>+i??w^Qc<^Ha5T-FVaf8lW32!QDk)p=A z{A|%!Tq2y%Q*T};nJU>m5aiP%#9fZ@(2ceul~co+x4rA?79P8+%*o_6Dg_wFwejBu zR%FgAXa0c>gSS8tu;V@x-Ukf0y#teWoV4dub8Jcgf3IDIH!g!n)K)m`sw~1E-2g)h zZ%H3{Z0OT>oy7Wf<|%pWB)>mWhc_S7Pn0yIZyJ@KSi8Lwzp!gWt~_fkhbjsYMiIjU zO>2QYBBWHgiQV6THsUD6_yNkxEwu1e)}7;wVI@%2xcN}9VL%yeS2GIYQj2uhl|*S8 zVQ+doZXNZ*I!TPiTXe5@yNyUfr$B*QmRY_Buta0)mf&eBwDO`c&U-jQq&}QxPMG@* zjU`_zd%1}}l(|#1?P|b{X@K>FM2c^YVOug*EZqwy%N4CgILEo43tF@(p-rC>S<Vq^ zz6P@^Deno1I=rC+t`K^#`s<*3xnvg&q1|c{S{|X(jMpo~sACXOqH@;SGQ!(!(~xMp z-7^H|t-0r`-V=ob-h?d0ZCFA!8KVgEm{?7QZ%DCSGnjcG^af`F4RP=<Eom{3y;+q1 zGt+*gvTI5+o#+qHywuF0)iFB-BZUYLR&pvMRhClW@8PXH4W`?NQDDf75f9<ouy7=9 z&Rs5<29%bD_k${uWL+bS1%G2%v<MuvZ1&Sn62!%VqL#AbI?iKeZMLNS<1$~=*!|4m zE0XSbgF)}Tnt*;RGSq`SqZh&`N3sf$g3@csKt5T+UIxSPM`;$TY`cP}Q=@?WC@J)> z<LVC7BK35I-b-&`KTY!rx+V+xCQXb8vA&Jz_1U&v1Y5Bfqy@2VL@Gfx5+8*CGE@7Q zK67}~4A)?jE{G6#eH<>B;lUhQh{1VX;g+|uS=6g3!sTP?-tSjJ>eT)bn`d!Ih~g*& zd;>$%N>1MoBU)4U*_SPEr~s@|bq3LL_Z00JDJWPG$(2}c!s{ko7$&@66h;lJ!%FfU zDcINX{vXoZF6cNpV>wTkA4<J<+p`WlSyWNF6pKNI^AUiM=Mj&~F-oLEqdE_98YSi7 zDQnoTjXEu46ko_mo{u`!WYaIRE-HEj!QQJN>=V#d)t(`rAD!(t5X&?C>F@q+qy7h$ zX{94a|4+8N5#G2^i>pHjwvR^Zy-)Q2UVYwmBGP-~C2&6boz>UhBcYyS%%6sLUr}Q~ z!3u>(N{4iI+5k%}^(&pL?jt9j&l~;oCH1X|<6*k4b+2*%YWjcB*KMP483UZ-Tni61 zl<R32o&I)`{oD8Aqxhej%_JM$yO5at%x=6Ee|fDd_I4K|-uVB!$F_|(pH0EojsM+l zl%VtD)}@HzQ6TmE?|iGpWc&FvN~Vt54`bTdA(oXtkRbrZYaoXNIx((ngg5)FrkS(m zeE8<?{_R=aDXwc(5kQ^7)OUEDS+9A|QEN!HiVY74#~{8I;^sIya8Dwgh%z&>->)F` z0kyp5;&2r3jrxGWcQ}0Ij!wvC%d`b>bJ%J776rtnYB(v$@xCghkyk?}r*Tkc7n_r> zAs7cHo$QS@3iarCaoJQQn-~H?Yje~i%FtfGUxQ9{J2>UNLNPh2mv`u(RT6SOq+FsN zcM4xFkLvSFtP53bL}4Q|?7Jt4t489kTPsnd0!ivN<07i$QdGFQSl<+tnB$D=6`~jD zuxLjsRTcm72sLul8h@yM7_5YvHUexO6iNz8CW>@#S7NJiI>SaJO_1APq}Mrep9NIE zwiozZWx4Q(JzvV9LYd?JhywNECkT*}T%$_&V{*)dkK%{&Pvd0R?yawkNi99IN@w_; z>b!pM72|dF?<d6n=+Lj!he;PCd1mLu83}|a4_1@$pO2*0Ha-9J@^AGIlPX_?)8W}s zXZhLHzb-^Xx*VQ>{Ku>ox*SF@>&#3RFeJFN>vfz99l+}Pho#eHC}DX*^7!&MvpYjL zo80p($-H~n{%(Vkg#YErvx{$=n-y-jI&aI#*)ON|Ct`Uz%k0#YZSS6ojJE=fv5?E4 z)UFa0P5*i(DgIIU3}pm!&>0Awnos3C-51zLLN*>S92T?kNJXP#^JFrJcfBCVSs$9g z&of~p(51Dsw3cwbf_8VPPQcsBA8a=6^TV<BB74RJuc}Mg$s1%mhM+ldw03J=4~|@& zL*5XAo{t9nQ@W(CnGaFuC7HXDh2Zd-7>h%WeudI=W4xkB4vZMj24k#GjUt!mH-!w2 zFs!cW0o)qv(ojX!6UBydP7bRu{|OpsRX^c2FTo+x`Qett@0{SPml4Y|<SH7zc9naS z3|O0Ng;Ow00#xj@98A&=Xf7n+nz6&akKiU|4-sPm;GfxU?D3)!)Ppf+tHuEGaO`KM zLTxf`bGD;RJ610VB$<j%cBr#ZCD(CLFS<_ULB@GJ8BV)9Cc)OCrH<;8$zrfu?)2y5 zW3^Cb3G*lbI#@QB{qUH1>>~DQ5iWC@CMTK+h0XMng;u9|Es+_uN6hW5ue+>WkUenW z^gltp0s;$5x8@bV8Y32tLYo_-udQ}sw?M=q+wMq7*k#*neY4#O3FyH+Al|<75W2%v zsiJH5+(Q1f)s`!1$@U+>t~fu47>?SVx}6gd8P%%Y5zCvw!VS(}bL~zpcsuJY;zH{` zGPJ4r?LPnQ1kmDhNbXZyE0NVYCTuhbp-WQPdc$d>%IE3=vPk9zK^UCCU@@9uXqV_# zNmLOU-ycHG(q;cZ$X$4ASEoV-ABB!2FG_h%sjWQI38Lp7Lbo^>4Qd2q3xk8;u1T^_ z&YF64rT=%gIx1f(QO2Yl|0W(uL4?KpE;dhnl{&ik^*>lCJh&8p7rQcI%twCOwXdS0 z`aveZh9y~}<I|ASIHy}q!bVS}8EY)A{l+m^R)RV`v)+`OxAj&Dmv+*USVp#4X2xG; zp^{>_TW{+_H*ETT+fZjC$#-M<;6NGY50-DmV|f9`fl~kV1<|}bmbbKUNTSqj12A8$ zd3gWFpKLfHhU+p1=>5F&wb@AOXJ;N`TB*fzQ#UxA#CbLloWXbo0kriWowQxtL{_N^ zNCyV*p?NWT1v=Ff@GB7jG2kF%AMyK^T+-|oEVt9a2j2P<k&k?ic%mv%f@W&;3>*j@ zPAqi(l^@@O0)zc5dJrHYW?KgY`0+<}(kGwd-@lZjeeC0qJ`FK-dqc<;L#-MZp@$Sg z$OX#TekjDRk3gUg8g-ZFvPC`S*7+<s7wa|9=HJOK)T2=+zORg9l(5^mV2&@`oU2Z` zSMgm<q!&_|GZCshku;<I;3sCltouo#xa7q<mM=|4dnq|iD8xk}&>K14E%{+=9z&>Q z=4Uf}K`gysH~(p{F3hstrfaUZkqtV4mL1=;Zd9F6-YtDP@8ypc{hO;>bK-sS&xQCS zd}{nxK4zreTSLSda5$=SG1*1SlP>r{OW5(;gq-Q<{6VJe=kaa%OXH2tQ0~r>O3GlZ z4-w^AbPEwZ@$(QGtj|+Ci|M{v%r&;Rob5KP7j(J3wQ9G&`TE|kqoc0jY6=sJqBM** zQYQUGB$Cem#lhgOuA$t~OHJP{yW%{T7y6c9W*z<=FA@C$#%@g6*|X0<(?_4vD=@qU zk(?32c$~iZE>PyT3plW&x{;L0m1M){k!Ae2){&0$YVw`ibXL^!+qR34!KN$5+Yo<c z9bDFYP)>B1jF}JJg=k)~r$0=~97IoZt{^dJW`#1;I@5&rD#$ABFhUaPHy{<Af@CtN z9xSx9zl=X7IgPr81BGVMpsyr!He*LMGII|FlPB&^wqpI{Izcm>!RkrBFTmvmQC8Kd zbRct@muY|FL!}SOyHY0p9%F1@6$Q|DciZx2^SKLmEGxv(!I@saWaR}k&Z2@~OsYuX zoPL`M3|rsdNFiX|>qo=^2N+-^k*M!ASdAEh0r&Mlj^JSp5OlQnb=+)N?mvn^{4f>e zJ%l;Z;3o8*mV`hd6(Y0#H`r+yzZD{|F?yH5_0-BHV~l|$ClJZXi#q*nPr$&ca3V1; zZL$AX|IWG12ZG1l;GQQkxrc!PS~T2UZVo*siWr6%1|KC8kq%~1S~R+tA!Ij($&cl! zE*V`b&`|HLD*#OP%ge_XY+d2<1C(QIX<VgI#DomdG0QoGAEFGQD2sNWAXkxLewt81 znu!>K*(|)gTUsche;*TsG;v%8G3aFFICZs6&s}(4j7dZ}U$hrPCF&9oCXQsv4QGrw zPhGD(4Xhd8vvblB>rO+KRjBWlGK9iJ2ugk!e&t*zmA-$#_WGcTivg&C{hvSTc<FS| zw(U_K?4enVt@_pV#OtlFHYsPxvn~D~3K4Vo%sTX|*4y>3H<37*`r>BiOi>z+Z4|jW zbqtGk7=8{lI^}kTYl=j?f%R?2f_$7lpY?3NGp*)3<?f=MZ9n%$SGB5oo2%MI!ao4( z*rx|u^1W>OKNY#6imtfo!arqRv=dU9l|Fx1iNLqNi|(39l@}+=wWYog|2IkupUlTd zt?N>*UnVr|FDeG2c;s!UyOGox4d~_|nH&C#Z$5m!(`QR09R&XEi;J#(ue>uQY(qfK z+bHd$2AIufl)R!{>R#mw?Nt;JP`|tCeQlJ<#-OW9loJ<>{$^WYhjCuP^H;}4EC?RO zSizhQM_oV|NsU8r{K|n=zOZr^Scg1lWT2Q{37DgMS#(D>cay{+?_YL7UA;`XKuyH* zL8vC)VA0g(J?8)eGrjPAT+o+57qIysQ0AtZ-E{k1vG?7v?4>K0X5~=Dqw<HJ=#(S= zaaD5K=+6%r;PXc!YA39kmu9gKeeltuXuY{0oCECIp256=5Z%?qnn0<WIEinQQQ_DP zQ_52{^OXQ6ITE%JpP3+p6Fjh)_sRFL)3(*)sThNJgdr5MFR>O@!4i&Grve1pig?WH z4Zi1dlOXW!l@j<sXvmjgxDqaAS<^%(b4M2SqSi1v6x7=|aTOH}BM|_XG~bR?W9CK3 zNV)!F2zBm)WH556PNI%N?Sw$7MI<!4qbXB*2sv~2T?DH1Q2m#~aHS`LusJVqy_4sy zDCaWHDR3Q^vkcnjm@!grL=hMeZyt8n{N=x&ky3-<j+7$nU79)Jsde=6<O?02AKXXx zUoVe7Y={Y$J{~jpaPaoL%7_l|QaH7Ph^^QKn*dOQi0VWnS`5om@X!PXCh!aD=BKIu zUWDvf0}Xe-dsrX&S^=ByD$x+Fh%o-pFK{FD#i)f8$Ws>AOU$%uh2U|YDM!yz@GtMd zhO9w8oXUW|w)|4+s%;5LnqY*)h%Fen)9Z>6goOLNu4Egb0IGH+y+BI^rv;Pq&+#N} z8+gn=6po*d_0~fD03%PgOG(OF%QtGcR;tNM-58l!%1`FvRN_y~vb`~I?c~Ny(cSzN zcGZa`%$8y@5Tn+O`h@Yz7DC4@B*=!>LPEUki{7DVnez1@)>4>S+;oZ}R}$N%eiZ94 z>ooO-KMFB>eCse#h>p}-uqB0!g{NIIqp-4`m+P8-Hy&<K(?meKPChZs>;p66a4k*; zkGAg<;Q$ElGwkqxa%Q(AwwbO%?Ih%0J)ua_Cp{UoI8bgP>9~78FXxljC!@wSu5O!X zSqL+`XhEbB%h@RdkeD-T4zmmZeLg<1Q_Mq|Pc1JR5R2%HdDT8nm-CN&J1VM)Lgt2< zwH!`SaI8mQN#&H3;%|}Di#N=;{QGQ8+U^KA;EiVdmb}i57_}z>x96K9etq$$p=7g0 z-e{Q#%XVx@3KYEsTCqlHW4lRb@Y@%y5|jknNrCt!Ww^^7PG0VV3MxHeyiUie_79Ft z-J>#JIv01KCU$utK#yZ$P6;Bqx@4g!yh_)JF>41)oR4&5m3afKj>7}uQHp6xB&d*Y zsw>C4?LB(<Ix6{OzR)cYS&>cR4=_g?lwu>fLHn{aQZXshLwH?Q>!NWiy6Op^U=(kb zY?gA!$ecOQG8<d-pfM9$HiX)XaJkr|n{*{;PF4gBwy49`Cc>3M)sD{Te<9%$MTG!8 zK*GNllJnLfNR;#2HcHePtsy^ILuF`3<Q8`;<d(XFEwgBoU1rA;ITg+f;Da`(lwo&7 zN@`UTHwQ@)q&EI(P64)uTHuDCciff}yJ?o#OF=PW(kr?)7Ns5w?v_>KL8?bqKrfQv zJJo@PxzGU#88$WLcsyR`)7lGA)R$)}ARckllE+qnG67PMWqSdAZPTo$@<IkUBm_K| z1EK10lvEVDvt8z$R6Pozw(zi+)dLH5--!m~IjG{)jnCCAF*6HghYk`&>KIP)ltLJA ziu8%b=KShxGb(2O=8{$P&<aiJ#QedqesX6_V$`bR!%I$D632>J%{O#w-s+Txp0E-5 zy5UAB_Cv*kdDyAg<Y0$i_VCiuG||GfPufrf-TGkqBm~&26{c5<;lVXSUT@<p_DZc1 zUiu|h5)o(op9oAWh&xjjh%|KXP|3}OZR=hBdUlvg&k+c|(<b~0X0C{QoR|S%&`B3t zqKDmokKIq&vE_R#bw@Wkt_8}HP|^!TTPKO)P`*iMp;JYqQn!whzSFKRMB4}J!<Nv- z8MDsWQ%2nt=8LDy;)FLsUwl0#6_!5Ec2yQRUwScIx=t^k6UmI(AYVwWxT(dslWx30 zHIE>ZDv3j7c91TMGncNvLFsouTUVONVlV4jW-}<H2~9u3ijnBIF)7i$GLsgsZE?`f z5Pq#F8I+v|_!GA^0$HJgpeM>lJ1*z&r)NqRtQy4jwSoKbGJCg$pzfm8|Is&?NPZSI zk!e18&u5g=4A)ZfgJ#AYm%<nV^wD_M-yLKEI0TA(%nM}Wp>BgB2p4{rIiz7j>c#^{ zc%&MkP^N35uN5alURtRq*%=&P5byl|jsbM{2W&9xhb$2%fcnFv1Fj@ncK8$fQV~6m z%sELs&fZ`@?uY1)`Pm?3Pf<ezTkPD@^l(v7N%g3*a2}V=&z<|`iBn0MEGnS3f)-i= zP$3=fo*&;WE=|p6dFs-M-K7VX5Vh9DMr<axu{5Oz5$qr@#d6SHw$Bnuw5HxLjq$r& zoa~EI)dWx@SE_9j?yfEPP~3nL(^1{~yxPmU++pY`WK6!}?CkZ1ZGBlbCjH3-a~rW@ zOm)sC!?GlPH{McvBrjpboePRudLBVuh!#L`p%^Cvg4pD>)g(-sUt5+o`++Dn_sh+) zR~i4i-`3ri0j<CMPscw(TL%tM)g9BnoB*siC<gI1b2>^eI%Gi(-e>r)0jj~3m#*CK z@A${$@pdAYrbpCrpdR2i6ZABa%v&Bt-Fvt|eqO-KjKKp@N?VdY%Vhzbt@x4VQ*QZa zOxrnUwhT2Yg=zsD+5JL7%gKpvbU3lpFZ3zR!|J%<@lAv()kDDn?>>1@`qARYABLRs ziQgvmQE?mfQ=jOhzj>I;ydG7`wX?p15IpGwBxn-MqVq>8m*}nYU&0Fuhs6eWf$Oav z5g+;@0B6^chEp>5*(Iu7=VDU&J@d|KNBN83xYb=XwtC0w2Ili>RA>}t*1<8K_wV?C z$Q^)6_WC?KW)bR?^I4O0#!IAbBgk7Ob!5O^WZIai@FQ4~*!$WQ9%Po<C-B%)aidfe zCMPKYX)=k+wN^6dKOK-*vTup{YozZka>S=$o1_!#imd3XsBvbpw`bNUdUz8&%A=eZ zZU$LD))ch+@%zv;>Qw2)L==kYCI{fKUq$F9a5Oint3oaaU`g<i-i41d+lKfyxPh~= zrAB0v8iN2)fjL`|1zCUqhK04sBEsu<_Sj_i<0E5V%WJzh@mD@-mf9pvQrkew>hODs zEg5}r^H|h54@QeTQyxz@R;IJ_-)D->@v%hH$g+o+WK%={fM#*`dliJLoI;j~r|%O- z@2QMl<Z4x0tE3QPqyD{n?)50cAZ>&OzN=6SAkV7Bapp0osVkYpHc2eey60W$P={h> z0N_ODtIB0Wy8OO}ki`KXr_ayi9?Ijf?G(mU`?A!>Rzv{h$f+W-8Y@|KW~qze1VKJ- zewY9uMkr4&4}|fdWX@%(n3h#Je*e1D@kpLjG(ZVV#I<B(#dPc7nU2%eQ<Cl*Ni7#C zl6pB~U&99VD)|~ttP0LF&*x#{&nG(fSpE4MZ`5F})3LNW70a&B98uIj(Gdy|Yj?g@ z#e&X&cNo$H3xANm6>GHl&`+4*9<5KC;>Uw`k9B4c0#(39Lm+x4OKaSZpH8_Td@Wn~ z+D|~3AhmI<;3GL|noma|gAs+lL(g%#zN(6;sZ=J;;$?<Vb4LtMlntK3=bx(HS_#P1 z>ES`Dro43xA9OU<b1XLb_{z)$rl*HqM0>J-4*RQb@BT88iTGgkxpFu5LT<nmq1%69 zNP*X`f7#rHIey5jwp=PoWS_g8+*$a|CbMj}D*I!1MLibC6}8&=hU^8Y0d79juHXRC z9f!;9UlJl#sRd}!NFK3u(rs*zLj{?<0qx<A?7pNCKK~IkgAj`G-p4lDW_@fY&3atY z<7CFf;TB2|(-0d5S&>Xz0-uZd-seegoAt5H%IcO925efP*QNJ+y33og%?muI{+Bak z@7Z8YpdrsxvvPtVyL-sLBnEK2=o?GMkG_ftCu+aN3EHDls&S5&3pJf@+4P-=otN1A zC_w^%Q97>uVPSx7Oe)M`AQCNp-m47hh;W<1F1YU=NTUS|kFSW;;hfLHVP-2S96?Yi z5(g8mARyyaC_LmcS-$c0VoOY=^^}7CX2u5C^@yPn8-zVgTkYV))@VtZO$2yBmTT*1 z1g*u{=DJanhzx0|Gx1ljyJTNeqFS5evR%<z_b|-b%i-CVJzE7AbV_w1vbzANm?*wh zO4^>lz{>#<6{CC?Z>#yDiV&N4a?`%&T4E^h+`>E(K|qU(ZI@AmU?BCaFI-6o7e=TB z?O_`;8^kK{Fr8RludJcj3Btd_oS8Wsi5U;cMK<<%=su`qJ=KUBB+2PuBp*#b0)0p( zgm0Osdp-a3omOC;Xjl;q%1krxnck=aIzs<JX%}$!tpo5dpW6snB@@o{1|n9NJ@PPi zjrtaVY$O1EP^e1T8%zX;^~}Kl$BULBnO-I%#pNIs=KjD<%*@RU!oW;q2P(HPhUI|( z9!!ogIs8O43@rhoM9((n>~YA1xX^57h?S+UI)pSYz}=|wFaqUaNv(+dSlHAsj{32$ ze{;*}x8OcCNjuC`fHwfD5X#bALXLCT1`9AT<LWHqN?JivW3B8~P-}dh>tPc`P85!* z{bjTY+deY)0;wye(b9?E$#uB4odG4Os>)+HVx3s`Vs@en{`I$yrGuoAzY|4M4%_7l z$ZOClznLPqLhxF^T%Sl>XT3dM3OA|d-@f>eBX-)c5*G4Dyifb6xh5z(CMt|)-+Xj_ zV{(I0AF-9ZyD@<|Lb1`6Y`{$ofGTvL*I#vIskQN5Bik|Rg{mRIiBqmH3{7`v9Ot9> z)6iHBNh#KC1km9xL9G?UosWU8aTiUR^{5mdXd9**+%h7xSgS38%+vJQT=u?W8jxd0 zt)mdthj9bMPcs^Z(@*+OuRll9jv+-&O1}B)63T#I;t$!6f+!mf4W0sR<;T8cY_i93 z5jgr1gM~BoUJE6@c?Qd969l}CN$2?s7Y$8N;f6aaP82@d5`~Meb1{$C5wW8V9gJxt zGnM3YVvCZce1uJ!HB-fLG8<K@0{HehHaDM!M`E*a{`Lry{UEqQAP$}ky^HVxg{rgq zVj+i(rIEYU#u<f4C7SVeHW^d@8C9yZtU!|TpxO@Tvgq<D2z8Sy`TdKVjj}&+Fh9J- z0#Vu8Cs&FT!ZZU@lE3lV_N3&7G{TgP?x7jTjao+RksflWwQ*uV+`d3$w70}}5vPXO ztI|#T>&>dqB?G>SZW1MmqMI{>POW-V?L{ScPz{=mi=A{Q!qmxc919aqb|ns4>e@;{ zU>|XGuGrsz+2(+c%o<r#Z;F5JenF_Ou_0P4Q?%ThRr0892yL#LDAX&d6Qn(~k%yoj z;rb609-)sjU0>;R6grO5+kk5lG83vq`7$iEBHuiwH{?qvsV2$7Rjs-n51weV4BUqK zik~u%QiNhVV;$;(m`A=UbRdL$lK2<Zp<N8_Z=^J5V-Xf{ABtp*zJd;vIMhX-V+7)7 zgv8GXy=I>{Sx8uv3KdC;A$*J`fD>cA-&r#lZBKX$;$B6N|K)HvuN+Tx4?2Awh#1Hs zyVM(COVyUnqR(Crglt{0r3TpVlG0^x*qJMc+hBar#TVf5aNBsB>pM!*eVFw4e94nd zk#azzE=oOFR$26T*asn&YqF{?jt8Vv8DH!{k<^73k9IQ}4~j{o>zXK_HR0iq_EtVq zi<W4@LYE>_k!Xk`*z-wMiy|nZkwWtjR?>yOLaiysjB^Or`E<55J)ZCIl}oZY`%drT z1aAgyh6N|2UAXG$$(8k2*enWn7?HEsE}pG8aU;=HW?e-BZ-CMM5Cvabf{VR^BwGO) zUwrcjE_K#|)~Qh+z6XLHm7?*(u|x4x@H{%LX(Cl+E^HCe>q4CJYqlSf_|cMgdNv>f z%LzSq@t*!YNw1Gy{w@t2$TDQ^gekh>1?<JV_&B#4!9M|DybQS?x0KumB?m{!<qntU zJkV79JeU$)$pK<t=^WDYZ;r9S&QK2#+1%UX81eV~n$sd{BnF#+ess^{^O9vc_uL-x zz|}t?4K$Iti3Q=}-gR5aym0%l=>9)@5x<9wQlgYkc<Qr*&o;jP4T>*0)5R~%<cfD5 zeEBPsUh}AUC9{`Qt@|p}nv+?tJ3Xd=BJ%lcd-L*zo#h1C_4k#@2s7zvYs7cFb*2Vy z{eK20T@Zg<emOcFp|qa$cCuZ4{Sv9N|4nrBTeH6EwFly#UU>1!dRX!POW2Ixt^E0A zX0F)I=N1xSB*t<V*Yb<h?|t#*t8p%a2W}_tSO4-7S^e3S#Y}*U*N065;OwDpE0+K! zWfUiOkW?))<mcp%p!c}P&MD6|Cx8n{yqG>)YUo{=BipdFhaTPom?v>E3j5paQO*m5 z!w_u14e2-TyeRs)IPWu8Q#Ek=w!B<=F%3R$96AsR;k|Cgo0V6q2hQt*UU9|h>y`8` zJ`)*p+d`sY?D7IgG7gBl(Li{2@6@wGDWrsG^n}Pms5&wL(Xj#{f9(WQN9wBz3^a54 z1aSo8VIuaRZGD5TW^)BbUbB{DJeU=*l*Zv>6zmJEve!e&dON6Gnsp!f8$1L!z4H3> z%P}dCdYnS=9x|womlsDX<y?h@j(v;8`=>CUUv^#P4^};2PLDiWbi!D>S<BOGxa``> z?}aVe2A7@1B~MTKW;MtlY}H99{h}XOyQLS+yyX{L=K|8*-!~gh%X_IOwy|i(#y@Xb zkDKX70KYh0y70TxPitY-xxU$E-^CNXQ>HhaPRJw}L;#lQYwug5=yUHcN#*Uhrr-&S zOYuQKpmP#{-L?3%i75QK!w4eOtTVubZViCtW$SwI!Z_=tMb*X8ukv>Dl4{YD2sSYk zRy<-7i?l`mR3S(UjePo@L~~dHMO-@t6OxzwEzBgj+;l-c(08)l?0k*$zv7_CA_8gH zt=RKY8o|46ik0@NSc*}LRR_=)mTnp;^I<u^N8~i8h={F|+z&BW!M8c+%Tts&4OZf& z%}VR11eADoj#(FTNJx35FEMsK&HR<b^R@Ic2lkJshlNT;*|S9`ks&0YnM|;G%)y7O zVaZr{zud_wpX}NrqN)_aGH%^^_O!|V%jTfVR+Kr7mfOa+`+v#zg`XN*Dh~%6azYp% z1<$8}B~+(_AK%b3G0rjPaMq1}G_;w+#o@G9eJNG%wuG2l!dSJk{_-oieovZS{AP_8 zwn)rFaLiKOcd>x00cuW(6DGnDV&dING)Wmj<iu<$gvTSQWjx{>1bN91LsZyNB}ajz zYOh{q1uyDCRTah9AqtiOAV-7T(m@)Q&3QyQPvh{m`3~IKw24x-lMaOfrIcF-2T+c? zW6NZ?r$~&diB8%}4Ij&5RHwoGowd+!sYyA0XNtT{%-YNiU`c_lWcKIAzUHYHQ;2u? zzJv{a8@VVaTBEDt+8>>2l~Wn64xko+?^Rn)q_QZu0mLfM?;a>h6j5Q3(hc<NJk^>Y znw+k-z18JzR^`f_PPeIa`xKFig4L|3*D(5W3E+Vw#Rni!+9}E{&?U<%e2TqcL>GMZ zVCrFZ)9gBw1*+(6g*w#GGu6q!yoiVfS?*6L9`LO4*s$dncf^OIF_es>)}|B4i1UUB zm&Wx|iGmChUTu-sLzkV<=Ewv2QWzoLXqw9tciLO=_LpDWT2#V9t4@ht+0SL8G;J>~ zsYwTOnD}soIY6z$7(6rw`v#uweD?X>Maxs0C=jsw+!x}M)Vn#+bAxtiN#0~*pX{5d zQ9AC0ZV%NV68m=Aq%jX7El00ZB26TgoUtboJ(208U1{1Eu9bxeO)D#6+bU4!L<8m_ z#AOW|jSp?(6}YoiL2i#)v^o8!v>x8I-%6?z%;o3wUSjSUcRmugd<6wVs1VJZ>xSK; zn<z2Au!oFcm1bw^gN;S=N&%fZi2xQUDjg(+O>#?$(QMHu?!15ZS9vR_i)f(;kY^dv zXvP`GJ{7;R3aVSNS^l0HF?$M+@jHqDzKQk1(nF__Tqv~s_7XcKNBw*u?GTEp2fi%? zh`Gys&LF|JIxqHG++^ea43h1`8Y>?q2f$E?D#b{`%n&<zeC1-H(=;3dWcJX-1F8}N zlgR0y@b*F~33NVS-V1s*&E(9X`IDc1Gq1?Ve_!6WjkT}Q@$|umH@c@?$U%E%7fG%= z6ra$4#G`z+wD6C2N|pLC=R!u51sA{mc>yzwji7aGBBbClK_C^3nT28Ul>)l(kr4FU z+CkJy0((|X<5B-o<Xw@zz%nQ{^M{chv;k564|mB;{q+^%13_i;bOmYj?c*{coG&-Z zPhdO})${!6CDfP-sW8(@;zW2~EzNkvZ+x~hE?95IPKtvRV&mV6lNJq`<8~q%PE2JS zpKnq!=*D9N=gbCUG@wU-(lTG%DM7i5g^6Q+izL#=iBuAAO#SIY%#0(f31R>(GltCS zC~JKp%6JIy5M$~rR(M;R`xcaN1|m8~HQi}3zROKXt>C)6t?@17mOQ`x9c__*-q4KY zQ!?iWb4-JmB_0mPk$PxQRJJ8TSVtRu?JThy74%{Ka&U!&++9VCZ%|{*E(;@n>I_um z2V;8bJ(qBg*DO#H{DevRFS@~6{DYcCmlJ9p2V)RsFxXIoz++LOk(RO5=tHt1{cBl* z<(e6xN^-|1aNxLA|4fyq57Mla1sYgI4k=CU_24*C2eX_@vJ6NqLoeKNNoM_MW&z@v zER`Qw6)A1yNhR*Z!_q+e0H-)~%G%=U@33ZLly?V*SZ*k!bnZxtZS?2JyMY=kd0pSr zUw!%0EGiP12mfK#j`Zl{3+wmqtpL?r<NM!#m}>PJJA2CO8JnInKq_^4+nJr5AM9SV z7yG-JW800Y+SQeq<}o9z7__c@w57ghC(FzsNUzplA_dW$cWqhLZHT!}&0uFfR)f)@ zD~@dpDNo-iSTE1ccXls24zaaetQNDCpVY-yRBgw6jzv308_|zAg*<eRfeb3T05`B6 zGG=bZbVrnsF3N2!RM{<Wgyz?JKaaM5IM}9>T9aMyf~Uw>zI({7+bB`8TGKeJ%NokJ zV(sUX;{$0a^FaQjx0BNmj^wGNn(q6kFR;*dl5atKDwR+<J-p&2ws^kA@@zhr*5QeF z--oAf1q4-Gqv8uf2{mSN!-l?qU9L(=DlyXSQTeakFzZ_ok9i^bn&H92-*@f{w_|09 zCN${Qi5XA?RH%<Md`=~X56Ihfj#}|{zK-W=+)$kUdIYP!Y(f*4_rrC*uz<hXrMy>w zs^MT_BjFq^wmV}5MhdWgHF(TIVF8bhMHuP{Pq$({0w!fPi{LYg6ecc)k@e^?7N?;T z=iOPa3YI;}I}|SaHiJ<hKlrjAzn3vX++MR(iKU1t;2WXtLIO~@&xUx80>Xa@0BO%e z1B3teTA!2ZbI{rPP<**cM1!f+%TNR%KNODh&2hEb<0)T&T1sZ(2x!#g{TW{y1hi=Q zf7=iLtO3CLh&&as_F46qVl~WLj(do31}ugUJkMXNIdmbT|NlRYQg#Yw6NJYMCu<kq z7wkfe|M$NtF8YP8*(Y%e3hUh_;q$Cgs4l*;6OGSv6M6TW^$K}2x7Ti@Nv2b35Tj+4 zb?I&n@md7A;-W)rEbSXws7}5Rn1Go$lk!awJ!GeSL?*72YpUA&$tWN4V=7qV>{)B1 zt_TH)5gwC7I6Itvkx414n34902>-3HmkJlz@wBOl=}1b@(yP;%g}L<qDq8~>*mFob z^fP6mC9_LdZ)rnD$S7$T^grbChD}~1;NemT>L5nQUueD8ZK3z@RdE4`CQKrBpOoy; z-P_l_Fre{3(!Ocw9m!QHm2kLzS2B<P?`^5GQq=Hhk{AMk<=Rt@**tVO9%19~5i&Be zO7s*)I9BUbNwG8r5^~z2qt$w!Nw?7w@a&+;3}qQ5+O8srSsx>t6X=m%up3T5*bw60 zsGban34eFu<F>M@!uB_?XXdvy)!p8_$-4AK(*QM(Mk8V}u+1J6@bJNWk}@>e*p&0! z(~W!L+=i)i+TIC;cNM?8^z=+Dg$1<jHj-Aqm^5Y-y~I?0)qL)npyas5Z;3(Ob7a?x zgD6mV78w=8GoK{yKR-$FQnnsR-FC;EJ>y+GYSY9?XU*&j0WRd2W!A-Dtka?&dr^t% zZr~`PG?S@H@eV^oTN#n+1mh7RM59m+%&M4vM6R#P1^$qq80wUFy<%jB_ZnQqsYz7k zx`-g9-?@gLIEGW|RVE_im!-zXC1&Fh(xj6WdU{#Rl<HucA>mOjnsg_}qf;chfD#i7 zq_!v!*>!RumE6~H`TV#%SmFFq$Y`wqSyZeMbSkJ-8+lB+pTg^>ilZC<c<na?D_*+l z2+e_H9fR))K{FLC50WAW^hsCzaU{_vQGA)iA44TbF9qnJYd7yG_;yair7@qP9t-yG zW(Lwk4U|yR>XC<{HEQhGldn8RH%;W34=EdVg{slXVnD~e8Wdi^h;smCL9>613$fGc z@7_6gK-sj5heu@NI*ncUs27@fJwGo-LJWIN&g-+a)-W+6x{|mok_G_#eM55(jNzqN zPkr7-ZL(|2Cc(L9gs6{%5_Fq^0-LRf&XXy1vVn6p#Udl8x*ou(N>&8|vGb7|&9Rv9 zz%w(qd5MXg59FlIddPV?w`jGmEmlA=__f)HwdX!tYr5FKru<RxMJ~H2tI6p)>vFv9 zXfW}}Bc%y1Jy8~NQa*9LL#Ki1X+J_Ee{aGAK`43~)=6pu!;tzB!Jz>h7L}8w&M-(J zH^t3K2JBBl49HiMa%r4}W0($W`meP@a;XBZ$K9PWoK(ko(}wb*>)eH&b{gWXeX}27 z!Uuw5SzEG4?QbEh2qL_IPE13hs!a)Li@$3tuEaziNU_?3_aep)WgpdQZ7QE|_iG%r zJbDl8WLQ&)Zh%!!EIT())#0a)RRpx+*VTSoP}_EQE(<WggCh^eLQqC8*12tKK^9GN zv|>mC3uz1;(oBF5$1tLVVj(xrL)INx6}6#zeNzjjWq5!8=baa`(hTPGBKW|qUjAu$ zE-%3nK!M&aJ**CgRF9yO=FaPv*)VJ|7rWIXkkR7rP>Y&H(83x!Jp0w`T5{z;_L5K& zM(yvgvLRq``OCL*gdT>UyCO-@`!T8*l8CXMD_fW{C(D=z#1ipvJnl1*yww(?5d~G< z^db5sqzffa6sK~H@iyvC)oVSY(pl)%vR{HEIeTF45MA}exJ{uzBvJG{x>4x&lONqQ zs%v@352<>0s>%hAiT(E38Bho;Ve6S)%!^|#6ghFYd<DFNDw<O!6FwmhAf#evS0N|m ziPy34s1n9WE6bU0(=zCvXLu+`Uqs>Vse8c1Lw^JFYWm$DUw?1oytC~7SRS37?lr%8 zlH=VrDWStQI8lv`m``k%?|rjONaVip3>9khEs<l0{zoDBBf8_#>NbZpwI~#H=xkv; zo&Il@<a$B3$Bglq)NwVqjEN#88<lq=HFS>dg^Q_TRc7{TP<ptxg3+U@zOI+5+SZ(I zQB~TfY~$6EE>*oK$181xIYO~?;h3r=$0(4e^9*^quXiP|)2I^G#6*EXaokh6Q(4S( z8uzp_S@=&!5w&KjI*VHb7aOwtP+IusLzY9n6#;Km;AkzWQ#X;OVU0&k4TDyLDq<XT z7W!PoZ#d5&H0){YlJPx<(}J5N<ihr>EoNO|9<>6l>&IMxqZ^eOvrG5cSa{qN6at!Y z>B=&4wX#0KI_7(Set4}~fcXxEW<mJ-1C)S}nm1=9gd1dBX_I31!~>jgBGK_MT_n8O z!f-F#`09rtRwedh7qfHI9=BhO*Gn_M<JY6$O}_exBPj+$YtbU((ffLzujY|!XB(5Y zyGgJ=u+f7F2W=P&9u@)(8Sg<=Dh=j=GB@h6!H)%}4$<sI6BjXYdUN3SjJidt<zW&j zF`8s(9=kajLfhh$U@T2)w_}yK_i56q-|WuoJ+ew|Oh)!OF_sMt`TRjbB#Cvuwws;h z4!JWA=U!N+kw2ZXhu(CZ3}+#U?##lZ-6uV~R4K%Nh=dqg+SfOAdk8Zh(CBB+>cyZ> zQoXL~lnD?(yon5OuS_}X6^gP56FhVDy>iIqIm~JinPf~#v^@KzHJTE+H9!#{s5vu| zh5rY-p89BxR_dSzw<`LqT29T1Lbo@zuro<AR5!aOTpv(vc<OWzLC&u6?gan{nVEmL z^Xp%lzDO7JP@)VnjJR_XddE}?ZdrLCvVaVo902I<hrcxaA0fV$UhyQm^@FYc_QgNR zmu~v_QR-yz*XO6cz9A~g`TwAV!5=w<tk|NC1e2zFBLLV9Nevyo`gjbws#661HF~n) zk8Xzqnilha?{MZ$X9T;4SNwiqiN-o6Yy0px-xLn(Vrtw>Ni$by7X@hl>bM^d+f09m zXz(bXTh^OQ_daBjz3j^Z7<#*(&#>#}^xfjyRj2b|)@X$oCmM6ZUn2c9<tI01?&xQN z&p4PEhzIUI$dcj1G#7dM4-a}EA`eYjjX}WvUx6i{zUM4v(Gn?zWuDS)oS#k)Z%sNy zIj%77ItJveLSdfiRm3n+!jKU;XlaJ0d&<RH;tvi9-0AckXn8nfBOe_gd)d@<m<6i! ze9wKz6TygdI-+dW&h+e~5Pu(4jHe$3$^{{$+~GvmB7scE-0DL$5-Afd>Q30uyRU=; zJL74{-@ACH*W>Ly6UXk>dAIol$Pm-z<$j|s!=k(<gQDmQy#e*8s*`vy7&Gh~BIRih zbDpv~B4vsdgHRU3)oI&QcDdTe0$K&MZT;b42{azYAI)=UUUZ*XI`Lr+0;T`<Ycch9 zCw`OL&FCeni&HsWFB-lF$Q)7WkJQ!)5>3On;<<&Hjq&9kDVBV~A#I+*>_NGN?B&$` z5Tz?IoRp1{Bn7EWRs6W7Y{|)i7<Yz$AjEEtD^6;4uN{J|zF^cLBMp)UHh|PsZhxu+ z_qO`ACCemMmpoOLe4-+G+kUmw!G4bAeb`WA5sA=Rb(Tc%XFF%|Nc6YgqEn8nwhc;q z$Pn+oysFwFvCvmefj3TDd7p7@lyDH51dl4NSB(EEy=-!xrU-*r|C#&@-;1OwSITit zab*>v`C<A3S$cEnkn=fI=LDUX>?KP0s@mjF<mva?*_Dc4%(-bG6M8l9`G%WN((nKF z`-YwV!}+b*OygI6vE+sA$LuR%S^KC4_3AP~)A|}9dt<~p&NRZ+Cc;jOzq|N1Up7nA z%hyRob?FEH%Q|}F)6t8Ot`mIEL*O=k>iMCpo?D?7OYmfLki+6QP5Q=_y!kA%`U8jf zXV18`;2FVq+XUi<d7ADztlbkjQ?+wkLJu-H28k1tv3KTH)bl;fnBfnP^vVfFhyN=- zq*0DAMlkv4_-omRqoN}QpAkqSb$mqh?sG?|I$4J?+Yr@V7gNYF#wn-#1E@8ML?G=2 z|LLn|^r6Up4R_s9IK1vS9r4e!fkd3c4LCeCNB-Gdk|vjGT+imW$ncVBHWI6*D>P}9 z?>2<~WK5!q=UU_I@V5umA;3kRYnIi$C1Ng)nHh0p&H97K5C_V<_itGhAC<UPu>y#r zXR$wmm!THXr{I9i+UH%YI{Phf_(Fw8gj`NmQS|_iO2R#a;59+3*|2m#U<RB=PJ3TV z#9q^028y0oXB+}pOJ&igul}Tn{VL6WyTP<C(!{*!r-N(4HO!f#wId!mzv7Z+c})<= znS#oJbLwBu%k^9yk7<A6d<cfUOF{fO>F<1r+<`EUh%-U$(^)Mf7fD*ifji7B`MLB( z-9HhD?Ml8PFnc;iz}4T_+Ux;VLa$4I6aG#x0IzWcs)Eb0^XD8PB>X^(aEY#N)YElB zs$cOv7iF{60we>u3=bqs!8w*5VG7i)uYxQ>46nW8c;}jNw%}K47gKO#sY1e16xaCu z^U)Pg(&448%vm9GUEThU3O3N!>5`vI?(7S&6&?GJ$bnfv5evuG#sP=$D+LqO+}(Wv zoWSoS-;?}K(qXU$S$20Hk-N6NI*$J{U0PJ`k{=mg@kkdicn)bY$r`ID&Ph#M^9zd^ zVIrhuT(IvjcL4AZf!H31gu%2@+bit|z#>1M#E;+}K!8<2q6p+uoZjN*hrC*c++dPO zcmk0KNNdg!(o{Whk<$GfC?-HCtV_zZGTCWx9MMP9<PgW#+-4E49-0=ttm+nh{Tp^0 zrCR%qy^OKsb%KcC)v8Y#vcH2B4K4xcd%_YU3u$Z*PSaHdbxU-?Dgls9!@i)jo4lTV z=NmeZ3IK}q-|)jITdVZ-fp8cSG@?@z);L8%%Ku*i?FGh?z+~G_cBBu{h`}@*eG|c_ zUG@nW@@LH}u5vq%`FZg@Cg#S&Pd(wgxc02J>Z?;UIH@3|Chym+)q8Zm8>wjT8*urG zW6l|mXq*lFL$lXQ8<CCZ`t(UAE>N4otHK%WE#kdeCg;=jp&*KDY&2_9$f<+DpkfT^ z9qBWff0P(E1`SZQqfD%dpUOZC8cWfvq!tM-7mF~%;PbWFp=3K(?7~mP6T>v33_<d3 z+WnTqL)PegllG2OzSc<9I;%2}Q<(=7&4BYD#zY<#2NH7f>I1>c?X0#CWwCE1#N=`C ztf7f~bdvBxg4KOms1~{7p%5Z~*-My-LFLx_KtPNkeShTm=OD)ZG8Ta!tBkC)eem`4 zTbNq1M)*Io#&wC#sGW-3No%SL^M%jIq5X{3hV<AN65<?=xDrQPoTJ2$cc^kay=Fw$ z5-({0IM64Z$~%>mx1U0l4%0+P^Q^8hA5JtExYLb(<Pfy`&jfDiu~ri@LM#>(q(i?q z3d~dtu8w=jF_Kz0uw|AyPTrgDf^;kZ4{luGHYXkiJThr=6oFPA#VfOCeF4}%GWm2E z^xX6`5fCP5dhINWD8v1~VU-Xw2567$wP(KtBTR%BJ4N}euKkErQo6r1Laf%d=IKBV zk5VAndFVdDg(*K^6+|RpvSfx#>??(uEF;!xy8Tif%XT=3@I~-qUyjQqN3zRhP8>7` zuR(H`h$VJZ(0u5t1m@ah=;v`5(FH&e4P0<S79c}W?O;Ia(?THt&L)#Lb!1{qrLjKw zEE61I-Xo%_17HfPJAvJtmV1542f@BvfV5z;zdbCZN`0$3Ob3M6{&c}CchvGxC(p0t z0f`L>kmPHyW4W*lLC6nzQ2C}I6O+3IEIjj!UA(gR?ex(Eecoq3om<Sb%-h6Q<`ksD z(@emUEEZRPZa?z#w`hbIE+`~SKYwv~Z>khbX$VjGtB$7O9lFdZ8Iec8#+A}&rNkYo zzr)<$AKWzlj3_U<$nBWaV(@@zG(tD7h2qC=iXTln*s|O%{O%JuDcRXcAwRXN?(+Bi zc(&^ZzVlT29wP1GP`V@AE%rhL3i}v#R=GQQi9NSNZNpk99!#tKCVxxF!dtFm_jUV@ zV_&Xb6jDgDEL?$&(VKs{QMFkZU=Gu`>KjF=ym?^+ix9(`m5xSarL#4emfJ)i8UTuu zcxA^TJ9>>#dGi9<_dlSqg|*QgQw)pX=xy&%yjI|v6eW{sQ8*EC+}8pvn&R9CtXxSW zsKWTkL1-|uPGUg;i>_>U##MqaG5iq+hI4<QR(G&CW!cFh=+q)Ap(ht2eC9A4BVaFi z+YpPOgGEHj-du>?rtaRU#R<ctLF2*h@V3DC9W2-jOg+xK7woHLP&pobyb()LA`+&R z#&PG~B=~7}d=3Q|YZ2oYCQb}^Hl<9Iw1!JSluUz5QX!QH{rNhqH$4f93-||mf6kK- zW3WGhbmeU1h=C-r3<=32u6`+H0o|S+Fw(fCBh4n=&?Q|k+hg>LGgU|%cS?O7X$?rT zT-v=x(hc`L@L9t<_+NVeggXy>b?;w?CZ~<3sg+c5L+Dgcm#%0xHI$@&N0{1VC`d9z z5{tCc_<(}=YmPAIL*2}M56a~?BW`Mc>HfOkd4AO2ZSt1%-zE8zvBp=twPJdqi}nYx z&}+AYr_w)q&eeFw>@G0BesRZ+iyfTtAgE}V@R5p=)EeTVfg^H&0x?oGP=&3>kS1fi zj$`sPK=4Uw?(t7mHakMm3{J_n=Fj=$J{lpGJ335z63y-H>>KLPo~94{z*4K1ezK}L zJ=8toPtv^<G^#7HcQHhUg*geHd!4n(?=D@Rt&SlFdV-s1N!9i_;q30^r!Z0ytbCpB zxuTEeBZt7(-H;{q(V)PFt#u2Yv&lK8{U*a*)l(JF#v#h{w_+ZuE?Y8aChTM448j*} zC2c=;3nEuk3-!j34DnI(XyMJ$CfJP$>PItnL?nRLeFW_5{FVGXa&j`q+@#3H!2~DD zL8wbil_nQ<PbK@_JL%x1;(&q}kc5FmO2Br|#iDhlGDcv25Pd0G!qL?`Y5vB;vF|)5 z(}uM!5U703T(<hCkW~Symnh3B1&R)I50&aiLB;&xlAn9W^>BJ+xS6F7qFvk`hQCyH z?7DEB8xzLjH$kK}KFOBZ_Vo8{M{qM(_6$K=U|vd-Pq%`bD?1j=;U`qJM?|@%@@7lT z3uxk*VZjcHZ50c#FnlGq<KO}0t`9F|^!KYb_LBy={UnLp&+jLSkh|bi%39@%v0}9# zviL14n4(>+WkBsD&WeJ9_G&Gm7&)Zt1&pHC+N+a8F_w_4=5E~7BdSt{_VM~jEy&bK z0j;+<>}i}z^Z>(|)ZF<z{dNnFPGRmYby_6+lyDlqY|dfn1!>lG`mmRwT^I^$lcgNP z$}Q(?%mNW89tq+6D9)OxxVz2L3|D%nxrgbra0-vE4c^THTQ2*gLcYW@+&PLohI3VH zMAY`^8GW}_jIb&#KGy8f@)G&>Fiu|$HU^mL?1sSdcCYR^HbFhdwb87qa|7@&5tNs> zc}=VeHw&ZN^B()mPIp-6NOPPJgHzK|lSAR8nBI3%3g}kDx;0<}B@pBmuQ#nc<A%+g z%dwp~zJ2+Bf|hWaHje(^d+hfJbhmI4=1@LM8%uxnI&Sl}v;pZ3tf9T-U;{&FGf<%) z4*|DooQG(AMkFt-f$vDC=*G?Zn_tt|Hj9taz$b;>DEU3{_5abhw$|{As#?rZo~%3l z5zi9s5|dCRe3vMNb@8QO8fn9l0zSj+2MUE_*tDd|OoNq8+WVyocMJ((*hl;5%vbfV za(lOz*1CyU^C`fjW+otFU&9AvbBul=n3w^m5Sb>!^q9N32*s7OCKX>CbWNAKFOk41 zf%a^cP}#?1klREn&Yfbd^uY_r4crK<(ZAa8ag3`1dN^G)o~2IM%3`(H7*2hOW7r$Z zcu<%p#)PzNImnj_d3l0Nxi%&w0ypksd{6m1{9hcxJY{SX*|PXe4;{0PN%#^wo<H6+ zHhL}}7pC2l?@c44Lv#k{Vz#1*<8=h!?}u2J@VJ2GptWxWkRiIZh`xJqX{;jKmtP?C zmBEdFC%%g~V@Ts9$2p|IzAcbSija`o1<(j~c;AFT<HzaO4m{kxfa5x7{!AagE71P_ z2xIh#4?g?sgA>ul2zG-hAC7g3=1iu_ZO4%<%UX!CD=M}?Arl)N(<AZ#m=HKdAzcNc zE2)Q-HJJ}5m_6Q+DcRxpr+7W4AXs+@Yj8L`uL`9vC34`NZ|1y;@8cu3y<mD_TSWZ# z75Rb!u})_;tSP9SAHG4rK%)R`t6lslH0X530zuum)-O#MVT^YdE;10+WX^r~;o_7; z-Yl1!`NWjs+Zgh&zf+a7Xw^Nd&2TsTqd(Na3;=&j2j4%t$`!)z%6|K;tD8&<Zaw>c zQ2FG857(!ti?tfLT%#>kr_?|EAlXlrf&FZ8{6-KkvO?XK3HRg+)~GD2(_Ix2WIjEZ zx%WOSqD;Hs*LY7vls!6Snl4_KrquOxl|{{@?5|CT*cLMT*7u*wLPUrI8Voa~;rDiS zUTdzL4h&tJs;++PhsxiJc(7QG2op*8C3C{zG8}V<6|9TA>?f<VPmg@fd{|wEu-s|Z z=6F>SiS*pOIqRB^te^OIVIYS1ViGqmbpBLqs$a0MsA%DWOSeb$%+3J~6_tIA5Wi}1 z6nXv>AFEGkx>ZK(6pPaUxWnd%!yo=B7RsCO3+`SrH)hHgurjDnUPq5|H|Hjm?aG1~ zJ((tAT^Vq!Z+2h0&N>^!I3{r~lDf~&*d!YHKY8ndI%R+Vcwo*}-JBJh^Ng=_Krv%0 z=c=>K-(y}pPfp)xp=ME%Cr{5mu?q(HO98B+CS+j)anwYV$fCBS>4T4!LZu)(A*Ljt zZ3lSGXYuP~x(E7nu4p9kKW-Rp8HBZ&okc9-oN|D!l=6ZrqjQBR2~{DwcbJdO5Xd`n ziv$1($&GrR=LeojITbY)F_E=d8`maaT(C7V8=N{DXE$LBWiB9-xO($k+zYz}PX{i2 zchl(=+Kl9zD<w7TwPefT9!OosqVAmp-(&djnvdW{gzr6`TVg1>hX5;5+E7yANMnif zWYLrNn4fl5dIjBTAMy|>g9dLUpDK)4x|C_8?(xVm4M|4sYoq0kRYFy#)9TXrwM&pW zY_J2is>jt<9F`Dj2ty7Ti(?5{P-@lzT*2d35N%A6zyNdvQ%E@}syI#xL1Fh;h}}LG zJfRh`c@DPT-xJ$%AbEsFV%c&Lx6TW7wxjWW0XM3TsvFV2C0^`oq1$lU==WC+p8Q>_ z6gnIRaWL7?Oyl!6b?UZ771Q@4jf4Ct%_!k0FXblbpJ$#Mc0a2+)Ka3ce_c84tZVVw zvn-<yv2FOQ=2+J85UE7%N%tgQhWh*j4A1zYhxjfbsYzo6;!m3zcMYn!@D}MVhU!mn z)CllAUFN5|B~f4c^Up%g9&-20bwtyP#V*+=gsFOG9a57L3q>b(F`Ov<AKwhsFb{Sx zDOQfA8qXmIq)S9i=ED;V)?*(=2h)~vQl+k#Mzkl4KnXD(8WpXZX-3STgUwF>(<I@- zHT%eo@$moqCG;r^9Nj126WxwvABOxmknefo>UFs(K6Dd&RPKZm_L3VC@NfFXX!5+H zUrU%ak%>8nG8r3VP%%kC<eNltcFj#@ub4^Lb@KRvy7b-843m@Xd{>H~)CWGpctj<A zKT$fYQ||JB2*FtfgD}}HaM|f%4DtDA^WzO17TKw851!1age$|CChq@{_Y{&m7ZksA z4ADf{xK55!PKT65Sh_zLLnK$R$6<{l1Rz7un6Rz#ElGhG%eg->?kCHRT&SVdTt4Ed zaBU9Ia3M=Shhp^!8Wv&~+J^!6F{Bmq)THQ<m*>&ujU17A8rAQDRW~-4Q2-@;XSQb} zk!0g)H^19Mddl<*f4W#SvjcmEk1$6;V7?dBb;AhTKuX?>F^GyUH8z22`BmIz&8gx& zt&yKMFO=a`ZI@-*eW>xq|G^})rk6H9Qg8@gMeVUWwkPywOmO?l(%k(#@l7)Zq%9=p z%!Z{WzrH;~I*Tj=R{rQDQljXd%#-z&XcZM6E<hXCVWDswB(Us=<&qG~3Q$})gsp2t z3t(RU_KnWuP9>~{EZ@b4aZLl6AE|82qiNPOD>s8A-vjI9Cd|8?xE}J$yaJgZ+=@e$ z(2$kK*0uj!0EOo2>oki?ijeT2ri7q^pWD}Ayd`ci-0i4<;uOJxi?e@`I#^ujid#Ac z+lhY9Zy1Pv!zm3zS?)+pH*=9AP~{`&@J1QN>C8lChvjGU%qFcpW1W3qx!7{RV{F$q zNrOT4p3;_NZ2jSzt8nX9uS<oOHfRAJQ4%EA6tQ)H!`PRmnaE5#m1YMU8ogVOe$n68 zm_Y};{|&Si7P7ywayh>7|FReBR*cNNx8}W>krg>BcFo*eb8}|b3Q*O&!*DY~z{L<h zK~|3H1scNE^{7Ld32z$91kPcs1IwOO1DJExRV~Db;&`H5o&sbaz^XhOp5Ded*Aw*k zmP7{t8xv|<496m#npBVaw<`!r*MC#%6%c)+hkw8~%72?uGmk(L1mUAhHT0pp5&i+z z{}r`~Zv*oktNy)Dr#_rhE+Jk*|LV-W`7{~KI=<3+?!$)DeiJi3GfaKt9X{dP<%Mb| z<n1R;jtUPDkYWPi{xBLXMqmw*Y{!Vv@i1Rop+-Z2(sLUc@iNl9kMK`cputdw{fDrR zNLf~ni<L<%`r!U|-4KN4(e7<}I*VSnC;T5oNQOU8IvmEv1X<RlK9&Ah&7oyKJ<{CV zdw@s(eqz6G-V2SM+y@@LHB?>8=^@OfVJwUc?KU)v6jgI-;0vbAyWy^hf{>Iqyydn3 zv^{%+IlkZi{(|Cuf*a`H6=OvA$;)BaAF#GV|9-*g#}IFIO1KyDp9l{shRJKD(L}Sy zd#A#gd(5~O-6A{1*R_gsdZG0oy4~b!7i6Yoh>mJ;sg_pqj8{bcbqmZ3+^J-Z$J&{B zhc1hHYfaZa<ic-}#;-WrQH#Esh-)Hy8lLM5lf75`aVWKT83#n18Rk?}`<o0YEKAb+ zF*z3^!;q|*Vl)e|Y<HNsC<-;1lY$#DY({a2$^cLfWpWUi80o>Up4$6q3q*3=EiJkg z7ujSMM->KCx~``)R(4vsOW;pp<08^klRO<tja>Rj&K!>mhK1w2;-@kZHwnan8p34d zRFQ0*l&}HyGkWdRypuk!NWj_RPM#ds;b$frfVQ}a=niqw(;HH0c0c&lWC%wo>n=6+ z4mRPKBt6Ux(huXgC`kU4X%Tze;vNlbKAox!{Xv$cjdJSbL|TrHP2R82nG{0`lWuMz zpK1t_Uk9o+Opv>;9<+vSrHKoVG5?E@8Lz29KhQ;t=8Q(<w9laqwt1EV>Nefa(EGHz ze$-<gjIgw1UB#)wfYiTJ*FqNch~bpQu|Vy1#PG-Ar*!s%8qIo*N#REQf&ViV%r@%; zmpF{VpRqe$Q<1G&E#JVAP)ejX&lc;zCT6b17Bb$@e4Ph)9UA{oa9{~SqQIi;cl8yB z7azHmnnn<aQG2`-k!H4ak1=xY6)(_i?^w#Eq6zOC#@kPyU}OanMx2Nv<sK<oYvX|% zC;Zvk07GXjP=wJ?l^6*~O=ARA)1*jPZl<Px>&uRH;?j1-yQ#w!PeQ{?r3_X7Mf7~! z^2T3mYVs0~?UTG_{in=gr-d>S*nkm`f-)~WNQg^+;J4hsYYh)DNOunS_!UA{b4b#_ zXZ#_Obt?BKc|*%ger=_RtuwBI{|3DKujnMQxwF3J2hHnOM7oHXpl`s&oRW3GM+6K* z{M?=`HU;)ZK?~GQQ|nmR7M{RrY*0mLTsPH$x{XCm{cJ8Q?KA$2-{j(=u1r^fK25T0 zXEXEc+pNXXxJ}sI+N<9)w3^-l*Ad6RDwFCmpK59S52HQxm$XOH#N^TDd&k^oghPZN zX0InlS&?&=#XHQ#<QML>K@K%}FcV0u2aH!S@^u5AHYBy;0MDxFPvUNj5lo*<8!zll zP>b_e*v}0jz(#o`?i_L#(#-Ei`BrG*>6Ux<-?Mns9P#VR`(OSw#yq<C9&=SYJ#~lp zdjH_Hg#8KE2KAmxX1tzX%^F?bS0<B+l-gR3=l*sWcmrp+jP@t**IUFh1EeRAX?Ve% zGNfYr^hSu0lGJ(Ic0n17?aOph+qPYhL-+I-t?GLpo+euM@cvx*a$|tw*zmhByUp7G znHaq=27*Bj+H?#n!b%FkTkl431`Xa8Bgo-d7)7hD{!0>jv>VIab5-Dc;He^{*k+6y zLt{o@OJ*AnH^Vj%49P<{1eWdTF#|+BLJ**dXg9D4+he;HL#+e_;LBaqw15BAdyMR^ zi^bcepi`Ppf&EenR;se?(ZE-zVXzjv;gr~fw={m?4jbs;@dQ>@U71Xf!0VOo10Ws- zJma@{p_bLvO4d^%B-kbltdS!1(l;F&VCw(`Wl(^CZdbVcVNU*uh>X1k3!DhdplB(n zVom84;|AcT#FimJ!ZW_w*e_*OfjVV(dWEK%X|Y4gC41|*S8&Ih<X3YAZ|+Xd;EKhI z0=_Q~THhA<eQx+z6XIkx{Jj9@n(?-_Ms+Ho56)^`qZW(TT)kOvA0ZWeD#`<4N1FUe z4aqnb?&W^krVBXMdn|*bDF0e=k~WrwAz@|iU9s7+jjv9`H3Fj3nQs+-`+DoGZ-o=b zZuI^8^L8XItgJpPuCs0!9tIj&2B{b26SHkrTxS_CtgKUEhKFI$?5ES2y!Eg-?WxCG zG<}1&POkGbD|fhwMb)Q0&8LHXepJBr*%47lR7CXll()9ke>X)Uk$lIHYG(!n)*TOw z2)HSX2#f@1yBgvrLoAu}86-T@8y-bXP-<$D%nS2|;i4$*X%j|%A#(RT?G;}i7EKO) z;{+8I?(rt;uF6UJVfuO!opgQr2l?9Q@CQK+?Vo&;%pu?C_)_%-DPIR_5;NqELi%uH za2cY4xCbJ~z*f>Zn8!t<k2cIILuzx>YoPhfCR;c!M~kz^4pWdZ)IuGbLDW%V;~1`X zcA$+DMH~kKohMQ_|LMOqcbB2QzV}4P#tr}Y_L9*WNWq0XEZ%jI7&j))c3ZDG6DMT4 z-UlCZED_uFmTcLmS=ugaYkkdG-&u2qMVQ>JrKsu`3lV|e>VcR2K@i^;m>Sjoon{PW zjNf*!NIo!jG+&U#ACIvJvk<IgrDpl?98dNB+Xjb8N3O3)`K@lX?%P|K!846QDc43L zg9+2`OALGsqBrhsrp-rG-sxGicblWJHLAWzCPWu9iFlnUejjmdfzd&rN?b6#&3!d* zGp5gae;JFz1FMa*##wyu|7e}1R`J1dH#=T?v>hPy;E+~G!GuBcdKLgR9EjiA!esbB z{?~|^{W3^^7F!9+(`@Y5e*lqll}0CFa+-0;Wj>s^3{=l<Ygfct>@5^s1smGiOvUZ$ z5Drn#4ts^fsA7;9_Bb3-4x^Da|7iE_M|DER^n};MH3Xs#kHnNzwk9dPz+u@8r`a>j zUh_*3X|SW4A^Trh)E|@clJskB-pK0!{`OS4k7;{h6q!Ue;N#1}Gbu|Kvn5R!Z(ioQ za~DUntwmm8_WJoHS*D?o{K(E%ZWm^5VZm^ptkaJ}LP#raid#ObaYwIH%OyN5*S)!x z9g{sjG10WVyD=x#0Q6zt07pQ$zbBh>lkg^05H$QtX`=iqI3V}CGRb%1zUuy|cWAlZ zPhXCDe+RJmy^sM-kU{Vc0XeSF@nWcEbPPEyj9ugQPT2l9th>dsdUqk?9beO2p^~r^ zoLFJy7Ura=Qbcw!CNKvT_4UM&w7op;Wh5*@-2h`W8j*Gvjd$Ef8-ZrsvFwUw@cXKy zC0HPQanNB#QtD>fXN#T^E5#5I)B!QaQVWY{X*wUPaJI0sDLVh<A$sWL{Af2rO~05u zFZ;!53MA`IqTJ=eU>+SUpL_xcD?~Z9TsL3j&%4q_9<PZhucf)Di*|0fIB@f|)oW>n zwliw6(-}5~W?a>RF3!*;7P_Q_&IS0t>Z&<`h^i|S0m9Q3(hY#q-@pZANz)CG8GY&( zwwtz37fQdQx6G!z7c!Re&YYVe@213N71VU9i%9jiZVo}1UHz$68md!5_ct#=ix`F~ zJTNbP6o%lmn!r4fSqJF{FV3r1IBhc0i%$QCK$Xik^9|vp+p*B4yE17u;PNY-Y02Yf z`EI#Ex&%^KR-uw1I0CL*4vo#R3O}U2j%^2pVPjeK_(x!<xL4pTw?L;wh?LA3xv)i~ zyd@JWrig4MClIqF{f6IpH9&Lf7B-iqp;fc<&%uDVP9qrq1dk;=cWY@+C76gkmgo^; zm>||7vfL|arn3J}GMelePnfcY1AWZEGx(@xT==_otP2PKyjo{rSb~Q4;*<#yuwEkQ z1fz?wxC{@K1OxQK<9BFRZ-FH@1gKkAX_t;?*l?B+X2rNHj4R$m6Su8^c!9+Cz+V%i z!kD(c7RI+8U{rnQ70##dbjl+cd8H-T9JFvBokVY*o=hbtrjoM)3gr-matgw>i6Bk^ z<u^P2L<y<X5)w#IPW2qDq!gP2Hf(!!JlV|~m3*D~{o>i<Ejm;YK=b)&%6fW(tVy>H zvEp<J3x(j!WoYA&BnN|g#l4Dq1y9WW?mh%xaKF3QvU_i?Gw%HBPoLfz5;|i-OODkj zrdvICuD~h*?QUrH`g?-{Rmzt||BS$uUl_kQ?MFT<9-#2lLFpi+Dh&Ng=J!-Ov5_`6 zG6yXiQs>bGpx=d4zo0W{hbZ8C@etVu4Rfb)DquK@(m@{OR1A7W21#lzlN$Fs2}sR6 zXgSD88(SEh<p13G`3jUy+vU@Oh-q{>{UwE;kO3lO7uo^Q@IPE>j6xBhd<CVec!a0Y z03ao&v2^@d3gYT}8AKl#zTuop^sZ)1jEYX=JPYE-U_@ZSS$1^VhAkLp;9nKZCCb8A zTMWrHwfr!30EMHQuvNofb@(62fMp?#n@ehtmXCI$xEbeA{E`T&`UfY)fp(f-6s0$8 z&ibptsw$_LN=k)QSl588gT$>l(f~~F76cpkSJ|AC(W+s1(|UVwA9N5{cbdI&fFaiu zpnD$S?kbqsU)qcUV&b*TX_3&w>YJh@opf^5O(T=KHcyn_Ig1XN06Ho^GK@s=66gSr zt*GIqcIitj_Ow1v-=nVCUK^v$9#GRPe9^MnZ{QQ<Az;f@OAm*Qm-6YT{&-Dz50Av9 z&<Q>HcvVwb&b5y5Suo(@V(EL{L+q<%u1k^BW&_l;+|vgV)><>jKgkQP@@5gaGGdJa z^fQ&c_cpy?$f_J;w{4W^T=+78x=V9AwL*(lKH*=5N3JPbrIF3`UXHw;sIJXj4fE7K z`WAzMuRh%XCjtc_rL`|@ynwg;z^Z!|*y!W_o{|ze$FRQLV8;c)4Ua`Z`4QF-XdExm zo}mE9gO7o^F9_D@2H*1Ws(<`KaGPK|d(^(V>*r8*83K#MtTDv3t*$fEjVSoJCD*$e z|NlyFE;;7H2V6JjMjDfWu2gG6j&gT5#y!MYV7;rWfXr@CtCivty;ih3JYo}-?#N;4 zsK><Z_IQxRQFdSemCez$>A1U5OuH}u3Lf*la#!6wepmg>1LwX)eDp*fI+=Hi48zHO zGe?GyW(7%jFa%K2jc4|p?w4F~LXP1H?Rk7qjv~URw<1U%)C1T8$#hk$C*RY*CYj^W zq8u3{_->iAtuBaQ$5MX26-A<f%t9orajtczxYBab%kLR{B#H*ETc(gY5V2@yCV!ur z^Oe&vkCVB!&7S^&-;qZ%>loI?ts&Tdk|ApJP$q7uR^&{{g*X#NN@59VGFv=&Mz{w1 zItHUa!_$$%XfJ7$aT<W=_o^^D_%XbY9dWUBvRv4s5oib$ayRrY5;w_Bj#w!##ox)@ z(n>C_q=I)dze)aSI90`+8HrC~3|4|UbusVg--!Xl&n8Rk0U6SD{7)r6nYq|3NxFaP zc#qU_FfY94e6&6Epyef_mX|_ItCf^DR<0?Kv#bBh;|Hx#B^T>>r13#c=&^is9oW9N zH}&p4US&W$OYHbM4h87A4w=nqmi=`DFNs)QYDLwg_+0Y1N+aH2=2r`!7+5EbuqGFe ztVooU^!iQc)}i>K6whFp3NLm!v~tRzD^6<JMITYXD=o66qf(QZs-OOIq8SMPcU%>g zul1Km(ub@3O!jogO|W#bZ`Vb?>-H_3EQ3@ayW$k1WK8|}T!<L5jrXdj9H$Bn=P;S$ zEFq24PS$}_4eO2vGrfAR`jIj7*iV0fJi{a4_LP_MuHWnkjq^p2beP{onv3FvsJ8i- z(9NQ?|I7N5&&*siQ|su~lf&B-v1^$Pu(uz1q)5aS3jD+sAlVZ>D<o)cM>K49Jf~SC zPib*^_$f>SXfKOTs`2_c5T^!GtK^l)j`alq`VWE@LyCKMk`a&%j;L_08XQUrXxn?_ zE1S?7ZC6rFW?8r85F^s4lNZUIPD)#(m01!6s|?)C)&dcF(A_S4)scs$97h$zif|0u z^>CFs!`{XGbFZoEi03V=QOA>Xg!Z<INH0aV&#Lq}LkIX#wSSJZJawiYGdf4`oH$hF zD%GKa+1KnY8Uo`U`o|a9xb1ox)h+wRv();6E9jX@Ut=hhv@@u_VAAcrO3$n*)^z5O zd7dZWxn431iSMo}b+HJ}2gyDHkcu#RCPhw@bWqMWC1Us?z`o*)ud=d{a+_zS&4>0@ zio%*C_$uV8wx}{jF}ThB9&(FiR8aR4-2S%6Gi!##!77&r@2AUSb}0wF{JLHYzaQWV zRhDC_1+lwiJP^4L)(fd(&Ln#*XRK3W=B5}dAe;fL0iUiCwq)>AQ@l~u{Nj#>6w~(% zJa+P?m9tPZq7w8x#p0Ajsyj$emQ3N^M}pWoV?yPBD-&$U3~BV)4R>yIFYWCS0+N(; z>uxDT^C}tYWs{BHgV`sbtoc4{fPb8TNQink_ia`}lsivWXj9UIG|~zw_>Z(QM?I!d z*TYeBnQYWdDo_G?Tu6eDRTx3g-D#yF*BR9MZ;*p6sTOJ8=a>pqoQ|91fJz~T4(IP= z2!T8QI_u6mPw|~~vcoC;Prwsck*1sPSNVrC`6mJ?JLEzbBTr+;h`a&L7GW%)6zuZ$ z7!IpG5MF&WfYu!v{~F1yHfZC@Z;@1I(KtzVhKn^A5)bpj$5LF+*SBY~ei)?(pHc_( zMi>}_LCcKjy{t6I-cOk}@IWYg2`|SCeLnuLDhVbgL1#)x)3v%HwvCy`wwbq$o5#0p zNJOunKqm9UKcL6=*ur+J2<}rUXX1{1Ea3~Ss*|eM2XU6B*PKL#<t^do-k<9o=@zKs zlPND5db-|I^Pk`N0MfX54Y=s`Q>%}49_s^~KT^hai(r7p8SC8IvT80E<AhEpxFSH} ztJV~q9RU!^qw%_uM37kbv4QfmcxF#SEU<5TPENW@d|it>{iL-h5T4ht;|7}UNrM-& zaet(M?|B@gw`XNV0E2#`gG~tYT>o9|77SHT$*PmKl5}jmq#O8XF5D0{DEkXk@EG*W zX0Z8gPgp_=d>*AgFX~mvR9Kr^;Kq_3`o~|T80MVo9CHtI)?hT$m1KQX0)RsmlP10W z{r$%tdl%){tX~;B2$%aRFD_j#`zM<~Z{QTC5$ZIb#+#qSD>MN&{2R_!R4aO8-~6Z* zbbd18NBog0uLC{$kjcQYmOk@@LHfl5Z6l2QHZCo$302EM8=~in-?O{+6?vHrER3eh z5!z60{k(Bj<i<tHtXa)C;%+yi#Ylso62mao13tr+ioA@uCzxGdfkjsY<uu+C8!oIY zw8_hp?E7K;fLoF`yEhK0q;L;1(8@M@S?3~r$p(F5T3QUF0-!<^xBe#&`fmEdndb;0 zdTn4)G#w_<0vqN9wc>JIpwb2TqXgx6K$F2JJ<J)v@Mf<>Ecqy_q|Tr)<X)JEGh-CL ziW=7!wLU$xTcL7!;Rd&x4jn}AOR9V+(f6ba!zz6?QGij`&Kuw!743wlkK{#v^vu3q z;L!$t<h2sH{t@d<%N&6{su{zuvofatL)kfK6j*6~{<~jcnAI9HMdNM}9G|~dl6&8S zX&DV4N9WBsJ}-}?o!Cb2e2_s%6UW1Ds3vz?*?O6?SI0g!EgVxeEv%8<nP^77b*2Oh z;zvu7Rxd20%kIyS7Uyog##I`Af)dH^jrZT5^E+4kFkM!F;#g-Tlo~849SJ_k&a|@9 z7h~kI6G@au?!o#B)E7T_RHz86FHM`@QID*?nDc$4^+lL`<V`N~o$2?MfRglZPG9Q9 zOuurG3-id~SnC>yh@J!?gq=^CLBK}@Ba~F>V-yJg$p@T$(@b<4<*w><qFm6LzKz@e z0VB)Zu4?c7SXH`Yph|(W<dXrzZ7pdupJ<nr%N<YJOr*;^WZjHFhf=ps2mkrPEZgiY zU+o_TIorWbiGdOZXkA9k=2xKHW4!Hcw3eh3aRf(aR-0vgC@DbSG|L8_GhgSs4{3y0 z-nc1vQNQmroz2D~aV~hHYttqzLJa+W7R@dOZ!kk*lz|9Q&-`V1KwF;?uHEEdy{zMz zv-ySox=4NwPjv1(%XjB~TEim3;--z10R0TGtqhb+0Xwu)7RQPUv0)@SOqR-)(lOAI zAoLYWKMbw5LQG<CW0`gX<C0n=XFCl2hssq!rKn7-`)^rQ@dKRhgEa0_mCo)tun@Ms z%A<U&S_Sek5cfZ^ZvHa+IpS~q>37ZYL0Z%oFL!G4)B-W_xE7z*b!>p;@I|Z~FNZI< zy8%sv`-MXJ0=0M3H&XO&s9auK#a>`PeTr;#+-|ZgiY&8~&F*_3g<vIJz63GEWt0UG zyB@X|Xc=+Qt*12VaqI`V(zu%Szx|JQ0|OsraoF5sbYC86X<^?dX67u*1oxGTxY*o7 z5xbPx#B-J2fnZ!YoE5PB#B&ra3ikav;E2aC;=rXvzlfL#fq^}K13e$#Kv{0#8GZ-5 z{oSQq{pp~moPZ?q%=jiCd8X-S1!^A!`+8^;Q;$uQ>p>k`Ce*9HRknief$!fd`TcuG z>7N}j5M@e-!yjwXZa+(;Bqj~xk5f^gW3g$xM<+RtoyP-_kT8TZ3`wnv;#r~ACh5a^ zTwzfhXS&y?UY=-sH)<Es_$48)^h+?C<csvsNn&W!SX?&mLvbsJ!kn<iQMlKIH0uB^ z;R6^QRAlxnt>eWtQdFc}AFe}KHIj3~Xd`ylfc1dAUvcrIh>l>pKjWp(%4T~T1pfK- z7c<ye%$G+kEo4`<UE&))xOww~*?`K1>DFu$CH2^m!;#{Xku)Z!dZo|Yanz^_7&_I3 z-I(YP|JOP+T$E}ntx>9-3}da^|GG5#@{Of~b+$dZLcbPJq{R`+lX_i93+vpXsNk5= zB@9R;9JNx$FVukUxs2Ra)@BvfF_@=&zi?$rT?Go8;7yr<h$$m*gKnIIV-aJq#$&bd zwo#ee*t(-K-e#3VoNe3)!@-<k*KO=D6EnzTNNfWX5M`w=Zc$|b4}~)TT&Wk1$}@-F zbh{j3h5~Ay`Acg`iv;?rB41>6u!5v2K>`rW?@FM1@Ae$UWnV}9CP`+4A2loo#Xg<9 zn!zYM5KGJi981xh4xw8_mI+Jv19m9IHo6{^)%?y{yTSgmt~tbY==CSJZhh|>(hOx< z9}kL+eZm$FBIHvHM9f{%+EI>DMpb!kW{y`tX2@Zkr5q0~I9hbMST|IBxsLy?1Ue^h z<n0}(0Rl&h?)0K1f(%?o_9DnQy+TH7u_`>Epg9N%TL}2~2B=PUmP2+d#u_wzJOXut z6>#z_+6rMl5=Ln>7GN-HSu(MCkijAbd<8_JmfW2z{3KGA03BRPbmf%<wbe|CqM2@b zU8f&}*@j|OpOG!E{_`YPd=4Dt;|*-tB|V$vI|hOj^3_9C2e!r*KP;ZhM%jd#7@m6h zIv2`Z;KkBu`pLL3g115_mHb^j?;p3gnZI{20`~cg*Q)R6pcWfN>(}-TO4dRq6pV<u zngX#-rpFh<M$SKRmR#4ywhvyC@3Mgt7DYWA_|3KQsem1Xm5%XeNLKi`mACuEYX4Ox z@de!c<l=4cQg07|FxZ^8_HV`|VUCAFwqVyuu63NpqCCsmBVvmg!P83D-{y23CXq@L z-L^;EJwj7rlR)Co5*5cI^ip~7AwByAHjj>8J+c3?va2OT@hu^R<YaY|BH;TMoP+2$ zOz|oQUyDE6vv+vKuY7heM#?FsUo37e_Vvv0iL?q2A15TyTx5m=5-AM{=jOXl@X{uD zOi2N;wy=_3i?)?hqD(Cw*hwN5_Xj8Y&s;xIIx!u-45ozP|61YtTP)tO$?i#Jxfk{T zyRcv_>mb&?1IRVV26f?j4fa;7{YN2QDqP=k04HKXlK&qNbjLDugJ@@NTYTlh>|qxD z$^c`GeMtMs{}7TtNwr40?Vb)1ff=`nY~zRM3tx<Yj-Cs#VynIg(*8;9DzH-#$yUst zR7Z}YUq3fEg#kl8L1{MbO2I+tvyA~3>;XNmB@vdiA^*=@jflkgwdVbeL1Ku{-?(yd zYwL{qz0ZI-&R<Z4-%*YB6uf$u=ey}|_HTqVChr3Rj*eS7ka$R9c5i!_-iy*E8eDBW z556nJ3wHqRTaH%l6g9?fm|${kB251MT2$BFJhE4{82lkJTVsS$8X(T)8nFCs&m4lA z{WSaX#o4D@17Jcd|NQzItze1P2)A7YiipsfFJJJnCJh(sftgv;Z&<)5?jb{px8wgS zF5<AvpD=r$S)C!!(`>>$9X2vEGJ0O~ORAu$nci0T`rYiHY_A_%?}$rxP7TBXq_se3 zj@}EIqOsS@tIv|bqNp*L%z(|wBqU$wiEFa(3D!N62z})_Azrv!pz;$}7d{8lHiXy< zkFCzagTj>lBRH|}2nf-zH>m6z)VN!4h4*lgbLgLZH!-Po4XR9;cUzLzfIUOWFM05O zABI`h-Ys(^;*5jKO=l>kSa=7Xz;elxKL6dCfGsCHHq_s6qh}scu>Hs4Mcn-uSXL~0 zfX-;{R~-3VU$v4I5|AIy=csyl*liP;mbZ{Wos+f>>13dy^oYfUVeKW8TF@POvfio~ z=gkX+XEwSIN=%sQhO@2lq>Irw?4*(NJY*7E$M;ut9Igpy&ddTD^aX#-6d30t_TD-n zrD^FvyGbo#4a`yR$p_maYa0`o|AI~zGVTHV7q$<HR4uLSxJARJv6mMpi}s5fGA<bc z&{&Dp=Q9BgKzA%h6`cug0gQueYq~TsXa-T-8Q~GRBb!7kJJXF|SNJH3PvhZz`J_XK zn#TpZGiL|pUsuP+uO-*>g$kA2N8a7eQtG?wPy;SKY9FBjBV<@4x%&g06}}mOLdy{v zmJr&v_G-jFYoC;Xm~|)1CeH8Os{9A`y=h^LpRQjLh8<R-ultB8WDA1c1QWMpX#q=% zs>*MIypzI2BTyHhVH{@f-AV~1o1BmDIj{Sn=@_SFp|#iYM!x10?$H?;3PNkYlHbk* zjvN6YT0`xVF@i@ZCRneA5dv_CNf{BgPv9c3hU%4@g|Z$F0s^!O_26|Nh?S`byr{s2 z0f1?iiMSxJM$o?olMk@$B3apoEbKFtU-DXh`*^o6S%10p-vYen1I5T$Dft{C(<dKQ zveHPxe(_q;H2a83?v;!ov4fu8e)^o0@^C+{YrUm7E^M^y>^bRq3psZw{u?<-zGUET znUE&1uQ3aGvbloj8s76b+p9Y-ZoL0Vh#7uc{gqMe-66jMpYOi|!Cik~*9rFx^<zRt z<{{HQ+rGsM^3Kgud$b>GxD%KG`b+->xQG7jXq=;Or!BJ2SphNg-n|{94%wwbMh9Ft z=eD9T75nFpQ>I=m!}V@K(}5hT05WXI#9BqOpjT=k$i2k-vpu?hD9{z*!Ta*da`ChO zy!x9hx&as=*ck<Ota<Ds+wG#52!l_BMY~N)8=Qwjh?|uq79aGd8mbVY(4*u>m|a4A zVId9{-jMuatR&$(@b?kyj#va+S5`txvuIYDyu^)hp;oqf4<03azyHvO(TAod4ZT*M zg5w00&{TS{rHg*DSq5!>q?q0u_xE>U=>vdiKf#%55fDZhr%q8{P#SbC6Q$tzMwKyr z|25rhpvS97M@y+02)ljo0fF5&=&tMaY}7Z-51BiuN)=F_<Q|(&x>KsuCLLGae;5bU z83~Tfr4FET^y8+m;OZQA*)Qa|<Rmsbf+W<pq?t!7;RP6w*pZA#rFjqvYFpB?kyyeD zK*{eSw-LAibSaBP*bPISW0nn;?PD9VHgq1loqYq4krk9jMG+vyJpNsjqV$RkMU*Sb z7<4@oNq3YYxadPM9tZ7$kmPDPyw9QX$d*Y9yQHNh<l#Z|*@Mj8`lw?$qRP;7MAdk^ zMx}aMqDmf|c=@Yi*$LI@>D9FeXs>!{JwkWIAoH`LNnHr-e(BNeT0BzA<NlF)NQd0< zg}3Fo>+V}OS4eYm`xVu%zpAd>VCxTJZrrVD(QAglJ3IEqc)%VQ2RFyEfBQ|9@o{`* zsNyIz(<lPY3&r6w5tBDC!qILf;!MFh=?(b17fZY=llL01e&wg1#4a*s85=MmK?_@) zd}F50#0C>ji@1)|SN!Z%^S1W0NB>Ct<LJ}v1L;?1`L8ltB!)*~L7mOnb~o$6NVi_J z>!7)D;QyEBrO&(k|NbU(f48X69r<YZ-FFYrZCHi~HEbB{hKLDV%yA}qx1sawR>ate zHi}Hp^^-S(`&>>hz)T3VBgNnuX(BV}`pFwhY;jMBuV{-H9yU1)VTc|gVu8-Rnb1V} zb!@@)WsZYjmkhj#bVHZU44boY+Cr47PPwZ#`LgTb9k1xoe|nj`m<KX|7M4QI?cR=R zkCTR4aX2qQhyTQlLbk@`H47;s@JKR3btzeCMre-2RWwPZl<79Y6zU^Z1T0o4UHN|- z9ahowC3A7bLX9wu5<6z#8v>}9G4_&Loh~NXP)lV{?QMlY8jH{>p}0F9Uun%S79Jrf zxIzgP0F3++#q*?+?j#`lhr5ujN>;f|&#2)}zpQR%3I&yx3Cd<;Hfs(Y%>*1WY4R<> zsw6p*E@ru6A2p;1DsCgL)X@v%K-hq(#@!8v8-^spap|?a_OA8P^S2Wuv5lvedYuTx z?8E849#WW?_LAjpvZUz>jPA@Et0kzYsEqE!f&fhbz>&_fvQhy64M3cx<zbf6%=DbO zKz%{&ke2|CP#zWvC7~$Hl4hB-ggs%FATLRP7PGKp5KDPqfU#v{6Gi~6VP2Aj|9`Vh z%~h9Z^foOjUyv&fnrNR>1v<Wqgh_YK;kW{G0WbP{9?E;Eb>Z#1H4^tS#^03_J)}i> zeH;(%j`k&f{L%=J#ogu6#2dO6*)+9SB8~&*rD$A$KXa0Q4snl}nTX8f%|y)EQ9|S# z{|VFA&&EO6JT~}2+mArCBa=dsnN(Vk@LU}O8mx{9qcoW;V;0ha$)+Fwpx-EYee~(P z>ggNO_XU4Hz_AD5uUntJ*z6|L08&Z<Mwc&MFN?1mh7mIN9g3j7ovi!sje>;mZixLJ z33s%PY`)gkwJ9I)j9O;U(k!!fNViONVvj`5$Q24_AjyPqEZJ_bX-%z0w#5V-6`ZL; zsy<b;<+jDAH>zBXrX$+K$Y)kabpoic(9-;sh0<87tF2zj_f>NNpla$ONJ@@GVl+?@ zS_H9^`RV0lPh}D1u7XL{qy|ll<qhfix4C_ONIy&V3vxeF8t+gWOBdb*oEU~xn>I0p zySCJ|wU$v^cFC=6n<8D|_CU9xD{?r{-qqCf@5;(M%k%svC!@6F*W&E&_$8%ib}?o* z2s#@>8SEOHPRkO63B&Xl469+2T`-XujeV6$hayiI$jB20tZbnNaxdZ?yUA<0Sj$K- zgCI&(>FLRQYbH62P;!Q_x0({HDq$$otpo_O@PY?jJq-m!f7p?LU}E_wyikn?FHA3> zA7f)kf<r2a97<1r;36fT?i8hi)dFoinN!17{<KnN^zVS*10PNh^@%nzkNuML=+Bvg z+KfB=k;Z{jd0k+s`59iQ90LM7W-CI-IGydZq22~Ni<jIEr-H`8Jo~si%hZJlAN<~D zS=Di3BYRGfEw{x>#g&HrAu8-zOaFTwe(@sJ_1Zd&_?SODR(;3DI&tXnSeG}dRDu%P z+<k7YVEms_(uA+)9%sVts5^+G1NlD0rKOhB9Z^CnOpGGZjOT1C7My%2LZLJ1l;<B$ z==A#WK}Qv<kMV+For-y`_5mumd3PSW+_lgGkv`RiuocoSK3f`__8cl7E%QMC263lG zfzTUx2VJDG!WcpUPXiw*q|ppFo%h4R-p(7c7T(h0TQgW0B@Te#(Zf)NUJ3_)y8iFj zYD}M*y>Wi!6)_IL77s`Zqf^0~()M}I9SVp?j9(B>fHIm$ky3egY-0>AEHW5i^Pz+} z@e|?cA;7UQa@2bWl=FTNrwQJ=v_NE>J`oz?M*7LxCV3S-7>42V(BX%c@{%JXy6c*- z4U%H|&<Me*b}2IG2qx)8z}7_~_e8YV;a8NcW#wEwKv#0y!F~@7z;y-y1EC@0C=p=@ z)!r-EQ`N3&@9cc{Tdop3uw+eNcv}ZQ;?C7j?(C$ISccZkmVGO=$eNfO8%Q`Dq`HRz z^`v-Ztsg$sn)St3$)1yh;Kuwg7tqGg{711(W{k(7<y>$9=O}_PdwC)DqJyPSqxn8s zud#f>`u=MeT~j|~^K>;?qHo^(+ENgj>uW%3jGer?CjBuwVImyryEmrJkEYN3G3L%y znwg7;a7#RuTRI;0@MQIm=-vaIdt6b&<32ELFtdD}p)Cjq&1b7Bb9g0)339f-poW-H zvklI0usR)G_~Fu>`D?ZXh#MOcu;L@X+dcKh-t9oP>;(7J*p_`<FeszgtOL{jj$_WL zPTJB$c`10wn<!@1nC7A^K+NoT`tgY^9sS;<#|LIo--mj_hEm_b#cBE437TOg7BGQf zVb9F>v<Yo~+Tw$>QuW87sEL6v4058y?z1B35{Ka<tm%O#33F2TsEplV87BhdI&mK{ zQoJDXOb(qX8-CiKvLDV3t4?EHli{ENXiP0b4)%dRW$sT1&k~1z{a8Ie+uw7RxV4PS z=Jx^RUBIy{#)RV#gbxX9_bdK~gs@jmOi>$9bloXZjXc8vtSbm4bdEKE*o7IoGt}IZ zhtc+g`RC_bg11^MEOmNl42ysB7o;r4IVPnB)><xfwN(XyNv1Dy`im^ISggG59CrF& zwkPhfjlW7K0^dS>68yMU1mH_F5O6C9O0HqplHHUm$t!x2$P$PSIhjZ!s8LpD6vaT5 zSZ-nZIR9W^%<mW!n}j(8>BAG>V@Ei7`AQ~iFIpFh`d(s;0Xh%{Ez>ZQ2X|adWnULl z{5DyXM1+kuHmuql0PqrqNI7n7W=7_+Phhz5#vfcTDVS^<_&N3D7h(KwnXDn*)!2UU zWMi8xp*|G>xygYJ2=v{5eU8u3ZbLA4zND<$!r4Tvy#9P2<G$t53qtwI?)t+oTO&q6 zyGP(HI{M-A8qoc1)MnlUuYQOV#@q_TzkkiPp|_Q=^V@A;jj-C`8`h=mSy;3D0!sfn za7N%0cVf-XL+q)QSEkXqzwZeH`8BSbg?XFNyDST+zd?*$OsvDb6}KE?RS|i6Vvqj? z-E@7~!Up}V->VweCDx>Hv+8MXF%G5G8HyCzxwwVjt*G~<s;n|)(0fqKn3pKX)alv@ zdiXq>gV(?(KtJYnC3okIB_|Z~=UG>zmm$REh4f@`Q)&{|HCFw8i|^Q8=@#MrrDAqI zT3&rgCdIf)*5Ne9e#c^5@Gf7+KJ=mmHneyy9Xl*rc0=c9y$CQpv3^aj9LVWIUPz*f z!)fXZaV~}OHA=Myr@i2%@gy!gS32~ZLC7ViKaQTy-7k_FY*@Zj6lQFY5SRIXSba}u z{k!#Gn-@xTtjeNJ8;3WV!JQABYF>;Hn*VSbJ`K0>{*|~iSA+XcL&vGxo{A<{Q5<}F zt(VF6B=UApm%bI9cYR_zWWx`T35SQ86wN@7nUj_n)j@ScC8lv^X9%8yH?{7hlaP@W zMutI;+Pv}#*#v>}ONWt_w|cw2{m=_wetOE;%~zbc;eh5q&o1^=i1W*SO$qtTe{;0A zvu-a?A6QbSB^FO^`SqCf<ZyB*-Y~zl^+&0_Q4z^W+E94olKzHDq8Vj1sa@EYc{NAo ztWKvLw)5gRli)<RT6l}%B70A$UVp7FYw$jpJR<O}$Pw3;`HZ-gZj?rqpXz&aniA+% z^h}JKQ`RZpR+x1MnF8(f{kPPjhe)AZFXu}*1lvKzL4KT%*b9F|%w_jA1v&a;S!C%$ zugY$Gg%lL06Aw}e9F{NF>l!HfvN-<1GCw8M%L@?pma)ye9bz||+qmxw&whT4bVOdL z@e=#Q^WK_pt>iw+R>3^C%Cuplqf$X%`tZ2GAb1~ItccA8@jlwXMXyLgzpz_ej%AW- zjUEM4<JAiOaO4Y2p)@s!Y@|=)4_l>g6>oS^R+yJrGYwxXyRSp+fR<(hdRw!Euc{nw z&x9*v&QN3n&=gBQhuK_vOp#YC-*S}VSW}n4*UXeBGbPPmN*CD@%3cO5G*^BYj16yC zky@kfYYKE6@~la<Hn_J-^PJ(agFjr+C_G*kkmBZ8<hU|04|Y{O4C-^>?=(M}Wu)t@ z#2+xme=jjmb#}*Sn;9R!_2Hd5c?DrWO7^o6rqmwRt?|>1)ZQGciB_3nO%ShRtg%n$ zx90noa#@+$C?U#D6%3>RV9O(v+8JRahomNuK#AW;u4q>l&uLp&`qlQ*g>7?+!Jo#$ z1E=3~P>$h-doLHeH%F9wt;oPOQr6L9f3nm_Gx$3rGxe>lsZ}nif4TxYfvZK0?l4i= zm+Dg0cQ2?l84;r3Gy>G9E`bnLv8Ut(npVb5WraK>zUZSpG_NQSt(mki4<fQ#NmkN} zV83SA4N^+MvtO4l@UoOry%%4HZ+LETuc@#o3S4Vy04N1Y6vVdLOnGf7nO22nr1vRv z70DC4SM(eQCJK#BmX<O}hEZO?-h6Kce_=B6f=GWbsHh*|ed+#rT>PDi?EDFn@5>nZ znXKfJA0@Ltj~4<+@0oGQ4wOG{>aOs=!Bx0M#MYv<D&jt(Qt|*l(?5kqq+5OUoW(S2 zA(56+aT@rYh4~<-Vjq0JFfvO?Sakk7R7kTj`QH!<gk-|)*_~AfA65$!aj?2Z4G;$! ziMMAnyC5er*J6>(nzFg}vQTxDgD-@W*8@o|>P=v0!!H&WfIpH$Xk)aH<n|h;sj)=o zveX>zPu{eYf&Bc?c%k!)-0y<D2+Mks5w|hv1Wg(`BE8|B^ufxdO9$Nb2jlnZCXuVX z7yn{G!*JQjnWx=cmmJZigcmvoZjEHB7jPkQY3~hGm+VZ0S8#V_IhYVe_#!MO{PMx5 zy2%Ju0o<d+ntAMwkdD)(A)_w2f)aZm;`I5?tXyScp*g@`leTWcYJ$PdV`TrVbHu`? z5?!P1vri7jbZ_$U*|Y`Iq{Qf~vl~5u47&K->+H~Q|K4|-{lod~@cLYuK4vv*u59!x zbm1b^@;{=z0O)WyIr_!_;xf&FoKAEC?&S0#nQ{LuC?kiTUJsYj6o%97k=6_Kp~!|& zGQ48(iWM~{Oy1EDH9vZOBy=RryZNV3C#fl=qIci_IdJjhIJ=hZ_RZ`kguVb?l-ZvV zp|n6~;q0j=X&q0d9^hRoj??%)khDNh$}m?rC2>E??Liv47Dejf@yye1a<oV56`ElV z;C7U^y@PumFC$dzRZ>O{JI&#1GV5o0%I|n2L-!R|Q*A1?%`0Nad)2CfNSpRm%yp~M zUx<lH!Z|k~zlGEwpzAh$E5UCEuE*P=8U5KUi&Z(^5le-&&K#7HaRrGKxVI12O0IxF zl+0{JXOYB7Dikx)Yfg0Ry$BC3zjs40w!B(B%Z9+Byz*3ed~QnQpO8w~yD~c@M&u-{ zT2-W4bD`m?h&7wp#)o5>cze~V&HxG~3-=d#6p1L)2^ki)VShUjiPxR3N{sdXlC_eX zcI6Zs!DHiv(iXh%-wUjb_c_iEp-6OO7R!9CLCif&z9+1ZE&#iKTE0Rv9gYvUt@}}S z|Ca9RN#Vy<>rT!5yWLJ7!(OfaXi^0a!JaA{BKfu=LRtLqz-zR7nMRrw(k6~KK75A6 zGF;{9<#WRZ*0!tgk!K0vET3DR4myI`^k8nDG05i&l5Q$^-TR$jN9mF!(;mum%Yobo z+3$XAjgxYgl`UCPM|(-SaWixhrS!nuzX?bZHaD~cZVv!q%$>8&FeGo9q>LzZ0inM> zUcx{h1SrxkM_?>B*twqgW2p(U9uG+B(Xpuls&i>kTpBAunPLx+aoORHi~Y2ES&>%O zpo9fGQqZY-+N2w5L}W}PXO)xT(fEu%+^TKwebiLre~Lcc&9q5v<yLj40Mifd{aO}o z04y&4sBKW<pK@E>Y_GNz6s-Ke+VUnCGEUsDt;I#l+N1v3{Fi7v`Lh*{eZ-Mq_a_;t z<A^aQW@QWxqqt`D4c7QHDl9f1iRgfXyFUUJC;W8Ga;qH;a~c+G1|1$^su37l+@!Ld z!P%A`o#}Z$HW0BQD2nvM@D(o~HF0Kl%;uQ<b*K)k$}_lGdf@0kcRf{ly_W^f2iU{b zKfiz7L}cpagJaZ~ysfIOr7_fZ2A9vDKPPV1%q_99$|iuh6nHi35hre6MQX-BKdxVp zm2u6)$L;FmbL-W}Pd;nG`XB$vNUhix$Ek9eGc8u=Fz$$*HsM@aIA*6`HRSMtP%qA^ zUO&Y_h1+V3;CA}ZS6xkRnCGxzEXQ*y%xCn7(rkn6i5auE3E7^HC@I$uldZ<im0ACB z0{M>wF*^A+$Uz9BM^3deLy&YZ|9VpBbp_@y@av#5#uuFAW}UTls~p0+@j|}d4&nW@ z9vV@WCxbp_*`Gt*{`Opy3Me+^BuUsq;<R+9sqUA{R6#DDwknCI-%cU}Q0CjG6AdPJ z7xr`H&f%CYgA{5BAIWz-@t*kKA`%SbKy`Cma-25mdW7`3Q3Df_)Ln@ybj@>zNnrbi zZ(qN$bGUCs1QSL8HK-f;dDy)*GRg1V5RzB(;a~4Q8(JZHq|8dD#lCMKGBvwb^bPOa zCuAo7`~+T?l+@!LxDx-79j#+>`kf@+A#!RK7Z1%OnYpqCvYP9d%=e3c9(HZ4nU3N@ z56xT2gJi;u4?scFqs*b7;>JrjqRGpx6GicZ5Bg)^LlYO+&<j=@4b4wX#SlPNdFQ0s zhF>e90^;NjUL|R+wjETA=;h?i$uj=ow(>m}X7;?L_&oCScsP5mQRbCpW(wx|)*6`F z#)O#o_z_ewlyt@`e~`cHi6(g@)=Vd{);G7HB1~32hL=^sV`R^bUJ?gqZy4s|RH@Hu z&BwK^^8~+<ufBe=%Jeor+j^e^NIGtoF#t>|w1GmFC#(aJZk?-mna57m>(6Oog-oV+ zdv7cTcQotHYBB$<TP#jl^soq)>+fL3jZ1jzmMTv7?SDOP^v3n+=4nZjo0Ma%t+jOB zQwK4sTrOu9Y4L5&W>u_H!QUj)kCX8eK7t$0{4|d0ogU0r(r!SSot^9T6S<b&ja0%c z%$UqPQmMLAe_OqFzQ<^Eobr@5!aA1c8o^uDQ>bd@_74-!Z86$WjX%qU!a(!kz1P@= zE$Vs1okYY%GB77HE>_e;8oV+mi%|^K7PC5b<e`>MALB9iRkkgs+}dV;OlqJqK*Ot2 zn=-l)-P~+e{34J_61JXXi_{HEE4Trn2B!nnUF{|D?nsWXKg!EHvh#fCvX}94GTx>% z(yzykVXM)mkv1t>t~%#(Vm2;ZC*||ca(lg#^VQy4n-$wDNjlllMDq`~SVUOxvN$X^ z+|~2S5n*`i2Xo@+C<&)%Wv5VVHAa?tkEEHz$<}z5(q-9Os)M(_JMz6VO@Q<Bg5&g} zlk71ec(_coLha;Q(I)vwLcpl1DP+f^FwR45^DdIuQ^K9N3$tpN7`Iud+k%+~J6sHR zz=k}i-nm8DA+a5cj9*amgf%u+B<$a}agC#*t(!HHguOS|9;@fAGk0~-h-h%nAdM3i z_g>P$J?5-Yu<B9WXqMR&8&kzsP(|QDGg%O{VVayj$+dB-MO<#);ZVb38F*CcmL99a z7pv*V7ez?G8@BnRJhs%QbIqw&7JI?O;h6tThvNcyrIpgNV!HnOtch@TF$QY?0s4Hy zs;({YW1iAUtKKkqpS(`q*RJbkeT~^V3=FF#T3_PA1p#<qfEt4J_I;}_xbzb**SSxz z<`FbgmS*)ppPA^E0R>rKo!GX_;=34*fgh&l2(Pa%m?;?Rxj3N+yP6UMgzUYZZ7FeC zcM$!xTV-WOkD6q?wE=>qk|NyNE1L!RO3`V}EFwv?yp~-DG5UC_BZMi7kwQ5cKY+e9 zAoGRnvLhfiVD`Oj4%lRSmTbr!6GKj?qdB@nY47<Wt`DTW1<KJ(Ni*`8u~no^vrs=N zm$doWA#10uR=0#&dRoO@t@<sW0Q#8Z(=GbqPI29!G`(X|(t8^cSZrx3H~(U8Y?^8A z+>SJXPONCKQa!o3I<r|^>Cys*0YR*!T3jT`QEMm=ExLn#|5EOe<A%K-8g?tS+oE~V z#ud_nvYr!9cdd;UTWTL)(vzslt?oVY{;u3+fDFWZ(O2E^8S<NRcfEh4*Il7X>{)U+ zPiD+p+x7H`o-&=ZcAqE`@6;-HTGra;n$mhJXo0S*W9}UP?%dq0E$OCGti-=F3w7d! zBpZjbMx9-wRtKaODwvrP6%6Qx9a*<`>vNb}J7bUU^8yN%6JC0o%WY5FoLu^~G*K@T z_Sf3t(qyx2-0`=61P9223q?n2ZJbF~W{a~2h6Ykxx#hLs{U*p)f_rVJAwh<7RBGvq z{!9=x)!V1Y^{N1}S|1RG^wJ>D@eKI^?qx?^B-|Dr0wdW)6A4iC(XHRETLfVQHC%Zu z>6#K4g}1y1#$H?O^QrJVkx~6W-38^EH0>Jgj{)xdclYp`Qu?d^#FEJ}@xJ;<fR`VQ z%_>?hsZg4hkK?r_&CB@P6mh4%+1RXiy76@Vi>K%wu7~L{Fb0m{WQO)6?^Gu;*xr9B zSuWugIEK2TJ)h_z);hr0U=-vFIw=JEH@N-<R72W1-k6P<gX55Ox$}2WdYy>BInQO` z$2JE=fK>a~FYI$1Uq|AJ>5eN0#UyVopn;Q56wboI5wE||!dV#0xLdrB&O$)|M2LPv zLFSXcuvlx%qZs30Xu1V^*pyKFP@!3Wa!L|yarlgyZ@D^NR<?gi;Db`9JXVAEO%pPA zHj^%-9m0SXP(;T|#99tJgbK~zew)+i@yp_DQLaA>v<Kl`dz9v2@5Ran48Y#ok&!Re zWFWqp`v-QP=7)JN9sF{PjJEQ$lPTJ!J2&M#8yFcB!_d(*75oKkC5mBjZ%BI>q)Bm= z(q)%zGP255G_K9%6B7Xk2@i-awnv(X_}@WuMcdP~9B!X1U4x#*)XW<e&37_%)RUdd zQ!M5JouuaL_4vWH`{BWkXbnen5X3HJrDBcnp^ca^^N<KDwNrA8*s%1g&i;K0Hjcur zTU!Y8R9AEk$2{Rc`R2_u@4?}oJv1UNy?1Q$yiqW}hka*Y^+2$=SkYfrG}{b;m}m4$ zIOSRmxtzSi?}*k(^r*xwIaZIaQ{O(Erye$x=kA`0?%t8B9x*K%YFg=AExZN_Zssca z)ED(v-etzR*=}8X->~5&83u-pYgQ16oT`?ejn=$!Y`tWQvh@+kOqtE<(RyY|Zn;O< zeA85a*T-)wiyVV%-&T?|>?Ivr`pj&l(uCf>hM+QRFs0H}QR7!(iu)cs!C0rYl(;9c zPv$=xXwSDKjwTT!d>+g1(}q8A7C#82DhPEtqvW;xnNFtDKR*xjd39#qZ!FN$^;F+J z6bn^%?f7ke9U8#j%m+@UI5cd7;S&qkuj`18sVz%@H}>HBTF<oqrFS|?wob0{e%@Ja zOViTkrmq0bS>7PB=V#^R=uGKFR$eZ=^$j)RDdOzeP*GRdEyMoAF!%wtTfuIRMurV5 zC57IWzlUE!WC=c2-;<=usowhd2RmQTcUG8JVcGWEcD<`PcjpI>Z*^6ul6vY#^JRv- zwS2dKqgO9Eo4KTuRqT57ku|pTw6v||H-3=xlr4L5@|ryJFv10~VvECB!>tl3*v?<< zSCPeJ2@n}+0XvX;J$&?J*7e+hpWn%NJ>A>;9PG}w!pHZPdh>jW!mf$%!4oyIZe~~2 z_aT#XRx{rQsajR^*;MQQhxoEv{wyMKr4gUEMStNF0D7uB8j%`!F!N${V~neNU-?)| z4)htMc;~ZQRJ0RqCRuoSG_5Pw$~%o9$^B+m1E1#-oQ%0`+vCDD?#hM#DUI+J+sb`{ zkSxOjTNk$Op6k6@d=B41%lU7CO86R=v?XcA_mPtEaev*-FghZyaScB{9Z8~|>!zEe z<NQP15Unkb8M5${ml`uzEHve$^ezi$p<nV@fiB)`4!!Ee5yh5nI#KHn<B`Vwwt;I~ z+c?p*RtFeeMu7}AGr^bHhNy$~SoUcb50PRHq6%Iv<QtrX9q5}7HOqWFb5KE~y8GS^ zLJTT*it|*?S!Hs}&ADkU#<(p8;H`19FlIBZ+Ix(x01#bcjKyF8O3-flb3hQYI4|&D z9!x;<DL1NX;9Ib-CSUT2*BTulNpy~{?uz%%y@8f-1RL*sH1<1GMHkZ9b$DC$>%@dD z>*r!lzFq$c<`wOS!L0X<4Z@BOFm@3^(@?y3jnnyG)yN*tcRa~X=WEI1xo$Vix<5W{ zV&DB^QQ^9gHkn&#ofurLTUU2HO9|11BXkYEc2*=~&vX~k?8U#OimK&_w%ZlxwL2aH z*_t(8*Uf!1@RMki+b3X8BX6~UbrHowKRF2x%Ov3)<!RUbBTmoYaqd4yoPm#fC@=L> z`=&_}TRj<5BrUvf{=oCUPL`Eq?d>td(B+cDH^fSUW`6xAzm9ZW!XE#Ghu^6YgoEIy zJ&HGGLW~OSoWO|5RU}TXx=$cSU8_kI17$Vfk)D};gP+rTgd82$C-%jCLWtgHSPb7u z9MJgKZZBibm)r+#`Xj_B()?<6-X4!#s;06d5NPsesqyQC$7eKLiOLNQf@C1C1q<S2 z9^nEpLJzuVh0O!=Sf$cq#IDpZHCHf(fo%~WqzR>BD9AU-J{3{9^C|y}QG^-D$>(9- z4Ak!(^>(?b=F9x$<p`t7@T$=OTHzS2?<!$BZ{o;>;5?W-Zjb+GVpT}Xn=R--E1_aN zK2o#N;+-!>tA+@=`Z3Z(GgH##9nGsigM>Fj#URTkxXX{yC0+UFy?!*qi{<&D573+l z?#l`&n^^5SijeQ$N==FrEy(7B%Jk#W93&*kADiGN9>D;h6$xPL&wK9$+8>o{Rp^Ez zDCte_!d6EBS)Ctjrn9XSn{1wROWbG5@`ub5fRu9gvzYxrp=A*~;z0<sG`cBL`VK*C zxUZSqNa#;fHco0LH*CpJVyRE+^r26vae^>36GM`U+VhBRyEA6(6gx-EoQ@MnPLyDf zCL*x_5t;clL9Y5({CM*Q>EqDmWlx6n;ZH~-;UeI+A_IcW+}0tXNf9E>KM|uMZz4=| zqAJGI_`60DvLuO*METz^zuAKU;WN<Um$x}CL5e5ir3A{MIEp;nZ<x=7K#=<t^Q#cK zwuPnk5(0j*Zqc2J{0O_FtSsk~5Kf>Et+~YIAI*^v)<|+NLoLL%GZI8MhRbtFU_@b+ zXN|1L{m>XGXznlgg91}RW;?5}3GoU0a~k7~&nD7N#YrWKCekz#;`xMT)=w#{Dc%I% z7OxlHo6F{E=p1^s3)JJWd@=&0iAq!0!NI{eiJ#wQK^`fBGuU+cKNLJrSxOKL{iOj! ze=x!OvUgdSg~qBcM2J<%t~@o?P51_g`59oAoW>&VWk=cbYaT*T3C^s)q*#4nI&7=l zictSUrL*Zs5h?TPc^O89jbX9NHB9Ygy(-HGQLz--gwoG#M1Q#R`CX;dqYM<hYx71u zEitS=cnL8>&C6sF5+(?FKj8i<fSem?&7{b8h#pZ-B}7FSA<*xX1efHEt3HuFS#<-s zVN%Lm>tYld1omU0{9EWCy!9>gJBJ01TLMJls<v2l$es*766Ajap#(D20$VaV#hnKw ztitNo<nd!(<0I=*q)AGo^5uvAz%({)JNH07NJVbP?4G#WD$mM~Yblx0LO6vx^MDg4 zbYAb2ns<B)H4~qKV?T*wY4O8Kok}eENmxfO-t_lfv7VZ{O)`0bhZZ;J>guxg;x?Fg zB$tau`0~Rb`Q*J_nexEJ>!Lfw4fjhwhDe4$%6?4a0(H1<yw(Na0_LT_+J79xEqIA2 zj!~G}D`UYtRbIN9hHSwt%#mtR%xncW72mG-`%|<ZAzo@m7<Ib0&X<W~dPhuC{NY}^ z$EYwdEPlL}uDz0^wl=8gSQ=@9h7RFJSOZ%br1a`cACyINp;Z&>YqU<B!Wn%yWU6)r zkn#eL_*AJ)5P^aKGZbVm=HpP+!x}1w(mdQps%E(<15-+QPki4KddM;h($wI}5Dq8Z z+KWZJK-r(2YFRez9v$m3;wLJllZ?<YwAu%1X*w<bWH{2O9L6XRx~%269x)$Z^-I%1 z6{Rpv5Fp&@moC`BXBH0=1Sk$o6;Y3;>55m?gp|?0?aQ?+S4+>NHMx}@K6Lhpi};;j zhXya%)}!Qg=N;>0uw|mTCE~rl5S97k>g!+uAQY@}r+~E^_1BT<<ZGB&`&=R}xkI0i z6>^{vW4h_>r-FYV5WLxO^xxxs245AwWZ8dwElkaXUr)nPDu{g0rvF2Mg1*iO9_|Eq zk-i0<;6xAeavp>7crO3VL5uH8{_k`g`<0$Xf>abP$~7q_;yMml{SFWglu*krolQdt z*efH!Tt-XcQ7qHzx`lTe)esB$^DwWB7M8`9=812rh8a-Cm8}n&0MWUmzs#@l^VeO1 znrr|dGsDWUuL0J=?Asub8jeKOY})f~NZ`wFO@982>S~N1;_8ilM6O3Wm^@5}b@eh6 znS3obVR9W{#*tHW)@TnvNb4+U=s+vb{Ms(AA)<-v3lN+2gZTiou<+YsC)5&Y=@67} zq&P`~lB-;mdRmgU@s_6S``J5=GHX_SGKMBvQTslliuqC$R<V1GM#`vZucu<pwB+iz zI@0s`6geAwMLtjmJgv)`5N!tN&oky>i9UPoboJ==QpmYYCX)l8LC4YL06;*$zczXJ z&lV4ePt7xFcN}V`{dF+R1wSQ-p4duYTH!2y3760BB_1z_TZpI|T}R>d6K2nFa%0;~ zM)YvU!3*>Rc$^bF%o|UtV1Kg|)9(BjVPR)<y-WUl&0Syx&<p!e2vLvTl*=fo$`>1F zltiSdL@~pk$t~>axZ>$lh26mgf>!%yvuk33ZJ%;Zslipxey1wT;KY;mX?+dsY}?~z zo&q7)OuX7`ak3|eo6T@|*r31ZF5V*AEpIKbTCDCaS_*vWop<KYQXh0aqH`K1xDo`C z@5;<{5CjpKZsniN*9%?4VzDjfz_XP?+m?{Aty0aY0T48Z;W2t}S=HJ3sed4XZ*`yr zup|K=NleJsbP?ppL$0MB;w3~QLGl!AlRl~;5F*Y@l&yVw`371C)_?_&-x!h8t$N>O z$F>?Wd=sn4lLR0d1_&ryb(2EuOIE5udma+-x;rKoRJWAME_^hWlu$VtC?_h)oO#Jc zn}sE=6XwV&4VHqxZ9)##vYiuV<!&cf@`90R>jHRu3tYpoWfK;zd-$u*R4y}wO6B<? zAyu6f5DU>B=EhpCOy%1ts~nOYTwy3DtB?9vg%>}gh3KCA-^sIZc9_Swboa|NUmD(} zU~&0h=%`24nW#%|YSGS0c#*{5$X4c66L|T`{QGI#$dF+NhT$6i2wS!xL-=8z8Y9OZ zK4Irkes;^VI-mL5vMQ}UBkUrL%je!>mRw?%<SQ0IpOM4fQw+8%-p5*gC1Ej40=HJE zU-rU24^oj{6AmdQ>(WGrG+CsT`3(HZrW`Lg0{T<yh^*IJ+bTp-^)&*1`i@PuxM8QI zj`U09@Ogl8Ars0A{y-@w3wC1qb+tt1>#<9o-aTZxpBI9^2seSnoN#}xe|TegL@Uwj z+Ye`*ImA6QkcIE}?Il_xER8ly-<Nj9A=Vl!wk91yFzu^$f_$8<Q6!4B;qo_hc6Sbd zjovwS3_SOFMCX?Q>+p21AWBc4Dp$mj<M)y~>`ye+CKHxLroLJ;<Is?GM#&R9go|jV z7V=q*V)?7ER6v~~Q744^$*M`V7fz+8i&!tFyRG&oc|bk<fHj4<A;nu-L2igApWddK zVK4u8SCd5j<l+nsOh6VZIuJE=0?W|Lp^7!@4f7_BV{vyr9Tgt^^A2b>%AxeW=K;?P zCRlhIe>sMZbi1Myu}JCgZvsX2*H%;n{9hFiZF~pD(r&N+?e@L2&RUe$=3J=K>6^U$ ze#LFyy`MjIkrB;KgVg2gR8X$yn+guC?euj?hMk&`h;QaxP~}!?%;p-!t;Y80Xf$WN z?@z2+zEXzi8#_gfxp9mA@2}5oym5mD%PW_Qt`gnXt{%>vv(ju{nd8olRz}jabCkDw zriuRdr4<}l)mbCM?8vVCf{2qVtKKVp)St_Y-KMSmW!;5-bA#Q6Cp2ph-^ZWAa;t1d zY!l@swf_crY<ZVsOFE{P;q!+m%zxf1WD%+UiOX*thQPDFn`(;1GXD#tztGw}WdmTn zmJ{`>{y{;VTt4c-u^U95$+urBE=QzIE4=$@rvp%WDyJyPs<vPX-bN5e%y=Cl)0@6U zrm>(u$t_rNByFuI-E8Up#@HuY@_u_bV=$CwHzbajB;b<+=B^*rk<&5AzvAx<Ymb(Y zFN{b<-D^JX1SK~^kl_P&hJ((51*47wTG<>Qv^3L+G;gKrqJr}Lw|Jdt%%aCr>rH1T zv7F6iYw`mM(ctdsP8Lj3B2Gkfru#(o!1WNK)v>KVfvk)DPsmS!?>uYXImq6Sumohh z;s2x?Vi+scDp(g!`cHb&``@HCE2>m<z9%0ts&!>ivD@Tb*&B`3{rt;RfN%VfG%oKk z1A`7rW$z)$9M7>c2K+EfhR32M;F-y;jMC8g+02sXaH%W5i@_hKd_j;elpw;Uo7O`N zNg#u!F(3pMj1o8HPuN`<rb<~;!j)+!j;s({Hi4iP6q|Bjvo#NCiRMlQrCJkS0B9Hz zgbdzR4^lR?e|Dk`@Ka=*v}!#1=0*65vI`J)!B;}9jBn*QX%>c>R1G@F5vUe8*-k+` z?5u*_yk|fX#fkYu;$Mck#Fp$dO30livDKfHDb2D3qZomT!J?`vVWGxqDc8=yFKo@0 z;C{BxP_G>kT<hvg9CAKq0&tKQFn4YMC#vR{{^;B_*`5nJM^ewNS#vIRq;rAni#2n1 zr5&q@;@H34v|SrKv(v7Jbkjk9{>fO->&E}>H$Dor-P0mf+A!TdkR#qvr_<J5VcL`m z0pFq3)qeS9txoIU3lvHl^GcmoSLg6Sp(&4owkm1MW(R~KpKj5SELCjO%U#C>yyM4T zMqU3me54*=1nIwj?eqE{CSyPX3+!g`qLEp_iT#SNuPOHKQ*1pAoHtp$ghYBwGD_@c zH6{M}OH^f3%IIhc-upwl{`b+-D`lG8a?8}|(^Ho6T#any>CxZy_B-Bq`x`}G7cO}H zWvWL$d|}rY-cIt8X&B*`$}NRCIfa(;ld~Bby;suhLcRUPui4&sxK98GcbDP^@zP8) ziy&?vlai$!<1APV(F?yvy_;=mL2Z4m4&)ypJ8zZGs+?7;I~3egDFcVj1B=<9x?j7> zlkvX9D+LiBEuRHWU33{-ovXCuJPGqC)^hH_tZg0lXLSQ7AC<~|Py0x%v4sRnyI8wV zi4vFBdMQlLdvQ)BvNn(4%I3`iLoihE1`g|UI^vehe6{Ld?VmqO?qv329{(3SGij}v zgX)NK#+R-0)uHO`<61U_CDibd_#<)htHEocYlDwe>}N@CGd#O6Tw7w|Nl+rM#0W>x za<`vW-`KzW+_rgFKzmaYuU!utb2M!rWItRDoBX9bkm~C(0C>`KWu;F>hL3>U{gCJO z!&3^k`CqwgY#v9&xTrtR>-BGpbJ?mpcf=gj0I7|NT~5hc<CDkCZmrf=w;GrjfML^i zxhxUYTKioA&DvQxG7vv7QrU@<EG_4w2BW9i$-*gD#{vnXBo)g+lN5@o&bEOFrXr;l z!^X&Yy^o3+JeiVfzu{B^vxuYsW0)Dz(Y}*NA?J(89o8XtoP<~551pC#Lq=1iGWtUX z-oU}u@Y*2{^mkAX$8tL%0uWC4{Z7gol-HjcPU1|BS@`Qlk3rz_La%43_Ag^DGp~9q zEVtGb_^`5O*_i3hq}tl_sF=guuOz<Wu1_Cm4Un*RvLX!K)TMb*sZ?)%wYgnbHTg;B z%^T+sY&n1npSXm2qnFysVQ8k0z?tQFr+&Jb!6vfS^n;(eM4W3(C@1p?*tk#qF(Euq zJ7YzBW^^7;M>Lf?^>INN{IFmoIE<gMOk1?VyCj88P^F8A|ELb#v@m|f3~63@EFoCs zJf)4!lk(mC*HHDx_=xi51QY(`JCjUAZf!}5G%q@n6Q00e(&JB9sJANrYIy6y8u3mr z**E{^cNcoaE9bd{1-S$Sg}KZtvd2&wcL{=!`=_EPlTy*(qxq-~&v(yk4L@{TEL=bh z<`!PuB(D+gx)9#_aX7BQ#!FKdZM}l2{}KC4&8Kl|6P)$bWXiom-Mt_n`8JgSo2-B- zagPmn=DtFuV(ZvLrrS;LZeab*$YgN*jazC2FqiqDZS<}wk~)@Kd|VCwHxnWENeFo# z9L`Hw)SbgMq$ln;cl>%Il4y}Pi1*nUNKg#PP{7Ub?#`w^CDdvrxq^D#_rS+cYA@Cy zNCt9jokuLXe2fHwYp>6Q6tE|*EMUd3)aRh9Wgd;5n8_56Y-k9-rMk-OB`joRDUR=2 zvhimYH+GO{StxUH7=g21La$I$bxaOjd}!PqguK*bq6$4sz7(>RxGr9;K}S)5-P#oL zbf^le{(((2-h_cQX5k!yn#42Q`P;7}@R`;|HQlaJ1OQG)jGCx;$WdZWN3^Z$DWh>D z){4wxq8WhPu%JW|BNwR#2Me)MCh5y4qvZS2cRQP1?D?VzC;^^}dDt(da&Gx%#SCXe zP>mUZg$(kQ9-`tI+a?xL)W}YR44ji#s1ceEu>oZrC|F?rVj)JEofRE^YilrD*gO&> z0r3a`Ir7XgVw;7GAq^D9L48xRn~9D=oDzfLqnXN<9rD8Kt4f4{8$Y{dj@Fjoi_JbJ zhf@0A@Q(Vv*aDSUY!cnppr(vzh8vJqeCf~??71-s+dLT5bg5|^LEcxkxk@QIhPL4x z&qYll@b-VWOf;|uRSiH^IAqj=rUZcBHH%Vy1zfYn$%GYb$JN8#{5KT0Oa~)D6gM3R zhzJCsy*vm)+d#(Sq49Jkmbab_c9DV1pTd5{)p{O6+SPFoJAkz74qCwEgaZ_?28IZO zwsAW@MB<YOB!B87mP1KgcV?}tMsae7m<aDmHo|rZWb587DV2;O1Ti?eU4-)=U2zFY zI*gRiTQ|0zCC>_F?NJ{?m&kjb+g7;gSIw7CaSwcW1LuAD=2>8pm4fHa{qBu>``2|U z%JTBc^ll5bdEO&b@jdU7prm-!r_`!zOEL8aEBW|7xbpI`m!d>7;#y#2yHVt2oiag0 z=SPd+=0Sqq6aSDDze$s=3Q9(}1|l+T*a^4btD{;U{SMqRT9x`q6(5vT;(d=;H5k_- zj~Z@PrN=DrN~nxd)`=m|1ix7efM5TMK&=aP@rbsdiyOltEx5Z+Q*heCjK$)-XfK>( ziS)^2<GE%(s^97#XaJ3=ZQp<UoRVlfZ?&<Dn>iM+3x6(;=3c~UUWTT(zMv#}$G<(> zmev4vmG?9CRKMLgo?Y$}8OFw`a&H{v#oXQ!KUF_>w0k%hw!c1EZYR21vwdP0p7~is z5kgz~Sb68^xFvGY#<a~SO#V*MZWZo6*?K463oq^~^UC9iDe_&9t@ZkR0+Un;_WX8a z#P%8^)iOG_HNI%%#v(Zf#kWZ)yU8s#?LB{D_M7yPL65>yzm}N%<zu{qccJHae?D<x zZ}HY2pc*zaRaOx{bH?HB1LG~QZV{^&n<LsXPgHdLxZY~Syws2OtG)r=es7s?%i6_2 z6suUiz??;SLsf=rVFbc2hom>VVx|8~rn}UoGx5@gy;EjN)pS?HKhnu#r)hCJU@T7$ zL`spWn<I}@ApDx}#p{|IPbF4Uib>tXFTRI;zZg<CRv(UK_u2#QyIRP6&Mgj45E0d4 zl}1!Dhj-tGv6$;|N9-(ZAhKTE5hN@u)r667nS~}IjX)oJ#3Jp92NS{Cp$XNLV42Yb z?Cq`tp>now=USMvS2ilWX;#K-=rEtkAbm+Q*?U*i5aUKOp}&!O0s+dF2DIxb-lh<> zk1Q&|2}P=>bWoP60w?q<p~CNkho%{*ZnT60%O#_tXw2J4c}d71jYsQh6DJ}^k=DD9 zW?QC9p)7G6;FC;hf$06DIVN4Rm-(UWbce0shPd=<(LQ#0!tZ@d7DG|8h7@yr%DcvJ z?Z_73<#^qArrk3)!SL<=QD(A)L{#OD6?6sSa|yjV=|V+3^T9Wbwli}+>XS!sjg#oa zL;~m~%5NHJ&x;Pqs>ci02cpY$+_oK4y-`F{rRVVRow+KB@9Mc6BQ}PW?tu#NVXeG{ zftpt&Jdv1*)8k(z-lUfgIMBNY9Wozk7hg`xiRWHBM8Sz-8;<BUo!f&nSM-Ggy@JRU zQDhi-SvSq^6`9HCtJ5B20N|Ibg@%$P4_dcI100_I-kf(*ZpPLwvk4!f#M~b1GY23U zapA7zfK{c{&NxNN+Swb8Z;;x3U`V`&Sxad_yx$8c=Xa@x1}wna8{A@q1dA#5(&5{R zz}xv}*vd>Y@w#4-h%{4UQPevlUdG#`;h{cCM!oF?u)`>s_sSEJi<6V)N$z=XUJ1)0 z%+Mhdb3$-3BNU*t4YAD1ay^G>8PdLx05}n!FYVxK2;9$~r-^&Hbo%q>kOYmYqZ2s) z`*HvI;KSoEcGa2sBh%%7%8}30+n59uZSMOdm3~^MA$s9CpHBaYz_qR<J=8<uf?*}X z;8rY$(M2on1$(9V;|X?)m$pJGt<ZW|><MZ~rcy<Ng-xyoPOmIg4`A8X|6A(YzGR_| z(w*(yq9MOjY8?`FAHEZkSYLWNm!2YctyI1ed}#`F_2T`m+31*=EWIinH_lv|?bhgG z@MJs^`!}v|DdCThE}`*>9~}Sj|EuzuKQs8ANLOxT4Qam?@^@L>M-zqhR}&&#&uhK2 zvzNYqGxgW6-Alpg0Xatbn{m3voKK#1`dpv#espkk(^vQgzH@>#J{N?GzyI;0Q|mE) zwqo=Co;Kv=Z@)iPIz_=hEZSINmN-=Q?l=z2&h$rUE)?z4rk76;?AD*ySh~07p)Rj< z)!tIuid%_<A?KbtimJOuEwW7m2kTYDn>!72Zi29|K?irBV4q|bIyYfu<{#>||If>- zR<|{o9JHQQxAATN{5F}jCh08Ro|Y%trPd^PyWztG(1+c;U3|UmrWSj5Ohc#y7nxB* zH91Vw$SlEZY6-ufdffJPoi$4JL3PBz2qmpFfuE&Z;*v4~_g~3k*Cj!r@f=5BAhBvI z-7xh|g_Mz70(8u(;jl<y2+vj63G%Pmfk`Q9%U#4|I}7Ld2?mNGOvdda7YhzYd<d8g zUe$_Qx8%9uVl#%uqJ_6P3)e^A;BPRNd%AkVZrZKqdn`Sd{6;4b*ku1#CeiBsm1%Ra zbp1tXmHX8+b1XD8_b`9(Lf>SVh4}jalcd`<D4z=D9^8S?3ozhI*fB7Tg$BnMa`o<& zq~vPHb5?VD_PW6{??lXh=gi=`>~u4wn!s#UHHN9|I1lh~IEcSRgL|A_cMN9Iy|i&K z1N5{Vqe6wCA7pNDAVCjc|9w{y;cS7d#2|=4xvr<veU)>W1PGxLx9LbxwvL=z=WBG= zI-47lPoO`+zxkGhM5D+0&HH4t%@gIY{ue@#<=C`IizthmdNl3CWN-&dP=hK`E|*VQ zrT$XzEiJ88sY6)j^@fVNuLjFlp{yaUzSZDDZuyvqf0A8w@p|R4Mr_K}fVo@g4YOd+ zD8k2+8NSpX>H5QFjZ5fM5uzhgnN*~WbkeE$*8nb39-_xnd?p)3HZXqMSp4ZogD*KK zu#hb)mC}9nn@qkBWxP|EWZ#U%WQk9~BLI3F=5Nh6q2OqGqAy&1ti};MD-U=6DJD5W zzP)*G{^j{6{s1=|=-*{n^*%f^&m#oqR^0n2<q1AThtK^3B(RhC=9l@FkEa-wfE$nY zJ!DudfZ4wC9$*yfqj{bMiz%__EN8Su+U#P(7n&vAD8S#SHk2E^RP`i0c(Gsh@s}pK z5a0Gbd1@1G<FiP~$<^S^YSfV!judf?x1bG?C0JvSHDrirpU;+ZPN^R;N9Gk|EO_Ac z2_2q78W#d2nohs=SB97l#rZ;d<VBRCQEM>Ag$0%z4@MAaPP4A>{SR6?*eCb<*7^3= zm(g(L<bS2#N&lVP3`NK#YI2^`eeAwe&ti;-@1Ta)18#pdJcO3qKrZW%$Gh>GN&mI} zH);9rMV^H#1ch~c;!iS`iWR6LW2zskS?$r3;wPo?6cvhW?2^T>p6`oVkHsCS0XC2d zW+0oc=M{4L^LfuFkwb$aS+BLWMK5iAO)yW9g@@;!63S4dM(-J==rFgz=z)@KvJ5L@ zAnh0Fb>B@5eEPqhLcQc)-OpVz#YiHF*|jm4!Ad{>+=xj*PaBDH=j|PYY5DojKL0QI zxb!n79(fPY$(CSGZ_tu=>Am-+YkPYX>NCqS{>zm2%(9-5m#ax6-M=D7UPz@7t*v1L zC52i|i}%d3p4k`HYNfHX%0&wFYZ6Ch4$~E@^T+$s&p)UdE!IQP+j3}kt~bKe11)(G z$7DY$eo)?0+>*^4{0Ga1gj~Q%`D;z5psTrdBO~RXVRO_~8jy17XK+t&n+yfqWP_#q zxm+~krW!HL&dD$h(jO2BZ0f8!l2vu|l>$!O@~Q8v%A-2#`*e$EdU1(whD_7^lzXd< zWQf9V_+#!*r6oq=I(_|LCX~litMG)WnQ?QVOQAGpCuW-y^`=CV-W9U#{fO5#g=9=8 zPN${_(gCi)_e<RyQfkTU6|9@!%H!by2*H7x#3s>oWom2Va+6htF6S0ZOki({OG#ZM z9amEe1CC4FWsH6PXx*`h#SIXzbv?QUw3!uEewDAN@%WCZSNK{73D4g~5BzM!@8$LY z^aQ**1@zEsg#OxJ)-hgQ-I)ja`2>nz-8b|C<@jH@2va=AXJ>K$!c|Us_O04o$X|#O zQsi3Y<NijyUER@7Su_wqbd|@4!^FG{Usv}EpXaIEH{w410xl!<K4n+2R`W;Vx8FnK zKKm|ep%}g^eKT~Z8iWTCTP(f2t$dHjHNCo{<$f|R&g1H?SV#LRmvFEnQ61??%0t>u zsER3Z=h(nQyu`;t8Aq+K1IV;2@cOwel3YTiZuZ6W+dUTg9_|t;W3o}&#K_|FzmtvO zT-o>M7k~EEJ*^iEp+m<tH>}^f;oi0M+IazK72<p>f4zyRkE1aA>Xa|PEa3QVZOr!r zG(eCWP%#5|ex3r`e3_1NXJ9Qn{RH8Gpr}nfBT9Nl1pvI57vpu*3>9tB)A6K)u6EK> zz6VHy`B5;*2@F-juTimabGI7SW32FJl0yHw1yh>ZKQJb>(*QZEUf44H!|9{jCMQ|# zO0%q*zY|WoJ*54TuZgi&H)_sZ06aJv6N8I4N?*B2oN*N?|Eg%%SmalTZK+}Ltx4J% zpuX4X2gHumCz5PY!Y&W)0#&PqZRK`FtP&CJbtp!BgN=PsTRm}C#PB2z3Pk~@vkTM< zUE@Xe$W-S+g)dT37t)zeOnJ@*G-NoJ4c($sq5sArwBt?Gnq3u>7e=2UrujkFv35le z*hvbYOPO5Irsc!83e7d%+Dds_j2$H6R1&M_(#%1yM!3M{T1&Lb1TysXk&EI2D2$Pu zO~5Jci)%Ik?5U?yJR}+LH+hcnjjh)1Z3K$%@*e~~qJq%p2^my$ZC7r$!bcRg!yX{Z zLjo?+Ttm)ue9<CaLzeFs*T6HqjT}#Bg1LfH9M%rP$zpPi-A|l2rF|7g_`(z2#$2X! zNoGLv#6H4bt$NkiT0(q`RTR<oN9hhNV?}Z}<>lm*A|vx}A5t8=wxfn8#&*hsL5UP3 znLQZ!K~+^yybaW)$mxT00INmtLT+{xmSopfNVJEQU6e?P0Z4?KcN@5`7AKs~4}RjP z$JleQqAYC(cUj*g##Lon!(EE%Or@dq)a9hAXQd6&b~u^WVePoz<{bpHmIQU6HNnQF zrI}#W1x?X04@O*Vn?X&8BcsR@YP9&8&7v^PYFOKY&R+-Hi0g2M5)CQstr@Ib=bxgX zlP>XkJ4IAy7%m%&QA3b`VnYM+)Q`>-crG;`+i=fOa3yf|af-pRyjKSHOx2N6jcJPO z(!|elsl|8POjq`&5=)^vjcAK|*#ITHh?p_Ri6rUB{_5%n)k%+U+f(q@1cC-4%G%82 z+q*ks$OVU}kw)k*Fb(nG>*V#JJv?dwo0zfR-0sR^VX8Z!wgxg#Mu75X+M@r49b8SQ znm+~C*dGXf+Mgyn&YYni*5Nd)qtue>#i$8o+Cu<+V45k6K1L<dqlt)8^?wGlkdaW~ z4k<)>4NVjUwv4O$r#BrRs5d%y9p5xP(5N5nG}_RWI;YheC|=w2P!{Mj18S>3dzb*u zXoFoEddaJt{nqlWT{#DtBdQp=lCI~`Z56piduCW5qTYqP{NO=32J>Zou5e_;@z}25 z*H<3%0V#2(q&j(aR?fU(pzgy3lsM-<Z_rWE&}o=4%sy7V0GjQr_2g$6A(f-l-`|<v zeo21SdFAWiuE*YIaYzb&<XZvrL`kOqT<FL}|LA!>yWKKbGHGege%|vVc(>j+#2l== zDh3WForlDhv>Edj3)J?g@r^-#+WazonV?vP3y7J>42bM;usKq9Qj%)*%zWQx;2VP4 zMa*bT+VC*c2ySj>sSY0}L=D-nKSiQyvG?oeDVCMF-cpP~h^C&DYt?SrYNLpLy--Cd zVS1}h5cmro3k0WOOn~|5pPMLpE5rEPFB2$L^z{i$-`-@=Gp`t-XZ(rGX$0>yJ3t#Q z$dlz^dJAJ8$HDZ+`_tjCxKDhjbDrq2Vcp<0dx?(@#(HCew~|u&m$d!ikEgUrp7<dt zWFKrC>@Fmy;lJqArJ>vYa&ZBvXKI4G)lv`T4aHV;)iD!6(OVPi<@y}^JR<g{1e8o8 zM*qw%3iZwDQw|fKW2eKfDXz*E-dBK2$`>WJhs>JF1u-+>)UmcokZ8d9D}bt0Du>lP zEw6co$z7qs#vwuZ8d_Lqjk>uDsAMSkigHy5>J5sL#U#-Om^W$D-Ub7*Ub$8GtOlj& zt=oUADR%oYHg=p6Vt~90Mu1HcD4hgs6qJtAV&Bq0Y0$c{3F4jvRf}8%TQw&8s%lJ6 zplU2X6!M`^1-kPAs#thFKq*X{4^UmhkPlFyU;rYN%{Js(WMa-Bkp<4Gq6^Fmvls2Q z;9+Fc7l>y0la1Moef}XSb_8sLYP#3IUu<Q{@qk*685(sE?e{+{oozl25~YPm@QTYx zA2GihMc~=8Ck&4+b-vKdOvP9Wo2h+JE4&!1FIva4>$IiVG@<aIHmvzIpl2%WX9Gg9 zhOI|&B12dBL^wJ=k}(FeGj12M&6}hTvz1E4RhX3)?#Q@1fecQfBr5wJ8kN^PgHt57 zg#^&L7B|;)6QxkRZqYW{Mf14@2yHm!e}zO6z=HonNHL8N!*&%bnPula+~PbkQT31o z+q2J)Shx@b*N(i;52g=_|6v)#v~329;Pmx1(igdluy9R|<aO)j1_54iTig?wMn#Q3 zZ%ZO!h#xBKt;Dt|`;gFE+?G`UHn@w0N!4CLXr#E|Ahnin4F?O0s`IT4-=U-JOeZ}t zO||xrvs0n^BwdSb#WM;C!d*!swrmMnmVgFxoWMXUmws0Q$ub&FdC0s*bNke~sOgEN zbW%O{uL2AoPXii>*$v<fT<$EQ{Q(G>MYb^=GtJI>8ozMQjkkG<DkCpsFY^7X18VD7 zXwtil)#(t*#kg#CYm?p;dLgVh5<7loIA17zyzgZ{B&e>J#H7osMS_Cy+jAkhSKl!; zp72#*j0$D@va8mz2;RDmf%Z<gEnXV^P|)TCLm($x+yr+78<J^B*(KSU)>#mla(wvq zD=CCfpoJJixmPSErQ8tfHN9Xd7|S`lKSsp>R3O~7@rq3cezpTl_IiGmRu-?HUBJb0 z-;vgbV@7VamZuU6?rHv>25N7*dq4(|x+86eLE$lz?=SQd`3e2`Gd+?88#Mf(b<2nN zoDBvr;N&@MJl5aUKd{cmA|7*DIZSSU22XZ4<*>|C^;f#Bqt-=07`*;Tj%Hu)Esf9D znDG^fU*9-A$}KcnlA5aYlKje%W^}*DV%!tl1=-7XWX0>2M_C(u8xdJ|q4R*CU?yvh z7oR2jr;a>-k#wH=>=3uWdPg<vJ{Ff;0j2AkZG`Tw7HeR<nMQD#6K!3H{$pDzyyZN_ zk%~7MJt9K7P+3A@gz%h+dqW(<S-_jcx~D8{ggUy~52`XA27)q<7}v?Z!`I$@sS0=V zh{~iyJ4Ka}q$aX<Gwi;N*(1QX_-D%NC5L;_H$YlW;{mGaJ3#-zkg~>B!gMx+UJt_H z(0t6z6X6lP<(3{@Y5$)1H6$uAUazn|5T<^t3!~x*N+f8WP|ikfIqdPY4+U-gz5Mgq zesL@WNx;V{Pp%kUADs8(UOK3qnnZaXBR}q%P6*4&t*o(#Js`VAl2;}@czjBSs97T{ z|MCbkklZyfD!$nWyEo{eZ$(<jnsAobTl$V3Y*a;yuu2Do0XyDX7iY^hc;eek>Ew@b zVwlsay;|}F&Kb%}A8eeT<fOS`?QOYONLXjiHT+5gx?cV4jlcQuhUM8u)u9Vle$!v} z?WU@boQt-VZQ&BO_aARBuLMuXGW(N1M$1QKrYCM|`g-NUJ;wKLUA%qOWPM(){(eU& zQ2i4fJ9pG;Lj;M-3d=+U9$QjXG`DhD<xid4%e6LFs2E7d2YcZyvDwkdXwHR4U0bl_ znPZ$!$~{)Sa#hLP_0L2eE-lrOXGdbTo+<gg;CS|+^GW*ErDO`*qh9mN|Lo@MbZ^S! z{K`Du9g&pxCq&hfIP4`GCj<yEhcFxPj=miSAAE16cMN*>1b|W#FKIjVbSQ5qerkS% zGuAotqYmaaZY+)w7#MF}IKls3F5qZpMOIi=lWb~Jw|hM&X}FE7-}BxYwV_OEdOXRn zQNDG$<}4Y7O92L!@wQ>&XW3H|wFYH278ZeV2CZsB_A{Y_w-)6Z5UL9X2u-Q{g@J`2 zX)INFDhb*7(cX<4e@zcJgj?JT<*EOjV+*gRB8CaL%#x#!%DJoCmD43RDIHvS)GdgJ zTnOC}T6UoSBi6HLUx~5J-8pU^-#Itd_R6^#!Sc-wAh6-^qAM$|xVPE5nTgFWCZ-#B zg#(ak2A4v0%6*@6q3>GP<VfM7e+v_H6B2R~jp>D>X@j)&3M%Icjm+|rV12nplwV#S z<dzw)9sk=NW?dlA>*mG|e?VdO4-O|5K3T=SL^i0t)?N6yAxf{?BArhBcP%$jvk`iD z>7Xl8YTRM76Lm*3wc1sQtC1#E3x{jG>78Q2|6S|NANpP|6s<?29e!90*!4<_lN;e? z>&c9^ls5JwW6I)o$2|Npn@Xc$$9walfofS4aT&-)S8_92)KsMvdn*=c;=zL0JvrP* zNwI7X7qbk-4=LjS>}fBdN)C@?ijHWh8R53P#1Q60$#ar3Ym5WGHDhb`>_E<<X2q+7 z9K_Pb?4YU^`5v%e`1!!kDX1Uv%9=*Is;;8b#R}4=?Ce-r4sy+)0e%Zlz(`HLh2j!O zv~KS_-`non4l#FVfKlfLsGkkAtq{-mrn_p??jZPBK@P8}TCNgPzpv3N&R$-1&-$t2 zh#lkU<2xdN^xA}94nC=#=T9$+5&Qk69=mwbBEyoQVx?IhuQw}!S^rL`y>8W3QN3LO z7C!wEQ6^uinp2NI8etyO6ZRrS$6+{s25A=#jnl_`adHt3SAP_O?5Uw7>7!5St0h6O z?4q=1{hvO%>X&=6N1jn@JS(fLA?lj^kEMM1;(#VonXOQ8x%_Np8alX91FCL<$NLmT zRA@RN68Tu^(b%JL&mL1!M<<tXG-jM0KNgr`ri7+_ZXh)BG7=_e;7TL~9ZN|+8SlXs zZr#RzB9Uw8OPvrS9}DNdhi^LMbZ90(79A3K-G=T200rf*os|mOWm1s*`kQXP<mMaL zfzQlVFr_N~GTx)@RAk{TnPX&xU&^x*wx47sw|GWXP5uH0j%_c?Dnd)6#(+s&jSd_^ zTzfJ8vchO^ILFHqGn3pT?ap#Hmie<tbq~jIegk9h>rPvY&s*>)1VH&{EbV*=>@A~V zDKOoe=i+n=*H};2U+_$~>t-nz-k+_eZq%9D`Q0oexwqz*BaVTQi)Iskrcz7KE+o{& zUq|z-CKS}I9|Z9xt4lPL@2C7ej?NV9cDS&Yiccz30E4=-gFgD4ij$F&5hb1k_MWQh zxubMPXCAD^3dO5Mh`M>a#018SFs(NGGEB%$XJw@fx7m;Y%f#vumDI-u<jc1SAAO%q zuVf`a!_@GhfMy40a40KW(DG{66~K=|`r@H=#~}eBxBt~MIS-i1i+TfAo{_%Oy(jkM z7%oiK@Y!4L2R?OwcZqAX_%yg9j^Se#t&VS(i?~>sZPl)$E=Lv#c4JP_EP2{jSoa&! z3H6R1iu49}D@i65*fX!PN_g;P&0w4~imfDpb2$H?&_Gvajpg%6q_Ytsc(K}|d|?qL zduiAU(W`|;zeJ9Qc`<^vm-!QQ0U$h*Ferxzczm;tXq&YGs=QyR*V*8`jqy6HNVtqi z7KmUQpKzDTVoblg{O)u+WlPm{f^>uja7EbVf<@dBgUZX;9Xc*S>Xp*fepAS`z7=2b zPv0}`e|wq|mC{djeX0)ZdP)wjg#d=p#zs9xMP5YOL3tQ$evONYQl_fKe-5*P2(174 zg-I`dhA>Yry>itXfiF1Sp17}W)Z5fVLyOhI7zfOR)G?C&o6N)Q30wJ5@1qkhU)^g} zie<^1zyF{+9AUcpb$Z5NdqP81m7sFtALyYBj9I%{4@*msFtvU6;JPvve81Ye`{#jp zqzIZbC&+JwnkA4d;oFy;=M5#bLDW`ST|eb!%GxL<cr--V?WR-@n)et)T7^0Q&`+%_ zlRu2Kke)!3uw<()W%VCNDW+^P7kOad=iL+t<h-+k<QyOoOaDopWcbVj$8ldlA(=}{ zoNo`@kUU@fvi?02#e{__y@ehMc*1eCEGdvHe4vd*a$!M3cIf)&!$Bp%_8xSUmPW0d zs;4uvK&tnm+P%W<swd9_4YB&tWZZFP+;;-?LIQ5+U_u`+Au}$phG)$19@c;c1r8!{ zp8oFO4YvmryP~3Ktc2V1?Ozm7ce*_@EVKQ%Tvl;+u}qj~><Q~>oRG`b->A@q<LfP9 zmi6Y77PZz0<N?-I`md73+RORsaLlk=MItj>J{cwU%ZrgiM>AC66^8QN{5O@mWo2qC z<4gVgZ>kl`nciFRrA=|T!q@37vRa8bdA9hA^`FMS5I60+S4FR9Lg&mi$f{J+R4d78 z{^gOIrHrvr<v{ypiPiq<j`yylMjzhgX8}#^5&Ao{4NBjX`b$(?HN&4<qyttlzkgr@ zHFr5r<Cv9F1+EHBNaa-HbD^}XzG|V5y94xEWd?w7HqbmGC2|A>rtQqYPBifncy<G_ zt-1Hb6(IUWXu~0cd68&2l%Fvq+?k?wtyJ8n-X>-VO-1~%4Hvj|in5-aH5$yBIQa4o zkR3T&yp*rip$sjzD@<u|LloOf_W(=F<KR7+y`Ua#4tUJLe=2Fvq|xXHA3+I=Nq!4k zD9)mk*%G4+fo&^_g`+3{{<57n>cSMaLLJ`*CG^KH^x&JS79J5w9#s+J>~T?LFQYDZ zBP$Qq9sr!pvM|Qw!W%mtVj}V1xisX-RFhEf(~(dBDt?0cG22v@O62wcrm=5)GQ)B7 zRi<2SoNHSk^@f19*97eg1wf{kLP&UlGwtwT<=V=Mt}Qn!6<v?*)XhTU+e=Rea(u}| zltWf~q_R@Jxoe(wyR<gsnBZ;}xK|dpERe74hyAx>efM5^iJ;h@HJ>`wo|I%}+r^!4 zo~I}mUE~vqE`jdRXHUCiE>$-Fes-<BsBgUzZntzTE}uL1%}8Zx5d^)p?9n7ahvQbD z!3z#YXD4J4xK_9baV&kWhrkK~hO@93Pd7uba4h*OGP+p;FjO`4m(=J%oXJE*B$^yL z7Ku3S*xW@4eiW2rZ(+K%vAZ)ia`hlbM0RR)BgSsI!l1X1li;gbI=$lWwTVdzs6$Ko z4f+}o7(X6t4~pgucXo<=vzXykc~ow0lw707o-R!9r~TDhvAm7XR+^6p1L8puP|ok4 z%4`6M4Gr1Kq#Z)Ps6De^nZ1p75(N7z!fIRX%jUzvuZ+VhvqSX`KaYkW)cf|Jw6$lF zRy#IF?%f<>?raqWdsRP$@*|*;X<d^kb?6BP&03@@dlkXB0=gN17ci!d^GDusCUUc5 zb<*C|PbVYN=>X#9bz~F)Y3V#p9CYh>8_d;*i(9CX9r;P$v+(f~xbYbrG5+|O(n*%a zS0s}yqM~_C8FBY}_;LETHL-iH-+yPN1rrmFm+x_`J|^kiwTHkpUx%1K$x3jDCxY-I zlsVo|hW5Ci^HoV(?9EN5Imc3_i5o`VVw!f`a=IDL06KECn(wdgWP*yz)b9b86%)+C z6s76*czx;G>r1Y$UCPav^+YCNNoJwu>Eg+(7jqu#&Uenk-+umGH4P#WFUl`7x6+Te z<B3J*%FZo%d{<9jMx-2LYG5P#Heh^Szo5j*dk%2OwMaU)ZTeqcbk2Kj(dmsBTGSi9 z0Z_`P0D-A6J(wleQHbgx73ufmWU-pnF)ps2mn%;6WpUz+y_6Dw+Nuq9SdpPue)*ql z;5hfYCL0B}o~k-q49?FwwF(8p*}r#>0VV4E>U_D4;i{*)J(-X;h9=t#yl+RD0lKg5 z3s{d3{?oO8_IHN;r+Vzf?(P#$sX{Y>lXPM`7FQ=Ft<2wyO({To5sBu}%FVC8usMHp z#U`B75(>7L{9k-ugQ4jKih`W%S;dX{S|$U8z>MZHVddmGb#tb=P+)X|y7sdHk`nCc zmL^#LccvvRL*y-_Wuj;Ji5;9kjpvj;{-b@%s0YpS7hQ9pTV55Y`(J*~aX4bNeRafP z$9pgD=LCD+L}zDYr-kW<7nO+Xo>=r!*-MKa-%JQZDwZs`RrhA5SWG#yeol`Y7!B*g zvRf!)xZVNmJ+1T<W%dmvYC<>cxH@$nl&NwS*Vx<Rv@1+7-51rZtMf;%Utq9s2Bh)E z8bd|c-4=j4)ob06@5Glo#*Un48E#p4*EdNSN#ArWYWcx82e!<qSm}Mw;d6}&vF}z4 znu7V(K8bDT>BufeSL9$9!S$uBu9l-8&4E}w#z>!>L+Q1VuO^JY)=8AV;~^ft0dvx< zTiP*(t)DALve&6Sz=7q(YdmbL>~xHhR{Ps~NooLJLHT9&ksTAp3ErF4N%e3Ak|+Ph z-^%Be|K`b00txXcr{q~m?;s;K_rzg<@;uUH^w9<%bpl@pB1EO;{pC7~RqWO)RFmOi zo^u<+xg}})yz3=tXP<Kh=ZmRe4pe*<W~BODIYi!0MW7U-e>u{YaN)+a4ooon<FR}v zUXQ|xBg@*E_1@hL74O`YDS#kTUQ$3D)C2OC-1;i#$mG`?C540W(M0rs(NpxEQPz@o z-!^z%S`Dpo-BWpR6T_9Rp@G71>q<H1J3C%D=D%Ay^j|_p)2L!?;@a8_?cSn)HH==e z#DMkI7EI}-*Cqlx&Cz-eqC8#zZJ^wmelo6mM$0}eUQpbOUvx5M(2T#UHgdR$*Gy)~ zlt5m>xYQf1P9kE3og#(Gn)!}Qkva0=32<)E=lh3*Tp3Pt3X3mMPei_F=T1Y-hgYhZ z8#cr$iz^4_SU>0&@}($rT$!TPJ5u2k7A%u;_jB;iW*NjD`uG~w2z3$aleRAyrx;g? zRoEzg`d3m&mUTD=rHn7ZU`Ax~+S2Hy_B_telzZ^=)01Jod`#lo6H%m3G#KZ`m8L0l zMUo11kowGLW&<pQWu@WC-~JNx#tg2s+S^Y<Pr2#sQ|jp7pU9Hm{VSk+fj&+z(PSiK z7?)si`*~5|cij!a8>n0?#{z#~SiDs5>;NcNSJOxc%0+Bq63V;9BIr17p67VnJmK&& z|GUt==KwUM6%4N32ecf#*=92rTkFwt{>H|5!ZH=~i=4$_7v|&nZnw}3T59PVlQY{V zSyL&sbZJQ#B#zr7rhit}Wc0$!l4ZT6CU%m7;If%IQ3>|t>6!NMorkA=fh1AFPyd5U zuN38qnv!|%a#^>AQ2Sm9m-d4BuKjn?KUeA_&8oj(!{+^#LCgMSz2K%uSiPx1zEbW5 zfc4jp5!lZDjF^5O<x++t`yCl~i@nUA_>Ro+L`<YMN^#>~UNXNyE-1xHKN5(lrq^R5 z0)3`=mN1z&Zts1UAN7RKvk?uEqWn~lMs@5D`a5b>&ihCO*keSkJ*jqe$Fh<L#&H?* zY~EwqCk|^zX4@JYGXv~=V|H(xx5rpiKN&*MY9vJjy=iv{4EjigUMl$Dj`fbVuO<6E zXWG^~*3#fLSb5*(4eqt{+Vzg5e~^CV`C}8PZPoRzS<Xc-h^!YKwo7c$@1J`2=Zrre z=#0<Dy@NUUV}+kQyYjCc^S(G^IXy0W@`;5}QEajDu)L%{!nzC)j1iPrQe!nfNhJ)# z@X*ok(4^U(RlS|zrw2krw0;Y#AwOD0n9{{}qG?MyEzypayH8nRa29i1K`V|ksepr+ z-VYyp^s_V4jqmLmZ>7Xgo`TsAXc3&gq)OVS=~8go9C0{(`YMg!Fs1p7>c@{>w#j_{ z`A-P~zpt=`_{`ua`#|fvw>n|0lV6<BoAm*8XsJ;Oyz372nBr%l+sL|}0I?Y1Bt`L< zQfZ$6(@_65jS$N}wwWek6A>Xexc-s|gLrgDY>Y;a%}EPEebdIVb+#)lOr0C6aSJW3 zt>UoJlozt?k<i?$^hX4)CafS5N5J=(w9AqU<F8D7DIBfg$B7p<3c>`6@lt=n3Tlbq z6iPJXo=bic=JAi>%X5$8`gzIKRQDoYFg&@y6ky{_YjJBefMgm}I7L1K_P^5!1~MN) z)w##QV<4E}8#}dQ_341U|Mg}E-64K^=9b(<fs^B<&amW0+V++09c68HA#&`^%1Zix zPNYsjouSuW8wYqCHI3$TEE&N`nfCK^XQkYdazn!Q-iSO6-}d(6yWAZYx_6&ADB<hQ zOV}10J;-Bpu-TG}icB9O!~_lo@lnu5T=xN&uptQ?G}Midd<&5F)s~}_rzKDG=$_cv z*Ok8*ZkgeM?sy=4hydYy{-)lFicGtJA1)W<PX-a)SM^}Q9^6^W>3w_DkE}c>$jg!E z&$t0i=08^?ygt^p=+FNiSveiMcq<Tmv0{)J;$xgn2j^$)bzt*7<;JUp7ZuEI27?B} znDBL$&JNH6pX$b%4TSwVgAg=Uxq+<Ktb3Lan_gu>h`vB;4|N1tVL1$-mjs}05d&{D zNC^IhI*8Ct=D_<_H!-Bq;3ta;&6^sqk1c#*DocR5We{kerWNlma@?VK)Vd1|D0i<h z@-IGw2(Mb}sHjpefUaxrYkn~yaK0<Bt6Qlk(C9Kd%w_R{c$o=0w99}>S?PYLvoNTt zU+PJ>23D{&h5DCj4Hh~d>Q2e$+*7&TE)z5g+_%urm{U>))$5c$n+)Tj<-p|l0#1rx z`QwJ6RFvz~LB*PNcv?rJ2cEZ{KQM~)>BF-u=yhiC9b)tAp0l3QSBAy)Cb%dWUqB|S z%E`eG-ciPWWLmt$0d`k){+%hJpu2<=p676f3T)}H5Gs5sMQo%vcgEv=xe%1tjA3T_ zi9=@*Og!6f#*U8}_5#*Yp3Rg|&kL)esLq4eXs^Yq(iQD|EmcWaUWg1fCxi--ISweH zw+n)RL?rQvqv$@J<(&M51;w;j;h8MGKyD)clPKntaEo|Pov_S(B2&sVZ>Ah_DYx8b zX&;zf00rhZl%L4Vc*eq<N`hsekcU5XGu+B`In5y%7Za}h1?%9P4wNtx{$X<90`I++ zJX-*TMANZ;e8At&uaNLln4*MGVEF612^W<iD;w*YB@B9f*4EUxQ0GL}PnB<}@Sv+h zGF*^IVPqAa;?u1EKB3tcArYR!cj_Z`@Q?qu=~x6_Pr!ojN<MxmGA(9KvXEffLG+Y8 zA+OpeC9(}q@rB40D@>-aDQ>EGHNKdf;t}3=)-Exp`0xr}jrYQR>63I)-rGJ+;dOVd zZx7A<^Z8>hB+k{l^~-ezf<Ry|MBV4UFY1EBUJ<8xyne;sj^oH7oo;>c2jkyw0QcMY z{KdG&xzYmu4QZbIfj`#Btz54OvzG1`H&8o`B(I<FMgJG=<3Ce=g}rj?l;f1>YJE@N zvbFx-r@?^K=nDUrA^dv3bW^87zFFYtPbcY*VLB{q!fU)R>Ga&J$>==JP8P$@#ySFr zC?|Tu0Y4=&F(b!W*<eXb<4+`u7_!{etdZnElB)-Iga|3Gk#mtLnFTx-$d4SJu%eq{ zM;xmy!%Sa)u^jLMpZ+GhTd_sJOn4<aJrT=<qT3zZEnX^j68LLBU#Sw4;6uA#|MQKX zfvSuMnVY0JnNf@ihLQB6zPUgBimM7w16TEy6HLA}8SnCd?#Q>nP~*hqR5|j_MK5F! zPp8Ik%WzFe7Bi^SniqysOh{FO3yq`(bK^0F@mO?;8chXzC1ZpNjanJJlIy3W8u=Co zu)<Sxb@tdBJB>)Uia;G9i>J+sx&Wk2>aeRB0F>6bvYX8PcI|ko46A+@ZN+2~QM<3E z|7in{B)He8*SO!9u+mogcfGVQwPc;GJ<<B9rU6R^+XofpN4a&@^>ZQN(@HZHvm0lX z>MBK-AG$*>$4_k{XaAkqa0&VkLeI)q%!zwct(D<q5|cdHY?%et1HRYyXZfLQNo2&w znlUgwL1T!*atO4)bw4g{c#R1MB*9rPmzGdhGa@$Ld?Edlq_+lgz>wfw;cl<|#gtV` zaQh10$Zw>?^FNPsZvtrc+|xic7?*Py&sK~6Tyhlo-_!h%`K9or&gI}A%^PIIu;S*q zn<RV0KC>&so-eDZ-6@s_9aQL-KnBDZf2`n7<;}h<n2(!5iKH|gW(e~Ip%e%Smd+G1 zy78ZRW#JF#;(7yiRrs&2Lq@`Q^;sg2%`jESnr4d|d?HXO4&6!ftRKvi)rwA-_eI!U z`{o?17_4sg-cw4IHnHKg65gQvrr_Dvf1CO@&T9lufo;Rl8pyy}M@G%BeXsqk9oY95 z=mGQ27SF}J56QF+K7KW-D4}1|eDHzhH9Ab(wJyh#Q`adb5lRl?K?Y(XB{vGer+v;! zzrZf1XbcKPjSzg+=S**HbI*U6I6BW=qU6GTW#JMoSb|j7B*HkH%PRAQbB&(HyZQJ4 zx7*$9Jum%kv;egIe_vNb=Kx>L#uMMO-%rp8@u_xIyFlWh*SKq}WC>KpmN#Kn6WQ}4 z^W=K&HI+sQNcodbwN7J4=k}qJc~!?tehN1ep?;Xte?H%xPE7CX3+*kssC5*yE1Gpy zDpU3lCTcBK^ba5wd=RbmGNr@qK6g8U6n+lW>6kOVMjJK~q_oN9Hf6lYW}kSYvEXMG z!8|Scmiv-8YD3Yd0JBa_0c#g&TF*OhV(7og`S8=mI3u6|B>Nn^XE`bn@nU=FFux4# z`JAJnDm|Avw$ve0Ju>Kv_j=geTaS$gZqY@7O4jo%N4m$v3!BOgAFO02R^^|v2ZpVZ zHuuOq>Ab6B*$-rYx;$F!RSNo!_@)ekn|eAS4EN=>z2T39JwKt}iBv;25D7lyisWvQ z_Ah@4@kp`W@JJ<d47%Gqz*481s5@QuQh5dIW-WDl^*~tRq3q^_C{O6IErb2i@ZhCT zS0==~rqp?;wxzj2=>ky1+_rKy=lMkcVLj@QE$ab?bA&0LqbSJX2+D|3lu_biaa-f{ zb#zK36Fvl)))V)BxtTCj>IM~>yPK7Its8b$v{qqwuv>|uLMB^?vQ^t!404_DrC6xb zDX(;>q)=Y!EM8GYkhhu@Ht|evCX=<<Da6Gs&2Og$sUX^FwP}$&(UhY)MT6KO;ZT$m zFSQRUG(gfnxfpSaS(x)Iqm>f}lehGTa4X#<R)4b89&+`7piHj^JIdbn;N|SK{@5-D zw>xSt{GN1g$#ZD~%u}zw{uDEi_FT!m3BO-ZE^6gTaIhM1VeXAjkqIuz^skdJCj5nF zQROM~EeDBz<RQ@?&1!|UdASE?xW?fPnH$d8E=Pz3;Ngu#=V-s|RGB67SSNJ;x+-y} zraaDuqu@+YpDOq1GyY@CW*D7&o~O|UZ=h*JyDxg5h6a&M-5b3^^=*IrQ_{{W?Yko( z!B)tZSnO0c={%t>#s3bbC=Mz}Ib8W&@lE!03m@#@1G{6)@~6aix$@ndIo}0tSXQ{V zK5WaOMb(G-PJew+p8#4wrN8z|-&+29#`E;w;NxZSn=1cE-uagFjfVoS`RP<S_cS<> z5-JNNoA(j&P<&L2bS$%a*1vS|y0dVN>P^_)v&qL_q;u65#XR2RiBQGaJuV39*tk&x zfPLe}EWwY>8$rk`V3w4FIk^$1&G}X?yR&zrG%HiZhZ$OZbfZN{TLTJ2->5btg`}Mq z(KOvjd$VdQVvT{R89j)D@X4+*MY16&>Hka=G>EJ;<D!s3W|@#_f7J@_sKJFbe@yCq z3}S)8#7e^~3JI(b`t14m7(7du-XJz2H#cGqC})<W4Sc7xWIej}D9fS*{C9NjjyW5- z^c-ECVHxb{dHv2;<zL<TCmX1jJ<LMj`adeW?0)9p4gCHU5z)~#-!~bz%RO9ZBia?= zEmwakcRX=%{fcld_=s_tG7f{#T2EnL``&Ew*L%=H+ufyuiay!>6@T?(<%NaiYgY5W zI`Kmhq<e8qxNu#wXkOKWvi*elKRwkK-oGuJ>fL%Yyl-rBK4E{^z}lovJRLn!HO&|< z-~|pTurXb|?XXW`&pck<w~d|=Yt9cA^dMRa!b7RcthuXFZR~PXOOVz4-1f*akXYRs z;>5DNwlIZ?w%0ye9F*4Z{t+D`*ZWbqqrVc0Rq6OxRG!|U{J8OsSXfNjR)_09yFR0< z?w99kNvSIDqlTyERGrlDA~_FHv+GH{^YoPi0sCd<_~n)$9TE5Z{deD?=zQqi@{Uwc zW{thR7DFeYM~~n8x~0DIk-pe*KTtD`?w{wPAM@W&`Ht*WiG+Xs74oR9ag9MqU8y>H zSi@i~z7}O(6RWPZv6o@nIF)N!uKkPJX--mD?aM`iPy%pH$uSS+cAe#ogU@U$k5|N( zzn^W}u`w~vTH9O0WIu)7k}0@KPQ28k46>}i7#1LFXr!l%KY$dGYy6>Rk3_J7X!d;& z!GF#kBh34g*uVDtAoK;h3Cp!KZ}W*byYuBk2wr&zN-L1q9L+Lx>*nXg;u@KUC6A9h z$;{go&8XaxcLoRFm4qfT(Yxj`Pmb)G!Y&@UdkYzZ=N8xm1&O@oD;)Dk!0G+xK?Iza z>vvBZfHLnu6?yBtT>QtSpPYTT@}{AeZ6XWa)2PP;cPf{WRdZ}f8_0rp)tZ}vZ3!2D z{BU)mQt4*3X6Vm+Smrk7ec{8I<6~|YybXK2B_HoK+_Y`C{?15YTr9a+!rRw+Q8{90 z(cjds{#hm5`Y+MnZfpMFuggO?(EaejhkifD?S1j;+W^O_AYDi#aDF6kIlp5r*35a^ z^JU3oc(6%OlCnNT`tHPYhxM|q9iO-gY6u7ni3OO!di(7USSIL)Z&8i+C4AJFuga=! ze$Y1|_J;CqA9-&?HY4*xtA1HKbb;)kV?rN}B+S)AWl*bF@y}9S<`a1C_UJQA3Vmp` zso_<_`dOQXU$)N%)wkcS4)2Zg3K58K)cg9I=X@ZX7(xWqkZLn<j^S$I;a{@KQ=?4` zCHFKoFLHw5Z4+G!G5Kwxv#Om4r)rzytLX*_clfN=0+Pwyi#729tlJ{KWodXDLbDcz zQy$RNU8y`Zszdt*WYVb=tV&irblq1tJ$eU5q#H*S?=jXQbAyj4WVKl4W<O=?743+d zUZ37F0>-AtW$7L5jS+Xm@}y?b=vs|$z8_y+)9Z0W0r4B|aEqlQy3J7W2Pt%&AsuM2 z(hzF)R2ZTm;zVyrWCzs)mN9HTfR@a#v|;_oWX4y>h$_=t0p<{HVCA(rPVZ!|E@ftg zHKI|7RI&LONvPn@*%N7Tbhxn53wl#3Kroni!@3Zd%&eBZWl~_){`3~vF{v>cU8~?t z6uucGd7b3htG;bIy18V=vz5U}AAM_PL5PiF_JI0Q6desbgqg6qNBlunLnV!d)qrYB z%j0r7FpsZu@%jVEq$#&?XZrOh(_b)ia%Yi5FC=mOJl2m*A6fjwC+9O1dRGc}f2ra0 zM?qa_<L<3@n_$wPX#Jp`TBR3f!n7}bZT>%vyrc2h5mEi1t_dQ(BNLw3MWi;p`W;I% zi7|lEEnvpN?;~jLp<Dw$1*}1Gh`9lHrwKR4asWYdojhP>3%6bgTI6*@RD{eYxUAKp zB|=p$Lxp~1p8v2Mn4OIuu&_`Y20|D_@Y1ClRtWM$peKwCJYV52)-1-2cNoi9he(?Z z^z_W79b_BV(uS?%*gL8FwEOPo81DXnHjo-*N?rV0db94r;Lrjev}G?h#TCXEirry3 zW#nkiXz!#6(x5G@IKAvTc;q<hj;Rp;=}~BBRVTCv9GhC2oqeIbb`lm{1XK*c@%2-T z9xq7{D)8RC4!fS?VH}$R(SP}@xA$vUFY=^2rd$gi2O)u*Q^5DVs4+U$AOT$g5morV zg4`oy(a3bnTh3FwB%1HSFRUPY&8D&PL1~_@27pJn0^H3O2q!pGmu+1QK>tF3daJeF zr@SajDv-Y)&8qR}CNVgV#JSoW)fFW}xuOcM<uNi3#wK;1nyly@l|HqSeAbiT3rI7c zNOyMiGh$6<pu3<&L;#F6iN#=d`FYX#^4(yuyqrN06;-ku<^3DX;Rc-)Gzsi|1y&aY z3H0eA)7k|6zDQjkAekbp1%3Z5PI$ca3vWn=!zr&=cYAXPrN;6y2#bYX^Syp)Ao;5s z{_CCKO3-1Ug6-N6LPp$f|9vG+4{&jdwmwc+3_2hq1XH&ub9Q;A>ag~0YFuTLcwGWd zo`}<xSL^swPboqQd72PhsFu>8Pt-!YWfOHjn7cB@%TtEH?<<&Q5eZ9>4~4dNK>ZC< z{38-Pb(t7|6=}w$<<OU<;pl`f<NnwcwfG$le99zt>IkMRepOnZk`kY-!?RhYNX%t> zw%W0Eq!?NHBeg4BeL3-@<Xc4=)d^Y?#YmV3jdd=LZ>z}8)r3q5)<xgzn@A+gdJA2* zwTagxXAeF2r$Y3s=Dy;JH?P<S;?tATW7k#t>TvISd$G{(5JMi{-iHGz2lOwbe=eYC zWsuDjWCE`$%(M^(CRiS~FUpBg%&l31iVJz7Le7#I$HC(z2X3K+<8|2CP$~|B)8A+E z*uD156W|H?J`a^Q6imf^?3ZHX7K#;Gtow?w#|vB*%Byk^H?r=}gPq&ilquPZm>v_e z#9`i=I*8>>*|6VQwNvU)BHhW|#-9={^8o}keO$ZCMoYwnphE&?IJGS>w)?6uVr#Gv zc=g^rH*ot2293nVHmH<-2A1<YPG`j`BwL?RM@WbR*&cnBVX)ZQ7R(Y!O|^>yvgZ$C zP9W9V9sEJ)Cz4CH)YQ2PL&1De&a5yl*h^X7+X>0ikuPYc+Dz5T(QWi8*5Uw|wOE^g z>QzQwtzyKRUXk8Blf)T&T<iIU&rP=bwW{Zl6IIbK&VJi5L<8g8^t9C4*kQMz|AkbB zWoBlxyS9gIo^goKJXmirYu(VPnX`(b3d=edO!&JORY}-f_;7wGB8F}l#7!az0fL90 z!-0h0Du9e|KgYk(9iodkLhzK2OZQp*uu!O1_y`;=^^zD13%=%B)lFA3Ev3@znnF7# zbk9H2EL@e5yd?QU^pbbiXWuP}ZWI&?rKleUQIm(5APY7SC@$tIz?ll#NTtn#0Y)gp z=tK3T^*sFlgQ}Cpq#*e3X9k3rQ>B@7-F!6TfrT=qHEO3QmOajH(Wb(c+q}7b_2z;; zuJ^VLhD~707pzc}=Ez`?&v;?VRP}m>&iiXNDM_JHzF~hu6KVU)*yK}cjE!ew<#`5C zv(z;68Ul$g_i*({g*&KK%$Ax4ddL(P!qM(!pmW82to;;)UbIh7QMz(vXI0NSwCSNp zbr#vT^}GD*xa&Q3sW>H>6=LP7Lu~BB3B3QKEv_*u$<JEh6RO*gLq<(LGM9y%J1?pW zPQ?`LiNkVp59<A9^_2_19XJs<D*V9E+}cIu7X<tfVR2pXa)GO5>l&9e9S>7d=BKpy zJ8Y1nLy=Mwx@S$OFr&^Tq0SW$SKc7lDDN!R>1r`CA^)zO!Opa^pUwJayI$Wx;tbKO zyS?CDJ7bm$0tQm*ewdz_nW6H}&!+kmc~X`6#9vS?6)N2fdZV@`HPsK;N6of~97O5B z=Qysi8}ITdONbX)H&!rNMhUf6RW>A&v_XmCIIuaP@B?lFT$fGFubwG$?(=g+wTUEq z72cLmFHwN6jzMH-B#L!-mX@rWcbJbHF?u66>d4yPpQ0k`R4{f<>6W%w5uBe>zQuda zkBi)3$Fi8DSnCH&oc;4wza$KVO`6-vZTgW~BLKen;qCjxyTEBIdf8W2i)i;tCJav= z5~=m+BzkXX$dLEOkUj2g^_kP15BGJRj@w(`8s-mo6?ITvjW@PTQ&vrY6vM6YlNJ8} zY3{cW;XKm#V<NQ`#JD~zOIfG)ty<I}TW5@47;YI!*m1s4<aKrOjRkGxpiFck@{@mr z@2uF~K{<$QfdoCc3h%m#M4l&7#yX>O)uMJQl+uj<x_Xf@aWQ7Cei*6ppwiw+EQQdm z)|t+Ax6Q7dgVIC2J)PboCj_Xuo(v^xS!|l)2^SI7<9Vc!!&#D{b5YLD+QN{U1jvow z-3;-aPkwGNB#bylu7O81rO%)2OfVP#h?S5}vIfYxlWQDz^KZCr7v!lI)hWq>lNSE2 zu-UQF_5{|D#aZYCxU3PRw%$ce%i;_`cFTFQL=qelX&qspbDm!o=YZ9(z(DFC8~10d zQyMzz^Xc|dW5%0~=6k7cc>dZi39-ov#WJTD!<%8f0g?H)4$RKt*<69bZoN%g$%j5) z!_&4Z)p)vJpZU5t^&d^lfc8j@X8sssgaR2acm&;y&S*YY^kfiN;h(urB{g_iD$v&E ztzE5K4er?(UvC{H$z1T$7b!w|W8!k7@34|@y~p$8-Lo>sgRqls0N}IE{LUiiImu_W zz5`lo=UH)qm5bC3j$i<$2%blg*D(lZC=l0dps`N;0m^2WX9IkQfc4=FZ+!WDjr(3K znfJPDmX>7QXYBtwx`52}r~*{!T$t5KRF$UWFhF2$byWtEF*{XM_hb<0M%iS^yX5o1 z*GX;8^1Z5~)KOJ>O(v3w?rkn$=A+UO6b+I3?C%`!f1j`aaNSHJB^G2ju76nn{9o@7 zDR3Uc)DAO3>HwGZUSj<F%$dK9lJ_hw;GvA6TGDBUJ(Zwp%P-H3d|dCJ$x2AbI&<HZ z*q=4OY^eg3*BxL@)-N@=WhniL)5XD{^KlK8TJz&h5L|rvI2~=xt@$M=VNUYDZ!46o z_;H7^a^n*&oAHf`dq?fI7d6YhZt6R*@tYoO?vss`#*W8xDKb~Nec1s?6lKbjf+fup zn-kjunhS=qTLf68#DeU%Q!Zr>thE~}uVv6*{xDaKu1gpEU8)Omw@Z|yW@a?rQagE+ zpa76l!u*m{V&=S|u%UT#h&mgZ@_UcC@`OtuqB!lV6v$0wL}0a7)S^7O|7Nx+Cq|3Q z!S=$+7-rFjLTIDz>Rm{S=lA!W-)Y);zOONVZ0;xwqp&XoD?!zm-cWE4emk^Pk+=UQ zcIA?lvEPh%Jf5LzHVZ&`n@zxnBkVV366;lyBVVHedoYSXDq7`m1gRPRA4SiO3WN`n zg@(1g@G^$6z?DN4z$jww;u1mR6DHr<3K3>}r1`NnPjte=nEU%f<riJ?>`Aw!=@f7{ zM;5N}BHQA&Fl~SVX)L<T#afF2`uX_O1$t(L79BJ-?x9YF0lB|Abfi9BPVU-bso*Un z6A%aCEZzm^gz7MYHg5yt0l$ZGc)bp4l0aOg!Cw!2uXF<9O#Nc#ErcCjB-bHw4kvS= z2C2#RfgZ27r@#pIH^sSu(V+EO54jC*$hc0NuCngxwGOnTVy(H*V2^`x045YQJRgF` z>+flDCs;UX3JI<kJTp##(2?zc6Er|}bJzTTguYv_ART!`Jb%094!P$8qZ~_5Y*zI) zd)69Jv8B)xi?QXXnleLz7q&+@Q^NL#Ij%YC2kLKnMqh{uvcXqBaH)A-?J8Uubg{ry zibdir7Rk4Go?xr4hkqsS>OX1`7|*540>!?xI8{z_bB<~a<73lh{>QS52U;Qhk=Gi& zUzu*t3g2?-&Zbgp5iBT7hlr8mHfl7tFC(}M3)t*bCO2FKqpGx9PvHT_^$?T4(*Srt zB$of{vau{3GtV+mxJ|jBuucDaM`1xaq<hqS1eU+Md@RAkx6XB}m-vcEqm?Kue;;sO z0FmhVGnXhHT8D-kXmn-FzAHqb0fA8<q0TOG3HQzr+|M?a8b4X8MMA%sDDUrv>gRN@ zsMx7PYcJndNZz>ziPn%Md*z7^<HJ|nDk4#bvi9n`l^iPws&Y*)@_MJN{6{EFu})Bh zAk{_*EH+iQI7*X~e><J@U8U~+{?^P&pWH6Qw@y=LXw3(%(d_51ylt|AU|LNKv9pz; zs{HleDsH#j#q9Z=1nm0{2NW4{tBo4iwkA5p4oxCo*u2Hc%k&?I<#_P=br!ETCUo8^ zS+&{>-UvwGJ)M6JgWEEyfOuAglC1X}l3y%vy+QF0o{xJCtGsed&(6mL3m*f%=eiV; zNXUuqDSVJPu9#6AXL^~SamE;AQVych@WZbP)4=VsL|L9j+8$v0M+^20un468dk9`^ zQs-@fOSdC#p9(B-(kf>E%fk^<eC~j`9$TaE$=iQCYVTGc=knVlcqg~Mi7rRaEk&Jj z<aSGB6pcV$mVIT9avUBkYapZ>1|D;r{9|e~+&Q(SyI-a1@7^+%V&-qA=&$bdNHJZH ztQgl05h-6yqi^OraZk<oOtL(=H~wrV(CJlV&6=m6jIusFtzNXIb=u2&hp&(BIzEiA z^Fxa4$^8`?(BDYvTBEpsbw)h?#*O%5qwvL>vG#sN_=bL<UqPExwcG1rXGdG*$L~&y zps$#OxLrdvnZ+!WduTC45KM~=PYL7Khf@%>Cqe?Lb^>^~7S~OLfu;nQE<_-dY7hR2 zFiFLi*r}MfMUFqG2s=PtY7r9BI`D-wMlBH_>89s5-T(-gt!-i-BU8LT@dom@Y5Za4 zShfg_goY@|bDXF*DfBwghpr$a4WfA8jj@#DyEIgzE{J)_iek7{*W_VqdD9FL^vGsc zwE>#c50j^1t>+n}6zpwP0W{m`0mxHvIwjV{9s`2omwYz=7stpt-BJfg`+>1X0}BIO zBk~HA$sOV}Lt7ZpLy*BSG}GcT=$;s{g;u>ilAkuv@@6Jb-j*|R9<+e=%~7*56&L%` z=l)M9bGoI%B;I^cJ+_4niW<xN!rhY>PWXAXAuSs>d-6dr7$^DQ`Yea4)()I7VQ4^T zan427x2tDZnOU&mluN0LR#4IFbddXc2?E<*+Fbp>K(5aWAG+yPP9dD_3c)}R#=NKz zP<P!qm6&PPGTwVBhIa9R;9~G5U?zaIjx|0g%xd6o{35ILEidk?yDW6(FrFQ>4c1|U zV!C#_cJ9q!$AD=?y5bsqofkY_8p5=R(wQN>_TGncc!a1kc-Ra^PbiUZ4fD~nNkf?e zpCdEqqt43OmtnMqWmIp2oqq)Zh`(fA6&XV``7tlHryQd*BOgJHn^Tx93nVaKPiLh6 z$iy)HP}!1)XHn<cV~*1VZabX6=hmh4<ufpXhln8;-P%(nHR{~zQzjuE#5G7J|LaNo zB2r^qbAA2l%t~UIg|uNg380_YlzsZ0Xz1Kfbf<p_Op8#?Vrznl`6Vb`H02&K4^&+` zcHpYKODtE2|0zhMB2Wh*b5`mp{TAt5p)7mV{X>27P`0A{tVG@!+Yla`v#aWtfd=|+ z@ztFaeucIiB9tZUT(6LRBL5Ufwe&>E+lWS;n6#wpc<Pm&UB~_jUBLRz1RekCjBf|> zKz??1d0$CReaVf<ta#;J=>4ifu6WxGq<>S*k>v7Ims=fu0dpbC%&=MYkR2Azpk_UD zA!LSIE)HRoKiz=Z>r3%ATq@>NRz}M2b2aZ$t%QW`UsGk@=+JPKaqYNDRSAOllmpnf zBaOKPIWIBc!Dxv`@iG6mSzHhVJt#$#mQ;xa{zWEI@IJUNX$43{^s^0XAg+Q~MDd+{ z5iK3tPwX3tiT86S2ny_#FBqsX0%3pF4_eRA%nSpB{|a^7+X?q2%t{&E<g-z>(1t?a zl;Jl%srck{sps^^6(67Wlmc{ngYS^;cYjk8c}#q70oGO3EnnZ`r|&f%1J_xxJAPq; zy~X(12<xZW+r%TGJG$<_P*k*ZH#9aMKMc2TV~Hbi3lupYc35RYE7bU5$oLXe1R-Aa zKqf$+=NP(+&RG~6j-y8OI)=S9$N#Yt=xMA1JB^<9dpLUV!)jBQa6iac4-7L#MjHxv z+w_#W_t%&Sb9RNf3{fo-iN><jUy9XmMVd9O0<IRnR3l~PMXIMlIGJm)46B-(L8MGp zc<D=}FV6jgmLi}c16ylLesX}}2nLwl(-d;+H71V&sgf(V|91mRf7hmk-AS=mCOe;9 zpY+|8uNR0pr~!8xX9#k{0=;gR@8tDoos(B$le!CE(U`vwlTS@<Kj|^ql1zN%i{o>8 zG(i@I+6w>o<i9}+OHd~6T0bPTztH;vC5)}_6qi8?OX5FIzMv=40q7MdpS5C#dQtX( zBvYxych+{{^8UZoIr3@o#t%_xhEkb8bjuZYJ@fab68^p+O&_mMo8NIEf<+4Lx>PQm zQh<CuyGP@oYAH{whdKy$nrVdO0l)OU!f4Fp*;FKpFa-*y=!y@Eo}D;nV{fH%9FZqQ zjN)2+7g2YRt1dA(@RH>vk&UuFJR-Cexz6sy<6hlQEuvB%0ONBFPHNz25u&y2PI~TI z#CCMRrrQ>iPa#_C;4u|Jtj7jbEkZeLysE)L&4XA701Df5k3lgu*U%k6pDD^|b**V_ z*?vk!i%|aY70sdcXV%LXZP~W;C!*Sc-{ICLuBmnMyx^9TrvLM2V_MxarjMLXdxF;5 z;A}DOy1x&6k3MGjg20@Z63K6`VwG$K&m@g-;fHN|QaNEU7&tq_w=ZL~J7NiCYUonJ zB!1%2W+9FvZH7`gLG4`vi1Rm{)oN^h`FS0j_51v7ULiZ4{y#^{IS9{hkc()xR>z0> z5ncZyu;v%}DW9z|;0+nQsN~3j=<$mf?#aS(BCKuw9sRfhB`z5TTSDE1e55G>Gpb=^ zTyaS~>GidVcAiJ&g$p$zmYWMr06Rht>dhHu{<;WDhGqFdUXN}$wgYSqJ*YEhn*4E- zX-Qdup<&&~baM7hTl36}vT+v7n{kQd49+KtM_dft7brW0&D09@FQQ4A!ZYds9`=oa zG0f1`K^E>~#YvDW$&2)GVbVq5v<TN=4HNu0e)ARxzP|KymE(dqL2nxbs?L&3Aub`S zAS@crib<8_`)o1h@ObXcwlV=jVj2Wkv<;&!Nx=Ssx5T~3SmeHhSH<1x*s5(@HozVL zI@mfkFZw|L#<Dg+l6sE8It)vhi|$EXvoD`?-sN8!T^imXH;S%0$_LI>TJnYzQ33>F z;fHY#9xtv0AS4H$;m9a@5gNpgBd<6v@3o=rdM~bcCOA7PrneWh{y!$JlJ_oEgAp6W zL(K_;q98fTk}%m)nyQMuRrB{4OCz}R180Z|LxRsqEQ(XAGsINN8ESW0`oJ6leJzE9 zMNs>n0U%HQ5Gf+*Cwe%WC4P14!f1<jxh_9AgGM2ex#~aR6__$P*4<Aju@)X<WO^Oe zG3O(B@$M|$yU}AW(mJbKtZHk^|E&yNY9A<{wNn?vf`mLPr*%JE0nyYLBUlV%f4Jro zvNu_uXpqMc!LoF$Nhf5=A(O8)mt2nd%AT#Ipk13?vUQY~aE$e)rLl#32^}YNS+Ru0 zxaeu+6V-U+v8^Qz4b??y9QMnxmrER!M#z>6nS#pOOQkXmUZI%(<h#Y!TK|Wt65-om z&7^p>qI64r{gzT|?k`&%VzY{tZj*N~3Mk)ttz1nN7eO;@0o_!giQaHGmf>v*ObS6i z^-UmhGw@MKNUq2dme|f4Zk$$6Q+hJ&fv{U)k16#RrGa{7MUPNj#K~@y30P_S7x{=b zX39=M7G)Vo^d^Vx9tH9#ZB^%E8p-BNH_oCg2q0x|XKC0&CU1-I-;It54Wl`^wPvmZ zJT8cEGU(}(wfqpM^$VdySae8djwN@7{WXW2^b#DS7zcC}xq9@E(3P%a^1+CIMuHJ8 zLMG;`MD}D~#rOt6ch_8)7sX}+dlt%CbNj;GDU{z%FVnByjft-!$wzU{wxY9T^+c|V zg?T4>BSJC^c+Bk&PUO&HL-v%)19|V~b%cUzfWA5UtiS$_!&m8~yM6g)79}U(o=jTd zvY9<1JV4;#`(XCdDa+{AApF(CO4QtYj?2cMjE*IM7SF2~6mtv|=)%f3k??gpl>cx( zN?ZEz^xx0Nr>%!a{)^NJ)BNAuLL_Y4cyQNYkY(wNEG!Yi;UHO<ZoH;lxPd)e@VdYV z>a5OyqJ>F7%l3g#sB>;12#!Bh9MS;TZEvA0iR@H{Wf`@?>~NtBq41ajp)AZ&31O6W z<&l23O(+{3z*%T6UJkbf=os2BYP_q!w13@gx%Dk1#Oc#Ucmd+%lsHL{AK2YS7UA8m z3E^cZdT;}TLLy-zp=MF-``^#FOhr-nJF|C$Ip#10*v|IU4?%Qz-5AAB;ATxuc=#EP zvvB*))C72W5RIVA#Uk1KL)d}V^I2IJ!p7^b)90+P^w1%r6`nu6ma6-%yGo3q>-KfL z(_x%G&t>)kHvMHjJeP)#=AdMy7WHD`$oAO`Aw}PMZb**daxHYYP%w0~HI+Oa6P7dE zVV|&t@FxlQ|Lhu(7?ter;=#-Mg#kssd+f@%w0v#AHxwz`^bP-ZfD<=1KG^{KPR4M$ z$oBRMcfvm8ad_3ZPbd6aFF}FATb1pJrscA!JTXwWk>1%fb6PI!`cT%UX#T*tSXyMo ztL|hQwhh9F+^-{mfpK`J@|=H*Nc@55|3BqUB-F+FZv1*vr%UIaN5kLQzIa8`yG3tV zkYe$|tqwVCwBipP+yS>64h2A|ta}h}s&IYwAKbnHVafGp34p#El*6gz+2j1sFY6WW z#5l#`iIe|mEkwJ$%lVh+uzj?^(K~9iHIC~FLwK6x8t5M)1lO)l`At1eWnP_}VP{rj zU;W|TSj{1INNfE4u1k|M1O4ko2%&xAvY^7AcK}I|9oOSkNGw%uSHDzDO*}(JT>X=l zf+=`_iOZjvS82tlurz)lW_h_J;se%#e(?#i{&NxK7fct*BbxZ~X;2a+_wW5bubd$= zM-@Q@y?amUkWr%p-Z3WIc&?j|yMZ+NO8B3Z$Pz<GN<Oe)LQma!JHp}e^jju{R#3Df z)XAC@b0t~LJ<8&62SS99g4p?>evmHL))@+}YFOB+ilSCP%~g|*vVdCTBrwx}`8U{d z%ePjPu}&$9?^oMG=0F?-06j2ir5tn1_aF*vnG<pwSzZWKA#OO&2DZ<pp$bLEl?E_a z2$Lmb=kW&3m8H_A!!2B$Pkj@`XK#{3@1R;D6;Oyaq(BA7DIQhuy8oz(^wM>`xZb0^ z^!fA(e(+i(R7#mTLbal><`2#Mb5Zn1pX!T_cf`eI7nu|V3lsts7=BZVkMTY5HhbQF z^{jr5Q^m9D|FOwPM!Sj^xmqz{ZU<|lep|YW77AX02!hOUMvIw^ZZKhJZuqJUr{LhQ zv!cg$LHt*fL`(y3wy~(}(Rq)iAqco=zU!x24K6xZvD~ZZ)r!?s`a|N+2OyHCnt`3c z(K>BYZIc#Xj!@^7e{YT8oM9hoCCaeVcUW2|&z(ZfelOi2{xa;(=}r;Z319?IBAs1z z?f2gtNB^#Bdu69_%2j6`7|U<G@$mw{pyybL{9#U*8~aV1ckYtwybm0lT0X^O+C$QD z;nguKBvYq#(eKhX4lQQ1JXB?f7P2fOY;)B^RXhWCj()2<A;QylDQxPp64|$U$*1*y zYZxIsR_?=OPMJwun3z6Ox?P*p-bM3w6lEZ5%^pdw;3lgNj}}S3%nZ{{)5FYr`suz) zlKm)q_s}hw%_xbl*BkvV=uk-Dbk^ubLIXF~gi3v<zI_8va7>GFLXMzTA?pB=r(BD0 zd7PLDiCklKMdr5*pR50S9v_?|_KE~?ObaI~*(fy8EsetYAe*J$&uGA^D)pp<nO^tM z`!|)7#D;oDdz5grZWwCx9BH~$&DtHfmBe@s`!Ad7pr~zGEhW29VP<|vf@b0~G1Egi zRrXvr#F>*^wJ5>KiNc1Z4uaP;uRbMQtz_jW7~u3j8;s%FryrsO_i9fUwDsZ*WZP{U z)@-0UHueFg`b5}6kJYEQ^KtO6`=nlFo}eiZC+42^Fq1E+G$Rp`v`Px;71(IXw#d?q z3(%p*?4k32A%yQ(MuF=@gYSLMm5k_Pr*fR0i+mO?EIALu-2K+lvjSk?dR)2fIM>@# zr}IpXZ~K!cPXerHMbz>W_NTopb;#3$h)VQ)SkY5S-NoETXU<CA9~N^WGgj!n?k9xt z%~QpZI`*p%OBUn7pMmj&I+gNE=HnZvpD9d6a!HmM?oZBh1Ex>7)#!&$IKcN%%=zj$ zc<Tz}zjZ-zu9{0h;e%~?12wah&fV+t%I^?UAAK64LJof5bJC$^T^^CAx9!AEG@U1I ziMst%?gcP{=uM`JlT{T_2~!K`%#%~vtUsnIs)9<=FWsunhi|SX$L}PCS%@1Sf%R#Q zYb3=lYED-<4JkwAOPrf&S<bq{u9mY5)@$1ai~Jj*=z6$%2{9v~$6R}-i)6_#e?Vur z+I+*}te}Hhc?6K^AspN2s7*o?{Lh(b=uI$>>WVqR7zW<|-?Q5n=NpabI@NH&d}R=| zUBs|GMU<<3sJ+4v0LDTOYTi-hrM0|jwI8VRY77~h<JXrpK=I^w4T1K*t&gdeq8~%? zo(%QWt>@*&?L%BR&0QDvvq@JtwPtTdSYBhK%m?!`&gFG4ZNk#Ej7$3S@NlNfB7saG zFOW57VtTH&H%;DPwWI8l<~dyzV#1Q}Q4kE?gJ<Qb=es^>q-)4Ej=8lxWf?h_<Bm>; zd)ctMbhtm8GAr+De$WnM&o<u}X?d(?67JfcH4TZ`k6LfN=yk<9PmrmdkE~b-VXz`; zVcH+J97_H4D9z7gCk22SGau6`r=vyl+T?^mT>N09IpIJ?7i2<EOAoNACm=3Z$gFQq z6^>%5>dMH3wux3vmql&sv#0-;kH7pw_;33vEdkKXx}E>6`KMI6&v@eR6&(6_Bk?s= z9p3!^&c4C{8iDh{e_lua@1LiiQ|$5nwtsfXnkp~;WqQv4bHOJY`@DPV_vm!rC!y={ zg2(r5)t{!{QvK8CSFJcX-KWDnedcq@^y>C0)&Jpn-}~C09@P7~-^Ibd)Ncj-9&OvW zZ0-23!LUSFrGucA86?6nk%S4lTyKome62ZYZP5A&09_^OQO)r1ZO?9~lo?6iRy|&g zfzSB<D%12JXMkB&qn0UCtd(pH-Q^~N<ryB*q+pIdSb&$Wa&Ol6Tg|nb3d*5i*zpn3 zZ|^I0G*T8jMG^;+Y8{?YsRK|jWt?*FGO?7kBrEuFKXztYq1H@&9ZAX|fLGWE^lk)3 zqjhGMXkQtsxz`2E<grUgBQ;!(mJOlERwd8I6w<R1*4mS2h1%k8p<Ew3FfDKNTyJmk z(jMwDS`#bL$U55R)V76PKAzHkkIsVc2DR)2pY49Vgy)?Msx7XgRM3LAD?~kd&8#v4 zb?DWpa*k^m!N_`;)T-D$1H$Q2z?@+=IvUfML0L!}XcTcZg5@J09l$u{(5?PKbDlkM zK&5ev4iC}d<i)M3TTz@a-=Sbt@i+tC0%5fWm>|6d^=f@Mli5pD)aXW~Y%OX$O_23C zO^~o%*WD4-cP*T23az|B0v_c!S4~*)qB)1!XlawO+IpMB$Wd^$Em$GutwXo0b**{@ zE4cyUUUAJeg@e|XagPima-6E@GU|Ej_QU??CAgTPr7vo3T9XjvL(N%f*cK)}ilB6N zcHr)jL<zVR%QxPO)}EzxX7$`M0(o?DJ>#ME;qk>-sfWnO8uQ!~6z91!qBY2w_n|<d z0)%Gg(LY9^3v?2n5qHkBn3pg7h(PEQ8M180n+@fY<rT$NlW$0efIdyYoF|W<5-3{c zoGd0(7;^f-*iZdHTl{PmGI7~kn7t;LR(iUGXTj_mJ*M&f!E)<GUkhF`3LBj*=il9B zla`T9xfZk67Qo*wqS$wMrnLV3gLIp1M77`&i2_^H4oe%V8XBE27^?58sNW=>q^uJ5 zqzIBXyw@lB$+_-8L`_MK9$F$S+V{2WO#}-hSkH_Z^=CctQIfJjD?q9hNelYMXoS?L zyi0qek#wH$ru{Du4!U#bB{LhAP`Eb+Ca_U~U`hdrc3UE$J-U^LU`AIUtxsZaElpz9 zjPg4q*c0I-Xn3G$QF6p!|J9-|U#mo1H1bb-v1D|p5G5n{H4Z$gT#vq&Fsx{<V132p z4*QI}DilDEsm}CC5<<s5)Knl^tr9ji6Le01751#+ifOC!$d02tDDbS7hTcTomE1K5 zH5pomGf|2EMRK3ygSYpUL_S$rBNbZ>WCmWnO0s!A>LKClP6U~i6`&+ig@*%=EZ^z) zi(af#$n#EyvR4rAXt-zTNwip*c)&_6^?Ez2x13}jDqmfL&#GLW!J^h{Xu6j5XfEaJ z2s#x7bn@yipFYV4ujGrPnAVaw+kdyL7cGLZS+r{cx{{FYqEPG>{@`vFf(9&+BWNhA zas!a)Brusr$M>NZ;BfUiw5LMQjQn9rus%3xD}k(nRQ)DupN)XMam{<kg?=R|xP#zT z$mv2dX){743wK!ZNH<SWglU$#E3vO~n%`e$whmES5*wW^C{`kImmh{U23pzeHnA>P z2eylql=+UO+?vs*WznL&--JTFLlRa}zGzoUuNzDYFm@PGNgagraITb<gg|KZZ99^c zgV>Q4xavFAdYFX-@!gog*%%E}nyRoJh%sW2W@LRD!Xfhr(=$r4pj@3^qMn~&1U$#6 z6oF*Fqwk_^Wj}h;JH=DWx&sPW1vrfEOblz`Z%OWYq}t7U%HAO*hC|P!wr~MokwPAt zS!2hwth`fr0FM^?Z&n0$<XbPi*YGykGNP;`)UFBTT!2I74e61NySaMUEq61g9^Nrl zU7aXzu57KC&F&u?puQk*(z|Lv0FdrG<$HNoSLkZjDj!y?KU8sASD1nbl@k_ujOs~O zP#@$}t%e6yEl_yJ1ne5I?ciXwpzpseyW+8Yl+}?(g4{(4`py>4uA1FmZfKLlvACMl zHsuy=MfExTB1_So_p@WP;tW&kB(JMrW7WF+IuHU#OO=(+%Ioga*9wG&YDHQ)QC`Pt zh%nQiNUZ-a@(U6Y4*~WC>!2sVvo?fTefSy_CBcETXldDcdQ?8s?7rJWj?k)+BAr2~ zQAH$)>86%zHfKa+Pd|{CtJuoxJt|ZAHEG^ul|Pz=WOZ7b*6<4ZcR)r46L+q)j<9mj zqq7Q8&(_}+*I8AKg*pO@Oru=_srMj4*s>=2HDnayzSJaqcf~Sa1bXB7S&PFJyPv{w zyLQG&4B2@~?zMx=e&`JB&z8zKC}$kiQHz%&-CQ->6wah1x<CFOf(WIGdJZY;kXi;$ zGA-h5Ea`rL>~7tGQaCz`eY;z+yTHEUG)Yp~85`BX43ij(W~KC%(yVOCB$&D7ta)ZO zi!xgAW6%Ly!B$pzeF&IMW|IOxj<1luH$U1nl$_d7<0!ER9xc4r+pJokmLSz&)p$s~ zqYRjacvF!odlm(CBMXJ9rYZz@h9R?-^8IS`DVbM%<*>>u?Q*A?yuKhjP31lP8qr@v zW0;I<36|(BC9faS5Ya(o9z${*_0#IU|Ar08zbrA#$%?a+rV!61X|*0lXf#Y;)s%s@ zuS%x3VP9%Zi<3J)L0>pR#ER7}d1t3_Id^9Lc`R63d*g?e(M>u`%j@_7_CJwgRhNH| zzrOV?(0c(e@BOUT>vL=DegBH}d3OYqJpDI3?~>P%S0V3h-`yKzPI8w;tKQT~j{ZUN z>mOV^wbq*dK`A>g)&h7#tq%04$C5{0W=Kcmb9W5M=K3VSaW44Z?D=uJE|>dqiFe*4 z>@2H%SMDRi<-Xc~^!!D#J}*+tWhR%|9ewTQCmZ}5$J!e6l?Z$D<OGzF;PG9KRKXps z^B`|hVsh9(^mfOyh1{wGa)fb;Ub%XxH`{7u)N+O!d~`<Qd`C!!6tCqo?ek_lk=Ef& z7CSDd?I<m_JB9{)hm}a<)>;(2^B${x;YU7eu-5oYtPA?Hid2wo;R$`OlODXR3iV^} zzgn^0+^)(MRU|T@wR-Yv3p?R{ulX|{e{Z<qV8=kHB!7b<$NrtAItV>R-IQY(?dRhE zqe!H$j3m124$kO~D}D&xPR*0QxwG_?Idm6S^P+F=Av3j|zo!heMkL+tB4cdgn>$D! z*-Lk%`7qsy=G))gS%#?Fy0BsK%{^qxVOdW9@uVxsk6+GATmUb4n-jg#wgxDf(e_LA zP8aeyb$yD_x%s|My7}y~R-Jfv^t3Z3(;3XMyO$E{5ORl@m$l@Jju>xTO7%5^F3J>F z33(J`H2G6a0ni1WlqKX9&8h-WGz*^8J6g$Dzx(iXdKX>Rz4zJFCJ1;zD}uu3Stc1- zvnIuiZbFxajw|+FJ1Ej&MCXP@cWRj?<M2hUMGD<;Y2;*7_F~7$XpNzn9}K<-ctUfe zhCE<I3<+a3<bOUooYER%cSZ9MY{+4Gb!0;h`D?(?hTI2o)YyjHlUnqa(?`x<Y&z(7 z&H_n%W#A#B)8P|z$i_A`OAqk#0I)-{A$<*YhgaPp+rR0p?~wIB`>Vf+hpeeI@(?M} z!vT88WBb;3>LEoEqsIgJgv2ED9jRI=mmZvdNER0^+HPzjAaXBUJ#)Ky1tL$@Np%iH z9AJ9XecC9$)n61!ZbUX_OiR2!iW(k~%<0`b6p1B(L_Qt{M<7vXL?Y`Po`By2ND|r3 zVp|efizS*w!bK}1ZUQB8@2+J_-S)<1%ZW<lZGaKfmB<Q3%MuB5ozV?kB7L`)4MJZc zAE3M_D`O&6drvHaG84%>jvz0!7@Nr2b#oKxeewi!4U(D@36WhCC7GSb+pg(`DNm#y zrPI!ol|B&+1Bg&4^1yY3eJBT!5=Dx7Cml`~jUs0($D_!4B$kjAdFzEzrDiGez{zZ} z(i9=v2x;~ORb*q`G+2iAu0^3SSgs;Eu9#Q5?bq?-xn9Z}ohy`RMP7%y2hJg(^onG6 z&jb_(EV8n-3lB-Jr2P<PDx{Bj78&)^RwI+N$R`U5i;7E1xrkgUtE%yZn7l=bOXS4W zop6y~H-myhLc_u%BBP>XV&mcy5|ffsQq$5iGPAOCa`W;F3X6(MO3VJ>c~Mq%({}wZ zPV=&E`*B`(``@A0`vZUwjG!1!kQB|Z950BHtf-o9n3nCho*#r!oTOP^lvUldT|bP| zysX=PoY(FCklP5OIF*k6&*;p`kuz6z?mT$`M3_*<g;d&D=lMYx#YvjwMOoEN+x5dZ z&C9y&$9dh)`vD*XBPjNIe{h1NXolr@L6l@g)pWzOY{&KdAdKQ9&GMqG>Za}bVVve= z-S*?W?q?2joYS0_T|d(n!zNhBKRvw#xWP>u3!(lgJ8-{7Eku<1AtfUL@~94nQs#ch zXwC(Yy)+Hd;u~1`uq5@6S^IF_8cKM`(KT-npo6k^|AZ~_E%|L9p)kGl^~;K@R(eJ0 zX9>K~^uGG@6kG2!y!LCp?-9VYF~|p^K-r|T`ZX8ajPzt5FJIsTwrSt%EGJvurKJUs zeSR|NAByZaS@8;d==0%!9{Rr<1mG0VKSi~FNs?FObHO@m;6$&;C$b|Z(r=)VkUmgk z{KU~-nW!lQy>T}0_=%&VlB7hL31st>pEx2E-87a9Gni&~ypVP*=5jWaqjM@>=q<CZ zm}Hf{bWLov%sMJDd<9#0aLIkWYe$2$N!!APqqU)C#yG{qpJKMqTaVgYSe)tBBbGhJ zUqU{|+E08oG)}7hgv@}5svIXrKp&i98YV*Q|9R06YXB`335}&iGpes_qEm09QX!aJ z_P8!fo;5w!^k}gN5apkJQBUB;jtrJ`0r`}gqEj9QgM$EldHjGW;K`utxMgxmC14+e zcy7u1xPj=Z!Y5$iI!}?im+A%F3VMjPVS+Y3W4`F3VfwXaU;7MLUkvN?dRBdgT)JrZ z47a|>t<&k*^clQ&(eN3gx)_*V&#KRumM${`t5z)s*j<dAir~Xmtx)b@svlWUYoRt7 zIaT;==zEdA6X4q)U;EWdd5KOSgp?xJ%ml?)_Hx|{VuyD`XS}Ohv#RvAM=gHuyh8xB z9Nh(?i@_pfJW+|lGiX9C{B@NSC=ZAvG(qUTnsd^MXlB~wxtCqXhydTw>|TA`SCE!W zhd|!t5N_>Fw}N*QEpWjQ+N|<s$;*KV(N)Pz!|~r9u>E>i=Z(Vb+Xhg=VzPTMSk|$4 zV@i0kkN@w9psS)IDCc*%@Es^|J$EkT-kSMc>|&aSG;+YM0=J0Go54pNVg@zN)Yhi5 zmyrOaWdJn-W>8UVwvm;+j28B39*|{^QDNPR#){25-zG@PPAjUs_bGP>w{Eaq(|47F zONN^w(ndzQt#BE+BYIqc4p2kdln?z=<APOpFybQu%9q8!8-;<(RRiO>SBDEi4a+p& z0TNtbW&49Bb98TR;3%|5=i{pP2~JKMO2@dxn(Lu)M-|RV8H;?-F(2!-d~(X=Co7}K z-KNiKo#{t?I%ZFd3fD>DtjaC$qHJn(l;y0Ld`6aInIlBA9iA%=^|?JugBmswqN|c> zJ=_8mCCXSR`m`7t5bAB-KFTnFn>8oB$m#Ykk%iYrC}qEscD`;?>#*FXIv@1vi1Rvn zlx=*Ra+3H>Jj|fpTQ4dZXH6lE7P&AGqV^+$ul-F@v_0-BYmSLN^;CygWVZS6b`*Hm zAryFnk_dJWh7uMj5?3w~0irvm+b$}j#+e>cAiz|nli=UWrgr2V{ZG>;L{ch>OO=KN z+{tBBw0J&RJjyWxV*IX(beDkk3U!sKj5hyi1#tysA^2_+;UP&>5L?b`v3Up0@rRzv zfKv=vL|Y2XpcXS_-YHQsP6U+%rx+ZeEW@j#s^AoZL!ipw6eeh^gHwoi(N+jEs5lN( zC7fa~+Dc&tm5d10LZuYn2R5nJOOAEAbhxx$(%0$ou`ZxSPVJiE@5HdEA|eB%YgK<w z=->uuVy>rPxe!7*Op#(1y<;>7sXW1+{BYBB9E;8j4GFEg_PkvpmyqmW!3f6(33QG6 zSn!29Yqz60Yk6U>@Vi-ozsXAQb~C@HJ%>Q2L)jkv5R<F@JV%70H&<7x81f?qd5#Dr zj0OxoWl(%d*lL+|RLY?bW^2|P?cj|$#WYNmR!T<<BG3=My{wF!f~Omr0NchQr(Pno zh|oChm2x%s^XD@z)!+3mQSMsGN8z19)7VEvrMLwe<S?X_D0V}^gZ+|#Px(mni?0ga zuFniArciJek|R}y!6D$%J_pLc+m$C=7GyDUfHhG>M2L_ORJ+{)PBDoHZ4Lq22X@pX zVNk;Ch)MExKRCq@fe@vxdp5i5s7WO_fH0sm^AnebLaF8_OfzBA&5jx>5vs?o7CChl z3OEM#p&=n@@B~!RDS?rG*jB;2SagQ3(Tn$y^9AtG`w)e3A!KNv+7}#rVv1AIW?ZQl z8Tt8C%o2<wrOSUJ@J16{StRC;n#rt^+On}7U!IZ8uqRMav9mQ%b9{$PKYLlBv|j`K z&8o6>?g+}{CTpT*_rBv5cLjFd>SbHc?o}ku7Lzq)iJIVD4&m0Dl2A^U6Yldhor&~; zkzvRp4iw0A1gVNCbV3#q$S^oW(r3yb-Y&ivN>v>G*I<VNqq(R-QhXo8lb7^5*-=A} zlHGGoF^LFAF9ZqXG)Wk=`|OBG@-_!J#U$~lJjjF6&<UVmicTRPh?tv8me9i`oE1v= zuK$X@&Puzxw%3r+6pN%!@XX-q)lu<NDd|mRGyRYzSD8VrXL?5Y-@gN-7Rf;fc)dMF ztMwcnl?RnagsA!NaPUEbh0pREx{wiy^ByTF>;oT$zdavQ!v16y3w%73*3ohbbz-Oq zQ7P$=O&nDvLe#viRYaghn+1Bpe{eL<cXcBT5t7!UaY`!DE~sHJPbJn0>zFJcLewSr z71UAqVS*hs>q*fmzP2F&*w4@eAWwaZ@z2RY8iVvzm+7iN2>H@qMj?PDpQ;Cmee|nO zPBBCvVR0!H_AM4|k=p=hdD}X9ACYWI_V|_n%X|?uP4pRD1%Nb+gee3-CUakrKE%U5 zWr6dghYMY^3j%Elr)AbLU-G=EbbZ&hu*IlCRiTg3N><8D9^Q_}r_x08I!OPf8WEy> zYhjdgMmkd|1cUv{HFRT|-sUcQAKDpZH)=mL=41b7Mmev`$c{1P%}!{*&zJxDymvk& zB5<Ru*1@)KgI?G+LA^Z-*r8H#72bqWe0mGot+_*lX!y@UhkzRyl$jOHre|j4rZqbZ z&l|SQZz(o!L)46chSgG;1>M(YFhTyi&YC$iIB)J!OJ3QPk-b>kfm~%=`>-paBeArF zx+V4aJ)aY{dMs6^^uI~yuRDQuLjOBOGGWm?tdU6GnlLIQ)Y4M{7X>o>V9e))BZPIA z4@$&N9P?adH{mLCn5ptttqIVnN;w>pEP=uW=rcWDR~_Q2#T&Wqt_Y0+f%CQR<)_YZ z2tb~C8C*8$?PR2Wj+6&?z!9PUfu)#aa#N$;)Bn7NSTQ%Ll=Om1UGGv*M)(QWr>~4q zicc{pwL<GrtK*q9byBBN3MYhK&78g=4tCT8CG{7U2oYvj{N;dsy`TD+K@BrqmADg{ z!Yq4PZ)=`*--3%jrE}CQ-a)VAihM4hQm6Onx1f$|Fr^?{!*@&;A2Q$NeDQ>kGE63C z)HqW#>y^s!r*JNP*<dzvdRbSC)|BNaaXfaMQ4!j9!F<VRy|#rddlfA`gvf9(a6b{n z)q2!21B0@LMx|33C5QSH%%Da^^^`NRns@$C>M|v>p|SoArso|n0)6It@@UICy5dVt zy5zQnEe3UC*ftyHh0I#XZHtj+Cz)DXM_2sBIWB*<hBDUGQpvbBy{X+nudf`u^;Om| zXTbCgxn0~vA33cKrV{?C4pYv6OWkIUG6M_0L3-q15RZ>63>-Mc&{@>Iin4e8BCHWW zZOi0(kWs@(7c83Y5<8ICKopq67>U5+X+?x#z&SZUOM&exn<S1L{hzo;18*ef_V|i? zE@=Cu(*@9ea?3w7nF6^2AA07CLj}~fIGI$U0&AIdnQ*88TV`ZF&=e>?ahXuIfcXhC z38S-d%dE?V`#dfyA+wEjinB5OW`5!_TTtWr>w(f`;<JNqe&YB~rR{7eU3nOWk<Qz* zY3os&i4_ecTV`D@-1qF_t%OW{?c+L=lGS8t<02AEceoy#$tin*$xmE1l-?VD!W@20 z6%vr!mCu><2a?+FQZaj<mTf=rnZlee9WH8HW?d$q2ISsdth6mG^Ot&hA{bZhSKU|W zYe}XkY_|D{%Y^Dr8XWQyW>R*cwRP9C+9{OZeX(4uCyt>5DZ+MMggfzbyDkE8bhhN@ z_M4nyLu;=^0g?@E@`zY{ZlB3%DzBc6GXuHNw7;QKu#vU5BE*TG+gA}7J+eLBW&#S! z+fS7eQa-nr<dp2R_2f7q+e31klAfCX1V>48+uX-q#@<--E<!}Qy*XDY-8u!m=DRv- zkkxs+$tl>mc_v3BFwOcQKxWzeTvQDco>qBSYemuERC}rtuZ`XrG{8!i82e>n&s46w zQ64zu*;A@o1LT{Z&=<gjwc9G29lf=_Y;NJlmhm**M6MFYkN#yc#SZZ{zih$xc>J?F zlX2|~`u$3UXT`k0l)t|$&)a9<`spKodaPfO)Z;B~!ox|xDgLs8*I4<x>1IMH!UYSm zK8?l%ookp$wp%6(&ZiALwV!s;rU}oU6xw*a`Su0kxW26IVdgXPBz)dBpGAO!l(Ls= zDeMWnZM~s80L?~tC{gxuXz=c&vA6<e^pUvnyM0|{*0jdc3-G_+&pL}&cc9?l5vp1e z=<L8$M>NB#t2zyfbZ_Cxni<rZ(O!G=qvP@CVQAfwlhzwWD)xwXjMpvtdK8nWN72ur z_2o&3Luoq3lSF8O1#Wp~mhw)X%z>7&pRfdutFFR_d9d6@%jf_#>{q|;X)pc9sNrS; z$agt^R(FKU#6piJ4NjTW;Fy+cqSfPxTe~fCl{s>-Mh(A_`+lvhrz<p{Gv}{MDy;#S z&3#%nj6(o5*icsrL`Y%qdo{HUqocho?{xoQV#7?o`{#n8f5G0zT69Xoh*_oc?`gkZ z@Ov}tjWCrGG*9^XUNlpE*VQ;|8=!KC?U)Y--$+k*jK{uRH62GHELd3~Ei+eHC>F_J z#&uoR-2Gm+_Gy(vxw8>qH^#$6dZi%)m6GezrcBN^%yC1k9wbq^$Z2&5gui|BhO5kt z2}k4dJw+(5A6kI)SZ$CKFHq+A5fd=p=@4!snlYqO@^#>qg@?$<_Kkmy(mUp<3*^ei z8wN|A<M(oFO22Mlw0A1mQ@^NT*0IrP$1w!`7&KARIVgjt{$+`k`J1e>r+}XJg;ZNn z`%pOwP{B|s`8s&WKU{Iwh~AnA+}$}Q^1p%i3O9k1=pXvp_l>n!gpbF-eT}~R)P0(| zCAYzS*tAAZiTSv-{hr=qT&5coSn_Sq3tNa}J^~xA!kLN9c_%$9QgoK+bbFy23c@@} z0xV#uU)GM%1Py-Ow^^{063i$s)I7bVckHvH#zv~n2eA_t<v_jYUa$?PTnkI+dx_Fq zLfR!V^K9O4Z@rp*SA`yU7xKMUjlJ9ZE(${w)UCBrE)cIKeuT!JV+&p;SBJRjIeOHg zVZu!{0nP#PfUT==m02YNG9@WA&Wa)64S4%aUXwyk^%=@bQ}=qc{Z5B)YpOrhJ*S;C znS-lA?V|wwuBr97fcs$dY8{5Aqr(iI{&-WD&bdw67JczcJvdo(&kL%sEi-R2IKl$~ z^xS7H;P$3@8-m?HV?hDjU1V3Uce?K3dL@j&Jdj!Ta^wOz&6ulS+vtNmt6_$D_{iys zDp&;37dbdzQna4`VEe)OXzdqzL<D@;3$xcn$9PFrCKdwMzVx!M{Q)!$7Ji6P9t&Px zy^4Hj=_+$_9kF^VWfSj#hhS|R;lnk3v+wFmL$0d=T>sv)C%J|RTdUZWfG&5MT#8Mk z^ZPbLuI5|<#bBwZdh3?(-H*gwL*{t2;K!eVXrj)&I7zC<r1Cwhq0;a?kfZXgv9)I5 zqe_9e0#*YuEDn5K9}i*^q(BSR0W0o5QcNY?NJWca4U!Hr4jlVC6j2U-2d?~EVNt%& zj==Aa@XAx=qQoh}Rmsdqg-g@{P$`L$uR?dQAX+hJ9bfxi8hVBh0+6R(dY9e9{->No zpasnaPMN!cl_^<Uhph3K@^=<Or~IFJ;;Uqn0ada{5M9#r<jLMulAC-$wjX>nDPZXw zOWh2sLtJ#T7?!9LyoNn<&c570L%XLw%U*U(?k-boa#H~65I&OrrHAkZ(Pdt@ShMf# z=gqsb-v*ye56$R*m$S&;?=8Yo_z1E$+4zamF`y!$QVI%fp%5X4#a~)!C^0jGDzdBg z0$R)^kwcig<POb534%!1GwNGv5btcl2^T%%jxM5!&{Tbb+zWmjWVraNgav_olGfKo z!{!I8LtIJTxBfP)4)g#K9BIKlK#K|t3?(w<eF=@dwnd_aNYgYG{0bFz7Aws{@Ndpc zcvQAUr!+lLg;kH1z3ED&Yl38RnC(nRQxaPU7H5Yw*s`Zms)yk8qL3VX#{+q0l2E@I zD0)(!Uz<zx^4kLZW?5rsV1)4IhlnG$@!#k^A1@UUU9l!F;}jESacQ(GKJApcz7{qQ zXz*Lw$gRsNv~_)Jfthh+iTYzv&qGE|9W#*UA~vV2x+T>?%X;rafKUh)3ETGEH*a&$ zG)(ZLkz6!mDf017R~f}`FVwyTym()C?`tFW_&8T-=I)_H){$G=w?Qv#Az*$~9U&l+ z%)>;9j8LP56CJA1ts+D4v(Twrw}Nu*Jz8-=v<Wk)4WpN=Q7^y_E4Oti0I7$6)7ej0 zb%ySh*biNX=3}l~sd>C1Ehe^BJRSjYzHy3)Co!2xXGcwx(pcESC#M~DG*Hqww>iZ$ z3{R<7I-!yOA_7_9d@`2&6WRhFujw@uTJV{)Y)ZFVOP$m{M@BCPQ~Rm2sl)T;JNG7Z zwV4R9p8aHUFO_R4sNx4ZbcTK+T@$JIzioi(w>sx(80PTS@Kkx^Gzd>xo>AXIU35(( zi}ofFnxN0hqdnCjzNw~k04$tv%b=@_69Tf}YhP47=lS&Kl&66Eu!$C5O2Q&(L3laz zY{HJ#`wr`toM$2$wEqgE=#<dl|Dq?Z8$<%96P}6~-Ml_>{otc#hAj0bFMEl=jv5Fp z?GOv<DOn0z#!v1e(M!~~9w2b9lz`Lm2`FgPSzntY9Ssj5-SzC?jMS4XA0b5Xsa&p= z)RC$fL5{iTrSbOh-GsA)6e<mqJr$v0lekW!VH~)`QIQm#QZv$PZ+<GF^dzXSebH(^ z<ts~9rFYoU*l)K04cQt^P->V{Aw3_5#JJs;*5@ok%HXLQQ?+4K#9^!V0#1C;qt93K z_5kK5j`^wJ!@2dSWoAYl_NfiAkLlQ6(JAprk|S=8iM=Q*p3VH}$Bd$zsM%3den~iq zwuLPx6{S_%5dH*BgOnIEsPu#4g!qZ0N`Vr$_D$FH_|8z18~d1Q9FC^wl)y+oY^x+s zLM4W;acxWP9blQh<9Xt`Va5~KLc2kF8M1dqVY0m&swmQ{7XJKtvzNUjBn_VLX4L*~ zIVqJ+;<lQVW$%DsHjEtn$vZRk2I%cFe$teS0<m+-@zMc(-3FqUTi&C4nJ09VU>>~) zO)9Cc9bDRg06SB>C<hZl=%hqFpQhlFo{<jJI2b?}rpHgoC*Uo-coHK2-yYz}x~>9Q zwiSzfEtstzc>C~|?+p{Y{L#+=fGcW^rF?;D1V8>Hh$YVhh0-`B)O1o^YM~X~kf>&0 zGOOv`H#E^a%|Pu*OW&`{4EV`Q?*dO0uLvIPM=tO`PH7w{XxI}KL_F#$njA*-1*#87 zmxYdH@(F@}ve3P4KsexxlWJPP%9?QvAU|Q<`V?fYO4v~o8fl&}{?&tsE6$-XU1e^7 zF$1h<wt=84Ao@Y^F^8Wx9BR9dYs@TYgB$_>ZY{@<PjMnQMb$Fv$YP;q+%hT|seYyn zJMn#R>7I$3k0$&F9qULyARCJVs54p=)@*y{dpTYU|7^yO!7d+e0nc70t^&_3>3+sw zr(eAIP|KgLZq*<dU0D2Y5aKMq^H+^L0JjbS=BH9gG*KuxJLt7=3k4~BJ9U&{nQ&fG zqEaV`P(?dy_viqxDNrsW>6VXd_5q|7$@sfgIK|Xbgk}dp>IabsUvCHuIj&KFYV@G= z5Uh0#Fp^FBO2`-H?C=XmiPlgH`_4SCXQfbVOJX!GaV`@}Fa*Mo|4Ic}to-E8hyyI& z^3rnItOB$!VC?<F#5w^@@Q|=ca-rSdQNWZLR2^?k&@>Zn*l@QGZQRfmTrD(e`Pie` ze9PxX=^uPHJSNGsDoKF+9-4%LYu{D(^Sk-iy5C!~{WQVb*&aX>{R93tAUnvYDtm&D zP-P=SwZ8GLMceX@1GJ)HpAN9GXJ7X#LI~!3K$>^2YxoppjeaoK*a=qC4uk1K%r(!V z^%M2DYFQD;XTC@@%t4HwQ-&G1j+UaaZ5<%W^`07iRtN!c)P#n>5N-A5bZ^%b4v)o0 z1c>A#2rqKpGG6DO1sVBh@Y2Bwb%0K==Kxoawm}l3#dp{P<iBD*%3Iis596q?Z%<$p zONm@SP2U$w<Q0-Pc8Y|^4?g*n8Ab2%V=Or#gcB0};My<wy#9O&B@LT=Gq2WcC^#pZ zhM{6|ZYH~V-G8l{ZHniITNMKljZWUy+OAOUL$C|WgHq<dzwBeuKU6}vsM{rgoOL59 z1j>d7m}j80H$PnawX(t|q00!R{52Isd)Ki3rsYg?4Wq?neJydGSguj3`nIXSgzBO7 zGyL32RqbooDsskM{2W0``rezsg!n((tM=Pe7ysF!{*1V`pS9C|h4zcmrhTw)P?Y`w G0001yd~9+6 From 2c4a09417edb281dc400fedff57fc7b8b6b1cce1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 14:24:36 +0200 Subject: [PATCH 291/853] =?UTF-8?q?=F0=9F=93=8C=20[pagetop]=20Revisa=20dep?= =?UTF-8?q?endencias=20y=20"starters"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 26 +++++++++++++++----------- pagetop/STARTER.bin.Cargo.toml | 25 +++++++++++-------------- pagetop/STARTER.lib.Cargo.toml | 23 +++++++++++------------ pagetop/src/lib.rs | 2 -- 4 files changed, 37 insertions(+), 39 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index f96ea207..3443533a 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -21,6 +21,16 @@ categories = [ "web-programming", "development-tools", "gui" ] +[lib] +name = "pagetop" + +[features] +default = [] +database = ["sea-orm", "sea-schema"] +mysql = ["database", "sea-orm/sqlx-mysql"] +postgres = ["database", "sea-orm/sqlx-postgres"] +sqlite = ["database", "sea-orm/sqlx-sqlite"] + [dependencies] async-trait = "0.1.68" concat-string = "1.0.1" @@ -44,12 +54,12 @@ tracing-actix-web = "0.7.4" fluent-templates = "0.8.0" unic-langid = "0.9.1" -actix-web = "4.3.1" +actix-web = "4" actix-web-files = { package = "actix-files", version = "0.6.2" } actix-web-static-files = "4.0.1" static-files = "0.2.3" -pagetop-macros = { path = "../pagetop-macros", version = "0.0" } +pagetop-macros = { version = "0.0", path = "../pagetop-macros" } maud = { version = "0.25.0", features = ["actix-web"] } @@ -60,19 +70,13 @@ version = "0.11.3" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true + [dependencies.sea-schema] version = "0.11.0" optional = true -[features] -default = [] -database = ["sea-orm", "sea-schema"] -mysql = ["database", "sea-orm/sqlx-mysql"] -postgres = ["database", "sea-orm/sqlx-postgres"] -sqlite = ["database", "sea-orm/sqlx-sqlite"] - [dev-dependencies] tokio = { version = "1.28.1", features = ["macros", "rt-multi-thread"] } -[lib] -name = "pagetop" +[build-dependencies] +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index da5d40af..0683505f 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -6,22 +6,19 @@ edition = "2021" # Ver más claves y sus definiciones en # https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies.pagetop] -path = "../pagetop" -# Si requiere base de datos (MySql, Postgres y/o SQLite) añadir: -features = ["mysql"] -# features = ["postgres"] -# features = ["sqlite"] -# En cuyo caso habrá que deshabilitar las características predeterminadas: -default-features = false - [dependencies] -actix-web = "4.2.1" -# Para usar la macro html! (opcional): +actix-web = "4" +# Si requiere acceso a base de datos (mysql, postgres y/o sqlite): +pagetop = { version = "0.0", features = ["mysql"], default-features = false } +# pagetop = "0.0" (en otro caso) + +# Opcional. Para usar archivos y recursos binarios contenidos en el ejecutable: +static-files = "0.2.3" +# Opcional. Para usar la macro html!: maud = "0.25.0" -# Para serializar estructuras de datos (opcional): +# Opcional. Para serializar estructuras de datos: serde = { version = "1.0", features = ["derive"] } [build-dependencies] -# Para incluir archivos y recursos binarios en el ejecutable (opcional): -pagetop-build = { path = "../pagetop-build", version = "0.0" } +# Opcional. Para incluir archivos y recursos binarios en el ejecutable: +pagetop-build = "0.0" diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 7d396774..5d32ee71 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -1,24 +1,23 @@ [package] -name = "app" +name = "module" version = "0.1.0" edition = "2021" # Ver más claves y sus definiciones en # https://doc.rust-lang.org/cargo/reference/manifest.html -[dependencies.pagetop] -path = "../pagetop" -# Si requiere base de datos añadir: -features = ["database"] -# En cuyo caso habrá que deshabilitar las características predeterminadas: -default-features = false - [dependencies] -# Para usar la macro html! (opcional): +# Si requiere acceso a base de datos: +pagetop = { version = "0.0", features = ["database"], default-features = false } +# pagetop = "0.0" (en otro caso) + +# Opcional. Para usar archivos y recursos binarios contenidos en la librería: +static-files = "0.2.3" +# Opcional. Para usar la macro html!: maud = "0.25.0" -# Para serializar estructuras de datos (opcional): +# Opcional. Para serializar estructuras de datos: serde = { version = "1.0", features = ["derive"] } [build-dependencies] -# Para incluir archivos y recursos binarios en la propia librería (opcional): -pagetop-build = { path = "../pagetop-build", version = "0.0" } +# Opcional. Para incluir archivos y recursos binarios en la propia librería: +pagetop-build = "0.0" diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 1808868e..17a781f5 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -28,8 +28,6 @@ //! //! * Tipos de respuestas a peticiones web ([`response`]) //! -//! * Base de componentes, módulos y temas ([`base`]). -//! //! * Utilidades de carácter global ([`util`]). //! //! # 🚧 Advertencia From fc579fc29dad3511786a74835e3f1d5d41ad5aa8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 14:26:00 +0200 Subject: [PATCH 292/853] =?UTF-8?q?=F0=9F=9A=9A=20[pagetop]=20Recupera=20"?= =?UTF-8?q?favicon.ico"=20predeterminado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/build.rs | 3 +++ pagetop/src/core/basic.rs | 17 +++++++++++++++-- pagetop/static/theme/favicon.ico | Bin 0 -> 10206 bytes 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 pagetop/build.rs create mode 100644 pagetop/static/theme/favicon.ico diff --git a/pagetop/build.rs b/pagetop/build.rs new file mode 100644 index 00000000..b3903037 --- /dev/null +++ b/pagetop/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static/theme", "theme", None) +} diff --git a/pagetop/src/core/basic.rs b/pagetop/src/core/basic.rs index 11f566df..df0e6ec4 100644 --- a/pagetop/src/core/basic.rs +++ b/pagetop/src/core/basic.rs @@ -1,9 +1,14 @@ use crate::core::module::{ModuleTrait, ThemeStaticRef, ThemeTrait}; -use crate::pub_handle; +use crate::html::Favicon; +use crate::response::page::Page; +use crate::server; use crate::util::Handle; +use crate::{pub_handle, serve_static_files}; pub_handle!(THEME_BASIC); +include!(concat!(env!("OUT_DIR"), "/theme.rs")); + pub struct Basic; impl ModuleTrait for Basic { @@ -14,6 +19,14 @@ impl ModuleTrait for Basic { fn theme(&self) -> Option<ThemeStaticRef> { Some(&Basic) } + + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/theme", bundle_theme); + } } -impl ThemeTrait for Basic {} +impl ThemeTrait for Basic { + fn before_render_page(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); + } +} diff --git a/pagetop/static/theme/favicon.ico b/pagetop/static/theme/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..95e1affa748f69b77f95490649836e9861036325 GIT binary patch literal 10206 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 Yo2E{c#pzo8UZDq&kyMnZ6f+L`AAO+n{{R30 literal 0 HcmV?d00001 From ee46003c157b0955eba13c7d9bc6e0e7a7f592eb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 18:11:51 +0200 Subject: [PATCH 293/853] =?UTF-8?q?=F0=9F=8E=A8=20Incluye=20componentes=20?= =?UTF-8?q?base=20originales=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 9 +- pagetop-minimal/README.md | 3 +- pagetop-minimal/build.rs | 3 + pagetop-minimal/src/component.rs | 22 + pagetop-minimal/src/component/anchor.rs | 222 +++ pagetop-minimal/src/component/block.rs | 129 ++ pagetop-minimal/src/component/container.rs | 194 ++ pagetop-minimal/src/component/form_element.rs | 11 + .../src/component/form_element/button.rs | 183 ++ .../src/component/form_element/date.rs | 236 +++ .../src/component/form_element/form.rs | 164 ++ .../src/component/form_element/hidden.rs | 76 + .../src/component/form_element/input.rs | 357 ++++ pagetop-minimal/src/component/grid.rs | 4 + pagetop-minimal/src/component/grid/column.rs | 171 ++ pagetop-minimal/src/component/grid/row.rs | 114 ++ pagetop-minimal/src/component/heading.rs | 205 ++ pagetop-minimal/src/component/html.rs | 84 + pagetop-minimal/src/component/icon.rs | 94 + pagetop-minimal/src/component/image.rs | 111 ++ pagetop-minimal/src/component/paragraph.rs | 149 ++ pagetop-minimal/src/lib.rs | 15 +- pagetop-minimal/src/module.rs | 1 + pagetop-minimal/src/module/menu.rs | 21 + .../src/module/menu/locales/en-US/menu.ftl | 2 + .../src/module/menu/locales/es-ES/menu.ftl | 2 + .../static/icons/bootstrap-icons.css | 1705 +++++++++++++++++ .../static/icons/bootstrap-icons.woff | Bin 0 -> 137216 bytes .../static/icons/bootstrap-icons.woff2 | Bin 0 -> 102380 bytes 29 files changed, 4276 insertions(+), 11 deletions(-) create mode 100644 pagetop-minimal/build.rs create mode 100644 pagetop-minimal/src/component.rs create mode 100644 pagetop-minimal/src/component/anchor.rs create mode 100644 pagetop-minimal/src/component/block.rs create mode 100644 pagetop-minimal/src/component/container.rs create mode 100644 pagetop-minimal/src/component/form_element.rs create mode 100644 pagetop-minimal/src/component/form_element/button.rs create mode 100644 pagetop-minimal/src/component/form_element/date.rs create mode 100644 pagetop-minimal/src/component/form_element/form.rs create mode 100644 pagetop-minimal/src/component/form_element/hidden.rs create mode 100644 pagetop-minimal/src/component/form_element/input.rs create mode 100644 pagetop-minimal/src/component/grid.rs create mode 100644 pagetop-minimal/src/component/grid/column.rs create mode 100644 pagetop-minimal/src/component/grid/row.rs create mode 100644 pagetop-minimal/src/component/heading.rs create mode 100644 pagetop-minimal/src/component/html.rs create mode 100644 pagetop-minimal/src/component/icon.rs create mode 100644 pagetop-minimal/src/component/image.rs create mode 100644 pagetop-minimal/src/component/paragraph.rs create mode 100644 pagetop-minimal/src/module.rs create mode 100644 pagetop-minimal/src/module/menu.rs create mode 100644 pagetop-minimal/src/module/menu/locales/en-US/menu.ftl create mode 100644 pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl create mode 100644 pagetop-minimal/static/icons/bootstrap-icons.css create mode 100644 pagetop-minimal/static/icons/bootstrap-icons.woff create mode 100644 pagetop-minimal/static/icons/bootstrap-icons.woff2 diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index e4b69669..b7d8833a 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -7,13 +7,16 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Theme for PageTop with a minimal set of styles to view the basic composition of pages and \ - components.\ + Module for PageTop with a minimal set of components for page composition.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } +static-files = "0.2.3" maud = "0.25.0" + +[build-dependencies] +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-minimal/README.md b/pagetop-minimal/README.md index 7562929a..45400005 100644 --- a/pagetop-minimal/README.md +++ b/pagetop-minimal/README.md @@ -1,5 +1,4 @@ -Tema de prueba para **PageTop** con un conjunto mínimo de estilos para ver la composición básica de -páginas y componentes. +Proporciona un conjunto básico de componentes para la composición de páginas en **PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-minimal/build.rs b/pagetop-minimal/build.rs new file mode 100644 index 00000000..4e3488af --- /dev/null +++ b/pagetop-minimal/build.rs @@ -0,0 +1,3 @@ +fn main() -> std::io::Result<()> { + pagetop_build::bundle_resources("./static", "minimal", None) +} diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs new file mode 100644 index 00000000..781a47ee --- /dev/null +++ b/pagetop-minimal/src/component.rs @@ -0,0 +1,22 @@ +mod container; +pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; + +pub mod grid; + +mod html; +pub use html::{Html, COMPONENT_HTML}; +mod icon; +pub use icon::{Icon, COMPONENT_ICON}; +mod heading; +pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; +mod paragraph; +pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; +mod anchor; +pub use anchor::{Anchor, AnchorIcon, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; +mod block; +pub use block::{Block, COMPONENT_BLOCK}; +mod image; +pub use image::{Image, COMPONENT_IMAGE}; + +pub mod form_element; +pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs new file mode 100644 index 00000000..b2a59b5c --- /dev/null +++ b/pagetop-minimal/src/component/anchor.rs @@ -0,0 +1,222 @@ +use pagetop::prelude::*; + +use crate::component::Icon; + +pub_handle!(COMPONENT_ANCHOR); + +#[derive(Default)] +pub enum AnchorType { + #[default] + Link, + Button, + Location, +} + +#[derive(Default)] +pub enum AnchorTarget { + #[default] + Default, + Blank, + Parent, + Top, + Context(String), +} + +pub type AnchorIcon = ComponentsBundle; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Anchor { + weight : isize, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + anchor_type: AnchorType, + href : AttributeValue, + html : HtmlMarkup, + left_icon : AnchorIcon, + right_icon : AnchorIcon, + target : AnchorTarget, + template : String, +} + +impl ComponentTrait for Anchor { + fn new() -> Self { + Anchor::default() + } + + fn handle(&self) -> Handle { + COMPONENT_ANCHOR + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + #[rustfmt::skip] + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + let target = match &self.target() { + AnchorTarget::Blank => Some("_blank"), + AnchorTarget::Parent => Some("_parent"), + AnchorTarget::Top => Some("_top"), + AnchorTarget::Context(name) => Some(name.as_str()), + _ => None, + }; + html! { + a + id=[self.id().get()] + class=[self.classes().get()] + href=[self.href().get()] + target=[target] + { + (self.left_icon().render(rcx)) + span { (*self.html()) } + (self.right_icon().render(rcx)) + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Anchor { + pub fn link(href: &str, html: Markup) -> Self { + Anchor::new().with_href(href).with_html(html) + } + + pub fn button(href: &str, html: Markup) -> Self { + Anchor::new() + .with_type(AnchorType::Button) + .with_href(href) + .with_html(html) + } + + pub fn location(id: &str) -> Self { + Anchor::new().with_type(AnchorType::Location).with_id(id) + } + + // Anchor BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { + self.anchor_type = anchor_type; + self.classes.alter_value( + ClassesOp::SetDefault, + match self.anchor_type { + AnchorType::Button => "btn btn-primary", + _ => "", + }, + ); + self + } + + #[fn_builder] + pub fn alter_href(&mut self, href: &str) -> &mut Self { + self.href.alter_value(href); + self + } + + #[fn_builder] + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.html.markup = html; + self + } + + #[fn_builder] + pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { + self.left_icon.clear(); + self.left_icon.add(icon); + self + } + + #[fn_builder] + pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { + self.right_icon.clear(); + self.right_icon.add(icon); + self + } + + #[fn_builder] + pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { + self.target = target; + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Anchor GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn anchor_type(&self) -> &AnchorType { + &self.anchor_type + } + + pub fn href(&self) -> &AttributeValue { + &self.href + } + + pub fn html(&self) -> &Markup { + &self.html.markup + } + + pub fn left_icon(&self) -> &AnchorIcon { + &self.left_icon + } + + pub fn right_icon(&self) -> &AnchorIcon { + &self.right_icon + } + + pub fn target(&self) -> &AnchorTarget { + &self.target + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs new file mode 100644 index 00000000..8a18c613 --- /dev/null +++ b/pagetop-minimal/src/component/block.rs @@ -0,0 +1,129 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_BLOCK); + +hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Block { + weight : isize, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + title : AttributeValue, + components: ComponentsBundle, + template : String, +} + +impl ComponentTrait for Block { + fn new() -> Self { + Block::default().with_classes(ClassesOp::SetDefault, "block") + } + + fn handle(&self) -> Handle { + COMPONENT_BLOCK + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + let id = rcx.required_id::<Block>(self.id()); + html! { + div id=(id) class=[self.classes().get()] { + @if let Some(title) = self.title().get() { + h2 class="block-title" { (title) } + } + div class="block-body" { + (self.components().render(rcx)) + } + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Block { + // Block BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_title(&mut self, title: &str) -> &mut Self { + self.title.alter_value(title); + self + } + + #[fn_builder] + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Block GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn title(&self) -> &AttributeValue { + &self.title + } + + pub fn components(&self) -> &ComponentsBundle { + &self.components + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs new file mode 100644 index 00000000..2fdac21a --- /dev/null +++ b/pagetop-minimal/src/component/container.rs @@ -0,0 +1,194 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_CONTAINER); + +hook_before_render_component!(HOOK_BEFORE_RENDER_CONTAINER, Container); + +#[derive(Default)] +pub enum ContainerType { + #[default] + Wrapper, + Header, + Footer, + Main, + Section, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Container { + weight : isize, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + inner_classes : Classes, + container_type: ContainerType, + components : ComponentsBundle, + template : String, +} + +impl ComponentTrait for Container { + fn new() -> Self { + Container::default() + .with_classes(ClassesOp::SetDefault, "container") + .with_inner_classes(ClassesOp::SetDefault, "container") + } + + fn handle(&self) -> Handle { + COMPONENT_CONTAINER + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + match self.container_type() { + ContainerType::Header => html! { + header id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().render(rcx)) + } + } + }, + ContainerType::Footer => html! { + footer id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().render(rcx)) + } + } + }, + ContainerType::Main => html! { + main id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().render(rcx)) + } + } + }, + ContainerType::Section => html! { + section id=[self.id().get()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().render(rcx)) + } + } + }, + _ => html! { + div id=[self.id().get()] class=[self.classes().get()] { + (self.components().render(rcx)) + } + }, + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Container { + pub fn header() -> Self { + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "header"); + c.container_type = ContainerType::Header; + c + } + + pub fn footer() -> Self { + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "footer"); + c.container_type = ContainerType::Footer; + c + } + + pub fn main() -> Self { + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "main"); + c.container_type = ContainerType::Main; + c + } + + pub fn section() -> Self { + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "section"); + c.container_type = ContainerType::Section; + c + } + + // Container BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.inner_classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Container GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn inner_classes(&self) -> &Classes { + &self.inner_classes + } + + pub fn container_type(&self) -> &ContainerType { + &self.container_type + } + + pub fn components(&self) -> &ComponentsBundle { + &self.components + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/form_element.rs b/pagetop-minimal/src/component/form_element.rs new file mode 100644 index 00000000..bbd4e309 --- /dev/null +++ b/pagetop-minimal/src/component/form_element.rs @@ -0,0 +1,11 @@ +mod form; +pub use form::{Form, FormMethod, COMPONENT_FORM}; + +mod input; +pub use input::{Input, InputType, COMPONENT_INPUT}; +mod hidden; +pub use hidden::{Hidden, COMPONENT_HIDDEN}; +mod date; +pub use date::{Date, COMPONENT_DATE}; +mod button; +pub use button::{Button, ButtonType, COMPONENT_BUTTON}; diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs new file mode 100644 index 00000000..50c977c3 --- /dev/null +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -0,0 +1,183 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_BUTTON); + +#[derive(Default)] +pub enum ButtonType { + #[default] + Button, + Submit, + Reset, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Button { + weight : isize, + renderable : Renderable, + classes : Classes, + button_type: ButtonType, + name : AttributeValue, + value : AttributeValue, + autofocus : AttributeValue, + disabled : AttributeValue, + template : String, +} + +impl ComponentTrait for Button { + fn new() -> Self { + Button::default() + .with_classes(ClassesOp::SetDefault, "btn btn-primary") + .with_classes(ClassesOp::AddFirst, "form-button") + } + + fn handle(&self) -> Handle { + COMPONENT_BUTTON + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + let button_type = match self.button_type() { + ButtonType::Button => "button", + ButtonType::Submit => "submit", + ButtonType::Reset => "reset", + }; + let id = self.name().get().map(|name| concat_string!("edit-", name)); + html! { + button + type=(button_type) + id=[id] + class=[self.classes().get()] + name=[self.name().get()] + value=[self.value().get()] + autofocus=[self.autofocus().get()] + disabled=[self.disabled().get()] + { + @if let Some(value) = self.value().get() { (value) } + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Button { + pub fn with(value: &str) -> Self { + Button::new().with_value(value) + } + + pub fn submit(value: &str) -> Self { + let mut button = Button::new() + .with_classes(ClassesOp::Replace("form-button"), "form-submit") + .with_value(value); + button.button_type = ButtonType::Submit; + button + } + + pub fn reset(value: &str) -> Self { + let mut button = Button::new() + .with_classes(ClassesOp::Replace("form-button"), "form-reset") + .with_value(value); + button.button_type = ButtonType::Reset; + button + } + + // Button BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.alter_value(name); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.alter_value(value); + self + } + + #[fn_builder] + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { + self.autofocus.alter_value(match toggle { + true => "autofocus", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { + self.disabled.alter_value(match toggle { + true => "disabled", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Button GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn button_type(&self) -> &ButtonType { + &self.button_type + } + + pub fn name(&self) -> &AttributeValue { + &self.name + } + + pub fn value(&self) -> &AttributeValue { + &self.value + } + + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus + } + + pub fn disabled(&self) -> &AttributeValue { + &self.disabled + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs new file mode 100644 index 00000000..b742f56d --- /dev/null +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -0,0 +1,236 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_DATE); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Date { + weight : isize, + renderable : Renderable, + classes : Classes, + name : AttributeValue, + value : AttributeValue, + label : AttributeValue, + placeholder : AttributeValue, + autofocus : AttributeValue, + autocomplete: AttributeValue, + disabled : AttributeValue, + readonly : AttributeValue, + required : AttributeValue, + help_text : AttributeValue, + template : String, +} + +impl ComponentTrait for Date { + fn new() -> Self { + Date::default() + .with_classes(ClassesOp::SetDefault, "form-item") + .with_classes(ClassesOp::AddFirst, "form-type-date") + } + + fn handle(&self) -> Handle { + COMPONENT_DATE + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + let id = self.name().get().map(|name| concat_string!("edit-", name)); + html! { + div class=[self.classes().get()] { + @if let Some(label) = self.label().get() { + label class="form-label" for=[&id] { + (label) " " + @if self.required().get().is_some() { + span + class="form-required" + title="Este campo es obligatorio." { "*" } " "; + } + } + } + input + type="date" + id=[id] + class="form-control" + name=[self.name().get()] + value=[self.value().get()] + placeholder=[self.placeholder().get()] + autofocus=[self.autofocus().get()] + autocomplete=[self.autocomplete().get()] + readonly=[self.readonly().get()] + required=[self.required().get()] + disabled=[self.disabled().get()]; + @if let Some(help_text) = self.help_text().get() { + div class="form-text" { (help_text) } + } + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Date { + // Date BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.alter_value(name); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.alter_value(value); + self + } + + #[fn_builder] + pub fn alter_label(&mut self, label: &str) -> &mut Self { + self.label.alter_value(label); + self + } + + #[fn_builder] + pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { + self.placeholder.alter_value(placeholder); + self + } + + #[fn_builder] + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { + self.autofocus.alter_value(match toggle { + true => "autofocus", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { + self.autocomplete.alter_value(match toggle { + true => "", + false => "off", + }); + self + } + + #[fn_builder] + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { + self.disabled.alter_value(match toggle { + true => "disabled", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { + self.readonly.alter_value(match toggle { + true => "readonly", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_required(&mut self, toggle: bool) -> &mut Self { + self.required.alter_value(match toggle { + true => "required", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { + self.help_text.alter_value(help_text); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Date GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn name(&self) -> &AttributeValue { + &self.name + } + + pub fn value(&self) -> &AttributeValue { + &self.value + } + + pub fn label(&self) -> &AttributeValue { + &self.label + } + + pub fn placeholder(&self) -> &AttributeValue { + &self.placeholder + } + + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus + } + + pub fn autocomplete(&self) -> &AttributeValue { + &self.autocomplete + } + + pub fn disabled(&self) -> &AttributeValue { + &self.disabled + } + + pub fn readonly(&self) -> &AttributeValue { + &self.readonly + } + + pub fn required(&self) -> &AttributeValue { + &self.required + } + + pub fn help_text(&self) -> &AttributeValue { + &self.help_text + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs new file mode 100644 index 00000000..dd9ef100 --- /dev/null +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -0,0 +1,164 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_FORM); + +hook_before_render_component!(HOOK_BEFORE_RENDER_FORM, Form); + +#[derive(Default)] +pub enum FormMethod { + #[default] + Post, + Get, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Form { + weight : isize, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + action : AttributeValue, + charset : AttributeValue, + method : FormMethod, + elements : ComponentsBundle, + template : String, +} + +impl ComponentTrait for Form { + fn new() -> Self { + Form::default() + .with_classes(ClassesOp::SetDefault, "form") + .with_charset("UTF-8") + } + + fn handle(&self) -> Handle { + COMPONENT_FORM + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + let method = match self.method() { + FormMethod::Post => Some("post".to_owned()), + FormMethod::Get => None, + }; + html! { + form + id=[self.id().get()] + class=[self.classes().get()] + action=[self.action().get()] + method=[method] + accept-charset=[self.charset().get()] + { + div { (self.elements().render(rcx)) } + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Form { + // Form BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_action(&mut self, action: &str) -> &mut Self { + self.action.alter_value(action); + self + } + + #[fn_builder] + pub fn alter_charset(&mut self, charset: &str) -> &mut Self { + self.charset.alter_value(charset); + self + } + + #[fn_builder] + pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { + self.method = method; + self + } + + #[fn_builder] + pub fn alter_element(&mut self, element: impl ComponentTrait) -> &mut Self { + self.elements.add(element); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Form GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn action(&self) -> &AttributeValue { + &self.action + } + + pub fn charset(&self) -> &AttributeValue { + &self.charset + } + + pub fn method(&self) -> &FormMethod { + &self.method + } + + pub fn elements(&self) -> &ComponentsBundle { + &self.elements + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs new file mode 100644 index 00000000..14e4613c --- /dev/null +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -0,0 +1,76 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_HIDDEN); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Hidden { + weight: isize, + name : NameValue, + value : AttributeValue, +} + +impl ComponentTrait for Hidden { + fn new() -> Self { + Hidden::default() + } + + fn handle(&self) -> Handle { + COMPONENT_HIDDEN + } + + fn weight(&self) -> isize { + self.weight + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + let id = self.name().get().map(|name| concat_string!("value-", name)); + html! { + input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Hidden { + pub fn set(name: &str, value: &str) -> Self { + Hidden::new().with_name(name).with_value(value) + } + + // Hidden BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.alter_value(name); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.alter_value(value); + self + } + + // Hidden GETTERS. + + pub fn name(&self) -> &NameValue { + &self.name + } + + pub fn value(&self) -> &AttributeValue { + &self.value + } +} diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs new file mode 100644 index 00000000..7391754b --- /dev/null +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -0,0 +1,357 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_INPUT); + +#[derive(Default)] +pub enum InputType { + #[default] + Textfield, + Password, + Search, + Email, + Telephone, + Url, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Input { + weight : isize, + renderable : Renderable, + classes : Classes, + input_type : InputType, + name : NameValue, + value : AttributeValue, + label : AttributeValue, + size : Option<u16>, + minlength : Option<u16>, + maxlength : Option<u16>, + placeholder : AttributeValue, + autofocus : AttributeValue, + autocomplete: AttributeValue, + disabled : AttributeValue, + readonly : AttributeValue, + required : AttributeValue, + help_text : AttributeValue, + template : String, +} + +impl ComponentTrait for Input { + fn new() -> Self { + Input::default() + .with_classes(ClassesOp::SetDefault, "form-item") + .with_classes(ClassesOp::AddFirst, "form-type-textfield") + .with_size(Some(60)) + .with_maxlength(Some(128)) + } + + fn handle(&self) -> Handle { + COMPONENT_INPUT + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + #[rustfmt::skip] + fn default_render(&self, _: &mut RenderContext) -> Markup { + let type_input = match self.input_type() { + InputType::Textfield => "text", + InputType::Password => "password", + InputType::Search => "search", + InputType::Email => "email", + InputType::Telephone => "tel", + InputType::Url => "url", + }; + let id = self.name().get().map(|name| concat_string!("edit-", name)); + html! { + div class=[self.classes().get()] { + @if let Some(label) = self.label().get() { + label class="form-label" for=[&id] { + (label) " " + @if self.required().get().is_some() { + span + class="form-required" + title="Este campo es obligatorio." { "*" } " "; + } + } + } + input + type=(type_input) + id=[id] + class="form-control" + name=[self.name().get()] + value=[self.value().get()] + size=[self.size()] + minlength=[self.minlength()] + maxlength=[self.maxlength()] + placeholder=[self.placeholder().get()] + autofocus=[self.autofocus().get()] + autocomplete=[self.autocomplete().get()] + readonly=[self.readonly().get()] + required=[self.required().get()] + disabled=[self.disabled().get()]; + @if let Some(help_text) = self.help_text().get() { + div class="form-text" { (help_text) } + } + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Input { + pub fn textfield() -> Self { + Input::new() + } + + #[rustfmt::skip] + pub fn password() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-password", + ); + input.input_type = InputType::Password; + input + } + + #[rustfmt::skip] + pub fn search() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-search", + ); + input.input_type = InputType::Search; + input + } + + #[rustfmt::skip] + pub fn email() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-email" + ); + input.input_type = InputType::Email; + input + } + + #[rustfmt::skip] + pub fn telephone() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-telephone", + ); + input.input_type = InputType::Telephone; + input + } + + #[rustfmt::skip] + pub fn url() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield"), + "form-type-url" + ); + input.input_type = InputType::Url; + input + } + + // Input BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.alter_value(name); + self.alter_classes( + ClassesOp::SetDefault, + concat_string!("form-item form-item-", name).as_str(), + ); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.alter_value(value); + self + } + + #[fn_builder] + pub fn alter_label(&mut self, label: &str) -> &mut Self { + self.label.alter_value(label); + self + } + + #[fn_builder] + pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { + self.size = size; + self + } + + #[fn_builder] + pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { + self.minlength = minlength; + self + } + + #[fn_builder] + pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { + self.maxlength = maxlength; + self + } + + #[fn_builder] + pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { + self.placeholder.alter_value(placeholder); + self + } + + #[fn_builder] + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { + self.autofocus.alter_value(match toggle { + true => "autofocus", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { + self.autocomplete.alter_value(match toggle { + true => "", + false => "off", + }); + self + } + + #[fn_builder] + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { + self.disabled.alter_value(match toggle { + true => "disabled", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { + self.readonly.alter_value(match toggle { + true => "readonly", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_required(&mut self, toggle: bool) -> &mut Self { + self.required.alter_value(match toggle { + true => "required", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { + self.help_text.alter_value(help_text); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Input GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn input_type(&self) -> &InputType { + &self.input_type + } + + pub fn name(&self) -> &NameValue { + &self.name + } + + pub fn value(&self) -> &AttributeValue { + &self.value + } + + pub fn label(&self) -> &AttributeValue { + &self.label + } + + pub fn size(&self) -> Option<u16> { + self.size + } + + pub fn minlength(&self) -> Option<u16> { + self.minlength + } + + pub fn maxlength(&self) -> Option<u16> { + self.maxlength + } + + pub fn placeholder(&self) -> &AttributeValue { + &self.placeholder + } + + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus + } + + pub fn autocomplete(&self) -> &AttributeValue { + &self.autocomplete + } + + pub fn disabled(&self) -> &AttributeValue { + &self.disabled + } + + pub fn readonly(&self) -> &AttributeValue { + &self.readonly + } + + pub fn required(&self) -> &AttributeValue { + &self.required + } + + pub fn help_text(&self) -> &AttributeValue { + &self.help_text + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/grid.rs b/pagetop-minimal/src/component/grid.rs new file mode 100644 index 00000000..b85bf837 --- /dev/null +++ b/pagetop-minimal/src/component/grid.rs @@ -0,0 +1,4 @@ +mod row; +pub use row::{Row, COMPONENT_ROW}; +mod column; +pub use column::{Column, ColumnSize, COMPONENT_COLUMN}; diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs new file mode 100644 index 00000000..d27ac2c5 --- /dev/null +++ b/pagetop-minimal/src/component/grid/column.rs @@ -0,0 +1,171 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_COLUMN); + +hook_before_render_component!(HOOK_BEFORE_RENDER_COLUMN, Column); + +const SIZE__DEFAULT: &str = "col-md"; +const SIZE__1_OF_12: &str = "col-md-1"; +const SIZE__2_OF_12: &str = "col-md-2"; +const SIZE__3_OF_12: &str = "col-md-3"; +const SIZE__4_OF_12: &str = "col-md-4"; +const SIZE__5_OF_12: &str = "col-md-5"; +const SIZE__6_OF_12: &str = "col-md-6"; +const SIZE__7_OF_12: &str = "col-md-7"; +const SIZE__8_OF_12: &str = "col-md-8"; +const SIZE__9_OF_12: &str = "col-md-9"; +const SIZE_10_OF_12: &str = "col-md-10"; +const SIZE_11_OF_12: &str = "col-md-11"; +const SIZE_12_OF_12: &str = "col-md-12"; + +#[derive(Default)] +pub enum ColumnSize { + #[default] + Default, + Is1of12, + Is2of12, + Is3of12, + Is4of12, + Is5of12, + Is6of12, + Is7of12, + Is8of12, + Is9of12, + Is10of12, + Is11of12, + IsFull, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Column { + weight : isize, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + size : ColumnSize, + components: ComponentsBundle, + template : String, +} + +impl ComponentTrait for Column { + fn new() -> Self { + Column::default().with_classes(ClassesOp::SetDefault, SIZE__DEFAULT) + } + + fn handle(&self) -> Handle { + COMPONENT_COLUMN + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + html! { + div id=[self.id().get()] class=[self.classes().get()] { + (self.components().render(rcx)) + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Column { + // Column BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[rustfmt::skip] + #[fn_builder] + pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { + match size { + ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE__DEFAULT), + ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__1_OF_12), + ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__2_OF_12), + ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__3_OF_12), + ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__4_OF_12), + ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__5_OF_12), + ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__6_OF_12), + ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__7_OF_12), + ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__8_OF_12), + ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__9_OF_12), + ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), + ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), + ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), + }; + self.size = size; + self + } + + #[fn_builder] + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Column GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn size(&self) -> &ColumnSize { + &self.size + } + + pub fn components(&self) -> &ComponentsBundle { + &self.components + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs new file mode 100644 index 00000000..24d946cf --- /dev/null +++ b/pagetop-minimal/src/component/grid/row.rs @@ -0,0 +1,114 @@ +use pagetop::prelude::*; + +use crate::component::grid; + +pub_handle!(COMPONENT_ROW); + +hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Row { + weight : isize, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + columns : ComponentsBundle, + template : String, +} + +impl ComponentTrait for Row { + fn new() -> Self { + Row::default().with_classes(ClassesOp::SetDefault, "row") + } + + fn handle(&self) -> Handle { + COMPONENT_ROW + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn before_render(&mut self, rcx: &mut RenderContext) { + before_render_inline(self, rcx); + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + html! { + div id=[self.id().get()] class=[self.classes().get()] { + (self.columns().render(rcx)) + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Row { + // Row BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_column(&mut self, column: grid::Column) -> &mut Self { + self.columns.add(column); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Row GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn columns(&self) -> &ComponentsBundle { + &self.columns + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs new file mode 100644 index 00000000..5d138d48 --- /dev/null +++ b/pagetop-minimal/src/component/heading.rs @@ -0,0 +1,205 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_HEADING); + +#[derive(Default)] +pub enum HeadingType { + #[default] + H1, + H2, + H3, + H4, + H5, + H6, +} + +#[derive(Default)] +pub enum HeadingDisplay { + #[default] + Normal, + XxLarge, + Large, + Medium, + Small, + XxSmall, + Subtitle, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Heading { + weight : isize, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + heading_type: HeadingType, + html : HtmlMarkup, + display : HeadingDisplay, + template : String, +} + +impl ComponentTrait for Heading { + fn new() -> Self { + Heading::default() + } + + fn handle(&self) -> Handle { + COMPONENT_HEADING + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + let id = self.id().get(); + let classes = self.classes().get(); + html! { @match &self.heading_type() { + HeadingType::H1 => h1 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (*self.html()) }, + }} + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Heading { + pub fn h1(html: Markup) -> Self { + Heading::new() + .with_heading_type(HeadingType::H1) + .with_html(html) + } + + pub fn h2(html: Markup) -> Self { + Heading::new() + .with_heading_type(HeadingType::H2) + .with_html(html) + } + + pub fn h3(html: Markup) -> Self { + Heading::new() + .with_heading_type(HeadingType::H3) + .with_html(html) + } + + pub fn h4(html: Markup) -> Self { + Heading::new() + .with_heading_type(HeadingType::H4) + .with_html(html) + } + + pub fn h5(html: Markup) -> Self { + Heading::new() + .with_heading_type(HeadingType::H5) + .with_html(html) + } + + pub fn h6(html: Markup) -> Self { + Heading::new() + .with_heading_type(HeadingType::H6) + .with_html(html) + } + + // Heading BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { + self.heading_type = heading_type; + self + } + + #[fn_builder] + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.html.markup = html; + self + } + + #[rustfmt::skip] + #[fn_builder] + pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { + self.display = display; + self.classes.alter_value( + ClassesOp::SetDefault, + match &self.display() { + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::Large => "display-3", + HeadingDisplay::Medium => "display-4", + HeadingDisplay::Small => "display-5", + HeadingDisplay::XxSmall => "display-6", + HeadingDisplay::Normal => "", + HeadingDisplay::Subtitle => "", + }, + ); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Paragraph GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn heading_type(&self) -> &HeadingType { + &self.heading_type + } + + pub fn html(&self) -> &Markup { + &self.html.markup + } + + pub fn display(&self) -> &HeadingDisplay { + &self.display + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/html.rs b/pagetop-minimal/src/component/html.rs new file mode 100644 index 00000000..468340ad --- /dev/null +++ b/pagetop-minimal/src/component/html.rs @@ -0,0 +1,84 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_HTML); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Html { + weight : isize, + renderable: Renderable, + html : HtmlMarkup, + template : String, +} + +impl ComponentTrait for Html { + fn new() -> Self { + Html::default() + } + + fn handle(&self) -> Handle { + COMPONENT_HTML + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + html! { (*self.html()) } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Html { + pub fn with(html: Markup) -> Self { + Html::new().with_html(html) + } + + // Html BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.html.markup = html; + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Html GETTERS. + + pub fn html(&self) -> &Markup { + &self.html.markup + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs new file mode 100644 index 00000000..f5553bde --- /dev/null +++ b/pagetop-minimal/src/component/icon.rs @@ -0,0 +1,94 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_ICON); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Icon { + weight : isize, + renderable: Renderable, + icon_name : String, + classes : Classes, +} + +impl ComponentTrait for Icon { + fn new() -> Self { + Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") + } + + fn handle(&self) -> Handle { + COMPONENT_ICON + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn before_render(&mut self, rcx: &mut RenderContext) { + rcx.alter(ContextOp::AddStyleSheet( + StyleSheet::located("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), + )); + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + html! { i class=[self.classes().get()] {}; } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Icon { + pub fn with(icon_name: &str) -> Self { + Icon::new().with_icon_name(icon_name) + } + + // Icon BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { + self.icon_name = name.to_owned(); + self.alter_classes( + ClassesOp::SetDefault, + concat_string!("bi-", self.icon_name).as_str(), + ); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + // Icon GETTERS. + + pub fn icon_name(&self) -> &str { + self.icon_name.as_str() + } + + pub fn classes(&self) -> &Classes { + &self.classes + } +} diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs new file mode 100644 index 00000000..fd15654e --- /dev/null +++ b/pagetop-minimal/src/component/image.rs @@ -0,0 +1,111 @@ +use pagetop::prelude::*; + +pub_handle!(COMPONENT_IMAGE); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Image { + weight : isize, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + source : AttributeValue, + template : String, +} + +impl ComponentTrait for Image { + fn new() -> Self { + Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") + } + + fn handle(&self) -> Handle { + COMPONENT_IMAGE + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + html! { + img + src=[self.source().get()] + id=[self.id().get()] + class=[self.classes().get()]; + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Image { + pub fn with(source: &str) -> Self { + Image::new().with_source(source) + } + + // Image BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_source(&mut self, source: &str) -> &mut Self { + self.source.alter_value(source); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Image GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn source(&self) -> &AttributeValue { + &self.source + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs new file mode 100644 index 00000000..ef55df0c --- /dev/null +++ b/pagetop-minimal/src/component/paragraph.rs @@ -0,0 +1,149 @@ +use pagetop::prelude::*; + +use crate::component::Html; + +pub_handle!(COMPONENT_PARAGRAPH); + +#[derive(Default)] +pub enum ParagraphDisplay { + #[default] + Normal, + XxLarge, + Large, + Medium, + Small, + XxSmall, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Paragraph { + weight : isize, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + components: ComponentsBundle, + display : ParagraphDisplay, + template : String, +} + +impl ComponentTrait for Paragraph { + fn new() -> Self { + Paragraph::default() + } + + fn handle(&self) -> Handle { + COMPONENT_PARAGRAPH + } + + fn weight(&self) -> isize { + self.weight + } + + fn is_renderable(&self, rcx: &RenderContext) -> bool { + (self.renderable.check)(rcx) + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + html! { + p + id=[self.id().get()] + class=[self.classes().get()] + { + (self.components().render(rcx)) + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Paragraph { + pub fn with(html: Markup) -> Self { + Paragraph::new().with_component(Html::with(html)) + } + + // Paragraph BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, weight: isize) -> &mut Self { + self.weight = weight; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { + self.components.add(component); + self + } + + #[rustfmt::skip] + #[fn_builder] + pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { + self.display = display; + self.classes.alter_value( + ClassesOp::SetDefault, + match &self.display() { + ParagraphDisplay::XxLarge => "fs-2", + ParagraphDisplay::Large => "fs-3", + ParagraphDisplay::Medium => "fs-4", + ParagraphDisplay::Small => "fs-5", + ParagraphDisplay::XxSmall => "fs-6", + ParagraphDisplay::Normal => "", + }, + ); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Paragraph GETTERS. + + pub fn id(&self) -> &IdentifierValue { + &self.id + } + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn components(&self) -> &ComponentsBundle { + &self.components + } + + pub fn display(&self) -> &ParagraphDisplay { + &self.display + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 15c6c3a2..690f0faf 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -1,17 +1,20 @@ use pagetop::prelude::*; -pub_handle!(THEME_MINIMAL); +pub mod component; +pub mod module; + +pub_handle!(MODULE_MINIMAL); + +include!(concat!(env!("OUT_DIR"), "/minimal.rs")); pub struct Minimal; impl ModuleTrait for Minimal { fn handle(&self) -> Handle { - THEME_MINIMAL + MODULE_MINIMAL } - fn theme(&self) -> Option<ThemeStaticRef> { - Some(&Minimal) + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + serve_static_files!(cfg, "/minimal", bundle_minimal); } } - -impl ThemeTrait for Minimal {} diff --git a/pagetop-minimal/src/module.rs b/pagetop-minimal/src/module.rs new file mode 100644 index 00000000..b9a0e3e0 --- /dev/null +++ b/pagetop-minimal/src/module.rs @@ -0,0 +1 @@ +pub mod menu; diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs new file mode 100644 index 00000000..64d568e9 --- /dev/null +++ b/pagetop-minimal/src/module/menu.rs @@ -0,0 +1,21 @@ +use pagetop::prelude::*; + +pub_handle!(MODULE_MENU); + +pub_locale!("src/module/menu/locales"); + +pub struct Menu; + +impl ModuleTrait for Menu { + fn handle(&self) -> Handle { + MODULE_MENU + } + + fn name(&self) -> String { + l("module_name") + } + + fn description(&self) -> Option<String> { + Some(l("module_description")) + } +} diff --git a/pagetop-minimal/src/module/menu/locales/en-US/menu.ftl b/pagetop-minimal/src/module/menu/locales/en-US/menu.ftl new file mode 100644 index 00000000..b35e9677 --- /dev/null +++ b/pagetop-minimal/src/module/menu/locales/en-US/menu.ftl @@ -0,0 +1,2 @@ +module_name = Menu +module_description = ... diff --git a/pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl b/pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl new file mode 100644 index 00000000..a36de8ac --- /dev/null +++ b/pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl @@ -0,0 +1,2 @@ +module_name = Menú +module_description = ... diff --git a/pagetop-minimal/static/icons/bootstrap-icons.css b/pagetop-minimal/static/icons/bootstrap-icons.css new file mode 100644 index 00000000..9a7d8ae2 --- /dev/null +++ b/pagetop-minimal/static/icons/bootstrap-icons.css @@ -0,0 +1,1705 @@ +@font-face { + font-family: "bootstrap-icons"; + src: url("bootstrap-icons.woff2?ver=1.8.2") format("woff2"), + url("bootstrap-icons.woff?ver=1.8.2") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-display: block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-1::before { content: "\f2a5"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-1::before { content: "\f68a"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-1::before { content: "\f68d"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-1::before { content: "\f690"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-1::before { content: "\f695"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-1::before { content: "\f698"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-mortorboard-fill::before { content: "\f6a2"; } +.bi-mortorboard::before { content: "\f6a3"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-1::before { content: "\f6b6"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash-1::before { content: "\f6c2"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport-1::before { content: "\f6e0"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-ssd-fill::before { content: "\f6ed"; } +.bi-ssd::before { content: "\f6ee"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt-1::before { content: "\f759"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls-1::before { content: "\f769"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/pagetop-minimal/static/icons/bootstrap-icons.woff b/pagetop-minimal/static/icons/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..4cd66b71ad5f51be58843c52c66f78a8f7b89e47 GIT binary patch literal 137216 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 NrT!1{z<Eso003f9u}}a2 literal 0 HcmV?d00001 diff --git a/pagetop-minimal/static/icons/bootstrap-icons.woff2 b/pagetop-minimal/static/icons/bootstrap-icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..de01cad9d15e664cde293ac71d80f5cb2e0c1860 GIT binary patch literal 102380 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 G0001yd~9+6 literal 0 HcmV?d00001 From c657970b5acb9ea29d48c4f9364a790c191eff73 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 18:15:57 +0200 Subject: [PATCH 294/853] =?UTF-8?q?=F0=9F=8D=B1=20Incorpora=20el=20conjunt?= =?UTF-8?q?o=20"minimal"=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 5 +++-- pagetop-admin/src/lib.rs | 5 ++++- pagetop-admin/src/summary.rs | 1 + pagetop-bulmix/Cargo.toml | 7 ++++--- pagetop-bulmix/src/lib.rs | 6 +++++- pagetop-homedemo/Cargo.toml | 5 +++-- pagetop-homedemo/src/lib.rs | 5 +++++ pagetop-user/Cargo.toml | 3 ++- pagetop-user/src/lib.rs | 5 +++++ 9 files changed, 32 insertions(+), 10 deletions(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 05ed0f19..f40397c7 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -15,6 +15,7 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } -pagetop-megamenu = { path = "../pagetop-megamenu", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } +pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } +pagetop-megamenu = { version = "0.0", path = "../pagetop-megamenu" } maud = "0.25.0" diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 89cfdaa4..fbd906cc 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -22,7 +22,10 @@ impl ModuleTrait for Admin { } fn dependencies(&self) -> Vec<ModuleStaticRef> { - vec![&pagetop_megamenu::MegaMenu] + vec![ + &pagetop_minimal::Minimal, + &pagetop_megamenu::MegaMenu + ] } fn actions(&self) -> Vec<HookAction> { diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 4058bd2b..f73078e6 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,5 +1,6 @@ use super::l; use pagetop::prelude::*; +use pagetop_minimal::component::*; use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index b3353cbc..a39e147c 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -14,10 +14,11 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } -pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } +pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } +pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" maud = "0.25.0" [build-dependencies] -pagetop-build = { path = "../pagetop-build", version = "0.0" } +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 8c7f1e96..5dbd14b7 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,4 +1,5 @@ use pagetop::prelude::*; +use pagetop_minimal::component::*; pub_handle!(THEME_BULMIX); @@ -16,7 +17,10 @@ impl ModuleTrait for Bulmix { } fn dependencies(&self) -> Vec<ModuleStaticRef> { - vec![&pagetop_jquery::JQuery] + vec![ + &pagetop_jquery::JQuery, + &pagetop_minimal::Minimal, + ] } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 9afed5da..a1b4f681 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -14,9 +14,10 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } +pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" maud = "0.25.0" [build-dependencies] -pagetop-build = { path = "../pagetop-build", version = "0.0" } +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index b2f9cdea..24f9093f 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,4 +1,5 @@ use pagetop::prelude::*; +use pagetop_minimal::component::*; pub_handle!(MODULE_DEMOHOME); @@ -21,6 +22,10 @@ impl ModuleTrait for HomeDemo { Some(l("module_description")) } + fn dependencies(&self) -> Vec<ModuleStaticRef> { + vec![&pagetop_minimal::Minimal] + } + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { serve_static_files!(cfg, "/homedemo", bundle_homedemo); cfg.route("/", server::web::get().to(demo)); diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 7810794c..afdb4338 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -15,5 +15,6 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } +pagetop = { version = "0.0", path = "../pagetop", features = ["database"], default-features = false } +pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 845928fd..965b1ca0 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,4 +1,5 @@ use pagetop::prelude::*; +use pagetop_minimal::component::*; pub_handle!(MODULE_USER); @@ -21,6 +22,10 @@ impl ModuleTrait for User { Some(l("module_description")) } + fn dependencies(&self) -> Vec<ModuleStaticRef> { + vec![&pagetop_minimal::Minimal] + } + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { cfg.route("/user/login", server::web::get().to(login)); } From 05d15b66480f96d49444e94f9584def7f4c7a360 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 18:19:57 +0200 Subject: [PATCH 295/853] =?UTF-8?q?=F0=9F=8E=A8=20Reestructuraci=C3=B3n=20?= =?UTF-8?q?seg=C3=BAn=20componentes=20"minimal"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 11 ++++++----- README.md | 28 +++++++++++++++------------- drust/Cargo.toml | 21 ++++++++++----------- drust/config/local.toml | 1 - drust/src/main.rs | 9 ++++----- pagetop-aliner/Cargo.toml | 4 ++-- pagetop-bootsier/Cargo.toml | 6 +++--- pagetop-bootsier/src/lib.rs | 6 +++--- pagetop-jquery/Cargo.toml | 4 ++-- pagetop-megamenu/Cargo.toml | 6 +++--- pagetop-node/Cargo.toml | 2 +- 11 files changed, 49 insertions(+), 49 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0f0a32eb..ea843974 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,15 +8,16 @@ members = [ "pagetop-jquery", "pagetop-homedemo", "pagetop-megamenu", + # Components. + "pagetop-minimal", + # Themes. + "pagetop-aliner", + "pagetop-bootsier", + "pagetop-bulmix", # Modules. "pagetop-admin", "pagetop-user", "pagetop-node", - # Themes. - "pagetop-minimal", - "pagetop-aliner", - "pagetop-bootsier", - "pagetop-bulmix", ] exclude = [ diff --git a/README.md b/README.md index a1fbff0c..c599a7d4 100644 --- a/README.md +++ b/README.md @@ -52,23 +52,13 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: * **[pagetop-homedemo](https://github.com/manuelcillero/pagetop/tree/main/pagetop-homedemo)**, módulo que muestra una página de inicio de demostración para presentar **PageTop**. -## Módulos +## Componentes -* **[pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin)**, módulo que - proporciona a otros módulos un lugar común donde presentar a los administradores sus opciones de - configuración. - -* **[pagetop-user](https://github.com/manuelcillero/pagetop/tree/main/pagetop-user)**, módulo para - añadir gestión de usuarios, roles, permisos y sesiones en aplicaciones desarrolladas con PageTop. - -* **[pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node)**, módulo para - crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. +* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, + proporciona un conjunto básico de componentes para la composición de páginas. ## Temas -* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, tema de - prueba con un conjunto mínimo de estilos para ver la composición básica de páginas y componentes. - * **[pagetop-aliner](https://github.com/manuelcillero/pagetop/tree/main/pagetop-aliner)**, tema de prueba con un conjunto básico de estilos que delimita con cajas los elementos HTML para visualizar esquemáticamente la composición de páginas y componentes. @@ -81,6 +71,18 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: utiliza el *framework* [Bulma](https://bulma.io/) para la composición de páginas y visualización de componentes. +## Módulos + +* **[pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin)**, módulo que + proporciona a otros módulos un lugar común donde presentar a los administradores sus opciones de + configuración. + +* **[pagetop-user](https://github.com/manuelcillero/pagetop/tree/main/pagetop-user)**, módulo para + añadir gestión de usuarios, roles, permisos y sesiones en aplicaciones desarrolladas con PageTop. + +* **[pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node)**, módulo para + crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. + ## Aplicación * **[drust](https://github.com/manuelcillero/pagetop/tree/main/drust)**, es una aplicación diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 8a6d2eaf..2424625c 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -14,15 +14,14 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -actix-web = "4.3.1" -pagetop = { path = "../pagetop", version = "0.0", features = ["mysql"], default-features = false } -# Modules. -pagetop-homedemo = { path = "../pagetop-homedemo", version = "0.0" } -pagetop-admin = { path = "../pagetop-admin", version = "0.0" } -pagetop-user = { path = "../pagetop-user", version = "0.0" } -pagetop-node = { path = "../pagetop-node", version = "0.0" } +actix-web = "4" +pagetop = { version = "0.0", path = "../pagetop", features = ["mysql"], default-features = false } # Themes. -pagetop-minimal = { path = "../pagetop-minimal", version = "0.0" } -pagetop-aliner = { path = "../pagetop-aliner", version = "0.0" } -pagetop-bootsier = { path = "../pagetop-bootsier", version = "0.0" } -pagetop-bulmix = { path = "../pagetop-bulmix", version = "0.0" } +pagetop-aliner = { version = "0.0", path = "../pagetop-aliner" } +pagetop-bootsier = { version = "0.0", path = "../pagetop-bootsier" } +pagetop-bulmix = { version = "0.0", path = "../pagetop-bulmix" } +# Modules. +pagetop-homedemo = { version = "0.0", path = "../pagetop-homedemo" } +pagetop-admin = { version = "0.0", path = "../pagetop-admin" } +pagetop-user = { version = "0.0", path = "../pagetop-user" } +pagetop-node = { version = "0.0", path = "../pagetop-node" } diff --git a/drust/config/local.toml b/drust/config/local.toml index 8bf0fa36..be142ade 100644 --- a/drust/config/local.toml +++ b/drust/config/local.toml @@ -1,6 +1,5 @@ [app] #theme = "Aliner" -#theme = "Minimal" theme = "Bootsier" #theme = "Bulmix" language = "es-ES" diff --git a/drust/src/main.rs b/drust/src/main.rs index f2698e93..408e2e03 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -11,16 +11,15 @@ impl ModuleTrait for Drust { fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![ + // Themes. + &pagetop_aliner::Aliner, + &pagetop_bootsier::Bootsier, + &pagetop_bulmix::Bulmix, // Modules. &pagetop_homedemo::HomeDemo, &pagetop_admin::Admin, &pagetop_user::User, &pagetop_node::Node, - // Themes. - &pagetop_minimal::Minimal, - &pagetop_aliner::Aliner, - &pagetop_bootsier::Bootsier, - &pagetop_bulmix::Bulmix, ] } diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index 5d0ba9fc..c49e432c 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -15,9 +15,9 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } static-files = "0.2.3" maud = "0.25.0" [build-dependencies] -pagetop-build = { path = "../pagetop-build", version = "0.0" } +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 50b628d6..e26bfa37 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -14,10 +14,10 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } -pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } +pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } static-files = "0.2.3" maud = "0.25.0" [build-dependencies] -pagetop-build = { path = "../pagetop-build", version = "0.0" } +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 9432fb9d..8edc582e 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -42,8 +42,8 @@ impl ThemeTrait for Bootsier { pagetop_jquery::JQuery::add_jquery(page.context()); } - fn error_404_not_found(&self) -> Container { - Container::new().with_component(Html::with(html! { + fn error_404_not_found(&self) -> HtmlMarkup { + HtmlMarkup::new().with(html! { div class="jumbotron" { div class="media" { img @@ -66,6 +66,6 @@ impl ThemeTrait for Bootsier { } } } - })) + }) } } diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index 6fdb652e..f3aba4e2 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -15,8 +15,8 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } static-files = "0.2.3" [build-dependencies] -pagetop-build = { path = "../pagetop-build", version = "0.0" } +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index c203b9fa..30cbf739 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -14,10 +14,10 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0" } -pagetop-jquery = { path = "../pagetop-jquery", version = "0.0" } +pagetop = { version = "0.0", path = "../pagetop" } +pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } static-files = "0.2.3" maud = "0.25.0" [build-dependencies] -pagetop-build = { path = "../pagetop-build", version = "0.0" } +pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 4018d5c2..6955271c 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -15,4 +15,4 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -pagetop = { path = "../pagetop", version = "0.0", features = ["database"], default-features = false } +pagetop = { version = "0.0", path = "../pagetop", features = ["database"], default-features = false } From c8e444c82a3c1ab1800d81671ad44919d6c88254 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 18:46:30 +0200 Subject: [PATCH 296/853] =?UTF-8?q?=F0=9F=92=A5=20Renombra=20"pub=5Fconfig?= =?UTF-8?q?"=20por=20"define=5Fconfig"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config.rs | 8 ++++---- pagetop/src/prelude.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 0a36a0be..860404eb 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -50,7 +50,7 @@ //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Y luego declara con la macro [`pub_config!`](crate::pub_config) tus ajustes, usando tipos +//! Y luego declara con la macro [`define_config!`](crate::define_config) tus ajustes, usando tipos //! seguros y asignando los valores predefinidos para la estructura asociada: //! //! ``` @@ -70,7 +70,7 @@ //! pub height: u16, //! } //! -//! pub_config!(MY_SETTINGS: MySettings, +//! define_config!(MY_SETTINGS: MySettings, //! // [myapp] //! "myapp.name" => "Value Name", //! "myapp.width" => 900, @@ -163,7 +163,7 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { /// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// /// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). -macro_rules! pub_config { +macro_rules! define_config { ( $SETTINGS:ident: $Settings:ty $(, $key:literal => $value:literal)*$(,)* ) => { $crate::doc_comment! { concat!( @@ -274,7 +274,7 @@ pub struct Server { pub bind_port: u16, } -pub_config!(SETTINGS: Settings, +define_config!(SETTINGS: Settings, // [app] "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index d76e9ee7..ea91276e 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,7 +2,7 @@ pub use crate::{concat_string, fn_builder, LazyStatic, ResultExt}; // Macros. -pub use crate::{args, paste, pub_config, pub_handle, pub_locale, serve_static_files}; +pub use crate::{args, paste, define_config, pub_handle, pub_locale, serve_static_files}; // Helpers. pub use crate::util; From f95bf8eeb3c9352438ee13d60c1b5076fa22a0de Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 18:47:24 +0200 Subject: [PATCH 297/853] =?UTF-8?q?=F0=9F=92=A5=20Renombra=20"pub=5Fhandle?= =?UTF-8?q?"=20por=20"define=5Fhandle"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- pagetop-admin/src/lib.rs | 2 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-megamenu/src/component.rs | 4 ++-- pagetop-megamenu/src/lib.rs | 2 +- pagetop-minimal/src/component/anchor.rs | 2 +- pagetop-minimal/src/component/block.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- pagetop-minimal/src/component/form_element/button.rs | 2 +- pagetop-minimal/src/component/form_element/date.rs | 2 +- pagetop-minimal/src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/form_element/hidden.rs | 2 +- pagetop-minimal/src/component/form_element/input.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/html.rs | 2 +- pagetop-minimal/src/component/icon.rs | 2 +- pagetop-minimal/src/component/image.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 2 +- pagetop-minimal/src/lib.rs | 2 +- pagetop-minimal/src/module/menu.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/core/basic.rs | 4 ++-- pagetop/src/core/component/definition.rs | 2 +- pagetop/src/core/component/html_markup.rs | 4 ++-- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page/hook.rs | 4 ++-- pagetop/src/util.rs | 2 +- 34 files changed, 38 insertions(+), 38 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 408e2e03..3dd60f73 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(APP_DRUST); +define_handle!(APP_DRUST); struct Drust; diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index fbd906cc..1a7471ee 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(MODULE_ADMIN); +define_handle!(MODULE_ADMIN); pub_locale!("src/locales"); diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index c4fe9935..2b807254 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(THEME_ALINER); +define_handle!(THEME_ALINER); include!(concat!(env!("OUT_DIR"), "/aliner.rs")); diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 8edc582e..87eed0d6 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(THEME_BOOTSIER); +define_handle!(THEME_BOOTSIER); pub_locale!("src/locales"); diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 5dbd14b7..ae12db5a 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -pub_handle!(THEME_BULMIX); +define_handle!(THEME_BULMIX); include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 24f9093f..cba742d8 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -pub_handle!(MODULE_DEMOHOME); +define_handle!(MODULE_DEMOHOME); pub_locale!("src/locales"); diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 63322f49..5632b181 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(MODULE_JQUERY); +define_handle!(MODULE_JQUERY); include!(concat!(env!("OUT_DIR"), "/jquery.rs")); diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 96bc7f76..29177da2 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_MEGAMENUITEM); +define_handle!(COMPONENT_MEGAMENUITEM); #[derive(Default)] pub enum MegaMenuItemType { @@ -148,7 +148,7 @@ impl MegaMenuItem { // MegaMenu. -pub_handle!(COMPONENT_MEGAMENU); +define_handle!(COMPONENT_MEGAMENU); hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, MegaMenu); diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 747c124c..c177d677 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; pub mod component; -pub_handle!(MODULE_MEGAMENU); +define_handle!(MODULE_MEGAMENU); include!(concat!(env!("OUT_DIR"), "/megamenu.rs")); diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index b2a59b5c..4e2381f9 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::Icon; -pub_handle!(COMPONENT_ANCHOR); +define_handle!(COMPONENT_ANCHOR); #[derive(Default)] pub enum AnchorType { diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 8a18c613..18c92da3 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_BLOCK); +define_handle!(COMPONENT_BLOCK); hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 2fdac21a..20ffbe7d 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_CONTAINER); +define_handle!(COMPONENT_CONTAINER); hook_before_render_component!(HOOK_BEFORE_RENDER_CONTAINER, Container); diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index 50c977c3..ebf8c04b 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_BUTTON); +define_handle!(COMPONENT_BUTTON); #[derive(Default)] pub enum ButtonType { diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index b742f56d..5b1d0751 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_DATE); +define_handle!(COMPONENT_DATE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index dd9ef100..713f5a50 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_FORM); +define_handle!(COMPONENT_FORM); hook_before_render_component!(HOOK_BEFORE_RENDER_FORM, Form); diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index 14e4613c..f84ff07f 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_HIDDEN); +define_handle!(COMPONENT_HIDDEN); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 7391754b..6080313e 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_INPUT); +define_handle!(COMPONENT_INPUT); #[derive(Default)] pub enum InputType { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index d27ac2c5..d3f35820 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_COLUMN); +define_handle!(COMPONENT_COLUMN); hook_before_render_component!(HOOK_BEFORE_RENDER_COLUMN, Column); diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 24d946cf..4707fb83 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::grid; -pub_handle!(COMPONENT_ROW); +define_handle!(COMPONENT_ROW); hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 5d138d48..5264ac05 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_HEADING); +define_handle!(COMPONENT_HEADING); #[derive(Default)] pub enum HeadingType { diff --git a/pagetop-minimal/src/component/html.rs b/pagetop-minimal/src/component/html.rs index 468340ad..98d55182 100644 --- a/pagetop-minimal/src/component/html.rs +++ b/pagetop-minimal/src/component/html.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_HTML); +define_handle!(COMPONENT_HTML); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index f5553bde..730cbcac 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_ICON); +define_handle!(COMPONENT_ICON); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index fd15654e..2c87e0e8 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(COMPONENT_IMAGE); +define_handle!(COMPONENT_IMAGE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index ef55df0c..89ea8f23 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::Html; -pub_handle!(COMPONENT_PARAGRAPH); +define_handle!(COMPONENT_PARAGRAPH); #[derive(Default)] pub enum ParagraphDisplay { diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 690f0faf..fb5667f2 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -3,7 +3,7 @@ use pagetop::prelude::*; pub mod component; pub mod module; -pub_handle!(MODULE_MINIMAL); +define_handle!(MODULE_MINIMAL); include!(concat!(env!("OUT_DIR"), "/minimal.rs")); diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 64d568e9..e54f89e2 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(MODULE_MENU); +define_handle!(MODULE_MENU); pub_locale!("src/module/menu/locales"); diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index f6a09d16..a98c8f6e 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -pub_handle!(MODULE_NODE); +define_handle!(MODULE_NODE); pub_locale!("src/locales"); diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 965b1ca0..948e74ad 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -pub_handle!(MODULE_USER); +define_handle!(MODULE_USER); pub_locale!("src/locales"); diff --git a/pagetop/src/core/basic.rs b/pagetop/src/core/basic.rs index df0e6ec4..9613c87c 100644 --- a/pagetop/src/core/basic.rs +++ b/pagetop/src/core/basic.rs @@ -3,9 +3,9 @@ use crate::html::Favicon; use crate::response::page::Page; use crate::server; use crate::util::Handle; -use crate::{pub_handle, serve_static_files}; +use crate::{define_handle, serve_static_files}; -pub_handle!(THEME_BASIC); +define_handle!(THEME_BASIC); include!(concat!(env!("OUT_DIR"), "/theme.rs")); diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 176651e0..a5be4358 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -76,7 +76,7 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { macro_rules! hook_before_render_component { ( $ACTION_HANDLE:ident, $Component:ty ) => { $crate::paste! { - $crate::pub_handle!($ACTION_HANDLE); + $crate::define_handle!($ACTION_HANDLE); type Action = fn(&$Component, &mut RenderContext); diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs index 346b8352..6def47b2 100644 --- a/pagetop/src/core/component/html_markup.rs +++ b/pagetop/src/core/component/html_markup.rs @@ -1,9 +1,9 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; use crate::html::{html, Markup}; -use crate::pub_handle; +use crate::define_handle; use crate::util::Handle; -pub_handle!(HTML_MARKUP); +define_handle!(HTML_MARKUP); pub struct HtmlMarkup { pub markup: Markup, diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index ea91276e..5c1a5f0c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,7 +2,7 @@ pub use crate::{concat_string, fn_builder, LazyStatic, ResultExt}; // Macros. -pub use crate::{args, paste, define_config, pub_handle, pub_locale, serve_static_files}; +pub use crate::{args, paste, define_config, define_handle, pub_locale, serve_static_files}; // Helpers. pub use crate::util; diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index 0c01f27d..e385f01b 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,9 +1,9 @@ use super::Page; use crate::core::hook::{AnyHookAction, HookActionTrait}; -use crate::pub_handle; +use crate::define_handle; use crate::util::Handle; -pub_handle!(HOOK_BEFORE_RENDER_PAGE); +define_handle!(HOOK_BEFORE_RENDER_PAGE); type Hook = fn(&mut Page); diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index c743cf5d..d355f942 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -72,7 +72,7 @@ pub const fn handle( } #[macro_export] -macro_rules! pub_handle { +macro_rules! define_handle { ( $HANDLE:ident ) => { pub const $HANDLE: $crate::util::Handle = $crate::util::handle(module_path!(), file!(), line!(), column!()); From 199a5defe298ffb870b7a5f4c01c7d53c030becc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 18:48:34 +0200 Subject: [PATCH 298/853] =?UTF-8?q?=F0=9F=92=A5=20Renombra=20"pub=5Flocale?= =?UTF-8?q?"=20por=20"define=5Flocale"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-minimal/src/module/menu.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/locale.rs | 8 ++++---- pagetop/src/prelude.rs | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 1a7471ee..156a4851 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_ADMIN); -pub_locale!("src/locales"); +define_locale!("src/locales"); mod summary; diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 87eed0d6..ad628720 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(THEME_BOOTSIER); -pub_locale!("src/locales"); +define_locale!("src/locales"); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index cba742d8..8d0235ef 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; define_handle!(MODULE_DEMOHOME); -pub_locale!("src/locales"); +define_locale!("src/locales"); include!(concat!(env!("OUT_DIR"), "/homedemo.rs")); diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index e54f89e2..6833fd0b 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_MENU); -pub_locale!("src/module/menu/locales"); +define_locale!("src/module/menu/locales"); pub struct Menu; diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index a98c8f6e..9da68de0 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_NODE); -pub_locale!("src/locales"); +define_locale!("src/locales"); //mod entity; mod migration; diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 948e74ad..4863b514 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; define_handle!(MODULE_USER); -pub_locale!("src/locales"); +define_locale!("src/locales"); mod migration; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index c793af8b..f9171bf1 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -69,16 +69,16 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la poderosa macro -//! [`pub_locale!`](crate::pub_locale) para integrar fácilmente tus recursos de localización. +//! [`define_locale!`](crate::define_locale) para integrar fácilmente tus recursos de localización. //! //! Esta macro crea dos funciones para el ámbito donde se ejecuta. Por un lado la función `l()` para //! traducciones directas de etiquetas. Y por otro la función `t()` para traducciones que requieren //! argumentos: //! //! ``` -//! use pagetop::{args, pub_locale}; +//! use pagetop::{args, define_locale}; //! -//! pub_locale!("en-US"); +//! define_locale!("en-US"); //! //! fn demo() { //! println!("* {}", l("hello-world")); @@ -123,7 +123,7 @@ pub static LANGID: LazyStatic<LanguageIdentifier> = #[macro_export] /// Permite integrar fácilmente localización en temas, módulos y componentes. -macro_rules! pub_locale { +macro_rules! define_locale { ( $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 5c1a5f0c..bc78cb0a 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,7 +2,7 @@ pub use crate::{concat_string, fn_builder, LazyStatic, ResultExt}; // Macros. -pub use crate::{args, paste, define_config, define_handle, pub_locale, serve_static_files}; +pub use crate::{args, paste, define_config, define_handle, define_locale, serve_static_files}; // Helpers. pub use crate::util; From 99b08fa2013b43c572991db1e68471fb8e98f5bd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 19:56:36 +0200 Subject: [PATCH 299/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Revisa=20la=20impr?= =?UTF-8?q?esi=C3=B3n=20del=20banner=20de=20inicio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 30 +++++++++++++++++++++-- pagetop/src/{util => app}/figfont.rs | 0 pagetop/src/{util => app}/slant.flf | 0 pagetop/src/{util => app}/small.flf | 0 pagetop/src/{util => app}/speed.flf | 0 pagetop/src/{util => app}/starwars.flf | 0 pagetop/src/util.rs | 33 -------------------------- 7 files changed, 28 insertions(+), 35 deletions(-) rename pagetop/src/{util => app}/figfont.rs (100%) rename pagetop/src/{util => app}/slant.flf (100%) rename pagetop/src/{util => app}/small.flf (100%) rename pagetop/src/{util => app}/speed.flf (100%) rename pagetop/src/{util => app}/starwars.flf (100%) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index f4f08b3a..7426617c 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,8 +1,10 @@ +mod figfont; + use crate::core::{module, module::ModuleStaticRef}; use crate::html::Markup; use crate::response::page::ResultPage; use crate::response::FatalError; -use crate::{config, locale, server, trace, util, LazyStatic}; +use crate::{config, locale, server, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db; @@ -11,6 +13,8 @@ use actix_web::dev::Server; use std::io::Error; +use substring::Substring; + pub struct Application { server: Server, } @@ -18,7 +22,29 @@ pub struct Application { impl Application { pub fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { // Rótulo de presentación. - util::print_on_startup(); + if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { + if let Some((term_width, _)) = term_size::dimensions() { + if term_width >= 80 { + let maxlen = (term_width / 10) - 2; + let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); + if config::SETTINGS.app.name.len() > maxlen { + app = format!("{}...", app); + } + println!( + "\n{} {}\n\n Powered by PageTop {}\n", + figfont::FIGFONT.convert(&app).unwrap(), + &config::SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + } + } + println!( + "\n{}\n{}\n\nPowered by PageTop {}\n", + &config::SETTINGS.app.name, + &config::SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + } // Inicia registro de trazas y eventos. LazyStatic::force(&trace::TRACING); diff --git a/pagetop/src/util/figfont.rs b/pagetop/src/app/figfont.rs similarity index 100% rename from pagetop/src/util/figfont.rs rename to pagetop/src/app/figfont.rs diff --git a/pagetop/src/util/slant.flf b/pagetop/src/app/slant.flf similarity index 100% rename from pagetop/src/util/slant.flf rename to pagetop/src/app/slant.flf diff --git a/pagetop/src/util/small.flf b/pagetop/src/app/small.flf similarity index 100% rename from pagetop/src/util/small.flf rename to pagetop/src/app/small.flf diff --git a/pagetop/src/util/speed.flf b/pagetop/src/app/speed.flf similarity index 100% rename from pagetop/src/util/speed.flf rename to pagetop/src/app/speed.flf diff --git a/pagetop/src/util/starwars.flf b/pagetop/src/app/starwars.flf similarity index 100% rename from pagetop/src/util/starwars.flf rename to pagetop/src/app/starwars.flf diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index d355f942..fd0e533a 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,42 +1,9 @@ -mod figfont; - -use crate::config; - -use substring::Substring; - pub use static_files::Resource as StaticResource; pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; pub type Handle = u64; -pub(crate) fn print_on_startup() { - if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { - if let Some((term_width, _)) = term_size::dimensions() { - if term_width >= 80 { - let maxlen = (term_width / 10) - 2; - let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); - if config::SETTINGS.app.name.len() > maxlen { - app = format!("{}...", app); - } - println!( - "\n{} {}\n\n Powered by PageTop {}\n", - figfont::FIGFONT.convert(&app).unwrap(), - &config::SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - return; - } - } - println!( - "\n{}\n{}\n\nPowered by PageTop {}\n", - &config::SETTINGS.app.name, - &config::SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - } -} - // https://stackoverflow.com/a/71464396 pub const fn handle( module_path: &'static str, From 19af38cb06b065adb38791553eebcd542d859b40 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 20:21:25 +0200 Subject: [PATCH 300/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Reorganizaci=C3=B3?= =?UTF-8?q?n=20de=20macros=20declarativas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 3 +- pagetop-admin/src/summary.rs | 2 +- pagetop-bulmix/src/lib.rs | 1 + pagetop/src/core/basic.rs | 4 +- pagetop/src/core/component/definition.rs | 3 +- pagetop/src/core/component/html_markup.rs | 3 +- pagetop/src/core/hook/all.rs | 3 +- pagetop/src/core/hook/definition.rs | 2 +- pagetop/src/core/module/definition.rs | 4 +- pagetop/src/lib.rs | 64 ++++++++++++++++++++++- pagetop/src/prelude.rs | 9 ++-- pagetop/src/response/page/hook.rs | 3 +- pagetop/src/util.rs | 49 +---------------- 13 files changed, 80 insertions(+), 70 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 156a4851..96bb1cce 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -21,10 +21,11 @@ impl ModuleTrait for Admin { Some(l("module_description")) } + #[rustfmt::skip] fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![ &pagetop_minimal::Minimal, - &pagetop_megamenu::MegaMenu + &pagetop_megamenu::MegaMenu, ] } diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index f73078e6..a84ebc92 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,7 +1,7 @@ use super::l; use pagetop::prelude::*; -use pagetop_minimal::component::*; use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; +use pagetop_minimal::component::*; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index ae12db5a..b657b58d 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -16,6 +16,7 @@ impl ModuleTrait for Bulmix { Some(&Bulmix) } + #[rustfmt::skip] fn dependencies(&self) -> Vec<ModuleStaticRef> { vec![ &pagetop_jquery::JQuery, diff --git a/pagetop/src/core/basic.rs b/pagetop/src/core/basic.rs index 9613c87c..d88e174a 100644 --- a/pagetop/src/core/basic.rs +++ b/pagetop/src/core/basic.rs @@ -1,9 +1,7 @@ use crate::core::module::{ModuleTrait, ThemeStaticRef, ThemeTrait}; use crate::html::Favicon; use crate::response::page::Page; -use crate::server; -use crate::util::Handle; -use crate::{define_handle, serve_static_files}; +use crate::{define_handle, serve_static_files, server, Handle}; define_handle!(THEME_BASIC); diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index a5be4358..4f88e84d 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,8 @@ use super::RenderContext; use crate::html::{html, Markup}; -use crate::util::{single_type_name, Handle}; +use crate::util::single_type_name; +use crate::Handle; pub use std::any::Any as AnyComponent; diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs index 6def47b2..3b513707 100644 --- a/pagetop/src/core/component/html_markup.rs +++ b/pagetop/src/core/component/html_markup.rs @@ -1,7 +1,6 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; use crate::html::{html, Markup}; -use crate::define_handle; -use crate::util::Handle; +use crate::{define_handle, Handle}; define_handle!(HTML_MARKUP); diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs index a48399fd..6963f88a 100644 --- a/pagetop/src/core/hook/all.rs +++ b/pagetop/src/core/hook/all.rs @@ -1,6 +1,5 @@ use super::{ActionsHolder, HookAction}; -use crate::util::Handle; -use crate::LazyStatic; +use crate::{Handle, LazyStatic}; use std::collections::HashMap; use std::sync::RwLock; diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index 6feb0f76..047bab6d 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -1,4 +1,4 @@ -use crate::util::Handle; +use crate::Handle; pub use std::any::Any as AnyHookAction; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index db155221..d18ed088 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,8 +1,8 @@ use super::ThemeStaticRef; use crate::core::hook::HookAction; -use crate::server; -use crate::util::{single_type_name, Handle}; +use crate::util::single_type_name; +use crate::{server, Handle}; #[cfg(feature = "database")] use crate::db::MigrationItem; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 17a781f5..9f8d4d0c 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -28,29 +28,40 @@ //! //! * Tipos de respuestas a peticiones web ([`response`]) //! -//! * Utilidades de carácter global ([`util`]). +//! * Funciones útiles ([`util`]). //! //! # 🚧 Advertencia //! //! **PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios //! son constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. +// ************************************************************************************************* // GLOBAL. +// ************************************************************************************************* pub use concat_string::concat_string; pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; pub use paste::paste; +pub use static_files::Resource as StaticResource; pub use tracing_unwrap::ResultExt; pub use pagetop_macros::fn_builder; +pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; + +pub type Handle = u64; + +// ************************************************************************************************* // LOCAL. +// ************************************************************************************************* #[allow(unused_imports)] pub(crate) use futures::executor::block_on as run_now; +// ************************************************************************************************* // APIs PÚBLICAS. +// ************************************************************************************************* // Gestión de la configuración. pub mod config; @@ -74,12 +85,61 @@ pub mod server; // Tipos de respuestas a peticiones web. pub mod response; -// Macros y funciones útiles. +// Funciones útiles. pub mod util; // Prepara y ejecuta la aplicación. pub mod app; +// ************************************************************************************************* +// MACROS DECLARATIVAS. +// ************************************************************************************************* + +#[macro_export] +/// Macro para construir grupos de pares clave-valor. +/// +/// ```rust#ignore +/// let args = args![ +/// "userName" => "Roberto", +/// "photoCount" => 3, +/// "userGender" => "male" +/// ]; +/// ``` +macro_rules! args { + ( $($key:expr => $value:expr),* ) => {{ + let mut a = std::collections::HashMap::new(); + $( + a.insert(String::from($key), $value.into()); + )* + a + }}; +} + +#[macro_export] +macro_rules! define_handle { + ( $HANDLE:ident ) => { + pub const $HANDLE: $crate::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); + }; +} + +#[macro_export] +macro_rules! serve_static_files { + ( $cfg:ident, $dir:expr, $embed:ident ) => {{ + let static_files = &$crate::config::SETTINGS.dev.static_files; + if static_files.is_empty() { + $cfg.service($crate::server::ResourceFiles::new($dir, $embed())); + } else { + $cfg.service( + $crate::server::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) + .show_files_listing(), + ); + } + }}; +} + +// ************************************************************************************************* // RE-EXPORTA API ÚNICA. +// ************************************************************************************************* pub mod prelude; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index bc78cb0a..30d2c5c3 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,12 +1,11 @@ // Re-exports. -pub use crate::{concat_string, fn_builder, LazyStatic, ResultExt}; +pub use crate::{concat_string, fn_builder, Handle, HashMapResources, LazyStatic, ResultExt}; -// Macros. -pub use crate::{args, paste, define_config, define_handle, define_locale, serve_static_files}; +// Macros declarativas. +pub use crate::{args, define_config, define_handle, define_locale, paste, serve_static_files}; -// Helpers. +// Funciones útiles. pub use crate::util; -pub use crate::util::{Handle, HashMapResources}; // ************************************************************************************************* diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs index e385f01b..da105f2e 100644 --- a/pagetop/src/response/page/hook.rs +++ b/pagetop/src/response/page/hook.rs @@ -1,7 +1,6 @@ use super::Page; use crate::core::hook::{AnyHookAction, HookActionTrait}; -use crate::define_handle; -use crate::util::Handle; +use crate::{define_handle, Handle}; define_handle!(HOOK_BEFORE_RENDER_PAGE); diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index fd0e533a..727ef557 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,8 +1,4 @@ -pub use static_files::Resource as StaticResource; - -pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; - -pub type Handle = u64; +use crate::Handle; // https://stackoverflow.com/a/71464396 pub const fn handle( @@ -38,14 +34,6 @@ pub const fn handle( hash } -#[macro_export] -macro_rules! define_handle { - ( $HANDLE:ident ) => { - pub const $HANDLE: $crate::util::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); - }; -} - pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { if last == 0 { return type_name; @@ -60,38 +48,3 @@ pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { pub fn single_type_name<T: ?Sized>() -> &'static str { partial_type_name(std::any::type_name::<T>(), 1) } - -#[macro_export] -/// Macro para construir grupos de pares clave-valor. -/// -/// ```rust#ignore -/// let args = args![ -/// "userName" => "Roberto", -/// "photoCount" => 3, -/// "userGender" => "male" -/// ]; -/// ``` -macro_rules! args { - ( $($key:expr => $value:expr),* ) => {{ - let mut a = std::collections::HashMap::new(); - $( - a.insert(String::from($key), $value.into()); - )* - a - }}; -} - -#[macro_export] -macro_rules! serve_static_files { - ( $cfg:ident, $dir:expr, $embed:ident ) => {{ - let static_files = &$crate::config::SETTINGS.dev.static_files; - if static_files.is_empty() { - $cfg.service($crate::server::ResourceFiles::new($dir, $embed())); - } else { - $cfg.service( - $crate::server::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) - .show_files_listing(), - ); - } - }}; -} From 1d82c59c3d8caf76be0b38fe7b869eb6ee432009 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 20:32:30 +0200 Subject: [PATCH 301/853] =?UTF-8?q?=F0=9F=93=9D=20Revisa=20la=20documentac?= =?UTF-8?q?i=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++------ pagetop-aliner/README.md | 4 ++-- pagetop-build/README.md | 4 ++-- pagetop-macros/README.md | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c599a7d4..51a93522 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,10 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: ## Utilidades * **[pagetop-macros](https://github.com/manuelcillero/pagetop/tree/main/pagetop-macros)**, agrupa - las principales macros procedurales y declarativas para usar desde **PageTop**. + las principales macros procedurales para usar desde **PageTop**. -* **[pagetop-build](https://github.com/manuelcillero/pagetop/tree/main/pagetop-build)**, utilidad - para incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con +* **[pagetop-build](https://github.com/manuelcillero/pagetop/tree/main/pagetop-build)**, permite + incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con **PageTop**. * **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo @@ -59,9 +59,8 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: ## Temas -* **[pagetop-aliner](https://github.com/manuelcillero/pagetop/tree/main/pagetop-aliner)**, tema de - prueba con un conjunto básico de estilos que delimita con cajas los elementos HTML para visualizar - esquemáticamente la composición de páginas y componentes. +* **[pagetop-aliner](https://github.com/manuelcillero/pagetop/tree/main/pagetop-aliner)**, tema que + delimita con cajas los elementos HTML para mostrar esquemáticamente la composición de las páginas. * **[pagetop-bootsier](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bootsier)**, tema que utiliza el *framework* [Bootstrap](https://getbootstrap.com/) para la composición de páginas y diff --git a/pagetop-aliner/README.md b/pagetop-aliner/README.md index 4ead7970..6697707e 100644 --- a/pagetop-aliner/README.md +++ b/pagetop-aliner/README.md @@ -1,5 +1,5 @@ -Tema de prueba para **PageTop** con un conjunto básico de estilos que delimita con cajas los -elementos HTML para visualizar esquemáticamente la composición de páginas y componentes. +Tema para **PageTop** que delimita con cajas los elementos HTML para mostrar esquemáticamente la +composición de las páginas. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-build/README.md b/pagetop-build/README.md index 71fc545e..6b530e44 100644 --- a/pagetop-build/README.md +++ b/pagetop-build/README.md @@ -1,5 +1,5 @@ -Utilidad para incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas -con **PageTop**. +Permite incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con +**PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-macros/README.md b/pagetop-macros/README.md index b9155ea7..70a6a490 100644 --- a/pagetop-macros/README.md +++ b/pagetop-macros/README.md @@ -1,4 +1,4 @@ -Agrupa las principales macros procedurales y declarativas para usar desde **PageTop**. +Agrupa las principales macros procedurales para usar desde **PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar From 9bb429acf047ef13bd85b3fef08566e79e4b3642 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 21:10:47 +0200 Subject: [PATCH 302/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20C=C3=B3digo=20revi?= =?UTF-8?q?sado=20con=20cargo=20fmt/clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 51 +++++++++++++++------------- pagetop/src/config/de.rs | 2 +- pagetop/src/config/path.rs | 5 ++- pagetop/src/config/value.rs | 9 ++--- pagetop/src/db/migration/migrator.rs | 1 + 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 7426617c..5c6a76a3 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -22,29 +22,7 @@ pub struct Application { impl Application { pub fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { // Rótulo de presentación. - if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { - if let Some((term_width, _)) = term_size::dimensions() { - if term_width >= 80 { - let maxlen = (term_width / 10) - 2; - let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); - if config::SETTINGS.app.name.len() > maxlen { - app = format!("{}...", app); - } - println!( - "\n{} {}\n\n Powered by PageTop {}\n", - figfont::FIGFONT.convert(&app).unwrap(), - &config::SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - } - } - println!( - "\n{}\n{}\n\nPowered by PageTop {}\n", - &config::SETTINGS.app.name, - &config::SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - } + print_on_startup(); // Inicia registro de trazas y eventos. LazyStatic::force(&trace::TRACING); @@ -91,6 +69,33 @@ impl Application { } } +fn print_on_startup() { + if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { + if let Some((term_width, _)) = term_size::dimensions() { + if term_width >= 80 { + let maxlen = (term_width / 10) - 2; + let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); + if config::SETTINGS.app.name.len() > maxlen { + app = format!("{}...", app); + } + println!( + "\n{} {}\n\n Powered by PageTop {}\n", + figfont::FIGFONT.convert(&app).unwrap(), + &config::SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + return; + } + } + println!( + "\n{}\n{}\n\nPowered by PageTop {}\n", + &config::SETTINGS.app.name, + &config::SETTINGS.app.description, + env!("CARGO_PKG_VERSION") + ); + } +} + async fn service_not_found(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Err(FatalError::NotFound(request)) } diff --git a/pagetop/src/config/de.rs b/pagetop/src/config/de.rs index 79836863..875219af 100644 --- a/pagetop/src/config/de.rs +++ b/pagetop/src/config/de.rs @@ -214,7 +214,7 @@ impl<'de> de::MapAccess<'de> for MapAccess { where K: de::DeserializeSeed<'de>, { - if let Some(&(ref key_s, _)) = self.elements.front() { + if let Some((key_s, _)) = self.elements.front() { let key_de = Value::new(None, key_s as &str); let key = de::DeserializeSeed::deserialize(seed, key_de)?; diff --git a/pagetop/src/config/path.rs b/pagetop/src/config/path.rs index 32599ee7..72376a95 100644 --- a/pagetop/src/config/path.rs +++ b/pagetop/src/config/path.rs @@ -77,8 +77,7 @@ impl Expression { let index = sindex_to_uindex(index, array.len()); if index >= array.len() { - array - .resize((index + 1) as usize, Value::new(None, ValueKind::Nil)); + array.resize(index + 1, Value::new(None, ValueKind::Nil)); } Some(&mut array[index]) @@ -156,7 +155,7 @@ impl Expression { if let ValueKind::Array(ref mut array) = parent.kind { let uindex = sindex_to_uindex(index, array.len()); if uindex >= array.len() { - array.resize((uindex + 1) as usize, Value::new(None, ValueKind::Nil)); + array.resize(uindex + 1, Value::new(None, ValueKind::Nil)); } array[uindex] = value; diff --git a/pagetop/src/config/value.rs b/pagetop/src/config/value.rs index 42929ffa..29d62cfe 100644 --- a/pagetop/src/config/value.rs +++ b/pagetop/src/config/value.rs @@ -7,8 +7,9 @@ use std::fmt; use std::fmt::Display; /// Underlying kind of the configuration value. -#[derive(Debug, Clone, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq)] pub enum ValueKind { + #[default] Nil, Boolean(bool), Integer(i64), @@ -21,12 +22,6 @@ pub enum ValueKind { pub type Array = Vec<Value>; pub type Table = HashMap<String, Value>; -impl Default for ValueKind { - fn default() -> Self { - ValueKind::Nil - } -} - impl<T> From<Option<T>> for ValueKind where T: Into<ValueKind>, diff --git a/pagetop/src/db/migration/migrator.rs b/pagetop/src/db/migration/migrator.rs index 5ed18f0b..d91cbd7b 100644 --- a/pagetop/src/db/migration/migrator.rs +++ b/pagetop/src/db/migration/migrator.rs @@ -222,6 +222,7 @@ pub trait MigratorTrait: Send { } } +#[allow(clippy::extra_unused_type_parameters)] async fn exec_with_connection<'c, C, F, M>(db: C, f: F) -> Result<(), DbErr> where C: IntoSchemaManagerConnection<'c>, From cf55c0d1f201394e7397867e3f2b65f2fbfe09c3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 14 May 2023 21:34:01 +0200 Subject: [PATCH 303/853] =?UTF-8?q?=F0=9F=94=96=20Libera=20versiones=20des?= =?UTF-8?q?arrollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 +++++++++++---------- drust/Cargo.toml | 2 +- pagetop-admin/Cargo.toml | 2 +- pagetop-aliner/Cargo.toml | 2 +- pagetop-bootsier/Cargo.toml | 2 +- pagetop-build/Cargo.toml | 2 +- pagetop-bulmix/Cargo.toml | 2 +- pagetop-homedemo/Cargo.toml | 2 +- pagetop-jquery/Cargo.toml | 2 +- pagetop-macros/Cargo.toml | 2 +- pagetop-megamenu/Cargo.toml | 2 +- pagetop-megamenu/README.md | 4 ++-- pagetop-minimal/Cargo.toml | 2 +- pagetop-minimal/README.md | 3 ++- pagetop-node/Cargo.toml | 2 +- pagetop-user/Cargo.toml | 2 +- pagetop/Cargo.toml | 2 +- 17 files changed, 29 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 51a93522..9747a80b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR (*Server-Side Rendering*). -## Utilidades +## Extensiones * **[pagetop-macros](https://github.com/manuelcillero/pagetop/tree/main/pagetop-macros)**, agrupa las principales macros procedurales para usar desde **PageTop**. @@ -42,20 +42,18 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con **PageTop**. +## Componentes + +* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, módulo + que proporciona un conjunto básico de componentes para la composición de páginas. + * **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería JavaScript para interactuar con el documento HTML.​ * **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, - módulo que proporciona un nuevo componente para incluir menús avanzados en las soluciones web. - -* **[pagetop-homedemo](https://github.com/manuelcillero/pagetop/tree/main/pagetop-homedemo)**, - módulo que muestra una página de inicio de demostración para presentar **PageTop**. - -## Componentes - -* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, - proporciona un conjunto básico de componentes para la composición de páginas. + módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web + creadas con **PageTop**. ## Temas @@ -72,6 +70,9 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: ## Módulos +* **[pagetop-homedemo](https://github.com/manuelcillero/pagetop/tree/main/pagetop-homedemo)**, + módulo que muestra una página de inicio de demostración para presentar **PageTop**. + * **[pagetop-admin](https://github.com/manuelcillero/pagetop/tree/main/pagetop-admin)**, módulo que proporciona a otros módulos un lugar común donde presentar a los administradores sus opciones de configuración. diff --git a/drust/Cargo.toml b/drust/Cargo.toml index 2424625c..efd28cef 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drust" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index f40397c7..4aac6ed9 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index c49e432c..696cba1d 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-aliner" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index e26bfa37..7f5ec72d 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-build/Cargo.toml b/pagetop-build/Cargo.toml index 8af50c4b..99acee85 100644 --- a/pagetop-build/Cargo.toml +++ b/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index a39e147c..e5f28be7 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index a1b4f681..258199b3 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.1" +version = "0.0.2" edition = "2021" authors = [ diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index f3aba4e2..0c4e062f 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-jquery" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml index 1564d64f..5552d6f3 100644 --- a/pagetop-macros/Cargo.toml +++ b/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index 30cbf739..31ec6917 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-megamenu/README.md b/pagetop-megamenu/README.md index 3f02cca4..3a3f73e3 100644 --- a/pagetop-megamenu/README.md +++ b/pagetop-megamenu/README.md @@ -1,5 +1,5 @@ -Módulo para **PageTop** que proporciona un nuevo componente para incluir menús avanzados en las -soluciones web. +Módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web +creadas con **PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index b7d8833a..001eebde 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ diff --git a/pagetop-minimal/README.md b/pagetop-minimal/README.md index 45400005..7aa49623 100644 --- a/pagetop-minimal/README.md +++ b/pagetop-minimal/README.md @@ -1,4 +1,5 @@ -Proporciona un conjunto básico de componentes para la composición de páginas en **PageTop**. +Módulo que proporciona un conjunto básico de componentes para la composición de páginas en +**PageTop**. [PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 6955271c..929950f7 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index afdb4338..89d3505f 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 3443533a..f98ea975 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.36" +version = "0.0.37" edition = "2021" authors = [ From dc2ff3259e963eee5ad373a5cbf9013e47562135 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 16 May 2023 21:10:10 +0200 Subject: [PATCH 304/853] =?UTF-8?q?=F0=9F=A9=B9=20Corrige=20estructura=20d?= =?UTF-8?q?e=20documentaci=C3=B3n=20en=20doc.rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 3 +++ pagetop/src/app.rs | 2 ++ pagetop/src/config.rs | 8 ++++---- pagetop/src/core.rs | 8 +++++--- pagetop/src/db.rs | 2 ++ pagetop/src/html.rs | 2 ++ pagetop/src/lib.rs | 12 ++++++------ pagetop/src/locale.rs | 2 +- pagetop/src/prelude.rs | 3 +++ pagetop/src/response.rs | 2 ++ pagetop/src/server.rs | 2 ++ pagetop/src/util.rs | 2 ++ 12 files changed, 34 insertions(+), 14 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index f98ea975..3e884bd5 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -80,3 +80,6 @@ tokio = { version = "1.28.1", features = ["macros", "rt-multi-thread"] } [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } + +[package.metadata.docs.rs] +all-features = true diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 5c6a76a3..b1971350 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -1,3 +1,5 @@ +//! Instancia y ejecuta una aplicación creada con **PageTop**. + mod figfont; use crate::core::{module, module::ModuleStaticRef}; diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 860404eb..f3f525bc 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,4 +1,4 @@ -//! Gestión de la configuración. +//! Lectura y uso de ajustes de configuración. //! //! Carga la configuración de la aplicación en forma de pares `clave = valor` recogidos en archivos //! [TOML](https://toml.io). @@ -158,13 +158,13 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { }); #[macro_export] -/// Asigna los ajustes de configuración de tu módulo usando tipos seguros y valores predefinidos. +/// Define un conjunto de ajustes de configuración usando tipos seguros y valores predefinidos. /// /// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// /// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). macro_rules! define_config { - ( $SETTINGS:ident: $Settings:ty $(, $key:literal => $value:literal)*$(,)* ) => { + ( $SETTINGS:ident as $Settings:ty $(, $key:literal => $value:literal)*$(,)* ) => { $crate::doc_comment! { concat!( "Declara y asigna los valores predefinidos para los ajustes de configuración ", @@ -274,7 +274,7 @@ pub struct Server { pub bind_port: u16, } -define_config!(SETTINGS: Settings, +define_config!(SETTINGS as Settings, // [app] "app.name" => "PageTop Application", "app.description" => "Developed with the amazing PageTop framework.", diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index 2ca529f6..2f5c0fa2 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -1,11 +1,13 @@ +//! Tipos y funciones esenciales para crear módulos, temas, componentes y acciones. + +// API to add new features with modules and themes. +pub mod module; + // API to build new components. pub mod component; // API to define functions that alter the behavior of PageTop core. pub mod hook; -// API to add new features with modules and themes. -pub mod module; - // Basic theme. mod basic; diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index fee92181..035c3fc6 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,3 +1,5 @@ +//! Acceso unificado y normalizado a base de datos. + use crate::{config, run_now, trace, LazyStatic, ResultExt}; pub use url::Url as DbUri; diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 6792820c..355cd3ca 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -1,3 +1,5 @@ +//! HTML en código. + pub use maud::{html, Markup, PreEscaped, DOCTYPE}; mod assets; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 9f8d4d0c..ff551e9e 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,6 +1,6 @@ //! <div align="center"> //! -//! <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/pagetop/static/pagetop-banner.png" /> +//! <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/banner/pagetop.png" /> //! //! <h1>PageTop</h1> //! @@ -12,9 +12,9 @@ //! **PageTop** es un entorno de desarrollo basado en Rust que reúne algunos de los crates más //! estables y populares para crear soluciones web modulares, extensibles y configurables. //! -//! PageTop añade una capa de abstracción para definir una interfaz única que ofrezca de partida: +//! PageTop define un interfaz único que ofrece: //! -//! * Gestión de la configuración ([`config`]). +//! * Lectura y uso de ajustes de configuración ([`config`]). //! //! * Registro de trazas y eventos de la aplicación ([`trace`]). //! @@ -22,9 +22,9 @@ //! //! * HTML en código ([`html`]). //! -//! * Acceso a base de datos ([`db`]). +//! * Acceso unificado y normalizado a base de datos ([`db`]). //! -//! * APIs esenciales para crear componentes, acciones, módulos y temas ([`core`]). +//! * Tipos y funciones esenciales para crear módulos, temas, componentes y acciones ([`core`]). //! //! * Tipos de respuestas a peticiones web ([`response`]) //! @@ -76,7 +76,7 @@ pub mod html; #[cfg(feature = "database")] pub mod db; -// APIs esenciales para crear componentes, acciones, módulos y temas. +// APIs esenciales para crear módulos, temas, componentes y acciones. pub mod core; // API del servidor web. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index f9171bf1..f067bf4c 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -122,7 +122,7 @@ pub static LANGID: LazyStatic<LanguageIdentifier> = }); #[macro_export] -/// Permite integrar fácilmente localización en temas, módulos y componentes. +/// Define un conjunto de elementos de localización y funciones locales de traducción. macro_rules! define_locale { ( $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 30d2c5c3..f93d7bdb 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,3 +1,6 @@ +//! Re-exporta los tipos y funciones más habituales para la creación de soluciones web con +//! **PageTop**. + // Re-exports. pub use crate::{concat_string, fn_builder, Handle, HashMapResources, LazyStatic, ResultExt}; diff --git a/pagetop/src/response.rs b/pagetop/src/response.rs index 5c165979..569dcf50 100644 --- a/pagetop/src/response.rs +++ b/pagetop/src/response.rs @@ -1,3 +1,5 @@ +//! Tipos de respuestas a peticiones web. + pub use actix_web::ResponseError; pub mod page; diff --git a/pagetop/src/server.rs b/pagetop/src/server.rs index 06c63242..17f145a5 100644 --- a/pagetop/src/server.rs +++ b/pagetop/src/server.rs @@ -1,3 +1,5 @@ +//! Tipos y funciones para operar con el servidor web ([actix-web](https://docs.rs/actix-web)). + pub use actix_web::{ http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, }; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 727ef557..986f43d4 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,3 +1,5 @@ +//! Funciones útiles. + use crate::Handle; // https://stackoverflow.com/a/71464396 From aa3bd08303aeeaedaa2f3ba1f94c02064a92ef4b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 16 May 2023 21:11:06 +0200 Subject: [PATCH 305/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.38?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 3e884bd5..456302c3 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.37" +version = "0.0.38" edition = "2021" authors = [ From 51f33835af270bf7820c72a68d0f99a4e68e095c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 17 May 2023 22:41:07 +0200 Subject: [PATCH 306/853] =?UTF-8?q?=E2=9C=A8=20Incluye=20maud-macros=200.2?= =?UTF-8?q?5.0=20en=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/Cargo.toml | 2 + pagetop-macros/README.md | 9 + pagetop-macros/src/lib.rs | 9 + pagetop-macros/src/maud.rs | 39 ++ pagetop-macros/src/maud/ast.rs | 221 ++++++++ pagetop-macros/src/maud/escape.rs | 34 ++ pagetop-macros/src/maud/generate.rs | 308 ++++++++++++ pagetop-macros/src/maud/parse.rs | 752 ++++++++++++++++++++++++++++ 8 files changed, 1374 insertions(+) create mode 100644 pagetop-macros/src/maud.rs create mode 100644 pagetop-macros/src/maud/ast.rs create mode 100644 pagetop-macros/src/maud/escape.rs create mode 100644 pagetop-macros/src/maud/generate.rs create mode 100644 pagetop-macros/src/maud/parse.rs diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml index 5552d6f3..8cb3284b 100644 --- a/pagetop-macros/Cargo.toml +++ b/pagetop-macros/Cargo.toml @@ -19,5 +19,7 @@ proc-macro = true [dependencies] concat-string = "1.0.1" proc-macro2 = "1.0" +proc-macro-crate = "1.3.1" +proc-macro-error = "1.0.4" quote = "1.0" syn = { version = "1.0", features = ["full"] } diff --git a/pagetop-macros/README.md b/pagetop-macros/README.md index 70a6a490..e7260059 100644 --- a/pagetop-macros/README.md +++ b/pagetop-macros/README.md @@ -12,6 +12,15 @@ Rendering*). constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. +# 🔖 Créditos + +Incluye una versión adaptada del crate [maud-macros](https://crates.io/crates/maud_macros) de +[Chris Wong](https://crates.io/users/lambda-fairy) (versión +[0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud_macros)), para incorporar sus +funcionalidades en **PageTop** sin requerir una entrada adicional en el archivo Cargo.toml de cada +proyecto. + + # 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index 67f5f2ec..60a7fd74 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -1,8 +1,17 @@ +mod maud; + use concat_string::concat_string; use proc_macro::TokenStream; +use proc_macro_error::proc_macro_error; use quote::{quote, quote_spanned, ToTokens}; use syn::{parse_macro_input, parse_str, ItemFn}; +#[proc_macro] +#[proc_macro_error] +pub fn html(input: TokenStream) -> TokenStream { + maud::expand(input.into()).into() +} + #[proc_macro_attribute] pub fn fn_builder(_attr: TokenStream, item: TokenStream) -> TokenStream { let fn_item = parse_macro_input!(item as ItemFn); diff --git a/pagetop-macros/src/maud.rs b/pagetop-macros/src/maud.rs new file mode 100644 index 00000000..30ec5ec3 --- /dev/null +++ b/pagetop-macros/src/maud.rs @@ -0,0 +1,39 @@ +// #![doc(html_root_url = "https://docs.rs/maud_macros/0.25.0")] +// TokenStream values are reference counted, and the mental overhead of tracking +// lifetimes outweighs the marginal gains from explicit borrowing +// #![allow(clippy::needless_pass_by_value)] + +mod ast; +mod escape; +mod generate; +mod parse; + +use proc_macro_crate::{crate_name, FoundCrate}; +use proc_macro2::{Ident, Span, TokenStream, TokenTree}; +use quote::quote; + +pub fn expand(input: TokenStream) -> TokenStream { + let output_ident = TokenTree::Ident(Ident::new("__maud_output", Span::mixed_site())); + // Heuristic: the size of the resulting markup tends to correlate with the + // code size of the template itself + let size_hint = input.to_string().len(); + let markups = parse::parse(input); + let stmts = generate::generate(markups, output_ident.clone()); + + let found_crate = crate_name("pagetop").expect("pagetop is present in `Cargo.toml`"); + let pre_escaped = match found_crate { + FoundCrate::Itself => quote!( + crate::html::PreEscaped(#output_ident) + ), + _ => quote!( + pagetop::html::PreEscaped(#output_ident) + ) + }; + + quote!({ + extern crate alloc; + let mut #output_ident = alloc::string::String::with_capacity(#size_hint); + #stmts + #pre_escaped + }) +} diff --git a/pagetop-macros/src/maud/ast.rs b/pagetop-macros/src/maud/ast.rs new file mode 100644 index 00000000..cd8a2cef --- /dev/null +++ b/pagetop-macros/src/maud/ast.rs @@ -0,0 +1,221 @@ +use proc_macro2::{TokenStream, TokenTree}; +use proc_macro_error::SpanRange; + +#[derive(Debug)] +pub enum Markup { + /// Used as a placeholder value on parse error. + ParseError { + span: SpanRange, + }, + Block(Block), + Literal { + content: String, + span: SpanRange, + }, + Symbol { + symbol: TokenStream, + }, + Splice { + expr: TokenStream, + outer_span: SpanRange, + }, + Element { + name: TokenStream, + attrs: Vec<Attr>, + body: ElementBody, + }, + Let { + at_span: SpanRange, + tokens: TokenStream, + }, + Special { + segments: Vec<Special>, + }, + Match { + at_span: SpanRange, + head: TokenStream, + arms: Vec<MatchArm>, + arms_span: SpanRange, + }, +} + +impl Markup { + pub fn span(&self) -> SpanRange { + match *self { + Markup::ParseError { span } => span, + Markup::Block(ref block) => block.span(), + Markup::Literal { span, .. } => span, + Markup::Symbol { ref symbol } => span_tokens(symbol.clone()), + Markup::Splice { outer_span, .. } => outer_span, + Markup::Element { + ref name, ref body, .. + } => { + let name_span = span_tokens(name.clone()); + name_span.join_range(body.span()) + } + Markup::Let { + at_span, + ref tokens, + } => at_span.join_range(span_tokens(tokens.clone())), + Markup::Special { ref segments } => join_ranges(segments.iter().map(Special::span)), + Markup::Match { + at_span, arms_span, .. + } => at_span.join_range(arms_span), + } + } +} + +#[derive(Debug)] +pub enum Attr { + Class { + dot_span: SpanRange, + name: Markup, + toggler: Option<Toggler>, + }, + Id { + hash_span: SpanRange, + name: Markup, + }, + Named { + named_attr: NamedAttr, + }, +} + +impl Attr { + pub fn span(&self) -> SpanRange { + match *self { + Attr::Class { + dot_span, + ref name, + ref toggler, + } => { + let name_span = name.span(); + let dot_name_span = dot_span.join_range(name_span); + if let Some(toggler) = toggler { + dot_name_span.join_range(toggler.cond_span) + } else { + dot_name_span + } + } + Attr::Id { + hash_span, + ref name, + } => { + let name_span = name.span(); + hash_span.join_range(name_span) + } + Attr::Named { ref named_attr } => named_attr.span(), + } + } +} + +#[derive(Debug)] +pub enum ElementBody { + Void { semi_span: SpanRange }, + Block { block: Block }, +} + +impl ElementBody { + pub fn span(&self) -> SpanRange { + match *self { + ElementBody::Void { semi_span } => semi_span, + ElementBody::Block { ref block } => block.span(), + } + } +} + +#[derive(Debug)] +pub struct Block { + pub markups: Vec<Markup>, + pub outer_span: SpanRange, +} + +impl Block { + pub fn span(&self) -> SpanRange { + self.outer_span + } +} + +#[derive(Debug)] +pub struct Special { + pub at_span: SpanRange, + pub head: TokenStream, + pub body: Block, +} + +impl Special { + pub fn span(&self) -> SpanRange { + let body_span = self.body.span(); + self.at_span.join_range(body_span) + } +} + +#[derive(Debug)] +pub struct NamedAttr { + pub name: TokenStream, + pub attr_type: AttrType, +} + +impl NamedAttr { + fn span(&self) -> SpanRange { + let name_span = span_tokens(self.name.clone()); + if let Some(attr_type_span) = self.attr_type.span() { + name_span.join_range(attr_type_span) + } else { + name_span + } + } +} + +#[derive(Debug)] +pub enum AttrType { + Normal { value: Markup }, + Optional { toggler: Toggler }, + Empty { toggler: Option<Toggler> }, +} + +impl AttrType { + fn span(&self) -> Option<SpanRange> { + match *self { + AttrType::Normal { ref value } => Some(value.span()), + AttrType::Optional { ref toggler } => Some(toggler.span()), + AttrType::Empty { ref toggler } => toggler.as_ref().map(Toggler::span), + } + } +} + +#[derive(Debug)] +pub struct Toggler { + pub cond: TokenStream, + pub cond_span: SpanRange, +} + +impl Toggler { + fn span(&self) -> SpanRange { + self.cond_span + } +} + +#[derive(Debug)] +pub struct MatchArm { + pub head: TokenStream, + pub body: Block, +} + +pub fn span_tokens<I: IntoIterator<Item = TokenTree>>(tokens: I) -> SpanRange { + join_ranges(tokens.into_iter().map(|s| SpanRange::single_span(s.span()))) +} + +pub fn join_ranges<I: IntoIterator<Item = SpanRange>>(ranges: I) -> SpanRange { + let mut iter = ranges.into_iter(); + let first = match iter.next() { + Some(span) => span, + None => return SpanRange::call_site(), + }; + let last = iter.last().unwrap_or(first); + first.join_range(last) +} + +pub fn name_to_string(name: TokenStream) -> String { + name.into_iter().map(|token| token.to_string()).collect() +} diff --git a/pagetop-macros/src/maud/escape.rs b/pagetop-macros/src/maud/escape.rs new file mode 100644 index 00000000..49ece776 --- /dev/null +++ b/pagetop-macros/src/maud/escape.rs @@ -0,0 +1,34 @@ +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// !!!!!!!! PLEASE KEEP THIS IN SYNC WITH `maud/src/escape.rs` !!!!!!!!! +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +extern crate alloc; + +use alloc::string::String; + +pub fn escape_to_string(input: &str, output: &mut String) { + for b in input.bytes() { + match b { + b'&' => output.push_str("&amp;"), + b'<' => output.push_str("&lt;"), + b'>' => output.push_str("&gt;"), + b'"' => output.push_str("&quot;"), + _ => unsafe { output.as_mut_vec().push(b) }, + } + } +} + +#[cfg(test)] +mod test { + extern crate alloc; + + use super::escape_to_string; + use alloc::string::String; + + #[test] + fn it_works() { + let mut s = String::new(); + escape_to_string("<script>launchMissiles()</script>", &mut s); + assert_eq!(s, "&lt;script&gt;launchMissiles()&lt;/script&gt;"); + } +} diff --git a/pagetop-macros/src/maud/generate.rs b/pagetop-macros/src/maud/generate.rs new file mode 100644 index 00000000..40761651 --- /dev/null +++ b/pagetop-macros/src/maud/generate.rs @@ -0,0 +1,308 @@ +use proc_macro2::{Delimiter, Group, Ident, Literal, Span, TokenStream, TokenTree}; +use proc_macro_error::SpanRange; +use quote::quote; + +use crate::maud::{ast::*, escape}; + +use proc_macro_crate::{crate_name, FoundCrate}; + +pub fn generate(markups: Vec<Markup>, output_ident: TokenTree) -> TokenStream { + let mut build = Builder::new(output_ident.clone()); + Generator::new(output_ident).markups(markups, &mut build); + build.finish() +} + +struct Generator { + output_ident: TokenTree, +} + +impl Generator { + fn new(output_ident: TokenTree) -> Generator { + Generator { output_ident } + } + + fn builder(&self) -> Builder { + Builder::new(self.output_ident.clone()) + } + + fn markups(&self, markups: Vec<Markup>, build: &mut Builder) { + for markup in markups { + self.markup(markup, build); + } + } + + fn markup(&self, markup: Markup, build: &mut Builder) { + match markup { + Markup::ParseError { .. } => {} + Markup::Block(Block { + markups, + outer_span, + }) => { + if markups + .iter() + .any(|markup| matches!(*markup, Markup::Let { .. })) + { + self.block( + Block { + markups, + outer_span, + }, + build, + ); + } else { + self.markups(markups, build); + } + } + Markup::Literal { content, .. } => build.push_escaped(&content), + Markup::Symbol { symbol } => self.name(symbol, build), + Markup::Splice { expr, .. } => self.splice(expr, build), + Markup::Element { name, attrs, body } => self.element(name, attrs, body, build), + Markup::Let { tokens, .. } => build.push_tokens(tokens), + Markup::Special { segments } => { + for Special { head, body, .. } in segments { + build.push_tokens(head); + self.block(body, build); + } + } + Markup::Match { + head, + arms, + arms_span, + .. + } => { + let body = { + let mut build = self.builder(); + for MatchArm { head, body } in arms { + build.push_tokens(head); + self.block(body, &mut build); + } + build.finish() + }; + let mut body = TokenTree::Group(Group::new(Delimiter::Brace, body)); + body.set_span(arms_span.collapse()); + build.push_tokens(quote!(#head #body)); + } + } + } + + fn block( + &self, + Block { + markups, + outer_span, + }: Block, + build: &mut Builder, + ) { + let block = { + let mut build = self.builder(); + self.markups(markups, &mut build); + build.finish() + }; + let mut block = TokenTree::Group(Group::new(Delimiter::Brace, block)); + block.set_span(outer_span.collapse()); + build.push_tokens(TokenStream::from(block)); + } + + fn splice(&self, expr: TokenStream, build: &mut Builder) { + let output_ident = self.output_ident.clone(); + + let found_crate = crate_name("pagetop").expect("pagetop is present in `Cargo.toml`"); + build.push_tokens(match found_crate { + FoundCrate::Itself => quote!( + crate::html::html_private::render_to!(&#expr, &mut #output_ident); + ), + _ => quote!( + pagetop::html::html_private::render_to!(&#expr, &mut #output_ident); + ) + }); + } + + fn element(&self, name: TokenStream, attrs: Vec<Attr>, body: ElementBody, build: &mut Builder) { + build.push_str("<"); + self.name(name.clone(), build); + self.attrs(attrs, build); + build.push_str(">"); + if let ElementBody::Block { block } = body { + self.markups(block.markups, build); + build.push_str("</"); + self.name(name, build); + build.push_str(">"); + } + } + + fn name(&self, name: TokenStream, build: &mut Builder) { + build.push_escaped(&name_to_string(name)); + } + + fn attrs(&self, attrs: Vec<Attr>, build: &mut Builder) { + for NamedAttr { name, attr_type } in desugar_attrs(attrs) { + match attr_type { + AttrType::Normal { value } => { + build.push_str(" "); + self.name(name, build); + build.push_str("=\""); + self.markup(value, build); + build.push_str("\""); + } + AttrType::Optional { + toggler: Toggler { cond, .. }, + } => { + let inner_value = quote!(inner_value); + let body = { + let mut build = self.builder(); + build.push_str(" "); + self.name(name, &mut build); + build.push_str("=\""); + self.splice(inner_value.clone(), &mut build); + build.push_str("\""); + build.finish() + }; + build.push_tokens(quote!(if let Some(#inner_value) = (#cond) { #body })); + } + AttrType::Empty { toggler: None } => { + build.push_str(" "); + self.name(name, build); + } + AttrType::Empty { + toggler: Some(Toggler { cond, .. }), + } => { + let body = { + let mut build = self.builder(); + build.push_str(" "); + self.name(name, &mut build); + build.finish() + }; + build.push_tokens(quote!(if (#cond) { #body })); + } + } + } + } +} + +//////////////////////////////////////////////////////// + +fn desugar_attrs(attrs: Vec<Attr>) -> Vec<NamedAttr> { + let mut classes_static = vec![]; + let mut classes_toggled = vec![]; + let mut ids = vec![]; + let mut named_attrs = vec![]; + for attr in attrs { + match attr { + Attr::Class { + name, + toggler: Some(toggler), + .. + } => classes_toggled.push((name, toggler)), + Attr::Class { + name, + toggler: None, + .. + } => classes_static.push(name), + Attr::Id { name, .. } => ids.push(name), + Attr::Named { named_attr } => named_attrs.push(named_attr), + } + } + let classes = desugar_classes_or_ids("class", classes_static, classes_toggled); + let ids = desugar_classes_or_ids("id", ids, vec![]); + classes.into_iter().chain(ids).chain(named_attrs).collect() +} + +fn desugar_classes_or_ids( + attr_name: &'static str, + values_static: Vec<Markup>, + values_toggled: Vec<(Markup, Toggler)>, +) -> Option<NamedAttr> { + if values_static.is_empty() && values_toggled.is_empty() { + return None; + } + let mut markups = Vec::new(); + let mut leading_space = false; + for name in values_static { + markups.extend(prepend_leading_space(name, &mut leading_space)); + } + for (name, Toggler { cond, cond_span }) in values_toggled { + let body = Block { + markups: prepend_leading_space(name, &mut leading_space), + // TODO: is this correct? + outer_span: cond_span, + }; + markups.push(Markup::Special { + segments: vec![Special { + at_span: SpanRange::call_site(), + head: quote!(if (#cond)), + body, + }], + }); + } + Some(NamedAttr { + name: TokenStream::from(TokenTree::Ident(Ident::new(attr_name, Span::call_site()))), + attr_type: AttrType::Normal { + value: Markup::Block(Block { + markups, + outer_span: SpanRange::call_site(), + }), + }, + }) +} + +fn prepend_leading_space(name: Markup, leading_space: &mut bool) -> Vec<Markup> { + let mut markups = Vec::new(); + if *leading_space { + markups.push(Markup::Literal { + content: " ".to_owned(), + span: name.span(), + }); + } + *leading_space = true; + markups.push(name); + markups +} + +//////////////////////////////////////////////////////// + +struct Builder { + output_ident: TokenTree, + tokens: Vec<TokenTree>, + tail: String, +} + +impl Builder { + fn new(output_ident: TokenTree) -> Builder { + Builder { + output_ident, + tokens: Vec::new(), + tail: String::new(), + } + } + + fn push_str(&mut self, string: &str) { + self.tail.push_str(string); + } + + fn push_escaped(&mut self, string: &str) { + escape::escape_to_string(string, &mut self.tail); + } + + fn push_tokens(&mut self, tokens: TokenStream) { + self.cut(); + self.tokens.extend(tokens); + } + + fn cut(&mut self) { + if self.tail.is_empty() { + return; + } + let push_str_expr = { + let output_ident = self.output_ident.clone(); + let string = TokenTree::Literal(Literal::string(&self.tail)); + quote!(#output_ident.push_str(#string);) + }; + self.tail.clear(); + self.tokens.extend(push_str_expr); + } + + fn finish(mut self) -> TokenStream { + self.cut(); + self.tokens.into_iter().collect() + } +} diff --git a/pagetop-macros/src/maud/parse.rs b/pagetop-macros/src/maud/parse.rs new file mode 100644 index 00000000..d24cea6e --- /dev/null +++ b/pagetop-macros/src/maud/parse.rs @@ -0,0 +1,752 @@ +use proc_macro2::{Delimiter, Ident, Literal, Spacing, Span, TokenStream, TokenTree}; +use proc_macro_error::{abort, abort_call_site, emit_error, SpanRange}; +use std::collections::HashMap; + +use syn::Lit; + +use crate::maud::ast; + +pub fn parse(input: TokenStream) -> Vec<ast::Markup> { + Parser::new(input).markups() +} + +#[derive(Clone)] +struct Parser { + /// If we're inside an attribute, then this contains the attribute name. + current_attr: Option<String>, + input: <TokenStream as IntoIterator>::IntoIter, +} + +impl Iterator for Parser { + type Item = TokenTree; + + fn next(&mut self) -> Option<TokenTree> { + self.input.next() + } +} + +impl Parser { + fn new(input: TokenStream) -> Parser { + Parser { + current_attr: None, + input: input.into_iter(), + } + } + + fn with_input(&self, input: TokenStream) -> Parser { + Parser { + current_attr: self.current_attr.clone(), + input: input.into_iter(), + } + } + + /// Returns the next token in the stream without consuming it. + fn peek(&mut self) -> Option<TokenTree> { + self.clone().next() + } + + /// Returns the next two tokens in the stream without consuming them. + fn peek2(&mut self) -> Option<(TokenTree, Option<TokenTree>)> { + let mut clone = self.clone(); + clone.next().map(|first| (first, clone.next())) + } + + /// Advances the cursor by one step. + fn advance(&mut self) { + self.next(); + } + + /// Advances the cursor by two steps. + fn advance2(&mut self) { + self.next(); + self.next(); + } + + /// Parses multiple blocks of markup. + fn markups(&mut self) -> Vec<ast::Markup> { + let mut result = Vec::new(); + loop { + match self.peek2() { + None => break, + Some((TokenTree::Punct(ref punct), _)) if punct.as_char() == ';' => self.advance(), + Some((TokenTree::Punct(ref punct), Some(TokenTree::Ident(ref ident)))) + if punct.as_char() == '@' && *ident == "let" => + { + self.advance2(); + let keyword = TokenTree::Ident(ident.clone()); + result.push(self.let_expr(punct.span(), keyword)); + } + _ => result.push(self.markup()), + } + } + result + } + + /// Parses a single block of markup. + fn markup(&mut self) -> ast::Markup { + let token = match self.peek() { + Some(token) => token, + None => { + abort_call_site!("unexpected end of input"); + } + }; + let markup = match token { + // Literal + TokenTree::Literal(literal) => { + self.advance(); + self.literal(literal) + } + // Special form + TokenTree::Punct(ref punct) if punct.as_char() == '@' => { + self.advance(); + let at_span = punct.span(); + match self.next() { + Some(TokenTree::Ident(ident)) => { + let keyword = TokenTree::Ident(ident.clone()); + match ident.to_string().as_str() { + "if" => { + let mut segments = Vec::new(); + self.if_expr(at_span, vec![keyword], &mut segments); + ast::Markup::Special { segments } + } + "while" => self.while_expr(at_span, keyword), + "for" => self.for_expr(at_span, keyword), + "match" => self.match_expr(at_span, keyword), + "let" => { + let span = SpanRange { + first: at_span, + last: ident.span(), + }; + abort!(span, "`@let` only works inside a block"); + } + other => { + let span = SpanRange { + first: at_span, + last: ident.span(), + }; + abort!(span, "unknown keyword `@{}`", other); + } + } + } + _ => { + abort!(at_span, "expected keyword after `@`"); + } + } + } + // Element + TokenTree::Ident(ident) => { + let ident_string = ident.to_string(); + match ident_string.as_str() { + "if" | "while" | "for" | "match" | "let" => { + abort!( + ident, + "found keyword `{}`", ident_string; + help = "should this be a `@{}`?", ident_string + ); + } + "true" | "false" => { + if let Some(attr_name) = &self.current_attr { + emit_error!( + ident, + r#"attribute value must be a string"#; + help = "to declare an empty attribute, omit the equals sign: `{}`", + attr_name; + help = "to toggle the attribute, use square brackets: `{}[some_boolean_flag]`", + attr_name; + ); + return ast::Markup::ParseError { + span: SpanRange::single_span(ident.span()), + }; + } + } + _ => {} + } + + // `.try_namespaced_name()` should never fail as we've + // already seen an `Ident` + let name = self.try_namespaced_name().expect("identifier"); + self.element(name) + } + // Div element shorthand + TokenTree::Punct(ref punct) if punct.as_char() == '.' || punct.as_char() == '#' => { + let name = TokenTree::Ident(Ident::new("div", punct.span())); + self.element(name.into()) + } + // Splice + TokenTree::Group(ref group) if group.delimiter() == Delimiter::Parenthesis => { + self.advance(); + ast::Markup::Splice { + expr: group.stream(), + outer_span: SpanRange::single_span(group.span()), + } + } + // Block + TokenTree::Group(ref group) if group.delimiter() == Delimiter::Brace => { + self.advance(); + ast::Markup::Block(self.block(group.stream(), SpanRange::single_span(group.span()))) + } + // ??? + token => { + abort!(token, "invalid syntax"); + } + }; + markup + } + + /// Parses a literal string. + fn literal(&mut self, literal: Literal) -> ast::Markup { + match Lit::new(literal.clone()) { + Lit::Str(lit_str) => { + return ast::Markup::Literal { + content: lit_str.value(), + span: SpanRange::single_span(literal.span()), + } + } + // Boolean literals are idents, so `Lit::Bool` is handled in + // `markup`, not here. + Lit::Int(..) | Lit::Float(..) => { + emit_error!(literal, r#"literal must be double-quoted: `"{}"`"#, literal); + } + Lit::Char(lit_char) => { + emit_error!( + literal, + r#"literal must be double-quoted: `"{}"`"#, + lit_char.value(), + ); + } + _ => { + emit_error!(literal, "expected string"); + } + } + ast::Markup::ParseError { + span: SpanRange::single_span(literal.span()), + } + } + + /// Parses an `@if` expression. + /// + /// The leading `@if` should already be consumed. + fn if_expr(&mut self, at_span: Span, prefix: Vec<TokenTree>, segments: &mut Vec<ast::Special>) { + let mut head = prefix; + let body = loop { + match self.next() { + Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { + break self.block(block.stream(), SpanRange::single_span(block.span())); + } + Some(token) => head.push(token), + None => { + let mut span = ast::span_tokens(head); + span.first = at_span; + abort!(span, "expected body for this `@if`"); + } + } + }; + segments.push(ast::Special { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + body, + }); + self.else_if_expr(segments) + } + + /// Parses an optional `@else if` or `@else`. + /// + /// The leading `@else if` or `@else` should *not* already be consumed. + fn else_if_expr(&mut self, segments: &mut Vec<ast::Special>) { + match self.peek2() { + Some((TokenTree::Punct(ref punct), Some(TokenTree::Ident(ref else_keyword)))) + if punct.as_char() == '@' && *else_keyword == "else" => + { + self.advance2(); + let at_span = punct.span(); + let else_keyword = TokenTree::Ident(else_keyword.clone()); + match self.peek() { + // `@else if` + Some(TokenTree::Ident(ref if_keyword)) if *if_keyword == "if" => { + self.advance(); + let if_keyword = TokenTree::Ident(if_keyword.clone()); + self.if_expr(at_span, vec![else_keyword, if_keyword], segments) + } + // Just an `@else` + _ => match self.next() { + Some(TokenTree::Group(ref group)) + if group.delimiter() == Delimiter::Brace => + { + let body = + self.block(group.stream(), SpanRange::single_span(group.span())); + segments.push(ast::Special { + at_span: SpanRange::single_span(at_span), + head: vec![else_keyword].into_iter().collect(), + body, + }); + } + _ => { + let span = SpanRange { + first: at_span, + last: else_keyword.span(), + }; + abort!(span, "expected body for this `@else`"); + } + }, + } + } + // We didn't find an `@else`; stop + _ => {} + } + } + + /// Parses an `@while` expression. + /// + /// The leading `@while` should already be consumed. + fn while_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let keyword_span = keyword.span(); + let mut head = vec![keyword]; + let body = loop { + match self.next() { + Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { + break self.block(block.stream(), SpanRange::single_span(block.span())); + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "expected body for this `@while`"); + } + } + }; + ast::Markup::Special { + segments: vec![ast::Special { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + body, + }], + } + } + + /// Parses a `@for` expression. + /// + /// The leading `@for` should already be consumed. + fn for_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let keyword_span = keyword.span(); + let mut head = vec![keyword]; + loop { + match self.next() { + Some(TokenTree::Ident(ref in_keyword)) if *in_keyword == "in" => { + head.push(TokenTree::Ident(in_keyword.clone())); + break; + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "missing `in` in `@for` loop"); + } + } + } + let body = loop { + match self.next() { + Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { + break self.block(block.stream(), SpanRange::single_span(block.span())); + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "expected body for this `@for`"); + } + } + }; + ast::Markup::Special { + segments: vec![ast::Special { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + body, + }], + } + } + + /// Parses a `@match` expression. + /// + /// The leading `@match` should already be consumed. + fn match_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let keyword_span = keyword.span(); + let mut head = vec![keyword]; + let (arms, arms_span) = loop { + match self.next() { + Some(TokenTree::Group(ref body)) if body.delimiter() == Delimiter::Brace => { + let span = SpanRange::single_span(body.span()); + break (self.with_input(body.stream()).match_arms(), span); + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "expected body for this `@match`"); + } + } + }; + ast::Markup::Match { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + arms, + arms_span, + } + } + + fn match_arms(&mut self) -> Vec<ast::MatchArm> { + let mut arms = Vec::new(); + while let Some(arm) = self.match_arm() { + arms.push(arm); + } + arms + } + + fn match_arm(&mut self) -> Option<ast::MatchArm> { + let mut head = Vec::new(); + loop { + match self.peek2() { + Some((TokenTree::Punct(ref eq), Some(TokenTree::Punct(ref gt)))) + if eq.as_char() == '=' + && gt.as_char() == '>' + && eq.spacing() == Spacing::Joint => + { + self.advance2(); + head.push(TokenTree::Punct(eq.clone())); + head.push(TokenTree::Punct(gt.clone())); + break; + } + Some((token, _)) => { + self.advance(); + head.push(token); + } + None => { + if head.is_empty() { + return None; + } else { + let head_span = ast::span_tokens(head); + abort!(head_span, "unexpected end of @match pattern"); + } + } + } + } + let body = match self.next() { + // $pat => { $stmts } + Some(TokenTree::Group(ref body)) if body.delimiter() == Delimiter::Brace => { + let body = self.block(body.stream(), SpanRange::single_span(body.span())); + // Trailing commas are optional if the match arm is a braced block + if let Some(TokenTree::Punct(ref punct)) = self.peek() { + if punct.as_char() == ',' { + self.advance(); + } + } + body + } + // $pat => $expr + Some(first_token) => { + let mut span = SpanRange::single_span(first_token.span()); + let mut body = vec![first_token]; + loop { + match self.next() { + Some(TokenTree::Punct(ref punct)) if punct.as_char() == ',' => break, + Some(token) => { + span.last = token.span(); + body.push(token); + } + None => break, + } + } + self.block(body.into_iter().collect(), span) + } + None => { + let span = ast::span_tokens(head); + abort!(span, "unexpected end of @match arm"); + } + }; + Some(ast::MatchArm { + head: head.into_iter().collect(), + body, + }) + } + + /// Parses a `@let` expression. + /// + /// The leading `@let` should already be consumed. + fn let_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let mut tokens = vec![keyword]; + loop { + match self.next() { + Some(token) => match token { + TokenTree::Punct(ref punct) if punct.as_char() == '=' => { + tokens.push(token.clone()); + break; + } + _ => tokens.push(token), + }, + None => { + let mut span = ast::span_tokens(tokens); + span.first = at_span; + abort!(span, "unexpected end of `@let` expression"); + } + } + } + loop { + match self.next() { + Some(token) => match token { + TokenTree::Punct(ref punct) if punct.as_char() == ';' => { + tokens.push(token.clone()); + break; + } + _ => tokens.push(token), + }, + None => { + let mut span = ast::span_tokens(tokens); + span.first = at_span; + abort!( + span, + "unexpected end of `@let` expression"; + help = "are you missing a semicolon?" + ); + } + } + } + ast::Markup::Let { + at_span: SpanRange::single_span(at_span), + tokens: tokens.into_iter().collect(), + } + } + + /// Parses an element node. + /// + /// The element name should already be consumed. + fn element(&mut self, name: TokenStream) -> ast::Markup { + if self.current_attr.is_some() { + let span = ast::span_tokens(name); + abort!(span, "unexpected element"); + } + let attrs = self.attrs(); + let body = match self.peek() { + Some(TokenTree::Punct(ref punct)) + if punct.as_char() == ';' || punct.as_char() == '/' => + { + // Void element + self.advance(); + if punct.as_char() == '/' { + emit_error!( + punct, + "void elements must use `;`, not `/`"; + help = "change this to `;`"; + help = "see https://github.com/lambda-fairy/maud/pull/315 for details"; + ); + } + ast::ElementBody::Void { + semi_span: SpanRange::single_span(punct.span()), + } + } + Some(_) => match self.markup() { + ast::Markup::Block(block) => ast::ElementBody::Block { block }, + markup => { + let markup_span = markup.span(); + abort!( + markup_span, + "element body must be wrapped in braces"; + help = "see https://github.com/lambda-fairy/maud/pull/137 for details" + ); + } + }, + None => abort_call_site!("expected `;`, found end of macro"), + }; + ast::Markup::Element { name, attrs, body } + } + + /// Parses the attributes of an element. + fn attrs(&mut self) -> Vec<ast::Attr> { + let mut attrs = Vec::new(); + loop { + if let Some(name) = self.try_namespaced_name() { + // Attribute + match self.peek() { + // Non-empty attribute + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '=' => { + self.advance(); + // Parse a value under an attribute context + assert!(self.current_attr.is_none()); + self.current_attr = Some(ast::name_to_string(name.clone())); + let attr_type = match self.attr_toggler() { + Some(toggler) => ast::AttrType::Optional { toggler }, + None => { + let value = self.markup(); + ast::AttrType::Normal { value } + } + }; + self.current_attr = None; + attrs.push(ast::Attr::Named { + named_attr: ast::NamedAttr { name, attr_type }, + }); + } + // Empty attribute (legacy syntax) + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '?' => { + self.advance(); + let toggler = self.attr_toggler(); + attrs.push(ast::Attr::Named { + named_attr: ast::NamedAttr { + name: name.clone(), + attr_type: ast::AttrType::Empty { toggler }, + }, + }); + } + // Empty attribute (new syntax) + _ => { + let toggler = self.attr_toggler(); + attrs.push(ast::Attr::Named { + named_attr: ast::NamedAttr { + name: name.clone(), + attr_type: ast::AttrType::Empty { toggler }, + }, + }); + } + } + } else { + match self.peek() { + // Class shorthand + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '.' => { + self.advance(); + let name = self.class_or_id_name(); + let toggler = self.attr_toggler(); + attrs.push(ast::Attr::Class { + dot_span: SpanRange::single_span(punct.span()), + name, + toggler, + }); + } + // ID shorthand + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '#' => { + self.advance(); + let name = self.class_or_id_name(); + attrs.push(ast::Attr::Id { + hash_span: SpanRange::single_span(punct.span()), + name, + }); + } + // If it's not a valid attribute, backtrack and bail out + _ => break, + } + } + } + + let mut attr_map: HashMap<String, Vec<SpanRange>> = HashMap::new(); + let mut has_class = false; + for attr in &attrs { + let name = match attr { + ast::Attr::Class { .. } => { + if has_class { + // Only check the first class to avoid spurious duplicates + continue; + } + has_class = true; + "class".to_string() + } + ast::Attr::Id { .. } => "id".to_string(), + ast::Attr::Named { named_attr } => named_attr + .name + .clone() + .into_iter() + .map(|token| token.to_string()) + .collect(), + }; + let entry = attr_map.entry(name).or_default(); + entry.push(attr.span()); + } + + for (name, spans) in attr_map { + if spans.len() > 1 { + let mut spans = spans.into_iter(); + let first_span = spans.next().expect("spans should be non-empty"); + abort!(first_span, "duplicate attribute `{}`", name); + } + } + + attrs + } + + /// Parses the name of a class or ID. + fn class_or_id_name(&mut self) -> ast::Markup { + if let Some(symbol) = self.try_name() { + ast::Markup::Symbol { symbol } + } else { + self.markup() + } + } + + /// Parses the `[cond]` syntax after an empty attribute or class shorthand. + fn attr_toggler(&mut self) -> Option<ast::Toggler> { + match self.peek() { + Some(TokenTree::Group(ref group)) if group.delimiter() == Delimiter::Bracket => { + self.advance(); + Some(ast::Toggler { + cond: group.stream(), + cond_span: SpanRange::single_span(group.span()), + }) + } + _ => None, + } + } + + /// Parses an identifier, without dealing with namespaces. + fn try_name(&mut self) -> Option<TokenStream> { + let mut result = Vec::new(); + if let Some(token @ TokenTree::Ident(_)) = self.peek() { + self.advance(); + result.push(token); + } else { + return None; + } + let mut expect_ident = false; + loop { + expect_ident = match self.peek() { + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '-' => { + self.advance(); + result.push(TokenTree::Punct(punct.clone())); + true + } + Some(TokenTree::Ident(ref ident)) if expect_ident => { + self.advance(); + result.push(TokenTree::Ident(ident.clone())); + false + } + _ => break, + }; + } + Some(result.into_iter().collect()) + } + + /// Parses a HTML element or attribute name, along with a namespace + /// if necessary. + fn try_namespaced_name(&mut self) -> Option<TokenStream> { + let mut result = vec![self.try_name()?]; + if let Some(TokenTree::Punct(ref punct)) = self.peek() { + if punct.as_char() == ':' { + self.advance(); + result.push(TokenStream::from(TokenTree::Punct(punct.clone()))); + result.push(self.try_name()?); + } + } + Some(result.into_iter().collect()) + } + + /// Parses the given token stream as a Maud expression. + fn block(&mut self, body: TokenStream, outer_span: SpanRange) -> ast::Block { + let markups = self.with_input(body).markups(); + ast::Block { + markups, + outer_span, + } + } +} From 81f25cf65534bc92b97d0f64083c0b1d1a1d4ed3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 17 May 2023 22:46:29 +0200 Subject: [PATCH 307/853] =?UTF-8?q?=E2=9C=A8=20Incluye=20maud=200.25.0=20e?= =?UTF-8?q?mbebido=20en=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/README.md | 4 +- pagetop/Cargo.toml | 4 +- pagetop/README.md | 9 + pagetop/STARTER.bin.Cargo.toml | 2 - pagetop/STARTER.lib.Cargo.toml | 2 - pagetop/src/html.rs | 3 +- pagetop/src/html/maud.rs | 344 ++++++++++++++++++++++++++++++++ pagetop/src/html/maud/escape.rs | 34 ++++ 8 files changed, 393 insertions(+), 9 deletions(-) create mode 100644 pagetop/src/html/maud.rs create mode 100644 pagetop/src/html/maud/escape.rs diff --git a/pagetop-macros/README.md b/pagetop-macros/README.md index e7260059..4904620d 100644 --- a/pagetop-macros/README.md +++ b/pagetop-macros/README.md @@ -14,8 +14,8 @@ constantes. No puede considerarse preparado hasta que se libere la versión **0. # 🔖 Créditos -Incluye una versión adaptada del crate [maud-macros](https://crates.io/crates/maud_macros) de -[Chris Wong](https://crates.io/users/lambda-fairy) (versión +Incluye en código una versión adaptada del crate [maud-macros](https://crates.io/crates/maud_macros) +de [Chris Wong](https://crates.io/users/lambda-fairy) (versión [0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud_macros)), para incorporar sus funcionalidades en **PageTop** sin requerir una entrada adicional en el archivo Cargo.toml de cada proyecto. diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 456302c3..e1c53ecc 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -36,7 +36,9 @@ async-trait = "0.1.68" concat-string = "1.0.1" doc-comment = "0.3.3" figlet-rs = "0.1.5" +itoa = "1.0.6" futures = "0.3.28" +futures-util = "0.3.28" nom = "7.1.3" once_cell = "1.17.1" paste = "1.0.12" @@ -61,8 +63,6 @@ static-files = "0.2.3" pagetop-macros = { version = "0.0", path = "../pagetop-macros" } -maud = { version = "0.25.0", features = ["actix-web"] } - serde = { version = "1.0", features = ["derive"] } [dependencies.sea-orm] diff --git a/pagetop/README.md b/pagetop/README.md index 41ae4400..ffabe71b 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -9,6 +9,15 @@ configurables. constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. +# 🔖 Créditos + +Incluye en código una versión adaptada del excelente crate [maud](https://crates.io/crates/maud) de +[Chris Wong](https://crates.io/users/lambda-fairy) (versión +[0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud)), para incorporar sus +funcionalidades en **PageTop** sin requerir una entrada adicional en el archivo Cargo.toml de cada +proyecto. + + # 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index 0683505f..228385f9 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -14,8 +14,6 @@ pagetop = { version = "0.0", features = ["mysql"], default-features = false } # Opcional. Para usar archivos y recursos binarios contenidos en el ejecutable: static-files = "0.2.3" -# Opcional. Para usar la macro html!: -maud = "0.25.0" # Opcional. Para serializar estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 5d32ee71..26c4debe 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -13,8 +13,6 @@ pagetop = { version = "0.0", features = ["database"], default-features = false } # Opcional. Para usar archivos y recursos binarios contenidos en la librería: static-files = "0.2.3" -# Opcional. Para usar la macro html!: -maud = "0.25.0" # Opcional. Para serializar estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 355cd3ca..fcfbbab7 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -1,6 +1,7 @@ //! HTML en código. -pub use maud::{html, Markup, PreEscaped, DOCTYPE}; +mod maud; +pub use maud::{html, html_private, Markup, PreEscaped, DOCTYPE}; mod assets; pub use assets::javascript::{JavaScript, ModeJS}; diff --git a/pagetop/src/html/maud.rs b/pagetop/src/html/maud.rs new file mode 100644 index 00000000..8d2cd12e --- /dev/null +++ b/pagetop/src/html/maud.rs @@ -0,0 +1,344 @@ +//#![no_std] + +//! A macro for writing HTML templates. +//! +//! This documentation only describes the runtime API. For a general +//! guide, check out the [book] instead. +//! +//! [book]: https://maud.lambda.xyz/ + +//#![doc(html_root_url = "https://docs.rs/maud/0.25.0")] + +extern crate alloc; + +use alloc::{borrow::Cow, boxed::Box, string::String}; +use core::fmt::{self, Arguments, Display, Write}; + +pub use pagetop_macros::html; + +mod escape; + +/// An adapter that escapes HTML special characters. +/// +/// The following characters are escaped: +/// +/// * `&` is escaped as `&amp;` +/// * `<` is escaped as `&lt;` +/// * `>` is escaped as `&gt;` +/// * `"` is escaped as `&quot;` +/// +/// All other characters are passed through unchanged. +/// +/// **Note:** In versions prior to 0.13, the single quote (`'`) was +/// escaped as well. +/// +/// # Example +/// +/// ```rust +/// use maud::Escaper; +/// use std::fmt::Write; +/// let mut s = String::new(); +/// write!(Escaper::new(&mut s), "<script>launchMissiles()</script>").unwrap(); +/// assert_eq!(s, "&lt;script&gt;launchMissiles()&lt;/script&gt;"); +/// ``` +pub struct Escaper<'a>(&'a mut String); + +impl<'a> Escaper<'a> { + /// Creates an `Escaper` from a `String`. + pub fn new(buffer: &'a mut String) -> Escaper<'a> { + Escaper(buffer) + } +} + +impl<'a> fmt::Write for Escaper<'a> { + fn write_str(&mut self, s: &str) -> fmt::Result { + escape::escape_to_string(s, self.0); + Ok(()) + } +} + +/// Represents a type that can be rendered as HTML. +/// +/// To implement this for your own type, override either the `.render()` +/// or `.render_to()` methods; since each is defined in terms of the +/// other, you only need to implement one of them. See the example below. +/// +/// # Minimal implementation +/// +/// An implementation of this trait must override at least one of +/// `.render()` or `.render_to()`. Since the default definitions of +/// these methods call each other, not doing this will result in +/// infinite recursion. +/// +/// # Example +/// +/// ```rust +/// use maud::{html, Markup, Render}; +/// +/// /// Provides a shorthand for linking to a CSS stylesheet. +/// pub struct Stylesheet(&'static str); +/// +/// impl Render for Stylesheet { +/// fn render(&self) -> Markup { +/// html! { +/// link rel="stylesheet" type="text/css" href=(self.0); +/// } +/// } +/// } +/// ``` +pub trait Render { + /// Renders `self` as a block of `Markup`. + fn render(&self) -> Markup { + let mut buffer = String::new(); + self.render_to(&mut buffer); + PreEscaped(buffer) + } + + /// Appends a representation of `self` to the given buffer. + /// + /// Its default implementation just calls `.render()`, but you may + /// override it with something more efficient. + /// + /// Note that no further escaping is performed on data written to + /// the buffer. If you override this method, you must make sure that + /// any data written is properly escaped, whether by hand or using + /// the [`Escaper`](struct.Escaper.html) wrapper struct. + fn render_to(&self, buffer: &mut String) { + buffer.push_str(&self.render().into_string()); + } +} + +impl Render for str { + fn render_to(&self, w: &mut String) { + escape::escape_to_string(self, w); + } +} + +impl Render for String { + fn render_to(&self, w: &mut String) { + str::render_to(self, w); + } +} + +impl<'a> Render for Cow<'a, str> { + fn render_to(&self, w: &mut String) { + str::render_to(self, w); + } +} + +impl<'a> Render for Arguments<'a> { + fn render_to(&self, w: &mut String) { + let _ = Escaper::new(w).write_fmt(*self); + } +} + +impl<'a, T: Render + ?Sized> Render for &'a T { + fn render_to(&self, w: &mut String) { + T::render_to(self, w); + } +} + +impl<'a, T: Render + ?Sized> Render for &'a mut T { + fn render_to(&self, w: &mut String) { + T::render_to(self, w); + } +} + +impl<T: Render + ?Sized> Render for Box<T> { + fn render_to(&self, w: &mut String) { + T::render_to(self, w); + } +} + +macro_rules! impl_render_with_display { + ($($ty:ty)*) => { + $( + impl Render for $ty { + fn render_to(&self, w: &mut String) { + // TODO: remove the explicit arg when Rust 1.58 is released + format_args!("{self}", self = self).render_to(w); + } + } + )* + }; +} + +impl_render_with_display! { + char f32 f64 +} + +macro_rules! impl_render_with_itoa { + ($($ty:ty)*) => { + $( + impl Render for $ty { + fn render_to(&self, w: &mut String) { + w.push_str(itoa::Buffer::new().format(*self)); + } + } + )* + }; +} + +impl_render_with_itoa! { + i8 i16 i32 i64 i128 isize + u8 u16 u32 u64 u128 usize +} + +/// Renders a value using its [`Display`] impl. +/// +/// # Example +/// +/// ```rust +/// use maud::html; +/// use std::net::Ipv4Addr; +/// +/// let ip_address = Ipv4Addr::new(127, 0, 0, 1); +/// +/// let markup = html! { +/// "My IP address is: " +/// (maud::display(ip_address)) +/// }; +/// +/// assert_eq!(markup.into_string(), "My IP address is: 127.0.0.1"); +/// ``` +pub fn display(value: impl Display) -> impl Render { + struct DisplayWrapper<T>(T); + + impl<T: Display> Render for DisplayWrapper<T> { + fn render_to(&self, w: &mut String) { + format_args!("{0}", self.0).render_to(w); + } + } + + DisplayWrapper(value) +} + +/// A wrapper that renders the inner value without escaping. +#[derive(Debug, Clone, Copy)] +pub struct PreEscaped<T: AsRef<str>>(pub T); + +impl<T: AsRef<str>> Render for PreEscaped<T> { + fn render_to(&self, w: &mut String) { + w.push_str(self.0.as_ref()); + } +} + +/// A block of markup is a string that does not need to be escaped. +/// +/// The `html!` macro expands to an expression of this type. +pub type Markup = PreEscaped<String>; + +impl<T: AsRef<str> + Into<String>> PreEscaped<T> { + /// Converts the inner value to a string. + pub fn into_string(self) -> String { + self.0.into() + } +} + +impl<T: AsRef<str> + Into<String>> From<PreEscaped<T>> for String { + fn from(value: PreEscaped<T>) -> String { + value.into_string() + } +} + +impl<T: AsRef<str> + Default> Default for PreEscaped<T> { + fn default() -> Self { + Self(Default::default()) + } +} + +/// The literal string `<!DOCTYPE html>`. +/// +/// # Example +/// +/// A minimal web page: +/// +/// ```rust +/// use maud::{DOCTYPE, html}; +/// +/// let markup = html! { +/// (DOCTYPE) +/// html { +/// head { +/// meta charset="utf-8"; +/// title { "Test page" } +/// } +/// body { +/// p { "Hello, world!" } +/// } +/// } +/// }; +/// ``` +pub const DOCTYPE: PreEscaped<&'static str> = PreEscaped("<!DOCTYPE html>"); + +mod actix_support { + extern crate alloc; + + use crate::html::PreEscaped; + use actix_web::{http::header, HttpRequest, HttpResponse, Responder}; + use alloc::string::String; + + impl Responder for PreEscaped<String> { + type Body = String; + + fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> { + HttpResponse::Ok() + .content_type(header::ContentType::html()) + .message_body(self.0) + .unwrap() + } + } +} + +#[doc(hidden)] +pub mod html_private { + extern crate alloc; + + use super::{display, Render}; + use alloc::string::String; + use core::fmt::Display; + + #[doc(hidden)] + #[macro_export] + macro_rules! render_to { + ($x:expr, $buffer:expr) => {{ + use $crate::html::html_private::*; + match ChooseRenderOrDisplay($x) { + x => (&&x).implements_render_or_display().render_to(x.0, $buffer), + } + }}; + } + + pub use render_to; + + pub struct ChooseRenderOrDisplay<T>(pub T); + + pub struct ViaRenderTag; + pub struct ViaDisplayTag; + + pub trait ViaRender { + fn implements_render_or_display(&self) -> ViaRenderTag { + ViaRenderTag + } + } + pub trait ViaDisplay { + fn implements_render_or_display(&self) -> ViaDisplayTag { + ViaDisplayTag + } + } + + impl<T: Render> ViaRender for &ChooseRenderOrDisplay<T> {} + impl<T: Display> ViaDisplay for ChooseRenderOrDisplay<T> {} + + impl ViaRenderTag { + pub fn render_to<T: Render + ?Sized>(self, value: &T, buffer: &mut String) { + value.render_to(buffer); + } + } + + impl ViaDisplayTag { + pub fn render_to<T: Display + ?Sized>(self, value: &T, buffer: &mut String) { + display(value).render_to(buffer); + } + } +} diff --git a/pagetop/src/html/maud/escape.rs b/pagetop/src/html/maud/escape.rs new file mode 100644 index 00000000..94cdeec1 --- /dev/null +++ b/pagetop/src/html/maud/escape.rs @@ -0,0 +1,34 @@ +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// !!!!! PLEASE KEEP THIS IN SYNC WITH `maud_macros/src/escape.rs` !!!!! +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +extern crate alloc; + +use alloc::string::String; + +pub fn escape_to_string(input: &str, output: &mut String) { + for b in input.bytes() { + match b { + b'&' => output.push_str("&amp;"), + b'<' => output.push_str("&lt;"), + b'>' => output.push_str("&gt;"), + b'"' => output.push_str("&quot;"), + _ => unsafe { output.as_mut_vec().push(b) }, + } + } +} + +#[cfg(test)] +mod test { + extern crate alloc; + + use super::escape_to_string; + use alloc::string::String; + + #[test] + fn it_works() { + let mut s = String::new(); + escape_to_string("<script>launchMissiles()</script>", &mut s); + assert_eq!(s, "&lt;script&gt;launchMissiles()&lt;/script&gt;"); + } +} From 058f43bf95c477ffd8f9a98750ef4ddc6700c173 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 17 May 2023 22:48:47 +0200 Subject: [PATCH 308/853] =?UTF-8?q?=E2=9E=96=20Quita=20referencia=20a=20ma?= =?UTF-8?q?ud=20al=20incluirse=20en=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 1 - pagetop-aliner/Cargo.toml | 1 - pagetop-bootsier/Cargo.toml | 1 - pagetop-bulmix/Cargo.toml | 1 - pagetop-homedemo/Cargo.toml | 1 - pagetop-megamenu/Cargo.toml | 1 - pagetop-minimal/Cargo.toml | 1 - 7 files changed, 7 deletions(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 4aac6ed9..2a5d663d 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -18,4 +18,3 @@ license = "Apache-2.0 OR MIT" pagetop = { version = "0.0", path = "../pagetop" } pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } pagetop-megamenu = { version = "0.0", path = "../pagetop-megamenu" } -maud = "0.25.0" diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index 696cba1d..ca168834 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -17,7 +17,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } static-files = "0.2.3" -maud = "0.25.0" [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 7f5ec72d..2baadb61 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -17,7 +17,6 @@ license = "Apache-2.0 OR MIT" pagetop = { version = "0.0", path = "../pagetop" } pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } static-files = "0.2.3" -maud = "0.25.0" [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index e5f28be7..ac818723 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -18,7 +18,6 @@ pagetop = { version = "0.0", path = "../pagetop" } pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" -maud = "0.25.0" [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 258199b3..392e4a23 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -17,7 +17,6 @@ license = "Apache-2.0 OR MIT" pagetop = { version = "0.0", path = "../pagetop" } pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" -maud = "0.25.0" [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index 31ec6917..f5d5d475 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -17,7 +17,6 @@ license = "Apache-2.0 OR MIT" pagetop = { version = "0.0", path = "../pagetop" } pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } static-files = "0.2.3" -maud = "0.25.0" [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index 001eebde..2e5f7f36 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -16,7 +16,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } static-files = "0.2.3" -maud = "0.25.0" [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } From 778e90e8e3e4239bc5d00f2202e75127ef5d1691 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 21 May 2023 00:55:29 +0200 Subject: [PATCH 309/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20gesti=C3=B3n?= =?UTF-8?q?=20de=20sesiones=20v=C3=ADa=20cookie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 + pagetop/config/settings.predefined.toml | 6 +- pagetop/src/app.rs | 21 ++++ pagetop/src/config.rs | 137 +++++++++++++++--------- pagetop/src/server.rs | 4 +- 5 files changed, 116 insertions(+), 54 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index e1c53ecc..9c1cdde5 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -57,6 +57,8 @@ fluent-templates = "0.8.0" unic-langid = "0.9.1" actix-web = "4" +actix-session = { version = "0.7.2", features = ["cookie-session"] } + actix-web-files = { package = "actix-files", version = "0.6.2" } actix-web-static-files = "4.0.1" static-files = "0.2.3" diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index f275018f..1372ad98 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -36,7 +36,7 @@ static_files = "" [log] # Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". -# Ejemplos: "Error,actix_server::builder=Info,tracing_actix_web=Debug". +# Por ejemplo: "Error,actix_server::builder=Info,tracing_actix_web=Debug". tracing = "Info" # En terminal ("Stdout") o archivos "Daily", "Hourly", "Minutely" o "Endless". rolling = "Stdout" @@ -51,3 +51,7 @@ format = "Full" # Configuración del servidor web. bind_address = "localhost" bind_port = 8088 +# Duración de la cookie de sesión (en segundos), es decir, el tiempo desde que +# se crea la sesión hasta que caduca la cookie. El valor 0 indica "hasta que se +# cierre el navegador". Por defecto es una semana. +session_lifetime = 604800 diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index b1971350..d69f5b8e 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -11,6 +11,10 @@ use crate::{config, locale, server, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db; +use actix_session::config::{BrowserSession, PersistentSession, SessionLifecycle}; +use actix_session::storage::CookieSessionStore; +use actix_session::SessionMiddleware; +use actix_web::cookie::{time::Duration, Key}; use actix_web::dev::Server; use std::io::Error; @@ -50,9 +54,22 @@ impl Application { module::all::run_migrations(); // Prepara el servidor web. + let secret_key = get_secret_key(); let server = server::HttpServer::new(move || { server::App::new() .wrap(tracing_actix_web::TracingLogger::default()) + .wrap( + SessionMiddleware::builder(CookieSessionStore::default(), secret_key.clone()) + .session_lifecycle(match config::SETTINGS.server.session_lifetime { + 0 => SessionLifecycle::BrowserSession(BrowserSession::default()), + _ => SessionLifecycle::PersistentSession( + PersistentSession::default().session_ttl(Duration::seconds( + config::SETTINGS.server.session_lifetime, + )), + ), + }) + .build(), + ) .configure(module::all::configure_services) .default_service(server::web::route().to(service_not_found)) }) @@ -98,6 +115,10 @@ fn print_on_startup() { } } +fn get_secret_key() -> Key { + Key::generate() +} + async fn service_not_found(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Err(FatalError::NotFound(request)) } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index f3f525bc..9f692f7b 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -23,7 +23,8 @@ //! 1. **config/common.toml**, útil para los ajustes comunes a cualquier entorno. Estos valores //! podrán ser sobrescritos al fusionar los archivos de configuración restantes. //! -//! 2. **config/{file}.toml**, donde *{file}* se define con la variable de entorno PAGETOP_RUN_MODE: +//! 2. **config/{file}.toml**, donde *{file}* se define con la variable de entorno +//! `PAGETOP_RUN_MODE`: //! //! * Si no está definida se asumirá *default* por defecto y PageTop intentará cargar el archivo //! *config/default.toml* si existe. @@ -130,8 +131,8 @@ use std::env; /// Directorio donde se encuentran los archivos de configuración. const CONFIG_DIR: &str = "config"; -/// Todos los valores originales de la configuración en forma de pares `clave = valor` recogidos de -/// los archivos de configuración. +/// Valores originales de la configuración en forma de pares `clave = valor` recogidos de los +/// archivos de configuración. pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto 'default'. let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); @@ -167,7 +168,7 @@ macro_rules! define_config { ( $SETTINGS:ident as $Settings:ty $(, $key:literal => $value:literal)*$(,)* ) => { $crate::doc_comment! { concat!( - "Declara y asigna los valores predefinidos para los ajustes de configuración ", + "Valores asignados o predefinidos para los ajustes de configuración globales ", "asociados a la estructura [`", stringify!($Settings), "`]." ), pub static $SETTINGS: $crate::LazyStatic<$Settings> = $crate::LazyStatic::new(|| { @@ -196,113 +197,145 @@ pub struct Settings { } #[derive(Debug, Deserialize)] -/// Sección `[app]` de los ajustes globales. +/// Sección `[app]` de los ajustes de configuración globales. /// /// Ver [`Settings`]. pub struct App { - /// Valor predefinido: *"PageTop Application"* + /// El nombre de la aplicación. + /// Por defecto: *"PageTop Application"*. pub name: String, - /// Valor predefinido: *"Developed with the amazing PageTop framework."* + /// Una descripción breve de la aplicación. + /// Por defecto: *"Developed with the amazing PageTop framework."*. pub description: String, - /// Valor predefinido: *"Basic"* + /// Tema predeterminado. + /// Por defecto: *"Basic"*. pub theme: String, - /// Valor predefinido: *"en-US"* + /// Idioma (localización) predeterminado. + /// Por defecto: *"en-US"*. pub language: String, - /// Valor predefinido: *"ltr"* + /// Dirección predeterminada para el texto: *"ltr"* (de izquierda a derecha), *"rtl"* (de + /// derecha a izquierda) o *"auto"*. + /// Por defecto: *"ltr"*. pub direction: String, - /// Valor predefinido: *"Slant"* + /// Rótulo de texto ASCII al arrancar: *"Off"*, *"Slant"*, *"Small"*, *"Speed"* o *"Starwars"*. + /// Por defecto: *"Slant"*. pub startup_banner: String, - /// Valor predefinido: según variable de entorno PAGETOP_RUN_MODE, o *"default"* si no lo está + /// Por defecto: según variable de entorno `PAGETOP_RUN_MODE`, o *"default"* si no lo está. pub run_mode: String, } #[derive(Debug, Deserialize)] -/// Sección `[database]` de los ajustes globales. +/// Sección `[database]` de los ajustes de configuración globales. /// /// Ver [`Settings`]. pub struct Database { - /// Valor predefinido: *""* + /// Tipo de base de datos: *"mysql"*, *"postgres"* ó *"sqlite"*. + /// Por defecto: *""*. pub db_type: String, - /// Valor predefinido: *""* + /// Nombre (para mysql/postgres) o referencia (para sqlite) de la base de datos. + /// Por defecto: *""*. pub db_name: String, - /// Valor predefinido: *""* + /// Usuario de conexión a la base de datos (para mysql/postgres). + /// Por defecto: *""*. pub db_user: String, - /// Valor predefinido: *""* + /// Contraseña para la conexión a la base de datos (para mysql/postgres). + /// Por defecto: *""*. pub db_pass: String, - /// Valor predefinido: *"localhost"* + /// Servidor de conexión a la base de datos (para mysql/postgres). + /// Por defecto: *"localhost"*. pub db_host: String, - /// Valor predefinido: *0* + /// Puerto de conexión a la base de datos, normalmente 3306 (para mysql) ó 5432 (para postgres). + /// Por defecto: *0*. pub db_port: u16, - /// Valor predefinido: *5* + /// Número máximo de conexiones habilitadas. + /// Por defecto: *5*. pub max_pool_size: u32, } #[derive(Debug, Deserialize)] -/// Sección `[dev]` de los ajustes globales. +/// Sección `[dev]` de los ajustes de configuración globales. /// /// Ver [`Settings`]. pub struct Dev { - /// Valor predefinido: *""* + /// Los archivos estáticos requeridos por la aplicación se integran de manera predeterminada en + /// el binario ejecutable. Sin embargo, durante el desarrollo puede resultar útil servir estos + /// archivos desde su propio directorio para evitar compilar cada vez que se modifican. En este + /// caso, normalmente, basta con indicar la ruta "../ruta/static". + /// Por defecto: *""*. pub static_files: String, } #[derive(Debug, Deserialize)] -/// Sección `[log]` de los ajustes globales. +/// Sección `[log]` de los ajustes de configuración globales. /// /// Ver [`Settings`]. pub struct Log { - /// Valor predefinido: *"Info"* + /// Filtro, o combinación de filtros separados por coma, para la traza de ejecución: *"Error"*, + /// *"Warn"*, *"Info"*, *"Debug"* o *"Trace"*. + /// Por ejemplo: "Error,actix_server::builder=Info,tracing_actix_web=Debug". + /// Por defecto: *"Info"*. pub tracing: String, - /// Valor predefinido: *"Stdout"* + /// Muestra la traza en el terminal (*"Stdout"*) o queda registrada en archivos con rotación + /// *"Daily"*, *"Hourly"*, *"Minutely"* o *"Endless"*. + /// Por defecto: *"Stdout"*. pub rolling: String, - /// Valor predefinido: *"log"* + /// Directorio para los archivos de traza (si `rolling` != *"Stdout"*). + /// Por defecto: *"log"*. pub path: String, - /// Valor predefinido: *"tracing.log"* + /// Prefijo para los archivos de traza (si `rolling` != *"Stdout"*). + /// Por defecto: *"tracing.log"*. pub prefix: String, - /// Valor predefinido: *"Full"* + /// Presentación de las trazas. Puede ser *"Full"*, *"Compact"*, *"Pretty"* o *"Json"*. + /// Por defecto: *"Full"*. pub format: String, } #[derive(Debug, Deserialize)] -/// Sección `[server]` de los ajustes globales. +/// Sección `[server]` de los ajustes de configuración globales. /// /// Ver [`Settings`]. pub struct Server { - /// Valor predefinido: *"localhost"* + /// Dirección del servidor web. + /// Por defecto: *"localhost"*. pub bind_address: String, - /// Valor predefinido: *8088* + /// Puerto del servidor web. + /// Por defecto: *8088*. pub bind_port: u16, + /// Duración en segundos para la sesión (0 indica "hasta que se cierre el navegador"). + /// Por defecto: *604800* (7 días). + pub session_lifetime: i64, } define_config!(SETTINGS as Settings, // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Basic", - "app.language" => "en-US", - "app.direction" => "ltr", - "app.startup_banner" => "Slant", + "app.name" => "PageTop Application", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Basic", + "app.language" => "en-US", + "app.direction" => "ltr", + "app.startup_banner" => "Slant", // [database] - "database.db_type" => "", - "database.db_name" => "", - "database.db_user" => "", - "database.db_pass" => "", - "database.db_host" => "localhost", - "database.db_port" => 0, - "database.max_pool_size" => 5, + "database.db_type" => "", + "database.db_name" => "", + "database.db_user" => "", + "database.db_pass" => "", + "database.db_host" => "localhost", + "database.db_port" => 0, + "database.max_pool_size" => 5, // [dev] - "dev.static_files" => "", + "dev.static_files" => "", // [log] - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", // [server] - "server.bind_address" => "localhost", - "server.bind_port" => 8088, + "server.bind_address" => "localhost", + "server.bind_port" => 8088, + "server.session_lifetime" => 604800, ); diff --git a/pagetop/src/server.rs b/pagetop/src/server.rs index 17f145a5..6ceae9e4 100644 --- a/pagetop/src/server.rs +++ b/pagetop/src/server.rs @@ -1,7 +1,9 @@ //! Tipos y funciones para operar con el servidor web ([actix-web](https://docs.rs/actix-web)). +pub use actix_session::Session; pub use actix_web::{ - http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, + cookie, http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, }; + pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; From 0c385e70808d2791de9cb4ce2311c9e118e76fcf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 21 May 2023 00:57:41 +0200 Subject: [PATCH 310/853] =?UTF-8?q?=F0=9F=94=A5=20Elimina=20c=C3=B3digo=20?= =?UTF-8?q?para=20simplificar=20localizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/response/page/definition.rs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 05122f3c..d819dfd2 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -4,19 +4,10 @@ use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, AttributeValue, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::FatalError; -use crate::{config, fn_builder, server, trace, LazyStatic}; +use crate::{config, fn_builder, locale, server, trace, LazyStatic}; use std::collections::HashMap; -static DEFAULT_LANGUAGE: LazyStatic<Option<String>> = LazyStatic::new(|| { - let language = config::SETTINGS.app.language[..2].to_lowercase(); - if !language.is_empty() { - Some(language) - } else { - None - } -}); - static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { let direction = config::SETTINGS.app.direction.to_lowercase(); match direction.as_str() { @@ -60,10 +51,7 @@ impl Default for Page { #[rustfmt::skip] fn default() -> Self { Page { - language : match &*DEFAULT_LANGUAGE { - Some(language) => AttributeValue::new().with_value(language), - _ => AttributeValue::new(), - }, + language : AttributeValue::new().with_value(locale::LANGID.language.as_str()), direction : match &*DEFAULT_DIRECTION { Some(direction) => AttributeValue::new().with_value(direction), _ => AttributeValue::new(), From 8edbb608ced2c0cdce5394ad8b8910d612b4d14a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 21 May 2023 00:58:22 +0200 Subject: [PATCH 311/853] =?UTF-8?q?=F0=9F=93=9D=20Revisa=20documentaci?= =?UTF-8?q?=C3=B3n=20y=20a=C3=B1ade=20referencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 54 +++++++++++++-------------- pagetop-macros/README.md | 6 +-- pagetop/README.md | 15 +++++--- pagetop/src/core/component/context.rs | 1 + 4 files changed, 41 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 9747a80b..de4f8abe 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: patrones de desarrollo y buenas prácticas para la creación avanzada de soluciones web SSR (*Server-Side Rendering*). -## Extensiones +## Auxiliares * **[pagetop-macros](https://github.com/manuelcillero/pagetop/tree/main/pagetop-macros)**, agrupa las principales macros procedurales para usar desde **PageTop**. @@ -42,32 +42,6 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con **PageTop**. -## Componentes - -* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, módulo - que proporciona un conjunto básico de componentes para la composición de páginas. - -* **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo - que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería - JavaScript para interactuar con el documento HTML.​ - -* **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, - módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web - creadas con **PageTop**. - -## Temas - -* **[pagetop-aliner](https://github.com/manuelcillero/pagetop/tree/main/pagetop-aliner)**, tema que - delimita con cajas los elementos HTML para mostrar esquemáticamente la composición de las páginas. - -* **[pagetop-bootsier](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bootsier)**, tema - que utiliza el *framework* [Bootstrap](https://getbootstrap.com/) para la composición de páginas y - visualización de componentes. - -* **[pagetop-bulmix](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bulmix)**, tema que - utiliza el *framework* [Bulma](https://bulma.io/) para la composición de páginas y visualización - de componentes. - ## Módulos * **[pagetop-homedemo](https://github.com/manuelcillero/pagetop/tree/main/pagetop-homedemo)**, @@ -83,6 +57,32 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: * **[pagetop-node](https://github.com/manuelcillero/pagetop/tree/main/pagetop-node)**, módulo para crear, extender o personalizar los tipos de contenido que puede administrar un sitio web. +## Temas + +* **[pagetop-aliner](https://github.com/manuelcillero/pagetop/tree/main/pagetop-aliner)**, tema que + delimita con cajas los elementos HTML para mostrar esquemáticamente la composición de las páginas. + +* **[pagetop-bootsier](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bootsier)**, tema + que utiliza el *framework* [Bootstrap](https://getbootstrap.com/) para la composición de páginas y + visualización de componentes. + +* **[pagetop-bulmix](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bulmix)**, tema que + utiliza el *framework* [Bulma](https://bulma.io/) para la composición de páginas y visualización + de componentes. + +## Componentes + +* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, módulo + que proporciona un conjunto básico de componentes para la composición de páginas. + +* **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo + que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería + JavaScript para interactuar con el documento HTML.​ + +* **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, + módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web + creadas con **PageTop**. + ## Aplicación * **[drust](https://github.com/manuelcillero/pagetop/tree/main/drust)**, es una aplicación diff --git a/pagetop-macros/README.md b/pagetop-macros/README.md index 4904620d..ac854a33 100644 --- a/pagetop-macros/README.md +++ b/pagetop-macros/README.md @@ -16,9 +16,9 @@ constantes. No puede considerarse preparado hasta que se libere la versión **0. Incluye en código una versión adaptada del crate [maud-macros](https://crates.io/crates/maud_macros) de [Chris Wong](https://crates.io/users/lambda-fairy) (versión -[0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud_macros)), para incorporar sus -funcionalidades en **PageTop** sin requerir una entrada adicional en el archivo Cargo.toml de cada -proyecto. +[0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud_macros)), para añadir sus +funcionalidades en **PageTop** sin requerir la referencia a `maud` en el archivo `Cargo.toml` de +cada proyecto. # 📜 Licencia diff --git a/pagetop/README.md b/pagetop/README.md index ffabe71b..4ba24362 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -11,11 +11,16 @@ constantes. No puede considerarse preparado hasta que se libere la versión **0. # 🔖 Créditos -Incluye en código una versión adaptada del excelente crate [maud](https://crates.io/crates/maud) de -[Chris Wong](https://crates.io/users/lambda-fairy) (versión -[0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud)), para incorporar sus -funcionalidades en **PageTop** sin requerir una entrada adicional en el archivo Cargo.toml de cada -proyecto. +* Incluye código sustancial de la versión [0.11.0](https://github.com/mehcode/config-rs/tree/0.11.0) + de [config](https://crates.io/crates/config), de [Ryan Leckey](https://crates.io/users/mehcode), + por las facilidades que ofrece frente a sus versiones más modernas para leer inicialmente los + ajustes de configuración y delegar su asignación a tipos seguros según los requerimientos de cada + módulo, tema o aplicación creada con **PageTop**. + +* Incorpora en código una versión adaptada del excelente crate [maud](https://crates.io/crates/maud) + de [Chris Wong](https://crates.io/users/lambda-fairy) (versión + [0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud)), para añadir sus funcionalidades + en **PageTop** sin requerir la referencia a `maud` en el archivo `Cargo.toml` de cada proyecto. # 📜 Licencia diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index fb39bd90..42c05b5b 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -97,6 +97,7 @@ impl RenderContext { } None } + /// Context RENDER. pub fn render(&mut self) -> Markup { From 7691bf4b2fa1e59da3511cd577a53f70e3548e0d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 21 May 2023 13:16:32 +0200 Subject: [PATCH 312/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20El=20contexto=20pa?= =?UTF-8?q?sa=20a=20ser=20un=20elemento=20m=C3=A1s=20gen=C3=A9rico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core.rs | 2 +- pagetop/src/core/component.rs | 3 --- pagetop/src/core/component/bundle.rs | 5 ++--- pagetop/src/core/component/definition.rs | 4 +--- pagetop/src/core/component/html_markup.rs | 4 ++-- pagetop/src/core/component/renderable.rs | 2 +- pagetop/src/core/module/theme.rs | 4 ++-- pagetop/src/html.rs | 3 +++ pagetop/src/{core/component => html}/context.rs | 0 pagetop/src/prelude.rs | 4 +--- pagetop/src/response/page/definition.rs | 4 +++- 11 files changed, 16 insertions(+), 19 deletions(-) rename pagetop/src/{core/component => html}/context.rs (100%) diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index 2f5c0fa2..ebf07e9a 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -10,4 +10,4 @@ pub mod component; pub mod hook; // Basic theme. -mod basic; +pub(crate) mod basic; diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index f348ecf3..cd596397 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,6 +1,3 @@ -mod context; -pub use context::{ContextOp, RenderContext}; - mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 3e16092d..0a0e8c95 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,6 +1,5 @@ -use super::{ComponentTrait, RenderContext}; - -use crate::html::{html, Markup}; +use crate::core::component::ComponentTrait; +use crate::html::{html, Markup, RenderContext}; use std::sync::{Arc, RwLock}; diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 4f88e84d..85e7fac8 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,6 +1,4 @@ -use super::RenderContext; - -use crate::html::{html, Markup}; +use crate::html::{html, Markup, RenderContext}; use crate::util::single_type_name; use crate::Handle; diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs index 3b513707..a4d62d9b 100644 --- a/pagetop/src/core/component/html_markup.rs +++ b/pagetop/src/core/component/html_markup.rs @@ -1,5 +1,5 @@ -use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; -use crate::html::{html, Markup}; +use crate::core::component::{AnyComponent, ComponentTrait}; +use crate::html::{html, Markup, RenderContext}; use crate::{define_handle, Handle}; define_handle!(HTML_MARKUP); diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index ce2f302c..aef5bb92 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -1,4 +1,4 @@ -use crate::core::component::RenderContext; +use crate::html::RenderContext; pub type IsRenderable = fn(&RenderContext) -> bool; diff --git a/pagetop/src/core/module/theme.rs b/pagetop/src/core/module/theme.rs index feeb012d..25fa0720 100644 --- a/pagetop/src/core/module/theme.rs +++ b/pagetop/src/core/module/theme.rs @@ -1,7 +1,7 @@ use super::ModuleTrait; -use crate::core::component::{ComponentTrait, HtmlMarkup, RenderContext}; -use crate::html::{html, Favicon, Markup}; +use crate::core::component::{ComponentTrait, HtmlMarkup}; +use crate::html::{html, Favicon, Markup, RenderContext}; use crate::response::page::Page; use crate::{concat_string, config}; diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index fcfbbab7..6d07c9eb 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -8,6 +8,9 @@ pub use assets::javascript::{JavaScript, ModeJS}; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::Assets; +mod context; +pub use context::{ContextOp, RenderContext}; + mod favicon; pub use favicon::Favicon; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/html/context.rs similarity index 100% rename from pagetop/src/core/component/context.rs rename to pagetop/src/html/context.rs diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index f93d7bdb..7d3fd121 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -28,8 +28,6 @@ pub use crate::{hook_action, hook_before_render_component}; pub use crate::server; pub use crate::server::HttpMessage; -pub use crate::response::page::*; -pub use crate::response::FatalError; -pub use crate::response::ResponseError; +pub use crate::response::{page::*, FatalError, ResponseError}; pub use crate::app::Application; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index d819dfd2..25adbfb7 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -2,7 +2,9 @@ use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; -use crate::html::{html, AttributeValue, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; +use crate::html::{ + html, AttributeValue, Classes, ClassesOp, ContextOp, Favicon, Markup, RenderContext, DOCTYPE, +}; use crate::response::FatalError; use crate::{config, fn_builder, locale, server, trace, LazyStatic}; From 71b0b0889d6ae06a05a02b19cf6d99d14d8258b8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 21 May 2023 21:59:47 +0200 Subject: [PATCH 313/853] =?UTF-8?q?=F0=9F=8E=A8=20Nueov=20enfoque=20para?= =?UTF-8?q?=20las=20funciones=20de=20traducci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 6 +-- pagetop-admin/src/summary.rs | 6 ++- pagetop-bootsier/src/lib.rs | 8 +-- pagetop-homedemo/src/lib.rs | 65 +++++++++++++------------ pagetop-macros/src/maud.rs | 4 +- pagetop-macros/src/maud/generate.rs | 2 +- pagetop-minimal/src/module/menu.rs | 6 +-- pagetop-node/src/lib.rs | 6 +-- pagetop-user/src/lib.rs | 23 +++++---- pagetop/src/locale.rs | 75 +++++++++++++++-------------- pagetop/src/prelude.rs | 2 + 11 files changed, 110 insertions(+), 93 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 96bb1cce..a6b211ff 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_ADMIN); -define_locale!("src/locales"); +define_locale!(LOCALE_ADMIN, "src/locales"); mod summary; @@ -14,11 +14,11 @@ impl ModuleTrait for Admin { } fn name(&self) -> String { - l("module_name") + t("module_name", Locale::From(&LOCALE_ADMIN)) } fn description(&self) -> Option<String> { - Some(l("module_description")) + Some(t("module_description", Locale::From(&LOCALE_ADMIN))) } #[rustfmt::skip] diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index a84ebc92..5abf2e75 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,11 +1,13 @@ -use super::l; +use super::LOCALE_ADMIN; use pagetop::prelude::*; use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; use pagetop_minimal::component::*; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(l("module_name").as_str())) + .with_item(MegaMenuItem::label( + t("module_name", Locale::From(&LOCALE_ADMIN)).as_str(), + )) .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) .with_item(MegaMenuItem::link_blank( "Opción 3", diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index ad628720..8fa08dd1 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(THEME_BOOTSIER); -define_locale!("src/locales"); +define_locale!(LOCALE_BOOTSIER, "src/locales"); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); @@ -53,15 +53,15 @@ impl ThemeTrait for Bootsier { alt="Caution!"; div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } - p class="lead" { (l("e404-description")) } + p class="lead" { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } hr class="my-4"; - p { (l("e404-description")) } + p { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } a class="btn btn-primary btn-lg" href="/" role="button" { - (l("back-homepage")) + (t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) } } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 8d0235ef..15d1c3b1 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; define_handle!(MODULE_DEMOHOME); -define_locale!("src/locales"); +define_locale!(LOCALE_DEMOHOME, "src/locales"); include!(concat!(env!("OUT_DIR"), "/homedemo.rs")); @@ -15,11 +15,11 @@ impl ModuleTrait for HomeDemo { } fn name(&self) -> String { - l("module_name") + t("module_name", Locale::From(&LOCALE_DEMOHOME)) } fn description(&self) -> Option<String> { - Some(l("module_description")) + Some(t("module_description", Locale::From(&LOCALE_DEMOHOME))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -34,7 +34,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(l("page_title").as_str()) + .with_title(t("page_title", Locale::From(&LOCALE_DEMOHOME)).as_str()) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/homedemo/css/styles.css", ))) @@ -56,43 +56,46 @@ fn hello_world() -> Container { .with_size(grid::ColumnSize::Is5of12) .with_component( Heading::h1(html! { - (l("page_title")) + (t("page_title", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(HeadingDisplay::Medium), ) .with_component( Paragraph::with(html! { - (e("hello_intro", &args![ + (e("hello_intro", Locale::With(&LOCALE_DEMOHOME, &args![ "app" => format!( "<span class=\"app-name\">{}</span>", &config::SETTINGS.app.name, ) - ])) + ]))) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { - (e("hello_powered", &args![ + (e("hello_powered", Locale::With(&LOCALE_DEMOHOME, &args![ "pagetop" => format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://pagetop.cillero.es", "PageTop", ) - ])) + ]))) })) .with_component( Anchor::button( "https://github.com/manuelcillero/pagetop", - html! { (l("hello_code")) }, + html! { (t("hello_code", Locale::From(&LOCALE_DEMOHOME))) }, ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::link("#welcome", html! { (l("hello_welcome")) }) - .with_left_icon(Icon::with("arrow-down-circle-fill")) - .with_classes(ClassesOp::Add, "welcome-link"), + Anchor::link( + "#welcome", + html! { (t("hello_welcome", Locale::From(&LOCALE_DEMOHOME))) }, + ) + .with_left_icon(Icon::with("arrow-down-circle-fill")) + .with_classes(ClassesOp::Add, "welcome-link"), ), ) .with_column( @@ -108,26 +111,28 @@ fn welcome() -> Container { .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") .with_component(Heading::h2(html! { - (l("welcome_page")) + (t("welcome_page", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Heading::h3(html! { - (e("welcome_subtitle", &args![ + (e("welcome_subtitle", Locale::With(&LOCALE_DEMOHOME, &args![ "app" => format!( "<span class=\"app-name\">{}</span>", &config::SETTINGS.app.name ) - ])) + ]))) }) .with_display(HeadingDisplay::Subtitle), ) .with_component( Paragraph::with(html! { - (l("welcome_text1")) + (t("welcome_text1", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(html! { (l("welcome_text2")) })) + .with_component(Paragraph::with( + html! { (t("welcome_text2", Locale::From(&LOCALE_DEMOHOME))) }, + )) } fn about_pagetop() -> Container { @@ -143,25 +148,25 @@ fn about_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-text") .with_component(Heading::h2(html! { - (l("pagetop_title")) + (t("pagetop_title", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Paragraph::with(html! { - (l("pagetop_text1")) + (t("pagetop_text1", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { - (l("pagetop_text2")) + (t("pagetop_text2", Locale::From(&LOCALE_DEMOHOME))) })) .with_component(Paragraph::with(html! { - (e("pagetop_text3", &args![ + (e("pagetop_text3", Locale::With(&LOCALE_DEMOHOME, &args![ "pagetop_website" => format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://docs.rs/pagetop/latest/pagetop", - l("pagetop_website"), + t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), ) - ])) + ]))) })), ), ) @@ -174,17 +179,17 @@ fn promo_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-text") .with_component(Heading::h2(html! { - (l("pagetop_promo_title")) + (t("pagetop_promo_title", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Paragraph::with(html! { - (e("pagetop_promo_text1", &args![ + (e("pagetop_promo_text1", Locale::With(&LOCALE_DEMOHOME, &args![ "pagetop" => format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://crates.io/crates/pagetop", "PageTop", ) - ])) + ]))) }) .with_display(ParagraphDisplay::Small), ), @@ -211,16 +216,16 @@ fn reporting_issues() -> Container { .with_classes(ClassesOp::Add, "reporting-col-text") .with_size(grid::ColumnSize::Is6of12) .with_component(Heading::h2(html! { - (l("report_problems_title")) + (t("report_problems_title", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Paragraph::with(html! { - (l("report_problems_text1")) + (t("report_problems_text1", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { - (l("report_problems_text2")) + (t("report_problems_text2", Locale::From(&LOCALE_DEMOHOME))) })), ), ) diff --git a/pagetop-macros/src/maud.rs b/pagetop-macros/src/maud.rs index 30ec5ec3..a4e7873f 100644 --- a/pagetop-macros/src/maud.rs +++ b/pagetop-macros/src/maud.rs @@ -8,8 +8,8 @@ mod escape; mod generate; mod parse; -use proc_macro_crate::{crate_name, FoundCrate}; use proc_macro2::{Ident, Span, TokenStream, TokenTree}; +use proc_macro_crate::{crate_name, FoundCrate}; use quote::quote; pub fn expand(input: TokenStream) -> TokenStream { @@ -27,7 +27,7 @@ pub fn expand(input: TokenStream) -> TokenStream { ), _ => quote!( pagetop::html::PreEscaped(#output_ident) - ) + ), }; quote!({ diff --git a/pagetop-macros/src/maud/generate.rs b/pagetop-macros/src/maud/generate.rs index 40761651..be7946d0 100644 --- a/pagetop-macros/src/maud/generate.rs +++ b/pagetop-macros/src/maud/generate.rs @@ -113,7 +113,7 @@ impl Generator { ), _ => quote!( pagetop::html::html_private::render_to!(&#expr, &mut #output_ident); - ) + ), }); } diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 6833fd0b..177e811a 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_MENU); -define_locale!("src/module/menu/locales"); +define_locale!(LOCALE_MENU, "src/module/menu/locales"); pub struct Menu; @@ -12,10 +12,10 @@ impl ModuleTrait for Menu { } fn name(&self) -> String { - l("module_name") + t("module_name", Locale::From(&LOCALE_MENU)) } fn description(&self) -> Option<String> { - Some(l("module_description")) + Some(t("module_description", Locale::From(&LOCALE_MENU))) } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 9da68de0..766e2fce 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_NODE); -define_locale!("src/locales"); +define_locale!(LOCALE_NODE, "src/locales"); //mod entity; mod migration; @@ -15,11 +15,11 @@ impl ModuleTrait for Node { } fn name(&self) -> String { - l("module_name") + t("module_name", Locale::From(&LOCALE_NODE)) } fn description(&self) -> Option<String> { - Some(l("module_description")) + Some(t("module_description", Locale::From(&LOCALE_NODE))) } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 4863b514..9bc4a16b 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; define_handle!(MODULE_USER); -define_locale!("src/locales"); +define_locale!(LOCALE_USER, "src/locales"); mod migration; @@ -15,11 +15,11 @@ impl ModuleTrait for User { } fn name(&self) -> String { - l("module_name") + t("module_name", Locale::From(&LOCALE_USER)) } fn description(&self) -> Option<String> { - Some(l("module_description")) + Some(t("module_description", Locale::From(&LOCALE_USER))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -58,13 +58,14 @@ fn form_login() -> Form { .with_element( form_element::Input::textfield() .with_name("name") - .with_label(l("username").as_str()) + .with_label(t("username", Locale::From(&LOCALE_USER)).as_str()) .with_help_text( t( "username_help", - &args![ - "app" => config::SETTINGS.app.name.to_owned() - ], + Locale::With( + &LOCALE_USER, + &args!["app" => config::SETTINGS.app.name.to_owned()], + ), ) .as_str(), ) @@ -73,8 +74,10 @@ fn form_login() -> Form { .with_element( form_element::Input::password() .with_name("pass") - .with_label(l("password").as_str()) - .with_help_text(l("password_help").as_str()), + .with_label(t("password", Locale::From(&LOCALE_USER)).as_str()) + .with_help_text(t("password_help", Locale::From(&LOCALE_USER)).as_str()), ) - .with_element(form_element::Button::submit(l("login").as_str())) + .with_element(form_element::Button::submit( + t("login", Locale::From(&LOCALE_USER)).as_str(), + )) } diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index f067bf4c..09f0313d 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -71,36 +71,36 @@ //! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la poderosa macro //! [`define_locale!`](crate::define_locale) para integrar fácilmente tus recursos de localización. //! -//! Esta macro crea dos funciones para el ámbito donde se ejecuta. Por un lado la función `l()` para -//! traducciones directas de etiquetas. Y por otro la función `t()` para traducciones que requieren -//! argumentos: +//! Luego sólo tendrás que usar la función `t()` para realizar tus traducciones: //! //! ``` -//! use pagetop::{args, define_locale}; +//! use pagetop::{args, define_locale, t}; //! -//! define_locale!("en-US"); +//! define_locale!(LOCALE_SAMPLE, "src/locales"); //! //! fn demo() { -//! println!("* {}", l("hello-world")); -//! println!("* {}", t("hello-world", &args![])); -//! println!("* {}", t("hello-user", &args!["userName" => "Julia"])); +//! println!("* {}", l("hello-world", Locale::From(&LOCALE_SAMPLE))); +//! println!("* {}", t("hello-user", Locale::With(&LOCALE_SAMPLE, &args!["userName" => "Julia"]))); //! //! let args = args![ //! "userName" => "Roberto", //! "photoCount" => 3, //! "userGender" => "male" //! ]; -//! println!("* {}\n", t("shared-photos", &args)); +//! println!("* {}\n", t("shared-photos", Locale::With(&LOCALE_SAMPLE, &args))); //! } //! ``` +use crate::html::{Markup, PreEscaped}; use crate::{config, trace, LazyStatic}; use unic_langid::LanguageIdentifier; pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; -pub use fluent_templates::{static_loader as static_locale, Loader as Locale}; +pub use fluent_templates::{static_loader as static_locale, Loader, StaticLoader as Locales}; + +use std::collections::HashMap; /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) @@ -124,11 +124,11 @@ pub static LANGID: LazyStatic<LanguageIdentifier> = #[macro_export] /// Define un conjunto de elementos de localización y funciones locales de traducción. macro_rules! define_locale { - ( $dir_locales:literal $(, $core_locales:literal)? ) => { + ( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; static_locale! { - static LOCALES = { + static $LOCALES = { locales: $dir_locales, $( core_locales: $core_locales, )? fallback_language: "en-US", @@ -137,28 +137,33 @@ macro_rules! define_locale { customise: |bundle| bundle.set_use_isolating(false), }; } - - #[allow(dead_code)] - fn l(key: &str) -> String { - LOCALES.lookup(&LANGID, key).unwrap_or(key.to_string()) - } - - #[allow(dead_code)] - fn t( - key: &str, - args: &std::collections::HashMap<String, FluentValue> - ) -> String { - LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) - } - - #[allow(dead_code)] - fn e( - key: &str, - args: &std::collections::HashMap<String, FluentValue> - ) -> $crate::html::PreEscaped<String> { - $crate::html::PreEscaped( - LOCALES.lookup_with_args(&LANGID, key, args).unwrap_or(key.to_string()) - ) - } }; } + +pub enum Locale<'a> { + From(&'a Locales), + With(&'a Locales, &'a HashMap<String, FluentValue<'a>>), + Lang(&'a Locales, &'a LanguageIdentifier), + Using( + &'a Locales, + &'a LanguageIdentifier, + &'a HashMap<String, FluentValue<'a>>, + ), +} + +pub fn t(key: &str, locale: Locale) -> String { + match locale { + Locale::From(locales) => locales.lookup(&LANGID, key).unwrap_or(key.to_string()), + Locale::With(locales, args) => locales + .lookup_with_args(&LANGID, key, args) + .unwrap_or(key.to_string()), + Locale::Lang(locales, langid) => locales.lookup(langid, key).unwrap_or(key.to_string()), + Locale::Using(locales, langid, args) => locales + .lookup_with_args(langid, key, args) + .unwrap_or(key.to_string()), + } +} + +pub fn e(key: &str, locale: Locale) -> Markup { + PreEscaped(t(key, locale)) +} diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 7d3fd121..947ebe3a 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -16,6 +16,8 @@ pub use crate::config; pub use crate::trace; +pub use crate::locale::*; + pub use crate::html::*; #[cfg(feature = "database")] From 0de26a4737e18ef23b11e7f5314533661029d15f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 25 May 2023 20:08:40 +0200 Subject: [PATCH 314/853] =?UTF-8?q?=F0=9F=8D=BB=20Primera=20revista=20a=20?= =?UTF-8?q?las=20traducciones=20por=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-admin/src/summary.rs | 2 +- pagetop-bootsier/src/lib.rs | 51 ++++++++++------- pagetop-homedemo/src/lib.rs | 44 +++++++------- pagetop-minimal/src/component/anchor.rs | 10 ++-- pagetop-minimal/src/module/menu.rs | 4 +- pagetop-node/src/lib.rs | 4 +- pagetop-user/src/lib.rs | 14 ++--- pagetop/Cargo.toml | 2 +- pagetop/src/app.rs | 2 +- pagetop/src/core/component.rs | 6 ++ pagetop/src/core/component/arc.rs | 32 +++++++++++ pagetop/src/core/component/bundle.rs | 20 +++---- .../src/{html => core/component}/context.rs | 7 +++ pagetop/src/core/component/definition.rs | 11 +++- pagetop/src/core/component/html_markup.rs | 4 +- pagetop/src/core/component/renderable.rs | 2 +- pagetop/src/core/module/theme.rs | 20 +------ pagetop/src/html.rs | 3 - pagetop/src/lib.rs | 49 +--------------- pagetop/src/locale.rs | 57 ++++++++++++------- pagetop/src/prelude.rs | 3 +- pagetop/src/response.rs | 3 +- pagetop/src/response/fatal_error.rs | 15 +++-- pagetop/src/response/fatal_error/error403.rs | 33 +++++++++++ pagetop/src/response/fatal_error/error404.rs | 33 +++++++++++ pagetop/src/response/page/definition.rs | 6 +- pagetop/src/util.rs | 53 ++++++++++++++++- 28 files changed, 307 insertions(+), 187 deletions(-) create mode 100644 pagetop/src/core/component/arc.rs rename pagetop/src/{html => core/component}/context.rs (94%) create mode 100644 pagetop/src/response/fatal_error/error403.rs create mode 100644 pagetop/src/response/fatal_error/error404.rs diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index a6b211ff..a2d30ead 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -14,11 +14,11 @@ impl ModuleTrait for Admin { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_ADMIN)) + _t("module_name", Locale::From(&LOCALE_ADMIN)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_ADMIN))) + Some(_t("module_description", Locale::From(&LOCALE_ADMIN))) } #[rustfmt::skip] diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 5abf2e75..de844279 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -6,7 +6,7 @@ use pagetop_minimal::component::*; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() .with_item(MegaMenuItem::label( - t("module_name", Locale::From(&LOCALE_ADMIN)).as_str(), + _t("module_name", Locale::From(&LOCALE_ADMIN)).as_str(), )) .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) .with_item(MegaMenuItem::link_blank( diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 8fa08dd1..f7905663 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -42,30 +42,37 @@ impl ThemeTrait for Bootsier { pagetop_jquery::JQuery::add_jquery(page.context()); } - fn error_404_not_found(&self) -> HtmlMarkup { - HtmlMarkup::new().with(html! { - div class="jumbotron" { - div class="media" { - img - src="/bootsier/images/caution.png" - class="mr-4" - style="width: 20%; max-width: 188px" - alt="Caution!"; - div class="media-body" { - h1 class="display-4" { ("RESOURCE NOT FOUND") } - p class="lead" { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } - hr class="my-4"; - p { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } - a - class="btn btn-primary btn-lg" - href="/" - role="button" - { - (t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) + fn render_component( + &self, + component: &dyn ComponentTrait, + _rcx: &mut RenderContext, + ) -> Option<Markup> { + match component.handle() { + ERROR_404 => Some(html! { + div class="jumbotron" { + div class="media" { + img + src="/bootsier/images/caution.png" + class="mr-4" + style="width: 20%; max-width: 188px" + alt="Caution!"; + div class="media-body" { + h1 class="display-4" { ("RESOURCE NOT FOUND") } + p class="lead" { (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + hr class="my-4"; + p { (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + a + class="btn btn-primary btn-lg" + href="/" + role="button" + { + (_t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) + } } } } - } - }) + }), + _ => None, + } } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 15d1c3b1..38a1a171 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for HomeDemo { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_DEMOHOME)) + _t("module_name", Locale::From(&LOCALE_DEMOHOME)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_DEMOHOME))) + Some(_t("module_description", Locale::From(&LOCALE_DEMOHOME))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -34,7 +34,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(t("page_title", Locale::From(&LOCALE_DEMOHOME)).as_str()) + .with_title(_t("page_title", Locale::From(&LOCALE_DEMOHOME)).as_str()) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/homedemo/css/styles.css", ))) @@ -56,13 +56,13 @@ fn hello_world() -> Container { .with_size(grid::ColumnSize::Is5of12) .with_component( Heading::h1(html! { - (t("page_title", Locale::From(&LOCALE_DEMOHOME))) + (_t("page_title", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(HeadingDisplay::Medium), ) .with_component( Paragraph::with(html! { - (e("hello_intro", Locale::With(&LOCALE_DEMOHOME, &args![ + (_e("hello_intro", Locale::With(&LOCALE_DEMOHOME, &args![ "app" => format!( "<span class=\"app-name\">{}</span>", &config::SETTINGS.app.name, @@ -72,7 +72,7 @@ fn hello_world() -> Container { .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { - (e("hello_powered", Locale::With(&LOCALE_DEMOHOME, &args![ + (_e("hello_powered", Locale::With(&LOCALE_DEMOHOME, &args![ "pagetop" => format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://pagetop.cillero.es", @@ -83,7 +83,7 @@ fn hello_world() -> Container { .with_component( Anchor::button( "https://github.com/manuelcillero/pagetop", - html! { (t("hello_code", Locale::From(&LOCALE_DEMOHOME))) }, + html! { (_t("hello_code", Locale::From(&LOCALE_DEMOHOME))) }, ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) @@ -92,7 +92,7 @@ fn hello_world() -> Container { .with_component( Anchor::link( "#welcome", - html! { (t("hello_welcome", Locale::From(&LOCALE_DEMOHOME))) }, + html! { (_t("hello_welcome", Locale::From(&LOCALE_DEMOHOME))) }, ) .with_left_icon(Icon::with("arrow-down-circle-fill")) .with_classes(ClassesOp::Add, "welcome-link"), @@ -111,11 +111,11 @@ fn welcome() -> Container { .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") .with_component(Heading::h2(html! { - (t("welcome_page", Locale::From(&LOCALE_DEMOHOME))) + (_t("welcome_page", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Heading::h3(html! { - (e("welcome_subtitle", Locale::With(&LOCALE_DEMOHOME, &args![ + (_e("welcome_subtitle", Locale::With(&LOCALE_DEMOHOME, &args![ "app" => format!( "<span class=\"app-name\">{}</span>", &config::SETTINGS.app.name @@ -126,12 +126,12 @@ fn welcome() -> Container { ) .with_component( Paragraph::with(html! { - (t("welcome_text1", Locale::From(&LOCALE_DEMOHOME))) + (_t("welcome_text1", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with( - html! { (t("welcome_text2", Locale::From(&LOCALE_DEMOHOME))) }, + html! { (_t("welcome_text2", Locale::From(&LOCALE_DEMOHOME))) }, )) } @@ -148,23 +148,23 @@ fn about_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-text") .with_component(Heading::h2(html! { - (t("pagetop_title", Locale::From(&LOCALE_DEMOHOME))) + (_t("pagetop_title", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Paragraph::with(html! { - (t("pagetop_text1", Locale::From(&LOCALE_DEMOHOME))) + (_t("pagetop_text1", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { - (t("pagetop_text2", Locale::From(&LOCALE_DEMOHOME))) + (_t("pagetop_text2", Locale::From(&LOCALE_DEMOHOME))) })) .with_component(Paragraph::with(html! { - (e("pagetop_text3", Locale::With(&LOCALE_DEMOHOME, &args![ + (_e("pagetop_text3", Locale::With(&LOCALE_DEMOHOME, &args![ "pagetop_website" => format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://docs.rs/pagetop/latest/pagetop", - t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), + _t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), ) ]))) })), @@ -179,11 +179,11 @@ fn promo_pagetop() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-text") .with_component(Heading::h2(html! { - (t("pagetop_promo_title", Locale::From(&LOCALE_DEMOHOME))) + (_t("pagetop_promo_title", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Paragraph::with(html! { - (e("pagetop_promo_text1", Locale::With(&LOCALE_DEMOHOME, &args![ + (_e("pagetop_promo_text1", Locale::With(&LOCALE_DEMOHOME, &args![ "pagetop" => format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://crates.io/crates/pagetop", @@ -216,16 +216,16 @@ fn reporting_issues() -> Container { .with_classes(ClassesOp::Add, "reporting-col-text") .with_size(grid::ColumnSize::Is6of12) .with_component(Heading::h2(html! { - (t("report_problems_title", Locale::From(&LOCALE_DEMOHOME))) + (_t("report_problems_title", Locale::From(&LOCALE_DEMOHOME))) })) .with_component( Paragraph::with(html! { - (t("report_problems_text1", Locale::From(&LOCALE_DEMOHOME))) + (_t("report_problems_text1", Locale::From(&LOCALE_DEMOHOME))) }) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(html! { - (t("report_problems_text2", Locale::From(&LOCALE_DEMOHOME))) + (_t("report_problems_text2", Locale::From(&LOCALE_DEMOHOME))) })), ), ) diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 4e2381f9..2f9236e0 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -22,7 +22,7 @@ pub enum AnchorTarget { Context(String), } -pub type AnchorIcon = ComponentsBundle; +pub type AnchorIcon = ComponentArc; #[rustfmt::skip] #[derive(Default)] @@ -74,7 +74,7 @@ impl ComponentTrait for Anchor { target=[target] { (self.left_icon().render(rcx)) - span { (*self.html()) } + (" ") span { (*self.html()) } (" ") (self.right_icon().render(rcx)) } } @@ -158,15 +158,13 @@ impl Anchor { #[fn_builder] pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { - self.left_icon.clear(); - self.left_icon.add(icon); + self.left_icon.replace(icon); self } #[fn_builder] pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { - self.right_icon.clear(); - self.right_icon.add(icon); + self.right_icon.replace(icon); self } diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 177e811a..0e0c2d15 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -12,10 +12,10 @@ impl ModuleTrait for Menu { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_MENU)) + _t("module_name", Locale::From(&LOCALE_MENU)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_MENU))) + Some(_t("module_description", Locale::From(&LOCALE_MENU))) } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 766e2fce..5d3efac3 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for Node { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_NODE)) + _t("module_name", Locale::From(&LOCALE_NODE)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_NODE))) + Some(_t("module_description", Locale::From(&LOCALE_NODE))) } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 9bc4a16b..9e3b9d8f 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for User { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_USER)) + _t("module_name", Locale::From(&LOCALE_USER)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_USER))) + Some(_t("module_description", Locale::From(&LOCALE_USER))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -58,9 +58,9 @@ fn form_login() -> Form { .with_element( form_element::Input::textfield() .with_name("name") - .with_label(t("username", Locale::From(&LOCALE_USER)).as_str()) + .with_label(_t("username", Locale::From(&LOCALE_USER)).as_str()) .with_help_text( - t( + _t( "username_help", Locale::With( &LOCALE_USER, @@ -74,10 +74,10 @@ fn form_login() -> Form { .with_element( form_element::Input::password() .with_name("pass") - .with_label(t("password", Locale::From(&LOCALE_USER)).as_str()) - .with_help_text(t("password_help", Locale::From(&LOCALE_USER)).as_str()), + .with_label(_t("password", Locale::From(&LOCALE_USER)).as_str()) + .with_help_text(_t("password_help", Locale::From(&LOCALE_USER)).as_str()), ) .with_element(form_element::Button::submit( - t("login", Locale::From(&LOCALE_USER)).as_str(), + _t("login", Locale::From(&LOCALE_USER)).as_str(), )) } diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 9c1cdde5..88787324 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -54,7 +54,7 @@ tracing-unwrap = { version = "0.10.0", default-features = false } tracing-actix-web = "0.7.4" fluent-templates = "0.8.0" -unic-langid = "0.9.1" +unic-langid = { version = "0.9.1", features = ["macros"] } actix-web = "4" actix-session = { version = "0.7.2", features = ["cookie-session"] } diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index d69f5b8e..ca0fc6be 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -4,8 +4,8 @@ mod figfont; use crate::core::{module, module::ModuleStaticRef}; use crate::html::Markup; +use crate::response::fatal_error::FatalError; use crate::response::page::ResultPage; -use crate::response::FatalError; use crate::{config, locale, server, trace, LazyStatic}; #[cfg(feature = "database")] diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index cd596397..c17485db 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,6 +1,12 @@ +mod context; +pub use context::{ContextOp, RenderContext}; + mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; +mod arc; +pub use arc::ComponentArc; + mod bundle; pub use bundle::ComponentsBundle; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs new file mode 100644 index 00000000..3341940a --- /dev/null +++ b/pagetop/src/core/component/arc.rs @@ -0,0 +1,32 @@ +use crate::core::component::{ComponentTrait, RenderContext}; +use crate::html::{html, Markup}; + +use std::sync::{Arc, RwLock}; + +#[derive(Clone, Default)] +pub struct ComponentArc(Option<Arc<RwLock<dyn ComponentTrait>>>); + +impl ComponentArc { + pub fn new(component: impl ComponentTrait) -> Self { + ComponentArc(Some(Arc::new(RwLock::new(component)))) + } + + pub fn replace(&mut self, component: impl ComponentTrait) { + self.0 = Some(Arc::new(RwLock::new(component))); + } + + pub fn weight(&self) -> isize { + match &self.0 { + Some(component) => component.read().unwrap().weight(), + _ => 0, + } + } + + pub fn render(&self, rcx: &mut RenderContext) -> Markup { + html! { + @if let Some(component) = &self.0 { + (component.write().unwrap().render(rcx)) + } + } + } +} diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 0a0e8c95..4f25052a 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,10 +1,8 @@ -use crate::core::component::ComponentTrait; -use crate::html::{html, Markup, RenderContext}; - -use std::sync::{Arc, RwLock}; +use crate::core::component::{ComponentArc, ComponentTrait, RenderContext}; +use crate::html::{html, Markup}; #[derive(Clone, Default)] -pub struct ComponentsBundle(Vec<Arc<RwLock<dyn ComponentTrait>>>); +pub struct ComponentsBundle(Vec<ComponentArc>); impl ComponentsBundle { pub fn new() -> Self { @@ -12,13 +10,13 @@ impl ComponentsBundle { } pub fn new_with(component: impl ComponentTrait) -> Self { - let mut container = ComponentsBundle::new(); - container.add(component); - container + let mut bundle = ComponentsBundle::new(); + bundle.add(component); + bundle } pub fn add(&mut self, component: impl ComponentTrait) { - self.0.push(Arc::new(RwLock::new(component))); + self.0.push(ComponentArc::new(component)); } pub fn clear(&mut self) { @@ -27,10 +25,10 @@ impl ComponentsBundle { pub fn render(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); - components.sort_by_key(|c| c.read().unwrap().weight()); + components.sort_by_key(|c| c.weight()); html! { @for c in components.iter() { - (" ")(c.write().unwrap().render(rcx))(" ") + (" ")(c.render(rcx))(" ") } } } diff --git a/pagetop/src/html/context.rs b/pagetop/src/core/component/context.rs similarity index 94% rename from pagetop/src/html/context.rs rename to pagetop/src/core/component/context.rs index 42c05b5b..a68fe290 100644 --- a/pagetop/src/html/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,5 +1,6 @@ use crate::core::module::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; +use crate::locale::{LanguageIdentifier, LANGID}; use crate::server::HttpRequest; use crate::{concat_string, config, util, LazyStatic}; @@ -23,6 +24,7 @@ pub enum ContextOp { #[rustfmt::skip] pub struct RenderContext { + language : &'static LanguageIdentifier, theme : ThemeStaticRef, request : Option<HttpRequest>, stylesheets: Assets<StyleSheet>, @@ -35,6 +37,7 @@ impl Default for RenderContext { #[rustfmt::skip] fn default() -> Self { RenderContext { + language : &LANGID, theme : *DEFAULT_THEME, request : None, stylesheets: Assets::<StyleSheet>::new(), @@ -81,6 +84,10 @@ impl RenderContext { /// Context GETTERS. + pub(crate) fn language(&self) -> &LanguageIdentifier { + self.language + } + pub(crate) fn theme(&self) -> ThemeStaticRef { self.theme } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 85e7fac8..db683062 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,9 +1,12 @@ -use crate::html::{html, Markup, RenderContext}; +use crate::core::component::RenderContext; +use crate::html::{html, Markup}; use crate::util::single_type_name; -use crate::Handle; +use crate::{define_handle, Handle}; pub use std::any::Any as AnyComponent; +define_handle!(COMPONENT_UNDEFINED); + pub trait BaseComponent { fn render(&mut self, rcx: &mut RenderContext) -> Markup; } @@ -13,7 +16,9 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { where Self: Sized; - fn handle(&self) -> Handle; + fn handle(&self) -> Handle { + COMPONENT_UNDEFINED + } fn name(&self) -> String { single_type_name::<Self>().to_owned() diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs index a4d62d9b..3b513707 100644 --- a/pagetop/src/core/component/html_markup.rs +++ b/pagetop/src/core/component/html_markup.rs @@ -1,5 +1,5 @@ -use crate::core::component::{AnyComponent, ComponentTrait}; -use crate::html::{html, Markup, RenderContext}; +use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::html::{html, Markup}; use crate::{define_handle, Handle}; define_handle!(HTML_MARKUP); diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index aef5bb92..ce2f302c 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -1,4 +1,4 @@ -use crate::html::RenderContext; +use crate::core::component::RenderContext; pub type IsRenderable = fn(&RenderContext) -> bool; diff --git a/pagetop/src/core/module/theme.rs b/pagetop/src/core/module/theme.rs index 25fa0720..9cd81ae9 100644 --- a/pagetop/src/core/module/theme.rs +++ b/pagetop/src/core/module/theme.rs @@ -1,7 +1,7 @@ use super::ModuleTrait; -use crate::core::component::{ComponentTrait, HtmlMarkup}; -use crate::html::{html, Favicon, Markup, RenderContext}; +use crate::core::component::{ComponentTrait, RenderContext}; +use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; use crate::{concat_string, config}; @@ -118,20 +118,4 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } */ } - - fn error_404_not_found(&self) -> HtmlMarkup { - HtmlMarkup::new().with(html! { - div { - h1 { ("RESOURCE NOT FOUND") } - } - }) - } - - fn error_403_access_denied(&self) -> HtmlMarkup { - HtmlMarkup::new().with(html! { - div { - h1 { ("FORBIDDEN ACCESS") } - } - }) - } } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 6d07c9eb..fcfbbab7 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -8,9 +8,6 @@ pub use assets::javascript::{JavaScript, ModeJS}; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::Assets; -mod context; -pub use context::{ContextOp, RenderContext}; - mod favicon; pub use favicon::Favicon; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index ff551e9e..1a509744 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -85,59 +85,12 @@ pub mod server; // Tipos de respuestas a peticiones web. pub mod response; -// Funciones útiles. +// Funciones útiles y macros declarativas. pub mod util; // Prepara y ejecuta la aplicación. pub mod app; -// ************************************************************************************************* -// MACROS DECLARATIVAS. -// ************************************************************************************************* - -#[macro_export] -/// Macro para construir grupos de pares clave-valor. -/// -/// ```rust#ignore -/// let args = args![ -/// "userName" => "Roberto", -/// "photoCount" => 3, -/// "userGender" => "male" -/// ]; -/// ``` -macro_rules! args { - ( $($key:expr => $value:expr),* ) => {{ - let mut a = std::collections::HashMap::new(); - $( - a.insert(String::from($key), $value.into()); - )* - a - }}; -} - -#[macro_export] -macro_rules! define_handle { - ( $HANDLE:ident ) => { - pub const $HANDLE: $crate::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); - }; -} - -#[macro_export] -macro_rules! serve_static_files { - ( $cfg:ident, $dir:expr, $embed:ident ) => {{ - let static_files = &$crate::config::SETTINGS.dev.static_files; - if static_files.is_empty() { - $cfg.service($crate::server::ResourceFiles::new($dir, $embed())); - } else { - $cfg.service( - $crate::server::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) - .show_files_listing(), - ); - } - }}; -} - // ************************************************************************************************* // RE-EXPORTA API ÚNICA. // ************************************************************************************************* diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 09f0313d..13961e39 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -92,34 +92,49 @@ //! ``` use crate::html::{Markup, PreEscaped}; -use crate::{config, trace, LazyStatic}; +use crate::{args, config, trace, LazyStatic}; -use unic_langid::LanguageIdentifier; +use unic_langid::langid; pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; pub use fluent_templates::{static_loader as static_locale, Loader, StaticLoader as Locales}; +pub use unic_langid::LanguageIdentifier; + use std::collections::HashMap; +static LANGUAGES: LazyStatic<HashMap<String, (LanguageIdentifier, &str)>> = LazyStatic::new(|| { + args![ + "en" => (langid!("en-US"), "English"), + "en-US" => (langid!("en-US"), "English (...)"), + "es" => (langid!("es-ES"), "Spanish"), + "es-ES" => (langid!("es-ES"), "Spanish (Spain)") + ] +}); + +static DEFAULT_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| langid!("en-US")); + /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// para la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: LazyStatic<LanguageIdentifier> = - LazyStatic::new(|| match config::SETTINGS.app.language.parse() { - Ok(language) => language, - Err(_) => { - trace::warn!( - "{}, {} \"{}\"! {}, {}", - "Failed to parse language", - "unrecognized Unicode Language Identifier", - config::SETTINGS.app.language, - "Using \"en-US\"", - "check the settings file", - ); - "en-US".parse().unwrap() - } - }); +pub static LANGID: LazyStatic<&LanguageIdentifier> = + LazyStatic::new( + || match LANGUAGES.get(config::SETTINGS.app.language.as_str()) { + Some((langid, _)) => langid, + _ => { + trace::warn!( + "{}, {} \"{}\"! {}, {}", + "Failed to parse language", + "unrecognized Unicode Language Identifier", + config::SETTINGS.app.language, + "Using \"en-US\"", + "check the settings file", + ); + &*DEFAULT_LANGID + } + }, + ); #[macro_export] /// Define un conjunto de elementos de localización y funciones locales de traducción. @@ -128,7 +143,7 @@ macro_rules! define_locale { use $crate::locale::*; static_locale! { - static $LOCALES = { + pub static $LOCALES = { locales: $dir_locales, $( core_locales: $core_locales, )? fallback_language: "en-US", @@ -151,7 +166,7 @@ pub enum Locale<'a> { ), } -pub fn t(key: &str, locale: Locale) -> String { +pub fn _t(key: &str, locale: Locale) -> String { match locale { Locale::From(locales) => locales.lookup(&LANGID, key).unwrap_or(key.to_string()), Locale::With(locales, args) => locales @@ -164,6 +179,6 @@ pub fn t(key: &str, locale: Locale) -> String { } } -pub fn e(key: &str, locale: Locale) -> Markup { - PreEscaped(t(key, locale)) +pub fn _e(key: &str, locale: Locale) -> Markup { + PreEscaped(_t(key, locale)) } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 947ebe3a..2097aeec 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -30,6 +30,7 @@ pub use crate::{hook_action, hook_before_render_component}; pub use crate::server; pub use crate::server::HttpMessage; -pub use crate::response::{page::*, FatalError, ResponseError}; +pub use crate::response::fatal_error::*; +pub use crate::response::{page::*, ResponseError}; pub use crate::app::Application; diff --git a/pagetop/src/response.rs b/pagetop/src/response.rs index 569dcf50..985d918d 100644 --- a/pagetop/src/response.rs +++ b/pagetop/src/response.rs @@ -4,5 +4,4 @@ pub use actix_web::ResponseError; pub mod page; -mod fatal_error; -pub use fatal_error::FatalError; +pub mod fatal_error; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 0c17dd8e..9019818b 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -1,3 +1,8 @@ +mod error403; +pub use error403::ERROR_403; +mod error404; +pub use error404::ERROR_404; + use crate::response::{page::Page, ResponseError}; use crate::server::http::{header::ContentType, StatusCode}; use crate::server::{HttpRequest, HttpResponse}; @@ -24,11 +29,10 @@ impl fmt::Display for FatalError { FatalError::BadRequest(_) => write!(f, "Bad Client Data"), // Error 403. FatalError::AccessDenied(request) => { - let mut error_page = Page::new(request.clone()); - let error_content = error_page.context().theme().error_403_access_denied(); + let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title("Error FORBIDDEN") - .with_this_in("region-content", error_content) + .with_this_in("region-content", error403::Error403) .with_template("error") .render() { @@ -39,11 +43,10 @@ impl fmt::Display for FatalError { } // Error 404. FatalError::NotFound(request) => { - let mut error_page = Page::new(request.clone()); - let error_content = error_page.context().theme().error_404_not_found(); + let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title("Error RESOURCE NOT FOUND") - .with_this_in("region-content", error_content) + .with_this_in("region-content", error404::Error404) .with_template("error") .render() { diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs new file mode 100644 index 00000000..80ab48e9 --- /dev/null +++ b/pagetop/src/response/fatal_error/error403.rs @@ -0,0 +1,33 @@ +use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::html::{html, Markup}; +use crate::{define_handle, Handle}; + +define_handle!(ERROR_403); + +pub struct Error403; + +impl ComponentTrait for Error403 { + fn new() -> Self { + Self + } + + fn handle(&self) -> Handle { + ERROR_403 + } + + fn default_render(&self, _rcx: &mut RenderContext) -> Markup { + html! { + div { + h1 { ("FORBIDDEN ACCESS") } + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs new file mode 100644 index 00000000..cc808400 --- /dev/null +++ b/pagetop/src/response/fatal_error/error404.rs @@ -0,0 +1,33 @@ +use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::html::{html, Markup}; +use crate::{define_handle, Handle}; + +define_handle!(ERROR_404); + +pub struct Error404; + +impl ComponentTrait for Error404 { + fn new() -> Self { + Self + } + + fn handle(&self) -> Handle { + ERROR_404 + } + + fn default_render(&self, _rcx: &mut RenderContext) -> Markup { + html! { + div { + h1 { ("RESOURCE NOT FOUND") } + } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 25adbfb7..a3966374 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -2,10 +2,8 @@ use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; -use crate::html::{ - html, AttributeValue, Classes, ClassesOp, ContextOp, Favicon, Markup, RenderContext, DOCTYPE, -}; -use crate::response::FatalError; +use crate::html::{html, AttributeValue, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; +use crate::response::fatal_error::FatalError; use crate::{config, fn_builder, locale, server, trace, LazyStatic}; use std::collections::HashMap; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 986f43d4..9f58bc99 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,7 +1,11 @@ -//! Funciones útiles. +//! Funciones útiles y macros declarativas. use crate::Handle; +// ************************************************************************************************* +// FUNCIONES ÚTILES. +// ************************************************************************************************* + // https://stackoverflow.com/a/71464396 pub const fn handle( module_path: &'static str, @@ -50,3 +54,50 @@ pub fn partial_type_name(type_name: &'static str, last: usize) -> &'static str { pub fn single_type_name<T: ?Sized>() -> &'static str { partial_type_name(std::any::type_name::<T>(), 1) } + +// ************************************************************************************************* +// MACROS DECLARATIVAS. +// ************************************************************************************************* + +#[macro_export] +/// Macro para construir grupos de pares clave-valor. +/// +/// ```rust#ignore +/// let args = args![ +/// "userName" => "Roberto", +/// "photoCount" => 3, +/// "userGender" => "male" +/// ]; +/// ``` +macro_rules! args { + ( $($key:expr => $value:expr),* ) => {{ + let mut a = std::collections::HashMap::new(); + $( + a.insert(String::from($key), $value.into()); + )* + a + }}; +} + +#[macro_export] +macro_rules! define_handle { + ( $HANDLE:ident ) => { + pub const $HANDLE: $crate::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); + }; +} + +#[macro_export] +macro_rules! serve_static_files { + ( $cfg:ident, $dir:expr, $embed:ident ) => {{ + let static_files = &$crate::config::SETTINGS.dev.static_files; + if static_files.is_empty() { + $cfg.service($crate::server::ResourceFiles::new($dir, $embed())); + } else { + $cfg.service( + $crate::server::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) + .show_files_listing(), + ); + } + }}; +} From 88d6ce2a728fedf0f16aa42f56b711a14ca71b33 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 27 May 2023 20:43:35 +0200 Subject: [PATCH 315/853] =?UTF-8?q?=F0=9F=8D=BB=20Segunda=20revista=20a=20?= =?UTF-8?q?las=20traducciones=20por=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/lib.rs | 10 +++------ pagetop/src/locale.rs | 49 +++++++++++++------------------------------ pagetop/src/util.rs | 19 +++++++++++++++++ 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 1a509744..8b7e54d9 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -46,19 +46,15 @@ pub use paste::paste; pub use static_files::Resource as StaticResource; pub use tracing_unwrap::ResultExt; +#[allow(unused_imports)] +pub(crate) use futures::executor::block_on as run_now; + pub use pagetop_macros::fn_builder; pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; pub type Handle = u64; -// ************************************************************************************************* -// LOCAL. -// ************************************************************************************************* - -#[allow(unused_imports)] -pub(crate) use futures::executor::block_on as run_now; - // ************************************************************************************************* // APIs PÚBLICAS. // ************************************************************************************************* diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 13961e39..da6b498c 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -136,49 +136,30 @@ pub static LANGID: LazyStatic<&LanguageIdentifier> = }, ); -#[macro_export] -/// Define un conjunto de elementos de localización y funciones locales de traducción. -macro_rules! define_locale { - ( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => { - use $crate::locale::*; - - static_locale! { - pub static $LOCALES = { - locales: $dir_locales, - $( core_locales: $core_locales, )? - fallback_language: "en-US", - - // Elimina las marcas Unicode que delimitan los argumentos. - customise: |bundle| bundle.set_use_isolating(false), - }; - } - }; -} - pub enum Locale<'a> { From(&'a Locales), With(&'a Locales, &'a HashMap<String, FluentValue<'a>>), - Lang(&'a Locales, &'a LanguageIdentifier), Using( - &'a Locales, &'a LanguageIdentifier, + &'a Locales, &'a HashMap<String, FluentValue<'a>>, ), } -pub fn _t(key: &str, locale: Locale) -> String { - match locale { - Locale::From(locales) => locales.lookup(&LANGID, key).unwrap_or(key.to_string()), - Locale::With(locales, args) => locales - .lookup_with_args(&LANGID, key, args) - .unwrap_or(key.to_string()), - Locale::Lang(locales, langid) => locales.lookup(langid, key).unwrap_or(key.to_string()), - Locale::Using(locales, langid, args) => locales - .lookup_with_args(langid, key, args) - .unwrap_or(key.to_string()), - } +pub fn t(key: &str, locale: Locale) -> String { + translate(key, locale) } -pub fn _e(key: &str, locale: Locale) -> Markup { - PreEscaped(_t(key, locale)) +pub fn e(key: &str, locale: Locale) -> Markup { + PreEscaped(translate(key, locale)) +} + +#[inline] +pub(crate) fn translate(key: &str, locale: Locale) -> String { + match locale { + Locale::From(locales) => locales.lookup(&LANGID, key), + Locale::With(locales, args) => locales.lookup_with_args(&LANGID, key, args), + Locale::Using(langid, locales, args) => locales.lookup_with_args(langid, key, args), + } + .unwrap_or(key.to_string()) } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 9f58bc99..fef23386 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -87,6 +87,25 @@ macro_rules! define_handle { }; } +#[macro_export] +/// Define un conjunto de elementos de localización y funciones locales de traducción. +macro_rules! define_locale { + ( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => { + use $crate::locale::*; + + static_locale! { + pub static $LOCALES = { + locales: $dir_locales, + $( core_locales: $core_locales, )? + fallback_language: "en-US", + + // Elimina las marcas Unicode que delimitan los argumentos. + customise: |bundle| bundle.set_use_isolating(false), + }; + } + }; +} + #[macro_export] macro_rules! serve_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ From dd443ca37522abbe419869b402a5de370470a4be Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 27 May 2023 22:44:12 +0200 Subject: [PATCH 316/853] =?UTF-8?q?=F0=9F=8D=BB=20Tercera=20revista=20a=20?= =?UTF-8?q?las=20traducciones=20por=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-admin/src/summary.rs | 48 +++--- pagetop-bootsier/src/lib.rs | 6 +- pagetop-homedemo/src/lib.rs | 155 ++++++++---------- pagetop-megamenu/src/component.rs | 32 ++-- pagetop-minimal/src/component/anchor.rs | 25 +-- .../src/component/form_element/button.rs | 22 +-- .../src/component/form_element/input.rs | 27 +-- pagetop-minimal/src/component/heading.rs | 50 +++--- pagetop-minimal/src/component/paragraph.rs | 6 +- pagetop-minimal/src/module/menu.rs | 4 +- pagetop-node/src/lib.rs | 6 +- pagetop-user/src/lib.rs | 26 +-- pagetop/src/core/component.rs | 6 + pagetop/src/core/component/arc.rs | 43 +++-- pagetop/src/core/component/bundle.rs | 2 +- pagetop/src/core/component/default.rs | 18 ++ pagetop/src/core/component/l10n.rs | 138 ++++++++++++++++ pagetop/src/core/module/theme.rs | 17 +- pagetop/src/response/fatal_error.rs | 5 +- pagetop/src/response/page/definition.rs | 27 +-- 21 files changed, 415 insertions(+), 252 deletions(-) create mode 100644 pagetop/src/core/component/default.rs create mode 100644 pagetop/src/core/component/l10n.rs diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index a2d30ead..a6b211ff 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -14,11 +14,11 @@ impl ModuleTrait for Admin { } fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_ADMIN)) + t("module_name", Locale::From(&LOCALE_ADMIN)) } fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_ADMIN))) + Some(t("module_description", Locale::From(&LOCALE_ADMIN))) } #[rustfmt::skip] diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index de844279..62f35817 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -5,54 +5,58 @@ use pagetop_minimal::component::*; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() - .with_item(MegaMenuItem::label( - _t("module_name", Locale::From(&LOCALE_ADMIN)).as_str(), + .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALE_ADMIN))) + .with_item(MegaMenuItem::link( + L10n::n("Opción 2"), + "https://www.google.es", )) - .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) .with_item(MegaMenuItem::link_blank( - "Opción 3", + L10n::n("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - "Submenú 1", + L10n::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label("Opción 1")) - .with_item(MegaMenuItem::label("Opción 2")), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - "Submenú 2", + L10n::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label("Opción 1")) - .with_item(MegaMenuItem::label("Opción 2")), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::label("Opción 4")); + .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); let side_menu = MegaMenu::new() - .with_item(MegaMenuItem::label("Opción 1")) - .with_item(MegaMenuItem::link("Opción 2", "https://www.google.es")) + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::link( + L10n::n("Opción 2"), + "https://www.google.es", + )) .with_item(MegaMenuItem::link_blank( - "Opción 3", + L10n::n("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - "Submenú 1", + L10n::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label("Opción 1")) - .with_item(MegaMenuItem::label("Opción 2")), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - "Submenú 2", + L10n::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label("Opción 1")) - .with_item(MegaMenuItem::label("Opción 2")), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::label("Opción 4")); + .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); Page::new(request) .with_context(ContextOp::Theme("Bootsier")) - .with_title("Admin") + .with_title(L10n::n("Admin")) .with_this_in("top-menu", top_menu) .with_this_in( "region-content", diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index f7905663..0f87b99a 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -58,15 +58,15 @@ impl ThemeTrait for Bootsier { alt="Caution!"; div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } - p class="lead" { (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + p class="lead" { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } hr class="my-4"; - p { (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + p { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } a class="btn btn-primary btn-lg" href="/" role="button" { - (_t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) + (t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) } } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 38a1a171..c8f18fb0 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for HomeDemo { } fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_DEMOHOME)) + t("module_name", Locale::From(&LOCALE_DEMOHOME)) } fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_DEMOHOME))) + Some(t("module_description", Locale::From(&LOCALE_DEMOHOME))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -34,7 +34,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(_t("page_title", Locale::From(&LOCALE_DEMOHOME)).as_str()) + .with_title(L10n::t("page_title", &LOCALE_DEMOHOME)) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/homedemo/css/styles.css", ))) @@ -55,47 +55,41 @@ fn hello_world() -> Container { .with_classes(ClassesOp::Add, "hello-col-text") .with_size(grid::ColumnSize::Is5of12) .with_component( - Heading::h1(html! { - (_t("page_title", Locale::From(&LOCALE_DEMOHOME))) - }) - .with_display(HeadingDisplay::Medium), + Heading::h1(L10n::t("page_title", &LOCALE_DEMOHOME)) + .with_display(HeadingDisplay::Medium), ) .with_component( - Paragraph::with(html! { - (_e("hello_intro", Locale::With(&LOCALE_DEMOHOME, &args![ - "app" => format!( - "<span class=\"app-name\">{}</span>", - &config::SETTINGS.app.name, - ) - ]))) - }) + Paragraph::with(L10n::e("hello_intro", &LOCALE_DEMOHOME).with_arg( + "app", + format!( + "<span class=\"app-name\">{}</span>", + &config::SETTINGS.app.name, + ), + )) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(html! { - (_e("hello_powered", Locale::With(&LOCALE_DEMOHOME, &args![ - "pagetop" => format!( + .with_component(Paragraph::with( + L10n::e("hello_powered", &LOCALE_DEMOHOME).with_arg( + "pagetop", + format!( "<a href=\"{}\" target=\"_blank\">{}</a>", - "https://pagetop.cillero.es", - "PageTop", - ) - ]))) - })) + "https://pagetop.cillero.es", "PageTop", + ), + ), + )) .with_component( Anchor::button( "https://github.com/manuelcillero/pagetop", - html! { (_t("hello_code", Locale::From(&LOCALE_DEMOHOME))) }, + L10n::t("hello_code", &LOCALE_DEMOHOME), ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::link( - "#welcome", - html! { (_t("hello_welcome", Locale::From(&LOCALE_DEMOHOME))) }, - ) - .with_left_icon(Icon::with("arrow-down-circle-fill")) - .with_classes(ClassesOp::Add, "welcome-link"), + Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALE_DEMOHOME)) + .with_left_icon(Icon::with("arrow-down-circle-fill")) + .with_classes(ClassesOp::Add, "welcome-link"), ), ) .with_column( @@ -110,29 +104,22 @@ fn welcome() -> Container { Container::section() .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") - .with_component(Heading::h2(html! { - (_t("welcome_page", Locale::From(&LOCALE_DEMOHOME))) - })) + .with_component(Heading::h2(L10n::t("welcome_page", &LOCALE_DEMOHOME))) .with_component( - Heading::h3(html! { - (_e("welcome_subtitle", Locale::With(&LOCALE_DEMOHOME, &args![ - "app" => format!( - "<span class=\"app-name\">{}</span>", - &config::SETTINGS.app.name - ) - ]))) - }) + Heading::h3(L10n::e("welcome_subtitle", &LOCALE_DEMOHOME).with_arg( + "app", + format!( + "<span class=\"app-name\">{}</span>", + &config::SETTINGS.app.name + ), + )) .with_display(HeadingDisplay::Subtitle), ) .with_component( - Paragraph::with(html! { - (_t("welcome_text1", Locale::From(&LOCALE_DEMOHOME))) - }) - .with_display(ParagraphDisplay::Small), + Paragraph::with(L10n::t("welcome_text1", &LOCALE_DEMOHOME)) + .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with( - html! { (_t("welcome_text2", Locale::From(&LOCALE_DEMOHOME))) }, - )) + .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALE_DEMOHOME))) } fn about_pagetop() -> Container { @@ -147,27 +134,22 @@ fn about_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-text") - .with_component(Heading::h2(html! { - (_t("pagetop_title", Locale::From(&LOCALE_DEMOHOME))) - })) + .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALE_DEMOHOME))) .with_component( - Paragraph::with(html! { - (_t("pagetop_text1", Locale::From(&LOCALE_DEMOHOME))) - }) - .with_display(ParagraphDisplay::Small), + Paragraph::with(L10n::t("pagetop_text1", &LOCALE_DEMOHOME)) + .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(html! { - (_t("pagetop_text2", Locale::From(&LOCALE_DEMOHOME))) - })) - .with_component(Paragraph::with(html! { - (_e("pagetop_text3", Locale::With(&LOCALE_DEMOHOME, &args![ - "pagetop_website" => format!( + .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALE_DEMOHOME))) + .with_component(Paragraph::with( + L10n::e("pagetop_text3", &LOCALE_DEMOHOME).with_arg( + "pagetop_website", + format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://docs.rs/pagetop/latest/pagetop", - _t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), - ) - ]))) - })), + t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), + ), + ), + )), ), ) } @@ -178,19 +160,18 @@ fn promo_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-text") - .with_component(Heading::h2(html! { - (_t("pagetop_promo_title", Locale::From(&LOCALE_DEMOHOME))) - })) + .with_component(Heading::h2(L10n::t( + "pagetop_promo_title", + &LOCALE_DEMOHOME, + ))) .with_component( - Paragraph::with(html! { - (_e("pagetop_promo_text1", Locale::With(&LOCALE_DEMOHOME, &args![ - "pagetop" => format!( - "<a href=\"{}\" target=\"_blank\">{}</a>", - "https://crates.io/crates/pagetop", - "PageTop", - ) - ]))) - }) + Paragraph::with(L10n::e("pagetop_promo_text1", &LOCALE_DEMOHOME).with_arg( + "pagetop", + format!( + "<a href=\"{}\" target=\"_blank\">{}</a>", + "https://crates.io/crates/pagetop", "PageTop", + ), + )) .with_display(ParagraphDisplay::Small), ), ) @@ -215,18 +196,18 @@ fn reporting_issues() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "reporting-col-text") .with_size(grid::ColumnSize::Is6of12) - .with_component(Heading::h2(html! { - (_t("report_problems_title", Locale::From(&LOCALE_DEMOHOME))) - })) + .with_component(Heading::h2(L10n::t( + "report_problems_title", + &LOCALE_DEMOHOME, + ))) .with_component( - Paragraph::with(html! { - (_t("report_problems_text1", Locale::From(&LOCALE_DEMOHOME))) - }) - .with_display(ParagraphDisplay::Small), + Paragraph::with(L10n::t("report_problems_text1", &LOCALE_DEMOHOME)) + .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(html! { - (_t("report_problems_text2", Locale::From(&LOCALE_DEMOHOME))) - })), + .with_component(Paragraph::with(L10n::t( + "report_problems_text2", + &LOCALE_DEMOHOME, + ))), ), ) } diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 29177da2..98819c1c 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -6,11 +6,11 @@ define_handle!(COMPONENT_MEGAMENUITEM); pub enum MegaMenuItemType { #[default] Void, - Label(String), - Link(String, String), - LinkBlank(String, String), + Label(ComponentArc), + Link(ComponentArc, String), + LinkBlank(ComponentArc, String), Html(Markup), - Submenu(String, MegaMenu), + Submenu(ComponentArc, MegaMenu), Separator, } @@ -46,14 +46,14 @@ impl ComponentTrait for MegaMenuItem { MegaMenuItemType::Void => html! {}, MegaMenuItemType::Label(label) => html! { - li class="label" { a href="#" { (label) } } + li class="label" { a href="#" { (label.render(rcx)) } } }, MegaMenuItemType::Link(label, path) => html! { - li class="link" { a href=(path) { (label) } } + li class="link" { a href=(path) { (label.render(rcx)) } } }, MegaMenuItemType::LinkBlank(label, path) => html! { li class="link_blank" { - a href=(path) target="_blank" { (label) } + a href=(path) target="_blank" { (label.render(rcx)) } } }, MegaMenuItemType::Html(html) => html! { @@ -61,7 +61,7 @@ impl ComponentTrait for MegaMenuItem { }, MegaMenuItemType::Submenu(label, menu) => html! { li class="submenu" { - a href="#" { (label) } + a href="#" { (label.render(rcx)) } ul { (menu.items().render(rcx)) } @@ -83,23 +83,23 @@ impl ComponentTrait for MegaMenuItem { } impl MegaMenuItem { - pub fn label(label: &str) -> Self { + pub fn label(label: L10n) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Label(label.to_owned()), + item_type: MegaMenuItemType::Label(ComponentArc::new_with(label)), ..Default::default() } } - pub fn link(label: &str, path: &str) -> Self { + pub fn link(label: L10n, path: &str) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Link(label.to_owned(), path.to_owned()), + item_type: MegaMenuItemType::Link(ComponentArc::new_with(label), path.to_owned()), ..Default::default() } } - pub fn link_blank(label: &str, path: &str) -> Self { + pub fn link_blank(label: L10n, path: &str) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::LinkBlank(label.to_owned(), path.to_owned()), + item_type: MegaMenuItemType::LinkBlank(ComponentArc::new_with(label), path.to_owned()), ..Default::default() } } @@ -111,9 +111,9 @@ impl MegaMenuItem { } } - pub fn submenu(label: &str, menu: MegaMenu) -> Self { + pub fn submenu(label: L10n, menu: MegaMenu) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Submenu(label.to_owned(), menu), + item_type: MegaMenuItemType::Submenu(ComponentArc::new_with(label), menu), ..Default::default() } } diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 2f9236e0..3829c3f0 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -23,6 +23,7 @@ pub enum AnchorTarget { } pub type AnchorIcon = ComponentArc; +pub type AnchorHtml = ComponentArc; #[rustfmt::skip] #[derive(Default)] @@ -33,7 +34,7 @@ pub struct Anchor { classes : Classes, anchor_type: AnchorType, href : AttributeValue, - html : HtmlMarkup, + html10n : AnchorHtml, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, @@ -74,7 +75,7 @@ impl ComponentTrait for Anchor { target=[target] { (self.left_icon().render(rcx)) - (" ") span { (*self.html()) } (" ") + (" ") span { (self.html().render(rcx)) } (" ") (self.right_icon().render(rcx)) } } @@ -90,15 +91,15 @@ impl ComponentTrait for Anchor { } impl Anchor { - pub fn link(href: &str, html: Markup) -> Self { - Anchor::new().with_href(href).with_html(html) + pub fn link(href: &str, html10n: L10n) -> Self { + Anchor::new().with_href(href).with_html(html10n) } - pub fn button(href: &str, html: Markup) -> Self { + pub fn button(href: &str, html10n: L10n) -> Self { Anchor::new() .with_type(AnchorType::Button) .with_href(href) - .with_html(html) + .with_html(html10n) } pub fn location(id: &str) -> Self { @@ -151,20 +152,20 @@ impl Anchor { } #[fn_builder] - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html.markup = html; + pub fn alter_html(&mut self, html10n: L10n) -> &mut Self { + self.html10n.set(html10n); self } #[fn_builder] pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { - self.left_icon.replace(icon); + self.left_icon.set(icon); self } #[fn_builder] pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { - self.right_icon.replace(icon); + self.right_icon.set(icon); self } @@ -198,8 +199,8 @@ impl Anchor { &self.href } - pub fn html(&self) -> &Markup { - &self.html.markup + pub fn html(&self) -> &AnchorHtml { + &self.html10n } pub fn left_icon(&self) -> &AnchorIcon { diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index ebf8c04b..b9e1d1ae 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -10,6 +10,8 @@ pub enum ButtonType { Reset, } +pub type ButtonValue = ComponentArc; + #[rustfmt::skip] #[derive(Default)] pub struct Button { @@ -18,7 +20,7 @@ pub struct Button { classes : Classes, button_type: ButtonType, name : AttributeValue, - value : AttributeValue, + value : ButtonValue, autofocus : AttributeValue, disabled : AttributeValue, template : String, @@ -43,7 +45,7 @@ impl ComponentTrait for Button { (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Submit => "submit", @@ -56,11 +58,11 @@ impl ComponentTrait for Button { id=[id] class=[self.classes().get()] name=[self.name().get()] - value=[self.value().get()] + value=(self.value().render(rcx)) autofocus=[self.autofocus().get()] disabled=[self.disabled().get()] { - @if let Some(value) = self.value().get() { (value) } + (self.value().render(rcx)) } } } @@ -75,11 +77,11 @@ impl ComponentTrait for Button { } impl Button { - pub fn with(value: &str) -> Self { + pub fn with(value: L10n) -> Self { Button::new().with_value(value) } - pub fn submit(value: &str) -> Self { + pub fn submit(value: L10n) -> Self { let mut button = Button::new() .with_classes(ClassesOp::Replace("form-button"), "form-submit") .with_value(value); @@ -87,7 +89,7 @@ impl Button { button } - pub fn reset(value: &str) -> Self { + pub fn reset(value: L10n) -> Self { let mut button = Button::new() .with_classes(ClassesOp::Replace("form-button"), "form-reset") .with_value(value); @@ -122,8 +124,8 @@ impl Button { } #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); + pub fn alter_value(&mut self, value: L10n) -> &mut Self { + self.value.set(value); self } @@ -165,7 +167,7 @@ impl Button { &self.name } - pub fn value(&self) -> &AttributeValue { + pub fn value(&self) -> &ButtonValue { &self.value } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 6080313e..839e0b16 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -13,6 +13,9 @@ pub enum InputType { Url, } +pub type InputLabel = ComponentArc; +pub type InputHelpText = ComponentArc; + #[rustfmt::skip] #[derive(Default)] pub struct Input { @@ -22,7 +25,7 @@ pub struct Input { input_type : InputType, name : NameValue, value : AttributeValue, - label : AttributeValue, + label : InputLabel, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, @@ -32,7 +35,7 @@ pub struct Input { disabled : AttributeValue, readonly : AttributeValue, required : AttributeValue, - help_text : AttributeValue, + help_text : InputHelpText, template : String, } @@ -58,7 +61,7 @@ impl ComponentTrait for Input { } #[rustfmt::skip] - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { let type_input = match self.input_type() { InputType::Textfield => "text", InputType::Password => "password", @@ -70,7 +73,7 @@ impl ComponentTrait for Input { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { - @if let Some(label) = self.label().get() { + @if let Some(label) = self.label().optional_render(rcx) { label class="form-label" for=[&id] { (label) " " @if self.required().get().is_some() { @@ -95,8 +98,8 @@ impl ComponentTrait for Input { readonly=[self.readonly().get()] required=[self.required().get()] disabled=[self.disabled().get()]; - @if let Some(help_text) = self.help_text().get() { - div class="form-text" { (help_text) } + @if let Some(description) = self.help_text().optional_render(rcx) { + div class="form-text" { (description) } } } } @@ -203,8 +206,8 @@ impl Input { } #[fn_builder] - pub fn alter_label(&mut self, label: &str) -> &mut Self { - self.label.alter_value(label); + pub fn alter_label(&mut self, label: L10n) -> &mut Self { + self.label.set(label); self } @@ -278,8 +281,8 @@ impl Input { } #[fn_builder] - pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { - self.help_text.alter_value(help_text); + pub fn alter_help_text(&mut self, help_text: L10n) -> &mut Self { + self.help_text.set(help_text); self } @@ -307,7 +310,7 @@ impl Input { &self.value } - pub fn label(&self) -> &AttributeValue { + pub fn label(&self) -> &InputLabel { &self.label } @@ -347,7 +350,7 @@ impl Input { &self.required } - pub fn help_text(&self) -> &AttributeValue { + pub fn help_text(&self) -> &InputHelpText { &self.help_text } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 5264ac05..81e71f09 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -25,6 +25,8 @@ pub enum HeadingDisplay { Subtitle, } +pub type HeadingText = ComponentArc; + #[rustfmt::skip] #[derive(Default)] pub struct Heading { @@ -33,7 +35,7 @@ pub struct Heading { id : IdentifierValue, classes : Classes, heading_type: HeadingType, - html : HtmlMarkup, + text : HeadingText, display : HeadingDisplay, template : String, } @@ -55,16 +57,16 @@ impl ComponentTrait for Heading { (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn default_render(&self, rcx: &mut RenderContext) -> Markup { let id = self.id().get(); let classes = self.classes().get(); html! { @match &self.heading_type() { - HeadingType::H1 => h1 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H2 => h2 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H3 => h3 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H4 => h4 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H5 => h5 id=[id] class=[classes] { (*self.html()) }, - HeadingType::H6 => h6 id=[id] class=[classes] { (*self.html()) }, + HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().render(rcx)) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().render(rcx)) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().render(rcx)) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().render(rcx)) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().render(rcx)) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().render(rcx)) }, }} } @@ -78,40 +80,40 @@ impl ComponentTrait for Heading { } impl Heading { - pub fn h1(html: Markup) -> Self { + pub fn h1(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H1) - .with_html(html) + .with_text(text) } - pub fn h2(html: Markup) -> Self { + pub fn h2(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H2) - .with_html(html) + .with_text(text) } - pub fn h3(html: Markup) -> Self { + pub fn h3(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H3) - .with_html(html) + .with_text(text) } - pub fn h4(html: Markup) -> Self { + pub fn h4(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H4) - .with_html(html) + .with_text(text) } - pub fn h5(html: Markup) -> Self { + pub fn h5(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H5) - .with_html(html) + .with_text(text) } - pub fn h6(html: Markup) -> Self { + pub fn h6(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H6) - .with_html(html) + .with_text(text) } // Heading BUILDER. @@ -147,8 +149,8 @@ impl Heading { } #[fn_builder] - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html.markup = html; + pub fn alter_text(&mut self, text: L10n) -> &mut Self { + self.text.set(text); self } @@ -191,8 +193,8 @@ impl Heading { &self.heading_type } - pub fn html(&self) -> &Markup { - &self.html.markup + pub fn text(&self) -> &HeadingText { + &self.text } pub fn display(&self) -> &HeadingDisplay { diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 89ea8f23..ee3a047d 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -1,7 +1,5 @@ use pagetop::prelude::*; -use crate::component::Html; - define_handle!(COMPONENT_PARAGRAPH); #[derive(Default)] @@ -65,8 +63,8 @@ impl ComponentTrait for Paragraph { } impl Paragraph { - pub fn with(html: Markup) -> Self { - Paragraph::new().with_component(Html::with(html)) + pub fn with(component: impl ComponentTrait) -> Self { + Paragraph::new().with_component(component) } // Paragraph BUILDER. diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 0e0c2d15..177e811a 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -12,10 +12,10 @@ impl ModuleTrait for Menu { } fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_MENU)) + t("module_name", Locale::From(&LOCALE_MENU)) } fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_MENU))) + Some(t("module_description", Locale::From(&LOCALE_MENU))) } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 5d3efac3..cc51d45e 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for Node { } fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_NODE)) + t("module_name", Locale::From(&LOCALE_NODE)) } fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_NODE))) + Some(t("module_description", Locale::From(&LOCALE_NODE))) } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { @@ -41,7 +41,7 @@ impl ModuleTrait for Node { } async fn node(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { - Page::new(request).with_title("Nodo").render() + Page::new(request).with_title(L10n::n("Nodo")).render() } fn before_render_page(page: &mut Page) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 9e3b9d8f..1b2e50cb 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for User { } fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_USER)) + t("module_name", Locale::From(&LOCALE_USER)) } fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_USER))) + Some(t("module_description", Locale::From(&LOCALE_USER))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -42,7 +42,7 @@ impl ModuleTrait for User { async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title("Identificación del usuario") + .with_title(L10n::n("Identificación del usuario")) .with_this_in( "region-content", Container::new() @@ -58,26 +58,18 @@ fn form_login() -> Form { .with_element( form_element::Input::textfield() .with_name("name") - .with_label(_t("username", Locale::From(&LOCALE_USER)).as_str()) + .with_label(L10n::t("username", &LOCALE_USER)) .with_help_text( - _t( - "username_help", - Locale::With( - &LOCALE_USER, - &args!["app" => config::SETTINGS.app.name.to_owned()], - ), - ) - .as_str(), + L10n::t("username_help", &LOCALE_USER) + .with_arg("app", config::SETTINGS.app.name.to_owned()), ) .with_autofocus(true), ) .with_element( form_element::Input::password() .with_name("pass") - .with_label(_t("password", Locale::From(&LOCALE_USER)).as_str()) - .with_help_text(_t("password_help", Locale::From(&LOCALE_USER)).as_str()), + .with_label(L10n::t("password", &LOCALE_USER)) + .with_help_text(L10n::t("password_help", &LOCALE_USER)), ) - .with_element(form_element::Button::submit( - _t("login", Locale::From(&LOCALE_USER)).as_str(), - )) + .with_element(form_element::Button::submit(L10n::t("login", &LOCALE_USER))) } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index c17485db..daa3dfa0 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -4,6 +4,9 @@ pub use context::{ContextOp, RenderContext}; mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; +mod default; +pub(crate) use default::DefaultComponent; + mod arc; pub use arc::ComponentArc; @@ -19,3 +22,6 @@ pub use renderable::{IsRenderable, Renderable}; mod html_markup; pub use html_markup::HtmlMarkup; + +mod l10n; +pub use l10n::L10n; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs index 3341940a..3b8c68f4 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc.rs @@ -1,32 +1,45 @@ -use crate::core::component::{ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, DefaultComponent, RenderContext}; use crate::html::{html, Markup}; use std::sync::{Arc, RwLock}; -#[derive(Clone, Default)] -pub struct ComponentArc(Option<Arc<RwLock<dyn ComponentTrait>>>); +#[derive(Clone)] +pub struct ComponentArc(Arc<RwLock<dyn ComponentTrait>>); + +impl Default for ComponentArc { + fn default() -> Self { + ComponentArc(Arc::new(RwLock::new(DefaultComponent))) + } +} impl ComponentArc { - pub fn new(component: impl ComponentTrait) -> Self { - ComponentArc(Some(Arc::new(RwLock::new(component)))) + pub fn new() -> Self { + ComponentArc::default() } - pub fn replace(&mut self, component: impl ComponentTrait) { - self.0 = Some(Arc::new(RwLock::new(component))); + pub fn new_with(component: impl ComponentTrait) -> Self { + ComponentArc(Arc::new(RwLock::new(component))) + } + + pub fn set(&mut self, component: impl ComponentTrait) { + self.0 = Arc::new(RwLock::new(component)); } pub fn weight(&self) -> isize { - match &self.0 { - Some(component) => component.read().unwrap().weight(), - _ => 0, - } + self.0.read().unwrap().weight() } + // ComponentArc RENDER. + pub fn render(&self, rcx: &mut RenderContext) -> Markup { - html! { - @if let Some(component) = &self.0 { - (component.write().unwrap().render(rcx)) - } + self.0.write().unwrap().render(rcx) + } + + pub fn optional_render(&self, rcx: &mut RenderContext) -> Option<Markup> { + let render = self.0.write().unwrap().render(rcx).into_string(); + if !render.trim().is_empty() { + return Some(html! { (render) }); } + None } } diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 4f25052a..a56d0350 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -16,7 +16,7 @@ impl ComponentsBundle { } pub fn add(&mut self, component: impl ComponentTrait) { - self.0.push(ComponentArc::new(component)); + self.0.push(ComponentArc::new_with(component)); } pub fn clear(&mut self) { diff --git a/pagetop/src/core/component/default.rs b/pagetop/src/core/component/default.rs new file mode 100644 index 00000000..0482473c --- /dev/null +++ b/pagetop/src/core/component/default.rs @@ -0,0 +1,18 @@ +use crate::core::component::{AnyComponent, ComponentTrait}; + +#[derive(Default)] +pub struct DefaultComponent; + +impl ComponentTrait for DefaultComponent { + fn new() -> Self { + DefaultComponent::default() + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs new file mode 100644 index 00000000..d369ac99 --- /dev/null +++ b/pagetop/src/core/component/l10n.rs @@ -0,0 +1,138 @@ +use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::html::{html, Markup, PreEscaped}; +use crate::locale::{translate, Locale, Locales}; +use crate::{define_handle, fn_builder, Handle}; + +use std::collections::HashMap; + +define_handle!(COMPONENT_L10N); + +#[rustfmt::skip] +#[derive(Default)] +pub struct L10n { + key : &'static str, + locales: Option<&'static Locales>, + args : HashMap<&'static str, String>, + escaped: bool, +} + +impl ComponentTrait for L10n { + fn new() -> Self { + L10n::default() + } + + fn handle(&self) -> Handle { + COMPONENT_L10N + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + if let Some(locales) = self.locales() { + html! { + @if self.escaped() { + (PreEscaped(translate( + self.key(), + Locale::Using( + rcx.language(), + locales, + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }) + ) + ))) + } @else { + (translate( + self.key(), + Locale::Using( + rcx.language(), + locales, + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }) + ) + )) + } + } + } else { + html! { (self.key()) } + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl L10n { + pub fn n(text: &'static str) -> Self { + L10n { + key: text, + ..Default::default() + } + } + + pub fn t(key: &'static str, locales: &'static Locales) -> Self { + L10n { + key, + locales: Some(locales), + ..Default::default() + } + } + + pub fn e(key: &'static str, locales: &'static Locales) -> Self { + L10n { + key, + locales: Some(locales), + escaped: true, + ..Default::default() + } + } + + // HtmL10n BUILDER. + + #[fn_builder] + pub fn alter_key(&mut self, key: &'static str) -> &mut Self { + self.key = key; + self + } + + #[fn_builder] + pub fn alter_locales(&mut self, locales: &'static Locales) -> &mut Self { + self.locales = Some(locales); + self + } + + #[fn_builder] + pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { + self.args.insert(arg, value); + self + } + + pub fn clear_args(&mut self) -> &mut Self { + self.args.drain(); + self + } + + // HtmL10n GETTERS. + + pub fn key(&self) -> &str { + self.key + } + + pub fn locales(&self) -> Option<&Locales> { + self.locales + } + + pub fn args(&self) -> &HashMap<&str, String> { + &self.args + } + + pub fn escaped(&self) -> bool { + self.escaped + } +} diff --git a/pagetop/src/core/module/theme.rs b/pagetop/src/core/module/theme.rs index 9cd81ae9..343a602a 100644 --- a/pagetop/src/core/module/theme.rs +++ b/pagetop/src/core/module/theme.rs @@ -1,9 +1,9 @@ use super::ModuleTrait; +use crate::config; use crate::core::component::{ComponentTrait, RenderContext}; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; -use crate::{concat_string, config}; pub type ThemeStaticRef = &'static dyn ThemeTrait; @@ -17,20 +17,21 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } fn render_page_head(&self, page: &mut Page) -> Markup { + let title = page.title(); + let description = page.description(); let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { head { meta charset="utf-8"; - @match page.title().get() { - Some(t) => title { - (concat_string!(config::SETTINGS.app.name, " | ", t)) - }, - None => title { (config::SETTINGS.app.name) } + @if !title.is_empty() { + title { (config::SETTINGS.app.name) (" | ") (title) } + } @else { + title { (config::SETTINGS.app.name) } } - @if let Some(d) = page.description().get() { - meta name="description" content=(d); + @if !description.is_empty() { + meta name="description" content=(description); } meta name="viewport" content=(viewport); diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 9019818b..6e53448a 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,6 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; +use crate::core::component::L10n; use crate::response::{page::Page, ResponseError}; use crate::server::http::{header::ContentType, StatusCode}; use crate::server::{HttpRequest, HttpResponse}; @@ -31,7 +32,7 @@ impl fmt::Display for FatalError { FatalError::AccessDenied(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title("Error FORBIDDEN") + .with_title(L10n::n("Error FORBIDDEN")) .with_this_in("region-content", error403::Error403) .with_template("error") .render() @@ -45,7 +46,7 @@ impl fmt::Display for FatalError { FatalError::NotFound(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title("Error RESOURCE NOT FOUND") + .with_title(L10n::n("Error RESOURCE NOT FOUND")) .with_this_in("region-content", error404::Error404) .with_template("error") .render() diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index a3966374..74f26f01 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -32,12 +32,15 @@ pub enum TextDirection { RightToLeft, } +pub type PageTitle = ComponentArc; +pub type PageDescription = ComponentArc; + #[rustfmt::skip] pub struct Page { language : AttributeValue, direction : AttributeValue, - title : AttributeValue, - description : AttributeValue, + title : PageTitle, + description : PageDescription, metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, favicon : Option<Favicon>, @@ -56,8 +59,8 @@ impl Default for Page { Some(direction) => AttributeValue::new().with_value(direction), _ => AttributeValue::new(), }, - title : AttributeValue::new(), - description : AttributeValue::new(), + title : PageTitle::new(), + description : PageDescription::new(), metadata : Vec::new(), properties : Vec::new(), favicon : None, @@ -95,14 +98,14 @@ impl Page { } #[fn_builder] - pub fn alter_title(&mut self, title: &str) -> &mut Self { - self.title.alter_value(title); + pub fn alter_title(&mut self, title: L10n) -> &mut Self { + self.title.set(title); self } #[fn_builder] - pub fn alter_description(&mut self, description: &str) -> &mut Self { - self.description.alter_value(description); + pub fn alter_description(&mut self, description: L10n) -> &mut Self { + self.description.set(description); self } @@ -167,12 +170,12 @@ impl Page { &self.direction } - pub fn title(&self) -> &AttributeValue { - &self.title + pub fn title(&mut self) -> String { + self.title.render(&mut self.context).into_string() } - pub fn description(&self) -> &AttributeValue { - &self.description + pub fn description(&mut self) -> String { + self.description.render(&mut self.context).into_string() } pub fn metadata(&self) -> &Vec<(&str, &str)> { From 23a6f36f62b33f7aef4ebecbf986e9a59df7b76e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 09:08:29 +0200 Subject: [PATCH 317/853] =?UTF-8?q?=E2=9C=A8=20Define=20OneComponent=20con?= =?UTF-8?q?=20tipado=20restringido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 18 ++++---- pagetop-minimal/src/component.rs | 2 +- pagetop-minimal/src/component/anchor.rs | 4 +- .../src/component/form_element/button.rs | 2 +- .../src/component/form_element/input.rs | 4 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop/src/core/component.rs | 7 +-- pagetop/src/core/component/arc.rs | 45 ------------------- pagetop/src/core/component/bundle.rs | 12 ++--- pagetop/src/core/component/default.rs | 18 -------- pagetop/src/core/component/one.rs | 40 +++++++++++++++++ pagetop/src/response/page/definition.rs | 4 +- 12 files changed, 68 insertions(+), 90 deletions(-) delete mode 100644 pagetop/src/core/component/arc.rs delete mode 100644 pagetop/src/core/component/default.rs create mode 100644 pagetop/src/core/component/one.rs diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 98819c1c..0ab90d37 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -2,15 +2,17 @@ use pagetop::prelude::*; define_handle!(COMPONENT_MEGAMENUITEM); +type Label = OneComponent<L10n>; + #[derive(Default)] pub enum MegaMenuItemType { #[default] Void, - Label(ComponentArc), - Link(ComponentArc, String), - LinkBlank(ComponentArc, String), + Label(Label), + Link(Label, String), + LinkBlank(Label, String), Html(Markup), - Submenu(ComponentArc, MegaMenu), + Submenu(Label, MegaMenu), Separator, } @@ -85,21 +87,21 @@ impl ComponentTrait for MegaMenuItem { impl MegaMenuItem { pub fn label(label: L10n) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Label(ComponentArc::new_with(label)), + item_type: MegaMenuItemType::Label(OneComponent::new_with(label)), ..Default::default() } } pub fn link(label: L10n, path: &str) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Link(ComponentArc::new_with(label), path.to_owned()), + item_type: MegaMenuItemType::Link(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } pub fn link_blank(label: L10n, path: &str) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::LinkBlank(ComponentArc::new_with(label), path.to_owned()), + item_type: MegaMenuItemType::LinkBlank(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } @@ -113,7 +115,7 @@ impl MegaMenuItem { pub fn submenu(label: L10n, menu: MegaMenu) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Submenu(ComponentArc::new_with(label), menu), + item_type: MegaMenuItemType::Submenu(OneComponent::new_with(label), menu), ..Default::default() } } diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 781a47ee..1ca4807f 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -12,7 +12,7 @@ pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; mod paragraph; pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; mod anchor; -pub use anchor::{Anchor, AnchorIcon, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; +pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; mod block; pub use block::{Block, COMPONENT_BLOCK}; mod image; diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 3829c3f0..dfa2502c 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -22,8 +22,8 @@ pub enum AnchorTarget { Context(String), } -pub type AnchorIcon = ComponentArc; -pub type AnchorHtml = ComponentArc; +type AnchorIcon = OneComponent<Icon>; +type AnchorHtml = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index b9e1d1ae..c661beaf 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -10,7 +10,7 @@ pub enum ButtonType { Reset, } -pub type ButtonValue = ComponentArc; +type ButtonValue = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 839e0b16..f9349dd0 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -13,8 +13,8 @@ pub enum InputType { Url, } -pub type InputLabel = ComponentArc; -pub type InputHelpText = ComponentArc; +type InputLabel = OneComponent<L10n>; +type InputHelpText = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 81e71f09..4e1eb21b 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -25,7 +25,7 @@ pub enum HeadingDisplay { Subtitle, } -pub type HeadingText = ComponentArc; +type HeadingText = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index daa3dfa0..76e51904 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -4,11 +4,8 @@ pub use context::{ContextOp, RenderContext}; mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; -mod default; -pub(crate) use default::DefaultComponent; - -mod arc; -pub use arc::ComponentArc; +mod one; +pub use one::OneComponent; mod bundle; pub use bundle::ComponentsBundle; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs deleted file mode 100644 index 3b8c68f4..00000000 --- a/pagetop/src/core/component/arc.rs +++ /dev/null @@ -1,45 +0,0 @@ -use crate::core::component::{ComponentTrait, DefaultComponent, RenderContext}; -use crate::html::{html, Markup}; - -use std::sync::{Arc, RwLock}; - -#[derive(Clone)] -pub struct ComponentArc(Arc<RwLock<dyn ComponentTrait>>); - -impl Default for ComponentArc { - fn default() -> Self { - ComponentArc(Arc::new(RwLock::new(DefaultComponent))) - } -} - -impl ComponentArc { - pub fn new() -> Self { - ComponentArc::default() - } - - pub fn new_with(component: impl ComponentTrait) -> Self { - ComponentArc(Arc::new(RwLock::new(component))) - } - - pub fn set(&mut self, component: impl ComponentTrait) { - self.0 = Arc::new(RwLock::new(component)); - } - - pub fn weight(&self) -> isize { - self.0.read().unwrap().weight() - } - - // ComponentArc RENDER. - - pub fn render(&self, rcx: &mut RenderContext) -> Markup { - self.0.write().unwrap().render(rcx) - } - - pub fn optional_render(&self, rcx: &mut RenderContext) -> Option<Markup> { - let render = self.0.write().unwrap().render(rcx).into_string(); - if !render.trim().is_empty() { - return Some(html! { (render) }); - } - None - } -} diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index a56d0350..8b8e3a72 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,8 +1,10 @@ -use crate::core::component::{ComponentArc, ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, RenderContext}; use crate::html::{html, Markup}; +use std::sync::{Arc, RwLock}; + #[derive(Clone, Default)] -pub struct ComponentsBundle(Vec<ComponentArc>); +pub struct ComponentsBundle(Vec<Arc<RwLock<dyn ComponentTrait>>>); impl ComponentsBundle { pub fn new() -> Self { @@ -16,7 +18,7 @@ impl ComponentsBundle { } pub fn add(&mut self, component: impl ComponentTrait) { - self.0.push(ComponentArc::new_with(component)); + self.0.push(Arc::new(RwLock::new(component))); } pub fn clear(&mut self) { @@ -25,10 +27,10 @@ impl ComponentsBundle { pub fn render(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); - components.sort_by_key(|c| c.weight()); + components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (" ")(c.render(rcx))(" ") + (" ")(c.write().unwrap().render(rcx))(" ") } } } diff --git a/pagetop/src/core/component/default.rs b/pagetop/src/core/component/default.rs deleted file mode 100644 index 0482473c..00000000 --- a/pagetop/src/core/component/default.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::core::component::{AnyComponent, ComponentTrait}; - -#[derive(Default)] -pub struct DefaultComponent; - -impl ComponentTrait for DefaultComponent { - fn new() -> Self { - DefaultComponent::default() - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs new file mode 100644 index 00000000..bafa3b0b --- /dev/null +++ b/pagetop/src/core/component/one.rs @@ -0,0 +1,40 @@ +use crate::core::component::{ComponentTrait, RenderContext}; +use crate::html::{html, Markup}; + +use std::sync::{Arc, RwLock}; + +#[derive(Clone, Default)] +pub struct OneComponent<T: ComponentTrait + Default>(Option<Arc<RwLock<T>>>); + +impl<T: ComponentTrait + Default> OneComponent<T> { + pub fn new() -> Self { + OneComponent::<T>::default() + } + + pub fn new_with(component: T) -> Self { + OneComponent(Some(Arc::new(RwLock::new(component)))) + } + + pub fn set(&mut self, component: T) { + self.0 = Some(Arc::new(RwLock::new(component))); + } + + // OneComponent RENDER. + + pub fn render(&self, rcx: &mut RenderContext) -> Markup { + if let Some(component) = &self.0 { + return component.write().unwrap().render(rcx); + } + html! {} + } + + pub fn optional_render(&self, rcx: &mut RenderContext) -> Option<Markup> { + if let Some(component) = &self.0 { + let render = component.write().unwrap().render(rcx).into_string(); + if !render.trim().is_empty() { + return Some(html! { (render) }); + } + } + None + } +} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 74f26f01..eae78720 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -32,8 +32,8 @@ pub enum TextDirection { RightToLeft, } -pub type PageTitle = ComponentArc; -pub type PageDescription = ComponentArc; +type PageTitle = OneComponent<L10n>; +type PageDescription = OneComponent<L10n>; #[rustfmt::skip] pub struct Page { From 805c670a53d2ef74405aaf066549c31deff5b8e8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 11:24:03 +0200 Subject: [PATCH 318/853] =?UTF-8?q?=F0=9F=8D=BB=20=C3=9Altima=20revista=20?= =?UTF-8?q?a=20las=20traducciones=20por=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 4 +- pagetop/src/core/component/context.rs | 14 ++++-- pagetop/src/core/component/l10n.rs | 4 +- pagetop/src/locale.rs | 49 +++++++++---------- pagetop/src/response/page/definition.rs | 65 +++++-------------------- 5 files changed, 50 insertions(+), 86 deletions(-) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index ca0fc6be..8e3c75f2 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -33,8 +33,8 @@ impl Application { // Inicia registro de trazas y eventos. LazyStatic::force(&trace::TRACING); - // Valida el identificador de idioma. - LazyStatic::force(&locale::LANGID); + // Valida el identificador global de idioma. + LazyStatic::force(&locale::DEFAULT_LANGID); #[cfg(feature = "database")] // Conecta con la base de datos. diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index a68fe290..dec94143 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,6 +1,6 @@ use crate::core::module::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; -use crate::locale::{LanguageIdentifier, LANGID}; +use crate::locale::{LanguageIdentifier, DEFAULT_LANGID}; use crate::server::HttpRequest; use crate::{concat_string, config, util, LazyStatic}; @@ -14,6 +14,7 @@ static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = }); pub enum ContextOp { + LangId(&'static LanguageIdentifier), Theme(&'static str), Request(Option<HttpRequest>), AddStyleSheet(StyleSheet), @@ -24,7 +25,7 @@ pub enum ContextOp { #[rustfmt::skip] pub struct RenderContext { - language : &'static LanguageIdentifier, + langid : &'static LanguageIdentifier, theme : ThemeStaticRef, request : Option<HttpRequest>, stylesheets: Assets<StyleSheet>, @@ -37,7 +38,7 @@ impl Default for RenderContext { #[rustfmt::skip] fn default() -> Self { RenderContext { - language : &LANGID, + langid : &DEFAULT_LANGID, theme : *DEFAULT_THEME, request : None, stylesheets: Assets::<StyleSheet>::new(), @@ -55,6 +56,9 @@ impl RenderContext { pub fn alter(&mut self, op: ContextOp) -> &mut Self { match op { + ContextOp::LangId(langid) => { + self.langid = langid; + } ContextOp::Theme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); } @@ -84,8 +88,8 @@ impl RenderContext { /// Context GETTERS. - pub(crate) fn language(&self) -> &LanguageIdentifier { - self.language + pub(crate) fn langid(&self) -> &LanguageIdentifier { + self.langid } pub(crate) fn theme(&self) -> ThemeStaticRef { diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs index d369ac99..10e504da 100644 --- a/pagetop/src/core/component/l10n.rs +++ b/pagetop/src/core/component/l10n.rs @@ -32,7 +32,7 @@ impl ComponentTrait for L10n { (PreEscaped(translate( self.key(), Locale::Using( - rcx.language(), + rcx.langid(), locales, &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); @@ -44,7 +44,7 @@ impl ComponentTrait for L10n { (translate( self.key(), Locale::Using( - rcx.language(), + rcx.langid(), locales, &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index da6b498c..f97ed3a6 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -94,47 +94,46 @@ use crate::html::{Markup, PreEscaped}; use crate::{args, config, trace, LazyStatic}; -use unic_langid::langid; - pub use fluent_templates; pub use fluent_templates::fluent_bundle::FluentValue; pub use fluent_templates::{static_loader as static_locale, Loader, StaticLoader as Locales}; -pub use unic_langid::LanguageIdentifier; +pub use unic_langid::{langid, CharacterDirection, LanguageIdentifier}; use std::collections::HashMap; static LANGUAGES: LazyStatic<HashMap<String, (LanguageIdentifier, &str)>> = LazyStatic::new(|| { args![ "en" => (langid!("en-US"), "English"), - "en-US" => (langid!("en-US"), "English (...)"), + "en-GB" => (langid!("en-GB"), "English (British)"), + "en-US" => (langid!("en-US"), "English (United States)"), "es" => (langid!("es-ES"), "Spanish"), "es-ES" => (langid!("es-ES"), "Spanish (Spain)") ] }); -static DEFAULT_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| langid!("en-US")); +static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| langid!("en-US")); /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) -/// para la aplicación, obtenido de `SETTINGS.app.language`. -pub static LANGID: LazyStatic<&LanguageIdentifier> = - LazyStatic::new( - || match LANGUAGES.get(config::SETTINGS.app.language.as_str()) { - Some((langid, _)) => langid, - _ => { - trace::warn!( - "{}, {} \"{}\"! {}, {}", - "Failed to parse language", - "unrecognized Unicode Language Identifier", - config::SETTINGS.app.language, - "Using \"en-US\"", - "check the settings file", - ); - &*DEFAULT_LANGID - } - }, - ); +/// global para la aplicación a partir de `SETTINGS.app.language`. +pub(crate) static DEFAULT_LANGID: LazyStatic<&LanguageIdentifier> = + LazyStatic::new(|| langid_for(config::SETTINGS.app.language.as_str())); + +pub fn langid_for(language: &str) -> &LanguageIdentifier { + match LANGUAGES.get(language) { + Some((langid, _)) => langid, + _ => { + trace::warn!( + "{} \"{}\"! {}", + "Failed to set language. Unicode Language Identifier", + config::SETTINGS.app.language, + "is not accepted. Using \"en-US\", check the settings file", + ); + &*FALLBACK_LANGID + } + } +} pub enum Locale<'a> { From(&'a Locales), @@ -157,8 +156,8 @@ pub fn e(key: &str, locale: Locale) -> Markup { #[inline] pub(crate) fn translate(key: &str, locale: Locale) -> String { match locale { - Locale::From(locales) => locales.lookup(&LANGID, key), - Locale::With(locales, args) => locales.lookup_with_args(&LANGID, key, args), + Locale::From(locales) => locales.lookup(&DEFAULT_LANGID, key), + Locale::With(locales, args) => locales.lookup_with_args(&DEFAULT_LANGID, key, args), Locale::Using(langid, locales, args) => locales.lookup_with_args(langid, key, args), } .unwrap_or(key.to_string()) diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index eae78720..44567fb2 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -2,43 +2,18 @@ use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; -use crate::html::{html, AttributeValue, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; +use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; +use crate::locale::{langid_for, CharacterDirection, LanguageIdentifier}; use crate::response::fatal_error::FatalError; -use crate::{config, fn_builder, locale, server, trace, LazyStatic}; +use crate::{fn_builder, server}; use std::collections::HashMap; -static DEFAULT_DIRECTION: LazyStatic<Option<String>> = LazyStatic::new(|| { - let direction = config::SETTINGS.app.direction.to_lowercase(); - match direction.as_str() { - "auto" => Some("auto".to_owned()), - "ltr" => Some("ltr".to_owned()), - "rtl" => Some("rtl".to_owned()), - "" => None, - _ => { - trace::warn!( - "Text direction \"{}\" not valid, {}", - config::SETTINGS.app.direction, - "check the settings file" - ); - None - } - } -}); - -pub enum TextDirection { - Auto, - LeftToRight, - RightToLeft, -} - type PageTitle = OneComponent<L10n>; type PageDescription = OneComponent<L10n>; #[rustfmt::skip] pub struct Page { - language : AttributeValue, - direction : AttributeValue, title : PageTitle, description : PageDescription, metadata : Vec<(&'static str, &'static str)>, @@ -54,11 +29,6 @@ impl Default for Page { #[rustfmt::skip] fn default() -> Self { Page { - language : AttributeValue::new().with_value(locale::LANGID.language.as_str()), - direction : match &*DEFAULT_DIRECTION { - Some(direction) => AttributeValue::new().with_value(direction), - _ => AttributeValue::new(), - }, title : PageTitle::new(), description : PageDescription::new(), metadata : Vec::new(), @@ -82,18 +52,8 @@ impl Page { // Page BUILDER. #[fn_builder] - pub fn alter_language(&mut self, language: &str) -> &mut Self { - self.language.alter_value(language); - self - } - - #[fn_builder] - pub fn alter_direction(&mut self, dir: TextDirection) -> &mut Self { - self.direction.alter_value(match dir { - TextDirection::Auto => "auto", - TextDirection::LeftToRight => "ltr", - TextDirection::RightToLeft => "rtl", - }); + pub fn alter_language(&mut self, language: &'static str) -> &mut Self { + self.context.alter(ContextOp::LangId(langid_for(language))); self } @@ -162,12 +122,8 @@ impl Page { // Page GETTERS. - pub fn language(&self) -> &AttributeValue { - &self.language - } - - pub fn direction(&self) -> &AttributeValue { - &self.direction + pub fn langid(&self) -> &LanguageIdentifier { + &self.context.langid() } pub fn title(&mut self) -> String { @@ -220,9 +176,14 @@ impl Page { let head = self.context.theme().render_page_head(self); // Finalmente, renderizar la página. + let lang = self.langid().language.as_str(); + let dir = match self.langid().character_direction() { + CharacterDirection::LTR => "ltr", + CharacterDirection::RTL => "rtl", + }; Ok(html! { (DOCTYPE) - html lang=[self.language().get()] dir=[self.direction().get()] { + html lang=(lang) dir=(dir) { (head) (body) } From e68d0b27f09e6e026966c27d8e639f397d2bc8c0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 12:51:13 +0200 Subject: [PATCH 319/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Simplifica=20AP?= =?UTF-8?q?I=20de=20localizaci=C3=B3n=20para=20documentar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-bootsier/src/lib.rs | 10 ++-- pagetop-homedemo/src/lib.rs | 6 +-- pagetop-minimal/src/module/menu.rs | 4 +- pagetop-node/src/lib.rs | 4 +- pagetop-user/src/lib.rs | 4 +- pagetop/src/locale.rs | 69 ++++++++++++++----------- pagetop/src/response/page/definition.rs | 6 ++- pagetop/src/util.rs | 2 +- 9 files changed, 62 insertions(+), 47 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index a6b211ff..a2d30ead 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -14,11 +14,11 @@ impl ModuleTrait for Admin { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_ADMIN)) + _t("module_name", Locale::From(&LOCALE_ADMIN)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_ADMIN))) + Some(_t("module_description", Locale::From(&LOCALE_ADMIN))) } #[rustfmt::skip] diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 0f87b99a..0e7963bc 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -58,15 +58,19 @@ impl ThemeTrait for Bootsier { alt="Caution!"; div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } - p class="lead" { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + p class="lead" { + (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) + } hr class="my-4"; - p { (t("e404-description", Locale::From(&LOCALE_BOOTSIER))) } + p { + (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) + } a class="btn btn-primary btn-lg" href="/" role="button" { - (t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) + (_t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) } } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index c8f18fb0..9f60cc89 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for HomeDemo { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_DEMOHOME)) + _t("module_name", Locale::From(&LOCALE_DEMOHOME)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_DEMOHOME))) + Some(_t("module_description", Locale::From(&LOCALE_DEMOHOME))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -146,7 +146,7 @@ fn about_pagetop() -> Container { format!( "<a href=\"{}\" target=\"_blank\">{}</a>", "https://docs.rs/pagetop/latest/pagetop", - t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), + _t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), ), ), )), diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 177e811a..0e0c2d15 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -12,10 +12,10 @@ impl ModuleTrait for Menu { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_MENU)) + _t("module_name", Locale::From(&LOCALE_MENU)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_MENU))) + Some(_t("module_description", Locale::From(&LOCALE_MENU))) } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index cc51d45e..478088c2 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for Node { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_NODE)) + _t("module_name", Locale::From(&LOCALE_NODE)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_NODE))) + Some(_t("module_description", Locale::From(&LOCALE_NODE))) } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 1b2e50cb..0bc8a86d 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -15,11 +15,11 @@ impl ModuleTrait for User { } fn name(&self) -> String { - t("module_name", Locale::From(&LOCALE_USER)) + _t("module_name", Locale::From(&LOCALE_USER)) } fn description(&self) -> Option<String> { - Some(t("module_description", Locale::From(&LOCALE_USER))) + Some(_t("module_description", Locale::From(&LOCALE_USER))) } fn dependencies(&self) -> Vec<ModuleStaticRef> { diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index f97ed3a6..60ac0074 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -1,4 +1,4 @@ -//! Localización (¿i18n ó l10n?). +//! Localización (L10n). //! //! Proporciona soporte a [Fluent](https://www.projectfluent.org/), un conjunto de especificaciones //! para la localización de aplicaciones, así como implementaciones y buenas prácticas originalmente @@ -16,25 +16,29 @@ //! # Recursos Fluent //! //! PageTop utiliza [fluent-templates](https://docs.rs/fluent-templates/) para integrar durante la -//! compilación los recursos de localización en el binario de la aplicación. Básicamente agrupa -//! todos los archivos de los subdirectorios del directorio *src/locales* que tienen un -//! [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido y los asigna a su +//! compilación los recursos de localización en el binario de la aplicación. En el siguiente ejemplo +//! agruparía todos los archivos y subdirectorios de *static/locales* que tienen un +//! [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido y los asignaría a su //! identificador correspondiente: //! //! ```text -//! resources/locales -//! ├── common.ftl -//! ├── en-US -//! │ └── main.ftl -//! ├── es-ES -//! │ └── main.ftl -//! ├── es-MX -//! │ └── main.ftl -//! └── fr -//! └── main.ftl +//! static/locales +//! ├── common.ftl +//! ├── en-US +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-ES +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-MX +//! │ ├── default.ftl +//! │ └── main.ftl +//! └── fr +//! ├── default.ftl +//! └── main.ftl //! ``` //! -//! Ejemplo de un archivo *src/locales/en-US/main.ftl*: +//! Ejemplo de un archivo *static/locales/en-US/main.ftl*: //! //! ```text //! hello-world = Hello world! @@ -50,7 +54,7 @@ //! }. //! ``` //! -//! Ejemplo de un archivo *src/locales/es-ES/main.ftl*: +//! Ejemplo del archivo equivalente *static/locales/es-ES/main.ftl*: //! //! ```text //! hello-world = Hola mundo! @@ -69,36 +73,41 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la poderosa macro -//! [`define_locale!`](crate::define_locale) para integrar fácilmente tus recursos de localización. +//! [`define_locale!`](crate::define_locale) para integrarlos en tu módulo o aplicación. //! -//! Luego sólo tendrás que usar la función `t()` para realizar tus traducciones: +//! Y podrás usar las funciones globales [`_t()`] o [`_e()`] para traducir tus textos: //! //! ``` -//! use pagetop::{args, define_locale, t}; +//! use pagetop::prelude::*; //! -//! define_locale!(LOCALE_SAMPLE, "src/locales"); +//! define_locale!(LOCALE_SAMPLE, "static/locales"); //! //! fn demo() { -//! println!("* {}", l("hello-world", Locale::From(&LOCALE_SAMPLE))); -//! println!("* {}", t("hello-user", Locale::With(&LOCALE_SAMPLE, &args!["userName" => "Julia"]))); +//! println!("* {}", _t("hello-world", Locale::From(&LOCALE_SAMPLE))); +//! println!("* {}", _t("hello-user", Locale::With(&LOCALE_SAMPLE, &args!["userName" => "Julia"]))); //! //! let args = args![ //! "userName" => "Roberto", //! "photoCount" => 3, //! "userGender" => "male" //! ]; -//! println!("* {}\n", t("shared-photos", Locale::With(&LOCALE_SAMPLE, &args))); +//! println!("* {}\n", _t("shared-photos", Locale::With(&LOCALE_SAMPLE, &args))); //! } //! ``` +//! Aunque normalmente usarás el componente [L10n](crate::core::component::L10n) para añadir textos +//! traducibles en las respuestas web según el contexto del renderizado. use crate::html::{Markup, PreEscaped}; use crate::{args, config, trace, LazyStatic}; -pub use fluent_templates; -pub use fluent_templates::fluent_bundle::FluentValue; -pub use fluent_templates::{static_loader as static_locale, Loader, StaticLoader as Locales}; +pub(crate) use unic_langid::{langid, LanguageIdentifier}; -pub use unic_langid::{langid, CharacterDirection, LanguageIdentifier}; +pub use fluent_templates; + +pub(crate) use fluent_templates::StaticLoader as Locales; + +use fluent_templates::fluent_bundle::FluentValue; +use fluent_templates::Loader; use std::collections::HashMap; @@ -130,7 +139,7 @@ pub fn langid_for(language: &str) -> &LanguageIdentifier { config::SETTINGS.app.language, "is not accepted. Using \"en-US\", check the settings file", ); - &*FALLBACK_LANGID + &FALLBACK_LANGID } } } @@ -145,11 +154,11 @@ pub enum Locale<'a> { ), } -pub fn t(key: &str, locale: Locale) -> String { +pub fn _t(key: &str, locale: Locale) -> String { translate(key, locale) } -pub fn e(key: &str, locale: Locale) -> Markup { +pub fn _e(key: &str, locale: Locale) -> Markup { PreEscaped(translate(key, locale)) } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 44567fb2..e13b9f47 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -3,10 +3,12 @@ use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; use crate::core::component::*; use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; -use crate::locale::{langid_for, CharacterDirection, LanguageIdentifier}; +use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; use crate::{fn_builder, server}; +use unic_langid::CharacterDirection; + use std::collections::HashMap; type PageTitle = OneComponent<L10n>; @@ -123,7 +125,7 @@ impl Page { // Page GETTERS. pub fn langid(&self) -> &LanguageIdentifier { - &self.context.langid() + self.context.langid() } pub fn title(&mut self) -> String { diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index fef23386..29906378 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -93,7 +93,7 @@ macro_rules! define_locale { ( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; - static_locale! { + fluent_templates::static_loader! { pub static $LOCALES = { locales: $dir_locales, $( core_locales: $core_locales, )? From eb82bb6f7840937fa9c76db62e3846709eeda357 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:04:21 +0200 Subject: [PATCH 320/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.39?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 4 ++-- pagetop/src/locale.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 88787324..86f990e9 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.38" +version = "0.0.39" edition = "2021" authors = [ @@ -44,7 +44,7 @@ once_cell = "1.17.1" paste = "1.0.12" substring = "1.4.5" term_size = "0.3.2" -toml = "0.7.3" +toml = "0.7.4" url = "2.3.1" tracing = "0.1.37" diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 60ac0074..3256ebf8 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -126,7 +126,7 @@ static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| lang /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// global para la aplicación a partir de `SETTINGS.app.language`. -pub(crate) static DEFAULT_LANGID: LazyStatic<&LanguageIdentifier> = +pub static DEFAULT_LANGID: LazyStatic<&LanguageIdentifier> = LazyStatic::new(|| langid_for(config::SETTINGS.app.language.as_str())); pub fn langid_for(language: &str) -> &LanguageIdentifier { From ca774386c4a5f94c6964ba015280984c2fa51a08 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:05:41 +0200 Subject: [PATCH 321/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 2a5d663d..91bf435c 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 7da805c5c9e4d40a1436d3c81c25f6fd1fd425fb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:06:29 +0200 Subject: [PATCH 322/853] =?UTF-8?q?=F0=9F=94=96=20[aliner]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index ca168834..877ed4f8 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-aliner" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From 749109efde7edf40c1903bdd06655172b571e681 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:07:09 +0200 Subject: [PATCH 323/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 2baadb61..11093a82 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From 9b6436476c0c181ccf8735b8599656b25cf533d4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:07:59 +0200 Subject: [PATCH 324/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index ac818723..c83b2a82 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From b8879b814f4ae28b9c81913cd7956ba2bc8eb098 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:09:15 +0200 Subject: [PATCH 325/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 392e4a23..42b64299 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.2" +version = "0.0.3" edition = "2021" authors = [ From 21b3fb9d0d10c78d89699ab16f8f5be908993440 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:10:18 +0200 Subject: [PATCH 326/853] =?UTF-8?q?=F0=9F=94=96=20[macros]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml index 8cb3284b..5400a68c 100644 --- a/pagetop-macros/Cargo.toml +++ b/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From d5d244f0753f1c5d2934d2d686710d717816ec88 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:10:51 +0200 Subject: [PATCH 327/853] =?UTF-8?q?=F0=9F=94=96=20[megamenu]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index f5d5d475..b465d908 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From d37b596bd170897e1a3811af1afe0af821b9d47e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:11:31 +0200 Subject: [PATCH 328/853] =?UTF-8?q?=F0=9F=94=96=20[minimal]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index 2e5f7f36..f0986adb 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From 5dedf854d02b42c9c404967078044f81d6b582d8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:12:09 +0200 Subject: [PATCH 329/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 929950f7..a9511b26 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 6c76e3519cb92a361a8b27cbec4610014ef57f0c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 May 2023 19:12:56 +0200 Subject: [PATCH 330/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 89d3505f..eb8a715f 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 1d83bbc80a41a75f2b14dd1bbc84a25b6e49e912 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 30 May 2023 19:13:13 +0200 Subject: [PATCH 331/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20componentes=20?= =?UTF-8?q?b=C3=A1sicos=20traducibles=20Html/Text?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 44 +++--- pagetop-homedemo/src/lib.rs | 38 ++--- pagetop-megamenu/Cargo.toml | 1 + pagetop-megamenu/src/component.rs | 21 +-- pagetop-megamenu/src/lib.rs | 2 +- pagetop-minimal/src/component.rs | 2 - pagetop-minimal/src/component/anchor.rs | 18 +-- .../src/component/form_element/button.rs | 10 +- .../src/component/form_element/input.rs | 8 +- pagetop-minimal/src/component/heading.rs | 16 +- pagetop-minimal/src/component/html.rs | 84 ---------- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 12 +- pagetop/src/core/component.rs | 8 +- pagetop/src/core/component/basic.rs | 143 ++++++++++++++++++ pagetop/src/core/component/html_markup.rs | 46 ------ pagetop/src/core/component/l10n.rs | 138 ----------------- pagetop/src/locale.rs | 5 +- pagetop/src/response/fatal_error.rs | 6 +- pagetop/src/response/page/definition.rs | 8 +- 20 files changed, 243 insertions(+), 369 deletions(-) delete mode 100644 pagetop-minimal/src/component/html.rs create mode 100644 pagetop/src/core/component/basic.rs delete mode 100644 pagetop/src/core/component/html_markup.rs delete mode 100644 pagetop/src/core/component/l10n.rs diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 62f35817..8c611b29 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -5,64 +5,64 @@ use pagetop_minimal::component::*; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALE_ADMIN))) + .with_item(MegaMenuItem::label(Text::t("module_name", &LOCALE_ADMIN))) .with_item(MegaMenuItem::link( - L10n::n("Opción 2"), + Text::n("Opción 2"), "https://www.google.es", )) .with_item(MegaMenuItem::link_blank( - L10n::n("Opción 3"), + Text::n("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - L10n::n("Submenú 1"), + Text::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaMenuItem::label(Text::n("Opción 1"))) + .with_item(MegaMenuItem::label(Text::n("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - L10n::n("Submenú 2"), + Text::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaMenuItem::label(Text::n("Opción 1"))) + .with_item(MegaMenuItem::label(Text::n("Opción 2"))), )) - .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); + .with_item(MegaMenuItem::label(Text::n("Opción 4"))); let side_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(Text::n("Opción 1"))) .with_item(MegaMenuItem::link( - L10n::n("Opción 2"), + Text::n("Opción 2"), "https://www.google.es", )) .with_item(MegaMenuItem::link_blank( - L10n::n("Opción 3"), + Text::n("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - L10n::n("Submenú 1"), + Text::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaMenuItem::label(Text::n("Opción 1"))) + .with_item(MegaMenuItem::label(Text::n("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - L10n::n("Submenú 2"), + Text::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaMenuItem::label(Text::n("Opción 1"))) + .with_item(MegaMenuItem::label(Text::n("Opción 2"))), )) - .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); + .with_item(MegaMenuItem::label(Text::n("Opción 4"))); Page::new(request) .with_context(ContextOp::Theme("Bootsier")) - .with_title(L10n::n("Admin")) + .with_title(Text::n("Admin")) .with_this_in("top-menu", top_menu) .with_this_in( "region-content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) - .with_column(grid::Column::new().with_component(Html::with(html! { + .with_column(grid::Column::new().with_component(Html::n(html! { p { "Columna 2"} }))), ) diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 9f60cc89..1369d908 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -34,7 +34,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(L10n::t("page_title", &LOCALE_DEMOHOME)) + .with_title(Text::t("page_title", &LOCALE_DEMOHOME)) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/homedemo/css/styles.css", ))) @@ -55,11 +55,11 @@ fn hello_world() -> Container { .with_classes(ClassesOp::Add, "hello-col-text") .with_size(grid::ColumnSize::Is5of12) .with_component( - Heading::h1(L10n::t("page_title", &LOCALE_DEMOHOME)) + Heading::h1(Text::t("page_title", &LOCALE_DEMOHOME)) .with_display(HeadingDisplay::Medium), ) .with_component( - Paragraph::with(L10n::e("hello_intro", &LOCALE_DEMOHOME).with_arg( + Paragraph::with(Text::e("hello_intro", &LOCALE_DEMOHOME).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -69,7 +69,7 @@ fn hello_world() -> Container { .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with( - L10n::e("hello_powered", &LOCALE_DEMOHOME).with_arg( + Text::e("hello_powered", &LOCALE_DEMOHOME).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -80,14 +80,14 @@ fn hello_world() -> Container { .with_component( Anchor::button( "https://github.com/manuelcillero/pagetop", - L10n::t("hello_code", &LOCALE_DEMOHOME), + Text::t("hello_code", &LOCALE_DEMOHOME), ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALE_DEMOHOME)) + Anchor::link("#welcome", Text::t("hello_welcome", &LOCALE_DEMOHOME)) .with_left_icon(Icon::with("arrow-down-circle-fill")) .with_classes(ClassesOp::Add, "welcome-link"), ), @@ -104,9 +104,9 @@ fn welcome() -> Container { Container::section() .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") - .with_component(Heading::h2(L10n::t("welcome_page", &LOCALE_DEMOHOME))) + .with_component(Heading::h2(Text::t("welcome_page", &LOCALE_DEMOHOME))) .with_component( - Heading::h3(L10n::e("welcome_subtitle", &LOCALE_DEMOHOME).with_arg( + Heading::h3(Text::e("welcome_subtitle", &LOCALE_DEMOHOME).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -116,10 +116,10 @@ fn welcome() -> Container { .with_display(HeadingDisplay::Subtitle), ) .with_component( - Paragraph::with(L10n::t("welcome_text1", &LOCALE_DEMOHOME)) + Paragraph::with(Text::t("welcome_text1", &LOCALE_DEMOHOME)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALE_DEMOHOME))) + .with_component(Paragraph::with(Text::t("welcome_text2", &LOCALE_DEMOHOME))) } fn about_pagetop() -> Container { @@ -134,14 +134,14 @@ fn about_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-text") - .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALE_DEMOHOME))) + .with_component(Heading::h2(Text::t("pagetop_title", &LOCALE_DEMOHOME))) .with_component( - Paragraph::with(L10n::t("pagetop_text1", &LOCALE_DEMOHOME)) + Paragraph::with(Text::t("pagetop_text1", &LOCALE_DEMOHOME)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALE_DEMOHOME))) + .with_component(Paragraph::with(Text::t("pagetop_text2", &LOCALE_DEMOHOME))) .with_component(Paragraph::with( - L10n::e("pagetop_text3", &LOCALE_DEMOHOME).with_arg( + Text::e("pagetop_text3", &LOCALE_DEMOHOME).with_arg( "pagetop_website", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -160,12 +160,12 @@ fn promo_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-text") - .with_component(Heading::h2(L10n::t( + .with_component(Heading::h2(Text::t( "pagetop_promo_title", &LOCALE_DEMOHOME, ))) .with_component( - Paragraph::with(L10n::e("pagetop_promo_text1", &LOCALE_DEMOHOME).with_arg( + Paragraph::with(Text::e("pagetop_promo_text1", &LOCALE_DEMOHOME).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -196,15 +196,15 @@ fn reporting_issues() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "reporting-col-text") .with_size(grid::ColumnSize::Is6of12) - .with_component(Heading::h2(L10n::t( + .with_component(Heading::h2(Text::t( "report_problems_title", &LOCALE_DEMOHOME, ))) .with_component( - Paragraph::with(L10n::t("report_problems_text1", &LOCALE_DEMOHOME)) + Paragraph::with(Text::t("report_problems_text1", &LOCALE_DEMOHOME)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t( + .with_component(Paragraph::with(Text::t( "report_problems_text2", &LOCALE_DEMOHOME, ))), diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index b465d908..a94ac1d4 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -16,6 +16,7 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } +pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" [build-dependencies] diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 0ab90d37..58a18e01 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -2,7 +2,8 @@ use pagetop::prelude::*; define_handle!(COMPONENT_MEGAMENUITEM); -type Label = OneComponent<L10n>; +type Label = OneComponent<Text>; +type Content = OneComponent<Html>; #[derive(Default)] pub enum MegaMenuItemType { @@ -11,7 +12,7 @@ pub enum MegaMenuItemType { Label(Label), Link(Label, String), LinkBlank(Label, String), - Html(Markup), + Html(Content), Submenu(Label, MegaMenu), Separator, } @@ -58,8 +59,8 @@ impl ComponentTrait for MegaMenuItem { a href=(path) target="_blank" { (label.render(rcx)) } } }, - MegaMenuItemType::Html(html) => html! { - li class="html" { (*html) } + MegaMenuItemType::Html(content) => html! { + li class="html" { (content.render(rcx)) } }, MegaMenuItemType::Submenu(label, menu) => html! { li class="submenu" { @@ -85,35 +86,35 @@ impl ComponentTrait for MegaMenuItem { } impl MegaMenuItem { - pub fn label(label: L10n) -> Self { + pub fn label(label: Text) -> Self { MegaMenuItem { item_type: MegaMenuItemType::Label(OneComponent::new_with(label)), ..Default::default() } } - pub fn link(label: L10n, path: &str) -> Self { + pub fn link(label: Text, path: &str) -> Self { MegaMenuItem { item_type: MegaMenuItemType::Link(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } - pub fn link_blank(label: L10n, path: &str) -> Self { + pub fn link_blank(label: Text, path: &str) -> Self { MegaMenuItem { item_type: MegaMenuItemType::LinkBlank(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } - pub fn html(html: Markup) -> Self { + pub fn html(content: Html) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Html(html), + item_type: MegaMenuItemType::Html(OneComponent::new_with(content)), ..Default::default() } } - pub fn submenu(label: L10n, menu: MegaMenu) -> Self { + pub fn submenu(label: Text, menu: MegaMenu) -> Self { MegaMenuItem { item_type: MegaMenuItemType::Submenu(OneComponent::new_with(label), menu), ..Default::default() diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index c177d677..414f42c5 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -14,7 +14,7 @@ impl ModuleTrait for MegaMenu { } fn dependencies(&self) -> Vec<ModuleStaticRef> { - vec![&pagetop_jquery::JQuery] + vec![&pagetop_jquery::JQuery, &pagetop_minimal::Minimal] } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 1ca4807f..04a89e8d 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -3,8 +3,6 @@ pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; pub mod grid; -mod html; -pub use html::{Html, COMPONENT_HTML}; mod icon; pub use icon::{Icon, COMPONENT_ICON}; mod heading; diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index dfa2502c..9c6ecf26 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -23,7 +23,7 @@ pub enum AnchorTarget { } type AnchorIcon = OneComponent<Icon>; -type AnchorHtml = OneComponent<L10n>; +type AnchorHtml = OneComponent<Text>; #[rustfmt::skip] #[derive(Default)] @@ -34,7 +34,7 @@ pub struct Anchor { classes : Classes, anchor_type: AnchorType, href : AttributeValue, - html10n : AnchorHtml, + html : AnchorHtml, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, @@ -91,15 +91,15 @@ impl ComponentTrait for Anchor { } impl Anchor { - pub fn link(href: &str, html10n: L10n) -> Self { - Anchor::new().with_href(href).with_html(html10n) + pub fn link(href: &str, html: Text) -> Self { + Anchor::new().with_href(href).with_html(html) } - pub fn button(href: &str, html10n: L10n) -> Self { + pub fn button(href: &str, html: Text) -> Self { Anchor::new() .with_type(AnchorType::Button) .with_href(href) - .with_html(html10n) + .with_html(html) } pub fn location(id: &str) -> Self { @@ -152,8 +152,8 @@ impl Anchor { } #[fn_builder] - pub fn alter_html(&mut self, html10n: L10n) -> &mut Self { - self.html10n.set(html10n); + pub fn alter_html(&mut self, html: Text) -> &mut Self { + self.html.set(html); self } @@ -200,7 +200,7 @@ impl Anchor { } pub fn html(&self) -> &AnchorHtml { - &self.html10n + &self.html } pub fn left_icon(&self) -> &AnchorIcon { diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index c661beaf..c4a4ad5a 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -10,7 +10,7 @@ pub enum ButtonType { Reset, } -type ButtonValue = OneComponent<L10n>; +type ButtonValue = OneComponent<Text>; #[rustfmt::skip] #[derive(Default)] @@ -77,11 +77,11 @@ impl ComponentTrait for Button { } impl Button { - pub fn with(value: L10n) -> Self { + pub fn with(value: Text) -> Self { Button::new().with_value(value) } - pub fn submit(value: L10n) -> Self { + pub fn submit(value: Text) -> Self { let mut button = Button::new() .with_classes(ClassesOp::Replace("form-button"), "form-submit") .with_value(value); @@ -89,7 +89,7 @@ impl Button { button } - pub fn reset(value: L10n) -> Self { + pub fn reset(value: Text) -> Self { let mut button = Button::new() .with_classes(ClassesOp::Replace("form-button"), "form-reset") .with_value(value); @@ -124,7 +124,7 @@ impl Button { } #[fn_builder] - pub fn alter_value(&mut self, value: L10n) -> &mut Self { + pub fn alter_value(&mut self, value: Text) -> &mut Self { self.value.set(value); self } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index f9349dd0..fcd399b3 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -13,8 +13,8 @@ pub enum InputType { Url, } -type InputLabel = OneComponent<L10n>; -type InputHelpText = OneComponent<L10n>; +type InputLabel = OneComponent<Text>; +type InputHelpText = OneComponent<Text>; #[rustfmt::skip] #[derive(Default)] @@ -206,7 +206,7 @@ impl Input { } #[fn_builder] - pub fn alter_label(&mut self, label: L10n) -> &mut Self { + pub fn alter_label(&mut self, label: Text) -> &mut Self { self.label.set(label); self } @@ -281,7 +281,7 @@ impl Input { } #[fn_builder] - pub fn alter_help_text(&mut self, help_text: L10n) -> &mut Self { + pub fn alter_help_text(&mut self, help_text: Text) -> &mut Self { self.help_text.set(help_text); self } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 4e1eb21b..45f1fc7f 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -25,7 +25,7 @@ pub enum HeadingDisplay { Subtitle, } -type HeadingText = OneComponent<L10n>; +type HeadingText = OneComponent<Text>; #[rustfmt::skip] #[derive(Default)] @@ -80,37 +80,37 @@ impl ComponentTrait for Heading { } impl Heading { - pub fn h1(text: L10n) -> Self { + pub fn h1(text: Text) -> Self { Heading::new() .with_heading_type(HeadingType::H1) .with_text(text) } - pub fn h2(text: L10n) -> Self { + pub fn h2(text: Text) -> Self { Heading::new() .with_heading_type(HeadingType::H2) .with_text(text) } - pub fn h3(text: L10n) -> Self { + pub fn h3(text: Text) -> Self { Heading::new() .with_heading_type(HeadingType::H3) .with_text(text) } - pub fn h4(text: L10n) -> Self { + pub fn h4(text: Text) -> Self { Heading::new() .with_heading_type(HeadingType::H4) .with_text(text) } - pub fn h5(text: L10n) -> Self { + pub fn h5(text: Text) -> Self { Heading::new() .with_heading_type(HeadingType::H5) .with_text(text) } - pub fn h6(text: L10n) -> Self { + pub fn h6(text: Text) -> Self { Heading::new() .with_heading_type(HeadingType::H6) .with_text(text) @@ -149,7 +149,7 @@ impl Heading { } #[fn_builder] - pub fn alter_text(&mut self, text: L10n) -> &mut Self { + pub fn alter_text(&mut self, text: Text) -> &mut Self { self.text.set(text); self } diff --git a/pagetop-minimal/src/component/html.rs b/pagetop-minimal/src/component/html.rs deleted file mode 100644 index 98d55182..00000000 --- a/pagetop-minimal/src/component/html.rs +++ /dev/null @@ -1,84 +0,0 @@ -use pagetop::prelude::*; - -define_handle!(COMPONENT_HTML); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Html { - weight : isize, - renderable: Renderable, - html : HtmlMarkup, - template : String, -} - -impl ComponentTrait for Html { - fn new() -> Self { - Html::default() - } - - fn handle(&self) -> Handle { - COMPONENT_HTML - } - - fn weight(&self) -> isize { - self.weight - } - - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) - } - - fn default_render(&self, _: &mut RenderContext) -> Markup { - html! { (*self.html()) } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl Html { - pub fn with(html: Markup) -> Self { - Html::new().with_html(html) - } - - // Html BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.html.markup = html; - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Html GETTERS. - - pub fn html(&self) -> &Markup { - &self.html.markup - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 478088c2..3124cb88 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -41,7 +41,7 @@ impl ModuleTrait for Node { } async fn node(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { - Page::new(request).with_title(L10n::n("Nodo")).render() + Page::new(request).with_title(Text::n("Nodo")).render() } fn before_render_page(page: &mut Page) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 0bc8a86d..eaaf7296 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -42,7 +42,7 @@ impl ModuleTrait for User { async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(L10n::n("Identificación del usuario")) + .with_title(Text::n("Identificación del usuario")) .with_this_in( "region-content", Container::new() @@ -58,9 +58,9 @@ fn form_login() -> Form { .with_element( form_element::Input::textfield() .with_name("name") - .with_label(L10n::t("username", &LOCALE_USER)) + .with_label(Text::t("username", &LOCALE_USER)) .with_help_text( - L10n::t("username_help", &LOCALE_USER) + Text::t("username_help", &LOCALE_USER) .with_arg("app", config::SETTINGS.app.name.to_owned()), ) .with_autofocus(true), @@ -68,8 +68,8 @@ fn form_login() -> Form { .with_element( form_element::Input::password() .with_name("pass") - .with_label(L10n::t("password", &LOCALE_USER)) - .with_help_text(L10n::t("password_help", &LOCALE_USER)), + .with_label(Text::t("password", &LOCALE_USER)) + .with_help_text(Text::t("password_help", &LOCALE_USER)), ) - .with_element(form_element::Button::submit(L10n::t("login", &LOCALE_USER))) + .with_element(form_element::Button::submit(Text::t("login", &LOCALE_USER))) } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 76e51904..5b0dd2f5 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -17,8 +17,6 @@ pub(crate) use all::common_components; mod renderable; pub use renderable::{IsRenderable, Renderable}; -mod html_markup; -pub use html_markup::HtmlMarkup; - -mod l10n; -pub use l10n::L10n; +mod basic; +pub use basic::{Html, COMPONENT_HTML}; +pub use basic::{Text, COMPONENT_TEXT}; diff --git a/pagetop/src/core/component/basic.rs b/pagetop/src/core/component/basic.rs new file mode 100644 index 00000000..86fd7e78 --- /dev/null +++ b/pagetop/src/core/component/basic.rs @@ -0,0 +1,143 @@ +use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::html::{html, Markup, PreEscaped}; +use crate::locale::{translate, Locale, Locales}; +use crate::{define_handle, fn_builder, paste, Handle}; + +use std::collections::HashMap; + +macro_rules! basic_components { + ( $($COMPONENT_HANDLE:ident: $Component:ty => $TypeValue:ty),* ) => { $( paste! { + + define_handle!($COMPONENT_HANDLE); + + pub enum [< $Component Op >] { + None, + Value($TypeValue), + Translated(&'static str, &'static Locales), + Escaped(&'static str, &'static Locales), + } + + pub struct $Component { + op: [< $Component Op >], + args: HashMap<&'static str, String>, + } + + impl Default for $Component { + fn default() -> Self { + $Component { + op: [< $Component Op >]::None, + args: HashMap::new(), + } + } + } + + impl ComponentTrait for $Component { + fn new() -> Self { + $Component::default() + } + + fn handle(&self) -> Handle { + $COMPONENT_HANDLE + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + match self.op() { + [< $Component Op >]::None => html! {}, + [< $Component Op >]::Value(value) => html! { (value) }, + [< $Component Op >]::Translated(key, locales) => html! { + (translate( + key, + Locale::Using( + rcx.langid(), + locales, + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }) + ) + )) + }, + [< $Component Op >]::Escaped(key, locales) => html! { + (PreEscaped(translate( + key, + Locale::Using( + rcx.langid(), + locales, + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }) + ) + ))) + }, + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } + } + + impl $Component { + pub fn n(value: $TypeValue) -> Self { + $Component { + op: [< $Component Op >]::Value(value), + ..Default::default() + } + } + + pub fn t(key: &'static str, locales: &'static Locales) -> Self { + $Component { + op: [< $Component Op >]::Translated(key, locales), + ..Default::default() + } + } + + pub fn e(key: &'static str, locales: &'static Locales) -> Self { + $Component { + op: [< $Component Op >]::Escaped(key, locales), + ..Default::default() + } + } + + // $Component BUILDER. + + #[fn_builder] + pub fn alter_op(&mut self, op: [< $Component Op >]) -> &mut Self { + self.op = op; + self + } + + #[fn_builder] + pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { + self.args.insert(arg, value); + self + } + + pub fn clear_args(&mut self) -> &mut Self { + self.args.drain(); + self + } + + // $Component GETTERS. + + pub fn op(&self) -> &[< $Component Op >] { + &self.op + } + + pub fn args(&self) -> &HashMap<&str, String> { + &self.args + } + } + + } )* }; +} + +basic_components!( + COMPONENT_HTML: Html => Markup, + COMPONENT_TEXT: Text => &'static str +); diff --git a/pagetop/src/core/component/html_markup.rs b/pagetop/src/core/component/html_markup.rs deleted file mode 100644 index 3b513707..00000000 --- a/pagetop/src/core/component/html_markup.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; -use crate::html::{html, Markup}; -use crate::{define_handle, Handle}; - -define_handle!(HTML_MARKUP); - -pub struct HtmlMarkup { - pub markup: Markup, -} - -impl Default for HtmlMarkup { - fn default() -> Self { - HtmlMarkup { markup: html! {} } - } -} - -impl ComponentTrait for HtmlMarkup { - fn new() -> Self { - HtmlMarkup::default() - } - - fn handle(&self) -> Handle { - HTML_MARKUP - } - - fn default_render(&self, _rcx: &mut RenderContext) -> Markup { - html! { - (self.markup) - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl HtmlMarkup { - pub fn with(mut self, html: Markup) -> Self { - self.markup = html; - self - } -} diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs deleted file mode 100644 index 10e504da..00000000 --- a/pagetop/src/core/component/l10n.rs +++ /dev/null @@ -1,138 +0,0 @@ -use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; -use crate::html::{html, Markup, PreEscaped}; -use crate::locale::{translate, Locale, Locales}; -use crate::{define_handle, fn_builder, Handle}; - -use std::collections::HashMap; - -define_handle!(COMPONENT_L10N); - -#[rustfmt::skip] -#[derive(Default)] -pub struct L10n { - key : &'static str, - locales: Option<&'static Locales>, - args : HashMap<&'static str, String>, - escaped: bool, -} - -impl ComponentTrait for L10n { - fn new() -> Self { - L10n::default() - } - - fn handle(&self) -> Handle { - COMPONENT_L10N - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - if let Some(locales) = self.locales() { - html! { - @if self.escaped() { - (PreEscaped(translate( - self.key(), - Locale::Using( - rcx.langid(), - locales, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { - args.insert(key.to_string(), value.to_owned().into()); - args - }) - ) - ))) - } @else { - (translate( - self.key(), - Locale::Using( - rcx.langid(), - locales, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { - args.insert(key.to_string(), value.to_owned().into()); - args - }) - ) - )) - } - } - } else { - html! { (self.key()) } - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} - -impl L10n { - pub fn n(text: &'static str) -> Self { - L10n { - key: text, - ..Default::default() - } - } - - pub fn t(key: &'static str, locales: &'static Locales) -> Self { - L10n { - key, - locales: Some(locales), - ..Default::default() - } - } - - pub fn e(key: &'static str, locales: &'static Locales) -> Self { - L10n { - key, - locales: Some(locales), - escaped: true, - ..Default::default() - } - } - - // HtmL10n BUILDER. - - #[fn_builder] - pub fn alter_key(&mut self, key: &'static str) -> &mut Self { - self.key = key; - self - } - - #[fn_builder] - pub fn alter_locales(&mut self, locales: &'static Locales) -> &mut Self { - self.locales = Some(locales); - self - } - - #[fn_builder] - pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { - self.args.insert(arg, value); - self - } - - pub fn clear_args(&mut self) -> &mut Self { - self.args.drain(); - self - } - - // HtmL10n GETTERS. - - pub fn key(&self) -> &str { - self.key - } - - pub fn locales(&self) -> Option<&Locales> { - self.locales - } - - pub fn args(&self) -> &HashMap<&str, String> { - &self.args - } - - pub fn escaped(&self) -> bool { - self.escaped - } -} diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 3256ebf8..ebb0d999 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -94,8 +94,9 @@ //! println!("* {}\n", _t("shared-photos", Locale::With(&LOCALE_SAMPLE, &args))); //! } //! ``` -//! Aunque normalmente usarás el componente [L10n](crate::core::component::L10n) para añadir textos -//! traducibles en las respuestas web según el contexto del renderizado. +//! Aunque preferirás usar normalmente los componentes básicos [Text](crate::core::component::Text) +//! y [Html](crate::core::component::Html) para incluir, en respuestas a las peticiones web, textos +//! y contenidos opcionalmente traducibles según el contexto de renderizado. use crate::html::{Markup, PreEscaped}; use crate::{args, config, trace, LazyStatic}; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 6e53448a..411b6b79 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::core::component::L10n; +use crate::core::component::Text; use crate::response::{page::Page, ResponseError}; use crate::server::http::{header::ContentType, StatusCode}; use crate::server::{HttpRequest, HttpResponse}; @@ -32,7 +32,7 @@ impl fmt::Display for FatalError { FatalError::AccessDenied(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title(L10n::n("Error FORBIDDEN")) + .with_title(Text::n("Error FORBIDDEN")) .with_this_in("region-content", error403::Error403) .with_template("error") .render() @@ -46,7 +46,7 @@ impl fmt::Display for FatalError { FatalError::NotFound(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title(L10n::n("Error RESOURCE NOT FOUND")) + .with_title(Text::n("Error RESOURCE NOT FOUND")) .with_this_in("region-content", error404::Error404) .with_template("error") .render() diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index e13b9f47..748df4a0 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -11,8 +11,8 @@ use unic_langid::CharacterDirection; use std::collections::HashMap; -type PageTitle = OneComponent<L10n>; -type PageDescription = OneComponent<L10n>; +type PageTitle = OneComponent<Text>; +type PageDescription = OneComponent<Text>; #[rustfmt::skip] pub struct Page { @@ -60,13 +60,13 @@ impl Page { } #[fn_builder] - pub fn alter_title(&mut self, title: L10n) -> &mut Self { + pub fn alter_title(&mut self, title: Text) -> &mut Self { self.title.set(title); self } #[fn_builder] - pub fn alter_description(&mut self, description: L10n) -> &mut Self { + pub fn alter_description(&mut self, description: Text) -> &mut Self { self.description.set(description); self } From bcfdc412a034ed0f224c37568d8c72f1b02a88b0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 30 May 2023 19:19:07 +0200 Subject: [PATCH 332/853] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20Simplifica=20el=20?= =?UTF-8?q?c=C3=B3digo=20de=20los=20componentes=20b=C3=A1sicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/basic.rs | 39 ++++------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/pagetop/src/core/component/basic.rs b/pagetop/src/core/component/basic.rs index 86fd7e78..9c57b49d 100644 --- a/pagetop/src/core/component/basic.rs +++ b/pagetop/src/core/component/basic.rs @@ -1,7 +1,7 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; use crate::html::{html, Markup, PreEscaped}; use crate::locale::{translate, Locale, Locales}; -use crate::{define_handle, fn_builder, paste, Handle}; +use crate::{define_handle, paste, Handle}; use std::collections::HashMap; @@ -10,7 +10,7 @@ macro_rules! basic_components { define_handle!($COMPONENT_HANDLE); - pub enum [< $Component Op >] { + enum [< $Component Op >] { None, Value($TypeValue), Translated(&'static str, &'static Locales), @@ -41,7 +41,7 @@ macro_rules! basic_components { } fn default_render(&self, rcx: &mut RenderContext) -> Markup { - match self.op() { + match &self.op { [< $Component Op >]::None => html! {}, [< $Component Op >]::Value(value) => html! { (value) }, [< $Component Op >]::Translated(key, locales) => html! { @@ -50,7 +50,7 @@ macro_rules! basic_components { Locale::Using( rcx.langid(), locales, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + &self.args.iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); args }) @@ -63,7 +63,7 @@ macro_rules! basic_components { Locale::Using( rcx.langid(), locales, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + &self.args.iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); args }) @@ -103,35 +103,6 @@ macro_rules! basic_components { ..Default::default() } } - - // $Component BUILDER. - - #[fn_builder] - pub fn alter_op(&mut self, op: [< $Component Op >]) -> &mut Self { - self.op = op; - self - } - - #[fn_builder] - pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { - self.args.insert(arg, value); - self - } - - pub fn clear_args(&mut self) -> &mut Self { - self.args.drain(); - self - } - - // $Component GETTERS. - - pub fn op(&self) -> &[< $Component Op >] { - &self.op - } - - pub fn args(&self) -> &HashMap<&str, String> { - &self.args - } } } )* }; From d0add7c7ab8ab58293e854647dcf8f2ef71ad7c0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 30 May 2023 19:21:53 +0200 Subject: [PATCH 333/853] =?UTF-8?q?=E2=8F=AA=20Revierte=20anterior=20commi?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/basic.rs | 39 +++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/pagetop/src/core/component/basic.rs b/pagetop/src/core/component/basic.rs index 9c57b49d..86fd7e78 100644 --- a/pagetop/src/core/component/basic.rs +++ b/pagetop/src/core/component/basic.rs @@ -1,7 +1,7 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; use crate::html::{html, Markup, PreEscaped}; use crate::locale::{translate, Locale, Locales}; -use crate::{define_handle, paste, Handle}; +use crate::{define_handle, fn_builder, paste, Handle}; use std::collections::HashMap; @@ -10,7 +10,7 @@ macro_rules! basic_components { define_handle!($COMPONENT_HANDLE); - enum [< $Component Op >] { + pub enum [< $Component Op >] { None, Value($TypeValue), Translated(&'static str, &'static Locales), @@ -41,7 +41,7 @@ macro_rules! basic_components { } fn default_render(&self, rcx: &mut RenderContext) -> Markup { - match &self.op { + match self.op() { [< $Component Op >]::None => html! {}, [< $Component Op >]::Value(value) => html! { (value) }, [< $Component Op >]::Translated(key, locales) => html! { @@ -50,7 +50,7 @@ macro_rules! basic_components { Locale::Using( rcx.langid(), locales, - &self.args.iter().fold(HashMap::new(), |mut args, (key, value)| { + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); args }) @@ -63,7 +63,7 @@ macro_rules! basic_components { Locale::Using( rcx.langid(), locales, - &self.args.iter().fold(HashMap::new(), |mut args, (key, value)| { + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); args }) @@ -103,6 +103,35 @@ macro_rules! basic_components { ..Default::default() } } + + // $Component BUILDER. + + #[fn_builder] + pub fn alter_op(&mut self, op: [< $Component Op >]) -> &mut Self { + self.op = op; + self + } + + #[fn_builder] + pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { + self.args.insert(arg, value); + self + } + + pub fn clear_args(&mut self) -> &mut Self { + self.args.drain(); + self + } + + // $Component GETTERS. + + pub fn op(&self) -> &[< $Component Op >] { + &self.op + } + + pub fn args(&self) -> &HashMap<&str, String> { + &self.args + } } } )* }; From 520d3bb20b608605b3219b3d29fdf600a90aaa8f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 00:43:28 +0200 Subject: [PATCH 334/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mej?= =?UTF-8?q?ora=20y=20simplifica=20localizaci=C3=B3n=20de=20m=C3=B3dulos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 8 +- pagetop-admin/src/summary.rs | 44 +++--- pagetop-bootsier/src/lib.rs | 8 +- pagetop-homedemo/src/lib.rs | 54 +++---- .../src/locales/en-US/homepage.ftl | 3 +- .../src/locales/es-ES/homepage.ftl | 3 +- pagetop-megamenu/src/component.rs | 14 +- pagetop-minimal/src/component/anchor.rs | 8 +- .../src/component/form_element/button.rs | 10 +- .../src/component/form_element/input.rs | 8 +- pagetop-minimal/src/component/heading.rs | 16 +- pagetop-minimal/src/module/menu.rs | 8 +- pagetop-node/src/lib.rs | 10 +- pagetop-user/src/lib.rs | 20 +-- pagetop/src/core/component.rs | 5 +- pagetop/src/core/component/basic.rs | 143 ------------------ pagetop/src/core/component/l10n.rs | 141 +++++++++++++++++ pagetop/src/core/module/definition.rs | 9 +- pagetop/src/locale.rs | 64 +------- pagetop/src/response/fatal_error.rs | 6 +- pagetop/src/response/page/definition.rs | 8 +- 21 files changed, 265 insertions(+), 325 deletions(-) delete mode 100644 pagetop/src/core/component/basic.rs create mode 100644 pagetop/src/core/component/l10n.rs diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index a2d30ead..56e134c1 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -13,12 +13,12 @@ impl ModuleTrait for Admin { MODULE_ADMIN } - fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_ADMIN)) + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALE_ADMIN) } - fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_ADMIN))) + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALE_ADMIN) } #[rustfmt::skip] diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 8c611b29..e9c08c21 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -5,64 +5,64 @@ use pagetop_minimal::component::*; pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(Text::t("module_name", &LOCALE_ADMIN))) + .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALE_ADMIN))) .with_item(MegaMenuItem::link( - Text::n("Opción 2"), + L10n::text("Opción 2"), "https://www.google.es", )) .with_item(MegaMenuItem::link_blank( - Text::n("Opción 3"), + L10n::text("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - Text::n("Submenú 1"), + L10n::text("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(Text::n("Opción 1"))) - .with_item(MegaMenuItem::label(Text::n("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - Text::n("Submenú 2"), + L10n::text("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(Text::n("Opción 1"))) - .with_item(MegaMenuItem::label(Text::n("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), )) - .with_item(MegaMenuItem::label(Text::n("Opción 4"))); + .with_item(MegaMenuItem::label(L10n::text("Opción 4"))); let side_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(Text::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) .with_item(MegaMenuItem::link( - Text::n("Opción 2"), + L10n::text("Opción 2"), "https://www.google.es", )) .with_item(MegaMenuItem::link_blank( - Text::n("Opción 3"), + L10n::text("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - Text::n("Submenú 1"), + L10n::text("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(Text::n("Opción 1"))) - .with_item(MegaMenuItem::label(Text::n("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - Text::n("Submenú 2"), + L10n::text("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(Text::n("Opción 1"))) - .with_item(MegaMenuItem::label(Text::n("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), )) - .with_item(MegaMenuItem::label(Text::n("Opción 4"))); + .with_item(MegaMenuItem::label(L10n::text("Opción 4"))); Page::new(request) .with_context(ContextOp::Theme("Bootsier")) - .with_title(Text::n("Admin")) + .with_title(L10n::text("Admin")) .with_this_in("top-menu", top_menu) .with_this_in( "region-content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) - .with_column(grid::Column::new().with_component(Html::n(html! { + .with_column(grid::Column::new().with_component(L10n::html(html! { p { "Columna 2"} }))), ) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 0e7963bc..e69c5e75 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -45,7 +45,7 @@ impl ThemeTrait for Bootsier { fn render_component( &self, component: &dyn ComponentTrait, - _rcx: &mut RenderContext, + rcx: &mut RenderContext, ) -> Option<Markup> { match component.handle() { ERROR_404 => Some(html! { @@ -59,18 +59,18 @@ impl ThemeTrait for Bootsier { div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } p class="lead" { - (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) + (L10n::t("e404-description", &LOCALE_BOOTSIER).render(rcx)) } hr class="my-4"; p { - (_t("e404-description", Locale::From(&LOCALE_BOOTSIER))) + (L10n::t("e404-description", &LOCALE_BOOTSIER).render(rcx)) } a class="btn btn-primary btn-lg" href="/" role="button" { - (_t("back-homepage", Locale::From(&LOCALE_BOOTSIER))) + (L10n::t("back-homepage", &LOCALE_BOOTSIER).render(rcx)) } } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 1369d908..385e4f37 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -14,12 +14,12 @@ impl ModuleTrait for HomeDemo { MODULE_DEMOHOME } - fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_DEMOHOME)) + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALE_DEMOHOME) } - fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_DEMOHOME))) + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALE_DEMOHOME) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -34,7 +34,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(Text::t("page_title", &LOCALE_DEMOHOME)) + .with_title(L10n::t("page_title", &LOCALE_DEMOHOME)) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/homedemo/css/styles.css", ))) @@ -55,11 +55,11 @@ fn hello_world() -> Container { .with_classes(ClassesOp::Add, "hello-col-text") .with_size(grid::ColumnSize::Is5of12) .with_component( - Heading::h1(Text::t("page_title", &LOCALE_DEMOHOME)) + Heading::h1(L10n::t("page_title", &LOCALE_DEMOHOME)) .with_display(HeadingDisplay::Medium), ) .with_component( - Paragraph::with(Text::e("hello_intro", &LOCALE_DEMOHOME).with_arg( + Paragraph::with(L10n::e("hello_intro", &LOCALE_DEMOHOME).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -69,7 +69,7 @@ fn hello_world() -> Container { .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with( - Text::e("hello_powered", &LOCALE_DEMOHOME).with_arg( + L10n::e("hello_powered", &LOCALE_DEMOHOME).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -80,14 +80,14 @@ fn hello_world() -> Container { .with_component( Anchor::button( "https://github.com/manuelcillero/pagetop", - Text::t("hello_code", &LOCALE_DEMOHOME), + L10n::t("hello_code", &LOCALE_DEMOHOME), ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::link("#welcome", Text::t("hello_welcome", &LOCALE_DEMOHOME)) + Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALE_DEMOHOME)) .with_left_icon(Icon::with("arrow-down-circle-fill")) .with_classes(ClassesOp::Add, "welcome-link"), ), @@ -104,9 +104,9 @@ fn welcome() -> Container { Container::section() .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") - .with_component(Heading::h2(Text::t("welcome_page", &LOCALE_DEMOHOME))) + .with_component(Heading::h2(L10n::t("welcome_page", &LOCALE_DEMOHOME))) .with_component( - Heading::h3(Text::e("welcome_subtitle", &LOCALE_DEMOHOME).with_arg( + Heading::h3(L10n::e("welcome_subtitle", &LOCALE_DEMOHOME).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -116,10 +116,10 @@ fn welcome() -> Container { .with_display(HeadingDisplay::Subtitle), ) .with_component( - Paragraph::with(Text::t("welcome_text1", &LOCALE_DEMOHOME)) + Paragraph::with(L10n::t("welcome_text1", &LOCALE_DEMOHOME)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(Text::t("welcome_text2", &LOCALE_DEMOHOME))) + .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALE_DEMOHOME))) } fn about_pagetop() -> Container { @@ -134,21 +134,15 @@ fn about_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-text") - .with_component(Heading::h2(Text::t("pagetop_title", &LOCALE_DEMOHOME))) + .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALE_DEMOHOME))) .with_component( - Paragraph::with(Text::t("pagetop_text1", &LOCALE_DEMOHOME)) + Paragraph::with(L10n::t("pagetop_text1", &LOCALE_DEMOHOME)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(Text::t("pagetop_text2", &LOCALE_DEMOHOME))) + .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALE_DEMOHOME))) .with_component(Paragraph::with( - Text::e("pagetop_text3", &LOCALE_DEMOHOME).with_arg( - "pagetop_website", - format!( - "<a href=\"{}\" target=\"_blank\">{}</a>", - "https://docs.rs/pagetop/latest/pagetop", - _t("pagetop_website", Locale::From(&LOCALE_DEMOHOME)), - ), - ), + L10n::e("pagetop_text3", &LOCALE_DEMOHOME) + .with_arg("href", "https://docs.rs/pagetop/latest/pagetop".to_string()), )), ), ) @@ -160,12 +154,12 @@ fn promo_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "promo-col-text") - .with_component(Heading::h2(Text::t( + .with_component(Heading::h2(L10n::t( "pagetop_promo_title", &LOCALE_DEMOHOME, ))) .with_component( - Paragraph::with(Text::e("pagetop_promo_text1", &LOCALE_DEMOHOME).with_arg( + Paragraph::with(L10n::e("pagetop_promo_text1", &LOCALE_DEMOHOME).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -196,15 +190,15 @@ fn reporting_issues() -> Container { grid::Column::new() .with_classes(ClassesOp::Add, "reporting-col-text") .with_size(grid::ColumnSize::Is6of12) - .with_component(Heading::h2(Text::t( + .with_component(Heading::h2(L10n::t( "report_problems_title", &LOCALE_DEMOHOME, ))) .with_component( - Paragraph::with(Text::t("report_problems_text1", &LOCALE_DEMOHOME)) + Paragraph::with(L10n::t("report_problems_text1", &LOCALE_DEMOHOME)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(Text::t( + .with_component(Paragraph::with(L10n::t( "report_problems_text2", &LOCALE_DEMOHOME, ))), diff --git a/pagetop-homedemo/src/locales/en-US/homepage.ftl b/pagetop-homedemo/src/locales/en-US/homepage.ftl index b97672a1..c3941762 100644 --- a/pagetop-homedemo/src/locales/en-US/homepage.ftl +++ b/pagetop-homedemo/src/locales/en-US/homepage.ftl @@ -16,8 +16,7 @@ welcome_text2 = If the problem persists, please contact your system administrato pagetop_title = About PageTop pagetop_text1 = If you can read this page, it means that the PageTop server is working properly, but has not yet been configured. pagetop_text2 = PageTop defines an interface for the most stable and popular Rust packages to build modular, extensible and configurable web solutions. -pagetop_text3 = For more information on PageTop please visit the { $pagetop_website }. -pagetop_website = technical documentation +pagetop_text3 = For more information on PageTop please visit the <a href="{ $href }" target="_blank">technical documentation</a>. pagetop_promo_title = Promoting PageTop pagetop_promo_text1 = You are free to use the image below on applications powered by { $pagetop }. Thanks for using PageTop! diff --git a/pagetop-homedemo/src/locales/es-ES/homepage.ftl b/pagetop-homedemo/src/locales/es-ES/homepage.ftl index 32a56621..257deae3 100644 --- a/pagetop-homedemo/src/locales/es-ES/homepage.ftl +++ b/pagetop-homedemo/src/locales/es-ES/homepage.ftl @@ -16,8 +16,7 @@ welcome_text2 = Si el problema persiste, póngase en contacto con el administrad pagetop_title = Sobre PageTop pagetop_text1 = Si puedes leer esta página, significa que el servidor PageTop funciona correctamente, pero aún no se ha configurado. pagetop_text2 = PageTop define una interfaz para los paquetes Rust más estables y populares para crear soluciones web modulares, extensibles y configurables. -pagetop_text3 = Para más información sobre PageTop, por favor visita la { $pagetop_website }. -pagetop_website = documentación técnica +pagetop_text3 = Para más información sobre PageTop, por favor visita la <a href="{ $href }" target="_blank">documentación técnica</a>. pagetop_promo_title = Promociona PageTop pagetop_promo_text1 = Eres libre de usar la siguiente imagen en aplicaciones desarrolladas con { $pagetop }. ¡Gracias por usar PageTop! diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 58a18e01..0ff5ca7c 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -2,8 +2,8 @@ use pagetop::prelude::*; define_handle!(COMPONENT_MEGAMENUITEM); -type Label = OneComponent<Text>; -type Content = OneComponent<Html>; +type Label = OneComponent<L10n>; +type Content = OneComponent<L10n>; #[derive(Default)] pub enum MegaMenuItemType { @@ -86,35 +86,35 @@ impl ComponentTrait for MegaMenuItem { } impl MegaMenuItem { - pub fn label(label: Text) -> Self { + pub fn label(label: L10n) -> Self { MegaMenuItem { item_type: MegaMenuItemType::Label(OneComponent::new_with(label)), ..Default::default() } } - pub fn link(label: Text, path: &str) -> Self { + pub fn link(label: L10n, path: &str) -> Self { MegaMenuItem { item_type: MegaMenuItemType::Link(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } - pub fn link_blank(label: Text, path: &str) -> Self { + pub fn link_blank(label: L10n, path: &str) -> Self { MegaMenuItem { item_type: MegaMenuItemType::LinkBlank(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } - pub fn html(content: Html) -> Self { + pub fn html(content: L10n) -> Self { MegaMenuItem { item_type: MegaMenuItemType::Html(OneComponent::new_with(content)), ..Default::default() } } - pub fn submenu(label: Text, menu: MegaMenu) -> Self { + pub fn submenu(label: L10n, menu: MegaMenu) -> Self { MegaMenuItem { item_type: MegaMenuItemType::Submenu(OneComponent::new_with(label), menu), ..Default::default() diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 9c6ecf26..dba9c7d6 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -23,7 +23,7 @@ pub enum AnchorTarget { } type AnchorIcon = OneComponent<Icon>; -type AnchorHtml = OneComponent<Text>; +type AnchorHtml = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] @@ -91,11 +91,11 @@ impl ComponentTrait for Anchor { } impl Anchor { - pub fn link(href: &str, html: Text) -> Self { + pub fn link(href: &str, html: L10n) -> Self { Anchor::new().with_href(href).with_html(html) } - pub fn button(href: &str, html: Text) -> Self { + pub fn button(href: &str, html: L10n) -> Self { Anchor::new() .with_type(AnchorType::Button) .with_href(href) @@ -152,7 +152,7 @@ impl Anchor { } #[fn_builder] - pub fn alter_html(&mut self, html: Text) -> &mut Self { + pub fn alter_html(&mut self, html: L10n) -> &mut Self { self.html.set(html); self } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index c4a4ad5a..c661beaf 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -10,7 +10,7 @@ pub enum ButtonType { Reset, } -type ButtonValue = OneComponent<Text>; +type ButtonValue = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] @@ -77,11 +77,11 @@ impl ComponentTrait for Button { } impl Button { - pub fn with(value: Text) -> Self { + pub fn with(value: L10n) -> Self { Button::new().with_value(value) } - pub fn submit(value: Text) -> Self { + pub fn submit(value: L10n) -> Self { let mut button = Button::new() .with_classes(ClassesOp::Replace("form-button"), "form-submit") .with_value(value); @@ -89,7 +89,7 @@ impl Button { button } - pub fn reset(value: Text) -> Self { + pub fn reset(value: L10n) -> Self { let mut button = Button::new() .with_classes(ClassesOp::Replace("form-button"), "form-reset") .with_value(value); @@ -124,7 +124,7 @@ impl Button { } #[fn_builder] - pub fn alter_value(&mut self, value: Text) -> &mut Self { + pub fn alter_value(&mut self, value: L10n) -> &mut Self { self.value.set(value); self } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index fcd399b3..f9349dd0 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -13,8 +13,8 @@ pub enum InputType { Url, } -type InputLabel = OneComponent<Text>; -type InputHelpText = OneComponent<Text>; +type InputLabel = OneComponent<L10n>; +type InputHelpText = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] @@ -206,7 +206,7 @@ impl Input { } #[fn_builder] - pub fn alter_label(&mut self, label: Text) -> &mut Self { + pub fn alter_label(&mut self, label: L10n) -> &mut Self { self.label.set(label); self } @@ -281,7 +281,7 @@ impl Input { } #[fn_builder] - pub fn alter_help_text(&mut self, help_text: Text) -> &mut Self { + pub fn alter_help_text(&mut self, help_text: L10n) -> &mut Self { self.help_text.set(help_text); self } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 45f1fc7f..4e1eb21b 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -25,7 +25,7 @@ pub enum HeadingDisplay { Subtitle, } -type HeadingText = OneComponent<Text>; +type HeadingText = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] @@ -80,37 +80,37 @@ impl ComponentTrait for Heading { } impl Heading { - pub fn h1(text: Text) -> Self { + pub fn h1(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H1) .with_text(text) } - pub fn h2(text: Text) -> Self { + pub fn h2(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H2) .with_text(text) } - pub fn h3(text: Text) -> Self { + pub fn h3(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H3) .with_text(text) } - pub fn h4(text: Text) -> Self { + pub fn h4(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H4) .with_text(text) } - pub fn h5(text: Text) -> Self { + pub fn h5(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H5) .with_text(text) } - pub fn h6(text: Text) -> Self { + pub fn h6(text: L10n) -> Self { Heading::new() .with_heading_type(HeadingType::H6) .with_text(text) @@ -149,7 +149,7 @@ impl Heading { } #[fn_builder] - pub fn alter_text(&mut self, text: Text) -> &mut Self { + pub fn alter_text(&mut self, text: L10n) -> &mut Self { self.text.set(text); self } diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 0e0c2d15..1bf38518 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -11,11 +11,11 @@ impl ModuleTrait for Menu { MODULE_MENU } - fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_MENU)) + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALE_MENU) } - fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_MENU))) + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALE_MENU) } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 3124cb88..02ebd447 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -14,12 +14,12 @@ impl ModuleTrait for Node { MODULE_NODE } - fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_NODE)) + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALE_NODE) } - fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_NODE))) + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALE_NODE) } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { @@ -41,7 +41,7 @@ impl ModuleTrait for Node { } async fn node(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { - Page::new(request).with_title(Text::n("Nodo")).render() + Page::new(request).with_title(L10n::text("Nodo")).render() } fn before_render_page(page: &mut Page) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index eaaf7296..a4a1ed99 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -14,12 +14,12 @@ impl ModuleTrait for User { MODULE_USER } - fn name(&self) -> String { - _t("module_name", Locale::From(&LOCALE_USER)) + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALE_USER) } - fn description(&self) -> Option<String> { - Some(_t("module_description", Locale::From(&LOCALE_USER))) + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALE_USER) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -42,7 +42,7 @@ impl ModuleTrait for User { async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(Text::n("Identificación del usuario")) + .with_title(L10n::text("Identificación del usuario")) .with_this_in( "region-content", Container::new() @@ -58,9 +58,9 @@ fn form_login() -> Form { .with_element( form_element::Input::textfield() .with_name("name") - .with_label(Text::t("username", &LOCALE_USER)) + .with_label(L10n::t("username", &LOCALE_USER)) .with_help_text( - Text::t("username_help", &LOCALE_USER) + L10n::t("username_help", &LOCALE_USER) .with_arg("app", config::SETTINGS.app.name.to_owned()), ) .with_autofocus(true), @@ -68,8 +68,8 @@ fn form_login() -> Form { .with_element( form_element::Input::password() .with_name("pass") - .with_label(Text::t("password", &LOCALE_USER)) - .with_help_text(Text::t("password_help", &LOCALE_USER)), + .with_label(L10n::t("password", &LOCALE_USER)) + .with_help_text(L10n::t("password_help", &LOCALE_USER)), ) - .with_element(form_element::Button::submit(Text::t("login", &LOCALE_USER))) + .with_element(form_element::Button::submit(L10n::t("login", &LOCALE_USER))) } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 5b0dd2f5..55f269df 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -17,6 +17,5 @@ pub(crate) use all::common_components; mod renderable; pub use renderable::{IsRenderable, Renderable}; -mod basic; -pub use basic::{Html, COMPONENT_HTML}; -pub use basic::{Text, COMPONENT_TEXT}; +mod l10n; +pub use l10n::{L10n, COMPONENT_L10N}; diff --git a/pagetop/src/core/component/basic.rs b/pagetop/src/core/component/basic.rs deleted file mode 100644 index 86fd7e78..00000000 --- a/pagetop/src/core/component/basic.rs +++ /dev/null @@ -1,143 +0,0 @@ -use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; -use crate::html::{html, Markup, PreEscaped}; -use crate::locale::{translate, Locale, Locales}; -use crate::{define_handle, fn_builder, paste, Handle}; - -use std::collections::HashMap; - -macro_rules! basic_components { - ( $($COMPONENT_HANDLE:ident: $Component:ty => $TypeValue:ty),* ) => { $( paste! { - - define_handle!($COMPONENT_HANDLE); - - pub enum [< $Component Op >] { - None, - Value($TypeValue), - Translated(&'static str, &'static Locales), - Escaped(&'static str, &'static Locales), - } - - pub struct $Component { - op: [< $Component Op >], - args: HashMap<&'static str, String>, - } - - impl Default for $Component { - fn default() -> Self { - $Component { - op: [< $Component Op >]::None, - args: HashMap::new(), - } - } - } - - impl ComponentTrait for $Component { - fn new() -> Self { - $Component::default() - } - - fn handle(&self) -> Handle { - $COMPONENT_HANDLE - } - - fn default_render(&self, rcx: &mut RenderContext) -> Markup { - match self.op() { - [< $Component Op >]::None => html! {}, - [< $Component Op >]::Value(value) => html! { (value) }, - [< $Component Op >]::Translated(key, locales) => html! { - (translate( - key, - Locale::Using( - rcx.langid(), - locales, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { - args.insert(key.to_string(), value.to_owned().into()); - args - }) - ) - )) - }, - [< $Component Op >]::Escaped(key, locales) => html! { - (PreEscaped(translate( - key, - Locale::Using( - rcx.langid(), - locales, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { - args.insert(key.to_string(), value.to_owned().into()); - args - }) - ) - ))) - }, - } - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } - } - - impl $Component { - pub fn n(value: $TypeValue) -> Self { - $Component { - op: [< $Component Op >]::Value(value), - ..Default::default() - } - } - - pub fn t(key: &'static str, locales: &'static Locales) -> Self { - $Component { - op: [< $Component Op >]::Translated(key, locales), - ..Default::default() - } - } - - pub fn e(key: &'static str, locales: &'static Locales) -> Self { - $Component { - op: [< $Component Op >]::Escaped(key, locales), - ..Default::default() - } - } - - // $Component BUILDER. - - #[fn_builder] - pub fn alter_op(&mut self, op: [< $Component Op >]) -> &mut Self { - self.op = op; - self - } - - #[fn_builder] - pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { - self.args.insert(arg, value); - self - } - - pub fn clear_args(&mut self) -> &mut Self { - self.args.drain(); - self - } - - // $Component GETTERS. - - pub fn op(&self) -> &[< $Component Op >] { - &self.op - } - - pub fn args(&self) -> &HashMap<&str, String> { - &self.args - } - } - - } )* }; -} - -basic_components!( - COMPONENT_HTML: Html => Markup, - COMPONENT_TEXT: Text => &'static str -); diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs new file mode 100644 index 00000000..1f6f8fc3 --- /dev/null +++ b/pagetop/src/core/component/l10n.rs @@ -0,0 +1,141 @@ +use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::html::{html, Markup, PreEscaped}; +use crate::locale::Locales; +use crate::{define_handle, fn_builder, Handle}; + +use fluent_templates::Loader; + +use std::collections::HashMap; + +define_handle!(COMPONENT_L10N); + +pub enum L10nOp { + None, + Value(Markup), + Translated(&'static str, &'static Locales), + Escaped(&'static str, &'static Locales), +} + +pub struct L10n { + op: L10nOp, + args: HashMap<&'static str, String>, +} + +impl Default for L10n { + fn default() -> Self { + L10n { + op: L10nOp::None, + args: HashMap::new(), + } + } +} + +impl ComponentTrait for L10n { + fn new() -> Self { + L10n::default() + } + + fn handle(&self) -> Handle { + COMPONENT_L10N + } + + fn default_render(&self, rcx: &mut RenderContext) -> Markup { + match self.op() { + L10nOp::None => html! {}, + L10nOp::Value(value) => html! { (value) }, + L10nOp::Translated(key, locales) => html! { + (locales + .lookup_with_args( + rcx.langid(), + key, + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }) + ) + .unwrap_or(key.to_string()) + ) + }, + L10nOp::Escaped(key, locales) => html! { + (PreEscaped(locales + .lookup_with_args( + rcx.langid(), + key, + &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }) + ) + .unwrap_or(key.to_string()) + )) + }, + } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl L10n { + pub fn text(text: &'static str) -> Self { + L10n { + op: L10nOp::Value(html! { (text) }), + ..Default::default() + } + } + + pub fn html(html: Markup) -> Self { + L10n { + op: L10nOp::Value(html), + ..Default::default() + } + } + + pub fn t(key: &'static str, locales: &'static Locales) -> Self { + L10n { + op: L10nOp::Translated(key, locales), + ..Default::default() + } + } + + pub fn e(key: &'static str, locales: &'static Locales) -> Self { + L10n { + op: L10nOp::Escaped(key, locales), + ..Default::default() + } + } + + // L10n BUILDER. + + #[fn_builder] + pub fn alter_op(&mut self, op: L10nOp) -> &mut Self { + self.op = op; + self + } + + #[fn_builder] + pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { + self.args.insert(arg, value); + self + } + + pub fn clear_args(&mut self) -> &mut Self { + self.args.drain(); + self + } + + // L10n GETTERS. + + pub fn op(&self) -> &L10nOp { + &self.op + } + + pub fn args(&self) -> &HashMap<&str, String> { + &self.args + } +} diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index d18ed088..d4350c3b 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,6 @@ use super::ThemeStaticRef; +use crate::core::component::L10n; use crate::core::hook::HookAction; use crate::util::single_type_name; use crate::{server, Handle}; @@ -17,12 +18,12 @@ pub trait BaseModule { pub trait ModuleTrait: BaseModule + Send + Sync { fn handle(&self) -> Handle; - fn name(&self) -> String { - self.single_name().to_owned() + fn name(&self) -> L10n { + L10n::text(self.single_name()) } - fn description(&self) -> Option<String> { - None + fn description(&self) -> L10n { + L10n::default() } fn theme(&self) -> Option<ThemeStaticRef> { diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index ebb0d999..74af781a 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -1,9 +1,7 @@ //! Localización (L10n). //! -//! Proporciona soporte a [Fluent](https://www.projectfluent.org/), un conjunto de especificaciones -//! para la localización de aplicaciones, así como implementaciones y buenas prácticas originalmente -//! desarrolladas por Mozilla. -//! +//! PageTop usa el conjunto de especificaciones [Fluent](https://www.projectfluent.org/) para la +//! localización de aplicaciones. //! //! # Sintaxis Fluent (FTL) //! @@ -72,43 +70,23 @@ //! //! # Cómo aplicar la localización en tu código //! -//! Una vez hayas creado tu directorio de recursos FTL, sólo tienes que usar la poderosa macro +//! Una vez hayas creado tu directorio de recursos FTL usa la macro //! [`define_locale!`](crate::define_locale) para integrarlos en tu módulo o aplicación. //! -//! Y podrás usar las funciones globales [`_t()`] o [`_e()`] para traducir tus textos: -//! //! ``` //! use pagetop::prelude::*; //! //! define_locale!(LOCALE_SAMPLE, "static/locales"); -//! -//! fn demo() { -//! println!("* {}", _t("hello-world", Locale::From(&LOCALE_SAMPLE))); -//! println!("* {}", _t("hello-user", Locale::With(&LOCALE_SAMPLE, &args!["userName" => "Julia"]))); -//! -//! let args = args![ -//! "userName" => "Roberto", -//! "photoCount" => 3, -//! "userGender" => "male" -//! ]; -//! println!("* {}\n", _t("shared-photos", Locale::With(&LOCALE_SAMPLE, &args))); -//! } //! ``` -//! Aunque preferirás usar normalmente los componentes básicos [Text](crate::core::component::Text) -//! y [Html](crate::core::component::Html) para incluir, en respuestas a las peticiones web, textos -//! y contenidos opcionalmente traducibles según el contexto de renderizado. +//! Y utiliza el componente [L10n](crate::core::component::L10n) para incluir, en respuestas a las +//! peticiones web, textos y contenidos opcionalmente traducibles según el contexto de renderizado. -use crate::html::{Markup, PreEscaped}; use crate::{args, config, trace, LazyStatic}; -pub(crate) use unic_langid::{langid, LanguageIdentifier}; - pub use fluent_templates; pub(crate) use fluent_templates::StaticLoader as Locales; - -use fluent_templates::fluent_bundle::FluentValue; -use fluent_templates::Loader; +pub(crate) use unic_langid::{langid, LanguageIdentifier}; use std::collections::HashMap; @@ -127,7 +105,7 @@ static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| lang /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// global para la aplicación a partir de `SETTINGS.app.language`. -pub static DEFAULT_LANGID: LazyStatic<&LanguageIdentifier> = +pub(crate) static DEFAULT_LANGID: LazyStatic<&LanguageIdentifier> = LazyStatic::new(|| langid_for(config::SETTINGS.app.language.as_str())); pub fn langid_for(language: &str) -> &LanguageIdentifier { @@ -144,31 +122,3 @@ pub fn langid_for(language: &str) -> &LanguageIdentifier { } } } - -pub enum Locale<'a> { - From(&'a Locales), - With(&'a Locales, &'a HashMap<String, FluentValue<'a>>), - Using( - &'a LanguageIdentifier, - &'a Locales, - &'a HashMap<String, FluentValue<'a>>, - ), -} - -pub fn _t(key: &str, locale: Locale) -> String { - translate(key, locale) -} - -pub fn _e(key: &str, locale: Locale) -> Markup { - PreEscaped(translate(key, locale)) -} - -#[inline] -pub(crate) fn translate(key: &str, locale: Locale) -> String { - match locale { - Locale::From(locales) => locales.lookup(&DEFAULT_LANGID, key), - Locale::With(locales, args) => locales.lookup_with_args(&DEFAULT_LANGID, key, args), - Locale::Using(langid, locales, args) => locales.lookup_with_args(langid, key, args), - } - .unwrap_or(key.to_string()) -} diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 411b6b79..cc3c9884 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::core::component::Text; +use crate::core::component::L10n; use crate::response::{page::Page, ResponseError}; use crate::server::http::{header::ContentType, StatusCode}; use crate::server::{HttpRequest, HttpResponse}; @@ -32,7 +32,7 @@ impl fmt::Display for FatalError { FatalError::AccessDenied(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title(Text::n("Error FORBIDDEN")) + .with_title(L10n::text("Error FORBIDDEN")) .with_this_in("region-content", error403::Error403) .with_template("error") .render() @@ -46,7 +46,7 @@ impl fmt::Display for FatalError { FatalError::NotFound(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title(Text::n("Error RESOURCE NOT FOUND")) + .with_title(L10n::text("Error RESOURCE NOT FOUND")) .with_this_in("region-content", error404::Error404) .with_template("error") .render() diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 748df4a0..e13b9f47 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -11,8 +11,8 @@ use unic_langid::CharacterDirection; use std::collections::HashMap; -type PageTitle = OneComponent<Text>; -type PageDescription = OneComponent<Text>; +type PageTitle = OneComponent<L10n>; +type PageDescription = OneComponent<L10n>; #[rustfmt::skip] pub struct Page { @@ -60,13 +60,13 @@ impl Page { } #[fn_builder] - pub fn alter_title(&mut self, title: Text) -> &mut Self { + pub fn alter_title(&mut self, title: L10n) -> &mut Self { self.title.set(title); self } #[fn_builder] - pub fn alter_description(&mut self, description: Text) -> &mut Self { + pub fn alter_description(&mut self, description: L10n) -> &mut Self { self.description.set(description); self } From 3886a27e8a6d4b7d43e5b365b94e8e938809f5fd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 01:02:09 +0200 Subject: [PATCH 335/853] =?UTF-8?q?=F0=9F=9A=9A=20Antes=20DEFAULT=5FLANGID?= =?UTF-8?q?,=20ahora=20LANGID,=20a=20secas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 2 +- pagetop/src/core/component/context.rs | 10 +++++----- pagetop/src/locale.rs | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 8e3c75f2..dbb39ddd 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -34,7 +34,7 @@ impl Application { LazyStatic::force(&trace::TRACING); // Valida el identificador global de idioma. - LazyStatic::force(&locale::DEFAULT_LANGID); + LazyStatic::force(&locale::LANGID); #[cfg(feature = "database")] // Conecta con la base de datos. diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index dec94143..b6311bec 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,13 +1,13 @@ use crate::core::module::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; -use crate::locale::{LanguageIdentifier, DEFAULT_LANGID}; +use crate::locale::{LanguageIdentifier, LANGID}; use crate::server::HttpRequest; use crate::{concat_string, config, util, LazyStatic}; use std::collections::HashMap; use std::str::FromStr; -static DEFAULT_THEME: LazyStatic<ThemeStaticRef> = +static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, None => &crate::core::basic::Basic, @@ -38,8 +38,8 @@ impl Default for RenderContext { #[rustfmt::skip] fn default() -> Self { RenderContext { - langid : &DEFAULT_LANGID, - theme : *DEFAULT_THEME, + langid : &LANGID, + theme : *THEME, request : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), @@ -60,7 +60,7 @@ impl RenderContext { self.langid = langid; } ContextOp::Theme(theme_name) => { - self.theme = theme_by_single_name(theme_name).unwrap_or(*DEFAULT_THEME); + self.theme = theme_by_single_name(theme_name).unwrap_or(*THEME); } ContextOp::Request(request) => { self.request = request; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 74af781a..4fe64bde 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -105,7 +105,7 @@ static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| lang /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// global para la aplicación a partir de `SETTINGS.app.language`. -pub(crate) static DEFAULT_LANGID: LazyStatic<&LanguageIdentifier> = +pub(crate) static LANGID: LazyStatic<&LanguageIdentifier> = LazyStatic::new(|| langid_for(config::SETTINGS.app.language.as_str())); pub fn langid_for(language: &str) -> &LanguageIdentifier { From 1269b99b1ef9a1c4292fe50c920f17ea851ac083 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 01:25:30 +0200 Subject: [PATCH 336/853] =?UTF-8?q?=F0=9F=93=9D=20Incorpora=20cr=C3=A9dito?= =?UTF-8?q?s=20en=20el=20archivo=20adecuado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 20 +++++++++++++++++--- pagetop/README.md | 14 -------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index bd5f0f62..cbf729ad 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,4 +1,18 @@ -# FIGfonts +# ⌨️ Código + +* PageTop incluye código de la versión [0.11.0](https://github.com/mehcode/config-rs/tree/0.11.0) de + [config](https://crates.io/crates/config), de [Ryan Leckey](https://crates.io/users/mehcode), por + las facilidades que ofrece frente a sus versiones más modernas para leer los ajustes de + configuración y delegar su asignación a tipos seguros según los requerimientos de cada módulo, + tema o aplicación. + +* PageTop incorpora una versión adaptada del excelente crate [maud](https://crates.io/crates/maud) + de [Chris Wong](https://crates.io/users/lambda-fairy) (versión + [0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud)), para añadir sus funcionalidades + sin requerir la referencia a `maud` en el archivo `Cargo.toml` de cada proyecto. + + +# 🗚 FIGfonts PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de *yuanbohan*. Muestra en el terminal un rótulo de presentación con el nombre de la aplicación usando caracteres @@ -11,14 +25,14 @@ en el terminal un rótulo de presentación con el nombre de la aplicación usand * [starwars.flf](http://www.figlet.org/fontdb_example.cgi?font=starwars.flf) por *Ryan Youck*. -# Plantillas +# 📰 Plantillas * El diseño de la página predeterminada de inicio está basado en la plantilla [Zinc](https://themewagon.com/themes/free-bootstrap-5-html5-business-website-template-zinc) creada por [inovatik](https://inovatik.com/) y distribuida por [ThemeWagon](https://themewagon.com). -# Icono +# 🎨 Icono El monstruo sonriente de Frankenstein es una divertida creación de [Webalys](https://www.iconfinder.com/webalys). Puede encontrarse en su colección diff --git a/pagetop/README.md b/pagetop/README.md index 4ba24362..41ae4400 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -9,20 +9,6 @@ configurables. constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. -# 🔖 Créditos - -* Incluye código sustancial de la versión [0.11.0](https://github.com/mehcode/config-rs/tree/0.11.0) - de [config](https://crates.io/crates/config), de [Ryan Leckey](https://crates.io/users/mehcode), - por las facilidades que ofrece frente a sus versiones más modernas para leer inicialmente los - ajustes de configuración y delegar su asignación a tipos seguros según los requerimientos de cada - módulo, tema o aplicación creada con **PageTop**. - -* Incorpora en código una versión adaptada del excelente crate [maud](https://crates.io/crates/maud) - de [Chris Wong](https://crates.io/users/lambda-fairy) (versión - [0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud)), para añadir sus funcionalidades - en **PageTop** sin requerir la referencia a `maud` en el archivo `Cargo.toml` de cada proyecto. - - # 📜 Licencia Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu From 71c1305fca75355f9a4bcacc588baa672e5380d6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 09:28:39 +0200 Subject: [PATCH 337/853] =?UTF-8?q?=E2=9C=A8=20Handle=20por=20defecto=20pa?= =?UTF-8?q?ra=20definiciones=20del=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/definition.rs | 4 ++-- pagetop/src/core/hook/definition.rs | 8 ++++++-- pagetop/src/core/module/definition.rs | 8 ++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index db683062..bc03b30d 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -5,7 +5,7 @@ use crate::{define_handle, Handle}; pub use std::any::Any as AnyComponent; -define_handle!(COMPONENT_UNDEFINED); +define_handle!(COMPONENT_UNNAMED); pub trait BaseComponent { fn render(&mut self, rcx: &mut RenderContext) -> Markup; @@ -17,7 +17,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { Self: Sized; fn handle(&self) -> Handle { - COMPONENT_UNDEFINED + COMPONENT_UNNAMED } fn name(&self) -> String { diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs index 047bab6d..49b82d52 100644 --- a/pagetop/src/core/hook/definition.rs +++ b/pagetop/src/core/hook/definition.rs @@ -1,13 +1,17 @@ -use crate::Handle; +use crate::{define_handle, Handle}; pub use std::any::Any as AnyHookAction; +define_handle!(HOOK_UNNAMED); + pub trait HookActionTrait: AnyHookAction + Send + Sync { fn new() -> Self where Self: Sized; - fn handle(&self) -> Handle; + fn handle(&self) -> Handle { + HOOK_UNNAMED + } fn weight(&self) -> isize { 0 diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index d4350c3b..71197055 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -3,20 +3,24 @@ use super::ThemeStaticRef; use crate::core::component::L10n; use crate::core::hook::HookAction; use crate::util::single_type_name; -use crate::{server, Handle}; +use crate::{define_handle, server, Handle}; #[cfg(feature = "database")] use crate::db::MigrationItem; pub type ModuleStaticRef = &'static dyn ModuleTrait; +define_handle!(APP_UNNAMED); + pub trait BaseModule { fn single_name(&self) -> &'static str; } /// Los módulos deben implementar este *trait*. pub trait ModuleTrait: BaseModule + Send + Sync { - fn handle(&self) -> Handle; + fn handle(&self) -> Handle { + APP_UNNAMED + } fn name(&self) -> L10n { L10n::text(self.single_name()) From a303fe67c91819860e9109a36fe850d35fd15a32 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 09:59:12 +0200 Subject: [PATCH 338/853] =?UTF-8?q?=F0=9F=8E=A8=20Elimina=20carpeta=20bann?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 6 +++--- README.md | 2 +- banner/pagetop.png => banner-pagetop.png | Bin pagetop/src/lib.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename banner/pagetop.png => banner-pagetop.png (100%) diff --git a/CREDITS.md b/CREDITS.md index cbf729ad..abe7c132 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -14,9 +14,9 @@ # 🗚 FIGfonts -PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de *yuanbohan*. Muestra -en el terminal un rótulo de presentación con el nombre de la aplicación usando caracteres -[FIGlet](http://www.figlet.org). Las fuentes incluidas en `src/app/banner` son: +PageTop utiliza el paquete [figlet-rs](https://crates.io/crates/figlet-rs) de *yuanbohan* para +mostrar en el terminal un rótulo de presentación con el nombre de la aplicación usando caracteres +[FIGlet](http://www.figlet.org). Las fuentes incluidas en `src/app` son: * [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) por *Glenn Chappell*. * [small.flf](http://www.figlet.org/fontdb_example.cgi?font=small.flf) por *Glenn Chappell* diff --git a/README.md b/README.md index de4f8abe..797382fa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ <div align="center"> - <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/banner/pagetop.png" /> + <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/banner-pagetop.png" /> <h1>PageTop</h1> diff --git a/banner/pagetop.png b/banner-pagetop.png similarity index 100% rename from banner/pagetop.png rename to banner-pagetop.png diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 8b7e54d9..0adcce75 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -1,6 +1,6 @@ //! <div align="center"> //! -//! <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/banner/pagetop.png" /> +//! <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/banner-pagetop.png" /> //! //! <h1>PageTop</h1> //! From 4b218d9ad80aff999ce6983ddb19cf9e995b90c8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 10:00:09 +0200 Subject: [PATCH 339/853] =?UTF-8?q?=F0=9F=8E=A8=20Publica=20constantes=20d?= =?UTF-8?q?e=20definiciones=20del=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component.rs | 4 +++- pagetop/src/core/hook.rs | 2 +- pagetop/src/core/module.rs | 2 +- pagetop/src/core/module/definition.rs | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 55f269df..b75cbc9a 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -2,7 +2,9 @@ mod context; pub use context::{ContextOp, RenderContext}; mod definition; -pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; +pub use definition::{ + component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait, COMPONENT_UNNAMED, +}; mod one; pub use one::OneComponent; diff --git a/pagetop/src/core/hook.rs b/pagetop/src/core/hook.rs index 2ccd6768..9fbf7045 100644 --- a/pagetop/src/core/hook.rs +++ b/pagetop/src/core/hook.rs @@ -1,5 +1,5 @@ mod definition; -pub use definition::{action_ref, AnyHookAction, HookActionTrait}; +pub use definition::{action_ref, AnyHookAction, HookActionTrait, HOOK_UNNAMED}; mod holder; use holder::ActionsHolder; diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index 24fe5016..6266ddd8 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,5 +1,5 @@ mod definition; -pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait}; +pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait, MODULE_UNNAMED}; mod theme; pub use theme::{ThemeStaticRef, ThemeTrait}; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 71197055..9f1837f0 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -10,7 +10,7 @@ use crate::db::MigrationItem; pub type ModuleStaticRef = &'static dyn ModuleTrait; -define_handle!(APP_UNNAMED); +define_handle!(MODULE_UNNAMED); pub trait BaseModule { fn single_name(&self) -> &'static str; @@ -19,7 +19,7 @@ pub trait BaseModule { /// Los módulos deben implementar este *trait*. pub trait ModuleTrait: BaseModule + Send + Sync { fn handle(&self) -> Handle { - APP_UNNAMED + MODULE_UNNAMED } fn name(&self) -> L10n { From c136126deb1e0a6b19a61d85f2ce353c04347cfa Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 18:49:23 +0200 Subject: [PATCH 340/853] =?UTF-8?q?=F0=9F=8D=B1=20A=C3=B1ade=20recursos=20?= =?UTF-8?q?de=20localizaci=C3=B3n=20globales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 4 +++- pagetop/static/locales/en-US/theme.ftl | 6 ++++++ pagetop/static/locales/es-ES/theme.ftl | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 pagetop/static/locales/en-US/theme.ftl create mode 100644 pagetop/static/locales/es-ES/theme.ftl diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index dbb39ddd..a3d4e67d 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,7 +6,7 @@ use crate::core::{module, module::ModuleStaticRef}; use crate::html::Markup; use crate::response::fatal_error::FatalError; use crate::response::page::ResultPage; -use crate::{config, locale, server, trace, LazyStatic}; +use crate::{config, define_locale, locale, server, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db; @@ -21,6 +21,8 @@ use std::io::Error; use substring::Substring; +define_locale!(LOCALE_PAGETOP, "static/locales"); + pub struct Application { server: Server, } diff --git a/pagetop/static/locales/en-US/theme.ftl b/pagetop/static/locales/en-US/theme.ftl new file mode 100644 index 00000000..f87bfe36 --- /dev/null +++ b/pagetop/static/locales/en-US/theme.ftl @@ -0,0 +1,6 @@ +header = Header +pagetop = Page Top +content = Content +sidebar = Sidebar +pagebottom = Page Bottom +footer = Footer diff --git a/pagetop/static/locales/es-ES/theme.ftl b/pagetop/static/locales/es-ES/theme.ftl new file mode 100644 index 00000000..65cc7218 --- /dev/null +++ b/pagetop/static/locales/es-ES/theme.ftl @@ -0,0 +1,6 @@ +header = Cabecera +pagetop = Superior +content = Contenido +sidebar = Barra lateral +pagebottom = Inferior +footer = Pie de página From 18c141aeb9e67782c998383082d13925dd3a5ba4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 18:55:03 +0200 Subject: [PATCH 341/853] =?UTF-8?q?=F0=9F=9A=9A=20Reubicaci=C3=B3n=20de=20?= =?UTF-8?q?archivos=20de=20localizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/build.rs | 2 +- .../{src => static}/locales/en-US/bootsier.ftl | 1 + pagetop-bootsier/static/locales/en-US/regions.ftl | 13 +++++++++++++ .../{src => static}/locales/es-ES/bootsier.ftl | 0 pagetop-bootsier/static/locales/es-ES/regions.ftl | 13 +++++++++++++ .../static/{ => theme}/css/bootstrap.min.css | 0 .../static/{ => theme}/css/bootstrap.min.css.map | 0 .../static/{ => theme}/images/caution.png | Bin .../static/{ => theme}/js/bootstrap.bundle.min.js | 0 .../{ => theme}/js/bootstrap.bundle.min.js.map | 0 10 files changed, 28 insertions(+), 1 deletion(-) rename pagetop-bootsier/{src => static}/locales/en-US/bootsier.ftl (99%) create mode 100644 pagetop-bootsier/static/locales/en-US/regions.ftl rename pagetop-bootsier/{src => static}/locales/es-ES/bootsier.ftl (100%) create mode 100644 pagetop-bootsier/static/locales/es-ES/regions.ftl rename pagetop-bootsier/static/{ => theme}/css/bootstrap.min.css (100%) rename pagetop-bootsier/static/{ => theme}/css/bootstrap.min.css.map (100%) rename pagetop-bootsier/static/{ => theme}/images/caution.png (100%) rename pagetop-bootsier/static/{ => theme}/js/bootstrap.bundle.min.js (100%) rename pagetop-bootsier/static/{ => theme}/js/bootstrap.bundle.min.js.map (100%) diff --git a/pagetop-bootsier/build.rs b/pagetop-bootsier/build.rs index 43a25bd1..0fbb64f7 100644 --- a/pagetop-bootsier/build.rs +++ b/pagetop-bootsier/build.rs @@ -1,3 +1,3 @@ fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "bootsier", None) + pagetop_build::bundle_resources("./static/theme", "bootsier", None) } diff --git a/pagetop-bootsier/src/locales/en-US/bootsier.ftl b/pagetop-bootsier/static/locales/en-US/bootsier.ftl similarity index 99% rename from pagetop-bootsier/src/locales/en-US/bootsier.ftl rename to pagetop-bootsier/static/locales/en-US/bootsier.ftl index 0e8969cd..582e2d0a 100644 --- a/pagetop-bootsier/src/locales/en-US/bootsier.ftl +++ b/pagetop-bootsier/static/locales/en-US/bootsier.ftl @@ -3,3 +3,4 @@ e404-message = The page you are looking for may have been removed, had its name e500-description = Oops! Unexpected Error e500-message = We're having an issue. Please report this error to an administrator. back-homepage = Back to homepage + diff --git a/pagetop-bootsier/static/locales/en-US/regions.ftl b/pagetop-bootsier/static/locales/en-US/regions.ftl new file mode 100644 index 00000000..029aa3c1 --- /dev/null +++ b/pagetop-bootsier/static/locales/en-US/regions.ftl @@ -0,0 +1,13 @@ +header = Header +primary_menu = Primary menu +secondary_menu = Secondary menu +hero = Hero (full width) +highlighted = Highlighted +breadcrumb = Breadcrumb +social = Social Bar +content_above = Content Above +content = Content +sidebar = Sidebar +content_below = Content Below +footer_top = Footer Top +footer_bottom = Footer Bottom diff --git a/pagetop-bootsier/src/locales/es-ES/bootsier.ftl b/pagetop-bootsier/static/locales/es-ES/bootsier.ftl similarity index 100% rename from pagetop-bootsier/src/locales/es-ES/bootsier.ftl rename to pagetop-bootsier/static/locales/es-ES/bootsier.ftl diff --git a/pagetop-bootsier/static/locales/es-ES/regions.ftl b/pagetop-bootsier/static/locales/es-ES/regions.ftl new file mode 100644 index 00000000..9b50d168 --- /dev/null +++ b/pagetop-bootsier/static/locales/es-ES/regions.ftl @@ -0,0 +1,13 @@ +header = Cabecera +primary_menu = Menú principal +secondary_menu = Menú secundario +hero = Hero (ancho completo) +highlighted = Destacado +breadcrumb = Ruta de navegación +social = Enlaces sociales +content_above = Antes del contenido +content = Contenido +sidebar = Barra lateral +content_below = Después del contenido +footer_top = Pie de página (superior) +footer_bottom = Pie de página (inferior) diff --git a/pagetop-bootsier/static/css/bootstrap.min.css b/pagetop-bootsier/static/theme/css/bootstrap.min.css similarity index 100% rename from pagetop-bootsier/static/css/bootstrap.min.css rename to pagetop-bootsier/static/theme/css/bootstrap.min.css diff --git a/pagetop-bootsier/static/css/bootstrap.min.css.map b/pagetop-bootsier/static/theme/css/bootstrap.min.css.map similarity index 100% rename from pagetop-bootsier/static/css/bootstrap.min.css.map rename to pagetop-bootsier/static/theme/css/bootstrap.min.css.map diff --git a/pagetop-bootsier/static/images/caution.png b/pagetop-bootsier/static/theme/images/caution.png similarity index 100% rename from pagetop-bootsier/static/images/caution.png rename to pagetop-bootsier/static/theme/images/caution.png diff --git a/pagetop-bootsier/static/js/bootstrap.bundle.min.js b/pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js similarity index 100% rename from pagetop-bootsier/static/js/bootstrap.bundle.min.js rename to pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js diff --git a/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map b/pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js.map similarity index 100% rename from pagetop-bootsier/static/js/bootstrap.bundle.min.js.map rename to pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js.map From a669608783f7c55d0fdf14fc6b396a080bc263d6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 4 Jun 2023 23:00:51 +0200 Subject: [PATCH 342/853] =?UTF-8?q?=F0=9F=93=B1=20Actualiza=20el=20funcion?= =?UTF-8?q?amiento=20de=20temas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 2 +- pagetop-bootsier/src/lib.rs | 77 ++++++++++++++++++- .../static/locales/en-US/regions.ftl | 18 ++--- .../static/locales/es-ES/regions.ftl | 20 ++--- pagetop-homedemo/src/lib.rs | 10 +-- pagetop-user/src/lib.rs | 2 +- pagetop/src/core/module/theme.rs | 31 ++++---- pagetop/src/response/fatal_error.rs | 4 +- pagetop/static/locales/en-US/theme.ftl | 1 - pagetop/static/locales/es-ES/theme.ftl | 3 +- 10 files changed, 117 insertions(+), 51 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index e9c08c21..d12b692d 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -59,7 +59,7 @@ pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalEr .with_title(L10n::text("Admin")) .with_this_in("top-menu", top_menu) .with_this_in( - "region-content", + "content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) .with_column(grid::Column::new().with_component(L10n::html(html! { diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index e69c5e75..9a612e75 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(THEME_BOOTSIER); -define_locale!(LOCALE_BOOTSIER, "src/locales"); +define_locale!(LOCALE_BOOTSIER, "static/locales"); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); @@ -27,6 +27,21 @@ impl ModuleTrait for Bootsier { } impl ThemeTrait for Bootsier { + #[rustfmt::skip] + fn regions(&self) -> Vec<(&'static str, L10n)> { + vec![ + ("header", L10n::t("header", &LOCALE_BOOTSIER)), + ("nav_branding", L10n::t("nav_branding", &LOCALE_BOOTSIER)), + ("nav_main", L10n::t("nav_main", &LOCALE_BOOTSIER)), + ("nav_additional", L10n::t("nav_additional", &LOCALE_BOOTSIER)), + ("breadcrumb", L10n::t("breadcrumb", &LOCALE_BOOTSIER)), + ("content", L10n::t("breadcrumb", &LOCALE_BOOTSIER)), + ("sidebar_first", L10n::t("sidebar_first", &LOCALE_BOOTSIER)), + ("sidebar_second", L10n::t("sidebar_second", &LOCALE_BOOTSIER)), + ("footer", L10n::t("footer", &LOCALE_BOOTSIER)), + ] + } + fn before_render_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( @@ -42,6 +57,66 @@ impl ThemeTrait for Bootsier { pagetop_jquery::JQuery::add_jquery(page.context()); } + fn render_page_body(&self, page: &mut Page) -> Markup { + match page.template() { + "admin" => html! { + body class=[page.body_classes().get()] { + @for region in &[ + "top-menu", + "side-menu", + "content" + ] { + @if let Some(content) = page.render_region(region) { + #(region) { (content) } + } + } + } + }, + _ => { + let header = page.render_region("header"); + let nav_branding = page.render_region("nav_branding"); + let nav_main = page.render_region("nav_main"); + let nav_additional = page.render_region("nav_additional"); + let breadcrumb = page.render_region("breadcrumb"); + let content = page.render_region("content"); + let sidebar_first = page.render_region("sidebar_first"); + let sidebar_second = page.render_region("sidebar_second"); + let footer = page.render_region("footer"); + html! { + body class=[page.body_classes().get()] { + @if header.is_some() { + #header { (header.unwrap()) } + } + @if nav_branding.is_some() { + #nav_branding { (nav_branding.unwrap()) } + } + @if nav_main.is_some() { + #nav_main { (nav_main.unwrap()) } + } + @if nav_additional.is_some() { + #nav_additional { (nav_additional.unwrap()) } + } + @if breadcrumb.is_some() { + #breadcrumb { (breadcrumb.unwrap()) } + } + @if content.is_some() { + #content { (content.unwrap()) } + } + @if sidebar_first.is_some() { + #sidebar_first { (sidebar_first.unwrap()) } + } + @if sidebar_second.is_some() { + #sidebar_second { (sidebar_second.unwrap()) } + } + @if footer.is_some() { + #footer { (footer.unwrap()) } + } + } + } + } + } + } + fn render_component( &self, component: &dyn ComponentTrait, diff --git a/pagetop-bootsier/static/locales/en-US/regions.ftl b/pagetop-bootsier/static/locales/en-US/regions.ftl index 029aa3c1..f3b76e22 100644 --- a/pagetop-bootsier/static/locales/en-US/regions.ftl +++ b/pagetop-bootsier/static/locales/en-US/regions.ftl @@ -1,13 +1,9 @@ header = Header -primary_menu = Primary menu -secondary_menu = Secondary menu -hero = Hero (full width) -highlighted = Highlighted +nav_branding = Navigation branding region +nav_main = Main navigation region +nav_additional = Additional navigation region (eg search form, social icons, etc) breadcrumb = Breadcrumb -social = Social Bar -content_above = Content Above -content = Content -sidebar = Sidebar -content_below = Content Below -footer_top = Footer Top -footer_bottom = Footer Bottom +content = Main content +sidebar_first = Sidebar first +sidebar_second = Sidebar second +footer = Footer diff --git a/pagetop-bootsier/static/locales/es-ES/regions.ftl b/pagetop-bootsier/static/locales/es-ES/regions.ftl index 9b50d168..674fc4b1 100644 --- a/pagetop-bootsier/static/locales/es-ES/regions.ftl +++ b/pagetop-bootsier/static/locales/es-ES/regions.ftl @@ -1,13 +1,9 @@ header = Cabecera -primary_menu = Menú principal -secondary_menu = Menú secundario -hero = Hero (ancho completo) -highlighted = Destacado -breadcrumb = Ruta de navegación -social = Enlaces sociales -content_above = Antes del contenido -content = Contenido -sidebar = Barra lateral -content_below = Después del contenido -footer_top = Pie de página (superior) -footer_bottom = Pie de página (inferior) +nav_branding = Navegación y marca +nav_main = Navegación principal +nav_additional = Navegación adicional (p.e. formulario de búsqueda, iconos sociales, etc.) +breadcrumb = Ruta de posicionamiento +content = Contenido principal +sidebar_first = Barra lateral primera +sidebar_second = Barra lateral segunda +footer = Pie diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 385e4f37..ebb40e99 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -39,11 +39,11 @@ async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { "/homedemo/css/styles.css", ))) .with_body_classes(ClassesOp::AddFirst, "default-homepage") - .with_this_in("region-content", hello_world()) - .with_this_in("region-content", welcome()) - .with_this_in("region-content", about_pagetop()) - .with_this_in("region-content", promo_pagetop()) - .with_this_in("region-content", reporting_issues()) + .with_this_in("content", hello_world()) + .with_this_in("content", welcome()) + .with_this_in("content", about_pagetop()) + .with_this_in("content", promo_pagetop()) + .with_this_in("content", reporting_issues()) .render() } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index a4a1ed99..31d75650 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -44,7 +44,7 @@ async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) .with_title(L10n::text("Identificación del usuario")) .with_this_in( - "region-content", + "content", Container::new() .with_id("welcome") .with_component(form_login()), diff --git a/pagetop/src/core/module/theme.rs b/pagetop/src/core/module/theme.rs index 343a602a..02b1e94f 100644 --- a/pagetop/src/core/module/theme.rs +++ b/pagetop/src/core/module/theme.rs @@ -1,7 +1,8 @@ use super::ModuleTrait; +use crate::app::LOCALE_PAGETOP; use crate::config; -use crate::core::component::{ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, L10n, RenderContext}; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; @@ -9,6 +10,17 @@ pub type ThemeStaticRef = &'static dyn ThemeTrait; /// Los temas deben implementar este "trait". pub trait ThemeTrait: ModuleTrait + Send + Sync { + #[rustfmt::skip] + fn regions(&self) -> Vec<(&'static str, L10n)> { + vec![ + ("header", L10n::t("header", &LOCALE_PAGETOP)), + ("pagetop", L10n::t("pagetop", &LOCALE_PAGETOP)), + ("content", L10n::t("content", &LOCALE_PAGETOP)), + ("sidebar", L10n::t("sidebar", &LOCALE_PAGETOP)), + ("footer", L10n::t("footer", &LOCALE_PAGETOP)), + ] + } + #[allow(unused_variables)] fn before_render_page(&self, page: &mut Page) { if page.favicon().is_none() { @@ -56,20 +68,9 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn render_page_body(&self, page: &mut Page) -> Markup { html! { body class=[page.body_classes().get()] { - @match page.template() { - "admin" => { - @for region in &["top-menu", "side-menu", "region-content"] { - @if let Some(content) = page.render_region(region) { - #(region) { (content) } - } - } - }, - _ => { - @for region in &["region-content"] { - @if let Some(content) = page.render_region(region) { - #(region) { (content) } - } - } + @for (region, _) in self.regions().iter() { + @if let Some(content) = page.render_region(region) { + #(region) { (content) } } } } diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index cc3c9884..99edb1b2 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -33,7 +33,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::text("Error FORBIDDEN")) - .with_this_in("region-content", error403::Error403) + .with_this_in("content", error403::Error403) .with_template("error") .render() { @@ -47,7 +47,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::text("Error RESOURCE NOT FOUND")) - .with_this_in("region-content", error404::Error404) + .with_this_in("content", error404::Error404) .with_template("error") .render() { diff --git a/pagetop/static/locales/en-US/theme.ftl b/pagetop/static/locales/en-US/theme.ftl index f87bfe36..a43e60ac 100644 --- a/pagetop/static/locales/en-US/theme.ftl +++ b/pagetop/static/locales/en-US/theme.ftl @@ -2,5 +2,4 @@ header = Header pagetop = Page Top content = Content sidebar = Sidebar -pagebottom = Page Bottom footer = Footer diff --git a/pagetop/static/locales/es-ES/theme.ftl b/pagetop/static/locales/es-ES/theme.ftl index 65cc7218..75fe1bb3 100644 --- a/pagetop/static/locales/es-ES/theme.ftl +++ b/pagetop/static/locales/es-ES/theme.ftl @@ -2,5 +2,4 @@ header = Cabecera pagetop = Superior content = Contenido sidebar = Barra lateral -pagebottom = Inferior -footer = Pie de página +footer = Pie From 163302f4ea39caa746bb0862b756113738388a5e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 6 Jun 2023 20:51:07 +0200 Subject: [PATCH 343/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Define=20acciones?= =?UTF-8?q?=20de=20forma=20coherente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-megamenu/src/component.rs | 2 +- pagetop-minimal/src/component/block.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- .../src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop-node/src/lib.rs | 4 +- pagetop/src/core.rs | 10 ++-- pagetop/src/core/action.rs | 10 ++++ pagetop/src/core/action/all.rs | 28 ++++++++++ pagetop/src/core/action/bundle.rs | 40 +++++++++++++++ pagetop/src/core/action/definition.rs | 25 +++++++++ pagetop/src/core/component/definition.rs | 8 +-- pagetop/src/core/hook.rs | 10 ---- pagetop/src/core/hook/all.rs | 28 ---------- pagetop/src/core/hook/definition.rs | 25 --------- pagetop/src/core/hook/holder.rs | 40 --------------- pagetop/src/core/module/all.rs | 5 +- pagetop/src/core/module/definition.rs | 7 ++- pagetop/src/lib.rs | 4 +- pagetop/src/prelude.rs | 6 +-- pagetop/src/response/page.rs | 4 +- pagetop/src/response/page/action.rs | 51 +++++++++++++++++++ pagetop/src/response/page/definition.rs | 10 ++-- pagetop/src/response/page/hook.rs | 51 ------------------- 26 files changed, 190 insertions(+), 192 deletions(-) create mode 100644 pagetop/src/core/action.rs create mode 100644 pagetop/src/core/action/all.rs create mode 100644 pagetop/src/core/action/bundle.rs create mode 100644 pagetop/src/core/action/definition.rs delete mode 100644 pagetop/src/core/hook.rs delete mode 100644 pagetop/src/core/hook/all.rs delete mode 100644 pagetop/src/core/hook/definition.rs delete mode 100644 pagetop/src/core/hook/holder.rs create mode 100644 pagetop/src/response/page/action.rs delete mode 100644 pagetop/src/response/page/hook.rs diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 56e134c1..cae6cfee 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -29,8 +29,8 @@ impl ModuleTrait for Admin { ] } - fn actions(&self) -> Vec<HookAction> { - vec![hook_action!(BeforeRenderPageHook => before_render_page)] + fn actions(&self) -> Vec<Action> { + vec![action!(ActionBeforeRenderPage => before_render_page)] } fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 0ff5ca7c..97d3a267 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -153,7 +153,7 @@ impl MegaMenuItem { define_handle!(COMPONENT_MEGAMENU); -hook_before_render_component!(HOOK_BEFORE_RENDER_MENU, MegaMenu); +action_before_render_component!(ACTION_BEFORE_RENDER_MENU, MegaMenu); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 18c92da3..19368193 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_BLOCK); -hook_before_render_component!(HOOK_BEFORE_RENDER_BLOCK, Block); +action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK, Block); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 20ffbe7d..c3f14247 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_CONTAINER); -hook_before_render_component!(HOOK_BEFORE_RENDER_CONTAINER, Container); +action_before_render_component!(ACTION_BEFORE_RENDER_CONTAINER, Container); #[derive(Default)] pub enum ContainerType { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 713f5a50..6eaa7a91 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_FORM); -hook_before_render_component!(HOOK_BEFORE_RENDER_FORM, Form); +action_before_render_component!(ACTION_BEFORE_RENDER_FORM, Form); #[derive(Default)] pub enum FormMethod { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index d3f35820..f3f4d895 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_COLUMN); -hook_before_render_component!(HOOK_BEFORE_RENDER_COLUMN, Column); +action_before_render_component!(ACTION_BEFORE_RENDER_COLUMN, Column); const SIZE__DEFAULT: &str = "col-md"; const SIZE__1_OF_12: &str = "col-md-1"; diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 4707fb83..a4f78bd4 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -4,7 +4,7 @@ use crate::component::grid; define_handle!(COMPONENT_ROW); -hook_before_render_component!(HOOK_BEFORE_RENDER_ROW, Row); +action_before_render_component!(ACTION_BEFORE_RENDER_ROW, Row); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 02ebd447..3f92cd71 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -26,8 +26,8 @@ impl ModuleTrait for Node { cfg.route("/node", server::web::get().to(node)); } - fn actions(&self) -> Vec<HookAction> { - vec![hook_action!(BeforeRenderPageHook => before_render_page, -1)] + fn actions(&self) -> Vec<Action> { + vec![action!(ActionBeforeRenderPage => before_render_page, -1)] } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index ebf07e9a..007bc9be 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -1,13 +1,13 @@ -//! Tipos y funciones esenciales para crear módulos, temas, componentes y acciones. +//! Tipos y funciones esenciales para crear acciones, componentes, módulos y temas. -// API to add new features with modules and themes. -pub mod module; +// API to define functions that alter the behavior of PageTop core. +pub mod action; // API to build new components. pub mod component; -// API to define functions that alter the behavior of PageTop core. -pub mod hook; +// API to add new features with modules and themes. +pub mod module; // Basic theme. pub(crate) mod basic; diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs new file mode 100644 index 00000000..f526b79f --- /dev/null +++ b/pagetop/src/core/action.rs @@ -0,0 +1,10 @@ +mod definition; +pub use definition::{action_ref, ActionTrait, AnyAction, ACTION_UNNAMED}; + +mod bundle; +pub use bundle::Action; +use bundle::ActionsBundle; + +mod all; +pub(crate) use all::add_action; +pub use all::run_actions; diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs new file mode 100644 index 00000000..4879dd15 --- /dev/null +++ b/pagetop/src/core/action/all.rs @@ -0,0 +1,28 @@ +use crate::core::action::{Action, ActionsBundle}; +use crate::{Handle, LazyStatic}; + +use std::collections::HashMap; +use std::sync::RwLock; + +// Registered actions. +static ACTIONS: LazyStatic<RwLock<HashMap<Handle, ActionsBundle>>> = + LazyStatic::new(|| RwLock::new(HashMap::new())); + +pub fn add_action(action: Action) { + let mut actions = ACTIONS.write().unwrap(); + let action_handle = action.handle(); + if let Some(bundle) = actions.get_mut(&action_handle) { + bundle.add(action); + } else { + actions.insert(action_handle, ActionsBundle::new_with(action)); + } +} + +pub fn run_actions<B, F>(action_handle: Handle, f: F) +where + F: FnMut(&Action) -> B, +{ + if let Some(bundle) = ACTIONS.read().unwrap().get(&action_handle) { + bundle.iter_map(f) + } +} diff --git a/pagetop/src/core/action/bundle.rs b/pagetop/src/core/action/bundle.rs new file mode 100644 index 00000000..2d4ea49d --- /dev/null +++ b/pagetop/src/core/action/bundle.rs @@ -0,0 +1,40 @@ +use crate::core::action::ActionTrait; + +use std::sync::{Arc, RwLock}; + +pub type Action = Box<dyn ActionTrait>; + +#[macro_export] +macro_rules! action { + ( $action:ident => $f:ident $(, $weight:expr)? ) => {{ + Box::new($action::new().with_action($f)$(.with_weight($weight))?) + }}; +} + +pub struct ActionsBundle(Arc<RwLock<Vec<Action>>>); + +impl ActionsBundle { + pub fn new() -> Self { + ActionsBundle(Arc::new(RwLock::new(Vec::new()))) + } + + pub fn new_with(action: Action) -> Self { + let mut bundle = ActionsBundle::new(); + bundle.add(action); + bundle + } + + pub fn add(&mut self, action: Action) { + let mut bundle = self.0.write().unwrap(); + bundle.push(action); + bundle.sort_by_key(|a| a.weight()); + } + + pub fn iter_map<B, F>(&self, f: F) + where + Self: Sized, + F: FnMut(&Action) -> B, + { + let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); + } +} diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs new file mode 100644 index 00000000..e9a13ed3 --- /dev/null +++ b/pagetop/src/core/action/definition.rs @@ -0,0 +1,25 @@ +use crate::{define_handle, Handle}; + +pub use std::any::Any as AnyAction; + +define_handle!(ACTION_UNNAMED); + +pub trait ActionTrait: AnyAction + Send + Sync { + fn new() -> Self + where + Self: Sized; + + fn handle(&self) -> Handle { + ACTION_UNNAMED + } + + fn weight(&self) -> isize { + 0 + } + + fn as_ref_any(&self) -> &dyn AnyAction; +} + +pub fn action_ref<A: 'static>(action: &dyn ActionTrait) -> &A { + action.as_ref_any().downcast_ref::<A>().unwrap() +} diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index bc03b30d..868bb7f2 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -77,7 +77,7 @@ pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { } #[macro_export] -macro_rules! hook_before_render_component { +macro_rules! action_before_render_component { ( $ACTION_HANDLE:ident, $Component:ty ) => { $crate::paste! { $crate::define_handle!($ACTION_HANDLE); @@ -89,7 +89,7 @@ macro_rules! hook_before_render_component { weight: isize, } - impl HookActionTrait for [< BeforeRender $Component >] { + impl ActionTrait for [< BeforeRender $Component >] { fn new() -> Self { [< BeforeRender $Component >] { action: None, @@ -105,14 +105,14 @@ macro_rules! hook_before_render_component { self.weight } - fn as_ref_any(&self) -> &dyn AnyHookAction { + fn as_ref_any(&self) -> &dyn AnyAction { self } } impl [< BeforeRender $Component >] { #[allow(dead_code)] - pub fn with_hook(mut self, action: Action) -> Self { + pub fn with_action(mut self, action: Action) -> Self { self.action = Some(action); self } diff --git a/pagetop/src/core/hook.rs b/pagetop/src/core/hook.rs deleted file mode 100644 index 9fbf7045..00000000 --- a/pagetop/src/core/hook.rs +++ /dev/null @@ -1,10 +0,0 @@ -mod definition; -pub use definition::{action_ref, AnyHookAction, HookActionTrait, HOOK_UNNAMED}; - -mod holder; -use holder::ActionsHolder; -pub use holder::HookAction; - -mod all; -pub(crate) use all::add_action; -pub use all::run_actions; diff --git a/pagetop/src/core/hook/all.rs b/pagetop/src/core/hook/all.rs deleted file mode 100644 index 6963f88a..00000000 --- a/pagetop/src/core/hook/all.rs +++ /dev/null @@ -1,28 +0,0 @@ -use super::{ActionsHolder, HookAction}; -use crate::{Handle, LazyStatic}; - -use std::collections::HashMap; -use std::sync::RwLock; - -// Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<Handle, ActionsHolder>>> = - LazyStatic::new(|| RwLock::new(HashMap::new())); - -pub fn add_action(action: HookAction) { - let mut actions = ACTIONS.write().unwrap(); - let action_handle = action.handle(); - if let Some(holder) = actions.get_mut(&action_handle) { - holder.add(action); - } else { - actions.insert(action_handle, ActionsHolder::new_with(action)); - } -} - -pub fn run_actions<B, F>(action_handle: Handle, f: F) -where - F: FnMut(&HookAction) -> B, -{ - if let Some(holder) = ACTIONS.read().unwrap().get(&action_handle) { - holder.iter_map(f) - } -} diff --git a/pagetop/src/core/hook/definition.rs b/pagetop/src/core/hook/definition.rs deleted file mode 100644 index 49b82d52..00000000 --- a/pagetop/src/core/hook/definition.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::{define_handle, Handle}; - -pub use std::any::Any as AnyHookAction; - -define_handle!(HOOK_UNNAMED); - -pub trait HookActionTrait: AnyHookAction + Send + Sync { - fn new() -> Self - where - Self: Sized; - - fn handle(&self) -> Handle { - HOOK_UNNAMED - } - - fn weight(&self) -> isize { - 0 - } - - fn as_ref_any(&self) -> &dyn AnyHookAction; -} - -pub fn action_ref<A: 'static>(action: &dyn HookActionTrait) -> &A { - action.as_ref_any().downcast_ref::<A>().unwrap() -} diff --git a/pagetop/src/core/hook/holder.rs b/pagetop/src/core/hook/holder.rs deleted file mode 100644 index 31f69711..00000000 --- a/pagetop/src/core/hook/holder.rs +++ /dev/null @@ -1,40 +0,0 @@ -use super::HookActionTrait; - -use std::sync::{Arc, RwLock}; - -pub type HookAction = Box<dyn HookActionTrait>; - -#[macro_export] -macro_rules! hook_action { - ( $hook:ident => $f:ident $(, $weight:expr)? ) => {{ - Box::new($hook::new().with_hook($f)$(.with_weight($weight))?) - }}; -} - -pub struct ActionsHolder(Arc<RwLock<Vec<HookAction>>>); - -impl ActionsHolder { - pub fn new() -> Self { - ActionsHolder(Arc::new(RwLock::new(Vec::new()))) - } - - pub fn new_with(action: HookAction) -> Self { - let mut holder = ActionsHolder::new(); - holder.add(action); - holder - } - - pub fn add(&mut self, action: HookAction) { - let mut holder = self.0.write().unwrap(); - holder.push(action); - holder.sort_by_key(|a| a.weight()); - } - - pub fn iter_map<B, F>(&self, f: F) - where - Self: Sized, - F: FnMut(&HookAction) -> B, - { - let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); - } -} diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 8468741e..01847819 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,6 +1,5 @@ -use super::{ModuleStaticRef, ThemeStaticRef}; - -use crate::core::hook::add_action; +use crate::core::action::add_action; +use crate::core::module::{ModuleStaticRef, ThemeStaticRef}; use crate::{server, trace, LazyStatic}; #[cfg(feature = "database")] diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 9f1837f0..6277df2e 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,7 +1,6 @@ -use super::ThemeStaticRef; - +use crate::core::action::Action; use crate::core::component::L10n; -use crate::core::hook::HookAction; +use crate::core::module::ThemeStaticRef; use crate::util::single_type_name; use crate::{define_handle, server, Handle}; @@ -42,7 +41,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { vec![] } - fn actions(&self) -> Vec<HookAction> { + fn actions(&self) -> Vec<Action> { vec![] } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 0adcce75..754cc37a 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -24,7 +24,7 @@ //! //! * Acceso unificado y normalizado a base de datos ([`db`]). //! -//! * Tipos y funciones esenciales para crear módulos, temas, componentes y acciones ([`core`]). +//! * Tipos y funciones esenciales para crear acciones, componentes, módulos y temas ([`core`]). //! //! * Tipos de respuestas a peticiones web ([`response`]) //! @@ -72,7 +72,7 @@ pub mod html; #[cfg(feature = "database")] pub mod db; -// APIs esenciales para crear módulos, temas, componentes y acciones. +// APIs esenciales para crear acciones, componentes, módulos y temas. pub mod core; // API del servidor web. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 2097aeec..24879ecc 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -4,7 +4,7 @@ // Re-exports. pub use crate::{concat_string, fn_builder, Handle, HashMapResources, LazyStatic, ResultExt}; -// Macros declarativas. +// Macros declarativas globales. pub use crate::{args, define_config, define_handle, define_locale, paste, serve_static_files}; // Funciones útiles. @@ -23,9 +23,9 @@ pub use crate::html::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; -pub use crate::core::{component::*, hook::*, module::*}; +pub use crate::core::{action::*, component::*, module::*}; -pub use crate::{hook_action, hook_before_render_component}; +pub use crate::{action, action_before_render_component}; pub use crate::server; pub use crate::server::HttpMessage; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 3f82c157..724b2da4 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,7 +1,7 @@ pub use actix_web::Result as ResultPage; -mod hook; -pub use hook::{BeforeRenderPageHook, HOOK_BEFORE_RENDER_PAGE}; +mod action; +pub use action::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; mod definition; pub use definition::Page; diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs new file mode 100644 index 00000000..eca5f51c --- /dev/null +++ b/pagetop/src/response/page/action.rs @@ -0,0 +1,51 @@ +use crate::core::action::{ActionTrait, AnyAction}; +use crate::response::page::Page; +use crate::{define_handle, Handle}; + +define_handle!(ACTION_BEFORE_RENDER_PAGE); + +type Action = fn(&mut Page); + +pub struct ActionBeforeRenderPage { + action: Option<Action>, + weight: isize, +} + +impl ActionTrait for ActionBeforeRenderPage { + fn new() -> Self { + ActionBeforeRenderPage { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + ACTION_BEFORE_RENDER_PAGE + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } +} + +impl ActionBeforeRenderPage { + pub fn with_action(mut self, action: Action) -> Self { + self.action = Some(action); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, page: &mut Page) { + if let Some(action) = self.action { + action(page) + } + } +} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index e13b9f47..889f4280 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,10 +1,10 @@ -use super::{BeforeRenderPageHook, ResultPage, HOOK_BEFORE_RENDER_PAGE}; - +use crate::core::action::{action_ref, run_actions}; use crate::core::component::*; -use crate::core::hook::{action_ref, run_actions}; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; +use crate::response::page::action::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; +use crate::response::page::ResultPage; use crate::{fn_builder, server}; use unic_langid::CharacterDirection; @@ -164,8 +164,8 @@ impl Page { pub fn render(&mut self) -> ResultPage<Markup, FatalError> { // Acciones de los módulos antes de renderizar la página. - run_actions(HOOK_BEFORE_RENDER_PAGE, |hook| { - action_ref::<BeforeRenderPageHook>(&**hook).run(self) + run_actions(ACTION_BEFORE_RENDER_PAGE, |action| { + action_ref::<ActionBeforeRenderPage>(&**action).run(self) }); // Acciones del tema antes de renderizar la página. diff --git a/pagetop/src/response/page/hook.rs b/pagetop/src/response/page/hook.rs deleted file mode 100644 index da105f2e..00000000 --- a/pagetop/src/response/page/hook.rs +++ /dev/null @@ -1,51 +0,0 @@ -use super::Page; -use crate::core::hook::{AnyHookAction, HookActionTrait}; -use crate::{define_handle, Handle}; - -define_handle!(HOOK_BEFORE_RENDER_PAGE); - -type Hook = fn(&mut Page); - -pub struct BeforeRenderPageHook { - hook: Option<Hook>, - weight: isize, -} - -impl HookActionTrait for BeforeRenderPageHook { - fn new() -> Self { - BeforeRenderPageHook { - hook: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - HOOK_BEFORE_RENDER_PAGE - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyHookAction { - self - } -} - -impl BeforeRenderPageHook { - pub fn with_hook(mut self, hook: Hook) -> Self { - self.hook = Some(hook); - self - } - - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, page: &mut Page) { - if let Some(hook) = self.hook { - hook(page) - } - } -} From 772546c1647a15aeed67e70c566c08aff63e1a56 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 6 Jun 2023 21:03:41 +0200 Subject: [PATCH 344/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Diferencia=20m?= =?UTF-8?q?=C3=B3dulos=20y=20temas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core.rs | 5 +++- pagetop/src/core/basic.rs | 3 ++- pagetop/src/core/component/context.rs | 2 +- pagetop/src/core/module.rs | 3 --- pagetop/src/core/module/all.rs | 21 ++-------------- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme.rs | 4 ++++ pagetop/src/core/theme/all.rs | 24 +++++++++++++++++++ .../{module/theme.rs => theme/definition.rs} | 3 +-- pagetop/src/prelude.rs | 2 +- 10 files changed, 40 insertions(+), 29 deletions(-) create mode 100644 pagetop/src/core/theme.rs create mode 100644 pagetop/src/core/theme/all.rs rename pagetop/src/core/{module/theme.rs => theme/definition.rs} (98%) diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index 007bc9be..fa45c442 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -6,8 +6,11 @@ pub mod action; // API to build new components. pub mod component; -// API to add new features with modules and themes. +// API to add new features with modules. pub mod module; +// API to add new layouts with themes. +pub mod theme; + // Basic theme. pub(crate) mod basic; diff --git a/pagetop/src/core/basic.rs b/pagetop/src/core/basic.rs index d88e174a..e2ce7b3a 100644 --- a/pagetop/src/core/basic.rs +++ b/pagetop/src/core/basic.rs @@ -1,4 +1,5 @@ -use crate::core::module::{ModuleTrait, ThemeStaticRef, ThemeTrait}; +use crate::core::module::ModuleTrait; +use crate::core::theme::{ThemeStaticRef, ThemeTrait}; use crate::html::Favicon; use crate::response::page::Page; use crate::{define_handle, serve_static_files, server, Handle}; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index b6311bec..4eec5377 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,4 +1,4 @@ -use crate::core::module::{all::theme_by_single_name, ThemeStaticRef}; +use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; use crate::locale::{LanguageIdentifier, LANGID}; use crate::server::HttpRequest; diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index 6266ddd8..31e857e6 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,7 +1,4 @@ mod definition; pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait, MODULE_UNNAMED}; -mod theme; -pub use theme::{ThemeStaticRef, ThemeTrait}; - pub(crate) mod all; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 01847819..ee4dd019 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,5 +1,6 @@ use crate::core::action::add_action; -use crate::core::module::{ModuleStaticRef, ThemeStaticRef}; +use crate::core::module::ModuleStaticRef; +use crate::core::theme::all::THEMES; use crate::{server, trace, LazyStatic}; #[cfg(feature = "database")] @@ -15,24 +16,6 @@ static ENABLED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = static DROPPED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); -// THEMES ****************************************************************************************** - -static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = - LazyStatic::new(|| RwLock::new(Vec::new())); - -pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { - let single_name = single_name.to_lowercase(); - match THEMES - .read() - .unwrap() - .iter() - .find(|t| t.single_name().to_lowercase() == single_name) - { - Some(theme) => Some(*theme), - _ => None, - } -} - // REGISTER MODULES ******************************************************************************** pub fn register_modules(app: ModuleStaticRef) { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 6277df2e..c071cf1b 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,6 +1,6 @@ use crate::core::action::Action; use crate::core::component::L10n; -use crate::core::module::ThemeStaticRef; +use crate::core::theme::ThemeStaticRef; use crate::util::single_type_name; use crate::{define_handle, server, Handle}; diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs new file mode 100644 index 00000000..67902dcb --- /dev/null +++ b/pagetop/src/core/theme.rs @@ -0,0 +1,4 @@ +mod definition; +pub use definition::{ThemeStaticRef, ThemeTrait}; + +pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs new file mode 100644 index 00000000..ade7ef3e --- /dev/null +++ b/pagetop/src/core/theme/all.rs @@ -0,0 +1,24 @@ +use crate::core::theme::ThemeStaticRef; +use crate::LazyStatic; + +use std::sync::RwLock; + +// THEMES ****************************************************************************************** + +pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = + LazyStatic::new(|| RwLock::new(Vec::new())); + +// THEME BY NAME *********************************************************************************** + +pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { + let single_name = single_name.to_lowercase(); + match THEMES + .read() + .unwrap() + .iter() + .find(|t| t.single_name().to_lowercase() == single_name) + { + Some(theme) => Some(*theme), + _ => None, + } +} diff --git a/pagetop/src/core/module/theme.rs b/pagetop/src/core/theme/definition.rs similarity index 98% rename from pagetop/src/core/module/theme.rs rename to pagetop/src/core/theme/definition.rs index 02b1e94f..29cc8136 100644 --- a/pagetop/src/core/module/theme.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,8 +1,7 @@ -use super::ModuleTrait; - use crate::app::LOCALE_PAGETOP; use crate::config; use crate::core::component::{ComponentTrait, L10n, RenderContext}; +use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 24879ecc..10a43058 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -23,7 +23,7 @@ pub use crate::html::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; -pub use crate::core::{action::*, component::*, module::*}; +pub use crate::core::{action::*, component::*, module::*, theme::*}; pub use crate::{action, action_before_render_component}; From cb735cf0fa44d6864cb1a0d1605ad7287dd81538 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 6 Jun 2023 21:19:48 +0200 Subject: [PATCH 345/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Define=20carpeta?= =?UTF-8?q?=20base=20para=20elementos=20integrados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base.rs | 3 +++ pagetop/src/base/component.rs | 2 ++ pagetop/src/{core => base}/component/l10n.rs | 7 +------ pagetop/src/base/theme.rs | 2 ++ pagetop/src/{core => base/theme}/basic.rs | 0 pagetop/src/core.rs | 3 --- pagetop/src/core/component.rs | 3 --- pagetop/src/core/component/context.rs | 2 +- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme/definition.rs | 3 ++- pagetop/src/lib.rs | 3 +++ pagetop/src/locale.rs | 1 + pagetop/src/prelude.rs | 2 ++ pagetop/src/response/fatal_error.rs | 2 +- pagetop/src/response/page/definition.rs | 5 ++++- 16 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 pagetop/src/base.rs create mode 100644 pagetop/src/base/component.rs rename pagetop/src/{core => base}/component/l10n.rs (93%) create mode 100644 pagetop/src/base/theme.rs rename pagetop/src/{core => base/theme}/basic.rs (100%) diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs new file mode 100644 index 00000000..29705be6 --- /dev/null +++ b/pagetop/src/base.rs @@ -0,0 +1,3 @@ +pub mod component; + +pub mod theme; diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs new file mode 100644 index 00000000..5f7db6de --- /dev/null +++ b/pagetop/src/base/component.rs @@ -0,0 +1,2 @@ +mod l10n; +pub use l10n::{L10n, COMPONENT_L10N}; diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/base/component/l10n.rs similarity index 93% rename from pagetop/src/core/component/l10n.rs rename to pagetop/src/base/component/l10n.rs index 1f6f8fc3..fb178681 100644 --- a/pagetop/src/core/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -1,9 +1,4 @@ -use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; -use crate::html::{html, Markup, PreEscaped}; -use crate::locale::Locales; -use crate::{define_handle, fn_builder, Handle}; - -use fluent_templates::Loader; +use crate::prelude::*; use std::collections::HashMap; diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs new file mode 100644 index 00000000..c135c08d --- /dev/null +++ b/pagetop/src/base/theme.rs @@ -0,0 +1,2 @@ +mod basic; +pub(crate) use basic::Basic; diff --git a/pagetop/src/core/basic.rs b/pagetop/src/base/theme/basic.rs similarity index 100% rename from pagetop/src/core/basic.rs rename to pagetop/src/base/theme/basic.rs diff --git a/pagetop/src/core.rs b/pagetop/src/core.rs index fa45c442..aa9819b9 100644 --- a/pagetop/src/core.rs +++ b/pagetop/src/core.rs @@ -11,6 +11,3 @@ pub mod module; // API to add new layouts with themes. pub mod theme; - -// Basic theme. -pub(crate) mod basic; diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index b75cbc9a..2095ec04 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -18,6 +18,3 @@ pub(crate) use all::common_components; mod renderable; pub use renderable::{IsRenderable, Renderable}; - -mod l10n; -pub use l10n::{L10n, COMPONENT_L10N}; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 4eec5377..295e33ac 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -10,7 +10,7 @@ use std::str::FromStr; static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::core::basic::Basic, + None => &crate::base::theme::Basic, }); pub enum ContextOp { diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index ee4dd019..7eba9801 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleStaticRef) { let mut list: Vec<ModuleStaticRef> = Vec::new(); // Enable basic theme. - add_to_enabled(&mut list, &crate::core::basic::Basic); + add_to_enabled(&mut list, &crate::base::theme::Basic); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index c071cf1b..6fbd7ae9 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,5 @@ +use crate::base::component::L10n; use crate::core::action::Action; -use crate::core::component::L10n; use crate::core::theme::ThemeStaticRef; use crate::util::single_type_name; use crate::{define_handle, server, Handle}; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 29cc8136..548174a8 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,6 +1,7 @@ use crate::app::LOCALE_PAGETOP; +use crate::base::component::L10n; use crate::config; -use crate::core::component::{ComponentTrait, L10n, RenderContext}; +use crate::core::component::{ComponentTrait, RenderContext}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 754cc37a..1816a29c 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -75,6 +75,9 @@ pub mod db; // APIs esenciales para crear acciones, componentes, módulos y temas. pub mod core; +// Acciones, componentes, módulos y temas integrados en PageTop. +pub mod base; + // API del servidor web. pub mod server; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 4fe64bde..09d9e06c 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -85,6 +85,7 @@ use crate::{args, config, trace, LazyStatic}; pub use fluent_templates; +pub(crate) use fluent_templates::Loader; pub(crate) use fluent_templates::StaticLoader as Locales; pub(crate) use unic_langid::{langid, LanguageIdentifier}; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 10a43058..28b7173c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -27,6 +27,8 @@ pub use crate::core::{action::*, component::*, module::*, theme::*}; pub use crate::{action, action_before_render_component}; +pub use crate::base::component::*; + pub use crate::server; pub use crate::server::HttpMessage; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 99edb1b2..4b82bd27 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::core::component::L10n; +use crate::base::component::L10n; use crate::response::{page::Page, ResponseError}; use crate::server::http::{header::ContentType, StatusCode}; use crate::server::{HttpRequest, HttpResponse}; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 889f4280..ffb6a9a6 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,5 +1,8 @@ +use crate::base::component::L10n; use crate::core::action::{action_ref, run_actions}; -use crate::core::component::*; +use crate::core::component::{ + common_components, ComponentTrait, ComponentsBundle, ContextOp, OneComponent, RenderContext, +}; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; From 35c221f1f8453ffe5a77d68e69c0e9dfb25e5fd7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 6 Jun 2023 22:53:43 +0200 Subject: [PATCH 346/853] =?UTF-8?q?=E2=9C=A8=20Ahora=20Block=20es=20un=20c?= =?UTF-8?q?omponente=20base=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 14 +++++++------- pagetop-minimal/src/component.rs | 2 -- pagetop/src/base/component.rs | 3 +++ .../src => pagetop/src/base}/component/block.rs | 2 +- pagetop/src/core/component/all.rs | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) rename {pagetop-minimal/src => pagetop/src/base}/component/block.rs (99%) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 9a612e75..2fe5aca4 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -73,15 +73,15 @@ impl ThemeTrait for Bootsier { } }, _ => { - let header = page.render_region("header"); - let nav_branding = page.render_region("nav_branding"); - let nav_main = page.render_region("nav_main"); + let header = page.render_region("header"); + let nav_branding = page.render_region("nav_branding"); + let nav_main = page.render_region("nav_main"); let nav_additional = page.render_region("nav_additional"); - let breadcrumb = page.render_region("breadcrumb"); - let content = page.render_region("content"); - let sidebar_first = page.render_region("sidebar_first"); + let breadcrumb = page.render_region("breadcrumb"); + let content = page.render_region("content"); + let sidebar_first = page.render_region("sidebar_first"); let sidebar_second = page.render_region("sidebar_second"); - let footer = page.render_region("footer"); + let footer = page.render_region("footer"); html! { body class=[page.body_classes().get()] { @if header.is_some() { diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 04a89e8d..f104290f 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -11,8 +11,6 @@ mod paragraph; pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; mod anchor; pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; -mod block; -pub use block::{Block, COMPONENT_BLOCK}; mod image; pub use image::{Image, COMPONENT_IMAGE}; diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 5f7db6de..fcf9d348 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -1,2 +1,5 @@ mod l10n; pub use l10n::{L10n, COMPONENT_L10N}; + +mod block; +pub use block::{Block, COMPONENT_BLOCK}; diff --git a/pagetop-minimal/src/component/block.rs b/pagetop/src/base/component/block.rs similarity index 99% rename from pagetop-minimal/src/component/block.rs rename to pagetop/src/base/component/block.rs index 19368193..b51db15e 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,4 +1,4 @@ -use pagetop::prelude::*; +use crate::prelude::*; define_handle!(COMPONENT_BLOCK); diff --git a/pagetop/src/core/component/all.rs b/pagetop/src/core/component/all.rs index b307dc40..3ada09b9 100644 --- a/pagetop/src/core/component/all.rs +++ b/pagetop/src/core/component/all.rs @@ -1,4 +1,4 @@ -use super::{ComponentTrait, ComponentsBundle}; +use crate::core::component::{ComponentTrait, ComponentsBundle}; use crate::LazyStatic; use std::collections::HashMap; From 0d2a1b37c586ba8acf5352b7104682dac76f5df8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 7 Jun 2023 08:47:38 +0200 Subject: [PATCH 347/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Revisa=20el=20uso?= =?UTF-8?q?=20de=20"util"=20en=20el=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/definition.rs | 5 ++--- pagetop/src/core/module/definition.rs | 5 ++--- pagetop/src/prelude.rs | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 868bb7f2..666cc1a0 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,6 @@ use crate::core::component::RenderContext; use crate::html::{html, Markup}; -use crate::util::single_type_name; -use crate::{define_handle, Handle}; +use crate::{define_handle, util, Handle}; pub use std::any::Any as AnyComponent; @@ -21,7 +20,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } fn name(&self) -> String { - single_type_name::<Self>().to_owned() + util::single_type_name::<Self>().to_owned() } fn description(&self) -> Option<String> { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 6fbd7ae9..b6df322c 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,8 +1,7 @@ use crate::base::component::L10n; use crate::core::action::Action; use crate::core::theme::ThemeStaticRef; -use crate::util::single_type_name; -use crate::{define_handle, server, Handle}; +use crate::{define_handle, server, util, Handle}; #[cfg(feature = "database")] use crate::db::MigrationItem; @@ -59,6 +58,6 @@ pub trait ModuleTrait: BaseModule + Send + Sync { impl<M: ?Sized + ModuleTrait> BaseModule for M { fn single_name(&self) -> &'static str { - single_type_name::<Self>() + util::single_type_name::<Self>() } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 28b7173c..23d8ec30 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,10 +2,10 @@ //! **PageTop**. // Re-exports. -pub use crate::{concat_string, fn_builder, Handle, HashMapResources, LazyStatic, ResultExt}; +pub use crate::{concat_string, fn_builder, paste, Handle, HashMapResources, LazyStatic, ResultExt}; // Macros declarativas globales. -pub use crate::{args, define_config, define_handle, define_locale, paste, serve_static_files}; +pub use crate::{args, define_config, define_handle, define_locale, serve_static_files}; // Funciones útiles. pub use crate::util; From a2add5b09cea0b2fd8dca4e843022d1444f0e8de Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 7 Jun 2023 12:11:12 +0200 Subject: [PATCH 348/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Confirma=20mi=20ad?= =?UTF-8?q?icci=C3=B3n=20a=20refactorizar=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 4 +--- pagetop/src/core/theme/definition.rs | 3 +-- pagetop/src/lib.rs | 2 ++ pagetop/src/prelude.rs | 4 +++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index a3d4e67d..dbb39ddd 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,7 +6,7 @@ use crate::core::{module, module::ModuleStaticRef}; use crate::html::Markup; use crate::response::fatal_error::FatalError; use crate::response::page::ResultPage; -use crate::{config, define_locale, locale, server, trace, LazyStatic}; +use crate::{config, locale, server, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db; @@ -21,8 +21,6 @@ use std::io::Error; use substring::Substring; -define_locale!(LOCALE_PAGETOP, "static/locales"); - pub struct Application { server: Server, } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 548174a8..23b3f6c4 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,10 +1,9 @@ -use crate::app::LOCALE_PAGETOP; use crate::base::component::L10n; -use crate::config; use crate::core::component::{ComponentTrait, RenderContext}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; +use crate::{config, LOCALE_PAGETOP}; pub type ThemeStaticRef = &'static dyn ThemeTrait; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 1816a29c..9c1412c0 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -55,6 +55,8 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour pub type Handle = u64; +define_locale!(LOCALE_PAGETOP, "static/locales"); + // ************************************************************************************************* // APIs PÚBLICAS. // ************************************************************************************************* diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 23d8ec30..0bf665e5 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -2,7 +2,9 @@ //! **PageTop**. // Re-exports. -pub use crate::{concat_string, fn_builder, paste, Handle, HashMapResources, LazyStatic, ResultExt}; +pub use crate::{ + concat_string, fn_builder, paste, Handle, HashMapResources, LazyStatic, ResultExt, +}; // Macros declarativas globales. pub use crate::{args, define_config, define_handle, define_locale, serve_static_files}; From d8812433f17618d318160a1ad2a5581b97f102de Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 7 Jun 2023 22:52:20 +0200 Subject: [PATCH 349/853] =?UTF-8?q?=E2=9C=A8=20Asignaci=C3=B3n=20de=20comp?= =?UTF-8?q?onentes=20predefinidos=20por=20tema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component.rs | 4 --- pagetop/src/core/component/all.rs | 21 ----------- pagetop/src/core/component/bundle.rs | 14 ++++++++ pagetop/src/core/theme.rs | 4 +++ pagetop/src/core/theme/regions.rs | 46 +++++++++++++++++++++++++ pagetop/src/html/maud.rs | 6 ++++ pagetop/src/response/page/definition.rs | 29 +++++++--------- 7 files changed, 83 insertions(+), 41 deletions(-) delete mode 100644 pagetop/src/core/component/all.rs create mode 100644 pagetop/src/core/theme/regions.rs diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 2095ec04..cadd3340 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -12,9 +12,5 @@ pub use one::OneComponent; mod bundle; pub use bundle::ComponentsBundle; -mod all; -pub use all::add_component_to; -pub(crate) use all::common_components; - mod renderable; pub use renderable::{IsRenderable, Renderable}; diff --git a/pagetop/src/core/component/all.rs b/pagetop/src/core/component/all.rs deleted file mode 100644 index 3ada09b9..00000000 --- a/pagetop/src/core/component/all.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::core::component::{ComponentTrait, ComponentsBundle}; -use crate::LazyStatic; - -use std::collections::HashMap; -use std::sync::RwLock; - -static COMPONENTS: LazyStatic<RwLock<HashMap<&str, ComponentsBundle>>> = - LazyStatic::new(|| RwLock::new(HashMap::new())); - -pub fn add_component_to(region: &'static str, component: impl ComponentTrait) { - let mut hmap = COMPONENTS.write().unwrap(); - if let Some(regions) = hmap.get_mut(region) { - regions.add(component); - } else { - hmap.insert(region, ComponentsBundle::new_with(component)); - } -} - -pub fn common_components() -> HashMap<&'static str, ComponentsBundle> { - COMPONENTS.read().unwrap().clone() -} diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 8b8e3a72..63feee4c 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -17,6 +17,20 @@ impl ComponentsBundle { bundle } + pub(crate) fn merge(one: Option<&ComponentsBundle>, other: Option<&ComponentsBundle>) -> Self { + if let Some(one) = one { + let mut components = one.0.clone(); + if let Some(other) = other { + components.append(&mut other.0.clone()); + } + ComponentsBundle(components) + } else if let Some(other) = other { + ComponentsBundle(other.0.clone()) + } else { + ComponentsBundle::default() + } + } + pub fn add(&mut self, component: impl ComponentTrait) { self.0.push(Arc::new(RwLock::new(component))); } diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 67902dcb..696e2407 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -1,4 +1,8 @@ mod definition; pub use definition::{ThemeStaticRef, ThemeTrait}; +mod regions; +pub use regions::add_component_to; +pub(crate) use regions::ComponentsRegions; + pub(crate) mod all; diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs new file mode 100644 index 00000000..8c42d088 --- /dev/null +++ b/pagetop/src/core/theme/regions.rs @@ -0,0 +1,46 @@ +use crate::core::component::{ComponentTrait, ComponentsBundle}; +use crate::LazyStatic; + +use std::collections::HashMap; +use std::sync::RwLock; + +static THEME_REGIONS: LazyStatic<RwLock<HashMap<&'static str, ComponentsRegions>>> = + LazyStatic::new(|| RwLock::new(HashMap::new())); + +#[derive(Default)] +pub struct ComponentsRegions(HashMap<&'static str, ComponentsBundle>); + +impl ComponentsRegions { + pub fn new() -> Self { + ComponentsRegions::default() + } + + pub fn add_to(&mut self, region: &'static str, component: impl ComponentTrait) { + if let Some(region) = self.0.get_mut(region) { + region.add(component); + } else { + self.0.insert(region, ComponentsBundle::new_with(component)); + } + } + + pub fn get_extended_bundle(&self, theme: &str, region: &str) -> ComponentsBundle { + if let Some(hm_theme) = THEME_REGIONS.read().unwrap().get(theme) { + ComponentsBundle::merge(self.0.get(region), hm_theme.0.get(region)) + } else { + ComponentsBundle::merge(self.0.get(region), None) + } + } +} + +pub fn add_component_to(theme: &'static str, region: &'static str, component: impl ComponentTrait) { + let mut hm = THEME_REGIONS.write().unwrap(); + if let Some(hm_theme) = hm.get_mut(theme) { + hm_theme.add_to(region, component); + } else { + hm.insert(theme, { + let mut regions = ComponentsRegions::new(); + regions.add_to(region, component); + regions + }); + } +} diff --git a/pagetop/src/html/maud.rs b/pagetop/src/html/maud.rs index 8d2cd12e..801895e5 100644 --- a/pagetop/src/html/maud.rs +++ b/pagetop/src/html/maud.rs @@ -228,6 +228,12 @@ impl<T: AsRef<str>> Render for PreEscaped<T> { /// The `html!` macro expands to an expression of this type. pub type Markup = PreEscaped<String>; +impl Markup { + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } +} + impl<T: AsRef<str> + Into<String>> PreEscaped<T> { /// Converts the inner value to a string. pub fn into_string(self) -> String { diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index ffb6a9a6..4b6b2c94 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -1,8 +1,7 @@ use crate::base::component::L10n; use crate::core::action::{action_ref, run_actions}; -use crate::core::component::{ - common_components, ComponentTrait, ComponentsBundle, ContextOp, OneComponent, RenderContext, -}; +use crate::core::component::{ComponentTrait, ContextOp, OneComponent, RenderContext}; +use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; @@ -12,8 +11,6 @@ use crate::{fn_builder, server}; use unic_langid::CharacterDirection; -use std::collections::HashMap; - type PageTitle = OneComponent<L10n>; type PageDescription = OneComponent<L10n>; @@ -26,7 +23,7 @@ pub struct Page { favicon : Option<Favicon>, context : RenderContext, body_classes: Classes, - regions : HashMap<&'static str, ComponentsBundle>, + regions : ComponentsRegions, template : String, } @@ -41,7 +38,7 @@ impl Default for Page { favicon : None, context : RenderContext::new(), body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), - regions : common_components(), + regions : ComponentsRegions::new(), template : "default".to_owned(), } } @@ -110,12 +107,7 @@ impl Page { region: &'static str, component: impl ComponentTrait, ) -> &mut Self { - if let Some(regions) = self.regions.get_mut(region) { - regions.add(component); - } else { - self.regions - .insert(region, ComponentsBundle::new_with(component)); - } + self.regions.add_to(region, component); self } @@ -196,9 +188,14 @@ impl Page { } pub fn render_region(&mut self, region: &str) -> Option<Markup> { - match self.regions.get_mut(region) { - Some(components) => Some(components.render(&mut self.context)), - None => None, + let render = self + .regions + .get_extended_bundle(self.context.theme().single_name(), region) + .render(self.context()); + if render.is_empty() { + None + } else { + Some(render) } } } From cb04a293886c35619f71c58541e95fa13703ba19 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 7 Jun 2023 23:21:42 +0200 Subject: [PATCH 350/853] =?UTF-8?q?=F0=9F=9A=9A=20Define=20acci=C3=B3n=20b?= =?UTF-8?q?ase=20"before=5Frender=5Fcomponent"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- .../src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop/src/base.rs | 2 + pagetop/src/base/action.rs | 1 + .../base/action/before_render_component.rs | 64 ++++++++++++++++++ pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/l10n.rs | 16 ++--- pagetop/src/core/component/definition.rs | 65 ------------------- pagetop/src/locale.rs | 2 +- 12 files changed, 81 insertions(+), 81 deletions(-) create mode 100644 pagetop/src/base/action.rs create mode 100644 pagetop/src/base/action/before_render_component.rs diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 97d3a267..ad6da656 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -153,7 +153,7 @@ impl MegaMenuItem { define_handle!(COMPONENT_MEGAMENU); -action_before_render_component!(ACTION_BEFORE_RENDER_MENU, MegaMenu); +action_before_render_component!(ACTION_BEFORE_RENDER_MENU for MegaMenu); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index c3f14247..82a4d8c1 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_CONTAINER); -action_before_render_component!(ACTION_BEFORE_RENDER_CONTAINER, Container); +action_before_render_component!(ACTION_BEFORE_RENDER_CONTAINER for Container); #[derive(Default)] pub enum ContainerType { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 6eaa7a91..979d9a78 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_FORM); -action_before_render_component!(ACTION_BEFORE_RENDER_FORM, Form); +action_before_render_component!(ACTION_BEFORE_RENDER_FORM for Form); #[derive(Default)] pub enum FormMethod { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index f3f4d895..f623b942 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_COLUMN); -action_before_render_component!(ACTION_BEFORE_RENDER_COLUMN, Column); +action_before_render_component!(ACTION_BEFORE_RENDER_COLUMN for Column); const SIZE__DEFAULT: &str = "col-md"; const SIZE__1_OF_12: &str = "col-md-1"; diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index a4f78bd4..c167617a 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -4,7 +4,7 @@ use crate::component::grid; define_handle!(COMPONENT_ROW); -action_before_render_component!(ACTION_BEFORE_RENDER_ROW, Row); +action_before_render_component!(ACTION_BEFORE_RENDER_ROW for Row); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index 29705be6..acfd1dbe 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,3 +1,5 @@ +pub mod action; + pub mod component; pub mod theme; diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs new file mode 100644 index 00000000..f1f99699 --- /dev/null +++ b/pagetop/src/base/action.rs @@ -0,0 +1 @@ +mod before_render_component; \ No newline at end of file diff --git a/pagetop/src/base/action/before_render_component.rs b/pagetop/src/base/action/before_render_component.rs new file mode 100644 index 00000000..1acf30ff --- /dev/null +++ b/pagetop/src/base/action/before_render_component.rs @@ -0,0 +1,64 @@ +#[macro_export] +macro_rules! action_before_render_component { + ( $ACTION_HANDLE:ident for $Component:ty ) => { + $crate::paste! { + $crate::define_handle!($ACTION_HANDLE); + + type Action = fn(&$Component, &mut RenderContext); + + pub struct [< BeforeRender $Component >] { + action: Option<Action>, + weight: isize, + } + + impl ActionTrait for [< BeforeRender $Component >] { + fn new() -> Self { + [< BeforeRender $Component >] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + $ACTION_HANDLE + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [< BeforeRender $Component >] { + #[allow(dead_code)] + pub fn with_action(mut self, action: Action) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { + if let Some(action) = self.action { + action(component, rcx) + } + } + } + + #[inline(always)] + pub fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { + run_actions($ACTION_HANDLE, |action| + action_ref::<[< BeforeRender $Component >]>(&**action) + .run(component, rcx) + ); + } + } + }; +} diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b51db15e..5153d6bf 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -2,7 +2,7 @@ use crate::prelude::*; define_handle!(COMPONENT_BLOCK); -action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK, Block); +action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK for Block); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index fb178681..f1735259 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -11,20 +11,18 @@ pub enum L10nOp { Escaped(&'static str, &'static Locales), } +impl Default for L10nOp { + fn default() -> Self { + L10nOp::None + } +} + +#[derive(Default)] pub struct L10n { op: L10nOp, args: HashMap<&'static str, String>, } -impl Default for L10n { - fn default() -> Self { - L10n { - op: L10nOp::None, - args: HashMap::new(), - } - } -} - impl ComponentTrait for L10n { fn new() -> Self { L10n::default() diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 666cc1a0..d153b65e 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -74,68 +74,3 @@ pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C { pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } - -#[macro_export] -macro_rules! action_before_render_component { - ( $ACTION_HANDLE:ident, $Component:ty ) => { - $crate::paste! { - $crate::define_handle!($ACTION_HANDLE); - - type Action = fn(&$Component, &mut RenderContext); - - pub struct [< BeforeRender $Component >] { - action: Option<Action>, - weight: isize, - } - - impl ActionTrait for [< BeforeRender $Component >] { - fn new() -> Self { - [< BeforeRender $Component >] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - $ACTION_HANDLE - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } - } - - impl [< BeforeRender $Component >] { - #[allow(dead_code)] - pub fn with_action(mut self, action: Action) -> Self { - self.action = Some(action); - self - } - - #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { - if let Some(action) = self.action { - action(component, rcx) - } - } - } - - #[inline(always)] - pub fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { - run_actions($ACTION_HANDLE, |action| - action_ref::<[< BeforeRender $Component >]>(&**action) - .run(component, rcx) - ); - } - } - }; -} diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 09d9e06c..4a3a0865 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -78,7 +78,7 @@ //! //! define_locale!(LOCALE_SAMPLE, "static/locales"); //! ``` -//! Y utiliza el componente [L10n](crate::core::component::L10n) para incluir, en respuestas a las +//! Y utiliza el componente [L10n](crate::base::component::L10n) para incluir, en respuestas a las //! peticiones web, textos y contenidos opcionalmente traducibles según el contexto de renderizado. use crate::{args, config, trace, LazyStatic}; From f0e4aea6724e6ae3c6540e6f87c21437db6814f4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 00:12:07 +0200 Subject: [PATCH 351/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20identificador?= =?UTF-8?q?=20en=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 8 ++++---- pagetop-minimal/src/component/anchor.rs | 10 +++++----- pagetop-minimal/src/component/container.rs | 18 +++++++++--------- .../src/component/form_element/form.rs | 10 +++++----- pagetop-minimal/src/component/grid/column.rs | 10 +++++----- pagetop-minimal/src/component/grid/row.rs | 10 +++++----- pagetop-minimal/src/component/heading.rs | 10 +++++----- pagetop-minimal/src/component/image.rs | 10 +++++----- pagetop-minimal/src/component/paragraph.rs | 10 +++++----- .../src/base/action/before_render_component.rs | 10 +++++----- pagetop/src/base/component/block.rs | 8 ++++---- pagetop/src/core/component/context.rs | 6 +++--- pagetop/src/core/component/definition.rs | 4 ++++ pagetop/src/html/attribute.rs | 10 +++------- pagetop/src/html/classes.rs | 10 ++-------- pagetop/src/html/identifier.rs | 10 +++------- pagetop/src/html/name.rs | 10 +++------- pagetop/src/util.rs | 3 ++- 18 files changed, 77 insertions(+), 90 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index ad6da656..fdaa5be4 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -175,6 +175,10 @@ impl ComponentTrait for MegaMenu { COMPONENT_MEGAMENU } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -264,10 +268,6 @@ impl MegaMenu { // MegaMenu GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index dba9c7d6..da7ba95c 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -50,6 +50,10 @@ impl ComponentTrait for Anchor { COMPONENT_ANCHOR } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -69,7 +73,7 @@ impl ComponentTrait for Anchor { }; html! { a - id=[self.id().get()] + id=[self.id()] class=[self.classes().get()] href=[self.href().get()] target=[target] @@ -183,10 +187,6 @@ impl Anchor { // Anchor GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 82a4d8c1..f61a01ea 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -38,6 +38,10 @@ impl ComponentTrait for Container { COMPONENT_CONTAINER } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -53,35 +57,35 @@ impl ComponentTrait for Container { fn default_render(&self, rcx: &mut RenderContext) -> Markup { match self.container_type() { ContainerType::Header => html! { - header id=[self.id().get()] class=[self.classes().get()] { + header id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().render(rcx)) } } }, ContainerType::Footer => html! { - footer id=[self.id().get()] class=[self.classes().get()] { + footer id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().render(rcx)) } } }, ContainerType::Main => html! { - main id=[self.id().get()] class=[self.classes().get()] { + main id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().render(rcx)) } } }, ContainerType::Section => html! { - section id=[self.id().get()] class=[self.classes().get()] { + section id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().render(rcx)) } } }, _ => html! { - div id=[self.id().get()] class=[self.classes().get()] { + div id=[self.id()] class=[self.classes().get()] { (self.components().render(rcx)) } }, @@ -168,10 +172,6 @@ impl Container { // Container GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 979d9a78..ccab94ff 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -36,6 +36,10 @@ impl ComponentTrait for Form { COMPONENT_FORM } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -55,7 +59,7 @@ impl ComponentTrait for Form { }; html! { form - id=[self.id().get()] + id=[self.id()] class=[self.classes().get()] action=[self.action().get()] method=[method] @@ -134,10 +138,6 @@ impl Form { // Form GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index f623b942..192b760a 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -57,6 +57,10 @@ impl ComponentTrait for Column { COMPONENT_COLUMN } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -71,7 +75,7 @@ impl ComponentTrait for Column { fn default_render(&self, rcx: &mut RenderContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] { + div id=[self.id()] class=[self.classes().get()] { (self.components().render(rcx)) } } @@ -149,10 +153,6 @@ impl Column { // Column GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index c167617a..f9848568 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -26,6 +26,10 @@ impl ComponentTrait for Row { COMPONENT_ROW } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -40,7 +44,7 @@ impl ComponentTrait for Row { fn default_render(&self, rcx: &mut RenderContext) -> Markup { html! { - div id=[self.id().get()] class=[self.classes().get()] { + div id=[self.id()] class=[self.classes().get()] { (self.columns().render(rcx)) } } @@ -96,10 +100,6 @@ impl Row { // Row GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 4e1eb21b..666fdbcd 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -49,6 +49,10 @@ impl ComponentTrait for Heading { COMPONENT_HEADING } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -58,7 +62,7 @@ impl ComponentTrait for Heading { } fn default_render(&self, rcx: &mut RenderContext) -> Markup { - let id = self.id().get(); + let id = self.id(); let classes = self.classes().get(); html! { @match &self.heading_type() { HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().render(rcx)) }, @@ -181,10 +185,6 @@ impl Heading { // Paragraph GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index 2c87e0e8..840ef2ae 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -22,6 +22,10 @@ impl ComponentTrait for Image { COMPONENT_IMAGE } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -34,7 +38,7 @@ impl ComponentTrait for Image { html! { img src=[self.source().get()] - id=[self.id().get()] + id=[self.id()] class=[self.classes().get()]; } } @@ -93,10 +97,6 @@ impl Image { // Image GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index ee3a047d..9e6b1df5 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -34,6 +34,10 @@ impl ComponentTrait for Paragraph { COMPONENT_PARAGRAPH } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -45,7 +49,7 @@ impl ComponentTrait for Paragraph { fn default_render(&self, rcx: &mut RenderContext) -> Markup { html! { p - id=[self.id().get()] + id=[self.id()] class=[self.classes().get()] { (self.components().render(rcx)) @@ -125,10 +129,6 @@ impl Paragraph { // Paragraph GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop/src/base/action/before_render_component.rs b/pagetop/src/base/action/before_render_component.rs index 1acf30ff..f2bd2e4f 100644 --- a/pagetop/src/base/action/before_render_component.rs +++ b/pagetop/src/base/action/before_render_component.rs @@ -6,14 +6,14 @@ macro_rules! action_before_render_component { type Action = fn(&$Component, &mut RenderContext); - pub struct [< BeforeRender $Component >] { + pub struct [<BeforeRender $Component>] { action: Option<Action>, weight: isize, } - impl ActionTrait for [< BeforeRender $Component >] { + impl ActionTrait for [<BeforeRender $Component>] { fn new() -> Self { - [< BeforeRender $Component >] { + [<BeforeRender $Component>] { action: None, weight: 0, } @@ -32,7 +32,7 @@ macro_rules! action_before_render_component { } } - impl [< BeforeRender $Component >] { + impl [<BeforeRender $Component>] { #[allow(dead_code)] pub fn with_action(mut self, action: Action) -> Self { self.action = Some(action); @@ -55,7 +55,7 @@ macro_rules! action_before_render_component { #[inline(always)] pub fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { run_actions($ACTION_HANDLE, |action| - action_ref::<[< BeforeRender $Component >]>(&**action) + action_ref::<[<BeforeRender $Component>]>(&**action) .run(component, rcx) ); } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 5153d6bf..4e3cf1d3 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -25,6 +25,10 @@ impl ComponentTrait for Block { COMPONENT_BLOCK } + fn id(&self) -> Option<String> { + self.id.get() + } + fn weight(&self) -> isize { self.weight } @@ -107,10 +111,6 @@ impl Block { // Block GETTERS. - pub fn id(&self) -> &IdentifierValue { - &self.id - } - pub fn classes(&self) -> &Classes { &self.classes } diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 295e33ac..e9550930 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,5 +1,5 @@ use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; -use crate::html::{html, Assets, IdentifierValue, JavaScript, Markup, StyleSheet}; +use crate::html::{html, Assets, JavaScript, Markup, StyleSheet}; use crate::locale::{LanguageIdentifier, LANGID}; use crate::server::HttpRequest; use crate::{concat_string, config, util, LazyStatic}; @@ -120,8 +120,8 @@ impl RenderContext { // Context EXTRAS. - pub fn required_id<T>(&mut self, id: &IdentifierValue) -> String { - match id.get() { + pub fn required_id<T>(&mut self, id: Option<String>) -> String { + match id { Some(id) => id, None => { let prefix = util::single_type_name::<T>() diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index d153b65e..d81f30b9 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -27,6 +27,10 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { None } + fn id(&self) -> Option<String> { + None + } + fn weight(&self) -> isize { 0 } diff --git a/pagetop/src/html/attribute.rs b/pagetop/src/html/attribute.rs index 1a68d21a..965e8beb 100644 --- a/pagetop/src/html/attribute.rs +++ b/pagetop/src/html/attribute.rs @@ -1,3 +1,5 @@ +use crate::fn_builder; + #[derive(Default)] pub struct AttributeValue(String); @@ -8,13 +10,7 @@ impl AttributeValue { // AttributeValue BUILDER. - pub fn with_value(mut self, value: &str) -> Self { - self.alter_value(value); - self - } - - // AttributeValue ALTER. - + #[fn_builder] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.0 = value.trim().to_owned(); self diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 6d453128..f9f4ee04 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,4 +1,4 @@ -use crate::concat_string; +use crate::{concat_string, fn_builder}; pub enum ClassesOp { Add, @@ -26,13 +26,7 @@ impl Classes { // Classes BUILDER. - pub fn with_value(mut self, op: ClassesOp, classes: &str) -> Self { - self.alter_value(op, classes); - self - } - - // Classes ALTER. - + #[fn_builder] pub fn alter_value(&mut self, op: ClassesOp, classes: &str) -> &mut Self { let classes = classes.trim(); match op { diff --git a/pagetop/src/html/identifier.rs b/pagetop/src/html/identifier.rs index 6707a71f..90f8295b 100644 --- a/pagetop/src/html/identifier.rs +++ b/pagetop/src/html/identifier.rs @@ -1,3 +1,5 @@ +use crate::fn_builder; + #[derive(Default)] pub struct IdentifierValue(String); @@ -8,13 +10,7 @@ impl IdentifierValue { // IdentifierValue BUILDER. - pub fn with_value(mut self, value: &str) -> Self { - self.alter_value(value); - self - } - - // IdentifierValue ALTER. - + #[fn_builder] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.0 = value.trim().replace(' ', "_"); self diff --git a/pagetop/src/html/name.rs b/pagetop/src/html/name.rs index 5f8f2195..c3f2af12 100644 --- a/pagetop/src/html/name.rs +++ b/pagetop/src/html/name.rs @@ -1,3 +1,5 @@ +use crate::fn_builder; + #[derive(Default)] pub struct NameValue(String); @@ -8,13 +10,7 @@ impl NameValue { // NameValue BUILDER. - pub fn with_value(mut self, value: &str) -> Self { - self.alter_value(value); - self - } - - // NameValue ALTER. - + #[fn_builder] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.0 = value.trim().replace(' ', "_"); self diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 29906378..63fd72e9 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,4 +1,4 @@ -//! Funciones útiles y macros declarativas. +//! Funciones útiles. use crate::Handle; @@ -7,6 +7,7 @@ use crate::Handle; // ************************************************************************************************* // https://stackoverflow.com/a/71464396 +#[doc(hidden)] pub const fn handle( module_path: &'static str, file: &'static str, From 9cbf2f8142ea63240168defc539c4185831d49b8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:20:23 +0200 Subject: [PATCH 352/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20C=C3=B3digo=20revi?= =?UTF-8?q?sado=20con=20cargo=20fmt/clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- pagetop-minimal/src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop/Cargo.toml | 6 +++--- pagetop/src/base/action.rs | 2 +- pagetop/src/base/action/before_render_component.rs | 5 ++++- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/l10n.rs | 8 ++------ 10 files changed, 16 insertions(+), 17 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index fdaa5be4..6e90733d 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -188,7 +188,7 @@ impl ComponentTrait for MegaMenu { } fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); + run_actions_before_render_component(self, rcx); } fn default_render(&self, rcx: &mut RenderContext) -> Markup { diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index f61a01ea..9fa319cd 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -51,7 +51,7 @@ impl ComponentTrait for Container { } fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); + run_actions_before_render_component(self, rcx); } fn default_render(&self, rcx: &mut RenderContext) -> Markup { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index ccab94ff..303de41b 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -49,7 +49,7 @@ impl ComponentTrait for Form { } fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); + run_actions_before_render_component(self, rcx); } fn default_render(&self, rcx: &mut RenderContext) -> Markup { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 192b760a..c27b12f7 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -70,7 +70,7 @@ impl ComponentTrait for Column { } fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); + run_actions_before_render_component(self, rcx); } fn default_render(&self, rcx: &mut RenderContext) -> Markup { diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index f9848568..5c5955e4 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -39,7 +39,7 @@ impl ComponentTrait for Row { } fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); + run_actions_before_render_component(self, rcx); } fn default_render(&self, rcx: &mut RenderContext) -> Markup { diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 86f990e9..7af60f4b 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -40,7 +40,7 @@ itoa = "1.0.6" futures = "0.3.28" futures-util = "0.3.28" nom = "7.1.3" -once_cell = "1.17.1" +once_cell = "1.17.2" paste = "1.0.12" substring = "1.4.5" term_size = "0.3.2" @@ -51,7 +51,7 @@ tracing = "0.1.37" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.17", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.10.0", default-features = false } -tracing-actix-web = "0.7.4" +tracing-actix-web = "0.7.5" fluent-templates = "0.8.0" unic-langid = { version = "0.9.1", features = ["macros"] } @@ -78,7 +78,7 @@ version = "0.11.0" optional = true [dev-dependencies] -tokio = { version = "1.28.1", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.28.2", features = ["macros", "rt-multi-thread"] } [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs index f1f99699..512a2d69 100644 --- a/pagetop/src/base/action.rs +++ b/pagetop/src/base/action.rs @@ -1 +1 @@ -mod before_render_component; \ No newline at end of file +mod before_render_component; diff --git a/pagetop/src/base/action/before_render_component.rs b/pagetop/src/base/action/before_render_component.rs index f2bd2e4f..d738275d 100644 --- a/pagetop/src/base/action/before_render_component.rs +++ b/pagetop/src/base/action/before_render_component.rs @@ -53,7 +53,10 @@ macro_rules! action_before_render_component { } #[inline(always)] - pub fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { + pub fn run_actions_before_render_component( + component: &mut $Component, + rcx: &mut RenderContext + ) { run_actions($ACTION_HANDLE, |action| action_ref::<[<BeforeRender $Component>]>(&**action) .run(component, rcx) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 4e3cf1d3..8ec5dd42 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -38,7 +38,7 @@ impl ComponentTrait for Block { } fn before_render(&mut self, rcx: &mut RenderContext) { - before_render_inline(self, rcx); + run_actions_before_render_component(self, rcx); } fn default_render(&self, rcx: &mut RenderContext) -> Markup { diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index f1735259..57ee8bcc 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -4,19 +4,15 @@ use std::collections::HashMap; define_handle!(COMPONENT_L10N); +#[derive(Default)] pub enum L10nOp { + #[default] None, Value(Markup), Translated(&'static str, &'static Locales), Escaped(&'static str, &'static Locales), } -impl Default for L10nOp { - fn default() -> Self { - L10nOp::None - } -} - #[derive(Default)] pub struct L10n { op: L10nOp, From d81d6617ae0f3cef2ac1756c9c32a9619e0d16af Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:28:56 +0200 Subject: [PATCH 353/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.40?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 7af60f4b..3ea567e3 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.39" +version = "0.0.40" edition = "2021" authors = [ From 8532b3d9f146139940602825ec1ae45aa8e6e94e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:29:14 +0200 Subject: [PATCH 354/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 91bf435c..0e8b6c0d 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From 049e30fe03a5949adb554f748c6204e3bfa645d0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:29:38 +0200 Subject: [PATCH 355/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 11093a82..1e6971d0 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From f21e3da38985291fe5b67bcf5acf755de016d03b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:29:57 +0200 Subject: [PATCH 356/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 42b64299..f4de1f8b 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From a6abe87adfbd32331d20f956cd1b1b31e34f8baf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:30:11 +0200 Subject: [PATCH 357/853] =?UTF-8?q?=F0=9F=94=96=20[megamenu]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index a94ac1d4..b4969b17 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From 39729a03f95343da187ce39a9aa13ddcac70839b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:30:26 +0200 Subject: [PATCH 358/853] =?UTF-8?q?=F0=9F=94=96=20[minimal]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index f0986adb..e531cad5 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From 71c78ac643e92308109539e0edf1683ac7f7f32a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:30:41 +0200 Subject: [PATCH 359/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index a9511b26..979ced0d 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From 6516e8a60f2a9a099621894d4b9aeccb06de6bb1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 08:30:56 +0200 Subject: [PATCH 360/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index eb8a715f..61e19dc7 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From cd763554306107fd308da3c757d659428d473a72 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 8 Jun 2023 22:48:51 +0200 Subject: [PATCH 361/853] =?UTF-8?q?=E2=9C=85=20Preparando=20PageTop=20para?= =?UTF-8?q?=20los=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 3 --- pagetop/src/app.rs | 4 ++++ pagetop/tests/health_check.rs | 15 +++++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 3ea567e3..3cf6584a 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -77,9 +77,6 @@ optional = true version = "0.11.0" optional = true -[dev-dependencies] -tokio = { version = "1.28.2", features = ["macros", "rt-multi-thread"] } - [build-dependencies] pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index dbb39ddd..83e17065 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -86,6 +86,10 @@ impl Application { pub fn run(self) -> Result<Server, Error> { Ok(self.server) } + + pub fn server(self) -> Server { + self.server + } } fn print_on_startup() { diff --git a/pagetop/tests/health_check.rs b/pagetop/tests/health_check.rs index dd980796..0898211a 100644 --- a/pagetop/tests/health_check.rs +++ b/pagetop/tests/health_check.rs @@ -1,12 +1,15 @@ +use pagetop::prelude::*; + +struct HealthCheck; + +impl ModuleTrait for HealthCheck {} + async fn spawn_app() { - let server = pagetop::Application::prepare(None) - .await? - .run()? - .expect("Failed to prepare server"); - let _ = tokio::spawn(server); + let server = Application::prepare(&HealthCheck).unwrap().server(); + let _ = actix_web::rt::spawn(server); } -#[tokio::test] +#[actix_web::test] async fn health_check_works() { spawn_app(); } From 0af85c4d776dd711d146bf825fa9426934d0e76f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 9 Jun 2023 10:33:54 +0200 Subject: [PATCH 362/853] =?UTF-8?q?=E2=9C=85=20Define=20la=20estructura=20?= =?UTF-8?q?para=20tests=20y=20ejemplos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 12 ++++++----- examples/Cargo.toml | 4 ++++ examples/hello-world/Cargo.toml | 9 +++++++++ examples/hello-world/src/main.rs | 20 +++++++++++++++++++ pagetop-admin/src/summary.rs | 4 ++-- pagetop-homedemo/src/lib.rs | 10 +++++----- pagetop-user/src/lib.rs | 2 +- pagetop/src/config.rs | 8 ++++---- pagetop/src/response/fatal_error.rs | 4 ++-- pagetop/src/response/page/definition.rs | 6 +----- tests/Cargo.toml | 18 +++++++++++++++++ tests/src/main.rs | 1 + pagetop/tests/main.rs => tests/src/server.rs | 0 .../src/server}/health_check.rs | 0 14 files changed, 74 insertions(+), 24 deletions(-) create mode 100644 examples/Cargo.toml create mode 100644 examples/hello-world/Cargo.toml create mode 100644 examples/hello-world/src/main.rs create mode 100644 tests/Cargo.toml create mode 100644 tests/src/main.rs rename pagetop/tests/main.rs => tests/src/server.rs (100%) rename {pagetop/tests => tests/src/server}/health_check.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index ea843974..2029180c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,19 +7,21 @@ members = [ "pagetop-build", "pagetop-jquery", "pagetop-homedemo", - "pagetop-megamenu", # Components. "pagetop-minimal", - # Themes. - "pagetop-aliner", - "pagetop-bootsier", - "pagetop-bulmix", + "pagetop-megamenu", # Modules. "pagetop-admin", "pagetop-user", "pagetop-node", + # Themes. + "pagetop-aliner", + "pagetop-bootsier", + "pagetop-bulmix", ] exclude = [ "drust", + "examples", + "tests", ] diff --git a/examples/Cargo.toml b/examples/Cargo.toml new file mode 100644 index 00000000..22a37520 --- /dev/null +++ b/examples/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = [ + "hello-world", +] diff --git a/examples/hello-world/Cargo.toml b/examples/hello-world/Cargo.toml new file mode 100644 index 00000000..d35e5156 --- /dev/null +++ b/examples/hello-world/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "example_hello_world" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +actix-web = "4" +pagetop = { version = "0.0", path = "../../pagetop" } diff --git a/examples/hello-world/src/main.rs b/examples/hello-world/src/main.rs new file mode 100644 index 00000000..502153f8 --- /dev/null +++ b/examples/hello-world/src/main.rs @@ -0,0 +1,20 @@ +use pagetop::prelude::*; + +struct HelloWorld; + +impl ModuleTrait for HelloWorld { + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + cfg.route("/", server::web::get().to(hello_world)); + } +} + +async fn hello_world(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { + Page::new(request) + .with_in("content", L10n::html(html! {h1 { "Hello World!"}})) + .render() +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&HelloWorld).unwrap().run()?.await +} diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index d12b692d..595b0edf 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -57,8 +57,8 @@ pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalEr Page::new(request) .with_context(ContextOp::Theme("Bootsier")) .with_title(L10n::text("Admin")) - .with_this_in("top-menu", top_menu) - .with_this_in( + .with_in("top-menu", top_menu) + .with_in( "content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index ebb40e99..ff85f2fa 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -39,11 +39,11 @@ async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { "/homedemo/css/styles.css", ))) .with_body_classes(ClassesOp::AddFirst, "default-homepage") - .with_this_in("content", hello_world()) - .with_this_in("content", welcome()) - .with_this_in("content", about_pagetop()) - .with_this_in("content", promo_pagetop()) - .with_this_in("content", reporting_issues()) + .with_in("content", hello_world()) + .with_in("content", welcome()) + .with_in("content", about_pagetop()) + .with_in("content", promo_pagetop()) + .with_in("content", reporting_issues()) .render() } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 31d75650..eac858e9 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -43,7 +43,7 @@ impl ModuleTrait for User { async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) .with_title(L10n::text("Identificación del usuario")) - .with_this_in( + .with_in( "content", Container::new() .with_id("welcome") diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 9f692f7b..e0c47130 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -202,10 +202,10 @@ pub struct Settings { /// Ver [`Settings`]. pub struct App { /// El nombre de la aplicación. - /// Por defecto: *"PageTop Application"*. + /// Por defecto: *"PageTop App"*. pub name: String, /// Una descripción breve de la aplicación. - /// Por defecto: *"Developed with the amazing PageTop framework."*. + /// Por defecto: *"Modular web solutions made simple with PageTop."*. pub description: String, /// Tema predeterminado. /// Por defecto: *"Basic"*. @@ -308,8 +308,8 @@ pub struct Server { define_config!(SETTINGS as Settings, // [app] - "app.name" => "PageTop Application", - "app.description" => "Developed with the amazing PageTop framework.", + "app.name" => "PageTop App", + "app.description" => "Modular web solutions made simple with PageTop.", "app.theme" => "Basic", "app.language" => "en-US", "app.direction" => "ltr", diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 4b82bd27..dce7be90 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -33,7 +33,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::text("Error FORBIDDEN")) - .with_this_in("content", error403::Error403) + .with_in("content", error403::Error403) .with_template("error") .render() { @@ -47,7 +47,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::text("Error RESOURCE NOT FOUND")) - .with_this_in("content", error404::Error404) + .with_in("content", error404::Error404) .with_template("error") .render() { diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 4b6b2c94..49bef122 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -102,11 +102,7 @@ impl Page { } #[fn_builder] - pub fn alter_this_in( - &mut self, - region: &'static str, - component: impl ComponentTrait, - ) -> &mut Self { + pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { self.regions.add_to(region, component); self } diff --git a/tests/Cargo.toml b/tests/Cargo.toml new file mode 100644 index 00000000..29ac8465 --- /dev/null +++ b/tests/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "tests" +version = "0.0.1" +edition = "2021" + +authors = [ + "Manuel Cillero <manuel@cillero.es>" +] +description = """\ + Test for PageTop.\ +""" +homepage = "https://pagetop.cillero.es" +repository = "https://github.com/manuelcillero/pagetop" +license = "Apache-2.0 OR MIT" + +[dependencies] +actix-web = "4" +pagetop = { version = "0.0", path = "../pagetop", features = ["mysql"], default-features = false } diff --git a/tests/src/main.rs b/tests/src/main.rs new file mode 100644 index 00000000..df4adf9f --- /dev/null +++ b/tests/src/main.rs @@ -0,0 +1 @@ +mod server; diff --git a/pagetop/tests/main.rs b/tests/src/server.rs similarity index 100% rename from pagetop/tests/main.rs rename to tests/src/server.rs diff --git a/pagetop/tests/health_check.rs b/tests/src/server/health_check.rs similarity index 100% rename from pagetop/tests/health_check.rs rename to tests/src/server/health_check.rs From a48c57519860c52531a77340b5dc7f38e7106e7a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 9 Jun 2023 11:11:50 +0200 Subject: [PATCH 363/853] =?UTF-8?q?=F0=9F=9A=A7=20Handles=20siempre=20requ?= =?UTF-8?q?eridos=20en=20la=20implementaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/hello-world/src/main.rs | 8 +++++++- pagetop/src/core/action.rs | 2 +- pagetop/src/core/action/definition.rs | 8 ++------ pagetop/src/core/component.rs | 4 +--- pagetop/src/core/component/definition.rs | 8 ++------ pagetop/src/core/module.rs | 2 +- pagetop/src/core/module/definition.rs | 8 ++------ 7 files changed, 16 insertions(+), 24 deletions(-) diff --git a/examples/hello-world/src/main.rs b/examples/hello-world/src/main.rs index 502153f8..36c70336 100644 --- a/examples/hello-world/src/main.rs +++ b/examples/hello-world/src/main.rs @@ -1,8 +1,14 @@ use pagetop::prelude::*; +define_handle!(APP_HELLO_WORLD); + struct HelloWorld; impl ModuleTrait for HelloWorld { + fn handle(&self) -> Handle { + APP_HELLO_WORLD + } + fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { cfg.route("/", server::web::get().to(hello_world)); } @@ -10,7 +16,7 @@ impl ModuleTrait for HelloWorld { async fn hello_world(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_in("content", L10n::html(html! {h1 { "Hello World!"}})) + .with_in("content", L10n::html(html! { h1 { "Hello World!" } })) .render() } diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index f526b79f..455e2176 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -1,5 +1,5 @@ mod definition; -pub use definition::{action_ref, ActionTrait, AnyAction, ACTION_UNNAMED}; +pub use definition::{action_ref, ActionTrait, AnyAction}; mod bundle; pub use bundle::Action; diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs index e9a13ed3..96f5b5bf 100644 --- a/pagetop/src/core/action/definition.rs +++ b/pagetop/src/core/action/definition.rs @@ -1,17 +1,13 @@ -use crate::{define_handle, Handle}; +use crate::Handle; pub use std::any::Any as AnyAction; -define_handle!(ACTION_UNNAMED); - pub trait ActionTrait: AnyAction + Send + Sync { fn new() -> Self where Self: Sized; - fn handle(&self) -> Handle { - ACTION_UNNAMED - } + fn handle(&self) -> Handle; fn weight(&self) -> isize { 0 diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index cadd3340..ee186937 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -2,9 +2,7 @@ mod context; pub use context::{ContextOp, RenderContext}; mod definition; -pub use definition::{ - component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait, COMPONENT_UNNAMED, -}; +pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; mod one; pub use one::OneComponent; diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index d81f30b9..fc7851e0 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,11 +1,9 @@ use crate::core::component::RenderContext; use crate::html::{html, Markup}; -use crate::{define_handle, util, Handle}; +use crate::{util, Handle}; pub use std::any::Any as AnyComponent; -define_handle!(COMPONENT_UNNAMED); - pub trait BaseComponent { fn render(&mut self, rcx: &mut RenderContext) -> Markup; } @@ -15,9 +13,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { where Self: Sized; - fn handle(&self) -> Handle { - COMPONENT_UNNAMED - } + fn handle(&self) -> Handle; fn name(&self) -> String { util::single_type_name::<Self>().to_owned() diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index 31e857e6..0ecfbc65 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,4 +1,4 @@ mod definition; -pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait, MODULE_UNNAMED}; +pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index b6df322c..60ddfdf7 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,24 +1,20 @@ use crate::base::component::L10n; use crate::core::action::Action; use crate::core::theme::ThemeStaticRef; -use crate::{define_handle, server, util, Handle}; +use crate::{server, util, Handle}; #[cfg(feature = "database")] use crate::db::MigrationItem; pub type ModuleStaticRef = &'static dyn ModuleTrait; -define_handle!(MODULE_UNNAMED); - pub trait BaseModule { fn single_name(&self) -> &'static str; } /// Los módulos deben implementar este *trait*. pub trait ModuleTrait: BaseModule + Send + Sync { - fn handle(&self) -> Handle { - MODULE_UNNAMED - } + fn handle(&self) -> Handle; fn name(&self) -> L10n { L10n::text(self.single_name()) From 52baa4f6714a5519c16bd582baf282a5c6b33784 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 9 Jun 2023 12:37:58 +0200 Subject: [PATCH 364/853] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F=20Nuevo=20compone?= =?UTF-8?q?nte=20Html=20para=20simplificar=20L10n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 45 +++++++++++++------------ pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/base/component.rs | 3 ++ pagetop/src/base/component/html.rs | 48 +++++++++++++++++++++++++++ pagetop/src/base/component/l10n.rs | 15 +++------ pagetop/src/core/module/definition.rs | 2 +- pagetop/src/response/fatal_error.rs | 4 +-- 8 files changed, 83 insertions(+), 38 deletions(-) create mode 100644 pagetop/src/base/component/html.rs diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 595b0edf..42826b4a 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,4 +1,5 @@ -use super::LOCALE_ADMIN; +use crate::LOCALE_ADMIN; + use pagetop::prelude::*; use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; use pagetop_minimal::component::*; @@ -7,62 +8,62 @@ pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalEr let top_menu = MegaMenu::new() .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALE_ADMIN))) .with_item(MegaMenuItem::link( - L10n::text("Opción 2"), + L10n::n("Opción 2"), "https://www.google.es", )) .with_item(MegaMenuItem::link_blank( - L10n::text("Opción 3"), + L10n::n("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - L10n::text("Submenú 1"), + L10n::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - L10n::text("Submenú 2"), + L10n::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::label(L10n::text("Opción 4"))); + .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); let side_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) .with_item(MegaMenuItem::link( - L10n::text("Opción 2"), + L10n::n("Opción 2"), "https://www.google.es", )) .with_item(MegaMenuItem::link_blank( - L10n::text("Opción 3"), + L10n::n("Opción 3"), "https://www.google.es", )) .with_item(MegaMenuItem::submenu( - L10n::text("Submenú 1"), + L10n::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) .with_item(MegaMenuItem::separator()) .with_item(MegaMenuItem::submenu( - L10n::text("Submenú 2"), + L10n::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::text("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::text("Opción 2"))), + .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) + .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::label(L10n::text("Opción 4"))); + .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); Page::new(request) .with_context(ContextOp::Theme("Bootsier")) - .with_title(L10n::text("Admin")) + .with_title(L10n::n("Admin")) .with_in("top-menu", top_menu) .with_in( "content", grid::Row::new() .with_column(grid::Column::new().with_component(side_menu)) - .with_column(grid::Column::new().with_component(L10n::html(html! { + .with_column(grid::Column::new().with_component(Html::with(html! { p { "Columna 2"} }))), ) diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 3f92cd71..882f3ebf 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -41,7 +41,7 @@ impl ModuleTrait for Node { } async fn node(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { - Page::new(request).with_title(L10n::text("Nodo")).render() + Page::new(request).with_title(L10n::n("Nodo")).render() } fn before_render_page(page: &mut Page) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index eac858e9..716d426e 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -42,7 +42,7 @@ impl ModuleTrait for User { async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(L10n::text("Identificación del usuario")) + .with_title(L10n::n("Identificación del usuario")) .with_in( "content", Container::new() diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index fcf9d348..2820da31 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -1,3 +1,6 @@ +mod html; +pub use html::{Html, COMPONENT_HTML}; + mod l10n; pub use l10n::{L10n, COMPONENT_L10N}; diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs new file mode 100644 index 00000000..9d3690ab --- /dev/null +++ b/pagetop/src/base/component/html.rs @@ -0,0 +1,48 @@ +use crate::prelude::*; + +define_handle!(COMPONENT_HTML); + +#[derive(Default)] +pub struct Html(Markup); + +impl ComponentTrait for Html { + fn new() -> Self { + Html::default() + } + + fn handle(&self) -> Handle { + COMPONENT_HTML + } + + fn default_render(&self, _: &mut RenderContext) -> Markup { + html! { (self.html()) } + } + + fn as_ref_any(&self) -> &dyn AnyComponent { + self + } + + fn as_mut_any(&mut self) -> &mut dyn AnyComponent { + self + } +} + +impl Html { + pub fn with(html: Markup) -> Self { + Html(html) + } + + // Html BUILDER. + + #[fn_builder] + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.0 = html; + self + } + + // Html GETTERS. + + pub fn html(&self) -> &Markup { + &self.0 + } +} diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index 57ee8bcc..a825e6da 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -8,7 +8,7 @@ define_handle!(COMPONENT_L10N); pub enum L10nOp { #[default] None, - Value(Markup), + Text(&'static str), Translated(&'static str, &'static Locales), Escaped(&'static str, &'static Locales), } @@ -31,7 +31,7 @@ impl ComponentTrait for L10n { fn default_render(&self, rcx: &mut RenderContext) -> Markup { match self.op() { L10nOp::None => html! {}, - L10nOp::Value(value) => html! { (value) }, + L10nOp::Text(text) => html! { (text) }, L10nOp::Translated(key, locales) => html! { (locales .lookup_with_args( @@ -71,16 +71,9 @@ impl ComponentTrait for L10n { } impl L10n { - pub fn text(text: &'static str) -> Self { + pub fn n(text: &'static str) -> Self { L10n { - op: L10nOp::Value(html! { (text) }), - ..Default::default() - } - } - - pub fn html(html: Markup) -> Self { - L10n { - op: L10nOp::Value(html), + op: L10nOp::Text(text), ..Default::default() } } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 60ddfdf7..5d8666ea 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -17,7 +17,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn handle(&self) -> Handle; fn name(&self) -> L10n { - L10n::text(self.single_name()) + L10n::n(self.single_name()) } fn description(&self) -> L10n { diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index dce7be90..b6eb69df 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -32,7 +32,7 @@ impl fmt::Display for FatalError { FatalError::AccessDenied(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title(L10n::text("Error FORBIDDEN")) + .with_title(L10n::n("Error FORBIDDEN")) .with_in("content", error403::Error403) .with_template("error") .render() @@ -46,7 +46,7 @@ impl fmt::Display for FatalError { FatalError::NotFound(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page - .with_title(L10n::text("Error RESOURCE NOT FOUND")) + .with_title(L10n::n("Error RESOURCE NOT FOUND")) .with_in("content", error404::Error404) .with_template("error") .render() From 7ffea7fab6028459387590cd80a46c7056ce2bc5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 9 Jun 2023 13:34:33 +0200 Subject: [PATCH 365/853] =?UTF-8?q?=F0=9F=92=A5=20Renombra=20la=20API=20"s?= =?UTF-8?q?erver"=20por=20"service"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 ++-- pagetop-admin/src/summary.rs | 2 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 6 +++--- pagetop-jquery/src/lib.rs | 2 +- pagetop-megamenu/src/lib.rs | 2 +- pagetop-minimal/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 6 +++--- pagetop-user/src/lib.rs | 6 +++--- pagetop/src/app.rs | 10 +++++----- pagetop/src/base/theme/basic.rs | 4 ++-- pagetop/src/core/component/context.rs | 2 +- pagetop/src/core/module/all.rs | 4 ++-- pagetop/src/core/module/definition.rs | 4 ++-- pagetop/src/lib.rs | 4 ++-- pagetop/src/prelude.rs | 4 ++-- pagetop/src/response/fatal_error.rs | 4 ++-- pagetop/src/response/page/definition.rs | 4 ++-- pagetop/src/{server.rs => service.rs} | 2 +- pagetop/src/util.rs | 4 ++-- 22 files changed, 41 insertions(+), 41 deletions(-) rename pagetop/src/{server.rs => service.rs} (72%) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index cae6cfee..81eb45f4 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -33,9 +33,9 @@ impl ModuleTrait for Admin { vec![action!(ActionBeforeRenderPage => before_render_page)] } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { cfg.service( - server::web::scope("/admin").route("", server::web::get().to(summary::summary)), + service::web::scope("/admin").route("", service::web::get().to(summary::summary)), ); } } diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 42826b4a..8d90bcb6 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -4,7 +4,7 @@ use pagetop::prelude::*; use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; use pagetop_minimal::component::*; -pub async fn summary(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { +pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALE_ADMIN))) .with_item(MegaMenuItem::link( diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 2b807254..d38e3eec 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -15,7 +15,7 @@ impl ModuleTrait for Aliner { Some(&Aliner) } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/aliner", bundle_aliner); } } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 2fe5aca4..4075a821 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -21,7 +21,7 @@ impl ModuleTrait for Bootsier { vec![&pagetop_jquery::JQuery] } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/bootsier", bundle_bootsier); } } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index b657b58d..d6d00dd5 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -24,7 +24,7 @@ impl ModuleTrait for Bulmix { ] } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/bulmix", bundle_bulmix); } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index ff85f2fa..86f10e12 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -26,13 +26,13 @@ impl ModuleTrait for HomeDemo { vec![&pagetop_minimal::Minimal] } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/homedemo", bundle_homedemo); - cfg.route("/", server::web::get().to(demo)); + cfg.route("/", service::web::get().to(demo)); } } -async fn demo(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) .with_title(L10n::t("page_title", &LOCALE_DEMOHOME)) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 5632b181..103c584c 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -14,7 +14,7 @@ impl ModuleTrait for JQuery { MODULE_JQUERY } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/jquery", bundle_jquery); } } diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 414f42c5..5988d189 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -17,7 +17,7 @@ impl ModuleTrait for MegaMenu { vec![&pagetop_jquery::JQuery, &pagetop_minimal::Minimal] } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/megamenu", bundle_megamenu); } } diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index fb5667f2..1fae15fc 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -14,7 +14,7 @@ impl ModuleTrait for Minimal { MODULE_MINIMAL } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/minimal", bundle_minimal); } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 882f3ebf..01092e5a 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -22,8 +22,8 @@ impl ModuleTrait for Node { L10n::t("module_description", &LOCALE_NODE) } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - cfg.route("/node", server::web::get().to(node)); + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { + cfg.route("/node", service::web::get().to(node)); } fn actions(&self) -> Vec<Action> { @@ -40,7 +40,7 @@ impl ModuleTrait for Node { } } -async fn node(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn node(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request).with_title(L10n::n("Nodo")).render() } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 716d426e..809feffa 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -26,8 +26,8 @@ impl ModuleTrait for User { vec![&pagetop_minimal::Minimal] } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - cfg.route("/user/login", server::web::get().to(login)); + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { + cfg.route("/user/login", service::web::get().to(login)); } fn migrations(&self) -> Vec<MigrationItem> { @@ -40,7 +40,7 @@ impl ModuleTrait for User { } } -async fn login(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn login(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) .with_title(L10n::n("Identificación del usuario")) .with_in( diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 83e17065..1895089e 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,7 +6,7 @@ use crate::core::{module, module::ModuleStaticRef}; use crate::html::Markup; use crate::response::fatal_error::FatalError; use crate::response::page::ResultPage; -use crate::{config, locale, server, trace, LazyStatic}; +use crate::{config, locale, service, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db; @@ -55,8 +55,8 @@ impl Application { // Prepara el servidor web. let secret_key = get_secret_key(); - let server = server::HttpServer::new(move || { - server::App::new() + let server = service::HttpServer::new(move || { + service::App::new() .wrap(tracing_actix_web::TracingLogger::default()) .wrap( SessionMiddleware::builder(CookieSessionStore::default(), secret_key.clone()) @@ -71,7 +71,7 @@ impl Application { .build(), ) .configure(module::all::configure_services) - .default_service(server::web::route().to(service_not_found)) + .default_service(service::web::route().to(service_not_found)) }) .bind(format!( "{}:{}", @@ -123,6 +123,6 @@ fn get_secret_key() -> Key { Key::generate() } -async fn service_not_found(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn service_not_found(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Err(FatalError::NotFound(request)) } diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index e2ce7b3a..f108c5ea 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -2,7 +2,7 @@ use crate::core::module::ModuleTrait; use crate::core::theme::{ThemeStaticRef, ThemeTrait}; use crate::html::Favicon; use crate::response::page::Page; -use crate::{define_handle, serve_static_files, server, Handle}; +use crate::{define_handle, serve_static_files, service, Handle}; define_handle!(THEME_BASIC); @@ -19,7 +19,7 @@ impl ModuleTrait for Basic { Some(&Basic) } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/theme", bundle_theme); } } diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index e9550930..f8ddc97f 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,7 +1,7 @@ use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; use crate::html::{html, Assets, JavaScript, Markup, StyleSheet}; use crate::locale::{LanguageIdentifier, LANGID}; -use crate::server::HttpRequest; +use crate::service::HttpRequest; use crate::{concat_string, config, util, LazyStatic}; use std::collections::HashMap; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 7eba9801..428fbfc4 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,7 +1,7 @@ use crate::core::action::add_action; use crate::core::module::ModuleStaticRef; use crate::core::theme::all::THEMES; -use crate::{server, trace, LazyStatic}; +use crate::{service, trace, LazyStatic}; #[cfg(feature = "database")] use crate::{db::*, run_now}; @@ -142,7 +142,7 @@ pub fn run_migrations() { // CONFIGURE SERVICES ****************************************************************************** -pub fn configure_services(cfg: &mut server::web::ServiceConfig) { +pub fn configure_services(cfg: &mut service::web::ServiceConfig) { for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(cfg); } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 5d8666ea..5b1057f9 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,7 +1,7 @@ use crate::base::component::L10n; use crate::core::action::Action; use crate::core::theme::ThemeStaticRef; -use crate::{server, util, Handle}; +use crate::{service, util, Handle}; #[cfg(feature = "database")] use crate::db::MigrationItem; @@ -49,7 +49,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { } #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) {} + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) {} } impl<M: ?Sized + ModuleTrait> BaseModule for M { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 9c1412c0..ea806c4b 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -80,8 +80,8 @@ pub mod core; // Acciones, componentes, módulos y temas integrados en PageTop. pub mod base; -// API del servidor web. -pub mod server; +// API para operar con los servicios web. +pub mod service; // Tipos de respuestas a peticiones web. pub mod response; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 0bf665e5..bb028fff 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -31,8 +31,8 @@ pub use crate::{action, action_before_render_component}; pub use crate::base::component::*; -pub use crate::server; -pub use crate::server::HttpMessage; +pub use crate::service; +pub use crate::service::HttpMessage; pub use crate::response::fatal_error::*; pub use crate::response::{page::*, ResponseError}; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index b6eb69df..3994b91c 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -5,8 +5,8 @@ pub use error404::ERROR_404; use crate::base::component::L10n; use crate::response::{page::Page, ResponseError}; -use crate::server::http::{header::ContentType, StatusCode}; -use crate::server::{HttpRequest, HttpResponse}; +use crate::service::http::{header::ContentType, StatusCode}; +use crate::service::{HttpRequest, HttpResponse}; use std::fmt; diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 49bef122..cee80cb5 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -7,7 +7,7 @@ use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; use crate::response::page::action::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; use crate::response::page::ResultPage; -use crate::{fn_builder, server}; +use crate::{fn_builder, service}; use unic_langid::CharacterDirection; @@ -45,7 +45,7 @@ impl Default for Page { } impl Page { - pub fn new(request: server::HttpRequest) -> Self { + pub fn new(request: service::HttpRequest) -> Self { let mut page = Page::default(); page.context.alter(ContextOp::Request(Some(request))); page diff --git a/pagetop/src/server.rs b/pagetop/src/service.rs similarity index 72% rename from pagetop/src/server.rs rename to pagetop/src/service.rs index 6ceae9e4..2d518e25 100644 --- a/pagetop/src/server.rs +++ b/pagetop/src/service.rs @@ -2,7 +2,7 @@ pub use actix_session::Session; pub use actix_web::{ - cookie, http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, + cookie, get, http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, }; pub use actix_web_files::Files as ActixFiles; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 63fd72e9..cedb734d 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -112,10 +112,10 @@ macro_rules! serve_static_files { ( $cfg:ident, $dir:expr, $embed:ident ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service($crate::server::ResourceFiles::new($dir, $embed())); + $cfg.service($crate::service::ResourceFiles::new($dir, $embed())); } else { $cfg.service( - $crate::server::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) + $crate::service::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) .show_files_listing(), ); } From 2f4184fe26c1ca4cdbc1c78d606cee577c66a0e6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 9 Jun 2023 13:40:20 +0200 Subject: [PATCH 366/853] =?UTF-8?q?=E2=9C=A8=20Nuevo=20ejemplo=20"/hello/{?= =?UTF-8?q?name}"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/Cargo.toml | 1 + examples/hello-name/Cargo.toml | 9 +++++++++ examples/hello-name/src/main.rs | 31 +++++++++++++++++++++++++++++++ examples/hello-world/Cargo.toml | 2 +- examples/hello-world/src/main.rs | 8 ++++---- 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 examples/hello-name/Cargo.toml create mode 100644 examples/hello-name/src/main.rs diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 22a37520..3fbba518 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -1,4 +1,5 @@ [workspace] members = [ "hello-world", + "hello-name", ] diff --git a/examples/hello-name/Cargo.toml b/examples/hello-name/Cargo.toml new file mode 100644 index 00000000..a1076b25 --- /dev/null +++ b/examples/hello-name/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "hello_name" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +actix-web = "4" +pagetop = { version = "0.0", path = "../../pagetop" } diff --git a/examples/hello-name/src/main.rs b/examples/hello-name/src/main.rs new file mode 100644 index 00000000..4c9e148b --- /dev/null +++ b/examples/hello-name/src/main.rs @@ -0,0 +1,31 @@ +use pagetop::prelude::*; + +define_handle!(APP_HELLO_NAME); + +struct HelloName; + +impl ModuleTrait for HelloName { + fn handle(&self) -> Handle { + APP_HELLO_NAME + } + + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { + cfg.service(hello_name); + } +} + +#[service::get("/hello/{name}")] +async fn hello_name( + request: service::HttpRequest, + path: service::web::Path<String>, +) -> ResultPage<Markup, FatalError> { + let name = path.into_inner(); + Page::new(request) + .with_in("content", Html::with(html! { h1 { "Hello " (name) "!" } })) + .render() +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&HelloName).unwrap().run()?.await +} diff --git a/examples/hello-world/Cargo.toml b/examples/hello-world/Cargo.toml index d35e5156..1543da0b 100644 --- a/examples/hello-world/Cargo.toml +++ b/examples/hello-world/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "example_hello_world" +name = "hello_world" version = "0.0.0" edition = "2021" publish = false diff --git a/examples/hello-world/src/main.rs b/examples/hello-world/src/main.rs index 36c70336..028b971b 100644 --- a/examples/hello-world/src/main.rs +++ b/examples/hello-world/src/main.rs @@ -9,14 +9,14 @@ impl ModuleTrait for HelloWorld { APP_HELLO_WORLD } - fn configure_service(&self, cfg: &mut server::web::ServiceConfig) { - cfg.route("/", server::web::get().to(hello_world)); + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { + cfg.route("/", service::web::get().to(hello_world)); } } -async fn hello_world(request: server::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_in("content", L10n::html(html! { h1 { "Hello World!" } })) + .with_in("content", Html::with(html! { h1 { "Hello World!" } })) .render() } From 4054715591e2128e59c4af1a5212b56f863541c1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 9 Jun 2023 19:14:08 +0200 Subject: [PATCH 367/853] =?UTF-8?q?=F0=9F=93=9D=20Incluye=20el=20primer=20?= =?UTF-8?q?ejemplo=20en=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 ++++++------- examples/Cargo.toml | 3 +- examples/{ => basics}/hello-name/Cargo.toml | 2 +- examples/{ => basics}/hello-name/src/main.rs | 0 examples/{ => basics}/hello-world/Cargo.toml | 2 +- examples/{ => basics}/hello-world/src/main.rs | 0 pagetop/src/lib.rs | 39 ++++++++++++++++++- 7 files changed, 54 insertions(+), 18 deletions(-) rename examples/{ => basics}/hello-name/Cargo.toml (66%) rename examples/{ => basics}/hello-name/src/main.rs (100%) rename examples/{ => basics}/hello-world/Cargo.toml (66%) rename examples/{ => basics}/hello-world/src/main.rs (100%) diff --git a/README.md b/README.md index 797382fa..cfc3abcd 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,19 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con **PageTop**. +## Componentes + +* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, módulo + que proporciona un conjunto básico de componentes para la composición de páginas. + +* **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo + que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería + JavaScript para interactuar con el documento HTML.​ + +* **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, + módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web + creadas con **PageTop**. + ## Módulos * **[pagetop-homedemo](https://github.com/manuelcillero/pagetop/tree/main/pagetop-homedemo)**, @@ -70,19 +83,6 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: utiliza el *framework* [Bulma](https://bulma.io/) para la composición de páginas y visualización de componentes. -## Componentes - -* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, módulo - que proporciona un conjunto básico de componentes para la composición de páginas. - -* **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo - que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería - JavaScript para interactuar con el documento HTML.​ - -* **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, - módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web - creadas con **PageTop**. - ## Aplicación * **[drust](https://github.com/manuelcillero/pagetop/tree/main/drust)**, es una aplicación diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 3fbba518..167bbef8 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -1,5 +1,4 @@ [workspace] members = [ - "hello-world", - "hello-name", + "basics/*", ] diff --git a/examples/hello-name/Cargo.toml b/examples/basics/hello-name/Cargo.toml similarity index 66% rename from examples/hello-name/Cargo.toml rename to examples/basics/hello-name/Cargo.toml index a1076b25..6b41c11b 100644 --- a/examples/hello-name/Cargo.toml +++ b/examples/basics/hello-name/Cargo.toml @@ -6,4 +6,4 @@ publish = false [dependencies] actix-web = "4" -pagetop = { version = "0.0", path = "../../pagetop" } +pagetop = { version = "0.0", path = "../../../pagetop" } diff --git a/examples/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs similarity index 100% rename from examples/hello-name/src/main.rs rename to examples/basics/hello-name/src/main.rs diff --git a/examples/hello-world/Cargo.toml b/examples/basics/hello-world/Cargo.toml similarity index 66% rename from examples/hello-world/Cargo.toml rename to examples/basics/hello-world/Cargo.toml index 1543da0b..d70336aa 100644 --- a/examples/hello-world/Cargo.toml +++ b/examples/basics/hello-world/Cargo.toml @@ -6,4 +6,4 @@ publish = false [dependencies] actix-web = "4" -pagetop = { version = "0.0", path = "../../pagetop" } +pagetop = { version = "0.0", path = "../../../pagetop" } diff --git a/examples/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs similarity index 100% rename from examples/hello-world/src/main.rs rename to examples/basics/hello-world/src/main.rs diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index ea806c4b..420b9a07 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -12,7 +12,7 @@ //! **PageTop** es un entorno de desarrollo basado en Rust que reúne algunos de los crates más //! estables y populares para crear soluciones web modulares, extensibles y configurables. //! -//! PageTop define un interfaz único que ofrece: +//! PageTop define un interfaz único para aplicaciones SSR (*Server-Side Rendering*) que ofrece: //! //! * Lectura y uso de ajustes de configuración ([`config`]). //! @@ -34,6 +34,43 @@ //! //! **PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios //! son constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. +//! +//! # 🏃‍♀️ Inicio rápido +//! +//! Puedes encontrar este código en el repositorio de ejemplos +//! [básicos](https://github.com/manuelcillero/pagetop/tree/main/examples/basics) de PageTop: +//! ```rust +//! use pagetop::prelude::*; +//! +//! define_handle!(APP_HELLO_WORLD); +//! +//! struct HelloWorld; +//! +//! impl ModuleTrait for HelloWorld { +//! fn handle(&self) -> Handle { +//! APP_HELLO_WORLD +//! } +//! +//! fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { +//! cfg.service(hello_world); +//! } +//! } +//! +//! #[service::get("/")] +//! async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { +//! Page::new(request) +//! .with_in("content", Html::with(html! { h1 { "Hello World!" } })) +//! .render() +//! } +//! +//! #[actix_web::main] +//! async fn main() -> std::io::Result<()> { +//! Application::prepare(&HelloWorld).unwrap().run()?.await +//! } +//! ``` +//! Este programa crea un módulo llamado `HelloWorld` con un servicio que devuelve una página web +//! saludando al mundo cada vez que se accede desde el navegador a `http://localhost:8088` (según +//! los [ajustes de configuración](`config::Server`) predeterminados). // ************************************************************************************************* // GLOBAL. From dc56f9038897eeefcac788fb7fbce58dc896b755 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 10 Jun 2023 13:41:56 +0200 Subject: [PATCH 368/853] =?UTF-8?q?=F0=9F=93=9D=20Primera=20referencia=20a?= =?UTF-8?q?=20c=C3=B3mo=20extender=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/lib.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 420b9a07..42554ba7 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -71,6 +71,31 @@ //! Este programa crea un módulo llamado `HelloWorld` con un servicio que devuelve una página web //! saludando al mundo cada vez que se accede desde el navegador a `http://localhost:8088` (según //! los [ajustes de configuración](`config::Server`) predeterminados). +//! +//! # 🧱 Extendiendo PageTop +//! +//! La API de PageTop no sólo sirve para crear aplicaciones, también permite extender sus +//! funcionalidades con el desarrollo de acciones, componentes, módulos o nuevos temas: +//! +//! * Las **acciones** permiten alterar el comportamiento del propio funcionamiento interno de +//! PageTop. Las acciones se ofrecen al desarrollador para interactuar con la ejecución de +//! procesos que pueden ser modificados. +//! * Los **componentes** incluyen código HTML, CSS y/o Javascript en unidades que tienen una +//! funcionalidad bien definida y configurable durante la creación de páginas web. +//! * Los **módulos** añaden funcionalidades o modifican las ya existentes usando las APIs globales +//! o las de otros módulos de PageTop o de terceros. +//! * Los **temas** son módulos que permiten cambiar la disposición y el aspecto de las páginas y +//! componentes sin necesidad de alterar su funcionamiento. Estructuran las páginas en regiones +//! donde disponer los diferentes componentes. +//! +//! # 🧩 Dependencias +//! +//! Las aplicaciones usarán `cargo` para resolver las dependencias entre PageTop y las extensiones +//! de terceros que implementen acciones, componentes, módulos y/o temas; de la misma manera que se +//! hace en cualquier otro proyecto. +//! +//! Pero también deberán declararse explícitamente estas dependencias en cada módulo para ayudar a +//! PageTop a estructurar e inicializar modularmente la aplicación. // ************************************************************************************************* // GLOBAL. From a4554880449e8f9fb84b3a1cc42de4bab9bd8551 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 10 Jun 2023 18:44:00 +0200 Subject: [PATCH 369/853] =?UTF-8?q?=F0=9F=93=9D=20Retoques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 8 +++++++- pagetop/src/db.rs | 17 +++++++++-------- pagetop/src/lib.rs | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index abe7c132..298295dc 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -6,11 +6,17 @@ configuración y delegar su asignación a tipos seguros según los requerimientos de cada módulo, tema o aplicación. -* PageTop incorpora una versión adaptada del excelente crate [maud](https://crates.io/crates/maud) +* PageTop incorpora una versión adaptada del excelente *crate* [maud](https://crates.io/crates/maud) de [Chris Wong](https://crates.io/users/lambda-fairy) (versión [0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud)), para añadir sus funcionalidades sin requerir la referencia a `maud` en el archivo `Cargo.toml` de cada proyecto. +* PageTop usa los reconocidos *crates* [SQLx](https://github.com/launchbadge/sqlx) y + [SeaQuery](https://github.com/SeaQL/sea-query) para interactuar con bases de datos. Sin embargo, + para restringir las migraciones a módulos, se ha integrado en el código una versión modificada de + [SeaORM Migration](https://github.com/SeaQL/sea-orm/tree/master/sea-orm-migration) (versión + [0.11.3](https://github.com/SeaQL/sea-orm/tree/0.11.3/sea-orm-migration/src)). + # 🗚 FIGfonts diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 035c3fc6..c94c73ad 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -101,15 +101,16 @@ pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { .await } -// El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.9.1) -// https://github.com/SeaQL/sea-orm/tree/0.9.1/sea-orm-migration para evitar los errores generados -// por el paradigma modular de PageTop. Se copian los siguientes archivos del original: +// El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.11.3) +// https://github.com/SeaQL/sea-orm/tree/0.11.3/sea-orm-migration para evitar los errores generados +// por el paradigma modular de PageTop. Se integran los siguientes archivos del original: // -// lib.rs => db/migration.rs (descartando el uso de algunos módulos y exportaciones) -// manager.rs => db/migration/manager.rs -// migrator.rs => db/migration/migrator.rs (suprimiendo la gestión de los errores) -// prelude.rs => db/migration/prelude.rs (evitando cli) -// seaql_migrations.rs => db/migration/seaql_migrations.rs +// lib.rs => db/migration.rs . . . . . . . . . .(descartando algunos módulos y exportaciones) +// connection.rs => db/migration/connection.rs . . . . . . . . . . . . . . . . . . (completo) +// manager.rs => db/migration/manager.rs . . . . . . . . . . . . . . . . . . . . . (completo) +// migrator.rs => db/migration/migrator.rs . . . . . .(suprimiendo la gestión de los errores) +// prelude.rs => db/migration/prelude.rs . . . . . . . . . . . . . . . . . . . (evitando cli) +// seaql_migrations.rs => db/migration/seaql_migrations.rs . . . . . . . . . . . . (completo) // mod migration; pub use migration::prelude::*; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 42554ba7..f646876f 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -35,7 +35,7 @@ //! **PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios //! son constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. //! -//! # 🏃‍♀️ Inicio rápido +//! # ⚡️ Inicio rápido //! //! Puedes encontrar este código en el repositorio de ejemplos //! [básicos](https://github.com/manuelcillero/pagetop/tree/main/examples/basics) de PageTop: From 4ae6580357e8f6d8a80284628702bea028126ed9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 11 Jun 2023 03:29:25 +0200 Subject: [PATCH 370/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20funcionalidade?= =?UTF-8?q?s=20en=20bundles=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 6 ++ pagetop-minimal/src/component/container.rs | 6 ++ .../src/component/form_element/form.rs | 6 ++ pagetop-minimal/src/component/grid/column.rs | 6 ++ pagetop-minimal/src/component/grid/row.rs | 6 ++ pagetop-minimal/src/component/paragraph.rs | 6 ++ pagetop/src/base/component/block.rs | 18 ++++-- pagetop/src/base/theme/basic.rs | 6 +- pagetop/src/core/component.rs | 2 +- pagetop/src/core/component/bundle.rs | 64 ++++++++++++++++++- pagetop/src/prelude.rs | 3 + 11 files changed, 114 insertions(+), 15 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 6e90733d..10603b62 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -260,6 +260,12 @@ impl MegaMenu { self } + #[fn_builder] + pub fn alter_bundle(&mut self, op: BundleOp, item: MegaMenuItem) -> &mut Self { + self.items.alter_bundle(op, item); + self + } + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 9fa319cd..407ee162 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -164,6 +164,12 @@ impl Container { self } + #[fn_builder] + pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_bundle(op, component); + self + } + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 303de41b..ec781bbb 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -130,6 +130,12 @@ impl Form { self } + #[fn_builder] + pub fn alter_bundle(&mut self, op: BundleOp, element: impl ComponentTrait) -> &mut Self { + self.elements.alter_bundle(op, element); + self + } + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index c27b12f7..928e5b0d 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -145,6 +145,12 @@ impl Column { self } + #[fn_builder] + pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_bundle(op, component); + self + } + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 5c5955e4..cd992acf 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -92,6 +92,12 @@ impl Row { self } + #[fn_builder] + pub fn alter_bundle(&mut self, op: BundleOp, column: grid::Column) -> &mut Self { + self.columns.alter_bundle(op, column); + self + } + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 9e6b1df5..a8856294 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -103,6 +103,12 @@ impl Paragraph { self } + #[fn_builder] + pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_bundle(op, component); + self + } + #[rustfmt::skip] #[fn_builder] pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 8ec5dd42..8862bf81 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -67,6 +67,12 @@ impl ComponentTrait for Block { impl Block { // Block BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, weight: isize) -> &mut Self { self.weight = weight; @@ -79,12 +85,6 @@ impl Block { self } - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { self.classes.alter_value(op, classes); @@ -103,6 +103,12 @@ impl Block { self } + #[fn_builder] + pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_bundle(op, component); + self + } + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index f108c5ea..3be823e6 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -1,8 +1,4 @@ -use crate::core::module::ModuleTrait; -use crate::core::theme::{ThemeStaticRef, ThemeTrait}; -use crate::html::Favicon; -use crate::response::page::Page; -use crate::{define_handle, serve_static_files, service, Handle}; +use crate::prelude::*; define_handle!(THEME_BASIC); diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index ee186937..8eca2686 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -8,7 +8,7 @@ mod one; pub use one::OneComponent; mod bundle; -pub use bundle::ComponentsBundle; +pub use bundle::{BundleOp, ComponentsBundle}; mod renderable; pub use renderable::{IsRenderable, Renderable}; diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 63feee4c..3fa59c25 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -3,6 +3,16 @@ use crate::html::{html, Markup}; use std::sync::{Arc, RwLock}; +pub enum BundleOp { + Add, + AddAfterId(&'static str), + AddBeforeId(&'static str), + AddFirst, + RemoveById(&'static str), + ReplaceById(&'static str), + Reset, +} + #[derive(Clone, Default)] pub struct ComponentsBundle(Vec<Arc<RwLock<dyn ComponentTrait>>>); @@ -31,14 +41,62 @@ impl ComponentsBundle { } } - pub fn add(&mut self, component: impl ComponentTrait) { + // ComponentsBundle BUILDER. + + pub fn add(&mut self, component: impl ComponentTrait) -> &mut Self { self.0.push(Arc::new(RwLock::new(component))); + self } - pub fn clear(&mut self) { - self.0.clear(); + pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + let arc = Arc::new(RwLock::new(component)); + match op { + BundleOp::Add => self.0.push(arc), + BundleOp::AddAfterId(id) => { + match self + .0 + .iter() + .position(|c| c.read().unwrap().id().as_deref() == Some(id)) + { + Some(index) => self.0.insert(index + 1, arc), + _ => self.0.push(arc), + } + } + BundleOp::AddBeforeId(id) => { + match self + .0 + .iter() + .position(|c| c.read().unwrap().id().as_deref() == Some(id)) + { + Some(index) => self.0.insert(index, arc), + _ => self.0.insert(0, arc), + } + } + BundleOp::AddFirst => self.0.insert(0, arc), + BundleOp::RemoveById(id) => { + if let Some(index) = self + .0 + .iter() + .position(|c| c.read().unwrap().id().as_deref() == Some(id)) + { + self.0.remove(index); + } + } + BundleOp::ReplaceById(id) => { + for c in self.0.iter_mut() { + if c.read().unwrap().id().as_deref() == Some(id) { + *c = arc; + break; + } + } + } + BundleOp::Reset => self.0.clear(), + } + self } + // ComponentsBundle RENDER. + pub fn render(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index bb028fff..17659ccc 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -9,6 +9,9 @@ pub use crate::{ // Macros declarativas globales. pub use crate::{args, define_config, define_handle, define_locale, serve_static_files}; +// Traducciones globales. +pub use crate::LOCALE_PAGETOP; + // Funciones útiles. pub use crate::util; From b2a7c71c1fd560ca5890e42d3a4c70469afc0e8c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 11 Jun 2023 04:10:34 +0200 Subject: [PATCH 371/853] =?UTF-8?q?=F0=9F=9A=A7=20Retoque?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/bundle.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 3fa59c25..0ac44c26 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -44,8 +44,7 @@ impl ComponentsBundle { // ComponentsBundle BUILDER. pub fn add(&mut self, component: impl ComponentTrait) -> &mut Self { - self.0.push(Arc::new(RwLock::new(component))); - self + self.alter_bundle(BundleOp::Add, component) } pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { From 7a6cb4dbfa6390544d02213ec949b2dc9473e091 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 11 Jun 2023 18:58:49 +0200 Subject: [PATCH 372/853] =?UTF-8?q?=F0=9F=9A=A7=20Normaliza=20el=20uso=20d?= =?UTF-8?q?e=20los=20bundles=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 8 +++----- pagetop-minimal/src/component/container.rs | 8 +++----- pagetop-minimal/src/component/form_element/form.rs | 8 +++----- pagetop-minimal/src/component/grid/column.rs | 8 +++----- pagetop-minimal/src/component/grid/row.rs | 8 +++----- pagetop-minimal/src/component/paragraph.rs | 8 +++----- pagetop/src/base/component/block.rs | 8 +++----- pagetop/src/core/component/bundle.rs | 8 +++----- pagetop/src/core/theme/regions.rs | 4 ++-- 9 files changed, 26 insertions(+), 42 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 10603b62..8068038b 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -254,14 +254,12 @@ impl MegaMenu { self } - #[fn_builder] - pub fn alter_item(&mut self, item: MegaMenuItem) -> &mut Self { - self.items.add(item); + pub fn with_item(mut self, item: MegaMenuItem) -> Self { + self.items.alter_bundle(BundleOp::Add, item); self } - #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, item: MegaMenuItem) -> &mut Self { + pub fn alter_items(&mut self, op: BundleOp, item: MegaMenuItem) -> &mut Self { self.items.alter_bundle(op, item); self } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 407ee162..860865dc 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -158,14 +158,12 @@ impl Container { self } - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.components.alter_bundle(BundleOp::Add, component); self } - #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { self.components.alter_bundle(op, component); self } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index ec781bbb..5f76384f 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -124,14 +124,12 @@ impl Form { self } - #[fn_builder] - pub fn alter_element(&mut self, element: impl ComponentTrait) -> &mut Self { - self.elements.add(element); + pub fn with_element(mut self, element: impl ComponentTrait) -> Self { + self.elements.alter_bundle(BundleOp::Add, element); self } - #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, element: impl ComponentTrait) -> &mut Self { + pub fn alter_elements(&mut self, op: BundleOp, element: impl ComponentTrait) -> &mut Self { self.elements.alter_bundle(op, element); self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 928e5b0d..b66b6ae3 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -139,14 +139,12 @@ impl Column { self } - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.components.alter_bundle(BundleOp::Add, component); self } - #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { self.components.alter_bundle(op, component); self } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index cd992acf..1e68d741 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -86,14 +86,12 @@ impl Row { self } - #[fn_builder] - pub fn alter_column(&mut self, column: grid::Column) -> &mut Self { - self.columns.add(column); + pub fn with_column(mut self, column: grid::Column) -> Self { + self.columns.alter_bundle(BundleOp::Add, column); self } - #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, column: grid::Column) -> &mut Self { + pub fn alter_columns(&mut self, op: BundleOp, column: grid::Column) -> &mut Self { self.columns.alter_bundle(op, column); self } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index a8856294..0c01a3d3 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -97,14 +97,12 @@ impl Paragraph { self } - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.components.alter_bundle(BundleOp::Add, component); self } - #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { self.components.alter_bundle(op, component); self } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 8862bf81..f0da3320 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -97,14 +97,12 @@ impl Block { self } - #[fn_builder] - pub fn alter_component(&mut self, component: impl ComponentTrait) -> &mut Self { - self.components.add(component); + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.components.alter_bundle(BundleOp::Add, component); self } - #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { self.components.alter_bundle(op, component); self } diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 0ac44c26..77f8cadf 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,4 +1,5 @@ use crate::core::component::{ComponentTrait, RenderContext}; +use crate::fn_builder; use crate::html::{html, Markup}; use std::sync::{Arc, RwLock}; @@ -23,7 +24,7 @@ impl ComponentsBundle { pub fn new_with(component: impl ComponentTrait) -> Self { let mut bundle = ComponentsBundle::new(); - bundle.add(component); + bundle.alter_bundle(BundleOp::Add, component); bundle } @@ -43,10 +44,7 @@ impl ComponentsBundle { // ComponentsBundle BUILDER. - pub fn add(&mut self, component: impl ComponentTrait) -> &mut Self { - self.alter_bundle(BundleOp::Add, component) - } - + #[fn_builder] pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { let arc = Arc::new(RwLock::new(component)); match op { diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 8c42d088..d2d32122 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ComponentTrait, ComponentsBundle}; +use crate::core::component::{BundleOp, ComponentTrait, ComponentsBundle}; use crate::LazyStatic; use std::collections::HashMap; @@ -17,7 +17,7 @@ impl ComponentsRegions { pub fn add_to(&mut self, region: &'static str, component: impl ComponentTrait) { if let Some(region) = self.0.get_mut(region) { - region.add(component); + region.alter_bundle(BundleOp::Add, component); } else { self.0.insert(region, ComponentsBundle::new_with(component)); } From bf3b546640798be27c7d65ca08bf2e6d9cca4ae6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 13 Jun 2023 22:15:14 +0200 Subject: [PATCH 373/853] =?UTF-8?q?=E2=9C=A8=20Nuevos=20m=C3=A9todos=20par?= =?UTF-8?q?a=20la=20API=20de=20bundles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/bundle.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 77f8cadf..06cba0a2 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,6 +1,6 @@ use crate::core::component::{ComponentTrait, RenderContext}; -use crate::fn_builder; use crate::html::{html, Markup}; +use crate::{fn_builder, Handle}; use std::sync::{Arc, RwLock}; @@ -14,8 +14,10 @@ pub enum BundleOp { Reset, } +pub type ArcLockComponent = Arc<RwLock<dyn ComponentTrait>>; + #[derive(Clone, Default)] -pub struct ComponentsBundle(Vec<Arc<RwLock<dyn ComponentTrait>>>); +pub struct ComponentsBundle(Vec<ArcLockComponent>); impl ComponentsBundle { pub fn new() -> Self { @@ -92,6 +94,26 @@ impl ComponentsBundle { self } + // ComponentsBundle GETTERS. + + pub fn get_by_id(&self, id: &'static str) -> Option<&ArcLockComponent> { + self.0 + .iter() + .find(|&c| c.read().unwrap().id().as_deref() == Some(id)) + } + + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcLockComponent> { + self.0 + .iter() + .filter(|&c| c.read().unwrap().id().as_deref() == Some(id)) + } + + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcLockComponent> { + self.0 + .iter() + .filter(move |&c| c.read().unwrap().handle() == handle) + } + // ComponentsBundle RENDER. pub fn render(&self, rcx: &mut RenderContext) -> Markup { From aa1f58d11ae142955425c4b17561888009809ebd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 21 Jun 2023 23:14:27 +0200 Subject: [PATCH 374/853] =?UTF-8?q?=F0=9F=9A=9A=20Homogeiniza=20uso=20de?= =?UTF-8?q?=20archivos=20de=20localizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- .../src/{locales => locale}/en-US/admin.ftl | 0 .../src/{locales => locale}/es-ES/admin.ftl | 0 pagetop-bootsier/build.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- .../locales => src/locale}/en-US/bootsier.ftl | 0 .../locales => src/locale}/en-US/regions.ftl | 0 .../locales => src/locale}/es-ES/bootsier.ftl | 0 .../locales => src/locale}/es-ES/regions.ftl | 0 .../static/{theme => }/css/bootstrap.min.css | 0 .../{theme => }/css/bootstrap.min.css.map | 0 .../static/{theme => }/images/caution.png | Bin .../{theme => }/js/bootstrap.bundle.min.js | 0 .../js/bootstrap.bundle.min.js.map | 0 pagetop-homedemo/src/lib.rs | 2 +- .../{locales => locale}/en-US/homepage.ftl | 0 .../{locales => locale}/es-ES/homepage.ftl | 0 pagetop-node/src/lib.rs | 2 +- .../{locales => locale}/en-US/homepage.ftl | 0 .../{locales => locale}/es-ES/homepage.ftl | 0 pagetop-user/src/lib.rs | 2 +- .../{locales => locale}/en-US/homepage.ftl | 0 .../{locales => locale}/es-ES/homepage.ftl | 0 pagetop/src/lib.rs | 2 +- pagetop/src/locale.rs | 45 +++++++++--------- .../locales => src/locale}/en-US/theme.ftl | 0 .../locales => src/locale}/es-ES/theme.ftl | 0 27 files changed, 29 insertions(+), 30 deletions(-) rename pagetop-admin/src/{locales => locale}/en-US/admin.ftl (100%) rename pagetop-admin/src/{locales => locale}/es-ES/admin.ftl (100%) rename pagetop-bootsier/{static/locales => src/locale}/en-US/bootsier.ftl (100%) rename pagetop-bootsier/{static/locales => src/locale}/en-US/regions.ftl (100%) rename pagetop-bootsier/{static/locales => src/locale}/es-ES/bootsier.ftl (100%) rename pagetop-bootsier/{static/locales => src/locale}/es-ES/regions.ftl (100%) rename pagetop-bootsier/static/{theme => }/css/bootstrap.min.css (100%) rename pagetop-bootsier/static/{theme => }/css/bootstrap.min.css.map (100%) rename pagetop-bootsier/static/{theme => }/images/caution.png (100%) rename pagetop-bootsier/static/{theme => }/js/bootstrap.bundle.min.js (100%) rename pagetop-bootsier/static/{theme => }/js/bootstrap.bundle.min.js.map (100%) rename pagetop-homedemo/src/{locales => locale}/en-US/homepage.ftl (100%) rename pagetop-homedemo/src/{locales => locale}/es-ES/homepage.ftl (100%) rename pagetop-node/src/{locales => locale}/en-US/homepage.ftl (100%) rename pagetop-node/src/{locales => locale}/es-ES/homepage.ftl (100%) rename pagetop-user/src/{locales => locale}/en-US/homepage.ftl (100%) rename pagetop-user/src/{locales => locale}/es-ES/homepage.ftl (100%) rename pagetop/{static/locales => src/locale}/en-US/theme.ftl (100%) rename pagetop/{static/locales => src/locale}/es-ES/theme.ftl (100%) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 81eb45f4..7f0f0390 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_ADMIN); -define_locale!(LOCALE_ADMIN, "src/locales"); +define_locale!(LOCALE_ADMIN, "src/locale"); mod summary; diff --git a/pagetop-admin/src/locales/en-US/admin.ftl b/pagetop-admin/src/locale/en-US/admin.ftl similarity index 100% rename from pagetop-admin/src/locales/en-US/admin.ftl rename to pagetop-admin/src/locale/en-US/admin.ftl diff --git a/pagetop-admin/src/locales/es-ES/admin.ftl b/pagetop-admin/src/locale/es-ES/admin.ftl similarity index 100% rename from pagetop-admin/src/locales/es-ES/admin.ftl rename to pagetop-admin/src/locale/es-ES/admin.ftl diff --git a/pagetop-bootsier/build.rs b/pagetop-bootsier/build.rs index 0fbb64f7..43a25bd1 100644 --- a/pagetop-bootsier/build.rs +++ b/pagetop-bootsier/build.rs @@ -1,3 +1,3 @@ fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static/theme", "bootsier", None) + pagetop_build::bundle_resources("./static", "bootsier", None) } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 4075a821..08ef6288 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(THEME_BOOTSIER); -define_locale!(LOCALE_BOOTSIER, "static/locales"); +define_locale!(LOCALE_BOOTSIER, "src/locale"); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); diff --git a/pagetop-bootsier/static/locales/en-US/bootsier.ftl b/pagetop-bootsier/src/locale/en-US/bootsier.ftl similarity index 100% rename from pagetop-bootsier/static/locales/en-US/bootsier.ftl rename to pagetop-bootsier/src/locale/en-US/bootsier.ftl diff --git a/pagetop-bootsier/static/locales/en-US/regions.ftl b/pagetop-bootsier/src/locale/en-US/regions.ftl similarity index 100% rename from pagetop-bootsier/static/locales/en-US/regions.ftl rename to pagetop-bootsier/src/locale/en-US/regions.ftl diff --git a/pagetop-bootsier/static/locales/es-ES/bootsier.ftl b/pagetop-bootsier/src/locale/es-ES/bootsier.ftl similarity index 100% rename from pagetop-bootsier/static/locales/es-ES/bootsier.ftl rename to pagetop-bootsier/src/locale/es-ES/bootsier.ftl diff --git a/pagetop-bootsier/static/locales/es-ES/regions.ftl b/pagetop-bootsier/src/locale/es-ES/regions.ftl similarity index 100% rename from pagetop-bootsier/static/locales/es-ES/regions.ftl rename to pagetop-bootsier/src/locale/es-ES/regions.ftl diff --git a/pagetop-bootsier/static/theme/css/bootstrap.min.css b/pagetop-bootsier/static/css/bootstrap.min.css similarity index 100% rename from pagetop-bootsier/static/theme/css/bootstrap.min.css rename to pagetop-bootsier/static/css/bootstrap.min.css diff --git a/pagetop-bootsier/static/theme/css/bootstrap.min.css.map b/pagetop-bootsier/static/css/bootstrap.min.css.map similarity index 100% rename from pagetop-bootsier/static/theme/css/bootstrap.min.css.map rename to pagetop-bootsier/static/css/bootstrap.min.css.map diff --git a/pagetop-bootsier/static/theme/images/caution.png b/pagetop-bootsier/static/images/caution.png similarity index 100% rename from pagetop-bootsier/static/theme/images/caution.png rename to pagetop-bootsier/static/images/caution.png diff --git a/pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js b/pagetop-bootsier/static/js/bootstrap.bundle.min.js similarity index 100% rename from pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js rename to pagetop-bootsier/static/js/bootstrap.bundle.min.js diff --git a/pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js.map b/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map similarity index 100% rename from pagetop-bootsier/static/theme/js/bootstrap.bundle.min.js.map rename to pagetop-bootsier/static/js/bootstrap.bundle.min.js.map diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 86f10e12..c0d5c071 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; define_handle!(MODULE_DEMOHOME); -define_locale!(LOCALE_DEMOHOME, "src/locales"); +define_locale!(LOCALE_DEMOHOME, "src/locale"); include!(concat!(env!("OUT_DIR"), "/homedemo.rs")); diff --git a/pagetop-homedemo/src/locales/en-US/homepage.ftl b/pagetop-homedemo/src/locale/en-US/homepage.ftl similarity index 100% rename from pagetop-homedemo/src/locales/en-US/homepage.ftl rename to pagetop-homedemo/src/locale/en-US/homepage.ftl diff --git a/pagetop-homedemo/src/locales/es-ES/homepage.ftl b/pagetop-homedemo/src/locale/es-ES/homepage.ftl similarity index 100% rename from pagetop-homedemo/src/locales/es-ES/homepage.ftl rename to pagetop-homedemo/src/locale/es-ES/homepage.ftl diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 01092e5a..9803ac2f 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(MODULE_NODE); -define_locale!(LOCALE_NODE, "src/locales"); +define_locale!(LOCALE_NODE, "src/locale"); //mod entity; mod migration; diff --git a/pagetop-node/src/locales/en-US/homepage.ftl b/pagetop-node/src/locale/en-US/homepage.ftl similarity index 100% rename from pagetop-node/src/locales/en-US/homepage.ftl rename to pagetop-node/src/locale/en-US/homepage.ftl diff --git a/pagetop-node/src/locales/es-ES/homepage.ftl b/pagetop-node/src/locale/es-ES/homepage.ftl similarity index 100% rename from pagetop-node/src/locales/es-ES/homepage.ftl rename to pagetop-node/src/locale/es-ES/homepage.ftl diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 809feffa..99082194 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; define_handle!(MODULE_USER); -define_locale!(LOCALE_USER, "src/locales"); +define_locale!(LOCALE_USER, "src/locale"); mod migration; diff --git a/pagetop-user/src/locales/en-US/homepage.ftl b/pagetop-user/src/locale/en-US/homepage.ftl similarity index 100% rename from pagetop-user/src/locales/en-US/homepage.ftl rename to pagetop-user/src/locale/en-US/homepage.ftl diff --git a/pagetop-user/src/locales/es-ES/homepage.ftl b/pagetop-user/src/locale/es-ES/homepage.ftl similarity index 100% rename from pagetop-user/src/locales/es-ES/homepage.ftl rename to pagetop-user/src/locale/es-ES/homepage.ftl diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index f646876f..117ee21d 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -117,7 +117,7 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour pub type Handle = u64; -define_locale!(LOCALE_PAGETOP, "static/locales"); +define_locale!(LOCALE_PAGETOP, "src/locale"); // ************************************************************************************************* // APIs PÚBLICAS. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 4a3a0865..0367fd23 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -13,30 +13,29 @@ //! //! # Recursos Fluent //! -//! PageTop utiliza [fluent-templates](https://docs.rs/fluent-templates/) para integrar durante la -//! compilación los recursos de localización en el binario de la aplicación. En el siguiente ejemplo -//! agruparía todos los archivos y subdirectorios de *static/locales* que tienen un -//! [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido y los asignaría a su -//! identificador correspondiente: +//! PageTop usa [fluent-templates](https://docs.rs/fluent-templates/) para integrar los recursos de +//! localización en el binario de la aplicación. El siguiente ejemplo agrupa archivos y subcarpetas +//! de *src/locale* que tienen un [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) +//! válido y los asigna a su identificador correspondiente: //! //! ```text -//! static/locales -//! ├── common.ftl -//! ├── en-US -//! │ ├── default.ftl -//! │ └── main.ftl -//! ├── es-ES -//! │ ├── default.ftl -//! │ └── main.ftl -//! ├── es-MX -//! │ ├── default.ftl -//! │ └── main.ftl -//! └── fr -//! ├── default.ftl -//! └── main.ftl +//! src/locale/ +//! ├── common.ftl +//! ├── en-US/ +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-ES/ +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-MX/ +//! │ ├── default.ftl +//! │ └── main.ftl +//! └── fr/ +//! ├── default.ftl +//! └── main.ftl //! ``` //! -//! Ejemplo de un archivo *static/locales/en-US/main.ftl*: +//! Ejemplo de un archivo *src/locale/en-US/main.ftl*: //! //! ```text //! hello-world = Hello world! @@ -52,7 +51,7 @@ //! }. //! ``` //! -//! Ejemplo del archivo equivalente *static/locales/es-ES/main.ftl*: +//! Ejemplo del archivo equivalente *src/locale/es-ES/main.ftl*: //! //! ```text //! hello-world = Hola mundo! @@ -76,9 +75,9 @@ //! ``` //! use pagetop::prelude::*; //! -//! define_locale!(LOCALE_SAMPLE, "static/locales"); +//! define_locale!(LOCALE_SAMPLE, "src/locale"); //! ``` -//! Y utiliza el componente [L10n](crate::base::component::L10n) para incluir, en respuestas a las +//! Y usa el componente [L10n](crate::base::component::L10n) para incluir en las respuestas a //! peticiones web, textos y contenidos opcionalmente traducibles según el contexto de renderizado. use crate::{args, config, trace, LazyStatic}; diff --git a/pagetop/static/locales/en-US/theme.ftl b/pagetop/src/locale/en-US/theme.ftl similarity index 100% rename from pagetop/static/locales/en-US/theme.ftl rename to pagetop/src/locale/en-US/theme.ftl diff --git a/pagetop/static/locales/es-ES/theme.ftl b/pagetop/src/locale/es-ES/theme.ftl similarity index 100% rename from pagetop/static/locales/es-ES/theme.ftl rename to pagetop/src/locale/es-ES/theme.ftl From 66f67f41dc0bac4af2e7a73c58cff07bd63feb0b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 08:26:26 +0200 Subject: [PATCH 375/853] =?UTF-8?q?=F0=9F=9A=A7=20Renombra=20"define=5Fhan?= =?UTF-8?q?dle!()"=20por=20"use=5Fhandle!()"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- examples/basics/hello-name/src/main.rs | 2 +- examples/basics/hello-world/src/main.rs | 2 +- pagetop-admin/src/lib.rs | 2 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-megamenu/src/component.rs | 4 ++-- pagetop-megamenu/src/lib.rs | 2 +- pagetop-minimal/src/component/anchor.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- pagetop-minimal/src/component/form_element/button.rs | 2 +- pagetop-minimal/src/component/form_element/date.rs | 2 +- pagetop-minimal/src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/form_element/hidden.rs | 2 +- pagetop-minimal/src/component/form_element/input.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/icon.rs | 2 +- pagetop-minimal/src/component/image.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 2 +- pagetop-minimal/src/lib.rs | 2 +- pagetop-minimal/src/module/menu.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/base/action/before_render_component.rs | 2 +- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/html.rs | 2 +- pagetop/src/base/component/l10n.rs | 2 +- pagetop/src/base/theme/basic.rs | 2 +- pagetop/src/lib.rs | 2 +- pagetop/src/response/fatal_error/error403.rs | 4 ++-- pagetop/src/response/fatal_error/error404.rs | 4 ++-- pagetop/src/response/page/action.rs | 4 ++-- pagetop/src/util.rs | 2 +- 38 files changed, 42 insertions(+), 42 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 3dd60f73..63dcaccd 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(APP_DRUST); +use_handle!(APP_DRUST); struct Drust; diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index 4c9e148b..c02f4865 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(APP_HELLO_NAME); +use_handle!(APP_HELLO_NAME); struct HelloName; diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 028b971b..0d1a8e15 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(APP_HELLO_WORLD); +use_handle!(APP_HELLO_WORLD); struct HelloWorld; diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 7f0f0390..b99f9004 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(MODULE_ADMIN); +use_handle!(MODULE_ADMIN); define_locale!(LOCALE_ADMIN, "src/locale"); diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index d38e3eec..e9d1c11b 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(THEME_ALINER); +use_handle!(THEME_ALINER); include!(concat!(env!("OUT_DIR"), "/aliner.rs")); diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 08ef6288..8c4faca2 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(THEME_BOOTSIER); +use_handle!(THEME_BOOTSIER); define_locale!(LOCALE_BOOTSIER, "src/locale"); diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index d6d00dd5..d042757c 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -define_handle!(THEME_BULMIX); +use_handle!(THEME_BULMIX); include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index c0d5c071..eebede06 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -define_handle!(MODULE_DEMOHOME); +use_handle!(MODULE_DEMOHOME); define_locale!(LOCALE_DEMOHOME, "src/locale"); diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 103c584c..7a755f5a 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(MODULE_JQUERY); +use_handle!(MODULE_JQUERY); include!(concat!(env!("OUT_DIR"), "/jquery.rs")); diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 8068038b..974f5d11 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_MEGAMENUITEM); +use_handle!(COMPONENT_MEGAMENUITEM); type Label = OneComponent<L10n>; type Content = OneComponent<L10n>; @@ -151,7 +151,7 @@ impl MegaMenuItem { // MegaMenu. -define_handle!(COMPONENT_MEGAMENU); +use_handle!(COMPONENT_MEGAMENU); action_before_render_component!(ACTION_BEFORE_RENDER_MENU for MegaMenu); diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 5988d189..247d224c 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; pub mod component; -define_handle!(MODULE_MEGAMENU); +use_handle!(MODULE_MEGAMENU); include!(concat!(env!("OUT_DIR"), "/megamenu.rs")); diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index da7ba95c..c854d587 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::Icon; -define_handle!(COMPONENT_ANCHOR); +use_handle!(COMPONENT_ANCHOR); #[derive(Default)] pub enum AnchorType { diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 860865dc..8b960967 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_CONTAINER); +use_handle!(COMPONENT_CONTAINER); action_before_render_component!(ACTION_BEFORE_RENDER_CONTAINER for Container); diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index c661beaf..e06a979f 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_BUTTON); +use_handle!(COMPONENT_BUTTON); #[derive(Default)] pub enum ButtonType { diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 5b1d0751..5f42e3ea 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_DATE); +use_handle!(COMPONENT_DATE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 5f76384f..4da7c5d7 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_FORM); +use_handle!(COMPONENT_FORM); action_before_render_component!(ACTION_BEFORE_RENDER_FORM for Form); diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index f84ff07f..4ae86723 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_HIDDEN); +use_handle!(COMPONENT_HIDDEN); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index f9349dd0..c29d33ad 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_INPUT); +use_handle!(COMPONENT_INPUT); #[derive(Default)] pub enum InputType { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index b66b6ae3..7655dfa3 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_COLUMN); +use_handle!(COMPONENT_COLUMN); action_before_render_component!(ACTION_BEFORE_RENDER_COLUMN for Column); diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 1e68d741..a7eee37f 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::grid; -define_handle!(COMPONENT_ROW); +use_handle!(COMPONENT_ROW); action_before_render_component!(ACTION_BEFORE_RENDER_ROW for Row); diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 666fdbcd..2b847df4 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_HEADING); +use_handle!(COMPONENT_HEADING); #[derive(Default)] pub enum HeadingType { diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 730cbcac..d6676c4c 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_ICON); +use_handle!(COMPONENT_ICON); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index 840ef2ae..e7fc3cd1 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_IMAGE); +use_handle!(COMPONENT_IMAGE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 0c01a3d3..746c5c28 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(COMPONENT_PARAGRAPH); +use_handle!(COMPONENT_PARAGRAPH); #[derive(Default)] pub enum ParagraphDisplay { diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 1fae15fc..66b93dde 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -3,7 +3,7 @@ use pagetop::prelude::*; pub mod component; pub mod module; -define_handle!(MODULE_MINIMAL); +use_handle!(MODULE_MINIMAL); include!(concat!(env!("OUT_DIR"), "/minimal.rs")); diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 1bf38518..caad3c4e 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(MODULE_MENU); +use_handle!(MODULE_MENU); define_locale!(LOCALE_MENU, "src/module/menu/locales"); diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 9803ac2f..18df74e3 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -define_handle!(MODULE_NODE); +use_handle!(MODULE_NODE); define_locale!(LOCALE_NODE, "src/locale"); diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 99082194..806055ee 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -define_handle!(MODULE_USER); +use_handle!(MODULE_USER); define_locale!(LOCALE_USER, "src/locale"); diff --git a/pagetop/src/base/action/before_render_component.rs b/pagetop/src/base/action/before_render_component.rs index d738275d..e0a56aed 100644 --- a/pagetop/src/base/action/before_render_component.rs +++ b/pagetop/src/base/action/before_render_component.rs @@ -2,7 +2,7 @@ macro_rules! action_before_render_component { ( $ACTION_HANDLE:ident for $Component:ty ) => { $crate::paste! { - $crate::define_handle!($ACTION_HANDLE); + $crate::use_handle!($ACTION_HANDLE); type Action = fn(&$Component, &mut RenderContext); diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index f0da3320..dfdd74f5 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -define_handle!(COMPONENT_BLOCK); +use_handle!(COMPONENT_BLOCK); action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK for Block); diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 9d3690ab..eae2ba21 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -define_handle!(COMPONENT_HTML); +use_handle!(COMPONENT_HTML); #[derive(Default)] pub struct Html(Markup); diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index a825e6da..79f181e7 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use std::collections::HashMap; -define_handle!(COMPONENT_L10N); +use_handle!(COMPONENT_L10N); #[derive(Default)] pub enum L10nOp { diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index 3be823e6..d36a44fe 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -define_handle!(THEME_BASIC); +use_handle!(THEME_BASIC); include!(concat!(env!("OUT_DIR"), "/theme.rs")); diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 117ee21d..af0a8997 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -42,7 +42,7 @@ //! ```rust //! use pagetop::prelude::*; //! -//! define_handle!(APP_HELLO_WORLD); +//! use_handle!(APP_HELLO_WORLD); //! //! struct HelloWorld; //! diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index 80ab48e9..e0f6018d 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,8 +1,8 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; use crate::html::{html, Markup}; -use crate::{define_handle, Handle}; +use crate::{use_handle, Handle}; -define_handle!(ERROR_403); +use_handle!(ERROR_403); pub struct Error403; diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index cc808400..edd83420 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,8 +1,8 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; use crate::html::{html, Markup}; -use crate::{define_handle, Handle}; +use crate::{use_handle, Handle}; -define_handle!(ERROR_404); +use_handle!(ERROR_404); pub struct Error404; diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index eca5f51c..216d018d 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -1,8 +1,8 @@ use crate::core::action::{ActionTrait, AnyAction}; use crate::response::page::Page; -use crate::{define_handle, Handle}; +use crate::{use_handle, Handle}; -define_handle!(ACTION_BEFORE_RENDER_PAGE); +use_handle!(ACTION_BEFORE_RENDER_PAGE); type Action = fn(&mut Page); diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index cedb734d..1db1e655 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -81,7 +81,7 @@ macro_rules! args { } #[macro_export] -macro_rules! define_handle { +macro_rules! use_handle { ( $HANDLE:ident ) => { pub const $HANDLE: $crate::Handle = $crate::util::handle(module_path!(), file!(), line!(), column!()); From db93cc3f14538d692cac691f7438266169085539 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 08:30:35 +0200 Subject: [PATCH 376/853] =?UTF-8?q?=F0=9F=9A=A7=20Renombra=20"define=5Fcon?= =?UTF-8?q?fig!()"=20por=20"use=5Fconfig!()"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/config.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index e0c47130..3f764c70 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -51,7 +51,7 @@ //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Y luego declara con la macro [`define_config!`](crate::define_config) tus ajustes, usando tipos +//! Y luego declara con la macro [`use_config!`](crate::use_config) tus ajustes, usando tipos //! seguros y asignando los valores predefinidos para la estructura asociada: //! //! ``` @@ -71,7 +71,7 @@ //! pub height: u16, //! } //! -//! define_config!(MY_SETTINGS: MySettings, +//! use_config!(MY_SETTINGS as MySettings, //! // [myapp] //! "myapp.name" => "Value Name", //! "myapp.width" => 900, @@ -164,7 +164,7 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { /// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// /// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). -macro_rules! define_config { +macro_rules! use_config { ( $SETTINGS:ident as $Settings:ty $(, $key:literal => $value:literal)*$(,)* ) => { $crate::doc_comment! { concat!( @@ -306,7 +306,7 @@ pub struct Server { pub session_lifetime: i64, } -define_config!(SETTINGS as Settings, +use_config!(SETTINGS as Settings, // [app] "app.name" => "PageTop App", "app.description" => "Modular web solutions made simple with PageTop.", From 7fb30f9ee466bc659abbf59bfb9ff9da8fbbad03 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 08:33:15 +0200 Subject: [PATCH 377/853] =?UTF-8?q?=F0=9F=9A=A7=20Renombra=20"define=5Floc?= =?UTF-8?q?ale!()"=20por=20"use=5Flocale!()"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-minimal/src/module/menu.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/lib.rs | 2 +- pagetop/src/locale.rs | 4 ++-- pagetop/src/util.rs | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index b99f9004..61f10e5e 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_ADMIN); -define_locale!(LOCALE_ADMIN, "src/locale"); +use_locale!(LOCALE_ADMIN, "src/locale"); mod summary; diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 8c4faca2..34634afc 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(THEME_BOOTSIER); -define_locale!(LOCALE_BOOTSIER, "src/locale"); +use_locale!(LOCALE_BOOTSIER, "src/locale"); include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index eebede06..1bb7f3bd 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; use_handle!(MODULE_DEMOHOME); -define_locale!(LOCALE_DEMOHOME, "src/locale"); +use_locale!(LOCALE_DEMOHOME, "src/locale"); include!(concat!(env!("OUT_DIR"), "/homedemo.rs")); diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index caad3c4e..7fd844c1 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_MENU); -define_locale!(LOCALE_MENU, "src/module/menu/locales"); +use_locale!(LOCALE_MENU, "src/module/menu/locales"); pub struct Menu; diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 18df74e3..2548b57b 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_NODE); -define_locale!(LOCALE_NODE, "src/locale"); +use_locale!(LOCALE_NODE, "src/locale"); //mod entity; mod migration; diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 806055ee..fe5134c2 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; use_handle!(MODULE_USER); -define_locale!(LOCALE_USER, "src/locale"); +use_locale!(LOCALE_USER, "src/locale"); mod migration; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index af0a8997..e68e6ebd 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -117,7 +117,7 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour pub type Handle = u64; -define_locale!(LOCALE_PAGETOP, "src/locale"); +use_locale!(LOCALE_PAGETOP, "src/locale"); // ************************************************************************************************* // APIs PÚBLICAS. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 0367fd23..7954c4c4 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -70,12 +70,12 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL usa la macro -//! [`define_locale!`](crate::define_locale) para integrarlos en tu módulo o aplicación. +//! [`use_locale!`](crate::use_locale) para integrarlos en tu módulo o aplicación. //! //! ``` //! use pagetop::prelude::*; //! -//! define_locale!(LOCALE_SAMPLE, "src/locale"); +//! use_locale!(LOCALE_SAMPLE, "src/locale"); //! ``` //! Y usa el componente [L10n](crate::base::component::L10n) para incluir en las respuestas a //! peticiones web, textos y contenidos opcionalmente traducibles según el contexto de renderizado. diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 1db1e655..3fab7f02 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -90,7 +90,7 @@ macro_rules! use_handle { #[macro_export] /// Define un conjunto de elementos de localización y funciones locales de traducción. -macro_rules! define_locale { +macro_rules! use_locale { ( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; From f7faf4d34582d314589f3da7249eb1bf446d1e4d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 12:21:30 +0200 Subject: [PATCH 378/853] =?UTF-8?q?=F0=9F=92=A5=20Cmabia=20creaci=C3=B3n?= =?UTF-8?q?=20de=20recursos=20est=C3=A1ticos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-build/src/lib.rs | 70 +++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/pagetop-build/src/lib.rs b/pagetop-build/src/lib.rs index 126a798b..5e877d82 100644 --- a/pagetop-build/src/lib.rs +++ b/pagetop-build/src/lib.rs @@ -6,7 +6,7 @@ //! ```bash //! cd project_dir //! mkdir static -//! echo "Hello, world" > static/hello +//! echo "Hello, world!" > static/hello //! ``` //! //! Add to `Cargo.toml` the required dependencies: @@ -19,17 +19,26 @@ //! Add `build.rs` with call to bundle resources (*guides* will be the magic word in this example): //! //! ```rust#ignore +//! use pagetop_build::StaticFilesBundle; +//! //! fn main() -> std::io::Result<()> { -//! pagetop_build::bundle_resources("./static", "guides", None) +//! StaticFilesBundle::from_dir("./static") +//! .with_name("guides") +//! .build() //! } //! ``` //! //! Optionally, you can pass a function to filter those files into the `./static` folder which -//! should be excluded in the resources file: +//! should be excluded in the resources bundle: //! //! ```rust#ignore +//! use pagetop_build::StaticFilesBundle; +//! //! fn main() -> std::io::Result<()> { -//! pagetop_build::bundle_resources("./static", "guides", Some(except_css_dir)) +//! StaticFilesBundle::from_dir("./static") +//! .with_name("guides") +//! .with_filter(except_css_dir) +//! .build() //! } //! //! fn except_css_dir(p: &Path) -> bool { @@ -44,34 +53,49 @@ //! [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html) where all //! intermediate and output artifacts are placed during compilation. //! -//! You don't need to access this file, just include it in your project source code and a module -//! called `resources_guides` will be added. Then simply reference the `bundle_guides` function to -//! embed the generated HashMap resources collection: +//! You don't need to access this file, just include it in your project using the builder name as an +//! identifier: //! //! ```rust#ignore //! use pagetop::prelude::*; //! -//! include!(concat!(env!("OUT_DIR"), "/guides.rs")); -//! static RESOURCES: LazyStatic<HashMapResources> = LazyStatic::new(bundle_guides); +//! use_static!(guides); +//! ``` +//! +//! Also you can get the bundle as a static reference to the generated HashMap resources collection: +//! +//! ```rust#ignore +//! use pagetop::prelude::*; +//! +//! use_static!(guides => BUNDLE_GUIDES); //! ``` //! //! You can build more than one resources file to compile with your project. use std::path::Path; -pub fn bundle_resources( - from_dir: &str, - with_name: &str, - filtering: Option<fn(p: &Path) -> bool>, -) -> std::io::Result<()> { - let mut bundle = static_files::resource_dir(from_dir); - bundle.with_generated_filename( - Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", with_name)), - ); - bundle.with_module_name(format!("resources_{}", with_name)); - bundle.with_generated_fn(format!("bundle_{}", with_name)); - if let Some(filter_files) = filtering { - bundle.with_filter(filter_files); +pub struct StaticFilesBundle(static_files::ResourceDir); + +impl StaticFilesBundle { + pub fn from_dir(dir: &'static str) -> Self { + StaticFilesBundle(static_files::resource_dir(dir)) + } + + pub fn with_name(mut self, name: &'static str) -> Self { + self.0.with_generated_filename( + Path::new(std::env::var("OUT_DIR").unwrap().as_str()).join(format!("{}.rs", name)), + ); + self.0.with_module_name(format!("bundle_{}", name)); + self.0.with_generated_fn(name); + self + } + + pub fn with_filter(mut self, filter: fn(p: &Path) -> bool) -> Self { + self.0.with_filter(filter); + self + } + + pub fn build(self) -> std::io::Result<()> { + self.0.build() } - bundle.build() } From 32d068065e1194d3f359b43e31d83bca434ac14c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 12:30:56 +0200 Subject: [PATCH 379/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Incorpora=20nue?= =?UTF-8?q?va=20creaci=C3=B3n=20de=20recursos=20est=C3=A1ticos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/build.rs | 6 +++++- pagetop-bootsier/build.rs | 6 +++++- pagetop-bulmix/build.rs | 6 +++++- pagetop-homedemo/build.rs | 6 +++++- pagetop-jquery/build.rs | 6 +++++- pagetop-megamenu/build.rs | 6 +++++- pagetop-minimal/build.rs | 6 +++++- pagetop/build.rs | 6 +++++- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/pagetop-aliner/build.rs b/pagetop-aliner/build.rs index ba1cd204..2f0500aa 100644 --- a/pagetop-aliner/build.rs +++ b/pagetop-aliner/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "aliner", None) + StaticFilesBundle::from_dir("./static") + .with_name("aliner") + .build() } diff --git a/pagetop-bootsier/build.rs b/pagetop-bootsier/build.rs index 43a25bd1..05b11b3c 100644 --- a/pagetop-bootsier/build.rs +++ b/pagetop-bootsier/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "bootsier", None) + StaticFilesBundle::from_dir("./static") + .with_name("bootsier") + .build() } diff --git a/pagetop-bulmix/build.rs b/pagetop-bulmix/build.rs index 60a4c39f..85811cac 100644 --- a/pagetop-bulmix/build.rs +++ b/pagetop-bulmix/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "bulmix", None) + StaticFilesBundle::from_dir("./static") + .with_name("bulmix") + .build() } diff --git a/pagetop-homedemo/build.rs b/pagetop-homedemo/build.rs index c0c4e274..caa0fdf2 100644 --- a/pagetop-homedemo/build.rs +++ b/pagetop-homedemo/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "homedemo", None) + StaticFilesBundle::from_dir("./static") + .with_name("homedemo") + .build() } diff --git a/pagetop-jquery/build.rs b/pagetop-jquery/build.rs index 7ebea757..0acb6bed 100644 --- a/pagetop-jquery/build.rs +++ b/pagetop-jquery/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "jquery", None) + StaticFilesBundle::from_dir("./static") + .with_name("jquery") + .build() } diff --git a/pagetop-megamenu/build.rs b/pagetop-megamenu/build.rs index e981103b..4349cf15 100644 --- a/pagetop-megamenu/build.rs +++ b/pagetop-megamenu/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "megamenu", None) + StaticFilesBundle::from_dir("./static") + .with_name("megamenu") + .build() } diff --git a/pagetop-minimal/build.rs b/pagetop-minimal/build.rs index 4e3488af..cd0bc2b5 100644 --- a/pagetop-minimal/build.rs +++ b/pagetop-minimal/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static", "minimal", None) + StaticFilesBundle::from_dir("./static") + .with_name("minimal") + .build() } diff --git a/pagetop/build.rs b/pagetop/build.rs index b3903037..3e2d9749 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,3 +1,7 @@ +use pagetop_build::StaticFilesBundle; + fn main() -> std::io::Result<()> { - pagetop_build::bundle_resources("./static/theme", "theme", None) + StaticFilesBundle::from_dir("./static/theme") + .with_name("theme") + .build() } From bcf403ab50be0a3c16bb50c47773188994bb3613 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 12:31:43 +0200 Subject: [PATCH 380/853] =?UTF-8?q?=F0=9F=9A=A7=20Incopora=20recursos=20es?= =?UTF-8?q?t=C3=A1ticos=20con=20"use=5Fstatic!()"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/src/lib.rs | 4 ++-- pagetop-bootsier/src/lib.rs | 4 ++-- pagetop-bulmix/src/lib.rs | 4 ++-- pagetop-homedemo/src/lib.rs | 4 ++-- pagetop-jquery/src/lib.rs | 4 ++-- pagetop-megamenu/src/lib.rs | 4 ++-- pagetop-minimal/src/lib.rs | 4 ++-- pagetop/src/base/theme/basic.rs | 4 ++-- pagetop/src/prelude.rs | 2 +- pagetop/src/util.rs | 22 ++++++++++++++++++---- 10 files changed, 35 insertions(+), 21 deletions(-) diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index e9d1c11b..4b4a28b8 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(THEME_ALINER); -include!(concat!(env!("OUT_DIR"), "/aliner.rs")); +use_static!(aliner); pub struct Aliner; @@ -16,7 +16,7 @@ impl ModuleTrait for Aliner { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/aliner", bundle_aliner); + serve_static_files!(cfg, "/aliner", aliner); } } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 34634afc..91501290 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -4,7 +4,7 @@ use_handle!(THEME_BOOTSIER); use_locale!(LOCALE_BOOTSIER, "src/locale"); -include!(concat!(env!("OUT_DIR"), "/bootsier.rs")); +use_static!(bootsier); pub struct Bootsier; @@ -22,7 +22,7 @@ impl ModuleTrait for Bootsier { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/bootsier", bundle_bootsier); + serve_static_files!(cfg, "/bootsier", bootsier); } } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index d042757c..9831ee3f 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; use_handle!(THEME_BULMIX); -include!(concat!(env!("OUT_DIR"), "/bulmix.rs")); +use_static!(bulmix); pub struct Bulmix; @@ -25,7 +25,7 @@ impl ModuleTrait for Bulmix { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/bulmix", bundle_bulmix); + serve_static_files!(cfg, "/bulmix", bulmix); } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 1bb7f3bd..2af1f4ad 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -5,7 +5,7 @@ use_handle!(MODULE_DEMOHOME); use_locale!(LOCALE_DEMOHOME, "src/locale"); -include!(concat!(env!("OUT_DIR"), "/homedemo.rs")); +use_static!(homedemo); pub struct HomeDemo; @@ -27,7 +27,7 @@ impl ModuleTrait for HomeDemo { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/homedemo", bundle_homedemo); + serve_static_files!(cfg, "/homedemo", homedemo); cfg.route("/", service::web::get().to(demo)); } } diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 7a755f5a..216db02d 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_JQUERY); -include!(concat!(env!("OUT_DIR"), "/jquery.rs")); +use_static!(jquery); const JQUERY_PARAM: &str = "jquery.add"; const JQUERY_SOURCE: &str = "/jquery/3.6.0/jquery.min.js"; @@ -15,7 +15,7 @@ impl ModuleTrait for JQuery { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/jquery", bundle_jquery); + serve_static_files!(cfg, "/jquery", jquery); } } diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 247d224c..bf77e59c 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -4,7 +4,7 @@ pub mod component; use_handle!(MODULE_MEGAMENU); -include!(concat!(env!("OUT_DIR"), "/megamenu.rs")); +use_static!(megamenu); pub struct MegaMenu; @@ -18,6 +18,6 @@ impl ModuleTrait for MegaMenu { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/megamenu", bundle_megamenu); + serve_static_files!(cfg, "/megamenu", megamenu); } } diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 66b93dde..19604281 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -5,7 +5,7 @@ pub mod module; use_handle!(MODULE_MINIMAL); -include!(concat!(env!("OUT_DIR"), "/minimal.rs")); +use_static!(minimal); pub struct Minimal; @@ -15,6 +15,6 @@ impl ModuleTrait for Minimal { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/minimal", bundle_minimal); + serve_static_files!(cfg, "/minimal", minimal); } } diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index d36a44fe..357c84d2 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use_handle!(THEME_BASIC); -include!(concat!(env!("OUT_DIR"), "/theme.rs")); +use_static!(theme); pub struct Basic; @@ -16,7 +16,7 @@ impl ModuleTrait for Basic { } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/theme", bundle_theme); + serve_static_files!(cfg, "/theme", theme); } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 17659ccc..e3b10012 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -7,7 +7,7 @@ pub use crate::{ }; // Macros declarativas globales. -pub use crate::{args, define_config, define_handle, define_locale, serve_static_files}; +pub use crate::{args, serve_static_files, use_config, use_handle, use_locale, use_static}; // Traducciones globales. pub use crate::LOCALE_PAGETOP; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 3fab7f02..2503e47e 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -107,16 +107,30 @@ macro_rules! use_locale { }; } +#[macro_export] +macro_rules! use_static { + ( $bundle:ident ) => { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + }; + ( $bundle:ident => $STATIC:ident ) => { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new($bundle); + }; +} + #[macro_export] macro_rules! serve_static_files { - ( $cfg:ident, $dir:expr, $embed:ident ) => {{ + ( $cfg:ident, $path:expr, $bundle:ident ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service($crate::service::ResourceFiles::new($dir, $embed())); + $cfg.service($crate::service::ResourceFiles::new($path, $bundle())); } else { $cfg.service( - $crate::service::ActixFiles::new($dir, $crate::concat_string!(static_files, $dir)) - .show_files_listing(), + $crate::service::ActixFiles::new( + $path, + $crate::concat_string!(static_files, $path), + ) + .show_files_listing(), ); } }}; From 97b520340add5dbad069d16c639e74e97ca59095 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 13:38:15 +0200 Subject: [PATCH 381/853] =?UTF-8?q?=F0=9F=9A=A7=20Simplifica=20localizaci?= =?UTF-8?q?=C3=B3n=20para=20"src/locale"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-minimal/src/module/menu.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/lib.rs | 2 +- pagetop/src/locale.rs | 18 ++++++++++++++---- pagetop/src/util.rs | 16 +++++++++++++++- 9 files changed, 36 insertions(+), 12 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 61f10e5e..579df55e 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_ADMIN); -use_locale!(LOCALE_ADMIN, "src/locale"); +use_locale!(LOCALE_ADMIN); mod summary; diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 91501290..4a9d8d16 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(THEME_BOOTSIER); -use_locale!(LOCALE_BOOTSIER, "src/locale"); +use_locale!(LOCALE_BOOTSIER); use_static!(bootsier); diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 2af1f4ad..314917e9 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; use_handle!(MODULE_DEMOHOME); -use_locale!(LOCALE_DEMOHOME, "src/locale"); +use_locale!(LOCALE_DEMOHOME); use_static!(homedemo); diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 7fd844c1..b1188eac 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_MENU); -use_locale!(LOCALE_MENU, "src/module/menu/locales"); +use_locale!(LOCALE_MENU["src/module/menu/locales"]); pub struct Menu; diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 2548b57b..89c22ac9 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_NODE); -use_locale!(LOCALE_NODE, "src/locale"); +use_locale!(LOCALE_NODE); //mod entity; mod migration; diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index fe5134c2..9dfb312c 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -3,7 +3,7 @@ use pagetop_minimal::component::*; use_handle!(MODULE_USER); -use_locale!(LOCALE_USER, "src/locale"); +use_locale!(LOCALE_USER); mod migration; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index e68e6ebd..43520718 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -117,7 +117,7 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour pub type Handle = u64; -use_locale!(LOCALE_PAGETOP, "src/locale"); +use_locale!(LOCALE_PAGETOP); // ************************************************************************************************* // APIs PÚBLICAS. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 7954c4c4..e755a196 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -70,15 +70,25 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL usa la macro -//! [`use_locale!`](crate::use_locale) para integrarlos en tu módulo o aplicación. +//! [`use_locale!`](crate::use_locale) para integrarlos en tu módulo o aplicación. Si tus recursos +//! se encuentran en el directorio `"src/locale"` bastará con declarar: //! //! ``` //! use pagetop::prelude::*; //! -//! use_locale!(LOCALE_SAMPLE, "src/locale"); +//! use_locale!(LOCALE_SAMPLE); //! ``` -//! Y usa el componente [L10n](crate::base::component::L10n) para incluir en las respuestas a -//! peticiones web, textos y contenidos opcionalmente traducibles según el contexto de renderizado. +//! +//! Y si están en otro directorio, entonces puedes usar: +//! +//! ``` +//! use pagetop::prelude::*; +//! +//! use_locale!(LOCALE_SAMPLE["path/to/locale"]); +//! ``` +//! +//! Usa el componente [L10n](crate::base::component::L10n) para incluir textos y contenidos +//! opcionalmente traducibles según el contexto de renderizado. use crate::{args, config, trace, LazyStatic}; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 2503e47e..feb4eae1 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -91,7 +91,21 @@ macro_rules! use_handle { #[macro_export] /// Define un conjunto de elementos de localización y funciones locales de traducción. macro_rules! use_locale { - ( $LOCALES:ident, $dir_locales:literal $(, $core_locales:literal)? ) => { + ( $LOCALES:ident $(, $core_locales:literal)? ) => { + use $crate::locale::*; + + fluent_templates::static_loader! { + pub static $LOCALES = { + locales: "src/locale", + $( core_locales: $core_locales, )? + fallback_language: "en-US", + + // Elimina las marcas Unicode que delimitan los argumentos. + customise: |bundle| bundle.set_use_isolating(false), + }; + } + }; + ( $LOCALES:ident[$dir_locales:literal] $(, $core_locales:literal)? ) => { use $crate::locale::*; fluent_templates::static_loader! { From a33de4c92b47c4d85adead2b074a23a5b1c6e4f6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 23 Jun 2023 23:50:52 +0200 Subject: [PATCH 382/853] =?UTF-8?q?=F0=9F=92=A5=20Diferencia=20entre=20ren?= =?UTF-8?q?derizar=20y=20preparar=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 24 ++++----- pagetop-bulmix/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 4 +- pagetop/src/base/theme/basic.rs | 2 +- pagetop/src/core/theme/definition.rs | 18 ++++--- pagetop/src/response/page.rs | 7 ++- .../page/{action.rs => after_prepare_page.rs} | 12 ++--- .../src/response/page/before_prepare_page.rs | 51 +++++++++++++++++++ pagetop/src/response/page/definition.rs | 31 +++++++---- 11 files changed, 111 insertions(+), 46 deletions(-) rename pagetop/src/response/page/{action.rs => after_prepare_page.rs} (78%) create mode 100644 pagetop/src/response/page/before_prepare_page.rs diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 579df55e..8495bed3 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforeRenderPage => before_render_page)] + vec![action!(ActionBeforePreparePage => before_prepare_page)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { @@ -40,6 +40,6 @@ impl ModuleTrait for Admin { } } -fn before_render_page(page: &mut Page) { +fn before_prepare_page(page: &mut Page) { page.alter_body_classes(ClassesOp::Add, "test-admin"); } diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 4b4a28b8..ad1ef8f9 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -21,7 +21,7 @@ impl ModuleTrait for Aliner { } impl ThemeTrait for Aliner { - fn before_render_page(&self, page: &mut Page) { + fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::located("/aliner/css/styles.css").with_weight(-99), diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 4a9d8d16..88b07429 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -42,7 +42,7 @@ impl ThemeTrait for Bootsier { ] } - fn before_render_page(&self, page: &mut Page) { + fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::located("/bootsier/css/bootstrap.min.css") @@ -57,7 +57,7 @@ impl ThemeTrait for Bootsier { pagetop_jquery::JQuery::add_jquery(page.context()); } - fn render_page_body(&self, page: &mut Page) -> Markup { + fn prepare_page_body(&self, page: &mut Page) -> Markup { match page.template() { "admin" => html! { body class=[page.body_classes().get()] { @@ -66,22 +66,22 @@ impl ThemeTrait for Bootsier { "side-menu", "content" ] { - @if let Some(content) = page.render_region(region) { + @if let Some(content) = page.prepare_region(region) { #(region) { (content) } } } } }, _ => { - let header = page.render_region("header"); - let nav_branding = page.render_region("nav_branding"); - let nav_main = page.render_region("nav_main"); - let nav_additional = page.render_region("nav_additional"); - let breadcrumb = page.render_region("breadcrumb"); - let content = page.render_region("content"); - let sidebar_first = page.render_region("sidebar_first"); - let sidebar_second = page.render_region("sidebar_second"); - let footer = page.render_region("footer"); + let header = page.prepare_region("header"); + let nav_branding = page.prepare_region("nav_branding"); + let nav_main = page.prepare_region("nav_main"); + let nav_additional = page.prepare_region("nav_additional"); + let breadcrumb = page.prepare_region("breadcrumb"); + let content = page.prepare_region("content"); + let sidebar_first = page.prepare_region("sidebar_first"); + let sidebar_second = page.prepare_region("sidebar_second"); + let footer = page.prepare_region("footer"); html! { body class=[page.body_classes().get()] { @if header.is_some() { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 9831ee3f..b792bdb7 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Bulmix { } impl ThemeTrait for Bulmix { - fn before_render_page(&self, page: &mut Page) { + fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::located("/bulmix/css/bulma.min.css") diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 89c22ac9..c6f6d073 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforeRenderPage => before_render_page, -1)] + vec![action!(ActionBeforePreparePage => before_prepare_page, -1)] } fn migrations(&self) -> Vec<MigrationItem> { @@ -44,6 +44,6 @@ async fn node(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request).with_title(L10n::n("Nodo")).render() } -fn before_render_page(page: &mut Page) { +fn before_prepare_page(page: &mut Page) { page.alter_body_classes(ClassesOp::Add, "test-node"); } diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index 357c84d2..d38bb4df 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -21,7 +21,7 @@ impl ModuleTrait for Basic { } impl ThemeTrait for Basic { - fn before_render_page(&self, page: &mut Page) { + fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 23b3f6c4..8a344a1c 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -21,13 +21,9 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } #[allow(unused_variables)] - fn before_render_page(&self, page: &mut Page) { - if page.favicon().is_none() { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); - } - } + fn before_prepare_page(&self, page: &mut Page) {} - fn render_page_head(&self, page: &mut Page) -> Markup { + fn prepare_page_head(&self, page: &mut Page) -> Markup { let title = page.title(); let description = page.description(); let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; @@ -64,11 +60,11 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } } - fn render_page_body(&self, page: &mut Page) -> Markup { + fn prepare_page_body(&self, page: &mut Page) -> Markup { html! { body class=[page.body_classes().get()] { @for (region, _) in self.regions().iter() { - @if let Some(content) = page.render_region(region) { + @if let Some(content) = page.prepare_region(region) { #(region) { (content) } } } @@ -76,6 +72,12 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } } + fn after_prepare_page(&self, page: &mut Page) { + if page.favicon().is_none() { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); + } + } + #[rustfmt::skip] #[allow(unused_variables)] fn before_render_component( diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 724b2da4..799faa9f 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,7 +1,10 @@ pub use actix_web::Result as ResultPage; -mod action; -pub use action::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; +mod before_prepare_page; +pub use before_prepare_page::{ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE}; + +mod after_prepare_page; +pub use after_prepare_page::{ActionAfterPreparePage, ACTION_AFTER_PREPARE_PAGE}; mod definition; pub use definition::Page; diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/after_prepare_page.rs similarity index 78% rename from pagetop/src/response/page/action.rs rename to pagetop/src/response/page/after_prepare_page.rs index 216d018d..21f94976 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/after_prepare_page.rs @@ -2,25 +2,25 @@ use crate::core::action::{ActionTrait, AnyAction}; use crate::response::page::Page; use crate::{use_handle, Handle}; -use_handle!(ACTION_BEFORE_RENDER_PAGE); +use_handle!(ACTION_AFTER_PREPARE_PAGE); type Action = fn(&mut Page); -pub struct ActionBeforeRenderPage { +pub struct ActionAfterPreparePage { action: Option<Action>, weight: isize, } -impl ActionTrait for ActionBeforeRenderPage { +impl ActionTrait for ActionAfterPreparePage { fn new() -> Self { - ActionBeforeRenderPage { + ActionAfterPreparePage { action: None, weight: 0, } } fn handle(&self) -> Handle { - ACTION_BEFORE_RENDER_PAGE + ACTION_AFTER_PREPARE_PAGE } fn weight(&self) -> isize { @@ -32,7 +32,7 @@ impl ActionTrait for ActionBeforeRenderPage { } } -impl ActionBeforeRenderPage { +impl ActionAfterPreparePage { pub fn with_action(mut self, action: Action) -> Self { self.action = Some(action); self diff --git a/pagetop/src/response/page/before_prepare_page.rs b/pagetop/src/response/page/before_prepare_page.rs new file mode 100644 index 00000000..e246738a --- /dev/null +++ b/pagetop/src/response/page/before_prepare_page.rs @@ -0,0 +1,51 @@ +use crate::core::action::{ActionTrait, AnyAction}; +use crate::response::page::Page; +use crate::{use_handle, Handle}; + +use_handle!(ACTION_BEFORE_PREPARE_PAGE); + +type Action = fn(&mut Page); + +pub struct ActionBeforePreparePage { + action: Option<Action>, + weight: isize, +} + +impl ActionTrait for ActionBeforePreparePage { + fn new() -> Self { + ActionBeforePreparePage { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + ACTION_BEFORE_PREPARE_PAGE + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } +} + +impl ActionBeforePreparePage { + pub fn with_action(mut self, action: Action) -> Self { + self.action = Some(action); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, page: &mut Page) { + if let Some(action) = self.action { + action(page) + } + } +} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index cee80cb5..41f01a84 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -5,8 +5,9 @@ use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; -use crate::response::page::action::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; use crate::response::page::ResultPage; +use crate::response::page::{ActionAfterPreparePage, ACTION_AFTER_PREPARE_PAGE}; +use crate::response::page::{ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE}; use crate::{fn_builder, service}; use unic_langid::CharacterDirection; @@ -154,19 +155,27 @@ impl Page { // Page RENDER. pub fn render(&mut self) -> ResultPage<Markup, FatalError> { - // Acciones de los módulos antes de renderizar la página. - run_actions(ACTION_BEFORE_RENDER_PAGE, |action| { - action_ref::<ActionBeforeRenderPage>(&**action).run(self) + // Acciones de los módulos antes de preparar la página. + run_actions(ACTION_BEFORE_PREPARE_PAGE, |action| { + action_ref::<ActionBeforePreparePage>(&**action).run(self) }); - // Acciones del tema antes de renderizar la página. - self.context.theme().before_render_page(self); + // Acciones del tema antes de preparar la página. + self.context.theme().before_prepare_page(self); - // Primero, renderizar el cuerpo. - let body = self.context.theme().render_page_body(self); + // Primero, preparar el cuerpo. + let body = self.context.theme().prepare_page_body(self); - // Luego, renderizar la cabecera. - let head = self.context.theme().render_page_head(self); + // Luego, preparar la cabecera. + let head = self.context.theme().prepare_page_head(self); + + // Acciones de los módulos después de preparar la página. + run_actions(ACTION_AFTER_PREPARE_PAGE, |action| { + action_ref::<ActionAfterPreparePage>(&**action).run(self) + }); + + // Acciones del tema después de preparar la página. + self.context.theme().after_prepare_page(self); // Finalmente, renderizar la página. let lang = self.langid().language.as_str(); @@ -183,7 +192,7 @@ impl Page { }) } - pub fn render_region(&mut self, region: &str) -> Option<Markup> { + pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { let render = self .regions .get_extended_bundle(self.context.theme().single_name(), region) From a39fee9297232efe730c836be98ad9b4b4fcdb0a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 01:02:27 +0200 Subject: [PATCH 383/853] =?UTF-8?q?=F0=9F=92=A5=20Cambia=20renderizar=20po?= =?UTF-8?q?r=20preparar=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/action.rs | 4 +- ...omponent.rs => after_prepare_component.rs} | 14 ++-- .../base/action/before_prepare_component.rs | 67 +++++++++++++++++++ pagetop/src/base/component/block.rs | 10 +-- pagetop/src/base/component/html.rs | 2 +- pagetop/src/base/component/l10n.rs | 2 +- pagetop/src/core/component/bundle.rs | 4 +- pagetop/src/core/component/definition.rs | 38 +++++++---- pagetop/src/core/component/one.rs | 8 +-- pagetop/src/core/theme/definition.rs | 22 +++++- pagetop/src/prelude.rs | 2 +- pagetop/src/response/fatal_error/error403.rs | 2 +- pagetop/src/response/fatal_error/error404.rs | 2 +- pagetop/src/response/page/definition.rs | 6 +- 14 files changed, 142 insertions(+), 41 deletions(-) rename pagetop/src/base/action/{before_render_component.rs => after_prepare_component.rs} (81%) create mode 100644 pagetop/src/base/action/before_prepare_component.rs diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs index 512a2d69..de26ffe3 100644 --- a/pagetop/src/base/action.rs +++ b/pagetop/src/base/action.rs @@ -1 +1,3 @@ -mod before_render_component; +mod before_prepare_component; + +mod after_prepare_component; diff --git a/pagetop/src/base/action/before_render_component.rs b/pagetop/src/base/action/after_prepare_component.rs similarity index 81% rename from pagetop/src/base/action/before_render_component.rs rename to pagetop/src/base/action/after_prepare_component.rs index e0a56aed..44a9a4d5 100644 --- a/pagetop/src/base/action/before_render_component.rs +++ b/pagetop/src/base/action/after_prepare_component.rs @@ -1,19 +1,19 @@ #[macro_export] -macro_rules! action_before_render_component { +macro_rules! action_after_prepare_component { ( $ACTION_HANDLE:ident for $Component:ty ) => { $crate::paste! { $crate::use_handle!($ACTION_HANDLE); type Action = fn(&$Component, &mut RenderContext); - pub struct [<BeforeRender $Component>] { + pub struct [<AfterPrepare $Component>] { action: Option<Action>, weight: isize, } - impl ActionTrait for [<BeforeRender $Component>] { + impl ActionTrait for [<AfterPrepare $Component>] { fn new() -> Self { - [<BeforeRender $Component>] { + [<AfterPrepare $Component>] { action: None, weight: 0, } @@ -32,7 +32,7 @@ macro_rules! action_before_render_component { } } - impl [<BeforeRender $Component>] { + impl [<AfterPrepare $Component>] { #[allow(dead_code)] pub fn with_action(mut self, action: Action) -> Self { self.action = Some(action); @@ -53,12 +53,12 @@ macro_rules! action_before_render_component { } #[inline(always)] - pub fn run_actions_before_render_component( + pub fn run_actions_after_prepare_component( component: &mut $Component, rcx: &mut RenderContext ) { run_actions($ACTION_HANDLE, |action| - action_ref::<[<BeforeRender $Component>]>(&**action) + action_ref::<[<AfterPrepare $Component>]>(&**action) .run(component, rcx) ); } diff --git a/pagetop/src/base/action/before_prepare_component.rs b/pagetop/src/base/action/before_prepare_component.rs new file mode 100644 index 00000000..e0ed8eee --- /dev/null +++ b/pagetop/src/base/action/before_prepare_component.rs @@ -0,0 +1,67 @@ +#[macro_export] +macro_rules! action_before_prepare_component { + ( $ACTION_HANDLE:ident for $Component:ty ) => { + $crate::paste! { + $crate::use_handle!($ACTION_HANDLE); + + type Action = fn(&$Component, &mut RenderContext); + + pub struct [<BeforePrepare $Component>] { + action: Option<Action>, + weight: isize, + } + + impl ActionTrait for [<BeforePrepare $Component>] { + fn new() -> Self { + [<BeforePrepare $Component>] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + $ACTION_HANDLE + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [<BeforePrepare $Component>] { + #[allow(dead_code)] + pub fn with_action(mut self, action: Action) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { + if let Some(action) = self.action { + action(component, rcx) + } + } + } + + #[inline(always)] + pub fn run_actions_before_prepare_component( + component: &mut $Component, + rcx: &mut RenderContext + ) { + run_actions($ACTION_HANDLE, |action| + action_ref::<[<BeforePrepare $Component>]>(&**action) + .run(component, rcx) + ); + } + } + }; +} diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index dfdd74f5..3275676c 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use_handle!(COMPONENT_BLOCK); -action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK for Block); +action_before_prepare_component!(ACTION_BEFORE_PREPARE_BLOCK for Block); #[rustfmt::skip] #[derive(Default)] @@ -37,11 +37,11 @@ impl ComponentTrait for Block { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { - run_actions_before_render_component(self, rcx); + fn before_prepare(&mut self, rcx: &mut RenderContext) { + run_actions_before_prepare_component(self, rcx); } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { let id = rcx.required_id::<Block>(self.id()); html! { div id=(id) class=[self.classes().get()] { @@ -49,7 +49,7 @@ impl ComponentTrait for Block { h2 class="block-title" { (title) } } div class="block-body" { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index eae2ba21..e1a53268 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -14,7 +14,7 @@ impl ComponentTrait for Html { COMPONENT_HTML } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> Markup { html! { (self.html()) } } diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index 79f181e7..598794c5 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -28,7 +28,7 @@ impl ComponentTrait for L10n { COMPONENT_L10N } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { match self.op() { L10nOp::None => html! {}, L10nOp::Text(text) => html! { (text) }, diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 06cba0a2..8ceccbd0 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -116,12 +116,12 @@ impl ComponentsBundle { // ComponentsBundle RENDER. - pub fn render(&self, rcx: &mut RenderContext) -> Markup { + pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (" ")(c.write().unwrap().render(rcx))(" ") + (" ")(c.write().unwrap().prepare(rcx))(" ") } } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index fc7851e0..60609203 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -5,7 +5,7 @@ use crate::{util, Handle}; pub use std::any::Any as AnyComponent; pub trait BaseComponent { - fn render(&mut self, rcx: &mut RenderContext) -> Markup; + fn prepare(&mut self, rcx: &mut RenderContext) -> Markup; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -37,32 +37,44 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn before_render(&mut self, rcx: &mut RenderContext) {} + fn before_prepare(&mut self, rcx: &mut RenderContext) {} #[allow(unused_variables)] - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { html! {} } + #[allow(unused_variables)] + fn after_prepare(&mut self, rcx: &mut RenderContext) {} + fn as_ref_any(&self) -> &dyn AnyComponent; fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } impl<C: ComponentTrait> BaseComponent for C { - fn render(&mut self, rcx: &mut RenderContext) -> Markup { - // Acciones del componente antes de renderizar. - self.before_render(rcx); + fn prepare(&mut self, rcx: &mut RenderContext) -> Markup { + if self.is_renderable(rcx) { + // Acciones antes de preparar el componente. + self.before_prepare(rcx); - // Acciones del tema antes de renderizar el componente. - rcx.theme().before_render_component(self, rcx); + // Acciones del tema antes de preparar el componente. + rcx.theme().before_prepare_component(self, rcx); - match self.is_renderable(rcx) { - true => match rcx.theme().render_component(self, rcx) { + let markup = match rcx.theme().render_component(self, rcx) { Some(html) => html, - None => self.default_render(rcx), - }, - false => html! {}, + None => self.prepare_component(rcx), + }; + + // Acciones después de preparar el componente. + self.after_prepare(rcx); + + // Acciones del tema después de preparar el componente. + rcx.theme().after_prepare_component(self, rcx); + + markup + } else { + html! {} } } } diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs index bafa3b0b..79aefa48 100644 --- a/pagetop/src/core/component/one.rs +++ b/pagetop/src/core/component/one.rs @@ -21,16 +21,16 @@ impl<T: ComponentTrait + Default> OneComponent<T> { // OneComponent RENDER. - pub fn render(&self, rcx: &mut RenderContext) -> Markup { + pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { if let Some(component) = &self.0 { - return component.write().unwrap().render(rcx); + return component.write().unwrap().prepare(rcx); } html! {} } - pub fn optional_render(&self, rcx: &mut RenderContext) -> Option<Markup> { + pub fn prepare_optional(&self, rcx: &mut RenderContext) -> Option<Markup> { if let Some(component) = &self.0 { - let render = component.write().unwrap().render(rcx).into_string(); + let render = component.write().unwrap().prepare(rcx).into_string(); if !render.trim().is_empty() { return Some(html! { (render) }); } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 8a344a1c..c68bea0d 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -80,7 +80,27 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { #[rustfmt::skip] #[allow(unused_variables)] - fn before_render_component( + fn before_prepare_component( + &self, + component: &mut dyn ComponentTrait, + rcx: &mut RenderContext, + ) { + /* + Cómo usarlo: + + match component.handle() { + BLOCK_COMPONENT => { + let block = component_mut::<Block>(component); + block.alter_title("New title"); + }, + _ => {}, + } + */ + } + + #[rustfmt::skip] + #[allow(unused_variables)] + fn after_prepare_component( &self, component: &mut dyn ComponentTrait, rcx: &mut RenderContext, diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index e3b10012..ae67e289 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -30,7 +30,7 @@ pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::core::{action::*, component::*, module::*, theme::*}; -pub use crate::{action, action_before_render_component}; +pub use crate::{action, action_after_prepare_component, action_before_prepare_component}; pub use crate::base::component::*; diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index e0f6018d..1bf38614 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -15,7 +15,7 @@ impl ComponentTrait for Error403 { ERROR_403 } - fn default_render(&self, _rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, _rcx: &mut RenderContext) -> Markup { html! { div { h1 { ("FORBIDDEN ACCESS") } diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index edd83420..5db72178 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -15,7 +15,7 @@ impl ComponentTrait for Error404 { ERROR_404 } - fn default_render(&self, _rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, _rcx: &mut RenderContext) -> Markup { html! { div { h1 { ("RESOURCE NOT FOUND") } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 41f01a84..9925e5bb 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -121,11 +121,11 @@ impl Page { } pub fn title(&mut self) -> String { - self.title.render(&mut self.context).into_string() + self.title.prepare(&mut self.context).into_string() } pub fn description(&mut self) -> String { - self.description.render(&mut self.context).into_string() + self.description.prepare(&mut self.context).into_string() } pub fn metadata(&self) -> &Vec<(&str, &str)> { @@ -196,7 +196,7 @@ impl Page { let render = self .regions .get_extended_bundle(self.context.theme().single_name(), region) - .render(self.context()); + .prepare(self.context()); if render.is_empty() { None } else { From b5606f043a008c4c8645b4a9748bf95b46d2e1cf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 01:03:41 +0200 Subject: [PATCH 384/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Aplica=20cambio?= =?UTF-8?q?s=20de=20API=20asociados=20a=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 6 ++--- pagetop-bulmix/src/lib.rs | 2 +- pagetop-megamenu/src/component.rs | 24 +++++++++---------- pagetop-minimal/src/component/anchor.rs | 8 +++---- pagetop-minimal/src/component/container.rs | 18 +++++++------- .../src/component/form_element/button.rs | 7 +++--- .../src/component/form_element/date.rs | 2 +- .../src/component/form_element/form.rs | 10 ++++---- .../src/component/form_element/hidden.rs | 2 +- .../src/component/form_element/input.rs | 6 ++--- pagetop-minimal/src/component/grid/column.rs | 10 ++++---- pagetop-minimal/src/component/grid/row.rs | 10 ++++---- pagetop-minimal/src/component/heading.rs | 14 +++++------ pagetop-minimal/src/component/icon.rs | 4 ++-- pagetop-minimal/src/component/image.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 4 ++-- 16 files changed, 65 insertions(+), 64 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 88b07429..976d37d1 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -134,18 +134,18 @@ impl ThemeTrait for Bootsier { div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } p class="lead" { - (L10n::t("e404-description", &LOCALE_BOOTSIER).render(rcx)) + (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(rcx)) } hr class="my-4"; p { - (L10n::t("e404-description", &LOCALE_BOOTSIER).render(rcx)) + (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(rcx)) } a class="btn btn-primary btn-lg" href="/" role="button" { - (L10n::t("back-homepage", &LOCALE_BOOTSIER).render(rcx)) + (L10n::t("back-homepage", &LOCALE_BOOTSIER).prepare(rcx)) } } } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index b792bdb7..59fc8dee 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -41,7 +41,7 @@ impl ThemeTrait for Bulmix { } #[rustfmt::skip] - fn before_render_component( + fn before_prepare_component( &self, component: &mut dyn ComponentTrait, _rcx: &mut RenderContext, diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 974f5d11..41603292 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -44,29 +44,29 @@ impl ComponentTrait for MegaMenuItem { (self.renderable.check)(rcx) } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { match self.item_type() { MegaMenuItemType::Void => html! {}, MegaMenuItemType::Label(label) => html! { - li class="label" { a href="#" { (label.render(rcx)) } } + li class="label" { a href="#" { (label.prepare(rcx)) } } }, MegaMenuItemType::Link(label, path) => html! { - li class="link" { a href=(path) { (label.render(rcx)) } } + li class="link" { a href=(path) { (label.prepare(rcx)) } } }, MegaMenuItemType::LinkBlank(label, path) => html! { li class="link_blank" { - a href=(path) target="_blank" { (label.render(rcx)) } + a href=(path) target="_blank" { (label.prepare(rcx)) } } }, MegaMenuItemType::Html(content) => html! { - li class="html" { (content.render(rcx)) } + li class="html" { (content.prepare(rcx)) } }, MegaMenuItemType::Submenu(label, menu) => html! { li class="submenu" { - a href="#" { (label.render(rcx)) } + a href="#" { (label.prepare(rcx)) } ul { - (menu.items().render(rcx)) + (menu.items().prepare(rcx)) } } }, @@ -153,7 +153,7 @@ impl MegaMenuItem { use_handle!(COMPONENT_MEGAMENU); -action_before_render_component!(ACTION_BEFORE_RENDER_MENU for MegaMenu); +action_before_prepare_component!(ACTION_BEFORE_PREPARE_MENU for MegaMenu); #[rustfmt::skip] #[derive(Default)] @@ -187,11 +187,11 @@ impl ComponentTrait for MegaMenu { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { - run_actions_before_render_component(self, rcx); + fn before_prepare(&mut self, rcx: &mut RenderContext) { + run_actions_before_prepare_component(self, rcx); } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { rcx.alter(ContextOp::AddStyleSheet( StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), )) @@ -207,7 +207,7 @@ impl ComponentTrait for MegaMenu { html! { ul id=(id) class=[self.classes().get()] { - (self.items().render(rcx)) + (self.items().prepare(rcx)) } script type="text/javascript" defer { "jQuery(function(){jQuery('#" (id) "').smartmenus({" diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index c854d587..8f3264b9 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -63,7 +63,7 @@ impl ComponentTrait for Anchor { } #[rustfmt::skip] - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Parent => Some("_parent"), @@ -78,9 +78,9 @@ impl ComponentTrait for Anchor { href=[self.href().get()] target=[target] { - (self.left_icon().render(rcx)) - (" ") span { (self.html().render(rcx)) } (" ") - (self.right_icon().render(rcx)) + (self.left_icon().prepare(rcx)) + (" ") span { (self.html().prepare(rcx)) } (" ") + (self.right_icon().prepare(rcx)) } } } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 8b960967..820383de 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(COMPONENT_CONTAINER); -action_before_render_component!(ACTION_BEFORE_RENDER_CONTAINER for Container); +action_before_prepare_component!(ACTION_BEFORE_PREPARE_CONTAINER for Container); #[derive(Default)] pub enum ContainerType { @@ -50,43 +50,43 @@ impl ComponentTrait for Container { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { - run_actions_before_render_component(self, rcx); + fn before_prepare(&mut self, rcx: &mut RenderContext) { + run_actions_before_prepare_component(self, rcx); } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { match self.container_type() { ContainerType::Header => html! { header id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } }, ContainerType::Footer => html! { footer id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } }, ContainerType::Main => html! { main id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } }, ContainerType::Section => html! { section id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } }, _ => html! { div id=[self.id()] class=[self.classes().get()] { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } }, } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index e06a979f..f1cba202 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -45,24 +45,25 @@ impl ComponentTrait for Button { (self.renderable.check)(rcx) } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Submit => "submit", ButtonType::Reset => "reset", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); + let value = self.value().prepare(rcx); html! { button type=(button_type) id=[id] class=[self.classes().get()] name=[self.name().get()] - value=(self.value().render(rcx)) + value=(value) autofocus=[self.autofocus().get()] disabled=[self.disabled().get()] { - (self.value().render(rcx)) + (value) } } } diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 5f42e3ea..6241c8f3 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -40,7 +40,7 @@ impl ComponentTrait for Date { (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> Markup { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 4da7c5d7..a244b633 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(COMPONENT_FORM); -action_before_render_component!(ACTION_BEFORE_RENDER_FORM for Form); +action_before_prepare_component!(ACTION_BEFORE_PREPARE_FORM for Form); #[derive(Default)] pub enum FormMethod { @@ -48,11 +48,11 @@ impl ComponentTrait for Form { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { - run_actions_before_render_component(self, rcx); + fn before_prepare(&mut self, rcx: &mut RenderContext) { + run_actions_before_prepare_component(self, rcx); } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { let method = match self.method() { FormMethod::Post => Some("post".to_owned()), FormMethod::Get => None, @@ -65,7 +65,7 @@ impl ComponentTrait for Form { method=[method] accept-charset=[self.charset().get()] { - div { (self.elements().render(rcx)) } + div { (self.elements().prepare(rcx)) } } } } diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index 4ae86723..edc813be 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -23,7 +23,7 @@ impl ComponentTrait for Hidden { self.weight } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> Markup { let id = self.name().get().map(|name| concat_string!("value-", name)); html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index c29d33ad..cfdee829 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -61,7 +61,7 @@ impl ComponentTrait for Input { } #[rustfmt::skip] - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { let type_input = match self.input_type() { InputType::Textfield => "text", InputType::Password => "password", @@ -73,7 +73,7 @@ impl ComponentTrait for Input { let id = self.name().get().map(|name| concat_string!("edit-", name)); html! { div class=[self.classes().get()] { - @if let Some(label) = self.label().optional_render(rcx) { + @if let Some(label) = self.label().prepare_optional(rcx) { label class="form-label" for=[&id] { (label) " " @if self.required().get().is_some() { @@ -98,7 +98,7 @@ impl ComponentTrait for Input { readonly=[self.readonly().get()] required=[self.required().get()] disabled=[self.disabled().get()]; - @if let Some(description) = self.help_text().optional_render(rcx) { + @if let Some(description) = self.help_text().prepare_optional(rcx) { div class="form-text" { (description) } } } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 7655dfa3..8a923562 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(COMPONENT_COLUMN); -action_before_render_component!(ACTION_BEFORE_RENDER_COLUMN for Column); +action_before_prepare_component!(ACTION_BEFORE_PREPARE_COLUMN for Column); const SIZE__DEFAULT: &str = "col-md"; const SIZE__1_OF_12: &str = "col-md-1"; @@ -69,14 +69,14 @@ impl ComponentTrait for Column { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { - run_actions_before_render_component(self, rcx); + fn before_prepare(&mut self, rcx: &mut RenderContext) { + run_actions_before_prepare_component(self, rcx); } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { html! { div id=[self.id()] class=[self.classes().get()] { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index a7eee37f..689ae545 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -4,7 +4,7 @@ use crate::component::grid; use_handle!(COMPONENT_ROW); -action_before_render_component!(ACTION_BEFORE_RENDER_ROW for Row); +action_before_prepare_component!(ACTION_BEFORE_PREPARE_ROW for Row); #[rustfmt::skip] #[derive(Default)] @@ -38,14 +38,14 @@ impl ComponentTrait for Row { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { - run_actions_before_render_component(self, rcx); + fn before_prepare(&mut self, rcx: &mut RenderContext) { + run_actions_before_prepare_component(self, rcx); } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { html! { div id=[self.id()] class=[self.classes().get()] { - (self.columns().render(rcx)) + (self.columns().prepare(rcx)) } } } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 2b847df4..bb117e10 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -61,16 +61,16 @@ impl ComponentTrait for Heading { (self.renderable.check)(rcx) } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { let id = self.id(); let classes = self.classes().get(); html! { @match &self.heading_type() { - HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().render(rcx)) }, - HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().render(rcx)) }, - HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().render(rcx)) }, - HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().render(rcx)) }, - HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().render(rcx)) }, - HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().render(rcx)) }, + HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().prepare(rcx)) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().prepare(rcx)) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().prepare(rcx)) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().prepare(rcx)) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().prepare(rcx)) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(rcx)) }, }} } diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index d6676c4c..3b4a69ae 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -28,13 +28,13 @@ impl ComponentTrait for Icon { (self.renderable.check)(rcx) } - fn before_render(&mut self, rcx: &mut RenderContext) { + fn before_prepare(&mut self, rcx: &mut RenderContext) { rcx.alter(ContextOp::AddStyleSheet( StyleSheet::located("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), )); } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> Markup { html! { i class=[self.classes().get()] {}; } } diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index e7fc3cd1..5e3c1de5 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -34,7 +34,7 @@ impl ComponentTrait for Image { (self.renderable.check)(rcx) } - fn default_render(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> Markup { html! { img src=[self.source().get()] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 746c5c28..08654f2e 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -46,13 +46,13 @@ impl ComponentTrait for Paragraph { (self.renderable.check)(rcx) } - fn default_render(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { html! { p id=[self.id()] class=[self.classes().get()] { - (self.components().render(rcx)) + (self.components().prepare(rcx)) } } } From 9993b5975bb4f1abf59d57e9f3e5846d954335f5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 01:47:26 +0200 Subject: [PATCH 385/853] =?UTF-8?q?=F0=9F=92=A5=20Impide=20prepare=5Fcompo?= =?UTF-8?q?nent()=20renderizar=20en=20html!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 6 +++--- pagetop/src/base/component/html.rs | 4 ++-- pagetop/src/base/component/l10n.rs | 14 +++++++------- pagetop/src/core/component/definition.rs | 8 ++++---- pagetop/src/html.rs | 16 ++++++++++++++++ pagetop/src/response/fatal_error/error403.rs | 8 ++++---- pagetop/src/response/fatal_error/error404.rs | 8 ++++---- 7 files changed, 40 insertions(+), 24 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 3275676c..b36835dc 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -41,9 +41,9 @@ impl ComponentTrait for Block { run_actions_before_prepare_component(self, rcx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { let id = rcx.required_id::<Block>(self.id()); - html! { + PrepareMarkup::With(html! { div id=(id) class=[self.classes().get()] { @if let Some(title) = self.title().get() { h2 class="block-title" { (title) } @@ -52,7 +52,7 @@ impl ComponentTrait for Block { (self.components().prepare(rcx)) } } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index e1a53268..4c0ee6ed 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -14,8 +14,8 @@ impl ComponentTrait for Html { COMPONENT_HTML } - fn prepare_component(&self, _: &mut RenderContext) -> Markup { - html! { (self.html()) } + fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { (self.html()) }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index 598794c5..054f038e 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -28,11 +28,11 @@ impl ComponentTrait for L10n { COMPONENT_L10N } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { match self.op() { - L10nOp::None => html! {}, - L10nOp::Text(text) => html! { (text) }, - L10nOp::Translated(key, locales) => html! { + L10nOp::None => PrepareMarkup::None, + L10nOp::Text(text) => PrepareMarkup::Text(text), + L10nOp::Translated(key, locales) => PrepareMarkup::With(html! { (locales .lookup_with_args( rcx.langid(), @@ -44,8 +44,8 @@ impl ComponentTrait for L10n { ) .unwrap_or(key.to_string()) ) - }, - L10nOp::Escaped(key, locales) => html! { + }), + L10nOp::Escaped(key, locales) => PrepareMarkup::With(html! { (PreEscaped(locales .lookup_with_args( rcx.langid(), @@ -57,7 +57,7 @@ impl ComponentTrait for L10n { ) .unwrap_or(key.to_string()) )) - }, + }), } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 60609203..ef9df3b8 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,5 +1,5 @@ use crate::core::component::RenderContext; -use crate::html::{html, Markup}; +use crate::html::{html, Markup, PrepareMarkup}; use crate::{util, Handle}; pub use std::any::Any as AnyComponent; @@ -40,8 +40,8 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { fn before_prepare(&mut self, rcx: &mut RenderContext) {} #[allow(unused_variables)] - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { - html! {} + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::None } #[allow(unused_variables)] @@ -63,7 +63,7 @@ impl<C: ComponentTrait> BaseComponent for C { let markup = match rcx.theme().render_component(self, rcx) { Some(html) => html, - None => self.prepare_component(rcx), + None => self.prepare_component(rcx).html(), }; // Acciones después de preparar el componente. diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index fcfbbab7..b9dbd78e 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -22,3 +22,19 @@ pub use attribute::AttributeValue; mod classes; pub use classes::{Classes, ClassesOp}; + +pub enum PrepareMarkup { + None, + Text(&'static str), + With(Markup), +} + +impl PrepareMarkup { + pub fn html(self) -> Markup { + match self { + PrepareMarkup::None => html! {}, + PrepareMarkup::Text(text) => html! { (text) }, + PrepareMarkup::With(markup) => markup, + } + } +} diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index 1bf38614..5b6a7299 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,5 +1,5 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; -use crate::html::{html, Markup}; +use crate::html::{html, PrepareMarkup}; use crate::{use_handle, Handle}; use_handle!(ERROR_403); @@ -15,12 +15,12 @@ impl ComponentTrait for Error403 { ERROR_403 } - fn prepare_component(&self, _rcx: &mut RenderContext) -> Markup { - html! { + fn prepare_component(&self, _rcx: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { div { h1 { ("FORBIDDEN ACCESS") } } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index 5db72178..afd1dc68 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,5 +1,5 @@ use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; -use crate::html::{html, Markup}; +use crate::html::{html, PrepareMarkup}; use crate::{use_handle, Handle}; use_handle!(ERROR_404); @@ -15,12 +15,12 @@ impl ComponentTrait for Error404 { ERROR_404 } - fn prepare_component(&self, _rcx: &mut RenderContext) -> Markup { - html! { + fn prepare_component(&self, _rcx: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { div { h1 { ("RESOURCE NOT FOUND") } } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { From 297d1fc33820a530dcbf4a8d4e50c93bfc772a99 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 01:47:40 +0200 Subject: [PATCH 386/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Aplica=20cambio?= =?UTF-8?q?s=20de=20API=20asociados=20a=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 34 +++++++++---------- pagetop-minimal/src/component/anchor.rs | 6 ++-- pagetop-minimal/src/component/container.rs | 22 ++++++------ .../src/component/form_element/button.rs | 6 ++-- .../src/component/form_element/date.rs | 6 ++-- .../src/component/form_element/form.rs | 6 ++-- .../src/component/form_element/hidden.rs | 6 ++-- .../src/component/form_element/input.rs | 6 ++-- pagetop-minimal/src/component/grid/column.rs | 6 ++-- pagetop-minimal/src/component/grid/row.rs | 6 ++-- pagetop-minimal/src/component/heading.rs | 6 ++-- pagetop-minimal/src/component/icon.rs | 4 +-- pagetop-minimal/src/component/image.rs | 6 ++-- pagetop-minimal/src/component/paragraph.rs | 6 ++-- 14 files changed, 63 insertions(+), 63 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 41603292..830cb5d8 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -44,35 +44,35 @@ impl ComponentTrait for MegaMenuItem { (self.renderable.check)(rcx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { match self.item_type() { - MegaMenuItemType::Void => html! {}, + MegaMenuItemType::Void => PrepareMarkup::None, - MegaMenuItemType::Label(label) => html! { + MegaMenuItemType::Label(label) => PrepareMarkup::With(html! { li class="label" { a href="#" { (label.prepare(rcx)) } } - }, - MegaMenuItemType::Link(label, path) => html! { + }), + MegaMenuItemType::Link(label, path) => PrepareMarkup::With(html! { li class="link" { a href=(path) { (label.prepare(rcx)) } } - }, - MegaMenuItemType::LinkBlank(label, path) => html! { + }), + MegaMenuItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { li class="link_blank" { a href=(path) target="_blank" { (label.prepare(rcx)) } } - }, - MegaMenuItemType::Html(content) => html! { + }), + MegaMenuItemType::Html(content) => PrepareMarkup::With(html! { li class="html" { (content.prepare(rcx)) } - }, - MegaMenuItemType::Submenu(label, menu) => html! { + }), + MegaMenuItemType::Submenu(label, menu) => PrepareMarkup::With(html! { li class="submenu" { a href="#" { (label.prepare(rcx)) } ul { (menu.items().prepare(rcx)) } } - }, - MegaMenuItemType::Separator => html! { + }), + MegaMenuItemType::Separator => PrepareMarkup::With(html! { li class="separator" { } - }, + }), } } @@ -191,7 +191,7 @@ impl ComponentTrait for MegaMenu { run_actions_before_prepare_component(self, rcx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { rcx.alter(ContextOp::AddStyleSheet( StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), )) @@ -205,7 +205,7 @@ impl ComponentTrait for MegaMenu { let id = rcx.required_id::<MegaMenu>(self.id()); - html! { + PrepareMarkup::With(html! { ul id=(id) class=[self.classes().get()] { (self.items().prepare(rcx)) } @@ -215,7 +215,7 @@ impl ComponentTrait for MegaMenu { "showTimeout: 80," "});});" } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 8f3264b9..71e3cfaa 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -63,7 +63,7 @@ impl ComponentTrait for Anchor { } #[rustfmt::skip] - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Parent => Some("_parent"), @@ -71,7 +71,7 @@ impl ComponentTrait for Anchor { AnchorTarget::Context(name) => Some(name.as_str()), _ => None, }; - html! { + PrepareMarkup::With(html! { a id=[self.id()] class=[self.classes().get()] @@ -82,7 +82,7 @@ impl ComponentTrait for Anchor { (" ") span { (self.html().prepare(rcx)) } (" ") (self.right_icon().prepare(rcx)) } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 820383de..65df12cb 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -54,41 +54,41 @@ impl ComponentTrait for Container { run_actions_before_prepare_component(self, rcx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { match self.container_type() { - ContainerType::Header => html! { + ContainerType::Header => PrepareMarkup::With(html! { header id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().prepare(rcx)) } } - }, - ContainerType::Footer => html! { + }), + ContainerType::Footer => PrepareMarkup::With(html! { footer id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().prepare(rcx)) } } - }, - ContainerType::Main => html! { + }), + ContainerType::Main => PrepareMarkup::With(html! { main id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().prepare(rcx)) } } - }, - ContainerType::Section => html! { + }), + ContainerType::Section => PrepareMarkup::With(html! { section id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { (self.components().prepare(rcx)) } } - }, - _ => html! { + }), + _ => PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { (self.components().prepare(rcx)) } - }, + }), } } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index f1cba202..5ff7c668 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -45,7 +45,7 @@ impl ComponentTrait for Button { (self.renderable.check)(rcx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Submit => "submit", @@ -53,7 +53,7 @@ impl ComponentTrait for Button { }; let id = self.name().get().map(|name| concat_string!("edit-", name)); let value = self.value().prepare(rcx); - html! { + PrepareMarkup::With(html! { button type=(button_type) id=[id] @@ -65,7 +65,7 @@ impl ComponentTrait for Button { { (value) } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 6241c8f3..20c7525f 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -40,9 +40,9 @@ impl ComponentTrait for Date { (self.renderable.check)(rcx) } - fn prepare_component(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { let id = self.name().get().map(|name| concat_string!("edit-", name)); - html! { + PrepareMarkup::With(html! { div class=[self.classes().get()] { @if let Some(label) = self.label().get() { label class="form-label" for=[&id] { @@ -70,7 +70,7 @@ impl ComponentTrait for Date { div class="form-text" { (help_text) } } } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index a244b633..dcaa9d4f 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -52,12 +52,12 @@ impl ComponentTrait for Form { run_actions_before_prepare_component(self, rcx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { let method = match self.method() { FormMethod::Post => Some("post".to_owned()), FormMethod::Get => None, }; - html! { + PrepareMarkup::With(html! { form id=[self.id()] class=[self.classes().get()] @@ -67,7 +67,7 @@ impl ComponentTrait for Form { { div { (self.elements().prepare(rcx)) } } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index edc813be..7de064c4 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -23,11 +23,11 @@ impl ComponentTrait for Hidden { self.weight } - fn prepare_component(&self, _: &mut RenderContext) -> Markup { + fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { let id = self.name().get().map(|name| concat_string!("value-", name)); - html! { + PrepareMarkup::With(html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index cfdee829..74314fdb 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -61,7 +61,7 @@ impl ComponentTrait for Input { } #[rustfmt::skip] - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { let type_input = match self.input_type() { InputType::Textfield => "text", InputType::Password => "password", @@ -71,7 +71,7 @@ impl ComponentTrait for Input { InputType::Url => "url", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); - html! { + PrepareMarkup::With(html! { div class=[self.classes().get()] { @if let Some(label) = self.label().prepare_optional(rcx) { label class="form-label" for=[&id] { @@ -102,7 +102,7 @@ impl ComponentTrait for Input { div class="form-text" { (description) } } } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 8a923562..f8ce9512 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -73,12 +73,12 @@ impl ComponentTrait for Column { run_actions_before_prepare_component(self, rcx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { - html! { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { (self.components().prepare(rcx)) } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 689ae545..e64243eb 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -42,12 +42,12 @@ impl ComponentTrait for Row { run_actions_before_prepare_component(self, rcx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { - html! { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { (self.columns().prepare(rcx)) } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index bb117e10..9c51102e 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -61,17 +61,17 @@ impl ComponentTrait for Heading { (self.renderable.check)(rcx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { let id = self.id(); let classes = self.classes().get(); - html! { @match &self.heading_type() { + PrepareMarkup::With(html! { @match &self.heading_type() { HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().prepare(rcx)) }, HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().prepare(rcx)) }, HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().prepare(rcx)) }, HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().prepare(rcx)) }, HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().prepare(rcx)) }, HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(rcx)) }, - }} + }}) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 3b4a69ae..a2a8a2c5 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -34,8 +34,8 @@ impl ComponentTrait for Icon { )); } - fn prepare_component(&self, _: &mut RenderContext) -> Markup { - html! { i class=[self.classes().get()] {}; } + fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { i class=[self.classes().get()] {}; }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index 5e3c1de5..a0c29a63 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -34,13 +34,13 @@ impl ComponentTrait for Image { (self.renderable.check)(rcx) } - fn prepare_component(&self, _: &mut RenderContext) -> Markup { - html! { + fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { img src=[self.source().get()] id=[self.id()] class=[self.classes().get()]; - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 08654f2e..2cfbbf66 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -46,15 +46,15 @@ impl ComponentTrait for Paragraph { (self.renderable.check)(rcx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> Markup { - html! { + fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + PrepareMarkup::With(html! { p id=[self.id()] class=[self.classes().get()] { (self.components().prepare(rcx)) } - } + }) } fn as_ref_any(&self) -> &dyn AnyComponent { From f87b2366595701e202400393151692bcf66b9a29 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 02:09:26 +0200 Subject: [PATCH 387/853] =?UTF-8?q?=F0=9F=9A=A7=20Simplifica=20preparaci?= =?UTF-8?q?=C3=B3n=20opcional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/form_element/input.rs | 6 ++++-- pagetop/src/core/component/one.rs | 12 +----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 74314fdb..9f13f285 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -71,9 +71,11 @@ impl ComponentTrait for Input { InputType::Url => "url", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); + let label = self.label().prepare(rcx); + let description = self.help_text().prepare(rcx); PrepareMarkup::With(html! { div class=[self.classes().get()] { - @if let Some(label) = self.label().prepare_optional(rcx) { + @if !label.is_empty() { label class="form-label" for=[&id] { (label) " " @if self.required().get().is_some() { @@ -98,7 +100,7 @@ impl ComponentTrait for Input { readonly=[self.readonly().get()] required=[self.required().get()] disabled=[self.disabled().get()]; - @if let Some(description) = self.help_text().prepare_optional(rcx) { + @if !description.is_empty() { div class="form-text" { (description) } } } diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs index 79aefa48..72d67bb7 100644 --- a/pagetop/src/core/component/one.rs +++ b/pagetop/src/core/component/one.rs @@ -19,7 +19,7 @@ impl<T: ComponentTrait + Default> OneComponent<T> { self.0 = Some(Arc::new(RwLock::new(component))); } - // OneComponent RENDER. + // OneComponent PREPARE. pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { if let Some(component) = &self.0 { @@ -27,14 +27,4 @@ impl<T: ComponentTrait + Default> OneComponent<T> { } html! {} } - - pub fn prepare_optional(&self, rcx: &mut RenderContext) -> Option<Markup> { - if let Some(component) = &self.0 { - let render = component.write().unwrap().prepare(rcx).into_string(); - if !render.trim().is_empty() { - return Some(html! { (render) }); - } - } - None - } } From dc3a1d240bdfae4eb9c8b965651885e532bb1b45 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 02:09:55 +0200 Subject: [PATCH 388/853] =?UTF-8?q?=F0=9F=9A=A7=20Retoca=20nomenclatura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/bundle.rs | 2 +- pagetop/src/core/component/context.rs | 8 ++++---- pagetop/src/core/theme/definition.rs | 6 +++--- pagetop/src/html/assets.rs | 6 +++--- pagetop/src/html/assets/javascript.rs | 2 +- pagetop/src/html/assets/stylesheet.rs | 2 +- pagetop/src/html/favicon.rs | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index 8ceccbd0..5588feb4 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -114,7 +114,7 @@ impl ComponentsBundle { .filter(move |&c| c.read().unwrap().handle() == handle) } - // ComponentsBundle RENDER. + // ComponentsBundle PREPARE. pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index f8ddc97f..f95da247 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -109,12 +109,12 @@ impl RenderContext { None } - /// Context RENDER. + /// Context PREPARE. - pub fn render(&mut self) -> Markup { + pub fn prepare(&mut self) -> Markup { html! { - (self.stylesheets.render()) - (self.javascripts.render()) + (self.stylesheets.prepare()) + (self.javascripts.prepare()) } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index c68bea0d..e2381370 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -51,11 +51,11 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { meta property=(property) content=(content) {} } - @if let Some(f) = page.favicon() { - (f.render()) + @if let Some(favicon) = page.favicon() { + (favicon.prepare()) } - (page.context().render()) + (page.context().prepare()) } } } diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index fb9b5722..6ca33c81 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -8,7 +8,7 @@ pub trait AssetsTrait { fn weight(&self) -> isize; - fn render(&self) -> Markup; + fn prepare(&self) -> Markup; } #[derive(Default)] @@ -39,12 +39,12 @@ impl<T: AssetsTrait> Assets<T> { self } - pub fn render(&mut self) -> Markup { + pub fn prepare(&mut self) -> Markup { let assets = &mut self.0; assets.sort_by_key(|a| a.weight()); html! { @for a in assets { - (a.render()) + (a.prepare()) } } } diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 9a9393ce..be7a42f2 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -28,7 +28,7 @@ impl AssetsTrait for JavaScript { self.weight } - fn render(&self) -> Markup { + fn prepare(&self) -> Markup { html! { script type="text/javascript" src=(crate::concat_string!(self.source, self.prefix, self.version)) diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 9282a2dd..339f44f6 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -27,7 +27,7 @@ impl AssetsTrait for StyleSheet { self.weight } - fn render(&self) -> Markup { + fn prepare(&self) -> Markup { html! { link rel="stylesheet" diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index ac669ef8..651b476b 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -80,9 +80,9 @@ impl Favicon { self } - // Favicon RENDER. + // Favicon PREPARE. - pub(crate) fn render(&self) -> Markup { + pub(crate) fn prepare(&self) -> Markup { html! { @for item in &self.0 { (item) From 0e0b4ce604fd25f14a16c3250b1e609a5055b216 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 02:13:17 +0200 Subject: [PATCH 389/853] =?UTF-8?q?=F0=9F=92=A5=20Normaliza=20m=C3=A9todos?= =?UTF-8?q?=20de=20preparaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 2 +- pagetop/src/core/component/definition.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b36835dc..97004ffe 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -37,7 +37,7 @@ impl ComponentTrait for Block { (self.renderable.check)(rcx) } - fn before_prepare(&mut self, rcx: &mut RenderContext) { + fn before_prepare_component(&mut self, rcx: &mut RenderContext) { run_actions_before_prepare_component(self, rcx); } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index ef9df3b8..c8d63c88 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -37,7 +37,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn before_prepare(&mut self, rcx: &mut RenderContext) {} + fn before_prepare_component(&mut self, rcx: &mut RenderContext) {} #[allow(unused_variables)] fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { @@ -45,7 +45,7 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn after_prepare(&mut self, rcx: &mut RenderContext) {} + fn after_prepare_component(&mut self, rcx: &mut RenderContext) {} fn as_ref_any(&self) -> &dyn AnyComponent; @@ -56,7 +56,7 @@ impl<C: ComponentTrait> BaseComponent for C { fn prepare(&mut self, rcx: &mut RenderContext) -> Markup { if self.is_renderable(rcx) { // Acciones antes de preparar el componente. - self.before_prepare(rcx); + self.before_prepare_component(rcx); // Acciones del tema antes de preparar el componente. rcx.theme().before_prepare_component(self, rcx); @@ -67,7 +67,7 @@ impl<C: ComponentTrait> BaseComponent for C { }; // Acciones después de preparar el componente. - self.after_prepare(rcx); + self.after_prepare_component(rcx); // Acciones del tema después de preparar el componente. rcx.theme().after_prepare_component(self, rcx); From f1f6f495bb4123c6d0394482699bafe1855f022b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 02:13:30 +0200 Subject: [PATCH 390/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Aplica=20cambio?= =?UTF-8?q?s=20de=20API=20asociados=20a=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- pagetop-minimal/src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop-minimal/src/component/icon.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 830cb5d8..29d173e2 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -187,7 +187,7 @@ impl ComponentTrait for MegaMenu { (self.renderable.check)(rcx) } - fn before_prepare(&mut self, rcx: &mut RenderContext) { + fn before_prepare_component(&mut self, rcx: &mut RenderContext) { run_actions_before_prepare_component(self, rcx); } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 65df12cb..08aa1378 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -50,7 +50,7 @@ impl ComponentTrait for Container { (self.renderable.check)(rcx) } - fn before_prepare(&mut self, rcx: &mut RenderContext) { + fn before_prepare_component(&mut self, rcx: &mut RenderContext) { run_actions_before_prepare_component(self, rcx); } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index dcaa9d4f..00c47ff9 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -48,7 +48,7 @@ impl ComponentTrait for Form { (self.renderable.check)(rcx) } - fn before_prepare(&mut self, rcx: &mut RenderContext) { + fn before_prepare_component(&mut self, rcx: &mut RenderContext) { run_actions_before_prepare_component(self, rcx); } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index f8ce9512..8ee11ac8 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -69,7 +69,7 @@ impl ComponentTrait for Column { (self.renderable.check)(rcx) } - fn before_prepare(&mut self, rcx: &mut RenderContext) { + fn before_prepare_component(&mut self, rcx: &mut RenderContext) { run_actions_before_prepare_component(self, rcx); } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index e64243eb..cc179eda 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -38,7 +38,7 @@ impl ComponentTrait for Row { (self.renderable.check)(rcx) } - fn before_prepare(&mut self, rcx: &mut RenderContext) { + fn before_prepare_component(&mut self, rcx: &mut RenderContext) { run_actions_before_prepare_component(self, rcx); } diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index a2a8a2c5..7d5599f8 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -28,7 +28,7 @@ impl ComponentTrait for Icon { (self.renderable.check)(rcx) } - fn before_prepare(&mut self, rcx: &mut RenderContext) { + fn before_prepare_component(&mut self, rcx: &mut RenderContext) { rcx.alter(ContextOp::AddStyleSheet( StyleSheet::located("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), )); From 9a63cacd8f129b5263adf7be46463fdb353fdfe2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 14:00:22 +0200 Subject: [PATCH 391/853] =?UTF-8?q?=F0=9F=92=A5=20Agrupa=20componentes=20e?= =?UTF-8?q?n=20packs=20en=20lugar=20de=20bundles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 10 ++--- pagetop-minimal/src/component/container.rs | 10 ++--- .../src/component/form_element/form.rs | 10 ++--- pagetop-minimal/src/component/grid/column.rs | 10 ++--- pagetop-minimal/src/component/grid/row.rs | 10 ++--- pagetop-minimal/src/component/paragraph.rs | 10 ++--- pagetop/src/base/component/block.rs | 10 ++--- pagetop/src/core/component.rs | 4 +- .../src/core/component/{bundle.rs => pack.rs} | 42 +++++++++---------- pagetop/src/core/theme/regions.rs | 14 +++---- pagetop/src/response/page/definition.rs | 4 +- 11 files changed, 67 insertions(+), 67 deletions(-) rename pagetop/src/core/component/{bundle.rs => pack.rs} (75%) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 29d173e2..0ec50ec1 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -162,7 +162,7 @@ pub struct MegaMenu { renderable: Renderable, id : IdentifierValue, classes : Classes, - items : ComponentsBundle, + items : PackComponents, template : String, } @@ -255,12 +255,12 @@ impl MegaMenu { } pub fn with_item(mut self, item: MegaMenuItem) -> Self { - self.items.alter_bundle(BundleOp::Add, item); + self.items.alter_pack(PackOp::Add, item); self } - pub fn alter_items(&mut self, op: BundleOp, item: MegaMenuItem) -> &mut Self { - self.items.alter_bundle(op, item); + pub fn alter_items(&mut self, op: PackOp, item: MegaMenuItem) -> &mut Self { + self.items.alter_pack(op, item); self } @@ -276,7 +276,7 @@ impl MegaMenu { &self.classes } - pub fn items(&self) -> &ComponentsBundle { + pub fn items(&self) -> &PackComponents { &self.items } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 08aa1378..4ec3b932 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -23,7 +23,7 @@ pub struct Container { classes : Classes, inner_classes : Classes, container_type: ContainerType, - components : ComponentsBundle, + components : PackComponents, template : String, } @@ -159,12 +159,12 @@ impl Container { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_bundle(BundleOp::Add, component); + self.components.alter_pack(PackOp::Add, component); self } - pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_bundle(op, component); + pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_pack(op, component); self } @@ -188,7 +188,7 @@ impl Container { &self.container_type } - pub fn components(&self) -> &ComponentsBundle { + pub fn components(&self) -> &PackComponents { &self.components } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 00c47ff9..f3b3eef5 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -21,7 +21,7 @@ pub struct Form { action : AttributeValue, charset : AttributeValue, method : FormMethod, - elements : ComponentsBundle, + elements : PackComponents, template : String, } @@ -125,12 +125,12 @@ impl Form { } pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.elements.alter_bundle(BundleOp::Add, element); + self.elements.alter_pack(PackOp::Add, element); self } - pub fn alter_elements(&mut self, op: BundleOp, element: impl ComponentTrait) -> &mut Self { - self.elements.alter_bundle(op, element); + pub fn alter_elements(&mut self, op: PackOp, element: impl ComponentTrait) -> &mut Self { + self.elements.alter_pack(op, element); self } @@ -158,7 +158,7 @@ impl Form { &self.method } - pub fn elements(&self) -> &ComponentsBundle { + pub fn elements(&self) -> &PackComponents { &self.elements } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 8ee11ac8..1068e9b4 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -44,7 +44,7 @@ pub struct Column { id : IdentifierValue, classes : Classes, size : ColumnSize, - components: ComponentsBundle, + components: PackComponents, template : String, } @@ -140,12 +140,12 @@ impl Column { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_bundle(BundleOp::Add, component); + self.components.alter_pack(PackOp::Add, component); self } - pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_bundle(op, component); + pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_pack(op, component); self } @@ -165,7 +165,7 @@ impl Column { &self.size } - pub fn components(&self) -> &ComponentsBundle { + pub fn components(&self) -> &PackComponents { &self.components } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index cc179eda..ce2ccaf0 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -13,7 +13,7 @@ pub struct Row { renderable: Renderable, id : IdentifierValue, classes : Classes, - columns : ComponentsBundle, + columns : PackComponents, template : String, } @@ -87,12 +87,12 @@ impl Row { } pub fn with_column(mut self, column: grid::Column) -> Self { - self.columns.alter_bundle(BundleOp::Add, column); + self.columns.alter_pack(PackOp::Add, column); self } - pub fn alter_columns(&mut self, op: BundleOp, column: grid::Column) -> &mut Self { - self.columns.alter_bundle(op, column); + pub fn alter_columns(&mut self, op: PackOp, column: grid::Column) -> &mut Self { + self.columns.alter_pack(op, column); self } @@ -108,7 +108,7 @@ impl Row { &self.classes } - pub fn columns(&self) -> &ComponentsBundle { + pub fn columns(&self) -> &PackComponents { &self.columns } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 2cfbbf66..ccd44a7b 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -20,7 +20,7 @@ pub struct Paragraph { renderable: Renderable, id : IdentifierValue, classes : Classes, - components: ComponentsBundle, + components: PackComponents, display : ParagraphDisplay, template : String, } @@ -98,12 +98,12 @@ impl Paragraph { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_bundle(BundleOp::Add, component); + self.components.alter_pack(PackOp::Add, component); self } - pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_bundle(op, component); + pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_pack(op, component); self } @@ -137,7 +137,7 @@ impl Paragraph { &self.classes } - pub fn components(&self) -> &ComponentsBundle { + pub fn components(&self) -> &PackComponents { &self.components } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 97004ffe..78cd707d 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -12,7 +12,7 @@ pub struct Block { id : IdentifierValue, classes : Classes, title : AttributeValue, - components: ComponentsBundle, + components: PackComponents, template : String, } @@ -98,12 +98,12 @@ impl Block { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_bundle(BundleOp::Add, component); + self.components.alter_pack(PackOp::Add, component); self } - pub fn alter_components(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_bundle(op, component); + pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { + self.components.alter_pack(op, component); self } @@ -123,7 +123,7 @@ impl Block { &self.title } - pub fn components(&self) -> &ComponentsBundle { + pub fn components(&self) -> &PackComponents { &self.components } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 8eca2686..94cb0528 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -7,8 +7,8 @@ pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, mod one; pub use one::OneComponent; -mod bundle; -pub use bundle::{BundleOp, ComponentsBundle}; +mod pack; +pub use pack::{PackComponents, PackOp}; mod renderable; pub use renderable::{IsRenderable, Renderable}; diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/pack.rs similarity index 75% rename from pagetop/src/core/component/bundle.rs rename to pagetop/src/core/component/pack.rs index 5588feb4..4da60920 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/pack.rs @@ -4,7 +4,7 @@ use crate::{fn_builder, Handle}; use std::sync::{Arc, RwLock}; -pub enum BundleOp { +pub enum PackOp { Add, AddAfterId(&'static str), AddBeforeId(&'static str), @@ -17,41 +17,41 @@ pub enum BundleOp { pub type ArcLockComponent = Arc<RwLock<dyn ComponentTrait>>; #[derive(Clone, Default)] -pub struct ComponentsBundle(Vec<ArcLockComponent>); +pub struct PackComponents(Vec<ArcLockComponent>); -impl ComponentsBundle { +impl PackComponents { pub fn new() -> Self { - ComponentsBundle::default() + PackComponents::default() } pub fn new_with(component: impl ComponentTrait) -> Self { - let mut bundle = ComponentsBundle::new(); - bundle.alter_bundle(BundleOp::Add, component); + let mut bundle = PackComponents::new(); + bundle.alter_pack(PackOp::Add, component); bundle } - pub(crate) fn merge(one: Option<&ComponentsBundle>, other: Option<&ComponentsBundle>) -> Self { + pub(crate) fn merge(one: Option<&PackComponents>, other: Option<&PackComponents>) -> Self { if let Some(one) = one { let mut components = one.0.clone(); if let Some(other) = other { components.append(&mut other.0.clone()); } - ComponentsBundle(components) + PackComponents(components) } else if let Some(other) = other { - ComponentsBundle(other.0.clone()) + PackComponents(other.0.clone()) } else { - ComponentsBundle::default() + PackComponents::default() } } - // ComponentsBundle BUILDER. + // PackComponents BUILDER. #[fn_builder] - pub fn alter_bundle(&mut self, op: BundleOp, component: impl ComponentTrait) -> &mut Self { + pub fn alter_pack(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { let arc = Arc::new(RwLock::new(component)); match op { - BundleOp::Add => self.0.push(arc), - BundleOp::AddAfterId(id) => { + PackOp::Add => self.0.push(arc), + PackOp::AddAfterId(id) => { match self .0 .iter() @@ -61,7 +61,7 @@ impl ComponentsBundle { _ => self.0.push(arc), } } - BundleOp::AddBeforeId(id) => { + PackOp::AddBeforeId(id) => { match self .0 .iter() @@ -71,8 +71,8 @@ impl ComponentsBundle { _ => self.0.insert(0, arc), } } - BundleOp::AddFirst => self.0.insert(0, arc), - BundleOp::RemoveById(id) => { + PackOp::AddFirst => self.0.insert(0, arc), + PackOp::RemoveById(id) => { if let Some(index) = self .0 .iter() @@ -81,7 +81,7 @@ impl ComponentsBundle { self.0.remove(index); } } - BundleOp::ReplaceById(id) => { + PackOp::ReplaceById(id) => { for c in self.0.iter_mut() { if c.read().unwrap().id().as_deref() == Some(id) { *c = arc; @@ -89,12 +89,12 @@ impl ComponentsBundle { } } } - BundleOp::Reset => self.0.clear(), + PackOp::Reset => self.0.clear(), } self } - // ComponentsBundle GETTERS. + // PackComponents GETTERS. pub fn get_by_id(&self, id: &'static str) -> Option<&ArcLockComponent> { self.0 @@ -114,7 +114,7 @@ impl ComponentsBundle { .filter(move |&c| c.read().unwrap().handle() == handle) } - // ComponentsBundle PREPARE. + // PackComponents PREPARE. pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { let mut components = self.0.clone(); diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index d2d32122..35e2ccc5 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,4 +1,4 @@ -use crate::core::component::{BundleOp, ComponentTrait, ComponentsBundle}; +use crate::core::component::{ComponentTrait, PackComponents, PackOp}; use crate::LazyStatic; use std::collections::HashMap; @@ -8,7 +8,7 @@ static THEME_REGIONS: LazyStatic<RwLock<HashMap<&'static str, ComponentsRegions> LazyStatic::new(|| RwLock::new(HashMap::new())); #[derive(Default)] -pub struct ComponentsRegions(HashMap<&'static str, ComponentsBundle>); +pub struct ComponentsRegions(HashMap<&'static str, PackComponents>); impl ComponentsRegions { pub fn new() -> Self { @@ -17,17 +17,17 @@ impl ComponentsRegions { pub fn add_to(&mut self, region: &'static str, component: impl ComponentTrait) { if let Some(region) = self.0.get_mut(region) { - region.alter_bundle(BundleOp::Add, component); + region.alter_pack(PackOp::Add, component); } else { - self.0.insert(region, ComponentsBundle::new_with(component)); + self.0.insert(region, PackComponents::new_with(component)); } } - pub fn get_extended_bundle(&self, theme: &str, region: &str) -> ComponentsBundle { + pub fn get_extended_pack(&self, theme: &str, region: &str) -> PackComponents { if let Some(hm_theme) = THEME_REGIONS.read().unwrap().get(theme) { - ComponentsBundle::merge(self.0.get(region), hm_theme.0.get(region)) + PackComponents::merge(self.0.get(region), hm_theme.0.get(region)) } else { - ComponentsBundle::merge(self.0.get(region), None) + PackComponents::merge(self.0.get(region), None) } } } diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 9925e5bb..59c52f56 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -177,7 +177,7 @@ impl Page { // Acciones del tema después de preparar la página. self.context.theme().after_prepare_page(self); - // Finalmente, renderizar la página. + // Finalmente, renderiza la página. let lang = self.langid().language.as_str(); let dir = match self.langid().character_direction() { CharacterDirection::LTR => "ltr", @@ -195,7 +195,7 @@ impl Page { pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { let render = self .regions - .get_extended_bundle(self.context.theme().single_name(), region) + .get_extended_pack(self.context.theme().single_name(), region) .prepare(self.context()); if render.is_empty() { None From 8eba48283ec2ff6b7b45643a7cf00cd039df6a6a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 24 Jun 2023 14:09:05 +0200 Subject: [PATCH 392/853] =?UTF-8?q?=F0=9F=9A=A7=20Retoques=20con=20la=20li?= =?UTF-8?q?sta=20de=20acciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/action.rs | 6 +++--- pagetop/src/core/action/all.rs | 6 +++--- pagetop/src/core/action/{bundle.rs => list.rs} | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) rename pagetop/src/core/action/{bundle.rs => list.rs} (81%) diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index 455e2176..9d97640e 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -1,9 +1,9 @@ mod definition; pub use definition::{action_ref, ActionTrait, AnyAction}; -mod bundle; -pub use bundle::Action; -use bundle::ActionsBundle; +mod list; +pub use list::Action; +use list::ActionsList; mod all; pub(crate) use all::add_action; diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index 4879dd15..9737d98c 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -1,11 +1,11 @@ -use crate::core::action::{Action, ActionsBundle}; +use crate::core::action::{Action, ActionsList}; use crate::{Handle, LazyStatic}; use std::collections::HashMap; use std::sync::RwLock; // Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<Handle, ActionsBundle>>> = +static ACTIONS: LazyStatic<RwLock<HashMap<Handle, ActionsList>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); pub fn add_action(action: Action) { @@ -14,7 +14,7 @@ pub fn add_action(action: Action) { if let Some(bundle) = actions.get_mut(&action_handle) { bundle.add(action); } else { - actions.insert(action_handle, ActionsBundle::new_with(action)); + actions.insert(action_handle, ActionsList::new_with(action)); } } diff --git a/pagetop/src/core/action/bundle.rs b/pagetop/src/core/action/list.rs similarity index 81% rename from pagetop/src/core/action/bundle.rs rename to pagetop/src/core/action/list.rs index 2d4ea49d..699c76b4 100644 --- a/pagetop/src/core/action/bundle.rs +++ b/pagetop/src/core/action/list.rs @@ -11,15 +11,15 @@ macro_rules! action { }}; } -pub struct ActionsBundle(Arc<RwLock<Vec<Action>>>); +pub struct ActionsList(Arc<RwLock<Vec<Action>>>); -impl ActionsBundle { +impl ActionsList { pub fn new() -> Self { - ActionsBundle(Arc::new(RwLock::new(Vec::new()))) + ActionsList(Arc::new(RwLock::new(Vec::new()))) } pub fn new_with(action: Action) -> Self { - let mut bundle = ActionsBundle::new(); + let mut bundle = ActionsList::new(); bundle.add(action); bundle } From 7138b9c58b900f450b51afb88c79e212969d21b0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 26 Jun 2023 20:42:38 +0200 Subject: [PATCH 393/853] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20orden=20ejecuc?= =?UTF-8?q?i=C3=B3n=20de=20acciones=20de=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/response/page.rs | 4 +- ..._prepare_page.rs => before_render_page.rs} | 12 +++--- pagetop/src/response/page/definition.rs | 41 +++++++------------ 4 files changed, 24 insertions(+), 35 deletions(-) rename pagetop/src/response/page/{after_prepare_page.rs => before_render_page.rs} (78%) diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index e2381370..47c921a8 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -72,7 +72,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } } - fn after_prepare_page(&self, page: &mut Page) { + fn before_render_page(&self, page: &mut Page) { if page.favicon().is_none() { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 799faa9f..bde474ab 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -3,8 +3,8 @@ pub use actix_web::Result as ResultPage; mod before_prepare_page; pub use before_prepare_page::{ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE}; -mod after_prepare_page; -pub use after_prepare_page::{ActionAfterPreparePage, ACTION_AFTER_PREPARE_PAGE}; +mod before_render_page; +pub use before_render_page::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; mod definition; pub use definition::Page; diff --git a/pagetop/src/response/page/after_prepare_page.rs b/pagetop/src/response/page/before_render_page.rs similarity index 78% rename from pagetop/src/response/page/after_prepare_page.rs rename to pagetop/src/response/page/before_render_page.rs index 21f94976..216d018d 100644 --- a/pagetop/src/response/page/after_prepare_page.rs +++ b/pagetop/src/response/page/before_render_page.rs @@ -2,25 +2,25 @@ use crate::core::action::{ActionTrait, AnyAction}; use crate::response::page::Page; use crate::{use_handle, Handle}; -use_handle!(ACTION_AFTER_PREPARE_PAGE); +use_handle!(ACTION_BEFORE_RENDER_PAGE); type Action = fn(&mut Page); -pub struct ActionAfterPreparePage { +pub struct ActionBeforeRenderPage { action: Option<Action>, weight: isize, } -impl ActionTrait for ActionAfterPreparePage { +impl ActionTrait for ActionBeforeRenderPage { fn new() -> Self { - ActionAfterPreparePage { + ActionBeforeRenderPage { action: None, weight: 0, } } fn handle(&self) -> Handle { - ACTION_AFTER_PREPARE_PAGE + ACTION_BEFORE_RENDER_PAGE } fn weight(&self) -> isize { @@ -32,7 +32,7 @@ impl ActionTrait for ActionAfterPreparePage { } } -impl ActionAfterPreparePage { +impl ActionBeforeRenderPage { pub fn with_action(mut self, action: Action) -> Self { self.action = Some(action); self diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 59c52f56..c7ae62d6 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -3,11 +3,10 @@ use crate::core::action::{action_ref, run_actions}; use crate::core::component::{ComponentTrait, ContextOp, OneComponent, RenderContext}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; -use crate::locale::{langid_for, LanguageIdentifier}; use crate::response::fatal_error::FatalError; use crate::response::page::ResultPage; -use crate::response::page::{ActionAfterPreparePage, ACTION_AFTER_PREPARE_PAGE}; use crate::response::page::{ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE}; +use crate::response::page::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; use crate::{fn_builder, service}; use unic_langid::CharacterDirection; @@ -54,12 +53,6 @@ impl Page { // Page BUILDER. - #[fn_builder] - pub fn alter_language(&mut self, language: &'static str) -> &mut Self { - self.context.alter(ContextOp::LangId(langid_for(language))); - self - } - #[fn_builder] pub fn alter_title(&mut self, title: L10n) -> &mut Self { self.title.set(title); @@ -116,10 +109,6 @@ impl Page { // Page GETTERS. - pub fn langid(&self) -> &LanguageIdentifier { - self.context.langid() - } - pub fn title(&mut self) -> String { self.title.prepare(&mut self.context).into_string() } @@ -155,31 +144,31 @@ impl Page { // Page RENDER. pub fn render(&mut self) -> ResultPage<Markup, FatalError> { - // Acciones de los módulos antes de preparar la página. + // Module actions before preparing the page. run_actions(ACTION_BEFORE_PREPARE_PAGE, |action| { action_ref::<ActionBeforePreparePage>(&**action).run(self) }); - // Acciones del tema antes de preparar la página. + // Theme actions before preparing the page. self.context.theme().before_prepare_page(self); - // Primero, preparar el cuerpo. + // Prepare page body. let body = self.context.theme().prepare_page_body(self); - // Luego, preparar la cabecera. - let head = self.context.theme().prepare_page_head(self); - - // Acciones de los módulos después de preparar la página. - run_actions(ACTION_AFTER_PREPARE_PAGE, |action| { - action_ref::<ActionAfterPreparePage>(&**action).run(self) + // Module actions before rendering the page. + run_actions(ACTION_BEFORE_RENDER_PAGE, |action| { + action_ref::<ActionBeforeRenderPage>(&**action).run(self) }); - // Acciones del tema después de preparar la página. - self.context.theme().after_prepare_page(self); + // Theme actions before rendering the page. + self.context.theme().before_render_page(self); - // Finalmente, renderiza la página. - let lang = self.langid().language.as_str(); - let dir = match self.langid().character_direction() { + // Prepare page head. + let head = self.context.theme().prepare_page_head(self); + + // Render the page. + let lang = self.context.langid().language.as_str(); + let dir = match self.context.langid().character_direction() { CharacterDirection::LTR => "ltr", CharacterDirection::RTL => "rtl", }; From e033630d2ac1900a4ab00920c3bf39d44cff9682 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 26 Jun 2023 21:23:48 +0200 Subject: [PATCH 394/853] =?UTF-8?q?=F0=9F=9A=A7=20[jquery]=20Preparando=20?= =?UTF-8?q?el=20m=C3=B3dulo=20para=20un=20tutorial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/src/lib.rs | 42 +++++++++++++--------- pagetop-jquery/src/locale/en-US/module.flt | 2 ++ pagetop-jquery/src/locale/es-ES/module.flt | 2 ++ 3 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 pagetop-jquery/src/locale/en-US/module.flt create mode 100644 pagetop-jquery/src/locale/es-ES/module.flt diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 216db02d..d3df0573 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -2,10 +2,11 @@ use pagetop::prelude::*; use_handle!(MODULE_JQUERY); +use_locale!(LOCALE_JQUERY); + use_static!(jquery); const JQUERY_PARAM: &str = "jquery.add"; -const JQUERY_SOURCE: &str = "/jquery/3.6.0/jquery.min.js"; pub struct JQuery; @@ -14,6 +15,18 @@ impl ModuleTrait for JQuery { MODULE_JQUERY } + fn actions(&self) -> Vec<Action> { + vec![action!(ActionBeforeRenderPage => before_render_page)] + } + + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALE_JQUERY) + } + + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALE_JQUERY) + } + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/jquery", jquery); } @@ -21,23 +34,20 @@ impl ModuleTrait for JQuery { impl JQuery { pub fn add_jquery(rcx: &mut RenderContext) { - match rcx.get_param::<bool>(JQUERY_PARAM) { - Some(true) => {} - _ => { - rcx.alter(ContextOp::AddJavaScript( - JavaScript::located(JQUERY_SOURCE) - .with_weight(isize::MIN) - .with_mode(ModeJS::Normal), - )); - rcx.set_param::<bool>(JQUERY_PARAM, true); - } - } + rcx.set_param::<bool>(JQUERY_PARAM, true); } pub fn remove_jquery(rcx: &mut RenderContext) { - if let Some(true) = rcx.get_param::<bool>(JQUERY_PARAM) { - rcx.alter(ContextOp::RemoveJavaScript(JQUERY_SOURCE)); - rcx.set_param::<bool>(JQUERY_PARAM, false); - } + rcx.set_param::<bool>(JQUERY_PARAM, false); + } +} + +fn before_render_page(page: &mut Page) { + if let Some(true) = page.context().get_param::<bool>(JQUERY_PARAM) { + page.context().alter(ContextOp::AddJavaScript( + JavaScript::located("/jquery/3.6.0/jquery.min.js") + .with_weight(isize::MIN) + .with_mode(ModeJS::Normal), + )); } } diff --git a/pagetop-jquery/src/locale/en-US/module.flt b/pagetop-jquery/src/locale/en-US/module.flt new file mode 100644 index 00000000..daa96fa3 --- /dev/null +++ b/pagetop-jquery/src/locale/en-US/module.flt @@ -0,0 +1,2 @@ +module_name = jQuery support +module_description = Integrate the jQuery library into web pages generated by other modules. diff --git a/pagetop-jquery/src/locale/es-ES/module.flt b/pagetop-jquery/src/locale/es-ES/module.flt new file mode 100644 index 00000000..df1c7b93 --- /dev/null +++ b/pagetop-jquery/src/locale/es-ES/module.flt @@ -0,0 +1,2 @@ +module_name = Soporte a jQuery +module_description = Incorpora la librería jQuery en páginas web generadas por otros módulos. From ea782f820ddad80c0bfffebad9ccca7f5b6cbb65 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 26 Jun 2023 22:27:00 +0200 Subject: [PATCH 395/853] =?UTF-8?q?=F0=9F=92=A5=20Simplifica=20renderizado?= =?UTF-8?q?=20de=20estilos=20y=20javascripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elimina la necesidad de incluir la versión como un campo más del activo. Será buena práctica de los desarrolladores incluir la versión ("?v=X.Y.Z") en la propia localización del activo, ya sea una hoja de estilos o un archivo JavaScript. --- pagetop/src/html/assets/javascript.rs | 13 +------------ pagetop/src/html/assets/stylesheet.rs | 18 +----------------- 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index be7a42f2..848c81bc 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -13,8 +13,6 @@ pub enum ModeJS { #[derive(Default)] pub struct JavaScript { source : String, - prefix : &'static str, - version: &'static str, weight : isize, mode : ModeJS, } @@ -31,7 +29,7 @@ impl AssetsTrait for JavaScript { fn prepare(&self) -> Markup { html! { script type="text/javascript" - src=(crate::concat_string!(self.source, self.prefix, self.version)) + src=(self.source) async[self.mode == ModeJS::Async] defer[self.mode == ModeJS::Defer] {}; @@ -50,15 +48,6 @@ impl JavaScript { } } - pub fn with_version(mut self, version: &'static str) -> Self { - (self.prefix, self.version) = if version.is_empty() { - ("", "") - } else { - ("?ver=", version) - }; - self - } - pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 339f44f6..0afecfb7 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -12,8 +12,6 @@ pub enum TargetMedia { #[derive(Default)] pub struct StyleSheet { source : String, - prefix : &'static str, - version: &'static str, media : Option<&'static str>, weight : isize, } @@ -28,12 +26,7 @@ impl AssetsTrait for StyleSheet { } fn prepare(&self) -> Markup { - html! { - link - rel="stylesheet" - href=(crate::concat_string!(self.source, self.prefix, self.version)) - media=[self.media]; - } + html! { link rel="stylesheet" href=(self.source) media=[self.media]; } } } @@ -48,15 +41,6 @@ impl StyleSheet { } } - pub fn with_version(mut self, version: &'static str) -> Self { - (self.prefix, self.version) = if version.is_empty() { - ("", "") - } else { - ("?ver=", version) - }; - self - } - pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self From bf356774f887009afbf70401ed8f4eb0f401bd31 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 26 Jun 2023 22:28:28 +0200 Subject: [PATCH 396/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Aplica=20cambio?= =?UTF-8?q?=20de=20uso=20de=20estilos=20y=20javascripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 7 ++----- pagetop-bulmix/src/lib.rs | 4 +--- pagetop-megamenu/src/component.rs | 18 +++++++++--------- pagetop-minimal/src/component/icon.rs | 6 +++--- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 976d37d1..caa103b4 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -45,13 +45,10 @@ impl ThemeTrait for Bootsier { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bootsier/css/bootstrap.min.css") - .with_version("5.1.3") - .with_weight(-99), + StyleSheet::located("/bootsier/css/bootstrap.min.css?v=5.1.3").with_weight(-99), )) .alter_context(ContextOp::AddJavaScript( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") - .with_version("5.1.3") + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js?v=5.1.3") .with_weight(-99), )); pagetop_jquery::JQuery::add_jquery(page.context()); diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 59fc8dee..6dc04a8a 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -33,9 +33,7 @@ impl ThemeTrait for Bulmix { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bulmix/css/bulma.min.css") - .with_version("0.9.4") - .with_weight(-99), + StyleSheet::located("/bulmix/css/bulma.min.css?v=0.9.4").with_weight(-99), )); pagetop_jquery::JQuery::add_jquery(page.context()); } diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 0ec50ec1..c6747943 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -192,15 +192,15 @@ impl ComponentTrait for MegaMenu { } fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { - rcx.alter(ContextOp::AddStyleSheet( - StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddStyleSheet( - StyleSheet::located("/megamenu/css/menu-clean.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddJavaScript( - JavaScript::located("/megamenu/js/menu.min.js").with_version("1.1.1"), - )); + rcx.alter(ContextOp::AddStyleSheet(StyleSheet::located( + "/megamenu/css/menu.css?v=1.1.1", + ))) + .alter(ContextOp::AddStyleSheet(StyleSheet::located( + "/megamenu/css/menu-clean.css?v=1.1.1", + ))) + .alter(ContextOp::AddJavaScript(JavaScript::located( + "/megamenu/js/menu.min.js?v=1.1.1", + ))); pagetop_jquery::JQuery::add_jquery(rcx); let id = rcx.required_id::<MegaMenu>(self.id()); diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 7d5599f8..87cb564d 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -29,9 +29,9 @@ impl ComponentTrait for Icon { } fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - rcx.alter(ContextOp::AddStyleSheet( - StyleSheet::located("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), - )); + rcx.alter(ContextOp::AddStyleSheet(StyleSheet::located( + "/minimal/icons/bootstrap-icons.css?v=1.8.2", + ))); } fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { From 751809a0cb5fa74efb2247aa017dff070066679a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 26 Jun 2023 22:29:15 +0200 Subject: [PATCH 397/853] =?UTF-8?q?=F0=9F=9A=A7=20[jquery]=20Afina=20cambi?= =?UTF-8?q?os=20para=20el=20tutorial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/src/lib.rs | 10 +++++----- pagetop-jquery/static/{3.6.0 => }/jquery.min.js | 0 pagetop-jquery/static/{3.6.0 => }/jquery.min.map | 0 3 files changed, 5 insertions(+), 5 deletions(-) rename pagetop-jquery/static/{3.6.0 => }/jquery.min.js (100%) rename pagetop-jquery/static/{3.6.0 => }/jquery.min.map (100%) diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index d3df0573..f9cbd26c 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -15,10 +15,6 @@ impl ModuleTrait for JQuery { MODULE_JQUERY } - fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforeRenderPage => before_render_page)] - } - fn name(&self) -> L10n { L10n::t("module_name", &LOCALE_JQUERY) } @@ -27,6 +23,10 @@ impl ModuleTrait for JQuery { L10n::t("module_description", &LOCALE_JQUERY) } + fn actions(&self) -> Vec<Action> { + vec![action!(ActionBeforeRenderPage => before_render_page)] + } + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/jquery", jquery); } @@ -45,7 +45,7 @@ impl JQuery { fn before_render_page(page: &mut Page) { if let Some(true) = page.context().get_param::<bool>(JQUERY_PARAM) { page.context().alter(ContextOp::AddJavaScript( - JavaScript::located("/jquery/3.6.0/jquery.min.js") + JavaScript::located("/jquery/jquery.min.js?v=3.6.0") .with_weight(isize::MIN) .with_mode(ModeJS::Normal), )); diff --git a/pagetop-jquery/static/3.6.0/jquery.min.js b/pagetop-jquery/static/jquery.min.js similarity index 100% rename from pagetop-jquery/static/3.6.0/jquery.min.js rename to pagetop-jquery/static/jquery.min.js diff --git a/pagetop-jquery/static/3.6.0/jquery.min.map b/pagetop-jquery/static/jquery.min.map similarity index 100% rename from pagetop-jquery/static/3.6.0/jquery.min.map rename to pagetop-jquery/static/jquery.min.map From 59f7ea91851e7c87d639bbeabe44c8102d91e606 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 26 Jun 2023 23:59:48 +0200 Subject: [PATCH 398/853] =?UTF-8?q?=F0=9F=94=96=20[build]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-build/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-build/Cargo.toml b/pagetop-build/Cargo.toml index 99acee85..3055f5fc 100644 --- a/pagetop-build/Cargo.toml +++ b/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From 09f5a1902d01902cf5c320839cc86fb805d53995 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:02:23 +0200 Subject: [PATCH 399/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.41?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 3cf6584a..7b26e61e 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.40" +version = "0.0.41" edition = "2021" authors = [ From c9d6951d6d05b005de36b2d79131f8c59f4a7502 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:05:40 +0200 Subject: [PATCH 400/853] =?UTF-8?q?=F0=9F=94=96=20[minimal]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index e531cad5..87425845 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From 23b4c01838993e79b3bedec3f81032a57598fcdd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:09:30 +0200 Subject: [PATCH 401/853] =?UTF-8?q?=F0=9F=94=96=20[jquery]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index 0c4e062f..f691e002 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-jquery" -version = "0.0.3" +version = "0.0.4" edition = "2021" authors = [ From 879032d2adadaadda2a49d2f173b73f790f8f4d6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:12:07 +0200 Subject: [PATCH 402/853] =?UTF-8?q?=F0=9F=94=96=20[megamenu]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index b4969b17..395dc6b1 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From 44661fea184a9c6bab9693d09b6678ed5440781d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:14:31 +0200 Subject: [PATCH 403/853] =?UTF-8?q?=F0=9F=94=96=20[aliner]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index 877ed4f8..e7b6839e 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-aliner" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From d974969919744170a772d8f3c7e4f8e5b1c04d35 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:17:03 +0200 Subject: [PATCH 404/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 1e6971d0..820aae00 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From e65be13b65b59519ba5502977f509e1610dc85e3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:19:33 +0200 Subject: [PATCH 405/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index c83b2a82..bf00a941 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From dede9ee9dd8c4800cf1724c61f34ee7afb0ae4f0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:23:42 +0200 Subject: [PATCH 406/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index f4de1f8b..f119881e 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From ea1ca1d371d5acd27a43cbab696711238817a4f4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:26:18 +0200 Subject: [PATCH 407/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 0e8b6c0d..8b5b884a 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From a2de35beed95b7d138a46f5b84234c55a458b967 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:29:15 +0200 Subject: [PATCH 408/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 61e19dc7..bf602ac4 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From 7bd42439478ef66883273d5b8488486d2bd4bcdb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 27 Jun 2023 00:32:08 +0200 Subject: [PATCH 409/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 979ced0d..a42948b5 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From 50abc73d8a10ec34b1a957b06541e290dd9d126b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 28 Jun 2023 00:22:56 +0200 Subject: [PATCH 410/853] =?UTF-8?q?=F0=9F=8E=A8=20Las=20acciones=20pasan?= =?UTF-8?q?=20a=20la=20estructura=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base.rs | 6 +- pagetop/src/base/{action.rs => actions.rs} | 4 + .../after_prepare_component.rs | 6 +- .../before_prepare_component.rs | 6 +- pagetop/src/base/actions/block.rs | 8 + pagetop/src/base/actions/page.rs | 13 ++ .../actions}/page/before_prepare_page.rs | 19 +- .../actions}/page/before_render_page.rs | 19 +- .../src/base/{component.rs => components.rs} | 0 .../base/{component => components}/block.rs | 8 +- .../base/{component => components}/html.rs | 0 .../base/{component => components}/l10n.rs | 0 pagetop/src/base/theme.rs | 2 - pagetop/src/base/themes.rs | 2 + pagetop/src/base/{theme => themes}/basic.rs | 0 pagetop/src/core/action/all.rs | 8 +- pagetop/src/core/action/list.rs | 16 +- pagetop/src/core/component/context.rs | 2 +- pagetop/src/core/component/pack.rs | 6 +- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/locale.rs | 2 +- pagetop/src/prelude.rs | 4 +- pagetop/src/response/fatal_error.rs | 2 +- pagetop/src/response/page.rs | 192 ++++++++++++++++- pagetop/src/response/page/definition.rs | 195 ------------------ 27 files changed, 275 insertions(+), 251 deletions(-) rename pagetop/src/base/{action.rs => actions.rs} (65%) rename pagetop/src/base/{action => actions}/after_prepare_component.rs (90%) rename pagetop/src/base/{action => actions}/before_prepare_component.rs (89%) create mode 100644 pagetop/src/base/actions/block.rs create mode 100644 pagetop/src/base/actions/page.rs rename pagetop/src/{response => base/actions}/page/before_prepare_page.rs (69%) rename pagetop/src/{response => base/actions}/page/before_render_page.rs (69%) rename pagetop/src/base/{component.rs => components.rs} (100%) rename pagetop/src/base/{component => components}/block.rs (93%) rename pagetop/src/base/{component => components}/html.rs (100%) rename pagetop/src/base/{component => components}/l10n.rs (100%) delete mode 100644 pagetop/src/base/theme.rs create mode 100644 pagetop/src/base/themes.rs rename pagetop/src/base/{theme => themes}/basic.rs (100%) delete mode 100644 pagetop/src/response/page/definition.rs diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index acfd1dbe..49ae12b4 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,5 +1,5 @@ -pub mod action; +pub mod actions; -pub mod component; +pub mod components; -pub mod theme; +pub mod themes; diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/actions.rs similarity index 65% rename from pagetop/src/base/action.rs rename to pagetop/src/base/actions.rs index de26ffe3..3764ff1e 100644 --- a/pagetop/src/base/action.rs +++ b/pagetop/src/base/actions.rs @@ -1,3 +1,7 @@ mod before_prepare_component; mod after_prepare_component; + +pub mod block; + +pub mod page; diff --git a/pagetop/src/base/action/after_prepare_component.rs b/pagetop/src/base/actions/after_prepare_component.rs similarity index 90% rename from pagetop/src/base/action/after_prepare_component.rs rename to pagetop/src/base/actions/after_prepare_component.rs index 44a9a4d5..00f9cdb1 100644 --- a/pagetop/src/base/action/after_prepare_component.rs +++ b/pagetop/src/base/actions/after_prepare_component.rs @@ -4,10 +4,10 @@ macro_rules! action_after_prepare_component { $crate::paste! { $crate::use_handle!($ACTION_HANDLE); - type Action = fn(&$Component, &mut RenderContext); + pub type ActionAfter = fn(component: &$Component, rcx: &mut RenderContext); pub struct [<AfterPrepare $Component>] { - action: Option<Action>, + action: Option<ActionAfter>, weight: isize, } @@ -34,7 +34,7 @@ macro_rules! action_after_prepare_component { impl [<AfterPrepare $Component>] { #[allow(dead_code)] - pub fn with_action(mut self, action: Action) -> Self { + pub fn with_action(mut self, action: ActionAfter) -> Self { self.action = Some(action); self } diff --git a/pagetop/src/base/action/before_prepare_component.rs b/pagetop/src/base/actions/before_prepare_component.rs similarity index 89% rename from pagetop/src/base/action/before_prepare_component.rs rename to pagetop/src/base/actions/before_prepare_component.rs index e0ed8eee..29e435dc 100644 --- a/pagetop/src/base/action/before_prepare_component.rs +++ b/pagetop/src/base/actions/before_prepare_component.rs @@ -4,10 +4,10 @@ macro_rules! action_before_prepare_component { $crate::paste! { $crate::use_handle!($ACTION_HANDLE); - type Action = fn(&$Component, &mut RenderContext); + pub type ActionBefore = fn(component: &$Component, rcx: &mut RenderContext); pub struct [<BeforePrepare $Component>] { - action: Option<Action>, + action: Option<ActionBefore>, weight: isize, } @@ -34,7 +34,7 @@ macro_rules! action_before_prepare_component { impl [<BeforePrepare $Component>] { #[allow(dead_code)] - pub fn with_action(mut self, action: Action) -> Self { + pub fn with_action(mut self, action: ActionBefore) -> Self { self.action = Some(action); self } diff --git a/pagetop/src/base/actions/block.rs b/pagetop/src/base/actions/block.rs new file mode 100644 index 00000000..25b364ad --- /dev/null +++ b/pagetop/src/base/actions/block.rs @@ -0,0 +1,8 @@ +use crate::prelude::*; + +action_before_prepare_component!( + ACTION_BEFORE_PREPARE_BLOCK for Block +); +action_after_prepare_component!( + ACTION_AFTER_PREPARE_BLOCK for Block +); diff --git a/pagetop/src/base/actions/page.rs b/pagetop/src/base/actions/page.rs new file mode 100644 index 00000000..20e55a3a --- /dev/null +++ b/pagetop/src/base/actions/page.rs @@ -0,0 +1,13 @@ +use crate::prelude::*; + +pub type ActionPage = fn(page: &mut Page); + +mod before_prepare_page; +pub use before_prepare_page::{ + run_actions_before_prepare_page, ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE, +}; + +mod before_render_page; +pub use before_render_page::{ + run_actions_before_render_page, ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE, +}; diff --git a/pagetop/src/response/page/before_prepare_page.rs b/pagetop/src/base/actions/page/before_prepare_page.rs similarity index 69% rename from pagetop/src/response/page/before_prepare_page.rs rename to pagetop/src/base/actions/page/before_prepare_page.rs index e246738a..13fdd909 100644 --- a/pagetop/src/response/page/before_prepare_page.rs +++ b/pagetop/src/base/actions/page/before_prepare_page.rs @@ -1,13 +1,11 @@ -use crate::core::action::{ActionTrait, AnyAction}; -use crate::response::page::Page; -use crate::{use_handle, Handle}; +use crate::prelude::*; + +use super::ActionPage; use_handle!(ACTION_BEFORE_PREPARE_PAGE); -type Action = fn(&mut Page); - pub struct ActionBeforePreparePage { - action: Option<Action>, + action: Option<ActionPage>, weight: isize, } @@ -33,7 +31,7 @@ impl ActionTrait for ActionBeforePreparePage { } impl ActionBeforePreparePage { - pub fn with_action(mut self, action: Action) -> Self { + pub fn with_action(mut self, action: ActionPage) -> Self { self.action = Some(action); self } @@ -49,3 +47,10 @@ impl ActionBeforePreparePage { } } } + +#[inline(always)] +pub fn run_actions_before_prepare_page(page: &mut Page) { + run_actions(ACTION_BEFORE_PREPARE_PAGE, |action| { + action_ref::<ActionBeforePreparePage>(&**action).run(page) + }); +} diff --git a/pagetop/src/response/page/before_render_page.rs b/pagetop/src/base/actions/page/before_render_page.rs similarity index 69% rename from pagetop/src/response/page/before_render_page.rs rename to pagetop/src/base/actions/page/before_render_page.rs index 216d018d..d035d2d8 100644 --- a/pagetop/src/response/page/before_render_page.rs +++ b/pagetop/src/base/actions/page/before_render_page.rs @@ -1,13 +1,11 @@ -use crate::core::action::{ActionTrait, AnyAction}; -use crate::response::page::Page; -use crate::{use_handle, Handle}; +use crate::prelude::*; + +use super::ActionPage; use_handle!(ACTION_BEFORE_RENDER_PAGE); -type Action = fn(&mut Page); - pub struct ActionBeforeRenderPage { - action: Option<Action>, + action: Option<ActionPage>, weight: isize, } @@ -33,7 +31,7 @@ impl ActionTrait for ActionBeforeRenderPage { } impl ActionBeforeRenderPage { - pub fn with_action(mut self, action: Action) -> Self { + pub fn with_action(mut self, action: ActionPage) -> Self { self.action = Some(action); self } @@ -49,3 +47,10 @@ impl ActionBeforeRenderPage { } } } + +#[inline(always)] +pub fn run_actions_before_render_page(page: &mut Page) { + run_actions(ACTION_BEFORE_RENDER_PAGE, |action| { + action_ref::<ActionBeforeRenderPage>(&**action).run(page) + }); +} diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/components.rs similarity index 100% rename from pagetop/src/base/component.rs rename to pagetop/src/base/components.rs diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/components/block.rs similarity index 93% rename from pagetop/src/base/component/block.rs rename to pagetop/src/base/components/block.rs index 78cd707d..1f443e95 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/components/block.rs @@ -2,8 +2,6 @@ use crate::prelude::*; use_handle!(COMPONENT_BLOCK); -action_before_prepare_component!(ACTION_BEFORE_PREPARE_BLOCK for Block); - #[rustfmt::skip] #[derive(Default)] pub struct Block { @@ -38,7 +36,7 @@ impl ComponentTrait for Block { } fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - run_actions_before_prepare_component(self, rcx); + actions::block::run_actions_before_prepare_component(self, rcx); } fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { @@ -55,6 +53,10 @@ impl ComponentTrait for Block { }) } + fn after_prepare_component(&mut self, rcx: &mut RenderContext) { + actions::block::run_actions_after_prepare_component(self, rcx); + } + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/components/html.rs similarity index 100% rename from pagetop/src/base/component/html.rs rename to pagetop/src/base/components/html.rs diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/components/l10n.rs similarity index 100% rename from pagetop/src/base/component/l10n.rs rename to pagetop/src/base/components/l10n.rs diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs deleted file mode 100644 index c135c08d..00000000 --- a/pagetop/src/base/theme.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod basic; -pub(crate) use basic::Basic; diff --git a/pagetop/src/base/themes.rs b/pagetop/src/base/themes.rs new file mode 100644 index 00000000..3a192746 --- /dev/null +++ b/pagetop/src/base/themes.rs @@ -0,0 +1,2 @@ +mod basic; +pub use basic::Basic; diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/themes/basic.rs similarity index 100% rename from pagetop/src/base/theme/basic.rs rename to pagetop/src/base/themes/basic.rs diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index 9737d98c..6273c2e7 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -11,8 +11,8 @@ static ACTIONS: LazyStatic<RwLock<HashMap<Handle, ActionsList>>> = pub fn add_action(action: Action) { let mut actions = ACTIONS.write().unwrap(); let action_handle = action.handle(); - if let Some(bundle) = actions.get_mut(&action_handle) { - bundle.add(action); + if let Some(list) = actions.get_mut(&action_handle) { + list.add(action); } else { actions.insert(action_handle, ActionsList::new_with(action)); } @@ -22,7 +22,7 @@ pub fn run_actions<B, F>(action_handle: Handle, f: F) where F: FnMut(&Action) -> B, { - if let Some(bundle) = ACTIONS.read().unwrap().get(&action_handle) { - bundle.iter_map(f) + if let Some(list) = ACTIONS.read().unwrap().get(&action_handle) { + list.iter_map(f) } } diff --git a/pagetop/src/core/action/list.rs b/pagetop/src/core/action/list.rs index 699c76b4..99ea1887 100644 --- a/pagetop/src/core/action/list.rs +++ b/pagetop/src/core/action/list.rs @@ -6,8 +6,8 @@ pub type Action = Box<dyn ActionTrait>; #[macro_export] macro_rules! action { - ( $action:ident => $f:ident $(, $weight:expr)? ) => {{ - Box::new($action::new().with_action($f)$(.with_weight($weight))?) + ( $action:ty => $f:ident $(, $weight:expr)? ) => {{ + Box::new(<$action>::new().with_action($f)$(.with_weight($weight))?) }}; } @@ -19,15 +19,15 @@ impl ActionsList { } pub fn new_with(action: Action) -> Self { - let mut bundle = ActionsList::new(); - bundle.add(action); - bundle + let mut list = ActionsList::new(); + list.add(action); + list } pub fn add(&mut self, action: Action) { - let mut bundle = self.0.write().unwrap(); - bundle.push(action); - bundle.sort_by_key(|a| a.weight()); + let mut list = self.0.write().unwrap(); + list.push(action); + list.sort_by_key(|a| a.weight()); } pub fn iter_map<B, F>(&self, f: F) diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index f95da247..39f1a356 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -10,7 +10,7 @@ use std::str::FromStr; static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::base::theme::Basic, + None => &crate::base::themes::Basic, }); pub enum ContextOp { diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index 4da60920..d50d7d14 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -25,9 +25,9 @@ impl PackComponents { } pub fn new_with(component: impl ComponentTrait) -> Self { - let mut bundle = PackComponents::new(); - bundle.alter_pack(PackOp::Add, component); - bundle + let mut pack = PackComponents::new(); + pack.alter_pack(PackOp::Add, component); + pack } pub(crate) fn merge(one: Option<&PackComponents>, other: Option<&PackComponents>) -> Self { diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 428fbfc4..b5db24c8 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleStaticRef) { let mut list: Vec<ModuleStaticRef> = Vec::new(); // Enable basic theme. - add_to_enabled(&mut list, &crate::base::theme::Basic); + add_to_enabled(&mut list, &crate::base::themes::Basic); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 5b1057f9..21aabba2 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,4 +1,4 @@ -use crate::base::component::L10n; +use crate::base::components::L10n; use crate::core::action::Action; use crate::core::theme::ThemeStaticRef; use crate::{service, util, Handle}; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 47c921a8..b801f3c8 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,4 +1,4 @@ -use crate::base::component::L10n; +use crate::base::components::L10n; use crate::core::component::{ComponentTrait, RenderContext}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index e755a196..bec587f3 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -87,7 +87,7 @@ //! use_locale!(LOCALE_SAMPLE["path/to/locale"]); //! ``` //! -//! Usa el componente [L10n](crate::base::component::L10n) para incluir textos y contenidos +//! Usa el componente [L10n](crate::base::components::L10n) para incluir textos y contenidos //! opcionalmente traducibles según el contexto de renderizado. use crate::{args, config, trace, LazyStatic}; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index ae67e289..c2039bf2 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -32,7 +32,9 @@ pub use crate::core::{action::*, component::*, module::*, theme::*}; pub use crate::{action, action_after_prepare_component, action_before_prepare_component}; -pub use crate::base::component::*; +pub use crate::base::actions; +pub use crate::base::components::*; +pub use crate::base::themes; pub use crate::service; pub use crate::service::HttpMessage; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 3994b91c..cf22a205 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::base::component::L10n; +use crate::base::components::L10n; use crate::response::{page::Page, ResponseError}; use crate::service::http::{header::ContentType, StatusCode}; use crate::service::{HttpRequest, HttpResponse}; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index bde474ab..19bbab3c 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,10 +1,190 @@ +use crate::base::actions; +use crate::base::components::L10n; +use crate::core::component::{ComponentTrait, ContextOp, OneComponent, RenderContext}; +use crate::core::theme::ComponentsRegions; +use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; +use crate::response::fatal_error::FatalError; +use crate::{fn_builder, service}; + +use unic_langid::CharacterDirection; + pub use actix_web::Result as ResultPage; -mod before_prepare_page; -pub use before_prepare_page::{ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE}; +type PageTitle = OneComponent<L10n>; +type PageDescription = OneComponent<L10n>; -mod before_render_page; -pub use before_render_page::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; +#[rustfmt::skip] +pub struct Page { + title : PageTitle, + description : PageDescription, + metadata : Vec<(&'static str, &'static str)>, + properties : Vec<(&'static str, &'static str)>, + favicon : Option<Favicon>, + context : RenderContext, + body_classes: Classes, + regions : ComponentsRegions, + template : String, +} -mod definition; -pub use definition::Page; +impl Default for Page { + #[rustfmt::skip] + fn default() -> Self { + Page { + title : PageTitle::new(), + description : PageDescription::new(), + metadata : Vec::new(), + properties : Vec::new(), + favicon : None, + context : RenderContext::new(), + body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), + regions : ComponentsRegions::new(), + template : "default".to_owned(), + } + } +} + +impl Page { + pub fn new(request: service::HttpRequest) -> Self { + let mut page = Page::default(); + page.context.alter(ContextOp::Request(Some(request))); + page + } + + // Page BUILDER. + + #[fn_builder] + pub fn alter_title(&mut self, title: L10n) -> &mut Self { + self.title.set(title); + self + } + + #[fn_builder] + pub fn alter_description(&mut self, description: L10n) -> &mut Self { + self.description.set(description); + self + } + + #[fn_builder] + pub fn alter_metadata(&mut self, name: &'static str, content: &'static str) -> &mut Self { + self.metadata.push((name, content)); + self + } + + #[fn_builder] + pub fn alter_property(&mut self, property: &'static str, content: &'static str) -> &mut Self { + self.metadata.push((property, content)); + self + } + + #[fn_builder] + pub fn alter_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { + self.favicon = favicon; + self + } + + #[fn_builder] + pub fn alter_context(&mut self, op: ContextOp) -> &mut Self { + self.context.alter(op); + self + } + + #[fn_builder] + pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.body_classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { + self.regions.add_to(region, component); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Page GETTERS. + + pub fn title(&mut self) -> String { + self.title.prepare(&mut self.context).into_string() + } + + pub fn description(&mut self) -> String { + self.description.prepare(&mut self.context).into_string() + } + + pub fn metadata(&self) -> &Vec<(&str, &str)> { + &self.metadata + } + + pub fn properties(&self) -> &Vec<(&str, &str)> { + &self.properties + } + + pub fn favicon(&self) -> &Option<Favicon> { + &self.favicon + } + + pub fn context(&mut self) -> &mut RenderContext { + &mut self.context + } + + pub fn body_classes(&self) -> &Classes { + &self.body_classes + } + + pub fn template(&self) -> &str { + self.template.as_str() + } + + // Page RENDER. + + pub fn render(&mut self) -> ResultPage<Markup, FatalError> { + // Module actions before preparing the page. + actions::page::run_actions_before_prepare_page(self); + + // Theme actions before preparing the page. + self.context.theme().before_prepare_page(self); + + // Prepare page body. + let body = self.context.theme().prepare_page_body(self); + + // Module actions before rendering the page. + actions::page::run_actions_before_render_page(self); + + // Theme actions before rendering the page. + self.context.theme().before_render_page(self); + + // Prepare page head. + let head = self.context.theme().prepare_page_head(self); + + // Render the page. + let lang = self.context.langid().language.as_str(); + let dir = match self.context.langid().character_direction() { + CharacterDirection::LTR => "ltr", + CharacterDirection::RTL => "rtl", + }; + Ok(html! { + (DOCTYPE) + html lang=(lang) dir=(dir) { + (head) + (body) + } + }) + } + + pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { + let render = self + .regions + .get_extended_pack(self.context.theme().single_name(), region) + .prepare(self.context()); + if render.is_empty() { + None + } else { + Some(render) + } + } +} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs deleted file mode 100644 index c7ae62d6..00000000 --- a/pagetop/src/response/page/definition.rs +++ /dev/null @@ -1,195 +0,0 @@ -use crate::base::component::L10n; -use crate::core::action::{action_ref, run_actions}; -use crate::core::component::{ComponentTrait, ContextOp, OneComponent, RenderContext}; -use crate::core::theme::ComponentsRegions; -use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; -use crate::response::fatal_error::FatalError; -use crate::response::page::ResultPage; -use crate::response::page::{ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE}; -use crate::response::page::{ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE}; -use crate::{fn_builder, service}; - -use unic_langid::CharacterDirection; - -type PageTitle = OneComponent<L10n>; -type PageDescription = OneComponent<L10n>; - -#[rustfmt::skip] -pub struct Page { - title : PageTitle, - description : PageDescription, - metadata : Vec<(&'static str, &'static str)>, - properties : Vec<(&'static str, &'static str)>, - favicon : Option<Favicon>, - context : RenderContext, - body_classes: Classes, - regions : ComponentsRegions, - template : String, -} - -impl Default for Page { - #[rustfmt::skip] - fn default() -> Self { - Page { - title : PageTitle::new(), - description : PageDescription::new(), - metadata : Vec::new(), - properties : Vec::new(), - favicon : None, - context : RenderContext::new(), - body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), - regions : ComponentsRegions::new(), - template : "default".to_owned(), - } - } -} - -impl Page { - pub fn new(request: service::HttpRequest) -> Self { - let mut page = Page::default(); - page.context.alter(ContextOp::Request(Some(request))); - page - } - - // Page BUILDER. - - #[fn_builder] - pub fn alter_title(&mut self, title: L10n) -> &mut Self { - self.title.set(title); - self - } - - #[fn_builder] - pub fn alter_description(&mut self, description: L10n) -> &mut Self { - self.description.set(description); - self - } - - #[fn_builder] - pub fn alter_metadata(&mut self, name: &'static str, content: &'static str) -> &mut Self { - self.metadata.push((name, content)); - self - } - - #[fn_builder] - pub fn alter_property(&mut self, property: &'static str, content: &'static str) -> &mut Self { - self.metadata.push((property, content)); - self - } - - #[fn_builder] - pub fn alter_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { - self.favicon = favicon; - self - } - - #[fn_builder] - pub fn alter_context(&mut self, op: ContextOp) -> &mut Self { - self.context.alter(op); - self - } - - #[fn_builder] - pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.body_classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_to(region, component); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Page GETTERS. - - pub fn title(&mut self) -> String { - self.title.prepare(&mut self.context).into_string() - } - - pub fn description(&mut self) -> String { - self.description.prepare(&mut self.context).into_string() - } - - pub fn metadata(&self) -> &Vec<(&str, &str)> { - &self.metadata - } - - pub fn properties(&self) -> &Vec<(&str, &str)> { - &self.properties - } - - pub fn favicon(&self) -> &Option<Favicon> { - &self.favicon - } - - pub fn context(&mut self) -> &mut RenderContext { - &mut self.context - } - - pub fn body_classes(&self) -> &Classes { - &self.body_classes - } - - pub fn template(&self) -> &str { - self.template.as_str() - } - - // Page RENDER. - - pub fn render(&mut self) -> ResultPage<Markup, FatalError> { - // Module actions before preparing the page. - run_actions(ACTION_BEFORE_PREPARE_PAGE, |action| { - action_ref::<ActionBeforePreparePage>(&**action).run(self) - }); - - // Theme actions before preparing the page. - self.context.theme().before_prepare_page(self); - - // Prepare page body. - let body = self.context.theme().prepare_page_body(self); - - // Module actions before rendering the page. - run_actions(ACTION_BEFORE_RENDER_PAGE, |action| { - action_ref::<ActionBeforeRenderPage>(&**action).run(self) - }); - - // Theme actions before rendering the page. - self.context.theme().before_render_page(self); - - // Prepare page head. - let head = self.context.theme().prepare_page_head(self); - - // Render the page. - let lang = self.context.langid().language.as_str(); - let dir = match self.context.langid().character_direction() { - CharacterDirection::LTR => "ltr", - CharacterDirection::RTL => "rtl", - }; - Ok(html! { - (DOCTYPE) - html lang=(lang) dir=(dir) { - (head) - (body) - } - }) - } - - pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { - let render = self - .regions - .get_extended_pack(self.context.theme().single_name(), region) - .prepare(self.context()); - if render.is_empty() { - None - } else { - Some(render) - } - } -} From c56cb256de19023286e29a137dfb1e2583603734 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 28 Jun 2023 00:24:22 +0200 Subject: [PATCH 411/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Incorpora=20mod?= =?UTF-8?q?ificaciones=20de=20la=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 3 ++- pagetop-bulmix/src/lib.rs | 3 ++- pagetop-jquery/src/lib.rs | 6 +++--- pagetop-megamenu/src/component.rs | 3 ++- pagetop-node/src/lib.rs | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 8495bed3..1fcd0c91 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforePreparePage => before_prepare_page)] + vec![action!(actions::page::ActionBeforePreparePage => before_prepare_page)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index caa103b4..eafe9e63 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,4 +1,5 @@ use pagetop::prelude::*; +use pagetop_jquery::JQuery; use_handle!(THEME_BOOTSIER); @@ -51,7 +52,7 @@ impl ThemeTrait for Bootsier { JavaScript::located("/bootsier/js/bootstrap.bundle.min.js?v=5.1.3") .with_weight(-99), )); - pagetop_jquery::JQuery::add_jquery(page.context()); + JQuery::add_in(page.context()); } fn prepare_page_body(&self, page: &mut Page) -> Markup { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 6dc04a8a..7959250c 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,4 +1,5 @@ use pagetop::prelude::*; +use pagetop_jquery::JQuery; use pagetop_minimal::component::*; use_handle!(THEME_BULMIX); @@ -35,7 +36,7 @@ impl ThemeTrait for Bulmix { .alter_context(ContextOp::AddStyleSheet( StyleSheet::located("/bulmix/css/bulma.min.css?v=0.9.4").with_weight(-99), )); - pagetop_jquery::JQuery::add_jquery(page.context()); + JQuery::add_in(page.context()); } #[rustfmt::skip] diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index f9cbd26c..b77fe74b 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -24,7 +24,7 @@ impl ModuleTrait for JQuery { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforeRenderPage => before_render_page)] + vec![action!(actions::page::ActionBeforeRenderPage => before_render_page)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { @@ -33,11 +33,11 @@ impl ModuleTrait for JQuery { } impl JQuery { - pub fn add_jquery(rcx: &mut RenderContext) { + pub fn add_in(rcx: &mut RenderContext) { rcx.set_param::<bool>(JQUERY_PARAM, true); } - pub fn remove_jquery(rcx: &mut RenderContext) { + pub fn remove_from(rcx: &mut RenderContext) { rcx.set_param::<bool>(JQUERY_PARAM, false); } } diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index c6747943..df68352d 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -1,4 +1,5 @@ use pagetop::prelude::*; +use pagetop_jquery::JQuery; use_handle!(COMPONENT_MEGAMENUITEM); @@ -201,7 +202,7 @@ impl ComponentTrait for MegaMenu { .alter(ContextOp::AddJavaScript(JavaScript::located( "/megamenu/js/menu.min.js?v=1.1.1", ))); - pagetop_jquery::JQuery::add_jquery(rcx); + JQuery::add_in(rcx); let id = rcx.required_id::<MegaMenu>(self.id()); diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index c6f6d073..00ae81ea 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforePreparePage => before_prepare_page, -1)] + vec![action!(actions::page::ActionBeforePreparePage => before_prepare_page, -1)] } fn migrations(&self) -> Vec<MigrationItem> { From a1d51d6d0f911466bcd47d046ef7136122ac0565 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 28 Jun 2023 23:22:09 +0200 Subject: [PATCH 412/853] =?UTF-8?q?=F0=9F=92=A5=20Simplifica=20RenderConte?= =?UTF-8?q?xt,=20ahora=20es=20s=C3=B3lo=20Context?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/actions/after_prepare_component.rs | 10 ++--- .../base/actions/before_prepare_component.rs | 10 ++--- pagetop/src/base/components/block.rs | 18 ++++---- pagetop/src/base/components/html.rs | 2 +- pagetop/src/base/components/l10n.rs | 6 +-- pagetop/src/core/component.rs | 2 +- pagetop/src/core/component/context.rs | 41 ++++++------------- pagetop/src/core/component/definition.rs | 28 ++++++------- pagetop/src/core/component/one.rs | 6 +-- pagetop/src/core/component/pack.rs | 6 +-- pagetop/src/core/component/renderable.rs | 6 +-- pagetop/src/core/theme/all.rs | 9 ++++ pagetop/src/core/theme/definition.rs | 8 ++-- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 9 ++-- pagetop/src/response/fatal_error/error403.rs | 4 +- pagetop/src/response/fatal_error/error404.rs | 4 +- pagetop/src/response/page.rs | 20 +++------ 18 files changed, 87 insertions(+), 104 deletions(-) diff --git a/pagetop/src/base/actions/after_prepare_component.rs b/pagetop/src/base/actions/after_prepare_component.rs index 00f9cdb1..34ca40b3 100644 --- a/pagetop/src/base/actions/after_prepare_component.rs +++ b/pagetop/src/base/actions/after_prepare_component.rs @@ -4,7 +4,7 @@ macro_rules! action_after_prepare_component { $crate::paste! { $crate::use_handle!($ACTION_HANDLE); - pub type ActionAfter = fn(component: &$Component, rcx: &mut RenderContext); + pub type ActionAfter = fn(component: &$Component, cx: &mut Context); pub struct [<AfterPrepare $Component>] { action: Option<ActionAfter>, @@ -45,9 +45,9 @@ macro_rules! action_after_prepare_component { self } - pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { + pub fn run(&self, component: &mut $Component, cx: &mut Context) { if let Some(action) = self.action { - action(component, rcx) + action(component, cx) } } } @@ -55,11 +55,11 @@ macro_rules! action_after_prepare_component { #[inline(always)] pub fn run_actions_after_prepare_component( component: &mut $Component, - rcx: &mut RenderContext + cx: &mut Context ) { run_actions($ACTION_HANDLE, |action| action_ref::<[<AfterPrepare $Component>]>(&**action) - .run(component, rcx) + .run(component, cx) ); } } diff --git a/pagetop/src/base/actions/before_prepare_component.rs b/pagetop/src/base/actions/before_prepare_component.rs index 29e435dc..6aac7090 100644 --- a/pagetop/src/base/actions/before_prepare_component.rs +++ b/pagetop/src/base/actions/before_prepare_component.rs @@ -4,7 +4,7 @@ macro_rules! action_before_prepare_component { $crate::paste! { $crate::use_handle!($ACTION_HANDLE); - pub type ActionBefore = fn(component: &$Component, rcx: &mut RenderContext); + pub type ActionBefore = fn(component: &$Component, cx: &mut Context); pub struct [<BeforePrepare $Component>] { action: Option<ActionBefore>, @@ -45,9 +45,9 @@ macro_rules! action_before_prepare_component { self } - pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { + pub fn run(&self, component: &mut $Component, cx: &mut Context) { if let Some(action) = self.action { - action(component, rcx) + action(component, cx) } } } @@ -55,11 +55,11 @@ macro_rules! action_before_prepare_component { #[inline(always)] pub fn run_actions_before_prepare_component( component: &mut $Component, - rcx: &mut RenderContext + cx: &mut Context ) { run_actions($ACTION_HANDLE, |action| action_ref::<[<BeforePrepare $Component>]>(&**action) - .run(component, rcx) + .run(component, cx) ); } } diff --git a/pagetop/src/base/components/block.rs b/pagetop/src/base/components/block.rs index 1f443e95..4a45b94d 100644 --- a/pagetop/src/base/components/block.rs +++ b/pagetop/src/base/components/block.rs @@ -31,30 +31,30 @@ impl ComponentTrait for Block { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - actions::block::run_actions_before_prepare_component(self, rcx); + fn before_prepare_component(&mut self, cx: &mut Context) { + actions::block::run_actions_before_prepare_component(self, cx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { - let id = rcx.required_id::<Block>(self.id()); + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let id = cx.required_id::<Block>(self.id()); PrepareMarkup::With(html! { div id=(id) class=[self.classes().get()] { @if let Some(title) = self.title().get() { h2 class="block-title" { (title) } } div class="block-body" { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } } }) } - fn after_prepare_component(&mut self, rcx: &mut RenderContext) { - actions::block::run_actions_after_prepare_component(self, rcx); + fn after_prepare_component(&mut self, cx: &mut Context) { + actions::block::run_actions_after_prepare_component(self, cx); } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop/src/base/components/html.rs b/pagetop/src/base/components/html.rs index 4c0ee6ed..eb436be4 100644 --- a/pagetop/src/base/components/html.rs +++ b/pagetop/src/base/components/html.rs @@ -14,7 +14,7 @@ impl ComponentTrait for Html { COMPONENT_HTML } - fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { (self.html()) }) } diff --git a/pagetop/src/base/components/l10n.rs b/pagetop/src/base/components/l10n.rs index 054f038e..5356204b 100644 --- a/pagetop/src/base/components/l10n.rs +++ b/pagetop/src/base/components/l10n.rs @@ -28,14 +28,14 @@ impl ComponentTrait for L10n { COMPONENT_L10N } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { match self.op() { L10nOp::None => PrepareMarkup::None, L10nOp::Text(text) => PrepareMarkup::Text(text), L10nOp::Translated(key, locales) => PrepareMarkup::With(html! { (locales .lookup_with_args( - rcx.langid(), + cx.langid(), key, &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); @@ -48,7 +48,7 @@ impl ComponentTrait for L10n { L10nOp::Escaped(key, locales) => PrepareMarkup::With(html! { (PreEscaped(locales .lookup_with_args( - rcx.langid(), + cx.langid(), key, &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { args.insert(key.to_string(), value.to_owned().into()); diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 94cb0528..7e50276b 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,5 +1,5 @@ mod context; -pub use context::{ContextOp, RenderContext}; +pub use context::{Context, ContextOp}; mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 39f1a356..1b12f955 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,22 +1,16 @@ -use crate::core::theme::{all::theme_by_single_name, ThemeStaticRef}; +use crate::core::theme::all::{theme_by_single_name, THEME}; +use crate::core::theme::ThemeStaticRef; use crate::html::{html, Assets, JavaScript, Markup, StyleSheet}; use crate::locale::{LanguageIdentifier, LANGID}; use crate::service::HttpRequest; -use crate::{concat_string, config, util, LazyStatic}; +use crate::{concat_string, util}; use std::collections::HashMap; use std::str::FromStr; -static THEME: LazyStatic<ThemeStaticRef> = - LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { - Some(theme) => theme, - None => &crate::base::themes::Basic, - }); - pub enum ContextOp { LangId(&'static LanguageIdentifier), Theme(&'static str), - Request(Option<HttpRequest>), AddStyleSheet(StyleSheet), RemoveStyleSheet(&'static str), AddJavaScript(JavaScript), @@ -24,35 +18,29 @@ pub enum ContextOp { } #[rustfmt::skip] -pub struct RenderContext { +pub struct Context { + request : HttpRequest, langid : &'static LanguageIdentifier, theme : ThemeStaticRef, - request : Option<HttpRequest>, stylesheets: Assets<StyleSheet>, javascripts: Assets<JavaScript>, params : HashMap<&'static str, String>, id_counter : usize, } -impl Default for RenderContext { +impl Context { #[rustfmt::skip] - fn default() -> Self { - RenderContext { + pub(crate) fn new(request: HttpRequest) -> Self { + Context { + request, langid : &LANGID, theme : *THEME, - request : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), params : HashMap::<&str, String>::new(), id_counter : 0, } } -} - -impl RenderContext { - pub(crate) fn new() -> Self { - RenderContext::default() - } pub fn alter(&mut self, op: ContextOp) -> &mut Self { match op { @@ -62,9 +50,6 @@ impl RenderContext { ContextOp::Theme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*THEME); } - ContextOp::Request(request) => { - self.request = request; - } ContextOp::AddStyleSheet(css) => { self.stylesheets.add(css); } @@ -88,6 +73,10 @@ impl RenderContext { /// Context GETTERS. + pub fn request(&self) -> &HttpRequest { + &self.request + } + pub(crate) fn langid(&self) -> &LanguageIdentifier { self.langid } @@ -96,10 +85,6 @@ impl RenderContext { self.theme } - pub fn request(&self) -> &Option<HttpRequest> { - &self.request - } - pub fn get_param<T: FromStr + ToString>(&mut self, key: &'static str) -> Option<T> { if let Some(value) = self.params.get(key) { if let Ok(value) = T::from_str(value) { diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index c8d63c88..0591d735 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,11 +1,11 @@ -use crate::core::component::RenderContext; +use crate::core::component::Context; use crate::html::{html, Markup, PrepareMarkup}; use crate::{util, Handle}; pub use std::any::Any as AnyComponent; pub trait BaseComponent { - fn prepare(&mut self, rcx: &mut RenderContext) -> Markup; + fn prepare(&mut self, cx: &mut Context) -> Markup; } pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { @@ -32,20 +32,20 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } #[allow(unused_variables)] - fn is_renderable(&self, rcx: &RenderContext) -> bool { + fn is_renderable(&self, cx: &Context) -> bool { true } #[allow(unused_variables)] - fn before_prepare_component(&mut self, rcx: &mut RenderContext) {} + fn before_prepare_component(&mut self, cx: &mut Context) {} #[allow(unused_variables)] - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::None } #[allow(unused_variables)] - fn after_prepare_component(&mut self, rcx: &mut RenderContext) {} + fn after_prepare_component(&mut self, cx: &mut Context) {} fn as_ref_any(&self) -> &dyn AnyComponent; @@ -53,24 +53,24 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { } impl<C: ComponentTrait> BaseComponent for C { - fn prepare(&mut self, rcx: &mut RenderContext) -> Markup { - if self.is_renderable(rcx) { + fn prepare(&mut self, cx: &mut Context) -> Markup { + if self.is_renderable(cx) { // Acciones antes de preparar el componente. - self.before_prepare_component(rcx); + self.before_prepare_component(cx); // Acciones del tema antes de preparar el componente. - rcx.theme().before_prepare_component(self, rcx); + cx.theme().before_prepare_component(self, cx); - let markup = match rcx.theme().render_component(self, rcx) { + let markup = match cx.theme().render_component(self, cx) { Some(html) => html, - None => self.prepare_component(rcx).html(), + None => self.prepare_component(cx).html(), }; // Acciones después de preparar el componente. - self.after_prepare_component(rcx); + self.after_prepare_component(cx); // Acciones del tema después de preparar el componente. - rcx.theme().after_prepare_component(self, rcx); + cx.theme().after_prepare_component(self, cx); markup } else { diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs index 72d67bb7..60ff23ef 100644 --- a/pagetop/src/core/component/one.rs +++ b/pagetop/src/core/component/one.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; use std::sync::{Arc, RwLock}; @@ -21,9 +21,9 @@ impl<T: ComponentTrait + Default> OneComponent<T> { // OneComponent PREPARE. - pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { + pub fn prepare(&self, cx: &mut Context) -> Markup { if let Some(component) = &self.0 { - return component.write().unwrap().prepare(rcx); + return component.write().unwrap().prepare(cx); } html! {} } diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index d50d7d14..c5728c68 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; use crate::{fn_builder, Handle}; @@ -116,12 +116,12 @@ impl PackComponents { // PackComponents PREPARE. - pub fn prepare(&self, rcx: &mut RenderContext) -> Markup { + pub fn prepare(&self, cx: &mut Context) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.read().unwrap().weight()); html! { @for c in components.iter() { - (" ")(c.write().unwrap().prepare(rcx))(" ") + (" ")(c.write().unwrap().prepare(cx))(" ") } } } diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index ce2f302c..bac3e384 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -1,6 +1,6 @@ -use crate::core::component::RenderContext; +use crate::core::component::Context; -pub type IsRenderable = fn(&RenderContext) -> bool; +pub type IsRenderable = fn(cx: &Context) -> bool; pub struct Renderable { pub check: IsRenderable, @@ -14,6 +14,6 @@ impl Default for Renderable { } } -fn render_always(_: &RenderContext) -> bool { +fn render_always(_: &Context) -> bool { true } diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index ade7ef3e..ee8158c8 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,3 +1,4 @@ +use crate::config; use crate::core::theme::ThemeStaticRef; use crate::LazyStatic; @@ -8,6 +9,14 @@ use std::sync::RwLock; pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); +// DEFAULT THEME *********************************************************************************** + +pub static THEME: LazyStatic<ThemeStaticRef> = + LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { + Some(theme) => theme, + None => &crate::base::themes::Basic, + }); + // THEME BY NAME *********************************************************************************** pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index b801f3c8..c5ab990b 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,5 +1,5 @@ use crate::base::components::L10n; -use crate::core::component::{ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; @@ -83,7 +83,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn before_prepare_component( &self, component: &mut dyn ComponentTrait, - rcx: &mut RenderContext, + cx: &mut Context, ) { /* Cómo usarlo: @@ -103,7 +103,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn after_prepare_component( &self, component: &mut dyn ComponentTrait, - rcx: &mut RenderContext, + cx: &mut Context, ) { /* Cómo usarlo: @@ -123,7 +123,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn render_component( &self, component: &dyn ComponentTrait, - rcx: &mut RenderContext, + cx: &mut Context, ) -> Option<Markup> { None /* diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 43520718..91b9dbda 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -148,7 +148,7 @@ pub mod service; // Tipos de respuestas a peticiones web. pub mod response; -// Funciones útiles y macros declarativas. +// Funciones y macros útiles. pub mod util; // Prepara y ejecuta la aplicación. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index c2039bf2..d18f2fff 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -6,14 +6,13 @@ pub use crate::{ concat_string, fn_builder, paste, Handle, HashMapResources, LazyStatic, ResultExt, }; -// Macros declarativas globales. -pub use crate::{args, serve_static_files, use_config, use_handle, use_locale, use_static}; - // Traducciones globales. pub use crate::LOCALE_PAGETOP; -// Funciones útiles. +// Funciones y macros útiles. pub use crate::util; +pub use crate::{action, action_after_prepare_component, action_before_prepare_component}; +pub use crate::{args, serve_static_files, use_config, use_handle, use_locale, use_static}; // ************************************************************************************************* @@ -30,8 +29,6 @@ pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::core::{action::*, component::*, module::*, theme::*}; -pub use crate::{action, action_after_prepare_component, action_before_prepare_component}; - pub use crate::base::actions; pub use crate::base::components::*; pub use crate::base::themes; diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index 5b6a7299..2523f2fb 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,4 +1,4 @@ -use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::core::component::{AnyComponent, ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; use crate::{use_handle, Handle}; @@ -15,7 +15,7 @@ impl ComponentTrait for Error403 { ERROR_403 } - fn prepare_component(&self, _rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div { h1 { ("FORBIDDEN ACCESS") } diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index afd1dc68..d97272ca 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,4 +1,4 @@ -use crate::core::component::{AnyComponent, ComponentTrait, RenderContext}; +use crate::core::component::{AnyComponent, ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; use crate::{use_handle, Handle}; @@ -15,7 +15,7 @@ impl ComponentTrait for Error404 { ERROR_404 } - fn prepare_component(&self, _rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div { h1 { ("RESOURCE NOT FOUND") } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 19bbab3c..72222644 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,6 +1,6 @@ use crate::base::actions; use crate::base::components::L10n; -use crate::core::component::{ComponentTrait, ContextOp, OneComponent, RenderContext}; +use crate::core::component::{ComponentTrait, Context, ContextOp, OneComponent}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::fatal_error::FatalError; @@ -20,35 +20,27 @@ pub struct Page { metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, favicon : Option<Favicon>, - context : RenderContext, + context : Context, body_classes: Classes, regions : ComponentsRegions, template : String, } -impl Default for Page { +impl Page { #[rustfmt::skip] - fn default() -> Self { + pub fn new(request: service::HttpRequest) -> Self { Page { title : PageTitle::new(), description : PageDescription::new(), metadata : Vec::new(), properties : Vec::new(), favicon : None, - context : RenderContext::new(), + context : Context::new(request), body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), regions : ComponentsRegions::new(), template : "default".to_owned(), } } -} - -impl Page { - pub fn new(request: service::HttpRequest) -> Self { - let mut page = Page::default(); - page.context.alter(ContextOp::Request(Some(request))); - page - } // Page BUILDER. @@ -128,7 +120,7 @@ impl Page { &self.favicon } - pub fn context(&mut self) -> &mut RenderContext { + pub fn context(&mut self) -> &mut Context { &mut self.context } From 9552ae0af5844f38381c68da5cfc05da0b9419ba Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 28 Jun 2023 23:47:56 +0200 Subject: [PATCH 413/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Aplica=20cambio?= =?UTF-8?q?=20de=20API=20para=20Context?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 12 +++---- pagetop-bulmix/src/lib.rs | 4 +-- pagetop-jquery/src/lib.rs | 8 ++--- pagetop-megamenu/src/component.rs | 36 +++++++++---------- pagetop-minimal/src/component/anchor.rs | 12 +++---- pagetop-minimal/src/component/container.rs | 20 +++++------ .../src/component/form_element/button.rs | 8 ++--- .../src/component/form_element/date.rs | 6 ++-- .../src/component/form_element/form.rs | 12 +++---- .../src/component/form_element/hidden.rs | 2 +- .../src/component/form_element/input.rs | 10 +++--- pagetop-minimal/src/component/grid/column.rs | 12 +++---- pagetop-minimal/src/component/grid/row.rs | 12 +++---- pagetop-minimal/src/component/heading.rs | 18 +++++----- pagetop-minimal/src/component/icon.rs | 10 +++--- pagetop-minimal/src/component/image.rs | 6 ++-- pagetop-minimal/src/component/paragraph.rs | 8 ++--- 17 files changed, 96 insertions(+), 100 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index eafe9e63..7005fb89 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -115,11 +115,7 @@ impl ThemeTrait for Bootsier { } } - fn render_component( - &self, - component: &dyn ComponentTrait, - rcx: &mut RenderContext, - ) -> Option<Markup> { + fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { match component.handle() { ERROR_404 => Some(html! { div class="jumbotron" { @@ -132,18 +128,18 @@ impl ThemeTrait for Bootsier { div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } p class="lead" { - (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(rcx)) + (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(cx)) } hr class="my-4"; p { - (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(rcx)) + (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(cx)) } a class="btn btn-primary btn-lg" href="/" role="button" { - (L10n::t("back-homepage", &LOCALE_BOOTSIER).prepare(rcx)) + (L10n::t("back-homepage", &LOCALE_BOOTSIER).prepare(cx)) } } } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 7959250c..3ab5e2cc 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -43,7 +43,7 @@ impl ThemeTrait for Bulmix { fn before_prepare_component( &self, component: &mut dyn ComponentTrait, - _rcx: &mut RenderContext, + _cx: &mut Context, ) { match component.handle() { COMPONENT_ANCHOR => { @@ -122,7 +122,7 @@ impl ThemeTrait for Bulmix { fn render_component( &self, component: &dyn ComponentTrait, - _rcx: &mut RenderContext, + _cx: &mut Context, ) -> Option<Markup> { match component.handle() { COMPONENT_ICON => { diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index b77fe74b..5871131d 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -33,12 +33,12 @@ impl ModuleTrait for JQuery { } impl JQuery { - pub fn add_in(rcx: &mut RenderContext) { - rcx.set_param::<bool>(JQUERY_PARAM, true); + pub fn add_in(cx: &mut Context) { + cx.set_param::<bool>(JQUERY_PARAM, true); } - pub fn remove_from(rcx: &mut RenderContext) { - rcx.set_param::<bool>(JQUERY_PARAM, false); + pub fn remove_from(cx: &mut Context) { + cx.set_param::<bool>(JQUERY_PARAM, false); } } diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index df68352d..c0bc580d 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -41,33 +41,33 @@ impl ComponentTrait for MegaMenuItem { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { match self.item_type() { MegaMenuItemType::Void => PrepareMarkup::None, MegaMenuItemType::Label(label) => PrepareMarkup::With(html! { - li class="label" { a href="#" { (label.prepare(rcx)) } } + li class="label" { a href="#" { (label.prepare(cx)) } } }), MegaMenuItemType::Link(label, path) => PrepareMarkup::With(html! { - li class="link" { a href=(path) { (label.prepare(rcx)) } } + li class="link" { a href=(path) { (label.prepare(cx)) } } }), MegaMenuItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { li class="link_blank" { - a href=(path) target="_blank" { (label.prepare(rcx)) } + a href=(path) target="_blank" { (label.prepare(cx)) } } }), MegaMenuItemType::Html(content) => PrepareMarkup::With(html! { - li class="html" { (content.prepare(rcx)) } + li class="html" { (content.prepare(cx)) } }), MegaMenuItemType::Submenu(label, menu) => PrepareMarkup::With(html! { li class="submenu" { - a href="#" { (label.prepare(rcx)) } + a href="#" { (label.prepare(cx)) } ul { - (menu.items().prepare(rcx)) + (menu.items().prepare(cx)) } } }), @@ -184,16 +184,16 @@ impl ComponentTrait for MegaMenu { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - run_actions_before_prepare_component(self, rcx); + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_component(self, cx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { - rcx.alter(ContextOp::AddStyleSheet(StyleSheet::located( + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + cx.alter(ContextOp::AddStyleSheet(StyleSheet::located( "/megamenu/css/menu.css?v=1.1.1", ))) .alter(ContextOp::AddStyleSheet(StyleSheet::located( @@ -202,13 +202,13 @@ impl ComponentTrait for MegaMenu { .alter(ContextOp::AddJavaScript(JavaScript::located( "/megamenu/js/menu.min.js?v=1.1.1", ))); - JQuery::add_in(rcx); + JQuery::add_in(cx); - let id = rcx.required_id::<MegaMenu>(self.id()); + let id = cx.required_id::<MegaMenu>(self.id()); PrepareMarkup::With(html! { ul id=(id) class=[self.classes().get()] { - (self.items().prepare(rcx)) + (self.items().prepare(cx)) } script type="text/javascript" defer { "jQuery(function(){jQuery('#" (id) "').smartmenus({" diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 71e3cfaa..21779380 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -58,12 +58,12 @@ impl ComponentTrait for Anchor { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } #[rustfmt::skip] - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let target = match &self.target() { AnchorTarget::Blank => Some("_blank"), AnchorTarget::Parent => Some("_parent"), @@ -78,9 +78,9 @@ impl ComponentTrait for Anchor { href=[self.href().get()] target=[target] { - (self.left_icon().prepare(rcx)) - (" ") span { (self.html().prepare(rcx)) } (" ") - (self.right_icon().prepare(rcx)) + (self.left_icon().prepare(cx)) + (" ") span { (self.html().prepare(cx)) } (" ") + (self.right_icon().prepare(cx)) } }) } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 4ec3b932..ec87627b 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -46,47 +46,47 @@ impl ComponentTrait for Container { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - run_actions_before_prepare_component(self, rcx); + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_component(self, cx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { match self.container_type() { ContainerType::Header => PrepareMarkup::With(html! { header id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } } }), ContainerType::Footer => PrepareMarkup::With(html! { footer id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } } }), ContainerType::Main => PrepareMarkup::With(html! { main id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } } }), ContainerType::Section => PrepareMarkup::With(html! { section id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } } }), _ => PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } }), } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index 5ff7c668..513e250b 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -41,18 +41,18 @@ impl ComponentTrait for Button { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let button_type = match self.button_type() { ButtonType::Button => "button", ButtonType::Submit => "submit", ButtonType::Reset => "reset", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); - let value = self.value().prepare(rcx); + let value = self.value().prepare(cx); PrepareMarkup::With(html! { button type=(button_type) diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 20c7525f..a0c97248 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -36,11 +36,11 @@ impl ComponentTrait for Date { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { let id = self.name().get().map(|name| concat_string!("edit-", name)); PrepareMarkup::With(html! { div class=[self.classes().get()] { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index f3b3eef5..416ac1ea 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -44,15 +44,15 @@ impl ComponentTrait for Form { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - run_actions_before_prepare_component(self, rcx); + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_component(self, cx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let method = match self.method() { FormMethod::Post => Some("post".to_owned()), FormMethod::Get => None, @@ -65,7 +65,7 @@ impl ComponentTrait for Form { method=[method] accept-charset=[self.charset().get()] { - div { (self.elements().prepare(rcx)) } + div { (self.elements().prepare(cx)) } } }) } diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index 7de064c4..a048ee5e 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -23,7 +23,7 @@ impl ComponentTrait for Hidden { self.weight } - fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { let id = self.name().get().map(|name| concat_string!("value-", name)); PrepareMarkup::With(html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 9f13f285..ade3f9e4 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -56,12 +56,12 @@ impl ComponentTrait for Input { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } #[rustfmt::skip] - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let type_input = match self.input_type() { InputType::Textfield => "text", InputType::Password => "password", @@ -71,8 +71,8 @@ impl ComponentTrait for Input { InputType::Url => "url", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); - let label = self.label().prepare(rcx); - let description = self.help_text().prepare(rcx); + let label = self.label().prepare(cx); + let description = self.help_text().prepare(cx); PrepareMarkup::With(html! { div class=[self.classes().get()] { @if !label.is_empty() { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 1068e9b4..e55480da 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -65,18 +65,18 @@ impl ComponentTrait for Column { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - run_actions_before_prepare_component(self, rcx); + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_component(self, cx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } }) } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index ce2ccaf0..abda86df 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -34,18 +34,18 @@ impl ComponentTrait for Row { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - run_actions_before_prepare_component(self, rcx); + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_component(self, cx); } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { - (self.columns().prepare(rcx)) + (self.columns().prepare(cx)) } }) } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 9c51102e..f2a59321 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -57,20 +57,20 @@ impl ComponentTrait for Heading { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let id = self.id(); let classes = self.classes().get(); PrepareMarkup::With(html! { @match &self.heading_type() { - HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().prepare(rcx)) }, - HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().prepare(rcx)) }, - HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().prepare(rcx)) }, - HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().prepare(rcx)) }, - HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().prepare(rcx)) }, - HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(rcx)) }, + HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(cx)) }, }}) } diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 87cb564d..fd822949 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -24,17 +24,17 @@ impl ComponentTrait for Icon { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, rcx: &mut RenderContext) { - rcx.alter(ContextOp::AddStyleSheet(StyleSheet::located( + fn before_prepare_component(&mut self, cx: &mut Context) { + cx.alter(ContextOp::AddStyleSheet(StyleSheet::located( "/minimal/icons/bootstrap-icons.css?v=1.8.2", ))); } - fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { i class=[self.classes().get()] {}; }) } diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index a0c29a63..70b34f89 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -30,11 +30,11 @@ impl ComponentTrait for Image { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn prepare_component(&self, _: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { img src=[self.source().get()] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index ccd44a7b..3841a014 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -42,17 +42,17 @@ impl ComponentTrait for Paragraph { self.weight } - fn is_renderable(&self, rcx: &RenderContext) -> bool { - (self.renderable.check)(rcx) + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) } - fn prepare_component(&self, rcx: &mut RenderContext) -> PrepareMarkup { + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { p id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(rcx)) + (self.components().prepare(cx)) } }) } From 8d05ec4b53b776fb175129b924405b528ab5ed24 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 17:39:59 +0200 Subject: [PATCH 414/853] =?UTF-8?q?=F0=9F=9A=A7=20La=20macro=20args!=20tie?= =?UTF-8?q?ne=20una=20nueva=20vida=20como=20kv!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/locale.rs | 6 +++--- pagetop/src/prelude.rs | 8 ++------ pagetop/src/util.rs | 10 +++++----- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index bec587f3..45061073 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -90,7 +90,7 @@ //! Usa el componente [L10n](crate::base::components::L10n) para incluir textos y contenidos //! opcionalmente traducibles según el contexto de renderizado. -use crate::{args, config, trace, LazyStatic}; +use crate::{config, kv, trace, LazyStatic}; pub use fluent_templates; @@ -101,12 +101,12 @@ pub(crate) use unic_langid::{langid, LanguageIdentifier}; use std::collections::HashMap; static LANGUAGES: LazyStatic<HashMap<String, (LanguageIdentifier, &str)>> = LazyStatic::new(|| { - args![ + kv![ "en" => (langid!("en-US"), "English"), "en-GB" => (langid!("en-GB"), "English (British)"), "en-US" => (langid!("en-US"), "English (United States)"), "es" => (langid!("es-ES"), "Spanish"), - "es-ES" => (langid!("es-ES"), "Spanish (Spain)") + "es-ES" => (langid!("es-ES"), "Spanish (Spain)"), ] }); diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index d18f2fff..dd1e1a65 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,18 +1,14 @@ -//! Re-exporta los tipos y funciones más habituales para la creación de soluciones web con -//! **PageTop**. +//! The PageTop Prelude. // Re-exports. pub use crate::{ concat_string, fn_builder, paste, Handle, HashMapResources, LazyStatic, ResultExt, }; -// Traducciones globales. -pub use crate::LOCALE_PAGETOP; - // Funciones y macros útiles. pub use crate::util; pub use crate::{action, action_after_prepare_component, action_before_prepare_component}; -pub use crate::{args, serve_static_files, use_config, use_handle, use_locale, use_static}; +pub use crate::{default_settings, kv, serve_static_files, use_handle, use_locale, use_static}; // ************************************************************************************************* diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index feb4eae1..64fdf46f 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -64,17 +64,17 @@ pub fn single_type_name<T: ?Sized>() -> &'static str { /// Macro para construir grupos de pares clave-valor. /// /// ```rust#ignore -/// let args = args![ +/// let args = kv![ /// "userName" => "Roberto", /// "photoCount" => 3, -/// "userGender" => "male" +/// "userGender" => "male", /// ]; /// ``` -macro_rules! args { - ( $($key:expr => $value:expr),* ) => {{ +macro_rules! kv { + ( $($key:expr => $value:expr),* $(,)? ) => {{ let mut a = std::collections::HashMap::new(); $( - a.insert(String::from($key), $value.into()); + a.insert($key.into(), $value.into()); )* a }}; From 2b48ea2c80fd80a61c888cc32f8474d85a435369 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 17:45:28 +0200 Subject: [PATCH 415/853] =?UTF-8?q?=F0=9F=94=92=EF=B8=8F=20Acceso=20m?= =?UTF-8?q?=C3=A1s=20restringido=20para=20archivos=20est=C3=A1ticos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/util.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 64fdf46f..57eb75b5 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -95,7 +95,7 @@ macro_rules! use_locale { use $crate::locale::*; fluent_templates::static_loader! { - pub static $LOCALES = { + static $LOCALES = { locales: "src/locale", $( core_locales: $core_locales, )? fallback_language: "en-US", @@ -109,7 +109,7 @@ macro_rules! use_locale { use $crate::locale::*; fluent_templates::static_loader! { - pub static $LOCALES = { + static $LOCALES = { locales: $dir_locales, $( core_locales: $core_locales, )? fallback_language: "en-US", @@ -124,11 +124,15 @@ macro_rules! use_locale { #[macro_export] macro_rules! use_static { ( $bundle:ident ) => { - include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + mod static_bundle { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } }; ( $bundle:ident => $STATIC:ident ) => { - include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); - static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new($bundle); + mod static_bundle { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new(static_bundle::$bundle); }; } @@ -137,7 +141,10 @@ macro_rules! serve_static_files { ( $cfg:ident, $path:expr, $bundle:ident ) => {{ let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service($crate::service::ResourceFiles::new($path, $bundle())); + $cfg.service($crate::service::ResourceFiles::new( + $path, + static_bundle::$bundle(), + )); } else { $cfg.service( $crate::service::ActixFiles::new( From cb8078f79fe6a3ead669c47cc0e71f542a1f7c1c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 17:50:23 +0200 Subject: [PATCH 416/853] =?UTF-8?q?=E2=9C=A8=20use=5Fhandle!()=20permite?= =?UTF-8?q?=20declarar=20m=C3=A1s=20de=20un=20handle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/util.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 57eb75b5..5b695ee0 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -82,9 +82,12 @@ macro_rules! kv { #[macro_export] macro_rules! use_handle { - ( $HANDLE:ident ) => { - pub const $HANDLE: $crate::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); + ( $($HANDLE:ident),* $(,)? ) => { + $( + /// Public constant handle to represent a unique PageTop building element. + pub const $HANDLE: $crate::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); + )* }; } From 4673b82a9385b3d78816f69a3032a2a8587a0244 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 18:24:35 +0200 Subject: [PATCH 417/853] =?UTF-8?q?=E2=9C=A8=20Nuevos=20activos=20para=20e?= =?UTF-8?q?l=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/context.rs | 76 +++++++++++++++++---------- pagetop/src/html.rs | 2 + pagetop/src/html/assets.rs | 10 ++-- pagetop/src/html/assets/headscript.rs | 46 ++++++++++++++++ pagetop/src/html/assets/headstyles.rs | 46 ++++++++++++++++ pagetop/src/html/assets/javascript.rs | 23 +++++--- pagetop/src/html/assets/stylesheet.rs | 28 +++++++--- 7 files changed, 187 insertions(+), 44 deletions(-) create mode 100644 pagetop/src/html/assets/headscript.rs create mode 100644 pagetop/src/html/assets/headstyles.rs diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 1b12f955..16a077a7 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,6 +1,6 @@ use crate::core::theme::all::{theme_by_single_name, THEME}; use crate::core::theme::ThemeStaticRef; -use crate::html::{html, Assets, JavaScript, Markup, StyleSheet}; +use crate::html::{html, Assets, HeadScript, HeadStyles, JavaScript, Markup, StyleSheet}; use crate::locale::{LanguageIdentifier, LANGID}; use crate::service::HttpRequest; use crate::{concat_string, util}; @@ -11,21 +11,31 @@ use std::str::FromStr; pub enum ContextOp { LangId(&'static LanguageIdentifier), Theme(&'static str), + // Stylesheets. AddStyleSheet(StyleSheet), RemoveStyleSheet(&'static str), + // Styles in head. + AddHeadStyles(HeadStyles), + RemoveHeadStyles(&'static str), + // JavaScripts. AddJavaScript(JavaScript), RemoveJavaScript(&'static str), + // Scripts in head. + AddHeadScript(HeadScript), + RemoveHeadScript(&'static str), } #[rustfmt::skip] pub struct Context { - request : HttpRequest, - langid : &'static LanguageIdentifier, - theme : ThemeStaticRef, - stylesheets: Assets<StyleSheet>, - javascripts: Assets<JavaScript>, - params : HashMap<&'static str, String>, - id_counter : usize, + request : HttpRequest, + langid : &'static LanguageIdentifier, + theme : ThemeStaticRef, + stylesheet: Assets<StyleSheet>, // Stylesheets. + headstyles: Assets<HeadStyles>, // Styles in head. + javascript: Assets<JavaScript>, // JavaScripts. + headscript: Assets<HeadScript>, // Scripts in head. + params : HashMap<&'static str, String>, + id_counter: usize, } impl Context { @@ -33,15 +43,18 @@ impl Context { pub(crate) fn new(request: HttpRequest) -> Self { Context { request, - langid : &LANGID, - theme : *THEME, - stylesheets: Assets::<StyleSheet>::new(), - javascripts: Assets::<JavaScript>::new(), - params : HashMap::<&str, String>::new(), - id_counter : 0, + langid : &LANGID, + theme : *THEME, + stylesheet: Assets::<StyleSheet>::new(), // Stylesheets. + headstyles: Assets::<HeadStyles>::new(), // Styles in head. + javascript: Assets::<JavaScript>::new(), // JavaScripts. + headscript: Assets::<HeadScript>::new(), // Scripts in head. + params : HashMap::<&str, String>::new(), + id_counter: 0, } } + #[rustfmt::skip] pub fn alter(&mut self, op: ContextOp) -> &mut Self { match op { ContextOp::LangId(langid) => { @@ -50,18 +63,18 @@ impl Context { ContextOp::Theme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*THEME); } - ContextOp::AddStyleSheet(css) => { - self.stylesheets.add(css); - } - ContextOp::RemoveStyleSheet(source) => { - self.stylesheets.remove(source); - } - ContextOp::AddJavaScript(js) => { - self.javascripts.add(js); - } - ContextOp::RemoveJavaScript(source) => { - self.javascripts.remove(source); - } + // Stylesheets. + ContextOp::AddStyleSheet(css) => { self.stylesheet.add(css); } + ContextOp::RemoveStyleSheet(path) => { self.stylesheet.remove(path); } + // Styles in head. + ContextOp::AddHeadStyles(styles) => { self.headstyles.add(styles); } + ContextOp::RemoveHeadStyles(path) => { self.headstyles.remove(path); } + // JavaScripts. + ContextOp::AddJavaScript(js) => { self.javascript.add(js); } + ContextOp::RemoveJavaScript(path) => { self.javascript.remove(path); } + // Scripts in head. + ContextOp::AddHeadScript(script) => { self.headscript.add(script); } + ContextOp::RemoveHeadScript(path) => { self.headscript.remove(path); } } self } @@ -71,6 +84,11 @@ impl Context { self } + pub fn remove_param(&mut self, key: &'static str) -> &mut Self { + self.params.remove(key); + self + } + /// Context GETTERS. pub fn request(&self) -> &HttpRequest { @@ -98,8 +116,10 @@ impl Context { pub fn prepare(&mut self) -> Markup { html! { - (self.stylesheets.prepare()) - (self.javascripts.prepare()) + (self.stylesheet.prepare()) // Stylesheets. + (self.headstyles.prepare()) // Styles in head. + (self.javascript.prepare()) // JavaScripts. + (self.headscript.prepare()) // Scripts in head. } } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index b9dbd78e..c0ebacc5 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -4,6 +4,8 @@ mod maud; pub use maud::{html, html_private, Markup, PreEscaped, DOCTYPE}; mod assets; +pub use assets::headscript::HeadScript; +pub use assets::headstyles::HeadStyles; pub use assets::javascript::{JavaScript, ModeJS}; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::Assets; diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 6ca33c81..2006dae7 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -1,10 +1,12 @@ +pub mod headscript; +pub mod headstyles; pub mod javascript; pub mod stylesheet; use crate::html::{html, Markup}; pub trait AssetsTrait { - fn source(&self) -> &str; + fn path(&self) -> &str; fn weight(&self) -> isize; @@ -20,7 +22,7 @@ impl<T: AssetsTrait> Assets<T> { } pub fn add(&mut self, asset: T) -> &mut Self { - match self.0.iter().position(|x| x.source() == asset.source()) { + match self.0.iter().position(|x| x.path() == asset.path()) { Some(index) => { if self.0[index].weight() > asset.weight() { self.0.remove(index); @@ -32,8 +34,8 @@ impl<T: AssetsTrait> Assets<T> { self } - pub fn remove(&mut self, source: &'static str) -> &mut Self { - if let Some(index) = self.0.iter().position(|x| x.source() == source) { + pub fn remove(&mut self, path: &'static str) -> &mut Self { + if let Some(index) = self.0.iter().position(|x| x.path() == path) { self.0.remove(index); }; self diff --git a/pagetop/src/html/assets/headscript.rs b/pagetop/src/html/assets/headscript.rs new file mode 100644 index 00000000..ed7eccd5 --- /dev/null +++ b/pagetop/src/html/assets/headscript.rs @@ -0,0 +1,46 @@ +use super::AssetsTrait; +use crate::html::{html, Markup}; + +#[rustfmt::skip] +#[derive(Default)] +pub struct HeadScript { + path : String, + code : String, + weight: isize, +} + +impl AssetsTrait for HeadScript { + fn path(&self) -> &str { + self.path.as_str() + } + + fn weight(&self) -> isize { + self.weight + } + + fn prepare(&self) -> Markup { + html! { script { (self.code) }; } + } +} + +impl HeadScript { + pub fn named<S>(path: S) -> Self + where + S: Into<String>, + { + HeadScript { + path: path.into(), + ..Default::default() + } + } + + pub fn with_code(mut self, code: &str) -> Self { + self.code = code.trim().to_owned(); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } +} diff --git a/pagetop/src/html/assets/headstyles.rs b/pagetop/src/html/assets/headstyles.rs new file mode 100644 index 00000000..888ef21e --- /dev/null +++ b/pagetop/src/html/assets/headstyles.rs @@ -0,0 +1,46 @@ +use super::AssetsTrait; +use crate::html::{html, Markup}; + +#[rustfmt::skip] +#[derive(Default)] +pub struct HeadStyles { + path : String, + styles: String, + weight: isize, +} + +impl AssetsTrait for HeadStyles { + fn path(&self) -> &str { + self.path.as_str() + } + + fn weight(&self) -> isize { + self.weight + } + + fn prepare(&self) -> Markup { + html! { styles { (self.styles) }; } + } +} + +impl HeadStyles { + pub fn named<S>(path: S) -> Self + where + S: Into<String>, + { + HeadStyles { + path: path.into(), + ..Default::default() + } + } + + pub fn with_styles(mut self, styles: &str) -> Self { + self.styles = styles.trim().to_owned(); + self + } + + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } +} diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 848c81bc..44af052a 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -12,14 +12,16 @@ pub enum ModeJS { #[rustfmt::skip] #[derive(Default)] pub struct JavaScript { - source : String, + path : String, + prefix : &'static str, + version: &'static str, weight : isize, mode : ModeJS, } impl AssetsTrait for JavaScript { - fn source(&self) -> &str { - self.source.as_str() + fn path(&self) -> &str { + self.path.as_str() } fn weight(&self) -> isize { @@ -29,7 +31,7 @@ impl AssetsTrait for JavaScript { fn prepare(&self) -> Markup { html! { script type="text/javascript" - src=(self.source) + src=(crate::concat_string!(self.path, self.prefix, self.version)) async[self.mode == ModeJS::Async] defer[self.mode == ModeJS::Defer] {}; @@ -38,16 +40,25 @@ impl AssetsTrait for JavaScript { } impl JavaScript { - pub fn located<S>(source: S) -> Self + pub fn located<S>(path: S) -> Self where S: Into<String>, { JavaScript { - source: source.into(), + path: path.into(), ..Default::default() } } + pub fn with_version(mut self, version: &'static str) -> Self { + (self.prefix, self.version) = if version.is_empty() { + ("", "") + } else { + ("?v=", version) + }; + self + } + pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 0afecfb7..c8347591 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -11,14 +11,16 @@ pub enum TargetMedia { #[rustfmt::skip] #[derive(Default)] pub struct StyleSheet { - source : String, + path : String, + prefix : &'static str, + version: &'static str, media : Option<&'static str>, weight : isize, } impl AssetsTrait for StyleSheet { - fn source(&self) -> &str { - self.source.as_str() + fn path(&self) -> &str { + self.path.as_str() } fn weight(&self) -> isize { @@ -26,21 +28,35 @@ impl AssetsTrait for StyleSheet { } fn prepare(&self) -> Markup { - html! { link rel="stylesheet" href=(self.source) media=[self.media]; } + html! { + link + rel="stylesheet" + href=(crate::concat_string!(self.path, self.prefix, self.version)) + media=[self.media]; + } } } impl StyleSheet { - pub fn located<S>(source: S) -> Self + pub fn located<S>(path: S) -> Self where S: Into<String>, { StyleSheet { - source: source.into(), + path: path.into(), ..Default::default() } } + pub fn with_version(mut self, version: &'static str) -> Self { + (self.prefix, self.version) = if version.is_empty() { + ("", "") + } else { + ("?v=", version) + }; + self + } + pub fn with_weight(mut self, weight: isize) -> Self { self.weight = weight; self From f85a35b5f451fc01805cf179379168025255b229 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 18:29:01 +0200 Subject: [PATCH 418/853] =?UTF-8?q?=E2=8F=AA=20Recupera=20la=20versi=C3=B3?= =?UTF-8?q?n=20con=20valor=20propio=20en=20activos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 9 ++++++--- pagetop-bulmix/src/lib.rs | 6 ++++-- pagetop-jquery/src/lib.rs | 17 ++++++++++------- pagetop-megamenu/src/component.rs | 20 ++++++++++---------- pagetop-minimal/src/component/icon.rs | 6 +++--- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 7005fb89..ac6d79b6 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -46,13 +46,16 @@ impl ThemeTrait for Bootsier { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bootsier/css/bootstrap.min.css?v=5.1.3").with_weight(-99), + StyleSheet::located("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99), )) .alter_context(ContextOp::AddJavaScript( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js?v=5.1.3") + JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") .with_weight(-99), )); - JQuery::add_in(page.context()); + JQuery.enable_jquery(page.context()); } fn prepare_page_body(&self, page: &mut Page) -> Markup { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 3ab5e2cc..688c6ae6 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -34,9 +34,11 @@ impl ThemeTrait for Bulmix { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bulmix/css/bulma.min.css?v=0.9.4").with_weight(-99), + StyleSheet::located("/bulmix/css/bulma.min.css") + .with_version("0.9.4") + .with_weight(-99), )); - JQuery::add_in(page.context()); + JQuery.enable_jquery(page.context()); } #[rustfmt::skip] diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 5871131d..5fa8e4ad 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -6,7 +6,7 @@ use_locale!(LOCALE_JQUERY); use_static!(jquery); -const JQUERY_PARAM: &str = "jquery.add"; +const PARAM_JQUERY: &str = "jquery.js"; pub struct JQuery; @@ -33,19 +33,22 @@ impl ModuleTrait for JQuery { } impl JQuery { - pub fn add_in(cx: &mut Context) { - cx.set_param::<bool>(JQUERY_PARAM, true); + pub fn enable_jquery(&self, cx: &mut Context) -> &Self { + cx.set_param::<bool>(PARAM_JQUERY, true); + self } - pub fn remove_from(cx: &mut Context) { - cx.set_param::<bool>(JQUERY_PARAM, false); + pub fn disable_jquery(&self, cx: &mut Context) -> &Self { + cx.set_param::<bool>(PARAM_JQUERY, false); + self } } fn before_render_page(page: &mut Page) { - if let Some(true) = page.context().get_param::<bool>(JQUERY_PARAM) { + if let Some(true) = page.context().get_param::<bool>(PARAM_JQUERY) { page.context().alter(ContextOp::AddJavaScript( - JavaScript::located("/jquery/jquery.min.js?v=3.6.0") + JavaScript::located("/jquery/jquery.min.js") + .with_version("3.6.0") .with_weight(isize::MIN) .with_mode(ModeJS::Normal), )); diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index c0bc580d..4e7c60ae 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -193,16 +193,16 @@ impl ComponentTrait for MegaMenu { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.alter(ContextOp::AddStyleSheet(StyleSheet::located( - "/megamenu/css/menu.css?v=1.1.1", - ))) - .alter(ContextOp::AddStyleSheet(StyleSheet::located( - "/megamenu/css/menu-clean.css?v=1.1.1", - ))) - .alter(ContextOp::AddJavaScript(JavaScript::located( - "/megamenu/js/menu.min.js?v=1.1.1", - ))); - JQuery::add_in(cx); + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), + )) + .alter(ContextOp::AddStyleSheet( + StyleSheet::located("/megamenu/css/menu-clean.css").with_version("1.1.1"), + )) + .alter(ContextOp::AddJavaScript( + JavaScript::located("/megamenu/js/menu.min.js").with_version("1.1.1"), + )); + JQuery.enable_jquery(cx); let id = cx.required_id::<MegaMenu>(self.id()); diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index fd822949..5389cdae 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -29,9 +29,9 @@ impl ComponentTrait for Icon { } fn before_prepare_component(&mut self, cx: &mut Context) { - cx.alter(ContextOp::AddStyleSheet(StyleSheet::located( - "/minimal/icons/bootstrap-icons.css?v=1.8.2", - ))); + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::located("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), + )); } fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { From 4d305a7ca4f6c5e26f646c5dde0564dd2afb4874 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 18:30:01 +0200 Subject: [PATCH 419/853] =?UTF-8?q?=F0=9F=93=9D=20Revisi=C3=B3n=20de=20doc?= =?UTF-8?q?umentaci=C3=B3n=20y=20nomenclatura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/src/lib.rs | 48 ++++++++++++------------ pagetop/Cargo.toml | 6 +-- pagetop/src/config.rs | 74 ++++++++++++++++++------------------- pagetop/src/lib.rs | 3 +- 4 files changed, 64 insertions(+), 67 deletions(-) diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 314917e9..f43f917b 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,9 +1,9 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -use_handle!(MODULE_DEMOHOME); +use_handle!(MODULE_HOMEDEMO); -use_locale!(LOCALE_DEMOHOME); +use_locale!(LOCALE_HOMEDEMO); use_static!(homedemo); @@ -11,15 +11,15 @@ pub struct HomeDemo; impl ModuleTrait for HomeDemo { fn handle(&self) -> Handle { - MODULE_DEMOHOME + MODULE_HOMEDEMO } fn name(&self) -> L10n { - L10n::t("module_name", &LOCALE_DEMOHOME) + L10n::t("module_name", &LOCALE_HOMEDEMO) } fn description(&self) -> L10n { - L10n::t("module_description", &LOCALE_DEMOHOME) + L10n::t("module_description", &LOCALE_HOMEDEMO) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -34,7 +34,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(L10n::t("page_title", &LOCALE_DEMOHOME)) + .with_title(L10n::t("page_title", &LOCALE_HOMEDEMO)) .with_context(ContextOp::AddStyleSheet(StyleSheet::located( "/homedemo/css/styles.css", ))) @@ -55,11 +55,11 @@ fn hello_world() -> Container { .with_classes(ClassesOp::Add, "hello-col-text") .with_size(grid::ColumnSize::Is5of12) .with_component( - Heading::h1(L10n::t("page_title", &LOCALE_DEMOHOME)) + Heading::h1(L10n::t("page_title", &LOCALE_HOMEDEMO)) .with_display(HeadingDisplay::Medium), ) .with_component( - Paragraph::with(L10n::e("hello_intro", &LOCALE_DEMOHOME).with_arg( + Paragraph::with(L10n::e("hello_intro", &LOCALE_HOMEDEMO).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -69,7 +69,7 @@ fn hello_world() -> Container { .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with( - L10n::e("hello_powered", &LOCALE_DEMOHOME).with_arg( + L10n::e("hello_powered", &LOCALE_HOMEDEMO).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -80,14 +80,14 @@ fn hello_world() -> Container { .with_component( Anchor::button( "https://github.com/manuelcillero/pagetop", - L10n::t("hello_code", &LOCALE_DEMOHOME), + L10n::t("hello_code", &LOCALE_HOMEDEMO), ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALE_DEMOHOME)) + Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALE_HOMEDEMO)) .with_left_icon(Icon::with("arrow-down-circle-fill")) .with_classes(ClassesOp::Add, "welcome-link"), ), @@ -104,9 +104,9 @@ fn welcome() -> Container { Container::section() .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") - .with_component(Heading::h2(L10n::t("welcome_page", &LOCALE_DEMOHOME))) + .with_component(Heading::h2(L10n::t("welcome_page", &LOCALE_HOMEDEMO))) .with_component( - Heading::h3(L10n::e("welcome_subtitle", &LOCALE_DEMOHOME).with_arg( + Heading::h3(L10n::e("welcome_subtitle", &LOCALE_HOMEDEMO).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -116,10 +116,10 @@ fn welcome() -> Container { .with_display(HeadingDisplay::Subtitle), ) .with_component( - Paragraph::with(L10n::t("welcome_text1", &LOCALE_DEMOHOME)) + Paragraph::with(L10n::t("welcome_text1", &LOCALE_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALE_DEMOHOME))) + .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALE_HOMEDEMO))) } fn about_pagetop() -> Container { @@ -134,14 +134,14 @@ fn about_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-text") - .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALE_DEMOHOME))) + .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALE_HOMEDEMO))) .with_component( - Paragraph::with(L10n::t("pagetop_text1", &LOCALE_DEMOHOME)) + Paragraph::with(L10n::t("pagetop_text1", &LOCALE_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALE_DEMOHOME))) + .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALE_HOMEDEMO))) .with_component(Paragraph::with( - L10n::e("pagetop_text3", &LOCALE_DEMOHOME) + L10n::e("pagetop_text3", &LOCALE_HOMEDEMO) .with_arg("href", "https://docs.rs/pagetop/latest/pagetop".to_string()), )), ), @@ -156,10 +156,10 @@ fn promo_pagetop() -> Container { .with_classes(ClassesOp::Add, "promo-col-text") .with_component(Heading::h2(L10n::t( "pagetop_promo_title", - &LOCALE_DEMOHOME, + &LOCALE_HOMEDEMO, ))) .with_component( - Paragraph::with(L10n::e("pagetop_promo_text1", &LOCALE_DEMOHOME).with_arg( + Paragraph::with(L10n::e("pagetop_promo_text1", &LOCALE_HOMEDEMO).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -192,15 +192,15 @@ fn reporting_issues() -> Container { .with_size(grid::ColumnSize::Is6of12) .with_component(Heading::h2(L10n::t( "report_problems_title", - &LOCALE_DEMOHOME, + &LOCALE_HOMEDEMO, ))) .with_component( - Paragraph::with(L10n::t("report_problems_text1", &LOCALE_DEMOHOME)) + Paragraph::with(L10n::t("report_problems_text1", &LOCALE_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(L10n::t( "report_problems_text2", - &LOCALE_DEMOHOME, + &LOCALE_HOMEDEMO, ))), ), ) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 7b26e61e..db22d2f9 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -7,8 +7,9 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - PageTop is an opinionated web development framework that uses the most stable and popular Rust \ - packages to build modular, extensible and configurable Server-side rendered solutions.\ + PageTop is an opinionated web development framework that uses some of the most stable and \ + popular Rust packages to build modular, extensible and configurable Server-Side Rendering \ + (SSR) solutions. """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" @@ -34,7 +35,6 @@ sqlite = ["database", "sea-orm/sqlx-sqlite"] [dependencies] async-trait = "0.1.68" concat-string = "1.0.1" -doc-comment = "0.3.3" figlet-rs = "0.1.5" itoa = "1.0.6" futures = "0.3.28" diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 3f764c70..b3ee4a3b 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -1,4 +1,4 @@ -//! Lectura y uso de ajustes de configuración. +//! Read configuration files and use settings. //! //! Carga la configuración de la aplicación en forma de pares `clave = valor` recogidos en archivos //! [TOML](https://toml.io). @@ -51,15 +51,15 @@ //! serde = { version = "1.0", features = ["derive"] } //! ``` //! -//! Y luego declara con la macro [`use_config!`](crate::use_config) tus ajustes, usando tipos -//! seguros y asignando los valores predefinidos para la estructura asociada: +//! Y luego inicializa con la macro [`default_settings!`](crate::default_settings) tus ajustes, +//! usando tipos seguros y asignando los valores predefinidos para la estructura asociada: //! //! ``` //! use pagetop::prelude::*; //! use serde::Deserialize; //! //! #[derive(Debug, Deserialize)] -//! pub struct MySettings { +//! pub struct Settings { //! pub myapp: MyApp, //! } //! @@ -71,7 +71,7 @@ //! pub height: u16, //! } //! -//! use_config!(MY_SETTINGS as MySettings, +//! default_settings!( //! // [myapp] //! "myapp.name" => "Value Name", //! "myapp.width" => 900, @@ -106,8 +106,8 @@ //! } //! //! fn module_settings() { -//! println!("{} - {:?}", &MY_SETTINGS.myapp.name, &MY_SETTINGS.myapp.description); -//! println!("{}", &MY_SETTINGS.myapp.width); +//! println!("{} - {:?}", &SETTINGS.myapp.name, &SETTINGS.myapp.description); +//! println!("{}", &SETTINGS.myapp.width); //! } //! ``` @@ -164,30 +164,28 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { /// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. /// /// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). -macro_rules! use_config { - ( $SETTINGS:ident as $Settings:ty $(, $key:literal => $value:literal)*$(,)* ) => { - $crate::doc_comment! { - concat!( - "Valores asignados o predefinidos para los ajustes de configuración globales ", - "asociados a la estructura [`", stringify!($Settings), "`]." - ), - pub static $SETTINGS: $crate::LazyStatic<$Settings> = $crate::LazyStatic::new(|| { - let mut settings = $crate::config::CONFIG.clone(); - $( - settings.set_default($key, $value).unwrap(); - )* - match settings.try_into() { - Ok(s) => s, - Err(e) => panic!("Error parsing settings: {}", e), - } - }); - } +macro_rules! default_settings { + ( $($key:literal => $value:literal),* $(,)? ) => { + #[doc = concat!( + "Assigned or predefined values for configuration settings associated with the ", + "[`Settings`] structure." + )] + pub static SETTINGS: $crate::LazyStatic<Settings> = $crate::LazyStatic::new(|| { + let mut settings = $crate::config::CONFIG.clone(); + $( + settings.set_default($key, $value).unwrap(); + )* + match settings.try_into() { + Ok(s) => s, + Err(e) => panic!("Error parsing settings: {}", e), + } + }); }; } #[derive(Debug, Deserialize)] -/// Ajustes globales para las secciones reservadas [`[app]`](App), [`[database]`](Database), -/// [`[dev]`](Dev), [`[log]`](Log) y [`[server]`](Server) (ver [`SETTINGS`]). +/// Configuration settings for the [`[app]`](App), [`[database]`](Database), [`[dev]`](Dev), +/// [`[log]`](Log), and [`[server]`](Server) sections (see [`SETTINGS`]). pub struct Settings { pub app: App, pub database: Database, @@ -197,9 +195,9 @@ pub struct Settings { } #[derive(Debug, Deserialize)] -/// Sección `[app]` de los ajustes de configuración globales. +/// Section `[app]` of the configuration settings. /// -/// Ver [`Settings`]. +/// See [`Settings`]. pub struct App { /// El nombre de la aplicación. /// Por defecto: *"PageTop App"*. @@ -225,9 +223,9 @@ pub struct App { } #[derive(Debug, Deserialize)] -/// Sección `[database]` de los ajustes de configuración globales. +/// Section `[database]` of the configuration settings. /// -/// Ver [`Settings`]. +/// See [`Settings`]. pub struct Database { /// Tipo de base de datos: *"mysql"*, *"postgres"* ó *"sqlite"*. /// Por defecto: *""*. @@ -253,9 +251,9 @@ pub struct Database { } #[derive(Debug, Deserialize)] -/// Sección `[dev]` de los ajustes de configuración globales. +/// Section `[dev]` of the configuration settings. /// -/// Ver [`Settings`]. +/// See [`Settings`]. pub struct Dev { /// Los archivos estáticos requeridos por la aplicación se integran de manera predeterminada en /// el binario ejecutable. Sin embargo, durante el desarrollo puede resultar útil servir estos @@ -266,9 +264,9 @@ pub struct Dev { } #[derive(Debug, Deserialize)] -/// Sección `[log]` de los ajustes de configuración globales. +/// Section `[log]` of the configuration settings. /// -/// Ver [`Settings`]. +/// See [`Settings`]. pub struct Log { /// Filtro, o combinación de filtros separados por coma, para la traza de ejecución: *"Error"*, /// *"Warn"*, *"Info"*, *"Debug"* o *"Trace"*. @@ -291,9 +289,9 @@ pub struct Log { } #[derive(Debug, Deserialize)] -/// Sección `[server]` de los ajustes de configuración globales. +/// Section `[server]` of the configuration settings. /// -/// Ver [`Settings`]. +/// See [`Settings`]. pub struct Server { /// Dirección del servidor web. /// Por defecto: *"localhost"*. @@ -306,7 +304,7 @@ pub struct Server { pub session_lifetime: i64, } -use_config!(SETTINGS as Settings, +default_settings!( // [app] "app.name" => "PageTop App", "app.description" => "Modular web solutions made simple with PageTop.", diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 91b9dbda..76a8134a 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -69,7 +69,7 @@ //! } //! ``` //! Este programa crea un módulo llamado `HelloWorld` con un servicio que devuelve una página web -//! saludando al mundo cada vez que se accede desde el navegador a `http://localhost:8088` (según +//! saludando al mundo cada vez que se accede desde el navegador a `http://localhost:8088` (para //! los [ajustes de configuración](`config::Server`) predeterminados). //! //! # 🧱 Extendiendo PageTop @@ -102,7 +102,6 @@ // ************************************************************************************************* pub use concat_string::concat_string; -pub use doc_comment::doc_comment; pub use once_cell::sync::Lazy as LazyStatic; pub use paste::paste; pub use static_files::Resource as StaticResource; From be7a8aab67376ad54365cda3b895abb78761a0dd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 19:45:44 +0200 Subject: [PATCH 420/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.42?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index db22d2f9..f611deab 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.41" +version = "0.0.42" edition = "2021" authors = [ From a5a99054737ff5b336abb153259949b70ac3886f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 19:51:41 +0200 Subject: [PATCH 421/853] =?UTF-8?q?=F0=9F=94=96=20[minimal]=20libera=20ver?= =?UTF-8?q?si=C3=B3n=20de=20desarrollo=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index 87425845..1ff48155 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From 3cf201fb54dc740268734d82b2ea6a95a630456c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 19:57:24 +0200 Subject: [PATCH 422/853] =?UTF-8?q?=F0=9F=94=96=20[jquery]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index f691e002..a25fc665 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-jquery" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From 37614e38fac682a8204b3a1c719c123821961510 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 20:02:10 +0200 Subject: [PATCH 423/853] =?UTF-8?q?=F0=9F=94=96=20[megamenu]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index 395dc6b1..3bef191e 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From 90d6189bf796d3ec9ef9587674f28c2c7b8d07df Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 20:06:41 +0200 Subject: [PATCH 424/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 820aae00..57fa14e2 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From a48fac0a2ebd0b24ee516050c0b5d7e3b2170ecc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 20:10:13 +0200 Subject: [PATCH 425/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index bf00a941..c8e67f82 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From 59a4f850a04ec8284bb3989425541be09e1631a3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 20:13:01 +0200 Subject: [PATCH 426/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20libera=20ve?= =?UTF-8?q?rsi=C3=B3n=20de=20desarrollo=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index f119881e..9406947a 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From 55a62488c1055df777c173f5bf45880bdadc41b0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 20:18:56 +0200 Subject: [PATCH 427/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 8b5b884a..e58894d1 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.10" +version = "0.0.11" edition = "2021" authors = [ From 1a32db1974c416604745188824746c67533339a9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 6 Jul 2023 20:21:33 +0200 Subject: [PATCH 428/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index a42948b5..5a236704 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.10" +version = "0.0.11" edition = "2021" authors = [ From a05355c4d190ebc926b1be5a757637f5efc17a9a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 9 Jul 2023 19:21:47 +0200 Subject: [PATCH 429/853] =?UTF-8?q?=F0=9F=9A=A7=20Mejora=20la=20estructura?= =?UTF-8?q?=20de=20las=20acciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 8 +- pagetop-minimal/src/component/container.rs | 8 +- .../src/component/form_element/form.rs | 8 +- pagetop-minimal/src/component/grid/column.rs | 8 +- pagetop-minimal/src/component/grid/row.rs | 8 +- pagetop/src/base/actions.rs | 147 +++++++++++++++++- .../base/actions/after_prepare_component.rs | 67 -------- .../base/actions/before_prepare_component.rs | 67 -------- pagetop/src/base/actions/block.rs | 8 - pagetop/src/base/actions/page.rs | 10 +- .../base/actions/page/before_prepare_page.rs | 6 +- .../base/actions/page/before_render_page.rs | 6 +- pagetop/src/base/components/block.rs | 4 +- pagetop/src/prelude.rs | 2 +- pagetop/src/util.rs | 15 +- 15 files changed, 192 insertions(+), 180 deletions(-) delete mode 100644 pagetop/src/base/actions/after_prepare_component.rs delete mode 100644 pagetop/src/base/actions/before_prepare_component.rs delete mode 100644 pagetop/src/base/actions/block.rs diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 4e7c60ae..d27c672e 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -154,7 +154,7 @@ impl MegaMenuItem { use_handle!(COMPONENT_MEGAMENU); -action_before_prepare_component!(ACTION_BEFORE_PREPARE_MENU for MegaMenu); +actions_for_component!(MegaMenu); #[rustfmt::skip] #[derive(Default)] @@ -189,7 +189,7 @@ impl ComponentTrait for MegaMenu { } fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_component(self, cx); + run_actions_before_prepare_megamenu(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -219,6 +219,10 @@ impl ComponentTrait for MegaMenu { }) } + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_megamenu(self, cx); + } + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index ec87627b..729abada 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(COMPONENT_CONTAINER); -action_before_prepare_component!(ACTION_BEFORE_PREPARE_CONTAINER for Container); +actions_for_component!(Container); #[derive(Default)] pub enum ContainerType { @@ -51,7 +51,7 @@ impl ComponentTrait for Container { } fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_component(self, cx); + run_actions_before_prepare_container(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -92,6 +92,10 @@ impl ComponentTrait for Container { } } + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_container(self, cx); + } + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 416ac1ea..fc952471 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(COMPONENT_FORM); -action_before_prepare_component!(ACTION_BEFORE_PREPARE_FORM for Form); +actions_for_component!(Form); #[derive(Default)] pub enum FormMethod { @@ -49,7 +49,7 @@ impl ComponentTrait for Form { } fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_component(self, cx); + run_actions_before_prepare_form(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -70,6 +70,10 @@ impl ComponentTrait for Form { }) } + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_form(self, cx); + } + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index e55480da..90213109 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(COMPONENT_COLUMN); -action_before_prepare_component!(ACTION_BEFORE_PREPARE_COLUMN for Column); +actions_for_component!(Column); const SIZE__DEFAULT: &str = "col-md"; const SIZE__1_OF_12: &str = "col-md-1"; @@ -70,7 +70,7 @@ impl ComponentTrait for Column { } fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_component(self, cx); + run_actions_before_prepare_column(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -81,6 +81,10 @@ impl ComponentTrait for Column { }) } + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_column(self, cx); + } + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index abda86df..d30f2d09 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -4,7 +4,7 @@ use crate::component::grid; use_handle!(COMPONENT_ROW); -action_before_prepare_component!(ACTION_BEFORE_PREPARE_ROW for Row); +actions_for_component!(Row); #[rustfmt::skip] #[derive(Default)] @@ -39,7 +39,7 @@ impl ComponentTrait for Row { } fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_component(self, cx); + run_actions_before_prepare_row(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -50,6 +50,10 @@ impl ComponentTrait for Row { }) } + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_row(self, cx); + } + fn as_ref_any(&self) -> &dyn AnyComponent { self } diff --git a/pagetop/src/base/actions.rs b/pagetop/src/base/actions.rs index 3764ff1e..250e093c 100644 --- a/pagetop/src/base/actions.rs +++ b/pagetop/src/base/actions.rs @@ -1,7 +1,142 @@ -mod before_prepare_component; - -mod after_prepare_component; - -pub mod block; - pub mod page; + +pub mod block { + crate::actions_for_component!(Block); +} + +#[macro_export] +macro_rules! actions_for_component { + ( $Component:ty ) => { + $crate::paste! { + use $crate::prelude::*; + + pub type [<Action $Component>] = fn(component: &$Component, cx: &mut Context); + + // ************************************************************************************* + // ACTION BEFORE PREPARE COMPONENT + // ************************************************************************************* + + $crate::use_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); + + pub struct [<BeforePrepare $Component>] { + action: Option<[<Action $Component>]>, + weight: isize, + } + + impl ActionTrait for [<BeforePrepare $Component>] { + fn new() -> Self { + [<BeforePrepare $Component>] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + [<ACTION_BEFORE_PREPARE_ $Component:upper>] + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [<BeforePrepare $Component>] { + #[allow(dead_code)] + pub fn with_action(mut self, action: [<Action $Component>]) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } + } + + #[inline(always)] + pub(crate) fn [<run_actions_before_prepare_ $Component:lower>]( + component: &mut $Component, + cx: &mut Context + ) { + run_actions([<ACTION_BEFORE_PREPARE_ $Component:upper>], |action| + action_ref::<[<BeforePrepare $Component>]>(&**action) + .run(component, cx) + ); + } + + // ************************************************************************************* + // ACTION AFTER PREPARE COMPONENT + // ************************************************************************************* + + $crate::use_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); + + pub struct [<AfterPrepare $Component>] { + action: Option<[<Action $Component>]>, + weight: isize, + } + + impl ActionTrait for [<AfterPrepare $Component>] { + fn new() -> Self { + [<AfterPrepare $Component>] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + [<ACTION_AFTER_PREPARE_ $Component:upper>] + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [<AfterPrepare $Component>] { + #[allow(dead_code)] + pub fn with_action(mut self, action: [<Action $Component>]) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } + } + + #[inline(always)] + pub(crate) fn [<run_actions_after_prepare_ $Component:lower>]( + component: &mut $Component, + cx: &mut Context + ) { + run_actions([<ACTION_AFTER_PREPARE_ $Component:upper>], |action| + action_ref::<[<AfterPrepare $Component>]>(&**action) + .run(component, cx) + ); + } + } + }; +} diff --git a/pagetop/src/base/actions/after_prepare_component.rs b/pagetop/src/base/actions/after_prepare_component.rs deleted file mode 100644 index 34ca40b3..00000000 --- a/pagetop/src/base/actions/after_prepare_component.rs +++ /dev/null @@ -1,67 +0,0 @@ -#[macro_export] -macro_rules! action_after_prepare_component { - ( $ACTION_HANDLE:ident for $Component:ty ) => { - $crate::paste! { - $crate::use_handle!($ACTION_HANDLE); - - pub type ActionAfter = fn(component: &$Component, cx: &mut Context); - - pub struct [<AfterPrepare $Component>] { - action: Option<ActionAfter>, - weight: isize, - } - - impl ActionTrait for [<AfterPrepare $Component>] { - fn new() -> Self { - [<AfterPrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - $ACTION_HANDLE - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } - } - - impl [<AfterPrepare $Component>] { - #[allow(dead_code)] - pub fn with_action(mut self, action: ActionAfter) -> Self { - self.action = Some(action); - self - } - - #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub fn run_actions_after_prepare_component( - component: &mut $Component, - cx: &mut Context - ) { - run_actions($ACTION_HANDLE, |action| - action_ref::<[<AfterPrepare $Component>]>(&**action) - .run(component, cx) - ); - } - } - }; -} diff --git a/pagetop/src/base/actions/before_prepare_component.rs b/pagetop/src/base/actions/before_prepare_component.rs deleted file mode 100644 index 6aac7090..00000000 --- a/pagetop/src/base/actions/before_prepare_component.rs +++ /dev/null @@ -1,67 +0,0 @@ -#[macro_export] -macro_rules! action_before_prepare_component { - ( $ACTION_HANDLE:ident for $Component:ty ) => { - $crate::paste! { - $crate::use_handle!($ACTION_HANDLE); - - pub type ActionBefore = fn(component: &$Component, cx: &mut Context); - - pub struct [<BeforePrepare $Component>] { - action: Option<ActionBefore>, - weight: isize, - } - - impl ActionTrait for [<BeforePrepare $Component>] { - fn new() -> Self { - [<BeforePrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - $ACTION_HANDLE - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } - } - - impl [<BeforePrepare $Component>] { - #[allow(dead_code)] - pub fn with_action(mut self, action: ActionBefore) -> Self { - self.action = Some(action); - self - } - - #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub fn run_actions_before_prepare_component( - component: &mut $Component, - cx: &mut Context - ) { - run_actions($ACTION_HANDLE, |action| - action_ref::<[<BeforePrepare $Component>]>(&**action) - .run(component, cx) - ); - } - } - }; -} diff --git a/pagetop/src/base/actions/block.rs b/pagetop/src/base/actions/block.rs deleted file mode 100644 index 25b364ad..00000000 --- a/pagetop/src/base/actions/block.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::prelude::*; - -action_before_prepare_component!( - ACTION_BEFORE_PREPARE_BLOCK for Block -); -action_after_prepare_component!( - ACTION_AFTER_PREPARE_BLOCK for Block -); diff --git a/pagetop/src/base/actions/page.rs b/pagetop/src/base/actions/page.rs index 20e55a3a..eb8791e3 100644 --- a/pagetop/src/base/actions/page.rs +++ b/pagetop/src/base/actions/page.rs @@ -1,13 +1,9 @@ -use crate::prelude::*; +use crate::response::page::Page; pub type ActionPage = fn(page: &mut Page); mod before_prepare_page; -pub use before_prepare_page::{ - run_actions_before_prepare_page, ActionBeforePreparePage, ACTION_BEFORE_PREPARE_PAGE, -}; +pub use before_prepare_page::*; mod before_render_page; -pub use before_render_page::{ - run_actions_before_render_page, ActionBeforeRenderPage, ACTION_BEFORE_RENDER_PAGE, -}; +pub use before_render_page::*; diff --git a/pagetop/src/base/actions/page/before_prepare_page.rs b/pagetop/src/base/actions/page/before_prepare_page.rs index 13fdd909..aa9ecf61 100644 --- a/pagetop/src/base/actions/page/before_prepare_page.rs +++ b/pagetop/src/base/actions/page/before_prepare_page.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use super::ActionPage; -use_handle!(ACTION_BEFORE_PREPARE_PAGE); +use_handle!(ACTION_BEFORE_PREPARE_PAGE for Action); pub struct ActionBeforePreparePage { action: Option<ActionPage>, @@ -41,7 +41,7 @@ impl ActionBeforePreparePage { self } - pub fn run(&self, page: &mut Page) { + pub(crate) fn run(&self, page: &mut Page) { if let Some(action) = self.action { action(page) } @@ -49,7 +49,7 @@ impl ActionBeforePreparePage { } #[inline(always)] -pub fn run_actions_before_prepare_page(page: &mut Page) { +pub(crate) fn run_actions_before_prepare_page(page: &mut Page) { run_actions(ACTION_BEFORE_PREPARE_PAGE, |action| { action_ref::<ActionBeforePreparePage>(&**action).run(page) }); diff --git a/pagetop/src/base/actions/page/before_render_page.rs b/pagetop/src/base/actions/page/before_render_page.rs index d035d2d8..733eb7e5 100644 --- a/pagetop/src/base/actions/page/before_render_page.rs +++ b/pagetop/src/base/actions/page/before_render_page.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use super::ActionPage; -use_handle!(ACTION_BEFORE_RENDER_PAGE); +use_handle!(ACTION_BEFORE_RENDER_PAGE for Action); pub struct ActionBeforeRenderPage { action: Option<ActionPage>, @@ -41,7 +41,7 @@ impl ActionBeforeRenderPage { self } - pub fn run(&self, page: &mut Page) { + pub(crate) fn run(&self, page: &mut Page) { if let Some(action) = self.action { action(page) } @@ -49,7 +49,7 @@ impl ActionBeforeRenderPage { } #[inline(always)] -pub fn run_actions_before_render_page(page: &mut Page) { +pub(crate) fn run_actions_before_render_page(page: &mut Page) { run_actions(ACTION_BEFORE_RENDER_PAGE, |action| { action_ref::<ActionBeforeRenderPage>(&**action).run(page) }); diff --git a/pagetop/src/base/components/block.rs b/pagetop/src/base/components/block.rs index 4a45b94d..74095a79 100644 --- a/pagetop/src/base/components/block.rs +++ b/pagetop/src/base/components/block.rs @@ -36,7 +36,7 @@ impl ComponentTrait for Block { } fn before_prepare_component(&mut self, cx: &mut Context) { - actions::block::run_actions_before_prepare_component(self, cx); + actions::block::run_actions_before_prepare_block(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -54,7 +54,7 @@ impl ComponentTrait for Block { } fn after_prepare_component(&mut self, cx: &mut Context) { - actions::block::run_actions_after_prepare_component(self, cx); + actions::block::run_actions_after_prepare_block(self, cx); } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index dd1e1a65..3574fc55 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -7,7 +7,7 @@ pub use crate::{ // Funciones y macros útiles. pub use crate::util; -pub use crate::{action, action_after_prepare_component, action_before_prepare_component}; +pub use crate::{action, actions_for_component}; pub use crate::{default_settings, kv, serve_static_files, use_handle, use_locale, use_static}; // ************************************************************************************************* diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 5b695ee0..40d847cc 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -82,12 +82,15 @@ macro_rules! kv { #[macro_export] macro_rules! use_handle { - ( $($HANDLE:ident),* $(,)? ) => { - $( - /// Public constant handle to represent a unique PageTop building element. - pub const $HANDLE: $crate::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); - )* + ( $HANDLE:ident ) => { + /// Public constant handle to represent a unique PageTop building element. + pub const $HANDLE: $crate::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); + }; + ( $HANDLE:ident for Action ) => { + /// Constant handle to represent a unique PageTop action. + pub(crate) const $HANDLE: $crate::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); }; } From 160dc034b41cf132d66d6be6f0b3ac87165e54b5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 9 Jul 2023 19:33:21 +0200 Subject: [PATCH 430/853] =?UTF-8?q?=F0=9F=9A=A7=20Mejora=20la=20organizaci?= =?UTF-8?q?=C3=B3n=20de=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop/src/base.rs | 6 +++--- pagetop/src/base/{actions.rs => action.rs} | 0 pagetop/src/base/{actions => action}/page.rs | 0 .../base/{actions => action}/page/before_prepare_page.rs | 0 .../base/{actions => action}/page/before_render_page.rs | 0 pagetop/src/base/{components.rs => component.rs} | 0 pagetop/src/base/{components => component}/block.rs | 4 ++-- pagetop/src/base/{components => component}/html.rs | 0 pagetop/src/base/{components => component}/l10n.rs | 0 pagetop/src/base/{themes.rs => theme.rs} | 0 pagetop/src/base/{themes => theme}/basic.rs | 0 pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme/all.rs | 2 +- pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/locale.rs | 2 +- pagetop/src/prelude.rs | 6 +++--- pagetop/src/response/fatal_error.rs | 2 +- pagetop/src/response/page.rs | 8 ++++---- 22 files changed, 21 insertions(+), 21 deletions(-) rename pagetop/src/base/{actions.rs => action.rs} (100%) rename pagetop/src/base/{actions => action}/page.rs (100%) rename pagetop/src/base/{actions => action}/page/before_prepare_page.rs (100%) rename pagetop/src/base/{actions => action}/page/before_render_page.rs (100%) rename pagetop/src/base/{components.rs => component.rs} (100%) rename pagetop/src/base/{components => component}/block.rs (95%) rename pagetop/src/base/{components => component}/html.rs (100%) rename pagetop/src/base/{components => component}/l10n.rs (100%) rename pagetop/src/base/{themes.rs => theme.rs} (100%) rename pagetop/src/base/{themes => theme}/basic.rs (100%) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 1fcd0c91..987eeb5a 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - vec![action!(actions::page::ActionBeforePreparePage => before_prepare_page)] + vec![action!(action::page::ActionBeforePreparePage => before_prepare_page)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 5fa8e4ad..e406de16 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -24,7 +24,7 @@ impl ModuleTrait for JQuery { } fn actions(&self) -> Vec<Action> { - vec![action!(actions::page::ActionBeforeRenderPage => before_render_page)] + vec![action!(action::page::ActionBeforeRenderPage => before_render_page)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 00ae81ea..cbff5942 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - vec![action!(actions::page::ActionBeforePreparePage => before_prepare_page, -1)] + vec![action!(action::page::ActionBeforePreparePage => before_prepare_page, -1)] } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index 49ae12b4..acfd1dbe 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,5 +1,5 @@ -pub mod actions; +pub mod action; -pub mod components; +pub mod component; -pub mod themes; +pub mod theme; diff --git a/pagetop/src/base/actions.rs b/pagetop/src/base/action.rs similarity index 100% rename from pagetop/src/base/actions.rs rename to pagetop/src/base/action.rs diff --git a/pagetop/src/base/actions/page.rs b/pagetop/src/base/action/page.rs similarity index 100% rename from pagetop/src/base/actions/page.rs rename to pagetop/src/base/action/page.rs diff --git a/pagetop/src/base/actions/page/before_prepare_page.rs b/pagetop/src/base/action/page/before_prepare_page.rs similarity index 100% rename from pagetop/src/base/actions/page/before_prepare_page.rs rename to pagetop/src/base/action/page/before_prepare_page.rs diff --git a/pagetop/src/base/actions/page/before_render_page.rs b/pagetop/src/base/action/page/before_render_page.rs similarity index 100% rename from pagetop/src/base/actions/page/before_render_page.rs rename to pagetop/src/base/action/page/before_render_page.rs diff --git a/pagetop/src/base/components.rs b/pagetop/src/base/component.rs similarity index 100% rename from pagetop/src/base/components.rs rename to pagetop/src/base/component.rs diff --git a/pagetop/src/base/components/block.rs b/pagetop/src/base/component/block.rs similarity index 95% rename from pagetop/src/base/components/block.rs rename to pagetop/src/base/component/block.rs index 74095a79..b0c78907 100644 --- a/pagetop/src/base/components/block.rs +++ b/pagetop/src/base/component/block.rs @@ -36,7 +36,7 @@ impl ComponentTrait for Block { } fn before_prepare_component(&mut self, cx: &mut Context) { - actions::block::run_actions_before_prepare_block(self, cx); + action::block::run_actions_before_prepare_block(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -54,7 +54,7 @@ impl ComponentTrait for Block { } fn after_prepare_component(&mut self, cx: &mut Context) { - actions::block::run_actions_after_prepare_block(self, cx); + action::block::run_actions_after_prepare_block(self, cx); } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop/src/base/components/html.rs b/pagetop/src/base/component/html.rs similarity index 100% rename from pagetop/src/base/components/html.rs rename to pagetop/src/base/component/html.rs diff --git a/pagetop/src/base/components/l10n.rs b/pagetop/src/base/component/l10n.rs similarity index 100% rename from pagetop/src/base/components/l10n.rs rename to pagetop/src/base/component/l10n.rs diff --git a/pagetop/src/base/themes.rs b/pagetop/src/base/theme.rs similarity index 100% rename from pagetop/src/base/themes.rs rename to pagetop/src/base/theme.rs diff --git a/pagetop/src/base/themes/basic.rs b/pagetop/src/base/theme/basic.rs similarity index 100% rename from pagetop/src/base/themes/basic.rs rename to pagetop/src/base/theme/basic.rs diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index b5db24c8..428fbfc4 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleStaticRef) { let mut list: Vec<ModuleStaticRef> = Vec::new(); // Enable basic theme. - add_to_enabled(&mut list, &crate::base::themes::Basic); + add_to_enabled(&mut list, &crate::base::theme::Basic); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 21aabba2..5b1057f9 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,4 +1,4 @@ -use crate::base::components::L10n; +use crate::base::component::L10n; use crate::core::action::Action; use crate::core::theme::ThemeStaticRef; use crate::{service, util, Handle}; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index ee8158c8..8c7dbc01 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -14,7 +14,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = pub static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::base::themes::Basic, + None => &crate::base::theme::Basic, }); // THEME BY NAME *********************************************************************************** diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index c5ab990b..a4e5898f 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,4 +1,4 @@ -use crate::base::components::L10n; +use crate::base::component::L10n; use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 45061073..02d7b175 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -87,7 +87,7 @@ //! use_locale!(LOCALE_SAMPLE["path/to/locale"]); //! ``` //! -//! Usa el componente [L10n](crate::base::components::L10n) para incluir textos y contenidos +//! Usa el componente [L10n](crate::base::component::L10n) para incluir textos y contenidos //! opcionalmente traducibles según el contexto de renderizado. use crate::{config, kv, trace, LazyStatic}; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 3574fc55..d5ad7df8 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -25,9 +25,9 @@ pub use crate::{db, db::*, migration_item, pub_migration}; pub use crate::core::{action::*, component::*, module::*, theme::*}; -pub use crate::base::actions; -pub use crate::base::components::*; -pub use crate::base::themes; +pub use crate::base::action; +pub use crate::base::component::*; +pub use crate::base::theme; pub use crate::service; pub use crate::service::HttpMessage; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index cf22a205..3994b91c 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::base::components::L10n; +use crate::base::component::L10n; use crate::response::{page::Page, ResponseError}; use crate::service::http::{header::ContentType, StatusCode}; use crate::service::{HttpRequest, HttpResponse}; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 72222644..6136d2e4 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,5 +1,5 @@ -use crate::base::actions; -use crate::base::components::L10n; +use crate::base::action; +use crate::base::component::L10n; use crate::core::component::{ComponentTrait, Context, ContextOp, OneComponent}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; @@ -136,7 +136,7 @@ impl Page { pub fn render(&mut self) -> ResultPage<Markup, FatalError> { // Module actions before preparing the page. - actions::page::run_actions_before_prepare_page(self); + action::page::run_actions_before_prepare_page(self); // Theme actions before preparing the page. self.context.theme().before_prepare_page(self); @@ -145,7 +145,7 @@ impl Page { let body = self.context.theme().prepare_page_body(self); // Module actions before rendering the page. - actions::page::run_actions_before_render_page(self); + action::page::run_actions_before_render_page(self); // Theme actions before rendering the page. self.context.theme().before_render_page(self); From 8138e15ed7a36dac4223f07ba291465caf928c93 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 9 Jul 2023 21:20:59 +0200 Subject: [PATCH 431/853] =?UTF-8?q?=F0=9F=8D=B1=20A=C3=B1ade=20normalize.c?= =?UTF-8?q?ss=20al=20tema=20por=20defecto=20basic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/theme/basic.rs | 5 ++++- pagetop/static/theme/css/normalize.min.css | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 pagetop/static/theme/css/normalize.min.css diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index d38bb4df..daed3205 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -22,6 +22,9 @@ impl ModuleTrait for Basic { impl ThemeTrait for Basic { fn before_prepare_page(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::located("/theme/css/normalize.min.css").with_version("8.0.1"), + )); } } diff --git a/pagetop/static/theme/css/normalize.min.css b/pagetop/static/theme/css/normalize.min.css new file mode 100644 index 00000000..e1b546a5 --- /dev/null +++ b/pagetop/static/theme/css/normalize.min.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;}main{display:block;}h1{font-size:2em;margin:.67em 0;}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder;}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-.25em;}sup{top:-.5em;}img{border-style:none;}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible;}button,select{text-transform:none;}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button;}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText;}fieldset{padding:.35em .75em .625em;}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline;}textarea{overflow:auto;}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto;}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block;}summary{display:list-item;}template{display:none;}[hidden]{display:none;} \ No newline at end of file From 7ea54060f812ee69c748957531c2b1029b5f94b1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 10 Jul 2023 18:00:44 +0200 Subject: [PATCH 432/853] =?UTF-8?q?=F0=9F=92=A5=20Integra=20acciones=20de?= =?UTF-8?q?=20p=C3=A1ginas=20en=20la=20propia=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop/src/base/action.rs | 2 -- pagetop/src/base/component/block.rs | 4 ++-- pagetop/src/response/page.rs | 8 +++++--- .../src/{base/action/page.rs => response/page/action.rs} | 2 +- .../page => response/page/action}/before_prepare_page.rs | 5 +++-- .../page => response/page/action}/before_render_page.rs | 5 +++-- 9 files changed, 17 insertions(+), 15 deletions(-) rename pagetop/src/{base/action/page.rs => response/page/action.rs} (82%) rename pagetop/src/{base/action/page => response/page/action}/before_prepare_page.rs (88%) rename pagetop/src/{base/action/page => response/page/action}/before_render_page.rs (88%) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 987eeb5a..8495bed3 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - vec![action!(action::page::ActionBeforePreparePage => before_prepare_page)] + vec![action!(ActionBeforePreparePage => before_prepare_page)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index e406de16..28c7d293 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -24,7 +24,7 @@ impl ModuleTrait for JQuery { } fn actions(&self) -> Vec<Action> { - vec![action!(action::page::ActionBeforeRenderPage => before_render_page)] + vec![action!(ActionBeforeRenderPage => before_render_page)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index cbff5942..c6f6d073 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - vec![action!(action::page::ActionBeforePreparePage => before_prepare_page, -1)] + vec![action!(ActionBeforePreparePage => before_prepare_page, -1)] } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs index 250e093c..8e4ec0ed 100644 --- a/pagetop/src/base/action.rs +++ b/pagetop/src/base/action.rs @@ -1,5 +1,3 @@ -pub mod page; - pub mod block { crate::actions_for_component!(Block); } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b0c78907..a1423dca 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -44,9 +44,9 @@ impl ComponentTrait for Block { PrepareMarkup::With(html! { div id=(id) class=[self.classes().get()] { @if let Some(title) = self.title().get() { - h2 class="block-title" { (title) } + h2 class="block__title" { (title) } } - div class="block-body" { + div class="block__body" { (self.components().prepare(cx)) } } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 6136d2e4..630d8348 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,4 +1,6 @@ -use crate::base::action; +mod action; +pub use action::*; + use crate::base::component::L10n; use crate::core::component::{ComponentTrait, Context, ContextOp, OneComponent}; use crate::core::theme::ComponentsRegions; @@ -136,7 +138,7 @@ impl Page { pub fn render(&mut self) -> ResultPage<Markup, FatalError> { // Module actions before preparing the page. - action::page::run_actions_before_prepare_page(self); + run_actions_before_prepare_page(self); // Theme actions before preparing the page. self.context.theme().before_prepare_page(self); @@ -145,7 +147,7 @@ impl Page { let body = self.context.theme().prepare_page_body(self); // Module actions before rendering the page. - action::page::run_actions_before_render_page(self); + run_actions_before_render_page(self); // Theme actions before rendering the page. self.context.theme().before_render_page(self); diff --git a/pagetop/src/base/action/page.rs b/pagetop/src/response/page/action.rs similarity index 82% rename from pagetop/src/base/action/page.rs rename to pagetop/src/response/page/action.rs index eb8791e3..9a53300d 100644 --- a/pagetop/src/base/action/page.rs +++ b/pagetop/src/response/page/action.rs @@ -1,4 +1,4 @@ -use crate::response::page::Page; +use super::Page; pub type ActionPage = fn(page: &mut Page); diff --git a/pagetop/src/base/action/page/before_prepare_page.rs b/pagetop/src/response/page/action/before_prepare_page.rs similarity index 88% rename from pagetop/src/base/action/page/before_prepare_page.rs rename to pagetop/src/response/page/action/before_prepare_page.rs index aa9ecf61..64290ef8 100644 --- a/pagetop/src/base/action/page/before_prepare_page.rs +++ b/pagetop/src/response/page/action/before_prepare_page.rs @@ -1,6 +1,7 @@ -use crate::prelude::*; - use super::ActionPage; +use crate::core::action::{action_ref, run_actions, ActionTrait, AnyAction}; +use crate::response::page::Page; +use crate::{use_handle, Handle}; use_handle!(ACTION_BEFORE_PREPARE_PAGE for Action); diff --git a/pagetop/src/base/action/page/before_render_page.rs b/pagetop/src/response/page/action/before_render_page.rs similarity index 88% rename from pagetop/src/base/action/page/before_render_page.rs rename to pagetop/src/response/page/action/before_render_page.rs index 733eb7e5..c949e217 100644 --- a/pagetop/src/base/action/page/before_render_page.rs +++ b/pagetop/src/response/page/action/before_render_page.rs @@ -1,6 +1,7 @@ -use crate::prelude::*; - use super::ActionPage; +use crate::core::action::{action_ref, run_actions, ActionTrait, AnyAction}; +use crate::response::page::Page; +use crate::{use_handle, Handle}; use_handle!(ACTION_BEFORE_RENDER_PAGE for Action); From abb35ef07f004f9f08f3d135392268718ba8690e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 10 Jul 2023 18:38:59 +0200 Subject: [PATCH 433/853] =?UTF-8?q?=F0=9F=92=A5=20Integra=20componentes=20?= =?UTF-8?q?base=20en=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component.rs | 2 + .../src}/component/block.rs | 8 +- pagetop/src/base.rs | 4 - pagetop/src/base/action.rs | 140 ------------------ pagetop/src/base/component.rs | 8 - pagetop/src/core/component.rs | 140 ++++++++++++++++++ pagetop/src/{base => core}/component/html.rs | 0 pagetop/src/{base => core}/component/l10n.rs | 0 pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/locale.rs | 2 +- pagetop/src/prelude.rs | 9 +- pagetop/src/response/fatal_error.rs | 2 +- pagetop/src/response/page.rs | 2 +- 14 files changed, 158 insertions(+), 163 deletions(-) rename {pagetop/src/base => pagetop-minimal/src}/component/block.rs (94%) delete mode 100644 pagetop/src/base/action.rs delete mode 100644 pagetop/src/base/component.rs rename pagetop/src/{base => core}/component/html.rs (100%) rename pagetop/src/{base => core}/component/l10n.rs (100%) diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index f104290f..222993aa 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -13,6 +13,8 @@ mod anchor; pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; mod image; pub use image::{Image, COMPONENT_IMAGE}; +mod block; +pub use block::{Block, COMPONENT_BLOCK}; pub mod form_element; pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/base/component/block.rs b/pagetop-minimal/src/component/block.rs similarity index 94% rename from pagetop/src/base/component/block.rs rename to pagetop-minimal/src/component/block.rs index a1423dca..23f64fca 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -1,7 +1,9 @@ -use crate::prelude::*; +use pagetop::prelude::*; use_handle!(COMPONENT_BLOCK); +actions_for_component!(Block); + #[rustfmt::skip] #[derive(Default)] pub struct Block { @@ -36,7 +38,7 @@ impl ComponentTrait for Block { } fn before_prepare_component(&mut self, cx: &mut Context) { - action::block::run_actions_before_prepare_block(self, cx); + run_actions_before_prepare_block(self, cx); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -54,7 +56,7 @@ impl ComponentTrait for Block { } fn after_prepare_component(&mut self, cx: &mut Context) { - action::block::run_actions_after_prepare_block(self, cx); + run_actions_after_prepare_block(self, cx); } fn as_ref_any(&self) -> &dyn AnyComponent { diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index acfd1dbe..9757ba5f 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,5 +1 @@ -pub mod action; - -pub mod component; - pub mod theme; diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs deleted file mode 100644 index 8e4ec0ed..00000000 --- a/pagetop/src/base/action.rs +++ /dev/null @@ -1,140 +0,0 @@ -pub mod block { - crate::actions_for_component!(Block); -} - -#[macro_export] -macro_rules! actions_for_component { - ( $Component:ty ) => { - $crate::paste! { - use $crate::prelude::*; - - pub type [<Action $Component>] = fn(component: &$Component, cx: &mut Context); - - // ************************************************************************************* - // ACTION BEFORE PREPARE COMPONENT - // ************************************************************************************* - - $crate::use_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); - - pub struct [<BeforePrepare $Component>] { - action: Option<[<Action $Component>]>, - weight: isize, - } - - impl ActionTrait for [<BeforePrepare $Component>] { - fn new() -> Self { - [<BeforePrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - [<ACTION_BEFORE_PREPARE_ $Component:upper>] - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } - } - - impl [<BeforePrepare $Component>] { - #[allow(dead_code)] - pub fn with_action(mut self, action: [<Action $Component>]) -> Self { - self.action = Some(action); - self - } - - #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub(crate) fn [<run_actions_before_prepare_ $Component:lower>]( - component: &mut $Component, - cx: &mut Context - ) { - run_actions([<ACTION_BEFORE_PREPARE_ $Component:upper>], |action| - action_ref::<[<BeforePrepare $Component>]>(&**action) - .run(component, cx) - ); - } - - // ************************************************************************************* - // ACTION AFTER PREPARE COMPONENT - // ************************************************************************************* - - $crate::use_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); - - pub struct [<AfterPrepare $Component>] { - action: Option<[<Action $Component>]>, - weight: isize, - } - - impl ActionTrait for [<AfterPrepare $Component>] { - fn new() -> Self { - [<AfterPrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - [<ACTION_AFTER_PREPARE_ $Component:upper>] - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } - } - - impl [<AfterPrepare $Component>] { - #[allow(dead_code)] - pub fn with_action(mut self, action: [<Action $Component>]) -> Self { - self.action = Some(action); - self - } - - #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub(crate) fn [<run_actions_after_prepare_ $Component:lower>]( - component: &mut $Component, - cx: &mut Context - ) { - run_actions([<ACTION_AFTER_PREPARE_ $Component:upper>], |action| - action_ref::<[<AfterPrepare $Component>]>(&**action) - .run(component, cx) - ); - } - } - }; -} diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs deleted file mode 100644 index 2820da31..00000000 --- a/pagetop/src/base/component.rs +++ /dev/null @@ -1,8 +0,0 @@ -mod html; -pub use html::{Html, COMPONENT_HTML}; - -mod l10n; -pub use l10n::{L10n, COMPONENT_L10N}; - -mod block; -pub use block::{Block, COMPONENT_BLOCK}; diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 7e50276b..bff761cc 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -12,3 +12,143 @@ pub use pack::{PackComponents, PackOp}; mod renderable; pub use renderable::{IsRenderable, Renderable}; + +pub mod html; +pub mod l10n; + +#[macro_export] +macro_rules! actions_for_component { + ( $Component:ty ) => { + $crate::paste! { + use $crate::prelude::*; + + pub type [<Action $Component>] = fn(component: &$Component, cx: &mut Context); + + // ************************************************************************************* + // ACTION BEFORE PREPARE COMPONENT + // ************************************************************************************* + + $crate::use_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); + + pub struct [<BeforePrepare $Component>] { + action: Option<[<Action $Component>]>, + weight: isize, + } + + impl ActionTrait for [<BeforePrepare $Component>] { + fn new() -> Self { + [<BeforePrepare $Component>] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + [<ACTION_BEFORE_PREPARE_ $Component:upper>] + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [<BeforePrepare $Component>] { + #[allow(dead_code)] + pub fn with_action(mut self, action: [<Action $Component>]) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } + } + + #[inline(always)] + pub(crate) fn [<run_actions_before_prepare_ $Component:lower>]( + component: &mut $Component, + cx: &mut Context + ) { + run_actions([<ACTION_BEFORE_PREPARE_ $Component:upper>], |action| + action_ref::<[<BeforePrepare $Component>]>(&**action) + .run(component, cx) + ); + } + + // ************************************************************************************* + // ACTION AFTER PREPARE COMPONENT + // ************************************************************************************* + + $crate::use_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); + + pub struct [<AfterPrepare $Component>] { + action: Option<[<Action $Component>]>, + weight: isize, + } + + impl ActionTrait for [<AfterPrepare $Component>] { + fn new() -> Self { + [<AfterPrepare $Component>] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + [<ACTION_AFTER_PREPARE_ $Component:upper>] + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [<AfterPrepare $Component>] { + #[allow(dead_code)] + pub fn with_action(mut self, action: [<Action $Component>]) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } + } + + #[inline(always)] + pub(crate) fn [<run_actions_after_prepare_ $Component:lower>]( + component: &mut $Component, + cx: &mut Context + ) { + run_actions([<ACTION_AFTER_PREPARE_ $Component:upper>], |action| + action_ref::<[<AfterPrepare $Component>]>(&**action) + .run(component, cx) + ); + } + } + }; +} diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/core/component/html.rs similarity index 100% rename from pagetop/src/base/component/html.rs rename to pagetop/src/core/component/html.rs diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/core/component/l10n.rs similarity index 100% rename from pagetop/src/base/component/l10n.rs rename to pagetop/src/core/component/l10n.rs diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 5b1057f9..bd62c9bd 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,5 @@ -use crate::base::component::L10n; use crate::core::action::Action; +use crate::core::component::l10n::L10n; use crate::core::theme::ThemeStaticRef; use crate::{service, util, Handle}; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index a4e5898f..db2dcd9b 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,4 +1,4 @@ -use crate::base::component::L10n; +use crate::core::component::l10n::L10n; use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 02d7b175..f5567e57 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -87,7 +87,7 @@ //! use_locale!(LOCALE_SAMPLE["path/to/locale"]); //! ``` //! -//! Usa el componente [L10n](crate::base::component::L10n) para incluir textos y contenidos +//! Usa el componente [L10n](crate::core::component::l10n::L10n) para incluir textos y contenidos //! opcionalmente traducibles según el contexto de renderizado. use crate::{config, kv, trace, LazyStatic}; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index d5ad7df8..6dc2c069 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -23,10 +23,13 @@ pub use crate::html::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; -pub use crate::core::{action::*, component::*, module::*, theme::*}; +pub use crate::core::action::*; +pub use crate::core::component::html::*; +pub use crate::core::component::l10n::*; +pub use crate::core::component::*; +pub use crate::core::module::*; +pub use crate::core::theme::*; -pub use crate::base::action; -pub use crate::base::component::*; pub use crate::base::theme; pub use crate::service; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 3994b91c..60df2239 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::base::component::L10n; +use crate::core::component::l10n::L10n; use crate::response::{page::Page, ResponseError}; use crate::service::http::{header::ContentType, StatusCode}; use crate::service::{HttpRequest, HttpResponse}; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 630d8348..5a284012 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,7 +1,7 @@ mod action; pub use action::*; -use crate::base::component::L10n; +use crate::core::component::l10n::L10n; use crate::core::component::{ComponentTrait, Context, ContextOp, OneComponent}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; From ab795d17ff992bbd577e03bcc268967edeb4faca Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 10 Jul 2023 18:46:14 +0200 Subject: [PATCH 434/853] =?UTF-8?q?=F0=9F=92=A5=20Integra=20el=20tema=20Ba?= =?UTF-8?q?sic=20en=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base.rs | 1 - pagetop/src/base/theme.rs | 2 -- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/theme.rs | 3 +++ pagetop/src/core/theme/all.rs | 2 +- pagetop/src/{base => core}/theme/basic.rs | 8 +++++++- pagetop/src/lib.rs | 3 --- pagetop/src/prelude.rs | 2 -- 8 files changed, 12 insertions(+), 11 deletions(-) delete mode 100644 pagetop/src/base.rs delete mode 100644 pagetop/src/base/theme.rs rename pagetop/src/{base => core}/theme/basic.rs (70%) diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs deleted file mode 100644 index 9757ba5f..00000000 --- a/pagetop/src/base.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod theme; diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs deleted file mode 100644 index 3a192746..00000000 --- a/pagetop/src/base/theme.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod basic; -pub use basic::Basic; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 428fbfc4..6575b3a9 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleStaticRef) { let mut list: Vec<ModuleStaticRef> = Vec::new(); // Enable basic theme. - add_to_enabled(&mut list, &crate::base::theme::Basic); + add_to_enabled(&mut list, &crate::core::theme::Basic); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 696e2407..97430df2 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -6,3 +6,6 @@ pub use regions::add_component_to; pub(crate) use regions::ComponentsRegions; pub(crate) mod all; + +mod basic; +pub(crate) use basic::Basic; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 8c7dbc01..fcc09467 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -14,7 +14,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = pub static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::base::theme::Basic, + None => &crate::core::theme::Basic, }); // THEME BY NAME *********************************************************************************** diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/core/theme/basic.rs similarity index 70% rename from pagetop/src/base/theme/basic.rs rename to pagetop/src/core/theme/basic.rs index daed3205..7eb22e5c 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/core/theme/basic.rs @@ -1,4 +1,10 @@ -use crate::prelude::*; +use crate::core::component::ContextOp; +use crate::core::module::ModuleTrait; +use crate::core::theme::{ThemeStaticRef, ThemeTrait}; +use crate::html::{Favicon, StyleSheet}; +use crate::response::page::Page; +use crate::service; +use crate::{serve_static_files, use_handle, use_static, Handle}; use_handle!(THEME_BASIC); diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 76a8134a..2fd99261 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -138,9 +138,6 @@ pub mod db; // APIs esenciales para crear acciones, componentes, módulos y temas. pub mod core; -// Acciones, componentes, módulos y temas integrados en PageTop. -pub mod base; - // API para operar con los servicios web. pub mod service; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 6dc2c069..b6bd2924 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -30,8 +30,6 @@ pub use crate::core::component::*; pub use crate::core::module::*; pub use crate::core::theme::*; -pub use crate::base::theme; - pub use crate::service; pub use crate::service::HttpMessage; From 0a7f756709d448e97fb2b73a6501db4ada5969e0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 10 Jul 2023 20:01:07 +0200 Subject: [PATCH 435/853] =?UTF-8?q?=F0=9F=9A=A7=20Revisa=20macros=20extern?= =?UTF-8?q?as=20al=20core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/module/menu.rs | 2 +- pagetop/src/config.rs | 26 +------------------------- pagetop/src/locale.rs | 2 +- pagetop/src/util.rs | 27 ++++++++++++++++++++++++++- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index b1188eac..27107fee 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use_handle!(MODULE_MENU); -use_locale!(LOCALE_MENU["src/module/menu/locales"]); +use_locale!(LOCALE_MENU in "src/module/menu/locales"); pub struct Menu; diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index b3ee4a3b..be332e00 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -119,6 +119,7 @@ mod path; mod source; mod value; +use crate::default_settings; use crate::LazyStatic; use crate::config::data::ConfigData; @@ -158,31 +159,6 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { settings }); -#[macro_export] -/// Define un conjunto de ajustes de configuración usando tipos seguros y valores predefinidos. -/// -/// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. -/// -/// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). -macro_rules! default_settings { - ( $($key:literal => $value:literal),* $(,)? ) => { - #[doc = concat!( - "Assigned or predefined values for configuration settings associated with the ", - "[`Settings`] structure." - )] - pub static SETTINGS: $crate::LazyStatic<Settings> = $crate::LazyStatic::new(|| { - let mut settings = $crate::config::CONFIG.clone(); - $( - settings.set_default($key, $value).unwrap(); - )* - match settings.try_into() { - Ok(s) => s, - Err(e) => panic!("Error parsing settings: {}", e), - } - }); - }; -} - #[derive(Debug, Deserialize)] /// Configuration settings for the [`[app]`](App), [`[database]`](Database), [`[dev]`](Dev), /// [`[log]`](Log), and [`[server]`](Server) sections (see [`SETTINGS`]). diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index f5567e57..6e8ee8a8 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -84,7 +84,7 @@ //! ``` //! use pagetop::prelude::*; //! -//! use_locale!(LOCALE_SAMPLE["path/to/locale"]); +//! use_locale!(LOCALE_SAMPLE in "path/to/locale"); //! ``` //! //! Usa el componente [L10n](crate::core::component::l10n::L10n) para incluir textos y contenidos diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 40d847cc..43cd925f 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -80,6 +80,31 @@ macro_rules! kv { }}; } +#[macro_export] +/// Define un conjunto de ajustes de configuración usando tipos seguros y valores predefinidos. +/// +/// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. +/// +/// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). +macro_rules! default_settings { + ( $($key:literal => $value:literal),* $(,)? ) => { + #[doc = concat!( + "Assigned or predefined values for configuration settings associated with the ", + "[`Settings`] structure." + )] + pub static SETTINGS: $crate::LazyStatic<Settings> = $crate::LazyStatic::new(|| { + let mut settings = $crate::config::CONFIG.clone(); + $( + settings.set_default($key, $value).unwrap(); + )* + match settings.try_into() { + Ok(s) => s, + Err(e) => panic!("Error parsing settings: {}", e), + } + }); + }; +} + #[macro_export] macro_rules! use_handle { ( $HANDLE:ident ) => { @@ -111,7 +136,7 @@ macro_rules! use_locale { }; } }; - ( $LOCALES:ident[$dir_locales:literal] $(, $core_locales:literal)? ) => { + ( $LOCALES:ident in $dir_locales:literal $(, $core_locales:literal)? ) => { use $crate::locale::*; fluent_templates::static_loader! { From a9a70fca46601ee1ea4fae7cee2af148c19eb4f1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 10 Jul 2023 23:00:10 +0200 Subject: [PATCH 436/853] =?UTF-8?q?=F0=9F=8E=A8=20Limita=20el=20uso=20de?= =?UTF-8?q?=20"super::"=20en=20las=20declaraciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/theme.rs | 3 +-- pagetop/src/core/theme/all.rs | 2 +- pagetop/src/html/assets/headscript.rs | 2 +- pagetop/src/html/assets/headstyles.rs | 2 +- pagetop/src/html/assets/javascript.rs | 2 +- pagetop/src/html/assets/stylesheet.rs | 2 +- pagetop/src/response/page/action.rs | 2 +- pagetop/src/response/page/action/before_prepare_page.rs | 2 +- pagetop/src/response/page/action/before_render_page.rs | 2 +- 10 files changed, 10 insertions(+), 11 deletions(-) diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 6575b3a9..a98a1088 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleStaticRef) { let mut list: Vec<ModuleStaticRef> = Vec::new(); // Enable basic theme. - add_to_enabled(&mut list, &crate::core::theme::Basic); + add_to_enabled(&mut list, &crate::core::theme::basic::Basic); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 97430df2..608fe573 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -7,5 +7,4 @@ pub(crate) use regions::ComponentsRegions; pub(crate) mod all; -mod basic; -pub(crate) use basic::Basic; +pub(crate) mod basic; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index fcc09467..d46d08c6 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -14,7 +14,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = pub static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::core::theme::Basic, + None => &crate::core::theme::basic::Basic, }); // THEME BY NAME *********************************************************************************** diff --git a/pagetop/src/html/assets/headscript.rs b/pagetop/src/html/assets/headscript.rs index ed7eccd5..ac384fbb 100644 --- a/pagetop/src/html/assets/headscript.rs +++ b/pagetop/src/html/assets/headscript.rs @@ -1,4 +1,4 @@ -use super::AssetsTrait; +use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; #[rustfmt::skip] diff --git a/pagetop/src/html/assets/headstyles.rs b/pagetop/src/html/assets/headstyles.rs index 888ef21e..5996eb05 100644 --- a/pagetop/src/html/assets/headstyles.rs +++ b/pagetop/src/html/assets/headstyles.rs @@ -1,4 +1,4 @@ -use super::AssetsTrait; +use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; #[rustfmt::skip] diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 44af052a..67816f87 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,4 +1,4 @@ -use super::AssetsTrait; +use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; #[derive(Default, Eq, PartialEq)] diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index c8347591..efad3fef 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,4 +1,4 @@ -use super::AssetsTrait; +use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; pub enum TargetMedia { diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index 9a53300d..eb8791e3 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -1,4 +1,4 @@ -use super::Page; +use crate::response::page::Page; pub type ActionPage = fn(page: &mut Page); diff --git a/pagetop/src/response/page/action/before_prepare_page.rs b/pagetop/src/response/page/action/before_prepare_page.rs index 64290ef8..2de82813 100644 --- a/pagetop/src/response/page/action/before_prepare_page.rs +++ b/pagetop/src/response/page/action/before_prepare_page.rs @@ -1,5 +1,5 @@ -use super::ActionPage; use crate::core::action::{action_ref, run_actions, ActionTrait, AnyAction}; +use crate::response::page::action::ActionPage; use crate::response::page::Page; use crate::{use_handle, Handle}; diff --git a/pagetop/src/response/page/action/before_render_page.rs b/pagetop/src/response/page/action/before_render_page.rs index c949e217..79a04e46 100644 --- a/pagetop/src/response/page/action/before_render_page.rs +++ b/pagetop/src/response/page/action/before_render_page.rs @@ -1,5 +1,5 @@ -use super::ActionPage; use crate::core::action::{action_ref, run_actions, ActionTrait, AnyAction}; +use crate::response::page::action::ActionPage; use crate::response::page::Page; use crate::{use_handle, Handle}; From 44550edafaca1c36e77f112ee3b2689bcab4e371 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 11 Jul 2023 18:45:02 +0200 Subject: [PATCH 437/853] =?UTF-8?q?=F0=9F=92=A5=20Funci=C3=B3n=20located()?= =?UTF-8?q?=20pasa=20a=20at()=20en=20activos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 4 ++-- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-megamenu/src/component.rs | 6 +++--- pagetop-minimal/src/component/icon.rs | 2 +- pagetop/src/core/theme/basic.rs | 2 +- pagetop/src/html/assets/javascript.rs | 2 +- pagetop/src/html/assets/stylesheet.rs | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index ad1ef8f9..3ba3086e 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -24,7 +24,7 @@ impl ThemeTrait for Aliner { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/aliner/css/styles.css").with_weight(-99), + StyleSheet::at("/aliner/css/styles.css").with_weight(-99), )); } } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index ac6d79b6..6455327d 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -46,12 +46,12 @@ impl ThemeTrait for Bootsier { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bootsier/css/bootstrap.min.css") + StyleSheet::at("/bootsier/css/bootstrap.min.css") .with_version("5.1.3") .with_weight(-99), )) .alter_context(ContextOp::AddJavaScript( - JavaScript::located("/bootsier/js/bootstrap.bundle.min.js") + JavaScript::at("/bootsier/js/bootstrap.bundle.min.js") .with_version("5.1.3") .with_weight(-99), )); diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 688c6ae6..80b8d9e8 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -34,7 +34,7 @@ impl ThemeTrait for Bulmix { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/bulmix/css/bulma.min.css") + StyleSheet::at("/bulmix/css/bulma.min.css") .with_version("0.9.4") .with_weight(-99), )); diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index f43f917b..f3cb304d 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -35,7 +35,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) .with_title(L10n::t("page_title", &LOCALE_HOMEDEMO)) - .with_context(ContextOp::AddStyleSheet(StyleSheet::located( + .with_context(ContextOp::AddStyleSheet(StyleSheet::at( "/homedemo/css/styles.css", ))) .with_body_classes(ClassesOp::AddFirst, "default-homepage") diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 28c7d293..59dd16b6 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -47,7 +47,7 @@ impl JQuery { fn before_render_page(page: &mut Page) { if let Some(true) = page.context().get_param::<bool>(PARAM_JQUERY) { page.context().alter(ContextOp::AddJavaScript( - JavaScript::located("/jquery/jquery.min.js") + JavaScript::at("/jquery/jquery.min.js") .with_version("3.6.0") .with_weight(isize::MIN) .with_mode(ModeJS::Normal), diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index d27c672e..f4ada55d 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -194,13 +194,13 @@ impl ComponentTrait for MegaMenu { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { cx.alter(ContextOp::AddStyleSheet( - StyleSheet::located("/megamenu/css/menu.css").with_version("1.1.1"), + StyleSheet::at("/megamenu/css/menu.css").with_version("1.1.1"), )) .alter(ContextOp::AddStyleSheet( - StyleSheet::located("/megamenu/css/menu-clean.css").with_version("1.1.1"), + StyleSheet::at("/megamenu/css/menu-clean.css").with_version("1.1.1"), )) .alter(ContextOp::AddJavaScript( - JavaScript::located("/megamenu/js/menu.min.js").with_version("1.1.1"), + JavaScript::at("/megamenu/js/menu.min.js").with_version("1.1.1"), )); JQuery.enable_jquery(cx); diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 5389cdae..cace3e60 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -30,7 +30,7 @@ impl ComponentTrait for Icon { fn before_prepare_component(&mut self, cx: &mut Context) { cx.alter(ContextOp::AddStyleSheet( - StyleSheet::located("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), + StyleSheet::at("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), )); } diff --git a/pagetop/src/core/theme/basic.rs b/pagetop/src/core/theme/basic.rs index 7eb22e5c..3f21ef7d 100644 --- a/pagetop/src/core/theme/basic.rs +++ b/pagetop/src/core/theme/basic.rs @@ -30,7 +30,7 @@ impl ThemeTrait for Basic { fn before_prepare_page(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::located("/theme/css/normalize.min.css").with_version("8.0.1"), + StyleSheet::at("/theme/css/normalize.min.css").with_version("8.0.1"), )); } } diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 67816f87..f1242c47 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -40,7 +40,7 @@ impl AssetsTrait for JavaScript { } impl JavaScript { - pub fn located<S>(path: S) -> Self + pub fn at<S>(path: S) -> Self where S: Into<String>, { diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index efad3fef..2acc0d5d 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -38,7 +38,7 @@ impl AssetsTrait for StyleSheet { } impl StyleSheet { - pub fn located<S>(path: S) -> Self + pub fn at<S>(path: S) -> Self where S: Into<String>, { From 0880964fd188c74b671770190a9d2fac572e6998 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 11 Jul 2023 19:17:05 +0200 Subject: [PATCH 438/853] =?UTF-8?q?=F0=9F=92=A5=20Cambios=20antes/despu?= =?UTF-8?q?=C3=A9s=20de=20preparar=20cuerpo=20p=C3=A1g.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 4 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 4 +- pagetop-node/src/lib.rs | 4 +- pagetop/src/core/theme/basic.rs | 2 +- pagetop/src/core/theme/definition.rs | 40 +++++++++---------- pagetop/src/response/page.rs | 20 +++++----- pagetop/src/response/page/action.rs | 8 ++-- ...e_render_page.rs => after_prepare_body.rs} | 18 ++++----- ...prepare_page.rs => before_prepare_body.rs} | 18 ++++----- 12 files changed, 63 insertions(+), 63 deletions(-) rename pagetop/src/response/page/action/{before_render_page.rs => after_prepare_body.rs} (68%) rename pagetop/src/response/page/action/{before_prepare_page.rs => before_prepare_body.rs} (68%) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 8495bed3..c6004a9c 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforePreparePage => before_prepare_page)] + vec![action!(ActionBeforePrepareBody => before_prepare_body)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { @@ -40,6 +40,6 @@ impl ModuleTrait for Admin { } } -fn before_prepare_page(page: &mut Page) { +fn before_prepare_body(page: &mut Page) { page.alter_body_classes(ClassesOp::Add, "test-admin"); } diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 3ba3086e..f532eef1 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -21,7 +21,7 @@ impl ModuleTrait for Aliner { } impl ThemeTrait for Aliner { - fn before_prepare_page(&self, page: &mut Page) { + fn before_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/aliner/css/styles.css").with_weight(-99), diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 6455327d..338cc6cf 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -43,7 +43,7 @@ impl ThemeTrait for Bootsier { ] } - fn before_prepare_page(&self, page: &mut Page) { + fn before_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bootsier/css/bootstrap.min.css") @@ -58,7 +58,7 @@ impl ThemeTrait for Bootsier { JQuery.enable_jquery(page.context()); } - fn prepare_page_body(&self, page: &mut Page) -> Markup { + fn prepare_body(&self, page: &mut Page) -> Markup { match page.template() { "admin" => html! { body class=[page.body_classes().get()] { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 80b8d9e8..9059ed56 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -31,7 +31,7 @@ impl ModuleTrait for Bulmix { } impl ThemeTrait for Bulmix { - fn before_prepare_page(&self, page: &mut Page) { + fn before_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bulmix/css/bulma.min.css") diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 59dd16b6..dfbffacb 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -24,7 +24,7 @@ impl ModuleTrait for JQuery { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforeRenderPage => before_render_page)] + vec![action!(ActionAfterPrepareBody => after_prepare_body)] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { @@ -44,7 +44,7 @@ impl JQuery { } } -fn before_render_page(page: &mut Page) { +fn after_prepare_body(page: &mut Page) { if let Some(true) = page.context().get_param::<bool>(PARAM_JQUERY) { page.context().alter(ContextOp::AddJavaScript( JavaScript::at("/jquery/jquery.min.js") diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index c6f6d073..d9490c48 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforePreparePage => before_prepare_page, -1)] + vec![action!(ActionBeforePrepareBody => before_prepare_body, -1)] } fn migrations(&self) -> Vec<MigrationItem> { @@ -44,6 +44,6 @@ async fn node(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request).with_title(L10n::n("Nodo")).render() } -fn before_prepare_page(page: &mut Page) { +fn before_prepare_body(page: &mut Page) { page.alter_body_classes(ClassesOp::Add, "test-node"); } diff --git a/pagetop/src/core/theme/basic.rs b/pagetop/src/core/theme/basic.rs index 3f21ef7d..0a2091b6 100644 --- a/pagetop/src/core/theme/basic.rs +++ b/pagetop/src/core/theme/basic.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Basic { } impl ThemeTrait for Basic { - fn before_prepare_page(&self, page: &mut Page) { + fn before_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/theme/css/normalize.min.css").with_version("8.0.1"), diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index db2dcd9b..cb347ef6 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -21,9 +21,27 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } #[allow(unused_variables)] - fn before_prepare_page(&self, page: &mut Page) {} + fn before_prepare_body(&self, page: &mut Page) {} - fn prepare_page_head(&self, page: &mut Page) -> Markup { + fn prepare_body(&self, page: &mut Page) -> Markup { + html! { + body class=[page.body_classes().get()] { + @for (region, _) in self.regions().iter() { + @if let Some(content) = page.prepare_region(region) { + #(region) { (content) } + } + } + } + } + } + + fn after_prepare_body(&self, page: &mut Page) { + if page.favicon().is_none() { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); + } + } + + fn prepare_head(&self, page: &mut Page) -> Markup { let title = page.title(); let description = page.description(); let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; @@ -60,24 +78,6 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } } - fn prepare_page_body(&self, page: &mut Page) -> Markup { - html! { - body class=[page.body_classes().get()] { - @for (region, _) in self.regions().iter() { - @if let Some(content) = page.prepare_region(region) { - #(region) { (content) } - } - } - } - } - } - - fn before_render_page(&self, page: &mut Page) { - if page.favicon().is_none() { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); - } - } - #[rustfmt::skip] #[allow(unused_variables)] fn before_prepare_component( diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 5a284012..5d14ee9a 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -137,23 +137,23 @@ impl Page { // Page RENDER. pub fn render(&mut self) -> ResultPage<Markup, FatalError> { - // Module actions before preparing the page. - run_actions_before_prepare_page(self); + // Module actions before preparing the page body. + run_actions_before_prepare_body(self); - // Theme actions before preparing the page. - self.context.theme().before_prepare_page(self); + // Theme actions before preparing the page body. + self.context.theme().before_prepare_body(self); // Prepare page body. - let body = self.context.theme().prepare_page_body(self); + let body = self.context.theme().prepare_body(self); - // Module actions before rendering the page. - run_actions_before_render_page(self); + // Module actions after preparing the page body. + run_actions_after_prepare_body(self); - // Theme actions before rendering the page. - self.context.theme().before_render_page(self); + // Theme actions after preparing the page body. + self.context.theme().after_prepare_body(self); // Prepare page head. - let head = self.context.theme().prepare_page_head(self); + let head = self.context.theme().prepare_head(self); // Render the page. let lang = self.context.langid().language.as_str(); diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index eb8791e3..b61bc895 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -2,8 +2,8 @@ use crate::response::page::Page; pub type ActionPage = fn(page: &mut Page); -mod before_prepare_page; -pub use before_prepare_page::*; +mod before_prepare_body; +pub use before_prepare_body::*; -mod before_render_page; -pub use before_render_page::*; +mod after_prepare_body; +pub use after_prepare_body::*; diff --git a/pagetop/src/response/page/action/before_render_page.rs b/pagetop/src/response/page/action/after_prepare_body.rs similarity index 68% rename from pagetop/src/response/page/action/before_render_page.rs rename to pagetop/src/response/page/action/after_prepare_body.rs index 79a04e46..93a7442a 100644 --- a/pagetop/src/response/page/action/before_render_page.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -3,23 +3,23 @@ use crate::response::page::action::ActionPage; use crate::response::page::Page; use crate::{use_handle, Handle}; -use_handle!(ACTION_BEFORE_RENDER_PAGE for Action); +use_handle!(ACTION_AFTER_PREPARE_BODY for Action); -pub struct ActionBeforeRenderPage { +pub struct ActionAfterPrepareBody { action: Option<ActionPage>, weight: isize, } -impl ActionTrait for ActionBeforeRenderPage { +impl ActionTrait for ActionAfterPrepareBody { fn new() -> Self { - ActionBeforeRenderPage { + ActionAfterPrepareBody { action: None, weight: 0, } } fn handle(&self) -> Handle { - ACTION_BEFORE_RENDER_PAGE + ACTION_AFTER_PREPARE_BODY } fn weight(&self) -> isize { @@ -31,7 +31,7 @@ impl ActionTrait for ActionBeforeRenderPage { } } -impl ActionBeforeRenderPage { +impl ActionAfterPrepareBody { pub fn with_action(mut self, action: ActionPage) -> Self { self.action = Some(action); self @@ -50,8 +50,8 @@ impl ActionBeforeRenderPage { } #[inline(always)] -pub(crate) fn run_actions_before_render_page(page: &mut Page) { - run_actions(ACTION_BEFORE_RENDER_PAGE, |action| { - action_ref::<ActionBeforeRenderPage>(&**action).run(page) +pub(crate) fn run_actions_after_prepare_body(page: &mut Page) { + run_actions(ACTION_AFTER_PREPARE_BODY, |action| { + action_ref::<ActionAfterPrepareBody>(&**action).run(page) }); } diff --git a/pagetop/src/response/page/action/before_prepare_page.rs b/pagetop/src/response/page/action/before_prepare_body.rs similarity index 68% rename from pagetop/src/response/page/action/before_prepare_page.rs rename to pagetop/src/response/page/action/before_prepare_body.rs index 2de82813..2484d5f9 100644 --- a/pagetop/src/response/page/action/before_prepare_page.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -3,23 +3,23 @@ use crate::response::page::action::ActionPage; use crate::response::page::Page; use crate::{use_handle, Handle}; -use_handle!(ACTION_BEFORE_PREPARE_PAGE for Action); +use_handle!(ACTION_BEFORE_PREPARE_BODY for Action); -pub struct ActionBeforePreparePage { +pub struct ActionBeforePrepareBody { action: Option<ActionPage>, weight: isize, } -impl ActionTrait for ActionBeforePreparePage { +impl ActionTrait for ActionBeforePrepareBody { fn new() -> Self { - ActionBeforePreparePage { + ActionBeforePrepareBody { action: None, weight: 0, } } fn handle(&self) -> Handle { - ACTION_BEFORE_PREPARE_PAGE + ACTION_BEFORE_PREPARE_BODY } fn weight(&self) -> isize { @@ -31,7 +31,7 @@ impl ActionTrait for ActionBeforePreparePage { } } -impl ActionBeforePreparePage { +impl ActionBeforePrepareBody { pub fn with_action(mut self, action: ActionPage) -> Self { self.action = Some(action); self @@ -50,8 +50,8 @@ impl ActionBeforePreparePage { } #[inline(always)] -pub(crate) fn run_actions_before_prepare_page(page: &mut Page) { - run_actions(ACTION_BEFORE_PREPARE_PAGE, |action| { - action_ref::<ActionBeforePreparePage>(&**action).run(page) +pub(crate) fn run_actions_before_prepare_body(page: &mut Page) { + run_actions(ACTION_BEFORE_PREPARE_BODY, |action| { + action_ref::<ActionBeforePrepareBody>(&**action).run(page) }); } From 9a49186ed2150d99b7219e85ae2ad7334faaf773 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 11 Jul 2023 21:17:35 +0200 Subject: [PATCH 439/853] =?UTF-8?q?=F0=9F=92=A5=20Oculta=20as=5Fref=5Fany(?= =?UTF-8?q?)=20y=20as=5Fmut=5Fany()=20en=20la=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 16 ------------ pagetop-minimal/src/component/anchor.rs | 8 ------ pagetop-minimal/src/component/block.rs | 8 ------ pagetop-minimal/src/component/container.rs | 8 ------ .../src/component/form_element/button.rs | 8 ------ .../src/component/form_element/date.rs | 8 ------ .../src/component/form_element/form.rs | 8 ------ .../src/component/form_element/hidden.rs | 8 ------ .../src/component/form_element/input.rs | 8 ------ pagetop-minimal/src/component/grid/column.rs | 8 ------ pagetop-minimal/src/component/grid/row.rs | 8 ------ pagetop-minimal/src/component/heading.rs | 8 ------ pagetop-minimal/src/component/icon.rs | 8 ------ pagetop-minimal/src/component/image.rs | 8 ------ pagetop-minimal/src/component/paragraph.rs | 8 ------ pagetop/src/core/action.rs | 2 +- pagetop/src/core/action/definition.rs | 14 +++++++--- pagetop/src/core/component.rs | 10 +------ pagetop/src/core/component/definition.rs | 26 ++++++++++++------- pagetop/src/core/component/html.rs | 12 +++------ pagetop/src/core/component/l10n.rs | 13 +++------- pagetop/src/response/fatal_error/error403.rs | 10 +------ pagetop/src/response/fatal_error/error404.rs | 10 +------ .../page/action/after_prepare_body.rs | 6 +---- .../page/action/before_prepare_body.rs | 6 +---- 25 files changed, 41 insertions(+), 196 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index f4ada55d..25d3dbd3 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -76,14 +76,6 @@ impl ComponentTrait for MegaMenuItem { }), } } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl MegaMenuItem { @@ -222,14 +214,6 @@ impl ComponentTrait for MegaMenu { fn after_prepare_component(&mut self, cx: &mut Context) { run_actions_after_prepare_megamenu(self, cx); } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl MegaMenu { diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 21779380..07254ec5 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -84,14 +84,6 @@ impl ComponentTrait for Anchor { } }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Anchor { diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 23f64fca..4770a03b 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -58,14 +58,6 @@ impl ComponentTrait for Block { fn after_prepare_component(&mut self, cx: &mut Context) { run_actions_after_prepare_block(self, cx); } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Block { diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 729abada..2a24de4c 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -95,14 +95,6 @@ impl ComponentTrait for Container { fn after_prepare_component(&mut self, cx: &mut Context) { run_actions_after_prepare_container(self, cx); } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Container { diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index 513e250b..358391d3 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -67,14 +67,6 @@ impl ComponentTrait for Button { } }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Button { diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index a0c97248..faba0fcc 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -72,14 +72,6 @@ impl ComponentTrait for Date { } }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Date { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index fc952471..1d20370e 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -73,14 +73,6 @@ impl ComponentTrait for Form { fn after_prepare_component(&mut self, cx: &mut Context) { run_actions_after_prepare_form(self, cx); } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Form { diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index a048ee5e..e1b88cf8 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -29,14 +29,6 @@ impl ComponentTrait for Hidden { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Hidden { diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index ade3f9e4..c2f49a4c 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -106,14 +106,6 @@ impl ComponentTrait for Input { } }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Input { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 90213109..56b96043 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -84,14 +84,6 @@ impl ComponentTrait for Column { fn after_prepare_component(&mut self, cx: &mut Context) { run_actions_after_prepare_column(self, cx); } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Column { diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index d30f2d09..80112733 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -53,14 +53,6 @@ impl ComponentTrait for Row { fn after_prepare_component(&mut self, cx: &mut Context) { run_actions_after_prepare_row(self, cx); } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Row { diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index f2a59321..ca8280f2 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -73,14 +73,6 @@ impl ComponentTrait for Heading { HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(cx)) }, }}) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Heading { diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index cace3e60..ca2115c3 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -37,14 +37,6 @@ impl ComponentTrait for Icon { fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { i class=[self.classes().get()] {}; }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Icon { diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index 70b34f89..0496bfb1 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -42,14 +42,6 @@ impl ComponentTrait for Image { class=[self.classes().get()]; }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Image { diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 3841a014..25211a08 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -56,14 +56,6 @@ impl ComponentTrait for Paragraph { } }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Paragraph { diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index 9d97640e..0885c80a 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -1,5 +1,5 @@ mod definition; -pub use definition::{action_ref, ActionTrait, AnyAction}; +pub use definition::{action_ref, ActionTrait, BaseAction}; mod list; pub use list::Action; diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs index 96f5b5bf..0611879c 100644 --- a/pagetop/src/core/action/definition.rs +++ b/pagetop/src/core/action/definition.rs @@ -1,8 +1,12 @@ use crate::Handle; -pub use std::any::Any as AnyAction; +use std::any::Any; -pub trait ActionTrait: AnyAction + Send + Sync { +pub trait BaseAction: Any { + fn as_ref_any(&self) -> &dyn Any; +} + +pub trait ActionTrait: BaseAction + Send + Sync { fn new() -> Self where Self: Sized; @@ -12,8 +16,12 @@ pub trait ActionTrait: AnyAction + Send + Sync { fn weight(&self) -> isize { 0 } +} - fn as_ref_any(&self) -> &dyn AnyAction; +impl<C: ActionTrait> BaseAction for C { + fn as_ref_any(&self) -> &dyn Any { + self + } } pub fn action_ref<A: 'static>(action: &dyn ActionTrait) -> &A { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index bff761cc..8247485b 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -2,7 +2,7 @@ mod context; pub use context::{Context, ContextOp}; mod definition; -pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; +pub use definition::{component_mut, component_ref, BaseComponent, ComponentTrait}; mod one; pub use one::OneComponent; @@ -50,10 +50,6 @@ macro_rules! actions_for_component { fn weight(&self) -> isize { self.weight } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } } impl [<BeforePrepare $Component>] { @@ -113,10 +109,6 @@ macro_rules! actions_for_component { fn weight(&self) -> isize { self.weight } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } } impl [<AfterPrepare $Component>] { diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 0591d735..a431dc37 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -2,13 +2,17 @@ use crate::core::component::Context; use crate::html::{html, Markup, PrepareMarkup}; use crate::{util, Handle}; -pub use std::any::Any as AnyComponent; +use std::any::Any; -pub trait BaseComponent { +pub trait BaseComponent: Any { fn prepare(&mut self, cx: &mut Context) -> Markup; + + fn as_ref_any(&self) -> &dyn Any; + + fn as_mut_any(&mut self) -> &mut dyn Any; } -pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { +pub trait ComponentTrait: BaseComponent + Send + Sync { fn new() -> Self where Self: Sized; @@ -46,10 +50,6 @@ pub trait ComponentTrait: AnyComponent + BaseComponent + Send + Sync { #[allow(unused_variables)] fn after_prepare_component(&mut self, cx: &mut Context) {} - - fn as_ref_any(&self) -> &dyn AnyComponent; - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent; } impl<C: ComponentTrait> BaseComponent for C { @@ -77,12 +77,20 @@ impl<C: ComponentTrait> BaseComponent for C { html! {} } } + + fn as_ref_any(&self) -> &dyn Any { + self + } + + fn as_mut_any(&mut self) -> &mut dyn Any { + self + } } -pub fn component_ref<C: 'static>(component: &dyn ComponentTrait) -> &C { +pub fn component_ref<C: ComponentTrait>(component: &dyn ComponentTrait) -> &C { component.as_ref_any().downcast_ref::<C>().unwrap() } -pub fn component_mut<C: 'static>(component: &mut dyn ComponentTrait) -> &mut C { +pub fn component_mut<C: ComponentTrait>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } diff --git a/pagetop/src/core/component/html.rs b/pagetop/src/core/component/html.rs index eb436be4..b0af5bc8 100644 --- a/pagetop/src/core/component/html.rs +++ b/pagetop/src/core/component/html.rs @@ -1,4 +1,6 @@ -use crate::prelude::*; +use crate::core::component::{ComponentTrait, Context}; +use crate::html::{html, Markup, PrepareMarkup}; +use crate::{fn_builder, use_handle, Handle}; use_handle!(COMPONENT_HTML); @@ -17,14 +19,6 @@ impl ComponentTrait for Html { fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { (self.html()) }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl Html { diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs index 5356204b..1ef93642 100644 --- a/pagetop/src/core/component/l10n.rs +++ b/pagetop/src/core/component/l10n.rs @@ -1,4 +1,7 @@ -use crate::prelude::*; +use crate::core::component::{ComponentTrait, Context}; +use crate::html::{html, PreEscaped, PrepareMarkup}; +use crate::locale::{Loader, Locales}; +use crate::{fn_builder, use_handle, Handle}; use std::collections::HashMap; @@ -60,14 +63,6 @@ impl ComponentTrait for L10n { }), } } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } impl L10n { diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index 2523f2fb..a3eb8c75 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,4 +1,4 @@ -use crate::core::component::{AnyComponent, ComponentTrait, Context}; +use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; use crate::{use_handle, Handle}; @@ -22,12 +22,4 @@ impl ComponentTrait for Error403 { } }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index d97272ca..40acf80d 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,4 +1,4 @@ -use crate::core::component::{AnyComponent, ComponentTrait, Context}; +use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; use crate::{use_handle, Handle}; @@ -22,12 +22,4 @@ impl ComponentTrait for Error404 { } }) } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } } diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/response/page/action/after_prepare_body.rs index 93a7442a..f745e4fa 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -1,4 +1,4 @@ -use crate::core::action::{action_ref, run_actions, ActionTrait, AnyAction}; +use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; use crate::{use_handle, Handle}; @@ -25,10 +25,6 @@ impl ActionTrait for ActionAfterPrepareBody { fn weight(&self) -> isize { self.weight } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } } impl ActionAfterPrepareBody { diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/response/page/action/before_prepare_body.rs index 2484d5f9..ef1d938d 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -1,4 +1,4 @@ -use crate::core::action::{action_ref, run_actions, ActionTrait, AnyAction}; +use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; use crate::{use_handle, Handle}; @@ -25,10 +25,6 @@ impl ActionTrait for ActionBeforePrepareBody { fn weight(&self) -> isize { self.weight } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } } impl ActionBeforePrepareBody { From 58d6ea67192956588d51aa21201a7e2e2251e688 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 12 Jul 2023 00:24:37 +0200 Subject: [PATCH 440/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20el=20tema=20p?= =?UTF-8?q?redefinido=20Basic=20a=20Monster?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop/build.rs | 4 ++-- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/theme.rs | 2 +- pagetop/src/core/theme/all.rs | 2 +- pagetop/src/core/theme/definition.rs | 2 +- .../src/core/theme/{basic.rs => monster.rs} | 20 +++++++++--------- .../{theme => monster}/css/normalize.min.css | 0 pagetop/static/{theme => monster}/favicon.ico | Bin 11 files changed, 19 insertions(+), 19 deletions(-) rename pagetop/src/core/theme/{basic.rs => monster.rs} (59%) rename pagetop/static/{theme => monster}/css/normalize.min.css (100%) rename pagetop/static/{theme => monster}/favicon.ico (100%) diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index f532eef1..f5551088 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for Aliner { impl ThemeTrait for Aliner { fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/aliner/css/styles.css").with_weight(-99), )); diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 338cc6cf..7f4abe0d 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -44,7 +44,7 @@ impl ThemeTrait for Bootsier { } fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bootsier/css/bootstrap.min.css") .with_version("5.1.3") diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 9059ed56..988d97f0 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -32,7 +32,7 @@ impl ModuleTrait for Bulmix { impl ThemeTrait for Bulmix { fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bulmix/css/bulma.min.css") .with_version("0.9.4") diff --git a/pagetop/build.rs b/pagetop/build.rs index 3e2d9749..d1a5030f 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,7 +1,7 @@ use pagetop_build::StaticFilesBundle; fn main() -> std::io::Result<()> { - StaticFilesBundle::from_dir("./static/theme") - .with_name("theme") + StaticFilesBundle::from_dir("./static/monster") + .with_name("monster") .build() } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index a98a1088..e3dfac8e 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleStaticRef) { let mut list: Vec<ModuleStaticRef> = Vec::new(); // Enable basic theme. - add_to_enabled(&mut list, &crate::core::theme::basic::Basic); + add_to_enabled(&mut list, &crate::core::theme::monster::Monster); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 608fe573..84bc68dc 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -7,4 +7,4 @@ pub(crate) use regions::ComponentsRegions; pub(crate) mod all; -pub(crate) mod basic; +pub(crate) mod monster; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index d46d08c6..eabc66e3 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -14,7 +14,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = pub static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::core::theme::basic::Basic, + None => &crate::core::theme::monster::Monster, }); // THEME BY NAME *********************************************************************************** diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index cb347ef6..2a6c7d09 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -37,7 +37,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn after_prepare_body(&self, page: &mut Page) { if page.favicon().is_none() { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); + page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))); } } diff --git a/pagetop/src/core/theme/basic.rs b/pagetop/src/core/theme/monster.rs similarity index 59% rename from pagetop/src/core/theme/basic.rs rename to pagetop/src/core/theme/monster.rs index 0a2091b6..c90471db 100644 --- a/pagetop/src/core/theme/basic.rs +++ b/pagetop/src/core/theme/monster.rs @@ -6,31 +6,31 @@ use crate::response::page::Page; use crate::service; use crate::{serve_static_files, use_handle, use_static, Handle}; -use_handle!(THEME_BASIC); +use_handle!(THEME_MONSTER); -use_static!(theme); +use_static!(monster); -pub struct Basic; +pub struct Monster; -impl ModuleTrait for Basic { +impl ModuleTrait for Monster { fn handle(&self) -> Handle { - THEME_BASIC + THEME_MONSTER } fn theme(&self) -> Option<ThemeStaticRef> { - Some(&Basic) + Some(&Monster) } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/theme", theme); + serve_static_files!(cfg, "/monster", monster); } } -impl ThemeTrait for Basic { +impl ThemeTrait for Monster { fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/normalize.min.css").with_version("8.0.1"), + StyleSheet::at("/monster/css/normalize.min.css").with_version("8.0.1"), )); } } diff --git a/pagetop/static/theme/css/normalize.min.css b/pagetop/static/monster/css/normalize.min.css similarity index 100% rename from pagetop/static/theme/css/normalize.min.css rename to pagetop/static/monster/css/normalize.min.css diff --git a/pagetop/static/theme/favicon.ico b/pagetop/static/monster/favicon.ico similarity index 100% rename from pagetop/static/theme/favicon.ico rename to pagetop/static/monster/favicon.ico From a0c61b008a8a15bdc5d18b55cd2c7a69965a6d71 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 20:20:30 +0200 Subject: [PATCH 441/853] =?UTF-8?q?=E2=8F=AA=20Revierte=20el=20cambio=20de?= =?UTF-8?q?=20Basic=20por=20Monster?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop/build.rs | 4 +- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/theme.rs | 5 +- pagetop/src/core/theme/all.rs | 2 +- .../src/core/theme/{monster.rs => basic.rs} | 20 ++++---- pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/util.rs | 44 +++++++++++------- .../{monster => theme}/css/normalize.min.css | 0 pagetop/static/{monster => theme}/favicon.ico | Bin 12 files changed, 47 insertions(+), 38 deletions(-) rename pagetop/src/core/theme/{monster.rs => basic.rs} (59%) rename pagetop/static/{monster => theme}/css/normalize.min.css (100%) rename pagetop/static/{monster => theme}/favicon.ico (100%) diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index f5551088..f532eef1 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for Aliner { impl ThemeTrait for Aliner { fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/aliner/css/styles.css").with_weight(-99), )); diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 7f4abe0d..338cc6cf 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -44,7 +44,7 @@ impl ThemeTrait for Bootsier { } fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bootsier/css/bootstrap.min.css") .with_version("5.1.3") diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 988d97f0..9059ed56 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -32,7 +32,7 @@ impl ModuleTrait for Bulmix { impl ThemeTrait for Bulmix { fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bulmix/css/bulma.min.css") .with_version("0.9.4") diff --git a/pagetop/build.rs b/pagetop/build.rs index d1a5030f..3e2d9749 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,7 +1,7 @@ use pagetop_build::StaticFilesBundle; fn main() -> std::io::Result<()> { - StaticFilesBundle::from_dir("./static/monster") - .with_name("monster") + StaticFilesBundle::from_dir("./static/theme") + .with_name("theme") .build() } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index e3dfac8e..6575b3a9 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleStaticRef) { let mut list: Vec<ModuleStaticRef> = Vec::new(); // Enable basic theme. - add_to_enabled(&mut list, &crate::core::theme::monster::Monster); + add_to_enabled(&mut list, &crate::core::theme::Basic); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 84bc68dc..e12f7d21 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -5,6 +5,7 @@ mod regions; pub use regions::add_component_to; pub(crate) use regions::ComponentsRegions; -pub(crate) mod all; +mod basic; +pub(crate) use basic::Basic; -pub(crate) mod monster; +pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index eabc66e3..fcc09467 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -14,7 +14,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = pub static THEME: LazyStatic<ThemeStaticRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::core::theme::monster::Monster, + None => &crate::core::theme::Basic, }); // THEME BY NAME *********************************************************************************** diff --git a/pagetop/src/core/theme/monster.rs b/pagetop/src/core/theme/basic.rs similarity index 59% rename from pagetop/src/core/theme/monster.rs rename to pagetop/src/core/theme/basic.rs index c90471db..0a2091b6 100644 --- a/pagetop/src/core/theme/monster.rs +++ b/pagetop/src/core/theme/basic.rs @@ -6,31 +6,31 @@ use crate::response::page::Page; use crate::service; use crate::{serve_static_files, use_handle, use_static, Handle}; -use_handle!(THEME_MONSTER); +use_handle!(THEME_BASIC); -use_static!(monster); +use_static!(theme); -pub struct Monster; +pub struct Basic; -impl ModuleTrait for Monster { +impl ModuleTrait for Basic { fn handle(&self) -> Handle { - THEME_MONSTER + THEME_BASIC } fn theme(&self) -> Option<ThemeStaticRef> { - Some(&Monster) + Some(&Basic) } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/monster", monster); + serve_static_files!(cfg, "/theme", theme); } } -impl ThemeTrait for Monster { +impl ThemeTrait for Basic { fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/monster/css/normalize.min.css").with_version("8.0.1"), + StyleSheet::at("/theme/css/normalize.min.css").with_version("8.0.1"), )); } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 2a6c7d09..cb347ef6 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -37,7 +37,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn after_prepare_body(&self, page: &mut Page) { if page.favicon().is_none() { - page.alter_favicon(Some(Favicon::new().with_icon("/monster/favicon.ico"))); + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); } } diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 43cd925f..06f70f16 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -155,35 +155,43 @@ macro_rules! use_locale { #[macro_export] macro_rules! use_static { ( $bundle:ident ) => { - mod static_bundle { - include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + $crate::paste! { + mod [<static_bundle_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } } }; ( $bundle:ident => $STATIC:ident ) => { - mod static_bundle { - include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + $crate::paste! { + mod [<static_bundle_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new([ + <static_bundle_ $bundle>]::$bundle + ); } - static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new(static_bundle::$bundle); }; } #[macro_export] macro_rules! serve_static_files { ( $cfg:ident, $path:expr, $bundle:ident ) => {{ - let static_files = &$crate::config::SETTINGS.dev.static_files; - if static_files.is_empty() { - $cfg.service($crate::service::ResourceFiles::new( - $path, - static_bundle::$bundle(), - )); - } else { - $cfg.service( - $crate::service::ActixFiles::new( + $crate::paste! { + let static_files = &$crate::config::SETTINGS.dev.static_files; + if static_files.is_empty() { + $cfg.service($crate::service::ResourceFiles::new( $path, - $crate::concat_string!(static_files, $path), - ) - .show_files_listing(), - ); + [<static_bundle_ $bundle>]::$bundle(), + )); + } else { + $cfg.service( + $crate::service::ActixFiles::new( + $path, + $crate::concat_string!(static_files, $path), + ) + .show_files_listing(), + ); + } } }}; } diff --git a/pagetop/static/monster/css/normalize.min.css b/pagetop/static/theme/css/normalize.min.css similarity index 100% rename from pagetop/static/monster/css/normalize.min.css rename to pagetop/static/theme/css/normalize.min.css diff --git a/pagetop/static/monster/favicon.ico b/pagetop/static/theme/favicon.ico similarity index 100% rename from pagetop/static/monster/favicon.ico rename to pagetop/static/theme/favicon.ico From 4b8082d8d9e8bea46fc7f39d2a75ec88132bc223 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 21:28:43 +0200 Subject: [PATCH 442/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Com?= =?UTF-8?q?mit=20messages=20in=20English=20from=20now=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/README.md | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/pagetop/README.md b/pagetop/README.md index 41ae4400..1d3859c5 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -1,23 +1,22 @@ -**PageTop** es un entorno de desarrollo basado en [Rust](https://www.rust-lang.org/es/) que reúne -algunos de los crates más estables y populares para crear soluciones web modulares, extensibles y -configurables. +**PageTop** is an opinionated [Rust](https://www.rust-lang.org) web development framework to build +secure, modular, and fast web Server-Side Rendering (SSR) solutions with ease. + +PageTop uses some of the most stable and popular Rust *crates* to provide modular, extensible, and +configurable features. -# 🚧 Advertencia +# 🚧 Warning -**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son -constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. +**PageTop** framework is currently in active development. The API is unstable and subject to +frequent changes. Production use is not recommended until version **0.1.0**. -# 📜 Licencia +# 📜 License -Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu -elección: +This project is licensed under either of the following licenses, at your option: -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). + * Apache License, Version 2.0, + ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0) -* Licencia MIT - ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). + * MIT License + ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT) From 4ba835a83ece81e8524a539dc4dd9b621479b516 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 21:29:31 +0200 Subject: [PATCH 443/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.43?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index f611deab..aa7a9f5e 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.42" +version = "0.0.43" edition = "2021" authors = [ From d2f1169011daa21ab6d405ee3d1d005281eb9cd6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 21:37:12 +0200 Subject: [PATCH 444/853] =?UTF-8?q?=F0=9F=94=96=20[minimal]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index 1ff48155..46e2c9e5 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 2817a410c8200d462e23c95ab1ce2ddefa6ecf23 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 21:41:59 +0200 Subject: [PATCH 445/853] =?UTF-8?q?=F0=9F=94=96=20[jquery]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index a25fc665..be136cab 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-jquery" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From 279b516cebf52c8b6c1be0adf8096581894948b2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 21:49:07 +0200 Subject: [PATCH 446/853] =?UTF-8?q?=F0=9F=94=96=20[megamenu]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index 3bef191e..d359420e 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 5cc182b3cde5f5cb93d60d21ccf11a6f099f1db1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 21:58:44 +0200 Subject: [PATCH 447/853] =?UTF-8?q?=F0=9F=94=96=20[aliner]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index e7b6839e..64c0ade8 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-aliner" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From 60535377e1509abbdbf20923bb2c44e2dcb552a0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 22:03:44 +0200 Subject: [PATCH 448/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 57fa14e2..3195c469 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 2c69093065630fc8dbf6fa82ce7f57fdd6f8555c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 22:10:40 +0200 Subject: [PATCH 449/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index c8e67f82..1ab7548e 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From 1c917f6f05de8b9ca96543ec8411e8de781b211d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 22:17:52 +0200 Subject: [PATCH 450/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 9406947a..af3c2db2 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From a731622887a6c1e599591e3f79aae593d41fd26e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 22:47:26 +0200 Subject: [PATCH 451/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20release=20deve?= =?UTF-8?q?lopment=20version=200.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index e58894d1..4a5a6226 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.11" +version = "0.0.12" edition = "2021" authors = [ From eee481cfcb677d756d643201cc48a0e3b7b6e184 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 13 Jul 2023 22:49:14 +0200 Subject: [PATCH 452/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 5a236704..183426e3 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.11" +version = "0.0.12" edition = "2021" authors = [ From 6df57a0c12e192096b959f59c3fb02ae55dad992 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 15 Jul 2023 11:34:28 +0200 Subject: [PATCH 453/853] =?UTF-8?q?=F0=9F=92=A5=20Better=20names=20for=20m?= =?UTF-8?q?ain=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- examples/basics/hello-name/src/main.rs | 2 +- examples/basics/hello-world/src/main.rs | 2 +- pagetop-admin/src/lib.rs | 8 +-- pagetop-admin/src/summary.rs | 4 +- pagetop-aliner/src/lib.rs | 4 +- pagetop-bootsier/src/lib.rs | 30 +++++----- pagetop-build/src/lib.rs | 4 +- pagetop-bulmix/src/lib.rs | 4 +- pagetop-homedemo/src/lib.rs | 60 ++++++++++--------- pagetop-jquery/src/lib.rs | 10 ++-- pagetop-megamenu/src/component.rs | 4 +- pagetop-megamenu/src/lib.rs | 4 +- pagetop-minimal/src/component/anchor.rs | 2 +- pagetop-minimal/src/component/block.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- .../src/component/form_element/button.rs | 2 +- .../src/component/form_element/date.rs | 2 +- .../src/component/form_element/form.rs | 2 +- .../src/component/form_element/hidden.rs | 2 +- .../src/component/form_element/input.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/icon.rs | 2 +- pagetop-minimal/src/component/image.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 2 +- pagetop-minimal/src/lib.rs | 4 +- pagetop-minimal/src/module/menu.rs | 8 +-- pagetop-node/src/lib.rs | 8 +-- pagetop-user/src/lib.rs | 21 ++++--- pagetop/src/core/component.rs | 4 +- pagetop/src/core/component/html.rs | 4 +- pagetop/src/core/component/l10n.rs | 4 +- pagetop/src/core/theme/basic.rs | 6 +- pagetop/src/core/theme/definition.rs | 12 ++-- pagetop/src/lib.rs | 4 +- pagetop/src/locale.rs | 8 +-- pagetop/src/prelude.rs | 3 +- pagetop/src/response/fatal_error/error403.rs | 4 +- pagetop/src/response/fatal_error/error404.rs | 4 +- .../page/action/after_prepare_body.rs | 4 +- .../page/action/before_prepare_body.rs | 4 +- pagetop/src/util.rs | 18 +++--- 44 files changed, 146 insertions(+), 140 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 63dcaccd..25c5ed88 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(APP_DRUST); +create_handle!(APP_DRUST); struct Drust; diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index c02f4865..cc0c8cd8 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(APP_HELLO_NAME); +create_handle!(APP_HELLO_NAME); struct HelloName; diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 0d1a8e15..14a1f5a7 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(APP_HELLO_WORLD); +create_handle!(APP_HELLO_WORLD); struct HelloWorld; diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index c6004a9c..52d6233d 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,8 +1,8 @@ use pagetop::prelude::*; -use_handle!(MODULE_ADMIN); +create_handle!(MODULE_ADMIN); -use_locale!(LOCALE_ADMIN); +static_locales!(LOCALES_ADMIN); mod summary; @@ -14,11 +14,11 @@ impl ModuleTrait for Admin { } fn name(&self) -> L10n { - L10n::t("module_name", &LOCALE_ADMIN) + L10n::t("module_name", &LOCALES_ADMIN) } fn description(&self) -> L10n { - L10n::t("module_description", &LOCALE_ADMIN) + L10n::t("module_description", &LOCALES_ADMIN) } #[rustfmt::skip] diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 8d90bcb6..4d097049 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,4 +1,4 @@ -use crate::LOCALE_ADMIN; +use crate::LOCALES_ADMIN; use pagetop::prelude::*; use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; @@ -6,7 +6,7 @@ use pagetop_minimal::component::*; pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALE_ADMIN))) + .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALES_ADMIN))) .with_item(MegaMenuItem::link( L10n::n("Opción 2"), "https://www.google.es", diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index f532eef1..92079cfd 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -1,8 +1,8 @@ use pagetop::prelude::*; -use_handle!(THEME_ALINER); +create_handle!(THEME_ALINER); -use_static!(aliner); +static_files!(aliner); pub struct Aliner; diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 338cc6cf..31dfd56e 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,11 +1,11 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; -use_handle!(THEME_BOOTSIER); +create_handle!(THEME_BOOTSIER); -use_locale!(LOCALE_BOOTSIER); +static_locales!(LOCALES_BOOTSIER); -use_static!(bootsier); +static_files!(bootsier); pub struct Bootsier; @@ -31,15 +31,15 @@ impl ThemeTrait for Bootsier { #[rustfmt::skip] fn regions(&self) -> Vec<(&'static str, L10n)> { vec![ - ("header", L10n::t("header", &LOCALE_BOOTSIER)), - ("nav_branding", L10n::t("nav_branding", &LOCALE_BOOTSIER)), - ("nav_main", L10n::t("nav_main", &LOCALE_BOOTSIER)), - ("nav_additional", L10n::t("nav_additional", &LOCALE_BOOTSIER)), - ("breadcrumb", L10n::t("breadcrumb", &LOCALE_BOOTSIER)), - ("content", L10n::t("breadcrumb", &LOCALE_BOOTSIER)), - ("sidebar_first", L10n::t("sidebar_first", &LOCALE_BOOTSIER)), - ("sidebar_second", L10n::t("sidebar_second", &LOCALE_BOOTSIER)), - ("footer", L10n::t("footer", &LOCALE_BOOTSIER)), + ("header", L10n::t("header", &LOCALES_BOOTSIER)), + ("nav_branding", L10n::t("nav_branding", &LOCALES_BOOTSIER)), + ("nav_main", L10n::t("nav_main", &LOCALES_BOOTSIER)), + ("nav_additional", L10n::t("nav_additional", &LOCALES_BOOTSIER)), + ("breadcrumb", L10n::t("breadcrumb", &LOCALES_BOOTSIER)), + ("content", L10n::t("breadcrumb", &LOCALES_BOOTSIER)), + ("sidebar_first", L10n::t("sidebar_first", &LOCALES_BOOTSIER)), + ("sidebar_second", L10n::t("sidebar_second", &LOCALES_BOOTSIER)), + ("footer", L10n::t("footer", &LOCALES_BOOTSIER)), ] } @@ -131,18 +131,18 @@ impl ThemeTrait for Bootsier { div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } p class="lead" { - (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(cx)) + (L10n::t("e404-description", &LOCALES_BOOTSIER).prepare(cx)) } hr class="my-4"; p { - (L10n::t("e404-description", &LOCALE_BOOTSIER).prepare(cx)) + (L10n::t("e404-description", &LOCALES_BOOTSIER).prepare(cx)) } a class="btn btn-primary btn-lg" href="/" role="button" { - (L10n::t("back-homepage", &LOCALE_BOOTSIER).prepare(cx)) + (L10n::t("back-homepage", &LOCALES_BOOTSIER).prepare(cx)) } } } diff --git a/pagetop-build/src/lib.rs b/pagetop-build/src/lib.rs index 5e877d82..8c53d241 100644 --- a/pagetop-build/src/lib.rs +++ b/pagetop-build/src/lib.rs @@ -59,7 +59,7 @@ //! ```rust#ignore //! use pagetop::prelude::*; //! -//! use_static!(guides); +//! static_files!(guides); //! ``` //! //! Also you can get the bundle as a static reference to the generated HashMap resources collection: @@ -67,7 +67,7 @@ //! ```rust#ignore //! use pagetop::prelude::*; //! -//! use_static!(guides => BUNDLE_GUIDES); +//! static_files!(guides => BUNDLE_GUIDES); //! ``` //! //! You can build more than one resources file to compile with your project. diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 9059ed56..9905b05d 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -2,9 +2,9 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; use pagetop_minimal::component::*; -use_handle!(THEME_BULMIX); +create_handle!(THEME_BULMIX); -use_static!(bulmix); +static_files!(bulmix); pub struct Bulmix; diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index f3cb304d..308d6873 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,11 +1,11 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -use_handle!(MODULE_HOMEDEMO); +create_handle!(MODULE_HOMEDEMO); -use_locale!(LOCALE_HOMEDEMO); +static_locales!(LOCALES_HOMEDEMO); -use_static!(homedemo); +static_files!(homedemo); pub struct HomeDemo; @@ -15,11 +15,11 @@ impl ModuleTrait for HomeDemo { } fn name(&self) -> L10n { - L10n::t("module_name", &LOCALE_HOMEDEMO) + L10n::t("module_name", &LOCALES_HOMEDEMO) } fn description(&self) -> L10n { - L10n::t("module_description", &LOCALE_HOMEDEMO) + L10n::t("module_description", &LOCALES_HOMEDEMO) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -34,7 +34,7 @@ impl ModuleTrait for HomeDemo { async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_title(L10n::t("page_title", &LOCALE_HOMEDEMO)) + .with_title(L10n::t("page_title", &LOCALES_HOMEDEMO)) .with_context(ContextOp::AddStyleSheet(StyleSheet::at( "/homedemo/css/styles.css", ))) @@ -55,11 +55,11 @@ fn hello_world() -> Container { .with_classes(ClassesOp::Add, "hello-col-text") .with_size(grid::ColumnSize::Is5of12) .with_component( - Heading::h1(L10n::t("page_title", &LOCALE_HOMEDEMO)) + Heading::h1(L10n::t("page_title", &LOCALES_HOMEDEMO)) .with_display(HeadingDisplay::Medium), ) .with_component( - Paragraph::with(L10n::e("hello_intro", &LOCALE_HOMEDEMO).with_arg( + Paragraph::with(L10n::e("hello_intro", &LOCALES_HOMEDEMO).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -69,7 +69,7 @@ fn hello_world() -> Container { .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with( - L10n::e("hello_powered", &LOCALE_HOMEDEMO).with_arg( + L10n::e("hello_powered", &LOCALES_HOMEDEMO).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -80,14 +80,14 @@ fn hello_world() -> Container { .with_component( Anchor::button( "https://github.com/manuelcillero/pagetop", - L10n::t("hello_code", &LOCALE_HOMEDEMO), + L10n::t("hello_code", &LOCALES_HOMEDEMO), ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link"), ) .with_component( - Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALE_HOMEDEMO)) + Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) .with_left_icon(Icon::with("arrow-down-circle-fill")) .with_classes(ClassesOp::Add, "welcome-link"), ), @@ -104,9 +104,9 @@ fn welcome() -> Container { Container::section() .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") - .with_component(Heading::h2(L10n::t("welcome_page", &LOCALE_HOMEDEMO))) + .with_component(Heading::h2(L10n::t("welcome_page", &LOCALES_HOMEDEMO))) .with_component( - Heading::h3(L10n::e("welcome_subtitle", &LOCALE_HOMEDEMO).with_arg( + Heading::h3(L10n::e("welcome_subtitle", &LOCALES_HOMEDEMO).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -116,10 +116,10 @@ fn welcome() -> Container { .with_display(HeadingDisplay::Subtitle), ) .with_component( - Paragraph::with(L10n::t("welcome_text1", &LOCALE_HOMEDEMO)) + Paragraph::with(L10n::t("welcome_text1", &LOCALES_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALE_HOMEDEMO))) + .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALES_HOMEDEMO))) } fn about_pagetop() -> Container { @@ -134,14 +134,14 @@ fn about_pagetop() -> Container { .with_column( grid::Column::new() .with_classes(ClassesOp::Add, "pagetop-col-text") - .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALE_HOMEDEMO))) + .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALES_HOMEDEMO))) .with_component( - Paragraph::with(L10n::t("pagetop_text1", &LOCALE_HOMEDEMO)) + Paragraph::with(L10n::t("pagetop_text1", &LOCALES_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALE_HOMEDEMO))) + .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALES_HOMEDEMO))) .with_component(Paragraph::with( - L10n::e("pagetop_text3", &LOCALE_HOMEDEMO) + L10n::e("pagetop_text3", &LOCALES_HOMEDEMO) .with_arg("href", "https://docs.rs/pagetop/latest/pagetop".to_string()), )), ), @@ -156,16 +156,18 @@ fn promo_pagetop() -> Container { .with_classes(ClassesOp::Add, "promo-col-text") .with_component(Heading::h2(L10n::t( "pagetop_promo_title", - &LOCALE_HOMEDEMO, + &LOCALES_HOMEDEMO, ))) .with_component( - Paragraph::with(L10n::e("pagetop_promo_text1", &LOCALE_HOMEDEMO).with_arg( - "pagetop", - format!( - "<a href=\"{}\" target=\"_blank\">{}</a>", - "https://crates.io/crates/pagetop", "PageTop", + Paragraph::with( + L10n::e("pagetop_promo_text1", &LOCALES_HOMEDEMO).with_arg( + "pagetop", + format!( + "<a href=\"{}\" target=\"_blank\">{}</a>", + "https://crates.io/crates/pagetop", "PageTop", + ), ), - )) + ) .with_display(ParagraphDisplay::Small), ), ) @@ -192,15 +194,15 @@ fn reporting_issues() -> Container { .with_size(grid::ColumnSize::Is6of12) .with_component(Heading::h2(L10n::t( "report_problems_title", - &LOCALE_HOMEDEMO, + &LOCALES_HOMEDEMO, ))) .with_component( - Paragraph::with(L10n::t("report_problems_text1", &LOCALE_HOMEDEMO)) + Paragraph::with(L10n::t("report_problems_text1", &LOCALES_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) .with_component(Paragraph::with(L10n::t( "report_problems_text2", - &LOCALE_HOMEDEMO, + &LOCALES_HOMEDEMO, ))), ), ) diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index dfbffacb..585a85a9 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -1,10 +1,10 @@ use pagetop::prelude::*; -use_handle!(MODULE_JQUERY); +create_handle!(MODULE_JQUERY); -use_locale!(LOCALE_JQUERY); +static_locales!(LOCALES_JQUERY); -use_static!(jquery); +static_files!(jquery); const PARAM_JQUERY: &str = "jquery.js"; @@ -16,11 +16,11 @@ impl ModuleTrait for JQuery { } fn name(&self) -> L10n { - L10n::t("module_name", &LOCALE_JQUERY) + L10n::t("module_name", &LOCALES_JQUERY) } fn description(&self) -> L10n { - L10n::t("module_description", &LOCALE_JQUERY) + L10n::t("module_description", &LOCALES_JQUERY) } fn actions(&self) -> Vec<Action> { diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 25d3dbd3..9112593a 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; -use_handle!(COMPONENT_MEGAMENUITEM); +create_handle!(COMPONENT_MEGAMENUITEM); type Label = OneComponent<L10n>; type Content = OneComponent<L10n>; @@ -144,7 +144,7 @@ impl MegaMenuItem { // MegaMenu. -use_handle!(COMPONENT_MEGAMENU); +create_handle!(COMPONENT_MEGAMENU); actions_for_component!(MegaMenu); diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index bf77e59c..b1bd6593 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -2,9 +2,9 @@ use pagetop::prelude::*; pub mod component; -use_handle!(MODULE_MEGAMENU); +create_handle!(MODULE_MEGAMENU); -use_static!(megamenu); +static_files!(megamenu); pub struct MegaMenu; diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 07254ec5..0d041e21 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::Icon; -use_handle!(COMPONENT_ANCHOR); +create_handle!(COMPONENT_ANCHOR); #[derive(Default)] pub enum AnchorType { diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 4770a03b..956f64bf 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_BLOCK); +create_handle!(COMPONENT_BLOCK); actions_for_component!(Block); diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 2a24de4c..cdd98932 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_CONTAINER); +create_handle!(COMPONENT_CONTAINER); actions_for_component!(Container); diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index 358391d3..d2977c84 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_BUTTON); +create_handle!(COMPONENT_BUTTON); #[derive(Default)] pub enum ButtonType { diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index faba0fcc..2b097088 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_DATE); +create_handle!(COMPONENT_DATE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 1d20370e..a4299fa1 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_FORM); +create_handle!(COMPONENT_FORM); actions_for_component!(Form); diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index e1b88cf8..c982e77e 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_HIDDEN); +create_handle!(COMPONENT_HIDDEN); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index c2f49a4c..057048f4 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_INPUT); +create_handle!(COMPONENT_INPUT); #[derive(Default)] pub enum InputType { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 56b96043..b872ccfa 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_COLUMN); +create_handle!(COMPONENT_COLUMN); actions_for_component!(Column); diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 80112733..ce9def7a 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::grid; -use_handle!(COMPONENT_ROW); +create_handle!(COMPONENT_ROW); actions_for_component!(Row); diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index ca8280f2..4aeab75b 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_HEADING); +create_handle!(COMPONENT_HEADING); #[derive(Default)] pub enum HeadingType { diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index ca2115c3..f6b162c0 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_ICON); +create_handle!(COMPONENT_ICON); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index 0496bfb1..bd1287c5 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_IMAGE); +create_handle!(COMPONENT_IMAGE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 25211a08..78f98687 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use_handle!(COMPONENT_PARAGRAPH); +create_handle!(COMPONENT_PARAGRAPH); #[derive(Default)] pub enum ParagraphDisplay { diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 19604281..b0d14ac3 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -3,9 +3,9 @@ use pagetop::prelude::*; pub mod component; pub mod module; -use_handle!(MODULE_MINIMAL); +create_handle!(MODULE_MINIMAL); -use_static!(minimal); +static_files!(minimal); pub struct Minimal; diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs index 27107fee..49ed13d7 100644 --- a/pagetop-minimal/src/module/menu.rs +++ b/pagetop-minimal/src/module/menu.rs @@ -1,8 +1,8 @@ use pagetop::prelude::*; -use_handle!(MODULE_MENU); +create_handle!(MODULE_MENU); -use_locale!(LOCALE_MENU in "src/module/menu/locales"); +static_locales!(LOCALES_MENU in "src/module/menu/locales"); pub struct Menu; @@ -12,10 +12,10 @@ impl ModuleTrait for Menu { } fn name(&self) -> L10n { - L10n::t("module_name", &LOCALE_MENU) + L10n::t("module_name", &LOCALES_MENU) } fn description(&self) -> L10n { - L10n::t("module_description", &LOCALE_MENU) + L10n::t("module_description", &LOCALES_MENU) } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index d9490c48..ffe40c72 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,8 +1,8 @@ use pagetop::prelude::*; -use_handle!(MODULE_NODE); +create_handle!(MODULE_NODE); -use_locale!(LOCALE_NODE); +static_locales!(LOCALES_NODE); //mod entity; mod migration; @@ -15,11 +15,11 @@ impl ModuleTrait for Node { } fn name(&self) -> L10n { - L10n::t("module_name", &LOCALE_NODE) + L10n::t("module_name", &LOCALES_NODE) } fn description(&self) -> L10n { - L10n::t("module_description", &LOCALE_NODE) + L10n::t("module_description", &LOCALES_NODE) } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 9dfb312c..3b45b3a5 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,9 +1,9 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -use_handle!(MODULE_USER); +create_handle!(MODULE_USER); -use_locale!(LOCALE_USER); +static_locales!(LOCALES_USER); mod migration; @@ -15,11 +15,11 @@ impl ModuleTrait for User { } fn name(&self) -> L10n { - L10n::t("module_name", &LOCALE_USER) + L10n::t("module_name", &LOCALES_USER) } fn description(&self) -> L10n { - L10n::t("module_description", &LOCALE_USER) + L10n::t("module_description", &LOCALES_USER) } fn dependencies(&self) -> Vec<ModuleStaticRef> { @@ -58,9 +58,9 @@ fn form_login() -> Form { .with_element( form_element::Input::textfield() .with_name("name") - .with_label(L10n::t("username", &LOCALE_USER)) + .with_label(L10n::t("username", &LOCALES_USER)) .with_help_text( - L10n::t("username_help", &LOCALE_USER) + L10n::t("username_help", &LOCALES_USER) .with_arg("app", config::SETTINGS.app.name.to_owned()), ) .with_autofocus(true), @@ -68,8 +68,11 @@ fn form_login() -> Form { .with_element( form_element::Input::password() .with_name("pass") - .with_label(L10n::t("password", &LOCALE_USER)) - .with_help_text(L10n::t("password_help", &LOCALE_USER)), + .with_label(L10n::t("password", &LOCALES_USER)) + .with_help_text(L10n::t("password_help", &LOCALES_USER)), ) - .with_element(form_element::Button::submit(L10n::t("login", &LOCALE_USER))) + .with_element(form_element::Button::submit(L10n::t( + "login", + &LOCALES_USER, + ))) } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 8247485b..9e0ce62e 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -28,7 +28,7 @@ macro_rules! actions_for_component { // ACTION BEFORE PREPARE COMPONENT // ************************************************************************************* - $crate::use_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); + $crate::create_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); pub struct [<BeforePrepare $Component>] { action: Option<[<Action $Component>]>, @@ -87,7 +87,7 @@ macro_rules! actions_for_component { // ACTION AFTER PREPARE COMPONENT // ************************************************************************************* - $crate::use_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); + $crate::create_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); pub struct [<AfterPrepare $Component>] { action: Option<[<Action $Component>]>, diff --git a/pagetop/src/core/component/html.rs b/pagetop/src/core/component/html.rs index b0af5bc8..8cf0d5a3 100644 --- a/pagetop/src/core/component/html.rs +++ b/pagetop/src/core/component/html.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup, PrepareMarkup}; -use crate::{fn_builder, use_handle, Handle}; +use crate::{create_handle, fn_builder, Handle}; -use_handle!(COMPONENT_HTML); +create_handle!(COMPONENT_HTML); #[derive(Default)] pub struct Html(Markup); diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs index 1ef93642..5829c943 100644 --- a/pagetop/src/core/component/l10n.rs +++ b/pagetop/src/core/component/l10n.rs @@ -1,11 +1,11 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PreEscaped, PrepareMarkup}; use crate::locale::{Loader, Locales}; -use crate::{fn_builder, use_handle, Handle}; +use crate::{create_handle, fn_builder, Handle}; use std::collections::HashMap; -use_handle!(COMPONENT_L10N); +create_handle!(COMPONENT_L10N); #[derive(Default)] pub enum L10nOp { diff --git a/pagetop/src/core/theme/basic.rs b/pagetop/src/core/theme/basic.rs index 0a2091b6..7c196eae 100644 --- a/pagetop/src/core/theme/basic.rs +++ b/pagetop/src/core/theme/basic.rs @@ -4,11 +4,11 @@ use crate::core::theme::{ThemeStaticRef, ThemeTrait}; use crate::html::{Favicon, StyleSheet}; use crate::response::page::Page; use crate::service; -use crate::{serve_static_files, use_handle, use_static, Handle}; +use crate::{create_handle, serve_static_files, static_files, Handle}; -use_handle!(THEME_BASIC); +create_handle!(THEME_BASIC); -use_static!(theme); +static_files!(theme); pub struct Basic; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index cb347ef6..1e54e16a 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -3,7 +3,7 @@ use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; -use crate::{config, LOCALE_PAGETOP}; +use crate::{config, LOCALES_PAGETOP}; pub type ThemeStaticRef = &'static dyn ThemeTrait; @@ -12,11 +12,11 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { #[rustfmt::skip] fn regions(&self) -> Vec<(&'static str, L10n)> { vec![ - ("header", L10n::t("header", &LOCALE_PAGETOP)), - ("pagetop", L10n::t("pagetop", &LOCALE_PAGETOP)), - ("content", L10n::t("content", &LOCALE_PAGETOP)), - ("sidebar", L10n::t("sidebar", &LOCALE_PAGETOP)), - ("footer", L10n::t("footer", &LOCALE_PAGETOP)), + ("header", L10n::t("header", &LOCALES_PAGETOP)), + ("pagetop", L10n::t("pagetop", &LOCALES_PAGETOP)), + ("content", L10n::t("content", &LOCALES_PAGETOP)), + ("sidebar", L10n::t("sidebar", &LOCALES_PAGETOP)), + ("footer", L10n::t("footer", &LOCALES_PAGETOP)), ] } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 2fd99261..a82ef463 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -42,7 +42,7 @@ //! ```rust //! use pagetop::prelude::*; //! -//! use_handle!(APP_HELLO_WORLD); +//! create_handle!(APP_HELLO_WORLD); //! //! struct HelloWorld; //! @@ -116,7 +116,7 @@ pub type HashMapResources = std::collections::HashMap<&'static str, StaticResour pub type Handle = u64; -use_locale!(LOCALE_PAGETOP); +static_locales!(LOCALES_PAGETOP); // ************************************************************************************************* // APIs PÚBLICAS. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 6e8ee8a8..1490e11e 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -70,13 +70,13 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL usa la macro -//! [`use_locale!`](crate::use_locale) para integrarlos en tu módulo o aplicación. Si tus recursos -//! se encuentran en el directorio `"src/locale"` bastará con declarar: +//! [`static_locales!`](crate::static_locales) para integrarlos en tu módulo o aplicación. Si tus +//! recursos se encuentran en el directorio `"src/locale"` bastará con declarar: //! //! ``` //! use pagetop::prelude::*; //! -//! use_locale!(LOCALE_SAMPLE); +//! static_locales!(LOCALES_SAMPLE); //! ``` //! //! Y si están en otro directorio, entonces puedes usar: @@ -84,7 +84,7 @@ //! ``` //! use pagetop::prelude::*; //! -//! use_locale!(LOCALE_SAMPLE in "path/to/locale"); +//! static_locales!(LOCALES_SAMPLE in "path/to/locale"); //! ``` //! //! Usa el componente [L10n](crate::core::component::l10n::L10n) para incluir textos y contenidos diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index b6bd2924..a3fd2241 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -8,7 +8,8 @@ pub use crate::{ // Funciones y macros útiles. pub use crate::util; pub use crate::{action, actions_for_component}; -pub use crate::{default_settings, kv, serve_static_files, use_handle, use_locale, use_static}; +pub use crate::{create_handle, default_settings, kv}; +pub use crate::{serve_static_files, static_files, static_locales}; // ************************************************************************************************* diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index a3eb8c75..376234c2 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::{use_handle, Handle}; +use crate::{create_handle, Handle}; -use_handle!(ERROR_403); +create_handle!(ERROR_403); pub struct Error403; diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index 40acf80d..c9c9051d 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::{use_handle, Handle}; +use crate::{create_handle, Handle}; -use_handle!(ERROR_404); +create_handle!(ERROR_404); pub struct Error404; diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/response/page/action/after_prepare_body.rs index f745e4fa..941d6f52 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -1,9 +1,9 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; -use crate::{use_handle, Handle}; +use crate::{create_handle, Handle}; -use_handle!(ACTION_AFTER_PREPARE_BODY for Action); +create_handle!(ACTION_AFTER_PREPARE_BODY for Action); pub struct ActionAfterPrepareBody { action: Option<ActionPage>, diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/response/page/action/before_prepare_body.rs index ef1d938d..8971e51a 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -1,9 +1,9 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; -use crate::{use_handle, Handle}; +use crate::{create_handle, Handle}; -use_handle!(ACTION_BEFORE_PREPARE_BODY for Action); +create_handle!(ACTION_BEFORE_PREPARE_BODY for Action); pub struct ActionBeforePrepareBody { action: Option<ActionPage>, diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 06f70f16..e2c47536 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -89,8 +89,8 @@ macro_rules! kv { macro_rules! default_settings { ( $($key:literal => $value:literal),* $(,)? ) => { #[doc = concat!( - "Assigned or predefined values for configuration settings associated with the ", - "[`Settings`] structure." + "Assigned or predefined values for configuration settings associated to the ", + "[`Settings`] type." )] pub static SETTINGS: $crate::LazyStatic<Settings> = $crate::LazyStatic::new(|| { let mut settings = $crate::config::CONFIG.clone(); @@ -106,7 +106,7 @@ macro_rules! default_settings { } #[macro_export] -macro_rules! use_handle { +macro_rules! create_handle { ( $HANDLE:ident ) => { /// Public constant handle to represent a unique PageTop building element. pub const $HANDLE: $crate::Handle = @@ -121,7 +121,7 @@ macro_rules! use_handle { #[macro_export] /// Define un conjunto de elementos de localización y funciones locales de traducción. -macro_rules! use_locale { +macro_rules! static_locales { ( $LOCALES:ident $(, $core_locales:literal)? ) => { use $crate::locale::*; @@ -153,21 +153,21 @@ macro_rules! use_locale { } #[macro_export] -macro_rules! use_static { +macro_rules! static_files { ( $bundle:ident ) => { $crate::paste! { - mod [<static_bundle_ $bundle>] { + mod [<static_files_ $bundle>] { include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); } } }; ( $bundle:ident => $STATIC:ident ) => { $crate::paste! { - mod [<static_bundle_ $bundle>] { + mod [<static_files_ $bundle>] { include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); } static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new([ - <static_bundle_ $bundle>]::$bundle + <static_files_ $bundle>]::$bundle ); } }; @@ -181,7 +181,7 @@ macro_rules! serve_static_files { if static_files.is_empty() { $cfg.service($crate::service::ResourceFiles::new( $path, - [<static_bundle_ $bundle>]::$bundle(), + [<static_files_ $bundle>]::$bundle(), )); } else { $cfg.service( From 941b7ae57b8a1586e3e95bf5a0c84f8e8c348808 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 16 Jul 2023 07:45:09 +0200 Subject: [PATCH 454/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20Introduce=20Wei?= =?UTF-8?q?ght=20type=20for=20element=20weights?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/src/lib.rs | 2 +- pagetop-megamenu/src/component.rs | 16 ++++++++-------- pagetop-minimal/src/component/anchor.rs | 8 ++++---- pagetop-minimal/src/component/block.rs | 8 ++++---- pagetop-minimal/src/component/container.rs | 8 ++++---- .../src/component/form_element/button.rs | 8 ++++---- .../src/component/form_element/date.rs | 8 ++++---- .../src/component/form_element/form.rs | 8 ++++---- .../src/component/form_element/hidden.rs | 8 ++++---- .../src/component/form_element/input.rs | 8 ++++---- pagetop-minimal/src/component/grid/column.rs | 8 ++++---- pagetop-minimal/src/component/grid/row.rs | 8 ++++---- pagetop-minimal/src/component/heading.rs | 8 ++++---- pagetop-minimal/src/component/icon.rs | 8 ++++---- pagetop-minimal/src/component/image.rs | 8 ++++---- pagetop-minimal/src/component/paragraph.rs | 8 ++++---- pagetop/src/core/action/definition.rs | 4 ++-- pagetop/src/core/component.rs | 16 ++++++++-------- pagetop/src/core/component/definition.rs | 4 ++-- pagetop/src/core/theme/basic.rs | 4 +++- pagetop/src/html/assets.rs | 3 ++- pagetop/src/html/assets/headscript.rs | 9 +++++---- pagetop/src/html/assets/headstyles.rs | 9 +++++---- pagetop/src/html/assets/javascript.rs | 9 +++++---- pagetop/src/html/assets/stylesheet.rs | 9 +++++---- pagetop/src/prelude.rs | 11 ++++++----- .../response/page/action/after_prepare_body.rs | 10 +++++----- .../response/page/action/before_prepare_body.rs | 10 +++++----- 28 files changed, 118 insertions(+), 110 deletions(-) diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 585a85a9..86e3c3d1 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -49,7 +49,7 @@ fn after_prepare_body(page: &mut Page) { page.context().alter(ContextOp::AddJavaScript( JavaScript::at("/jquery/jquery.min.js") .with_version("3.6.0") - .with_weight(isize::MIN) + .with_weight(-99) .with_mode(ModeJS::Normal), )); } diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 9112593a..129b5f7f 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -23,7 +23,7 @@ pub enum MegaMenuItemType { #[rustfmt::skip] #[derive(Default)] pub struct MegaMenuItem { - weight : isize, + weight : Weight, renderable: Renderable, item_type : MegaMenuItemType, } @@ -37,7 +37,7 @@ impl ComponentTrait for MegaMenuItem { COMPONENT_MEGAMENUITEM } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -124,8 +124,8 @@ impl MegaMenuItem { // MegaMenuItem BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } @@ -151,7 +151,7 @@ actions_for_component!(MegaMenu); #[rustfmt::skip] #[derive(Default)] pub struct MegaMenu { - weight : isize, + weight : Weight, renderable: Renderable, id : IdentifierValue, classes : Classes, @@ -172,7 +172,7 @@ impl ComponentTrait for MegaMenu { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -220,8 +220,8 @@ impl MegaMenu { // MegaMenu BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 0d041e21..b09b3e77 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -28,7 +28,7 @@ type AnchorHtml = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] pub struct Anchor { - weight : isize, + weight : Weight, renderable : Renderable, id : IdentifierValue, classes : Classes, @@ -54,7 +54,7 @@ impl ComponentTrait for Anchor { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -105,8 +105,8 @@ impl Anchor { // Anchor BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 956f64bf..f0e9264e 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -7,7 +7,7 @@ actions_for_component!(Block); #[rustfmt::skip] #[derive(Default)] pub struct Block { - weight : isize, + weight : Weight, renderable: Renderable, id : IdentifierValue, classes : Classes, @@ -29,7 +29,7 @@ impl ComponentTrait for Block { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -70,8 +70,8 @@ impl Block { } #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index cdd98932..7bea787a 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -17,7 +17,7 @@ pub enum ContainerType { #[rustfmt::skip] #[derive(Default)] pub struct Container { - weight : isize, + weight : Weight, renderable : Renderable, id : IdentifierValue, classes : Classes, @@ -42,7 +42,7 @@ impl ComponentTrait for Container { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -125,8 +125,8 @@ impl Container { // Container BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index d2977c84..df0130fe 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -15,7 +15,7 @@ type ButtonValue = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] pub struct Button { - weight : isize, + weight : Weight, renderable : Renderable, classes : Classes, button_type: ButtonType, @@ -37,7 +37,7 @@ impl ComponentTrait for Button { COMPONENT_BUTTON } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -93,8 +93,8 @@ impl Button { // Button BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 2b097088..81e928fb 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -5,7 +5,7 @@ create_handle!(COMPONENT_DATE); #[rustfmt::skip] #[derive(Default)] pub struct Date { - weight : isize, + weight : Weight, renderable : Renderable, classes : Classes, name : AttributeValue, @@ -32,7 +32,7 @@ impl ComponentTrait for Date { COMPONENT_DATE } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -78,8 +78,8 @@ impl Date { // Date BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index a4299fa1..151c1180 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -14,7 +14,7 @@ pub enum FormMethod { #[rustfmt::skip] #[derive(Default)] pub struct Form { - weight : isize, + weight : Weight, renderable: Renderable, id : IdentifierValue, classes : Classes, @@ -40,7 +40,7 @@ impl ComponentTrait for Form { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -79,8 +79,8 @@ impl Form { // Form BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index c982e77e..925f143c 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -5,7 +5,7 @@ create_handle!(COMPONENT_HIDDEN); #[rustfmt::skip] #[derive(Default)] pub struct Hidden { - weight: isize, + weight: Weight, name : NameValue, value : AttributeValue, } @@ -19,7 +19,7 @@ impl ComponentTrait for Hidden { COMPONENT_HIDDEN } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -39,8 +39,8 @@ impl Hidden { // Hidden BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 057048f4..af6ab03b 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -19,7 +19,7 @@ type InputHelpText = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] pub struct Input { - weight : isize, + weight : Weight, renderable : Renderable, classes : Classes, input_type : InputType, @@ -52,7 +52,7 @@ impl ComponentTrait for Input { COMPONENT_INPUT } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -166,8 +166,8 @@ impl Input { // Input BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index b872ccfa..8dd38a25 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -39,7 +39,7 @@ pub enum ColumnSize { #[rustfmt::skip] #[derive(Default)] pub struct Column { - weight : isize, + weight : Weight, renderable: Renderable, id : IdentifierValue, classes : Classes, @@ -61,7 +61,7 @@ impl ComponentTrait for Column { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -90,8 +90,8 @@ impl Column { // Column BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index ce9def7a..179c52e6 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -9,7 +9,7 @@ actions_for_component!(Row); #[rustfmt::skip] #[derive(Default)] pub struct Row { - weight : isize, + weight : Weight, renderable: Renderable, id : IdentifierValue, classes : Classes, @@ -30,7 +30,7 @@ impl ComponentTrait for Row { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -59,8 +59,8 @@ impl Row { // Row BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 4aeab75b..8e4de53f 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -30,7 +30,7 @@ type HeadingText = OneComponent<L10n>; #[rustfmt::skip] #[derive(Default)] pub struct Heading { - weight : isize, + weight : Weight, renderable : Renderable, id : IdentifierValue, classes : Classes, @@ -53,7 +53,7 @@ impl ComponentTrait for Heading { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -115,8 +115,8 @@ impl Heading { // Heading BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index f6b162c0..2a77b600 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -5,7 +5,7 @@ create_handle!(COMPONENT_ICON); #[rustfmt::skip] #[derive(Default)] pub struct Icon { - weight : isize, + weight : Weight, renderable: Renderable, icon_name : String, classes : Classes, @@ -20,7 +20,7 @@ impl ComponentTrait for Icon { COMPONENT_ICON } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -47,8 +47,8 @@ impl Icon { // Icon BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index bd1287c5..72d7b351 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -5,7 +5,7 @@ create_handle!(COMPONENT_IMAGE); #[rustfmt::skip] #[derive(Default)] pub struct Image { - weight : isize, + weight : Weight, renderable: Renderable, id : IdentifierValue, classes : Classes, @@ -26,7 +26,7 @@ impl ComponentTrait for Image { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -52,8 +52,8 @@ impl Image { // Image BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 78f98687..0043689d 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -16,7 +16,7 @@ pub enum ParagraphDisplay { #[rustfmt::skip] #[derive(Default)] pub struct Paragraph { - weight : isize, + weight : Weight, renderable: Renderable, id : IdentifierValue, classes : Classes, @@ -38,7 +38,7 @@ impl ComponentTrait for Paragraph { self.id.get() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -66,8 +66,8 @@ impl Paragraph { // Paragraph BUILDER. #[fn_builder] - pub fn alter_weight(&mut self, weight: isize) -> &mut Self { - self.weight = weight; + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; self } diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs index 0611879c..b302c797 100644 --- a/pagetop/src/core/action/definition.rs +++ b/pagetop/src/core/action/definition.rs @@ -1,4 +1,4 @@ -use crate::Handle; +use crate::{Handle, Weight}; use std::any::Any; @@ -13,7 +13,7 @@ pub trait ActionTrait: BaseAction + Send + Sync { fn handle(&self) -> Handle; - fn weight(&self) -> isize { + fn weight(&self) -> Weight { 0 } } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 9e0ce62e..e479590f 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -32,7 +32,7 @@ macro_rules! actions_for_component { pub struct [<BeforePrepare $Component>] { action: Option<[<Action $Component>]>, - weight: isize, + weight: Weight, } impl ActionTrait for [<BeforePrepare $Component>] { @@ -47,7 +47,7 @@ macro_rules! actions_for_component { [<ACTION_BEFORE_PREPARE_ $Component:upper>] } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } } @@ -60,8 +60,8 @@ macro_rules! actions_for_component { } #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } @@ -91,7 +91,7 @@ macro_rules! actions_for_component { pub struct [<AfterPrepare $Component>] { action: Option<[<Action $Component>]>, - weight: isize, + weight: Weight, } impl ActionTrait for [<AfterPrepare $Component>] { @@ -106,7 +106,7 @@ macro_rules! actions_for_component { [<ACTION_AFTER_PREPARE_ $Component:upper>] } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } } @@ -119,8 +119,8 @@ macro_rules! actions_for_component { } #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index a431dc37..426ef76d 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,6 +1,6 @@ use crate::core::component::Context; use crate::html::{html, Markup, PrepareMarkup}; -use crate::{util, Handle}; +use crate::{util, Handle, Weight}; use std::any::Any; @@ -31,7 +31,7 @@ pub trait ComponentTrait: BaseComponent + Send + Sync { None } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { 0 } diff --git a/pagetop/src/core/theme/basic.rs b/pagetop/src/core/theme/basic.rs index 7c196eae..2a581bec 100644 --- a/pagetop/src/core/theme/basic.rs +++ b/pagetop/src/core/theme/basic.rs @@ -30,7 +30,9 @@ impl ThemeTrait for Basic { fn before_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/normalize.min.css").with_version("8.0.1"), + StyleSheet::at("/theme/css/normalize.min.css") + .with_version("8.0.1") + .with_weight(-99), )); } } diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 2006dae7..92e91d9f 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -4,11 +4,12 @@ pub mod javascript; pub mod stylesheet; use crate::html::{html, Markup}; +use crate::Weight; pub trait AssetsTrait { fn path(&self) -> &str; - fn weight(&self) -> isize; + fn weight(&self) -> Weight; fn prepare(&self) -> Markup; } diff --git a/pagetop/src/html/assets/headscript.rs b/pagetop/src/html/assets/headscript.rs index ac384fbb..2cea8186 100644 --- a/pagetop/src/html/assets/headscript.rs +++ b/pagetop/src/html/assets/headscript.rs @@ -1,12 +1,13 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; +use crate::Weight; #[rustfmt::skip] #[derive(Default)] pub struct HeadScript { path : String, code : String, - weight: isize, + weight: Weight, } impl AssetsTrait for HeadScript { @@ -14,7 +15,7 @@ impl AssetsTrait for HeadScript { self.path.as_str() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -39,8 +40,8 @@ impl HeadScript { self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } } diff --git a/pagetop/src/html/assets/headstyles.rs b/pagetop/src/html/assets/headstyles.rs index 5996eb05..9608d666 100644 --- a/pagetop/src/html/assets/headstyles.rs +++ b/pagetop/src/html/assets/headstyles.rs @@ -1,12 +1,13 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; +use crate::Weight; #[rustfmt::skip] #[derive(Default)] pub struct HeadStyles { path : String, styles: String, - weight: isize, + weight: Weight, } impl AssetsTrait for HeadStyles { @@ -14,7 +15,7 @@ impl AssetsTrait for HeadStyles { self.path.as_str() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -39,8 +40,8 @@ impl HeadStyles { self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } } diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index f1242c47..e69a1ae1 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,5 +1,6 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; +use crate::Weight; #[derive(Default, Eq, PartialEq)] pub enum ModeJS { @@ -15,7 +16,7 @@ pub struct JavaScript { path : String, prefix : &'static str, version: &'static str, - weight : isize, + weight : Weight, mode : ModeJS, } @@ -24,7 +25,7 @@ impl AssetsTrait for JavaScript { self.path.as_str() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -59,8 +60,8 @@ impl JavaScript { self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 2acc0d5d..2cc53a1e 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,5 +1,6 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; +use crate::Weight; pub enum TargetMedia { Default, @@ -15,7 +16,7 @@ pub struct StyleSheet { prefix : &'static str, version: &'static str, media : Option<&'static str>, - weight : isize, + weight : Weight, } impl AssetsTrait for StyleSheet { @@ -23,7 +24,7 @@ impl AssetsTrait for StyleSheet { self.path.as_str() } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } @@ -57,8 +58,8 @@ impl StyleSheet { self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index a3fd2241..a51eb062 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,9 +1,10 @@ //! The PageTop Prelude. -// Re-exports. -pub use crate::{ - concat_string, fn_builder, paste, Handle, HashMapResources, LazyStatic, ResultExt, -}; +// Re-exported macros. +pub use crate::{concat_string, fn_builder, paste}; + +// Global. +pub use crate::{Handle, HashMapResources, LazyStatic, ResultExt, Weight}; // Funciones y macros útiles. pub use crate::util; @@ -11,7 +12,7 @@ pub use crate::{action, actions_for_component}; pub use crate::{create_handle, default_settings, kv}; pub use crate::{serve_static_files, static_files, static_locales}; -// ************************************************************************************************* +// API. pub use crate::config; diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/response/page/action/after_prepare_body.rs index 941d6f52..719d7752 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -1,13 +1,13 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; -use crate::{create_handle, Handle}; +use crate::{create_handle, Handle, Weight}; create_handle!(ACTION_AFTER_PREPARE_BODY for Action); pub struct ActionAfterPrepareBody { action: Option<ActionPage>, - weight: isize, + weight: Weight, } impl ActionTrait for ActionAfterPrepareBody { @@ -22,7 +22,7 @@ impl ActionTrait for ActionAfterPrepareBody { ACTION_AFTER_PREPARE_BODY } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } } @@ -33,8 +33,8 @@ impl ActionAfterPrepareBody { self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/response/page/action/before_prepare_body.rs index 8971e51a..0c8d7907 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -1,13 +1,13 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; -use crate::{create_handle, Handle}; +use crate::{create_handle, Handle, Weight}; create_handle!(ACTION_BEFORE_PREPARE_BODY for Action); pub struct ActionBeforePrepareBody { action: Option<ActionPage>, - weight: isize, + weight: Weight, } impl ActionTrait for ActionBeforePrepareBody { @@ -22,7 +22,7 @@ impl ActionTrait for ActionBeforePrepareBody { ACTION_BEFORE_PREPARE_BODY } - fn weight(&self) -> isize { + fn weight(&self) -> Weight { self.weight } } @@ -33,8 +33,8 @@ impl ActionBeforePrepareBody { self } - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; self } From fefb3ed24940c85b50a39b8ce2db01cc75ea1422 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 16 Jul 2023 08:44:33 +0200 Subject: [PATCH 455/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Integrate=20future?= =?UTF-8?q?s=20library=20with=20the=20database?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 8 +++++--- pagetop/src/core/module/all.rs | 2 +- pagetop/src/db.rs | 4 +++- pagetop/src/lib.rs | 24 ++++++++++++++---------- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index aa7a9f5e..ad62a28b 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -27,7 +27,7 @@ name = "pagetop" [features] default = [] -database = ["sea-orm", "sea-schema"] +database = ["futures", "sea-orm", "sea-schema"] mysql = ["database", "sea-orm/sqlx-mysql"] postgres = ["database", "sea-orm/sqlx-postgres"] sqlite = ["database", "sea-orm/sqlx-sqlite"] @@ -37,8 +37,6 @@ async-trait = "0.1.68" concat-string = "1.0.1" figlet-rs = "0.1.5" itoa = "1.0.6" -futures = "0.3.28" -futures-util = "0.3.28" nom = "7.1.3" once_cell = "1.17.2" paste = "1.0.12" @@ -67,6 +65,10 @@ pagetop-macros = { version = "0.0", path = "../pagetop-macros" } serde = { version = "1.0", features = ["derive"] } +[dependencies.futures] +version = "0.3.28" +optional = true + [dependencies.sea-orm] version = "0.11.3" features = ["debug-print", "macros", "runtime-async-std-native-tls"] diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 6575b3a9..e5bbcabb 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -4,7 +4,7 @@ use crate::core::theme::all::THEMES; use crate::{service, trace, LazyStatic}; #[cfg(feature = "database")] -use crate::{db::*, run_now}; +use crate::{db::*}; use std::sync::RwLock; diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index c94c73ad..701cb4fc 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,6 +1,6 @@ //! Acceso unificado y normalizado a base de datos. -use crate::{config, run_now, trace, LazyStatic, ResultExt}; +use crate::{config, trace, LazyStatic, ResultExt}; pub use url::Url as DbUri; @@ -8,6 +8,8 @@ pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; +pub(crate) use futures::executor::block_on as run_now; + pub(crate) static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index a82ef463..8557aaee 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -98,28 +98,32 @@ //! PageTop a estructurar e inicializar modularmente la aplicación. // ************************************************************************************************* -// GLOBAL. +// RE-EXPORTED MACROS. // ************************************************************************************************* pub use concat_string::concat_string; -pub use once_cell::sync::Lazy as LazyStatic; -pub use paste::paste; -pub use static_files::Resource as StaticResource; -pub use tracing_unwrap::ResultExt; -#[allow(unused_imports)] -pub(crate) use futures::executor::block_on as run_now; +/// Enables flexible identifier concatenation in macros, allowing new items with pasted identifiers. +pub use paste::paste; pub use pagetop_macros::fn_builder; -pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; +// ************************************************************************************************* +// GLOBAL. +// ************************************************************************************************* + +pub use once_cell::sync::Lazy as LazyStatic; +pub use static_files::Resource as StaticResource; +pub use tracing_unwrap::ResultExt; pub type Handle = u64; +pub type Weight = i8; +pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; static_locales!(LOCALES_PAGETOP); // ************************************************************************************************* -// APIs PÚBLICAS. +// PUBLIC API. // ************************************************************************************************* // Gestión de la configuración. @@ -151,7 +155,7 @@ pub mod util; pub mod app; // ************************************************************************************************* -// RE-EXPORTA API ÚNICA. +// The PageTop Prelude. // ************************************************************************************************* pub mod prelude; From c123c3a7805bf1125ab3936168324aaa7b35b810 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 17 Jul 2023 19:50:55 +0200 Subject: [PATCH 456/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20Improve=20ergon?= =?UTF-8?q?omic=20use=20of=20Into<String>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/all.rs | 2 +- pagetop/src/html/assets/headscript.rs | 9 +++------ pagetop/src/html/assets/headstyles.rs | 9 +++------ pagetop/src/html/assets/javascript.rs | 5 +---- pagetop/src/html/assets/stylesheet.rs | 5 +---- 5 files changed, 9 insertions(+), 21 deletions(-) diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index e5bbcabb..9bd74c79 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -4,7 +4,7 @@ use crate::core::theme::all::THEMES; use crate::{service, trace, LazyStatic}; #[cfg(feature = "database")] -use crate::{db::*}; +use crate::db::*; use std::sync::RwLock; diff --git a/pagetop/src/html/assets/headscript.rs b/pagetop/src/html/assets/headscript.rs index 2cea8186..51c649ce 100644 --- a/pagetop/src/html/assets/headscript.rs +++ b/pagetop/src/html/assets/headscript.rs @@ -25,18 +25,15 @@ impl AssetsTrait for HeadScript { } impl HeadScript { - pub fn named<S>(path: S) -> Self - where - S: Into<String>, - { + pub fn named(path: impl Into<String>) -> Self { HeadScript { path: path.into(), ..Default::default() } } - pub fn with_code(mut self, code: &str) -> Self { - self.code = code.trim().to_owned(); + pub fn with_code(mut self, code: impl Into<String>) -> Self { + self.code = code.into().trim().to_owned(); self } diff --git a/pagetop/src/html/assets/headstyles.rs b/pagetop/src/html/assets/headstyles.rs index 9608d666..1a00430e 100644 --- a/pagetop/src/html/assets/headstyles.rs +++ b/pagetop/src/html/assets/headstyles.rs @@ -25,18 +25,15 @@ impl AssetsTrait for HeadStyles { } impl HeadStyles { - pub fn named<S>(path: S) -> Self - where - S: Into<String>, - { + pub fn named(path: impl Into<String>) -> Self { HeadStyles { path: path.into(), ..Default::default() } } - pub fn with_styles(mut self, styles: &str) -> Self { - self.styles = styles.trim().to_owned(); + pub fn with_styles(mut self, styles: impl Into<String>) -> Self { + self.styles = styles.into().trim().to_owned(); self } diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index e69a1ae1..526ab412 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -41,10 +41,7 @@ impl AssetsTrait for JavaScript { } impl JavaScript { - pub fn at<S>(path: S) -> Self - where - S: Into<String>, - { + pub fn at(path: impl Into<String>) -> Self { JavaScript { path: path.into(), ..Default::default() diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index 2cc53a1e..b670f21e 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -39,10 +39,7 @@ impl AssetsTrait for StyleSheet { } impl StyleSheet { - pub fn at<S>(path: S) -> Self - where - S: Into<String>, - { + pub fn at(path: impl Into<String>) -> Self { StyleSheet { path: path.into(), ..Default::default() From df2d15a839cb4cdca0e472720c37d2de2d408a61 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 19 Jul 2023 14:55:04 +0200 Subject: [PATCH 457/853] =?UTF-8?q?=F0=9F=93=9D=20Doc=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 5 ++--- pagetop/README.md | 2 +- pagetop/src/core/theme/definition.rs | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index ad62a28b..970a21f1 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -7,9 +7,8 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - PageTop is an opinionated web development framework that uses some of the most stable and \ - popular Rust packages to build modular, extensible and configurable Server-Side Rendering \ - (SSR) solutions. + PageTop is an opinionated Rust web development framework to build secure and modular \ + Server-Side Rendering (SSR) web solutions. """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" diff --git a/pagetop/README.md b/pagetop/README.md index 1d3859c5..05471388 100644 --- a/pagetop/README.md +++ b/pagetop/README.md @@ -1,5 +1,5 @@ **PageTop** is an opinionated [Rust](https://www.rust-lang.org) web development framework to build -secure, modular, and fast web Server-Side Rendering (SSR) solutions with ease. +secure and modular Server-Side Rendering (SSR) web solutions. PageTop uses some of the most stable and popular Rust *crates* to provide modular, extensible, and configurable features. diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 1e54e16a..71ee358e 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -50,7 +50,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { meta charset="utf-8"; @if !title.is_empty() { - title { (config::SETTINGS.app.name) (" | ") (title) } + title { (config::SETTINGS.app.name) (" - ") (title) } } @else { title { (config::SETTINGS.app.name) } } From 0a95f3d51c5a761be56fe1cc6204b41c498f8b8e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 19 Jul 2023 19:18:20 +0200 Subject: [PATCH 458/853] =?UTF-8?q?=F0=9F=92=A5=20Introduce=20ComponentRef?= =?UTF-8?q?=20to=20add=20comp's=20to=20packs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 4 +- pagetop-minimal/src/component/block.rs | 8 +- pagetop-minimal/src/component/container.rs | 8 +- .../src/component/form_element/form.rs | 4 +- pagetop-minimal/src/component/grid/column.rs | 50 +++++----- pagetop-minimal/src/component/grid/row.rs | 4 +- pagetop-minimal/src/component/paragraph.rs | 8 +- pagetop/src/core/component.rs | 4 +- pagetop/src/core/component/definition.rs | 6 +- pagetop/src/core/component/pack.rs | 95 ++++++++++--------- pagetop/src/core/theme/regions.rs | 14 +-- pagetop/src/response/page.rs | 4 +- 12 files changed, 106 insertions(+), 103 deletions(-) diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 129b5f7f..0405f179 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -244,12 +244,12 @@ impl MegaMenu { } pub fn with_item(mut self, item: MegaMenuItem) -> Self { - self.items.alter_pack(PackOp::Add, item); + self.items.alter(PackOp::Add, ComponentRef::to(item)); self } pub fn alter_items(&mut self, op: PackOp, item: MegaMenuItem) -> &mut Self { - self.items.alter_pack(op, item); + self.items.alter(op, ComponentRef::to(item)); self } diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index f0e9264e..ad8c9047 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -12,7 +12,7 @@ pub struct Block { id : IdentifierValue, classes : Classes, title : AttributeValue, - components: PackComponents, + content : PackComponents, template : String, } @@ -94,12 +94,12 @@ impl Block { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_pack(PackOp::Add, component); + self.content.alter(PackOp::Add, ComponentRef::to(component)); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_pack(op, component); + self.content.alter(op, ComponentRef::to(component)); self } @@ -120,7 +120,7 @@ impl Block { } pub fn components(&self) -> &PackComponents { - &self.components + &self.content } pub fn template(&self) -> &str { diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 7bea787a..8e954974 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -23,7 +23,7 @@ pub struct Container { classes : Classes, inner_classes : Classes, container_type: ContainerType, - components : PackComponents, + content : PackComponents, template : String, } @@ -155,12 +155,12 @@ impl Container { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_pack(PackOp::Add, component); + self.content.alter(PackOp::Add, ComponentRef::to(component)); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_pack(op, component); + self.content.alter(op, ComponentRef::to(component)); self } @@ -185,7 +185,7 @@ impl Container { } pub fn components(&self) -> &PackComponents { - &self.components + &self.content } pub fn template(&self) -> &str { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 151c1180..ba12e070 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -121,12 +121,12 @@ impl Form { } pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.elements.alter_pack(PackOp::Add, element); + self.elements.alter(PackOp::Add, ComponentRef::to(element)); self } pub fn alter_elements(&mut self, op: PackOp, element: impl ComponentTrait) -> &mut Self { - self.elements.alter_pack(op, element); + self.elements.alter(op, ComponentRef::to(element)); self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 8dd38a25..b9c9e3a8 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -4,16 +4,16 @@ create_handle!(COMPONENT_COLUMN); actions_for_component!(Column); -const SIZE__DEFAULT: &str = "col-md"; -const SIZE__1_OF_12: &str = "col-md-1"; -const SIZE__2_OF_12: &str = "col-md-2"; -const SIZE__3_OF_12: &str = "col-md-3"; -const SIZE__4_OF_12: &str = "col-md-4"; -const SIZE__5_OF_12: &str = "col-md-5"; -const SIZE__6_OF_12: &str = "col-md-6"; -const SIZE__7_OF_12: &str = "col-md-7"; -const SIZE__8_OF_12: &str = "col-md-8"; -const SIZE__9_OF_12: &str = "col-md-9"; +const SIZE_DEFAULT: &str = "col-md"; +const SIZE_1_OF_12: &str = "col-md-1"; +const SIZE_2_OF_12: &str = "col-md-2"; +const SIZE_3_OF_12: &str = "col-md-3"; +const SIZE_4_OF_12: &str = "col-md-4"; +const SIZE_5_OF_12: &str = "col-md-5"; +const SIZE_6_OF_12: &str = "col-md-6"; +const SIZE_7_OF_12: &str = "col-md-7"; +const SIZE_8_OF_12: &str = "col-md-8"; +const SIZE_9_OF_12: &str = "col-md-9"; const SIZE_10_OF_12: &str = "col-md-10"; const SIZE_11_OF_12: &str = "col-md-11"; const SIZE_12_OF_12: &str = "col-md-12"; @@ -44,13 +44,13 @@ pub struct Column { id : IdentifierValue, classes : Classes, size : ColumnSize, - components: PackComponents, + content : PackComponents, template : String, } impl ComponentTrait for Column { fn new() -> Self { - Column::default().with_classes(ClassesOp::SetDefault, SIZE__DEFAULT) + Column::default().with_classes(ClassesOp::SetDefault, SIZE_DEFAULT) } fn handle(&self) -> Handle { @@ -117,16 +117,16 @@ impl Column { #[fn_builder] pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { match size { - ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE__DEFAULT), - ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__1_OF_12), - ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__2_OF_12), - ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__3_OF_12), - ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__4_OF_12), - ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__5_OF_12), - ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__6_OF_12), - ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__7_OF_12), - ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__8_OF_12), - ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE__9_OF_12), + ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE_DEFAULT), + ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_1_OF_12), + ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_2_OF_12), + ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_3_OF_12), + ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_4_OF_12), + ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_5_OF_12), + ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_6_OF_12), + ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_7_OF_12), + ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_8_OF_12), + ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_9_OF_12), ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), @@ -136,12 +136,12 @@ impl Column { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_pack(PackOp::Add, component); + self.content.alter(PackOp::Add, ComponentRef::to(component)); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_pack(op, component); + self.content.alter(op, ComponentRef::to(component)); self } @@ -162,7 +162,7 @@ impl Column { } pub fn components(&self) -> &PackComponents { - &self.components + &self.content } pub fn template(&self) -> &str { diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 179c52e6..4138d77b 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -83,12 +83,12 @@ impl Row { } pub fn with_column(mut self, column: grid::Column) -> Self { - self.columns.alter_pack(PackOp::Add, column); + self.columns.alter(PackOp::Add, ComponentRef::to(column)); self } pub fn alter_columns(&mut self, op: PackOp, column: grid::Column) -> &mut Self { - self.columns.alter_pack(op, column); + self.columns.alter(op, ComponentRef::to(column)); self } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 0043689d..c5d0716f 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -20,7 +20,7 @@ pub struct Paragraph { renderable: Renderable, id : IdentifierValue, classes : Classes, - components: PackComponents, + content : PackComponents, display : ParagraphDisplay, template : String, } @@ -90,12 +90,12 @@ impl Paragraph { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.components.alter_pack(PackOp::Add, component); + self.content.alter(PackOp::Add, ComponentRef::to(component)); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.components.alter_pack(op, component); + self.content.alter(op, ComponentRef::to(component)); self } @@ -130,7 +130,7 @@ impl Paragraph { } pub fn components(&self) -> &PackComponents { - &self.components + &self.content } pub fn display(&self) -> &ParagraphDisplay { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index e479590f..615a6cca 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -2,13 +2,13 @@ mod context; pub use context::{Context, ContextOp}; mod definition; -pub use definition::{component_mut, component_ref, BaseComponent, ComponentTrait}; +pub use definition::{component_mut, component_ref, ComponentBase, ComponentTrait}; mod one; pub use one::OneComponent; mod pack; -pub use pack::{PackComponents, PackOp}; +pub use pack::{ComponentRef, PackComponents, PackOp}; mod renderable; pub use renderable::{IsRenderable, Renderable}; diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 426ef76d..b17733e2 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -4,7 +4,7 @@ use crate::{util, Handle, Weight}; use std::any::Any; -pub trait BaseComponent: Any { +pub trait ComponentBase: Any { fn prepare(&mut self, cx: &mut Context) -> Markup; fn as_ref_any(&self) -> &dyn Any; @@ -12,7 +12,7 @@ pub trait BaseComponent: Any { fn as_mut_any(&mut self) -> &mut dyn Any; } -pub trait ComponentTrait: BaseComponent + Send + Sync { +pub trait ComponentTrait: ComponentBase + Send + Sync { fn new() -> Self where Self: Sized; @@ -52,7 +52,7 @@ pub trait ComponentTrait: BaseComponent + Send + Sync { fn after_prepare_component(&mut self, cx: &mut Context) {} } -impl<C: ComponentTrait> BaseComponent for C { +impl<C: ComponentTrait> ComponentBase for C { fn prepare(&mut self, cx: &mut Context) -> Markup { if self.is_renderable(cx) { // Acciones antes de preparar el componente. diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index c5728c68..2072c5c7 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -1,9 +1,34 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; -use crate::{fn_builder, Handle}; +use crate::{Handle, Weight}; use std::sync::{Arc, RwLock}; +#[derive(Clone)] +pub struct ComponentRef(Arc<RwLock<dyn ComponentTrait>>); + +impl ComponentRef { + pub fn to(component: impl ComponentTrait) -> Self { + ComponentRef(Arc::new(RwLock::new(component))) + } + + fn handle(&self) -> Handle { + self.0.read().unwrap().handle() + } + + fn id(&self) -> Option<String> { + self.0.read().unwrap().id() + } + + fn weight(&self) -> Weight { + self.0.read().unwrap().weight() + } + + fn prepare(&self, cx: &mut Context) -> Markup { + self.0.write().unwrap().prepare(cx) + } +} + pub enum PackOp { Add, AddAfterId(&'static str), @@ -14,19 +39,17 @@ pub enum PackOp { Reset, } -pub type ArcLockComponent = Arc<RwLock<dyn ComponentTrait>>; - #[derive(Clone, Default)] -pub struct PackComponents(Vec<ArcLockComponent>); +pub struct PackComponents(Vec<ComponentRef>); impl PackComponents { pub fn new() -> Self { PackComponents::default() } - pub fn new_with(component: impl ComponentTrait) -> Self { + pub fn new_with(cref: ComponentRef) -> Self { let mut pack = PackComponents::new(); - pack.alter_pack(PackOp::Add, component); + pack.alter(PackOp::Add, cref); pack } @@ -46,45 +69,31 @@ impl PackComponents { // PackComponents BUILDER. - #[fn_builder] - pub fn alter_pack(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - let arc = Arc::new(RwLock::new(component)); + pub fn alter(&mut self, op: PackOp, cref: ComponentRef) -> &mut Self { match op { - PackOp::Add => self.0.push(arc), + PackOp::Add => self.0.push(cref), PackOp::AddAfterId(id) => { - match self - .0 - .iter() - .position(|c| c.read().unwrap().id().as_deref() == Some(id)) - { - Some(index) => self.0.insert(index + 1, arc), - _ => self.0.push(arc), + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index + 1, cref), + _ => self.0.push(cref), } } PackOp::AddBeforeId(id) => { - match self - .0 - .iter() - .position(|c| c.read().unwrap().id().as_deref() == Some(id)) - { - Some(index) => self.0.insert(index, arc), - _ => self.0.insert(0, arc), + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index, cref), + _ => self.0.insert(0, cref), } } - PackOp::AddFirst => self.0.insert(0, arc), + PackOp::AddFirst => self.0.insert(0, cref), PackOp::RemoveById(id) => { - if let Some(index) = self - .0 - .iter() - .position(|c| c.read().unwrap().id().as_deref() == Some(id)) - { + if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { self.0.remove(index); } } PackOp::ReplaceById(id) => { for c in self.0.iter_mut() { - if c.read().unwrap().id().as_deref() == Some(id) { - *c = arc; + if c.id().as_deref() == Some(id) { + *c = cref; break; } } @@ -96,32 +105,26 @@ impl PackComponents { // PackComponents GETTERS. - pub fn get_by_id(&self, id: &'static str) -> Option<&ArcLockComponent> { - self.0 - .iter() - .find(|&c| c.read().unwrap().id().as_deref() == Some(id)) + pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentRef> { + self.0.iter().find(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcLockComponent> { - self.0 - .iter() - .filter(|&c| c.read().unwrap().id().as_deref() == Some(id)) + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ComponentRef> { + self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcLockComponent> { - self.0 - .iter() - .filter(move |&c| c.read().unwrap().handle() == handle) + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ComponentRef> { + self.0.iter().filter(move |&c| c.handle() == handle) } // PackComponents PREPARE. pub fn prepare(&self, cx: &mut Context) -> Markup { let mut components = self.0.clone(); - components.sort_by_key(|c| c.read().unwrap().weight()); + components.sort_by_key(|c| c.weight()); html! { @for c in components.iter() { - (" ")(c.write().unwrap().prepare(cx))(" ") + (" ")(c.prepare(cx))(" ") } } } diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 35e2ccc5..dd28e88e 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ComponentTrait, PackComponents, PackOp}; +use crate::core::component::{ComponentRef, PackComponents, PackOp}; use crate::LazyStatic; use std::collections::HashMap; @@ -15,11 +15,11 @@ impl ComponentsRegions { ComponentsRegions::default() } - pub fn add_to(&mut self, region: &'static str, component: impl ComponentTrait) { + pub fn add_to(&mut self, region: &'static str, cref: ComponentRef) { if let Some(region) = self.0.get_mut(region) { - region.alter_pack(PackOp::Add, component); + region.alter(PackOp::Add, cref); } else { - self.0.insert(region, PackComponents::new_with(component)); + self.0.insert(region, PackComponents::new_with(cref)); } } @@ -32,14 +32,14 @@ impl ComponentsRegions { } } -pub fn add_component_to(theme: &'static str, region: &'static str, component: impl ComponentTrait) { +pub fn add_component_to(theme: &'static str, region: &'static str, cref: ComponentRef) { let mut hm = THEME_REGIONS.write().unwrap(); if let Some(hm_theme) = hm.get_mut(theme) { - hm_theme.add_to(region, component); + hm_theme.add_to(region, cref); } else { hm.insert(theme, { let mut regions = ComponentsRegions::new(); - regions.add_to(region, component); + regions.add_to(region, cref); regions }); } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 5d14ee9a..0a96768f 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -2,7 +2,7 @@ mod action; pub use action::*; use crate::core::component::l10n::L10n; -use crate::core::component::{ComponentTrait, Context, ContextOp, OneComponent}; +use crate::core::component::{ComponentRef, ComponentTrait, Context, ContextOp, OneComponent}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::fatal_error::FatalError; @@ -90,7 +90,7 @@ impl Page { #[fn_builder] pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_to(region, component); + self.regions.add_to(region, ComponentRef::to(component)); self } From 4ce59d65205df1156007649113ab4fb9efe1de37 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 19 Jul 2023 19:25:43 +0200 Subject: [PATCH 459/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20{Trait}Base=20f?= =?UTF-8?q?or=20Action/Module=20Component-like?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/action.rs | 2 +- pagetop/src/core/action/definition.rs | 6 +++--- pagetop/src/core/module.rs | 2 +- pagetop/src/core/module/definition.rs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index 0885c80a..c257973a 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -1,5 +1,5 @@ mod definition; -pub use definition::{action_ref, ActionTrait, BaseAction}; +pub use definition::{action_ref, ActionBase, ActionTrait}; mod list; pub use list::Action; diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs index b302c797..ad46f11b 100644 --- a/pagetop/src/core/action/definition.rs +++ b/pagetop/src/core/action/definition.rs @@ -2,11 +2,11 @@ use crate::{Handle, Weight}; use std::any::Any; -pub trait BaseAction: Any { +pub trait ActionBase: Any { fn as_ref_any(&self) -> &dyn Any; } -pub trait ActionTrait: BaseAction + Send + Sync { +pub trait ActionTrait: ActionBase + Send + Sync { fn new() -> Self where Self: Sized; @@ -18,7 +18,7 @@ pub trait ActionTrait: BaseAction + Send + Sync { } } -impl<C: ActionTrait> BaseAction for C { +impl<C: ActionTrait> ActionBase for C { fn as_ref_any(&self) -> &dyn Any { self } diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index 0ecfbc65..3bfd99c8 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,4 +1,4 @@ mod definition; -pub use definition::{BaseModule, ModuleStaticRef, ModuleTrait}; +pub use definition::{ModuleBase, ModuleStaticRef, ModuleTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index bd62c9bd..ab405d80 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -8,12 +8,12 @@ use crate::db::MigrationItem; pub type ModuleStaticRef = &'static dyn ModuleTrait; -pub trait BaseModule { +pub trait ModuleBase { fn single_name(&self) -> &'static str; } /// Los módulos deben implementar este *trait*. -pub trait ModuleTrait: BaseModule + Send + Sync { +pub trait ModuleTrait: ModuleBase + Send + Sync { fn handle(&self) -> Handle; fn name(&self) -> L10n { @@ -52,7 +52,7 @@ pub trait ModuleTrait: BaseModule + Send + Sync { fn configure_service(&self, cfg: &mut service::web::ServiceConfig) {} } -impl<M: ?Sized + ModuleTrait> BaseModule for M { +impl<M: ?Sized + ModuleTrait> ModuleBase for M { fn single_name(&self) -> &'static str { util::single_type_name::<Self>() } From 05304f116aff18d49d090bef4ba33be0ecc706f2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 19 Jul 2023 23:58:23 +0200 Subject: [PATCH 460/853] =?UTF-8?q?=E2=9C=A8=20Mark=20async=20main=20funct?= =?UTF-8?q?ion=20with=20#[pagetop::main]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also, use #[pagetop::test] for test functions. Add actix-web to Cargo.toml only when using Actix Web macros for service configuration. --- drust/Cargo.toml | 1 - drust/src/main.rs | 2 +- examples/basics/hello-name/src/main.rs | 2 +- examples/basics/hello-world/Cargo.toml | 1 - examples/basics/hello-world/src/main.rs | 2 +- pagetop-macros/src/lib.rs | 40 +++++++++++++++++++++++++ pagetop/STARTER.bin.Cargo.toml | 9 +++--- pagetop/STARTER.lib.Cargo.toml | 8 ++--- pagetop/src/lib.rs | 7 ++--- pagetop/src/prelude.rs | 2 +- pagetop/src/service.rs | 2 +- tests/Cargo.toml | 3 +- 12 files changed, 58 insertions(+), 21 deletions(-) diff --git a/drust/Cargo.toml b/drust/Cargo.toml index efd28cef..c0de9ab6 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -14,7 +14,6 @@ repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -actix-web = "4" pagetop = { version = "0.0", path = "../pagetop", features = ["mysql"], default-features = false } # Themes. pagetop-aliner = { version = "0.0", path = "../pagetop-aliner" } diff --git a/drust/src/main.rs b/drust/src/main.rs index 25c5ed88..0eb6cef6 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Drust { } } -#[actix_web::main] +#[pagetop::main] async fn main() -> std::io::Result<()> { Application::prepare(&Drust).unwrap().run()?.await } diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index cc0c8cd8..b95494e4 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -25,7 +25,7 @@ async fn hello_name( .render() } -#[actix_web::main] +#[pagetop::main] async fn main() -> std::io::Result<()> { Application::prepare(&HelloName).unwrap().run()?.await } diff --git a/examples/basics/hello-world/Cargo.toml b/examples/basics/hello-world/Cargo.toml index d70336aa..517f6a10 100644 --- a/examples/basics/hello-world/Cargo.toml +++ b/examples/basics/hello-world/Cargo.toml @@ -5,5 +5,4 @@ edition = "2021" publish = false [dependencies] -actix-web = "4" pagetop = { version = "0.0", path = "../../../pagetop" } diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 14a1f5a7..c61d5b47 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -20,7 +20,7 @@ async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalE .render() } -#[actix_web::main] +#[pagetop::main] async fn main() -> std::io::Result<()> { Application::prepare(&HelloWorld).unwrap().run()?.await } diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index 60a7fd74..b6acc4b8 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -54,3 +54,43 @@ pub fn fn_builder(_attr: TokenStream, item: TokenStream) -> TokenStream { }; expanded.into() } + +/// Marks async main function as the PageTop entry-point. +/// +/// # Examples +/// ``` +/// #[pagetop::main] +/// async fn main() { +/// async { println!("Hello world"); }.await +/// } +/// ``` +#[proc_macro_attribute] +pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { + let mut output: TokenStream = (quote! { + #[::pagetop::service::rt::main(system = "::pagetop::service::rt::System")] + }) + .into(); + + output.extend(item); + output +} + +/// Marks async test functions to use the PageTop entry-point. +/// +/// # Examples +/// ``` +/// #[pagetop::test] +/// async fn test() { +/// assert_eq!(async { "Hello world" }.await, "Hello world"); +/// } +/// ``` +#[proc_macro_attribute] +pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { + let mut output: TokenStream = (quote! { + #[::pagetop::service::rt::test(system = "::pagetop::service::rt::System")] + }) + .into(); + + output.extend(item); + output +} diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index 228385f9..18314711 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -7,16 +7,17 @@ edition = "2021" # https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +# Opcional. Para configurar servicios usando las macros de Actix Web: actix-web = "4" -# Si requiere acceso a base de datos (mysql, postgres y/o sqlite): -pagetop = { version = "0.0", features = ["mysql"], default-features = false } -# pagetop = "0.0" (en otro caso) - # Opcional. Para usar archivos y recursos binarios contenidos en el ejecutable: static-files = "0.2.3" # Opcional. Para serializar estructuras de datos: serde = { version = "1.0", features = ["derive"] } +# Si requiere acceso a base de datos (mysql, postgres y/o sqlite): +pagetop = { version = "0.0", features = ["mysql"], default-features = false } +# pagetop = "0.0" (en otro caso) + [build-dependencies] # Opcional. Para incluir archivos y recursos binarios en el ejecutable: pagetop-build = "0.0" diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 26c4debe..7572d68d 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -7,15 +7,15 @@ edition = "2021" # https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -# Si requiere acceso a base de datos: -pagetop = { version = "0.0", features = ["database"], default-features = false } -# pagetop = "0.0" (en otro caso) - # Opcional. Para usar archivos y recursos binarios contenidos en la librería: static-files = "0.2.3" # Opcional. Para serializar estructuras de datos: serde = { version = "1.0", features = ["derive"] } +# Si requiere acceso a base de datos: +pagetop = { version = "0.0", features = ["database"], default-features = false } +# pagetop = "0.0" (en otro caso) + [build-dependencies] # Opcional. Para incluir archivos y recursos binarios en la propia librería: pagetop-build = "0.0" diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 8557aaee..e5d36925 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -52,18 +52,17 @@ //! } //! //! fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { -//! cfg.service(hello_world); +//! cfg.route("/", service::web::get().to(hello_world)); //! } //! } //! -//! #[service::get("/")] //! async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { //! Page::new(request) //! .with_in("content", Html::with(html! { h1 { "Hello World!" } })) //! .render() //! } //! -//! #[actix_web::main] +//! #[pagetop::main] //! async fn main() -> std::io::Result<()> { //! Application::prepare(&HelloWorld).unwrap().run()?.await //! } @@ -106,7 +105,7 @@ pub use concat_string::concat_string; /// Enables flexible identifier concatenation in macros, allowing new items with pasted identifiers. pub use paste::paste; -pub use pagetop_macros::fn_builder; +pub use pagetop_macros::{fn_builder, main, test}; // ************************************************************************************************* // GLOBAL. diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index a51eb062..e61d2df8 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,7 +1,7 @@ //! The PageTop Prelude. // Re-exported macros. -pub use crate::{concat_string, fn_builder, paste}; +pub use crate::{concat_string, fn_builder, main, paste, test}; // Global. pub use crate::{Handle, HashMapResources, LazyStatic, ResultExt, Weight}; diff --git a/pagetop/src/service.rs b/pagetop/src/service.rs index 2d518e25..3b12c807 100644 --- a/pagetop/src/service.rs +++ b/pagetop/src/service.rs @@ -2,7 +2,7 @@ pub use actix_session::Session; pub use actix_web::{ - cookie, get, http, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, + cookie, get, http, rt, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, }; pub use actix_web_files::Files as ActixFiles; diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 29ac8465..cf54f760 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -7,12 +7,11 @@ authors = [ "Manuel Cillero <manuel@cillero.es>" ] description = """\ - Test for PageTop.\ + Tests for PageTop.\ """ homepage = "https://pagetop.cillero.es" repository = "https://github.com/manuelcillero/pagetop" license = "Apache-2.0 OR MIT" [dependencies] -actix-web = "4" pagetop = { version = "0.0", path = "../pagetop", features = ["mysql"], default-features = false } From 09ac316cb57af53af7eae75868beedb46ef9ce59 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Jul 2023 18:34:26 +0200 Subject: [PATCH 461/853] =?UTF-8?q?=F0=9F=92=A5=20ModuleRef=20and=20ThemeR?= =?UTF-8?q?ef=20replace=20*StaticRef?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 4 ++-- pagetop-admin/src/lib.rs | 2 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 4 ++-- pagetop-bulmix/src/lib.rs | 4 ++-- pagetop-homedemo/src/lib.rs | 2 +- pagetop-megamenu/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/app.rs | 4 ++-- pagetop/src/core/component/context.rs | 6 +++--- pagetop/src/core/module.rs | 2 +- pagetop/src/core/module/all.rs | 16 ++++++++-------- pagetop/src/core/module/definition.rs | 10 +++++----- pagetop/src/core/theme.rs | 2 +- pagetop/src/core/theme/all.rs | 9 ++++----- pagetop/src/core/theme/basic.rs | 4 ++-- pagetop/src/core/theme/definition.rs | 2 +- 17 files changed, 38 insertions(+), 39 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 0eb6cef6..a6944ba9 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -9,7 +9,7 @@ impl ModuleTrait for Drust { APP_DRUST } - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![ // Themes. &pagetop_aliner::Aliner, @@ -23,7 +23,7 @@ impl ModuleTrait for Drust { ] } - fn drop_modules(&self) -> Vec<ModuleStaticRef> { + fn drop_modules(&self) -> Vec<ModuleRef> { vec![ // &pagetop_node::Node ] diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 52d6233d..ed3e8474 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for Admin { } #[rustfmt::skip] - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![ &pagetop_minimal::Minimal, &pagetop_megamenu::MegaMenu, diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 92079cfd..479ab499 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -11,7 +11,7 @@ impl ModuleTrait for Aliner { THEME_ALINER } - fn theme(&self) -> Option<ThemeStaticRef> { + fn theme(&self) -> Option<ThemeRef> { Some(&Aliner) } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 31dfd56e..f8ce573c 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -14,11 +14,11 @@ impl ModuleTrait for Bootsier { THEME_BOOTSIER } - fn theme(&self) -> Option<ThemeStaticRef> { + fn theme(&self) -> Option<ThemeRef> { Some(&Bootsier) } - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![&pagetop_jquery::JQuery] } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 9905b05d..0cadab56 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -13,12 +13,12 @@ impl ModuleTrait for Bulmix { THEME_BULMIX } - fn theme(&self) -> Option<ThemeStaticRef> { + fn theme(&self) -> Option<ThemeRef> { Some(&Bulmix) } #[rustfmt::skip] - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![ &pagetop_jquery::JQuery, &pagetop_minimal::Minimal, diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 308d6873..28e4c056 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for HomeDemo { L10n::t("module_description", &LOCALES_HOMEDEMO) } - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![&pagetop_minimal::Minimal] } diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index b1bd6593..89e8345b 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -13,7 +13,7 @@ impl ModuleTrait for MegaMenu { MODULE_MEGAMENU } - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![&pagetop_jquery::JQuery, &pagetop_minimal::Minimal] } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 3b45b3a5..60384843 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for User { L10n::t("module_description", &LOCALES_USER) } - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![&pagetop_minimal::Minimal] } diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 1895089e..ae1d3b42 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -2,7 +2,7 @@ mod figfont; -use crate::core::{module, module::ModuleStaticRef}; +use crate::core::{module, module::ModuleRef}; use crate::html::Markup; use crate::response::fatal_error::FatalError; use crate::response::page::ResultPage; @@ -26,7 +26,7 @@ pub struct Application { } impl Application { - pub fn prepare(app: ModuleStaticRef) -> Result<Self, Error> { + pub fn prepare(app: ModuleRef) -> Result<Self, Error> { // Rótulo de presentación. print_on_startup(); diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 16a077a7..c79e109b 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,5 +1,5 @@ use crate::core::theme::all::{theme_by_single_name, THEME}; -use crate::core::theme::ThemeStaticRef; +use crate::core::theme::ThemeRef; use crate::html::{html, Assets, HeadScript, HeadStyles, JavaScript, Markup, StyleSheet}; use crate::locale::{LanguageIdentifier, LANGID}; use crate::service::HttpRequest; @@ -29,7 +29,7 @@ pub enum ContextOp { pub struct Context { request : HttpRequest, langid : &'static LanguageIdentifier, - theme : ThemeStaticRef, + theme : ThemeRef, stylesheet: Assets<StyleSheet>, // Stylesheets. headstyles: Assets<HeadStyles>, // Styles in head. javascript: Assets<JavaScript>, // JavaScripts. @@ -99,7 +99,7 @@ impl Context { self.langid } - pub(crate) fn theme(&self) -> ThemeStaticRef { + pub(crate) fn theme(&self) -> ThemeRef { self.theme } diff --git a/pagetop/src/core/module.rs b/pagetop/src/core/module.rs index 3bfd99c8..4da03e01 100644 --- a/pagetop/src/core/module.rs +++ b/pagetop/src/core/module.rs @@ -1,4 +1,4 @@ mod definition; -pub use definition::{ModuleBase, ModuleStaticRef, ModuleTrait}; +pub use definition::{ModuleBase, ModuleRef, ModuleTrait}; pub(crate) mod all; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 9bd74c79..b50f8dfd 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,5 +1,5 @@ use crate::core::action::add_action; -use crate::core::module::ModuleStaticRef; +use crate::core::module::ModuleRef; use crate::core::theme::all::THEMES; use crate::{service, trace, LazyStatic}; @@ -10,22 +10,22 @@ use std::sync::RwLock; // MODULES ***************************************************************************************** -static ENABLED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = +static ENABLED_MODULES: LazyStatic<RwLock<Vec<ModuleRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); -static DROPPED_MODULES: LazyStatic<RwLock<Vec<ModuleStaticRef>>> = +static DROPPED_MODULES: LazyStatic<RwLock<Vec<ModuleRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); // REGISTER MODULES ******************************************************************************** -pub fn register_modules(app: ModuleStaticRef) { +pub fn register_modules(app: ModuleRef) { // List of modules to drop. - let mut list: Vec<ModuleStaticRef> = Vec::new(); + let mut list: Vec<ModuleRef> = Vec::new(); add_to_dropped(&mut list, app); DROPPED_MODULES.write().unwrap().append(&mut list); // List of modules to enable. - let mut list: Vec<ModuleStaticRef> = Vec::new(); + let mut list: Vec<ModuleRef> = Vec::new(); // Enable basic theme. add_to_enabled(&mut list, &crate::core::theme::Basic); @@ -37,7 +37,7 @@ pub fn register_modules(app: ModuleStaticRef) { ENABLED_MODULES.write().unwrap().append(&mut list); } -fn add_to_dropped(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { +fn add_to_dropped(list: &mut Vec<ModuleRef>, module: ModuleRef) { for d in module.drop_modules().iter() { if !list.iter().any(|m| m.handle() == d.handle()) { list.push(*d); @@ -49,7 +49,7 @@ fn add_to_dropped(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { } } -fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) { +fn add_to_enabled(list: &mut Vec<ModuleRef>, module: ModuleRef) { if !list.iter().any(|m| m.handle() == module.handle()) { if DROPPED_MODULES .read() diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index ab405d80..deaa3c7f 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,12 +1,12 @@ use crate::core::action::Action; use crate::core::component::l10n::L10n; -use crate::core::theme::ThemeStaticRef; +use crate::core::theme::ThemeRef; use crate::{service, util, Handle}; #[cfg(feature = "database")] use crate::db::MigrationItem; -pub type ModuleStaticRef = &'static dyn ModuleTrait; +pub type ModuleRef = &'static dyn ModuleTrait; pub trait ModuleBase { fn single_name(&self) -> &'static str; @@ -24,15 +24,15 @@ pub trait ModuleTrait: ModuleBase + Send + Sync { L10n::default() } - fn theme(&self) -> Option<ThemeStaticRef> { + fn theme(&self) -> Option<ThemeRef> { None } - fn dependencies(&self) -> Vec<ModuleStaticRef> { + fn dependencies(&self) -> Vec<ModuleRef> { vec![] } - fn drop_modules(&self) -> Vec<ModuleStaticRef> { + fn drop_modules(&self) -> Vec<ModuleRef> { vec![] } diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index e12f7d21..35a6ff2f 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -1,5 +1,5 @@ mod definition; -pub use definition::{ThemeStaticRef, ThemeTrait}; +pub use definition::{ThemeRef, ThemeTrait}; mod regions; pub use regions::add_component_to; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index fcc09467..2b6d56b1 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -1,17 +1,16 @@ use crate::config; -use crate::core::theme::ThemeStaticRef; +use crate::core::theme::ThemeRef; use crate::LazyStatic; use std::sync::RwLock; // THEMES ****************************************************************************************** -pub static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> = - LazyStatic::new(|| RwLock::new(Vec::new())); +pub static THEMES: LazyStatic<RwLock<Vec<ThemeRef>>> = LazyStatic::new(|| RwLock::new(Vec::new())); // DEFAULT THEME *********************************************************************************** -pub static THEME: LazyStatic<ThemeStaticRef> = +pub static THEME: LazyStatic<ThemeRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, None => &crate::core::theme::Basic, @@ -19,7 +18,7 @@ pub static THEME: LazyStatic<ThemeStaticRef> = // THEME BY NAME *********************************************************************************** -pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> { +pub fn theme_by_single_name(single_name: &str) -> Option<ThemeRef> { let single_name = single_name.to_lowercase(); match THEMES .read() diff --git a/pagetop/src/core/theme/basic.rs b/pagetop/src/core/theme/basic.rs index 2a581bec..2217fbd9 100644 --- a/pagetop/src/core/theme/basic.rs +++ b/pagetop/src/core/theme/basic.rs @@ -1,6 +1,6 @@ use crate::core::component::ContextOp; use crate::core::module::ModuleTrait; -use crate::core::theme::{ThemeStaticRef, ThemeTrait}; +use crate::core::theme::{ThemeRef, ThemeTrait}; use crate::html::{Favicon, StyleSheet}; use crate::response::page::Page; use crate::service; @@ -17,7 +17,7 @@ impl ModuleTrait for Basic { THEME_BASIC } - fn theme(&self) -> Option<ThemeStaticRef> { + fn theme(&self) -> Option<ThemeRef> { Some(&Basic) } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 71ee358e..aec9fe61 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -5,7 +5,7 @@ use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; use crate::{config, LOCALES_PAGETOP}; -pub type ThemeStaticRef = &'static dyn ThemeTrait; +pub type ThemeRef = &'static dyn ThemeTrait; /// Los temas deben implementar este "trait". pub trait ThemeTrait: ModuleTrait + Send + Sync { From 025dcd9b177c6fc5203091785c0b2a00080a1151 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Jul 2023 19:01:18 +0200 Subject: [PATCH 462/853] =?UTF-8?q?=F0=9F=93=9D=20Add=20feature=20label=20?= =?UTF-8?q?on=20docs.rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 1 + pagetop/src/lib.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 970a21f1..a586c23e 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -83,3 +83,4 @@ pagetop-build = { version = "0.0", path = "../pagetop-build" } [package.metadata.docs.rs] all-features = true +rustdoc-args = ["--cfg", "docsrs"] diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index e5d36925..36892954 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -96,6 +96,8 @@ //! Pero también deberán declararse explícitamente estas dependencias en cada módulo para ayudar a //! PageTop a estructurar e inicializar modularmente la aplicación. +#![cfg_attr(docsrs, feature(doc_cfg))] + // ************************************************************************************************* // RE-EXPORTED MACROS. // ************************************************************************************************* @@ -135,6 +137,7 @@ pub mod locale; pub mod html; // Acceso a base de datos. +#[cfg_attr(docsrs, doc(cfg(feature = "database")))] #[cfg(feature = "database")] pub mod db; From 84bd5f631afb58a9d844ff106435e2df6ad1e6bb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 22 Jul 2023 01:47:43 +0200 Subject: [PATCH 463/853] =?UTF-8?q?=E2=9C=A8=20Add=20components=20to=20the?= =?UTF-8?q?me-less=20regions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/pack.rs | 16 +++--- pagetop/src/core/module/all.rs | 4 +- pagetop/src/core/theme.rs | 6 +-- pagetop/src/core/theme/all.rs | 2 +- .../src/core/theme/{basic.rs => default.rs} | 12 ++--- pagetop/src/core/theme/regions.rs | 53 +++++++++++++------ pagetop/src/response/page.rs | 4 +- 7 files changed, 56 insertions(+), 41 deletions(-) rename pagetop/src/core/theme/{basic.rs => default.rs} (83%) diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index 2072c5c7..9fe79e40 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -53,18 +53,14 @@ impl PackComponents { pack } - pub(crate) fn merge(one: Option<&PackComponents>, other: Option<&PackComponents>) -> Self { - if let Some(one) = one { - let mut components = one.0.clone(); - if let Some(other) = other { - components.append(&mut other.0.clone()); + pub(crate) fn merge(packs: &[Option<&PackComponents>]) -> Self { + let mut pack = PackComponents::default(); + for p in packs { + if let Some(p) = p { + pack.0.append(&mut p.0.clone()); } - PackComponents(components) - } else if let Some(other) = other { - PackComponents(other.0.clone()) - } else { - PackComponents::default() } + pack } // PackComponents BUILDER. diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index b50f8dfd..4bd8b530 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -27,8 +27,8 @@ pub fn register_modules(app: ModuleRef) { // List of modules to enable. let mut list: Vec<ModuleRef> = Vec::new(); - // Enable basic theme. - add_to_enabled(&mut list, &crate::core::theme::Basic); + // Enable default theme. + add_to_enabled(&mut list, &crate::core::theme::DefaultTheme); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 35a6ff2f..7a59d60e 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -2,10 +2,10 @@ mod definition; pub use definition::{ThemeRef, ThemeTrait}; mod regions; -pub use regions::add_component_to; pub(crate) use regions::ComponentsRegions; +pub use regions::{add_component_in, Region}; -mod basic; -pub(crate) use basic::Basic; +mod default; +pub use default::DefaultTheme; pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 2b6d56b1..f8214b05 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -13,7 +13,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeRef>>> = LazyStatic::new(|| RwLock pub static THEME: LazyStatic<ThemeRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::core::theme::Basic, + None => &crate::core::theme::DefaultTheme, }); // THEME BY NAME *********************************************************************************** diff --git a/pagetop/src/core/theme/basic.rs b/pagetop/src/core/theme/default.rs similarity index 83% rename from pagetop/src/core/theme/basic.rs rename to pagetop/src/core/theme/default.rs index 2217fbd9..4444f27a 100644 --- a/pagetop/src/core/theme/basic.rs +++ b/pagetop/src/core/theme/default.rs @@ -6,19 +6,19 @@ use crate::response::page::Page; use crate::service; use crate::{create_handle, serve_static_files, static_files, Handle}; -create_handle!(THEME_BASIC); +create_handle!(THEME_DEFAULT); static_files!(theme); -pub struct Basic; +pub struct DefaultTheme; -impl ModuleTrait for Basic { +impl ModuleTrait for DefaultTheme { fn handle(&self) -> Handle { - THEME_BASIC + THEME_DEFAULT } fn theme(&self) -> Option<ThemeRef> { - Some(&Basic) + Some(&DefaultTheme) } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { @@ -26,7 +26,7 @@ impl ModuleTrait for Basic { } } -impl ThemeTrait for Basic { +impl ThemeTrait for DefaultTheme { fn before_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index dd28e88e..ba40d975 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,12 +1,16 @@ use crate::core::component::{ComponentRef, PackComponents, PackOp}; -use crate::LazyStatic; +use crate::core::theme::ThemeRef; +use crate::{Handle, LazyStatic}; use std::collections::HashMap; use std::sync::RwLock; -static THEME_REGIONS: LazyStatic<RwLock<HashMap<&'static str, ComponentsRegions>>> = +static THEME_REGIONS: LazyStatic<RwLock<HashMap<Handle, ComponentsRegions>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); +static COMMON_REGIONS: LazyStatic<RwLock<ComponentsRegions>> = + LazyStatic::new(|| RwLock::new(ComponentsRegions::new())); + #[derive(Default)] pub struct ComponentsRegions(HashMap<&'static str, PackComponents>); @@ -15,7 +19,13 @@ impl ComponentsRegions { ComponentsRegions::default() } - pub fn add_to(&mut self, region: &'static str, cref: ComponentRef) { + pub fn new_with(region: &'static str, cref: ComponentRef) -> Self { + let mut regions = ComponentsRegions::new(); + regions.add_in(region, cref); + regions + } + + pub fn add_in(&mut self, region: &'static str, cref: ComponentRef) { if let Some(region) = self.0.get_mut(region) { region.alter(PackOp::Add, cref); } else { @@ -23,24 +33,33 @@ impl ComponentsRegions { } } - pub fn get_extended_pack(&self, theme: &str, region: &str) -> PackComponents { - if let Some(hm_theme) = THEME_REGIONS.read().unwrap().get(theme) { - PackComponents::merge(self.0.get(region), hm_theme.0.get(region)) + pub fn get_pack(&self, theme: ThemeRef, region: &str) -> PackComponents { + let common = COMMON_REGIONS.read().unwrap(); + if let Some(hm) = THEME_REGIONS.read().unwrap().get(&theme.handle()) { + PackComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) } else { - PackComponents::merge(self.0.get(region), None) + PackComponents::merge(&[common.0.get(region), self.0.get(region)]) } } } -pub fn add_component_to(theme: &'static str, region: &'static str, cref: ComponentRef) { - let mut hm = THEME_REGIONS.write().unwrap(); - if let Some(hm_theme) = hm.get_mut(theme) { - hm_theme.add_to(region, cref); - } else { - hm.insert(theme, { - let mut regions = ComponentsRegions::new(); - regions.add_to(region, cref); - regions - }); +pub enum Region { + Named(&'static str), + OfTheme(ThemeRef, &'static str), +} + +pub fn add_component_in(region: Region, cref: ComponentRef) { + match region { + Region::Named(name) => { + COMMON_REGIONS.write().unwrap().add_in(name, cref); + } + Region::OfTheme(theme, region) => { + let mut regions = THEME_REGIONS.write().unwrap(); + if let Some(hm) = regions.get_mut(&theme.handle()) { + hm.add_in(region, cref); + } else { + regions.insert(theme.handle(), ComponentsRegions::new_with(region, cref)); + } + } } } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 0a96768f..c2d9434c 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -90,7 +90,7 @@ impl Page { #[fn_builder] pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_to(region, ComponentRef::to(component)); + self.regions.add_in(region, ComponentRef::to(component)); self } @@ -173,7 +173,7 @@ impl Page { pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { let render = self .regions - .get_extended_pack(self.context.theme().single_name(), region) + .get_pack(self.context.theme(), region) .prepare(self.context()); if render.is_empty() { None From 9eec6f88e25be12233630727e55bb28ef72ab414 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 23 Jul 2023 07:51:12 +0200 Subject: [PATCH 464/853] =?UTF-8?q?=F0=9F=92=A5=20Replace=20Basic=20theme?= =?UTF-8?q?=20by=20DefaultTheme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/config/local.toml | 1 + pagetop/config/settings.predefined.toml | 2 +- pagetop/src/config.rs | 4 ++-- pagetop/src/core/theme/default.rs | 6 +++++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drust/config/local.toml b/drust/config/local.toml index be142ade..410a913d 100644 --- a/drust/config/local.toml +++ b/drust/config/local.toml @@ -1,4 +1,5 @@ [app] +#theme = "Default" #theme = "Aliner" theme = "Bootsier" #theme = "Bulmix" diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index 1372ad98..cfdbfd75 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -2,7 +2,7 @@ name = "PageTop Application" description = "Developed with the amazing PageTop framework." # Tema predeterminado. -theme = "Basic" +theme = "Default" # Idioma (localización) predeterminado. language = "en-US" # Dirección predeterminada para el texto: "ltr", "rtl" o "auto". diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index be332e00..53533905 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -182,7 +182,7 @@ pub struct App { /// Por defecto: *"Modular web solutions made simple with PageTop."*. pub description: String, /// Tema predeterminado. - /// Por defecto: *"Basic"*. + /// Por defecto: *"Default"*. pub theme: String, /// Idioma (localización) predeterminado. /// Por defecto: *"en-US"*. @@ -284,7 +284,7 @@ default_settings!( // [app] "app.name" => "PageTop App", "app.description" => "Modular web solutions made simple with PageTop.", - "app.theme" => "Basic", + "app.theme" => "Default", "app.language" => "en-US", "app.direction" => "ltr", "app.startup_banner" => "Slant", diff --git a/pagetop/src/core/theme/default.rs b/pagetop/src/core/theme/default.rs index 4444f27a..059e8f40 100644 --- a/pagetop/src/core/theme/default.rs +++ b/pagetop/src/core/theme/default.rs @@ -1,4 +1,4 @@ -use crate::core::component::ContextOp; +use crate::core::component::{l10n::L10n, ContextOp}; use crate::core::module::ModuleTrait; use crate::core::theme::{ThemeRef, ThemeTrait}; use crate::html::{Favicon, StyleSheet}; @@ -17,6 +17,10 @@ impl ModuleTrait for DefaultTheme { THEME_DEFAULT } + fn name(&self) -> L10n { + L10n::n("Default") + } + fn theme(&self) -> Option<ThemeRef> { Some(&DefaultTheme) } From 689a22e51a7f21b0b2f055892dc3b015ce36548c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 23 Jul 2023 13:57:09 +0200 Subject: [PATCH 465/853] =?UTF-8?q?=E2=9C=A8=20Add=20ISO=208601=20date=20a?= =?UTF-8?q?nd=20time=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 1 + pagetop/src/datetime.rs | 4 ++++ pagetop/src/lib.rs | 4 ++++ pagetop/src/prelude.rs | 2 ++ 4 files changed, 11 insertions(+) create mode 100644 pagetop/src/datetime.rs diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index a586c23e..0ad6827d 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -33,6 +33,7 @@ sqlite = ["database", "sea-orm/sqlx-sqlite"] [dependencies] async-trait = "0.1.68" +chrono = "0.4.26" concat-string = "1.0.1" figlet-rs = "0.1.5" itoa = "1.0.6" diff --git a/pagetop/src/datetime.rs b/pagetop/src/datetime.rs new file mode 100644 index 00000000..618ce05c --- /dev/null +++ b/pagetop/src/datetime.rs @@ -0,0 +1,4 @@ +//! PageTop uses the [Chrono](https://docs.rs/chrono) Rust library to add +//! [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time related data. + +pub use chrono::prelude::*; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 36892954..96507a3a 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -22,6 +22,8 @@ //! //! * HTML en código ([`html`]). //! +//! * [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time handling ([`datetime`]). +//! //! * Acceso unificado y normalizado a base de datos ([`db`]). //! //! * Tipos y funciones esenciales para crear acciones, componentes, módulos y temas ([`core`]). @@ -135,6 +137,8 @@ pub mod trace; pub mod locale; // HTML en código. pub mod html; +// Date and time for PageTop. +pub mod datetime; // Acceso a base de datos. #[cfg_attr(docsrs, doc(cfg(feature = "database")))] diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index e61d2df8..c6c62f7a 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -22,6 +22,8 @@ pub use crate::locale::*; pub use crate::html::*; +pub use crate::datetime::*; + #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; From e316e9aa916aba848ed6b1ae79f463cb86ea9b80 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 25 Jul 2023 20:02:50 +0200 Subject: [PATCH 466/853] =?UTF-8?q?=F0=9F=9A=A7=20New=20into=5Fstring()=20?= =?UTF-8?q?methods=20for=20L10n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/src/lib.rs | 2 +- pagetop/src/core/component/l10n.rs | 8 ++++++-- pagetop/src/html.rs | 8 ++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 28e4c056..ae0d8824 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -142,7 +142,7 @@ fn about_pagetop() -> Container { .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALES_HOMEDEMO))) .with_component(Paragraph::with( L10n::e("pagetop_text3", &LOCALES_HOMEDEMO) - .with_arg("href", "https://docs.rs/pagetop/latest/pagetop".to_string()), + .with_arg("href", "https://docs.rs/pagetop/latest/pagetop"), )), ), ) diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs index 5829c943..d014dea7 100644 --- a/pagetop/src/core/component/l10n.rs +++ b/pagetop/src/core/component/l10n.rs @@ -96,8 +96,8 @@ impl L10n { } #[fn_builder] - pub fn alter_arg(&mut self, arg: &'static str, value: String) -> &mut Self { - self.args.insert(arg, value); + pub fn alter_arg(&mut self, arg: &'static str, value: impl Into<String>) -> &mut Self { + self.args.insert(arg, value.into()); self } @@ -115,4 +115,8 @@ impl L10n { pub fn args(&self) -> &HashMap<&str, String> { &self.args } + + pub fn into_string(&self, cx: &mut Context) -> Option<String> { + self.prepare_component(cx).into_string() + } } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index c0ebacc5..a67d8274 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -39,4 +39,12 @@ impl PrepareMarkup { PrepareMarkup::With(markup) => markup, } } + + pub fn into_string(self) -> Option<String> { + match self { + PrepareMarkup::None => None, + PrepareMarkup::Text(text) => Some(text.to_string()), + PrepareMarkup::With(markup) => Some(markup.into_string()), + } + } } From a88de76df838282c3a9ade84cbefc035de0f3edf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 25 Jul 2023 21:44:33 +0200 Subject: [PATCH 467/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/src/lib.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 86e3c3d1..1af07cd9 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -6,8 +6,13 @@ static_locales!(LOCALES_JQUERY); static_files!(jquery); -const PARAM_JQUERY: &str = "jquery.js"; +// Library version. +const VERSION_JQUERY: &str = "3.6.0"; +// Context parameter. +const PARAM_JQUERY: &str = "jquery.lib"; + +/// Implements [`ModuleTrait`](pagetop::core::module::ModuleTrait) and specific module API. pub struct JQuery; impl ModuleTrait for JQuery { @@ -48,7 +53,7 @@ fn after_prepare_body(page: &mut Page) { if let Some(true) = page.context().get_param::<bool>(PARAM_JQUERY) { page.context().alter(ContextOp::AddJavaScript( JavaScript::at("/jquery/jquery.min.js") - .with_version("3.6.0") + .with_version(VERSION_JQUERY) .with_weight(-99) .with_mode(ModeJS::Normal), )); From 86311e4aee30502e7ef6f42c83211ed90ae07f6c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 25 Jul 2023 21:45:35 +0200 Subject: [PATCH 468/853] =?UTF-8?q?=F0=9F=9A=A7=20[megamenu]=20Minimal=20i?= =?UTF-8?q?s=20not=20required?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 1 - pagetop-megamenu/src/lib.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index d359420e..365febcb 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -16,7 +16,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } -pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" [build-dependencies] diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 89e8345b..e93eef75 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -14,7 +14,7 @@ impl ModuleTrait for MegaMenu { } fn dependencies(&self) -> Vec<ModuleRef> { - vec![&pagetop_jquery::JQuery, &pagetop_minimal::Minimal] + vec![&pagetop_jquery::JQuery] } fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { From 5b9a53cbc69a565363d746fd0c2a8e1717da87a3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 25 Jul 2023 21:50:23 +0200 Subject: [PATCH 469/853] =?UTF-8?q?=E2=9C=A8=20[minimal]=20Add=20PoweredBy?= =?UTF-8?q?=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component.rs | 2 + pagetop-minimal/src/component/block.rs | 4 +- pagetop-minimal/src/component/poweredby.rs | 143 ++++++++++++++++++ pagetop-minimal/src/lib.rs | 37 ++++- pagetop-minimal/src/locale/en-US/module.ftl | 6 + pagetop-minimal/src/locale/es-ES/module.ftl | 6 + pagetop-minimal/src/module.rs | 1 - pagetop-minimal/src/module/menu.rs | 21 --- .../src/module/menu/locales/en-US/menu.ftl | 2 - .../src/module/menu/locales/es-ES/menu.ftl | 2 - pagetop-minimal/static/css/minimal.css | 10 ++ pagetop-minimal/static/pagetop-logo.svg | 14 ++ 12 files changed, 219 insertions(+), 29 deletions(-) create mode 100644 pagetop-minimal/src/component/poweredby.rs create mode 100644 pagetop-minimal/src/locale/en-US/module.ftl create mode 100644 pagetop-minimal/src/locale/es-ES/module.ftl delete mode 100644 pagetop-minimal/src/module.rs delete mode 100644 pagetop-minimal/src/module/menu.rs delete mode 100644 pagetop-minimal/src/module/menu/locales/en-US/menu.ftl delete mode 100644 pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl create mode 100644 pagetop-minimal/static/css/minimal.css create mode 100644 pagetop-minimal/static/pagetop-logo.svg diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 222993aa..1aeef5fb 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -15,6 +15,8 @@ mod image; pub use image::{Image, COMPONENT_IMAGE}; mod block; pub use block::{Block, COMPONENT_BLOCK}; +mod poweredby; +pub use poweredby::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; pub mod form_element; pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index ad8c9047..26de537f 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -46,9 +46,9 @@ impl ComponentTrait for Block { PrepareMarkup::With(html! { div id=(id) class=[self.classes().get()] { @if let Some(title) = self.title().get() { - h2 class="block__title" { (title) } + h2 class="block-title" { (title) } } - div class="block__body" { + div class="block-body" { (self.components().prepare(cx)) } } diff --git a/pagetop-minimal/src/component/poweredby.rs b/pagetop-minimal/src/component/poweredby.rs new file mode 100644 index 00000000..e50f3b3c --- /dev/null +++ b/pagetop-minimal/src/component/poweredby.rs @@ -0,0 +1,143 @@ +use crate::{Minimal, LOCALES_MINIMAL}; + +use pagetop::prelude::*; + +create_handle!(COMPONENT_POWEREDBY); + +#[derive(Default, Eq, PartialEq)] +pub enum PoweredByLogo { + #[default] + None, + Color, + LineDark, + LineLight, + Line(u8, u8, u8), +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct PoweredBy { + weight : Weight, + renderable: Renderable, + copyright : Option<String>, + logo : PoweredByLogo, +} + +impl ComponentTrait for PoweredBy { + fn new() -> Self { + let year = Utc::now().format("%Y").to_string(); + let c = concat_string!(year, " © ", config::SETTINGS.app.name); + PoweredBy { + copyright: Some(c), + ..Default::default() + } + } + + fn handle(&self) -> Handle { + COMPONENT_POWEREDBY + } + + fn id(&self) -> Option<String> { + Some("poweredby".to_owned()) + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + Minimal.load_assets(cx); + + let mut credits = L10n::e("poweredby_pagetop", &LOCALES_MINIMAL).with_arg( + "pagetop_link", + "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", + ); + + let logo = match self.logo() { + PoweredByLogo::Color => { + let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); + html! { + (" ") + span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { + img src="/minimal/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} + } + } + } + PoweredByLogo::LineDark => self.logo_line(10, 11, 9, cx), + PoweredByLogo::LineLight => self.logo_line(255, 255, 255, cx), + PoweredByLogo::Line(r, g, b) => self.logo_line(*r, *g, *b, cx), + _ => html! {}, + }; + + PrepareMarkup::With(html! { + div id=[self.id()] { + @if let Some(c) = self.copyright() { + span class="copyright" { (c) (".") } (" ") + } + span class="powered" { (credits.prepare(cx)) (logo) } + } + }) + } +} + +impl PoweredBy { + // PoweredBy BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_copyright(&mut self, copyright: Option<impl Into<String>>) -> &mut Self { + self.copyright = match copyright { + Some(c) => Some(c.into()), + _ => None, + }; + self + } + + #[fn_builder] + pub fn alter_logo(&mut self, logo: PoweredByLogo) -> &mut Self { + self.logo = logo; + self + } + + // PoweredBy GETTERS. + + pub fn copyright(&self) -> &Option<String> { + &self.copyright + } + + pub fn logo(&self) -> &PoweredByLogo { + &self.logo + } + + // PoweredBy PRIVATE. + + fn logo_line(&self, r: u8, g: u8, b: u8, cx: &mut Context) -> Markup { + let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); + let logo_rgb = format!("rgb({},{},{})", r, g, b); + html! { + (" ") + span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { + svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { + path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill=(logo_rgb) d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill=(logo_rgb) d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} + } + } + } + } +} diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index b0d14ac3..37ecd1a4 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -1,12 +1,19 @@ use pagetop::prelude::*; pub mod component; -pub mod module; create_handle!(MODULE_MINIMAL); +static_locales!(LOCALES_MINIMAL); + static_files!(minimal); +// Library version. +const VERSION_MINIMAL: &str = env!("CARGO_PKG_VERSION"); + +// Context parameter. +const PARAM_MINIMAL_ASSETS: &str = "minimal.assets"; + pub struct Minimal; impl ModuleTrait for Minimal { @@ -14,7 +21,35 @@ impl ModuleTrait for Minimal { MODULE_MINIMAL } + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALES_MINIMAL) + } + + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALES_MINIMAL) + } + + fn actions(&self) -> Vec<Action> { + vec![action!(ActionAfterPrepareBody => after_prepare_body, 99)] + } + fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { serve_static_files!(cfg, "/minimal", minimal); } } + +impl Minimal { + pub(crate) fn load_assets(&self, cx: &mut Context) -> &Self { + cx.set_param::<bool>(PARAM_MINIMAL_ASSETS, true); + self + } +} + +fn after_prepare_body(page: &mut Page) { + if let Some(true) = page.context().get_param::<bool>(PARAM_MINIMAL_ASSETS) { + page.context().alter(ContextOp::AddStyleSheet( + StyleSheet::at("/minimal/css/minimal.css") + .with_version(VERSION_MINIMAL) + )); + } +} diff --git a/pagetop-minimal/src/locale/en-US/module.ftl b/pagetop-minimal/src/locale/en-US/module.ftl new file mode 100644 index 00000000..28ef3779 --- /dev/null +++ b/pagetop-minimal/src/locale/en-US/module.ftl @@ -0,0 +1,6 @@ +module_name = Minimal components +module_description = Minimal set of components for page composition. + +# PoweredBy component. +poweredby_pagetop = Powered by {$pagetop_link} +pagetop_logo = PageTop logo diff --git a/pagetop-minimal/src/locale/es-ES/module.ftl b/pagetop-minimal/src/locale/es-ES/module.ftl new file mode 100644 index 00000000..3eeb46df --- /dev/null +++ b/pagetop-minimal/src/locale/es-ES/module.ftl @@ -0,0 +1,6 @@ +module_name = Componentes Minimal +module_description = Conjunto mínimo de componentes para la composición de páginas. + +# PoweredBy component. +poweredby_pagetop = Funciona con {$pagetop_link} +pagetop_logo = Logotipo de PageTop diff --git a/pagetop-minimal/src/module.rs b/pagetop-minimal/src/module.rs deleted file mode 100644 index b9a0e3e0..00000000 --- a/pagetop-minimal/src/module.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod menu; diff --git a/pagetop-minimal/src/module/menu.rs b/pagetop-minimal/src/module/menu.rs deleted file mode 100644 index 49ed13d7..00000000 --- a/pagetop-minimal/src/module/menu.rs +++ /dev/null @@ -1,21 +0,0 @@ -use pagetop::prelude::*; - -create_handle!(MODULE_MENU); - -static_locales!(LOCALES_MENU in "src/module/menu/locales"); - -pub struct Menu; - -impl ModuleTrait for Menu { - fn handle(&self) -> Handle { - MODULE_MENU - } - - fn name(&self) -> L10n { - L10n::t("module_name", &LOCALES_MENU) - } - - fn description(&self) -> L10n { - L10n::t("module_description", &LOCALES_MENU) - } -} diff --git a/pagetop-minimal/src/module/menu/locales/en-US/menu.ftl b/pagetop-minimal/src/module/menu/locales/en-US/menu.ftl deleted file mode 100644 index b35e9677..00000000 --- a/pagetop-minimal/src/module/menu/locales/en-US/menu.ftl +++ /dev/null @@ -1,2 +0,0 @@ -module_name = Menu -module_description = ... diff --git a/pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl b/pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl deleted file mode 100644 index a36de8ac..00000000 --- a/pagetop-minimal/src/module/menu/locales/es-ES/menu.ftl +++ /dev/null @@ -1,2 +0,0 @@ -module_name = Menú -module_description = ... diff --git a/pagetop-minimal/static/css/minimal.css b/pagetop-minimal/static/css/minimal.css new file mode 100644 index 00000000..8f674cbf --- /dev/null +++ b/pagetop-minimal/static/css/minimal.css @@ -0,0 +1,10 @@ +/* PoweredBy component */ +#poweredby { + text-align: center; +} +#poweredby .pagetop-logo img, +#poweredby .pagetop-logo svg { + margin-left: .275em; + height: 1.275em; + vertical-align: middle; +} diff --git a/pagetop-minimal/static/pagetop-logo.svg b/pagetop-minimal/static/pagetop-logo.svg new file mode 100644 index 00000000..3666bf3a --- /dev/null +++ b/pagetop-minimal/static/pagetop-logo.svg @@ -0,0 +1,14 @@ +<svg width="16.14mm" height="16.14mm" viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" aria-label="PageTop Logo" role="img"> +<path fill="rgb(255,184,75)" d="M 633,61 L 633,61 C 579,61 527,75 480,102 433,129 395,167 368,214 341,261 327,313 327,367 L 327,1244 327,1245 C 327,1299 341,1351 368,1398 395,1445 433,1483 480,1510 527,1537 579,1551 633,1551 L 982,1550 982,1551 C 1036,1551 1088,1537 1135,1510 1182,1483 1220,1445 1247,1398 1274,1351 1288,1299 1288,1245 L 1288,367 1288,367 1288,367 C 1288,313 1274,261 1247,214 1220,167 1182,129 1135,102 1088,75 1036,61 982,61 L 633,61 Z" /> +<path fill="rgb(158,96,0)" d="M 1389,573 L 1328,573 1328,460 1449,460 1449,573 1389,573 Z M 1491,627 L 1430,627 1430,404 1551,404 1551,627 1491,627 Z M 222,573 L 161,573 161,460 282,460 282,573 222,573 Z M 120,627 L 59,627 59,404 180,404 180,627 120,627 Z" /> +<path fill="rgb(150,0,184)" d="M 678,1040 L 678,1040 C 645,1040 612,1049 583,1065 554,1082 530,1106 513,1135 497,1164 488,1197 488,1230 L 488,1230 488,1230 C 488,1263 497,1296 513,1325 530,1354 554,1378 583,1395 612,1411 645,1420 678,1420 L 940,1420 940,1420 C 973,1420 1006,1411 1035,1395 1064,1378 1088,1354 1105,1325 1121,1296 1130,1263 1130,1230 L 1130,1230 1130,1230 1130,1230 C 1130,1197 1121,1164 1105,1135 1088,1106 1064,1082 1035,1065 1006,1049 973,1040 940,1040 L 678,1040 Z M 488,1040 L 488,1040 488,1040 488,1040 488,1040 488,1040 488,1238 488,1238 488,1238 488,1238 488,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1040 1130,1040 1130,1040 1130,1040 1130,1040 488,1040 Z" /> +<path fill="rgb(255,255,255)" d="M 518,1128 L 488,1128 488,1066 547,1066 547,1128 518,1128 Z M 966,1128 L 908,1128 908,1066 1024,1066 1024,1128 966,1128 Z" /> +<path fill="rgb(221,255,149)" d="M 898,71 C 940,48 987,36 1035,36 1086,36 1137,50 1181,77 1226,104 1263,142 1289,189 1314,236 1328,288 1328,342 1328,396 1314,448 1289,495 1281,509 1272,522 1262,535 L 898,71 Z M 1337,429 C 1307,460 1272,480 1233,488 1192,496 1148,490 1107,470 1066,451 1029,418 999,375 969,332 948,281 938,227 927,173 928,117 940,66 943,51 948,36 953,22 L 1337,429 Z" /> +<path fill="rgb(146,128,99)" d="M 703,99 C 717,121 722,149 719,178 715,208 702,238 682,267 661,295 634,320 602,340 571,360 536,373 501,379 467,385 434,383 405,373 377,363 355,346 341,323 327,301 322,273 325,244 329,214 342,184 362,155 383,127 410,102 442,82 473,62 508,49 543,43 577,37 610,39 639,49 667,59 689,76 703,99 L 703,99 Z" /> +<path fill="rgb(146,128,99)" d="M 672,550 C 683,568 685,590 678,615 671,640 655,668 632,694 609,720 580,745 547,765 514,785 479,801 446,810 412,819 381,821 355,816 329,811 310,799 299,782 288,765 286,742 293,717 301,692 316,665 339,638 362,612 391,588 424,567 457,547 492,531 526,523 559,514 591,511 616,516 642,521 661,533 672,550 L 672,550 Z" /> +<path fill="rgb(146,128,99)" d="M 455,160 L 456,160 C 430,160 404,167 381,180 359,193 340,212 327,234 314,257 307,283 307,309 L 307,580 307,580 C 307,606 314,632 327,655 340,677 359,696 381,709 404,722 430,729 456,729 L 529,729 529,729 C 555,729 581,722 604,709 626,696 645,677 658,655 671,632 678,606 678,580 L 677,308 678,309 678,309 C 678,283 671,257 658,234 645,212 626,193 604,180 581,167 555,160 529,160 L 455,160 Z" /> +<path fill="rgb(240,0,0)" d="M 698,1332 L 699,1332 C 696,1332 694,1333 691,1334 689,1335 687,1337 686,1339 685,1342 684,1344 684,1347 L 684,1405 684,1405 C 684,1408 685,1410 686,1413 687,1415 689,1417 691,1418 694,1419 696,1420 699,1420 L 914,1419 914,1420 C 917,1420 919,1419 922,1418 924,1417 926,1415 927,1413 928,1410 929,1408 929,1405 L 929,1346 929,1347 929,1347 C 929,1344 928,1342 927,1339 926,1337 924,1335 922,1334 919,1333 917,1332 914,1332 L 698,1332 Z M 643,780 C 643,797 638,814 630,830 621,845 608,858 593,867 577,875 560,880 543,880 525,880 508,875 492,867 477,858 464,845 455,830 447,814 442,797 442,780 442,762 447,745 455,729 464,714 477,701 492,692 508,684 525,679 542,679 560,679 577,684 593,692 608,701 621,714 630,729 638,745 643,762 643,779 L 643,780 Z M 1171,780 C 1171,797 1166,814 1158,830 1149,845 1136,858 1121,867 1105,875 1088,880 1071,880 1053,880 1036,875 1020,867 1005,858 992,845 983,830 975,814 970,797 970,780 970,762 975,745 983,729 992,714 1005,701 1020,692 1036,684 1053,679 1071,679 1088,679 1105,684 1121,692 1136,701 1149,714 1158,729 1166,745 1171,762 1171,779 L 1171,780 Z" /> +<path fill="rgb(10,11,9)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" /> +<path fill="rgb(10,11,9)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" /> +<path fill="rgb(10,11,9)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" /> +</svg> From d786ea10526be1e74a6576d4280ef5c2e8e71f4c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 25 Jul 2023 21:57:45 +0200 Subject: [PATCH 470/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Pas?= =?UTF-8?q?ses=20fmt=20and=20clippy=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/poweredby.rs | 5 +---- pagetop-minimal/src/lib.rs | 3 +-- pagetop/src/core/component/pack.rs | 6 ++---- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/pagetop-minimal/src/component/poweredby.rs b/pagetop-minimal/src/component/poweredby.rs index e50f3b3c..0328a06c 100644 --- a/pagetop-minimal/src/component/poweredby.rs +++ b/pagetop-minimal/src/component/poweredby.rs @@ -101,10 +101,7 @@ impl PoweredBy { #[fn_builder] pub fn alter_copyright(&mut self, copyright: Option<impl Into<String>>) -> &mut Self { - self.copyright = match copyright { - Some(c) => Some(c.into()), - _ => None, - }; + self.copyright = copyright.map(|c| c.into()); self } diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 37ecd1a4..5be4cc75 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -48,8 +48,7 @@ impl Minimal { fn after_prepare_body(page: &mut Page) { if let Some(true) = page.context().get_param::<bool>(PARAM_MINIMAL_ASSETS) { page.context().alter(ContextOp::AddStyleSheet( - StyleSheet::at("/minimal/css/minimal.css") - .with_version(VERSION_MINIMAL) + StyleSheet::at("/minimal/css/minimal.css").with_version(VERSION_MINIMAL), )); } } diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index 9fe79e40..be3540ff 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -55,10 +55,8 @@ impl PackComponents { pub(crate) fn merge(packs: &[Option<&PackComponents>]) -> Self { let mut pack = PackComponents::default(); - for p in packs { - if let Some(p) = p { - pack.0.append(&mut p.0.clone()); - } + for p in packs.iter().flatten() { + pack.0.append(&mut p.0.clone()); } pack } From 1e554aac68294a0b0922a56f4d509413226533ba Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 26 Jul 2023 15:03:18 +0200 Subject: [PATCH 471/853] =?UTF-8?q?=F0=9F=92=A5=20Rename=20create=5Fhandle?= =?UTF-8?q?!()=20to=20new=5Fhandle!()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- examples/basics/hello-name/src/main.rs | 2 +- examples/basics/hello-world/src/main.rs | 2 +- pagetop-admin/src/lib.rs | 2 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-megamenu/src/component.rs | 4 ++-- pagetop-megamenu/src/lib.rs | 2 +- pagetop-minimal/src/component/anchor.rs | 2 +- pagetop-minimal/src/component/block.rs | 2 +- pagetop-minimal/src/component/container.rs | 2 +- pagetop-minimal/src/component/form_element/button.rs | 2 +- pagetop-minimal/src/component/form_element/date.rs | 2 +- pagetop-minimal/src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/form_element/hidden.rs | 2 +- pagetop-minimal/src/component/form_element/input.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/icon.rs | 2 +- pagetop-minimal/src/component/image.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 2 +- pagetop-minimal/src/component/poweredby.rs | 2 +- pagetop-minimal/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/core/component.rs | 4 ++-- pagetop/src/core/component/html.rs | 4 ++-- pagetop/src/core/component/l10n.rs | 4 ++-- pagetop/src/core/theme/default.rs | 4 ++-- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 2 +- pagetop/src/response/fatal_error/error403.rs | 4 ++-- pagetop/src/response/fatal_error/error404.rs | 4 ++-- pagetop/src/response/page/action/after_prepare_body.rs | 4 ++-- pagetop/src/response/page/action/before_prepare_body.rs | 4 ++-- pagetop/src/util.rs | 2 +- 40 files changed, 49 insertions(+), 49 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index a6944ba9..306b3c02 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(APP_DRUST); +new_handle!(APP_DRUST); struct Drust; diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index b95494e4..f5a2d46b 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(APP_HELLO_NAME); +new_handle!(APP_HELLO_NAME); struct HelloName; diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index c61d5b47..905d4b76 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(APP_HELLO_WORLD); +new_handle!(APP_HELLO_WORLD); struct HelloWorld; diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index ed3e8474..351cd7cf 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(MODULE_ADMIN); +new_handle!(MODULE_ADMIN); static_locales!(LOCALES_ADMIN); diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 479ab499..303096ef 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(THEME_ALINER); +new_handle!(THEME_ALINER); static_files!(aliner); diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index f8ce573c..d8067b24 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; -create_handle!(THEME_BOOTSIER); +new_handle!(THEME_BOOTSIER); static_locales!(LOCALES_BOOTSIER); diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 0cadab56..4467cdb5 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; use pagetop_minimal::component::*; -create_handle!(THEME_BULMIX); +new_handle!(THEME_BULMIX); static_files!(bulmix); diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index ae0d8824..79ec44f4 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -create_handle!(MODULE_HOMEDEMO); +new_handle!(MODULE_HOMEDEMO); static_locales!(LOCALES_HOMEDEMO); diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 1af07cd9..efda4aa8 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(MODULE_JQUERY); +new_handle!(MODULE_JQUERY); static_locales!(LOCALES_JQUERY); diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 0405f179..07f44038 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; -create_handle!(COMPONENT_MEGAMENUITEM); +new_handle!(COMPONENT_MEGAMENUITEM); type Label = OneComponent<L10n>; type Content = OneComponent<L10n>; @@ -144,7 +144,7 @@ impl MegaMenuItem { // MegaMenu. -create_handle!(COMPONENT_MEGAMENU); +new_handle!(COMPONENT_MEGAMENU); actions_for_component!(MegaMenu); diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index e93eef75..4afcad4d 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; pub mod component; -create_handle!(MODULE_MEGAMENU); +new_handle!(MODULE_MEGAMENU); static_files!(megamenu); diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index b09b3e77..e35d7599 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::Icon; -create_handle!(COMPONENT_ANCHOR); +new_handle!(COMPONENT_ANCHOR); #[derive(Default)] pub enum AnchorType { diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 26de537f..823bf2b3 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_BLOCK); +new_handle!(COMPONENT_BLOCK); actions_for_component!(Block); diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 8e954974..67164b88 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_CONTAINER); +new_handle!(COMPONENT_CONTAINER); actions_for_component!(Container); diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index df0130fe..1ccd670e 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_BUTTON); +new_handle!(COMPONENT_BUTTON); #[derive(Default)] pub enum ButtonType { diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 81e928fb..0bccb47d 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_DATE); +new_handle!(COMPONENT_DATE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index ba12e070..d3e2f2fb 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_FORM); +new_handle!(COMPONENT_FORM); actions_for_component!(Form); diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index 925f143c..9aeeeed3 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_HIDDEN); +new_handle!(COMPONENT_HIDDEN); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index af6ab03b..c50c15d2 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_INPUT); +new_handle!(COMPONENT_INPUT); #[derive(Default)] pub enum InputType { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index b9c9e3a8..ec747ac1 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_COLUMN); +new_handle!(COMPONENT_COLUMN); actions_for_component!(Column); diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 4138d77b..f150bbc2 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::grid; -create_handle!(COMPONENT_ROW); +new_handle!(COMPONENT_ROW); actions_for_component!(Row); diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 8e4de53f..dd5444dc 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_HEADING); +new_handle!(COMPONENT_HEADING); #[derive(Default)] pub enum HeadingType { diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 2a77b600..081be948 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_ICON); +new_handle!(COMPONENT_ICON); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index 72d7b351..dee86745 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_IMAGE); +new_handle!(COMPONENT_IMAGE); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index c5d0716f..09e85ddb 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(COMPONENT_PARAGRAPH); +new_handle!(COMPONENT_PARAGRAPH); #[derive(Default)] pub enum ParagraphDisplay { diff --git a/pagetop-minimal/src/component/poweredby.rs b/pagetop-minimal/src/component/poweredby.rs index 0328a06c..6069f8c2 100644 --- a/pagetop-minimal/src/component/poweredby.rs +++ b/pagetop-minimal/src/component/poweredby.rs @@ -2,7 +2,7 @@ use crate::{Minimal, LOCALES_MINIMAL}; use pagetop::prelude::*; -create_handle!(COMPONENT_POWEREDBY); +new_handle!(COMPONENT_POWEREDBY); #[derive(Default, Eq, PartialEq)] pub enum PoweredByLogo { diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 5be4cc75..99965875 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; pub mod component; -create_handle!(MODULE_MINIMAL); +new_handle!(MODULE_MINIMAL); static_locales!(LOCALES_MINIMAL); diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index ffe40c72..c83f71d1 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -create_handle!(MODULE_NODE); +new_handle!(MODULE_NODE); static_locales!(LOCALES_NODE); diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 60384843..7ec57e4c 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_minimal::component::*; -create_handle!(MODULE_USER); +new_handle!(MODULE_USER); static_locales!(LOCALES_USER); diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 615a6cca..833aa16c 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -28,7 +28,7 @@ macro_rules! actions_for_component { // ACTION BEFORE PREPARE COMPONENT // ************************************************************************************* - $crate::create_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); + $crate::new_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); pub struct [<BeforePrepare $Component>] { action: Option<[<Action $Component>]>, @@ -87,7 +87,7 @@ macro_rules! actions_for_component { // ACTION AFTER PREPARE COMPONENT // ************************************************************************************* - $crate::create_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); + $crate::new_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); pub struct [<AfterPrepare $Component>] { action: Option<[<Action $Component>]>, diff --git a/pagetop/src/core/component/html.rs b/pagetop/src/core/component/html.rs index 8cf0d5a3..2b8a7241 100644 --- a/pagetop/src/core/component/html.rs +++ b/pagetop/src/core/component/html.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup, PrepareMarkup}; -use crate::{create_handle, fn_builder, Handle}; +use crate::{fn_builder, new_handle, Handle}; -create_handle!(COMPONENT_HTML); +new_handle!(COMPONENT_HTML); #[derive(Default)] pub struct Html(Markup); diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/core/component/l10n.rs index d014dea7..dcde3362 100644 --- a/pagetop/src/core/component/l10n.rs +++ b/pagetop/src/core/component/l10n.rs @@ -1,11 +1,11 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PreEscaped, PrepareMarkup}; use crate::locale::{Loader, Locales}; -use crate::{create_handle, fn_builder, Handle}; +use crate::{fn_builder, new_handle, Handle}; use std::collections::HashMap; -create_handle!(COMPONENT_L10N); +new_handle!(COMPONENT_L10N); #[derive(Default)] pub enum L10nOp { diff --git a/pagetop/src/core/theme/default.rs b/pagetop/src/core/theme/default.rs index 059e8f40..523fab9e 100644 --- a/pagetop/src/core/theme/default.rs +++ b/pagetop/src/core/theme/default.rs @@ -4,9 +4,9 @@ use crate::core::theme::{ThemeRef, ThemeTrait}; use crate::html::{Favicon, StyleSheet}; use crate::response::page::Page; use crate::service; -use crate::{create_handle, serve_static_files, static_files, Handle}; +use crate::{new_handle, serve_static_files, static_files, Handle}; -create_handle!(THEME_DEFAULT); +new_handle!(THEME_DEFAULT); static_files!(theme); diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 96507a3a..e9186e64 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -44,7 +44,7 @@ //! ```rust //! use pagetop::prelude::*; //! -//! create_handle!(APP_HELLO_WORLD); +//! new_handle!(APP_HELLO_WORLD); //! //! struct HelloWorld; //! diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index c6c62f7a..abc19629 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -9,7 +9,7 @@ pub use crate::{Handle, HashMapResources, LazyStatic, ResultExt, Weight}; // Funciones y macros útiles. pub use crate::util; pub use crate::{action, actions_for_component}; -pub use crate::{create_handle, default_settings, kv}; +pub use crate::{default_settings, kv, new_handle}; pub use crate::{serve_static_files, static_files, static_locales}; // API. diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index 376234c2..d21e3b23 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::{create_handle, Handle}; +use crate::{new_handle, Handle}; -create_handle!(ERROR_403); +new_handle!(ERROR_403); pub struct Error403; diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index c9c9051d..e1f7827b 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::{create_handle, Handle}; +use crate::{new_handle, Handle}; -create_handle!(ERROR_404); +new_handle!(ERROR_404); pub struct Error404; diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/response/page/action/after_prepare_body.rs index 719d7752..ff74cedc 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -1,9 +1,9 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; -use crate::{create_handle, Handle, Weight}; +use crate::{new_handle, Handle, Weight}; -create_handle!(ACTION_AFTER_PREPARE_BODY for Action); +new_handle!(ACTION_AFTER_PREPARE_BODY for Action); pub struct ActionAfterPrepareBody { action: Option<ActionPage>, diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/response/page/action/before_prepare_body.rs index 0c8d7907..715d8378 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -1,9 +1,9 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; use crate::response::page::action::ActionPage; use crate::response::page::Page; -use crate::{create_handle, Handle, Weight}; +use crate::{new_handle, Handle, Weight}; -create_handle!(ACTION_BEFORE_PREPARE_BODY for Action); +new_handle!(ACTION_BEFORE_PREPARE_BODY for Action); pub struct ActionBeforePrepareBody { action: Option<ActionPage>, diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index e2c47536..89a38392 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -106,7 +106,7 @@ macro_rules! default_settings { } #[macro_export] -macro_rules! create_handle { +macro_rules! new_handle { ( $HANDLE:ident ) => { /// Public constant handle to represent a unique PageTop building element. pub const $HANDLE: $crate::Handle = From 4fb7861ab0f5e9f3b9631b2f32c5e1fd2d972b5c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 26 Jul 2023 15:08:46 +0200 Subject: [PATCH 472/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/poweredby.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pagetop-minimal/src/component/poweredby.rs b/pagetop-minimal/src/component/poweredby.rs index 6069f8c2..a4caf17f 100644 --- a/pagetop-minimal/src/component/poweredby.rs +++ b/pagetop-minimal/src/component/poweredby.rs @@ -11,7 +11,7 @@ pub enum PoweredByLogo { Color, LineDark, LineLight, - Line(u8, u8, u8), + LineRGB(u8, u8, u8), } #[rustfmt::skip] @@ -49,14 +49,11 @@ impl ComponentTrait for PoweredBy { (self.renderable.check)(cx) } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + fn before_prepare_component(&mut self, cx: &mut Context) { Minimal.load_assets(cx); + } - let mut credits = L10n::e("poweredby_pagetop", &LOCALES_MINIMAL).with_arg( - "pagetop_link", - "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", - ); - + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let logo = match self.logo() { PoweredByLogo::Color => { let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); @@ -69,10 +66,15 @@ impl ComponentTrait for PoweredBy { } PoweredByLogo::LineDark => self.logo_line(10, 11, 9, cx), PoweredByLogo::LineLight => self.logo_line(255, 255, 255, cx), - PoweredByLogo::Line(r, g, b) => self.logo_line(*r, *g, *b, cx), + PoweredByLogo::LineRGB(r, g, b) => self.logo_line(*r, *g, *b, cx), _ => html! {}, }; + let mut credits = L10n::e("poweredby_pagetop", &LOCALES_MINIMAL).with_arg( + "pagetop_link", + "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", + ); + PrepareMarkup::With(html! { div id=[self.id()] { @if let Some(c) = self.copyright() { From 9f105ef81b6de7d1fb2240869d62c3f8cf3cdb47 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 30 Jul 2023 08:17:50 +0200 Subject: [PATCH 473/853] =?UTF-8?q?=E2=9C=A8=20Add=20redirections=20in=20H?= =?UTF-8?q?TTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/prelude.rs | 2 +- pagetop/src/response.rs | 4 +- pagetop/src/response/redirect.rs | 76 ++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 pagetop/src/response/redirect.rs diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index abc19629..4509536c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -38,6 +38,6 @@ pub use crate::service; pub use crate::service::HttpMessage; pub use crate::response::fatal_error::*; -pub use crate::response::{page::*, ResponseError}; +pub use crate::response::{page::*, redirect::*, ResponseError}; pub use crate::app::Application; diff --git a/pagetop/src/response.rs b/pagetop/src/response.rs index 985d918d..7878d767 100644 --- a/pagetop/src/response.rs +++ b/pagetop/src/response.rs @@ -1,7 +1,9 @@ -//! Tipos de respuestas a peticiones web. +//! Types of web request responses. pub use actix_web::ResponseError; pub mod page; +pub mod redirect; + pub mod fatal_error; diff --git a/pagetop/src/response/redirect.rs b/pagetop/src/response/redirect.rs new file mode 100644 index 00000000..eb2678a8 --- /dev/null +++ b/pagetop/src/response/redirect.rs @@ -0,0 +1,76 @@ +//! Perform redirections in HTTP. +//! +//! **URL redirection**, also known as *URL forwarding*, is a technique to give more than one URL +//! address to a web resource. HTTP has a response called ***HTTP redirect*** for this operation +//! (see [Redirections in HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections)). +//! +//! There are several types of redirects, sorted into three categories: +//! +//! * **Permanent redirections**. These redirections are meant to last forever. They imply that +//! the original URL should no longer be used, and replaced with the new one. Search engine +//! robots, RSS readers, and other crawlers will update the original URL for the resource. +//! +//! * **Temporary redirections**. Sometimes the requested resource can't be accessed from its +//! canonical location, but it can be accessed from another place. In this case, a temporary +//! redirect can be used. Search engine robots and other crawlers don't memorize the new, +//! temporary URL. Temporary redirections are also used when creating, updating, or deleting +//! resources, to show temporary progress pages. +//! +//! * **Special redirections**. + +use crate::service::HttpResponse; + +pub struct Redirect; + +impl Redirect { + /// Permanent redirection. Status Code **301**. GET methods unchanged. Others may or may not be + /// changed to GET. Typical for reorganization of a website. + pub fn moved(redirect_to_url: &str) -> HttpResponse { + HttpResponse::MovedPermanently() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Permanent redirection. Status Code **308**. Method and body not changed. Typical for + /// reorganization of a website, with non-GET links/operations. + pub fn permanent(redirect_to_url: &str) -> HttpResponse { + HttpResponse::PermanentRedirect() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Temporary redirection. Status Code **302**. GET methods unchanged. Others may or may not be + /// changed to GET. Used when the web page is temporarily unavailable for unforeseen reasons. + pub fn found(redirect_to_url: &str) -> HttpResponse { + HttpResponse::Found() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Temporary redirection. Status Code **303**. GET methods unchanged. Others changed to GET + /// (body lost). Used to redirect after a PUT or a POST, so that refreshing the result page + /// doesn't re-trigger the operation. + pub fn see_other(redirect_to_url: &str) -> HttpResponse { + HttpResponse::SeeOther() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Temporary redirection. Status Code **307**. Method and body not changed. The web page is + /// temporarily unavailable for unforeseen reasons. Better than [`found()`](found) when non-GET + /// operations are available on the site. + pub fn temporary(redirect_to_url: &str) -> HttpResponse { + HttpResponse::TemporaryRedirect() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Special redirection. Status Code **304**. Redirects a page to the locally cached copy (that + /// was stale). Sent for revalidated conditional requests. Indicates that the cached response is + /// still fresh and can be used. + pub fn not_modified(redirect_to_url: &str) -> HttpResponse { + HttpResponse::NotModified() + .append_header(("Location", redirect_to_url)) + .finish() + } +} From e237167da7fd50ba2ccc7c6fe867a0da530e172f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 30 Jul 2023 08:23:41 +0200 Subject: [PATCH 474/853] =?UTF-8?q?=F0=9F=9A=A7=20Literals=20don't=20need?= =?UTF-8?q?=20parentheses=20in=20html!{}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/anchor.rs | 2 +- pagetop-minimal/src/component/poweredby.rs | 6 +++--- pagetop/src/core/component/pack.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index e35d7599..fc471a63 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -79,7 +79,7 @@ impl ComponentTrait for Anchor { target=[target] { (self.left_icon().prepare(cx)) - (" ") span { (self.html().prepare(cx)) } (" ") + " " span { (self.html().prepare(cx)) } " " (self.right_icon().prepare(cx)) } }) diff --git a/pagetop-minimal/src/component/poweredby.rs b/pagetop-minimal/src/component/poweredby.rs index a4caf17f..fde6082e 100644 --- a/pagetop-minimal/src/component/poweredby.rs +++ b/pagetop-minimal/src/component/poweredby.rs @@ -58,7 +58,7 @@ impl ComponentTrait for PoweredBy { PoweredByLogo::Color => { let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); html! { - (" ") + " " span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { img src="/minimal/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} } @@ -78,7 +78,7 @@ impl ComponentTrait for PoweredBy { PrepareMarkup::With(html! { div id=[self.id()] { @if let Some(c) = self.copyright() { - span class="copyright" { (c) (".") } (" ") + span class="copyright" { (c) "." } " " } span class="powered" { (credits.prepare(cx)) (logo) } } @@ -129,7 +129,7 @@ impl PoweredBy { let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); let logo_rgb = format!("rgb({},{},{})", r, g, b); html! { - (" ") + " " span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index be3540ff..16831171 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -118,7 +118,7 @@ impl PackComponents { components.sort_by_key(|c| c.weight()); html! { @for c in components.iter() { - (" ")(c.prepare(cx))(" ") + " " (c.prepare(cx)) " " } } } From 10b496af2756a164cba69e769d77120905ea14ae Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 30 Jul 2023 08:25:07 +0200 Subject: [PATCH 475/853] =?UTF-8?q?=F0=9F=90=9B=20Fix=20file=20extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/src/locale/en-US/{module.flt => module.ftl} | 0 pagetop-jquery/src/locale/es-ES/{module.flt => module.ftl} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename pagetop-jquery/src/locale/en-US/{module.flt => module.ftl} (100%) rename pagetop-jquery/src/locale/es-ES/{module.flt => module.ftl} (100%) diff --git a/pagetop-jquery/src/locale/en-US/module.flt b/pagetop-jquery/src/locale/en-US/module.ftl similarity index 100% rename from pagetop-jquery/src/locale/en-US/module.flt rename to pagetop-jquery/src/locale/en-US/module.ftl diff --git a/pagetop-jquery/src/locale/es-ES/module.flt b/pagetop-jquery/src/locale/es-ES/module.ftl similarity index 100% rename from pagetop-jquery/src/locale/es-ES/module.flt rename to pagetop-jquery/src/locale/es-ES/module.ftl From aed120f96dc53d0b80b9fe8fc3841eaa845be778 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 30 Jul 2023 08:39:09 +0200 Subject: [PATCH 476/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20[megamenu]=20Upgra?= =?UTF-8?q?de=20to=20SmartMenus=201.2.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/{component.rs => component/item.rs} | 135 +------------- pagetop-megamenu/src/component/menu.rs | 160 +++++++++++++++++ pagetop-megamenu/src/lib.rs | 17 +- pagetop-megamenu/src/locale/en-US/module.ftl | 4 + pagetop-megamenu/src/locale/es-ES/module.ftl | 4 + pagetop-megamenu/static/css/menu.css | 58 ------ .../static/css/{menu-blue.css => sm-blue.css} | 0 .../css/{menu-clean.css => sm-clean.css} | 0 .../static/css/{menu-mint.css => sm-mint.css} | 0 .../css/{menu-simple.css => sm-simple.css} | 0 pagetop-megamenu/static/css/smartmenus.css | 170 ++++++++++++++++++ pagetop-megamenu/static/js/menu.min.js | 3 - pagetop-megamenu/static/js/smartmenus.min.js | 3 + 13 files changed, 359 insertions(+), 195 deletions(-) rename pagetop-megamenu/src/{component.rs => component/item.rs} (53%) create mode 100644 pagetop-megamenu/src/component/menu.rs create mode 100644 pagetop-megamenu/src/locale/en-US/module.ftl create mode 100644 pagetop-megamenu/src/locale/es-ES/module.ftl delete mode 100644 pagetop-megamenu/static/css/menu.css rename pagetop-megamenu/static/css/{menu-blue.css => sm-blue.css} (100%) rename pagetop-megamenu/static/css/{menu-clean.css => sm-clean.css} (100%) rename pagetop-megamenu/static/css/{menu-mint.css => sm-mint.css} (100%) rename pagetop-megamenu/static/css/{menu-simple.css => sm-simple.css} (100%) create mode 100644 pagetop-megamenu/static/css/smartmenus.css delete mode 100644 pagetop-megamenu/static/js/menu.min.js create mode 100644 pagetop-megamenu/static/js/smartmenus.min.js diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component/item.rs similarity index 53% rename from pagetop-megamenu/src/component.rs rename to pagetop-megamenu/src/component/item.rs index 07f44038..d2c75ae5 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component/item.rs @@ -1,5 +1,6 @@ use pagetop::prelude::*; -use pagetop_jquery::JQuery; + +use crate::component::MegaMenu; new_handle!(COMPONENT_MEGAMENUITEM); @@ -141,135 +142,3 @@ impl MegaMenuItem { &self.item_type } } - -// MegaMenu. - -new_handle!(COMPONENT_MEGAMENU); - -actions_for_component!(MegaMenu); - -#[rustfmt::skip] -#[derive(Default)] -pub struct MegaMenu { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - items : PackComponents, - template : String, -} - -impl ComponentTrait for MegaMenu { - fn new() -> Self { - MegaMenu::default().with_classes(ClassesOp::SetDefault, "sm sm-clean") - } - - fn handle(&self) -> Handle { - COMPONENT_MEGAMENU - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_megamenu(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/megamenu/css/menu.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddStyleSheet( - StyleSheet::at("/megamenu/css/menu-clean.css").with_version("1.1.1"), - )) - .alter(ContextOp::AddJavaScript( - JavaScript::at("/megamenu/js/menu.min.js").with_version("1.1.1"), - )); - JQuery.enable_jquery(cx); - - let id = cx.required_id::<MegaMenu>(self.id()); - - PrepareMarkup::With(html! { - ul id=(id) class=[self.classes().get()] { - (self.items().prepare(cx)) - } - script type="text/javascript" defer { - "jQuery(function(){jQuery('#" (id) "').smartmenus({" - "hideTimeout: 0," - "showTimeout: 80," - "});});" - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_megamenu(self, cx); - } -} - -impl MegaMenu { - // MegaMenu BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - pub fn with_item(mut self, item: MegaMenuItem) -> Self { - self.items.alter(PackOp::Add, ComponentRef::to(item)); - self - } - - pub fn alter_items(&mut self, op: PackOp, item: MegaMenuItem) -> &mut Self { - self.items.alter(op, ComponentRef::to(item)); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // MegaMenu GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn items(&self) -> &PackComponents { - &self.items - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-megamenu/src/component/menu.rs b/pagetop-megamenu/src/component/menu.rs new file mode 100644 index 00000000..a54aac85 --- /dev/null +++ b/pagetop-megamenu/src/component/menu.rs @@ -0,0 +1,160 @@ +use pagetop::prelude::*; +use pagetop_jquery::JQuery; + +use crate::component::MegaMenuItem; +use crate::LOCALES_MEGAMENU; + +new_handle!(COMPONENT_MEGAMENU); + +actions_for_component!(MegaMenu); + +// SmartMenus library version. +const VERSION_SMARTMENUS: &str = "1.2.1"; + +#[rustfmt::skip] +#[derive(Default)] +pub struct MegaMenu { + weight : Weight, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + items : PackComponents, +} + +impl ComponentTrait for MegaMenu { + fn new() -> Self { + MegaMenu::default().with_classes(ClassesOp::SetDefault, "megamenu-menu sm sm-clean") + } + + fn handle(&self) -> Handle { + COMPONENT_MEGAMENU + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at("/megamenu/css/smartmenus.css").with_version(VERSION_SMARTMENUS), + )) + .alter(ContextOp::AddStyleSheet( + StyleSheet::at("/megamenu/css/sm-clean.css").with_version(VERSION_SMARTMENUS), + )) + .alter(ContextOp::AddJavaScript( + JavaScript::at("/megamenu/js/smartmenus.min.js").with_version(VERSION_SMARTMENUS), + )); + JQuery.enable_jquery(cx); + + run_actions_before_prepare_megamenu(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let id_nav = cx.required_id::<MegaMenu>(self.id()); + let id_menu = concat_string!(id_nav, "-menu"); + let id_state = concat_string!(id_nav, "-state"); + + PrepareMarkup::With(html! { + nav id=(id_nav) class="megamenu" role="navigation" { + input id=(id_state) class="megamenu-state" type="checkbox" {} + label class="megamenu-btn" for=(id_state) { + span class="megamenu-btn-icon" {} + (L10n::t("toggle_menu", &LOCALES_MEGAMENU).prepare(cx)) + } + ul id=(id_menu) class=[self.classes().get()] { + (self.items().prepare(cx)) + } + script type="text/javascript" defer { + r###" +$(function() { + $('#"###r (id_menu) r###"').smartmenus({ + hideTimeout: 0, + showTimeout: 80, + }); +}); +$(function() { + var $menuState = $('#"###r (id_state) r###"'); + if ($menuState.length) { + // Animate mobile menu. + $menuState.change(function(e) { + var $menu = $('#"###r (id_menu) r###"'); + if (this.checked) { + $menu.hide().slideDown(250, function() { $menu.css('display', ''); }); + } else { + $menu.show().slideUp(250, function() { $menu.css('display', ''); }); + } + }); + // Hide mobile menu beforeunload. + $(window).on('beforeunload unload', function() { + if ($menuState[0].checked) { + $menuState[0].click(); + } + }); + } +}); + "###r + } + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_megamenu(self, cx); + } +} + +impl MegaMenu { + // MegaMenu BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + pub fn with_item(mut self, item: MegaMenuItem) -> Self { + self.items.alter(PackOp::Add, ComponentRef::to(item)); + self + } + + pub fn alter_items(&mut self, op: PackOp, item: MegaMenuItem) -> &mut Self { + self.items.alter(op, ComponentRef::to(item)); + self + } + + // MegaMenu GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn items(&self) -> &PackComponents { + &self.items + } +} diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 4afcad4d..749dc6b1 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -1,9 +1,16 @@ use pagetop::prelude::*; -pub mod component; +pub mod component { + mod item; + pub use item::{MegaMenuItem, MegaMenuItemType, COMPONENT_MEGAMENUITEM}; + mod menu; + pub use menu::{MegaMenu, COMPONENT_MEGAMENU}; +} new_handle!(MODULE_MEGAMENU); +static_locales!(LOCALES_MEGAMENU); + static_files!(megamenu); pub struct MegaMenu; @@ -13,6 +20,14 @@ impl ModuleTrait for MegaMenu { MODULE_MEGAMENU } + fn name(&self) -> L10n { + L10n::t("module_name", &LOCALES_MEGAMENU) + } + + fn description(&self) -> L10n { + L10n::t("module_description", &LOCALES_MEGAMENU) + } + fn dependencies(&self) -> Vec<ModuleRef> { vec![&pagetop_jquery::JQuery] } diff --git a/pagetop-megamenu/src/locale/en-US/module.ftl b/pagetop-megamenu/src/locale/en-US/module.ftl new file mode 100644 index 00000000..e38ee5c2 --- /dev/null +++ b/pagetop-megamenu/src/locale/en-US/module.ftl @@ -0,0 +1,4 @@ +module_name = MegaMenu +module_description = ... + +toggle_menu = Toggle menu visibility diff --git a/pagetop-megamenu/src/locale/es-ES/module.ftl b/pagetop-megamenu/src/locale/es-ES/module.ftl new file mode 100644 index 00000000..58001f0a --- /dev/null +++ b/pagetop-megamenu/src/locale/es-ES/module.ftl @@ -0,0 +1,4 @@ +module_name = MegaMenu +module_description = ... + +toggle_menu = Alternar visibilidad del menú diff --git a/pagetop-megamenu/static/css/menu.css b/pagetop-megamenu/static/css/menu.css deleted file mode 100644 index 95cdf757..00000000 --- a/pagetop-megamenu/static/css/menu.css +++ /dev/null @@ -1,58 +0,0 @@ -.sm { - box-sizing: border-box; - position: relative; - z-index: 9999; - -webkit-tap-highlight-color: rgba(0,0,0,0); -} -.sm, -.sm ul, -.sm li { - display: block; - list-style: none; - margin: 0; - padding: 0; - line-height: normal; - direction: ltr; - text-align: left; -} -.sm-rtl, -.sm-rtl ul, -.sm-rtl li { - direction: rtl; - text-align: right; -} -.sm > li > h1, -.sm > li > h2, -.sm > li > h3, -.sm > li > h4, -.sm > li > h5, -.sm > li > h6 { - margin: 0; - padding: 0; -} -.sm ul { - display: none; -} -.sm li, -.sm a { - position: relative; -} -.sm a { - display: block; -} -.sm a.disabled { - cursor: default; -} -.sm::after { - content: ""; - display: block; - height: 0; - font: 0px/0 serif; - clear: both; - overflow: hidden; -} -.sm *, -.sm *::before, -.sm *::after { - box-sizing: inherit; -} diff --git a/pagetop-megamenu/static/css/menu-blue.css b/pagetop-megamenu/static/css/sm-blue.css similarity index 100% rename from pagetop-megamenu/static/css/menu-blue.css rename to pagetop-megamenu/static/css/sm-blue.css diff --git a/pagetop-megamenu/static/css/menu-clean.css b/pagetop-megamenu/static/css/sm-clean.css similarity index 100% rename from pagetop-megamenu/static/css/menu-clean.css rename to pagetop-megamenu/static/css/sm-clean.css diff --git a/pagetop-megamenu/static/css/menu-mint.css b/pagetop-megamenu/static/css/sm-mint.css similarity index 100% rename from pagetop-megamenu/static/css/menu-mint.css rename to pagetop-megamenu/static/css/sm-mint.css diff --git a/pagetop-megamenu/static/css/menu-simple.css b/pagetop-megamenu/static/css/sm-simple.css similarity index 100% rename from pagetop-megamenu/static/css/menu-simple.css rename to pagetop-megamenu/static/css/sm-simple.css diff --git a/pagetop-megamenu/static/css/smartmenus.css b/pagetop-megamenu/static/css/smartmenus.css new file mode 100644 index 00000000..047d7fe3 --- /dev/null +++ b/pagetop-megamenu/static/css/smartmenus.css @@ -0,0 +1,170 @@ +/* Mobile first layout SmartMenus Core CSS (it's not recommended editing these rules) + You need this once per page no matter how many menu trees or different themes you use. +-------------------------------------------------------------------------------------------*/ + +.megamenu { + background: #eee; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +@media (min-width: 768px) { + .megamenu { + -webkit-border-radius: 50px; + -moz-border-radius: 50px; + -ms-border-radius: 50px; + -o-border-radius: 50px; + border-radius: 50px; + } +} + +.megamenu:after { + clear: both; + content: "\00a0"; + display: block; + height: 0; + font: 0px/0 serif; + overflow: hidden; +} + +.nav-brand { + float: left; + margin: 0; +} + +.nav-brand a { + display: block; + padding: 12px 12px 12px 20px; + color: #555; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 22px; + font-weight: normal; + line-height: 17px; + text-decoration: none; +} + +.megamenu-menu { + clear: both; +} + +@media (min-width: 768px) { + .megamenu-menu { + float: right; + clear: none; + } +} + +/* Mobile menu toggle button */ + +.megamenu-btn { + float: right; + margin: 6px 10px; + position: relative; + display: inline-block; + width: 29px; + height: 29px; + text-indent: 29px; + white-space: nowrap; + overflow: hidden; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +/* Hamburger icon */ + +.megamenu-btn-icon, +.megamenu-btn-icon:before, +.megamenu-btn-icon:after { + position: absolute; + top: 50%; + left: 2px; + height: 2px; + width: 24px; + background: #555; + -webkit-transition: all 0.25s; + transition: all 0.25s; +} + +.megamenu-btn-icon:before { + content: ''; + top: -7px; + left: 0; +} + +.megamenu-btn-icon:after { + content: ''; + top: 7px; + left: 0; +} + +/* X icon */ + +.megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon { + height: 0; + background: transparent; +} + +.megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon:before { + top: 0; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +.megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon:after { + top: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +/* Hide menu state checkbox (keep it visible to screen readers) */ + +.megamenu-state { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + border: 0; + padding: 0; + overflow: hidden; + clip: rect(1px, 1px, 1px, 1px); +} + +/* Hide the menu in mobile view */ + +.megamenu-state:not(:checked) ~ .megamenu-menu { + display: none; +} + +.megamenu-state:checked ~ .megamenu-menu { + display: block; +} + +@media (min-width: 768px) { + /* Hide the button in desktop view */ + .megamenu-btn { + position: absolute; + top: -99999px; + } + /* Always show the menu in desktop view */ + .megamenu-state:not(:checked) ~ .megamenu-menu { + display: block; + } +} + + + + + +.sm{box-sizing:border-box;position:relative;z-index:9999;-webkit-tap-highlight-color:rgba(0,0,0,0);} +.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;} +.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right;} +.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0;} +.sm ul{display:none;} +.sm li,.sm a{position:relative;} +.sm a{display:block;} +.sm a.disabled{cursor:default;} +.sm::after{content:"";display:block;height:0;font:0px/0 serif;clear:both;overflow:hidden;} +.sm *,.sm *::before,.sm *::after{box-sizing:inherit;} \ No newline at end of file diff --git a/pagetop-megamenu/static/js/menu.min.js b/pagetop-megamenu/static/js/menu.min.js deleted file mode 100644 index d60d33c5..00000000 --- a/pagetop-megamenu/static/js/menu.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! SmartMenus jQuery Plugin - v1.1.1 - July 23, 2020 - * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&4>=o&&4>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("<span/>").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a:not(.mega-menu a)").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=e.dataSM("sub"),s=i?2==i.dataSM("level"):!1;if(i){var o=$(t.target).is(".sub-arrow"),a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(i.is(":visible")){if(!a&&this.opts.showOnClick&&s)return this.menuHide(i),this.clickActivated=!1,this.focusActivated=!1,!1;if(a&&(n||o))return this.itemActivate(e,h),this.menuHide(i),!1}else if((!r||!a||o)&&(!a&&this.opts.showOnClick&&s&&(this.clickActivated=!0),this.itemActivate(e,h),i.is(":visible")))return this.focusActivated=!0,!1}return!a&&this.opts.showOnClick&&s||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),w=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),M=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=w?d-r-M:M,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=w?M-r:d-M,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(w&&f>y?e=g?f-y+e:d-M:!w&&y+r>f+b&&(e=g?f+b-r-y+e:M-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],$('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y<o.upEnd)&&a.eq(o.up?1:0).show(),o.y==n)mouse&&a.eq(o.up?0:1).hide(),this.menuScrollStop(t);else if(!e){this.opts.scrollAccelerate&&o.step<this.opts.scrollStep&&(o.step+=.2);var h=this;this.scrollTimeout=requestAnimationFrame(function(){h.menuScroll(t)})}},menuScrollMousewheel:function(t,e){if(this.getClosestMenu(e.target)==t[0]){e=e.originalEvent;var i=(e.wheelDelta||-e.detail)>0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts&&"object"!=typeof dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/pagetop-megamenu/static/js/smartmenus.min.js b/pagetop-megamenu/static/js/smartmenus.min.js new file mode 100644 index 00000000..3cbc0c13 --- /dev/null +++ b/pagetop-megamenu/static/js/smartmenus.min.js @@ -0,0 +1,3 @@ +/*! SmartMenus jQuery Plugin - v1.2.1 - November 3, 2022 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&"object"==typeof module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){function b(b){var i=".smartmenus_mouse";if(h||b)h&&b&&(a(document).off(i),h=!1);else{var j=!0,k=null,l={mousemove:function(b){var c={x:b.pageX,y:b.pageY,timeStamp:(new Date).getTime()};if(k){var d=Math.abs(k.x-c.x),g=Math.abs(k.y-c.y);if((d>0||g>0)&&d<=4&&g<=4&&c.timeStamp-k.timeStamp<=300&&(f=!0,j)){var h=a(b.target).closest("a");h.is("a")&&a.each(e,function(){if(a.contains(this.$root[0],h[0]))return this.itemEnter({currentTarget:h[0]}),!1}),j=!1}}k=c}};l[g?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(a){c(a.originalEvent)&&(f=!1)},a(document).on(d(l,i)),h=!0}}function c(a){return!/^(4|mouse)$/.test(a.pointerType)}function d(a,b){b||(b="");var c={};for(var d in a)c[d.split(" ").join(b+" ")+b]=a[d];return c}var e=[],f=!1,g="ontouchstart"in window,h=!1,i=window.requestAnimationFrame||function(a){return setTimeout(a,1e3/60)},j=window.cancelAnimationFrame||function(a){clearTimeout(a)},k=!!a.fn.animate;return a.SmartMenus=function(b,c){this.$root=a(b),this.opts=c,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in b.style||"webkitPerspective"in b.style,this.wasCollapsible=!1,this.init()},a.extend(a.SmartMenus,{hideAll:function(){a.each(e,function(){this.menuHideAll()})},destroy:function(){for(;e.length;)e[0].destroy();b(!0)},prototype:{init:function(c){var f=this;if(!c){e.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var g=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(d({"mouseover focusin":a.proxy(this.rootOver,this),"mouseout focusout":a.proxy(this.rootOut,this),keydown:a.proxy(this.rootKeyDown,this)},g)).on(d({mouseenter:a.proxy(this.itemEnter,this),mouseleave:a.proxy(this.itemLeave,this),mousedown:a.proxy(this.itemDown,this),focus:a.proxy(this.itemFocus,this),blur:a.proxy(this.itemBlur,this),click:a.proxy(this.itemClick,this)},g),"a"),g+=this.rootId,this.opts.hideOnClick&&a(document).on(d({touchstart:a.proxy(this.docTouchStart,this),touchmove:a.proxy(this.docTouchMove,this),touchend:a.proxy(this.docTouchEnd,this),click:a.proxy(this.docClick,this)},g)),a(window).on(d({"resize orientationchange":a.proxy(this.winResize,this)},g)),this.opts.subIndicators&&(this.$subArrow=a("<span/>").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),b()}if(this.$firstSub=this.$root.find("ul").each(function(){f.menuInit(a(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var h=/(index|default)\.[^#\?\/]*/i,i=/#.*/,j=window.location.href.replace(h,""),k=j.replace(i,"");this.$root.find("a:not(.mega-menu a)").each(function(){var b=this.href.replace(h,""),c=a(this);b!=j&&b!=k||(c.addClass("current"),f.opts.markCurrentTree&&c.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(b){if(!b){var c=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(c),c+=this.rootId,a(document).off(c),a(window).off(c),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var d=this;this.$root.find("ul").each(function(){var b=a(this);b.dataSM("scroll-arrows")&&b.dataSM("scroll-arrows").remove(),b.dataSM("shown-before")&&((d.opts.subMenusMinWidth||d.opts.subMenusMaxWidth)&&b.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),b.dataSM("scroll-arrows")&&b.dataSM("scroll-arrows").remove(),b.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(b.attr("id")||"").indexOf(d.accessIdPrefix)&&b.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var b=a(this);0==b.attr("id").indexOf(d.accessIdPrefix)&&b.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),b||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),e.splice(a.inArray(this,e),1))},disable:function(b){if(!this.disabled){if(this.menuHideAll(),!b&&!this.opts.isPopup&&this.$root.is(":visible")){var c=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:c.top,left:c.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(b){return this.$touchScrollingSub?void(this.$touchScrollingSub=null):void((this.visibleSubMenus.length&&!a.contains(this.$root[0],b.target)||a(b.target).closest("a").length)&&this.menuHideAll())},docTouchEnd:function(b){if(this.lastTouch){if(this.visibleSubMenus.length&&(void 0===this.lastTouch.x2||this.lastTouch.x1==this.lastTouch.x2)&&(void 0===this.lastTouch.y2||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var c=this;this.hideTimeout=setTimeout(function(){c.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(a){if(this.lastTouch){var b=a.originalEvent.touches[0];this.lastTouch.x2=b.pageX,this.lastTouch.y2=b.pageY}},docTouchStart:function(a){var b=a.originalEvent.touches[0];this.lastTouch={x1:b.pageX,y1:b.pageY,target:b.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(b){for(var c=a(b).closest("ul");c.dataSM("in-mega");)c=c.parent().closest("ul");return c[0]||null},getHeight:function(a){return this.getOffset(a,!0)},getOffset:function(a,b){var c;"none"==a.css("display")&&(c={position:a[0].style.position,visibility:a[0].style.visibility},a.css({position:"absolute",visibility:"hidden"}).show());var d=a[0].getBoundingClientRect&&a[0].getBoundingClientRect(),e=d&&(b?d.height||d.bottom-d.top:d.width||d.right-d.left);return e||0===e||(e=b?a[0].offsetHeight:a[0].offsetWidth),c&&a.hide().css(c),e},getStartZIndex:function(a){var b=parseInt(this[a?"$root":"$firstSub"].css("z-index"));return!a&&isNaN(b)&&(b=parseInt(this.$root.css("z-index"))),isNaN(b)?1:b},getTouchPoint:function(a){return a.touches&&a.touches[0]||a.changedTouches&&a.changedTouches[0]||a},getViewport:function(a){var b=a?"Height":"Width",c=document.documentElement["client"+b],d=window["inner"+b];return d&&(c=Math.min(c,d)),c},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(a){return this.getOffset(a)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(a){return this.handleEvents()&&!this.isLinkInMegaMenu(a)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var b="fixed"==this.$root.css("position");return b||this.$root.parentsUntil("body").each(function(){if("fixed"==a(this).css("position"))return b=!0,!1}),b},isLinkInMegaMenu:function(b){return a(this.getClosestMenu(b[0])).hasClass("mega-menu")},isTouchMode:function(){return!f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(b,c){var d=b.closest("ul"),e=d.dataSM("level");if(e>1&&(!this.activatedItems[e-2]||this.activatedItems[e-2][0]!=d.dataSM("parent-a")[0])){var f=this;a(d.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(d).each(function(){f.itemActivate(a(this).dataSM("parent-a"))})}if(this.isCollapsible()&&!c||this.menuHideSubMenus(this.activatedItems[e-1]&&this.activatedItems[e-1][0]==b[0]?e:e-1),this.activatedItems[e-1]=b,this.$root.triggerHandler("activate.smapi",b[0])!==!1){var g=b.dataSM("sub");g&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(g)}},itemBlur:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&this.$root.triggerHandler("blur.smapi",c[0])},itemClick:function(b){var c=a(b.currentTarget);if(this.handleItemEvents(c)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==c.closest("ul")[0])return this.$touchScrollingSub=null,b.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",c[0])===!1)return!1;var d=c.dataSM("sub"),e=!!d&&2==d.dataSM("level");if(d){var f=a(b.target).is(".sub-arrow"),g=this.isCollapsible(),h=/toggle$/.test(this.opts.collapsibleBehavior),i=/link$/.test(this.opts.collapsibleBehavior),j=/^accordion/.test(this.opts.collapsibleBehavior);if(d.is(":visible")){if(!g&&this.opts.showOnClick&&e)return this.menuHide(d),this.clickActivated=!1,this.focusActivated=!1,!1;if(g&&(h||f))return this.itemActivate(c,j),this.menuHide(d),!1}else if((!i||!g||f)&&(!g&&this.opts.showOnClick&&e&&(this.clickActivated=!0),this.itemActivate(c,j),d.is(":visible")))return this.focusActivated=!0,!1}return!(!g&&this.opts.showOnClick&&e||c.hasClass("disabled")||this.$root.triggerHandler("select.smapi",c[0])===!1)&&void 0}},itemDown:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&c.dataSM("mousedown",!0)},itemEnter:function(b){var c=a(b.currentTarget);if(this.handleItemEvents(c)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var d=this;this.showTimeout=setTimeout(function(){d.itemActivate(c)},this.opts.showOnClick&&1==c.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",c[0])}},itemFocus:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&(!this.focusActivated||this.isTouchMode()&&c.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==c[0]||this.itemActivate(c,!0),this.$root.triggerHandler("focus.smapi",c[0]))},itemLeave:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&(this.isTouchMode()||(c[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),c.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",c[0]))},menuHide:function(b){if(this.$root.triggerHandler("beforehide.smapi",b[0])!==!1&&(k&&b.stop(!0,!0),"none"!=b.css("display"))){var c=function(){b.css("z-index","")};this.isCollapsible()?k&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,b,c):b.hide(this.opts.collapsibleHideDuration,c):k&&this.opts.hideFunction?this.opts.hideFunction.call(this,b,c):b.hide(this.opts.hideDuration,c),b.dataSM("scroll")&&(this.menuScrollStop(b),b.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),b.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),b.attr({"aria-expanded":"false","aria-hidden":"true"});var d=b.dataSM("level");this.activatedItems.splice(d-1,1),this.visibleSubMenus.splice(a.inArray(b,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",b[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var a=this.opts.isPopup?1:0,b=this.visibleSubMenus.length-1;b>=a;b--)this.menuHide(this.visibleSubMenus[b]);this.opts.isPopup&&(k&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(k&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(a){for(var b=this.activatedItems.length-1;b>=a;b--){var c=this.activatedItems[b].dataSM("sub");c&&this.menuHide(c)}},menuInit:function(a){if(!a.dataSM("in-mega")){a.hasClass("mega-menu")&&a.find("ul").dataSM("in-mega",!0);for(var b=2,c=a[0];(c=c.parentNode.parentNode)!=this.$root[0];)b++;var d=a.prevAll("a").eq(-1);d.length||(d=a.prevAll().find("a").eq(-1)),d.addClass("has-submenu").dataSM("sub",a),a.dataSM("parent-a",d).dataSM("level",b).parent().dataSM("sub",a);var e=d.attr("id")||this.accessIdPrefix+ ++this.idInc,f=a.attr("id")||this.accessIdPrefix+ ++this.idInc;d.attr({id:e,"aria-haspopup":"true","aria-controls":f,"aria-expanded":"false"}),a.attr({id:f,role:"group","aria-hidden":"true","aria-labelledby":e,"aria-expanded":"false"}),this.opts.subIndicators&&d[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(b){var c,e,f=b.dataSM("parent-a"),h=f.closest("li"),i=h.parent(),j=b.dataSM("level"),k=this.getWidth(b),l=this.getHeight(b),m=f.offset(),n=m.left,o=m.top,p=this.getWidth(f),q=this.getHeight(f),r=a(window),s=r.scrollLeft(),t=r.scrollTop(),u=this.getViewportWidth(),v=this.getViewportHeight(),w=i.parent().is("[data-sm-horizontal-sub]")||2==j&&!i.hasClass("sm-vertical"),x=this.opts.rightToLeftSubMenus&&!h.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&h.is("[data-sm-reverse]"),y=2==j?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,z=2==j?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(w?(c=x?p-k-y:y,e=this.opts.bottomToTopSubMenus?-l-z:q+z):(c=x?y-k:p-y,e=this.opts.bottomToTopSubMenus?q-z-l:z),this.opts.keepInViewport){var A=n+c,B=o+e;if(x&&A<s?c=w?s-A+c:p-y:!x&&A+k>s+u&&(c=w?s+u-k-A+c:y-k),w||(l<v&&B+l>t+v?e+=t+v-l-B:(l>=v||B<t)&&(e+=t-B)),w&&(B+l>t+v+.49||B<t)||!w&&l>v+.49){var C=this;b.dataSM("scroll-arrows")||b.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).on({mouseenter:function(){b.dataSM("scroll").up=a(this).hasClass("scroll-up"),C.menuScroll(b)},mouseleave:function(a){C.menuScrollStop(b),C.menuScrollOut(b,a)},"mousewheel DOMMouseScroll":function(a){a.preventDefault()}}).insertAfter(b));var D=".smartmenus_scroll";if(b.dataSM("scroll",{y:this.cssTransforms3d?0:e-q,step:1,itemH:q,subH:l,arrowDownH:this.getHeight(b.dataSM("scroll-arrows").eq(1))}).on(d({mouseover:function(a){C.menuScrollOver(b,a)},mouseout:function(a){C.menuScrollOut(b,a)},"mousewheel DOMMouseScroll":function(a){C.menuScrollMousewheel(b,a)}},D)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:c+(parseInt(b.css("border-left-width"))||0),width:k-(parseInt(b.css("border-left-width"))||0)-(parseInt(b.css("border-right-width"))||0),zIndex:b.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var E={};E[g?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(a){C.menuScrollTouch(b,a)},b.css({"touch-action":"none","-ms-touch-action":"none"}).on(d(E,D))}}}b.css({top:"auto",left:"0",marginLeft:c,marginTop:e-q})},menuScroll:function(a,b,c){var d,e=a.dataSM("scroll"),g=a.dataSM("scroll-arrows"),h=e.up?e.upEnd:e.downEnd;if(!b&&e.momentum){if(e.momentum*=.92,d=e.momentum,d<.5)return void this.menuScrollStop(a)}else d=c||(b||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(e.step));var j=a.dataSM("level");if(this.activatedItems[j-1]&&this.activatedItems[j-1].dataSM("sub")&&this.activatedItems[j-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(j-1),e.y=e.up&&h<=e.y||!e.up&&h>=e.y?e.y:Math.abs(h-e.y)>d?e.y+(e.up?d:-d):h,a.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+e.y+"px, 0)",transform:"translate3d(0, "+e.y+"px, 0)"}:{marginTop:e.y}),f&&(e.up&&e.y>e.downEnd||!e.up&&e.y<e.upEnd)&&g.eq(e.up?1:0).show(),e.y==h)f&&g.eq(e.up?0:1).hide(),this.menuScrollStop(a);else if(!b){this.opts.scrollAccelerate&&e.step<this.opts.scrollStep&&(e.step+=.2);var k=this;this.scrollTimeout=i(function(){k.menuScroll(a)})}},menuScrollMousewheel:function(a,b){if(this.getClosestMenu(b.target)==a[0]){b=b.originalEvent;var c=(b.wheelDelta||-b.detail)>0;a.dataSM("scroll-arrows").eq(c?0:1).is(":visible")&&(a.dataSM("scroll").up=c,this.menuScroll(a,!0))}b.preventDefault()},menuScrollOut:function(b,c){f&&(/^scroll-(up|down)/.test((c.relatedTarget||"").className)||(b[0]==c.relatedTarget||a.contains(b[0],c.relatedTarget))&&this.getClosestMenu(c.relatedTarget)==b[0]||b.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(b,c){if(f&&!/^scroll-(up|down)/.test(c.target.className)&&this.getClosestMenu(c.target)==b[0]){this.menuScrollRefreshData(b);var d=b.dataSM("scroll"),e=a(window).scrollTop()-b.dataSM("parent-a").offset().top-d.itemH;b.dataSM("scroll-arrows").eq(0).css("margin-top",e).end().eq(1).css("margin-top",e+this.getViewportHeight()-d.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(b){var c=b.dataSM("scroll"),d=a(window).scrollTop()-b.dataSM("parent-a").offset().top-c.itemH;this.cssTransforms3d&&(d=-(parseFloat(b.css("margin-top"))-d)),a.extend(c,{upEnd:d,downEnd:d+this.getViewportHeight()-c.subH})},menuScrollStop:function(a){if(this.scrollTimeout)return j(this.scrollTimeout),this.scrollTimeout=0,a.dataSM("scroll").step=1,!0},menuScrollTouch:function(b,d){if(d=d.originalEvent,c(d)){var e=this.getTouchPoint(d);if(this.getClosestMenu(e.target)==b[0]){var f=b.dataSM("scroll");if(/(start|down)$/i.test(d.type))this.menuScrollStop(b)?(d.preventDefault(),this.$touchScrollingSub=b):this.$touchScrollingSub=null,this.menuScrollRefreshData(b),a.extend(f,{touchStartY:e.pageY,touchStartTime:d.timeStamp});else if(/move$/i.test(d.type)){var g=void 0!==f.touchY?f.touchY:f.touchStartY;if(void 0!==g&&g!=e.pageY){this.$touchScrollingSub=b;var h=g<e.pageY;void 0!==f.up&&f.up!=h&&a.extend(f,{touchStartY:e.pageY,touchStartTime:d.timeStamp}),a.extend(f,{up:h,touchY:e.pageY}),this.menuScroll(b,!0,Math.abs(e.pageY-g))}d.preventDefault()}else void 0!==f.touchY&&((f.momentum=15*Math.pow(Math.abs(e.pageY-f.touchStartY)/(d.timeStamp-f.touchStartTime),2))&&(this.menuScrollStop(b),this.menuScroll(b),d.preventDefault()),delete f.touchY)}}},menuShow:function(a){if((a.dataSM("beforefirstshowfired")||(a.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",a[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",a[0])!==!1&&(a.dataSM("shown-before",!0),k&&a.stop(!0,!0),!a.is(":visible"))){var b=a.dataSM("parent-a"),c=this.isCollapsible();if((this.opts.keepHighlighted||c)&&b.addClass("highlighted"),c)a.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(a.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(a.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&a.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var d=this.getWidth(a);a.css("max-width",this.opts.subMenusMaxWidth),d>this.getWidth(a)&&a.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(a)}var e=function(){a.css("overflow","")};c?k&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,a,e):a.show(this.opts.collapsibleShowDuration,e):k&&this.opts.showFunction?this.opts.showFunction.call(this,a,e):a.show(this.opts.showDuration,e),b.attr("aria-expanded","true"),a.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(a),this.$root.triggerHandler("show.smapi",a[0])}},popupHide:function(a){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var b=this;this.hideTimeout=setTimeout(function(){b.menuHideAll()},a?1:this.opts.hideTimeout)},popupShow:function(a,b){if(!this.opts.isPopup)return void alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),k&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:a,top:b});var c=this,d=function(){c.$root.css("overflow","")};k&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,d):this.$root.show(this.opts.showDuration,d),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(b){if(this.handleEvents())switch(b.keyCode){case 27:var c=this.activatedItems[0];if(c){this.menuHideAll(),c[0].focus();var d=c.dataSM("sub");d&&this.menuHide(d)}break;case 32:var e=a(b.target);if(e.is("a")&&this.handleItemEvents(e)){var d=e.dataSM("sub");d&&!d.is(":visible")&&(this.itemClick({currentTarget:b.target}),b.preventDefault())}}},rootOut:function(a){if(this.handleEvents()&&!this.isTouchMode()&&a.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var b=this;this.hideTimeout=setTimeout(function(){b.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(a){this.handleEvents()&&!this.isTouchMode()&&a.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(a){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==a.type){var b=this.isCollapsible();this.wasCollapsible&&b||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=b}}else if(this.$disableOverlay){var c=this.$root.offset();this.$disableOverlay.css({top:c.top,left:c.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),a.fn.dataSM=function(a,b){return b?this.data(a+"_smartmenus",b):this.data(a+"_smartmenus")},a.fn.removeDataSM=function(a){return this.removeData(a+"_smartmenus")},a.fn.smartmenus=function(b){if("string"==typeof b){var c=arguments,d=b;return Array.prototype.shift.call(c),this.each(function(){var b=a(this).data("smartmenus");b&&b[d]&&b[d].apply(b,c)})}return this.each(function(){var c=a(this).data("sm-options")||null;c&&"object"!=typeof c&&(c=null,alert('ERROR\n\nSmartMenus jQuery init:\nThe value of the "data-sm-options" attribute must be valid JSON.')),c&&a.each(["showFunction","hideFunction","collapsibleShowFunction","collapsibleHideFunction"],function(){this in c&&delete c[this]}),new a.SmartMenus(this,a.extend({},a.fn.smartmenus.defaults,b,c))})},a.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(a,b){a.fadeOut(200,b)},collapsibleShowDuration:0,collapsibleShowFunction:function(a,b){a.slideDown(200,b)},collapsibleHideDuration:0,collapsibleHideFunction:function(a,b){a.slideUp(200,b)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},a}); \ No newline at end of file From 23309b4c84792263066b79b77cba56d9eb1a8865 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 11:28:48 +0200 Subject: [PATCH 477/853] =?UTF-8?q?=F0=9F=8E=A8=20Identifier=20to=204=20le?= =?UTF-8?q?tters=20for=20better=20composition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/basics/hello-name/src/main.rs | 4 ++-- examples/basics/hello-world/src/main.rs | 4 ++-- pagetop-admin/src/lib.rs | 4 ++-- pagetop-aliner/src/lib.rs | 4 ++-- pagetop-bootsier/src/lib.rs | 4 ++-- pagetop-bulmix/src/lib.rs | 4 ++-- pagetop-homedemo/src/lib.rs | 6 +++--- pagetop-jquery/src/lib.rs | 4 ++-- pagetop-megamenu/src/lib.rs | 4 ++-- pagetop-minimal/src/lib.rs | 4 ++-- pagetop-node/src/lib.rs | 4 ++-- pagetop-user/src/lib.rs | 4 ++-- pagetop/src/core/module/all.rs | 4 ++-- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme/default.rs | 4 ++-- pagetop/src/lib.rs | 4 ++-- pagetop/src/util.rs | 6 +++--- 17 files changed, 35 insertions(+), 35 deletions(-) diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index f5a2d46b..0af7c2d0 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -9,8 +9,8 @@ impl ModuleTrait for HelloName { APP_HELLO_NAME } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - cfg.service(hello_name); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.service(hello_name); } } diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 905d4b76..176c7304 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -9,8 +9,8 @@ impl ModuleTrait for HelloWorld { APP_HELLO_WORLD } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - cfg.route("/", service::web::get().to(hello_world)); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/", service::web::get().to(hello_world)); } } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 351cd7cf..da8946b3 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -33,8 +33,8 @@ impl ModuleTrait for Admin { vec![action!(ActionBeforePrepareBody => before_prepare_body)] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - cfg.service( + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.service( service::web::scope("/admin").route("", service::web::get().to(summary::summary)), ); } diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 303096ef..6b056f7b 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -15,8 +15,8 @@ impl ModuleTrait for Aliner { Some(&Aliner) } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/aliner", aliner); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/aliner", aliner); } } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index d8067b24..f9f6dd6e 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -22,8 +22,8 @@ impl ModuleTrait for Bootsier { vec![&pagetop_jquery::JQuery] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/bootsier", bootsier); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/bootsier", bootsier); } } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 4467cdb5..680389c8 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -25,8 +25,8 @@ impl ModuleTrait for Bulmix { ] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/bulmix", bulmix); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/bulmix", bulmix); } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 79ec44f4..d37c575e 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -26,9 +26,9 @@ impl ModuleTrait for HomeDemo { vec![&pagetop_minimal::Minimal] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/homedemo", homedemo); - cfg.route("/", service::web::get().to(demo)); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/homedemo", homedemo); + scfg.route("/", service::web::get().to(demo)); } } diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index efda4aa8..0a4c81b4 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -32,8 +32,8 @@ impl ModuleTrait for JQuery { vec![action!(ActionAfterPrepareBody => after_prepare_body)] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/jquery", jquery); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/jquery", jquery); } } diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 749dc6b1..df4848c6 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -32,7 +32,7 @@ impl ModuleTrait for MegaMenu { vec![&pagetop_jquery::JQuery] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/megamenu", megamenu); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/megamenu", megamenu); } } diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 99965875..dd029f20 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -33,8 +33,8 @@ impl ModuleTrait for Minimal { vec![action!(ActionAfterPrepareBody => after_prepare_body, 99)] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/minimal", minimal); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/minimal", minimal); } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index c83f71d1..ec21ab8c 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -22,8 +22,8 @@ impl ModuleTrait for Node { L10n::t("module_description", &LOCALES_NODE) } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - cfg.route("/node", service::web::get().to(node)); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/node", service::web::get().to(node)); } fn actions(&self) -> Vec<Action> { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 7ec57e4c..b497063a 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -26,8 +26,8 @@ impl ModuleTrait for User { vec![&pagetop_minimal::Minimal] } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - cfg.route("/user/login", service::web::get().to(login)); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/user/login", service::web::get().to(login)); } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 4bd8b530..1eeb653b 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -142,8 +142,8 @@ pub fn run_migrations() { // CONFIGURE SERVICES ****************************************************************************** -pub fn configure_services(cfg: &mut service::web::ServiceConfig) { +pub fn configure_services(scfg: &mut service::web::ServiceConfig) { for m in ENABLED_MODULES.read().unwrap().iter() { - m.configure_service(cfg); + m.configure_service(scfg); } } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index deaa3c7f..76c0a5b5 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -49,7 +49,7 @@ pub trait ModuleTrait: ModuleBase + Send + Sync { } #[allow(unused_variables)] - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) {} + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {} } impl<M: ?Sized + ModuleTrait> ModuleBase for M { diff --git a/pagetop/src/core/theme/default.rs b/pagetop/src/core/theme/default.rs index 523fab9e..71f696d7 100644 --- a/pagetop/src/core/theme/default.rs +++ b/pagetop/src/core/theme/default.rs @@ -25,8 +25,8 @@ impl ModuleTrait for DefaultTheme { Some(&DefaultTheme) } - fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { - serve_static_files!(cfg, "/theme", theme); + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + serve_static_files!(scfg, "/theme", theme); } } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index e9186e64..f6aec646 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -53,8 +53,8 @@ //! APP_HELLO_WORLD //! } //! -//! fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { -//! cfg.route("/", service::web::get().to(hello_world)); +//! fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { +//! scfg.route("/", service::web::get().to(hello_world)); //! } //! } //! diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 89a38392..ef9dc818 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -175,16 +175,16 @@ macro_rules! static_files { #[macro_export] macro_rules! serve_static_files { - ( $cfg:ident, $path:expr, $bundle:ident ) => {{ + ( $scfg:ident, $path:expr, $bundle:ident ) => {{ $crate::paste! { let static_files = &$crate::config::SETTINGS.dev.static_files; if static_files.is_empty() { - $cfg.service($crate::service::ResourceFiles::new( + $scfg.service($crate::service::ResourceFiles::new( $path, [<static_files_ $bundle>]::$bundle(), )); } else { - $cfg.service( + $scfg.service( $crate::service::ActixFiles::new( $path, $crate::concat_string!(static_files, $path), From c0540813903236494a6c02c8380dc8ba3756203a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 11:31:06 +0200 Subject: [PATCH 478/853] =?UTF-8?q?=F0=9F=9A=A7=20Set=20public=20context?= =?UTF-8?q?=20lang=20identifier=20and=20theme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/context.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index c79e109b..70819eaf 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -95,11 +95,11 @@ impl Context { &self.request } - pub(crate) fn langid(&self) -> &LanguageIdentifier { + pub fn langid(&self) -> &LanguageIdentifier { self.langid } - pub(crate) fn theme(&self) -> ThemeRef { + pub fn theme(&self) -> ThemeRef { self.theme } From 7b821da41190d38b6d2400704141f1d60a8d1283 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 11:46:28 +0200 Subject: [PATCH 479/853] =?UTF-8?q?=F0=9F=9A=A7=20[megamenu]=20Improve=20l?= =?UTF-8?q?inking=20with=20dynamic=20urls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/item.rs | 83 +++++++++++++------------- pagetop-megamenu/src/component/menu.rs | 6 +- pagetop-megamenu/src/lib.rs | 2 +- 3 files changed, 45 insertions(+), 46 deletions(-) diff --git a/pagetop-megamenu/src/component/item.rs b/pagetop-megamenu/src/component/item.rs index d2c75ae5..95de934f 100644 --- a/pagetop-megamenu/src/component/item.rs +++ b/pagetop-megamenu/src/component/item.rs @@ -2,18 +2,20 @@ use pagetop::prelude::*; use crate::component::MegaMenu; -new_handle!(COMPONENT_MEGAMENUITEM); +new_handle!(COMPONENT_MEGAITEM); type Label = OneComponent<L10n>; -type Content = OneComponent<L10n>; +type Content = OneComponent<Html>; + +pub type MegaItemPath = fn(cx: &Context) -> &str; #[derive(Default)] -pub enum MegaMenuItemType { +pub enum MegaItemType { #[default] Void, Label(Label), - Link(Label, String), - LinkBlank(Label, String), + Link(Label, MegaItemPath), + LinkBlank(Label, MegaItemPath), Html(Content), Submenu(Label, MegaMenu), Separator, @@ -23,19 +25,19 @@ pub enum MegaMenuItemType { #[rustfmt::skip] #[derive(Default)] -pub struct MegaMenuItem { +pub struct MegaItem { weight : Weight, renderable: Renderable, - item_type : MegaMenuItemType, + item_type : MegaItemType, } -impl ComponentTrait for MegaMenuItem { +impl ComponentTrait for MegaItem { fn new() -> Self { - MegaMenuItem::default() + MegaItem::default() } fn handle(&self) -> Handle { - COMPONENT_MEGAMENUITEM + COMPONENT_MEGAITEM } fn weight(&self) -> Weight { @@ -48,23 +50,20 @@ impl ComponentTrait for MegaMenuItem { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { match self.item_type() { - MegaMenuItemType::Void => PrepareMarkup::None, - - MegaMenuItemType::Label(label) => PrepareMarkup::With(html! { - li class="label" { a href="#" { (label.prepare(cx)) } } + MegaItemType::Void => PrepareMarkup::None, + MegaItemType::Label(label) => PrepareMarkup::With(html! { + li class="link" { a href="#" { (label.prepare(cx)) } } }), - MegaMenuItemType::Link(label, path) => PrepareMarkup::With(html! { - li class="link" { a href=(path) { (label.prepare(cx)) } } + MegaItemType::Link(label, path) => PrepareMarkup::With(html! { + li class="link" { a href=(path(cx)) { (label.prepare(cx)) } } }), - MegaMenuItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { - li class="link_blank" { - a href=(path) target="_blank" { (label.prepare(cx)) } - } + MegaItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { + li class="link" { a href=(path(cx)) target="_blank" { (label.prepare(cx)) } } }), - MegaMenuItemType::Html(content) => PrepareMarkup::With(html! { + MegaItemType::Html(content) => PrepareMarkup::With(html! { li class="html" { (content.prepare(cx)) } }), - MegaMenuItemType::Submenu(label, menu) => PrepareMarkup::With(html! { + MegaItemType::Submenu(label, menu) => PrepareMarkup::With(html! { li class="submenu" { a href="#" { (label.prepare(cx)) } ul { @@ -72,57 +71,57 @@ impl ComponentTrait for MegaMenuItem { } } }), - MegaMenuItemType::Separator => PrepareMarkup::With(html! { + MegaItemType::Separator => PrepareMarkup::With(html! { li class="separator" { } }), } } } -impl MegaMenuItem { +impl MegaItem { pub fn label(label: L10n) -> Self { - MegaMenuItem { - item_type: MegaMenuItemType::Label(OneComponent::new_with(label)), + MegaItem { + item_type: MegaItemType::Label(OneComponent::new_with(label)), ..Default::default() } } - pub fn link(label: L10n, path: &str) -> Self { - MegaMenuItem { - item_type: MegaMenuItemType::Link(OneComponent::new_with(label), path.to_owned()), + pub fn link(label: L10n, path: MegaItemPath) -> Self { + MegaItem { + item_type: MegaItemType::Link(OneComponent::new_with(label), path), ..Default::default() } } - pub fn link_blank(label: L10n, path: &str) -> Self { - MegaMenuItem { - item_type: MegaMenuItemType::LinkBlank(OneComponent::new_with(label), path.to_owned()), + pub fn link_blank(label: L10n, path: MegaItemPath) -> Self { + MegaItem { + item_type: MegaItemType::LinkBlank(OneComponent::new_with(label), path), ..Default::default() } } - pub fn html(content: L10n) -> Self { - MegaMenuItem { - item_type: MegaMenuItemType::Html(OneComponent::new_with(content)), + pub fn html(content: Html) -> Self { + MegaItem { + item_type: MegaItemType::Html(OneComponent::new_with(content)), ..Default::default() } } pub fn submenu(label: L10n, menu: MegaMenu) -> Self { - MegaMenuItem { - item_type: MegaMenuItemType::Submenu(OneComponent::new_with(label), menu), + MegaItem { + item_type: MegaItemType::Submenu(OneComponent::new_with(label), menu), ..Default::default() } } pub fn separator() -> Self { - MegaMenuItem { - item_type: MegaMenuItemType::Separator, + MegaItem { + item_type: MegaItemType::Separator, ..Default::default() } } - // MegaMenuItem BUILDER. + // MegaItem BUILDER. #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { @@ -136,9 +135,9 @@ impl MegaMenuItem { self } - // MegaMenuItem GETTERS. + // MegaItem GETTERS. - pub fn item_type(&self) -> &MegaMenuItemType { + pub fn item_type(&self) -> &MegaItemType { &self.item_type } } diff --git a/pagetop-megamenu/src/component/menu.rs b/pagetop-megamenu/src/component/menu.rs index a54aac85..80879a70 100644 --- a/pagetop-megamenu/src/component/menu.rs +++ b/pagetop-megamenu/src/component/menu.rs @@ -1,7 +1,7 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; -use crate::component::MegaMenuItem; +use crate::component::MegaItem; use crate::LOCALES_MEGAMENU; new_handle!(COMPONENT_MEGAMENU); @@ -138,12 +138,12 @@ impl MegaMenu { self } - pub fn with_item(mut self, item: MegaMenuItem) -> Self { + pub fn with_item(mut self, item: MegaItem) -> Self { self.items.alter(PackOp::Add, ComponentRef::to(item)); self } - pub fn alter_items(&mut self, op: PackOp, item: MegaMenuItem) -> &mut Self { + pub fn alter_items(&mut self, op: PackOp, item: MegaItem) -> &mut Self { self.items.alter(op, ComponentRef::to(item)); self } diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index df4848c6..fc75fa9f 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; pub mod component { mod item; - pub use item::{MegaMenuItem, MegaMenuItemType, COMPONENT_MEGAMENUITEM}; + pub use item::{MegaItem, MegaItemPath, MegaItemType, COMPONENT_MEGAITEM}; mod menu; pub use menu::{MegaMenu, COMPONENT_MEGAMENU}; } From 98f85b54b1854f9f741e3e2231be1f282c66a094 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 11:47:05 +0200 Subject: [PATCH 480/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Apply=20last=20?= =?UTF-8?q?MegaMenu=20API=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 66 +++++++++++++++++------------------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 4d097049..27164b3e 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,59 +1,55 @@ use crate::LOCALES_ADMIN; use pagetop::prelude::*; -use pagetop_megamenu::component::{MegaMenu, MegaMenuItem}; +use pagetop_megamenu::component::{MegaItem, MegaMenu}; use pagetop_minimal::component::*; pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::t("module_name", &LOCALES_ADMIN))) - .with_item(MegaMenuItem::link( - L10n::n("Opción 2"), - "https://www.google.es", - )) - .with_item(MegaMenuItem::link_blank( - L10n::n("Opción 3"), - "https://www.google.es", - )) - .with_item(MegaMenuItem::submenu( + .with_item(MegaItem::label(L10n::t("module_name", &LOCALES_ADMIN))) + .with_item(MegaItem::link(L10n::n("Opción 2"), |_| { + "https://www.google.es" + })) + .with_item(MegaItem::link_blank(L10n::n("Opción 3"), |_| { + "https://www.google.es" + })) + .with_item(MegaItem::submenu( L10n::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaItem::label(L10n::n("Opción 1"))) + .with_item(MegaItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::separator()) - .with_item(MegaMenuItem::submenu( + .with_item(MegaItem::separator()) + .with_item(MegaItem::submenu( L10n::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaItem::label(L10n::n("Opción 1"))) + .with_item(MegaItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); + .with_item(MegaItem::label(L10n::n("Opción 4"))); let side_menu = MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::link( - L10n::n("Opción 2"), - "https://www.google.es", - )) - .with_item(MegaMenuItem::link_blank( - L10n::n("Opción 3"), - "https://www.google.es", - )) - .with_item(MegaMenuItem::submenu( + .with_item(MegaItem::label(L10n::n("Opción 1"))) + .with_item(MegaItem::link(L10n::n("Opción 2"), |_| { + "https://www.google.es" + })) + .with_item(MegaItem::link_blank(L10n::n("Opción 3"), |_| { + "https://www.google.es" + })) + .with_item(MegaItem::submenu( L10n::n("Submenú 1"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaItem::label(L10n::n("Opción 1"))) + .with_item(MegaItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::separator()) - .with_item(MegaMenuItem::submenu( + .with_item(MegaItem::separator()) + .with_item(MegaItem::submenu( L10n::n("Submenú 2"), MegaMenu::new() - .with_item(MegaMenuItem::label(L10n::n("Opción 1"))) - .with_item(MegaMenuItem::label(L10n::n("Opción 2"))), + .with_item(MegaItem::label(L10n::n("Opción 1"))) + .with_item(MegaItem::label(L10n::n("Opción 2"))), )) - .with_item(MegaMenuItem::label(L10n::n("Opción 4"))); + .with_item(MegaItem::label(L10n::n("Opción 4"))); Page::new(request) .with_context(ContextOp::Theme("Bootsier")) From f5e38fc594120913d5ecf7cc368b50c4b516ed9b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 13:29:32 +0200 Subject: [PATCH 481/853] =?UTF-8?q?=F0=9F=94=96=20[macros]=20libera=20vers?= =?UTF-8?q?i=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml index 5400a68c..67f42aae 100644 --- a/pagetop-macros/Cargo.toml +++ b/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From 750d2c405356cad1dd5b887a06ee5e387dc4b00c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 13:33:19 +0200 Subject: [PATCH 482/853] =?UTF-8?q?=F0=9F=94=96=20[build]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-build/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-build/Cargo.toml b/pagetop-build/Cargo.toml index 3055f5fc..ddc147ee 100644 --- a/pagetop-build/Cargo.toml +++ b/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = [ From 8536f06d3f394970c7420340df18bc8e78704169 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 13:37:06 +0200 Subject: [PATCH 483/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.44?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 0ad6827d..fc1802d1 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.43" +version = "0.0.44" edition = "2021" authors = [ From 29b21d62c25dd32a91e3f72dc0f8f91eab0405d0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:11:35 +0200 Subject: [PATCH 484/853] =?UTF-8?q?=F0=9F=94=96=20[minimal]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index 46e2c9e5..0e6e8bc5 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From 1a819dd5fbe8b09a4d299ccd73cc86db8a6108fd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:15:06 +0200 Subject: [PATCH 485/853] =?UTF-8?q?=F0=9F=94=96=20[jquery]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index be136cab..086a19a4 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-jquery" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From 13d6173f2590db4e34ecff86c672569463132d0e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:18:56 +0200 Subject: [PATCH 486/853] =?UTF-8?q?=F0=9F=94=96=20[megamenu]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index 365febcb..d18fd6c7 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From b8f48f6e075922b949d4b03d728b6bff426a6726 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:22:08 +0200 Subject: [PATCH 487/853] =?UTF-8?q?=F0=9F=94=96=20[aliner]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index 64c0ade8..8ed64a34 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-aliner" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From a863c3a595f9a31742214898d7472bbdaf6e255a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:25:38 +0200 Subject: [PATCH 488/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 3195c469..f291929b 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From 1323f1b53e5cb05b86930882d5eb8c31f97dd1ec Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:28:23 +0200 Subject: [PATCH 489/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index 1ab7548e..cc4a3d37 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 8341c42fea25854b8dc0f503e2e512ecf45fd229 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:31:43 +0200 Subject: [PATCH 490/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index af3c2db2..3248d4bf 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 31a6949697d872b298f919c4a03a23dc7002df27 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:35:05 +0200 Subject: [PATCH 491/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20release=20deve?= =?UTF-8?q?lopment=20version=200.0.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 4a5a6226..711aba6f 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.12" +version = "0.0.13" edition = "2021" authors = [ From 53db19d53df2d936c864056b5afeb28e550dc453 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:38:19 +0200 Subject: [PATCH 492/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index bf602ac4..4458a5ec 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.10" +version = "0.0.11" edition = "2021" authors = [ From baf683a278986ceac4e5fa25e2a24570e5310c4e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 31 Jul 2023 14:41:33 +0200 Subject: [PATCH 493/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 183426e3..87976e8c 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.12" +version = "0.0.13" edition = "2021" authors = [ From dd93cfb9c828a07b8ba14e08cf29fc2019b79130 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 1 Aug 2023 20:08:29 +0200 Subject: [PATCH 494/853] =?UTF-8?q?=F0=9F=92=A5=20Standarize=20with()=20as?= =?UTF-8?q?=20constructor=20with=20arguments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/item.rs | 10 +++++----- pagetop/src/core/action/all.rs | 2 +- pagetop/src/core/action/list.rs | 2 +- pagetop/src/core/component/one.rs | 2 +- pagetop/src/core/component/pack.rs | 2 +- pagetop/src/core/theme/regions.rs | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pagetop-megamenu/src/component/item.rs b/pagetop-megamenu/src/component/item.rs index 95de934f..7a4a5236 100644 --- a/pagetop-megamenu/src/component/item.rs +++ b/pagetop-megamenu/src/component/item.rs @@ -81,35 +81,35 @@ impl ComponentTrait for MegaItem { impl MegaItem { pub fn label(label: L10n) -> Self { MegaItem { - item_type: MegaItemType::Label(OneComponent::new_with(label)), + item_type: MegaItemType::Label(Label::with(label)), ..Default::default() } } pub fn link(label: L10n, path: MegaItemPath) -> Self { MegaItem { - item_type: MegaItemType::Link(OneComponent::new_with(label), path), + item_type: MegaItemType::Link(Label::with(label), path), ..Default::default() } } pub fn link_blank(label: L10n, path: MegaItemPath) -> Self { MegaItem { - item_type: MegaItemType::LinkBlank(OneComponent::new_with(label), path), + item_type: MegaItemType::LinkBlank(Label::with(label), path), ..Default::default() } } pub fn html(content: Html) -> Self { MegaItem { - item_type: MegaItemType::Html(OneComponent::new_with(content)), + item_type: MegaItemType::Html(Content::with(content)), ..Default::default() } } pub fn submenu(label: L10n, menu: MegaMenu) -> Self { MegaItem { - item_type: MegaItemType::Submenu(OneComponent::new_with(label), menu), + item_type: MegaItemType::Submenu(Label::with(label), menu), ..Default::default() } } diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index 6273c2e7..4be2afe0 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -14,7 +14,7 @@ pub fn add_action(action: Action) { if let Some(list) = actions.get_mut(&action_handle) { list.add(action); } else { - actions.insert(action_handle, ActionsList::new_with(action)); + actions.insert(action_handle, ActionsList::with(action)); } } diff --git a/pagetop/src/core/action/list.rs b/pagetop/src/core/action/list.rs index 99ea1887..3449e103 100644 --- a/pagetop/src/core/action/list.rs +++ b/pagetop/src/core/action/list.rs @@ -18,7 +18,7 @@ impl ActionsList { ActionsList(Arc::new(RwLock::new(Vec::new()))) } - pub fn new_with(action: Action) -> Self { + pub fn with(action: Action) -> Self { let mut list = ActionsList::new(); list.add(action); list diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs index 60ff23ef..f0d31ef5 100644 --- a/pagetop/src/core/component/one.rs +++ b/pagetop/src/core/component/one.rs @@ -11,7 +11,7 @@ impl<T: ComponentTrait + Default> OneComponent<T> { OneComponent::<T>::default() } - pub fn new_with(component: T) -> Self { + pub fn with(component: T) -> Self { OneComponent(Some(Arc::new(RwLock::new(component)))) } diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index 16831171..0e95dd2c 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -47,7 +47,7 @@ impl PackComponents { PackComponents::default() } - pub fn new_with(cref: ComponentRef) -> Self { + pub fn with(cref: ComponentRef) -> Self { let mut pack = PackComponents::new(); pack.alter(PackOp::Add, cref); pack diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index ba40d975..0e1d7460 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -19,7 +19,7 @@ impl ComponentsRegions { ComponentsRegions::default() } - pub fn new_with(region: &'static str, cref: ComponentRef) -> Self { + pub fn with(region: &'static str, cref: ComponentRef) -> Self { let mut regions = ComponentsRegions::new(); regions.add_in(region, cref); regions @@ -29,7 +29,7 @@ impl ComponentsRegions { if let Some(region) = self.0.get_mut(region) { region.alter(PackOp::Add, cref); } else { - self.0.insert(region, PackComponents::new_with(cref)); + self.0.insert(region, PackComponents::with(cref)); } } @@ -58,7 +58,7 @@ pub fn add_component_in(region: Region, cref: ComponentRef) { if let Some(hm) = regions.get_mut(&theme.handle()) { hm.add_in(region, cref); } else { - regions.insert(theme.handle(), ComponentsRegions::new_with(region, cref)); + regions.insert(theme.handle(), ComponentsRegions::with(region, cref)); } } } From 117416a4293f94a9b263cc445ace793c2566fceb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 1 Aug 2023 20:13:45 +0200 Subject: [PATCH 495/853] =?UTF-8?q?=F0=9F=8E=A8=20IImprove=20the=20printin?= =?UTF-8?q?g=20of=20banner=20on=20app=20startup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/config/settings.predefined.toml | 2 +- pagetop/src/app.rs | 29 ++++++++++++++----------- pagetop/src/config.rs | 4 ++-- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index cfdbfd75..ca1c39f9 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -1,6 +1,6 @@ [app] name = "PageTop Application" -description = "Developed with the amazing PageTop framework." +description = "Developed with the awesome PageTop framework." # Tema predeterminado. theme = "Default" # Idioma (localización) predeterminado. diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index ae1d3b42..762b5ae7 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -6,7 +6,7 @@ use crate::core::{module, module::ModuleRef}; use crate::html::Markup; use crate::response::fatal_error::FatalError; use crate::response::page::ResultPage; -use crate::{config, locale, service, trace, LazyStatic}; +use crate::{concat_string, config, locale, service, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db; @@ -94,26 +94,29 @@ impl Application { fn print_on_startup() { if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { + // Application name. + let mut app_name = config::SETTINGS.app.name.to_string(); if let Some((term_width, _)) = term_size::dimensions() { if term_width >= 80 { let maxlen = (term_width / 10) - 2; - let mut app = config::SETTINGS.app.name.substring(0, maxlen).to_owned(); - if config::SETTINGS.app.name.len() > maxlen { + let mut app = app_name.substring(0, maxlen).to_owned(); + if app_name.len() > maxlen { app = format!("{}...", app); } - println!( - "\n{} {}\n\n Powered by PageTop {}\n", - figfont::FIGFONT.convert(&app).unwrap(), - &config::SETTINGS.app.description, - env!("CARGO_PKG_VERSION") - ); - return; + app_name = figfont::FIGFONT.convert(&app).unwrap().to_string(); } } + // Application description. + let app_description = if !config::SETTINGS.app.description.is_empty() { + concat_string!("\n", config::SETTINGS.app.description) + } else { + "".to_string() + }; + // Print banner. println!( - "\n{}\n{}\n\nPowered by PageTop {}\n", - &config::SETTINGS.app.name, - &config::SETTINGS.app.description, + "\n{}{}\n\nPowered by PageTop {}\n", + app_name, + app_description, env!("CARGO_PKG_VERSION") ); } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 53533905..376dcd06 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -179,7 +179,7 @@ pub struct App { /// Por defecto: *"PageTop App"*. pub name: String, /// Una descripción breve de la aplicación. - /// Por defecto: *"Modular web solutions made simple with PageTop."*. + /// Por defecto: *"Developed with the awesome PageTop framework."*. pub description: String, /// Tema predeterminado. /// Por defecto: *"Default"*. @@ -283,7 +283,7 @@ pub struct Server { default_settings!( // [app] "app.name" => "PageTop App", - "app.description" => "Modular web solutions made simple with PageTop.", + "app.description" => "Developed with the awesome PageTop framework.", "app.theme" => "Default", "app.language" => "en-US", "app.direction" => "ltr", From fff8ab19aa258594b0664a4c70c212fb194fb97a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 1 Aug 2023 20:29:36 +0200 Subject: [PATCH 496/853] =?UTF-8?q?=E2=9C=A8=20Add=20new=20component=20Sit?= =?UTF-8?q?eBranding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component.rs | 2 + pagetop-minimal/src/component/image.rs | 15 +-- pagetop-minimal/src/component/poweredby.rs | 8 +- .../src/component/site_branding.rs | 121 ++++++++++++++++++ pagetop-minimal/src/locale/en-US/module.ftl | 3 + pagetop-minimal/src/locale/es-ES/module.ftl | 3 + 6 files changed, 136 insertions(+), 16 deletions(-) create mode 100644 pagetop-minimal/src/component/site_branding.rs diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 1aeef5fb..0d0c1311 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -15,6 +15,8 @@ mod image; pub use image::{Image, COMPONENT_IMAGE}; mod block; pub use block::{Block, COMPONENT_BLOCK}; +mod site_branding; +pub use site_branding::{SiteBranding, COMPONENT_BRANDING}; mod poweredby; pub use poweredby::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index dee86745..f755809f 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -10,7 +10,6 @@ pub struct Image { id : IdentifierValue, classes : Classes, source : AttributeValue, - template : String, } impl ComponentTrait for Image { @@ -49,6 +48,10 @@ impl Image { Image::new().with_source(source) } + pub fn pagetop() -> Self { + Image::new().with_source("/minimal/pagetop-logo.svg") + } + // Image BUILDER. #[fn_builder] @@ -81,12 +84,6 @@ impl Image { self } - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Image GETTERS. pub fn classes(&self) -> &Classes { @@ -96,8 +93,4 @@ impl Image { pub fn source(&self) -> &AttributeValue { &self.source } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop-minimal/src/component/poweredby.rs b/pagetop-minimal/src/component/poweredby.rs index fde6082e..e4867834 100644 --- a/pagetop-minimal/src/component/poweredby.rs +++ b/pagetop-minimal/src/component/poweredby.rs @@ -1,7 +1,7 @@ -use crate::{Minimal, LOCALES_MINIMAL}; - use pagetop::prelude::*; +use crate::{Minimal, LOCALES_MINIMAL}; + new_handle!(COMPONENT_POWEREDBY); #[derive(Default, Eq, PartialEq)] @@ -58,7 +58,6 @@ impl ComponentTrait for PoweredBy { PoweredByLogo::Color => { let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); html! { - " " span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { img src="/minimal/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} } @@ -80,7 +79,7 @@ impl ComponentTrait for PoweredBy { @if let Some(c) = self.copyright() { span class="copyright" { (c) "." } " " } - span class="powered" { (credits.prepare(cx)) (logo) } + span class="powered" { (credits.prepare(cx)) " " (logo) } } }) } @@ -129,7 +128,6 @@ impl PoweredBy { let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); let logo_rgb = format!("rgb({},{},{})", r, g, b); html! { - " " span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} diff --git a/pagetop-minimal/src/component/site_branding.rs b/pagetop-minimal/src/component/site_branding.rs new file mode 100644 index 00000000..fbe10ac6 --- /dev/null +++ b/pagetop-minimal/src/component/site_branding.rs @@ -0,0 +1,121 @@ +use pagetop::prelude::*; + +use crate::component::Image; +use crate::Minimal; +use crate::LOCALES_MINIMAL; + +new_handle!(COMPONENT_BRANDING); + +type SiteSlogan = OneComponent<L10n>; +type SiteLogo = OneComponent<Image>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct SiteBranding { + weight : Weight, + renderable: Renderable, + name : String, + slogan : SiteSlogan, + logo : SiteLogo, +} + +impl ComponentTrait for SiteBranding { + fn new() -> Self { + SiteBranding { + name: config::SETTINGS.app.name.to_owned(), + ..Default::default() + } + } + + fn handle(&self) -> Handle { + COMPONENT_BRANDING + } + + fn id(&self) -> Option<String> { + Some("site-branding".to_owned()) + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + Minimal.load_assets(cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let title = L10n::t("site_home", &LOCALES_MINIMAL).prepare(cx); + let slogan = self.slogan().prepare(cx); + PrepareMarkup::With(html! { + div id=[self.id()] { + div class="site-branding-wrapper" { + div class="site-branding-logo" { + (self.logo().prepare(cx)) + } + div class="site-branding-text" { + div class="site-branding-name" { + a href="/" title=(title) rel="home" { (self.name()) } + } + @if !slogan.is_empty() { + div class="site-branding-slogan" { + (slogan) + } + } + } + } + } + }) + } +} + +impl SiteBranding { + // SiteBranding BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: impl Into<String>) -> &mut Self { + self.name = name.into(); + self + } + + #[fn_builder] + pub fn alter_slogan(&mut self, slogan: L10n) -> &mut Self { + self.slogan = SiteSlogan::with(slogan); + self + } + + #[fn_builder] + pub fn alter_logo(&mut self, logo: Image) -> &mut Self { + self.logo.set(logo); + self + } + + // SiteBranding GETTERS. + + pub fn name(&self) -> &String { + &self.name + } + + pub fn slogan(&self) -> &SiteSlogan { + &self.slogan + } + + pub fn logo(&self) -> &SiteLogo { + &self.logo + } +} diff --git a/pagetop-minimal/src/locale/en-US/module.ftl b/pagetop-minimal/src/locale/en-US/module.ftl index 28ef3779..bef19cf3 100644 --- a/pagetop-minimal/src/locale/en-US/module.ftl +++ b/pagetop-minimal/src/locale/en-US/module.ftl @@ -1,6 +1,9 @@ module_name = Minimal components module_description = Minimal set of components for page composition. +# SiteBranding component. +site_home = Home + # PoweredBy component. poweredby_pagetop = Powered by {$pagetop_link} pagetop_logo = PageTop logo diff --git a/pagetop-minimal/src/locale/es-ES/module.ftl b/pagetop-minimal/src/locale/es-ES/module.ftl index 3eeb46df..8576b061 100644 --- a/pagetop-minimal/src/locale/es-ES/module.ftl +++ b/pagetop-minimal/src/locale/es-ES/module.ftl @@ -1,6 +1,9 @@ module_name = Componentes Minimal module_description = Conjunto mínimo de componentes para la composición de páginas. +# SiteBranding component. +site_home = Inicio + # PoweredBy component. poweredby_pagetop = Funciona con {$pagetop_link} pagetop_logo = Logotipo de PageTop From 25cb46e7120dca23d86d7344178ff82a8914ece5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 5 Aug 2023 10:54:02 +0200 Subject: [PATCH 497/853] =?UTF-8?q?=E2=9C=A8=20Introduce=20ContextualPath?= =?UTF-8?q?=20as=20dynamic=20path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/item.rs | 10 ++--- pagetop-megamenu/src/lib.rs | 2 +- pagetop-minimal/src/component.rs | 4 +- .../component/{poweredby.rs => powered_by.rs} | 2 +- .../src/component/site_branding.rs | 33 ++++++++++++--- pagetop-minimal/static/css/minimal.css | 41 +++++++++++++++++-- pagetop/src/core/component.rs | 1 + 7 files changed, 74 insertions(+), 19 deletions(-) rename pagetop-minimal/src/component/{poweredby.rs => powered_by.rs} (99%) diff --git a/pagetop-megamenu/src/component/item.rs b/pagetop-megamenu/src/component/item.rs index 7a4a5236..00038b4a 100644 --- a/pagetop-megamenu/src/component/item.rs +++ b/pagetop-megamenu/src/component/item.rs @@ -7,15 +7,13 @@ new_handle!(COMPONENT_MEGAITEM); type Label = OneComponent<L10n>; type Content = OneComponent<Html>; -pub type MegaItemPath = fn(cx: &Context) -> &str; - #[derive(Default)] pub enum MegaItemType { #[default] Void, Label(Label), - Link(Label, MegaItemPath), - LinkBlank(Label, MegaItemPath), + Link(Label, ContextualPath), + LinkBlank(Label, ContextualPath), Html(Content), Submenu(Label, MegaMenu), Separator, @@ -86,14 +84,14 @@ impl MegaItem { } } - pub fn link(label: L10n, path: MegaItemPath) -> Self { + pub fn link(label: L10n, path: ContextualPath) -> Self { MegaItem { item_type: MegaItemType::Link(Label::with(label), path), ..Default::default() } } - pub fn link_blank(label: L10n, path: MegaItemPath) -> Self { + pub fn link_blank(label: L10n, path: ContextualPath) -> Self { MegaItem { item_type: MegaItemType::LinkBlank(Label::with(label), path), ..Default::default() diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index fc75fa9f..356e27ab 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; pub mod component { mod item; - pub use item::{MegaItem, MegaItemPath, MegaItemType, COMPONENT_MEGAITEM}; + pub use item::{MegaItem, MegaItemType, COMPONENT_MEGAITEM}; mod menu; pub use menu::{MegaMenu, COMPONENT_MEGAMENU}; } diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 0d0c1311..3cbae79f 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -17,8 +17,8 @@ mod block; pub use block::{Block, COMPONENT_BLOCK}; mod site_branding; pub use site_branding::{SiteBranding, COMPONENT_BRANDING}; -mod poweredby; -pub use poweredby::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; +mod powered_by; +pub use powered_by::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; pub mod form_element; pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop-minimal/src/component/poweredby.rs b/pagetop-minimal/src/component/powered_by.rs similarity index 99% rename from pagetop-minimal/src/component/poweredby.rs rename to pagetop-minimal/src/component/powered_by.rs index e4867834..63eeb0bb 100644 --- a/pagetop-minimal/src/component/poweredby.rs +++ b/pagetop-minimal/src/component/powered_by.rs @@ -38,7 +38,7 @@ impl ComponentTrait for PoweredBy { } fn id(&self) -> Option<String> { - Some("poweredby".to_owned()) + Some("powered-by".to_owned()) } fn weight(&self) -> Weight { diff --git a/pagetop-minimal/src/component/site_branding.rs b/pagetop-minimal/src/component/site_branding.rs index fbe10ac6..82f5838e 100644 --- a/pagetop-minimal/src/component/site_branding.rs +++ b/pagetop-minimal/src/component/site_branding.rs @@ -10,21 +10,32 @@ type SiteSlogan = OneComponent<L10n>; type SiteLogo = OneComponent<Image>; #[rustfmt::skip] -#[derive(Default)] pub struct SiteBranding { weight : Weight, renderable: Renderable, name : String, slogan : SiteSlogan, logo : SiteLogo, + frontpage : ContextualPath, +} + +#[rustfmt::skip] +impl Default for SiteBranding { + fn default() -> Self { + SiteBranding { + weight : Weight::default(), + renderable: Renderable::default(), + name : config::SETTINGS.app.name.to_owned(), + slogan : SiteSlogan::default(), + logo : SiteLogo::default(), + frontpage : |_| "/", + } + } } impl ComponentTrait for SiteBranding { fn new() -> Self { - SiteBranding { - name: config::SETTINGS.app.name.to_owned(), - ..Default::default() - } + SiteBranding::default() } fn handle(&self) -> Handle { @@ -58,7 +69,7 @@ impl ComponentTrait for SiteBranding { } div class="site-branding-text" { div class="site-branding-name" { - a href="/" title=(title) rel="home" { (self.name()) } + a href=(self.frontpage()(cx)) title=(title) rel="home" { (self.name()) } } @if !slogan.is_empty() { div class="site-branding-slogan" { @@ -105,6 +116,12 @@ impl SiteBranding { self } + #[fn_builder] + pub fn alter_frontpage(&mut self, frontpage: ContextualPath) -> &mut Self { + self.frontpage = frontpage; + self + } + // SiteBranding GETTERS. pub fn name(&self) -> &String { @@ -118,4 +135,8 @@ impl SiteBranding { pub fn logo(&self) -> &SiteLogo { &self.logo } + + pub fn frontpage(&self) -> &ContextualPath { + &self.frontpage + } } diff --git a/pagetop-minimal/static/css/minimal.css b/pagetop-minimal/static/css/minimal.css index 8f674cbf..9c6df304 100644 --- a/pagetop-minimal/static/css/minimal.css +++ b/pagetop-minimal/static/css/minimal.css @@ -1,9 +1,44 @@ +/* SiteBranding component */ +#site-branding { + float: left; +} +.site-branding-wrapper { + position: relative; +} +.site-branding-logo { + display: none; +} +.site-branding-text { + display: inline-block; + margin: 10px 0 0 10px; +} +.site-branding-slogan { + display: none; +} +@media (min-width: 768px) { + #site-branding { + display: inline-block; + } + .site-branding-logo { + display: inline-block; + margin: 10px 0 0 10px; + } + .site-branding-text { + position: absolute; + width: max-content; + bottom: 0; + } + .site-branding-slogan { + display: block; + } +} + /* PoweredBy component */ -#poweredby { +#powered-by { text-align: center; } -#poweredby .pagetop-logo img, -#poweredby .pagetop-logo svg { +#powered-by .pagetop-logo img, +#powered-by .pagetop-logo svg { margin-left: .275em; height: 1.275em; vertical-align: middle; diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 833aa16c..a4573f1d 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,5 +1,6 @@ mod context; pub use context::{Context, ContextOp}; +pub type ContextualPath = fn(cx: &Context) -> &str; mod definition; pub use definition::{component_mut, component_ref, ComponentBase, ComponentTrait}; From 5f02ef7f2c43f3d36fa2d81f1d80afbcce7c4921 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 5 Aug 2023 11:00:51 +0200 Subject: [PATCH 498/853] =?UTF-8?q?=F0=9F=9A=A7=20Avoid=20semicolons=20for?= =?UTF-8?q?=20empty=20html=20elements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/form_element/date.rs | 4 ++-- pagetop-minimal/src/component/form_element/hidden.rs | 2 +- pagetop-minimal/src/component/form_element/input.rs | 4 ++-- pagetop-minimal/src/component/icon.rs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 0bccb47d..d0c3bf2c 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -50,7 +50,7 @@ impl ComponentTrait for Date { @if self.required().get().is_some() { span class="form-required" - title="Este campo es obligatorio." { "*" } " "; + title="Este campo es obligatorio." { "*" } " " } } } @@ -65,7 +65,7 @@ impl ComponentTrait for Date { autocomplete=[self.autocomplete().get()] readonly=[self.readonly().get()] required=[self.required().get()] - disabled=[self.disabled().get()]; + disabled=[self.disabled().get()] {} @if let Some(help_text) = self.help_text().get() { div class="form-text" { (help_text) } } diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index 9aeeeed3..cd767df9 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -26,7 +26,7 @@ impl ComponentTrait for Hidden { fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { let id = self.name().get().map(|name| concat_string!("value-", name)); PrepareMarkup::With(html! { - input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()]; + input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()] {} }) } } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index c50c15d2..81288a4c 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -81,7 +81,7 @@ impl ComponentTrait for Input { @if self.required().get().is_some() { span class="form-required" - title="Este campo es obligatorio." { "*" } " "; + title="Este campo es obligatorio." { "*" } " " } } } @@ -99,7 +99,7 @@ impl ComponentTrait for Input { autocomplete=[self.autocomplete().get()] readonly=[self.readonly().get()] required=[self.required().get()] - disabled=[self.disabled().get()]; + disabled=[self.disabled().get()] {} @if !description.is_empty() { div class="form-text" { (description) } } diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 081be948..4aec341d 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -35,7 +35,7 @@ impl ComponentTrait for Icon { } fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { i class=[self.classes().get()] {}; }) + PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) } } From 8934330523efaefc101566b54ebcec190e9013f3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 11 Aug 2023 10:44:08 +0200 Subject: [PATCH 499/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20grid=20handles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/src/lib.rs | 4 ++-- pagetop-minimal/src/component/grid.rs | 4 ++-- pagetop-minimal/src/component/grid/column.rs | 6 +++--- pagetop-minimal/src/component/grid/row.rs | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 680389c8..144710b5 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -87,7 +87,7 @@ impl ThemeTrait for Bulmix { }, ); } - grid::COMPONENT_COLUMN => { + grid::COMPONENT_GRID_COLUMN => { let col = component_mut::<grid::Column>(component); col.alter_classes( ClassesOp::SetDefault, @@ -113,7 +113,7 @@ impl ThemeTrait for Bulmix { .as_str(), ); } - grid::COMPONENT_ROW => { + grid::COMPONENT_GRID_ROW => { let row = component_mut::<grid::Row>(component); row.alter_classes(ClassesOp::SetDefault, "columns"); } diff --git a/pagetop-minimal/src/component/grid.rs b/pagetop-minimal/src/component/grid.rs index b85bf837..107af499 100644 --- a/pagetop-minimal/src/component/grid.rs +++ b/pagetop-minimal/src/component/grid.rs @@ -1,4 +1,4 @@ mod row; -pub use row::{Row, COMPONENT_ROW}; +pub use row::{Row, COMPONENT_GRID_ROW}; mod column; -pub use column::{Column, ColumnSize, COMPONENT_COLUMN}; +pub use column::{Column, ColumnSize, COMPONENT_GRID_COLUMN}; diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index ec747ac1..151aa517 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -1,10 +1,10 @@ use pagetop::prelude::*; -new_handle!(COMPONENT_COLUMN); +new_handle!(COMPONENT_GRID_COLUMN); actions_for_component!(Column); -const SIZE_DEFAULT: &str = "col-md"; +const SIZE_DEFAULT: &str = "col"; const SIZE_1_OF_12: &str = "col-md-1"; const SIZE_2_OF_12: &str = "col-md-2"; const SIZE_3_OF_12: &str = "col-md-3"; @@ -54,7 +54,7 @@ impl ComponentTrait for Column { } fn handle(&self) -> Handle { - COMPONENT_COLUMN + COMPONENT_GRID_COLUMN } fn id(&self) -> Option<String> { diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index f150bbc2..91450629 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; use crate::component::grid; -new_handle!(COMPONENT_ROW); +new_handle!(COMPONENT_GRID_ROW); actions_for_component!(Row); @@ -23,7 +23,7 @@ impl ComponentTrait for Row { } fn handle(&self) -> Handle { - COMPONENT_ROW + COMPONENT_GRID_ROW } fn id(&self) -> Option<String> { From df0b2eeb7119a03bd629296687e6b038ac5ecbb0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 10:27:59 +0200 Subject: [PATCH 500/853] =?UTF-8?q?=F0=9F=9A=A7=20Enhance=20function-assoc?= =?UTF-8?q?iated=20type=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/renderable.rs | 4 ++-- pagetop/src/response/page/action.rs | 2 +- pagetop/src/response/page/action/after_prepare_body.rs | 6 +++--- pagetop/src/response/page/action/before_prepare_body.rs | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index bac3e384..3c105918 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -1,9 +1,9 @@ use crate::core::component::Context; -pub type IsRenderable = fn(cx: &Context) -> bool; +pub type FnIsRenderable = fn(cx: &Context) -> bool; pub struct Renderable { - pub check: IsRenderable, + pub check: FnIsRenderable, } impl Default for Renderable { diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/response/page/action.rs index b61bc895..d3a81011 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/response/page/action.rs @@ -1,6 +1,6 @@ use crate::response::page::Page; -pub type ActionPage = fn(page: &mut Page); +pub type FnActionPage = fn(page: &mut Page); mod before_prepare_body; pub use before_prepare_body::*; diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/response/page/action/after_prepare_body.rs index ff74cedc..457a17db 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -1,12 +1,12 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; -use crate::response::page::action::ActionPage; +use crate::response::page::action::FnActionPage; use crate::response::page::Page; use crate::{new_handle, Handle, Weight}; new_handle!(ACTION_AFTER_PREPARE_BODY for Action); pub struct ActionAfterPrepareBody { - action: Option<ActionPage>, + action: Option<FnActionPage>, weight: Weight, } @@ -28,7 +28,7 @@ impl ActionTrait for ActionAfterPrepareBody { } impl ActionAfterPrepareBody { - pub fn with_action(mut self, action: ActionPage) -> Self { + pub fn with_action(mut self, action: FnActionPage) -> Self { self.action = Some(action); self } diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/response/page/action/before_prepare_body.rs index 715d8378..e5622567 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -1,12 +1,12 @@ use crate::core::action::{action_ref, run_actions, ActionTrait}; -use crate::response::page::action::ActionPage; +use crate::response::page::action::FnActionPage; use crate::response::page::Page; use crate::{new_handle, Handle, Weight}; new_handle!(ACTION_BEFORE_PREPARE_BODY for Action); pub struct ActionBeforePrepareBody { - action: Option<ActionPage>, + action: Option<FnActionPage>, weight: Weight, } @@ -28,7 +28,7 @@ impl ActionTrait for ActionBeforePrepareBody { } impl ActionBeforePrepareBody { - pub fn with_action(mut self, action: ActionPage) -> Self { + pub fn with_action(mut self, action: FnActionPage) -> Self { self.action = Some(action); self } From 68b54fbce5d3c80d5aede2898ec4f7068dafa08d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 10:42:39 +0200 Subject: [PATCH 501/853] =?UTF-8?q?=F0=9F=9A=A7=20Revamp=20ComponentRef=20?= =?UTF-8?q?to=20ComponentArc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/block.rs | 13 ++-- .../src/component/form_element/form.rs | 9 ++- pagetop-minimal/src/component/grid/column.rs | 13 ++-- pagetop-minimal/src/component/grid/row.rs | 4 +- pagetop-minimal/src/component/paragraph.rs | 13 ++-- pagetop/src/core/component.rs | 19 +++--- pagetop/src/core/component/arc.rs | 30 ++++++++++ pagetop/src/core/component/pack.rs | 59 +++++-------------- pagetop/src/core/theme/regions.rs | 20 +++---- pagetop/src/response/page.rs | 4 +- 10 files changed, 105 insertions(+), 79 deletions(-) create mode 100644 pagetop/src/core/component/arc.rs diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 823bf2b3..7d19f588 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -12,7 +12,7 @@ pub struct Block { id : IdentifierValue, classes : Classes, title : AttributeValue, - content : PackComponents, + stuff : PackComponents, template : String, } @@ -94,12 +94,17 @@ impl Block { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.content.alter(PackOp::Add, ComponentRef::to(component)); + self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self + } + + pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { + self.stuff.alter(PackOp::Add, arc); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.content.alter(op, ComponentRef::to(component)); + self.stuff.alter(op, ComponentArc::new(component)); self } @@ -120,7 +125,7 @@ impl Block { } pub fn components(&self) -> &PackComponents { - &self.content + &self.stuff } pub fn template(&self) -> &str { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index d3e2f2fb..358e162d 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -121,12 +121,17 @@ impl Form { } pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.elements.alter(PackOp::Add, ComponentRef::to(element)); + self.elements.alter(PackOp::Add, ComponentArc::new(element)); + self + } + + pub fn with_element_arc(mut self, arc: ComponentArc) -> Self { + self.elements.alter(PackOp::Add, arc); self } pub fn alter_elements(&mut self, op: PackOp, element: impl ComponentTrait) -> &mut Self { - self.elements.alter(op, ComponentRef::to(element)); + self.elements.alter(op, ComponentArc::new(element)); self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 151aa517..044260f1 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -44,7 +44,7 @@ pub struct Column { id : IdentifierValue, classes : Classes, size : ColumnSize, - content : PackComponents, + stuff : PackComponents, template : String, } @@ -136,12 +136,17 @@ impl Column { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.content.alter(PackOp::Add, ComponentRef::to(component)); + self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self + } + + pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { + self.stuff.alter(PackOp::Add, arc); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.content.alter(op, ComponentRef::to(component)); + self.stuff.alter(op, ComponentArc::new(component)); self } @@ -162,7 +167,7 @@ impl Column { } pub fn components(&self) -> &PackComponents { - &self.content + &self.stuff } pub fn template(&self) -> &str { diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 91450629..923910dc 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -83,12 +83,12 @@ impl Row { } pub fn with_column(mut self, column: grid::Column) -> Self { - self.columns.alter(PackOp::Add, ComponentRef::to(column)); + self.columns.alter(PackOp::Add, ComponentArc::new(column)); self } pub fn alter_columns(&mut self, op: PackOp, column: grid::Column) -> &mut Self { - self.columns.alter(op, ComponentRef::to(column)); + self.columns.alter(op, ComponentArc::new(column)); self } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 09e85ddb..c6b3e508 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -20,7 +20,7 @@ pub struct Paragraph { renderable: Renderable, id : IdentifierValue, classes : Classes, - content : PackComponents, + stuff : PackComponents, display : ParagraphDisplay, template : String, } @@ -90,12 +90,17 @@ impl Paragraph { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.content.alter(PackOp::Add, ComponentRef::to(component)); + self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self + } + + pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { + self.stuff.alter(PackOp::Add, arc); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.content.alter(op, ComponentRef::to(component)); + self.stuff.alter(op, ComponentArc::new(component)); self } @@ -130,7 +135,7 @@ impl Paragraph { } pub fn components(&self) -> &PackComponents { - &self.content + &self.stuff } pub fn display(&self) -> &ParagraphDisplay { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index a4573f1d..32d742c3 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -1,18 +1,21 @@ mod context; pub use context::{Context, ContextOp}; -pub type ContextualPath = fn(cx: &Context) -> &str; +pub type FnContextualPath = fn(cx: &Context) -> &str; mod definition; pub use definition::{component_mut, component_ref, ComponentBase, ComponentTrait}; +mod arc; +pub use arc::ComponentArc; + mod one; pub use one::OneComponent; mod pack; -pub use pack::{ComponentRef, PackComponents, PackOp}; +pub use pack::{PackComponents, PackOp}; mod renderable; -pub use renderable::{IsRenderable, Renderable}; +pub use renderable::{FnIsRenderable, Renderable}; pub mod html; pub mod l10n; @@ -23,7 +26,7 @@ macro_rules! actions_for_component { $crate::paste! { use $crate::prelude::*; - pub type [<Action $Component>] = fn(component: &$Component, cx: &mut Context); + pub type [<FnAction $Component>] = fn(component: &$Component, cx: &mut Context); // ************************************************************************************* // ACTION BEFORE PREPARE COMPONENT @@ -32,7 +35,7 @@ macro_rules! actions_for_component { $crate::new_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); pub struct [<BeforePrepare $Component>] { - action: Option<[<Action $Component>]>, + action: Option<[<FnAction $Component>]>, weight: Weight, } @@ -55,7 +58,7 @@ macro_rules! actions_for_component { impl [<BeforePrepare $Component>] { #[allow(dead_code)] - pub fn with_action(mut self, action: [<Action $Component>]) -> Self { + pub fn with_action(mut self, action: [<FnAction $Component>]) -> Self { self.action = Some(action); self } @@ -91,7 +94,7 @@ macro_rules! actions_for_component { $crate::new_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); pub struct [<AfterPrepare $Component>] { - action: Option<[<Action $Component>]>, + action: Option<[<FnAction $Component>]>, weight: Weight, } @@ -114,7 +117,7 @@ macro_rules! actions_for_component { impl [<AfterPrepare $Component>] { #[allow(dead_code)] - pub fn with_action(mut self, action: [<Action $Component>]) -> Self { + pub fn with_action(mut self, action: [<FnAction $Component>]) -> Self { self.action = Some(action); self } diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs new file mode 100644 index 00000000..93e1193c --- /dev/null +++ b/pagetop/src/core/component/arc.rs @@ -0,0 +1,30 @@ +use crate::core::component::{ComponentTrait, Context}; +use crate::html::Markup; +use crate::{Handle, Weight}; + +use std::sync::{Arc, RwLock}; + +#[derive(Clone)] +pub struct ComponentArc(Arc<RwLock<dyn ComponentTrait>>); + +impl ComponentArc { + pub fn new(component: impl ComponentTrait) -> Self { + ComponentArc(Arc::new(RwLock::new(component))) + } + + pub(crate) fn handle(&self) -> Handle { + self.0.read().unwrap().handle() + } + + pub(crate) fn id(&self) -> Option<String> { + self.0.read().unwrap().id() + } + + pub(crate) fn weight(&self) -> Weight { + self.0.read().unwrap().weight() + } + + pub(crate) fn prepare(&self, cx: &mut Context) -> Markup { + self.0.write().unwrap().prepare(cx) + } +} diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index 0e95dd2c..e55799c9 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -1,33 +1,6 @@ -use crate::core::component::{ComponentTrait, Context}; +use crate::core::component::{ComponentArc, Context}; use crate::html::{html, Markup}; -use crate::{Handle, Weight}; - -use std::sync::{Arc, RwLock}; - -#[derive(Clone)] -pub struct ComponentRef(Arc<RwLock<dyn ComponentTrait>>); - -impl ComponentRef { - pub fn to(component: impl ComponentTrait) -> Self { - ComponentRef(Arc::new(RwLock::new(component))) - } - - fn handle(&self) -> Handle { - self.0.read().unwrap().handle() - } - - fn id(&self) -> Option<String> { - self.0.read().unwrap().id() - } - - fn weight(&self) -> Weight { - self.0.read().unwrap().weight() - } - - fn prepare(&self, cx: &mut Context) -> Markup { - self.0.write().unwrap().prepare(cx) - } -} +use crate::Handle; pub enum PackOp { Add, @@ -40,16 +13,16 @@ pub enum PackOp { } #[derive(Clone, Default)] -pub struct PackComponents(Vec<ComponentRef>); +pub struct PackComponents(Vec<ComponentArc>); impl PackComponents { pub fn new() -> Self { PackComponents::default() } - pub fn with(cref: ComponentRef) -> Self { + pub fn with(arc: ComponentArc) -> Self { let mut pack = PackComponents::new(); - pack.alter(PackOp::Add, cref); + pack.alter(PackOp::Add, arc); pack } @@ -63,22 +36,22 @@ impl PackComponents { // PackComponents BUILDER. - pub fn alter(&mut self, op: PackOp, cref: ComponentRef) -> &mut Self { + pub fn alter(&mut self, op: PackOp, arc: ComponentArc) -> &mut Self { match op { - PackOp::Add => self.0.push(cref), + PackOp::Add => self.0.push(arc), PackOp::AddAfterId(id) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index + 1, cref), - _ => self.0.push(cref), + Some(index) => self.0.insert(index + 1, arc), + _ => self.0.push(arc), } } PackOp::AddBeforeId(id) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index, cref), - _ => self.0.insert(0, cref), + Some(index) => self.0.insert(index, arc), + _ => self.0.insert(0, arc), } } - PackOp::AddFirst => self.0.insert(0, cref), + PackOp::AddFirst => self.0.insert(0, arc), PackOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { self.0.remove(index); @@ -87,7 +60,7 @@ impl PackComponents { PackOp::ReplaceById(id) => { for c in self.0.iter_mut() { if c.id().as_deref() == Some(id) { - *c = cref; + *c = arc; break; } } @@ -99,15 +72,15 @@ impl PackComponents { // PackComponents GETTERS. - pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentRef> { + pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentArc> { self.0.iter().find(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ComponentRef> { + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ComponentArc> { self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ComponentRef> { + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ComponentArc> { self.0.iter().filter(move |&c| c.handle() == handle) } diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 0e1d7460..20aa99bd 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ComponentRef, PackComponents, PackOp}; +use crate::core::component::{ComponentArc, PackComponents, PackOp}; use crate::core::theme::ThemeRef; use crate::{Handle, LazyStatic}; @@ -19,17 +19,17 @@ impl ComponentsRegions { ComponentsRegions::default() } - pub fn with(region: &'static str, cref: ComponentRef) -> Self { + pub fn with(region: &'static str, arc: ComponentArc) -> Self { let mut regions = ComponentsRegions::new(); - regions.add_in(region, cref); + regions.add_in(region, arc); regions } - pub fn add_in(&mut self, region: &'static str, cref: ComponentRef) { + pub fn add_in(&mut self, region: &'static str, arc: ComponentArc) { if let Some(region) = self.0.get_mut(region) { - region.alter(PackOp::Add, cref); + region.alter(PackOp::Add, arc); } else { - self.0.insert(region, PackComponents::with(cref)); + self.0.insert(region, PackComponents::with(arc)); } } @@ -48,17 +48,17 @@ pub enum Region { OfTheme(ThemeRef, &'static str), } -pub fn add_component_in(region: Region, cref: ComponentRef) { +pub fn add_component_in(region: Region, arc: ComponentArc) { match region { Region::Named(name) => { - COMMON_REGIONS.write().unwrap().add_in(name, cref); + COMMON_REGIONS.write().unwrap().add_in(name, arc); } Region::OfTheme(theme, region) => { let mut regions = THEME_REGIONS.write().unwrap(); if let Some(hm) = regions.get_mut(&theme.handle()) { - hm.add_in(region, cref); + hm.add_in(region, arc); } else { - regions.insert(theme.handle(), ComponentsRegions::with(region, cref)); + regions.insert(theme.handle(), ComponentsRegions::with(region, arc)); } } } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index c2d9434c..86199984 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -2,7 +2,7 @@ mod action; pub use action::*; use crate::core::component::l10n::L10n; -use crate::core::component::{ComponentRef, ComponentTrait, Context, ContextOp, OneComponent}; +use crate::core::component::{ComponentArc, ComponentTrait, Context, ContextOp, OneComponent}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::fatal_error::FatalError; @@ -90,7 +90,7 @@ impl Page { #[fn_builder] pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_in(region, ComponentRef::to(component)); + self.regions.add_in(region, ComponentArc::new(component)); self } From 8b4a78f5538c8e2be63e66a6db4b8bc8cf98e304 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 10:46:24 +0200 Subject: [PATCH 502/853] =?UTF-8?q?=F0=9F=92=A5=20Apply=20function=20assoc?= =?UTF-8?q?iated=20types=20renaming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/item.rs | 10 +++++----- pagetop-minimal/src/component/anchor.rs | 2 +- pagetop-minimal/src/component/block.rs | 2 +- pagetop-minimal/src/component/form_element/button.rs | 2 +- pagetop-minimal/src/component/form_element/date.rs | 2 +- pagetop-minimal/src/component/form_element/form.rs | 2 +- pagetop-minimal/src/component/form_element/input.rs | 2 +- pagetop-minimal/src/component/grid/column.rs | 2 +- pagetop-minimal/src/component/grid/row.rs | 2 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/icon.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 2 +- pagetop-minimal/src/component/powered_by.rs | 2 +- pagetop-minimal/src/component/site_branding.rs | 8 ++++---- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pagetop-megamenu/src/component/item.rs b/pagetop-megamenu/src/component/item.rs index 00038b4a..8e5e8101 100644 --- a/pagetop-megamenu/src/component/item.rs +++ b/pagetop-megamenu/src/component/item.rs @@ -12,8 +12,8 @@ pub enum MegaItemType { #[default] Void, Label(Label), - Link(Label, ContextualPath), - LinkBlank(Label, ContextualPath), + Link(Label, FnContextualPath), + LinkBlank(Label, FnContextualPath), Html(Content), Submenu(Label, MegaMenu), Separator, @@ -84,14 +84,14 @@ impl MegaItem { } } - pub fn link(label: L10n, path: ContextualPath) -> Self { + pub fn link(label: L10n, path: FnContextualPath) -> Self { MegaItem { item_type: MegaItemType::Link(Label::with(label), path), ..Default::default() } } - pub fn link_blank(label: L10n, path: ContextualPath) -> Self { + pub fn link_blank(label: L10n, path: FnContextualPath) -> Self { MegaItem { item_type: MegaItemType::LinkBlank(Label::with(label), path), ..Default::default() @@ -128,7 +128,7 @@ impl MegaItem { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index fc471a63..58b1a566 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -111,7 +111,7 @@ impl Anchor { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 7d19f588..bc7bc440 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -76,7 +76,7 @@ impl Block { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index 1ccd670e..c34dbdfd 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -99,7 +99,7 @@ impl Button { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index d0c3bf2c..2a508d34 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -84,7 +84,7 @@ impl Date { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 358e162d..1290e9da 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -85,7 +85,7 @@ impl Form { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 81288a4c..aaf230dc 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -172,7 +172,7 @@ impl Input { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index 044260f1..f701af96 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -96,7 +96,7 @@ impl Column { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 923910dc..5c261a89 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -65,7 +65,7 @@ impl Row { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index dd5444dc..d6f15ff7 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -121,7 +121,7 @@ impl Heading { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 4aec341d..d3742520 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -53,7 +53,7 @@ impl Icon { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index c6b3e508..a88f07a7 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -72,7 +72,7 @@ impl Paragraph { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/powered_by.rs b/pagetop-minimal/src/component/powered_by.rs index 63eeb0bb..0e1e597c 100644 --- a/pagetop-minimal/src/component/powered_by.rs +++ b/pagetop-minimal/src/component/powered_by.rs @@ -95,7 +95,7 @@ impl PoweredBy { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } diff --git a/pagetop-minimal/src/component/site_branding.rs b/pagetop-minimal/src/component/site_branding.rs index 82f5838e..5e3ab340 100644 --- a/pagetop-minimal/src/component/site_branding.rs +++ b/pagetop-minimal/src/component/site_branding.rs @@ -16,7 +16,7 @@ pub struct SiteBranding { name : String, slogan : SiteSlogan, logo : SiteLogo, - frontpage : ContextualPath, + frontpage : FnContextualPath, } #[rustfmt::skip] @@ -93,7 +93,7 @@ impl SiteBranding { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } @@ -117,7 +117,7 @@ impl SiteBranding { } #[fn_builder] - pub fn alter_frontpage(&mut self, frontpage: ContextualPath) -> &mut Self { + pub fn alter_frontpage(&mut self, frontpage: FnContextualPath) -> &mut Self { self.frontpage = frontpage; self } @@ -136,7 +136,7 @@ impl SiteBranding { &self.logo } - pub fn frontpage(&self) -> &ContextualPath { + pub fn frontpage(&self) -> &FnContextualPath { &self.frontpage } } From ef3592f08a61178b3a6d9c3224a3624d1f04959f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 10:51:34 +0200 Subject: [PATCH 503/853] =?UTF-8?q?=F0=9F=92=A5=20Adjust=20downcasting=20c?= =?UTF-8?q?omponent=20function=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/src/lib.rs | 12 ++++++------ pagetop/src/core/component.rs | 2 +- pagetop/src/core/component/definition.rs | 4 ++-- pagetop/src/core/theme/definition.rs | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 144710b5..7bc372c3 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -49,7 +49,7 @@ impl ThemeTrait for Bulmix { ) { match component.handle() { COMPONENT_ANCHOR => { - let a = component_mut::<Anchor>(component); + let a = component_as_mut::<Anchor>(component); a.alter_classes( ClassesOp::SetDefault, match a.anchor_type() { @@ -59,7 +59,7 @@ impl ThemeTrait for Bulmix { ); } COMPONENT_HEADING => { - let h = component_mut::<Heading>(component); + let h = component_as_mut::<Heading>(component); h.alter_classes( ClassesOp::SetDefault, match h.display() { @@ -74,7 +74,7 @@ impl ThemeTrait for Bulmix { ); } COMPONENT_PARAGRAPH => { - let p = component_mut::<Paragraph>(component); + let p = component_as_mut::<Paragraph>(component); p.alter_classes( ClassesOp::SetDefault, match p.display() { @@ -88,7 +88,7 @@ impl ThemeTrait for Bulmix { ); } grid::COMPONENT_GRID_COLUMN => { - let col = component_mut::<grid::Column>(component); + let col = component_as_mut::<grid::Column>(component); col.alter_classes( ClassesOp::SetDefault, concat_string!( @@ -114,7 +114,7 @@ impl ThemeTrait for Bulmix { ); } grid::COMPONENT_GRID_ROW => { - let row = component_mut::<grid::Row>(component); + let row = component_as_mut::<grid::Row>(component); row.alter_classes(ClassesOp::SetDefault, "columns"); } _ => {} @@ -128,7 +128,7 @@ impl ThemeTrait for Bulmix { ) -> Option<Markup> { match component.handle() { COMPONENT_ICON => { - let icon = component_ref::<Icon>(component); + let icon = component_as_ref::<Icon>(component); Some(html! { span class="icon" { i class=[icon.classes().get()] {}; diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 32d742c3..d46f4786 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -3,7 +3,7 @@ pub use context::{Context, ContextOp}; pub type FnContextualPath = fn(cx: &Context) -> &str; mod definition; -pub use definition::{component_mut, component_ref, ComponentBase, ComponentTrait}; +pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; mod arc; pub use arc::ComponentArc; diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index b17733e2..a6d99c1b 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -87,10 +87,10 @@ impl<C: ComponentTrait> ComponentBase for C { } } -pub fn component_ref<C: ComponentTrait>(component: &dyn ComponentTrait) -> &C { +pub fn component_as_ref<C: ComponentTrait>(component: &dyn ComponentTrait) -> &C { component.as_ref_any().downcast_ref::<C>().unwrap() } -pub fn component_mut<C: ComponentTrait>(component: &mut dyn ComponentTrait) -> &mut C { +pub fn component_as_mut<C: ComponentTrait>(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::<C>().unwrap() } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index aec9fe61..fd4b53a1 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -90,7 +90,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { match component.handle() { BLOCK_COMPONENT => { - let block = component_mut::<Block>(component); + let block = component_as_mut::<Block>(component); block.alter_title("New title"); }, _ => {}, @@ -110,7 +110,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { match component.handle() { BLOCK_COMPONENT => { - let block = component_mut::<Block>(component); + let block = component_as_mut::<Block>(component); block.alter_title("New title"); }, _ => {}, @@ -131,7 +131,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { match component.handle() { BLOCK_COMPONENT => { - let block = component_ref::<Block>(component); + let block = component_as_ref::<Block>(component); match block.template() { "default" => Some(block_default(block)), _ => None, From 063ae2aae87cbb5815c66a1ee80db205c9880b8e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 10:53:12 +0200 Subject: [PATCH 504/853] =?UTF-8?q?=F0=9F=9A=A7=20[minimal]=20New=20flex?= =?UTF-8?q?=20layout=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component.rs | 3 +- pagetop-minimal/src/component/flex.rs | 4 + .../src/component/flex/container.rs | 114 ++++++++++++ pagetop-minimal/src/component/flex/item.rs | 176 ++++++++++++++++++ pagetop-minimal/static/css/minimal.css | 34 +++- 5 files changed, 328 insertions(+), 3 deletions(-) create mode 100644 pagetop-minimal/src/component/flex.rs create mode 100644 pagetop-minimal/src/component/flex/container.rs create mode 100644 pagetop-minimal/src/component/flex/item.rs diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 3cbae79f..1f86bde5 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -1,6 +1,7 @@ mod container; pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; +pub mod flex; pub mod grid; mod icon; @@ -12,7 +13,7 @@ pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; mod anchor; pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; mod image; -pub use image::{Image, COMPONENT_IMAGE}; +pub use image::{Image, ImageSize, COMPONENT_IMAGE}; mod block; pub use block::{Block, COMPONENT_BLOCK}; mod site_branding; diff --git a/pagetop-minimal/src/component/flex.rs b/pagetop-minimal/src/component/flex.rs new file mode 100644 index 00000000..1025c13f --- /dev/null +++ b/pagetop-minimal/src/component/flex.rs @@ -0,0 +1,4 @@ +mod container; +pub use container::{Container, COMPONENT_FLEX_CONTAINER}; +mod item; +pub use item::{Item, COMPONENT_FLEX_ITEM}; diff --git a/pagetop-minimal/src/component/flex/container.rs b/pagetop-minimal/src/component/flex/container.rs new file mode 100644 index 00000000..8858c286 --- /dev/null +++ b/pagetop-minimal/src/component/flex/container.rs @@ -0,0 +1,114 @@ +use pagetop::prelude::*; + +use crate::component::flex; + +new_handle!(COMPONENT_FLEX_CONTAINER); + +actions_for_component!(Container); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Container { + weight : Weight, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + items : PackComponents, + template : String, +} + +impl ComponentTrait for Container { + fn new() -> Self { + Container::default().with_classes(ClassesOp::SetDefault, "flex") + } + + fn handle(&self) -> Handle { + COMPONENT_FLEX_CONTAINER + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_container(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] { + (self.items().prepare(cx)) + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_container(self, cx); + } +} + +impl Container { + // Container BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + pub fn with_item(mut self, item: flex::Item) -> Self { + self.items.alter(PackOp::Add, ComponentArc::new(item)); + self + } + + pub fn alter_items(&mut self, op: PackOp, item: flex::Item) -> &mut Self { + self.items.alter(op, ComponentArc::new(item)); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Container GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn items(&self) -> &PackComponents { + &self.items + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/src/component/flex/item.rs b/pagetop-minimal/src/component/flex/item.rs new file mode 100644 index 00000000..7dae7b6f --- /dev/null +++ b/pagetop-minimal/src/component/flex/item.rs @@ -0,0 +1,176 @@ +use pagetop::prelude::*; + +new_handle!(COMPONENT_FLEX_ITEM); + +actions_for_component!(Item); + +const SIZE_DEFAULT: &str = "col"; +const SIZE_1_OF_12: &str = "col-md-1"; +const SIZE_2_OF_12: &str = "col-md-2"; +const SIZE_3_OF_12: &str = "col-md-3"; +const SIZE_4_OF_12: &str = "col-md-4"; +const SIZE_5_OF_12: &str = "col-md-5"; +const SIZE_6_OF_12: &str = "col-md-6"; +const SIZE_7_OF_12: &str = "col-md-7"; +const SIZE_8_OF_12: &str = "col-md-8"; +const SIZE_9_OF_12: &str = "col-md-9"; +const SIZE_10_OF_12: &str = "col-md-10"; +const SIZE_11_OF_12: &str = "col-md-11"; +const SIZE_12_OF_12: &str = "col-md-12"; + +#[derive(Default)] +pub enum ItemSize { + #[default] + Default, + Is1of12, + Is2of12, + Is3of12, + Is4of12, + Is5of12, + Is6of12, + Is7of12, + Is8of12, + Is9of12, + Is10of12, + Is11of12, + IsFull, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Item { + weight : Weight, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + size : ItemSize, + stuff : PackComponents, + template : String, +} + +impl ComponentTrait for Item { + fn new() -> Self { + Item::default().with_classes(ClassesOp::SetDefault, SIZE_DEFAULT) + } + + fn handle(&self) -> Handle { + COMPONENT_FLEX_ITEM + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_item(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] { + (self.components().prepare(cx)) + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_item(self, cx); + } +} + +impl Item { + // Item BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[rustfmt::skip] + #[fn_builder] + pub fn alter_size(&mut self, size: ItemSize) -> &mut Self { + match size { + ItemSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE_DEFAULT), + ItemSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_1_OF_12), + ItemSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_2_OF_12), + ItemSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_3_OF_12), + ItemSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_4_OF_12), + ItemSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_5_OF_12), + ItemSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_6_OF_12), + ItemSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_7_OF_12), + ItemSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_8_OF_12), + ItemSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_9_OF_12), + ItemSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), + ItemSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), + ItemSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), + }; + self.size = size; + self + } + + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self + } + + pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { + self.stuff.alter(PackOp::Add, arc); + self + } + + pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { + self.stuff.alter(op, ComponentArc::new(component)); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Item GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn size(&self) -> &ItemSize { + &self.size + } + + pub fn components(&self) -> &PackComponents { + &self.stuff + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop-minimal/static/css/minimal.css b/pagetop-minimal/static/css/minimal.css index 9c6df304..eda8142e 100644 --- a/pagetop-minimal/static/css/minimal.css +++ b/pagetop-minimal/static/css/minimal.css @@ -1,4 +1,34 @@ -/* SiteBranding component */ +/* Flex components */ +.flex { + display: flex; + flex-direction: column; +} +@media (min-width: 768px) { + .flex { + flex-direction: row; + } +} +/* Grid components */ +.row .row { + margin: 0 -1.5em; +} +.col { + padding: 0 1.5em; +} +.row:after { + content: ""; + clear: both; + display: table; +} +@media only screen { + .col { + float: left; + width: 100%; + box-sizing: border-box; + } +} + +/* SiteBranding component */ /* #site-branding { float: left; } @@ -32,7 +62,7 @@ display: block; } } - +*/ /* PoweredBy component */ #powered-by { text-align: center; From 350c750e16afca4275b7ffc086fbeb5904df7166 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 10:57:20 +0200 Subject: [PATCH 505/853] =?UTF-8?q?=F0=9F=9A=A7=20Apply=20last=20component?= =?UTF-8?q?=20management=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/container.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 67164b88..b3c79f4a 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -23,7 +23,7 @@ pub struct Container { classes : Classes, inner_classes : Classes, container_type: ContainerType, - content : PackComponents, + stuff : PackComponents, template : String, } @@ -131,7 +131,7 @@ impl Container { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } @@ -155,12 +155,17 @@ impl Container { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.content.alter(PackOp::Add, ComponentRef::to(component)); + self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self + } + + pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { + self.stuff.alter(PackOp::Add, arc); self } pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.content.alter(op, ComponentRef::to(component)); + self.stuff.alter(op, ComponentArc::new(component)); self } @@ -185,7 +190,7 @@ impl Container { } pub fn components(&self) -> &PackComponents { - &self.content + &self.stuff } pub fn template(&self) -> &str { From 1749e10c2655d2aa42d783484265b3f0d50921c7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 10:59:53 +0200 Subject: [PATCH 506/853] =?UTF-8?q?=F0=9F=9A=A7=20[megamenu]=20Working=20o?= =?UTF-8?q?n=20menus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/menu.rs | 62 +++++++++----- pagetop-megamenu/static/css/sm-blue.css.map | 7 ++ pagetop-megamenu/static/css/sm-clean.css.map | 7 ++ pagetop-megamenu/static/css/sm-mint.css.map | 7 ++ pagetop-megamenu/static/css/sm-simple.css.map | 7 ++ pagetop-megamenu/static/css/smartmenus.css | 80 +++++-------------- 6 files changed, 89 insertions(+), 81 deletions(-) create mode 100644 pagetop-megamenu/static/css/sm-blue.css.map create mode 100644 pagetop-megamenu/static/css/sm-clean.css.map create mode 100644 pagetop-megamenu/static/css/sm-mint.css.map create mode 100644 pagetop-megamenu/static/css/sm-simple.css.map diff --git a/pagetop-megamenu/src/component/menu.rs b/pagetop-megamenu/src/component/menu.rs index 80879a70..6ce6239e 100644 --- a/pagetop-megamenu/src/component/menu.rs +++ b/pagetop-megamenu/src/component/menu.rs @@ -11,19 +11,28 @@ actions_for_component!(MegaMenu); // SmartMenus library version. const VERSION_SMARTMENUS: &str = "1.2.1"; +#[derive(Default)] +pub enum MegaMenuTheme { + Blue, + #[default] + Clean, + Mint, + Simple, +} + #[rustfmt::skip] #[derive(Default)] pub struct MegaMenu { weight : Weight, renderable: Renderable, id : IdentifierValue, - classes : Classes, items : PackComponents, + theme : MegaMenuTheme, } impl ComponentTrait for MegaMenu { fn new() -> Self { - MegaMenu::default().with_classes(ClassesOp::SetDefault, "megamenu-menu sm sm-clean") + MegaMenu::default() } fn handle(&self) -> Handle { @@ -45,11 +54,9 @@ impl ComponentTrait for MegaMenu { fn before_prepare_component(&mut self, cx: &mut Context) { cx.alter(ContextOp::AddStyleSheet( StyleSheet::at("/megamenu/css/smartmenus.css").with_version(VERSION_SMARTMENUS), - )) - .alter(ContextOp::AddStyleSheet( - StyleSheet::at("/megamenu/css/sm-clean.css").with_version(VERSION_SMARTMENUS), - )) - .alter(ContextOp::AddJavaScript( + )); + + cx.alter(ContextOp::AddJavaScript( JavaScript::at("/megamenu/js/smartmenus.min.js").with_version(VERSION_SMARTMENUS), )); JQuery.enable_jquery(cx); @@ -57,11 +64,24 @@ impl ComponentTrait for MegaMenu { run_actions_before_prepare_megamenu(self, cx); } + #[rustfmt::skip] fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let id_nav = cx.required_id::<MegaMenu>(self.id()); let id_menu = concat_string!(id_nav, "-menu"); let id_state = concat_string!(id_nav, "-state"); + let theme = match self.theme() { + MegaMenuTheme::Blue => "sm-blue", + MegaMenuTheme::Clean => "sm-clean", + MegaMenuTheme::Mint => "sm-mint", + MegaMenuTheme::Simple => "sm-simple", + }; + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at(concat_string!("/megamenu/css/", theme, ".css")) + .with_version(VERSION_SMARTMENUS), + )); + let classes_menu = concat_string!("megamenu-menu sm ", theme); + PrepareMarkup::With(html! { nav id=(id_nav) class="megamenu" role="navigation" { input id=(id_state) class="megamenu-state" type="checkbox" {} @@ -69,7 +89,7 @@ impl ComponentTrait for MegaMenu { span class="megamenu-btn-icon" {} (L10n::t("toggle_menu", &LOCALES_MEGAMENU).prepare(cx)) } - ul id=(id_menu) class=[self.classes().get()] { + ul id=(id_menu) class=(classes_menu) { (self.items().prepare(cx)) } script type="text/javascript" defer { @@ -121,7 +141,7 @@ impl MegaMenu { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } @@ -132,29 +152,29 @@ impl MegaMenu { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - pub fn with_item(mut self, item: MegaItem) -> Self { - self.items.alter(PackOp::Add, ComponentRef::to(item)); + self.items.alter(PackOp::Add, ComponentArc::new(item)); self } pub fn alter_items(&mut self, op: PackOp, item: MegaItem) -> &mut Self { - self.items.alter(op, ComponentRef::to(item)); + self.items.alter(op, ComponentArc::new(item)); + self + } + + #[fn_builder] + pub fn alter_theme(&mut self, theme: MegaMenuTheme) -> &mut Self { + self.theme = theme; self } // MegaMenu GETTERS. - pub fn classes(&self) -> &Classes { - &self.classes - } - pub fn items(&self) -> &PackComponents { &self.items } + + pub fn theme(&self) -> &MegaMenuTheme { + &self.theme + } } diff --git a/pagetop-megamenu/static/css/sm-blue.css.map b/pagetop-megamenu/static/css/sm-blue.css.map new file mode 100644 index 00000000..a313206b --- /dev/null +++ b/pagetop-megamenu/static/css/sm-blue.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["_sm-blue-theme.scss","mixins/_round-corners-last-item.scss","mixins/_sub-items-indentation.scss"], +"names": [], +"file": "sm-blue.css" +} diff --git a/pagetop-megamenu/static/css/sm-clean.css.map b/pagetop-megamenu/static/css/sm-clean.css.map new file mode 100644 index 00000000..5713f374 --- /dev/null +++ b/pagetop-megamenu/static/css/sm-clean.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["_sm-clean-theme.scss","mixins/_round-corners-last-item.scss","mixins/_sub-items-indentation.scss"], +"names": [], +"file": "sm-clean.css" +} diff --git a/pagetop-megamenu/static/css/sm-mint.css.map b/pagetop-megamenu/static/css/sm-mint.css.map new file mode 100644 index 00000000..2220dbd2 --- /dev/null +++ b/pagetop-megamenu/static/css/sm-mint.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["_sm-mint-theme.scss","mixins/_sub-items-indentation.scss"], +"names": [], +"file": "sm-mint.css" +} diff --git a/pagetop-megamenu/static/css/sm-simple.css.map b/pagetop-megamenu/static/css/sm-simple.css.map new file mode 100644 index 00000000..88f04761 --- /dev/null +++ b/pagetop-megamenu/static/css/sm-simple.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["_sm-simple-theme.scss","mixins/_sub-items-indentation.scss"], +"names": [], +"file": "sm-simple.css" +} diff --git a/pagetop-megamenu/static/css/smartmenus.css b/pagetop-megamenu/static/css/smartmenus.css index 047d7fe3..a418e5fa 100644 --- a/pagetop-megamenu/static/css/smartmenus.css +++ b/pagetop-megamenu/static/css/smartmenus.css @@ -1,26 +1,3 @@ -/* Mobile first layout SmartMenus Core CSS (it's not recommended editing these rules) - You need this once per page no matter how many menu trees or different themes you use. --------------------------------------------------------------------------------------------*/ - -.megamenu { - background: #eee; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - -ms-border-radius: 5px; - -o-border-radius: 5px; - border-radius: 5px; -} - -@media (min-width: 768px) { - .megamenu { - -webkit-border-radius: 50px; - -moz-border-radius: 50px; - -ms-border-radius: 50px; - -o-border-radius: 50px; - border-radius: 50px; - } -} - .megamenu:after { clear: both; content: "\00a0"; @@ -28,34 +5,23 @@ height: 0; font: 0px/0 serif; overflow: hidden; -} - -.nav-brand { - float: left; - margin: 0; -} - -.nav-brand a { - display: block; - padding: 12px 12px 12px 20px; - color: #555; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-size: 22px; - font-weight: normal; - line-height: 17px; - text-decoration: none; -} +}/* +@media (min-width: 768px) { + .megamenu { + position: relative; + } +}*/ .megamenu-menu { clear: both; -} - +}/* @media (min-width: 768px) { .megamenu-menu { - float: right; - clear: none; + position: absolute; + right: 10px; + bottom: 0; } -} +}*/ /* Mobile menu toggle button */ @@ -72,6 +38,13 @@ cursor: pointer; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } +@media (min-width: 768px) { + /* Hide the button in desktop view */ + .megamenu-btn { + position: absolute; + top: -99999px; + } +} /* Hamburger icon */ @@ -87,13 +60,11 @@ -webkit-transition: all 0.25s; transition: all 0.25s; } - .megamenu-btn-icon:before { content: ''; top: -7px; left: 0; } - .megamenu-btn-icon:after { content: ''; top: 7px; @@ -106,13 +77,11 @@ height: 0; background: transparent; } - .megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon:before { top: 0; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } - .megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon:after { top: 0; -webkit-transform: rotate(45deg); @@ -137,28 +106,19 @@ .megamenu-state:not(:checked) ~ .megamenu-menu { display: none; } - .megamenu-state:checked ~ .megamenu-menu { display: block; } - @media (min-width: 768px) { - /* Hide the button in desktop view */ - .megamenu-btn { - position: absolute; - top: -99999px; - } /* Always show the menu in desktop view */ .megamenu-state:not(:checked) ~ .megamenu-menu { display: block; } } +/* Core */ - - - -.sm{box-sizing:border-box;position:relative;z-index:9999;-webkit-tap-highlight-color:rgba(0,0,0,0);} +.sm{box-sizing:border-box;z-index:9999;-webkit-tap-highlight-color:rgba(0,0,0,0);} .sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;} .sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right;} .sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0;} From d0774bfd3f6e2f984edc07f9a37033841553d3b5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Aug 2023 11:21:46 +0200 Subject: [PATCH 507/853] =?UTF-8?q?=F0=9F=9A=A7=20Testing=20size=20layout?= =?UTF-8?q?=20for=20images?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/image.rs | 36 +++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index f755809f..cbfb8435 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -2,6 +2,15 @@ use pagetop::prelude::*; new_handle!(COMPONENT_IMAGE); +#[derive(Default)] +pub enum ImageSize { + #[default] + Auto, + Size(u16, u16), + Width(u16), + Height(u16), +} + #[rustfmt::skip] #[derive(Default)] pub struct Image { @@ -10,6 +19,7 @@ pub struct Image { id : IdentifierValue, classes : Classes, source : AttributeValue, + size : ImageSize, } impl ComponentTrait for Image { @@ -34,11 +44,19 @@ impl ComponentTrait for Image { } fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { + let (width, height) = match self.size() { + ImageSize::Auto => (None, None), + ImageSize::Size(width, height) => (Some(width), Some(height)), + ImageSize::Width(width) => (Some(width), None), + ImageSize::Height(height) => (None, Some(height)), + }; PrepareMarkup::With(html! { img src=[self.source().get()] id=[self.id()] - class=[self.classes().get()]; + class=[self.classes().get()] + width=[width] + height=[height] {} }) } } @@ -49,7 +67,9 @@ impl Image { } pub fn pagetop() -> Self { - Image::new().with_source("/minimal/pagetop-logo.svg") + Image::new() + .with_source("/minimal/pagetop-logo.svg") + .with_size(ImageSize::Size(64, 64)) } // Image BUILDER. @@ -61,7 +81,7 @@ impl Image { } #[fn_builder] - pub fn alter_renderable(&mut self, check: IsRenderable) -> &mut Self { + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } @@ -84,6 +104,12 @@ impl Image { self } + #[fn_builder] + pub fn alter_size(&mut self, size: ImageSize) -> &mut Self { + self.size = size; + self + } + // Image GETTERS. pub fn classes(&self) -> &Classes { @@ -93,4 +119,8 @@ impl Image { pub fn source(&self) -> &AttributeValue { &self.source } + + pub fn size(&self) -> &ImageSize { + &self.size + } } From 3d86115f97b4581d567ce6c04a062a31a3efe027 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 14 Aug 2023 23:29:23 +0200 Subject: [PATCH 508/853] =?UTF-8?q?=F0=9F=9A=A7=20Generalize=20crate=20sco?= =?UTF-8?q?pe=20handle=20creation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component.rs | 4 ++-- pagetop/src/response/page/action/after_prepare_body.rs | 2 +- pagetop/src/response/page/action/before_prepare_body.rs | 2 +- pagetop/src/util.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index d46f4786..179514d9 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -32,7 +32,7 @@ macro_rules! actions_for_component { // ACTION BEFORE PREPARE COMPONENT // ************************************************************************************* - $crate::new_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Action); + $crate::new_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Crate); pub struct [<BeforePrepare $Component>] { action: Option<[<FnAction $Component>]>, @@ -91,7 +91,7 @@ macro_rules! actions_for_component { // ACTION AFTER PREPARE COMPONENT // ************************************************************************************* - $crate::new_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Action); + $crate::new_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Crate); pub struct [<AfterPrepare $Component>] { action: Option<[<FnAction $Component>]>, diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/response/page/action/after_prepare_body.rs index 457a17db..c93711ba 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -3,7 +3,7 @@ use crate::response::page::action::FnActionPage; use crate::response::page::Page; use crate::{new_handle, Handle, Weight}; -new_handle!(ACTION_AFTER_PREPARE_BODY for Action); +new_handle!(ACTION_AFTER_PREPARE_BODY for Crate); pub struct ActionAfterPrepareBody { action: Option<FnActionPage>, diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/response/page/action/before_prepare_body.rs index e5622567..78e5ebe6 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -3,7 +3,7 @@ use crate::response::page::action::FnActionPage; use crate::response::page::Page; use crate::{new_handle, Handle, Weight}; -new_handle!(ACTION_BEFORE_PREPARE_BODY for Action); +new_handle!(ACTION_BEFORE_PREPARE_BODY for Crate); pub struct ActionBeforePrepareBody { action: Option<FnActionPage>, diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index ef9dc818..b757d1d1 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -112,8 +112,8 @@ macro_rules! new_handle { pub const $HANDLE: $crate::Handle = $crate::util::handle(module_path!(), file!(), line!(), column!()); }; - ( $HANDLE:ident for Action ) => { - /// Constant handle to represent a unique PageTop action. + ( $HANDLE:ident for Crate ) => { + /// Local constant handle to represent a unique PageTop building element. pub(crate) const $HANDLE: $crate::Handle = $crate::util::handle(module_path!(), file!(), line!(), column!()); }; From 6197052ae78445e234eddf745699e065c2d514d7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 15 Aug 2023 00:53:14 +0200 Subject: [PATCH 509/853] =?UTF-8?q?=F0=9F=9A=A7=20Pack=20and=20Veck=20for?= =?UTF-8?q?=20arrays=20of=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/item.rs | 4 +- pagetop-megamenu/src/component/menu.rs | 11 +-- pagetop-minimal/src/component/anchor.rs | 4 +- pagetop-minimal/src/component/block.rs | 12 +-- pagetop-minimal/src/component/container.rs | 12 +-- .../src/component/flex/container.rs | 11 +-- pagetop-minimal/src/component/flex/item.rs | 12 +-- .../src/component/form_element/button.rs | 2 +- .../src/component/form_element/form.rs | 16 ++-- .../src/component/form_element/input.rs | 4 +- pagetop-minimal/src/component/grid/column.rs | 12 +-- pagetop-minimal/src/component/grid/row.rs | 11 +-- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 12 +-- .../src/component/site_branding.rs | 4 +- pagetop/src/core/component.rs | 13 +-- pagetop/src/core/component/arc.rs | 33 ++++++- pagetop/src/core/component/one.rs | 40 ++++++--- pagetop/src/core/component/pack.rs | 24 ++--- pagetop/src/core/component/veck.rs | 90 +++++++++++++++++++ pagetop/src/core/theme/regions.rs | 4 +- pagetop/src/response/page.rs | 10 +-- 22 files changed, 229 insertions(+), 114 deletions(-) create mode 100644 pagetop/src/core/component/veck.rs diff --git a/pagetop-megamenu/src/component/item.rs b/pagetop-megamenu/src/component/item.rs index 8e5e8101..52c50d36 100644 --- a/pagetop-megamenu/src/component/item.rs +++ b/pagetop-megamenu/src/component/item.rs @@ -4,8 +4,8 @@ use crate::component::MegaMenu; new_handle!(COMPONENT_MEGAITEM); -type Label = OneComponent<L10n>; -type Content = OneComponent<Html>; +type Label = ComponentOne<L10n>; +type Content = ComponentOne<Html>; #[derive(Default)] pub enum MegaItemType { diff --git a/pagetop-megamenu/src/component/menu.rs b/pagetop-megamenu/src/component/menu.rs index 6ce6239e..819d0d0b 100644 --- a/pagetop-megamenu/src/component/menu.rs +++ b/pagetop-megamenu/src/component/menu.rs @@ -26,7 +26,7 @@ pub struct MegaMenu { weight : Weight, renderable: Renderable, id : IdentifierValue, - items : PackComponents, + items : VeckComponents<MegaItem>, theme : MegaMenuTheme, } @@ -153,12 +153,13 @@ impl MegaMenu { } pub fn with_item(mut self, item: MegaItem) -> Self { - self.items.alter(PackOp::Add, ComponentArc::new(item)); + self.items.alter(VeckOp::Add(ComponentOne::with(item))); self } - pub fn alter_items(&mut self, op: PackOp, item: MegaItem) -> &mut Self { - self.items.alter(op, ComponentArc::new(item)); + #[fn_builder] + pub fn alter_items(&mut self, op: VeckOp<MegaItem>) -> &mut Self { + self.items.alter(op); self } @@ -170,7 +171,7 @@ impl MegaMenu { // MegaMenu GETTERS. - pub fn items(&self) -> &PackComponents { + pub fn items(&self) -> &VeckComponents<MegaItem> { &self.items } diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 58b1a566..709ab28e 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -22,8 +22,8 @@ pub enum AnchorTarget { Context(String), } -type AnchorIcon = OneComponent<Icon>; -type AnchorHtml = OneComponent<L10n>; +type AnchorIcon = ComponentOne<Icon>; +type AnchorHtml = ComponentOne<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index bc7bc440..d7ffe41c 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -94,17 +94,13 @@ impl Block { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self.stuff.alter(PackOp::Add(ComponentArc::with(component))); self } - pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { - self.stuff.alter(PackOp::Add, arc); - self - } - - pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.stuff.alter(op, ComponentArc::new(component)); + #[fn_builder] + pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + self.stuff.alter(op); self } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index b3c79f4a..3a99eb56 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -155,17 +155,13 @@ impl Container { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self.stuff.alter(PackOp::Add(ComponentArc::with(component))); self } - pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { - self.stuff.alter(PackOp::Add, arc); - self - } - - pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.stuff.alter(op, ComponentArc::new(component)); + #[fn_builder] + pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + self.stuff.alter(op); self } diff --git a/pagetop-minimal/src/component/flex/container.rs b/pagetop-minimal/src/component/flex/container.rs index 8858c286..803ad6ab 100644 --- a/pagetop-minimal/src/component/flex/container.rs +++ b/pagetop-minimal/src/component/flex/container.rs @@ -13,7 +13,7 @@ pub struct Container { renderable: Renderable, id : IdentifierValue, classes : Classes, - items : PackComponents, + items : VeckComponents<flex::Item>, template : String, } @@ -83,12 +83,13 @@ impl Container { } pub fn with_item(mut self, item: flex::Item) -> Self { - self.items.alter(PackOp::Add, ComponentArc::new(item)); + self.items.alter(VeckOp::Add(ComponentOne::with(item))); self } - pub fn alter_items(&mut self, op: PackOp, item: flex::Item) -> &mut Self { - self.items.alter(op, ComponentArc::new(item)); + #[fn_builder] + pub fn alter_items(&mut self, op: VeckOp<flex::Item>) -> &mut Self { + self.items.alter(op); self } @@ -104,7 +105,7 @@ impl Container { &self.classes } - pub fn items(&self) -> &PackComponents { + pub fn items(&self) -> &VeckComponents<flex::Item> { &self.items } diff --git a/pagetop-minimal/src/component/flex/item.rs b/pagetop-minimal/src/component/flex/item.rs index 7dae7b6f..164ff2aa 100644 --- a/pagetop-minimal/src/component/flex/item.rs +++ b/pagetop-minimal/src/component/flex/item.rs @@ -136,17 +136,13 @@ impl Item { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self.stuff.alter(PackOp::Add(ComponentArc::with(component))); self } - pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { - self.stuff.alter(PackOp::Add, arc); - self - } - - pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.stuff.alter(op, ComponentArc::new(component)); + #[fn_builder] + pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + self.stuff.alter(op); self } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index c34dbdfd..d2683c03 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -10,7 +10,7 @@ pub enum ButtonType { Reset, } -type ButtonValue = OneComponent<L10n>; +type ButtonValue = ComponentOne<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 1290e9da..ef8d403d 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -21,7 +21,7 @@ pub struct Form { action : AttributeValue, charset : AttributeValue, method : FormMethod, - elements : PackComponents, + stuff : PackComponents, template : String, } @@ -121,17 +121,13 @@ impl Form { } pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.elements.alter(PackOp::Add, ComponentArc::new(element)); + self.stuff.alter(PackOp::Add(ComponentArc::with(element))); self } - pub fn with_element_arc(mut self, arc: ComponentArc) -> Self { - self.elements.alter(PackOp::Add, arc); - self - } - - pub fn alter_elements(&mut self, op: PackOp, element: impl ComponentTrait) -> &mut Self { - self.elements.alter(op, ComponentArc::new(element)); + #[fn_builder] + pub fn alter_elements(&mut self, op: PackOp) -> &mut Self { + self.stuff.alter(op); self } @@ -160,7 +156,7 @@ impl Form { } pub fn elements(&self) -> &PackComponents { - &self.elements + &self.stuff } pub fn template(&self) -> &str { diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index aaf230dc..a295eb7f 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -13,8 +13,8 @@ pub enum InputType { Url, } -type InputLabel = OneComponent<L10n>; -type InputHelpText = OneComponent<L10n>; +type InputLabel = ComponentOne<L10n>; +type InputHelpText = ComponentOne<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index f701af96..ef4ba1a7 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -136,17 +136,13 @@ impl Column { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self.stuff.alter(PackOp::Add(ComponentArc::with(component))); self } - pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { - self.stuff.alter(PackOp::Add, arc); - self - } - - pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.stuff.alter(op, ComponentArc::new(component)); + #[fn_builder] + pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + self.stuff.alter(op); self } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 5c261a89..5b60ad80 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -13,7 +13,7 @@ pub struct Row { renderable: Renderable, id : IdentifierValue, classes : Classes, - columns : PackComponents, + columns : VeckComponents<grid::Column>, template : String, } @@ -83,12 +83,13 @@ impl Row { } pub fn with_column(mut self, column: grid::Column) -> Self { - self.columns.alter(PackOp::Add, ComponentArc::new(column)); + self.columns.alter(VeckOp::Add(ComponentOne::with(column))); self } - pub fn alter_columns(&mut self, op: PackOp, column: grid::Column) -> &mut Self { - self.columns.alter(op, ComponentArc::new(column)); + #[fn_builder] + pub fn alter_columns(&mut self, op: VeckOp<grid::Column>) -> &mut Self { + self.columns.alter(op); self } @@ -104,7 +105,7 @@ impl Row { &self.classes } - pub fn columns(&self) -> &PackComponents { + pub fn columns(&self) -> &VeckComponents<grid::Column> { &self.columns } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index d6f15ff7..b0a6afb5 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -25,7 +25,7 @@ pub enum HeadingDisplay { Subtitle, } -type HeadingText = OneComponent<L10n>; +type HeadingText = ComponentOne<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index a88f07a7..ecffc048 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -90,17 +90,13 @@ impl Paragraph { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add, ComponentArc::new(component)); + self.stuff.alter(PackOp::Add(ComponentArc::with(component))); self } - pub fn with_component_arc(mut self, arc: ComponentArc) -> Self { - self.stuff.alter(PackOp::Add, arc); - self - } - - pub fn alter_components(&mut self, op: PackOp, component: impl ComponentTrait) -> &mut Self { - self.stuff.alter(op, ComponentArc::new(component)); + #[fn_builder] + pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + self.stuff.alter(op); self } diff --git a/pagetop-minimal/src/component/site_branding.rs b/pagetop-minimal/src/component/site_branding.rs index 5e3ab340..824f011b 100644 --- a/pagetop-minimal/src/component/site_branding.rs +++ b/pagetop-minimal/src/component/site_branding.rs @@ -6,8 +6,8 @@ use crate::LOCALES_MINIMAL; new_handle!(COMPONENT_BRANDING); -type SiteSlogan = OneComponent<L10n>; -type SiteLogo = OneComponent<Image>; +type SiteSlogan = ComponentOne<L10n>; +type SiteLogo = ComponentOne<Image>; #[rustfmt::skip] pub struct SiteBranding { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 179514d9..3d2bb8f1 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -5,17 +5,20 @@ pub type FnContextualPath = fn(cx: &Context) -> &str; mod definition; pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; +mod renderable; +pub use renderable::{FnIsRenderable, Renderable}; + mod arc; pub use arc::ComponentArc; -mod one; -pub use one::OneComponent; - mod pack; pub use pack::{PackComponents, PackOp}; -mod renderable; -pub use renderable::{FnIsRenderable, Renderable}; +mod one; +pub use one::ComponentOne; + +mod veck; +pub use veck::{VeckComponents, VeckOp}; pub mod html; pub mod l10n; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs index 93e1193c..734248cb 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc.rs @@ -1,14 +1,39 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::Markup; -use crate::{Handle, Weight}; +use crate::{new_handle, Handle, Weight}; use std::sync::{Arc, RwLock}; +new_handle!(COMPONENT_NULL for Crate); + +#[derive(Default)] +struct ComponentNull; + +impl ComponentTrait for ComponentNull { + fn new() -> Self { + ComponentNull::default() + } + + fn handle(&self) -> Handle { + COMPONENT_NULL + } +} + #[derive(Clone)] pub struct ComponentArc(Arc<RwLock<dyn ComponentTrait>>); +impl Default for ComponentArc { + fn default() -> Self { + ComponentArc(Arc::new(RwLock::new(ComponentNull))) + } +} + impl ComponentArc { - pub fn new(component: impl ComponentTrait) -> Self { + pub fn new() -> Self { + ComponentArc::default() + } + + pub fn with(component: impl ComponentTrait) -> Self { ComponentArc(Arc::new(RwLock::new(component))) } @@ -24,7 +49,9 @@ impl ComponentArc { self.0.read().unwrap().weight() } - pub(crate) fn prepare(&self, cx: &mut Context) -> Markup { + // ComponentArc PREPARE. + + pub fn prepare(&self, cx: &mut Context) -> Markup { self.0.write().unwrap().prepare(cx) } } diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs index f0d31ef5..cc05bac4 100644 --- a/pagetop/src/core/component/one.rs +++ b/pagetop/src/core/component/one.rs @@ -1,30 +1,46 @@ use crate::core::component::{ComponentTrait, Context}; -use crate::html::{html, Markup}; +use crate::html::Markup; +use crate::{Handle, Weight}; use std::sync::{Arc, RwLock}; -#[derive(Clone, Default)] -pub struct OneComponent<T: ComponentTrait + Default>(Option<Arc<RwLock<T>>>); +#[derive(Default)] +pub struct ComponentOne<T: ComponentTrait + Default>(Arc<RwLock<T>>); -impl<T: ComponentTrait + Default> OneComponent<T> { +impl<T: ComponentTrait + Default> Clone for ComponentOne<T> { + fn clone(&self) -> Self { + Self(self.0.clone()) + } +} + +impl<T: ComponentTrait + Default> ComponentOne<T> { pub fn new() -> Self { - OneComponent::<T>::default() + ComponentOne::<T>::default() } pub fn with(component: T) -> Self { - OneComponent(Some(Arc::new(RwLock::new(component)))) + ComponentOne(Arc::new(RwLock::new(component))) } pub fn set(&mut self, component: T) { - self.0 = Some(Arc::new(RwLock::new(component))); + self.0 = Arc::new(RwLock::new(component)); } - // OneComponent PREPARE. + pub(crate) fn handle(&self) -> Handle { + self.0.read().unwrap().handle() + } + + pub(crate) fn id(&self) -> Option<String> { + self.0.read().unwrap().id() + } + + pub(crate) fn weight(&self) -> Weight { + self.0.read().unwrap().weight() + } + + // ComponentOne PREPARE. pub fn prepare(&self, cx: &mut Context) -> Markup { - if let Some(component) = &self.0 { - return component.write().unwrap().prepare(cx); - } - html! {} + self.0.write().unwrap().prepare(cx) } } diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/pack.rs index e55799c9..f9b16cf9 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/pack.rs @@ -3,12 +3,12 @@ use crate::html::{html, Markup}; use crate::Handle; pub enum PackOp { - Add, - AddAfterId(&'static str), - AddBeforeId(&'static str), - AddFirst, + Add(ComponentArc), + AddAfterId(&'static str, ComponentArc), + AddBeforeId(&'static str, ComponentArc), + AddFirst(ComponentArc), RemoveById(&'static str), - ReplaceById(&'static str), + ReplaceById(&'static str, ComponentArc), Reset, } @@ -22,7 +22,7 @@ impl PackComponents { pub fn with(arc: ComponentArc) -> Self { let mut pack = PackComponents::new(); - pack.alter(PackOp::Add, arc); + pack.alter(PackOp::Add(arc)); pack } @@ -36,28 +36,28 @@ impl PackComponents { // PackComponents BUILDER. - pub fn alter(&mut self, op: PackOp, arc: ComponentArc) -> &mut Self { + pub fn alter(&mut self, op: PackOp) -> &mut Self { match op { - PackOp::Add => self.0.push(arc), - PackOp::AddAfterId(id) => { + PackOp::Add(arc) => self.0.push(arc), + PackOp::AddAfterId(id, arc) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index + 1, arc), _ => self.0.push(arc), } } - PackOp::AddBeforeId(id) => { + PackOp::AddBeforeId(id, arc) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index, arc), _ => self.0.insert(0, arc), } } - PackOp::AddFirst => self.0.insert(0, arc), + PackOp::AddFirst(arc) => self.0.insert(0, arc), PackOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { self.0.remove(index); } } - PackOp::ReplaceById(id) => { + PackOp::ReplaceById(id, arc) => { for c in self.0.iter_mut() { if c.id().as_deref() == Some(id) { *c = arc; diff --git a/pagetop/src/core/component/veck.rs b/pagetop/src/core/component/veck.rs new file mode 100644 index 00000000..9ba9426c --- /dev/null +++ b/pagetop/src/core/component/veck.rs @@ -0,0 +1,90 @@ +use crate::core::component::{ComponentOne, ComponentTrait, Context}; +use crate::html::{html, Markup}; +use crate::Handle; + +pub enum VeckOp<T: ComponentTrait + Default> { + Add(ComponentOne<T>), + AddAfterId(&'static str, ComponentOne<T>), + AddBeforeId(&'static str, ComponentOne<T>), + AddFirst(ComponentOne<T>), + RemoveById(&'static str), + ReplaceById(&'static str, ComponentOne<T>), + Reset, +} + +#[derive(Clone, Default)] +pub struct VeckComponents<T: ComponentTrait + Default>(Vec<ComponentOne<T>>); + +impl<T: ComponentTrait + Default> VeckComponents<T> { + pub fn new() -> Self { + VeckComponents::<T>::default() + } + + pub fn with(one: ComponentOne<T>) -> Self { + let mut veck = VeckComponents::new(); + veck.alter(VeckOp::Add(one)); + veck + } + + // VeckComponents BUILDER. + + pub fn alter(&mut self, op: VeckOp<T>) -> &mut Self { + match op { + VeckOp::Add(one) => self.0.push(one), + VeckOp::AddAfterId(id, one) => { + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index + 1, one), + _ => self.0.push(one), + } + } + VeckOp::AddBeforeId(id, one) => { + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index, one), + _ => self.0.insert(0, one), + } + } + VeckOp::AddFirst(one) => self.0.insert(0, one), + VeckOp::RemoveById(id) => { + if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + self.0.remove(index); + } + } + VeckOp::ReplaceById(id, one) => { + for c in self.0.iter_mut() { + if c.id().as_deref() == Some(id) { + *c = one; + break; + } + } + } + VeckOp::Reset => self.0.clear(), + } + self + } + + // VeckComponents GETTERS. + + pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentOne<T>> { + self.0.iter().find(|&c| c.id().as_deref() == Some(id)) + } + + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ComponentOne<T>> { + self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) + } + + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ComponentOne<T>> { + self.0.iter().filter(move |&c| c.handle() == handle) + } + + // VeckComponents PREPARE. + + pub fn prepare(&self, cx: &mut Context) -> Markup { + let mut components = self.0.clone(); + components.sort_by_key(|c| c.weight()); + html! { + @for c in components.iter() { + " " (c.prepare(cx)) " " + } + } + } +} diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 20aa99bd..9364f4d3 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -27,13 +27,13 @@ impl ComponentsRegions { pub fn add_in(&mut self, region: &'static str, arc: ComponentArc) { if let Some(region) = self.0.get_mut(region) { - region.alter(PackOp::Add, arc); + region.alter(PackOp::Add(arc)); } else { self.0.insert(region, PackComponents::with(arc)); } } - pub fn get_pack(&self, theme: ThemeRef, region: &str) -> PackComponents { + pub fn get_components(&self, theme: ThemeRef, region: &str) -> PackComponents { let common = COMMON_REGIONS.read().unwrap(); if let Some(hm) = THEME_REGIONS.read().unwrap().get(&theme.handle()) { PackComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 86199984..cb1355bc 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -2,7 +2,7 @@ mod action; pub use action::*; use crate::core::component::l10n::L10n; -use crate::core::component::{ComponentArc, ComponentTrait, Context, ContextOp, OneComponent}; +use crate::core::component::{ComponentArc, ComponentOne, ComponentTrait, Context, ContextOp}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::fatal_error::FatalError; @@ -12,8 +12,8 @@ use unic_langid::CharacterDirection; pub use actix_web::Result as ResultPage; -type PageTitle = OneComponent<L10n>; -type PageDescription = OneComponent<L10n>; +type PageTitle = ComponentOne<L10n>; +type PageDescription = ComponentOne<L10n>; #[rustfmt::skip] pub struct Page { @@ -90,7 +90,7 @@ impl Page { #[fn_builder] pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_in(region, ComponentArc::new(component)); + self.regions.add_in(region, ComponentArc::with(component)); self } @@ -173,7 +173,7 @@ impl Page { pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { let render = self .regions - .get_pack(self.context.theme(), region) + .get_components(self.context.theme(), region) .prepare(self.context()); if render.is_empty() { None From 24f2f0d765e0eb4705c40a8cee200757de2d1fb6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 17 Aug 2023 23:52:22 +0200 Subject: [PATCH 510/853] =?UTF-8?q?=F0=9F=92=A5=20Rename=20Pack=20to=20Mix?= =?UTF-8?q?Components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/block.rs | 8 ++-- pagetop-minimal/src/component/container.rs | 8 ++-- pagetop-minimal/src/component/flex/item.rs | 8 ++-- .../src/component/form_element/form.rs | 8 ++-- pagetop-minimal/src/component/grid/column.rs | 8 ++-- pagetop-minimal/src/component/paragraph.rs | 8 ++-- pagetop/src/core/component.rs | 4 +- .../src/core/component/{pack.rs => mix.rs} | 38 +++++++++---------- pagetop/src/core/theme/regions.rs | 14 +++---- 9 files changed, 52 insertions(+), 52 deletions(-) rename pagetop/src/core/component/{pack.rs => mix.rs} (73%) diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index d7ffe41c..2007c86e 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -12,7 +12,7 @@ pub struct Block { id : IdentifierValue, classes : Classes, title : AttributeValue, - stuff : PackComponents, + stuff : MixComponents, template : String, } @@ -94,12 +94,12 @@ impl Block { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add(ComponentArc::with(component))); + self.stuff.alter(MixOp::Add(ComponentArc::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + pub fn alter_components(&mut self, op: MixOp) -> &mut Self { self.stuff.alter(op); self } @@ -120,7 +120,7 @@ impl Block { &self.title } - pub fn components(&self) -> &PackComponents { + pub fn components(&self) -> &MixComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 3a99eb56..a7c71e40 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -23,7 +23,7 @@ pub struct Container { classes : Classes, inner_classes : Classes, container_type: ContainerType, - stuff : PackComponents, + stuff : MixComponents, template : String, } @@ -155,12 +155,12 @@ impl Container { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add(ComponentArc::with(component))); + self.stuff.alter(MixOp::Add(ComponentArc::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + pub fn alter_components(&mut self, op: MixOp) -> &mut Self { self.stuff.alter(op); self } @@ -185,7 +185,7 @@ impl Container { &self.container_type } - pub fn components(&self) -> &PackComponents { + pub fn components(&self) -> &MixComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/flex/item.rs b/pagetop-minimal/src/component/flex/item.rs index 164ff2aa..f2159530 100644 --- a/pagetop-minimal/src/component/flex/item.rs +++ b/pagetop-minimal/src/component/flex/item.rs @@ -44,7 +44,7 @@ pub struct Item { id : IdentifierValue, classes : Classes, size : ItemSize, - stuff : PackComponents, + stuff : MixComponents, template : String, } @@ -136,12 +136,12 @@ impl Item { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add(ComponentArc::with(component))); + self.stuff.alter(MixOp::Add(ComponentArc::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + pub fn alter_components(&mut self, op: MixOp) -> &mut Self { self.stuff.alter(op); self } @@ -162,7 +162,7 @@ impl Item { &self.size } - pub fn components(&self) -> &PackComponents { + pub fn components(&self) -> &MixComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index ef8d403d..1c67db0c 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -21,7 +21,7 @@ pub struct Form { action : AttributeValue, charset : AttributeValue, method : FormMethod, - stuff : PackComponents, + stuff : MixComponents, template : String, } @@ -121,12 +121,12 @@ impl Form { } pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add(ComponentArc::with(element))); + self.stuff.alter(MixOp::Add(ComponentArc::with(element))); self } #[fn_builder] - pub fn alter_elements(&mut self, op: PackOp) -> &mut Self { + pub fn alter_elements(&mut self, op: MixOp) -> &mut Self { self.stuff.alter(op); self } @@ -155,7 +155,7 @@ impl Form { &self.method } - pub fn elements(&self) -> &PackComponents { + pub fn elements(&self) -> &MixComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index ef4ba1a7..db2f7920 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -44,7 +44,7 @@ pub struct Column { id : IdentifierValue, classes : Classes, size : ColumnSize, - stuff : PackComponents, + stuff : MixComponents, template : String, } @@ -136,12 +136,12 @@ impl Column { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add(ComponentArc::with(component))); + self.stuff.alter(MixOp::Add(ComponentArc::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + pub fn alter_components(&mut self, op: MixOp) -> &mut Self { self.stuff.alter(op); self } @@ -162,7 +162,7 @@ impl Column { &self.size } - pub fn components(&self) -> &PackComponents { + pub fn components(&self) -> &MixComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index ecffc048..9d33c4c3 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -20,7 +20,7 @@ pub struct Paragraph { renderable: Renderable, id : IdentifierValue, classes : Classes, - stuff : PackComponents, + stuff : MixComponents, display : ParagraphDisplay, template : String, } @@ -90,12 +90,12 @@ impl Paragraph { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(PackOp::Add(ComponentArc::with(component))); + self.stuff.alter(MixOp::Add(ComponentArc::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: PackOp) -> &mut Self { + pub fn alter_components(&mut self, op: MixOp) -> &mut Self { self.stuff.alter(op); self } @@ -130,7 +130,7 @@ impl Paragraph { &self.classes } - pub fn components(&self) -> &PackComponents { + pub fn components(&self) -> &MixComponents { &self.stuff } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 3d2bb8f1..fc5b7fca 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -11,8 +11,8 @@ pub use renderable::{FnIsRenderable, Renderable}; mod arc; pub use arc::ComponentArc; -mod pack; -pub use pack::{PackComponents, PackOp}; +mod mix; +pub use mix::{MixComponents, MixOp}; mod one; pub use one::ComponentOne; diff --git a/pagetop/src/core/component/pack.rs b/pagetop/src/core/component/mix.rs similarity index 73% rename from pagetop/src/core/component/pack.rs rename to pagetop/src/core/component/mix.rs index f9b16cf9..f8607342 100644 --- a/pagetop/src/core/component/pack.rs +++ b/pagetop/src/core/component/mix.rs @@ -2,7 +2,7 @@ use crate::core::component::{ComponentArc, Context}; use crate::html::{html, Markup}; use crate::Handle; -pub enum PackOp { +pub enum MixOp { Add(ComponentArc), AddAfterId(&'static str, ComponentArc), AddBeforeId(&'static str, ComponentArc), @@ -13,51 +13,51 @@ pub enum PackOp { } #[derive(Clone, Default)] -pub struct PackComponents(Vec<ComponentArc>); +pub struct MixComponents(Vec<ComponentArc>); -impl PackComponents { +impl MixComponents { pub fn new() -> Self { - PackComponents::default() + MixComponents::default() } pub fn with(arc: ComponentArc) -> Self { - let mut pack = PackComponents::new(); - pack.alter(PackOp::Add(arc)); + let mut pack = MixComponents::new(); + pack.alter(MixOp::Add(arc)); pack } - pub(crate) fn merge(packs: &[Option<&PackComponents>]) -> Self { - let mut pack = PackComponents::default(); + pub(crate) fn merge(packs: &[Option<&MixComponents>]) -> Self { + let mut pack = MixComponents::default(); for p in packs.iter().flatten() { pack.0.append(&mut p.0.clone()); } pack } - // PackComponents BUILDER. + // MixComponents BUILDER. - pub fn alter(&mut self, op: PackOp) -> &mut Self { + pub fn alter(&mut self, op: MixOp) -> &mut Self { match op { - PackOp::Add(arc) => self.0.push(arc), - PackOp::AddAfterId(id, arc) => { + MixOp::Add(arc) => self.0.push(arc), + MixOp::AddAfterId(id, arc) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index + 1, arc), _ => self.0.push(arc), } } - PackOp::AddBeforeId(id, arc) => { + MixOp::AddBeforeId(id, arc) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index, arc), _ => self.0.insert(0, arc), } } - PackOp::AddFirst(arc) => self.0.insert(0, arc), - PackOp::RemoveById(id) => { + MixOp::AddFirst(arc) => self.0.insert(0, arc), + MixOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { self.0.remove(index); } } - PackOp::ReplaceById(id, arc) => { + MixOp::ReplaceById(id, arc) => { for c in self.0.iter_mut() { if c.id().as_deref() == Some(id) { *c = arc; @@ -65,12 +65,12 @@ impl PackComponents { } } } - PackOp::Reset => self.0.clear(), + MixOp::Reset => self.0.clear(), } self } - // PackComponents GETTERS. + // MixComponents GETTERS. pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentArc> { self.0.iter().find(|&c| c.id().as_deref() == Some(id)) @@ -84,7 +84,7 @@ impl PackComponents { self.0.iter().filter(move |&c| c.handle() == handle) } - // PackComponents PREPARE. + // MixComponents PREPARE. pub fn prepare(&self, cx: &mut Context) -> Markup { let mut components = self.0.clone(); diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 9364f4d3..0e71fb00 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ComponentArc, PackComponents, PackOp}; +use crate::core::component::{ComponentArc, MixComponents, MixOp}; use crate::core::theme::ThemeRef; use crate::{Handle, LazyStatic}; @@ -12,7 +12,7 @@ static COMMON_REGIONS: LazyStatic<RwLock<ComponentsRegions>> = LazyStatic::new(|| RwLock::new(ComponentsRegions::new())); #[derive(Default)] -pub struct ComponentsRegions(HashMap<&'static str, PackComponents>); +pub struct ComponentsRegions(HashMap<&'static str, MixComponents>); impl ComponentsRegions { pub fn new() -> Self { @@ -27,18 +27,18 @@ impl ComponentsRegions { pub fn add_in(&mut self, region: &'static str, arc: ComponentArc) { if let Some(region) = self.0.get_mut(region) { - region.alter(PackOp::Add(arc)); + region.alter(MixOp::Add(arc)); } else { - self.0.insert(region, PackComponents::with(arc)); + self.0.insert(region, MixComponents::with(arc)); } } - pub fn get_components(&self, theme: ThemeRef, region: &str) -> PackComponents { + pub fn get_components(&self, theme: ThemeRef, region: &str) -> MixComponents { let common = COMMON_REGIONS.read().unwrap(); if let Some(hm) = THEME_REGIONS.read().unwrap().get(&theme.handle()) { - PackComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) + MixComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) } else { - PackComponents::merge(&[common.0.get(region), self.0.get(region)]) + MixComponents::merge(&[common.0.get(region), self.0.get(region)]) } } } From 66117992c17552a367a2138a0a83a85a6a7f8283 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 18 Aug 2023 11:26:49 +0200 Subject: [PATCH 511/853] =?UTF-8?q?=F0=9F=92=A5=20Rename=20Veck=20to=20Lis?= =?UTF-8?q?Components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/menu.rs | 8 ++--- .../src/component/flex/container.rs | 8 ++--- pagetop-minimal/src/component/grid/row.rs | 8 ++--- pagetop/src/core/component.rs | 10 +++--- pagetop/src/core/component/arc.rs | 4 +++ .../src/core/component/{veck.rs => lis.rs} | 36 +++++++++---------- pagetop/src/core/component/mix.rs | 16 ++++----- 7 files changed, 47 insertions(+), 43 deletions(-) rename pagetop/src/core/component/{veck.rs => lis.rs} (72%) diff --git a/pagetop-megamenu/src/component/menu.rs b/pagetop-megamenu/src/component/menu.rs index 819d0d0b..c4b4f72c 100644 --- a/pagetop-megamenu/src/component/menu.rs +++ b/pagetop-megamenu/src/component/menu.rs @@ -26,7 +26,7 @@ pub struct MegaMenu { weight : Weight, renderable: Renderable, id : IdentifierValue, - items : VeckComponents<MegaItem>, + items : LisComponents<MegaItem>, theme : MegaMenuTheme, } @@ -153,12 +153,12 @@ impl MegaMenu { } pub fn with_item(mut self, item: MegaItem) -> Self { - self.items.alter(VeckOp::Add(ComponentOne::with(item))); + self.items.alter(LisOp::Add(ComponentOne::with(item))); self } #[fn_builder] - pub fn alter_items(&mut self, op: VeckOp<MegaItem>) -> &mut Self { + pub fn alter_items(&mut self, op: LisOp<MegaItem>) -> &mut Self { self.items.alter(op); self } @@ -171,7 +171,7 @@ impl MegaMenu { // MegaMenu GETTERS. - pub fn items(&self) -> &VeckComponents<MegaItem> { + pub fn items(&self) -> &LisComponents<MegaItem> { &self.items } diff --git a/pagetop-minimal/src/component/flex/container.rs b/pagetop-minimal/src/component/flex/container.rs index 803ad6ab..7c579b01 100644 --- a/pagetop-minimal/src/component/flex/container.rs +++ b/pagetop-minimal/src/component/flex/container.rs @@ -13,7 +13,7 @@ pub struct Container { renderable: Renderable, id : IdentifierValue, classes : Classes, - items : VeckComponents<flex::Item>, + items : LisComponents<flex::Item>, template : String, } @@ -83,12 +83,12 @@ impl Container { } pub fn with_item(mut self, item: flex::Item) -> Self { - self.items.alter(VeckOp::Add(ComponentOne::with(item))); + self.items.alter(LisOp::Add(ComponentOne::with(item))); self } #[fn_builder] - pub fn alter_items(&mut self, op: VeckOp<flex::Item>) -> &mut Self { + pub fn alter_items(&mut self, op: LisOp<flex::Item>) -> &mut Self { self.items.alter(op); self } @@ -105,7 +105,7 @@ impl Container { &self.classes } - pub fn items(&self) -> &VeckComponents<flex::Item> { + pub fn items(&self) -> &LisComponents<flex::Item> { &self.items } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 5b60ad80..3b6d06ce 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -13,7 +13,7 @@ pub struct Row { renderable: Renderable, id : IdentifierValue, classes : Classes, - columns : VeckComponents<grid::Column>, + columns : LisComponents<grid::Column>, template : String, } @@ -83,12 +83,12 @@ impl Row { } pub fn with_column(mut self, column: grid::Column) -> Self { - self.columns.alter(VeckOp::Add(ComponentOne::with(column))); + self.columns.alter(LisOp::Add(ComponentOne::with(column))); self } #[fn_builder] - pub fn alter_columns(&mut self, op: VeckOp<grid::Column>) -> &mut Self { + pub fn alter_columns(&mut self, op: LisOp<grid::Column>) -> &mut Self { self.columns.alter(op); self } @@ -105,7 +105,7 @@ impl Row { &self.classes } - pub fn columns(&self) -> &VeckComponents<grid::Column> { + pub fn columns(&self) -> &LisComponents<grid::Column> { &self.columns } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index fc5b7fca..ec0825f8 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -2,12 +2,12 @@ mod context; pub use context::{Context, ContextOp}; pub type FnContextualPath = fn(cx: &Context) -> &str; -mod definition; -pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; - mod renderable; pub use renderable::{FnIsRenderable, Renderable}; +mod definition; +pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; + mod arc; pub use arc::ComponentArc; @@ -17,8 +17,8 @@ pub use mix::{MixComponents, MixOp}; mod one; pub use one::ComponentOne; -mod veck; -pub use veck::{VeckComponents, VeckOp}; +mod lis; +pub use lis::{LisComponents, LisOp}; pub mod html; pub mod l10n; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs index 734248cb..10840fc9 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc.rs @@ -37,6 +37,10 @@ impl ComponentArc { ComponentArc(Arc::new(RwLock::new(component))) } + pub fn set(&mut self, component: impl ComponentTrait) { + self.0 = Arc::new(RwLock::new(component)); + } + pub(crate) fn handle(&self) -> Handle { self.0.read().unwrap().handle() } diff --git a/pagetop/src/core/component/veck.rs b/pagetop/src/core/component/lis.rs similarity index 72% rename from pagetop/src/core/component/veck.rs rename to pagetop/src/core/component/lis.rs index 9ba9426c..07b3a551 100644 --- a/pagetop/src/core/component/veck.rs +++ b/pagetop/src/core/component/lis.rs @@ -2,7 +2,7 @@ use crate::core::component::{ComponentOne, ComponentTrait, Context}; use crate::html::{html, Markup}; use crate::Handle; -pub enum VeckOp<T: ComponentTrait + Default> { +pub enum LisOp<T: ComponentTrait + Default> { Add(ComponentOne<T>), AddAfterId(&'static str, ComponentOne<T>), AddBeforeId(&'static str, ComponentOne<T>), @@ -13,43 +13,43 @@ pub enum VeckOp<T: ComponentTrait + Default> { } #[derive(Clone, Default)] -pub struct VeckComponents<T: ComponentTrait + Default>(Vec<ComponentOne<T>>); +pub struct LisComponents<T: ComponentTrait + Default>(Vec<ComponentOne<T>>); -impl<T: ComponentTrait + Default> VeckComponents<T> { +impl<T: ComponentTrait + Default> LisComponents<T> { pub fn new() -> Self { - VeckComponents::<T>::default() + LisComponents::<T>::default() } pub fn with(one: ComponentOne<T>) -> Self { - let mut veck = VeckComponents::new(); - veck.alter(VeckOp::Add(one)); - veck + let mut components = LisComponents::new(); + components.alter(LisOp::Add(one)); + components } - // VeckComponents BUILDER. + // LisComponents BUILDER. - pub fn alter(&mut self, op: VeckOp<T>) -> &mut Self { + pub fn alter(&mut self, op: LisOp<T>) -> &mut Self { match op { - VeckOp::Add(one) => self.0.push(one), - VeckOp::AddAfterId(id, one) => { + LisOp::Add(one) => self.0.push(one), + LisOp::AddAfterId(id, one) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index + 1, one), _ => self.0.push(one), } } - VeckOp::AddBeforeId(id, one) => { + LisOp::AddBeforeId(id, one) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index, one), _ => self.0.insert(0, one), } } - VeckOp::AddFirst(one) => self.0.insert(0, one), - VeckOp::RemoveById(id) => { + LisOp::AddFirst(one) => self.0.insert(0, one), + LisOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { self.0.remove(index); } } - VeckOp::ReplaceById(id, one) => { + LisOp::ReplaceById(id, one) => { for c in self.0.iter_mut() { if c.id().as_deref() == Some(id) { *c = one; @@ -57,12 +57,12 @@ impl<T: ComponentTrait + Default> VeckComponents<T> { } } } - VeckOp::Reset => self.0.clear(), + LisOp::Reset => self.0.clear(), } self } - // VeckComponents GETTERS. + // LisComponents GETTERS. pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentOne<T>> { self.0.iter().find(|&c| c.id().as_deref() == Some(id)) @@ -76,7 +76,7 @@ impl<T: ComponentTrait + Default> VeckComponents<T> { self.0.iter().filter(move |&c| c.handle() == handle) } - // VeckComponents PREPARE. + // LisComponents PREPARE. pub fn prepare(&self, cx: &mut Context) -> Markup { let mut components = self.0.clone(); diff --git a/pagetop/src/core/component/mix.rs b/pagetop/src/core/component/mix.rs index f8607342..fa9985a6 100644 --- a/pagetop/src/core/component/mix.rs +++ b/pagetop/src/core/component/mix.rs @@ -21,17 +21,17 @@ impl MixComponents { } pub fn with(arc: ComponentArc) -> Self { - let mut pack = MixComponents::new(); - pack.alter(MixOp::Add(arc)); - pack + let mut components = MixComponents::new(); + components.alter(MixOp::Add(arc)); + components } - pub(crate) fn merge(packs: &[Option<&MixComponents>]) -> Self { - let mut pack = MixComponents::default(); - for p in packs.iter().flatten() { - pack.0.append(&mut p.0.clone()); + pub(crate) fn merge(mixes: &[Option<&MixComponents>]) -> Self { + let mut components = MixComponents::default(); + for m in mixes.iter().flatten() { + components.0.append(&mut m.0.clone()); } - pack + components } // MixComponents BUILDER. From f2031307d7e08d888db0a7015bb582749bf0faf9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 19 Aug 2023 11:37:01 +0200 Subject: [PATCH 512/853] =?UTF-8?q?=F0=9F=92=A5=20OneComponents=20are=20no?= =?UTF-8?q?w=20TypedComponents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component/item.rs | 4 +- pagetop-megamenu/src/component/menu.rs | 8 +- pagetop-minimal/src/component/anchor.rs | 4 +- pagetop-minimal/src/component/block.rs | 8 +- pagetop-minimal/src/component/container.rs | 8 +- .../src/component/flex/container.rs | 8 +- pagetop-minimal/src/component/flex/item.rs | 8 +- .../src/component/form_element/button.rs | 2 +- .../src/component/form_element/form.rs | 8 +- .../src/component/form_element/input.rs | 4 +- pagetop-minimal/src/component/grid/column.rs | 8 +- pagetop-minimal/src/component/grid/row.rs | 12 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 8 +- .../src/component/site_branding.rs | 4 +- pagetop/src/core/component.rs | 12 +- pagetop/src/core/component/arc.rs | 111 +++++++++++++-- pagetop/src/core/component/lis.rs | 90 ------------ pagetop/src/core/component/mix.rs | 98 ------------- pagetop/src/core/component/one.rs | 46 ------ pagetop/src/core/component/typed.rs | 133 ++++++++++++++++++ pagetop/src/core/theme/regions.rs | 20 +-- pagetop/src/response/page.rs | 8 +- 23 files changed, 301 insertions(+), 313 deletions(-) delete mode 100644 pagetop/src/core/component/lis.rs delete mode 100644 pagetop/src/core/component/mix.rs delete mode 100644 pagetop/src/core/component/one.rs create mode 100644 pagetop/src/core/component/typed.rs diff --git a/pagetop-megamenu/src/component/item.rs b/pagetop-megamenu/src/component/item.rs index 52c50d36..c292167f 100644 --- a/pagetop-megamenu/src/component/item.rs +++ b/pagetop-megamenu/src/component/item.rs @@ -4,8 +4,8 @@ use crate::component::MegaMenu; new_handle!(COMPONENT_MEGAITEM); -type Label = ComponentOne<L10n>; -type Content = ComponentOne<Html>; +type Label = TypedComponent<L10n>; +type Content = TypedComponent<Html>; #[derive(Default)] pub enum MegaItemType { diff --git a/pagetop-megamenu/src/component/menu.rs b/pagetop-megamenu/src/component/menu.rs index c4b4f72c..55ee1429 100644 --- a/pagetop-megamenu/src/component/menu.rs +++ b/pagetop-megamenu/src/component/menu.rs @@ -26,7 +26,7 @@ pub struct MegaMenu { weight : Weight, renderable: Renderable, id : IdentifierValue, - items : LisComponents<MegaItem>, + items : TypedComponents<MegaItem>, theme : MegaMenuTheme, } @@ -153,12 +153,12 @@ impl MegaMenu { } pub fn with_item(mut self, item: MegaItem) -> Self { - self.items.alter(LisOp::Add(ComponentOne::with(item))); + self.items.alter(TypedOp::Add(TypedComponent::with(item))); self } #[fn_builder] - pub fn alter_items(&mut self, op: LisOp<MegaItem>) -> &mut Self { + pub fn alter_items(&mut self, op: TypedOp<MegaItem>) -> &mut Self { self.items.alter(op); self } @@ -171,7 +171,7 @@ impl MegaMenu { // MegaMenu GETTERS. - pub fn items(&self) -> &LisComponents<MegaItem> { + pub fn items(&self) -> &TypedComponents<MegaItem> { &self.items } diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 709ab28e..9d84b983 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -22,8 +22,8 @@ pub enum AnchorTarget { Context(String), } -type AnchorIcon = ComponentOne<Icon>; -type AnchorHtml = ComponentOne<L10n>; +type AnchorIcon = TypedComponent<Icon>; +type AnchorHtml = TypedComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 2007c86e..7f63269f 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -12,7 +12,7 @@ pub struct Block { id : IdentifierValue, classes : Classes, title : AttributeValue, - stuff : MixComponents, + stuff : ArcComponents, template : String, } @@ -94,12 +94,12 @@ impl Block { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(MixOp::Add(ComponentArc::with(component))); + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: MixOp) -> &mut Self { + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { self.stuff.alter(op); self } @@ -120,7 +120,7 @@ impl Block { &self.title } - pub fn components(&self) -> &MixComponents { + pub fn components(&self) -> &ArcComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index a7c71e40..607765b0 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -23,7 +23,7 @@ pub struct Container { classes : Classes, inner_classes : Classes, container_type: ContainerType, - stuff : MixComponents, + stuff : ArcComponents, template : String, } @@ -155,12 +155,12 @@ impl Container { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(MixOp::Add(ComponentArc::with(component))); + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: MixOp) -> &mut Self { + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { self.stuff.alter(op); self } @@ -185,7 +185,7 @@ impl Container { &self.container_type } - pub fn components(&self) -> &MixComponents { + pub fn components(&self) -> &ArcComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/flex/container.rs b/pagetop-minimal/src/component/flex/container.rs index 7c579b01..54610dc0 100644 --- a/pagetop-minimal/src/component/flex/container.rs +++ b/pagetop-minimal/src/component/flex/container.rs @@ -13,7 +13,7 @@ pub struct Container { renderable: Renderable, id : IdentifierValue, classes : Classes, - items : LisComponents<flex::Item>, + items : TypedComponents<flex::Item>, template : String, } @@ -83,12 +83,12 @@ impl Container { } pub fn with_item(mut self, item: flex::Item) -> Self { - self.items.alter(LisOp::Add(ComponentOne::with(item))); + self.items.alter(TypedOp::Add(TypedComponent::with(item))); self } #[fn_builder] - pub fn alter_items(&mut self, op: LisOp<flex::Item>) -> &mut Self { + pub fn alter_items(&mut self, op: TypedOp<flex::Item>) -> &mut Self { self.items.alter(op); self } @@ -105,7 +105,7 @@ impl Container { &self.classes } - pub fn items(&self) -> &LisComponents<flex::Item> { + pub fn items(&self) -> &TypedComponents<flex::Item> { &self.items } diff --git a/pagetop-minimal/src/component/flex/item.rs b/pagetop-minimal/src/component/flex/item.rs index f2159530..96c43a7a 100644 --- a/pagetop-minimal/src/component/flex/item.rs +++ b/pagetop-minimal/src/component/flex/item.rs @@ -44,7 +44,7 @@ pub struct Item { id : IdentifierValue, classes : Classes, size : ItemSize, - stuff : MixComponents, + stuff : ArcComponents, template : String, } @@ -136,12 +136,12 @@ impl Item { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(MixOp::Add(ComponentArc::with(component))); + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: MixOp) -> &mut Self { + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { self.stuff.alter(op); self } @@ -162,7 +162,7 @@ impl Item { &self.size } - pub fn components(&self) -> &MixComponents { + pub fn components(&self) -> &ArcComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index d2683c03..85b9b504 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -10,7 +10,7 @@ pub enum ButtonType { Reset, } -type ButtonValue = ComponentOne<L10n>; +type ButtonValue = TypedComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 1c67db0c..3220cf64 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -21,7 +21,7 @@ pub struct Form { action : AttributeValue, charset : AttributeValue, method : FormMethod, - stuff : MixComponents, + stuff : ArcComponents, template : String, } @@ -121,12 +121,12 @@ impl Form { } pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.stuff.alter(MixOp::Add(ComponentArc::with(element))); + self.stuff.alter(ArcOp::Add(ArcComponent::with(element))); self } #[fn_builder] - pub fn alter_elements(&mut self, op: MixOp) -> &mut Self { + pub fn alter_elements(&mut self, op: ArcOp) -> &mut Self { self.stuff.alter(op); self } @@ -155,7 +155,7 @@ impl Form { &self.method } - pub fn elements(&self) -> &MixComponents { + pub fn elements(&self) -> &ArcComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index a295eb7f..dd2a97c5 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -13,8 +13,8 @@ pub enum InputType { Url, } -type InputLabel = ComponentOne<L10n>; -type InputHelpText = ComponentOne<L10n>; +type InputLabel = TypedComponent<L10n>; +type InputHelpText = TypedComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index db2f7920..a438b6b2 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -44,7 +44,7 @@ pub struct Column { id : IdentifierValue, classes : Classes, size : ColumnSize, - stuff : MixComponents, + stuff : ArcComponents, template : String, } @@ -136,12 +136,12 @@ impl Column { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(MixOp::Add(ComponentArc::with(component))); + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: MixOp) -> &mut Self { + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { self.stuff.alter(op); self } @@ -162,7 +162,7 @@ impl Column { &self.size } - pub fn components(&self) -> &MixComponents { + pub fn components(&self) -> &ArcComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 3b6d06ce..31802ec7 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -13,7 +13,7 @@ pub struct Row { renderable: Renderable, id : IdentifierValue, classes : Classes, - columns : LisComponents<grid::Column>, + cols : TypedComponents<grid::Column>, template : String, } @@ -83,13 +83,13 @@ impl Row { } pub fn with_column(mut self, column: grid::Column) -> Self { - self.columns.alter(LisOp::Add(ComponentOne::with(column))); + self.cols.alter(TypedOp::Add(TypedComponent::with(column))); self } #[fn_builder] - pub fn alter_columns(&mut self, op: LisOp<grid::Column>) -> &mut Self { - self.columns.alter(op); + pub fn alter_columns(&mut self, op: TypedOp<grid::Column>) -> &mut Self { + self.cols.alter(op); self } @@ -105,8 +105,8 @@ impl Row { &self.classes } - pub fn columns(&self) -> &LisComponents<grid::Column> { - &self.columns + pub fn columns(&self) -> &TypedComponents<grid::Column> { + &self.cols } pub fn template(&self) -> &str { diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index b0a6afb5..0cb6e66d 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -25,7 +25,7 @@ pub enum HeadingDisplay { Subtitle, } -type HeadingText = ComponentOne<L10n>; +type HeadingText = TypedComponent<L10n>; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 9d33c4c3..00a2944e 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -20,7 +20,7 @@ pub struct Paragraph { renderable: Renderable, id : IdentifierValue, classes : Classes, - stuff : MixComponents, + stuff : ArcComponents, display : ParagraphDisplay, template : String, } @@ -90,12 +90,12 @@ impl Paragraph { } pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(MixOp::Add(ComponentArc::with(component))); + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: MixOp) -> &mut Self { + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { self.stuff.alter(op); self } @@ -130,7 +130,7 @@ impl Paragraph { &self.classes } - pub fn components(&self) -> &MixComponents { + pub fn components(&self) -> &ArcComponents { &self.stuff } diff --git a/pagetop-minimal/src/component/site_branding.rs b/pagetop-minimal/src/component/site_branding.rs index 824f011b..641c3939 100644 --- a/pagetop-minimal/src/component/site_branding.rs +++ b/pagetop-minimal/src/component/site_branding.rs @@ -6,8 +6,8 @@ use crate::LOCALES_MINIMAL; new_handle!(COMPONENT_BRANDING); -type SiteSlogan = ComponentOne<L10n>; -type SiteLogo = ComponentOne<Image>; +type SiteSlogan = TypedComponent<L10n>; +type SiteLogo = TypedComponent<Image>; #[rustfmt::skip] pub struct SiteBranding { diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index ec0825f8..166459fc 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -9,16 +9,10 @@ mod definition; pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; mod arc; -pub use arc::ComponentArc; +pub use arc::{ArcComponent, ArcComponents, ArcOp}; -mod mix; -pub use mix::{MixComponents, MixOp}; - -mod one; -pub use one::ComponentOne; - -mod lis; -pub use lis::{LisComponents, LisOp}; +mod typed; +pub use typed::{TypedComponent, TypedComponents, TypedOp}; pub mod html; pub mod l10n; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs index 10840fc9..4c0b0814 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc.rs @@ -1,5 +1,5 @@ use crate::core::component::{ComponentTrait, Context}; -use crate::html::Markup; +use crate::html::{html, Markup}; use crate::{new_handle, Handle, Weight}; use std::sync::{Arc, RwLock}; @@ -20,21 +20,21 @@ impl ComponentTrait for ComponentNull { } #[derive(Clone)] -pub struct ComponentArc(Arc<RwLock<dyn ComponentTrait>>); +pub struct ArcComponent(Arc<RwLock<dyn ComponentTrait>>); -impl Default for ComponentArc { +impl Default for ArcComponent { fn default() -> Self { - ComponentArc(Arc::new(RwLock::new(ComponentNull))) + ArcComponent(Arc::new(RwLock::new(ComponentNull))) } } -impl ComponentArc { +impl ArcComponent { pub fn new() -> Self { - ComponentArc::default() + ArcComponent::default() } pub fn with(component: impl ComponentTrait) -> Self { - ComponentArc(Arc::new(RwLock::new(component))) + ArcComponent(Arc::new(RwLock::new(component))) } pub fn set(&mut self, component: impl ComponentTrait) { @@ -53,9 +53,104 @@ impl ComponentArc { self.0.read().unwrap().weight() } - // ComponentArc PREPARE. + // ArcComponent PREPARE. pub fn prepare(&self, cx: &mut Context) -> Markup { self.0.write().unwrap().prepare(cx) } } + +pub enum ArcOp { + Add(ArcComponent), + AddAfterId(&'static str, ArcComponent), + AddBeforeId(&'static str, ArcComponent), + AddFirst(ArcComponent), + RemoveById(&'static str), + ReplaceById(&'static str, ArcComponent), + Reset, +} + +#[derive(Clone, Default)] +pub struct ArcComponents(Vec<ArcComponent>); + +impl ArcComponents { + pub fn new() -> Self { + ArcComponents::default() + } + + pub fn with(arc: ArcComponent) -> Self { + let mut components = ArcComponents::new(); + components.alter(ArcOp::Add(arc)); + components + } + + pub(crate) fn merge(mixes: &[Option<&ArcComponents>]) -> Self { + let mut components = ArcComponents::default(); + for m in mixes.iter().flatten() { + components.0.append(&mut m.0.clone()); + } + components + } + + // ArcComponents BUILDER. + + pub fn alter(&mut self, op: ArcOp) -> &mut Self { + match op { + ArcOp::Add(arc) => self.0.push(arc), + ArcOp::AddAfterId(id, arc) => { + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index + 1, arc), + _ => self.0.push(arc), + } + } + ArcOp::AddBeforeId(id, arc) => { + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index, arc), + _ => self.0.insert(0, arc), + } + } + ArcOp::AddFirst(arc) => self.0.insert(0, arc), + ArcOp::RemoveById(id) => { + if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + self.0.remove(index); + } + } + ArcOp::ReplaceById(id, arc) => { + for c in self.0.iter_mut() { + if c.id().as_deref() == Some(id) { + *c = arc; + break; + } + } + } + ArcOp::Reset => self.0.clear(), + } + self + } + + // ArcComponents GETTERS. + + pub fn get_by_id(&self, id: &'static str) -> Option<&ArcComponent> { + self.0.iter().find(|&c| c.id().as_deref() == Some(id)) + } + + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcComponent> { + self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) + } + + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcComponent> { + self.0.iter().filter(move |&c| c.handle() == handle) + } + + // ArcComponents PREPARE. + + pub fn prepare(&self, cx: &mut Context) -> Markup { + let mut components = self.0.clone(); + components.sort_by_key(|c| c.weight()); + html! { + @for c in components.iter() { + " " (c.prepare(cx)) " " + } + } + } +} diff --git a/pagetop/src/core/component/lis.rs b/pagetop/src/core/component/lis.rs deleted file mode 100644 index 07b3a551..00000000 --- a/pagetop/src/core/component/lis.rs +++ /dev/null @@ -1,90 +0,0 @@ -use crate::core::component::{ComponentOne, ComponentTrait, Context}; -use crate::html::{html, Markup}; -use crate::Handle; - -pub enum LisOp<T: ComponentTrait + Default> { - Add(ComponentOne<T>), - AddAfterId(&'static str, ComponentOne<T>), - AddBeforeId(&'static str, ComponentOne<T>), - AddFirst(ComponentOne<T>), - RemoveById(&'static str), - ReplaceById(&'static str, ComponentOne<T>), - Reset, -} - -#[derive(Clone, Default)] -pub struct LisComponents<T: ComponentTrait + Default>(Vec<ComponentOne<T>>); - -impl<T: ComponentTrait + Default> LisComponents<T> { - pub fn new() -> Self { - LisComponents::<T>::default() - } - - pub fn with(one: ComponentOne<T>) -> Self { - let mut components = LisComponents::new(); - components.alter(LisOp::Add(one)); - components - } - - // LisComponents BUILDER. - - pub fn alter(&mut self, op: LisOp<T>) -> &mut Self { - match op { - LisOp::Add(one) => self.0.push(one), - LisOp::AddAfterId(id, one) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index + 1, one), - _ => self.0.push(one), - } - } - LisOp::AddBeforeId(id, one) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index, one), - _ => self.0.insert(0, one), - } - } - LisOp::AddFirst(one) => self.0.insert(0, one), - LisOp::RemoveById(id) => { - if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - self.0.remove(index); - } - } - LisOp::ReplaceById(id, one) => { - for c in self.0.iter_mut() { - if c.id().as_deref() == Some(id) { - *c = one; - break; - } - } - } - LisOp::Reset => self.0.clear(), - } - self - } - - // LisComponents GETTERS. - - pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentOne<T>> { - self.0.iter().find(|&c| c.id().as_deref() == Some(id)) - } - - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ComponentOne<T>> { - self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) - } - - pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ComponentOne<T>> { - self.0.iter().filter(move |&c| c.handle() == handle) - } - - // LisComponents PREPARE. - - pub fn prepare(&self, cx: &mut Context) -> Markup { - let mut components = self.0.clone(); - components.sort_by_key(|c| c.weight()); - html! { - @for c in components.iter() { - " " (c.prepare(cx)) " " - } - } - } -} diff --git a/pagetop/src/core/component/mix.rs b/pagetop/src/core/component/mix.rs deleted file mode 100644 index fa9985a6..00000000 --- a/pagetop/src/core/component/mix.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::core::component::{ComponentArc, Context}; -use crate::html::{html, Markup}; -use crate::Handle; - -pub enum MixOp { - Add(ComponentArc), - AddAfterId(&'static str, ComponentArc), - AddBeforeId(&'static str, ComponentArc), - AddFirst(ComponentArc), - RemoveById(&'static str), - ReplaceById(&'static str, ComponentArc), - Reset, -} - -#[derive(Clone, Default)] -pub struct MixComponents(Vec<ComponentArc>); - -impl MixComponents { - pub fn new() -> Self { - MixComponents::default() - } - - pub fn with(arc: ComponentArc) -> Self { - let mut components = MixComponents::new(); - components.alter(MixOp::Add(arc)); - components - } - - pub(crate) fn merge(mixes: &[Option<&MixComponents>]) -> Self { - let mut components = MixComponents::default(); - for m in mixes.iter().flatten() { - components.0.append(&mut m.0.clone()); - } - components - } - - // MixComponents BUILDER. - - pub fn alter(&mut self, op: MixOp) -> &mut Self { - match op { - MixOp::Add(arc) => self.0.push(arc), - MixOp::AddAfterId(id, arc) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index + 1, arc), - _ => self.0.push(arc), - } - } - MixOp::AddBeforeId(id, arc) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index, arc), - _ => self.0.insert(0, arc), - } - } - MixOp::AddFirst(arc) => self.0.insert(0, arc), - MixOp::RemoveById(id) => { - if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - self.0.remove(index); - } - } - MixOp::ReplaceById(id, arc) => { - for c in self.0.iter_mut() { - if c.id().as_deref() == Some(id) { - *c = arc; - break; - } - } - } - MixOp::Reset => self.0.clear(), - } - self - } - - // MixComponents GETTERS. - - pub fn get_by_id(&self, id: &'static str) -> Option<&ComponentArc> { - self.0.iter().find(|&c| c.id().as_deref() == Some(id)) - } - - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ComponentArc> { - self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) - } - - pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ComponentArc> { - self.0.iter().filter(move |&c| c.handle() == handle) - } - - // MixComponents PREPARE. - - pub fn prepare(&self, cx: &mut Context) -> Markup { - let mut components = self.0.clone(); - components.sort_by_key(|c| c.weight()); - html! { - @for c in components.iter() { - " " (c.prepare(cx)) " " - } - } - } -} diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs deleted file mode 100644 index cc05bac4..00000000 --- a/pagetop/src/core/component/one.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::core::component::{ComponentTrait, Context}; -use crate::html::Markup; -use crate::{Handle, Weight}; - -use std::sync::{Arc, RwLock}; - -#[derive(Default)] -pub struct ComponentOne<T: ComponentTrait + Default>(Arc<RwLock<T>>); - -impl<T: ComponentTrait + Default> Clone for ComponentOne<T> { - fn clone(&self) -> Self { - Self(self.0.clone()) - } -} - -impl<T: ComponentTrait + Default> ComponentOne<T> { - pub fn new() -> Self { - ComponentOne::<T>::default() - } - - pub fn with(component: T) -> Self { - ComponentOne(Arc::new(RwLock::new(component))) - } - - pub fn set(&mut self, component: T) { - self.0 = Arc::new(RwLock::new(component)); - } - - pub(crate) fn handle(&self) -> Handle { - self.0.read().unwrap().handle() - } - - pub(crate) fn id(&self) -> Option<String> { - self.0.read().unwrap().id() - } - - pub(crate) fn weight(&self) -> Weight { - self.0.read().unwrap().weight() - } - - // ComponentOne PREPARE. - - pub fn prepare(&self, cx: &mut Context) -> Markup { - self.0.write().unwrap().prepare(cx) - } -} diff --git a/pagetop/src/core/component/typed.rs b/pagetop/src/core/component/typed.rs new file mode 100644 index 00000000..e31acab6 --- /dev/null +++ b/pagetop/src/core/component/typed.rs @@ -0,0 +1,133 @@ +use crate::core::component::{ComponentTrait, Context}; +use crate::html::{html, Markup}; +use crate::{Handle, Weight}; + +use std::sync::{Arc, RwLock}; + +#[derive(Default)] +pub struct TypedComponent<T: ComponentTrait + Default>(Arc<RwLock<T>>); + +impl<T: ComponentTrait + Default> Clone for TypedComponent<T> { + fn clone(&self) -> Self { + Self(self.0.clone()) + } +} + +impl<T: ComponentTrait + Default> TypedComponent<T> { + pub fn new() -> Self { + TypedComponent::<T>::default() + } + + pub fn with(component: T) -> Self { + TypedComponent(Arc::new(RwLock::new(component))) + } + + pub fn set(&mut self, component: T) { + self.0 = Arc::new(RwLock::new(component)); + } + + pub(crate) fn handle(&self) -> Handle { + self.0.read().unwrap().handle() + } + + pub(crate) fn id(&self) -> Option<String> { + self.0.read().unwrap().id() + } + + pub(crate) fn weight(&self) -> Weight { + self.0.read().unwrap().weight() + } + + // TypedComponent PREPARE. + + pub fn prepare(&self, cx: &mut Context) -> Markup { + self.0.write().unwrap().prepare(cx) + } +} + +pub enum TypedOp<T: ComponentTrait + Default> { + Add(TypedComponent<T>), + AddAfterId(&'static str, TypedComponent<T>), + AddBeforeId(&'static str, TypedComponent<T>), + AddFirst(TypedComponent<T>), + RemoveById(&'static str), + ReplaceById(&'static str, TypedComponent<T>), + Reset, +} + +#[derive(Clone, Default)] +pub struct TypedComponents<T: ComponentTrait + Default>(Vec<TypedComponent<T>>); + +impl<T: ComponentTrait + Default> TypedComponents<T> { + pub fn new() -> Self { + TypedComponents::<T>::default() + } + + pub fn with(one: TypedComponent<T>) -> Self { + let mut components = TypedComponents::new(); + components.alter(TypedOp::Add(one)); + components + } + + // TypedComponents BUILDER. + + pub fn alter(&mut self, op: TypedOp<T>) -> &mut Self { + match op { + TypedOp::Add(one) => self.0.push(one), + TypedOp::AddAfterId(id, one) => { + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index + 1, one), + _ => self.0.push(one), + } + } + TypedOp::AddBeforeId(id, one) => { + match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + Some(index) => self.0.insert(index, one), + _ => self.0.insert(0, one), + } + } + TypedOp::AddFirst(one) => self.0.insert(0, one), + TypedOp::RemoveById(id) => { + if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + self.0.remove(index); + } + } + TypedOp::ReplaceById(id, one) => { + for c in self.0.iter_mut() { + if c.id().as_deref() == Some(id) { + *c = one; + break; + } + } + } + TypedOp::Reset => self.0.clear(), + } + self + } + + // TypedComponents GETTERS. + + pub fn get_by_id(&self, id: &'static str) -> Option<&TypedComponent<T>> { + self.0.iter().find(|&c| c.id().as_deref() == Some(id)) + } + + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &TypedComponent<T>> { + self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) + } + + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &TypedComponent<T>> { + self.0.iter().filter(move |&c| c.handle() == handle) + } + + // TypedComponents PREPARE. + + pub fn prepare(&self, cx: &mut Context) -> Markup { + let mut components = self.0.clone(); + components.sort_by_key(|c| c.weight()); + html! { + @for c in components.iter() { + " " (c.prepare(cx)) " " + } + } + } +} diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 0e71fb00..301f5522 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ComponentArc, MixComponents, MixOp}; +use crate::core::component::{ArcComponent, ArcComponents, ArcOp}; use crate::core::theme::ThemeRef; use crate::{Handle, LazyStatic}; @@ -12,33 +12,33 @@ static COMMON_REGIONS: LazyStatic<RwLock<ComponentsRegions>> = LazyStatic::new(|| RwLock::new(ComponentsRegions::new())); #[derive(Default)] -pub struct ComponentsRegions(HashMap<&'static str, MixComponents>); +pub struct ComponentsRegions(HashMap<&'static str, ArcComponents>); impl ComponentsRegions { pub fn new() -> Self { ComponentsRegions::default() } - pub fn with(region: &'static str, arc: ComponentArc) -> Self { + pub fn with(region: &'static str, arc: ArcComponent) -> Self { let mut regions = ComponentsRegions::new(); regions.add_in(region, arc); regions } - pub fn add_in(&mut self, region: &'static str, arc: ComponentArc) { + pub fn add_in(&mut self, region: &'static str, arc: ArcComponent) { if let Some(region) = self.0.get_mut(region) { - region.alter(MixOp::Add(arc)); + region.alter(ArcOp::Add(arc)); } else { - self.0.insert(region, MixComponents::with(arc)); + self.0.insert(region, ArcComponents::with(arc)); } } - pub fn get_components(&self, theme: ThemeRef, region: &str) -> MixComponents { + pub fn get_components(&self, theme: ThemeRef, region: &str) -> ArcComponents { let common = COMMON_REGIONS.read().unwrap(); if let Some(hm) = THEME_REGIONS.read().unwrap().get(&theme.handle()) { - MixComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) + ArcComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) } else { - MixComponents::merge(&[common.0.get(region), self.0.get(region)]) + ArcComponents::merge(&[common.0.get(region), self.0.get(region)]) } } } @@ -48,7 +48,7 @@ pub enum Region { OfTheme(ThemeRef, &'static str), } -pub fn add_component_in(region: Region, arc: ComponentArc) { +pub fn add_component_in(region: Region, arc: ArcComponent) { match region { Region::Named(name) => { COMMON_REGIONS.write().unwrap().add_in(name, arc); diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index cb1355bc..59977503 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -2,7 +2,7 @@ mod action; pub use action::*; use crate::core::component::l10n::L10n; -use crate::core::component::{ComponentArc, ComponentOne, ComponentTrait, Context, ContextOp}; +use crate::core::component::{ArcComponent, ComponentTrait, Context, ContextOp, TypedComponent}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::fatal_error::FatalError; @@ -12,8 +12,8 @@ use unic_langid::CharacterDirection; pub use actix_web::Result as ResultPage; -type PageTitle = ComponentOne<L10n>; -type PageDescription = ComponentOne<L10n>; +type PageTitle = TypedComponent<L10n>; +type PageDescription = TypedComponent<L10n>; #[rustfmt::skip] pub struct Page { @@ -90,7 +90,7 @@ impl Page { #[fn_builder] pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_in(region, ComponentArc::with(component)); + self.regions.add_in(region, ArcComponent::with(component)); self } From c9f71685b4fd3e7cbf889d1341c7fedf46082c22 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Aug 2023 12:29:15 +0200 Subject: [PATCH 513/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Relocate=20macro?= =?UTF-8?q?=20codes=20based=20on=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-megamenu/src/lib.rs | 2 +- pagetop-minimal/src/lib.rs | 2 +- pagetop/src/config.rs | 29 +++++++- pagetop/src/core/action.rs | 7 ++ pagetop/src/core/action/list.rs | 7 -- pagetop/src/core/theme/default.rs | 4 +- pagetop/src/lib.rs | 12 ++-- pagetop/src/locale.rs | 50 ++++++++++++++ pagetop/src/prelude.rs | 25 +++++-- pagetop/src/service.rs | 44 ++++++++++++ pagetop/src/util.rs | 108 +----------------------------- 16 files changed, 163 insertions(+), 137 deletions(-) diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 6b056f7b..cea82bd7 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -16,7 +16,7 @@ impl ModuleTrait for Aliner { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/aliner", aliner); + static_files_service!(scfg, "/aliner", aliner); } } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index f9f6dd6e..0db93999 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -23,7 +23,7 @@ impl ModuleTrait for Bootsier { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/bootsier", bootsier); + static_files_service!(scfg, "/bootsier", bootsier); } } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 7bc372c3..3620794e 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -26,7 +26,7 @@ impl ModuleTrait for Bulmix { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/bulmix", bulmix); + static_files_service!(scfg, "/bulmix", bulmix); } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index d37c575e..9dc8fe2a 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for HomeDemo { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/homedemo", homedemo); + static_files_service!(scfg, "/homedemo", homedemo); scfg.route("/", service::web::get().to(demo)); } } diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 0a4c81b4..1f632c07 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -33,7 +33,7 @@ impl ModuleTrait for JQuery { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/jquery", jquery); + static_files_service!(scfg, "/jquery", jquery); } } diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs index 356e27ab..e4a95381 100644 --- a/pagetop-megamenu/src/lib.rs +++ b/pagetop-megamenu/src/lib.rs @@ -33,6 +33,6 @@ impl ModuleTrait for MegaMenu { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/megamenu", megamenu); + static_files_service!(scfg, "/megamenu", megamenu); } } diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index dd029f20..8c9bb097 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -34,7 +34,7 @@ impl ModuleTrait for Minimal { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/minimal", minimal); + static_files_service!(scfg, "/minimal", minimal); } } diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 376dcd06..fa2b9afd 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -119,11 +119,9 @@ mod path; mod source; mod value; -use crate::default_settings; -use crate::LazyStatic; - use crate::config::data::ConfigData; use crate::config::file::File; +use crate::LazyStatic; use serde::Deserialize; @@ -159,6 +157,31 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { settings }); +#[macro_export] +/// Define un conjunto de ajustes de configuración usando tipos seguros y valores predefinidos. +/// +/// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. +/// +/// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). +macro_rules! default_settings { + ( $($key:literal => $value:literal),* $(,)? ) => { + #[doc = concat!( + "Assigned or predefined values for configuration settings associated to the ", + "[`Settings`] type." + )] + pub static SETTINGS: $crate::LazyStatic<Settings> = $crate::LazyStatic::new(|| { + let mut settings = $crate::config::CONFIG.clone(); + $( + settings.set_default($key, $value).unwrap(); + )* + match settings.try_into() { + Ok(s) => s, + Err(e) => panic!("Error parsing settings: {}", e), + } + }); + }; +} + #[derive(Debug, Deserialize)] /// Configuration settings for the [`[app]`](App), [`[database]`](Database), [`[dev]`](Dev), /// [`[log]`](Log), and [`[server]`](Server) sections (see [`SETTINGS`]). diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index c257973a..e497114a 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -8,3 +8,10 @@ use list::ActionsList; mod all; pub(crate) use all::add_action; pub use all::run_actions; + +#[macro_export] +macro_rules! action { + ( $action:ty => $f:ident $(, $weight:expr)? ) => {{ + Box::new(<$action>::new().with_action($f)$(.with_weight($weight))?) + }}; +} diff --git a/pagetop/src/core/action/list.rs b/pagetop/src/core/action/list.rs index 3449e103..a7eba882 100644 --- a/pagetop/src/core/action/list.rs +++ b/pagetop/src/core/action/list.rs @@ -4,13 +4,6 @@ use std::sync::{Arc, RwLock}; pub type Action = Box<dyn ActionTrait>; -#[macro_export] -macro_rules! action { - ( $action:ty => $f:ident $(, $weight:expr)? ) => {{ - Box::new(<$action>::new().with_action($f)$(.with_weight($weight))?) - }}; -} - pub struct ActionsList(Arc<RwLock<Vec<Action>>>); impl ActionsList { diff --git a/pagetop/src/core/theme/default.rs b/pagetop/src/core/theme/default.rs index 71f696d7..50ce1ca1 100644 --- a/pagetop/src/core/theme/default.rs +++ b/pagetop/src/core/theme/default.rs @@ -4,7 +4,7 @@ use crate::core::theme::{ThemeRef, ThemeTrait}; use crate::html::{Favicon, StyleSheet}; use crate::response::page::Page; use crate::service; -use crate::{new_handle, serve_static_files, static_files, Handle}; +use crate::{new_handle, static_files, static_files_service, Handle}; new_handle!(THEME_DEFAULT); @@ -26,7 +26,7 @@ impl ModuleTrait for DefaultTheme { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - serve_static_files!(scfg, "/theme", theme); + static_files_service!(scfg, "/theme", theme); } } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index f6aec646..f0031fcf 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -129,6 +129,9 @@ static_locales!(LOCALES_PAGETOP); // PUBLIC API. // ************************************************************************************************* +// Functions and macro helpers. +pub mod util; + // Gestión de la configuración. pub mod config; // Registro de trazas y eventos de la aplicación. @@ -145,18 +148,15 @@ pub mod datetime; #[cfg(feature = "database")] pub mod db; -// APIs esenciales para crear acciones, componentes, módulos y temas. -pub mod core; - // API para operar con los servicios web. pub mod service; +// APIs esenciales para crear acciones, componentes, módulos y temas. +pub mod core; + // Tipos de respuestas a peticiones web. pub mod response; -// Funciones y macros útiles. -pub mod util; - // Prepara y ejecuta la aplicación. pub mod app; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 1490e11e..0ff18865 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -132,3 +132,53 @@ pub fn langid_for(language: &str) -> &LanguageIdentifier { } } } + +#[macro_export] +/// Define un conjunto de elementos de localización y textos locales de traducción. +macro_rules! static_locales { + ( $LOCALES:ident $(, $core_locales:literal)? ) => { + $crate::locale::fluent_templates::static_loader! { + static $LOCALES = { + locales: "src/locale", + $( core_locales: $core_locales, )? + fallback_language: "en-US", + + // Elimina las marcas Unicode que delimitan los argumentos. + customise: |bundle| bundle.set_use_isolating(false), + }; + } + }; + ( $LOCALES:ident in $dir_locales:literal $(, $core_locales:literal)? ) => { + $crate::locale::fluent_templates::static_loader! { + static $LOCALES = { + locales: $dir_locales, + $( core_locales: $core_locales, )? + fallback_language: "en-US", + + // Elimina las marcas Unicode que delimitan los argumentos. + customise: |bundle| bundle.set_use_isolating(false), + }; + } + }; +} + +#[macro_export] +macro_rules! t { + ( $langid:expr, $locales:expr, $key:expr ) => { + $locales.lookup($langid, $key).unwrap_or($key.to_string()) + }; + ( $langid:expr, $locales:expr, $key:expr, $args:expr ) => { + $locales + .lookup_with_args( + $langid, + $key, + &$args + .iter() + .fold(std::collections::HashMap::new(), |mut a, (k, v)| { + a.insert(k.to_string(), v.to_owned().into()); + a + }), + ) + .unwrap_or($key.to_string()) + }; +} diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 4509536c..8ca95ff9 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -6,11 +6,22 @@ pub use crate::{concat_string, fn_builder, main, paste, test}; // Global. pub use crate::{Handle, HashMapResources, LazyStatic, ResultExt, Weight}; -// Funciones y macros útiles. +// Functions and macro helpers. pub use crate::util; -pub use crate::{action, actions_for_component}; -pub use crate::{default_settings, kv, new_handle}; -pub use crate::{serve_static_files, static_files, static_locales}; +pub use crate::{kv, new_handle}; + +// MACROS. + +// crate::config +pub use crate::default_settings; +// crate::locale +pub use crate::{static_locales, t}; +// crate::service +pub use crate::{static_files, static_files_service}; +// crate::core::action +pub use crate::action; +// crate::core::component +pub use crate::actions_for_component; // API. @@ -27,6 +38,9 @@ pub use crate::datetime::*; #[cfg(feature = "database")] pub use crate::{db, db::*, migration_item, pub_migration}; +pub use crate::service; +pub use crate::service::HttpMessage; + pub use crate::core::action::*; pub use crate::core::component::html::*; pub use crate::core::component::l10n::*; @@ -34,9 +48,6 @@ pub use crate::core::component::*; pub use crate::core::module::*; pub use crate::core::theme::*; -pub use crate::service; -pub use crate::service::HttpMessage; - pub use crate::response::fatal_error::*; pub use crate::response::{page::*, redirect::*, ResponseError}; diff --git a/pagetop/src/service.rs b/pagetop/src/service.rs index 3b12c807..f6a09c29 100644 --- a/pagetop/src/service.rs +++ b/pagetop/src/service.rs @@ -7,3 +7,47 @@ pub use actix_web::{ pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; + +#[macro_export] +macro_rules! static_files { + ( $bundle:ident ) => { + $crate::paste! { + mod [<static_files_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + } + }; + ( $bundle:ident => $STATIC:ident ) => { + $crate::paste! { + mod [<static_files_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new([ + <static_files_ $bundle>]::$bundle + ); + } + }; +} + +#[macro_export] +macro_rules! static_files_service { + ( $scfg:ident, $path:expr, $bundle:ident ) => {{ + $crate::paste! { + let static_files = &$crate::config::SETTINGS.dev.static_files; + if static_files.is_empty() { + $scfg.service($crate::service::ResourceFiles::new( + $path, + [<static_files_ $bundle>]::$bundle(), + )); + } else { + $scfg.service( + $crate::service::ActixFiles::new( + $path, + $crate::concat_string!(static_files, $path), + ) + .show_files_listing(), + ); + } + } + }}; +} diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index b757d1d1..f8e430d5 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,9 +1,9 @@ -//! Funciones útiles. +//! Functions and macro helpers. use crate::Handle; // ************************************************************************************************* -// FUNCIONES ÚTILES. +// FUNCTIONS HELPERS. // ************************************************************************************************* // https://stackoverflow.com/a/71464396 @@ -57,7 +57,7 @@ pub fn single_type_name<T: ?Sized>() -> &'static str { } // ************************************************************************************************* -// MACROS DECLARATIVAS. +// MACRO HELPERS. // ************************************************************************************************* #[macro_export] @@ -80,31 +80,6 @@ macro_rules! kv { }}; } -#[macro_export] -/// Define un conjunto de ajustes de configuración usando tipos seguros y valores predefinidos. -/// -/// Detiene la aplicación con un panic! si no pueden asignarse los ajustes de configuración. -/// -/// Ver [`Cómo añadir ajustes de configuración`](config/index.html#cómo-añadir-ajustes-de-configuración). -macro_rules! default_settings { - ( $($key:literal => $value:literal),* $(,)? ) => { - #[doc = concat!( - "Assigned or predefined values for configuration settings associated to the ", - "[`Settings`] type." - )] - pub static SETTINGS: $crate::LazyStatic<Settings> = $crate::LazyStatic::new(|| { - let mut settings = $crate::config::CONFIG.clone(); - $( - settings.set_default($key, $value).unwrap(); - )* - match settings.try_into() { - Ok(s) => s, - Err(e) => panic!("Error parsing settings: {}", e), - } - }); - }; -} - #[macro_export] macro_rules! new_handle { ( $HANDLE:ident ) => { @@ -118,80 +93,3 @@ macro_rules! new_handle { $crate::util::handle(module_path!(), file!(), line!(), column!()); }; } - -#[macro_export] -/// Define un conjunto de elementos de localización y funciones locales de traducción. -macro_rules! static_locales { - ( $LOCALES:ident $(, $core_locales:literal)? ) => { - use $crate::locale::*; - - fluent_templates::static_loader! { - static $LOCALES = { - locales: "src/locale", - $( core_locales: $core_locales, )? - fallback_language: "en-US", - - // Elimina las marcas Unicode que delimitan los argumentos. - customise: |bundle| bundle.set_use_isolating(false), - }; - } - }; - ( $LOCALES:ident in $dir_locales:literal $(, $core_locales:literal)? ) => { - use $crate::locale::*; - - fluent_templates::static_loader! { - static $LOCALES = { - locales: $dir_locales, - $( core_locales: $core_locales, )? - fallback_language: "en-US", - - // Elimina las marcas Unicode que delimitan los argumentos. - customise: |bundle| bundle.set_use_isolating(false), - }; - } - }; -} - -#[macro_export] -macro_rules! static_files { - ( $bundle:ident ) => { - $crate::paste! { - mod [<static_files_ $bundle>] { - include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); - } - } - }; - ( $bundle:ident => $STATIC:ident ) => { - $crate::paste! { - mod [<static_files_ $bundle>] { - include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); - } - static $STATIC: LazyStatic<HashMapResources> = LazyStatic::new([ - <static_files_ $bundle>]::$bundle - ); - } - }; -} - -#[macro_export] -macro_rules! serve_static_files { - ( $scfg:ident, $path:expr, $bundle:ident ) => {{ - $crate::paste! { - let static_files = &$crate::config::SETTINGS.dev.static_files; - if static_files.is_empty() { - $scfg.service($crate::service::ResourceFiles::new( - $path, - [<static_files_ $bundle>]::$bundle(), - )); - } else { - $scfg.service( - $crate::service::ActixFiles::new( - $path, - $crate::concat_string!(static_files, $path), - ) - .show_files_listing(), - ); - } - } - }}; -} From 3c5da6936e535fa9702932687b92f291a4ab4890 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Aug 2023 12:59:40 +0200 Subject: [PATCH 514/853] =?UTF-8?q?=F0=9F=94=A5=20Use=20L10n=20component?= =?UTF-8?q?=20for=20translating=20texts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/locale.rs | 21 --------------------- pagetop/src/prelude.rs | 2 +- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 0ff18865..53071011 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -161,24 +161,3 @@ macro_rules! static_locales { } }; } - -#[macro_export] -macro_rules! t { - ( $langid:expr, $locales:expr, $key:expr ) => { - $locales.lookup($langid, $key).unwrap_or($key.to_string()) - }; - ( $langid:expr, $locales:expr, $key:expr, $args:expr ) => { - $locales - .lookup_with_args( - $langid, - $key, - &$args - .iter() - .fold(std::collections::HashMap::new(), |mut a, (k, v)| { - a.insert(k.to_string(), v.to_owned().into()); - a - }), - ) - .unwrap_or($key.to_string()) - }; -} diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 8ca95ff9..e86b436a 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -15,7 +15,7 @@ pub use crate::{kv, new_handle}; // crate::config pub use crate::default_settings; // crate::locale -pub use crate::{static_locales, t}; +pub use crate::static_locales; // crate::service pub use crate::{static_files, static_files_service}; // crate::core::action From 9122508f0f43ea7b269cc6b131fb915f16d78cab Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Aug 2023 23:24:03 +0200 Subject: [PATCH 515/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Compacts=20the=20c?= =?UTF-8?q?omponent=20core=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component.rs | 7 +++++-- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme/default.rs | 2 +- pagetop/src/core/theme/definition.rs | 3 +-- pagetop/src/html.rs | 10 ++++++++++ pagetop/src/lib.rs | 8 ++++---- pagetop/src/prelude.rs | 6 ++---- pagetop/src/response/fatal_error.rs | 2 +- pagetop/src/response/page.rs | 4 ++-- 9 files changed, 27 insertions(+), 17 deletions(-) diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 166459fc..671a41d9 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -14,8 +14,11 @@ pub use arc::{ArcComponent, ArcComponents, ArcOp}; mod typed; pub use typed::{TypedComponent, TypedComponents, TypedOp}; -pub mod html; -pub mod l10n; +mod html; +pub use html::{Html, COMPONENT_HTML}; + +mod l10n; +pub use l10n::{L10n, COMPONENT_L10N}; #[macro_export] macro_rules! actions_for_component { diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 76c0a5b5..17f76af6 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,5 @@ use crate::core::action::Action; -use crate::core::component::l10n::L10n; +use crate::core::component::L10n; use crate::core::theme::ThemeRef; use crate::{service, util, Handle}; diff --git a/pagetop/src/core/theme/default.rs b/pagetop/src/core/theme/default.rs index 50ce1ca1..deea8dad 100644 --- a/pagetop/src/core/theme/default.rs +++ b/pagetop/src/core/theme/default.rs @@ -1,4 +1,4 @@ -use crate::core::component::{l10n::L10n, ContextOp}; +use crate::core::component::{ContextOp, L10n}; use crate::core::module::ModuleTrait; use crate::core::theme::{ThemeRef, ThemeTrait}; use crate::html::{Favicon, StyleSheet}; diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index fd4b53a1..3650f00e 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,5 +1,4 @@ -use crate::core::component::l10n::L10n; -use crate::core::component::{ComponentTrait, Context}; +use crate::core::component::{ComponentTrait, Context, L10n}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index a67d8274..18e16fea 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -48,3 +48,13 @@ impl PrepareMarkup { } } } + +impl ToString for PrepareMarkup { + fn to_string(&self) -> String { + match self { + PrepareMarkup::None => "".to_owned(), + PrepareMarkup::Text(text) => text.to_string(), + PrepareMarkup::With(markup) => markup.to_owned().into_string(), + } + } +} diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index f0031fcf..5d3b9509 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -18,10 +18,10 @@ //! //! * Registro de trazas y eventos de la aplicación ([`trace`]). //! -//! * Localización ([`locale`]). -//! //! * HTML en código ([`html`]). //! +//! * Localización ([`locale`]). +//! //! * [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date and time handling ([`datetime`]). //! //! * Acceso unificado y normalizado a base de datos ([`db`]). @@ -136,10 +136,10 @@ pub mod util; pub mod config; // Registro de trazas y eventos de la aplicación. pub mod trace; -// Localización. -pub mod locale; // HTML en código. pub mod html; +// Localización. +pub mod locale; // Date and time for PageTop. pub mod datetime; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index e86b436a..3cb64adf 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -29,10 +29,10 @@ pub use crate::config; pub use crate::trace; -pub use crate::locale::*; - pub use crate::html::*; +pub use crate::locale::*; + pub use crate::datetime::*; #[cfg(feature = "database")] @@ -42,8 +42,6 @@ pub use crate::service; pub use crate::service::HttpMessage; pub use crate::core::action::*; -pub use crate::core::component::html::*; -pub use crate::core::component::l10n::*; pub use crate::core::component::*; pub use crate::core::module::*; pub use crate::core::theme::*; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 60df2239..5725e601 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::core::component::l10n::L10n; +use crate::core::component::L10n; use crate::response::{page::Page, ResponseError}; use crate::service::http::{header::ContentType, StatusCode}; use crate::service::{HttpRequest, HttpResponse}; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 59977503..3fdfa820 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,8 +1,8 @@ mod action; pub use action::*; -use crate::core::component::l10n::L10n; -use crate::core::component::{ArcComponent, ComponentTrait, Context, ContextOp, TypedComponent}; +use crate::core::component::{ArcComponent, ComponentTrait, TypedComponent}; +use crate::core::component::{Context, ContextOp, L10n}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::fatal_error::FatalError; From b7b334a57868e6c9339f5c406ef30a9efd949661 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 21 Aug 2023 23:57:43 +0200 Subject: [PATCH 516/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.45?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index fc1802d1..5e7d317a 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.44" +version = "0.0.45" edition = "2021" authors = [ @@ -32,24 +32,24 @@ postgres = ["database", "sea-orm/sqlx-postgres"] sqlite = ["database", "sea-orm/sqlx-sqlite"] [dependencies] -async-trait = "0.1.68" +async-trait = "0.1.73" chrono = "0.4.26" concat-string = "1.0.1" figlet-rs = "0.1.5" -itoa = "1.0.6" +itoa = "1.0.9" nom = "7.1.3" -once_cell = "1.17.2" -paste = "1.0.12" +once_cell = "1.18.0" +paste = "1.0.14" substring = "1.4.5" term_size = "0.3.2" -toml = "0.7.4" -url = "2.3.1" +toml = "0.7.6" +url = "2.4.0" tracing = "0.1.37" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.17", features = ["json", "env-filter"] } tracing-unwrap = { version = "0.10.0", default-features = false } -tracing-actix-web = "0.7.5" +tracing-actix-web = "0.7.6" fluent-templates = "0.8.0" unic-langid = { version = "0.9.1", features = ["macros"] } From 9d0e941b78b66fdfebaa56de2af7760ac89308b6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 21 Aug 2023 23:59:01 +0200 Subject: [PATCH 517/853] =?UTF-8?q?=F0=9F=94=96=20[minimal]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml index 0e6e8bc5..2cdc8cd9 100644 --- a/pagetop-minimal/Cargo.toml +++ b/pagetop-minimal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-minimal" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From c08b36978948ddf049fa00122f3d00c8ace10005 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 21 Aug 2023 23:59:46 +0200 Subject: [PATCH 518/853] =?UTF-8?q?=F0=9F=94=96=20[jquery]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-jquery/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml index 086a19a4..efc59123 100644 --- a/pagetop-jquery/Cargo.toml +++ b/pagetop-jquery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-jquery" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 964dd3bc7c07cb60af95bf827d8ab20f54b0bb3a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 22 Aug 2023 00:00:29 +0200 Subject: [PATCH 519/853] =?UTF-8?q?=F0=9F=94=96=20[megamenu]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml index d18fd6c7..3af0ec32 100644 --- a/pagetop-megamenu/Cargo.toml +++ b/pagetop-megamenu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-megamenu" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From 38b59e8b1b1b038a1d91065e71262ee0d2a2bef9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 22 Aug 2023 00:01:18 +0200 Subject: [PATCH 520/853] =?UTF-8?q?=F0=9F=94=96=20[aliner]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index 8ed64a34..eba83fbc 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-aliner" -version = "0.0.7" +version = "0.0.8" edition = "2021" authors = [ From 06723160d4039149916b9709a4355f20104480f3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 22 Aug 2023 00:02:02 +0200 Subject: [PATCH 521/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index f291929b..0fe95438 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From ca70b412456733d57d0a1e26d701ba37f3aa6c2f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 22 Aug 2023 00:02:39 +0200 Subject: [PATCH 522/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index cc4a3d37..ae7ee415 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From b9340115169195dca49c658877a597ad166250a7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 22 Aug 2023 00:03:12 +0200 Subject: [PATCH 523/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 3248d4bf..4db99f37 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From 507015d5c92393c6577c6f1229f4975a1963fced Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Sep 2023 08:38:54 +0200 Subject: [PATCH 524/853] =?UTF-8?q?=F0=9F=92=A5=20Replace=20migration=5Fit?= =?UTF-8?q?em!=20macro=20with=20migrations!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/src/lib.rs | 10 +++++----- pagetop-user/src/lib.rs | 10 +++++----- pagetop/src/core/module/definition.rs | 4 ++-- pagetop/src/db.rs | 13 ++++++++++--- pagetop/src/prelude.rs | 2 +- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index ec21ab8c..a07d444a 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -31,11 +31,11 @@ impl ModuleTrait for Node { } fn migrations(&self) -> Vec<MigrationItem> { - vec![ - migration_item!(m20220316_000001_create_table_node_type), - migration_item!(m20220316_000002_create_table_node), - migration_item!(m20220316_000003_create_table_node_access), - migration_item!(m20220316_000004_create_table_node_revision), + migrations![ + m20220316_000001_create_table_node_type, + m20220316_000002_create_table_node, + m20220316_000003_create_table_node_access, + m20220316_000004_create_table_node_revision, ] } } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index b497063a..939b0b25 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -31,11 +31,11 @@ impl ModuleTrait for User { } fn migrations(&self) -> Vec<MigrationItem> { - vec![ - migration_item!(m20220312_000001_create_table_role), - migration_item!(m20220312_000002_create_table_role_permission), - migration_item!(m20220312_000003_create_table_user), - migration_item!(m20220312_000004_create_table_user_role), + migrations![ + m20220312_000001_create_table_role, + m20220312_000002_create_table_role_permission, + m20220312_000003_create_table_user, + m20220312_000004_create_table_user_role, ] } } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 17f76af6..9dcfae12 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -4,7 +4,7 @@ use crate::core::theme::ThemeRef; use crate::{service, util, Handle}; #[cfg(feature = "database")] -use crate::db::MigrationItem; +use crate::{db::MigrationItem, migrations}; pub type ModuleRef = &'static dyn ModuleTrait; @@ -45,7 +45,7 @@ pub trait ModuleTrait: ModuleBase + Send + Sync { #[cfg(feature = "database")] #[allow(unused_variables)] fn migrations(&self) -> Vec<MigrationItem> { - vec![] + migrations![] } #[allow(unused_variables)] diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 701cb4fc..1e5d7fcf 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -133,8 +133,15 @@ macro_rules! pub_migration { } #[macro_export] -macro_rules! migration_item { - ( $migration_module:ident ) => {{ - Box::new(migration::$migration_module::Migration) +macro_rules! migrations { + () => { + Vec::<MigrationItem>::new() + }; + ( $($migration_module:ident),+ $(,)? ) => {{ + let mut m = Vec::<MigrationItem>::new(); + $( + m.push(Box::new(migration::$migration_module::Migration)); + )* + m }}; } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 3cb64adf..ce889099 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -36,7 +36,7 @@ pub use crate::locale::*; pub use crate::datetime::*; #[cfg(feature = "database")] -pub use crate::{db, db::*, migration_item, pub_migration}; +pub use crate::{db, db::*, migrations, pub_migration}; pub use crate::service; pub use crate::service::HttpMessage; From c50cfa985ff20edb3c2e92854a748d41fe290594 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Sep 2023 09:00:00 +0200 Subject: [PATCH 525/853] =?UTF-8?q?=F0=9F=92=A5=20Replace=20action!=20macr?= =?UTF-8?q?o=20with=20actions!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-minimal/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop/src/core/action.rs | 7 ------- pagetop/src/core/action/list.rs | 14 ++++++++++++++ pagetop/src/core/module/definition.rs | 4 ++-- pagetop/src/prelude.rs | 4 ++-- 8 files changed, 22 insertions(+), 15 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index da8946b3..f2651b82 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforePrepareBody => before_prepare_body)] + actions![ActionBeforePrepareBody::with(before_prepare_body)] } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index 1f632c07..ee531e7b 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -29,7 +29,7 @@ impl ModuleTrait for JQuery { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionAfterPrepareBody => after_prepare_body)] + actions![ActionAfterPrepareBody::with(after_prepare_body)] } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 8c9bb097..8384ee11 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for Minimal { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionAfterPrepareBody => after_prepare_body, 99)] + actions![ActionAfterPrepareBody::with(after_prepare_body).with_weight(99)] } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index a07d444a..96d1c813 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - vec![action!(ActionBeforePrepareBody => before_prepare_body, -1)] + actions![ActionBeforePrepareBody::with(before_prepare_body).with_weight(-1)] } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index e497114a..c257973a 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -8,10 +8,3 @@ use list::ActionsList; mod all; pub(crate) use all::add_action; pub use all::run_actions; - -#[macro_export] -macro_rules! action { - ( $action:ty => $f:ident $(, $weight:expr)? ) => {{ - Box::new(<$action>::new().with_action($f)$(.with_weight($weight))?) - }}; -} diff --git a/pagetop/src/core/action/list.rs b/pagetop/src/core/action/list.rs index a7eba882..539e5b0a 100644 --- a/pagetop/src/core/action/list.rs +++ b/pagetop/src/core/action/list.rs @@ -31,3 +31,17 @@ impl ActionsList { let _: Vec<_> = self.0.read().unwrap().iter().map(f).collect(); } } + +#[macro_export] +macro_rules! actions { + () => { + Vec::<Action>::new() + }; + ( $($action:expr),+ $(,)? ) => {{ + let mut v = Vec::<Action>::new(); + $( + v.push(Box::new($action)); + )* + v + }}; +} diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 9dcfae12..ade9e045 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,7 +1,7 @@ use crate::core::action::Action; use crate::core::component::L10n; use crate::core::theme::ThemeRef; -use crate::{service, util, Handle}; +use crate::{actions, service, util, Handle}; #[cfg(feature = "database")] use crate::{db::MigrationItem, migrations}; @@ -37,7 +37,7 @@ pub trait ModuleTrait: ModuleBase + Send + Sync { } fn actions(&self) -> Vec<Action> { - vec![] + actions![] } fn init(&self) {} diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index ce889099..ec44d267 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -18,8 +18,8 @@ pub use crate::default_settings; pub use crate::static_locales; // crate::service pub use crate::{static_files, static_files_service}; -// crate::core::action -pub use crate::action; +// crate::core::actions +pub use crate::actions; // crate::core::component pub use crate::actions_for_component; From 0989b35925b00d48e90412973d303f7c30dcd36a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Sep 2023 09:16:44 +0200 Subject: [PATCH 526/853] =?UTF-8?q?=F0=9F=92=A5=20Create=20actions=20using?= =?UTF-8?q?=20with()=20as=20constructor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component.rs | 16 ++++++++++------ .../response/page/action/after_prepare_body.rs | 8 +++++--- .../response/page/action/before_prepare_body.rs | 8 +++++--- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 671a41d9..038de2e5 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -58,9 +58,11 @@ macro_rules! actions_for_component { impl [<BeforePrepare $Component>] { #[allow(dead_code)] - pub fn with_action(mut self, action: [<FnAction $Component>]) -> Self { - self.action = Some(action); - self + pub fn with(action: [<FnAction $Component>]) -> Self { + [<BeforePrepare $Component>] { + action: Some(action), + weight: 0, + } } #[allow(dead_code)] @@ -117,9 +119,11 @@ macro_rules! actions_for_component { impl [<AfterPrepare $Component>] { #[allow(dead_code)] - pub fn with_action(mut self, action: [<FnAction $Component>]) -> Self { - self.action = Some(action); - self + pub fn with(action: [<FnAction $Component>]) -> Self { + [<AfterPrepare $Component>] { + action: Some(action), + weight: 0, + } } #[allow(dead_code)] diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/response/page/action/after_prepare_body.rs index c93711ba..7b1ef2dd 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/response/page/action/after_prepare_body.rs @@ -28,9 +28,11 @@ impl ActionTrait for ActionAfterPrepareBody { } impl ActionAfterPrepareBody { - pub fn with_action(mut self, action: FnActionPage) -> Self { - self.action = Some(action); - self + pub fn with(action: FnActionPage) -> Self { + ActionAfterPrepareBody { + action: Some(action), + weight: 0, + } } pub fn with_weight(mut self, value: Weight) -> Self { diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/response/page/action/before_prepare_body.rs index 78e5ebe6..3aa7cefe 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/response/page/action/before_prepare_body.rs @@ -28,9 +28,11 @@ impl ActionTrait for ActionBeforePrepareBody { } impl ActionBeforePrepareBody { - pub fn with_action(mut self, action: FnActionPage) -> Self { - self.action = Some(action); - self + pub fn with(action: FnActionPage) -> Self { + ActionBeforePrepareBody { + action: Some(action), + weight: 0, + } } pub fn with_weight(mut self, value: Weight) -> Self { From cb18e9a5c688c67f2082f2140b39b18018cb729c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Sep 2023 07:40:51 +0200 Subject: [PATCH 527/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-minimal/src/component/form_element/date.rs | 2 +- pagetop-minimal/src/component/form_element/hidden.rs | 2 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop-minimal/src/component/icon.rs | 2 +- pagetop-minimal/src/component/image.rs | 2 +- pagetop-minimal/src/component/paragraph.rs | 2 +- pagetop/src/core/component/html.rs | 2 +- pagetop/src/core/component/renderable.rs | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 2a508d34..9b4748fd 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -40,7 +40,7 @@ impl ComponentTrait for Date { (self.renderable.check)(cx) } - fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { let id = self.name().get().map(|name| concat_string!("edit-", name)); PrepareMarkup::With(html! { div class=[self.classes().get()] { diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs index cd767df9..c42a98f9 100644 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ b/pagetop-minimal/src/component/form_element/hidden.rs @@ -23,7 +23,7 @@ impl ComponentTrait for Hidden { self.weight } - fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { let id = self.name().get().map(|name| concat_string!("value-", name)); PrepareMarkup::With(html! { input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()] {} diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 0cb6e66d..f9f96152 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -156,7 +156,7 @@ impl Heading { self.display = display; self.classes.alter_value( ClassesOp::SetDefault, - match &self.display() { + match self.display { HeadingDisplay::XxLarge => "display-2", HeadingDisplay::Large => "display-3", HeadingDisplay::Medium => "display-4", diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index d3742520..7e6ab9b2 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -34,7 +34,7 @@ impl ComponentTrait for Icon { )); } - fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) } } diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index cbfb8435..77ab1c6a 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -43,7 +43,7 @@ impl ComponentTrait for Image { (self.renderable.check)(cx) } - fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { let (width, height) = match self.size() { ImageSize::Auto => (None, None), ImageSize::Size(width, height) => (Some(width), Some(height)), diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 00a2944e..6e3031ca 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -106,7 +106,7 @@ impl Paragraph { self.display = display; self.classes.alter_value( ClassesOp::SetDefault, - match &self.display() { + match self.display { ParagraphDisplay::XxLarge => "fs-2", ParagraphDisplay::Large => "fs-3", ParagraphDisplay::Medium => "fs-4", diff --git a/pagetop/src/core/component/html.rs b/pagetop/src/core/component/html.rs index 2b8a7241..1c926f5c 100644 --- a/pagetop/src/core/component/html.rs +++ b/pagetop/src/core/component/html.rs @@ -16,7 +16,7 @@ impl ComponentTrait for Html { COMPONENT_HTML } - fn prepare_component(&self, _: &mut Context) -> PrepareMarkup { + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { (self.html()) }) } } diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index 3c105918..27d630eb 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -14,6 +14,6 @@ impl Default for Renderable { } } -fn render_always(_: &Context) -> bool { +fn render_always(_cx: &Context) -> bool { true } From 64ec767a5f58e4adb5c5934885a1a0fcdc07d356 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Sep 2023 07:52:50 +0200 Subject: [PATCH 528/853] =?UTF-8?q?=F0=9F=90=9B=20Fix=20duplicated=20class?= =?UTF-8?q?=20names=20in=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/src/lib.rs | 2 +- .../src/component/form_element/button.rs | 6 +- .../src/component/form_element/date.rs | 2 +- .../src/component/form_element/input.rs | 21 ++-- pagetop/src/html/classes.rs | 103 ++++++++---------- 5 files changed, 57 insertions(+), 77 deletions(-) diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 9dc8fe2a..5c8f4a07 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -38,7 +38,7 @@ async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { .with_context(ContextOp::AddStyleSheet(StyleSheet::at( "/homedemo/css/styles.css", ))) - .with_body_classes(ClassesOp::AddFirst, "default-homepage") + .with_body_classes(ClassesOp::Add, "default-homepage") .with_in("content", hello_world()) .with_in("content", welcome()) .with_in("content", about_pagetop()) diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index 85b9b504..af7e09a7 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -30,7 +30,7 @@ impl ComponentTrait for Button { fn new() -> Self { Button::default() .with_classes(ClassesOp::SetDefault, "btn btn-primary") - .with_classes(ClassesOp::AddFirst, "form-button") + .with_classes(ClassesOp::Add, "form-button") } fn handle(&self) -> Handle { @@ -76,7 +76,7 @@ impl Button { pub fn submit(value: L10n) -> Self { let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button"), "form-submit") + .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-submit") .with_value(value); button.button_type = ButtonType::Submit; button @@ -84,7 +84,7 @@ impl Button { pub fn reset(value: L10n) -> Self { let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button"), "form-reset") + .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-reset") .with_value(value); button.button_type = ButtonType::Reset; button diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index 9b4748fd..c14979f9 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -25,7 +25,7 @@ impl ComponentTrait for Date { fn new() -> Self { Date::default() .with_classes(ClassesOp::SetDefault, "form-item") - .with_classes(ClassesOp::AddFirst, "form-type-date") + .with_classes(ClassesOp::Add, "form-type-date") } fn handle(&self) -> Handle { diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index dd2a97c5..740c8a2c 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -43,7 +43,7 @@ impl ComponentTrait for Input { fn new() -> Self { Input::default() .with_classes(ClassesOp::SetDefault, "form-item") - .with_classes(ClassesOp::AddFirst, "form-type-textfield") + .with_classes(ClassesOp::Add, "form-type-textfield") .with_size(Some(60)) .with_maxlength(Some(128)) } @@ -113,51 +113,46 @@ impl Input { Input::new() } - #[rustfmt::skip] pub fn password() -> Self { let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), + ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-password", ); input.input_type = InputType::Password; input } - #[rustfmt::skip] pub fn search() -> Self { let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), + ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-search", ); input.input_type = InputType::Search; input } - #[rustfmt::skip] pub fn email() -> Self { let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), - "form-type-email" + ClassesOp::Replace("form-type-textfield".to_owned()), + "form-type-email", ); input.input_type = InputType::Email; input } - #[rustfmt::skip] pub fn telephone() -> Self { let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), + ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-telephone", ); input.input_type = InputType::Telephone; input } - #[rustfmt::skip] pub fn url() -> Self { let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield"), - "form-type-url" + ClassesOp::Replace("form-type-textfield".to_owned()), + "form-type-url", ); input.input_type = InputType::Url; input diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index f9f4ee04..2ebc457c 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,24 +1,22 @@ -use crate::{concat_string, fn_builder}; +use crate::fn_builder; pub enum ClassesOp { Add, - AddAfter(&'static str), - AddBefore(&'static str), - AddFirst, Remove, - Replace(&'static str), + Replace(String), Reset, SetDefault, - SetDefaultIfEmpty, } -#[rustfmt::skip] -#[derive(Default)] -pub struct Classes { - default: String, - added : String, +#[derive(Eq, PartialEq)] +enum ClassType { + Default, + User, } +#[derive(Default)] +pub struct Classes(Vec<(String, ClassType)>); + impl Classes { pub fn new() -> Self { Classes::default() @@ -28,64 +26,49 @@ impl Classes { #[fn_builder] pub fn alter_value(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - let classes = classes.trim(); + let classes: Vec<String> = classes + .split_ascii_whitespace() + .map(|c| c.to_owned()) + .collect(); + match op { ClassesOp::Add => { - self.added = concat_string!(self.added, " ", classes).trim().to_owned() - } - - ClassesOp::AddAfter(class) => { - let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); - match v_added.iter().position(|c| c.eq(&class)) { - Some(pos) => v_added.insert(pos + 1, classes), - _ => v_added.push(classes), + for class in classes { + if self.0.iter().position(|(c, _)| c.eq(&class)).is_none() { + self.0.push((class, ClassType::User)); + } } - self.added = v_added.join(" "); - } - - ClassesOp::AddBefore(class) => { - let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); - match v_added.iter().position(|c| c.eq(&class)) { - Some(pos) => v_added.insert(pos, classes), - _ => v_added.insert(0, classes), - } - self.added = v_added.join(" "); - } - - ClassesOp::AddFirst => { - self.added = concat_string!(classes, " ", self.added).trim().to_owned() } ClassesOp::Remove => { - let v_list: Vec<&str> = classes.split_ascii_whitespace().collect(); - let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); - for class in v_list { - if let Some(pos) = v_added.iter().position(|c| c.eq(&class)) { - v_added.remove(pos); - } + for class in classes { + self.0 + .retain(|(c, t)| c.ne(&class) || t.ne(&ClassType::User)); } - self.added = v_added.join(" "); } - ClassesOp::Replace(class) => { - let mut v_added: Vec<&str> = self.added.split_ascii_whitespace().collect(); - match v_added.iter().position(|c| c.eq(&class)) { - Some(pos) => { - v_added.remove(pos); - v_added.insert(pos, classes); + ClassesOp::Replace(value) => { + for class in classes { + match self.0.iter().position(|(c, _)| c.eq(&value)) { + Some(pos) => { + self.0.remove(pos); + self.0.insert(pos, (class, ClassType::User)); + } + _ => self.0.push((class, ClassType::User)), } - _ => v_added.push(classes), } - self.added = v_added.join(" "); } - ClassesOp::Reset => self.added = classes.to_owned(), + ClassesOp::Reset => self.0.retain(|(_, t)| t.eq(&ClassType::Default)), - ClassesOp::SetDefault => self.default = classes.to_owned(), - - ClassesOp::SetDefaultIfEmpty => { - if self.default.is_empty() { - self.default = classes.to_owned() + ClassesOp::SetDefault => { + self.0.retain(|(_, t)| t.eq(&ClassType::User)); + let mut pos = 0; + for class in classes { + if self.0.iter().position(|(c, _)| c.eq(&class)).is_none() { + self.0.insert(pos, (class, ClassType::Default)); + pos = pos + 1; + } } } } @@ -95,13 +78,15 @@ impl Classes { // Classes GETTERS. pub fn get(&self) -> Option<String> { - if self.default.is_empty() && self.added.is_empty() { + if self.0.len() == 0 { None } else { Some( - concat_string!(self.default, " ", self.added) - .trim() - .to_owned(), + self.0 + .iter() + .map(|(c, _)| c.to_owned()) + .collect::<Vec<String>>() + .join(" "), ) } } From d1bfb2a7994c2e30fb7ac658c29e0d15b41f0f56 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 11 Sep 2023 20:58:09 +0200 Subject: [PATCH 529/853] =?UTF-8?q?=F0=9F=93=9D=20Fix=20link?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/locale.rs | 2 +- pagetop/src/response/redirect.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 53071011..f06b37fe 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -87,7 +87,7 @@ //! static_locales!(LOCALES_SAMPLE in "path/to/locale"); //! ``` //! -//! Usa el componente [L10n](crate::core::component::l10n::L10n) para incluir textos y contenidos +//! Usa el componente [L10n](crate::core::component::L10n) para incluir textos y contenidos //! opcionalmente traducibles según el contexto de renderizado. use crate::{config, kv, trace, LazyStatic}; diff --git a/pagetop/src/response/redirect.rs b/pagetop/src/response/redirect.rs index eb2678a8..3b6f0646 100644 --- a/pagetop/src/response/redirect.rs +++ b/pagetop/src/response/redirect.rs @@ -57,8 +57,8 @@ impl Redirect { } /// Temporary redirection. Status Code **307**. Method and body not changed. The web page is - /// temporarily unavailable for unforeseen reasons. Better than [`found()`](found) when non-GET - /// operations are available on the site. + /// temporarily unavailable for unforeseen reasons. Better than [`found()`](Self::found) when + /// non-GET operations are available on the site. pub fn temporary(redirect_to_url: &str) -> HttpResponse { HttpResponse::TemporaryRedirect() .append_header(("Location", redirect_to_url)) From 45d8c55e61a362dfaedfa27f27b871ad8becb696 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 11 Sep 2023 21:07:45 +0200 Subject: [PATCH 530/853] =?UTF-8?q?=F0=9F=92=A5=20Consolidate=20component?= =?UTF-8?q?=20class=20name=20management?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 63 ++++++------ pagetop-homedemo/src/lib.rs | 24 ++--- pagetop-minimal/src/component/anchor.rs | 6 +- pagetop-minimal/src/component/block.rs | 4 +- pagetop-minimal/src/component/container.rs | 16 ++-- .../src/component/form_element/button.rs | 16 +++- .../src/component/form_element/date.rs | 6 +- .../src/component/form_element/form.rs | 4 +- .../src/component/form_element/input.rs | 18 ++-- pagetop-minimal/src/component/grid/column.rs | 30 +++--- pagetop-minimal/src/component/grid/row.rs | 4 +- pagetop-minimal/src/component/heading.rs | 20 ++-- pagetop-minimal/src/component/icon.rs | 6 +- pagetop-minimal/src/component/image.rs | 4 +- pagetop-minimal/src/component/paragraph.rs | 18 ++-- pagetop-node/src/lib.rs | 2 +- pagetop/src/html/classes.rs | 96 ++++++++++--------- pagetop/src/response/page.rs | 4 +- 19 files changed, 178 insertions(+), 165 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index f2651b82..3e667c3d 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -41,5 +41,5 @@ impl ModuleTrait for Admin { } fn before_prepare_body(page: &mut Page) { - page.alter_body_classes(ClassesOp::Add, "test-admin"); + page.alter_body_classes(ClassesOp::Add, &["test-admin"]); } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 3620794e..159e627b 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -53,8 +53,8 @@ impl ThemeTrait for Bulmix { a.alter_classes( ClassesOp::SetDefault, match a.anchor_type() { - AnchorType::Button => "button is-primary", - _ => "", + AnchorType::Button => &["button", "is-primary"], + _ => &[], }, ); } @@ -63,13 +63,13 @@ impl ThemeTrait for Bulmix { h.alter_classes( ClassesOp::SetDefault, match h.display() { - HeadingDisplay::XxLarge => "title is-1", - HeadingDisplay::Large => "title is-2", - HeadingDisplay::Medium => "title is-3", - HeadingDisplay::Small => "title is-4", - HeadingDisplay::XxSmall => "title is-5", - HeadingDisplay::Normal => "title", - HeadingDisplay::Subtitle => "subtitle", + HeadingDisplay::XxLarge => &["title", "is-1"], + HeadingDisplay::Large => &["title", "is-2"], + HeadingDisplay::Medium => &["title", "is-3"], + HeadingDisplay::Small => &["title", "is-4"], + HeadingDisplay::XxSmall => &["title", "is-5"], + HeadingDisplay::Normal => &["title"], + HeadingDisplay::Subtitle => &["subtitle"], }, ); } @@ -78,12 +78,12 @@ impl ThemeTrait for Bulmix { p.alter_classes( ClassesOp::SetDefault, match p.display() { - ParagraphDisplay::XxLarge => "is-size-2", - ParagraphDisplay::Large => "is-size-3", - ParagraphDisplay::Medium => "is-size-4", - ParagraphDisplay::Small => "is-size-5", - ParagraphDisplay::XxSmall => "is-size-6", - ParagraphDisplay::Normal => "", + ParagraphDisplay::XxLarge => &["is-size-2"], + ParagraphDisplay::Large => &["is-size-3"], + ParagraphDisplay::Medium => &["is-size-4"], + ParagraphDisplay::Small => &["is-size-5"], + ParagraphDisplay::XxSmall => &["is-size-6"], + ParagraphDisplay::Normal => &[], }, ); } @@ -91,31 +91,30 @@ impl ThemeTrait for Bulmix { let col = component_as_mut::<grid::Column>(component); col.alter_classes( ClassesOp::SetDefault, - concat_string!( + &[ "column", match col.size() { grid::ColumnSize::Default => "", - grid::ColumnSize::Is1of12 => " is-1", - grid::ColumnSize::Is2of12 => " is-2", - grid::ColumnSize::Is3of12 => " is-3", - grid::ColumnSize::Is4of12 => " is-4", - grid::ColumnSize::Is5of12 => " is-5", - grid::ColumnSize::Is6of12 => " is-6", - grid::ColumnSize::Is7of12 => " is-7", - grid::ColumnSize::Is8of12 => " is-8", - grid::ColumnSize::Is9of12 => " is-9", - grid::ColumnSize::Is10of12 => " is-10", - grid::ColumnSize::Is11of12 => " is-11", - grid::ColumnSize::IsFull => " is-12", + grid::ColumnSize::Is1of12 => "is-1", + grid::ColumnSize::Is2of12 => "is-2", + grid::ColumnSize::Is3of12 => "is-3", + grid::ColumnSize::Is4of12 => "is-4", + grid::ColumnSize::Is5of12 => "is-5", + grid::ColumnSize::Is6of12 => "is-6", + grid::ColumnSize::Is7of12 => "is-7", + grid::ColumnSize::Is8of12 => "is-8", + grid::ColumnSize::Is9of12 => "is-9", + grid::ColumnSize::Is10of12 => "is-10", + grid::ColumnSize::Is11of12 => "is-11", + grid::ColumnSize::IsFull => "is-12", }, - " content" - ) - .as_str(), + "content", + ] ); } grid::COMPONENT_GRID_ROW => { let row = component_as_mut::<grid::Row>(component); - row.alter_classes(ClassesOp::SetDefault, "columns"); + row.alter_classes(ClassesOp::SetDefault, &["columns"]); } _ => {} } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 5c8f4a07..fba96421 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -38,7 +38,7 @@ async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { .with_context(ContextOp::AddStyleSheet(StyleSheet::at( "/homedemo/css/styles.css", ))) - .with_body_classes(ClassesOp::Add, "default-homepage") + .with_body_classes(ClassesOp::Add, &["default-homepage"]) .with_in("content", hello_world()) .with_in("content", welcome()) .with_in("content", about_pagetop()) @@ -52,7 +52,7 @@ fn hello_world() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "hello-col-text") + .with_classes(ClassesOp::Add, &["hello-col-text"]) .with_size(grid::ColumnSize::Is5of12) .with_component( Heading::h1(L10n::t("page_title", &LOCALES_HOMEDEMO)) @@ -84,17 +84,17 @@ fn hello_world() -> Container { ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) - .with_classes(ClassesOp::Add, "code-link"), + .with_classes(ClassesOp::Add, &["code-link"]), ) .with_component( Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) .with_left_icon(Icon::with("arrow-down-circle-fill")) - .with_classes(ClassesOp::Add, "welcome-link"), + .with_classes(ClassesOp::Add, &["welcome-link"]), ), ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "hello-col-image") + .with_classes(ClassesOp::Add, &["hello-col-image"]) .with_component(Image::with("/homedemo/images/header.svg")), ), ) @@ -103,7 +103,7 @@ fn hello_world() -> Container { fn welcome() -> Container { Container::section() .with_id("welcome") - .with_classes(ClassesOp::Add, "welcome-col-text") + .with_classes(ClassesOp::Add, &["welcome-col-text"]) .with_component(Heading::h2(L10n::t("welcome_page", &LOCALES_HOMEDEMO))) .with_component( Heading::h3(L10n::e("welcome_subtitle", &LOCALES_HOMEDEMO).with_arg( @@ -127,13 +127,13 @@ fn about_pagetop() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "pagetop-col-image") + .with_classes(ClassesOp::Add, &["pagetop-col-image"]) .with_size(grid::ColumnSize::Is5of12) .with_component(Image::with("/homedemo/images/about.svg")), ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "pagetop-col-text") + .with_classes(ClassesOp::Add, &["pagetop-col-text"]) .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALES_HOMEDEMO))) .with_component( Paragraph::with(L10n::t("pagetop_text1", &LOCALES_HOMEDEMO)) @@ -153,7 +153,7 @@ fn promo_pagetop() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "promo-col-text") + .with_classes(ClassesOp::Add, &["promo-col-text"]) .with_component(Heading::h2(L10n::t( "pagetop_promo_title", &LOCALES_HOMEDEMO, @@ -173,7 +173,7 @@ fn promo_pagetop() -> Container { ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "promo-col-image") + .with_classes(ClassesOp::Add, &["promo-col-image"]) .with_size(grid::ColumnSize::Is6of12) .with_component(Image::with("/homedemo/images/pagetop.png")), ), @@ -185,12 +185,12 @@ fn reporting_issues() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "reporting-col-image") + .with_classes(ClassesOp::Add, &["reporting-col-image"]) .with_component(Image::with("/homedemo/images/support.jpg")), ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, "reporting-col-text") + .with_classes(ClassesOp::Add, &["reporting-col-text"]) .with_size(grid::ColumnSize::Is6of12) .with_component(Heading::h2(L10n::t( "report_problems_title", diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 9d84b983..7c86ddbe 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -123,7 +123,7 @@ impl Anchor { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -134,8 +134,8 @@ impl Anchor { self.classes.alter_value( ClassesOp::SetDefault, match self.anchor_type { - AnchorType::Button => "btn btn-primary", - _ => "", + AnchorType::Button => &["btn", "btn-primary"], + _ => &[], }, ); self diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 7f63269f..76213fa3 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -18,7 +18,7 @@ pub struct Block { impl ComponentTrait for Block { fn new() -> Self { - Block::default().with_classes(ClassesOp::SetDefault, "block") + Block::default().with_classes(ClassesOp::SetDefault, &["block"]) } fn handle(&self) -> Handle { @@ -82,7 +82,7 @@ impl Block { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 607765b0..95c1e5a7 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -30,8 +30,8 @@ pub struct Container { impl ComponentTrait for Container { fn new() -> Self { Container::default() - .with_classes(ClassesOp::SetDefault, "container") - .with_inner_classes(ClassesOp::SetDefault, "container") + .with_classes(ClassesOp::SetDefault, &["container"]) + .with_inner_classes(ClassesOp::SetDefault, &["container"]) } fn handle(&self) -> Handle { @@ -99,25 +99,25 @@ impl ComponentTrait for Container { impl Container { pub fn header() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "header"); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["header"]); c.container_type = ContainerType::Header; c } pub fn footer() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "footer"); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["footer"]); c.container_type = ContainerType::Footer; c } pub fn main() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "main"); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["main"]); c.container_type = ContainerType::Main; c } pub fn section() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "section"); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["section"]); c.container_type = ContainerType::Section; c } @@ -143,13 +143,13 @@ impl Container { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } #[fn_builder] - pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.inner_classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index af7e09a7..b40ccbcc 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -29,8 +29,8 @@ pub struct Button { impl ComponentTrait for Button { fn new() -> Self { Button::default() - .with_classes(ClassesOp::SetDefault, "btn btn-primary") - .with_classes(ClassesOp::Add, "form-button") + .with_classes(ClassesOp::SetDefault, &["btn", "btn-primary"]) + .with_classes(ClassesOp::Add, &["form-button"]) } fn handle(&self) -> Handle { @@ -76,7 +76,10 @@ impl Button { pub fn submit(value: L10n) -> Self { let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-submit") + .with_classes( + ClassesOp::Replace("form-button".to_owned()), + &["form-submit"], + ) .with_value(value); button.button_type = ButtonType::Submit; button @@ -84,7 +87,10 @@ impl Button { pub fn reset(value: L10n) -> Self { let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-reset") + .with_classes( + ClassesOp::Replace("form-button".to_owned()), + &["form-reset"], + ) .with_value(value); button.button_type = ButtonType::Reset; button @@ -105,7 +111,7 @@ impl Button { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index c14979f9..cac1d8b7 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -24,8 +24,8 @@ pub struct Date { impl ComponentTrait for Date { fn new() -> Self { Date::default() - .with_classes(ClassesOp::SetDefault, "form-item") - .with_classes(ClassesOp::Add, "form-type-date") + .with_classes(ClassesOp::SetDefault, &["form-item"]) + .with_classes(ClassesOp::Add, &["form-type-date"]) } fn handle(&self) -> Handle { @@ -90,7 +90,7 @@ impl Date { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 3220cf64..1efd2935 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -28,7 +28,7 @@ pub struct Form { impl ComponentTrait for Form { fn new() -> Self { Form::default() - .with_classes(ClassesOp::SetDefault, "form") + .with_classes(ClassesOp::SetDefault, &["form"]) .with_charset("UTF-8") } @@ -97,7 +97,7 @@ impl Form { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 740c8a2c..22c3e3fe 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -42,8 +42,8 @@ pub struct Input { impl ComponentTrait for Input { fn new() -> Self { Input::default() - .with_classes(ClassesOp::SetDefault, "form-item") - .with_classes(ClassesOp::Add, "form-type-textfield") + .with_classes(ClassesOp::SetDefault, &["form-item"]) + .with_classes(ClassesOp::Add, &["form-type-textfield"]) .with_size(Some(60)) .with_maxlength(Some(128)) } @@ -116,7 +116,7 @@ impl Input { pub fn password() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-password", + &["form-type-password"], ); input.input_type = InputType::Password; input @@ -125,7 +125,7 @@ impl Input { pub fn search() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-search", + &["form-type-search"], ); input.input_type = InputType::Search; input @@ -134,7 +134,7 @@ impl Input { pub fn email() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-email", + &["form-type-email"], ); input.input_type = InputType::Email; input @@ -143,7 +143,7 @@ impl Input { pub fn telephone() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-telephone", + &["form-type-telephone"], ); input.input_type = InputType::Telephone; input @@ -152,7 +152,7 @@ impl Input { pub fn url() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-url", + &["form-type-url"], ); input.input_type = InputType::Url; input @@ -173,7 +173,7 @@ impl Input { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -183,7 +183,7 @@ impl Input { self.name.alter_value(name); self.alter_classes( ClassesOp::SetDefault, - concat_string!("form-item form-item-", name).as_str(), + &[concat_string!("form-item form-item-", name)], ); self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index a438b6b2..a455ec3d 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -50,7 +50,7 @@ pub struct Column { impl ComponentTrait for Column { fn new() -> Self { - Column::default().with_classes(ClassesOp::SetDefault, SIZE_DEFAULT) + Column::default().with_classes(ClassesOp::SetDefault, &[SIZE_DEFAULT]) } fn handle(&self) -> Handle { @@ -108,7 +108,7 @@ impl Column { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -117,19 +117,19 @@ impl Column { #[fn_builder] pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { match size { - ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE_DEFAULT), - ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_1_OF_12), - ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_2_OF_12), - ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_3_OF_12), - ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_4_OF_12), - ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_5_OF_12), - ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_6_OF_12), - ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_7_OF_12), - ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_8_OF_12), - ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_9_OF_12), - ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), - ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), - ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), + ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, &[SIZE_DEFAULT]), + ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_1_OF_12]), + ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_2_OF_12]), + ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_3_OF_12]), + ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_4_OF_12]), + ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_5_OF_12]), + ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_6_OF_12]), + ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_7_OF_12]), + ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_8_OF_12]), + ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_9_OF_12]), + ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_10_OF_12]), + ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_11_OF_12]), + ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, &[SIZE_12_OF_12]), }; self.size = size; self diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 31802ec7..8090c553 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -19,7 +19,7 @@ pub struct Row { impl ComponentTrait for Row { fn new() -> Self { - Row::default().with_classes(ClassesOp::SetDefault, "row") + Row::default().with_classes(ClassesOp::SetDefault, &["row"]) } fn handle(&self) -> Handle { @@ -77,7 +77,7 @@ impl Row { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index f9f96152..3bea3c39 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -133,7 +133,7 @@ impl Heading { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -153,19 +153,19 @@ impl Heading { #[rustfmt::skip] #[fn_builder] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { - self.display = display; self.classes.alter_value( ClassesOp::SetDefault, - match self.display { - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::Large => "display-3", - HeadingDisplay::Medium => "display-4", - HeadingDisplay::Small => "display-5", - HeadingDisplay::XxSmall => "display-6", - HeadingDisplay::Normal => "", - HeadingDisplay::Subtitle => "", + match display { + HeadingDisplay::XxLarge => &["display-2"], + HeadingDisplay::Large => &["display-3"], + HeadingDisplay::Medium => &["display-4"], + HeadingDisplay::Small => &["display-5"], + HeadingDisplay::XxSmall => &["display-6"], + HeadingDisplay::Normal => &[], + HeadingDisplay::Subtitle => &[], }, ); + self.display = display; self } diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index 7e6ab9b2..ce055742 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -13,7 +13,7 @@ pub struct Icon { impl ComponentTrait for Icon { fn new() -> Self { - Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") + Icon::default().with_classes(ClassesOp::SetDefault, &["bi-question-circle-fill"]) } fn handle(&self) -> Handle { @@ -63,13 +63,13 @@ impl Icon { self.icon_name = name.to_owned(); self.alter_classes( ClassesOp::SetDefault, - concat_string!("bi-", self.icon_name).as_str(), + &[concat_string!("bi-", self.icon_name)], ); self } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index 77ab1c6a..e4ee58eb 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -24,7 +24,7 @@ pub struct Image { impl ComponentTrait for Image { fn new() -> Self { - Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") + Image::default().with_classes(ClassesOp::SetDefault, &["img-fluid"]) } fn handle(&self) -> Handle { @@ -93,7 +93,7 @@ impl Image { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 6e3031ca..474e0c1f 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -84,7 +84,7 @@ impl Paragraph { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -103,18 +103,18 @@ impl Paragraph { #[rustfmt::skip] #[fn_builder] pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { - self.display = display; self.classes.alter_value( ClassesOp::SetDefault, - match self.display { - ParagraphDisplay::XxLarge => "fs-2", - ParagraphDisplay::Large => "fs-3", - ParagraphDisplay::Medium => "fs-4", - ParagraphDisplay::Small => "fs-5", - ParagraphDisplay::XxSmall => "fs-6", - ParagraphDisplay::Normal => "", + match display { + ParagraphDisplay::XxLarge => &["fs-2"], + ParagraphDisplay::Large => &["fs-3"], + ParagraphDisplay::Medium => &["fs-4"], + ParagraphDisplay::Small => &["fs-5"], + ParagraphDisplay::XxSmall => &["fs-6"], + ParagraphDisplay::Normal => &[], }, ); + self.display = display; self } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 96d1c813..3634706f 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -45,5 +45,5 @@ async fn node(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { } fn before_prepare_body(page: &mut Page) { - page.alter_body_classes(ClassesOp::Add, "test-node"); + page.alter_body_classes(ClassesOp::Add, &["test-node"]); } diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 2ebc457c..b1bc7f63 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -1,14 +1,27 @@ +//! **Classes** implements a *helper* for dynamically adding class names to components. +//! +//! This *helper* differentiates between default classes (generally associated with styles provided +//! by the theme) and user classes (for customizing components based on application styles). +//! +//! Default classes can be added using [SetDefault] and [AddDefault], while user classes can be +//! added using [Add]. Operations to [Remove] or [Replace] any class, as well as to [Reset] user +//! classes, are also provided. +//! +//! Although the order of the classes is irrelevant (<https://stackoverflow.com/a/1321712>), default +//! classes will be presented before user classes and duplicate classes will not be allowed. + use crate::fn_builder; pub enum ClassesOp { + SetDefault, + AddDefault, Add, Remove, Replace(String), Reset, - SetDefault, } -#[derive(Eq, PartialEq)] +#[derive(Clone, PartialEq)] enum ClassType { Default, User, @@ -25,56 +38,51 @@ impl Classes { // Classes BUILDER. #[fn_builder] - pub fn alter_value(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - let classes: Vec<String> = classes - .split_ascii_whitespace() - .map(|c| c.to_owned()) - .collect(); - + pub fn alter_value(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { match op { - ClassesOp::Add => { - for class in classes { - if self.0.iter().position(|(c, _)| c.eq(&class)).is_none() { - self.0.push((class, ClassType::User)); - } - } - } - - ClassesOp::Remove => { - for class in classes { - self.0 - .retain(|(c, t)| c.ne(&class) || t.ne(&ClassType::User)); - } - } - - ClassesOp::Replace(value) => { - for class in classes { - match self.0.iter().position(|(c, _)| c.eq(&value)) { - Some(pos) => { - self.0.remove(pos); - self.0.insert(pos, (class, ClassType::User)); - } - _ => self.0.push((class, ClassType::User)), - } - } - } - - ClassesOp::Reset => self.0.retain(|(_, t)| t.eq(&ClassType::Default)), - ClassesOp::SetDefault => { - self.0.retain(|(_, t)| t.eq(&ClassType::User)); - let mut pos = 0; - for class in classes { - if self.0.iter().position(|(c, _)| c.eq(&class)).is_none() { - self.0.insert(pos, (class, ClassType::Default)); - pos = pos + 1; - } + self.0.retain(|(_, t)| t.ne(&ClassType::Default)); + self.add(classes, 0, ClassType::Default); + } + ClassesOp::AddDefault => { + let pos = match self.0.iter().position(|(_, t)| t.eq(&ClassType::User)) { + Some(pos) => pos, + None => self.0.len(), + }; + self.add(classes, pos, ClassType::Default); + } + ClassesOp::Add => { + self.add(classes, self.0.len(), ClassType::User); + } + ClassesOp::Remove => { + for name in classes { + self.0.retain(|(c, _)| c.ne(&name.to_string())); } } + ClassesOp::Replace(class) => { + if let Some(pos) = self.0.iter().position(|(c, _)| c.eq(&class)) { + let (_, class_type) = self.0.remove(pos); + self.add(classes, pos, class_type); + } + } + ClassesOp::Reset => { + self.0.retain(|(_, t)| t.ne(&ClassType::User)); + } } self } + #[inline] + fn add(&mut self, classes: &[impl ToString], mut pos: usize, class_type: ClassType) { + for class in classes { + let class: String = class.to_string(); + if !class.is_empty() && self.0.iter().position(|(c, _)| c.eq(&class)).is_none() { + self.0.insert(pos, (class, class_type.clone())); + pos = pos + 1; + } + } + } + // Classes GETTERS. pub fn get(&self) -> Option<String> { diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 3fdfa820..fce44032 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -38,7 +38,7 @@ impl Page { properties : Vec::new(), favicon : None, context : Context::new(request), - body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), + body_classes: Classes::new().with_value(ClassesOp::SetDefault, &["body"]), regions : ComponentsRegions::new(), template : "default".to_owned(), } @@ -83,7 +83,7 @@ impl Page { } #[fn_builder] - pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { self.body_classes.alter_value(op, classes); self } From 330338c7ef514773ebd6e74b32159e8dcf733729 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 12 Sep 2023 00:27:54 +0200 Subject: [PATCH 531/853] =?UTF-8?q?=E2=8F=AA=20Revert=20type=20for=20class?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 70 +++++++++---------- pagetop-homedemo/src/lib.rs | 24 +++---- pagetop-minimal/src/component/anchor.rs | 12 ++-- pagetop-minimal/src/component/block.rs | 4 +- pagetop-minimal/src/component/container.rs | 16 ++--- .../src/component/form_element/button.rs | 16 ++--- .../src/component/form_element/date.rs | 6 +- .../src/component/form_element/form.rs | 4 +- .../src/component/form_element/input.rs | 23 +++--- pagetop-minimal/src/component/grid/column.rs | 37 +++++----- pagetop-minimal/src/component/grid/row.rs | 4 +- pagetop-minimal/src/component/heading.rs | 18 ++--- pagetop-minimal/src/component/icon.rs | 9 +-- pagetop-minimal/src/component/image.rs | 4 +- pagetop-minimal/src/component/paragraph.rs | 16 ++--- pagetop-node/src/lib.rs | 2 +- pagetop/src/html/classes.rs | 34 ++++++--- pagetop/src/response/page.rs | 4 +- 19 files changed, 152 insertions(+), 153 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 3e667c3d..f2651b82 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -41,5 +41,5 @@ impl ModuleTrait for Admin { } fn before_prepare_body(page: &mut Page) { - page.alter_body_classes(ClassesOp::Add, &["test-admin"]); + page.alter_body_classes(ClassesOp::Add, "test-admin"); } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 159e627b..83a649f1 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -53,8 +53,8 @@ impl ThemeTrait for Bulmix { a.alter_classes( ClassesOp::SetDefault, match a.anchor_type() { - AnchorType::Button => &["button", "is-primary"], - _ => &[], + AnchorType::Button => "button is-primary", + _ => "", }, ); } @@ -63,13 +63,13 @@ impl ThemeTrait for Bulmix { h.alter_classes( ClassesOp::SetDefault, match h.display() { - HeadingDisplay::XxLarge => &["title", "is-1"], - HeadingDisplay::Large => &["title", "is-2"], - HeadingDisplay::Medium => &["title", "is-3"], - HeadingDisplay::Small => &["title", "is-4"], - HeadingDisplay::XxSmall => &["title", "is-5"], - HeadingDisplay::Normal => &["title"], - HeadingDisplay::Subtitle => &["subtitle"], + HeadingDisplay::XxLarge => "title is-1", + HeadingDisplay::Large => "title is-2", + HeadingDisplay::Medium => "title is-3", + HeadingDisplay::Small => "title is-4", + HeadingDisplay::XxSmall => "title is-5", + HeadingDisplay::Normal => "title", + HeadingDisplay::Subtitle => "subtitle", }, ); } @@ -78,43 +78,41 @@ impl ThemeTrait for Bulmix { p.alter_classes( ClassesOp::SetDefault, match p.display() { - ParagraphDisplay::XxLarge => &["is-size-2"], - ParagraphDisplay::Large => &["is-size-3"], - ParagraphDisplay::Medium => &["is-size-4"], - ParagraphDisplay::Small => &["is-size-5"], - ParagraphDisplay::XxSmall => &["is-size-6"], - ParagraphDisplay::Normal => &[], + ParagraphDisplay::XxLarge => "is-size-2", + ParagraphDisplay::Large => "is-size-3", + ParagraphDisplay::Medium => "is-size-4", + ParagraphDisplay::Small => "is-size-5", + ParagraphDisplay::XxSmall => "is-size-6", + ParagraphDisplay::Normal => "", }, ); } grid::COMPONENT_GRID_COLUMN => { let col = component_as_mut::<grid::Column>(component); + col.alter_classes(ClassesOp::SetDefault, "column"); col.alter_classes( - ClassesOp::SetDefault, - &[ - "column", - match col.size() { - grid::ColumnSize::Default => "", - grid::ColumnSize::Is1of12 => "is-1", - grid::ColumnSize::Is2of12 => "is-2", - grid::ColumnSize::Is3of12 => "is-3", - grid::ColumnSize::Is4of12 => "is-4", - grid::ColumnSize::Is5of12 => "is-5", - grid::ColumnSize::Is6of12 => "is-6", - grid::ColumnSize::Is7of12 => "is-7", - grid::ColumnSize::Is8of12 => "is-8", - grid::ColumnSize::Is9of12 => "is-9", - grid::ColumnSize::Is10of12 => "is-10", - grid::ColumnSize::Is11of12 => "is-11", - grid::ColumnSize::IsFull => "is-12", - }, - "content", - ] + ClassesOp::AddDefault, + match col.size() { + grid::ColumnSize::Default => "", + grid::ColumnSize::Is1of12 => "is-1", + grid::ColumnSize::Is2of12 => "is-2", + grid::ColumnSize::Is3of12 => "is-3", + grid::ColumnSize::Is4of12 => "is-4", + grid::ColumnSize::Is5of12 => "is-5", + grid::ColumnSize::Is6of12 => "is-6", + grid::ColumnSize::Is7of12 => "is-7", + grid::ColumnSize::Is8of12 => "is-8", + grid::ColumnSize::Is9of12 => "is-9", + grid::ColumnSize::Is10of12 => "is-10", + grid::ColumnSize::Is11of12 => "is-11", + grid::ColumnSize::IsFull => "is-12", + } ); + col.alter_classes(ClassesOp::AddDefault, "content"); } grid::COMPONENT_GRID_ROW => { let row = component_as_mut::<grid::Row>(component); - row.alter_classes(ClassesOp::SetDefault, &["columns"]); + row.alter_classes(ClassesOp::SetDefault, "columns"); } _ => {} } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index fba96421..5c8f4a07 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -38,7 +38,7 @@ async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { .with_context(ContextOp::AddStyleSheet(StyleSheet::at( "/homedemo/css/styles.css", ))) - .with_body_classes(ClassesOp::Add, &["default-homepage"]) + .with_body_classes(ClassesOp::Add, "default-homepage") .with_in("content", hello_world()) .with_in("content", welcome()) .with_in("content", about_pagetop()) @@ -52,7 +52,7 @@ fn hello_world() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["hello-col-text"]) + .with_classes(ClassesOp::Add, "hello-col-text") .with_size(grid::ColumnSize::Is5of12) .with_component( Heading::h1(L10n::t("page_title", &LOCALES_HOMEDEMO)) @@ -84,17 +84,17 @@ fn hello_world() -> Container { ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) - .with_classes(ClassesOp::Add, &["code-link"]), + .with_classes(ClassesOp::Add, "code-link"), ) .with_component( Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) .with_left_icon(Icon::with("arrow-down-circle-fill")) - .with_classes(ClassesOp::Add, &["welcome-link"]), + .with_classes(ClassesOp::Add, "welcome-link"), ), ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["hello-col-image"]) + .with_classes(ClassesOp::Add, "hello-col-image") .with_component(Image::with("/homedemo/images/header.svg")), ), ) @@ -103,7 +103,7 @@ fn hello_world() -> Container { fn welcome() -> Container { Container::section() .with_id("welcome") - .with_classes(ClassesOp::Add, &["welcome-col-text"]) + .with_classes(ClassesOp::Add, "welcome-col-text") .with_component(Heading::h2(L10n::t("welcome_page", &LOCALES_HOMEDEMO))) .with_component( Heading::h3(L10n::e("welcome_subtitle", &LOCALES_HOMEDEMO).with_arg( @@ -127,13 +127,13 @@ fn about_pagetop() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["pagetop-col-image"]) + .with_classes(ClassesOp::Add, "pagetop-col-image") .with_size(grid::ColumnSize::Is5of12) .with_component(Image::with("/homedemo/images/about.svg")), ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["pagetop-col-text"]) + .with_classes(ClassesOp::Add, "pagetop-col-text") .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALES_HOMEDEMO))) .with_component( Paragraph::with(L10n::t("pagetop_text1", &LOCALES_HOMEDEMO)) @@ -153,7 +153,7 @@ fn promo_pagetop() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["promo-col-text"]) + .with_classes(ClassesOp::Add, "promo-col-text") .with_component(Heading::h2(L10n::t( "pagetop_promo_title", &LOCALES_HOMEDEMO, @@ -173,7 +173,7 @@ fn promo_pagetop() -> Container { ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["promo-col-image"]) + .with_classes(ClassesOp::Add, "promo-col-image") .with_size(grid::ColumnSize::Is6of12) .with_component(Image::with("/homedemo/images/pagetop.png")), ), @@ -185,12 +185,12 @@ fn reporting_issues() -> Container { grid::Row::new() .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["reporting-col-image"]) + .with_classes(ClassesOp::Add, "reporting-col-image") .with_component(Image::with("/homedemo/images/support.jpg")), ) .with_column( grid::Column::new() - .with_classes(ClassesOp::Add, &["reporting-col-text"]) + .with_classes(ClassesOp::Add, "reporting-col-text") .with_size(grid::ColumnSize::Is6of12) .with_component(Heading::h2(L10n::t( "report_problems_title", diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 7c86ddbe..753cbaf7 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -123,21 +123,21 @@ impl Anchor { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } #[fn_builder] pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { - self.anchor_type = anchor_type; - self.classes.alter_value( + self.alter_classes( ClassesOp::SetDefault, - match self.anchor_type { - AnchorType::Button => &["btn", "btn-primary"], - _ => &[], + match anchor_type { + AnchorType::Button => "btn btn-primary", + _ => "", }, ); + self.anchor_type = anchor_type; self } diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs index 76213fa3..ef84a263 100644 --- a/pagetop-minimal/src/component/block.rs +++ b/pagetop-minimal/src/component/block.rs @@ -18,7 +18,7 @@ pub struct Block { impl ComponentTrait for Block { fn new() -> Self { - Block::default().with_classes(ClassesOp::SetDefault, &["block"]) + Block::default().with_classes(ClassesOp::SetDefault, "block") } fn handle(&self) -> Handle { @@ -82,7 +82,7 @@ impl Block { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index 95c1e5a7..344e20c2 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -30,8 +30,8 @@ pub struct Container { impl ComponentTrait for Container { fn new() -> Self { Container::default() - .with_classes(ClassesOp::SetDefault, &["container"]) - .with_inner_classes(ClassesOp::SetDefault, &["container"]) + .with_classes(ClassesOp::SetDefault, "container") + .with_inner_classes(ClassesOp::SetDefault, "container") } fn handle(&self) -> Handle { @@ -99,25 +99,25 @@ impl ComponentTrait for Container { impl Container { pub fn header() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["header"]); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "header"); c.container_type = ContainerType::Header; c } pub fn footer() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["footer"]); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "footer"); c.container_type = ContainerType::Footer; c } pub fn main() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["main"]); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "main"); c.container_type = ContainerType::Main; c } pub fn section() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, &["section"]); + let mut c = Container::new().with_classes(ClassesOp::SetDefault, "section"); c.container_type = ContainerType::Section; c } @@ -143,13 +143,13 @@ impl Container { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } #[fn_builder] - pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.inner_classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index b40ccbcc..a8f4da4b 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -28,9 +28,7 @@ pub struct Button { impl ComponentTrait for Button { fn new() -> Self { - Button::default() - .with_classes(ClassesOp::SetDefault, &["btn", "btn-primary"]) - .with_classes(ClassesOp::Add, &["form-button"]) + Button::default().with_classes(ClassesOp::SetDefault, "btn btn-primary form-button") } fn handle(&self) -> Handle { @@ -76,10 +74,7 @@ impl Button { pub fn submit(value: L10n) -> Self { let mut button = Button::new() - .with_classes( - ClassesOp::Replace("form-button".to_owned()), - &["form-submit"], - ) + .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-submit") .with_value(value); button.button_type = ButtonType::Submit; button @@ -87,10 +82,7 @@ impl Button { pub fn reset(value: L10n) -> Self { let mut button = Button::new() - .with_classes( - ClassesOp::Replace("form-button".to_owned()), - &["form-reset"], - ) + .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-reset") .with_value(value); button.button_type = ButtonType::Reset; button @@ -111,7 +103,7 @@ impl Button { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs index cac1d8b7..18b304a9 100644 --- a/pagetop-minimal/src/component/form_element/date.rs +++ b/pagetop-minimal/src/component/form_element/date.rs @@ -23,9 +23,7 @@ pub struct Date { impl ComponentTrait for Date { fn new() -> Self { - Date::default() - .with_classes(ClassesOp::SetDefault, &["form-item"]) - .with_classes(ClassesOp::Add, &["form-type-date"]) + Date::default().with_classes(ClassesOp::SetDefault, "form-item form-type-date") } fn handle(&self) -> Handle { @@ -90,7 +88,7 @@ impl Date { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 1efd2935..862b69ed 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -28,7 +28,7 @@ pub struct Form { impl ComponentTrait for Form { fn new() -> Self { Form::default() - .with_classes(ClassesOp::SetDefault, &["form"]) + .with_classes(ClassesOp::SetDefault, "form") .with_charset("UTF-8") } @@ -97,7 +97,7 @@ impl Form { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 22c3e3fe..2bcd6329 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -42,8 +42,7 @@ pub struct Input { impl ComponentTrait for Input { fn new() -> Self { Input::default() - .with_classes(ClassesOp::SetDefault, &["form-item"]) - .with_classes(ClassesOp::Add, &["form-type-textfield"]) + .with_classes(ClassesOp::SetDefault, "form-item form-type-textfield") .with_size(Some(60)) .with_maxlength(Some(128)) } @@ -116,7 +115,7 @@ impl Input { pub fn password() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - &["form-type-password"], + "form-type-password", ); input.input_type = InputType::Password; input @@ -125,7 +124,7 @@ impl Input { pub fn search() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - &["form-type-search"], + "form-type-search", ); input.input_type = InputType::Search; input @@ -134,7 +133,7 @@ impl Input { pub fn email() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - &["form-type-email"], + "form-type-email", ); input.input_type = InputType::Email; input @@ -143,7 +142,7 @@ impl Input { pub fn telephone() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - &["form-type-telephone"], + "form-type-telephone", ); input.input_type = InputType::Telephone; input @@ -152,7 +151,7 @@ impl Input { pub fn url() -> Self { let mut input = Input::new().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), - &["form-type-url"], + "form-type-url", ); input.input_type = InputType::Url; input @@ -173,18 +172,18 @@ impl Input { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { + if let Some(previous) = self.name.get() { + self.alter_classes(ClassesOp::Remove, concat_string!("form-item-", previous)); + } + self.alter_classes(ClassesOp::AddDefault, concat_string!("form-item-", name)); self.name.alter_value(name); - self.alter_classes( - ClassesOp::SetDefault, - &[concat_string!("form-item form-item-", name)], - ); self } diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index a455ec3d..9acbe438 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -50,7 +50,7 @@ pub struct Column { impl ComponentTrait for Column { fn new() -> Self { - Column::default().with_classes(ClassesOp::SetDefault, &[SIZE_DEFAULT]) + Column::default().with_classes(ClassesOp::SetDefault, SIZE_DEFAULT) } fn handle(&self) -> Handle { @@ -108,7 +108,7 @@ impl Column { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -116,21 +116,24 @@ impl Column { #[rustfmt::skip] #[fn_builder] pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { - match size { - ColumnSize::Default => self.alter_classes(ClassesOp::SetDefault, &[SIZE_DEFAULT]), - ColumnSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_1_OF_12]), - ColumnSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_2_OF_12]), - ColumnSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_3_OF_12]), - ColumnSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_4_OF_12]), - ColumnSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_5_OF_12]), - ColumnSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_6_OF_12]), - ColumnSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_7_OF_12]), - ColumnSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_8_OF_12]), - ColumnSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_9_OF_12]), - ColumnSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_10_OF_12]), - ColumnSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, &[SIZE_11_OF_12]), - ColumnSize::IsFull => self.alter_classes(ClassesOp::SetDefault, &[SIZE_12_OF_12]), - }; + self.alter_classes( + ClassesOp::SetDefault, + match size { + ColumnSize::Default => SIZE_DEFAULT, + ColumnSize::Is1of12 => SIZE_1_OF_12, + ColumnSize::Is2of12 => SIZE_2_OF_12, + ColumnSize::Is3of12 => SIZE_3_OF_12, + ColumnSize::Is4of12 => SIZE_4_OF_12, + ColumnSize::Is5of12 => SIZE_5_OF_12, + ColumnSize::Is6of12 => SIZE_6_OF_12, + ColumnSize::Is7of12 => SIZE_7_OF_12, + ColumnSize::Is8of12 => SIZE_8_OF_12, + ColumnSize::Is9of12 => SIZE_9_OF_12, + ColumnSize::Is10of12 => SIZE_10_OF_12, + ColumnSize::Is11of12 => SIZE_11_OF_12, + ColumnSize::IsFull => SIZE_12_OF_12, + } + ); self.size = size; self } diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index 8090c553..e2be6ca7 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -19,7 +19,7 @@ pub struct Row { impl ComponentTrait for Row { fn new() -> Self { - Row::default().with_classes(ClassesOp::SetDefault, &["row"]) + Row::default().with_classes(ClassesOp::SetDefault, "row") } fn handle(&self) -> Handle { @@ -77,7 +77,7 @@ impl Row { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 3bea3c39..e4b8ae3e 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -133,7 +133,7 @@ impl Heading { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -153,16 +153,16 @@ impl Heading { #[rustfmt::skip] #[fn_builder] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { - self.classes.alter_value( + self.alter_classes( ClassesOp::SetDefault, match display { - HeadingDisplay::XxLarge => &["display-2"], - HeadingDisplay::Large => &["display-3"], - HeadingDisplay::Medium => &["display-4"], - HeadingDisplay::Small => &["display-5"], - HeadingDisplay::XxSmall => &["display-6"], - HeadingDisplay::Normal => &[], - HeadingDisplay::Subtitle => &[], + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::Large => "display-3", + HeadingDisplay::Medium => "display-4", + HeadingDisplay::Small => "display-5", + HeadingDisplay::XxSmall => "display-6", + HeadingDisplay::Normal => "", + HeadingDisplay::Subtitle => "", }, ); self.display = display; diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs index ce055742..6d5a1a68 100644 --- a/pagetop-minimal/src/component/icon.rs +++ b/pagetop-minimal/src/component/icon.rs @@ -13,7 +13,7 @@ pub struct Icon { impl ComponentTrait for Icon { fn new() -> Self { - Icon::default().with_classes(ClassesOp::SetDefault, &["bi-question-circle-fill"]) + Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") } fn handle(&self) -> Handle { @@ -60,16 +60,13 @@ impl Icon { #[fn_builder] pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { + self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", name)); self.icon_name = name.to_owned(); - self.alter_classes( - ClassesOp::SetDefault, - &[concat_string!("bi-", self.icon_name)], - ); self } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs index e4ee58eb..d3e6d9df 100644 --- a/pagetop-minimal/src/component/image.rs +++ b/pagetop-minimal/src/component/image.rs @@ -24,7 +24,7 @@ pub struct Image { impl ComponentTrait for Image { fn new() -> Self { - Image::default().with_classes(ClassesOp::SetDefault, &["img-fluid"]) + Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") } fn handle(&self) -> Handle { @@ -93,7 +93,7 @@ impl Image { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs index 474e0c1f..f5fd3c67 100644 --- a/pagetop-minimal/src/component/paragraph.rs +++ b/pagetop-minimal/src/component/paragraph.rs @@ -84,7 +84,7 @@ impl Paragraph { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -103,15 +103,15 @@ impl Paragraph { #[rustfmt::skip] #[fn_builder] pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { - self.classes.alter_value( + self.alter_classes( ClassesOp::SetDefault, match display { - ParagraphDisplay::XxLarge => &["fs-2"], - ParagraphDisplay::Large => &["fs-3"], - ParagraphDisplay::Medium => &["fs-4"], - ParagraphDisplay::Small => &["fs-5"], - ParagraphDisplay::XxSmall => &["fs-6"], - ParagraphDisplay::Normal => &[], + ParagraphDisplay::XxLarge => "fs-2", + ParagraphDisplay::Large => "fs-3", + ParagraphDisplay::Medium => "fs-4", + ParagraphDisplay::Small => "fs-5", + ParagraphDisplay::XxSmall => "fs-6", + ParagraphDisplay::Normal => "", }, ); self.display = display; diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 3634706f..96d1c813 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -45,5 +45,5 @@ async fn node(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { } fn before_prepare_body(page: &mut Page) { - page.alter_body_classes(ClassesOp::Add, &["test-node"]); + page.alter_body_classes(ClassesOp::Add, "test-node"); } diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index b1bc7f63..9f06d38e 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -4,8 +4,8 @@ //! by the theme) and user classes (for customizing components based on application styles). //! //! Default classes can be added using [SetDefault] and [AddDefault], while user classes can be -//! added using [Add]. Operations to [Remove] or [Replace] any class, as well as to [Reset] user -//! classes, are also provided. +//! added using [Add]. Operations to [Remove], [Replace] or [ReplaceIfExists] a class, as well as +//! to [Reset] user classes, are also provided. //! //! Although the order of the classes is irrelevant (<https://stackoverflow.com/a/1321712>), default //! classes will be presented before user classes and duplicate classes will not be allowed. @@ -18,6 +18,7 @@ pub enum ClassesOp { Add, Remove, Replace(String), + ReplaceIfExists(String), Reset, } @@ -38,21 +39,24 @@ impl Classes { // Classes BUILDER. #[fn_builder] - pub fn alter_value(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_value(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + let classes: String = classes.into(); + let classes: Vec<&str> = classes.split_ascii_whitespace().collect(); + match op { ClassesOp::SetDefault => { self.0.retain(|(_, t)| t.ne(&ClassType::Default)); - self.add(classes, 0, ClassType::Default); + self.add(&classes, 0, ClassType::Default); } ClassesOp::AddDefault => { let pos = match self.0.iter().position(|(_, t)| t.eq(&ClassType::User)) { Some(pos) => pos, None => self.0.len(), }; - self.add(classes, pos, ClassType::Default); + self.add(&classes, pos, ClassType::Default); } ClassesOp::Add => { - self.add(classes, self.0.len(), ClassType::User); + self.add(&classes, self.0.len(), ClassType::User); } ClassesOp::Remove => { for name in classes { @@ -60,9 +64,18 @@ impl Classes { } } ClassesOp::Replace(class) => { + match self.0.iter().position(|(c, _)| c.eq(&class)) { + Some(pos) => { + let (_, class_type) = self.0.remove(pos); + self.add(&classes, pos, class_type); + } + None => self.add(&classes, self.0.len(), ClassType::User), + }; + } + ClassesOp::ReplaceIfExists(class) => { if let Some(pos) = self.0.iter().position(|(c, _)| c.eq(&class)) { let (_, class_type) = self.0.remove(pos); - self.add(classes, pos, class_type); + self.add(&classes, pos, class_type); } } ClassesOp::Reset => { @@ -73,11 +86,10 @@ impl Classes { } #[inline] - fn add(&mut self, classes: &[impl ToString], mut pos: usize, class_type: ClassType) { + fn add(&mut self, classes: &Vec<&str>, mut pos: usize, class_type: ClassType) { for class in classes { - let class: String = class.to_string(); - if !class.is_empty() && self.0.iter().position(|(c, _)| c.eq(&class)).is_none() { - self.0.insert(pos, (class, class_type.clone())); + if !class.is_empty() && self.0.iter().position(|(c, _)| c.eq(class)).is_none() { + self.0.insert(pos, (class.to_string(), class_type.clone())); pos = pos + 1; } } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index fce44032..6510534a 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -38,7 +38,7 @@ impl Page { properties : Vec::new(), favicon : None, context : Context::new(request), - body_classes: Classes::new().with_value(ClassesOp::SetDefault, &["body"]), + body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), regions : ComponentsRegions::new(), template : "default".to_owned(), } @@ -83,7 +83,7 @@ impl Page { } #[fn_builder] - pub fn alter_body_classes(&mut self, op: ClassesOp, classes: &[impl ToString]) -> &mut Self { + pub fn alter_body_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.body_classes.alter_value(op, classes); self } From 82b28dee5cedf92a522b7078e10cdf2cdccafb85 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Sep 2023 16:22:36 +0200 Subject: [PATCH 532/853] =?UTF-8?q?=E2=9C=A8=20Add=20HTML=20unit=20handlin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html.rs | 2 ++ pagetop/src/html/unit.rs | 54 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 pagetop/src/html/unit.rs diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 18e16fea..34cb7cdb 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -25,6 +25,8 @@ pub use attribute::AttributeValue; mod classes; pub use classes::{Classes, ClassesOp}; +pub mod unit; + pub enum PrepareMarkup { None, Text(&'static str), diff --git a/pagetop/src/html/unit.rs b/pagetop/src/html/unit.rs new file mode 100644 index 00000000..44371fa3 --- /dev/null +++ b/pagetop/src/html/unit.rs @@ -0,0 +1,54 @@ +use crate::concat_string; + +// About pixels: Pixels (px) are relative to the viewing device. For low-dpi devices, 1px is one +// device pixel (dot) of the display. For printers and high resolution screens 1px implies multiple +// device pixels. + +// About em: 2em means 2 times the size of the current font. The em and rem units are practical in +// creating perfectly scalable layout! + +// About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. + +#[rustfmt::skip] +#[derive(Default)] +pub enum Value { + #[default] + None, + Auto, + + Cm(isize), // Centimeters. + In(isize), // Inches (1in = 96px = 2.54cm). + Mm(isize), // Millimeters. + Pc(isize), // Picas (1pc = 12pt). + Pt(isize), // Points (1pt = 1/72 of 1in). + Px(isize), // Pixels (1px = 1/96th of 1in). + + RelEm(f32), // Relative to the font-size of the element. + RelPct(f32), // Percentage relative to the parent element. + RelRem(f32), // Relative to font-size of the root element. + RelVh(f32), // Relative to 1% of the height of the viewport. + RelVw(f32), // Relative to 1% of the value of the viewport. +} + +#[rustfmt::skip] +impl ToString for Value { + fn to_string(&self) -> String { + match self { + Value::None => "".to_owned(), + Value::Auto => "auto".to_owned(), + // Absolute value. + Value::Cm(av) => concat_string!(av.to_string(), "cm"), + Value::In(av) => concat_string!(av.to_string(), "in"), + Value::Mm(av) => concat_string!(av.to_string(), "mm"), + Value::Pc(av) => concat_string!(av.to_string(), "pc"), + Value::Pt(av) => concat_string!(av.to_string(), "pt"), + Value::Px(av) => concat_string!(av.to_string(), "px"), + // Relative value. + Value::RelEm(rv) => concat_string!(rv.to_string(), "em"), + Value::RelPct(rv) => concat_string!(rv.to_string(), "%"), + Value::RelRem(rv) => concat_string!(rv.to_string(), "rem"), + Value::RelVh(rv) => concat_string!(rv.to_string(), "vh"), + Value::RelVw(rv) => concat_string!(rv.to_string(), "vw"), + } + } +} From 4b9b36ed6e0bedaa879dfcc1f876a00ebaddb1f4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Sep 2023 18:53:57 +0200 Subject: [PATCH 533/853] =?UTF-8?q?=F0=9F=94=A5=20Remove=20ReplaceIfExists?= =?UTF-8?q?=20class=20operation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html/classes.rs | 38 +++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/classes.rs index 9f06d38e..c7fd6154 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/classes.rs @@ -18,7 +18,6 @@ pub enum ClassesOp { Add, Remove, Replace(String), - ReplaceIfExists(String), Reset, } @@ -63,20 +62,22 @@ impl Classes { self.0.retain(|(c, _)| c.ne(&name.to_string())); } } - ClassesOp::Replace(class) => { - match self.0.iter().position(|(c, _)| c.eq(&class)) { - Some(pos) => { - let (_, class_type) = self.0.remove(pos); - self.add(&classes, pos, class_type); + ClassesOp::Replace(classes_to_replace) => { + let mut pos = self.0.len(); + let mut class_type = ClassType::User; + let replace: Vec<&str> = classes_to_replace.split_ascii_whitespace().collect(); + for class in replace { + if let Some(replace_pos) = self.0.iter().position(|(c, _)| c.eq(class)) { + let (_, replace_type) = self.0.remove(replace_pos); + if pos > replace_pos { + pos = replace_pos; + } + if replace_type.eq(&ClassType::Default) { + class_type = replace_type; + } } - None => self.add(&classes, self.0.len(), ClassType::User), - }; - } - ClassesOp::ReplaceIfExists(class) => { - if let Some(pos) = self.0.iter().position(|(c, _)| c.eq(&class)) { - let (_, class_type) = self.0.remove(pos); - self.add(&classes, pos, class_type); } + self.add(&classes, pos, class_type); } ClassesOp::Reset => { self.0.retain(|(_, t)| t.ne(&ClassType::User)); @@ -88,17 +89,22 @@ impl Classes { #[inline] fn add(&mut self, classes: &Vec<&str>, mut pos: usize, class_type: ClassType) { for class in classes { - if !class.is_empty() && self.0.iter().position(|(c, _)| c.eq(class)).is_none() { + if !class.is_empty() && !self.0.iter().any(|(c, _)| c.eq(class)) { self.0.insert(pos, (class.to_string(), class_type.clone())); - pos = pos + 1; + pos += 1; } } } // Classes GETTERS. + pub fn exists(&self, class: impl Into<String>) -> bool { + let class: String = class.into(); + self.0.iter().any(|(c, _)| c.eq(&class)) + } + pub fn get(&self) -> Option<String> { - if self.0.len() == 0 { + if self.0.is_empty() { None } else { Some( From 156429beb06b8d82c4f9a8e543effd7ccdded3b5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Sep 2023 19:01:19 +0200 Subject: [PATCH 534/853] =?UTF-8?q?=F0=9F=9A=A7=20[minimal]=20Replace=20gr?= =?UTF-8?q?id=20system=20by=20flexbox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 6 +- pagetop-bulmix/src/lib.rs | 27 -- pagetop-homedemo/src/lib.rs | 72 ++-- pagetop-homedemo/static/css/styles.css | 44 ++- pagetop-minimal/src/component.rs | 1 - pagetop-minimal/src/component/flex.rs | 321 ++++++++++++++++ .../src/component/flex/container.rs | 94 ++++- pagetop-minimal/src/component/flex/item.rs | 178 +++++---- pagetop-minimal/src/component/grid.rs | 4 - pagetop-minimal/src/component/grid/column.rs | 175 --------- pagetop-minimal/src/component/grid/row.rs | 115 ------ pagetop-minimal/src/lib.rs | 30 +- pagetop-minimal/static/css/flex.css | 361 ++++++++++++++++++ 13 files changed, 962 insertions(+), 466 deletions(-) delete mode 100644 pagetop-minimal/src/component/grid.rs delete mode 100644 pagetop-minimal/src/component/grid/column.rs delete mode 100644 pagetop-minimal/src/component/grid/row.rs create mode 100644 pagetop-minimal/static/css/flex.css diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 27164b3e..ef58737e 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -57,9 +57,9 @@ pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalE .with_in("top-menu", top_menu) .with_in( "content", - grid::Row::new() - .with_column(grid::Column::new().with_component(side_menu)) - .with_column(grid::Column::new().with_component(Html::with(html! { + flex::Container::new() + .with_item(flex::Item::new().with_component(side_menu)) + .with_item(flex::Item::new().with_component(Html::with(html! { p { "Columna 2"} }))), ) diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 83a649f1..f34d98a2 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -87,33 +87,6 @@ impl ThemeTrait for Bulmix { }, ); } - grid::COMPONENT_GRID_COLUMN => { - let col = component_as_mut::<grid::Column>(component); - col.alter_classes(ClassesOp::SetDefault, "column"); - col.alter_classes( - ClassesOp::AddDefault, - match col.size() { - grid::ColumnSize::Default => "", - grid::ColumnSize::Is1of12 => "is-1", - grid::ColumnSize::Is2of12 => "is-2", - grid::ColumnSize::Is3of12 => "is-3", - grid::ColumnSize::Is4of12 => "is-4", - grid::ColumnSize::Is5of12 => "is-5", - grid::ColumnSize::Is6of12 => "is-6", - grid::ColumnSize::Is7of12 => "is-7", - grid::ColumnSize::Is8of12 => "is-8", - grid::ColumnSize::Is9of12 => "is-9", - grid::ColumnSize::Is10of12 => "is-10", - grid::ColumnSize::Is11of12 => "is-11", - grid::ColumnSize::IsFull => "is-12", - } - ); - col.alter_classes(ClassesOp::AddDefault, "content"); - } - grid::COMPONENT_GRID_ROW => { - let row = component_as_mut::<grid::Row>(component); - row.alter_classes(ClassesOp::SetDefault, "columns"); - } _ => {} } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 5c8f4a07..0e074a65 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,5 +1,7 @@ use pagetop::prelude::*; + use pagetop_minimal::component::*; +use pagetop_minimal::BreakPoint; new_handle!(MODULE_HOMEDEMO); @@ -49,11 +51,12 @@ async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { fn hello_world() -> Container { Container::header().with_id("hello-world").with_component( - grid::Row::new() - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "hello-col-text") - .with_size(grid::ColumnSize::Is5of12) + flex::Container::new() + .with_direction(flex::Direction::Column(BreakPoint::MD)) + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "hello-col-text") + .with_size(flex::ItemSize::Percent40) .with_component( Heading::h1(L10n::t("page_title", &LOCALES_HOMEDEMO)) .with_display(HeadingDisplay::Medium), @@ -92,9 +95,10 @@ fn hello_world() -> Container { .with_classes(ClassesOp::Add, "welcome-link"), ), ) - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "hello-col-image") + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "hello-col-image") + .with_size(flex::ItemSize::Percent60) .with_component(Image::with("/homedemo/images/header.svg")), ), ) @@ -124,16 +128,17 @@ fn welcome() -> Container { fn about_pagetop() -> Container { Container::new().with_id("pagetop").with_component( - grid::Row::new() - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "pagetop-col-image") - .with_size(grid::ColumnSize::Is5of12) + flex::Container::new() + .with_direction(flex::Direction::Column(BreakPoint::SM)) + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "pagetop-col-image") + .with_size(flex::ItemSize::Percent40) .with_component(Image::with("/homedemo/images/about.svg")), ) - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "pagetop-col-text") + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "pagetop-col-text") .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALES_HOMEDEMO))) .with_component( Paragraph::with(L10n::t("pagetop_text1", &LOCALES_HOMEDEMO)) @@ -150,10 +155,12 @@ fn about_pagetop() -> Container { fn promo_pagetop() -> Container { Container::new().with_id("promo").with_component( - grid::Row::new() - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "promo-col-text") + flex::Container::new() + .with_direction(flex::Direction::Column(BreakPoint::MD)) + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "promo-col-text") + .with_size(flex::ItemSize::Percent60) .with_component(Heading::h2(L10n::t( "pagetop_promo_title", &LOCALES_HOMEDEMO, @@ -171,10 +178,10 @@ fn promo_pagetop() -> Container { .with_display(ParagraphDisplay::Small), ), ) - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "promo-col-image") - .with_size(grid::ColumnSize::Is6of12) + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "promo-col-image") + .with_size(flex::ItemSize::Percent40) .with_component(Image::with("/homedemo/images/pagetop.png")), ), ) @@ -182,16 +189,17 @@ fn promo_pagetop() -> Container { fn reporting_issues() -> Container { Container::new().with_id("reporting").with_component( - grid::Row::new() - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "reporting-col-image") + flex::Container::new() + .with_direction(flex::Direction::Column(BreakPoint::MD)) + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "reporting-col-image") .with_component(Image::with("/homedemo/images/support.jpg")), ) - .with_column( - grid::Column::new() - .with_classes(ClassesOp::Add, "reporting-col-text") - .with_size(grid::ColumnSize::Is6of12) + .with_item( + flex::Item::new() + .with_inner_classes(ClassesOp::Add, "reporting-col-text") + .with_size(flex::ItemSize::Percent50) .with_component(Heading::h2(L10n::t( "report_problems_title", &LOCALES_HOMEDEMO, diff --git a/pagetop-homedemo/static/css/styles.css b/pagetop-homedemo/static/css/styles.css index 8db5d8d2..f51c5e86 100644 --- a/pagetop-homedemo/static/css/styles.css +++ b/pagetop-homedemo/static/css/styles.css @@ -33,6 +33,9 @@ body.default-homepage [class$="-col-image"] { display: inline-block; vertical-align: middle; } +#hello-world .hello-col-image { + padding-top: 3em; +} #welcome > div.container { padding: 2rem 1rem; @@ -53,25 +56,21 @@ body.default-homepage [class$="-col-image"] { border-radius: 40px; } -/* Responsiveness */ -@media (min-width: 768px) { +/* BREAKPOINTS */ + +/* MD - Applies <= 768px */ +@media screen and (min-width: 48em) { body.default-homepage [class$="-col-image"] { padding-top: 5%; } - #hello-world .hello-col-text { + #reporting .reporting-col-text { padding-left: 1rem; - padding-right: 1rem; - } - #hello-world .hello-col-image { - padding-top: 3rem; + text-align: left; } } -@media (min-width: 992px) { - body.default-homepage [class$="-col-image"] { - padding-top: 1rem; - } - +/* LG - Applies >= 1024px */ +@media screen and (min-width: 64em) { #hello-world .hello-col-text { padding-top: 2rem; padding-left: 10%; @@ -86,18 +85,25 @@ body.default-homepage [class$="-col-image"] { padding: 2rem 8rem; } - #pagetop .pagetop-col-text { - padding-left: 2rem; - text-align: left; - } - #promo .promo-col-text { + padding-top: 1rem; padding-right: 0; text-align: right; } +} +/* XL - Applies >= 1280px */ +@media screen and (min-width: 80em) { + body.default-homepage [class$="-col-image"] { + padding-top: 1rem; + } - #reporting .reporting-col-text { - padding-left: 1rem; + #hello-world .hello-col-text { + padding-top: 4rem; + } + + #pagetop .pagetop-col-text { + padding-top: 3rem; + padding-left: 3rem; text-align: left; } } diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 1f86bde5..472e4b7f 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -2,7 +2,6 @@ mod container; pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; pub mod flex; -pub mod grid; mod icon; pub use icon::{Icon, COMPONENT_ICON}; diff --git a/pagetop-minimal/src/component/flex.rs b/pagetop-minimal/src/component/flex.rs index 1025c13f..b34e5642 100644 --- a/pagetop-minimal/src/component/flex.rs +++ b/pagetop-minimal/src/component/flex.rs @@ -2,3 +2,324 @@ mod container; pub use container::{Container, COMPONENT_FLEX_CONTAINER}; mod item; pub use item::{Item, COMPONENT_FLEX_ITEM}; + +use pagetop::concat_string; +use pagetop::html::unit; + +use crate::BreakPoint; + +// ************************************************************************************************* + +#[derive(Default)] +pub enum Direction { + #[default] + Default, + Row(BreakPoint), + RowReverse(BreakPoint), + Column(BreakPoint), + ColumnReverse(BreakPoint), +} + +#[rustfmt::skip] +impl ToString for Direction { + fn to_string(&self) -> String { + match self { + Direction::Default => { + concat_string!("flex-container flex-row ", BreakPoint::default().to_string()) + } + Direction::Row(breakpoint) => { + concat_string!("flex-container flex-row ", breakpoint.to_string()) + } + Direction::RowReverse(breakpoint) => { + concat_string!("flex-container flex-row flex-reverse ", breakpoint.to_string()) + } + Direction::Column(breakpoint) => { + concat_string!("flex-container flex-col ", breakpoint.to_string()) + } + Direction::ColumnReverse(breakpoint) => { + concat_string!("flex-container flex-col flex-reverse ", breakpoint.to_string()) + } + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum WrapAlign { + #[default] + Default, + NoWrap, + Wrap(ContentAlign), + WrapReverse(ContentAlign), +} + +#[rustfmt::skip] +impl ToString for WrapAlign { + fn to_string(&self) -> String { + match self { + WrapAlign::Default => "".to_string(), + WrapAlign::NoWrap => "flex-nowrap".to_string(), + WrapAlign::Wrap(a) => concat_string!("flex-wrap ", a.to_string()), + WrapAlign::WrapReverse(a) => concat_string!("flex-wrap-reverse ", a.to_string()), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ContentAlign { + #[default] + Default, + Start, + End, + Center, + Stretch, + SpaceBetween, + SpaceAround, +} + +#[rustfmt::skip] +impl ToString for ContentAlign { + fn to_string(&self) -> String { + match self { + ContentAlign::Default => "".to_string(), + ContentAlign::Start => "flex-align-start".to_string(), + ContentAlign::End => "flex-align-end".to_string(), + ContentAlign::Center => "flex-align-center".to_string(), + ContentAlign::Stretch => "flex-align-stretch".to_string(), + ContentAlign::SpaceBetween => "flex-align-space-between".to_string(), + ContentAlign::SpaceAround => "flex-align-space-around".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ContentJustify { + #[default] + Default, + Start, + End, + Center, + SpaceBetween, + SpaceAround, + SpaceEvenly, +} + +#[rustfmt::skip] +impl ToString for ContentJustify { + fn to_string(&self) -> String { + match self { + ContentJustify::Default => "".to_string(), + ContentJustify::Start => "flex-justify-start".to_string(), + ContentJustify::End => "flex-justify-end".to_string(), + ContentJustify::Center => "flex-justify-center".to_string(), + ContentJustify::SpaceBetween => "flex-justify-space-between".to_string(), + ContentJustify::SpaceAround => "flex-justify-space-around".to_string(), + ContentJustify::SpaceEvenly => "flex-justify-space-evenly".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemAlign { + #[default] + Default, + Top, + Bottom, + Middle, + Stretch, + Baseline, +} + +#[rustfmt::skip] +impl ToString for ItemAlign { + fn to_string(&self) -> String { + match self { + ItemAlign::Default => "".to_string(), + ItemAlign::Top => "flex-item-top".to_string(), + ItemAlign::Bottom => "flex-item-bottom".to_string(), + ItemAlign::Middle => "flex-item-middle".to_string(), + ItemAlign::Stretch => "flex-item-stretch".to_string(), + ItemAlign::Baseline => "flex-item-baseline".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum Gap { + #[default] + Default, + Row(unit::Value), + Column(unit::Value), + Distinct(unit::Value, unit::Value), + Both(unit::Value), +} + +#[rustfmt::skip] +impl ToString for Gap { + fn to_string(&self) -> String { + match self { + Gap::Default => "".to_string(), + Gap::Row(r) => concat_string!("row-gap: ", r.to_string(), ";"), + Gap::Column(c) => concat_string!("column-gap: ", c.to_string(), ";"), + Gap::Distinct(r, c) => concat_string!("gap: ", r.to_string(), " ", c.to_string(), ";"), + Gap::Both(v) => concat_string!("gap: ", v.to_string(), ";"), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemGrow { + #[default] + Default, + Is1, + Is2, + Is3, + Is4, + Is5, + Is6, + Is7, + Is8, + Is9, +} + +#[rustfmt::skip] +impl ToString for ItemGrow { + fn to_string(&self) -> String { + match self { + ItemGrow::Default => "".to_string(), + ItemGrow::Is1 => "flex-grow-1".to_string(), + ItemGrow::Is2 => "flex-grow-2".to_string(), + ItemGrow::Is3 => "flex-grow-3".to_string(), + ItemGrow::Is4 => "flex-grow-4".to_string(), + ItemGrow::Is5 => "flex-grow-5".to_string(), + ItemGrow::Is6 => "flex-grow-6".to_string(), + ItemGrow::Is7 => "flex-grow-7".to_string(), + ItemGrow::Is8 => "flex-grow-8".to_string(), + ItemGrow::Is9 => "flex-grow-9".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemShrink { + #[default] + Default, + Is1, + Is2, + Is3, + Is4, + Is5, + Is6, + Is7, + Is8, + Is9, +} + +#[rustfmt::skip] +impl ToString for ItemShrink { + fn to_string(&self) -> String { + match self { + ItemShrink::Default => "".to_string(), + ItemShrink::Is1 => "flex-shrink-1".to_string(), + ItemShrink::Is2 => "flex-shrink-2".to_string(), + ItemShrink::Is3 => "flex-shrink-3".to_string(), + ItemShrink::Is4 => "flex-shrink-4".to_string(), + ItemShrink::Is5 => "flex-shrink-5".to_string(), + ItemShrink::Is6 => "flex-shrink-6".to_string(), + ItemShrink::Is7 => "flex-shrink-7".to_string(), + ItemShrink::Is8 => "flex-shrink-8".to_string(), + ItemShrink::Is9 => "flex-shrink-9".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemSize { + #[default] + Default, + Percent10, + Percent20, + Percent25, + Percent33, + Percent40, + Percent50, + Percent60, + Percent66, + Percent75, + Percent80, + Percent90, +} + +#[rustfmt::skip] +impl ToString for ItemSize { + fn to_string(&self) -> String { + match self { + ItemSize::Default => "".to_string(), + ItemSize::Percent10 => "flex-width-10".to_string(), + ItemSize::Percent20 => "flex-width-20".to_string(), + ItemSize::Percent25 => "flex-width-25".to_string(), + ItemSize::Percent33 => "flex-width-33".to_string(), + ItemSize::Percent40 => "flex-width-40".to_string(), + ItemSize::Percent50 => "flex-width-50".to_string(), + ItemSize::Percent60 => "flex-width-60".to_string(), + ItemSize::Percent66 => "flex-width-66".to_string(), + ItemSize::Percent75 => "flex-width-75".to_string(), + ItemSize::Percent80 => "flex-width-80".to_string(), + ItemSize::Percent90 => "flex-width-90".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemOffset { + #[default] + Default, + Offset10, + Offset20, + Offset25, + Offset33, + Offset40, + Offset50, + Offset60, + Offset66, + Offset75, + Offset80, + Offset90, +} + +#[rustfmt::skip] +impl ToString for ItemOffset { + fn to_string(&self) -> String { + match self { + ItemOffset::Default => "".to_string(), + ItemOffset::Offset10 => "flex-offset-10".to_string(), + ItemOffset::Offset20 => "flex-offset-20".to_string(), + ItemOffset::Offset25 => "flex-offset-25".to_string(), + ItemOffset::Offset33 => "flex-offset-33".to_string(), + ItemOffset::Offset40 => "flex-offset-40".to_string(), + ItemOffset::Offset50 => "flex-offset-50".to_string(), + ItemOffset::Offset60 => "flex-offset-60".to_string(), + ItemOffset::Offset66 => "flex-offset-66".to_string(), + ItemOffset::Offset75 => "flex-offset-75".to_string(), + ItemOffset::Offset80 => "flex-offset-80".to_string(), + ItemOffset::Offset90 => "flex-offset-90".to_string(), + } + } +} diff --git a/pagetop-minimal/src/component/flex/container.rs b/pagetop-minimal/src/component/flex/container.rs index 54610dc0..b36c0c55 100644 --- a/pagetop-minimal/src/component/flex/container.rs +++ b/pagetop-minimal/src/component/flex/container.rs @@ -9,17 +9,22 @@ actions_for_component!(Container); #[rustfmt::skip] #[derive(Default)] pub struct Container { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - items : TypedComponents<flex::Item>, - template : String, + weight : Weight, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + items : TypedComponents<flex::Item>, + direction : flex::Direction, + wrap_align : flex::WrapAlign, + content_justify: flex::ContentJustify, + items_align : flex::ItemAlign, + gap : flex::Gap, } impl ComponentTrait for Container { fn new() -> Self { - Container::default().with_classes(ClassesOp::SetDefault, "flex") + Container::default() + .with_classes(ClassesOp::SetDefault, flex::Direction::Default.to_string()) } fn handle(&self) -> Handle { @@ -43,8 +48,15 @@ impl ComponentTrait for Container { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + cx.set_param::<bool>(crate::PARAM_MINIMAL_FLEX, true); + + let gap = match self.gap() { + flex::Gap::Default => None, + _ => Some(self.gap().to_string()), + }; + PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] { + div id=[self.id()] class=[self.classes().get()] style=[gap] { (self.items().prepare(cx)) } }) @@ -77,7 +89,7 @@ impl Container { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } @@ -94,8 +106,48 @@ impl Container { } #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); + pub fn alter_direction(&mut self, direction: flex::Direction) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.direction.to_string()), + direction.to_string(), + ); + self.direction = direction; + self + } + + #[fn_builder] + pub fn alter_wrap_align(&mut self, wrap: flex::WrapAlign) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.wrap_align.to_string()), + wrap.to_string(), + ); + self.wrap_align = wrap; + self + } + + #[fn_builder] + pub fn alter_content_justify(&mut self, justify: flex::ContentJustify) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.content_justify.to_string()), + justify.to_string(), + ); + self.content_justify = justify; + self + } + + #[fn_builder] + pub fn alter_items_align(&mut self, align: flex::ItemAlign) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.items_align.to_string()), + align.to_string(), + ); + self.items_align = align; + self + } + + #[fn_builder] + pub fn alter_gap(&mut self, gap: flex::Gap) -> &mut Self { + self.gap = gap; self } @@ -109,7 +161,23 @@ impl Container { &self.items } - pub fn template(&self) -> &str { - self.template.as_str() + pub fn direction(&self) -> &flex::Direction { + &self.direction + } + + pub fn wrap_align(&self) -> &flex::WrapAlign { + &self.wrap_align + } + + pub fn content_justify(&self) -> &flex::ContentJustify { + &self.content_justify + } + + pub fn items_align(&self) -> &flex::ItemAlign { + &self.items_align + } + + pub fn gap(&self) -> &flex::Gap { + &self.gap } } diff --git a/pagetop-minimal/src/component/flex/item.rs b/pagetop-minimal/src/component/flex/item.rs index 96c43a7a..1ce15625 100644 --- a/pagetop-minimal/src/component/flex/item.rs +++ b/pagetop-minimal/src/component/flex/item.rs @@ -1,56 +1,32 @@ use pagetop::prelude::*; +use crate::component::flex; + new_handle!(COMPONENT_FLEX_ITEM); actions_for_component!(Item); -const SIZE_DEFAULT: &str = "col"; -const SIZE_1_OF_12: &str = "col-md-1"; -const SIZE_2_OF_12: &str = "col-md-2"; -const SIZE_3_OF_12: &str = "col-md-3"; -const SIZE_4_OF_12: &str = "col-md-4"; -const SIZE_5_OF_12: &str = "col-md-5"; -const SIZE_6_OF_12: &str = "col-md-6"; -const SIZE_7_OF_12: &str = "col-md-7"; -const SIZE_8_OF_12: &str = "col-md-8"; -const SIZE_9_OF_12: &str = "col-md-9"; -const SIZE_10_OF_12: &str = "col-md-10"; -const SIZE_11_OF_12: &str = "col-md-11"; -const SIZE_12_OF_12: &str = "col-md-12"; - -#[derive(Default)] -pub enum ItemSize { - #[default] - Default, - Is1of12, - Is2of12, - Is3of12, - Is4of12, - Is5of12, - Is6of12, - Is7of12, - Is8of12, - Is9of12, - Is10of12, - Is11of12, - IsFull, -} - #[rustfmt::skip] #[derive(Default)] pub struct Item { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - size : ItemSize, - stuff : ArcComponents, - template : String, + weight : Weight, + renderable : Renderable, + id : IdentifierValue, + item_classes : Classes, + inner_classes: Classes, + item_grow : flex::ItemGrow, + item_shrink : flex::ItemShrink, + item_size : flex::ItemSize, + item_offset : flex::ItemOffset, + item_align : flex::ItemAlign, + stuff : ArcComponents, } impl ComponentTrait for Item { fn new() -> Self { - Item::default().with_classes(ClassesOp::SetDefault, SIZE_DEFAULT) + Item::default() + .with_item_classes(ClassesOp::SetDefault, "flex-item") + .with_inner_classes(ClassesOp::SetDefault, "flex-item-inner") } fn handle(&self) -> Handle { @@ -74,9 +50,15 @@ impl ComponentTrait for Item { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let order = match self.weight() { + 0 => None, + _ => Some(concat_string!("order: ", self.weight().to_string(), ";")), + }; PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(cx)) + div id=[self.id()] class=[self.item_classes().get()] style=[order] { + div class=[self.inner_classes().get()] { + (self.components().prepare(cx)) + } } }) } @@ -108,30 +90,64 @@ impl Item { } #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: &str) -> &mut Self { - self.classes.alter_value(op, classes); + pub fn alter_item_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.item_classes.alter_value(op, classes); self } - #[rustfmt::skip] #[fn_builder] - pub fn alter_size(&mut self, size: ItemSize) -> &mut Self { - match size { - ItemSize::Default => self.alter_classes(ClassesOp::SetDefault, SIZE_DEFAULT), - ItemSize::Is1of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_1_OF_12), - ItemSize::Is2of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_2_OF_12), - ItemSize::Is3of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_3_OF_12), - ItemSize::Is4of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_4_OF_12), - ItemSize::Is5of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_5_OF_12), - ItemSize::Is6of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_6_OF_12), - ItemSize::Is7of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_7_OF_12), - ItemSize::Is8of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_8_OF_12), - ItemSize::Is9of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_9_OF_12), - ItemSize::Is10of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_10_OF_12), - ItemSize::Is11of12 => self.alter_classes(ClassesOp::SetDefault, SIZE_11_OF_12), - ItemSize::IsFull => self.alter_classes(ClassesOp::SetDefault, SIZE_12_OF_12), - }; - self.size = size; + pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.inner_classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_grow(&mut self, grow: flex::ItemGrow) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_grow.to_string()), + grow.to_string(), + ); + self.item_grow = grow; + self + } + + #[fn_builder] + pub fn alter_shrink(&mut self, shrink: flex::ItemShrink) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_shrink.to_string()), + shrink.to_string(), + ); + self.item_shrink = shrink; + self + } + + #[fn_builder] + pub fn alter_size(&mut self, size: flex::ItemSize) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_size.to_string()), + size.to_string(), + ); + self.item_size = size; + self + } + + #[fn_builder] + pub fn alter_offset(&mut self, offset: flex::ItemOffset) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_offset.to_string()), + offset.to_string(), + ); + self.item_offset = offset; + self + } + + #[fn_builder] + pub fn alter_align(&mut self, align: flex::ItemAlign) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_align.to_string()), + align.to_string(), + ); + self.item_align = align; self } @@ -146,27 +162,37 @@ impl Item { self } - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Item GETTERS. - pub fn classes(&self) -> &Classes { - &self.classes + pub fn item_classes(&self) -> &Classes { + &self.item_classes } - pub fn size(&self) -> &ItemSize { - &self.size + pub fn inner_classes(&self) -> &Classes { + &self.inner_classes + } + + pub fn grow(&self) -> &flex::ItemGrow { + &self.item_grow + } + + pub fn shrink(&self) -> &flex::ItemShrink { + &self.item_shrink + } + + pub fn size(&self) -> &flex::ItemSize { + &self.item_size + } + + pub fn offset(&self) -> &flex::ItemOffset { + &self.item_offset + } + + pub fn align(&self) -> &flex::ItemAlign { + &self.item_align } pub fn components(&self) -> &ArcComponents { &self.stuff } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop-minimal/src/component/grid.rs b/pagetop-minimal/src/component/grid.rs deleted file mode 100644 index 107af499..00000000 --- a/pagetop-minimal/src/component/grid.rs +++ /dev/null @@ -1,4 +0,0 @@ -mod row; -pub use row::{Row, COMPONENT_GRID_ROW}; -mod column; -pub use column::{Column, ColumnSize, COMPONENT_GRID_COLUMN}; diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs deleted file mode 100644 index 9acbe438..00000000 --- a/pagetop-minimal/src/component/grid/column.rs +++ /dev/null @@ -1,175 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_GRID_COLUMN); - -actions_for_component!(Column); - -const SIZE_DEFAULT: &str = "col"; -const SIZE_1_OF_12: &str = "col-md-1"; -const SIZE_2_OF_12: &str = "col-md-2"; -const SIZE_3_OF_12: &str = "col-md-3"; -const SIZE_4_OF_12: &str = "col-md-4"; -const SIZE_5_OF_12: &str = "col-md-5"; -const SIZE_6_OF_12: &str = "col-md-6"; -const SIZE_7_OF_12: &str = "col-md-7"; -const SIZE_8_OF_12: &str = "col-md-8"; -const SIZE_9_OF_12: &str = "col-md-9"; -const SIZE_10_OF_12: &str = "col-md-10"; -const SIZE_11_OF_12: &str = "col-md-11"; -const SIZE_12_OF_12: &str = "col-md-12"; - -#[derive(Default)] -pub enum ColumnSize { - #[default] - Default, - Is1of12, - Is2of12, - Is3of12, - Is4of12, - Is5of12, - Is6of12, - Is7of12, - Is8of12, - Is9of12, - Is10of12, - Is11of12, - IsFull, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Column { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - size : ColumnSize, - stuff : ArcComponents, - template : String, -} - -impl ComponentTrait for Column { - fn new() -> Self { - Column::default().with_classes(ClassesOp::SetDefault, SIZE_DEFAULT) - } - - fn handle(&self) -> Handle { - COMPONENT_GRID_COLUMN - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_column(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(cx)) - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_column(self, cx); - } -} - -impl Column { - // Column BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[rustfmt::skip] - #[fn_builder] - pub fn alter_size(&mut self, size: ColumnSize) -> &mut Self { - self.alter_classes( - ClassesOp::SetDefault, - match size { - ColumnSize::Default => SIZE_DEFAULT, - ColumnSize::Is1of12 => SIZE_1_OF_12, - ColumnSize::Is2of12 => SIZE_2_OF_12, - ColumnSize::Is3of12 => SIZE_3_OF_12, - ColumnSize::Is4of12 => SIZE_4_OF_12, - ColumnSize::Is5of12 => SIZE_5_OF_12, - ColumnSize::Is6of12 => SIZE_6_OF_12, - ColumnSize::Is7of12 => SIZE_7_OF_12, - ColumnSize::Is8of12 => SIZE_8_OF_12, - ColumnSize::Is9of12 => SIZE_9_OF_12, - ColumnSize::Is10of12 => SIZE_10_OF_12, - ColumnSize::Is11of12 => SIZE_11_OF_12, - ColumnSize::IsFull => SIZE_12_OF_12, - } - ); - self.size = size; - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); - self - } - - #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Column GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn size(&self) -> &ColumnSize { - &self.size - } - - pub fn components(&self) -> &ArcComponents { - &self.stuff - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs deleted file mode 100644 index e2be6ca7..00000000 --- a/pagetop-minimal/src/component/grid/row.rs +++ /dev/null @@ -1,115 +0,0 @@ -use pagetop::prelude::*; - -use crate::component::grid; - -new_handle!(COMPONENT_GRID_ROW); - -actions_for_component!(Row); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Row { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - cols : TypedComponents<grid::Column>, - template : String, -} - -impl ComponentTrait for Row { - fn new() -> Self { - Row::default().with_classes(ClassesOp::SetDefault, "row") - } - - fn handle(&self) -> Handle { - COMPONENT_GRID_ROW - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_row(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] { - (self.columns().prepare(cx)) - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_row(self, cx); - } -} - -impl Row { - // Row BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - pub fn with_column(mut self, column: grid::Column) -> Self { - self.cols.alter(TypedOp::Add(TypedComponent::with(column))); - self - } - - #[fn_builder] - pub fn alter_columns(&mut self, op: TypedOp<grid::Column>) -> &mut Self { - self.cols.alter(op); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Row GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn columns(&self) -> &TypedComponents<grid::Column> { - &self.cols - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs index 8384ee11..f19e3ba0 100644 --- a/pagetop-minimal/src/lib.rs +++ b/pagetop-minimal/src/lib.rs @@ -12,7 +12,35 @@ static_files!(minimal); const VERSION_MINIMAL: &str = env!("CARGO_PKG_VERSION"); // Context parameter. -const PARAM_MINIMAL_ASSETS: &str = "minimal.assets"; +const PARAM_MINIMAL_FLEX: &str = "minimal.flex"; + +#[rustfmt::skip] +#[derive(Default)] +pub enum BreakPoint { + #[default] + None, /* Does not apply */ + SM, /* @media screen and (max-width: 35.5em) - Applies <= 568px */ + MD, /* @media screen and (max-width: 48em) - Applies <= 768px */ + LG, /* @media screen and (max-width: 64em) - Applies <= 1024px */ + XL, /* @media screen and (max-width: 80em) - Applies <= 1280px */ + X2L, /* @media screen and (max-width: 120em) - Applies <= 1920px */ + X3L, /* @media screen and (max-width: 160em) - Applies <= 2560px */ +} + +#[rustfmt::skip] +impl ToString for BreakPoint { + fn to_string(&self) -> String { + match self { + BreakPoint::None => "bp-no".to_string(), + BreakPoint::SM => "bp-sm".to_string(), + BreakPoint::MD => "bp-md".to_string(), + BreakPoint::LG => "bp-lg".to_string(), + BreakPoint::XL => "bp-xl".to_string(), + BreakPoint::X2L => "bp-x2l".to_string(), + BreakPoint::X3L => "bp-x3l".to_string(), + } + } +} pub struct Minimal; diff --git a/pagetop-minimal/static/css/flex.css b/pagetop-minimal/static/css/flex.css new file mode 100644 index 00000000..81a4a331 --- /dev/null +++ b/pagetop-minimal/static/css/flex.css @@ -0,0 +1,361 @@ +/* CONTAINERS */ + +.flex-container { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + position: relative; + max-width: 100%; + width: 100%; + padding: 0; +} +.flex-row, +.flex-col.bp-no { + flex-direction: column; +} +.flex-row.flex-reverse, +.flex-col.flex-reverse.bp-no { + flex-direction: column-reverse; +} +.flex-col, +.flex.row.bp-no { + flex-direction: row; +} +.flex-col.flex-reverse, +.flex-row.flex-reverse.bp-no { + flex-direction: row-reverse; +} + +.flex-container.flex-wrap { + flex-wrap: wrap; + align-content: flex-start; +} +.flex-container.flex-wrap-reverse { + flex-wrap: wrap-reverse; + align-content: flex-start; +} + +.flex-container.flex-align-end { + align-content: flex-end; +} +.flex-container.flex-align-center { + align-content: center; +} +.flex-container.flex-align-stretch { + align-content: stretch; +} +.flex-container.flex-align-space-between { + align-content: space-between; +} +.flex-container.flex-align-space-around { + align-content: space-around; +} + +.flex-container.flex-justify-end { + justify-content: flex-end; +} +.flex-container.flex-justify-center { + justify-content: center; +} +.flex-container.flex-justify-space-between { + justify-content: space-between; +} +.flex-container.flex-justify-space-around { + justify-content: space-around; +} +.flex-container.flex-justify-space-evenly { + justify-content: space-evenly; +} + +.flex-container.flex-item-bottom { + align-items: flex-end; +} +.flex-container.flex-item-middle { + align-items: center; +} +.flex-container.flex-item-stretch { + align-items: stretch; +} +.flex-container.flex-item-baseline { + align-items: baseline; +} + +/* ITEMS */ + +.flex-item { + padding: 0 !important; +} + +.flex-item.flex-grow-1 { + flex-grow: 1; +} +.flex-item.flex-grow-2 { + flex-grow: 2; +} +.flex-item.flex-grow-3 { + flex-grow: 3; +} +.flex-item.flex-grow-4 { + flex-grow: 4; +} +.flex-item.flex-grow-5 { + flex-grow: 5; +} +.flex-item.flex-grow-6 { + flex-grow: 6; +} +.flex-item.flex-grow-7 { + flex-grow: 7; +} +.flex-item.flex-grow-8 { + flex-grow: 8; +} +.flex-item.flex-grow-9 { + flex-grow: 9; +} + +.flex-item.flex-shrink-1 { + flex-shrink: 1; +} +.flex-item.flex-shrink-2 { + flex-shrink: 2; +} +.flex-item.flex-shrink-3 { + flex-shrink: 3; +} +.flex-item.flex-shrink-4 { + flex-shrink: 4; +} +.flex-item.flex-shrink-5 { + flex-shrink: 5; +} +.flex-item.flex-shrink-6 { + flex-shrink: 6; +} +.flex-item.flex-shrink-7 { + flex-shrink: 7; +} +.flex-item.flex-shrink-8 { + flex-shrink: 8; +} +.flex-item.flex-shrink-9 { + flex-shrink: 9; +} + +.flex-item.flex-width-10 { + flex: 0 0 10%; + max-width: 10%; +} +.flex-item.flex-width-20 { + flex: 0 0 20%; + max-width: 20%; +} +.flex-item.flex-width-25 { + flex: 0 0 25%; + max-width: 25%; +} +.flex-item.flex-width-33 { + flex: 0 0 33.3333%; + max-width: 33.3333%; +} +.flex-item.flex-width-40 { + flex: 0 0 40%; + max-width: 40%; +} +.flex-item.flex-width-50 { + flex: 0 0 60%; + max-width: 50%; +} +.flex-item.flex-width-60 { + flex: 0 0 60%; + max-width: 60%; +} +.flex-item.flex-width-66 { + flex: 0 0 66.6666%; + max-width: 66.6666%; +} +.flex-item.flex-width-75 { + flex: 0 0 75%; + max-width: 75%; +} +.flex-item.flex-width-80 { + flex: 0 0 80%; + max-width: 80%; +} +.flex-item.flex-width-90 { + flex: 0 0 90%; + max-width: 90%; +} + +.flex-item.flex-offset-10 { + margin-left: 10%; +} +.flex-item.flex-offset-20 { + margin-left: 20%; +} +.flex-item.flex-offset-25 { + margin-left: 25%; +} +.flex-item.flex-offset-33 { + margin-left: 33.3333%; +} +.flex-item.flex-offset-40 { + margin-left: 40%; +} +.flex-item.flex-offset-50 { + margin-left: 50%; +} +.flex-item.flex-offset-60 { + margin-left: 60%; +} +.flex-item.flex-offset-66 { + margin-left: 66.6666%; +} +.flex-item.flex-offset-75 { + margin-left: 75%; +} +.flex-item.flex-offset-80 { + margin-left: 80%; +} +.flex-item.flex-offset-90 { + margin-left: 90%; +} + +.flex-item.flex-item-top { + align-self: flex-start; +} +.flex-item.flex-item-bottom { + align-self: flex-end; +} +.flex-item.flex-item-middle { + align-self: center; +} +.flex-item.flex-item-stretch { + align-self: stretch; +} +.flex-item.flex-item-baseline { + align-self: baseline; +} + +/* BREAKPOINTS */ + +/* SM - Applies <= 568px */ +@media screen and (max-width: 35.5em) { + .flex-row.bp-sm { + flex-direction: row; + } + .flex-row.flex-reverse.bp-sm { + flex-direction: row-reverse; + } + .flex-col.bp-sm { + flex-direction: column; + } + .flex-col.flex-reverse.bp-sm { + flex-direction: column-reverse; + } + .flex-col.bp-sm .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* MD - Applies <= 768px */ +@media screen and (max-width: 48em) { + .flex-row.bp-md { + flex-direction: row; + } + .flex-row.flex-reverse.bp-md { + flex-direction: row-reverse; + } + .flex-col.bp-md { + flex-direction: column; + } + .flex-col.flex-reverse.bp-md { + flex-direction: column-reverse; + } + .flex-col.bp-md .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* LG - Applies <= 1024px */ +@media screen and (max-width: 64em) { + .flex-row.bp-lg { + flex-direction: row; + } + .flex-row.flex-reverse.bp-lg { + flex-direction: row-reverse; + } + .flex-col.bp-lg { + flex-direction: column; + } + .flex-col.flex-reverse.bp-lg { + flex-direction: column-reverse; + } + .flex-col.bp-lg .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* XL - Applies <= 1280px */ +@media screen and (max-width: 80em) { + .flex-row.bp-xl { + flex-direction: row; + } + .flex-row.flex-reverse.bp-xl { + flex-direction: row-reverse; + } + .flex-col.bp-xl { + flex-direction: column; + } + .flex-col.flex-reverse.bp-xl { + flex-direction: column-reverse; + } + .flex-col.bp-xl .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* X2L - Applies <= 1920px */ +@media screen and (max-width: 120em) { + .flex-row.bp-x2l { + flex-direction: row; + } + .flex-row.flex-reverse.bp-x2l { + flex-direction: row-reverse; + } + .flex-col.bp-x2l { + flex-direction: column; + } + .flex-col.flex-reverse.bp-x2l { + flex-direction: column-reverse; + } + .flex-col.bp-x2l .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* X3L - Applies <= 2560px */ +@media screen and (max-width: 160em) { + .flex-row.bp-x3l { + flex-direction: row; + } + .flex-row.flex-reverse.bp-x3l { + flex-direction: row-reverse; + } + .flex-col.bp-x3l { + flex-direction: column; + } + .flex-col.flex-reverse.bp-x3l { + flex-direction: column-reverse; + } + .flex-col.bp-x3l .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} From 7e21ddbf90918139eeea334ded99749297a15e49 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Sep 2023 22:38:33 +0200 Subject: [PATCH 535/853] =?UTF-8?q?=F0=9F=94=A5=20Remove=20minimal=20crate?= =?UTF-8?q?=20for=20PageTop=20integration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 - README.md | 3 - pagetop-admin/Cargo.toml | 1 - pagetop-admin/src/lib.rs | 1 - pagetop-admin/src/summary.rs | 1 - pagetop-bulmix/Cargo.toml | 1 - pagetop-bulmix/src/lib.rs | 2 - pagetop-homedemo/Cargo.toml | 1 - pagetop-homedemo/src/lib.rs | 7 - pagetop-minimal/Cargo.toml | 21 - pagetop-minimal/README.md | 27 - pagetop-minimal/build.rs | 7 - pagetop-minimal/src/component.rs | 24 - pagetop-minimal/src/component/anchor.rs | 213 -- pagetop-minimal/src/component/block.rs | 130 -- pagetop-minimal/src/component/container.rs | 195 -- pagetop-minimal/src/component/flex.rs | 325 ---- .../src/component/flex/container.rs | 183 -- pagetop-minimal/src/component/flex/item.rs | 198 -- pagetop-minimal/src/component/form_element.rs | 11 - .../src/component/form_element/button.rs | 176 -- .../src/component/form_element/date.rs | 226 --- .../src/component/form_element/form.rs | 165 -- .../src/component/form_element/hidden.rs | 68 - .../src/component/form_element/input.rs | 348 ---- pagetop-minimal/src/component/heading.rs | 199 -- pagetop-minimal/src/component/icon.rs | 83 - pagetop-minimal/src/component/image.rs | 126 -- pagetop-minimal/src/component/paragraph.rs | 144 -- pagetop-minimal/src/component/powered_by.rs | 140 -- .../src/component/site_branding.rs | 142 -- pagetop-minimal/src/lib.rs | 82 - pagetop-minimal/src/locale/en-US/module.ftl | 9 - pagetop-minimal/src/locale/es-ES/module.ftl | 9 - pagetop-minimal/static/css/flex.css | 361 ---- pagetop-minimal/static/css/minimal.css | 75 - .../static/icons/bootstrap-icons.css | 1705 ----------------- .../static/icons/bootstrap-icons.woff | Bin 137216 -> 0 bytes .../static/icons/bootstrap-icons.woff2 | Bin 102380 -> 0 bytes pagetop-minimal/static/pagetop-logo.svg | 14 - pagetop-user/Cargo.toml | 1 - pagetop-user/src/lib.rs | 5 - 42 files changed, 5430 deletions(-) delete mode 100644 pagetop-minimal/Cargo.toml delete mode 100644 pagetop-minimal/README.md delete mode 100644 pagetop-minimal/build.rs delete mode 100644 pagetop-minimal/src/component.rs delete mode 100644 pagetop-minimal/src/component/anchor.rs delete mode 100644 pagetop-minimal/src/component/block.rs delete mode 100644 pagetop-minimal/src/component/container.rs delete mode 100644 pagetop-minimal/src/component/flex.rs delete mode 100644 pagetop-minimal/src/component/flex/container.rs delete mode 100644 pagetop-minimal/src/component/flex/item.rs delete mode 100644 pagetop-minimal/src/component/form_element.rs delete mode 100644 pagetop-minimal/src/component/form_element/button.rs delete mode 100644 pagetop-minimal/src/component/form_element/date.rs delete mode 100644 pagetop-minimal/src/component/form_element/form.rs delete mode 100644 pagetop-minimal/src/component/form_element/hidden.rs delete mode 100644 pagetop-minimal/src/component/form_element/input.rs delete mode 100644 pagetop-minimal/src/component/heading.rs delete mode 100644 pagetop-minimal/src/component/icon.rs delete mode 100644 pagetop-minimal/src/component/image.rs delete mode 100644 pagetop-minimal/src/component/paragraph.rs delete mode 100644 pagetop-minimal/src/component/powered_by.rs delete mode 100644 pagetop-minimal/src/component/site_branding.rs delete mode 100644 pagetop-minimal/src/lib.rs delete mode 100644 pagetop-minimal/src/locale/en-US/module.ftl delete mode 100644 pagetop-minimal/src/locale/es-ES/module.ftl delete mode 100644 pagetop-minimal/static/css/flex.css delete mode 100644 pagetop-minimal/static/css/minimal.css delete mode 100644 pagetop-minimal/static/icons/bootstrap-icons.css delete mode 100644 pagetop-minimal/static/icons/bootstrap-icons.woff delete mode 100644 pagetop-minimal/static/icons/bootstrap-icons.woff2 delete mode 100644 pagetop-minimal/static/pagetop-logo.svg diff --git a/Cargo.toml b/Cargo.toml index 2029180c..7d634d44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,6 @@ members = [ "pagetop-jquery", "pagetop-homedemo", # Components. - "pagetop-minimal", "pagetop-megamenu", # Modules. "pagetop-admin", diff --git a/README.md b/README.md index cfc3abcd..e6cfc829 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,6 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: ## Componentes -* **[pagetop-minimal](https://github.com/manuelcillero/pagetop/tree/main/pagetop-minimal)**, módulo - que proporciona un conjunto básico de componentes para la composición de páginas. - * **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería JavaScript para interactuar con el documento HTML.​ diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index 711aba6f..ee46c232 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -16,5 +16,4 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } -pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } pagetop-megamenu = { version = "0.0", path = "../pagetop-megamenu" } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index f2651b82..15ed9dbc 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -24,7 +24,6 @@ impl ModuleTrait for Admin { #[rustfmt::skip] fn dependencies(&self) -> Vec<ModuleRef> { vec![ - &pagetop_minimal::Minimal, &pagetop_megamenu::MegaMenu, ] } diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index ef58737e..d3beac04 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -2,7 +2,6 @@ use crate::LOCALES_ADMIN; use pagetop::prelude::*; use pagetop_megamenu::component::{MegaItem, MegaMenu}; -use pagetop_minimal::component::*; pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = MegaMenu::new() diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index ae7ee415..e340fd3c 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -16,7 +16,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } -pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" [build-dependencies] diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index f34d98a2..c6eb5e37 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,6 +1,5 @@ use pagetop::prelude::*; use pagetop_jquery::JQuery; -use pagetop_minimal::component::*; new_handle!(THEME_BULMIX); @@ -21,7 +20,6 @@ impl ModuleTrait for Bulmix { fn dependencies(&self) -> Vec<ModuleRef> { vec![ &pagetop_jquery::JQuery, - &pagetop_minimal::Minimal, ] } diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 4db99f37..898f66c8 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -15,7 +15,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } -pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } static-files = "0.2.3" [build-dependencies] diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 0e074a65..48830dce 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,8 +1,5 @@ use pagetop::prelude::*; -use pagetop_minimal::component::*; -use pagetop_minimal::BreakPoint; - new_handle!(MODULE_HOMEDEMO); static_locales!(LOCALES_HOMEDEMO); @@ -24,10 +21,6 @@ impl ModuleTrait for HomeDemo { L10n::t("module_description", &LOCALES_HOMEDEMO) } - fn dependencies(&self) -> Vec<ModuleRef> { - vec![&pagetop_minimal::Minimal] - } - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { static_files_service!(scfg, "/homedemo", homedemo); scfg.route("/", service::web::get().to(demo)); diff --git a/pagetop-minimal/Cargo.toml b/pagetop-minimal/Cargo.toml deleted file mode 100644 index 2cdc8cd9..00000000 --- a/pagetop-minimal/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "pagetop-minimal" -version = "0.0.10" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - Module for PageTop with a minimal set of components for page composition.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -pagetop = { version = "0.0", path = "../pagetop" } -static-files = "0.2.3" - -[build-dependencies] -pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-minimal/README.md b/pagetop-minimal/README.md deleted file mode 100644 index 7aa49623..00000000 --- a/pagetop-minimal/README.md +++ /dev/null @@ -1,27 +0,0 @@ -Módulo que proporciona un conjunto básico de componentes para la composición de páginas en -**PageTop**. - -[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo -basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side -Rendering*). - - -# 🚧 Advertencia - -**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son -constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. - - -# 📜 Licencia - -Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu -elección: - -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). - -* Licencia MIT - ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). diff --git a/pagetop-minimal/build.rs b/pagetop-minimal/build.rs deleted file mode 100644 index cd0bc2b5..00000000 --- a/pagetop-minimal/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -use pagetop_build::StaticFilesBundle; - -fn main() -> std::io::Result<()> { - StaticFilesBundle::from_dir("./static") - .with_name("minimal") - .build() -} diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs deleted file mode 100644 index 472e4b7f..00000000 --- a/pagetop-minimal/src/component.rs +++ /dev/null @@ -1,24 +0,0 @@ -mod container; -pub use container::{Container, ContainerType, COMPONENT_CONTAINER}; - -pub mod flex; - -mod icon; -pub use icon::{Icon, COMPONENT_ICON}; -mod heading; -pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; -mod paragraph; -pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; -mod anchor; -pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; -mod image; -pub use image::{Image, ImageSize, COMPONENT_IMAGE}; -mod block; -pub use block::{Block, COMPONENT_BLOCK}; -mod site_branding; -pub use site_branding::{SiteBranding, COMPONENT_BRANDING}; -mod powered_by; -pub use powered_by::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; - -pub mod form_element; -pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs deleted file mode 100644 index 753cbaf7..00000000 --- a/pagetop-minimal/src/component/anchor.rs +++ /dev/null @@ -1,213 +0,0 @@ -use pagetop::prelude::*; - -use crate::component::Icon; - -new_handle!(COMPONENT_ANCHOR); - -#[derive(Default)] -pub enum AnchorType { - #[default] - Link, - Button, - Location, -} - -#[derive(Default)] -pub enum AnchorTarget { - #[default] - Default, - Blank, - Parent, - Top, - Context(String), -} - -type AnchorIcon = TypedComponent<Icon>; -type AnchorHtml = TypedComponent<L10n>; - -#[rustfmt::skip] -#[derive(Default)] -pub struct Anchor { - weight : Weight, - renderable : Renderable, - id : IdentifierValue, - classes : Classes, - anchor_type: AnchorType, - href : AttributeValue, - html : AnchorHtml, - left_icon : AnchorIcon, - right_icon : AnchorIcon, - target : AnchorTarget, - template : String, -} - -impl ComponentTrait for Anchor { - fn new() -> Self { - Anchor::default() - } - - fn handle(&self) -> Handle { - COMPONENT_ANCHOR - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - #[rustfmt::skip] - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let target = match &self.target() { - AnchorTarget::Blank => Some("_blank"), - AnchorTarget::Parent => Some("_parent"), - AnchorTarget::Top => Some("_top"), - AnchorTarget::Context(name) => Some(name.as_str()), - _ => None, - }; - PrepareMarkup::With(html! { - a - id=[self.id()] - class=[self.classes().get()] - href=[self.href().get()] - target=[target] - { - (self.left_icon().prepare(cx)) - " " span { (self.html().prepare(cx)) } " " - (self.right_icon().prepare(cx)) - } - }) - } -} - -impl Anchor { - pub fn link(href: &str, html: L10n) -> Self { - Anchor::new().with_href(href).with_html(html) - } - - pub fn button(href: &str, html: L10n) -> Self { - Anchor::new() - .with_type(AnchorType::Button) - .with_href(href) - .with_html(html) - } - - pub fn location(id: &str) -> Self { - Anchor::new().with_type(AnchorType::Location).with_id(id) - } - - // Anchor BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { - self.alter_classes( - ClassesOp::SetDefault, - match anchor_type { - AnchorType::Button => "btn btn-primary", - _ => "", - }, - ); - self.anchor_type = anchor_type; - self - } - - #[fn_builder] - pub fn alter_href(&mut self, href: &str) -> &mut Self { - self.href.alter_value(href); - self - } - - #[fn_builder] - pub fn alter_html(&mut self, html: L10n) -> &mut Self { - self.html.set(html); - self - } - - #[fn_builder] - pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { - self.left_icon.set(icon); - self - } - - #[fn_builder] - pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { - self.right_icon.set(icon); - self - } - - #[fn_builder] - pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { - self.target = target; - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Anchor GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn anchor_type(&self) -> &AnchorType { - &self.anchor_type - } - - pub fn href(&self) -> &AttributeValue { - &self.href - } - - pub fn html(&self) -> &AnchorHtml { - &self.html - } - - pub fn left_icon(&self) -> &AnchorIcon { - &self.left_icon - } - - pub fn right_icon(&self) -> &AnchorIcon { - &self.right_icon - } - - pub fn target(&self) -> &AnchorTarget { - &self.target - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/block.rs b/pagetop-minimal/src/component/block.rs deleted file mode 100644 index ef84a263..00000000 --- a/pagetop-minimal/src/component/block.rs +++ /dev/null @@ -1,130 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_BLOCK); - -actions_for_component!(Block); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Block { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - title : AttributeValue, - stuff : ArcComponents, - template : String, -} - -impl ComponentTrait for Block { - fn new() -> Self { - Block::default().with_classes(ClassesOp::SetDefault, "block") - } - - fn handle(&self) -> Handle { - COMPONENT_BLOCK - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_block(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let id = cx.required_id::<Block>(self.id()); - PrepareMarkup::With(html! { - div id=(id) class=[self.classes().get()] { - @if let Some(title) = self.title().get() { - h2 class="block-title" { (title) } - } - div class="block-body" { - (self.components().prepare(cx)) - } - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_block(self, cx); - } -} - -impl Block { - // Block BUILDER. - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_title(&mut self, title: &str) -> &mut Self { - self.title.alter_value(title); - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); - self - } - - #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Block GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn title(&self) -> &AttributeValue { - &self.title - } - - pub fn components(&self) -> &ArcComponents { - &self.stuff - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs deleted file mode 100644 index 344e20c2..00000000 --- a/pagetop-minimal/src/component/container.rs +++ /dev/null @@ -1,195 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_CONTAINER); - -actions_for_component!(Container); - -#[derive(Default)] -pub enum ContainerType { - #[default] - Wrapper, - Header, - Footer, - Main, - Section, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Container { - weight : Weight, - renderable : Renderable, - id : IdentifierValue, - classes : Classes, - inner_classes : Classes, - container_type: ContainerType, - stuff : ArcComponents, - template : String, -} - -impl ComponentTrait for Container { - fn new() -> Self { - Container::default() - .with_classes(ClassesOp::SetDefault, "container") - .with_inner_classes(ClassesOp::SetDefault, "container") - } - - fn handle(&self) -> Handle { - COMPONENT_CONTAINER - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_container(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - match self.container_type() { - ContainerType::Header => PrepareMarkup::With(html! { - header id=[self.id()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) - } - } - }), - ContainerType::Footer => PrepareMarkup::With(html! { - footer id=[self.id()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) - } - } - }), - ContainerType::Main => PrepareMarkup::With(html! { - main id=[self.id()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) - } - } - }), - ContainerType::Section => PrepareMarkup::With(html! { - section id=[self.id()] class=[self.classes().get()] { - div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) - } - } - }), - _ => PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(cx)) - } - }), - } - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_container(self, cx); - } -} - -impl Container { - pub fn header() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "header"); - c.container_type = ContainerType::Header; - c - } - - pub fn footer() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "footer"); - c.container_type = ContainerType::Footer; - c - } - - pub fn main() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "main"); - c.container_type = ContainerType::Main; - c - } - - pub fn section() -> Self { - let mut c = Container::new().with_classes(ClassesOp::SetDefault, "section"); - c.container_type = ContainerType::Section; - c - } - - // Container BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.inner_classes.alter_value(op, classes); - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); - self - } - - #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Container GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn inner_classes(&self) -> &Classes { - &self.inner_classes - } - - pub fn container_type(&self) -> &ContainerType { - &self.container_type - } - - pub fn components(&self) -> &ArcComponents { - &self.stuff - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/flex.rs b/pagetop-minimal/src/component/flex.rs deleted file mode 100644 index b34e5642..00000000 --- a/pagetop-minimal/src/component/flex.rs +++ /dev/null @@ -1,325 +0,0 @@ -mod container; -pub use container::{Container, COMPONENT_FLEX_CONTAINER}; -mod item; -pub use item::{Item, COMPONENT_FLEX_ITEM}; - -use pagetop::concat_string; -use pagetop::html::unit; - -use crate::BreakPoint; - -// ************************************************************************************************* - -#[derive(Default)] -pub enum Direction { - #[default] - Default, - Row(BreakPoint), - RowReverse(BreakPoint), - Column(BreakPoint), - ColumnReverse(BreakPoint), -} - -#[rustfmt::skip] -impl ToString for Direction { - fn to_string(&self) -> String { - match self { - Direction::Default => { - concat_string!("flex-container flex-row ", BreakPoint::default().to_string()) - } - Direction::Row(breakpoint) => { - concat_string!("flex-container flex-row ", breakpoint.to_string()) - } - Direction::RowReverse(breakpoint) => { - concat_string!("flex-container flex-row flex-reverse ", breakpoint.to_string()) - } - Direction::Column(breakpoint) => { - concat_string!("flex-container flex-col ", breakpoint.to_string()) - } - Direction::ColumnReverse(breakpoint) => { - concat_string!("flex-container flex-col flex-reverse ", breakpoint.to_string()) - } - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum WrapAlign { - #[default] - Default, - NoWrap, - Wrap(ContentAlign), - WrapReverse(ContentAlign), -} - -#[rustfmt::skip] -impl ToString for WrapAlign { - fn to_string(&self) -> String { - match self { - WrapAlign::Default => "".to_string(), - WrapAlign::NoWrap => "flex-nowrap".to_string(), - WrapAlign::Wrap(a) => concat_string!("flex-wrap ", a.to_string()), - WrapAlign::WrapReverse(a) => concat_string!("flex-wrap-reverse ", a.to_string()), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum ContentAlign { - #[default] - Default, - Start, - End, - Center, - Stretch, - SpaceBetween, - SpaceAround, -} - -#[rustfmt::skip] -impl ToString for ContentAlign { - fn to_string(&self) -> String { - match self { - ContentAlign::Default => "".to_string(), - ContentAlign::Start => "flex-align-start".to_string(), - ContentAlign::End => "flex-align-end".to_string(), - ContentAlign::Center => "flex-align-center".to_string(), - ContentAlign::Stretch => "flex-align-stretch".to_string(), - ContentAlign::SpaceBetween => "flex-align-space-between".to_string(), - ContentAlign::SpaceAround => "flex-align-space-around".to_string(), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum ContentJustify { - #[default] - Default, - Start, - End, - Center, - SpaceBetween, - SpaceAround, - SpaceEvenly, -} - -#[rustfmt::skip] -impl ToString for ContentJustify { - fn to_string(&self) -> String { - match self { - ContentJustify::Default => "".to_string(), - ContentJustify::Start => "flex-justify-start".to_string(), - ContentJustify::End => "flex-justify-end".to_string(), - ContentJustify::Center => "flex-justify-center".to_string(), - ContentJustify::SpaceBetween => "flex-justify-space-between".to_string(), - ContentJustify::SpaceAround => "flex-justify-space-around".to_string(), - ContentJustify::SpaceEvenly => "flex-justify-space-evenly".to_string(), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum ItemAlign { - #[default] - Default, - Top, - Bottom, - Middle, - Stretch, - Baseline, -} - -#[rustfmt::skip] -impl ToString for ItemAlign { - fn to_string(&self) -> String { - match self { - ItemAlign::Default => "".to_string(), - ItemAlign::Top => "flex-item-top".to_string(), - ItemAlign::Bottom => "flex-item-bottom".to_string(), - ItemAlign::Middle => "flex-item-middle".to_string(), - ItemAlign::Stretch => "flex-item-stretch".to_string(), - ItemAlign::Baseline => "flex-item-baseline".to_string(), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum Gap { - #[default] - Default, - Row(unit::Value), - Column(unit::Value), - Distinct(unit::Value, unit::Value), - Both(unit::Value), -} - -#[rustfmt::skip] -impl ToString for Gap { - fn to_string(&self) -> String { - match self { - Gap::Default => "".to_string(), - Gap::Row(r) => concat_string!("row-gap: ", r.to_string(), ";"), - Gap::Column(c) => concat_string!("column-gap: ", c.to_string(), ";"), - Gap::Distinct(r, c) => concat_string!("gap: ", r.to_string(), " ", c.to_string(), ";"), - Gap::Both(v) => concat_string!("gap: ", v.to_string(), ";"), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum ItemGrow { - #[default] - Default, - Is1, - Is2, - Is3, - Is4, - Is5, - Is6, - Is7, - Is8, - Is9, -} - -#[rustfmt::skip] -impl ToString for ItemGrow { - fn to_string(&self) -> String { - match self { - ItemGrow::Default => "".to_string(), - ItemGrow::Is1 => "flex-grow-1".to_string(), - ItemGrow::Is2 => "flex-grow-2".to_string(), - ItemGrow::Is3 => "flex-grow-3".to_string(), - ItemGrow::Is4 => "flex-grow-4".to_string(), - ItemGrow::Is5 => "flex-grow-5".to_string(), - ItemGrow::Is6 => "flex-grow-6".to_string(), - ItemGrow::Is7 => "flex-grow-7".to_string(), - ItemGrow::Is8 => "flex-grow-8".to_string(), - ItemGrow::Is9 => "flex-grow-9".to_string(), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum ItemShrink { - #[default] - Default, - Is1, - Is2, - Is3, - Is4, - Is5, - Is6, - Is7, - Is8, - Is9, -} - -#[rustfmt::skip] -impl ToString for ItemShrink { - fn to_string(&self) -> String { - match self { - ItemShrink::Default => "".to_string(), - ItemShrink::Is1 => "flex-shrink-1".to_string(), - ItemShrink::Is2 => "flex-shrink-2".to_string(), - ItemShrink::Is3 => "flex-shrink-3".to_string(), - ItemShrink::Is4 => "flex-shrink-4".to_string(), - ItemShrink::Is5 => "flex-shrink-5".to_string(), - ItemShrink::Is6 => "flex-shrink-6".to_string(), - ItemShrink::Is7 => "flex-shrink-7".to_string(), - ItemShrink::Is8 => "flex-shrink-8".to_string(), - ItemShrink::Is9 => "flex-shrink-9".to_string(), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum ItemSize { - #[default] - Default, - Percent10, - Percent20, - Percent25, - Percent33, - Percent40, - Percent50, - Percent60, - Percent66, - Percent75, - Percent80, - Percent90, -} - -#[rustfmt::skip] -impl ToString for ItemSize { - fn to_string(&self) -> String { - match self { - ItemSize::Default => "".to_string(), - ItemSize::Percent10 => "flex-width-10".to_string(), - ItemSize::Percent20 => "flex-width-20".to_string(), - ItemSize::Percent25 => "flex-width-25".to_string(), - ItemSize::Percent33 => "flex-width-33".to_string(), - ItemSize::Percent40 => "flex-width-40".to_string(), - ItemSize::Percent50 => "flex-width-50".to_string(), - ItemSize::Percent60 => "flex-width-60".to_string(), - ItemSize::Percent66 => "flex-width-66".to_string(), - ItemSize::Percent75 => "flex-width-75".to_string(), - ItemSize::Percent80 => "flex-width-80".to_string(), - ItemSize::Percent90 => "flex-width-90".to_string(), - } - } -} - -// ************************************************************************************************* - -#[derive(Default)] -pub enum ItemOffset { - #[default] - Default, - Offset10, - Offset20, - Offset25, - Offset33, - Offset40, - Offset50, - Offset60, - Offset66, - Offset75, - Offset80, - Offset90, -} - -#[rustfmt::skip] -impl ToString for ItemOffset { - fn to_string(&self) -> String { - match self { - ItemOffset::Default => "".to_string(), - ItemOffset::Offset10 => "flex-offset-10".to_string(), - ItemOffset::Offset20 => "flex-offset-20".to_string(), - ItemOffset::Offset25 => "flex-offset-25".to_string(), - ItemOffset::Offset33 => "flex-offset-33".to_string(), - ItemOffset::Offset40 => "flex-offset-40".to_string(), - ItemOffset::Offset50 => "flex-offset-50".to_string(), - ItemOffset::Offset60 => "flex-offset-60".to_string(), - ItemOffset::Offset66 => "flex-offset-66".to_string(), - ItemOffset::Offset75 => "flex-offset-75".to_string(), - ItemOffset::Offset80 => "flex-offset-80".to_string(), - ItemOffset::Offset90 => "flex-offset-90".to_string(), - } - } -} diff --git a/pagetop-minimal/src/component/flex/container.rs b/pagetop-minimal/src/component/flex/container.rs deleted file mode 100644 index b36c0c55..00000000 --- a/pagetop-minimal/src/component/flex/container.rs +++ /dev/null @@ -1,183 +0,0 @@ -use pagetop::prelude::*; - -use crate::component::flex; - -new_handle!(COMPONENT_FLEX_CONTAINER); - -actions_for_component!(Container); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Container { - weight : Weight, - renderable : Renderable, - id : IdentifierValue, - classes : Classes, - items : TypedComponents<flex::Item>, - direction : flex::Direction, - wrap_align : flex::WrapAlign, - content_justify: flex::ContentJustify, - items_align : flex::ItemAlign, - gap : flex::Gap, -} - -impl ComponentTrait for Container { - fn new() -> Self { - Container::default() - .with_classes(ClassesOp::SetDefault, flex::Direction::Default.to_string()) - } - - fn handle(&self) -> Handle { - COMPONENT_FLEX_CONTAINER - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_container(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.set_param::<bool>(crate::PARAM_MINIMAL_FLEX, true); - - let gap = match self.gap() { - flex::Gap::Default => None, - _ => Some(self.gap().to_string()), - }; - - PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] style=[gap] { - (self.items().prepare(cx)) - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_container(self, cx); - } -} - -impl Container { - // Container BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - pub fn with_item(mut self, item: flex::Item) -> Self { - self.items.alter(TypedOp::Add(TypedComponent::with(item))); - self - } - - #[fn_builder] - pub fn alter_items(&mut self, op: TypedOp<flex::Item>) -> &mut Self { - self.items.alter(op); - self - } - - #[fn_builder] - pub fn alter_direction(&mut self, direction: flex::Direction) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.direction.to_string()), - direction.to_string(), - ); - self.direction = direction; - self - } - - #[fn_builder] - pub fn alter_wrap_align(&mut self, wrap: flex::WrapAlign) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.wrap_align.to_string()), - wrap.to_string(), - ); - self.wrap_align = wrap; - self - } - - #[fn_builder] - pub fn alter_content_justify(&mut self, justify: flex::ContentJustify) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.content_justify.to_string()), - justify.to_string(), - ); - self.content_justify = justify; - self - } - - #[fn_builder] - pub fn alter_items_align(&mut self, align: flex::ItemAlign) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.items_align.to_string()), - align.to_string(), - ); - self.items_align = align; - self - } - - #[fn_builder] - pub fn alter_gap(&mut self, gap: flex::Gap) -> &mut Self { - self.gap = gap; - self - } - - // Container GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn items(&self) -> &TypedComponents<flex::Item> { - &self.items - } - - pub fn direction(&self) -> &flex::Direction { - &self.direction - } - - pub fn wrap_align(&self) -> &flex::WrapAlign { - &self.wrap_align - } - - pub fn content_justify(&self) -> &flex::ContentJustify { - &self.content_justify - } - - pub fn items_align(&self) -> &flex::ItemAlign { - &self.items_align - } - - pub fn gap(&self) -> &flex::Gap { - &self.gap - } -} diff --git a/pagetop-minimal/src/component/flex/item.rs b/pagetop-minimal/src/component/flex/item.rs deleted file mode 100644 index 1ce15625..00000000 --- a/pagetop-minimal/src/component/flex/item.rs +++ /dev/null @@ -1,198 +0,0 @@ -use pagetop::prelude::*; - -use crate::component::flex; - -new_handle!(COMPONENT_FLEX_ITEM); - -actions_for_component!(Item); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Item { - weight : Weight, - renderable : Renderable, - id : IdentifierValue, - item_classes : Classes, - inner_classes: Classes, - item_grow : flex::ItemGrow, - item_shrink : flex::ItemShrink, - item_size : flex::ItemSize, - item_offset : flex::ItemOffset, - item_align : flex::ItemAlign, - stuff : ArcComponents, -} - -impl ComponentTrait for Item { - fn new() -> Self { - Item::default() - .with_item_classes(ClassesOp::SetDefault, "flex-item") - .with_inner_classes(ClassesOp::SetDefault, "flex-item-inner") - } - - fn handle(&self) -> Handle { - COMPONENT_FLEX_ITEM - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_item(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let order = match self.weight() { - 0 => None, - _ => Some(concat_string!("order: ", self.weight().to_string(), ";")), - }; - PrepareMarkup::With(html! { - div id=[self.id()] class=[self.item_classes().get()] style=[order] { - div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) - } - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_item(self, cx); - } -} - -impl Item { - // Item BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_item_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.item_classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.inner_classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_grow(&mut self, grow: flex::ItemGrow) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_grow.to_string()), - grow.to_string(), - ); - self.item_grow = grow; - self - } - - #[fn_builder] - pub fn alter_shrink(&mut self, shrink: flex::ItemShrink) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_shrink.to_string()), - shrink.to_string(), - ); - self.item_shrink = shrink; - self - } - - #[fn_builder] - pub fn alter_size(&mut self, size: flex::ItemSize) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_size.to_string()), - size.to_string(), - ); - self.item_size = size; - self - } - - #[fn_builder] - pub fn alter_offset(&mut self, offset: flex::ItemOffset) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_offset.to_string()), - offset.to_string(), - ); - self.item_offset = offset; - self - } - - #[fn_builder] - pub fn alter_align(&mut self, align: flex::ItemAlign) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_align.to_string()), - align.to_string(), - ); - self.item_align = align; - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); - self - } - - #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); - self - } - - // Item GETTERS. - - pub fn item_classes(&self) -> &Classes { - &self.item_classes - } - - pub fn inner_classes(&self) -> &Classes { - &self.inner_classes - } - - pub fn grow(&self) -> &flex::ItemGrow { - &self.item_grow - } - - pub fn shrink(&self) -> &flex::ItemShrink { - &self.item_shrink - } - - pub fn size(&self) -> &flex::ItemSize { - &self.item_size - } - - pub fn offset(&self) -> &flex::ItemOffset { - &self.item_offset - } - - pub fn align(&self) -> &flex::ItemAlign { - &self.item_align - } - - pub fn components(&self) -> &ArcComponents { - &self.stuff - } -} diff --git a/pagetop-minimal/src/component/form_element.rs b/pagetop-minimal/src/component/form_element.rs deleted file mode 100644 index bbd4e309..00000000 --- a/pagetop-minimal/src/component/form_element.rs +++ /dev/null @@ -1,11 +0,0 @@ -mod form; -pub use form::{Form, FormMethod, COMPONENT_FORM}; - -mod input; -pub use input::{Input, InputType, COMPONENT_INPUT}; -mod hidden; -pub use hidden::{Hidden, COMPONENT_HIDDEN}; -mod date; -pub use date::{Date, COMPONENT_DATE}; -mod button; -pub use button::{Button, ButtonType, COMPONENT_BUTTON}; diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs deleted file mode 100644 index a8f4da4b..00000000 --- a/pagetop-minimal/src/component/form_element/button.rs +++ /dev/null @@ -1,176 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_BUTTON); - -#[derive(Default)] -pub enum ButtonType { - #[default] - Button, - Submit, - Reset, -} - -type ButtonValue = TypedComponent<L10n>; - -#[rustfmt::skip] -#[derive(Default)] -pub struct Button { - weight : Weight, - renderable : Renderable, - classes : Classes, - button_type: ButtonType, - name : AttributeValue, - value : ButtonValue, - autofocus : AttributeValue, - disabled : AttributeValue, - template : String, -} - -impl ComponentTrait for Button { - fn new() -> Self { - Button::default().with_classes(ClassesOp::SetDefault, "btn btn-primary form-button") - } - - fn handle(&self) -> Handle { - COMPONENT_BUTTON - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let button_type = match self.button_type() { - ButtonType::Button => "button", - ButtonType::Submit => "submit", - ButtonType::Reset => "reset", - }; - let id = self.name().get().map(|name| concat_string!("edit-", name)); - let value = self.value().prepare(cx); - PrepareMarkup::With(html! { - button - type=(button_type) - id=[id] - class=[self.classes().get()] - name=[self.name().get()] - value=(value) - autofocus=[self.autofocus().get()] - disabled=[self.disabled().get()] - { - (value) - } - }) - } -} - -impl Button { - pub fn with(value: L10n) -> Self { - Button::new().with_value(value) - } - - pub fn submit(value: L10n) -> Self { - let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-submit") - .with_value(value); - button.button_type = ButtonType::Submit; - button - } - - pub fn reset(value: L10n) -> Self { - let mut button = Button::new() - .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-reset") - .with_value(value); - button.button_type = ButtonType::Reset; - button - } - - // Button BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.alter_value(name); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: L10n) -> &mut Self { - self.value.set(value); - self - } - - #[fn_builder] - pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.alter_value(match toggle { - true => "autofocus", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.alter_value(match toggle { - true => "disabled", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Button GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn button_type(&self) -> &ButtonType { - &self.button_type - } - - pub fn name(&self) -> &AttributeValue { - &self.name - } - - pub fn value(&self) -> &ButtonValue { - &self.value - } - - pub fn autofocus(&self) -> &AttributeValue { - &self.autofocus - } - - pub fn disabled(&self) -> &AttributeValue { - &self.disabled - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/form_element/date.rs b/pagetop-minimal/src/component/form_element/date.rs deleted file mode 100644 index 18b304a9..00000000 --- a/pagetop-minimal/src/component/form_element/date.rs +++ /dev/null @@ -1,226 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_DATE); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Date { - weight : Weight, - renderable : Renderable, - classes : Classes, - name : AttributeValue, - value : AttributeValue, - label : AttributeValue, - placeholder : AttributeValue, - autofocus : AttributeValue, - autocomplete: AttributeValue, - disabled : AttributeValue, - readonly : AttributeValue, - required : AttributeValue, - help_text : AttributeValue, - template : String, -} - -impl ComponentTrait for Date { - fn new() -> Self { - Date::default().with_classes(ClassesOp::SetDefault, "form-item form-type-date") - } - - fn handle(&self) -> Handle { - COMPONENT_DATE - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { - let id = self.name().get().map(|name| concat_string!("edit-", name)); - PrepareMarkup::With(html! { - div class=[self.classes().get()] { - @if let Some(label) = self.label().get() { - label class="form-label" for=[&id] { - (label) " " - @if self.required().get().is_some() { - span - class="form-required" - title="Este campo es obligatorio." { "*" } " " - } - } - } - input - type="date" - id=[id] - class="form-control" - name=[self.name().get()] - value=[self.value().get()] - placeholder=[self.placeholder().get()] - autofocus=[self.autofocus().get()] - autocomplete=[self.autocomplete().get()] - readonly=[self.readonly().get()] - required=[self.required().get()] - disabled=[self.disabled().get()] {} - @if let Some(help_text) = self.help_text().get() { - div class="form-text" { (help_text) } - } - } - }) - } -} - -impl Date { - // Date BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.alter_value(name); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); - self - } - - #[fn_builder] - pub fn alter_label(&mut self, label: &str) -> &mut Self { - self.label.alter_value(label); - self - } - - #[fn_builder] - pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { - self.placeholder.alter_value(placeholder); - self - } - - #[fn_builder] - pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.alter_value(match toggle { - true => "autofocus", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { - self.autocomplete.alter_value(match toggle { - true => "", - false => "off", - }); - self - } - - #[fn_builder] - pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.alter_value(match toggle { - true => "disabled", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { - self.readonly.alter_value(match toggle { - true => "readonly", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_required(&mut self, toggle: bool) -> &mut Self { - self.required.alter_value(match toggle { - true => "required", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { - self.help_text.alter_value(help_text); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Date GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn name(&self) -> &AttributeValue { - &self.name - } - - pub fn value(&self) -> &AttributeValue { - &self.value - } - - pub fn label(&self) -> &AttributeValue { - &self.label - } - - pub fn placeholder(&self) -> &AttributeValue { - &self.placeholder - } - - pub fn autofocus(&self) -> &AttributeValue { - &self.autofocus - } - - pub fn autocomplete(&self) -> &AttributeValue { - &self.autocomplete - } - - pub fn disabled(&self) -> &AttributeValue { - &self.disabled - } - - pub fn readonly(&self) -> &AttributeValue { - &self.readonly - } - - pub fn required(&self) -> &AttributeValue { - &self.required - } - - pub fn help_text(&self) -> &AttributeValue { - &self.help_text - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs deleted file mode 100644 index 862b69ed..00000000 --- a/pagetop-minimal/src/component/form_element/form.rs +++ /dev/null @@ -1,165 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_FORM); - -actions_for_component!(Form); - -#[derive(Default)] -pub enum FormMethod { - #[default] - Post, - Get, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Form { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - action : AttributeValue, - charset : AttributeValue, - method : FormMethod, - stuff : ArcComponents, - template : String, -} - -impl ComponentTrait for Form { - fn new() -> Self { - Form::default() - .with_classes(ClassesOp::SetDefault, "form") - .with_charset("UTF-8") - } - - fn handle(&self) -> Handle { - COMPONENT_FORM - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_form(self, cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let method = match self.method() { - FormMethod::Post => Some("post".to_owned()), - FormMethod::Get => None, - }; - PrepareMarkup::With(html! { - form - id=[self.id()] - class=[self.classes().get()] - action=[self.action().get()] - method=[method] - accept-charset=[self.charset().get()] - { - div { (self.elements().prepare(cx)) } - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_form(self, cx); - } -} - -impl Form { - // Form BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_action(&mut self, action: &str) -> &mut Self { - self.action.alter_value(action); - self - } - - #[fn_builder] - pub fn alter_charset(&mut self, charset: &str) -> &mut Self { - self.charset.alter_value(charset); - self - } - - #[fn_builder] - pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { - self.method = method; - self - } - - pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(element))); - self - } - - #[fn_builder] - pub fn alter_elements(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Form GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn action(&self) -> &AttributeValue { - &self.action - } - - pub fn charset(&self) -> &AttributeValue { - &self.charset - } - - pub fn method(&self) -> &FormMethod { - &self.method - } - - pub fn elements(&self) -> &ArcComponents { - &self.stuff - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/form_element/hidden.rs b/pagetop-minimal/src/component/form_element/hidden.rs deleted file mode 100644 index c42a98f9..00000000 --- a/pagetop-minimal/src/component/form_element/hidden.rs +++ /dev/null @@ -1,68 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_HIDDEN); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Hidden { - weight: Weight, - name : NameValue, - value : AttributeValue, -} - -impl ComponentTrait for Hidden { - fn new() -> Self { - Hidden::default() - } - - fn handle(&self) -> Handle { - COMPONENT_HIDDEN - } - - fn weight(&self) -> Weight { - self.weight - } - - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { - let id = self.name().get().map(|name| concat_string!("value-", name)); - PrepareMarkup::With(html! { - input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()] {} - }) - } -} - -impl Hidden { - pub fn set(name: &str, value: &str) -> Self { - Hidden::new().with_name(name).with_value(value) - } - - // Hidden BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - self.name.alter_value(name); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); - self - } - - // Hidden GETTERS. - - pub fn name(&self) -> &NameValue { - &self.name - } - - pub fn value(&self) -> &AttributeValue { - &self.value - } -} diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs deleted file mode 100644 index 2bcd6329..00000000 --- a/pagetop-minimal/src/component/form_element/input.rs +++ /dev/null @@ -1,348 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_INPUT); - -#[derive(Default)] -pub enum InputType { - #[default] - Textfield, - Password, - Search, - Email, - Telephone, - Url, -} - -type InputLabel = TypedComponent<L10n>; -type InputHelpText = TypedComponent<L10n>; - -#[rustfmt::skip] -#[derive(Default)] -pub struct Input { - weight : Weight, - renderable : Renderable, - classes : Classes, - input_type : InputType, - name : NameValue, - value : AttributeValue, - label : InputLabel, - size : Option<u16>, - minlength : Option<u16>, - maxlength : Option<u16>, - placeholder : AttributeValue, - autofocus : AttributeValue, - autocomplete: AttributeValue, - disabled : AttributeValue, - readonly : AttributeValue, - required : AttributeValue, - help_text : InputHelpText, - template : String, -} - -impl ComponentTrait for Input { - fn new() -> Self { - Input::default() - .with_classes(ClassesOp::SetDefault, "form-item form-type-textfield") - .with_size(Some(60)) - .with_maxlength(Some(128)) - } - - fn handle(&self) -> Handle { - COMPONENT_INPUT - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - #[rustfmt::skip] - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let type_input = match self.input_type() { - InputType::Textfield => "text", - InputType::Password => "password", - InputType::Search => "search", - InputType::Email => "email", - InputType::Telephone => "tel", - InputType::Url => "url", - }; - let id = self.name().get().map(|name| concat_string!("edit-", name)); - let label = self.label().prepare(cx); - let description = self.help_text().prepare(cx); - PrepareMarkup::With(html! { - div class=[self.classes().get()] { - @if !label.is_empty() { - label class="form-label" for=[&id] { - (label) " " - @if self.required().get().is_some() { - span - class="form-required" - title="Este campo es obligatorio." { "*" } " " - } - } - } - input - type=(type_input) - id=[id] - class="form-control" - name=[self.name().get()] - value=[self.value().get()] - size=[self.size()] - minlength=[self.minlength()] - maxlength=[self.maxlength()] - placeholder=[self.placeholder().get()] - autofocus=[self.autofocus().get()] - autocomplete=[self.autocomplete().get()] - readonly=[self.readonly().get()] - required=[self.required().get()] - disabled=[self.disabled().get()] {} - @if !description.is_empty() { - div class="form-text" { (description) } - } - } - }) - } -} - -impl Input { - pub fn textfield() -> Self { - Input::new() - } - - pub fn password() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-password", - ); - input.input_type = InputType::Password; - input - } - - pub fn search() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-search", - ); - input.input_type = InputType::Search; - input - } - - pub fn email() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-email", - ); - input.input_type = InputType::Email; - input - } - - pub fn telephone() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-telephone", - ); - input.input_type = InputType::Telephone; - input - } - - pub fn url() -> Self { - let mut input = Input::new().with_classes( - ClassesOp::Replace("form-type-textfield".to_owned()), - "form-type-url", - ); - input.input_type = InputType::Url; - input - } - - // Input BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: &str) -> &mut Self { - if let Some(previous) = self.name.get() { - self.alter_classes(ClassesOp::Remove, concat_string!("form-item-", previous)); - } - self.alter_classes(ClassesOp::AddDefault, concat_string!("form-item-", name)); - self.name.alter_value(name); - self - } - - #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.value.alter_value(value); - self - } - - #[fn_builder] - pub fn alter_label(&mut self, label: L10n) -> &mut Self { - self.label.set(label); - self - } - - #[fn_builder] - pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { - self.size = size; - self - } - - #[fn_builder] - pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { - self.minlength = minlength; - self - } - - #[fn_builder] - pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { - self.maxlength = maxlength; - self - } - - #[fn_builder] - pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { - self.placeholder.alter_value(placeholder); - self - } - - #[fn_builder] - pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { - self.autofocus.alter_value(match toggle { - true => "autofocus", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { - self.autocomplete.alter_value(match toggle { - true => "", - false => "off", - }); - self - } - - #[fn_builder] - pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { - self.disabled.alter_value(match toggle { - true => "disabled", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { - self.readonly.alter_value(match toggle { - true => "readonly", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_required(&mut self, toggle: bool) -> &mut Self { - self.required.alter_value(match toggle { - true => "required", - false => "", - }); - self - } - - #[fn_builder] - pub fn alter_help_text(&mut self, help_text: L10n) -> &mut Self { - self.help_text.set(help_text); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Input GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn input_type(&self) -> &InputType { - &self.input_type - } - - pub fn name(&self) -> &NameValue { - &self.name - } - - pub fn value(&self) -> &AttributeValue { - &self.value - } - - pub fn label(&self) -> &InputLabel { - &self.label - } - - pub fn size(&self) -> Option<u16> { - self.size - } - - pub fn minlength(&self) -> Option<u16> { - self.minlength - } - - pub fn maxlength(&self) -> Option<u16> { - self.maxlength - } - - pub fn placeholder(&self) -> &AttributeValue { - &self.placeholder - } - - pub fn autofocus(&self) -> &AttributeValue { - &self.autofocus - } - - pub fn autocomplete(&self) -> &AttributeValue { - &self.autocomplete - } - - pub fn disabled(&self) -> &AttributeValue { - &self.disabled - } - - pub fn readonly(&self) -> &AttributeValue { - &self.readonly - } - - pub fn required(&self) -> &AttributeValue { - &self.required - } - - pub fn help_text(&self) -> &InputHelpText { - &self.help_text - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs deleted file mode 100644 index e4b8ae3e..00000000 --- a/pagetop-minimal/src/component/heading.rs +++ /dev/null @@ -1,199 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_HEADING); - -#[derive(Default)] -pub enum HeadingType { - #[default] - H1, - H2, - H3, - H4, - H5, - H6, -} - -#[derive(Default)] -pub enum HeadingDisplay { - #[default] - Normal, - XxLarge, - Large, - Medium, - Small, - XxSmall, - Subtitle, -} - -type HeadingText = TypedComponent<L10n>; - -#[rustfmt::skip] -#[derive(Default)] -pub struct Heading { - weight : Weight, - renderable : Renderable, - id : IdentifierValue, - classes : Classes, - heading_type: HeadingType, - text : HeadingText, - display : HeadingDisplay, - template : String, -} - -impl ComponentTrait for Heading { - fn new() -> Self { - Heading::default() - } - - fn handle(&self) -> Handle { - COMPONENT_HEADING - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let id = self.id(); - let classes = self.classes().get(); - PrepareMarkup::With(html! { @match &self.heading_type() { - HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(cx)) }, - }}) - } -} - -impl Heading { - pub fn h1(text: L10n) -> Self { - Heading::new() - .with_heading_type(HeadingType::H1) - .with_text(text) - } - - pub fn h2(text: L10n) -> Self { - Heading::new() - .with_heading_type(HeadingType::H2) - .with_text(text) - } - - pub fn h3(text: L10n) -> Self { - Heading::new() - .with_heading_type(HeadingType::H3) - .with_text(text) - } - - pub fn h4(text: L10n) -> Self { - Heading::new() - .with_heading_type(HeadingType::H4) - .with_text(text) - } - - pub fn h5(text: L10n) -> Self { - Heading::new() - .with_heading_type(HeadingType::H5) - .with_text(text) - } - - pub fn h6(text: L10n) -> Self { - Heading::new() - .with_heading_type(HeadingType::H6) - .with_text(text) - } - - // Heading BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { - self.heading_type = heading_type; - self - } - - #[fn_builder] - pub fn alter_text(&mut self, text: L10n) -> &mut Self { - self.text.set(text); - self - } - - #[rustfmt::skip] - #[fn_builder] - pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { - self.alter_classes( - ClassesOp::SetDefault, - match display { - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::Large => "display-3", - HeadingDisplay::Medium => "display-4", - HeadingDisplay::Small => "display-5", - HeadingDisplay::XxSmall => "display-6", - HeadingDisplay::Normal => "", - HeadingDisplay::Subtitle => "", - }, - ); - self.display = display; - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Paragraph GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn heading_type(&self) -> &HeadingType { - &self.heading_type - } - - pub fn text(&self) -> &HeadingText { - &self.text - } - - pub fn display(&self) -> &HeadingDisplay { - &self.display - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/icon.rs b/pagetop-minimal/src/component/icon.rs deleted file mode 100644 index 6d5a1a68..00000000 --- a/pagetop-minimal/src/component/icon.rs +++ /dev/null @@ -1,83 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_ICON); - -#[rustfmt::skip] -#[derive(Default)] -pub struct Icon { - weight : Weight, - renderable: Renderable, - icon_name : String, - classes : Classes, -} - -impl ComponentTrait for Icon { - fn new() -> Self { - Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") - } - - fn handle(&self) -> Handle { - COMPONENT_ICON - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/minimal/icons/bootstrap-icons.css").with_version("1.8.2"), - )); - } - - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) - } -} - -impl Icon { - pub fn with(icon_name: &str) -> Self { - Icon::new().with_icon_name(icon_name) - } - - // Icon BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { - self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", name)); - self.icon_name = name.to_owned(); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - // Icon GETTERS. - - pub fn icon_name(&self) -> &str { - self.icon_name.as_str() - } - - pub fn classes(&self) -> &Classes { - &self.classes - } -} diff --git a/pagetop-minimal/src/component/image.rs b/pagetop-minimal/src/component/image.rs deleted file mode 100644 index d3e6d9df..00000000 --- a/pagetop-minimal/src/component/image.rs +++ /dev/null @@ -1,126 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_IMAGE); - -#[derive(Default)] -pub enum ImageSize { - #[default] - Auto, - Size(u16, u16), - Width(u16), - Height(u16), -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Image { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - source : AttributeValue, - size : ImageSize, -} - -impl ComponentTrait for Image { - fn new() -> Self { - Image::default().with_classes(ClassesOp::SetDefault, "img-fluid") - } - - fn handle(&self) -> Handle { - COMPONENT_IMAGE - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { - let (width, height) = match self.size() { - ImageSize::Auto => (None, None), - ImageSize::Size(width, height) => (Some(width), Some(height)), - ImageSize::Width(width) => (Some(width), None), - ImageSize::Height(height) => (None, Some(height)), - }; - PrepareMarkup::With(html! { - img - src=[self.source().get()] - id=[self.id()] - class=[self.classes().get()] - width=[width] - height=[height] {} - }) - } -} - -impl Image { - pub fn with(source: &str) -> Self { - Image::new().with_source(source) - } - - pub fn pagetop() -> Self { - Image::new() - .with_source("/minimal/pagetop-logo.svg") - .with_size(ImageSize::Size(64, 64)) - } - - // Image BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - #[fn_builder] - pub fn alter_source(&mut self, source: &str) -> &mut Self { - self.source.alter_value(source); - self - } - - #[fn_builder] - pub fn alter_size(&mut self, size: ImageSize) -> &mut Self { - self.size = size; - self - } - - // Image GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn source(&self) -> &AttributeValue { - &self.source - } - - pub fn size(&self) -> &ImageSize { - &self.size - } -} diff --git a/pagetop-minimal/src/component/paragraph.rs b/pagetop-minimal/src/component/paragraph.rs deleted file mode 100644 index f5fd3c67..00000000 --- a/pagetop-minimal/src/component/paragraph.rs +++ /dev/null @@ -1,144 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(COMPONENT_PARAGRAPH); - -#[derive(Default)] -pub enum ParagraphDisplay { - #[default] - Normal, - XxLarge, - Large, - Medium, - Small, - XxSmall, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct Paragraph { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - classes : Classes, - stuff : ArcComponents, - display : ParagraphDisplay, - template : String, -} - -impl ComponentTrait for Paragraph { - fn new() -> Self { - Paragraph::default() - } - - fn handle(&self) -> Handle { - COMPONENT_PARAGRAPH - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { - p - id=[self.id()] - class=[self.classes().get()] - { - (self.components().prepare(cx)) - } - }) - } -} - -impl Paragraph { - pub fn with(component: impl ComponentTrait) -> Self { - Paragraph::new().with_component(component) - } - - // Paragraph BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); - self - } - - #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); - self - } - - #[rustfmt::skip] - #[fn_builder] - pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { - self.alter_classes( - ClassesOp::SetDefault, - match display { - ParagraphDisplay::XxLarge => "fs-2", - ParagraphDisplay::Large => "fs-3", - ParagraphDisplay::Medium => "fs-4", - ParagraphDisplay::Small => "fs-5", - ParagraphDisplay::XxSmall => "fs-6", - ParagraphDisplay::Normal => "", - }, - ); - self.display = display; - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - - // Paragraph GETTERS. - - pub fn classes(&self) -> &Classes { - &self.classes - } - - pub fn components(&self) -> &ArcComponents { - &self.stuff - } - - pub fn display(&self) -> &ParagraphDisplay { - &self.display - } - - pub fn template(&self) -> &str { - self.template.as_str() - } -} diff --git a/pagetop-minimal/src/component/powered_by.rs b/pagetop-minimal/src/component/powered_by.rs deleted file mode 100644 index 0e1e597c..00000000 --- a/pagetop-minimal/src/component/powered_by.rs +++ /dev/null @@ -1,140 +0,0 @@ -use pagetop::prelude::*; - -use crate::{Minimal, LOCALES_MINIMAL}; - -new_handle!(COMPONENT_POWEREDBY); - -#[derive(Default, Eq, PartialEq)] -pub enum PoweredByLogo { - #[default] - None, - Color, - LineDark, - LineLight, - LineRGB(u8, u8, u8), -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct PoweredBy { - weight : Weight, - renderable: Renderable, - copyright : Option<String>, - logo : PoweredByLogo, -} - -impl ComponentTrait for PoweredBy { - fn new() -> Self { - let year = Utc::now().format("%Y").to_string(); - let c = concat_string!(year, " © ", config::SETTINGS.app.name); - PoweredBy { - copyright: Some(c), - ..Default::default() - } - } - - fn handle(&self) -> Handle { - COMPONENT_POWEREDBY - } - - fn id(&self) -> Option<String> { - Some("powered-by".to_owned()) - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - Minimal.load_assets(cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let logo = match self.logo() { - PoweredByLogo::Color => { - let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); - html! { - span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { - img src="/minimal/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} - } - } - } - PoweredByLogo::LineDark => self.logo_line(10, 11, 9, cx), - PoweredByLogo::LineLight => self.logo_line(255, 255, 255, cx), - PoweredByLogo::LineRGB(r, g, b) => self.logo_line(*r, *g, *b, cx), - _ => html! {}, - }; - - let mut credits = L10n::e("poweredby_pagetop", &LOCALES_MINIMAL).with_arg( - "pagetop_link", - "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", - ); - - PrepareMarkup::With(html! { - div id=[self.id()] { - @if let Some(c) = self.copyright() { - span class="copyright" { (c) "." } " " - } - span class="powered" { (credits.prepare(cx)) " " (logo) } - } - }) - } -} - -impl PoweredBy { - // PoweredBy BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_copyright(&mut self, copyright: Option<impl Into<String>>) -> &mut Self { - self.copyright = copyright.map(|c| c.into()); - self - } - - #[fn_builder] - pub fn alter_logo(&mut self, logo: PoweredByLogo) -> &mut Self { - self.logo = logo; - self - } - - // PoweredBy GETTERS. - - pub fn copyright(&self) -> &Option<String> { - &self.copyright - } - - pub fn logo(&self) -> &PoweredByLogo { - &self.logo - } - - // PoweredBy PRIVATE. - - fn logo_line(&self, r: u8, g: u8, b: u8, cx: &mut Context) -> Markup { - let logo_txt = L10n::t("pagetop_logo", &LOCALES_MINIMAL); - let logo_rgb = format!("rgb({},{},{})", r, g, b); - html! { - span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { - svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { - path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} - path fill=(logo_rgb) d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} - path fill=(logo_rgb) d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} - } - } - } - } -} diff --git a/pagetop-minimal/src/component/site_branding.rs b/pagetop-minimal/src/component/site_branding.rs deleted file mode 100644 index 641c3939..00000000 --- a/pagetop-minimal/src/component/site_branding.rs +++ /dev/null @@ -1,142 +0,0 @@ -use pagetop::prelude::*; - -use crate::component::Image; -use crate::Minimal; -use crate::LOCALES_MINIMAL; - -new_handle!(COMPONENT_BRANDING); - -type SiteSlogan = TypedComponent<L10n>; -type SiteLogo = TypedComponent<Image>; - -#[rustfmt::skip] -pub struct SiteBranding { - weight : Weight, - renderable: Renderable, - name : String, - slogan : SiteSlogan, - logo : SiteLogo, - frontpage : FnContextualPath, -} - -#[rustfmt::skip] -impl Default for SiteBranding { - fn default() -> Self { - SiteBranding { - weight : Weight::default(), - renderable: Renderable::default(), - name : config::SETTINGS.app.name.to_owned(), - slogan : SiteSlogan::default(), - logo : SiteLogo::default(), - frontpage : |_| "/", - } - } -} - -impl ComponentTrait for SiteBranding { - fn new() -> Self { - SiteBranding::default() - } - - fn handle(&self) -> Handle { - COMPONENT_BRANDING - } - - fn id(&self) -> Option<String> { - Some("site-branding".to_owned()) - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - Minimal.load_assets(cx); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let title = L10n::t("site_home", &LOCALES_MINIMAL).prepare(cx); - let slogan = self.slogan().prepare(cx); - PrepareMarkup::With(html! { - div id=[self.id()] { - div class="site-branding-wrapper" { - div class="site-branding-logo" { - (self.logo().prepare(cx)) - } - div class="site-branding-text" { - div class="site-branding-name" { - a href=(self.frontpage()(cx)) title=(title) rel="home" { (self.name()) } - } - @if !slogan.is_empty() { - div class="site-branding-slogan" { - (slogan) - } - } - } - } - } - }) - } -} - -impl SiteBranding { - // SiteBranding BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_name(&mut self, name: impl Into<String>) -> &mut Self { - self.name = name.into(); - self - } - - #[fn_builder] - pub fn alter_slogan(&mut self, slogan: L10n) -> &mut Self { - self.slogan = SiteSlogan::with(slogan); - self - } - - #[fn_builder] - pub fn alter_logo(&mut self, logo: Image) -> &mut Self { - self.logo.set(logo); - self - } - - #[fn_builder] - pub fn alter_frontpage(&mut self, frontpage: FnContextualPath) -> &mut Self { - self.frontpage = frontpage; - self - } - - // SiteBranding GETTERS. - - pub fn name(&self) -> &String { - &self.name - } - - pub fn slogan(&self) -> &SiteSlogan { - &self.slogan - } - - pub fn logo(&self) -> &SiteLogo { - &self.logo - } - - pub fn frontpage(&self) -> &FnContextualPath { - &self.frontpage - } -} diff --git a/pagetop-minimal/src/lib.rs b/pagetop-minimal/src/lib.rs deleted file mode 100644 index f19e3ba0..00000000 --- a/pagetop-minimal/src/lib.rs +++ /dev/null @@ -1,82 +0,0 @@ -use pagetop::prelude::*; - -pub mod component; - -new_handle!(MODULE_MINIMAL); - -static_locales!(LOCALES_MINIMAL); - -static_files!(minimal); - -// Library version. -const VERSION_MINIMAL: &str = env!("CARGO_PKG_VERSION"); - -// Context parameter. -const PARAM_MINIMAL_FLEX: &str = "minimal.flex"; - -#[rustfmt::skip] -#[derive(Default)] -pub enum BreakPoint { - #[default] - None, /* Does not apply */ - SM, /* @media screen and (max-width: 35.5em) - Applies <= 568px */ - MD, /* @media screen and (max-width: 48em) - Applies <= 768px */ - LG, /* @media screen and (max-width: 64em) - Applies <= 1024px */ - XL, /* @media screen and (max-width: 80em) - Applies <= 1280px */ - X2L, /* @media screen and (max-width: 120em) - Applies <= 1920px */ - X3L, /* @media screen and (max-width: 160em) - Applies <= 2560px */ -} - -#[rustfmt::skip] -impl ToString for BreakPoint { - fn to_string(&self) -> String { - match self { - BreakPoint::None => "bp-no".to_string(), - BreakPoint::SM => "bp-sm".to_string(), - BreakPoint::MD => "bp-md".to_string(), - BreakPoint::LG => "bp-lg".to_string(), - BreakPoint::XL => "bp-xl".to_string(), - BreakPoint::X2L => "bp-x2l".to_string(), - BreakPoint::X3L => "bp-x3l".to_string(), - } - } -} - -pub struct Minimal; - -impl ModuleTrait for Minimal { - fn handle(&self) -> Handle { - MODULE_MINIMAL - } - - fn name(&self) -> L10n { - L10n::t("module_name", &LOCALES_MINIMAL) - } - - fn description(&self) -> L10n { - L10n::t("module_description", &LOCALES_MINIMAL) - } - - fn actions(&self) -> Vec<Action> { - actions![ActionAfterPrepareBody::with(after_prepare_body).with_weight(99)] - } - - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/minimal", minimal); - } -} - -impl Minimal { - pub(crate) fn load_assets(&self, cx: &mut Context) -> &Self { - cx.set_param::<bool>(PARAM_MINIMAL_ASSETS, true); - self - } -} - -fn after_prepare_body(page: &mut Page) { - if let Some(true) = page.context().get_param::<bool>(PARAM_MINIMAL_ASSETS) { - page.context().alter(ContextOp::AddStyleSheet( - StyleSheet::at("/minimal/css/minimal.css").with_version(VERSION_MINIMAL), - )); - } -} diff --git a/pagetop-minimal/src/locale/en-US/module.ftl b/pagetop-minimal/src/locale/en-US/module.ftl deleted file mode 100644 index bef19cf3..00000000 --- a/pagetop-minimal/src/locale/en-US/module.ftl +++ /dev/null @@ -1,9 +0,0 @@ -module_name = Minimal components -module_description = Minimal set of components for page composition. - -# SiteBranding component. -site_home = Home - -# PoweredBy component. -poweredby_pagetop = Powered by {$pagetop_link} -pagetop_logo = PageTop logo diff --git a/pagetop-minimal/src/locale/es-ES/module.ftl b/pagetop-minimal/src/locale/es-ES/module.ftl deleted file mode 100644 index 8576b061..00000000 --- a/pagetop-minimal/src/locale/es-ES/module.ftl +++ /dev/null @@ -1,9 +0,0 @@ -module_name = Componentes Minimal -module_description = Conjunto mínimo de componentes para la composición de páginas. - -# SiteBranding component. -site_home = Inicio - -# PoweredBy component. -poweredby_pagetop = Funciona con {$pagetop_link} -pagetop_logo = Logotipo de PageTop diff --git a/pagetop-minimal/static/css/flex.css b/pagetop-minimal/static/css/flex.css deleted file mode 100644 index 81a4a331..00000000 --- a/pagetop-minimal/static/css/flex.css +++ /dev/null @@ -1,361 +0,0 @@ -/* CONTAINERS */ - -.flex-container { - display: flex; - flex-wrap: nowrap; - justify-content: flex-start; - position: relative; - max-width: 100%; - width: 100%; - padding: 0; -} -.flex-row, -.flex-col.bp-no { - flex-direction: column; -} -.flex-row.flex-reverse, -.flex-col.flex-reverse.bp-no { - flex-direction: column-reverse; -} -.flex-col, -.flex.row.bp-no { - flex-direction: row; -} -.flex-col.flex-reverse, -.flex-row.flex-reverse.bp-no { - flex-direction: row-reverse; -} - -.flex-container.flex-wrap { - flex-wrap: wrap; - align-content: flex-start; -} -.flex-container.flex-wrap-reverse { - flex-wrap: wrap-reverse; - align-content: flex-start; -} - -.flex-container.flex-align-end { - align-content: flex-end; -} -.flex-container.flex-align-center { - align-content: center; -} -.flex-container.flex-align-stretch { - align-content: stretch; -} -.flex-container.flex-align-space-between { - align-content: space-between; -} -.flex-container.flex-align-space-around { - align-content: space-around; -} - -.flex-container.flex-justify-end { - justify-content: flex-end; -} -.flex-container.flex-justify-center { - justify-content: center; -} -.flex-container.flex-justify-space-between { - justify-content: space-between; -} -.flex-container.flex-justify-space-around { - justify-content: space-around; -} -.flex-container.flex-justify-space-evenly { - justify-content: space-evenly; -} - -.flex-container.flex-item-bottom { - align-items: flex-end; -} -.flex-container.flex-item-middle { - align-items: center; -} -.flex-container.flex-item-stretch { - align-items: stretch; -} -.flex-container.flex-item-baseline { - align-items: baseline; -} - -/* ITEMS */ - -.flex-item { - padding: 0 !important; -} - -.flex-item.flex-grow-1 { - flex-grow: 1; -} -.flex-item.flex-grow-2 { - flex-grow: 2; -} -.flex-item.flex-grow-3 { - flex-grow: 3; -} -.flex-item.flex-grow-4 { - flex-grow: 4; -} -.flex-item.flex-grow-5 { - flex-grow: 5; -} -.flex-item.flex-grow-6 { - flex-grow: 6; -} -.flex-item.flex-grow-7 { - flex-grow: 7; -} -.flex-item.flex-grow-8 { - flex-grow: 8; -} -.flex-item.flex-grow-9 { - flex-grow: 9; -} - -.flex-item.flex-shrink-1 { - flex-shrink: 1; -} -.flex-item.flex-shrink-2 { - flex-shrink: 2; -} -.flex-item.flex-shrink-3 { - flex-shrink: 3; -} -.flex-item.flex-shrink-4 { - flex-shrink: 4; -} -.flex-item.flex-shrink-5 { - flex-shrink: 5; -} -.flex-item.flex-shrink-6 { - flex-shrink: 6; -} -.flex-item.flex-shrink-7 { - flex-shrink: 7; -} -.flex-item.flex-shrink-8 { - flex-shrink: 8; -} -.flex-item.flex-shrink-9 { - flex-shrink: 9; -} - -.flex-item.flex-width-10 { - flex: 0 0 10%; - max-width: 10%; -} -.flex-item.flex-width-20 { - flex: 0 0 20%; - max-width: 20%; -} -.flex-item.flex-width-25 { - flex: 0 0 25%; - max-width: 25%; -} -.flex-item.flex-width-33 { - flex: 0 0 33.3333%; - max-width: 33.3333%; -} -.flex-item.flex-width-40 { - flex: 0 0 40%; - max-width: 40%; -} -.flex-item.flex-width-50 { - flex: 0 0 60%; - max-width: 50%; -} -.flex-item.flex-width-60 { - flex: 0 0 60%; - max-width: 60%; -} -.flex-item.flex-width-66 { - flex: 0 0 66.6666%; - max-width: 66.6666%; -} -.flex-item.flex-width-75 { - flex: 0 0 75%; - max-width: 75%; -} -.flex-item.flex-width-80 { - flex: 0 0 80%; - max-width: 80%; -} -.flex-item.flex-width-90 { - flex: 0 0 90%; - max-width: 90%; -} - -.flex-item.flex-offset-10 { - margin-left: 10%; -} -.flex-item.flex-offset-20 { - margin-left: 20%; -} -.flex-item.flex-offset-25 { - margin-left: 25%; -} -.flex-item.flex-offset-33 { - margin-left: 33.3333%; -} -.flex-item.flex-offset-40 { - margin-left: 40%; -} -.flex-item.flex-offset-50 { - margin-left: 50%; -} -.flex-item.flex-offset-60 { - margin-left: 60%; -} -.flex-item.flex-offset-66 { - margin-left: 66.6666%; -} -.flex-item.flex-offset-75 { - margin-left: 75%; -} -.flex-item.flex-offset-80 { - margin-left: 80%; -} -.flex-item.flex-offset-90 { - margin-left: 90%; -} - -.flex-item.flex-item-top { - align-self: flex-start; -} -.flex-item.flex-item-bottom { - align-self: flex-end; -} -.flex-item.flex-item-middle { - align-self: center; -} -.flex-item.flex-item-stretch { - align-self: stretch; -} -.flex-item.flex-item-baseline { - align-self: baseline; -} - -/* BREAKPOINTS */ - -/* SM - Applies <= 568px */ -@media screen and (max-width: 35.5em) { - .flex-row.bp-sm { - flex-direction: row; - } - .flex-row.flex-reverse.bp-sm { - flex-direction: row-reverse; - } - .flex-col.bp-sm { - flex-direction: column; - } - .flex-col.flex-reverse.bp-sm { - flex-direction: column-reverse; - } - .flex-col.bp-sm .flex-item { - flex: 1 1 auto; - max-width: 100%; - margin-left: 0; - } -} -/* MD - Applies <= 768px */ -@media screen and (max-width: 48em) { - .flex-row.bp-md { - flex-direction: row; - } - .flex-row.flex-reverse.bp-md { - flex-direction: row-reverse; - } - .flex-col.bp-md { - flex-direction: column; - } - .flex-col.flex-reverse.bp-md { - flex-direction: column-reverse; - } - .flex-col.bp-md .flex-item { - flex: 1 1 auto; - max-width: 100%; - margin-left: 0; - } -} -/* LG - Applies <= 1024px */ -@media screen and (max-width: 64em) { - .flex-row.bp-lg { - flex-direction: row; - } - .flex-row.flex-reverse.bp-lg { - flex-direction: row-reverse; - } - .flex-col.bp-lg { - flex-direction: column; - } - .flex-col.flex-reverse.bp-lg { - flex-direction: column-reverse; - } - .flex-col.bp-lg .flex-item { - flex: 1 1 auto; - max-width: 100%; - margin-left: 0; - } -} -/* XL - Applies <= 1280px */ -@media screen and (max-width: 80em) { - .flex-row.bp-xl { - flex-direction: row; - } - .flex-row.flex-reverse.bp-xl { - flex-direction: row-reverse; - } - .flex-col.bp-xl { - flex-direction: column; - } - .flex-col.flex-reverse.bp-xl { - flex-direction: column-reverse; - } - .flex-col.bp-xl .flex-item { - flex: 1 1 auto; - max-width: 100%; - margin-left: 0; - } -} -/* X2L - Applies <= 1920px */ -@media screen and (max-width: 120em) { - .flex-row.bp-x2l { - flex-direction: row; - } - .flex-row.flex-reverse.bp-x2l { - flex-direction: row-reverse; - } - .flex-col.bp-x2l { - flex-direction: column; - } - .flex-col.flex-reverse.bp-x2l { - flex-direction: column-reverse; - } - .flex-col.bp-x2l .flex-item { - flex: 1 1 auto; - max-width: 100%; - margin-left: 0; - } -} -/* X3L - Applies <= 2560px */ -@media screen and (max-width: 160em) { - .flex-row.bp-x3l { - flex-direction: row; - } - .flex-row.flex-reverse.bp-x3l { - flex-direction: row-reverse; - } - .flex-col.bp-x3l { - flex-direction: column; - } - .flex-col.flex-reverse.bp-x3l { - flex-direction: column-reverse; - } - .flex-col.bp-x3l .flex-item { - flex: 1 1 auto; - max-width: 100%; - margin-left: 0; - } -} diff --git a/pagetop-minimal/static/css/minimal.css b/pagetop-minimal/static/css/minimal.css deleted file mode 100644 index eda8142e..00000000 --- a/pagetop-minimal/static/css/minimal.css +++ /dev/null @@ -1,75 +0,0 @@ -/* Flex components */ -.flex { - display: flex; - flex-direction: column; -} -@media (min-width: 768px) { - .flex { - flex-direction: row; - } -} -/* Grid components */ -.row .row { - margin: 0 -1.5em; -} -.col { - padding: 0 1.5em; -} -.row:after { - content: ""; - clear: both; - display: table; -} -@media only screen { - .col { - float: left; - width: 100%; - box-sizing: border-box; - } -} - -/* SiteBranding component */ /* -#site-branding { - float: left; -} -.site-branding-wrapper { - position: relative; -} -.site-branding-logo { - display: none; -} -.site-branding-text { - display: inline-block; - margin: 10px 0 0 10px; -} -.site-branding-slogan { - display: none; -} -@media (min-width: 768px) { - #site-branding { - display: inline-block; - } - .site-branding-logo { - display: inline-block; - margin: 10px 0 0 10px; - } - .site-branding-text { - position: absolute; - width: max-content; - bottom: 0; - } - .site-branding-slogan { - display: block; - } -} -*/ -/* PoweredBy component */ -#powered-by { - text-align: center; -} -#powered-by .pagetop-logo img, -#powered-by .pagetop-logo svg { - margin-left: .275em; - height: 1.275em; - vertical-align: middle; -} diff --git a/pagetop-minimal/static/icons/bootstrap-icons.css b/pagetop-minimal/static/icons/bootstrap-icons.css deleted file mode 100644 index 9a7d8ae2..00000000 --- a/pagetop-minimal/static/icons/bootstrap-icons.css +++ /dev/null @@ -1,1705 +0,0 @@ -@font-face { - font-family: "bootstrap-icons"; - src: url("bootstrap-icons.woff2?ver=1.8.2") format("woff2"), - url("bootstrap-icons.woff?ver=1.8.2") format("woff"); -} - -.bi::before, -[class^="bi-"]::before, -[class*=" bi-"]::before { - display: inline-block; - font-display: block; - font-family: bootstrap-icons !important; - font-style: normal; - font-weight: normal !important; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: -.125em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.bi-123::before { content: "\f67f"; } -.bi-alarm-fill::before { content: "\f101"; } -.bi-alarm::before { content: "\f102"; } -.bi-align-bottom::before { content: "\f103"; } -.bi-align-center::before { content: "\f104"; } -.bi-align-end::before { content: "\f105"; } -.bi-align-middle::before { content: "\f106"; } -.bi-align-start::before { content: "\f107"; } -.bi-align-top::before { content: "\f108"; } -.bi-alt::before { content: "\f109"; } -.bi-app-indicator::before { content: "\f10a"; } -.bi-app::before { content: "\f10b"; } -.bi-archive-fill::before { content: "\f10c"; } -.bi-archive::before { content: "\f10d"; } -.bi-arrow-90deg-down::before { content: "\f10e"; } -.bi-arrow-90deg-left::before { content: "\f10f"; } -.bi-arrow-90deg-right::before { content: "\f110"; } -.bi-arrow-90deg-up::before { content: "\f111"; } -.bi-arrow-bar-down::before { content: "\f112"; } -.bi-arrow-bar-left::before { content: "\f113"; } -.bi-arrow-bar-right::before { content: "\f114"; } -.bi-arrow-bar-up::before { content: "\f115"; } -.bi-arrow-clockwise::before { content: "\f116"; } -.bi-arrow-counterclockwise::before { content: "\f117"; } -.bi-arrow-down-circle-fill::before { content: "\f118"; } -.bi-arrow-down-circle::before { content: "\f119"; } -.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } -.bi-arrow-down-left-circle::before { content: "\f11b"; } -.bi-arrow-down-left-square-fill::before { content: "\f11c"; } -.bi-arrow-down-left-square::before { content: "\f11d"; } -.bi-arrow-down-left::before { content: "\f11e"; } -.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } -.bi-arrow-down-right-circle::before { content: "\f120"; } -.bi-arrow-down-right-square-fill::before { content: "\f121"; } -.bi-arrow-down-right-square::before { content: "\f122"; } -.bi-arrow-down-right::before { content: "\f123"; } -.bi-arrow-down-short::before { content: "\f124"; } -.bi-arrow-down-square-fill::before { content: "\f125"; } -.bi-arrow-down-square::before { content: "\f126"; } -.bi-arrow-down-up::before { content: "\f127"; } -.bi-arrow-down::before { content: "\f128"; } -.bi-arrow-left-circle-fill::before { content: "\f129"; } -.bi-arrow-left-circle::before { content: "\f12a"; } -.bi-arrow-left-right::before { content: "\f12b"; } -.bi-arrow-left-short::before { content: "\f12c"; } -.bi-arrow-left-square-fill::before { content: "\f12d"; } -.bi-arrow-left-square::before { content: "\f12e"; } -.bi-arrow-left::before { content: "\f12f"; } -.bi-arrow-repeat::before { content: "\f130"; } -.bi-arrow-return-left::before { content: "\f131"; } -.bi-arrow-return-right::before { content: "\f132"; } -.bi-arrow-right-circle-fill::before { content: "\f133"; } -.bi-arrow-right-circle::before { content: "\f134"; } -.bi-arrow-right-short::before { content: "\f135"; } -.bi-arrow-right-square-fill::before { content: "\f136"; } -.bi-arrow-right-square::before { content: "\f137"; } -.bi-arrow-right::before { content: "\f138"; } -.bi-arrow-up-circle-fill::before { content: "\f139"; } -.bi-arrow-up-circle::before { content: "\f13a"; } -.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } -.bi-arrow-up-left-circle::before { content: "\f13c"; } -.bi-arrow-up-left-square-fill::before { content: "\f13d"; } -.bi-arrow-up-left-square::before { content: "\f13e"; } -.bi-arrow-up-left::before { content: "\f13f"; } -.bi-arrow-up-right-circle-fill::before { content: "\f140"; } -.bi-arrow-up-right-circle::before { content: "\f141"; } -.bi-arrow-up-right-square-fill::before { content: "\f142"; } -.bi-arrow-up-right-square::before { content: "\f143"; } -.bi-arrow-up-right::before { content: "\f144"; } -.bi-arrow-up-short::before { content: "\f145"; } -.bi-arrow-up-square-fill::before { content: "\f146"; } -.bi-arrow-up-square::before { content: "\f147"; } -.bi-arrow-up::before { content: "\f148"; } -.bi-arrows-angle-contract::before { content: "\f149"; } -.bi-arrows-angle-expand::before { content: "\f14a"; } -.bi-arrows-collapse::before { content: "\f14b"; } -.bi-arrows-expand::before { content: "\f14c"; } -.bi-arrows-fullscreen::before { content: "\f14d"; } -.bi-arrows-move::before { content: "\f14e"; } -.bi-aspect-ratio-fill::before { content: "\f14f"; } -.bi-aspect-ratio::before { content: "\f150"; } -.bi-asterisk::before { content: "\f151"; } -.bi-at::before { content: "\f152"; } -.bi-award-fill::before { content: "\f153"; } -.bi-award::before { content: "\f154"; } -.bi-back::before { content: "\f155"; } -.bi-backspace-fill::before { content: "\f156"; } -.bi-backspace-reverse-fill::before { content: "\f157"; } -.bi-backspace-reverse::before { content: "\f158"; } -.bi-backspace::before { content: "\f159"; } -.bi-badge-3d-fill::before { content: "\f15a"; } -.bi-badge-3d::before { content: "\f15b"; } -.bi-badge-4k-fill::before { content: "\f15c"; } -.bi-badge-4k::before { content: "\f15d"; } -.bi-badge-8k-fill::before { content: "\f15e"; } -.bi-badge-8k::before { content: "\f15f"; } -.bi-badge-ad-fill::before { content: "\f160"; } -.bi-badge-ad::before { content: "\f161"; } -.bi-badge-ar-fill::before { content: "\f162"; } -.bi-badge-ar::before { content: "\f163"; } -.bi-badge-cc-fill::before { content: "\f164"; } -.bi-badge-cc::before { content: "\f165"; } -.bi-badge-hd-fill::before { content: "\f166"; } -.bi-badge-hd::before { content: "\f167"; } -.bi-badge-tm-fill::before { content: "\f168"; } -.bi-badge-tm::before { content: "\f169"; } -.bi-badge-vo-fill::before { content: "\f16a"; } -.bi-badge-vo::before { content: "\f16b"; } -.bi-badge-vr-fill::before { content: "\f16c"; } -.bi-badge-vr::before { content: "\f16d"; } -.bi-badge-wc-fill::before { content: "\f16e"; } -.bi-badge-wc::before { content: "\f16f"; } -.bi-bag-check-fill::before { content: "\f170"; } -.bi-bag-check::before { content: "\f171"; } -.bi-bag-dash-fill::before { content: "\f172"; } -.bi-bag-dash::before { content: "\f173"; } -.bi-bag-fill::before { content: "\f174"; } -.bi-bag-plus-fill::before { content: "\f175"; } -.bi-bag-plus::before { content: "\f176"; } -.bi-bag-x-fill::before { content: "\f177"; } -.bi-bag-x::before { content: "\f178"; } -.bi-bag::before { content: "\f179"; } -.bi-bar-chart-fill::before { content: "\f17a"; } -.bi-bar-chart-line-fill::before { content: "\f17b"; } -.bi-bar-chart-line::before { content: "\f17c"; } -.bi-bar-chart-steps::before { content: "\f17d"; } -.bi-bar-chart::before { content: "\f17e"; } -.bi-basket-fill::before { content: "\f17f"; } -.bi-basket::before { content: "\f180"; } -.bi-basket2-fill::before { content: "\f181"; } -.bi-basket2::before { content: "\f182"; } -.bi-basket3-fill::before { content: "\f183"; } -.bi-basket3::before { content: "\f184"; } -.bi-battery-charging::before { content: "\f185"; } -.bi-battery-full::before { content: "\f186"; } -.bi-battery-half::before { content: "\f187"; } -.bi-battery::before { content: "\f188"; } -.bi-bell-fill::before { content: "\f189"; } -.bi-bell::before { content: "\f18a"; } -.bi-bezier::before { content: "\f18b"; } -.bi-bezier2::before { content: "\f18c"; } -.bi-bicycle::before { content: "\f18d"; } -.bi-binoculars-fill::before { content: "\f18e"; } -.bi-binoculars::before { content: "\f18f"; } -.bi-blockquote-left::before { content: "\f190"; } -.bi-blockquote-right::before { content: "\f191"; } -.bi-book-fill::before { content: "\f192"; } -.bi-book-half::before { content: "\f193"; } -.bi-book::before { content: "\f194"; } -.bi-bookmark-check-fill::before { content: "\f195"; } -.bi-bookmark-check::before { content: "\f196"; } -.bi-bookmark-dash-fill::before { content: "\f197"; } -.bi-bookmark-dash::before { content: "\f198"; } -.bi-bookmark-fill::before { content: "\f199"; } -.bi-bookmark-heart-fill::before { content: "\f19a"; } -.bi-bookmark-heart::before { content: "\f19b"; } -.bi-bookmark-plus-fill::before { content: "\f19c"; } -.bi-bookmark-plus::before { content: "\f19d"; } -.bi-bookmark-star-fill::before { content: "\f19e"; } -.bi-bookmark-star::before { content: "\f19f"; } -.bi-bookmark-x-fill::before { content: "\f1a0"; } -.bi-bookmark-x::before { content: "\f1a1"; } -.bi-bookmark::before { content: "\f1a2"; } -.bi-bookmarks-fill::before { content: "\f1a3"; } -.bi-bookmarks::before { content: "\f1a4"; } -.bi-bookshelf::before { content: "\f1a5"; } -.bi-bootstrap-fill::before { content: "\f1a6"; } -.bi-bootstrap-reboot::before { content: "\f1a7"; } -.bi-bootstrap::before { content: "\f1a8"; } -.bi-border-all::before { content: "\f1a9"; } -.bi-border-bottom::before { content: "\f1aa"; } -.bi-border-center::before { content: "\f1ab"; } -.bi-border-inner::before { content: "\f1ac"; } -.bi-border-left::before { content: "\f1ad"; } -.bi-border-middle::before { content: "\f1ae"; } -.bi-border-outer::before { content: "\f1af"; } -.bi-border-right::before { content: "\f1b0"; } -.bi-border-style::before { content: "\f1b1"; } -.bi-border-top::before { content: "\f1b2"; } -.bi-border-width::before { content: "\f1b3"; } -.bi-border::before { content: "\f1b4"; } -.bi-bounding-box-circles::before { content: "\f1b5"; } -.bi-bounding-box::before { content: "\f1b6"; } -.bi-box-arrow-down-left::before { content: "\f1b7"; } -.bi-box-arrow-down-right::before { content: "\f1b8"; } -.bi-box-arrow-down::before { content: "\f1b9"; } -.bi-box-arrow-in-down-left::before { content: "\f1ba"; } -.bi-box-arrow-in-down-right::before { content: "\f1bb"; } -.bi-box-arrow-in-down::before { content: "\f1bc"; } -.bi-box-arrow-in-left::before { content: "\f1bd"; } -.bi-box-arrow-in-right::before { content: "\f1be"; } -.bi-box-arrow-in-up-left::before { content: "\f1bf"; } -.bi-box-arrow-in-up-right::before { content: "\f1c0"; } -.bi-box-arrow-in-up::before { content: "\f1c1"; } -.bi-box-arrow-left::before { content: "\f1c2"; } -.bi-box-arrow-right::before { content: "\f1c3"; } -.bi-box-arrow-up-left::before { content: "\f1c4"; } -.bi-box-arrow-up-right::before { content: "\f1c5"; } -.bi-box-arrow-up::before { content: "\f1c6"; } -.bi-box-seam::before { content: "\f1c7"; } -.bi-box::before { content: "\f1c8"; } -.bi-braces::before { content: "\f1c9"; } -.bi-bricks::before { content: "\f1ca"; } -.bi-briefcase-fill::before { content: "\f1cb"; } -.bi-briefcase::before { content: "\f1cc"; } -.bi-brightness-alt-high-fill::before { content: "\f1cd"; } -.bi-brightness-alt-high::before { content: "\f1ce"; } -.bi-brightness-alt-low-fill::before { content: "\f1cf"; } -.bi-brightness-alt-low::before { content: "\f1d0"; } -.bi-brightness-high-fill::before { content: "\f1d1"; } -.bi-brightness-high::before { content: "\f1d2"; } -.bi-brightness-low-fill::before { content: "\f1d3"; } -.bi-brightness-low::before { content: "\f1d4"; } -.bi-broadcast-pin::before { content: "\f1d5"; } -.bi-broadcast::before { content: "\f1d6"; } -.bi-brush-fill::before { content: "\f1d7"; } -.bi-brush::before { content: "\f1d8"; } -.bi-bucket-fill::before { content: "\f1d9"; } -.bi-bucket::before { content: "\f1da"; } -.bi-bug-fill::before { content: "\f1db"; } -.bi-bug::before { content: "\f1dc"; } -.bi-building::before { content: "\f1dd"; } -.bi-bullseye::before { content: "\f1de"; } -.bi-calculator-fill::before { content: "\f1df"; } -.bi-calculator::before { content: "\f1e0"; } -.bi-calendar-check-fill::before { content: "\f1e1"; } -.bi-calendar-check::before { content: "\f1e2"; } -.bi-calendar-date-fill::before { content: "\f1e3"; } -.bi-calendar-date::before { content: "\f1e4"; } -.bi-calendar-day-fill::before { content: "\f1e5"; } -.bi-calendar-day::before { content: "\f1e6"; } -.bi-calendar-event-fill::before { content: "\f1e7"; } -.bi-calendar-event::before { content: "\f1e8"; } -.bi-calendar-fill::before { content: "\f1e9"; } -.bi-calendar-minus-fill::before { content: "\f1ea"; } -.bi-calendar-minus::before { content: "\f1eb"; } -.bi-calendar-month-fill::before { content: "\f1ec"; } -.bi-calendar-month::before { content: "\f1ed"; } -.bi-calendar-plus-fill::before { content: "\f1ee"; } -.bi-calendar-plus::before { content: "\f1ef"; } -.bi-calendar-range-fill::before { content: "\f1f0"; } -.bi-calendar-range::before { content: "\f1f1"; } -.bi-calendar-week-fill::before { content: "\f1f2"; } -.bi-calendar-week::before { content: "\f1f3"; } -.bi-calendar-x-fill::before { content: "\f1f4"; } -.bi-calendar-x::before { content: "\f1f5"; } -.bi-calendar::before { content: "\f1f6"; } -.bi-calendar2-check-fill::before { content: "\f1f7"; } -.bi-calendar2-check::before { content: "\f1f8"; } -.bi-calendar2-date-fill::before { content: "\f1f9"; } -.bi-calendar2-date::before { content: "\f1fa"; } -.bi-calendar2-day-fill::before { content: "\f1fb"; } -.bi-calendar2-day::before { content: "\f1fc"; } -.bi-calendar2-event-fill::before { content: "\f1fd"; } -.bi-calendar2-event::before { content: "\f1fe"; } -.bi-calendar2-fill::before { content: "\f1ff"; } -.bi-calendar2-minus-fill::before { content: "\f200"; } -.bi-calendar2-minus::before { content: "\f201"; } -.bi-calendar2-month-fill::before { content: "\f202"; } -.bi-calendar2-month::before { content: "\f203"; } -.bi-calendar2-plus-fill::before { content: "\f204"; } -.bi-calendar2-plus::before { content: "\f205"; } -.bi-calendar2-range-fill::before { content: "\f206"; } -.bi-calendar2-range::before { content: "\f207"; } -.bi-calendar2-week-fill::before { content: "\f208"; } -.bi-calendar2-week::before { content: "\f209"; } -.bi-calendar2-x-fill::before { content: "\f20a"; } -.bi-calendar2-x::before { content: "\f20b"; } -.bi-calendar2::before { content: "\f20c"; } -.bi-calendar3-event-fill::before { content: "\f20d"; } -.bi-calendar3-event::before { content: "\f20e"; } -.bi-calendar3-fill::before { content: "\f20f"; } -.bi-calendar3-range-fill::before { content: "\f210"; } -.bi-calendar3-range::before { content: "\f211"; } -.bi-calendar3-week-fill::before { content: "\f212"; } -.bi-calendar3-week::before { content: "\f213"; } -.bi-calendar3::before { content: "\f214"; } -.bi-calendar4-event::before { content: "\f215"; } -.bi-calendar4-range::before { content: "\f216"; } -.bi-calendar4-week::before { content: "\f217"; } -.bi-calendar4::before { content: "\f218"; } -.bi-camera-fill::before { content: "\f219"; } -.bi-camera-reels-fill::before { content: "\f21a"; } -.bi-camera-reels::before { content: "\f21b"; } -.bi-camera-video-fill::before { content: "\f21c"; } -.bi-camera-video-off-fill::before { content: "\f21d"; } -.bi-camera-video-off::before { content: "\f21e"; } -.bi-camera-video::before { content: "\f21f"; } -.bi-camera::before { content: "\f220"; } -.bi-camera2::before { content: "\f221"; } -.bi-capslock-fill::before { content: "\f222"; } -.bi-capslock::before { content: "\f223"; } -.bi-card-checklist::before { content: "\f224"; } -.bi-card-heading::before { content: "\f225"; } -.bi-card-image::before { content: "\f226"; } -.bi-card-list::before { content: "\f227"; } -.bi-card-text::before { content: "\f228"; } -.bi-caret-down-fill::before { content: "\f229"; } -.bi-caret-down-square-fill::before { content: "\f22a"; } -.bi-caret-down-square::before { content: "\f22b"; } -.bi-caret-down::before { content: "\f22c"; } -.bi-caret-left-fill::before { content: "\f22d"; } -.bi-caret-left-square-fill::before { content: "\f22e"; } -.bi-caret-left-square::before { content: "\f22f"; } -.bi-caret-left::before { content: "\f230"; } -.bi-caret-right-fill::before { content: "\f231"; } -.bi-caret-right-square-fill::before { content: "\f232"; } -.bi-caret-right-square::before { content: "\f233"; } -.bi-caret-right::before { content: "\f234"; } -.bi-caret-up-fill::before { content: "\f235"; } -.bi-caret-up-square-fill::before { content: "\f236"; } -.bi-caret-up-square::before { content: "\f237"; } -.bi-caret-up::before { content: "\f238"; } -.bi-cart-check-fill::before { content: "\f239"; } -.bi-cart-check::before { content: "\f23a"; } -.bi-cart-dash-fill::before { content: "\f23b"; } -.bi-cart-dash::before { content: "\f23c"; } -.bi-cart-fill::before { content: "\f23d"; } -.bi-cart-plus-fill::before { content: "\f23e"; } -.bi-cart-plus::before { content: "\f23f"; } -.bi-cart-x-fill::before { content: "\f240"; } -.bi-cart-x::before { content: "\f241"; } -.bi-cart::before { content: "\f242"; } -.bi-cart2::before { content: "\f243"; } -.bi-cart3::before { content: "\f244"; } -.bi-cart4::before { content: "\f245"; } -.bi-cash-stack::before { content: "\f246"; } -.bi-cash::before { content: "\f247"; } -.bi-cast::before { content: "\f248"; } -.bi-chat-dots-fill::before { content: "\f249"; } -.bi-chat-dots::before { content: "\f24a"; } -.bi-chat-fill::before { content: "\f24b"; } -.bi-chat-left-dots-fill::before { content: "\f24c"; } -.bi-chat-left-dots::before { content: "\f24d"; } -.bi-chat-left-fill::before { content: "\f24e"; } -.bi-chat-left-quote-fill::before { content: "\f24f"; } -.bi-chat-left-quote::before { content: "\f250"; } -.bi-chat-left-text-fill::before { content: "\f251"; } -.bi-chat-left-text::before { content: "\f252"; } -.bi-chat-left::before { content: "\f253"; } -.bi-chat-quote-fill::before { content: "\f254"; } -.bi-chat-quote::before { content: "\f255"; } -.bi-chat-right-dots-fill::before { content: "\f256"; } -.bi-chat-right-dots::before { content: "\f257"; } -.bi-chat-right-fill::before { content: "\f258"; } -.bi-chat-right-quote-fill::before { content: "\f259"; } -.bi-chat-right-quote::before { content: "\f25a"; } -.bi-chat-right-text-fill::before { content: "\f25b"; } -.bi-chat-right-text::before { content: "\f25c"; } -.bi-chat-right::before { content: "\f25d"; } -.bi-chat-square-dots-fill::before { content: "\f25e"; } -.bi-chat-square-dots::before { content: "\f25f"; } -.bi-chat-square-fill::before { content: "\f260"; } -.bi-chat-square-quote-fill::before { content: "\f261"; } -.bi-chat-square-quote::before { content: "\f262"; } -.bi-chat-square-text-fill::before { content: "\f263"; } -.bi-chat-square-text::before { content: "\f264"; } -.bi-chat-square::before { content: "\f265"; } -.bi-chat-text-fill::before { content: "\f266"; } -.bi-chat-text::before { content: "\f267"; } -.bi-chat::before { content: "\f268"; } -.bi-check-all::before { content: "\f269"; } -.bi-check-circle-fill::before { content: "\f26a"; } -.bi-check-circle::before { content: "\f26b"; } -.bi-check-square-fill::before { content: "\f26c"; } -.bi-check-square::before { content: "\f26d"; } -.bi-check::before { content: "\f26e"; } -.bi-check2-all::before { content: "\f26f"; } -.bi-check2-circle::before { content: "\f270"; } -.bi-check2-square::before { content: "\f271"; } -.bi-check2::before { content: "\f272"; } -.bi-chevron-bar-contract::before { content: "\f273"; } -.bi-chevron-bar-down::before { content: "\f274"; } -.bi-chevron-bar-expand::before { content: "\f275"; } -.bi-chevron-bar-left::before { content: "\f276"; } -.bi-chevron-bar-right::before { content: "\f277"; } -.bi-chevron-bar-up::before { content: "\f278"; } -.bi-chevron-compact-down::before { content: "\f279"; } -.bi-chevron-compact-left::before { content: "\f27a"; } -.bi-chevron-compact-right::before { content: "\f27b"; } -.bi-chevron-compact-up::before { content: "\f27c"; } -.bi-chevron-contract::before { content: "\f27d"; } -.bi-chevron-double-down::before { content: "\f27e"; } -.bi-chevron-double-left::before { content: "\f27f"; } -.bi-chevron-double-right::before { content: "\f280"; } -.bi-chevron-double-up::before { content: "\f281"; } -.bi-chevron-down::before { content: "\f282"; } -.bi-chevron-expand::before { content: "\f283"; } -.bi-chevron-left::before { content: "\f284"; } -.bi-chevron-right::before { content: "\f285"; } -.bi-chevron-up::before { content: "\f286"; } -.bi-circle-fill::before { content: "\f287"; } -.bi-circle-half::before { content: "\f288"; } -.bi-circle-square::before { content: "\f289"; } -.bi-circle::before { content: "\f28a"; } -.bi-clipboard-check::before { content: "\f28b"; } -.bi-clipboard-data::before { content: "\f28c"; } -.bi-clipboard-minus::before { content: "\f28d"; } -.bi-clipboard-plus::before { content: "\f28e"; } -.bi-clipboard-x::before { content: "\f28f"; } -.bi-clipboard::before { content: "\f290"; } -.bi-clock-fill::before { content: "\f291"; } -.bi-clock-history::before { content: "\f292"; } -.bi-clock::before { content: "\f293"; } -.bi-cloud-arrow-down-fill::before { content: "\f294"; } -.bi-cloud-arrow-down::before { content: "\f295"; } -.bi-cloud-arrow-up-fill::before { content: "\f296"; } -.bi-cloud-arrow-up::before { content: "\f297"; } -.bi-cloud-check-fill::before { content: "\f298"; } -.bi-cloud-check::before { content: "\f299"; } -.bi-cloud-download-fill::before { content: "\f29a"; } -.bi-cloud-download::before { content: "\f29b"; } -.bi-cloud-drizzle-fill::before { content: "\f29c"; } -.bi-cloud-drizzle::before { content: "\f29d"; } -.bi-cloud-fill::before { content: "\f29e"; } -.bi-cloud-fog-fill::before { content: "\f29f"; } -.bi-cloud-fog::before { content: "\f2a0"; } -.bi-cloud-fog2-fill::before { content: "\f2a1"; } -.bi-cloud-fog2::before { content: "\f2a2"; } -.bi-cloud-hail-fill::before { content: "\f2a3"; } -.bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-1::before { content: "\f2a5"; } -.bi-cloud-haze-fill::before { content: "\f2a6"; } -.bi-cloud-haze::before { content: "\f2a7"; } -.bi-cloud-haze2-fill::before { content: "\f2a8"; } -.bi-cloud-lightning-fill::before { content: "\f2a9"; } -.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } -.bi-cloud-lightning-rain::before { content: "\f2ab"; } -.bi-cloud-lightning::before { content: "\f2ac"; } -.bi-cloud-minus-fill::before { content: "\f2ad"; } -.bi-cloud-minus::before { content: "\f2ae"; } -.bi-cloud-moon-fill::before { content: "\f2af"; } -.bi-cloud-moon::before { content: "\f2b0"; } -.bi-cloud-plus-fill::before { content: "\f2b1"; } -.bi-cloud-plus::before { content: "\f2b2"; } -.bi-cloud-rain-fill::before { content: "\f2b3"; } -.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } -.bi-cloud-rain-heavy::before { content: "\f2b5"; } -.bi-cloud-rain::before { content: "\f2b6"; } -.bi-cloud-slash-fill::before { content: "\f2b7"; } -.bi-cloud-slash::before { content: "\f2b8"; } -.bi-cloud-sleet-fill::before { content: "\f2b9"; } -.bi-cloud-sleet::before { content: "\f2ba"; } -.bi-cloud-snow-fill::before { content: "\f2bb"; } -.bi-cloud-snow::before { content: "\f2bc"; } -.bi-cloud-sun-fill::before { content: "\f2bd"; } -.bi-cloud-sun::before { content: "\f2be"; } -.bi-cloud-upload-fill::before { content: "\f2bf"; } -.bi-cloud-upload::before { content: "\f2c0"; } -.bi-cloud::before { content: "\f2c1"; } -.bi-clouds-fill::before { content: "\f2c2"; } -.bi-clouds::before { content: "\f2c3"; } -.bi-cloudy-fill::before { content: "\f2c4"; } -.bi-cloudy::before { content: "\f2c5"; } -.bi-code-slash::before { content: "\f2c6"; } -.bi-code-square::before { content: "\f2c7"; } -.bi-code::before { content: "\f2c8"; } -.bi-collection-fill::before { content: "\f2c9"; } -.bi-collection-play-fill::before { content: "\f2ca"; } -.bi-collection-play::before { content: "\f2cb"; } -.bi-collection::before { content: "\f2cc"; } -.bi-columns-gap::before { content: "\f2cd"; } -.bi-columns::before { content: "\f2ce"; } -.bi-command::before { content: "\f2cf"; } -.bi-compass-fill::before { content: "\f2d0"; } -.bi-compass::before { content: "\f2d1"; } -.bi-cone-striped::before { content: "\f2d2"; } -.bi-cone::before { content: "\f2d3"; } -.bi-controller::before { content: "\f2d4"; } -.bi-cpu-fill::before { content: "\f2d5"; } -.bi-cpu::before { content: "\f2d6"; } -.bi-credit-card-2-back-fill::before { content: "\f2d7"; } -.bi-credit-card-2-back::before { content: "\f2d8"; } -.bi-credit-card-2-front-fill::before { content: "\f2d9"; } -.bi-credit-card-2-front::before { content: "\f2da"; } -.bi-credit-card-fill::before { content: "\f2db"; } -.bi-credit-card::before { content: "\f2dc"; } -.bi-crop::before { content: "\f2dd"; } -.bi-cup-fill::before { content: "\f2de"; } -.bi-cup-straw::before { content: "\f2df"; } -.bi-cup::before { content: "\f2e0"; } -.bi-cursor-fill::before { content: "\f2e1"; } -.bi-cursor-text::before { content: "\f2e2"; } -.bi-cursor::before { content: "\f2e3"; } -.bi-dash-circle-dotted::before { content: "\f2e4"; } -.bi-dash-circle-fill::before { content: "\f2e5"; } -.bi-dash-circle::before { content: "\f2e6"; } -.bi-dash-square-dotted::before { content: "\f2e7"; } -.bi-dash-square-fill::before { content: "\f2e8"; } -.bi-dash-square::before { content: "\f2e9"; } -.bi-dash::before { content: "\f2ea"; } -.bi-diagram-2-fill::before { content: "\f2eb"; } -.bi-diagram-2::before { content: "\f2ec"; } -.bi-diagram-3-fill::before { content: "\f2ed"; } -.bi-diagram-3::before { content: "\f2ee"; } -.bi-diamond-fill::before { content: "\f2ef"; } -.bi-diamond-half::before { content: "\f2f0"; } -.bi-diamond::before { content: "\f2f1"; } -.bi-dice-1-fill::before { content: "\f2f2"; } -.bi-dice-1::before { content: "\f2f3"; } -.bi-dice-2-fill::before { content: "\f2f4"; } -.bi-dice-2::before { content: "\f2f5"; } -.bi-dice-3-fill::before { content: "\f2f6"; } -.bi-dice-3::before { content: "\f2f7"; } -.bi-dice-4-fill::before { content: "\f2f8"; } -.bi-dice-4::before { content: "\f2f9"; } -.bi-dice-5-fill::before { content: "\f2fa"; } -.bi-dice-5::before { content: "\f2fb"; } -.bi-dice-6-fill::before { content: "\f2fc"; } -.bi-dice-6::before { content: "\f2fd"; } -.bi-disc-fill::before { content: "\f2fe"; } -.bi-disc::before { content: "\f2ff"; } -.bi-discord::before { content: "\f300"; } -.bi-display-fill::before { content: "\f301"; } -.bi-display::before { content: "\f302"; } -.bi-distribute-horizontal::before { content: "\f303"; } -.bi-distribute-vertical::before { content: "\f304"; } -.bi-door-closed-fill::before { content: "\f305"; } -.bi-door-closed::before { content: "\f306"; } -.bi-door-open-fill::before { content: "\f307"; } -.bi-door-open::before { content: "\f308"; } -.bi-dot::before { content: "\f309"; } -.bi-download::before { content: "\f30a"; } -.bi-droplet-fill::before { content: "\f30b"; } -.bi-droplet-half::before { content: "\f30c"; } -.bi-droplet::before { content: "\f30d"; } -.bi-earbuds::before { content: "\f30e"; } -.bi-easel-fill::before { content: "\f30f"; } -.bi-easel::before { content: "\f310"; } -.bi-egg-fill::before { content: "\f311"; } -.bi-egg-fried::before { content: "\f312"; } -.bi-egg::before { content: "\f313"; } -.bi-eject-fill::before { content: "\f314"; } -.bi-eject::before { content: "\f315"; } -.bi-emoji-angry-fill::before { content: "\f316"; } -.bi-emoji-angry::before { content: "\f317"; } -.bi-emoji-dizzy-fill::before { content: "\f318"; } -.bi-emoji-dizzy::before { content: "\f319"; } -.bi-emoji-expressionless-fill::before { content: "\f31a"; } -.bi-emoji-expressionless::before { content: "\f31b"; } -.bi-emoji-frown-fill::before { content: "\f31c"; } -.bi-emoji-frown::before { content: "\f31d"; } -.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } -.bi-emoji-heart-eyes::before { content: "\f31f"; } -.bi-emoji-laughing-fill::before { content: "\f320"; } -.bi-emoji-laughing::before { content: "\f321"; } -.bi-emoji-neutral-fill::before { content: "\f322"; } -.bi-emoji-neutral::before { content: "\f323"; } -.bi-emoji-smile-fill::before { content: "\f324"; } -.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } -.bi-emoji-smile-upside-down::before { content: "\f326"; } -.bi-emoji-smile::before { content: "\f327"; } -.bi-emoji-sunglasses-fill::before { content: "\f328"; } -.bi-emoji-sunglasses::before { content: "\f329"; } -.bi-emoji-wink-fill::before { content: "\f32a"; } -.bi-emoji-wink::before { content: "\f32b"; } -.bi-envelope-fill::before { content: "\f32c"; } -.bi-envelope-open-fill::before { content: "\f32d"; } -.bi-envelope-open::before { content: "\f32e"; } -.bi-envelope::before { content: "\f32f"; } -.bi-eraser-fill::before { content: "\f330"; } -.bi-eraser::before { content: "\f331"; } -.bi-exclamation-circle-fill::before { content: "\f332"; } -.bi-exclamation-circle::before { content: "\f333"; } -.bi-exclamation-diamond-fill::before { content: "\f334"; } -.bi-exclamation-diamond::before { content: "\f335"; } -.bi-exclamation-octagon-fill::before { content: "\f336"; } -.bi-exclamation-octagon::before { content: "\f337"; } -.bi-exclamation-square-fill::before { content: "\f338"; } -.bi-exclamation-square::before { content: "\f339"; } -.bi-exclamation-triangle-fill::before { content: "\f33a"; } -.bi-exclamation-triangle::before { content: "\f33b"; } -.bi-exclamation::before { content: "\f33c"; } -.bi-exclude::before { content: "\f33d"; } -.bi-eye-fill::before { content: "\f33e"; } -.bi-eye-slash-fill::before { content: "\f33f"; } -.bi-eye-slash::before { content: "\f340"; } -.bi-eye::before { content: "\f341"; } -.bi-eyedropper::before { content: "\f342"; } -.bi-eyeglasses::before { content: "\f343"; } -.bi-facebook::before { content: "\f344"; } -.bi-file-arrow-down-fill::before { content: "\f345"; } -.bi-file-arrow-down::before { content: "\f346"; } -.bi-file-arrow-up-fill::before { content: "\f347"; } -.bi-file-arrow-up::before { content: "\f348"; } -.bi-file-bar-graph-fill::before { content: "\f349"; } -.bi-file-bar-graph::before { content: "\f34a"; } -.bi-file-binary-fill::before { content: "\f34b"; } -.bi-file-binary::before { content: "\f34c"; } -.bi-file-break-fill::before { content: "\f34d"; } -.bi-file-break::before { content: "\f34e"; } -.bi-file-check-fill::before { content: "\f34f"; } -.bi-file-check::before { content: "\f350"; } -.bi-file-code-fill::before { content: "\f351"; } -.bi-file-code::before { content: "\f352"; } -.bi-file-diff-fill::before { content: "\f353"; } -.bi-file-diff::before { content: "\f354"; } -.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } -.bi-file-earmark-arrow-down::before { content: "\f356"; } -.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } -.bi-file-earmark-arrow-up::before { content: "\f358"; } -.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } -.bi-file-earmark-bar-graph::before { content: "\f35a"; } -.bi-file-earmark-binary-fill::before { content: "\f35b"; } -.bi-file-earmark-binary::before { content: "\f35c"; } -.bi-file-earmark-break-fill::before { content: "\f35d"; } -.bi-file-earmark-break::before { content: "\f35e"; } -.bi-file-earmark-check-fill::before { content: "\f35f"; } -.bi-file-earmark-check::before { content: "\f360"; } -.bi-file-earmark-code-fill::before { content: "\f361"; } -.bi-file-earmark-code::before { content: "\f362"; } -.bi-file-earmark-diff-fill::before { content: "\f363"; } -.bi-file-earmark-diff::before { content: "\f364"; } -.bi-file-earmark-easel-fill::before { content: "\f365"; } -.bi-file-earmark-easel::before { content: "\f366"; } -.bi-file-earmark-excel-fill::before { content: "\f367"; } -.bi-file-earmark-excel::before { content: "\f368"; } -.bi-file-earmark-fill::before { content: "\f369"; } -.bi-file-earmark-font-fill::before { content: "\f36a"; } -.bi-file-earmark-font::before { content: "\f36b"; } -.bi-file-earmark-image-fill::before { content: "\f36c"; } -.bi-file-earmark-image::before { content: "\f36d"; } -.bi-file-earmark-lock-fill::before { content: "\f36e"; } -.bi-file-earmark-lock::before { content: "\f36f"; } -.bi-file-earmark-lock2-fill::before { content: "\f370"; } -.bi-file-earmark-lock2::before { content: "\f371"; } -.bi-file-earmark-medical-fill::before { content: "\f372"; } -.bi-file-earmark-medical::before { content: "\f373"; } -.bi-file-earmark-minus-fill::before { content: "\f374"; } -.bi-file-earmark-minus::before { content: "\f375"; } -.bi-file-earmark-music-fill::before { content: "\f376"; } -.bi-file-earmark-music::before { content: "\f377"; } -.bi-file-earmark-person-fill::before { content: "\f378"; } -.bi-file-earmark-person::before { content: "\f379"; } -.bi-file-earmark-play-fill::before { content: "\f37a"; } -.bi-file-earmark-play::before { content: "\f37b"; } -.bi-file-earmark-plus-fill::before { content: "\f37c"; } -.bi-file-earmark-plus::before { content: "\f37d"; } -.bi-file-earmark-post-fill::before { content: "\f37e"; } -.bi-file-earmark-post::before { content: "\f37f"; } -.bi-file-earmark-ppt-fill::before { content: "\f380"; } -.bi-file-earmark-ppt::before { content: "\f381"; } -.bi-file-earmark-richtext-fill::before { content: "\f382"; } -.bi-file-earmark-richtext::before { content: "\f383"; } -.bi-file-earmark-ruled-fill::before { content: "\f384"; } -.bi-file-earmark-ruled::before { content: "\f385"; } -.bi-file-earmark-slides-fill::before { content: "\f386"; } -.bi-file-earmark-slides::before { content: "\f387"; } -.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } -.bi-file-earmark-spreadsheet::before { content: "\f389"; } -.bi-file-earmark-text-fill::before { content: "\f38a"; } -.bi-file-earmark-text::before { content: "\f38b"; } -.bi-file-earmark-word-fill::before { content: "\f38c"; } -.bi-file-earmark-word::before { content: "\f38d"; } -.bi-file-earmark-x-fill::before { content: "\f38e"; } -.bi-file-earmark-x::before { content: "\f38f"; } -.bi-file-earmark-zip-fill::before { content: "\f390"; } -.bi-file-earmark-zip::before { content: "\f391"; } -.bi-file-earmark::before { content: "\f392"; } -.bi-file-easel-fill::before { content: "\f393"; } -.bi-file-easel::before { content: "\f394"; } -.bi-file-excel-fill::before { content: "\f395"; } -.bi-file-excel::before { content: "\f396"; } -.bi-file-fill::before { content: "\f397"; } -.bi-file-font-fill::before { content: "\f398"; } -.bi-file-font::before { content: "\f399"; } -.bi-file-image-fill::before { content: "\f39a"; } -.bi-file-image::before { content: "\f39b"; } -.bi-file-lock-fill::before { content: "\f39c"; } -.bi-file-lock::before { content: "\f39d"; } -.bi-file-lock2-fill::before { content: "\f39e"; } -.bi-file-lock2::before { content: "\f39f"; } -.bi-file-medical-fill::before { content: "\f3a0"; } -.bi-file-medical::before { content: "\f3a1"; } -.bi-file-minus-fill::before { content: "\f3a2"; } -.bi-file-minus::before { content: "\f3a3"; } -.bi-file-music-fill::before { content: "\f3a4"; } -.bi-file-music::before { content: "\f3a5"; } -.bi-file-person-fill::before { content: "\f3a6"; } -.bi-file-person::before { content: "\f3a7"; } -.bi-file-play-fill::before { content: "\f3a8"; } -.bi-file-play::before { content: "\f3a9"; } -.bi-file-plus-fill::before { content: "\f3aa"; } -.bi-file-plus::before { content: "\f3ab"; } -.bi-file-post-fill::before { content: "\f3ac"; } -.bi-file-post::before { content: "\f3ad"; } -.bi-file-ppt-fill::before { content: "\f3ae"; } -.bi-file-ppt::before { content: "\f3af"; } -.bi-file-richtext-fill::before { content: "\f3b0"; } -.bi-file-richtext::before { content: "\f3b1"; } -.bi-file-ruled-fill::before { content: "\f3b2"; } -.bi-file-ruled::before { content: "\f3b3"; } -.bi-file-slides-fill::before { content: "\f3b4"; } -.bi-file-slides::before { content: "\f3b5"; } -.bi-file-spreadsheet-fill::before { content: "\f3b6"; } -.bi-file-spreadsheet::before { content: "\f3b7"; } -.bi-file-text-fill::before { content: "\f3b8"; } -.bi-file-text::before { content: "\f3b9"; } -.bi-file-word-fill::before { content: "\f3ba"; } -.bi-file-word::before { content: "\f3bb"; } -.bi-file-x-fill::before { content: "\f3bc"; } -.bi-file-x::before { content: "\f3bd"; } -.bi-file-zip-fill::before { content: "\f3be"; } -.bi-file-zip::before { content: "\f3bf"; } -.bi-file::before { content: "\f3c0"; } -.bi-files-alt::before { content: "\f3c1"; } -.bi-files::before { content: "\f3c2"; } -.bi-film::before { content: "\f3c3"; } -.bi-filter-circle-fill::before { content: "\f3c4"; } -.bi-filter-circle::before { content: "\f3c5"; } -.bi-filter-left::before { content: "\f3c6"; } -.bi-filter-right::before { content: "\f3c7"; } -.bi-filter-square-fill::before { content: "\f3c8"; } -.bi-filter-square::before { content: "\f3c9"; } -.bi-filter::before { content: "\f3ca"; } -.bi-flag-fill::before { content: "\f3cb"; } -.bi-flag::before { content: "\f3cc"; } -.bi-flower1::before { content: "\f3cd"; } -.bi-flower2::before { content: "\f3ce"; } -.bi-flower3::before { content: "\f3cf"; } -.bi-folder-check::before { content: "\f3d0"; } -.bi-folder-fill::before { content: "\f3d1"; } -.bi-folder-minus::before { content: "\f3d2"; } -.bi-folder-plus::before { content: "\f3d3"; } -.bi-folder-symlink-fill::before { content: "\f3d4"; } -.bi-folder-symlink::before { content: "\f3d5"; } -.bi-folder-x::before { content: "\f3d6"; } -.bi-folder::before { content: "\f3d7"; } -.bi-folder2-open::before { content: "\f3d8"; } -.bi-folder2::before { content: "\f3d9"; } -.bi-fonts::before { content: "\f3da"; } -.bi-forward-fill::before { content: "\f3db"; } -.bi-forward::before { content: "\f3dc"; } -.bi-front::before { content: "\f3dd"; } -.bi-fullscreen-exit::before { content: "\f3de"; } -.bi-fullscreen::before { content: "\f3df"; } -.bi-funnel-fill::before { content: "\f3e0"; } -.bi-funnel::before { content: "\f3e1"; } -.bi-gear-fill::before { content: "\f3e2"; } -.bi-gear-wide-connected::before { content: "\f3e3"; } -.bi-gear-wide::before { content: "\f3e4"; } -.bi-gear::before { content: "\f3e5"; } -.bi-gem::before { content: "\f3e6"; } -.bi-geo-alt-fill::before { content: "\f3e7"; } -.bi-geo-alt::before { content: "\f3e8"; } -.bi-geo-fill::before { content: "\f3e9"; } -.bi-geo::before { content: "\f3ea"; } -.bi-gift-fill::before { content: "\f3eb"; } -.bi-gift::before { content: "\f3ec"; } -.bi-github::before { content: "\f3ed"; } -.bi-globe::before { content: "\f3ee"; } -.bi-globe2::before { content: "\f3ef"; } -.bi-google::before { content: "\f3f0"; } -.bi-graph-down::before { content: "\f3f1"; } -.bi-graph-up::before { content: "\f3f2"; } -.bi-grid-1x2-fill::before { content: "\f3f3"; } -.bi-grid-1x2::before { content: "\f3f4"; } -.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } -.bi-grid-3x2-gap::before { content: "\f3f6"; } -.bi-grid-3x2::before { content: "\f3f7"; } -.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } -.bi-grid-3x3-gap::before { content: "\f3f9"; } -.bi-grid-3x3::before { content: "\f3fa"; } -.bi-grid-fill::before { content: "\f3fb"; } -.bi-grid::before { content: "\f3fc"; } -.bi-grip-horizontal::before { content: "\f3fd"; } -.bi-grip-vertical::before { content: "\f3fe"; } -.bi-hammer::before { content: "\f3ff"; } -.bi-hand-index-fill::before { content: "\f400"; } -.bi-hand-index-thumb-fill::before { content: "\f401"; } -.bi-hand-index-thumb::before { content: "\f402"; } -.bi-hand-index::before { content: "\f403"; } -.bi-hand-thumbs-down-fill::before { content: "\f404"; } -.bi-hand-thumbs-down::before { content: "\f405"; } -.bi-hand-thumbs-up-fill::before { content: "\f406"; } -.bi-hand-thumbs-up::before { content: "\f407"; } -.bi-handbag-fill::before { content: "\f408"; } -.bi-handbag::before { content: "\f409"; } -.bi-hash::before { content: "\f40a"; } -.bi-hdd-fill::before { content: "\f40b"; } -.bi-hdd-network-fill::before { content: "\f40c"; } -.bi-hdd-network::before { content: "\f40d"; } -.bi-hdd-rack-fill::before { content: "\f40e"; } -.bi-hdd-rack::before { content: "\f40f"; } -.bi-hdd-stack-fill::before { content: "\f410"; } -.bi-hdd-stack::before { content: "\f411"; } -.bi-hdd::before { content: "\f412"; } -.bi-headphones::before { content: "\f413"; } -.bi-headset::before { content: "\f414"; } -.bi-heart-fill::before { content: "\f415"; } -.bi-heart-half::before { content: "\f416"; } -.bi-heart::before { content: "\f417"; } -.bi-heptagon-fill::before { content: "\f418"; } -.bi-heptagon-half::before { content: "\f419"; } -.bi-heptagon::before { content: "\f41a"; } -.bi-hexagon-fill::before { content: "\f41b"; } -.bi-hexagon-half::before { content: "\f41c"; } -.bi-hexagon::before { content: "\f41d"; } -.bi-hourglass-bottom::before { content: "\f41e"; } -.bi-hourglass-split::before { content: "\f41f"; } -.bi-hourglass-top::before { content: "\f420"; } -.bi-hourglass::before { content: "\f421"; } -.bi-house-door-fill::before { content: "\f422"; } -.bi-house-door::before { content: "\f423"; } -.bi-house-fill::before { content: "\f424"; } -.bi-house::before { content: "\f425"; } -.bi-hr::before { content: "\f426"; } -.bi-hurricane::before { content: "\f427"; } -.bi-image-alt::before { content: "\f428"; } -.bi-image-fill::before { content: "\f429"; } -.bi-image::before { content: "\f42a"; } -.bi-images::before { content: "\f42b"; } -.bi-inbox-fill::before { content: "\f42c"; } -.bi-inbox::before { content: "\f42d"; } -.bi-inboxes-fill::before { content: "\f42e"; } -.bi-inboxes::before { content: "\f42f"; } -.bi-info-circle-fill::before { content: "\f430"; } -.bi-info-circle::before { content: "\f431"; } -.bi-info-square-fill::before { content: "\f432"; } -.bi-info-square::before { content: "\f433"; } -.bi-info::before { content: "\f434"; } -.bi-input-cursor-text::before { content: "\f435"; } -.bi-input-cursor::before { content: "\f436"; } -.bi-instagram::before { content: "\f437"; } -.bi-intersect::before { content: "\f438"; } -.bi-journal-album::before { content: "\f439"; } -.bi-journal-arrow-down::before { content: "\f43a"; } -.bi-journal-arrow-up::before { content: "\f43b"; } -.bi-journal-bookmark-fill::before { content: "\f43c"; } -.bi-journal-bookmark::before { content: "\f43d"; } -.bi-journal-check::before { content: "\f43e"; } -.bi-journal-code::before { content: "\f43f"; } -.bi-journal-medical::before { content: "\f440"; } -.bi-journal-minus::before { content: "\f441"; } -.bi-journal-plus::before { content: "\f442"; } -.bi-journal-richtext::before { content: "\f443"; } -.bi-journal-text::before { content: "\f444"; } -.bi-journal-x::before { content: "\f445"; } -.bi-journal::before { content: "\f446"; } -.bi-journals::before { content: "\f447"; } -.bi-joystick::before { content: "\f448"; } -.bi-justify-left::before { content: "\f449"; } -.bi-justify-right::before { content: "\f44a"; } -.bi-justify::before { content: "\f44b"; } -.bi-kanban-fill::before { content: "\f44c"; } -.bi-kanban::before { content: "\f44d"; } -.bi-key-fill::before { content: "\f44e"; } -.bi-key::before { content: "\f44f"; } -.bi-keyboard-fill::before { content: "\f450"; } -.bi-keyboard::before { content: "\f451"; } -.bi-ladder::before { content: "\f452"; } -.bi-lamp-fill::before { content: "\f453"; } -.bi-lamp::before { content: "\f454"; } -.bi-laptop-fill::before { content: "\f455"; } -.bi-laptop::before { content: "\f456"; } -.bi-layer-backward::before { content: "\f457"; } -.bi-layer-forward::before { content: "\f458"; } -.bi-layers-fill::before { content: "\f459"; } -.bi-layers-half::before { content: "\f45a"; } -.bi-layers::before { content: "\f45b"; } -.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } -.bi-layout-sidebar-inset::before { content: "\f45d"; } -.bi-layout-sidebar-reverse::before { content: "\f45e"; } -.bi-layout-sidebar::before { content: "\f45f"; } -.bi-layout-split::before { content: "\f460"; } -.bi-layout-text-sidebar-reverse::before { content: "\f461"; } -.bi-layout-text-sidebar::before { content: "\f462"; } -.bi-layout-text-window-reverse::before { content: "\f463"; } -.bi-layout-text-window::before { content: "\f464"; } -.bi-layout-three-columns::before { content: "\f465"; } -.bi-layout-wtf::before { content: "\f466"; } -.bi-life-preserver::before { content: "\f467"; } -.bi-lightbulb-fill::before { content: "\f468"; } -.bi-lightbulb-off-fill::before { content: "\f469"; } -.bi-lightbulb-off::before { content: "\f46a"; } -.bi-lightbulb::before { content: "\f46b"; } -.bi-lightning-charge-fill::before { content: "\f46c"; } -.bi-lightning-charge::before { content: "\f46d"; } -.bi-lightning-fill::before { content: "\f46e"; } -.bi-lightning::before { content: "\f46f"; } -.bi-link-45deg::before { content: "\f470"; } -.bi-link::before { content: "\f471"; } -.bi-linkedin::before { content: "\f472"; } -.bi-list-check::before { content: "\f473"; } -.bi-list-nested::before { content: "\f474"; } -.bi-list-ol::before { content: "\f475"; } -.bi-list-stars::before { content: "\f476"; } -.bi-list-task::before { content: "\f477"; } -.bi-list-ul::before { content: "\f478"; } -.bi-list::before { content: "\f479"; } -.bi-lock-fill::before { content: "\f47a"; } -.bi-lock::before { content: "\f47b"; } -.bi-mailbox::before { content: "\f47c"; } -.bi-mailbox2::before { content: "\f47d"; } -.bi-map-fill::before { content: "\f47e"; } -.bi-map::before { content: "\f47f"; } -.bi-markdown-fill::before { content: "\f480"; } -.bi-markdown::before { content: "\f481"; } -.bi-mask::before { content: "\f482"; } -.bi-megaphone-fill::before { content: "\f483"; } -.bi-megaphone::before { content: "\f484"; } -.bi-menu-app-fill::before { content: "\f485"; } -.bi-menu-app::before { content: "\f486"; } -.bi-menu-button-fill::before { content: "\f487"; } -.bi-menu-button-wide-fill::before { content: "\f488"; } -.bi-menu-button-wide::before { content: "\f489"; } -.bi-menu-button::before { content: "\f48a"; } -.bi-menu-down::before { content: "\f48b"; } -.bi-menu-up::before { content: "\f48c"; } -.bi-mic-fill::before { content: "\f48d"; } -.bi-mic-mute-fill::before { content: "\f48e"; } -.bi-mic-mute::before { content: "\f48f"; } -.bi-mic::before { content: "\f490"; } -.bi-minecart-loaded::before { content: "\f491"; } -.bi-minecart::before { content: "\f492"; } -.bi-moisture::before { content: "\f493"; } -.bi-moon-fill::before { content: "\f494"; } -.bi-moon-stars-fill::before { content: "\f495"; } -.bi-moon-stars::before { content: "\f496"; } -.bi-moon::before { content: "\f497"; } -.bi-mouse-fill::before { content: "\f498"; } -.bi-mouse::before { content: "\f499"; } -.bi-mouse2-fill::before { content: "\f49a"; } -.bi-mouse2::before { content: "\f49b"; } -.bi-mouse3-fill::before { content: "\f49c"; } -.bi-mouse3::before { content: "\f49d"; } -.bi-music-note-beamed::before { content: "\f49e"; } -.bi-music-note-list::before { content: "\f49f"; } -.bi-music-note::before { content: "\f4a0"; } -.bi-music-player-fill::before { content: "\f4a1"; } -.bi-music-player::before { content: "\f4a2"; } -.bi-newspaper::before { content: "\f4a3"; } -.bi-node-minus-fill::before { content: "\f4a4"; } -.bi-node-minus::before { content: "\f4a5"; } -.bi-node-plus-fill::before { content: "\f4a6"; } -.bi-node-plus::before { content: "\f4a7"; } -.bi-nut-fill::before { content: "\f4a8"; } -.bi-nut::before { content: "\f4a9"; } -.bi-octagon-fill::before { content: "\f4aa"; } -.bi-octagon-half::before { content: "\f4ab"; } -.bi-octagon::before { content: "\f4ac"; } -.bi-option::before { content: "\f4ad"; } -.bi-outlet::before { content: "\f4ae"; } -.bi-paint-bucket::before { content: "\f4af"; } -.bi-palette-fill::before { content: "\f4b0"; } -.bi-palette::before { content: "\f4b1"; } -.bi-palette2::before { content: "\f4b2"; } -.bi-paperclip::before { content: "\f4b3"; } -.bi-paragraph::before { content: "\f4b4"; } -.bi-patch-check-fill::before { content: "\f4b5"; } -.bi-patch-check::before { content: "\f4b6"; } -.bi-patch-exclamation-fill::before { content: "\f4b7"; } -.bi-patch-exclamation::before { content: "\f4b8"; } -.bi-patch-minus-fill::before { content: "\f4b9"; } -.bi-patch-minus::before { content: "\f4ba"; } -.bi-patch-plus-fill::before { content: "\f4bb"; } -.bi-patch-plus::before { content: "\f4bc"; } -.bi-patch-question-fill::before { content: "\f4bd"; } -.bi-patch-question::before { content: "\f4be"; } -.bi-pause-btn-fill::before { content: "\f4bf"; } -.bi-pause-btn::before { content: "\f4c0"; } -.bi-pause-circle-fill::before { content: "\f4c1"; } -.bi-pause-circle::before { content: "\f4c2"; } -.bi-pause-fill::before { content: "\f4c3"; } -.bi-pause::before { content: "\f4c4"; } -.bi-peace-fill::before { content: "\f4c5"; } -.bi-peace::before { content: "\f4c6"; } -.bi-pen-fill::before { content: "\f4c7"; } -.bi-pen::before { content: "\f4c8"; } -.bi-pencil-fill::before { content: "\f4c9"; } -.bi-pencil-square::before { content: "\f4ca"; } -.bi-pencil::before { content: "\f4cb"; } -.bi-pentagon-fill::before { content: "\f4cc"; } -.bi-pentagon-half::before { content: "\f4cd"; } -.bi-pentagon::before { content: "\f4ce"; } -.bi-people-fill::before { content: "\f4cf"; } -.bi-people::before { content: "\f4d0"; } -.bi-percent::before { content: "\f4d1"; } -.bi-person-badge-fill::before { content: "\f4d2"; } -.bi-person-badge::before { content: "\f4d3"; } -.bi-person-bounding-box::before { content: "\f4d4"; } -.bi-person-check-fill::before { content: "\f4d5"; } -.bi-person-check::before { content: "\f4d6"; } -.bi-person-circle::before { content: "\f4d7"; } -.bi-person-dash-fill::before { content: "\f4d8"; } -.bi-person-dash::before { content: "\f4d9"; } -.bi-person-fill::before { content: "\f4da"; } -.bi-person-lines-fill::before { content: "\f4db"; } -.bi-person-plus-fill::before { content: "\f4dc"; } -.bi-person-plus::before { content: "\f4dd"; } -.bi-person-square::before { content: "\f4de"; } -.bi-person-x-fill::before { content: "\f4df"; } -.bi-person-x::before { content: "\f4e0"; } -.bi-person::before { content: "\f4e1"; } -.bi-phone-fill::before { content: "\f4e2"; } -.bi-phone-landscape-fill::before { content: "\f4e3"; } -.bi-phone-landscape::before { content: "\f4e4"; } -.bi-phone-vibrate-fill::before { content: "\f4e5"; } -.bi-phone-vibrate::before { content: "\f4e6"; } -.bi-phone::before { content: "\f4e7"; } -.bi-pie-chart-fill::before { content: "\f4e8"; } -.bi-pie-chart::before { content: "\f4e9"; } -.bi-pin-angle-fill::before { content: "\f4ea"; } -.bi-pin-angle::before { content: "\f4eb"; } -.bi-pin-fill::before { content: "\f4ec"; } -.bi-pin::before { content: "\f4ed"; } -.bi-pip-fill::before { content: "\f4ee"; } -.bi-pip::before { content: "\f4ef"; } -.bi-play-btn-fill::before { content: "\f4f0"; } -.bi-play-btn::before { content: "\f4f1"; } -.bi-play-circle-fill::before { content: "\f4f2"; } -.bi-play-circle::before { content: "\f4f3"; } -.bi-play-fill::before { content: "\f4f4"; } -.bi-play::before { content: "\f4f5"; } -.bi-plug-fill::before { content: "\f4f6"; } -.bi-plug::before { content: "\f4f7"; } -.bi-plus-circle-dotted::before { content: "\f4f8"; } -.bi-plus-circle-fill::before { content: "\f4f9"; } -.bi-plus-circle::before { content: "\f4fa"; } -.bi-plus-square-dotted::before { content: "\f4fb"; } -.bi-plus-square-fill::before { content: "\f4fc"; } -.bi-plus-square::before { content: "\f4fd"; } -.bi-plus::before { content: "\f4fe"; } -.bi-power::before { content: "\f4ff"; } -.bi-printer-fill::before { content: "\f500"; } -.bi-printer::before { content: "\f501"; } -.bi-puzzle-fill::before { content: "\f502"; } -.bi-puzzle::before { content: "\f503"; } -.bi-question-circle-fill::before { content: "\f504"; } -.bi-question-circle::before { content: "\f505"; } -.bi-question-diamond-fill::before { content: "\f506"; } -.bi-question-diamond::before { content: "\f507"; } -.bi-question-octagon-fill::before { content: "\f508"; } -.bi-question-octagon::before { content: "\f509"; } -.bi-question-square-fill::before { content: "\f50a"; } -.bi-question-square::before { content: "\f50b"; } -.bi-question::before { content: "\f50c"; } -.bi-rainbow::before { content: "\f50d"; } -.bi-receipt-cutoff::before { content: "\f50e"; } -.bi-receipt::before { content: "\f50f"; } -.bi-reception-0::before { content: "\f510"; } -.bi-reception-1::before { content: "\f511"; } -.bi-reception-2::before { content: "\f512"; } -.bi-reception-3::before { content: "\f513"; } -.bi-reception-4::before { content: "\f514"; } -.bi-record-btn-fill::before { content: "\f515"; } -.bi-record-btn::before { content: "\f516"; } -.bi-record-circle-fill::before { content: "\f517"; } -.bi-record-circle::before { content: "\f518"; } -.bi-record-fill::before { content: "\f519"; } -.bi-record::before { content: "\f51a"; } -.bi-record2-fill::before { content: "\f51b"; } -.bi-record2::before { content: "\f51c"; } -.bi-reply-all-fill::before { content: "\f51d"; } -.bi-reply-all::before { content: "\f51e"; } -.bi-reply-fill::before { content: "\f51f"; } -.bi-reply::before { content: "\f520"; } -.bi-rss-fill::before { content: "\f521"; } -.bi-rss::before { content: "\f522"; } -.bi-rulers::before { content: "\f523"; } -.bi-save-fill::before { content: "\f524"; } -.bi-save::before { content: "\f525"; } -.bi-save2-fill::before { content: "\f526"; } -.bi-save2::before { content: "\f527"; } -.bi-scissors::before { content: "\f528"; } -.bi-screwdriver::before { content: "\f529"; } -.bi-search::before { content: "\f52a"; } -.bi-segmented-nav::before { content: "\f52b"; } -.bi-server::before { content: "\f52c"; } -.bi-share-fill::before { content: "\f52d"; } -.bi-share::before { content: "\f52e"; } -.bi-shield-check::before { content: "\f52f"; } -.bi-shield-exclamation::before { content: "\f530"; } -.bi-shield-fill-check::before { content: "\f531"; } -.bi-shield-fill-exclamation::before { content: "\f532"; } -.bi-shield-fill-minus::before { content: "\f533"; } -.bi-shield-fill-plus::before { content: "\f534"; } -.bi-shield-fill-x::before { content: "\f535"; } -.bi-shield-fill::before { content: "\f536"; } -.bi-shield-lock-fill::before { content: "\f537"; } -.bi-shield-lock::before { content: "\f538"; } -.bi-shield-minus::before { content: "\f539"; } -.bi-shield-plus::before { content: "\f53a"; } -.bi-shield-shaded::before { content: "\f53b"; } -.bi-shield-slash-fill::before { content: "\f53c"; } -.bi-shield-slash::before { content: "\f53d"; } -.bi-shield-x::before { content: "\f53e"; } -.bi-shield::before { content: "\f53f"; } -.bi-shift-fill::before { content: "\f540"; } -.bi-shift::before { content: "\f541"; } -.bi-shop-window::before { content: "\f542"; } -.bi-shop::before { content: "\f543"; } -.bi-shuffle::before { content: "\f544"; } -.bi-signpost-2-fill::before { content: "\f545"; } -.bi-signpost-2::before { content: "\f546"; } -.bi-signpost-fill::before { content: "\f547"; } -.bi-signpost-split-fill::before { content: "\f548"; } -.bi-signpost-split::before { content: "\f549"; } -.bi-signpost::before { content: "\f54a"; } -.bi-sim-fill::before { content: "\f54b"; } -.bi-sim::before { content: "\f54c"; } -.bi-skip-backward-btn-fill::before { content: "\f54d"; } -.bi-skip-backward-btn::before { content: "\f54e"; } -.bi-skip-backward-circle-fill::before { content: "\f54f"; } -.bi-skip-backward-circle::before { content: "\f550"; } -.bi-skip-backward-fill::before { content: "\f551"; } -.bi-skip-backward::before { content: "\f552"; } -.bi-skip-end-btn-fill::before { content: "\f553"; } -.bi-skip-end-btn::before { content: "\f554"; } -.bi-skip-end-circle-fill::before { content: "\f555"; } -.bi-skip-end-circle::before { content: "\f556"; } -.bi-skip-end-fill::before { content: "\f557"; } -.bi-skip-end::before { content: "\f558"; } -.bi-skip-forward-btn-fill::before { content: "\f559"; } -.bi-skip-forward-btn::before { content: "\f55a"; } -.bi-skip-forward-circle-fill::before { content: "\f55b"; } -.bi-skip-forward-circle::before { content: "\f55c"; } -.bi-skip-forward-fill::before { content: "\f55d"; } -.bi-skip-forward::before { content: "\f55e"; } -.bi-skip-start-btn-fill::before { content: "\f55f"; } -.bi-skip-start-btn::before { content: "\f560"; } -.bi-skip-start-circle-fill::before { content: "\f561"; } -.bi-skip-start-circle::before { content: "\f562"; } -.bi-skip-start-fill::before { content: "\f563"; } -.bi-skip-start::before { content: "\f564"; } -.bi-slack::before { content: "\f565"; } -.bi-slash-circle-fill::before { content: "\f566"; } -.bi-slash-circle::before { content: "\f567"; } -.bi-slash-square-fill::before { content: "\f568"; } -.bi-slash-square::before { content: "\f569"; } -.bi-slash::before { content: "\f56a"; } -.bi-sliders::before { content: "\f56b"; } -.bi-smartwatch::before { content: "\f56c"; } -.bi-snow::before { content: "\f56d"; } -.bi-snow2::before { content: "\f56e"; } -.bi-snow3::before { content: "\f56f"; } -.bi-sort-alpha-down-alt::before { content: "\f570"; } -.bi-sort-alpha-down::before { content: "\f571"; } -.bi-sort-alpha-up-alt::before { content: "\f572"; } -.bi-sort-alpha-up::before { content: "\f573"; } -.bi-sort-down-alt::before { content: "\f574"; } -.bi-sort-down::before { content: "\f575"; } -.bi-sort-numeric-down-alt::before { content: "\f576"; } -.bi-sort-numeric-down::before { content: "\f577"; } -.bi-sort-numeric-up-alt::before { content: "\f578"; } -.bi-sort-numeric-up::before { content: "\f579"; } -.bi-sort-up-alt::before { content: "\f57a"; } -.bi-sort-up::before { content: "\f57b"; } -.bi-soundwave::before { content: "\f57c"; } -.bi-speaker-fill::before { content: "\f57d"; } -.bi-speaker::before { content: "\f57e"; } -.bi-speedometer::before { content: "\f57f"; } -.bi-speedometer2::before { content: "\f580"; } -.bi-spellcheck::before { content: "\f581"; } -.bi-square-fill::before { content: "\f582"; } -.bi-square-half::before { content: "\f583"; } -.bi-square::before { content: "\f584"; } -.bi-stack::before { content: "\f585"; } -.bi-star-fill::before { content: "\f586"; } -.bi-star-half::before { content: "\f587"; } -.bi-star::before { content: "\f588"; } -.bi-stars::before { content: "\f589"; } -.bi-stickies-fill::before { content: "\f58a"; } -.bi-stickies::before { content: "\f58b"; } -.bi-sticky-fill::before { content: "\f58c"; } -.bi-sticky::before { content: "\f58d"; } -.bi-stop-btn-fill::before { content: "\f58e"; } -.bi-stop-btn::before { content: "\f58f"; } -.bi-stop-circle-fill::before { content: "\f590"; } -.bi-stop-circle::before { content: "\f591"; } -.bi-stop-fill::before { content: "\f592"; } -.bi-stop::before { content: "\f593"; } -.bi-stoplights-fill::before { content: "\f594"; } -.bi-stoplights::before { content: "\f595"; } -.bi-stopwatch-fill::before { content: "\f596"; } -.bi-stopwatch::before { content: "\f597"; } -.bi-subtract::before { content: "\f598"; } -.bi-suit-club-fill::before { content: "\f599"; } -.bi-suit-club::before { content: "\f59a"; } -.bi-suit-diamond-fill::before { content: "\f59b"; } -.bi-suit-diamond::before { content: "\f59c"; } -.bi-suit-heart-fill::before { content: "\f59d"; } -.bi-suit-heart::before { content: "\f59e"; } -.bi-suit-spade-fill::before { content: "\f59f"; } -.bi-suit-spade::before { content: "\f5a0"; } -.bi-sun-fill::before { content: "\f5a1"; } -.bi-sun::before { content: "\f5a2"; } -.bi-sunglasses::before { content: "\f5a3"; } -.bi-sunrise-fill::before { content: "\f5a4"; } -.bi-sunrise::before { content: "\f5a5"; } -.bi-sunset-fill::before { content: "\f5a6"; } -.bi-sunset::before { content: "\f5a7"; } -.bi-symmetry-horizontal::before { content: "\f5a8"; } -.bi-symmetry-vertical::before { content: "\f5a9"; } -.bi-table::before { content: "\f5aa"; } -.bi-tablet-fill::before { content: "\f5ab"; } -.bi-tablet-landscape-fill::before { content: "\f5ac"; } -.bi-tablet-landscape::before { content: "\f5ad"; } -.bi-tablet::before { content: "\f5ae"; } -.bi-tag-fill::before { content: "\f5af"; } -.bi-tag::before { content: "\f5b0"; } -.bi-tags-fill::before { content: "\f5b1"; } -.bi-tags::before { content: "\f5b2"; } -.bi-telegram::before { content: "\f5b3"; } -.bi-telephone-fill::before { content: "\f5b4"; } -.bi-telephone-forward-fill::before { content: "\f5b5"; } -.bi-telephone-forward::before { content: "\f5b6"; } -.bi-telephone-inbound-fill::before { content: "\f5b7"; } -.bi-telephone-inbound::before { content: "\f5b8"; } -.bi-telephone-minus-fill::before { content: "\f5b9"; } -.bi-telephone-minus::before { content: "\f5ba"; } -.bi-telephone-outbound-fill::before { content: "\f5bb"; } -.bi-telephone-outbound::before { content: "\f5bc"; } -.bi-telephone-plus-fill::before { content: "\f5bd"; } -.bi-telephone-plus::before { content: "\f5be"; } -.bi-telephone-x-fill::before { content: "\f5bf"; } -.bi-telephone-x::before { content: "\f5c0"; } -.bi-telephone::before { content: "\f5c1"; } -.bi-terminal-fill::before { content: "\f5c2"; } -.bi-terminal::before { content: "\f5c3"; } -.bi-text-center::before { content: "\f5c4"; } -.bi-text-indent-left::before { content: "\f5c5"; } -.bi-text-indent-right::before { content: "\f5c6"; } -.bi-text-left::before { content: "\f5c7"; } -.bi-text-paragraph::before { content: "\f5c8"; } -.bi-text-right::before { content: "\f5c9"; } -.bi-textarea-resize::before { content: "\f5ca"; } -.bi-textarea-t::before { content: "\f5cb"; } -.bi-textarea::before { content: "\f5cc"; } -.bi-thermometer-half::before { content: "\f5cd"; } -.bi-thermometer-high::before { content: "\f5ce"; } -.bi-thermometer-low::before { content: "\f5cf"; } -.bi-thermometer-snow::before { content: "\f5d0"; } -.bi-thermometer-sun::before { content: "\f5d1"; } -.bi-thermometer::before { content: "\f5d2"; } -.bi-three-dots-vertical::before { content: "\f5d3"; } -.bi-three-dots::before { content: "\f5d4"; } -.bi-toggle-off::before { content: "\f5d5"; } -.bi-toggle-on::before { content: "\f5d6"; } -.bi-toggle2-off::before { content: "\f5d7"; } -.bi-toggle2-on::before { content: "\f5d8"; } -.bi-toggles::before { content: "\f5d9"; } -.bi-toggles2::before { content: "\f5da"; } -.bi-tools::before { content: "\f5db"; } -.bi-tornado::before { content: "\f5dc"; } -.bi-trash-fill::before { content: "\f5dd"; } -.bi-trash::before { content: "\f5de"; } -.bi-trash2-fill::before { content: "\f5df"; } -.bi-trash2::before { content: "\f5e0"; } -.bi-tree-fill::before { content: "\f5e1"; } -.bi-tree::before { content: "\f5e2"; } -.bi-triangle-fill::before { content: "\f5e3"; } -.bi-triangle-half::before { content: "\f5e4"; } -.bi-triangle::before { content: "\f5e5"; } -.bi-trophy-fill::before { content: "\f5e6"; } -.bi-trophy::before { content: "\f5e7"; } -.bi-tropical-storm::before { content: "\f5e8"; } -.bi-truck-flatbed::before { content: "\f5e9"; } -.bi-truck::before { content: "\f5ea"; } -.bi-tsunami::before { content: "\f5eb"; } -.bi-tv-fill::before { content: "\f5ec"; } -.bi-tv::before { content: "\f5ed"; } -.bi-twitch::before { content: "\f5ee"; } -.bi-twitter::before { content: "\f5ef"; } -.bi-type-bold::before { content: "\f5f0"; } -.bi-type-h1::before { content: "\f5f1"; } -.bi-type-h2::before { content: "\f5f2"; } -.bi-type-h3::before { content: "\f5f3"; } -.bi-type-italic::before { content: "\f5f4"; } -.bi-type-strikethrough::before { content: "\f5f5"; } -.bi-type-underline::before { content: "\f5f6"; } -.bi-type::before { content: "\f5f7"; } -.bi-ui-checks-grid::before { content: "\f5f8"; } -.bi-ui-checks::before { content: "\f5f9"; } -.bi-ui-radios-grid::before { content: "\f5fa"; } -.bi-ui-radios::before { content: "\f5fb"; } -.bi-umbrella-fill::before { content: "\f5fc"; } -.bi-umbrella::before { content: "\f5fd"; } -.bi-union::before { content: "\f5fe"; } -.bi-unlock-fill::before { content: "\f5ff"; } -.bi-unlock::before { content: "\f600"; } -.bi-upc-scan::before { content: "\f601"; } -.bi-upc::before { content: "\f602"; } -.bi-upload::before { content: "\f603"; } -.bi-vector-pen::before { content: "\f604"; } -.bi-view-list::before { content: "\f605"; } -.bi-view-stacked::before { content: "\f606"; } -.bi-vinyl-fill::before { content: "\f607"; } -.bi-vinyl::before { content: "\f608"; } -.bi-voicemail::before { content: "\f609"; } -.bi-volume-down-fill::before { content: "\f60a"; } -.bi-volume-down::before { content: "\f60b"; } -.bi-volume-mute-fill::before { content: "\f60c"; } -.bi-volume-mute::before { content: "\f60d"; } -.bi-volume-off-fill::before { content: "\f60e"; } -.bi-volume-off::before { content: "\f60f"; } -.bi-volume-up-fill::before { content: "\f610"; } -.bi-volume-up::before { content: "\f611"; } -.bi-vr::before { content: "\f612"; } -.bi-wallet-fill::before { content: "\f613"; } -.bi-wallet::before { content: "\f614"; } -.bi-wallet2::before { content: "\f615"; } -.bi-watch::before { content: "\f616"; } -.bi-water::before { content: "\f617"; } -.bi-whatsapp::before { content: "\f618"; } -.bi-wifi-1::before { content: "\f619"; } -.bi-wifi-2::before { content: "\f61a"; } -.bi-wifi-off::before { content: "\f61b"; } -.bi-wifi::before { content: "\f61c"; } -.bi-wind::before { content: "\f61d"; } -.bi-window-dock::before { content: "\f61e"; } -.bi-window-sidebar::before { content: "\f61f"; } -.bi-window::before { content: "\f620"; } -.bi-wrench::before { content: "\f621"; } -.bi-x-circle-fill::before { content: "\f622"; } -.bi-x-circle::before { content: "\f623"; } -.bi-x-diamond-fill::before { content: "\f624"; } -.bi-x-diamond::before { content: "\f625"; } -.bi-x-octagon-fill::before { content: "\f626"; } -.bi-x-octagon::before { content: "\f627"; } -.bi-x-square-fill::before { content: "\f628"; } -.bi-x-square::before { content: "\f629"; } -.bi-x::before { content: "\f62a"; } -.bi-youtube::before { content: "\f62b"; } -.bi-zoom-in::before { content: "\f62c"; } -.bi-zoom-out::before { content: "\f62d"; } -.bi-bank::before { content: "\f62e"; } -.bi-bank2::before { content: "\f62f"; } -.bi-bell-slash-fill::before { content: "\f630"; } -.bi-bell-slash::before { content: "\f631"; } -.bi-cash-coin::before { content: "\f632"; } -.bi-check-lg::before { content: "\f633"; } -.bi-coin::before { content: "\f634"; } -.bi-currency-bitcoin::before { content: "\f635"; } -.bi-currency-dollar::before { content: "\f636"; } -.bi-currency-euro::before { content: "\f637"; } -.bi-currency-exchange::before { content: "\f638"; } -.bi-currency-pound::before { content: "\f639"; } -.bi-currency-yen::before { content: "\f63a"; } -.bi-dash-lg::before { content: "\f63b"; } -.bi-exclamation-lg::before { content: "\f63c"; } -.bi-file-earmark-pdf-fill::before { content: "\f63d"; } -.bi-file-earmark-pdf::before { content: "\f63e"; } -.bi-file-pdf-fill::before { content: "\f63f"; } -.bi-file-pdf::before { content: "\f640"; } -.bi-gender-ambiguous::before { content: "\f641"; } -.bi-gender-female::before { content: "\f642"; } -.bi-gender-male::before { content: "\f643"; } -.bi-gender-trans::before { content: "\f644"; } -.bi-headset-vr::before { content: "\f645"; } -.bi-info-lg::before { content: "\f646"; } -.bi-mastodon::before { content: "\f647"; } -.bi-messenger::before { content: "\f648"; } -.bi-piggy-bank-fill::before { content: "\f649"; } -.bi-piggy-bank::before { content: "\f64a"; } -.bi-pin-map-fill::before { content: "\f64b"; } -.bi-pin-map::before { content: "\f64c"; } -.bi-plus-lg::before { content: "\f64d"; } -.bi-question-lg::before { content: "\f64e"; } -.bi-recycle::before { content: "\f64f"; } -.bi-reddit::before { content: "\f650"; } -.bi-safe-fill::before { content: "\f651"; } -.bi-safe2-fill::before { content: "\f652"; } -.bi-safe2::before { content: "\f653"; } -.bi-sd-card-fill::before { content: "\f654"; } -.bi-sd-card::before { content: "\f655"; } -.bi-skype::before { content: "\f656"; } -.bi-slash-lg::before { content: "\f657"; } -.bi-translate::before { content: "\f658"; } -.bi-x-lg::before { content: "\f659"; } -.bi-safe::before { content: "\f65a"; } -.bi-apple::before { content: "\f65b"; } -.bi-microsoft::before { content: "\f65d"; } -.bi-windows::before { content: "\f65e"; } -.bi-behance::before { content: "\f65c"; } -.bi-dribbble::before { content: "\f65f"; } -.bi-line::before { content: "\f660"; } -.bi-medium::before { content: "\f661"; } -.bi-paypal::before { content: "\f662"; } -.bi-pinterest::before { content: "\f663"; } -.bi-signal::before { content: "\f664"; } -.bi-snapchat::before { content: "\f665"; } -.bi-spotify::before { content: "\f666"; } -.bi-stack-overflow::before { content: "\f667"; } -.bi-strava::before { content: "\f668"; } -.bi-wordpress::before { content: "\f669"; } -.bi-vimeo::before { content: "\f66a"; } -.bi-activity::before { content: "\f66b"; } -.bi-easel2-fill::before { content: "\f66c"; } -.bi-easel2::before { content: "\f66d"; } -.bi-easel3-fill::before { content: "\f66e"; } -.bi-easel3::before { content: "\f66f"; } -.bi-fan::before { content: "\f670"; } -.bi-fingerprint::before { content: "\f671"; } -.bi-graph-down-arrow::before { content: "\f672"; } -.bi-graph-up-arrow::before { content: "\f673"; } -.bi-hypnotize::before { content: "\f674"; } -.bi-magic::before { content: "\f675"; } -.bi-person-rolodex::before { content: "\f676"; } -.bi-person-video::before { content: "\f677"; } -.bi-person-video2::before { content: "\f678"; } -.bi-person-video3::before { content: "\f679"; } -.bi-person-workspace::before { content: "\f67a"; } -.bi-radioactive::before { content: "\f67b"; } -.bi-webcam-fill::before { content: "\f67c"; } -.bi-webcam::before { content: "\f67d"; } -.bi-yin-yang::before { content: "\f67e"; } -.bi-bandaid-fill::before { content: "\f680"; } -.bi-bandaid::before { content: "\f681"; } -.bi-bluetooth::before { content: "\f682"; } -.bi-body-text::before { content: "\f683"; } -.bi-boombox::before { content: "\f684"; } -.bi-boxes::before { content: "\f685"; } -.bi-dpad-fill::before { content: "\f686"; } -.bi-dpad::before { content: "\f687"; } -.bi-ear-fill::before { content: "\f688"; } -.bi-ear::before { content: "\f689"; } -.bi-envelope-check-1::before { content: "\f68a"; } -.bi-envelope-check-fill::before { content: "\f68b"; } -.bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-1::before { content: "\f68d"; } -.bi-envelope-dash-fill::before { content: "\f68e"; } -.bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-1::before { content: "\f690"; } -.bi-envelope-exclamation-fill::before { content: "\f691"; } -.bi-envelope-exclamation::before { content: "\f692"; } -.bi-envelope-plus-fill::before { content: "\f693"; } -.bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-1::before { content: "\f695"; } -.bi-envelope-slash-fill::before { content: "\f696"; } -.bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-1::before { content: "\f698"; } -.bi-envelope-x-fill::before { content: "\f699"; } -.bi-envelope-x::before { content: "\f69a"; } -.bi-explicit-fill::before { content: "\f69b"; } -.bi-explicit::before { content: "\f69c"; } -.bi-git::before { content: "\f69d"; } -.bi-infinity::before { content: "\f69e"; } -.bi-list-columns-reverse::before { content: "\f69f"; } -.bi-list-columns::before { content: "\f6a0"; } -.bi-meta::before { content: "\f6a1"; } -.bi-mortorboard-fill::before { content: "\f6a2"; } -.bi-mortorboard::before { content: "\f6a3"; } -.bi-nintendo-switch::before { content: "\f6a4"; } -.bi-pc-display-horizontal::before { content: "\f6a5"; } -.bi-pc-display::before { content: "\f6a6"; } -.bi-pc-horizontal::before { content: "\f6a7"; } -.bi-pc::before { content: "\f6a8"; } -.bi-playstation::before { content: "\f6a9"; } -.bi-plus-slash-minus::before { content: "\f6aa"; } -.bi-projector-fill::before { content: "\f6ab"; } -.bi-projector::before { content: "\f6ac"; } -.bi-qr-code-scan::before { content: "\f6ad"; } -.bi-qr-code::before { content: "\f6ae"; } -.bi-quora::before { content: "\f6af"; } -.bi-quote::before { content: "\f6b0"; } -.bi-robot::before { content: "\f6b1"; } -.bi-send-check-fill::before { content: "\f6b2"; } -.bi-send-check::before { content: "\f6b3"; } -.bi-send-dash-fill::before { content: "\f6b4"; } -.bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-1::before { content: "\f6b6"; } -.bi-send-exclamation-fill::before { content: "\f6b7"; } -.bi-send-exclamation::before { content: "\f6b8"; } -.bi-send-fill::before { content: "\f6b9"; } -.bi-send-plus-fill::before { content: "\f6ba"; } -.bi-send-plus::before { content: "\f6bb"; } -.bi-send-slash-fill::before { content: "\f6bc"; } -.bi-send-slash::before { content: "\f6bd"; } -.bi-send-x-fill::before { content: "\f6be"; } -.bi-send-x::before { content: "\f6bf"; } -.bi-send::before { content: "\f6c0"; } -.bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash-1::before { content: "\f6c2"; } -.bi-terminal-dash::before { content: "\f6c3"; } -.bi-terminal-plus::before { content: "\f6c4"; } -.bi-terminal-split::before { content: "\f6c5"; } -.bi-ticket-detailed-fill::before { content: "\f6c6"; } -.bi-ticket-detailed::before { content: "\f6c7"; } -.bi-ticket-fill::before { content: "\f6c8"; } -.bi-ticket-perforated-fill::before { content: "\f6c9"; } -.bi-ticket-perforated::before { content: "\f6ca"; } -.bi-ticket::before { content: "\f6cb"; } -.bi-tiktok::before { content: "\f6cc"; } -.bi-window-dash::before { content: "\f6cd"; } -.bi-window-desktop::before { content: "\f6ce"; } -.bi-window-fullscreen::before { content: "\f6cf"; } -.bi-window-plus::before { content: "\f6d0"; } -.bi-window-split::before { content: "\f6d1"; } -.bi-window-stack::before { content: "\f6d2"; } -.bi-window-x::before { content: "\f6d3"; } -.bi-xbox::before { content: "\f6d4"; } -.bi-ethernet::before { content: "\f6d5"; } -.bi-hdmi-fill::before { content: "\f6d6"; } -.bi-hdmi::before { content: "\f6d7"; } -.bi-usb-c-fill::before { content: "\f6d8"; } -.bi-usb-c::before { content: "\f6d9"; } -.bi-usb-fill::before { content: "\f6da"; } -.bi-usb-plug-fill::before { content: "\f6db"; } -.bi-usb-plug::before { content: "\f6dc"; } -.bi-usb-symbol::before { content: "\f6dd"; } -.bi-usb::before { content: "\f6de"; } -.bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport-1::before { content: "\f6e0"; } -.bi-displayport::before { content: "\f6e1"; } -.bi-gpu-card::before { content: "\f6e2"; } -.bi-memory::before { content: "\f6e3"; } -.bi-modem-fill::before { content: "\f6e4"; } -.bi-modem::before { content: "\f6e5"; } -.bi-motherboard-fill::before { content: "\f6e6"; } -.bi-motherboard::before { content: "\f6e7"; } -.bi-optical-audio-fill::before { content: "\f6e8"; } -.bi-optical-audio::before { content: "\f6e9"; } -.bi-pci-card::before { content: "\f6ea"; } -.bi-router-fill::before { content: "\f6eb"; } -.bi-router::before { content: "\f6ec"; } -.bi-ssd-fill::before { content: "\f6ed"; } -.bi-ssd::before { content: "\f6ee"; } -.bi-thunderbolt-fill::before { content: "\f6ef"; } -.bi-thunderbolt::before { content: "\f6f0"; } -.bi-usb-drive-fill::before { content: "\f6f1"; } -.bi-usb-drive::before { content: "\f6f2"; } -.bi-usb-micro-fill::before { content: "\f6f3"; } -.bi-usb-micro::before { content: "\f6f4"; } -.bi-usb-mini-fill::before { content: "\f6f5"; } -.bi-usb-mini::before { content: "\f6f6"; } -.bi-cloud-haze2::before { content: "\f6f7"; } -.bi-device-hdd-fill::before { content: "\f6f8"; } -.bi-device-hdd::before { content: "\f6f9"; } -.bi-device-ssd-fill::before { content: "\f6fa"; } -.bi-device-ssd::before { content: "\f6fb"; } -.bi-displayport-fill::before { content: "\f6fc"; } -.bi-mortarboard-fill::before { content: "\f6fd"; } -.bi-mortarboard::before { content: "\f6fe"; } -.bi-terminal-x::before { content: "\f6ff"; } -.bi-arrow-through-heart-fill::before { content: "\f700"; } -.bi-arrow-through-heart::before { content: "\f701"; } -.bi-badge-sd-fill::before { content: "\f702"; } -.bi-badge-sd::before { content: "\f703"; } -.bi-bag-heart-fill::before { content: "\f704"; } -.bi-bag-heart::before { content: "\f705"; } -.bi-balloon-fill::before { content: "\f706"; } -.bi-balloon-heart-fill::before { content: "\f707"; } -.bi-balloon-heart::before { content: "\f708"; } -.bi-balloon::before { content: "\f709"; } -.bi-box2-fill::before { content: "\f70a"; } -.bi-box2-heart-fill::before { content: "\f70b"; } -.bi-box2-heart::before { content: "\f70c"; } -.bi-box2::before { content: "\f70d"; } -.bi-braces-asterisk::before { content: "\f70e"; } -.bi-calendar-heart-fill::before { content: "\f70f"; } -.bi-calendar-heart::before { content: "\f710"; } -.bi-calendar2-heart-fill::before { content: "\f711"; } -.bi-calendar2-heart::before { content: "\f712"; } -.bi-chat-heart-fill::before { content: "\f713"; } -.bi-chat-heart::before { content: "\f714"; } -.bi-chat-left-heart-fill::before { content: "\f715"; } -.bi-chat-left-heart::before { content: "\f716"; } -.bi-chat-right-heart-fill::before { content: "\f717"; } -.bi-chat-right-heart::before { content: "\f718"; } -.bi-chat-square-heart-fill::before { content: "\f719"; } -.bi-chat-square-heart::before { content: "\f71a"; } -.bi-clipboard-check-fill::before { content: "\f71b"; } -.bi-clipboard-data-fill::before { content: "\f71c"; } -.bi-clipboard-fill::before { content: "\f71d"; } -.bi-clipboard-heart-fill::before { content: "\f71e"; } -.bi-clipboard-heart::before { content: "\f71f"; } -.bi-clipboard-minus-fill::before { content: "\f720"; } -.bi-clipboard-plus-fill::before { content: "\f721"; } -.bi-clipboard-pulse::before { content: "\f722"; } -.bi-clipboard-x-fill::before { content: "\f723"; } -.bi-clipboard2-check-fill::before { content: "\f724"; } -.bi-clipboard2-check::before { content: "\f725"; } -.bi-clipboard2-data-fill::before { content: "\f726"; } -.bi-clipboard2-data::before { content: "\f727"; } -.bi-clipboard2-fill::before { content: "\f728"; } -.bi-clipboard2-heart-fill::before { content: "\f729"; } -.bi-clipboard2-heart::before { content: "\f72a"; } -.bi-clipboard2-minus-fill::before { content: "\f72b"; } -.bi-clipboard2-minus::before { content: "\f72c"; } -.bi-clipboard2-plus-fill::before { content: "\f72d"; } -.bi-clipboard2-plus::before { content: "\f72e"; } -.bi-clipboard2-pulse-fill::before { content: "\f72f"; } -.bi-clipboard2-pulse::before { content: "\f730"; } -.bi-clipboard2-x-fill::before { content: "\f731"; } -.bi-clipboard2-x::before { content: "\f732"; } -.bi-clipboard2::before { content: "\f733"; } -.bi-emoji-kiss-fill::before { content: "\f734"; } -.bi-emoji-kiss::before { content: "\f735"; } -.bi-envelope-heart-fill::before { content: "\f736"; } -.bi-envelope-heart::before { content: "\f737"; } -.bi-envelope-open-heart-fill::before { content: "\f738"; } -.bi-envelope-open-heart::before { content: "\f739"; } -.bi-envelope-paper-fill::before { content: "\f73a"; } -.bi-envelope-paper-heart-fill::before { content: "\f73b"; } -.bi-envelope-paper-heart::before { content: "\f73c"; } -.bi-envelope-paper::before { content: "\f73d"; } -.bi-filetype-aac::before { content: "\f73e"; } -.bi-filetype-ai::before { content: "\f73f"; } -.bi-filetype-bmp::before { content: "\f740"; } -.bi-filetype-cs::before { content: "\f741"; } -.bi-filetype-css::before { content: "\f742"; } -.bi-filetype-csv::before { content: "\f743"; } -.bi-filetype-doc::before { content: "\f744"; } -.bi-filetype-docx::before { content: "\f745"; } -.bi-filetype-exe::before { content: "\f746"; } -.bi-filetype-gif::before { content: "\f747"; } -.bi-filetype-heic::before { content: "\f748"; } -.bi-filetype-html::before { content: "\f749"; } -.bi-filetype-java::before { content: "\f74a"; } -.bi-filetype-jpg::before { content: "\f74b"; } -.bi-filetype-js::before { content: "\f74c"; } -.bi-filetype-jsx::before { content: "\f74d"; } -.bi-filetype-key::before { content: "\f74e"; } -.bi-filetype-m4p::before { content: "\f74f"; } -.bi-filetype-md::before { content: "\f750"; } -.bi-filetype-mdx::before { content: "\f751"; } -.bi-filetype-mov::before { content: "\f752"; } -.bi-filetype-mp3::before { content: "\f753"; } -.bi-filetype-mp4::before { content: "\f754"; } -.bi-filetype-otf::before { content: "\f755"; } -.bi-filetype-pdf::before { content: "\f756"; } -.bi-filetype-php::before { content: "\f757"; } -.bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt-1::before { content: "\f759"; } -.bi-filetype-ppt::before { content: "\f75a"; } -.bi-filetype-psd::before { content: "\f75b"; } -.bi-filetype-py::before { content: "\f75c"; } -.bi-filetype-raw::before { content: "\f75d"; } -.bi-filetype-rb::before { content: "\f75e"; } -.bi-filetype-sass::before { content: "\f75f"; } -.bi-filetype-scss::before { content: "\f760"; } -.bi-filetype-sh::before { content: "\f761"; } -.bi-filetype-svg::before { content: "\f762"; } -.bi-filetype-tiff::before { content: "\f763"; } -.bi-filetype-tsx::before { content: "\f764"; } -.bi-filetype-ttf::before { content: "\f765"; } -.bi-filetype-txt::before { content: "\f766"; } -.bi-filetype-wav::before { content: "\f767"; } -.bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls-1::before { content: "\f769"; } -.bi-filetype-xls::before { content: "\f76a"; } -.bi-filetype-xml::before { content: "\f76b"; } -.bi-filetype-yml::before { content: "\f76c"; } -.bi-heart-arrow::before { content: "\f76d"; } -.bi-heart-pulse-fill::before { content: "\f76e"; } -.bi-heart-pulse::before { content: "\f76f"; } -.bi-heartbreak-fill::before { content: "\f770"; } -.bi-heartbreak::before { content: "\f771"; } -.bi-hearts::before { content: "\f772"; } -.bi-hospital-fill::before { content: "\f773"; } -.bi-hospital::before { content: "\f774"; } -.bi-house-heart-fill::before { content: "\f775"; } -.bi-house-heart::before { content: "\f776"; } -.bi-incognito::before { content: "\f777"; } -.bi-magnet-fill::before { content: "\f778"; } -.bi-magnet::before { content: "\f779"; } -.bi-person-heart::before { content: "\f77a"; } -.bi-person-hearts::before { content: "\f77b"; } -.bi-phone-flip::before { content: "\f77c"; } -.bi-plugin::before { content: "\f77d"; } -.bi-postage-fill::before { content: "\f77e"; } -.bi-postage-heart-fill::before { content: "\f77f"; } -.bi-postage-heart::before { content: "\f780"; } -.bi-postage::before { content: "\f781"; } -.bi-postcard-fill::before { content: "\f782"; } -.bi-postcard-heart-fill::before { content: "\f783"; } -.bi-postcard-heart::before { content: "\f784"; } -.bi-postcard::before { content: "\f785"; } -.bi-search-heart-fill::before { content: "\f786"; } -.bi-search-heart::before { content: "\f787"; } -.bi-sliders2-vertical::before { content: "\f788"; } -.bi-sliders2::before { content: "\f789"; } -.bi-trash3-fill::before { content: "\f78a"; } -.bi-trash3::before { content: "\f78b"; } -.bi-valentine::before { content: "\f78c"; } -.bi-valentine2::before { content: "\f78d"; } -.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } -.bi-wrench-adjustable-circle::before { content: "\f78f"; } -.bi-wrench-adjustable::before { content: "\f790"; } -.bi-filetype-json::before { content: "\f791"; } -.bi-filetype-pptx::before { content: "\f792"; } -.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/pagetop-minimal/static/icons/bootstrap-icons.woff b/pagetop-minimal/static/icons/bootstrap-icons.woff deleted file mode 100644 index 4cd66b71ad5f51be58843c52c66f78a8f7b89e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137216 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 NrT!1{z<Eso003f9u}}a2 diff --git a/pagetop-minimal/static/icons/bootstrap-icons.woff2 b/pagetop-minimal/static/icons/bootstrap-icons.woff2 deleted file mode 100644 index de01cad9d15e664cde293ac71d80f5cb2e0c1860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102380 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 G0001yd~9+6 diff --git a/pagetop-minimal/static/pagetop-logo.svg b/pagetop-minimal/static/pagetop-logo.svg deleted file mode 100644 index 3666bf3a..00000000 --- a/pagetop-minimal/static/pagetop-logo.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg width="16.14mm" height="16.14mm" viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" aria-label="PageTop Logo" role="img"> -<path fill="rgb(255,184,75)" d="M 633,61 L 633,61 C 579,61 527,75 480,102 433,129 395,167 368,214 341,261 327,313 327,367 L 327,1244 327,1245 C 327,1299 341,1351 368,1398 395,1445 433,1483 480,1510 527,1537 579,1551 633,1551 L 982,1550 982,1551 C 1036,1551 1088,1537 1135,1510 1182,1483 1220,1445 1247,1398 1274,1351 1288,1299 1288,1245 L 1288,367 1288,367 1288,367 C 1288,313 1274,261 1247,214 1220,167 1182,129 1135,102 1088,75 1036,61 982,61 L 633,61 Z" /> -<path fill="rgb(158,96,0)" d="M 1389,573 L 1328,573 1328,460 1449,460 1449,573 1389,573 Z M 1491,627 L 1430,627 1430,404 1551,404 1551,627 1491,627 Z M 222,573 L 161,573 161,460 282,460 282,573 222,573 Z M 120,627 L 59,627 59,404 180,404 180,627 120,627 Z" /> -<path fill="rgb(150,0,184)" d="M 678,1040 L 678,1040 C 645,1040 612,1049 583,1065 554,1082 530,1106 513,1135 497,1164 488,1197 488,1230 L 488,1230 488,1230 C 488,1263 497,1296 513,1325 530,1354 554,1378 583,1395 612,1411 645,1420 678,1420 L 940,1420 940,1420 C 973,1420 1006,1411 1035,1395 1064,1378 1088,1354 1105,1325 1121,1296 1130,1263 1130,1230 L 1130,1230 1130,1230 1130,1230 C 1130,1197 1121,1164 1105,1135 1088,1106 1064,1082 1035,1065 1006,1049 973,1040 940,1040 L 678,1040 Z M 488,1040 L 488,1040 488,1040 488,1040 488,1040 488,1040 488,1238 488,1238 488,1238 488,1238 488,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1040 1130,1040 1130,1040 1130,1040 1130,1040 488,1040 Z" /> -<path fill="rgb(255,255,255)" d="M 518,1128 L 488,1128 488,1066 547,1066 547,1128 518,1128 Z M 966,1128 L 908,1128 908,1066 1024,1066 1024,1128 966,1128 Z" /> -<path fill="rgb(221,255,149)" d="M 898,71 C 940,48 987,36 1035,36 1086,36 1137,50 1181,77 1226,104 1263,142 1289,189 1314,236 1328,288 1328,342 1328,396 1314,448 1289,495 1281,509 1272,522 1262,535 L 898,71 Z M 1337,429 C 1307,460 1272,480 1233,488 1192,496 1148,490 1107,470 1066,451 1029,418 999,375 969,332 948,281 938,227 927,173 928,117 940,66 943,51 948,36 953,22 L 1337,429 Z" /> -<path fill="rgb(146,128,99)" d="M 703,99 C 717,121 722,149 719,178 715,208 702,238 682,267 661,295 634,320 602,340 571,360 536,373 501,379 467,385 434,383 405,373 377,363 355,346 341,323 327,301 322,273 325,244 329,214 342,184 362,155 383,127 410,102 442,82 473,62 508,49 543,43 577,37 610,39 639,49 667,59 689,76 703,99 L 703,99 Z" /> -<path fill="rgb(146,128,99)" d="M 672,550 C 683,568 685,590 678,615 671,640 655,668 632,694 609,720 580,745 547,765 514,785 479,801 446,810 412,819 381,821 355,816 329,811 310,799 299,782 288,765 286,742 293,717 301,692 316,665 339,638 362,612 391,588 424,567 457,547 492,531 526,523 559,514 591,511 616,516 642,521 661,533 672,550 L 672,550 Z" /> -<path fill="rgb(146,128,99)" d="M 455,160 L 456,160 C 430,160 404,167 381,180 359,193 340,212 327,234 314,257 307,283 307,309 L 307,580 307,580 C 307,606 314,632 327,655 340,677 359,696 381,709 404,722 430,729 456,729 L 529,729 529,729 C 555,729 581,722 604,709 626,696 645,677 658,655 671,632 678,606 678,580 L 677,308 678,309 678,309 C 678,283 671,257 658,234 645,212 626,193 604,180 581,167 555,160 529,160 L 455,160 Z" /> -<path fill="rgb(240,0,0)" d="M 698,1332 L 699,1332 C 696,1332 694,1333 691,1334 689,1335 687,1337 686,1339 685,1342 684,1344 684,1347 L 684,1405 684,1405 C 684,1408 685,1410 686,1413 687,1415 689,1417 691,1418 694,1419 696,1420 699,1420 L 914,1419 914,1420 C 917,1420 919,1419 922,1418 924,1417 926,1415 927,1413 928,1410 929,1408 929,1405 L 929,1346 929,1347 929,1347 C 929,1344 928,1342 927,1339 926,1337 924,1335 922,1334 919,1333 917,1332 914,1332 L 698,1332 Z M 643,780 C 643,797 638,814 630,830 621,845 608,858 593,867 577,875 560,880 543,880 525,880 508,875 492,867 477,858 464,845 455,830 447,814 442,797 442,780 442,762 447,745 455,729 464,714 477,701 492,692 508,684 525,679 542,679 560,679 577,684 593,692 608,701 621,714 630,729 638,745 643,762 643,779 L 643,780 Z M 1171,780 C 1171,797 1166,814 1158,830 1149,845 1136,858 1121,867 1105,875 1088,880 1071,880 1053,880 1036,875 1020,867 1005,858 992,845 983,830 975,814 970,797 970,780 970,762 975,745 983,729 992,714 1005,701 1020,692 1036,684 1053,679 1071,679 1088,679 1105,684 1121,692 1136,701 1149,714 1158,729 1166,745 1171,762 1171,779 L 1171,780 Z" /> -<path fill="rgb(10,11,9)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" /> -<path fill="rgb(10,11,9)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" /> -<path fill="rgb(10,11,9)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" /> -</svg> diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 4458a5ec..64852e75 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -16,5 +16,4 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop", features = ["database"], default-features = false } -pagetop-minimal = { version = "0.0", path = "../pagetop-minimal" } serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 939b0b25..fae89481 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,5 +1,4 @@ use pagetop::prelude::*; -use pagetop_minimal::component::*; new_handle!(MODULE_USER); @@ -22,10 +21,6 @@ impl ModuleTrait for User { L10n::t("module_description", &LOCALES_USER) } - fn dependencies(&self) -> Vec<ModuleRef> { - vec![&pagetop_minimal::Minimal] - } - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { scfg.route("/user/login", service::web::get().to(login)); } From 7a5c86ac9a18f84c03830bbc2bc3e4bfb2ffc4c2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Sep 2023 22:49:42 +0200 Subject: [PATCH 536/853] =?UTF-8?q?=E2=9C=A8=20Integrate=20minimal=20compo?= =?UTF-8?q?nents=20and=20recover=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 42 +- pagetop-bulmix/src/lib.rs | 14 +- pagetop-homedemo/src/lib.rs | 20 +- pagetop-jquery/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/base.rs | 5 + pagetop/src/base/action.rs | 3 + pagetop/src/base/action/component.rs | 133 ++ .../page/action.rs => base/action/page.rs} | 2 +- .../action/page}/after_prepare_body.rs | 19 +- .../action/page}/before_prepare_body.rs | 19 +- pagetop/src/base/component.rs | 62 + pagetop/src/base/component/anchor.rs | 211 ++ pagetop/src/base/component/block.rs | 130 ++ pagetop/src/base/component/flex.rs | 322 ++++ pagetop/src/base/component/flex/container.rs | 181 ++ pagetop/src/base/component/flex/item.rs | 196 ++ pagetop/src/base/component/form_element.rs | 11 + .../src/base/component/form_element/button.rs | 176 ++ .../src/base/component/form_element/date.rs | 226 +++ .../src/base/component/form_element/form.rs | 165 ++ .../src/base/component/form_element/hidden.rs | 68 + .../src/base/component/form_element/input.rs | 348 ++++ pagetop/src/base/component/heading.rs | 199 ++ pagetop/src/{core => base}/component/html.rs | 4 +- pagetop/src/base/component/icon.rs | 79 + pagetop/src/base/component/image.rs | 140 ++ pagetop/src/{core => base}/component/l10n.rs | 5 +- pagetop/src/base/component/paragraph.rs | 144 ++ pagetop/src/base/component/powered_by.rs | 135 ++ pagetop/src/base/component/site_branding.rs | 135 ++ pagetop/src/base/component/wrapper.rs | 195 ++ pagetop/src/base/theme.rs | 2 + pagetop/src/base/theme/inception.rs | 55 + pagetop/src/core/component.rs | 139 -- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/core/theme.rs | 3 - pagetop/src/core/theme/all.rs | 2 +- pagetop/src/core/theme/default.rs | 42 - pagetop/src/core/theme/definition.rs | 3 +- pagetop/src/lib.rs | 3 + pagetop/src/locale/en-US/base.ftl | 6 + pagetop/src/locale/es-ES/base.ftl | 6 + pagetop/src/prelude.rs | 6 +- pagetop/src/response/fatal_error.rs | 2 +- pagetop/src/response/page.rs | 7 +- pagetop/static/theme/css/flex.css | 361 ++++ pagetop/static/theme/css/root.css | 122 ++ pagetop/static/theme/css/styles.css | 46 + .../static/theme/icons/bootstrap-icons.css | 1705 +++++++++++++++++ .../static/theme/icons/bootstrap-icons.woff | Bin 0 -> 137216 bytes .../static/theme/icons/bootstrap-icons.woff2 | Bin 0 -> 102380 bytes pagetop/static/theme/pagetop-logo.svg | 14 + 56 files changed, 5673 insertions(+), 252 deletions(-) create mode 100644 pagetop/src/base.rs create mode 100644 pagetop/src/base/action.rs create mode 100644 pagetop/src/base/action/component.rs rename pagetop/src/{response/page/action.rs => base/action/page.rs} (82%) rename pagetop/src/{response/page/action => base/action/page}/after_prepare_body.rs (66%) rename pagetop/src/{response/page/action => base/action/page}/before_prepare_body.rs (66%) create mode 100644 pagetop/src/base/component.rs create mode 100644 pagetop/src/base/component/anchor.rs create mode 100644 pagetop/src/base/component/block.rs create mode 100644 pagetop/src/base/component/flex.rs create mode 100644 pagetop/src/base/component/flex/container.rs create mode 100644 pagetop/src/base/component/flex/item.rs create mode 100644 pagetop/src/base/component/form_element.rs create mode 100644 pagetop/src/base/component/form_element/button.rs create mode 100644 pagetop/src/base/component/form_element/date.rs create mode 100644 pagetop/src/base/component/form_element/form.rs create mode 100644 pagetop/src/base/component/form_element/hidden.rs create mode 100644 pagetop/src/base/component/form_element/input.rs create mode 100644 pagetop/src/base/component/heading.rs rename pagetop/src/{core => base}/component/html.rs (81%) create mode 100644 pagetop/src/base/component/icon.rs create mode 100644 pagetop/src/base/component/image.rs rename pagetop/src/{core => base}/component/l10n.rs (94%) create mode 100644 pagetop/src/base/component/paragraph.rs create mode 100644 pagetop/src/base/component/powered_by.rs create mode 100644 pagetop/src/base/component/site_branding.rs create mode 100644 pagetop/src/base/component/wrapper.rs create mode 100644 pagetop/src/base/theme.rs create mode 100644 pagetop/src/base/theme/inception.rs delete mode 100644 pagetop/src/core/theme/default.rs create mode 100644 pagetop/src/locale/en-US/base.ftl create mode 100644 pagetop/src/locale/es-ES/base.ftl create mode 100644 pagetop/static/theme/css/flex.css create mode 100644 pagetop/static/theme/css/root.css create mode 100644 pagetop/static/theme/css/styles.css create mode 100644 pagetop/static/theme/icons/bootstrap-icons.css create mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff create mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff2 create mode 100644 pagetop/static/theme/pagetop-logo.svg diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 15ed9dbc..a7eb7bec 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -29,7 +29,7 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - actions![ActionBeforePrepareBody::with(before_prepare_body)] + actions![action::page::BeforePrepareBody::with(before_prepare_body)] } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 0db93999..239a0846 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -43,21 +43,6 @@ impl ThemeTrait for Bootsier { ] } - fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/bootsier/css/bootstrap.min.css") - .with_version("5.1.3") - .with_weight(-99), - )) - .alter_context(ContextOp::AddJavaScript( - JavaScript::at("/bootsier/js/bootstrap.bundle.min.js") - .with_version("5.1.3") - .with_weight(-99), - )); - JQuery.enable_jquery(page.context()); - } - fn prepare_body(&self, page: &mut Page) -> Markup { match page.template() { "admin" => html! { @@ -118,6 +103,33 @@ impl ThemeTrait for Bootsier { } } + fn after_prepare_body(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/bootsier/css/bootstrap.min.css") + .with_version("5.1.3") + .with_weight(-99), + )) + .alter_context(ContextOp::AddJavaScript( + JavaScript::at("/bootsier/js/bootstrap.bundle.min.js") + .with_version("5.1.3") + .with_weight(-99), + )); + + if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_FLEX) { + page.alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/css/flex.css").with_version("0.0.0"), + )); + } + if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_ICONS) { + page.alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), + )); + } + + JQuery.enable_jquery(page.context()); + } + fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { match component.handle() { ERROR_404 => Some(html! { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index c6eb5e37..c8e1dc74 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -29,13 +29,25 @@ impl ModuleTrait for Bulmix { } impl ThemeTrait for Bulmix { - fn before_prepare_body(&self, page: &mut Page) { + fn after_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bulmix/css/bulma.min.css") .with_version("0.9.4") .with_weight(-99), )); + + if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_FLEX) { + page.alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/css/flex.css").with_version("0.0.0"), + )); + } + if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_ICONS) { + page.alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), + )); + } + JQuery.enable_jquery(page.context()); } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 48830dce..901776a3 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -42,8 +42,8 @@ async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { .render() } -fn hello_world() -> Container { - Container::header().with_id("hello-world").with_component( +fn hello_world() -> Wrapper { + Wrapper::header().with_id("hello-world").with_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::MD)) .with_item( @@ -97,8 +97,8 @@ fn hello_world() -> Container { ) } -fn welcome() -> Container { - Container::section() +fn welcome() -> Wrapper { + Wrapper::section() .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") .with_component(Heading::h2(L10n::t("welcome_page", &LOCALES_HOMEDEMO))) @@ -119,8 +119,8 @@ fn welcome() -> Container { .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALES_HOMEDEMO))) } -fn about_pagetop() -> Container { - Container::new().with_id("pagetop").with_component( +fn about_pagetop() -> Wrapper { + Wrapper::new().with_id("pagetop").with_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::SM)) .with_item( @@ -146,8 +146,8 @@ fn about_pagetop() -> Container { ) } -fn promo_pagetop() -> Container { - Container::new().with_id("promo").with_component( +fn promo_pagetop() -> Wrapper { + Wrapper::new().with_id("promo").with_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::MD)) .with_item( @@ -180,8 +180,8 @@ fn promo_pagetop() -> Container { ) } -fn reporting_issues() -> Container { - Container::new().with_id("reporting").with_component( +fn reporting_issues() -> Wrapper { + Wrapper::new().with_id("reporting").with_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::MD)) .with_item( diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs index ee531e7b..7e63c5f9 100644 --- a/pagetop-jquery/src/lib.rs +++ b/pagetop-jquery/src/lib.rs @@ -29,7 +29,7 @@ impl ModuleTrait for JQuery { } fn actions(&self) -> Vec<Action> { - actions![ActionAfterPrepareBody::with(after_prepare_body)] + actions![action::page::AfterPrepareBody::with(after_prepare_body)] } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 96d1c813..3294797b 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -27,7 +27,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - actions![ActionBeforePrepareBody::with(before_prepare_body).with_weight(-1)] + actions![action::page::BeforePrepareBody::with(before_prepare_body).with_weight(-1)] } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index fae89481..054b24c5 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -40,7 +40,7 @@ async fn login(request: service::HttpRequest) -> ResultPage<Markup, FatalError> .with_title(L10n::n("Identificación del usuario")) .with_in( "content", - Container::new() + Wrapper::new() .with_id("welcome") .with_component(form_login()), ) diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs new file mode 100644 index 00000000..acfd1dbe --- /dev/null +++ b/pagetop/src/base.rs @@ -0,0 +1,5 @@ +pub mod action; + +pub mod component; + +pub mod theme; diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs new file mode 100644 index 00000000..62a06db9 --- /dev/null +++ b/pagetop/src/base/action.rs @@ -0,0 +1,3 @@ +pub mod component; + +pub mod page; diff --git a/pagetop/src/base/action/component.rs b/pagetop/src/base/action/component.rs new file mode 100644 index 00000000..5cf72aa6 --- /dev/null +++ b/pagetop/src/base/action/component.rs @@ -0,0 +1,133 @@ +#[macro_export] +macro_rules! actions_for_component { + ( $Component:ty ) => { + $crate::paste! { + #[allow(unused_imports)] + use $crate::prelude::*; + + pub type [<FnAction $Component>] = fn(component: &$Component, cx: &mut Context); + + // ************************************************************************************* + // ACTION BEFORE PREPARE COMPONENT + // ************************************************************************************* + + $crate::new_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Crate); + + pub struct [<BeforePrepare $Component>] { + action: Option<[<FnAction $Component>]>, + weight: Weight, + } + + impl ActionTrait for [<BeforePrepare $Component>] { + fn new() -> Self { + [<BeforePrepare $Component>] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + [<ACTION_BEFORE_PREPARE_ $Component:upper>] + } + + fn weight(&self) -> Weight { + self.weight + } + } + + impl [<BeforePrepare $Component>] { + #[allow(dead_code)] + pub fn with(action: [<FnAction $Component>]) -> Self { + [<BeforePrepare $Component>] { + action: Some(action), + weight: 0, + } + } + + #[allow(dead_code)] + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } + } + + #[inline(always)] + pub(crate) fn [<run_actions_before_prepare_ $Component:lower>]( + component: &mut $Component, + cx: &mut Context + ) { + run_actions([<ACTION_BEFORE_PREPARE_ $Component:upper>], |action| + action_ref::<[<BeforePrepare $Component>]>(&**action) + .run(component, cx) + ); + } + + // ************************************************************************************* + // ACTION AFTER PREPARE COMPONENT + // ************************************************************************************* + + $crate::new_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Crate); + + pub struct [<AfterPrepare $Component>] { + action: Option<[<FnAction $Component>]>, + weight: Weight, + } + + impl ActionTrait for [<AfterPrepare $Component>] { + fn new() -> Self { + [<AfterPrepare $Component>] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + [<ACTION_AFTER_PREPARE_ $Component:upper>] + } + + fn weight(&self) -> Weight { + self.weight + } + } + + impl [<AfterPrepare $Component>] { + #[allow(dead_code)] + pub fn with(action: [<FnAction $Component>]) -> Self { + [<AfterPrepare $Component>] { + action: Some(action), + weight: 0, + } + } + + #[allow(dead_code)] + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } + } + + #[inline(always)] + pub(crate) fn [<run_actions_after_prepare_ $Component:lower>]( + component: &mut $Component, + cx: &mut Context + ) { + run_actions([<ACTION_AFTER_PREPARE_ $Component:upper>], |action| + action_ref::<[<AfterPrepare $Component>]>(&**action) + .run(component, cx) + ); + } + } + }; +} diff --git a/pagetop/src/response/page/action.rs b/pagetop/src/base/action/page.rs similarity index 82% rename from pagetop/src/response/page/action.rs rename to pagetop/src/base/action/page.rs index d3a81011..8e6390cb 100644 --- a/pagetop/src/response/page/action.rs +++ b/pagetop/src/base/action/page.rs @@ -1,4 +1,4 @@ -use crate::response::page::Page; +use crate::prelude::*; pub type FnActionPage = fn(page: &mut Page); diff --git a/pagetop/src/response/page/action/after_prepare_body.rs b/pagetop/src/base/action/page/after_prepare_body.rs similarity index 66% rename from pagetop/src/response/page/action/after_prepare_body.rs rename to pagetop/src/base/action/page/after_prepare_body.rs index 7b1ef2dd..0e2ced8d 100644 --- a/pagetop/src/response/page/action/after_prepare_body.rs +++ b/pagetop/src/base/action/page/after_prepare_body.rs @@ -1,18 +1,17 @@ -use crate::core::action::{action_ref, run_actions, ActionTrait}; -use crate::response::page::action::FnActionPage; -use crate::response::page::Page; -use crate::{new_handle, Handle, Weight}; +use crate::prelude::*; + +use super::FnActionPage; new_handle!(ACTION_AFTER_PREPARE_BODY for Crate); -pub struct ActionAfterPrepareBody { +pub struct AfterPrepareBody { action: Option<FnActionPage>, weight: Weight, } -impl ActionTrait for ActionAfterPrepareBody { +impl ActionTrait for AfterPrepareBody { fn new() -> Self { - ActionAfterPrepareBody { + AfterPrepareBody { action: None, weight: 0, } @@ -27,9 +26,9 @@ impl ActionTrait for ActionAfterPrepareBody { } } -impl ActionAfterPrepareBody { +impl AfterPrepareBody { pub fn with(action: FnActionPage) -> Self { - ActionAfterPrepareBody { + AfterPrepareBody { action: Some(action), weight: 0, } @@ -50,6 +49,6 @@ impl ActionAfterPrepareBody { #[inline(always)] pub(crate) fn run_actions_after_prepare_body(page: &mut Page) { run_actions(ACTION_AFTER_PREPARE_BODY, |action| { - action_ref::<ActionAfterPrepareBody>(&**action).run(page) + action_ref::<AfterPrepareBody>(&**action).run(page) }); } diff --git a/pagetop/src/response/page/action/before_prepare_body.rs b/pagetop/src/base/action/page/before_prepare_body.rs similarity index 66% rename from pagetop/src/response/page/action/before_prepare_body.rs rename to pagetop/src/base/action/page/before_prepare_body.rs index 3aa7cefe..3198e6f3 100644 --- a/pagetop/src/response/page/action/before_prepare_body.rs +++ b/pagetop/src/base/action/page/before_prepare_body.rs @@ -1,18 +1,17 @@ -use crate::core::action::{action_ref, run_actions, ActionTrait}; -use crate::response::page::action::FnActionPage; -use crate::response::page::Page; -use crate::{new_handle, Handle, Weight}; +use crate::prelude::*; + +use super::FnActionPage; new_handle!(ACTION_BEFORE_PREPARE_BODY for Crate); -pub struct ActionBeforePrepareBody { +pub struct BeforePrepareBody { action: Option<FnActionPage>, weight: Weight, } -impl ActionTrait for ActionBeforePrepareBody { +impl ActionTrait for BeforePrepareBody { fn new() -> Self { - ActionBeforePrepareBody { + BeforePrepareBody { action: None, weight: 0, } @@ -27,9 +26,9 @@ impl ActionTrait for ActionBeforePrepareBody { } } -impl ActionBeforePrepareBody { +impl BeforePrepareBody { pub fn with(action: FnActionPage) -> Self { - ActionBeforePrepareBody { + BeforePrepareBody { action: Some(action), weight: 0, } @@ -50,6 +49,6 @@ impl ActionBeforePrepareBody { #[inline(always)] pub(crate) fn run_actions_before_prepare_body(page: &mut Page) { run_actions(ACTION_BEFORE_PREPARE_BODY, |action| { - action_ref::<ActionBeforePrepareBody>(&**action).run(page) + action_ref::<BeforePrepareBody>(&**action).run(page) }); } diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs new file mode 100644 index 00000000..09d94026 --- /dev/null +++ b/pagetop/src/base/component.rs @@ -0,0 +1,62 @@ +// Context parameters. +pub const PARAM_INCLUDE_FLEX: &str = "theme.include.flex"; +pub const PARAM_INCLUDE_ICONS: &str = "theme.include.icons"; + +#[rustfmt::skip] +#[derive(Default)] +pub enum BreakPoint { + #[default] + None, /* Does not apply */ + SM, /* @media screen and (max-width: 35.5em) - Applies <= 568px */ + MD, /* @media screen and (max-width: 48em) - Applies <= 768px */ + LG, /* @media screen and (max-width: 64em) - Applies <= 1024px */ + XL, /* @media screen and (max-width: 80em) - Applies <= 1280px */ + X2L, /* @media screen and (max-width: 120em) - Applies <= 1920px */ + X3L, /* @media screen and (max-width: 160em) - Applies <= 2560px */ +} + +#[rustfmt::skip] +impl ToString for BreakPoint { + fn to_string(&self) -> String { + match self { + BreakPoint::None => "bp-no".to_string(), + BreakPoint::SM => "bp-sm".to_string(), + BreakPoint::MD => "bp-md".to_string(), + BreakPoint::LG => "bp-lg".to_string(), + BreakPoint::XL => "bp-xl".to_string(), + BreakPoint::X2L => "bp-x2l".to_string(), + BreakPoint::X3L => "bp-x3l".to_string(), + } + } +} + +mod html; +pub use html::{Html, COMPONENT_HTML}; + +mod l10n; +pub use l10n::{L10n, COMPONENT_L10N}; + +mod wrapper; +pub use wrapper::{Wrapper, WrapperType, COMPONENT_WRAPPER}; + +pub mod flex; + +mod icon; +pub use icon::{Icon, COMPONENT_ICON}; +mod heading; +pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; +mod paragraph; +pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; +mod anchor; +pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; +mod image; +pub use image::{Image, ImageSize, COMPONENT_IMAGE}; +mod block; +pub use block::{Block, COMPONENT_BLOCK}; +mod site_branding; +pub use site_branding::{SiteBranding, COMPONENT_BRANDING}; +mod powered_by; +pub use powered_by::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; + +pub mod form_element; +pub use form_element::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs new file mode 100644 index 00000000..4f021ce2 --- /dev/null +++ b/pagetop/src/base/component/anchor.rs @@ -0,0 +1,211 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_ANCHOR); + +#[derive(Default)] +pub enum AnchorType { + #[default] + Link, + Button, + Location, +} + +#[derive(Default)] +pub enum AnchorTarget { + #[default] + Default, + Blank, + Parent, + Top, + Context(String), +} + +type AnchorIcon = TypedComponent<Icon>; +type AnchorHtml = TypedComponent<L10n>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Anchor { + weight : Weight, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + anchor_type: AnchorType, + href : AttributeValue, + html : AnchorHtml, + left_icon : AnchorIcon, + right_icon : AnchorIcon, + target : AnchorTarget, + template : String, +} + +impl ComponentTrait for Anchor { + fn new() -> Self { + Anchor::default() + } + + fn handle(&self) -> Handle { + COMPONENT_ANCHOR + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + #[rustfmt::skip] + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let target = match &self.target() { + AnchorTarget::Blank => Some("_blank"), + AnchorTarget::Parent => Some("_parent"), + AnchorTarget::Top => Some("_top"), + AnchorTarget::Context(name) => Some(name.as_str()), + _ => None, + }; + PrepareMarkup::With(html! { + a + id=[self.id()] + class=[self.classes().get()] + href=[self.href().get()] + target=[target] + { + (self.left_icon().prepare(cx)) + " " span { (self.html().prepare(cx)) } " " + (self.right_icon().prepare(cx)) + } + }) + } +} + +impl Anchor { + pub fn link(href: &str, html: L10n) -> Self { + Anchor::new().with_href(href).with_html(html) + } + + pub fn button(href: &str, html: L10n) -> Self { + Anchor::new() + .with_type(AnchorType::Button) + .with_href(href) + .with_html(html) + } + + pub fn location(id: &str) -> Self { + Anchor::new().with_type(AnchorType::Location).with_id(id) + } + + // Anchor BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { + self.alter_classes( + ClassesOp::SetDefault, + match anchor_type { + AnchorType::Button => "btn btn-primary", + _ => "", + }, + ); + self.anchor_type = anchor_type; + self + } + + #[fn_builder] + pub fn alter_href(&mut self, href: &str) -> &mut Self { + self.href.alter_value(href); + self + } + + #[fn_builder] + pub fn alter_html(&mut self, html: L10n) -> &mut Self { + self.html.set(html); + self + } + + #[fn_builder] + pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { + self.left_icon.set(icon); + self + } + + #[fn_builder] + pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { + self.right_icon.set(icon); + self + } + + #[fn_builder] + pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { + self.target = target; + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Anchor GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn anchor_type(&self) -> &AnchorType { + &self.anchor_type + } + + pub fn href(&self) -> &AttributeValue { + &self.href + } + + pub fn html(&self) -> &AnchorHtml { + &self.html + } + + pub fn left_icon(&self) -> &AnchorIcon { + &self.left_icon + } + + pub fn right_icon(&self) -> &AnchorIcon { + &self.right_icon + } + + pub fn target(&self) -> &AnchorTarget { + &self.target + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs new file mode 100644 index 00000000..f83ff261 --- /dev/null +++ b/pagetop/src/base/component/block.rs @@ -0,0 +1,130 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_BLOCK); + +actions_for_component!(Block); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Block { + weight : Weight, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + title : AttributeValue, + stuff : ArcComponents, + template : String, +} + +impl ComponentTrait for Block { + fn new() -> Self { + Block::default().with_classes(ClassesOp::SetDefault, "block") + } + + fn handle(&self) -> Handle { + COMPONENT_BLOCK + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_block(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let id = cx.required_id::<Block>(self.id()); + PrepareMarkup::With(html! { + div id=(id) class=[self.classes().get()] { + @if let Some(title) = self.title().get() { + h2 class="block-title" { (title) } + } + div class="block-body" { + (self.components().prepare(cx)) + } + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_block(self, cx); + } +} + +impl Block { + // Block BUILDER. + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_title(&mut self, title: &str) -> &mut Self { + self.title.alter_value(title); + self + } + + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self + } + + #[fn_builder] + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { + self.stuff.alter(op); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Block GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn title(&self) -> &AttributeValue { + &self.title + } + + pub fn components(&self) -> &ArcComponents { + &self.stuff + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/flex.rs b/pagetop/src/base/component/flex.rs new file mode 100644 index 00000000..7e30db94 --- /dev/null +++ b/pagetop/src/base/component/flex.rs @@ -0,0 +1,322 @@ +mod container; +pub use container::{Container, COMPONENT_FLEX_CONTAINER}; +mod item; +pub use item::{Item, COMPONENT_FLEX_ITEM}; + +use crate::prelude::*; + +// ************************************************************************************************* + +#[derive(Default)] +pub enum Direction { + #[default] + Default, + Row(BreakPoint), + RowReverse(BreakPoint), + Column(BreakPoint), + ColumnReverse(BreakPoint), +} + +#[rustfmt::skip] +impl ToString for Direction { + fn to_string(&self) -> String { + match self { + Direction::Default => { + concat_string!("flex-container flex-row ", BreakPoint::default().to_string()) + } + Direction::Row(breakpoint) => { + concat_string!("flex-container flex-row ", breakpoint.to_string()) + } + Direction::RowReverse(breakpoint) => { + concat_string!("flex-container flex-row flex-reverse ", breakpoint.to_string()) + } + Direction::Column(breakpoint) => { + concat_string!("flex-container flex-col ", breakpoint.to_string()) + } + Direction::ColumnReverse(breakpoint) => { + concat_string!("flex-container flex-col flex-reverse ", breakpoint.to_string()) + } + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum WrapAlign { + #[default] + Default, + NoWrap, + Wrap(ContentAlign), + WrapReverse(ContentAlign), +} + +#[rustfmt::skip] +impl ToString for WrapAlign { + fn to_string(&self) -> String { + match self { + WrapAlign::Default => "".to_string(), + WrapAlign::NoWrap => "flex-nowrap".to_string(), + WrapAlign::Wrap(a) => concat_string!("flex-wrap ", a.to_string()), + WrapAlign::WrapReverse(a) => concat_string!("flex-wrap-reverse ", a.to_string()), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ContentAlign { + #[default] + Default, + Start, + End, + Center, + Stretch, + SpaceBetween, + SpaceAround, +} + +#[rustfmt::skip] +impl ToString for ContentAlign { + fn to_string(&self) -> String { + match self { + ContentAlign::Default => "".to_string(), + ContentAlign::Start => "flex-align-start".to_string(), + ContentAlign::End => "flex-align-end".to_string(), + ContentAlign::Center => "flex-align-center".to_string(), + ContentAlign::Stretch => "flex-align-stretch".to_string(), + ContentAlign::SpaceBetween => "flex-align-space-between".to_string(), + ContentAlign::SpaceAround => "flex-align-space-around".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ContentJustify { + #[default] + Default, + Start, + End, + Center, + SpaceBetween, + SpaceAround, + SpaceEvenly, +} + +#[rustfmt::skip] +impl ToString for ContentJustify { + fn to_string(&self) -> String { + match self { + ContentJustify::Default => "".to_string(), + ContentJustify::Start => "flex-justify-start".to_string(), + ContentJustify::End => "flex-justify-end".to_string(), + ContentJustify::Center => "flex-justify-center".to_string(), + ContentJustify::SpaceBetween => "flex-justify-space-between".to_string(), + ContentJustify::SpaceAround => "flex-justify-space-around".to_string(), + ContentJustify::SpaceEvenly => "flex-justify-space-evenly".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemAlign { + #[default] + Default, + Top, + Bottom, + Middle, + Stretch, + Baseline, +} + +#[rustfmt::skip] +impl ToString for ItemAlign { + fn to_string(&self) -> String { + match self { + ItemAlign::Default => "".to_string(), + ItemAlign::Top => "flex-item-top".to_string(), + ItemAlign::Bottom => "flex-item-bottom".to_string(), + ItemAlign::Middle => "flex-item-middle".to_string(), + ItemAlign::Stretch => "flex-item-stretch".to_string(), + ItemAlign::Baseline => "flex-item-baseline".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum Gap { + #[default] + Default, + Row(unit::Value), + Column(unit::Value), + Distinct(unit::Value, unit::Value), + Both(unit::Value), +} + +#[rustfmt::skip] +impl ToString for Gap { + fn to_string(&self) -> String { + match self { + Gap::Default => "".to_string(), + Gap::Row(r) => concat_string!("row-gap: ", r.to_string(), ";"), + Gap::Column(c) => concat_string!("column-gap: ", c.to_string(), ";"), + Gap::Distinct(r, c) => concat_string!("gap: ", r.to_string(), " ", c.to_string(), ";"), + Gap::Both(v) => concat_string!("gap: ", v.to_string(), ";"), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemGrow { + #[default] + Default, + Is1, + Is2, + Is3, + Is4, + Is5, + Is6, + Is7, + Is8, + Is9, +} + +#[rustfmt::skip] +impl ToString for ItemGrow { + fn to_string(&self) -> String { + match self { + ItemGrow::Default => "".to_string(), + ItemGrow::Is1 => "flex-grow-1".to_string(), + ItemGrow::Is2 => "flex-grow-2".to_string(), + ItemGrow::Is3 => "flex-grow-3".to_string(), + ItemGrow::Is4 => "flex-grow-4".to_string(), + ItemGrow::Is5 => "flex-grow-5".to_string(), + ItemGrow::Is6 => "flex-grow-6".to_string(), + ItemGrow::Is7 => "flex-grow-7".to_string(), + ItemGrow::Is8 => "flex-grow-8".to_string(), + ItemGrow::Is9 => "flex-grow-9".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemShrink { + #[default] + Default, + Is1, + Is2, + Is3, + Is4, + Is5, + Is6, + Is7, + Is8, + Is9, +} + +#[rustfmt::skip] +impl ToString for ItemShrink { + fn to_string(&self) -> String { + match self { + ItemShrink::Default => "".to_string(), + ItemShrink::Is1 => "flex-shrink-1".to_string(), + ItemShrink::Is2 => "flex-shrink-2".to_string(), + ItemShrink::Is3 => "flex-shrink-3".to_string(), + ItemShrink::Is4 => "flex-shrink-4".to_string(), + ItemShrink::Is5 => "flex-shrink-5".to_string(), + ItemShrink::Is6 => "flex-shrink-6".to_string(), + ItemShrink::Is7 => "flex-shrink-7".to_string(), + ItemShrink::Is8 => "flex-shrink-8".to_string(), + ItemShrink::Is9 => "flex-shrink-9".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemSize { + #[default] + Default, + Percent10, + Percent20, + Percent25, + Percent33, + Percent40, + Percent50, + Percent60, + Percent66, + Percent75, + Percent80, + Percent90, +} + +#[rustfmt::skip] +impl ToString for ItemSize { + fn to_string(&self) -> String { + match self { + ItemSize::Default => "".to_string(), + ItemSize::Percent10 => "flex-width-10".to_string(), + ItemSize::Percent20 => "flex-width-20".to_string(), + ItemSize::Percent25 => "flex-width-25".to_string(), + ItemSize::Percent33 => "flex-width-33".to_string(), + ItemSize::Percent40 => "flex-width-40".to_string(), + ItemSize::Percent50 => "flex-width-50".to_string(), + ItemSize::Percent60 => "flex-width-60".to_string(), + ItemSize::Percent66 => "flex-width-66".to_string(), + ItemSize::Percent75 => "flex-width-75".to_string(), + ItemSize::Percent80 => "flex-width-80".to_string(), + ItemSize::Percent90 => "flex-width-90".to_string(), + } + } +} + +// ************************************************************************************************* + +#[derive(Default)] +pub enum ItemOffset { + #[default] + Default, + Offset10, + Offset20, + Offset25, + Offset33, + Offset40, + Offset50, + Offset60, + Offset66, + Offset75, + Offset80, + Offset90, +} + +#[rustfmt::skip] +impl ToString for ItemOffset { + fn to_string(&self) -> String { + match self { + ItemOffset::Default => "".to_string(), + ItemOffset::Offset10 => "flex-offset-10".to_string(), + ItemOffset::Offset20 => "flex-offset-20".to_string(), + ItemOffset::Offset25 => "flex-offset-25".to_string(), + ItemOffset::Offset33 => "flex-offset-33".to_string(), + ItemOffset::Offset40 => "flex-offset-40".to_string(), + ItemOffset::Offset50 => "flex-offset-50".to_string(), + ItemOffset::Offset60 => "flex-offset-60".to_string(), + ItemOffset::Offset66 => "flex-offset-66".to_string(), + ItemOffset::Offset75 => "flex-offset-75".to_string(), + ItemOffset::Offset80 => "flex-offset-80".to_string(), + ItemOffset::Offset90 => "flex-offset-90".to_string(), + } + } +} diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs new file mode 100644 index 00000000..29708326 --- /dev/null +++ b/pagetop/src/base/component/flex/container.rs @@ -0,0 +1,181 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_FLEX_CONTAINER); + +actions_for_component!(Container); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Container { + weight : Weight, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + items : TypedComponents<flex::Item>, + direction : flex::Direction, + wrap_align : flex::WrapAlign, + content_justify: flex::ContentJustify, + items_align : flex::ItemAlign, + gap : flex::Gap, +} + +impl ComponentTrait for Container { + fn new() -> Self { + Container::default() + .with_classes(ClassesOp::SetDefault, flex::Direction::Default.to_string()) + } + + fn handle(&self) -> Handle { + COMPONENT_FLEX_CONTAINER + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_container(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + cx.set_param::<bool>(PARAM_INCLUDE_FLEX, true); + + let gap = match self.gap() { + flex::Gap::Default => None, + _ => Some(self.gap().to_string()), + }; + + PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] style=[gap] { + (self.items().prepare(cx)) + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_container(self, cx); + } +} + +impl Container { + // Container BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + pub fn with_item(mut self, item: flex::Item) -> Self { + self.items.alter(TypedOp::Add(TypedComponent::with(item))); + self + } + + #[fn_builder] + pub fn alter_items(&mut self, op: TypedOp<flex::Item>) -> &mut Self { + self.items.alter(op); + self + } + + #[fn_builder] + pub fn alter_direction(&mut self, direction: flex::Direction) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.direction.to_string()), + direction.to_string(), + ); + self.direction = direction; + self + } + + #[fn_builder] + pub fn alter_wrap_align(&mut self, wrap: flex::WrapAlign) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.wrap_align.to_string()), + wrap.to_string(), + ); + self.wrap_align = wrap; + self + } + + #[fn_builder] + pub fn alter_content_justify(&mut self, justify: flex::ContentJustify) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.content_justify.to_string()), + justify.to_string(), + ); + self.content_justify = justify; + self + } + + #[fn_builder] + pub fn alter_items_align(&mut self, align: flex::ItemAlign) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.items_align.to_string()), + align.to_string(), + ); + self.items_align = align; + self + } + + #[fn_builder] + pub fn alter_gap(&mut self, gap: flex::Gap) -> &mut Self { + self.gap = gap; + self + } + + // Container GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn items(&self) -> &TypedComponents<flex::Item> { + &self.items + } + + pub fn direction(&self) -> &flex::Direction { + &self.direction + } + + pub fn wrap_align(&self) -> &flex::WrapAlign { + &self.wrap_align + } + + pub fn content_justify(&self) -> &flex::ContentJustify { + &self.content_justify + } + + pub fn items_align(&self) -> &flex::ItemAlign { + &self.items_align + } + + pub fn gap(&self) -> &flex::Gap { + &self.gap + } +} diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs new file mode 100644 index 00000000..ea99be0d --- /dev/null +++ b/pagetop/src/base/component/flex/item.rs @@ -0,0 +1,196 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_FLEX_ITEM); + +actions_for_component!(Item); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Item { + weight : Weight, + renderable : Renderable, + id : IdentifierValue, + item_classes : Classes, + inner_classes: Classes, + item_grow : flex::ItemGrow, + item_shrink : flex::ItemShrink, + item_size : flex::ItemSize, + item_offset : flex::ItemOffset, + item_align : flex::ItemAlign, + stuff : ArcComponents, +} + +impl ComponentTrait for Item { + fn new() -> Self { + Item::default() + .with_item_classes(ClassesOp::SetDefault, "flex-item") + .with_inner_classes(ClassesOp::SetDefault, "flex-item-inner") + } + + fn handle(&self) -> Handle { + COMPONENT_FLEX_ITEM + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_item(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let order = match self.weight() { + 0 => None, + _ => Some(concat_string!("order: ", self.weight().to_string(), ";")), + }; + PrepareMarkup::With(html! { + div id=[self.id()] class=[self.item_classes().get()] style=[order] { + div class=[self.inner_classes().get()] { + (self.components().prepare(cx)) + } + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_item(self, cx); + } +} + +impl Item { + // Item BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_item_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.item_classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.inner_classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_grow(&mut self, grow: flex::ItemGrow) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_grow.to_string()), + grow.to_string(), + ); + self.item_grow = grow; + self + } + + #[fn_builder] + pub fn alter_shrink(&mut self, shrink: flex::ItemShrink) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_shrink.to_string()), + shrink.to_string(), + ); + self.item_shrink = shrink; + self + } + + #[fn_builder] + pub fn alter_size(&mut self, size: flex::ItemSize) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_size.to_string()), + size.to_string(), + ); + self.item_size = size; + self + } + + #[fn_builder] + pub fn alter_offset(&mut self, offset: flex::ItemOffset) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_offset.to_string()), + offset.to_string(), + ); + self.item_offset = offset; + self + } + + #[fn_builder] + pub fn alter_align(&mut self, align: flex::ItemAlign) -> &mut Self { + self.item_classes.alter_value( + ClassesOp::Replace(self.item_align.to_string()), + align.to_string(), + ); + self.item_align = align; + self + } + + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self + } + + #[fn_builder] + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { + self.stuff.alter(op); + self + } + + // Item GETTERS. + + pub fn item_classes(&self) -> &Classes { + &self.item_classes + } + + pub fn inner_classes(&self) -> &Classes { + &self.inner_classes + } + + pub fn grow(&self) -> &flex::ItemGrow { + &self.item_grow + } + + pub fn shrink(&self) -> &flex::ItemShrink { + &self.item_shrink + } + + pub fn size(&self) -> &flex::ItemSize { + &self.item_size + } + + pub fn offset(&self) -> &flex::ItemOffset { + &self.item_offset + } + + pub fn align(&self) -> &flex::ItemAlign { + &self.item_align + } + + pub fn components(&self) -> &ArcComponents { + &self.stuff + } +} diff --git a/pagetop/src/base/component/form_element.rs b/pagetop/src/base/component/form_element.rs new file mode 100644 index 00000000..bbd4e309 --- /dev/null +++ b/pagetop/src/base/component/form_element.rs @@ -0,0 +1,11 @@ +mod form; +pub use form::{Form, FormMethod, COMPONENT_FORM}; + +mod input; +pub use input::{Input, InputType, COMPONENT_INPUT}; +mod hidden; +pub use hidden::{Hidden, COMPONENT_HIDDEN}; +mod date; +pub use date::{Date, COMPONENT_DATE}; +mod button; +pub use button::{Button, ButtonType, COMPONENT_BUTTON}; diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs new file mode 100644 index 00000000..ee869382 --- /dev/null +++ b/pagetop/src/base/component/form_element/button.rs @@ -0,0 +1,176 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_BUTTON); + +#[derive(Default)] +pub enum ButtonType { + #[default] + Button, + Submit, + Reset, +} + +type ButtonValue = TypedComponent<L10n>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Button { + weight : Weight, + renderable : Renderable, + classes : Classes, + button_type: ButtonType, + name : AttributeValue, + value : ButtonValue, + autofocus : AttributeValue, + disabled : AttributeValue, + template : String, +} + +impl ComponentTrait for Button { + fn new() -> Self { + Button::default().with_classes(ClassesOp::SetDefault, "btn btn-primary form-button") + } + + fn handle(&self) -> Handle { + COMPONENT_BUTTON + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let button_type = match self.button_type() { + ButtonType::Button => "button", + ButtonType::Submit => "submit", + ButtonType::Reset => "reset", + }; + let id = self.name().get().map(|name| concat_string!("edit-", name)); + let value = self.value().prepare(cx); + PrepareMarkup::With(html! { + button + type=(button_type) + id=[id] + class=[self.classes().get()] + name=[self.name().get()] + value=(value) + autofocus=[self.autofocus().get()] + disabled=[self.disabled().get()] + { + (value) + } + }) + } +} + +impl Button { + pub fn with(value: L10n) -> Self { + Button::new().with_value(value) + } + + pub fn submit(value: L10n) -> Self { + let mut button = Button::new() + .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-submit") + .with_value(value); + button.button_type = ButtonType::Submit; + button + } + + pub fn reset(value: L10n) -> Self { + let mut button = Button::new() + .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-reset") + .with_value(value); + button.button_type = ButtonType::Reset; + button + } + + // Button BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.alter_value(name); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: L10n) -> &mut Self { + self.value.set(value); + self + } + + #[fn_builder] + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { + self.autofocus.alter_value(match toggle { + true => "autofocus", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { + self.disabled.alter_value(match toggle { + true => "disabled", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Button GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn button_type(&self) -> &ButtonType { + &self.button_type + } + + pub fn name(&self) -> &AttributeValue { + &self.name + } + + pub fn value(&self) -> &ButtonValue { + &self.value + } + + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus + } + + pub fn disabled(&self) -> &AttributeValue { + &self.disabled + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs new file mode 100644 index 00000000..17e70845 --- /dev/null +++ b/pagetop/src/base/component/form_element/date.rs @@ -0,0 +1,226 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_DATE); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Date { + weight : Weight, + renderable : Renderable, + classes : Classes, + name : AttributeValue, + value : AttributeValue, + label : AttributeValue, + placeholder : AttributeValue, + autofocus : AttributeValue, + autocomplete: AttributeValue, + disabled : AttributeValue, + readonly : AttributeValue, + required : AttributeValue, + help_text : AttributeValue, + template : String, +} + +impl ComponentTrait for Date { + fn new() -> Self { + Date::default().with_classes(ClassesOp::SetDefault, "form-item form-type-date") + } + + fn handle(&self) -> Handle { + COMPONENT_DATE + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + let id = self.name().get().map(|name| concat_string!("edit-", name)); + PrepareMarkup::With(html! { + div class=[self.classes().get()] { + @if let Some(label) = self.label().get() { + label class="form-label" for=[&id] { + (label) " " + @if self.required().get().is_some() { + span + class="form-required" + title="Este campo es obligatorio." { "*" } " " + } + } + } + input + type="date" + id=[id] + class="form-control" + name=[self.name().get()] + value=[self.value().get()] + placeholder=[self.placeholder().get()] + autofocus=[self.autofocus().get()] + autocomplete=[self.autocomplete().get()] + readonly=[self.readonly().get()] + required=[self.required().get()] + disabled=[self.disabled().get()] {} + @if let Some(help_text) = self.help_text().get() { + div class="form-text" { (help_text) } + } + } + }) + } +} + +impl Date { + // Date BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.alter_value(name); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.alter_value(value); + self + } + + #[fn_builder] + pub fn alter_label(&mut self, label: &str) -> &mut Self { + self.label.alter_value(label); + self + } + + #[fn_builder] + pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { + self.placeholder.alter_value(placeholder); + self + } + + #[fn_builder] + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { + self.autofocus.alter_value(match toggle { + true => "autofocus", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { + self.autocomplete.alter_value(match toggle { + true => "", + false => "off", + }); + self + } + + #[fn_builder] + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { + self.disabled.alter_value(match toggle { + true => "disabled", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { + self.readonly.alter_value(match toggle { + true => "readonly", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_required(&mut self, toggle: bool) -> &mut Self { + self.required.alter_value(match toggle { + true => "required", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { + self.help_text.alter_value(help_text); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Date GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn name(&self) -> &AttributeValue { + &self.name + } + + pub fn value(&self) -> &AttributeValue { + &self.value + } + + pub fn label(&self) -> &AttributeValue { + &self.label + } + + pub fn placeholder(&self) -> &AttributeValue { + &self.placeholder + } + + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus + } + + pub fn autocomplete(&self) -> &AttributeValue { + &self.autocomplete + } + + pub fn disabled(&self) -> &AttributeValue { + &self.disabled + } + + pub fn readonly(&self) -> &AttributeValue { + &self.readonly + } + + pub fn required(&self) -> &AttributeValue { + &self.required + } + + pub fn help_text(&self) -> &AttributeValue { + &self.help_text + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs new file mode 100644 index 00000000..f4da8da7 --- /dev/null +++ b/pagetop/src/base/component/form_element/form.rs @@ -0,0 +1,165 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_FORM); + +actions_for_component!(Form); + +#[derive(Default)] +pub enum FormMethod { + #[default] + Post, + Get, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Form { + weight : Weight, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + action : AttributeValue, + charset : AttributeValue, + method : FormMethod, + stuff : ArcComponents, + template : String, +} + +impl ComponentTrait for Form { + fn new() -> Self { + Form::default() + .with_classes(ClassesOp::SetDefault, "form") + .with_charset("UTF-8") + } + + fn handle(&self) -> Handle { + COMPONENT_FORM + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_form(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let method = match self.method() { + FormMethod::Post => Some("post".to_owned()), + FormMethod::Get => None, + }; + PrepareMarkup::With(html! { + form + id=[self.id()] + class=[self.classes().get()] + action=[self.action().get()] + method=[method] + accept-charset=[self.charset().get()] + { + div { (self.elements().prepare(cx)) } + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_form(self, cx); + } +} + +impl Form { + // Form BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_action(&mut self, action: &str) -> &mut Self { + self.action.alter_value(action); + self + } + + #[fn_builder] + pub fn alter_charset(&mut self, charset: &str) -> &mut Self { + self.charset.alter_value(charset); + self + } + + #[fn_builder] + pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { + self.method = method; + self + } + + pub fn with_element(mut self, element: impl ComponentTrait) -> Self { + self.stuff.alter(ArcOp::Add(ArcComponent::with(element))); + self + } + + #[fn_builder] + pub fn alter_elements(&mut self, op: ArcOp) -> &mut Self { + self.stuff.alter(op); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Form GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn action(&self) -> &AttributeValue { + &self.action + } + + pub fn charset(&self) -> &AttributeValue { + &self.charset + } + + pub fn method(&self) -> &FormMethod { + &self.method + } + + pub fn elements(&self) -> &ArcComponents { + &self.stuff + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs new file mode 100644 index 00000000..79264c01 --- /dev/null +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -0,0 +1,68 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_HIDDEN); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Hidden { + weight: Weight, + name : NameValue, + value : AttributeValue, +} + +impl ComponentTrait for Hidden { + fn new() -> Self { + Hidden::default() + } + + fn handle(&self) -> Handle { + COMPONENT_HIDDEN + } + + fn weight(&self) -> Weight { + self.weight + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + let id = self.name().get().map(|name| concat_string!("value-", name)); + PrepareMarkup::With(html! { + input type="hidden" id=[id] name=[self.name().get()] value=[self.value().get()] {} + }) + } +} + +impl Hidden { + pub fn set(name: &str, value: &str) -> Self { + Hidden::new().with_name(name).with_value(value) + } + + // Hidden BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + self.name.alter_value(name); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.alter_value(value); + self + } + + // Hidden GETTERS. + + pub fn name(&self) -> &NameValue { + &self.name + } + + pub fn value(&self) -> &AttributeValue { + &self.value + } +} diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs new file mode 100644 index 00000000..7a06dda5 --- /dev/null +++ b/pagetop/src/base/component/form_element/input.rs @@ -0,0 +1,348 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_INPUT); + +#[derive(Default)] +pub enum InputType { + #[default] + Textfield, + Password, + Search, + Email, + Telephone, + Url, +} + +type InputLabel = TypedComponent<L10n>; +type InputHelpText = TypedComponent<L10n>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Input { + weight : Weight, + renderable : Renderable, + classes : Classes, + input_type : InputType, + name : NameValue, + value : AttributeValue, + label : InputLabel, + size : Option<u16>, + minlength : Option<u16>, + maxlength : Option<u16>, + placeholder : AttributeValue, + autofocus : AttributeValue, + autocomplete: AttributeValue, + disabled : AttributeValue, + readonly : AttributeValue, + required : AttributeValue, + help_text : InputHelpText, + template : String, +} + +impl ComponentTrait for Input { + fn new() -> Self { + Input::default() + .with_classes(ClassesOp::SetDefault, "form-item form-type-textfield") + .with_size(Some(60)) + .with_maxlength(Some(128)) + } + + fn handle(&self) -> Handle { + COMPONENT_INPUT + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + #[rustfmt::skip] + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let type_input = match self.input_type() { + InputType::Textfield => "text", + InputType::Password => "password", + InputType::Search => "search", + InputType::Email => "email", + InputType::Telephone => "tel", + InputType::Url => "url", + }; + let id = self.name().get().map(|name| concat_string!("edit-", name)); + let label = self.label().prepare(cx); + let description = self.help_text().prepare(cx); + PrepareMarkup::With(html! { + div class=[self.classes().get()] { + @if !label.is_empty() { + label class="form-label" for=[&id] { + (label) " " + @if self.required().get().is_some() { + span + class="form-required" + title="Este campo es obligatorio." { "*" } " " + } + } + } + input + type=(type_input) + id=[id] + class="form-control" + name=[self.name().get()] + value=[self.value().get()] + size=[self.size()] + minlength=[self.minlength()] + maxlength=[self.maxlength()] + placeholder=[self.placeholder().get()] + autofocus=[self.autofocus().get()] + autocomplete=[self.autocomplete().get()] + readonly=[self.readonly().get()] + required=[self.required().get()] + disabled=[self.disabled().get()] {} + @if !description.is_empty() { + div class="form-text" { (description) } + } + } + }) + } +} + +impl Input { + pub fn textfield() -> Self { + Input::new() + } + + pub fn password() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield".to_owned()), + "form-type-password", + ); + input.input_type = InputType::Password; + input + } + + pub fn search() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield".to_owned()), + "form-type-search", + ); + input.input_type = InputType::Search; + input + } + + pub fn email() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield".to_owned()), + "form-type-email", + ); + input.input_type = InputType::Email; + input + } + + pub fn telephone() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield".to_owned()), + "form-type-telephone", + ); + input.input_type = InputType::Telephone; + input + } + + pub fn url() -> Self { + let mut input = Input::new().with_classes( + ClassesOp::Replace("form-type-textfield".to_owned()), + "form-type-url", + ); + input.input_type = InputType::Url; + input + } + + // Input BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: &str) -> &mut Self { + if let Some(previous) = self.name.get() { + self.alter_classes(ClassesOp::Remove, concat_string!("form-item-", previous)); + } + self.alter_classes(ClassesOp::AddDefault, concat_string!("form-item-", name)); + self.name.alter_value(name); + self + } + + #[fn_builder] + pub fn alter_value(&mut self, value: &str) -> &mut Self { + self.value.alter_value(value); + self + } + + #[fn_builder] + pub fn alter_label(&mut self, label: L10n) -> &mut Self { + self.label.set(label); + self + } + + #[fn_builder] + pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { + self.size = size; + self + } + + #[fn_builder] + pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { + self.minlength = minlength; + self + } + + #[fn_builder] + pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { + self.maxlength = maxlength; + self + } + + #[fn_builder] + pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { + self.placeholder.alter_value(placeholder); + self + } + + #[fn_builder] + pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { + self.autofocus.alter_value(match toggle { + true => "autofocus", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { + self.autocomplete.alter_value(match toggle { + true => "", + false => "off", + }); + self + } + + #[fn_builder] + pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { + self.disabled.alter_value(match toggle { + true => "disabled", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { + self.readonly.alter_value(match toggle { + true => "readonly", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_required(&mut self, toggle: bool) -> &mut Self { + self.required.alter_value(match toggle { + true => "required", + false => "", + }); + self + } + + #[fn_builder] + pub fn alter_help_text(&mut self, help_text: L10n) -> &mut Self { + self.help_text.set(help_text); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Input GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn input_type(&self) -> &InputType { + &self.input_type + } + + pub fn name(&self) -> &NameValue { + &self.name + } + + pub fn value(&self) -> &AttributeValue { + &self.value + } + + pub fn label(&self) -> &InputLabel { + &self.label + } + + pub fn size(&self) -> Option<u16> { + self.size + } + + pub fn minlength(&self) -> Option<u16> { + self.minlength + } + + pub fn maxlength(&self) -> Option<u16> { + self.maxlength + } + + pub fn placeholder(&self) -> &AttributeValue { + &self.placeholder + } + + pub fn autofocus(&self) -> &AttributeValue { + &self.autofocus + } + + pub fn autocomplete(&self) -> &AttributeValue { + &self.autocomplete + } + + pub fn disabled(&self) -> &AttributeValue { + &self.disabled + } + + pub fn readonly(&self) -> &AttributeValue { + &self.readonly + } + + pub fn required(&self) -> &AttributeValue { + &self.required + } + + pub fn help_text(&self) -> &InputHelpText { + &self.help_text + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs new file mode 100644 index 00000000..3b87dd5e --- /dev/null +++ b/pagetop/src/base/component/heading.rs @@ -0,0 +1,199 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_HEADING); + +#[derive(Default)] +pub enum HeadingType { + #[default] + H1, + H2, + H3, + H4, + H5, + H6, +} + +#[derive(Default)] +pub enum HeadingDisplay { + #[default] + Normal, + XxLarge, + Large, + Medium, + Small, + XxSmall, + Subtitle, +} + +type HeadingText = TypedComponent<L10n>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Heading { + weight : Weight, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + heading_type: HeadingType, + text : HeadingText, + display : HeadingDisplay, + template : String, +} + +impl ComponentTrait for Heading { + fn new() -> Self { + Heading::default() + } + + fn handle(&self) -> Handle { + COMPONENT_HEADING + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let id = self.id(); + let classes = self.classes().get(); + PrepareMarkup::With(html! { @match &self.heading_type() { + HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(cx)) }, + }}) + } +} + +impl Heading { + pub fn h1(text: L10n) -> Self { + Heading::new() + .with_heading_type(HeadingType::H1) + .with_text(text) + } + + pub fn h2(text: L10n) -> Self { + Heading::new() + .with_heading_type(HeadingType::H2) + .with_text(text) + } + + pub fn h3(text: L10n) -> Self { + Heading::new() + .with_heading_type(HeadingType::H3) + .with_text(text) + } + + pub fn h4(text: L10n) -> Self { + Heading::new() + .with_heading_type(HeadingType::H4) + .with_text(text) + } + + pub fn h5(text: L10n) -> Self { + Heading::new() + .with_heading_type(HeadingType::H5) + .with_text(text) + } + + pub fn h6(text: L10n) -> Self { + Heading::new() + .with_heading_type(HeadingType::H6) + .with_text(text) + } + + // Heading BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { + self.heading_type = heading_type; + self + } + + #[fn_builder] + pub fn alter_text(&mut self, text: L10n) -> &mut Self { + self.text.set(text); + self + } + + #[rustfmt::skip] + #[fn_builder] + pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { + self.alter_classes( + ClassesOp::SetDefault, + match display { + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::Large => "display-3", + HeadingDisplay::Medium => "display-4", + HeadingDisplay::Small => "display-5", + HeadingDisplay::XxSmall => "display-6", + HeadingDisplay::Normal => "", + HeadingDisplay::Subtitle => "", + }, + ); + self.display = display; + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Paragraph GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn heading_type(&self) -> &HeadingType { + &self.heading_type + } + + pub fn text(&self) -> &HeadingText { + &self.text + } + + pub fn display(&self) -> &HeadingDisplay { + &self.display + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/core/component/html.rs b/pagetop/src/base/component/html.rs similarity index 81% rename from pagetop/src/core/component/html.rs rename to pagetop/src/base/component/html.rs index 1c926f5c..76b9acb1 100644 --- a/pagetop/src/core/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,6 +1,4 @@ -use crate::core::component::{ComponentTrait, Context}; -use crate::html::{html, Markup, PrepareMarkup}; -use crate::{fn_builder, new_handle, Handle}; +use crate::prelude::*; new_handle!(COMPONENT_HTML); diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs new file mode 100644 index 00000000..0b45ea08 --- /dev/null +++ b/pagetop/src/base/component/icon.rs @@ -0,0 +1,79 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_ICON); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Icon { + weight : Weight, + renderable: Renderable, + icon_name : String, + classes : Classes, +} + +impl ComponentTrait for Icon { + fn new() -> Self { + Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") + } + + fn handle(&self) -> Handle { + COMPONENT_ICON + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + cx.set_param::<bool>(PARAM_INCLUDE_ICONS, true); + + PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) + } +} + +impl Icon { + pub fn with(icon_name: &str) -> Self { + Icon::new().with_icon_name(icon_name) + } + + // Icon BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { + self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", name)); + self.icon_name = name.to_owned(); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + // Icon GETTERS. + + pub fn icon_name(&self) -> &str { + self.icon_name.as_str() + } + + pub fn classes(&self) -> &Classes { + &self.classes + } +} diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs new file mode 100644 index 00000000..ddff8144 --- /dev/null +++ b/pagetop/src/base/component/image.rs @@ -0,0 +1,140 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_IMAGE); + +const IMG_FLUID: &str = "img-fluid"; +const IMG_FIXED: &str = "img-fixed"; + +#[derive(Default)] +pub enum ImageSize { + #[default] + Auto, + Size(u16, u16), + Width(u16), + Height(u16), + Both(u16), +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Image { + weight : Weight, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + source : AttributeValue, + size : ImageSize, +} + +impl ComponentTrait for Image { + fn new() -> Self { + Image::default().with_classes(ClassesOp::SetDefault, IMG_FLUID) + } + + fn handle(&self) -> Handle { + COMPONENT_IMAGE + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + let (width, height) = match self.size() { + ImageSize::Auto => (None, None), + ImageSize::Size(width, height) => (Some(width), Some(height)), + ImageSize::Width(width) => (Some(width), None), + ImageSize::Height(height) => (None, Some(height)), + ImageSize::Both(value) => (Some(value), Some(value)), + }; + PrepareMarkup::With(html! { + img + src=[self.source().get()] + id=[self.id()] + class=[self.classes().get()] + width=[width] + height=[height] {} + }) + } +} + +impl Image { + pub fn with(source: &str) -> Self { + Image::default() + .with_source(source) + .with_classes(ClassesOp::SetDefault, IMG_FLUID) + } + + pub fn fixed(source: &str) -> Self { + Image::default() + .with_source(source) + .with_classes(ClassesOp::SetDefault, IMG_FIXED) + } + + pub fn pagetop() -> Self { + Image::default() + .with_source("/theme/pagetop-logo.svg") + .with_classes(ClassesOp::SetDefault, IMG_FIXED) + .with_size(ImageSize::Size(64, 64)) + } + + // Image BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_source(&mut self, source: &str) -> &mut Self { + self.source.alter_value(source); + self + } + + #[fn_builder] + pub fn alter_size(&mut self, size: ImageSize) -> &mut Self { + self.size = size; + self + } + + // Image GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn source(&self) -> &AttributeValue { + &self.source + } + + pub fn size(&self) -> &ImageSize { + &self.size + } +} diff --git a/pagetop/src/core/component/l10n.rs b/pagetop/src/base/component/l10n.rs similarity index 94% rename from pagetop/src/core/component/l10n.rs rename to pagetop/src/base/component/l10n.rs index dcde3362..70ac0035 100644 --- a/pagetop/src/core/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -1,7 +1,4 @@ -use crate::core::component::{ComponentTrait, Context}; -use crate::html::{html, PreEscaped, PrepareMarkup}; -use crate::locale::{Loader, Locales}; -use crate::{fn_builder, new_handle, Handle}; +use crate::prelude::*; use std::collections::HashMap; diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs new file mode 100644 index 00000000..b968140f --- /dev/null +++ b/pagetop/src/base/component/paragraph.rs @@ -0,0 +1,144 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_PARAGRAPH); + +#[derive(Default)] +pub enum ParagraphDisplay { + #[default] + Normal, + XxLarge, + Large, + Medium, + Small, + XxSmall, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Paragraph { + weight : Weight, + renderable: Renderable, + id : IdentifierValue, + classes : Classes, + stuff : ArcComponents, + display : ParagraphDisplay, + template : String, +} + +impl ComponentTrait for Paragraph { + fn new() -> Self { + Paragraph::default() + } + + fn handle(&self) -> Handle { + COMPONENT_PARAGRAPH + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + p + id=[self.id()] + class=[self.classes().get()] + { + (self.components().prepare(cx)) + } + }) + } +} + +impl Paragraph { + pub fn with(component: impl ComponentTrait) -> Self { + Paragraph::new().with_component(component) + } + + // Paragraph BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self + } + + #[fn_builder] + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { + self.stuff.alter(op); + self + } + + #[rustfmt::skip] + #[fn_builder] + pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { + self.alter_classes( + ClassesOp::SetDefault, + match display { + ParagraphDisplay::XxLarge => "fs-2", + ParagraphDisplay::Large => "fs-3", + ParagraphDisplay::Medium => "fs-4", + ParagraphDisplay::Small => "fs-5", + ParagraphDisplay::XxSmall => "fs-6", + ParagraphDisplay::Normal => "", + }, + ); + self.display = display; + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Paragraph GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn components(&self) -> &ArcComponents { + &self.stuff + } + + pub fn display(&self) -> &ParagraphDisplay { + &self.display + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs new file mode 100644 index 00000000..68594cd9 --- /dev/null +++ b/pagetop/src/base/component/powered_by.rs @@ -0,0 +1,135 @@ +use crate::prelude::*; +use crate::LOCALES_PAGETOP; + +new_handle!(COMPONENT_POWEREDBY); + +#[derive(Default, Eq, PartialEq)] +pub enum PoweredByLogo { + #[default] + None, + Color, + LineDark, + LineLight, + LineRGB(u8, u8, u8), +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct PoweredBy { + weight : Weight, + renderable: Renderable, + copyright : Option<String>, + logo : PoweredByLogo, +} + +impl ComponentTrait for PoweredBy { + fn new() -> Self { + let year = Utc::now().format("%Y").to_string(); + let c = concat_string!(year, " © ", config::SETTINGS.app.name); + PoweredBy { + copyright: Some(c), + ..Default::default() + } + } + + fn handle(&self) -> Handle { + COMPONENT_POWEREDBY + } + + fn id(&self) -> Option<String> { + Some("powered-by".to_owned()) + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let logo = match self.logo() { + PoweredByLogo::Color => { + let logo_txt = L10n::t("pagetop_logo", &LOCALES_PAGETOP); + html! { + span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { + img src="/theme/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} + } + } + } + PoweredByLogo::LineDark => self.logo_line(10, 11, 9, cx), + PoweredByLogo::LineLight => self.logo_line(255, 255, 255, cx), + PoweredByLogo::LineRGB(r, g, b) => self.logo_line(*r, *g, *b, cx), + _ => html! {}, + }; + + let mut credits = L10n::e("poweredby_pagetop", &LOCALES_PAGETOP).with_arg( + "pagetop_link", + "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", + ); + + PrepareMarkup::With(html! { + div id=[self.id()] { + @if let Some(c) = self.copyright() { + span class="copyright" { (c) "." } " " + } + span class="powered" { (credits.prepare(cx)) " " (logo) } + } + }) + } +} + +impl PoweredBy { + // PoweredBy BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_copyright(&mut self, copyright: Option<impl Into<String>>) -> &mut Self { + self.copyright = copyright.map(|c| c.into()); + self + } + + #[fn_builder] + pub fn alter_logo(&mut self, logo: PoweredByLogo) -> &mut Self { + self.logo = logo; + self + } + + // PoweredBy GETTERS. + + pub fn copyright(&self) -> &Option<String> { + &self.copyright + } + + pub fn logo(&self) -> &PoweredByLogo { + &self.logo + } + + // PoweredBy PRIVATE. + + fn logo_line(&self, r: u8, g: u8, b: u8, cx: &mut Context) -> Markup { + let logo_txt = L10n::t("pagetop_logo", &LOCALES_PAGETOP); + let logo_rgb = format!("rgb({},{},{})", r, g, b); + html! { + span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { + svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { + path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill=(logo_rgb) d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill=(logo_rgb) d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} + } + } + } + } +} diff --git a/pagetop/src/base/component/site_branding.rs b/pagetop/src/base/component/site_branding.rs new file mode 100644 index 00000000..a1e9d6ba --- /dev/null +++ b/pagetop/src/base/component/site_branding.rs @@ -0,0 +1,135 @@ +use crate::prelude::*; +use crate::LOCALES_PAGETOP; + +new_handle!(COMPONENT_BRANDING); + +type SiteSlogan = TypedComponent<L10n>; +type SiteLogo = TypedComponent<Image>; + +#[rustfmt::skip] +pub struct SiteBranding { + weight : Weight, + renderable: Renderable, + name : String, + slogan : SiteSlogan, + logo : SiteLogo, + frontpage : FnContextualPath, +} + +#[rustfmt::skip] +impl Default for SiteBranding { + fn default() -> Self { + SiteBranding { + weight : Weight::default(), + renderable: Renderable::default(), + name : config::SETTINGS.app.name.to_owned(), + slogan : SiteSlogan::default(), + logo : SiteLogo::default(), + frontpage : |_| "/", + } + } +} + +impl ComponentTrait for SiteBranding { + fn new() -> Self { + SiteBranding::default() + } + + fn handle(&self) -> Handle { + COMPONENT_BRANDING + } + + fn id(&self) -> Option<String> { + Some("site-branding".to_owned()) + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let title = L10n::t("site_home", &LOCALES_PAGETOP).prepare(cx); + let slogan = self.slogan().prepare(cx); + PrepareMarkup::With(html! { + div id=[self.id()] { + div class="site-branding-wrapper" { + div class="site-branding-logo" { + (self.logo().prepare(cx)) + } + div class="site-branding-text" { + div class="site-branding-name" { + a href=(self.frontpage()(cx)) title=(title) rel="home" { (self.name()) } + } + @if !slogan.is_empty() { + div class="site-branding-slogan" { + (slogan) + } + } + } + } + } + }) + } +} + +impl SiteBranding { + // SiteBranding BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_name(&mut self, name: impl Into<String>) -> &mut Self { + self.name = name.into(); + self + } + + #[fn_builder] + pub fn alter_slogan(&mut self, slogan: L10n) -> &mut Self { + self.slogan = SiteSlogan::with(slogan); + self + } + + #[fn_builder] + pub fn alter_logo(&mut self, logo: Image) -> &mut Self { + self.logo.set(logo); + self + } + + #[fn_builder] + pub fn alter_frontpage(&mut self, frontpage: FnContextualPath) -> &mut Self { + self.frontpage = frontpage; + self + } + + // SiteBranding GETTERS. + + pub fn name(&self) -> &String { + &self.name + } + + pub fn slogan(&self) -> &SiteSlogan { + &self.slogan + } + + pub fn logo(&self) -> &SiteLogo { + &self.logo + } + + pub fn frontpage(&self) -> &FnContextualPath { + &self.frontpage + } +} diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs new file mode 100644 index 00000000..339302fc --- /dev/null +++ b/pagetop/src/base/component/wrapper.rs @@ -0,0 +1,195 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_WRAPPER); + +actions_for_component!(Wrapper); + +#[derive(Default)] +pub enum WrapperType { + #[default] + Container, + Header, + Footer, + Main, + Section, +} + +#[rustfmt::skip] +#[derive(Default)] +pub struct Wrapper { + weight : Weight, + renderable : Renderable, + id : IdentifierValue, + classes : Classes, + inner_classes: Classes, + wrapper_type : WrapperType, + stuff : ArcComponents, + template : String, +} + +impl ComponentTrait for Wrapper { + fn new() -> Self { + Wrapper::default() + .with_classes(ClassesOp::SetDefault, "container") + .with_inner_classes(ClassesOp::SetDefault, "container") + } + + fn handle(&self) -> Handle { + COMPONENT_WRAPPER + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_wrapper(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + match self.wrapper_type() { + WrapperType::Header => PrepareMarkup::With(html! { + header id=[self.id()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().prepare(cx)) + } + } + }), + WrapperType::Footer => PrepareMarkup::With(html! { + footer id=[self.id()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().prepare(cx)) + } + } + }), + WrapperType::Main => PrepareMarkup::With(html! { + main id=[self.id()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().prepare(cx)) + } + } + }), + WrapperType::Section => PrepareMarkup::With(html! { + section id=[self.id()] class=[self.classes().get()] { + div class=[self.inner_classes().get()] { + (self.components().prepare(cx)) + } + } + }), + _ => PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] { + (self.components().prepare(cx)) + } + }), + } + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_wrapper(self, cx); + } +} + +impl Wrapper { + pub fn header() -> Self { + let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "header"); + c.wrapper_type = WrapperType::Header; + c + } + + pub fn footer() -> Self { + let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "footer"); + c.wrapper_type = WrapperType::Footer; + c + } + + pub fn main() -> Self { + let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "main"); + c.wrapper_type = WrapperType::Main; + c + } + + pub fn section() -> Self { + let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "section"); + c.wrapper_type = WrapperType::Section; + c + } + + // Wrapper BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: &str) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.inner_classes.alter_value(op, classes); + self + } + + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self + } + + #[fn_builder] + pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { + self.stuff.alter(op); + self + } + + #[fn_builder] + pub fn alter_template(&mut self, template: &str) -> &mut Self { + self.template = template.to_owned(); + self + } + + // Wrapper GETTERS. + + pub fn classes(&self) -> &Classes { + &self.classes + } + + pub fn inner_classes(&self) -> &Classes { + &self.inner_classes + } + + pub fn wrapper_type(&self) -> &WrapperType { + &self.wrapper_type + } + + pub fn components(&self) -> &ArcComponents { + &self.stuff + } + + pub fn template(&self) -> &str { + self.template.as_str() + } +} diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs new file mode 100644 index 00000000..7c75ca33 --- /dev/null +++ b/pagetop/src/base/theme.rs @@ -0,0 +1,2 @@ +mod inception; +pub use inception::{InceptionTheme, THEME_INCEPTION}; diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs new file mode 100644 index 00000000..b7e7a29b --- /dev/null +++ b/pagetop/src/base/theme/inception.rs @@ -0,0 +1,55 @@ +use crate::prelude::*; + +new_handle!(THEME_INCEPTION); + +static_files!(theme); + +const VERSION_INCEPTION: &str = "0.0.0"; + +pub struct InceptionTheme; + +impl ModuleTrait for InceptionTheme { + fn handle(&self) -> Handle { + THEME_INCEPTION + } + + fn name(&self) -> L10n { + L10n::n("Default") + } + + fn theme(&self) -> Option<ThemeRef> { + Some(&InceptionTheme) + } + + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + static_files_service!(scfg, "/theme", theme); + } +} + +impl ThemeTrait for InceptionTheme { + fn after_prepare_body(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/css/normalize.min.css") + .with_version("8.0.1") + .with_weight(-99), + )) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/css/root.css").with_version(VERSION_INCEPTION), + )); + + if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_FLEX) { + page.alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/css/flex.css").with_version(VERSION_INCEPTION), + )); + } + if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_ICONS) { + page.alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), + )); + } + page.alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/theme/css/styles.css").with_version(VERSION_INCEPTION), + )); + } +} diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 038de2e5..dcb171bd 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -13,142 +13,3 @@ pub use arc::{ArcComponent, ArcComponents, ArcOp}; mod typed; pub use typed::{TypedComponent, TypedComponents, TypedOp}; - -mod html; -pub use html::{Html, COMPONENT_HTML}; - -mod l10n; -pub use l10n::{L10n, COMPONENT_L10N}; - -#[macro_export] -macro_rules! actions_for_component { - ( $Component:ty ) => { - $crate::paste! { - use $crate::prelude::*; - - pub type [<FnAction $Component>] = fn(component: &$Component, cx: &mut Context); - - // ************************************************************************************* - // ACTION BEFORE PREPARE COMPONENT - // ************************************************************************************* - - $crate::new_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Crate); - - pub struct [<BeforePrepare $Component>] { - action: Option<[<FnAction $Component>]>, - weight: Weight, - } - - impl ActionTrait for [<BeforePrepare $Component>] { - fn new() -> Self { - [<BeforePrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - [<ACTION_BEFORE_PREPARE_ $Component:upper>] - } - - fn weight(&self) -> Weight { - self.weight - } - } - - impl [<BeforePrepare $Component>] { - #[allow(dead_code)] - pub fn with(action: [<FnAction $Component>]) -> Self { - [<BeforePrepare $Component>] { - action: Some(action), - weight: 0, - } - } - - #[allow(dead_code)] - pub fn with_weight(mut self, value: Weight) -> Self { - self.weight = value; - self - } - - pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub(crate) fn [<run_actions_before_prepare_ $Component:lower>]( - component: &mut $Component, - cx: &mut Context - ) { - run_actions([<ACTION_BEFORE_PREPARE_ $Component:upper>], |action| - action_ref::<[<BeforePrepare $Component>]>(&**action) - .run(component, cx) - ); - } - - // ************************************************************************************* - // ACTION AFTER PREPARE COMPONENT - // ************************************************************************************* - - $crate::new_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Crate); - - pub struct [<AfterPrepare $Component>] { - action: Option<[<FnAction $Component>]>, - weight: Weight, - } - - impl ActionTrait for [<AfterPrepare $Component>] { - fn new() -> Self { - [<AfterPrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - [<ACTION_AFTER_PREPARE_ $Component:upper>] - } - - fn weight(&self) -> Weight { - self.weight - } - } - - impl [<AfterPrepare $Component>] { - #[allow(dead_code)] - pub fn with(action: [<FnAction $Component>]) -> Self { - [<AfterPrepare $Component>] { - action: Some(action), - weight: 0, - } - } - - #[allow(dead_code)] - pub fn with_weight(mut self, value: Weight) -> Self { - self.weight = value; - self - } - - pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub(crate) fn [<run_actions_after_prepare_ $Component:lower>]( - component: &mut $Component, - cx: &mut Context - ) { - run_actions([<ACTION_AFTER_PREPARE_ $Component:upper>], |action| - action_ref::<[<AfterPrepare $Component>]>(&**action) - .run(component, cx) - ); - } - } - }; -} diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 1eeb653b..24c0ecb2 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleRef) { let mut list: Vec<ModuleRef> = Vec::new(); // Enable default theme. - add_to_enabled(&mut list, &crate::core::theme::DefaultTheme); + add_to_enabled(&mut list, &crate::base::theme::InceptionTheme); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index ade9e045..b81fe75d 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,5 +1,5 @@ +use crate::base::component::L10n; use crate::core::action::Action; -use crate::core::component::L10n; use crate::core::theme::ThemeRef; use crate::{actions, service, util, Handle}; diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 7a59d60e..713017c3 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -5,7 +5,4 @@ mod regions; pub(crate) use regions::ComponentsRegions; pub use regions::{add_component_in, Region}; -mod default; -pub use default::DefaultTheme; - pub(crate) mod all; diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index f8214b05..3283cc40 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -13,7 +13,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeRef>>> = LazyStatic::new(|| RwLock pub static THEME: LazyStatic<ThemeRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::core::theme::DefaultTheme, + None => &crate::base::theme::InceptionTheme, }); // THEME BY NAME *********************************************************************************** diff --git a/pagetop/src/core/theme/default.rs b/pagetop/src/core/theme/default.rs deleted file mode 100644 index deea8dad..00000000 --- a/pagetop/src/core/theme/default.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::core::component::{ContextOp, L10n}; -use crate::core::module::ModuleTrait; -use crate::core::theme::{ThemeRef, ThemeTrait}; -use crate::html::{Favicon, StyleSheet}; -use crate::response::page::Page; -use crate::service; -use crate::{new_handle, static_files, static_files_service, Handle}; - -new_handle!(THEME_DEFAULT); - -static_files!(theme); - -pub struct DefaultTheme; - -impl ModuleTrait for DefaultTheme { - fn handle(&self) -> Handle { - THEME_DEFAULT - } - - fn name(&self) -> L10n { - L10n::n("Default") - } - - fn theme(&self) -> Option<ThemeRef> { - Some(&DefaultTheme) - } - - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/theme", theme); - } -} - -impl ThemeTrait for DefaultTheme { - fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/normalize.min.css") - .with_version("8.0.1") - .with_weight(-99), - )); - } -} diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 3650f00e..8321d56f 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,4 +1,5 @@ -use crate::core::component::{ComponentTrait, Context, L10n}; +use crate::base::component::L10n; +use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; use crate::response::page::Page; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 5d3b9509..f3bdb78e 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -157,6 +157,9 @@ pub mod core; // Tipos de respuestas a peticiones web. pub mod response; +// Base de acciones, componentes, módulos y temas. +pub mod base; + // Prepara y ejecuta la aplicación. pub mod app; diff --git a/pagetop/src/locale/en-US/base.ftl b/pagetop/src/locale/en-US/base.ftl new file mode 100644 index 00000000..31b03402 --- /dev/null +++ b/pagetop/src/locale/en-US/base.ftl @@ -0,0 +1,6 @@ +# SiteBranding component. +site_home = Home + +# PoweredBy component. +poweredby_pagetop = Powered by {$pagetop_link} +pagetop_logo = PageTop logo diff --git a/pagetop/src/locale/es-ES/base.ftl b/pagetop/src/locale/es-ES/base.ftl new file mode 100644 index 00000000..5f7e3c15 --- /dev/null +++ b/pagetop/src/locale/es-ES/base.ftl @@ -0,0 +1,6 @@ +# SiteBranding component. +site_home = Inicio + +# PoweredBy component. +poweredby_pagetop = Funciona con {$pagetop_link} +pagetop_logo = Logotipo de PageTop diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index ec44d267..9e363bf8 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -20,7 +20,7 @@ pub use crate::static_locales; pub use crate::{static_files, static_files_service}; // crate::core::actions pub use crate::actions; -// crate::core::component +// crate::base::action::component pub use crate::actions_for_component; // API. @@ -49,4 +49,8 @@ pub use crate::core::theme::*; pub use crate::response::fatal_error::*; pub use crate::response::{page::*, redirect::*, ResponseError}; +pub use crate::base::action; +pub use crate::base::component::*; +pub use crate::base::theme; + pub use crate::app::Application; diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 5725e601..3994b91c 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::core::component::L10n; +use crate::base::component::L10n; use crate::response::{page::Page, ResponseError}; use crate::service::http::{header::ContentType, StatusCode}; use crate::service::{HttpRequest, HttpResponse}; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 6510534a..0425dbf0 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,8 +1,7 @@ -mod action; -pub use action::*; - +use crate::base::action::page::{run_actions_after_prepare_body, run_actions_before_prepare_body}; +use crate::base::component::L10n; use crate::core::component::{ArcComponent, ComponentTrait, TypedComponent}; -use crate::core::component::{Context, ContextOp, L10n}; +use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; use crate::response::fatal_error::FatalError; diff --git a/pagetop/static/theme/css/flex.css b/pagetop/static/theme/css/flex.css new file mode 100644 index 00000000..b1145f9d --- /dev/null +++ b/pagetop/static/theme/css/flex.css @@ -0,0 +1,361 @@ +/* CONTAINERS */ + +.flex-container { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + position: relative; + max-width: 100%; + width: 100%; + padding: 0 !important; +} +.flex-row, +.flex-col.bp-no { + flex-direction: column; +} +.flex-row.flex-reverse, +.flex-col.flex-reverse.bp-no { + flex-direction: column-reverse; +} +.flex-col, +.flex-row.bp-no { + flex-direction: row; +} +.flex-col.flex-reverse, +.flex-row.flex-reverse.bp-no { + flex-direction: row-reverse; +} + +.flex-container.flex-wrap { + flex-wrap: wrap; + align-content: flex-start; +} +.flex-container.flex-wrap-reverse { + flex-wrap: wrap-reverse; + align-content: flex-start; +} + +.flex-container.flex-align-end { + align-content: flex-end; +} +.flex-container.flex-align-center { + align-content: center; +} +.flex-container.flex-align-stretch { + align-content: stretch; +} +.flex-container.flex-align-space-between { + align-content: space-between; +} +.flex-container.flex-align-space-around { + align-content: space-around; +} + +.flex-container.flex-justify-end { + justify-content: flex-end; +} +.flex-container.flex-justify-center { + justify-content: center; +} +.flex-container.flex-justify-space-between { + justify-content: space-between; +} +.flex-container.flex-justify-space-around { + justify-content: space-around; +} +.flex-container.flex-justify-space-evenly { + justify-content: space-evenly; +} + +.flex-container.flex-item-bottom { + align-items: flex-end; +} +.flex-container.flex-item-middle { + align-items: center; +} +.flex-container.flex-item-stretch { + align-items: stretch; +} +.flex-container.flex-item-baseline { + align-items: baseline; +} + +/* ITEMS */ + +.flex-item { + padding: 0 !important; +} + +.flex-item.flex-grow-1 { + flex-grow: 1; +} +.flex-item.flex-grow-2 { + flex-grow: 2; +} +.flex-item.flex-grow-3 { + flex-grow: 3; +} +.flex-item.flex-grow-4 { + flex-grow: 4; +} +.flex-item.flex-grow-5 { + flex-grow: 5; +} +.flex-item.flex-grow-6 { + flex-grow: 6; +} +.flex-item.flex-grow-7 { + flex-grow: 7; +} +.flex-item.flex-grow-8 { + flex-grow: 8; +} +.flex-item.flex-grow-9 { + flex-grow: 9; +} + +.flex-item.flex-shrink-1 { + flex-shrink: 1; +} +.flex-item.flex-shrink-2 { + flex-shrink: 2; +} +.flex-item.flex-shrink-3 { + flex-shrink: 3; +} +.flex-item.flex-shrink-4 { + flex-shrink: 4; +} +.flex-item.flex-shrink-5 { + flex-shrink: 5; +} +.flex-item.flex-shrink-6 { + flex-shrink: 6; +} +.flex-item.flex-shrink-7 { + flex-shrink: 7; +} +.flex-item.flex-shrink-8 { + flex-shrink: 8; +} +.flex-item.flex-shrink-9 { + flex-shrink: 9; +} + +.flex-item.flex-width-10 { + flex: 0 0 10%; + max-width: 10%; +} +.flex-item.flex-width-20 { + flex: 0 0 20%; + max-width: 20%; +} +.flex-item.flex-width-25 { + flex: 0 0 25%; + max-width: 25%; +} +.flex-item.flex-width-33 { + flex: 0 0 33.3333%; + max-width: 33.3333%; +} +.flex-item.flex-width-40 { + flex: 0 0 40%; + max-width: 40%; +} +.flex-item.flex-width-50 { + flex: 0 0 60%; + max-width: 50%; +} +.flex-item.flex-width-60 { + flex: 0 0 60%; + max-width: 60%; +} +.flex-item.flex-width-66 { + flex: 0 0 66.6666%; + max-width: 66.6666%; +} +.flex-item.flex-width-75 { + flex: 0 0 75%; + max-width: 75%; +} +.flex-item.flex-width-80 { + flex: 0 0 80%; + max-width: 80%; +} +.flex-item.flex-width-90 { + flex: 0 0 90%; + max-width: 90%; +} + +.flex-item.flex-offset-10 { + margin-left: 10%; +} +.flex-item.flex-offset-20 { + margin-left: 20%; +} +.flex-item.flex-offset-25 { + margin-left: 25%; +} +.flex-item.flex-offset-33 { + margin-left: 33.3333%; +} +.flex-item.flex-offset-40 { + margin-left: 40%; +} +.flex-item.flex-offset-50 { + margin-left: 50%; +} +.flex-item.flex-offset-60 { + margin-left: 60%; +} +.flex-item.flex-offset-66 { + margin-left: 66.6666%; +} +.flex-item.flex-offset-75 { + margin-left: 75%; +} +.flex-item.flex-offset-80 { + margin-left: 80%; +} +.flex-item.flex-offset-90 { + margin-left: 90%; +} + +.flex-item.flex-item-top { + align-self: flex-start; +} +.flex-item.flex-item-bottom { + align-self: flex-end; +} +.flex-item.flex-item-middle { + align-self: center; +} +.flex-item.flex-item-stretch { + align-self: stretch; +} +.flex-item.flex-item-baseline { + align-self: baseline; +} + +/* BREAKPOINTS */ + +/* SM - Applies <= 568px */ +@media screen and (max-width: 35.5em) { + .flex-row.bp-sm { + flex-direction: row; + } + .flex-row.flex-reverse.bp-sm { + flex-direction: row-reverse; + } + .flex-col.bp-sm { + flex-direction: column; + } + .flex-col.flex-reverse.bp-sm { + flex-direction: column-reverse; + } + .flex-col.bp-sm .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* MD - Applies <= 768px */ +@media screen and (max-width: 48em) { + .flex-row.bp-md { + flex-direction: row; + } + .flex-row.flex-reverse.bp-md { + flex-direction: row-reverse; + } + .flex-col.bp-md { + flex-direction: column; + } + .flex-col.flex-reverse.bp-md { + flex-direction: column-reverse; + } + .flex-col.bp-md .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* LG - Applies <= 1024px */ +@media screen and (max-width: 64em) { + .flex-row.bp-lg { + flex-direction: row; + } + .flex-row.flex-reverse.bp-lg { + flex-direction: row-reverse; + } + .flex-col.bp-lg { + flex-direction: column; + } + .flex-col.flex-reverse.bp-lg { + flex-direction: column-reverse; + } + .flex-col.bp-lg .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* XL - Applies <= 1280px */ +@media screen and (max-width: 80em) { + .flex-row.bp-xl { + flex-direction: row; + } + .flex-row.flex-reverse.bp-xl { + flex-direction: row-reverse; + } + .flex-col.bp-xl { + flex-direction: column; + } + .flex-col.flex-reverse.bp-xl { + flex-direction: column-reverse; + } + .flex-col.bp-xl .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* X2L - Applies <= 1920px */ +@media screen and (max-width: 120em) { + .flex-row.bp-x2l { + flex-direction: row; + } + .flex-row.flex-reverse.bp-x2l { + flex-direction: row-reverse; + } + .flex-col.bp-x2l { + flex-direction: column; + } + .flex-col.flex-reverse.bp-x2l { + flex-direction: column-reverse; + } + .flex-col.bp-x2l .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* X3L - Applies <= 2560px */ +@media screen and (max-width: 160em) { + .flex-row.bp-x3l { + flex-direction: row; + } + .flex-row.flex-reverse.bp-x3l { + flex-direction: row-reverse; + } + .flex-col.bp-x3l { + flex-direction: column; + } + .flex-col.flex-reverse.bp-x3l { + flex-direction: column-reverse; + } + .flex-col.bp-x3l .flex-item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} diff --git a/pagetop/static/theme/css/root.css b/pagetop/static/theme/css/root.css new file mode 100644 index 00000000..6a651354 --- /dev/null +++ b/pagetop/static/theme/css/root.css @@ -0,0 +1,122 @@ +:root { +/* + --font-sans: "metropolis",sans-serif; + --font-serif: "Lora","georgia",serif; + --font-size-base: 1rem; +*/ + --font-size-xxl: 1.875rem; + --font-size-xl: 1.425rem; + --font-size-l: 1.125rem; +/* + --font-size-s: 0.875rem; + --font-size-xs: 0.8125rem; + --font-size-xxs: 0.75rem; + --line-height-base: 1.6875rem; + --line-height-s: 1.125rem; + --max-width: 84.375rem; + --max-bg-color: 98.125rem; +*/ + --sp: 1.125rem; +/* + --content-left: 5.625rem; + --site-header-height-wide: var(--sp10); + --container-padding: var(--sp); +*/ +} +/* +@media (min-width: 75rem) { + :root { + --container-padding:var(--sp2); + } +} + +:root { + --scrollbar-width: 0px; + --grid-col-count: 6; + --grid-gap: var(--sp); + --grid-gap-count: calc(var(--grid-col-count) - 1); + --grid-full-width: calc(100vw - var(--sp2) - var(--scrollbar-width)); + --grid-col-width: calc((var(--grid-full-width) - (var(--grid-gap-count) * var(--grid-gap))) / var(--grid-col-count)); +} + +@media (min-width: 43.75rem) { + :root { + --grid-col-count:14; + --grid-gap: var(--sp2); + } +} + +@media (min-width: 62.5rem) { + :root { + --scrollbar-width:0.9375rem; + } +} + +@media (min-width: 75rem) { + :root { + --grid-full-width:calc(100vw - var(--scrollbar-width) - var(--content-left) - var(--sp4)); + } +} + +@media (min-width: 90rem) { + :root { + --grid-full-width:calc(var(--max-width) - var(--sp4)); + } +} +*/ +:root { + --sp0-25: calc(0.25 * var(--sp)); +/* + --sp0-5: calc(0.5 * var(--sp)); +*/ + --sp0-75: calc(0.75 * var(--sp)); +/* + --sp1: calc(1 * var(--sp)); + --sp1-5: calc(1.5 * var(--sp)); + --sp2: calc(2 * var(--sp)); + --sp2-5: calc(2.5 * var(--sp)); + --sp3: calc(3 * var(--sp)); + --sp4: calc(4 * var(--sp)); + --sp5: calc(5 * var(--sp)); + --sp6: calc(6 * var(--sp)); + --sp7: calc(7 * var(--sp)); + --sp8: calc(8 * var(--sp)); + --sp9: calc(9 * var(--sp)); + --sp10: calc(10 * var(--sp)); + --sp11: calc(11 * var(--sp)); + --sp12: calc(12 * var(--sp)); + --color--gray-hue: 201; + --color--gray-saturation: 15%; + --color--gray-5: hsl(var(--color--gray-hue),var(--color--gray-saturation),5%); + --color--gray-10: hsl(var(--color--gray-hue),var(--color--gray-saturation),11%); + --color--gray-20: hsl(var(--color--gray-hue),var(--color--gray-saturation),20%); + --color--gray-45: hsl(var(--color--gray-hue),var(--color--gray-saturation),44%); + --color--gray-60: hsl(var(--color--gray-hue),var(--color--gray-saturation),57%); + --color--gray-65: hsl(var(--color--gray-hue),var(--color--gray-saturation),63%); + --color--gray-70: hsl(var(--color--gray-hue),var(--color--gray-saturation),72%); + --color--gray-90: hsl(var(--color--gray-hue),var(--color--gray-saturation),88%); + --color--gray-95: hsl(var(--color--gray-hue),var(--color--gray-saturation),93%); + --color--gray-100: hsl(var(--color--gray-hue),var(--color--gray-saturation),97%); + --color--primary-hue: 202; + --color--primary-saturation: 79%; + --color--primary-lightness: 50; + --color--primary-30: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) - (0.36 * var(--color--primary-lightness))))); + --color--primary-40: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) - (0.24 * var(--color--primary-lightness))))); + --color--primary-50: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * var(--color--primary-lightness))); + --color--primary-60: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) + (0.24 * (100 - var(--color--primary-lightness)))))); + --color--primary-80: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) + (0.85 * (100 - var(--color--primary-lightness)))))); + --color-text-neutral-soft: var(--color--gray-45); + --color-text-neutral-medium: var(--color--gray-20); + --color-text-neutral-loud: var(--color--gray-5); + --color-text-primary-medium: var(--color--primary-40); + --color-text-primary-loud: var(--color--primary-30); + --color--black: #000; + --color--white: #fff; + --color--red: #e33f1e; + --color--gold: #fdca40; + --color--green: #3fa21c; + --header-height-wide-when-fixed: calc(6 * var(--sp)); + --mobile-nav-width: 31.25rem; + --border-radius: 0.1875rem; +*/ +} diff --git a/pagetop/static/theme/css/styles.css b/pagetop/static/theme/css/styles.css new file mode 100644 index 00000000..a81af6ad --- /dev/null +++ b/pagetop/static/theme/css/styles.css @@ -0,0 +1,46 @@ +/* Image component */ + +.img-fluid { + max-width: 100%; + height: auto; +} + +/* SiteBranding component */ + +.site-branding-wrapper { + display: flex; + align-items: flex-end; + column-gap: var(--sp0-75); +} +.site-branding-name { + letter-spacing: 0.02em; + font-size: var(--font-size-xxl); +} +.site-branding-slogan { + font-size: var(--font-size-xl); +} + +/* SM - Applies <= 568px */ +@media (max-width: 35.5em) { + .site-branding-logo { + display: none; + } +} +/* LG - Applies <= 1024px */ +@media (max-width: 64em) { + .site-branding-slogan { + font-size: var(--font-size-l); + } +} + +/* PoweredBy component */ + +#powered-by { + text-align: center; +} +#powered-by .pagetop-logo img, +#powered-by .pagetop-logo svg { + margin-left: .275em; + height: 1.275em; + vertical-align: middle; +} diff --git a/pagetop/static/theme/icons/bootstrap-icons.css b/pagetop/static/theme/icons/bootstrap-icons.css new file mode 100644 index 00000000..9a7d8ae2 --- /dev/null +++ b/pagetop/static/theme/icons/bootstrap-icons.css @@ -0,0 +1,1705 @@ +@font-face { + font-family: "bootstrap-icons"; + src: url("bootstrap-icons.woff2?ver=1.8.2") format("woff2"), + url("bootstrap-icons.woff?ver=1.8.2") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-display: block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-1::before { content: "\f2a5"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-1::before { content: "\f68a"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-1::before { content: "\f68d"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-1::before { content: "\f690"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-1::before { content: "\f695"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-1::before { content: "\f698"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-mortorboard-fill::before { content: "\f6a2"; } +.bi-mortorboard::before { content: "\f6a3"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-1::before { content: "\f6b6"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash-1::before { content: "\f6c2"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport-1::before { content: "\f6e0"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-ssd-fill::before { content: "\f6ed"; } +.bi-ssd::before { content: "\f6ee"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt-1::before { content: "\f759"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls-1::before { content: "\f769"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff b/pagetop/static/theme/icons/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..4cd66b71ad5f51be58843c52c66f78a8f7b89e47 GIT binary patch literal 137216 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 NrT!1{z<Eso003f9u}}a2 literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff2 b/pagetop/static/theme/icons/bootstrap-icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..de01cad9d15e664cde293ac71d80f5cb2e0c1860 GIT binary patch literal 102380 zcmZ^pV~}Otwx)O5wpp1wZCBd1ZQHhO+jdskR;6uLqS9u6=XBrOCvHd2KTEOZc*paO z6>~(a=`JtE3;+QD03h*~0JwjS5FNz-oTvT!-anWBbKt8$8UO-2L1B|VIpfp$K-fXa z!CK(qT95(Y#1J7?P=OP++6vVzU~l@vGh3h17!!6OUjBj{C?J3AaxIOQZVf0+<YbQf z=PvNGo%W!sQsH_63Eu;}I&1+Px1Q$jahKo!XZZWxk$L^j{N-+M=5BvYe}^VXO*C8% zP8X%1RS2W&8I#l$B`ev#IUDF*59M@ZRIv(=8`rOKP$Gj-EJGYWAT!+`iL7|yOyztY zDpjR9>%S(^MN>?=AMuAZQ>#?YNTqIdVoT;7(w5^V*y&L8cBzRZaU~7MpAdqdS*i*3 zV9KBLA)9#B%djk$4-~^zE!BJN*+(_XpMF9oInHTfS#R5eN>Wr+i8@_8ww=p~?^0L6 zMA%=@P{9KQwwrQNboK)^DM~Ii+YD4d&$ivWk~|tB?Hgl7=c?_`ndtbh3Ur^DJr>Bm zyuOEmzJssEc@&C4jNoP{`7PMTNf;U0b|hka9KJyNXH5#aQhvM%9tor-FgGJ&FB)qC zo@1{8*k7B=3i^ku8~C^$0~@r1{P5h?hae&OA)&1#!AK#a8;k)r#3Esup9%ZsH#arU zStP$LY=Z%6_hIQCqqWSYMnb{at-Ud7x})0dPJ7JT-G^-(UD__)-r;uRv0>9P@3h=b z(N{6}<GU1(#>WMzYwe29E<y57;Gqj><e=&zu`VZcs&JU+Lk~?Rjt=Bzd$LiL!)i@b z<;;a%uvW)#N|Yl3DD%&ga}*)Vk0M-ZD=Gpl>c39QNIS}QzLOhWs3%cNAH{lIDRUpF zO*4ZAK-dGz)t9HM^Q$X&YJU^;nQ$kf`c=e{Kr-yd-1L3aPtaf=c0xfCGh!4$ni<LJ z;PL(u{cDpq^ZWkedexptrh6Zz-X8@u@j+OSbOtZAL{(&=;H@9(gM@wcJ8x-O|Cwj| zT58+rmlkOhG2VpWXi?~KVk8Y0!g#}M2Kl&IFb>Ch-UK^SWG;5hGt^+oADD^hQSfY1 zww;6y^;K=az!{)tho~U#)q(trCZir_U8)^;t*fc4sD}!eL%QvJO+Pv|y-ZJs0BO=7 zOQy?=Ax4G<DIq39#n%AAIWVJ|Z34AGLBR*AMH}zet8H1(bXvCtxY1JXc4lf+e+pNJ zD5=fJg#~)fSGU;2+z3iTSxLU7BVbF=OShG*#u4PX-0M3rbfh2c(YwQtPah@WD?`Hw z&Bc+E$AG6KHh_cA1LzS&L0W@A;M%J!D%LPZtU}lJ&p}(>tT`6!Y^(iRj5iAjl&kiJ z`v}4`hLtZGrzcHnf`w7JFR${}x5tw4pZNH(Cz+W*l~OLBroY+Le|WeT^wn9ZMPdXr z$L{Ui25~S1$y7n_5ryG@<ePdoNWCylYE1-9Qe)%!^hu=9X?XW6lC?k}Cj~$l_fN$8 zD}(nRU+H&*tZs??NEv_+n8-=nSW7!_8EtHVPQ!$YPV>jZ8tXkYnO`8~f_jMgwCbuK zB%5O3;R<>16xhSRi-+6;02G8VFqpK?9^<|#<2~-3ieIAFKwDb^U)UjdE&adwf#vJY z*uX!jVC3k5vh-)j@86D942#WR(LdK?TMvtrLwDkpRsxoql45ewmYWvttTpMZ1?*lS zA*mDCp8`^zk~#c_ax9H)YvNz^@w%n}XKFL#%G$UF&?ZU(A>=IuG}4J_jS1ih5O6;P z1%HD}438{0z>Nqsv(EL7s2ODU73n$pZ-=S3)79pi^*u-*nr^d98ydr2YZ}arlC?C- z{s^xM<_9>Xhf9>RY1K|j1ub7iQ5!acb+s$S7?r4y&nS@dAeuqS*c^dE^3Y4zVRwNc z)=|YJ1~1@Kz81)~D)R$Nxo1k)iD!O<MoU)SeWz1@_u0viBXZ-}A}1k>#pQBFD(7fh z<@d0^wZfl#e!tcBlFnX|mbsIVr+n(~l_n`I-1V88hPe=pS~;0Chtk>91L{j4cE}1% z?ni$6xv(uJ>^VIXoHeI6NW=^SiBdtK_g+u0`)WI`FJ+BK6#F4mFcl1+UKMvVVEkm? z`n1mdmv8INKej`0s1Ro@Or~I_V7X#cbv^6(t@mfzyf=I3u#v&dG?Ktjwfz8$jLVvh zAl!YnJAK6X3&iL*4|LmCq3luF{ALUlo56W%1f_T&xQ6O$HYT()(yR=|))jN&9|1=j zFP$)bg6^kSyvz{+Osk<fzsjQe0xh721rX+hrP-Cw&4RP#UZLs$kdP-_lHrO*+Q=z^ zJw%VvpY_Int4g*l#K>?oL`X7$CQw~nA5I){4~ES>t$%ltSnv7a@K0H;5(WzZ@L%8T z#YnTe15YrLQd+3jPf3otvPwCbxXCk^ZQa{BG~iOb06{6O$r4>D$h|fTgiMtIx))yL zanuGAY5_mJU-D~L13Fw71xBZBP)fI!L8;T*eKM{`GRWUXiSU33c@V&B9u_uW{J!n| z^f$+j=U!$Rx<Ov#IjX8<09t1O+*_`!cAEZad@v%Q;=4X6S>|F<ZKEAnaGJxBW<2|I zy3gK9-x7mFq2L0t^vi#VSMIZxb@s@~b_*MeyUY8o^Q0%-9PT&f6bLO?LMSN^6P6ez zAVIIkt6t$+6{N}w7yyuXoRh#+s=fO0TKT2aC0YoGDoBJ@h%<U_yS@L;RE=*=(%P<e z+`0dj;6HrZi8X8H-#5d%T6YPyXto)IF>gi~MBtFPN5GXr5i5eIdT7_1{{>Pw;|d3( zATUJayR5@dn`W4jvGAT12_OXc0=|brQ?kj`rR-9SrCaLH?f~02H(waksk0?E=`%a@ zo2hCiwC|?VX)%o-$29Cs?aF{6dS~Y*_GFAceFv}n=Y^+Sn>^46Pe2r?!Iymb@}wRt zKBqQ{ins#nlCJwU#wSMX*EH}HXFXE9shN<*U_CIkdoK|zt%r-W3NQuC_Qm=ku2m2f z{kCz4*?v^l_sz1%{OHU)YmRlaH#fd6QJ4h1eax9rcLl*D%!drfg_^l?`rZE4=cnqf z{><7SeD@Ua_|x2$8m;tBu&$ieLLn~2rwtav1UBdf7X}hFlYHs7I}-+fI&vE7Bu}G$ z=yPV_UBTI$<N{QTZ!bmO-Qn-oYc3MRKhP#9VdTV<ZCX4_R@XiDHNStc)F$+Jvvptw z)n^(6!Hhzagdhtk@2Ep&Hsgl<wH|xsj8_s>6GD{;08DBfw2!ug`B>74k^xNxF*Ty} zdY6u_XF`6?9Cq0D-a-FJQIbj|CM7)(;*Te2oZ%(0_)T^m2*rn-iEYh-HIz|Z?&;mi zCfJ`!5r>*^%)zkv7GC~LL%+a-k_bU&B?4zW5-+$?^9^Igvngl3>tj7nO)V}V6ci-h znn$b-3NtpFA8-4J^gH%~Nc&k`J`rE4VI?3hFtU4hJ(%LAH@}%fIB808P#u=Bi>JCG zpg=`Xlqzk@mo?~Nuibd&?s+0xm1l!rt~yS`oRh_(*?Hp|Q_XhL^k$Ch53r!}R2J~X zg~4@p!EAhMx?47<RL!lx6SS|a)$vxR^{B7C+1EHZzSVcQ?-IgO&~O_U(NK$a?#wRz zz~^U_nrBK^f1!@wlN}$^IHeV;)#rs8IGSh)8eQ+pVcC%I@!fhQU)%srEo^hYTln6h z@j8vja1BB~vIlCyoGDb6gkyrKDML@WnwUOby##U|GXD)%Bwy2#kv4SJ#H$A-PHBz> zSsVjb+0r<BAIun)%sLg_RF&O!5$>3k?z$O&@5v89p-6EgNo8MoMSec)4v82+n^56S zo;ijaQR+~tUB;VH>slp(7eAbEVb`Zs-`wVd{?AE%eRAe9tZshZ`t<Pc?(W_Uan4M2 z{vGrDr>y{l7=VvB1eI8X9eW6-n20XB47J#dJ$}$KOjg-#)DewZ>aE!F&tACs|5QZ` zF+j&12t>nTxBKY<B9fsn8mh9Pffb^dQ=+MtqPpFp%OA7YU9;(zv-;Uh1Q22jGOB-u zqLhd-(}=?okyKNW<&c?j)A@}w2$XB?23EISlzVFaqpkiO37iZVhQ>PN)J-haRCFF@ zxgK}%Du_KInRP6xxh%W+_;1De*9<WgS#}v|f7|nj{yVDMXZ73n;)vb<M%B4Z1p7!% zl{I3<+2L_>G%^#;5CDxf*`6SUckz=Sx|p-_UtIr5>cVda2|$7^*tq&0j7BcXLOUki zRAkj@*qKK(BKdz~{$2e95dT|UcL}6n%0G#!xh}eWGBRAW5uJW^|Nj9J#~hH)+!fWF zml6C2!yd^LlT@wwrG-M}^fo(Qum7g_FKLqhg3@W(<%j)WT>Ssd^uEdN-BIruEC4yC z09!5reWn4QA>!X0y!?>MGv`mEkF9#vub#pW&wM&|uHsKGK40IyV8Dg<C0G+DP2f_k zYIiK$I(xnhIJ0I?rk1^$xBu?uUtjB=KG~p;x7eg_-ag#zFQ)&p=lA<>L8t$NKix%} z{`0*b0NU{1o`xMmC?;X3ve0ebegNebYW}NM{{G`8hye8H|5H-33;&~}P9MLDu;mo~ zZ8}Yr;s17=Qd4h9cJpr*aD7NxpWh#+dgkiM0|Yq;1$_u6sR)NqpEzam2)9<wo^j*S zug7-}njAKE;NS+FG*YH;;SW4T^vwP(gixXeY3c-qRH|0-@)?3y^14y$I)PmJCKw=) zgpm_8a$p}u1T|BrbRI_rGkfUxUoVJID+5)nV*i;pYZ~*Ppbni|(gXbVL;z&)FoAR$ z_&9;0Ic!=)dE%sTbn4hygQhin`gjK9sA1GhsoMGT2gu?Ho5qbx#PX>bu&kA~r?}a= zyd7eh|H}D4zRimnw_p7D@~2aezgOLVCd!nutn2hD(5BKXYxOK&xp;rhyL9~P`NiKa z4?iuArO08-iw^#{9sVd_aTIq}M)jrV=WYC6QvGMns-wES?p@pSVu|IVx>cqV>W4xo zMT;Sfb<mxG@H=J=QvdOzZqLc@KZ*Ip_maJrQ;9LhHriE}i6Lu;nx?t3+ox_L>R#z+ z>-}Nu-HEY$8gwr%{Qe;A+eE)t`FkE%CR!?rqN&>252onLx9%qE3(B$>p7R1xN<Hfh zLTR*a<J^1feQr1$P-pqd2S^NuLgSH{l#YOk#iH?v``YH&x?dNU=PQ<8n^M-bzt+_@ z|I)pmY!)?C*pyDHR&ncjHK%3Vsg$v7pV>3M&l}$P_93OG(C8N)T(#^8!7(%`EoQkr z(ME~zY(Jj3^y=*L_4=L6s{3lZM6%QEFQ&Pk#i6hOPdlbv?VPf^Jc9R4xU(5nRyf#y zwYj@JAB^hElsET%`Xi5y%t(I>yn_S~GlIk3-#rDADOkW`hEpO-n!u)x{)dy5GKCMj z-4N1gwQFsM!<CJ0`Rs2p9Gg}v&fB)nyiZ%!*8~x_Q)1^wT7~wos>N!$KdSYdWe60% zTS2}V&db3dDc#A6aMcQN)Qa)Kh=&-%48fZX(cy-$)508U;L$YjC>oh$49zn}3C$b= zH1Q1)DKo}!FdYI#bqpse$M6!^!4?e_I^pHwNzPbU!NN?(Z(^_$naEfSRmx&!W0*2o z*x^P^CthkY64=n14VBttX5*;VS=gY;j>jKzG7?!>oDJ3Lre|ZhI#@W6PL3x&x-}9w z;O-3-dueCmf4nxg0ManVogf;825MBGtI;Q|LL0^QYgEB6&?me^8v~2h6_{*FG}zVf zvw?ZCsr_bBCeA+^LzC8(sBB7A+SG72fw{J+18$Qh-lmPgP3wwWmnAxGYJ^?Dd|lOk zJ8Bbm!8KupC-j&eaC3W-HF1e2jHu5LGk-%)0S!d-xZsde0~AgX5k!p0A(0aYMNT1= zIP}<Jky8sMPBED{jOfGR6AwpDK^-~Fc;(?!6&OxgA-VJj7V;ArNls~{*|ZpEmEn#g z=REWrh96iGBcV#piL5#`M)Zm>=~XFHDx(<Gr&6j8sni`>syfA1b*c!fm1!5MV+d8J zVr&k{xE-3ZTSaDes&Kz5Q#Y4K39L@#TpiN6JG6DTitVmck)A8l-<QY0&QApqZW16p zHH3c_84@l-$6Kb1;T=YfdN#r2StXTcA7qw!w&CPir=4aWhMssfLg-l~rfVOhrg^qv z=vk+(Y9Gd~cs3*KSSA13JjiYH{6(;1o&LOe82t3w0LFKo5YKav9QWFS#&?nOo98fk z_O%JF_dKb->ma-CwGFTLBJH~CF#PHj<w2l8+z*uZmgP^Tz5v4qtk*He9A01W&MVl% zKz@Pz7pU(o$DeF}0sarTw`2Y}qVMPHxPSV;8|**eFX%_`5BQg$AE@WBZ@4FrPncJT zUxfQ0w<u>YuQ<mLj~IUuJ_!!N?$Ivb-tlJLw}?FWXUyRA0V1FznBb8H5}^VV=uU<T z(BVqpDx`&&5U~~(BLb9|UXF|r;fkO#sD^3a(Iy(D{S+8(mJSl(%8)wD`)LsIHXg_Q zlvsYA(Bt9?AVRPxY9SFuBB{h>=#HimKyf7qCF(@A&=@O|W#V#7Pgh`txFVPouHs5a zl$lCvK^catt%ZfSGL#ng{7Pt?oy%iEIhL<4_MfpifEXkbdq||AOss(!`iYpaCA`|G zku5&^sIfJu8^wVIsvO0k4Xj<+fgLVk*`Xz*p4ovdCZE}%HKO0ifjyz%G-U=vNJD}G zCd#PMpr#PGbfgIm6D?&L#&BbjhgxF46{@B%s<osU0aXoUDndzPB0PKIgjv&?5WDt- zAzp_KWjw)Ab26x#;<#PZnlO_$l_62-WqAx(igN-iqT+;M6{irJc;!BJD}H$#+LCh; zq}=?tWfrF}i@D`Ker-;9ES!r&B0c^5Z&S#QL1=ZHV_a(;^ISX|hh$m1#u3}Ljv++% z^<zTsE%SUR{F?+}LdRj_IL|>Cd9Gs|^Pi_VSUNXJ(t6G#cy*pr2-oe0yw5&+1LB0f z2NULbzWXEUdcKD<?mM4*L-Kr|2UGUFpZjC_exHZG{Ry2~zd`@(27H6OG2DC$d?9fI z*rEBrnc%rV*<g7gSrB<Z_#+uZIb&Iae?~KhbH}#@^hPv>bi}j<^+Yv?b;bP(?2~K| zZI^8k?v`#6@052FI8C@h=`ntzgqOp~W8yP+8hA)r$GEU&=diI~-)`(Xz3IPATtquH zr)SX7@91&#KfN8ePhQ2kw)g41{~Wlc^baQiD1ifi2q;0)vJopmQ6m^EfYZ|<FF;Ze zC@etG2{ST-(il51gE2TmHw6H-C7Ob1y@5^v)Z!LSLG<R>PJvYF8cxA<?wof4H1ZyI zK@9fbcfvq_5m<p50diQODgzT(!8!$WSm8<sl_-H)305hAY7-YJ;d&u>>cI*l8S0T5 zW?Jg8Dp;GU!8$Aas)0%^ovNW)ub)=^)nYzY1NCa4R%8`!Lg&Oaa-`>^RfI<8KkE2U z&nYWGlyJ#wNtkgds!^P9f7CO<;+9vyNM)7OP*G=<RpD4=mDX|LW|db$Xla$y{@~Us ztH$usDy?UO)H1I?5Zf@Rp`+L^t0FMlFs<Xo+%T^MQ{y(NC1d9{t44F<Hmzqt<UXx{ zlj}UHp`q_Qslv1CJg(y*^g61f)bl#2#p3fiuIBLbI;}?nc|)&Y5PZX|AtHIhsNy$# z!@2^X?FWz&NTh&8yCE|nQm+gQbG3VfC+sDl5=bQpOS@rHA<``GmvD8vh$rkvFcV0o zkxjXwbH!1w&L44g`iv>;Wxx_hCmPeZ;s1!MUb;=;Ds-Y$+8?IQ6-iC5a${zbt6QO3 z;wtqjU)Wp1%@s>tv~uI7ldE6GY2hk%Ghf)B=FSyOZ$5Wp=bf!v<$B;M_d8|Y+k(s; zOSs2%;~}%NUm}R<D0Xyb-k+t|9!crSa&u?7GF;)E=}7l{ZrkI-++Iz3*L3rzAv9P9 ztMyE9MQYn8Vdq^+3txY7;2|_zCHw1{;v4U_$Arkck~qfo<UyIYw}h7KndB_*zK=uC zyO?U;@npl1cerxD<=N}aaI+Um*fX4*?)l`zptrwF)8m=yUjMYu#@DlwzWVy)#lN$+ ziudW6?7Tpi5B@?sjz!W7doLSuUG#x`SkBo;{z5lFMD-<gFCX^Z1aJzt6M*fHB9<zc zM5b1#Vzg>FhsFhFRcKjk{Ncv#%<$rTYlrj*dl3U44WSSzD={-UIl@dyQ&C%5VP$V| z`*XRlY25JpGGK%xo6KztUyd`^iR<trrwfjd-jlEEaSOnT6mSp9O4NT3)&wYk18qaz zg9B@XPKX9=#h!}>YX)zS2K|M8BOTlTA2Aiwf<HbL+yq)d6V!(KhbFiYHlsSI6?d&V zxEZqDI_MYXi?whAV#tM13*qpEa1%%go=_Xg5uR`(OiH#;E6!53a5F@Uw$Lw(2koH- zgqY327J})`p(ZdJp21!;e4e2WxSw5vU3flSLw!)7-lXkVLf&NENC)qvjYLWBWUhb( zC{kzSCa7Wu=&0}_A8hLIVlQwj@ghHTT=8O0c&)J_Z+x$@Vt-IbN+TE4QA%Ss*pqT2 zN8Ge>V^_#0^8*LWIP*gn#M#pWC&IeZLpP8stOG}sJgh@k7{2raZydk$Lw^VmbyN=w zL3K1A1d>%$KLV6hG*2)^4pd(>CJr=jILBY8{&+CIl0Bd#-IIK<sN9pikSw2*{D^R# zlV1UvNJ*c_Tu909(4O&1Z`h{s%3t6Z@=CAhs`AR8@NB=8-tk?3D}RF`Ff6>F$}%i| zz|z$(yy4o`FMdH1*e|?d>e?^9Bl=!1d=my=vpj(u5;5PRBoncG!m#8szvDRPvwTCq z={LP#(C9b6Az1G=y%KEhHs6DF@i#rAz4JTYz=iiYJ>XIHIln=j`a9iXrTaVIBmMez zdM0}QzIVj40kq2pT)`#0LtK6Z;FHn;NwG;eNx|<zMM8u^#6ko^j*s?`e+mgiK*Nxb zp@&4xA#)E3WI)3ilHrF$dkc^P2vI=uBLoD7iOHRiQ6M5BQOQN1l!~Bmm;!RJ1qEda z$juZ`peiEKSjj=?B!$G4=8{?A$-&4b21T40lYi2d0BEQN#iSaNnej_NDJus>tsIiM zf0lqSSPqJ7-6XSvmIM=@k&1XhC-ae-1ORbJ#6}~MVNgw?$TLYqPb88dm`x&SHA%!* z#*-0XO`=KH3q_uQ$zaq+5!76TVzU*=aJWZN6di@4R~E@o+((i0o`vE&f0B_PkD^Il z4Mo1Nl>rp!5mXSyVk8;LKuq+wAEE}Li5kl2?C8;SBgWz|Ys#dEDIsJ(4n?Rqm8t1d z!e~kl#c<k{DF{<SDNPSWxjdBV`BK6ejt|8lUX)2dR78j|&_qhXm2pT^<bbNEVyYp^ zY$z(i<jbg{k0Q!oOiL29Y$)P0!^&_lOH!n*i6Vc=m7%DXB&l5!#kNb7k#K(2%bb%% zzfF{ZI9Vj<;F89NO_Za+TBHc!7Dt>yDaahA%z>A(O5(^W$}OtQ!KboHW6UVZ-Y?Dl z^Fu&_fKE|<iggY)wnYl9c3$S9We&2oMH0_;UT)K64l%by8td=8?EAwUNRNvI5y8Ct z82lVeu*)QJE{n`+%p5|o%M|uDliah+T(G1UtEhb0**bhrMya~<gIV4V-CVfnTZ@Q( z+Sw-Tr-rG4hVh<;Ir5r8!kUS~n$g^v8RME^!<y;Mnlbd6c?73{1gA*_r;!Dx*&j|r zY);b*PGb#D^R;#Z&UTabb|a5=vzK;5@OIOXc4Lut^I;DIau1Ud4<i!~vm*~fbPv-M z4`US%^Q9L9))$kO7bBM!vxgT$_!rZd7h{?BCY#$I0rr9)$b<5RAE+P{QR&z_2mL<; zB!W^ve;{Z<#?WeTIo$1G5Cer&f=b{uA)=^N*euTH*bFQOSAvQW)S>d|eRxIQBoGvE zi#P@iV&=h<smxevPS$7}v=15vEn~+Z`~C_<xk_-_OK@F}bLNk8=>t7Zl<r)LNL{QB zWQBb!A{hv7iz&b0$paFBnd5rXM_h281Cx&ihf#nnb^$vc<W-pIzkq$cP^aDg3=__K zh@g&06T89;Z;KPYuva+gTh8;iazgNP@e+_r)`Z|H&dRLlmHjg7n+6v>HyEPFQ+xH( z7pTB{kQ6FF%qQxNG#|DraVB~}#$N#zeh}qW!@}&qVxGWqFyguIz;SxeNVec<n1H+1 zP?ZqY5SI{mTG_CHBelShzfjp-aQIjGd(2`t8O?hvr^E(g#3r-C!#V*O3jkDhC?$5R zrcKqop8&2?2#8aRAE$U2r%-ICNC>AyQ4=;P2|rVkxPWA$6~q^cnuzMMhHMG46*Rre z${Jut)~rc(tjV?(B)k@6oAYvB^MZ(l$@pTcUHTl)Y-fg~Md^_-d=yZ@)6DQ}8)24f z&@x0~nSL=$@{F?|u`nlKnI?QmRA%Gvr*y8IJM)Y?i_m-uQSs>ak*IviX$&ccc*n1D z5Pk|M{FNd4Dx>yQdq}Fc=~ge|t{>%)0B-OiYlBXRLLP-TC}RS|9M>QNU1CiR;0jpQ zW02vL!8$Bw8)ROsut7HRIwpA=LgrsV5_W3$xKZ7LX5?Ve4BF@ssRm6P#Oi)iRgWBf z&?K?()`$#nqq3NgN@7#)@eF#WGWh{`AWnAF!ct0MvA)-vu>ljAbcRM;=CP(mU@AuA zZO$6Z5phJa0liRrBKnmK98y^<<#wMGZooar_$&DEEBy2;=-?~t<SXRpE8^@c$iOSi z#4E(eE5ghx*w8E7)GO53E7I;@oPe<iHV7)2h}jcx8YH!&fJxm2GhhIeNfRA2derPM zXAN4q>tQ3I&x&;a8}vE=1&`Ehh}<S7B{sPc#)(~WpbWUqijiGt*34=Xmo~H52;tQ> z-k*lO&WxsQXjV<DL!?&6fX9)Tn>{=ryMI*X<ha<;f%9`qM$Zm&x6%58EilVKwt_+j ztunGIvM#bRvNp0hvR<-6vPLoqe<B%_DhZV;8MZPBw=y|QTG>xF&_yEsK_VZ1JRxR0 zLuNc>dOU|#C+*xC*F?B2!%~c8#<~!qwxuLCt#vU9abrc2r}K{pNA7tcWzSDV-=9pM z-F9Hzgu&fZ!rd%G-B4uR;>A67?2y;%oYy1Z*URMBGw9dbtl=@A@SZt-aX$sWiRBmg zB{{f-yyln|qUjU(Tq146e~%+R1YL^MkJF!HEXenWLF!#hEb#>Fu(1>T&h`)g#_zp* zcRj?=U?TC3DMn&rk~!ryj*7y#pA~{OI4}kIh!?R5>f|b>;E)y$t?n}X*_00Zcy6lg z#Cz4sp1ml>)M%?SvK8pmx?TnkOCZ!{c-6FhCP(#+pZ{s#&SzEmh13P#95wol&I7$Y ztaZoa*k4^Lz|`i0<FBEY)!Xugv6hb!Dd3QRs}xfcIs}b$hqGfKap$EIX-}FgpwAb7 za8FuFLPNpjAMp7XlWGx+7EK$qvzCEd$#xJ?2)J}$PTLeGmNnt(FAI~1ULXmlSW}nO zR;sBZfU0nIu;IcXl)n;<*&!zl7Y$rcq7BDY7W#?ylT(~qdES@!fmg2YSbvdOw?sUS zk$D#xMIr;vU>`P>gc7efq>|OY`4hX6X|W}`JO1QW<u0GuM6Ri{bNnGy*bK)NNgDRm zR(Q(BSm}07HTp4LbP(Rg_>y#3z1;B$jl_|nKGrmE&y-sPic3>#m{9n5&gIW0`vtU} z=usloIc6L>IFG2HY^W3U@zSXD)-_*%UF;+<k(JJido2D>)#&WQ#<<tlK6kDp;q$Ww zAKki(ix!BER)}Cz=?q=8?LFLiI%I!uzMDukC-OdH8CP{J303;En3N2Bg7_D#48I>| zlpaP#>_P#%?8={2MrvV$_l@QjU9Y8f@Dy&x=|wmr9HgTpx0!CqHM*_!Wio+Z<<7-> zRg9r!F`v|yt0q<(eRxdx;uOn1(h3*EI1z1lQ)=*3&HLup4E>C`?2jutxMnSDA1np( zSieattKGP|%UEVC1lBZstGdcQ&!Tw8mzel%^F9PQs{5P7T(wbL(3$nEApfX}w(Nfn zu5fC`d_}=n_iubC(SlJHX|Lsk1=XJ9TCcSXW)-apd$$akUsH65(y^f!NOXKyM2kyc zoTfyfs8srVN4`h1B~@W`#LCQlSZX-$^3(HdN|~A)6&TqJX&kO<vJL)Kxyu8|=H`6( zVyrkB&G8}4#J@TyzJKy~mN|V{b0^3ijX*Ae{tF~l=QxlQin8yRrD|qbqwx<7O$$n^ z0mVVd9l@M6kvrh(0k)whv$Qu^>Zz;~Ay&+Ym)&=5vOnOolIOuRg(4VDFiN?>3KQ3R zecDR0AAf{8;$7gr7ahmCHvho$dNH$~q+Pp8mPbf#rTB3XQ~GFSlf-lKgKqg;&cZub zr+`tg%DR@iIqZ}@hX))jK`7<OMhS>P75QtzvAM48$ri!&^sCj+3(aGnSdI2Rl1(gz zAOiMA(7TJNziya5BFV>xbu<8;b@V9npb5&npO+9=<e5J`K=6^X;bN&J>=d9GCbzoN zG7>6wh;i&jYtlS@uYR<dj(6zo?lg0s>D}sFw|vPtIc>&b50=#7uI9XfY$Tun#pIPg z&SrqX!9l3sCPWOLqGl|EK8g;NBhd+WfN5Nl`*K8AE6eJ!*U2(kaiX9?-`^BCV;f$i z96}$ng?-uvq^WeVE4KEIZXzeCwtkZLjL#n4SIA>%SF58UojB{5`E~D{_Ug>XZ_M)h zccJ5K0b)7RD0!m%L~PJARo60hGYhT1Z?1FxGd#L^IB0)?)#_Ap8>x|PzBLG*Y7C5H zb&vL(>`+2bMf$t<TXeL|XKLr!a=O1IuDfYB3GD0v1nOGlJT)yk*5Ck!qb7OuuL;e= zZUk$>i;3Vay4h=Eta6R~(TZkEbJ@;G81>bHUlH5LEK4cpab6CaEW=<_P;KyQGXPV@ z@^{8FvU#G4apz(-?oDxlYVlRl4cyLwsRxoj$8Bw>Mm$)+0~?qYc6DUR>K2K?bfTPM z*eHasRN7@hlgPM;LW!~r{FsTbR#=gzplNtqND+~PAlxK97!)pfd0@xcz{OBlL;G{S z=y)?qp>37aK!;9k+tXjnj|tLf6w0fOMQkl3&?nh0XSMN)nlVj>DAPO&eg?mUw7tEk zp*_h@1x!RL1Sw)D4~L8?W`@vrZuQfqw$M~amXTN^DnChIswpKU>L`1v8;!{vn=CAV zGb#oO_8^rif;U<m31Sp7S}IdsN&K*hLLms|8i)zZzJwB(lmslzX0rH>Hu{B`E*pPd z(2A1baSFkGvrFOlZ=>_=ru(V&^xPA3(Ml;*xk*VX*-d8<hHQ45_8ic_q<a61mJpA9 z;WtjOIg4}%Muf&KA`ry|JmW~$wZNhQ5XaLB1sIuOX7N+1P7?$UZEOzmaj5}?4$y_p z`d~?IXQ7A<wtVz}#xeXLNx?4qD7#k9&3LGD#w9~-993g-WBC0}OArsxs*od-oMIR* z1nrgF7|voGLzO?oaw5BZ``@?UlH5lwIaHd0s8r^!@T)@yh|t;5W{y`_*73G4IG?_O zo0ok)#~8aU2pw`(H0X0HxD91m!cD71f>J*~7|>TROPL=7A*E<p;ZT|c9ZAUo9;|cv zvBi}{0A(V^QousoWedtw@PC?*wVU4Ysp>;U*`Xi(e-0@#V{Eift*lLE>Z!8dT310_ zd)(G%w9m!U?UXySN6yEFEH!4<GhtTg$DMYe<ogN-5=a@tB5W}V>>#)?1;&8`mLdg9 znw45dPey1BUE4b2bD(c?U<2OJC;=7TKh^`uA{VxiueZc-?^s0F3q-p&TqF)O0Kx<_ z)yWubFt)oMdhZR1Gh6+4n@5(EEw!Y;*M*`-rn`VW%(e3~Yoiu~9{0_5&aN=1VzFmO zND4q?*+WReL61p`UG{29lrp|5mj4Q#jPhbeRVNEa^WKvZ;W6|sNG?DJGs&|f=aX1g zSkV&qhi<t<B#GWFXmuTQjBK87%54qQDUc|ef_*c0RNR)E&cengHej~Kp*B8d=Jk@f zO}mKMn~E<kR^Y<|C);xHZho|4$+_OE+zKATQgY%7m$UrnP<Ry>mnP{GH$!3TYOCl} z6#0Y<4|9)9EMfC!xutgAt3^wSg545^gd8K3+KcJQdtIpw<p;ZG*6{ADL|#75_+P0u z>C%K?0Zt94G^zx(=Oq05ItV2}<{wSg`yTRqh&^Gb6qAb74J)!I6xbFxpv9%&s(P?4 zW;tAFtjk$hV1q556p@mjz&%3k=T-3*6(!DN$-%@NTFRy^O=H>C(G;N2-}5P5U+&%; zNNtI7cS*6IZ&i91#g1ok%jB&#3k?JchfG%qI7)*Owes`o6*MBo&1ap1c)lc-Qx`re z6E9(qTI$POsc}~7gj7;NIkFp;=DxnvQ!c5RIykk4kL*z;&e2Z~NqSd#`sdMUl<yj~ zj&*#?2+HcUzd~2mL>6wrdS57bUq`WimvOSQUOFkfRNj<86^#qSWC`sthM>FnoaPRR zn?&&Xn29|#Jw2o#jrSrc+I6+Nutd_=ORG-~!q+l;tU90T9;-;>Yf{LHOlkHde@j_! zM1OB2Tz?VUOhXFoqHJB=V&#&{ke=06JniXh^0gQ1czl}c=m+k>)lN3G2~Ob(8z64( zM5~~jW*M_M-=+3Oui4t&>L%H49z3?!KOzJq6)NHHWO-OB`MPuadU+j3yZAf|m@kGE zFMXDWk$#1y=#3YfiJ`}pG~WjW{eel96jqygTe9c>0=_fXtX}n^KlLKb(~R9Z*)&hc z`h6YEr}+75>pgxw<URTkj6OgAcK1CURO{h)D~7XNGVfT+h=%(h1%pyWWOkG&I&v9F zNOivXt%oUy+<yjXh+K8UfCeYhfoTz$=r!%eK)Rz#ZluHsf^O_HBMB@i&=eguzK%Kr zxFwAl>79{}1>dmmdqe6YET#UEx>qyT<(6Ayoej77XP1ZO>7Hhl!pPq724>h<OjqH) z#k#*s=IBn`Hr_CvVIG^gjrh@Kr|vJ-Isi0@ky?8uonoS8fmE@MfC!^cQsjnfm7JvU zL4P!AF41Wuy_q%E{SZ@fOu-vc8%j~_B9DZ-rkrwavZOMdQtT6QN<fB8LN2Qoy*k)q z4Tr7u!>G5j8a8I~jzJvqE)Gx9nO<3R-R9pXSFCmwC8h~Gkm;{Dz&hO!OQnH@_E?!? z)8y0PACA#TM?gPW$sFs4P2GG087njWE$kYKI!0HjW_HbZ$Ap>*QsAY#v7fhxr!1!b z58{sMq1kaNzGXc1>(CeVYr*0Am?EunZmFmDKGfb0WH$k}>D^lKC}jl^MRN+3oO<q6 zJ-xQSE$v+wTixznF(>fpF&h&=MKK0D2Y%MZU|6yN)`MwO@l$dpSWr})Vu`y+4lWKM zZ$p=AYkzev3_}dFG4_^GiH-QCdceF$<)dNsPZa=LUP;K}ZpxFNar|xMU(uI|WM7Z= zHQuWQxrIZ~&o_cQ=@Ka+kUwJLqtCnU`r8VW)aTOL>bmL!si`{ZUzBIx!Y8~lIU5Rv z&?-m;iS=)_OS<Ju>x~ikx-dMh4plr~+q>XbYn||2pt8oeHMg^@vBG$iAmuRt3PN2z z$u`erqGo(2$QmupG|!)HfO@~vlV=8tw39}LgrlQw?Eqp@eLs1!_aVKq^Kx$8U3u4~ zxBU}S?3Y(vOq`08bk`U~4K{fDi!(m$2q@b%HLm^PX`h7f-*)^PJnQZ#b4;R9j(2{e z(6}5L!<NAn#u0(l#ckYc7`nWjs5|T><+iY{e$6DFWb~7r(UHVo)H<FW3)Nn&mvv#T z9Lf%PY*#+^D;rIlYNs(n_uT2HJ99oY!KG=)ZhDP_?mL~`TgBfB7`mx6wnxZ^mE)gz z!-Smhf1dGpWXUNE^2%a)y*<9;FflC>2YayHOX3eA95!yo{on4@<ZslxXHT+RZR+xy zsS^sR%^E!&Ca|;X|H=f$U={}aEJp<8RT0KV#l#A}T}W&RyL7uTtkhWW)4%pYL7XIE zSL{mxD{+X@@DVm(*xfURmbb{tM!K44seeY2XUKSc%=HVS5GdpJs*Sn%r0B%3msGyv zLo5<GCD%h-aISx7U%$o@!s2Rq_RBxMAZ%=S8uNJ3_-9f6%)~F}BI27T#s&e+xZwS{ zWmiio3LnBK^1#yzkFDs&1dEqCzLfLy=TZLAg&7bR)_D&dav@z7(d0~V33qhupISq; zr3Z#<+o_h^eb#FO<=_o9a+`tF=TUAO>72x3SN4e$FU)ZF@<KyBO1+YSrB$t`{%CiQ zjceTmxB4Y0ur;<^V3KwG+n<74J#MVoUddDmLcjS=AeZS#O<b-nWx~b~!t|TP(#N1u z(N@wd;fjTH>a&tHTcAlo#0C3&FNr9JnhOxxkkT-$X=;NV=OJQ=8MSq1C3!Y;G;}l1 z<*GMU(!ObD`lrj<aiv2$xx^(`UAv)?ZSizNO;FORs(W&b-(jbA6^~2+auf5%FXObV z-`g#wv=K5hvm1}J1kA@jsKk7Y!CYwgg&LHpJwj*Oj~MHOL5L9{20YeSH`UaY4OMHp z_Qn!b^q1i*qf%@v{aaIF%~iHAhBGo-k4)1Gqf%0eIhD?Wl0XRKq)p%M#e+^wsMU{F z=3SLn^_zBoHtrPla5J98QZroA8c6u0{#8gGFk&7&j<tTTo%Pby*y=dngBG0=^8W~k zBwvtVdsl8Yn=eV)ddhUevdJWftRQ6Tcw3?Oeb;VwpyvO80C%Rn;!%Mwr#EZpv=y>H z>ORy#h3(?yP7*O4!Xx_24dVW;)Bhs=tAe<c`R_Q2lvy7zo4-*GRqQ1A);vPEv|(u) z#&*p8Fm%x1n`17FoLo<cr2XAv^y#VA6`R<EshKIP4K<{JS4_=Z)i#c_+g<x?-+K0= zB!_*tGs}|89uqarCFE>xDO8_e?k`ub!?I6rALq}tS4rQ@a$&=Z;DYgITY`g;JS0C4 z$g%qCfVX1jWmN#sS&L~9#@Q+alPM81cNL7Ef;7CEaVlc62tu`WF-JODZS|S=04RHo zauASxY$OeMR<0SHPNJ?gBgQLj=92imE<cS;1l`~dUa5j_9Vu}az`B}*oAlni#C7Rs zM4nD2g<gi6FKO+jYDIe~jjqZZnzL)mwN#1ftYH~?P>;eO$2lx3(mPHY1Ir}Gmt;Vv zU&zi|0zJrcqTy&XswW~x-b<eYtR7gS+zL)aMV?QT$>R+ruxn71c}nQvXTCYo7#*&Y zix9fnVI>WxS0HgiisurxcM1K$*_;oCLv$nnjgoST+1Gf<U;4cK;{g5USQw9k%9>6q zmgy?i9Y%oO*IL_O=8AesW_~Do4AGKlL+7S!0xrZy?r7!<Bs&E+hD4}^@$@P<wDd#R zp~iqCp3kO0%>rDu`O5d=lU06HerZ^P5}c`w2@<-~AjFtu2392CHMq>gK5Qq*2hizx zssuqv1HtXKski~$iSw7I{wm}d*5;brd<uYCB0(>)Z5Jb{*)kRYjaM`UCc&;{tbnhZ zwpAF}mqn*XEW;*iQ`h=^O{l~v*v}xd6y^3t?<J-l^G%;B-H@tUt{OYJCXAv76=?Ox z3^hW58boly_|wWRVrfIW5}mXu`MCx`mR1coRO5i@O@Zb@kb`Sez+(ywR}QBs&4m2% zaJdM{ZV?MuD8CsJV~XKg%H0;vV8hE&NaW&z9GU<xFAje|f##O91JF6=uSpo?#!b_R zVle=KcTX2v*X|U%fv<n-l|*G$-l9pdU--LI=^v-8B-m${X>>uFrRnB@Nbm{mB4@Lb zPR|%WuQ~>0PM?_2ycM`2;r6dlj3=O|lSC-tvy)nfjwZot)?pgUo##&rW}vDi?9GiP z{L#SNMquRc6eNyN6#Al3-Er;9z|^0RK0b6xFuiqjh+3=fp9<vvid@~kWB2fI|1s#! z+cdKY8J=0(`L-*kQgnnKonJ>b==J|=@SziQEU<ofH33%)K4aSPuEw#r>9?>icO+7o zhNF8TUnL-9o};l66cHue$`@ZBkk1lDD**UshZ0l;I!ff9LTZJhnsbhIpu!`u3;kCS zwWANw!-f*0>xt&Vf?Rv1;2r_@QDG+2c?&y)hg{2Zdn-3DaUqoKMv>}92rZ70+rHaL zi0SKz(67{Cs1<!>yEk}wC#LL6glVZQ@v$80WWI!P0S^OG3Ty`!6bMudHYcj2YD;c( z1VR!yyqO<P67(!6oCw$FAv-jByqISbb*}qQaR8#rg0^*>v?4oawrHJcd}-9N3ZEed zp$O!lD;+8froW64+)EdYTshY%GLmrQ6*k^I^1z=VFIx6L|2`oYWpYv$r5KcKJDkWY zpZyZzkFq3oE<2FFD01;_(|2L>*kLNfq)r==p)}J~C_kKD=u~&vX1P3d(L35O@rg<j z#hgvE`UJbtavkGus*E%jJ2i@1R83vMNQ(X$pMDFJLe&InR<Xvu!+y9w?1qTQ>D-KC zcOW-}ABT?*L@c!%c#BML)k$}JYVIKxC67~yz(p}b)Frj|{2V3-scp&MHg{-gU|=_3 z#{B`?_y>9379^yqS5>Iv6-n%lCpSWd$jR~~FJj5|et;THncB7*S5jTksly9&$L84S z!?oZqO>9+3Sq_cb*)KgRW6`A2wH#;If=vwu%kfqlM<ZB}zU_@h8;%7LP>`6j3(Z~c znkPt551cB^?pyFk@#XL#m!gSRlwkhrT?=*oOxh)5Tc#QQmlcnL8DGsAoD$6`sRgeg zq5$LoiAX60N@tNY7>Bw-<RWO0G-@mu`2B%j5GnC8GL(9hIP}%gNc`3-e?lrqz#Skl ztj{o0qE1C^|1^TTd8z5%3OAuPQ;cdtu-(lc#gqa-XsE~Mu~|H##EL}5%WPU(e)(Ne zt8S*MC*ab_o~~I^k75s>aNmYwn%ebhS1I&M5VhO-<w(sc<tiYzs<~+t7*6n3WJtJe zddRk!U@@n`tIDGG|FHldNvblbzCi>T`A~6BkI+W(b;w$Bg>|m<9thd+;%bO0l{zu; zv<+o(DJIh=0xUq-wwG8`;2gy80tW4|2cSfy?C{{(52&n(?u&{jJ;I-j@WQPu)Soy| zc@QzF1RIBI(U!n2iuOd9L4_=6Z(`f;zDh2-tIkJ^g&ddD$A7GpF^4(?m4o0-6%y}I zDQV5=gC2QnEM<5Y;HTj(CJ+yQ1g(AK>gMdUWtbtWXt&EuM+`x%(4MbPn_#{+=nwzd z!ONG&VSV)W8na<0C}5vE5rC*7vId!%C^?~=)2FjhLDRz0c3Uk?@vBsRKHi?LS<OJ; z_$%63u`I2{xQ&}%)3>{%>yS`KC7f!eE@Y^M8ku3iswhNg>TRZavv#opa{<}o`Wd)1 z(;Oy;;;?;^biq;j5FnK&uDj-SGU)%twEJ{_N%y$l4X9byP9cRbVGkc>j^!euTp*Vc zT|^lf%^A4Xy4uYr`i14bd`{81nbGt1bp1(R{L@mvdf2JTlhKr;q$pNat<4YOs?n5} zU0>-X-&{QR;EN;aVN>4z{j|ROwaYUk>c}UP!-FN0L~K^2iMk2ui%~Ac)p2<7)GcoM zGiU(Hp0W5VJD$7K7P6tUo4G2v2}Fak+{ce~b0^5|&)~$Zk9j)fdq7Wl_W(MATdOIk z(br<~+#$G!)%v=gH8gPHQNE$PNS-9~<=S-Vd{hu63%N*gThl?)U8%uc_@+_jF^dq^ zr?jr^m&VZ5G0vF4)v2ZhDc$=`U322gM+O@;alagpQ!wI*b%jYf73-vv8dLyUD+-aG z8QG;&f@rzEM69*dfz2tpqe$si)hZWc;gOi?{u~iYl5yv+sSyG!ZXl1G$T<cG59Xq; z5EJmE;#W44AN}5*v2!{%;?83Uvtkz=2=<^MpRgcwa9!*sLl`a=Q*8`LqC_#v&iF4O z4*uHkD@>X4$vD0Y0;B8lmd5>eUIq!s^F68678qaf<!I01Kc^S%0%<;yX`l=*2touG z*Y9#@`885~_;=!#Wur7fqllmq9AXkOjXqtWNm1v;-nB+lvqCk#D1OI_81%}G+KO_9 z-jeVnSwUH+u+51Wihn{e@1*sXX*}bkusmedM{oET40|kL=$i@AQQM9i9D9*nsk1%_ z>xAUC2Awq^ZSuLPh#o_XG*q4H_7#|Xj4VqEjHKq2c(z)b9X#Py#IdL`@BO$m7`v#h zNnn?YtL18nPEkl{SLjG?+`O);w}5Ip(XmLJo-DgSKh@1>y-mKLI>&_0#xt@IeUHZX zNXqFo|9bUz6WwJa2<8=n){}k4($?$gyRd`n)v}A|<-xXib747GXd`FzkL2kDJ|DFQ z@*A`s?MUEv+y3<(N%@L&m)6Z_xYUssW+6s>?0`~j(1YSCS$i4XA#dH0FN%<nuhZO| zq+UgE$>C6P;wTCFj<`~JxGcs<QJoTv^DPdo6Q3B4x2CKdudWUWmvD@!6v$)4m83Pp z+o`uAD)&TBqUNgTB?W!!5NbDLo!s*;xp*YEb>2bwDMe4tylZ;74TOnALbkPqsZFbL zYUT2p&A+h}XuX{5f<G_zo@uAyctfJXl4Y=m3fwUmhVpX}7`GEYfma!(>L-Ys4l%DI z5s+cXMRw6;0WAqf6$b_)DNaHqnV)nAreo4Fpp5IJ5u1y#j)tgd8me(>wC|x!RYHw; zBBo^@0}W>wIAKK1MRsyLA!WHBqR2NTxp*I82;>ogW7Enr&#l50liDgO(4GBIcq7^D ztHaVx)w+&mTl{z43;vI^<K9D@1S+|!`=8NYv9rZ=Jy-+Fp7xK?dLgp-+mos0_;4V_ zL<}=DskDWsgpWtpD{0$q=L%@d7gjg64Au~vkE-@R5`V}j_FeiPYFnVli*g7GYZDdd z8Gd5es!bp<D8LHXK}!tkqt)bSoA`ozfGRD?AUxB~jb8y1oR82LP`GzEVX}TT^Mds> z3oCF}%0e8^UGCL>Tvgj}v`nFm%36c7IoJh(!NJE~zwkAM$~;1h5GwsD#%(Bdo9jsh zB9sv-WQ(9l(6_4Z`A&LqopBWT0}U0dPD{qoF=%j%cZMW~o=_~{))r<L%i3*#$8%hh zEiNlf-OQz(OFxHy8jZe)gNB`akFdhST}TNJAYg!h4s{X6U~Z%xTzZu!NJh_ZOE75# z!-N|gw_nGl-4Dv`U=7UZp<uu^=B1ni%ihFYEgdK<3gDt!(9P3>_ks-wb2@`r$jUXc z75tUrqYTY{*ZjgKwzNy7V~vma%^Cbeg3Q6R6sRS+e@lAADG6tZsPBuZLkrm=&rC!U z4lh9knOIe%5?%4~p=<cIK)E*MfTB<aH0qs##$s;x&c-oOe<~Z}&hTmC09H~}klRB1 z7Q$OIp#rN<sqWs==fzs`NG`U|$LdON;9+BNH*CWr&I=MSVSL1A`3AJ@qTURE1H#3b z*j#2pOA^5k@EAR@!7T77M#;V)DZ$9|!+f(rtcbbPAG0kM7TJGqaaq;!`%Nc87<P#0 zZo&8M`d*$p%Qob`5wX{22&m2P+760_eC=SyT&`60<Z^7s!7(>?s$rUb1}G)lr_~Z9 zbDqqcqP?-??I)6McIs7i-1Y9DHQrjQjOonJ=s{zhnC)0>=3}meGK?b`A#vYT>Lh_@ zIZp~ql_*w-n`gs|e?Oa71jim55{;ZJ-Waqwk-c^FduCfTT}s*Cyg7&AcN1!iEH)|J z>l{!F1k_P>lk_`dS@sQ@|Ac~8L+Y=vHW&?P&vw~hz>{AXzh0!HScyyW`d<JqK+wNo za40@I*4^jztX<^1$#gg-l^f0b1C}+B_bJcUK!B!L4cvZ$`C6?9=3pWr^MVY~D$FYF zv#Jn00gfR7Lh6%hO4VL$nW{CF6J;<STsdmkvc9b%k)2*Fpv#d)7Nd@d5VS@>dxmEU z!wY;65~{5rgU>M*d2Lji)KX<LmgX1+LR<8lsKZENqaM7f;-gQ;tsqtWa|{ov$f^nH z2{+<b5OM31auAs<bdqe{MhleZK(RB=fYRkTDn<#XsjAa2H57UC5YO^+(T<#e*1agi z{9awsrnD&SIjIhZ!ZHI(WQuyL!mcBKX3&wFcgk{_afQnMBGqfN34J#sLlGX5Dn}7Y z%}KJ_r;7dh1T>62N-AB#3G>py`ty|>BLIC88s??jvwWaQ2DzBj>M{Vt__jmAa-ykQ zD3J-?&n?KdLAaBlTZRuwB7jN>ihPVA?(|G@%trv}%jtM(F%k%IN7Tvu+`-9Sa~Dcy zfkc8XJ|6QbUDMLipBvTDSv`_{;uEiM9i3<^dW5go2S9Vjk3Rm?ek9(=r}%92y2&SX z`3XTJSLsM%98huI-NL={JP5tDO3S^XK5g`~V6k|ZH2_<$K!1OvKgG&$pdf3bo)kJG zyPB{%=%dXs(;-*)1)#c%cK&vH-X<yz^15=~{Gu~|lv|}*5-*r2Zg;3p#Og~hmCpe# zI>D!|N-}(`u-X$Qm#qmrI64(3HqP`_aYsU<PTao;T1x<Yj0hXkAC6=|s4o|ni?10w zI!7~Pby_vmv~kyWmZ=Vwvp}ky#a*Vj63;S*i6J4Q6Nn0T+repdejtIiWolnG`^WC$ zm;>-FXyRM_xX5z<AO&zFahk+jyep4&>sQ=eonGJREB{|Yv47@5&W$W7U=hR@)k`cW zK&ByYK4Z3Wic_l$n2E`#Bdv|T&4uvS%A5DfA2fn1w_s-*mp9N}xyy(ZmvOh)vh<L7 ze}^c1S)!+>f8vy&+Y&*iY^<5I3`vsypK1cz>dP^&so{1(c=NDU8V$m;SoW!xNeuM! zMbFlILcf1rW#h#*RZWsWmT)myX1k%<-abFSD0q`+f>cI0f{<=j#-w<X0cNwv-n-P? zmF^X$Xq1LT9(Q0z(Dtao<e|2+U{VyI?dv<TL4Sy;9VxU8Ofx&00Lp<GqtzX^++kfe zn-d!`i`;eI5O*rmZZHR^;jUn71y{fNGtPUP=SXo54)VmRfND6Yn1R}0BI>EQM4i}> zZrf65`(8GNC$x!HAr`-JMm5EAs!!=LvoxJ~>I6kjXa;e{IZe0={70Woy6AoCrRLyt z_t%Rj(D+?oge}zYb+5i;r2$UZ@b8vO@bZ3FSY3VXR=@v!lv(BPekbB6bIK*fTl-;n ze+FB~{kj->=sM(f;hOIls?bBDZhAoMo6gBl*Tc<vz~^Kw#|vm67IWn-jKQ_(5t5xy ze7c;dHC7UD^LrafO(x~p6bi{tT-nAqCKn#jtdFyc@t);~8k!V=n^+$Z3(^H!)n7{n z73*@Llch2vAPbp)KMrRhmRj7woWHDW2>Q~p;2<63oEDHL{hyq3h3PztiYQ}v9-_e9 zd8n(Ppww>LbmH?K>wrDmZ2?I}Vj<^vVHO?v3X3-0KZo?{P7iFK1K+^fPX;;bFh>?W z6hMr5R-`pZe`5YA9IMisD)}Z(u5*8il~6>vGXsVy@!eduj^h$4`>(C6ilnB`81o?7 zN~YH)W=T9qzn}`%lMPQnC8f&$bV-7?T&wbtrj*2cE^k-|#nn!32Mr3h$RqroWonOn zY2$qt>+uuPi$SAM2p(+5Tj;ZKH}`9NUhgU#LW-L2O>@!#&Ywwm_BO_Hee14!?t-qy z4f{4D^HkrfU&^eF&1qHgtVX(9ST{Mvz;m+Z*m&)m&@!qCYG9sfI5%osny1hPJ8*2y zklW^LV;Fo{R8h(iM1E5;l$CHADK)0sQH9l(p39bO7;TMW-CI}xbE?>+=9|0GE{C?` z%B*peD<#vOQm=b2hw<!hVYo`9h>2-4n)d0EZ`Dv=&hh?`3@*2Te5d-qTbWxtM>hvc zpO)uqx4l0_EJbIv`Z>()rz~^Fir=b3TD>jJx(lsWiFERf(%ln;9guSG2%CAi$mD{+ zbVAeeZSVl2@O1DLiJ>W9;n!C@K?v)S0;vYw->zx)^^nC(tM1_LY*sfPiis71k__Fk z_a46nAcYdc^5}T4{JF5*79OLZ>UoC7t9>~tM@or21J1?V67+pZ3sj&6XRhD)2Ss6` zJy~1k+pnxRRgx<FlyhOq=o1K=@)j|Dr7KvL1rO%oXxh{);7;$$d(~bsdstBsNVqH+ z2Yxcz^vAf6umV1!TJf_SN9mBSzVm<B!j02b73uir#`rUtpC_p<vpEch^wI@)47r^# zspH=_N;|I^MZyYR`!cyYZ5DQloyBY>6UcDZoM^0N^t<frd>dWQQX+?R@ux>%To*`| zD+$(6viVR#gsTjq$UJDI$g$X)@>7w5Nq})#o|TCv#tx8<O#|gc9Fa=br6XX(#W0N- z*h4~Y`^kZd1%pkftTz`&NoiLPzH*e{oWX#eGNu(Ed|^nRi9HL5*CykbON5a1jyZ|m zm?;b)<;oNBR9ujhix^734~VW<EXf!L&zgroX=T(6{kTz@8d~6YskpEgTATL4d87;3 zuDL^i1#}3PBsKAEo9=58>rfCrlRlhx2tufibouC<d{ayzF;6&Zj}AyC2LhmVg!_{& zAKvYSVkw4H2<DKBDH5EcQHLZRG|n18C<vcHUxGxIs%?>C%4>OP?BA7GR)odsTS}bJ zBNQ)IQa%?IzwLnM3bX^EFnNF{RzQb0mtfyMXy@SPN}bA`<!D}$H&wz|W`H|(gQ6SV zTa;1@L!nwV34;n(FdJK@y2VZ+i-Jbf0Ao(r=?5cOb>w8_t`Sej+k2=`-`fwpR(H4v zo7vpJ$VwI8pt_EUT8Bi7pjZ_ViDd%<JfjLXX4eEEZ^>-GWF4My<*FiXLDLua{*n-p z4k}O7s|S3BO+gey<1&(yMQS4jrU0Ry6${lM+nCRyB>)+~#jtK#S*?&7DSf3WWyj{O zBTB}@ZV$KOD502c*fK3wR99w}isqG|%z`%L=??drILiTQDb=5|m3%s_XaqiU#fSX| zScv`Q+Jw01Y>uRT%n<QUWd!%-{H9fkV1e-N`g#U`I#{{sIW&T8xs5$ehu3DF0o40u zyD5HLJ1*oU)4fbM>62J?3*Q@10JE75xgxAGK8IG;Qs@Q&4eFPZC=P+7Mpjqjyp`BJ z0Qs1&snd#5{#~N??0~jqgiGffqFa2{E0L@m<<Fu)0EU{kokGzp&<TJK=P-Nq_4^t{ z2or`-<*!<aakcVv#!fSoEXxH~IHbJqIn|!mFV@Pd1}xi?Uw?05X1!h7EfZq20$ZG1 zlRi`@A-Y=pzhQ#kFG=zlvJAy5ebqtC^48<^a!(p57|U%sqBA^tL9O`BvlTxaIfn>= z71?r;s5}&+7@4&!e^JV~@@zr*dE6y)s6L9Sl^oN&ug=w9XY4+Tsw*7qh~n-cGspF^ z6Z2YtK>(|$?ffn%_t5YGGqVOEZX~fbPvnqU9Y}=SDm+h=<WK<u8vQXsPel1;jDFx! z7^P^bhFc`&WUm!t6I-2buMAfWDE`1BN)ztgmKeVcOk)Vn9sczcLD(mlO=P0F+BPt< zyd8)Yj#3!79Cv{XNqC%@&AEEeco)d!A~Q*0b{Q`b(Xd_{*_igSL&IYl7F>Jw8)ze^ zNabhQjrG<3*{{-jSB}VAyb6Vm;*xzjz%Wm5XlF82Z(FJmAh0=X`-#lPB}*wf5@zS+ zMrK6Wf@Z*8f7>j`%P)G4eU;)c=Y?!2-1lPSa)2@1L0x1E<WhE_j}yWhlfovE!X5I= z!$OLbCC&vXF_}?tB@vrE2ov^OE;(VGSHgMx!WNYC;my;G!a9m?_%PUDk$G?>B>X^x z8p?qY4s_$Kp^15R;V6yXu*<x?zYMTs>;G*g052(1R$}a$<p>Ua;3k(y1@iWd^?TBH zDViG5>poh7;Tl9C#T5cAdC>-3P!-)URY>kWY8=)A-^G`I@{a_@;Y52~4&4#xm<%Pa z=wsRxs0u7b&2~ZvC&+Zvv29<!RGBA{h(6*DE-p0HJtxh+9Z)zN56!2lRCx$Dh~UwG zY#HdQnwCd(7uj}R$wShatB=#%)21cqJEriPB1#?1FEedFX$%Rr9c;$`?&S~&As?!f zq^iKyoCYj$qG*;qjE9~NT^N(weaN3$8Wzx=Ac5g0Vp+?KLHp{k83vZLm=}#9tEkIF zVP_HF)N*E2a{|F);|b9{l(kw&h#`yje86*x63|l4J>bpuMLy)v#4i0es6*l)bA`%- z+|0LmhIB*yUv_Ex|HXboyq=kKBk$bvYq|J?_BDUP>#bc>sX0vh$P(wNg61=;>@;@4 zwVioWq%VdO2XatV17+`y8ddShGbkO=JUd1~)=9Q+Wzjyv`YCyf2-c*@7dNG^E`Jx- z6uJI_HqV?CC?3|ttM2N0SJ1N=yRpM$7wu3mPfOKr7yOW&0K~975URL0eIU|~Ru)I+ ztteLnf@jVctn2Edi%*<Hfu~i+6Q64~xt`UbP#Hw$yqZfp?r_?MSlBQtOCorU)Dx~s z-G~;*XemH;3-Z-4Zw*>vEnU9%jA_@X=Kd&*#V@!vXy(`u9Ae<<&jeW<q7oTi5>e|% zLLmNph)@HFksHkRRpmRT@%H1n$=$EB$HmEXYv!d#e)j;t$t>MAsqy|*F(nm?lH(nP z$Xr~zpso3_AVwUtH+#|@lc|fkCVe}cA8rwNj<Qyjew@|I)9ZGYrFh}V#p3%*fpfbc zrrv>(<mAruP07L1;v<38j6GnB8(+TL$S)8BAC*41+Jjq@`;({noJI7;!TgUSYAs$Z zagd1;qG<z$7cnWBej=^Hy9@!tUJih{O?H!iM5tn4gYX2jQp+6Nuna6|%eKBkwh`k3 zzvmN+;Zo@Gdd+d6GzdoE>Fi+p%(@o{-(ZC02mL4)`#js7owb*Jl+)|wPv_4Lc3fJd zeE}h4u8N^2ey$u$bZXjyqE<H4IwoDYL!%!B2S^)}Z%$oHZoXK}2>JeWNb+f}uLx;0 zJ_fExFO>7C#Wlz_(kIZ1t~+YQl;!w?b!*rT!v4tkM)J`dPW?P~x#)O*)t#V%6I%)6 zLac0d<{)wxpD+dw#$w>fMRCg@-@x9{anMTRm&tyW-#Wu7s#d6ID;TZkVyi~KlVaLU zKxs#L@7y}4t9zE}7908ydPDlOhCV`GQyU`w<mZjcY6SlVFyVooW~l(cBJ5L*B8<jz z>9v1+i=5~>FX~aR3n+PiXI@Pk)7h!ykQ~A5;=@?g;;ou!1wyn#fy?EDor@(%kmPq& z%ko9@TMC&0QYm(BuTw!`I(56->Cc)~wcXw9V<5$1^mhUzC-ry;6JfzJG&sf5RzvLE z=~S>{s1aAAYSt}!Jztp=g`8!xQLGyi5<o;ij7hD)TouTSy@Z)7_1NOHW6C)p{k>@2 zAe6p4I@!&RS>AAF#;Prdv9`pRoGggC)+>^!lD7u5VnO@Wl9w6t2Z)6S=`Lm2Hbto1 zMvEGDJYJ$W#^T9EOxw$^Y)<C^{bwiVSgnoxhej;T2c_6LGZKa-7u1$<TBOZvvBEUP z!k{%`!7tUxx+&$~-(I*qb)1=NNeDPg1}3gi!CS$`Km;Gld7N=AgiL|PuXviR+ryC4 z#%d2?yDUI4?KG&IST`9C=Q2=6H7*zWa59E44K#J&s7~E?b^BfBLZ04`W=?Z~L+JSU z)i)OL^T8ew_*u>#m(faInNIyfA`chPC`l(SNvF!BKfIElogK=G(ecuvI;#HF#a+%H zzAegBZYr|J*L%5Gnf93RHX@+J!>^ii0YLN&ZwbLoKmvjDc8cHJVb-^ou(!2^=!$v* z%rTS}<(F`(d2i<+9#<}|aIsoBD>*6Ue+cx|P^%fEDm7x8@)}XA)emFCahI_>cgdI0 zrgC11Zpv>Q+?OrEm)_W@inTzeyoO{At}#8x`eziF6tDkMt%xInQOcNY-e?h3bdy@T zV@*)puQ?K^>nZ2a?4YsAi#3IcCb%8t8<ZJ`w_oW3NQcA8#eROzA|}7Fct%IVmS0Zi zFYsx#O<L#`is9n2g7e}SoO9Oy#R72e3`(?07M}reQfW+Em*%G4dDagZO?6@y1j?10 z^v=?WeHR0N2sItHbpTst3kFpg-4Ll;ti8oVQWe{rLejOgdPTN|R{<{8^-ol)AOi*O zGrFTCF;r!cR;<UD)gf~a3p73Xy2(}QMyP758*9p$4U2O*inmh(sq)L;ib>1dTNDHX zE`EBgla$qo-wZiK0{Rc<(+(wM5ra${%`4OlgqNj`W%2dw!qp)TPxt<h9e~eE=+#jw z=!-uyZb`C=ixPrh=>~n223M7?GU~QGbN*xmidtec2w9?p@MV>Ln?i=0Brrxosb?cI zj)hmnDwTwyDbWO~lftQJOVX?pRIn<NUEX!zPCNA|V;)YNag&W(AoehwN!3u^-TvSS zgk^o}2iH{@l=lJ2(_-%#ZO`#ExBk<}Izd;<*j_@k{t0D=)N|Ht5KkW86juk2V=rw$ z#M59e8-V1gZ@M>iu_;*>r4F@5KnG3E<ta~7#`BWpQS4}eF!An<cfC`Vs_#5@@bj^1 z3gZvi*e9^U1^>_jeq)x9?8xT>?HK>NhkttnbOp>l>AGS9NA;z$8{lbt%Ai?VyVXW% zzCY~Fk6Ruuv9;fR$Oz}ylrUa&;nhWxMWYCXA6~HAzZ_;=zW2i);@i?)^_J^pg;_LW zyt{mGs@@6!hmXFw=xD63j*pH{3EQ?-H7t^2akt5~EreX&ajAXGj1(5R^b-~1G;I;3 zk@3xV<MJ`ahA)9p&{O@0ySwC@x2nl{{hSS$c+-1e^>uj;SGHE7DgX$2e2Y1e&KeHY zNnKelG-MN5l;#CS=>57k3KObY(^XlVi6gYm=g<kK#Sf7LRvo}MDRABnDJO2Puq}Q= zaN(-tFx(a^gcQ^;CpEJ6WMSCl<6q@h+*Y?78mhQ4=}!uizyuA1V0#&MkKWU*Fx@DQ zcZ&p6791sad;`}nh;*_{GZH-mu9soJWio|rzT_EIM>J%7rVK^qUGp;Xrk(FQkA=;< zyxbF(WT_2OA%ih%qFgW3G@+6Ui<%~wQIOOoEHI?j>pS!4Nddy_YYr1oMF|UfQb`B^ zw4kw+G<IiwvO;{bMrwTQ-)C0-*3ye*{pagrx9PFXRZX<le{Now+Vj+8At~k5{?p&p z|DTyo68#|r{W#P0LW(d`cd%nBOY6jjRD|vGUsMPYrIn`dXVwzfk0>nuya0-O*_z(f zY-XD$lKg|zPVK6gm#$96vGr;F!Z}&91>!#363!LZi`t0WIx!V$E*fXQ$9}<v+)Iai zlD0~RY&$0l+LycobrbM$q0O={o{F__-3=>lw-d}n^L}1LQ8A|UNx^H&@gC8(tVlY8 zGUANZB^0^Yg$a=2uMo@6h(iSlNn6AMz`>;eOAqXZl08I7lw-YrX3rW#*=-8BGX*K^ zZbGzyDH93YLYTj|RHw+;9nXvus>NFod4wT#6C7Bh`B9_{<XKV)9eO@t^Ig%@e%Y;8 z6W&UfZ4m43yVqn}d;98FYfA^ydxO)#x0|fUeD!;4Z*gSf*$Q{IoBFq3T>h@&+Y6|A zC}#&ceeDj8+ccK%+J2VZ_3(}N#?rgLgA&BdYZo2fZW`r$grn0XTkDznJMzE!r@#BV zYp+W)i;9N0NmqlaXF;^PO{b?EtafVN8RoQ7N?sAN>w-rY%VF_gyZJLLILfwi2t86n z2CJAhD~Recs)lF1p*otdSnRLY=9~n&!C%^?)m;#^*$rd?nq($meMz|EgVwS?nT-*^ z08v`(FFMtwX=%UjyS<(}I&7~7)9C^rT4c_}-h8FJur(PBLa*D+D^-P2i2?Um`}2^N z=F7@x(3Q&FVtX9@AzuI=)hHsyU8&^oqL&&QBDxxZk$;G&mA#55+|XnA{D(s}06(ak zN}J)?Ybcbux*%D6kxsYEs7)ouS-A3oC?$Gd#n>{%Lq@Vvu<R^KB!!TgE{WgceuYP( zfDr1GqJSdhuulu~*|XA^Yp0K#CvHV`?iQDBdUXEFxniAny=${~|HPF1e6hPU#xv$O z0THWp1pt5;PlrSR>rbwnW!B&4#yb~n)S<I|*WMR@_(7Gv`;HemO5S~+<T_eiKcs8h z2f-q>aS-T3i1Bf{b~Jd%gy*za2QuS*L@0X)bDPLk;$q<KP2_Aubu|S57fG6?-kg(K zKobMs1s;aX+|)CSySpr|s?!Fbb3y_cmI!>n79^$zGsQ$Cr3_lnnr!TaJz_O!oLi~` z;zK4ByHMb(olMb~CNr`viB&!ITq?%Ya?L{A2+IiLrDV81I}8?76j4H0%Nb%z;pc*h zqRl?;L_OVS)Y$6UW`2Db@IqPbx0dSfW!n&D7uER^F}7BwlR57JbT@5EM<I?lC?{x! z<6_dLz4vE|cQH72gD@rhK?(B$IY(~!PRs%*F<+uZ(F8&`CC{>?TJ<w%Py@|TWX;jQ zwPNM5bj-SCv<c?*C&``j%@2P`^IN-t^7T`<&~{IM7-$OvsP_tqYn>{y4q>{EifRaF zfymG}d=OCtGOv?l&6Xf+l5i$)@v$SdMO+4<qa=eWw{VY=jNt4+*W_c=s&0^B0XPN0 z^E5=P>IM5U87MqZtE*H6Vo#=-RTtNb6H3Z}Ev=kg37mvKC6Vem8=2wHvj<WL$bs{y zlS_m0M+|C^X>1+#=rXV?J%%_m1y>`F^UJAS$WFAHyGknycQDstm&G9_ST7)Y6J{(T z+YRELtS1Twg^7T4`yivpAR<?ZAYz`Y58yFA>I)wr;dRCmGL-^A_9BzSu8Gm>6O!;- z!56=c)wX?h%`6sYRm<@e-03C(TyirOy7(&75F|M*mUtx+<<?r4UZYmd$r0F53LJm# zD48}%P6R*@ZpZ;2z|6J5fbckvL^#5-xaTF(f>ZNhl%^`j+~TbD_#&H393?}#GJV&k z*~q$N%!Vc{G@F5doBX3v(!2a$T}l)g@XMEp6YJ0AOH*HpiAIA^=Z%Hc<yMxK(De{& ziLhz^ugPlIs5oy|r%h{P=s(3#OS*BMub@QkM2b7nVl&98t+0VYy64uuI?9x4P{s3B z+`dzeATWWgL?5VP3J0K4`D`Vp1x|x=VdZw}h}$vo|NBVZIwe|sB3Gn3Cx(cX2udfr zJ`LS+?|N}dJ7f_Ovt~}Jq9DTE=@{BjM+{x69_xL;HDYGj)zvPY?_m9alACapn<g6I z215W-8teNXb~@S(?Pf}GbRh<rJvZ;gWIb>>NT2P>%N8%~Em&?~9;7wbiFCGSPjGv7 zG#CH7!5!7kG0^^#$G9^+bd5O>1q>aSqY-*g5+7OLyYNfPIEq5YG|2oJnysmb*-R{z zH`^bIdCghF)INnAQ+Mr$hjAro3)Jt-#+f;KJL-vy7$-Gut7pKqq!7bt{q0yDT8$-4 zWH4BIm52aipeou#)x&GE%`@D<K}~w#hJq-cO340s#IFt#(p}jWE{0b6>dOd#4fceK zCvdsun8Z>p&;<N7+Q2Kgsws&WBNR`boFJ+w!j<s|Vt&9@#}e}!c#)tCC{fcX5xqJE zO={&O6h_VRu<G1#U@pY+9x}U1GlqBYqp^nxrDHrPD<fYlr80^?b6I)Qv=hakN|^S_ zXd!(T#jLv|5v`Q>*QQ!S?b`BezO%gFXAC-@OOE@R%%N(!zn<q%j$7AY9!7j{#Cho1 z;A7rSSUXY+pib1XmCMmII&GPmFn!z1o@T+Wh0pA{PL{>mYb&QCZW>q@3FrA4LA=)q zeSFTc3m!?xPqiJ^|6EMAo+F6#wZ8_&8($<NDV#__g))nI=-4cW0$5g9q4Z1GEx9{3 z{2}*((p2@R&A}qqO*abuq2tSwMH7ft8|SoK@@kX%_z)<vqX3$wgOpp4o_XG82&~ab zS`o{0Tx9zD`w#{miN)B3Q3O$YQBC~fXvMr3qBR6D7czBqyllRjMm4i+bKq!h)7~H3 zacJg;ZU1^gfAgn3*1Yi8DhC=e#)y1E0?uXT%q*Qm*N{g#h>ujG6UtENBpvroC6)+i zuJL0W`mfr75CTVw>l*JB;r!!7gmgb7c9{|J7R{1tURoC|J43Ian{24dls>*dbBUG! z0pG;3kf*flSKXp_|JY5kyE9Rv9GroZyfitG_XW{Vs>lfaFW%A(sS+kx9+RV2fp{RS zwt~8a%lrcmRM+LEUgODRn`RZZsq-IK*@Rh{jL^LU9iNX7Qb8IxGU@^**sn%j%v3Tz ze4_u$t}4+KUvngrm6Z5jw&c68$H1(ku$t+7?X1tWBxD*2LROQjWW*^k7aSp*y+)%f zhbpslI(ZZ!ib!*2NZ4sl9w@Fj21nh(L)2p~0oK?t4FV0m_#put3yG<NPieIH)6{Ik zVz5sOY!~6(`6Lz>ddxQ6y3hz$J`vx?z^&ZzRG-3?qC6r<!389|qut1IP=`u)TTWqM zjt(!tfm%wIl8>RsV?z=rXGm1Mh>Z+9L=Kasg*@scyN43s=#xVAgkP0F6AfV>omh+A zKVVZ||L8Fc{qD$5pNQtJc>GA0#_yNt$<u-)Y=6c$PTuASh{z>gsnjqb3ZQY~*v*4d zz9>xyb_xVhwTDL%2Gp9KNc=D0bIst<0|GdtGO`b{;#SOm{Rd;{b_*1>)|m$vrRb*y zw?~JB@EZjyQNW|m%i=_^?jeDORMHa0y!4^8Gl{=Jge&+bya6Q4I$|+F!s}NJ@Q+H8 z>VAhNd^xKuV&gL?J99Y75>=TtrhWjGJq>8{WhkH;4C8xId>I`&FvW??S~4>OEb^qd zx}Zg#=plGG)uE9yf+m2lg|i}^`!|vJFjl3eTS~(eDu0|sWB#!`l_|~xFPE(>95H(g zvMhHRS1>J>s{!UX<<$C60i=omq@&2M5SZi4gACxm+(0|7xaI}V7{`~PZYTgeg>%-# zU@d5sDpmr#E-(ftn7+X8vL*$;jS^*w1S@3(DWs$3Dk!DDk#p_0s39uUDgz_z&&TqS zDvfD<PGISd7B%}i#B`x9*gBd;$nwY~<!s0kjPALlEHKs^dZ_l}R@xGpOMGwOcpa0p zq_iFZMf6*~&Ze9zeWS^7F5XICyeRM%@9Q0~yq^T>yupLohiA<T+ns`f&-9c~S`opA zO@uBel}s}UsO1!dZc67m{3+x^Z(m(d^AFfT3DifK9Q;!SF)}q=hsAI_P7_65L>s#d z5GI2BNHLmB`t<EJLnR7u-SU)I7DDbnzkV#xpRp+|48f8{5FN#<2O*DWAgd`Lk}Ci| zHjqDQ=r8%qT(2#j^JEZu#mDzAKpb2pk0QT@oDIHYHc5kbx#SczKan|1REXjnmv4~m z>b4sZdNBh-cH)MAOEBp_o|^UEnh;T&h#PX6;lcO!p`xMJ>eL-w<4^-afld^PGTY(( zAnFLYDgCQh?`5<|UG&^T5G_J?cq%>%9$Q1S@X$w-X@leBjpkixZr+uriU)kiS3+Z1 z&DBN;l0mt8p8!AuyN%_D&E6E{y0D%HjBll1S4~j_aDtp#1Pnl-aV*t;gqm_LsQnIK zd8r%AoX)?o2NTcfn#Q5mua|92;cXj=Lv9ggZcawQdbbA%DJQeF;AiRGv`5*-U2TnL z&8K4wjsB&U+8wpp$g7N-y9#Zz_{-*@;|<&(h+Rt8(?7#!KtY4IAYXZoMruQsD)=+M zgjaDj0|zx9JWu(zS;s{Z2-=Vxse{7T5*jsCP)Kc{EpaMqwfmw~)7j3EwnhKFY6zT4 zjdZ>EI#k-#9n;}!6GrN+8U8`kd&>$N&h0UP+AWVuQL8;X$3XEy=hb-AiIcNmswZVs zo0Wr?qwfOn;k%}X&`Tko2H;z{;yQB5E!~$=%gv~sQ|d%+es!8613YIYr}}Qv%!$YS z785zFufeGV&}f9>wEH}?6A)WyzFLkj)fM>4_%pR0jL;}-;JO8Em8$WM-UZH#g!O#% zlV5O739-$>0-74HlrybXe43#HRL?#%63dYT){)*C>I6_1con6bo?0hFv<ybE@+%8C z^68FR`uYXI#97k#8~<9rZpZ?$zh4UApX;?GPGyV=P1|TpirL0uo)kGi9j4erHf1}q z`t9%@lOF_X2jQVMtF<R~O}g4rq(9kG^G`lbqF{hG6(Iyn;X?q}J_?lEjAm&b7v1ZG zx8OIn+^}?__~HwYfTGeTL?no+K2V4wEZMpi>D}Ipw=N3isymq8<aBa5$S(FJf$?<O zRv4!sr77`{a56Gt;z2Z|27*Zv#QS(?=$C-!j9}XsH)y5|B;hHJVXv;I7@y$De(TTM zvTJ2ZWn)v#%qN|<xAa&7Sg$1pt(kikd2>T&o64<&**2yfPj^OckV0Lv1l>xaPrQ29 zfR8299e{a5<KDU~vv_f)iFxs30_j&MKSaG<?s;M7PM0$2;R%o!%B;5Z61g1~l6#6> zagq8|D_`ZdaM8af2UX&!K(cs>IOATO^lG;lOiB`*M~y*6vcol~;barR!+*q3bW|eQ zwMgDFbFLx5ksrs9Lpd5{-!!ZVKpq1^ctTqh$&xHU_7-c7H!ku1shfJsM@x+4_{f`G zlAM8}>}ZbRJokU(5tf!3zEU989O2B{-*$jEc+1m-PQ>a#BA(V}`|-^iDJBsAlvyw% zMO+?cA_?!Y3}3U4_u;FliTzAad`*m2MM}lusTQT*Fvp|(VU%=6zHDKSvS_uL@q5(X zh$f{V&YeI>o<q=PdXo^z2(+3LSerF1ZsjGcWG`u-ipmW{YOBsh{@GU{kL8KR6PCOB z{T=#ky0@1Ff_60?-=;rwmao!URmf@gSm()1FgeVi9-*w6D8?jjrl~y!2Q*G)tZwcv zPNQ#}?d!+=e5{uI1r_9)+<5VL9bZ@BIP9p!*WnHN7B|mVmjoV!ic+Vg*kHBFd^4de zH-A4=6_n<N-Uok_-_)($0!6`Q<Sq9`XVhEL&-j~D{#K*4^7dzkqHC_G36@Z(cUS-V zN3FbrJ@&;yO(jm5GI|}*iE{%Lh1&x?HuM_$@;zdh!Jb2-3Wx`IkVW={ZF=@OxzX$% z$7|fA_OHL#>}6?etcpCZPeO_e{6fnsLmy}@X9oAYQiBxs6!7Jg#t*!bO-a5apOApE z)VaT$AhsLHw$q|UZ7Y)GVLLm}U0j|1PM`ZxNR46QQJ^a2RgEU&Z>3jf=(%qUCv{%a zmMQ^VxF_6%G(|sFBW)IX7M#Zn89}ib0w299Sb@29M5)#WfF!KQ6qKr90n!SK?3u&g zJq{fU#Z%+;XA<8Crv}1Z{KLfvVwBDH3B?NT*_|<eP{sny&ZwQ<cT=j5rwxebHm3-V z5pqsTRVawUHjd`6rww{f<puNv*9_vJ7?YhPM4?IOg*+OYZPUz5EI6Z_hXK={rnv^} zqw}hz<WmF5!OjxrnAw;RyFj4pBC=}TyeS?rV%#n(y1lc_r4tn?;gwxo0W0u&hT87{ zn=ITUQOY9GO#{{vp?4t**oCUAX}!>zouSwQhZmzB=tdXrj=(5(hlFL0DVKE;PQK63 z-2qclz841*Bmze36A+`;yk%dM-0)*E7@cf0%Db}PcIxao!^K70O_yxVNJ6zEj7Hq? zX4y678^&8dip-5-J|;Zq8pk*hp7FVq5&?u<-d9>CQvnvC1~*y#cGYVoK(tQLx`i5E zf(<!8kA_$qAH#%gM3l<Dvva9=*c40&4lQhKS%C_e>z1C>q)4kqPUtgrDX4}}8oAyI zK@pIWkL~)lkXW-Tui<<uDw-C<C`HD#`6Qa30|Wt1IyN7j68~7pfzq^KctvnBbI(YU zBAF=|bPNT+ucT(yV5yocq$!kWCWE~)xRosq$+*?P91a+Mi%YAbrjRX(Ajqy{34@6H z0>FKN4#bRnF#`^VfR@2%s&f4fo#gS||B?TC#~>prRVq-lbJs!lMw2ZEm~!c;a)M8m zVS$f+PErLyobEPCr0aDA>SJ-*TtR*JRuB|&k0J$iX*zwLe-l~|IAf{dEC#!zr4x>y z0sK4y1bDAI#ek6>8h(y}Gkrl^M#y?$lu$HEeqbh}29q$CE4ZL;6rk31!H{7Y{Lrhc z6TD(@mqYQX3>ma7{=nu$UCa>hOH#mh(&x@a=U5_ynVSoi=9xP}j>6b6S4iYsCStjf zD<p?MWM6syMC*YZJTK*q%3h<ciM9(d7_s7w5V2n;>1}}jySmV_DTFR(5lY5C+!67h zwj?T3LTZHhlEDtQBayiX%DMW#=OSAdT3Y4tYB}jXQCc_j2q#9wK+U~Co+xPYAE6f$ zJE&ymr!0a9fRBJA0_W_USzThCsy^2Z+jN#)ErwtqqhpPNtufG^6Pru(5qr)9JfEQ0 zLRt*SQHprlN3mpLG6n+$i9Es__A?gCLoDq^LkXnd;l{Lk9_BIbo!FBj3V{0uL~e2u zixOVM-5>zOT>&CDOC+A0G@(TVz@r0f<fz=~>BXG~{t0X9yKKb-4h><a*v1^}ut{j% zXMJ`h0tXWh*fWe>f}fAND}m3)5sV!`f?xF6mB8ooz$Z6=OnfqGANN3Blu#1BXk!%> z!LiK(3+?*pCz`n=E=oGkfev=C!yWF>7NXzA1UnNC{*0Uue3(y2F`!jWp-Zx4>lng+ zpPcNUQTx0*jyav%6*a`HIw`v^lPXHM5=^J9!gijsyRYwD{7U+Vu;7Bc<>+EJUr!YH z#)U%YV!yfk`_)xFOgWw4>HyhN$Gcm150CHd?Ed8BsGUP@tGD%k34?H75ErWJOyRL2 zxx1d1{I_NjN@Qq1q3GF^S*qAOKh#ZcC+|D&ZF}!N9X!^Zug+gR9j%^LbVrvA?A?qv z?L~4Z$Jixk%irMg1|;$1?Dxu0vJ|q;?raY*Hz*=f^0!ZD)^gU+R-%L}M=c2f`CG}h z0RwrhO2s9>SAzk@x@J4N?Pz*Y+^e%SzYA6S){i|aFC?Qzd%;uwCAbeY2%S%LN6L?2 zNNtSmJ9AW|!%*_Edz1|Cj_v(0M(*?EJFq6a&(i>k9-D{LyO(Wbi4*UxA_jjA)~rjl zv8~f(bz^zum1(nPSBe#4ZfOWzwDtzbm7WnUPxNnU?2~yQGza4XUkzi?QAb{$xj1d@ zFls$L$Eod#ocH9tsz|9HUtYA;aVvg1QCYwr2&Q#upwDCf@ZgYyQoq~4B}VrW0#UtH z@3)-ta){IE@XG6@Z*1K4ET_k<>O*qgD>}QuC$CUKAWm1*1%7$Nv-1flh<6#~Cd%!q zmUuM=vFl>J>F*kD|5vf}&Z>O-g%E{QEJI9RO20>iiZ|aj<?(IZk;5RNsKgr_j?kU& zqsPs(0xEPjC`_%hY2nuOQ+DUo^iL@gGtMLLEnblebJQ}5#@BIt>(BnEnQPGSaa06u zYjD`sO9hV&&|HU<_Rr*qzL4E_!r-%vR)7$z(SXN>%sGqFF}FsiphN9{x{fbM$3!wn z%^*1&WmnTjY+d6)wi?0N?JD~^;D>8m4)>+i??w^Qc<^Ha5T-FVaf8lW32!QDk)p=A z{A|%!Tq2y%Q*T};nJU>m5aiP%#9fZ@(2ceul~co+x4rA?79P8+%*o_6Dg_wFwejBu zR%FgAXa0c>gSS8tu;V@x-Ukf0y#teWoV4dub8Jcgf3IDIH!g!n)K)m`sw~1E-2g)h zZ%H3{Z0OT>oy7Wf<|%pWB)>mWhc_S7Pn0yIZyJ@KSi8Lwzp!gWt~_fkhbjsYMiIjU zO>2QYBBWHgiQV6THsUD6_yNkxEwu1e)}7;wVI@%2xcN}9VL%yeS2GIYQj2uhl|*S8 zVQ+doZXNZ*I!TPiTXe5@yNyUfr$B*QmRY_Buta0)mf&eBwDO`c&U-jQq&}QxPMG@* zjU`_zd%1}}l(|#1?P|b{X@K>FM2c^YVOug*EZqwy%N4CgILEo43tF@(p-rC>S<Vq^ zz6P@^Deno1I=rC+t`K^#`s<*3xnvg&q1|c{S{|X(jMpo~sACXOqH@;SGQ!(!(~xMp z-7^H|t-0r`-V=ob-h?d0ZCFA!8KVgEm{?7QZ%DCSGnjcG^af`F4RP=<Eom{3y;+q1 zGt+*gvTI5+o#+qHywuF0)iFB-BZUYLR&pvMRhClW@8PXH4W`?NQDDf75f9<ouy7=9 z&Rs5<29%bD_k${uWL+bS1%G2%v<MuvZ1&Sn62!%VqL#AbI?iKeZMLNS<1$~=*!|4m zE0XSbgF)}Tnt*;RGSq`SqZh&`N3sf$g3@csKt5T+UIxSPM`;$TY`cP}Q=@?WC@J)> z<LVC7BK35I-b-&`KTY!rx+V+xCQXb8vA&Jz_1U&v1Y5Bfqy@2VL@Gfx5+8*CGE@7Q zK67}~4A)?jE{G6#eH<>B;lUhQh{1VX;g+|uS=6g3!sTP?-tSjJ>eT)bn`d!Ih~g*& zd;>$%N>1MoBU)4U*_SPEr~s@|bq3LL_Z00JDJWPG$(2}c!s{ko7$&@66h;lJ!%FfU zDcINX{vXoZF6cNpV>wTkA4<J<+p`WlSyWNF6pKNI^AUiM=Mj&~F-oLEqdE_98YSi7 zDQnoTjXEu46ko_mo{u`!WYaIRE-HEj!QQJN>=V#d)t(`rAD!(t5X&?C>F@q+qy7h$ zX{94a|4+8N5#G2^i>pHjwvR^Zy-)Q2UVYwmBGP-~C2&6boz>UhBcYyS%%6sLUr}Q~ z!3u>(N{4iI+5k%}^(&pL?jt9j&l~;oCH1X|<6*k4b+2*%YWjcB*KMP483UZ-Tni61 zl<R32o&I)`{oD8Aqxhej%_JM$yO5at%x=6Ee|fDd_I4K|-uVB!$F_|(pH0EojsM+l zl%VtD)}@HzQ6TmE?|iGpWc&FvN~Vt54`bTdA(oXtkRbrZYaoXNIx((ngg5)FrkS(m zeE8<?{_R=aDXwc(5kQ^7)OUEDS+9A|QEN!HiVY74#~{8I;^sIya8Dwgh%z&>->)F` z0kyp5;&2r3jrxGWcQ}0Ij!wvC%d`b>bJ%J776rtnYB(v$@xCghkyk?}r*Tkc7n_r> zAs7cHo$QS@3iarCaoJQQn-~H?Yje~i%FtfGUxQ9{J2>UNLNPh2mv`u(RT6SOq+FsN zcM4xFkLvSFtP53bL}4Q|?7Jt4t489kTPsnd0!ivN<07i$QdGFQSl<+tnB$D=6`~jD zuxLjsRTcm72sLul8h@yM7_5YvHUexO6iNz8CW>@#S7NJiI>SaJO_1APq}Mrep9NIE zwiozZWx4Q(JzvV9LYd?JhywNECkT*}T%$_&V{*)dkK%{&Pvd0R?yawkNi99IN@w_; z>b!pM72|dF?<d6n=+Lj!he;PCd1mLu83}|a4_1@$pO2*0Ha-9J@^AGIlPX_?)8W}s zXZhLHzb-^Xx*VQ>{Ku>ox*SF@>&#3RFeJFN>vfz99l+}Pho#eHC}DX*^7!&MvpYjL zo80p($-H~n{%(Vkg#YErvx{$=n-y-jI&aI#*)ON|Ct`Uz%k0#YZSS6ojJE=fv5?E4 z)UFa0P5*i(DgIIU3}pm!&>0Awnos3C-51zLLN*>S92T?kNJXP#^JFrJcfBCVSs$9g z&of~p(51Dsw3cwbf_8VPPQcsBA8a=6^TV<BB74RJuc}Mg$s1%mhM+ldw03J=4~|@& zL*5XAo{t9nQ@W(CnGaFuC7HXDh2Zd-7>h%WeudI=W4xkB4vZMj24k#GjUt!mH-!w2 zFs!cW0o)qv(ojX!6UBydP7bRu{|OpsRX^c2FTo+x`Qett@0{SPml4Y|<SH7zc9naS z3|O0Ng;Ow00#xj@98A&=Xf7n+nz6&akKiU|4-sPm;GfxU?D3)!)Ppf+tHuEGaO`KM zLTxf`bGD;RJ610VB$<j%cBr#ZCD(CLFS<_ULB@GJ8BV)9Cc)OCrH<;8$zrfu?)2y5 zW3^Cb3G*lbI#@QB{qUH1>>~DQ5iWC@CMTK+h0XMng;u9|Es+_uN6hW5ue+>WkUenW z^gltp0s;$5x8@bV8Y32tLYo_-udQ}sw?M=q+wMq7*k#*neY4#O3FyH+Al|<75W2%v zsiJH5+(Q1f)s`!1$@U+>t~fu47>?SVx}6gd8P%%Y5zCvw!VS(}bL~zpcsuJY;zH{` zGPJ4r?LPnQ1kmDhNbXZyE0NVYCTuhbp-WQPdc$d>%IE3=vPk9zK^UCCU@@9uXqV_# zNmLOU-ycHG(q;cZ$X$4ASEoV-ABB!2FG_h%sjWQI38Lp7Lbo^>4Qd2q3xk8;u1T^_ z&YF64rT=%gIx1f(QO2Yl|0W(uL4?KpE;dhnl{&ik^*>lCJh&8p7rQcI%twCOwXdS0 z`aveZh9y~}<I|ASIHy}q!bVS}8EY)A{l+m^R)RV`v)+`OxAj&Dmv+*USVp#4X2xG; zp^{>_TW{+_H*ETT+fZjC$#-M<;6NGY50-DmV|f9`fl~kV1<|}bmbbKUNTSqj12A8$ zd3gWFpKLfHhU+p1=>5F&wb@AOXJ;N`TB*fzQ#UxA#CbLloWXbo0kriWowQxtL{_N^ zNCyV*p?NWT1v=Ff@GB7jG2kF%AMyK^T+-|oEVt9a2j2P<k&k?ic%mv%f@W&;3>*j@ zPAqi(l^@@O0)zc5dJrHYW?KgY`0+<}(kGwd-@lZjeeC0qJ`FK-dqc<;L#-MZp@$Sg z$OX#TekjDRk3gUg8g-ZFvPC`S*7+<s7wa|9=HJOK)T2=+zORg9l(5^mV2&@`oU2Z` zSMgm<q!&_|GZCshku;<I;3sCltouo#xa7q<mM=|4dnq|iD8xk}&>K14E%{+=9z&>Q z=4Uf}K`gysH~(p{F3hstrfaUZkqtV4mL1=;Zd9F6-YtDP@8ypc{hO;>bK-sS&xQCS zd}{nxK4zreTSLSda5$=SG1*1SlP>r{OW5(;gq-Q<{6VJe=kaa%OXH2tQ0~r>O3GlZ z4-w^AbPEwZ@$(QGtj|+Ci|M{v%r&;Rob5KP7j(J3wQ9G&`TE|kqoc0jY6=sJqBM** zQYQUGB$Cem#lhgOuA$t~OHJP{yW%{T7y6c9W*z<=FA@C$#%@g6*|X0<(?_4vD=@qU zk(?32c$~iZE>PyT3plW&x{;L0m1M){k!Ae2){&0$YVw`ibXL^!+qR34!KN$5+Yo<c z9bDFYP)>B1jF}JJg=k)~r$0=~97IoZt{^dJW`#1;I@5&rD#$ABFhUaPHy{<Af@CtN z9xSx9zl=X7IgPr81BGVMpsyr!He*LMGII|FlPB&^wqpI{Izcm>!RkrBFTmvmQC8Kd zbRct@muY|FL!}SOyHY0p9%F1@6$Q|DciZx2^SKLmEGxv(!I@saWaR}k&Z2@~OsYuX zoPL`M3|rsdNFiX|>qo=^2N+-^k*M!ASdAEh0r&Mlj^JSp5OlQnb=+)N?mvn^{4f>e zJ%l;Z;3o8*mV`hd6(Y0#H`r+yzZD{|F?yH5_0-BHV~l|$ClJZXi#q*nPr$&ca3V1; zZL$AX|IWG12ZG1l;GQQkxrc!PS~T2UZVo*siWr6%1|KC8kq%~1S~R+tA!Ij($&cl! zE*V`b&`|HLD*#OP%ge_XY+d2<1C(QIX<VgI#DomdG0QoGAEFGQD2sNWAXkxLewt81 znu!>K*(|)gTUsche;*TsG;v%8G3aFFICZs6&s}(4j7dZ}U$hrPCF&9oCXQsv4QGrw zPhGD(4Xhd8vvblB>rO+KRjBWlGK9iJ2ugk!e&t*zmA-$#_WGcTivg&C{hvSTc<FS| zw(U_K?4enVt@_pV#OtlFHYsPxvn~D~3K4Vo%sTX|*4y>3H<37*`r>BiOi>z+Z4|jW zbqtGk7=8{lI^}kTYl=j?f%R?2f_$7lpY?3NGp*)3<?f=MZ9n%$SGB5oo2%MI!ao4( z*rx|u^1W>OKNY#6imtfo!arqRv=dU9l|Fx1iNLqNi|(39l@}+=wWYog|2IkupUlTd zt?N>*UnVr|FDeG2c;s!UyOGox4d~_|nH&C#Z$5m!(`QR09R&XEi;J#(ue>uQY(qfK z+bHd$2AIufl)R!{>R#mw?Nt;JP`|tCeQlJ<#-OW9loJ<>{$^WYhjCuP^H;}4EC?RO zSizhQM_oV|NsU8r{K|n=zOZr^Scg1lWT2Q{37DgMS#(D>cay{+?_YL7UA;`XKuyH* zL8vC)VA0g(J?8)eGrjPAT+o+57qIysQ0AtZ-E{k1vG?7v?4>K0X5~=Dqw<HJ=#(S= zaaD5K=+6%r;PXc!YA39kmu9gKeeltuXuY{0oCECIp256=5Z%?qnn0<WIEinQQQ_DP zQ_52{^OXQ6ITE%JpP3+p6Fjh)_sRFL)3(*)sThNJgdr5MFR>O@!4i&Grve1pig?WH z4Zi1dlOXW!l@j<sXvmjgxDqaAS<^%(b4M2SqSi1v6x7=|aTOH}BM|_XG~bR?W9CK3 zNV)!F2zBm)WH556PNI%N?Sw$7MI<!4qbXB*2sv~2T?DH1Q2m#~aHS`LusJVqy_4sy zDCaWHDR3Q^vkcnjm@!grL=hMeZyt8n{N=x&ky3-<j+7$nU79)Jsde=6<O?02AKXXx zUoVe7Y={Y$J{~jpaPaoL%7_l|QaH7Ph^^QKn*dOQi0VWnS`5om@X!PXCh!aD=BKIu zUWDvf0}Xe-dsrX&S^=ByD$x+Fh%o-pFK{FD#i)f8$Ws>AOU$%uh2U|YDM!yz@GtMd zhO9w8oXUW|w)|4+s%;5LnqY*)h%Fen)9Z>6goOLNu4Egb0IGH+y+BI^rv;Pq&+#N} z8+gn=6po*d_0~fD03%PgOG(OF%QtGcR;tNM-58l!%1`FvRN_y~vb`~I?c~Ny(cSzN zcGZa`%$8y@5Tn+O`h@Yz7DC4@B*=!>LPEUki{7DVnez1@)>4>S+;oZ}R}$N%eiZ94 z>ooO-KMFB>eCse#h>p}-uqB0!g{NIIqp-4`m+P8-Hy&<K(?meKPChZs>;p66a4k*; zkGAg<;Q$ElGwkqxa%Q(AwwbO%?Ih%0J)ua_Cp{UoI8bgP>9~78FXxljC!@wSu5O!X zSqL+`XhEbB%h@RdkeD-T4zmmZeLg<1Q_Mq|Pc1JR5R2%HdDT8nm-CN&J1VM)Lgt2< zwH!`SaI8mQN#&H3;%|}Di#N=;{QGQ8+U^KA;EiVdmb}i57_}z>x96K9etq$$p=7g0 z-e{Q#%XVx@3KYEsTCqlHW4lRb@Y@%y5|jknNrCt!Ww^^7PG0VV3MxHeyiUie_79Ft z-J>#JIv01KCU$utK#yZ$P6;Bqx@4g!yh_)JF>41)oR4&5m3afKj>7}uQHp6xB&d*Y zsw>C4?LB(<Ix6{OzR)cYS&>cR4=_g?lwu>fLHn{aQZXshLwH?Q>!NWiy6Op^U=(kb zY?gA!$ecOQG8<d-pfM9$HiX)XaJkr|n{*{;PF4gBwy49`Cc>3M)sD{Te<9%$MTG!8 zK*GNllJnLfNR;#2HcHePtsy^ILuF`3<Q8`;<d(XFEwgBoU1rA;ITg+f;Da`(lwo&7 zN@`UTHwQ@)q&EI(P64)uTHuDCciff}yJ?o#OF=PW(kr?)7Ns5w?v_>KL8?bqKrfQv zJJo@PxzGU#88$WLcsyR`)7lGA)R$)}ARckllE+qnG67PMWqSdAZPTo$@<IkUBm_K| z1EK10lvEVDvt8z$R6Pozw(zi+)dLH5--!m~IjG{)jnCCAF*6HghYk`&>KIP)ltLJA ziu8%b=KShxGb(2O=8{$P&<aiJ#QedqesX6_V$`bR!%I$D632>J%{O#w-s+Txp0E-5 zy5UAB_Cv*kdDyAg<Y0$i_VCiuG||GfPufrf-TGkqBm~&26{c5<;lVXSUT@<p_DZc1 zUiu|h5)o(op9oAWh&xjjh%|KXP|3}OZR=hBdUlvg&k+c|(<b~0X0C{QoR|S%&`B3t zqKDmokKIq&vE_R#bw@Wkt_8}HP|^!TTPKO)P`*iMp;JYqQn!whzSFKRMB4}J!<Nv- z8MDsWQ%2nt=8LDy;)FLsUwl0#6_!5Ec2yQRUwScIx=t^k6UmI(AYVwWxT(dslWx30 zHIE>ZDv3j7c91TMGncNvLFsouTUVONVlV4jW-}<H2~9u3ijnBIF)7i$GLsgsZE?`f z5Pq#F8I+v|_!GA^0$HJgpeM>lJ1*z&r)NqRtQy4jwSoKbGJCg$pzfm8|Is&?NPZSI zk!e18&u5g=4A)ZfgJ#AYm%<nV^wD_M-yLKEI0TA(%nM}Wp>BgB2p4{rIiz7j>c#^{ zc%&MkP^N35uN5alURtRq*%=&P5byl|jsbM{2W&9xhb$2%fcnFv1Fj@ncK8$fQV~6m z%sELs&fZ`@?uY1)`Pm?3Pf<ezTkPD@^l(v7N%g3*a2}V=&z<|`iBn0MEGnS3f)-i= zP$3=fo*&;WE=|p6dFs-M-K7VX5Vh9DMr<axu{5Oz5$qr@#d6SHw$Bnuw5HxLjq$r& zoa~EI)dWx@SE_9j?yfEPP~3nL(^1{~yxPmU++pY`WK6!}?CkZ1ZGBlbCjH3-a~rW@ zOm)sC!?GlPH{McvBrjpboePRudLBVuh!#L`p%^Cvg4pD>)g(-sUt5+o`++Dn_sh+) zR~i4i-`3ri0j<CMPscw(TL%tM)g9BnoB*siC<gI1b2>^eI%Gi(-e>r)0jj~3m#*CK z@A${$@pdAYrbpCrpdR2i6ZABa%v&Bt-Fvt|eqO-KjKKp@N?VdY%Vhzbt@x4VQ*QZa zOxrnUwhT2Yg=zsD+5JL7%gKpvbU3lpFZ3zR!|J%<@lAv()kDDn?>>1@`qARYABLRs ziQgvmQE?mfQ=jOhzj>I;ydG7`wX?p15IpGwBxn-MqVq>8m*}nYU&0Fuhs6eWf$Oav z5g+;@0B6^chEp>5*(Iu7=VDU&J@d|KNBN83xYb=XwtC0w2Ili>RA>}t*1<8K_wV?C z$Q^)6_WC?KW)bR?^I4O0#!IAbBgk7Ob!5O^WZIai@FQ4~*!$WQ9%Po<C-B%)aidfe zCMPKYX)=k+wN^6dKOK-*vTup{YozZka>S=$o1_!#imd3XsBvbpw`bNUdUz8&%A=eZ zZU$LD))ch+@%zv;>Qw2)L==kYCI{fKUq$F9a5Oint3oaaU`g<i-i41d+lKfyxPh~= zrAB0v8iN2)fjL`|1zCUqhK04sBEsu<_Sj_i<0E5V%WJzh@mD@-mf9pvQrkew>hODs zEg5}r^H|h54@QeTQyxz@R;IJ_-)D->@v%hH$g+o+WK%={fM#*`dliJLoI;j~r|%O- z@2QMl<Z4x0tE3QPqyD{n?)50cAZ>&OzN=6SAkV7Bapp0osVkYpHc2eey60W$P={h> z0N_ODtIB0Wy8OO}ki`KXr_ayi9?Ijf?G(mU`?A!>Rzv{h$f+W-8Y@|KW~qze1VKJ- zewY9uMkr4&4}|fdWX@%(n3h#Je*e1D@kpLjG(ZVV#I<B(#dPc7nU2%eQ<Cl*Ni7#C zl6pB~U&99VD)|~ttP0LF&*x#{&nG(fSpE4MZ`5F})3LNW70a&B98uIj(Gdy|Yj?g@ z#e&X&cNo$H3xANm6>GHl&`+4*9<5KC;>Uw`k9B4c0#(39Lm+x4OKaSZpH8_Td@Wn~ z+D|~3AhmI<;3GL|noma|gAs+lL(g%#zN(6;sZ=J;;$?<Vb4LtMlntK3=bx(HS_#P1 z>ES`Dro43xA9OU<b1XLb_{z)$rl*HqM0>J-4*RQb@BT88iTGgkxpFu5LT<nmq1%69 zNP*X`f7#rHIey5jwp=PoWS_g8+*$a|CbMj}D*I!1MLibC6}8&=hU^8Y0d79juHXRC z9f!;9UlJl#sRd}!NFK3u(rs*zLj{?<0qx<A?7pNCKK~IkgAj`G-p4lDW_@fY&3atY z<7CFf;TB2|(-0d5S&>Xz0-uZd-seegoAt5H%IcO925efP*QNJ+y33og%?muI{+Bak z@7Z8YpdrsxvvPtVyL-sLBnEK2=o?GMkG_ftCu+aN3EHDls&S5&3pJf@+4P-=otN1A zC_w^%Q97>uVPSx7Oe)M`AQCNp-m47hh;W<1F1YU=NTUS|kFSW;;hfLHVP-2S96?Yi z5(g8mARyyaC_LmcS-$c0VoOY=^^}7CX2u5C^@yPn8-zVgTkYV))@VtZO$2yBmTT*1 z1g*u{=DJanhzx0|Gx1ljyJTNeqFS5evR%<z_b|-b%i-CVJzE7AbV_w1vbzANm?*wh zO4^>lz{>#<6{CC?Z>#yDiV&N4a?`%&T4E^h+`>E(K|qU(ZI@AmU?BCaFI-6o7e=TB z?O_`;8^kK{Fr8RludJcj3Btd_oS8Wsi5U;cMK<<%=su`qJ=KUBB+2PuBp*#b0)0p( zgm0Osdp-a3omOC;Xjl;q%1krxnck=aIzs<JX%}$!tpo5dpW6snB@@o{1|n9NJ@PPi zjrtaVY$O1EP^e1T8%zX;^~}Kl$BULBnO-I%#pNIs=KjD<%*@RU!oW;q2P(HPhUI|( z9!!ogIs8O43@rhoM9((n>~YA1xX^57h?S+UI)pSYz}=|wFaqUaNv(+dSlHAsj{32$ ze{;*}x8OcCNjuC`fHwfD5X#bALXLCT1`9AT<LWHqN?JivW3B8~P-}dh>tPc`P85!* z{bjTY+deY)0;wye(b9?E$#uB4odG4Os>)+HVx3s`Vs@en{`I$yrGuoAzY|4M4%_7l z$ZOClznLPqLhxF^T%Sl>XT3dM3OA|d-@f>eBX-)c5*G4Dyifb6xh5z(CMt|)-+Xj_ zV{(I0AF-9ZyD@<|Lb1`6Y`{$ofGTvL*I#vIskQN5Bik|Rg{mRIiBqmH3{7`v9Ot9> z)6iHBNh#KC1km9xL9G?UosWU8aTiUR^{5mdXd9**+%h7xSgS38%+vJQT=u?W8jxd0 zt)mdthj9bMPcs^Z(@*+OuRll9jv+-&O1}B)63T#I;t$!6f+!mf4W0sR<;T8cY_i93 z5jgr1gM~BoUJE6@c?Qd969l}CN$2?s7Y$8N;f6aaP82@d5`~Meb1{$C5wW8V9gJxt zGnM3YVvCZce1uJ!HB-fLG8<K@0{HehHaDM!M`E*a{`Lry{UEqQAP$}ky^HVxg{rgq zVj+i(rIEYU#u<f4C7SVeHW^d@8C9yZtU!|TpxO@Tvgq<D2z8Sy`TdKVjj}&+Fh9J- z0#Vu8Cs&FT!ZZU@lE3lV_N3&7G{TgP?x7jTjao+RksflWwQ*uV+`d3$w70}}5vPXO ztI|#T>&>dqB?G>SZW1MmqMI{>POW-V?L{ScPz{=mi=A{Q!qmxc919aqb|ns4>e@;{ zU>|XGuGrsz+2(+c%o<r#Z;F5JenF_Ou_0P4Q?%ThRr0892yL#LDAX&d6Qn(~k%yoj z;rb609-)sjU0>;R6grO5+kk5lG83vq`7$iEBHuiwH{?qvsV2$7Rjs-n51weV4BUqK zik~u%QiNhVV;$;(m`A=UbRdL$lK2<Zp<N8_Z=^J5V-Xf{ABtp*zJd;vIMhX-V+7)7 zgv8GXy=I>{Sx8uv3KdC;A$*J`fD>cA-&r#lZBKX$;$B6N|K)HvuN+Tx4?2Awh#1Hs zyVM(COVyUnqR(Crglt{0r3TpVlG0^x*qJMc+hBar#TVf5aNBsB>pM!*eVFw4e94nd zk#azzE=oOFR$26T*asn&YqF{?jt8Vv8DH!{k<^73k9IQ}4~j{o>zXK_HR0iq_EtVq zi<W4@LYE>_k!Xk`*z-wMiy|nZkwWtjR?>yOLaiysjB^Or`E<55J)ZCIl}oZY`%drT z1aAgyh6N|2UAXG$$(8k2*enWn7?HEsE}pG8aU;=HW?e-BZ-CMM5Cvabf{VR^BwGO) zUwrcjE_K#|)~Qh+z6XLHm7?*(u|x4x@H{%LX(Cl+E^HCe>q4CJYqlSf_|cMgdNv>f z%LzSq@t*!YNw1Gy{w@t2$TDQ^gekh>1?<JV_&B#4!9M|DybQS?x0KumB?m{!<qntU zJkV79JeU$)$pK<t=^WDYZ;r9S&QK2#+1%UX81eV~n$sd{BnF#+ess^{^O9vc_uL-x zz|}t?4K$Iti3Q=}-gR5aym0%l=>9)@5x<9wQlgYkc<Qr*&o;jP4T>*0)5R~%<cfD5 zeEBPsUh}AUC9{`Qt@|p}nv+?tJ3Xd=BJ%lcd-L*zo#h1C_4k#@2s7zvYs7cFb*2Vy z{eK20T@Zg<emOcFp|qa$cCuZ4{Sv9N|4nrBTeH6EwFly#UU>1!dRX!POW2Ixt^E0A zX0F)I=N1xSB*t<V*Yb<h?|t#*t8p%a2W}_tSO4-7S^e3S#Y}*U*N065;OwDpE0+K! zWfUiOkW?))<mcp%p!c}P&MD6|Cx8n{yqG>)YUo{=BipdFhaTPom?v>E3j5paQO*m5 z!w_u14e2-TyeRs)IPWu8Q#Ek=w!B<=F%3R$96AsR;k|Cgo0V6q2hQt*UU9|h>y`8` zJ`)*p+d`sY?D7IgG7gBl(Li{2@6@wGDWrsG^n}Pms5&wL(Xj#{f9(WQN9wBz3^a54 z1aSo8VIuaRZGD5TW^)BbUbB{DJeU=*l*Zv>6zmJEve!e&dON6Gnsp!f8$1L!z4H3> z%P}dCdYnS=9x|womlsDX<y?h@j(v;8`=>CUUv^#P4^};2PLDiWbi!D>S<BOGxa``> z?}aVe2A7@1B~MTKW;MtlY}H99{h}XOyQLS+yyX{L=K|8*-!~gh%X_IOwy|i(#y@Xb zkDKX70KYh0y70TxPitY-xxU$E-^CNXQ>HhaPRJw}L;#lQYwug5=yUHcN#*Uhrr-&S zOYuQKpmP#{-L?3%i75QK!w4eOtTVubZViCtW$SwI!Z_=tMb*X8ukv>Dl4{YD2sSYk zRy<-7i?l`mR3S(UjePo@L~~dHMO-@t6OxzwEzBgj+;l-c(08)l?0k*$zv7_CA_8gH zt=RKY8o|46ik0@NSc*}LRR_=)mTnp;^I<u^N8~i8h={F|+z&BW!M8c+%Tts&4OZf& z%}VR11eADoj#(FTNJx35FEMsK&HR<b^R@Ic2lkJshlNT;*|S9`ks&0YnM|;G%)y7O zVaZr{zud_wpX}NrqN)_aGH%^^_O!|V%jTfVR+Kr7mfOa+`+v#zg`XN*Dh~%6azYp% z1<$8}B~+(_AK%b3G0rjPaMq1}G_;w+#o@G9eJNG%wuG2l!dSJk{_-oieovZS{AP_8 zwn)rFaLiKOcd>x00cuW(6DGnDV&dING)Wmj<iu<$gvTSQWjx{>1bN91LsZyNB}ajz zYOh{q1uyDCRTah9AqtiOAV-7T(m@)Q&3QyQPvh{m`3~IKw24x-lMaOfrIcF-2T+c? zW6NZ?r$~&diB8%}4Ij&5RHwoGowd+!sYyA0XNtT{%-YNiU`c_lWcKIAzUHYHQ;2u? zzJv{a8@VVaTBEDt+8>>2l~Wn64xko+?^Rn)q_QZu0mLfM?;a>h6j5Q3(hc<NJk^>Y znw+k-z18JzR^`f_PPeIa`xKFig4L|3*D(5W3E+Vw#Rni!+9}E{&?U<%e2TqcL>GMZ zVCrFZ)9gBw1*+(6g*w#GGu6q!yoiVfS?*6L9`LO4*s$dncf^OIF_es>)}|B4i1UUB zm&Wx|iGmChUTu-sLzkV<=Ewv2QWzoLXqw9tciLO=_LpDWT2#V9t4@ht+0SL8G;J>~ zsYwTOnD}soIY6z$7(6rw`v#uweD?X>Maxs0C=jsw+!x}M)Vn#+bAxtiN#0~*pX{5d zQ9AC0ZV%NV68m=Aq%jX7El00ZB26TgoUtboJ(208U1{1Eu9bxeO)D#6+bU4!L<8m_ z#AOW|jSp?(6}YoiL2i#)v^o8!v>x8I-%6?z%;o3wUSjSUcRmugd<6wVs1VJZ>xSK; zn<z2Au!oFcm1bw^gN;S=N&%fZi2xQUDjg(+O>#?$(QMHu?!15ZS9vR_i)f(;kY^dv zXvP`GJ{7;R3aVSNS^l0HF?$M+@jHqDzKQk1(nF__Tqv~s_7XcKNBw*u?GTEp2fi%? zh`Gys&LF|JIxqHG++^ea43h1`8Y>?q2f$E?D#b{`%n&<zeC1-H(=;3dWcJX-1F8}N zlgR0y@b*F~33NVS-V1s*&E(9X`IDc1Gq1?Ve_!6WjkT}Q@$|umH@c@?$U%E%7fG%= z6ra$4#G`z+wD6C2N|pLC=R!u51sA{mc>yzwji7aGBBbClK_C^3nT28Ul>)l(kr4FU z+CkJy0((|X<5B-o<Xw@zz%nQ{^M{chv;k564|mB;{q+^%13_i;bOmYj?c*{coG&-Z zPhdO})${!6CDfP-sW8(@;zW2~EzNkvZ+x~hE?95IPKtvRV&mV6lNJq`<8~q%PE2JS zpKnq!=*D9N=gbCUG@wU-(lTG%DM7i5g^6Q+izL#=iBuAAO#SIY%#0(f31R>(GltCS zC~JKp%6JIy5M$~rR(M;R`xcaN1|m8~HQi}3zROKXt>C)6t?@17mOQ`x9c__*-q4KY zQ!?iWb4-JmB_0mPk$PxQRJJ8TSVtRu?JThy74%{Ka&U!&++9VCZ%|{*E(;@n>I_um z2V;8bJ(qBg*DO#H{DevRFS@~6{DYcCmlJ9p2V)RsFxXIoz++LOk(RO5=tHt1{cBl* z<(e6xN^-|1aNxLA|4fyq57Mla1sYgI4k=CU_24*C2eX_@vJ6NqLoeKNNoM_MW&z@v zER`Qw6)A1yNhR*Z!_q+e0H-)~%G%=U@33ZLly?V*SZ*k!bnZxtZS?2JyMY=kd0pSr zUw!%0EGiP12mfK#j`Zl{3+wmqtpL?r<NM!#m}>PJJA2CO8JnInKq_^4+nJr5AM9SV z7yG-JW800Y+SQeq<}o9z7__c@w57ghC(FzsNUzplA_dW$cWqhLZHT!}&0uFfR)f)@ zD~@dpDNo-iSTE1ccXls24zaaetQNDCpVY-yRBgw6jzv308_|zAg*<eRfeb3T05`B6 zGG=bZbVrnsF3N2!RM{<Wgyz?JKaaM5IM}9>T9aMyf~Uw>zI({7+bB`8TGKeJ%NokJ zV(sUX;{$0a^FaQjx0BNmj^wGNn(q6kFR;*dl5atKDwR+<J-p&2ws^kA@@zhr*5QeF z--oAf1q4-Gqv8uf2{mSN!-l?qU9L(=DlyXSQTeakFzZ_ok9i^bn&H92-*@f{w_|09 zCN${Qi5XA?RH%<Md`=~X56Ihfj#}|{zK-W=+)$kUdIYP!Y(f*4_rrC*uz<hXrMy>w zs^MT_BjFq^wmV}5MhdWgHF(TIVF8bhMHuP{Pq$({0w!fPi{LYg6ecc)k@e^?7N?;T z=iOPa3YI;}I}|SaHiJ<hKlrjAzn3vX++MR(iKU1t;2WXtLIO~@&xUx80>Xa@0BO%e z1B3teTA!2ZbI{rPP<**cM1!f+%TNR%KNODh&2hEb<0)T&T1sZ(2x!#g{TW{y1hi=Q zf7=iLtO3CLh&&as_F46qVl~WLj(do31}ugUJkMXNIdmbT|NlRYQg#Yw6NJYMCu<kq z7wkfe|M$NtF8YP8*(Y%e3hUh_;q$Cgs4l*;6OGSv6M6TW^$K}2x7Ti@Nv2b35Tj+4 zb?I&n@md7A;-W)rEbSXws7}5Rn1Go$lk!awJ!GeSL?*72YpUA&$tWN4V=7qV>{)B1 zt_TH)5gwC7I6Itvkx414n34902>-3HmkJlz@wBOl=}1b@(yP;%g}L<qDq8~>*mFob z^fP6mC9_LdZ)rnD$S7$T^grbChD}~1;NemT>L5nQUueD8ZK3z@RdE4`CQKrBpOoy; z-P_l_Fre{3(!Ocw9m!QHm2kLzS2B<P?`^5GQq=Hhk{AMk<=Rt@**tVO9%19~5i&Be zO7s*)I9BUbNwG8r5^~z2qt$w!Nw?7w@a&+;3}qQ5+O8srSsx>t6X=m%up3T5*bw60 zsGban34eFu<F>M@!uB_?XXdvy)!p8_$-4AK(*QM(Mk8V}u+1J6@bJNWk}@>e*p&0! z(~W!L+=i)i+TIC;cNM?8^z=+Dg$1<jHj-Aqm^5Y-y~I?0)qL)npyas5Z;3(Ob7a?x zgD6mV78w=8GoK{yKR-$FQnnsR-FC;EJ>y+GYSY9?XU*&j0WRd2W!A-Dtka?&dr^t% zZr~`PG?S@H@eV^oTN#n+1mh7RM59m+%&M4vM6R#P1^$qq80wUFy<%jB_ZnQqsYz7k zx`-g9-?@gLIEGW|RVE_im!-zXC1&Fh(xj6WdU{#Rl<HucA>mOjnsg_}qf;chfD#i7 zq_!v!*>!RumE6~H`TV#%SmFFq$Y`wqSyZeMbSkJ-8+lB+pTg^>ilZC<c<na?D_*+l z2+e_H9fR))K{FLC50WAW^hsCzaU{_vQGA)iA44TbF9qnJYd7yG_;yair7@qP9t-yG zW(Lwk4U|yR>XC<{HEQhGldn8RH%;W34=EdVg{slXVnD~e8Wdi^h;smCL9>613$fGc z@7_6gK-sj5heu@NI*ncUs27@fJwGo-LJWIN&g-+a)-W+6x{|mok_G_#eM55(jNzqN zPkr7-ZL(|2Cc(L9gs6{%5_Fq^0-LRf&XXy1vVn6p#Udl8x*ou(N>&8|vGb7|&9Rv9 zz%w(qd5MXg59FlIddPV?w`jGmEmlA=__f)HwdX!tYr5FKru<RxMJ~H2tI6p)>vFv9 zXfW}}Bc%y1Jy8~NQa*9LL#Ki1X+J_Ee{aGAK`43~)=6pu!;tzB!Jz>h7L}8w&M-(J zH^t3K2JBBl49HiMa%r4}W0($W`meP@a;XBZ$K9PWoK(ko(}wb*>)eH&b{gWXeX}27 z!Uuw5SzEG4?QbEh2qL_IPE13hs!a)Li@$3tuEaziNU_?3_aep)WgpdQZ7QE|_iG%r zJbDl8WLQ&)Zh%!!EIT())#0a)RRpx+*VTSoP}_EQE(<WggCh^eLQqC8*12tKK^9GN zv|>mC3uz1;(oBF5$1tLVVj(xrL)INx6}6#zeNzjjWq5!8=baa`(hTPGBKW|qUjAu$ zE-%3nK!M&aJ**CgRF9yO=FaPv*)VJ|7rWIXkkR7rP>Y&H(83x!Jp0w`T5{z;_L5K& zM(yvgvLRq``OCL*gdT>UyCO-@`!T8*l8CXMD_fW{C(D=z#1ipvJnl1*yww(?5d~G< z^db5sqzffa6sK~H@iyvC)oVSY(pl)%vR{HEIeTF45MA}exJ{uzBvJG{x>4x&lONqQ zs%v@352<>0s>%hAiT(E38Bho;Ve6S)%!^|#6ghFYd<DFNDw<O!6FwmhAf#evS0N|m ziPy34s1n9WE6bU0(=zCvXLu+`Uqs>Vse8c1Lw^JFYWm$DUw?1oytC~7SRS37?lr%8 zlH=VrDWStQI8lv`m``k%?|rjONaVip3>9khEs<l0{zoDBBf8_#>NbZpwI~#H=xkv; zo&Il@<a$B3$Bglq)NwVqjEN#88<lq=HFS>dg^Q_TRc7{TP<ptxg3+U@zOI+5+SZ(I zQB~TfY~$6EE>*oK$181xIYO~?;h3r=$0(4e^9*^quXiP|)2I^G#6*EXaokh6Q(4S( z8uzp_S@=&!5w&KjI*VHb7aOwtP+IusLzY9n6#;Km;AkzWQ#X;OVU0&k4TDyLDq<XT z7W!PoZ#d5&H0){YlJPx<(}J5N<ihr>EoNO|9<>6l>&IMxqZ^eOvrG5cSa{qN6at!Y z>B=&4wX#0KI_7(Set4}~fcXxEW<mJ-1C)S}nm1=9gd1dBX_I31!~>jgBGK_MT_n8O z!f-F#`09rtRwedh7qfHI9=BhO*Gn_M<JY6$O}_exBPj+$YtbU((ffLzujY|!XB(5Y zyGgJ=u+f7F2W=P&9u@)(8Sg<=Dh=j=GB@h6!H)%}4$<sI6BjXYdUN3SjJidt<zW&j zF`8s(9=kajLfhh$U@T2)w_}yK_i56q-|WuoJ+ew|Oh)!OF_sMt`TRjbB#Cvuwws;h z4!JWA=U!N+kw2ZXhu(CZ3}+#U?##lZ-6uV~R4K%Nh=dqg+SfOAdk8Zh(CBB+>cyZ> zQoXL~lnD?(yon5OuS_}X6^gP56FhVDy>iIqIm~JinPf~#v^@KzHJTE+H9!#{s5vu| zh5rY-p89BxR_dSzw<`LqT29T1Lbo@zuro<AR5!aOTpv(vc<OWzLC&u6?gan{nVEmL z^Xp%lzDO7JP@)VnjJR_XddE}?ZdrLCvVaVo902I<hrcxaA0fV$UhyQm^@FYc_QgNR zmu~v_QR-yz*XO6cz9A~g`TwAV!5=w<tk|NC1e2zFBLLV9Nevyo`gjbws#661HF~n) zk8Xzqnilha?{MZ$X9T;4SNwiqiN-o6Yy0px-xLn(Vrtw>Ni$by7X@hl>bM^d+f09m zXz(bXTh^OQ_daBjz3j^Z7<#*(&#>#}^xfjyRj2b|)@X$oCmM6ZUn2c9<tI01?&xQN z&p4PEhzIUI$dcj1G#7dM4-a}EA`eYjjX}WvUx6i{zUM4v(Gn?zWuDS)oS#k)Z%sNy zIj%77ItJveLSdfiRm3n+!jKU;XlaJ0d&<RH;tvi9-0AckXn8nfBOe_gd)d@<m<6i! ze9wKz6TygdI-+dW&h+e~5Pu(4jHe$3$^{{$+~GvmB7scE-0DL$5-Afd>Q30uyRU=; zJL74{-@ACH*W>Ly6UXk>dAIol$Pm-z<$j|s!=k(<gQDmQy#e*8s*`vy7&Gh~BIRih zbDpv~B4vsdgHRU3)oI&QcDdTe0$K&MZT;b42{azYAI)=UUUZ*XI`Lr+0;T`<Ycch9 zCw`OL&FCeni&HsWFB-lF$Q)7WkJQ!)5>3On;<<&Hjq&9kDVBV~A#I+*>_NGN?B&$` z5Tz?IoRp1{Bn7EWRs6W7Y{|)i7<Yz$AjEEtD^6;4uN{J|zF^cLBMp)UHh|PsZhxu+ z_qO`ACCemMmpoOLe4-+G+kUmw!G4bAeb`WA5sA=Rb(Tc%XFF%|Nc6YgqEn8nwhc;q z$Pn+oysFwFvCvmefj3TDd7p7@lyDH51dl4NSB(EEy=-!xrU-*r|C#&@-;1OwSITit zab*>v`C<A3S$cEnkn=fI=LDUX>?KP0s@mjF<mva?*_Dc4%(-bG6M8l9`G%WN((nKF z`-YwV!}+b*OygI6vE+sA$LuR%S^KC4_3AP~)A|}9dt<~p&NRZ+Cc;jOzq|N1Up7nA z%hyRob?FEH%Q|}F)6t8Ot`mIEL*O=k>iMCpo?D?7OYmfLki+6QP5Q=_y!kA%`U8jf zXV18`;2FVq+XUi<d7ADztlbkjQ?+wkLJu-H28k1tv3KTH)bl;fnBfnP^vVfFhyN=- zq*0DAMlkv4_-omRqoN}QpAkqSb$mqh?sG?|I$4J?+Yr@V7gNYF#wn-#1E@8ML?G=2 z|LLn|^r6Up4R_s9IK1vS9r4e!fkd3c4LCeCNB-Gdk|vjGT+imW$ncVBHWI6*D>P}9 z?>2<~WK5!q=UU_I@V5umA;3kRYnIi$C1Ng)nHh0p&H97K5C_V<_itGhAC<UPu>y#r zXR$wmm!THXr{I9i+UH%YI{Phf_(Fw8gj`NmQS|_iO2R#a;59+3*|2m#U<RB=PJ3TV z#9q^028y0oXB+}pOJ&igul}Tn{VL6WyTP<C(!{*!r-N(4HO!f#wId!mzv7Z+c})<= znS#oJbLwBu%k^9yk7<A6d<cfUOF{fO>F<1r+<`EUh%-U$(^)Mf7fD*ifji7B`MLB( z-9HhD?Ml8PFnc;iz}4T_+Ux;VLa$4I6aG#x0IzWcs)Eb0^XD8PB>X^(aEY#N)YElB zs$cOv7iF{60we>u3=bqs!8w*5VG7i)uYxQ>46nW8c;}jNw%}K47gKO#sY1e16xaCu z^U)Pg(&448%vm9GUEThU3O3N!>5`vI?(7S&6&?GJ$bnfv5evuG#sP=$D+LqO+}(Wv zoWSoS-;?}K(qXU$S$20Hk-N6NI*$J{U0PJ`k{=mg@kkdicn)bY$r`ID&Ph#M^9zd^ zVIrhuT(IvjcL4AZf!H31gu%2@+bit|z#>1M#E;+}K!8<2q6p+uoZjN*hrC*c++dPO zcmk0KNNdg!(o{Whk<$GfC?-HCtV_zZGTCWx9MMP9<PgW#+-4E49-0=ttm+nh{Tp^0 zrCR%qy^OKsb%KcC)v8Y#vcH2B4K4xcd%_YU3u$Z*PSaHdbxU-?Dgls9!@i)jo4lTV z=NmeZ3IK}q-|)jITdVZ-fp8cSG@?@z);L8%%Ku*i?FGh?z+~G_cBBu{h`}@*eG|c_ zUG@nW@@LH}u5vq%`FZg@Cg#S&Pd(wgxc02J>Z?;UIH@3|Chym+)q8Zm8>wjT8*urG zW6l|mXq*lFL$lXQ8<CCZ`t(UAE>N4otHK%WE#kdeCg;=jp&*KDY&2_9$f<+DpkfT^ z9qBWff0P(E1`SZQqfD%dpUOZC8cWfvq!tM-7mF~%;PbWFp=3K(?7~mP6T>v33_<d3 z+WnTqL)PegllG2OzSc<9I;%2}Q<(=7&4BYD#zY<#2NH7f>I1>c?X0#CWwCE1#N=`C ztf7f~bdvBxg4KOms1~{7p%5Z~*-My-LFLx_KtPNkeShTm=OD)ZG8Ta!tBkC)eem`4 zTbNq1M)*Io#&wC#sGW-3No%SL^M%jIq5X{3hV<AN65<?=xDrQPoTJ2$cc^kay=Fw$ z5-({0IM64Z$~%>mx1U0l4%0+P^Q^8hA5JtExYLb(<Pfy`&jfDiu~ri@LM#>(q(i?q z3d~dtu8w=jF_Kz0uw|AyPTrgDf^;kZ4{luGHYXkiJThr=6oFPA#VfOCeF4}%GWm2E z^xX6`5fCP5dhINWD8v1~VU-Xw2567$wP(KtBTR%BJ4N}euKkErQo6r1Laf%d=IKBV zk5VAndFVdDg(*K^6+|RpvSfx#>??(uEF;!xy8Tif%XT=3@I~-qUyjQqN3zRhP8>7` zuR(H`h$VJZ(0u5t1m@ah=;v`5(FH&e4P0<S79c}W?O;Ia(?THt&L)#Lb!1{qrLjKw zEE61I-Xo%_17HfPJAvJtmV1542f@BvfV5z;zdbCZN`0$3Ob3M6{&c}CchvGxC(p0t z0f`L>kmPHyW4W*lLC6nzQ2C}I6O+3IEIjj!UA(gR?ex(Eecoq3om<Sb%-h6Q<`ksD z(@emUEEZRPZa?z#w`hbIE+`~SKYwv~Z>khbX$VjGtB$7O9lFdZ8Iec8#+A}&rNkYo zzr)<$AKWzlj3_U<$nBWaV(@@zG(tD7h2qC=iXTln*s|O%{O%JuDcRXcAwRXN?(+Bi zc(&^ZzVlT29wP1GP`V@AE%rhL3i}v#R=GQQi9NSNZNpk99!#tKCVxxF!dtFm_jUV@ zV_&Xb6jDgDEL?$&(VKs{QMFkZU=Gu`>KjF=ym?^+ix9(`m5xSarL#4emfJ)i8UTuu zcxA^TJ9>>#dGi9<_dlSqg|*QgQw)pX=xy&%yjI|v6eW{sQ8*EC+}8pvn&R9CtXxSW zsKWTkL1-|uPGUg;i>_>U##MqaG5iq+hI4<QR(G&CW!cFh=+q)Ap(ht2eC9A4BVaFi z+YpPOgGEHj-du>?rtaRU#R<ctLF2*h@V3DC9W2-jOg+xK7woHLP&pobyb()LA`+&R z#&PG~B=~7}d=3Q|YZ2oYCQb}^Hl<9Iw1!JSluUz5QX!QH{rNhqH$4f93-||mf6kK- zW3WGhbmeU1h=C-r3<=32u6`+H0o|S+Fw(fCBh4n=&?Q|k+hg>LGgU|%cS?O7X$?rT zT-v=x(hc`L@L9t<_+NVeggXy>b?;w?CZ~<3sg+c5L+Dgcm#%0xHI$@&N0{1VC`d9z z5{tCc_<(}=YmPAIL*2}M56a~?BW`Mc>HfOkd4AO2ZSt1%-zE8zvBp=twPJdqi}nYx z&}+AYr_w)q&eeFw>@G0BesRZ+iyfTtAgE}V@R5p=)EeTVfg^H&0x?oGP=&3>kS1fi zj$`sPK=4Uw?(t7mHakMm3{J_n=Fj=$J{lpGJ335z63y-H>>KLPo~94{z*4K1ezK}L zJ=8toPtv^<G^#7HcQHhUg*geHd!4n(?=D@Rt&SlFdV-s1N!9i_;q30^r!Z0ytbCpB zxuTEeBZt7(-H;{q(V)PFt#u2Yv&lK8{U*a*)l(JF#v#h{w_+ZuE?Y8aChTM448j*} zC2c=;3nEuk3-!j34DnI(XyMJ$CfJP$>PItnL?nRLeFW_5{FVGXa&j`q+@#3H!2~DD zL8wbil_nQ<PbK@_JL%x1;(&q}kc5FmO2Br|#iDhlGDcv25Pd0G!qL?`Y5vB;vF|)5 z(}uM!5U703T(<hCkW~Symnh3B1&R)I50&aiLB;&xlAn9W^>BJ+xS6F7qFvk`hQCyH z?7DEB8xzLjH$kK}KFOBZ_Vo8{M{qM(_6$K=U|vd-Pq%`bD?1j=;U`qJM?|@%@@7lT z3uxk*VZjcHZ50c#FnlGq<KO}0t`9F|^!KYb_LBy={UnLp&+jLSkh|bi%39@%v0}9# zviL14n4(>+WkBsD&WeJ9_G&Gm7&)Zt1&pHC+N+a8F_w_4=5E~7BdSt{_VM~jEy&bK z0j;+<>}i}z^Z>(|)ZF<z{dNnFPGRmYby_6+lyDlqY|dfn1!>lG`mmRwT^I^$lcgNP z$}Q(?%mNW89tq+6D9)OxxVz2L3|D%nxrgbra0-vE4c^THTQ2*gLcYW@+&PLohI3VH zMAY`^8GW}_jIb&#KGy8f@)G&>Fiu|$HU^mL?1sSdcCYR^HbFhdwb87qa|7@&5tNs> zc}=VeHw&ZN^B()mPIp-6NOPPJgHzK|lSAR8nBI3%3g}kDx;0<}B@pBmuQ#nc<A%+g z%dwp~zJ2+Bf|hWaHje(^d+hfJbhmI4=1@LM8%uxnI&Sl}v;pZ3tf9T-U;{&FGf<%) z4*|DooQG(AMkFt-f$vDC=*G?Zn_tt|Hj9taz$b;>DEU3{_5abhw$|{As#?rZo~%3l z5zi9s5|dCRe3vMNb@8QO8fn9l0zSj+2MUE_*tDd|OoNq8+WVyocMJ((*hl;5%vbfV za(lOz*1CyU^C`fjW+otFU&9AvbBul=n3w^m5Sb>!^q9N32*s7OCKX>CbWNAKFOk41 zf%a^cP}#?1klREn&Yfbd^uY_r4crK<(ZAa8ag3`1dN^G)o~2IM%3`(H7*2hOW7r$Z zcu<%p#)PzNImnj_d3l0Nxi%&w0ypksd{6m1{9hcxJY{SX*|PXe4;{0PN%#^wo<H6+ zHhL}}7pC2l?@c44Lv#k{Vz#1*<8=h!?}u2J@VJ2GptWxWkRiIZh`xJqX{;jKmtP?C zmBEdFC%%g~V@Ts9$2p|IzAcbSija`o1<(j~c;AFT<HzaO4m{kxfa5x7{!AagE71P_ z2xIh#4?g?sgA>ul2zG-hAC7g3=1iu_ZO4%<%UX!CD=M}?Arl)N(<AZ#m=HKdAzcNc zE2)Q-HJJ}5m_6Q+DcRxpr+7W4AXs+@Yj8L`uL`9vC34`NZ|1y;@8cu3y<mD_TSWZ# z75Rb!u})_;tSP9SAHG4rK%)R`t6lslH0X530zuum)-O#MVT^YdE;10+WX^r~;o_7; z-Yl1!`NWjs+Zgh&zf+a7Xw^Nd&2TsTqd(Na3;=&j2j4%t$`!)z%6|K;tD8&<Zaw>c zQ2FG857(!ti?tfLT%#>kr_?|EAlXlrf&FZ8{6-KkvO?XK3HRg+)~GD2(_Ix2WIjEZ zx%WOSqD;Hs*LY7vls!6Snl4_KrquOxl|{{@?5|CT*cLMT*7u*wLPUrI8Voa~;rDiS zUTdzL4h&tJs;++PhsxiJc(7QG2op*8C3C{zG8}V<6|9TA>?f<VPmg@fd{|wEu-s|Z z=6F>SiS*pOIqRB^te^OIVIYS1ViGqmbpBLqs$a0MsA%DWOSeb$%+3J~6_tIA5Wi}1 z6nXv>AFEGkx>ZK(6pPaUxWnd%!yo=B7RsCO3+`SrH)hHgurjDnUPq5|H|Hjm?aG1~ zJ((tAT^Vq!Z+2h0&N>^!I3{r~lDf~&*d!YHKY8ndI%R+Vcwo*}-JBJh^Ng=_Krv%0 z=c=>K-(y}pPfp)xp=ME%Cr{5mu?q(HO98B+CS+j)anwYV$fCBS>4T4!LZu)(A*Ljt zZ3lSGXYuP~x(E7nu4p9kKW-Rp8HBZ&okc9-oN|D!l=6ZrqjQBR2~{DwcbJdO5Xd`n ziv$1($&GrR=LeojITbY)F_E=d8`maaT(C7V8=N{DXE$LBWiB9-xO($k+zYz}PX{i2 zchl(=+Kl9zD<w7TwPefT9!OosqVAmp-(&djnvdW{gzr6`TVg1>hX5;5+E7yANMnif zWYLrNn4fl5dIjBTAMy|>g9dLUpDK)4x|C_8?(xVm4M|4sYoq0kRYFy#)9TXrwM&pW zY_J2is>jt<9F`Dj2ty7Ti(?5{P-@lzT*2d35N%A6zyNdvQ%E@}syI#xL1Fh;h}}LG zJfRh`c@DPT-xJ$%AbEsFV%c&Lx6TW7wxjWW0XM3TsvFV2C0^`oq1$lU==WC+p8Q>_ z6gnIRaWL7?Oyl!6b?UZ771Q@4jf4Ct%_!k0FXblbpJ$#Mc0a2+)Ka3ce_c84tZVVw zvn-<yv2FOQ=2+J85UE7%N%tgQhWh*j4A1zYhxjfbsYzo6;!m3zcMYn!@D}MVhU!mn z)CllAUFN5|B~f4c^Up%g9&-20bwtyP#V*+=gsFOG9a57L3q>b(F`Ov<AKwhsFb{Sx zDOQfA8qXmIq)S9i=ED;V)?*(=2h)~vQl+k#Mzkl4KnXD(8WpXZX-3STgUwF>(<I@- zHT%eo@$moqCG;r^9Nj126WxwvABOxmknefo>UFs(K6Dd&RPKZm_L3VC@NfFXX!5+H zUrU%ak%>8nG8r3VP%%kC<eNltcFj#@ub4^Lb@KRvy7b-843m@Xd{>H~)CWGpctj<A zKT$fYQ||JB2*FtfgD}}HaM|f%4DtDA^WzO17TKw851!1age$|CChq@{_Y{&m7ZksA z4ADf{xK55!PKT65Sh_zLLnK$R$6<{l1Rz7un6Rz#ElGhG%eg->?kCHRT&SVdTt4Ed zaBU9Ia3M=Shhp^!8Wv&~+J^!6F{Bmq)THQ<m*>&ujU17A8rAQDRW~-4Q2-@;XSQb} zk!0g)H^19Mddl<*f4W#SvjcmEk1$6;V7?dBb;AhTKuX?>F^GyUH8z22`BmIz&8gx& zt&yKMFO=a`ZI@-*eW>xq|G^})rk6H9Qg8@gMeVUWwkPywOmO?l(%k(#@l7)Zq%9=p z%!Z{WzrH;~I*Tj=R{rQDQljXd%#-z&XcZM6E<hXCVWDswB(Us=<&qG~3Q$})gsp2t z3t(RU_KnWuP9>~{EZ@b4aZLl6AE|82qiNPOD>s8A-vjI9Cd|8?xE}J$yaJgZ+=@e$ z(2$kK*0uj!0EOo2>oki?ijeT2ri7q^pWD}Ayd`ci-0i4<;uOJxi?e@`I#^ujid#Ac z+lhY9Zy1Pv!zm3zS?)+pH*=9AP~{`&@J1QN>C8lChvjGU%qFcpW1W3qx!7{RV{F$q zNrOT4p3;_NZ2jSzt8nX9uS<oOHfRAJQ4%EA6tQ)H!`PRmnaE5#m1YMU8ogVOe$n68 zm_Y};{|&Si7P7ywayh>7|FReBR*cNNx8}W>krg>BcFo*eb8}|b3Q*O&!*DY~z{L<h zK~|3H1scNE^{7Ld32z$91kPcs1IwOO1DJExRV~Db;&`H5o&sbaz^XhOp5Ded*Aw*k zmP7{t8xv|<496m#npBVaw<`!r*MC#%6%c)+hkw8~%72?uGmk(L1mUAhHT0pp5&i+z z{}r`~Zv*oktNy)Dr#_rhE+Jk*|LV-W`7{~KI=<3+?!$)DeiJi3GfaKt9X{dP<%Mb| z<n1R;jtUPDkYWPi{xBLXMqmw*Y{!Vv@i1Rop+-Z2(sLUc@iNl9kMK`cputdw{fDrR zNLf~ni<L<%`r!U|-4KN4(e7<}I*VSnC;T5oNQOU8IvmEv1X<RlK9&Ah&7oyKJ<{CV zdw@s(eqz6G-V2SM+y@@LHB?>8=^@OfVJwUc?KU)v6jgI-;0vbAyWy^hf{>Iqyydn3 zv^{%+IlkZi{(|Cuf*a`H6=OvA$;)BaAF#GV|9-*g#}IFIO1KyDp9l{shRJKD(L}Sy zd#A#gd(5~O-6A{1*R_gsdZG0oy4~b!7i6Yoh>mJ;sg_pqj8{bcbqmZ3+^J-Z$J&{B zhc1hHYfaZa<ic-}#;-WrQH#Esh-)Hy8lLM5lf75`aVWKT83#n18Rk?}`<o0YEKAb+ zF*z3^!;q|*Vl)e|Y<HNsC<-;1lY$#DY({a2$^cLfWpWUi80o>Up4$6q3q*3=EiJkg z7ujSMM->KCx~``)R(4vsOW;pp<08^klRO<tja>Rj&K!>mhK1w2;-@kZHwnan8p34d zRFQ0*l&}HyGkWdRypuk!NWj_RPM#ds;b$frfVQ}a=niqw(;HH0c0c&lWC%wo>n=6+ z4mRPKBt6Ux(huXgC`kU4X%Tze;vNlbKAox!{Xv$cjdJSbL|TrHP2R82nG{0`lWuMz zpK1t_Uk9o+Opv>;9<+vSrHKoVG5?E@8Lz29KhQ;t=8Q(<w9laqwt1EV>Nefa(EGHz ze$-<gjIgw1UB#)wfYiTJ*FqNch~bpQu|Vy1#PG-Ar*!s%8qIo*N#REQf&ViV%r@%; zmpF{VpRqe$Q<1G&E#JVAP)ejX&lc;zCT6b17Bb$@e4Ph)9UA{oa9{~SqQIi;cl8yB z7azHmnnn<aQG2`-k!H4ak1=xY6)(_i?^w#Eq6zOC#@kPyU}OanMx2Nv<sK<oYvX|% zC;Zvk07GXjP=wJ?l^6*~O=ARA)1*jPZl<Px>&uRH;?j1-yQ#w!PeQ{?r3_X7Mf7~! z^2T3mYVs0~?UTG_{in=gr-d>S*nkm`f-)~WNQg^+;J4hsYYh)DNOunS_!UA{b4b#_ zXZ#_Obt?BKc|*%ger=_RtuwBI{|3DKujnMQxwF3J2hHnOM7oHXpl`s&oRW3GM+6K* z{M?=`HU;)ZK?~GQQ|nmR7M{RrY*0mLTsPH$x{XCm{cJ8Q?KA$2-{j(=u1r^fK25T0 zXEXEc+pNXXxJ}sI+N<9)w3^-l*Ad6RDwFCmpK59S52HQxm$XOH#N^TDd&k^oghPZN zX0InlS&?&=#XHQ#<QML>K@K%}FcV0u2aH!S@^u5AHYBy;0MDxFPvUNj5lo*<8!zll zP>b_e*v}0jz(#o`?i_L#(#-Ei`BrG*>6Ux<-?Mns9P#VR`(OSw#yq<C9&=SYJ#~lp zdjH_Hg#8KE2KAmxX1tzX%^F?bS0<B+l-gR3=l*sWcmrp+jP@t**IUFh1EeRAX?Ve% zGNfYr^hSu0lGJ(Ic0n17?aOph+qPYhL-+I-t?GLpo+euM@cvx*a$|tw*zmhByUp7G znHaq=27*Bj+H?#n!b%FkTkl431`Xa8Bgo-d7)7hD{!0>jv>VIab5-Dc;He^{*k+6y zLt{o@OJ*AnH^Vj%49P<{1eWdTF#|+BLJ**dXg9D4+he;HL#+e_;LBaqw15BAdyMR^ zi^bcepi`Ppf&EenR;se?(ZE-zVXzjv;gr~fw={m?4jbs;@dQ>@U71Xf!0VOo10Ws- zJma@{p_bLvO4d^%B-kbltdS!1(l;F&VCw(`Wl(^CZdbVcVNU*uh>X1k3!DhdplB(n zVom84;|AcT#FimJ!ZW_w*e_*OfjVV(dWEK%X|Y4gC41|*S8&Ih<X3YAZ|+Xd;EKhI z0=_Q~THhA<eQx+z6XIkx{Jj9@n(?-_Ms+Ho56)^`qZW(TT)kOvA0ZWeD#`<4N1FUe z4aqnb?&W^krVBXMdn|*bDF0e=k~WrwAz@|iU9s7+jjv9`H3Fj3nQs+-`+DoGZ-o=b zZuI^8^L8XItgJpPuCs0!9tIj&2B{b26SHkrTxS_CtgKUEhKFI$?5ES2y!Eg-?WxCG zG<}1&POkGbD|fhwMb)Q0&8LHXepJBr*%47lR7CXll()9ke>X)Uk$lIHYG(!n)*TOw z2)HSX2#f@1yBgvrLoAu}86-T@8y-bXP-<$D%nS2|;i4$*X%j|%A#(RT?G;}i7EKO) z;{+8I?(rt;uF6UJVfuO!opgQr2l?9Q@CQK+?Vo&;%pu?C_)_%-DPIR_5;NqELi%uH za2cY4xCbJ~z*f>Zn8!t<k2cIILuzx>YoPhfCR;c!M~kz^4pWdZ)IuGbLDW%V;~1`X zcA$+DMH~kKohMQ_|LMOqcbB2QzV}4P#tr}Y_L9*WNWq0XEZ%jI7&j))c3ZDG6DMT4 z-UlCZED_uFmTcLmS=ugaYkkdG-&u2qMVQ>JrKsu`3lV|e>VcR2K@i^;m>Sjoon{PW zjNf*!NIo!jG+&U#ACIvJvk<IgrDpl?98dNB+Xjb8N3O3)`K@lX?%P|K!846QDc43L zg9+2`OALGsqBrhsrp-rG-sxGicblWJHLAWzCPWu9iFlnUejjmdfzd&rN?b6#&3!d* zGp5gae;JFz1FMa*##wyu|7e}1R`J1dH#=T?v>hPy;E+~G!GuBcdKLgR9EjiA!esbB z{?~|^{W3^^7F!9+(`@Y5e*lqll}0CFa+-0;Wj>s^3{=l<Ygfct>@5^s1smGiOvUZ$ z5Drn#4ts^fsA7;9_Bb3-4x^Da|7iE_M|DER^n};MH3Xs#kHnNzwk9dPz+u@8r`a>j zUh_*3X|SW4A^Trh)E|@clJskB-pK0!{`OS4k7;{h6q!Ue;N#1}Gbu|Kvn5R!Z(ioQ za~DUntwmm8_WJoHS*D?o{K(E%ZWm^5VZm^ptkaJ}LP#raid#ObaYwIH%OyN5*S)!x z9g{sjG10WVyD=x#0Q6zt07pQ$zbBh>lkg^05H$QtX`=iqI3V}CGRb%1zUuy|cWAlZ zPhXCDe+RJmy^sM-kU{Vc0XeSF@nWcEbPPEyj9ugQPT2l9th>dsdUqk?9beO2p^~r^ zoLFJy7Ura=Qbcw!CNKvT_4UM&w7op;Wh5*@-2h`W8j*Gvjd$Ef8-ZrsvFwUw@cXKy zC0HPQanNB#QtD>fXN#T^E5#5I)B!QaQVWY{X*wUPaJI0sDLVh<A$sWL{Af2rO~05u zFZ;!53MA`IqTJ=eU>+SUpL_xcD?~Z9TsL3j&%4q_9<PZhucf)Di*|0fIB@f|)oW>n zwliw6(-}5~W?a>RF3!*;7P_Q_&IS0t>Z&<`h^i|S0m9Q3(hY#q-@pZANz)CG8GY&( zwwtz37fQdQx6G!z7c!Re&YYVe@213N71VU9i%9jiZVo}1UHz$68md!5_ct#=ix`F~ zJTNbP6o%lmn!r4fSqJF{FV3r1IBhc0i%$QCK$Xik^9|vp+p*B4yE17u;PNY-Y02Yf z`EI#Ex&%^KR-uw1I0CL*4vo#R3O}U2j%^2pVPjeK_(x!<xL4pTw?L;wh?LA3xv)i~ zyd@JWrig4MClIqF{f6IpH9&Lf7B-iqp;fc<&%uDVP9qrq1dk;=cWY@+C76gkmgo^; zm>||7vfL|arn3J}GMelePnfcY1AWZEGx(@xT==_otP2PKyjo{rSb~Q4;*<#yuwEkQ z1fz?wxC{@K1OxQK<9BFRZ-FH@1gKkAX_t;?*l?B+X2rNHj4R$m6Su8^c!9+Cz+V%i z!kD(c7RI+8U{rnQ70##dbjl+cd8H-T9JFvBokVY*o=hbtrjoM)3gr-matgw>i6Bk^ z<u^P2L<y<X5)w#IPW2qDq!gP2Hf(!!JlV|~m3*D~{o>i<Ejm;YK=b)&%6fW(tVy>H zvEp<J3x(j!WoYA&BnN|g#l4Dq1y9WW?mh%xaKF3QvU_i?Gw%HBPoLfz5;|i-OODkj zrdvICuD~h*?QUrH`g?-{Rmzt||BS$uUl_kQ?MFT<9-#2lLFpi+Dh&Ng=J!-Ov5_`6 zG6yXiQs>bGpx=d4zo0W{hbZ8C@etVu4Rfb)DquK@(m@{OR1A7W21#lzlN$Fs2}sR6 zXgSD88(SEh<p13G`3jUy+vU@Oh-q{>{UwE;kO3lO7uo^Q@IPE>j6xBhd<CVec!a0Y z03ao&v2^@d3gYT}8AKl#zTuop^sZ)1jEYX=JPYE-U_@ZSS$1^VhAkLp;9nKZCCb8A zTMWrHwfr!30EMHQuvNofb@(62fMp?#n@ehtmXCI$xEbeA{E`T&`UfY)fp(f-6s0$8 z&ibptsw$_LN=k)QSl588gT$>l(f~~F76cpkSJ|AC(W+s1(|UVwA9N5{cbdI&fFaiu zpnD$S?kbqsU)qcUV&b*TX_3&w>YJh@opf^5O(T=KHcyn_Ig1XN06Ho^GK@s=66gSr zt*GIqcIitj_Ow1v-=nVCUK^v$9#GRPe9^MnZ{QQ<Az;f@OAm*Qm-6YT{&-Dz50Av9 z&<Q>HcvVwb&b5y5Suo(@V(EL{L+q<%u1k^BW&_l;+|vgV)><>jKgkQP@@5gaGGdJa z^fQ&c_cpy?$f_J;w{4W^T=+78x=V9AwL*(lKH*=5N3JPbrIF3`UXHw;sIJXj4fE7K z`WAzMuRh%XCjtc_rL`|@ynwg;z^Z!|*y!W_o{|ze$FRQLV8;c)4Ua`Z`4QF-XdExm zo}mE9gO7o^F9_D@2H*1Ws(<`KaGPK|d(^(V>*r8*83K#MtTDv3t*$fEjVSoJCD*$e z|NlyFE;;7H2V6JjMjDfWu2gG6j&gT5#y!MYV7;rWfXr@CtCivty;ih3JYo}-?#N;4 zsK><Z_IQxRQFdSemCez$>A1U5OuH}u3Lf*la#!6wepmg>1LwX)eDp*fI+=Hi48zHO zGe?GyW(7%jFa%K2jc4|p?w4F~LXP1H?Rk7qjv~URw<1U%)C1T8$#hk$C*RY*CYj^W zq8u3{_->iAtuBaQ$5MX26-A<f%t9orajtczxYBab%kLR{B#H*ETc(gY5V2@yCV!ur z^Oe&vkCVB!&7S^&-;qZ%>loI?ts&Tdk|ApJP$q7uR^&{{g*X#NN@59VGFv=&Mz{w1 zItHUa!_$$%XfJ7$aT<W=_o^^D_%XbY9dWUBvRv4s5oib$ayRrY5;w_Bj#w!##ox)@ z(n>C_q=I)dze)aSI90`+8HrC~3|4|UbusVg--!Xl&n8Rk0U6SD{7)r6nYq|3NxFaP zc#qU_FfY94e6&6Epyef_mX|_ItCf^DR<0?Kv#bBh;|Hx#B^T>>r13#c=&^is9oW9N zH}&p4US&W$OYHbM4h87A4w=nqmi=`DFNs)QYDLwg_+0Y1N+aH2=2r`!7+5EbuqGFe ztVooU^!iQc)}i>K6whFp3NLm!v~tRzD^6<JMITYXD=o66qf(QZs-OOIq8SMPcU%>g zul1Km(ub@3O!jogO|W#bZ`Vb?>-H_3EQ3@ayW$k1WK8|}T!<L5jrXdj9H$Bn=P;S$ zEFq24PS$}_4eO2vGrfAR`jIj7*iV0fJi{a4_LP_MuHWnkjq^p2beP{onv3FvsJ8i- z(9NQ?|I7N5&&*siQ|su~lf&B-v1^$Pu(uz1q)5aS3jD+sAlVZ>D<o)cM>K49Jf~SC zPib*^_$f>SXfKOTs`2_c5T^!GtK^l)j`alq`VWE@LyCKMk`a&%j;L_08XQUrXxn?_ zE1S?7ZC6rFW?8r85F^s4lNZUIPD)#(m01!6s|?)C)&dcF(A_S4)scs$97h$zif|0u z^>CFs!`{XGbFZoEi03V=QOA>Xg!Z<INH0aV&#Lq}LkIX#wSSJZJawiYGdf4`oH$hF zD%GKa+1KnY8Uo`U`o|a9xb1ox)h+wRv();6E9jX@Ut=hhv@@u_VAAcrO3$n*)^z5O zd7dZWxn431iSMo}b+HJ}2gyDHkcu#RCPhw@bWqMWC1Us?z`o*)ud=d{a+_zS&4>0@ zio%*C_$uV8wx}{jF}ThB9&(FiR8aR4-2S%6Gi!##!77&r@2AUSb}0wF{JLHYzaQWV zRhDC_1+lwiJP^4L)(fd(&Ln#*XRK3W=B5}dAe;fL0iUiCwq)>AQ@l~u{Nj#>6w~(% zJa+P?m9tPZq7w8x#p0Ajsyj$emQ3N^M}pWoV?yPBD-&$U3~BV)4R>yIFYWCS0+N(; z>uxDT^C}tYWs{BHgV`sbtoc4{fPb8TNQink_ia`}lsivWXj9UIG|~zw_>Z(QM?I!d z*TYeBnQYWdDo_G?Tu6eDRTx3g-D#yF*BR9MZ;*p6sTOJ8=a>pqoQ|91fJz~T4(IP= z2!T8QI_u6mPw|~~vcoC;Prwsck*1sPSNVrC`6mJ?JLEzbBTr+;h`a&L7GW%)6zuZ$ z7!IpG5MF&WfYu!v{~F1yHfZC@Z;@1I(KtzVhKn^A5)bpj$5LF+*SBY~ei)?(pHc_( zMi>}_LCcKjy{t6I-cOk}@IWYg2`|SCeLnuLDhVbgL1#)x)3v%HwvCy`wwbq$o5#0p zNJOunKqm9UKcL6=*ur+J2<}rUXX1{1Ea3~Ss*|eM2XU6B*PKL#<t^do-k<9o=@zKs zlPND5db-|I^Pk`N0MfX54Y=s`Q>%}49_s^~KT^hai(r7p8SC8IvT80E<AhEpxFSH} ztJV~q9RU!^qw%_uM37kbv4QfmcxF#SEU<5TPENW@d|it>{iL-h5T4ht;|7}UNrM-& zaet(M?|B@gw`XNV0E2#`gG~tYT>o9|77SHT$*PmKl5}jmq#O8XF5D0{DEkXk@EG*W zX0Z8gPgp_=d>*AgFX~mvR9Kr^;Kq_3`o~|T80MVo9CHtI)?hT$m1KQX0)RsmlP10W z{r$%tdl%){tX~;B2$%aRFD_j#`zM<~Z{QTC5$ZIb#+#qSD>MN&{2R_!R4aO8-~6Z* zbbd18NBog0uLC{$kjcQYmOk@@LHfl5Z6l2QHZCo$302EM8=~in-?O{+6?vHrER3eh z5!z60{k(Bj<i<tHtXa)C;%+yi#Ylso62mao13tr+ioA@uCzxGdfkjsY<uu+C8!oIY zw8_hp?E7K;fLoF`yEhK0q;L;1(8@M@S?3~r$p(F5T3QUF0-!<^xBe#&`fmEdndb;0 zdTn4)G#w_<0vqN9wc>JIpwb2TqXgx6K$F2JJ<J)v@Mf<>Ecqy_q|Tr)<X)JEGh-CL ziW=7!wLU$xTcL7!;Rd&x4jn}AOR9V+(f6ba!zz6?QGij`&Kuw!743wlkK{#v^vu3q z;L!$t<h2sH{t@d<%N&6{su{zuvofatL)kfK6j*6~{<~jcnAI9HMdNM}9G|~dl6&8S zX&DV4N9WBsJ}-}?o!Cb2e2_s%6UW1Ds3vz?*?O6?SI0g!EgVxeEv%8<nP^77b*2Oh z;zvu7Rxd20%kIyS7Uyog##I`Af)dH^jrZT5^E+4kFkM!F;#g-Tlo~849SJ_k&a|@9 z7h~kI6G@au?!o#B)E7T_RHz86FHM`@QID*?nDc$4^+lL`<V`N~o$2?MfRglZPG9Q9 zOuurG3-id~SnC>yh@J!?gq=^CLBK}@Ba~F>V-yJg$p@T$(@b<4<*w><qFm6LzKz@e z0VB)Zu4?c7SXH`Yph|(W<dXrzZ7pdupJ<nr%N<YJOr*;^WZjHFhf=ps2mkrPEZgiY zU+o_TIorWbiGdOZXkA9k=2xKHW4!Hcw3eh3aRf(aR-0vgC@DbSG|L8_GhgSs4{3y0 z-nc1vQNQmroz2D~aV~hHYttqzLJa+W7R@dOZ!kk*lz|9Q&-`V1KwF;?uHEEdy{zMz zv-ySox=4NwPjv1(%XjB~TEim3;--z10R0TGtqhb+0Xwu)7RQPUv0)@SOqR-)(lOAI zAoLYWKMbw5LQG<CW0`gX<C0n=XFCl2hssq!rKn7-`)^rQ@dKRhgEa0_mCo)tun@Ms z%A<U&S_Sek5cfZ^ZvHa+IpS~q>37ZYL0Z%oFL!G4)B-W_xE7z*b!>p;@I|Z~FNZI< zy8%sv`-MXJ0=0M3H&XO&s9auK#a>`PeTr;#+-|ZgiY&8~&F*_3g<vIJz63GEWt0UG zyB@X|Xc=+Qt*12VaqI`V(zu%Szx|JQ0|OsraoF5sbYC86X<^?dX67u*1oxGTxY*o7 z5xbPx#B-J2fnZ!YoE5PB#B&ra3ikav;E2aC;=rXvzlfL#fq^}K13e$#Kv{0#8GZ-5 z{oSQq{pp~moPZ?q%=jiCd8X-S1!^A!`+8^;Q;$uQ>p>k`Ce*9HRknief$!fd`TcuG z>7N}j5M@e-!yjwXZa+(;Bqj~xk5f^gW3g$xM<+RtoyP-_kT8TZ3`wnv;#r~ACh5a^ zTwzfhXS&y?UY=-sH)<Es_$48)^h+?C<csvsNn&W!SX?&mLvbsJ!kn<iQMlKIH0uB^ z;R6^QRAlxnt>eWtQdFc}AFe}KHIj3~Xd`ylfc1dAUvcrIh>l>pKjWp(%4T~T1pfK- z7c<ye%$G+kEo4`<UE&))xOww~*?`K1>DFu$CH2^m!;#{Xku)Z!dZo|Yanz^_7&_I3 z-I(YP|JOP+T$E}ntx>9-3}da^|GG5#@{Of~b+$dZLcbPJq{R`+lX_i93+vpXsNk5= zB@9R;9JNx$FVukUxs2Ra)@BvfF_@=&zi?$rT?Go8;7yr<h$$m*gKnIIV-aJq#$&bd zwo#ee*t(-K-e#3VoNe3)!@-<k*KO=D6EnzTNNfWX5M`w=Zc$|b4}~)TT&Wk1$}@-F zbh{j3h5~Ay`Acg`iv;?rB41>6u!5v2K>`rW?@FM1@Ae$UWnV}9CP`+4A2loo#Xg<9 zn!zYM5KGJi981xh4xw8_mI+Jv19m9IHo6{^)%?y{yTSgmt~tbY==CSJZhh|>(hOx< z9}kL+eZm$FBIHvHM9f{%+EI>DMpb!kW{y`tX2@Zkr5q0~I9hbMST|IBxsLy?1Ue^h z<n0}(0Rl&h?)0K1f(%?o_9DnQy+TH7u_`>Epg9N%TL}2~2B=PUmP2+d#u_wzJOXut z6>#z_+6rMl5=Ln>7GN-HSu(MCkijAbd<8_JmfW2z{3KGA03BRPbmf%<wbe|CqM2@b zU8f&}*@j|OpOG!E{_`YPd=4Dt;|*-tB|V$vI|hOj^3_9C2e!r*KP;ZhM%jd#7@m6h zIv2`Z;KkBu`pLL3g115_mHb^j?;p3gnZI{20`~cg*Q)R6pcWfN>(}-TO4dRq6pV<u zngX#-rpFh<M$SKRmR#4ywhvyC@3Mgt7DYWA_|3KQsem1Xm5%XeNLKi`mACuEYX4Ox z@de!c<l=4cQg07|FxZ^8_HV`|VUCAFwqVyuu63NpqCCsmBVvmg!P83D-{y23CXq@L z-L^;EJwj7rlR)Co5*5cI^ip~7AwByAHjj>8J+c3?va2OT@hu^R<YaY|BH;TMoP+2$ zOz|oQUyDE6vv+vKuY7heM#?FsUo37e_Vvv0iL?q2A15TyTx5m=5-AM{=jOXl@X{uD zOi2N;wy=_3i?)?hqD(Cw*hwN5_Xj8Y&s;xIIx!u-45ozP|61YtTP)tO$?i#Jxfk{T zyRcv_>mb&?1IRVV26f?j4fa;7{YN2QDqP=k04HKXlK&qNbjLDugJ@@NTYTlh>|qxD z$^c`GeMtMs{}7TtNwr40?Vb)1ff=`nY~zRM3tx<Yj-Cs#VynIg(*8;9DzH-#$yUst zR7Z}YUq3fEg#kl8L1{MbO2I+tvyA~3>;XNmB@vdiA^*=@jflkgwdVbeL1Ku{-?(yd zYwL{qz0ZI-&R<Z4-%*YB6uf$u=ey}|_HTqVChr3Rj*eS7ka$R9c5i!_-iy*E8eDBW z556nJ3wHqRTaH%l6g9?fm|${kB251MT2$BFJhE4{82lkJTVsS$8X(T)8nFCs&m4lA z{WSaX#o4D@17Jcd|NQzItze1P2)A7YiipsfFJJJnCJh(sftgv;Z&<)5?jb{px8wgS zF5<AvpD=r$S)C!!(`>>$9X2vEGJ0O~ORAu$nci0T`rYiHY_A_%?}$rxP7TBXq_se3 zj@}EIqOsS@tIv|bqNp*L%z(|wBqU$wiEFa(3D!N62z})_Azrv!pz;$}7d{8lHiXy< zkFCzagTj>lBRH|}2nf-zH>m6z)VN!4h4*lgbLgLZH!-Po4XR9;cUzLzfIUOWFM05O zABI`h-Ys(^;*5jKO=l>kSa=7Xz;elxKL6dCfGsCHHq_s6qh}scu>Hs4Mcn-uSXL~0 zfX-;{R~-3VU$v4I5|AIy=csyl*liP;mbZ{Wos+f>>13dy^oYfUVeKW8TF@POvfio~ z=gkX+XEwSIN=%sQhO@2lq>Irw?4*(NJY*7E$M;ut9Igpy&ddTD^aX#-6d30t_TD-n zrD^FvyGbo#4a`yR$p_maYa0`o|AI~zGVTHV7q$<HR4uLSxJARJv6mMpi}s5fGA<bc z&{&Dp=Q9BgKzA%h6`cug0gQueYq~TsXa-T-8Q~GRBb!7kJJXF|SNJH3PvhZz`J_XK zn#TpZGiL|pUsuP+uO-*>g$kA2N8a7eQtG?wPy;SKY9FBjBV<@4x%&g06}}mOLdy{v zmJr&v_G-jFYoC;Xm~|)1CeH8Os{9A`y=h^LpRQjLh8<R-ultB8WDA1c1QWMpX#q=% zs>*MIypzI2BTyHhVH{@f-AV~1o1BmDIj{Sn=@_SFp|#iYM!x10?$H?;3PNkYlHbk* zjvN6YT0`xVF@i@ZCRneA5dv_CNf{BgPv9c3hU%4@g|Z$F0s^!O_26|Nh?S`byr{s2 z0f1?iiMSxJM$o?olMk@$B3apoEbKFtU-DXh`*^o6S%10p-vYen1I5T$Dft{C(<dKQ zveHPxe(_q;H2a83?v;!ov4fu8e)^o0@^C+{YrUm7E^M^y>^bRq3psZw{u?<-zGUET znUE&1uQ3aGvbloj8s76b+p9Y-ZoL0Vh#7uc{gqMe-66jMpYOi|!Cik~*9rFx^<zRt z<{{HQ+rGsM^3Kgud$b>GxD%KG`b+->xQG7jXq=;Or!BJ2SphNg-n|{94%wwbMh9Ft z=eD9T75nFpQ>I=m!}V@K(}5hT05WXI#9BqOpjT=k$i2k-vpu?hD9{z*!Ta*da`ChO zy!x9hx&as=*ck<Ota<Ds+wG#52!l_BMY~N)8=Qwjh?|uq79aGd8mbVY(4*u>m|a4A zVId9{-jMuatR&$(@b?kyj#va+S5`txvuIYDyu^)hp;oqf4<03azyHvO(TAod4ZT*M zg5w00&{TS{rHg*DSq5!>q?q0u_xE>U=>vdiKf#%55fDZhr%q8{P#SbC6Q$tzMwKyr z|25rhpvS97M@y+02)ljo0fF5&=&tMaY}7Z-51BiuN)=F_<Q|(&x>KsuCLLGae;5bU z83~Tfr4FET^y8+m;OZQA*)Qa|<Rmsbf+W<pq?t!7;RP6w*pZA#rFjqvYFpB?kyyeD zK*{eSw-LAibSaBP*bPISW0nn;?PD9VHgq1loqYq4krk9jMG+vyJpNsjqV$RkMU*Sb z7<4@oNq3YYxadPM9tZ7$kmPDPyw9QX$d*Y9yQHNh<l#Z|*@Mj8`lw?$qRP;7MAdk^ zMx}aMqDmf|c=@Yi*$LI@>D9FeXs>!{JwkWIAoH`LNnHr-e(BNeT0BzA<NlF)NQd0< zg}3Fo>+V}OS4eYm`xVu%zpAd>VCxTJZrrVD(QAglJ3IEqc)%VQ2RFyEfBQ|9@o{`* zsNyIz(<lPY3&r6w5tBDC!qILf;!MFh=?(b17fZY=llL01e&wg1#4a*s85=MmK?_@) zd}F50#0C>ji@1)|SN!Z%^S1W0NB>Ct<LJ}v1L;?1`L8ltB!)*~L7mOnb~o$6NVi_J z>!7)D;QyEBrO&(k|NbU(f48X69r<YZ-FFYrZCHi~HEbB{hKLDV%yA}qx1sawR>ate zHi}Hp^^-S(`&>>hz)T3VBgNnuX(BV}`pFwhY;jMBuV{-H9yU1)VTc|gVu8-Rnb1V} zb!@@)WsZYjmkhj#bVHZU44boY+Cr47PPwZ#`LgTb9k1xoe|nj`m<KX|7M4QI?cR=R zkCTR4aX2qQhyTQlLbk@`H47;s@JKR3btzeCMre-2RWwPZl<79Y6zU^Z1T0o4UHN|- z9ahowC3A7bLX9wu5<6z#8v>}9G4_&Loh~NXP)lV{?QMlY8jH{>p}0F9Uun%S79Jrf zxIzgP0F3++#q*?+?j#`lhr5ujN>;f|&#2)}zpQR%3I&yx3Cd<;Hfs(Y%>*1WY4R<> zsw6p*E@ru6A2p;1DsCgL)X@v%K-hq(#@!8v8-^spap|?a_OA8P^S2Wuv5lvedYuTx z?8E849#WW?_LAjpvZUz>jPA@Et0kzYsEqE!f&fhbz>&_fvQhy64M3cx<zbf6%=DbO zKz%{&ke2|CP#zWvC7~$Hl4hB-ggs%FATLRP7PGKp5KDPqfU#v{6Gi~6VP2Aj|9`Vh z%~h9Z^foOjUyv&fnrNR>1v<Wqgh_YK;kW{G0WbP{9?E;Eb>Z#1H4^tS#^03_J)}i> zeH;(%j`k&f{L%=J#ogu6#2dO6*)+9SB8~&*rD$A$KXa0Q4snl}nTX8f%|y)EQ9|S# z{|VFA&&EO6JT~}2+mArCBa=dsnN(Vk@LU}O8mx{9qcoW;V;0ha$)+Fwpx-EYee~(P z>ggNO_XU4Hz_AD5uUntJ*z6|L08&Z<Mwc&MFN?1mh7mIN9g3j7ovi!sje>;mZixLJ z33s%PY`)gkwJ9I)j9O;U(k!!fNViONVvj`5$Q24_AjyPqEZJ_bX-%z0w#5V-6`ZL; zsy<b;<+jDAH>zBXrX$+K$Y)kabpoic(9-;sh0<87tF2zj_f>NNpla$ONJ@@GVl+?@ zS_H9^`RV0lPh}D1u7XL{qy|ll<qhfix4C_ONIy&V3vxeF8t+gWOBdb*oEU~xn>I0p zySCJ|wU$v^cFC=6n<8D|_CU9xD{?r{-qqCf@5;(M%k%svC!@6F*W&E&_$8%ib}?o* z2s#@>8SEOHPRkO63B&Xl469+2T`-XujeV6$hayiI$jB20tZbnNaxdZ?yUA<0Sj$K- zgCI&(>FLRQYbH62P;!Q_x0({HDq$$otpo_O@PY?jJq-m!f7p?LU}E_wyikn?FHA3> zA7f)kf<r2a97<1r;36fT?i8hi)dFoinN!17{<KnN^zVS*10PNh^@%nzkNuML=+Bvg z+KfB=k;Z{jd0k+s`59iQ90LM7W-CI-IGydZq22~Ni<jIEr-H`8Jo~si%hZJlAN<~D zS=Di3BYRGfEw{x>#g&HrAu8-zOaFTwe(@sJ_1Zd&_?SODR(;3DI&tXnSeG}dRDu%P z+<k7YVEms_(uA+)9%sVts5^+G1NlD0rKOhB9Z^CnOpGGZjOT1C7My%2LZLJ1l;<B$ z==A#WK}Qv<kMV+For-y`_5mumd3PSW+_lgGkv`RiuocoSK3f`__8cl7E%QMC263lG zfzTUx2VJDG!WcpUPXiw*q|ppFo%h4R-p(7c7T(h0TQgW0B@Te#(Zf)NUJ3_)y8iFj zYD}M*y>Wi!6)_IL77s`Zqf^0~()M}I9SVp?j9(B>fHIm$ky3egY-0>AEHW5i^Pz+} z@e|?cA;7UQa@2bWl=FTNrwQJ=v_NE>J`oz?M*7LxCV3S-7>42V(BX%c@{%JXy6c*- z4U%H|&<Me*b}2IG2qx)8z}7_~_e8YV;a8NcW#wEwKv#0y!F~@7z;y-y1EC@0C=p=@ z)!r-EQ`N3&@9cc{Tdop3uw+eNcv}ZQ;?C7j?(C$ISccZkmVGO=$eNfO8%Q`Dq`HRz z^`v-Ztsg$sn)St3$)1yh;Kuwg7tqGg{711(W{k(7<y>$9=O}_PdwC)DqJyPSqxn8s zud#f>`u=MeT~j|~^K>;?qHo^(+ENgj>uW%3jGer?CjBuwVImyryEmrJkEYN3G3L%y znwg7;a7#RuTRI;0@MQIm=-vaIdt6b&<32ELFtdD}p)Cjq&1b7Bb9g0)339f-poW-H zvklI0usR)G_~Fu>`D?ZXh#MOcu;L@X+dcKh-t9oP>;(7J*p_`<FeszgtOL{jj$_WL zPTJB$c`10wn<!@1nC7A^K+NoT`tgY^9sS;<#|LIo--mj_hEm_b#cBE437TOg7BGQf zVb9F>v<Yo~+Tw$>QuW87sEL6v4058y?z1B35{Ka<tm%O#33F2TsEplV87BhdI&mK{ zQoJDXOb(qX8-CiKvLDV3t4?EHli{ENXiP0b4)%dRW$sT1&k~1z{a8Ie+uw7RxV4PS z=Jx^RUBIy{#)RV#gbxX9_bdK~gs@jmOi>$9bloXZjXc8vtSbm4bdEKE*o7IoGt}IZ zhtc+g`RC_bg11^MEOmNl42ysB7o;r4IVPnB)><xfwN(XyNv1Dy`im^ISggG59CrF& zwkPhfjlW7K0^dS>68yMU1mH_F5O6C9O0HqplHHUm$t!x2$P$PSIhjZ!s8LpD6vaT5 zSZ-nZIR9W^%<mW!n}j(8>BAG>V@Ei7`AQ~iFIpFh`d(s;0Xh%{Ez>ZQ2X|adWnULl z{5DyXM1+kuHmuql0PqrqNI7n7W=7_+Phhz5#vfcTDVS^<_&N3D7h(KwnXDn*)!2UU zWMi8xp*|G>xygYJ2=v{5eU8u3ZbLA4zND<$!r4Tvy#9P2<G$t53qtwI?)t+oTO&q6 zyGP(HI{M-A8qoc1)MnlUuYQOV#@q_TzkkiPp|_Q=^V@A;jj-C`8`h=mSy;3D0!sfn za7N%0cVf-XL+q)QSEkXqzwZeH`8BSbg?XFNyDST+zd?*$OsvDb6}KE?RS|i6Vvqj? z-E@7~!Up}V->VweCDx>Hv+8MXF%G5G8HyCzxwwVjt*G~<s;n|)(0fqKn3pKX)alv@ zdiXq>gV(?(KtJYnC3okIB_|Z~=UG>zmm$REh4f@`Q)&{|HCFw8i|^Q8=@#MrrDAqI zT3&rgCdIf)*5Ne9e#c^5@Gf7+KJ=mmHneyy9Xl*rc0=c9y$CQpv3^aj9LVWIUPz*f z!)fXZaV~}OHA=Myr@i2%@gy!gS32~ZLC7ViKaQTy-7k_FY*@Zj6lQFY5SRIXSba}u z{k!#Gn-@xTtjeNJ8;3WV!JQABYF>;Hn*VSbJ`K0>{*|~iSA+XcL&vGxo{A<{Q5<}F zt(VF6B=UApm%bI9cYR_zWWx`T35SQ86wN@7nUj_n)j@ScC8lv^X9%8yH?{7hlaP@W zMutI;+Pv}#*#v>}ONWt_w|cw2{m=_wetOE;%~zbc;eh5q&o1^=i1W*SO$qtTe{;0A zvu-a?A6QbSB^FO^`SqCf<ZyB*-Y~zl^+&0_Q4z^W+E94olKzHDq8Vj1sa@EYc{NAo ztWKvLw)5gRli)<RT6l}%B70A$UVp7FYw$jpJR<O}$Pw3;`HZ-gZj?rqpXz&aniA+% z^h}JKQ`RZpR+x1MnF8(f{kPPjhe)AZFXu}*1lvKzL4KT%*b9F|%w_jA1v&a;S!C%$ zugY$Gg%lL06Aw}e9F{NF>l!HfvN-<1GCw8M%L@?pma)ye9bz||+qmxw&whT4bVOdL z@e=#Q^WK_pt>iw+R>3^C%Cuplqf$X%`tZ2GAb1~ItccA8@jlwXMXyLgzpz_ej%AW- zjUEM4<JAiOaO4Y2p)@s!Y@|=)4_l>g6>oS^R+yJrGYwxXyRSp+fR<(hdRw!Euc{nw z&x9*v&QN3n&=gBQhuK_vOp#YC-*S}VSW}n4*UXeBGbPPmN*CD@%3cO5G*^BYj16yC zky@kfYYKE6@~la<Hn_J-^PJ(agFjr+C_G*kkmBZ8<hU|04|Y{O4C-^>?=(M}Wu)t@ z#2+xme=jjmb#}*Sn;9R!_2Hd5c?DrWO7^o6rqmwRt?|>1)ZQGciB_3nO%ShRtg%n$ zx90noa#@+$C?U#D6%3>RV9O(v+8JRahomNuK#AW;u4q>l&uLp&`qlQ*g>7?+!Jo#$ z1E=3~P>$h-doLHeH%F9wt;oPOQr6L9f3nm_Gx$3rGxe>lsZ}nif4TxYfvZK0?l4i= zm+Dg0cQ2?l84;r3Gy>G9E`bnLv8Ut(npVb5WraK>zUZSpG_NQSt(mki4<fQ#NmkN} zV83SA4N^+MvtO4l@UoOry%%4HZ+LETuc@#o3S4Vy04N1Y6vVdLOnGf7nO22nr1vRv z70DC4SM(eQCJK#BmX<O}hEZO?-h6Kce_=B6f=GWbsHh*|ed+#rT>PDi?EDFn@5>nZ znXKfJA0@Ltj~4<+@0oGQ4wOG{>aOs=!Bx0M#MYv<D&jt(Qt|*l(?5kqq+5OUoW(S2 zA(56+aT@rYh4~<-Vjq0JFfvO?Sakk7R7kTj`QH!<gk-|)*_~AfA65$!aj?2Z4G;$! ziMMAnyC5er*J6>(nzFg}vQTxDgD-@W*8@o|>P=v0!!H&WfIpH$Xk)aH<n|h;sj)=o zveX>zPu{eYf&Bc?c%k!)-0y<D2+Mks5w|hv1Wg(`BE8|B^ufxdO9$Nb2jlnZCXuVX z7yn{G!*JQjnWx=cmmJZigcmvoZjEHB7jPkQY3~hGm+VZ0S8#V_IhYVe_#!MO{PMx5 zy2%Ju0o<d+ntAMwkdD)(A)_w2f)aZm;`I5?tXyScp*g@`leTWcYJ$PdV`TrVbHu`? z5?!P1vri7jbZ_$U*|Y`Iq{Qf~vl~5u47&K->+H~Q|K4|-{lod~@cLYuK4vv*u59!x zbm1b^@;{=z0O)WyIr_!_;xf&FoKAEC?&S0#nQ{LuC?kiTUJsYj6o%97k=6_Kp~!|& zGQ48(iWM~{Oy1EDH9vZOBy=RryZNV3C#fl=qIci_IdJjhIJ=hZ_RZ`kguVb?l-ZvV zp|n6~;q0j=X&q0d9^hRoj??%)khDNh$}m?rC2>E??Liv47Dejf@yye1a<oV56`ElV z;C7U^y@PumFC$dzRZ>O{JI&#1GV5o0%I|n2L-!R|Q*A1?%`0Nad)2CfNSpRm%yp~M zUx<lH!Z|k~zlGEwpzAh$E5UCEuE*P=8U5KUi&Z(^5le-&&K#7HaRrGKxVI12O0IxF zl+0{JXOYB7Dikx)Yfg0Ry$BC3zjs40w!B(B%Z9+Byz*3ed~QnQpO8w~yD~c@M&u-{ zT2-W4bD`m?h&7wp#)o5>cze~V&HxG~3-=d#6p1L)2^ki)VShUjiPxR3N{sdXlC_eX zcI6Zs!DHiv(iXh%-wUjb_c_iEp-6OO7R!9CLCif&z9+1ZE&#iKTE0Rv9gYvUt@}}S z|Ca9RN#Vy<>rT!5yWLJ7!(OfaXi^0a!JaA{BKfu=LRtLqz-zR7nMRrw(k6~KK75A6 zGF;{9<#WRZ*0!tgk!K0vET3DR4myI`^k8nDG05i&l5Q$^-TR$jN9mF!(;mum%Yobo z+3$XAjgxYgl`UCPM|(-SaWixhrS!nuzX?bZHaD~cZVv!q%$>8&FeGo9q>LzZ0inM> zUcx{h1SrxkM_?>B*twqgW2p(U9uG+B(Xpuls&i>kTpBAunPLx+aoORHi~Y2ES&>%O zpo9fGQqZY-+N2w5L}W}PXO)xT(fEu%+^TKwebiLre~Lcc&9q5v<yLj40Mifd{aO}o z04y&4sBKW<pK@E>Y_GNz6s-Ke+VUnCGEUsDt;I#l+N1v3{Fi7v`Lh*{eZ-Mq_a_;t z<A^aQW@QWxqqt`D4c7QHDl9f1iRgfXyFUUJC;W8Ga;qH;a~c+G1|1$^su37l+@!Ld z!P%A`o#}Z$HW0BQD2nvM@D(o~HF0Kl%;uQ<b*K)k$}_lGdf@0kcRf{ly_W^f2iU{b zKfiz7L}cpagJaZ~ysfIOr7_fZ2A9vDKPPV1%q_99$|iuh6nHi35hre6MQX-BKdxVp zm2u6)$L;FmbL-W}Pd;nG`XB$vNUhix$Ek9eGc8u=Fz$$*HsM@aIA*6`HRSMtP%qA^ zUO&Y_h1+V3;CA}ZS6xkRnCGxzEXQ*y%xCn7(rkn6i5auE3E7^HC@I$uldZ<im0ACB z0{M>wF*^A+$Uz9BM^3deLy&YZ|9VpBbp_@y@av#5#uuFAW}UTls~p0+@j|}d4&nW@ z9vV@WCxbp_*`Gt*{`Opy3Me+^BuUsq;<R+9sqUA{R6#DDwknCI-%cU}Q0CjG6AdPJ z7xr`H&f%CYgA{5BAIWz-@t*kKA`%SbKy`Cma-25mdW7`3Q3Df_)Ln@ybj@>zNnrbi zZ(qN$bGUCs1QSL8HK-f;dDy)*GRg1V5RzB(;a~4Q8(JZHq|8dD#lCMKGBvwb^bPOa zCuAo7`~+T?l+@!LxDx-79j#+>`kf@+A#!RK7Z1%OnYpqCvYP9d%=e3c9(HZ4nU3N@ z56xT2gJi;u4?scFqs*b7;>JrjqRGpx6GicZ5Bg)^LlYO+&<j=@4b4wX#SlPNdFQ0s zhF>e90^;NjUL|R+wjETA=;h?i$uj=ow(>m}X7;?L_&oCScsP5mQRbCpW(wx|)*6`F z#)O#o_z_ewlyt@`e~`cHi6(g@)=Vd{);G7HB1~32hL=^sV`R^bUJ?gqZy4s|RH@Hu z&BwK^^8~+<ufBe=%Jeor+j^e^NIGtoF#t>|w1GmFC#(aJZk?-mna57m>(6Oog-oV+ zdv7cTcQotHYBB$<TP#jl^soq)>+fL3jZ1jzmMTv7?SDOP^v3n+=4nZjo0Ma%t+jOB zQwK4sTrOu9Y4L5&W>u_H!QUj)kCX8eK7t$0{4|d0ogU0r(r!SSot^9T6S<b&ja0%c z%$UqPQmMLAe_OqFzQ<^Eobr@5!aA1c8o^uDQ>bd@_74-!Z86$WjX%qU!a(!kz1P@= zE$Vs1okYY%GB77HE>_e;8oV+mi%|^K7PC5b<e`>MALB9iRkkgs+}dV;OlqJqK*Ot2 zn=-l)-P~+e{34J_61JXXi_{HEE4Trn2B!nnUF{|D?nsWXKg!EHvh#fCvX}94GTx>% z(yzykVXM)mkv1t>t~%#(Vm2;ZC*||ca(lg#^VQy4n-$wDNjlllMDq`~SVUOxvN$X^ z+|~2S5n*`i2Xo@+C<&)%Wv5VVHAa?tkEEHz$<}z5(q-9Os)M(_JMz6VO@Q<Bg5&g} zlk71ec(_coLha;Q(I)vwLcpl1DP+f^FwR45^DdIuQ^K9N3$tpN7`Iud+k%+~J6sHR zz=k}i-nm8DA+a5cj9*amgf%u+B<$a}agC#*t(!HHguOS|9;@fAGk0~-h-h%nAdM3i z_g>P$J?5-Yu<B9WXqMR&8&kzsP(|QDGg%O{VVayj$+dB-MO<#);ZVb38F*CcmL99a z7pv*V7ez?G8@BnRJhs%QbIqw&7JI?O;h6tThvNcyrIpgNV!HnOtch@TF$QY?0s4Hy zs;({YW1iAUtKKkqpS(`q*RJbkeT~^V3=FF#T3_PA1p#<qfEt4J_I;}_xbzb**SSxz z<`FbgmS*)ppPA^E0R>rKo!GX_;=34*fgh&l2(Pa%m?;?Rxj3N+yP6UMgzUYZZ7FeC zcM$!xTV-WOkD6q?wE=>qk|NyNE1L!RO3`V}EFwv?yp~-DG5UC_BZMi7kwQ5cKY+e9 zAoGRnvLhfiVD`Oj4%lRSmTbr!6GKj?qdB@nY47<Wt`DTW1<KJ(Ni*`8u~no^vrs=N zm$doWA#10uR=0#&dRoO@t@<sW0Q#8Z(=GbqPI29!G`(X|(t8^cSZrx3H~(U8Y?^8A z+>SJXPONCKQa!o3I<r|^>Cys*0YR*!T3jT`QEMm=ExLn#|5EOe<A%K-8g?tS+oE~V z#ud_nvYr!9cdd;UTWTL)(vzslt?oVY{;u3+fDFWZ(O2E^8S<NRcfEh4*Il7X>{)U+ zPiD+p+x7H`o-&=ZcAqE`@6;-HTGra;n$mhJXo0S*W9}UP?%dq0E$OCGti-=F3w7d! zBpZjbMx9-wRtKaODwvrP6%6Qx9a*<`>vNb}J7bUU^8yN%6JC0o%WY5FoLu^~G*K@T z_Sf3t(qyx2-0`=61P9223q?n2ZJbF~W{a~2h6Ykxx#hLs{U*p)f_rVJAwh<7RBGvq z{!9=x)!V1Y^{N1}S|1RG^wJ>D@eKI^?qx?^B-|Dr0wdW)6A4iC(XHRETLfVQHC%Zu z>6#K4g}1y1#$H?O^QrJVkx~6W-38^EH0>Jgj{)xdclYp`Qu?d^#FEJ}@xJ;<fR`VQ z%_>?hsZg4hkK?r_&CB@P6mh4%+1RXiy76@Vi>K%wu7~L{Fb0m{WQO)6?^Gu;*xr9B zSuWugIEK2TJ)h_z);hr0U=-vFIw=JEH@N-<R72W1-k6P<gX55Ox$}2WdYy>BInQO` z$2JE=fK>a~FYI$1Uq|AJ>5eN0#UyVopn;Q56wboI5wE||!dV#0xLdrB&O$)|M2LPv zLFSXcuvlx%qZs30Xu1V^*pyKFP@!3Wa!L|yarlgyZ@D^NR<?gi;Db`9JXVAEO%pPA zHj^%-9m0SXP(;T|#99tJgbK~zew)+i@yp_DQLaA>v<Kl`dz9v2@5Ran48Y#ok&!Re zWFWqp`v-QP=7)JN9sF{PjJEQ$lPTJ!J2&M#8yFcB!_d(*75oKkC5mBjZ%BI>q)Bm= z(q)%zGP255G_K9%6B7Xk2@i-awnv(X_}@WuMcdP~9B!X1U4x#*)XW<e&37_%)RUdd zQ!M5JouuaL_4vWH`{BWkXbnen5X3HJrDBcnp^ca^^N<KDwNrA8*s%1g&i;K0Hjcur zTU!Y8R9AEk$2{Rc`R2_u@4?}oJv1UNy?1Q$yiqW}hka*Y^+2$=SkYfrG}{b;m}m4$ zIOSRmxtzSi?}*k(^r*xwIaZIaQ{O(Erye$x=kA`0?%t8B9x*K%YFg=AExZN_Zssca z)ED(v-etzR*=}8X->~5&83u-pYgQ16oT`?ejn=$!Y`tWQvh@+kOqtE<(RyY|Zn;O< zeA85a*T-)wiyVV%-&T?|>?Ivr`pj&l(uCf>hM+QRFs0H}QR7!(iu)cs!C0rYl(;9c zPv$=xXwSDKjwTT!d>+g1(}q8A7C#82DhPEtqvW;xnNFtDKR*xjd39#qZ!FN$^;F+J z6bn^%?f7ke9U8#j%m+@UI5cd7;S&qkuj`18sVz%@H}>HBTF<oqrFS|?wob0{e%@Ja zOViTkrmq0bS>7PB=V#^R=uGKFR$eZ=^$j)RDdOzeP*GRdEyMoAF!%wtTfuIRMurV5 zC57IWzlUE!WC=c2-;<=usowhd2RmQTcUG8JVcGWEcD<`PcjpI>Z*^6ul6vY#^JRv- zwS2dKqgO9Eo4KTuRqT57ku|pTw6v||H-3=xlr4L5@|ryJFv10~VvECB!>tl3*v?<< zSCPeJ2@n}+0XvX;J$&?J*7e+hpWn%NJ>A>;9PG}w!pHZPdh>jW!mf$%!4oyIZe~~2 z_aT#XRx{rQsajR^*;MQQhxoEv{wyMKr4gUEMStNF0D7uB8j%`!F!N${V~neNU-?)| z4)htMc;~ZQRJ0RqCRuoSG_5Pw$~%o9$^B+m1E1#-oQ%0`+vCDD?#hM#DUI+J+sb`{ zkSxOjTNk$Op6k6@d=B41%lU7CO86R=v?XcA_mPtEaev*-FghZyaScB{9Z8~|>!zEe z<NQP15Unkb8M5${ml`uzEHve$^ezi$p<nV@fiB)`4!!Ee5yh5nI#KHn<B`Vwwt;I~ z+c?p*RtFeeMu7}AGr^bHhNy$~SoUcb50PRHq6%Iv<QtrX9q5}7HOqWFb5KE~y8GS^ zLJTT*it|*?S!Hs}&ADkU#<(p8;H`19FlIBZ+Ix(x01#bcjKyF8O3-flb3hQYI4|&D z9!x;<DL1NX;9Ib-CSUT2*BTulNpy~{?uz%%y@8f-1RL*sH1<1GMHkZ9b$DC$>%@dD z>*r!lzFq$c<`wOS!L0X<4Z@BOFm@3^(@?y3jnnyG)yN*tcRa~X=WEI1xo$Vix<5W{ zV&DB^QQ^9gHkn&#ofurLTUU2HO9|11BXkYEc2*=~&vX~k?8U#OimK&_w%ZlxwL2aH z*_t(8*Uf!1@RMki+b3X8BX6~UbrHowKRF2x%Ov3)<!RUbBTmoYaqd4yoPm#fC@=L> z`=&_}TRj<5BrUvf{=oCUPL`Eq?d>td(B+cDH^fSUW`6xAzm9ZW!XE#Ghu^6YgoEIy zJ&HGGLW~OSoWO|5RU}TXx=$cSU8_kI17$Vfk)D};gP+rTgd82$C-%jCLWtgHSPb7u z9MJgKZZBibm)r+#`Xj_B()?<6-X4!#s;06d5NPsesqyQC$7eKLiOLNQf@C1C1q<S2 z9^nEpLJzuVh0O!=Sf$cq#IDpZHCHf(fo%~WqzR>BD9AU-J{3{9^C|y}QG^-D$>(9- z4Ak!(^>(?b=F9x$<p`t7@T$=OTHzS2?<!$BZ{o;>;5?W-Zjb+GVpT}Xn=R--E1_aN zK2o#N;+-!>tA+@=`Z3Z(GgH##9nGsigM>Fj#URTkxXX{yC0+UFy?!*qi{<&D573+l z?#l`&n^^5SijeQ$N==FrEy(7B%Jk#W93&*kADiGN9>D;h6$xPL&wK9$+8>o{Rp^Ez zDCte_!d6EBS)Ctjrn9XSn{1wROWbG5@`ub5fRu9gvzYxrp=A*~;z0<sG`cBL`VK*C zxUZSqNa#;fHco0LH*CpJVyRE+^r26vae^>36GM`U+VhBRyEA6(6gx-EoQ@MnPLyDf zCL*x_5t;clL9Y5({CM*Q>EqDmWlx6n;ZH~-;UeI+A_IcW+}0tXNf9E>KM|uMZz4=| zqAJGI_`60DvLuO*METz^zuAKU;WN<Um$x}CL5e5ir3A{MIEp;nZ<x=7K#=<t^Q#cK zwuPnk5(0j*Zqc2J{0O_FtSsk~5Kf>Et+~YIAI*^v)<|+NLoLL%GZI8MhRbtFU_@b+ zXN|1L{m>XGXznlgg91}RW;?5}3GoU0a~k7~&nD7N#YrWKCekz#;`xMT)=w#{Dc%I% z7OxlHo6F{E=p1^s3)JJWd@=&0iAq!0!NI{eiJ#wQK^`fBGuU+cKNLJrSxOKL{iOj! ze=x!OvUgdSg~qBcM2J<%t~@o?P51_g`59oAoW>&VWk=cbYaT*T3C^s)q*#4nI&7=l zictSUrL*Zs5h?TPc^O89jbX9NHB9Ygy(-HGQLz--gwoG#M1Q#R`CX;dqYM<hYx71u zEitS=cnL8>&C6sF5+(?FKj8i<fSem?&7{b8h#pZ-B}7FSA<*xX1efHEt3HuFS#<-s zVN%Lm>tYld1omU0{9EWCy!9>gJBJ01TLMJls<v2l$es*766Ajap#(D20$VaV#hnKw ztitNo<nd!(<0I=*q)AGo^5uvAz%({)JNH07NJVbP?4G#WD$mM~Yblx0LO6vx^MDg4 zbYAb2ns<B)H4~qKV?T*wY4O8Kok}eENmxfO-t_lfv7VZ{O)`0bhZZ;J>guxg;x?Fg zB$tau`0~Rb`Q*J_nexEJ>!Lfw4fjhwhDe4$%6?4a0(H1<yw(Na0_LT_+J79xEqIA2 zj!~G}D`UYtRbIN9hHSwt%#mtR%xncW72mG-`%|<ZAzo@m7<Ib0&X<W~dPhuC{NY}^ z$EYwdEPlL}uDz0^wl=8gSQ=@9h7RFJSOZ%br1a`cACyINp;Z&>YqU<B!Wn%yWU6)r zkn#eL_*AJ)5P^aKGZbVm=HpP+!x}1w(mdQps%E(<15-+QPki4KddM;h($wI}5Dq8Z z+KWZJK-r(2YFRez9v$m3;wLJllZ?<YwAu%1X*w<bWH{2O9L6XRx~%269x)$Z^-I%1 z6{Rpv5Fp&@moC`BXBH0=1Sk$o6;Y3;>55m?gp|?0?aQ?+S4+>NHMx}@K6Lhpi};;j zhXya%)}!Qg=N;>0uw|mTCE~rl5S97k>g!+uAQY@}r+~E^_1BT<<ZGB&`&=R}xkI0i z6>^{vW4h_>r-FYV5WLxO^xxxs245AwWZ8dwElkaXUr)nPDu{g0rvF2Mg1*iO9_|Eq zk-i0<;6xAeavp>7crO3VL5uH8{_k`g`<0$Xf>abP$~7q_;yMml{SFWglu*krolQdt z*efH!Tt-XcQ7qHzx`lTe)esB$^DwWB7M8`9=812rh8a-Cm8}n&0MWUmzs#@l^VeO1 znrr|dGsDWUuL0J=?Asub8jeKOY})f~NZ`wFO@982>S~N1;_8ilM6O3Wm^@5}b@eh6 znS3obVR9W{#*tHW)@TnvNb4+U=s+vb{Ms(AA)<-v3lN+2gZTiou<+YsC)5&Y=@67} zq&P`~lB-;mdRmgU@s_6S``J5=GHX_SGKMBvQTslliuqC$R<V1GM#`vZucu<pwB+iz zI@0s`6geAwMLtjmJgv)`5N!tN&oky>i9UPoboJ==QpmYYCX)l8LC4YL06;*$zczXJ z&lV4ePt7xFcN}V`{dF+R1wSQ-p4duYTH!2y3760BB_1z_TZpI|T}R>d6K2nFa%0;~ zM)YvU!3*>Rc$^bF%o|UtV1Kg|)9(BjVPR)<y-WUl&0Syx&<p!e2vLvTl*=fo$`>1F zltiSdL@~pk$t~>axZ>$lh26mgf>!%yvuk33ZJ%;Zslipxey1wT;KY;mX?+dsY}?~z zo&q7)OuX7`ak3|eo6T@|*r31ZF5V*AEpIKbTCDCaS_*vWop<KYQXh0aqH`K1xDo`C z@5;<{5CjpKZsniN*9%?4VzDjfz_XP?+m?{Aty0aY0T48Z;W2t}S=HJ3sed4XZ*`yr zup|K=NleJsbP?ppL$0MB;w3~QLGl!AlRl~;5F*Y@l&yVw`371C)_?_&-x!h8t$N>O z$F>?Wd=sn4lLR0d1_&ryb(2EuOIE5udma+-x;rKoRJWAME_^hWlu$VtC?_h)oO#Jc zn}sE=6XwV&4VHqxZ9)##vYiuV<!&cf@`90R>jHRu3tYpoWfK;zd-$u*R4y}wO6B<? zAyu6f5DU>B=EhpCOy%1ts~nOYTwy3DtB?9vg%>}gh3KCA-^sIZc9_Swboa|NUmD(} zU~&0h=%`24nW#%|YSGS0c#*{5$X4c66L|T`{QGI#$dF+NhT$6i2wS!xL-=8z8Y9OZ zK4Irkes;^VI-mL5vMQ}UBkUrL%je!>mRw?%<SQ0IpOM4fQw+8%-p5*gC1Ej40=HJE zU-rU24^oj{6AmdQ>(WGrG+CsT`3(HZrW`Lg0{T<yh^*IJ+bTp-^)&*1`i@PuxM8QI zj`U09@Ogl8Ars0A{y-@w3wC1qb+tt1>#<9o-aTZxpBI9^2seSnoN#}xe|TegL@Uwj z+Ye`*ImA6QkcIE}?Il_xER8ly-<Nj9A=Vl!wk91yFzu^$f_$8<Q6!4B;qo_hc6Sbd zjovwS3_SOFMCX?Q>+p21AWBc4Dp$mj<M)y~>`ye+CKHxLroLJ;<Is?GM#&R9go|jV z7V=q*V)?7ER6v~~Q744^$*M`V7fz+8i&!tFyRG&oc|bk<fHj4<A;nu-L2igApWddK zVK4u8SCd5j<l+nsOh6VZIuJE=0?W|Lp^7!@4f7_BV{vyr9Tgt^^A2b>%AxeW=K;?P zCRlhIe>sMZbi1Myu}JCgZvsX2*H%;n{9hFiZF~pD(r&N+?e@L2&RUe$=3J=K>6^U$ ze#LFyy`MjIkrB;KgVg2gR8X$yn+guC?euj?hMk&`h;QaxP~}!?%;p-!t;Y80Xf$WN z?@z2+zEXzi8#_gfxp9mA@2}5oym5mD%PW_Qt`gnXt{%>vv(ju{nd8olRz}jabCkDw zriuRdr4<}l)mbCM?8vVCf{2qVtKKVp)St_Y-KMSmW!;5-bA#Q6Cp2ph-^ZWAa;t1d zY!l@swf_crY<ZVsOFE{P;q!+m%zxf1WD%+UiOX*thQPDFn`(;1GXD#tztGw}WdmTn zmJ{`>{y{;VTt4c-u^U95$+urBE=QzIE4=$@rvp%WDyJyPs<vPX-bN5e%y=Cl)0@6U zrm>(u$t_rNByFuI-E8Up#@HuY@_u_bV=$CwHzbajB;b<+=B^*rk<&5AzvAx<Ymb(Y zFN{b<-D^JX1SK~^kl_P&hJ((51*47wTG<>Qv^3L+G;gKrqJr}Lw|Jdt%%aCr>rH1T zv7F6iYw`mM(ctdsP8Lj3B2Gkfru#(o!1WNK)v>KVfvk)DPsmS!?>uYXImq6Sumohh z;s2x?Vi+scDp(g!`cHb&``@HCE2>m<z9%0ts&!>ivD@Tb*&B`3{rt;RfN%VfG%oKk z1A`7rW$z)$9M7>c2K+EfhR32M;F-y;jMC8g+02sXaH%W5i@_hKd_j;elpw;Uo7O`N zNg#u!F(3pMj1o8HPuN`<rb<~;!j)+!j;s({Hi4iP6q|Bjvo#NCiRMlQrCJkS0B9Hz zgbdzR4^lR?e|Dk`@Ka=*v}!#1=0*65vI`J)!B;}9jBn*QX%>c>R1G@F5vUe8*-k+` z?5u*_yk|fX#fkYu;$Mck#Fp$dO30livDKfHDb2D3qZomT!J?`vVWGxqDc8=yFKo@0 z;C{BxP_G>kT<hvg9CAKq0&tKQFn4YMC#vR{{^;B_*`5nJM^ewNS#vIRq;rAni#2n1 zr5&q@;@H34v|SrKv(v7Jbkjk9{>fO->&E}>H$Dor-P0mf+A!TdkR#qvr_<J5VcL`m z0pFq3)qeS9txoIU3lvHl^GcmoSLg6Sp(&4owkm1MW(R~KpKj5SELCjO%U#C>yyM4T zMqU3me54*=1nIwj?eqE{CSyPX3+!g`qLEp_iT#SNuPOHKQ*1pAoHtp$ghYBwGD_@c zH6{M}OH^f3%IIhc-upwl{`b+-D`lG8a?8}|(^Ho6T#any>CxZy_B-Bq`x`}G7cO}H zWvWL$d|}rY-cIt8X&B*`$}NRCIfa(;ld~Bby;suhLcRUPui4&sxK98GcbDP^@zP8) ziy&?vlai$!<1APV(F?yvy_;=mL2Z4m4&)ypJ8zZGs+?7;I~3egDFcVj1B=<9x?j7> zlkvX9D+LiBEuRHWU33{-ovXCuJPGqC)^hH_tZg0lXLSQ7AC<~|Py0x%v4sRnyI8wV zi4vFBdMQlLdvQ)BvNn(4%I3`iLoihE1`g|UI^vehe6{Ld?VmqO?qv329{(3SGij}v zgX)NK#+R-0)uHO`<61U_CDibd_#<)htHEocYlDwe>}N@CGd#O6Tw7w|Nl+rM#0W>x za<`vW-`KzW+_rgFKzmaYuU!utb2M!rWItRDoBX9bkm~C(0C>`KWu;F>hL3>U{gCJO z!&3^k`CqwgY#v9&xTrtR>-BGpbJ?mpcf=gj0I7|NT~5hc<CDkCZmrf=w;GrjfML^i zxhxUYTKioA&DvQxG7vv7QrU@<EG_4w2BW9i$-*gD#{vnXBo)g+lN5@o&bEOFrXr;l z!^X&Yy^o3+JeiVfzu{B^vxuYsW0)Dz(Y}*NA?J(89o8XtoP<~551pC#Lq=1iGWtUX z-oU}u@Y*2{^mkAX$8tL%0uWC4{Z7gol-HjcPU1|BS@`Qlk3rz_La%43_Ag^DGp~9q zEVtGb_^`5O*_i3hq}tl_sF=guuOz<Wu1_Cm4Un*RvLX!K)TMb*sZ?)%wYgnbHTg;B z%^T+sY&n1npSXm2qnFysVQ8k0z?tQFr+&Jb!6vfS^n;(eM4W3(C@1p?*tk#qF(Euq zJ7YzBW^^7;M>Lf?^>INN{IFmoIE<gMOk1?VyCj88P^F8A|ELb#v@m|f3~63@EFoCs zJf)4!lk(mC*HHDx_=xi51QY(`JCjUAZf!}5G%q@n6Q00e(&JB9sJANrYIy6y8u3mr z**E{^cNcoaE9bd{1-S$Sg}KZtvd2&wcL{=!`=_EPlTy*(qxq-~&v(yk4L@{TEL=bh z<`!PuB(D+gx)9#_aX7BQ#!FKdZM}l2{}KC4&8Kl|6P)$bWXiom-Mt_n`8JgSo2-B- zagPmn=DtFuV(ZvLrrS;LZeab*$YgN*jazC2FqiqDZS<}wk~)@Kd|VCwHxnWENeFo# z9L`Hw)SbgMq$ln;cl>%Il4y}Pi1*nUNKg#PP{7Ub?#`w^CDdvrxq^D#_rS+cYA@Cy zNCt9jokuLXe2fHwYp>6Q6tE|*EMUd3)aRh9Wgd;5n8_56Y-k9-rMk-OB`joRDUR=2 zvhimYH+GO{StxUH7=g21La$I$bxaOjd}!PqguK*bq6$4sz7(>RxGr9;K}S)5-P#oL zbf^le{(((2-h_cQX5k!yn#42Q`P;7}@R`;|HQlaJ1OQG)jGCx;$WdZWN3^Z$DWh>D z){4wxq8WhPu%JW|BNwR#2Me)MCh5y4qvZS2cRQP1?D?VzC;^^}dDt(da&Gx%#SCXe zP>mUZg$(kQ9-`tI+a?xL)W}YR44ji#s1ceEu>oZrC|F?rVj)JEofRE^YilrD*gO&> z0r3a`Ir7XgVw;7GAq^D9L48xRn~9D=oDzfLqnXN<9rD8Kt4f4{8$Y{dj@Fjoi_JbJ zhf@0A@Q(Vv*aDSUY!cnppr(vzh8vJqeCf~??71-s+dLT5bg5|^LEcxkxk@QIhPL4x z&qYll@b-VWOf;|uRSiH^IAqj=rUZcBHH%Vy1zfYn$%GYb$JN8#{5KT0Oa~)D6gM3R zhzJCsy*vm)+d#(Sq49Jkmbab_c9DV1pTd5{)p{O6+SPFoJAkz74qCwEgaZ_?28IZO zwsAW@MB<YOB!B87mP1KgcV?}tMsae7m<aDmHo|rZWb587DV2;O1Ti?eU4-)=U2zFY zI*gRiTQ|0zCC>_F?NJ{?m&kjb+g7;gSIw7CaSwcW1LuAD=2>8pm4fHa{qBu>``2|U z%JTBc^ll5bdEO&b@jdU7prm-!r_`!zOEL8aEBW|7xbpI`m!d>7;#y#2yHVt2oiag0 z=SPd+=0Sqq6aSDDze$s=3Q9(}1|l+T*a^4btD{;U{SMqRT9x`q6(5vT;(d=;H5k_- zj~Z@PrN=DrN~nxd)`=m|1ix7efM5TMK&=aP@rbsdiyOltEx5Z+Q*heCjK$)-XfK>( ziS)^2<GE%(s^97#XaJ3=ZQp<UoRVlfZ?&<Dn>iM+3x6(;=3c~UUWTT(zMv#}$G<(> zmev4vmG?9CRKMLgo?Y$}8OFw`a&H{v#oXQ!KUF_>w0k%hw!c1EZYR21vwdP0p7~is z5kgz~Sb68^xFvGY#<a~SO#V*MZWZo6*?K463oq^~^UC9iDe_&9t@ZkR0+Un;_WX8a z#P%8^)iOG_HNI%%#v(Zf#kWZ)yU8s#?LB{D_M7yPL65>yzm}N%<zu{qccJHae?D<x zZ}HY2pc*zaRaOx{bH?HB1LG~QZV{^&n<LsXPgHdLxZY~Syws2OtG)r=es7s?%i6_2 z6suUiz??;SLsf=rVFbc2hom>VVx|8~rn}UoGx5@gy;EjN)pS?HKhnu#r)hCJU@T7$ zL`spWn<I}@ApDx}#p{|IPbF4Uib>tXFTRI;zZg<CRv(UK_u2#QyIRP6&Mgj45E0d4 zl}1!Dhj-tGv6$;|N9-(ZAhKTE5hN@u)r667nS~}IjX)oJ#3Jp92NS{Cp$XNLV42Yb z?Cq`tp>now=USMvS2ilWX;#K-=rEtkAbm+Q*?U*i5aUKOp}&!O0s+dF2DIxb-lh<> zk1Q&|2}P=>bWoP60w?q<p~CNkho%{*ZnT60%O#_tXw2J4c}d71jYsQh6DJ}^k=DD9 zW?QC9p)7G6;FC;hf$06DIVN4Rm-(UWbce0shPd=<(LQ#0!tZ@d7DG|8h7@yr%DcvJ z?Z_73<#^qArrk3)!SL<=QD(A)L{#OD6?6sSa|yjV=|V+3^T9Wbwli}+>XS!sjg#oa zL;~m~%5NHJ&x;Pqs>ci02cpY$+_oK4y-`F{rRVVRow+KB@9Mc6BQ}PW?tu#NVXeG{ zftpt&Jdv1*)8k(z-lUfgIMBNY9Wozk7hg`xiRWHBM8Sz-8;<BUo!f&nSM-Ggy@JRU zQDhi-SvSq^6`9HCtJ5B20N|Ibg@%$P4_dcI100_I-kf(*ZpPLwvk4!f#M~b1GY23U zapA7zfK{c{&NxNN+Swb8Z;;x3U`V`&Sxad_yx$8c=Xa@x1}wna8{A@q1dA#5(&5{R zz}xv}*vd>Y@w#4-h%{4UQPevlUdG#`;h{cCM!oF?u)`>s_sSEJi<6V)N$z=XUJ1)0 z%+Mhdb3$-3BNU*t4YAD1ay^G>8PdLx05}n!FYVxK2;9$~r-^&Hbo%q>kOYmYqZ2s) z`*HvI;KSoEcGa2sBh%%7%8}30+n59uZSMOdm3~^MA$s9CpHBaYz_qR<J=8<uf?*}X z;8rY$(M2on1$(9V;|X?)m$pJGt<ZW|><MZ~rcy<Ng-xyoPOmIg4`A8X|6A(YzGR_| z(w*(yq9MOjY8?`FAHEZkSYLWNm!2YctyI1ed}#`F_2T`m+31*=EWIinH_lv|?bhgG z@MJs^`!}v|DdCThE}`*>9~}Sj|EuzuKQs8ANLOxT4Qam?@^@L>M-zqhR}&&#&uhK2 zvzNYqGxgW6-Alpg0Xatbn{m3voKK#1`dpv#espkk(^vQgzH@>#J{N?GzyI;0Q|mE) zwqo=Co;Kv=Z@)iPIz_=hEZSINmN-=Q?l=z2&h$rUE)?z4rk76;?AD*ySh~07p)Rj< z)!tIuid%_<A?KbtimJOuEwW7m2kTYDn>!72Zi29|K?irBV4q|bIyYfu<{#>||If>- zR<|{o9JHQQxAATN{5F}jCh08Ro|Y%trPd^PyWztG(1+c;U3|UmrWSj5Ohc#y7nxB* zH91Vw$SlEZY6-ufdffJPoi$4JL3PBz2qmpFfuE&Z;*v4~_g~3k*Cj!r@f=5BAhBvI z-7xh|g_Mz70(8u(;jl<y2+vj63G%Pmfk`Q9%U#4|I}7Ld2?mNGOvdda7YhzYd<d8g zUe$_Qx8%9uVl#%uqJ_6P3)e^A;BPRNd%AkVZrZKqdn`Sd{6;4b*ku1#CeiBsm1%Ra zbp1tXmHX8+b1XD8_b`9(Lf>SVh4}jalcd`<D4z=D9^8S?3ozhI*fB7Tg$BnMa`o<& zq~vPHb5?VD_PW6{??lXh=gi=`>~u4wn!s#UHHN9|I1lh~IEcSRgL|A_cMN9Iy|i&K z1N5{Vqe6wCA7pNDAVCjc|9w{y;cS7d#2|=4xvr<veU)>W1PGxLx9LbxwvL=z=WBG= zI-47lPoO`+zxkGhM5D+0&HH4t%@gIY{ue@#<=C`IizthmdNl3CWN-&dP=hK`E|*VQ zrT$XzEiJ88sY6)j^@fVNuLjFlp{yaUzSZDDZuyvqf0A8w@p|R4Mr_K}fVo@g4YOd+ zD8k2+8NSpX>H5QFjZ5fM5uzhgnN*~WbkeE$*8nb39-_xnd?p)3HZXqMSp4ZogD*KK zu#hb)mC}9nn@qkBWxP|EWZ#U%WQk9~BLI3F=5Nh6q2OqGqAy&1ti};MD-U=6DJD5W zzP)*G{^j{6{s1=|=-*{n^*%f^&m#oqR^0n2<q1AThtK^3B(RhC=9l@FkEa-wfE$nY zJ!DudfZ4wC9$*yfqj{bMiz%__EN8Su+U#P(7n&vAD8S#SHk2E^RP`i0c(Gsh@s}pK z5a0Gbd1@1G<FiP~$<^S^YSfV!judf?x1bG?C0JvSHDrirpU;+ZPN^R;N9Gk|EO_Ac z2_2q78W#d2nohs=SB97l#rZ;d<VBRCQEM>Ag$0%z4@MAaPP4A>{SR6?*eCb<*7^3= zm(g(L<bS2#N&lVP3`NK#YI2^`eeAwe&ti;-@1Ta)18#pdJcO3qKrZW%$Gh>GN&mI} zH);9rMV^H#1ch~c;!iS`iWR6LW2zskS?$r3;wPo?6cvhW?2^T>p6`oVkHsCS0XC2d zW+0oc=M{4L^LfuFkwb$aS+BLWMK5iAO)yW9g@@;!63S4dM(-J==rFgz=z)@KvJ5L@ zAnh0Fb>B@5eEPqhLcQc)-OpVz#YiHF*|jm4!Ad{>+=xj*PaBDH=j|PYY5DojKL0QI zxb!n79(fPY$(CSGZ_tu=>Am-+YkPYX>NCqS{>zm2%(9-5m#ax6-M=D7UPz@7t*v1L zC52i|i}%d3p4k`HYNfHX%0&wFYZ6Ch4$~E@^T+$s&p)UdE!IQP+j3}kt~bKe11)(G z$7DY$eo)?0+>*^4{0Ga1gj~Q%`D;z5psTrdBO~RXVRO_~8jy17XK+t&n+yfqWP_#q zxm+~krW!HL&dD$h(jO2BZ0f8!l2vu|l>$!O@~Q8v%A-2#`*e$EdU1(whD_7^lzXd< zWQf9V_+#!*r6oq=I(_|LCX~litMG)WnQ?QVOQAGpCuW-y^`=CV-W9U#{fO5#g=9=8 zPN${_(gCi)_e<RyQfkTU6|9@!%H!by2*H7x#3s>oWom2Va+6htF6S0ZOki({OG#ZM z9amEe1CC4FWsH6PXx*`h#SIXzbv?QUw3!uEewDAN@%WCZSNK{73D4g~5BzM!@8$LY z^aQ**1@zEsg#OxJ)-hgQ-I)ja`2>nz-8b|C<@jH@2va=AXJ>K$!c|Us_O04o$X|#O zQsi3Y<NijyUER@7Su_wqbd|@4!^FG{Usv}EpXaIEH{w410xl!<K4n+2R`W;Vx8FnK zKKm|ep%}g^eKT~Z8iWTCTP(f2t$dHjHNCo{<$f|R&g1H?SV#LRmvFEnQ61??%0t>u zsER3Z=h(nQyu`;t8Aq+K1IV;2@cOwel3YTiZuZ6W+dUTg9_|t;W3o}&#K_|FzmtvO zT-o>M7k~EEJ*^iEp+m<tH>}^f;oi0M+IazK72<p>f4zyRkE1aA>Xa|PEa3QVZOr!r zG(eCWP%#5|ex3r`e3_1NXJ9Qn{RH8Gpr}nfBT9Nl1pvI57vpu*3>9tB)A6K)u6EK> zz6VHy`B5;*2@F-juTimabGI7SW32FJl0yHw1yh>ZKQJb>(*QZEUf44H!|9{jCMQ|# zO0%q*zY|WoJ*54TuZgi&H)_sZ06aJv6N8I4N?*B2oN*N?|Eg%%SmalTZK+}Ltx4J% zpuX4X2gHumCz5PY!Y&W)0#&PqZRK`FtP&CJbtp!BgN=PsTRm}C#PB2z3Pk~@vkTM< zUE@Xe$W-S+g)dT37t)zeOnJ@*G-NoJ4c($sq5sArwBt?Gnq3u>7e=2UrujkFv35le z*hvbYOPO5Irsc!83e7d%+Dds_j2$H6R1&M_(#%1yM!3M{T1&Lb1TysXk&EI2D2$Pu zO~5Jci)%Ik?5U?yJR}+LH+hcnjjh)1Z3K$%@*e~~qJq%p2^my$ZC7r$!bcRg!yX{Z zLjo?+Ttm)ue9<CaLzeFs*T6HqjT}#Bg1LfH9M%rP$zpPi-A|l2rF|7g_`(z2#$2X! zNoGLv#6H4bt$NkiT0(q`RTR<oN9hhNV?}Z}<>lm*A|vx}A5t8=wxfn8#&*hsL5UP3 znLQZ!K~+^yybaW)$mxT00INmtLT+{xmSopfNVJEQU6e?P0Z4?KcN@5`7AKs~4}RjP z$JleQqAYC(cUj*g##Lon!(EE%Or@dq)a9hAXQd6&b~u^WVePoz<{bpHmIQU6HNnQF zrI}#W1x?X04@O*Vn?X&8BcsR@YP9&8&7v^PYFOKY&R+-Hi0g2M5)CQstr@Ib=bxgX zlP>XkJ4IAy7%m%&QA3b`VnYM+)Q`>-crG;`+i=fOa3yf|af-pRyjKSHOx2N6jcJPO z(!|elsl|8POjq`&5=)^vjcAK|*#ITHh?p_Ri6rUB{_5%n)k%+U+f(q@1cC-4%G%82 z+q*ks$OVU}kw)k*Fb(nG>*V#JJv?dwo0zfR-0sR^VX8Z!wgxg#Mu75X+M@r49b8SQ znm+~C*dGXf+Mgyn&YYni*5Nd)qtue>#i$8o+Cu<+V45k6K1L<dqlt)8^?wGlkdaW~ z4k<)>4NVjUwv4O$r#BrRs5d%y9p5xP(5N5nG}_RWI;YheC|=w2P!{Mj18S>3dzb*u zXoFoEddaJt{nqlWT{#DtBdQp=lCI~`Z56piduCW5qTYqP{NO=32J>Zou5e_;@z}25 z*H<3%0V#2(q&j(aR?fU(pzgy3lsM-<Z_rWE&}o=4%sy7V0GjQr_2g$6A(f-l-`|<v zeo21SdFAWiuE*YIaYzb&<XZvrL`kOqT<FL}|LA!>yWKKbGHGege%|vVc(>j+#2l== zDh3WForlDhv>Edj3)J?g@r^-#+WazonV?vP3y7J>42bM;usKq9Qj%)*%zWQx;2VP4 zMa*bT+VC*c2ySj>sSY0}L=D-nKSiQyvG?oeDVCMF-cpP~h^C&DYt?SrYNLpLy--Cd zVS1}h5cmro3k0WOOn~|5pPMLpE5rEPFB2$L^z{i$-`-@=Gp`t-XZ(rGX$0>yJ3t#Q z$dlz^dJAJ8$HDZ+`_tjCxKDhjbDrq2Vcp<0dx?(@#(HCew~|u&m$d!ikEgUrp7<dt zWFKrC>@Fmy;lJqArJ>vYa&ZBvXKI4G)lv`T4aHV;)iD!6(OVPi<@y}^JR<g{1e8o8 zM*qw%3iZwDQw|fKW2eKfDXz*E-dBK2$`>WJhs>JF1u-+>)UmcokZ8d9D}bt0Du>lP zEw6co$z7qs#vwuZ8d_Lqjk>uDsAMSkigHy5>J5sL#U#-Om^W$D-Ub7*Ub$8GtOlj& zt=oUADR%oYHg=p6Vt~90Mu1HcD4hgs6qJtAV&Bq0Y0$c{3F4jvRf}8%TQw&8s%lJ6 zplU2X6!M`^1-kPAs#thFKq*X{4^UmhkPlFyU;rYN%{Js(WMa-Bkp<4Gq6^Fmvls2Q z;9+Fc7l>y0la1Moef}XSb_8sLYP#3IUu<Q{@qk*685(sE?e{+{oozl25~YPm@QTYx zA2GihMc~=8Ck&4+b-vKdOvP9Wo2h+JE4&!1FIva4>$IiVG@<aIHmvzIpl2%WX9Gg9 zhOI|&B12dBL^wJ=k}(FeGj12M&6}hTvz1E4RhX3)?#Q@1fecQfBr5wJ8kN^PgHt57 zg#^&L7B|;)6QxkRZqYW{Mf14@2yHm!e}zO6z=HonNHL8N!*&%bnPula+~PbkQT31o z+q2J)Shx@b*N(i;52g=_|6v)#v~329;Pmx1(igdluy9R|<aO)j1_54iTig?wMn#Q3 zZ%ZO!h#xBKt;Dt|`;gFE+?G`UHn@w0N!4CLXr#E|Ahnin4F?O0s`IT4-=U-JOeZ}t zO||xrvs0n^BwdSb#WM;C!d*!swrmMnmVgFxoWMXUmws0Q$ub&FdC0s*bNke~sOgEN zbW%O{uL2AoPXii>*$v<fT<$EQ{Q(G>MYb^=GtJI>8ozMQjkkG<DkCpsFY^7X18VD7 zXwtil)#(t*#kg#CYm?p;dLgVh5<7loIA17zyzgZ{B&e>J#H7osMS_Cy+jAkhSKl!; zp72#*j0$D@va8mz2;RDmf%Z<gEnXV^P|)TCLm($x+yr+78<J^B*(KSU)>#mla(wvq zD=CCfpoJJixmPSErQ8tfHN9Xd7|S`lKSsp>R3O~7@rq3cezpTl_IiGmRu-?HUBJb0 z-;vgbV@7VamZuU6?rHv>25N7*dq4(|x+86eLE$lz?=SQd`3e2`Gd+?88#Mf(b<2nN zoDBvr;N&@MJl5aUKd{cmA|7*DIZSSU22XZ4<*>|C^;f#Bqt-=07`*;Tj%Hu)Esf9D znDG^fU*9-A$}KcnlA5aYlKje%W^}*DV%!tl1=-7XWX0>2M_C(u8xdJ|q4R*CU?yvh z7oR2jr;a>-k#wH=>=3uWdPg<vJ{Ff;0j2AkZG`Tw7HeR<nMQD#6K!3H{$pDzyyZN_ zk%~7MJt9K7P+3A@gz%h+dqW(<S-_jcx~D8{ggUy~52`XA27)q<7}v?Z!`I$@sS0=V zh{~iyJ4Ka}q$aX<Gwi;N*(1QX_-D%NC5L;_H$YlW;{mGaJ3#-zkg~>B!gMx+UJt_H z(0t6z6X6lP<(3{@Y5$)1H6$uAUazn|5T<^t3!~x*N+f8WP|ikfIqdPY4+U-gz5Mgq zesL@WNx;V{Pp%kUADs8(UOK3qnnZaXBR}q%P6*4&t*o(#Js`VAl2;}@czjBSs97T{ z|MCbkklZyfD!$nWyEo{eZ$(<jnsAobTl$V3Y*a;yuu2Do0XyDX7iY^hc;eek>Ew@b zVwlsay;|}F&Kb%}A8eeT<fOS`?QOYONLXjiHT+5gx?cV4jlcQuhUM8u)u9Vle$!v} z?WU@boQt-VZQ&BO_aARBuLMuXGW(N1M$1QKrYCM|`g-NUJ;wKLUA%qOWPM(){(eU& zQ2i4fJ9pG;Lj;M-3d=+U9$QjXG`DhD<xid4%e6LFs2E7d2YcZyvDwkdXwHR4U0bl_ znPZ$!$~{)Sa#hLP_0L2eE-lrOXGdbTo+<gg;CS|+^GW*ErDO`*qh9mN|Lo@MbZ^S! z{K`Du9g&pxCq&hfIP4`GCj<yEhcFxPj=miSAAE16cMN*>1b|W#FKIjVbSQ5qerkS% zGuAotqYmaaZY+)w7#MF}IKls3F5qZpMOIi=lWb~Jw|hM&X}FE7-}BxYwV_OEdOXRn zQNDG$<}4Y7O92L!@wQ>&XW3H|wFYH278ZeV2CZsB_A{Y_w-)6Z5UL9X2u-Q{g@J`2 zX)INFDhb*7(cX<4e@zcJgj?JT<*EOjV+*gRB8CaL%#x#!%DJoCmD43RDIHvS)GdgJ zTnOC}T6UoSBi6HLUx~5J-8pU^-#Itd_R6^#!Sc-wAh6-^qAM$|xVPE5nTgFWCZ-#B zg#(ak2A4v0%6*@6q3>GP<VfM7e+v_H6B2R~jp>D>X@j)&3M%Icjm+|rV12nplwV#S z<dzw)9sk=NW?dlA>*mG|e?VdO4-O|5K3T=SL^i0t)?N6yAxf{?BArhBcP%$jvk`iD z>7Xl8YTRM76Lm*3wc1sQtC1#E3x{jG>78Q2|6S|NANpP|6s<?29e!90*!4<_lN;e? z>&c9^ls5JwW6I)o$2|Npn@Xc$$9walfofS4aT&-)S8_92)KsMvdn*=c;=zL0JvrP* zNwI7X7qbk-4=LjS>}fBdN)C@?ijHWh8R53P#1Q60$#ar3Ym5WGHDhb`>_E<<X2q+7 z9K_Pb?4YU^`5v%e`1!!kDX1Uv%9=*Is;;8b#R}4=?Ce-r4sy+)0e%Zlz(`HLh2j!O zv~KS_-`non4l#FVfKlfLsGkkAtq{-mrn_p??jZPBK@P8}TCNgPzpv3N&R$-1&-$t2 zh#lkU<2xdN^xA}94nC=#=T9$+5&Qk69=mwbBEyoQVx?IhuQw}!S^rL`y>8W3QN3LO z7C!wEQ6^uinp2NI8etyO6ZRrS$6+{s25A=#jnl_`adHt3SAP_O?5Uw7>7!5St0h6O z?4q=1{hvO%>X&=6N1jn@JS(fLA?lj^kEMM1;(#VonXOQ8x%_Np8alX91FCL<$NLmT zRA@RN68Tu^(b%JL&mL1!M<<tXG-jM0KNgr`ri7+_ZXh)BG7=_e;7TL~9ZN|+8SlXs zZr#RzB9Uw8OPvrS9}DNdhi^LMbZ90(79A3K-G=T200rf*os|mOWm1s*`kQXP<mMaL zfzQlVFr_N~GTx)@RAk{TnPX&xU&^x*wx47sw|GWXP5uH0j%_c?Dnd)6#(+s&jSd_^ zTzfJ8vchO^ILFHqGn3pT?ap#Hmie<tbq~jIegk9h>rPvY&s*>)1VH&{EbV*=>@A~V zDKOoe=i+n=*H};2U+_$~>t-nz-k+_eZq%9D`Q0oexwqz*BaVTQi)Iskrcz7KE+o{& zUq|z-CKS}I9|Z9xt4lPL@2C7ej?NV9cDS&Yiccz30E4=-gFgD4ij$F&5hb1k_MWQh zxubMPXCAD^3dO5Mh`M>a#018SFs(NGGEB%$XJw@fx7m;Y%f#vumDI-u<jc1SAAO%q zuVf`a!_@GhfMy40a40KW(DG{66~K=|`r@H=#~}eBxBt~MIS-i1i+TfAo{_%Oy(jkM z7%oiK@Y!4L2R?OwcZqAX_%yg9j^Se#t&VS(i?~>sZPl)$E=Lv#c4JP_EP2{jSoa&! z3H6R1iu49}D@i65*fX!PN_g;P&0w4~imfDpb2$H?&_Gvajpg%6q_Ytsc(K}|d|?qL zduiAU(W`|;zeJ9Qc`<^vm-!QQ0U$h*Ferxzczm;tXq&YGs=QyR*V*8`jqy6HNVtqi z7KmUQpKzDTVoblg{O)u+WlPm{f^>uja7EbVf<@dBgUZX;9Xc*S>Xp*fepAS`z7=2b zPv0}`e|wq|mC{djeX0)ZdP)wjg#d=p#zs9xMP5YOL3tQ$evONYQl_fKe-5*P2(174 zg-I`dhA>Yry>itXfiF1Sp17}W)Z5fVLyOhI7zfOR)G?C&o6N)Q30wJ5@1qkhU)^g} zie<^1zyF{+9AUcpb$Z5NdqP81m7sFtALyYBj9I%{4@*msFtvU6;JPvve81Ye`{#jp zqzIZbC&+JwnkA4d;oFy;=M5#bLDW`ST|eb!%GxL<cr--V?WR-@n)et)T7^0Q&`+%_ zlRu2Kke)!3uw<()W%VCNDW+^P7kOad=iL+t<h-+k<QyOoOaDopWcbVj$8ldlA(=}{ zoNo`@kUU@fvi?02#e{__y@ehMc*1eCEGdvHe4vd*a$!M3cIf)&!$Bp%_8xSUmPW0d zs;4uvK&tnm+P%W<swd9_4YB&tWZZFP+;;-?LIQ5+U_u`+Au}$phG)$19@c;c1r8!{ zp8oFO4YvmryP~3Ktc2V1?Ozm7ce*_@EVKQ%Tvl;+u}qj~><Q~>oRG`b->A@q<LfP9 zmi6Y77PZz0<N?-I`md73+RORsaLlk=MItj>J{cwU%ZrgiM>AC66^8QN{5O@mWo2qC z<4gVgZ>kl`nciFRrA=|T!q@37vRa8bdA9hA^`FMS5I60+S4FR9Lg&mi$f{J+R4d78 z{^gOIrHrvr<v{ypiPiq<j`yylMjzhgX8}#^5&Ao{4NBjX`b$(?HN&4<qyttlzkgr@ zHFr5r<Cv9F1+EHBNaa-HbD^}XzG|V5y94xEWd?w7HqbmGC2|A>rtQqYPBifncy<G_ zt-1Hb6(IUWXu~0cd68&2l%Fvq+?k?wtyJ8n-X>-VO-1~%4Hvj|in5-aH5$yBIQa4o zkR3T&yp*rip$sjzD@<u|LloOf_W(=F<KR7+y`Ua#4tUJLe=2Fvq|xXHA3+I=Nq!4k zD9)mk*%G4+fo&^_g`+3{{<57n>cSMaLLJ`*CG^KH^x&JS79J5w9#s+J>~T?LFQYDZ zBP$Qq9sr!pvM|Qw!W%mtVj}V1xisX-RFhEf(~(dBDt?0cG22v@O62wcrm=5)GQ)B7 zRi<2SoNHSk^@f19*97eg1wf{kLP&UlGwtwT<=V=Mt}Qn!6<v?*)XhTU+e=Rea(u}| zltWf~q_R@Jxoe(wyR<gsnBZ;}xK|dpERe74hyAx>efM5^iJ;h@HJ>`wo|I%}+r^!4 zo~I}mUE~vqE`jdRXHUCiE>$-Fes-<BsBgUzZntzTE}uL1%}8Zx5d^)p?9n7ahvQbD z!3z#YXD4J4xK_9baV&kWhrkK~hO@93Pd7uba4h*OGP+p;FjO`4m(=J%oXJE*B$^yL z7Ku3S*xW@4eiW2rZ(+K%vAZ)ia`hlbM0RR)BgSsI!l1X1li;gbI=$lWwTVdzs6$Ko z4f+}o7(X6t4~pgucXo<=vzXykc~ow0lw707o-R!9r~TDhvAm7XR+^6p1L8puP|ok4 z%4`6M4Gr1Kq#Z)Ps6De^nZ1p75(N7z!fIRX%jUzvuZ+VhvqSX`KaYkW)cf|Jw6$lF zRy#IF?%f<>?raqWdsRP$@*|*;X<d^kb?6BP&03@@dlkXB0=gN17ci!d^GDusCUUc5 zb<*C|PbVYN=>X#9bz~F)Y3V#p9CYh>8_d;*i(9CX9r;P$v+(f~xbYbrG5+|O(n*%a zS0s}yqM~_C8FBY}_;LETHL-iH-+yPN1rrmFm+x_`J|^kiwTHkpUx%1K$x3jDCxY-I zlsVo|hW5Ci^HoV(?9EN5Imc3_i5o`VVw!f`a=IDL06KECn(wdgWP*yz)b9b86%)+C z6s76*czx;G>r1Y$UCPav^+YCNNoJwu>Eg+(7jqu#&Uenk-+umGH4P#WFUl`7x6+Te z<B3J*%FZo%d{<9jMx-2LYG5P#Heh^Szo5j*dk%2OwMaU)ZTeqcbk2Kj(dmsBTGSi9 z0Z_`P0D-A6J(wleQHbgx73ufmWU-pnF)ps2mn%;6WpUz+y_6Dw+Nuq9SdpPue)*ql z;5hfYCL0B}o~k-q49?FwwF(8p*}r#>0VV4E>U_D4;i{*)J(-X;h9=t#yl+RD0lKg5 z3s{d3{?oO8_IHN;r+Vzf?(P#$sX{Y>lXPM`7FQ=Ft<2wyO({To5sBu}%FVC8usMHp z#U`B75(>7L{9k-ugQ4jKih`W%S;dX{S|$U8z>MZHVddmGb#tb=P+)X|y7sdHk`nCc zmL^#LccvvRL*y-_Wuj;Ji5;9kjpvj;{-b@%s0YpS7hQ9pTV55Y`(J*~aX4bNeRafP z$9pgD=LCD+L}zDYr-kW<7nO+Xo>=r!*-MKa-%JQZDwZs`RrhA5SWG#yeol`Y7!B*g zvRf!)xZVNmJ+1T<W%dmvYC<>cxH@$nl&NwS*Vx<Rv@1+7-51rZtMf;%Utq9s2Bh)E z8bd|c-4=j4)ob06@5Glo#*Un48E#p4*EdNSN#ArWYWcx82e!<qSm}Mw;d6}&vF}z4 znu7V(K8bDT>BufeSL9$9!S$uBu9l-8&4E}w#z>!>L+Q1VuO^JY)=8AV;~^ft0dvx< zTiP*(t)DALve&6Sz=7q(YdmbL>~xHhR{Ps~NooLJLHT9&ksTAp3ErF4N%e3Ak|+Ph z-^%Be|K`b00txXcr{q~m?;s;K_rzg<@;uUH^w9<%bpl@pB1EO;{pC7~RqWO)RFmOi zo^u<+xg}})yz3=tXP<Kh=ZmRe4pe*<W~BODIYi!0MW7U-e>u{YaN)+a4ooon<FR}v zUXQ|xBg@*E_1@hL74O`YDS#kTUQ$3D)C2OC-1;i#$mG`?C540W(M0rs(NpxEQPz@o z-!^z%S`Dpo-BWpR6T_9Rp@G71>q<H1J3C%D=D%Ay^j|_p)2L!?;@a8_?cSn)HH==e z#DMkI7EI}-*Cqlx&Cz-eqC8#zZJ^wmelo6mM$0}eUQpbOUvx5M(2T#UHgdR$*Gy)~ zlt5m>xYQf1P9kE3og#(Gn)!}Qkva0=32<)E=lh3*Tp3Pt3X3mMPei_F=T1Y-hgYhZ z8#cr$iz^4_SU>0&@}($rT$!TPJ5u2k7A%u;_jB;iW*NjD`uG~w2z3$aleRAyrx;g? zRoEzg`d3m&mUTD=rHn7ZU`Ax~+S2Hy_B_telzZ^=)01Jod`#lo6H%m3G#KZ`m8L0l zMUo11kowGLW&<pQWu@WC-~JNx#tg2s+S^Y<Pr2#sQ|jp7pU9Hm{VSk+fj&+z(PSiK z7?)si`*~5|cij!a8>n0?#{z#~SiDs5>;NcNSJOxc%0+Bq63V;9BIr17p67VnJmK&& z|GUt==KwUM6%4N32ecf#*=92rTkFwt{>H|5!ZH=~i=4$_7v|&nZnw}3T59PVlQY{V zSyL&sbZJQ#B#zr7rhit}Wc0$!l4ZT6CU%m7;If%IQ3>|t>6!NMorkA=fh1AFPyd5U zuN38qnv!|%a#^>AQ2Sm9m-d4BuKjn?KUeA_&8oj(!{+^#LCgMSz2K%uSiPx1zEbW5 zfc4jp5!lZDjF^5O<x++t`yCl~i@nUA_>Ro+L`<YMN^#>~UNXNyE-1xHKN5(lrq^R5 z0)3`=mN1z&Zts1UAN7RKvk?uEqWn~lMs@5D`a5b>&ihCO*keSkJ*jqe$Fh<L#&H?* zY~EwqCk|^zX4@JYGXv~=V|H(xx5rpiKN&*MY9vJjy=iv{4EjigUMl$Dj`fbVuO<6E zXWG^~*3#fLSb5*(4eqt{+Vzg5e~^CV`C}8PZPoRzS<Xc-h^!YKwo7c$@1J`2=Zrre z=#0<Dy@NUUV}+kQyYjCc^S(G^IXy0W@`;5}QEajDu)L%{!nzC)j1iPrQe!nfNhJ)# z@X*ok(4^U(RlS|zrw2krw0;Y#AwOD0n9{{}qG?MyEzypayH8nRa29i1K`V|ksepr+ z-VYyp^s_V4jqmLmZ>7Xgo`TsAXc3&gq)OVS=~8go9C0{(`YMg!Fs1p7>c@{>w#j_{ z`A-P~zpt=`_{`ua`#|fvw>n|0lV6<BoAm*8XsJ;Oyz372nBr%l+sL|}0I?Y1Bt`L< zQfZ$6(@_65jS$N}wwWek6A>Xexc-s|gLrgDY>Y;a%}EPEebdIVb+#)lOr0C6aSJW3 zt>UoJlozt?k<i?$^hX4)CafS5N5J=(w9AqU<F8D7DIBfg$B7p<3c>`6@lt=n3Tlbq z6iPJXo=bic=JAi>%X5$8`gzIKRQDoYFg&@y6ky{_YjJBefMgm}I7L1K_P^5!1~MN) z)w##QV<4E}8#}dQ_341U|Mg}E-64K^=9b(<fs^B<&amW0+V++09c68HA#&`^%1Zix zPNYsjouSuW8wYqCHI3$TEE&N`nfCK^XQkYdazn!Q-iSO6-}d(6yWAZYx_6&ADB<hQ zOV}10J;-Bpu-TG}icB9O!~_lo@lnu5T=xN&uptQ?G}Midd<&5F)s~}_rzKDG=$_cv z*Ok8*ZkgeM?sy=4hydYy{-)lFicGtJA1)W<PX-a)SM^}Q9^6^W>3w_DkE}c>$jg!E z&$t0i=08^?ygt^p=+FNiSveiMcq<Tmv0{)J;$xgn2j^$)bzt*7<;JUp7ZuEI27?B} znDBL$&JNH6pX$b%4TSwVgAg=Uxq+<Ktb3Lan_gu>h`vB;4|N1tVL1$-mjs}05d&{D zNC^IhI*8Ct=D_<_H!-Bq;3ta;&6^sqk1c#*DocR5We{kerWNlma@?VK)Vd1|D0i<h z@-IGw2(Mb}sHjpefUaxrYkn~yaK0<Bt6Qlk(C9Kd%w_R{c$o=0w99}>S?PYLvoNTt zU+PJ>23D{&h5DCj4Hh~d>Q2e$+*7&TE)z5g+_%urm{U>))$5c$n+)Tj<-p|l0#1rx z`QwJ6RFvz~LB*PNcv?rJ2cEZ{KQM~)>BF-u=yhiC9b)tAp0l3QSBAy)Cb%dWUqB|S z%E`eG-ciPWWLmt$0d`k){+%hJpu2<=p676f3T)}H5Gs5sMQo%vcgEv=xe%1tjA3T_ zi9=@*Og!6f#*U8}_5#*Yp3Rg|&kL)esLq4eXs^Yq(iQD|EmcWaUWg1fCxi--ISweH zw+n)RL?rQvqv$@J<(&M51;w;j;h8MGKyD)clPKntaEo|Pov_S(B2&sVZ>Ah_DYx8b zX&;zf00rhZl%L4Vc*eq<N`hsekcU5XGu+B`In5y%7Za}h1?%9P4wNtx{$X<90`I++ zJX-*TMANZ;e8At&uaNLln4*MGVEF612^W<iD;w*YB@B9f*4EUxQ0GL}PnB<}@Sv+h zGF*^IVPqAa;?u1EKB3tcArYR!cj_Z`@Q?qu=~x6_Pr!ojN<MxmGA(9KvXEffLG+Y8 zA+OpeC9(}q@rB40D@>-aDQ>EGHNKdf;t}3=)-Exp`0xr}jrYQR>63I)-rGJ+;dOVd zZx7A<^Z8>hB+k{l^~-ezf<Ry|MBV4UFY1EBUJ<8xyne;sj^oH7oo;>c2jkyw0QcMY z{KdG&xzYmu4QZbIfj`#Btz54OvzG1`H&8o`B(I<FMgJG=<3Ce=g}rj?l;f1>YJE@N zvbFx-r@?^K=nDUrA^dv3bW^87zFFYtPbcY*VLB{q!fU)R>Ga&J$>==JP8P$@#ySFr zC?|Tu0Y4=&F(b!W*<eXb<4+`u7_!{etdZnElB)-Iga|3Gk#mtLnFTx-$d4SJu%eq{ zM;xmy!%Sa)u^jLMpZ+GhTd_sJOn4<aJrT=<qT3zZEnX^j68LLBU#Sw4;6uA#|MQKX zfvSuMnVY0JnNf@ihLQB6zPUgBimM7w16TEy6HLA}8SnCd?#Q>nP~*hqR5|j_MK5F! zPp8Ik%WzFe7Bi^SniqysOh{FO3yq`(bK^0F@mO?;8chXzC1ZpNjanJJlIy3W8u=Co zu)<Sxb@tdBJB>)Uia;G9i>J+sx&Wk2>aeRB0F>6bvYX8PcI|ko46A+@ZN+2~QM<3E z|7in{B)He8*SO!9u+mogcfGVQwPc;GJ<<B9rU6R^+XofpN4a&@^>ZQN(@HZHvm0lX z>MBK-AG$*>$4_k{XaAkqa0&VkLeI)q%!zwct(D<q5|cdHY?%et1HRYyXZfLQNo2&w znlUgwL1T!*atO4)bw4g{c#R1MB*9rPmzGdhGa@$Ld?Edlq_+lgz>wfw;cl<|#gtV` zaQh10$Zw>?^FNPsZvtrc+|xic7?*Py&sK~6Tyhlo-_!h%`K9or&gI}A%^PIIu;S*q zn<RV0KC>&so-eDZ-6@s_9aQL-KnBDZf2`n7<;}h<n2(!5iKH|gW(e~Ip%e%Smd+G1 zy78ZRW#JF#;(7yiRrs&2Lq@`Q^;sg2%`jESnr4d|d?HXO4&6!ftRKvi)rwA-_eI!U z`{o?17_4sg-cw4IHnHKg65gQvrr_Dvf1CO@&T9lufo;Rl8pyy}M@G%BeXsqk9oY95 z=mGQ27SF}J56QF+K7KW-D4}1|eDHzhH9Ab(wJyh#Q`adb5lRl?K?Y(XB{vGer+v;! zzrZf1XbcKPjSzg+=S**HbI*U6I6BW=qU6GTW#JMoSb|j7B*HkH%PRAQbB&(HyZQJ4 zx7*$9Jum%kv;egIe_vNb=Kx>L#uMMO-%rp8@u_xIyFlWh*SKq}WC>KpmN#Kn6WQ}4 z^W=K&HI+sQNcodbwN7J4=k}qJc~!?tehN1ep?;Xte?H%xPE7CX3+*kssC5*yE1Gpy zDpU3lCTcBK^ba5wd=RbmGNr@qK6g8U6n+lW>6kOVMjJK~q_oN9Hf6lYW}kSYvEXMG z!8|Scmiv-8YD3Yd0JBa_0c#g&TF*OhV(7og`S8=mI3u6|B>Nn^XE`bn@nU=FFux4# z`JAJnDm|Avw$ve0Ju>Kv_j=geTaS$gZqY@7O4jo%N4m$v3!BOgAFO02R^^|v2ZpVZ zHuuOq>Ab6B*$-rYx;$F!RSNo!_@)ekn|eAS4EN=>z2T39JwKt}iBv;25D7lyisWvQ z_Ah@4@kp`W@JJ<d47%Gqz*481s5@QuQh5dIW-WDl^*~tRq3q^_C{O6IErb2i@ZhCT zS0==~rqp?;wxzj2=>ky1+_rKy=lMkcVLj@QE$ab?bA&0LqbSJX2+D|3lu_biaa-f{ zb#zK36Fvl)))V)BxtTCj>IM~>yPK7Its8b$v{qqwuv>|uLMB^?vQ^t!404_DrC6xb zDX(;>q)=Y!EM8GYkhhu@Ht|evCX=<<Da6Gs&2Og$sUX^FwP}$&(UhY)MT6KO;ZT$m zFSQRUG(gfnxfpSaS(x)Iqm>f}lehGTa4X#<R)4b89&+`7piHj^JIdbn;N|SK{@5-D zw>xSt{GN1g$#ZD~%u}zw{uDEi_FT!m3BO-ZE^6gTaIhM1VeXAjkqIuz^skdJCj5nF zQROM~EeDBz<RQ@?&1!|UdASE?xW?fPnH$d8E=Pz3;Ngu#=V-s|RGB67SSNJ;x+-y} zraaDuqu@+YpDOq1GyY@CW*D7&o~O|UZ=h*JyDxg5h6a&M-5b3^^=*IrQ_{{W?Yko( z!B)tZSnO0c={%t>#s3bbC=Mz}Ib8W&@lE!03m@#@1G{6)@~6aix$@ndIo}0tSXQ{V zK5WaOMb(G-PJew+p8#4wrN8z|-&+29#`E;w;NxZSn=1cE-uagFjfVoS`RP<S_cS<> z5-JNNoA(j&P<&L2bS$%a*1vS|y0dVN>P^_)v&qL_q;u65#XR2RiBQGaJuV39*tk&x zfPLe}EWwY>8$rk`V3w4FIk^$1&G}X?yR&zrG%HiZhZ$OZbfZN{TLTJ2->5btg`}Mq z(KOvjd$VdQVvT{R89j)D@X4+*MY16&>Hka=G>EJ;<D!s3W|@#_f7J@_sKJFbe@yCq z3}S)8#7e^~3JI(b`t14m7(7du-XJz2H#cGqC})<W4Sc7xWIej}D9fS*{C9NjjyW5- z^c-ECVHxb{dHv2;<zL<TCmX1jJ<LMj`adeW?0)9p4gCHU5z)~#-!~bz%RO9ZBia?= zEmwakcRX=%{fcld_=s_tG7f{#T2EnL``&Ew*L%=H+ufyuiay!>6@T?(<%NaiYgY5W zI`Kmhq<e8qxNu#wXkOKWvi*elKRwkK-oGuJ>fL%Yyl-rBK4E{^z}lovJRLn!HO&|< z-~|pTurXb|?XXW`&pck<w~d|=Yt9cA^dMRa!b7RcthuXFZR~PXOOVz4-1f*akXYRs z;>5DNwlIZ?w%0ye9F*4Z{t+D`*ZWbqqrVc0Rq6OxRG!|U{J8OsSXfNjR)_09yFR0< z?w99kNvSIDqlTyERGrlDA~_FHv+GH{^YoPi0sCd<_~n)$9TE5Z{deD?=zQqi@{Uwc zW{thR7DFeYM~~n8x~0DIk-pe*KTtD`?w{wPAM@W&`Ht*WiG+Xs74oR9ag9MqU8y>H zSi@i~z7}O(6RWPZv6o@nIF)N!uKkPJX--mD?aM`iPy%pH$uSS+cAe#ogU@U$k5|N( zzn^W}u`w~vTH9O0WIu)7k}0@KPQ28k46>}i7#1LFXr!l%KY$dGYy6>Rk3_J7X!d;& z!GF#kBh34g*uVDtAoK;h3Cp!KZ}W*byYuBk2wr&zN-L1q9L+Lx>*nXg;u@KUC6A9h z$;{go&8XaxcLoRFm4qfT(Yxj`Pmb)G!Y&@UdkYzZ=N8xm1&O@oD;)Dk!0G+xK?Iza z>vvBZfHLnu6?yBtT>QtSpPYTT@}{AeZ6XWa)2PP;cPf{WRdZ}f8_0rp)tZ}vZ3!2D z{BU)mQt4*3X6Vm+Smrk7ec{8I<6~|YybXK2B_HoK+_Y`C{?15YTr9a+!rRw+Q8{90 z(cjds{#hm5`Y+MnZfpMFuggO?(EaejhkifD?S1j;+W^O_AYDi#aDF6kIlp5r*35a^ z^JU3oc(6%OlCnNT`tHPYhxM|q9iO-gY6u7ni3OO!di(7USSIL)Z&8i+C4AJFuga=! ze$Y1|_J;CqA9-&?HY4*xtA1HKbb;)kV?rN}B+S)AWl*bF@y}9S<`a1C_UJQA3Vmp` zso_<_`dOQXU$)N%)wkcS4)2Zg3K58K)cg9I=X@ZX7(xWqkZLn<j^S$I;a{@KQ=?4` zCHFKoFLHw5Z4+G!G5Kwxv#Om4r)rzytLX*_clfN=0+Pwyi#729tlJ{KWodXDLbDcz zQy$RNU8y`Zszdt*WYVb=tV&irblq1tJ$eU5q#H*S?=jXQbAyj4WVKl4W<O=?743+d zUZ37F0>-AtW$7L5jS+Xm@}y?b=vs|$z8_y+)9Z0W0r4B|aEqlQy3J7W2Pt%&AsuM2 z(hzF)R2ZTm;zVyrWCzs)mN9HTfR@a#v|;_oWX4y>h$_=t0p<{HVCA(rPVZ!|E@ftg zHKI|7RI&LONvPn@*%N7Tbhxn53wl#3Kroni!@3Zd%&eBZWl~_){`3~vF{v>cU8~?t z6uucGd7b3htG;bIy18V=vz5U}AAM_PL5PiF_JI0Q6desbgqg6qNBlunLnV!d)qrYB z%j0r7FpsZu@%jVEq$#&?XZrOh(_b)ia%Yi5FC=mOJl2m*A6fjwC+9O1dRGc}f2ra0 zM?qa_<L<3@n_$wPX#Jp`TBR3f!n7}bZT>%vyrc2h5mEi1t_dQ(BNLw3MWi;p`W;I% zi7|lEEnvpN?;~jLp<Dw$1*}1Gh`9lHrwKR4asWYdojhP>3%6bgTI6*@RD{eYxUAKp zB|=p$Lxp~1p8v2Mn4OIuu&_`Y20|D_@Y1ClRtWM$peKwCJYV52)-1-2cNoi9he(?Z z^z_W79b_BV(uS?%*gL8FwEOPo81DXnHjo-*N?rV0db94r;Lrjev}G?h#TCXEirry3 zW#nkiXz!#6(x5G@IKAvTc;q<hj;Rp;=}~BBRVTCv9GhC2oqeIbb`lm{1XK*c@%2-T z9xq7{D)8RC4!fS?VH}$R(SP}@xA$vUFY=^2rd$gi2O)u*Q^5DVs4+U$AOT$g5morV zg4`oy(a3bnTh3FwB%1HSFRUPY&8D&PL1~_@27pJn0^H3O2q!pGmu+1QK>tF3daJeF zr@SajDv-Y)&8qR}CNVgV#JSoW)fFW}xuOcM<uNi3#wK;1nyly@l|HqSeAbiT3rI7c zNOyMiGh$6<pu3<&L;#F6iN#=d`FYX#^4(yuyqrN06;-ku<^3DX;Rc-)Gzsi|1y&aY z3H0eA)7k|6zDQjkAekbp1%3Z5PI$ca3vWn=!zr&=cYAXPrN;6y2#bYX^Syp)Ao;5s z{_CCKO3-1Ug6-N6LPp$f|9vG+4{&jdwmwc+3_2hq1XH&ub9Q;A>ag~0YFuTLcwGWd zo`}<xSL^swPboqQd72PhsFu>8Pt-!YWfOHjn7cB@%TtEH?<<&Q5eZ9>4~4dNK>ZC< z{38-Pb(t7|6=}w$<<OU<;pl`f<NnwcwfG$le99zt>IkMRepOnZk`kY-!?RhYNX%t> zw%W0Eq!?NHBeg4BeL3-@<Xc4=)d^Y?#YmV3jdd=LZ>z}8)r3q5)<xgzn@A+gdJA2* zwTagxXAeF2r$Y3s=Dy;JH?P<S;?tATW7k#t>TvISd$G{(5JMi{-iHGz2lOwbe=eYC zWsuDjWCE`$%(M^(CRiS~FUpBg%&l31iVJz7Le7#I$HC(z2X3K+<8|2CP$~|B)8A+E z*uD156W|H?J`a^Q6imf^?3ZHX7K#;Gtow?w#|vB*%Byk^H?r=}gPq&ilquPZm>v_e z#9`i=I*8>>*|6VQwNvU)BHhW|#-9={^8o}keO$ZCMoYwnphE&?IJGS>w)?6uVr#Gv zc=g^rH*ot2293nVHmH<-2A1<YPG`j`BwL?RM@WbR*&cnBVX)ZQ7R(Y!O|^>yvgZ$C zP9W9V9sEJ)Cz4CH)YQ2PL&1De&a5yl*h^X7+X>0ikuPYc+Dz5T(QWi8*5Uw|wOE^g z>QzQwtzyKRUXk8Blf)T&T<iIU&rP=bwW{Zl6IIbK&VJi5L<8g8^t9C4*kQMz|AkbB zWoBlxyS9gIo^goKJXmirYu(VPnX`(b3d=edO!&JORY}-f_;7wGB8F}l#7!az0fL90 z!-0h0Du9e|KgYk(9iodkLhzK2OZQp*uu!O1_y`;=^^zD13%=%B)lFA3Ev3@znnF7# zbk9H2EL@e5yd?QU^pbbiXWuP}ZWI&?rKleUQIm(5APY7SC@$tIz?ll#NTtn#0Y)gp z=tK3T^*sFlgQ}Cpq#*e3X9k3rQ>B@7-F!6TfrT=qHEO3QmOajH(Wb(c+q}7b_2z;; zuJ^VLhD~707pzc}=Ez`?&v;?VRP}m>&iiXNDM_JHzF~hu6KVU)*yK}cjE!ew<#`5C zv(z;68Ul$g_i*({g*&KK%$Ax4ddL(P!qM(!pmW82to;;)UbIh7QMz(vXI0NSwCSNp zbr#vT^}GD*xa&Q3sW>H>6=LP7Lu~BB3B3QKEv_*u$<JEh6RO*gLq<(LGM9y%J1?pW zPQ?`LiNkVp59<A9^_2_19XJs<D*V9E+}cIu7X<tfVR2pXa)GO5>l&9e9S>7d=BKpy zJ8Y1nLy=Mwx@S$OFr&^Tq0SW$SKc7lDDN!R>1r`CA^)zO!Opa^pUwJayI$Wx;tbKO zyS?CDJ7bm$0tQm*ewdz_nW6H}&!+kmc~X`6#9vS?6)N2fdZV@`HPsK;N6of~97O5B z=Qysi8}ITdONbX)H&!rNMhUf6RW>A&v_XmCIIuaP@B?lFT$fGFubwG$?(=g+wTUEq z72cLmFHwN6jzMH-B#L!-mX@rWcbJbHF?u66>d4yPpQ0k`R4{f<>6W%w5uBe>zQuda zkBi)3$Fi8DSnCH&oc;4wza$KVO`6-vZTgW~BLKen;qCjxyTEBIdf8W2i)i;tCJav= z5~=m+BzkXX$dLEOkUj2g^_kP15BGJRj@w(`8s-mo6?ITvjW@PTQ&vrY6vM6YlNJ8} zY3{cW;XKm#V<NQ`#JD~zOIfG)ty<I}TW5@47;YI!*m1s4<aKrOjRkGxpiFck@{@mr z@2uF~K{<$QfdoCc3h%m#M4l&7#yX>O)uMJQl+uj<x_Xf@aWQ7Cei*6ppwiw+EQQdm z)|t+Ax6Q7dgVIC2J)PboCj_Xuo(v^xS!|l)2^SI7<9Vc!!&#D{b5YLD+QN{U1jvow z-3;-aPkwGNB#bylu7O81rO%)2OfVP#h?S5}vIfYxlWQDz^KZCr7v!lI)hWq>lNSE2 zu-UQF_5{|D#aZYCxU3PRw%$ce%i;_`cFTFQL=qelX&qspbDm!o=YZ9(z(DFC8~10d zQyMzz^Xc|dW5%0~=6k7cc>dZi39-ov#WJTD!<%8f0g?H)4$RKt*<69bZoN%g$%j5) z!_&4Z)p)vJpZU5t^&d^lfc8j@X8sssgaR2acm&;y&S*YY^kfiN;h(urB{g_iD$v&E ztzE5K4er?(UvC{H$z1T$7b!w|W8!k7@34|@y~p$8-Lo>sgRqls0N}IE{LUiiImu_W zz5`lo=UH)qm5bC3j$i<$2%blg*D(lZC=l0dps`N;0m^2WX9IkQfc4=FZ+!WDjr(3K znfJPDmX>7QXYBtwx`52}r~*{!T$t5KRF$UWFhF2$byWtEF*{XM_hb<0M%iS^yX5o1 z*GX;8^1Z5~)KOJ>O(v3w?rkn$=A+UO6b+I3?C%`!f1j`aaNSHJB^G2ju76nn{9o@7 zDR3Uc)DAO3>HwGZUSj<F%$dK9lJ_hw;GvA6TGDBUJ(Zwp%P-H3d|dCJ$x2AbI&<HZ z*q=4OY^eg3*BxL@)-N@=WhniL)5XD{^KlK8TJz&h5L|rvI2~=xt@$M=VNUYDZ!46o z_;H7^a^n*&oAHf`dq?fI7d6YhZt6R*@tYoO?vss`#*W8xDKb~Nec1s?6lKbjf+fup zn-kjunhS=qTLf68#DeU%Q!Zr>thE~}uVv6*{xDaKu1gpEU8)Omw@Z|yW@a?rQagE+ zpa76l!u*m{V&=S|u%UT#h&mgZ@_UcC@`OtuqB!lV6v$0wL}0a7)S^7O|7Nx+Cq|3Q z!S=$+7-rFjLTIDz>Rm{S=lA!W-)Y);zOONVZ0;xwqp&XoD?!zm-cWE4emk^Pk+=UQ zcIA?lvEPh%Jf5LzHVZ&`n@zxnBkVV366;lyBVVHedoYSXDq7`m1gRPRA4SiO3WN`n zg@(1g@G^$6z?DN4z$jww;u1mR6DHr<3K3>}r1`NnPjte=nEU%f<riJ?>`Aw!=@f7{ zM;5N}BHQA&Fl~SVX)L<T#afF2`uX_O1$t(L79BJ-?x9YF0lB|Abfi9BPVU-bso*Un z6A%aCEZzm^gz7MYHg5yt0l$ZGc)bp4l0aOg!Cw!2uXF<9O#Nc#ErcCjB-bHw4kvS= z2C2#RfgZ27r@#pIH^sSu(V+EO54jC*$hc0NuCngxwGOnTVy(H*V2^`x045YQJRgF` z>+flDCs;UX3JI<kJTp##(2?zc6Er|}bJzTTguYv_ART!`Jb%094!P$8qZ~_5Y*zI) zd)69Jv8B)xi?QXXnleLz7q&+@Q^NL#Ij%YC2kLKnMqh{uvcXqBaH)A-?J8Uubg{ry zibdir7Rk4Go?xr4hkqsS>OX1`7|*540>!?xI8{z_bB<~a<73lh{>QS52U;Qhk=Gi& zUzu*t3g2?-&Zbgp5iBT7hlr8mHfl7tFC(}M3)t*bCO2FKqpGx9PvHT_^$?T4(*Srt zB$of{vau{3GtV+mxJ|jBuucDaM`1xaq<hqS1eU+Md@RAkx6XB}m-vcEqm?Kue;;sO z0FmhVGnXhHT8D-kXmn-FzAHqb0fA8<q0TOG3HQzr+|M?a8b4X8MMA%sDDUrv>gRN@ zsMx7PYcJndNZz>ziPn%Md*z7^<HJ|nDk4#bvi9n`l^iPws&Y*)@_MJN{6{EFu})Bh zAk{_*EH+iQI7*X~e><J@U8U~+{?^P&pWH6Qw@y=LXw3(%(d_51ylt|AU|LNKv9pz; zs{HleDsH#j#q9Z=1nm0{2NW4{tBo4iwkA5p4oxCo*u2Hc%k&?I<#_P=br!ETCUo8^ zS+&{>-UvwGJ)M6JgWEEyfOuAglC1X}l3y%vy+QF0o{xJCtGsed&(6mL3m*f%=eiV; zNXUuqDSVJPu9#6AXL^~SamE;AQVych@WZbP)4=VsL|L9j+8$v0M+^20un468dk9`^ zQs-@fOSdC#p9(B-(kf>E%fk^<eC~j`9$TaE$=iQCYVTGc=knVlcqg~Mi7rRaEk&Jj z<aSGB6pcV$mVIT9avUBkYapZ>1|D;r{9|e~+&Q(SyI-a1@7^+%V&-qA=&$bdNHJZH ztQgl05h-6yqi^OraZk<oOtL(=H~wrV(CJlV&6=m6jIusFtzNXIb=u2&hp&(BIzEiA z^Fxa4$^8`?(BDYvTBEpsbw)h?#*O%5qwvL>vG#sN_=bL<UqPExwcG1rXGdG*$L~&y zps$#OxLrdvnZ+!WduTC45KM~=PYL7Khf@%>Cqe?Lb^>^~7S~OLfu;nQE<_-dY7hR2 zFiFLi*r}MfMUFqG2s=PtY7r9BI`D-wMlBH_>89s5-T(-gt!-i-BU8LT@dom@Y5Za4 zShfg_goY@|bDXF*DfBwghpr$a4WfA8jj@#DyEIgzE{J)_iek7{*W_VqdD9FL^vGsc zwE>#c50j^1t>+n}6zpwP0W{m`0mxHvIwjV{9s`2omwYz=7stpt-BJfg`+>1X0}BIO zBk~HA$sOV}Lt7ZpLy*BSG}GcT=$;s{g;u>ilAkuv@@6Jb-j*|R9<+e=%~7*56&L%` z=l)M9bGoI%B;I^cJ+_4niW<xN!rhY>PWXAXAuSs>d-6dr7$^DQ`Yea4)()I7VQ4^T zan427x2tDZnOU&mluN0LR#4IFbddXc2?E<*+Fbp>K(5aWAG+yPP9dD_3c)}R#=NKz zP<P!qm6&PPGTwVBhIa9R;9~G5U?zaIjx|0g%xd6o{35ILEidk?yDW6(FrFQ>4c1|U zV!C#_cJ9q!$AD=?y5bsqofkY_8p5=R(wQN>_TGncc!a1kc-Ra^PbiUZ4fD~nNkf?e zpCdEqqt43OmtnMqWmIp2oqq)Zh`(fA6&XV``7tlHryQd*BOgJHn^Tx93nVaKPiLh6 z$iy)HP}!1)XHn<cV~*1VZabX6=hmh4<ufpXhln8;-P%(nHR{~zQzjuE#5G7J|LaNo zB2r^qbAA2l%t~UIg|uNg380_YlzsZ0Xz1Kfbf<p_Op8#?Vrznl`6Vb`H02&K4^&+` zcHpYKODtE2|0zhMB2Wh*b5`mp{TAt5p)7mV{X>27P`0A{tVG@!+Yla`v#aWtfd=|+ z@ztFaeucIiB9tZUT(6LRBL5Ufwe&>E+lWS;n6#wpc<Pm&UB~_jUBLRz1RekCjBf|> zKz??1d0$CReaVf<ta#;J=>4ifu6WxGq<>S*k>v7Ims=fu0dpbC%&=MYkR2Azpk_UD zA!LSIE)HRoKiz=Z>r3%ATq@>NRz}M2b2aZ$t%QW`UsGk@=+JPKaqYNDRSAOllmpnf zBaOKPIWIBc!Dxv`@iG6mSzHhVJt#$#mQ;xa{zWEI@IJUNX$43{^s^0XAg+Q~MDd+{ z5iK3tPwX3tiT86S2ny_#FBqsX0%3pF4_eRA%nSpB{|a^7+X?q2%t{&E<g-z>(1t?a zl;Jl%srck{sps^^6(67Wlmc{ngYS^;cYjk8c}#q70oGO3EnnZ`r|&f%1J_xxJAPq; zy~X(12<xZW+r%TGJG$<_P*k*ZH#9aMKMc2TV~Hbi3lupYc35RYE7bU5$oLXe1R-Aa zKqf$+=NP(+&RG~6j-y8OI)=S9$N#Yt=xMA1JB^<9dpLUV!)jBQa6iac4-7L#MjHxv z+w_#W_t%&Sb9RNf3{fo-iN><jUy9XmMVd9O0<IRnR3l~PMXIMlIGJm)46B-(L8MGp zc<D=}FV6jgmLi}c16ylLesX}}2nLwl(-d;+H71V&sgf(V|91mRf7hmk-AS=mCOe;9 zpY+|8uNR0pr~!8xX9#k{0=;gR@8tDoos(B$le!CE(U`vwlTS@<Kj|^ql1zN%i{o>8 zG(i@I+6w>o<i9}+OHd~6T0bPTztH;vC5)}_6qi8?OX5FIzMv=40q7MdpS5C#dQtX( zBvYxych+{{^8UZoIr3@o#t%_xhEkb8bjuZYJ@fab68^p+O&_mMo8NIEf<+4Lx>PQm zQh<CuyGP@oYAH{whdKy$nrVdO0l)OU!f4Fp*;FKpFa-*y=!y@Eo}D;nV{fH%9FZqQ zjN)2+7g2YRt1dA(@RH>vk&UuFJR-Cexz6sy<6hlQEuvB%0ONBFPHNz25u&y2PI~TI z#CCMRrrQ>iPa#_C;4u|Jtj7jbEkZeLysE)L&4XA701Df5k3lgu*U%k6pDD^|b**V_ z*?vk!i%|aY70sdcXV%LXZP~W;C!*Sc-{ICLuBmnMyx^9TrvLM2V_MxarjMLXdxF;5 z;A}DOy1x&6k3MGjg20@Z63K6`VwG$K&m@g-;fHN|QaNEU7&tq_w=ZL~J7NiCYUonJ zB!1%2W+9FvZH7`gLG4`vi1Rm{)oN^h`FS0j_51v7ULiZ4{y#^{IS9{hkc()xR>z0> z5ncZyu;v%}DW9z|;0+nQsN~3j=<$mf?#aS(BCKuw9sRfhB`z5TTSDE1e55G>Gpb=^ zTyaS~>GidVcAiJ&g$p$zmYWMr06Rht>dhHu{<;WDhGqFdUXN}$wgYSqJ*YEhn*4E- zX-Qdup<&&~baM7hTl36}vT+v7n{kQd49+KtM_dft7brW0&D09@FQQ4A!ZYds9`=oa zG0f1`K^E>~#YvDW$&2)GVbVq5v<TN=4HNu0e)ARxzP|KymE(dqL2nxbs?L&3Aub`S zAS@crib<8_`)o1h@ObXcwlV=jVj2Wkv<;&!Nx=Ssx5T~3SmeHhSH<1x*s5(@HozVL zI@mfkFZw|L#<Dg+l6sE8It)vhi|$EXvoD`?-sN8!T^imXH;S%0$_LI>TJnYzQ33>F z;fHY#9xtv0AS4H$;m9a@5gNpgBd<6v@3o=rdM~bcCOA7PrneWh{y!$JlJ_oEgAp6W zL(K_;q98fTk}%m)nyQMuRrB{4OCz}R180Z|LxRsqEQ(XAGsINN8ESW0`oJ6leJzE9 zMNs>n0U%HQ5Gf+*Cwe%WC4P14!f1<jxh_9AgGM2ex#~aR6__$P*4<Aju@)X<WO^Oe zG3O(B@$M|$yU}AW(mJbKtZHk^|E&yNY9A<{wNn?vf`mLPr*%JE0nyYLBUlV%f4Jro zvNu_uXpqMc!LoF$Nhf5=A(O8)mt2nd%AT#Ipk13?vUQY~aE$e)rLl#32^}YNS+Ru0 zxaeu+6V-U+v8^Qz4b??y9QMnxmrER!M#z>6nS#pOOQkXmUZI%(<h#Y!TK|Wt65-om z&7^p>qI64r{gzT|?k`&%VzY{tZj*N~3Mk)ttz1nN7eO;@0o_!giQaHGmf>v*ObS6i z^-UmhGw@MKNUq2dme|f4Zk$$6Q+hJ&fv{U)k16#RrGa{7MUPNj#K~@y30P_S7x{=b zX39=M7G)Vo^d^Vx9tH9#ZB^%E8p-BNH_oCg2q0x|XKC0&CU1-I-;It54Wl`^wPvmZ zJT8cEGU(}(wfqpM^$VdySae8djwN@7{WXW2^b#DS7zcC}xq9@E(3P%a^1+CIMuHJ8 zLMG;`MD}D~#rOt6ch_8)7sX}+dlt%CbNj;GDU{z%FVnByjft-!$wzU{wxY9T^+c|V zg?T4>BSJC^c+Bk&PUO&HL-v%)19|V~b%cUzfWA5UtiS$_!&m8~yM6g)79}U(o=jTd zvY9<1JV4;#`(XCdDa+{AApF(CO4QtYj?2cMjE*IM7SF2~6mtv|=)%f3k??gpl>cx( zN?ZEz^xx0Nr>%!a{)^NJ)BNAuLL_Y4cyQNYkY(wNEG!Yi;UHO<ZoH;lxPd)e@VdYV z>a5OyqJ>F7%l3g#sB>;12#!Bh9MS;TZEvA0iR@H{Wf`@?>~NtBq41ajp)AZ&31O6W z<&l23O(+{3z*%T6UJkbf=os2BYP_q!w13@gx%Dk1#Oc#Ucmd+%lsHL{AK2YS7UA8m z3E^cZdT;}TLLy-zp=MF-``^#FOhr-nJF|C$Ip#10*v|IU4?%Qz-5AAB;ATxuc=#EP zvvB*))C72W5RIVA#Uk1KL)d}V^I2IJ!p7^b)90+P^w1%r6`nu6ma6-%yGo3q>-KfL z(_x%G&t>)kHvMHjJeP)#=AdMy7WHD`$oAO`Aw}PMZb**daxHYYP%w0~HI+Oa6P7dE zVV|&t@FxlQ|Lhu(7?ter;=#-Mg#kssd+f@%w0v#AHxwz`^bP-ZfD<=1KG^{KPR4M$ z$oBRMcfvm8ad_3ZPbd6aFF}FATb1pJrscA!JTXwWk>1%fb6PI!`cT%UX#T*tSXyMo ztL|hQwhh9F+^-{mfpK`J@|=H*Nc@55|3BqUB-F+FZv1*vr%UIaN5kLQzIa8`yG3tV zkYe$|tqwVCwBipP+yS>64h2A|ta}h}s&IYwAKbnHVafGp34p#El*6gz+2j1sFY6WW z#5l#`iIe|mEkwJ$%lVh+uzj?^(K~9iHIC~FLwK6x8t5M)1lO)l`At1eWnP_}VP{rj zU;W|TSj{1INNfE4u1k|M1O4ko2%&xAvY^7AcK}I|9oOSkNGw%uSHDzDO*}(JT>X=l zf+=`_iOZjvS82tlurz)lW_h_J;se%#e(?#i{&NxK7fct*BbxZ~X;2a+_wW5bubd$= zM-@Q@y?amUkWr%p-Z3WIc&?j|yMZ+NO8B3Z$Pz<GN<Oe)LQma!JHp}e^jju{R#3Df z)XAC@b0t~LJ<8&62SS99g4p?>evmHL))@+}YFOB+ilSCP%~g|*vVdCTBrwx}`8U{d z%ePjPu}&$9?^oMG=0F?-06j2ir5tn1_aF*vnG<pwSzZWKA#OO&2DZ<pp$bLEl?E_a z2$Lmb=kW&3m8H_A!!2B$Pkj@`XK#{3@1R;D6;Oyaq(BA7DIQhuy8oz(^wM>`xZb0^ z^!fA(e(+i(R7#mTLbal><`2#Mb5Zn1pX!T_cf`eI7nu|V3lsts7=BZVkMTY5HhbQF z^{jr5Q^m9D|FOwPM!Sj^xmqz{ZU<|lep|YW77AX02!hOUMvIw^ZZKhJZuqJUr{LhQ zv!cg$LHt*fL`(y3wy~(}(Rq)iAqco=zU!x24K6xZvD~ZZ)r!?s`a|N+2OyHCnt`3c z(K>BYZIc#Xj!@^7e{YT8oM9hoCCaeVcUW2|&z(ZfelOi2{xa;(=}r;Z319?IBAs1z z?f2gtNB^#Bdu69_%2j6`7|U<G@$mw{pyybL{9#U*8~aV1ckYtwybm0lT0X^O+C$QD z;nguKBvYq#(eKhX4lQQ1JXB?f7P2fOY;)B^RXhWCj()2<A;QylDQxPp64|$U$*1*y zYZxIsR_?=OPMJwun3z6Ox?P*p-bM3w6lEZ5%^pdw;3lgNj}}S3%nZ{{)5FYr`suz) zlKm)q_s}hw%_xbl*BkvV=uk-Dbk^ubLIXF~gi3v<zI_8va7>GFLXMzTA?pB=r(BD0 zd7PLDiCklKMdr5*pR50S9v_?|_KE~?ObaI~*(fy8EsetYAe*J$&uGA^D)pp<nO^tM z`!|)7#D;oDdz5grZWwCx9BH~$&DtHfmBe@s`!Ad7pr~zGEhW29VP<|vf@b0~G1Egi zRrXvr#F>*^wJ5>KiNc1Z4uaP;uRbMQtz_jW7~u3j8;s%FryrsO_i9fUwDsZ*WZP{U z)@-0UHueFg`b5}6kJYEQ^KtO6`=nlFo}eiZC+42^Fq1E+G$Rp`v`Px;71(IXw#d?q z3(%p*?4k32A%yQ(MuF=@gYSLMm5k_Pr*fR0i+mO?EIALu-2K+lvjSk?dR)2fIM>@# zr}IpXZ~K!cPXerHMbz>W_NTopb;#3$h)VQ)SkY5S-NoETXU<CA9~N^WGgj!n?k9xt z%~QpZI`*p%OBUn7pMmj&I+gNE=HnZvpD9d6a!HmM?oZBh1Ex>7)#!&$IKcN%%=zj$ zc<Tz}zjZ-zu9{0h;e%~?12wah&fV+t%I^?UAAK64LJof5bJC$^T^^CAx9!AEG@U1I ziMst%?gcP{=uM`JlT{T_2~!K`%#%~vtUsnIs)9<=FWsunhi|SX$L}PCS%@1Sf%R#Q zYb3=lYED-<4JkwAOPrf&S<bq{u9mY5)@$1ai~Jj*=z6$%2{9v~$6R}-i)6_#e?Vur z+I+*}te}Hhc?6K^AspN2s7*o?{Lh(b=uI$>>WVqR7zW<|-?Q5n=NpabI@NH&d}R=| zUBs|GMU<<3sJ+4v0LDTOYTi-hrM0|jwI8VRY77~h<JXrpK=I^w4T1K*t&gdeq8~%? zo(%QWt>@*&?L%BR&0QDvvq@JtwPtTdSYBhK%m?!`&gFG4ZNk#Ej7$3S@NlNfB7saG zFOW57VtTH&H%;DPwWI8l<~dyzV#1Q}Q4kE?gJ<Qb=es^>q-)4Ej=8lxWf?h_<Bm>; zd)ctMbhtm8GAr+De$WnM&o<u}X?d(?67JfcH4TZ`k6LfN=yk<9PmrmdkE~b-VXz`; zVcH+J97_H4D9z7gCk22SGau6`r=vyl+T?^mT>N09IpIJ?7i2<EOAoNACm=3Z$gFQq z6^>%5>dMH3wux3vmql&sv#0-;kH7pw_;33vEdkKXx}E>6`KMI6&v@eR6&(6_Bk?s= z9p3!^&c4C{8iDh{e_lua@1LiiQ|$5nwtsfXnkp~;WqQv4bHOJY`@DPV_vm!rC!y={ zg2(r5)t{!{QvK8CSFJcX-KWDnedcq@^y>C0)&Jpn-}~C09@P7~-^Ibd)Ncj-9&OvW zZ0-23!LUSFrGucA86?6nk%S4lTyKome62ZYZP5A&09_^OQO)r1ZO?9~lo?6iRy|&g zfzSB<D%12JXMkB&qn0UCtd(pH-Q^~N<ryB*q+pIdSb&$Wa&Ol6Tg|nb3d*5i*zpn3 zZ|^I0G*T8jMG^;+Y8{?YsRK|jWt?*FGO?7kBrEuFKXztYq1H@&9ZAX|fLGWE^lk)3 zqjhGMXkQtsxz`2E<grUgBQ;!(mJOlERwd8I6w<R1*4mS2h1%k8p<Ew3FfDKNTyJmk z(jMwDS`#bL$U55R)V76PKAzHkkIsVc2DR)2pY49Vgy)?Msx7XgRM3LAD?~kd&8#v4 zb?DWpa*k^m!N_`;)T-D$1H$Q2z?@+=IvUfML0L!}XcTcZg5@J09l$u{(5?PKbDlkM zK&5ev4iC}d<i)M3TTz@a-=Sbt@i+tC0%5fWm>|6d^=f@Mli5pD)aXW~Y%OX$O_23C zO^~o%*WD4-cP*T23az|B0v_c!S4~*)qB)1!XlawO+IpMB$Wd^$Em$GutwXo0b**{@ zE4cyUUUAJeg@e|XagPima-6E@GU|Ej_QU??CAgTPr7vo3T9XjvL(N%f*cK)}ilB6N zcHr)jL<zVR%QxPO)}EzxX7$`M0(o?DJ>#ME;qk>-sfWnO8uQ!~6z91!qBY2w_n|<d z0)%Gg(LY9^3v?2n5qHkBn3pg7h(PEQ8M180n+@fY<rT$NlW$0efIdyYoF|W<5-3{c zoGd0(7;^f-*iZdHTl{PmGI7~kn7t;LR(iUGXTj_mJ*M&f!E)<GUkhF`3LBj*=il9B zla`T9xfZk67Qo*wqS$wMrnLV3gLIp1M77`&i2_^H4oe%V8XBE27^?58sNW=>q^uJ5 zqzIBXyw@lB$+_-8L`_MK9$F$S+V{2WO#}-hSkH_Z^=CctQIfJjD?q9hNelYMXoS?L zyi0qek#wH$ru{Du4!U#bB{LhAP`Eb+Ca_U~U`hdrc3UE$J-U^LU`AIUtxsZaElpz9 zjPg4q*c0I-Xn3G$QF6p!|J9-|U#mo1H1bb-v1D|p5G5n{H4Z$gT#vq&Fsx{<V132p z4*QI}DilDEsm}CC5<<s5)Knl^tr9ji6Le01751#+ifOC!$d02tDDbS7hTcTomE1K5 zH5pomGf|2EMRK3ygSYpUL_S$rBNbZ>WCmWnO0s!A>LKClP6U~i6`&+ig@*%=EZ^z) zi(af#$n#EyvR4rAXt-zTNwip*c)&_6^?Ez2x13}jDqmfL&#GLW!J^h{Xu6j5XfEaJ z2s#x7bn@yipFYV4ujGrPnAVaw+kdyL7cGLZS+r{cx{{FYqEPG>{@`vFf(9&+BWNhA zas!a)Brusr$M>NZ;BfUiw5LMQjQn9rus%3xD}k(nRQ)DupN)XMam{<kg?=R|xP#zT z$mv2dX){743wK!ZNH<SWglU$#E3vO~n%`e$whmES5*wW^C{`kImmh{U23pzeHnA>P z2eylql=+UO+?vs*WznL&--JTFLlRa}zGzoUuNzDYFm@PGNgagraITb<gg|KZZ99^c zgV>Q4xavFAdYFX-@!gog*%%E}nyRoJh%sW2W@LRD!Xfhr(=$r4pj@3^qMn~&1U$#6 z6oF*Fqwk_^Wj}h;JH=DWx&sPW1vrfEOblz`Z%OWYq}t7U%HAO*hC|P!wr~MokwPAt zS!2hwth`fr0FM^?Z&n0$<XbPi*YGykGNP;`)UFBTT!2I74e61NySaMUEq61g9^Nrl zU7aXzu57KC&F&u?puQk*(z|Lv0FdrG<$HNoSLkZjDj!y?KU8sASD1nbl@k_ujOs~O zP#@$}t%e6yEl_yJ1ne5I?ciXwpzpseyW+8Yl+}?(g4{(4`py>4uA1FmZfKLlvACMl zHsuy=MfExTB1_So_p@WP;tW&kB(JMrW7WF+IuHU#OO=(+%Ioga*9wG&YDHQ)QC`Pt zh%nQiNUZ-a@(U6Y4*~WC>!2sVvo?fTefSy_CBcETXldDcdQ?8s?7rJWj?k)+BAr2~ zQAH$)>86%zHfKa+Pd|{CtJuoxJt|ZAHEG^ul|Pz=WOZ7b*6<4ZcR)r46L+q)j<9mj zqq7Q8&(_}+*I8AKg*pO@Oru=_srMj4*s>=2HDnayzSJaqcf~Sa1bXB7S&PFJyPv{w zyLQG&4B2@~?zMx=e&`JB&z8zKC}$kiQHz%&-CQ->6wah1x<CFOf(WIGdJZY;kXi;$ zGA-h5Ea`rL>~7tGQaCz`eY;z+yTHEUG)Yp~85`BX43ij(W~KC%(yVOCB$&D7ta)ZO zi!xgAW6%Ly!B$pzeF&IMW|IOxj<1luH$U1nl$_d7<0!ER9xc4r+pJokmLSz&)p$s~ zqYRjacvF!odlm(CBMXJ9rYZz@h9R?-^8IS`DVbM%<*>>u?Q*A?yuKhjP31lP8qr@v zW0;I<36|(BC9faS5Ya(o9z${*_0#IU|Ar08zbrA#$%?a+rV!61X|*0lXf#Y;)s%s@ zuS%x3VP9%Zi<3J)L0>pR#ER7}d1t3_Id^9Lc`R63d*g?e(M>u`%j@_7_CJwgRhNH| zzrOV?(0c(e@BOUT>vL=DegBH}d3OYqJpDI3?~>P%S0V3h-`yKzPI8w;tKQT~j{ZUN z>mOV^wbq*dK`A>g)&h7#tq%04$C5{0W=Kcmb9W5M=K3VSaW44Z?D=uJE|>dqiFe*4 z>@2H%SMDRi<-Xc~^!!D#J}*+tWhR%|9ewTQCmZ}5$J!e6l?Z$D<OGzF;PG9KRKXps z^B`|hVsh9(^mfOyh1{wGa)fb;Ub%XxH`{7u)N+O!d~`<Qd`C!!6tCqo?ek_lk=Ef& z7CSDd?I<m_JB9{)hm}a<)>;(2^B${x;YU7eu-5oYtPA?Hid2wo;R$`OlODXR3iV^} zzgn^0+^)(MRU|T@wR-Yv3p?R{ulX|{e{Z<qV8=kHB!7b<$NrtAItV>R-IQY(?dRhE zqe!H$j3m124$kO~D}D&xPR*0QxwG_?Idm6S^P+F=Av3j|zo!heMkL+tB4cdgn>$D! z*-Lk%`7qsy=G))gS%#?Fy0BsK%{^qxVOdW9@uVxsk6+GATmUb4n-jg#wgxDf(e_LA zP8aeyb$yD_x%s|My7}y~R-Jfv^t3Z3(;3XMyO$E{5ORl@m$l@Jju>xTO7%5^F3J>F z33(J`H2G6a0ni1WlqKX9&8h-WGz*^8J6g$Dzx(iXdKX>Rz4zJFCJ1;zD}uu3Stc1- zvnIuiZbFxajw|+FJ1Ej&MCXP@cWRj?<M2hUMGD<;Y2;*7_F~7$XpNzn9}K<-ctUfe zhCE<I3<+a3<bOUooYER%cSZ9MY{+4Gb!0;h`D?(?hTI2o)YyjHlUnqa(?`x<Y&z(7 z&H_n%W#A#B)8P|z$i_A`OAqk#0I)-{A$<*YhgaPp+rR0p?~wIB`>Vf+hpeeI@(?M} z!vT88WBb;3>LEoEqsIgJgv2ED9jRI=mmZvdNER0^+HPzjAaXBUJ#)Ky1tL$@Np%iH z9AJ9XecC9$)n61!ZbUX_OiR2!iW(k~%<0`b6p1B(L_Qt{M<7vXL?Y`Po`By2ND|r3 zVp|efizS*w!bK}1ZUQB8@2+J_-S)<1%ZW<lZGaKfmB<Q3%MuB5ozV?kB7L`)4MJZc zAE3M_D`O&6drvHaG84%>jvz0!7@Nr2b#oKxeewi!4U(D@36WhCC7GSb+pg(`DNm#y zrPI!ol|B&+1Bg&4^1yY3eJBT!5=Dx7Cml`~jUs0($D_!4B$kjAdFzEzrDiGez{zZ} z(i9=v2x;~ORb*q`G+2iAu0^3SSgs;Eu9#Q5?bq?-xn9Z}ohy`RMP7%y2hJg(^onG6 z&jb_(EV8n-3lB-Jr2P<PDx{Bj78&)^RwI+N$R`U5i;7E1xrkgUtE%yZn7l=bOXS4W zop6y~H-myhLc_u%BBP>XV&mcy5|ffsQq$5iGPAOCa`W;F3X6(MO3VJ>c~Mq%({}wZ zPV=&E`*B`(``@A0`vZUwjG!1!kQB|Z950BHtf-o9n3nCho*#r!oTOP^lvUldT|bP| zysX=PoY(FCklP5OIF*k6&*;p`kuz6z?mT$`M3_*<g;d&D=lMYx#YvjwMOoEN+x5dZ z&C9y&$9dh)`vD*XBPjNIe{h1NXolr@L6l@g)pWzOY{&KdAdKQ9&GMqG>Za}bVVve= z-S*?W?q?2joYS0_T|d(n!zNhBKRvw#xWP>u3!(lgJ8-{7Eku<1AtfUL@~94nQs#ch zXwC(Yy)+Hd;u~1`uq5@6S^IF_8cKM`(KT-npo6k^|AZ~_E%|L9p)kGl^~;K@R(eJ0 zX9>K~^uGG@6kG2!y!LCp?-9VYF~|p^K-r|T`ZX8ajPzt5FJIsTwrSt%EGJvurKJUs zeSR|NAByZaS@8;d==0%!9{Rr<1mG0VKSi~FNs?FObHO@m;6$&;C$b|Z(r=)VkUmgk z{KU~-nW!lQy>T}0_=%&VlB7hL31st>pEx2E-87a9Gni&~ypVP*=5jWaqjM@>=q<CZ zm}Hf{bWLov%sMJDd<9#0aLIkWYe$2$N!!APqqU)C#yG{qpJKMqTaVgYSe)tBBbGhJ zUqU{|+E08oG)}7hgv@}5svIXrKp&i98YV*Q|9R06YXB`335}&iGpes_qEm09QX!aJ z_P8!fo;5w!^k}gN5apkJQBUB;jtrJ`0r`}gqEj9QgM$EldHjGW;K`utxMgxmC14+e zcy7u1xPj=Z!Y5$iI!}?im+A%F3VMjPVS+Y3W4`F3VfwXaU;7MLUkvN?dRBdgT)JrZ z47a|>t<&k*^clQ&(eN3gx)_*V&#KRumM${`t5z)s*j<dAir~Xmtx)b@svlWUYoRt7 zIaT;==zEdA6X4q)U;EWdd5KOSgp?xJ%ml?)_Hx|{VuyD`XS}Ohv#RvAM=gHuyh8xB z9Nh(?i@_pfJW+|lGiX9C{B@NSC=ZAvG(qUTnsd^MXlB~wxtCqXhydTw>|TA`SCE!W zhd|!t5N_>Fw}N*QEpWjQ+N|<s$;*KV(N)Pz!|~r9u>E>i=Z(Vb+Xhg=VzPTMSk|$4 zV@i0kkN@w9psS)IDCc*%@Es^|J$EkT-kSMc>|&aSG;+YM0=J0Go54pNVg@zN)Yhi5 zmyrOaWdJn-W>8UVwvm;+j28B39*|{^QDNPR#){25-zG@PPAjUs_bGP>w{Eaq(|47F zONN^w(ndzQt#BE+BYIqc4p2kdln?z=<APOpFybQu%9q8!8-;<(RRiO>SBDEi4a+p& z0TNtbW&49Bb98TR;3%|5=i{pP2~JKMO2@dxn(Lu)M-|RV8H;?-F(2!-d~(X=Co7}K z-KNiKo#{t?I%ZFd3fD>DtjaC$qHJn(l;y0Ld`6aInIlBA9iA%=^|?JugBmswqN|c> zJ=_8mCCXSR`m`7t5bAB-KFTnFn>8oB$m#Ykk%iYrC}qEscD`;?>#*FXIv@1vi1Rvn zlx=*Ra+3H>Jj|fpTQ4dZXH6lE7P&AGqV^+$ul-F@v_0-BYmSLN^;CygWVZS6b`*Hm zAryFnk_dJWh7uMj5?3w~0irvm+b$}j#+e>cAiz|nli=UWrgr2V{ZG>;L{ch>OO=KN z+{tBBw0J&RJjyWxV*IX(beDkk3U!sKj5hyi1#tysA^2_+;UP&>5L?b`v3Up0@rRzv zfKv=vL|Y2XpcXS_-YHQsP6U+%rx+ZeEW@j#s^AoZL!ipw6eeh^gHwoi(N+jEs5lN( zC7fa~+Dc&tm5d10LZuYn2R5nJOOAEAbhxx$(%0$ou`ZxSPVJiE@5HdEA|eB%YgK<w z=->uuVy>rPxe!7*Op#(1y<;>7sXW1+{BYBB9E;8j4GFEg_PkvpmyqmW!3f6(33QG6 zSn!29Yqz60Yk6U>@Vi-ozsXAQb~C@HJ%>Q2L)jkv5R<F@JV%70H&<7x81f?qd5#Dr zj0OxoWl(%d*lL+|RLY?bW^2|P?cj|$#WYNmR!T<<BG3=My{wF!f~Omr0NchQr(Pno zh|oChm2x%s^XD@z)!+3mQSMsGN8z19)7VEvrMLwe<S?X_D0V}^gZ+|#Px(mni?0ga zuFniArciJek|R}y!6D$%J_pLc+m$C=7GyDUfHhG>M2L_ORJ+{)PBDoHZ4Lq22X@pX zVNk;Ch)MExKRCq@fe@vxdp5i5s7WO_fH0sm^AnebLaF8_OfzBA&5jx>5vs?o7CChl z3OEM#p&=n@@B~!RDS?rG*jB;2SagQ3(Tn$y^9AtG`w)e3A!KNv+7}#rVv1AIW?ZQl z8Tt8C%o2<wrOSUJ@J16{StRC;n#rt^+On}7U!IZ8uqRMav9mQ%b9{$PKYLlBv|j`K z&8o6>?g+}{CTpT*_rBv5cLjFd>SbHc?o}ku7Lzq)iJIVD4&m0Dl2A^U6Yldhor&~; zkzvRp4iw0A1gVNCbV3#q$S^oW(r3yb-Y&ivN>v>G*I<VNqq(R-QhXo8lb7^5*-=A} zlHGGoF^LFAF9ZqXG)Wk=`|OBG@-_!J#U$~lJjjF6&<UVmicTRPh?tv8me9i`oE1v= zuK$X@&Puzxw%3r+6pN%!@XX-q)lu<NDd|mRGyRYzSD8VrXL?5Y-@gN-7Rf;fc)dMF ztMwcnl?RnagsA!NaPUEbh0pREx{wiy^ByTF>;oT$zdavQ!v16y3w%73*3ohbbz-Oq zQ7P$=O&nDvLe#viRYaghn+1Bpe{eL<cXcBT5t7!UaY`!DE~sHJPbJn0>zFJcLewSr z71UAqVS*hs>q*fmzP2F&*w4@eAWwaZ@z2RY8iVvzm+7iN2>H@qMj?PDpQ;Cmee|nO zPBBCvVR0!H_AM4|k=p=hdD}X9ACYWI_V|_n%X|?uP4pRD1%Nb+gee3-CUakrKE%U5 zWr6dghYMY^3j%Elr)AbLU-G=EbbZ&hu*IlCRiTg3N><8D9^Q_}r_x08I!OPf8WEy> zYhjdgMmkd|1cUv{HFRT|-sUcQAKDpZH)=mL=41b7Mmev`$c{1P%}!{*&zJxDymvk& zB5<Ru*1@)KgI?G+LA^Z-*r8H#72bqWe0mGot+_*lX!y@UhkzRyl$jOHre|j4rZqbZ z&l|SQZz(o!L)46chSgG;1>M(YFhTyi&YC$iIB)J!OJ3QPk-b>kfm~%=`>-paBeArF zx+V4aJ)aY{dMs6^^uI~yuRDQuLjOBOGGWm?tdU6GnlLIQ)Y4M{7X>o>V9e))BZPIA z4@$&N9P?adH{mLCn5ptttqIVnN;w>pEP=uW=rcWDR~_Q2#T&Wqt_Y0+f%CQR<)_YZ z2tb~C8C*8$?PR2Wj+6&?z!9PUfu)#aa#N$;)Bn7NSTQ%Ll=Om1UGGv*M)(QWr>~4q zicc{pwL<GrtK*q9byBBN3MYhK&78g=4tCT8CG{7U2oYvj{N;dsy`TD+K@BrqmADg{ z!Yq4PZ)=`*--3%jrE}CQ-a)VAihM4hQm6Onx1f$|Fr^?{!*@&;A2Q$NeDQ>kGE63C z)HqW#>y^s!r*JNP*<dzvdRbSC)|BNaaXfaMQ4!j9!F<VRy|#rddlfA`gvf9(a6b{n z)q2!21B0@LMx|33C5QSH%%Da^^^`NRns@$C>M|v>p|SoArso|n0)6It@@UICy5dVt zy5zQnEe3UC*ftyHh0I#XZHtj+Cz)DXM_2sBIWB*<hBDUGQpvbBy{X+nudf`u^;Om| zXTbCgxn0~vA33cKrV{?C4pYv6OWkIUG6M_0L3-q15RZ>63>-Mc&{@>Iin4e8BCHWW zZOi0(kWs@(7c83Y5<8ICKopq67>U5+X+?x#z&SZUOM&exn<S1L{hzo;18*ef_V|i? zE@=Cu(*@9ea?3w7nF6^2AA07CLj}~fIGI$U0&AIdnQ*88TV`ZF&=e>?ahXuIfcXhC z38S-d%dE?V`#dfyA+wEjinB5OW`5!_TTtWr>w(f`;<JNqe&YB~rR{7eU3nOWk<Qz* zY3os&i4_ecTV`D@-1qF_t%OW{?c+L=lGS8t<02AEceoy#$tin*$xmE1l-?VD!W@20 z6%vr!mCu><2a?+FQZaj<mTf=rnZlee9WH8HW?d$q2ISsdth6mG^Ot&hA{bZhSKU|W zYe}XkY_|D{%Y^Dr8XWQyW>R*cwRP9C+9{OZeX(4uCyt>5DZ+MMggfzbyDkE8bhhN@ z_M4nyLu;=^0g?@E@`zY{ZlB3%DzBc6GXuHNw7;QKu#vU5BE*TG+gA}7J+eLBW&#S! z+fS7eQa-nr<dp2R_2f7q+e31klAfCX1V>48+uX-q#@<--E<!}Qy*XDY-8u!m=DRv- zkkxs+$tl>mc_v3BFwOcQKxWzeTvQDco>qBSYemuERC}rtuZ`XrG{8!i82e>n&s46w zQ64zu*;A@o1LT{Z&=<gjwc9G29lf=_Y;NJlmhm**M6MFYkN#yc#SZZ{zih$xc>J?F zlX2|~`u$3UXT`k0l)t|$&)a9<`spKodaPfO)Z;B~!ox|xDgLs8*I4<x>1IMH!UYSm zK8?l%ookp$wp%6(&ZiALwV!s;rU}oU6xw*a`Su0kxW26IVdgXPBz)dBpGAO!l(Ls= zDeMWnZM~s80L?~tC{gxuXz=c&vA6<e^pUvnyM0|{*0jdc3-G_+&pL}&cc9?l5vp1e z=<L8$M>NB#t2zyfbZ_Cxni<rZ(O!G=qvP@CVQAfwlhzwWD)xwXjMpvtdK8nWN72ur z_2o&3Luoq3lSF8O1#Wp~mhw)X%z>7&pRfdutFFR_d9d6@%jf_#>{q|;X)pc9sNrS; z$agt^R(FKU#6piJ4NjTW;Fy+cqSfPxTe~fCl{s>-Mh(A_`+lvhrz<p{Gv}{MDy;#S z&3#%nj6(o5*icsrL`Y%qdo{HUqocho?{xoQV#7?o`{#n8f5G0zT69Xoh*_oc?`gkZ z@Ov}tjWCrGG*9^XUNlpE*VQ;|8=!KC?U)Y--$+k*jK{uRH62GHELd3~Ei+eHC>F_J z#&uoR-2Gm+_Gy(vxw8>qH^#$6dZi%)m6GezrcBN^%yC1k9wbq^$Z2&5gui|BhO5kt z2}k4dJw+(5A6kI)SZ$CKFHq+A5fd=p=@4!snlYqO@^#>qg@?$<_Kkmy(mUp<3*^ei z8wN|A<M(oFO22Mlw0A1mQ@^NT*0IrP$1w!`7&KARIVgjt{$+`k`J1e>r+}XJg;ZNn z`%pOwP{B|s`8s&WKU{Iwh~AnA+}$}Q^1p%i3O9k1=pXvp_l>n!gpbF-eT}~R)P0(| zCAYzS*tAAZiTSv-{hr=qT&5coSn_Sq3tNa}J^~xA!kLN9c_%$9QgoK+bbFy23c@@} z0xV#uU)GM%1Py-Ow^^{063i$s)I7bVckHvH#zv~n2eA_t<v_jYUa$?PTnkI+dx_Fq zLfR!V^K9O4Z@rp*SA`yU7xKMUjlJ9ZE(${w)UCBrE)cIKeuT!JV+&p;SBJRjIeOHg zVZu!{0nP#PfUT==m02YNG9@WA&Wa)64S4%aUXwyk^%=@bQ}=qc{Z5B)YpOrhJ*S;C znS-lA?V|wwuBr97fcs$dY8{5Aqr(iI{&-WD&bdw67JczcJvdo(&kL%sEi-R2IKl$~ z^xS7H;P$3@8-m?HV?hDjU1V3Uce?K3dL@j&Jdj!Ta^wOz&6ulS+vtNmt6_$D_{iys zDp&;37dbdzQna4`VEe)OXzdqzL<D@;3$xcn$9PFrCKdwMzVx!M{Q)!$7Ji6P9t&Px zy^4Hj=_+$_9kF^VWfSj#hhS|R;lnk3v+wFmL$0d=T>sv)C%J|RTdUZWfG&5MT#8Mk z^ZPbLuI5|<#bBwZdh3?(-H*gwL*{t2;K!eVXrj)&I7zC<r1Cwhq0;a?kfZXgv9)I5 zqe_9e0#*YuEDn5K9}i*^q(BSR0W0o5QcNY?NJWca4U!Hr4jlVC6j2U-2d?~EVNt%& zj==Aa@XAx=qQoh}Rmsdqg-g@{P$`L$uR?dQAX+hJ9bfxi8hVBh0+6R(dY9e9{->No zpasnaPMN!cl_^<Uhph3K@^=<Or~IFJ;;Uqn0ada{5M9#r<jLMulAC-$wjX>nDPZXw zOWh2sLtJ#T7?!9LyoNn<&c570L%XLw%U*U(?k-boa#H~65I&OrrHAkZ(Pdt@ShMf# z=gqsb-v*ye56$R*m$S&;?=8Yo_z1E$+4zamF`y!$QVI%fp%5X4#a~)!C^0jGDzdBg z0$R)^kwcig<POb534%!1GwNGv5btcl2^T%%jxM5!&{Tbb+zWmjWVraNgav_olGfKo z!{!I8LtIJTxBfP)4)g#K9BIKlK#K|t3?(w<eF=@dwnd_aNYgYG{0bFz7Aws{@Ndpc zcvQAUr!+lLg;kH1z3ED&Yl38RnC(nRQxaPU7H5Yw*s`Zms)yk8qL3VX#{+q0l2E@I zD0)(!Uz<zx^4kLZW?5rsV1)4IhlnG$@!#k^A1@UUU9l!F;}jESacQ(GKJApcz7{qQ zXz*Lw$gRsNv~_)Jfthh+iTYzv&qGE|9W#*UA~vV2x+T>?%X;rafKUh)3ETGEH*a&$ zG)(ZLkz6!mDf017R~f}`FVwyTym()C?`tFW_&8T-=I)_H){$G=w?Qv#Az*$~9U&l+ z%)>;9j8LP56CJA1ts+D4v(Twrw}Nu*Jz8-=v<Wk)4WpN=Q7^y_E4Oti0I7$6)7ej0 zb%ySh*biNX=3}l~sd>C1Ehe^BJRSjYzHy3)Co!2xXGcwx(pcESC#M~DG*Hqww>iZ$ z3{R<7I-!yOA_7_9d@`2&6WRhFujw@uTJV{)Y)ZFVOP$m{M@BCPQ~Rm2sl)T;JNG7Z zwV4R9p8aHUFO_R4sNx4ZbcTK+T@$JIzioi(w>sx(80PTS@Kkx^Gzd>xo>AXIU35(( zi}ofFnxN0hqdnCjzNw~k04$tv%b=@_69Tf}YhP47=lS&Kl&66Eu!$C5O2Q&(L3laz zY{HJ#`wr`toM$2$wEqgE=#<dl|Dq?Z8$<%96P}6~-Ml_>{otc#hAj0bFMEl=jv5Fp z?GOv<DOn0z#!v1e(M!~~9w2b9lz`Lm2`FgPSzntY9Ssj5-SzC?jMS4XA0b5Xsa&p= z)RC$fL5{iTrSbOh-GsA)6e<mqJr$v0lekW!VH~)`QIQm#QZv$PZ+<GF^dzXSebH(^ z<ts~9rFYoU*l)K04cQt^P->V{Aw3_5#JJs;*5@ok%HXLQQ?+4K#9^!V0#1C;qt93K z_5kK5j`^wJ!@2dSWoAYl_NfiAkLlQ6(JAprk|S=8iM=Q*p3VH}$Bd$zsM%3den~iq zwuLPx6{S_%5dH*BgOnIEsPu#4g!qZ0N`Vr$_D$FH_|8z18~d1Q9FC^wl)y+oY^x+s zLM4W;acxWP9blQh<9Xt`Va5~KLc2kF8M1dqVY0m&swmQ{7XJKtvzNUjBn_VLX4L*~ zIVqJ+;<lQVW$%DsHjEtn$vZRk2I%cFe$teS0<m+-@zMc(-3FqUTi&C4nJ09VU>>~) zO)9Cc9bDRg06SB>C<hZl=%hqFpQhlFo{<jJI2b?}rpHgoC*Uo-coHK2-yYz}x~>9Q zwiSzfEtstzc>C~|?+p{Y{L#+=fGcW^rF?;D1V8>Hh$YVhh0-`B)O1o^YM~X~kf>&0 zGOOv`H#E^a%|Pu*OW&`{4EV`Q?*dO0uLvIPM=tO`PH7w{XxI}KL_F#$njA*-1*#87 zmxYdH@(F@}ve3P4KsexxlWJPP%9?QvAU|Q<`V?fYO4v~o8fl&}{?&tsE6$-XU1e^7 zF$1h<wt=84Ao@Y^F^8Wx9BR9dYs@TYgB$_>ZY{@<PjMnQMb$Fv$YP;q+%hT|seYyn zJMn#R>7I$3k0$&F9qULyARCJVs54p=)@*y{dpTYU|7^yO!7d+e0nc70t^&_3>3+sw zr(eAIP|KgLZq*<dU0D2Y5aKMq^H+^L0JjbS=BH9gG*KuxJLt7=3k4~BJ9U&{nQ&fG zqEaV`P(?dy_viqxDNrsW>6VXd_5q|7$@sfgIK|Xbgk}dp>IabsUvCHuIj&KFYV@G= z5Uh0#Fp^FBO2`-H?C=XmiPlgH`_4SCXQfbVOJX!GaV`@}Fa*Mo|4Ic}to-E8hyyI& z^3rnItOB$!VC?<F#5w^@@Q|=ca-rSdQNWZLR2^?k&@>Zn*l@QGZQRfmTrD(e`Pie` ze9PxX=^uPHJSNGsDoKF+9-4%LYu{D(^Sk-iy5C!~{WQVb*&aX>{R93tAUnvYDtm&D zP-P=SwZ8GLMceX@1GJ)HpAN9GXJ7X#LI~!3K$>^2YxoppjeaoK*a=qC4uk1K%r(!V z^%M2DYFQD;XTC@@%t4HwQ-&G1j+UaaZ5<%W^`07iRtN!c)P#n>5N-A5bZ^%b4v)o0 z1c>A#2rqKpGG6DO1sVBh@Y2Bwb%0K==Kxoawm}l3#dp{P<iBD*%3Iis596q?Z%<$p zONm@SP2U$w<Q0-Pc8Y|^4?g*n8Ab2%V=Or#gcB0};My<wy#9O&B@LT=Gq2WcC^#pZ zhM{6|ZYH~V-G8l{ZHniITNMKljZWUy+OAOUL$C|WgHq<dzwBeuKU6}vsM{rgoOL59 z1j>d7m}j80H$PnawX(t|q00!R{52Isd)Ki3rsYg?4Wq?neJydGSguj3`nIXSgzBO7 zGyL32RqbooDsskM{2W0``rezsg!n((tM=Pe7ysF!{*1V`pS9C|h4zcmrhTw)P?Y`w G0001yd~9+6 literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/pagetop-logo.svg b/pagetop/static/theme/pagetop-logo.svg new file mode 100644 index 00000000..3666bf3a --- /dev/null +++ b/pagetop/static/theme/pagetop-logo.svg @@ -0,0 +1,14 @@ +<svg width="16.14mm" height="16.14mm" viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" aria-label="PageTop Logo" role="img"> +<path fill="rgb(255,184,75)" d="M 633,61 L 633,61 C 579,61 527,75 480,102 433,129 395,167 368,214 341,261 327,313 327,367 L 327,1244 327,1245 C 327,1299 341,1351 368,1398 395,1445 433,1483 480,1510 527,1537 579,1551 633,1551 L 982,1550 982,1551 C 1036,1551 1088,1537 1135,1510 1182,1483 1220,1445 1247,1398 1274,1351 1288,1299 1288,1245 L 1288,367 1288,367 1288,367 C 1288,313 1274,261 1247,214 1220,167 1182,129 1135,102 1088,75 1036,61 982,61 L 633,61 Z" /> +<path fill="rgb(158,96,0)" d="M 1389,573 L 1328,573 1328,460 1449,460 1449,573 1389,573 Z M 1491,627 L 1430,627 1430,404 1551,404 1551,627 1491,627 Z M 222,573 L 161,573 161,460 282,460 282,573 222,573 Z M 120,627 L 59,627 59,404 180,404 180,627 120,627 Z" /> +<path fill="rgb(150,0,184)" d="M 678,1040 L 678,1040 C 645,1040 612,1049 583,1065 554,1082 530,1106 513,1135 497,1164 488,1197 488,1230 L 488,1230 488,1230 C 488,1263 497,1296 513,1325 530,1354 554,1378 583,1395 612,1411 645,1420 678,1420 L 940,1420 940,1420 C 973,1420 1006,1411 1035,1395 1064,1378 1088,1354 1105,1325 1121,1296 1130,1263 1130,1230 L 1130,1230 1130,1230 1130,1230 C 1130,1197 1121,1164 1105,1135 1088,1106 1064,1082 1035,1065 1006,1049 973,1040 940,1040 L 678,1040 Z M 488,1040 L 488,1040 488,1040 488,1040 488,1040 488,1040 488,1238 488,1238 488,1238 488,1238 488,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1040 1130,1040 1130,1040 1130,1040 1130,1040 488,1040 Z" /> +<path fill="rgb(255,255,255)" d="M 518,1128 L 488,1128 488,1066 547,1066 547,1128 518,1128 Z M 966,1128 L 908,1128 908,1066 1024,1066 1024,1128 966,1128 Z" /> +<path fill="rgb(221,255,149)" d="M 898,71 C 940,48 987,36 1035,36 1086,36 1137,50 1181,77 1226,104 1263,142 1289,189 1314,236 1328,288 1328,342 1328,396 1314,448 1289,495 1281,509 1272,522 1262,535 L 898,71 Z M 1337,429 C 1307,460 1272,480 1233,488 1192,496 1148,490 1107,470 1066,451 1029,418 999,375 969,332 948,281 938,227 927,173 928,117 940,66 943,51 948,36 953,22 L 1337,429 Z" /> +<path fill="rgb(146,128,99)" d="M 703,99 C 717,121 722,149 719,178 715,208 702,238 682,267 661,295 634,320 602,340 571,360 536,373 501,379 467,385 434,383 405,373 377,363 355,346 341,323 327,301 322,273 325,244 329,214 342,184 362,155 383,127 410,102 442,82 473,62 508,49 543,43 577,37 610,39 639,49 667,59 689,76 703,99 L 703,99 Z" /> +<path fill="rgb(146,128,99)" d="M 672,550 C 683,568 685,590 678,615 671,640 655,668 632,694 609,720 580,745 547,765 514,785 479,801 446,810 412,819 381,821 355,816 329,811 310,799 299,782 288,765 286,742 293,717 301,692 316,665 339,638 362,612 391,588 424,567 457,547 492,531 526,523 559,514 591,511 616,516 642,521 661,533 672,550 L 672,550 Z" /> +<path fill="rgb(146,128,99)" d="M 455,160 L 456,160 C 430,160 404,167 381,180 359,193 340,212 327,234 314,257 307,283 307,309 L 307,580 307,580 C 307,606 314,632 327,655 340,677 359,696 381,709 404,722 430,729 456,729 L 529,729 529,729 C 555,729 581,722 604,709 626,696 645,677 658,655 671,632 678,606 678,580 L 677,308 678,309 678,309 C 678,283 671,257 658,234 645,212 626,193 604,180 581,167 555,160 529,160 L 455,160 Z" /> +<path fill="rgb(240,0,0)" d="M 698,1332 L 699,1332 C 696,1332 694,1333 691,1334 689,1335 687,1337 686,1339 685,1342 684,1344 684,1347 L 684,1405 684,1405 C 684,1408 685,1410 686,1413 687,1415 689,1417 691,1418 694,1419 696,1420 699,1420 L 914,1419 914,1420 C 917,1420 919,1419 922,1418 924,1417 926,1415 927,1413 928,1410 929,1408 929,1405 L 929,1346 929,1347 929,1347 C 929,1344 928,1342 927,1339 926,1337 924,1335 922,1334 919,1333 917,1332 914,1332 L 698,1332 Z M 643,780 C 643,797 638,814 630,830 621,845 608,858 593,867 577,875 560,880 543,880 525,880 508,875 492,867 477,858 464,845 455,830 447,814 442,797 442,780 442,762 447,745 455,729 464,714 477,701 492,692 508,684 525,679 542,679 560,679 577,684 593,692 608,701 621,714 630,729 638,745 643,762 643,779 L 643,780 Z M 1171,780 C 1171,797 1166,814 1158,830 1149,845 1136,858 1121,867 1105,875 1088,880 1071,880 1053,880 1036,875 1020,867 1005,858 992,845 983,830 975,814 970,797 970,780 970,762 975,745 983,729 992,714 1005,701 1020,692 1036,684 1053,679 1071,679 1088,679 1105,684 1121,692 1136,701 1149,714 1158,729 1166,745 1171,762 1171,779 L 1171,780 Z" /> +<path fill="rgb(10,11,9)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" /> +<path fill="rgb(10,11,9)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" /> +<path fill="rgb(10,11,9)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" /> +</svg> From 33dff8f08545d696471ed02961552e622bcceaf4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 8 Oct 2023 21:04:05 +0200 Subject: [PATCH 537/853] =?UTF-8?q?=F0=9F=92=A5=20New=20names=20for=20opti?= =?UTF-8?q?onal=20attributes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 20 ++++----- pagetop/src/base/component/block.rs | 20 +++++---- .../src/base/component/form_element/button.rs | 16 +++---- .../src/base/component/form_element/date.rs | 44 +++++++++---------- .../src/base/component/form_element/form.rs | 16 +++---- .../src/base/component/form_element/hidden.rs | 8 ++-- .../src/base/component/form_element/input.rs | 36 +++++++-------- pagetop/src/base/component/heading.rs | 8 ++-- pagetop/src/base/component/icon.rs | 4 +- pagetop/src/base/component/image.rs | 12 ++--- pagetop/src/base/component/paragraph.rs | 8 ++-- pagetop/src/base/component/wrapper.rs | 12 ++--- pagetop/src/html.rs | 24 ++++++---- .../src/html/{classes.rs => opt_classes.rs} | 32 ++++++++++---- pagetop/src/html/{name.rs => opt_id.rs} | 14 +++--- .../src/html/{attribute.rs => opt_name.rs} | 14 +++--- .../src/html/{identifier.rs => opt_string.rs} | 14 +++--- pagetop/src/response/page.rs | 8 ++-- 18 files changed, 167 insertions(+), 143 deletions(-) rename pagetop/src/html/{classes.rs => opt_classes.rs} (79%) rename pagetop/src/html/{name.rs => opt_id.rs} (52%) rename pagetop/src/html/{attribute.rs => opt_name.rs} (51%) rename pagetop/src/html/{identifier.rs => opt_string.rs} (50%) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 4f021ce2..d157b942 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -28,10 +28,10 @@ type AnchorHtml = TypedComponent<L10n>; pub struct Anchor { weight : Weight, renderable : Renderable, - id : IdentifierValue, - classes : Classes, + id : OptionId, + classes : OptionClasses, anchor_type: AnchorType, - href : AttributeValue, + href : OptionString, html : AnchorHtml, left_icon : AnchorIcon, right_icon : AnchorIcon, @@ -85,18 +85,18 @@ impl ComponentTrait for Anchor { } impl Anchor { - pub fn link(href: &str, html: L10n) -> Self { + pub fn link(href: impl Into<String>, html: L10n) -> Self { Anchor::new().with_href(href).with_html(html) } - pub fn button(href: &str, html: L10n) -> Self { + pub fn button(href: impl Into<String>, html: L10n) -> Self { Anchor::new() .with_type(AnchorType::Button) .with_href(href) .with_html(html) } - pub fn location(id: &str) -> Self { + pub fn location(id: impl Into<String>) -> Self { Anchor::new().with_type(AnchorType::Location).with_id(id) } @@ -115,7 +115,7 @@ impl Anchor { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -140,7 +140,7 @@ impl Anchor { } #[fn_builder] - pub fn alter_href(&mut self, href: &str) -> &mut Self { + pub fn alter_href(&mut self, href: impl Into<String>) -> &mut Self { self.href.alter_value(href); self } @@ -177,7 +177,7 @@ impl Anchor { // Anchor GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } @@ -185,7 +185,7 @@ impl Anchor { &self.anchor_type } - pub fn href(&self) -> &AttributeValue { + pub fn href(&self) -> &OptionString { &self.href } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index f83ff261..ab3b1370 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -4,14 +4,16 @@ new_handle!(COMPONENT_BLOCK); actions_for_component!(Block); +type BlockTitle = TypedComponent<L10n>; + #[rustfmt::skip] #[derive(Default)] pub struct Block { weight : Weight, renderable: Renderable, - id : IdentifierValue, - classes : Classes, - title : AttributeValue, + id : OptionId, + classes : OptionClasses, + title : BlockTitle, stuff : ArcComponents, template : String, } @@ -45,7 +47,7 @@ impl ComponentTrait for Block { let id = cx.required_id::<Block>(self.id()); PrepareMarkup::With(html! { div id=(id) class=[self.classes().get()] { - @if let Some(title) = self.title().get() { + @if let Some(title) = self.title().get().into_string(cx) { h2 class="block-title" { (title) } } div class="block-body" { @@ -64,7 +66,7 @@ impl Block { // Block BUILDER. #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -88,8 +90,8 @@ impl Block { } #[fn_builder] - pub fn alter_title(&mut self, title: &str) -> &mut Self { - self.title.alter_value(title); + pub fn alter_title(&mut self, title: L10n) -> &mut Self { + self.title.set(title); self } @@ -112,11 +114,11 @@ impl Block { // Block GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } - pub fn title(&self) -> &AttributeValue { + pub fn title(&self) -> &BlockTitle { &self.title } diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form_element/button.rs index ee869382..94b422dd 100644 --- a/pagetop/src/base/component/form_element/button.rs +++ b/pagetop/src/base/component/form_element/button.rs @@ -17,12 +17,12 @@ type ButtonValue = TypedComponent<L10n>; pub struct Button { weight : Weight, renderable : Renderable, - classes : Classes, + classes : OptionClasses, button_type: ButtonType, - name : AttributeValue, + name : OptionString, value : ButtonValue, - autofocus : AttributeValue, - disabled : AttributeValue, + autofocus : OptionString, + disabled : OptionString, template : String, } @@ -146,7 +146,7 @@ impl Button { // Button GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } @@ -154,7 +154,7 @@ impl Button { &self.button_type } - pub fn name(&self) -> &AttributeValue { + pub fn name(&self) -> &OptionString { &self.name } @@ -162,11 +162,11 @@ impl Button { &self.value } - pub fn autofocus(&self) -> &AttributeValue { + pub fn autofocus(&self) -> &OptionString { &self.autofocus } - pub fn disabled(&self) -> &AttributeValue { + pub fn disabled(&self) -> &OptionString { &self.disabled } diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form_element/date.rs index 17e70845..f9b71c89 100644 --- a/pagetop/src/base/component/form_element/date.rs +++ b/pagetop/src/base/component/form_element/date.rs @@ -7,17 +7,17 @@ new_handle!(COMPONENT_DATE); pub struct Date { weight : Weight, renderable : Renderable, - classes : Classes, - name : AttributeValue, - value : AttributeValue, - label : AttributeValue, - placeholder : AttributeValue, - autofocus : AttributeValue, - autocomplete: AttributeValue, - disabled : AttributeValue, - readonly : AttributeValue, - required : AttributeValue, - help_text : AttributeValue, + classes : OptionClasses, + name : OptionString, + value : OptionString, + label : OptionString, + placeholder : OptionString, + autofocus : OptionString, + autocomplete: OptionString, + disabled : OptionString, + readonly : OptionString, + required : OptionString, + help_text : OptionString, template : String, } @@ -176,47 +176,47 @@ impl Date { // Date GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } - pub fn name(&self) -> &AttributeValue { + pub fn name(&self) -> &OptionString { &self.name } - pub fn value(&self) -> &AttributeValue { + pub fn value(&self) -> &OptionString { &self.value } - pub fn label(&self) -> &AttributeValue { + pub fn label(&self) -> &OptionString { &self.label } - pub fn placeholder(&self) -> &AttributeValue { + pub fn placeholder(&self) -> &OptionString { &self.placeholder } - pub fn autofocus(&self) -> &AttributeValue { + pub fn autofocus(&self) -> &OptionString { &self.autofocus } - pub fn autocomplete(&self) -> &AttributeValue { + pub fn autocomplete(&self) -> &OptionString { &self.autocomplete } - pub fn disabled(&self) -> &AttributeValue { + pub fn disabled(&self) -> &OptionString { &self.disabled } - pub fn readonly(&self) -> &AttributeValue { + pub fn readonly(&self) -> &OptionString { &self.readonly } - pub fn required(&self) -> &AttributeValue { + pub fn required(&self) -> &OptionString { &self.required } - pub fn help_text(&self) -> &AttributeValue { + pub fn help_text(&self) -> &OptionString { &self.help_text } diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form_element/form.rs index f4da8da7..3767d0b7 100644 --- a/pagetop/src/base/component/form_element/form.rs +++ b/pagetop/src/base/component/form_element/form.rs @@ -16,10 +16,10 @@ pub enum FormMethod { pub struct Form { weight : Weight, renderable: Renderable, - id : IdentifierValue, - classes : Classes, - action : AttributeValue, - charset : AttributeValue, + id : OptionId, + classes : OptionClasses, + action : OptionString, + charset : OptionString, method : FormMethod, stuff : ArcComponents, template : String, @@ -91,7 +91,7 @@ impl Form { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -139,15 +139,15 @@ impl Form { // Form GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } - pub fn action(&self) -> &AttributeValue { + pub fn action(&self) -> &OptionString { &self.action } - pub fn charset(&self) -> &AttributeValue { + pub fn charset(&self) -> &OptionString { &self.charset } diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form_element/hidden.rs index 79264c01..25807a45 100644 --- a/pagetop/src/base/component/form_element/hidden.rs +++ b/pagetop/src/base/component/form_element/hidden.rs @@ -6,8 +6,8 @@ new_handle!(COMPONENT_HIDDEN); #[derive(Default)] pub struct Hidden { weight: Weight, - name : NameValue, - value : AttributeValue, + name : OptionName, + value : OptionString, } impl ComponentTrait for Hidden { @@ -58,11 +58,11 @@ impl Hidden { // Hidden GETTERS. - pub fn name(&self) -> &NameValue { + pub fn name(&self) -> &OptionName { &self.name } - pub fn value(&self) -> &AttributeValue { + pub fn value(&self) -> &OptionString { &self.value } } diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form_element/input.rs index 7a06dda5..00595fe3 100644 --- a/pagetop/src/base/component/form_element/input.rs +++ b/pagetop/src/base/component/form_element/input.rs @@ -21,20 +21,20 @@ type InputHelpText = TypedComponent<L10n>; pub struct Input { weight : Weight, renderable : Renderable, - classes : Classes, + classes : OptionClasses, input_type : InputType, - name : NameValue, - value : AttributeValue, + name : OptionName, + value : OptionString, label : InputLabel, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, - placeholder : AttributeValue, - autofocus : AttributeValue, - autocomplete: AttributeValue, - disabled : AttributeValue, - readonly : AttributeValue, - required : AttributeValue, + placeholder : OptionString, + autofocus : OptionString, + autocomplete: OptionString, + disabled : OptionString, + readonly : OptionString, + required : OptionString, help_text : InputHelpText, template : String, } @@ -282,7 +282,7 @@ impl Input { // Input GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } @@ -290,11 +290,11 @@ impl Input { &self.input_type } - pub fn name(&self) -> &NameValue { + pub fn name(&self) -> &OptionName { &self.name } - pub fn value(&self) -> &AttributeValue { + pub fn value(&self) -> &OptionString { &self.value } @@ -314,27 +314,27 @@ impl Input { self.maxlength } - pub fn placeholder(&self) -> &AttributeValue { + pub fn placeholder(&self) -> &OptionString { &self.placeholder } - pub fn autofocus(&self) -> &AttributeValue { + pub fn autofocus(&self) -> &OptionString { &self.autofocus } - pub fn autocomplete(&self) -> &AttributeValue { + pub fn autocomplete(&self) -> &OptionString { &self.autocomplete } - pub fn disabled(&self) -> &AttributeValue { + pub fn disabled(&self) -> &OptionString { &self.disabled } - pub fn readonly(&self) -> &AttributeValue { + pub fn readonly(&self) -> &OptionString { &self.readonly } - pub fn required(&self) -> &AttributeValue { + pub fn required(&self) -> &OptionString { &self.required } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 3b87dd5e..3c07bb51 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -32,8 +32,8 @@ type HeadingText = TypedComponent<L10n>; pub struct Heading { weight : Weight, renderable : Renderable, - id : IdentifierValue, - classes : Classes, + id : OptionId, + classes : OptionClasses, heading_type: HeadingType, text : HeadingText, display : HeadingDisplay, @@ -127,7 +127,7 @@ impl Heading { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -177,7 +177,7 @@ impl Heading { // Paragraph GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 0b45ea08..a90a70e3 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -8,7 +8,7 @@ pub struct Icon { weight : Weight, renderable: Renderable, icon_name : String, - classes : Classes, + classes : OptionClasses, } impl ComponentTrait for Icon { @@ -73,7 +73,7 @@ impl Icon { self.icon_name.as_str() } - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index ddff8144..6cf1c632 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -20,9 +20,9 @@ pub enum ImageSize { pub struct Image { weight : Weight, renderable: Renderable, - id : IdentifierValue, - classes : Classes, - source : AttributeValue, + id : OptionId, + classes : OptionClasses, + source : OptionString, size : ImageSize, } @@ -101,7 +101,7 @@ impl Image { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -126,11 +126,11 @@ impl Image { // Image GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } - pub fn source(&self) -> &AttributeValue { + pub fn source(&self) -> &OptionString { &self.source } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index b968140f..b51de2fa 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -18,8 +18,8 @@ pub enum ParagraphDisplay { pub struct Paragraph { weight : Weight, renderable: Renderable, - id : IdentifierValue, - classes : Classes, + id : OptionId, + classes : OptionClasses, stuff : ArcComponents, display : ParagraphDisplay, template : String, @@ -78,7 +78,7 @@ impl Paragraph { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -126,7 +126,7 @@ impl Paragraph { // Paragraph GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 339302fc..aa4d2e36 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -19,9 +19,9 @@ pub enum WrapperType { pub struct Wrapper { weight : Weight, renderable : Renderable, - id : IdentifierValue, - classes : Classes, - inner_classes: Classes, + id : OptionId, + classes : OptionClasses, + inner_classes: OptionClasses, wrapper_type : WrapperType, stuff : ArcComponents, template : String, @@ -137,7 +137,7 @@ impl Wrapper { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -173,11 +173,11 @@ impl Wrapper { // Wrapper GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } - pub fn inner_classes(&self) -> &Classes { + pub fn inner_classes(&self) -> &OptionClasses { &self.inner_classes } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 34cb7cdb..8e8e43ef 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -13,17 +13,17 @@ pub use assets::Assets; mod favicon; pub use favicon::Favicon; -mod identifier; -pub use identifier::IdentifierValue; +mod opt_id; +pub use opt_id::OptionId; -mod name; -pub use name::NameValue; +mod opt_name; +pub use opt_name::OptionName; -mod attribute; -pub use attribute::AttributeValue; +mod opt_string; +pub use opt_string::OptionString; -mod classes; -pub use classes::{Classes, ClassesOp}; +mod opt_classes; +pub use opt_classes::{ClassesOp, OptionClasses}; pub mod unit; @@ -45,7 +45,13 @@ impl PrepareMarkup { pub fn into_string(self) -> Option<String> { match self { PrepareMarkup::None => None, - PrepareMarkup::Text(text) => Some(text.to_string()), + PrepareMarkup::Text(text) => { + if text.is_empty() { + None + } else { + Some(text.to_string()) + } + } PrepareMarkup::With(markup) => Some(markup.into_string()), } } diff --git a/pagetop/src/html/classes.rs b/pagetop/src/html/opt_classes.rs similarity index 79% rename from pagetop/src/html/classes.rs rename to pagetop/src/html/opt_classes.rs index c7fd6154..3be0c977 100644 --- a/pagetop/src/html/classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -1,4 +1,4 @@ -//! **Classes** implements a *helper* for dynamically adding class names to components. +//! **OptionClasses** implements a *helper* for dynamically adding class names to components. //! //! This *helper* differentiates between default classes (generally associated with styles provided //! by the theme) and user classes (for customizing components based on application styles). @@ -18,7 +18,9 @@ pub enum ClassesOp { Add, Remove, Replace(String), + Toggle, Reset, + Clear, } #[derive(Clone, PartialEq)] @@ -28,14 +30,14 @@ enum ClassType { } #[derive(Default)] -pub struct Classes(Vec<(String, ClassType)>); +pub struct OptionClasses(Vec<(String, ClassType)>); -impl Classes { +impl OptionClasses { pub fn new() -> Self { - Classes::default() + OptionClasses::default() } - // Classes BUILDER. + // OptionClasses BUILDER. #[fn_builder] pub fn alter_value(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { @@ -58,8 +60,8 @@ impl Classes { self.add(&classes, self.0.len(), ClassType::User); } ClassesOp::Remove => { - for name in classes { - self.0.retain(|(c, _)| c.ne(&name.to_string())); + for class in classes { + self.0.retain(|(c, _)| c.ne(&class.to_string())); } } ClassesOp::Replace(classes_to_replace) => { @@ -79,9 +81,23 @@ impl Classes { } self.add(&classes, pos, class_type); } + ClassesOp::Toggle => { + for class in classes { + if !class.is_empty() { + if let Some(pos) = self.0.iter().position(|(c, _)| c.eq(class)) { + self.0.remove(pos); + } else { + self.0.push((class.to_string(), ClassType::User)); + } + } + } + } ClassesOp::Reset => { self.0.retain(|(_, t)| t.ne(&ClassType::User)); } + ClassesOp::Clear => { + self.0.clear(); + } } self } @@ -96,7 +112,7 @@ impl Classes { } } - // Classes GETTERS. + // OptionClasses GETTERS. pub fn exists(&self, class: impl Into<String>) -> bool { let class: String = class.into(); diff --git a/pagetop/src/html/name.rs b/pagetop/src/html/opt_id.rs similarity index 52% rename from pagetop/src/html/name.rs rename to pagetop/src/html/opt_id.rs index c3f2af12..fbc02f0d 100644 --- a/pagetop/src/html/name.rs +++ b/pagetop/src/html/opt_id.rs @@ -1,22 +1,22 @@ use crate::fn_builder; #[derive(Default)] -pub struct NameValue(String); +pub struct OptionId(String); -impl NameValue { +impl OptionId { pub fn new() -> Self { - NameValue::default() + OptionId::default() } - // NameValue BUILDER. + // OptionId BUILDER. #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.0 = value.trim().replace(' ', "_"); + pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { + self.0 = value.into().trim().replace(' ', "_"); self } - // NameValue GETTERS. + // OptionId GETTERS. pub fn get(&self) -> Option<String> { if self.0.is_empty() { diff --git a/pagetop/src/html/attribute.rs b/pagetop/src/html/opt_name.rs similarity index 51% rename from pagetop/src/html/attribute.rs rename to pagetop/src/html/opt_name.rs index 965e8beb..1e811c33 100644 --- a/pagetop/src/html/attribute.rs +++ b/pagetop/src/html/opt_name.rs @@ -1,22 +1,22 @@ use crate::fn_builder; #[derive(Default)] -pub struct AttributeValue(String); +pub struct OptionName(String); -impl AttributeValue { +impl OptionName { pub fn new() -> Self { - AttributeValue::default() + OptionName::default() } - // AttributeValue BUILDER. + // OptionName BUILDER. #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.0 = value.trim().to_owned(); + pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { + self.0 = value.into().trim().replace(' ', "_"); self } - // AttributeValue GETTERS. + // OptionName GETTERS. pub fn get(&self) -> Option<String> { if self.0.is_empty() { diff --git a/pagetop/src/html/identifier.rs b/pagetop/src/html/opt_string.rs similarity index 50% rename from pagetop/src/html/identifier.rs rename to pagetop/src/html/opt_string.rs index 90f8295b..aa872b3a 100644 --- a/pagetop/src/html/identifier.rs +++ b/pagetop/src/html/opt_string.rs @@ -1,22 +1,22 @@ use crate::fn_builder; #[derive(Default)] -pub struct IdentifierValue(String); +pub struct OptionString(String); -impl IdentifierValue { +impl OptionString { pub fn new() -> Self { - IdentifierValue::default() + OptionString::default() } - // IdentifierValue BUILDER. + // OptionString BUILDER. #[fn_builder] - pub fn alter_value(&mut self, value: &str) -> &mut Self { - self.0 = value.trim().replace(' ', "_"); + pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { + self.0 = value.into().trim().to_owned(); self } - // IdentifierValue GETTERS. + // OptionString GETTERS. pub fn get(&self) -> Option<String> { if self.0.is_empty() { diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 0425dbf0..e40ad2a7 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -3,7 +3,7 @@ use crate::base::component::L10n; use crate::core::component::{ArcComponent, ComponentTrait, TypedComponent}; use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; -use crate::html::{html, Classes, ClassesOp, Favicon, Markup, DOCTYPE}; +use crate::html::{html, ClassesOp, Favicon, Markup, OptionClasses, DOCTYPE}; use crate::response::fatal_error::FatalError; use crate::{fn_builder, service}; @@ -22,7 +22,7 @@ pub struct Page { properties : Vec<(&'static str, &'static str)>, favicon : Option<Favicon>, context : Context, - body_classes: Classes, + body_classes: OptionClasses, regions : ComponentsRegions, template : String, } @@ -37,7 +37,7 @@ impl Page { properties : Vec::new(), favicon : None, context : Context::new(request), - body_classes: Classes::new().with_value(ClassesOp::SetDefault, "body"), + body_classes: OptionClasses::new().with_value(ClassesOp::SetDefault, "body"), regions : ComponentsRegions::new(), template : "default".to_owned(), } @@ -125,7 +125,7 @@ impl Page { &mut self.context } - pub fn body_classes(&self) -> &Classes { + pub fn body_classes(&self) -> &OptionClasses { &self.body_classes } From 0a03e293a27f3860f074e21745f19dcc068d9445 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 8 Oct 2023 21:14:03 +0200 Subject: [PATCH 538/853] =?UTF-8?q?=E2=9C=A8=20Add=20component=20getter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/arc.rs | 10 +++++++++- pagetop/src/core/component/typed.rs | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs index 4c0b0814..c3e5c2cd 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc.rs @@ -2,7 +2,7 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; use crate::{new_handle, Handle, Weight}; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc, RwLock, RwLockReadGuard}; new_handle!(COMPONENT_NULL for Crate); @@ -37,10 +37,18 @@ impl ArcComponent { ArcComponent(Arc::new(RwLock::new(component))) } + // ArcComponent BUILDER. + pub fn set(&mut self, component: impl ComponentTrait) { self.0 = Arc::new(RwLock::new(component)); } + // ArcComponent GETTERS. + + pub fn get(&self) -> RwLockReadGuard<'_, dyn ComponentTrait> { + self.0.read().unwrap() + } + pub(crate) fn handle(&self) -> Handle { self.0.read().unwrap().handle() } diff --git a/pagetop/src/core/component/typed.rs b/pagetop/src/core/component/typed.rs index e31acab6..0197645d 100644 --- a/pagetop/src/core/component/typed.rs +++ b/pagetop/src/core/component/typed.rs @@ -2,7 +2,7 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; use crate::{Handle, Weight}; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc, RwLock, RwLockReadGuard}; #[derive(Default)] pub struct TypedComponent<T: ComponentTrait + Default>(Arc<RwLock<T>>); @@ -22,10 +22,18 @@ impl<T: ComponentTrait + Default> TypedComponent<T> { TypedComponent(Arc::new(RwLock::new(component))) } + // TypedComponent BUILDER. + pub fn set(&mut self, component: T) { self.0 = Arc::new(RwLock::new(component)); } + // TypedComponent GETTERS. + + pub fn get(&self) -> RwLockReadGuard<'_, T> { + self.0.read().unwrap() + } + pub(crate) fn handle(&self) -> Handle { self.0.read().unwrap().handle() } From 0d61c9e0457cf89022e2177394e83e45916732d6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 9 Oct 2023 18:19:10 +0200 Subject: [PATCH 539/853] =?UTF-8?q?=F0=9F=8E=A8=20Change=20form=5Felement?= =?UTF-8?q?=20dir=20to=20more=20ergonomic=20form?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/{form_element.rs => form.rs} | 4 ++-- pagetop/src/base/component/{form_element => form}/button.rs | 0 pagetop/src/base/component/{form_element => form}/date.rs | 0 .../component/{form_element/form.rs => form/form_main.rs} | 0 pagetop/src/base/component/{form_element => form}/hidden.rs | 0 pagetop/src/base/component/{form_element => form}/input.rs | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename pagetop/src/base/component/{form_element.rs => form.rs} (77%) rename pagetop/src/base/component/{form_element => form}/button.rs (100%) rename pagetop/src/base/component/{form_element => form}/date.rs (100%) rename pagetop/src/base/component/{form_element/form.rs => form/form_main.rs} (100%) rename pagetop/src/base/component/{form_element => form}/hidden.rs (100%) rename pagetop/src/base/component/{form_element => form}/input.rs (100%) diff --git a/pagetop/src/base/component/form_element.rs b/pagetop/src/base/component/form.rs similarity index 77% rename from pagetop/src/base/component/form_element.rs rename to pagetop/src/base/component/form.rs index bbd4e309..ea9db735 100644 --- a/pagetop/src/base/component/form_element.rs +++ b/pagetop/src/base/component/form.rs @@ -1,5 +1,5 @@ -mod form; -pub use form::{Form, FormMethod, COMPONENT_FORM}; +mod form_main; +pub use form_main::{Form, FormMethod, COMPONENT_FORM}; mod input; pub use input::{Input, InputType, COMPONENT_INPUT}; diff --git a/pagetop/src/base/component/form_element/button.rs b/pagetop/src/base/component/form/button.rs similarity index 100% rename from pagetop/src/base/component/form_element/button.rs rename to pagetop/src/base/component/form/button.rs diff --git a/pagetop/src/base/component/form_element/date.rs b/pagetop/src/base/component/form/date.rs similarity index 100% rename from pagetop/src/base/component/form_element/date.rs rename to pagetop/src/base/component/form/date.rs diff --git a/pagetop/src/base/component/form_element/form.rs b/pagetop/src/base/component/form/form_main.rs similarity index 100% rename from pagetop/src/base/component/form_element/form.rs rename to pagetop/src/base/component/form/form_main.rs diff --git a/pagetop/src/base/component/form_element/hidden.rs b/pagetop/src/base/component/form/hidden.rs similarity index 100% rename from pagetop/src/base/component/form_element/hidden.rs rename to pagetop/src/base/component/form/hidden.rs diff --git a/pagetop/src/base/component/form_element/input.rs b/pagetop/src/base/component/form/input.rs similarity index 100% rename from pagetop/src/base/component/form_element/input.rs rename to pagetop/src/base/component/form/input.rs From 9b317142e06b095fe96ddd77b5ad166775e5dbd4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 Oct 2023 10:23:50 +0200 Subject: [PATCH 540/853] =?UTF-8?q?=F0=9F=94=A5=20Remove=20megamenu=20crat?= =?UTF-8?q?e=20for=20PageTop=20integration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/Cargo.toml | 22 -- pagetop-megamenu/README.md | 27 -- pagetop-megamenu/build.rs | 7 - pagetop-megamenu/src/component/item.rs | 141 ------- pagetop-megamenu/src/component/menu.rs | 181 --------- pagetop-megamenu/src/lib.rs | 38 -- pagetop-megamenu/src/locale/en-US/module.ftl | 4 - pagetop-megamenu/src/locale/es-ES/module.ftl | 4 - pagetop-megamenu/static/css/sm-blue.css | 333 ---------------- pagetop-megamenu/static/css/sm-blue.css.map | 7 - pagetop-megamenu/static/css/sm-clean.css | 327 ---------------- pagetop-megamenu/static/css/sm-clean.css.map | 7 - pagetop-megamenu/static/css/sm-mint.css | 331 ---------------- pagetop-megamenu/static/css/sm-mint.css.map | 7 - pagetop-megamenu/static/css/sm-simple.css | 249 ------------ pagetop-megamenu/static/css/sm-simple.css.map | 7 - pagetop-megamenu/static/css/smartmenus.css | 130 ------ pagetop-megamenu/static/js/smartmenus.min.js | 3 - pagetop/src/base/component/menu.rs | 17 + pagetop/src/base/component/menu/element.rs | 92 +++++ pagetop/src/base/component/menu/group.rs | 86 ++++ pagetop/src/base/component/menu/item.rs | 179 +++++++++ pagetop/src/base/component/menu/megamenu.rs | 85 ++++ pagetop/src/base/component/menu/menu_main.rs | 122 ++++++ pagetop/src/base/component/menu/submenu.rs | 102 +++++ pagetop/src/locale/en-US/base.ftl | 3 + pagetop/src/locale/es-ES/base.ftl | 3 + pagetop/static/theme/css/menu.css | 369 ++++++++++++++++++ pagetop/static/theme/css/root.css | 16 +- pagetop/static/theme/css/styles.css | 12 +- pagetop/static/theme/js/menu.js | 78 ++++ 31 files changed, 1161 insertions(+), 1828 deletions(-) delete mode 100644 pagetop-megamenu/Cargo.toml delete mode 100644 pagetop-megamenu/README.md delete mode 100644 pagetop-megamenu/build.rs delete mode 100644 pagetop-megamenu/src/component/item.rs delete mode 100644 pagetop-megamenu/src/component/menu.rs delete mode 100644 pagetop-megamenu/src/lib.rs delete mode 100644 pagetop-megamenu/src/locale/en-US/module.ftl delete mode 100644 pagetop-megamenu/src/locale/es-ES/module.ftl delete mode 100644 pagetop-megamenu/static/css/sm-blue.css delete mode 100644 pagetop-megamenu/static/css/sm-blue.css.map delete mode 100644 pagetop-megamenu/static/css/sm-clean.css delete mode 100644 pagetop-megamenu/static/css/sm-clean.css.map delete mode 100644 pagetop-megamenu/static/css/sm-mint.css delete mode 100644 pagetop-megamenu/static/css/sm-mint.css.map delete mode 100644 pagetop-megamenu/static/css/sm-simple.css delete mode 100644 pagetop-megamenu/static/css/sm-simple.css.map delete mode 100644 pagetop-megamenu/static/css/smartmenus.css delete mode 100644 pagetop-megamenu/static/js/smartmenus.min.js create mode 100644 pagetop/src/base/component/menu.rs create mode 100644 pagetop/src/base/component/menu/element.rs create mode 100644 pagetop/src/base/component/menu/group.rs create mode 100644 pagetop/src/base/component/menu/item.rs create mode 100644 pagetop/src/base/component/menu/megamenu.rs create mode 100644 pagetop/src/base/component/menu/menu_main.rs create mode 100644 pagetop/src/base/component/menu/submenu.rs create mode 100644 pagetop/static/theme/css/menu.css create mode 100644 pagetop/static/theme/js/menu.js diff --git a/pagetop-megamenu/Cargo.toml b/pagetop-megamenu/Cargo.toml deleted file mode 100644 index 3af0ec32..00000000 --- a/pagetop-megamenu/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "pagetop-megamenu" -version = "0.0.10" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - Module for PageTop that provides a new component to include advanced menus in web solutions.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -pagetop = { version = "0.0", path = "../pagetop" } -pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } -static-files = "0.2.3" - -[build-dependencies] -pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-megamenu/README.md b/pagetop-megamenu/README.md deleted file mode 100644 index 3a3f73e3..00000000 --- a/pagetop-megamenu/README.md +++ /dev/null @@ -1,27 +0,0 @@ -Módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web -creadas con **PageTop**. - -[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo -basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side -Rendering*). - - -# 🚧 Advertencia - -**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son -constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. - - -# 📜 Licencia - -Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu -elección: - -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). - -* Licencia MIT - ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). diff --git a/pagetop-megamenu/build.rs b/pagetop-megamenu/build.rs deleted file mode 100644 index 4349cf15..00000000 --- a/pagetop-megamenu/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -use pagetop_build::StaticFilesBundle; - -fn main() -> std::io::Result<()> { - StaticFilesBundle::from_dir("./static") - .with_name("megamenu") - .build() -} diff --git a/pagetop-megamenu/src/component/item.rs b/pagetop-megamenu/src/component/item.rs deleted file mode 100644 index c292167f..00000000 --- a/pagetop-megamenu/src/component/item.rs +++ /dev/null @@ -1,141 +0,0 @@ -use pagetop::prelude::*; - -use crate::component::MegaMenu; - -new_handle!(COMPONENT_MEGAITEM); - -type Label = TypedComponent<L10n>; -type Content = TypedComponent<Html>; - -#[derive(Default)] -pub enum MegaItemType { - #[default] - Void, - Label(Label), - Link(Label, FnContextualPath), - LinkBlank(Label, FnContextualPath), - Html(Content), - Submenu(Label, MegaMenu), - Separator, -} - -// MegaMenuItem. - -#[rustfmt::skip] -#[derive(Default)] -pub struct MegaItem { - weight : Weight, - renderable: Renderable, - item_type : MegaItemType, -} - -impl ComponentTrait for MegaItem { - fn new() -> Self { - MegaItem::default() - } - - fn handle(&self) -> Handle { - COMPONENT_MEGAITEM - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - match self.item_type() { - MegaItemType::Void => PrepareMarkup::None, - MegaItemType::Label(label) => PrepareMarkup::With(html! { - li class="link" { a href="#" { (label.prepare(cx)) } } - }), - MegaItemType::Link(label, path) => PrepareMarkup::With(html! { - li class="link" { a href=(path(cx)) { (label.prepare(cx)) } } - }), - MegaItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { - li class="link" { a href=(path(cx)) target="_blank" { (label.prepare(cx)) } } - }), - MegaItemType::Html(content) => PrepareMarkup::With(html! { - li class="html" { (content.prepare(cx)) } - }), - MegaItemType::Submenu(label, menu) => PrepareMarkup::With(html! { - li class="submenu" { - a href="#" { (label.prepare(cx)) } - ul { - (menu.items().prepare(cx)) - } - } - }), - MegaItemType::Separator => PrepareMarkup::With(html! { - li class="separator" { } - }), - } - } -} - -impl MegaItem { - pub fn label(label: L10n) -> Self { - MegaItem { - item_type: MegaItemType::Label(Label::with(label)), - ..Default::default() - } - } - - pub fn link(label: L10n, path: FnContextualPath) -> Self { - MegaItem { - item_type: MegaItemType::Link(Label::with(label), path), - ..Default::default() - } - } - - pub fn link_blank(label: L10n, path: FnContextualPath) -> Self { - MegaItem { - item_type: MegaItemType::LinkBlank(Label::with(label), path), - ..Default::default() - } - } - - pub fn html(content: Html) -> Self { - MegaItem { - item_type: MegaItemType::Html(Content::with(content)), - ..Default::default() - } - } - - pub fn submenu(label: L10n, menu: MegaMenu) -> Self { - MegaItem { - item_type: MegaItemType::Submenu(Label::with(label), menu), - ..Default::default() - } - } - - pub fn separator() -> Self { - MegaItem { - item_type: MegaItemType::Separator, - ..Default::default() - } - } - - // MegaItem BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - // MegaItem GETTERS. - - pub fn item_type(&self) -> &MegaItemType { - &self.item_type - } -} diff --git a/pagetop-megamenu/src/component/menu.rs b/pagetop-megamenu/src/component/menu.rs deleted file mode 100644 index 55ee1429..00000000 --- a/pagetop-megamenu/src/component/menu.rs +++ /dev/null @@ -1,181 +0,0 @@ -use pagetop::prelude::*; -use pagetop_jquery::JQuery; - -use crate::component::MegaItem; -use crate::LOCALES_MEGAMENU; - -new_handle!(COMPONENT_MEGAMENU); - -actions_for_component!(MegaMenu); - -// SmartMenus library version. -const VERSION_SMARTMENUS: &str = "1.2.1"; - -#[derive(Default)] -pub enum MegaMenuTheme { - Blue, - #[default] - Clean, - Mint, - Simple, -} - -#[rustfmt::skip] -#[derive(Default)] -pub struct MegaMenu { - weight : Weight, - renderable: Renderable, - id : IdentifierValue, - items : TypedComponents<MegaItem>, - theme : MegaMenuTheme, -} - -impl ComponentTrait for MegaMenu { - fn new() -> Self { - MegaMenu::default() - } - - fn handle(&self) -> Handle { - COMPONENT_MEGAMENU - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn weight(&self) -> Weight { - self.weight - } - - fn is_renderable(&self, cx: &Context) -> bool { - (self.renderable.check)(cx) - } - - fn before_prepare_component(&mut self, cx: &mut Context) { - cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/megamenu/css/smartmenus.css").with_version(VERSION_SMARTMENUS), - )); - - cx.alter(ContextOp::AddJavaScript( - JavaScript::at("/megamenu/js/smartmenus.min.js").with_version(VERSION_SMARTMENUS), - )); - JQuery.enable_jquery(cx); - - run_actions_before_prepare_megamenu(self, cx); - } - - #[rustfmt::skip] - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let id_nav = cx.required_id::<MegaMenu>(self.id()); - let id_menu = concat_string!(id_nav, "-menu"); - let id_state = concat_string!(id_nav, "-state"); - - let theme = match self.theme() { - MegaMenuTheme::Blue => "sm-blue", - MegaMenuTheme::Clean => "sm-clean", - MegaMenuTheme::Mint => "sm-mint", - MegaMenuTheme::Simple => "sm-simple", - }; - cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at(concat_string!("/megamenu/css/", theme, ".css")) - .with_version(VERSION_SMARTMENUS), - )); - let classes_menu = concat_string!("megamenu-menu sm ", theme); - - PrepareMarkup::With(html! { - nav id=(id_nav) class="megamenu" role="navigation" { - input id=(id_state) class="megamenu-state" type="checkbox" {} - label class="megamenu-btn" for=(id_state) { - span class="megamenu-btn-icon" {} - (L10n::t("toggle_menu", &LOCALES_MEGAMENU).prepare(cx)) - } - ul id=(id_menu) class=(classes_menu) { - (self.items().prepare(cx)) - } - script type="text/javascript" defer { - r###" -$(function() { - $('#"###r (id_menu) r###"').smartmenus({ - hideTimeout: 0, - showTimeout: 80, - }); -}); -$(function() { - var $menuState = $('#"###r (id_state) r###"'); - if ($menuState.length) { - // Animate mobile menu. - $menuState.change(function(e) { - var $menu = $('#"###r (id_menu) r###"'); - if (this.checked) { - $menu.hide().slideDown(250, function() { $menu.css('display', ''); }); - } else { - $menu.show().slideUp(250, function() { $menu.css('display', ''); }); - } - }); - // Hide mobile menu beforeunload. - $(window).on('beforeunload unload', function() { - if ($menuState[0].checked) { - $menuState[0].click(); - } - }); - } -}); - "###r - } - } - }) - } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_megamenu(self, cx); - } -} - -impl MegaMenu { - // MegaMenu BUILDER. - - #[fn_builder] - pub fn alter_weight(&mut self, value: Weight) -> &mut Self { - self.weight = value; - self - } - - #[fn_builder] - pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { - self.renderable.check = check; - self - } - - #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { - self.id.alter_value(id); - self - } - - pub fn with_item(mut self, item: MegaItem) -> Self { - self.items.alter(TypedOp::Add(TypedComponent::with(item))); - self - } - - #[fn_builder] - pub fn alter_items(&mut self, op: TypedOp<MegaItem>) -> &mut Self { - self.items.alter(op); - self - } - - #[fn_builder] - pub fn alter_theme(&mut self, theme: MegaMenuTheme) -> &mut Self { - self.theme = theme; - self - } - - // MegaMenu GETTERS. - - pub fn items(&self) -> &TypedComponents<MegaItem> { - &self.items - } - - pub fn theme(&self) -> &MegaMenuTheme { - &self.theme - } -} diff --git a/pagetop-megamenu/src/lib.rs b/pagetop-megamenu/src/lib.rs deleted file mode 100644 index e4a95381..00000000 --- a/pagetop-megamenu/src/lib.rs +++ /dev/null @@ -1,38 +0,0 @@ -use pagetop::prelude::*; - -pub mod component { - mod item; - pub use item::{MegaItem, MegaItemType, COMPONENT_MEGAITEM}; - mod menu; - pub use menu::{MegaMenu, COMPONENT_MEGAMENU}; -} - -new_handle!(MODULE_MEGAMENU); - -static_locales!(LOCALES_MEGAMENU); - -static_files!(megamenu); - -pub struct MegaMenu; - -impl ModuleTrait for MegaMenu { - fn handle(&self) -> Handle { - MODULE_MEGAMENU - } - - fn name(&self) -> L10n { - L10n::t("module_name", &LOCALES_MEGAMENU) - } - - fn description(&self) -> L10n { - L10n::t("module_description", &LOCALES_MEGAMENU) - } - - fn dependencies(&self) -> Vec<ModuleRef> { - vec![&pagetop_jquery::JQuery] - } - - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/megamenu", megamenu); - } -} diff --git a/pagetop-megamenu/src/locale/en-US/module.ftl b/pagetop-megamenu/src/locale/en-US/module.ftl deleted file mode 100644 index e38ee5c2..00000000 --- a/pagetop-megamenu/src/locale/en-US/module.ftl +++ /dev/null @@ -1,4 +0,0 @@ -module_name = MegaMenu -module_description = ... - -toggle_menu = Toggle menu visibility diff --git a/pagetop-megamenu/src/locale/es-ES/module.ftl b/pagetop-megamenu/src/locale/es-ES/module.ftl deleted file mode 100644 index 58001f0a..00000000 --- a/pagetop-megamenu/src/locale/es-ES/module.ftl +++ /dev/null @@ -1,4 +0,0 @@ -module_name = MegaMenu -module_description = ... - -toggle_menu = Alternar visibilidad del menú diff --git a/pagetop-megamenu/static/css/sm-blue.css b/pagetop-megamenu/static/css/sm-blue.css deleted file mode 100644 index 4cff3bb5..00000000 --- a/pagetop-megamenu/static/css/sm-blue.css +++ /dev/null @@ -1,333 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=PT+Sans+Narrow:400,700); -.sm-blue { - background: transparent; - border-radius: 8px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); -} -.sm-blue a, .sm-blue a:hover, .sm-blue a:focus, .sm-blue a:active { - padding: 10px 20px; - /* make room for the toggle button (sub indicator) */ - padding-right: 58px; - background: #3092c0; - background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); - color: #fff; - font-family: "PT Sans Narrow", "Arial Narrow", Arial, Helvetica, sans-serif; - font-size: 18px; - font-weight: bold; - line-height: 23px; - text-decoration: none; - text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); -} -.sm-blue a.current { - background: #006892; - background-image: linear-gradient(to bottom, #006188, #006f9c); - color: #fff; -} -.sm-blue a.disabled { - color: #a1d1e8; -} -.sm-blue a .sub-arrow { - position: absolute; - top: 50%; - margin-top: -17px; - left: auto; - right: 4px; - width: 34px; - height: 34px; - overflow: hidden; - font: bold 16px/34px monospace !important; - text-align: center; - text-shadow: none; - background: rgba(0, 0, 0, 0.1); - border-radius: 4px; -} -.sm-blue a .sub-arrow::before { - content: '+'; -} -.sm-blue a.highlighted .sub-arrow::before { - content: '-'; -} -.sm-blue > li:first-child > a, .sm-blue > li:first-child > :not(ul) a { - border-radius: 8px 8px 0 0; -} -.sm-blue > li:last-child > a, .sm-blue > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul { - border-radius: 0 0 8px 8px; -} -.sm-blue > li:last-child > a.highlighted, .sm-blue > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-blue > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted { - border-radius: 0; -} -.sm-blue ul { - background: #fff; -} -.sm-blue ul ul { - background: rgba(102, 102, 102, 0.1); -} -.sm-blue ul a, .sm-blue ul a:hover, .sm-blue ul a:focus, .sm-blue ul a:active { - background: transparent; - color: #2b82ac; - font-size: 16px; - text-shadow: none; - border-left: 8px solid transparent; -} -.sm-blue ul a.current { - background: #006892; - background-image: linear-gradient(to bottom, #006188, #006f9c); - color: #fff; -} -.sm-blue ul a.disabled { - color: #b3b3b3; -} -.sm-blue ul ul a, -.sm-blue ul ul a:hover, -.sm-blue ul ul a:focus, -.sm-blue ul ul a:active { - border-left: 16px solid transparent; -} -.sm-blue ul ul ul a, -.sm-blue ul ul ul a:hover, -.sm-blue ul ul ul a:focus, -.sm-blue ul ul ul a:active { - border-left: 24px solid transparent; -} -.sm-blue ul ul ul ul a, -.sm-blue ul ul ul ul a:hover, -.sm-blue ul ul ul ul a:focus, -.sm-blue ul ul ul ul a:active { - border-left: 32px solid transparent; -} -.sm-blue ul ul ul ul ul a, -.sm-blue ul ul ul ul ul a:hover, -.sm-blue ul ul ul ul ul a:focus, -.sm-blue ul ul ul ul ul a:active { - border-left: 40px solid transparent; -} -.sm-blue ul li { - border-top: 1px solid rgba(0, 0, 0, 0.05); -} -.sm-blue ul li:first-child { - border-top: 0; -} - -@media (min-width: 768px) { - /* Switch to desktop layout - ----------------------------------------------- - These transform the menu tree from - collapsible to desktop (navbar + dropdowns) - -----------------------------------------------*/ - /* start... (it's not recommended editing these rules) */ - .sm-blue ul { - position: absolute; - width: 12em; - } - - .sm-blue li { - float: left; - } - - .sm-blue.sm-rtl li { - float: right; - } - - .sm-blue ul li, .sm-blue.sm-rtl ul li, .sm-blue.sm-vertical li { - float: none; - } - - .sm-blue a { - white-space: nowrap; - } - - .sm-blue ul a, .sm-blue.sm-vertical a { - white-space: normal; - } - - .sm-blue .sm-nowrap > li > a, .sm-blue .sm-nowrap > li > :not(ul) a { - white-space: nowrap; - } - - /* ...end */ - .sm-blue { - background: #3092c0; - background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); - border-radius: 8px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - } - .sm-blue a, .sm-blue a:hover, .sm-blue a:focus, .sm-blue a:active, .sm-blue a.highlighted { - padding: 13px 24px; - background: #3092c0; - background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); - color: #fff; - } - .sm-blue a:hover, .sm-blue a:focus, .sm-blue a:active, .sm-blue a.highlighted { - background: #2b82ac; - background-image: linear-gradient(to bottom, #2d89b4, #297ca3); - } - .sm-blue a.current { - background: #006892; - background-image: linear-gradient(to bottom, #006188, #006f9c); - color: #fff; - } - .sm-blue a.disabled { - background: #3092c0; - background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); - color: #a1d1e8; - } - .sm-blue a .sub-arrow { - top: auto; - margin-top: 0; - bottom: 2px; - left: 50%; - margin-left: -5px; - right: auto; - width: 0; - height: 0; - border-width: 5px; - border-style: solid dashed dashed dashed; - border-color: #a1d1e8 transparent transparent transparent; - background: transparent; - border-radius: 0; - } - .sm-blue a .sub-arrow::before { - display: none; - } - .sm-blue > li:first-child > a, .sm-blue > li:first-child > :not(ul) a { - border-radius: 8px 0 0 8px; - } - .sm-blue > li:last-child > a, .sm-blue > li:last-child > :not(ul) a { - border-radius: 0 8px 8px 0 !important; - } - .sm-blue > li { - border-left: 1px solid #2b82ac; - } - .sm-blue > li:first-child { - border-left: 0; - } - .sm-blue ul { - border: 1px solid #a8a8a8; - padding: 7px 0; - background: #fff; - border-radius: 0 0 4px 4px !important; - box-shadow: 0 5px 12px rgba(0, 0, 0, 0.2); - } - .sm-blue ul ul { - border-radius: 4px !important; - background: #fff; - } - .sm-blue ul a, .sm-blue ul a:hover, .sm-blue ul a:focus, .sm-blue ul a:active, .sm-blue ul a.highlighted { - border: 0 !important; - padding: 9px 23px; - background: transparent; - color: #2b82ac; - border-radius: 0 !important; - } - .sm-blue ul a:hover, .sm-blue ul a:focus, .sm-blue ul a:active, .sm-blue ul a.highlighted { - background: #3092c0; - background-image: linear-gradient(to bottom, #3298c8, #2e8cb8); - color: #fff; - } - .sm-blue ul a.current { - background: #006892; - background-image: linear-gradient(to bottom, #006188, #006f9c); - color: #fff; - } - .sm-blue ul a.disabled { - background: #fff; - color: #b3b3b3; - } - .sm-blue ul a .sub-arrow { - top: 50%; - margin-top: -5px; - bottom: auto; - left: auto; - margin-left: 0; - right: 10px; - border-style: dashed dashed dashed solid; - border-color: transparent transparent transparent #a1d1e8; - } - .sm-blue ul li { - border: 0; - } - .sm-blue .scroll-up, - .sm-blue .scroll-down { - position: absolute; - display: none; - visibility: hidden; - overflow: hidden; - background: #fff; - height: 20px; - } - .sm-blue .scroll-up-arrow, - .sm-blue .scroll-down-arrow { - position: absolute; - top: -2px; - left: 50%; - margin-left: -8px; - width: 0; - height: 0; - overflow: hidden; - border-width: 8px; - border-style: dashed dashed solid dashed; - border-color: transparent transparent #2b82ac transparent; - } - .sm-blue .scroll-down-arrow { - top: 6px; - border-style: solid dashed dashed dashed; - border-color: #2b82ac transparent transparent transparent; - } - .sm-blue.sm-rtl.sm-vertical a .sub-arrow { - right: auto; - left: 10px; - border-style: dashed solid dashed dashed; - border-color: transparent #a1d1e8 transparent transparent; - } - .sm-blue.sm-rtl > li:first-child > a, .sm-blue.sm-rtl > li:first-child > :not(ul) a { - border-radius: 0 8px 8px 0; - } - .sm-blue.sm-rtl > li:last-child > a, .sm-blue.sm-rtl > li:last-child > :not(ul) a { - border-radius: 8px 0 0 8px !important; - } - .sm-blue.sm-rtl > li:first-child { - border-left: 1px solid #2b82ac; - } - .sm-blue.sm-rtl > li:last-child { - border-left: 0; - } - .sm-blue.sm-rtl ul a .sub-arrow { - right: auto; - left: 10px; - border-style: dashed solid dashed dashed; - border-color: transparent #a1d1e8 transparent transparent; - } - .sm-blue.sm-vertical { - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); - } - .sm-blue.sm-vertical a { - padding: 9px 23px; - } - .sm-blue.sm-vertical a .sub-arrow { - top: 50%; - margin-top: -5px; - bottom: auto; - left: auto; - margin-left: 0; - right: 10px; - border-style: dashed dashed dashed solid; - border-color: transparent transparent transparent #a1d1e8; - } - .sm-blue.sm-vertical > li:first-child > a, .sm-blue.sm-vertical > li:first-child > :not(ul) a { - border-radius: 8px 8px 0 0; - } - .sm-blue.sm-vertical > li:last-child > a, .sm-blue.sm-vertical > li:last-child > :not(ul) a { - border-radius: 0 0 8px 8px !important; - } - .sm-blue.sm-vertical > li { - border-left: 0 !important; - } - .sm-blue.sm-vertical ul { - border-radius: 4px !important; - } - .sm-blue.sm-vertical ul a { - padding: 9px 23px; - } -} - -/*# sourceMappingURL=sm-blue.css.map */ diff --git a/pagetop-megamenu/static/css/sm-blue.css.map b/pagetop-megamenu/static/css/sm-blue.css.map deleted file mode 100644 index a313206b..00000000 --- a/pagetop-megamenu/static/css/sm-blue.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": "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", -"sources": ["_sm-blue-theme.scss","mixins/_round-corners-last-item.scss","mixins/_sub-items-indentation.scss"], -"names": [], -"file": "sm-blue.css" -} diff --git a/pagetop-megamenu/static/css/sm-clean.css b/pagetop-megamenu/static/css/sm-clean.css deleted file mode 100644 index 4fb39b72..00000000 --- a/pagetop-megamenu/static/css/sm-clean.css +++ /dev/null @@ -1,327 +0,0 @@ -.sm-clean { - background: #eeeeee; - border-radius: 5px; -} -.sm-clean a, .sm-clean a:hover, .sm-clean a:focus, .sm-clean a:active { - padding: 13px 20px; - /* make room for the toggle button (sub indicator) */ - padding-right: 58px; - color: #555555; - font-family: "Lucida Sans Unicode", "Lucida Sans", "Lucida Grande", Arial, sans-serif; - font-size: 18px; - font-weight: normal; - line-height: 17px; - text-decoration: none; -} -.sm-clean a.current { - color: #D23600; -} -.sm-clean a.disabled { - color: #bbbbbb; -} -.sm-clean a .sub-arrow { - position: absolute; - top: 50%; - margin-top: -17px; - left: auto; - right: 4px; - width: 34px; - height: 34px; - overflow: hidden; - font: bold 16px/34px monospace !important; - text-align: center; - text-shadow: none; - background: rgba(255, 255, 255, 0.5); - border-radius: 5px; -} -.sm-clean a .sub-arrow::before { - content: '+'; -} -.sm-clean a.highlighted .sub-arrow::before { - content: '-'; -} -.sm-clean > li:first-child > a, .sm-clean > li:first-child > :not(ul) a { - border-radius: 5px 5px 0 0; -} -.sm-clean > li:last-child > a, .sm-clean > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul { - border-radius: 0 0 5px 5px; -} -.sm-clean > li:last-child > a.highlighted, .sm-clean > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > a.highlighted, .sm-clean > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > ul > li:last-child > *:not(ul) a.highlighted { - border-radius: 0; -} -.sm-clean li { - border-top: 1px solid rgba(0, 0, 0, 0.05); -} -.sm-clean > li:first-child { - border-top: 0; -} -.sm-clean ul { - background: rgba(162, 162, 162, 0.1); -} -.sm-clean ul a, .sm-clean ul a:hover, .sm-clean ul a:focus, .sm-clean ul a:active { - font-size: 16px; - border-left: 8px solid transparent; -} -.sm-clean ul ul a, -.sm-clean ul ul a:hover, -.sm-clean ul ul a:focus, -.sm-clean ul ul a:active { - border-left: 16px solid transparent; -} -.sm-clean ul ul ul a, -.sm-clean ul ul ul a:hover, -.sm-clean ul ul ul a:focus, -.sm-clean ul ul ul a:active { - border-left: 24px solid transparent; -} -.sm-clean ul ul ul ul a, -.sm-clean ul ul ul ul a:hover, -.sm-clean ul ul ul ul a:focus, -.sm-clean ul ul ul ul a:active { - border-left: 32px solid transparent; -} -.sm-clean ul ul ul ul ul a, -.sm-clean ul ul ul ul ul a:hover, -.sm-clean ul ul ul ul ul a:focus, -.sm-clean ul ul ul ul ul a:active { - border-left: 40px solid transparent; -} - -@media (min-width: 768px) { - /* Switch to desktop layout - ----------------------------------------------- - These transform the menu tree from - collapsible to desktop (navbar + dropdowns) - -----------------------------------------------*/ - /* start... (it's not recommended editing these rules) */ - .sm-clean ul { - position: absolute; - width: 12em; - } - - .sm-clean li { - float: left; - } - - .sm-clean.sm-rtl li { - float: right; - } - - .sm-clean ul li, .sm-clean.sm-rtl ul li, .sm-clean.sm-vertical li { - float: none; - } - - .sm-clean a { - white-space: nowrap; - } - - .sm-clean ul a, .sm-clean.sm-vertical a { - white-space: normal; - } - - .sm-clean .sm-nowrap > li > a, .sm-clean .sm-nowrap > li > :not(ul) a { - white-space: nowrap; - } - - /* ...end */ - .sm-clean { - padding: 0 10px; - background: #eeeeee; - border-radius: 100px; - } - .sm-clean a, .sm-clean a:hover, .sm-clean a:focus, .sm-clean a:active, .sm-clean a.highlighted { - padding: 12px 12px; - color: #555555; - border-radius: 0 !important; - } - .sm-clean a:hover, .sm-clean a:focus, .sm-clean a:active, .sm-clean a.highlighted { - color: #D23600; - } - .sm-clean a.current { - color: #D23600; - } - .sm-clean a.disabled { - color: #bbbbbb; - } - .sm-clean a.has-submenu { - padding-right: 24px; - } - .sm-clean a .sub-arrow { - top: 50%; - margin-top: -2px; - right: 12px; - width: 0; - height: 0; - border-width: 4px; - border-style: solid dashed dashed dashed; - border-color: #555555 transparent transparent transparent; - background: transparent; - border-radius: 0; - } - .sm-clean a .sub-arrow::before { - display: none; - } - .sm-clean li { - border-top: 0; - } - .sm-clean > li > ul::before, - .sm-clean > li > ul::after { - content: ''; - position: absolute; - top: -18px; - left: 30px; - width: 0; - height: 0; - overflow: hidden; - border-width: 9px; - border-style: dashed dashed solid dashed; - border-color: transparent transparent #bbbbbb transparent; - } - .sm-clean > li > ul::after { - top: -16px; - left: 31px; - border-width: 8px; - border-color: transparent transparent #fff transparent; - } - .sm-clean ul { - border: 1px solid #bbbbbb; - padding: 5px 0; - background: #fff; - border-radius: 5px !important; - box-shadow: 0 5px 9px rgba(0, 0, 0, 0.2); - } - .sm-clean ul a, .sm-clean ul a:hover, .sm-clean ul a:focus, .sm-clean ul a:active, .sm-clean ul a.highlighted { - border: 0 !important; - padding: 10px 20px; - color: #555555; - } - .sm-clean ul a:hover, .sm-clean ul a:focus, .sm-clean ul a:active, .sm-clean ul a.highlighted { - background: #eeeeee; - color: #D23600; - } - .sm-clean ul a.current { - color: #D23600; - } - .sm-clean ul a.disabled { - background: #fff; - color: #cccccc; - } - .sm-clean ul a.has-submenu { - padding-right: 20px; - } - .sm-clean ul a .sub-arrow { - right: 8px; - top: 50%; - margin-top: -5px; - border-width: 5px; - border-style: dashed dashed dashed solid; - border-color: transparent transparent transparent #555555; - } - .sm-clean .scroll-up, - .sm-clean .scroll-down { - position: absolute; - display: none; - visibility: hidden; - overflow: hidden; - background: #fff; - height: 20px; - } - .sm-clean .scroll-up:hover, - .sm-clean .scroll-down:hover { - background: #eeeeee; - } - .sm-clean .scroll-up:hover .scroll-up-arrow { - border-color: transparent transparent #D23600 transparent; - } - .sm-clean .scroll-down:hover .scroll-down-arrow { - border-color: #D23600 transparent transparent transparent; - } - .sm-clean .scroll-up-arrow, - .sm-clean .scroll-down-arrow { - position: absolute; - top: 0; - left: 50%; - margin-left: -6px; - width: 0; - height: 0; - overflow: hidden; - border-width: 6px; - border-style: dashed dashed solid dashed; - border-color: transparent transparent #555555 transparent; - } - .sm-clean .scroll-down-arrow { - top: 8px; - border-style: solid dashed dashed dashed; - border-color: #555555 transparent transparent transparent; - } - .sm-clean.sm-rtl a.has-submenu { - padding-right: 12px; - padding-left: 24px; - } - .sm-clean.sm-rtl a .sub-arrow { - right: auto; - left: 12px; - } - .sm-clean.sm-rtl.sm-vertical a.has-submenu { - padding: 10px 20px; - } - .sm-clean.sm-rtl.sm-vertical a .sub-arrow { - right: auto; - left: 8px; - border-style: dashed solid dashed dashed; - border-color: transparent #555555 transparent transparent; - } - .sm-clean.sm-rtl > li > ul::before { - left: auto; - right: 30px; - } - .sm-clean.sm-rtl > li > ul::after { - left: auto; - right: 31px; - } - .sm-clean.sm-rtl ul a.has-submenu { - padding: 10px 20px !important; - } - .sm-clean.sm-rtl ul a .sub-arrow { - right: auto; - left: 8px; - border-style: dashed solid dashed dashed; - border-color: transparent #555555 transparent transparent; - } - .sm-clean.sm-vertical { - padding: 10px 0; - border-radius: 5px; - } - .sm-clean.sm-vertical a { - padding: 10px 20px; - } - .sm-clean.sm-vertical a:hover, .sm-clean.sm-vertical a:focus, .sm-clean.sm-vertical a:active, .sm-clean.sm-vertical a.highlighted { - background: #fff; - } - .sm-clean.sm-vertical a.disabled { - background: #eeeeee; - } - .sm-clean.sm-vertical a .sub-arrow { - right: 8px; - top: 50%; - margin-top: -5px; - border-width: 5px; - border-style: dashed dashed dashed solid; - border-color: transparent transparent transparent #555555; - } - .sm-clean.sm-vertical > li > ul::before, - .sm-clean.sm-vertical > li > ul::after { - display: none; - } - .sm-clean.sm-vertical ul a { - padding: 10px 20px; - } - .sm-clean.sm-vertical ul a:hover, .sm-clean.sm-vertical ul a:focus, .sm-clean.sm-vertical ul a:active, .sm-clean.sm-vertical ul a.highlighted { - background: #eeeeee; - } - .sm-clean.sm-vertical ul a.disabled { - background: #fff; - } -} - -/*# sourceMappingURL=sm-clean.css.map */ diff --git a/pagetop-megamenu/static/css/sm-clean.css.map b/pagetop-megamenu/static/css/sm-clean.css.map deleted file mode 100644 index 5713f374..00000000 --- a/pagetop-megamenu/static/css/sm-clean.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": "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", -"sources": ["_sm-clean-theme.scss","mixins/_round-corners-last-item.scss","mixins/_sub-items-indentation.scss"], -"names": [], -"file": "sm-clean.css" -} diff --git a/pagetop-megamenu/static/css/sm-mint.css b/pagetop-megamenu/static/css/sm-mint.css deleted file mode 100644 index 1ab65555..00000000 --- a/pagetop-megamenu/static/css/sm-mint.css +++ /dev/null @@ -1,331 +0,0 @@ -.sm-mint { - border-top: 2px solid #8db863; - border-bottom: 2px solid #8db863; - background: #fff; -} -.sm-mint a, .sm-mint a:hover, .sm-mint a:focus, .sm-mint a:active { - padding: 13px 20px; - /* make room for the toggle button (sub indicator) */ - padding-right: 58px; - color: #333; - font-family: Arial, sans-serif; - font-size: 16px; - font-weight: normal; - line-height: 17px; - text-decoration: none; -} -.sm-mint a.current { - font-weight: bold; -} -.sm-mint a.disabled { - color: #cccccc; -} -.sm-mint a .sub-arrow { - position: absolute; - top: 50%; - margin-top: -17px; - left: auto; - right: 4px; - width: 34px; - height: 34px; - overflow: hidden; - font: bold 14px/34px monospace !important; - text-align: center; - text-shadow: none; - background: rgba(141, 184, 99, 0.2); - border-radius: 4px; -} -.sm-mint a .sub-arrow::before { - content: '+'; -} -.sm-mint a.highlighted .sub-arrow::before { - content: '-'; -} -.sm-mint li { - border-top: 1px solid rgba(141, 184, 99, 0.2); -} -.sm-mint > li:first-child { - border-top: 0; -} -.sm-mint ul { - background: rgba(141, 184, 99, 0.2); -} -.sm-mint ul a, .sm-mint ul a:hover, .sm-mint ul a:focus, .sm-mint ul a:active { - font-size: 14px; - border-left: 8px solid transparent; -} -.sm-mint ul ul a, -.sm-mint ul ul a:hover, -.sm-mint ul ul a:focus, -.sm-mint ul ul a:active { - border-left: 16px solid transparent; -} -.sm-mint ul ul ul a, -.sm-mint ul ul ul a:hover, -.sm-mint ul ul ul a:focus, -.sm-mint ul ul ul a:active { - border-left: 24px solid transparent; -} -.sm-mint ul ul ul ul a, -.sm-mint ul ul ul ul a:hover, -.sm-mint ul ul ul ul a:focus, -.sm-mint ul ul ul ul a:active { - border-left: 32px solid transparent; -} -.sm-mint ul ul ul ul ul a, -.sm-mint ul ul ul ul ul a:hover, -.sm-mint ul ul ul ul ul a:focus, -.sm-mint ul ul ul ul ul a:active { - border-left: 40px solid transparent; -} - -@media (min-width: 768px) { - /* Switch to desktop layout - ----------------------------------------------- - These transform the menu tree from - collapsible to desktop (navbar + dropdowns) - -----------------------------------------------*/ - /* start... (it's not recommended editing these rules) */ - .sm-mint ul { - position: absolute; - width: 12em; - } - - .sm-mint li { - float: left; - } - - .sm-mint.sm-rtl li { - float: right; - } - - .sm-mint ul li, .sm-mint.sm-rtl ul li, .sm-mint.sm-vertical li { - float: none; - } - - .sm-mint a { - white-space: nowrap; - } - - .sm-mint ul a, .sm-mint.sm-vertical a { - white-space: normal; - } - - .sm-mint .sm-nowrap > li > a, .sm-mint .sm-nowrap > li > :not(ul) a { - white-space: nowrap; - } - - /* ...end */ - .sm-mint { - border-top: 0; - background: transparent; - } - .sm-mint a, .sm-mint a:hover, .sm-mint a:focus, .sm-mint a:active, .sm-mint a.highlighted { - padding: 11px 20px; - color: #333; - border-radius: 4px 4px 0 0; - } - .sm-mint a:hover, .sm-mint a:focus, .sm-mint a:active { - background: #8db863; - color: #fff; - } - .sm-mint a.highlighted { - background: #F6FFED; - color: #333; - box-shadow: 0 4px 3px rgba(0, 0, 0, 0.25); - } - .sm-mint a.disabled { - background: transparent; - color: #cccccc; - box-shadow: none; - } - .sm-mint a.has-submenu { - padding-right: 34px; - } - .sm-mint a .sub-arrow { - top: 50%; - margin-top: -3px; - right: 20px; - width: 0; - height: 0; - border-width: 6px 4.02px 0 4.02px; - border-style: solid dashed dashed dashed; - border-color: #8db863 transparent transparent transparent; - background: transparent; - border-radius: 0; - } - .sm-mint a:hover .sub-arrow, .sm-mint a:focus .sub-arrow, .sm-mint a:active .sub-arrow { - border-color: #fff transparent transparent transparent; - } - .sm-mint a.highlighted .sub-arrow { - border-color: #8db863 transparent transparent transparent; - } - .sm-mint a.disabled .sub-arrow { - border-color: #8db863 transparent transparent transparent; - } - .sm-mint a .sub-arrow::before { - display: none; - } - .sm-mint li { - border-top: 0; - } - .sm-mint ul { - border: 0; - padding: 8px 0; - background: #F6FFED; - border-radius: 0 4px 4px 4px; - box-shadow: 0 4px 3px rgba(0, 0, 0, 0.25); - } - .sm-mint ul ul { - border-radius: 4px; - } - .sm-mint ul a, .sm-mint ul a:hover, .sm-mint ul a:focus, .sm-mint ul a:active, .sm-mint ul a.highlighted { - border: 0 !important; - padding: 10px 20px; - color: #333; - border-radius: 0; - } - .sm-mint ul a:hover, .sm-mint ul a:focus, .sm-mint ul a:active, .sm-mint ul a.highlighted { - background: #8db863; - color: #fff; - box-shadow: none; - } - .sm-mint ul a.disabled { - background: transparent; - color: #b3b3b3; - } - .sm-mint ul a.has-submenu { - padding-right: 20px; - } - .sm-mint ul a .sub-arrow { - right: 10px; - margin-top: -4.02px; - border-width: 4.02px 0 4.02px 6px; - border-style: dashed dashed dashed solid; - border-color: transparent transparent transparent #8db863; - } - .sm-mint ul a:hover .sub-arrow, .sm-mint ul a:focus .sub-arrow, .sm-mint ul a:active .sub-arrow, .sm-mint ul a.highlighted .sub-arrow { - border-color: transparent transparent transparent #fff; - } - .sm-mint ul a.disabled .sub-arrow { - border-color: transparent transparent transparent #8db863; - } - .sm-mint .scroll-up, - .sm-mint .scroll-down { - position: absolute; - display: none; - visibility: hidden; - overflow: hidden; - background: #F6FFED; - height: 20px; - } - .sm-mint .scroll-up-arrow, - .sm-mint .scroll-down-arrow { - position: absolute; - top: 6px; - left: 50%; - margin-left: -8px; - width: 0; - height: 0; - overflow: hidden; - border-width: 0 6px 8px 6px; - border-style: dashed dashed solid dashed; - border-color: transparent transparent #8db863 transparent; - } - .sm-mint .scroll-down-arrow { - border-width: 8px 6px 0 6px; - border-style: solid dashed dashed dashed; - border-color: #8db863 transparent transparent transparent; - } - .sm-mint.sm-rtl a.has-submenu { - padding-right: 20px; - padding-left: 34px; - } - .sm-mint.sm-rtl a .sub-arrow { - right: auto; - left: 20px; - } - .sm-mint.sm-rtl.sm-vertical { - border-right: 0; - border-left: 2px solid #8db863; - } - .sm-mint.sm-rtl.sm-vertical a { - border-radius: 0 4px 4px 0; - } - .sm-mint.sm-rtl.sm-vertical a.has-submenu { - padding: 10px 20px; - } - .sm-mint.sm-rtl.sm-vertical a .sub-arrow { - right: auto; - left: 10px; - border-width: 4.02px 6px 4.02px 0; - border-style: dashed solid dashed dashed; - border-color: transparent #8db863 transparent transparent; - } - .sm-mint.sm-rtl.sm-vertical a:hover .sub-arrow, .sm-mint.sm-rtl.sm-vertical a:focus .sub-arrow, .sm-mint.sm-rtl.sm-vertical a:active .sub-arrow, .sm-mint.sm-rtl.sm-vertical a.highlighted .sub-arrow { - border-color: transparent #fff transparent transparent; - } - .sm-mint.sm-rtl.sm-vertical a.disabled .sub-arrow { - border-color: transparent #8db863 transparent transparent; - } - .sm-mint.sm-rtl ul { - border-radius: 4px 0 4px 4px; - } - .sm-mint.sm-rtl ul a { - border-radius: 0 !important; - } - .sm-mint.sm-rtl ul a.has-submenu { - padding: 10px 20px !important; - } - .sm-mint.sm-rtl ul a .sub-arrow { - right: auto; - left: 10px; - border-width: 4.02px 6px 4.02px 0; - border-style: dashed solid dashed dashed; - border-color: transparent #8db863 transparent transparent; - } - .sm-mint.sm-rtl ul a:hover .sub-arrow, .sm-mint.sm-rtl ul a:focus .sub-arrow, .sm-mint.sm-rtl ul a:active .sub-arrow, .sm-mint.sm-rtl ul a.highlighted .sub-arrow { - border-color: transparent #fff transparent transparent; - } - .sm-mint.sm-rtl ul a.disabled .sub-arrow { - border-color: transparent #8db863 transparent transparent; - } - .sm-mint.sm-vertical { - border-bottom: 0; - border-right: 2px solid #8db863; - } - .sm-mint.sm-vertical a { - padding: 10px 20px; - border-radius: 4px 0 0 4px; - } - .sm-mint.sm-vertical a:hover, .sm-mint.sm-vertical a:focus, .sm-mint.sm-vertical a:active, .sm-mint.sm-vertical a.highlighted { - background: #8db863; - color: #fff; - box-shadow: none; - } - .sm-mint.sm-vertical a.disabled { - background: transparent; - color: #cccccc; - } - .sm-mint.sm-vertical a .sub-arrow { - right: 10px; - margin-top: -4.02px; - border-width: 4.02px 0 4.02px 6px; - border-style: dashed dashed dashed solid; - border-color: transparent transparent transparent #8db863; - } - .sm-mint.sm-vertical a:hover .sub-arrow, .sm-mint.sm-vertical a:focus .sub-arrow, .sm-mint.sm-vertical a:active .sub-arrow, .sm-mint.sm-vertical a.highlighted .sub-arrow { - border-color: transparent transparent transparent #fff; - } - .sm-mint.sm-vertical a.disabled .sub-arrow { - border-color: transparent transparent transparent #8db863; - } - .sm-mint.sm-vertical ul { - border-radius: 4px !important; - } - .sm-mint.sm-vertical ul a { - padding: 10px 20px; - } -} - -/*# sourceMappingURL=sm-mint.css.map */ diff --git a/pagetop-megamenu/static/css/sm-mint.css.map b/pagetop-megamenu/static/css/sm-mint.css.map deleted file mode 100644 index 2220dbd2..00000000 --- a/pagetop-megamenu/static/css/sm-mint.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": "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", -"sources": ["_sm-mint-theme.scss","mixins/_sub-items-indentation.scss"], -"names": [], -"file": "sm-mint.css" -} diff --git a/pagetop-megamenu/static/css/sm-simple.css b/pagetop-megamenu/static/css/sm-simple.css deleted file mode 100644 index 8fcf0c15..00000000 --- a/pagetop-megamenu/static/css/sm-simple.css +++ /dev/null @@ -1,249 +0,0 @@ -.sm-simple { - border: 1px solid #bbbbbb; - background: #fff; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -} -.sm-simple a, .sm-simple a:hover, .sm-simple a:focus, .sm-simple a:active { - padding: 13px 20px; - /* make room for the toggle button (sub indicator) */ - padding-right: 58px; - color: #555555; - font-family: "Lucida Sans Unicode", "Lucida Sans", "Lucida Grande", Arial, sans-serif; - font-size: 16px; - font-weight: normal; - line-height: 17px; - text-decoration: none; -} -.sm-simple a.current { - background: #555555; - color: #fff; -} -.sm-simple a.disabled { - color: #cccccc; -} -.sm-simple a .sub-arrow { - position: absolute; - top: 50%; - margin-top: -17px; - left: auto; - right: 4px; - width: 34px; - height: 34px; - overflow: hidden; - font: bold 14px/34px monospace !important; - text-align: center; - text-shadow: none; - background: rgba(0, 0, 0, 0.08); -} -.sm-simple a .sub-arrow::before { - content: '+'; -} -.sm-simple a.highlighted .sub-arrow::before { - content: '-'; -} -.sm-simple li { - border-top: 1px solid rgba(0, 0, 0, 0.05); -} -.sm-simple > li:first-child { - border-top: 0; -} -.sm-simple ul { - background: rgba(179, 179, 179, 0.1); -} -.sm-simple ul a, .sm-simple ul a:hover, .sm-simple ul a:focus, .sm-simple ul a:active { - font-size: 14px; - border-left: 8px solid transparent; -} -.sm-simple ul ul a, -.sm-simple ul ul a:hover, -.sm-simple ul ul a:focus, -.sm-simple ul ul a:active { - border-left: 16px solid transparent; -} -.sm-simple ul ul ul a, -.sm-simple ul ul ul a:hover, -.sm-simple ul ul ul a:focus, -.sm-simple ul ul ul a:active { - border-left: 24px solid transparent; -} -.sm-simple ul ul ul ul a, -.sm-simple ul ul ul ul a:hover, -.sm-simple ul ul ul ul a:focus, -.sm-simple ul ul ul ul a:active { - border-left: 32px solid transparent; -} -.sm-simple ul ul ul ul ul a, -.sm-simple ul ul ul ul ul a:hover, -.sm-simple ul ul ul ul ul a:focus, -.sm-simple ul ul ul ul ul a:active { - border-left: 40px solid transparent; -} - -@media (min-width: 768px) { - /* Switch to desktop layout - ----------------------------------------------- - These transform the menu tree from - collapsible to desktop (navbar + dropdowns) - -----------------------------------------------*/ - /* start... (it's not recommended editing these rules) */ - .sm-simple ul { - position: absolute; - width: 12em; - } - - .sm-simple li { - float: left; - } - - .sm-simple.sm-rtl li { - float: right; - } - - .sm-simple ul li, .sm-simple.sm-rtl ul li, .sm-simple.sm-vertical li { - float: none; - } - - .sm-simple a { - white-space: nowrap; - } - - .sm-simple ul a, .sm-simple.sm-vertical a { - white-space: normal; - } - - .sm-simple .sm-nowrap > li > a, .sm-simple .sm-nowrap > li > :not(ul) a { - white-space: nowrap; - } - - /* ...end */ - .sm-simple { - background: #fff; - } - .sm-simple a, .sm-simple a:hover, .sm-simple a:focus, .sm-simple a:active, .sm-simple a.highlighted { - padding: 11px 20px; - color: #555555; - } - .sm-simple a:hover, .sm-simple a:focus, .sm-simple a:active, .sm-simple a.highlighted { - background: #eeeeee; - } - .sm-simple a.current { - background: #555555; - color: #fff; - } - .sm-simple a.disabled { - background: #fff; - color: #cccccc; - } - .sm-simple a.has-submenu { - padding-right: 32px; - } - .sm-simple a .sub-arrow { - top: 50%; - margin-top: -8px; - right: 20px; - width: 8px; - height: 16px; - font: 14px/16px monospace !important; - background: transparent; - } - .sm-simple a.highlighted .sub-arrow::before { - content: '+'; - } - .sm-simple > li { - border-top: 0; - border-left: 1px solid #eeeeee; - } - .sm-simple > li:first-child { - border-left: 0; - } - .sm-simple ul { - border: 1px solid #bbbbbb; - background: #fff; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - } - .sm-simple ul a { - border: 0 !important; - } - .sm-simple ul a.has-submenu { - padding-right: 20px; - } - .sm-simple ul a .sub-arrow { - left: 8px; - right: auto; - } - .sm-simple ul > li { - border-left: 0; - border-top: 1px solid #eeeeee; - } - .sm-simple ul > li:first-child { - border-top: 0; - } - .sm-simple .scroll-up, - .sm-simple .scroll-down { - position: absolute; - display: none; - visibility: hidden; - overflow: hidden; - background: #fff; - height: 20px; - } - .sm-simple .scroll-up-arrow, - .sm-simple .scroll-down-arrow { - position: absolute; - top: -2px; - left: 50%; - margin-left: -8px; - width: 0; - height: 0; - overflow: hidden; - border-width: 8px; - border-style: dashed dashed solid dashed; - border-color: transparent transparent #555555 transparent; - } - .sm-simple .scroll-down-arrow { - top: 6px; - border-style: solid dashed dashed dashed; - border-color: #555555 transparent transparent transparent; - } - .sm-simple.sm-rtl a.has-submenu { - padding-right: 20px; - padding-left: 32px; - } - .sm-simple.sm-rtl a .sub-arrow { - left: 20px; - right: auto; - } - .sm-simple.sm-rtl.sm-vertical a.has-submenu { - padding: 11px 20px; - } - .sm-simple.sm-rtl.sm-vertical a .sub-arrow { - left: auto; - right: 8px; - } - .sm-simple.sm-rtl > li:first-child { - border-left: 1px solid #eeeeee; - } - .sm-simple.sm-rtl > li:last-child { - border-left: 0; - } - .sm-simple.sm-rtl ul a.has-submenu { - padding: 11px 20px; - } - .sm-simple.sm-rtl ul a .sub-arrow { - left: auto; - right: 8px; - } - .sm-simple.sm-vertical a .sub-arrow { - left: 8px; - right: auto; - } - .sm-simple.sm-vertical li { - border-left: 0; - border-top: 1px solid #eeeeee; - } - .sm-simple.sm-vertical > li:first-child { - border-top: 0; - } -} - -/*# sourceMappingURL=sm-simple.css.map */ diff --git a/pagetop-megamenu/static/css/sm-simple.css.map b/pagetop-megamenu/static/css/sm-simple.css.map deleted file mode 100644 index 88f04761..00000000 --- a/pagetop-megamenu/static/css/sm-simple.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": "AAwHA,UAAW;EACV,MAAM,EAAE,iBAAmE;EAC3E,UAAU,EAhCiC,IAAiB;EAiC5D,UAAU,EAvE8B,4BAAiC;;AA2ExE,yEAGS;EACR,OAAO,EAAE,SAA6F;EACtG,qDAAqD;EACrD,aAAa,EAAE,IAAsG;EACrH,KAAK,EA3CiC,OAAuB;EA4C7D,WAAW,EAvGkB,wEAAwE;EAwGrG,SAAS,EAvGuB,IAAI;EAwGpC,WAAW,EAAE,MAAM;EACnB,WAAW,EAvGkB,IAAI;EAwGjC,eAAe,EAAE,IAAI;;AAGtB,oBAAU;EACT,UAAU,EApD4B,OAAuB;EAqD7D,KAAK,EAtDoC,IAAiB;;AAyD3D,qBAAW;EACV,KAAK,EA1FuC,OAA8B;;AA8F3E,uBAAW;EACV,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,UAAU,EAAE,KAAoC;EAChD,IAAI,EAAE,IAAI;EACV,KAAK,EAxCoB,GAAoC;EAyC7D,KAAK,EA1CiB,IAAoC;EA2C1D,MAAM,EA3CgB,IAAoC;EA4C1D,QAAQ,EAAE,MAAM;EAChB,IAAI,EAAE,mCAAmF;EACzF,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,IAAI;EACjB,UAAU,EAlG2B,mBAAmB;;AAoGzD,+BAAmB;EAClB,OAAO,EAAE,GAAG;;AAEb,2CAAiC;EAChC,OAAO,EAAE,GAAG;;AAKd,aAAG;EACF,UAAU,EAAE,6BAAkD;;AAExD,2BAAiB;EACvB,UAAU,EAAE,CAAC;;AAId,aAAG;EACF,UAAU,EA9G0B,wBAAkD;;AAkHrF,qFAGS;EACR,SAAS,EA9JsB,IAAI;EAgKnC,WAAW,EAAE,qBAA8D;;AC3L7E;;;yBAGmB;EAClB,WAAW,EAAE,sBAAsC;;AAJpD;;;4BAGmB;EAClB,WAAW,EAAE,sBAAsC;;AAJpD;;;+BAGmB;EAClB,WAAW,EAAE,sBAAsC;;AAJpD;;;kCAGmB;EAClB,WAAW,EAAE,sBAAsC;;;ADqMtD,yBAA2C;EAE1C;;;;mDAIiD;EACjD,yDAAyD;EACzD,aAAa;IAAC,QAAQ,EAAC,QAAQ;IAAC,KAAK,EAAC,IAAI;;;EAC1C,aAAa;IAAC,KAAK,EAAC,IAAI;;;EACxB,oBAAoB;IAAC,KAAK,EAAC,KAAK;;;EAChC,oEAAkE;IAAC,KAAK,EAAC,IAAI;;;EAC7E,YAAY;IAAC,WAAW,EAAC,MAAM;;;EAC/B,yCAAwC;IAAC,WAAW,EAAC,MAAM;;;EAC3D,uEAAsE;IAAC,WAAW,EAAC,MAAM;;;EACzF,YAAY;EAGZ,UAAW;IACV,UAAU,EAzIgC,IAAiB;;EA6I1D,mGAIc;IACb,OAAO,EAAE,SAAqF;IAC9F,KAAK,EAlJgC,OAAuB;;EAqJ7D,qFAGc;IACb,UAAU,EAlJ4B,OAAgB;;EAqJvD,oBAAU;IACT,UAAU,EA7J2B,OAAuB;IA8J5D,KAAK,EA/JmC,IAAiB;;EAkK1D,qBAAW;IACV,UAAU,EAnK8B,IAAiB;IAoKzD,KAAK,EAlKmC,OAA8B;;EAsKvE,wBAAc;IACb,aAAa,EAAE,IAAqF;;EAIrG,uBAAW;IACV,GAAG,EAAE,GAAG;IACR,UAAU,EAAE,IAAI;IAChB,KAAK,EA5KsC,IAAI;IA6K/C,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,8BAAwD;IAC9D,UAAU,EAAE,WAAW;;EAGxB,2CAAiC;IAChC,OAAO,EAAE,GAAG;;EAKd,eAAK;IACJ,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,iBAA8E;;EAE3F,2BAAc;IACb,WAAW,EAAE,CAAC;;EAKhB,aAAG;IACF,MAAM,EAAE,iBAAmE;IAC3E,UAAU,EAzM+B,IAAiB;IA0M1D,UAAU,EAhP4B,4BAAiC;;EAmPvE,eAAE;IACD,MAAM,EAAE,YAAY;;EAGpB,2BAAc;IACb,aAAa,EA9M6B,IAAI;;EAkN/C,0BAAW;IACV,IAAI,EAAE,GAAqF;IAC3F,KAAK,EAAE,IAAI;;EAKb,kBAAK;IACJ,WAAW,EAAE,CAAC;IACd,UAAU,EAAE,iBAA8E;;EAE1F,8BAAc;IACb,UAAU,EAAE,CAAC;;EAMhB;yBACa;IACZ,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,MAAM;IAChB,UAAU,EA9O+B,IAAiB;IA+O1D,MAAM,EAAE,IAAI;;EAGb;+BACmB;IAClB,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,GAAG;IACT,WAAW,EAAE,IAAI;IAEjB,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,MAAM;IAChB,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,2CAAkE;;EAEjF,6BAAmB;IAClB,GAAG,EAAE,GAAG;IACR,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,2CAAkE;;EAa/E,+BAAc;IACb,aAAa,EA7Q6B,IAAI;IA8Q9C,YAAY,EAAE,IAAqF;;EAIpG,8BAAW;IACV,IAAI,EAnRsC,IAAI;IAoR9C,KAAK,EAAE,IAAI;;EASX,2CAAc;IACb,OAAO,EAAE,SAAqF;;EAI/F,0CAAW;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,GAAqF;;EAO9F,kCAAc;IACb,WAAW,EAAE,iBAA8E;;EAE5F,iCAAa;IACZ,WAAW,EAAE,CAAC;;EASd,kCAAc;IACb,OAAO,EAAE,SAAqF;;EAI/F,iCAAW;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,GAAqF;;EAgB9F,mCAAW;IACV,IAAI,EAAE,GAAqF;IAC3F,KAAK,EAAE,IAAI;;EAKb,yBAAG;IACF,WAAW,EAAE,CAAC;IACd,UAAU,EAAE,iBAA8E;;EAE3F,uCAAiB;IAChB,UAAU,EAAE,CAAC", -"sources": ["_sm-simple-theme.scss","mixins/_sub-items-indentation.scss"], -"names": [], -"file": "sm-simple.css" -} diff --git a/pagetop-megamenu/static/css/smartmenus.css b/pagetop-megamenu/static/css/smartmenus.css deleted file mode 100644 index a418e5fa..00000000 --- a/pagetop-megamenu/static/css/smartmenus.css +++ /dev/null @@ -1,130 +0,0 @@ -.megamenu:after { - clear: both; - content: "\00a0"; - display: block; - height: 0; - font: 0px/0 serif; - overflow: hidden; -}/* -@media (min-width: 768px) { - .megamenu { - position: relative; - } -}*/ - -.megamenu-menu { - clear: both; -}/* -@media (min-width: 768px) { - .megamenu-menu { - position: absolute; - right: 10px; - bottom: 0; - } -}*/ - -/* Mobile menu toggle button */ - -.megamenu-btn { - float: right; - margin: 6px 10px; - position: relative; - display: inline-block; - width: 29px; - height: 29px; - text-indent: 29px; - white-space: nowrap; - overflow: hidden; - cursor: pointer; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -@media (min-width: 768px) { - /* Hide the button in desktop view */ - .megamenu-btn { - position: absolute; - top: -99999px; - } -} - -/* Hamburger icon */ - -.megamenu-btn-icon, -.megamenu-btn-icon:before, -.megamenu-btn-icon:after { - position: absolute; - top: 50%; - left: 2px; - height: 2px; - width: 24px; - background: #555; - -webkit-transition: all 0.25s; - transition: all 0.25s; -} -.megamenu-btn-icon:before { - content: ''; - top: -7px; - left: 0; -} -.megamenu-btn-icon:after { - content: ''; - top: 7px; - left: 0; -} - -/* X icon */ - -.megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon { - height: 0; - background: transparent; -} -.megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon:before { - top: 0; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); -} -.megamenu-state:checked ~ .megamenu-btn .megamenu-btn-icon:after { - top: 0; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); -} - -/* Hide menu state checkbox (keep it visible to screen readers) */ - -.megamenu-state { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - border: 0; - padding: 0; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); -} - -/* Hide the menu in mobile view */ - -.megamenu-state:not(:checked) ~ .megamenu-menu { - display: none; -} -.megamenu-state:checked ~ .megamenu-menu { - display: block; -} -@media (min-width: 768px) { - /* Always show the menu in desktop view */ - .megamenu-state:not(:checked) ~ .megamenu-menu { - display: block; - } -} - -/* Core */ - -.sm{box-sizing:border-box;z-index:9999;-webkit-tap-highlight-color:rgba(0,0,0,0);} -.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;} -.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right;} -.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0;} -.sm ul{display:none;} -.sm li,.sm a{position:relative;} -.sm a{display:block;} -.sm a.disabled{cursor:default;} -.sm::after{content:"";display:block;height:0;font:0px/0 serif;clear:both;overflow:hidden;} -.sm *,.sm *::before,.sm *::after{box-sizing:inherit;} \ No newline at end of file diff --git a/pagetop-megamenu/static/js/smartmenus.min.js b/pagetop-megamenu/static/js/smartmenus.min.js deleted file mode 100644 index 3cbc0c13..00000000 --- a/pagetop-megamenu/static/js/smartmenus.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! SmartMenus jQuery Plugin - v1.2.1 - November 3, 2022 - * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&"object"==typeof module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){function b(b){var i=".smartmenus_mouse";if(h||b)h&&b&&(a(document).off(i),h=!1);else{var j=!0,k=null,l={mousemove:function(b){var c={x:b.pageX,y:b.pageY,timeStamp:(new Date).getTime()};if(k){var d=Math.abs(k.x-c.x),g=Math.abs(k.y-c.y);if((d>0||g>0)&&d<=4&&g<=4&&c.timeStamp-k.timeStamp<=300&&(f=!0,j)){var h=a(b.target).closest("a");h.is("a")&&a.each(e,function(){if(a.contains(this.$root[0],h[0]))return this.itemEnter({currentTarget:h[0]}),!1}),j=!1}}k=c}};l[g?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(a){c(a.originalEvent)&&(f=!1)},a(document).on(d(l,i)),h=!0}}function c(a){return!/^(4|mouse)$/.test(a.pointerType)}function d(a,b){b||(b="");var c={};for(var d in a)c[d.split(" ").join(b+" ")+b]=a[d];return c}var e=[],f=!1,g="ontouchstart"in window,h=!1,i=window.requestAnimationFrame||function(a){return setTimeout(a,1e3/60)},j=window.cancelAnimationFrame||function(a){clearTimeout(a)},k=!!a.fn.animate;return a.SmartMenus=function(b,c){this.$root=a(b),this.opts=c,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in b.style||"webkitPerspective"in b.style,this.wasCollapsible=!1,this.init()},a.extend(a.SmartMenus,{hideAll:function(){a.each(e,function(){this.menuHideAll()})},destroy:function(){for(;e.length;)e[0].destroy();b(!0)},prototype:{init:function(c){var f=this;if(!c){e.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var g=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(d({"mouseover focusin":a.proxy(this.rootOver,this),"mouseout focusout":a.proxy(this.rootOut,this),keydown:a.proxy(this.rootKeyDown,this)},g)).on(d({mouseenter:a.proxy(this.itemEnter,this),mouseleave:a.proxy(this.itemLeave,this),mousedown:a.proxy(this.itemDown,this),focus:a.proxy(this.itemFocus,this),blur:a.proxy(this.itemBlur,this),click:a.proxy(this.itemClick,this)},g),"a"),g+=this.rootId,this.opts.hideOnClick&&a(document).on(d({touchstart:a.proxy(this.docTouchStart,this),touchmove:a.proxy(this.docTouchMove,this),touchend:a.proxy(this.docTouchEnd,this),click:a.proxy(this.docClick,this)},g)),a(window).on(d({"resize orientationchange":a.proxy(this.winResize,this)},g)),this.opts.subIndicators&&(this.$subArrow=a("<span/>").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),b()}if(this.$firstSub=this.$root.find("ul").each(function(){f.menuInit(a(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var h=/(index|default)\.[^#\?\/]*/i,i=/#.*/,j=window.location.href.replace(h,""),k=j.replace(i,"");this.$root.find("a:not(.mega-menu a)").each(function(){var b=this.href.replace(h,""),c=a(this);b!=j&&b!=k||(c.addClass("current"),f.opts.markCurrentTree&&c.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(b){if(!b){var c=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(c),c+=this.rootId,a(document).off(c),a(window).off(c),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var d=this;this.$root.find("ul").each(function(){var b=a(this);b.dataSM("scroll-arrows")&&b.dataSM("scroll-arrows").remove(),b.dataSM("shown-before")&&((d.opts.subMenusMinWidth||d.opts.subMenusMaxWidth)&&b.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),b.dataSM("scroll-arrows")&&b.dataSM("scroll-arrows").remove(),b.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(b.attr("id")||"").indexOf(d.accessIdPrefix)&&b.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var b=a(this);0==b.attr("id").indexOf(d.accessIdPrefix)&&b.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),b||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),e.splice(a.inArray(this,e),1))},disable:function(b){if(!this.disabled){if(this.menuHideAll(),!b&&!this.opts.isPopup&&this.$root.is(":visible")){var c=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:c.top,left:c.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(b){return this.$touchScrollingSub?void(this.$touchScrollingSub=null):void((this.visibleSubMenus.length&&!a.contains(this.$root[0],b.target)||a(b.target).closest("a").length)&&this.menuHideAll())},docTouchEnd:function(b){if(this.lastTouch){if(this.visibleSubMenus.length&&(void 0===this.lastTouch.x2||this.lastTouch.x1==this.lastTouch.x2)&&(void 0===this.lastTouch.y2||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var c=this;this.hideTimeout=setTimeout(function(){c.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(a){if(this.lastTouch){var b=a.originalEvent.touches[0];this.lastTouch.x2=b.pageX,this.lastTouch.y2=b.pageY}},docTouchStart:function(a){var b=a.originalEvent.touches[0];this.lastTouch={x1:b.pageX,y1:b.pageY,target:b.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(b){for(var c=a(b).closest("ul");c.dataSM("in-mega");)c=c.parent().closest("ul");return c[0]||null},getHeight:function(a){return this.getOffset(a,!0)},getOffset:function(a,b){var c;"none"==a.css("display")&&(c={position:a[0].style.position,visibility:a[0].style.visibility},a.css({position:"absolute",visibility:"hidden"}).show());var d=a[0].getBoundingClientRect&&a[0].getBoundingClientRect(),e=d&&(b?d.height||d.bottom-d.top:d.width||d.right-d.left);return e||0===e||(e=b?a[0].offsetHeight:a[0].offsetWidth),c&&a.hide().css(c),e},getStartZIndex:function(a){var b=parseInt(this[a?"$root":"$firstSub"].css("z-index"));return!a&&isNaN(b)&&(b=parseInt(this.$root.css("z-index"))),isNaN(b)?1:b},getTouchPoint:function(a){return a.touches&&a.touches[0]||a.changedTouches&&a.changedTouches[0]||a},getViewport:function(a){var b=a?"Height":"Width",c=document.documentElement["client"+b],d=window["inner"+b];return d&&(c=Math.min(c,d)),c},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(a){return this.getOffset(a)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(a){return this.handleEvents()&&!this.isLinkInMegaMenu(a)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var b="fixed"==this.$root.css("position");return b||this.$root.parentsUntil("body").each(function(){if("fixed"==a(this).css("position"))return b=!0,!1}),b},isLinkInMegaMenu:function(b){return a(this.getClosestMenu(b[0])).hasClass("mega-menu")},isTouchMode:function(){return!f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(b,c){var d=b.closest("ul"),e=d.dataSM("level");if(e>1&&(!this.activatedItems[e-2]||this.activatedItems[e-2][0]!=d.dataSM("parent-a")[0])){var f=this;a(d.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(d).each(function(){f.itemActivate(a(this).dataSM("parent-a"))})}if(this.isCollapsible()&&!c||this.menuHideSubMenus(this.activatedItems[e-1]&&this.activatedItems[e-1][0]==b[0]?e:e-1),this.activatedItems[e-1]=b,this.$root.triggerHandler("activate.smapi",b[0])!==!1){var g=b.dataSM("sub");g&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(g)}},itemBlur:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&this.$root.triggerHandler("blur.smapi",c[0])},itemClick:function(b){var c=a(b.currentTarget);if(this.handleItemEvents(c)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==c.closest("ul")[0])return this.$touchScrollingSub=null,b.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",c[0])===!1)return!1;var d=c.dataSM("sub"),e=!!d&&2==d.dataSM("level");if(d){var f=a(b.target).is(".sub-arrow"),g=this.isCollapsible(),h=/toggle$/.test(this.opts.collapsibleBehavior),i=/link$/.test(this.opts.collapsibleBehavior),j=/^accordion/.test(this.opts.collapsibleBehavior);if(d.is(":visible")){if(!g&&this.opts.showOnClick&&e)return this.menuHide(d),this.clickActivated=!1,this.focusActivated=!1,!1;if(g&&(h||f))return this.itemActivate(c,j),this.menuHide(d),!1}else if((!i||!g||f)&&(!g&&this.opts.showOnClick&&e&&(this.clickActivated=!0),this.itemActivate(c,j),d.is(":visible")))return this.focusActivated=!0,!1}return!(!g&&this.opts.showOnClick&&e||c.hasClass("disabled")||this.$root.triggerHandler("select.smapi",c[0])===!1)&&void 0}},itemDown:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&c.dataSM("mousedown",!0)},itemEnter:function(b){var c=a(b.currentTarget);if(this.handleItemEvents(c)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var d=this;this.showTimeout=setTimeout(function(){d.itemActivate(c)},this.opts.showOnClick&&1==c.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",c[0])}},itemFocus:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&(!this.focusActivated||this.isTouchMode()&&c.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==c[0]||this.itemActivate(c,!0),this.$root.triggerHandler("focus.smapi",c[0]))},itemLeave:function(b){var c=a(b.currentTarget);this.handleItemEvents(c)&&(this.isTouchMode()||(c[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),c.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",c[0]))},menuHide:function(b){if(this.$root.triggerHandler("beforehide.smapi",b[0])!==!1&&(k&&b.stop(!0,!0),"none"!=b.css("display"))){var c=function(){b.css("z-index","")};this.isCollapsible()?k&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,b,c):b.hide(this.opts.collapsibleHideDuration,c):k&&this.opts.hideFunction?this.opts.hideFunction.call(this,b,c):b.hide(this.opts.hideDuration,c),b.dataSM("scroll")&&(this.menuScrollStop(b),b.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),b.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),b.attr({"aria-expanded":"false","aria-hidden":"true"});var d=b.dataSM("level");this.activatedItems.splice(d-1,1),this.visibleSubMenus.splice(a.inArray(b,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",b[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var a=this.opts.isPopup?1:0,b=this.visibleSubMenus.length-1;b>=a;b--)this.menuHide(this.visibleSubMenus[b]);this.opts.isPopup&&(k&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(k&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(a){for(var b=this.activatedItems.length-1;b>=a;b--){var c=this.activatedItems[b].dataSM("sub");c&&this.menuHide(c)}},menuInit:function(a){if(!a.dataSM("in-mega")){a.hasClass("mega-menu")&&a.find("ul").dataSM("in-mega",!0);for(var b=2,c=a[0];(c=c.parentNode.parentNode)!=this.$root[0];)b++;var d=a.prevAll("a").eq(-1);d.length||(d=a.prevAll().find("a").eq(-1)),d.addClass("has-submenu").dataSM("sub",a),a.dataSM("parent-a",d).dataSM("level",b).parent().dataSM("sub",a);var e=d.attr("id")||this.accessIdPrefix+ ++this.idInc,f=a.attr("id")||this.accessIdPrefix+ ++this.idInc;d.attr({id:e,"aria-haspopup":"true","aria-controls":f,"aria-expanded":"false"}),a.attr({id:f,role:"group","aria-hidden":"true","aria-labelledby":e,"aria-expanded":"false"}),this.opts.subIndicators&&d[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(b){var c,e,f=b.dataSM("parent-a"),h=f.closest("li"),i=h.parent(),j=b.dataSM("level"),k=this.getWidth(b),l=this.getHeight(b),m=f.offset(),n=m.left,o=m.top,p=this.getWidth(f),q=this.getHeight(f),r=a(window),s=r.scrollLeft(),t=r.scrollTop(),u=this.getViewportWidth(),v=this.getViewportHeight(),w=i.parent().is("[data-sm-horizontal-sub]")||2==j&&!i.hasClass("sm-vertical"),x=this.opts.rightToLeftSubMenus&&!h.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&h.is("[data-sm-reverse]"),y=2==j?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,z=2==j?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(w?(c=x?p-k-y:y,e=this.opts.bottomToTopSubMenus?-l-z:q+z):(c=x?y-k:p-y,e=this.opts.bottomToTopSubMenus?q-z-l:z),this.opts.keepInViewport){var A=n+c,B=o+e;if(x&&A<s?c=w?s-A+c:p-y:!x&&A+k>s+u&&(c=w?s+u-k-A+c:y-k),w||(l<v&&B+l>t+v?e+=t+v-l-B:(l>=v||B<t)&&(e+=t-B)),w&&(B+l>t+v+.49||B<t)||!w&&l>v+.49){var C=this;b.dataSM("scroll-arrows")||b.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).on({mouseenter:function(){b.dataSM("scroll").up=a(this).hasClass("scroll-up"),C.menuScroll(b)},mouseleave:function(a){C.menuScrollStop(b),C.menuScrollOut(b,a)},"mousewheel DOMMouseScroll":function(a){a.preventDefault()}}).insertAfter(b));var D=".smartmenus_scroll";if(b.dataSM("scroll",{y:this.cssTransforms3d?0:e-q,step:1,itemH:q,subH:l,arrowDownH:this.getHeight(b.dataSM("scroll-arrows").eq(1))}).on(d({mouseover:function(a){C.menuScrollOver(b,a)},mouseout:function(a){C.menuScrollOut(b,a)},"mousewheel DOMMouseScroll":function(a){C.menuScrollMousewheel(b,a)}},D)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:c+(parseInt(b.css("border-left-width"))||0),width:k-(parseInt(b.css("border-left-width"))||0)-(parseInt(b.css("border-right-width"))||0),zIndex:b.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var E={};E[g?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(a){C.menuScrollTouch(b,a)},b.css({"touch-action":"none","-ms-touch-action":"none"}).on(d(E,D))}}}b.css({top:"auto",left:"0",marginLeft:c,marginTop:e-q})},menuScroll:function(a,b,c){var d,e=a.dataSM("scroll"),g=a.dataSM("scroll-arrows"),h=e.up?e.upEnd:e.downEnd;if(!b&&e.momentum){if(e.momentum*=.92,d=e.momentum,d<.5)return void this.menuScrollStop(a)}else d=c||(b||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(e.step));var j=a.dataSM("level");if(this.activatedItems[j-1]&&this.activatedItems[j-1].dataSM("sub")&&this.activatedItems[j-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(j-1),e.y=e.up&&h<=e.y||!e.up&&h>=e.y?e.y:Math.abs(h-e.y)>d?e.y+(e.up?d:-d):h,a.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+e.y+"px, 0)",transform:"translate3d(0, "+e.y+"px, 0)"}:{marginTop:e.y}),f&&(e.up&&e.y>e.downEnd||!e.up&&e.y<e.upEnd)&&g.eq(e.up?1:0).show(),e.y==h)f&&g.eq(e.up?0:1).hide(),this.menuScrollStop(a);else if(!b){this.opts.scrollAccelerate&&e.step<this.opts.scrollStep&&(e.step+=.2);var k=this;this.scrollTimeout=i(function(){k.menuScroll(a)})}},menuScrollMousewheel:function(a,b){if(this.getClosestMenu(b.target)==a[0]){b=b.originalEvent;var c=(b.wheelDelta||-b.detail)>0;a.dataSM("scroll-arrows").eq(c?0:1).is(":visible")&&(a.dataSM("scroll").up=c,this.menuScroll(a,!0))}b.preventDefault()},menuScrollOut:function(b,c){f&&(/^scroll-(up|down)/.test((c.relatedTarget||"").className)||(b[0]==c.relatedTarget||a.contains(b[0],c.relatedTarget))&&this.getClosestMenu(c.relatedTarget)==b[0]||b.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(b,c){if(f&&!/^scroll-(up|down)/.test(c.target.className)&&this.getClosestMenu(c.target)==b[0]){this.menuScrollRefreshData(b);var d=b.dataSM("scroll"),e=a(window).scrollTop()-b.dataSM("parent-a").offset().top-d.itemH;b.dataSM("scroll-arrows").eq(0).css("margin-top",e).end().eq(1).css("margin-top",e+this.getViewportHeight()-d.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(b){var c=b.dataSM("scroll"),d=a(window).scrollTop()-b.dataSM("parent-a").offset().top-c.itemH;this.cssTransforms3d&&(d=-(parseFloat(b.css("margin-top"))-d)),a.extend(c,{upEnd:d,downEnd:d+this.getViewportHeight()-c.subH})},menuScrollStop:function(a){if(this.scrollTimeout)return j(this.scrollTimeout),this.scrollTimeout=0,a.dataSM("scroll").step=1,!0},menuScrollTouch:function(b,d){if(d=d.originalEvent,c(d)){var e=this.getTouchPoint(d);if(this.getClosestMenu(e.target)==b[0]){var f=b.dataSM("scroll");if(/(start|down)$/i.test(d.type))this.menuScrollStop(b)?(d.preventDefault(),this.$touchScrollingSub=b):this.$touchScrollingSub=null,this.menuScrollRefreshData(b),a.extend(f,{touchStartY:e.pageY,touchStartTime:d.timeStamp});else if(/move$/i.test(d.type)){var g=void 0!==f.touchY?f.touchY:f.touchStartY;if(void 0!==g&&g!=e.pageY){this.$touchScrollingSub=b;var h=g<e.pageY;void 0!==f.up&&f.up!=h&&a.extend(f,{touchStartY:e.pageY,touchStartTime:d.timeStamp}),a.extend(f,{up:h,touchY:e.pageY}),this.menuScroll(b,!0,Math.abs(e.pageY-g))}d.preventDefault()}else void 0!==f.touchY&&((f.momentum=15*Math.pow(Math.abs(e.pageY-f.touchStartY)/(d.timeStamp-f.touchStartTime),2))&&(this.menuScrollStop(b),this.menuScroll(b),d.preventDefault()),delete f.touchY)}}},menuShow:function(a){if((a.dataSM("beforefirstshowfired")||(a.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",a[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",a[0])!==!1&&(a.dataSM("shown-before",!0),k&&a.stop(!0,!0),!a.is(":visible"))){var b=a.dataSM("parent-a"),c=this.isCollapsible();if((this.opts.keepHighlighted||c)&&b.addClass("highlighted"),c)a.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(a.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(a.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&a.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var d=this.getWidth(a);a.css("max-width",this.opts.subMenusMaxWidth),d>this.getWidth(a)&&a.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(a)}var e=function(){a.css("overflow","")};c?k&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,a,e):a.show(this.opts.collapsibleShowDuration,e):k&&this.opts.showFunction?this.opts.showFunction.call(this,a,e):a.show(this.opts.showDuration,e),b.attr("aria-expanded","true"),a.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(a),this.$root.triggerHandler("show.smapi",a[0])}},popupHide:function(a){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var b=this;this.hideTimeout=setTimeout(function(){b.menuHideAll()},a?1:this.opts.hideTimeout)},popupShow:function(a,b){if(!this.opts.isPopup)return void alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),k&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:a,top:b});var c=this,d=function(){c.$root.css("overflow","")};k&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,d):this.$root.show(this.opts.showDuration,d),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(b){if(this.handleEvents())switch(b.keyCode){case 27:var c=this.activatedItems[0];if(c){this.menuHideAll(),c[0].focus();var d=c.dataSM("sub");d&&this.menuHide(d)}break;case 32:var e=a(b.target);if(e.is("a")&&this.handleItemEvents(e)){var d=e.dataSM("sub");d&&!d.is(":visible")&&(this.itemClick({currentTarget:b.target}),b.preventDefault())}}},rootOut:function(a){if(this.handleEvents()&&!this.isTouchMode()&&a.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var b=this;this.hideTimeout=setTimeout(function(){b.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(a){this.handleEvents()&&!this.isTouchMode()&&a.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(a){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==a.type){var b=this.isCollapsible();this.wasCollapsible&&b||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=b}}else if(this.$disableOverlay){var c=this.$root.offset();this.$disableOverlay.css({top:c.top,left:c.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),a.fn.dataSM=function(a,b){return b?this.data(a+"_smartmenus",b):this.data(a+"_smartmenus")},a.fn.removeDataSM=function(a){return this.removeData(a+"_smartmenus")},a.fn.smartmenus=function(b){if("string"==typeof b){var c=arguments,d=b;return Array.prototype.shift.call(c),this.each(function(){var b=a(this).data("smartmenus");b&&b[d]&&b[d].apply(b,c)})}return this.each(function(){var c=a(this).data("sm-options")||null;c&&"object"!=typeof c&&(c=null,alert('ERROR\n\nSmartMenus jQuery init:\nThe value of the "data-sm-options" attribute must be valid JSON.')),c&&a.each(["showFunction","hideFunction","collapsibleShowFunction","collapsibleHideFunction"],function(){this in c&&delete c[this]}),new a.SmartMenus(this,a.extend({},a.fn.smartmenus.defaults,b,c))})},a.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(a,b){a.fadeOut(200,b)},collapsibleShowDuration:0,collapsibleShowFunction:function(a,b){a.slideDown(200,b)},collapsibleHideDuration:0,collapsibleHideFunction:function(a,b){a.slideUp(200,b)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},a}); \ No newline at end of file diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs new file mode 100644 index 00000000..9574fac7 --- /dev/null +++ b/pagetop/src/base/component/menu.rs @@ -0,0 +1,17 @@ +mod menu_main; +pub use menu_main::{Menu, COMPONENT_MENU}; + +mod item; +pub use item::{Item, ItemType, COMPONENT_MENU_ITEM}; + +mod submenu; +pub use submenu::{Submenu, COMPONENT_MENU_SUBMENU}; + +mod megamenu; +pub use megamenu::{Megamenu, COMPONENT_MENU_MEGAMENU}; + +mod group; +pub use group::{Group, COMPONENT_MENU_GROUP}; + +mod element; +pub use element::{Element, ElementType, COMPONENT_MENU_ELEMENT}; diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs new file mode 100644 index 00000000..c3567105 --- /dev/null +++ b/pagetop/src/base/component/menu/element.rs @@ -0,0 +1,92 @@ +use crate::prelude::*; + +use super::Submenu; + +new_handle!(COMPONENT_MENU_ELEMENT); + +type Content = TypedComponent<Html>; +type SubmenuItems = TypedComponent<Submenu>; + +#[derive(Default)] +pub enum ElementType { + #[default] + Void, + Html(Content), + Submenu(SubmenuItems), +} + +// Element. + +#[rustfmt::skip] +#[derive(Default)] +pub struct Element { + weight : Weight, + renderable : Renderable, + element_type: ElementType, +} + +impl ComponentTrait for Element { + fn new() -> Self { + Element::default() + } + + fn handle(&self) -> Handle { + COMPONENT_MENU_ELEMENT + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + match self.element_type() { + ElementType::Void => PrepareMarkup::None, + ElementType::Html(content) => PrepareMarkup::With(html! { + (content.prepare(cx)) + }), + ElementType::Submenu(submenu) => PrepareMarkup::With(html! { + (submenu.prepare(cx)) + }), + } + } +} + +impl Element { + pub fn html(content: Html) -> Self { + Element { + element_type: ElementType::Html(Content::with(content)), + ..Default::default() + } + } + + pub fn submenu(submenu: Submenu) -> Self { + Element { + element_type: ElementType::Submenu(SubmenuItems::with(submenu)), + ..Default::default() + } + } + + // Element BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + // Element GETTERS. + + pub fn element_type(&self) -> &ElementType { + &self.element_type + } +} diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs new file mode 100644 index 00000000..ee037eb4 --- /dev/null +++ b/pagetop/src/base/component/menu/group.rs @@ -0,0 +1,86 @@ +use crate::prelude::*; + +use super::Element; + +new_handle!(COMPONENT_MENU_GROUP); + +type Elements = TypedComponents<Element>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Group { + weight : Weight, + renderable: Renderable, + id : OptionId, + elements : Elements, +} + +impl ComponentTrait for Group { + fn new() -> Self { + Group::default() + } + + fn handle(&self) -> Handle { + COMPONENT_MENU_GROUP + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class="menu-group" { + (self.elements().prepare(cx)) + } + }) + } +} + +impl Group { + // Group BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + + pub fn with_element(mut self, element: Element) -> Self { + self.elements + .alter(TypedOp::Add(TypedComponent::with(element))); + self + } + + #[fn_builder] + pub fn alter_elements(&mut self, op: TypedOp<Element>) -> &mut Self { + self.elements.alter(op); + self + } + + // Group GETTERS. + + pub fn elements(&self) -> &Elements { + &self.elements + } +} diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs new file mode 100644 index 00000000..18108eef --- /dev/null +++ b/pagetop/src/base/component/menu/item.rs @@ -0,0 +1,179 @@ +use crate::prelude::*; + +use super::{Megamenu, Submenu}; + +new_handle!(COMPONENT_MENU_ITEM); + +type Label = TypedComponent<L10n>; +type Content = TypedComponent<Html>; +type SubmenuItems = TypedComponent<Submenu>; +type MegamenuGroups = TypedComponent<Megamenu>; +type Description = TypedComponent<L10n>; + +#[derive(Default)] +pub enum ItemType { + #[default] + Void, + Label(Label), + Link(Label, FnContextualPath), + LinkBlank(Label, FnContextualPath), + Html(Content), + Submenu(Label, SubmenuItems), + Megamenu(Label, MegamenuGroups), +} + +// Item. + +#[rustfmt::skip] +#[derive(Default)] +pub struct Item { + weight : Weight, + renderable : Renderable, + item_type : ItemType, + description: Description, +} + +impl ComponentTrait for Item { + fn new() -> Self { + Item::default() + } + + fn handle(&self) -> Handle { + COMPONENT_MENU_ITEM + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let description = self.description.get().into_string(cx); + match self.item_type() { + ItemType::Void => PrepareMarkup::None, + ItemType::Label(label) => PrepareMarkup::With(html! { + li class="menu-label" { + span title=[description] { + (label.prepare(cx)) + } + } + }), + ItemType::Link(label, path) => PrepareMarkup::With(html! { + li class="menu-link" { + a href=(path(cx)) title=[description] { + (label.prepare(cx)) + } + } + }), + ItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { + li class="menu-link" { + a href=(path(cx)) title=[description] target="_blank" { + (label.prepare(cx)) + } + } + }), + ItemType::Html(content) => PrepareMarkup::With(html! { + li class="html" { + (content.prepare(cx)) + } + }), + ItemType::Submenu(label, submenu) => PrepareMarkup::With(html! { + li class="menu-children" { + a href="#" title=[description] { + (label.prepare(cx)) i class="menu-icon bi-chevron-down" {} + } + div class="menu-subs" { + (submenu.prepare(cx)) + } + } + }), + ItemType::Megamenu(label, megamenu) => PrepareMarkup::With(html! { + li class="menu-children" { + a href="#" title=[description] { + (label.prepare(cx)) i class="menu-icon bi-chevron-down" {} + } + div class="menu-subs menu-mega" { + (megamenu.prepare(cx)) + } + } + }), + } + } +} + +impl Item { + pub fn label(label: L10n) -> Self { + Item { + item_type: ItemType::Label(Label::with(label)), + ..Default::default() + } + } + + pub fn link(label: L10n, path: FnContextualPath) -> Self { + Item { + item_type: ItemType::Link(Label::with(label), path), + ..Default::default() + } + } + + pub fn link_blank(label: L10n, path: FnContextualPath) -> Self { + Item { + item_type: ItemType::LinkBlank(Label::with(label), path), + ..Default::default() + } + } + + pub fn html(content: Html) -> Self { + Item { + item_type: ItemType::Html(Content::with(content)), + ..Default::default() + } + } + + pub fn submenu(label: L10n, submenu: Submenu) -> Self { + Item { + item_type: ItemType::Submenu(Label::with(label), SubmenuItems::with(submenu)), + ..Default::default() + } + } + + pub fn megamenu(label: L10n, megamenu: Megamenu) -> Self { + Item { + item_type: ItemType::Megamenu(Label::with(label), MegamenuGroups::with(megamenu)), + ..Default::default() + } + } + + // Item BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_description(&mut self, text: L10n) -> &mut Self { + self.description.set(text); + self + } + + // Item GETTERS. + + pub fn item_type(&self) -> &ItemType { + &self.item_type + } + + pub fn description(&self) -> &Description { + &self.description + } +} diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs new file mode 100644 index 00000000..946ef060 --- /dev/null +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -0,0 +1,85 @@ +use crate::prelude::*; + +use super::Group; + +new_handle!(COMPONENT_MENU_MEGAMENU); + +type Groups = TypedComponents<Group>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Megamenu { + weight : Weight, + renderable: Renderable, + id : OptionId, + groups : Groups, +} + +impl ComponentTrait for Megamenu { + fn new() -> Self { + Megamenu::default() + } + + fn handle(&self) -> Handle { + COMPONENT_MENU_MEGAMENU + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class="menu-groups" { + (self.groups().prepare(cx)) + } + }) + } +} + +impl Megamenu { + // Megamenu BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + + pub fn with_group(mut self, group: Group) -> Self { + self.groups.alter(TypedOp::Add(TypedComponent::with(group))); + self + } + + #[fn_builder] + pub fn alter_groups(&mut self, op: TypedOp<Group>) -> &mut Self { + self.groups.alter(op); + self + } + + // Megamenu GETTERS. + + pub fn groups(&self) -> &Groups { + &self.groups + } +} diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs new file mode 100644 index 00000000..19dbb5b2 --- /dev/null +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -0,0 +1,122 @@ +use crate::prelude::*; +use crate::LOCALES_PAGETOP; + +use super::Item; + +new_handle!(COMPONENT_MENU); + +actions_for_component!(Menu); + +#[rustfmt::skip] +#[derive(Default)] +pub struct Menu { + weight : Weight, + renderable: Renderable, + id : OptionId, + items : TypedComponents<Item>, +} + +impl ComponentTrait for Menu { + fn new() -> Self { + Menu::default() + } + + fn handle(&self) -> Handle { + COMPONENT_MENU + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn before_prepare_component(&mut self, cx: &mut Context) { + run_actions_before_prepare_menu(self, cx); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + cx.set_param::<bool>(PARAM_INCLUDE_MENU, true); + cx.set_param::<bool>(PARAM_INCLUDE_ICONS, true); + + PrepareMarkup::With(html! { + div id=[self.id()] class="menu-container" { + div class="menu-wrapper" { + div class="menu-main" { + div class="menu-overlay" {} + nav class="menu" { + div class="menu-header" { + button type="button" class="menu-arrow" { + i class="bi-chevron-left" {} + } + div class="menu-title" {} + button type="button" class="menu-close" { + i class="bi-x" {} + } + } + ul class="menu-section" { + (self.items().prepare(cx)) + } + } + } + button + type="button" + class="menu-trigger" + title=[L10n::t("menu_toggle", &LOCALES_PAGETOP).into_string(cx)] + { + span {} span {} span {} + } + } + } + }) + } + + fn after_prepare_component(&mut self, cx: &mut Context) { + run_actions_after_prepare_menu(self, cx); + } +} + +impl Menu { + // Menu BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + + pub fn with_item(mut self, item: Item) -> Self { + self.items.alter(TypedOp::Add(TypedComponent::with(item))); + self + } + + #[fn_builder] + pub fn alter_items(&mut self, op: TypedOp<Item>) -> &mut Self { + self.items.alter(op); + self + } + + // Menu GETTERS. + + pub fn items(&self) -> &TypedComponents<Item> { + &self.items + } +} diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs new file mode 100644 index 00000000..70de3880 --- /dev/null +++ b/pagetop/src/base/component/menu/submenu.rs @@ -0,0 +1,102 @@ +use crate::prelude::*; + +use super::Item; + +new_handle!(COMPONENT_MENU_SUBMENU); + +type TitleSubmenu = TypedComponent<L10n>; +type Items = TypedComponents<Item>; + +#[rustfmt::skip] +#[derive(Default)] +pub struct Submenu { + weight : Weight, + renderable: Renderable, + id : OptionId, + title : TitleSubmenu, + items : Items, +} + +impl ComponentTrait for Submenu { + fn new() -> Self { + Submenu::default() + } + + fn handle(&self) -> Handle { + COMPONENT_MENU_SUBMENU + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn weight(&self) -> Weight { + self.weight + } + + fn is_renderable(&self, cx: &Context) -> bool { + (self.renderable.check)(cx) + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class="menu-items" { + @if let Some(title) = self.title().get().into_string(cx) { + h4 class="menu-title" { (title) } + } + ul { + (self.items().prepare(cx)) + } + } + }) + } +} + +impl Submenu { + // Submenu BUILDER. + + #[fn_builder] + pub fn alter_weight(&mut self, value: Weight) -> &mut Self { + self.weight = value; + self + } + + #[fn_builder] + pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { + self.renderable.check = check; + self + } + + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + + #[fn_builder] + pub fn alter_title(&mut self, title: L10n) -> &mut Self { + self.title.set(title); + self + } + + pub fn with_item(mut self, item: Item) -> Self { + self.items.alter(TypedOp::Add(TypedComponent::with(item))); + self + } + + #[fn_builder] + pub fn alter_items(&mut self, op: TypedOp<Item>) -> &mut Self { + self.items.alter(op); + self + } + + // Submenu GETTERS. + + pub fn title(&self) -> &TitleSubmenu { + &self.title + } + + pub fn items(&self) -> &Items { + &self.items + } +} diff --git a/pagetop/src/locale/en-US/base.ftl b/pagetop/src/locale/en-US/base.ftl index 31b03402..07c1d040 100644 --- a/pagetop/src/locale/en-US/base.ftl +++ b/pagetop/src/locale/en-US/base.ftl @@ -4,3 +4,6 @@ site_home = Home # PoweredBy component. poweredby_pagetop = Powered by {$pagetop_link} pagetop_logo = PageTop logo + +# Menu component. +menu_toggle = Toggle menu visibility diff --git a/pagetop/src/locale/es-ES/base.ftl b/pagetop/src/locale/es-ES/base.ftl index 5f7e3c15..3e6f4eec 100644 --- a/pagetop/src/locale/es-ES/base.ftl +++ b/pagetop/src/locale/es-ES/base.ftl @@ -4,3 +4,6 @@ site_home = Inicio # PoweredBy component. poweredby_pagetop = Funciona con {$pagetop_link} pagetop_logo = Logotipo de PageTop + +# Menu component. +menu_toggle = Alternar visibilidad del menú diff --git a/pagetop/static/theme/css/menu.css b/pagetop/static/theme/css/menu.css new file mode 100644 index 00000000..94c1d3ba --- /dev/null +++ b/pagetop/static/theme/css/menu.css @@ -0,0 +1,369 @@ +.menu-container { + width: 100%; + height: auto; + margin: 0; + padding: 0; + z-index: 999; + border: none; + outline: none; + background: var(--menu--color-background); +} + +.menu-wrapper { + margin-right: var(--menu--item-gap); +} +.menu-wrapper a, +.menu-wrapper button { + cursor: pointer; + border: none; + outline: none; + background: none; + text-decoration: none; +} + +.menu-main .menu ul { + margin: 0; + padding: 0; +} +.menu-main .menu li { + display: inline-block; + margin: 0 0 0 1.5rem; + padding: var(--menu--line-padding) 0; + line-height: var(--menu--line-height); + list-style: none; + list-style-type: none; +} + +.menu-main .menu li.menu-label, +.menu-main .menu li > a { + position: relative; + font-weight: 500; + color: var(--menu--color-base); + text-rendering: optimizeLegibility; +} +.menu-main .menu li > a { + border: none; + outline: none; + -webkit-transition: color 0.3s ease-in-out; + -o-transition: color 0.3s ease-in-out; + transition: color 0.3s ease-in-out; +} +.menu-main .menu li:hover > a { + color: var(--menu--color-highlight); +} +.menu-main .menu li > a > i.menu-icon { + margin-left: 0.25rem; +} + +.menu-main .menu li .menu-subs { + position: absolute; + max-width: 100%; + height: auto; + padding: 1rem 2rem; + border: none; + outline: none; + background: var(--menu--color-background); + border-radius: var(--border-radius); + border-top: 3px solid var(--menu--color-highlight); + z-index: 500; + opacity: 0; + visibility: hidden; + -webkit-box-shadow: 0 4px 6px -1px var(--menu--color-border), 0 2px 4px -1px var(--menu--color-shadow); + box-shadow: 0 4px 6px -1px var(--menu--color-border), 0 2px 4px -1px var(--menu--color-shadow); + -webkit-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; +} + +.menu-main .menu li.menu-children:hover > .menu-subs { + margin-top: 0.4rem; + opacity: 1; + visibility: visible; +} + +.menu-main .menu li .menu-items { + min-width: var(--menu--item-width-min); + max-width: var(--menu--item-width-max); +} +.menu-main .menu li .menu-items .menu-title { + font-family: inherit; + font-size: 1rem; + font-weight: 500; + margin: 0; + padding: var(--menu--line-padding) 0; + line-height: var(--menu--line-height); + border: none; + outline: none; + color: var(--menu--color-highlight); + text-transform: uppercase; + text-rendering: optimizeLegibility; +} +.menu-main .menu li .menu-items li { + display: block; + margin-left: 0; +} + +.menu-main .menu li .menu-mega { + left: 50%; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); +} + +.menu-main .menu li .menu-groups { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; +} + +.menu-header, +.menu-trigger { + display: none; +} + +/* Applies <= 992px */ +@media only screen and (max-width: 62em) { + .menu-wrapper { + margin-left: var(--menu--item-gap); + } + .menu-trigger { + cursor: pointer; + width: var(--menu--trigger-width); + height: var(--menu--item-height); + border: none; + outline: none; + background: none; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + flex-direction: column; + justify-content: center; + } + .menu-trigger span { + width: 100%; + height: 2px; + margin: 12.675% 0; + border-radius: var(--border-radius); + background: var(--menu--color-base); + } + + .menu-main .menu { + position: fixed; + top: 0; + left: 0; + width: var(--menu--side-width); + height: 100%; + z-index: 1099; + overflow: hidden; + background: var(--menu--color-background); + -webkit-transform: translate(-100%); + -ms-transform: translate(-100%); + transform: translate(-100%); + -webkit-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; + } + .menu-main .menu.active { + -webkit-transform: translate(0%); + -ms-transform: translate(0%); + transform: translate(0%); + } + + .menu-main .menu li { + display: block; + margin: 0; + padding: 0; + } + .menu-main .menu li.menu-label, + .menu-main .menu li > a { + display: block; + padding: var(--menu--line-padding) var(--menu--item-height) var(--menu--line-padding) var(--menu--item-gap); + border-bottom: 1px solid var(--menu--color-border); + } + .menu-main .menu li ul li.menu-label, + .menu-main .menu li ul li > a { + border-bottom: 0; + } + .menu-main .menu li > a > i.menu-icon { + position: absolute; + top: var(--menu--line-padding); + right: var(--menu--line-padding); + font-size: 1.25rem; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + } + + .menu-main .menu li .menu-subs { + position: absolute; + display: none; + top: 0; + left: 0; + max-width: none; + min-width: auto; + width: 100%; + height: 100%; + margin: 0; + padding: 4rem 0 0; + border-top: 0; + opacity: 1; + overflow-y: auto; + visibility: visible; + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + -webkit-box-shadow: none; + box-shadow: none; + } + .menu-main .menu li .menu-subs.active { + display: block; + } + + .menu-main .menu li.menu-children:hover > .menu-subs { + margin-top: 0; + } + + .menu-main .menu li .menu-items .menu-title { + padding: var(--menu--line-padding) var(--menu--item-height) var(--menu--line-padding) var(--menu--item-gap); + } + + .menu-main .menu li .menu-groups { + display: block; + } + + .menu-main .menu .menu-header { + position: relative; + position: -webkit-sticky; + position: sticky; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + top: 0; + height: var(--menu--item-height); + z-index: 501; + border-bottom: 1px solid var(--menu--color-border); + } + .menu-main .menu .menu-header .menu-title { + padding: var(--menu--line-padding); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .menu-main .menu .menu-header .menu-close, + .menu-main .menu .menu-header .menu-arrow { + width: var(--menu--item-height); + min-width: var(--menu--item-height); + height: var(--menu--item-height); + line-height: var(--menu--item-height); + color: var(--menu--color-base); + cursor: pointer; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + justify-content: center; + } + .menu-main .menu .menu-header .menu-close { + font-size: 2.25rem; + border-left: 1px solid var(--menu--color-border); + } + .menu-main .menu .menu-header .menu-arrow { + font-size: 1.25rem; + border-right: 1px solid var(--menu--color-border); + display: none; + } + .menu-main .menu .menu-header.active .menu-arrow { + display: flex; + } + + .menu-main .menu .menu-section { + height: 100%; + overflow-y: auto; + overflow-x: hidden; + padding: 0; + margin: 0; + } + + .menu-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1098; + opacity: 0; + visibility: hidden; + background: rgba(0, 0, 0, 0.55); + -webkit-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; + } + .menu-overlay.active { + opacity: 1; + visibility: visible; + } +} + +/* ANIMATIONS */ + +@-webkit-keyframes slideLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} + +@keyframes slideLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} + +@-webkit-keyframes slideRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0%); + transform: translateX(0%); + } + 100% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } +} + +@keyframes slideRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0%); + transform: translateX(0%); + } + 100% { + opacity: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } +} diff --git a/pagetop/static/theme/css/root.css b/pagetop/static/theme/css/root.css index 6a651354..2d5462dd 100644 --- a/pagetop/static/theme/css/root.css +++ b/pagetop/static/theme/css/root.css @@ -117,6 +117,20 @@ --color--green: #3fa21c; --header-height-wide-when-fixed: calc(6 * var(--sp)); --mobile-nav-width: 31.25rem; - --border-radius: 0.1875rem; */ + --border-radius: 0.1875rem; + + --menu--color-background: #fafafa; + --menu--color-base: #121212; + --menu--color-highlight: #e91e63; + --menu--color-border: rgba(0, 0, 0, 0.1); + --menu--color-shadow: rgba(0, 0, 0, 0.06); + --menu--line-padding: 0.625rem; + --menu--line-height: 1.875rem; + --menu--item-height: calc(var(--menu--line-padding) + var(--menu--line-height)); + --menu--item-width-min: 14rem; + --menu--item-width-max: 20rem; + --menu--item-gap: 1rem; + --menu--trigger-width: var(--menu--item-height); + --menu--side-width: 20rem; } diff --git a/pagetop/static/theme/css/styles.css b/pagetop/static/theme/css/styles.css index a81af6ad..b3a42dc0 100644 --- a/pagetop/static/theme/css/styles.css +++ b/pagetop/static/theme/css/styles.css @@ -1,3 +1,11 @@ +/* LAYOUT */ + +.region { + position: relative; +} + +/* COMPONENTS */ + /* Image component */ .img-fluid { @@ -26,8 +34,8 @@ display: none; } } -/* LG - Applies <= 1024px */ -@media (max-width: 64em) { +/* LG - Applies <= 992px */ +@media (max-width: 62em) { .site-branding-slogan { font-size: var(--font-size-l); } diff --git a/pagetop/static/theme/js/menu.js b/pagetop/static/theme/js/menu.js new file mode 100644 index 00000000..e4258872 --- /dev/null +++ b/pagetop/static/theme/js/menu.js @@ -0,0 +1,78 @@ +function menuShowChildren(nav, children) { + let submenu = children[0].querySelector('.menu-subs'); + submenu.classList.add('active'); + submenu.style.animation = 'slideLeft 0.5s ease forwards'; + + let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; + nav.querySelector('.menu-title').innerHTML = title; + nav.querySelector('.menu-header').classList.add('active'); +} + +function menuHideChildren(nav, children) { + let submenu = children[0].querySelector('.menu-subs'); + submenu.style.animation = 'slideRight 0.5s ease forwards'; + setTimeout(() => { + submenu.classList.remove('active'); + }, 300); + + children.shift(); + if (children.length > 0) { + let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; + nav.querySelector('.menu-title').innerHTML = title; + } else { + nav.querySelector('.menu-header').classList.remove('active'); + nav.querySelector('.menu-title').innerHTML = ''; + } +} + +function menuToggle(nav, overlay) { + nav.classList.toggle('active'); + overlay.classList.toggle('active'); +} + +document.querySelectorAll('.menu-container').forEach(menu => { + + let menuChildren = []; + const menuNav = menu.querySelector('.menu'); + const menuOverlay = menu.querySelector('.menu-overlay'); + + menu.querySelector('.menu-section').addEventListener('click', (e) => { + if (!menuNav.classList.contains('active')) { + return; + } + let target = e.target.closest('.menu-children'); + if (target && target != menuChildren[0]) { + menuChildren.unshift(target); + menuShowChildren(menuNav, menuChildren); + } + }); + menu.querySelector('.menu-arrow').addEventListener('click', () => { + menuHideChildren(menuNav, menuChildren); + }); + menu.querySelector('.menu-close').addEventListener('click', () => { + menuToggle(menuNav, menuOverlay); + setTimeout(() => { + menuNav.querySelector('.menu-header').classList.remove('active'); + menuNav.querySelector('.menu-title').innerHTML = ''; + menu.querySelectorAll('.menu-subs').forEach(close => { + close.classList.remove('active'); + }); + menuChildren = []; + }, 300); + }); + menu.querySelector('.menu-trigger').addEventListener('click', () => { + menuToggle(menuNav, menuOverlay); + }); + + menuOverlay.addEventListener('click', () => { + menuToggle(menuNav, menuOverlay); + }); + + window.onresize = function () { + if (this.innerWidth >= 992) { + if (menuNav.classList.contains('active')) { + menuToggle(menuNav, menuOverlay); + } + } + }; +}); From 79557bfa27e4a87facadf499c90f1eb2424bd876 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 Oct 2023 10:30:30 +0200 Subject: [PATCH 541/853] =?UTF-8?q?=F0=9F=94=A5=20Remove=20jQuery=20as=20P?= =?UTF-8?q?ageTop=20won't=20support=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 3 -- README.md | 10 ---- pagetop-jquery/Cargo.toml | 22 -------- pagetop-jquery/README.md | 30 ----------- pagetop-jquery/build.rs | 7 --- pagetop-jquery/src/lib.rs | 61 ---------------------- pagetop-jquery/src/locale/en-US/module.ftl | 2 - pagetop-jquery/src/locale/es-ES/module.ftl | 2 - pagetop-jquery/static/jquery.min.js | 2 - pagetop-jquery/static/jquery.min.map | 1 - 10 files changed, 140 deletions(-) delete mode 100644 pagetop-jquery/Cargo.toml delete mode 100644 pagetop-jquery/README.md delete mode 100644 pagetop-jquery/build.rs delete mode 100644 pagetop-jquery/src/lib.rs delete mode 100644 pagetop-jquery/src/locale/en-US/module.ftl delete mode 100644 pagetop-jquery/src/locale/es-ES/module.ftl delete mode 100644 pagetop-jquery/static/jquery.min.js delete mode 100644 pagetop-jquery/static/jquery.min.map diff --git a/Cargo.toml b/Cargo.toml index 7d634d44..cab17095 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,7 @@ members = [ # Utilities. "pagetop-macros", "pagetop-build", - "pagetop-jquery", "pagetop-homedemo", - # Components. - "pagetop-megamenu", # Modules. "pagetop-admin", "pagetop-user", diff --git a/README.md b/README.md index e6cfc829..a963c0d3 100644 --- a/README.md +++ b/README.md @@ -42,16 +42,6 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: incluir fácilmente recursos en los archivos binarios al compilar aplicaciones creadas con **PageTop**. -## Componentes - -* **[pagetop-jquery](https://github.com/manuelcillero/pagetop/tree/main/pagetop-jquery)**, módulo - que permite añadir jQuery en las páginas que incluyen componentes o temas que usen esta librería - JavaScript para interactuar con el documento HTML.​ - -* **[pagetop-megamenu](https://github.com/manuelcillero/pagetop/tree/main/pagetop-megamenu)**, - módulo que proporciona un nuevo componente para incluir menús avanzados en las aplicaciones web - creadas con **PageTop**. - ## Módulos * **[pagetop-homedemo](https://github.com/manuelcillero/pagetop/tree/main/pagetop-homedemo)**, diff --git a/pagetop-jquery/Cargo.toml b/pagetop-jquery/Cargo.toml deleted file mode 100644 index efc59123..00000000 --- a/pagetop-jquery/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "pagetop-jquery" -version = "0.0.8" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - Module for PageTop that allows adding jQuery in pages that include components or themes that \ - use this JavaScript library to interact with the HTML document.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -pagetop = { version = "0.0", path = "../pagetop" } -static-files = "0.2.3" - -[build-dependencies] -pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-jquery/README.md b/pagetop-jquery/README.md deleted file mode 100644 index e332b6c9..00000000 --- a/pagetop-jquery/README.md +++ /dev/null @@ -1,30 +0,0 @@ -Módulo para **PageTop** que permite añadir jQuery en las páginas que incluyen componentes o temas -que usen esta librería JavaScript para interactuar con el documento HTML.​ - -Por defecto **PageTop** no requiere jQuery para el funcionamiento de sus componentes base y tema -predefinido. - -[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo -basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side -Rendering*). - - -# 🚧 Advertencia - -**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son -constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. - - -# 📜 Licencia - -Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu -elección: - -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). - -* Licencia MIT - ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). diff --git a/pagetop-jquery/build.rs b/pagetop-jquery/build.rs deleted file mode 100644 index 0acb6bed..00000000 --- a/pagetop-jquery/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -use pagetop_build::StaticFilesBundle; - -fn main() -> std::io::Result<()> { - StaticFilesBundle::from_dir("./static") - .with_name("jquery") - .build() -} diff --git a/pagetop-jquery/src/lib.rs b/pagetop-jquery/src/lib.rs deleted file mode 100644 index 7e63c5f9..00000000 --- a/pagetop-jquery/src/lib.rs +++ /dev/null @@ -1,61 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(MODULE_JQUERY); - -static_locales!(LOCALES_JQUERY); - -static_files!(jquery); - -// Library version. -const VERSION_JQUERY: &str = "3.6.0"; - -// Context parameter. -const PARAM_JQUERY: &str = "jquery.lib"; - -/// Implements [`ModuleTrait`](pagetop::core::module::ModuleTrait) and specific module API. -pub struct JQuery; - -impl ModuleTrait for JQuery { - fn handle(&self) -> Handle { - MODULE_JQUERY - } - - fn name(&self) -> L10n { - L10n::t("module_name", &LOCALES_JQUERY) - } - - fn description(&self) -> L10n { - L10n::t("module_description", &LOCALES_JQUERY) - } - - fn actions(&self) -> Vec<Action> { - actions![action::page::AfterPrepareBody::with(after_prepare_body)] - } - - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/jquery", jquery); - } -} - -impl JQuery { - pub fn enable_jquery(&self, cx: &mut Context) -> &Self { - cx.set_param::<bool>(PARAM_JQUERY, true); - self - } - - pub fn disable_jquery(&self, cx: &mut Context) -> &Self { - cx.set_param::<bool>(PARAM_JQUERY, false); - self - } -} - -fn after_prepare_body(page: &mut Page) { - if let Some(true) = page.context().get_param::<bool>(PARAM_JQUERY) { - page.context().alter(ContextOp::AddJavaScript( - JavaScript::at("/jquery/jquery.min.js") - .with_version(VERSION_JQUERY) - .with_weight(-99) - .with_mode(ModeJS::Normal), - )); - } -} diff --git a/pagetop-jquery/src/locale/en-US/module.ftl b/pagetop-jquery/src/locale/en-US/module.ftl deleted file mode 100644 index daa96fa3..00000000 --- a/pagetop-jquery/src/locale/en-US/module.ftl +++ /dev/null @@ -1,2 +0,0 @@ -module_name = jQuery support -module_description = Integrate the jQuery library into web pages generated by other modules. diff --git a/pagetop-jquery/src/locale/es-ES/module.ftl b/pagetop-jquery/src/locale/es-ES/module.ftl deleted file mode 100644 index df1c7b93..00000000 --- a/pagetop-jquery/src/locale/es-ES/module.ftl +++ /dev/null @@ -1,2 +0,0 @@ -module_name = Soporte a jQuery -module_description = Incorpora la librería jQuery en páginas web generadas por otros módulos. diff --git a/pagetop-jquery/static/jquery.min.js b/pagetop-jquery/static/jquery.min.js deleted file mode 100644 index c4c6022f..00000000 --- a/pagetop-jquery/static/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); diff --git a/pagetop-jquery/static/jquery.min.map b/pagetop-jquery/static/jquery.min.map deleted file mode 100644 index 7d86eb16..00000000 --- a/pagetop-jquery/static/jquery.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GASpC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAC1B,mBAAbD,EAAIE,MAIVC,EAAW,SAAmBH,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB8B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOtC,GAGC0C,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQxB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCyB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa/B,GAMrB,IAAIgC,IAAWhC,GAAO,WAAYA,GAAOA,EAAIgC,OAC5C3B,EAAOmB,EAAQxB,GAEhB,OAAKD,EAAYC,KAASG,EAAUH,KAIpB,UAATK,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAOhC,GArWhE0B,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOpD,EAAMG,KAAMT,OAKpB2D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGtD,EAAMG,KAAMT,MAIb4D,EAAM,EAAI5D,KAAM4D,EAAM5D,KAAKsD,QAAWtD,KAAM4D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAOhE,KAAKyD,cAAeK,GAM5C,OAHAC,EAAIE,WAAajE,KAGV+D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMlE,KAAMmE,IAG3BC,IAAK,SAAUD,GACd,OAAOnE,KAAK6D,UAAWb,EAAOoB,IAAKpE,KAAM,SAAUqE,EAAMlC,GACxD,OAAOgC,EAAS1D,KAAM4D,EAAMlC,EAAGkC,OAIjC/D,MAAO,WACN,OAAON,KAAK6D,UAAWvD,EAAMK,MAAOX,KAAMsE,aAG3CC,MAAO,WACN,OAAOvE,KAAKwE,GAAI,IAGjBC,KAAM,WACL,OAAOzE,KAAKwE,IAAK,IAGlBE,KAAM,WACL,OAAO1E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO7E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM9E,KAAKsD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO9E,KAAK6D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE9E,KAAM+E,IAAQ,KAG5DC,IAAK,WACJ,OAAOhF,KAAKiE,YAAcjE,KAAKyD,eAKhC7C,KAAMA,EACNqE,KAAM/E,EAAI+E,KACVC,OAAQhF,EAAIgF,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBpE,EAAYoE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASzF,KACTmC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAIvG,MAAOuG,IAGlBC,KAAM,aAENX,cAAe,SAAUrE,GACxB,IAAIiF,EAAOC,EAIX,SAAMlF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BiF,EAAQpG,EAAUmB,KASK,mBADvBkF,EAAOxF,EAAOP,KAAM8F,EAAO,gBAAmBA,EAAM9C,cACfvC,EAAWT,KAAM+F,KAAWrF,IAGlEsF,cAAe,SAAUnF,GACxB,IAAI+D,EAEJ,IAAMA,KAAQ/D,EACb,OAAO,EAER,OAAO,GAKRoF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU5C,EAAK6C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa/B,IAEjB,IADAgC,EAAShC,EAAIgC,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,WAIF,IAAMA,KAAKb,EACV,IAAgD,IAA3C6C,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,MAKH,OAAOb,GAIRqF,UAAW,SAAUzG,EAAK0G,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAP1G,IACCmD,EAAajD,OAAQF,IACzB8C,EAAOgB,MAAOD,EACE,iBAAR7D,EACN,CAAEA,GAAQA,GAGZU,EAAKH,KAAMsD,EAAK7D,IAIX6D,GAGR8C,QAAS,SAAUxC,EAAMnE,EAAKiC,GAC7B,OAAc,MAAPjC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKmE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQpG,KAAMkD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,GAMb,OAAO5G,EAAMwD,IAIdqD,KAAM,EAINhG,QAASA,IAGa,mBAAXiG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAapH,EAAKmH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC1F,SAAUC,EAAInC,GACbvE,EAAY,WAAauE,EAAO,KAAQA,EAAKoC,gBAmB/C,IAAIC,EAWJ,SAAY3H,GACZ,IAAIoC,EACHf,EACAuG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAxI,EACAyI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe5I,EAAOH,SACtBgJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRnH,EAAS,GAAOC,eAChBf,EAAM,GACNoJ,EAAMpJ,EAAIoJ,IACVC,EAAarJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU2I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOjL,MAAO,GAAM,MAEtC,OAAOkL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGxL,MAAO,GAAI,GAAM,KAC1BwL,EAAGE,WAAYF,EAAGxI,OAAS,GAAIvC,SAAU,IAAO,IAI3C,KAAO+K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC3L,EAAKD,MACFT,EAAMI,EAAMG,KAAMkI,EAAa6D,YACjC7D,EAAa6D,YAMdtM,EAAKyI,EAAa6D,WAAWlJ,QAAS/B,SACrC,MAAQkL,GACT7L,EAAO,CAAED,MAAOT,EAAIoD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW5I,MAAO8E,EAAQnF,EAAMG,KAAMiM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC3L,EAAW2B,EAAUA,EAAQ3B,SAAW,EAKzC,GAHAqF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAb1B,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOqF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWtD,EAEhB0I,GAAiB,CAIrB,GAAkB,KAAb/G,IAAqBuL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbvL,EAAiB,CACrB,KAAO8C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQhG,KAAMyD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQhG,KAAMyD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAlM,EAAKD,MAAOiG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAAS1L,EAAQmM,wBACzCrK,EAAQqK,uBAGR,OADA3M,EAAKD,MAAOiG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKxF,EAAQoM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAb1B,GAAqD,WAAnC2B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb3B,IACF4I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY9B,EAAQuM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAjN,EAAKD,MAAOiG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKrN,KAAMuN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK5O,EAAS0C,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIzO,EAAMwO,EAAMnH,MAAO,KACtBpF,EAAIjC,EAAIoD,OAET,MAAQnB,IACPwF,EAAKiH,WAAY1O,EAAKiC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE7H,UAAiC,IAAf8H,EAAE9H,UACnC6H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNf,EAAUsG,GAAOtG,QAAU,GAO3ByG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,GAAQA,EAAKqL,aAC5BrH,EAAUhE,IAAUA,EAAK6I,eAAiB7I,GAAOsL,gBAKlD,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOtC,GAA6B,IAAjBsC,EAAIX,UAAmBW,EAAIyN,kBAMnDtH,GADAzI,EAAWsC,GACQyN,gBACnBrH,GAAkBT,EAAOjI,GAQpB+I,GAAgB/I,IAClBiQ,EAAYjQ,EAASkQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC7K,EAAQuM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa/C,EAAS0C,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDlC,EAAQwI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BpB,EAAQkM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa/C,EAASuQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxClC,EAAQmM,uBAAyBrC,EAAQuC,KAAM7N,EAAS2N,wBAMxDnM,EAAQgP,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBnG,EAASyQ,oBAAsBzQ,EAASyQ,kBAAmBtK,GAAUzC,SAIzElC,EAAQgP,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAIpP,EAAQkM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BtP,EAAQoM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK9C,UACToP,EAAI/P,KAAMyD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAIpP,EAAQmM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELnH,EAAQoM,IAAMtC,EAAQuC,KAAM7N,EAASkO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU3H,KAAM,SAAW8I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU3H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU3H,KAAM,OAQjBgQ,EAAQhR,EAAS0C,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU3H,KAAM,MAAQ8I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU3H,KAAM,YAMX4N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU3H,KAAM,YAKjB4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,iBAGjB2N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQhR,EAAS0C,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,OAAS8I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,WAAY,aAK7ByH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU3H,KAAM,WAAY,aAK7B4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,YAIXQ,EAAQ0P,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBpN,EAAQ+P,kBAAoBnK,EAAQvG,KAAM+N,EAAI,KAI9CxH,EAAQvG,KAAM+N,EAAI,aAClBhG,EAAc5H,KAAM,KAAMiJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE7H,SAAiB6H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI/P,YAClC8P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGjI,EAAQoQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKxJ,GAAYwJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKzJ,GAAYyJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJrH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKxJ,GAAY,EACvByJ,GAAKzJ,EAAW,EAEhB6R,GAAO,EACPH,EAAM,EACNpJ,EACErH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK/I,GAGR8H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERjD,EAAQ0P,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQvG,KAAM4D,EAAMwN,GAG9B,GAAK9N,GAAO3C,EAAQ+P,mBAInB9M,EAAKzE,UAAuC,KAA3ByE,EAAKzE,SAAS2B,SAC/B,OAAOwC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMjS,EAAU,KAAM,CAAEyE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAatD,GAC5CwI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUzE,GACtCwI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMnC,EAAOP,KAAMkH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAhB,EAAQwI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAIvG,MAAO,0CAA4CuG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB/G,EAAQgR,iBACxBlK,GAAa9G,EAAQiR,YAAczL,EAAQtG,MAAO,GAClDsG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWvR,KAAMuB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJZ,EAAW8C,EAAK9C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB8C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb9C,GAA+B,IAAbA,EAC7B,OAAO8C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMxM,MAAO,EAAG,IAGxBsK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIxM,MAAO,EAAG,IAGnBwM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASrS,QAAS,IAAKqS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIxM,MAAO,EAAG2S,GAClCnG,EAAO,GAAMoG,EAAS5S,MAAO,EAAG2S,IAI1BnG,EAAMxM,MAAO,EAAG,MAIzBgQ,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,GAASC,EAAOjT,OAAQgT,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMjJ,QAASyS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOjT,MAAO,EAAGgT,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKrB,MAAO,EAAG,GAC3BqT,EAA+B,SAArBhS,EAAKrB,OAAQ,GACvBsT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,SAEL,OAAO,EAKT2S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKV,YAAoBwN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,aACHwN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWxT,eAAgBsT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM7T,EAAS8L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASxD,QAAS0B,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASpU,QAASmU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK9C,UAC7C,OAAO,KAKTkE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,KAC9C,OAAOA,GAAQA,EAAK5U,MAAO,KAAQ+D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASzE,EAAS0V,iBACrB1V,EAAS2V,UAAY3V,EAAS2V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK9C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR4S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa5O,KAAMuB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK9C,UAAkBwV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAa1W,KAAMyD,GACdkT,GACJnT,EAAIxD,KAAMuB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ3B,SAAW,CAAE2B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAKhX,KAAQsX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa7W,EAAS8L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvClT,EAAKD,MAAOiG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCxD,EAASwX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU3B,SAC1BiX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOhB,MAAO,KAAMgW,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACErW,MAAO,EAAG6B,EAAI,GACdzB,OAAQ,CAAEyG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOrW,MAAO6B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOrW,MAAOyE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASxW,KAAMiU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOxY,MAAO,GAGtCsY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMtY,MAAOwM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOnM,KAAQ+V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASzM,MAAO,IA4ZzCyH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYpY,KAAMkY,GAElBC,EAAgBnY,KAAMkY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWtD,GAAYsD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBtN,IACtCwI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWtD,EAAUkU,GAAQ,CAChDlN,EAAQhG,KAAMyD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUlU,KAAMyD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI7I,KAAMmG,IAM/B0S,EAAajC,GAAUiC,GAIxB1Y,EAAKD,MAAOiG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIxM,MAAO,IAC5BgD,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ3B,UAAkB+G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS3C,MAAOqW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA/V,EAAKD,MAAOiG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRxF,EAAQiR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E3E,EAAQgR,mBAAqBjK,EAG7BC,IAIAhH,EAAQoQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBxR,EAAS0C,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjErG,EAAQwI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK3H,GAILiD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK9C,SACtC,GAAuB,IAAlB8C,EAAK9C,SAAiB,CAC1B,GAAK0Y,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ/T,KAAMyD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE7Y,UAAkB6Y,IAAM/V,GAC9BsQ,EAAQ/T,KAAMwZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAExB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG9D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKvT,EAAYmZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU/Z,KAAM4D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUjZ,SACPyB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCxD,EAAQJ,KAAM+Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK9C,SACxByB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK9C,aAIdyB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM9E,KAAKsD,OACXmX,EAAOza,KAER,GAAyB,iBAAbiD,EACX,OAAOjD,KAAK6D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKnC,MAChC,OAAO,KAQX,IAFA+D,EAAM/D,KAAK6D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRva,KAIoB,iBAAbiD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOjD,KAQR,GAHAoV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BjD,KAAKyD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAOhE,KAAMgD,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ3B,SAAW2B,EAAQgK,eAAiBhK,EAAUtD,GACjE,IAII0a,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT7B,EAAYrB,KAAM8M,IACtB9M,KAAM8M,GAAS5J,EAAS4J,IAIxB9M,KAAK+R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO9M,KAYP,OARAqE,EAAOzE,EAASwN,eAAgBN,EAAO,OAKtC9M,KAAM,GAAMqE,EACZrE,KAAKsD,OAAS,GAERtD,KAcH,OAAKiD,EAAS1B,UACpBvB,KAAM,GAAMiD,EACZjD,KAAKsD,OAAS,EACPtD,MAIIqB,EAAY4B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUjD,QAIhCuD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQpD,GAGrB,IAAIib,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAIvN,UACpC,OAAOuN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQzF,MAC7Bob,EAAID,EAAQ7X,OAEb,OAAOtD,KAAKsQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUzI,KAAMmb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAIpb,KAAKsD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM9O,KAAMmC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAIvN,SAAW,KAAQ4Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAIvN,UACHyB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ/T,KAAMkO,GACd,MAMJ,OAAO9O,KAAK6D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJxD,EAAQJ,KAAMuC,EAAQqB,GAAQrE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBqE,EAAKb,OAASa,EAAM,GAAMA,GAZjBrE,KAAM,IAAOA,KAAM,GAAI4C,WAAe5C,KAAKuE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOlD,KAAK6D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAOhE,KAAK2D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOjD,KAAKwb,IAAiB,MAAZvY,EAChBjD,KAAKiE,WAAajE,KAAKiE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO5S,SAAkB4S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT5b,EAAUkE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKpE,KAAMmD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK/E,OAAQ,KACjB2C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd3U,KAAKsD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHjc,KAAK6D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS9F,EAAcsb,EAASxV,EAAMyV,SAC1CD,EAAOlc,KAAM0G,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS9F,EAAcsb,EAASxV,EAAM2V,MACjDH,EAAOlc,KAAM0G,EAAOqV,EAASC,GAQ7BD,EAAQ7b,WAAOmF,EAAW,CAAEqB,GAAQ7G,MAAOoc,IAM3C,MAAQvV,GAITsV,EAAO9b,WAAOmF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc7c,MAAOyc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM3c,KAAMwc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B7F,EAAY6F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK5I,KAAMsG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKzd,MAIR4d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIxd,MAKR+U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDxJ,MAMR6d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTpd,MAERoM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVpd,MAERsd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQlU,MAAQkU,EAAKlU,QAAUkU,GAC9C+I,EAAM3c,KAAM4T,GACN2I,GACLM,KAGKzd,MAIRyd,KAAM,WAEL,OADAhD,EAAKsD,SAAU/d,KAAMsE,WACdtE,MAIRqd,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BtE,MAERse,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK9B,EAAYmd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGxC,MAAOX,KAAMsE,WAChCqa,GAAYtd,EAAYsd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtB1e,KACAmD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOpf,KACVwU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQhO,MAAOye,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLzb,EAAYyb,GAGXqC,EACJrC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY2d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAYyd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY0d,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUtb,GAClB,OAAc,MAAPA,EAAc0B,EAAOmC,OAAQ7D,EAAKsb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAU1e,OAASqe,OAAWvY,EAAY9F,KAAMsE,WAChEtE,MAMRqe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKxd,KAAM4d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB9f,EAAMG,KAAM6D,WAG5B+b,EAAUrd,EAAOgb,WAGjBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMnC,KACvBogB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAahD,EAAMG,KAAM6D,WAAc6C,IAC5D+Y,GACTG,EAAQb,YAAaW,EAAiBC,KAM1C,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAQxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAQ5D,QACxEyD,GAGuB,YAApBG,EAAQlC,SACZ9c,EAAY+e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAQvD,OAKjB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAQ5D,QAG1D,OAAO4D,EAAQzD,aAOjB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9EtF,EAAO0gB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCrG,EAAO+f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRlhB,EAASmhB,oBAAqB,mBAAoBD,GAClD/gB,EAAOghB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBpG,MAGRgD,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa5f,EAAU,CAAEoD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBld,EAASshB,YACa,YAAxBthB,EAASshB,aAA6BthB,EAAS+P,gBAAgBwR,SAGjEphB,EAAO+f,WAAY9c,EAAO4X,QAK1Bhb,EAASoQ,iBAAkB,mBAAoB8Q,GAG/C/gB,EAAOiQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAENhgB,EAAY8F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAG1C,KAAMqD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK/gB,KAAMuC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EAChBpa,EACAA,EAAM1G,KAAMqD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAMhD,OAAKkT,EACGvd,EAIH0d,EACGre,EAAG1C,KAAMqD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM5gB,UAAqC,IAAnB4gB,EAAM5gB,YAAsB4gB,EAAM5gB,UAMlE,SAAS6gB,IACRpiB,KAAK+F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOniB,KAAK+F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,SAAYoB,EAMxB/G,OAAOkiB,eAAgBH,EAAOniB,KAAK+F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQlO,KAAKkO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNnO,KAAKkO,MAAOiU,GAGZA,EAAOniB,KAAK+F,UAAaoc,EAAOniB,KAAK+F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElCnH,KAAK2D,IAAKwe,EAAOhU,IASzBnO,KAAKwiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOniB,KAAK+F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,cAAYD,SAEjBqc,EAAOniB,KAAK+F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOniB,KAAK+F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK9C,SAI/B,GAHA8D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOrE,KAAM,GACb0O,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKnO,KAAKsD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK9C,WAAmBqhB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRxE,QAAS,WAClBwE,EAAO2c,EAAW3c,EAAK/E,MAAO,IAC9B0iB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJnO,KAAKkE,KAAM,WACjB2e,EAASL,IAAKxiB,KAAMmO,KAIfiT,EAAQphB,KAAM,SAAUmH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDziB,KAAKkE,KAAM,WAGV2e,EAASL,IAAKxiB,KAAMmO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOnO,KAAKkE,KAAM,WACjB2e,EAASjF,OAAQ5d,KAAMmO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM3c,KAAM6hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAG1C,KAAM4D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOvd,KAAM,GAAK2B,QAGjBmE,IAAT2c,EACNziB,KACAA,KAAKkE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOvd,KAAM2B,EAAM8gB,GAGtCzf,EAAOygB,YAAazjB,KAAM2B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAAStjB,KAAM2B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO3B,KAAKkE,KAAM,WACjBlB,EAAOsgB,QAAStjB,KAAM2B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO3B,KAAKud,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAML,GACxB,IAAIqP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW9R,KACXmC,EAAInC,KAAKsD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXL,EAAMK,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAAStb,MAGxB,IAAIyiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB/P,EAAS+P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK9C,WAClByB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUtlB,MAAM,IAExB0lB,KAAM,WACL,OAAOJ,GAAUtlB,OAElB2lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQne,KAAKulB,OAASvlB,KAAK0lB,OAG5B1lB,KAAKkE,KAAM,WACZogB,GAAoBtkB,MACxBgD,EAAQhD,MAAOulB,OAEfviB,EAAQhD,MAAO0lB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADchmB,EAASomB,yBACRrjB,YAAa/C,EAAS0C,cAAe,SACpDsO,GAAQhR,EAAS0C,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBxP,EAAQ6kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBzP,EAAQ+kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBzP,EAAQglB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfrlB,EAAQglB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK9C,SAAW,CAAE8C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM/mB,KAAMsC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ3mB,KAAMyD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQzmB,KAAMyD,GAMlB,OAAOqjB,EAIR,IAAII,GAAiB,sBAErB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY5jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOzE,EAAS0V,cACf,MAAQ4S,KATQC,KAAqC,UAATxmB,GAY/C,SAASymB,GAAI/jB,EAAMgkB,EAAOplB,EAAUwf,EAAMtf,EAAImlB,GAC7C,IAAIC,EAAQ5mB,EAGZ,GAAsB,iBAAV0mB,EAAqB,CAShC,IAAM1mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEuiB,EACbD,GAAI/jB,EAAM1C,EAAMsB,EAAUwf,EAAM4F,EAAO1mB,GAAQ2mB,GAEhD,OAAOjkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK6kB,QACC,IAAM7kB,EACZ,OAAOkB,EAeR,OAZa,IAARikB,IACJC,EAASplB,GACTA,EAAK,SAAUqlB,GAId,OADAxlB,IAASylB,IAAKD,GACPD,EAAO5nB,MAAOX,KAAMsE,aAIzB8C,KAAOmhB,EAAOnhB,OAAUmhB,EAAOnhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAOwlB,MAAMhN,IAAKxb,KAAMqoB,EAAOllB,EAAIsf,EAAMxf,KA+a3C,SAASylB,GAAgBla,EAAI7M,EAAMsmB,GAG5BA,GAQNrF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU6Z,GAClB,IAAIG,EAAUpV,EACbqV,EAAQhG,EAASjf,IAAK3D,KAAM2B,GAE7B,GAAyB,EAAlB6mB,EAAMK,WAAmB7oB,KAAM2B,IAKrC,GAAMinB,EAAMtlB,QAuCEN,EAAOwlB,MAAMrJ,QAASxd,IAAU,IAAKmnB,cAClDN,EAAMO,uBArBN,GAdAH,EAAQtoB,EAAMG,KAAM6D,WACpBse,EAASJ,IAAKxiB,KAAM2B,EAAMinB,GAK1BD,EAAWV,EAAYjoB,KAAM2B,GAC7B3B,KAAM2B,KAEDinB,KADLrV,EAASqP,EAASjf,IAAK3D,KAAM2B,KACJgnB,EACxB/F,EAASJ,IAAKxiB,KAAM2B,GAAM,GAE1B4R,EAAS,GAELqV,IAAUrV,EAWd,OARAiV,EAAMQ,2BACNR,EAAMS,iBAOC1V,GAAUA,EAAOpM,WAefyhB,EAAMtlB,SAGjBsf,EAASJ,IAAKxiB,KAAM2B,EAAM,CACzBwF,MAAOnE,EAAOwlB,MAAMU,QAInBlmB,EAAOmC,OAAQyjB,EAAO,GAAK5lB,EAAOmmB,MAAM5lB,WACxCqlB,EAAMtoB,MAAO,GACbN,QAKFwoB,EAAMQ,qCA/E0BljB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAMomB,IA5a/B/kB,EAAOwlB,MAAQ,CAEdhpB,OAAQ,GAERgc,IAAK,SAAUnX,EAAMgkB,EAAO1Z,EAAS8T,EAAMxf,GAE1C,IAAImmB,EAAaC,EAAa1Y,EAC7B2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADAya,EAAcza,GACQA,QACtB1L,EAAWmmB,EAAYnmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfkiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASlpB,OAAOypB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUrd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAOwlB,MAAMuB,YAActd,EAAE9K,KACpEqB,EAAOwlB,MAAMwB,SAASrpB,MAAO0D,EAAMC,gBAAcwB,IAMpDyjB,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAEP5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,EAGjEwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1C6nB,EAAYxmB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNgoB,SAAUA,EACVlH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWia,EAAW7b,KAAM,MAC1Bub,IAGKK,EAAWH,EAAQ3nB,OAC1B8nB,EAAWH,EAAQ3nB,GAAS,IACnBuoB,cAAgB,EAGnB/K,EAAQgL,QACiD,IAA9DhL,EAAQgL,MAAM1pB,KAAM4D,EAAMoe,EAAMiH,EAAYL,IAEvChlB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM0nB,IAK3BlK,EAAQ3D,MACZ2D,EAAQ3D,IAAI/a,KAAM4D,EAAMmlB,GAElBA,EAAU7a,QAAQvH,OACvBoiB,EAAU7a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJwmB,EAASvkB,OAAQukB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS7oB,KAAM4oB,GAIhBxmB,EAAOwlB,MAAMhpB,OAAQmC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMgkB,EAAO1Z,EAAS1L,EAAUmnB,GAEjD,IAAIrlB,EAAGslB,EAAW1Z,EACjB2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMulB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAMP,GAJA5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAE1C8nB,EAAWH,EADX3nB,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAG9Dwc,EAAYtlB,EAAI0kB,EAASnmB,OACzB,MAAQyB,IACPykB,EAAYC,EAAU1kB,IAEfqlB,GAAeT,IAAaH,EAAUG,UACzChb,GAAWA,EAAQvH,OAASoiB,EAAUpiB,MACtCuJ,IAAOA,EAAIlD,KAAM+b,EAAU/Z,YAC3BxM,GAAYA,IAAaumB,EAAUvmB,WACxB,OAAbA,IAAqBumB,EAAUvmB,YAChCwmB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAUvmB,UACdwmB,EAASS,gBAEL/K,EAAQvB,QACZuB,EAAQvB,OAAOnd,KAAM4D,EAAMmlB,IAOzBa,IAAcZ,EAASnmB,SACrB6b,EAAQmL,WACkD,IAA/DnL,EAAQmL,SAAS7pB,KAAM4D,EAAMqlB,EAAYE,EAASE,SAElD9mB,EAAOunB,YAAalmB,EAAM1C,EAAMioB,EAASE,eAGnCR,EAAQ3nB,SA1Cf,IAAMA,KAAQ2nB,EACbtmB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,EAAO0mB,EAAOkB,GAAK5a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe6iB,IAC1B1G,EAAShF,OAAQvZ,EAAM,mBAIzB2lB,SAAU,SAAUQ,GAEnB,IAAIroB,EAAG4C,EAAGhB,EAAK4Q,EAAS6U,EAAWiB,EAClCjW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BklB,EAAQxlB,EAAOwlB,MAAMkC,IAAKF,GAE1Bf,GACC7G,EAASjf,IAAK3D,KAAM,WAAcI,OAAOypB,OAAQ,OAC/CrB,EAAM7mB,OAAU,GACnBwd,EAAUnc,EAAOwlB,MAAMrJ,QAASqJ,EAAM7mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMgU,EAENrmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAqmB,EAAMmC,eAAiB3qB,MAGlBmf,EAAQyL,cAA2D,IAA5CzL,EAAQyL,YAAYnqB,KAAMT,KAAMwoB,GAA5D,CAKAiC,EAAeznB,EAAOwlB,MAAMiB,SAAShpB,KAAMT,KAAMwoB,EAAOiB,GAGxDtnB,EAAI,EACJ,OAAUwS,EAAU8V,EAActoB,QAAYqmB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBnW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAUykB,EAAY7U,EAAQ8U,SAAU1kB,QACtCyjB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAU/Z,YACnC+Y,EAAMwC,WAAWvd,KAAM+b,EAAU/Z,aAEjC+Y,EAAMgB,UAAYA,EAClBhB,EAAM/F,KAAO+G,EAAU/G,UAKV3c,KAHb/B,IAAUf,EAAOwlB,MAAMrJ,QAASqK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU7a,SAAUhO,MAAOgU,EAAQtQ,KAAMmQ,MAGT,KAAzBgU,EAAMjV,OAASxP,KACrBykB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK5J,EAAQ8L,cACZ9L,EAAQ8L,aAAaxqB,KAAMT,KAAMwoB,GAG3BA,EAAMjV,SAGdkW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAItnB,EAAGqnB,EAAWvX,EAAKiZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBpb,EAAM0Z,EAAM/iB,OAGb,GAAKykB,GAIJpb,EAAIvN,YAOc,UAAfinB,EAAM7mB,MAAoC,GAAhB6mB,EAAMxS,QAEnC,KAAQlH,IAAQ9O,KAAM8O,EAAMA,EAAIlM,YAAc5C,KAI7C,GAAsB,IAAjB8O,EAAIvN,WAAoC,UAAfinB,EAAM7mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFA8e,EAAkB,GAClBC,EAAmB,GACbhpB,EAAI,EAAGA,EAAI+nB,EAAe/nB,SAME2D,IAA5BqlB,EAFLlZ,GAHAuX,EAAYC,EAAUtnB,IAGNc,SAAW,OAG1BkoB,EAAkBlZ,GAAQuX,EAAU1e,cACC,EAApC9H,EAAQiP,EAAKjS,MAAOsb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKjS,KAAM,KAAM,CAAE8O,IAAQxL,QAErC6nB,EAAkBlZ,IACtBiZ,EAAgBtqB,KAAM4oB,GAGnB0B,EAAgB5nB,QACpBmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUyB,IAY9C,OALApc,EAAM9O,KACDkqB,EAAgBT,EAASnmB,QAC7BmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUA,EAASnpB,MAAO4pB,KAGpDO,GAGRW,QAAS,SAAU/lB,EAAMgmB,GACxBjrB,OAAOkiB,eAAgBtf,EAAOmmB,MAAM5lB,UAAW8B,EAAM,CACpDimB,YAAY,EACZ/I,cAAc,EAEd5e,IAAKtC,EAAYgqB,GAChB,WACC,GAAKrrB,KAAKurB,cACT,OAAOF,EAAMrrB,KAAKurB,gBAGpB,WACC,GAAKvrB,KAAKurB,cACT,OAAOvrB,KAAKurB,cAAelmB,IAI9Bmd,IAAK,SAAUrb,GACd/G,OAAOkiB,eAAgBtiB,KAAMqF,EAAM,CAClCimB,YAAY,EACZ/I,cAAc,EACdiJ,UAAU,EACVrkB,MAAOA,QAMXujB,IAAK,SAAUa,GACd,OAAOA,EAAevoB,EAAO+C,SAC5BwlB,EACA,IAAIvoB,EAAOmmB,MAAOoC,IAGpBpM,QAAS,CACRsM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU1H,GAIhB,IAAIjU,EAAKxO,MAAQyiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAG1Bka,GAAgBla,EAAI,QAASuZ,KAIvB,GAERmB,QAAS,SAAUzG,GAIlB,IAAIjU,EAAKxO,MAAQyiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAE1Bka,GAAgBla,EAAI,UAId,GAKRkY,SAAU,SAAU8B,GACnB,IAAI/iB,EAAS+iB,EAAM/iB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOkmB,OAAStf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBmmB,aAAc,CACbX,aAAc,SAAUzC,QAID1iB,IAAjB0iB,EAAMjV,QAAwBiV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMjV,YAoG7CvQ,EAAOunB,YAAc,SAAUlmB,EAAM1C,EAAMmoB,GAGrCzlB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMmoB,IAIlC9mB,EAAOmmB,MAAQ,SAAUvnB,EAAKkqB,GAG7B,KAAQ9rB,gBAAgBgD,EAAOmmB,OAC9B,OAAO,IAAInmB,EAAOmmB,MAAOvnB,EAAKkqB,GAI1BlqB,GAAOA,EAAID,MACf3B,KAAKurB,cAAgB3pB,EACrB5B,KAAK2B,KAAOC,EAAID,KAIhB3B,KAAK+rB,mBAAqBnqB,EAAIoqB,uBACHlmB,IAAzBlE,EAAIoqB,mBAGgB,IAApBpqB,EAAIiqB,YACL9D,GACAC,GAKDhoB,KAAKyF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOlE,SACxCK,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELzF,KAAK8qB,cAAgBlpB,EAAIkpB,cACzB9qB,KAAKisB,cAAgBrqB,EAAIqqB,eAIzBjsB,KAAK2B,KAAOC,EAIRkqB,GACJ9oB,EAAOmC,OAAQnF,KAAM8rB,GAItB9rB,KAAKksB,UAAYtqB,GAAOA,EAAIsqB,WAAaxjB,KAAKyjB,MAG9CnsB,KAAMgD,EAAO+C,UAAY,GAK1B/C,EAAOmmB,MAAM5lB,UAAY,CACxBE,YAAaT,EAAOmmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAIxc,EAAIzM,KAAKurB,cAEbvrB,KAAK+rB,mBAAqBhE,GAErBtb,IAAMzM,KAAKosB,aACf3f,EAAEwc,kBAGJF,gBAAiB,WAChB,IAAItc,EAAIzM,KAAKurB,cAEbvrB,KAAK6qB,qBAAuB9C,GAEvBtb,IAAMzM,KAAKosB,aACf3f,EAAEsc,mBAGJC,yBAA0B,WACzB,IAAIvc,EAAIzM,KAAKurB,cAEbvrB,KAAK+qB,8BAAgChD,GAEhCtb,IAAMzM,KAAKosB,aACf3f,EAAEuc,2BAGHhpB,KAAK+oB,oBAKP/lB,EAAOkB,KAAM,CACZmoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRjrB,MAAM,EACNkrB,UAAU,EACV/e,KAAK,EACLgf,SAAS,EACTnX,QAAQ,EACRoX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EACTC,OAAO,GACLhrB,EAAOwlB,MAAM4C,SAEhBpoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUtsB,EAAMmnB,GACpE9lB,EAAOwlB,MAAMrJ,QAASxd,GAAS,CAG9BwoB,MAAO,WAQN,OAHAzB,GAAgB1oB,KAAM2B,EAAMsmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB1oB,KAAM2B,IAGf,GAKR+kB,SAAU,WACT,OAAO,GAGRoC,aAAcA,KAYhB9lB,EAAOkB,KAAM,CACZgqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB1nB,EAAOwlB,MAAMrJ,QAASmP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAIzkB,EAEHwqB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTvuB,MAMgCgD,EAAOyF,SANvCzI,KAMyDuuB,MAClE/F,EAAM7mB,KAAO6nB,EAAUG,SACvB5lB,EAAMylB,EAAU7a,QAAQhO,MAAOX,KAAMsE,WACrCkkB,EAAM7mB,KAAO+oB,GAEP3mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBijB,GAAI,SAAUC,EAAOplB,EAAUwf,EAAMtf,GACpC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,IAEzCmlB,IAAK,SAAUD,EAAOplB,EAAUwf,EAAMtf,GACrC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,EAAI,IAE7CslB,IAAK,SAAUJ,EAAOplB,EAAUE,GAC/B,IAAIqmB,EAAW7nB,EACf,GAAK0mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClBxmB,EAAQqlB,EAAMsC,gBAAiBlC,IAC9Be,EAAU/Z,UACT+Z,EAAUG,SAAW,IAAMH,EAAU/Z,UACrC+Z,EAAUG,SACXH,EAAUvmB,SACVumB,EAAU7a,SAEJ3O,KAER,GAAsB,iBAAVqoB,EAAqB,CAGhC,IAAM1mB,KAAQ0mB,EACbroB,KAAKyoB,IAAK9mB,EAAMsB,EAAUolB,EAAO1mB,IAElC,OAAO3B,KAWR,OATkB,IAAbiD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK6kB,IAEChoB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAM5K,OAAQ5d,KAAMqoB,EAAOllB,EAAIF,QAMzC,IAKCurB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBtqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQza,SAAkBya,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASuqB,GAAevqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAASwqB,GAAexqB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKrB,MAAO,EAAG,GAClC+D,EAAK1C,KAAO0C,EAAK1C,KAAKrB,MAAO,GAE7B+D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAASyqB,GAAgBltB,EAAKmtB,GAC7B,IAAI5sB,EAAGiZ,EAAGzZ,EAAgBqtB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKxtB,SAAV,CAKA,GAAKqhB,EAASD,QAAS/gB,KAEtB0nB,EADW1G,EAASjf,IAAK/B,GACP0nB,QAKjB,IAAM3nB,KAFNihB,EAAShF,OAAQmR,EAAM,iBAETzF,EACb,IAAMnnB,EAAI,EAAGiZ,EAAIkO,EAAQ3nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAOwlB,MAAMhN,IAAKuT,EAAMptB,EAAM2nB,EAAQ3nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBotB,EAAWnM,EAASzB,OAAQxf,GAC5BqtB,EAAWjsB,EAAOmC,OAAQ,GAAI6pB,GAE9BnM,EAASL,IAAKuM,EAAME,KAkBtB,SAASC,GAAUC,EAAY3a,EAAMrQ,EAAUojB,GAG9C/S,EAAOjU,EAAMiU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAAS+H,EAAYntB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAI+T,EAAW7rB,OACf+rB,EAAWjU,EAAI,EACfjU,EAAQqN,EAAM,GACd8a,EAAkBjuB,EAAY8F,GAG/B,GAAKmoB,GACG,EAAJlU,GAA0B,iBAAVjU,IAChB/F,EAAQ6kB,YAAcwI,GAAShhB,KAAMtG,GACxC,OAAOgoB,EAAWjrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO0U,EAAW3qB,GAAI8W,GACrBgU,IACJ9a,EAAM,GAAMrN,EAAM1G,KAAMT,KAAMsb,EAAOb,EAAK8U,SAE3CL,GAAUzU,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM2a,EAAY,GAAIjiB,eAAe,EAAOiiB,EAAY5H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA6H,GADA/H,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYkH,KAC/BtrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMktB,IACVptB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BmtB,GAIJpsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAAS1D,KAAM0uB,EAAYhtB,GAAKF,EAAME,GAGvC,GAAKitB,EAOJ,IANAltB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAASwH,IAGf1sB,EAAI,EAAGA,EAAIitB,EAAYjtB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAOwsB,WAAavtB,EAAKH,UAC7BkB,EAAOwsB,SAAUvtB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAASwoB,GAAc,IAAMzsB,EAAMC,IAQnE,OAAOitB,EAGR,SAASvR,GAAQvZ,EAAMpB,EAAUwsB,GAKhC,IAJA,IAAIxtB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCstB,GAA8B,IAAlBxtB,EAAKV,UACtByB,EAAO0sB,UAAW/I,GAAQ1kB,IAGtBA,EAAKW,aACJ6sB,GAAYtL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU2H,GACxB,OAAOA,GAGR/pB,MAAO,SAAUnB,EAAMsrB,EAAeC,GACrC,IAAIztB,EAAGiZ,EAAGyU,EAAaC,EApINluB,EAAKmtB,EACnB1iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB6J,EAAS5L,GAAY9f,GAGtB,KAAMjD,EAAQ+kB,gBAAsC,IAAlB9hB,EAAK9C,UAAoC,KAAlB8C,EAAK9C,UAC3DyB,EAAO8W,SAAUzV,IAMnB,IAHAyrB,EAAenJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFbyU,EAAclJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLiuB,EAAa1tB,GAjJH4sB,EAiJQe,EAAc3tB,QAhJzCkK,EAGc,WAHdA,EAAW0iB,EAAK1iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDotB,EAAKpZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC0iB,EAAKnV,aAAehY,EAAIgY,cA6IxB,GAAK+V,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQtiB,GACrCyrB,EAAeA,GAAgBnJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAIyU,EAAYvsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C2sB,GAAgBe,EAAa1tB,GAAK2tB,EAAc3tB,SAGjD2sB,GAAgBzqB,EAAMmB,GAWxB,OAL2B,GAD3BsqB,EAAenJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAekJ,GAAeC,GAAUpJ,GAAQtiB,EAAM,WAIhDmB,GAGRkqB,UAAW,SAAU5rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAOwlB,MAAMrJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK6G,OACT,IAAM3nB,KAAQ8gB,EAAK6G,OACbnK,EAASxd,GACbqB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,GAI3BqB,EAAOunB,YAAalmB,EAAM1C,EAAM8gB,EAAKqH,QAOxCzlB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB6qB,OAAQ,SAAU/sB,GACjB,OAAO2a,GAAQ5d,KAAMiD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ5d,KAAMiD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMvC,MACbA,KAAK8V,QAAQ5R,KAAM,WACK,IAAlBlE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKsS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B2sB,OAAQ,WACP,OAAOf,GAAUlvB,KAAMsE,UAAW,SAAUD,GACpB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CotB,GAAoB3uB,KAAMqE,GAChC1B,YAAa0B,MAKvB6rB,QAAS,WACR,OAAOhB,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIkE,EAASkpB,GAAoB3uB,KAAMqE,GACvCoB,EAAO0qB,aAAc9rB,EAAMoB,EAAO8M,gBAKrC6d,OAAQ,WACP,OAAOlB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,SAKvCqwB,MAAO,WACN,OAAOnB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,KAAKiP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOrE,KAAMmC,IAAeA,IACd,IAAlBkC,EAAK9C,WAGTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOtS,MAGRwF,MAAO,SAAUmqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD5vB,KAAKoE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOxF,KAAM2vB,EAAeC,MAI5CL,KAAM,SAAUpoB,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,IAAI9C,EAAOrE,KAAM,IAAO,GACvBmC,EAAI,EACJiZ,EAAIpb,KAAKsD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK9C,SAChC,OAAO8C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBqnB,GAAa/gB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOrE,KAAMmC,IAAO,IAGVZ,WACTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJrE,KAAK8V,QAAQma,OAAQ9oB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BgtB,YAAa,WACZ,IAAI/I,EAAU,GAGd,OAAO2H,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,IAAI8P,EAASnU,KAAK4C,WAEbI,EAAO6D,QAAS7G,KAAMunB,GAAY,IACtCvkB,EAAO0sB,UAAW/I,GAAQ3mB,OACrBmU,GACJA,EAAOoc,aAAclsB,EAAMrE,QAK3BunB,MAILvkB,EAAOkB,KAAM,CACZssB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUtrB,EAAMurB,GAClB5tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACN8sB,EAAS7tB,EAAQC,GACjBwB,EAAOosB,EAAOvtB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOzE,KAAOA,KAAKwF,OAAO,GACxCxC,EAAQ6tB,EAAQ1uB,IAAOyuB,GAAY9sB,GAInClD,EAAKD,MAAOoD,EAAKD,EAAMH,OAGxB,OAAO3D,KAAK6D,UAAWE,MAGzB,IAAI+sB,GAAY,IAAI/mB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDgN,GAAY,SAAU1sB,GAKxB,IAAI2oB,EAAO3oB,EAAK6I,cAAc4C,YAM9B,OAJMkd,GAASA,EAAKgE,SACnBhE,EAAOjtB,GAGDitB,EAAKiE,iBAAkB5sB,IAG5B6sB,GAAO,SAAU7sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACR8rB,EAAM,GAGP,IAAM9rB,KAAQD,EACb+rB,EAAK9rB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAAS1D,KAAM4D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAAS8rB,EAAK9rB,GAG3B,OAAOtB,GAIJqtB,GAAY,IAAIrnB,OAAQma,GAAUrW,KAAM,KAAO,KAiJnD,SAASwjB,GAAQhtB,EAAMgB,EAAMisB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU1tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCA+M,EAAWA,GAAYP,GAAW1sB,MAQpB,MAFbN,EAAMutB,EAASI,iBAAkBrsB,IAAUisB,EAAUjsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBjE,EAAQuwB,kBAAoBb,GAAUrjB,KAAM1J,IAASqtB,GAAU3jB,KAAMpI,KAG1EksB,EAAQhN,EAAMgN,MACdC,EAAWjN,EAAMiN,SACjBC,EAAWlN,EAAMkN,SAGjBlN,EAAMiN,SAAWjN,EAAMkN,SAAWlN,EAAMgN,MAAQxtB,EAChDA,EAAMutB,EAASC,MAGfhN,EAAMgN,MAAQA,EACdhN,EAAMiN,SAAWA,EACjBjN,EAAMkN,SAAWA,SAIJ3rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS6tB,GAAcC,EAAaC,GAGnC,MAAO,CACNnuB,IAAK,WACJ,IAAKkuB,IASL,OAAS7xB,KAAK2D,IAAMmuB,GAASnxB,MAAOX,KAAMsE,kBALlCtE,KAAK2D,OA3MhB,WAIC,SAASouB,IAGR,GAAMnM,EAAN,CAIAoM,EAAUzN,MAAM0N,QAAU,+EAE1BrM,EAAIrB,MAAM0N,QACT,4HAGDtiB,GAAgBhN,YAAaqvB,GAAYrvB,YAAaijB,GAEtD,IAAIsM,EAAWnyB,EAAOkxB,iBAAkBrL,GACxCuM,EAAoC,OAAjBD,EAASniB,IAG5BqiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD1M,EAAIrB,MAAMgO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD3L,EAAIrB,MAAMmO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoBzM,EAAIgN,YAAc,GAEzDjjB,GAAgB9M,YAAamvB,GAI7BpM,EAAM,MAGP,SAASyM,EAAoBQ,GAC5B,OAAO7sB,KAAK8sB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYpyB,EAAS0C,cAAe,OACpCsjB,EAAMhmB,EAAS0C,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM0O,eAAiB,cAC3BrN,EAAIM,WAAW,GAAO3B,MAAM0O,eAAiB,GAC7C7xB,EAAQ8xB,gBAA+C,gBAA7BtN,EAAIrB,MAAM0O,eAEpCjwB,EAAOmC,OAAQ/D,EAAS,CACvB+xB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAYRY,qBAAsB,WACrB,IAAIC,EAAOhN,EAAIiN,EAASC,EAmCxB,OAlCgC,MAA3BV,IACJQ,EAAQ5zB,EAAS0C,cAAe,SAChCkkB,EAAK5mB,EAAS0C,cAAe,MAC7BmxB,EAAU7zB,EAAS0C,cAAe,OAElCkxB,EAAMjP,MAAM0N,QAAU,2DACtBzL,EAAGjC,MAAM0N,QAAU,mBAKnBzL,EAAGjC,MAAMoP,OAAS,MAClBF,EAAQlP,MAAMoP,OAAS,MAQvBF,EAAQlP,MAAMC,QAAU,QAExB7U,GACEhN,YAAa6wB,GACb7wB,YAAa6jB,GACb7jB,YAAa8wB,GAEfC,EAAU3zB,EAAOkxB,iBAAkBzK,GACnCwM,EAA4BY,SAAUF,EAAQC,OAAQ,IACrDC,SAAUF,EAAQG,eAAgB,IAClCD,SAAUF,EAAQI,kBAAmB,MAAWtN,EAAGuN,aAEpDpkB,GAAgB9M,YAAa2wB,IAEvBR,MAvIV,GAsNA,IAAIgB,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAar0B,EAAS0C,cAAe,OAAQiiB,MAC7C2P,GAAc,GAkBf,SAASC,GAAe9uB,GACvB,IAAI+uB,EAAQpxB,EAAOqxB,SAAUhvB,IAAU6uB,GAAa7uB,GAEpD,OAAK+uB,IAGA/uB,KAAQ4uB,GACL5uB,EAED6uB,GAAa7uB,GAxBrB,SAAyBA,GAGxB,IAAIivB,EAAUjvB,EAAM,GAAI0c,cAAgB1c,EAAK/E,MAAO,GACnD6B,EAAI6xB,GAAY1wB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO2uB,GAAa7xB,GAAMmyB,KACbL,GACZ,OAAO5uB,EAeoBkvB,CAAgBlvB,IAAUA,GAIxD,IAKCmvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAEhC,SAAU,WAAYiC,WAAY,SAAUnQ,QAAS,SACjEoQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBnwB,EAAOuC,EAAO6tB,GAIzC,IAAIhuB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKivB,IAAK,EAAGjuB,EAAS,IAAQguB,GAAY,KAAUhuB,EAAS,IAAO,MACpEG,EAGF,SAAS+tB,GAAoB7wB,EAAM8wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAIpzB,EAAkB,UAAdgzB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQlzB,EAAI,EAAGA,GAAK,EAGN,WAARizB,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM+wB,EAAMlR,GAAW/hB,IAAK,EAAMmzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,IAIjD,WAARF,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,MAtBvEG,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,GAGhD,YAARF,EACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,GAItEE,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASzvB,KAAKivB,IAAK,EAAGjvB,KAAK0vB,KAC1BrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEi1B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBtxB,EAAM8wB,EAAWK,GAG3C,IAAIF,EAASvE,GAAW1sB,GAKvBgxB,IADmBj0B,EAAQ+xB,qBAAuBqC,IAEE,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCM,EAAmBP,EAEnBjzB,EAAMivB,GAAQhtB,EAAM8wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,GAIzE,GAAKwwB,GAAUrjB,KAAMrL,GAAQ,CAC5B,IAAMozB,EACL,OAAOpzB,EAERA,EAAM,OAyCP,QAlCQhB,EAAQ+xB,qBAAuBkC,IAMrCj0B,EAAQmyB,wBAA0BlnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC2wB,WAAY3wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOixB,KAG1DjxB,EAAKyxB,iBAAiBxyB,SAEtB+xB,EAAiE,eAAnDryB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,IAKpDM,EAAmBC,KAAcxxB,KAEhCjC,EAAMiC,EAAMwxB,MAKdzzB,EAAM2wB,WAAY3wB,IAAS,GAI1B8yB,GACC7wB,EACA8wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAlzB,GAEE,KA+SL,SAAS2zB,GAAO1xB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GACzC,OAAO,IAAID,GAAMxyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GA7S5DhzB,EAAOmC,OAAQ,CAId8wB,SAAU,CACTC,QAAS,CACRvyB,IAAK,SAAUU,EAAMitB,GACpB,GAAKA,EAAW,CAGf,IAAIvtB,EAAMstB,GAAQhtB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACVgR,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV9P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOquB,GAGnC,GAAMnxB,GAA0B,IAAlBA,EAAK9C,UAAoC,IAAlB8C,EAAK9C,UAAmB8C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd6T,EAAWrV,EAAW3c,GACtBiyB,EAAe7C,GAAYhnB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM+S,IACLjyB,EAAO8uB,GAAekD,IAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,QAGrCvxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOmxB,IAEzBzxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB21B,IAC1BnwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWkS,GAAa,GAAK,OAI7Dj2B,EAAQ8xB,iBAA6B,KAAV/rB,GAAiD,IAAjC9B,EAAKxE,QAAS,gBAC9D0jB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOquB,MAE7B8B,EACJ/S,EAAMgT,YAAalyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMmwB,EAAOF,GACjC,IAAIlzB,EAAKwB,EAAK4f,EACb6T,EAAWrV,EAAW3c,GA6BvB,OA5BgBovB,GAAYhnB,KAAMpI,KAMjCA,EAAO8uB,GAAekD,KAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,KAGtC,QAAS7T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMmxB,SAIjB1vB,IAAR1D,IACJA,EAAMivB,GAAQhtB,EAAMgB,EAAMiwB,IAId,WAARlzB,GAAoBiD,KAAQuvB,KAChCxyB,EAAMwyB,GAAoBvvB,IAIZ,KAAVmwB,GAAgBA,GACpB5xB,EAAMmvB,WAAY3wB,IACD,IAAVozB,GAAkBgC,SAAU5zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI2tB,GACjDnyB,EAAOizB,SAAUd,GAAc,CAC9BxxB,IAAK,SAAUU,EAAMitB,EAAUkE,GAC9B,GAAKlE,EAIJ,OAAOkD,GAAa/mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKyxB,iBAAiBxyB,QAAWe,EAAKozB,wBAAwBlG,MAIjEoE,GAAkBtxB,EAAM8wB,EAAWK,GAHnCtE,GAAM7sB,EAAMqwB,GAAS,WACpB,OAAOiB,GAAkBtxB,EAAM8wB,EAAWK,MAM9ChT,IAAK,SAAUne,EAAM8C,EAAOquB,GAC3B,IAAIxuB,EACHsuB,EAASvE,GAAW1sB,GAIpBqzB,GAAsBt2B,EAAQkyB,iBACT,aAApBgC,EAAO5C,SAIR2C,GADkBqC,GAAsBlC,IAEY,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCN,EAAWQ,EACVN,GACC7wB,EACA8wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAYhvB,KAAK0vB,KAChBrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEyyB,WAAYuC,EAAQH,IACpBD,GAAoB7wB,EAAM8wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAchuB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO4Q,GAAchuB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM8wB,IAGpBJ,GAAmB1wB,EAAM8C,EAAO6tB,OAK1ChyB,EAAOizB,SAAS3D,WAAaV,GAAcxwB,EAAQiyB,mBAClD,SAAUhvB,EAAMitB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQhtB,EAAM,gBAClCA,EAAKozB,wBAAwBE,KAC5BzG,GAAM7sB,EAAM,CAAEiuB,WAAY,GAAK,WAC9B,OAAOjuB,EAAKozB,wBAAwBE,QAEnC,OAMP30B,EAAOkB,KAAM,CACZ0zB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBh1B,EAAOizB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU9wB,GAOjB,IANA,IAAIhF,EAAI,EACP+1B,EAAW,GAGXC,EAAyB,iBAAVhxB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd+1B,EAAUH,EAAS7T,GAAW/hB,GAAM61B,GACnCG,EAAOh2B,IAAOg2B,EAAOh2B,EAAI,IAAOg2B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ/0B,EAAOizB,SAAU8B,EAASC,GAASxV,IAAMuS,MAI3C/xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQphB,KAAM,SAAUqE,EAAMgB,EAAM8B,GAC1C,IAAImuB,EAAQxwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAiwB,EAASvE,GAAW1sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOmzB,GAGxD,OAAOlxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO+yB,MAAQA,IAETxyB,UAAY,CACjBE,YAAasyB,GACb3yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,EAAQ9Q,GACjDllB,KAAKqE,KAAOA,EACZrE,KAAK0iB,KAAOA,EACZ1iB,KAAKg2B,OAASA,GAAUhzB,EAAOgzB,OAAOtP,SACtC1mB,KAAKoF,QAAUA,EACfpF,KAAKkU,MAAQlU,KAAKmsB,IAAMnsB,KAAK8O,MAC7B9O,KAAKgF,IAAMA,EACXhF,KAAKklB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK3D,MACX+1B,GAAMqC,UAAU1R,SAAS/iB,IAAK3D,OAEhCq4B,IAAK,SAAUC,GACd,IAAIC,EACH/U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAoB/B,OAlBK1iB,KAAKoF,QAAQozB,SACjBx4B,KAAKy4B,IAAMF,EAAQv1B,EAAOgzB,OAAQh2B,KAAKg2B,QACtCsC,EAASt4B,KAAKoF,QAAQozB,SAAWF,EAAS,EAAG,EAAGt4B,KAAKoF,QAAQozB,UAG9Dx4B,KAAKy4B,IAAMF,EAAQD,EAEpBt4B,KAAKmsB,KAAQnsB,KAAKgF,IAAMhF,KAAKkU,OAAUqkB,EAAQv4B,KAAKkU,MAE/ClU,KAAKoF,QAAQszB,MACjB14B,KAAKoF,QAAQszB,KAAKj4B,KAAMT,KAAKqE,KAAMrE,KAAKmsB,IAAKnsB,MAGzCwjB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKxiB,MAEX+1B,GAAMqC,UAAU1R,SAASlE,IAAKxiB,MAExBA,QAIOoD,KAAKG,UAAYwyB,GAAMxyB,WAEvCwyB,GAAMqC,UAAY,CACjB1R,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK9C,UACa,MAA5BqjB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAC1B1f,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK9C,WACtByB,EAAOizB,SAAUrR,EAAMlC,OAC6B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO4P,GAAevP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,IAFjCnpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMuH,IAAMvH,EAAMM,UAU5C0T,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDrW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK9C,UAAYqjB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,OAKpCnpB,EAAOgzB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM/yB,KAAKizB,IAAKF,EAAI/yB,KAAKkzB,IAAO,GAExCxS,SAAU,SAGX1jB,EAAO21B,GAAK5C,GAAMxyB,UAAUH,KAG5BJ,EAAO21B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAmrBHxoB,GAEHyoB,GAprBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBx5B,EAAS65B,QAAoB15B,EAAO25B,sBACxC35B,EAAO25B,sBAAuBF,IAE9Bz5B,EAAO+f,WAAY0Z,GAAUx2B,EAAO21B,GAAGgB,UAGxC32B,EAAO21B,GAAGiB,QAKZ,SAASC,KAIR,OAHA95B,EAAO+f,WAAY,WAClBqZ,QAAQrzB,IAEAqzB,GAAQzwB,KAAKyjB,MAIvB,SAAS2N,GAAOn4B,EAAMo4B,GACrB,IAAI/L,EACH7rB,EAAI,EACJuM,EAAQ,CAAEilB,OAAQhyB,GAKnB,IADAo4B,EAAeA,EAAe,EAAI,EAC1B53B,EAAI,EAAGA,GAAK,EAAI43B,EAEvBrrB,EAAO,UADPsf,EAAQ9J,GAAW/hB,KACSuM,EAAO,UAAYsf,GAAUrsB,EAO1D,OAJKo4B,IACJrrB,EAAMwnB,QAAUxnB,EAAM6iB,MAAQ5vB,GAGxB+M,EAGR,SAASsrB,GAAa7yB,EAAOub,EAAMuX,GAKlC,IAJA,IAAIrV,EACHuK,GAAe+K,GAAUC,SAAUzX,IAAU,IAAKhiB,OAAQw5B,GAAUC,SAAU,MAC9E7e,EAAQ,EACRhY,EAAS6rB,EAAW7rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQuK,EAAY7T,GAAQ7a,KAAMw5B,EAAWvX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASsV,GAAW71B,EAAM+1B,EAAYh1B,GACrC,IAAImO,EACH8mB,EACA/e,EAAQ,EACRhY,EAAS42B,GAAUI,WAAWh3B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bwb,EAAKv1B,OAEbu1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B3Z,EAAYla,KAAKivB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHpY,EAAY+Z,EAAUzB,UAAY,GAEzCld,EAAQ,EACRhY,EAAS22B,EAAUQ,OAAOn3B,OAEnBgY,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAKC,GAMhC,OAHAja,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW3B,EAASpY,IAG5CoY,EAAU,GAAKh1B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAI5C5b,EAASmB,YAAanb,EAAM,CAAE41B,KACvB,IAERA,EAAY5b,EAASzB,QAAS,CAC7BvY,KAAMA,EACNynB,MAAO9oB,EAAOmC,OAAQ,GAAIi1B,GAC1BM,KAAM13B,EAAOmC,QAAQ,EAAM,CAC1Bw1B,cAAe,GACf3E,OAAQhzB,EAAOgzB,OAAOtP,UACpBthB,GACHw1B,mBAAoBR,EACpBS,gBAAiBz1B,EACjBo1B,UAAWrB,IAASU,KACpBrB,SAAUpzB,EAAQozB,SAClBiC,OAAQ,GACRT,YAAa,SAAUtX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO+yB,MAAO1xB,EAAM41B,EAAUS,KAAMhY,EAAM1d,EACrDi1B,EAAUS,KAAKC,cAAejY,IAAUuX,EAAUS,KAAK1E,QAExD,OADAiE,EAAUQ,OAAO75B,KAAMgkB,GAChBA,GAERlB,KAAM,SAAUoX,GACf,IAAIxf,EAAQ,EAIXhY,EAASw3B,EAAUb,EAAUQ,OAAOn3B,OAAS,EAC9C,GAAK+2B,EACJ,OAAOr6B,KAGR,IADAq6B,GAAU,EACF/e,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAK,GAUhC,OANKyC,GACJzc,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAC3C5b,EAASmB,YAAanb,EAAM,CAAE41B,EAAWa,KAEzCzc,EAASuB,WAAYvb,EAAM,CAAE41B,EAAWa,IAElC96B,QAGT8rB,EAAQmO,EAAUnO,MAInB,KA/HD,SAAqBA,EAAO6O,GAC3B,IAAIrf,EAAOjW,EAAM2wB,EAAQ7uB,EAAOqc,EAGhC,IAAMlI,KAASwQ,EAed,GAbAkK,EAAS2E,EADTt1B,EAAO2c,EAAW1G,IAElBnU,EAAQ2kB,EAAOxQ,GACV1V,MAAMC,QAASsB,KACnB6uB,EAAS7uB,EAAO,GAChBA,EAAQ2kB,EAAOxQ,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACdymB,EAAOzmB,GAAS8B,SACT2kB,EAAOxQ,KAGfkI,EAAQxgB,EAAOizB,SAAU5wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMyU,OAAQ9wB,UACf2kB,EAAOzmB,GAIC8B,EACNmU,KAASwQ,IAChBA,EAAOxQ,GAAUnU,EAAOmU,GACxBqf,EAAerf,GAAU0a,QAI3B2E,EAAet1B,GAAS2wB,EA6F1B+E,CAAYjP,EAAOmO,EAAUS,KAAKC,eAE1Brf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS2mB,GAAUI,WAAYhf,GAAQ7a,KAAMw5B,EAAW51B,EAAMynB,EAAOmO,EAAUS,MAM9E,OAJKr5B,EAAYkS,EAAOmQ,QACvB1gB,EAAOygB,YAAawW,EAAU51B,KAAM41B,EAAUS,KAAKnd,OAAQmG,KAC1DnQ,EAAOmQ,KAAKsX,KAAMznB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK0nB,EAAOkO,GAAaC,GAE3B54B,EAAY44B,EAAUS,KAAKxmB,QAC/B+lB,EAAUS,KAAKxmB,MAAMzT,KAAM4D,EAAM41B,GAIlCA,EACErb,SAAUqb,EAAUS,KAAK9b,UACzB/V,KAAMoxB,EAAUS,KAAK7xB,KAAMoxB,EAAUS,KAAKO,UAC1Cpe,KAAMod,EAAUS,KAAK7d,MACrBuB,OAAQ6b,EAAUS,KAAKtc,QAEzBpb,EAAO21B,GAAGuC,MACTl4B,EAAOmC,OAAQy0B,EAAM,CACpBv1B,KAAMA,EACN82B,KAAMlB,EACN1c,MAAO0c,EAAUS,KAAKnd,SAIjB0c,EAGRj3B,EAAOk3B,UAAYl3B,EAAOmC,OAAQ+0B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAU1Y,EAAMvb,GACtB,IAAIyd,EAAQ5kB,KAAKg6B,YAAatX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITyW,QAAS,SAAUvP,EAAO3nB,GACpB9C,EAAYyqB,IAChB3nB,EAAW2nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMhf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAASwoB,EAAMxoB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOoJ,EAAOxQ,GACd4e,GAAUC,SAAUzX,GAASwX,GAAUC,SAAUzX,IAAU,GAC3DwX,GAAUC,SAAUzX,GAAO9Q,QAASzN,IAItCm2B,WAAY,CA3Wb,SAA2Bj2B,EAAMynB,EAAO4O,GACvC,IAAIhY,EAAMvb,EAAOwe,EAAQnC,EAAO8X,EAASC,EAAWC,EAAgBhX,EACnEiX,EAAQ,UAAW3P,GAAS,WAAYA,EACxCqP,EAAOn7B,KACPsuB,EAAO,GACP/J,EAAQlgB,EAAKkgB,MACbkV,EAASp1B,EAAK9C,UAAY+iB,GAAoBjgB,GAC9Cq3B,EAAW9Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BAgY,EAAKnd,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBs3B,WACVnY,EAAMmY,SAAW,EACjBL,EAAU9X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMmY,UACXL,MAIH9X,EAAMmY,WAENR,EAAK/c,OAAQ,WAGZ+c,EAAK/c,OAAQ,WACZoF,EAAMmY,WACA34B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFqO,EAEb,GADA3kB,EAAQ2kB,EAAOpJ,GACV4W,GAAS7rB,KAAMtG,GAAU,CAG7B,UAFO2kB,EAAOpJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYsyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVtyB,IAAoBu0B,QAAiC51B,IAArB41B,EAAUhZ,GAK9C,SAJA+W,GAAS,EAOXnL,EAAM5L,GAASgZ,GAAYA,EAAUhZ,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA6Y,GAAav4B,EAAOyD,cAAeqlB,MAChB9oB,EAAOyD,cAAe6nB,GA8DzC,IAAM5L,KAzDD+Y,GAA2B,IAAlBp3B,EAAK9C,WAMlBm5B,EAAKkB,SAAW,CAAErX,EAAMqX,SAAUrX,EAAMsX,UAAWtX,EAAMuX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASlX,WAErCgX,EAAiB5Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBm3B,EACJhX,EAAUgX,GAIVlW,GAAU,CAAEjhB,IAAQ,GACpBm3B,EAAiBn3B,EAAKkgB,MAAMC,SAAWgX,EACvChX,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlBgX,IACrB,SAAhCx4B,EAAOyhB,IAAKpgB,EAAM,WAGhBk3B,IACLJ,EAAKtyB,KAAM,WACV0b,EAAMC,QAAUgX,IAEM,MAAlBA,IACJhX,EAAUD,EAAMC,QAChBgX,EAA6B,SAAZhX,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdkW,EAAKkB,WACTrX,EAAMqX,SAAW,SACjBT,EAAK/c,OAAQ,WACZmG,EAAMqX,SAAWlB,EAAKkB,SAAU,GAChCrX,EAAMsX,UAAYnB,EAAKkB,SAAU,GACjCrX,EAAMuX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACEjN,EAGPiN,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW9Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAASgX,IAInD7V,IACJ+V,EAASjC,QAAUA,GAIfA,GACJnU,GAAU,CAAEjhB,IAAQ,GAKrB82B,EAAKtyB,KAAM,WASV,IAAM6Z,KAJA+W,GACLnU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTiqB,EACbtrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM4L,EAAM5L,OAMnC6Y,EAAYvB,GAAaP,EAASiC,EAAUhZ,GAAS,EAAGA,EAAMyY,GACtDzY,KAAQgZ,IACfA,EAAUhZ,GAAS6Y,EAAUrnB,MACxBulB,IACJ8B,EAAUv2B,IAAMu2B,EAAUrnB,MAC1BqnB,EAAUrnB,MAAQ,MAuMrB6nB,UAAW,SAAU53B,EAAU+rB,GACzBA,EACJgK,GAAUI,WAAW1oB,QAASzN,GAE9B+1B,GAAUI,WAAW15B,KAAMuD,MAK9BnB,EAAOg5B,MAAQ,SAAUA,EAAOhG,EAAQ7yB,GACvC,IAAIk2B,EAAM2C,GAA0B,iBAAVA,EAAqBh5B,EAAOmC,OAAQ,GAAI62B,GAAU,CAC3Ef,SAAU93B,IAAOA,GAAM6yB,GACtB30B,EAAY26B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ7yB,GAAM6yB,GAAUA,IAAW30B,EAAY20B,IAAYA,GAoC5D,OAhCKhzB,EAAO21B,GAAGlQ,IACd4Q,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYx1B,EAAO21B,GAAGsD,OAC9B5C,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAOvV,UAMjB,MAAb2S,EAAI9b,QAA+B,IAAd8b,EAAI9b,QAC7B8b,EAAI9b,MAAQ,MAIb8b,EAAIlI,IAAMkI,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT55B,EAAYg4B,EAAIlI,MACpBkI,EAAIlI,IAAI1wB,KAAMT,MAGVq5B,EAAI9b,OACRva,EAAOsgB,QAAStjB,KAAMq5B,EAAI9b,QAIrB8b,GAGRr2B,EAAOG,GAAGgC,OAAQ,CACjB+2B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ7xB,GAGpC,OAAOnE,KAAKsQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMo3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ7xB,IAElDi4B,QAAS,SAAU1Z,EAAMsZ,EAAOhG,EAAQ7xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC2Z,EAASr5B,EAAOg5B,MAAOA,EAAOhG,EAAQ7xB,GACtCm4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWl6B,KAAMgD,EAAOmC,OAAQ,GAAIud,GAAQ2Z,IAGlDvmB,GAAS8M,EAASjf,IAAK3D,KAAM,YACjCm7B,EAAKzX,MAAM,IAMd,OAFA4Y,EAAYC,OAASD,EAEdxmB,IAA0B,IAAjBumB,EAAO9e,MACtBvd,KAAKkE,KAAMo4B,GACXt8B,KAAKud,MAAO8e,EAAO9e,MAAO+e,IAE5B5Y,KAAM,SAAU/hB,EAAMiiB,EAAYkX,GACjC,IAAI0B,EAAY,SAAUhZ,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMoX,IAYP,MATqB,iBAATn5B,IACXm5B,EAAUlX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ5jB,KAAKud,MAAO5b,GAAQ,KAAM,IAGpB3B,KAAKkE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B86B,EAASz5B,EAAOy5B,OAChBha,EAAOG,EAASjf,IAAK3D,MAEtB,GAAKsb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC8Y,EAAW/Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ6V,GAAK9rB,KAAM6N,IACtDkhB,EAAW/Z,EAAMnH,IAKpB,IAAMA,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MACnB,MAAR2B,GAAgB86B,EAAQnhB,GAAQiC,QAAU5b,IAE5C86B,EAAQnhB,GAAQ6f,KAAKzX,KAAMoX,GAC3BxX,GAAU,EACVmZ,EAAOv3B,OAAQoW,EAAO,KAOnBgI,GAAYwX,GAChB93B,EAAOsgB,QAAStjB,KAAM2B,MAIzB46B,OAAQ,SAAU56B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET3B,KAAKkE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK3D,MACrBud,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB86B,EAASz5B,EAAOy5B,OAChBn5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK8Z,QAAS,EAGdv5B,EAAOua,MAAOvd,KAAM2B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKjjB,KAAMT,MAAM,GAIlBsb,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MAAQy8B,EAAQnhB,GAAQiC,QAAU5b,IAC/D86B,EAAQnhB,GAAQ6f,KAAKzX,MAAM,GAC3B+Y,EAAOv3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQihB,QACrChf,EAAOjC,GAAQihB,OAAO97B,KAAMT,aAKvByiB,EAAK8Z,YAKfv5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIq3B,EAAQ15B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAgB,MAAT63B,GAAkC,kBAAVA,EAC9BU,EAAM/7B,MAAOX,KAAMsE,WACnBtE,KAAKo8B,QAAStC,GAAOz0B,GAAM,GAAQ22B,EAAOhG,EAAQ7xB,MAKrDnB,EAAOkB,KAAM,CACZy4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU7wB,EAAMymB,GAClB9oB,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAOnE,KAAKo8B,QAAStQ,EAAOkQ,EAAOhG,EAAQ7xB,MAI7CnB,EAAOy5B,OAAS,GAChBz5B,EAAO21B,GAAGiB,KAAO,WAChB,IAAIsB,EACH/4B,EAAI,EACJs6B,EAASz5B,EAAOy5B,OAIjB,IAFAtD,GAAQzwB,KAAKyjB,MAELhqB,EAAIs6B,EAAOn5B,OAAQnB,KAC1B+4B,EAAQuB,EAAQt6B,OAGCs6B,EAAQt6B,KAAQ+4B,GAChCuB,EAAOv3B,OAAQ/C,IAAK,GAIhBs6B,EAAOn5B,QACZN,EAAO21B,GAAGjV,OAEXyV,QAAQrzB,GAGT9C,EAAO21B,GAAGuC,MAAQ,SAAUA,GAC3Bl4B,EAAOy5B,OAAO77B,KAAMs6B,GACpBl4B,EAAO21B,GAAGzkB,SAGXlR,EAAO21B,GAAGgB,SAAW,GACrB32B,EAAO21B,GAAGzkB,MAAQ,WACZklB,KAILA,IAAa,EACbI,OAGDx2B,EAAO21B,GAAGjV,KAAO,WAChB0V,GAAa,MAGdp2B,EAAO21B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNxW,SAAU,KAMX1jB,EAAOG,GAAGg6B,MAAQ,SAAUC,EAAMz7B,GAIjC,OAHAy7B,EAAOp6B,EAAO21B,IAAK31B,EAAO21B,GAAGsD,OAAQmB,IAAiBA,EACtDz7B,EAAOA,GAAQ,KAER3B,KAAKud,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI6Z,EAAUt9B,EAAO+f,WAAYvT,EAAM6wB,GACvC5Z,EAAME,KAAO,WACZ3jB,EAAOu9B,aAAcD,OAOnBzsB,GAAQhR,EAAS0C,cAAe,SAEnC+2B,GADSz5B,EAAS0C,cAAe,UACpBK,YAAa/C,EAAS0C,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbP,EAAQm8B,QAA0B,KAAhB3sB,GAAMzJ,MAIxB/F,EAAQo8B,YAAcnE,GAAIzjB,UAI1BhF,GAAQhR,EAAS0C,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbP,EAAQq8B,WAA6B,MAAhB7sB,GAAMzJ,MAI5B,IAAIu2B,GACH9uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dq6B,WAAY,SAAUt4B,GACrB,OAAOrF,KAAKkE,KAAM,WACjBlB,EAAO26B,WAAY39B,KAAMqF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBv5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVy2B,GAAgB56B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO66B,UAAWx4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASq4B,QAAW53B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO26B,WAAYt5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC85B,UAAW,CACVl8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM/F,EAAQq8B,YAAwB,UAAVt2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXw2B,WAAY,SAAUt5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ27B,EAAY32B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK4hB,GAA+B,IAAlBz5B,EAAK9C,SACtB,MAAU8D,EAAOy4B,EAAW37B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bq4B,GAAW,CACVlb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO26B,WAAYt5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAI04B,EAASnvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAK+lB,EACRkU,EAAgB34B,EAAKoC,cAYtB,OAVMI,IAGLiiB,EAASlb,GAAYovB,GACrBpvB,GAAYovB,GAAkBj6B,EAC9BA,EAAqC,MAA/Bg6B,EAAQ15B,EAAMgB,EAAMwC,GACzBm2B,EACA,KACDpvB,GAAYovB,GAAkBlU,GAExB/lB,KAOT,IAAIk6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkBh3B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASuwB,GAAU/5B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS67B,GAAgBl3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dg7B,WAAY,SAAUj5B,GACrB,OAAOrF,KAAKkE,KAAM,kBACVlE,KAAMgD,EAAOu7B,QAASl5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB56B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOu7B,QAASl5B,IAAUA,EACjCme,EAAQxgB,EAAOo1B,UAAW/yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd+yB,UAAW,CACV3iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIm6B,EAAWx7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKm6B,EACG5K,SAAU4K,EAAU,IAI3BP,GAAWxwB,KAAMpJ,EAAKgI,WACtB6xB,GAAWzwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX+oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLt9B,EAAQo8B,cACbx6B,EAAOo1B,UAAUxiB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOu7B,QAASv+B,KAAKyH,eAAkBzH,OA4BxCgD,EAAOG,GAAGgC,OAAQ,CACjBw5B,SAAU,SAAUx3B,GACnB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAO2+B,SAAUx3B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAM1D,IAFA4+B,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAItB,GAHA08B,EAAWT,GAAU/5B,GACrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KACrB+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAAQ,IACvChwB,GAAOgwB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRg/B,YAAa,SAAU73B,GACtB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAOg/B,YAAa73B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAI7D,IAAMsE,UAAUhB,OACf,OAAOtD,KAAK+R,KAAM,QAAS,IAK5B,IAFA6sB,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAMtB,GALA08B,EAAWT,GAAU/5B,GAGrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KAG1B,OAA4C,EAApC+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAClChwB,EAAMA,EAAI5I,QAAS,IAAM44B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRi/B,YAAa,SAAU93B,EAAO+3B,GAC7B,IAAIv9B,SAAcwF,EACjBg4B,EAAwB,WAATx9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb+3B,GAA0BC,EAC9BD,EAAWl/B,KAAK2+B,SAAUx3B,GAAUnH,KAAKg/B,YAAa73B,GAGzD9F,EAAY8F,GACTnH,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOi/B,YACd93B,EAAM1G,KAAMT,KAAMmC,EAAGi8B,GAAUp+B,MAAQk/B,GACvCA,KAKIl/B,KAAKkE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM2kB,EAExB,GAAKD,EAAe,CAGnBh9B,EAAI,EACJsY,EAAOzX,EAAQhD,MACfo/B,EAAaf,GAAgBl3B,GAE7B,MAAU+I,EAAYkvB,EAAYj9B,KAG5BsY,EAAK4kB,SAAUnvB,GACnBuK,EAAKukB,YAAa9uB,GAElBuK,EAAKkkB,SAAUzuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYkuB,GAAUp+B,QAIrB4iB,EAASJ,IAAKxiB,KAAM,gBAAiBkQ,GAOjClQ,KAAKyC,cACTzC,KAAKyC,aAAc,QAClByN,IAAuB,IAAV/I,EACZ,GACAyb,EAASjf,IAAK3D,KAAM,kBAAqB,QAO/Cq/B,SAAU,SAAUp8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOrE,KAAMmC,KACtB,GAAuB,IAAlBkC,EAAK9C,WACoE,GAA3E,IAAM48B,GAAkBC,GAAU/5B,IAAW,KAAMxD,QAASqP,GAC9D,OAAO,EAIT,OAAO,KAOT,IAAIovB,GAAU,MAEdt8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKurB,EACfjrB,EAAOrE,KAAM,GAEd,OAAMsE,UAAUhB,QA0BhBgsB,EAAkBjuB,EAAY8F,GAEvBnH,KAAKkE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBpC,KAAKuB,WAWE,OANXa,EADIktB,EACEnoB,EAAM1G,KAAMT,KAAMmC,EAAGa,EAAQhD,MAAOoC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOu8B,SAAUv/B,KAAK2B,OAAUqB,EAAOu8B,SAAUv/B,KAAKqM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKxiB,KAAMoC,EAAK,WAC3DpC,KAAKmH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOu8B,SAAUl7B,EAAK1C,OAC7BqB,EAAOu8B,SAAUl7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASo5B,GAAS,IAIhB,MAAPv7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdo6B,SAAU,CACTnZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA+7B,GAAkBn7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACbyS,EAAoB,eAAdjkB,EAAK1C,KACX6jB,EAAS8C,EAAM,KAAO,GACtB2M,EAAM3M,EAAMhN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR2Z,EAGA3M,EAAMhN,EAAQ,EAIXnZ,EAAI8yB,EAAK9yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBkmB,EACJ,OAAOnhB,EAIRqe,EAAO5kB,KAAMuG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIq4B,EAAWpZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOu8B,SAASnZ,OAAOziB,IAAKyiB,GAAUZ,MAEtDga,GAAY,GAUd,OAHMA,IACLn7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOu8B,SAAUv/B,MAAS,CACzBwiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D/F,EAAQm8B,UACbv6B,EAAOu8B,SAAUv/B,MAAO2D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D/F,EAAQq+B,QAAU,cAAe1/B,EAGjC,IAAI2/B,GAAc,kCACjBC,GAA0B,SAAUlzB,GACnCA,EAAEsc,mBAGJ/lB,EAAOmC,OAAQnC,EAAOwlB,MAAO,CAE5BU,QAAS,SAAUV,EAAO/F,EAAMpe,EAAMu7B,GAErC,IAAIz9B,EAAG2M,EAAK6B,EAAKkvB,EAAYC,EAAQhW,EAAQ3K,EAAS4gB,EACrDC,EAAY,CAAE37B,GAAQzE,GACtB+B,EAAOX,EAAOP,KAAM+nB,EAAO,QAAWA,EAAM7mB,KAAO6mB,EACnDkB,EAAa1oB,EAAOP,KAAM+nB,EAAO,aAAgBA,EAAM/Y,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMixB,EAAcpvB,EAAMtM,EAAOA,GAAQzE,EAGlB,IAAlByE,EAAK9C,UAAoC,IAAlB8C,EAAK9C,WAK5Bm+B,GAAYjyB,KAAM9L,EAAOqB,EAAOwlB,MAAMuB,cAIf,EAAvBpoB,EAAKd,QAAS,OAIlBc,GADA+nB,EAAa/nB,EAAK4F,MAAO,MACP8G,QAClBqb,EAAWzkB,QAEZ66B,EAASn+B,EAAKd,QAAS,KAAQ,GAAK,KAAOc,GAG3C6mB,EAAQA,EAAOxlB,EAAO+C,SACrByiB,EACA,IAAIxlB,EAAOmmB,MAAOxnB,EAAuB,iBAAV6mB,GAAsBA,IAGhDK,UAAY+W,EAAe,EAAI,EACrCpX,EAAM/Y,UAAYia,EAAW7b,KAAM,KACnC2a,EAAMwC,WAAaxC,EAAM/Y,UACxB,IAAI1F,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAC7D,KAGD2a,EAAMjV,YAASzN,EACT0iB,EAAM/iB,SACX+iB,EAAM/iB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAE+F,GACFxlB,EAAO2D,UAAW8b,EAAM,CAAE+F,IAG3BrJ,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GACpCi+B,IAAgBzgB,EAAQ+J,UAAmD,IAAxC/J,EAAQ+J,QAAQvoB,MAAO0D,EAAMoe,IAAtE,CAMA,IAAMmd,IAAiBzgB,EAAQuM,WAAajqB,EAAU4C,GAAS,CAM9D,IAJAw7B,EAAa1gB,EAAQ2J,cAAgBnnB,EAC/B+9B,GAAYjyB,KAAMoyB,EAAal+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBo9B,EAAUp/B,KAAMkO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBtN,IACpCogC,EAAUp/B,KAAM+P,EAAIb,aAAea,EAAIsvB,cAAgBlgC,GAKzDoC,EAAI,EACJ,OAAU2M,EAAMkxB,EAAW79B,QAAYqmB,EAAMqC,uBAC5CkV,EAAcjxB,EACd0Z,EAAM7mB,KAAW,EAAJQ,EACZ09B,EACA1gB,EAAQ8K,UAAYtoB,GAGrBmoB,GAAWlH,EAASjf,IAAKmL,EAAK,WAAc1O,OAAOypB,OAAQ,OAAUrB,EAAM7mB,OAC1EihB,EAASjf,IAAKmL,EAAK,YAEnBgb,EAAOnpB,MAAOmO,EAAK2T,IAIpBqH,EAASgW,GAAUhxB,EAAKgxB,KACThW,EAAOnpB,OAASuhB,EAAYpT,KAC1C0Z,EAAMjV,OAASuW,EAAOnpB,MAAOmO,EAAK2T,IACZ,IAAjB+F,EAAMjV,QACViV,EAAMS,kBA8CT,OA1CAT,EAAM7mB,KAAOA,EAGPi+B,GAAiBpX,EAAMuD,sBAEpB5M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS/lB,MAAOq/B,EAAU12B,MAAOmZ,KACzCP,EAAY7d,IAIPy7B,GAAUz+B,EAAYgD,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMy7B,MAGXz7B,EAAMy7B,GAAW,MAIlB98B,EAAOwlB,MAAMuB,UAAYpoB,EAEpB6mB,EAAMqC,wBACVkV,EAAY/vB,iBAAkBrO,EAAMg+B,IAGrCt7B,EAAM1C,KAED6mB,EAAMqC,wBACVkV,EAAYhf,oBAAqBpf,EAAMg+B,IAGxC38B,EAAOwlB,MAAMuB,eAAYjkB,EAEpB6K,IACJtM,EAAMy7B,GAAWnvB,IAMd6X,EAAMjV,SAKd2sB,SAAU,SAAUv+B,EAAM0C,EAAMmkB,GAC/B,IAAI/b,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOmmB,MACXX,EACA,CACC7mB,KAAMA,EACNyqB,aAAa,IAIfppB,EAAOwlB,MAAMU,QAASzc,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjB+jB,QAAS,SAAUvnB,EAAM8gB,GACxB,OAAOziB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMziB,SAGpCmgC,eAAgB,SAAUx+B,EAAM8gB,GAC/B,IAAIpe,EAAOrE,KAAM,GACjB,GAAKqE,EACJ,OAAOrB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMpe,GAAM,MAc5CjD,EAAQq+B,SACbz8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAI/b,EAAU,SAAU6Z,GACvBxlB,EAAOwlB,MAAM0X,SAAUxV,EAAKlC,EAAM/iB,OAAQzC,EAAOwlB,MAAMkC,IAAKlC,KAG7DxlB,EAAOwlB,MAAMrJ,QAASuL,GAAQ,CAC7BP,MAAO,WAIN,IAAIjoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAE5B0V,GACLl+B,EAAI8N,iBAAkBse,EAAM3f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAKwoB,GAAO0V,GAAY,GAAM,IAEhD9V,SAAU,WACT,IAAIpoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAAQ,EAEpC0V,EAKLxd,EAASxB,OAAQlf,EAAKwoB,EAAK0V,IAJ3Bl+B,EAAI6e,oBAAqBuN,EAAM3f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAKwoB,QAS3B,IAAIvV,GAAWpV,EAAOoV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAKyjB,OAErBkU,GAAS,KAKbr9B,EAAOs9B,SAAW,SAAU7d,GAC3B,IAAI3O,EAAKysB,EACT,IAAM9d,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM/T,EAAOygC,WAAcC,gBAAiBhe,EAAM,YACvD,MAAQhW,IAYV,OAVA8zB,EAAkBzsB,GAAOA,EAAIxG,qBAAsB,eAAiB,GAC9DwG,IAAOysB,GACZv9B,EAAOoD,MAAO,iBACbm6B,EACCv9B,EAAOoB,IAAKm8B,EAAgB/zB,WAAY,SAAUgC,GACjD,OAAOA,EAAG8D,cACPzE,KAAM,MACV4U,IAGI3O,GAIR,IACC4sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa/I,EAAQz2B,EAAKy/B,EAAavlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAASvE,GAGnB0B,EAAOkB,KAAM5C,EAAK,SAAUa,EAAGia,GACzB2kB,GAAeL,GAASjzB,KAAMsqB,GAGlCvc,EAAKuc,EAAQ3b,GAKb0kB,GACC/I,EAAS,KAAqB,iBAAN3b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACA2kB,EACAvlB,UAKG,GAAMulB,GAAiC,WAAlBj+B,EAAQxB,GAUnCka,EAAKuc,EAAQz2B,QAPb,IAAM+D,KAAQ/D,EACbw/B,GAAa/I,EAAS,IAAM1yB,EAAO,IAAK/D,EAAK+D,GAAQ07B,EAAavlB,GAYrExY,EAAOg+B,MAAQ,SAAU53B,EAAG23B,GAC3B,IAAIhJ,EACHkJ,EAAI,GACJzlB,EAAM,SAAUrN,EAAK+yB,GAGpB,IAAI/5B,EAAQ9F,EAAY6/B,GACvBA,IACAA,EAEDD,EAAGA,EAAE39B,QAAW69B,mBAAoBhzB,GAAQ,IAC3CgzB,mBAA6B,MAATh6B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKxb,KAAKqF,KAAMrF,KAAKmH,cAOtB,IAAM4wB,KAAU3uB,EACf03B,GAAa/I,EAAQ3uB,EAAG2uB,GAAUgJ,EAAavlB,GAKjD,OAAOylB,EAAEpzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjBi8B,UAAW,WACV,OAAOp+B,EAAOg+B,MAAOhhC,KAAKqhC,mBAE3BA,eAAgB,WACf,OAAOrhC,KAAKoE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAM1iB,KAAM,YAClC,OAAO8R,EAAW9O,EAAO2D,UAAWmL,GAAa9R,OAC9CsQ,OAAQ,WACX,IAAI3O,EAAO3B,KAAK2B,KAGhB,OAAO3B,KAAKqF,OAASrC,EAAQhD,MAAOka,GAAI,cACvC2mB,GAAapzB,KAAMzN,KAAKqM,YAAeu0B,GAAgBnzB,KAAM9L,KAC3D3B,KAAK2V,UAAYkQ,GAAepY,KAAM9L,MACtCyC,IAAK,SAAUoD,EAAInD,GACtB,IAAIjC,EAAMY,EAAQhD,MAAOoC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAIhD,CAAEt7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAClDh9B,SAKN,IACC29B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZrH,GAAa,GAObsH,GAAa,GAGbC,GAAW,KAAKnhC,OAAQ,KAGxBohC,GAAeliC,EAAS0C,cAAe,KAKxC,SAASy/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoBhkB,GAED,iBAAvBgkB,IACXhkB,EAAOgkB,EACPA,EAAqB,KAGtB,IAAIC,EACH//B,EAAI,EACJggC,EAAYF,EAAmBx6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK7a,EAAY4c,GAGhB,MAAUikB,EAAWC,EAAWhgC,KAGR,MAAlB+/B,EAAU,IACdA,EAAWA,EAAS5hC,MAAO,IAAO,KAChC0hC,EAAWE,GAAaF,EAAWE,IAAc,IAAKtwB,QAASqM,KAI/D+jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKthC,KAAMqd,IAQnE,SAASmkB,GAA+BJ,EAAW58B,EAASy1B,EAAiBwH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAItsB,EAcJ,OAbA0sB,EAAWJ,IAAa,EACxBl/B,EAAOkB,KAAM89B,EAAWE,IAAc,GAAI,SAAUjlB,EAAGwlB,GACtD,IAAIC,EAAsBD,EAAoBr9B,EAASy1B,EAAiBwH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACD3sB,EAAW8sB,QADf,GAHNt9B,EAAQ+8B,UAAUvwB,QAAS8wB,GAC3BF,EAASE,IACF,KAKF9sB,EAGR,OAAO4sB,EAASp9B,EAAQ+8B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYl9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRk9B,EAAc5/B,EAAO6/B,aAAaD,aAAe,GAElD,IAAMz0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPy0B,EAAaz0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/ERq8B,GAAatsB,KAAOL,GAASK,KAgP7BxS,EAAOmC,OAAQ,CAGd29B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK9tB,GAASK,KACd7T,KAAM,MACNuhC,QAxRgB,4DAwRQz1B,KAAM0H,GAASguB,UACvC3jC,QAAQ,EACR4jC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRnI,IAAKyG,GACLt/B,KAAM,aACNgtB,KAAM,YACNzb,IAAK,4BACL0vB,KAAM,qCAGPxoB,SAAU,CACTlH,IAAK,UACLyb,KAAM,SACNiU,KAAM,YAGPC,eAAgB,CACf3vB,IAAK,cACLvR,KAAM,eACNihC,KAAM,gBAKPE,WAAY,CAGXC,SAAUj4B,OAGVk4B,aAAa,EAGbC,YAAa5gB,KAAKC,MAGlB4gB,WAAY9gC,EAAOs9B,UAOpBsC,YAAa,CACZK,KAAK,EACL//B,SAAS,IAOX6gC,UAAW,SAAUt+B,EAAQu+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYl9B,EAAQzC,EAAO6/B,cAAgBmB,GAGvDrB,GAAY3/B,EAAO6/B,aAAcp9B,IAGnCw+B,cAAelC,GAA6BzH,IAC5C4J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK79B,GAGA,iBAAR69B,IACX79B,EAAU69B,EACVA,OAAMn9B,GAIPV,EAAUA,GAAW,GAErB,IAAIg/B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGA3jB,EAGA4jB,EAGAviC,EAGAwiC,EAGA1D,EAAIj+B,EAAO+gC,UAAW,GAAI3+B,GAG1Bw/B,EAAkB3D,EAAE/9B,SAAW+9B,EAG/B4D,EAAqB5D,EAAE/9B,UACpB0hC,EAAgBrjC,UAAYqjC,EAAgBphC,QAC9CR,EAAQ4hC,GACR5hC,EAAOwlB,MAGRnK,EAAWrb,EAAOgb,WAClB8mB,EAAmB9hC,EAAO+Z,UAAW,eAGrCgoB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPnhB,WAAY,EAGZikB,kBAAmB,SAAUh3B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMyjB,EAAkB,CACvBA,EAAkB,GAClB,MAAUz3B,EAAQ20B,GAASt0B,KAAMm3B,GAChCC,EAAiBz3B,EAAO,GAAIrF,cAAgB,MACzC88B,EAAiBz3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD/G,OAAQoM,EAAO,IAGpBA,EAAQy3B,EAAiBp2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cu3B,sBAAuB,WACtB,OAAOtkB,EAAYwjB,EAAwB,MAI5Ce,iBAAkB,SAAUhgC,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO4/B,EAAqB5/B,EAAKoC,eAChCw9B,EAAqB5/B,EAAKoC,gBAAmBpC,EAC9C2/B,EAAgB3/B,GAAS8B,GAEnBnH,MAIRslC,iBAAkB,SAAU3jC,GAI3B,OAHkB,MAAbmf,IACJmgB,EAAEsE,SAAW5jC,GAEP3B,MAIR+kC,WAAY,SAAU3gC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJuhB,EAAMjkB,OAAQha,EAAKi+B,EAAMmD,cAIzB,IAAMxjC,KAAQoC,EACb2gC,EAAY/iC,GAAS,CAAE+iC,EAAY/iC,GAAQoC,EAAKpC,IAInD,OAAOhC,MAIRylC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB98B,EAAM,EAAG88B,GACF3lC,OAoBV,GAfAqe,EAASzB,QAASylB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO9tB,GAASK,MAAS,IAC5CtP,QAASy7B,GAAWxsB,GAASguB,SAAW,MAG1ClC,EAAEt/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQs/B,EAAEtkB,QAAUskB,EAAEt/B,KAGzDs/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMz6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB+kB,EAAE2E,YAAsB,CAC5BnB,EAAY7kC,EAAS0C,cAAe,KAKpC,IACCmiC,EAAUjvB,KAAOyrB,EAAEgC,IAInBwB,EAAUjvB,KAAOivB,EAAUjvB,KAC3ByrB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQp5B,GAITw0B,EAAE2E,aAAc,GAalB,GARK3E,EAAExe,MAAQwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,OACxCwe,EAAExe,KAAOzf,EAAOg+B,MAAOC,EAAExe,KAAMwe,EAAEF,cAIlCqB,GAA+B9H,GAAY2G,EAAG77B,EAASi9B,GAGlDvhB,EACJ,OAAOuhB,EA8ER,IAAMlgC,KAzENuiC,EAAc1hC,EAAOwlB,OAASyY,EAAEzhC,SAGQ,GAApBwD,EAAO8/B,UAC1B9/B,EAAOwlB,MAAMU,QAAS,aAIvB+X,EAAEt/B,KAAOs/B,EAAEt/B,KAAKogB,cAGhBkf,EAAE6E,YAAcpE,GAAWj0B,KAAMwzB,EAAEt/B,MAKnC0iC,EAAWpD,EAAEgC,IAAI/8B,QAASq7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAExe,MAAQwe,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKziC,QAAS,uCACjCogC,EAAExe,KAAOwe,EAAExe,KAAKvc,QAASo7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAI3iC,MAAO+jC,EAAS/gC,QAG5B29B,EAAExe,OAAUwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,QAC1C4hB,IAAchE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQpD,EAAExe,YAGjDwe,EAAExe,OAIO,IAAZwe,EAAE/yB,QACNm2B,EAAWA,EAASn+B,QAASs7B,GAAY,MACzCmD,GAAatE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQ,KAASxiC,GAAMuF,OACnEu9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD/iC,EAAO+/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBriC,EAAO+/B,aAAcsB,IAE9DrhC,EAAOggC,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBriC,EAAOggC,KAAMqB,MAKnDpD,EAAExe,MAAQwe,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBl+B,EAAQk+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBljC,EAAG8+B,EAAE+E,QAAS7jC,IAIvC,GAAK8+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWxlC,KAAMmkC,EAAiBvC,EAAOpB,IAAiBngB,GAG9D,OAAOuhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBtpB,IAAKylB,EAAEhG,UACxBoH,EAAMx5B,KAAMo4B,EAAEiF,SACd7D,EAAMxlB,KAAMokB,EAAE76B,OAGdg+B,EAAYhC,GAA+BR,GAAYX,EAAG77B,EAASi9B,GAK5D,CASN,GARAA,EAAMnhB,WAAa,EAGdwjB,GACJG,EAAmB3b,QAAS,WAAY,CAAEmZ,EAAOpB,IAI7CngB,EACJ,OAAOuhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE5D,UACjBmH,EAAezkC,EAAO+f,WAAY,WACjCuiB,EAAMoD,MAAO,YACXxE,EAAE5D,UAGN,IACCvc,GAAY,EACZsjB,EAAU+B,KAAMnB,EAAgBn8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAM28B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS9/B,EAAOmgC,EAAUC,EACxCd,EAAaU,EAGTtlB,IAILA,GAAY,EAGP0jB,GACJzkC,EAAOu9B,aAAckH,GAKtBJ,OAAYt+B,EAGZw+B,EAAwB0B,GAAW,GAGnC3D,EAAMnhB,WAAsB,EAATskB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI9kC,EAAM+kC,EAAeC,EAC5B3rB,EAAWimB,EAAEjmB,SACbmnB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU9zB,aACEvI,IAAP2gC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM9kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAMg5B,GAAO,CACtDtE,EAAUvwB,QAASjQ,GACnB,MAMH,GAAKwgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMxgC,KAAQ0kC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY/hC,EAAO,IAAMwgC,EAAW,IAAQ,CACrEuE,EAAgB/kC,EAChB,MAEKglC,IACLA,EAAgBhlC,GAKlB+kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUvwB,QAAS80B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IACsC,EAA3CtjC,EAAO6D,QAAS,SAAUo6B,EAAEkB,YAC5Bn/B,EAAO6D,QAAS,OAAQo6B,EAAEkB,WAAc,IACxClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA9iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMp2B,EAAKsK,EAC9ByoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU7hC,QAGzB,GAAK6hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKt/B,eAAkBw5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU9zB,QAGpB,MAAQy4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCtrB,GAAQqrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtCjnB,EAAO6rB,EACPA,EAAU3E,EAAU9zB,QAKnB,GAAiB,MAAZy4B,EAEJA,EAAU7rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS6rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYzoB,EAAO,IAAM6rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA/yB,EAAMk2B,EAAMt/B,MAAO,MACT,KAAQu/B,IAGjBC,EAAOrD,EAAYzoB,EAAO,IAAMtK,EAAK,KACpC+yB,EAAY,KAAO/yB,EAAK,KACb,EAGG,IAATo2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUn2B,EAAK,GACfwxB,EAAUvwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATo2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ95B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAO2gC,EAAOt6B,EAAI,sBAAwBwO,EAAO,OAAS6rB,IASjE,MAAO,CAAE3oB,MAAO,UAAWsE,KAAM8jB,GAidpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCniC,EAAO+/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCniC,EAAOggC,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEt/B,KACxB+jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASpoB,MACtB+nB,EAAUK,EAAS9jB,KAEnB6jB,IADAlgC,EAAQmgC,EAASngC,UAMlBA,EAAQs/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJjoB,EAASmB,YAAaolB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9DhkB,EAASuB,WAAYglB,EAAiB,CAAEvC,EAAOqD,EAAYt/B,IAI5Di8B,EAAM0C,WAAYA,GAClBA,OAAaj/B,EAER4+B,GACJG,EAAmB3b,QAASod,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU9/B,IAIpC0+B,EAAiB/mB,SAAU6mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmB3b,QAAS,eAAgB,CAAEmZ,EAAOpB,MAG3Cj+B,EAAO8/B,QAChB9/B,EAAOwlB,MAAMU,QAAS,cAKzB,OAAOmZ,GAGR8E,QAAS,SAAUlE,EAAKxgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKs/B,EAAKxgB,EAAMte,EAAU,SAGzCijC,UAAW,SAAUnE,EAAK9+B,GACzB,OAAOnB,EAAOW,IAAKs/B,OAAKn9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUsmB,EAAKxgB,EAAMte,EAAUxC,GAUjD,OAPKN,EAAYohB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOmhC,KAAMnhC,EAAOmC,OAAQ,CAClC89B,IAAKA,EACLthC,KAAMgb,EACNulB,SAAUvgC,EACV8gB,KAAMA,EACNyjB,QAAS/hC,GACPnB,EAAO2C,cAAes9B,IAASA,OAIpCjgC,EAAOihC,cAAe,SAAUhD,GAC/B,IAAI9+B,EACJ,IAAMA,KAAK8+B,EAAE+E,QACa,iBAApB7jC,EAAEsF,gBACNw5B,EAAEqC,YAAcrC,EAAE+E,QAAS7jC,IAAO,MAMrCa,EAAOwsB,SAAW,SAAUyT,EAAK79B,EAASlD,GACzC,OAAOc,EAAOmhC,KAAM,CACnBlB,IAAKA,EAGLthC,KAAM,MACNugC,SAAU,SACVh0B,OAAO,EACPm1B,OAAO,EACP7jC,QAAQ,EAKRkkC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBvjC,EAAO0D,WAAY6/B,EAAUnhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBmiC,QAAS,SAAU/X,GAClB,IAAI/H,EAyBJ,OAvBKxnB,KAAM,KACLqB,EAAYkuB,KAChBA,EAAOA,EAAK9uB,KAAMT,KAAM,KAIzBwnB,EAAOxkB,EAAQusB,EAAMvvB,KAAM,GAAIkN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDxF,KAAM,GAAI4C,YACd4kB,EAAK2I,aAAcnwB,KAAM,IAG1BwnB,EAAKpjB,IAAK,WACT,IAAIC,EAAOrE,KAEX,MAAQqE,EAAKkjC,kBACZljC,EAAOA,EAAKkjC,kBAGb,OAAOljC,IACJ4rB,OAAQjwB,OAGNA,MAGRwnC,UAAW,SAAUjY,GACpB,OAAKluB,EAAYkuB,GACTvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOwnC,UAAWjY,EAAK9uB,KAAMT,KAAMmC,MAItCnC,KAAKkE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQhD,MAClBgb,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASssB,QAAS/X,GAGlB9U,EAAKwV,OAAQV,MAKhB/H,KAAM,SAAU+H,GACf,IAAIkY,EAAiBpmC,EAAYkuB,GAEjC,OAAOvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOsnC,QAASG,EAAiBlY,EAAK9uB,KAAMT,KAAMmC,GAAMotB,MAIlEmY,OAAQ,SAAUzkC,GAIjB,OAHAjD,KAAKmU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQhD,MAAOswB,YAAatwB,KAAKwM,cAE3BxM,QAKTgD,EAAO6O,KAAKhI,QAAQ4vB,OAAS,SAAUp1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ89B,QAAStjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ89B,QAAU,SAAUtjC,GACvC,SAAWA,EAAKuuB,aAAevuB,EAAK0vB,cAAgB1vB,EAAKyxB,iBAAiBxyB,SAM3EN,EAAO6/B,aAAa+E,IAAM,WACzB,IACC,OAAO,IAAI7nC,EAAO8nC,eACjB,MAAQp7B,MAGX,IAAIq7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAejlC,EAAO6/B,aAAa+E,MAEpCxmC,EAAQ8mC,OAASD,IAAkB,oBAAqBA,GACxD7mC,EAAQ+iC,KAAO8D,KAAiBA,GAEhCjlC,EAAOkhC,cAAe,SAAU9+B,GAC/B,IAAIjB,EAAUgkC,EAGd,GAAK/mC,EAAQ8mC,MAAQD,KAAiB7iC,EAAQwgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS/K,GACxB,IAAI94B,EACHylC,EAAMxiC,EAAQwiC,MAWf,GATAA,EAAIQ,KACHhjC,EAAQzD,KACRyD,EAAQ69B,IACR79B,EAAQi+B,MACRj+B,EAAQijC,SACRjjC,EAAQmR,UAIJnR,EAAQkjC,UACZ,IAAMnmC,KAAKiD,EAAQkjC,UAClBV,EAAKzlC,GAAMiD,EAAQkjC,UAAWnmC,GAmBhC,IAAMA,KAdDiD,EAAQmgC,UAAYqC,EAAItC,kBAC5BsC,EAAItC,iBAAkBlgC,EAAQmgC,UAQzBngC,EAAQwgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV4B,EAAIvC,iBAAkBljC,EAAG6jC,EAAS7jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAWgkC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAThnC,EACJimC,EAAInC,QACgB,UAAT9jC,EAKgB,iBAAfimC,EAAIpC,OACfvK,EAAU,EAAG,SAEbA,EAGC2M,EAAIpC,OACJoC,EAAIlC,YAINzK,EACC6M,GAAkBF,EAAIpC,SAAYoC,EAAIpC,OACtCoC,EAAIlC,WAK+B,UAAjCkC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAIrB,UACd,CAAEhkC,KAAMqlC,EAAIiB,cACbjB,EAAIxC,4BAQTwC,EAAIW,OAASpkC,IACbgkC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYvkC,EAAU,cAKnC2B,IAAhB8hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAI1mB,YAMRnhB,EAAO+f,WAAY,WACb3b,GACJgkC,OAQLhkC,EAAWA,EAAU,SAErB,IAGCyjC,EAAIzB,KAAM/gC,EAAQ0gC,YAAc1gC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKTg5B,MAAO,WACDthC,GACJA,QAWLnB,EAAOihC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAEjmB,SAAS3Y,QAAS,KAKtBW,EAAO+gC,UAAW,CACjBR,QAAS,CACRlhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETqhC,WAAY,CACX2D,cAAe,SAAU9kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAOihC,cAAe,SAAU,SAAUhD,QACxBn7B,IAAZm7B,EAAE/yB,QACN+yB,EAAE/yB,OAAQ,GAEN+yB,EAAE2E,cACN3E,EAAEt/B,KAAO,SAKXqB,EAAOkhC,cAAe,SAAU,SAAUjD,GAIxC,IAAI5+B,EAAQ8B,EADb,GAAK88B,EAAE2E,aAAe3E,EAAE8H,YAEvB,MAAO,CACN5C,KAAM,SAAUlpB,EAAGge,GAClB54B,EAASW,EAAQ,YACf+O,KAAMkvB,EAAE8H,aAAe,IACvBrmB,KAAM,CAAEsmB,QAAS/H,EAAEgI,cAAernC,IAAKq/B,EAAEgC,MACzC7a,GAAI,aAAcjkB,EAAW,SAAU+kC,GACvC7mC,EAAOub,SACPzZ,EAAW,KACN+kC,GACJjO,EAAuB,UAAbiO,EAAIvnC,KAAmB,IAAM,IAAKunC,EAAIvnC,QAKnD/B,EAAS8C,KAAKC,YAAaN,EAAQ,KAEpCojC,MAAO,WACDthC,GACJA,QAUL,IAqGKshB,GArGD0jB,GAAe,GAClBC,GAAS,oBAGVpmC,EAAO+gC,UAAW,CACjBsF,MAAO,WACPC,cAAe,WACd,IAAInlC,EAAWglC,GAAa7/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADApH,KAAMmE,IAAa,EACZA,KAKTnB,EAAOihC,cAAe,aAAc,SAAUhD,EAAGsI,EAAkBlH,GAElE,IAAImH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ1I,EAAEoI,QAAqBD,GAAO37B,KAAMwzB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAExe,MAE6C,KADnDwe,EAAEqC,aAAe,IACjBziC,QAAS,sCACXuoC,GAAO37B,KAAMwzB,EAAExe,OAAU,QAI5B,GAAKknB,GAAiC,UAArB1I,EAAEkB,UAAW,GA8D7B,OA3DAqH,EAAevI,EAAEqI,cAAgBjoC,EAAY4/B,EAAEqI,eAC9CrI,EAAEqI,gBACFrI,EAAEqI,cAGEK,EACJ1I,EAAG0I,GAAa1I,EAAG0I,GAAWzjC,QAASkjC,GAAQ,KAAOI,IAC/B,IAAZvI,EAAEoI,QACbpI,EAAEgC,MAAS5C,GAAO5yB,KAAMwzB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEoI,MAAQ,IAAMG,GAIjEvI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMgG,GACL1mC,EAAOoD,MAAOojC,EAAe,mBAEvBE,EAAmB,IAI3BzI,EAAEkB,UAAW,GAAM,OAGnBsH,EAAc1pC,EAAQypC,GACtBzpC,EAAQypC,GAAiB,WACxBE,EAAoBplC,WAIrB+9B,EAAMjkB,OAAQ,gBAGQtY,IAAhB2jC,EACJzmC,EAAQjD,GAASu+B,WAAYkL,GAI7BzpC,EAAQypC,GAAiBC,EAIrBxI,EAAGuI,KAGPvI,EAAEqI,cAAgBC,EAAiBD,cAGnCH,GAAavoC,KAAM4oC,IAIfE,GAAqBroC,EAAYooC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc3jC,IAI5B,WAYT1E,EAAQwoC,qBACHnkB,GAAO7lB,EAASiqC,eAAeD,mBAAoB,IAAKnkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS4mC,GAC3C,MAAqB,iBAATrnB,EACJ,IAEgB,kBAAZvf,IACX4mC,EAAc5mC,EACdA,GAAU,GAKLA,IAIA9B,EAAQwoC,qBAMZ/yB,GALA3T,EAAUtD,EAASiqC,eAAeD,mBAAoB,KAKvCtnC,cAAe,SACzBkT,KAAO5V,EAASuV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUtD,GAKZynB,GAAWyiB,GAAe,IAD1BC,EAASzvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAeynC,EAAQ,MAGzCA,EAAS3iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI+lC,EAAOv9B,cAlChC,IAAIqK,EAAMkzB,EAAQ1iB,GAyCnBrkB,EAAOG,GAAGsoB,KAAO,SAAUwX,EAAK+G,EAAQ7lC,GACvC,IAAIlB,EAAUtB,EAAM4kC,EACnB9rB,EAAOza,KACPyoB,EAAMwa,EAAIpiC,QAAS,KAsDpB,OApDY,EAAP4nB,IACJxlB,EAAWk7B,GAAkB8E,EAAI3iC,MAAOmoB,IACxCwa,EAAMA,EAAI3iC,MAAO,EAAGmoB,IAIhBpnB,EAAY2oC,IAGhB7lC,EAAW6lC,EACXA,OAASlkC,GAGEkkC,GAA4B,iBAAXA,IAC5BroC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOmhC,KAAM,CACZlB,IAAKA,EAKLthC,KAAMA,GAAQ,MACdugC,SAAU,OACVzf,KAAMunB,IACHnhC,KAAM,SAAUggC,GAGnBtC,EAAWjiC,UAEXmW,EAAK8U,KAAMtsB,EAIVD,EAAQ,SAAUitB,OAAQjtB,EAAO2X,UAAWkuB,IAAiBr4B,KAAMvN,GAGnE4lC,KAKEzqB,OAAQja,GAAY,SAAUk+B,EAAOmD,GACxC/qB,EAAKvW,KAAM,WACVC,EAASxD,MAAOX,KAAMumC,GAAY,CAAElE,EAAMwG,aAAcrD,EAAQnD,QAK5DriC,MAMRgD,EAAO6O,KAAKhI,QAAQogC,SAAW,SAAU5lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOy5B,OAAQ,SAAUt5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOknC,OAAS,CACfC,UAAW,SAAU9lC,EAAMe,EAASjD,GACnC,IAAIioC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD/X,EAAW1vB,EAAOyhB,IAAKpgB,EAAM,YAC7BqmC,EAAU1nC,EAAQqB,GAClBynB,EAAQ,GAGS,WAAb4G,IACJruB,EAAKkgB,MAAMmO,SAAW,YAGvB8X,EAAYE,EAAQR,SACpBI,EAAYtnC,EAAOyhB,IAAKpgB,EAAM,OAC9BomC,EAAaznC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbquB,GAAwC,UAAbA,KACA,GAA9C4X,EAAYG,GAAa5pC,QAAS,SAMpC0pC,GADAH,EAAcM,EAAQhY,YACD3iB,IACrBs6B,EAAUD,EAAYzS,OAGtB4S,EAASxX,WAAYuX,IAAe,EACpCD,EAAUtX,WAAY0X,IAAgB,GAGlCppC,EAAY+D,KAGhBA,EAAUA,EAAQ3E,KAAM4D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIqlC,KAGjC,MAAfplC,EAAQ2K,MACZ+b,EAAM/b,IAAQ3K,EAAQ2K,IAAMy6B,EAAUz6B,IAAQw6B,GAE1B,MAAhBnlC,EAAQuyB,OACZ7L,EAAM6L,KAASvyB,EAAQuyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWjlC,EACfA,EAAQulC,MAAMlqC,KAAM4D,EAAMynB,GAG1B4e,EAAQjmB,IAAKqH,KAKhB9oB,EAAOG,GAAGgC,OAAQ,CAGjB+kC,OAAQ,SAAU9kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNpF,KACAA,KAAKkE,KAAM,SAAU/B,GACpBa,EAAOknC,OAAOC,UAAWnqC,KAAMoF,EAASjD,KAI3C,IAAIyoC,EAAMC,EACTxmC,EAAOrE,KAAM,GAEd,OAAMqE,EAQAA,EAAKyxB,iBAAiBxyB,QAK5BsnC,EAAOvmC,EAAKozB,wBACZoT,EAAMxmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK66B,EAAK76B,IAAM86B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAEh7B,IAAK,EAAG4nB,KAAM,QATxB,GAuBDjF,SAAU,WACT,GAAM1yB,KAAM,GAAZ,CAIA,IAAIgrC,EAAcd,EAAQhoC,EACzBmC,EAAOrE,KAAM,GACbirC,EAAe,CAAEl7B,IAAK,EAAG4nB,KAAM,GAGhC,GAAwC,UAAnC30B,EAAOyhB,IAAKpgB,EAAM,YAGtB6lC,EAAS7lC,EAAKozB,4BAER,CACNyS,EAASlqC,KAAKkqC,SAIdhoC,EAAMmC,EAAK6I,cACX89B,EAAe3mC,EAAK2mC,cAAgB9oC,EAAIyN,gBACxC,MAAQq7B,IACLA,IAAiB9oC,EAAIujB,MAAQulB,IAAiB9oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKumB,EAAc,YAE1BA,EAAeA,EAAapoC,WAExBooC,GAAgBA,IAAiB3mC,GAAkC,IAA1B2mC,EAAazpC,YAG1D0pC,EAAejoC,EAAQgoC,GAAed,UACzBn6B,KAAO/M,EAAOyhB,IAAKumB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ30B,EAAOyhB,IAAKumB,EAAc,mBAAmB,IAKpE,MAAO,CACNj7B,IAAKm6B,EAAOn6B,IAAMk7B,EAAal7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEszB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO30B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E2mC,aAAc,WACb,OAAOhrC,KAAKoE,IAAK,WAChB,IAAI4mC,EAAehrC,KAAKgrC,aAExB,MAAQA,GAA2D,WAA3ChoC,EAAOyhB,IAAKumB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBr7B,QAM1B3M,EAAOkB,KAAM,CAAE20B,WAAY,cAAeD,UAAW,eAAiB,SAAUjc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQphB,KAAM,SAAUqE,EAAMsY,EAAQva,GAG5C,IAAIyoC,EAOJ,GANKppC,EAAU4C,GACdwmC,EAAMxmC,EACuB,IAAlBA,EAAK9C,WAChBspC,EAAMxmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOyoC,EAAMA,EAAKnoB,GAASre,EAAMsY,GAG7BkuB,EACJA,EAAIK,SACFn7B,EAAY86B,EAAIE,YAAV3oC,EACP2N,EAAM3N,EAAMyoC,EAAIC,aAIjBzmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOizB,SAAUvT,GAASkP,GAAcxwB,EAAQgyB,cAC/C,SAAU/uB,EAAMitB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQhtB,EAAMqe,GAGlBoO,GAAUrjB,KAAM6jB,GACtBtuB,EAAQqB,GAAOquB,WAAYhQ,GAAS,KACpC4O,MAQLtuB,EAAOkB,KAAM,CAAEinC,OAAQ,SAAUC,MAAO,SAAW,SAAU/lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CACZ2zB,QAAS,QAAUxyB,EACnB2W,QAASra,EACT0pC,GAAI,QAAUhmC,GACZ,SAAUimC,EAAcC,GAG1BvoC,EAAOG,GAAIooC,GAAa,SAAU3T,EAAQzwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAYgoC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVzwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQphB,KAAM,SAAUqE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCknC,EAAS1qC,QAAS,SACxBwD,EAAM,QAAUgB,GAChBhB,EAAKzE,SAAS+P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK9C,UACTW,EAAMmC,EAAKsL,gBAIJ3J,KAAKivB,IACX5wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM6zB,GAGxBxyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOquB,IAChC7zB,EAAM0f,EAAYuW,OAAS9xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOnD,KAAKooB,GAAIzmB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB61B,KAAM,SAAU3S,EAAO5F,EAAMtf,GAC5B,OAAOnD,KAAKooB,GAAIC,EAAO,KAAM5F,EAAMtf,IAEpCqoC,OAAQ,SAAUnjB,EAAOllB,GACxB,OAAOnD,KAAKyoB,IAAKJ,EAAO,KAAMllB,IAG/BsoC,SAAU,SAAUxoC,EAAUolB,EAAO5F,EAAMtf,GAC1C,OAAOnD,KAAKooB,GAAIC,EAAOplB,EAAUwf,EAAMtf,IAExCuoC,WAAY,SAAUzoC,EAAUolB,EAAOllB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBtD,KAAKyoB,IAAKxlB,EAAU,MACpBjD,KAAKyoB,IAAKJ,EAAOplB,GAAY,KAAME,IAGrCwoC,MAAO,SAAUC,EAAQC,GACxB,OAAO7rC,KAAKkuB,WAAY0d,GAASzd,WAAY0d,GAASD,MAIxD5oC,EAAOkB,KACN,wLAE4DqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBtD,KAAKooB,GAAI/iB,EAAM,KAAMod,EAAMtf,GAC3BnD,KAAKkpB,QAAS7jB,MAUlB,IAAI2E,GAAQ,qCAMZhH,EAAO8oC,MAAQ,SAAU3oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMs3B,EAUf,GARwB,iBAAZ5oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKAtP,EAAY8B,GAalB,OARAqR,EAAOlU,EAAMG,KAAM6D,UAAW,IAC9BwnC,EAAQ,WACP,OAAO3oC,EAAGxC,MAAOuC,GAAWlD,KAAMwU,EAAK9T,OAAQJ,EAAMG,KAAM6D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElC0kC,GAGR9oC,EAAO+oC,UAAY,SAAUC,GACvBA,EACJhpC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOipC,UAAYhpB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO3B,WAAaA,EACpB2B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOmpB,IAAMzjB,KAAKyjB,IAElBnpB,EAAOkpC,UAAY,SAAU5qC,GAK5B,IAAIK,EAAOqB,EAAOrB,KAAML,GACxB,OAAkB,WAATK,GAA8B,WAATA,KAK5BwqC,MAAO7qC,EAAMyxB,WAAYzxB,KAG5B0B,EAAOopC,KAAO,SAAU7pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXqiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOrpC,IAOT,IAGCupC,GAAUxsC,EAAOiD,OAGjBwpC,GAAKzsC,EAAO0sC,EAwBb,OAtBAzpC,EAAO0pC,WAAa,SAAUhnC,GAS7B,OARK3F,EAAO0sC,IAAMzpC,IACjBjD,EAAO0sC,EAAID,IAGP9mC,GAAQ3F,EAAOiD,SAAWA,IAC9BjD,EAAOiD,OAASupC,IAGVvpC,GAMiB,oBAAb/C,IACXF,EAAOiD,OAASjD,EAAO0sC,EAAIzpC,GAMrBA","file":"jquery-3.6.0.min.js"} \ No newline at end of file From 4d69c185e08d23b8d1c12f5731455970ac0b3160 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 Oct 2023 10:46:53 +0200 Subject: [PATCH 542/853] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20unwanted=20transpa?= =?UTF-8?q?rency=20in=20menu=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/static/theme/css/menu.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pagetop/static/theme/css/menu.css b/pagetop/static/theme/css/menu.css index 94c1d3ba..ba525dfb 100644 --- a/pagetop/static/theme/css/menu.css +++ b/pagetop/static/theme/css/menu.css @@ -248,8 +248,9 @@ justify-content: space-between; top: 0; height: var(--menu--item-height); - z-index: 501; border-bottom: 1px solid var(--menu--color-border); + background: var(--menu--color-background); + z-index: 501; } .menu-main .menu .menu-header .menu-title { padding: var(--menu--line-padding); From c2ea3996355df98b3ced25851256f3cb25112e4f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 Oct 2023 12:23:46 +0200 Subject: [PATCH 543/853] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20submenus=20positio?= =?UTF-8?q?n=20after=20window=20resize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/static/theme/js/menu.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/pagetop/static/theme/js/menu.js b/pagetop/static/theme/js/menu.js index e4258872..8fff4f8b 100644 --- a/pagetop/static/theme/js/menu.js +++ b/pagetop/static/theme/js/menu.js @@ -13,6 +13,7 @@ function menuHideChildren(nav, children) { submenu.style.animation = 'slideRight 0.5s ease forwards'; setTimeout(() => { submenu.classList.remove('active'); + submenu.style.removeProperty("animation"); }, 300); children.shift(); @@ -30,6 +31,15 @@ function menuToggle(nav, overlay) { overlay.classList.toggle('active'); } +function menuReset(menu, nav) { + nav.querySelector('.menu-header').classList.remove('active'); + nav.querySelector('.menu-title').innerHTML = ''; + menu.querySelectorAll('.menu-subs').forEach(submenu => { + submenu.classList.remove('active'); + submenu.style.removeProperty("animation"); + }); +} + document.querySelectorAll('.menu-container').forEach(menu => { let menuChildren = []; @@ -46,20 +56,19 @@ document.querySelectorAll('.menu-container').forEach(menu => { menuShowChildren(menuNav, menuChildren); } }); + menu.querySelector('.menu-arrow').addEventListener('click', () => { menuHideChildren(menuNav, menuChildren); }); + menu.querySelector('.menu-close').addEventListener('click', () => { menuToggle(menuNav, menuOverlay); + menuReset(menu, menuNav); setTimeout(() => { - menuNav.querySelector('.menu-header').classList.remove('active'); - menuNav.querySelector('.menu-title').innerHTML = ''; - menu.querySelectorAll('.menu-subs').forEach(close => { - close.classList.remove('active'); - }); menuChildren = []; }, 300); }); + menu.querySelector('.menu-trigger').addEventListener('click', () => { menuToggle(menuNav, menuOverlay); }); @@ -72,6 +81,10 @@ document.querySelectorAll('.menu-container').forEach(menu => { if (this.innerWidth >= 992) { if (menuNav.classList.contains('active')) { menuToggle(menuNav, menuOverlay); + menuReset(menu, menuNav); + setTimeout(() => { + menuChildren = []; + }, 300); } } }; From 2015bb77f0fa8fa52e74de6bae11286f6c1bf335 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 15 Oct 2023 21:03:54 +0200 Subject: [PATCH 544/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Major=20refactor?= =?UTF-8?q?=20for=20improved=20base=20asset=20use?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 1 - pagetop-admin/src/lib.rs | 7 - pagetop-admin/src/summary.rs | 178 +- pagetop-aliner/src/lib.rs | 2 +- pagetop-bootsier/Cargo.toml | 1 - pagetop-bootsier/src/lib.rs | 43 +- pagetop-bulmix/Cargo.toml | 1 - pagetop-bulmix/src/lib.rs | 26 +- pagetop-homedemo/static/css/styles.css | 4 +- pagetop-user/src/lib.rs | 9 +- pagetop/build.rs | 4 +- pagetop/src/base/component.rs | 50 +- pagetop/src/base/component/flex/container.rs | 10 +- pagetop/src/base/component/flex/item.rs | 12 +- pagetop/src/base/component/image.rs | 2 +- pagetop/src/base/component/menu/menu_main.rs | 2 +- pagetop/src/base/component/powered_by.rs | 2 +- pagetop/src/base/theme/inception.rs | 28 +- pagetop/src/core/component/context.rs | 7 + pagetop/src/core/theme/definition.rs | 4 +- pagetop/static/{theme => base}/css/flex.css | 4 +- pagetop/static/base/css/icons.min.css | 5 + pagetop/static/{theme => base}/css/menu.css | 0 .../{theme => base}/css/normalize.min.css | 0 pagetop/static/{theme => base}/css/root.css | 0 pagetop/static/{theme => base}/css/styles.css | 0 pagetop/static/{theme => base}/favicon.ico | Bin pagetop/static/base/fonts/icons.woff | Bin 0 -> 176200 bytes pagetop/static/base/fonts/icons.woff2 | Bin 0 -> 130608 bytes pagetop/static/{theme => base}/js/menu.js | 0 .../static/{theme => base}/pagetop-logo.svg | 0 .../static/theme/icons/bootstrap-icons.css | 1705 ----------------- .../static/theme/icons/bootstrap-icons.woff | Bin 137216 -> 0 bytes .../static/theme/icons/bootstrap-icons.woff2 | Bin 102380 -> 0 bytes 34 files changed, 244 insertions(+), 1863 deletions(-) rename pagetop/static/{theme => base}/css/flex.css (98%) create mode 100644 pagetop/static/base/css/icons.min.css rename pagetop/static/{theme => base}/css/menu.css (100%) rename pagetop/static/{theme => base}/css/normalize.min.css (100%) rename pagetop/static/{theme => base}/css/root.css (100%) rename pagetop/static/{theme => base}/css/styles.css (100%) rename pagetop/static/{theme => base}/favicon.ico (100%) create mode 100644 pagetop/static/base/fonts/icons.woff create mode 100644 pagetop/static/base/fonts/icons.woff2 rename pagetop/static/{theme => base}/js/menu.js (100%) rename pagetop/static/{theme => base}/pagetop-logo.svg (100%) delete mode 100644 pagetop/static/theme/icons/bootstrap-icons.css delete mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff delete mode 100644 pagetop/static/theme/icons/bootstrap-icons.woff2 diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index ee46c232..d25754f1 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -16,4 +16,3 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } -pagetop-megamenu = { version = "0.0", path = "../pagetop-megamenu" } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index a7eb7bec..1ad4e75a 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -21,13 +21,6 @@ impl ModuleTrait for Admin { L10n::t("module_description", &LOCALES_ADMIN) } - #[rustfmt::skip] - fn dependencies(&self) -> Vec<ModuleRef> { - vec![ - &pagetop_megamenu::MegaMenu, - ] - } - fn actions(&self) -> Vec<Action> { actions![action::page::BeforePrepareBody::with(before_prepare_body)] } diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index d3beac04..9dad793c 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -1,65 +1,167 @@ use crate::LOCALES_ADMIN; use pagetop::prelude::*; -use pagetop_megamenu::component::{MegaItem, MegaMenu}; pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { - let top_menu = MegaMenu::new() - .with_item(MegaItem::label(L10n::t("module_name", &LOCALES_ADMIN))) - .with_item(MegaItem::link(L10n::n("Opción 2"), |_| { + let top_menu = Menu::new() + .with_item(menu::Item::label(L10n::t("module_name", &LOCALES_ADMIN))) + .with_item(menu::Item::label(L10n::n("Ejemplo \"Label\""))) + .with_item(menu::Item::link(L10n::n("Ejemplo \"Link\""), |_| { "https://www.google.es" })) - .with_item(MegaItem::link_blank(L10n::n("Opción 3"), |_| { - "https://www.google.es" - })) - .with_item(MegaItem::submenu( - L10n::n("Submenú 1"), - MegaMenu::new() - .with_item(MegaItem::label(L10n::n("Opción 1"))) - .with_item(MegaItem::label(L10n::n("Opción 2"))), + .with_item(menu::Item::link_blank( + L10n::n("Ejemplo \"LinkBlank\""), + |_| "https://www.google.es", )) - .with_item(MegaItem::separator()) - .with_item(MegaItem::submenu( - L10n::n("Submenú 2"), - MegaMenu::new() - .with_item(MegaItem::label(L10n::n("Opción 1"))) - .with_item(MegaItem::label(L10n::n("Opción 2"))), + .with_item(menu::Item::submenu( + L10n::n("Ejemplo Submenú"), + menu::Submenu::new() + .with_title(L10n::n("Título submenú")) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )) + .with_item(menu::Item::submenu( + L10n::n("Otro submenú con un texto muy, pero que muy largo"), + menu::Submenu::new() + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), + )) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), )) - .with_item(MegaItem::label(L10n::n("Opción 4"))); + .with_item(menu::Item::megamenu( + L10n::n("Ejemplo Megamenú 1"), + menu::Megamenu::new() + .with_group( + menu::Group::new() + .with_element(menu::Element::submenu( + menu::Submenu::new() + .with_title(L10n::n("Título submenú")) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )), + )) + .with_element(menu::Element::submenu( + menu::Submenu::new() + .with_title(L10n::n("Título submenú")) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )), + )), + ) + .with_group( + menu::Group::new().with_element(menu::Element::submenu( + menu::Submenu::new() + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), + )), + ) + .with_group( + menu::Group::new() + .with_element(menu::Element::submenu( + menu::Submenu::new() + .with_title(L10n::n("Título submenú")) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )), + )) + .with_element(menu::Element::submenu( + menu::Submenu::new() + .with_title(L10n::n("Título submenú")) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )), + )), + ) + .with_group( + menu::Group::new().with_element(menu::Element::submenu( + menu::Submenu::new() + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + "https://www.google.es" + })) + .with_item(menu::Item::link_blank( + L10n::n("Opción \"LinkBlank\""), + |_| "https://www.google.es", + )) + .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), + )), + ), + )); - let side_menu = MegaMenu::new() - .with_item(MegaItem::label(L10n::n("Opción 1"))) - .with_item(MegaItem::link(L10n::n("Opción 2"), |_| { + let side_menu = Menu::new() + .with_item(menu::Item::label(L10n::n("Opción 1"))) + .with_item(menu::Item::link(L10n::n("Opción 2"), |_| { "https://www.google.es" })) - .with_item(MegaItem::link_blank(L10n::n("Opción 3"), |_| { + .with_item(menu::Item::link_blank(L10n::n("Opción 3"), |_| { "https://www.google.es" })) - .with_item(MegaItem::submenu( + .with_item(menu::Item::submenu( L10n::n("Submenú 1"), - MegaMenu::new() - .with_item(MegaItem::label(L10n::n("Opción 1"))) - .with_item(MegaItem::label(L10n::n("Opción 2"))), - )) - .with_item(MegaItem::separator()) - .with_item(MegaItem::submenu( + menu::Submenu::new() + .with_item(menu::Item::label(L10n::n("Opción 1"))) + .with_item(menu::Item::label(L10n::n("Opción 2"))), + )) /* + .with_item(menu::Item::separator()) */ + .with_item(menu::Item::submenu( L10n::n("Submenú 2"), - MegaMenu::new() - .with_item(MegaItem::label(L10n::n("Opción 1"))) - .with_item(MegaItem::label(L10n::n("Opción 2"))), + menu::Submenu::new() + .with_item(menu::Item::label(L10n::n("Opción 1"))) + .with_item(menu::Item::label(L10n::n("Opción 2"))), )) - .with_item(MegaItem::label(L10n::n("Opción 4"))); + .with_item(menu::Item::label(L10n::n("Opción 4"))); Page::new(request) - .with_context(ContextOp::Theme("Bootsier")) + //.with_context(ContextOp::Theme("Bootsier")) .with_title(L10n::n("Admin")) - .with_in("top-menu", top_menu) + .with_in("top-menu", side_menu) .with_in( "content", flex::Container::new() - .with_item(flex::Item::new().with_component(side_menu)) .with_item(flex::Item::new().with_component(Html::with(html! { - p { "Columna 2"} + p { "Columna 1"} + }))) + .with_item(flex::Item::new().with_component(top_menu)) + .with_item(flex::Item::new().with_component(Html::with(html! { + p { "Columna 3"} }))), ) .with_template("admin") diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index cea82bd7..66e59c9e 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for Aliner { impl ThemeTrait for Aliner { fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/aliner/css/styles.css").with_weight(-99), )); diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 0fe95438..90310c19 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -15,7 +15,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } -pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } static-files = "0.2.3" [build-dependencies] diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 239a0846..081e3f18 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,5 +1,4 @@ use pagetop::prelude::*; -use pagetop_jquery::JQuery; new_handle!(THEME_BOOTSIER); @@ -18,10 +17,6 @@ impl ModuleTrait for Bootsier { Some(&Bootsier) } - fn dependencies(&self) -> Vec<ModuleRef> { - vec![&pagetop_jquery::JQuery] - } - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { static_files_service!(scfg, "/bootsier", bootsier); } @@ -53,7 +48,7 @@ impl ThemeTrait for Bootsier { "content" ] { @if let Some(content) = page.prepare_region(region) { - #(region) { (content) } + #(region) class="region" { (content) } } } } @@ -71,31 +66,31 @@ impl ThemeTrait for Bootsier { html! { body class=[page.body_classes().get()] { @if header.is_some() { - #header { (header.unwrap()) } + #header class="region" { (header.unwrap()) } } @if nav_branding.is_some() { - #nav_branding { (nav_branding.unwrap()) } + #nav_branding class="region" { (nav_branding.unwrap()) } } @if nav_main.is_some() { - #nav_main { (nav_main.unwrap()) } + #nav_main class="region" { (nav_main.unwrap()) } } @if nav_additional.is_some() { - #nav_additional { (nav_additional.unwrap()) } + #nav_additional class="region" { (nav_additional.unwrap()) } } @if breadcrumb.is_some() { - #breadcrumb { (breadcrumb.unwrap()) } + #breadcrumb class="region" { (breadcrumb.unwrap()) } } @if content.is_some() { - #content { (content.unwrap()) } + #content class="region" { (content.unwrap()) } } @if sidebar_first.is_some() { - #sidebar_first { (sidebar_first.unwrap()) } + #sidebar_first class="region" { (sidebar_first.unwrap()) } } @if sidebar_second.is_some() { - #sidebar_second { (sidebar_second.unwrap()) } + #sidebar_second class="region" { (sidebar_second.unwrap()) } } @if footer.is_some() { - #footer { (footer.unwrap()) } + #footer class="region" { (footer.unwrap()) } } } } @@ -104,7 +99,7 @@ impl ThemeTrait for Bootsier { } fn after_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bootsier/css/bootstrap.min.css") .with_version("5.1.3") @@ -114,20 +109,8 @@ impl ThemeTrait for Bootsier { JavaScript::at("/bootsier/js/bootstrap.bundle.min.js") .with_version("5.1.3") .with_weight(-99), - )); - - if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_FLEX) { - page.alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/flex.css").with_version("0.0.0"), - )); - } - if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_ICONS) { - page.alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), - )); - } - - JQuery.enable_jquery(page.context()); + )) + .alter_context(ContextOp::AddAssetsForBase); } fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index e340fd3c..7c501eaf 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -15,7 +15,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop" } -pagetop-jquery = { version = "0.0", path = "../pagetop-jquery" } static-files = "0.2.3" [build-dependencies] diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index c8e1dc74..94f81de6 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,5 +1,4 @@ use pagetop::prelude::*; -use pagetop_jquery::JQuery; new_handle!(THEME_BULMIX); @@ -16,13 +15,6 @@ impl ModuleTrait for Bulmix { Some(&Bulmix) } - #[rustfmt::skip] - fn dependencies(&self) -> Vec<ModuleRef> { - vec![ - &pagetop_jquery::JQuery, - ] - } - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { static_files_service!(scfg, "/bulmix", bulmix); } @@ -30,25 +22,13 @@ impl ModuleTrait for Bulmix { impl ThemeTrait for Bulmix { fn after_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/bulmix/css/bulma.min.css") .with_version("0.9.4") .with_weight(-99), - )); - - if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_FLEX) { - page.alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/flex.css").with_version("0.0.0"), - )); - } - if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_ICONS) { - page.alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), - )); - } - - JQuery.enable_jquery(page.context()); + )) + .alter_context(ContextOp::AddAssetsForBase); } #[rustfmt::skip] diff --git a/pagetop-homedemo/static/css/styles.css b/pagetop-homedemo/static/css/styles.css index f51c5e86..a02d76f1 100644 --- a/pagetop-homedemo/static/css/styles.css +++ b/pagetop-homedemo/static/css/styles.css @@ -69,8 +69,8 @@ body.default-homepage [class$="-col-image"] { text-align: left; } } -/* LG - Applies >= 1024px */ -@media screen and (min-width: 64em) { +/* LG - Applies >= 992px */ +@media screen and (min-width: 62em) { #hello-world .hello-col-text { padding-top: 2rem; padding-left: 10%; diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 054b24c5..66a23e57 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -51,7 +51,7 @@ fn form_login() -> Form { Form::new() .with_id("user-login") .with_element( - form_element::Input::textfield() + form::Input::textfield() .with_name("name") .with_label(L10n::t("username", &LOCALES_USER)) .with_help_text( @@ -61,13 +61,10 @@ fn form_login() -> Form { .with_autofocus(true), ) .with_element( - form_element::Input::password() + form::Input::password() .with_name("pass") .with_label(L10n::t("password", &LOCALES_USER)) .with_help_text(L10n::t("password_help", &LOCALES_USER)), ) - .with_element(form_element::Button::submit(L10n::t( - "login", - &LOCALES_USER, - ))) + .with_element(form::Button::submit(L10n::t("login", &LOCALES_USER))) } diff --git a/pagetop/build.rs b/pagetop/build.rs index 3e2d9749..6e9dc40b 100644 --- a/pagetop/build.rs +++ b/pagetop/build.rs @@ -1,7 +1,7 @@ use pagetop_build::StaticFilesBundle; fn main() -> std::io::Result<()> { - StaticFilesBundle::from_dir("./static/theme") - .with_name("theme") + StaticFilesBundle::from_dir("./static/base") + .with_name("base") .build() } diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 09d94026..a28aa3aa 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -1,6 +1,43 @@ +use crate::core::component::{Context, ContextOp}; +use crate::html::{JavaScript, StyleSheet}; + // Context parameters. -pub const PARAM_INCLUDE_FLEX: &str = "theme.include.flex"; -pub const PARAM_INCLUDE_ICONS: &str = "theme.include.icons"; +pub const PARAM_INCLUDE_ICONS: &str = "base.include.icon"; +pub const PARAM_INCLUDE_FLEX_ASSETS: &str = "base.include.flex"; +pub const PARAM_INCLUDE_MENU_ASSETS: &str = "base.include.menu"; + +pub(crate) fn add_assets_for_base(cx: &mut Context) { + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/root.css").with_version("0.0.1"), + )); + + if let Some(true) = cx.get_param::<bool>(PARAM_INCLUDE_ICONS) { + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/icons.min.css").with_version("1.11.1"), + )); + } + + if let Some(true) = cx.get_param::<bool>(PARAM_INCLUDE_FLEX_ASSETS) { + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/flex.css").with_version("0.0.1"), + )); + } + + if let Some(true) = cx.get_param::<bool>(PARAM_INCLUDE_MENU_ASSETS) { + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/menu.css").with_version("0.0.1"), + )) + .alter(ContextOp::AddJavaScript( + JavaScript::at("/base/js/menu.js").with_version("0.0.1"), + )); + } + + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/styles.css").with_version("0.0.1"), + )); +} + +// By default, 1 pixel = 0.0625em. #[rustfmt::skip] #[derive(Default)] @@ -9,7 +46,7 @@ pub enum BreakPoint { None, /* Does not apply */ SM, /* @media screen and (max-width: 35.5em) - Applies <= 568px */ MD, /* @media screen and (max-width: 48em) - Applies <= 768px */ - LG, /* @media screen and (max-width: 64em) - Applies <= 1024px */ + LG, /* @media screen and (max-width: 62em) - Applies <= 992px */ XL, /* @media screen and (max-width: 80em) - Applies <= 1280px */ X2L, /* @media screen and (max-width: 120em) - Applies <= 1920px */ X3L, /* @media screen and (max-width: 160em) - Applies <= 2560px */ @@ -58,5 +95,8 @@ pub use site_branding::{SiteBranding, COMPONENT_BRANDING}; mod powered_by; pub use powered_by::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; -pub mod form_element; -pub use form_element::{Form, FormMethod, COMPONENT_FORM}; +pub mod menu; +pub use menu::{Menu, COMPONENT_MENU}; + +pub mod form; +pub use form::{Form, FormMethod, COMPONENT_FORM}; diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index 29708326..993fa651 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -9,8 +9,8 @@ actions_for_component!(Container); pub struct Container { weight : Weight, renderable : Renderable, - id : IdentifierValue, - classes : Classes, + id : OptionId, + classes : OptionClasses, items : TypedComponents<flex::Item>, direction : flex::Direction, wrap_align : flex::WrapAlign, @@ -46,7 +46,7 @@ impl ComponentTrait for Container { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.set_param::<bool>(PARAM_INCLUDE_FLEX, true); + cx.set_param::<bool>(PARAM_INCLUDE_FLEX_ASSETS, true); let gap = match self.gap() { flex::Gap::Default => None, @@ -81,7 +81,7 @@ impl Container { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -151,7 +151,7 @@ impl Container { // Container GETTERS. - pub fn classes(&self) -> &Classes { + pub fn classes(&self) -> &OptionClasses { &self.classes } diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index ea99be0d..4fadc4fb 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -9,9 +9,9 @@ actions_for_component!(Item); pub struct Item { weight : Weight, renderable : Renderable, - id : IdentifierValue, - item_classes : Classes, - inner_classes: Classes, + id : OptionId, + item_classes : OptionClasses, + inner_classes: OptionClasses, item_grow : flex::ItemGrow, item_shrink : flex::ItemShrink, item_size : flex::ItemSize, @@ -82,7 +82,7 @@ impl Item { } #[fn_builder] - pub fn alter_id(&mut self, id: &str) -> &mut Self { + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } @@ -162,11 +162,11 @@ impl Item { // Item GETTERS. - pub fn item_classes(&self) -> &Classes { + pub fn item_classes(&self) -> &OptionClasses { &self.item_classes } - pub fn inner_classes(&self) -> &Classes { + pub fn inner_classes(&self) -> &OptionClasses { &self.inner_classes } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 6cf1c632..d71366fb 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -81,7 +81,7 @@ impl Image { pub fn pagetop() -> Self { Image::default() - .with_source("/theme/pagetop-logo.svg") + .with_source("/base/pagetop-logo.svg") .with_classes(ClassesOp::SetDefault, IMG_FIXED) .with_size(ImageSize::Size(64, 64)) } diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index 19dbb5b2..c216444e 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -42,7 +42,7 @@ impl ComponentTrait for Menu { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.set_param::<bool>(PARAM_INCLUDE_MENU, true); + cx.set_param::<bool>(PARAM_INCLUDE_MENU_ASSETS, true); cx.set_param::<bool>(PARAM_INCLUDE_ICONS, true); PrepareMarkup::With(html! { diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 68594cd9..53c6bbe7 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -54,7 +54,7 @@ impl ComponentTrait for PoweredBy { let logo_txt = L10n::t("pagetop_logo", &LOCALES_PAGETOP); html! { span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { - img src="/theme/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} + img src="/base/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} } } } diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index b7e7a29b..5eca9298 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -2,9 +2,7 @@ use crate::prelude::*; new_handle!(THEME_INCEPTION); -static_files!(theme); - -const VERSION_INCEPTION: &str = "0.0.0"; +static_files!(base); pub struct InceptionTheme; @@ -22,34 +20,18 @@ impl ModuleTrait for InceptionTheme { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/theme", theme); + static_files_service!(scfg, "/base", base); } } impl ThemeTrait for InceptionTheme { fn after_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) + page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/normalize.min.css") + StyleSheet::at("/base/css/normalize.min.css") .with_version("8.0.1") .with_weight(-99), )) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/root.css").with_version(VERSION_INCEPTION), - )); - - if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_FLEX) { - page.alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/flex.css").with_version(VERSION_INCEPTION), - )); - } - if let Some(true) = page.context().get_param::<bool>(PARAM_INCLUDE_ICONS) { - page.alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/icons/bootstrap-icons.css").with_version("1.8.2"), - )); - } - page.alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/theme/css/styles.css").with_version(VERSION_INCEPTION), - )); + .alter_context(ContextOp::AddAssetsForBase); } } diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 70819eaf..17ff7829 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,3 +1,4 @@ +use crate::base::component::add_assets_for_base; use crate::core::theme::all::{theme_by_single_name, THEME}; use crate::core::theme::ThemeRef; use crate::html::{html, Assets, HeadScript, HeadStyles, JavaScript, Markup, StyleSheet}; @@ -23,6 +24,8 @@ pub enum ContextOp { // Scripts in head. AddHeadScript(HeadScript), RemoveHeadScript(&'static str), + // Add assets to properly use the base components. + AddAssetsForBase, } #[rustfmt::skip] @@ -63,6 +66,7 @@ impl Context { ContextOp::Theme(theme_name) => { self.theme = theme_by_single_name(theme_name).unwrap_or(*THEME); } + // Stylesheets. ContextOp::AddStyleSheet(css) => { self.stylesheet.add(css); } ContextOp::RemoveStyleSheet(path) => { self.stylesheet.remove(path); } @@ -75,6 +79,9 @@ impl Context { // Scripts in head. ContextOp::AddHeadScript(script) => { self.headscript.add(script); } ContextOp::RemoveHeadScript(path) => { self.headscript.remove(path); } + + // Add assets to properly use the base components. + ContextOp::AddAssetsForBase => { add_assets_for_base(self); } } self } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 8321d56f..4fbd3744 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -28,7 +28,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { body class=[page.body_classes().get()] { @for (region, _) in self.regions().iter() { @if let Some(content) = page.prepare_region(region) { - #(region) { (content) } + #(region) class="region" { (content) } } } } @@ -37,7 +37,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn after_prepare_body(&self, page: &mut Page) { if page.favicon().is_none() { - page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))); + page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))); } } diff --git a/pagetop/static/theme/css/flex.css b/pagetop/static/base/css/flex.css similarity index 98% rename from pagetop/static/theme/css/flex.css rename to pagetop/static/base/css/flex.css index b1145f9d..90ab5796 100644 --- a/pagetop/static/theme/css/flex.css +++ b/pagetop/static/base/css/flex.css @@ -279,8 +279,8 @@ margin-left: 0; } } -/* LG - Applies <= 1024px */ -@media screen and (max-width: 64em) { +/* LG - Applies <= 992px */ +@media screen and (max-width: 62em) { .flex-row.bp-lg { flex-direction: row; } diff --git a/pagetop/static/base/css/icons.min.css b/pagetop/static/base/css/icons.min.css new file mode 100644 index 00000000..481fffb0 --- /dev/null +++ b/pagetop/static/base/css/icons.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */@font-face{font-display:block;font-family:bootstrap-icons;src:url("../fonts/icons.woff2?v=1.11.1") format("woff2"),url("../fonts/icons.woff?v=1.11.1") format("woff")}.bi::before,[class*=" bi-"]::before,[class^=bi-]::before{display:inline-block;font-family:bootstrap-icons!important;font-style:normal;font-weight:400!important;font-variant:normal;text-transform:none;line-height:1;vertical-align:-.125em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.bi-123::before{content:"\f67f"}.bi-alarm-fill::before{content:"\f101"}.bi-alarm::before{content:"\f102"}.bi-align-bottom::before{content:"\f103"}.bi-align-center::before{content:"\f104"}.bi-align-end::before{content:"\f105"}.bi-align-middle::before{content:"\f106"}.bi-align-start::before{content:"\f107"}.bi-align-top::before{content:"\f108"}.bi-alt::before{content:"\f109"}.bi-app-indicator::before{content:"\f10a"}.bi-app::before{content:"\f10b"}.bi-archive-fill::before{content:"\f10c"}.bi-archive::before{content:"\f10d"}.bi-arrow-90deg-down::before{content:"\f10e"}.bi-arrow-90deg-left::before{content:"\f10f"}.bi-arrow-90deg-right::before{content:"\f110"}.bi-arrow-90deg-up::before{content:"\f111"}.bi-arrow-bar-down::before{content:"\f112"}.bi-arrow-bar-left::before{content:"\f113"}.bi-arrow-bar-right::before{content:"\f114"}.bi-arrow-bar-up::before{content:"\f115"}.bi-arrow-clockwise::before{content:"\f116"}.bi-arrow-counterclockwise::before{content:"\f117"}.bi-arrow-down-circle-fill::before{content:"\f118"}.bi-arrow-down-circle::before{content:"\f119"}.bi-arrow-down-left-circle-fill::before{content:"\f11a"}.bi-arrow-down-left-circle::before{content:"\f11b"}.bi-arrow-down-left-square-fill::before{content:"\f11c"}.bi-arrow-down-left-square::before{content:"\f11d"}.bi-arrow-down-left::before{content:"\f11e"}.bi-arrow-down-right-circle-fill::before{content:"\f11f"}.bi-arrow-down-right-circle::before{content:"\f120"}.bi-arrow-down-right-square-fill::before{content:"\f121"}.bi-arrow-down-right-square::before{content:"\f122"}.bi-arrow-down-right::before{content:"\f123"}.bi-arrow-down-short::before{content:"\f124"}.bi-arrow-down-square-fill::before{content:"\f125"}.bi-arrow-down-square::before{content:"\f126"}.bi-arrow-down-up::before{content:"\f127"}.bi-arrow-down::before{content:"\f128"}.bi-arrow-left-circle-fill::before{content:"\f129"}.bi-arrow-left-circle::before{content:"\f12a"}.bi-arrow-left-right::before{content:"\f12b"}.bi-arrow-left-short::before{content:"\f12c"}.bi-arrow-left-square-fill::before{content:"\f12d"}.bi-arrow-left-square::before{content:"\f12e"}.bi-arrow-left::before{content:"\f12f"}.bi-arrow-repeat::before{content:"\f130"}.bi-arrow-return-left::before{content:"\f131"}.bi-arrow-return-right::before{content:"\f132"}.bi-arrow-right-circle-fill::before{content:"\f133"}.bi-arrow-right-circle::before{content:"\f134"}.bi-arrow-right-short::before{content:"\f135"}.bi-arrow-right-square-fill::before{content:"\f136"}.bi-arrow-right-square::before{content:"\f137"}.bi-arrow-right::before{content:"\f138"}.bi-arrow-up-circle-fill::before{content:"\f139"}.bi-arrow-up-circle::before{content:"\f13a"}.bi-arrow-up-left-circle-fill::before{content:"\f13b"}.bi-arrow-up-left-circle::before{content:"\f13c"}.bi-arrow-up-left-square-fill::before{content:"\f13d"}.bi-arrow-up-left-square::before{content:"\f13e"}.bi-arrow-up-left::before{content:"\f13f"}.bi-arrow-up-right-circle-fill::before{content:"\f140"}.bi-arrow-up-right-circle::before{content:"\f141"}.bi-arrow-up-right-square-fill::before{content:"\f142"}.bi-arrow-up-right-square::before{content:"\f143"}.bi-arrow-up-right::before{content:"\f144"}.bi-arrow-up-short::before{content:"\f145"}.bi-arrow-up-square-fill::before{content:"\f146"}.bi-arrow-up-square::before{content:"\f147"}.bi-arrow-up::before{content:"\f148"}.bi-arrows-angle-contract::before{content:"\f149"}.bi-arrows-angle-expand::before{content:"\f14a"}.bi-arrows-collapse::before{content:"\f14b"}.bi-arrows-expand::before{content:"\f14c"}.bi-arrows-fullscreen::before{content:"\f14d"}.bi-arrows-move::before{content:"\f14e"}.bi-aspect-ratio-fill::before{content:"\f14f"}.bi-aspect-ratio::before{content:"\f150"}.bi-asterisk::before{content:"\f151"}.bi-at::before{content:"\f152"}.bi-award-fill::before{content:"\f153"}.bi-award::before{content:"\f154"}.bi-back::before{content:"\f155"}.bi-backspace-fill::before{content:"\f156"}.bi-backspace-reverse-fill::before{content:"\f157"}.bi-backspace-reverse::before{content:"\f158"}.bi-backspace::before{content:"\f159"}.bi-badge-3d-fill::before{content:"\f15a"}.bi-badge-3d::before{content:"\f15b"}.bi-badge-4k-fill::before{content:"\f15c"}.bi-badge-4k::before{content:"\f15d"}.bi-badge-8k-fill::before{content:"\f15e"}.bi-badge-8k::before{content:"\f15f"}.bi-badge-ad-fill::before{content:"\f160"}.bi-badge-ad::before{content:"\f161"}.bi-badge-ar-fill::before{content:"\f162"}.bi-badge-ar::before{content:"\f163"}.bi-badge-cc-fill::before{content:"\f164"}.bi-badge-cc::before{content:"\f165"}.bi-badge-hd-fill::before{content:"\f166"}.bi-badge-hd::before{content:"\f167"}.bi-badge-tm-fill::before{content:"\f168"}.bi-badge-tm::before{content:"\f169"}.bi-badge-vo-fill::before{content:"\f16a"}.bi-badge-vo::before{content:"\f16b"}.bi-badge-vr-fill::before{content:"\f16c"}.bi-badge-vr::before{content:"\f16d"}.bi-badge-wc-fill::before{content:"\f16e"}.bi-badge-wc::before{content:"\f16f"}.bi-bag-check-fill::before{content:"\f170"}.bi-bag-check::before{content:"\f171"}.bi-bag-dash-fill::before{content:"\f172"}.bi-bag-dash::before{content:"\f173"}.bi-bag-fill::before{content:"\f174"}.bi-bag-plus-fill::before{content:"\f175"}.bi-bag-plus::before{content:"\f176"}.bi-bag-x-fill::before{content:"\f177"}.bi-bag-x::before{content:"\f178"}.bi-bag::before{content:"\f179"}.bi-bar-chart-fill::before{content:"\f17a"}.bi-bar-chart-line-fill::before{content:"\f17b"}.bi-bar-chart-line::before{content:"\f17c"}.bi-bar-chart-steps::before{content:"\f17d"}.bi-bar-chart::before{content:"\f17e"}.bi-basket-fill::before{content:"\f17f"}.bi-basket::before{content:"\f180"}.bi-basket2-fill::before{content:"\f181"}.bi-basket2::before{content:"\f182"}.bi-basket3-fill::before{content:"\f183"}.bi-basket3::before{content:"\f184"}.bi-battery-charging::before{content:"\f185"}.bi-battery-full::before{content:"\f186"}.bi-battery-half::before{content:"\f187"}.bi-battery::before{content:"\f188"}.bi-bell-fill::before{content:"\f189"}.bi-bell::before{content:"\f18a"}.bi-bezier::before{content:"\f18b"}.bi-bezier2::before{content:"\f18c"}.bi-bicycle::before{content:"\f18d"}.bi-binoculars-fill::before{content:"\f18e"}.bi-binoculars::before{content:"\f18f"}.bi-blockquote-left::before{content:"\f190"}.bi-blockquote-right::before{content:"\f191"}.bi-book-fill::before{content:"\f192"}.bi-book-half::before{content:"\f193"}.bi-book::before{content:"\f194"}.bi-bookmark-check-fill::before{content:"\f195"}.bi-bookmark-check::before{content:"\f196"}.bi-bookmark-dash-fill::before{content:"\f197"}.bi-bookmark-dash::before{content:"\f198"}.bi-bookmark-fill::before{content:"\f199"}.bi-bookmark-heart-fill::before{content:"\f19a"}.bi-bookmark-heart::before{content:"\f19b"}.bi-bookmark-plus-fill::before{content:"\f19c"}.bi-bookmark-plus::before{content:"\f19d"}.bi-bookmark-star-fill::before{content:"\f19e"}.bi-bookmark-star::before{content:"\f19f"}.bi-bookmark-x-fill::before{content:"\f1a0"}.bi-bookmark-x::before{content:"\f1a1"}.bi-bookmark::before{content:"\f1a2"}.bi-bookmarks-fill::before{content:"\f1a3"}.bi-bookmarks::before{content:"\f1a4"}.bi-bookshelf::before{content:"\f1a5"}.bi-bootstrap-fill::before{content:"\f1a6"}.bi-bootstrap-reboot::before{content:"\f1a7"}.bi-bootstrap::before{content:"\f1a8"}.bi-border-all::before{content:"\f1a9"}.bi-border-bottom::before{content:"\f1aa"}.bi-border-center::before{content:"\f1ab"}.bi-border-inner::before{content:"\f1ac"}.bi-border-left::before{content:"\f1ad"}.bi-border-middle::before{content:"\f1ae"}.bi-border-outer::before{content:"\f1af"}.bi-border-right::before{content:"\f1b0"}.bi-border-style::before{content:"\f1b1"}.bi-border-top::before{content:"\f1b2"}.bi-border-width::before{content:"\f1b3"}.bi-border::before{content:"\f1b4"}.bi-bounding-box-circles::before{content:"\f1b5"}.bi-bounding-box::before{content:"\f1b6"}.bi-box-arrow-down-left::before{content:"\f1b7"}.bi-box-arrow-down-right::before{content:"\f1b8"}.bi-box-arrow-down::before{content:"\f1b9"}.bi-box-arrow-in-down-left::before{content:"\f1ba"}.bi-box-arrow-in-down-right::before{content:"\f1bb"}.bi-box-arrow-in-down::before{content:"\f1bc"}.bi-box-arrow-in-left::before{content:"\f1bd"}.bi-box-arrow-in-right::before{content:"\f1be"}.bi-box-arrow-in-up-left::before{content:"\f1bf"}.bi-box-arrow-in-up-right::before{content:"\f1c0"}.bi-box-arrow-in-up::before{content:"\f1c1"}.bi-box-arrow-left::before{content:"\f1c2"}.bi-box-arrow-right::before{content:"\f1c3"}.bi-box-arrow-up-left::before{content:"\f1c4"}.bi-box-arrow-up-right::before{content:"\f1c5"}.bi-box-arrow-up::before{content:"\f1c6"}.bi-box-seam::before{content:"\f1c7"}.bi-box::before{content:"\f1c8"}.bi-braces::before{content:"\f1c9"}.bi-bricks::before{content:"\f1ca"}.bi-briefcase-fill::before{content:"\f1cb"}.bi-briefcase::before{content:"\f1cc"}.bi-brightness-alt-high-fill::before{content:"\f1cd"}.bi-brightness-alt-high::before{content:"\f1ce"}.bi-brightness-alt-low-fill::before{content:"\f1cf"}.bi-brightness-alt-low::before{content:"\f1d0"}.bi-brightness-high-fill::before{content:"\f1d1"}.bi-brightness-high::before{content:"\f1d2"}.bi-brightness-low-fill::before{content:"\f1d3"}.bi-brightness-low::before{content:"\f1d4"}.bi-broadcast-pin::before{content:"\f1d5"}.bi-broadcast::before{content:"\f1d6"}.bi-brush-fill::before{content:"\f1d7"}.bi-brush::before{content:"\f1d8"}.bi-bucket-fill::before{content:"\f1d9"}.bi-bucket::before{content:"\f1da"}.bi-bug-fill::before{content:"\f1db"}.bi-bug::before{content:"\f1dc"}.bi-building::before{content:"\f1dd"}.bi-bullseye::before{content:"\f1de"}.bi-calculator-fill::before{content:"\f1df"}.bi-calculator::before{content:"\f1e0"}.bi-calendar-check-fill::before{content:"\f1e1"}.bi-calendar-check::before{content:"\f1e2"}.bi-calendar-date-fill::before{content:"\f1e3"}.bi-calendar-date::before{content:"\f1e4"}.bi-calendar-day-fill::before{content:"\f1e5"}.bi-calendar-day::before{content:"\f1e6"}.bi-calendar-event-fill::before{content:"\f1e7"}.bi-calendar-event::before{content:"\f1e8"}.bi-calendar-fill::before{content:"\f1e9"}.bi-calendar-minus-fill::before{content:"\f1ea"}.bi-calendar-minus::before{content:"\f1eb"}.bi-calendar-month-fill::before{content:"\f1ec"}.bi-calendar-month::before{content:"\f1ed"}.bi-calendar-plus-fill::before{content:"\f1ee"}.bi-calendar-plus::before{content:"\f1ef"}.bi-calendar-range-fill::before{content:"\f1f0"}.bi-calendar-range::before{content:"\f1f1"}.bi-calendar-week-fill::before{content:"\f1f2"}.bi-calendar-week::before{content:"\f1f3"}.bi-calendar-x-fill::before{content:"\f1f4"}.bi-calendar-x::before{content:"\f1f5"}.bi-calendar::before{content:"\f1f6"}.bi-calendar2-check-fill::before{content:"\f1f7"}.bi-calendar2-check::before{content:"\f1f8"}.bi-calendar2-date-fill::before{content:"\f1f9"}.bi-calendar2-date::before{content:"\f1fa"}.bi-calendar2-day-fill::before{content:"\f1fb"}.bi-calendar2-day::before{content:"\f1fc"}.bi-calendar2-event-fill::before{content:"\f1fd"}.bi-calendar2-event::before{content:"\f1fe"}.bi-calendar2-fill::before{content:"\f1ff"}.bi-calendar2-minus-fill::before{content:"\f200"}.bi-calendar2-minus::before{content:"\f201"}.bi-calendar2-month-fill::before{content:"\f202"}.bi-calendar2-month::before{content:"\f203"}.bi-calendar2-plus-fill::before{content:"\f204"}.bi-calendar2-plus::before{content:"\f205"}.bi-calendar2-range-fill::before{content:"\f206"}.bi-calendar2-range::before{content:"\f207"}.bi-calendar2-week-fill::before{content:"\f208"}.bi-calendar2-week::before{content:"\f209"}.bi-calendar2-x-fill::before{content:"\f20a"}.bi-calendar2-x::before{content:"\f20b"}.bi-calendar2::before{content:"\f20c"}.bi-calendar3-event-fill::before{content:"\f20d"}.bi-calendar3-event::before{content:"\f20e"}.bi-calendar3-fill::before{content:"\f20f"}.bi-calendar3-range-fill::before{content:"\f210"}.bi-calendar3-range::before{content:"\f211"}.bi-calendar3-week-fill::before{content:"\f212"}.bi-calendar3-week::before{content:"\f213"}.bi-calendar3::before{content:"\f214"}.bi-calendar4-event::before{content:"\f215"}.bi-calendar4-range::before{content:"\f216"}.bi-calendar4-week::before{content:"\f217"}.bi-calendar4::before{content:"\f218"}.bi-camera-fill::before{content:"\f219"}.bi-camera-reels-fill::before{content:"\f21a"}.bi-camera-reels::before{content:"\f21b"}.bi-camera-video-fill::before{content:"\f21c"}.bi-camera-video-off-fill::before{content:"\f21d"}.bi-camera-video-off::before{content:"\f21e"}.bi-camera-video::before{content:"\f21f"}.bi-camera::before{content:"\f220"}.bi-camera2::before{content:"\f221"}.bi-capslock-fill::before{content:"\f222"}.bi-capslock::before{content:"\f223"}.bi-card-checklist::before{content:"\f224"}.bi-card-heading::before{content:"\f225"}.bi-card-image::before{content:"\f226"}.bi-card-list::before{content:"\f227"}.bi-card-text::before{content:"\f228"}.bi-caret-down-fill::before{content:"\f229"}.bi-caret-down-square-fill::before{content:"\f22a"}.bi-caret-down-square::before{content:"\f22b"}.bi-caret-down::before{content:"\f22c"}.bi-caret-left-fill::before{content:"\f22d"}.bi-caret-left-square-fill::before{content:"\f22e"}.bi-caret-left-square::before{content:"\f22f"}.bi-caret-left::before{content:"\f230"}.bi-caret-right-fill::before{content:"\f231"}.bi-caret-right-square-fill::before{content:"\f232"}.bi-caret-right-square::before{content:"\f233"}.bi-caret-right::before{content:"\f234"}.bi-caret-up-fill::before{content:"\f235"}.bi-caret-up-square-fill::before{content:"\f236"}.bi-caret-up-square::before{content:"\f237"}.bi-caret-up::before{content:"\f238"}.bi-cart-check-fill::before{content:"\f239"}.bi-cart-check::before{content:"\f23a"}.bi-cart-dash-fill::before{content:"\f23b"}.bi-cart-dash::before{content:"\f23c"}.bi-cart-fill::before{content:"\f23d"}.bi-cart-plus-fill::before{content:"\f23e"}.bi-cart-plus::before{content:"\f23f"}.bi-cart-x-fill::before{content:"\f240"}.bi-cart-x::before{content:"\f241"}.bi-cart::before{content:"\f242"}.bi-cart2::before{content:"\f243"}.bi-cart3::before{content:"\f244"}.bi-cart4::before{content:"\f245"}.bi-cash-stack::before{content:"\f246"}.bi-cash::before{content:"\f247"}.bi-cast::before{content:"\f248"}.bi-chat-dots-fill::before{content:"\f249"}.bi-chat-dots::before{content:"\f24a"}.bi-chat-fill::before{content:"\f24b"}.bi-chat-left-dots-fill::before{content:"\f24c"}.bi-chat-left-dots::before{content:"\f24d"}.bi-chat-left-fill::before{content:"\f24e"}.bi-chat-left-quote-fill::before{content:"\f24f"}.bi-chat-left-quote::before{content:"\f250"}.bi-chat-left-text-fill::before{content:"\f251"}.bi-chat-left-text::before{content:"\f252"}.bi-chat-left::before{content:"\f253"}.bi-chat-quote-fill::before{content:"\f254"}.bi-chat-quote::before{content:"\f255"}.bi-chat-right-dots-fill::before{content:"\f256"}.bi-chat-right-dots::before{content:"\f257"}.bi-chat-right-fill::before{content:"\f258"}.bi-chat-right-quote-fill::before{content:"\f259"}.bi-chat-right-quote::before{content:"\f25a"}.bi-chat-right-text-fill::before{content:"\f25b"}.bi-chat-right-text::before{content:"\f25c"}.bi-chat-right::before{content:"\f25d"}.bi-chat-square-dots-fill::before{content:"\f25e"}.bi-chat-square-dots::before{content:"\f25f"}.bi-chat-square-fill::before{content:"\f260"}.bi-chat-square-quote-fill::before{content:"\f261"}.bi-chat-square-quote::before{content:"\f262"}.bi-chat-square-text-fill::before{content:"\f263"}.bi-chat-square-text::before{content:"\f264"}.bi-chat-square::before{content:"\f265"}.bi-chat-text-fill::before{content:"\f266"}.bi-chat-text::before{content:"\f267"}.bi-chat::before{content:"\f268"}.bi-check-all::before{content:"\f269"}.bi-check-circle-fill::before{content:"\f26a"}.bi-check-circle::before{content:"\f26b"}.bi-check-square-fill::before{content:"\f26c"}.bi-check-square::before{content:"\f26d"}.bi-check::before{content:"\f26e"}.bi-check2-all::before{content:"\f26f"}.bi-check2-circle::before{content:"\f270"}.bi-check2-square::before{content:"\f271"}.bi-check2::before{content:"\f272"}.bi-chevron-bar-contract::before{content:"\f273"}.bi-chevron-bar-down::before{content:"\f274"}.bi-chevron-bar-expand::before{content:"\f275"}.bi-chevron-bar-left::before{content:"\f276"}.bi-chevron-bar-right::before{content:"\f277"}.bi-chevron-bar-up::before{content:"\f278"}.bi-chevron-compact-down::before{content:"\f279"}.bi-chevron-compact-left::before{content:"\f27a"}.bi-chevron-compact-right::before{content:"\f27b"}.bi-chevron-compact-up::before{content:"\f27c"}.bi-chevron-contract::before{content:"\f27d"}.bi-chevron-double-down::before{content:"\f27e"}.bi-chevron-double-left::before{content:"\f27f"}.bi-chevron-double-right::before{content:"\f280"}.bi-chevron-double-up::before{content:"\f281"}.bi-chevron-down::before{content:"\f282"}.bi-chevron-expand::before{content:"\f283"}.bi-chevron-left::before{content:"\f284"}.bi-chevron-right::before{content:"\f285"}.bi-chevron-up::before{content:"\f286"}.bi-circle-fill::before{content:"\f287"}.bi-circle-half::before{content:"\f288"}.bi-circle-square::before{content:"\f289"}.bi-circle::before{content:"\f28a"}.bi-clipboard-check::before{content:"\f28b"}.bi-clipboard-data::before{content:"\f28c"}.bi-clipboard-minus::before{content:"\f28d"}.bi-clipboard-plus::before{content:"\f28e"}.bi-clipboard-x::before{content:"\f28f"}.bi-clipboard::before{content:"\f290"}.bi-clock-fill::before{content:"\f291"}.bi-clock-history::before{content:"\f292"}.bi-clock::before{content:"\f293"}.bi-cloud-arrow-down-fill::before{content:"\f294"}.bi-cloud-arrow-down::before{content:"\f295"}.bi-cloud-arrow-up-fill::before{content:"\f296"}.bi-cloud-arrow-up::before{content:"\f297"}.bi-cloud-check-fill::before{content:"\f298"}.bi-cloud-check::before{content:"\f299"}.bi-cloud-download-fill::before{content:"\f29a"}.bi-cloud-download::before{content:"\f29b"}.bi-cloud-drizzle-fill::before{content:"\f29c"}.bi-cloud-drizzle::before{content:"\f29d"}.bi-cloud-fill::before{content:"\f29e"}.bi-cloud-fog-fill::before{content:"\f29f"}.bi-cloud-fog::before{content:"\f2a0"}.bi-cloud-fog2-fill::before{content:"\f2a1"}.bi-cloud-fog2::before{content:"\f2a2"}.bi-cloud-hail-fill::before{content:"\f2a3"}.bi-cloud-hail::before{content:"\f2a4"}.bi-cloud-haze-fill::before{content:"\f2a6"}.bi-cloud-haze::before{content:"\f2a7"}.bi-cloud-haze2-fill::before{content:"\f2a8"}.bi-cloud-lightning-fill::before{content:"\f2a9"}.bi-cloud-lightning-rain-fill::before{content:"\f2aa"}.bi-cloud-lightning-rain::before{content:"\f2ab"}.bi-cloud-lightning::before{content:"\f2ac"}.bi-cloud-minus-fill::before{content:"\f2ad"}.bi-cloud-minus::before{content:"\f2ae"}.bi-cloud-moon-fill::before{content:"\f2af"}.bi-cloud-moon::before{content:"\f2b0"}.bi-cloud-plus-fill::before{content:"\f2b1"}.bi-cloud-plus::before{content:"\f2b2"}.bi-cloud-rain-fill::before{content:"\f2b3"}.bi-cloud-rain-heavy-fill::before{content:"\f2b4"}.bi-cloud-rain-heavy::before{content:"\f2b5"}.bi-cloud-rain::before{content:"\f2b6"}.bi-cloud-slash-fill::before{content:"\f2b7"}.bi-cloud-slash::before{content:"\f2b8"}.bi-cloud-sleet-fill::before{content:"\f2b9"}.bi-cloud-sleet::before{content:"\f2ba"}.bi-cloud-snow-fill::before{content:"\f2bb"}.bi-cloud-snow::before{content:"\f2bc"}.bi-cloud-sun-fill::before{content:"\f2bd"}.bi-cloud-sun::before{content:"\f2be"}.bi-cloud-upload-fill::before{content:"\f2bf"}.bi-cloud-upload::before{content:"\f2c0"}.bi-cloud::before{content:"\f2c1"}.bi-clouds-fill::before{content:"\f2c2"}.bi-clouds::before{content:"\f2c3"}.bi-cloudy-fill::before{content:"\f2c4"}.bi-cloudy::before{content:"\f2c5"}.bi-code-slash::before{content:"\f2c6"}.bi-code-square::before{content:"\f2c7"}.bi-code::before{content:"\f2c8"}.bi-collection-fill::before{content:"\f2c9"}.bi-collection-play-fill::before{content:"\f2ca"}.bi-collection-play::before{content:"\f2cb"}.bi-collection::before{content:"\f2cc"}.bi-columns-gap::before{content:"\f2cd"}.bi-columns::before{content:"\f2ce"}.bi-command::before{content:"\f2cf"}.bi-compass-fill::before{content:"\f2d0"}.bi-compass::before{content:"\f2d1"}.bi-cone-striped::before{content:"\f2d2"}.bi-cone::before{content:"\f2d3"}.bi-controller::before{content:"\f2d4"}.bi-cpu-fill::before{content:"\f2d5"}.bi-cpu::before{content:"\f2d6"}.bi-credit-card-2-back-fill::before{content:"\f2d7"}.bi-credit-card-2-back::before{content:"\f2d8"}.bi-credit-card-2-front-fill::before{content:"\f2d9"}.bi-credit-card-2-front::before{content:"\f2da"}.bi-credit-card-fill::before{content:"\f2db"}.bi-credit-card::before{content:"\f2dc"}.bi-crop::before{content:"\f2dd"}.bi-cup-fill::before{content:"\f2de"}.bi-cup-straw::before{content:"\f2df"}.bi-cup::before{content:"\f2e0"}.bi-cursor-fill::before{content:"\f2e1"}.bi-cursor-text::before{content:"\f2e2"}.bi-cursor::before{content:"\f2e3"}.bi-dash-circle-dotted::before{content:"\f2e4"}.bi-dash-circle-fill::before{content:"\f2e5"}.bi-dash-circle::before{content:"\f2e6"}.bi-dash-square-dotted::before{content:"\f2e7"}.bi-dash-square-fill::before{content:"\f2e8"}.bi-dash-square::before{content:"\f2e9"}.bi-dash::before{content:"\f2ea"}.bi-diagram-2-fill::before{content:"\f2eb"}.bi-diagram-2::before{content:"\f2ec"}.bi-diagram-3-fill::before{content:"\f2ed"}.bi-diagram-3::before{content:"\f2ee"}.bi-diamond-fill::before{content:"\f2ef"}.bi-diamond-half::before{content:"\f2f0"}.bi-diamond::before{content:"\f2f1"}.bi-dice-1-fill::before{content:"\f2f2"}.bi-dice-1::before{content:"\f2f3"}.bi-dice-2-fill::before{content:"\f2f4"}.bi-dice-2::before{content:"\f2f5"}.bi-dice-3-fill::before{content:"\f2f6"}.bi-dice-3::before{content:"\f2f7"}.bi-dice-4-fill::before{content:"\f2f8"}.bi-dice-4::before{content:"\f2f9"}.bi-dice-5-fill::before{content:"\f2fa"}.bi-dice-5::before{content:"\f2fb"}.bi-dice-6-fill::before{content:"\f2fc"}.bi-dice-6::before{content:"\f2fd"}.bi-disc-fill::before{content:"\f2fe"}.bi-disc::before{content:"\f2ff"}.bi-discord::before{content:"\f300"}.bi-display-fill::before{content:"\f301"}.bi-display::before{content:"\f302"}.bi-distribute-horizontal::before{content:"\f303"}.bi-distribute-vertical::before{content:"\f304"}.bi-door-closed-fill::before{content:"\f305"}.bi-door-closed::before{content:"\f306"}.bi-door-open-fill::before{content:"\f307"}.bi-door-open::before{content:"\f308"}.bi-dot::before{content:"\f309"}.bi-download::before{content:"\f30a"}.bi-droplet-fill::before{content:"\f30b"}.bi-droplet-half::before{content:"\f30c"}.bi-droplet::before{content:"\f30d"}.bi-earbuds::before{content:"\f30e"}.bi-easel-fill::before{content:"\f30f"}.bi-easel::before{content:"\f310"}.bi-egg-fill::before{content:"\f311"}.bi-egg-fried::before{content:"\f312"}.bi-egg::before{content:"\f313"}.bi-eject-fill::before{content:"\f314"}.bi-eject::before{content:"\f315"}.bi-emoji-angry-fill::before{content:"\f316"}.bi-emoji-angry::before{content:"\f317"}.bi-emoji-dizzy-fill::before{content:"\f318"}.bi-emoji-dizzy::before{content:"\f319"}.bi-emoji-expressionless-fill::before{content:"\f31a"}.bi-emoji-expressionless::before{content:"\f31b"}.bi-emoji-frown-fill::before{content:"\f31c"}.bi-emoji-frown::before{content:"\f31d"}.bi-emoji-heart-eyes-fill::before{content:"\f31e"}.bi-emoji-heart-eyes::before{content:"\f31f"}.bi-emoji-laughing-fill::before{content:"\f320"}.bi-emoji-laughing::before{content:"\f321"}.bi-emoji-neutral-fill::before{content:"\f322"}.bi-emoji-neutral::before{content:"\f323"}.bi-emoji-smile-fill::before{content:"\f324"}.bi-emoji-smile-upside-down-fill::before{content:"\f325"}.bi-emoji-smile-upside-down::before{content:"\f326"}.bi-emoji-smile::before{content:"\f327"}.bi-emoji-sunglasses-fill::before{content:"\f328"}.bi-emoji-sunglasses::before{content:"\f329"}.bi-emoji-wink-fill::before{content:"\f32a"}.bi-emoji-wink::before{content:"\f32b"}.bi-envelope-fill::before{content:"\f32c"}.bi-envelope-open-fill::before{content:"\f32d"}.bi-envelope-open::before{content:"\f32e"}.bi-envelope::before{content:"\f32f"}.bi-eraser-fill::before{content:"\f330"}.bi-eraser::before{content:"\f331"}.bi-exclamation-circle-fill::before{content:"\f332"}.bi-exclamation-circle::before{content:"\f333"}.bi-exclamation-diamond-fill::before{content:"\f334"}.bi-exclamation-diamond::before{content:"\f335"}.bi-exclamation-octagon-fill::before{content:"\f336"}.bi-exclamation-octagon::before{content:"\f337"}.bi-exclamation-square-fill::before{content:"\f338"}.bi-exclamation-square::before{content:"\f339"}.bi-exclamation-triangle-fill::before{content:"\f33a"}.bi-exclamation-triangle::before{content:"\f33b"}.bi-exclamation::before{content:"\f33c"}.bi-exclude::before{content:"\f33d"}.bi-eye-fill::before{content:"\f33e"}.bi-eye-slash-fill::before{content:"\f33f"}.bi-eye-slash::before{content:"\f340"}.bi-eye::before{content:"\f341"}.bi-eyedropper::before{content:"\f342"}.bi-eyeglasses::before{content:"\f343"}.bi-facebook::before{content:"\f344"}.bi-file-arrow-down-fill::before{content:"\f345"}.bi-file-arrow-down::before{content:"\f346"}.bi-file-arrow-up-fill::before{content:"\f347"}.bi-file-arrow-up::before{content:"\f348"}.bi-file-bar-graph-fill::before{content:"\f349"}.bi-file-bar-graph::before{content:"\f34a"}.bi-file-binary-fill::before{content:"\f34b"}.bi-file-binary::before{content:"\f34c"}.bi-file-break-fill::before{content:"\f34d"}.bi-file-break::before{content:"\f34e"}.bi-file-check-fill::before{content:"\f34f"}.bi-file-check::before{content:"\f350"}.bi-file-code-fill::before{content:"\f351"}.bi-file-code::before{content:"\f352"}.bi-file-diff-fill::before{content:"\f353"}.bi-file-diff::before{content:"\f354"}.bi-file-earmark-arrow-down-fill::before{content:"\f355"}.bi-file-earmark-arrow-down::before{content:"\f356"}.bi-file-earmark-arrow-up-fill::before{content:"\f357"}.bi-file-earmark-arrow-up::before{content:"\f358"}.bi-file-earmark-bar-graph-fill::before{content:"\f359"}.bi-file-earmark-bar-graph::before{content:"\f35a"}.bi-file-earmark-binary-fill::before{content:"\f35b"}.bi-file-earmark-binary::before{content:"\f35c"}.bi-file-earmark-break-fill::before{content:"\f35d"}.bi-file-earmark-break::before{content:"\f35e"}.bi-file-earmark-check-fill::before{content:"\f35f"}.bi-file-earmark-check::before{content:"\f360"}.bi-file-earmark-code-fill::before{content:"\f361"}.bi-file-earmark-code::before{content:"\f362"}.bi-file-earmark-diff-fill::before{content:"\f363"}.bi-file-earmark-diff::before{content:"\f364"}.bi-file-earmark-easel-fill::before{content:"\f365"}.bi-file-earmark-easel::before{content:"\f366"}.bi-file-earmark-excel-fill::before{content:"\f367"}.bi-file-earmark-excel::before{content:"\f368"}.bi-file-earmark-fill::before{content:"\f369"}.bi-file-earmark-font-fill::before{content:"\f36a"}.bi-file-earmark-font::before{content:"\f36b"}.bi-file-earmark-image-fill::before{content:"\f36c"}.bi-file-earmark-image::before{content:"\f36d"}.bi-file-earmark-lock-fill::before{content:"\f36e"}.bi-file-earmark-lock::before{content:"\f36f"}.bi-file-earmark-lock2-fill::before{content:"\f370"}.bi-file-earmark-lock2::before{content:"\f371"}.bi-file-earmark-medical-fill::before{content:"\f372"}.bi-file-earmark-medical::before{content:"\f373"}.bi-file-earmark-minus-fill::before{content:"\f374"}.bi-file-earmark-minus::before{content:"\f375"}.bi-file-earmark-music-fill::before{content:"\f376"}.bi-file-earmark-music::before{content:"\f377"}.bi-file-earmark-person-fill::before{content:"\f378"}.bi-file-earmark-person::before{content:"\f379"}.bi-file-earmark-play-fill::before{content:"\f37a"}.bi-file-earmark-play::before{content:"\f37b"}.bi-file-earmark-plus-fill::before{content:"\f37c"}.bi-file-earmark-plus::before{content:"\f37d"}.bi-file-earmark-post-fill::before{content:"\f37e"}.bi-file-earmark-post::before{content:"\f37f"}.bi-file-earmark-ppt-fill::before{content:"\f380"}.bi-file-earmark-ppt::before{content:"\f381"}.bi-file-earmark-richtext-fill::before{content:"\f382"}.bi-file-earmark-richtext::before{content:"\f383"}.bi-file-earmark-ruled-fill::before{content:"\f384"}.bi-file-earmark-ruled::before{content:"\f385"}.bi-file-earmark-slides-fill::before{content:"\f386"}.bi-file-earmark-slides::before{content:"\f387"}.bi-file-earmark-spreadsheet-fill::before{content:"\f388"}.bi-file-earmark-spreadsheet::before{content:"\f389"}.bi-file-earmark-text-fill::before{content:"\f38a"}.bi-file-earmark-text::before{content:"\f38b"}.bi-file-earmark-word-fill::before{content:"\f38c"}.bi-file-earmark-word::before{content:"\f38d"}.bi-file-earmark-x-fill::before{content:"\f38e"}.bi-file-earmark-x::before{content:"\f38f"}.bi-file-earmark-zip-fill::before{content:"\f390"}.bi-file-earmark-zip::before{content:"\f391"}.bi-file-earmark::before{content:"\f392"}.bi-file-easel-fill::before{content:"\f393"}.bi-file-easel::before{content:"\f394"}.bi-file-excel-fill::before{content:"\f395"}.bi-file-excel::before{content:"\f396"}.bi-file-fill::before{content:"\f397"}.bi-file-font-fill::before{content:"\f398"}.bi-file-font::before{content:"\f399"}.bi-file-image-fill::before{content:"\f39a"}.bi-file-image::before{content:"\f39b"}.bi-file-lock-fill::before{content:"\f39c"}.bi-file-lock::before{content:"\f39d"}.bi-file-lock2-fill::before{content:"\f39e"}.bi-file-lock2::before{content:"\f39f"}.bi-file-medical-fill::before{content:"\f3a0"}.bi-file-medical::before{content:"\f3a1"}.bi-file-minus-fill::before{content:"\f3a2"}.bi-file-minus::before{content:"\f3a3"}.bi-file-music-fill::before{content:"\f3a4"}.bi-file-music::before{content:"\f3a5"}.bi-file-person-fill::before{content:"\f3a6"}.bi-file-person::before{content:"\f3a7"}.bi-file-play-fill::before{content:"\f3a8"}.bi-file-play::before{content:"\f3a9"}.bi-file-plus-fill::before{content:"\f3aa"}.bi-file-plus::before{content:"\f3ab"}.bi-file-post-fill::before{content:"\f3ac"}.bi-file-post::before{content:"\f3ad"}.bi-file-ppt-fill::before{content:"\f3ae"}.bi-file-ppt::before{content:"\f3af"}.bi-file-richtext-fill::before{content:"\f3b0"}.bi-file-richtext::before{content:"\f3b1"}.bi-file-ruled-fill::before{content:"\f3b2"}.bi-file-ruled::before{content:"\f3b3"}.bi-file-slides-fill::before{content:"\f3b4"}.bi-file-slides::before{content:"\f3b5"}.bi-file-spreadsheet-fill::before{content:"\f3b6"}.bi-file-spreadsheet::before{content:"\f3b7"}.bi-file-text-fill::before{content:"\f3b8"}.bi-file-text::before{content:"\f3b9"}.bi-file-word-fill::before{content:"\f3ba"}.bi-file-word::before{content:"\f3bb"}.bi-file-x-fill::before{content:"\f3bc"}.bi-file-x::before{content:"\f3bd"}.bi-file-zip-fill::before{content:"\f3be"}.bi-file-zip::before{content:"\f3bf"}.bi-file::before{content:"\f3c0"}.bi-files-alt::before{content:"\f3c1"}.bi-files::before{content:"\f3c2"}.bi-film::before{content:"\f3c3"}.bi-filter-circle-fill::before{content:"\f3c4"}.bi-filter-circle::before{content:"\f3c5"}.bi-filter-left::before{content:"\f3c6"}.bi-filter-right::before{content:"\f3c7"}.bi-filter-square-fill::before{content:"\f3c8"}.bi-filter-square::before{content:"\f3c9"}.bi-filter::before{content:"\f3ca"}.bi-flag-fill::before{content:"\f3cb"}.bi-flag::before{content:"\f3cc"}.bi-flower1::before{content:"\f3cd"}.bi-flower2::before{content:"\f3ce"}.bi-flower3::before{content:"\f3cf"}.bi-folder-check::before{content:"\f3d0"}.bi-folder-fill::before{content:"\f3d1"}.bi-folder-minus::before{content:"\f3d2"}.bi-folder-plus::before{content:"\f3d3"}.bi-folder-symlink-fill::before{content:"\f3d4"}.bi-folder-symlink::before{content:"\f3d5"}.bi-folder-x::before{content:"\f3d6"}.bi-folder::before{content:"\f3d7"}.bi-folder2-open::before{content:"\f3d8"}.bi-folder2::before{content:"\f3d9"}.bi-fonts::before{content:"\f3da"}.bi-forward-fill::before{content:"\f3db"}.bi-forward::before{content:"\f3dc"}.bi-front::before{content:"\f3dd"}.bi-fullscreen-exit::before{content:"\f3de"}.bi-fullscreen::before{content:"\f3df"}.bi-funnel-fill::before{content:"\f3e0"}.bi-funnel::before{content:"\f3e1"}.bi-gear-fill::before{content:"\f3e2"}.bi-gear-wide-connected::before{content:"\f3e3"}.bi-gear-wide::before{content:"\f3e4"}.bi-gear::before{content:"\f3e5"}.bi-gem::before{content:"\f3e6"}.bi-geo-alt-fill::before{content:"\f3e7"}.bi-geo-alt::before{content:"\f3e8"}.bi-geo-fill::before{content:"\f3e9"}.bi-geo::before{content:"\f3ea"}.bi-gift-fill::before{content:"\f3eb"}.bi-gift::before{content:"\f3ec"}.bi-github::before{content:"\f3ed"}.bi-globe::before{content:"\f3ee"}.bi-globe2::before{content:"\f3ef"}.bi-google::before{content:"\f3f0"}.bi-graph-down::before{content:"\f3f1"}.bi-graph-up::before{content:"\f3f2"}.bi-grid-1x2-fill::before{content:"\f3f3"}.bi-grid-1x2::before{content:"\f3f4"}.bi-grid-3x2-gap-fill::before{content:"\f3f5"}.bi-grid-3x2-gap::before{content:"\f3f6"}.bi-grid-3x2::before{content:"\f3f7"}.bi-grid-3x3-gap-fill::before{content:"\f3f8"}.bi-grid-3x3-gap::before{content:"\f3f9"}.bi-grid-3x3::before{content:"\f3fa"}.bi-grid-fill::before{content:"\f3fb"}.bi-grid::before{content:"\f3fc"}.bi-grip-horizontal::before{content:"\f3fd"}.bi-grip-vertical::before{content:"\f3fe"}.bi-hammer::before{content:"\f3ff"}.bi-hand-index-fill::before{content:"\f400"}.bi-hand-index-thumb-fill::before{content:"\f401"}.bi-hand-index-thumb::before{content:"\f402"}.bi-hand-index::before{content:"\f403"}.bi-hand-thumbs-down-fill::before{content:"\f404"}.bi-hand-thumbs-down::before{content:"\f405"}.bi-hand-thumbs-up-fill::before{content:"\f406"}.bi-hand-thumbs-up::before{content:"\f407"}.bi-handbag-fill::before{content:"\f408"}.bi-handbag::before{content:"\f409"}.bi-hash::before{content:"\f40a"}.bi-hdd-fill::before{content:"\f40b"}.bi-hdd-network-fill::before{content:"\f40c"}.bi-hdd-network::before{content:"\f40d"}.bi-hdd-rack-fill::before{content:"\f40e"}.bi-hdd-rack::before{content:"\f40f"}.bi-hdd-stack-fill::before{content:"\f410"}.bi-hdd-stack::before{content:"\f411"}.bi-hdd::before{content:"\f412"}.bi-headphones::before{content:"\f413"}.bi-headset::before{content:"\f414"}.bi-heart-fill::before{content:"\f415"}.bi-heart-half::before{content:"\f416"}.bi-heart::before{content:"\f417"}.bi-heptagon-fill::before{content:"\f418"}.bi-heptagon-half::before{content:"\f419"}.bi-heptagon::before{content:"\f41a"}.bi-hexagon-fill::before{content:"\f41b"}.bi-hexagon-half::before{content:"\f41c"}.bi-hexagon::before{content:"\f41d"}.bi-hourglass-bottom::before{content:"\f41e"}.bi-hourglass-split::before{content:"\f41f"}.bi-hourglass-top::before{content:"\f420"}.bi-hourglass::before{content:"\f421"}.bi-house-door-fill::before{content:"\f422"}.bi-house-door::before{content:"\f423"}.bi-house-fill::before{content:"\f424"}.bi-house::before{content:"\f425"}.bi-hr::before{content:"\f426"}.bi-hurricane::before{content:"\f427"}.bi-image-alt::before{content:"\f428"}.bi-image-fill::before{content:"\f429"}.bi-image::before{content:"\f42a"}.bi-images::before{content:"\f42b"}.bi-inbox-fill::before{content:"\f42c"}.bi-inbox::before{content:"\f42d"}.bi-inboxes-fill::before{content:"\f42e"}.bi-inboxes::before{content:"\f42f"}.bi-info-circle-fill::before{content:"\f430"}.bi-info-circle::before{content:"\f431"}.bi-info-square-fill::before{content:"\f432"}.bi-info-square::before{content:"\f433"}.bi-info::before{content:"\f434"}.bi-input-cursor-text::before{content:"\f435"}.bi-input-cursor::before{content:"\f436"}.bi-instagram::before{content:"\f437"}.bi-intersect::before{content:"\f438"}.bi-journal-album::before{content:"\f439"}.bi-journal-arrow-down::before{content:"\f43a"}.bi-journal-arrow-up::before{content:"\f43b"}.bi-journal-bookmark-fill::before{content:"\f43c"}.bi-journal-bookmark::before{content:"\f43d"}.bi-journal-check::before{content:"\f43e"}.bi-journal-code::before{content:"\f43f"}.bi-journal-medical::before{content:"\f440"}.bi-journal-minus::before{content:"\f441"}.bi-journal-plus::before{content:"\f442"}.bi-journal-richtext::before{content:"\f443"}.bi-journal-text::before{content:"\f444"}.bi-journal-x::before{content:"\f445"}.bi-journal::before{content:"\f446"}.bi-journals::before{content:"\f447"}.bi-joystick::before{content:"\f448"}.bi-justify-left::before{content:"\f449"}.bi-justify-right::before{content:"\f44a"}.bi-justify::before{content:"\f44b"}.bi-kanban-fill::before{content:"\f44c"}.bi-kanban::before{content:"\f44d"}.bi-key-fill::before{content:"\f44e"}.bi-key::before{content:"\f44f"}.bi-keyboard-fill::before{content:"\f450"}.bi-keyboard::before{content:"\f451"}.bi-ladder::before{content:"\f452"}.bi-lamp-fill::before{content:"\f453"}.bi-lamp::before{content:"\f454"}.bi-laptop-fill::before{content:"\f455"}.bi-laptop::before{content:"\f456"}.bi-layer-backward::before{content:"\f457"}.bi-layer-forward::before{content:"\f458"}.bi-layers-fill::before{content:"\f459"}.bi-layers-half::before{content:"\f45a"}.bi-layers::before{content:"\f45b"}.bi-layout-sidebar-inset-reverse::before{content:"\f45c"}.bi-layout-sidebar-inset::before{content:"\f45d"}.bi-layout-sidebar-reverse::before{content:"\f45e"}.bi-layout-sidebar::before{content:"\f45f"}.bi-layout-split::before{content:"\f460"}.bi-layout-text-sidebar-reverse::before{content:"\f461"}.bi-layout-text-sidebar::before{content:"\f462"}.bi-layout-text-window-reverse::before{content:"\f463"}.bi-layout-text-window::before{content:"\f464"}.bi-layout-three-columns::before{content:"\f465"}.bi-layout-wtf::before{content:"\f466"}.bi-life-preserver::before{content:"\f467"}.bi-lightbulb-fill::before{content:"\f468"}.bi-lightbulb-off-fill::before{content:"\f469"}.bi-lightbulb-off::before{content:"\f46a"}.bi-lightbulb::before{content:"\f46b"}.bi-lightning-charge-fill::before{content:"\f46c"}.bi-lightning-charge::before{content:"\f46d"}.bi-lightning-fill::before{content:"\f46e"}.bi-lightning::before{content:"\f46f"}.bi-link-45deg::before{content:"\f470"}.bi-link::before{content:"\f471"}.bi-linkedin::before{content:"\f472"}.bi-list-check::before{content:"\f473"}.bi-list-nested::before{content:"\f474"}.bi-list-ol::before{content:"\f475"}.bi-list-stars::before{content:"\f476"}.bi-list-task::before{content:"\f477"}.bi-list-ul::before{content:"\f478"}.bi-list::before{content:"\f479"}.bi-lock-fill::before{content:"\f47a"}.bi-lock::before{content:"\f47b"}.bi-mailbox::before{content:"\f47c"}.bi-mailbox2::before{content:"\f47d"}.bi-map-fill::before{content:"\f47e"}.bi-map::before{content:"\f47f"}.bi-markdown-fill::before{content:"\f480"}.bi-markdown::before{content:"\f481"}.bi-mask::before{content:"\f482"}.bi-megaphone-fill::before{content:"\f483"}.bi-megaphone::before{content:"\f484"}.bi-menu-app-fill::before{content:"\f485"}.bi-menu-app::before{content:"\f486"}.bi-menu-button-fill::before{content:"\f487"}.bi-menu-button-wide-fill::before{content:"\f488"}.bi-menu-button-wide::before{content:"\f489"}.bi-menu-button::before{content:"\f48a"}.bi-menu-down::before{content:"\f48b"}.bi-menu-up::before{content:"\f48c"}.bi-mic-fill::before{content:"\f48d"}.bi-mic-mute-fill::before{content:"\f48e"}.bi-mic-mute::before{content:"\f48f"}.bi-mic::before{content:"\f490"}.bi-minecart-loaded::before{content:"\f491"}.bi-minecart::before{content:"\f492"}.bi-moisture::before{content:"\f493"}.bi-moon-fill::before{content:"\f494"}.bi-moon-stars-fill::before{content:"\f495"}.bi-moon-stars::before{content:"\f496"}.bi-moon::before{content:"\f497"}.bi-mouse-fill::before{content:"\f498"}.bi-mouse::before{content:"\f499"}.bi-mouse2-fill::before{content:"\f49a"}.bi-mouse2::before{content:"\f49b"}.bi-mouse3-fill::before{content:"\f49c"}.bi-mouse3::before{content:"\f49d"}.bi-music-note-beamed::before{content:"\f49e"}.bi-music-note-list::before{content:"\f49f"}.bi-music-note::before{content:"\f4a0"}.bi-music-player-fill::before{content:"\f4a1"}.bi-music-player::before{content:"\f4a2"}.bi-newspaper::before{content:"\f4a3"}.bi-node-minus-fill::before{content:"\f4a4"}.bi-node-minus::before{content:"\f4a5"}.bi-node-plus-fill::before{content:"\f4a6"}.bi-node-plus::before{content:"\f4a7"}.bi-nut-fill::before{content:"\f4a8"}.bi-nut::before{content:"\f4a9"}.bi-octagon-fill::before{content:"\f4aa"}.bi-octagon-half::before{content:"\f4ab"}.bi-octagon::before{content:"\f4ac"}.bi-option::before{content:"\f4ad"}.bi-outlet::before{content:"\f4ae"}.bi-paint-bucket::before{content:"\f4af"}.bi-palette-fill::before{content:"\f4b0"}.bi-palette::before{content:"\f4b1"}.bi-palette2::before{content:"\f4b2"}.bi-paperclip::before{content:"\f4b3"}.bi-paragraph::before{content:"\f4b4"}.bi-patch-check-fill::before{content:"\f4b5"}.bi-patch-check::before{content:"\f4b6"}.bi-patch-exclamation-fill::before{content:"\f4b7"}.bi-patch-exclamation::before{content:"\f4b8"}.bi-patch-minus-fill::before{content:"\f4b9"}.bi-patch-minus::before{content:"\f4ba"}.bi-patch-plus-fill::before{content:"\f4bb"}.bi-patch-plus::before{content:"\f4bc"}.bi-patch-question-fill::before{content:"\f4bd"}.bi-patch-question::before{content:"\f4be"}.bi-pause-btn-fill::before{content:"\f4bf"}.bi-pause-btn::before{content:"\f4c0"}.bi-pause-circle-fill::before{content:"\f4c1"}.bi-pause-circle::before{content:"\f4c2"}.bi-pause-fill::before{content:"\f4c3"}.bi-pause::before{content:"\f4c4"}.bi-peace-fill::before{content:"\f4c5"}.bi-peace::before{content:"\f4c6"}.bi-pen-fill::before{content:"\f4c7"}.bi-pen::before{content:"\f4c8"}.bi-pencil-fill::before{content:"\f4c9"}.bi-pencil-square::before{content:"\f4ca"}.bi-pencil::before{content:"\f4cb"}.bi-pentagon-fill::before{content:"\f4cc"}.bi-pentagon-half::before{content:"\f4cd"}.bi-pentagon::before{content:"\f4ce"}.bi-people-fill::before{content:"\f4cf"}.bi-people::before{content:"\f4d0"}.bi-percent::before{content:"\f4d1"}.bi-person-badge-fill::before{content:"\f4d2"}.bi-person-badge::before{content:"\f4d3"}.bi-person-bounding-box::before{content:"\f4d4"}.bi-person-check-fill::before{content:"\f4d5"}.bi-person-check::before{content:"\f4d6"}.bi-person-circle::before{content:"\f4d7"}.bi-person-dash-fill::before{content:"\f4d8"}.bi-person-dash::before{content:"\f4d9"}.bi-person-fill::before{content:"\f4da"}.bi-person-lines-fill::before{content:"\f4db"}.bi-person-plus-fill::before{content:"\f4dc"}.bi-person-plus::before{content:"\f4dd"}.bi-person-square::before{content:"\f4de"}.bi-person-x-fill::before{content:"\f4df"}.bi-person-x::before{content:"\f4e0"}.bi-person::before{content:"\f4e1"}.bi-phone-fill::before{content:"\f4e2"}.bi-phone-landscape-fill::before{content:"\f4e3"}.bi-phone-landscape::before{content:"\f4e4"}.bi-phone-vibrate-fill::before{content:"\f4e5"}.bi-phone-vibrate::before{content:"\f4e6"}.bi-phone::before{content:"\f4e7"}.bi-pie-chart-fill::before{content:"\f4e8"}.bi-pie-chart::before{content:"\f4e9"}.bi-pin-angle-fill::before{content:"\f4ea"}.bi-pin-angle::before{content:"\f4eb"}.bi-pin-fill::before{content:"\f4ec"}.bi-pin::before{content:"\f4ed"}.bi-pip-fill::before{content:"\f4ee"}.bi-pip::before{content:"\f4ef"}.bi-play-btn-fill::before{content:"\f4f0"}.bi-play-btn::before{content:"\f4f1"}.bi-play-circle-fill::before{content:"\f4f2"}.bi-play-circle::before{content:"\f4f3"}.bi-play-fill::before{content:"\f4f4"}.bi-play::before{content:"\f4f5"}.bi-plug-fill::before{content:"\f4f6"}.bi-plug::before{content:"\f4f7"}.bi-plus-circle-dotted::before{content:"\f4f8"}.bi-plus-circle-fill::before{content:"\f4f9"}.bi-plus-circle::before{content:"\f4fa"}.bi-plus-square-dotted::before{content:"\f4fb"}.bi-plus-square-fill::before{content:"\f4fc"}.bi-plus-square::before{content:"\f4fd"}.bi-plus::before{content:"\f4fe"}.bi-power::before{content:"\f4ff"}.bi-printer-fill::before{content:"\f500"}.bi-printer::before{content:"\f501"}.bi-puzzle-fill::before{content:"\f502"}.bi-puzzle::before{content:"\f503"}.bi-question-circle-fill::before{content:"\f504"}.bi-question-circle::before{content:"\f505"}.bi-question-diamond-fill::before{content:"\f506"}.bi-question-diamond::before{content:"\f507"}.bi-question-octagon-fill::before{content:"\f508"}.bi-question-octagon::before{content:"\f509"}.bi-question-square-fill::before{content:"\f50a"}.bi-question-square::before{content:"\f50b"}.bi-question::before{content:"\f50c"}.bi-rainbow::before{content:"\f50d"}.bi-receipt-cutoff::before{content:"\f50e"}.bi-receipt::before{content:"\f50f"}.bi-reception-0::before{content:"\f510"}.bi-reception-1::before{content:"\f511"}.bi-reception-2::before{content:"\f512"}.bi-reception-3::before{content:"\f513"}.bi-reception-4::before{content:"\f514"}.bi-record-btn-fill::before{content:"\f515"}.bi-record-btn::before{content:"\f516"}.bi-record-circle-fill::before{content:"\f517"}.bi-record-circle::before{content:"\f518"}.bi-record-fill::before{content:"\f519"}.bi-record::before{content:"\f51a"}.bi-record2-fill::before{content:"\f51b"}.bi-record2::before{content:"\f51c"}.bi-reply-all-fill::before{content:"\f51d"}.bi-reply-all::before{content:"\f51e"}.bi-reply-fill::before{content:"\f51f"}.bi-reply::before{content:"\f520"}.bi-rss-fill::before{content:"\f521"}.bi-rss::before{content:"\f522"}.bi-rulers::before{content:"\f523"}.bi-save-fill::before{content:"\f524"}.bi-save::before{content:"\f525"}.bi-save2-fill::before{content:"\f526"}.bi-save2::before{content:"\f527"}.bi-scissors::before{content:"\f528"}.bi-screwdriver::before{content:"\f529"}.bi-search::before{content:"\f52a"}.bi-segmented-nav::before{content:"\f52b"}.bi-server::before{content:"\f52c"}.bi-share-fill::before{content:"\f52d"}.bi-share::before{content:"\f52e"}.bi-shield-check::before{content:"\f52f"}.bi-shield-exclamation::before{content:"\f530"}.bi-shield-fill-check::before{content:"\f531"}.bi-shield-fill-exclamation::before{content:"\f532"}.bi-shield-fill-minus::before{content:"\f533"}.bi-shield-fill-plus::before{content:"\f534"}.bi-shield-fill-x::before{content:"\f535"}.bi-shield-fill::before{content:"\f536"}.bi-shield-lock-fill::before{content:"\f537"}.bi-shield-lock::before{content:"\f538"}.bi-shield-minus::before{content:"\f539"}.bi-shield-plus::before{content:"\f53a"}.bi-shield-shaded::before{content:"\f53b"}.bi-shield-slash-fill::before{content:"\f53c"}.bi-shield-slash::before{content:"\f53d"}.bi-shield-x::before{content:"\f53e"}.bi-shield::before{content:"\f53f"}.bi-shift-fill::before{content:"\f540"}.bi-shift::before{content:"\f541"}.bi-shop-window::before{content:"\f542"}.bi-shop::before{content:"\f543"}.bi-shuffle::before{content:"\f544"}.bi-signpost-2-fill::before{content:"\f545"}.bi-signpost-2::before{content:"\f546"}.bi-signpost-fill::before{content:"\f547"}.bi-signpost-split-fill::before{content:"\f548"}.bi-signpost-split::before{content:"\f549"}.bi-signpost::before{content:"\f54a"}.bi-sim-fill::before{content:"\f54b"}.bi-sim::before{content:"\f54c"}.bi-skip-backward-btn-fill::before{content:"\f54d"}.bi-skip-backward-btn::before{content:"\f54e"}.bi-skip-backward-circle-fill::before{content:"\f54f"}.bi-skip-backward-circle::before{content:"\f550"}.bi-skip-backward-fill::before{content:"\f551"}.bi-skip-backward::before{content:"\f552"}.bi-skip-end-btn-fill::before{content:"\f553"}.bi-skip-end-btn::before{content:"\f554"}.bi-skip-end-circle-fill::before{content:"\f555"}.bi-skip-end-circle::before{content:"\f556"}.bi-skip-end-fill::before{content:"\f557"}.bi-skip-end::before{content:"\f558"}.bi-skip-forward-btn-fill::before{content:"\f559"}.bi-skip-forward-btn::before{content:"\f55a"}.bi-skip-forward-circle-fill::before{content:"\f55b"}.bi-skip-forward-circle::before{content:"\f55c"}.bi-skip-forward-fill::before{content:"\f55d"}.bi-skip-forward::before{content:"\f55e"}.bi-skip-start-btn-fill::before{content:"\f55f"}.bi-skip-start-btn::before{content:"\f560"}.bi-skip-start-circle-fill::before{content:"\f561"}.bi-skip-start-circle::before{content:"\f562"}.bi-skip-start-fill::before{content:"\f563"}.bi-skip-start::before{content:"\f564"}.bi-slack::before{content:"\f565"}.bi-slash-circle-fill::before{content:"\f566"}.bi-slash-circle::before{content:"\f567"}.bi-slash-square-fill::before{content:"\f568"}.bi-slash-square::before{content:"\f569"}.bi-slash::before{content:"\f56a"}.bi-sliders::before{content:"\f56b"}.bi-smartwatch::before{content:"\f56c"}.bi-snow::before{content:"\f56d"}.bi-snow2::before{content:"\f56e"}.bi-snow3::before{content:"\f56f"}.bi-sort-alpha-down-alt::before{content:"\f570"}.bi-sort-alpha-down::before{content:"\f571"}.bi-sort-alpha-up-alt::before{content:"\f572"}.bi-sort-alpha-up::before{content:"\f573"}.bi-sort-down-alt::before{content:"\f574"}.bi-sort-down::before{content:"\f575"}.bi-sort-numeric-down-alt::before{content:"\f576"}.bi-sort-numeric-down::before{content:"\f577"}.bi-sort-numeric-up-alt::before{content:"\f578"}.bi-sort-numeric-up::before{content:"\f579"}.bi-sort-up-alt::before{content:"\f57a"}.bi-sort-up::before{content:"\f57b"}.bi-soundwave::before{content:"\f57c"}.bi-speaker-fill::before{content:"\f57d"}.bi-speaker::before{content:"\f57e"}.bi-speedometer::before{content:"\f57f"}.bi-speedometer2::before{content:"\f580"}.bi-spellcheck::before{content:"\f581"}.bi-square-fill::before{content:"\f582"}.bi-square-half::before{content:"\f583"}.bi-square::before{content:"\f584"}.bi-stack::before{content:"\f585"}.bi-star-fill::before{content:"\f586"}.bi-star-half::before{content:"\f587"}.bi-star::before{content:"\f588"}.bi-stars::before{content:"\f589"}.bi-stickies-fill::before{content:"\f58a"}.bi-stickies::before{content:"\f58b"}.bi-sticky-fill::before{content:"\f58c"}.bi-sticky::before{content:"\f58d"}.bi-stop-btn-fill::before{content:"\f58e"}.bi-stop-btn::before{content:"\f58f"}.bi-stop-circle-fill::before{content:"\f590"}.bi-stop-circle::before{content:"\f591"}.bi-stop-fill::before{content:"\f592"}.bi-stop::before{content:"\f593"}.bi-stoplights-fill::before{content:"\f594"}.bi-stoplights::before{content:"\f595"}.bi-stopwatch-fill::before{content:"\f596"}.bi-stopwatch::before{content:"\f597"}.bi-subtract::before{content:"\f598"}.bi-suit-club-fill::before{content:"\f599"}.bi-suit-club::before{content:"\f59a"}.bi-suit-diamond-fill::before{content:"\f59b"}.bi-suit-diamond::before{content:"\f59c"}.bi-suit-heart-fill::before{content:"\f59d"}.bi-suit-heart::before{content:"\f59e"}.bi-suit-spade-fill::before{content:"\f59f"}.bi-suit-spade::before{content:"\f5a0"}.bi-sun-fill::before{content:"\f5a1"}.bi-sun::before{content:"\f5a2"}.bi-sunglasses::before{content:"\f5a3"}.bi-sunrise-fill::before{content:"\f5a4"}.bi-sunrise::before{content:"\f5a5"}.bi-sunset-fill::before{content:"\f5a6"}.bi-sunset::before{content:"\f5a7"}.bi-symmetry-horizontal::before{content:"\f5a8"}.bi-symmetry-vertical::before{content:"\f5a9"}.bi-table::before{content:"\f5aa"}.bi-tablet-fill::before{content:"\f5ab"}.bi-tablet-landscape-fill::before{content:"\f5ac"}.bi-tablet-landscape::before{content:"\f5ad"}.bi-tablet::before{content:"\f5ae"}.bi-tag-fill::before{content:"\f5af"}.bi-tag::before{content:"\f5b0"}.bi-tags-fill::before{content:"\f5b1"}.bi-tags::before{content:"\f5b2"}.bi-telegram::before{content:"\f5b3"}.bi-telephone-fill::before{content:"\f5b4"}.bi-telephone-forward-fill::before{content:"\f5b5"}.bi-telephone-forward::before{content:"\f5b6"}.bi-telephone-inbound-fill::before{content:"\f5b7"}.bi-telephone-inbound::before{content:"\f5b8"}.bi-telephone-minus-fill::before{content:"\f5b9"}.bi-telephone-minus::before{content:"\f5ba"}.bi-telephone-outbound-fill::before{content:"\f5bb"}.bi-telephone-outbound::before{content:"\f5bc"}.bi-telephone-plus-fill::before{content:"\f5bd"}.bi-telephone-plus::before{content:"\f5be"}.bi-telephone-x-fill::before{content:"\f5bf"}.bi-telephone-x::before{content:"\f5c0"}.bi-telephone::before{content:"\f5c1"}.bi-terminal-fill::before{content:"\f5c2"}.bi-terminal::before{content:"\f5c3"}.bi-text-center::before{content:"\f5c4"}.bi-text-indent-left::before{content:"\f5c5"}.bi-text-indent-right::before{content:"\f5c6"}.bi-text-left::before{content:"\f5c7"}.bi-text-paragraph::before{content:"\f5c8"}.bi-text-right::before{content:"\f5c9"}.bi-textarea-resize::before{content:"\f5ca"}.bi-textarea-t::before{content:"\f5cb"}.bi-textarea::before{content:"\f5cc"}.bi-thermometer-half::before{content:"\f5cd"}.bi-thermometer-high::before{content:"\f5ce"}.bi-thermometer-low::before{content:"\f5cf"}.bi-thermometer-snow::before{content:"\f5d0"}.bi-thermometer-sun::before{content:"\f5d1"}.bi-thermometer::before{content:"\f5d2"}.bi-three-dots-vertical::before{content:"\f5d3"}.bi-three-dots::before{content:"\f5d4"}.bi-toggle-off::before{content:"\f5d5"}.bi-toggle-on::before{content:"\f5d6"}.bi-toggle2-off::before{content:"\f5d7"}.bi-toggle2-on::before{content:"\f5d8"}.bi-toggles::before{content:"\f5d9"}.bi-toggles2::before{content:"\f5da"}.bi-tools::before{content:"\f5db"}.bi-tornado::before{content:"\f5dc"}.bi-trash-fill::before{content:"\f5dd"}.bi-trash::before{content:"\f5de"}.bi-trash2-fill::before{content:"\f5df"}.bi-trash2::before{content:"\f5e0"}.bi-tree-fill::before{content:"\f5e1"}.bi-tree::before{content:"\f5e2"}.bi-triangle-fill::before{content:"\f5e3"}.bi-triangle-half::before{content:"\f5e4"}.bi-triangle::before{content:"\f5e5"}.bi-trophy-fill::before{content:"\f5e6"}.bi-trophy::before{content:"\f5e7"}.bi-tropical-storm::before{content:"\f5e8"}.bi-truck-flatbed::before{content:"\f5e9"}.bi-truck::before{content:"\f5ea"}.bi-tsunami::before{content:"\f5eb"}.bi-tv-fill::before{content:"\f5ec"}.bi-tv::before{content:"\f5ed"}.bi-twitch::before{content:"\f5ee"}.bi-twitter::before{content:"\f5ef"}.bi-type-bold::before{content:"\f5f0"}.bi-type-h1::before{content:"\f5f1"}.bi-type-h2::before{content:"\f5f2"}.bi-type-h3::before{content:"\f5f3"}.bi-type-italic::before{content:"\f5f4"}.bi-type-strikethrough::before{content:"\f5f5"}.bi-type-underline::before{content:"\f5f6"}.bi-type::before{content:"\f5f7"}.bi-ui-checks-grid::before{content:"\f5f8"}.bi-ui-checks::before{content:"\f5f9"}.bi-ui-radios-grid::before{content:"\f5fa"}.bi-ui-radios::before{content:"\f5fb"}.bi-umbrella-fill::before{content:"\f5fc"}.bi-umbrella::before{content:"\f5fd"}.bi-union::before{content:"\f5fe"}.bi-unlock-fill::before{content:"\f5ff"}.bi-unlock::before{content:"\f600"}.bi-upc-scan::before{content:"\f601"}.bi-upc::before{content:"\f602"}.bi-upload::before{content:"\f603"}.bi-vector-pen::before{content:"\f604"}.bi-view-list::before{content:"\f605"}.bi-view-stacked::before{content:"\f606"}.bi-vinyl-fill::before{content:"\f607"}.bi-vinyl::before{content:"\f608"}.bi-voicemail::before{content:"\f609"}.bi-volume-down-fill::before{content:"\f60a"}.bi-volume-down::before{content:"\f60b"}.bi-volume-mute-fill::before{content:"\f60c"}.bi-volume-mute::before{content:"\f60d"}.bi-volume-off-fill::before{content:"\f60e"}.bi-volume-off::before{content:"\f60f"}.bi-volume-up-fill::before{content:"\f610"}.bi-volume-up::before{content:"\f611"}.bi-vr::before{content:"\f612"}.bi-wallet-fill::before{content:"\f613"}.bi-wallet::before{content:"\f614"}.bi-wallet2::before{content:"\f615"}.bi-watch::before{content:"\f616"}.bi-water::before{content:"\f617"}.bi-whatsapp::before{content:"\f618"}.bi-wifi-1::before{content:"\f619"}.bi-wifi-2::before{content:"\f61a"}.bi-wifi-off::before{content:"\f61b"}.bi-wifi::before{content:"\f61c"}.bi-wind::before{content:"\f61d"}.bi-window-dock::before{content:"\f61e"}.bi-window-sidebar::before{content:"\f61f"}.bi-window::before{content:"\f620"}.bi-wrench::before{content:"\f621"}.bi-x-circle-fill::before{content:"\f622"}.bi-x-circle::before{content:"\f623"}.bi-x-diamond-fill::before{content:"\f624"}.bi-x-diamond::before{content:"\f625"}.bi-x-octagon-fill::before{content:"\f626"}.bi-x-octagon::before{content:"\f627"}.bi-x-square-fill::before{content:"\f628"}.bi-x-square::before{content:"\f629"}.bi-x::before{content:"\f62a"}.bi-youtube::before{content:"\f62b"}.bi-zoom-in::before{content:"\f62c"}.bi-zoom-out::before{content:"\f62d"}.bi-bank::before{content:"\f62e"}.bi-bank2::before{content:"\f62f"}.bi-bell-slash-fill::before{content:"\f630"}.bi-bell-slash::before{content:"\f631"}.bi-cash-coin::before{content:"\f632"}.bi-check-lg::before{content:"\f633"}.bi-coin::before{content:"\f634"}.bi-currency-bitcoin::before{content:"\f635"}.bi-currency-dollar::before{content:"\f636"}.bi-currency-euro::before{content:"\f637"}.bi-currency-exchange::before{content:"\f638"}.bi-currency-pound::before{content:"\f639"}.bi-currency-yen::before{content:"\f63a"}.bi-dash-lg::before{content:"\f63b"}.bi-exclamation-lg::before{content:"\f63c"}.bi-file-earmark-pdf-fill::before{content:"\f63d"}.bi-file-earmark-pdf::before{content:"\f63e"}.bi-file-pdf-fill::before{content:"\f63f"}.bi-file-pdf::before{content:"\f640"}.bi-gender-ambiguous::before{content:"\f641"}.bi-gender-female::before{content:"\f642"}.bi-gender-male::before{content:"\f643"}.bi-gender-trans::before{content:"\f644"}.bi-headset-vr::before{content:"\f645"}.bi-info-lg::before{content:"\f646"}.bi-mastodon::before{content:"\f647"}.bi-messenger::before{content:"\f648"}.bi-piggy-bank-fill::before{content:"\f649"}.bi-piggy-bank::before{content:"\f64a"}.bi-pin-map-fill::before{content:"\f64b"}.bi-pin-map::before{content:"\f64c"}.bi-plus-lg::before{content:"\f64d"}.bi-question-lg::before{content:"\f64e"}.bi-recycle::before{content:"\f64f"}.bi-reddit::before{content:"\f650"}.bi-safe-fill::before{content:"\f651"}.bi-safe2-fill::before{content:"\f652"}.bi-safe2::before{content:"\f653"}.bi-sd-card-fill::before{content:"\f654"}.bi-sd-card::before{content:"\f655"}.bi-skype::before{content:"\f656"}.bi-slash-lg::before{content:"\f657"}.bi-translate::before{content:"\f658"}.bi-x-lg::before{content:"\f659"}.bi-safe::before{content:"\f65a"}.bi-apple::before{content:"\f65b"}.bi-microsoft::before{content:"\f65d"}.bi-windows::before{content:"\f65e"}.bi-behance::before{content:"\f65c"}.bi-dribbble::before{content:"\f65f"}.bi-line::before{content:"\f660"}.bi-medium::before{content:"\f661"}.bi-paypal::before{content:"\f662"}.bi-pinterest::before{content:"\f663"}.bi-signal::before{content:"\f664"}.bi-snapchat::before{content:"\f665"}.bi-spotify::before{content:"\f666"}.bi-stack-overflow::before{content:"\f667"}.bi-strava::before{content:"\f668"}.bi-wordpress::before{content:"\f669"}.bi-vimeo::before{content:"\f66a"}.bi-activity::before{content:"\f66b"}.bi-easel2-fill::before{content:"\f66c"}.bi-easel2::before{content:"\f66d"}.bi-easel3-fill::before{content:"\f66e"}.bi-easel3::before{content:"\f66f"}.bi-fan::before{content:"\f670"}.bi-fingerprint::before{content:"\f671"}.bi-graph-down-arrow::before{content:"\f672"}.bi-graph-up-arrow::before{content:"\f673"}.bi-hypnotize::before{content:"\f674"}.bi-magic::before{content:"\f675"}.bi-person-rolodex::before{content:"\f676"}.bi-person-video::before{content:"\f677"}.bi-person-video2::before{content:"\f678"}.bi-person-video3::before{content:"\f679"}.bi-person-workspace::before{content:"\f67a"}.bi-radioactive::before{content:"\f67b"}.bi-webcam-fill::before{content:"\f67c"}.bi-webcam::before{content:"\f67d"}.bi-yin-yang::before{content:"\f67e"}.bi-bandaid-fill::before{content:"\f680"}.bi-bandaid::before{content:"\f681"}.bi-bluetooth::before{content:"\f682"}.bi-body-text::before{content:"\f683"}.bi-boombox::before{content:"\f684"}.bi-boxes::before{content:"\f685"}.bi-dpad-fill::before{content:"\f686"}.bi-dpad::before{content:"\f687"}.bi-ear-fill::before{content:"\f688"}.bi-ear::before{content:"\f689"}.bi-envelope-check-fill::before{content:"\f68b"}.bi-envelope-check::before{content:"\f68c"}.bi-envelope-dash-fill::before{content:"\f68e"}.bi-envelope-dash::before{content:"\f68f"}.bi-envelope-exclamation-fill::before{content:"\f691"}.bi-envelope-exclamation::before{content:"\f692"}.bi-envelope-plus-fill::before{content:"\f693"}.bi-envelope-plus::before{content:"\f694"}.bi-envelope-slash-fill::before{content:"\f696"}.bi-envelope-slash::before{content:"\f697"}.bi-envelope-x-fill::before{content:"\f699"}.bi-envelope-x::before{content:"\f69a"}.bi-explicit-fill::before{content:"\f69b"}.bi-explicit::before{content:"\f69c"}.bi-git::before{content:"\f69d"}.bi-infinity::before{content:"\f69e"}.bi-list-columns-reverse::before{content:"\f69f"}.bi-list-columns::before{content:"\f6a0"}.bi-meta::before{content:"\f6a1"}.bi-nintendo-switch::before{content:"\f6a4"}.bi-pc-display-horizontal::before{content:"\f6a5"}.bi-pc-display::before{content:"\f6a6"}.bi-pc-horizontal::before{content:"\f6a7"}.bi-pc::before{content:"\f6a8"}.bi-playstation::before{content:"\f6a9"}.bi-plus-slash-minus::before{content:"\f6aa"}.bi-projector-fill::before{content:"\f6ab"}.bi-projector::before{content:"\f6ac"}.bi-qr-code-scan::before{content:"\f6ad"}.bi-qr-code::before{content:"\f6ae"}.bi-quora::before{content:"\f6af"}.bi-quote::before{content:"\f6b0"}.bi-robot::before{content:"\f6b1"}.bi-send-check-fill::before{content:"\f6b2"}.bi-send-check::before{content:"\f6b3"}.bi-send-dash-fill::before{content:"\f6b4"}.bi-send-dash::before{content:"\f6b5"}.bi-send-exclamation-fill::before{content:"\f6b7"}.bi-send-exclamation::before{content:"\f6b8"}.bi-send-fill::before{content:"\f6b9"}.bi-send-plus-fill::before{content:"\f6ba"}.bi-send-plus::before{content:"\f6bb"}.bi-send-slash-fill::before{content:"\f6bc"}.bi-send-slash::before{content:"\f6bd"}.bi-send-x-fill::before{content:"\f6be"}.bi-send-x::before{content:"\f6bf"}.bi-send::before{content:"\f6c0"}.bi-steam::before{content:"\f6c1"}.bi-terminal-dash::before{content:"\f6c3"}.bi-terminal-plus::before{content:"\f6c4"}.bi-terminal-split::before{content:"\f6c5"}.bi-ticket-detailed-fill::before{content:"\f6c6"}.bi-ticket-detailed::before{content:"\f6c7"}.bi-ticket-fill::before{content:"\f6c8"}.bi-ticket-perforated-fill::before{content:"\f6c9"}.bi-ticket-perforated::before{content:"\f6ca"}.bi-ticket::before{content:"\f6cb"}.bi-tiktok::before{content:"\f6cc"}.bi-window-dash::before{content:"\f6cd"}.bi-window-desktop::before{content:"\f6ce"}.bi-window-fullscreen::before{content:"\f6cf"}.bi-window-plus::before{content:"\f6d0"}.bi-window-split::before{content:"\f6d1"}.bi-window-stack::before{content:"\f6d2"}.bi-window-x::before{content:"\f6d3"}.bi-xbox::before{content:"\f6d4"}.bi-ethernet::before{content:"\f6d5"}.bi-hdmi-fill::before{content:"\f6d6"}.bi-hdmi::before{content:"\f6d7"}.bi-usb-c-fill::before{content:"\f6d8"}.bi-usb-c::before{content:"\f6d9"}.bi-usb-fill::before{content:"\f6da"}.bi-usb-plug-fill::before{content:"\f6db"}.bi-usb-plug::before{content:"\f6dc"}.bi-usb-symbol::before{content:"\f6dd"}.bi-usb::before{content:"\f6de"}.bi-boombox-fill::before{content:"\f6df"}.bi-displayport::before{content:"\f6e1"}.bi-gpu-card::before{content:"\f6e2"}.bi-memory::before{content:"\f6e3"}.bi-modem-fill::before{content:"\f6e4"}.bi-modem::before{content:"\f6e5"}.bi-motherboard-fill::before{content:"\f6e6"}.bi-motherboard::before{content:"\f6e7"}.bi-optical-audio-fill::before{content:"\f6e8"}.bi-optical-audio::before{content:"\f6e9"}.bi-pci-card::before{content:"\f6ea"}.bi-router-fill::before{content:"\f6eb"}.bi-router::before{content:"\f6ec"}.bi-thunderbolt-fill::before{content:"\f6ef"}.bi-thunderbolt::before{content:"\f6f0"}.bi-usb-drive-fill::before{content:"\f6f1"}.bi-usb-drive::before{content:"\f6f2"}.bi-usb-micro-fill::before{content:"\f6f3"}.bi-usb-micro::before{content:"\f6f4"}.bi-usb-mini-fill::before{content:"\f6f5"}.bi-usb-mini::before{content:"\f6f6"}.bi-cloud-haze2::before{content:"\f6f7"}.bi-device-hdd-fill::before{content:"\f6f8"}.bi-device-hdd::before{content:"\f6f9"}.bi-device-ssd-fill::before{content:"\f6fa"}.bi-device-ssd::before{content:"\f6fb"}.bi-displayport-fill::before{content:"\f6fc"}.bi-mortarboard-fill::before{content:"\f6fd"}.bi-mortarboard::before{content:"\f6fe"}.bi-terminal-x::before{content:"\f6ff"}.bi-arrow-through-heart-fill::before{content:"\f700"}.bi-arrow-through-heart::before{content:"\f701"}.bi-badge-sd-fill::before{content:"\f702"}.bi-badge-sd::before{content:"\f703"}.bi-bag-heart-fill::before{content:"\f704"}.bi-bag-heart::before{content:"\f705"}.bi-balloon-fill::before{content:"\f706"}.bi-balloon-heart-fill::before{content:"\f707"}.bi-balloon-heart::before{content:"\f708"}.bi-balloon::before{content:"\f709"}.bi-box2-fill::before{content:"\f70a"}.bi-box2-heart-fill::before{content:"\f70b"}.bi-box2-heart::before{content:"\f70c"}.bi-box2::before{content:"\f70d"}.bi-braces-asterisk::before{content:"\f70e"}.bi-calendar-heart-fill::before{content:"\f70f"}.bi-calendar-heart::before{content:"\f710"}.bi-calendar2-heart-fill::before{content:"\f711"}.bi-calendar2-heart::before{content:"\f712"}.bi-chat-heart-fill::before{content:"\f713"}.bi-chat-heart::before{content:"\f714"}.bi-chat-left-heart-fill::before{content:"\f715"}.bi-chat-left-heart::before{content:"\f716"}.bi-chat-right-heart-fill::before{content:"\f717"}.bi-chat-right-heart::before{content:"\f718"}.bi-chat-square-heart-fill::before{content:"\f719"}.bi-chat-square-heart::before{content:"\f71a"}.bi-clipboard-check-fill::before{content:"\f71b"}.bi-clipboard-data-fill::before{content:"\f71c"}.bi-clipboard-fill::before{content:"\f71d"}.bi-clipboard-heart-fill::before{content:"\f71e"}.bi-clipboard-heart::before{content:"\f71f"}.bi-clipboard-minus-fill::before{content:"\f720"}.bi-clipboard-plus-fill::before{content:"\f721"}.bi-clipboard-pulse::before{content:"\f722"}.bi-clipboard-x-fill::before{content:"\f723"}.bi-clipboard2-check-fill::before{content:"\f724"}.bi-clipboard2-check::before{content:"\f725"}.bi-clipboard2-data-fill::before{content:"\f726"}.bi-clipboard2-data::before{content:"\f727"}.bi-clipboard2-fill::before{content:"\f728"}.bi-clipboard2-heart-fill::before{content:"\f729"}.bi-clipboard2-heart::before{content:"\f72a"}.bi-clipboard2-minus-fill::before{content:"\f72b"}.bi-clipboard2-minus::before{content:"\f72c"}.bi-clipboard2-plus-fill::before{content:"\f72d"}.bi-clipboard2-plus::before{content:"\f72e"}.bi-clipboard2-pulse-fill::before{content:"\f72f"}.bi-clipboard2-pulse::before{content:"\f730"}.bi-clipboard2-x-fill::before{content:"\f731"}.bi-clipboard2-x::before{content:"\f732"}.bi-clipboard2::before{content:"\f733"}.bi-emoji-kiss-fill::before{content:"\f734"}.bi-emoji-kiss::before{content:"\f735"}.bi-envelope-heart-fill::before{content:"\f736"}.bi-envelope-heart::before{content:"\f737"}.bi-envelope-open-heart-fill::before{content:"\f738"}.bi-envelope-open-heart::before{content:"\f739"}.bi-envelope-paper-fill::before{content:"\f73a"}.bi-envelope-paper-heart-fill::before{content:"\f73b"}.bi-envelope-paper-heart::before{content:"\f73c"}.bi-envelope-paper::before{content:"\f73d"}.bi-filetype-aac::before{content:"\f73e"}.bi-filetype-ai::before{content:"\f73f"}.bi-filetype-bmp::before{content:"\f740"}.bi-filetype-cs::before{content:"\f741"}.bi-filetype-css::before{content:"\f742"}.bi-filetype-csv::before{content:"\f743"}.bi-filetype-doc::before{content:"\f744"}.bi-filetype-docx::before{content:"\f745"}.bi-filetype-exe::before{content:"\f746"}.bi-filetype-gif::before{content:"\f747"}.bi-filetype-heic::before{content:"\f748"}.bi-filetype-html::before{content:"\f749"}.bi-filetype-java::before{content:"\f74a"}.bi-filetype-jpg::before{content:"\f74b"}.bi-filetype-js::before{content:"\f74c"}.bi-filetype-jsx::before{content:"\f74d"}.bi-filetype-key::before{content:"\f74e"}.bi-filetype-m4p::before{content:"\f74f"}.bi-filetype-md::before{content:"\f750"}.bi-filetype-mdx::before{content:"\f751"}.bi-filetype-mov::before{content:"\f752"}.bi-filetype-mp3::before{content:"\f753"}.bi-filetype-mp4::before{content:"\f754"}.bi-filetype-otf::before{content:"\f755"}.bi-filetype-pdf::before{content:"\f756"}.bi-filetype-php::before{content:"\f757"}.bi-filetype-png::before{content:"\f758"}.bi-filetype-ppt::before{content:"\f75a"}.bi-filetype-psd::before{content:"\f75b"}.bi-filetype-py::before{content:"\f75c"}.bi-filetype-raw::before{content:"\f75d"}.bi-filetype-rb::before{content:"\f75e"}.bi-filetype-sass::before{content:"\f75f"}.bi-filetype-scss::before{content:"\f760"}.bi-filetype-sh::before{content:"\f761"}.bi-filetype-svg::before{content:"\f762"}.bi-filetype-tiff::before{content:"\f763"}.bi-filetype-tsx::before{content:"\f764"}.bi-filetype-ttf::before{content:"\f765"}.bi-filetype-txt::before{content:"\f766"}.bi-filetype-wav::before{content:"\f767"}.bi-filetype-woff::before{content:"\f768"}.bi-filetype-xls::before{content:"\f76a"}.bi-filetype-xml::before{content:"\f76b"}.bi-filetype-yml::before{content:"\f76c"}.bi-heart-arrow::before{content:"\f76d"}.bi-heart-pulse-fill::before{content:"\f76e"}.bi-heart-pulse::before{content:"\f76f"}.bi-heartbreak-fill::before{content:"\f770"}.bi-heartbreak::before{content:"\f771"}.bi-hearts::before{content:"\f772"}.bi-hospital-fill::before{content:"\f773"}.bi-hospital::before{content:"\f774"}.bi-house-heart-fill::before{content:"\f775"}.bi-house-heart::before{content:"\f776"}.bi-incognito::before{content:"\f777"}.bi-magnet-fill::before{content:"\f778"}.bi-magnet::before{content:"\f779"}.bi-person-heart::before{content:"\f77a"}.bi-person-hearts::before{content:"\f77b"}.bi-phone-flip::before{content:"\f77c"}.bi-plugin::before{content:"\f77d"}.bi-postage-fill::before{content:"\f77e"}.bi-postage-heart-fill::before{content:"\f77f"}.bi-postage-heart::before{content:"\f780"}.bi-postage::before{content:"\f781"}.bi-postcard-fill::before{content:"\f782"}.bi-postcard-heart-fill::before{content:"\f783"}.bi-postcard-heart::before{content:"\f784"}.bi-postcard::before{content:"\f785"}.bi-search-heart-fill::before{content:"\f786"}.bi-search-heart::before{content:"\f787"}.bi-sliders2-vertical::before{content:"\f788"}.bi-sliders2::before{content:"\f789"}.bi-trash3-fill::before{content:"\f78a"}.bi-trash3::before{content:"\f78b"}.bi-valentine::before{content:"\f78c"}.bi-valentine2::before{content:"\f78d"}.bi-wrench-adjustable-circle-fill::before{content:"\f78e"}.bi-wrench-adjustable-circle::before{content:"\f78f"}.bi-wrench-adjustable::before{content:"\f790"}.bi-filetype-json::before{content:"\f791"}.bi-filetype-pptx::before{content:"\f792"}.bi-filetype-xlsx::before{content:"\f793"}.bi-1-circle-fill::before{content:"\f796"}.bi-1-circle::before{content:"\f797"}.bi-1-square-fill::before{content:"\f798"}.bi-1-square::before{content:"\f799"}.bi-2-circle-fill::before{content:"\f79c"}.bi-2-circle::before{content:"\f79d"}.bi-2-square-fill::before{content:"\f79e"}.bi-2-square::before{content:"\f79f"}.bi-3-circle-fill::before{content:"\f7a2"}.bi-3-circle::before{content:"\f7a3"}.bi-3-square-fill::before{content:"\f7a4"}.bi-3-square::before{content:"\f7a5"}.bi-4-circle-fill::before{content:"\f7a8"}.bi-4-circle::before{content:"\f7a9"}.bi-4-square-fill::before{content:"\f7aa"}.bi-4-square::before{content:"\f7ab"}.bi-5-circle-fill::before{content:"\f7ae"}.bi-5-circle::before{content:"\f7af"}.bi-5-square-fill::before{content:"\f7b0"}.bi-5-square::before{content:"\f7b1"}.bi-6-circle-fill::before{content:"\f7b4"}.bi-6-circle::before{content:"\f7b5"}.bi-6-square-fill::before{content:"\f7b6"}.bi-6-square::before{content:"\f7b7"}.bi-7-circle-fill::before{content:"\f7ba"}.bi-7-circle::before{content:"\f7bb"}.bi-7-square-fill::before{content:"\f7bc"}.bi-7-square::before{content:"\f7bd"}.bi-8-circle-fill::before{content:"\f7c0"}.bi-8-circle::before{content:"\f7c1"}.bi-8-square-fill::before{content:"\f7c2"}.bi-8-square::before{content:"\f7c3"}.bi-9-circle-fill::before{content:"\f7c6"}.bi-9-circle::before{content:"\f7c7"}.bi-9-square-fill::before{content:"\f7c8"}.bi-9-square::before{content:"\f7c9"}.bi-airplane-engines-fill::before{content:"\f7ca"}.bi-airplane-engines::before{content:"\f7cb"}.bi-airplane-fill::before{content:"\f7cc"}.bi-airplane::before{content:"\f7cd"}.bi-alexa::before{content:"\f7ce"}.bi-alipay::before{content:"\f7cf"}.bi-android::before{content:"\f7d0"}.bi-android2::before{content:"\f7d1"}.bi-box-fill::before{content:"\f7d2"}.bi-box-seam-fill::before{content:"\f7d3"}.bi-browser-chrome::before{content:"\f7d4"}.bi-browser-edge::before{content:"\f7d5"}.bi-browser-firefox::before{content:"\f7d6"}.bi-browser-safari::before{content:"\f7d7"}.bi-c-circle-fill::before{content:"\f7da"}.bi-c-circle::before{content:"\f7db"}.bi-c-square-fill::before{content:"\f7dc"}.bi-c-square::before{content:"\f7dd"}.bi-capsule-pill::before{content:"\f7de"}.bi-capsule::before{content:"\f7df"}.bi-car-front-fill::before{content:"\f7e0"}.bi-car-front::before{content:"\f7e1"}.bi-cassette-fill::before{content:"\f7e2"}.bi-cassette::before{content:"\f7e3"}.bi-cc-circle-fill::before{content:"\f7e6"}.bi-cc-circle::before{content:"\f7e7"}.bi-cc-square-fill::before{content:"\f7e8"}.bi-cc-square::before{content:"\f7e9"}.bi-cup-hot-fill::before{content:"\f7ea"}.bi-cup-hot::before{content:"\f7eb"}.bi-currency-rupee::before{content:"\f7ec"}.bi-dropbox::before{content:"\f7ed"}.bi-escape::before{content:"\f7ee"}.bi-fast-forward-btn-fill::before{content:"\f7ef"}.bi-fast-forward-btn::before{content:"\f7f0"}.bi-fast-forward-circle-fill::before{content:"\f7f1"}.bi-fast-forward-circle::before{content:"\f7f2"}.bi-fast-forward-fill::before{content:"\f7f3"}.bi-fast-forward::before{content:"\f7f4"}.bi-filetype-sql::before{content:"\f7f5"}.bi-fire::before{content:"\f7f6"}.bi-google-play::before{content:"\f7f7"}.bi-h-circle-fill::before{content:"\f7fa"}.bi-h-circle::before{content:"\f7fb"}.bi-h-square-fill::before{content:"\f7fc"}.bi-h-square::before{content:"\f7fd"}.bi-indent::before{content:"\f7fe"}.bi-lungs-fill::before{content:"\f7ff"}.bi-lungs::before{content:"\f800"}.bi-microsoft-teams::before{content:"\f801"}.bi-p-circle-fill::before{content:"\f804"}.bi-p-circle::before{content:"\f805"}.bi-p-square-fill::before{content:"\f806"}.bi-p-square::before{content:"\f807"}.bi-pass-fill::before{content:"\f808"}.bi-pass::before{content:"\f809"}.bi-prescription::before{content:"\f80a"}.bi-prescription2::before{content:"\f80b"}.bi-r-circle-fill::before{content:"\f80e"}.bi-r-circle::before{content:"\f80f"}.bi-r-square-fill::before{content:"\f810"}.bi-r-square::before{content:"\f811"}.bi-repeat-1::before{content:"\f812"}.bi-repeat::before{content:"\f813"}.bi-rewind-btn-fill::before{content:"\f814"}.bi-rewind-btn::before{content:"\f815"}.bi-rewind-circle-fill::before{content:"\f816"}.bi-rewind-circle::before{content:"\f817"}.bi-rewind-fill::before{content:"\f818"}.bi-rewind::before{content:"\f819"}.bi-train-freight-front-fill::before{content:"\f81a"}.bi-train-freight-front::before{content:"\f81b"}.bi-train-front-fill::before{content:"\f81c"}.bi-train-front::before{content:"\f81d"}.bi-train-lightrail-front-fill::before{content:"\f81e"}.bi-train-lightrail-front::before{content:"\f81f"}.bi-truck-front-fill::before{content:"\f820"}.bi-truck-front::before{content:"\f821"}.bi-ubuntu::before{content:"\f822"}.bi-unindent::before{content:"\f823"}.bi-unity::before{content:"\f824"}.bi-universal-access-circle::before{content:"\f825"}.bi-universal-access::before{content:"\f826"}.bi-virus::before{content:"\f827"}.bi-virus2::before{content:"\f828"}.bi-wechat::before{content:"\f829"}.bi-yelp::before{content:"\f82a"}.bi-sign-stop-fill::before{content:"\f82b"}.bi-sign-stop-lights-fill::before{content:"\f82c"}.bi-sign-stop-lights::before{content:"\f82d"}.bi-sign-stop::before{content:"\f82e"}.bi-sign-turn-left-fill::before{content:"\f82f"}.bi-sign-turn-left::before{content:"\f830"}.bi-sign-turn-right-fill::before{content:"\f831"}.bi-sign-turn-right::before{content:"\f832"}.bi-sign-turn-slight-left-fill::before{content:"\f833"}.bi-sign-turn-slight-left::before{content:"\f834"}.bi-sign-turn-slight-right-fill::before{content:"\f835"}.bi-sign-turn-slight-right::before{content:"\f836"}.bi-sign-yield-fill::before{content:"\f837"}.bi-sign-yield::before{content:"\f838"}.bi-ev-station-fill::before{content:"\f839"}.bi-ev-station::before{content:"\f83a"}.bi-fuel-pump-diesel-fill::before{content:"\f83b"}.bi-fuel-pump-diesel::before{content:"\f83c"}.bi-fuel-pump-fill::before{content:"\f83d"}.bi-fuel-pump::before{content:"\f83e"}.bi-0-circle-fill::before{content:"\f83f"}.bi-0-circle::before{content:"\f840"}.bi-0-square-fill::before{content:"\f841"}.bi-0-square::before{content:"\f842"}.bi-rocket-fill::before{content:"\f843"}.bi-rocket-takeoff-fill::before{content:"\f844"}.bi-rocket-takeoff::before{content:"\f845"}.bi-rocket::before{content:"\f846"}.bi-stripe::before{content:"\f847"}.bi-subscript::before{content:"\f848"}.bi-superscript::before{content:"\f849"}.bi-trello::before{content:"\f84a"}.bi-envelope-at-fill::before{content:"\f84b"}.bi-envelope-at::before{content:"\f84c"}.bi-regex::before{content:"\f84d"}.bi-text-wrap::before{content:"\f84e"}.bi-sign-dead-end-fill::before{content:"\f84f"}.bi-sign-dead-end::before{content:"\f850"}.bi-sign-do-not-enter-fill::before{content:"\f851"}.bi-sign-do-not-enter::before{content:"\f852"}.bi-sign-intersection-fill::before{content:"\f853"}.bi-sign-intersection-side-fill::before{content:"\f854"}.bi-sign-intersection-side::before{content:"\f855"}.bi-sign-intersection-t-fill::before{content:"\f856"}.bi-sign-intersection-t::before{content:"\f857"}.bi-sign-intersection-y-fill::before{content:"\f858"}.bi-sign-intersection-y::before{content:"\f859"}.bi-sign-intersection::before{content:"\f85a"}.bi-sign-merge-left-fill::before{content:"\f85b"}.bi-sign-merge-left::before{content:"\f85c"}.bi-sign-merge-right-fill::before{content:"\f85d"}.bi-sign-merge-right::before{content:"\f85e"}.bi-sign-no-left-turn-fill::before{content:"\f85f"}.bi-sign-no-left-turn::before{content:"\f860"}.bi-sign-no-parking-fill::before{content:"\f861"}.bi-sign-no-parking::before{content:"\f862"}.bi-sign-no-right-turn-fill::before{content:"\f863"}.bi-sign-no-right-turn::before{content:"\f864"}.bi-sign-railroad-fill::before{content:"\f865"}.bi-sign-railroad::before{content:"\f866"}.bi-building-add::before{content:"\f867"}.bi-building-check::before{content:"\f868"}.bi-building-dash::before{content:"\f869"}.bi-building-down::before{content:"\f86a"}.bi-building-exclamation::before{content:"\f86b"}.bi-building-fill-add::before{content:"\f86c"}.bi-building-fill-check::before{content:"\f86d"}.bi-building-fill-dash::before{content:"\f86e"}.bi-building-fill-down::before{content:"\f86f"}.bi-building-fill-exclamation::before{content:"\f870"}.bi-building-fill-gear::before{content:"\f871"}.bi-building-fill-lock::before{content:"\f872"}.bi-building-fill-slash::before{content:"\f873"}.bi-building-fill-up::before{content:"\f874"}.bi-building-fill-x::before{content:"\f875"}.bi-building-fill::before{content:"\f876"}.bi-building-gear::before{content:"\f877"}.bi-building-lock::before{content:"\f878"}.bi-building-slash::before{content:"\f879"}.bi-building-up::before{content:"\f87a"}.bi-building-x::before{content:"\f87b"}.bi-buildings-fill::before{content:"\f87c"}.bi-buildings::before{content:"\f87d"}.bi-bus-front-fill::before{content:"\f87e"}.bi-bus-front::before{content:"\f87f"}.bi-ev-front-fill::before{content:"\f880"}.bi-ev-front::before{content:"\f881"}.bi-globe-americas::before{content:"\f882"}.bi-globe-asia-australia::before{content:"\f883"}.bi-globe-central-south-asia::before{content:"\f884"}.bi-globe-europe-africa::before{content:"\f885"}.bi-house-add-fill::before{content:"\f886"}.bi-house-add::before{content:"\f887"}.bi-house-check-fill::before{content:"\f888"}.bi-house-check::before{content:"\f889"}.bi-house-dash-fill::before{content:"\f88a"}.bi-house-dash::before{content:"\f88b"}.bi-house-down-fill::before{content:"\f88c"}.bi-house-down::before{content:"\f88d"}.bi-house-exclamation-fill::before{content:"\f88e"}.bi-house-exclamation::before{content:"\f88f"}.bi-house-gear-fill::before{content:"\f890"}.bi-house-gear::before{content:"\f891"}.bi-house-lock-fill::before{content:"\f892"}.bi-house-lock::before{content:"\f893"}.bi-house-slash-fill::before{content:"\f894"}.bi-house-slash::before{content:"\f895"}.bi-house-up-fill::before{content:"\f896"}.bi-house-up::before{content:"\f897"}.bi-house-x-fill::before{content:"\f898"}.bi-house-x::before{content:"\f899"}.bi-person-add::before{content:"\f89a"}.bi-person-down::before{content:"\f89b"}.bi-person-exclamation::before{content:"\f89c"}.bi-person-fill-add::before{content:"\f89d"}.bi-person-fill-check::before{content:"\f89e"}.bi-person-fill-dash::before{content:"\f89f"}.bi-person-fill-down::before{content:"\f8a0"}.bi-person-fill-exclamation::before{content:"\f8a1"}.bi-person-fill-gear::before{content:"\f8a2"}.bi-person-fill-lock::before{content:"\f8a3"}.bi-person-fill-slash::before{content:"\f8a4"}.bi-person-fill-up::before{content:"\f8a5"}.bi-person-fill-x::before{content:"\f8a6"}.bi-person-gear::before{content:"\f8a7"}.bi-person-lock::before{content:"\f8a8"}.bi-person-slash::before{content:"\f8a9"}.bi-person-up::before{content:"\f8aa"}.bi-scooter::before{content:"\f8ab"}.bi-taxi-front-fill::before{content:"\f8ac"}.bi-taxi-front::before{content:"\f8ad"}.bi-amd::before{content:"\f8ae"}.bi-database-add::before{content:"\f8af"}.bi-database-check::before{content:"\f8b0"}.bi-database-dash::before{content:"\f8b1"}.bi-database-down::before{content:"\f8b2"}.bi-database-exclamation::before{content:"\f8b3"}.bi-database-fill-add::before{content:"\f8b4"}.bi-database-fill-check::before{content:"\f8b5"}.bi-database-fill-dash::before{content:"\f8b6"}.bi-database-fill-down::before{content:"\f8b7"}.bi-database-fill-exclamation::before{content:"\f8b8"}.bi-database-fill-gear::before{content:"\f8b9"}.bi-database-fill-lock::before{content:"\f8ba"}.bi-database-fill-slash::before{content:"\f8bb"}.bi-database-fill-up::before{content:"\f8bc"}.bi-database-fill-x::before{content:"\f8bd"}.bi-database-fill::before{content:"\f8be"}.bi-database-gear::before{content:"\f8bf"}.bi-database-lock::before{content:"\f8c0"}.bi-database-slash::before{content:"\f8c1"}.bi-database-up::before{content:"\f8c2"}.bi-database-x::before{content:"\f8c3"}.bi-database::before{content:"\f8c4"}.bi-houses-fill::before{content:"\f8c5"}.bi-houses::before{content:"\f8c6"}.bi-nvidia::before{content:"\f8c7"}.bi-person-vcard-fill::before{content:"\f8c8"}.bi-person-vcard::before{content:"\f8c9"}.bi-sina-weibo::before{content:"\f8ca"}.bi-tencent-qq::before{content:"\f8cb"}.bi-wikipedia::before{content:"\f8cc"}.bi-alphabet-uppercase::before{content:"\f2a5"}.bi-alphabet::before{content:"\f68a"}.bi-amazon::before{content:"\f68d"}.bi-arrows-collapse-vertical::before{content:"\f690"}.bi-arrows-expand-vertical::before{content:"\f695"}.bi-arrows-vertical::before{content:"\f698"}.bi-arrows::before{content:"\f6a2"}.bi-ban-fill::before{content:"\f6a3"}.bi-ban::before{content:"\f6b6"}.bi-bing::before{content:"\f6c2"}.bi-cake::before{content:"\f6e0"}.bi-cake2::before{content:"\f6ed"}.bi-cookie::before{content:"\f6ee"}.bi-copy::before{content:"\f759"}.bi-crosshair::before{content:"\f769"}.bi-crosshair2::before{content:"\f794"}.bi-emoji-astonished-fill::before{content:"\f795"}.bi-emoji-astonished::before{content:"\f79a"}.bi-emoji-grimace-fill::before{content:"\f79b"}.bi-emoji-grimace::before{content:"\f7a0"}.bi-emoji-grin-fill::before{content:"\f7a1"}.bi-emoji-grin::before{content:"\f7a6"}.bi-emoji-surprise-fill::before{content:"\f7a7"}.bi-emoji-surprise::before{content:"\f7ac"}.bi-emoji-tear-fill::before{content:"\f7ad"}.bi-emoji-tear::before{content:"\f7b2"}.bi-envelope-arrow-down-fill::before{content:"\f7b3"}.bi-envelope-arrow-down::before{content:"\f7b8"}.bi-envelope-arrow-up-fill::before{content:"\f7b9"}.bi-envelope-arrow-up::before{content:"\f7be"}.bi-feather::before{content:"\f7bf"}.bi-feather2::before{content:"\f7c4"}.bi-floppy-fill::before{content:"\f7c5"}.bi-floppy::before{content:"\f7d8"}.bi-floppy2-fill::before{content:"\f7d9"}.bi-floppy2::before{content:"\f7e4"}.bi-gitlab::before{content:"\f7e5"}.bi-highlighter::before{content:"\f7f8"}.bi-marker-tip::before{content:"\f802"}.bi-nvme-fill::before{content:"\f803"}.bi-nvme::before{content:"\f80c"}.bi-opencollective::before{content:"\f80d"}.bi-pci-card-network::before{content:"\f8cd"}.bi-pci-card-sound::before{content:"\f8ce"}.bi-radar::before{content:"\f8cf"}.bi-send-arrow-down-fill::before{content:"\f8d0"}.bi-send-arrow-down::before{content:"\f8d1"}.bi-send-arrow-up-fill::before{content:"\f8d2"}.bi-send-arrow-up::before{content:"\f8d3"}.bi-sim-slash-fill::before{content:"\f8d4"}.bi-sim-slash::before{content:"\f8d5"}.bi-sourceforge::before{content:"\f8d6"}.bi-substack::before{content:"\f8d7"}.bi-threads-fill::before{content:"\f8d8"}.bi-threads::before{content:"\f8d9"}.bi-transparency::before{content:"\f8da"}.bi-twitter-x::before{content:"\f8db"}.bi-type-h4::before{content:"\f8dc"}.bi-type-h5::before{content:"\f8dd"}.bi-type-h6::before{content:"\f8de"}.bi-backpack-fill::before{content:"\f8df"}.bi-backpack::before{content:"\f8e0"}.bi-backpack2-fill::before{content:"\f8e1"}.bi-backpack2::before{content:"\f8e2"}.bi-backpack3-fill::before{content:"\f8e3"}.bi-backpack3::before{content:"\f8e4"}.bi-backpack4-fill::before{content:"\f8e5"}.bi-backpack4::before{content:"\f8e6"}.bi-brilliance::before{content:"\f8e7"}.bi-cake-fill::before{content:"\f8e8"}.bi-cake2-fill::before{content:"\f8e9"}.bi-duffle-fill::before{content:"\f8ea"}.bi-duffle::before{content:"\f8eb"}.bi-exposure::before{content:"\f8ec"}.bi-gender-neuter::before{content:"\f8ed"}.bi-highlights::before{content:"\f8ee"}.bi-luggage-fill::before{content:"\f8ef"}.bi-luggage::before{content:"\f8f0"}.bi-mailbox-flag::before{content:"\f8f1"}.bi-mailbox2-flag::before{content:"\f8f2"}.bi-noise-reduction::before{content:"\f8f3"}.bi-passport-fill::before{content:"\f8f4"}.bi-passport::before{content:"\f8f5"}.bi-person-arms-up::before{content:"\f8f6"}.bi-person-raised-hand::before{content:"\f8f7"}.bi-person-standing-dress::before{content:"\f8f8"}.bi-person-standing::before{content:"\f8f9"}.bi-person-walking::before{content:"\f8fa"}.bi-person-wheelchair::before{content:"\f8fb"}.bi-shadows::before{content:"\f8fc"}.bi-suitcase-fill::before{content:"\f8fd"}.bi-suitcase-lg-fill::before{content:"\f8fe"}.bi-suitcase-lg::before{content:"\f8ff"}.bi-suitcase::before{content:"\f900"}.bi-suitcase2-fill::before{content:"\f901"}.bi-suitcase2::before{content:"\f902"}.bi-vignette::before{content:"\f903"} \ No newline at end of file diff --git a/pagetop/static/theme/css/menu.css b/pagetop/static/base/css/menu.css similarity index 100% rename from pagetop/static/theme/css/menu.css rename to pagetop/static/base/css/menu.css diff --git a/pagetop/static/theme/css/normalize.min.css b/pagetop/static/base/css/normalize.min.css similarity index 100% rename from pagetop/static/theme/css/normalize.min.css rename to pagetop/static/base/css/normalize.min.css diff --git a/pagetop/static/theme/css/root.css b/pagetop/static/base/css/root.css similarity index 100% rename from pagetop/static/theme/css/root.css rename to pagetop/static/base/css/root.css diff --git a/pagetop/static/theme/css/styles.css b/pagetop/static/base/css/styles.css similarity index 100% rename from pagetop/static/theme/css/styles.css rename to pagetop/static/base/css/styles.css diff --git a/pagetop/static/theme/favicon.ico b/pagetop/static/base/favicon.ico similarity index 100% rename from pagetop/static/theme/favicon.ico rename to pagetop/static/base/favicon.ico diff --git a/pagetop/static/base/fonts/icons.woff b/pagetop/static/base/fonts/icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..dbeeb055674125ad78fda0f3d166b36e5cc92336 GIT binary patch literal 176200 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 F?~0aZ)an2L literal 0 HcmV?d00001 diff --git a/pagetop/static/base/fonts/icons.woff2 b/pagetop/static/base/fonts/icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..87032d17e78ae28da5f0fc2e52680b01ffa642f7 GIT binary patch literal 130608 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 DaoMW~ literal 0 HcmV?d00001 diff --git a/pagetop/static/theme/js/menu.js b/pagetop/static/base/js/menu.js similarity index 100% rename from pagetop/static/theme/js/menu.js rename to pagetop/static/base/js/menu.js diff --git a/pagetop/static/theme/pagetop-logo.svg b/pagetop/static/base/pagetop-logo.svg similarity index 100% rename from pagetop/static/theme/pagetop-logo.svg rename to pagetop/static/base/pagetop-logo.svg diff --git a/pagetop/static/theme/icons/bootstrap-icons.css b/pagetop/static/theme/icons/bootstrap-icons.css deleted file mode 100644 index 9a7d8ae2..00000000 --- a/pagetop/static/theme/icons/bootstrap-icons.css +++ /dev/null @@ -1,1705 +0,0 @@ -@font-face { - font-family: "bootstrap-icons"; - src: url("bootstrap-icons.woff2?ver=1.8.2") format("woff2"), - url("bootstrap-icons.woff?ver=1.8.2") format("woff"); -} - -.bi::before, -[class^="bi-"]::before, -[class*=" bi-"]::before { - display: inline-block; - font-display: block; - font-family: bootstrap-icons !important; - font-style: normal; - font-weight: normal !important; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: -.125em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.bi-123::before { content: "\f67f"; } -.bi-alarm-fill::before { content: "\f101"; } -.bi-alarm::before { content: "\f102"; } -.bi-align-bottom::before { content: "\f103"; } -.bi-align-center::before { content: "\f104"; } -.bi-align-end::before { content: "\f105"; } -.bi-align-middle::before { content: "\f106"; } -.bi-align-start::before { content: "\f107"; } -.bi-align-top::before { content: "\f108"; } -.bi-alt::before { content: "\f109"; } -.bi-app-indicator::before { content: "\f10a"; } -.bi-app::before { content: "\f10b"; } -.bi-archive-fill::before { content: "\f10c"; } -.bi-archive::before { content: "\f10d"; } -.bi-arrow-90deg-down::before { content: "\f10e"; } -.bi-arrow-90deg-left::before { content: "\f10f"; } -.bi-arrow-90deg-right::before { content: "\f110"; } -.bi-arrow-90deg-up::before { content: "\f111"; } -.bi-arrow-bar-down::before { content: "\f112"; } -.bi-arrow-bar-left::before { content: "\f113"; } -.bi-arrow-bar-right::before { content: "\f114"; } -.bi-arrow-bar-up::before { content: "\f115"; } -.bi-arrow-clockwise::before { content: "\f116"; } -.bi-arrow-counterclockwise::before { content: "\f117"; } -.bi-arrow-down-circle-fill::before { content: "\f118"; } -.bi-arrow-down-circle::before { content: "\f119"; } -.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } -.bi-arrow-down-left-circle::before { content: "\f11b"; } -.bi-arrow-down-left-square-fill::before { content: "\f11c"; } -.bi-arrow-down-left-square::before { content: "\f11d"; } -.bi-arrow-down-left::before { content: "\f11e"; } -.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } -.bi-arrow-down-right-circle::before { content: "\f120"; } -.bi-arrow-down-right-square-fill::before { content: "\f121"; } -.bi-arrow-down-right-square::before { content: "\f122"; } -.bi-arrow-down-right::before { content: "\f123"; } -.bi-arrow-down-short::before { content: "\f124"; } -.bi-arrow-down-square-fill::before { content: "\f125"; } -.bi-arrow-down-square::before { content: "\f126"; } -.bi-arrow-down-up::before { content: "\f127"; } -.bi-arrow-down::before { content: "\f128"; } -.bi-arrow-left-circle-fill::before { content: "\f129"; } -.bi-arrow-left-circle::before { content: "\f12a"; } -.bi-arrow-left-right::before { content: "\f12b"; } -.bi-arrow-left-short::before { content: "\f12c"; } -.bi-arrow-left-square-fill::before { content: "\f12d"; } -.bi-arrow-left-square::before { content: "\f12e"; } -.bi-arrow-left::before { content: "\f12f"; } -.bi-arrow-repeat::before { content: "\f130"; } -.bi-arrow-return-left::before { content: "\f131"; } -.bi-arrow-return-right::before { content: "\f132"; } -.bi-arrow-right-circle-fill::before { content: "\f133"; } -.bi-arrow-right-circle::before { content: "\f134"; } -.bi-arrow-right-short::before { content: "\f135"; } -.bi-arrow-right-square-fill::before { content: "\f136"; } -.bi-arrow-right-square::before { content: "\f137"; } -.bi-arrow-right::before { content: "\f138"; } -.bi-arrow-up-circle-fill::before { content: "\f139"; } -.bi-arrow-up-circle::before { content: "\f13a"; } -.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } -.bi-arrow-up-left-circle::before { content: "\f13c"; } -.bi-arrow-up-left-square-fill::before { content: "\f13d"; } -.bi-arrow-up-left-square::before { content: "\f13e"; } -.bi-arrow-up-left::before { content: "\f13f"; } -.bi-arrow-up-right-circle-fill::before { content: "\f140"; } -.bi-arrow-up-right-circle::before { content: "\f141"; } -.bi-arrow-up-right-square-fill::before { content: "\f142"; } -.bi-arrow-up-right-square::before { content: "\f143"; } -.bi-arrow-up-right::before { content: "\f144"; } -.bi-arrow-up-short::before { content: "\f145"; } -.bi-arrow-up-square-fill::before { content: "\f146"; } -.bi-arrow-up-square::before { content: "\f147"; } -.bi-arrow-up::before { content: "\f148"; } -.bi-arrows-angle-contract::before { content: "\f149"; } -.bi-arrows-angle-expand::before { content: "\f14a"; } -.bi-arrows-collapse::before { content: "\f14b"; } -.bi-arrows-expand::before { content: "\f14c"; } -.bi-arrows-fullscreen::before { content: "\f14d"; } -.bi-arrows-move::before { content: "\f14e"; } -.bi-aspect-ratio-fill::before { content: "\f14f"; } -.bi-aspect-ratio::before { content: "\f150"; } -.bi-asterisk::before { content: "\f151"; } -.bi-at::before { content: "\f152"; } -.bi-award-fill::before { content: "\f153"; } -.bi-award::before { content: "\f154"; } -.bi-back::before { content: "\f155"; } -.bi-backspace-fill::before { content: "\f156"; } -.bi-backspace-reverse-fill::before { content: "\f157"; } -.bi-backspace-reverse::before { content: "\f158"; } -.bi-backspace::before { content: "\f159"; } -.bi-badge-3d-fill::before { content: "\f15a"; } -.bi-badge-3d::before { content: "\f15b"; } -.bi-badge-4k-fill::before { content: "\f15c"; } -.bi-badge-4k::before { content: "\f15d"; } -.bi-badge-8k-fill::before { content: "\f15e"; } -.bi-badge-8k::before { content: "\f15f"; } -.bi-badge-ad-fill::before { content: "\f160"; } -.bi-badge-ad::before { content: "\f161"; } -.bi-badge-ar-fill::before { content: "\f162"; } -.bi-badge-ar::before { content: "\f163"; } -.bi-badge-cc-fill::before { content: "\f164"; } -.bi-badge-cc::before { content: "\f165"; } -.bi-badge-hd-fill::before { content: "\f166"; } -.bi-badge-hd::before { content: "\f167"; } -.bi-badge-tm-fill::before { content: "\f168"; } -.bi-badge-tm::before { content: "\f169"; } -.bi-badge-vo-fill::before { content: "\f16a"; } -.bi-badge-vo::before { content: "\f16b"; } -.bi-badge-vr-fill::before { content: "\f16c"; } -.bi-badge-vr::before { content: "\f16d"; } -.bi-badge-wc-fill::before { content: "\f16e"; } -.bi-badge-wc::before { content: "\f16f"; } -.bi-bag-check-fill::before { content: "\f170"; } -.bi-bag-check::before { content: "\f171"; } -.bi-bag-dash-fill::before { content: "\f172"; } -.bi-bag-dash::before { content: "\f173"; } -.bi-bag-fill::before { content: "\f174"; } -.bi-bag-plus-fill::before { content: "\f175"; } -.bi-bag-plus::before { content: "\f176"; } -.bi-bag-x-fill::before { content: "\f177"; } -.bi-bag-x::before { content: "\f178"; } -.bi-bag::before { content: "\f179"; } -.bi-bar-chart-fill::before { content: "\f17a"; } -.bi-bar-chart-line-fill::before { content: "\f17b"; } -.bi-bar-chart-line::before { content: "\f17c"; } -.bi-bar-chart-steps::before { content: "\f17d"; } -.bi-bar-chart::before { content: "\f17e"; } -.bi-basket-fill::before { content: "\f17f"; } -.bi-basket::before { content: "\f180"; } -.bi-basket2-fill::before { content: "\f181"; } -.bi-basket2::before { content: "\f182"; } -.bi-basket3-fill::before { content: "\f183"; } -.bi-basket3::before { content: "\f184"; } -.bi-battery-charging::before { content: "\f185"; } -.bi-battery-full::before { content: "\f186"; } -.bi-battery-half::before { content: "\f187"; } -.bi-battery::before { content: "\f188"; } -.bi-bell-fill::before { content: "\f189"; } -.bi-bell::before { content: "\f18a"; } -.bi-bezier::before { content: "\f18b"; } -.bi-bezier2::before { content: "\f18c"; } -.bi-bicycle::before { content: "\f18d"; } -.bi-binoculars-fill::before { content: "\f18e"; } -.bi-binoculars::before { content: "\f18f"; } -.bi-blockquote-left::before { content: "\f190"; } -.bi-blockquote-right::before { content: "\f191"; } -.bi-book-fill::before { content: "\f192"; } -.bi-book-half::before { content: "\f193"; } -.bi-book::before { content: "\f194"; } -.bi-bookmark-check-fill::before { content: "\f195"; } -.bi-bookmark-check::before { content: "\f196"; } -.bi-bookmark-dash-fill::before { content: "\f197"; } -.bi-bookmark-dash::before { content: "\f198"; } -.bi-bookmark-fill::before { content: "\f199"; } -.bi-bookmark-heart-fill::before { content: "\f19a"; } -.bi-bookmark-heart::before { content: "\f19b"; } -.bi-bookmark-plus-fill::before { content: "\f19c"; } -.bi-bookmark-plus::before { content: "\f19d"; } -.bi-bookmark-star-fill::before { content: "\f19e"; } -.bi-bookmark-star::before { content: "\f19f"; } -.bi-bookmark-x-fill::before { content: "\f1a0"; } -.bi-bookmark-x::before { content: "\f1a1"; } -.bi-bookmark::before { content: "\f1a2"; } -.bi-bookmarks-fill::before { content: "\f1a3"; } -.bi-bookmarks::before { content: "\f1a4"; } -.bi-bookshelf::before { content: "\f1a5"; } -.bi-bootstrap-fill::before { content: "\f1a6"; } -.bi-bootstrap-reboot::before { content: "\f1a7"; } -.bi-bootstrap::before { content: "\f1a8"; } -.bi-border-all::before { content: "\f1a9"; } -.bi-border-bottom::before { content: "\f1aa"; } -.bi-border-center::before { content: "\f1ab"; } -.bi-border-inner::before { content: "\f1ac"; } -.bi-border-left::before { content: "\f1ad"; } -.bi-border-middle::before { content: "\f1ae"; } -.bi-border-outer::before { content: "\f1af"; } -.bi-border-right::before { content: "\f1b0"; } -.bi-border-style::before { content: "\f1b1"; } -.bi-border-top::before { content: "\f1b2"; } -.bi-border-width::before { content: "\f1b3"; } -.bi-border::before { content: "\f1b4"; } -.bi-bounding-box-circles::before { content: "\f1b5"; } -.bi-bounding-box::before { content: "\f1b6"; } -.bi-box-arrow-down-left::before { content: "\f1b7"; } -.bi-box-arrow-down-right::before { content: "\f1b8"; } -.bi-box-arrow-down::before { content: "\f1b9"; } -.bi-box-arrow-in-down-left::before { content: "\f1ba"; } -.bi-box-arrow-in-down-right::before { content: "\f1bb"; } -.bi-box-arrow-in-down::before { content: "\f1bc"; } -.bi-box-arrow-in-left::before { content: "\f1bd"; } -.bi-box-arrow-in-right::before { content: "\f1be"; } -.bi-box-arrow-in-up-left::before { content: "\f1bf"; } -.bi-box-arrow-in-up-right::before { content: "\f1c0"; } -.bi-box-arrow-in-up::before { content: "\f1c1"; } -.bi-box-arrow-left::before { content: "\f1c2"; } -.bi-box-arrow-right::before { content: "\f1c3"; } -.bi-box-arrow-up-left::before { content: "\f1c4"; } -.bi-box-arrow-up-right::before { content: "\f1c5"; } -.bi-box-arrow-up::before { content: "\f1c6"; } -.bi-box-seam::before { content: "\f1c7"; } -.bi-box::before { content: "\f1c8"; } -.bi-braces::before { content: "\f1c9"; } -.bi-bricks::before { content: "\f1ca"; } -.bi-briefcase-fill::before { content: "\f1cb"; } -.bi-briefcase::before { content: "\f1cc"; } -.bi-brightness-alt-high-fill::before { content: "\f1cd"; } -.bi-brightness-alt-high::before { content: "\f1ce"; } -.bi-brightness-alt-low-fill::before { content: "\f1cf"; } -.bi-brightness-alt-low::before { content: "\f1d0"; } -.bi-brightness-high-fill::before { content: "\f1d1"; } -.bi-brightness-high::before { content: "\f1d2"; } -.bi-brightness-low-fill::before { content: "\f1d3"; } -.bi-brightness-low::before { content: "\f1d4"; } -.bi-broadcast-pin::before { content: "\f1d5"; } -.bi-broadcast::before { content: "\f1d6"; } -.bi-brush-fill::before { content: "\f1d7"; } -.bi-brush::before { content: "\f1d8"; } -.bi-bucket-fill::before { content: "\f1d9"; } -.bi-bucket::before { content: "\f1da"; } -.bi-bug-fill::before { content: "\f1db"; } -.bi-bug::before { content: "\f1dc"; } -.bi-building::before { content: "\f1dd"; } -.bi-bullseye::before { content: "\f1de"; } -.bi-calculator-fill::before { content: "\f1df"; } -.bi-calculator::before { content: "\f1e0"; } -.bi-calendar-check-fill::before { content: "\f1e1"; } -.bi-calendar-check::before { content: "\f1e2"; } -.bi-calendar-date-fill::before { content: "\f1e3"; } -.bi-calendar-date::before { content: "\f1e4"; } -.bi-calendar-day-fill::before { content: "\f1e5"; } -.bi-calendar-day::before { content: "\f1e6"; } -.bi-calendar-event-fill::before { content: "\f1e7"; } -.bi-calendar-event::before { content: "\f1e8"; } -.bi-calendar-fill::before { content: "\f1e9"; } -.bi-calendar-minus-fill::before { content: "\f1ea"; } -.bi-calendar-minus::before { content: "\f1eb"; } -.bi-calendar-month-fill::before { content: "\f1ec"; } -.bi-calendar-month::before { content: "\f1ed"; } -.bi-calendar-plus-fill::before { content: "\f1ee"; } -.bi-calendar-plus::before { content: "\f1ef"; } -.bi-calendar-range-fill::before { content: "\f1f0"; } -.bi-calendar-range::before { content: "\f1f1"; } -.bi-calendar-week-fill::before { content: "\f1f2"; } -.bi-calendar-week::before { content: "\f1f3"; } -.bi-calendar-x-fill::before { content: "\f1f4"; } -.bi-calendar-x::before { content: "\f1f5"; } -.bi-calendar::before { content: "\f1f6"; } -.bi-calendar2-check-fill::before { content: "\f1f7"; } -.bi-calendar2-check::before { content: "\f1f8"; } -.bi-calendar2-date-fill::before { content: "\f1f9"; } -.bi-calendar2-date::before { content: "\f1fa"; } -.bi-calendar2-day-fill::before { content: "\f1fb"; } -.bi-calendar2-day::before { content: "\f1fc"; } -.bi-calendar2-event-fill::before { content: "\f1fd"; } -.bi-calendar2-event::before { content: "\f1fe"; } -.bi-calendar2-fill::before { content: "\f1ff"; } -.bi-calendar2-minus-fill::before { content: "\f200"; } -.bi-calendar2-minus::before { content: "\f201"; } -.bi-calendar2-month-fill::before { content: "\f202"; } -.bi-calendar2-month::before { content: "\f203"; } -.bi-calendar2-plus-fill::before { content: "\f204"; } -.bi-calendar2-plus::before { content: "\f205"; } -.bi-calendar2-range-fill::before { content: "\f206"; } -.bi-calendar2-range::before { content: "\f207"; } -.bi-calendar2-week-fill::before { content: "\f208"; } -.bi-calendar2-week::before { content: "\f209"; } -.bi-calendar2-x-fill::before { content: "\f20a"; } -.bi-calendar2-x::before { content: "\f20b"; } -.bi-calendar2::before { content: "\f20c"; } -.bi-calendar3-event-fill::before { content: "\f20d"; } -.bi-calendar3-event::before { content: "\f20e"; } -.bi-calendar3-fill::before { content: "\f20f"; } -.bi-calendar3-range-fill::before { content: "\f210"; } -.bi-calendar3-range::before { content: "\f211"; } -.bi-calendar3-week-fill::before { content: "\f212"; } -.bi-calendar3-week::before { content: "\f213"; } -.bi-calendar3::before { content: "\f214"; } -.bi-calendar4-event::before { content: "\f215"; } -.bi-calendar4-range::before { content: "\f216"; } -.bi-calendar4-week::before { content: "\f217"; } -.bi-calendar4::before { content: "\f218"; } -.bi-camera-fill::before { content: "\f219"; } -.bi-camera-reels-fill::before { content: "\f21a"; } -.bi-camera-reels::before { content: "\f21b"; } -.bi-camera-video-fill::before { content: "\f21c"; } -.bi-camera-video-off-fill::before { content: "\f21d"; } -.bi-camera-video-off::before { content: "\f21e"; } -.bi-camera-video::before { content: "\f21f"; } -.bi-camera::before { content: "\f220"; } -.bi-camera2::before { content: "\f221"; } -.bi-capslock-fill::before { content: "\f222"; } -.bi-capslock::before { content: "\f223"; } -.bi-card-checklist::before { content: "\f224"; } -.bi-card-heading::before { content: "\f225"; } -.bi-card-image::before { content: "\f226"; } -.bi-card-list::before { content: "\f227"; } -.bi-card-text::before { content: "\f228"; } -.bi-caret-down-fill::before { content: "\f229"; } -.bi-caret-down-square-fill::before { content: "\f22a"; } -.bi-caret-down-square::before { content: "\f22b"; } -.bi-caret-down::before { content: "\f22c"; } -.bi-caret-left-fill::before { content: "\f22d"; } -.bi-caret-left-square-fill::before { content: "\f22e"; } -.bi-caret-left-square::before { content: "\f22f"; } -.bi-caret-left::before { content: "\f230"; } -.bi-caret-right-fill::before { content: "\f231"; } -.bi-caret-right-square-fill::before { content: "\f232"; } -.bi-caret-right-square::before { content: "\f233"; } -.bi-caret-right::before { content: "\f234"; } -.bi-caret-up-fill::before { content: "\f235"; } -.bi-caret-up-square-fill::before { content: "\f236"; } -.bi-caret-up-square::before { content: "\f237"; } -.bi-caret-up::before { content: "\f238"; } -.bi-cart-check-fill::before { content: "\f239"; } -.bi-cart-check::before { content: "\f23a"; } -.bi-cart-dash-fill::before { content: "\f23b"; } -.bi-cart-dash::before { content: "\f23c"; } -.bi-cart-fill::before { content: "\f23d"; } -.bi-cart-plus-fill::before { content: "\f23e"; } -.bi-cart-plus::before { content: "\f23f"; } -.bi-cart-x-fill::before { content: "\f240"; } -.bi-cart-x::before { content: "\f241"; } -.bi-cart::before { content: "\f242"; } -.bi-cart2::before { content: "\f243"; } -.bi-cart3::before { content: "\f244"; } -.bi-cart4::before { content: "\f245"; } -.bi-cash-stack::before { content: "\f246"; } -.bi-cash::before { content: "\f247"; } -.bi-cast::before { content: "\f248"; } -.bi-chat-dots-fill::before { content: "\f249"; } -.bi-chat-dots::before { content: "\f24a"; } -.bi-chat-fill::before { content: "\f24b"; } -.bi-chat-left-dots-fill::before { content: "\f24c"; } -.bi-chat-left-dots::before { content: "\f24d"; } -.bi-chat-left-fill::before { content: "\f24e"; } -.bi-chat-left-quote-fill::before { content: "\f24f"; } -.bi-chat-left-quote::before { content: "\f250"; } -.bi-chat-left-text-fill::before { content: "\f251"; } -.bi-chat-left-text::before { content: "\f252"; } -.bi-chat-left::before { content: "\f253"; } -.bi-chat-quote-fill::before { content: "\f254"; } -.bi-chat-quote::before { content: "\f255"; } -.bi-chat-right-dots-fill::before { content: "\f256"; } -.bi-chat-right-dots::before { content: "\f257"; } -.bi-chat-right-fill::before { content: "\f258"; } -.bi-chat-right-quote-fill::before { content: "\f259"; } -.bi-chat-right-quote::before { content: "\f25a"; } -.bi-chat-right-text-fill::before { content: "\f25b"; } -.bi-chat-right-text::before { content: "\f25c"; } -.bi-chat-right::before { content: "\f25d"; } -.bi-chat-square-dots-fill::before { content: "\f25e"; } -.bi-chat-square-dots::before { content: "\f25f"; } -.bi-chat-square-fill::before { content: "\f260"; } -.bi-chat-square-quote-fill::before { content: "\f261"; } -.bi-chat-square-quote::before { content: "\f262"; } -.bi-chat-square-text-fill::before { content: "\f263"; } -.bi-chat-square-text::before { content: "\f264"; } -.bi-chat-square::before { content: "\f265"; } -.bi-chat-text-fill::before { content: "\f266"; } -.bi-chat-text::before { content: "\f267"; } -.bi-chat::before { content: "\f268"; } -.bi-check-all::before { content: "\f269"; } -.bi-check-circle-fill::before { content: "\f26a"; } -.bi-check-circle::before { content: "\f26b"; } -.bi-check-square-fill::before { content: "\f26c"; } -.bi-check-square::before { content: "\f26d"; } -.bi-check::before { content: "\f26e"; } -.bi-check2-all::before { content: "\f26f"; } -.bi-check2-circle::before { content: "\f270"; } -.bi-check2-square::before { content: "\f271"; } -.bi-check2::before { content: "\f272"; } -.bi-chevron-bar-contract::before { content: "\f273"; } -.bi-chevron-bar-down::before { content: "\f274"; } -.bi-chevron-bar-expand::before { content: "\f275"; } -.bi-chevron-bar-left::before { content: "\f276"; } -.bi-chevron-bar-right::before { content: "\f277"; } -.bi-chevron-bar-up::before { content: "\f278"; } -.bi-chevron-compact-down::before { content: "\f279"; } -.bi-chevron-compact-left::before { content: "\f27a"; } -.bi-chevron-compact-right::before { content: "\f27b"; } -.bi-chevron-compact-up::before { content: "\f27c"; } -.bi-chevron-contract::before { content: "\f27d"; } -.bi-chevron-double-down::before { content: "\f27e"; } -.bi-chevron-double-left::before { content: "\f27f"; } -.bi-chevron-double-right::before { content: "\f280"; } -.bi-chevron-double-up::before { content: "\f281"; } -.bi-chevron-down::before { content: "\f282"; } -.bi-chevron-expand::before { content: "\f283"; } -.bi-chevron-left::before { content: "\f284"; } -.bi-chevron-right::before { content: "\f285"; } -.bi-chevron-up::before { content: "\f286"; } -.bi-circle-fill::before { content: "\f287"; } -.bi-circle-half::before { content: "\f288"; } -.bi-circle-square::before { content: "\f289"; } -.bi-circle::before { content: "\f28a"; } -.bi-clipboard-check::before { content: "\f28b"; } -.bi-clipboard-data::before { content: "\f28c"; } -.bi-clipboard-minus::before { content: "\f28d"; } -.bi-clipboard-plus::before { content: "\f28e"; } -.bi-clipboard-x::before { content: "\f28f"; } -.bi-clipboard::before { content: "\f290"; } -.bi-clock-fill::before { content: "\f291"; } -.bi-clock-history::before { content: "\f292"; } -.bi-clock::before { content: "\f293"; } -.bi-cloud-arrow-down-fill::before { content: "\f294"; } -.bi-cloud-arrow-down::before { content: "\f295"; } -.bi-cloud-arrow-up-fill::before { content: "\f296"; } -.bi-cloud-arrow-up::before { content: "\f297"; } -.bi-cloud-check-fill::before { content: "\f298"; } -.bi-cloud-check::before { content: "\f299"; } -.bi-cloud-download-fill::before { content: "\f29a"; } -.bi-cloud-download::before { content: "\f29b"; } -.bi-cloud-drizzle-fill::before { content: "\f29c"; } -.bi-cloud-drizzle::before { content: "\f29d"; } -.bi-cloud-fill::before { content: "\f29e"; } -.bi-cloud-fog-fill::before { content: "\f29f"; } -.bi-cloud-fog::before { content: "\f2a0"; } -.bi-cloud-fog2-fill::before { content: "\f2a1"; } -.bi-cloud-fog2::before { content: "\f2a2"; } -.bi-cloud-hail-fill::before { content: "\f2a3"; } -.bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-1::before { content: "\f2a5"; } -.bi-cloud-haze-fill::before { content: "\f2a6"; } -.bi-cloud-haze::before { content: "\f2a7"; } -.bi-cloud-haze2-fill::before { content: "\f2a8"; } -.bi-cloud-lightning-fill::before { content: "\f2a9"; } -.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } -.bi-cloud-lightning-rain::before { content: "\f2ab"; } -.bi-cloud-lightning::before { content: "\f2ac"; } -.bi-cloud-minus-fill::before { content: "\f2ad"; } -.bi-cloud-minus::before { content: "\f2ae"; } -.bi-cloud-moon-fill::before { content: "\f2af"; } -.bi-cloud-moon::before { content: "\f2b0"; } -.bi-cloud-plus-fill::before { content: "\f2b1"; } -.bi-cloud-plus::before { content: "\f2b2"; } -.bi-cloud-rain-fill::before { content: "\f2b3"; } -.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } -.bi-cloud-rain-heavy::before { content: "\f2b5"; } -.bi-cloud-rain::before { content: "\f2b6"; } -.bi-cloud-slash-fill::before { content: "\f2b7"; } -.bi-cloud-slash::before { content: "\f2b8"; } -.bi-cloud-sleet-fill::before { content: "\f2b9"; } -.bi-cloud-sleet::before { content: "\f2ba"; } -.bi-cloud-snow-fill::before { content: "\f2bb"; } -.bi-cloud-snow::before { content: "\f2bc"; } -.bi-cloud-sun-fill::before { content: "\f2bd"; } -.bi-cloud-sun::before { content: "\f2be"; } -.bi-cloud-upload-fill::before { content: "\f2bf"; } -.bi-cloud-upload::before { content: "\f2c0"; } -.bi-cloud::before { content: "\f2c1"; } -.bi-clouds-fill::before { content: "\f2c2"; } -.bi-clouds::before { content: "\f2c3"; } -.bi-cloudy-fill::before { content: "\f2c4"; } -.bi-cloudy::before { content: "\f2c5"; } -.bi-code-slash::before { content: "\f2c6"; } -.bi-code-square::before { content: "\f2c7"; } -.bi-code::before { content: "\f2c8"; } -.bi-collection-fill::before { content: "\f2c9"; } -.bi-collection-play-fill::before { content: "\f2ca"; } -.bi-collection-play::before { content: "\f2cb"; } -.bi-collection::before { content: "\f2cc"; } -.bi-columns-gap::before { content: "\f2cd"; } -.bi-columns::before { content: "\f2ce"; } -.bi-command::before { content: "\f2cf"; } -.bi-compass-fill::before { content: "\f2d0"; } -.bi-compass::before { content: "\f2d1"; } -.bi-cone-striped::before { content: "\f2d2"; } -.bi-cone::before { content: "\f2d3"; } -.bi-controller::before { content: "\f2d4"; } -.bi-cpu-fill::before { content: "\f2d5"; } -.bi-cpu::before { content: "\f2d6"; } -.bi-credit-card-2-back-fill::before { content: "\f2d7"; } -.bi-credit-card-2-back::before { content: "\f2d8"; } -.bi-credit-card-2-front-fill::before { content: "\f2d9"; } -.bi-credit-card-2-front::before { content: "\f2da"; } -.bi-credit-card-fill::before { content: "\f2db"; } -.bi-credit-card::before { content: "\f2dc"; } -.bi-crop::before { content: "\f2dd"; } -.bi-cup-fill::before { content: "\f2de"; } -.bi-cup-straw::before { content: "\f2df"; } -.bi-cup::before { content: "\f2e0"; } -.bi-cursor-fill::before { content: "\f2e1"; } -.bi-cursor-text::before { content: "\f2e2"; } -.bi-cursor::before { content: "\f2e3"; } -.bi-dash-circle-dotted::before { content: "\f2e4"; } -.bi-dash-circle-fill::before { content: "\f2e5"; } -.bi-dash-circle::before { content: "\f2e6"; } -.bi-dash-square-dotted::before { content: "\f2e7"; } -.bi-dash-square-fill::before { content: "\f2e8"; } -.bi-dash-square::before { content: "\f2e9"; } -.bi-dash::before { content: "\f2ea"; } -.bi-diagram-2-fill::before { content: "\f2eb"; } -.bi-diagram-2::before { content: "\f2ec"; } -.bi-diagram-3-fill::before { content: "\f2ed"; } -.bi-diagram-3::before { content: "\f2ee"; } -.bi-diamond-fill::before { content: "\f2ef"; } -.bi-diamond-half::before { content: "\f2f0"; } -.bi-diamond::before { content: "\f2f1"; } -.bi-dice-1-fill::before { content: "\f2f2"; } -.bi-dice-1::before { content: "\f2f3"; } -.bi-dice-2-fill::before { content: "\f2f4"; } -.bi-dice-2::before { content: "\f2f5"; } -.bi-dice-3-fill::before { content: "\f2f6"; } -.bi-dice-3::before { content: "\f2f7"; } -.bi-dice-4-fill::before { content: "\f2f8"; } -.bi-dice-4::before { content: "\f2f9"; } -.bi-dice-5-fill::before { content: "\f2fa"; } -.bi-dice-5::before { content: "\f2fb"; } -.bi-dice-6-fill::before { content: "\f2fc"; } -.bi-dice-6::before { content: "\f2fd"; } -.bi-disc-fill::before { content: "\f2fe"; } -.bi-disc::before { content: "\f2ff"; } -.bi-discord::before { content: "\f300"; } -.bi-display-fill::before { content: "\f301"; } -.bi-display::before { content: "\f302"; } -.bi-distribute-horizontal::before { content: "\f303"; } -.bi-distribute-vertical::before { content: "\f304"; } -.bi-door-closed-fill::before { content: "\f305"; } -.bi-door-closed::before { content: "\f306"; } -.bi-door-open-fill::before { content: "\f307"; } -.bi-door-open::before { content: "\f308"; } -.bi-dot::before { content: "\f309"; } -.bi-download::before { content: "\f30a"; } -.bi-droplet-fill::before { content: "\f30b"; } -.bi-droplet-half::before { content: "\f30c"; } -.bi-droplet::before { content: "\f30d"; } -.bi-earbuds::before { content: "\f30e"; } -.bi-easel-fill::before { content: "\f30f"; } -.bi-easel::before { content: "\f310"; } -.bi-egg-fill::before { content: "\f311"; } -.bi-egg-fried::before { content: "\f312"; } -.bi-egg::before { content: "\f313"; } -.bi-eject-fill::before { content: "\f314"; } -.bi-eject::before { content: "\f315"; } -.bi-emoji-angry-fill::before { content: "\f316"; } -.bi-emoji-angry::before { content: "\f317"; } -.bi-emoji-dizzy-fill::before { content: "\f318"; } -.bi-emoji-dizzy::before { content: "\f319"; } -.bi-emoji-expressionless-fill::before { content: "\f31a"; } -.bi-emoji-expressionless::before { content: "\f31b"; } -.bi-emoji-frown-fill::before { content: "\f31c"; } -.bi-emoji-frown::before { content: "\f31d"; } -.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } -.bi-emoji-heart-eyes::before { content: "\f31f"; } -.bi-emoji-laughing-fill::before { content: "\f320"; } -.bi-emoji-laughing::before { content: "\f321"; } -.bi-emoji-neutral-fill::before { content: "\f322"; } -.bi-emoji-neutral::before { content: "\f323"; } -.bi-emoji-smile-fill::before { content: "\f324"; } -.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } -.bi-emoji-smile-upside-down::before { content: "\f326"; } -.bi-emoji-smile::before { content: "\f327"; } -.bi-emoji-sunglasses-fill::before { content: "\f328"; } -.bi-emoji-sunglasses::before { content: "\f329"; } -.bi-emoji-wink-fill::before { content: "\f32a"; } -.bi-emoji-wink::before { content: "\f32b"; } -.bi-envelope-fill::before { content: "\f32c"; } -.bi-envelope-open-fill::before { content: "\f32d"; } -.bi-envelope-open::before { content: "\f32e"; } -.bi-envelope::before { content: "\f32f"; } -.bi-eraser-fill::before { content: "\f330"; } -.bi-eraser::before { content: "\f331"; } -.bi-exclamation-circle-fill::before { content: "\f332"; } -.bi-exclamation-circle::before { content: "\f333"; } -.bi-exclamation-diamond-fill::before { content: "\f334"; } -.bi-exclamation-diamond::before { content: "\f335"; } -.bi-exclamation-octagon-fill::before { content: "\f336"; } -.bi-exclamation-octagon::before { content: "\f337"; } -.bi-exclamation-square-fill::before { content: "\f338"; } -.bi-exclamation-square::before { content: "\f339"; } -.bi-exclamation-triangle-fill::before { content: "\f33a"; } -.bi-exclamation-triangle::before { content: "\f33b"; } -.bi-exclamation::before { content: "\f33c"; } -.bi-exclude::before { content: "\f33d"; } -.bi-eye-fill::before { content: "\f33e"; } -.bi-eye-slash-fill::before { content: "\f33f"; } -.bi-eye-slash::before { content: "\f340"; } -.bi-eye::before { content: "\f341"; } -.bi-eyedropper::before { content: "\f342"; } -.bi-eyeglasses::before { content: "\f343"; } -.bi-facebook::before { content: "\f344"; } -.bi-file-arrow-down-fill::before { content: "\f345"; } -.bi-file-arrow-down::before { content: "\f346"; } -.bi-file-arrow-up-fill::before { content: "\f347"; } -.bi-file-arrow-up::before { content: "\f348"; } -.bi-file-bar-graph-fill::before { content: "\f349"; } -.bi-file-bar-graph::before { content: "\f34a"; } -.bi-file-binary-fill::before { content: "\f34b"; } -.bi-file-binary::before { content: "\f34c"; } -.bi-file-break-fill::before { content: "\f34d"; } -.bi-file-break::before { content: "\f34e"; } -.bi-file-check-fill::before { content: "\f34f"; } -.bi-file-check::before { content: "\f350"; } -.bi-file-code-fill::before { content: "\f351"; } -.bi-file-code::before { content: "\f352"; } -.bi-file-diff-fill::before { content: "\f353"; } -.bi-file-diff::before { content: "\f354"; } -.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } -.bi-file-earmark-arrow-down::before { content: "\f356"; } -.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } -.bi-file-earmark-arrow-up::before { content: "\f358"; } -.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } -.bi-file-earmark-bar-graph::before { content: "\f35a"; } -.bi-file-earmark-binary-fill::before { content: "\f35b"; } -.bi-file-earmark-binary::before { content: "\f35c"; } -.bi-file-earmark-break-fill::before { content: "\f35d"; } -.bi-file-earmark-break::before { content: "\f35e"; } -.bi-file-earmark-check-fill::before { content: "\f35f"; } -.bi-file-earmark-check::before { content: "\f360"; } -.bi-file-earmark-code-fill::before { content: "\f361"; } -.bi-file-earmark-code::before { content: "\f362"; } -.bi-file-earmark-diff-fill::before { content: "\f363"; } -.bi-file-earmark-diff::before { content: "\f364"; } -.bi-file-earmark-easel-fill::before { content: "\f365"; } -.bi-file-earmark-easel::before { content: "\f366"; } -.bi-file-earmark-excel-fill::before { content: "\f367"; } -.bi-file-earmark-excel::before { content: "\f368"; } -.bi-file-earmark-fill::before { content: "\f369"; } -.bi-file-earmark-font-fill::before { content: "\f36a"; } -.bi-file-earmark-font::before { content: "\f36b"; } -.bi-file-earmark-image-fill::before { content: "\f36c"; } -.bi-file-earmark-image::before { content: "\f36d"; } -.bi-file-earmark-lock-fill::before { content: "\f36e"; } -.bi-file-earmark-lock::before { content: "\f36f"; } -.bi-file-earmark-lock2-fill::before { content: "\f370"; } -.bi-file-earmark-lock2::before { content: "\f371"; } -.bi-file-earmark-medical-fill::before { content: "\f372"; } -.bi-file-earmark-medical::before { content: "\f373"; } -.bi-file-earmark-minus-fill::before { content: "\f374"; } -.bi-file-earmark-minus::before { content: "\f375"; } -.bi-file-earmark-music-fill::before { content: "\f376"; } -.bi-file-earmark-music::before { content: "\f377"; } -.bi-file-earmark-person-fill::before { content: "\f378"; } -.bi-file-earmark-person::before { content: "\f379"; } -.bi-file-earmark-play-fill::before { content: "\f37a"; } -.bi-file-earmark-play::before { content: "\f37b"; } -.bi-file-earmark-plus-fill::before { content: "\f37c"; } -.bi-file-earmark-plus::before { content: "\f37d"; } -.bi-file-earmark-post-fill::before { content: "\f37e"; } -.bi-file-earmark-post::before { content: "\f37f"; } -.bi-file-earmark-ppt-fill::before { content: "\f380"; } -.bi-file-earmark-ppt::before { content: "\f381"; } -.bi-file-earmark-richtext-fill::before { content: "\f382"; } -.bi-file-earmark-richtext::before { content: "\f383"; } -.bi-file-earmark-ruled-fill::before { content: "\f384"; } -.bi-file-earmark-ruled::before { content: "\f385"; } -.bi-file-earmark-slides-fill::before { content: "\f386"; } -.bi-file-earmark-slides::before { content: "\f387"; } -.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } -.bi-file-earmark-spreadsheet::before { content: "\f389"; } -.bi-file-earmark-text-fill::before { content: "\f38a"; } -.bi-file-earmark-text::before { content: "\f38b"; } -.bi-file-earmark-word-fill::before { content: "\f38c"; } -.bi-file-earmark-word::before { content: "\f38d"; } -.bi-file-earmark-x-fill::before { content: "\f38e"; } -.bi-file-earmark-x::before { content: "\f38f"; } -.bi-file-earmark-zip-fill::before { content: "\f390"; } -.bi-file-earmark-zip::before { content: "\f391"; } -.bi-file-earmark::before { content: "\f392"; } -.bi-file-easel-fill::before { content: "\f393"; } -.bi-file-easel::before { content: "\f394"; } -.bi-file-excel-fill::before { content: "\f395"; } -.bi-file-excel::before { content: "\f396"; } -.bi-file-fill::before { content: "\f397"; } -.bi-file-font-fill::before { content: "\f398"; } -.bi-file-font::before { content: "\f399"; } -.bi-file-image-fill::before { content: "\f39a"; } -.bi-file-image::before { content: "\f39b"; } -.bi-file-lock-fill::before { content: "\f39c"; } -.bi-file-lock::before { content: "\f39d"; } -.bi-file-lock2-fill::before { content: "\f39e"; } -.bi-file-lock2::before { content: "\f39f"; } -.bi-file-medical-fill::before { content: "\f3a0"; } -.bi-file-medical::before { content: "\f3a1"; } -.bi-file-minus-fill::before { content: "\f3a2"; } -.bi-file-minus::before { content: "\f3a3"; } -.bi-file-music-fill::before { content: "\f3a4"; } -.bi-file-music::before { content: "\f3a5"; } -.bi-file-person-fill::before { content: "\f3a6"; } -.bi-file-person::before { content: "\f3a7"; } -.bi-file-play-fill::before { content: "\f3a8"; } -.bi-file-play::before { content: "\f3a9"; } -.bi-file-plus-fill::before { content: "\f3aa"; } -.bi-file-plus::before { content: "\f3ab"; } -.bi-file-post-fill::before { content: "\f3ac"; } -.bi-file-post::before { content: "\f3ad"; } -.bi-file-ppt-fill::before { content: "\f3ae"; } -.bi-file-ppt::before { content: "\f3af"; } -.bi-file-richtext-fill::before { content: "\f3b0"; } -.bi-file-richtext::before { content: "\f3b1"; } -.bi-file-ruled-fill::before { content: "\f3b2"; } -.bi-file-ruled::before { content: "\f3b3"; } -.bi-file-slides-fill::before { content: "\f3b4"; } -.bi-file-slides::before { content: "\f3b5"; } -.bi-file-spreadsheet-fill::before { content: "\f3b6"; } -.bi-file-spreadsheet::before { content: "\f3b7"; } -.bi-file-text-fill::before { content: "\f3b8"; } -.bi-file-text::before { content: "\f3b9"; } -.bi-file-word-fill::before { content: "\f3ba"; } -.bi-file-word::before { content: "\f3bb"; } -.bi-file-x-fill::before { content: "\f3bc"; } -.bi-file-x::before { content: "\f3bd"; } -.bi-file-zip-fill::before { content: "\f3be"; } -.bi-file-zip::before { content: "\f3bf"; } -.bi-file::before { content: "\f3c0"; } -.bi-files-alt::before { content: "\f3c1"; } -.bi-files::before { content: "\f3c2"; } -.bi-film::before { content: "\f3c3"; } -.bi-filter-circle-fill::before { content: "\f3c4"; } -.bi-filter-circle::before { content: "\f3c5"; } -.bi-filter-left::before { content: "\f3c6"; } -.bi-filter-right::before { content: "\f3c7"; } -.bi-filter-square-fill::before { content: "\f3c8"; } -.bi-filter-square::before { content: "\f3c9"; } -.bi-filter::before { content: "\f3ca"; } -.bi-flag-fill::before { content: "\f3cb"; } -.bi-flag::before { content: "\f3cc"; } -.bi-flower1::before { content: "\f3cd"; } -.bi-flower2::before { content: "\f3ce"; } -.bi-flower3::before { content: "\f3cf"; } -.bi-folder-check::before { content: "\f3d0"; } -.bi-folder-fill::before { content: "\f3d1"; } -.bi-folder-minus::before { content: "\f3d2"; } -.bi-folder-plus::before { content: "\f3d3"; } -.bi-folder-symlink-fill::before { content: "\f3d4"; } -.bi-folder-symlink::before { content: "\f3d5"; } -.bi-folder-x::before { content: "\f3d6"; } -.bi-folder::before { content: "\f3d7"; } -.bi-folder2-open::before { content: "\f3d8"; } -.bi-folder2::before { content: "\f3d9"; } -.bi-fonts::before { content: "\f3da"; } -.bi-forward-fill::before { content: "\f3db"; } -.bi-forward::before { content: "\f3dc"; } -.bi-front::before { content: "\f3dd"; } -.bi-fullscreen-exit::before { content: "\f3de"; } -.bi-fullscreen::before { content: "\f3df"; } -.bi-funnel-fill::before { content: "\f3e0"; } -.bi-funnel::before { content: "\f3e1"; } -.bi-gear-fill::before { content: "\f3e2"; } -.bi-gear-wide-connected::before { content: "\f3e3"; } -.bi-gear-wide::before { content: "\f3e4"; } -.bi-gear::before { content: "\f3e5"; } -.bi-gem::before { content: "\f3e6"; } -.bi-geo-alt-fill::before { content: "\f3e7"; } -.bi-geo-alt::before { content: "\f3e8"; } -.bi-geo-fill::before { content: "\f3e9"; } -.bi-geo::before { content: "\f3ea"; } -.bi-gift-fill::before { content: "\f3eb"; } -.bi-gift::before { content: "\f3ec"; } -.bi-github::before { content: "\f3ed"; } -.bi-globe::before { content: "\f3ee"; } -.bi-globe2::before { content: "\f3ef"; } -.bi-google::before { content: "\f3f0"; } -.bi-graph-down::before { content: "\f3f1"; } -.bi-graph-up::before { content: "\f3f2"; } -.bi-grid-1x2-fill::before { content: "\f3f3"; } -.bi-grid-1x2::before { content: "\f3f4"; } -.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } -.bi-grid-3x2-gap::before { content: "\f3f6"; } -.bi-grid-3x2::before { content: "\f3f7"; } -.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } -.bi-grid-3x3-gap::before { content: "\f3f9"; } -.bi-grid-3x3::before { content: "\f3fa"; } -.bi-grid-fill::before { content: "\f3fb"; } -.bi-grid::before { content: "\f3fc"; } -.bi-grip-horizontal::before { content: "\f3fd"; } -.bi-grip-vertical::before { content: "\f3fe"; } -.bi-hammer::before { content: "\f3ff"; } -.bi-hand-index-fill::before { content: "\f400"; } -.bi-hand-index-thumb-fill::before { content: "\f401"; } -.bi-hand-index-thumb::before { content: "\f402"; } -.bi-hand-index::before { content: "\f403"; } -.bi-hand-thumbs-down-fill::before { content: "\f404"; } -.bi-hand-thumbs-down::before { content: "\f405"; } -.bi-hand-thumbs-up-fill::before { content: "\f406"; } -.bi-hand-thumbs-up::before { content: "\f407"; } -.bi-handbag-fill::before { content: "\f408"; } -.bi-handbag::before { content: "\f409"; } -.bi-hash::before { content: "\f40a"; } -.bi-hdd-fill::before { content: "\f40b"; } -.bi-hdd-network-fill::before { content: "\f40c"; } -.bi-hdd-network::before { content: "\f40d"; } -.bi-hdd-rack-fill::before { content: "\f40e"; } -.bi-hdd-rack::before { content: "\f40f"; } -.bi-hdd-stack-fill::before { content: "\f410"; } -.bi-hdd-stack::before { content: "\f411"; } -.bi-hdd::before { content: "\f412"; } -.bi-headphones::before { content: "\f413"; } -.bi-headset::before { content: "\f414"; } -.bi-heart-fill::before { content: "\f415"; } -.bi-heart-half::before { content: "\f416"; } -.bi-heart::before { content: "\f417"; } -.bi-heptagon-fill::before { content: "\f418"; } -.bi-heptagon-half::before { content: "\f419"; } -.bi-heptagon::before { content: "\f41a"; } -.bi-hexagon-fill::before { content: "\f41b"; } -.bi-hexagon-half::before { content: "\f41c"; } -.bi-hexagon::before { content: "\f41d"; } -.bi-hourglass-bottom::before { content: "\f41e"; } -.bi-hourglass-split::before { content: "\f41f"; } -.bi-hourglass-top::before { content: "\f420"; } -.bi-hourglass::before { content: "\f421"; } -.bi-house-door-fill::before { content: "\f422"; } -.bi-house-door::before { content: "\f423"; } -.bi-house-fill::before { content: "\f424"; } -.bi-house::before { content: "\f425"; } -.bi-hr::before { content: "\f426"; } -.bi-hurricane::before { content: "\f427"; } -.bi-image-alt::before { content: "\f428"; } -.bi-image-fill::before { content: "\f429"; } -.bi-image::before { content: "\f42a"; } -.bi-images::before { content: "\f42b"; } -.bi-inbox-fill::before { content: "\f42c"; } -.bi-inbox::before { content: "\f42d"; } -.bi-inboxes-fill::before { content: "\f42e"; } -.bi-inboxes::before { content: "\f42f"; } -.bi-info-circle-fill::before { content: "\f430"; } -.bi-info-circle::before { content: "\f431"; } -.bi-info-square-fill::before { content: "\f432"; } -.bi-info-square::before { content: "\f433"; } -.bi-info::before { content: "\f434"; } -.bi-input-cursor-text::before { content: "\f435"; } -.bi-input-cursor::before { content: "\f436"; } -.bi-instagram::before { content: "\f437"; } -.bi-intersect::before { content: "\f438"; } -.bi-journal-album::before { content: "\f439"; } -.bi-journal-arrow-down::before { content: "\f43a"; } -.bi-journal-arrow-up::before { content: "\f43b"; } -.bi-journal-bookmark-fill::before { content: "\f43c"; } -.bi-journal-bookmark::before { content: "\f43d"; } -.bi-journal-check::before { content: "\f43e"; } -.bi-journal-code::before { content: "\f43f"; } -.bi-journal-medical::before { content: "\f440"; } -.bi-journal-minus::before { content: "\f441"; } -.bi-journal-plus::before { content: "\f442"; } -.bi-journal-richtext::before { content: "\f443"; } -.bi-journal-text::before { content: "\f444"; } -.bi-journal-x::before { content: "\f445"; } -.bi-journal::before { content: "\f446"; } -.bi-journals::before { content: "\f447"; } -.bi-joystick::before { content: "\f448"; } -.bi-justify-left::before { content: "\f449"; } -.bi-justify-right::before { content: "\f44a"; } -.bi-justify::before { content: "\f44b"; } -.bi-kanban-fill::before { content: "\f44c"; } -.bi-kanban::before { content: "\f44d"; } -.bi-key-fill::before { content: "\f44e"; } -.bi-key::before { content: "\f44f"; } -.bi-keyboard-fill::before { content: "\f450"; } -.bi-keyboard::before { content: "\f451"; } -.bi-ladder::before { content: "\f452"; } -.bi-lamp-fill::before { content: "\f453"; } -.bi-lamp::before { content: "\f454"; } -.bi-laptop-fill::before { content: "\f455"; } -.bi-laptop::before { content: "\f456"; } -.bi-layer-backward::before { content: "\f457"; } -.bi-layer-forward::before { content: "\f458"; } -.bi-layers-fill::before { content: "\f459"; } -.bi-layers-half::before { content: "\f45a"; } -.bi-layers::before { content: "\f45b"; } -.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } -.bi-layout-sidebar-inset::before { content: "\f45d"; } -.bi-layout-sidebar-reverse::before { content: "\f45e"; } -.bi-layout-sidebar::before { content: "\f45f"; } -.bi-layout-split::before { content: "\f460"; } -.bi-layout-text-sidebar-reverse::before { content: "\f461"; } -.bi-layout-text-sidebar::before { content: "\f462"; } -.bi-layout-text-window-reverse::before { content: "\f463"; } -.bi-layout-text-window::before { content: "\f464"; } -.bi-layout-three-columns::before { content: "\f465"; } -.bi-layout-wtf::before { content: "\f466"; } -.bi-life-preserver::before { content: "\f467"; } -.bi-lightbulb-fill::before { content: "\f468"; } -.bi-lightbulb-off-fill::before { content: "\f469"; } -.bi-lightbulb-off::before { content: "\f46a"; } -.bi-lightbulb::before { content: "\f46b"; } -.bi-lightning-charge-fill::before { content: "\f46c"; } -.bi-lightning-charge::before { content: "\f46d"; } -.bi-lightning-fill::before { content: "\f46e"; } -.bi-lightning::before { content: "\f46f"; } -.bi-link-45deg::before { content: "\f470"; } -.bi-link::before { content: "\f471"; } -.bi-linkedin::before { content: "\f472"; } -.bi-list-check::before { content: "\f473"; } -.bi-list-nested::before { content: "\f474"; } -.bi-list-ol::before { content: "\f475"; } -.bi-list-stars::before { content: "\f476"; } -.bi-list-task::before { content: "\f477"; } -.bi-list-ul::before { content: "\f478"; } -.bi-list::before { content: "\f479"; } -.bi-lock-fill::before { content: "\f47a"; } -.bi-lock::before { content: "\f47b"; } -.bi-mailbox::before { content: "\f47c"; } -.bi-mailbox2::before { content: "\f47d"; } -.bi-map-fill::before { content: "\f47e"; } -.bi-map::before { content: "\f47f"; } -.bi-markdown-fill::before { content: "\f480"; } -.bi-markdown::before { content: "\f481"; } -.bi-mask::before { content: "\f482"; } -.bi-megaphone-fill::before { content: "\f483"; } -.bi-megaphone::before { content: "\f484"; } -.bi-menu-app-fill::before { content: "\f485"; } -.bi-menu-app::before { content: "\f486"; } -.bi-menu-button-fill::before { content: "\f487"; } -.bi-menu-button-wide-fill::before { content: "\f488"; } -.bi-menu-button-wide::before { content: "\f489"; } -.bi-menu-button::before { content: "\f48a"; } -.bi-menu-down::before { content: "\f48b"; } -.bi-menu-up::before { content: "\f48c"; } -.bi-mic-fill::before { content: "\f48d"; } -.bi-mic-mute-fill::before { content: "\f48e"; } -.bi-mic-mute::before { content: "\f48f"; } -.bi-mic::before { content: "\f490"; } -.bi-minecart-loaded::before { content: "\f491"; } -.bi-minecart::before { content: "\f492"; } -.bi-moisture::before { content: "\f493"; } -.bi-moon-fill::before { content: "\f494"; } -.bi-moon-stars-fill::before { content: "\f495"; } -.bi-moon-stars::before { content: "\f496"; } -.bi-moon::before { content: "\f497"; } -.bi-mouse-fill::before { content: "\f498"; } -.bi-mouse::before { content: "\f499"; } -.bi-mouse2-fill::before { content: "\f49a"; } -.bi-mouse2::before { content: "\f49b"; } -.bi-mouse3-fill::before { content: "\f49c"; } -.bi-mouse3::before { content: "\f49d"; } -.bi-music-note-beamed::before { content: "\f49e"; } -.bi-music-note-list::before { content: "\f49f"; } -.bi-music-note::before { content: "\f4a0"; } -.bi-music-player-fill::before { content: "\f4a1"; } -.bi-music-player::before { content: "\f4a2"; } -.bi-newspaper::before { content: "\f4a3"; } -.bi-node-minus-fill::before { content: "\f4a4"; } -.bi-node-minus::before { content: "\f4a5"; } -.bi-node-plus-fill::before { content: "\f4a6"; } -.bi-node-plus::before { content: "\f4a7"; } -.bi-nut-fill::before { content: "\f4a8"; } -.bi-nut::before { content: "\f4a9"; } -.bi-octagon-fill::before { content: "\f4aa"; } -.bi-octagon-half::before { content: "\f4ab"; } -.bi-octagon::before { content: "\f4ac"; } -.bi-option::before { content: "\f4ad"; } -.bi-outlet::before { content: "\f4ae"; } -.bi-paint-bucket::before { content: "\f4af"; } -.bi-palette-fill::before { content: "\f4b0"; } -.bi-palette::before { content: "\f4b1"; } -.bi-palette2::before { content: "\f4b2"; } -.bi-paperclip::before { content: "\f4b3"; } -.bi-paragraph::before { content: "\f4b4"; } -.bi-patch-check-fill::before { content: "\f4b5"; } -.bi-patch-check::before { content: "\f4b6"; } -.bi-patch-exclamation-fill::before { content: "\f4b7"; } -.bi-patch-exclamation::before { content: "\f4b8"; } -.bi-patch-minus-fill::before { content: "\f4b9"; } -.bi-patch-minus::before { content: "\f4ba"; } -.bi-patch-plus-fill::before { content: "\f4bb"; } -.bi-patch-plus::before { content: "\f4bc"; } -.bi-patch-question-fill::before { content: "\f4bd"; } -.bi-patch-question::before { content: "\f4be"; } -.bi-pause-btn-fill::before { content: "\f4bf"; } -.bi-pause-btn::before { content: "\f4c0"; } -.bi-pause-circle-fill::before { content: "\f4c1"; } -.bi-pause-circle::before { content: "\f4c2"; } -.bi-pause-fill::before { content: "\f4c3"; } -.bi-pause::before { content: "\f4c4"; } -.bi-peace-fill::before { content: "\f4c5"; } -.bi-peace::before { content: "\f4c6"; } -.bi-pen-fill::before { content: "\f4c7"; } -.bi-pen::before { content: "\f4c8"; } -.bi-pencil-fill::before { content: "\f4c9"; } -.bi-pencil-square::before { content: "\f4ca"; } -.bi-pencil::before { content: "\f4cb"; } -.bi-pentagon-fill::before { content: "\f4cc"; } -.bi-pentagon-half::before { content: "\f4cd"; } -.bi-pentagon::before { content: "\f4ce"; } -.bi-people-fill::before { content: "\f4cf"; } -.bi-people::before { content: "\f4d0"; } -.bi-percent::before { content: "\f4d1"; } -.bi-person-badge-fill::before { content: "\f4d2"; } -.bi-person-badge::before { content: "\f4d3"; } -.bi-person-bounding-box::before { content: "\f4d4"; } -.bi-person-check-fill::before { content: "\f4d5"; } -.bi-person-check::before { content: "\f4d6"; } -.bi-person-circle::before { content: "\f4d7"; } -.bi-person-dash-fill::before { content: "\f4d8"; } -.bi-person-dash::before { content: "\f4d9"; } -.bi-person-fill::before { content: "\f4da"; } -.bi-person-lines-fill::before { content: "\f4db"; } -.bi-person-plus-fill::before { content: "\f4dc"; } -.bi-person-plus::before { content: "\f4dd"; } -.bi-person-square::before { content: "\f4de"; } -.bi-person-x-fill::before { content: "\f4df"; } -.bi-person-x::before { content: "\f4e0"; } -.bi-person::before { content: "\f4e1"; } -.bi-phone-fill::before { content: "\f4e2"; } -.bi-phone-landscape-fill::before { content: "\f4e3"; } -.bi-phone-landscape::before { content: "\f4e4"; } -.bi-phone-vibrate-fill::before { content: "\f4e5"; } -.bi-phone-vibrate::before { content: "\f4e6"; } -.bi-phone::before { content: "\f4e7"; } -.bi-pie-chart-fill::before { content: "\f4e8"; } -.bi-pie-chart::before { content: "\f4e9"; } -.bi-pin-angle-fill::before { content: "\f4ea"; } -.bi-pin-angle::before { content: "\f4eb"; } -.bi-pin-fill::before { content: "\f4ec"; } -.bi-pin::before { content: "\f4ed"; } -.bi-pip-fill::before { content: "\f4ee"; } -.bi-pip::before { content: "\f4ef"; } -.bi-play-btn-fill::before { content: "\f4f0"; } -.bi-play-btn::before { content: "\f4f1"; } -.bi-play-circle-fill::before { content: "\f4f2"; } -.bi-play-circle::before { content: "\f4f3"; } -.bi-play-fill::before { content: "\f4f4"; } -.bi-play::before { content: "\f4f5"; } -.bi-plug-fill::before { content: "\f4f6"; } -.bi-plug::before { content: "\f4f7"; } -.bi-plus-circle-dotted::before { content: "\f4f8"; } -.bi-plus-circle-fill::before { content: "\f4f9"; } -.bi-plus-circle::before { content: "\f4fa"; } -.bi-plus-square-dotted::before { content: "\f4fb"; } -.bi-plus-square-fill::before { content: "\f4fc"; } -.bi-plus-square::before { content: "\f4fd"; } -.bi-plus::before { content: "\f4fe"; } -.bi-power::before { content: "\f4ff"; } -.bi-printer-fill::before { content: "\f500"; } -.bi-printer::before { content: "\f501"; } -.bi-puzzle-fill::before { content: "\f502"; } -.bi-puzzle::before { content: "\f503"; } -.bi-question-circle-fill::before { content: "\f504"; } -.bi-question-circle::before { content: "\f505"; } -.bi-question-diamond-fill::before { content: "\f506"; } -.bi-question-diamond::before { content: "\f507"; } -.bi-question-octagon-fill::before { content: "\f508"; } -.bi-question-octagon::before { content: "\f509"; } -.bi-question-square-fill::before { content: "\f50a"; } -.bi-question-square::before { content: "\f50b"; } -.bi-question::before { content: "\f50c"; } -.bi-rainbow::before { content: "\f50d"; } -.bi-receipt-cutoff::before { content: "\f50e"; } -.bi-receipt::before { content: "\f50f"; } -.bi-reception-0::before { content: "\f510"; } -.bi-reception-1::before { content: "\f511"; } -.bi-reception-2::before { content: "\f512"; } -.bi-reception-3::before { content: "\f513"; } -.bi-reception-4::before { content: "\f514"; } -.bi-record-btn-fill::before { content: "\f515"; } -.bi-record-btn::before { content: "\f516"; } -.bi-record-circle-fill::before { content: "\f517"; } -.bi-record-circle::before { content: "\f518"; } -.bi-record-fill::before { content: "\f519"; } -.bi-record::before { content: "\f51a"; } -.bi-record2-fill::before { content: "\f51b"; } -.bi-record2::before { content: "\f51c"; } -.bi-reply-all-fill::before { content: "\f51d"; } -.bi-reply-all::before { content: "\f51e"; } -.bi-reply-fill::before { content: "\f51f"; } -.bi-reply::before { content: "\f520"; } -.bi-rss-fill::before { content: "\f521"; } -.bi-rss::before { content: "\f522"; } -.bi-rulers::before { content: "\f523"; } -.bi-save-fill::before { content: "\f524"; } -.bi-save::before { content: "\f525"; } -.bi-save2-fill::before { content: "\f526"; } -.bi-save2::before { content: "\f527"; } -.bi-scissors::before { content: "\f528"; } -.bi-screwdriver::before { content: "\f529"; } -.bi-search::before { content: "\f52a"; } -.bi-segmented-nav::before { content: "\f52b"; } -.bi-server::before { content: "\f52c"; } -.bi-share-fill::before { content: "\f52d"; } -.bi-share::before { content: "\f52e"; } -.bi-shield-check::before { content: "\f52f"; } -.bi-shield-exclamation::before { content: "\f530"; } -.bi-shield-fill-check::before { content: "\f531"; } -.bi-shield-fill-exclamation::before { content: "\f532"; } -.bi-shield-fill-minus::before { content: "\f533"; } -.bi-shield-fill-plus::before { content: "\f534"; } -.bi-shield-fill-x::before { content: "\f535"; } -.bi-shield-fill::before { content: "\f536"; } -.bi-shield-lock-fill::before { content: "\f537"; } -.bi-shield-lock::before { content: "\f538"; } -.bi-shield-minus::before { content: "\f539"; } -.bi-shield-plus::before { content: "\f53a"; } -.bi-shield-shaded::before { content: "\f53b"; } -.bi-shield-slash-fill::before { content: "\f53c"; } -.bi-shield-slash::before { content: "\f53d"; } -.bi-shield-x::before { content: "\f53e"; } -.bi-shield::before { content: "\f53f"; } -.bi-shift-fill::before { content: "\f540"; } -.bi-shift::before { content: "\f541"; } -.bi-shop-window::before { content: "\f542"; } -.bi-shop::before { content: "\f543"; } -.bi-shuffle::before { content: "\f544"; } -.bi-signpost-2-fill::before { content: "\f545"; } -.bi-signpost-2::before { content: "\f546"; } -.bi-signpost-fill::before { content: "\f547"; } -.bi-signpost-split-fill::before { content: "\f548"; } -.bi-signpost-split::before { content: "\f549"; } -.bi-signpost::before { content: "\f54a"; } -.bi-sim-fill::before { content: "\f54b"; } -.bi-sim::before { content: "\f54c"; } -.bi-skip-backward-btn-fill::before { content: "\f54d"; } -.bi-skip-backward-btn::before { content: "\f54e"; } -.bi-skip-backward-circle-fill::before { content: "\f54f"; } -.bi-skip-backward-circle::before { content: "\f550"; } -.bi-skip-backward-fill::before { content: "\f551"; } -.bi-skip-backward::before { content: "\f552"; } -.bi-skip-end-btn-fill::before { content: "\f553"; } -.bi-skip-end-btn::before { content: "\f554"; } -.bi-skip-end-circle-fill::before { content: "\f555"; } -.bi-skip-end-circle::before { content: "\f556"; } -.bi-skip-end-fill::before { content: "\f557"; } -.bi-skip-end::before { content: "\f558"; } -.bi-skip-forward-btn-fill::before { content: "\f559"; } -.bi-skip-forward-btn::before { content: "\f55a"; } -.bi-skip-forward-circle-fill::before { content: "\f55b"; } -.bi-skip-forward-circle::before { content: "\f55c"; } -.bi-skip-forward-fill::before { content: "\f55d"; } -.bi-skip-forward::before { content: "\f55e"; } -.bi-skip-start-btn-fill::before { content: "\f55f"; } -.bi-skip-start-btn::before { content: "\f560"; } -.bi-skip-start-circle-fill::before { content: "\f561"; } -.bi-skip-start-circle::before { content: "\f562"; } -.bi-skip-start-fill::before { content: "\f563"; } -.bi-skip-start::before { content: "\f564"; } -.bi-slack::before { content: "\f565"; } -.bi-slash-circle-fill::before { content: "\f566"; } -.bi-slash-circle::before { content: "\f567"; } -.bi-slash-square-fill::before { content: "\f568"; } -.bi-slash-square::before { content: "\f569"; } -.bi-slash::before { content: "\f56a"; } -.bi-sliders::before { content: "\f56b"; } -.bi-smartwatch::before { content: "\f56c"; } -.bi-snow::before { content: "\f56d"; } -.bi-snow2::before { content: "\f56e"; } -.bi-snow3::before { content: "\f56f"; } -.bi-sort-alpha-down-alt::before { content: "\f570"; } -.bi-sort-alpha-down::before { content: "\f571"; } -.bi-sort-alpha-up-alt::before { content: "\f572"; } -.bi-sort-alpha-up::before { content: "\f573"; } -.bi-sort-down-alt::before { content: "\f574"; } -.bi-sort-down::before { content: "\f575"; } -.bi-sort-numeric-down-alt::before { content: "\f576"; } -.bi-sort-numeric-down::before { content: "\f577"; } -.bi-sort-numeric-up-alt::before { content: "\f578"; } -.bi-sort-numeric-up::before { content: "\f579"; } -.bi-sort-up-alt::before { content: "\f57a"; } -.bi-sort-up::before { content: "\f57b"; } -.bi-soundwave::before { content: "\f57c"; } -.bi-speaker-fill::before { content: "\f57d"; } -.bi-speaker::before { content: "\f57e"; } -.bi-speedometer::before { content: "\f57f"; } -.bi-speedometer2::before { content: "\f580"; } -.bi-spellcheck::before { content: "\f581"; } -.bi-square-fill::before { content: "\f582"; } -.bi-square-half::before { content: "\f583"; } -.bi-square::before { content: "\f584"; } -.bi-stack::before { content: "\f585"; } -.bi-star-fill::before { content: "\f586"; } -.bi-star-half::before { content: "\f587"; } -.bi-star::before { content: "\f588"; } -.bi-stars::before { content: "\f589"; } -.bi-stickies-fill::before { content: "\f58a"; } -.bi-stickies::before { content: "\f58b"; } -.bi-sticky-fill::before { content: "\f58c"; } -.bi-sticky::before { content: "\f58d"; } -.bi-stop-btn-fill::before { content: "\f58e"; } -.bi-stop-btn::before { content: "\f58f"; } -.bi-stop-circle-fill::before { content: "\f590"; } -.bi-stop-circle::before { content: "\f591"; } -.bi-stop-fill::before { content: "\f592"; } -.bi-stop::before { content: "\f593"; } -.bi-stoplights-fill::before { content: "\f594"; } -.bi-stoplights::before { content: "\f595"; } -.bi-stopwatch-fill::before { content: "\f596"; } -.bi-stopwatch::before { content: "\f597"; } -.bi-subtract::before { content: "\f598"; } -.bi-suit-club-fill::before { content: "\f599"; } -.bi-suit-club::before { content: "\f59a"; } -.bi-suit-diamond-fill::before { content: "\f59b"; } -.bi-suit-diamond::before { content: "\f59c"; } -.bi-suit-heart-fill::before { content: "\f59d"; } -.bi-suit-heart::before { content: "\f59e"; } -.bi-suit-spade-fill::before { content: "\f59f"; } -.bi-suit-spade::before { content: "\f5a0"; } -.bi-sun-fill::before { content: "\f5a1"; } -.bi-sun::before { content: "\f5a2"; } -.bi-sunglasses::before { content: "\f5a3"; } -.bi-sunrise-fill::before { content: "\f5a4"; } -.bi-sunrise::before { content: "\f5a5"; } -.bi-sunset-fill::before { content: "\f5a6"; } -.bi-sunset::before { content: "\f5a7"; } -.bi-symmetry-horizontal::before { content: "\f5a8"; } -.bi-symmetry-vertical::before { content: "\f5a9"; } -.bi-table::before { content: "\f5aa"; } -.bi-tablet-fill::before { content: "\f5ab"; } -.bi-tablet-landscape-fill::before { content: "\f5ac"; } -.bi-tablet-landscape::before { content: "\f5ad"; } -.bi-tablet::before { content: "\f5ae"; } -.bi-tag-fill::before { content: "\f5af"; } -.bi-tag::before { content: "\f5b0"; } -.bi-tags-fill::before { content: "\f5b1"; } -.bi-tags::before { content: "\f5b2"; } -.bi-telegram::before { content: "\f5b3"; } -.bi-telephone-fill::before { content: "\f5b4"; } -.bi-telephone-forward-fill::before { content: "\f5b5"; } -.bi-telephone-forward::before { content: "\f5b6"; } -.bi-telephone-inbound-fill::before { content: "\f5b7"; } -.bi-telephone-inbound::before { content: "\f5b8"; } -.bi-telephone-minus-fill::before { content: "\f5b9"; } -.bi-telephone-minus::before { content: "\f5ba"; } -.bi-telephone-outbound-fill::before { content: "\f5bb"; } -.bi-telephone-outbound::before { content: "\f5bc"; } -.bi-telephone-plus-fill::before { content: "\f5bd"; } -.bi-telephone-plus::before { content: "\f5be"; } -.bi-telephone-x-fill::before { content: "\f5bf"; } -.bi-telephone-x::before { content: "\f5c0"; } -.bi-telephone::before { content: "\f5c1"; } -.bi-terminal-fill::before { content: "\f5c2"; } -.bi-terminal::before { content: "\f5c3"; } -.bi-text-center::before { content: "\f5c4"; } -.bi-text-indent-left::before { content: "\f5c5"; } -.bi-text-indent-right::before { content: "\f5c6"; } -.bi-text-left::before { content: "\f5c7"; } -.bi-text-paragraph::before { content: "\f5c8"; } -.bi-text-right::before { content: "\f5c9"; } -.bi-textarea-resize::before { content: "\f5ca"; } -.bi-textarea-t::before { content: "\f5cb"; } -.bi-textarea::before { content: "\f5cc"; } -.bi-thermometer-half::before { content: "\f5cd"; } -.bi-thermometer-high::before { content: "\f5ce"; } -.bi-thermometer-low::before { content: "\f5cf"; } -.bi-thermometer-snow::before { content: "\f5d0"; } -.bi-thermometer-sun::before { content: "\f5d1"; } -.bi-thermometer::before { content: "\f5d2"; } -.bi-three-dots-vertical::before { content: "\f5d3"; } -.bi-three-dots::before { content: "\f5d4"; } -.bi-toggle-off::before { content: "\f5d5"; } -.bi-toggle-on::before { content: "\f5d6"; } -.bi-toggle2-off::before { content: "\f5d7"; } -.bi-toggle2-on::before { content: "\f5d8"; } -.bi-toggles::before { content: "\f5d9"; } -.bi-toggles2::before { content: "\f5da"; } -.bi-tools::before { content: "\f5db"; } -.bi-tornado::before { content: "\f5dc"; } -.bi-trash-fill::before { content: "\f5dd"; } -.bi-trash::before { content: "\f5de"; } -.bi-trash2-fill::before { content: "\f5df"; } -.bi-trash2::before { content: "\f5e0"; } -.bi-tree-fill::before { content: "\f5e1"; } -.bi-tree::before { content: "\f5e2"; } -.bi-triangle-fill::before { content: "\f5e3"; } -.bi-triangle-half::before { content: "\f5e4"; } -.bi-triangle::before { content: "\f5e5"; } -.bi-trophy-fill::before { content: "\f5e6"; } -.bi-trophy::before { content: "\f5e7"; } -.bi-tropical-storm::before { content: "\f5e8"; } -.bi-truck-flatbed::before { content: "\f5e9"; } -.bi-truck::before { content: "\f5ea"; } -.bi-tsunami::before { content: "\f5eb"; } -.bi-tv-fill::before { content: "\f5ec"; } -.bi-tv::before { content: "\f5ed"; } -.bi-twitch::before { content: "\f5ee"; } -.bi-twitter::before { content: "\f5ef"; } -.bi-type-bold::before { content: "\f5f0"; } -.bi-type-h1::before { content: "\f5f1"; } -.bi-type-h2::before { content: "\f5f2"; } -.bi-type-h3::before { content: "\f5f3"; } -.bi-type-italic::before { content: "\f5f4"; } -.bi-type-strikethrough::before { content: "\f5f5"; } -.bi-type-underline::before { content: "\f5f6"; } -.bi-type::before { content: "\f5f7"; } -.bi-ui-checks-grid::before { content: "\f5f8"; } -.bi-ui-checks::before { content: "\f5f9"; } -.bi-ui-radios-grid::before { content: "\f5fa"; } -.bi-ui-radios::before { content: "\f5fb"; } -.bi-umbrella-fill::before { content: "\f5fc"; } -.bi-umbrella::before { content: "\f5fd"; } -.bi-union::before { content: "\f5fe"; } -.bi-unlock-fill::before { content: "\f5ff"; } -.bi-unlock::before { content: "\f600"; } -.bi-upc-scan::before { content: "\f601"; } -.bi-upc::before { content: "\f602"; } -.bi-upload::before { content: "\f603"; } -.bi-vector-pen::before { content: "\f604"; } -.bi-view-list::before { content: "\f605"; } -.bi-view-stacked::before { content: "\f606"; } -.bi-vinyl-fill::before { content: "\f607"; } -.bi-vinyl::before { content: "\f608"; } -.bi-voicemail::before { content: "\f609"; } -.bi-volume-down-fill::before { content: "\f60a"; } -.bi-volume-down::before { content: "\f60b"; } -.bi-volume-mute-fill::before { content: "\f60c"; } -.bi-volume-mute::before { content: "\f60d"; } -.bi-volume-off-fill::before { content: "\f60e"; } -.bi-volume-off::before { content: "\f60f"; } -.bi-volume-up-fill::before { content: "\f610"; } -.bi-volume-up::before { content: "\f611"; } -.bi-vr::before { content: "\f612"; } -.bi-wallet-fill::before { content: "\f613"; } -.bi-wallet::before { content: "\f614"; } -.bi-wallet2::before { content: "\f615"; } -.bi-watch::before { content: "\f616"; } -.bi-water::before { content: "\f617"; } -.bi-whatsapp::before { content: "\f618"; } -.bi-wifi-1::before { content: "\f619"; } -.bi-wifi-2::before { content: "\f61a"; } -.bi-wifi-off::before { content: "\f61b"; } -.bi-wifi::before { content: "\f61c"; } -.bi-wind::before { content: "\f61d"; } -.bi-window-dock::before { content: "\f61e"; } -.bi-window-sidebar::before { content: "\f61f"; } -.bi-window::before { content: "\f620"; } -.bi-wrench::before { content: "\f621"; } -.bi-x-circle-fill::before { content: "\f622"; } -.bi-x-circle::before { content: "\f623"; } -.bi-x-diamond-fill::before { content: "\f624"; } -.bi-x-diamond::before { content: "\f625"; } -.bi-x-octagon-fill::before { content: "\f626"; } -.bi-x-octagon::before { content: "\f627"; } -.bi-x-square-fill::before { content: "\f628"; } -.bi-x-square::before { content: "\f629"; } -.bi-x::before { content: "\f62a"; } -.bi-youtube::before { content: "\f62b"; } -.bi-zoom-in::before { content: "\f62c"; } -.bi-zoom-out::before { content: "\f62d"; } -.bi-bank::before { content: "\f62e"; } -.bi-bank2::before { content: "\f62f"; } -.bi-bell-slash-fill::before { content: "\f630"; } -.bi-bell-slash::before { content: "\f631"; } -.bi-cash-coin::before { content: "\f632"; } -.bi-check-lg::before { content: "\f633"; } -.bi-coin::before { content: "\f634"; } -.bi-currency-bitcoin::before { content: "\f635"; } -.bi-currency-dollar::before { content: "\f636"; } -.bi-currency-euro::before { content: "\f637"; } -.bi-currency-exchange::before { content: "\f638"; } -.bi-currency-pound::before { content: "\f639"; } -.bi-currency-yen::before { content: "\f63a"; } -.bi-dash-lg::before { content: "\f63b"; } -.bi-exclamation-lg::before { content: "\f63c"; } -.bi-file-earmark-pdf-fill::before { content: "\f63d"; } -.bi-file-earmark-pdf::before { content: "\f63e"; } -.bi-file-pdf-fill::before { content: "\f63f"; } -.bi-file-pdf::before { content: "\f640"; } -.bi-gender-ambiguous::before { content: "\f641"; } -.bi-gender-female::before { content: "\f642"; } -.bi-gender-male::before { content: "\f643"; } -.bi-gender-trans::before { content: "\f644"; } -.bi-headset-vr::before { content: "\f645"; } -.bi-info-lg::before { content: "\f646"; } -.bi-mastodon::before { content: "\f647"; } -.bi-messenger::before { content: "\f648"; } -.bi-piggy-bank-fill::before { content: "\f649"; } -.bi-piggy-bank::before { content: "\f64a"; } -.bi-pin-map-fill::before { content: "\f64b"; } -.bi-pin-map::before { content: "\f64c"; } -.bi-plus-lg::before { content: "\f64d"; } -.bi-question-lg::before { content: "\f64e"; } -.bi-recycle::before { content: "\f64f"; } -.bi-reddit::before { content: "\f650"; } -.bi-safe-fill::before { content: "\f651"; } -.bi-safe2-fill::before { content: "\f652"; } -.bi-safe2::before { content: "\f653"; } -.bi-sd-card-fill::before { content: "\f654"; } -.bi-sd-card::before { content: "\f655"; } -.bi-skype::before { content: "\f656"; } -.bi-slash-lg::before { content: "\f657"; } -.bi-translate::before { content: "\f658"; } -.bi-x-lg::before { content: "\f659"; } -.bi-safe::before { content: "\f65a"; } -.bi-apple::before { content: "\f65b"; } -.bi-microsoft::before { content: "\f65d"; } -.bi-windows::before { content: "\f65e"; } -.bi-behance::before { content: "\f65c"; } -.bi-dribbble::before { content: "\f65f"; } -.bi-line::before { content: "\f660"; } -.bi-medium::before { content: "\f661"; } -.bi-paypal::before { content: "\f662"; } -.bi-pinterest::before { content: "\f663"; } -.bi-signal::before { content: "\f664"; } -.bi-snapchat::before { content: "\f665"; } -.bi-spotify::before { content: "\f666"; } -.bi-stack-overflow::before { content: "\f667"; } -.bi-strava::before { content: "\f668"; } -.bi-wordpress::before { content: "\f669"; } -.bi-vimeo::before { content: "\f66a"; } -.bi-activity::before { content: "\f66b"; } -.bi-easel2-fill::before { content: "\f66c"; } -.bi-easel2::before { content: "\f66d"; } -.bi-easel3-fill::before { content: "\f66e"; } -.bi-easel3::before { content: "\f66f"; } -.bi-fan::before { content: "\f670"; } -.bi-fingerprint::before { content: "\f671"; } -.bi-graph-down-arrow::before { content: "\f672"; } -.bi-graph-up-arrow::before { content: "\f673"; } -.bi-hypnotize::before { content: "\f674"; } -.bi-magic::before { content: "\f675"; } -.bi-person-rolodex::before { content: "\f676"; } -.bi-person-video::before { content: "\f677"; } -.bi-person-video2::before { content: "\f678"; } -.bi-person-video3::before { content: "\f679"; } -.bi-person-workspace::before { content: "\f67a"; } -.bi-radioactive::before { content: "\f67b"; } -.bi-webcam-fill::before { content: "\f67c"; } -.bi-webcam::before { content: "\f67d"; } -.bi-yin-yang::before { content: "\f67e"; } -.bi-bandaid-fill::before { content: "\f680"; } -.bi-bandaid::before { content: "\f681"; } -.bi-bluetooth::before { content: "\f682"; } -.bi-body-text::before { content: "\f683"; } -.bi-boombox::before { content: "\f684"; } -.bi-boxes::before { content: "\f685"; } -.bi-dpad-fill::before { content: "\f686"; } -.bi-dpad::before { content: "\f687"; } -.bi-ear-fill::before { content: "\f688"; } -.bi-ear::before { content: "\f689"; } -.bi-envelope-check-1::before { content: "\f68a"; } -.bi-envelope-check-fill::before { content: "\f68b"; } -.bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-1::before { content: "\f68d"; } -.bi-envelope-dash-fill::before { content: "\f68e"; } -.bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-1::before { content: "\f690"; } -.bi-envelope-exclamation-fill::before { content: "\f691"; } -.bi-envelope-exclamation::before { content: "\f692"; } -.bi-envelope-plus-fill::before { content: "\f693"; } -.bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-1::before { content: "\f695"; } -.bi-envelope-slash-fill::before { content: "\f696"; } -.bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-1::before { content: "\f698"; } -.bi-envelope-x-fill::before { content: "\f699"; } -.bi-envelope-x::before { content: "\f69a"; } -.bi-explicit-fill::before { content: "\f69b"; } -.bi-explicit::before { content: "\f69c"; } -.bi-git::before { content: "\f69d"; } -.bi-infinity::before { content: "\f69e"; } -.bi-list-columns-reverse::before { content: "\f69f"; } -.bi-list-columns::before { content: "\f6a0"; } -.bi-meta::before { content: "\f6a1"; } -.bi-mortorboard-fill::before { content: "\f6a2"; } -.bi-mortorboard::before { content: "\f6a3"; } -.bi-nintendo-switch::before { content: "\f6a4"; } -.bi-pc-display-horizontal::before { content: "\f6a5"; } -.bi-pc-display::before { content: "\f6a6"; } -.bi-pc-horizontal::before { content: "\f6a7"; } -.bi-pc::before { content: "\f6a8"; } -.bi-playstation::before { content: "\f6a9"; } -.bi-plus-slash-minus::before { content: "\f6aa"; } -.bi-projector-fill::before { content: "\f6ab"; } -.bi-projector::before { content: "\f6ac"; } -.bi-qr-code-scan::before { content: "\f6ad"; } -.bi-qr-code::before { content: "\f6ae"; } -.bi-quora::before { content: "\f6af"; } -.bi-quote::before { content: "\f6b0"; } -.bi-robot::before { content: "\f6b1"; } -.bi-send-check-fill::before { content: "\f6b2"; } -.bi-send-check::before { content: "\f6b3"; } -.bi-send-dash-fill::before { content: "\f6b4"; } -.bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-1::before { content: "\f6b6"; } -.bi-send-exclamation-fill::before { content: "\f6b7"; } -.bi-send-exclamation::before { content: "\f6b8"; } -.bi-send-fill::before { content: "\f6b9"; } -.bi-send-plus-fill::before { content: "\f6ba"; } -.bi-send-plus::before { content: "\f6bb"; } -.bi-send-slash-fill::before { content: "\f6bc"; } -.bi-send-slash::before { content: "\f6bd"; } -.bi-send-x-fill::before { content: "\f6be"; } -.bi-send-x::before { content: "\f6bf"; } -.bi-send::before { content: "\f6c0"; } -.bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash-1::before { content: "\f6c2"; } -.bi-terminal-dash::before { content: "\f6c3"; } -.bi-terminal-plus::before { content: "\f6c4"; } -.bi-terminal-split::before { content: "\f6c5"; } -.bi-ticket-detailed-fill::before { content: "\f6c6"; } -.bi-ticket-detailed::before { content: "\f6c7"; } -.bi-ticket-fill::before { content: "\f6c8"; } -.bi-ticket-perforated-fill::before { content: "\f6c9"; } -.bi-ticket-perforated::before { content: "\f6ca"; } -.bi-ticket::before { content: "\f6cb"; } -.bi-tiktok::before { content: "\f6cc"; } -.bi-window-dash::before { content: "\f6cd"; } -.bi-window-desktop::before { content: "\f6ce"; } -.bi-window-fullscreen::before { content: "\f6cf"; } -.bi-window-plus::before { content: "\f6d0"; } -.bi-window-split::before { content: "\f6d1"; } -.bi-window-stack::before { content: "\f6d2"; } -.bi-window-x::before { content: "\f6d3"; } -.bi-xbox::before { content: "\f6d4"; } -.bi-ethernet::before { content: "\f6d5"; } -.bi-hdmi-fill::before { content: "\f6d6"; } -.bi-hdmi::before { content: "\f6d7"; } -.bi-usb-c-fill::before { content: "\f6d8"; } -.bi-usb-c::before { content: "\f6d9"; } -.bi-usb-fill::before { content: "\f6da"; } -.bi-usb-plug-fill::before { content: "\f6db"; } -.bi-usb-plug::before { content: "\f6dc"; } -.bi-usb-symbol::before { content: "\f6dd"; } -.bi-usb::before { content: "\f6de"; } -.bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport-1::before { content: "\f6e0"; } -.bi-displayport::before { content: "\f6e1"; } -.bi-gpu-card::before { content: "\f6e2"; } -.bi-memory::before { content: "\f6e3"; } -.bi-modem-fill::before { content: "\f6e4"; } -.bi-modem::before { content: "\f6e5"; } -.bi-motherboard-fill::before { content: "\f6e6"; } -.bi-motherboard::before { content: "\f6e7"; } -.bi-optical-audio-fill::before { content: "\f6e8"; } -.bi-optical-audio::before { content: "\f6e9"; } -.bi-pci-card::before { content: "\f6ea"; } -.bi-router-fill::before { content: "\f6eb"; } -.bi-router::before { content: "\f6ec"; } -.bi-ssd-fill::before { content: "\f6ed"; } -.bi-ssd::before { content: "\f6ee"; } -.bi-thunderbolt-fill::before { content: "\f6ef"; } -.bi-thunderbolt::before { content: "\f6f0"; } -.bi-usb-drive-fill::before { content: "\f6f1"; } -.bi-usb-drive::before { content: "\f6f2"; } -.bi-usb-micro-fill::before { content: "\f6f3"; } -.bi-usb-micro::before { content: "\f6f4"; } -.bi-usb-mini-fill::before { content: "\f6f5"; } -.bi-usb-mini::before { content: "\f6f6"; } -.bi-cloud-haze2::before { content: "\f6f7"; } -.bi-device-hdd-fill::before { content: "\f6f8"; } -.bi-device-hdd::before { content: "\f6f9"; } -.bi-device-ssd-fill::before { content: "\f6fa"; } -.bi-device-ssd::before { content: "\f6fb"; } -.bi-displayport-fill::before { content: "\f6fc"; } -.bi-mortarboard-fill::before { content: "\f6fd"; } -.bi-mortarboard::before { content: "\f6fe"; } -.bi-terminal-x::before { content: "\f6ff"; } -.bi-arrow-through-heart-fill::before { content: "\f700"; } -.bi-arrow-through-heart::before { content: "\f701"; } -.bi-badge-sd-fill::before { content: "\f702"; } -.bi-badge-sd::before { content: "\f703"; } -.bi-bag-heart-fill::before { content: "\f704"; } -.bi-bag-heart::before { content: "\f705"; } -.bi-balloon-fill::before { content: "\f706"; } -.bi-balloon-heart-fill::before { content: "\f707"; } -.bi-balloon-heart::before { content: "\f708"; } -.bi-balloon::before { content: "\f709"; } -.bi-box2-fill::before { content: "\f70a"; } -.bi-box2-heart-fill::before { content: "\f70b"; } -.bi-box2-heart::before { content: "\f70c"; } -.bi-box2::before { content: "\f70d"; } -.bi-braces-asterisk::before { content: "\f70e"; } -.bi-calendar-heart-fill::before { content: "\f70f"; } -.bi-calendar-heart::before { content: "\f710"; } -.bi-calendar2-heart-fill::before { content: "\f711"; } -.bi-calendar2-heart::before { content: "\f712"; } -.bi-chat-heart-fill::before { content: "\f713"; } -.bi-chat-heart::before { content: "\f714"; } -.bi-chat-left-heart-fill::before { content: "\f715"; } -.bi-chat-left-heart::before { content: "\f716"; } -.bi-chat-right-heart-fill::before { content: "\f717"; } -.bi-chat-right-heart::before { content: "\f718"; } -.bi-chat-square-heart-fill::before { content: "\f719"; } -.bi-chat-square-heart::before { content: "\f71a"; } -.bi-clipboard-check-fill::before { content: "\f71b"; } -.bi-clipboard-data-fill::before { content: "\f71c"; } -.bi-clipboard-fill::before { content: "\f71d"; } -.bi-clipboard-heart-fill::before { content: "\f71e"; } -.bi-clipboard-heart::before { content: "\f71f"; } -.bi-clipboard-minus-fill::before { content: "\f720"; } -.bi-clipboard-plus-fill::before { content: "\f721"; } -.bi-clipboard-pulse::before { content: "\f722"; } -.bi-clipboard-x-fill::before { content: "\f723"; } -.bi-clipboard2-check-fill::before { content: "\f724"; } -.bi-clipboard2-check::before { content: "\f725"; } -.bi-clipboard2-data-fill::before { content: "\f726"; } -.bi-clipboard2-data::before { content: "\f727"; } -.bi-clipboard2-fill::before { content: "\f728"; } -.bi-clipboard2-heart-fill::before { content: "\f729"; } -.bi-clipboard2-heart::before { content: "\f72a"; } -.bi-clipboard2-minus-fill::before { content: "\f72b"; } -.bi-clipboard2-minus::before { content: "\f72c"; } -.bi-clipboard2-plus-fill::before { content: "\f72d"; } -.bi-clipboard2-plus::before { content: "\f72e"; } -.bi-clipboard2-pulse-fill::before { content: "\f72f"; } -.bi-clipboard2-pulse::before { content: "\f730"; } -.bi-clipboard2-x-fill::before { content: "\f731"; } -.bi-clipboard2-x::before { content: "\f732"; } -.bi-clipboard2::before { content: "\f733"; } -.bi-emoji-kiss-fill::before { content: "\f734"; } -.bi-emoji-kiss::before { content: "\f735"; } -.bi-envelope-heart-fill::before { content: "\f736"; } -.bi-envelope-heart::before { content: "\f737"; } -.bi-envelope-open-heart-fill::before { content: "\f738"; } -.bi-envelope-open-heart::before { content: "\f739"; } -.bi-envelope-paper-fill::before { content: "\f73a"; } -.bi-envelope-paper-heart-fill::before { content: "\f73b"; } -.bi-envelope-paper-heart::before { content: "\f73c"; } -.bi-envelope-paper::before { content: "\f73d"; } -.bi-filetype-aac::before { content: "\f73e"; } -.bi-filetype-ai::before { content: "\f73f"; } -.bi-filetype-bmp::before { content: "\f740"; } -.bi-filetype-cs::before { content: "\f741"; } -.bi-filetype-css::before { content: "\f742"; } -.bi-filetype-csv::before { content: "\f743"; } -.bi-filetype-doc::before { content: "\f744"; } -.bi-filetype-docx::before { content: "\f745"; } -.bi-filetype-exe::before { content: "\f746"; } -.bi-filetype-gif::before { content: "\f747"; } -.bi-filetype-heic::before { content: "\f748"; } -.bi-filetype-html::before { content: "\f749"; } -.bi-filetype-java::before { content: "\f74a"; } -.bi-filetype-jpg::before { content: "\f74b"; } -.bi-filetype-js::before { content: "\f74c"; } -.bi-filetype-jsx::before { content: "\f74d"; } -.bi-filetype-key::before { content: "\f74e"; } -.bi-filetype-m4p::before { content: "\f74f"; } -.bi-filetype-md::before { content: "\f750"; } -.bi-filetype-mdx::before { content: "\f751"; } -.bi-filetype-mov::before { content: "\f752"; } -.bi-filetype-mp3::before { content: "\f753"; } -.bi-filetype-mp4::before { content: "\f754"; } -.bi-filetype-otf::before { content: "\f755"; } -.bi-filetype-pdf::before { content: "\f756"; } -.bi-filetype-php::before { content: "\f757"; } -.bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt-1::before { content: "\f759"; } -.bi-filetype-ppt::before { content: "\f75a"; } -.bi-filetype-psd::before { content: "\f75b"; } -.bi-filetype-py::before { content: "\f75c"; } -.bi-filetype-raw::before { content: "\f75d"; } -.bi-filetype-rb::before { content: "\f75e"; } -.bi-filetype-sass::before { content: "\f75f"; } -.bi-filetype-scss::before { content: "\f760"; } -.bi-filetype-sh::before { content: "\f761"; } -.bi-filetype-svg::before { content: "\f762"; } -.bi-filetype-tiff::before { content: "\f763"; } -.bi-filetype-tsx::before { content: "\f764"; } -.bi-filetype-ttf::before { content: "\f765"; } -.bi-filetype-txt::before { content: "\f766"; } -.bi-filetype-wav::before { content: "\f767"; } -.bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls-1::before { content: "\f769"; } -.bi-filetype-xls::before { content: "\f76a"; } -.bi-filetype-xml::before { content: "\f76b"; } -.bi-filetype-yml::before { content: "\f76c"; } -.bi-heart-arrow::before { content: "\f76d"; } -.bi-heart-pulse-fill::before { content: "\f76e"; } -.bi-heart-pulse::before { content: "\f76f"; } -.bi-heartbreak-fill::before { content: "\f770"; } -.bi-heartbreak::before { content: "\f771"; } -.bi-hearts::before { content: "\f772"; } -.bi-hospital-fill::before { content: "\f773"; } -.bi-hospital::before { content: "\f774"; } -.bi-house-heart-fill::before { content: "\f775"; } -.bi-house-heart::before { content: "\f776"; } -.bi-incognito::before { content: "\f777"; } -.bi-magnet-fill::before { content: "\f778"; } -.bi-magnet::before { content: "\f779"; } -.bi-person-heart::before { content: "\f77a"; } -.bi-person-hearts::before { content: "\f77b"; } -.bi-phone-flip::before { content: "\f77c"; } -.bi-plugin::before { content: "\f77d"; } -.bi-postage-fill::before { content: "\f77e"; } -.bi-postage-heart-fill::before { content: "\f77f"; } -.bi-postage-heart::before { content: "\f780"; } -.bi-postage::before { content: "\f781"; } -.bi-postcard-fill::before { content: "\f782"; } -.bi-postcard-heart-fill::before { content: "\f783"; } -.bi-postcard-heart::before { content: "\f784"; } -.bi-postcard::before { content: "\f785"; } -.bi-search-heart-fill::before { content: "\f786"; } -.bi-search-heart::before { content: "\f787"; } -.bi-sliders2-vertical::before { content: "\f788"; } -.bi-sliders2::before { content: "\f789"; } -.bi-trash3-fill::before { content: "\f78a"; } -.bi-trash3::before { content: "\f78b"; } -.bi-valentine::before { content: "\f78c"; } -.bi-valentine2::before { content: "\f78d"; } -.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } -.bi-wrench-adjustable-circle::before { content: "\f78f"; } -.bi-wrench-adjustable::before { content: "\f790"; } -.bi-filetype-json::before { content: "\f791"; } -.bi-filetype-pptx::before { content: "\f792"; } -.bi-filetype-xlsx::before { content: "\f793"; } diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff b/pagetop/static/theme/icons/bootstrap-icons.woff deleted file mode 100644 index 4cd66b71ad5f51be58843c52c66f78a8f7b89e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137216 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 NrT!1{z<Eso003f9u}}a2 diff --git a/pagetop/static/theme/icons/bootstrap-icons.woff2 b/pagetop/static/theme/icons/bootstrap-icons.woff2 deleted file mode 100644 index de01cad9d15e664cde293ac71d80f5cb2e0c1860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102380 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 G0001yd~9+6 From 62951befda056a40fbe8dcf6dfe07b4eccc1674b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 16 Oct 2023 20:38:12 +0200 Subject: [PATCH 545/853] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20styles=20location?= =?UTF-8?q?=20for=20Inception=20theme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 4 ---- pagetop/src/base/theme.rs | 2 +- pagetop/src/base/theme/inception.rs | 13 ++++++++----- pagetop/src/core/module/all.rs | 2 +- pagetop/src/core/theme/all.rs | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index a28aa3aa..65fa5b85 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -31,10 +31,6 @@ pub(crate) fn add_assets_for_base(cx: &mut Context) { JavaScript::at("/base/js/menu.js").with_version("0.0.1"), )); } - - cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/base/css/styles.css").with_version("0.0.1"), - )); } // By default, 1 pixel = 0.0625em. diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs index 7c75ca33..83216d03 100644 --- a/pagetop/src/base/theme.rs +++ b/pagetop/src/base/theme.rs @@ -1,2 +1,2 @@ mod inception; -pub use inception::{InceptionTheme, THEME_INCEPTION}; +pub use inception::{Inception, THEME_INCEPTION}; diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index 5eca9298..8e7b411a 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -4,9 +4,9 @@ new_handle!(THEME_INCEPTION); static_files!(base); -pub struct InceptionTheme; +pub struct Inception; -impl ModuleTrait for InceptionTheme { +impl ModuleTrait for Inception { fn handle(&self) -> Handle { THEME_INCEPTION } @@ -16,7 +16,7 @@ impl ModuleTrait for InceptionTheme { } fn theme(&self) -> Option<ThemeRef> { - Some(&InceptionTheme) + Some(&Inception) } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { @@ -24,7 +24,7 @@ impl ModuleTrait for InceptionTheme { } } -impl ThemeTrait for InceptionTheme { +impl ThemeTrait for Inception { fn after_prepare_body(&self, page: &mut Page) { page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) .alter_context(ContextOp::AddStyleSheet( @@ -32,6 +32,9 @@ impl ThemeTrait for InceptionTheme { .with_version("8.0.1") .with_weight(-99), )) - .alter_context(ContextOp::AddAssetsForBase); + .alter_context(ContextOp::AddAssetsForBase) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/styles.css").with_version("0.0.1"), + )); } } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 24c0ecb2..4e06deca 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -28,7 +28,7 @@ pub fn register_modules(app: ModuleRef) { let mut list: Vec<ModuleRef> = Vec::new(); // Enable default theme. - add_to_enabled(&mut list, &crate::base::theme::InceptionTheme); + add_to_enabled(&mut list, &crate::base::theme::Inception); // Enable application modules. add_to_enabled(&mut list, app); diff --git a/pagetop/src/core/theme/all.rs b/pagetop/src/core/theme/all.rs index 3283cc40..29f7c6f7 100644 --- a/pagetop/src/core/theme/all.rs +++ b/pagetop/src/core/theme/all.rs @@ -13,7 +13,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeRef>>> = LazyStatic::new(|| RwLock pub static THEME: LazyStatic<ThemeRef> = LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { Some(theme) => theme, - None => &crate::base::theme::InceptionTheme, + None => &crate::base::theme::Inception, }); // THEME BY NAME *********************************************************************************** From 0595ecc1e2cd8f8733eb58fbf0e74ef6fd983a95 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 18 Oct 2023 18:18:19 +0200 Subject: [PATCH 546/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Enh?= =?UTF-8?q?ance=20class=20names=20for=20easier=20extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/menu/item.rs | 20 +-- pagetop/src/base/component/menu/megamenu.rs | 2 +- pagetop/src/base/component/menu/menu_main.rs | 22 +-- pagetop/src/base/component/menu/submenu.rs | 4 +- pagetop/static/base/css/menu.css | 170 +++++++++---------- pagetop/static/base/css/root.css | 83 ++++----- pagetop/static/base/css/styles.css | 2 +- pagetop/static/base/js/menu.js | 60 +++---- 8 files changed, 182 insertions(+), 181 deletions(-) diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 18108eef..e3b55c47 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -55,47 +55,47 @@ impl ComponentTrait for Item { match self.item_type() { ItemType::Void => PrepareMarkup::None, ItemType::Label(label) => PrepareMarkup::With(html! { - li class="menu-label" { + li class="pt-menu__label" { span title=[description] { (label.prepare(cx)) } } }), ItemType::Link(label, path) => PrepareMarkup::With(html! { - li class="menu-link" { + li class="pt-menu__link" { a href=(path(cx)) title=[description] { (label.prepare(cx)) } } }), ItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { - li class="menu-link" { + li class="pt-menu__link" { a href=(path(cx)) title=[description] target="_blank" { (label.prepare(cx)) } } }), ItemType::Html(content) => PrepareMarkup::With(html! { - li class="html" { + li class="pt-menu__html" { (content.prepare(cx)) } }), ItemType::Submenu(label, submenu) => PrepareMarkup::With(html! { - li class="menu-children" { + li class="pt-menu__children" { a href="#" title=[description] { - (label.prepare(cx)) i class="menu-icon bi-chevron-down" {} + (label.prepare(cx)) i class="pt-menu__icon bi-chevron-down" {} } - div class="menu-subs" { + div class="pt-menu__subs" { (submenu.prepare(cx)) } } }), ItemType::Megamenu(label, megamenu) => PrepareMarkup::With(html! { - li class="menu-children" { + li class="pt-menu__children" { a href="#" title=[description] { - (label.prepare(cx)) i class="menu-icon bi-chevron-down" {} + (label.prepare(cx)) i class="pt-menu__icon bi-chevron-down" {} } - div class="menu-subs menu-mega" { + div class="pt-menu__subs pt-menu__mega" { (megamenu.prepare(cx)) } } diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index 946ef060..b65ffb55 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -38,7 +38,7 @@ impl ComponentTrait for Megamenu { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { - div id=[self.id()] class="menu-groups" { + div id=[self.id()] class="pt-menu__groups" { (self.groups().prepare(cx)) } }) diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index c216444e..25a9ecae 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -46,28 +46,28 @@ impl ComponentTrait for Menu { cx.set_param::<bool>(PARAM_INCLUDE_ICONS, true); PrepareMarkup::With(html! { - div id=[self.id()] class="menu-container" { - div class="menu-wrapper" { - div class="menu-main" { - div class="menu-overlay" {} - nav class="menu" { - div class="menu-header" { - button type="button" class="menu-arrow" { + div id=[self.id()] class="pt-menu__container" { + div class="pt-menu__wrapper" { + div class="pt-menu__main" { + div class="pt-menu__overlay" {} + nav class="pt-menu__nav" { + div class="pt-menu__header" { + button type="button" class="pt-menu__arrow" { i class="bi-chevron-left" {} } - div class="menu-title" {} - button type="button" class="menu-close" { + div class="pt-menu__title" {} + button type="button" class="pt-menu__close" { i class="bi-x" {} } } - ul class="menu-section" { + ul class="pt-menu__section" { (self.items().prepare(cx)) } } } button type="button" - class="menu-trigger" + class="pt-menu__trigger" title=[L10n::t("menu_toggle", &LOCALES_PAGETOP).into_string(cx)] { span {} span {} span {} diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index 70de3880..dbd78ace 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -40,9 +40,9 @@ impl ComponentTrait for Submenu { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { - div id=[self.id()] class="menu-items" { + div id=[self.id()] class="pt-menu__items" { @if let Some(title) = self.title().get().into_string(cx) { - h4 class="menu-title" { (title) } + h4 class="pt-menu__title" { (title) } } ul { (self.items().prepare(cx)) diff --git a/pagetop/static/base/css/menu.css b/pagetop/static/base/css/menu.css index ba525dfb..f5dcbd86 100644 --- a/pagetop/static/base/css/menu.css +++ b/pagetop/static/base/css/menu.css @@ -1,4 +1,4 @@ -.menu-container { +.pt-menu__container { width: 100%; height: auto; margin: 0; @@ -6,14 +6,14 @@ z-index: 999; border: none; outline: none; - background: var(--menu--color-background); + background: var(--pt-menu--color-bg); } -.menu-wrapper { - margin-right: var(--menu--item-gap); +.pt-menu__wrapper { + margin-right: var(--pt-menu--item-gap); } -.menu-wrapper a, -.menu-wrapper button { +.pt-menu__wrapper a, +.pt-menu__wrapper button { cursor: pointer; border: none; outline: none; @@ -21,96 +21,96 @@ text-decoration: none; } -.menu-main .menu ul { +.pt-menu__nav ul { margin: 0; padding: 0; } -.menu-main .menu li { +.pt-menu__nav li { display: inline-block; margin: 0 0 0 1.5rem; - padding: var(--menu--line-padding) 0; - line-height: var(--menu--line-height); + padding: var(--pt-menu--line-padding) 0; + line-height: var(--pt-menu--line-height); list-style: none; list-style-type: none; } -.menu-main .menu li.menu-label, -.menu-main .menu li > a { +.pt-menu__nav li.pt-menu__label, +.pt-menu__nav li > a { position: relative; font-weight: 500; - color: var(--menu--color-base); + color: var(--pt-color); text-rendering: optimizeLegibility; } -.menu-main .menu li > a { +.pt-menu__nav li > a { border: none; outline: none; -webkit-transition: color 0.3s ease-in-out; -o-transition: color 0.3s ease-in-out; transition: color 0.3s ease-in-out; } -.menu-main .menu li:hover > a { - color: var(--menu--color-highlight); +.pt-menu__nav li:hover > a { + color: var(--pt-menu--color-highlight); } -.menu-main .menu li > a > i.menu-icon { +.pt-menu__nav li > a > i.pt-menu__icon { margin-left: 0.25rem; } -.menu-main .menu li .menu-subs { +.pt-menu__nav li .pt-menu__subs { position: absolute; max-width: 100%; height: auto; padding: 1rem 2rem; border: none; outline: none; - background: var(--menu--color-background); - border-radius: var(--border-radius); - border-top: 3px solid var(--menu--color-highlight); + background: var(--pt-menu--color-bg); + border-radius: var(--pt-menu--border-radius); + border-top: 3px solid var(--pt-menu--color-highlight); z-index: 500; opacity: 0; visibility: hidden; - -webkit-box-shadow: 0 4px 6px -1px var(--menu--color-border), 0 2px 4px -1px var(--menu--color-shadow); - box-shadow: 0 4px 6px -1px var(--menu--color-border), 0 2px 4px -1px var(--menu--color-shadow); + -webkit-box-shadow: 0 4px 6px -1px var(--pt-menu--color-border), 0 2px 4px -1px var(--pt-menu--color-shadow); + box-shadow: 0 4px 6px -1px var(--pt-menu--color-border), 0 2px 4px -1px var(--pt-menu--color-shadow); -webkit-transition: all 0.5s ease-in-out; -o-transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out; } -.menu-main .menu li.menu-children:hover > .menu-subs { +.pt-menu__nav li.pt-menu__children:hover > .pt-menu__subs { margin-top: 0.4rem; opacity: 1; visibility: visible; } -.menu-main .menu li .menu-items { - min-width: var(--menu--item-width-min); - max-width: var(--menu--item-width-max); +.pt-menu__nav li .pt-menu__items { + min-width: var(--pt-menu--item-width-min); + max-width: var(--pt-menu--item-width-max); } -.menu-main .menu li .menu-items .menu-title { +.pt-menu__nav li .pt-menu__items .pt-menu__title { font-family: inherit; font-size: 1rem; font-weight: 500; margin: 0; - padding: var(--menu--line-padding) 0; - line-height: var(--menu--line-height); + padding: var(--pt-menu--line-padding) 0; + line-height: var(--pt-menu--line-height); border: none; outline: none; - color: var(--menu--color-highlight); + color: var(--pt-menu--color-highlight); text-transform: uppercase; text-rendering: optimizeLegibility; } -.menu-main .menu li .menu-items li { +.pt-menu__nav li .pt-menu__items li { display: block; margin-left: 0; } -.menu-main .menu li .menu-mega { +.pt-menu__nav li .pt-menu__mega { left: 50%; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%); } -.menu-main .menu li .menu-groups { +.pt-menu__nav li .pt-menu__groups { display: -webkit-box; display: -ms-flexbox; display: flex; @@ -118,20 +118,20 @@ flex-wrap: nowrap; } -.menu-header, -.menu-trigger { +.pt-menu__header, +.pt-menu__trigger { display: none; } /* Applies <= 992px */ @media only screen and (max-width: 62em) { - .menu-wrapper { - margin-left: var(--menu--item-gap); + .pt-menu__wrapper { + margin-left: var(--pt-menu--item-gap); } - .menu-trigger { + .pt-menu__trigger { cursor: pointer; - width: var(--menu--trigger-width); - height: var(--menu--item-height); + width: var(--pt-menu--trigger-width); + height: var(--pt-menu--item-height); border: none; outline: none; background: none; @@ -141,23 +141,23 @@ flex-direction: column; justify-content: center; } - .menu-trigger span { + .pt-menu__trigger span { width: 100%; height: 2px; margin: 12.675% 0; - border-radius: var(--border-radius); - background: var(--menu--color-base); + border-radius: var(--pt-border-radius); + background: var(--pt-color); } - .menu-main .menu { + .pt-menu__nav { position: fixed; top: 0; left: 0; - width: var(--menu--side-width); + width: var(--pt-menu--side-width); height: 100%; z-index: 1099; overflow: hidden; - background: var(--menu--color-background); + background: var(--pt-menu--color-bg); -webkit-transform: translate(-100%); -ms-transform: translate(-100%); transform: translate(-100%); @@ -165,38 +165,38 @@ -o-transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out; } - .menu-main .menu.active { + .pt-menu__main .pt-menu__nav.active { -webkit-transform: translate(0%); -ms-transform: translate(0%); transform: translate(0%); } - .menu-main .menu li { + .pt-menu__nav li { display: block; margin: 0; padding: 0; } - .menu-main .menu li.menu-label, - .menu-main .menu li > a { + .pt-menu__nav li.pt-menu__label, + .pt-menu__nav li > a { display: block; - padding: var(--menu--line-padding) var(--menu--item-height) var(--menu--line-padding) var(--menu--item-gap); - border-bottom: 1px solid var(--menu--color-border); + padding: var(--pt-menu--line-padding) var(--pt-menu--item-height) var(--pt-menu--line-padding) var(--pt-menu--item-gap); + border-bottom: 1px solid var(--pt-menu--color-border); } - .menu-main .menu li ul li.menu-label, - .menu-main .menu li ul li > a { + .pt-menu__nav li ul li.pt-menu__label, + .pt-menu__nav li ul li > a { border-bottom: 0; } - .menu-main .menu li > a > i.menu-icon { + .pt-menu__nav li > a > i.pt-menu__icon { position: absolute; - top: var(--menu--line-padding); - right: var(--menu--line-padding); + top: var(--pt-menu--line-padding); + right: var(--pt-menu--line-padding); font-size: 1.25rem; -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg); } - .menu-main .menu li .menu-subs { + .pt-menu__nav li .pt-menu__subs { position: absolute; display: none; top: 0; @@ -217,23 +217,23 @@ -webkit-box-shadow: none; box-shadow: none; } - .menu-main .menu li .menu-subs.active { + .pt-menu__nav li .pt-menu__subs.active { display: block; } - .menu-main .menu li.menu-children:hover > .menu-subs { + .pt-menu__nav li.pt-menu__children:hover > .pt-menu__subs { margin-top: 0; } - .menu-main .menu li .menu-items .menu-title { - padding: var(--menu--line-padding) var(--menu--item-height) var(--menu--line-padding) var(--menu--item-gap); + .pt-menu__nav li .pt-menu__items .pt-menu__title { + padding: var(--pt-menu--line-padding) var(--pt-menu--item-height) var(--pt-menu--line-padding) var(--pt-menu--item-gap); } - .menu-main .menu li .menu-groups { + .pt-menu__nav li .pt-menu__groups { display: block; } - .menu-main .menu .menu-header { + .pt-menu__nav .pt-menu__header { position: relative; position: -webkit-sticky; position: sticky; @@ -247,24 +247,24 @@ -ms-flex-pack: justify; justify-content: space-between; top: 0; - height: var(--menu--item-height); - border-bottom: 1px solid var(--menu--color-border); - background: var(--menu--color-background); + height: var(--pt-menu--item-height); + border-bottom: 1px solid var(--pt-menu--color-border); + background: var(--pt-menu--color-bg); z-index: 501; } - .menu-main .menu .menu-header .menu-title { - padding: var(--menu--line-padding); + .pt-menu__nav .pt-menu__header .pt-menu__title { + padding: var(--pt-menu--line-padding); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } - .menu-main .menu .menu-header .menu-close, - .menu-main .menu .menu-header .menu-arrow { - width: var(--menu--item-height); - min-width: var(--menu--item-height); - height: var(--menu--item-height); - line-height: var(--menu--item-height); - color: var(--menu--color-base); + .pt-menu__nav .pt-menu__header .pt-menu__close, + .pt-menu__nav .pt-menu__header .pt-menu__arrow { + width: var(--pt-menu--item-height); + min-width: var(--pt-menu--item-height); + height: var(--pt-menu--item-height); + line-height: var(--pt-menu--item-height); + color: var(--pt-color); cursor: pointer; display: -webkit-box; display: -ms-flexbox; @@ -274,20 +274,20 @@ align-items: center; justify-content: center; } - .menu-main .menu .menu-header .menu-close { + .pt-menu__nav .pt-menu__header .pt-menu__close { font-size: 2.25rem; - border-left: 1px solid var(--menu--color-border); + border-left: 1px solid var(--pt-menu--color-border); } - .menu-main .menu .menu-header .menu-arrow { + .pt-menu__nav .pt-menu__header .pt-menu__arrow { font-size: 1.25rem; - border-right: 1px solid var(--menu--color-border); + border-right: 1px solid var(--pt-menu--color-border); display: none; } - .menu-main .menu .menu-header.active .menu-arrow { + .pt-menu__nav .pt-menu__header.active .pt-menu__arrow { display: flex; } - .menu-main .menu .menu-section { + .pt-menu__nav .pt-menu__section { height: 100%; overflow-y: auto; overflow-x: hidden; @@ -295,7 +295,7 @@ margin: 0; } - .menu-overlay { + .pt-menu__overlay { position: fixed; top: 0; left: 0; @@ -309,7 +309,7 @@ -o-transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out; } - .menu-overlay.active { + .pt-menu__overlay.active { opacity: 1; visibility: visible; } diff --git a/pagetop/static/base/css/root.css b/pagetop/static/base/css/root.css index 2d5462dd..03827430 100644 --- a/pagetop/static/base/css/root.css +++ b/pagetop/static/base/css/root.css @@ -16,33 +16,33 @@ --max-width: 84.375rem; --max-bg-color: 98.125rem; */ - --sp: 1.125rem; + --pt-gap: 1.125rem; /* --content-left: 5.625rem; - --site-header-height-wide: var(--sp10); - --container-padding: var(--sp); + --site-header-height-wide: var(--pt-gap10); + --container-padding: var(--pt-gap); */ } /* @media (min-width: 75rem) { :root { - --container-padding:var(--sp2); + --container-padding:var(--pt-gap2); } } :root { --scrollbar-width: 0px; --grid-col-count: 6; - --grid-gap: var(--sp); + --grid-gap: var(--pt-gap); --grid-gap-count: calc(var(--grid-col-count) - 1); - --grid-full-width: calc(100vw - var(--sp2) - var(--scrollbar-width)); + --grid-full-width: calc(100vw - var(--pt-gap2) - var(--scrollbar-width)); --grid-col-width: calc((var(--grid-full-width) - (var(--grid-gap-count) * var(--grid-gap))) / var(--grid-col-count)); } @media (min-width: 43.75rem) { :root { --grid-col-count:14; - --grid-gap: var(--sp2); + --grid-gap: var(--pt-gap2); } } @@ -54,37 +54,37 @@ @media (min-width: 75rem) { :root { - --grid-full-width:calc(100vw - var(--scrollbar-width) - var(--content-left) - var(--sp4)); + --grid-full-width:calc(100vw - var(--scrollbar-width) - var(--content-left) - var(--pt-gap4)); } } @media (min-width: 90rem) { :root { - --grid-full-width:calc(var(--max-width) - var(--sp4)); + --grid-full-width:calc(var(--max-width) - var(--pt-gap4)); } } */ :root { - --sp0-25: calc(0.25 * var(--sp)); /* - --sp0-5: calc(0.5 * var(--sp)); + --pt-gap-0-25: calc(0.25 * var(--pt-gap)); + --pt-gap-0-5: calc(0.5 * var(--pt-gap)); */ - --sp0-75: calc(0.75 * var(--sp)); + --pt-gap-0-75: calc(0.75 * var(--pt-gap)); +/* + --pt-gap-1-5: calc(1.5 * var(--pt-gap)); + --pt-gap-2: calc(2 * var(--pt-gap)); + --pt-gap-2-5: calc(2.5 * var(--pt-gap)); + --pt-gap-3: calc(3 * var(--pt-gap)); + --pt-gap-4: calc(4 * var(--pt-gap)); + --pt-gap-5: calc(5 * var(--pt-gap)); + --pt-gap-6: calc(6 * var(--pt-gap)); + --pt-gap-7: calc(7 * var(--pt-gap)); + --pt-gap-8: calc(8 * var(--pt-gap)); + --pt-gap-9: calc(9 * var(--pt-gap)); + --pt-gap-10: calc(10 * var(--pt-gap)); + --pt-gap-11: calc(11 * var(--pt-gap)); + --pt-gap-12: calc(12 * var(--pt-gap)); /* - --sp1: calc(1 * var(--sp)); - --sp1-5: calc(1.5 * var(--sp)); - --sp2: calc(2 * var(--sp)); - --sp2-5: calc(2.5 * var(--sp)); - --sp3: calc(3 * var(--sp)); - --sp4: calc(4 * var(--sp)); - --sp5: calc(5 * var(--sp)); - --sp6: calc(6 * var(--sp)); - --sp7: calc(7 * var(--sp)); - --sp8: calc(8 * var(--sp)); - --sp9: calc(9 * var(--sp)); - --sp10: calc(10 * var(--sp)); - --sp11: calc(11 * var(--sp)); - --sp12: calc(12 * var(--sp)); --color--gray-hue: 201; --color--gray-saturation: 15%; --color--gray-5: hsl(var(--color--gray-hue),var(--color--gray-saturation),5%); @@ -115,22 +115,23 @@ --color--red: #e33f1e; --color--gold: #fdca40; --color--green: #3fa21c; - --header-height-wide-when-fixed: calc(6 * var(--sp)); + --header-height-wide-when-fixed: calc(6 * var(--pt-gap)); --mobile-nav-width: 31.25rem; */ - --border-radius: 0.1875rem; + --pt-border-radius: 0.1875rem; - --menu--color-background: #fafafa; - --menu--color-base: #121212; - --menu--color-highlight: #e91e63; - --menu--color-border: rgba(0, 0, 0, 0.1); - --menu--color-shadow: rgba(0, 0, 0, 0.06); - --menu--line-padding: 0.625rem; - --menu--line-height: 1.875rem; - --menu--item-height: calc(var(--menu--line-padding) + var(--menu--line-height)); - --menu--item-width-min: 14rem; - --menu--item-width-max: 20rem; - --menu--item-gap: 1rem; - --menu--trigger-width: var(--menu--item-height); - --menu--side-width: 20rem; + + --pt-menu--color-bg: #fafafa; + --pt-menu--color-highlight: #e91e63; + --pt-menu--color-border: rgba(0, 0, 0, 0.1); + --pt-menu--color-shadow: rgba(0, 0, 0, 0.06); + --pt-menu--line-padding: 0.625rem; + --pt-menu--line-height: 1.875rem; + --pt-menu--item-height: calc(var(--pt-menu--line-padding) + var(--pt-menu--line-height)); + --pt-menu--item-width-min: 14rem; + --pt-menu--item-width-max: 20rem; + --pt-menu--item-gap: 1rem; + --pt-menu--border-radius: 0.625rem; + --pt-menu--trigger-width: var(--pt-menu--item-height); + --pt-menu--side-width: 20rem; } diff --git a/pagetop/static/base/css/styles.css b/pagetop/static/base/css/styles.css index b3a42dc0..79f2d8ad 100644 --- a/pagetop/static/base/css/styles.css +++ b/pagetop/static/base/css/styles.css @@ -18,7 +18,7 @@ .site-branding-wrapper { display: flex; align-items: flex-end; - column-gap: var(--sp0-75); + column-gap: var(--pt-gap-0-75); } .site-branding-name { letter-spacing: 0.02em; diff --git a/pagetop/static/base/js/menu.js b/pagetop/static/base/js/menu.js index 8fff4f8b..1ad63de3 100644 --- a/pagetop/static/base/js/menu.js +++ b/pagetop/static/base/js/menu.js @@ -1,15 +1,15 @@ -function menuShowChildren(nav, children) { - let submenu = children[0].querySelector('.menu-subs'); +function pt_menu__showChildren(nav, children) { + let submenu = children[0].querySelector('.pt-menu__subs'); submenu.classList.add('active'); submenu.style.animation = 'slideLeft 0.5s ease forwards'; let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; - nav.querySelector('.menu-title').innerHTML = title; - nav.querySelector('.menu-header').classList.add('active'); + nav.querySelector('.pt-menu__title').innerHTML = title; + nav.querySelector('.pt-menu__header').classList.add('active'); } -function menuHideChildren(nav, children) { - let submenu = children[0].querySelector('.menu-subs'); +function pt_menu__hideChildren(nav, children) { + let submenu = children[0].querySelector('.pt-menu__subs'); submenu.style.animation = 'slideRight 0.5s ease forwards'; setTimeout(() => { submenu.classList.remove('active'); @@ -19,70 +19,70 @@ function menuHideChildren(nav, children) { children.shift(); if (children.length > 0) { let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; - nav.querySelector('.menu-title').innerHTML = title; + nav.querySelector('.pt-menu__title').innerHTML = title; } else { - nav.querySelector('.menu-header').classList.remove('active'); - nav.querySelector('.menu-title').innerHTML = ''; + nav.querySelector('.pt-menu__header').classList.remove('active'); + nav.querySelector('.pt-menu__title').innerHTML = ''; } } -function menuToggle(nav, overlay) { +function pt_menu__toggle(nav, overlay) { nav.classList.toggle('active'); overlay.classList.toggle('active'); } -function menuReset(menu, nav) { - nav.querySelector('.menu-header').classList.remove('active'); - nav.querySelector('.menu-title').innerHTML = ''; - menu.querySelectorAll('.menu-subs').forEach(submenu => { +function pt_menu__reset(menu, nav) { + nav.querySelector('.pt-menu__header').classList.remove('active'); + nav.querySelector('.pt-menu__title').innerHTML = ''; + menu.querySelectorAll('.pt-menu__subs').forEach(submenu => { submenu.classList.remove('active'); submenu.style.removeProperty("animation"); }); } -document.querySelectorAll('.menu-container').forEach(menu => { +document.querySelectorAll('.pt-menu__container').forEach(menu => { let menuChildren = []; - const menuNav = menu.querySelector('.menu'); - const menuOverlay = menu.querySelector('.menu-overlay'); + const menuNav = menu.querySelector('.pt-menu__nav'); + const menuOverlay = menu.querySelector('.pt-menu__overlay'); - menu.querySelector('.menu-section').addEventListener('click', (e) => { + menu.querySelector('.pt-menu__section').addEventListener('click', (e) => { if (!menuNav.classList.contains('active')) { return; } - let target = e.target.closest('.menu-children'); + let target = e.target.closest('.pt-menu__children'); if (target && target != menuChildren[0]) { menuChildren.unshift(target); - menuShowChildren(menuNav, menuChildren); + pt_menu__showChildren(menuNav, menuChildren); } }); - menu.querySelector('.menu-arrow').addEventListener('click', () => { - menuHideChildren(menuNav, menuChildren); + menu.querySelector('.pt-menu__arrow').addEventListener('click', () => { + pt_menu__hideChildren(menuNav, menuChildren); }); - menu.querySelector('.menu-close').addEventListener('click', () => { - menuToggle(menuNav, menuOverlay); - menuReset(menu, menuNav); + menu.querySelector('.pt-menu__close').addEventListener('click', () => { + pt_menu__toggle(menuNav, menuOverlay); setTimeout(() => { + pt_menu__reset(menu, menuNav); menuChildren = []; }, 300); }); - menu.querySelector('.menu-trigger').addEventListener('click', () => { - menuToggle(menuNav, menuOverlay); + menu.querySelector('.pt-menu__trigger').addEventListener('click', () => { + pt_menu__toggle(menuNav, menuOverlay); }); menuOverlay.addEventListener('click', () => { - menuToggle(menuNav, menuOverlay); + pt_menu__toggle(menuNav, menuOverlay); }); window.onresize = function () { if (this.innerWidth >= 992) { if (menuNav.classList.contains('active')) { - menuToggle(menuNav, menuOverlay); - menuReset(menu, menuNav); + pt_menu__toggle(menuNav, menuOverlay); setTimeout(() => { + pt_menu__reset(menu, menuNav); menuChildren = []; }, 300); } From fc3836593ed67ed01d527aa56b089787aa216e96 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 18 Oct 2023 21:53:45 +0200 Subject: [PATCH 547/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Enh?= =?UTF-8?q?ance=20flexbox=20class=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/flex.rs | 143 +++++++++-------- pagetop/src/base/component/flex/item.rs | 4 +- pagetop/static/base/css/flex.css | 202 ++++++++++++------------ 3 files changed, 182 insertions(+), 167 deletions(-) diff --git a/pagetop/src/base/component/flex.rs b/pagetop/src/base/component/flex.rs index 7e30db94..33f95d56 100644 --- a/pagetop/src/base/component/flex.rs +++ b/pagetop/src/base/component/flex.rs @@ -22,19 +22,34 @@ impl ToString for Direction { fn to_string(&self) -> String { match self { Direction::Default => { - concat_string!("flex-container flex-row ", BreakPoint::default().to_string()) + concat_string!( + "pt-flex__container pt-flex__row ", + BreakPoint::default().to_string() + ) } Direction::Row(breakpoint) => { - concat_string!("flex-container flex-row ", breakpoint.to_string()) + concat_string!( + "pt-flex__container pt-flex__row ", + breakpoint.to_string() + ) } Direction::RowReverse(breakpoint) => { - concat_string!("flex-container flex-row flex-reverse ", breakpoint.to_string()) + concat_string!( + "pt-flex__container pt-flex__row pt-flex__reverse ", + breakpoint.to_string() + ) } Direction::Column(breakpoint) => { - concat_string!("flex-container flex-col ", breakpoint.to_string()) + concat_string!( + "pt-flex__container pt-flex__col ", + breakpoint.to_string() + ) } Direction::ColumnReverse(breakpoint) => { - concat_string!("flex-container flex-col flex-reverse ", breakpoint.to_string()) + concat_string!( + "pt-flex__container pt-flex__col pt-flex__reverse ", + breakpoint.to_string() + ) } } } @@ -57,8 +72,8 @@ impl ToString for WrapAlign { match self { WrapAlign::Default => "".to_string(), WrapAlign::NoWrap => "flex-nowrap".to_string(), - WrapAlign::Wrap(a) => concat_string!("flex-wrap ", a.to_string()), - WrapAlign::WrapReverse(a) => concat_string!("flex-wrap-reverse ", a.to_string()), + WrapAlign::Wrap(a) => concat_string!("pt-flex__wrap ", a.to_string()), + WrapAlign::WrapReverse(a) => concat_string!("pt-flex__wrap-reverse ", a.to_string()), } } } @@ -82,12 +97,12 @@ impl ToString for ContentAlign { fn to_string(&self) -> String { match self { ContentAlign::Default => "".to_string(), - ContentAlign::Start => "flex-align-start".to_string(), - ContentAlign::End => "flex-align-end".to_string(), - ContentAlign::Center => "flex-align-center".to_string(), - ContentAlign::Stretch => "flex-align-stretch".to_string(), - ContentAlign::SpaceBetween => "flex-align-space-between".to_string(), - ContentAlign::SpaceAround => "flex-align-space-around".to_string(), + ContentAlign::Start => "pt-flex__align-start".to_string(), + ContentAlign::End => "pt-flex__align-end".to_string(), + ContentAlign::Center => "pt-flex__align-center".to_string(), + ContentAlign::Stretch => "pt-flex__align-stretch".to_string(), + ContentAlign::SpaceBetween => "pt-flex__align-space-between".to_string(), + ContentAlign::SpaceAround => "pt-flex__align-space-around".to_string(), } } } @@ -111,12 +126,12 @@ impl ToString for ContentJustify { fn to_string(&self) -> String { match self { ContentJustify::Default => "".to_string(), - ContentJustify::Start => "flex-justify-start".to_string(), - ContentJustify::End => "flex-justify-end".to_string(), - ContentJustify::Center => "flex-justify-center".to_string(), - ContentJustify::SpaceBetween => "flex-justify-space-between".to_string(), - ContentJustify::SpaceAround => "flex-justify-space-around".to_string(), - ContentJustify::SpaceEvenly => "flex-justify-space-evenly".to_string(), + ContentJustify::Start => "pt-flex__justify-start".to_string(), + ContentJustify::End => "pt-flex__justify-end".to_string(), + ContentJustify::Center => "pt-flex__justify-center".to_string(), + ContentJustify::SpaceBetween => "pt-flex__justify-space-between".to_string(), + ContentJustify::SpaceAround => "pt-flex__justify-space-around".to_string(), + ContentJustify::SpaceEvenly => "pt-flex__justify-space-evenly".to_string(), } } } @@ -139,11 +154,11 @@ impl ToString for ItemAlign { fn to_string(&self) -> String { match self { ItemAlign::Default => "".to_string(), - ItemAlign::Top => "flex-item-top".to_string(), - ItemAlign::Bottom => "flex-item-bottom".to_string(), - ItemAlign::Middle => "flex-item-middle".to_string(), - ItemAlign::Stretch => "flex-item-stretch".to_string(), - ItemAlign::Baseline => "flex-item-baseline".to_string(), + ItemAlign::Top => "pt-flex__item-top".to_string(), + ItemAlign::Bottom => "pt-flex__item-bottom".to_string(), + ItemAlign::Middle => "pt-flex__item-middle".to_string(), + ItemAlign::Stretch => "pt-flex__item-stretch".to_string(), + ItemAlign::Baseline => "pt-flex__item-baseline".to_string(), } } } @@ -195,15 +210,15 @@ impl ToString for ItemGrow { fn to_string(&self) -> String { match self { ItemGrow::Default => "".to_string(), - ItemGrow::Is1 => "flex-grow-1".to_string(), - ItemGrow::Is2 => "flex-grow-2".to_string(), - ItemGrow::Is3 => "flex-grow-3".to_string(), - ItemGrow::Is4 => "flex-grow-4".to_string(), - ItemGrow::Is5 => "flex-grow-5".to_string(), - ItemGrow::Is6 => "flex-grow-6".to_string(), - ItemGrow::Is7 => "flex-grow-7".to_string(), - ItemGrow::Is8 => "flex-grow-8".to_string(), - ItemGrow::Is9 => "flex-grow-9".to_string(), + ItemGrow::Is1 => "pt-flex__grow-1".to_string(), + ItemGrow::Is2 => "pt-flex__grow-2".to_string(), + ItemGrow::Is3 => "pt-flex__grow-3".to_string(), + ItemGrow::Is4 => "pt-flex__grow-4".to_string(), + ItemGrow::Is5 => "pt-flex__grow-5".to_string(), + ItemGrow::Is6 => "pt-flex__grow-6".to_string(), + ItemGrow::Is7 => "pt-flex__grow-7".to_string(), + ItemGrow::Is8 => "pt-flex__grow-8".to_string(), + ItemGrow::Is9 => "pt-flex__grow-9".to_string(), } } } @@ -230,15 +245,15 @@ impl ToString for ItemShrink { fn to_string(&self) -> String { match self { ItemShrink::Default => "".to_string(), - ItemShrink::Is1 => "flex-shrink-1".to_string(), - ItemShrink::Is2 => "flex-shrink-2".to_string(), - ItemShrink::Is3 => "flex-shrink-3".to_string(), - ItemShrink::Is4 => "flex-shrink-4".to_string(), - ItemShrink::Is5 => "flex-shrink-5".to_string(), - ItemShrink::Is6 => "flex-shrink-6".to_string(), - ItemShrink::Is7 => "flex-shrink-7".to_string(), - ItemShrink::Is8 => "flex-shrink-8".to_string(), - ItemShrink::Is9 => "flex-shrink-9".to_string(), + ItemShrink::Is1 => "pt-flex__shrink-1".to_string(), + ItemShrink::Is2 => "pt-flex__shrink-2".to_string(), + ItemShrink::Is3 => "pt-flex__shrink-3".to_string(), + ItemShrink::Is4 => "pt-flex__shrink-4".to_string(), + ItemShrink::Is5 => "pt-flex__shrink-5".to_string(), + ItemShrink::Is6 => "pt-flex__shrink-6".to_string(), + ItemShrink::Is7 => "pt-flex__shrink-7".to_string(), + ItemShrink::Is8 => "pt-flex__shrink-8".to_string(), + ItemShrink::Is9 => "pt-flex__shrink-9".to_string(), } } } @@ -267,17 +282,17 @@ impl ToString for ItemSize { fn to_string(&self) -> String { match self { ItemSize::Default => "".to_string(), - ItemSize::Percent10 => "flex-width-10".to_string(), - ItemSize::Percent20 => "flex-width-20".to_string(), - ItemSize::Percent25 => "flex-width-25".to_string(), - ItemSize::Percent33 => "flex-width-33".to_string(), - ItemSize::Percent40 => "flex-width-40".to_string(), - ItemSize::Percent50 => "flex-width-50".to_string(), - ItemSize::Percent60 => "flex-width-60".to_string(), - ItemSize::Percent66 => "flex-width-66".to_string(), - ItemSize::Percent75 => "flex-width-75".to_string(), - ItemSize::Percent80 => "flex-width-80".to_string(), - ItemSize::Percent90 => "flex-width-90".to_string(), + ItemSize::Percent10 => "pt-flex__width-10".to_string(), + ItemSize::Percent20 => "pt-flex__width-20".to_string(), + ItemSize::Percent25 => "pt-flex__width-25".to_string(), + ItemSize::Percent33 => "pt-flex__width-33".to_string(), + ItemSize::Percent40 => "pt-flex__width-40".to_string(), + ItemSize::Percent50 => "pt-flex__width-50".to_string(), + ItemSize::Percent60 => "pt-flex__width-60".to_string(), + ItemSize::Percent66 => "pt-flex__width-66".to_string(), + ItemSize::Percent75 => "pt-flex__width-75".to_string(), + ItemSize::Percent80 => "pt-flex__width-80".to_string(), + ItemSize::Percent90 => "pt-flex__width-90".to_string(), } } } @@ -306,17 +321,17 @@ impl ToString for ItemOffset { fn to_string(&self) -> String { match self { ItemOffset::Default => "".to_string(), - ItemOffset::Offset10 => "flex-offset-10".to_string(), - ItemOffset::Offset20 => "flex-offset-20".to_string(), - ItemOffset::Offset25 => "flex-offset-25".to_string(), - ItemOffset::Offset33 => "flex-offset-33".to_string(), - ItemOffset::Offset40 => "flex-offset-40".to_string(), - ItemOffset::Offset50 => "flex-offset-50".to_string(), - ItemOffset::Offset60 => "flex-offset-60".to_string(), - ItemOffset::Offset66 => "flex-offset-66".to_string(), - ItemOffset::Offset75 => "flex-offset-75".to_string(), - ItemOffset::Offset80 => "flex-offset-80".to_string(), - ItemOffset::Offset90 => "flex-offset-90".to_string(), + ItemOffset::Offset10 => "pt-flex__offset-10".to_string(), + ItemOffset::Offset20 => "pt-flex__offset-20".to_string(), + ItemOffset::Offset25 => "pt-flex__offset-25".to_string(), + ItemOffset::Offset33 => "pt-flex__offset-33".to_string(), + ItemOffset::Offset40 => "pt-flex__offset-40".to_string(), + ItemOffset::Offset50 => "pt-flex__offset-50".to_string(), + ItemOffset::Offset60 => "pt-flex__offset-60".to_string(), + ItemOffset::Offset66 => "pt-flex__offset-66".to_string(), + ItemOffset::Offset75 => "pt-flex__offset-75".to_string(), + ItemOffset::Offset80 => "pt-flex__offset-80".to_string(), + ItemOffset::Offset90 => "pt-flex__offset-90".to_string(), } } } diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 4fadc4fb..639f61f4 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -23,8 +23,8 @@ pub struct Item { impl ComponentTrait for Item { fn new() -> Self { Item::default() - .with_item_classes(ClassesOp::SetDefault, "flex-item") - .with_inner_classes(ClassesOp::SetDefault, "flex-item-inner") + .with_item_classes(ClassesOp::SetDefault, "pt-flex__item") + .with_inner_classes(ClassesOp::SetDefault, "pt-flex__item-inner") } fn handle(&self) -> Handle { diff --git a/pagetop/static/base/css/flex.css b/pagetop/static/base/css/flex.css index 90ab5796..0b9d5d48 100644 --- a/pagetop/static/base/css/flex.css +++ b/pagetop/static/base/css/flex.css @@ -1,6 +1,6 @@ /* CONTAINERS */ -.flex-container { +.pt-flex__container { display: flex; flex-wrap: nowrap; justify-content: flex-start; @@ -9,231 +9,231 @@ width: 100%; padding: 0 !important; } -.flex-row, -.flex-col.bp-no { +.pt-flex__row, +.pt-flex__col.bp-no { flex-direction: column; } -.flex-row.flex-reverse, -.flex-col.flex-reverse.bp-no { +.pt-flex__row.pt-flex__reverse, +.pt-flex__col.pt-flex__reverse.bp-no { flex-direction: column-reverse; } -.flex-col, -.flex-row.bp-no { +.pt-flex__col, +.pt-flex__row.bp-no { flex-direction: row; } -.flex-col.flex-reverse, -.flex-row.flex-reverse.bp-no { +.pt-flex__col.pt-flex__reverse, +.pt-flex__row.pt-flex__reverse.bp-no { flex-direction: row-reverse; } -.flex-container.flex-wrap { +.pt-flex__wrap { flex-wrap: wrap; align-content: flex-start; } -.flex-container.flex-wrap-reverse { +.pt-flex__wrap-reverse { flex-wrap: wrap-reverse; align-content: flex-start; } -.flex-container.flex-align-end { +.pt-flex__align-end { align-content: flex-end; } -.flex-container.flex-align-center { +.pt-flex__align-center { align-content: center; } -.flex-container.flex-align-stretch { +.pt-flex__align-stretch { align-content: stretch; } -.flex-container.flex-align-space-between { +.pt-flex__align-space-between { align-content: space-between; } -.flex-container.flex-align-space-around { +.pt-flex__align-space-around { align-content: space-around; } -.flex-container.flex-justify-end { +.pt-flex__justify-end { justify-content: flex-end; } -.flex-container.flex-justify-center { +.pt-flex__justify-center { justify-content: center; } -.flex-container.flex-justify-space-between { +.pt-flex__justify-space-between { justify-content: space-between; } -.flex-container.flex-justify-space-around { +.pt-flex__justify-space-around { justify-content: space-around; } -.flex-container.flex-justify-space-evenly { +.pt-flex__justify-space-evenly { justify-content: space-evenly; } -.flex-container.flex-item-bottom { +.pt-flex__container.pt-flex__item-bottom { align-items: flex-end; } -.flex-container.flex-item-middle { +.pt-flex__container.pt-flex__item-middle { align-items: center; } -.flex-container.flex-item-stretch { +.pt-flex__container.pt-flex__item-stretch { align-items: stretch; } -.flex-container.flex-item-baseline { +.pt-flex__container.pt-flex__item-baseline { align-items: baseline; } /* ITEMS */ -.flex-item { +.pt-flex__item { padding: 0 !important; } -.flex-item.flex-grow-1 { +.pt-flex__grow-1 { flex-grow: 1; } -.flex-item.flex-grow-2 { +.pt-flex__grow-2 { flex-grow: 2; } -.flex-item.flex-grow-3 { +.pt-flex__grow-3 { flex-grow: 3; } -.flex-item.flex-grow-4 { +.pt-flex__grow-4 { flex-grow: 4; } -.flex-item.flex-grow-5 { +.pt-flex__grow-5 { flex-grow: 5; } -.flex-item.flex-grow-6 { +.pt-flex__grow-6 { flex-grow: 6; } -.flex-item.flex-grow-7 { +.pt-flex__grow-7 { flex-grow: 7; } -.flex-item.flex-grow-8 { +.pt-flex__grow-8 { flex-grow: 8; } -.flex-item.flex-grow-9 { +.pt-flex__grow-9 { flex-grow: 9; } -.flex-item.flex-shrink-1 { +.pt-flex__shrink-1 { flex-shrink: 1; } -.flex-item.flex-shrink-2 { +.pt-flex__shrink-2 { flex-shrink: 2; } -.flex-item.flex-shrink-3 { +.pt-flex__shrink-3 { flex-shrink: 3; } -.flex-item.flex-shrink-4 { +.pt-flex__shrink-4 { flex-shrink: 4; } -.flex-item.flex-shrink-5 { +.pt-flex__shrink-5 { flex-shrink: 5; } -.flex-item.flex-shrink-6 { +.pt-flex__shrink-6 { flex-shrink: 6; } -.flex-item.flex-shrink-7 { +.pt-flex__shrink-7 { flex-shrink: 7; } -.flex-item.flex-shrink-8 { +.pt-flex__shrink-8 { flex-shrink: 8; } -.flex-item.flex-shrink-9 { +.pt-flex__shrink-9 { flex-shrink: 9; } -.flex-item.flex-width-10 { +.pt-flex__width-10 { flex: 0 0 10%; max-width: 10%; } -.flex-item.flex-width-20 { +.pt-flex__width-20 { flex: 0 0 20%; max-width: 20%; } -.flex-item.flex-width-25 { +.pt-flex__width-25 { flex: 0 0 25%; max-width: 25%; } -.flex-item.flex-width-33 { +.pt-flex__width-33 { flex: 0 0 33.3333%; max-width: 33.3333%; } -.flex-item.flex-width-40 { +.pt-flex__width-40 { flex: 0 0 40%; max-width: 40%; } -.flex-item.flex-width-50 { +.pt-flex__width-50 { flex: 0 0 60%; max-width: 50%; } -.flex-item.flex-width-60 { +.pt-flex__width-60 { flex: 0 0 60%; max-width: 60%; } -.flex-item.flex-width-66 { +.pt-flex__width-66 { flex: 0 0 66.6666%; max-width: 66.6666%; } -.flex-item.flex-width-75 { +.pt-flex__width-75 { flex: 0 0 75%; max-width: 75%; } -.flex-item.flex-width-80 { +.pt-flex__width-80 { flex: 0 0 80%; max-width: 80%; } -.flex-item.flex-width-90 { +.pt-flex__width-90 { flex: 0 0 90%; max-width: 90%; } -.flex-item.flex-offset-10 { +.pt-flex__offset-10 { margin-left: 10%; } -.flex-item.flex-offset-20 { +.pt-flex__offset-20 { margin-left: 20%; } -.flex-item.flex-offset-25 { +.pt-flex__offset-25 { margin-left: 25%; } -.flex-item.flex-offset-33 { +.pt-flex__offset-33 { margin-left: 33.3333%; } -.flex-item.flex-offset-40 { +.pt-flex__offset-40 { margin-left: 40%; } -.flex-item.flex-offset-50 { +.pt-flex__offset-50 { margin-left: 50%; } -.flex-item.flex-offset-60 { +.pt-flex__offset-60 { margin-left: 60%; } -.flex-item.flex-offset-66 { +.pt-flex__offset-66 { margin-left: 66.6666%; } -.flex-item.flex-offset-75 { +.pt-flex__offset-75 { margin-left: 75%; } -.flex-item.flex-offset-80 { +.pt-flex__offset-80 { margin-left: 80%; } -.flex-item.flex-offset-90 { +.pt-flex__offset-90 { margin-left: 90%; } -.flex-item.flex-item-top { +.pt-flex__item.pt-flex__item-top { align-self: flex-start; } -.flex-item.flex-item-bottom { +.pt-flex__item.pt-flex__item-bottom { align-self: flex-end; } -.flex-item.flex-item-middle { +.pt-flex__item.pt-flex__item-middle { align-self: center; } -.flex-item.flex-item-stretch { +.pt-flex__item.pt-flex__item-stretch { align-self: stretch; } -.flex-item.flex-item-baseline { +.pt-flex__item.pt-flex__item-baseline { align-self: baseline; } @@ -241,19 +241,19 @@ /* SM - Applies <= 568px */ @media screen and (max-width: 35.5em) { - .flex-row.bp-sm { + .pt-flex__row.bp-sm { flex-direction: row; } - .flex-row.flex-reverse.bp-sm { + .pt-flex__row.pt-flex__reverse.bp-sm { flex-direction: row-reverse; } - .flex-col.bp-sm { + .pt-flex__col.bp-sm { flex-direction: column; } - .flex-col.flex-reverse.bp-sm { + .pt-flex__col.pt-flex__reverse.bp-sm { flex-direction: column-reverse; } - .flex-col.bp-sm .flex-item { + .pt-flex__col.bp-sm .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -261,19 +261,19 @@ } /* MD - Applies <= 768px */ @media screen and (max-width: 48em) { - .flex-row.bp-md { + .pt-flex__row.bp-md { flex-direction: row; } - .flex-row.flex-reverse.bp-md { + .pt-flex__row.pt-flex__reverse.bp-md { flex-direction: row-reverse; } - .flex-col.bp-md { + .pt-flex__col.bp-md { flex-direction: column; } - .flex-col.flex-reverse.bp-md { + .pt-flex__col.pt-flex__reverse.bp-md { flex-direction: column-reverse; } - .flex-col.bp-md .flex-item { + .pt-flex__col.bp-md .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -281,19 +281,19 @@ } /* LG - Applies <= 992px */ @media screen and (max-width: 62em) { - .flex-row.bp-lg { + .pt-flex__row.bp-lg { flex-direction: row; } - .flex-row.flex-reverse.bp-lg { + .pt-flex__row.pt-flex__reverse.bp-lg { flex-direction: row-reverse; } - .flex-col.bp-lg { + .pt-flex__col.bp-lg { flex-direction: column; } - .flex-col.flex-reverse.bp-lg { + .pt-flex__col.pt-flex__reverse.bp-lg { flex-direction: column-reverse; } - .flex-col.bp-lg .flex-item { + .pt-flex__col.bp-lg .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -301,19 +301,19 @@ } /* XL - Applies <= 1280px */ @media screen and (max-width: 80em) { - .flex-row.bp-xl { + .pt-flex__row.bp-xl { flex-direction: row; } - .flex-row.flex-reverse.bp-xl { + .pt-flex__row.pt-flex__reverse.bp-xl { flex-direction: row-reverse; } - .flex-col.bp-xl { + .pt-flex__col.bp-xl { flex-direction: column; } - .flex-col.flex-reverse.bp-xl { + .pt-flex__col.pt-flex__reverse.bp-xl { flex-direction: column-reverse; } - .flex-col.bp-xl .flex-item { + .pt-flex__col.bp-xl .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -321,19 +321,19 @@ } /* X2L - Applies <= 1920px */ @media screen and (max-width: 120em) { - .flex-row.bp-x2l { + .pt-flex__row.bp-x2l { flex-direction: row; } - .flex-row.flex-reverse.bp-x2l { + .pt-flex__row.pt-flex__reverse.bp-x2l { flex-direction: row-reverse; } - .flex-col.bp-x2l { + .pt-flex__col.bp-x2l { flex-direction: column; } - .flex-col.flex-reverse.bp-x2l { + .pt-flex__col.pt-flex__reverse.bp-x2l { flex-direction: column-reverse; } - .flex-col.bp-x2l .flex-item { + .pt-flex__col.bp-x2l .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -341,19 +341,19 @@ } /* X3L - Applies <= 2560px */ @media screen and (max-width: 160em) { - .flex-row.bp-x3l { + .pt-flex__row.bp-x3l { flex-direction: row; } - .flex-row.flex-reverse.bp-x3l { + .pt-flex__row.pt-flex__reverse.bp-x3l { flex-direction: row-reverse; } - .flex-col.bp-x3l { + .pt-flex__col.bp-x3l { flex-direction: column; } - .flex-col.flex-reverse.bp-x3l { + .pt-flex__col.pt-flex__reverse.bp-x3l { flex-direction: column-reverse; } - .flex-col.bp-x3l .flex-item { + .pt-flex__col.bp-x3l .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; From b172108ec09c5493c50b66135e938e8c957ce48f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 19 Oct 2023 19:09:34 +0200 Subject: [PATCH 548/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Enh?= =?UTF-8?q?ance=20components=20class=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 44 +++++++++----- pagetop/src/base/component/flex/container.rs | 2 +- pagetop/src/base/component/icon.rs | 2 +- pagetop/src/base/component/image.rs | 4 +- pagetop/src/base/component/menu/menu_main.rs | 4 +- pagetop/src/base/component/powered_by.rs | 6 +- pagetop/src/base/component/site_branding.rs | 10 ++-- pagetop/src/base/theme/inception.rs | 6 +- pagetop/static/base/css/looks.css | 46 ++++++++++++++ pagetop/static/base/css/root.css | 30 ++++++---- pagetop/static/base/css/styles.css | 63 ++++---------------- 11 files changed, 123 insertions(+), 94 deletions(-) create mode 100644 pagetop/static/base/css/looks.css diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 65fa5b85..1b78ac1e 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -1,36 +1,52 @@ use crate::core::component::{Context, ContextOp}; use crate::html::{JavaScript, StyleSheet}; +use crate::Weight; // Context parameters. -pub const PARAM_INCLUDE_ICONS: &str = "base.include.icon"; -pub const PARAM_INCLUDE_FLEX_ASSETS: &str = "base.include.flex"; -pub const PARAM_INCLUDE_MENU_ASSETS: &str = "base.include.menu"; +pub const PARAM_BASE_ASSETS_WEIGHT: &str = "base.assets.weight"; +pub const PARAM_BASE_INCLUDE_ICONS: &str = "base.include.icon"; +pub const PARAM_BASE_INCLUDE_FLEX_ASSETS: &str = "base.include.flex"; +pub const PARAM_BASE_INCLUDE_MENU_ASSETS: &str = "base.include.menu"; pub(crate) fn add_assets_for_base(cx: &mut Context) { + let weight = cx.get_param::<Weight>(PARAM_BASE_ASSETS_WEIGHT).unwrap_or(-90); + cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/base/css/root.css").with_version("0.0.1"), + StyleSheet::at("/base/css/root.css") + .with_version("0.0.1") + .with_weight(weight), )); - - if let Some(true) = cx.get_param::<bool>(PARAM_INCLUDE_ICONS) { + if let Some(true) = cx.get_param::<bool>(PARAM_BASE_INCLUDE_ICONS) { cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/base/css/icons.min.css").with_version("1.11.1"), + StyleSheet::at("/base/css/icons.min.css") + .with_version("1.11.1") + .with_weight(weight), )); } - - if let Some(true) = cx.get_param::<bool>(PARAM_INCLUDE_FLEX_ASSETS) { + if let Some(true) = cx.get_param::<bool>(PARAM_BASE_INCLUDE_FLEX_ASSETS) { cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/base/css/flex.css").with_version("0.0.1"), + StyleSheet::at("/base/css/flex.css") + .with_version("0.0.1") + .with_weight(weight), )); } - - if let Some(true) = cx.get_param::<bool>(PARAM_INCLUDE_MENU_ASSETS) { + if let Some(true) = cx.get_param::<bool>(PARAM_BASE_INCLUDE_MENU_ASSETS) { cx.alter(ContextOp::AddStyleSheet( - StyleSheet::at("/base/css/menu.css").with_version("0.0.1"), + StyleSheet::at("/base/css/menu.css") + .with_version("0.0.1") + .with_weight(weight), )) .alter(ContextOp::AddJavaScript( - JavaScript::at("/base/js/menu.js").with_version("0.0.1"), + JavaScript::at("/base/js/menu.js") + .with_version("0.0.1") + .with_weight(weight), )); } + cx.alter(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/looks.css") + .with_version("0.0.1") + .with_weight(weight), + )); } // By default, 1 pixel = 0.0625em. diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index 993fa651..cfe5db08 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -46,7 +46,7 @@ impl ComponentTrait for Container { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.set_param::<bool>(PARAM_INCLUDE_FLEX_ASSETS, true); + cx.set_param::<bool>(PARAM_BASE_INCLUDE_FLEX_ASSETS, true); let gap = match self.gap() { flex::Gap::Default => None, diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index a90a70e3..0799e014 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -29,7 +29,7 @@ impl ComponentTrait for Icon { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.set_param::<bool>(PARAM_INCLUDE_ICONS, true); + cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index d71366fb..a2ae08bc 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -2,8 +2,8 @@ use crate::prelude::*; new_handle!(COMPONENT_IMAGE); -const IMG_FLUID: &str = "img-fluid"; -const IMG_FIXED: &str = "img-fixed"; +const IMG_FLUID: &str = "pt-img__fluid"; +const IMG_FIXED: &str = "pt-img__fixed"; #[derive(Default)] pub enum ImageSize { diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index 25a9ecae..24a71f4a 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -42,8 +42,8 @@ impl ComponentTrait for Menu { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.set_param::<bool>(PARAM_INCLUDE_MENU_ASSETS, true); - cx.set_param::<bool>(PARAM_INCLUDE_ICONS, true); + cx.set_param::<bool>(PARAM_BASE_INCLUDE_MENU_ASSETS, true); + cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); PrepareMarkup::With(html! { div id=[self.id()] class="pt-menu__container" { diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 53c6bbe7..6f7674a3 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -37,7 +37,7 @@ impl ComponentTrait for PoweredBy { } fn id(&self) -> Option<String> { - Some("powered-by".to_owned()) + Some("pt-powered-by".to_owned()) } fn weight(&self) -> Weight { @@ -53,7 +53,7 @@ impl ComponentTrait for PoweredBy { PoweredByLogo::Color => { let logo_txt = L10n::t("pagetop_logo", &LOCALES_PAGETOP); html! { - span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { + span class="pt-pagetop__logo" aria-label=[logo_txt.into_string(cx)] { img src="/base/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} } } @@ -123,7 +123,7 @@ impl PoweredBy { let logo_txt = L10n::t("pagetop_logo", &LOCALES_PAGETOP); let logo_rgb = format!("rgb({},{},{})", r, g, b); html! { - span class="pagetop-logo" aria-label=[logo_txt.into_string(cx)] { + span class="pt-pagetop__logo" aria-label=[logo_txt.into_string(cx)] { svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} path fill=(logo_rgb) d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} diff --git a/pagetop/src/base/component/site_branding.rs b/pagetop/src/base/component/site_branding.rs index a1e9d6ba..3d6b21b7 100644 --- a/pagetop/src/base/component/site_branding.rs +++ b/pagetop/src/base/component/site_branding.rs @@ -56,16 +56,16 @@ impl ComponentTrait for SiteBranding { let slogan = self.slogan().prepare(cx); PrepareMarkup::With(html! { div id=[self.id()] { - div class="site-branding-wrapper" { - div class="site-branding-logo" { + div class="pt-branding__wrapper" { + div class="pt-branding__logo" { (self.logo().prepare(cx)) } - div class="site-branding-text" { - div class="site-branding-name" { + div class="pt-branding__text" { + div class="pt-branding__name" { a href=(self.frontpage()(cx)) title=(title) rel="home" { (self.name()) } } @if !slogan.is_empty() { - div class="site-branding-slogan" { + div class="pt-branding__slogan" { (slogan) } } diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index 8e7b411a..126b6f92 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -30,11 +30,13 @@ impl ThemeTrait for Inception { .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/base/css/normalize.min.css") .with_version("8.0.1") - .with_weight(-99), + .with_weight(-90), )) .alter_context(ContextOp::AddAssetsForBase) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/base/css/styles.css").with_version("0.0.1"), + StyleSheet::at("/base/css/styles.css") + .with_version("0.0.1") + .with_weight(-90), )); } } diff --git a/pagetop/static/base/css/looks.css b/pagetop/static/base/css/looks.css new file mode 100644 index 00000000..c3c077d7 --- /dev/null +++ b/pagetop/static/base/css/looks.css @@ -0,0 +1,46 @@ +/* Image component */ + +.pt-img__fluid { + max-width: 100%; + height: auto; +} + +/* SiteBranding component */ + +.pt-branding__wrapper { + display: flex; + align-items: flex-end; + column-gap: var(--pt-gap-0-75); +} +.pt-branding__name { + letter-spacing: 0.02em; + font-size: var(--pt-font-size-xl); +} +.pt-branding__slogan { + font-size: var(--pt-font-size-l); +} + +/* SM - Applies <= 568px */ +@media (max-width: 35.5em) { + .pt-branding__logo { + display: none; + } +} +/* LG - Applies <= 992px */ +@media (max-width: 62em) { + .pt-branding__slogan { + font-size: var(--pt-font-size-l); + } +} + +/* PoweredBy component */ + +#pt-powered-by { + text-align: center; +} +#pt-powered-by .pt-pagetop__logo img, +#pt-powered-by .pt-pagetop__logo svg { + margin-left: .275em; + height: 1.275em; + vertical-align: middle; +} diff --git a/pagetop/static/base/css/root.css b/pagetop/static/base/css/root.css index 03827430..c838590b 100644 --- a/pagetop/static/base/css/root.css +++ b/pagetop/static/base/css/root.css @@ -1,16 +1,24 @@ :root { + --pt-font-sans: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + --pt-font-serif: "Lora","georgia",serif; + --pt-font-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; + --pt-font-family: var(--pt-font-sans); + --pt-font-size-base: 1rem; + --pt-font-size-xxl: 1.875rem; + --pt-font-size-xl: 1.375rem; + --pt-font-size-l: 1.125rem; + --pt-font-size-s: 0.875rem; + --pt-font-size-xs: 0.8125rem; + --pt-font-size-xxs: 0.75rem; + --pt-font-weight: 400; + --pt-line-height-base: 1.5; + --pt-color-bg: #fff; + --pt-color: #212529; /* - --font-sans: "metropolis",sans-serif; - --font-serif: "Lora","georgia",serif; - --font-size-base: 1rem; -*/ - --font-size-xxl: 1.875rem; - --font-size-xl: 1.425rem; - --font-size-l: 1.125rem; -/* - --font-size-s: 0.875rem; - --font-size-xs: 0.8125rem; - --font-size-xxs: 0.75rem; + --pt-color-rgb: 33,37,41; + --pt-main--bg-rgb: 255,255,255; + --pt-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --line-height-base: 1.6875rem; --line-height-s: 1.125rem; --max-width: 84.375rem; diff --git a/pagetop/static/base/css/styles.css b/pagetop/static/base/css/styles.css index 79f2d8ad..403362de 100644 --- a/pagetop/static/base/css/styles.css +++ b/pagetop/static/base/css/styles.css @@ -1,54 +1,11 @@ -/* LAYOUT */ - -.region { - position: relative; -} - -/* COMPONENTS */ - -/* Image component */ - -.img-fluid { - max-width: 100%; - height: auto; -} - -/* SiteBranding component */ - -.site-branding-wrapper { - display: flex; - align-items: flex-end; - column-gap: var(--pt-gap-0-75); -} -.site-branding-name { - letter-spacing: 0.02em; - font-size: var(--font-size-xxl); -} -.site-branding-slogan { - font-size: var(--font-size-xl); -} - -/* SM - Applies <= 568px */ -@media (max-width: 35.5em) { - .site-branding-logo { - display: none; - } -} -/* LG - Applies <= 992px */ -@media (max-width: 62em) { - .site-branding-slogan { - font-size: var(--font-size-l); - } -} - -/* PoweredBy component */ - -#powered-by { - text-align: center; -} -#powered-by .pagetop-logo img, -#powered-by .pagetop-logo svg { - margin-left: .275em; - height: 1.275em; - vertical-align: middle; +body { + margin: 0; + font-family: var(--pt-font-family); + font-size: var(--pt-font-size-base); + font-weight: var(--pt-font-weight); + line-height: var(--pt-line-height-base); + color: var(--pt-color); + background-color: var(--pt-color-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; } From dbe1ec03ac10728145c8bcb74b8a6155ae56ce27 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 19 Oct 2023 20:56:59 +0200 Subject: [PATCH 549/853] =?UTF-8?q?=F0=9F=9A=A7=20Extend=20breakpoints=20d?= =?UTF-8?q?efinition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 32 +++++------ pagetop/static/base/css/flex.css | 94 +++++++++++++++++++------------- 2 files changed, 73 insertions(+), 53 deletions(-) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 1b78ac1e..1fda2f16 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -49,32 +49,32 @@ pub(crate) fn add_assets_for_base(cx: &mut Context) { )); } -// By default, 1 pixel = 0.0625em. - #[rustfmt::skip] #[derive(Default)] pub enum BreakPoint { #[default] - None, /* Does not apply */ - SM, /* @media screen and (max-width: 35.5em) - Applies <= 568px */ - MD, /* @media screen and (max-width: 48em) - Applies <= 768px */ - LG, /* @media screen and (max-width: 62em) - Applies <= 992px */ - XL, /* @media screen and (max-width: 80em) - Applies <= 1280px */ - X2L, /* @media screen and (max-width: 120em) - Applies <= 1920px */ - X3L, /* @media screen and (max-width: 160em) - Applies <= 2560px */ + None, /* Does not apply. Rest initially assume 1 pixel = 0.0625em */ + SM, /* PageTop default applies to <= 568px - @media screen and (max-width: 35.5em) */ + MD, /* PageTop default applies to <= 768px - @media screen and (max-width: 48em) */ + LG, /* PageTop default applies to <= 992px - @media screen and (max-width: 62em) */ + XL, /* PageTop default applies to <= 1280px - @media screen and (max-width: 80em) */ + X2L, /* PageTop default applies to <= 1440px - @media screen and (max-width: 90em) */ + X3L, /* PageTop default applies to <= 1920px - @media screen and (max-width: 120em) */ + X2K, /* PageTop default applies to <= 2560px - @media screen and (max-width: 160em) */ } #[rustfmt::skip] impl ToString for BreakPoint { fn to_string(&self) -> String { match self { - BreakPoint::None => "bp-no".to_string(), - BreakPoint::SM => "bp-sm".to_string(), - BreakPoint::MD => "bp-md".to_string(), - BreakPoint::LG => "bp-lg".to_string(), - BreakPoint::XL => "bp-xl".to_string(), - BreakPoint::X2L => "bp-x2l".to_string(), - BreakPoint::X3L => "bp-x3l".to_string(), + BreakPoint::None => "pt-bp__no".to_string(), + BreakPoint::SM => "pt-bp__sm".to_string(), + BreakPoint::MD => "pt-bp__md".to_string(), + BreakPoint::LG => "pt-bp__lg".to_string(), + BreakPoint::XL => "pt-bp__xl".to_string(), + BreakPoint::X2L => "pt-bp__x2l".to_string(), + BreakPoint::X3L => "pt-bp__x3l".to_string(), + BreakPoint::X2K => "pt-bp__x2k".to_string(), } } } diff --git a/pagetop/static/base/css/flex.css b/pagetop/static/base/css/flex.css index 0b9d5d48..42b1d27f 100644 --- a/pagetop/static/base/css/flex.css +++ b/pagetop/static/base/css/flex.css @@ -10,19 +10,19 @@ padding: 0 !important; } .pt-flex__row, -.pt-flex__col.bp-no { +.pt-flex__col.pt-bp__no { flex-direction: column; } .pt-flex__row.pt-flex__reverse, -.pt-flex__col.pt-flex__reverse.bp-no { +.pt-flex__col.pt-flex__reverse.pt-bp__no { flex-direction: column-reverse; } .pt-flex__col, -.pt-flex__row.bp-no { +.pt-flex__row.pt-bp__no { flex-direction: row; } .pt-flex__col.pt-flex__reverse, -.pt-flex__row.pt-flex__reverse.bp-no { +.pt-flex__row.pt-flex__reverse.pt-bp__no { flex-direction: row-reverse; } @@ -241,19 +241,19 @@ /* SM - Applies <= 568px */ @media screen and (max-width: 35.5em) { - .pt-flex__row.bp-sm { + .pt-flex__row.pt-bp__sm { flex-direction: row; } - .pt-flex__row.pt-flex__reverse.bp-sm { + .pt-flex__row.pt-flex__reverse.pt-bp__sm { flex-direction: row-reverse; } - .pt-flex__col.bp-sm { + .pt-flex__col.pt-bp__sm { flex-direction: column; } - .pt-flex__col.pt-flex__reverse.bp-sm { + .pt-flex__col.pt-flex__reverse.pt-bp__sm { flex-direction: column-reverse; } - .pt-flex__col.bp-sm .pt-flex__item { + .pt-flex__col.pt-bp__sm .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -261,19 +261,19 @@ } /* MD - Applies <= 768px */ @media screen and (max-width: 48em) { - .pt-flex__row.bp-md { + .pt-flex__row.pt-bp__md { flex-direction: row; } - .pt-flex__row.pt-flex__reverse.bp-md { + .pt-flex__row.pt-flex__reverse.pt-bp__md { flex-direction: row-reverse; } - .pt-flex__col.bp-md { + .pt-flex__col.pt-bp__md { flex-direction: column; } - .pt-flex__col.pt-flex__reverse.bp-md { + .pt-flex__col.pt-flex__reverse.pt-bp__md { flex-direction: column-reverse; } - .pt-flex__col.bp-md .pt-flex__item { + .pt-flex__col.pt-bp__md .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -281,19 +281,19 @@ } /* LG - Applies <= 992px */ @media screen and (max-width: 62em) { - .pt-flex__row.bp-lg { + .pt-flex__row.pt-bp__lg { flex-direction: row; } - .pt-flex__row.pt-flex__reverse.bp-lg { + .pt-flex__row.pt-flex__reverse.pt-bp__lg { flex-direction: row-reverse; } - .pt-flex__col.bp-lg { + .pt-flex__col.pt-bp__lg { flex-direction: column; } - .pt-flex__col.pt-flex__reverse.bp-lg { + .pt-flex__col.pt-flex__reverse.pt-bp__lg { flex-direction: column-reverse; } - .pt-flex__col.bp-lg .pt-flex__item { + .pt-flex__col.pt-bp__lg .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; @@ -301,59 +301,79 @@ } /* XL - Applies <= 1280px */ @media screen and (max-width: 80em) { - .pt-flex__row.bp-xl { + .pt-flex__row.pt-bp__xl { flex-direction: row; } - .pt-flex__row.pt-flex__reverse.bp-xl { + .pt-flex__row.pt-flex__reverse.pt-bp__xl { flex-direction: row-reverse; } - .pt-flex__col.bp-xl { + .pt-flex__col.pt-bp__xl { flex-direction: column; } - .pt-flex__col.pt-flex__reverse.bp-xl { + .pt-flex__col.pt-flex__reverse.pt-bp__xl { flex-direction: column-reverse; } - .pt-flex__col.bp-xl .pt-flex__item { + .pt-flex__col.pt-bp__xl .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; } } -/* X2L - Applies <= 1920px */ +/* X2L - Applies <= 1440px */ +@media screen and (max-width: 90em) { + .pt-flex__row.pt-bp__x2l { + flex-direction: row; + } + .pt-flex__row.pt-flex__reverse.pt-bp__x2l { + flex-direction: row-reverse; + } + .pt-flex__col.pt-bp__x2l { + flex-direction: column; + } + .pt-flex__col.pt-flex__reverse.pt-bp__x2l { + flex-direction: column-reverse; + } + .pt-flex__col.pt-bp__x2l .pt-flex__item { + flex: 1 1 auto; + max-width: 100%; + margin-left: 0; + } +} +/* X3L - Applies <= 1920px */ @media screen and (max-width: 120em) { - .pt-flex__row.bp-x2l { + .pt-flex__row.pt-bp__x3l { flex-direction: row; } - .pt-flex__row.pt-flex__reverse.bp-x2l { + .pt-flex__row.pt-flex__reverse.pt-bp__x3l { flex-direction: row-reverse; } - .pt-flex__col.bp-x2l { + .pt-flex__col.pt-bp__x3l { flex-direction: column; } - .pt-flex__col.pt-flex__reverse.bp-x2l { + .pt-flex__col.pt-flex__reverse.pt-bp__x3l { flex-direction: column-reverse; } - .pt-flex__col.bp-x2l .pt-flex__item { + .pt-flex__col.pt-bp__x3l .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; } } -/* X3L - Applies <= 2560px */ -@media screen and (max-width: 160em) { - .pt-flex__row.bp-x3l { +/* X2K - Applies <= 2560px */ +@media screen and (max-width: 120em) { + .pt-flex__row.pt-bp__x2k { flex-direction: row; } - .pt-flex__row.pt-flex__reverse.bp-x3l { + .pt-flex__row.pt-flex__reverse.pt-bp__x2k { flex-direction: row-reverse; } - .pt-flex__col.bp-x3l { + .pt-flex__col.pt-bp__x2k { flex-direction: column; } - .pt-flex__col.pt-flex__reverse.bp-x3l { + .pt-flex__col.pt-flex__reverse.pt-bp__x2k { flex-direction: column-reverse; } - .pt-flex__col.bp-x3l .pt-flex__item { + .pt-flex__col.pt-bp__x2k .pt-flex__item { flex: 1 1 auto; max-width: 100%; margin-left: 0; From e8e7f62d6ce8771eb6cfe70e39756f6692486fd0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 20 Oct 2023 00:46:40 +0200 Subject: [PATCH 550/853] =?UTF-8?q?=F0=9F=9A=9A=20Renaming=20base=20compon?= =?UTF-8?q?ents?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 34 +++++++++---------- pagetop/src/base/component/anchor.rs | 4 +-- pagetop/src/base/component/block.rs | 4 +-- .../{site_branding.rs => branding.rs} | 22 ++++++------ pagetop/src/base/component/flex.rs | 4 +-- pagetop/src/base/component/flex/container.rs | 4 +-- pagetop/src/base/component/flex/item.rs | 4 +-- pagetop/src/base/component/form.rs | 10 +++--- pagetop/src/base/component/form/button.rs | 4 +-- pagetop/src/base/component/form/date.rs | 4 +-- pagetop/src/base/component/form/form_main.rs | 4 +-- pagetop/src/base/component/form/hidden.rs | 4 +-- pagetop/src/base/component/form/input.rs | 4 +-- pagetop/src/base/component/heading.rs | 4 +-- pagetop/src/base/component/html.rs | 4 +-- pagetop/src/base/component/icon.rs | 4 +-- pagetop/src/base/component/image.rs | 4 +-- pagetop/src/base/component/l10n.rs | 4 +-- pagetop/src/base/component/menu.rs | 12 +++---- pagetop/src/base/component/menu/element.rs | 4 +-- pagetop/src/base/component/menu/group.rs | 4 +-- pagetop/src/base/component/menu/item.rs | 4 +-- pagetop/src/base/component/menu/megamenu.rs | 4 +-- pagetop/src/base/component/menu/menu_main.rs | 4 +-- pagetop/src/base/component/menu/submenu.rs | 4 +-- pagetop/src/base/component/paragraph.rs | 4 +-- pagetop/src/base/component/powered_by.rs | 4 +-- pagetop/src/base/component/wrapper.rs | 4 +-- 28 files changed, 87 insertions(+), 87 deletions(-) rename pagetop/src/base/component/{site_branding.rs => branding.rs} (90%) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 1fda2f16..a2da38cc 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -3,13 +3,13 @@ use crate::html::{JavaScript, StyleSheet}; use crate::Weight; // Context parameters. -pub const PARAM_BASE_ASSETS_WEIGHT: &str = "base.assets.weight"; +pub const PARAM_BASE_WEIGHT: &str = "base.weight"; pub const PARAM_BASE_INCLUDE_ICONS: &str = "base.include.icon"; pub const PARAM_BASE_INCLUDE_FLEX_ASSETS: &str = "base.include.flex"; pub const PARAM_BASE_INCLUDE_MENU_ASSETS: &str = "base.include.menu"; -pub(crate) fn add_assets_for_base(cx: &mut Context) { - let weight = cx.get_param::<Weight>(PARAM_BASE_ASSETS_WEIGHT).unwrap_or(-90); +pub(crate) fn add_base_assets(cx: &mut Context) { + let weight = cx.get_param::<Weight>(PARAM_BASE_WEIGHT).unwrap_or(-90); cx.alter(ContextOp::AddStyleSheet( StyleSheet::at("/base/css/root.css") @@ -80,35 +80,35 @@ impl ToString for BreakPoint { } mod html; -pub use html::{Html, COMPONENT_HTML}; +pub use html::{Html, COMPONENT_BASE_HTML}; mod l10n; -pub use l10n::{L10n, COMPONENT_L10N}; +pub use l10n::{L10n, COMPONENT_BASE_L10N}; mod wrapper; -pub use wrapper::{Wrapper, WrapperType, COMPONENT_WRAPPER}; +pub use wrapper::{Wrapper, WrapperType, COMPONENT_BASE_WRAPPER}; pub mod flex; mod icon; -pub use icon::{Icon, COMPONENT_ICON}; +pub use icon::{Icon, COMPONENT_BASE_ICON}; mod heading; -pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; +pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_BASE_HEADING}; mod paragraph; -pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; +pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_BASE_PARAGRAPH}; mod anchor; -pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; +pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_BASE_ANCHOR}; mod image; -pub use image::{Image, ImageSize, COMPONENT_IMAGE}; +pub use image::{Image, ImageSize, COMPONENT_BASE_IMAGE}; mod block; -pub use block::{Block, COMPONENT_BLOCK}; -mod site_branding; -pub use site_branding::{SiteBranding, COMPONENT_BRANDING}; +pub use block::{Block, COMPONENT_BASE_BLOCK}; +mod branding; +pub use branding::{Branding, COMPONENT_BASE_BRANDING}; mod powered_by; -pub use powered_by::{PoweredBy, PoweredByLogo, COMPONENT_POWEREDBY}; +pub use powered_by::{PoweredBy, PoweredByLogo, COMPONENT_BASE_POWEREDBY}; pub mod menu; -pub use menu::{Menu, COMPONENT_MENU}; +pub use menu::{Menu, COMPONENT_BASE_MENU}; pub mod form; -pub use form::{Form, FormMethod, COMPONENT_FORM}; +pub use form::{Form, FormMethod, COMPONENT_BASE_FORM}; diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index d157b942..b632b91c 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_ANCHOR); +new_handle!(COMPONENT_BASE_ANCHOR); #[derive(Default)] pub enum AnchorType { @@ -45,7 +45,7 @@ impl ComponentTrait for Anchor { } fn handle(&self) -> Handle { - COMPONENT_ANCHOR + COMPONENT_BASE_ANCHOR } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index ab3b1370..f74314a3 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_BLOCK); +new_handle!(COMPONENT_BASE_BLOCK); actions_for_component!(Block); @@ -24,7 +24,7 @@ impl ComponentTrait for Block { } fn handle(&self) -> Handle { - COMPONENT_BLOCK + COMPONENT_BASE_BLOCK } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/site_branding.rs b/pagetop/src/base/component/branding.rs similarity index 90% rename from pagetop/src/base/component/site_branding.rs rename to pagetop/src/base/component/branding.rs index 3d6b21b7..07725875 100644 --- a/pagetop/src/base/component/site_branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -1,13 +1,13 @@ use crate::prelude::*; use crate::LOCALES_PAGETOP; -new_handle!(COMPONENT_BRANDING); +new_handle!(COMPONENT_BASE_BRANDING); type SiteSlogan = TypedComponent<L10n>; type SiteLogo = TypedComponent<Image>; #[rustfmt::skip] -pub struct SiteBranding { +pub struct Branding { weight : Weight, renderable: Renderable, name : String, @@ -17,9 +17,9 @@ pub struct SiteBranding { } #[rustfmt::skip] -impl Default for SiteBranding { +impl Default for Branding { fn default() -> Self { - SiteBranding { + Branding { weight : Weight::default(), renderable: Renderable::default(), name : config::SETTINGS.app.name.to_owned(), @@ -30,17 +30,17 @@ impl Default for SiteBranding { } } -impl ComponentTrait for SiteBranding { +impl ComponentTrait for Branding { fn new() -> Self { - SiteBranding::default() + Branding::default() } fn handle(&self) -> Handle { - COMPONENT_BRANDING + COMPONENT_BASE_BRANDING } fn id(&self) -> Option<String> { - Some("site-branding".to_owned()) + Some("pt-branding".to_owned()) } fn weight(&self) -> Weight { @@ -76,8 +76,8 @@ impl ComponentTrait for SiteBranding { } } -impl SiteBranding { - // SiteBranding BUILDER. +impl Branding { + // Branding BUILDER. #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { @@ -115,7 +115,7 @@ impl SiteBranding { self } - // SiteBranding GETTERS. + // Branding GETTERS. pub fn name(&self) -> &String { &self.name diff --git a/pagetop/src/base/component/flex.rs b/pagetop/src/base/component/flex.rs index 33f95d56..d98bd828 100644 --- a/pagetop/src/base/component/flex.rs +++ b/pagetop/src/base/component/flex.rs @@ -1,7 +1,7 @@ mod container; -pub use container::{Container, COMPONENT_FLEX_CONTAINER}; +pub use container::{Container, COMPONENT_BASE_FLEX_CONTAINER}; mod item; -pub use item::{Item, COMPONENT_FLEX_ITEM}; +pub use item::{Item, COMPONENT_BASE_FLEX_ITEM}; use crate::prelude::*; diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index cfe5db08..700afe31 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_FLEX_CONTAINER); +new_handle!(COMPONENT_BASE_FLEX_CONTAINER); actions_for_component!(Container); @@ -26,7 +26,7 @@ impl ComponentTrait for Container { } fn handle(&self) -> Handle { - COMPONENT_FLEX_CONTAINER + COMPONENT_BASE_FLEX_CONTAINER } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 639f61f4..542929a7 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_FLEX_ITEM); +new_handle!(COMPONENT_BASE_FLEX_ITEM); actions_for_component!(Item); @@ -28,7 +28,7 @@ impl ComponentTrait for Item { } fn handle(&self) -> Handle { - COMPONENT_FLEX_ITEM + COMPONENT_BASE_FLEX_ITEM } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/form.rs b/pagetop/src/base/component/form.rs index ea9db735..f77f6b68 100644 --- a/pagetop/src/base/component/form.rs +++ b/pagetop/src/base/component/form.rs @@ -1,11 +1,11 @@ mod form_main; -pub use form_main::{Form, FormMethod, COMPONENT_FORM}; +pub use form_main::{Form, FormMethod, COMPONENT_BASE_FORM}; mod input; -pub use input::{Input, InputType, COMPONENT_INPUT}; +pub use input::{Input, InputType, COMPONENT_BASE_INPUT}; mod hidden; -pub use hidden::{Hidden, COMPONENT_HIDDEN}; +pub use hidden::{Hidden, COMPONENT_BASE_HIDDEN}; mod date; -pub use date::{Date, COMPONENT_DATE}; +pub use date::{Date, COMPONENT_BASE_DATE}; mod button; -pub use button::{Button, ButtonType, COMPONENT_BUTTON}; +pub use button::{Button, ButtonType, COMPONENT_BASE_BUTTON}; diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 94b422dd..7cb6b498 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_BUTTON); +new_handle!(COMPONENT_BASE_BUTTON); #[derive(Default)] pub enum ButtonType { @@ -32,7 +32,7 @@ impl ComponentTrait for Button { } fn handle(&self) -> Handle { - COMPONENT_BUTTON + COMPONENT_BASE_BUTTON } fn weight(&self) -> Weight { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index f9b71c89..22190bab 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_DATE); +new_handle!(COMPONENT_BASE_DATE); #[rustfmt::skip] #[derive(Default)] @@ -27,7 +27,7 @@ impl ComponentTrait for Date { } fn handle(&self) -> Handle { - COMPONENT_DATE + COMPONENT_BASE_DATE } fn weight(&self) -> Weight { diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 3767d0b7..a2bed394 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_FORM); +new_handle!(COMPONENT_BASE_FORM); actions_for_component!(Form); @@ -33,7 +33,7 @@ impl ComponentTrait for Form { } fn handle(&self) -> Handle { - COMPONENT_FORM + COMPONENT_BASE_FORM } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 25807a45..542edaa9 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_HIDDEN); +new_handle!(COMPONENT_BASE_HIDDEN); #[rustfmt::skip] #[derive(Default)] @@ -16,7 +16,7 @@ impl ComponentTrait for Hidden { } fn handle(&self) -> Handle { - COMPONENT_HIDDEN + COMPONENT_BASE_HIDDEN } fn weight(&self) -> Weight { diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 00595fe3..d5ec5a00 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_INPUT); +new_handle!(COMPONENT_BASE_INPUT); #[derive(Default)] pub enum InputType { @@ -48,7 +48,7 @@ impl ComponentTrait for Input { } fn handle(&self) -> Handle { - COMPONENT_INPUT + COMPONENT_BASE_INPUT } fn weight(&self) -> Weight { diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 3c07bb51..449073c9 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_HEADING); +new_handle!(COMPONENT_BASE_HEADING); #[derive(Default)] pub enum HeadingType { @@ -46,7 +46,7 @@ impl ComponentTrait for Heading { } fn handle(&self) -> Handle { - COMPONENT_HEADING + COMPONENT_BASE_HEADING } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 76b9acb1..bc4f1e62 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_HTML); +new_handle!(COMPONENT_BASE_HTML); #[derive(Default)] pub struct Html(Markup); @@ -11,7 +11,7 @@ impl ComponentTrait for Html { } fn handle(&self) -> Handle { - COMPONENT_HTML + COMPONENT_BASE_HTML } fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 0799e014..af66d1cf 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_ICON); +new_handle!(COMPONENT_BASE_ICON); #[rustfmt::skip] #[derive(Default)] @@ -17,7 +17,7 @@ impl ComponentTrait for Icon { } fn handle(&self) -> Handle { - COMPONENT_ICON + COMPONENT_BASE_ICON } fn weight(&self) -> Weight { diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index a2ae08bc..cf67191b 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_IMAGE); +new_handle!(COMPONENT_BASE_IMAGE); const IMG_FLUID: &str = "pt-img__fluid"; const IMG_FIXED: &str = "pt-img__fixed"; @@ -32,7 +32,7 @@ impl ComponentTrait for Image { } fn handle(&self) -> Handle { - COMPONENT_IMAGE + COMPONENT_BASE_IMAGE } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index 70ac0035..eab57bf3 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use std::collections::HashMap; -new_handle!(COMPONENT_L10N); +new_handle!(COMPONENT_BASE_L10N); #[derive(Default)] pub enum L10nOp { @@ -25,7 +25,7 @@ impl ComponentTrait for L10n { } fn handle(&self) -> Handle { - COMPONENT_L10N + COMPONENT_BASE_L10N } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 9574fac7..5cc46925 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,17 +1,17 @@ mod menu_main; -pub use menu_main::{Menu, COMPONENT_MENU}; +pub use menu_main::{Menu, COMPONENT_BASE_MENU}; mod item; -pub use item::{Item, ItemType, COMPONENT_MENU_ITEM}; +pub use item::{Item, ItemType, COMPONENT_BASE_MENU_ITEM}; mod submenu; -pub use submenu::{Submenu, COMPONENT_MENU_SUBMENU}; +pub use submenu::{Submenu, COMPONENT_BASE_MENU_SUBMENU}; mod megamenu; -pub use megamenu::{Megamenu, COMPONENT_MENU_MEGAMENU}; +pub use megamenu::{Megamenu, COMPONENT_BASE_MENU_MEGAMENU}; mod group; -pub use group::{Group, COMPONENT_MENU_GROUP}; +pub use group::{Group, COMPONENT_BASE_MENU_GROUP}; mod element; -pub use element::{Element, ElementType, COMPONENT_MENU_ELEMENT}; +pub use element::{Element, ElementType, COMPONENT_BASE_MENU_ELEMENT}; diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index c3567105..003d4435 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use super::Submenu; -new_handle!(COMPONENT_MENU_ELEMENT); +new_handle!(COMPONENT_BASE_MENU_ELEMENT); type Content = TypedComponent<Html>; type SubmenuItems = TypedComponent<Submenu>; @@ -31,7 +31,7 @@ impl ComponentTrait for Element { } fn handle(&self) -> Handle { - COMPONENT_MENU_ELEMENT + COMPONENT_BASE_MENU_ELEMENT } fn weight(&self) -> Weight { diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index ee037eb4..8c8a19ea 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use super::Element; -new_handle!(COMPONENT_MENU_GROUP); +new_handle!(COMPONENT_BASE_MENU_GROUP); type Elements = TypedComponents<Element>; @@ -21,7 +21,7 @@ impl ComponentTrait for Group { } fn handle(&self) -> Handle { - COMPONENT_MENU_GROUP + COMPONENT_BASE_MENU_GROUP } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index e3b55c47..5e16fdd5 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use super::{Megamenu, Submenu}; -new_handle!(COMPONENT_MENU_ITEM); +new_handle!(COMPONENT_BASE_MENU_ITEM); type Label = TypedComponent<L10n>; type Content = TypedComponent<Html>; @@ -39,7 +39,7 @@ impl ComponentTrait for Item { } fn handle(&self) -> Handle { - COMPONENT_MENU_ITEM + COMPONENT_BASE_MENU_ITEM } fn weight(&self) -> Weight { diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index b65ffb55..602c26ad 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use super::Group; -new_handle!(COMPONENT_MENU_MEGAMENU); +new_handle!(COMPONENT_BASE_MENU_MEGAMENU); type Groups = TypedComponents<Group>; @@ -21,7 +21,7 @@ impl ComponentTrait for Megamenu { } fn handle(&self) -> Handle { - COMPONENT_MENU_MEGAMENU + COMPONENT_BASE_MENU_MEGAMENU } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index 24a71f4a..1dbad575 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -3,7 +3,7 @@ use crate::LOCALES_PAGETOP; use super::Item; -new_handle!(COMPONENT_MENU); +new_handle!(COMPONENT_BASE_MENU); actions_for_component!(Menu); @@ -22,7 +22,7 @@ impl ComponentTrait for Menu { } fn handle(&self) -> Handle { - COMPONENT_MENU + COMPONENT_BASE_MENU } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index dbd78ace..37eff01d 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use super::Item; -new_handle!(COMPONENT_MENU_SUBMENU); +new_handle!(COMPONENT_BASE_MENU_SUBMENU); type TitleSubmenu = TypedComponent<L10n>; type Items = TypedComponents<Item>; @@ -23,7 +23,7 @@ impl ComponentTrait for Submenu { } fn handle(&self) -> Handle { - COMPONENT_MENU_SUBMENU + COMPONENT_BASE_MENU_SUBMENU } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index b51de2fa..b804d2a5 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_PARAGRAPH); +new_handle!(COMPONENT_BASE_PARAGRAPH); #[derive(Default)] pub enum ParagraphDisplay { @@ -31,7 +31,7 @@ impl ComponentTrait for Paragraph { } fn handle(&self) -> Handle { - COMPONENT_PARAGRAPH + COMPONENT_BASE_PARAGRAPH } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 6f7674a3..e3b03262 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -1,7 +1,7 @@ use crate::prelude::*; use crate::LOCALES_PAGETOP; -new_handle!(COMPONENT_POWEREDBY); +new_handle!(COMPONENT_BASE_POWEREDBY); #[derive(Default, Eq, PartialEq)] pub enum PoweredByLogo { @@ -33,7 +33,7 @@ impl ComponentTrait for PoweredBy { } fn handle(&self) -> Handle { - COMPONENT_POWEREDBY + COMPONENT_BASE_POWEREDBY } fn id(&self) -> Option<String> { diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index aa4d2e36..35a20104 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -new_handle!(COMPONENT_WRAPPER); +new_handle!(COMPONENT_BASE_WRAPPER); actions_for_component!(Wrapper); @@ -35,7 +35,7 @@ impl ComponentTrait for Wrapper { } fn handle(&self) -> Handle { - COMPONENT_WRAPPER + COMPONENT_BASE_WRAPPER } fn id(&self) -> Option<String> { From 3e9dbac21de168b9875a2144d516a9dec243c29f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 20 Oct 2023 00:49:11 +0200 Subject: [PATCH 551/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20context=20opera?= =?UTF-8?q?tion=20for=20adding=20base=20assets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop/src/base/theme/inception.rs | 2 +- pagetop/src/core/component/context.rs | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 081e3f18..de98e6cb 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -110,7 +110,7 @@ impl ThemeTrait for Bootsier { .with_version("5.1.3") .with_weight(-99), )) - .alter_context(ContextOp::AddAssetsForBase); + .alter_context(ContextOp::AddBaseAssets); } fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 94f81de6..65c5f7a9 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -28,7 +28,7 @@ impl ThemeTrait for Bulmix { .with_version("0.9.4") .with_weight(-99), )) - .alter_context(ContextOp::AddAssetsForBase); + .alter_context(ContextOp::AddBaseAssets); } #[rustfmt::skip] diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index 126b6f92..7a02b2c0 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -32,7 +32,7 @@ impl ThemeTrait for Inception { .with_version("8.0.1") .with_weight(-90), )) - .alter_context(ContextOp::AddAssetsForBase) + .alter_context(ContextOp::AddBaseAssets) .alter_context(ContextOp::AddStyleSheet( StyleSheet::at("/base/css/styles.css") .with_version("0.0.1") diff --git a/pagetop/src/core/component/context.rs b/pagetop/src/core/component/context.rs index 17ff7829..8b935a74 100644 --- a/pagetop/src/core/component/context.rs +++ b/pagetop/src/core/component/context.rs @@ -1,4 +1,4 @@ -use crate::base::component::add_assets_for_base; +use crate::base::component::add_base_assets; use crate::core::theme::all::{theme_by_single_name, THEME}; use crate::core::theme::ThemeRef; use crate::html::{html, Assets, HeadScript, HeadStyles, JavaScript, Markup, StyleSheet}; @@ -24,8 +24,8 @@ pub enum ContextOp { // Scripts in head. AddHeadScript(HeadScript), RemoveHeadScript(&'static str), - // Add assets to properly use the base components. - AddAssetsForBase, + // Add assets to properly use base components. + AddBaseAssets, } #[rustfmt::skip] @@ -80,8 +80,8 @@ impl Context { ContextOp::AddHeadScript(script) => { self.headscript.add(script); } ContextOp::RemoveHeadScript(path) => { self.headscript.remove(path); } - // Add assets to properly use the base components. - ContextOp::AddAssetsForBase => { add_assets_for_base(self); } + // Add assets to properly use base components. + ContextOp::AddBaseAssets => { add_base_assets(self); } } self } From 7aa99039767e90e4805e0cabc7349628ce41cff4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 20 Oct 2023 00:55:01 +0200 Subject: [PATCH 552/853] =?UTF-8?q?=E2=9C=A8=20Add=20method=20for=20immedi?= =?UTF-8?q?ate=20object=20creation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html/opt_classes.rs | 6 ++++++ pagetop/src/html/opt_id.rs | 6 ++++++ pagetop/src/html/opt_name.rs | 6 ++++++ pagetop/src/html/opt_string.rs | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index 3be0c977..9bbd8766 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -37,6 +37,12 @@ impl OptionClasses { OptionClasses::default() } + pub fn with(op: ClassesOp, classes: impl Into<String>) -> Self { + let mut opt = OptionClasses::default(); + opt.alter_value(op, classes); + opt + } + // OptionClasses BUILDER. #[fn_builder] diff --git a/pagetop/src/html/opt_id.rs b/pagetop/src/html/opt_id.rs index fbc02f0d..ab16aa6b 100644 --- a/pagetop/src/html/opt_id.rs +++ b/pagetop/src/html/opt_id.rs @@ -8,6 +8,12 @@ impl OptionId { OptionId::default() } + pub fn with(value: impl Into<String>) -> Self { + let mut opt = OptionId::default(); + opt.alter_value(value); + opt + } + // OptionId BUILDER. #[fn_builder] diff --git a/pagetop/src/html/opt_name.rs b/pagetop/src/html/opt_name.rs index 1e811c33..e3cfb124 100644 --- a/pagetop/src/html/opt_name.rs +++ b/pagetop/src/html/opt_name.rs @@ -8,6 +8,12 @@ impl OptionName { OptionName::default() } + pub fn with(value: impl Into<String>) -> Self { + let mut opt = OptionName::default(); + opt.alter_value(value); + opt + } + // OptionName BUILDER. #[fn_builder] diff --git a/pagetop/src/html/opt_string.rs b/pagetop/src/html/opt_string.rs index aa872b3a..35fe2ba8 100644 --- a/pagetop/src/html/opt_string.rs +++ b/pagetop/src/html/opt_string.rs @@ -8,6 +8,12 @@ impl OptionString { OptionString::default() } + pub fn with(value: impl Into<String>) -> Self { + let mut opt = OptionString::default(); + opt.alter_value(value); + opt + } + // OptionString BUILDER. #[fn_builder] From e1bc4b39f86b1061fbb356af1af716a17dcba704 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 20 Oct 2023 00:59:43 +0200 Subject: [PATCH 553/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20for=20l?= =?UTF-8?q?atest=20code=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 36 +++++--------------- pagetop-bulmix/src/lib.rs | 8 ++--- pagetop/src/core/theme/definition.rs | 15 +++++++-- pagetop/src/locale/en-US/base.ftl | 2 +- pagetop/src/locale/es-ES/base.ftl | 2 +- pagetop/src/response/page.rs | 8 +++-- pagetop/static/base/css/components.css | 46 ++++++++++++++++++++++++++ pagetop/static/base/css/looks.css | 2 +- pagetop/static/base/css/root.css | 2 +- pagetop/static/base/css/styles.css | 5 +++ 10 files changed, 86 insertions(+), 40 deletions(-) create mode 100644 pagetop/static/base/css/components.css diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index de98e6cb..860fb307 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -65,33 +65,15 @@ impl ThemeTrait for Bootsier { let footer = page.prepare_region("footer"); html! { body class=[page.body_classes().get()] { - @if header.is_some() { - #header class="region" { (header.unwrap()) } - } - @if nav_branding.is_some() { - #nav_branding class="region" { (nav_branding.unwrap()) } - } - @if nav_main.is_some() { - #nav_main class="region" { (nav_main.unwrap()) } - } - @if nav_additional.is_some() { - #nav_additional class="region" { (nav_additional.unwrap()) } - } - @if breadcrumb.is_some() { - #breadcrumb class="region" { (breadcrumb.unwrap()) } - } - @if content.is_some() { - #content class="region" { (content.unwrap()) } - } - @if sidebar_first.is_some() { - #sidebar_first class="region" { (sidebar_first.unwrap()) } - } - @if sidebar_second.is_some() { - #sidebar_second class="region" { (sidebar_second.unwrap()) } - } - @if footer.is_some() { - #footer class="region" { (footer.unwrap()) } - } + (header.unwrap_or_default()) + (nav_branding.unwrap_or_default()) + (nav_main.unwrap_or_default()) + (nav_additional.unwrap_or_default()) + (breadcrumb.unwrap_or_default()) + (content.unwrap_or_default()) + (sidebar_first.unwrap_or_default()) + (sidebar_second.unwrap_or_default()) + (footer.unwrap_or_default()) } } } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 65c5f7a9..12b33a76 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -38,7 +38,7 @@ impl ThemeTrait for Bulmix { _cx: &mut Context, ) { match component.handle() { - COMPONENT_ANCHOR => { + COMPONENT_BASE_ANCHOR => { let a = component_as_mut::<Anchor>(component); a.alter_classes( ClassesOp::SetDefault, @@ -48,7 +48,7 @@ impl ThemeTrait for Bulmix { }, ); } - COMPONENT_HEADING => { + COMPONENT_BASE_HEADING => { let h = component_as_mut::<Heading>(component); h.alter_classes( ClassesOp::SetDefault, @@ -63,7 +63,7 @@ impl ThemeTrait for Bulmix { }, ); } - COMPONENT_PARAGRAPH => { + COMPONENT_BASE_PARAGRAPH => { let p = component_as_mut::<Paragraph>(component); p.alter_classes( ClassesOp::SetDefault, @@ -87,7 +87,7 @@ impl ThemeTrait for Bulmix { _cx: &mut Context, ) -> Option<Markup> { match component.handle() { - COMPONENT_ICON => { + COMPONENT_BASE_ICON => { let icon = component_as_ref::<Icon>(component); Some(html! { span class="icon" { diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 4fbd3744..20ac8c33 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -24,11 +24,20 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { fn before_prepare_body(&self, page: &mut Page) {} fn prepare_body(&self, page: &mut Page) -> Markup { + let header = page.prepare_region("header"); + let pagetop = page.prepare_region("pagetop"); + let content = page.prepare_region("content"); + let sidebar = page.prepare_region("sidebar"); + let footer = page.prepare_region("footer"); html! { body class=[page.body_classes().get()] { - @for (region, _) in self.regions().iter() { - @if let Some(content) = page.prepare_region(region) { - #(region) class="region" { (content) } + div class="pt-body__wrapper" { + div class="pt-body__regions" { + (header.unwrap_or_default()) + (pagetop.unwrap_or_default()) + (content.unwrap_or_default()) + (sidebar.unwrap_or_default()) + (footer.unwrap_or_default()) } } } diff --git a/pagetop/src/locale/en-US/base.ftl b/pagetop/src/locale/en-US/base.ftl index 07c1d040..200ae5d1 100644 --- a/pagetop/src/locale/en-US/base.ftl +++ b/pagetop/src/locale/en-US/base.ftl @@ -1,4 +1,4 @@ -# SiteBranding component. +# Branding component. site_home = Home # PoweredBy component. diff --git a/pagetop/src/locale/es-ES/base.ftl b/pagetop/src/locale/es-ES/base.ftl index 3e6f4eec..ee6d2544 100644 --- a/pagetop/src/locale/es-ES/base.ftl +++ b/pagetop/src/locale/es-ES/base.ftl @@ -1,4 +1,4 @@ -# SiteBranding component. +# Branding component. site_home = Inicio # PoweredBy component. diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index e40ad2a7..7398d9f1 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -3,7 +3,7 @@ use crate::base::component::L10n; use crate::core::component::{ArcComponent, ComponentTrait, TypedComponent}; use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; -use crate::html::{html, ClassesOp, Favicon, Markup, OptionClasses, DOCTYPE}; +use crate::html::{html, ClassesOp, Favicon, Markup, OptionClasses, OptionId, DOCTYPE}; use crate::response::fatal_error::FatalError; use crate::{fn_builder, service}; @@ -177,7 +177,11 @@ impl Page { if render.is_empty() { None } else { - Some(render) + Some(html! { + div id=[OptionId::with(region).get()] class="region" { + (render) + } + }) } } } diff --git a/pagetop/static/base/css/components.css b/pagetop/static/base/css/components.css new file mode 100644 index 00000000..57f93007 --- /dev/null +++ b/pagetop/static/base/css/components.css @@ -0,0 +1,46 @@ +/* Image component */ + +.pt-img__fluid { + max-width: 100%; + height: auto; +} + +/* Branding component */ + +.pt-branding__wrapper { + display: flex; + align-items: flex-end; + column-gap: var(--pt-gap-0-75); +} +.pt-branding__name { + letter-spacing: 0.02em; + font-size: var(--pt-font-size-xl); +} +.pt-branding__slogan { + font-size: var(--pt-font-size-l); +} + +/* SM - Applies <= 568px */ +@media (max-width: 35.5em) { + .pt-branding__logo { + display: none; + } +} +/* LG - Applies <= 992px */ +@media (max-width: 62em) { + .pt-branding__slogan { + font-size: var(--pt-font-size-l); + } +} + +/* PoweredBy component */ + +#pt-powered-by { + text-align: center; +} +#pt-powered-by .pt-pagetop__logo img, +#pt-powered-by .pt-pagetop__logo svg { + margin-left: .275em; + height: 1.275em; + vertical-align: middle; +} diff --git a/pagetop/static/base/css/looks.css b/pagetop/static/base/css/looks.css index c3c077d7..57f93007 100644 --- a/pagetop/static/base/css/looks.css +++ b/pagetop/static/base/css/looks.css @@ -5,7 +5,7 @@ height: auto; } -/* SiteBranding component */ +/* Branding component */ .pt-branding__wrapper { display: flex; diff --git a/pagetop/static/base/css/root.css b/pagetop/static/base/css/root.css index c838590b..6375ccf8 100644 --- a/pagetop/static/base/css/root.css +++ b/pagetop/static/base/css/root.css @@ -14,6 +14,7 @@ --pt-line-height-base: 1.5; --pt-color-bg: #fff; --pt-color: #212529; + --pt-max-width: 80rem; /* --pt-color-rgb: 33,37,41; --pt-main--bg-rgb: 255,255,255; @@ -21,7 +22,6 @@ --line-height-base: 1.6875rem; --line-height-s: 1.125rem; - --max-width: 84.375rem; --max-bg-color: 98.125rem; */ --pt-gap: 1.125rem; diff --git a/pagetop/static/base/css/styles.css b/pagetop/static/base/css/styles.css index 403362de..234b8b3c 100644 --- a/pagetop/static/base/css/styles.css +++ b/pagetop/static/base/css/styles.css @@ -9,3 +9,8 @@ body { -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; } + +.pt-body__wrapper { + max-width: var(--pt-max-width); + margin: 0 auto; +} From a4ca7993b590eae370dd4ba2e9d6f1390fa16f2a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 08:20:03 +0200 Subject: [PATCH 554/853] =?UTF-8?q?=F0=9F=9A=A7=20Classname=20tweak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 2 +- pagetop/static/base/css/flex.css | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index a2da38cc..4fa00504 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -67,7 +67,7 @@ pub enum BreakPoint { impl ToString for BreakPoint { fn to_string(&self) -> String { match self { - BreakPoint::None => "pt-bp__no".to_string(), + BreakPoint::None => "pt-bp__none".to_string(), BreakPoint::SM => "pt-bp__sm".to_string(), BreakPoint::MD => "pt-bp__md".to_string(), BreakPoint::LG => "pt-bp__lg".to_string(), diff --git a/pagetop/static/base/css/flex.css b/pagetop/static/base/css/flex.css index 42b1d27f..f3ddc9c4 100644 --- a/pagetop/static/base/css/flex.css +++ b/pagetop/static/base/css/flex.css @@ -10,19 +10,19 @@ padding: 0 !important; } .pt-flex__row, -.pt-flex__col.pt-bp__no { +.pt-flex__col.pt-bp__none { flex-direction: column; } .pt-flex__row.pt-flex__reverse, -.pt-flex__col.pt-flex__reverse.pt-bp__no { +.pt-flex__col.pt-flex__reverse.pt-bp__none { flex-direction: column-reverse; } .pt-flex__col, -.pt-flex__row.pt-bp__no { +.pt-flex__row.pt-bp__none { flex-direction: row; } .pt-flex__col.pt-flex__reverse, -.pt-flex__row.pt-flex__reverse.pt-bp__no { +.pt-flex__row.pt-flex__reverse.pt-bp__none { flex-direction: row-reverse; } From 7c176ddafe80214b80bc859728c5e16a3ec8d4df Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 20:01:44 +0200 Subject: [PATCH 555/853] =?UTF-8?q?=E2=9C=A8=20Add=20new=20translation=20h?= =?UTF-8?q?andling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/locale.rs | 76 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index f06b37fe..75ae5109 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -86,11 +86,9 @@ //! //! static_locales!(LOCALES_SAMPLE in "path/to/locale"); //! ``` -//! -//! Usa el componente [L10n](crate::core::component::L10n) para incluir textos y contenidos -//! opcionalmente traducibles según el contexto de renderizado. -use crate::{config, kv, trace, LazyStatic}; +use crate::html::{Markup, PreEscaped}; +use crate::{config, kv, trace, LazyStatic, LOCALES_PAGETOP}; pub use fluent_templates; @@ -161,3 +159,73 @@ macro_rules! static_locales { } }; } + +#[derive(Default)] +enum L10nOp { + #[default] + None, + Text(String), + Translate(String), +} + +#[derive(Default)] +pub struct L10n { + op: L10nOp, + locales: Option<&'static Locales>, + args: HashMap<String, String>, +} + +impl L10n { + pub fn n(text: impl Into<String>) -> Self { + L10n { + op: L10nOp::Text(text.into()), + ..Default::default() + } + } + + pub fn l(key: impl Into<String>) -> Self { + L10n { + op: L10nOp::Translate(key.into()), + locales: Some(&LOCALES_PAGETOP), + ..Default::default() + } + } + + pub fn t(key: impl Into<String>, locales: &'static Locales) -> Self { + L10n { + op: L10nOp::Translate(key.into()), + locales: Some(locales), + ..Default::default() + } + } + + pub fn with_arg(mut self, arg: impl Into<String>, value: impl Into<String>) -> Self { + self.args.insert(arg.into(), value.into()); + self + } + + pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { + match &self.op { + L10nOp::None => None, + L10nOp::Text(text) => Some(text.to_owned()), + L10nOp::Translate(key) => match self.locales { + Some(locales) => locales.lookup_with_args( + langid, + key, + &self + .args + .iter() + .fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }), + ), + None => None, + }, + } + } + + pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { + PreEscaped(self.using(langid).unwrap_or_default()) + } +} From f5cfc4442eb0ca8013ba21c8ffbd69f76cb8c412 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 20:06:32 +0200 Subject: [PATCH 556/853] =?UTF-8?q?=E2=9C=A8=20Expand=20optional=20compone?= =?UTF-8?q?nt=20props?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html.rs | 3 +++ pagetop/src/html/opt_id.rs | 13 +++++----- pagetop/src/html/opt_name.rs | 13 +++++----- pagetop/src/html/opt_string.rs | 13 +++++----- pagetop/src/html/opt_translate.rs | 40 +++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 pagetop/src/html/opt_translate.rs diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 8e8e43ef..ade65cf1 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -22,6 +22,9 @@ pub use opt_name::OptionName; mod opt_string; pub use opt_string::OptionString; +mod opt_translate; +pub use opt_translate::OptionTranslate; + mod opt_classes; pub use opt_classes::{ClassesOp, OptionClasses}; diff --git a/pagetop/src/html/opt_id.rs b/pagetop/src/html/opt_id.rs index ab16aa6b..f78ab816 100644 --- a/pagetop/src/html/opt_id.rs +++ b/pagetop/src/html/opt_id.rs @@ -1,7 +1,7 @@ use crate::fn_builder; #[derive(Default)] -pub struct OptionId(String); +pub struct OptionId(Option<String>); impl OptionId { pub fn new() -> Self { @@ -18,17 +18,18 @@ impl OptionId { #[fn_builder] pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { - self.0 = value.into().trim().replace(' ', "_"); + self.0 = Some(value.into().trim().replace(' ', "_")); self } // OptionId GETTERS. pub fn get(&self) -> Option<String> { - if self.0.is_empty() { - None - } else { - Some(self.0.to_owned()) + if let Some(value) = &self.0 { + if !value.is_empty() { + return Some(value.to_owned()); + } } + None } } diff --git a/pagetop/src/html/opt_name.rs b/pagetop/src/html/opt_name.rs index e3cfb124..508db2c2 100644 --- a/pagetop/src/html/opt_name.rs +++ b/pagetop/src/html/opt_name.rs @@ -1,7 +1,7 @@ use crate::fn_builder; #[derive(Default)] -pub struct OptionName(String); +pub struct OptionName(Option<String>); impl OptionName { pub fn new() -> Self { @@ -18,17 +18,18 @@ impl OptionName { #[fn_builder] pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { - self.0 = value.into().trim().replace(' ', "_"); + self.0 = Some(value.into().trim().replace(' ', "_")); self } // OptionName GETTERS. pub fn get(&self) -> Option<String> { - if self.0.is_empty() { - None - } else { - Some(self.0.to_owned()) + if let Some(value) = &self.0 { + if !value.is_empty() { + return Some(value.to_owned()); + } } + None } } diff --git a/pagetop/src/html/opt_string.rs b/pagetop/src/html/opt_string.rs index 35fe2ba8..b060728f 100644 --- a/pagetop/src/html/opt_string.rs +++ b/pagetop/src/html/opt_string.rs @@ -1,7 +1,7 @@ use crate::fn_builder; #[derive(Default)] -pub struct OptionString(String); +pub struct OptionString(Option<String>); impl OptionString { pub fn new() -> Self { @@ -18,17 +18,18 @@ impl OptionString { #[fn_builder] pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { - self.0 = value.into().trim().to_owned(); + self.0 = Some(value.into().trim().to_owned()); self } // OptionString GETTERS. pub fn get(&self) -> Option<String> { - if self.0.is_empty() { - None - } else { - Some(self.0.to_owned()) + if let Some(value) = &self.0 { + if !value.is_empty() { + return Some(value.to_owned()); + } } + None } } diff --git a/pagetop/src/html/opt_translate.rs b/pagetop/src/html/opt_translate.rs new file mode 100644 index 00000000..20f62061 --- /dev/null +++ b/pagetop/src/html/opt_translate.rs @@ -0,0 +1,40 @@ +use crate::fn_builder; +use crate::html::{html, Markup}; +use crate::locale::{L10n, LanguageIdentifier}; + +#[derive(Default)] +pub struct OptionTranslate(Option<L10n>); + +impl OptionTranslate { + pub fn new() -> Self { + OptionTranslate::default() + } + + pub fn with(value: L10n) -> Self { + OptionTranslate(Some(value)) + } + + // OptionTranslate BUILDER. + + #[fn_builder] + pub fn alter_value(&mut self, value: L10n) -> &mut Self { + self.0 = Some(value); + self + } + + // OptionTranslate GETTERS. + + pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { + if let Some(value) = &self.0 { + return value.using(langid); + } + None + } + + pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { + if let Some(value) = &self.0 { + return value.escaped(langid); + } + html! {} + } +} From 0613278f7a4942a27acd9af7a97d9bcaf1fa1ad3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 20:33:20 +0200 Subject: [PATCH 557/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20code=20?= =?UTF-8?q?removing=20L10n=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 4 +- pagetop/src/base/component/anchor.rs | 9 +- pagetop/src/base/component/block.rs | 10 +- pagetop/src/base/component/branding.rs | 30 ++--- pagetop/src/base/component/form/button.rs | 13 +- pagetop/src/base/component/form/input.rs | 19 ++- pagetop/src/base/component/heading.rs | 20 ++-- pagetop/src/base/component/l10n.rs | 119 ------------------- pagetop/src/base/component/menu/item.rs | 31 +++-- pagetop/src/base/component/menu/menu_main.rs | 3 +- pagetop/src/base/component/menu/submenu.rs | 9 +- pagetop/src/base/component/paragraph.rs | 14 ++- pagetop/src/base/component/powered_by.rs | 23 ++-- pagetop/src/base/component/translate.rs | 40 +++++++ pagetop/src/core/module/definition.rs | 2 +- pagetop/src/response/fatal_error.rs | 2 +- pagetop/src/response/page.rs | 29 ++--- 17 files changed, 148 insertions(+), 229 deletions(-) delete mode 100644 pagetop/src/base/component/l10n.rs create mode 100644 pagetop/src/base/component/translate.rs diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 4fa00504..6ce6c84f 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -82,8 +82,8 @@ impl ToString for BreakPoint { mod html; pub use html::{Html, COMPONENT_BASE_HTML}; -mod l10n; -pub use l10n::{L10n, COMPONENT_BASE_L10N}; +mod translate; +pub use translate::{Translate, COMPONENT_BASE_TRANSLATE}; mod wrapper; pub use wrapper::{Wrapper, WrapperType, COMPONENT_BASE_WRAPPER}; diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index b632b91c..4c302db7 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -21,7 +21,6 @@ pub enum AnchorTarget { } type AnchorIcon = TypedComponent<Icon>; -type AnchorHtml = TypedComponent<L10n>; #[rustfmt::skip] #[derive(Default)] @@ -32,7 +31,7 @@ pub struct Anchor { classes : OptionClasses, anchor_type: AnchorType, href : OptionString, - html : AnchorHtml, + html : OptionTranslate, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, @@ -77,7 +76,7 @@ impl ComponentTrait for Anchor { target=[target] { (self.left_icon().prepare(cx)) - " " span { (self.html().prepare(cx)) } " " + " " span { (self.html().escaped(cx.langid())) } " " (self.right_icon().prepare(cx)) } }) @@ -147,7 +146,7 @@ impl Anchor { #[fn_builder] pub fn alter_html(&mut self, html: L10n) -> &mut Self { - self.html.set(html); + self.html.alter_value(html); self } @@ -189,7 +188,7 @@ impl Anchor { &self.href } - pub fn html(&self) -> &AnchorHtml { + pub fn html(&self) -> &OptionTranslate { &self.html } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index f74314a3..60cb01fa 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -4,8 +4,6 @@ new_handle!(COMPONENT_BASE_BLOCK); actions_for_component!(Block); -type BlockTitle = TypedComponent<L10n>; - #[rustfmt::skip] #[derive(Default)] pub struct Block { @@ -13,7 +11,7 @@ pub struct Block { renderable: Renderable, id : OptionId, classes : OptionClasses, - title : BlockTitle, + title : OptionTranslate, stuff : ArcComponents, template : String, } @@ -47,7 +45,7 @@ impl ComponentTrait for Block { let id = cx.required_id::<Block>(self.id()); PrepareMarkup::With(html! { div id=(id) class=[self.classes().get()] { - @if let Some(title) = self.title().get().into_string(cx) { + @if let Some(title) = self.title().using(cx.langid()) { h2 class="block-title" { (title) } } div class="block-body" { @@ -91,7 +89,7 @@ impl Block { #[fn_builder] pub fn alter_title(&mut self, title: L10n) -> &mut Self { - self.title.set(title); + self.title.alter_value(title); self } @@ -118,7 +116,7 @@ impl Block { &self.classes } - pub fn title(&self) -> &BlockTitle { + pub fn title(&self) -> &OptionTranslate { &self.title } diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index 07725875..4804abe3 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -1,17 +1,15 @@ use crate::prelude::*; -use crate::LOCALES_PAGETOP; new_handle!(COMPONENT_BASE_BRANDING); -type SiteSlogan = TypedComponent<L10n>; type SiteLogo = TypedComponent<Image>; #[rustfmt::skip] pub struct Branding { weight : Weight, renderable: Renderable, - name : String, - slogan : SiteSlogan, + app_name : String, + slogan : OptionTranslate, logo : SiteLogo, frontpage : FnContextualPath, } @@ -22,8 +20,8 @@ impl Default for Branding { Branding { weight : Weight::default(), renderable: Renderable::default(), - name : config::SETTINGS.app.name.to_owned(), - slogan : SiteSlogan::default(), + app_name : config::SETTINGS.app.name.to_owned(), + slogan : OptionTranslate::default(), logo : SiteLogo::default(), frontpage : |_| "/", } @@ -52,8 +50,8 @@ impl ComponentTrait for Branding { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let title = L10n::t("site_home", &LOCALES_PAGETOP).prepare(cx); - let slogan = self.slogan().prepare(cx); + let title = L10n::l("site_home").using(cx.langid()); + let slogan = self.slogan().using(cx.langid()).unwrap_or_default(); PrepareMarkup::With(html! { div id=[self.id()] { div class="pt-branding__wrapper" { @@ -62,7 +60,9 @@ impl ComponentTrait for Branding { } div class="pt-branding__text" { div class="pt-branding__name" { - a href=(self.frontpage()(cx)) title=(title) rel="home" { (self.name()) } + a href=(self.frontpage()(cx)) title=[title] rel="home" { + (self.app_name()) + } } @if !slogan.is_empty() { div class="pt-branding__slogan" { @@ -92,14 +92,14 @@ impl Branding { } #[fn_builder] - pub fn alter_name(&mut self, name: impl Into<String>) -> &mut Self { - self.name = name.into(); + pub fn alter_app_name(&mut self, app_name: impl Into<String>) -> &mut Self { + self.app_name = app_name.into(); self } #[fn_builder] pub fn alter_slogan(&mut self, slogan: L10n) -> &mut Self { - self.slogan = SiteSlogan::with(slogan); + self.slogan.alter_value(slogan); self } @@ -117,11 +117,11 @@ impl Branding { // Branding GETTERS. - pub fn name(&self) -> &String { - &self.name + pub fn app_name(&self) -> &String { + &self.app_name } - pub fn slogan(&self) -> &SiteSlogan { + pub fn slogan(&self) -> &OptionTranslate { &self.slogan } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 7cb6b498..98f4fba6 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -10,8 +10,6 @@ pub enum ButtonType { Reset, } -type ButtonValue = TypedComponent<L10n>; - #[rustfmt::skip] #[derive(Default)] pub struct Button { @@ -20,7 +18,7 @@ pub struct Button { classes : OptionClasses, button_type: ButtonType, name : OptionString, - value : ButtonValue, + value : OptionTranslate, autofocus : OptionString, disabled : OptionString, template : String, @@ -50,18 +48,17 @@ impl ComponentTrait for Button { ButtonType::Reset => "reset", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); - let value = self.value().prepare(cx); PrepareMarkup::With(html! { button type=(button_type) id=[id] class=[self.classes().get()] name=[self.name().get()] - value=(value) + value=[self.value().using(cx.langid())] autofocus=[self.autofocus().get()] disabled=[self.disabled().get()] { - (value) + (self.value().escaped(cx.langid())) } }) } @@ -116,7 +113,7 @@ impl Button { #[fn_builder] pub fn alter_value(&mut self, value: L10n) -> &mut Self { - self.value.set(value); + self.value.alter_value(value); self } @@ -158,7 +155,7 @@ impl Button { &self.name } - pub fn value(&self) -> &ButtonValue { + pub fn value(&self) -> &OptionTranslate { &self.value } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index d5ec5a00..f7668079 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -13,9 +13,6 @@ pub enum InputType { Url, } -type InputLabel = TypedComponent<L10n>; -type InputHelpText = TypedComponent<L10n>; - #[rustfmt::skip] #[derive(Default)] pub struct Input { @@ -25,7 +22,7 @@ pub struct Input { input_type : InputType, name : OptionName, value : OptionString, - label : InputLabel, + label : OptionTranslate, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, @@ -35,7 +32,7 @@ pub struct Input { disabled : OptionString, readonly : OptionString, required : OptionString, - help_text : InputHelpText, + help_text : OptionTranslate, template : String, } @@ -70,8 +67,8 @@ impl ComponentTrait for Input { InputType::Url => "url", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); - let label = self.label().prepare(cx); - let description = self.help_text().prepare(cx); + let label = self.label().using(cx.langid()).unwrap_or_default(); + let description = self.help_text().using(cx.langid()).unwrap_or_default(); PrepareMarkup::With(html! { div class=[self.classes().get()] { @if !label.is_empty() { @@ -195,7 +192,7 @@ impl Input { #[fn_builder] pub fn alter_label(&mut self, label: L10n) -> &mut Self { - self.label.set(label); + self.label.alter_value(label); self } @@ -270,7 +267,7 @@ impl Input { #[fn_builder] pub fn alter_help_text(&mut self, help_text: L10n) -> &mut Self { - self.help_text.set(help_text); + self.help_text.alter_value(help_text); self } @@ -298,7 +295,7 @@ impl Input { &self.value } - pub fn label(&self) -> &InputLabel { + pub fn label(&self) -> &OptionTranslate { &self.label } @@ -338,7 +335,7 @@ impl Input { &self.required } - pub fn help_text(&self) -> &InputHelpText { + pub fn help_text(&self) -> &OptionTranslate { &self.help_text } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 449073c9..dc9e7aa9 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -25,8 +25,6 @@ pub enum HeadingDisplay { Subtitle, } -type HeadingText = TypedComponent<L10n>; - #[rustfmt::skip] #[derive(Default)] pub struct Heading { @@ -35,7 +33,7 @@ pub struct Heading { id : OptionId, classes : OptionClasses, heading_type: HeadingType, - text : HeadingText, + text : OptionTranslate, display : HeadingDisplay, template : String, } @@ -65,12 +63,12 @@ impl ComponentTrait for Heading { let id = self.id(); let classes = self.classes().get(); PrepareMarkup::With(html! { @match &self.heading_type() { - HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().prepare(cx)) }, - HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().prepare(cx)) }, + HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, }}) } } @@ -146,7 +144,7 @@ impl Heading { #[fn_builder] pub fn alter_text(&mut self, text: L10n) -> &mut Self { - self.text.set(text); + self.text.alter_value(text); self } @@ -185,7 +183,7 @@ impl Heading { &self.heading_type } - pub fn text(&self) -> &HeadingText { + pub fn text(&self) -> &OptionTranslate { &self.text } diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs deleted file mode 100644 index eab57bf3..00000000 --- a/pagetop/src/base/component/l10n.rs +++ /dev/null @@ -1,119 +0,0 @@ -use crate::prelude::*; - -use std::collections::HashMap; - -new_handle!(COMPONENT_BASE_L10N); - -#[derive(Default)] -pub enum L10nOp { - #[default] - None, - Text(&'static str), - Translated(&'static str, &'static Locales), - Escaped(&'static str, &'static Locales), -} - -#[derive(Default)] -pub struct L10n { - op: L10nOp, - args: HashMap<&'static str, String>, -} - -impl ComponentTrait for L10n { - fn new() -> Self { - L10n::default() - } - - fn handle(&self) -> Handle { - COMPONENT_BASE_L10N - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - match self.op() { - L10nOp::None => PrepareMarkup::None, - L10nOp::Text(text) => PrepareMarkup::Text(text), - L10nOp::Translated(key, locales) => PrepareMarkup::With(html! { - (locales - .lookup_with_args( - cx.langid(), - key, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { - args.insert(key.to_string(), value.to_owned().into()); - args - }) - ) - .unwrap_or(key.to_string()) - ) - }), - L10nOp::Escaped(key, locales) => PrepareMarkup::With(html! { - (PreEscaped(locales - .lookup_with_args( - cx.langid(), - key, - &self.args().iter().fold(HashMap::new(), |mut args, (key, value)| { - args.insert(key.to_string(), value.to_owned().into()); - args - }) - ) - .unwrap_or(key.to_string()) - )) - }), - } - } -} - -impl L10n { - pub fn n(text: &'static str) -> Self { - L10n { - op: L10nOp::Text(text), - ..Default::default() - } - } - - pub fn t(key: &'static str, locales: &'static Locales) -> Self { - L10n { - op: L10nOp::Translated(key, locales), - ..Default::default() - } - } - - pub fn e(key: &'static str, locales: &'static Locales) -> Self { - L10n { - op: L10nOp::Escaped(key, locales), - ..Default::default() - } - } - - // L10n BUILDER. - - #[fn_builder] - pub fn alter_op(&mut self, op: L10nOp) -> &mut Self { - self.op = op; - self - } - - #[fn_builder] - pub fn alter_arg(&mut self, arg: &'static str, value: impl Into<String>) -> &mut Self { - self.args.insert(arg, value.into()); - self - } - - pub fn clear_args(&mut self) -> &mut Self { - self.args.drain(); - self - } - - // L10n GETTERS. - - pub fn op(&self) -> &L10nOp { - &self.op - } - - pub fn args(&self) -> &HashMap<&str, String> { - &self.args - } - - pub fn into_string(&self, cx: &mut Context) -> Option<String> { - self.prepare_component(cx).into_string() - } -} diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 5e16fdd5..546fdf4f 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -4,11 +4,10 @@ use super::{Megamenu, Submenu}; new_handle!(COMPONENT_BASE_MENU_ITEM); -type Label = TypedComponent<L10n>; +type Label = L10n; type Content = TypedComponent<Html>; type SubmenuItems = TypedComponent<Submenu>; type MegamenuGroups = TypedComponent<Megamenu>; -type Description = TypedComponent<L10n>; #[derive(Default)] pub enum ItemType { @@ -30,7 +29,7 @@ pub struct Item { weight : Weight, renderable : Renderable, item_type : ItemType, - description: Description, + description: OptionTranslate, } impl ComponentTrait for Item { @@ -51,27 +50,27 @@ impl ComponentTrait for Item { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let description = self.description.get().into_string(cx); + let description = self.description.using(cx.langid()); match self.item_type() { ItemType::Void => PrepareMarkup::None, ItemType::Label(label) => PrepareMarkup::With(html! { li class="pt-menu__label" { span title=[description] { - (label.prepare(cx)) + (label.escaped(cx.langid())) } } }), ItemType::Link(label, path) => PrepareMarkup::With(html! { li class="pt-menu__link" { a href=(path(cx)) title=[description] { - (label.prepare(cx)) + (label.escaped(cx.langid())) } } }), ItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { li class="pt-menu__link" { a href=(path(cx)) title=[description] target="_blank" { - (label.prepare(cx)) + (label.escaped(cx.langid())) } } }), @@ -83,7 +82,7 @@ impl ComponentTrait for Item { ItemType::Submenu(label, submenu) => PrepareMarkup::With(html! { li class="pt-menu__children" { a href="#" title=[description] { - (label.prepare(cx)) i class="pt-menu__icon bi-chevron-down" {} + (label.escaped(cx.langid())) i class="pt-menu__icon bi-chevron-down" {} } div class="pt-menu__subs" { (submenu.prepare(cx)) @@ -93,7 +92,7 @@ impl ComponentTrait for Item { ItemType::Megamenu(label, megamenu) => PrepareMarkup::With(html! { li class="pt-menu__children" { a href="#" title=[description] { - (label.prepare(cx)) i class="pt-menu__icon bi-chevron-down" {} + (label.escaped(cx.langid())) i class="pt-menu__icon bi-chevron-down" {} } div class="pt-menu__subs pt-menu__mega" { (megamenu.prepare(cx)) @@ -107,21 +106,21 @@ impl ComponentTrait for Item { impl Item { pub fn label(label: L10n) -> Self { Item { - item_type: ItemType::Label(Label::with(label)), + item_type: ItemType::Label(label), ..Default::default() } } pub fn link(label: L10n, path: FnContextualPath) -> Self { Item { - item_type: ItemType::Link(Label::with(label), path), + item_type: ItemType::Link(label, path), ..Default::default() } } pub fn link_blank(label: L10n, path: FnContextualPath) -> Self { Item { - item_type: ItemType::LinkBlank(Label::with(label), path), + item_type: ItemType::LinkBlank(label, path), ..Default::default() } } @@ -135,14 +134,14 @@ impl Item { pub fn submenu(label: L10n, submenu: Submenu) -> Self { Item { - item_type: ItemType::Submenu(Label::with(label), SubmenuItems::with(submenu)), + item_type: ItemType::Submenu(label, SubmenuItems::with(submenu)), ..Default::default() } } pub fn megamenu(label: L10n, megamenu: Megamenu) -> Self { Item { - item_type: ItemType::Megamenu(Label::with(label), MegamenuGroups::with(megamenu)), + item_type: ItemType::Megamenu(label, MegamenuGroups::with(megamenu)), ..Default::default() } } @@ -163,7 +162,7 @@ impl Item { #[fn_builder] pub fn alter_description(&mut self, text: L10n) -> &mut Self { - self.description.set(text); + self.description.alter_value(text); self } @@ -173,7 +172,7 @@ impl Item { &self.item_type } - pub fn description(&self) -> &Description { + pub fn description(&self) -> &OptionTranslate { &self.description } } diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index 1dbad575..04767626 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -1,5 +1,4 @@ use crate::prelude::*; -use crate::LOCALES_PAGETOP; use super::Item; @@ -68,7 +67,7 @@ impl ComponentTrait for Menu { button type="button" class="pt-menu__trigger" - title=[L10n::t("menu_toggle", &LOCALES_PAGETOP).into_string(cx)] + title=[L10n::l("menu_toggle").using(cx.langid())] { span {} span {} span {} } diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index 37eff01d..07ff5504 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -4,7 +4,6 @@ use super::Item; new_handle!(COMPONENT_BASE_MENU_SUBMENU); -type TitleSubmenu = TypedComponent<L10n>; type Items = TypedComponents<Item>; #[rustfmt::skip] @@ -13,7 +12,7 @@ pub struct Submenu { weight : Weight, renderable: Renderable, id : OptionId, - title : TitleSubmenu, + title : OptionTranslate, items : Items, } @@ -41,7 +40,7 @@ impl ComponentTrait for Submenu { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div id=[self.id()] class="pt-menu__items" { - @if let Some(title) = self.title().get().into_string(cx) { + @if let Some(title) = self.title().using(cx.langid()) { h4 class="pt-menu__title" { (title) } } ul { @@ -75,7 +74,7 @@ impl Submenu { #[fn_builder] pub fn alter_title(&mut self, title: L10n) -> &mut Self { - self.title.set(title); + self.title.alter_value(title); self } @@ -92,7 +91,7 @@ impl Submenu { // Submenu GETTERS. - pub fn title(&self) -> &TitleSubmenu { + pub fn title(&self) -> &OptionTranslate { &self.title } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index b804d2a5..39d54a8c 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -60,7 +60,11 @@ impl ComponentTrait for Paragraph { impl Paragraph { pub fn with(component: impl ComponentTrait) -> Self { - Paragraph::new().with_component(component) + Paragraph::new().add_component(component) + } + + pub fn translated(l10n: L10n) -> Self { + Paragraph::new().add_translated(l10n) } // Paragraph BUILDER. @@ -89,11 +93,17 @@ impl Paragraph { self } - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + pub fn add_component(mut self, component: impl ComponentTrait) -> Self { self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } + pub fn add_translated(mut self, l10n: L10n) -> Self { + self.stuff + .alter(ArcOp::Add(ArcComponent::with(Translate::with(l10n)))); + self + } + #[fn_builder] pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { self.stuff.alter(op); diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index e3b03262..8600a402 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -1,5 +1,4 @@ use crate::prelude::*; -use crate::LOCALES_PAGETOP; new_handle!(COMPONENT_BASE_POWEREDBY); @@ -51,10 +50,10 @@ impl ComponentTrait for PoweredBy { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let logo = match self.logo() { PoweredByLogo::Color => { - let logo_txt = L10n::t("pagetop_logo", &LOCALES_PAGETOP); + let logo_txt = &L10n::l("pagetop_logo").using(cx.langid()); html! { - span class="pt-pagetop__logo" aria-label=[logo_txt.into_string(cx)] { - img src="/base/pagetop-logo.svg" alt=[logo_txt.into_string(cx)] {} + span class="pt-pagetop__logo" aria-label=[logo_txt] { + img src="/base/pagetop-logo.svg" alt=[logo_txt] {} } } } @@ -64,17 +63,19 @@ impl ComponentTrait for PoweredBy { _ => html! {}, }; - let mut credits = L10n::e("poweredby_pagetop", &LOCALES_PAGETOP).with_arg( - "pagetop_link", - "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", - ); + let credits = L10n::l("poweredby_pagetop") + .with_arg( + "pagetop_link", + "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", + ) + .escaped(cx.langid()); PrepareMarkup::With(html! { div id=[self.id()] { @if let Some(c) = self.copyright() { span class="copyright" { (c) "." } " " } - span class="powered" { (credits.prepare(cx)) " " (logo) } + span class="powered" { (credits) " " (logo) } } }) } @@ -120,10 +121,10 @@ impl PoweredBy { // PoweredBy PRIVATE. fn logo_line(&self, r: u8, g: u8, b: u8, cx: &mut Context) -> Markup { - let logo_txt = L10n::t("pagetop_logo", &LOCALES_PAGETOP); + let logo_txt = L10n::l("pagetop_logo").using(cx.langid()); let logo_rgb = format!("rgb({},{},{})", r, g, b); html! { - span class="pt-pagetop__logo" aria-label=[logo_txt.into_string(cx)] { + span class="pt-pagetop__logo" aria-label=[logo_txt] { svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} path fill=(logo_rgb) d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} diff --git a/pagetop/src/base/component/translate.rs b/pagetop/src/base/component/translate.rs new file mode 100644 index 00000000..0e658172 --- /dev/null +++ b/pagetop/src/base/component/translate.rs @@ -0,0 +1,40 @@ +use crate::prelude::*; + +new_handle!(COMPONENT_BASE_TRANSLATE); + +#[derive(Default)] +pub struct Translate(L10n); + +impl ComponentTrait for Translate { + fn new() -> Self { + Translate::default() + } + + fn handle(&self) -> Handle { + COMPONENT_BASE_TRANSLATE + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(self.l10n().escaped(cx.langid())) + } +} + +impl Translate { + pub fn with(l10n: L10n) -> Self { + Translate(l10n) + } + + // Translate BUILDER. + + #[fn_builder] + pub fn alter_l10n(&mut self, l10n: L10n) -> &mut Self { + self.0 = l10n; + self + } + + // Translate GETTERS. + + pub fn l10n(&self) -> &L10n { + &self.0 + } +} diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index b81fe75d..dd7f9d30 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,6 +1,6 @@ -use crate::base::component::L10n; use crate::core::action::Action; use crate::core::theme::ThemeRef; +use crate::locale::L10n; use crate::{actions, service, util, Handle}; #[cfg(feature = "database")] diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 3994b91c..7c2fce9f 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -3,7 +3,7 @@ pub use error403::ERROR_403; mod error404; pub use error404::ERROR_404; -use crate::base::component::L10n; +use crate::locale::L10n; use crate::response::{page::Page, ResponseError}; use crate::service::http::{header::ContentType, StatusCode}; use crate::service::{HttpRequest, HttpResponse}; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 7398d9f1..efdd60fe 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,9 +1,11 @@ use crate::base::action::page::{run_actions_after_prepare_body, run_actions_before_prepare_body}; -use crate::base::component::L10n; -use crate::core::component::{ArcComponent, ComponentTrait, TypedComponent}; +use crate::core::component::{ArcComponent, ComponentTrait}; use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; -use crate::html::{html, ClassesOp, Favicon, Markup, OptionClasses, OptionId, DOCTYPE}; +use crate::html::{ + html, ClassesOp, Favicon, Markup, OptionClasses, OptionId, OptionTranslate, DOCTYPE, +}; +use crate::locale::L10n; use crate::response::fatal_error::FatalError; use crate::{fn_builder, service}; @@ -11,13 +13,10 @@ use unic_langid::CharacterDirection; pub use actix_web::Result as ResultPage; -type PageTitle = TypedComponent<L10n>; -type PageDescription = TypedComponent<L10n>; - #[rustfmt::skip] pub struct Page { - title : PageTitle, - description : PageDescription, + title : OptionTranslate, + description : OptionTranslate, metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, favicon : Option<Favicon>, @@ -31,8 +30,8 @@ impl Page { #[rustfmt::skip] pub fn new(request: service::HttpRequest) -> Self { Page { - title : PageTitle::new(), - description : PageDescription::new(), + title : OptionTranslate::new(), + description : OptionTranslate::new(), metadata : Vec::new(), properties : Vec::new(), favicon : None, @@ -47,13 +46,13 @@ impl Page { #[fn_builder] pub fn alter_title(&mut self, title: L10n) -> &mut Self { - self.title.set(title); + self.title.alter_value(title); self } #[fn_builder] pub fn alter_description(&mut self, description: L10n) -> &mut Self { - self.description.set(description); + self.description.alter_value(description); self } @@ -102,11 +101,13 @@ impl Page { // Page GETTERS. pub fn title(&mut self) -> String { - self.title.prepare(&mut self.context).into_string() + self.title.using(self.context.langid()).unwrap_or_default() } pub fn description(&mut self) -> String { - self.description.prepare(&mut self.context).into_string() + self.description + .using(self.context.langid()) + .unwrap_or_default() } pub fn metadata(&self) -> &Vec<(&str, &str)> { From 71e6d4cf88b0e53e2d9c277c868056ab02f14eed Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 20:41:11 +0200 Subject: [PATCH 558/853] =?UTF-8?q?=F0=9F=92=A5=20Improved=20container=20a?= =?UTF-8?q?dd=20method=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/flex/container.rs | 2 +- pagetop/src/base/component/flex/item.rs | 2 +- pagetop/src/base/component/menu/group.rs | 2 +- pagetop/src/base/component/menu/megamenu.rs | 2 +- pagetop/src/base/component/menu/menu_main.rs | 2 +- pagetop/src/base/component/menu/submenu.rs | 2 +- pagetop/src/base/component/wrapper.rs | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 60cb01fa..b9671ef8 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -93,7 +93,7 @@ impl Block { self } - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + pub fn add_component(mut self, component: impl ComponentTrait) -> Self { self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index 700afe31..da37b150 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -92,7 +92,7 @@ impl Container { self } - pub fn with_item(mut self, item: flex::Item) -> Self { + pub fn add_item(mut self, item: flex::Item) -> Self { self.items.alter(TypedOp::Add(TypedComponent::with(item))); self } diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 542929a7..1b44f26f 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -149,7 +149,7 @@ impl Item { self } - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + pub fn add_component(mut self, component: impl ComponentTrait) -> Self { self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index 8c8a19ea..c4cc7c07 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -66,7 +66,7 @@ impl Group { self } - pub fn with_element(mut self, element: Element) -> Self { + pub fn add_element(mut self, element: Element) -> Self { self.elements .alter(TypedOp::Add(TypedComponent::with(element))); self diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index 602c26ad..80899f1d 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -66,7 +66,7 @@ impl Megamenu { self } - pub fn with_group(mut self, group: Group) -> Self { + pub fn add_group(mut self, group: Group) -> Self { self.groups.alter(TypedOp::Add(TypedComponent::with(group))); self } diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index 04767626..f02517ba 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -102,7 +102,7 @@ impl Menu { self } - pub fn with_item(mut self, item: Item) -> Self { + pub fn add_item(mut self, item: Item) -> Self { self.items.alter(TypedOp::Add(TypedComponent::with(item))); self } diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index 07ff5504..e58a93d6 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -78,7 +78,7 @@ impl Submenu { self } - pub fn with_item(mut self, item: Item) -> Self { + pub fn add_item(mut self, item: Item) -> Self { self.items.alter(TypedOp::Add(TypedComponent::with(item))); self } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 35a20104..75061dc7 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -154,7 +154,7 @@ impl Wrapper { self } - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + pub fn add_component(mut self, component: impl ComponentTrait) -> Self { self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self } From 861a9648e8bf80d9e2d10fe1059e06cdb4f6dc6d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 21:11:25 +0200 Subject: [PATCH 559/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Imp?= =?UTF-8?q?rove=20handling=20of=20empty=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/branding.rs | 3 +-- pagetop/src/base/component/form/input.rs | 6 ++---- pagetop/src/locale.rs | 7 ++++++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index 4804abe3..d315e172 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -51,7 +51,6 @@ impl ComponentTrait for Branding { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let title = L10n::l("site_home").using(cx.langid()); - let slogan = self.slogan().using(cx.langid()).unwrap_or_default(); PrepareMarkup::With(html! { div id=[self.id()] { div class="pt-branding__wrapper" { @@ -64,7 +63,7 @@ impl ComponentTrait for Branding { (self.app_name()) } } - @if !slogan.is_empty() { + @if let Some(slogan) = self.slogan().using(cx.langid()) { div class="pt-branding__slogan" { (slogan) } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index f7668079..d59d1048 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -67,11 +67,9 @@ impl ComponentTrait for Input { InputType::Url => "url", }; let id = self.name().get().map(|name| concat_string!("edit-", name)); - let label = self.label().using(cx.langid()).unwrap_or_default(); - let description = self.help_text().using(cx.langid()).unwrap_or_default(); PrepareMarkup::With(html! { div class=[self.classes().get()] { - @if !label.is_empty() { + @if let Some(label) = self.label().using(cx.langid()) { label class="form-label" for=[&id] { (label) " " @if self.required().get().is_some() { @@ -96,7 +94,7 @@ impl ComponentTrait for Input { readonly=[self.readonly().get()] required=[self.required().get()] disabled=[self.disabled().get()] {} - @if !description.is_empty() { + @if let Some(description) = self.help_text().using(cx.langid()) { div class="form-text" { (description) } } } diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 75ae5109..1673f976 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -177,8 +177,13 @@ pub struct L10n { impl L10n { pub fn n(text: impl Into<String>) -> Self { + let text = text.into(); L10n { - op: L10nOp::Text(text.into()), + op: if text.trim().is_empty() { + L10nOp::None + } else { + L10nOp::Text(text) + }, ..Default::default() } } From 03dbb39bbc2621edda7b567b427db197beecf38c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 21:23:38 +0200 Subject: [PATCH 560/853] =?UTF-8?q?=F0=9F=92=A5=20Optional=20title=20and?= =?UTF-8?q?=20description=20in=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/theme/definition.rs | 7 ++----- pagetop/src/response/page.rs | 10 ++++------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 20ac8c33..9cba6852 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,4 +1,3 @@ -use crate::base::component::L10n; use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; @@ -51,20 +50,18 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } fn prepare_head(&self, page: &mut Page) -> Markup { - let title = page.title(); - let description = page.description(); let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { head { meta charset="utf-8"; - @if !title.is_empty() { + @if let Some(title) = page.title() { title { (config::SETTINGS.app.name) (" - ") (title) } } @else { title { (config::SETTINGS.app.name) } } - @if !description.is_empty() { + @if let Some(description) = page.description() { meta name="description" content=(description); } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index efdd60fe..f2268c5b 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -100,14 +100,12 @@ impl Page { // Page GETTERS. - pub fn title(&mut self) -> String { - self.title.using(self.context.langid()).unwrap_or_default() + pub fn title(&mut self) -> Option<String> { + self.title.using(self.context.langid()) } - pub fn description(&mut self) -> String { - self.description - .using(self.context.langid()) - .unwrap_or_default() + pub fn description(&mut self) -> Option<String> { + self.description.using(self.context.langid()) } pub fn metadata(&self) -> &Vec<(&str, &str)> { From 03d538eb419d9a1e17aa24133d62f47996dcc827 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 21:31:18 +0200 Subject: [PATCH 561/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20OptionTranslate?= =?UTF-8?q?=20to=20OptionTranslated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/anchor.rs | 4 ++-- pagetop/src/base/component/block.rs | 4 ++-- pagetop/src/base/component/branding.rs | 6 +++--- pagetop/src/base/component/form/button.rs | 4 ++-- pagetop/src/base/component/form/input.rs | 8 ++++---- pagetop/src/base/component/heading.rs | 4 ++-- pagetop/src/base/component/menu/item.rs | 4 ++-- pagetop/src/base/component/menu/submenu.rs | 4 ++-- pagetop/src/html.rs | 4 ++-- .../src/html/{opt_translate.rs => opt_translated.rs} | 12 ++++++------ 10 files changed, 27 insertions(+), 27 deletions(-) rename pagetop/src/html/{opt_translate.rs => opt_translated.rs} (77%) diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index 4c302db7..df784cda 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -31,7 +31,7 @@ pub struct Anchor { classes : OptionClasses, anchor_type: AnchorType, href : OptionString, - html : OptionTranslate, + html : OptionTranslated, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, @@ -188,7 +188,7 @@ impl Anchor { &self.href } - pub fn html(&self) -> &OptionTranslate { + pub fn html(&self) -> &OptionTranslated { &self.html } diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b9671ef8..cff0f744 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -11,7 +11,7 @@ pub struct Block { renderable: Renderable, id : OptionId, classes : OptionClasses, - title : OptionTranslate, + title : OptionTranslated, stuff : ArcComponents, template : String, } @@ -116,7 +116,7 @@ impl Block { &self.classes } - pub fn title(&self) -> &OptionTranslate { + pub fn title(&self) -> &OptionTranslated { &self.title } diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index d315e172..fba36693 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -9,7 +9,7 @@ pub struct Branding { weight : Weight, renderable: Renderable, app_name : String, - slogan : OptionTranslate, + slogan : OptionTranslated, logo : SiteLogo, frontpage : FnContextualPath, } @@ -21,7 +21,7 @@ impl Default for Branding { weight : Weight::default(), renderable: Renderable::default(), app_name : config::SETTINGS.app.name.to_owned(), - slogan : OptionTranslate::default(), + slogan : OptionTranslated::default(), logo : SiteLogo::default(), frontpage : |_| "/", } @@ -120,7 +120,7 @@ impl Branding { &self.app_name } - pub fn slogan(&self) -> &OptionTranslate { + pub fn slogan(&self) -> &OptionTranslated { &self.slogan } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 98f4fba6..1fce9dc9 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -18,7 +18,7 @@ pub struct Button { classes : OptionClasses, button_type: ButtonType, name : OptionString, - value : OptionTranslate, + value : OptionTranslated, autofocus : OptionString, disabled : OptionString, template : String, @@ -155,7 +155,7 @@ impl Button { &self.name } - pub fn value(&self) -> &OptionTranslate { + pub fn value(&self) -> &OptionTranslated { &self.value } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index d59d1048..74a92497 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -22,7 +22,7 @@ pub struct Input { input_type : InputType, name : OptionName, value : OptionString, - label : OptionTranslate, + label : OptionTranslated, size : Option<u16>, minlength : Option<u16>, maxlength : Option<u16>, @@ -32,7 +32,7 @@ pub struct Input { disabled : OptionString, readonly : OptionString, required : OptionString, - help_text : OptionTranslate, + help_text : OptionTranslated, template : String, } @@ -293,7 +293,7 @@ impl Input { &self.value } - pub fn label(&self) -> &OptionTranslate { + pub fn label(&self) -> &OptionTranslated { &self.label } @@ -333,7 +333,7 @@ impl Input { &self.required } - pub fn help_text(&self) -> &OptionTranslate { + pub fn help_text(&self) -> &OptionTranslated { &self.help_text } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index dc9e7aa9..af42e5fe 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -33,7 +33,7 @@ pub struct Heading { id : OptionId, classes : OptionClasses, heading_type: HeadingType, - text : OptionTranslate, + text : OptionTranslated, display : HeadingDisplay, template : String, } @@ -183,7 +183,7 @@ impl Heading { &self.heading_type } - pub fn text(&self) -> &OptionTranslate { + pub fn text(&self) -> &OptionTranslated { &self.text } diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 546fdf4f..aefd2a13 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -29,7 +29,7 @@ pub struct Item { weight : Weight, renderable : Renderable, item_type : ItemType, - description: OptionTranslate, + description: OptionTranslated, } impl ComponentTrait for Item { @@ -172,7 +172,7 @@ impl Item { &self.item_type } - pub fn description(&self) -> &OptionTranslate { + pub fn description(&self) -> &OptionTranslated { &self.description } } diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index e58a93d6..a2586804 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -12,7 +12,7 @@ pub struct Submenu { weight : Weight, renderable: Renderable, id : OptionId, - title : OptionTranslate, + title : OptionTranslated, items : Items, } @@ -91,7 +91,7 @@ impl Submenu { // Submenu GETTERS. - pub fn title(&self) -> &OptionTranslate { + pub fn title(&self) -> &OptionTranslated { &self.title } diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index ade65cf1..ee77da22 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -22,8 +22,8 @@ pub use opt_name::OptionName; mod opt_string; pub use opt_string::OptionString; -mod opt_translate; -pub use opt_translate::OptionTranslate; +mod opt_translated; +pub use opt_translated::OptionTranslated; mod opt_classes; pub use opt_classes::{ClassesOp, OptionClasses}; diff --git a/pagetop/src/html/opt_translate.rs b/pagetop/src/html/opt_translated.rs similarity index 77% rename from pagetop/src/html/opt_translate.rs rename to pagetop/src/html/opt_translated.rs index 20f62061..9d8c255b 100644 --- a/pagetop/src/html/opt_translate.rs +++ b/pagetop/src/html/opt_translated.rs @@ -3,18 +3,18 @@ use crate::html::{html, Markup}; use crate::locale::{L10n, LanguageIdentifier}; #[derive(Default)] -pub struct OptionTranslate(Option<L10n>); +pub struct OptionTranslated(Option<L10n>); -impl OptionTranslate { +impl OptionTranslated { pub fn new() -> Self { - OptionTranslate::default() + OptionTranslated::default() } pub fn with(value: L10n) -> Self { - OptionTranslate(Some(value)) + OptionTranslated(Some(value)) } - // OptionTranslate BUILDER. + // OptionTranslated BUILDER. #[fn_builder] pub fn alter_value(&mut self, value: L10n) -> &mut Self { @@ -22,7 +22,7 @@ impl OptionTranslate { self } - // OptionTranslate GETTERS. + // OptionTranslated GETTERS. pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { if let Some(value) = &self.0 { From 718bc5d76988542770e7435cebdddcce4f43cbfd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 21:33:39 +0200 Subject: [PATCH 562/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Apply=20latest?= =?UTF-8?q?=20changes=20to=20the=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/summary.rs | 116 +++++++++++++++++------------------ pagetop-bootsier/src/lib.rs | 9 ++- pagetop-homedemo/src/lib.rs | 92 ++++++++++++++------------- pagetop-user/src/lib.rs | 2 +- 4 files changed, 114 insertions(+), 105 deletions(-) diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 9dad793c..e9d9e1a7 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -4,150 +4,150 @@ use pagetop::prelude::*; pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = Menu::new() - .with_item(menu::Item::label(L10n::t("module_name", &LOCALES_ADMIN))) - .with_item(menu::Item::label(L10n::n("Ejemplo \"Label\""))) - .with_item(menu::Item::link(L10n::n("Ejemplo \"Link\""), |_| { + .add_item(menu::Item::label(L10n::t("module_name", &LOCALES_ADMIN))) + .add_item(menu::Item::label(L10n::n("Ejemplo \"Label\""))) + .add_item(menu::Item::link(L10n::n("Ejemplo \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Ejemplo \"LinkBlank\""), |_| "https://www.google.es", )) - .with_item(menu::Item::submenu( + .add_item(menu::Item::submenu( L10n::n("Ejemplo Submenú"), menu::Submenu::new() .with_title(L10n::n("Título submenú")) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )) - .with_item(menu::Item::submenu( + .add_item(menu::Item::submenu( L10n::n("Otro submenú con un texto muy, pero que muy largo"), menu::Submenu::new() - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))), )) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))), )) - .with_item(menu::Item::megamenu( + .add_item(menu::Item::megamenu( L10n::n("Ejemplo Megamenú 1"), menu::Megamenu::new() - .with_group( + .add_group( menu::Group::new() - .with_element(menu::Element::submenu( + .add_element(menu::Element::submenu( menu::Submenu::new() .with_title(L10n::n("Título submenú")) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )), )) - .with_element(menu::Element::submenu( + .add_element(menu::Element::submenu( menu::Submenu::new() .with_title(L10n::n("Título submenú")) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )), )), ) - .with_group( - menu::Group::new().with_element(menu::Element::submenu( + .add_group( + menu::Group::new().add_element(menu::Element::submenu( menu::Submenu::new() - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))), )), ) - .with_group( + .add_group( menu::Group::new() - .with_element(menu::Element::submenu( + .add_element(menu::Element::submenu( menu::Submenu::new() .with_title(L10n::n("Título submenú")) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )), )) - .with_element(menu::Element::submenu( + .add_element(menu::Element::submenu( menu::Submenu::new() .with_title(L10n::n("Título submenú")) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )), )), ) - .with_group( - menu::Group::new().with_element(menu::Element::submenu( + .add_group( + menu::Group::new().add_element(menu::Element::submenu( menu::Submenu::new() - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))) - .with_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))) + .add_item(menu::Item::link(L10n::n("Opción \"Link\""), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank( + .add_item(menu::Item::link_blank( L10n::n("Opción \"LinkBlank\""), |_| "https://www.google.es", )) - .with_item(menu::Item::label(L10n::n("Opción \"Label\""))), + .add_item(menu::Item::label(L10n::n("Opción \"Label\""))), )), ), )); let side_menu = Menu::new() - .with_item(menu::Item::label(L10n::n("Opción 1"))) - .with_item(menu::Item::link(L10n::n("Opción 2"), |_| { + .add_item(menu::Item::label(L10n::n("Opción 1"))) + .add_item(menu::Item::link(L10n::n("Opción 2"), |_| { "https://www.google.es" })) - .with_item(menu::Item::link_blank(L10n::n("Opción 3"), |_| { + .add_item(menu::Item::link_blank(L10n::n("Opción 3"), |_| { "https://www.google.es" })) - .with_item(menu::Item::submenu( + .add_item(menu::Item::submenu( L10n::n("Submenú 1"), menu::Submenu::new() - .with_item(menu::Item::label(L10n::n("Opción 1"))) - .with_item(menu::Item::label(L10n::n("Opción 2"))), + .add_item(menu::Item::label(L10n::n("Opción 1"))) + .add_item(menu::Item::label(L10n::n("Opción 2"))), )) /* - .with_item(menu::Item::separator()) */ - .with_item(menu::Item::submenu( + .add_item(menu::Item::separator()) */ + .add_item(menu::Item::submenu( L10n::n("Submenú 2"), menu::Submenu::new() - .with_item(menu::Item::label(L10n::n("Opción 1"))) - .with_item(menu::Item::label(L10n::n("Opción 2"))), + .add_item(menu::Item::label(L10n::n("Opción 1"))) + .add_item(menu::Item::label(L10n::n("Opción 2"))), )) - .with_item(menu::Item::label(L10n::n("Opción 4"))); + .add_item(menu::Item::label(L10n::n("Opción 4"))); Page::new(request) //.with_context(ContextOp::Theme("Bootsier")) @@ -156,11 +156,11 @@ pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalE .with_in( "content", flex::Container::new() - .with_item(flex::Item::new().with_component(Html::with(html! { + .add_item(flex::Item::new().add_component(Html::with(html! { p { "Columna 1"} }))) - .with_item(flex::Item::new().with_component(top_menu)) - .with_item(flex::Item::new().with_component(Html::with(html! { + .add_item(flex::Item::new().add_component(top_menu)) + .add_item(flex::Item::new().add_component(Html::with(html! { p { "Columna 3"} }))), ) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 860fb307..e15845e3 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -108,18 +108,21 @@ impl ThemeTrait for Bootsier { div class="media-body" { h1 class="display-4" { ("RESOURCE NOT FOUND") } p class="lead" { - (L10n::t("e404-description", &LOCALES_BOOTSIER).prepare(cx)) + (L10n::t("e404-description", &LOCALES_BOOTSIER) + .escaped(cx.langid())) } hr class="my-4"; p { - (L10n::t("e404-description", &LOCALES_BOOTSIER).prepare(cx)) + (L10n::t("e404-description", &LOCALES_BOOTSIER) + .escaped(cx.langid())) } a class="btn btn-primary btn-lg" href="/" role="button" { - (L10n::t("back-homepage", &LOCALES_BOOTSIER).prepare(cx)) + (L10n::t("back-homepage", &LOCALES_BOOTSIER) + .escaped(cx.langid())) } } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 901776a3..e6df9d28 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -43,19 +43,19 @@ async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { } fn hello_world() -> Wrapper { - Wrapper::header().with_id("hello-world").with_component( + Wrapper::header().with_id("hello-world").add_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::MD)) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "hello-col-text") .with_size(flex::ItemSize::Percent40) - .with_component( + .add_component( Heading::h1(L10n::t("page_title", &LOCALES_HOMEDEMO)) .with_display(HeadingDisplay::Medium), ) - .with_component( - Paragraph::with(L10n::e("hello_intro", &LOCALES_HOMEDEMO).with_arg( + .add_component( + Paragraph::translated(L10n::t("hello_intro", &LOCALES_HOMEDEMO).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -64,8 +64,8 @@ fn hello_world() -> Wrapper { )) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with( - L10n::e("hello_powered", &LOCALES_HOMEDEMO).with_arg( + .add_component(Paragraph::translated( + L10n::t("hello_powered", &LOCALES_HOMEDEMO).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -73,7 +73,7 @@ fn hello_world() -> Wrapper { ), ), )) - .with_component( + .add_component( Anchor::button( "https://github.com/manuelcillero/pagetop", L10n::t("hello_code", &LOCALES_HOMEDEMO), @@ -82,17 +82,17 @@ fn hello_world() -> Wrapper { .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link"), ) - .with_component( + .add_component( Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) .with_left_icon(Icon::with("arrow-down-circle-fill")) .with_classes(ClassesOp::Add, "welcome-link"), ), ) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "hello-col-image") .with_size(flex::ItemSize::Percent60) - .with_component(Image::with("/homedemo/images/header.svg")), + .add_component(Image::with("/homedemo/images/header.svg")), ), ) } @@ -101,9 +101,9 @@ fn welcome() -> Wrapper { Wrapper::section() .with_id("welcome") .with_classes(ClassesOp::Add, "welcome-col-text") - .with_component(Heading::h2(L10n::t("welcome_page", &LOCALES_HOMEDEMO))) - .with_component( - Heading::h3(L10n::e("welcome_subtitle", &LOCALES_HOMEDEMO).with_arg( + .add_component(Heading::h2(L10n::t("welcome_page", &LOCALES_HOMEDEMO))) + .add_component( + Heading::h3(L10n::t("welcome_subtitle", &LOCALES_HOMEDEMO).with_arg( "app", format!( "<span class=\"app-name\">{}</span>", @@ -112,34 +112,40 @@ fn welcome() -> Wrapper { )) .with_display(HeadingDisplay::Subtitle), ) - .with_component( - Paragraph::with(L10n::t("welcome_text1", &LOCALES_HOMEDEMO)) + .add_component( + Paragraph::translated(L10n::t("welcome_text1", &LOCALES_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("welcome_text2", &LOCALES_HOMEDEMO))) + .add_component(Paragraph::translated(L10n::t( + "welcome_text2", + &LOCALES_HOMEDEMO, + ))) } fn about_pagetop() -> Wrapper { - Wrapper::new().with_id("pagetop").with_component( + Wrapper::new().with_id("pagetop").add_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::SM)) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "pagetop-col-image") .with_size(flex::ItemSize::Percent40) - .with_component(Image::with("/homedemo/images/about.svg")), + .add_component(Image::with("/homedemo/images/about.svg")), ) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "pagetop-col-text") - .with_component(Heading::h2(L10n::t("pagetop_title", &LOCALES_HOMEDEMO))) - .with_component( - Paragraph::with(L10n::t("pagetop_text1", &LOCALES_HOMEDEMO)) + .add_component(Heading::h2(L10n::t("pagetop_title", &LOCALES_HOMEDEMO))) + .add_component( + Paragraph::translated(L10n::t("pagetop_text1", &LOCALES_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t("pagetop_text2", &LOCALES_HOMEDEMO))) - .with_component(Paragraph::with( - L10n::e("pagetop_text3", &LOCALES_HOMEDEMO) + .add_component(Paragraph::translated(L10n::t( + "pagetop_text2", + &LOCALES_HOMEDEMO, + ))) + .add_component(Paragraph::translated( + L10n::t("pagetop_text3", &LOCALES_HOMEDEMO) .with_arg("href", "https://docs.rs/pagetop/latest/pagetop"), )), ), @@ -147,20 +153,20 @@ fn about_pagetop() -> Wrapper { } fn promo_pagetop() -> Wrapper { - Wrapper::new().with_id("promo").with_component( + Wrapper::new().with_id("promo").add_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::MD)) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "promo-col-text") .with_size(flex::ItemSize::Percent60) - .with_component(Heading::h2(L10n::t( + .add_component(Heading::h2(L10n::t( "pagetop_promo_title", &LOCALES_HOMEDEMO, ))) - .with_component( - Paragraph::with( - L10n::e("pagetop_promo_text1", &LOCALES_HOMEDEMO).with_arg( + .add_component( + Paragraph::translated( + L10n::t("pagetop_promo_text1", &LOCALES_HOMEDEMO).with_arg( "pagetop", format!( "<a href=\"{}\" target=\"_blank\">{}</a>", @@ -171,37 +177,37 @@ fn promo_pagetop() -> Wrapper { .with_display(ParagraphDisplay::Small), ), ) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "promo-col-image") .with_size(flex::ItemSize::Percent40) - .with_component(Image::with("/homedemo/images/pagetop.png")), + .add_component(Image::with("/homedemo/images/pagetop.png")), ), ) } fn reporting_issues() -> Wrapper { - Wrapper::new().with_id("reporting").with_component( + Wrapper::new().with_id("reporting").add_component( flex::Container::new() .with_direction(flex::Direction::Column(BreakPoint::MD)) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "reporting-col-image") - .with_component(Image::with("/homedemo/images/support.jpg")), + .add_component(Image::with("/homedemo/images/support.jpg")), ) - .with_item( + .add_item( flex::Item::new() .with_inner_classes(ClassesOp::Add, "reporting-col-text") .with_size(flex::ItemSize::Percent50) - .with_component(Heading::h2(L10n::t( + .add_component(Heading::h2(L10n::t( "report_problems_title", &LOCALES_HOMEDEMO, ))) - .with_component( - Paragraph::with(L10n::t("report_problems_text1", &LOCALES_HOMEDEMO)) + .add_component( + Paragraph::translated(L10n::t("report_problems_text1", &LOCALES_HOMEDEMO)) .with_display(ParagraphDisplay::Small), ) - .with_component(Paragraph::with(L10n::t( + .add_component(Paragraph::translated(L10n::t( "report_problems_text2", &LOCALES_HOMEDEMO, ))), diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 66a23e57..6e327aa8 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -42,7 +42,7 @@ async fn login(request: service::HttpRequest) -> ResultPage<Markup, FatalError> "content", Wrapper::new() .with_id("welcome") - .with_component(form_login()), + .add_component(form_login()), ) .render() } From edd1c5cdc22c87bad38cec685e404d823fefb7b3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 21 Oct 2023 23:23:10 +0200 Subject: [PATCH 563/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20OptionTranslate?= =?UTF-8?q?=20to=20OptionTranslated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/response/page.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index f2268c5b..47b674ca 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -2,9 +2,8 @@ use crate::base::action::page::{run_actions_after_prepare_body, run_actions_befo use crate::core::component::{ArcComponent, ComponentTrait}; use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; -use crate::html::{ - html, ClassesOp, Favicon, Markup, OptionClasses, OptionId, OptionTranslate, DOCTYPE, -}; +use crate::html::{html, Markup, DOCTYPE}; +use crate::html::{ClassesOp, Favicon, OptionClasses, OptionId, OptionTranslated}; use crate::locale::L10n; use crate::response::fatal_error::FatalError; use crate::{fn_builder, service}; @@ -15,8 +14,8 @@ pub use actix_web::Result as ResultPage; #[rustfmt::skip] pub struct Page { - title : OptionTranslate, - description : OptionTranslate, + title : OptionTranslated, + description : OptionTranslated, metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, favicon : Option<Favicon>, @@ -30,8 +29,8 @@ impl Page { #[rustfmt::skip] pub fn new(request: service::HttpRequest) -> Self { Page { - title : OptionTranslate::new(), - description : OptionTranslate::new(), + title : OptionTranslated::new(), + description : OptionTranslated::new(), metadata : Vec::new(), properties : Vec::new(), favicon : None, From 0bb12c33b4b43577e134edca87d0dd85512cad57 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 22 Oct 2023 10:46:02 +0200 Subject: [PATCH 564/853] =?UTF-8?q?=F0=9F=92=84=20Compatibility=20with=20m?= =?UTF-8?q?odern=20browsers=20is=20assumed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/static/base/css/menu.css | 105 ++++++------------------------- 1 file changed, 18 insertions(+), 87 deletions(-) diff --git a/pagetop/static/base/css/menu.css b/pagetop/static/base/css/menu.css index f5dcbd86..e573068b 100644 --- a/pagetop/static/base/css/menu.css +++ b/pagetop/static/base/css/menu.css @@ -16,7 +16,6 @@ .pt-menu__wrapper button { cursor: pointer; border: none; - outline: none; background: none; text-decoration: none; } @@ -43,10 +42,7 @@ } .pt-menu__nav li > a { border: none; - outline: none; - -webkit-transition: color 0.3s ease-in-out; - -o-transition: color 0.3s ease-in-out; - transition: color 0.3s ease-in-out; + transition: color 0.3s ease-in-out; } .pt-menu__nav li:hover > a { color: var(--pt-menu--color-highlight); @@ -68,11 +64,8 @@ z-index: 500; opacity: 0; visibility: hidden; - -webkit-box-shadow: 0 4px 6px -1px var(--pt-menu--color-border), 0 2px 4px -1px var(--pt-menu--color-shadow); - box-shadow: 0 4px 6px -1px var(--pt-menu--color-border), 0 2px 4px -1px var(--pt-menu--color-shadow); - -webkit-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; + box-shadow: 0 4px 6px -1px var(--pt-menu--color-border), 0 2px 4px -1px var(--pt-menu--color-shadow); + transition: all 0.5s ease-in-out; } .pt-menu__nav li.pt-menu__children:hover > .pt-menu__subs { @@ -105,17 +98,12 @@ .pt-menu__nav li .pt-menu__mega { left: 50%; - -webkit-transform: translateX(-50%); - -ms-transform: translateX(-50%); - transform: translateX(-50%); + transform: translateX(-50%); } .pt-menu__nav li .pt-menu__groups { - display: -webkit-box; - display: -ms-flexbox; display: flex; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; + flex-wrap: nowrap; } .pt-menu__header, @@ -135,8 +123,6 @@ border: none; outline: none; background: none; - display: -webkit-box; - display: -ms-flexbox; display: flex; flex-direction: column; justify-content: center; @@ -158,17 +144,11 @@ z-index: 1099; overflow: hidden; background: var(--pt-menu--color-bg); - -webkit-transform: translate(-100%); - -ms-transform: translate(-100%); - transform: translate(-100%); - -webkit-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; + transform: translate(-100%); + transition: all 0.5s ease-in-out; } .pt-menu__main .pt-menu__nav.active { - -webkit-transform: translate(0%); - -ms-transform: translate(0%); - transform: translate(0%); + transform: translate(0%); } .pt-menu__nav li { @@ -191,9 +171,7 @@ top: var(--pt-menu--line-padding); right: var(--pt-menu--line-padding); font-size: 1.25rem; - -webkit-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - transform: rotate(-90deg); + transform: rotate(-90deg); } .pt-menu__nav li .pt-menu__subs { @@ -211,11 +189,8 @@ opacity: 1; overflow-y: auto; visibility: visible; - -webkit-transform: translateX(0%); - -ms-transform: translateX(0%); - transform: translateX(0%); - -webkit-box-shadow: none; - box-shadow: none; + transform: translateX(0%); + box-shadow: none; } .pt-menu__nav li .pt-menu__subs.active { display: block; @@ -234,17 +209,9 @@ } .pt-menu__nav .pt-menu__header { - position: relative; - position: -webkit-sticky; position: sticky; - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; + align-items: center; justify-content: space-between; top: 0; height: var(--pt-menu--item-height); @@ -266,12 +233,8 @@ line-height: var(--pt-menu--item-height); color: var(--pt-color); cursor: pointer; - display: -webkit-box; - display: -ms-flexbox; display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + align-items: center; justify-content: center; } .pt-menu__nav .pt-menu__header .pt-menu__close { @@ -305,9 +268,7 @@ opacity: 0; visibility: hidden; background: rgba(0, 0, 0, 0.55); - -webkit-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; } .pt-menu__overlay.active { opacity: 1; @@ -317,54 +278,24 @@ /* ANIMATIONS */ -@-webkit-keyframes slideLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(100%); - transform: translateX(100%); - } - 100% { - opacity: 1; - -webkit-transform: translateX(0%); - transform: translateX(0%); - } -} - @keyframes slideLeft { 0% { opacity: 0; - -webkit-transform: translateX(100%); - transform: translateX(100%); + transform: translateX(100%); } 100% { opacity: 1; - -webkit-transform: translateX(0%); - transform: translateX(0%); - } -} - -@-webkit-keyframes slideRight { - 0% { - opacity: 1; - -webkit-transform: translateX(0%); - transform: translateX(0%); - } - 100% { - opacity: 0; - -webkit-transform: translateX(100%); - transform: translateX(100%); + transform: translateX(0%); } } @keyframes slideRight { 0% { opacity: 1; - -webkit-transform: translateX(0%); - transform: translateX(0%); + transform: translateX(0%); } 100% { opacity: 0; - -webkit-transform: translateX(100%); - transform: translateX(100%); + transform: translateX(100%); } } From d8f0c367de56c7c7f69b7561c67744d20fc1046b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 22 Oct 2023 10:49:22 +0200 Subject: [PATCH 565/853] =?UTF-8?q?=E2=99=BF=EF=B8=8F=20Apply=20modern=20f?= =?UTF-8?q?ocus-within=20for=20keyboard=20submenus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/static/base/css/menu.css | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pagetop/static/base/css/menu.css b/pagetop/static/base/css/menu.css index e573068b..18f64c72 100644 --- a/pagetop/static/base/css/menu.css +++ b/pagetop/static/base/css/menu.css @@ -44,7 +44,8 @@ border: none; transition: color 0.3s ease-in-out; } -.pt-menu__nav li:hover > a { +.pt-menu__nav li:hover > a, +.pt-menu__nav li > a:focus { color: var(--pt-menu--color-highlight); } .pt-menu__nav li > a > i.pt-menu__icon { @@ -68,7 +69,9 @@ transition: all 0.5s ease-in-out; } -.pt-menu__nav li.pt-menu__children:hover > .pt-menu__subs { +.pt-menu__nav li.pt-menu__children:hover > .pt-menu__subs, +.pt-menu__nav li.pt-menu__children > a:focus + .pt-menu__subs, +.pt-menu__nav li.pt-menu__children .pt-menu__subs:focus-within { margin-top: 0.4rem; opacity: 1; visibility: visible; From 350829c3c8e07862765011cacd4a20dac6f5d8f3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 22 Oct 2023 19:20:34 +0200 Subject: [PATCH 566/853] =?UTF-8?q?=E2=99=BF=EF=B8=8F=20Improve=20keyboard?= =?UTF-8?q?=20accessibility:=20content=20skip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/theme/definition.rs | 21 +++++++++---- pagetop/src/locale/en-US/theme.ftl | 2 ++ pagetop/src/locale/es-ES/theme.ftl | 2 ++ pagetop/src/response/page.rs | 14 ++++++++- pagetop/static/base/css/root.css | 44 ++++++++++++++++------------ pagetop/static/base/css/styles.css | 30 ++++++++++++++++++- 6 files changed, 86 insertions(+), 27 deletions(-) diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 9cba6852..c5b1be5a 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,8 +1,9 @@ use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; use crate::html::{html, Favicon, Markup}; +use crate::locale::L10n; use crate::response::page::Page; -use crate::{config, LOCALES_PAGETOP}; +use crate::{concat_string, config}; pub type ThemeRef = &'static dyn ThemeTrait; @@ -11,11 +12,11 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { #[rustfmt::skip] fn regions(&self) -> Vec<(&'static str, L10n)> { vec![ - ("header", L10n::t("header", &LOCALES_PAGETOP)), - ("pagetop", L10n::t("pagetop", &LOCALES_PAGETOP)), - ("content", L10n::t("content", &LOCALES_PAGETOP)), - ("sidebar", L10n::t("sidebar", &LOCALES_PAGETOP)), - ("footer", L10n::t("footer", &LOCALES_PAGETOP)), + ("header", L10n::l("header")), + ("pagetop", L10n::l("pagetop")), + ("content", L10n::l("content")), + ("sidebar", L10n::l("sidebar")), + ("footer", L10n::l("footer")), ] } @@ -28,8 +29,16 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { let content = page.prepare_region("content"); let sidebar = page.prepare_region("sidebar"); let footer = page.prepare_region("footer"); + + let skip_to = concat_string!("#", page.skip_to().get().unwrap_or("content".to_owned())); + html! { body class=[page.body_classes().get()] { + @if let Some(skip) = L10n::l("skip_to_content").using(page.context().langid()) { + div class="pt-body__skip" { + a href=(skip_to) { (skip) } + } + } div class="pt-body__wrapper" { div class="pt-body__regions" { (header.unwrap_or_default()) diff --git a/pagetop/src/locale/en-US/theme.ftl b/pagetop/src/locale/en-US/theme.ftl index a43e60ac..97076794 100644 --- a/pagetop/src/locale/en-US/theme.ftl +++ b/pagetop/src/locale/en-US/theme.ftl @@ -3,3 +3,5 @@ pagetop = Page Top content = Content sidebar = Sidebar footer = Footer + +skip_to_content = Skip to main content (Press Enter) diff --git a/pagetop/src/locale/es-ES/theme.ftl b/pagetop/src/locale/es-ES/theme.ftl index 75fe1bb3..202bd402 100644 --- a/pagetop/src/locale/es-ES/theme.ftl +++ b/pagetop/src/locale/es-ES/theme.ftl @@ -3,3 +3,5 @@ pagetop = Superior content = Contenido sidebar = Barra lateral footer = Pie + +skip_to_content = Ir al contenido principal (Pulsar Intro) diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 47b674ca..1ce43fdb 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -22,6 +22,7 @@ pub struct Page { context : Context, body_classes: OptionClasses, regions : ComponentsRegions, + skip_to : OptionId, template : String, } @@ -35,8 +36,9 @@ impl Page { properties : Vec::new(), favicon : None, context : Context::new(request), - body_classes: OptionClasses::new().with_value(ClassesOp::SetDefault, "body"), + body_classes: OptionClasses::new(), regions : ComponentsRegions::new(), + skip_to : OptionId::new(), template : "default".to_owned(), } } @@ -91,6 +93,12 @@ impl Page { self } + #[fn_builder] + pub fn alter_skip_to(&mut self, id: impl Into<String>) -> &mut Self { + self.skip_to.alter_value(id); + self + } + #[fn_builder] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); @@ -127,6 +135,10 @@ impl Page { &self.body_classes } + pub fn skip_to(&self) -> &OptionId { + &self.skip_to + } + pub fn template(&self) -> &str { self.template.as_str() } diff --git a/pagetop/static/base/css/root.css b/pagetop/static/base/css/root.css index 6375ccf8..2a5060bb 100644 --- a/pagetop/static/base/css/root.css +++ b/pagetop/static/base/css/root.css @@ -12,9 +12,7 @@ --pt-font-size-xxs: 0.75rem; --pt-font-weight: 400; --pt-line-height-base: 1.5; - --pt-color-bg: #fff; - --pt-color: #212529; - --pt-max-width: 80rem; + --pt-max-width: 90rem; /* --pt-color-rgb: 33,37,41; --pt-main--bg-rgb: 255,255,255; @@ -75,11 +73,11 @@ :root { /* --pt-gap-0-25: calc(0.25 * var(--pt-gap)); - --pt-gap-0-5: calc(0.5 * var(--pt-gap)); */ + --pt-gap-0-5: calc(0.5 * var(--pt-gap)); --pt-gap-0-75: calc(0.75 * var(--pt-gap)); -/* --pt-gap-1-5: calc(1.5 * var(--pt-gap)); +/* --pt-gap-2: calc(2 * var(--pt-gap)); --pt-gap-2-5: calc(2.5 * var(--pt-gap)); --pt-gap-3: calc(3 * var(--pt-gap)); @@ -92,19 +90,26 @@ --pt-gap-10: calc(10 * var(--pt-gap)); --pt-gap-11: calc(11 * var(--pt-gap)); --pt-gap-12: calc(12 * var(--pt-gap)); +*/ + + --pt-color--gray-hue: 201; + --pt-color--gray-saturation: 15%; + --pt-color--gray-5: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),5%); + --pt-color--gray-10: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),11%); + --pt-color--gray-20: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),20%); + --pt-color--gray-45: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),44%); + --pt-color--gray-60: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),57%); + --pt-color--gray-65: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),63%); + --pt-color--gray-70: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),72%); + --pt-color--gray-90: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),88%); + --pt-color--gray-95: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),93%); + --pt-color--gray-100: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),97%); + + --pt-color--white: #fff; + --pt-color--bg: var(--pt-color--white); + --pt-color: #212529; + /* - --color--gray-hue: 201; - --color--gray-saturation: 15%; - --color--gray-5: hsl(var(--color--gray-hue),var(--color--gray-saturation),5%); - --color--gray-10: hsl(var(--color--gray-hue),var(--color--gray-saturation),11%); - --color--gray-20: hsl(var(--color--gray-hue),var(--color--gray-saturation),20%); - --color--gray-45: hsl(var(--color--gray-hue),var(--color--gray-saturation),44%); - --color--gray-60: hsl(var(--color--gray-hue),var(--color--gray-saturation),57%); - --color--gray-65: hsl(var(--color--gray-hue),var(--color--gray-saturation),63%); - --color--gray-70: hsl(var(--color--gray-hue),var(--color--gray-saturation),72%); - --color--gray-90: hsl(var(--color--gray-hue),var(--color--gray-saturation),88%); - --color--gray-95: hsl(var(--color--gray-hue),var(--color--gray-saturation),93%); - --color--gray-100: hsl(var(--color--gray-hue),var(--color--gray-saturation),97%); --color--primary-hue: 202; --color--primary-saturation: 79%; --color--primary-lightness: 50; @@ -119,7 +124,8 @@ --color-text-primary-medium: var(--color--primary-40); --color-text-primary-loud: var(--color--primary-30); --color--black: #000; - --color--white: #fff; +*/ +/* --color--red: #e33f1e; --color--gold: #fdca40; --color--green: #3fa21c; @@ -129,7 +135,7 @@ --pt-border-radius: 0.1875rem; - --pt-menu--color-bg: #fafafa; + --pt-menu--color-bg: var(--pt-color--gray-100); --pt-menu--color-highlight: #e91e63; --pt-menu--color-border: rgba(0, 0, 0, 0.1); --pt-menu--color-shadow: rgba(0, 0, 0, 0.06); diff --git a/pagetop/static/base/css/styles.css b/pagetop/static/base/css/styles.css index 234b8b3c..165a9536 100644 --- a/pagetop/static/base/css/styles.css +++ b/pagetop/static/base/css/styles.css @@ -1,3 +1,7 @@ +html { + scroll-behavior: smooth; +} + body { margin: 0; font-family: var(--pt-font-family); @@ -5,12 +9,36 @@ body { font-weight: var(--pt-font-weight); line-height: var(--pt-line-height-base); color: var(--pt-color); - background-color: var(--pt-color-bg); + background-color: var(--pt-color--bg); -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; } +.pt-body__skip { + display: flex; + justify-content: center; +} +.pt-body__skip a { + display: block; + padding: var(--pt-gap-0-5) var(--pt-gap-1-5); + color: var(--pt-color--white); + background-color: var(--pt-color--gray-5); + text-decoration: none; + outline: 0; + position: absolute; + transform: translateY(-100%); + transition: all 0.3s ease-in-out; + z-index: 9999; +} +.pt-body__skip a:after { + content: "\0020 ➔"; +} +.pt-body__skip a:focus { + transform: translateY(0%); +} + .pt-body__wrapper { + width: 100%; max-width: var(--pt-max-width); margin: 0 auto; } From 916e5d33002c0f3702745d28e3dbdfc1de9d82e8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 23 Oct 2023 18:48:08 +0200 Subject: [PATCH 567/853] =?UTF-8?q?=F0=9F=A5=85=20Add=20safe=20results=20h?= =?UTF-8?q?andling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/lib.rs | 3 ++ pagetop/src/locale.rs | 62 +++++++++++++++++++++++------- pagetop/src/locale/en-US/trace.ftl | 4 ++ pagetop/src/locale/es-ES/trace.ftl | 4 ++ pagetop/src/prelude.rs | 3 ++ pagetop/src/result.rs | 45 ++++++++++++++++++++++ 6 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 pagetop/src/locale/en-US/trace.ftl create mode 100644 pagetop/src/locale/es-ES/trace.ftl create mode 100644 pagetop/src/result.rs diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index f3bdb78e..9c4effa7 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -129,6 +129,9 @@ static_locales!(LOCALES_PAGETOP); // PUBLIC API. // ************************************************************************************************* +// Handling safe results. +pub mod result; + // Functions and macro helpers. pub mod util; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 1673f976..d346dd01 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -88,16 +88,21 @@ //! ``` use crate::html::{Markup, PreEscaped}; -use crate::{config, kv, trace, LazyStatic, LOCALES_PAGETOP}; +use crate::result::{SafeResult, TraceErr}; +use crate::{config, kv, LazyStatic, LOCALES_PAGETOP}; pub use fluent_templates; +pub use unic_langid::LanguageIdentifier; pub(crate) use fluent_templates::Loader; pub(crate) use fluent_templates::StaticLoader as Locales; -pub(crate) use unic_langid::{langid, LanguageIdentifier}; + +use unic_langid::langid; use std::collections::HashMap; +const LANGUAGE_SET_FAILURE: &str = "language_set_failure"; + static LANGUAGES: LazyStatic<HashMap<String, (LanguageIdentifier, &str)>> = LazyStatic::new(|| { kv![ "en" => (langid!("en-US"), "English"), @@ -114,19 +119,22 @@ static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| lang /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// global para la aplicación a partir de `SETTINGS.app.language`. pub(crate) static LANGID: LazyStatic<&LanguageIdentifier> = - LazyStatic::new(|| langid_for(config::SETTINGS.app.language.as_str())); + LazyStatic::new(|| langid_for(config::SETTINGS.app.language.as_str()).unwrap_or_fallback()); -pub fn langid_for(language: &str) -> &LanguageIdentifier { - match LANGUAGES.get(language) { - Some((langid, _)) => langid, - _ => { - trace::warn!( - "{} \"{}\"! {}", - "Failed to set language. Unicode Language Identifier", - config::SETTINGS.app.language, - "is not accepted. Using \"en-US\", check the settings file", - ); - &FALLBACK_LANGID +pub fn langid_for(language: impl Into<String>) -> SafeResult<&'static LanguageIdentifier> { + let language = language.into(); + match LANGUAGES.get(language.as_str()) { + Some((langid, _)) => SafeResult::Ok(langid), + None => { + if language.is_empty() { + SafeResult::Ok(&FALLBACK_LANGID) + } else { + SafeResult::Err(TraceErr::warn( + L10n::l(LANGUAGE_SET_FAILURE) + .with_arg("language", config::SETTINGS.app.language.as_str()), + &FALLBACK_LANGID, + )) + } } } } @@ -230,6 +238,32 @@ impl L10n { } } + pub(crate) fn message(&self) -> String { + match &self.op { + L10nOp::None => "".to_owned(), + L10nOp::Text(text) => text.to_owned(), + L10nOp::Translate(key) => match self.locales { + Some(locales) => locales + .lookup_with_args( + match key.as_str() { + LANGUAGE_SET_FAILURE => &FALLBACK_LANGID, + _ => &LANGID, + }, + key, + &self + .args + .iter() + .fold(HashMap::new(), |mut args, (key, value)| { + args.insert(key.to_string(), value.to_owned().into()); + args + }), + ) + .unwrap_or(key.to_owned()), + None => key.to_owned(), + }, + } + } + pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { PreEscaped(self.using(langid).unwrap_or_default()) } diff --git a/pagetop/src/locale/en-US/trace.ftl b/pagetop/src/locale/en-US/trace.ftl new file mode 100644 index 00000000..4e7a5abb --- /dev/null +++ b/pagetop/src/locale/en-US/trace.ftl @@ -0,0 +1,4 @@ +# DEBUG. + +# ERRORS. +language_set_failure = Failed to set language. Unicode Language Identifier "{$language}" is not accepted. Using "en-US", check the settings file diff --git a/pagetop/src/locale/es-ES/trace.ftl b/pagetop/src/locale/es-ES/trace.ftl new file mode 100644 index 00000000..0b7ad6a7 --- /dev/null +++ b/pagetop/src/locale/es-ES/trace.ftl @@ -0,0 +1,4 @@ +# DEBUG. + +# ERRORS. +language_set_failure = Error al establecer idioma. El Identificador de Lenguaje Unicode "{$language}" no es válido. Se usará "en-US". Comprobar archivo de configuración diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 9e363bf8..ed2d642c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -6,6 +6,9 @@ pub use crate::{concat_string, fn_builder, main, paste, test}; // Global. pub use crate::{Handle, HashMapResources, LazyStatic, ResultExt, Weight}; +// Handling safe results. +pub use crate::result::{SafeResult, TraceErr}; + // Functions and macro helpers. pub use crate::util; pub use crate::{kv, new_handle}; diff --git a/pagetop/src/result.rs b/pagetop/src/result.rs new file mode 100644 index 00000000..9b57df8d --- /dev/null +++ b/pagetop/src/result.rs @@ -0,0 +1,45 @@ +//! Handling safe results. + +use crate::locale::L10n; +use crate::trace; + +pub struct TraceErr<T> { + message: String, + fallback: T, +} + +impl<T> TraceErr<T> { + pub fn warn(trace: L10n, fallback: T) -> Self { + let message = trace.message(); + trace::warn!(message); + TraceErr { message, fallback } + } + + pub fn error(trace: L10n, fallback: T) -> Self { + let message = trace.message(); + trace::error!(message); + TraceErr { message, fallback } + } + + pub fn message(self) -> String { + self.message + } + + pub fn fallback(self) -> T { + self.fallback + } +} + +pub enum SafeResult<T> { + Ok(T), + Err(TraceErr<T>), +} + +impl<T> SafeResult<T> { + pub fn unwrap_or_fallback(self) -> T { + match self { + SafeResult::Ok(result) => result, + SafeResult::Err(trace) => trace.fallback(), + } + } +} From d7762a10fae9d9fc0966ee12fdbf16f59d35800e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 26 Oct 2023 08:50:18 +0200 Subject: [PATCH 568/853] =?UTF-8?q?=F0=9F=9A=A7=20=20Prepare=20code=20for?= =?UTF-8?q?=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 86 +++++++++++-------- pagetop/src/service.rs | 10 ++- pagetop/tests/main.rs | 2 + pagetop/tests/server/health_check.rs | 20 +++++ .../server.rs => pagetop/tests/server/mod.rs | 0 tests/Cargo.toml | 17 ---- tests/src/main.rs | 1 - tests/src/server/health_check.rs | 15 ---- 8 files changed, 80 insertions(+), 71 deletions(-) create mode 100644 pagetop/tests/main.rs create mode 100644 pagetop/tests/server/health_check.rs rename tests/src/server.rs => pagetop/tests/server/mod.rs (100%) delete mode 100644 tests/Cargo.toml delete mode 100644 tests/src/main.rs delete mode 100644 tests/src/server/health_check.rs diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 762b5ae7..74fa2ccc 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -14,21 +14,17 @@ use crate::db; use actix_session::config::{BrowserSession, PersistentSession, SessionLifecycle}; use actix_session::storage::CookieSessionStore; use actix_session::SessionMiddleware; -use actix_web::cookie::{time::Duration, Key}; -use actix_web::dev::Server; - -use std::io::Error; use substring::Substring; -pub struct Application { - server: Server, -} +use std::io::Error; + +pub struct Application; impl Application { pub fn prepare(app: ModuleRef) -> Result<Self, Error> { - // Rótulo de presentación. - print_on_startup(); + // On startup. + show_banner(); // Inicia registro de trazas y eventos. LazyStatic::force(&trace::TRACING); @@ -53,46 +49,74 @@ impl Application { // Ejecuta actualizaciones pendientes de la base de datos. module::all::run_migrations(); + Ok(Self) + } + + pub fn run(self) -> Result<service::Server, Error> { + // Generate cookie key. + let secret_key = service::cookie::Key::generate(); + // Prepara el servidor web. - let secret_key = get_secret_key(); - let server = service::HttpServer::new(move || { - service::App::new() + Ok(service::HttpServer::new(move || { + service_app() .wrap(tracing_actix_web::TracingLogger::default()) .wrap( SessionMiddleware::builder(CookieSessionStore::default(), secret_key.clone()) .session_lifecycle(match config::SETTINGS.server.session_lifetime { 0 => SessionLifecycle::BrowserSession(BrowserSession::default()), _ => SessionLifecycle::PersistentSession( - PersistentSession::default().session_ttl(Duration::seconds( - config::SETTINGS.server.session_lifetime, - )), + PersistentSession::default().session_ttl( + service::cookie::time::Duration::seconds( + config::SETTINGS.server.session_lifetime, + ), + ), ), }) .build(), ) - .configure(module::all::configure_services) - .default_service(service::web::route().to(service_not_found)) }) .bind(format!( "{}:{}", &config::SETTINGS.server.bind_address, &config::SETTINGS.server.bind_port ))? - .run(); - - Ok(Self { server }) + .run()) } - pub fn run(self) -> Result<Server, Error> { - Ok(self.server) - } - - pub fn server(self) -> Server { - self.server + pub fn test( + self, + ) -> service::App< + impl service::Factory< + service::Request, + Config = (), + Response = service::Response<service::BoxBody>, + Error = service::Error, + InitError = (), + >, + > { + service_app() } } -fn print_on_startup() { +fn service_app() -> service::App< + impl service::Factory< + service::Request, + Config = (), + Response = service::Response<service::BoxBody>, + Error = service::Error, + InitError = (), + >, +> { + service::App::new() + .configure(module::all::configure_services) + .default_service(service::web::route().to(service_not_found)) +} + +async fn service_not_found(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { + Err(FatalError::NotFound(request)) +} + +fn show_banner() { if config::SETTINGS.app.startup_banner.to_lowercase() != "off" { // Application name. let mut app_name = config::SETTINGS.app.name.to_string(); @@ -121,11 +145,3 @@ fn print_on_startup() { ); } } - -fn get_secret_key() -> Key { - Key::generate() -} - -async fn service_not_found(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { - Err(FatalError::NotFound(request)) -} diff --git a/pagetop/src/service.rs b/pagetop/src/service.rs index f6a09c29..9e2bf551 100644 --- a/pagetop/src/service.rs +++ b/pagetop/src/service.rs @@ -1,9 +1,13 @@ //! Tipos y funciones para operar con el servidor web ([actix-web](https://docs.rs/actix-web)). pub use actix_session::Session; -pub use actix_web::{ - cookie, get, http, rt, web, App, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder, -}; +pub use actix_web::body::BoxBody; +pub use actix_web::dev::Server; +pub use actix_web::dev::ServiceFactory as Factory; +pub use actix_web::dev::ServiceRequest as Request; +pub use actix_web::dev::ServiceResponse as Response; +pub use actix_web::{cookie, get, http, rt, test, web}; +pub use actix_web::{App, Error, HttpMessage, HttpRequest, HttpResponse, HttpServer, Responder}; pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; diff --git a/pagetop/tests/main.rs b/pagetop/tests/main.rs new file mode 100644 index 00000000..b93d337f --- /dev/null +++ b/pagetop/tests/main.rs @@ -0,0 +1,2 @@ +#[cfg(test)] +mod server; diff --git a/pagetop/tests/server/health_check.rs b/pagetop/tests/server/health_check.rs new file mode 100644 index 00000000..db08e31e --- /dev/null +++ b/pagetop/tests/server/health_check.rs @@ -0,0 +1,20 @@ +use pagetop::prelude::*; + +new_handle!(MODULE_TEST_SERVER_HEALTH_CHECK); + +struct HealthCheck; + +impl ModuleTrait for HealthCheck { + fn handle(&self) -> Handle { + MODULE_TEST_SERVER_HEALTH_CHECK + } +} + +#[pagetop::test] +async fn health_check_works() { + let app = service::test::init_service(Application::prepare(&HealthCheck).unwrap().test()).await; + let req = service::test::TestRequest::get().uri("/").to_request(); + let _resp = service::test::call_service(&app, req).await; + +// assert_eq!("OK", "OK"); +} diff --git a/tests/src/server.rs b/pagetop/tests/server/mod.rs similarity index 100% rename from tests/src/server.rs rename to pagetop/tests/server/mod.rs diff --git a/tests/Cargo.toml b/tests/Cargo.toml deleted file mode 100644 index cf54f760..00000000 --- a/tests/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "tests" -version = "0.0.1" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - Tests for PageTop.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -pagetop = { version = "0.0", path = "../pagetop", features = ["mysql"], default-features = false } diff --git a/tests/src/main.rs b/tests/src/main.rs deleted file mode 100644 index df4adf9f..00000000 --- a/tests/src/main.rs +++ /dev/null @@ -1 +0,0 @@ -mod server; diff --git a/tests/src/server/health_check.rs b/tests/src/server/health_check.rs deleted file mode 100644 index 0898211a..00000000 --- a/tests/src/server/health_check.rs +++ /dev/null @@ -1,15 +0,0 @@ -use pagetop::prelude::*; - -struct HealthCheck; - -impl ModuleTrait for HealthCheck {} - -async fn spawn_app() { - let server = Application::prepare(&HealthCheck).unwrap().server(); - let _ = actix_web::rt::spawn(server); -} - -#[actix_web::test] -async fn health_check_works() { - spawn_app(); -} From 46ccbc10ebe57bfa41ef714bc82f976d30164020 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 26 Oct 2023 13:25:17 +0200 Subject: [PATCH 569/853] =?UTF-8?q?=F0=9F=9A=A7=20Prevent=20database=20err?= =?UTF-8?q?ors=20in=20test=20cases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m20220312_000001_create_table_role.rs | 1 + pagetop/src/core/module/all.rs | 53 ++--- pagetop/src/db.rs | 197 +++++++++++------- pagetop/src/locale/en-US/trace.ftl | 4 + pagetop/src/locale/es-ES/trace.ftl | 6 +- pagetop/src/result.rs | 36 +++- pagetop/tests/server/health_check.rs | 2 +- 7 files changed, 194 insertions(+), 105 deletions(-) diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index f1fa802c..d051b0f1 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -60,6 +60,7 @@ impl MigrationTrait for Migration { .values_panic(vec!["administrator".into(), "3".into()]), ) .await + .unwrap_or_error(|e| DbErr::Custom(e.message())) .map(|_| ()) } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 4e06deca..112126db 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,7 +1,8 @@ use crate::core::action::add_action; use crate::core::module::ModuleRef; use crate::core::theme::all::THEMES; -use crate::{service, trace, LazyStatic}; +use crate::locale::L10n; +use crate::{service, trace, LazyStatic, ResultExt}; #[cfg(feature = "database")] use crate::db::*; @@ -109,35 +110,37 @@ pub fn init_modules() { #[cfg(feature = "database")] pub fn run_migrations() { - run_now({ - struct Migrator; - impl MigratorTrait for Migrator { - fn migrations() -> Vec<MigrationItem> { - let mut migrations = vec![]; - for m in ENABLED_MODULES.read().unwrap().iter() { - migrations.append(&mut m.migrations()); + if let Some(dbconn) = &*DBCONN { + run_now({ + struct Migrator; + impl MigratorTrait for Migrator { + fn migrations() -> Vec<MigrationItem> { + let mut migrations = vec![]; + for m in ENABLED_MODULES.read().unwrap().iter() { + migrations.append(&mut m.migrations()); + } + migrations } - migrations } - } - Migrator::up(SchemaManagerConnection::Connection(&DBCONN), None) - }) - .unwrap(); + Migrator::up(SchemaManagerConnection::Connection(dbconn), None) + }) + .expect_or_log(L10n::l("db_migration_fail").message().as_str()); - run_now({ - struct Migrator; - impl MigratorTrait for Migrator { - fn migrations() -> Vec<MigrationItem> { - let mut migrations = vec![]; - for m in DROPPED_MODULES.read().unwrap().iter() { - migrations.append(&mut m.migrations()); + run_now({ + struct Migrator; + impl MigratorTrait for Migrator { + fn migrations() -> Vec<MigrationItem> { + let mut migrations = vec![]; + for m in DROPPED_MODULES.read().unwrap().iter() { + migrations.append(&mut m.migrations()); + } + migrations } - migrations } - } - Migrator::down(SchemaManagerConnection::Connection(&DBCONN), None) - }) - .unwrap(); + Migrator::down(SchemaManagerConnection::Connection(dbconn), None) + }) + .expect_or_log(L10n::l("db_migration_fail").message().as_str()); + } } // CONFIGURE SERVICES ****************************************************************************** diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 1e5d7fcf..29e1f7fc 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,5 +1,7 @@ //! Acceso unificado y normalizado a base de datos. +use crate::locale::L10n; +use crate::result::{SafeResult, TraceErr}; use crate::{config, trace, LazyStatic, ResultExt}; pub use url::Url as DbUri; @@ -10,97 +12,140 @@ use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statem pub(crate) use futures::executor::block_on as run_now; -pub(crate) static DBCONN: LazyStatic<DbConn> = LazyStatic::new(|| { - trace::info!( - "Connecting to database \"{}\" using a pool of {} connections", - &config::SETTINGS.database.db_name, - &config::SETTINGS.database.max_pool_size - ); +pub(crate) static DBCONN: LazyStatic<Option<DbConn>> = LazyStatic::new(|| { + if !config::SETTINGS.database.db_name.trim().is_empty() { + trace::info!( + "Connecting to database \"{}\" using a pool of {} connections", + &config::SETTINGS.database.db_name, + &config::SETTINGS.database.max_pool_size + ); - let db_uri = match config::SETTINGS.database.db_type.as_str() { - "mysql" | "postgres" => { - let mut tmp_uri = DbUri::parse( + let db_uri = match config::SETTINGS.database.db_type.as_str() { + "mysql" | "postgres" => { + let mut tmp_uri = DbUri::parse( + format!( + "{}://{}/{}", + &config::SETTINGS.database.db_type, + &config::SETTINGS.database.db_host, + &config::SETTINGS.database.db_name + ) + .as_str(), + ) + .unwrap(); + tmp_uri + .set_username(config::SETTINGS.database.db_user.as_str()) + .unwrap(); + // https://github.com/launchbadge/sqlx/issues/1624 + tmp_uri + .set_password(Some(config::SETTINGS.database.db_pass.as_str())) + .unwrap(); + if config::SETTINGS.database.db_port != 0 { + tmp_uri + .set_port(Some(config::SETTINGS.database.db_port)) + .unwrap(); + } + tmp_uri + } + "sqlite" => DbUri::parse( format!( - "{}://{}/{}", + "{}://{}", &config::SETTINGS.database.db_type, - &config::SETTINGS.database.db_host, &config::SETTINGS.database.db_name ) .as_str(), ) - .unwrap(); - tmp_uri - .set_username(config::SETTINGS.database.db_user.as_str()) - .unwrap(); - // https://github.com/launchbadge/sqlx/issues/1624 - tmp_uri - .set_password(Some(config::SETTINGS.database.db_pass.as_str())) - .unwrap(); - if config::SETTINGS.database.db_port != 0 { - tmp_uri - .set_port(Some(config::SETTINGS.database.db_port)) - .unwrap(); + .unwrap(), + _ => { + trace::error!( + "Unrecognized database type \"{}\"", + &config::SETTINGS.database.db_type + ); + DbUri::parse("").unwrap() } - tmp_uri - } - "sqlite" => DbUri::parse( - format!( - "{}://{}", - &config::SETTINGS.database.db_type, - &config::SETTINGS.database.db_name - ) - .as_str(), - ) - .unwrap(), - _ => { - trace::error!( - "Unrecognized database type \"{}\"", - &config::SETTINGS.database.db_type - ); - DbUri::parse("").unwrap() - } - }; + }; - run_now(Database::connect::<ConnectOptions>({ - let mut db_opt = ConnectOptions::new(db_uri.to_string()); - db_opt.max_connections(config::SETTINGS.database.max_pool_size); - db_opt - })) - .expect_or_log("Failed to connect to database") + Some( + run_now(Database::connect::<ConnectOptions>({ + let mut db_opt = ConnectOptions::new(db_uri.to_string()); + db_opt.max_connections(config::SETTINGS.database.max_pool_size); + db_opt + })) + .expect_or_log(L10n::l("db_connection_fail").message().as_str()), + ) + } else { + None + } }); -static DBBACKEND: LazyStatic<DatabaseBackend> = LazyStatic::new(|| DBCONN.get_database_backend()); - -pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { - DBCONN - .query_all(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await +pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> SafeResult<Option<Vec<QueryResult>>> { + match &*DBCONN { + Some(dbconn) => { + let dbbackend = dbconn.get_database_backend(); + match dbconn + .query_all(Statement::from_string( + dbbackend, + match dbbackend { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await + { + Ok(result) => SafeResult::Ok(Some(result)), + Err(e) => SafeResult::Err(TraceErr::error(L10n::n(e.to_string()), None)), + } + } + None => SafeResult::Err(TraceErr::trace( + L10n::l("db_connection_not_initialized"), + None, + )), + } } -pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { - DBCONN - .query_one(Statement::from_string( - *DBBACKEND, - match *DBBACKEND { - DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), - DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), - DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), - }, - )) - .await +pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> SafeResult<Option<QueryResult>> { + match &*DBCONN { + Some(dbconn) => { + let dbbackend = dbconn.get_database_backend(); + match dbconn + .query_one(Statement::from_string( + dbbackend, + match dbbackend { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + }, + )) + .await + { + Ok(result) => SafeResult::Ok(result), + Err(e) => SafeResult::Err(TraceErr::error(L10n::n(e.to_string()), None)), + } + } + None => SafeResult::Err(TraceErr::trace( + L10n::l("db_connection_not_initialized"), + None, + )), + } } -pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { - DBCONN - .execute(Statement::from_string(*DBBACKEND, stmt)) - .await +pub async fn exec_raw(stmt: String) -> SafeResult<Option<ExecResult>> { + match &*DBCONN { + Some(dbconn) => { + let dbbackend = dbconn.get_database_backend(); + match dbconn + .execute(Statement::from_string(dbbackend, stmt)) + .await + { + Ok(result) => SafeResult::Ok(Some(result)), + Err(e) => SafeResult::Err(TraceErr::error(L10n::n(e.to_string()), None)), + } + } + None => SafeResult::Err(TraceErr::trace( + L10n::l("db_connection_not_initialized"), + None, + )), + } } // El siguiente módulo migration es una versión simplificada del módulo sea_orm_migration (v0.11.3) diff --git a/pagetop/src/locale/en-US/trace.ftl b/pagetop/src/locale/en-US/trace.ftl index 4e7a5abb..a5f93d39 100644 --- a/pagetop/src/locale/en-US/trace.ftl +++ b/pagetop/src/locale/en-US/trace.ftl @@ -2,3 +2,7 @@ # ERRORS. language_set_failure = Failed to set language. Unicode Language Identifier "{$language}" is not accepted. Using "en-US", check the settings file + +db_connection_fail = Failed to connect to database +db_connection_not_initialized = Database connection not initialized +db_migration_fail = Database update failed diff --git a/pagetop/src/locale/es-ES/trace.ftl b/pagetop/src/locale/es-ES/trace.ftl index 0b7ad6a7..18598a44 100644 --- a/pagetop/src/locale/es-ES/trace.ftl +++ b/pagetop/src/locale/es-ES/trace.ftl @@ -1,4 +1,8 @@ # DEBUG. # ERRORS. -language_set_failure = Error al establecer idioma. El Identificador de Lenguaje Unicode "{$language}" no es válido. Se usará "en-US". Comprobar archivo de configuración +language_set_failure = Fallo al asignar idioma. El Identificador de Lenguaje Unicode "{$language}" no es válido. Se usará "en-US". Comprobar archivo de configuración + +db_connection_fail = Fallo al conectar con la base de datos +db_connection_not_initialized = Conexión a la base de datos no inicializada +db_migration_fail = Fallo en la actualización de la base de datos diff --git a/pagetop/src/result.rs b/pagetop/src/result.rs index 9b57df8d..bcff5388 100644 --- a/pagetop/src/result.rs +++ b/pagetop/src/result.rs @@ -9,6 +9,24 @@ pub struct TraceErr<T> { } impl<T> TraceErr<T> { + pub fn trace(trace: L10n, fallback: T) -> Self { + let message = trace.message(); + trace::trace!(message); + TraceErr { message, fallback } + } + + pub fn debug(trace: L10n, fallback: T) -> Self { + let message = trace.message(); + trace::debug!(message); + TraceErr { message, fallback } + } + + pub fn info(trace: L10n, fallback: T) -> Self { + let message = trace.message(); + trace::info!(message); + TraceErr { message, fallback } + } + pub fn warn(trace: L10n, fallback: T) -> Self { let message = trace.message(); trace::warn!(message); @@ -21,6 +39,8 @@ impl<T> TraceErr<T> { TraceErr { message, fallback } } + // TraceErr GETTERS. + pub fn message(self) -> String { self.message } @@ -36,10 +56,22 @@ pub enum SafeResult<T> { } impl<T> SafeResult<T> { + #[inline] + pub fn unwrap_or_error<F, E>(self, f: F) -> Result<T, E> + where + F: FnOnce(TraceErr<T>) -> E, + { + match self { + SafeResult::Ok(r) => Ok(r), + SafeResult::Err(e) => Err(f(e)), + } + } + + #[inline] pub fn unwrap_or_fallback(self) -> T { match self { - SafeResult::Ok(result) => result, - SafeResult::Err(trace) => trace.fallback(), + SafeResult::Ok(r) => r, + SafeResult::Err(e) => e.fallback(), } } } diff --git a/pagetop/tests/server/health_check.rs b/pagetop/tests/server/health_check.rs index db08e31e..eec9c11b 100644 --- a/pagetop/tests/server/health_check.rs +++ b/pagetop/tests/server/health_check.rs @@ -16,5 +16,5 @@ async fn health_check_works() { let req = service::test::TestRequest::get().uri("/").to_request(); let _resp = service::test::call_service(&app, req).await; -// assert_eq!("OK", "OK"); + // assert_eq!("OK", "OK"); } From ce3e0257bf33250e9328391f0952fbbf0a43e6a8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 26 Oct 2023 15:12:24 +0200 Subject: [PATCH 570/853] =?UTF-8?q?=E2=8F=AA=20Rever=20safe=20results=20ha?= =?UTF-8?q?ndling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m20220312_000001_create_table_role.rs | 1 - pagetop/src/core/module/all.rs | 4 +- pagetop/src/db.rs | 49 ++++-------- pagetop/src/lib.rs | 3 - pagetop/src/locale.rs | 64 +++++++++++---- pagetop/src/prelude.rs | 3 - pagetop/src/result.rs | 77 ------------------- 7 files changed, 66 insertions(+), 135 deletions(-) delete mode 100644 pagetop/src/result.rs diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index d051b0f1..f1fa802c 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -60,7 +60,6 @@ impl MigrationTrait for Migration { .values_panic(vec!["administrator".into(), "3".into()]), ) .await - .unwrap_or_error(|e| DbErr::Custom(e.message())) .map(|_| ()) } diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 112126db..5a0c14e3 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -124,7 +124,7 @@ pub fn run_migrations() { } Migrator::up(SchemaManagerConnection::Connection(dbconn), None) }) - .expect_or_log(L10n::l("db_migration_fail").message().as_str()); + .expect_or_log(L10n::l("db_migration_fail").error().as_str()); run_now({ struct Migrator; @@ -139,7 +139,7 @@ pub fn run_migrations() { } Migrator::down(SchemaManagerConnection::Connection(dbconn), None) }) - .expect_or_log(L10n::l("db_migration_fail").message().as_str()); + .expect_or_log(L10n::l("db_migration_fail").error().as_str()); } } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 29e1f7fc..f70f9c17 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,11 +1,11 @@ //! Acceso unificado y normalizado a base de datos. use crate::locale::L10n; -use crate::result::{SafeResult, TraceErr}; use crate::{config, trace, LazyStatic, ResultExt}; pub use url::Url as DbUri; +pub use sea_orm::error::{DbErr, RuntimeErr}; pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statement}; @@ -70,18 +70,18 @@ pub(crate) static DBCONN: LazyStatic<Option<DbConn>> = LazyStatic::new(|| { db_opt.max_connections(config::SETTINGS.database.max_pool_size); db_opt })) - .expect_or_log(L10n::l("db_connection_fail").message().as_str()), + .expect_or_log(L10n::l("db_connection_fail").to_string().as_str()), ) } else { None } }); -pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> SafeResult<Option<Vec<QueryResult>>> { +pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryResult>, DbErr> { match &*DBCONN { Some(dbconn) => { let dbbackend = dbconn.get_database_backend(); - match dbconn + dbconn .query_all(Statement::from_string( dbbackend, match dbbackend { @@ -91,23 +91,18 @@ pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> SafeResult<Option<V }, )) .await - { - Ok(result) => SafeResult::Ok(Some(result)), - Err(e) => SafeResult::Err(TraceErr::error(L10n::n(e.to_string()), None)), - } } - None => SafeResult::Err(TraceErr::trace( - L10n::l("db_connection_not_initialized"), - None, - )), + None => Err(DbErr::Conn(RuntimeErr::Internal( + L10n::l("db_connection_not_initialized").trace(), + ))), } } -pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> SafeResult<Option<QueryResult>> { +pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryResult>, DbErr> { match &*DBCONN { Some(dbconn) => { let dbbackend = dbconn.get_database_backend(); - match dbconn + dbconn .query_one(Statement::from_string( dbbackend, match dbbackend { @@ -117,34 +112,24 @@ pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> SafeResult<Option<Qu }, )) .await - { - Ok(result) => SafeResult::Ok(result), - Err(e) => SafeResult::Err(TraceErr::error(L10n::n(e.to_string()), None)), - } } - None => SafeResult::Err(TraceErr::trace( - L10n::l("db_connection_not_initialized"), - None, - )), + None => Err(DbErr::Conn(RuntimeErr::Internal( + L10n::l("db_connection_not_initialized").trace(), + ))), } } -pub async fn exec_raw(stmt: String) -> SafeResult<Option<ExecResult>> { +pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { match &*DBCONN { Some(dbconn) => { let dbbackend = dbconn.get_database_backend(); - match dbconn + dbconn .execute(Statement::from_string(dbbackend, stmt)) .await - { - Ok(result) => SafeResult::Ok(Some(result)), - Err(e) => SafeResult::Err(TraceErr::error(L10n::n(e.to_string()), None)), - } } - None => SafeResult::Err(TraceErr::trace( - L10n::l("db_connection_not_initialized"), - None, - )), + None => Err(DbErr::Conn(RuntimeErr::Internal( + L10n::l("db_connection_not_initialized").trace(), + ))), } } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 9c4effa7..f3bdb78e 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -129,9 +129,6 @@ static_locales!(LOCALES_PAGETOP); // PUBLIC API. // ************************************************************************************************* -// Handling safe results. -pub mod result; - // Functions and macro helpers. pub mod util; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index d346dd01..c94ff3b3 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -88,8 +88,7 @@ //! ``` use crate::html::{Markup, PreEscaped}; -use crate::result::{SafeResult, TraceErr}; -use crate::{config, kv, LazyStatic, LOCALES_PAGETOP}; +use crate::{config, kv, trace, LazyStatic, LOCALES_PAGETOP}; pub use fluent_templates; pub use unic_langid::LanguageIdentifier; @@ -118,22 +117,21 @@ static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| lang /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// global para la aplicación a partir de `SETTINGS.app.language`. -pub(crate) static LANGID: LazyStatic<&LanguageIdentifier> = - LazyStatic::new(|| langid_for(config::SETTINGS.app.language.as_str()).unwrap_or_fallback()); +pub(crate) static LANGID: LazyStatic<&LanguageIdentifier> = LazyStatic::new(|| { + langid_for(config::SETTINGS.app.language.as_str()).unwrap_or(&FALLBACK_LANGID) +}); -pub fn langid_for(language: impl Into<String>) -> SafeResult<&'static LanguageIdentifier> { +pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdentifier, String> { let language = language.into(); match LANGUAGES.get(language.as_str()) { - Some((langid, _)) => SafeResult::Ok(langid), + Some((langid, _)) => Ok(langid), None => { if language.is_empty() { - SafeResult::Ok(&FALLBACK_LANGID) + Ok(&FALLBACK_LANGID) } else { - SafeResult::Err(TraceErr::warn( - L10n::l(LANGUAGE_SET_FAILURE) - .with_arg("language", config::SETTINGS.app.language.as_str()), - &FALLBACK_LANGID, - )) + Err(L10n::l(LANGUAGE_SET_FAILURE) + .with_arg("language", config::SETTINGS.app.language.as_str()) + .warn()) } } } @@ -238,7 +236,43 @@ impl L10n { } } - pub(crate) fn message(&self) -> String { + pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { + PreEscaped(self.using(langid).unwrap_or_default()) + } + + pub fn trace(&self) -> String { + let message = self.to_string(); + trace::trace!(message); + message + } + + pub fn debug(&self) -> String { + let message = self.to_string(); + trace::debug!(message); + message + } + + pub fn info(&self) -> String { + let message = self.to_string(); + trace::info!(message); + message + } + + pub fn warn(&self) -> String { + let message = self.to_string(); + trace::warn!(message); + message + } + + pub fn error(&self) -> String { + let message = self.to_string(); + trace::error!(message); + message + } +} + +impl ToString for L10n { + fn to_string(&self) -> String { match &self.op { L10nOp::None => "".to_owned(), L10nOp::Text(text) => text.to_owned(), @@ -263,8 +297,4 @@ impl L10n { }, } } - - pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { - PreEscaped(self.using(langid).unwrap_or_default()) - } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index ed2d642c..9e363bf8 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -6,9 +6,6 @@ pub use crate::{concat_string, fn_builder, main, paste, test}; // Global. pub use crate::{Handle, HashMapResources, LazyStatic, ResultExt, Weight}; -// Handling safe results. -pub use crate::result::{SafeResult, TraceErr}; - // Functions and macro helpers. pub use crate::util; pub use crate::{kv, new_handle}; diff --git a/pagetop/src/result.rs b/pagetop/src/result.rs deleted file mode 100644 index bcff5388..00000000 --- a/pagetop/src/result.rs +++ /dev/null @@ -1,77 +0,0 @@ -//! Handling safe results. - -use crate::locale::L10n; -use crate::trace; - -pub struct TraceErr<T> { - message: String, - fallback: T, -} - -impl<T> TraceErr<T> { - pub fn trace(trace: L10n, fallback: T) -> Self { - let message = trace.message(); - trace::trace!(message); - TraceErr { message, fallback } - } - - pub fn debug(trace: L10n, fallback: T) -> Self { - let message = trace.message(); - trace::debug!(message); - TraceErr { message, fallback } - } - - pub fn info(trace: L10n, fallback: T) -> Self { - let message = trace.message(); - trace::info!(message); - TraceErr { message, fallback } - } - - pub fn warn(trace: L10n, fallback: T) -> Self { - let message = trace.message(); - trace::warn!(message); - TraceErr { message, fallback } - } - - pub fn error(trace: L10n, fallback: T) -> Self { - let message = trace.message(); - trace::error!(message); - TraceErr { message, fallback } - } - - // TraceErr GETTERS. - - pub fn message(self) -> String { - self.message - } - - pub fn fallback(self) -> T { - self.fallback - } -} - -pub enum SafeResult<T> { - Ok(T), - Err(TraceErr<T>), -} - -impl<T> SafeResult<T> { - #[inline] - pub fn unwrap_or_error<F, E>(self, f: F) -> Result<T, E> - where - F: FnOnce(TraceErr<T>) -> E, - { - match self { - SafeResult::Ok(r) => Ok(r), - SafeResult::Err(e) => Err(f(e)), - } - } - - #[inline] - pub fn unwrap_or_fallback(self) -> T { - match self { - SafeResult::Ok(r) => r, - SafeResult::Err(e) => e.fallback(), - } - } -} From 3dac2c4a73540fb421ba219a122076c6711def1e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 26 Oct 2023 19:42:37 +0200 Subject: [PATCH 571/853] =?UTF-8?q?=E2=9E=96=20Remove=20ResultExt=20and=20?= =?UTF-8?q?adapt=20function=20results?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 1 - pagetop/src/core/module/all.rs | 29 +++++++++++++++++++++-------- pagetop/src/db.rs | 10 +++++----- pagetop/src/lib.rs | 1 - pagetop/src/locale.rs | 8 ++++++-- pagetop/src/locale/en-US/trace.ftl | 2 +- pagetop/src/locale/es-ES/trace.ftl | 2 +- pagetop/src/prelude.rs | 2 +- 8 files changed, 35 insertions(+), 20 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 5e7d317a..a0d6dcbd 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -48,7 +48,6 @@ url = "2.4.0" tracing = "0.1.37" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.17", features = ["json", "env-filter"] } -tracing-unwrap = { version = "0.10.0", default-features = false } tracing-actix-web = "0.7.6" fluent-templates = "0.8.0" diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 5a0c14e3..91634726 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,8 +1,7 @@ use crate::core::action::add_action; use crate::core::module::ModuleRef; use crate::core::theme::all::THEMES; -use crate::locale::L10n; -use crate::{service, trace, LazyStatic, ResultExt}; +use crate::{service, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db::*; @@ -111,7 +110,9 @@ pub fn init_modules() { #[cfg(feature = "database")] pub fn run_migrations() { if let Some(dbconn) = &*DBCONN { - run_now({ + use crate::locale::L10n; + + match run_now({ struct Migrator; impl MigratorTrait for Migrator { fn migrations() -> Vec<MigrationItem> { @@ -123,10 +124,16 @@ pub fn run_migrations() { } } Migrator::up(SchemaManagerConnection::Connection(dbconn), None) - }) - .expect_or_log(L10n::l("db_migration_fail").error().as_str()); + }) { + Err(e) => { + L10n::l("db_migration_fail") + .with_arg("dberr", format!("{}", e)) + .error(); + } + _ => {} + }; - run_now({ + match run_now({ struct Migrator; impl MigratorTrait for Migrator { fn migrations() -> Vec<MigrationItem> { @@ -138,8 +145,14 @@ pub fn run_migrations() { } } Migrator::down(SchemaManagerConnection::Connection(dbconn), None) - }) - .expect_or_log(L10n::l("db_migration_fail").error().as_str()); + }) { + Err(e) => { + L10n::l("db_migration_fail") + .with_arg("dberr", format!("{}", e)) + .error(); + } + _ => {} + }; } } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index f70f9c17..fc2382d8 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,7 +1,7 @@ //! Acceso unificado y normalizado a base de datos. use crate::locale::L10n; -use crate::{config, trace, LazyStatic, ResultExt}; +use crate::{config, trace, LazyStatic}; pub use url::Url as DbUri; @@ -70,7 +70,7 @@ pub(crate) static DBCONN: LazyStatic<Option<DbConn>> = LazyStatic::new(|| { db_opt.max_connections(config::SETTINGS.database.max_pool_size); db_opt })) - .expect_or_log(L10n::l("db_connection_fail").to_string().as_str()), + .expect(L10n::l("db_connection_fail").to_string().as_str()), ) } else { None @@ -93,7 +93,7 @@ pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryRes .await } None => Err(DbErr::Conn(RuntimeErr::Internal( - L10n::l("db_connection_not_initialized").trace(), + L10n::l("db_connection_not_initialized").debug(), ))), } } @@ -114,7 +114,7 @@ pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryR .await } None => Err(DbErr::Conn(RuntimeErr::Internal( - L10n::l("db_connection_not_initialized").trace(), + L10n::l("db_connection_not_initialized").debug(), ))), } } @@ -128,7 +128,7 @@ pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { .await } None => Err(DbErr::Conn(RuntimeErr::Internal( - L10n::l("db_connection_not_initialized").trace(), + L10n::l("db_connection_not_initialized").debug(), ))), } } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index f3bdb78e..f1121278 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -117,7 +117,6 @@ pub use pagetop_macros::{fn_builder, main, test}; pub use once_cell::sync::Lazy as LazyStatic; pub use static_files::Resource as StaticResource; -pub use tracing_unwrap::ResultExt; pub type Handle = u64; pub type Weight = i8; diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index c94ff3b3..00931739 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -114,11 +114,15 @@ static LANGUAGES: LazyStatic<HashMap<String, (LanguageIdentifier, &str)>> = Lazy static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| langid!("en-US")); +pub fn langid_fallback() -> &'static LanguageIdentifier { + &FALLBACK_LANGID +} + /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// global para la aplicación a partir de `SETTINGS.app.language`. pub(crate) static LANGID: LazyStatic<&LanguageIdentifier> = LazyStatic::new(|| { - langid_for(config::SETTINGS.app.language.as_str()).unwrap_or(&FALLBACK_LANGID) + langid_for(config::SETTINGS.app.language.as_str()).unwrap_or(langid_fallback()) }); pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdentifier, String> { @@ -131,7 +135,7 @@ pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdenti } else { Err(L10n::l(LANGUAGE_SET_FAILURE) .with_arg("language", config::SETTINGS.app.language.as_str()) - .warn()) + .debug()) } } } diff --git a/pagetop/src/locale/en-US/trace.ftl b/pagetop/src/locale/en-US/trace.ftl index a5f93d39..f0cd654d 100644 --- a/pagetop/src/locale/en-US/trace.ftl +++ b/pagetop/src/locale/en-US/trace.ftl @@ -5,4 +5,4 @@ language_set_failure = Failed to set language. Unicode Language Identifier "{$la db_connection_fail = Failed to connect to database db_connection_not_initialized = Database connection not initialized -db_migration_fail = Database update failed +db_migration_fail = Database update failed (${dberr}) diff --git a/pagetop/src/locale/es-ES/trace.ftl b/pagetop/src/locale/es-ES/trace.ftl index 18598a44..4fdad1e9 100644 --- a/pagetop/src/locale/es-ES/trace.ftl +++ b/pagetop/src/locale/es-ES/trace.ftl @@ -5,4 +5,4 @@ language_set_failure = Fallo al asignar idioma. El Identificador de Lenguaje Uni db_connection_fail = Fallo al conectar con la base de datos db_connection_not_initialized = Conexión a la base de datos no inicializada -db_migration_fail = Fallo en la actualización de la base de datos +db_migration_fail = Fallo al actualizar base de datos (${dberr}) diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 9e363bf8..9d5a0ba0 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -4,7 +4,7 @@ pub use crate::{concat_string, fn_builder, main, paste, test}; // Global. -pub use crate::{Handle, HashMapResources, LazyStatic, ResultExt, Weight}; +pub use crate::{Handle, HashMapResources, LazyStatic, Weight}; // Functions and macro helpers. pub use crate::util; From 54d216437a6b1056a5ab87c4e0d89a77914a415b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 26 Oct 2023 21:10:37 +0200 Subject: [PATCH 572/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Pas?= =?UTF-8?q?ses=20fmt=20and=20clippy=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/all.rs | 22 ++++++++-------------- pagetop/src/db.rs | 2 +- pagetop/src/locale.rs | 14 +++++--------- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 91634726..fd160c30 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -112,7 +112,7 @@ pub fn run_migrations() { if let Some(dbconn) = &*DBCONN { use crate::locale::L10n; - match run_now({ + if let Err(e) = run_now({ struct Migrator; impl MigratorTrait for Migrator { fn migrations() -> Vec<MigrationItem> { @@ -125,15 +125,12 @@ pub fn run_migrations() { } Migrator::up(SchemaManagerConnection::Connection(dbconn), None) }) { - Err(e) => { - L10n::l("db_migration_fail") - .with_arg("dberr", format!("{}", e)) - .error(); - } - _ => {} + L10n::l("db_migration_fail") + .with_arg("dberr", format!("{}", e)) + .error(); }; - match run_now({ + if let Err(e) = run_now({ struct Migrator; impl MigratorTrait for Migrator { fn migrations() -> Vec<MigrationItem> { @@ -146,12 +143,9 @@ pub fn run_migrations() { } Migrator::down(SchemaManagerConnection::Connection(dbconn), None) }) { - Err(e) => { - L10n::l("db_migration_fail") - .with_arg("dberr", format!("{}", e)) - .error(); - } - _ => {} + L10n::l("db_migration_fail") + .with_arg("dberr", format!("{}", e)) + .error(); }; } } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index fc2382d8..d30e37d9 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -70,7 +70,7 @@ pub(crate) static DBCONN: LazyStatic<Option<DbConn>> = LazyStatic::new(|| { db_opt.max_connections(config::SETTINGS.database.max_pool_size); db_opt })) - .expect(L10n::l("db_connection_fail").to_string().as_str()), + .unwrap_or_else(|_| panic!("{}", L10n::l("db_connection_fail").to_string())), ) } else { None diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 00931739..9170a6f4 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -112,17 +112,13 @@ static LANGUAGES: LazyStatic<HashMap<String, (LanguageIdentifier, &str)>> = Lazy ] }); -static FALLBACK_LANGID: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| langid!("en-US")); - -pub fn langid_fallback() -> &'static LanguageIdentifier { - &FALLBACK_LANGID -} +pub static LANGID_FALLBACK: LazyStatic<LanguageIdentifier> = LazyStatic::new(|| langid!("en-US")); /// Almacena el Identificador de Idioma Unicode /// ([Unicode Language Identifier](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier)) /// global para la aplicación a partir de `SETTINGS.app.language`. -pub(crate) static LANGID: LazyStatic<&LanguageIdentifier> = LazyStatic::new(|| { - langid_for(config::SETTINGS.app.language.as_str()).unwrap_or(langid_fallback()) +pub static LANGID: LazyStatic<&LanguageIdentifier> = LazyStatic::new(|| { + langid_for(config::SETTINGS.app.language.as_str()).unwrap_or(&LANGID_FALLBACK) }); pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdentifier, String> { @@ -131,7 +127,7 @@ pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdenti Some((langid, _)) => Ok(langid), None => { if language.is_empty() { - Ok(&FALLBACK_LANGID) + Ok(&LANGID_FALLBACK) } else { Err(L10n::l(LANGUAGE_SET_FAILURE) .with_arg("language", config::SETTINGS.app.language.as_str()) @@ -284,7 +280,7 @@ impl ToString for L10n { Some(locales) => locales .lookup_with_args( match key.as_str() { - LANGUAGE_SET_FAILURE => &FALLBACK_LANGID, + LANGUAGE_SET_FAILURE => &LANGID_FALLBACK, _ => &LANGID, }, key, From 5f366d36176282aa5a3530c66d95fd2ef7428a74 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 08:52:20 +0200 Subject: [PATCH 573/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20main=20macros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/theme/inception.rs | 4 ++-- pagetop/src/db.rs | 2 +- pagetop/src/lib.rs | 2 +- pagetop/src/locale.rs | 10 +++++----- pagetop/src/prelude.rs | 6 +++--- pagetop/src/service.rs | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index 7a02b2c0..3557a077 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -2,7 +2,7 @@ use crate::prelude::*; new_handle!(THEME_INCEPTION); -static_files!(base); +new_static_files!(base); pub struct Inception; @@ -20,7 +20,7 @@ impl ModuleTrait for Inception { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/base", base); + service_for_static_files!(scfg, "/base", base); } } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index d30e37d9..4560b716 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -150,7 +150,7 @@ pub use migration::prelude::*; pub type MigrationItem = Box<dyn MigrationTrait>; #[macro_export] -macro_rules! pub_migration { +macro_rules! new_migration { ( $migration:ident ) => { pub struct $migration; diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index f1121278..8dda95ed 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -122,7 +122,7 @@ pub type Handle = u64; pub type Weight = i8; pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; -static_locales!(LOCALES_PAGETOP); +new_static_locales!(LOCALES_PAGETOP); // ************************************************************************************************* // PUBLIC API. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 9170a6f4..55e6197b 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -70,13 +70,13 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL usa la macro -//! [`static_locales!`](crate::static_locales) para integrarlos en tu módulo o aplicación. Si tus -//! recursos se encuentran en el directorio `"src/locale"` bastará con declarar: +//! [`new_static_locales!`](crate::new_static_locales) para integrarlos en tu módulo o aplicación. +//! si tus recursos se encuentran en el directorio `"src/locale"` bastará con declarar: //! //! ``` //! use pagetop::prelude::*; //! -//! static_locales!(LOCALES_SAMPLE); +//! new_static_locales!(LOCALES_SAMPLE); //! ``` //! //! Y si están en otro directorio, entonces puedes usar: @@ -84,7 +84,7 @@ //! ``` //! use pagetop::prelude::*; //! -//! static_locales!(LOCALES_SAMPLE in "path/to/locale"); +//! new_static_locales!(LOCALES_SAMPLE in "path/to/locale"); //! ``` use crate::html::{Markup, PreEscaped}; @@ -139,7 +139,7 @@ pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdenti #[macro_export] /// Define un conjunto de elementos de localización y textos locales de traducción. -macro_rules! static_locales { +macro_rules! new_static_locales { ( $LOCALES:ident $(, $core_locales:literal)? ) => { $crate::locale::fluent_templates::static_loader! { static $LOCALES = { diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 9d5a0ba0..440ccd3f 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -15,9 +15,9 @@ pub use crate::{kv, new_handle}; // crate::config pub use crate::default_settings; // crate::locale -pub use crate::static_locales; +pub use crate::new_static_locales; // crate::service -pub use crate::{static_files, static_files_service}; +pub use crate::{new_static_files, service_for_static_files}; // crate::core::actions pub use crate::actions; // crate::base::action::component @@ -36,7 +36,7 @@ pub use crate::locale::*; pub use crate::datetime::*; #[cfg(feature = "database")] -pub use crate::{db, db::*, migrations, pub_migration}; +pub use crate::{db, db::*, migrations, new_migration}; pub use crate::service; pub use crate::service::HttpMessage; diff --git a/pagetop/src/service.rs b/pagetop/src/service.rs index 9e2bf551..101fa8da 100644 --- a/pagetop/src/service.rs +++ b/pagetop/src/service.rs @@ -13,7 +13,7 @@ pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; #[macro_export] -macro_rules! static_files { +macro_rules! new_static_files { ( $bundle:ident ) => { $crate::paste! { mod [<static_files_ $bundle>] { @@ -34,7 +34,7 @@ macro_rules! static_files { } #[macro_export] -macro_rules! static_files_service { +macro_rules! service_for_static_files { ( $scfg:ident, $path:expr, $bundle:ident ) => {{ $crate::paste! { let static_files = &$crate::config::SETTINGS.dev.static_files; From 238e92689a1f6d06aa9caba733080944a7dd5519 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 09:20:07 +0200 Subject: [PATCH 574/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Apply=20last=20?= =?UTF-8?q?macro=20names=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-aliner/src/lib.rs | 4 ++-- pagetop-bootsier/src/lib.rs | 6 +++--- pagetop-build/src/lib.rs | 4 ++-- pagetop-bulmix/src/lib.rs | 4 ++-- pagetop-homedemo/src/lib.rs | 6 +++--- pagetop-node/src/lib.rs | 2 +- .../migration/m20220316_000001_create_table_node_type.rs | 2 +- .../src/migration/m20220316_000002_create_table_node.rs | 2 +- .../migration/m20220316_000003_create_table_node_access.rs | 2 +- .../m20220316_000004_create_table_node_revision.rs | 2 +- pagetop-user/src/lib.rs | 2 +- .../src/migration/m20220312_000001_create_table_role.rs | 2 +- .../m20220312_000002_create_table_role_permission.rs | 2 +- .../src/migration/m20220312_000003_create_table_user.rs | 2 +- .../migration/m20220312_000004_create_table_user_role.rs | 2 +- 16 files changed, 23 insertions(+), 23 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 1ad4e75a..69fcc06f 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; new_handle!(MODULE_ADMIN); -static_locales!(LOCALES_ADMIN); +new_static_locales!(LOCALES_ADMIN); mod summary; diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs index 66e59c9e..350a14dd 100644 --- a/pagetop-aliner/src/lib.rs +++ b/pagetop-aliner/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; new_handle!(THEME_ALINER); -static_files!(aliner); +new_static_files!(aliner); pub struct Aliner; @@ -16,7 +16,7 @@ impl ModuleTrait for Aliner { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/aliner", aliner); + service_for_static_files!(scfg, "/aliner", aliner); } } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index e15845e3..9b6607ee 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -2,9 +2,9 @@ use pagetop::prelude::*; new_handle!(THEME_BOOTSIER); -static_locales!(LOCALES_BOOTSIER); +new_static_locales!(LOCALES_BOOTSIER); -static_files!(bootsier); +new_static_files!(bootsier); pub struct Bootsier; @@ -18,7 +18,7 @@ impl ModuleTrait for Bootsier { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/bootsier", bootsier); + service_for_static_files!(scfg, "/bootsier", bootsier); } } diff --git a/pagetop-build/src/lib.rs b/pagetop-build/src/lib.rs index 8c53d241..5b9cfa61 100644 --- a/pagetop-build/src/lib.rs +++ b/pagetop-build/src/lib.rs @@ -59,7 +59,7 @@ //! ```rust#ignore //! use pagetop::prelude::*; //! -//! static_files!(guides); +//! new_static_files!(guides); //! ``` //! //! Also you can get the bundle as a static reference to the generated HashMap resources collection: @@ -67,7 +67,7 @@ //! ```rust#ignore //! use pagetop::prelude::*; //! -//! static_files!(guides => BUNDLE_GUIDES); +//! new_static_files!(guides => BUNDLE_GUIDES); //! ``` //! //! You can build more than one resources file to compile with your project. diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 12b33a76..38ad6f5a 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; new_handle!(THEME_BULMIX); -static_files!(bulmix); +new_static_files!(bulmix); pub struct Bulmix; @@ -16,7 +16,7 @@ impl ModuleTrait for Bulmix { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/bulmix", bulmix); + service_for_static_files!(scfg, "/bulmix", bulmix); } } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index e6df9d28..901eaa4f 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -2,9 +2,9 @@ use pagetop::prelude::*; new_handle!(MODULE_HOMEDEMO); -static_locales!(LOCALES_HOMEDEMO); +new_static_locales!(LOCALES_HOMEDEMO); -static_files!(homedemo); +new_static_files!(homedemo); pub struct HomeDemo; @@ -22,7 +22,7 @@ impl ModuleTrait for HomeDemo { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, "/homedemo", homedemo); + service_for_static_files!(scfg, "/homedemo", homedemo); scfg.route("/", service::web::get().to(demo)); } } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 3294797b..51f56740 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; new_handle!(MODULE_NODE); -static_locales!(LOCALES_NODE); +new_static_locales!(LOCALES_NODE); //mod entity; mod migration; diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 093ae25f..3eb6ac8b 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -20,7 +20,7 @@ enum NodeType { // different from the current type name if the locked field is 0. } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index bb829100..0c1947bc 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -27,7 +27,7 @@ enum Node { Translate, // A boolean indicating whether this translation page needs to be updated. } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index a331c04d..ea2cdc0c 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -19,7 +19,7 @@ enum NodeAccess { // this node. } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 5635571d..f5ebbf22 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -21,7 +21,7 @@ enum NodeRevision { // be displayed at the top of lists in which it appears. } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 6e327aa8..73d61e17 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; new_handle!(MODULE_USER); -static_locales!(LOCALES_USER); +new_static_locales!(LOCALES_USER); mod migration; diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index f1fa802c..852aa257 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -10,7 +10,7 @@ enum Role { Weight, // The weight of this role in listings and the user interface. } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index ea4af0da..95779955 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -16,7 +16,7 @@ enum Role { /* ... */ } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index 27194274..58e78127 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -17,7 +17,7 @@ enum User { Timezone, // User's time zone. } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index a8dfbf22..2c08c1cf 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -23,7 +23,7 @@ enum Role { /* ... */ } -pub_migration!(Migration); +new_migration!(Migration); #[async_trait::async_trait] impl MigrationTrait for Migration { From 9e3492038fdb2765b3298b3c2442d7a649f5bbe3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 09:33:59 +0200 Subject: [PATCH 575/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.46?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index a0d6dcbd..f77b7824 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.45" +version = "0.0.46" edition = "2021" authors = [ @@ -32,8 +32,8 @@ postgres = ["database", "sea-orm/sqlx-postgres"] sqlite = ["database", "sea-orm/sqlx-sqlite"] [dependencies] -async-trait = "0.1.73" -chrono = "0.4.26" +async-trait = "0.1.74" +chrono = "0.4.31" concat-string = "1.0.1" figlet-rs = "0.1.5" itoa = "1.0.9" @@ -42,19 +42,19 @@ once_cell = "1.18.0" paste = "1.0.14" substring = "1.4.5" term_size = "0.3.2" -toml = "0.7.6" -url = "2.4.0" +toml = "0.8.5" +url = "2.4.1" -tracing = "0.1.37" +tracing = "0.1.40" tracing-appender = "0.2.2" tracing-subscriber = { version = "0.3.17", features = ["json", "env-filter"] } -tracing-actix-web = "0.7.6" +tracing-actix-web = "0.7.8" fluent-templates = "0.8.0" unic-langid = { version = "0.9.1", features = ["macros"] } actix-web = "4" -actix-session = { version = "0.7.2", features = ["cookie-session"] } +actix-session = { version = "0.8.0", features = ["cookie-session"] } actix-web-files = { package = "actix-files", version = "0.6.2" } actix-web-static-files = "4.0.1" @@ -65,7 +65,7 @@ pagetop-macros = { version = "0.0", path = "../pagetop-macros" } serde = { version = "1.0", features = ["derive"] } [dependencies.futures] -version = "0.3.28" +version = "0.3.29" optional = true [dependencies.sea-orm] From d2dfc08c09a3a0298112a84dcb4886f7a7f4e8e2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 09:40:08 +0200 Subject: [PATCH 576/853] =?UTF-8?q?=F0=9F=94=96=20[build]=20libera=20versi?= =?UTF-8?q?=C3=B3n=20de=20desarrollo=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-build/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-build/Cargo.toml b/pagetop-build/Cargo.toml index ddc147ee..7721f413 100644 --- a/pagetop-build/Cargo.toml +++ b/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ From 7f4c499c056692f224482c1799e14f32d9495dcf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 09:41:34 +0200 Subject: [PATCH 577/853] =?UTF-8?q?=F0=9F=94=96=20[aliner]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-aliner/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml index eba83fbc..44935540 100644 --- a/pagetop-aliner/Cargo.toml +++ b/pagetop-aliner/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-aliner" -version = "0.0.8" +version = "0.0.9" edition = "2021" authors = [ From d6b5d3b24d4c6ee7b2ce3a5d7a0a87d5d08fcd44 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 09:50:53 +0200 Subject: [PATCH 578/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index 90310c19..e7fe7e87 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.10" +version = "0.0.11" edition = "2021" authors = [ From 5d0f872484020f81c2af0cb77aeca4267feb82b7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 09:54:23 +0200 Subject: [PATCH 579/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index 7c501eaf..3539ea14 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From b41ded88af57d1637a39b8cb53b02f2ed9621a8f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 09:57:29 +0200 Subject: [PATCH 580/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 898f66c8..5066e693 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.9" +version = "0.0.10" edition = "2021" authors = [ From 6e8712ed838989159b88f2f33c0d5db1b0f46d20 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 10:01:37 +0200 Subject: [PATCH 581/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20release=20deve?= =?UTF-8?q?lopment=20version=200.0.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index d25754f1..db9f5cc6 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.13" +version = "0.0.14" edition = "2021" authors = [ From 7411ae4f1f733063f5952177536b63fc967b236e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 10:05:55 +0200 Subject: [PATCH 582/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 64852e75..473239e4 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.11" +version = "0.0.12" edition = "2021" authors = [ From 7df917e11a89477c95b8d95de29256ccba80c1b2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 10:10:55 +0200 Subject: [PATCH 583/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 87976e8c..019802aa 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.13" +version = "0.0.14" edition = "2021" authors = [ From 4472f2ef52c7d4e7f0320acc14a649d7bcb18e0f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 27 Oct 2023 11:14:37 +0200 Subject: [PATCH 584/853] =?UTF-8?q?=E2=9C=A8=20Integrate=20aliner=20theme?= =?UTF-8?q?=20with=20name=20Chassis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 - README.md | 3 -- drust/Cargo.toml | 1 - drust/config/local.toml | 7 +-- drust/src/main.rs | 1 - pagetop-aliner/Cargo.toml | 22 --------- pagetop-aliner/README.md | 27 ----------- pagetop-aliner/build.rs | 7 --- pagetop-aliner/src/lib.rs | 30 ------------ pagetop/src/base/theme.rs | 6 +++ pagetop/src/base/theme/basic.rs | 36 +++++++++++++++ pagetop/src/base/theme/chassis.rs | 36 +++++++++++++++ pagetop/src/base/theme/inception.rs | 10 +--- pagetop/src/core/module/all.rs | 9 +++- pagetop/static/base/css/basic.css | 3 ++ .../static/base/css/chassis.css | 0 pagetop/static/base/css/components.css | 46 ------------------- .../base/css/{styles.css => inception.css} | 0 18 files changed, 94 insertions(+), 151 deletions(-) delete mode 100644 pagetop-aliner/Cargo.toml delete mode 100644 pagetop-aliner/README.md delete mode 100644 pagetop-aliner/build.rs delete mode 100644 pagetop-aliner/src/lib.rs create mode 100644 pagetop/src/base/theme/basic.rs create mode 100644 pagetop/src/base/theme/chassis.rs create mode 100644 pagetop/static/base/css/basic.css rename pagetop-aliner/static/css/styles.css => pagetop/static/base/css/chassis.css (100%) delete mode 100644 pagetop/static/base/css/components.css rename pagetop/static/base/css/{styles.css => inception.css} (100%) diff --git a/Cargo.toml b/Cargo.toml index cab17095..e64205fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,6 @@ members = [ "pagetop-user", "pagetop-node", # Themes. - "pagetop-aliner", "pagetop-bootsier", "pagetop-bulmix", ] diff --git a/README.md b/README.md index a963c0d3..1e509f73 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,6 @@ El repositorio se organiza en un *workspace* con los siguientes subproyectos: ## Temas -* **[pagetop-aliner](https://github.com/manuelcillero/pagetop/tree/main/pagetop-aliner)**, tema que - delimita con cajas los elementos HTML para mostrar esquemáticamente la composición de las páginas. - * **[pagetop-bootsier](https://github.com/manuelcillero/pagetop/tree/main/pagetop-bootsier)**, tema que utiliza el *framework* [Bootstrap](https://getbootstrap.com/) para la composición de páginas y visualización de componentes. diff --git a/drust/Cargo.toml b/drust/Cargo.toml index c0de9ab6..3260e429 100644 --- a/drust/Cargo.toml +++ b/drust/Cargo.toml @@ -16,7 +16,6 @@ license = "Apache-2.0 OR MIT" [dependencies] pagetop = { version = "0.0", path = "../pagetop", features = ["mysql"], default-features = false } # Themes. -pagetop-aliner = { version = "0.0", path = "../pagetop-aliner" } pagetop-bootsier = { version = "0.0", path = "../pagetop-bootsier" } pagetop-bulmix = { version = "0.0", path = "../pagetop-bulmix" } # Modules. diff --git a/drust/config/local.toml b/drust/config/local.toml index 410a913d..343add5c 100644 --- a/drust/config/local.toml +++ b/drust/config/local.toml @@ -1,7 +1,8 @@ [app] -#theme = "Default" -#theme = "Aliner" -theme = "Bootsier" +#theme = "Basic" +#theme = "Chassis" +theme = "Inception" +#theme = "Bootsier" #theme = "Bulmix" language = "es-ES" diff --git a/drust/src/main.rs b/drust/src/main.rs index 306b3c02..04a959ad 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -12,7 +12,6 @@ impl ModuleTrait for Drust { fn dependencies(&self) -> Vec<ModuleRef> { vec![ // Themes. - &pagetop_aliner::Aliner, &pagetop_bootsier::Bootsier, &pagetop_bulmix::Bulmix, // Modules. diff --git a/pagetop-aliner/Cargo.toml b/pagetop-aliner/Cargo.toml deleted file mode 100644 index 44935540..00000000 --- a/pagetop-aliner/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "pagetop-aliner" -version = "0.0.9" -edition = "2021" - -authors = [ - "Manuel Cillero <manuel@cillero.es>" -] -description = """\ - Theme for PageTop with a basic set of styles that encloses HTML elements with boxes to show an \ - outline of the page layout and components display.\ -""" -homepage = "https://pagetop.cillero.es" -repository = "https://github.com/manuelcillero/pagetop" -license = "Apache-2.0 OR MIT" - -[dependencies] -pagetop = { version = "0.0", path = "../pagetop" } -static-files = "0.2.3" - -[build-dependencies] -pagetop-build = { version = "0.0", path = "../pagetop-build" } diff --git a/pagetop-aliner/README.md b/pagetop-aliner/README.md deleted file mode 100644 index 6697707e..00000000 --- a/pagetop-aliner/README.md +++ /dev/null @@ -1,27 +0,0 @@ -Tema para **PageTop** que delimita con cajas los elementos HTML para mostrar esquemáticamente la -composición de las páginas. - -[PageTop](https://github.com/manuelcillero/pagetop/tree/main/pagetop), es un entorno de desarrollo -basado en algunos de los *crates* más estables y populares del ecosistema Rust para proporcionar -APIs, patrones de desarrollo y buenas prácticas para la creación de soluciones web SSR (*Server-Side -Rendering*). - - -# 🚧 Advertencia - -**PageTop** sólo libera actualmente versiones de desarrollo. La API no es estable y los cambios son -constantes. No puede considerarse preparado hasta que se libere la versión **0.1.0**. - - -# 📜 Licencia - -Este proyecto tiene licencia, de hecho tiene dos, puedes aplicar cualquiera de las siguientes a tu -elección: - -* Licencia Apache versión 2.0 - ([LICENSE-APACHE](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-APACHE) o - [http://www.apache.org/licenses/LICENSE-2.0]). - -* Licencia MIT - ([LICENSE-MIT](https://github.com/manuelcillero/pagetop/blob/main/LICENSE-MIT) o - [http://opensource.org/licenses/MIT]). diff --git a/pagetop-aliner/build.rs b/pagetop-aliner/build.rs deleted file mode 100644 index 2f0500aa..00000000 --- a/pagetop-aliner/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -use pagetop_build::StaticFilesBundle; - -fn main() -> std::io::Result<()> { - StaticFilesBundle::from_dir("./static") - .with_name("aliner") - .build() -} diff --git a/pagetop-aliner/src/lib.rs b/pagetop-aliner/src/lib.rs deleted file mode 100644 index 350a14dd..00000000 --- a/pagetop-aliner/src/lib.rs +++ /dev/null @@ -1,30 +0,0 @@ -use pagetop::prelude::*; - -new_handle!(THEME_ALINER); - -new_static_files!(aliner); - -pub struct Aliner; - -impl ModuleTrait for Aliner { - fn handle(&self) -> Handle { - THEME_ALINER - } - - fn theme(&self) -> Option<ThemeRef> { - Some(&Aliner) - } - - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - service_for_static_files!(scfg, "/aliner", aliner); - } -} - -impl ThemeTrait for Aliner { - fn before_prepare_body(&self, page: &mut Page) { - page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) - .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/aliner/css/styles.css").with_weight(-99), - )); - } -} diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs index 83216d03..b78722b0 100644 --- a/pagetop/src/base/theme.rs +++ b/pagetop/src/base/theme.rs @@ -1,2 +1,8 @@ +mod basic; +pub use basic::{Basic, THEME_BASIC}; + +mod chassis; +pub use chassis::{Chassis, THEME_CHASSIS}; + mod inception; pub use inception::{Inception, THEME_INCEPTION}; diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs new file mode 100644 index 00000000..f28a6ebf --- /dev/null +++ b/pagetop/src/base/theme/basic.rs @@ -0,0 +1,36 @@ +use crate::prelude::*; + +new_handle!(THEME_BASIC); + +pub struct Basic; + +impl ModuleTrait for Basic { + fn handle(&self) -> Handle { + THEME_BASIC + } + + fn name(&self) -> L10n { + L10n::n("Basic") + } + + fn theme(&self) -> Option<ThemeRef> { + Some(&Basic) + } +} + +impl ThemeTrait for Basic { + fn after_prepare_body(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/normalize.min.css") + .with_version("8.0.1") + .with_weight(-90), + )) + .alter_context(ContextOp::AddBaseAssets) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/basic.css") + .with_version("0.0.1") + .with_weight(-90), + )); + } +} diff --git a/pagetop/src/base/theme/chassis.rs b/pagetop/src/base/theme/chassis.rs new file mode 100644 index 00000000..03180b5e --- /dev/null +++ b/pagetop/src/base/theme/chassis.rs @@ -0,0 +1,36 @@ +use crate::prelude::*; + +new_handle!(THEME_CHASSIS); + +pub struct Chassis; + +impl ModuleTrait for Chassis { + fn handle(&self) -> Handle { + THEME_CHASSIS + } + + fn name(&self) -> L10n { + L10n::n("Chassis") + } + + fn theme(&self) -> Option<ThemeRef> { + Some(&Chassis) + } +} + +impl ThemeTrait for Chassis { + fn after_prepare_body(&self, page: &mut Page) { + page.alter_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/normalize.min.css") + .with_version("8.0.1") + .with_weight(-90), + )) + .alter_context(ContextOp::AddBaseAssets) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/chassis.css") + .with_version("0.0.1") + .with_weight(-90), + )); + } +} diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index 3557a077..f706fe31 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -2,8 +2,6 @@ use crate::prelude::*; new_handle!(THEME_INCEPTION); -new_static_files!(base); - pub struct Inception; impl ModuleTrait for Inception { @@ -12,16 +10,12 @@ impl ModuleTrait for Inception { } fn name(&self) -> L10n { - L10n::n("Default") + L10n::n("Inception") } fn theme(&self) -> Option<ThemeRef> { Some(&Inception) } - - fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - service_for_static_files!(scfg, "/base", base); - } } impl ThemeTrait for Inception { @@ -34,7 +28,7 @@ impl ThemeTrait for Inception { )) .alter_context(ContextOp::AddBaseAssets) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/base/css/styles.css") + StyleSheet::at("/base/css/inception.css") .with_version("0.0.1") .with_weight(-90), )); diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index fd160c30..76826f13 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,13 +1,15 @@ use crate::core::action::add_action; use crate::core::module::ModuleRef; use crate::core::theme::all::THEMES; -use crate::{service, trace, LazyStatic}; +use crate::{new_static_files, service, service_for_static_files, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db::*; use std::sync::RwLock; +new_static_files!(base); + // MODULES ***************************************************************************************** static ENABLED_MODULES: LazyStatic<RwLock<Vec<ModuleRef>>> = @@ -27,7 +29,9 @@ pub fn register_modules(app: ModuleRef) { // List of modules to enable. let mut list: Vec<ModuleRef> = Vec::new(); - // Enable default theme. + // Enable default themes. + add_to_enabled(&mut list, &crate::base::theme::Basic); + add_to_enabled(&mut list, &crate::base::theme::Chassis); add_to_enabled(&mut list, &crate::base::theme::Inception); // Enable application modules. @@ -153,6 +157,7 @@ pub fn run_migrations() { // CONFIGURE SERVICES ****************************************************************************** pub fn configure_services(scfg: &mut service::web::ServiceConfig) { + service_for_static_files!(scfg, "/base", base); for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(scfg); } diff --git a/pagetop/static/base/css/basic.css b/pagetop/static/base/css/basic.css new file mode 100644 index 00000000..06a9d968 --- /dev/null +++ b/pagetop/static/base/css/basic.css @@ -0,0 +1,3 @@ +.pt-body__skip { + display: none; +} diff --git a/pagetop-aliner/static/css/styles.css b/pagetop/static/base/css/chassis.css similarity index 100% rename from pagetop-aliner/static/css/styles.css rename to pagetop/static/base/css/chassis.css diff --git a/pagetop/static/base/css/components.css b/pagetop/static/base/css/components.css deleted file mode 100644 index 57f93007..00000000 --- a/pagetop/static/base/css/components.css +++ /dev/null @@ -1,46 +0,0 @@ -/* Image component */ - -.pt-img__fluid { - max-width: 100%; - height: auto; -} - -/* Branding component */ - -.pt-branding__wrapper { - display: flex; - align-items: flex-end; - column-gap: var(--pt-gap-0-75); -} -.pt-branding__name { - letter-spacing: 0.02em; - font-size: var(--pt-font-size-xl); -} -.pt-branding__slogan { - font-size: var(--pt-font-size-l); -} - -/* SM - Applies <= 568px */ -@media (max-width: 35.5em) { - .pt-branding__logo { - display: none; - } -} -/* LG - Applies <= 992px */ -@media (max-width: 62em) { - .pt-branding__slogan { - font-size: var(--pt-font-size-l); - } -} - -/* PoweredBy component */ - -#pt-powered-by { - text-align: center; -} -#pt-powered-by .pt-pagetop__logo img, -#pt-powered-by .pt-pagetop__logo svg { - margin-left: .275em; - height: 1.275em; - vertical-align: middle; -} diff --git a/pagetop/static/base/css/styles.css b/pagetop/static/base/css/inception.css similarity index 100% rename from pagetop/static/base/css/styles.css rename to pagetop/static/base/css/inception.css From f198b35762f2437ab3e6db34908b2340ce959deb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 28 Oct 2023 07:43:50 +0200 Subject: [PATCH 585/853] =?UTF-8?q?=F0=9F=9A=A7=20Working=20on=20footer=20?= =?UTF-8?q?(powered-by=20credits)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/powered_by.rs | 42 +++++++++++++----------- pagetop/static/base/css/looks.css | 6 ++-- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 8600a402..fc5d81ba 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -36,7 +36,7 @@ impl ComponentTrait for PoweredBy { } fn id(&self) -> Option<String> { - Some("pt-powered-by".to_owned()) + Some("pt-poweredby".to_owned()) } fn weight(&self) -> Weight { @@ -48,34 +48,27 @@ impl ComponentTrait for PoweredBy { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let logo = match self.logo() { - PoweredByLogo::Color => { - let logo_txt = &L10n::l("pagetop_logo").using(cx.langid()); - html! { - span class="pt-pagetop__logo" aria-label=[logo_txt] { - img src="/base/pagetop-logo.svg" alt=[logo_txt] {} - } - } - } - PoweredByLogo::LineDark => self.logo_line(10, 11, 9, cx), - PoweredByLogo::LineLight => self.logo_line(255, 255, 255, cx), - PoweredByLogo::LineRGB(r, g, b) => self.logo_line(*r, *g, *b, cx), - _ => html! {}, - }; - - let credits = L10n::l("poweredby_pagetop") + let poweredby_pagetop = L10n::l("poweredby_pagetop") .with_arg( "pagetop_link", "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", ) .escaped(cx.langid()); + let pagetop_logo = match self.logo() { + PoweredByLogo::None => html! {}, + PoweredByLogo::Color => self.logo_color(cx), + PoweredByLogo::LineDark => self.logo_line(10, 11, 9, cx), + PoweredByLogo::LineLight => self.logo_line(255, 255, 255, cx), + PoweredByLogo::LineRGB(r, g, b) => self.logo_line(*r, *g, *b, cx), + }; + PrepareMarkup::With(html! { div id=[self.id()] { @if let Some(c) = self.copyright() { - span class="copyright" { (c) "." } " " + span class="pt-poweredby__copyright" { (c) "." } " " } - span class="powered" { (credits) " " (logo) } + span class="pt-poweredby__pagetop" { (poweredby_pagetop) " " (pagetop_logo) } } }) } @@ -120,11 +113,20 @@ impl PoweredBy { // PoweredBy PRIVATE. + fn logo_color(&self, cx: &mut Context) -> Markup { + let logo_txt = &L10n::l("pagetop_logo").using(cx.langid()); + html! { + span class="pt-poweredby__logo" aria-label=[logo_txt] { + img src="/base/pagetop-logo.svg" alt=[logo_txt] {} + } + } + } + fn logo_line(&self, r: u8, g: u8, b: u8, cx: &mut Context) -> Markup { let logo_txt = L10n::l("pagetop_logo").using(cx.langid()); let logo_rgb = format!("rgb({},{},{})", r, g, b); html! { - span class="pt-pagetop__logo" aria-label=[logo_txt] { + span class="pt-poweredby__logo" aria-label=[logo_txt] { svg viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" { path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} path fill=(logo_rgb) d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} diff --git a/pagetop/static/base/css/looks.css b/pagetop/static/base/css/looks.css index 57f93007..a98948ee 100644 --- a/pagetop/static/base/css/looks.css +++ b/pagetop/static/base/css/looks.css @@ -35,11 +35,11 @@ /* PoweredBy component */ -#pt-powered-by { +#pt-poweredby { text-align: center; } -#pt-powered-by .pt-pagetop__logo img, -#pt-powered-by .pt-pagetop__logo svg { +.pt-poweredby__logo img, +.pt-poweredby__logo svg { margin-left: .275em; height: 1.275em; vertical-align: middle; From 6ac4c9ce33ec10af378a75f7a1516d7c0feaa762 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Oct 2023 19:10:54 +0100 Subject: [PATCH 586/853] =?UTF-8?q?=F0=9F=94=A7=20Add=20optional=20local?= =?UTF-8?q?=20config=20file=20for=20default=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ drust/config/default.toml | 14 ++++++++++---- drust/config/local.toml | 13 ------------- pagetop/src/config.rs | 35 ++++++++++++++++++++++++----------- 4 files changed, 36 insertions(+), 28 deletions(-) delete mode 100644 drust/config/local.toml diff --git a/.gitignore b/.gitignore index 4ebc5a92..7d848115 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ **/target **/log/*.log* +**/local.*.toml +**/local.toml Cargo.lock workdir diff --git a/drust/config/default.toml b/drust/config/default.toml index 1cbcbfea..6f119629 100644 --- a/drust/config/default.toml +++ b/drust/config/default.toml @@ -1,4 +1,10 @@ -[database] -db_name = "drust" -db_user = "drust" -db_pass = "DrU__#3T" +[app] +#theme = "Basic" +#theme = "Chassis" +theme = "Inception" +#theme = "Bootsier" +#theme = "Bulmix" +language = "es-ES" + +[log] +tracing = "Info,pagetop=Debug,sqlx::query=Warn" diff --git a/drust/config/local.toml b/drust/config/local.toml deleted file mode 100644 index 343add5c..00000000 --- a/drust/config/local.toml +++ /dev/null @@ -1,13 +0,0 @@ -[app] -#theme = "Basic" -#theme = "Chassis" -theme = "Inception" -#theme = "Bootsier" -#theme = "Bulmix" -language = "es-ES" - -[log] -tracing = "Info,pagetop=Debug,sqlx::query=Warn" - -[dev] -#static_files = "../pagetop/static" diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index fa2b9afd..44c8466e 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -121,7 +121,7 @@ mod value; use crate::config::data::ConfigData; use crate::config::file::File; -use crate::LazyStatic; +use crate::{concat_string, LazyStatic}; use serde::Deserialize; @@ -132,6 +132,8 @@ const CONFIG_DIR: &str = "config"; /// Valores originales de la configuración en forma de pares `clave = valor` recogidos de los /// archivos de configuración. + +#[rustfmt::skip] pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto 'default'. let run_mode = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| "default".into()); @@ -139,17 +141,28 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { // Inicializa los ajustes. let mut settings = ConfigData::default(); - // Combina los archivos de configuración y asigna el modo de ejecución. + // Combina los archivos (opcionales) de configuración y asigna el modo de ejecución. settings - // Primero añade la configuración común a todos los entornos. Opcional. - .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "common")).required(false)) - .unwrap() - // Combina la configuración específica del entorno. Por defecto 'default.toml'. Opcional. - .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, run_mode)).required(false)) - .unwrap() - // Combina la configuración local. Este archivo no debería incluirse en git. Opcional. - .merge(File::with_name(&format!("{}/{}.toml", CONFIG_DIR, "local")).required(false)) - .unwrap() + // Primero añade la configuración común a todos los entornos. Por defecto 'common.toml'. + .merge( + File::with_name(&concat_string!(CONFIG_DIR, "/common.toml")) + .required(false) + ).unwrap() + // Añade la configuración específica del entorno. Por defecto 'default.toml'. + .merge( + File::with_name(&concat_string!(CONFIG_DIR, "/", run_mode, ".toml")) + .required(false) + ).unwrap() + // Añade la configuración local reservada del entorno. Por defecto 'default.local.toml'. + .merge( + File::with_name(&concat_string!(CONFIG_DIR, "/", run_mode, ".local.toml")) + .required(false), + ).unwrap() + // Añade la configuración local reservada general. Por defecto 'local.toml'. + .merge( + File::with_name(&concat_string!(CONFIG_DIR, "/local.toml")) + .required(false) + ).unwrap() // Salvaguarda el modo de ejecución. .set("app.run_mode", run_mode) .unwrap(); From cb87b11845941137d2585ab9662ab320d7d298df Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Oct 2023 21:20:55 +0100 Subject: [PATCH 587/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Enh?= =?UTF-8?q?ance=20static=20file=20service=20config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/config/settings.predefined.toml | 6 ++--- pagetop/src/config.rs | 10 +++---- pagetop/src/core/module/all.rs | 8 ++++-- pagetop/src/service.rs | 36 ++++++++++++++----------- pagetop/src/trace.rs | 2 +- pagetop/src/util.rs | 34 ++++++++++++++++++++++- 6 files changed, 69 insertions(+), 27 deletions(-) diff --git a/pagetop/config/settings.predefined.toml b/pagetop/config/settings.predefined.toml index ca1c39f9..ee790f7e 100644 --- a/pagetop/config/settings.predefined.toml +++ b/pagetop/config/settings.predefined.toml @@ -30,9 +30,9 @@ max_pool_size = 5 # Los archivos estáticos requeridos por la aplicación se integran de manera # predeterminada en el binario ejecutable. Sin embargo, durante el desarrollo # puede resultar útil servir estos archivos desde su propio directorio para -# evitar compilar cada vez que se modifican. En este caso, normalmente, basta -# con indicar la ruta "../ruta/static". -static_files = "" +# evitar recompilar cada vez que se modifican. En este caso bastaría con +# indicar la ruta completa al directorio raiz del proyecto. +pagetop_project_dir = "" [log] # Traza de ejecución: "Error", "Warn", "Info", "Debug" o "Trace". diff --git a/pagetop/src/config.rs b/pagetop/src/config.rs index 44c8466e..65779f17 100644 --- a/pagetop/src/config.rs +++ b/pagetop/src/config.rs @@ -155,7 +155,7 @@ pub static CONFIG: LazyStatic<ConfigData> = LazyStatic::new(|| { ).unwrap() // Añade la configuración local reservada del entorno. Por defecto 'default.local.toml'. .merge( - File::with_name(&concat_string!(CONFIG_DIR, "/", run_mode, ".local.toml")) + File::with_name(&concat_string!(CONFIG_DIR, "/local.", run_mode, ".toml")) .required(false), ).unwrap() // Añade la configuración local reservada general. Por defecto 'local.toml'. @@ -269,10 +269,10 @@ pub struct Database { pub struct Dev { /// Los archivos estáticos requeridos por la aplicación se integran de manera predeterminada en /// el binario ejecutable. Sin embargo, durante el desarrollo puede resultar útil servir estos - /// archivos desde su propio directorio para evitar compilar cada vez que se modifican. En este - /// caso, normalmente, basta con indicar la ruta "../ruta/static". + /// archivos desde su propio directorio para evitar recompilar cada vez que se modifican. En + /// este caso bastaría con indicar la ruta completa al directorio raíz del proyecto. /// Por defecto: *""*. - pub static_files: String, + pub pagetop_project_dir: String, } #[derive(Debug, Deserialize)] @@ -335,7 +335,7 @@ default_settings!( "database.max_pool_size" => 5, // [dev] - "dev.static_files" => "", + "dev.pagetop_project_dir" => "", // [log] "log.tracing" => "Info", diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index 76826f13..ddbcd5b5 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,7 +1,7 @@ use crate::core::action::add_action; use crate::core::module::ModuleRef; use crate::core::theme::all::THEMES; -use crate::{new_static_files, service, service_for_static_files, trace, LazyStatic}; +use crate::{config, new_static_files, service, service_for_static_files, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db::*; @@ -157,7 +157,11 @@ pub fn run_migrations() { // CONFIGURE SERVICES ****************************************************************************** pub fn configure_services(scfg: &mut service::web::ServiceConfig) { - service_for_static_files!(scfg, "/base", base); + service_for_static_files!( + scfg, + base => "/base", + [&config::SETTINGS.dev.pagetop_project_dir, "pagetop/static/base"] + ); for m in ENABLED_MODULES.read().unwrap().iter() { m.configure_service(scfg); } diff --git a/pagetop/src/service.rs b/pagetop/src/service.rs index 101fa8da..2f079616 100644 --- a/pagetop/src/service.rs +++ b/pagetop/src/service.rs @@ -35,23 +35,29 @@ macro_rules! new_static_files { #[macro_export] macro_rules! service_for_static_files { - ( $scfg:ident, $path:expr, $bundle:ident ) => {{ + ( $scfg:ident, $bundle:ident => $path:expr $(, [$root:expr, $relative:expr])? ) => {{ $crate::paste! { - let static_files = &$crate::config::SETTINGS.dev.static_files; - if static_files.is_empty() { - $scfg.service($crate::service::ResourceFiles::new( - $path, - [<static_files_ $bundle>]::$bundle(), - )); - } else { - $scfg.service( - $crate::service::ActixFiles::new( + let span = $crate::trace::debug_span!("Configuring static files ", path = $path); + let _ = span.in_scope(|| { + let mut serve_embedded:bool = true; + $( + if !$root.is_empty() && !$relative.is_empty() { + if let Ok(absolute) = $crate::util::absolute_dir($root, $relative) { + $scfg.service($crate::service::ActixFiles::new( + $path, + absolute, + ).show_files_listing()); + serve_embedded = false + } + } + )? + if serve_embedded { + $scfg.service($crate::service::ResourceFiles::new( $path, - $crate::concat_string!(static_files, $path), - ) - .show_files_listing(), - ); - } + [<static_files_ $bundle>]::$bundle(), + )); + } + }); } }}; } diff --git a/pagetop/src/trace.rs b/pagetop/src/trace.rs index 14e9bfe2..f37dd33c 100644 --- a/pagetop/src/trace.rs +++ b/pagetop/src/trace.rs @@ -18,7 +18,7 @@ use crate::{config, LazyStatic}; pub use tracing::{debug, error, info, trace, warn}; -pub use tracing::{event, span, Level}; +pub use tracing::{debug_span, error_span, info_span, trace_span, warn_span}; use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::EnvFilter; diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index f8e430d5..a2081b15 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -1,6 +1,9 @@ //! Functions and macro helpers. -use crate::Handle; +use crate::{trace, Handle}; + +use std::io; +use std::path::PathBuf; // ************************************************************************************************* // FUNCTIONS HELPERS. @@ -56,6 +59,35 @@ pub fn single_type_name<T: ?Sized>() -> &'static str { partial_type_name(std::any::type_name::<T>(), 1) } +pub fn absolute_dir( + root_path: impl Into<String>, + relative_path: impl Into<String>, +) -> Result<String, io::Error> { + let root_path = PathBuf::from(root_path.into()); + let full_path = root_path.join(relative_path.into()); + let absolute_dir = full_path.to_string_lossy().into(); + + if !full_path.is_absolute() { + let message = format!("Path \"{}\" is not absolute", absolute_dir); + trace::warn!(message); + return Err(io::Error::new(io::ErrorKind::InvalidInput, message)); + } + + if !full_path.exists() { + let message = format!("Path \"{}\" does not exist", absolute_dir); + trace::warn!(message); + return Err(io::Error::new(io::ErrorKind::NotFound, message)); + } + + if !full_path.is_dir() { + let message = format!("Path \"{}\" is not a directory", absolute_dir); + trace::warn!(message); + return Err(io::Error::new(io::ErrorKind::InvalidInput, message)); + } + + Ok(absolute_dir) +} + // ************************************************************************************************* // MACRO HELPERS. // ************************************************************************************************* From 63299dc3e057c113a674134a4d068954cfb3886a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 29 Oct 2023 21:38:51 +0100 Subject: [PATCH 588/853] =?UTF-8?q?=F0=9F=A5=85=20Tracing=20messages=20alw?= =?UTF-8?q?ays=20in=20default=20language?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/all.rs | 10 ++------ pagetop/src/db.rs | 17 +++++-------- pagetop/src/locale.rs | 41 +++++------------------------- pagetop/src/locale/en-US/trace.ftl | 8 ------ pagetop/src/locale/es-ES/trace.ftl | 8 ------ 5 files changed, 15 insertions(+), 69 deletions(-) delete mode 100644 pagetop/src/locale/en-US/trace.ftl delete mode 100644 pagetop/src/locale/es-ES/trace.ftl diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index ddbcd5b5..e4e2b923 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -114,8 +114,6 @@ pub fn init_modules() { #[cfg(feature = "database")] pub fn run_migrations() { if let Some(dbconn) = &*DBCONN { - use crate::locale::L10n; - if let Err(e) = run_now({ struct Migrator; impl MigratorTrait for Migrator { @@ -129,9 +127,7 @@ pub fn run_migrations() { } Migrator::up(SchemaManagerConnection::Connection(dbconn), None) }) { - L10n::l("db_migration_fail") - .with_arg("dberr", format!("{}", e)) - .error(); + trace::error!("Database upgrade failed ({})", e); }; if let Err(e) = run_now({ @@ -147,9 +143,7 @@ pub fn run_migrations() { } Migrator::down(SchemaManagerConnection::Connection(dbconn), None) }) { - L10n::l("db_migration_fail") - .with_arg("dberr", format!("{}", e)) - .error(); + trace::error!("Database downgrade failed ({})", e); }; } } diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 4560b716..aac2e073 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,6 +1,5 @@ //! Acceso unificado y normalizado a base de datos. -use crate::locale::L10n; use crate::{config, trace, LazyStatic}; pub use url::Url as DbUri; @@ -12,6 +11,8 @@ use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseBackend, Statem pub(crate) use futures::executor::block_on as run_now; +const DBCONN_NOT_INITIALIZED: &str = "Database connection not initialized"; + pub(crate) static DBCONN: LazyStatic<Option<DbConn>> = LazyStatic::new(|| { if !config::SETTINGS.database.db_name.trim().is_empty() { trace::info!( @@ -70,7 +71,7 @@ pub(crate) static DBCONN: LazyStatic<Option<DbConn>> = LazyStatic::new(|| { db_opt.max_connections(config::SETTINGS.database.max_pool_size); db_opt })) - .unwrap_or_else(|_| panic!("{}", L10n::l("db_connection_fail").to_string())), + .unwrap_or_else(|_| panic!("Failed to connect to database")), ) } else { None @@ -92,9 +93,7 @@ pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryRes )) .await } - None => Err(DbErr::Conn(RuntimeErr::Internal( - L10n::l("db_connection_not_initialized").debug(), - ))), + None => Err(DbErr::Conn(RuntimeErr::Internal(DBCONN_NOT_INITIALIZED.to_owned()))), } } @@ -113,9 +112,7 @@ pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryR )) .await } - None => Err(DbErr::Conn(RuntimeErr::Internal( - L10n::l("db_connection_not_initialized").debug(), - ))), + None => Err(DbErr::Conn(RuntimeErr::Internal(DBCONN_NOT_INITIALIZED.to_owned()))), } } @@ -127,9 +124,7 @@ pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { .execute(Statement::from_string(dbbackend, stmt)) .await } - None => Err(DbErr::Conn(RuntimeErr::Internal( - L10n::l("db_connection_not_initialized").debug(), - ))), + None => Err(DbErr::Conn(RuntimeErr::Internal(DBCONN_NOT_INITIALIZED.to_owned()))), } } diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 55e6197b..8f9be238 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -88,7 +88,7 @@ //! ``` use crate::html::{Markup, PreEscaped}; -use crate::{config, kv, trace, LazyStatic, LOCALES_PAGETOP}; +use crate::{config, kv, LazyStatic, LOCALES_PAGETOP}; pub use fluent_templates; pub use unic_langid::LanguageIdentifier; @@ -129,9 +129,12 @@ pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdenti if language.is_empty() { Ok(&LANGID_FALLBACK) } else { - Err(L10n::l(LANGUAGE_SET_FAILURE) - .with_arg("language", config::SETTINGS.app.language.as_str()) - .debug()) + Err(format!( + "{} Unicode Language Identifier \"{}\" is not accepted. {}", + "Failed to set language.", + config::SETTINGS.app.language, + "Using \"en-US\", check the settings file" + )) } } } @@ -239,36 +242,6 @@ impl L10n { pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { PreEscaped(self.using(langid).unwrap_or_default()) } - - pub fn trace(&self) -> String { - let message = self.to_string(); - trace::trace!(message); - message - } - - pub fn debug(&self) -> String { - let message = self.to_string(); - trace::debug!(message); - message - } - - pub fn info(&self) -> String { - let message = self.to_string(); - trace::info!(message); - message - } - - pub fn warn(&self) -> String { - let message = self.to_string(); - trace::warn!(message); - message - } - - pub fn error(&self) -> String { - let message = self.to_string(); - trace::error!(message); - message - } } impl ToString for L10n { diff --git a/pagetop/src/locale/en-US/trace.ftl b/pagetop/src/locale/en-US/trace.ftl deleted file mode 100644 index f0cd654d..00000000 --- a/pagetop/src/locale/en-US/trace.ftl +++ /dev/null @@ -1,8 +0,0 @@ -# DEBUG. - -# ERRORS. -language_set_failure = Failed to set language. Unicode Language Identifier "{$language}" is not accepted. Using "en-US", check the settings file - -db_connection_fail = Failed to connect to database -db_connection_not_initialized = Database connection not initialized -db_migration_fail = Database update failed (${dberr}) diff --git a/pagetop/src/locale/es-ES/trace.ftl b/pagetop/src/locale/es-ES/trace.ftl deleted file mode 100644 index 4fdad1e9..00000000 --- a/pagetop/src/locale/es-ES/trace.ftl +++ /dev/null @@ -1,8 +0,0 @@ -# DEBUG. - -# ERRORS. -language_set_failure = Fallo al asignar idioma. El Identificador de Lenguaje Unicode "{$language}" no es válido. Se usará "en-US". Comprobar archivo de configuración - -db_connection_fail = Fallo al conectar con la base de datos -db_connection_not_initialized = Conexión a la base de datos no inicializada -db_migration_fail = Fallo al actualizar base de datos (${dberr}) From a6b6130f4fba79138522eb7c6f02f3875d18d0fa Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 1 Nov 2023 19:40:37 +0100 Subject: [PATCH 589/853] =?UTF-8?q?=F0=9F=9A=A7=20Working=20on=20theming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 88 +++++++++++------ pagetop-bootsier/static/css/styles.css | 7 ++ pagetop-bulmix/src/lib.rs | 46 ++++----- pagetop-homedemo/src/lib.rs | 12 +-- pagetop-homedemo/static/css/styles.css | 2 +- pagetop/src/base/component.rs | 41 +++++++- pagetop/src/base/component/heading.rs | 48 +++++---- pagetop/src/base/component/icon.rs | 4 +- pagetop/src/base/component/paragraph.rs | 45 ++------- pagetop/src/core/theme/definition.rs | 39 +++++--- pagetop/src/html/opt_classes.rs | 2 +- pagetop/src/response/page.rs | 34 +++---- pagetop/static/base/css/inception.css | 91 ++++++++++++----- pagetop/static/base/css/looks.css | 125 +++++++++++++++++++++++- pagetop/static/base/css/root.css | 59 ++++++----- 15 files changed, 436 insertions(+), 207 deletions(-) create mode 100644 pagetop-bootsier/static/css/styles.css diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 9b6607ee..33a29279 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -18,7 +18,7 @@ impl ModuleTrait for Bootsier { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - service_for_static_files!(scfg, "/bootsier", bootsier); + service_for_static_files!(scfg, bootsier => "/bootsier"); } } @@ -47,36 +47,23 @@ impl ThemeTrait for Bootsier { "side-menu", "content" ] { - @if let Some(content) = page.prepare_region(region) { - #(region) class="region" { (content) } - } + (self.prepare_region(page, region)) } } }, - _ => { - let header = page.prepare_region("header"); - let nav_branding = page.prepare_region("nav_branding"); - let nav_main = page.prepare_region("nav_main"); - let nav_additional = page.prepare_region("nav_additional"); - let breadcrumb = page.prepare_region("breadcrumb"); - let content = page.prepare_region("content"); - let sidebar_first = page.prepare_region("sidebar_first"); - let sidebar_second = page.prepare_region("sidebar_second"); - let footer = page.prepare_region("footer"); - html! { - body class=[page.body_classes().get()] { - (header.unwrap_or_default()) - (nav_branding.unwrap_or_default()) - (nav_main.unwrap_or_default()) - (nav_additional.unwrap_or_default()) - (breadcrumb.unwrap_or_default()) - (content.unwrap_or_default()) - (sidebar_first.unwrap_or_default()) - (sidebar_second.unwrap_or_default()) - (footer.unwrap_or_default()) - } + _ => html! { + body class=[page.body_classes().get()] { + (self.prepare_region(page, "header")) + (self.prepare_region(page, "nav_branding")) + (self.prepare_region(page, "nav_main")) + (self.prepare_region(page, "nav_additional")) + (self.prepare_region(page, "breadcrumb")) + (self.prepare_region(page, "content")) + (self.prepare_region(page, "sidebar_first")) + (self.prepare_region(page, "sidebar_second")) + (self.prepare_region(page, "footer")) } - } + }, } } @@ -92,7 +79,52 @@ impl ThemeTrait for Bootsier { .with_version("5.1.3") .with_weight(-99), )) - .alter_context(ContextOp::AddBaseAssets); + .alter_context(ContextOp::AddBaseAssets) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/bootsier/css/styles.css") + .with_version("0.0.1"), + )); +} + + #[rustfmt::skip] + fn before_prepare_component( + &self, + component: &mut dyn ComponentTrait, + _cx: &mut Context, + ) { + match component.handle() { + COMPONENT_BASE_HEADING => { + let h = component_as_mut::<Heading>(component); + let original = h.display().to_string(); + h.alter_classes( + ClassesOp::SetDefault, + match h.display() { + HeadingDisplay::ExtraLarge => "display-1", + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::XLarge => "display-3", + HeadingDisplay::Large => "display-4", + HeadingDisplay::Medium => "display-5", + _ => original.as_str(), + }, + ); + } + COMPONENT_BASE_PARAGRAPH => { + let p = component_as_mut::<Paragraph>(component); + let original = p.font_size().to_string(); + p.alter_classes( + ClassesOp::SetDefault, + match p.font_size() { + FontSize::ExtraLarge => "fs-1", + FontSize::XxLarge => "fs-2", + FontSize::XLarge => "fs-3", + FontSize::Large => "fs-4", + FontSize::Medium => "fs-5", + _ => original.as_str(), + }, + ); + } + _ => {} + } } fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { diff --git a/pagetop-bootsier/static/css/styles.css b/pagetop-bootsier/static/css/styles.css new file mode 100644 index 00000000..a26bdd57 --- /dev/null +++ b/pagetop-bootsier/static/css/styles.css @@ -0,0 +1,7 @@ +/* OVERRIDE COMPONENT STYLES */ + +/* Heading component */ + +.pt-heading__subtitle { + margin-top: calc(-1 * var(--pt-gap-0-5)); +} diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 38ad6f5a..ffa1dd18 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -16,7 +16,7 @@ impl ModuleTrait for Bulmix { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - service_for_static_files!(scfg, "/bulmix", bulmix); + service_for_static_files!(scfg, bulmix => "/bulmix"); } } @@ -50,32 +50,30 @@ impl ThemeTrait for Bulmix { } COMPONENT_BASE_HEADING => { let h = component_as_mut::<Heading>(component); - h.alter_classes( - ClassesOp::SetDefault, - match h.display() { - HeadingDisplay::XxLarge => "title is-1", - HeadingDisplay::Large => "title is-2", - HeadingDisplay::Medium => "title is-3", - HeadingDisplay::Small => "title is-4", - HeadingDisplay::XxSmall => "title is-5", - HeadingDisplay::Normal => "title", - HeadingDisplay::Subtitle => "subtitle", - }, - ); + match h.display() { + HeadingDisplay::Subtitle => h.alter_classes( + ClassesOp::SetDefault, "subtitle" + ), + _ => h.alter_classes( + ClassesOp::AddDefault, "title" + ), + }; } COMPONENT_BASE_PARAGRAPH => { let p = component_as_mut::<Paragraph>(component); + let original = concat_string!("block ", p.font_size().to_string()); p.alter_classes( ClassesOp::SetDefault, - match p.display() { - ParagraphDisplay::XxLarge => "is-size-2", - ParagraphDisplay::Large => "is-size-3", - ParagraphDisplay::Medium => "is-size-4", - ParagraphDisplay::Small => "is-size-5", - ParagraphDisplay::XxSmall => "is-size-6", - ParagraphDisplay::Normal => "", + match p.font_size() { + FontSize::ExtraLarge => "block is-size-1", + FontSize::XxLarge => "block is-size-2", + FontSize::XLarge => "block is-size-3", + FontSize::Large => "block is-size-4", + FontSize::Medium => "block is-size-5", + _ => original.as_str(), }, ); + } _ => {} } @@ -84,14 +82,18 @@ impl ThemeTrait for Bulmix { fn render_component( &self, component: &dyn ComponentTrait, - _cx: &mut Context, + cx: &mut Context, ) -> Option<Markup> { match component.handle() { COMPONENT_BASE_ICON => { let icon = component_as_ref::<Icon>(component); + if icon.icon_name().is_empty() { + return None + }; + cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); Some(html! { span class="icon" { - i class=[icon.classes().get()] {}; + i class=[icon.classes().get()] {} } }) } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 901eaa4f..062939dd 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for HomeDemo { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - service_for_static_files!(scfg, "/homedemo", homedemo); + service_for_static_files!(scfg, homedemo => "/homedemo"); scfg.route("/", service::web::get().to(demo)); } } @@ -62,7 +62,7 @@ fn hello_world() -> Wrapper { &config::SETTINGS.app.name, ), )) - .with_display(ParagraphDisplay::Small), + .with_font_size(FontSize::Medium), ) .add_component(Paragraph::translated( L10n::t("hello_powered", &LOCALES_HOMEDEMO).with_arg( @@ -114,7 +114,7 @@ fn welcome() -> Wrapper { ) .add_component( Paragraph::translated(L10n::t("welcome_text1", &LOCALES_HOMEDEMO)) - .with_display(ParagraphDisplay::Small), + .with_font_size(FontSize::Medium), ) .add_component(Paragraph::translated(L10n::t( "welcome_text2", @@ -138,7 +138,7 @@ fn about_pagetop() -> Wrapper { .add_component(Heading::h2(L10n::t("pagetop_title", &LOCALES_HOMEDEMO))) .add_component( Paragraph::translated(L10n::t("pagetop_text1", &LOCALES_HOMEDEMO)) - .with_display(ParagraphDisplay::Small), + .with_font_size(FontSize::Medium), ) .add_component(Paragraph::translated(L10n::t( "pagetop_text2", @@ -174,7 +174,7 @@ fn promo_pagetop() -> Wrapper { ), ), ) - .with_display(ParagraphDisplay::Small), + .with_font_size(FontSize::Medium), ), ) .add_item( @@ -205,7 +205,7 @@ fn reporting_issues() -> Wrapper { ))) .add_component( Paragraph::translated(L10n::t("report_problems_text1", &LOCALES_HOMEDEMO)) - .with_display(ParagraphDisplay::Small), + .with_font_size(FontSize::Medium), ) .add_component(Paragraph::translated(L10n::t( "report_problems_text2", diff --git a/pagetop-homedemo/static/css/styles.css b/pagetop-homedemo/static/css/styles.css index a02d76f1..5034d72e 100644 --- a/pagetop-homedemo/static/css/styles.css +++ b/pagetop-homedemo/static/css/styles.css @@ -1,5 +1,5 @@ body.default-homepage span.app-name { - font-weight: bold; + font-weight: 400; color: inherit; } diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 6ce6c84f..09122f96 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -49,6 +49,8 @@ pub(crate) fn add_base_assets(cx: &mut Context) { )); } +// ************************************************************************************************* + #[rustfmt::skip] #[derive(Default)] pub enum BreakPoint { @@ -79,6 +81,43 @@ impl ToString for BreakPoint { } } +// ************************************************************************************************* + +#[derive(Default)] +pub enum FontSize { + ExtraLarge, + XxLarge, + XLarge, + Large, + Medium, + #[default] + Normal, + Small, + XSmall, + XxSmall, + ExtraSmall, +} + +#[rustfmt::skip] +impl ToString for FontSize { + fn to_string(&self) -> String { + match self { + FontSize::ExtraLarge => "pt-fs__x3l".to_string(), + FontSize::XxLarge => "pt-fs__x2l".to_string(), + FontSize::XLarge => "pt-fs__xl".to_string(), + FontSize::Large => "pt-fs__l".to_string(), + FontSize::Medium => "pt-fs__m".to_string(), + FontSize::Normal => "".to_string(), + FontSize::Small => "pt-fs__s".to_string(), + FontSize::XSmall => "pt-fs__xs".to_string(), + FontSize::XxSmall => "pt-fs__x2s".to_string(), + FontSize::ExtraSmall => "pt-fs__x3s".to_string(), + } + } +} + +// ************************************************************************************************* + mod html; pub use html::{Html, COMPONENT_BASE_HTML}; @@ -95,7 +134,7 @@ pub use icon::{Icon, COMPONENT_BASE_ICON}; mod heading; pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_BASE_HEADING}; mod paragraph; -pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_BASE_PARAGRAPH}; +pub use paragraph::{Paragraph, COMPONENT_BASE_PARAGRAPH}; mod anchor; pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_BASE_ANCHOR}; mod image; diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index af42e5fe..18c6074e 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -15,16 +15,31 @@ pub enum HeadingType { #[derive(Default)] pub enum HeadingDisplay { - #[default] - Normal, + ExtraLarge, XxLarge, + XLarge, Large, Medium, - Small, - XxSmall, + #[default] + Normal, Subtitle, } +#[rustfmt::skip] +impl ToString for HeadingDisplay { + fn to_string(&self) -> String { + match self { + HeadingDisplay::ExtraLarge => "pt-heading__title-x3l".to_string(), + HeadingDisplay::XxLarge => "pt-heading__title-x2l".to_string(), + HeadingDisplay::XLarge => "pt-heading__title-xl".to_string(), + HeadingDisplay::Large => "pt-heading__title-l".to_string(), + HeadingDisplay::Medium => "pt-heading__title-m".to_string(), + HeadingDisplay::Normal => "".to_string(), + HeadingDisplay::Subtitle => "pt-heading__subtitle".to_string(), + } + } +} + #[rustfmt::skip] #[derive(Default)] pub struct Heading { @@ -35,7 +50,6 @@ pub struct Heading { heading_type: HeadingType, text : OptionTranslated, display : HeadingDisplay, - template : String, } impl ComponentTrait for Heading { @@ -151,28 +165,14 @@ impl Heading { #[rustfmt::skip] #[fn_builder] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { - self.alter_classes( - ClassesOp::SetDefault, - match display { - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::Large => "display-3", - HeadingDisplay::Medium => "display-4", - HeadingDisplay::Small => "display-5", - HeadingDisplay::XxSmall => "display-6", - HeadingDisplay::Normal => "", - HeadingDisplay::Subtitle => "", - }, + self.classes.alter_value( + ClassesOp::Replace(self.display.to_string()), + display.to_string(), ); self.display = display; self } - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Paragraph GETTERS. pub fn classes(&self) -> &OptionClasses { @@ -190,8 +190,4 @@ impl Heading { pub fn display(&self) -> &HeadingDisplay { &self.display } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index af66d1cf..9f429f32 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -29,8 +29,10 @@ impl ComponentTrait for Icon { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + if self.icon_name().is_empty() { + return PrepareMarkup::None + } cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); - PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) } } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 39d54a8c..6a95e69c 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -2,17 +2,6 @@ use crate::prelude::*; new_handle!(COMPONENT_BASE_PARAGRAPH); -#[derive(Default)] -pub enum ParagraphDisplay { - #[default] - Normal, - XxLarge, - Large, - Medium, - Small, - XxSmall, -} - #[rustfmt::skip] #[derive(Default)] pub struct Paragraph { @@ -21,8 +10,7 @@ pub struct Paragraph { id : OptionId, classes : OptionClasses, stuff : ArcComponents, - display : ParagraphDisplay, - template : String, + font_size : FontSize, } impl ComponentTrait for Paragraph { @@ -112,25 +100,12 @@ impl Paragraph { #[rustfmt::skip] #[fn_builder] - pub fn alter_display(&mut self, display: ParagraphDisplay) -> &mut Self { - self.alter_classes( - ClassesOp::SetDefault, - match display { - ParagraphDisplay::XxLarge => "fs-2", - ParagraphDisplay::Large => "fs-3", - ParagraphDisplay::Medium => "fs-4", - ParagraphDisplay::Small => "fs-5", - ParagraphDisplay::XxSmall => "fs-6", - ParagraphDisplay::Normal => "", - }, + pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.font_size.to_string()), + font_size.to_string(), ); - self.display = display; - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); + self.font_size = font_size; self } @@ -144,11 +119,7 @@ impl Paragraph { &self.stuff } - pub fn display(&self) -> &ParagraphDisplay { - &self.display - } - - pub fn template(&self) -> &str { - self.template.as_str() + pub fn font_size(&self) -> &FontSize { + &self.font_size } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index c5b1be5a..c73edc12 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -1,6 +1,6 @@ use crate::core::component::{ComponentTrait, Context}; use crate::core::module::ModuleTrait; -use crate::html::{html, Favicon, Markup}; +use crate::html::{html, Favicon, Markup, OptionId}; use crate::locale::L10n; use crate::response::page::Page; use crate::{concat_string, config}; @@ -20,16 +20,27 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { ] } + fn prepare_region(&self, page: &mut Page, region: &str) -> Markup { + let render_region = page.components_in(region).prepare(page.context()); + if render_region.is_empty() { + html! {} + } else { + let id = OptionId::with(region).get().unwrap(); + let id_inner = concat_string!(id, "__inner"); + html! { + div id=(id) class="pt-region" { + div id=(id_inner) class="pt-region__inner" { + (render_region) + } + } + } + } + } + #[allow(unused_variables)] fn before_prepare_body(&self, page: &mut Page) {} fn prepare_body(&self, page: &mut Page) -> Markup { - let header = page.prepare_region("header"); - let pagetop = page.prepare_region("pagetop"); - let content = page.prepare_region("content"); - let sidebar = page.prepare_region("sidebar"); - let footer = page.prepare_region("footer"); - let skip_to = concat_string!("#", page.skip_to().get().unwrap_or("content".to_owned())); html! { @@ -41,11 +52,15 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } div class="pt-body__wrapper" { div class="pt-body__regions" { - (header.unwrap_or_default()) - (pagetop.unwrap_or_default()) - (content.unwrap_or_default()) - (sidebar.unwrap_or_default()) - (footer.unwrap_or_default()) + (self.prepare_region(page, "header")) + (self.prepare_region(page, "pagetop")) + div class="pt-content" { + div class="pt-content__wrapper" { + (self.prepare_region(page, "content")) + (self.prepare_region(page, "sidebar")) + } + } + (self.prepare_region(page, "footer")) } } } diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index 9bbd8766..a3f0444e 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -72,7 +72,7 @@ impl OptionClasses { } ClassesOp::Replace(classes_to_replace) => { let mut pos = self.0.len(); - let mut class_type = ClassType::User; + let mut class_type = ClassType::Default; let replace: Vec<&str> = classes_to_replace.split_ascii_whitespace().collect(); for class in replace { if let Some(replace_pos) = self.0.iter().position(|(c, _)| c.eq(class)) { diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 1ce43fdb..f947c106 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,5 +1,5 @@ use crate::base::action::page::{run_actions_after_prepare_body, run_actions_before_prepare_body}; -use crate::core::component::{ArcComponent, ComponentTrait}; +use crate::core::component::{ArcComponent, ArcComponents as RegionComponents, ComponentTrait}; use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Markup, DOCTYPE}; @@ -21,8 +21,8 @@ pub struct Page { favicon : Option<Favicon>, context : Context, body_classes: OptionClasses, - regions : ComponentsRegions, skip_to : OptionId, + regions : ComponentsRegions, template : String, } @@ -37,8 +37,8 @@ impl Page { favicon : None, context : Context::new(request), body_classes: OptionClasses::new(), - regions : ComponentsRegions::new(), skip_to : OptionId::new(), + regions : ComponentsRegions::new(), template : "default".to_owned(), } } @@ -88,14 +88,14 @@ impl Page { } #[fn_builder] - pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_in(region, ArcComponent::with(component)); + pub fn alter_skip_to(&mut self, id: impl Into<String>) -> &mut Self { + self.skip_to.alter_value(id); self } #[fn_builder] - pub fn alter_skip_to(&mut self, id: impl Into<String>) -> &mut Self { - self.skip_to.alter_value(id); + pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { + self.regions.add_in(region, ArcComponent::with(component)); self } @@ -139,6 +139,10 @@ impl Page { &self.skip_to } + pub fn components_in(&self, region: &str) -> RegionComponents { + self.regions.get_components(self.context.theme(), region) + } + pub fn template(&self) -> &str { self.template.as_str() } @@ -178,20 +182,4 @@ impl Page { } }) } - - pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { - let render = self - .regions - .get_components(self.context.theme(), region) - .prepare(self.context()); - if render.is_empty() { - None - } else { - Some(html! { - div id=[OptionId::with(region).get()] class="region" { - (render) - } - }) - } - } } diff --git a/pagetop/static/base/css/inception.css b/pagetop/static/base/css/inception.css index 165a9536..29fb2c3a 100644 --- a/pagetop/static/base/css/inception.css +++ b/pagetop/static/base/css/inception.css @@ -5,40 +5,87 @@ html { body { margin: 0; font-family: var(--pt-font-family); - font-size: var(--pt-font-size-base); - font-weight: var(--pt-font-weight); - line-height: var(--pt-line-height-base); + font-size: var(--pt-fs--base); + font-weight: var(--pt-fw--base); + line-height: var(--pt-lh--base); color: var(--pt-color); background-color: var(--pt-color--bg); -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; } -.pt-body__skip { - display: flex; - justify-content: center; +/* TYPOGRAPHY */ + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: var(--pt-gap-0-9); + font-weight: var(--pt-fw--bold); + line-height: var(--pt-lh--header); } -.pt-body__skip a { - display: block; - padding: var(--pt-gap-0-5) var(--pt-gap-1-5); - color: var(--pt-color--white); - background-color: var(--pt-color--gray-5); - text-decoration: none; - outline: 0; - position: absolute; - transform: translateY(-100%); - transition: all 0.3s ease-in-out; - z-index: 9999; +h1 { + font-size: var(--pt-fs--x3l); } -.pt-body__skip a:after { - content: "\0020 ➔"; +h2 { + font-size: var(--pt-fs--x2l); } -.pt-body__skip a:focus { - transform: translateY(0%); +h3 { + font-size: var(--pt-fs--xl); +} +h4 { + font-size: var(--pt-fs--l); +} +h5 { + font-size: var(--pt-fs--m); +} +h6 { + font-size: var(--pt-fs--base); +} +/* LG - Applies <= 992px */ +@media screen and (max-width: 62em) { + h1 { + font-size: calc(var(--pt-fs--l) + 1.25vw); + } + h2 { + font-size: calc(var(--pt-fs--l) + 0.6vw); + } + h3 { + font-size: calc(var(--pt-fs--m) + 0.6vw); + } + h4 { + font-size: calc(var(--pt-fs--m) + 0.3vw); + } } -.pt-body__wrapper { +p { + margin-top: 0; + margin-bottom: var(--pt-gap-0-9); +} + +/* LAYOUT */ + +#header__inner, +.pt-content__wrapper, +#footer__inner { width: 100%; max-width: var(--pt-max-width); margin: 0 auto; } + +#header { + background: var(--pt-color--white); +} +.pt-content__wrapper { + background: var(--pt-color--white); +} + +#footer { + background: linear-gradient(180deg, var(--pt-color--gray-5) 0%, var(--pt-color--gray-10) 100%); +} +#footer__inner { + color: var(--pt-color--gray-65); + background: var(--pt-color--gray-20); + padding: var(--pt-gap-3) 0 var(--pt-gap-12); +} +#footer__inner a { + color: var(--pt-color--white); +} diff --git a/pagetop/static/base/css/looks.css b/pagetop/static/base/css/looks.css index a98948ee..24a3534c 100644 --- a/pagetop/static/base/css/looks.css +++ b/pagetop/static/base/css/looks.css @@ -1,3 +1,122 @@ +/* SKIP TO MAIN CONTENT */ + +.pt-body__skip { + display: flex; + justify-content: center; +} +.pt-body__skip a { + display: block; + padding: var(--pt-gap-0-5) var(--pt-gap-1-5); + color: var(--pt-color--white); + background-color: var(--pt-color--gray-5); + text-decoration: none; + outline: 0; + position: absolute; + transform: translateY(-100%); + transition: all 0.3s ease-in-out; + z-index: 9999; +} +.pt-body__skip a:after { + content: "\0020 ➔"; +} +.pt-body__skip a:focus { + transform: translateY(0%); +} + +/* TYPOGRAPHY */ + +.pt-fs__x3l { + font-size: var(--pt-fs--x3l) !important; +} +.pt-fs__x2l { + font-size: var(--pt-fs--x2l) !important; +} +.pt-fs__xl { + font-size: var(--pt-fs--xl) !important; +} +.pt-fs__l { + font-size: var(--pt-fs--l) !important; +} +.pt-fs__m { + font-size: var(--pt-fs--m) !important; +} +.pt-fs__s { + font-size: var(--pt-fs--s) !important; +} +.pt-fs__xs { + font-size: var(--pt-fs--xs) !important; +} +.pt-fs__x2s { + font-size: var(--pt-fs--x2s) !important; +} +.pt-fs__x3s { + font-size: var(--pt-fs--x3s) !important; +} +/* LG - Applies <= 992px */ +@media screen and (max-width: 62em) { + .pt-fs__x3l { + font-size: calc(var(--pt-fs--l) + 1.25vw) !important; + } + .pt-fs__x2l { + font-size: calc(var(--pt-fs--l) + 0.6vw) !important; + } + .pt-fs__xl { + font-size: calc(var(--pt-fs--m) + 0.6vw) !important; + } + .pt-fs__l { + font-size: calc(var(--pt-fs--m) + 0.3vw) !important; + } +} + +/* COMPONENT STYLES */ + +/* Heading component */ + +.pt-heading__title-x3l, +.pt-heading__title-x2l, +.pt-heading__title-xl, +.pt-heading__title-l, +.pt-heading__title-m, +.pt-heading__subtitle { + font-weight: var(--pt-fw--light); +} +.pt-heading__title-x3l { + font-size: calc(var(--pt-fs--x3l) * 2); +} +.pt-heading__title-x2l { + font-size: calc(var(--pt-fs--x3l) * 1.8); +} +.pt-heading__title-xl { + font-size: calc(var(--pt-fs--x3l) * 1.6); +} +.pt-heading__title-l { + font-size: calc(var(--pt-fs--x3l) * 1.4); +} +.pt-heading__title-m { + font-size: calc(var(--pt-fs--x3l) * 1.2); +} +.pt-heading__subtitle { + margin-top: calc(-1 * var(--pt-gap-0-75)); +} +/* LG - Applies <= 992px */ +@media screen and (max-width: 62em) { + .pt-heading__title-x3l { + font-size: calc((var(--pt-fs--x3l) / 1.5) + 4.5vw); + } + .pt-heading__title-x2l { + font-size: calc((var(--pt-fs--x3l) / 1.6) + 3.9vw); + } + .pt-heading__title-xl { + font-size: calc((var(--pt-fs--x3l) / 1.6) + 3.3vw); + } + .pt-heading__title-l { + font-size: calc((var(--pt-fs--x3l) / 1.7) + 2.7vw); + } + .pt-heading__title-m { + font-size: calc((var(--pt-fs--x3l) / 1.7) + 2.1vw); + } +} + /* Image component */ .pt-img__fluid { @@ -14,10 +133,10 @@ } .pt-branding__name { letter-spacing: 0.02em; - font-size: var(--pt-font-size-xl); + font-size: var(--pt-fs--l); } .pt-branding__slogan { - font-size: var(--pt-font-size-l); + font-size: var(--pt-fs--m); } /* SM - Applies <= 568px */ @@ -29,7 +148,7 @@ /* LG - Applies <= 992px */ @media (max-width: 62em) { .pt-branding__slogan { - font-size: var(--pt-font-size-l); + font-size: var(--pt-fs--base); } } diff --git a/pagetop/static/base/css/root.css b/pagetop/static/base/css/root.css index 2a5060bb..c9c403df 100644 --- a/pagetop/static/base/css/root.css +++ b/pagetop/static/base/css/root.css @@ -3,15 +3,26 @@ --pt-font-serif: "Lora","georgia",serif; --pt-font-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; --pt-font-family: var(--pt-font-sans); - --pt-font-size-base: 1rem; - --pt-font-size-xxl: 1.875rem; - --pt-font-size-xl: 1.375rem; - --pt-font-size-l: 1.125rem; - --pt-font-size-s: 0.875rem; - --pt-font-size-xs: 0.8125rem; - --pt-font-size-xxs: 0.75rem; - --pt-font-weight: 400; - --pt-line-height-base: 1.5; + + /* Font size */ + --pt-fs--x3l: 2.5rem; + --pt-fs--x2l: 2rem; + --pt-fs--xl: 1.75rem; + --pt-fs--l: 1.5rem; + --pt-fs--m: 1.25rem; + --pt-fs--base: 1rem; + --pt-fs--s: 0.875rem; + --pt-fs--xs: 0.75rem; + --pt-fs--x2s: 0.5625rem; + --pt-fs--x3s: 0.375rem; + /* Font weight */ + --pt-fw--light: 300; + --pt-fw--base: 400; + --pt-fw--bold: 500; + /* Line height */ + --pt-lh--base: 1.5; + --pt-lh--header: 1.2; + --pt-max-width: 90rem; /* --pt-color-rgb: 33,37,41; @@ -71,13 +82,11 @@ } */ :root { -/* --pt-gap-0-25: calc(0.25 * var(--pt-gap)); -*/ --pt-gap-0-5: calc(0.5 * var(--pt-gap)); --pt-gap-0-75: calc(0.75 * var(--pt-gap)); + --pt-gap-0-9: calc(0.9 * var(--pt-gap)); --pt-gap-1-5: calc(1.5 * var(--pt-gap)); -/* --pt-gap-2: calc(2 * var(--pt-gap)); --pt-gap-2-5: calc(2.5 * var(--pt-gap)); --pt-gap-3: calc(3 * var(--pt-gap)); @@ -90,7 +99,15 @@ --pt-gap-10: calc(10 * var(--pt-gap)); --pt-gap-11: calc(11 * var(--pt-gap)); --pt-gap-12: calc(12 * var(--pt-gap)); -*/ + + --pt-color--primary-hue: 202; + --pt-color--primary-saturation: 79%; + --pt-color--primary-lightness: 50; + --pt-color--primary-30: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) - (0.36 * var(--pt-color--primary-lightness))))); + --pt-color--primary-40: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) - (0.24 * var(--pt-color--primary-lightness))))); + --pt-color--primary-50: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * var(--pt-color--primary-lightness))); + --pt-color--primary-60: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) + (0.24 * (100 - var(--pt-color--primary-lightness)))))); + --pt-color--primary-80: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) + (0.85 * (100 - var(--pt-color--primary-lightness)))))); --pt-color--gray-hue: 201; --pt-color--gray-saturation: 15%; @@ -106,23 +123,17 @@ --pt-color--gray-100: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),97%); --pt-color--white: #fff; - --pt-color--bg: var(--pt-color--white); + --pt-color--bg: #fafafa; --pt-color: #212529; /* - --color--primary-hue: 202; - --color--primary-saturation: 79%; - --color--primary-lightness: 50; - --color--primary-30: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) - (0.36 * var(--color--primary-lightness))))); - --color--primary-40: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) - (0.24 * var(--color--primary-lightness))))); - --color--primary-50: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * var(--color--primary-lightness))); - --color--primary-60: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) + (0.24 * (100 - var(--color--primary-lightness)))))); - --color--primary-80: hsl(var(--color--primary-hue),var(--color--primary-saturation),calc(1% * (var(--color--primary-lightness) + (0.85 * (100 - var(--color--primary-lightness)))))); + + --color-text-neutral-soft: var(--color--gray-45); --color-text-neutral-medium: var(--color--gray-20); --color-text-neutral-loud: var(--color--gray-5); - --color-text-primary-medium: var(--color--primary-40); - --color-text-primary-loud: var(--color--primary-30); + --color-text-primary-medium: var(--pt-color--primary-40); + --color-text-primary-loud: var(--pt-color--primary-30); --color--black: #000; */ /* From 556a160c16b008dcdae91f356b78a253a7b0de2e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 1 Nov 2023 21:16:29 +0100 Subject: [PATCH 590/853] =?UTF-8?q?=F0=9F=9A=A7=20Working=20on=20theming:?= =?UTF-8?q?=20anchor=20and=20icon=20font=20sizes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 94 ++++++++++++++------ pagetop-bulmix/src/lib.rs | 112 ++++++++++++++++-------- pagetop-homedemo/src/lib.rs | 6 +- pagetop/src/base/component/anchor.rs | 45 ++++++---- pagetop/src/base/component/icon.rs | 39 ++++++--- pagetop/src/base/component/paragraph.rs | 31 ++++--- 6 files changed, 216 insertions(+), 111 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 33a29279..b80e96c1 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -81,18 +81,54 @@ impl ThemeTrait for Bootsier { )) .alter_context(ContextOp::AddBaseAssets) .alter_context(ContextOp::AddStyleSheet( - StyleSheet::at("/bootsier/css/styles.css") - .with_version("0.0.1"), + StyleSheet::at("/bootsier/css/styles.css").with_version("0.0.1"), )); -} + } - #[rustfmt::skip] - fn before_prepare_component( - &self, - component: &mut dyn ComponentTrait, - _cx: &mut Context, - ) { + fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { + COMPONENT_BASE_ICON => { + let i = component_as_mut::<Icon>(component); + match i.font_size() { + FontSize::ExtraLarge => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-1"); + } + FontSize::XxLarge => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-2"); + } + FontSize::XLarge => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-3"); + } + FontSize::Large => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-4"); + } + FontSize::Medium => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-5"); + } + _ => {} + }; + } + COMPONENT_BASE_ANCHOR => { + let a = component_as_mut::<Anchor>(component); + match a.font_size() { + FontSize::ExtraLarge => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-1"); + } + FontSize::XxLarge => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-2"); + } + FontSize::XLarge => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-3"); + } + FontSize::Large => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-4"); + } + FontSize::Medium => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-5"); + } + _ => {} + }; + } COMPONENT_BASE_HEADING => { let h = component_as_mut::<Heading>(component); let original = h.display().to_string(); @@ -100,28 +136,34 @@ impl ThemeTrait for Bootsier { ClassesOp::SetDefault, match h.display() { HeadingDisplay::ExtraLarge => "display-1", - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::XLarge => "display-3", - HeadingDisplay::Large => "display-4", - HeadingDisplay::Medium => "display-5", - _ => original.as_str(), + HeadingDisplay::XxLarge => "display-2", + HeadingDisplay::XLarge => "display-3", + HeadingDisplay::Large => "display-4", + HeadingDisplay::Medium => "display-5", + _ => original.as_str(), }, ); } COMPONENT_BASE_PARAGRAPH => { let p = component_as_mut::<Paragraph>(component); - let original = p.font_size().to_string(); - p.alter_classes( - ClassesOp::SetDefault, - match p.font_size() { - FontSize::ExtraLarge => "fs-1", - FontSize::XxLarge => "fs-2", - FontSize::XLarge => "fs-3", - FontSize::Large => "fs-4", - FontSize::Medium => "fs-5", - _ => original.as_str(), - }, - ); + match p.font_size() { + FontSize::ExtraLarge => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-1"); + } + FontSize::XxLarge => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-2"); + } + FontSize::XLarge => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-3"); + } + FontSize::Large => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-4"); + } + FontSize::Medium => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-5"); + } + _ => {} + }; } _ => {} } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index ffa1dd18..af15fa53 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -31,64 +31,100 @@ impl ThemeTrait for Bulmix { .alter_context(ContextOp::AddBaseAssets); } - #[rustfmt::skip] - fn before_prepare_component( - &self, - component: &mut dyn ComponentTrait, - _cx: &mut Context, - ) { + fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { + COMPONENT_BASE_ICON => { + let i = component_as_mut::<Icon>(component); + match i.font_size() { + FontSize::ExtraLarge => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-1"); + } + FontSize::XxLarge => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-2"); + } + FontSize::XLarge => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-3"); + } + FontSize::Large => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-4"); + } + FontSize::Medium => { + i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-5"); + } + _ => {} + }; + } COMPONENT_BASE_ANCHOR => { let a = component_as_mut::<Anchor>(component); - a.alter_classes( - ClassesOp::SetDefault, - match a.anchor_type() { - AnchorType::Button => "button is-primary", - _ => "", - }, - ); + match a.font_size() { + FontSize::ExtraLarge => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-1"); + } + FontSize::XxLarge => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-2"); + } + FontSize::XLarge => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-3"); + } + FontSize::Large => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-4"); + } + FontSize::Medium => { + a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-5"); + } + _ => {} + }; + match a.anchor_type() { + AnchorType::Button => { + a.alter_classes( + ClassesOp::Replace(a.anchor_type().to_string()), + "button is-primary", + ); + } + _ => {} + }; } COMPONENT_BASE_HEADING => { let h = component_as_mut::<Heading>(component); match h.display() { - HeadingDisplay::Subtitle => h.alter_classes( - ClassesOp::SetDefault, "subtitle" - ), - _ => h.alter_classes( - ClassesOp::AddDefault, "title" - ), + HeadingDisplay::Subtitle => { + h.alter_classes(ClassesOp::Replace(h.display().to_string()), "subtitle") + } + _ => h.alter_classes(ClassesOp::AddDefault, "title"), }; } COMPONENT_BASE_PARAGRAPH => { let p = component_as_mut::<Paragraph>(component); - let original = concat_string!("block ", p.font_size().to_string()); - p.alter_classes( - ClassesOp::SetDefault, - match p.font_size() { - FontSize::ExtraLarge => "block is-size-1", - FontSize::XxLarge => "block is-size-2", - FontSize::XLarge => "block is-size-3", - FontSize::Large => "block is-size-4", - FontSize::Medium => "block is-size-5", - _ => original.as_str(), - }, - ); - + p.alter_classes(ClassesOp::AddDefault, "block"); + match p.font_size() { + FontSize::ExtraLarge => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-1"); + } + FontSize::XxLarge => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-2"); + } + FontSize::XLarge => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-3"); + } + FontSize::Large => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-4"); + } + FontSize::Medium => { + p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-5"); + } + _ => {} + }; } _ => {} } } - fn render_component( - &self, - component: &dyn ComponentTrait, - cx: &mut Context, - ) -> Option<Markup> { + fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { match component.handle() { COMPONENT_BASE_ICON => { let icon = component_as_ref::<Icon>(component); if icon.icon_name().is_empty() { - return None + return None; }; cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); Some(html! { diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 062939dd..706e34be 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -80,12 +80,14 @@ fn hello_world() -> Wrapper { ) .with_target(AnchorTarget::Blank) .with_left_icon(Icon::with("git")) - .with_classes(ClassesOp::Add, "code-link"), + .with_classes(ClassesOp::Add, "code-link") + .with_font_size(FontSize::Large), ) .add_component( Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) .with_left_icon(Icon::with("arrow-down-circle-fill")) - .with_classes(ClassesOp::Add, "welcome-link"), + .with_classes(ClassesOp::Add, "welcome-link") + .with_font_size(FontSize::Large), ), ) .add_item( diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/anchor.rs index df784cda..6aad1b92 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/anchor.rs @@ -10,6 +10,16 @@ pub enum AnchorType { Location, } +#[rustfmt::skip] +impl ToString for AnchorType { + fn to_string(&self) -> String { + match self { + AnchorType::Button => "btn btn-primary".to_string(), + _ => "".to_string(), + } + } +} + #[derive(Default)] pub enum AnchorTarget { #[default] @@ -29,13 +39,13 @@ pub struct Anchor { renderable : Renderable, id : OptionId, classes : OptionClasses, + font_size : FontSize, anchor_type: AnchorType, href : OptionString, html : OptionTranslated, left_icon : AnchorIcon, right_icon : AnchorIcon, target : AnchorTarget, - template : String, } impl ComponentTrait for Anchor { @@ -125,14 +135,21 @@ impl Anchor { self } + #[fn_builder] + pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.font_size.to_string()), + font_size.to_string(), + ); + self.font_size = font_size; + self + } + #[fn_builder] pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { - self.alter_classes( - ClassesOp::SetDefault, - match anchor_type { - AnchorType::Button => "btn btn-primary", - _ => "", - }, + self.classes.alter_value( + ClassesOp::Replace(self.anchor_type.to_string()), + anchor_type.to_string(), ); self.anchor_type = anchor_type; self @@ -168,18 +185,16 @@ impl Anchor { self } - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Anchor GETTERS. pub fn classes(&self) -> &OptionClasses { &self.classes } + pub fn font_size(&self) -> &FontSize { + &self.font_size + } + pub fn anchor_type(&self) -> &AnchorType { &self.anchor_type } @@ -203,8 +218,4 @@ impl Anchor { pub fn target(&self) -> &AnchorTarget { &self.target } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 9f429f32..ecc7a859 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -7,8 +7,9 @@ new_handle!(COMPONENT_BASE_ICON); pub struct Icon { weight : Weight, renderable: Renderable, - icon_name : String, classes : OptionClasses, + font_size : FontSize, + icon_name : String, } impl ComponentTrait for Icon { @@ -30,7 +31,7 @@ impl ComponentTrait for Icon { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { if self.icon_name().is_empty() { - return PrepareMarkup::None + return PrepareMarkup::None; } cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) @@ -56,6 +57,22 @@ impl Icon { self } + #[fn_builder] + pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + #[fn_builder] + pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.font_size.to_string()), + font_size.to_string(), + ); + self.font_size = font_size; + self + } + #[fn_builder] pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", name)); @@ -63,19 +80,17 @@ impl Icon { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - // Icon GETTERS. - pub fn icon_name(&self) -> &str { - self.icon_name.as_str() - } - pub fn classes(&self) -> &OptionClasses { &self.classes } + + pub fn font_size(&self) -> &FontSize { + &self.font_size + } + + pub fn icon_name(&self) -> &str { + self.icon_name.as_str() + } } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 6a95e69c..0daf587d 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -9,8 +9,8 @@ pub struct Paragraph { renderable: Renderable, id : OptionId, classes : OptionClasses, - stuff : ArcComponents, font_size : FontSize, + stuff : ArcComponents, } impl ComponentTrait for Paragraph { @@ -81,6 +81,16 @@ impl Paragraph { self } + #[fn_builder] + pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { + self.classes.alter_value( + ClassesOp::Replace(self.font_size.to_string()), + font_size.to_string(), + ); + self.font_size = font_size; + self + } + pub fn add_component(mut self, component: impl ComponentTrait) -> Self { self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); self @@ -98,28 +108,17 @@ impl Paragraph { self } - #[rustfmt::skip] - #[fn_builder] - pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.font_size.to_string()), - font_size.to_string(), - ); - self.font_size = font_size; - self - } - // Paragraph GETTERS. pub fn classes(&self) -> &OptionClasses { &self.classes } - pub fn components(&self) -> &ArcComponents { - &self.stuff - } - pub fn font_size(&self) -> &FontSize { &self.font_size } + + pub fn components(&self) -> &ArcComponents { + &self.stuff + } } From 6dd9eb28f5e23eecc3081dfb94cf51af2aba8a2e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 1 Nov 2023 22:59:46 +0100 Subject: [PATCH 591/853] =?UTF-8?q?=F0=9F=94=A5=20Remove=20unnecessary=20S?= =?UTF-8?q?etDefault=20in=20OptionClasses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 30 ++++++++++++-------- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/flex/container.rs | 2 +- pagetop/src/base/component/flex/item.rs | 4 +-- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form_main.rs | 2 +- pagetop/src/base/component/form/input.rs | 2 +- pagetop/src/base/component/icon.rs | 7 +++-- pagetop/src/base/component/image.rs | 8 +++--- pagetop/src/base/component/wrapper.rs | 20 +++++++++---- pagetop/src/html/opt_classes.rs | 11 ++----- 12 files changed, 52 insertions(+), 40 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index b80e96c1..e96fbe87 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -131,18 +131,24 @@ impl ThemeTrait for Bootsier { } COMPONENT_BASE_HEADING => { let h = component_as_mut::<Heading>(component); - let original = h.display().to_string(); - h.alter_classes( - ClassesOp::SetDefault, - match h.display() { - HeadingDisplay::ExtraLarge => "display-1", - HeadingDisplay::XxLarge => "display-2", - HeadingDisplay::XLarge => "display-3", - HeadingDisplay::Large => "display-4", - HeadingDisplay::Medium => "display-5", - _ => original.as_str(), - }, - ); + match h.display() { + HeadingDisplay::ExtraLarge => { + h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-1"); + } + HeadingDisplay::XxLarge => { + h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-2"); + } + HeadingDisplay::XLarge => { + h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-3"); + } + HeadingDisplay::Large => { + h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-4"); + } + HeadingDisplay::Medium => { + h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-5"); + } + _ => {} + }; } COMPONENT_BASE_PARAGRAPH => { let p = component_as_mut::<Paragraph>(component); diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index cff0f744..a56a4af2 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -18,7 +18,7 @@ pub struct Block { impl ComponentTrait for Block { fn new() -> Self { - Block::default().with_classes(ClassesOp::SetDefault, "block") + Block::default().with_classes(ClassesOp::AddDefault, "block") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index da37b150..ed71e85f 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -22,7 +22,7 @@ pub struct Container { impl ComponentTrait for Container { fn new() -> Self { Container::default() - .with_classes(ClassesOp::SetDefault, flex::Direction::Default.to_string()) + .with_classes(ClassesOp::AddDefault, flex::Direction::Default.to_string()) } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 1b44f26f..d7f1f907 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -23,8 +23,8 @@ pub struct Item { impl ComponentTrait for Item { fn new() -> Self { Item::default() - .with_item_classes(ClassesOp::SetDefault, "pt-flex__item") - .with_inner_classes(ClassesOp::SetDefault, "pt-flex__item-inner") + .with_item_classes(ClassesOp::AddDefault, "pt-flex__item") + .with_inner_classes(ClassesOp::AddDefault, "pt-flex__item-inner") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 1fce9dc9..1e111459 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -26,7 +26,7 @@ pub struct Button { impl ComponentTrait for Button { fn new() -> Self { - Button::default().with_classes(ClassesOp::SetDefault, "btn btn-primary form-button") + Button::default().with_classes(ClassesOp::AddDefault, "btn btn-primary form-button") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 22190bab..af319873 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -23,7 +23,7 @@ pub struct Date { impl ComponentTrait for Date { fn new() -> Self { - Date::default().with_classes(ClassesOp::SetDefault, "form-item form-type-date") + Date::default().with_classes(ClassesOp::AddDefault, "form-item form-type-date") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index a2bed394..70261ca2 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -28,7 +28,7 @@ pub struct Form { impl ComponentTrait for Form { fn new() -> Self { Form::default() - .with_classes(ClassesOp::SetDefault, "form") + .with_classes(ClassesOp::AddDefault, "form") .with_charset("UTF-8") } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 74a92497..55340a46 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -39,7 +39,7 @@ pub struct Input { impl ComponentTrait for Input { fn new() -> Self { Input::default() - .with_classes(ClassesOp::SetDefault, "form-item form-type-textfield") + .with_classes(ClassesOp::AddDefault, "form-item form-type-textfield") .with_size(Some(60)) .with_maxlength(Some(128)) } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index ecc7a859..b35287e3 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -14,7 +14,7 @@ pub struct Icon { impl ComponentTrait for Icon { fn new() -> Self { - Icon::default().with_classes(ClassesOp::SetDefault, "bi-question-circle-fill") + Icon::default().with_icon_name("question-circle-fill") } fn handle(&self) -> Handle { @@ -75,7 +75,10 @@ impl Icon { #[fn_builder] pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { - self.alter_classes(ClassesOp::SetDefault, concat_string!("bi-", name)); + self.classes.alter_value( + ClassesOp::Replace(concat_string!("bi-", self.icon_name)), + concat_string!("bi-", name), + ); self.icon_name = name.to_owned(); self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index cf67191b..181cda6a 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -28,7 +28,7 @@ pub struct Image { impl ComponentTrait for Image { fn new() -> Self { - Image::default().with_classes(ClassesOp::SetDefault, IMG_FLUID) + Image::default().with_classes(ClassesOp::AddDefault, IMG_FLUID) } fn handle(&self) -> Handle { @@ -70,19 +70,19 @@ impl Image { pub fn with(source: &str) -> Self { Image::default() .with_source(source) - .with_classes(ClassesOp::SetDefault, IMG_FLUID) + .with_classes(ClassesOp::AddDefault, IMG_FLUID) } pub fn fixed(source: &str) -> Self { Image::default() .with_source(source) - .with_classes(ClassesOp::SetDefault, IMG_FIXED) + .with_classes(ClassesOp::AddDefault, IMG_FIXED) } pub fn pagetop() -> Self { Image::default() .with_source("/base/pagetop-logo.svg") - .with_classes(ClassesOp::SetDefault, IMG_FIXED) + .with_classes(ClassesOp::AddDefault, IMG_FIXED) .with_size(ImageSize::Size(64, 64)) } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 75061dc7..8480e683 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -30,8 +30,8 @@ pub struct Wrapper { impl ComponentTrait for Wrapper { fn new() -> Self { Wrapper::default() - .with_classes(ClassesOp::SetDefault, "container") - .with_inner_classes(ClassesOp::SetDefault, "container") + .with_classes(ClassesOp::AddDefault, "container") + .with_inner_classes(ClassesOp::AddDefault, "container") } fn handle(&self) -> Handle { @@ -99,25 +99,33 @@ impl ComponentTrait for Wrapper { impl Wrapper { pub fn header() -> Self { - let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "header"); + let mut c = Wrapper::default() + .with_classes(ClassesOp::AddDefault, "header") + .with_inner_classes(ClassesOp::AddDefault, "container"); c.wrapper_type = WrapperType::Header; c } pub fn footer() -> Self { - let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "footer"); + let mut c = Wrapper::default() + .with_classes(ClassesOp::AddDefault, "footer") + .with_inner_classes(ClassesOp::AddDefault, "container"); c.wrapper_type = WrapperType::Footer; c } pub fn main() -> Self { - let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "main"); + let mut c = Wrapper::default() + .with_classes(ClassesOp::AddDefault, "main") + .with_inner_classes(ClassesOp::AddDefault, "container"); c.wrapper_type = WrapperType::Main; c } pub fn section() -> Self { - let mut c = Wrapper::new().with_classes(ClassesOp::SetDefault, "section"); + let mut c = Wrapper::default() + .with_classes(ClassesOp::AddDefault, "section") + .with_inner_classes(ClassesOp::AddDefault, "container"); c.wrapper_type = WrapperType::Section; c } diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index a3f0444e..0df33e4e 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -3,9 +3,9 @@ //! This *helper* differentiates between default classes (generally associated with styles provided //! by the theme) and user classes (for customizing components based on application styles). //! -//! Default classes can be added using [SetDefault] and [AddDefault], while user classes can be -//! added using [Add]. Operations to [Remove], [Replace] or [ReplaceIfExists] a class, as well as -//! to [Reset] user classes, are also provided. +//! Default classes can be added using [AddDefault], while user classes can be added using [Add]. +//! Operations to [Remove], [Replace] or [ReplaceIfExists] a class, as well as to [Reset] user +//! classes, are also provided. //! //! Although the order of the classes is irrelevant (<https://stackoverflow.com/a/1321712>), default //! classes will be presented before user classes and duplicate classes will not be allowed. @@ -13,7 +13,6 @@ use crate::fn_builder; pub enum ClassesOp { - SetDefault, AddDefault, Add, Remove, @@ -51,10 +50,6 @@ impl OptionClasses { let classes: Vec<&str> = classes.split_ascii_whitespace().collect(); match op { - ClassesOp::SetDefault => { - self.0.retain(|(_, t)| t.ne(&ClassType::Default)); - self.add(&classes, 0, ClassType::Default); - } ClassesOp::AddDefault => { let pos = match self.0.iter().position(|(_, t)| t.eq(&ClassType::User)) { Some(pos) => pos, From 80139d91534e01fbe93a1e7b9c767a56197bb18e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 1 Nov 2023 23:26:36 +0100 Subject: [PATCH 592/853] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20Simplify=20class?= =?UTF-8?q?=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/src/lib.rs | 17 +++--- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/flex/container.rs | 3 +- pagetop/src/base/component/flex/item.rs | 4 +- pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form_main.rs | 2 +- pagetop/src/base/component/form/input.rs | 4 +- pagetop/src/base/component/image.rs | 8 +-- pagetop/src/base/component/wrapper.rs | 20 +++---- pagetop/src/html/opt_classes.rs | 63 ++++++-------------- 11 files changed, 47 insertions(+), 80 deletions(-) diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index af15fa53..64fe10ec 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -74,14 +74,11 @@ impl ThemeTrait for Bulmix { } _ => {} }; - match a.anchor_type() { - AnchorType::Button => { - a.alter_classes( - ClassesOp::Replace(a.anchor_type().to_string()), - "button is-primary", - ); - } - _ => {} + if let AnchorType::Button = a.anchor_type() { + a.alter_classes( + ClassesOp::Replace(a.anchor_type().to_string()), + "button is-primary", + ); }; } COMPONENT_BASE_HEADING => { @@ -90,12 +87,12 @@ impl ThemeTrait for Bulmix { HeadingDisplay::Subtitle => { h.alter_classes(ClassesOp::Replace(h.display().to_string()), "subtitle") } - _ => h.alter_classes(ClassesOp::AddDefault, "title"), + _ => h.alter_classes(ClassesOp::Add, "title"), }; } COMPONENT_BASE_PARAGRAPH => { let p = component_as_mut::<Paragraph>(component); - p.alter_classes(ClassesOp::AddDefault, "block"); + p.alter_classes(ClassesOp::Add, "block"); match p.font_size() { FontSize::ExtraLarge => { p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-1"); diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index a56a4af2..7be19d67 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -18,7 +18,7 @@ pub struct Block { impl ComponentTrait for Block { fn new() -> Self { - Block::default().with_classes(ClassesOp::AddDefault, "block") + Block::default().with_classes(ClassesOp::Add, "block") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index ed71e85f..2bec3898 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -21,8 +21,7 @@ pub struct Container { impl ComponentTrait for Container { fn new() -> Self { - Container::default() - .with_classes(ClassesOp::AddDefault, flex::Direction::Default.to_string()) + Container::default().with_classes(ClassesOp::Add, flex::Direction::Default.to_string()) } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index d7f1f907..f4228992 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -23,8 +23,8 @@ pub struct Item { impl ComponentTrait for Item { fn new() -> Self { Item::default() - .with_item_classes(ClassesOp::AddDefault, "pt-flex__item") - .with_inner_classes(ClassesOp::AddDefault, "pt-flex__item-inner") + .with_item_classes(ClassesOp::Add, "pt-flex__item") + .with_inner_classes(ClassesOp::Add, "pt-flex__item-inner") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 1e111459..3eb1dd82 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -26,7 +26,7 @@ pub struct Button { impl ComponentTrait for Button { fn new() -> Self { - Button::default().with_classes(ClassesOp::AddDefault, "btn btn-primary form-button") + Button::default().with_classes(ClassesOp::Add, "btn btn-primary form-button") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index af319873..ed5e11a9 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -23,7 +23,7 @@ pub struct Date { impl ComponentTrait for Date { fn new() -> Self { - Date::default().with_classes(ClassesOp::AddDefault, "form-item form-type-date") + Date::default().with_classes(ClassesOp::Add, "form-item form-type-date") } fn handle(&self) -> Handle { diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 70261ca2..8ff2b6dc 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -28,7 +28,7 @@ pub struct Form { impl ComponentTrait for Form { fn new() -> Self { Form::default() - .with_classes(ClassesOp::AddDefault, "form") + .with_classes(ClassesOp::Add, "form") .with_charset("UTF-8") } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 55340a46..8c556cac 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -39,7 +39,7 @@ pub struct Input { impl ComponentTrait for Input { fn new() -> Self { Input::default() - .with_classes(ClassesOp::AddDefault, "form-item form-type-textfield") + .with_classes(ClassesOp::Add, "form-item form-type-textfield") .with_size(Some(60)) .with_maxlength(Some(128)) } @@ -177,7 +177,7 @@ impl Input { if let Some(previous) = self.name.get() { self.alter_classes(ClassesOp::Remove, concat_string!("form-item-", previous)); } - self.alter_classes(ClassesOp::AddDefault, concat_string!("form-item-", name)); + self.alter_classes(ClassesOp::Add, concat_string!("form-item-", name)); self.name.alter_value(name); self } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 181cda6a..393b9bd8 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -28,7 +28,7 @@ pub struct Image { impl ComponentTrait for Image { fn new() -> Self { - Image::default().with_classes(ClassesOp::AddDefault, IMG_FLUID) + Image::default().with_classes(ClassesOp::Add, IMG_FLUID) } fn handle(&self) -> Handle { @@ -70,19 +70,19 @@ impl Image { pub fn with(source: &str) -> Self { Image::default() .with_source(source) - .with_classes(ClassesOp::AddDefault, IMG_FLUID) + .with_classes(ClassesOp::Add, IMG_FLUID) } pub fn fixed(source: &str) -> Self { Image::default() .with_source(source) - .with_classes(ClassesOp::AddDefault, IMG_FIXED) + .with_classes(ClassesOp::Add, IMG_FIXED) } pub fn pagetop() -> Self { Image::default() .with_source("/base/pagetop-logo.svg") - .with_classes(ClassesOp::AddDefault, IMG_FIXED) + .with_classes(ClassesOp::Add, IMG_FIXED) .with_size(ImageSize::Size(64, 64)) } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 8480e683..fe5b6382 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -30,8 +30,8 @@ pub struct Wrapper { impl ComponentTrait for Wrapper { fn new() -> Self { Wrapper::default() - .with_classes(ClassesOp::AddDefault, "container") - .with_inner_classes(ClassesOp::AddDefault, "container") + .with_classes(ClassesOp::Add, "container") + .with_inner_classes(ClassesOp::Add, "container") } fn handle(&self) -> Handle { @@ -100,32 +100,32 @@ impl ComponentTrait for Wrapper { impl Wrapper { pub fn header() -> Self { let mut c = Wrapper::default() - .with_classes(ClassesOp::AddDefault, "header") - .with_inner_classes(ClassesOp::AddDefault, "container"); + .with_classes(ClassesOp::Add, "header") + .with_inner_classes(ClassesOp::Add, "container"); c.wrapper_type = WrapperType::Header; c } pub fn footer() -> Self { let mut c = Wrapper::default() - .with_classes(ClassesOp::AddDefault, "footer") - .with_inner_classes(ClassesOp::AddDefault, "container"); + .with_classes(ClassesOp::Add, "footer") + .with_inner_classes(ClassesOp::Add, "container"); c.wrapper_type = WrapperType::Footer; c } pub fn main() -> Self { let mut c = Wrapper::default() - .with_classes(ClassesOp::AddDefault, "main") - .with_inner_classes(ClassesOp::AddDefault, "container"); + .with_classes(ClassesOp::Add, "main") + .with_inner_classes(ClassesOp::Add, "container"); c.wrapper_type = WrapperType::Main; c } pub fn section() -> Self { let mut c = Wrapper::default() - .with_classes(ClassesOp::AddDefault, "section") - .with_inner_classes(ClassesOp::AddDefault, "container"); + .with_classes(ClassesOp::Add, "section") + .with_inner_classes(ClassesOp::Add, "container"); c.wrapper_type = WrapperType::Section; c } diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index 0df33e4e..46443df5 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -3,33 +3,24 @@ //! This *helper* differentiates between default classes (generally associated with styles provided //! by the theme) and user classes (for customizing components based on application styles). //! -//! Default classes can be added using [AddDefault], while user classes can be added using [Add]. -//! Operations to [Remove], [Replace] or [ReplaceIfExists] a class, as well as to [Reset] user -//! classes, are also provided. +//! Classes can be added using [Add]. Operations to [Remove], [Replace] or [Toggle] a class, as well +//! as [Clear] all classes, are also provided. //! -//! Although the order of the classes is irrelevant (<https://stackoverflow.com/a/1321712>), default -//! classes will be presented before user classes and duplicate classes will not be allowed. +//! **OptionClasses** assumes that the order of the classes is irrelevant +//! (<https://stackoverflow.com/a/1321712>), and duplicate classes will not be allowed. use crate::fn_builder; pub enum ClassesOp { - AddDefault, Add, Remove, Replace(String), Toggle, - Reset, Clear, } -#[derive(Clone, PartialEq)] -enum ClassType { - Default, - User, -} - #[derive(Default)] -pub struct OptionClasses(Vec<(String, ClassType)>); +pub struct OptionClasses(Vec<String>); impl OptionClasses { pub fn new() -> Self { @@ -50,52 +41,38 @@ impl OptionClasses { let classes: Vec<&str> = classes.split_ascii_whitespace().collect(); match op { - ClassesOp::AddDefault => { - let pos = match self.0.iter().position(|(_, t)| t.eq(&ClassType::User)) { - Some(pos) => pos, - None => self.0.len(), - }; - self.add(&classes, pos, ClassType::Default); - } ClassesOp::Add => { - self.add(&classes, self.0.len(), ClassType::User); + self.add(&classes, self.0.len()); } ClassesOp::Remove => { for class in classes { - self.0.retain(|(c, _)| c.ne(&class.to_string())); + self.0.retain(|c| c.ne(&class.to_string())); } } ClassesOp::Replace(classes_to_replace) => { let mut pos = self.0.len(); - let mut class_type = ClassType::Default; let replace: Vec<&str> = classes_to_replace.split_ascii_whitespace().collect(); for class in replace { - if let Some(replace_pos) = self.0.iter().position(|(c, _)| c.eq(class)) { - let (_, replace_type) = self.0.remove(replace_pos); + if let Some(replace_pos) = self.0.iter().position(|c| c.eq(class)) { + self.0.remove(replace_pos); if pos > replace_pos { pos = replace_pos; } - if replace_type.eq(&ClassType::Default) { - class_type = replace_type; - } } } - self.add(&classes, pos, class_type); + self.add(&classes, pos); } ClassesOp::Toggle => { for class in classes { if !class.is_empty() { - if let Some(pos) = self.0.iter().position(|(c, _)| c.eq(class)) { + if let Some(pos) = self.0.iter().position(|c| c.eq(class)) { self.0.remove(pos); } else { - self.0.push((class.to_string(), ClassType::User)); + self.0.push(class.to_string()); } } } } - ClassesOp::Reset => { - self.0.retain(|(_, t)| t.ne(&ClassType::User)); - } ClassesOp::Clear => { self.0.clear(); } @@ -104,10 +81,10 @@ impl OptionClasses { } #[inline] - fn add(&mut self, classes: &Vec<&str>, mut pos: usize, class_type: ClassType) { + fn add(&mut self, classes: &Vec<&str>, mut pos: usize) { for class in classes { - if !class.is_empty() && !self.0.iter().any(|(c, _)| c.eq(class)) { - self.0.insert(pos, (class.to_string(), class_type.clone())); + if !class.is_empty() && !self.0.iter().any(|c| c.eq(class)) { + self.0.insert(pos, class.to_string()); pos += 1; } } @@ -117,20 +94,14 @@ impl OptionClasses { pub fn exists(&self, class: impl Into<String>) -> bool { let class: String = class.into(); - self.0.iter().any(|(c, _)| c.eq(&class)) + self.0.iter().any(|c| c.eq(&class)) } pub fn get(&self) -> Option<String> { if self.0.is_empty() { None } else { - Some( - self.0 - .iter() - .map(|(c, _)| c.to_owned()) - .collect::<Vec<String>>() - .join(" "), - ) + Some(self.0.join(" ")) } } } From 306cf5dc4389bedddb99fb81c5b8683b5efc41ab Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 17:18:41 +0100 Subject: [PATCH 593/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Rep?= =?UTF-8?q?lace=20"prepare"=20with=20"render"=20for=20better?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/branding.rs | 2 +- pagetop/src/base/component/flex/container.rs | 2 +- pagetop/src/base/component/flex/item.rs | 2 +- pagetop/src/base/component/form/form_main.rs | 2 +- pagetop/src/base/component/menu/element.rs | 4 +-- pagetop/src/base/component/menu/group.rs | 2 +- pagetop/src/base/component/menu/item.rs | 6 ++-- pagetop/src/base/component/menu/megamenu.rs | 2 +- pagetop/src/base/component/menu/menu_main.rs | 2 +- pagetop/src/base/component/menu/submenu.rs | 2 +- pagetop/src/base/component/paragraph.rs | 2 +- pagetop/src/base/component/wrapper.rs | 10 +++--- pagetop/src/core/component/arc.rs | 12 +++---- pagetop/src/core/component/definition.rs | 10 ++++-- pagetop/src/core/component/typed.rs | 12 +++---- pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/html.rs | 34 -------------------- 18 files changed, 40 insertions(+), 70 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 7be19d67..0cf9cd1b 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -49,7 +49,7 @@ impl ComponentTrait for Block { h2 class="block-title" { (title) } } div class="block-body" { - (self.components().prepare(cx)) + (self.components().render(cx)) } } }) diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index fba36693..5ae83b8c 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -55,7 +55,7 @@ impl ComponentTrait for Branding { div id=[self.id()] { div class="pt-branding__wrapper" { div class="pt-branding__logo" { - (self.logo().prepare(cx)) + (self.logo().render(cx)) } div class="pt-branding__text" { div class="pt-branding__name" { diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index 2bec3898..89068fa9 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -54,7 +54,7 @@ impl ComponentTrait for Container { PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] style=[gap] { - (self.items().prepare(cx)) + (self.items().render(cx)) } }) } diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index f4228992..0687a547 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -55,7 +55,7 @@ impl ComponentTrait for Item { PrepareMarkup::With(html! { div id=[self.id()] class=[self.item_classes().get()] style=[order] { div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) + (self.components().render(cx)) } } }) diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 8ff2b6dc..caeeebf2 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -65,7 +65,7 @@ impl ComponentTrait for Form { method=[method] accept-charset=[self.charset().get()] { - div { (self.elements().prepare(cx)) } + div { (self.elements().render(cx)) } } }) } diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index 003d4435..d51d1d26 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -46,10 +46,10 @@ impl ComponentTrait for Element { match self.element_type() { ElementType::Void => PrepareMarkup::None, ElementType::Html(content) => PrepareMarkup::With(html! { - (content.prepare(cx)) + (content.render(cx)) }), ElementType::Submenu(submenu) => PrepareMarkup::With(html! { - (submenu.prepare(cx)) + (submenu.render(cx)) }), } } diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index c4cc7c07..7f827025 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -39,7 +39,7 @@ impl ComponentTrait for Group { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div id=[self.id()] class="menu-group" { - (self.elements().prepare(cx)) + (self.elements().render(cx)) } }) } diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index aefd2a13..462b90bb 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -76,7 +76,7 @@ impl ComponentTrait for Item { }), ItemType::Html(content) => PrepareMarkup::With(html! { li class="pt-menu__html" { - (content.prepare(cx)) + (content.render(cx)) } }), ItemType::Submenu(label, submenu) => PrepareMarkup::With(html! { @@ -85,7 +85,7 @@ impl ComponentTrait for Item { (label.escaped(cx.langid())) i class="pt-menu__icon bi-chevron-down" {} } div class="pt-menu__subs" { - (submenu.prepare(cx)) + (submenu.render(cx)) } } }), @@ -95,7 +95,7 @@ impl ComponentTrait for Item { (label.escaped(cx.langid())) i class="pt-menu__icon bi-chevron-down" {} } div class="pt-menu__subs pt-menu__mega" { - (megamenu.prepare(cx)) + (megamenu.render(cx)) } } }), diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index 80899f1d..846d7f80 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -39,7 +39,7 @@ impl ComponentTrait for Megamenu { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div id=[self.id()] class="pt-menu__groups" { - (self.groups().prepare(cx)) + (self.groups().render(cx)) } }) } diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index f02517ba..4190ec99 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -60,7 +60,7 @@ impl ComponentTrait for Menu { } } ul class="pt-menu__section" { - (self.items().prepare(cx)) + (self.items().render(cx)) } } } diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index a2586804..e5f9c396 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -44,7 +44,7 @@ impl ComponentTrait for Submenu { h4 class="pt-menu__title" { (title) } } ul { - (self.items().prepare(cx)) + (self.items().render(cx)) } } }) diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 0daf587d..427df31a 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -40,7 +40,7 @@ impl ComponentTrait for Paragraph { id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(cx)) + (self.components().render(cx)) } }) } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index fe5b6382..918b3e33 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -59,34 +59,34 @@ impl ComponentTrait for Wrapper { WrapperType::Header => PrepareMarkup::With(html! { header id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) + (self.components().render(cx)) } } }), WrapperType::Footer => PrepareMarkup::With(html! { footer id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) + (self.components().render(cx)) } } }), WrapperType::Main => PrepareMarkup::With(html! { main id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) + (self.components().render(cx)) } } }), WrapperType::Section => PrepareMarkup::With(html! { section id=[self.id()] class=[self.classes().get()] { div class=[self.inner_classes().get()] { - (self.components().prepare(cx)) + (self.components().render(cx)) } } }), _ => PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { - (self.components().prepare(cx)) + (self.components().render(cx)) } }), } diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs index c3e5c2cd..f27913b9 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc.rs @@ -61,10 +61,10 @@ impl ArcComponent { self.0.read().unwrap().weight() } - // ArcComponent PREPARE. + // ArcComponent RENDER. - pub fn prepare(&self, cx: &mut Context) -> Markup { - self.0.write().unwrap().prepare(cx) + pub fn render(&self, cx: &mut Context) -> Markup { + self.0.write().unwrap().render(cx) } } @@ -150,14 +150,14 @@ impl ArcComponents { self.0.iter().filter(move |&c| c.handle() == handle) } - // ArcComponents PREPARE. + // ArcComponents RENDER. - pub fn prepare(&self, cx: &mut Context) -> Markup { + pub fn render(&self, cx: &mut Context) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.weight()); html! { @for c in components.iter() { - " " (c.prepare(cx)) " " + " " (c.render(cx)) " " } } } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index a6d99c1b..0ef4be30 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -5,7 +5,7 @@ use crate::{util, Handle, Weight}; use std::any::Any; pub trait ComponentBase: Any { - fn prepare(&mut self, cx: &mut Context) -> Markup; + fn render(&mut self, cx: &mut Context) -> Markup; fn as_ref_any(&self) -> &dyn Any; @@ -53,7 +53,7 @@ pub trait ComponentTrait: ComponentBase + Send + Sync { } impl<C: ComponentTrait> ComponentBase for C { - fn prepare(&mut self, cx: &mut Context) -> Markup { + fn render(&mut self, cx: &mut Context) -> Markup { if self.is_renderable(cx) { // Acciones antes de preparar el componente. self.before_prepare_component(cx); @@ -63,7 +63,11 @@ impl<C: ComponentTrait> ComponentBase for C { let markup = match cx.theme().render_component(self, cx) { Some(html) => html, - None => self.prepare_component(cx).html(), + None => match self.prepare_component(cx) { + PrepareMarkup::None => html! {}, + PrepareMarkup::Text(text) => html! { (text) }, + PrepareMarkup::With(html) => html, + }, }; // Acciones después de preparar el componente. diff --git a/pagetop/src/core/component/typed.rs b/pagetop/src/core/component/typed.rs index 0197645d..7ccc48cd 100644 --- a/pagetop/src/core/component/typed.rs +++ b/pagetop/src/core/component/typed.rs @@ -46,10 +46,10 @@ impl<T: ComponentTrait + Default> TypedComponent<T> { self.0.read().unwrap().weight() } - // TypedComponent PREPARE. + // TypedComponent RENDER. - pub fn prepare(&self, cx: &mut Context) -> Markup { - self.0.write().unwrap().prepare(cx) + pub fn render(&self, cx: &mut Context) -> Markup { + self.0.write().unwrap().render(cx) } } @@ -127,14 +127,14 @@ impl<T: ComponentTrait + Default> TypedComponents<T> { self.0.iter().filter(move |&c| c.handle() == handle) } - // TypedComponents PREPARE. + // TypedComponents RENDER. - pub fn prepare(&self, cx: &mut Context) -> Markup { + pub fn render(&self, cx: &mut Context) -> Markup { let mut components = self.0.clone(); components.sort_by_key(|c| c.weight()); html! { @for c in components.iter() { - " " (c.prepare(cx)) " " + " " (c.render(cx)) " " } } } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index c73edc12..53e87631 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -21,7 +21,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { } fn prepare_region(&self, page: &mut Page, region: &str) -> Markup { - let render_region = page.components_in(region).prepare(page.context()); + let render_region = page.components_in(region).render(page.context()); if render_region.is_empty() { html! {} } else { diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index ee77da22..5a2bab3d 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -35,37 +35,3 @@ pub enum PrepareMarkup { Text(&'static str), With(Markup), } - -impl PrepareMarkup { - pub fn html(self) -> Markup { - match self { - PrepareMarkup::None => html! {}, - PrepareMarkup::Text(text) => html! { (text) }, - PrepareMarkup::With(markup) => markup, - } - } - - pub fn into_string(self) -> Option<String> { - match self { - PrepareMarkup::None => None, - PrepareMarkup::Text(text) => { - if text.is_empty() { - None - } else { - Some(text.to_string()) - } - } - PrepareMarkup::With(markup) => Some(markup.into_string()), - } - } -} - -impl ToString for PrepareMarkup { - fn to_string(&self) -> String { - match self { - PrepareMarkup::None => "".to_owned(), - PrepareMarkup::Text(text) => text.to_string(), - PrepareMarkup::With(markup) => markup.to_owned().into_string(), - } - } -} From c3c5e46508b4c8923c1c44a01d2c2dbabbf74b1e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 17:39:05 +0100 Subject: [PATCH 594/853] =?UTF-8?q?=F0=9F=8E=A8=20Use=20default()=20for=20?= =?UTF-8?q?component=20constructors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/form/button.rs | 6 +++--- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 12 ++++++------ pagetop/src/base/component/heading.rs | 12 ++++++------ pagetop/src/base/component/icon.rs | 4 ++-- pagetop/src/base/component/paragraph.rs | 4 ++-- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 3eb1dd82..dddc9afa 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -66,11 +66,11 @@ impl ComponentTrait for Button { impl Button { pub fn with(value: L10n) -> Self { - Button::new().with_value(value) + Button::default().with_value(value) } pub fn submit(value: L10n) -> Self { - let mut button = Button::new() + let mut button = Button::default() .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-submit") .with_value(value); button.button_type = ButtonType::Submit; @@ -78,7 +78,7 @@ impl Button { } pub fn reset(value: L10n) -> Self { - let mut button = Button::new() + let mut button = Button::default() .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-reset") .with_value(value); button.button_type = ButtonType::Reset; diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 542edaa9..3fbef11f 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -33,7 +33,7 @@ impl ComponentTrait for Hidden { impl Hidden { pub fn set(name: &str, value: &str) -> Self { - Hidden::new().with_name(name).with_value(value) + Hidden::default().with_name(name).with_value(value) } // Hidden BUILDER. diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 8c556cac..b3f43c5a 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -104,11 +104,11 @@ impl ComponentTrait for Input { impl Input { pub fn textfield() -> Self { - Input::new() + Input::default() } pub fn password() -> Self { - let mut input = Input::new().with_classes( + let mut input = Input::default().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-password", ); @@ -117,7 +117,7 @@ impl Input { } pub fn search() -> Self { - let mut input = Input::new().with_classes( + let mut input = Input::default().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-search", ); @@ -126,7 +126,7 @@ impl Input { } pub fn email() -> Self { - let mut input = Input::new().with_classes( + let mut input = Input::default().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-email", ); @@ -135,7 +135,7 @@ impl Input { } pub fn telephone() -> Self { - let mut input = Input::new().with_classes( + let mut input = Input::default().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-telephone", ); @@ -144,7 +144,7 @@ impl Input { } pub fn url() -> Self { - let mut input = Input::new().with_classes( + let mut input = Input::default().with_classes( ClassesOp::Replace("form-type-textfield".to_owned()), "form-type-url", ); diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 18c6074e..fd8546dd 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -89,37 +89,37 @@ impl ComponentTrait for Heading { impl Heading { pub fn h1(text: L10n) -> Self { - Heading::new() + Heading::default() .with_heading_type(HeadingType::H1) .with_text(text) } pub fn h2(text: L10n) -> Self { - Heading::new() + Heading::default() .with_heading_type(HeadingType::H2) .with_text(text) } pub fn h3(text: L10n) -> Self { - Heading::new() + Heading::default() .with_heading_type(HeadingType::H3) .with_text(text) } pub fn h4(text: L10n) -> Self { - Heading::new() + Heading::default() .with_heading_type(HeadingType::H4) .with_text(text) } pub fn h5(text: L10n) -> Self { - Heading::new() + Heading::default() .with_heading_type(HeadingType::H5) .with_text(text) } pub fn h6(text: L10n) -> Self { - Heading::new() + Heading::default() .with_heading_type(HeadingType::H6) .with_text(text) } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index b35287e3..afb9660e 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -14,7 +14,7 @@ pub struct Icon { impl ComponentTrait for Icon { fn new() -> Self { - Icon::default().with_icon_name("question-circle-fill") + Icon::default() } fn handle(&self) -> Handle { @@ -40,7 +40,7 @@ impl ComponentTrait for Icon { impl Icon { pub fn with(icon_name: &str) -> Self { - Icon::new().with_icon_name(icon_name) + Icon::default().with_icon_name(icon_name) } // Icon BUILDER. diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 427df31a..2470f84f 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -48,11 +48,11 @@ impl ComponentTrait for Paragraph { impl Paragraph { pub fn with(component: impl ComponentTrait) -> Self { - Paragraph::new().add_component(component) + Paragraph::default().add_component(component) } pub fn translated(l10n: L10n) -> Self { - Paragraph::new().add_translated(l10n) + Paragraph::default().add_translated(l10n) } // Paragraph BUILDER. From 5b8c249785dab14611f33b32e6652101e9cc3c67 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 22:37:55 +0100 Subject: [PATCH 595/853] =?UTF-8?q?=F0=9F=92=A5=20Major=20Handle's=20impro?= =?UTF-8?q?vement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 18 +------ pagetop/src/base/component/branding.rs | 8 +-- pagetop/src/base/component/flex/container.rs | 18 +------ pagetop/src/base/component/flex/item.rs | 18 +------ pagetop/src/base/component/form/button.rs | 8 +-- pagetop/src/base/component/form/date.rs | 8 +-- pagetop/src/base/component/form/form_main.rs | 18 +------ pagetop/src/base/component/form/hidden.rs | 8 +-- pagetop/src/base/component/form/input.rs | 8 +-- pagetop/src/base/component/heading.rs | 8 +-- pagetop/src/base/component/html.rs | 8 +-- pagetop/src/base/component/icon.rs | 8 +-- pagetop/src/base/component/image.rs | 8 +-- pagetop/src/base/component/menu/element.rs | 8 +-- pagetop/src/base/component/menu/group.rs | 8 +-- pagetop/src/base/component/menu/item.rs | 8 +-- pagetop/src/base/component/menu/megamenu.rs | 8 +-- pagetop/src/base/component/menu/menu_main.rs | 18 +------ pagetop/src/base/component/menu/submenu.rs | 8 +-- pagetop/src/base/component/paragraph.rs | 8 +-- pagetop/src/base/component/powered_by.rs | 8 +-- pagetop/src/base/component/translate.rs | 8 +-- pagetop/src/base/component/wrapper.rs | 18 +------ pagetop/src/base/theme/basic.rs | 8 +-- pagetop/src/base/theme/chassis.rs | 8 +-- pagetop/src/base/theme/inception.rs | 8 +-- pagetop/src/core/component/arc.rs | 10 ++-- pagetop/src/core/component/definition.rs | 6 +-- pagetop/src/core/module/definition.rs | 6 +-- pagetop/src/lib.rs | 11 ++++- pagetop/src/prelude.rs | 4 +- pagetop/src/response/fatal_error/error403.rs | 10 ++-- pagetop/src/response/fatal_error/error404.rs | 10 ++-- pagetop/src/util.rs | 52 ++++++++++++++------ 34 files changed, 114 insertions(+), 263 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 0cf9cd1b..c85e2562 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,9 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_BLOCK); - -actions_for_component!(Block); - #[rustfmt::skip] #[derive(Default)] pub struct Block { @@ -16,15 +12,13 @@ pub struct Block { template : String, } +impl_handle!(COMPONENT_BASE_BLOCK for Block); + impl ComponentTrait for Block { fn new() -> Self { Block::default().with_classes(ClassesOp::Add, "block") } - fn handle(&self) -> Handle { - COMPONENT_BASE_BLOCK - } - fn id(&self) -> Option<String> { self.id.get() } @@ -37,10 +31,6 @@ impl ComponentTrait for Block { (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_block(self, cx); - } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let id = cx.required_id::<Block>(self.id()); PrepareMarkup::With(html! { @@ -54,10 +44,6 @@ impl ComponentTrait for Block { } }) } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_block(self, cx); - } } impl Block { diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index 5ae83b8c..c0d59fb0 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_BRANDING); - type SiteLogo = TypedComponent<Image>; #[rustfmt::skip] @@ -28,15 +26,13 @@ impl Default for Branding { } } +impl_handle!(COMPONENT_BASE_BRANDING for Branding); + impl ComponentTrait for Branding { fn new() -> Self { Branding::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_BRANDING - } - fn id(&self) -> Option<String> { Some("pt-branding".to_owned()) } diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index 89068fa9..f879101f 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -1,9 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_FLEX_CONTAINER); - -actions_for_component!(Container); - #[rustfmt::skip] #[derive(Default)] pub struct Container { @@ -19,15 +15,13 @@ pub struct Container { gap : flex::Gap, } +impl_handle!(COMPONENT_BASE_FLEX_CONTAINER for Container); + impl ComponentTrait for Container { fn new() -> Self { Container::default().with_classes(ClassesOp::Add, flex::Direction::Default.to_string()) } - fn handle(&self) -> Handle { - COMPONENT_BASE_FLEX_CONTAINER - } - fn id(&self) -> Option<String> { self.id.get() } @@ -40,10 +34,6 @@ impl ComponentTrait for Container { (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_container(self, cx); - } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { cx.set_param::<bool>(PARAM_BASE_INCLUDE_FLEX_ASSETS, true); @@ -58,10 +48,6 @@ impl ComponentTrait for Container { } }) } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_container(self, cx); - } } impl Container { diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 0687a547..375f528f 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -1,9 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_FLEX_ITEM); - -actions_for_component!(Item); - #[rustfmt::skip] #[derive(Default)] pub struct Item { @@ -20,6 +16,8 @@ pub struct Item { stuff : ArcComponents, } +impl_handle!(COMPONENT_BASE_FLEX_ITEM for Item); + impl ComponentTrait for Item { fn new() -> Self { Item::default() @@ -27,10 +25,6 @@ impl ComponentTrait for Item { .with_inner_classes(ClassesOp::Add, "pt-flex__item-inner") } - fn handle(&self) -> Handle { - COMPONENT_BASE_FLEX_ITEM - } - fn id(&self) -> Option<String> { self.id.get() } @@ -43,10 +37,6 @@ impl ComponentTrait for Item { (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_item(self, cx); - } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let order = match self.weight() { 0 => None, @@ -60,10 +50,6 @@ impl ComponentTrait for Item { } }) } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_item(self, cx); - } } impl Item { diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index dddc9afa..3a5be6ef 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_BUTTON); - #[derive(Default)] pub enum ButtonType { #[default] @@ -24,15 +22,13 @@ pub struct Button { template : String, } +impl_handle!(COMPONENT_BASE_BUTTON for Button); + impl ComponentTrait for Button { fn new() -> Self { Button::default().with_classes(ClassesOp::Add, "btn btn-primary form-button") } - fn handle(&self) -> Handle { - COMPONENT_BASE_BUTTON - } - fn weight(&self) -> Weight { self.weight } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index ed5e11a9..08b47e40 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_DATE); - #[rustfmt::skip] #[derive(Default)] pub struct Date { @@ -21,15 +19,13 @@ pub struct Date { template : String, } +impl_handle!(COMPONENT_BASE_DATE for Date); + impl ComponentTrait for Date { fn new() -> Self { Date::default().with_classes(ClassesOp::Add, "form-item form-type-date") } - fn handle(&self) -> Handle { - COMPONENT_BASE_DATE - } - fn weight(&self) -> Weight { self.weight } diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index caeeebf2..8f7a0879 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -1,9 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_FORM); - -actions_for_component!(Form); - #[derive(Default)] pub enum FormMethod { #[default] @@ -25,6 +21,8 @@ pub struct Form { template : String, } +impl_handle!(COMPONENT_BASE_FORM for Form); + impl ComponentTrait for Form { fn new() -> Self { Form::default() @@ -32,10 +30,6 @@ impl ComponentTrait for Form { .with_charset("UTF-8") } - fn handle(&self) -> Handle { - COMPONENT_BASE_FORM - } - fn id(&self) -> Option<String> { self.id.get() } @@ -48,10 +42,6 @@ impl ComponentTrait for Form { (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_form(self, cx); - } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let method = match self.method() { FormMethod::Post => Some("post".to_owned()), @@ -69,10 +59,6 @@ impl ComponentTrait for Form { } }) } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_form(self, cx); - } } impl Form { diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 3fbef11f..9a809295 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_HIDDEN); - #[rustfmt::skip] #[derive(Default)] pub struct Hidden { @@ -10,15 +8,13 @@ pub struct Hidden { value : OptionString, } +impl_handle!(COMPONENT_BASE_HIDDEN for Hidden); + impl ComponentTrait for Hidden { fn new() -> Self { Hidden::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_HIDDEN - } - fn weight(&self) -> Weight { self.weight } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index b3f43c5a..4e8ec54e 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_INPUT); - #[derive(Default)] pub enum InputType { #[default] @@ -36,6 +34,8 @@ pub struct Input { template : String, } +impl_handle!(COMPONENT_BASE_INPUT for Input); + impl ComponentTrait for Input { fn new() -> Self { Input::default() @@ -44,10 +44,6 @@ impl ComponentTrait for Input { .with_maxlength(Some(128)) } - fn handle(&self) -> Handle { - COMPONENT_BASE_INPUT - } - fn weight(&self) -> Weight { self.weight } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index fd8546dd..5909796c 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_HEADING); - #[derive(Default)] pub enum HeadingType { #[default] @@ -52,15 +50,13 @@ pub struct Heading { display : HeadingDisplay, } +impl_handle!(COMPONENT_BASE_HEADING for Heading); + impl ComponentTrait for Heading { fn new() -> Self { Heading::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_HEADING - } - fn id(&self) -> Option<String> { self.id.get() } diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index bc4f1e62..7105e715 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,19 +1,15 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_HTML); - #[derive(Default)] pub struct Html(Markup); +impl_handle!(COMPONENT_BASE_HTML for Html); + impl ComponentTrait for Html { fn new() -> Self { Html::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_HTML - } - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { (self.html()) }) } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index afb9660e..4b3fd6f9 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_ICON); - #[rustfmt::skip] #[derive(Default)] pub struct Icon { @@ -12,15 +10,13 @@ pub struct Icon { icon_name : String, } +impl_handle!(COMPONENT_BASE_ICON for Icon); + impl ComponentTrait for Icon { fn new() -> Self { Icon::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_ICON - } - fn weight(&self) -> Weight { self.weight } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 393b9bd8..ac096323 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_IMAGE); - const IMG_FLUID: &str = "pt-img__fluid"; const IMG_FIXED: &str = "pt-img__fixed"; @@ -26,15 +24,13 @@ pub struct Image { size : ImageSize, } +impl_handle!(COMPONENT_BASE_IMAGE for Image); + impl ComponentTrait for Image { fn new() -> Self { Image::default().with_classes(ClassesOp::Add, IMG_FLUID) } - fn handle(&self) -> Handle { - COMPONENT_BASE_IMAGE - } - fn id(&self) -> Option<String> { self.id.get() } diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index d51d1d26..c06d5689 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -2,8 +2,6 @@ use crate::prelude::*; use super::Submenu; -new_handle!(COMPONENT_BASE_MENU_ELEMENT); - type Content = TypedComponent<Html>; type SubmenuItems = TypedComponent<Submenu>; @@ -25,15 +23,13 @@ pub struct Element { element_type: ElementType, } +impl_handle!(COMPONENT_BASE_MENU_ELEMENT for Element); + impl ComponentTrait for Element { fn new() -> Self { Element::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_MENU_ELEMENT - } - fn weight(&self) -> Weight { self.weight } diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index 7f827025..52181a51 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -2,8 +2,6 @@ use crate::prelude::*; use super::Element; -new_handle!(COMPONENT_BASE_MENU_GROUP); - type Elements = TypedComponents<Element>; #[rustfmt::skip] @@ -15,15 +13,13 @@ pub struct Group { elements : Elements, } +impl_handle!(COMPONENT_BASE_MENU_GROUP for Group); + impl ComponentTrait for Group { fn new() -> Self { Group::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_MENU_GROUP - } - fn id(&self) -> Option<String> { self.id.get() } diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 462b90bb..71147c92 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -2,8 +2,6 @@ use crate::prelude::*; use super::{Megamenu, Submenu}; -new_handle!(COMPONENT_BASE_MENU_ITEM); - type Label = L10n; type Content = TypedComponent<Html>; type SubmenuItems = TypedComponent<Submenu>; @@ -32,15 +30,13 @@ pub struct Item { description: OptionTranslated, } +impl_handle!(COMPONENT_BASE_MENU_ITEM for Item); + impl ComponentTrait for Item { fn new() -> Self { Item::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_MENU_ITEM - } - fn weight(&self) -> Weight { self.weight } diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index 846d7f80..fb0d717a 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -2,8 +2,6 @@ use crate::prelude::*; use super::Group; -new_handle!(COMPONENT_BASE_MENU_MEGAMENU); - type Groups = TypedComponents<Group>; #[rustfmt::skip] @@ -15,15 +13,13 @@ pub struct Megamenu { groups : Groups, } +impl_handle!(COMPONENT_BASE_MENU_MEGAMENU for Megamenu); + impl ComponentTrait for Megamenu { fn new() -> Self { Megamenu::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_MENU_MEGAMENU - } - fn id(&self) -> Option<String> { self.id.get() } diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index 4190ec99..b429a9df 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -2,10 +2,6 @@ use crate::prelude::*; use super::Item; -new_handle!(COMPONENT_BASE_MENU); - -actions_for_component!(Menu); - #[rustfmt::skip] #[derive(Default)] pub struct Menu { @@ -15,15 +11,13 @@ pub struct Menu { items : TypedComponents<Item>, } +impl_handle!(COMPONENT_BASE_MENU for Menu); + impl ComponentTrait for Menu { fn new() -> Self { Menu::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_MENU - } - fn id(&self) -> Option<String> { self.id.get() } @@ -36,10 +30,6 @@ impl ComponentTrait for Menu { (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_menu(self, cx); - } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { cx.set_param::<bool>(PARAM_BASE_INCLUDE_MENU_ASSETS, true); cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); @@ -75,10 +65,6 @@ impl ComponentTrait for Menu { } }) } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_menu(self, cx); - } } impl Menu { diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index e5f9c396..ff72d0e8 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -2,8 +2,6 @@ use crate::prelude::*; use super::Item; -new_handle!(COMPONENT_BASE_MENU_SUBMENU); - type Items = TypedComponents<Item>; #[rustfmt::skip] @@ -16,15 +14,13 @@ pub struct Submenu { items : Items, } +impl_handle!(COMPONENT_BASE_MENU_SUBMENU for Submenu); + impl ComponentTrait for Submenu { fn new() -> Self { Submenu::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_MENU_SUBMENU - } - fn id(&self) -> Option<String> { self.id.get() } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 2470f84f..c939cf0c 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_PARAGRAPH); - #[rustfmt::skip] #[derive(Default)] pub struct Paragraph { @@ -13,15 +11,13 @@ pub struct Paragraph { stuff : ArcComponents, } +impl_handle!(COMPONENT_BASE_PARAGRAPH for Paragraph); + impl ComponentTrait for Paragraph { fn new() -> Self { Paragraph::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_PARAGRAPH - } - fn id(&self) -> Option<String> { self.id.get() } diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index fc5d81ba..4e87dd70 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_POWEREDBY); - #[derive(Default, Eq, PartialEq)] pub enum PoweredByLogo { #[default] @@ -21,6 +19,8 @@ pub struct PoweredBy { logo : PoweredByLogo, } +impl_handle!(COMPONENT_BASE_POWEREDBY for PoweredBy); + impl ComponentTrait for PoweredBy { fn new() -> Self { let year = Utc::now().format("%Y").to_string(); @@ -31,10 +31,6 @@ impl ComponentTrait for PoweredBy { } } - fn handle(&self) -> Handle { - COMPONENT_BASE_POWEREDBY - } - fn id(&self) -> Option<String> { Some("pt-poweredby".to_owned()) } diff --git a/pagetop/src/base/component/translate.rs b/pagetop/src/base/component/translate.rs index 0e658172..dd41c215 100644 --- a/pagetop/src/base/component/translate.rs +++ b/pagetop/src/base/component/translate.rs @@ -1,19 +1,15 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_TRANSLATE); - #[derive(Default)] pub struct Translate(L10n); +impl_handle!(COMPONENT_BASE_TRANSLATE for Translate); + impl ComponentTrait for Translate { fn new() -> Self { Translate::default() } - fn handle(&self) -> Handle { - COMPONENT_BASE_TRANSLATE - } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(self.l10n().escaped(cx.langid())) } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 918b3e33..121af8ed 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -1,9 +1,5 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_WRAPPER); - -actions_for_component!(Wrapper); - #[derive(Default)] pub enum WrapperType { #[default] @@ -27,6 +23,8 @@ pub struct Wrapper { template : String, } +impl_handle!(COMPONENT_BASE_WRAPPER for Wrapper); + impl ComponentTrait for Wrapper { fn new() -> Self { Wrapper::default() @@ -34,10 +32,6 @@ impl ComponentTrait for Wrapper { .with_inner_classes(ClassesOp::Add, "container") } - fn handle(&self) -> Handle { - COMPONENT_BASE_WRAPPER - } - fn id(&self) -> Option<String> { self.id.get() } @@ -50,10 +44,6 @@ impl ComponentTrait for Wrapper { (self.renderable.check)(cx) } - fn before_prepare_component(&mut self, cx: &mut Context) { - run_actions_before_prepare_wrapper(self, cx); - } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { match self.wrapper_type() { WrapperType::Header => PrepareMarkup::With(html! { @@ -91,10 +81,6 @@ impl ComponentTrait for Wrapper { }), } } - - fn after_prepare_component(&mut self, cx: &mut Context) { - run_actions_after_prepare_wrapper(self, cx); - } } impl Wrapper { diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index f28a6ebf..0a49642e 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -1,14 +1,10 @@ use crate::prelude::*; -new_handle!(THEME_BASIC); - pub struct Basic; -impl ModuleTrait for Basic { - fn handle(&self) -> Handle { - THEME_BASIC - } +impl_handle!(THEME_BASIC for Basic); +impl ModuleTrait for Basic { fn name(&self) -> L10n { L10n::n("Basic") } diff --git a/pagetop/src/base/theme/chassis.rs b/pagetop/src/base/theme/chassis.rs index 03180b5e..f9da9574 100644 --- a/pagetop/src/base/theme/chassis.rs +++ b/pagetop/src/base/theme/chassis.rs @@ -1,14 +1,10 @@ use crate::prelude::*; -new_handle!(THEME_CHASSIS); - pub struct Chassis; -impl ModuleTrait for Chassis { - fn handle(&self) -> Handle { - THEME_CHASSIS - } +impl_handle!(THEME_CHASSIS for Chassis); +impl ModuleTrait for Chassis { fn name(&self) -> L10n { L10n::n("Chassis") } diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index f706fe31..1454d5e1 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -1,14 +1,10 @@ use crate::prelude::*; -new_handle!(THEME_INCEPTION); - pub struct Inception; -impl ModuleTrait for Inception { - fn handle(&self) -> Handle { - THEME_INCEPTION - } +impl_handle!(THEME_INCEPTION for Inception); +impl ModuleTrait for Inception { fn name(&self) -> L10n { L10n::n("Inception") } diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs index f27913b9..c6674c3b 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc.rs @@ -1,22 +1,18 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; -use crate::{new_handle, Handle, Weight}; +use crate::{impl_handle, Handle, Weight}; use std::sync::{Arc, RwLock, RwLockReadGuard}; -new_handle!(COMPONENT_NULL for Crate); - #[derive(Default)] struct ComponentNull; +impl_handle!(COMPONENT_NULL for ComponentNull); + impl ComponentTrait for ComponentNull { fn new() -> Self { ComponentNull::default() } - - fn handle(&self) -> Handle { - COMPONENT_NULL - } } #[derive(Clone)] diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 0ef4be30..60b7ab46 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,6 +1,6 @@ use crate::core::component::Context; use crate::html::{html, Markup, PrepareMarkup}; -use crate::{util, Handle, Weight}; +use crate::{util, HasHandle, Weight}; use std::any::Any; @@ -12,13 +12,11 @@ pub trait ComponentBase: Any { fn as_mut_any(&mut self) -> &mut dyn Any; } -pub trait ComponentTrait: ComponentBase + Send + Sync { +pub trait ComponentTrait: ComponentBase + HasHandle + Send + Sync { fn new() -> Self where Self: Sized; - fn handle(&self) -> Handle; - fn name(&self) -> String { util::single_type_name::<Self>().to_owned() } diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index dd7f9d30..775b4b5a 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,7 +1,7 @@ use crate::core::action::Action; use crate::core::theme::ThemeRef; use crate::locale::L10n; -use crate::{actions, service, util, Handle}; +use crate::{actions, service, util, HasHandle}; #[cfg(feature = "database")] use crate::{db::MigrationItem, migrations}; @@ -13,9 +13,7 @@ pub trait ModuleBase { } /// Los módulos deben implementar este *trait*. -pub trait ModuleTrait: ModuleBase + Send + Sync { - fn handle(&self) -> Handle; - +pub trait ModuleTrait: HasHandle + ModuleBase + Send + Sync { fn name(&self) -> L10n { L10n::n(self.single_name()) } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 8dda95ed..c6569696 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -44,7 +44,7 @@ //! ```rust //! use pagetop::prelude::*; //! -//! new_handle!(APP_HELLO_WORLD); +//! impl_handle!(APP_HELLO_WORLD for HelloWorld); //! //! struct HelloWorld; //! @@ -119,6 +119,15 @@ pub use once_cell::sync::Lazy as LazyStatic; pub use static_files::Resource as StaticResource; pub type Handle = u64; + +pub trait HasHandle { + fn static_handle() -> Handle + where + Self: Sized; + + fn handle(&self) -> Handle; +} + pub type Weight = i8; pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 440ccd3f..bda89011 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -8,7 +8,7 @@ pub use crate::{Handle, HashMapResources, LazyStatic, Weight}; // Functions and macro helpers. pub use crate::util; -pub use crate::{kv, new_handle}; +pub use crate::{impl_handle, kv}; // MACROS. @@ -20,8 +20,6 @@ pub use crate::new_static_locales; pub use crate::{new_static_files, service_for_static_files}; // crate::core::actions pub use crate::actions; -// crate::base::action::component -pub use crate::actions_for_component; // API. diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index d21e3b23..aa9cc41a 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,20 +1,16 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::{new_handle, Handle}; - -new_handle!(ERROR_403); +use crate::impl_handle; pub struct Error403; +impl_handle!(ERROR_403 for Error403); + impl ComponentTrait for Error403 { fn new() -> Self { Self } - fn handle(&self) -> Handle { - ERROR_403 - } - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div { diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index e1f7827b..e3a77aac 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,20 +1,16 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::{new_handle, Handle}; - -new_handle!(ERROR_404); +use crate::impl_handle; pub struct Error404; +impl_handle!(ERROR_404 for Error404); + impl ComponentTrait for Error404 { fn new() -> Self { Self } - fn handle(&self) -> Handle { - ERROR_404 - } - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { div { diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index a2081b15..3cf4301a 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -92,6 +92,44 @@ pub fn absolute_dir( // MACRO HELPERS. // ************************************************************************************************* +#[macro_export] +macro_rules! impl_handle { + ( $HANDLE:ident for $Element:ident ) => { + /// Constant handle to represent a unique PageTop building element. + pub const $HANDLE: $crate::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); + + impl $crate::HasHandle for $Element { + #[inline] + fn static_handle() -> $crate::Handle { + $HANDLE + } + + #[inline] + fn handle(&self) -> $crate::Handle { + $HANDLE + } + } + }; + ( $HANDLE:ident for $Element:ident<$Implement:ident> ) => { + /// Constant handle to represent a unique PageTop building element. + pub const $HANDLE: $crate::Handle = + $crate::util::handle(module_path!(), file!(), line!(), column!()); + + impl<I: $Implement> $crate::HasHandle for $Element<I> { + #[inline] + fn static_handle() -> $crate::Handle { + $HANDLE + } + + #[inline] + fn handle(&self) -> $crate::Handle { + $HANDLE + } + } + }; +} + #[macro_export] /// Macro para construir grupos de pares clave-valor. /// @@ -111,17 +149,3 @@ macro_rules! kv { a }}; } - -#[macro_export] -macro_rules! new_handle { - ( $HANDLE:ident ) => { - /// Public constant handle to represent a unique PageTop building element. - pub const $HANDLE: $crate::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); - }; - ( $HANDLE:ident for Crate ) => { - /// Local constant handle to represent a unique PageTop building element. - pub(crate) const $HANDLE: $crate::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); - }; -} From 68c551bfb3536ab0ed232edcac828918bcdbef48 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 22:45:12 +0100 Subject: [PATCH 596/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20App?= =?UTF-8?q?ly=20Handle=20changes=20to=20improve=20actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/action/component.rs | 136 +----------------- .../component/after_prepare_component.rs | 61 ++++++++ .../component/before_prepare_component.rs | 61 ++++++++ .../base/action/page/after_prepare_body.rs | 10 +- .../base/action/page/before_prepare_body.rs | 10 +- pagetop/src/core/action/all.rs | 6 +- pagetop/src/core/action/definition.rs | 8 +- pagetop/src/core/component/definition.rs | 8 ++ 8 files changed, 150 insertions(+), 150 deletions(-) create mode 100644 pagetop/src/base/action/component/after_prepare_component.rs create mode 100644 pagetop/src/base/action/component/before_prepare_component.rs diff --git a/pagetop/src/base/action/component.rs b/pagetop/src/base/action/component.rs index 5cf72aa6..36987018 100644 --- a/pagetop/src/base/action/component.rs +++ b/pagetop/src/base/action/component.rs @@ -1,133 +1,9 @@ -#[macro_export] -macro_rules! actions_for_component { - ( $Component:ty ) => { - $crate::paste! { - #[allow(unused_imports)] - use $crate::prelude::*; +use crate::prelude::*; - pub type [<FnAction $Component>] = fn(component: &$Component, cx: &mut Context); +pub type FnAction<C> = fn(component: &C, cx: &mut Context); - // ************************************************************************************* - // ACTION BEFORE PREPARE COMPONENT - // ************************************************************************************* +mod before_prepare_component; +pub use before_prepare_component::*; - $crate::new_handle!([<ACTION_BEFORE_PREPARE_ $Component:upper>] for Crate); - - pub struct [<BeforePrepare $Component>] { - action: Option<[<FnAction $Component>]>, - weight: Weight, - } - - impl ActionTrait for [<BeforePrepare $Component>] { - fn new() -> Self { - [<BeforePrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - [<ACTION_BEFORE_PREPARE_ $Component:upper>] - } - - fn weight(&self) -> Weight { - self.weight - } - } - - impl [<BeforePrepare $Component>] { - #[allow(dead_code)] - pub fn with(action: [<FnAction $Component>]) -> Self { - [<BeforePrepare $Component>] { - action: Some(action), - weight: 0, - } - } - - #[allow(dead_code)] - pub fn with_weight(mut self, value: Weight) -> Self { - self.weight = value; - self - } - - pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub(crate) fn [<run_actions_before_prepare_ $Component:lower>]( - component: &mut $Component, - cx: &mut Context - ) { - run_actions([<ACTION_BEFORE_PREPARE_ $Component:upper>], |action| - action_ref::<[<BeforePrepare $Component>]>(&**action) - .run(component, cx) - ); - } - - // ************************************************************************************* - // ACTION AFTER PREPARE COMPONENT - // ************************************************************************************* - - $crate::new_handle!([<ACTION_AFTER_PREPARE_ $Component:upper>] for Crate); - - pub struct [<AfterPrepare $Component>] { - action: Option<[<FnAction $Component>]>, - weight: Weight, - } - - impl ActionTrait for [<AfterPrepare $Component>] { - fn new() -> Self { - [<AfterPrepare $Component>] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - [<ACTION_AFTER_PREPARE_ $Component:upper>] - } - - fn weight(&self) -> Weight { - self.weight - } - } - - impl [<AfterPrepare $Component>] { - #[allow(dead_code)] - pub fn with(action: [<FnAction $Component>]) -> Self { - [<AfterPrepare $Component>] { - action: Some(action), - weight: 0, - } - } - - #[allow(dead_code)] - pub fn with_weight(mut self, value: Weight) -> Self { - self.weight = value; - self - } - - pub(crate) fn run(&self, component: &mut $Component, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } - } - } - - #[inline(always)] - pub(crate) fn [<run_actions_after_prepare_ $Component:lower>]( - component: &mut $Component, - cx: &mut Context - ) { - run_actions([<ACTION_AFTER_PREPARE_ $Component:upper>], |action| - action_ref::<[<AfterPrepare $Component>]>(&**action) - .run(component, cx) - ); - } - } - }; -} +mod after_prepare_component; +pub use after_prepare_component::*; diff --git a/pagetop/src/base/action/component/after_prepare_component.rs b/pagetop/src/base/action/component/after_prepare_component.rs new file mode 100644 index 00000000..43791326 --- /dev/null +++ b/pagetop/src/base/action/component/after_prepare_component.rs @@ -0,0 +1,61 @@ +use crate::prelude::*; + +use super::FnAction; + +pub struct AfterPrepareComponent<C: ComponentTrait> { + action: Option<FnAction<C>>, + referer: Option<Handle>, + weight: Weight, +} + +impl_handle!(ACTION_AFTER_PREPARE_COMPONENT for AfterPrepareComponent<ComponentTrait>); + +impl<C: ComponentTrait> ActionTrait for AfterPrepareComponent<C> { + fn new() -> Self { + AfterPrepareComponent { + action: None, + referer: Some(C::static_handle()), + weight: 0, + } + } + + fn referer_handle(&self) -> Option<Handle> { + self.referer + } + + fn weight(&self) -> Weight { + self.weight + } +} + +impl<C: ComponentTrait> AfterPrepareComponent<C> { + pub fn with(action: FnAction<C>) -> Self { + AfterPrepareComponent { + action: Some(action), + referer: Some(C::static_handle()), + weight: 0, + } + } + + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + pub(crate) fn run(&self, component: &mut C, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } +} + +#[inline(always)] +pub(crate) fn run_actions_after_prepare_component<C: ComponentTrait>( + component: &mut C, + cx: &mut Context, +) { + run_actions( + (ACTION_AFTER_PREPARE_COMPONENT, Some(component.handle())), + |action| action_ref::<AfterPrepareComponent<C>>(&**action).run(component, cx), + ); +} diff --git a/pagetop/src/base/action/component/before_prepare_component.rs b/pagetop/src/base/action/component/before_prepare_component.rs new file mode 100644 index 00000000..2eb26272 --- /dev/null +++ b/pagetop/src/base/action/component/before_prepare_component.rs @@ -0,0 +1,61 @@ +use crate::prelude::*; + +use super::FnAction; + +pub struct BeforePrepareComponent<C: ComponentTrait> { + action: Option<FnAction<C>>, + referer: Option<Handle>, + weight: Weight, +} + +impl_handle!(ACTION_BEFORE_PREPARE_COMPONENT for BeforePrepareComponent<ComponentTrait>); + +impl<C: ComponentTrait> ActionTrait for BeforePrepareComponent<C> { + fn new() -> Self { + BeforePrepareComponent { + action: None, + referer: Some(C::static_handle()), + weight: 0, + } + } + + fn referer_handle(&self) -> Option<Handle> { + self.referer + } + + fn weight(&self) -> Weight { + self.weight + } +} + +impl<C: ComponentTrait> BeforePrepareComponent<C> { + pub fn with(action: FnAction<C>) -> Self { + BeforePrepareComponent { + action: Some(action), + referer: Some(C::static_handle()), + weight: 0, + } + } + + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + pub(crate) fn run(&self, component: &mut C, cx: &mut Context) { + if let Some(action) = self.action { + action(component, cx) + } + } +} + +#[inline(always)] +pub(crate) fn run_actions_before_prepare_component<C: ComponentTrait>( + component: &mut C, + cx: &mut Context, +) { + run_actions( + (ACTION_BEFORE_PREPARE_COMPONENT, Some(component.handle())), + |action| action_ref::<BeforePrepareComponent<C>>(&**action).run(component, cx), + ); +} diff --git a/pagetop/src/base/action/page/after_prepare_body.rs b/pagetop/src/base/action/page/after_prepare_body.rs index 0e2ced8d..d6295ef4 100644 --- a/pagetop/src/base/action/page/after_prepare_body.rs +++ b/pagetop/src/base/action/page/after_prepare_body.rs @@ -2,13 +2,13 @@ use crate::prelude::*; use super::FnActionPage; -new_handle!(ACTION_AFTER_PREPARE_BODY for Crate); - pub struct AfterPrepareBody { action: Option<FnActionPage>, weight: Weight, } +impl_handle!(ACTION_AFTER_PREPARE_BODY for AfterPrepareBody); + impl ActionTrait for AfterPrepareBody { fn new() -> Self { AfterPrepareBody { @@ -17,10 +17,6 @@ impl ActionTrait for AfterPrepareBody { } } - fn handle(&self) -> Handle { - ACTION_AFTER_PREPARE_BODY - } - fn weight(&self) -> Weight { self.weight } @@ -48,7 +44,7 @@ impl AfterPrepareBody { #[inline(always)] pub(crate) fn run_actions_after_prepare_body(page: &mut Page) { - run_actions(ACTION_AFTER_PREPARE_BODY, |action| { + run_actions((ACTION_AFTER_PREPARE_BODY, None), |action| { action_ref::<AfterPrepareBody>(&**action).run(page) }); } diff --git a/pagetop/src/base/action/page/before_prepare_body.rs b/pagetop/src/base/action/page/before_prepare_body.rs index 3198e6f3..6afcd88f 100644 --- a/pagetop/src/base/action/page/before_prepare_body.rs +++ b/pagetop/src/base/action/page/before_prepare_body.rs @@ -2,13 +2,13 @@ use crate::prelude::*; use super::FnActionPage; -new_handle!(ACTION_BEFORE_PREPARE_BODY for Crate); - pub struct BeforePrepareBody { action: Option<FnActionPage>, weight: Weight, } +impl_handle!(ACTION_BEFORE_PREPARE_BODY for BeforePrepareBody); + impl ActionTrait for BeforePrepareBody { fn new() -> Self { BeforePrepareBody { @@ -17,10 +17,6 @@ impl ActionTrait for BeforePrepareBody { } } - fn handle(&self) -> Handle { - ACTION_BEFORE_PREPARE_BODY - } - fn weight(&self) -> Weight { self.weight } @@ -48,7 +44,7 @@ impl BeforePrepareBody { #[inline(always)] pub(crate) fn run_actions_before_prepare_body(page: &mut Page) { - run_actions(ACTION_BEFORE_PREPARE_BODY, |action| { + run_actions((ACTION_BEFORE_PREPARE_BODY, None), |action| { action_ref::<BeforePrepareBody>(&**action).run(page) }); } diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index 4be2afe0..c42e1bee 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -5,12 +5,12 @@ use std::collections::HashMap; use std::sync::RwLock; // Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<Handle, ActionsList>>> = +static ACTIONS: LazyStatic<RwLock<HashMap<(Handle, Option<Handle>), ActionsList>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); pub fn add_action(action: Action) { let mut actions = ACTIONS.write().unwrap(); - let action_handle = action.handle(); + let action_handle = (action.handle(), action.referer_handle()); if let Some(list) = actions.get_mut(&action_handle) { list.add(action); } else { @@ -18,7 +18,7 @@ pub fn add_action(action: Action) { } } -pub fn run_actions<B, F>(action_handle: Handle, f: F) +pub fn run_actions<B, F>(action_handle: (Handle, Option<Handle>), f: F) where F: FnMut(&Action) -> B, { diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs index ad46f11b..a1b9fcc0 100644 --- a/pagetop/src/core/action/definition.rs +++ b/pagetop/src/core/action/definition.rs @@ -1,4 +1,4 @@ -use crate::{Handle, Weight}; +use crate::{Handle, HasHandle, Weight}; use std::any::Any; @@ -6,12 +6,14 @@ pub trait ActionBase: Any { fn as_ref_any(&self) -> &dyn Any; } -pub trait ActionTrait: ActionBase + Send + Sync { +pub trait ActionTrait: ActionBase + HasHandle + Send + Sync { fn new() -> Self where Self: Sized; - fn handle(&self) -> Handle; + fn referer_handle(&self) -> Option<Handle> { + None + } fn weight(&self) -> Weight { 0 diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 60b7ab46..411af1fb 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,3 +1,5 @@ +use crate::base::action::component::run_actions_after_prepare_component; +use crate::base::action::component::run_actions_before_prepare_component; use crate::core::component::Context; use crate::html::{html, Markup, PrepareMarkup}; use crate::{util, HasHandle, Weight}; @@ -59,6 +61,9 @@ impl<C: ComponentTrait> ComponentBase for C { // Acciones del tema antes de preparar el componente. cx.theme().before_prepare_component(self, cx); + // Acciones de los módulos antes de preparar el componente. + run_actions_before_prepare_component(self, cx); + let markup = match cx.theme().render_component(self, cx) { Some(html) => html, None => match self.prepare_component(cx) { @@ -74,6 +79,9 @@ impl<C: ComponentTrait> ComponentBase for C { // Acciones del tema después de preparar el componente. cx.theme().after_prepare_component(self, cx); + // Acciones de los módulos después de preparar el componente. + run_actions_after_prepare_component(self, cx); + markup } else { html! {} From 088ffe7272aa5a591ec5b85cea68231c06b28da4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 22:50:06 +0100 Subject: [PATCH 597/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Apply=20last=20?= =?UTF-8?q?Handle=20API=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 8 ++------ examples/basics/hello-name/src/main.rs | 8 ++------ examples/basics/hello-world/src/main.rs | 8 ++------ pagetop-admin/src/lib.rs | 8 ++------ pagetop-bootsier/src/lib.rs | 26 +++++++++++++++++-------- pagetop-bulmix/src/lib.rs | 8 ++------ pagetop-homedemo/src/lib.rs | 8 ++------ pagetop-node/src/lib.rs | 8 ++------ pagetop-user/src/lib.rs | 8 ++------ pagetop/tests/server/health_check.rs | 10 +++------- 10 files changed, 37 insertions(+), 63 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 04a959ad..2314c934 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,14 +1,10 @@ use pagetop::prelude::*; -new_handle!(APP_DRUST); - struct Drust; -impl ModuleTrait for Drust { - fn handle(&self) -> Handle { - APP_DRUST - } +impl_handle!(APP_DRUST for Drust); +impl ModuleTrait for Drust { fn dependencies(&self) -> Vec<ModuleRef> { vec![ // Themes. diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index 0af7c2d0..cf216f1f 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -1,14 +1,10 @@ use pagetop::prelude::*; -new_handle!(APP_HELLO_NAME); - struct HelloName; -impl ModuleTrait for HelloName { - fn handle(&self) -> Handle { - APP_HELLO_NAME - } +impl_handle!(APP_HELLO_NAME for HelloName); +impl ModuleTrait for HelloName { fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { scfg.service(hello_name); } diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 176c7304..516bade2 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -1,14 +1,10 @@ use pagetop::prelude::*; -new_handle!(APP_HELLO_WORLD); - struct HelloWorld; -impl ModuleTrait for HelloWorld { - fn handle(&self) -> Handle { - APP_HELLO_WORLD - } +impl_handle!(APP_HELLO_WORLD for HelloWorld); +impl ModuleTrait for HelloWorld { fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { scfg.route("/", service::web::get().to(hello_world)); } diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 69fcc06f..6ac9b553 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,18 +1,14 @@ use pagetop::prelude::*; -new_handle!(MODULE_ADMIN); - new_static_locales!(LOCALES_ADMIN); mod summary; pub struct Admin; -impl ModuleTrait for Admin { - fn handle(&self) -> Handle { - MODULE_ADMIN - } +impl_handle!(MODULE_ADMIN for Admin); +impl ModuleTrait for Admin { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_ADMIN) } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index e96fbe87..95fc9360 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,18 +1,14 @@ use pagetop::prelude::*; -new_handle!(THEME_BOOTSIER); - new_static_locales!(LOCALES_BOOTSIER); new_static_files!(bootsier); pub struct Bootsier; -impl ModuleTrait for Bootsier { - fn handle(&self) -> Handle { - THEME_BOOTSIER - } +impl_handle!(THEME_BOOTSIER for Bootsier); +impl ModuleTrait for Bootsier { fn theme(&self) -> Option<ThemeRef> { Some(&Bootsier) } @@ -108,8 +104,8 @@ impl ThemeTrait for Bootsier { _ => {} }; } - COMPONENT_BASE_ANCHOR => { - let a = component_as_mut::<Anchor>(component); + COMPONENT_BASE_BUTTON => { + let a = component_as_mut::<Button>(component); match a.font_size() { FontSize::ExtraLarge => { a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-1"); @@ -128,6 +124,20 @@ impl ThemeTrait for Bootsier { } _ => {} }; + match a.anchor_type() { + ButtonType::Link => { + a.alter_classes( + ClassesOp::Replace(a.anchor_type().to_string()), + "btn btn-link", + ); + } + ButtonType::Primary => { + a.alter_classes( + ClassesOp::Replace(a.anchor_type().to_string()), + "btn btn-primary", + ); + } + } } COMPONENT_BASE_HEADING => { let h = component_as_mut::<Heading>(component); diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 64fe10ec..a399546a 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,16 +1,12 @@ use pagetop::prelude::*; -new_handle!(THEME_BULMIX); - new_static_files!(bulmix); pub struct Bulmix; -impl ModuleTrait for Bulmix { - fn handle(&self) -> Handle { - THEME_BULMIX - } +impl_handle!(THEME_BULMIX for Bulmix); +impl ModuleTrait for Bulmix { fn theme(&self) -> Option<ThemeRef> { Some(&Bulmix) } diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 706e34be..2db941bd 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,18 +1,14 @@ use pagetop::prelude::*; -new_handle!(MODULE_HOMEDEMO); - new_static_locales!(LOCALES_HOMEDEMO); new_static_files!(homedemo); pub struct HomeDemo; -impl ModuleTrait for HomeDemo { - fn handle(&self) -> Handle { - MODULE_HOMEDEMO - } +impl_handle!(MODULE_HOMEDEMO for HomeDemo); +impl ModuleTrait for HomeDemo { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_HOMEDEMO) } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 51f56740..5fada548 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,7 +1,5 @@ use pagetop::prelude::*; -new_handle!(MODULE_NODE); - new_static_locales!(LOCALES_NODE); //mod entity; @@ -9,11 +7,9 @@ mod migration; pub struct Node; -impl ModuleTrait for Node { - fn handle(&self) -> Handle { - MODULE_NODE - } +impl_handle!(MODULE_NODE for Node); +impl ModuleTrait for Node { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_NODE) } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 73d61e17..e1eb385d 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,18 +1,14 @@ use pagetop::prelude::*; -new_handle!(MODULE_USER); - new_static_locales!(LOCALES_USER); mod migration; pub struct User; -impl ModuleTrait for User { - fn handle(&self) -> Handle { - MODULE_USER - } +impl_handle!(MODULE_USER for User); +impl ModuleTrait for User { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_USER) } diff --git a/pagetop/tests/server/health_check.rs b/pagetop/tests/server/health_check.rs index eec9c11b..3f70b8e4 100644 --- a/pagetop/tests/server/health_check.rs +++ b/pagetop/tests/server/health_check.rs @@ -1,14 +1,10 @@ use pagetop::prelude::*; -new_handle!(MODULE_TEST_SERVER_HEALTH_CHECK); - struct HealthCheck; -impl ModuleTrait for HealthCheck { - fn handle(&self) -> Handle { - MODULE_TEST_SERVER_HEALTH_CHECK - } -} +impl_handle!(MODULE_TEST_SERVER_HEALTH_CHECK for HealthCheck); + +impl ModuleTrait for HealthCheck {} #[pagetop::test] async fn health_check_works() { From 0397036d95865bf4e3c1e1a9b113f57baf243154 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 22:59:15 +0100 Subject: [PATCH 598/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20"new=5Fstatic?= =?UTF-8?q?=5F..!"=20macros=20to=20"static=5F..!"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 4 ++-- pagetop-build/src/lib.rs | 4 ++-- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 4 ++-- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/core/module/all.rs | 4 ++-- pagetop/src/lib.rs | 2 +- pagetop/src/locale.rs | 8 ++++---- pagetop/src/prelude.rs | 4 ++-- pagetop/src/service.rs | 2 +- 12 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 6ac9b553..ee89c0e0 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -new_static_locales!(LOCALES_ADMIN); +static_locales!(LOCALES_ADMIN); mod summary; diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 95fc9360..40e837ad 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -1,8 +1,8 @@ use pagetop::prelude::*; -new_static_locales!(LOCALES_BOOTSIER); +static_locales!(LOCALES_BOOTSIER); -new_static_files!(bootsier); +static_files!(bootsier); pub struct Bootsier; diff --git a/pagetop-build/src/lib.rs b/pagetop-build/src/lib.rs index 5b9cfa61..8c53d241 100644 --- a/pagetop-build/src/lib.rs +++ b/pagetop-build/src/lib.rs @@ -59,7 +59,7 @@ //! ```rust#ignore //! use pagetop::prelude::*; //! -//! new_static_files!(guides); +//! static_files!(guides); //! ``` //! //! Also you can get the bundle as a static reference to the generated HashMap resources collection: @@ -67,7 +67,7 @@ //! ```rust#ignore //! use pagetop::prelude::*; //! -//! new_static_files!(guides => BUNDLE_GUIDES); +//! static_files!(guides => BUNDLE_GUIDES); //! ``` //! //! You can build more than one resources file to compile with your project. diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index a399546a..272f83b2 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -new_static_files!(bulmix); +static_files!(bulmix); pub struct Bulmix; diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 2db941bd..0ee1ae3b 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -1,8 +1,8 @@ use pagetop::prelude::*; -new_static_locales!(LOCALES_HOMEDEMO); +static_locales!(LOCALES_HOMEDEMO); -new_static_files!(homedemo); +static_files!(homedemo); pub struct HomeDemo; diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 5fada548..1494aaa0 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -new_static_locales!(LOCALES_NODE); +static_locales!(LOCALES_NODE); //mod entity; mod migration; diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index e1eb385d..749ee99e 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -new_static_locales!(LOCALES_USER); +static_locales!(LOCALES_USER); mod migration; diff --git a/pagetop/src/core/module/all.rs b/pagetop/src/core/module/all.rs index e4e2b923..b8243c68 100644 --- a/pagetop/src/core/module/all.rs +++ b/pagetop/src/core/module/all.rs @@ -1,14 +1,14 @@ use crate::core::action::add_action; use crate::core::module::ModuleRef; use crate::core::theme::all::THEMES; -use crate::{config, new_static_files, service, service_for_static_files, trace, LazyStatic}; +use crate::{config, service, service_for_static_files, static_files, trace, LazyStatic}; #[cfg(feature = "database")] use crate::db::*; use std::sync::RwLock; -new_static_files!(base); +static_files!(base); // MODULES ***************************************************************************************** diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index c6569696..27e73965 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -131,7 +131,7 @@ pub trait HasHandle { pub type Weight = i8; pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; -new_static_locales!(LOCALES_PAGETOP); +static_locales!(LOCALES_PAGETOP); // ************************************************************************************************* // PUBLIC API. diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 8f9be238..81520c98 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -70,13 +70,13 @@ //! # Cómo aplicar la localización en tu código //! //! Una vez hayas creado tu directorio de recursos FTL usa la macro -//! [`new_static_locales!`](crate::new_static_locales) para integrarlos en tu módulo o aplicación. +//! [`static_locales!`](crate::static_locales) para integrarlos en tu módulo o aplicación. //! si tus recursos se encuentran en el directorio `"src/locale"` bastará con declarar: //! //! ``` //! use pagetop::prelude::*; //! -//! new_static_locales!(LOCALES_SAMPLE); +//! static_locales!(LOCALES_SAMPLE); //! ``` //! //! Y si están en otro directorio, entonces puedes usar: @@ -84,7 +84,7 @@ //! ``` //! use pagetop::prelude::*; //! -//! new_static_locales!(LOCALES_SAMPLE in "path/to/locale"); +//! static_locales!(LOCALES_SAMPLE in "path/to/locale"); //! ``` use crate::html::{Markup, PreEscaped}; @@ -142,7 +142,7 @@ pub fn langid_for(language: impl Into<String>) -> Result<&'static LanguageIdenti #[macro_export] /// Define un conjunto de elementos de localización y textos locales de traducción. -macro_rules! new_static_locales { +macro_rules! static_locales { ( $LOCALES:ident $(, $core_locales:literal)? ) => { $crate::locale::fluent_templates::static_loader! { static $LOCALES = { diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index bda89011..af7a5d43 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -15,9 +15,9 @@ pub use crate::{impl_handle, kv}; // crate::config pub use crate::default_settings; // crate::locale -pub use crate::new_static_locales; +pub use crate::static_locales; // crate::service -pub use crate::{new_static_files, service_for_static_files}; +pub use crate::{service_for_static_files, static_files}; // crate::core::actions pub use crate::actions; diff --git a/pagetop/src/service.rs b/pagetop/src/service.rs index 2f079616..9922e88c 100644 --- a/pagetop/src/service.rs +++ b/pagetop/src/service.rs @@ -13,7 +13,7 @@ pub use actix_web_files::Files as ActixFiles; pub use actix_web_static_files::ResourceFiles; #[macro_export] -macro_rules! new_static_files { +macro_rules! static_files { ( $bundle:ident ) => { $crate::paste! { mod [<static_files_ $bundle>] { From 7c9b08752a0c5b527b1e1fb577d062484a6a05b6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 23:15:00 +0100 Subject: [PATCH 599/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Pas?= =?UTF-8?q?ses=20fmt=20and=20clippy=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/action/all.rs | 4 +++- pagetop/src/db.rs | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index c42e1bee..66d0e1d4 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -4,8 +4,10 @@ use crate::{Handle, LazyStatic}; use std::collections::HashMap; use std::sync::RwLock; +type KeyHandles = (Handle, Option<Handle>); + // Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<(Handle, Option<Handle>), ActionsList>>> = +static ACTIONS: LazyStatic<RwLock<HashMap<KeyHandles, ActionsList>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); pub fn add_action(action: Action) { diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index aac2e073..fb652c11 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -93,7 +93,9 @@ pub async fn query<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Vec<QueryRes )) .await } - None => Err(DbErr::Conn(RuntimeErr::Internal(DBCONN_NOT_INITIALIZED.to_owned()))), + None => Err(DbErr::Conn(RuntimeErr::Internal( + DBCONN_NOT_INITIALIZED.to_owned(), + ))), } } @@ -112,7 +114,9 @@ pub async fn exec<Q: QueryStatementWriter>(stmt: &mut Q) -> Result<Option<QueryR )) .await } - None => Err(DbErr::Conn(RuntimeErr::Internal(DBCONN_NOT_INITIALIZED.to_owned()))), + None => Err(DbErr::Conn(RuntimeErr::Internal( + DBCONN_NOT_INITIALIZED.to_owned(), + ))), } } @@ -124,7 +128,9 @@ pub async fn exec_raw(stmt: String) -> Result<ExecResult, DbErr> { .execute(Statement::from_string(dbbackend, stmt)) .await } - None => Err(DbErr::Conn(RuntimeErr::Internal(DBCONN_NOT_INITIALIZED.to_owned()))), + None => Err(DbErr::Conn(RuntimeErr::Internal( + DBCONN_NOT_INITIALIZED.to_owned(), + ))), } } From 81b18777990196c0f0f68a27dd7340875fff32dd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Nov 2023 23:36:28 +0100 Subject: [PATCH 600/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 27e73965..43772bbe 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -129,6 +129,7 @@ pub trait HasHandle { } pub type Weight = i8; + pub type HashMapResources = std::collections::HashMap<&'static str, StaticResource>; static_locales!(LOCALES_PAGETOP); From 23dc58c2ac43561d3fce9cae5b3704c4c4b0be64 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Nov 2023 02:23:43 +0100 Subject: [PATCH 601/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Sim?= =?UTF-8?q?plify=20action=20creation=20and=20management?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/action/component.rs | 2 +- .../component/after_prepare_component.rs | 54 +++++++++-------- .../component/before_prepare_component.rs | 58 ++++++++++--------- .../base/action/page/after_prepare_body.rs | 31 ++++------ .../base/action/page/before_prepare_body.rs | 31 ++++------ pagetop/src/core/action.rs | 2 +- pagetop/src/core/action/all.rs | 10 +++- pagetop/src/core/action/definition.rs | 8 +-- pagetop/src/core/component/definition.rs | 14 +++-- pagetop/src/response/page.rs | 14 ++--- 10 files changed, 106 insertions(+), 118 deletions(-) diff --git a/pagetop/src/base/action/component.rs b/pagetop/src/base/action/component.rs index 36987018..a1d4ddc8 100644 --- a/pagetop/src/base/action/component.rs +++ b/pagetop/src/base/action/component.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -pub type FnAction<C> = fn(component: &C, cx: &mut Context); +pub type FnAction<C> = fn(component: &mut C, cx: &mut Context); mod before_prepare_component; pub use before_prepare_component::*; diff --git a/pagetop/src/base/action/component/after_prepare_component.rs b/pagetop/src/base/action/component/after_prepare_component.rs index 43791326..6396480e 100644 --- a/pagetop/src/base/action/component/after_prepare_component.rs +++ b/pagetop/src/base/action/component/after_prepare_component.rs @@ -3,24 +3,21 @@ use crate::prelude::*; use super::FnAction; pub struct AfterPrepareComponent<C: ComponentTrait> { - action: Option<FnAction<C>>, - referer: Option<Handle>, + f: Option<FnAction<C>>, + referer_handle: Option<Handle>, + referer_id: OptionId, weight: Weight, } impl_handle!(ACTION_AFTER_PREPARE_COMPONENT for AfterPrepareComponent<ComponentTrait>); impl<C: ComponentTrait> ActionTrait for AfterPrepareComponent<C> { - fn new() -> Self { - AfterPrepareComponent { - action: None, - referer: Some(C::static_handle()), - weight: 0, - } + fn referer_handle(&self) -> Option<Handle> { + self.referer_handle } - fn referer_handle(&self) -> Option<Handle> { - self.referer + fn referer_id(&self) -> Option<String> { + self.referer_id.get() } fn weight(&self) -> Weight { @@ -29,33 +26,34 @@ impl<C: ComponentTrait> ActionTrait for AfterPrepareComponent<C> { } impl<C: ComponentTrait> AfterPrepareComponent<C> { - pub fn with(action: FnAction<C>) -> Self { + pub fn with(f: FnAction<C>) -> Self { AfterPrepareComponent { - action: Some(action), - referer: Some(C::static_handle()), + f: Some(f), + referer_handle: Some(C::static_handle()), + referer_id: OptionId::default(), weight: 0, } } + pub fn filtering_id(mut self, id: impl Into<String>) -> Self { + self.referer_id.alter_value(id); + self + } + pub fn with_weight(mut self, value: Weight) -> Self { self.weight = value; self } - pub(crate) fn run(&self, component: &mut C, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } + #[inline(always)] + pub(crate) fn dispatch(component: &mut C, cx: &mut Context, id: Option<String>) { + dispatch_actions( + (ACTION_AFTER_PREPARE_COMPONENT, Some(component.handle()), id), + |action| { + if let Some(f) = action_ref::<AfterPrepareComponent<C>>(&**action).f { + f(component, cx) + } + }, + ); } } - -#[inline(always)] -pub(crate) fn run_actions_after_prepare_component<C: ComponentTrait>( - component: &mut C, - cx: &mut Context, -) { - run_actions( - (ACTION_AFTER_PREPARE_COMPONENT, Some(component.handle())), - |action| action_ref::<AfterPrepareComponent<C>>(&**action).run(component, cx), - ); -} diff --git a/pagetop/src/base/action/component/before_prepare_component.rs b/pagetop/src/base/action/component/before_prepare_component.rs index 2eb26272..331fb87d 100644 --- a/pagetop/src/base/action/component/before_prepare_component.rs +++ b/pagetop/src/base/action/component/before_prepare_component.rs @@ -3,24 +3,21 @@ use crate::prelude::*; use super::FnAction; pub struct BeforePrepareComponent<C: ComponentTrait> { - action: Option<FnAction<C>>, - referer: Option<Handle>, + f: Option<FnAction<C>>, + referer_handle: Option<Handle>, + referer_id: OptionId, weight: Weight, } impl_handle!(ACTION_BEFORE_PREPARE_COMPONENT for BeforePrepareComponent<ComponentTrait>); impl<C: ComponentTrait> ActionTrait for BeforePrepareComponent<C> { - fn new() -> Self { - BeforePrepareComponent { - action: None, - referer: Some(C::static_handle()), - weight: 0, - } + fn referer_handle(&self) -> Option<Handle> { + self.referer_handle } - fn referer_handle(&self) -> Option<Handle> { - self.referer + fn referer_id(&self) -> Option<String> { + self.referer_id.get() } fn weight(&self) -> Weight { @@ -29,33 +26,38 @@ impl<C: ComponentTrait> ActionTrait for BeforePrepareComponent<C> { } impl<C: ComponentTrait> BeforePrepareComponent<C> { - pub fn with(action: FnAction<C>) -> Self { + pub fn with(f: FnAction<C>) -> Self { BeforePrepareComponent { - action: Some(action), - referer: Some(C::static_handle()), + f: Some(f), + referer_handle: Some(C::static_handle()), + referer_id: OptionId::default(), weight: 0, } } + pub fn filtering_id(mut self, id: impl Into<String>) -> Self { + self.referer_id.alter_value(id); + self + } + pub fn with_weight(mut self, value: Weight) -> Self { self.weight = value; self } - pub(crate) fn run(&self, component: &mut C, cx: &mut Context) { - if let Some(action) = self.action { - action(component, cx) - } + #[inline(always)] + pub(crate) fn dispatch(component: &mut C, cx: &mut Context, id: Option<String>) { + dispatch_actions( + ( + ACTION_BEFORE_PREPARE_COMPONENT, + Some(component.handle()), + id, + ), + |action| { + if let Some(f) = action_ref::<BeforePrepareComponent<C>>(&**action).f { + f(component, cx) + } + }, + ); } } - -#[inline(always)] -pub(crate) fn run_actions_before_prepare_component<C: ComponentTrait>( - component: &mut C, - cx: &mut Context, -) { - run_actions( - (ACTION_BEFORE_PREPARE_COMPONENT, Some(component.handle())), - |action| action_ref::<BeforePrepareComponent<C>>(&**action).run(component, cx), - ); -} diff --git a/pagetop/src/base/action/page/after_prepare_body.rs b/pagetop/src/base/action/page/after_prepare_body.rs index d6295ef4..8f270d19 100644 --- a/pagetop/src/base/action/page/after_prepare_body.rs +++ b/pagetop/src/base/action/page/after_prepare_body.rs @@ -3,29 +3,22 @@ use crate::prelude::*; use super::FnActionPage; pub struct AfterPrepareBody { - action: Option<FnActionPage>, + f: Option<FnActionPage>, weight: Weight, } impl_handle!(ACTION_AFTER_PREPARE_BODY for AfterPrepareBody); impl ActionTrait for AfterPrepareBody { - fn new() -> Self { - AfterPrepareBody { - action: None, - weight: 0, - } - } - fn weight(&self) -> Weight { self.weight } } impl AfterPrepareBody { - pub fn with(action: FnActionPage) -> Self { + pub fn with(f: FnActionPage) -> Self { AfterPrepareBody { - action: Some(action), + f: Some(f), weight: 0, } } @@ -35,16 +28,12 @@ impl AfterPrepareBody { self } - pub(crate) fn run(&self, page: &mut Page) { - if let Some(action) = self.action { - action(page) - } + #[inline(always)] + pub(crate) fn dispatch(page: &mut Page) { + dispatch_actions((ACTION_AFTER_PREPARE_BODY, None, None), |action| { + if let Some(f) = action_ref::<AfterPrepareBody>(&**action).f { + f(page) + } + }); } } - -#[inline(always)] -pub(crate) fn run_actions_after_prepare_body(page: &mut Page) { - run_actions((ACTION_AFTER_PREPARE_BODY, None), |action| { - action_ref::<AfterPrepareBody>(&**action).run(page) - }); -} diff --git a/pagetop/src/base/action/page/before_prepare_body.rs b/pagetop/src/base/action/page/before_prepare_body.rs index 6afcd88f..6c19be9b 100644 --- a/pagetop/src/base/action/page/before_prepare_body.rs +++ b/pagetop/src/base/action/page/before_prepare_body.rs @@ -3,29 +3,22 @@ use crate::prelude::*; use super::FnActionPage; pub struct BeforePrepareBody { - action: Option<FnActionPage>, + f: Option<FnActionPage>, weight: Weight, } impl_handle!(ACTION_BEFORE_PREPARE_BODY for BeforePrepareBody); impl ActionTrait for BeforePrepareBody { - fn new() -> Self { - BeforePrepareBody { - action: None, - weight: 0, - } - } - fn weight(&self) -> Weight { self.weight } } impl BeforePrepareBody { - pub fn with(action: FnActionPage) -> Self { + pub fn with(f: FnActionPage) -> Self { BeforePrepareBody { - action: Some(action), + f: Some(f), weight: 0, } } @@ -35,16 +28,12 @@ impl BeforePrepareBody { self } - pub(crate) fn run(&self, page: &mut Page) { - if let Some(action) = self.action { - action(page) - } + #[inline(always)] + pub(crate) fn dispatch(page: &mut Page) { + dispatch_actions((ACTION_BEFORE_PREPARE_BODY, None, None), |action| { + if let Some(f) = action_ref::<BeforePrepareBody>(&**action).f { + f(page) + } + }); } } - -#[inline(always)] -pub(crate) fn run_actions_before_prepare_body(page: &mut Page) { - run_actions((ACTION_BEFORE_PREPARE_BODY, None), |action| { - action_ref::<BeforePrepareBody>(&**action).run(page) - }); -} diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index c257973a..e4918a8e 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -7,4 +7,4 @@ use list::ActionsList; mod all; pub(crate) use all::add_action; -pub use all::run_actions; +pub use all::dispatch_actions; diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index 66d0e1d4..d6b70cd9 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -4,7 +4,7 @@ use crate::{Handle, LazyStatic}; use std::collections::HashMap; use std::sync::RwLock; -type KeyHandles = (Handle, Option<Handle>); +type KeyHandles = (Handle, Option<Handle>, Option<String>); // Registered actions. static ACTIONS: LazyStatic<RwLock<HashMap<KeyHandles, ActionsList>>> = @@ -12,7 +12,11 @@ static ACTIONS: LazyStatic<RwLock<HashMap<KeyHandles, ActionsList>>> = pub fn add_action(action: Action) { let mut actions = ACTIONS.write().unwrap(); - let action_handle = (action.handle(), action.referer_handle()); + let action_handle = ( + action.handle(), + action.referer_handle(), + action.referer_id(), + ); if let Some(list) = actions.get_mut(&action_handle) { list.add(action); } else { @@ -20,7 +24,7 @@ pub fn add_action(action: Action) { } } -pub fn run_actions<B, F>(action_handle: (Handle, Option<Handle>), f: F) +pub fn dispatch_actions<B, F>(action_handle: (Handle, Option<Handle>, Option<String>), f: F) where F: FnMut(&Action) -> B, { diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs index a1b9fcc0..a1c97db9 100644 --- a/pagetop/src/core/action/definition.rs +++ b/pagetop/src/core/action/definition.rs @@ -7,14 +7,14 @@ pub trait ActionBase: Any { } pub trait ActionTrait: ActionBase + HasHandle + Send + Sync { - fn new() -> Self - where - Self: Sized; - fn referer_handle(&self) -> Option<Handle> { None } + fn referer_id(&self) -> Option<String> { + None + } + fn weight(&self) -> Weight { 0 } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 411af1fb..47037022 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,5 +1,4 @@ -use crate::base::action::component::run_actions_after_prepare_component; -use crate::base::action::component::run_actions_before_prepare_component; +use crate::base::action; use crate::core::component::Context; use crate::html::{html, Markup, PrepareMarkup}; use crate::{util, HasHandle, Weight}; @@ -62,8 +61,12 @@ impl<C: ComponentTrait> ComponentBase for C { cx.theme().before_prepare_component(self, cx); // Acciones de los módulos antes de preparar el componente. - run_actions_before_prepare_component(self, cx); + action::component::BeforePrepareComponent::dispatch(self, cx, None); + if let Some(id) = self.id() { + action::component::BeforePrepareComponent::dispatch(self, cx, Some(id)); + } + // Renderiza el componente. let markup = match cx.theme().render_component(self, cx) { Some(html) => html, None => match self.prepare_component(cx) { @@ -80,7 +83,10 @@ impl<C: ComponentTrait> ComponentBase for C { cx.theme().after_prepare_component(self, cx); // Acciones de los módulos después de preparar el componente. - run_actions_after_prepare_component(self, cx); + action::component::AfterPrepareComponent::dispatch(self, cx, None); + if let Some(id) = self.id() { + action::component::AfterPrepareComponent::dispatch(self, cx, Some(id)); + } markup } else { diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index f947c106..a8f19f05 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,4 +1,4 @@ -use crate::base::action::page::{run_actions_after_prepare_body, run_actions_before_prepare_body}; +use crate::base::action; use crate::core::component::{ArcComponent, ArcComponents as RegionComponents, ComponentTrait}; use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; @@ -150,21 +150,21 @@ impl Page { // Page RENDER. pub fn render(&mut self) -> ResultPage<Markup, FatalError> { - // Module actions before preparing the page body. - run_actions_before_prepare_body(self); - // Theme actions before preparing the page body. self.context.theme().before_prepare_body(self); + // Module actions before preparing the page body. + action::page::BeforePrepareBody::dispatch(self); + // Prepare page body. let body = self.context.theme().prepare_body(self); - // Module actions after preparing the page body. - run_actions_after_prepare_body(self); - // Theme actions after preparing the page body. self.context.theme().after_prepare_body(self); + // Module actions after preparing the page body. + action::page::AfterPrepareBody::dispatch(self); + // Prepare page head. let head = self.context.theme().prepare_head(self); From 7a68cf9be71dfa8de0ba58143c2e440d36cc4671 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Nov 2023 02:27:20 +0100 Subject: [PATCH 602/853] =?UTF-8?q?=F0=9F=A6=BA=20Include=20code=20to=20us?= =?UTF-8?q?e=20the=20new=20API=20actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 10 +++++++++- pagetop-admin/src/summary.rs | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index ee89c0e0..98b5a4b3 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -18,7 +18,11 @@ impl ModuleTrait for Admin { } fn actions(&self) -> Vec<Action> { - actions![action::page::BeforePrepareBody::with(before_prepare_body)] + actions![ + action::page::BeforePrepareBody::with(before_prepare_body), + action::component::BeforePrepareComponent::<Menu>::with(before_prepare_menu) + .filtering_id("admin-menu-test"), + ] } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { @@ -31,3 +35,7 @@ impl ModuleTrait for Admin { fn before_prepare_body(page: &mut Page) { page.alter_body_classes(ClassesOp::Add, "test-admin"); } + +fn before_prepare_menu(component: &mut Menu, _cx: &mut Context) { + component.alter_id("admin-menu-test-altered"); +} diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index e9d9e1a7..f61ee3ee 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -4,6 +4,7 @@ use pagetop::prelude::*; pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { let top_menu = Menu::new() + .with_id("admin-menu-test") .add_item(menu::Item::label(L10n::t("module_name", &LOCALES_ADMIN))) .add_item(menu::Item::label(L10n::n("Ejemplo \"Label\""))) .add_item(menu::Item::link(L10n::n("Ejemplo \"Link\""), |_| { From c108235613363fe16be36936e9da965a98047711 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Nov 2023 12:57:14 +0100 Subject: [PATCH 603/853] =?UTF-8?q?=F0=9F=8E=A8=20Improve=20the=20code=20f?= =?UTF-8?q?or=20actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 2 +- .../component/after_prepare_component.rs | 16 ++++++--------- .../component/before_prepare_component.rs | 20 ++++++------------- .../base/action/page/after_prepare_body.rs | 13 ++++-------- .../base/action/page/before_prepare_body.rs | 13 ++++-------- pagetop/src/core/action.rs | 2 +- pagetop/src/core/action/all.rs | 14 ++++++------- pagetop/src/prelude.rs | 2 +- 8 files changed, 30 insertions(+), 52 deletions(-) diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index 98b5a4b3..bf7f5ca0 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -21,7 +21,7 @@ impl ModuleTrait for Admin { actions![ action::page::BeforePrepareBody::with(before_prepare_body), action::component::BeforePrepareComponent::<Menu>::with(before_prepare_menu) - .filtering_id("admin-menu-test"), + .filter_by_referer_id("admin-menu-test"), ] } diff --git a/pagetop/src/base/action/component/after_prepare_component.rs b/pagetop/src/base/action/component/after_prepare_component.rs index 6396480e..55087bd8 100644 --- a/pagetop/src/base/action/component/after_prepare_component.rs +++ b/pagetop/src/base/action/component/after_prepare_component.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::FnAction; pub struct AfterPrepareComponent<C: ComponentTrait> { - f: Option<FnAction<C>>, + f: FnAction<C>, referer_handle: Option<Handle>, referer_id: OptionId, weight: Weight, @@ -28,14 +28,14 @@ impl<C: ComponentTrait> ActionTrait for AfterPrepareComponent<C> { impl<C: ComponentTrait> AfterPrepareComponent<C> { pub fn with(f: FnAction<C>) -> Self { AfterPrepareComponent { - f: Some(f), + f, referer_handle: Some(C::static_handle()), referer_id: OptionId::default(), weight: 0, } } - pub fn filtering_id(mut self, id: impl Into<String>) -> Self { + pub fn filter_by_referer_id(mut self, id: impl Into<String>) -> Self { self.referer_id.alter_value(id); self } @@ -46,14 +46,10 @@ impl<C: ComponentTrait> AfterPrepareComponent<C> { } #[inline(always)] - pub(crate) fn dispatch(component: &mut C, cx: &mut Context, id: Option<String>) { + pub(crate) fn dispatch(component: &mut C, cx: &mut Context, referer_id: Option<String>) { dispatch_actions( - (ACTION_AFTER_PREPARE_COMPONENT, Some(component.handle()), id), - |action| { - if let Some(f) = action_ref::<AfterPrepareComponent<C>>(&**action).f { - f(component, cx) - } - }, + (Self::static_handle(), Some(component.handle()), referer_id), + |action| (action_ref::<AfterPrepareComponent<C>>(&**action).f)(component, cx), ); } } diff --git a/pagetop/src/base/action/component/before_prepare_component.rs b/pagetop/src/base/action/component/before_prepare_component.rs index 331fb87d..b4a6106c 100644 --- a/pagetop/src/base/action/component/before_prepare_component.rs +++ b/pagetop/src/base/action/component/before_prepare_component.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::FnAction; pub struct BeforePrepareComponent<C: ComponentTrait> { - f: Option<FnAction<C>>, + f: FnAction<C>, referer_handle: Option<Handle>, referer_id: OptionId, weight: Weight, @@ -28,14 +28,14 @@ impl<C: ComponentTrait> ActionTrait for BeforePrepareComponent<C> { impl<C: ComponentTrait> BeforePrepareComponent<C> { pub fn with(f: FnAction<C>) -> Self { BeforePrepareComponent { - f: Some(f), + f, referer_handle: Some(C::static_handle()), referer_id: OptionId::default(), weight: 0, } } - pub fn filtering_id(mut self, id: impl Into<String>) -> Self { + pub fn filter_by_referer_id(mut self, id: impl Into<String>) -> Self { self.referer_id.alter_value(id); self } @@ -46,18 +46,10 @@ impl<C: ComponentTrait> BeforePrepareComponent<C> { } #[inline(always)] - pub(crate) fn dispatch(component: &mut C, cx: &mut Context, id: Option<String>) { + pub(crate) fn dispatch(component: &mut C, cx: &mut Context, referer_id: Option<String>) { dispatch_actions( - ( - ACTION_BEFORE_PREPARE_COMPONENT, - Some(component.handle()), - id, - ), - |action| { - if let Some(f) = action_ref::<BeforePrepareComponent<C>>(&**action).f { - f(component, cx) - } - }, + (Self::static_handle(), Some(component.handle()), referer_id), + |action| (action_ref::<BeforePrepareComponent<C>>(&**action).f)(component, cx), ); } } diff --git a/pagetop/src/base/action/page/after_prepare_body.rs b/pagetop/src/base/action/page/after_prepare_body.rs index 8f270d19..342d5fc2 100644 --- a/pagetop/src/base/action/page/after_prepare_body.rs +++ b/pagetop/src/base/action/page/after_prepare_body.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::FnActionPage; pub struct AfterPrepareBody { - f: Option<FnActionPage>, + f: FnActionPage, weight: Weight, } @@ -17,10 +17,7 @@ impl ActionTrait for AfterPrepareBody { impl AfterPrepareBody { pub fn with(f: FnActionPage) -> Self { - AfterPrepareBody { - f: Some(f), - weight: 0, - } + AfterPrepareBody { f, weight: 0 } } pub fn with_weight(mut self, value: Weight) -> Self { @@ -30,10 +27,8 @@ impl AfterPrepareBody { #[inline(always)] pub(crate) fn dispatch(page: &mut Page) { - dispatch_actions((ACTION_AFTER_PREPARE_BODY, None, None), |action| { - if let Some(f) = action_ref::<AfterPrepareBody>(&**action).f { - f(page) - } + dispatch_actions((Self::static_handle(), None, None), |action| { + (action_ref::<AfterPrepareBody>(&**action).f)(page) }); } } diff --git a/pagetop/src/base/action/page/before_prepare_body.rs b/pagetop/src/base/action/page/before_prepare_body.rs index 6c19be9b..9dd69539 100644 --- a/pagetop/src/base/action/page/before_prepare_body.rs +++ b/pagetop/src/base/action/page/before_prepare_body.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::FnActionPage; pub struct BeforePrepareBody { - f: Option<FnActionPage>, + f: FnActionPage, weight: Weight, } @@ -17,10 +17,7 @@ impl ActionTrait for BeforePrepareBody { impl BeforePrepareBody { pub fn with(f: FnActionPage) -> Self { - BeforePrepareBody { - f: Some(f), - weight: 0, - } + BeforePrepareBody { f, weight: 0 } } pub fn with_weight(mut self, value: Weight) -> Self { @@ -30,10 +27,8 @@ impl BeforePrepareBody { #[inline(always)] pub(crate) fn dispatch(page: &mut Page) { - dispatch_actions((ACTION_BEFORE_PREPARE_BODY, None, None), |action| { - if let Some(f) = action_ref::<BeforePrepareBody>(&**action).f { - f(page) - } + dispatch_actions((Self::static_handle(), None, None), |action| { + (action_ref::<BeforePrepareBody>(&**action).f)(page) }); } } diff --git a/pagetop/src/core/action.rs b/pagetop/src/core/action.rs index e4918a8e..1add337b 100644 --- a/pagetop/src/core/action.rs +++ b/pagetop/src/core/action.rs @@ -7,4 +7,4 @@ use list::ActionsList; mod all; pub(crate) use all::add_action; -pub use all::dispatch_actions; +pub use all::{dispatch_actions, KeyAction}; diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index d6b70cd9..45a466c6 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -4,31 +4,31 @@ use crate::{Handle, LazyStatic}; use std::collections::HashMap; use std::sync::RwLock; -type KeyHandles = (Handle, Option<Handle>, Option<String>); +pub type KeyAction = (Handle, Option<Handle>, Option<String>); // Registered actions. -static ACTIONS: LazyStatic<RwLock<HashMap<KeyHandles, ActionsList>>> = +static ACTIONS: LazyStatic<RwLock<HashMap<KeyAction, ActionsList>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); pub fn add_action(action: Action) { let mut actions = ACTIONS.write().unwrap(); - let action_handle = ( + let key_action = ( action.handle(), action.referer_handle(), action.referer_id(), ); - if let Some(list) = actions.get_mut(&action_handle) { + if let Some(list) = actions.get_mut(&key_action) { list.add(action); } else { - actions.insert(action_handle, ActionsList::with(action)); + actions.insert(key_action, ActionsList::with(action)); } } -pub fn dispatch_actions<B, F>(action_handle: (Handle, Option<Handle>, Option<String>), f: F) +pub fn dispatch_actions<B, F>(key_action: KeyAction, f: F) where F: FnMut(&Action) -> B, { - if let Some(list) = ACTIONS.read().unwrap().get(&action_handle) { + if let Some(list) = ACTIONS.read().unwrap().get(&key_action) { list.iter_map(f) } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index af7a5d43..1ac38762 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -4,7 +4,7 @@ pub use crate::{concat_string, fn_builder, main, paste, test}; // Global. -pub use crate::{Handle, HashMapResources, LazyStatic, Weight}; +pub use crate::{Handle, HasHandle, HashMapResources, LazyStatic, Weight}; // Functions and macro helpers. pub use crate::util; From e5db7ef6ad064201702a9ba2a18b6c58eabd99c6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Nov 2023 14:29:04 +0100 Subject: [PATCH 604/853] =?UTF-8?q?=E2=9C=A8=20Add=20new=20operation=20"Ad?= =?UTF-8?q?dFirst"=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html/opt_classes.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index 46443df5..26005dd7 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -13,6 +13,7 @@ use crate::fn_builder; pub enum ClassesOp { Add, + AddFirst, Remove, Replace(String), Toggle, @@ -44,6 +45,9 @@ impl OptionClasses { ClassesOp::Add => { self.add(&classes, self.0.len()); } + ClassesOp::AddFirst => { + self.add(&classes, 0); + } ClassesOp::Remove => { for class in classes { self.0.retain(|c| c.ne(&class.to_string())); From 012fac26082c2ae33e2fe270b17271e5fc2d117e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 5 Nov 2023 09:56:22 +0100 Subject: [PATCH 605/853] =?UTF-8?q?=F0=9F=94=A5=20Remove=20before/after=5F?= =?UTF-8?q?prepare=5F..()=20from=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/definition.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 47037022..16ad5279 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -39,24 +39,15 @@ pub trait ComponentTrait: ComponentBase + HasHandle + Send + Sync { true } - #[allow(unused_variables)] - fn before_prepare_component(&mut self, cx: &mut Context) {} - #[allow(unused_variables)] fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::None } - - #[allow(unused_variables)] - fn after_prepare_component(&mut self, cx: &mut Context) {} } impl<C: ComponentTrait> ComponentBase for C { fn render(&mut self, cx: &mut Context) -> Markup { if self.is_renderable(cx) { - // Acciones antes de preparar el componente. - self.before_prepare_component(cx); - // Acciones del tema antes de preparar el componente. cx.theme().before_prepare_component(self, cx); @@ -76,9 +67,6 @@ impl<C: ComponentTrait> ComponentBase for C { }, }; - // Acciones después de preparar el componente. - self.after_prepare_component(cx); - // Acciones del tema después de preparar el componente. cx.theme().after_prepare_component(self, cx); From 91d6b1225867cae09556a097afeed7f294fb645c Mon Sep 17 00:00:00 2001 From: tjallingt <tjallingt@gmail.com> Date: Wed, 8 Nov 2023 09:26:35 +0100 Subject: [PATCH 606/853] chore: ensure macro is prepared for potential pretty printing improvements See https://github.com/rust-lang/rust/pull/117433#issuecomment-1793881869 --- pagetop-macros/src/lib.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index b6acc4b8..8cae81fc 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -35,7 +35,13 @@ pub fn fn_builder(_attr: TokenStream, item: TokenStream) -> TokenStream { let param: Vec<String> = args .iter() - .map(|arg| arg.split_whitespace().next().unwrap().to_string()) + .map(|arg| { + arg.split_whitespace() + .next() + .unwrap() + .trim_end_matches(":") + .to_string() + }) .collect(); #[rustfmt::skip] From 13c7eb4ade2367a4513ddb1f32a34e6137f0771f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 10 Nov 2023 00:00:27 +0100 Subject: [PATCH 607/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Swa?= =?UTF-8?q?p=20ToString=20with=20Display=20for=20cleaner=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 56 ++--- pagetop/src/base/component/flex.rs | 268 +++++++++++----------- pagetop/src/base/component/form/button.rs | 14 ++ pagetop/src/base/component/heading.rs | 25 +- pagetop/src/html/unit.rs | 32 +-- pagetop/src/locale.rs | 14 +- 6 files changed, 213 insertions(+), 196 deletions(-) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 09122f96..e19c0c69 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -2,6 +2,8 @@ use crate::core::component::{Context, ContextOp}; use crate::html::{JavaScript, StyleSheet}; use crate::Weight; +use std::fmt; + // Context parameters. pub const PARAM_BASE_WEIGHT: &str = "base.weight"; pub const PARAM_BASE_INCLUDE_ICONS: &str = "base.include.icon"; @@ -66,18 +68,19 @@ pub enum BreakPoint { } #[rustfmt::skip] -impl ToString for BreakPoint { - fn to_string(&self) -> String { - match self { - BreakPoint::None => "pt-bp__none".to_string(), - BreakPoint::SM => "pt-bp__sm".to_string(), - BreakPoint::MD => "pt-bp__md".to_string(), - BreakPoint::LG => "pt-bp__lg".to_string(), - BreakPoint::XL => "pt-bp__xl".to_string(), - BreakPoint::X2L => "pt-bp__x2l".to_string(), - BreakPoint::X3L => "pt-bp__x3l".to_string(), - BreakPoint::X2K => "pt-bp__x2k".to_string(), - } +impl fmt::Display for BreakPoint { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let breakpoint = match self { + BreakPoint::None => "pt-bp__none", + BreakPoint::SM => "pt-bp__sm", + BreakPoint::MD => "pt-bp__md", + BreakPoint::LG => "pt-bp__lg", + BreakPoint::XL => "pt-bp__xl", + BreakPoint::X2L => "pt-bp__x2l", + BreakPoint::X3L => "pt-bp__x3l", + BreakPoint::X2K => "pt-bp__x2k", + }; + write!(f, "{breakpoint}") } } @@ -99,20 +102,21 @@ pub enum FontSize { } #[rustfmt::skip] -impl ToString for FontSize { - fn to_string(&self) -> String { - match self { - FontSize::ExtraLarge => "pt-fs__x3l".to_string(), - FontSize::XxLarge => "pt-fs__x2l".to_string(), - FontSize::XLarge => "pt-fs__xl".to_string(), - FontSize::Large => "pt-fs__l".to_string(), - FontSize::Medium => "pt-fs__m".to_string(), - FontSize::Normal => "".to_string(), - FontSize::Small => "pt-fs__s".to_string(), - FontSize::XSmall => "pt-fs__xs".to_string(), - FontSize::XxSmall => "pt-fs__x2s".to_string(), - FontSize::ExtraSmall => "pt-fs__x3s".to_string(), - } +impl fmt::Display for FontSize { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let font_size = match self { + FontSize::ExtraLarge => "pt-fs__x3l", + FontSize::XxLarge => "pt-fs__x2l", + FontSize::XLarge => "pt-fs__xl", + FontSize::Large => "pt-fs__l", + FontSize::Medium => "pt-fs__m", + FontSize::Normal => "", + FontSize::Small => "pt-fs__s", + FontSize::XSmall => "pt-fs__xs", + FontSize::XxSmall => "pt-fs__x2s", + FontSize::ExtraSmall => "pt-fs__x3s", + }; + write!(f, "{font_size}") } } diff --git a/pagetop/src/base/component/flex.rs b/pagetop/src/base/component/flex.rs index d98bd828..19cfd293 100644 --- a/pagetop/src/base/component/flex.rs +++ b/pagetop/src/base/component/flex.rs @@ -5,6 +5,8 @@ pub use item::{Item, COMPONENT_BASE_FLEX_ITEM}; use crate::prelude::*; +use std::fmt; + // ************************************************************************************************* #[derive(Default)] @@ -18,39 +20,24 @@ pub enum Direction { } #[rustfmt::skip] -impl ToString for Direction { - fn to_string(&self) -> String { +impl fmt::Display for Direction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Direction::Default => { - concat_string!( - "pt-flex__container pt-flex__row ", - BreakPoint::default().to_string() - ) - } - Direction::Row(breakpoint) => { - concat_string!( - "pt-flex__container pt-flex__row ", - breakpoint.to_string() - ) - } - Direction::RowReverse(breakpoint) => { - concat_string!( - "pt-flex__container pt-flex__row pt-flex__reverse ", - breakpoint.to_string() - ) - } - Direction::Column(breakpoint) => { - concat_string!( - "pt-flex__container pt-flex__col ", - breakpoint.to_string() - ) - } - Direction::ColumnReverse(breakpoint) => { - concat_string!( - "pt-flex__container pt-flex__col pt-flex__reverse ", - breakpoint.to_string() - ) - } + Direction::Default => write!( + f, "pt-flex__container pt-flex__row {}", BreakPoint::default() + ), + Direction::Row(breakpoint) => write!( + f, "pt-flex__container pt-flex__row {breakpoint}" + ), + Direction::RowReverse(breakpoint) => write!( + f, "pt-flex__container pt-flex__row pt-flex__reverse {breakpoint}" + ), + Direction::Column(breakpoint) => write!( + f, "pt-flex__container pt-flex__col {breakpoint}" + ), + Direction::ColumnReverse(breakpoint) => write!( + f, "pt-flex__container pt-flex__col pt-flex__reverse {breakpoint}" + ), } } } @@ -67,13 +54,13 @@ pub enum WrapAlign { } #[rustfmt::skip] -impl ToString for WrapAlign { - fn to_string(&self) -> String { +impl fmt::Display for WrapAlign { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - WrapAlign::Default => "".to_string(), - WrapAlign::NoWrap => "flex-nowrap".to_string(), - WrapAlign::Wrap(a) => concat_string!("pt-flex__wrap ", a.to_string()), - WrapAlign::WrapReverse(a) => concat_string!("pt-flex__wrap-reverse ", a.to_string()), + WrapAlign::Default => write!(f, ""), + WrapAlign::NoWrap => write!(f, "flex-nowrap"), + WrapAlign::Wrap(a) => write!(f, "pt-flex__wrap {a}"), + WrapAlign::WrapReverse(a) => write!(f, "pt-flex__wrap-reverse {a}"), } } } @@ -93,17 +80,18 @@ pub enum ContentAlign { } #[rustfmt::skip] -impl ToString for ContentAlign { - fn to_string(&self) -> String { - match self { - ContentAlign::Default => "".to_string(), - ContentAlign::Start => "pt-flex__align-start".to_string(), - ContentAlign::End => "pt-flex__align-end".to_string(), - ContentAlign::Center => "pt-flex__align-center".to_string(), - ContentAlign::Stretch => "pt-flex__align-stretch".to_string(), - ContentAlign::SpaceBetween => "pt-flex__align-space-between".to_string(), - ContentAlign::SpaceAround => "pt-flex__align-space-around".to_string(), - } +impl fmt::Display for ContentAlign { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let content_align = match self { + ContentAlign::Default => "", + ContentAlign::Start => "pt-flex__align-start", + ContentAlign::End => "pt-flex__align-end", + ContentAlign::Center => "pt-flex__align-center", + ContentAlign::Stretch => "pt-flex__align-stretch", + ContentAlign::SpaceBetween => "pt-flex__align-space-between", + ContentAlign::SpaceAround => "pt-flex__align-space-around", + }; + write!(f, "{content_align}") } } @@ -122,17 +110,18 @@ pub enum ContentJustify { } #[rustfmt::skip] -impl ToString for ContentJustify { - fn to_string(&self) -> String { - match self { - ContentJustify::Default => "".to_string(), - ContentJustify::Start => "pt-flex__justify-start".to_string(), - ContentJustify::End => "pt-flex__justify-end".to_string(), - ContentJustify::Center => "pt-flex__justify-center".to_string(), - ContentJustify::SpaceBetween => "pt-flex__justify-space-between".to_string(), - ContentJustify::SpaceAround => "pt-flex__justify-space-around".to_string(), - ContentJustify::SpaceEvenly => "pt-flex__justify-space-evenly".to_string(), - } +impl fmt::Display for ContentJustify { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let content_justify = match self { + ContentJustify::Default => "", + ContentJustify::Start => "pt-flex__justify-start", + ContentJustify::End => "pt-flex__justify-end", + ContentJustify::Center => "pt-flex__justify-center", + ContentJustify::SpaceBetween => "pt-flex__justify-space-between", + ContentJustify::SpaceAround => "pt-flex__justify-space-around", + ContentJustify::SpaceEvenly => "pt-flex__justify-space-evenly", + }; + write!(f, "{content_justify}") } } @@ -150,16 +139,17 @@ pub enum ItemAlign { } #[rustfmt::skip] -impl ToString for ItemAlign { - fn to_string(&self) -> String { - match self { - ItemAlign::Default => "".to_string(), - ItemAlign::Top => "pt-flex__item-top".to_string(), - ItemAlign::Bottom => "pt-flex__item-bottom".to_string(), - ItemAlign::Middle => "pt-flex__item-middle".to_string(), - ItemAlign::Stretch => "pt-flex__item-stretch".to_string(), - ItemAlign::Baseline => "pt-flex__item-baseline".to_string(), - } +impl fmt::Display for ItemAlign { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let item_align = match self { + ItemAlign::Default => "", + ItemAlign::Top => "pt-flex__item-top", + ItemAlign::Bottom => "pt-flex__item-bottom", + ItemAlign::Middle => "pt-flex__item-middle", + ItemAlign::Stretch => "pt-flex__item-stretch", + ItemAlign::Baseline => "pt-flex__item-baseline", + }; + write!(f, "{item_align}") } } @@ -176,14 +166,14 @@ pub enum Gap { } #[rustfmt::skip] -impl ToString for Gap { - fn to_string(&self) -> String { +impl fmt::Display for Gap { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Gap::Default => "".to_string(), - Gap::Row(r) => concat_string!("row-gap: ", r.to_string(), ";"), - Gap::Column(c) => concat_string!("column-gap: ", c.to_string(), ";"), - Gap::Distinct(r, c) => concat_string!("gap: ", r.to_string(), " ", c.to_string(), ";"), - Gap::Both(v) => concat_string!("gap: ", v.to_string(), ";"), + Gap::Default => write!(f, ""), + Gap::Row(r) => write!(f, "row-gap: {r};"), + Gap::Column(c) => write!(f, "column-gap: {c};"), + Gap::Distinct(r, c) => write!(f, "gap: {r} {c};"), + Gap::Both(v) => write!(f, "gap: {v};"), } } } @@ -206,20 +196,21 @@ pub enum ItemGrow { } #[rustfmt::skip] -impl ToString for ItemGrow { - fn to_string(&self) -> String { - match self { - ItemGrow::Default => "".to_string(), - ItemGrow::Is1 => "pt-flex__grow-1".to_string(), - ItemGrow::Is2 => "pt-flex__grow-2".to_string(), - ItemGrow::Is3 => "pt-flex__grow-3".to_string(), - ItemGrow::Is4 => "pt-flex__grow-4".to_string(), - ItemGrow::Is5 => "pt-flex__grow-5".to_string(), - ItemGrow::Is6 => "pt-flex__grow-6".to_string(), - ItemGrow::Is7 => "pt-flex__grow-7".to_string(), - ItemGrow::Is8 => "pt-flex__grow-8".to_string(), - ItemGrow::Is9 => "pt-flex__grow-9".to_string(), - } +impl fmt::Display for ItemGrow { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let item_grow = match self { + ItemGrow::Default => "", + ItemGrow::Is1 => "pt-flex__grow-1", + ItemGrow::Is2 => "pt-flex__grow-2", + ItemGrow::Is3 => "pt-flex__grow-3", + ItemGrow::Is4 => "pt-flex__grow-4", + ItemGrow::Is5 => "pt-flex__grow-5", + ItemGrow::Is6 => "pt-flex__grow-6", + ItemGrow::Is7 => "pt-flex__grow-7", + ItemGrow::Is8 => "pt-flex__grow-8", + ItemGrow::Is9 => "pt-flex__grow-9", + }; + write!(f, "{item_grow}") } } @@ -241,20 +232,21 @@ pub enum ItemShrink { } #[rustfmt::skip] -impl ToString for ItemShrink { - fn to_string(&self) -> String { - match self { - ItemShrink::Default => "".to_string(), - ItemShrink::Is1 => "pt-flex__shrink-1".to_string(), - ItemShrink::Is2 => "pt-flex__shrink-2".to_string(), - ItemShrink::Is3 => "pt-flex__shrink-3".to_string(), - ItemShrink::Is4 => "pt-flex__shrink-4".to_string(), - ItemShrink::Is5 => "pt-flex__shrink-5".to_string(), - ItemShrink::Is6 => "pt-flex__shrink-6".to_string(), - ItemShrink::Is7 => "pt-flex__shrink-7".to_string(), - ItemShrink::Is8 => "pt-flex__shrink-8".to_string(), - ItemShrink::Is9 => "pt-flex__shrink-9".to_string(), - } +impl fmt::Display for ItemShrink { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let item_shrink = match self { + ItemShrink::Default => "", + ItemShrink::Is1 => "pt-flex__shrink-1", + ItemShrink::Is2 => "pt-flex__shrink-2", + ItemShrink::Is3 => "pt-flex__shrink-3", + ItemShrink::Is4 => "pt-flex__shrink-4", + ItemShrink::Is5 => "pt-flex__shrink-5", + ItemShrink::Is6 => "pt-flex__shrink-6", + ItemShrink::Is7 => "pt-flex__shrink-7", + ItemShrink::Is8 => "pt-flex__shrink-8", + ItemShrink::Is9 => "pt-flex__shrink-9", + }; + write!(f, "{item_shrink}") } } @@ -278,22 +270,23 @@ pub enum ItemSize { } #[rustfmt::skip] -impl ToString for ItemSize { - fn to_string(&self) -> String { - match self { - ItemSize::Default => "".to_string(), - ItemSize::Percent10 => "pt-flex__width-10".to_string(), - ItemSize::Percent20 => "pt-flex__width-20".to_string(), - ItemSize::Percent25 => "pt-flex__width-25".to_string(), - ItemSize::Percent33 => "pt-flex__width-33".to_string(), - ItemSize::Percent40 => "pt-flex__width-40".to_string(), - ItemSize::Percent50 => "pt-flex__width-50".to_string(), - ItemSize::Percent60 => "pt-flex__width-60".to_string(), - ItemSize::Percent66 => "pt-flex__width-66".to_string(), - ItemSize::Percent75 => "pt-flex__width-75".to_string(), - ItemSize::Percent80 => "pt-flex__width-80".to_string(), - ItemSize::Percent90 => "pt-flex__width-90".to_string(), - } +impl fmt::Display for ItemSize { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let item_size = match self { + ItemSize::Default => "", + ItemSize::Percent10 => "pt-flex__width-10", + ItemSize::Percent20 => "pt-flex__width-20", + ItemSize::Percent25 => "pt-flex__width-25", + ItemSize::Percent33 => "pt-flex__width-33", + ItemSize::Percent40 => "pt-flex__width-40", + ItemSize::Percent50 => "pt-flex__width-50", + ItemSize::Percent60 => "pt-flex__width-60", + ItemSize::Percent66 => "pt-flex__width-66", + ItemSize::Percent75 => "pt-flex__width-75", + ItemSize::Percent80 => "pt-flex__width-80", + ItemSize::Percent90 => "pt-flex__width-90", + }; + write!(f, "{item_size}") } } @@ -317,21 +310,22 @@ pub enum ItemOffset { } #[rustfmt::skip] -impl ToString for ItemOffset { - fn to_string(&self) -> String { - match self { - ItemOffset::Default => "".to_string(), - ItemOffset::Offset10 => "pt-flex__offset-10".to_string(), - ItemOffset::Offset20 => "pt-flex__offset-20".to_string(), - ItemOffset::Offset25 => "pt-flex__offset-25".to_string(), - ItemOffset::Offset33 => "pt-flex__offset-33".to_string(), - ItemOffset::Offset40 => "pt-flex__offset-40".to_string(), - ItemOffset::Offset50 => "pt-flex__offset-50".to_string(), - ItemOffset::Offset60 => "pt-flex__offset-60".to_string(), - ItemOffset::Offset66 => "pt-flex__offset-66".to_string(), - ItemOffset::Offset75 => "pt-flex__offset-75".to_string(), - ItemOffset::Offset80 => "pt-flex__offset-80".to_string(), - ItemOffset::Offset90 => "pt-flex__offset-90".to_string(), - } +impl fmt::Display for ItemOffset { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let item_offset = match self { + ItemOffset::Default => "", + ItemOffset::Offset10 => "pt-flex__offset-10", + ItemOffset::Offset20 => "pt-flex__offset-20", + ItemOffset::Offset25 => "pt-flex__offset-25", + ItemOffset::Offset33 => "pt-flex__offset-33", + ItemOffset::Offset40 => "pt-flex__offset-40", + ItemOffset::Offset50 => "pt-flex__offset-50", + ItemOffset::Offset60 => "pt-flex__offset-60", + ItemOffset::Offset66 => "pt-flex__offset-66", + ItemOffset::Offset75 => "pt-flex__offset-75", + ItemOffset::Offset80 => "pt-flex__offset-80", + ItemOffset::Offset90 => "pt-flex__offset-90", + }; + write!(f, "{item_offset}") } } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 3a5be6ef..24c2e5e1 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +use std::fmt; + #[derive(Default)] pub enum ButtonType { #[default] @@ -8,6 +10,18 @@ pub enum ButtonType { Reset, } +#[rustfmt::skip] +impl fmt::Display for ButtonType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let button_type = match self { + ButtonType::Button => "button", + ButtonType::Submit => "submit", + ButtonType::Reset => "reset", + }; + write!(f, "{button_type}") + } +} + #[rustfmt::skip] #[derive(Default)] pub struct Button { diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 5909796c..e1c89997 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +use std::fmt; + #[derive(Default)] pub enum HeadingType { #[default] @@ -24,17 +26,18 @@ pub enum HeadingDisplay { } #[rustfmt::skip] -impl ToString for HeadingDisplay { - fn to_string(&self) -> String { - match self { - HeadingDisplay::ExtraLarge => "pt-heading__title-x3l".to_string(), - HeadingDisplay::XxLarge => "pt-heading__title-x2l".to_string(), - HeadingDisplay::XLarge => "pt-heading__title-xl".to_string(), - HeadingDisplay::Large => "pt-heading__title-l".to_string(), - HeadingDisplay::Medium => "pt-heading__title-m".to_string(), - HeadingDisplay::Normal => "".to_string(), - HeadingDisplay::Subtitle => "pt-heading__subtitle".to_string(), - } +impl fmt::Display for HeadingDisplay { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let heading_display = match self { + HeadingDisplay::ExtraLarge => "pt-heading__title-x3l", + HeadingDisplay::XxLarge => "pt-heading__title-x2l", + HeadingDisplay::XLarge => "pt-heading__title-xl", + HeadingDisplay::Large => "pt-heading__title-l", + HeadingDisplay::Medium => "pt-heading__title-m", + HeadingDisplay::Normal => "", + HeadingDisplay::Subtitle => "pt-heading__subtitle", + }; + write!(f, "{heading_display}") } } diff --git a/pagetop/src/html/unit.rs b/pagetop/src/html/unit.rs index 44371fa3..ceb37e94 100644 --- a/pagetop/src/html/unit.rs +++ b/pagetop/src/html/unit.rs @@ -1,4 +1,4 @@ -use crate::concat_string; +use std::fmt; // About pixels: Pixels (px) are relative to the viewing device. For low-dpi devices, 1px is one // device pixel (dot) of the display. For printers and high resolution screens 1px implies multiple @@ -31,24 +31,24 @@ pub enum Value { } #[rustfmt::skip] -impl ToString for Value { - fn to_string(&self) -> String { +impl fmt::Display for Value { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Value::None => "".to_owned(), - Value::Auto => "auto".to_owned(), + Value::None => write!(f, ""), + Value::Auto => write!(f, "auto"), // Absolute value. - Value::Cm(av) => concat_string!(av.to_string(), "cm"), - Value::In(av) => concat_string!(av.to_string(), "in"), - Value::Mm(av) => concat_string!(av.to_string(), "mm"), - Value::Pc(av) => concat_string!(av.to_string(), "pc"), - Value::Pt(av) => concat_string!(av.to_string(), "pt"), - Value::Px(av) => concat_string!(av.to_string(), "px"), + Value::Cm(av) => write!(f, "{av}cm"), + Value::In(av) => write!(f, "{av}in"), + Value::Mm(av) => write!(f, "{av}mm"), + Value::Pc(av) => write!(f, "{av}pc"), + Value::Pt(av) => write!(f, "{av}pt"), + Value::Px(av) => write!(f, "{av}px"), // Relative value. - Value::RelEm(rv) => concat_string!(rv.to_string(), "em"), - Value::RelPct(rv) => concat_string!(rv.to_string(), "%"), - Value::RelRem(rv) => concat_string!(rv.to_string(), "rem"), - Value::RelVh(rv) => concat_string!(rv.to_string(), "vh"), - Value::RelVw(rv) => concat_string!(rv.to_string(), "vw"), + Value::RelEm(rv) => write!(f, "{rv}em"), + Value::RelPct(rv) => write!(f, "{rv}%"), + Value::RelRem(rv) => write!(f, "{rv}rem"), + Value::RelVh(rv) => write!(f, "{rv}vh"), + Value::RelVw(rv) => write!(f, "{rv}vw"), } } } diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 81520c98..9c4b1f8e 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -99,6 +99,7 @@ pub(crate) use fluent_templates::StaticLoader as Locales; use unic_langid::langid; use std::collections::HashMap; +use std::fmt; const LANGUAGE_SET_FAILURE: &str = "language_set_failure"; @@ -244,12 +245,13 @@ impl L10n { } } -impl ToString for L10n { - fn to_string(&self) -> String { +#[rustfmt::skip] +impl fmt::Display for L10n { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match &self.op { - L10nOp::None => "".to_owned(), - L10nOp::Text(text) => text.to_owned(), - L10nOp::Translate(key) => match self.locales { + L10nOp::None => write!(f, ""), + L10nOp::Text(text) => write!(f, "{text}"), + L10nOp::Translate(key) => write!(f, "{}", match self.locales { Some(locales) => locales .lookup_with_args( match key.as_str() { @@ -267,7 +269,7 @@ impl ToString for L10n { ) .unwrap_or(key.to_owned()), None => key.to_owned(), - }, + }), } } } From 258d42049f0899de7ec2998a5c0884289b1b79b8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 11 Nov 2023 13:43:44 +0100 Subject: [PATCH 608/853] =?UTF-8?q?=E2=8F=AA=20Revert=20#13c7eb4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/app.rs | 2 +- pagetop/src/base/component.rs | 20 ++-- pagetop/src/base/component/flex.rs | 115 ++++++++++------------ pagetop/src/base/component/form/button.rs | 11 +-- pagetop/src/base/component/heading.rs | 11 +-- pagetop/src/html/unit.rs | 32 +++--- pagetop/src/locale.rs | 14 ++- 7 files changed, 92 insertions(+), 113 deletions(-) diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 74fa2ccc..8e52a747 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -134,7 +134,7 @@ fn show_banner() { let app_description = if !config::SETTINGS.app.description.is_empty() { concat_string!("\n", config::SETTINGS.app.description) } else { - "".to_string() + "".to_owned() }; // Print banner. println!( diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index e19c0c69..b108402d 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -2,8 +2,6 @@ use crate::core::component::{Context, ContextOp}; use crate::html::{JavaScript, StyleSheet}; use crate::Weight; -use std::fmt; - // Context parameters. pub const PARAM_BASE_WEIGHT: &str = "base.weight"; pub const PARAM_BASE_INCLUDE_ICONS: &str = "base.include.icon"; @@ -68,9 +66,9 @@ pub enum BreakPoint { } #[rustfmt::skip] -impl fmt::Display for BreakPoint { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let breakpoint = match self { +impl ToString for BreakPoint { + fn to_string(&self) -> String { + String::from(match self { BreakPoint::None => "pt-bp__none", BreakPoint::SM => "pt-bp__sm", BreakPoint::MD => "pt-bp__md", @@ -79,8 +77,7 @@ impl fmt::Display for BreakPoint { BreakPoint::X2L => "pt-bp__x2l", BreakPoint::X3L => "pt-bp__x3l", BreakPoint::X2K => "pt-bp__x2k", - }; - write!(f, "{breakpoint}") + }) } } @@ -102,9 +99,9 @@ pub enum FontSize { } #[rustfmt::skip] -impl fmt::Display for FontSize { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let font_size = match self { +impl ToString for FontSize { + fn to_string(&self) -> String { + String::from(match self { FontSize::ExtraLarge => "pt-fs__x3l", FontSize::XxLarge => "pt-fs__x2l", FontSize::XLarge => "pt-fs__xl", @@ -115,8 +112,7 @@ impl fmt::Display for FontSize { FontSize::XSmall => "pt-fs__xs", FontSize::XxSmall => "pt-fs__x2s", FontSize::ExtraSmall => "pt-fs__x3s", - }; - write!(f, "{font_size}") + }) } } diff --git a/pagetop/src/base/component/flex.rs b/pagetop/src/base/component/flex.rs index 19cfd293..2eb2a78f 100644 --- a/pagetop/src/base/component/flex.rs +++ b/pagetop/src/base/component/flex.rs @@ -5,8 +5,6 @@ pub use item::{Item, COMPONENT_BASE_FLEX_ITEM}; use crate::prelude::*; -use std::fmt; - // ************************************************************************************************* #[derive(Default)] @@ -20,23 +18,23 @@ pub enum Direction { } #[rustfmt::skip] -impl fmt::Display for Direction { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ToString for Direction { + fn to_string(&self) -> String { match self { - Direction::Default => write!( - f, "pt-flex__container pt-flex__row {}", BreakPoint::default() + Direction::Default => concat_string!( + "pt-flex__container pt-flex__row ", BreakPoint::default().to_string() ), - Direction::Row(breakpoint) => write!( - f, "pt-flex__container pt-flex__row {breakpoint}" + Direction::Row(breakpoint) => concat_string!( + "pt-flex__container pt-flex__row ", breakpoint.to_string() ), - Direction::RowReverse(breakpoint) => write!( - f, "pt-flex__container pt-flex__row pt-flex__reverse {breakpoint}" + Direction::RowReverse(breakpoint) => concat_string!( + "pt-flex__container pt-flex__row pt-flex__reverse ", breakpoint.to_string() ), - Direction::Column(breakpoint) => write!( - f, "pt-flex__container pt-flex__col {breakpoint}" + Direction::Column(breakpoint) => concat_string!( + "pt-flex__container pt-flex__col ", breakpoint.to_string() ), - Direction::ColumnReverse(breakpoint) => write!( - f, "pt-flex__container pt-flex__col pt-flex__reverse {breakpoint}" + Direction::ColumnReverse(breakpoint) => concat_string!( + "pt-flex__container pt-flex__col pt-flex__reverse ", breakpoint.to_string() ), } } @@ -54,13 +52,13 @@ pub enum WrapAlign { } #[rustfmt::skip] -impl fmt::Display for WrapAlign { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ToString for WrapAlign { + fn to_string(&self) -> String { match self { - WrapAlign::Default => write!(f, ""), - WrapAlign::NoWrap => write!(f, "flex-nowrap"), - WrapAlign::Wrap(a) => write!(f, "pt-flex__wrap {a}"), - WrapAlign::WrapReverse(a) => write!(f, "pt-flex__wrap-reverse {a}"), + WrapAlign::Default => "".to_owned(), + WrapAlign::NoWrap => "flex-nowrap".to_owned(), + WrapAlign::Wrap(a) => concat_string!("pt-flex__wrap ", a.to_string()), + WrapAlign::WrapReverse(a) => concat_string!("pt-flex__wrap-reverse ", a.to_string()), } } } @@ -80,9 +78,9 @@ pub enum ContentAlign { } #[rustfmt::skip] -impl fmt::Display for ContentAlign { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let content_align = match self { +impl ToString for ContentAlign { + fn to_string(&self) -> String { + String::from(match self { ContentAlign::Default => "", ContentAlign::Start => "pt-flex__align-start", ContentAlign::End => "pt-flex__align-end", @@ -90,8 +88,7 @@ impl fmt::Display for ContentAlign { ContentAlign::Stretch => "pt-flex__align-stretch", ContentAlign::SpaceBetween => "pt-flex__align-space-between", ContentAlign::SpaceAround => "pt-flex__align-space-around", - }; - write!(f, "{content_align}") + }) } } @@ -110,9 +107,9 @@ pub enum ContentJustify { } #[rustfmt::skip] -impl fmt::Display for ContentJustify { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let content_justify = match self { +impl ToString for ContentJustify { + fn to_string(&self) -> String { + String::from(match self { ContentJustify::Default => "", ContentJustify::Start => "pt-flex__justify-start", ContentJustify::End => "pt-flex__justify-end", @@ -120,8 +117,7 @@ impl fmt::Display for ContentJustify { ContentJustify::SpaceBetween => "pt-flex__justify-space-between", ContentJustify::SpaceAround => "pt-flex__justify-space-around", ContentJustify::SpaceEvenly => "pt-flex__justify-space-evenly", - }; - write!(f, "{content_justify}") + }) } } @@ -139,17 +135,16 @@ pub enum ItemAlign { } #[rustfmt::skip] -impl fmt::Display for ItemAlign { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let item_align = match self { +impl ToString for ItemAlign { + fn to_string(&self) -> String { + String::from(match self { ItemAlign::Default => "", ItemAlign::Top => "pt-flex__item-top", ItemAlign::Bottom => "pt-flex__item-bottom", ItemAlign::Middle => "pt-flex__item-middle", ItemAlign::Stretch => "pt-flex__item-stretch", ItemAlign::Baseline => "pt-flex__item-baseline", - }; - write!(f, "{item_align}") + }) } } @@ -166,14 +161,14 @@ pub enum Gap { } #[rustfmt::skip] -impl fmt::Display for Gap { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ToString for Gap { + fn to_string(&self) -> String { match self { - Gap::Default => write!(f, ""), - Gap::Row(r) => write!(f, "row-gap: {r};"), - Gap::Column(c) => write!(f, "column-gap: {c};"), - Gap::Distinct(r, c) => write!(f, "gap: {r} {c};"), - Gap::Both(v) => write!(f, "gap: {v};"), + Gap::Default => "".to_owned(), + Gap::Row(r) => concat_string!("row-gap: ", r.to_string(), ";"), + Gap::Column(c) => concat_string!("column-gap: ", c.to_string(), ";"), + Gap::Distinct(r, c) => concat_string!("gap: ", r.to_string(), " ", c.to_string(), ";"), + Gap::Both(v) => concat_string!("gap: ", v.to_string(), ";"), } } } @@ -196,9 +191,9 @@ pub enum ItemGrow { } #[rustfmt::skip] -impl fmt::Display for ItemGrow { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let item_grow = match self { +impl ToString for ItemGrow { + fn to_string(&self) -> String { + String::from(match self { ItemGrow::Default => "", ItemGrow::Is1 => "pt-flex__grow-1", ItemGrow::Is2 => "pt-flex__grow-2", @@ -209,8 +204,7 @@ impl fmt::Display for ItemGrow { ItemGrow::Is7 => "pt-flex__grow-7", ItemGrow::Is8 => "pt-flex__grow-8", ItemGrow::Is9 => "pt-flex__grow-9", - }; - write!(f, "{item_grow}") + }) } } @@ -232,9 +226,9 @@ pub enum ItemShrink { } #[rustfmt::skip] -impl fmt::Display for ItemShrink { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let item_shrink = match self { +impl ToString for ItemShrink { + fn to_string(&self) -> String { + String::from(match self { ItemShrink::Default => "", ItemShrink::Is1 => "pt-flex__shrink-1", ItemShrink::Is2 => "pt-flex__shrink-2", @@ -245,8 +239,7 @@ impl fmt::Display for ItemShrink { ItemShrink::Is7 => "pt-flex__shrink-7", ItemShrink::Is8 => "pt-flex__shrink-8", ItemShrink::Is9 => "pt-flex__shrink-9", - }; - write!(f, "{item_shrink}") + }) } } @@ -270,9 +263,9 @@ pub enum ItemSize { } #[rustfmt::skip] -impl fmt::Display for ItemSize { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let item_size = match self { +impl ToString for ItemSize { + fn to_string(&self) -> String { + String::from(match self { ItemSize::Default => "", ItemSize::Percent10 => "pt-flex__width-10", ItemSize::Percent20 => "pt-flex__width-20", @@ -285,8 +278,7 @@ impl fmt::Display for ItemSize { ItemSize::Percent75 => "pt-flex__width-75", ItemSize::Percent80 => "pt-flex__width-80", ItemSize::Percent90 => "pt-flex__width-90", - }; - write!(f, "{item_size}") + }) } } @@ -310,9 +302,9 @@ pub enum ItemOffset { } #[rustfmt::skip] -impl fmt::Display for ItemOffset { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let item_offset = match self { +impl ToString for ItemOffset { + fn to_string(&self) -> String { + String::from(match self { ItemOffset::Default => "", ItemOffset::Offset10 => "pt-flex__offset-10", ItemOffset::Offset20 => "pt-flex__offset-20", @@ -325,7 +317,6 @@ impl fmt::Display for ItemOffset { ItemOffset::Offset75 => "pt-flex__offset-75", ItemOffset::Offset80 => "pt-flex__offset-80", ItemOffset::Offset90 => "pt-flex__offset-90", - }; - write!(f, "{item_offset}") + }) } } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 24c2e5e1..86462c7a 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -use std::fmt; - #[derive(Default)] pub enum ButtonType { #[default] @@ -11,14 +9,13 @@ pub enum ButtonType { } #[rustfmt::skip] -impl fmt::Display for ButtonType { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let button_type = match self { +impl ToString for ButtonType { + fn to_string(&self) -> String { + String::from(match self { ButtonType::Button => "button", ButtonType::Submit => "submit", ButtonType::Reset => "reset", - }; - write!(f, "{button_type}") + }) } } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index e1c89997..282b0f28 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,7 +1,5 @@ use crate::prelude::*; -use std::fmt; - #[derive(Default)] pub enum HeadingType { #[default] @@ -26,9 +24,9 @@ pub enum HeadingDisplay { } #[rustfmt::skip] -impl fmt::Display for HeadingDisplay { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let heading_display = match self { +impl ToString for HeadingDisplay { + fn to_string(&self) -> String { + String::from(match self { HeadingDisplay::ExtraLarge => "pt-heading__title-x3l", HeadingDisplay::XxLarge => "pt-heading__title-x2l", HeadingDisplay::XLarge => "pt-heading__title-xl", @@ -36,8 +34,7 @@ impl fmt::Display for HeadingDisplay { HeadingDisplay::Medium => "pt-heading__title-m", HeadingDisplay::Normal => "", HeadingDisplay::Subtitle => "pt-heading__subtitle", - }; - write!(f, "{heading_display}") + }) } } diff --git a/pagetop/src/html/unit.rs b/pagetop/src/html/unit.rs index ceb37e94..44371fa3 100644 --- a/pagetop/src/html/unit.rs +++ b/pagetop/src/html/unit.rs @@ -1,4 +1,4 @@ -use std::fmt; +use crate::concat_string; // About pixels: Pixels (px) are relative to the viewing device. For low-dpi devices, 1px is one // device pixel (dot) of the display. For printers and high resolution screens 1px implies multiple @@ -31,24 +31,24 @@ pub enum Value { } #[rustfmt::skip] -impl fmt::Display for Value { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ToString for Value { + fn to_string(&self) -> String { match self { - Value::None => write!(f, ""), - Value::Auto => write!(f, "auto"), + Value::None => "".to_owned(), + Value::Auto => "auto".to_owned(), // Absolute value. - Value::Cm(av) => write!(f, "{av}cm"), - Value::In(av) => write!(f, "{av}in"), - Value::Mm(av) => write!(f, "{av}mm"), - Value::Pc(av) => write!(f, "{av}pc"), - Value::Pt(av) => write!(f, "{av}pt"), - Value::Px(av) => write!(f, "{av}px"), + Value::Cm(av) => concat_string!(av.to_string(), "cm"), + Value::In(av) => concat_string!(av.to_string(), "in"), + Value::Mm(av) => concat_string!(av.to_string(), "mm"), + Value::Pc(av) => concat_string!(av.to_string(), "pc"), + Value::Pt(av) => concat_string!(av.to_string(), "pt"), + Value::Px(av) => concat_string!(av.to_string(), "px"), // Relative value. - Value::RelEm(rv) => write!(f, "{rv}em"), - Value::RelPct(rv) => write!(f, "{rv}%"), - Value::RelRem(rv) => write!(f, "{rv}rem"), - Value::RelVh(rv) => write!(f, "{rv}vh"), - Value::RelVw(rv) => write!(f, "{rv}vw"), + Value::RelEm(rv) => concat_string!(rv.to_string(), "em"), + Value::RelPct(rv) => concat_string!(rv.to_string(), "%"), + Value::RelRem(rv) => concat_string!(rv.to_string(), "rem"), + Value::RelVh(rv) => concat_string!(rv.to_string(), "vh"), + Value::RelVw(rv) => concat_string!(rv.to_string(), "vw"), } } } diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 9c4b1f8e..81520c98 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -99,7 +99,6 @@ pub(crate) use fluent_templates::StaticLoader as Locales; use unic_langid::langid; use std::collections::HashMap; -use std::fmt; const LANGUAGE_SET_FAILURE: &str = "language_set_failure"; @@ -245,13 +244,12 @@ impl L10n { } } -#[rustfmt::skip] -impl fmt::Display for L10n { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ToString for L10n { + fn to_string(&self) -> String { match &self.op { - L10nOp::None => write!(f, ""), - L10nOp::Text(text) => write!(f, "{text}"), - L10nOp::Translate(key) => write!(f, "{}", match self.locales { + L10nOp::None => "".to_owned(), + L10nOp::Text(text) => text.to_owned(), + L10nOp::Translate(key) => match self.locales { Some(locales) => locales .lookup_with_args( match key.as_str() { @@ -269,7 +267,7 @@ impl fmt::Display for L10n { ) .unwrap_or(key.to_owned()), None => key.to_owned(), - }), + }, } } } From f208da1b7b0d3aa9ae431b383eda4ba6cf7b6c53 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 16:52:08 +0100 Subject: [PATCH 609/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Use=20new()=20with?= =?UTF-8?q?=20arguments,=20default()=20without?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/after_prepare_component.rs | 2 +- .../component/before_prepare_component.rs | 2 +- .../base/action/page/after_prepare_body.rs | 2 +- .../base/action/page/before_prepare_body.rs | 2 +- pagetop/src/core/action/all.rs | 2 +- pagetop/src/core/action/list.rs | 9 +++------ pagetop/src/core/theme/definition.rs | 2 +- pagetop/src/html/opt_classes.rs | 20 +++++++------------ pagetop/src/html/opt_id.rs | 10 ++-------- pagetop/src/html/opt_name.rs | 10 ++-------- pagetop/src/html/opt_string.rs | 10 ++-------- pagetop/src/html/opt_translated.rs | 16 ++++++--------- pagetop/src/response/page.rs | 14 ++++++------- 13 files changed, 35 insertions(+), 66 deletions(-) diff --git a/pagetop/src/base/action/component/after_prepare_component.rs b/pagetop/src/base/action/component/after_prepare_component.rs index 55087bd8..088ceb20 100644 --- a/pagetop/src/base/action/component/after_prepare_component.rs +++ b/pagetop/src/base/action/component/after_prepare_component.rs @@ -26,7 +26,7 @@ impl<C: ComponentTrait> ActionTrait for AfterPrepareComponent<C> { } impl<C: ComponentTrait> AfterPrepareComponent<C> { - pub fn with(f: FnAction<C>) -> Self { + pub fn new(f: FnAction<C>) -> Self { AfterPrepareComponent { f, referer_handle: Some(C::static_handle()), diff --git a/pagetop/src/base/action/component/before_prepare_component.rs b/pagetop/src/base/action/component/before_prepare_component.rs index b4a6106c..1bfd3d3e 100644 --- a/pagetop/src/base/action/component/before_prepare_component.rs +++ b/pagetop/src/base/action/component/before_prepare_component.rs @@ -26,7 +26,7 @@ impl<C: ComponentTrait> ActionTrait for BeforePrepareComponent<C> { } impl<C: ComponentTrait> BeforePrepareComponent<C> { - pub fn with(f: FnAction<C>) -> Self { + pub fn new(f: FnAction<C>) -> Self { BeforePrepareComponent { f, referer_handle: Some(C::static_handle()), diff --git a/pagetop/src/base/action/page/after_prepare_body.rs b/pagetop/src/base/action/page/after_prepare_body.rs index 342d5fc2..d8bf98d7 100644 --- a/pagetop/src/base/action/page/after_prepare_body.rs +++ b/pagetop/src/base/action/page/after_prepare_body.rs @@ -16,7 +16,7 @@ impl ActionTrait for AfterPrepareBody { } impl AfterPrepareBody { - pub fn with(f: FnActionPage) -> Self { + pub fn new(f: FnActionPage) -> Self { AfterPrepareBody { f, weight: 0 } } diff --git a/pagetop/src/base/action/page/before_prepare_body.rs b/pagetop/src/base/action/page/before_prepare_body.rs index 9dd69539..4258f7ae 100644 --- a/pagetop/src/base/action/page/before_prepare_body.rs +++ b/pagetop/src/base/action/page/before_prepare_body.rs @@ -16,7 +16,7 @@ impl ActionTrait for BeforePrepareBody { } impl BeforePrepareBody { - pub fn with(f: FnActionPage) -> Self { + pub fn new(f: FnActionPage) -> Self { BeforePrepareBody { f, weight: 0 } } diff --git a/pagetop/src/core/action/all.rs b/pagetop/src/core/action/all.rs index 45a466c6..8039f26f 100644 --- a/pagetop/src/core/action/all.rs +++ b/pagetop/src/core/action/all.rs @@ -20,7 +20,7 @@ pub fn add_action(action: Action) { if let Some(list) = actions.get_mut(&key_action) { list.add(action); } else { - actions.insert(key_action, ActionsList::with(action)); + actions.insert(key_action, ActionsList::new(action)); } } diff --git a/pagetop/src/core/action/list.rs b/pagetop/src/core/action/list.rs index 539e5b0a..12a75ec8 100644 --- a/pagetop/src/core/action/list.rs +++ b/pagetop/src/core/action/list.rs @@ -4,15 +4,12 @@ use std::sync::{Arc, RwLock}; pub type Action = Box<dyn ActionTrait>; +#[derive(Default)] pub struct ActionsList(Arc<RwLock<Vec<Action>>>); impl ActionsList { - pub fn new() -> Self { - ActionsList(Arc::new(RwLock::new(Vec::new()))) - } - - pub fn with(action: Action) -> Self { - let mut list = ActionsList::new(); + pub fn new(action: Action) -> Self { + let mut list = ActionsList::default(); list.add(action); list } diff --git a/pagetop/src/core/theme/definition.rs b/pagetop/src/core/theme/definition.rs index 53e87631..a22f0f02 100644 --- a/pagetop/src/core/theme/definition.rs +++ b/pagetop/src/core/theme/definition.rs @@ -25,7 +25,7 @@ pub trait ThemeTrait: ModuleTrait + Send + Sync { if render_region.is_empty() { html! {} } else { - let id = OptionId::with(region).get().unwrap(); + let id = OptionId::new(region).get().unwrap(); let id_inner = concat_string!(id, "__inner"); html! { div id=(id) class="pt-region" { diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index 26005dd7..e92ccf3e 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -24,14 +24,8 @@ pub enum ClassesOp { pub struct OptionClasses(Vec<String>); impl OptionClasses { - pub fn new() -> Self { - OptionClasses::default() - } - - pub fn with(op: ClassesOp, classes: impl Into<String>) -> Self { - let mut opt = OptionClasses::default(); - opt.alter_value(op, classes); - opt + pub fn new(classes: impl Into<String>) -> Self { + OptionClasses::default().with_value(ClassesOp::AddFirst, classes) } // OptionClasses BUILDER. @@ -96,11 +90,6 @@ impl OptionClasses { // OptionClasses GETTERS. - pub fn exists(&self, class: impl Into<String>) -> bool { - let class: String = class.into(); - self.0.iter().any(|c| c.eq(&class)) - } - pub fn get(&self) -> Option<String> { if self.0.is_empty() { None @@ -108,4 +97,9 @@ impl OptionClasses { Some(self.0.join(" ")) } } + + pub fn contains(&self, class: impl Into<String>) -> bool { + let class: String = class.into(); + self.0.iter().any(|c| c.eq(&class)) + } } diff --git a/pagetop/src/html/opt_id.rs b/pagetop/src/html/opt_id.rs index f78ab816..22cd8e69 100644 --- a/pagetop/src/html/opt_id.rs +++ b/pagetop/src/html/opt_id.rs @@ -4,14 +4,8 @@ use crate::fn_builder; pub struct OptionId(Option<String>); impl OptionId { - pub fn new() -> Self { - OptionId::default() - } - - pub fn with(value: impl Into<String>) -> Self { - let mut opt = OptionId::default(); - opt.alter_value(value); - opt + pub fn new(value: impl Into<String>) -> Self { + OptionId::default().with_value(value) } // OptionId BUILDER. diff --git a/pagetop/src/html/opt_name.rs b/pagetop/src/html/opt_name.rs index 508db2c2..d253e7e3 100644 --- a/pagetop/src/html/opt_name.rs +++ b/pagetop/src/html/opt_name.rs @@ -4,14 +4,8 @@ use crate::fn_builder; pub struct OptionName(Option<String>); impl OptionName { - pub fn new() -> Self { - OptionName::default() - } - - pub fn with(value: impl Into<String>) -> Self { - let mut opt = OptionName::default(); - opt.alter_value(value); - opt + pub fn new(value: impl Into<String>) -> Self { + OptionName::default().with_value(value) } // OptionName BUILDER. diff --git a/pagetop/src/html/opt_string.rs b/pagetop/src/html/opt_string.rs index b060728f..d81abdb0 100644 --- a/pagetop/src/html/opt_string.rs +++ b/pagetop/src/html/opt_string.rs @@ -4,14 +4,8 @@ use crate::fn_builder; pub struct OptionString(Option<String>); impl OptionString { - pub fn new() -> Self { - OptionString::default() - } - - pub fn with(value: impl Into<String>) -> Self { - let mut opt = OptionString::default(); - opt.alter_value(value); - opt + pub fn new(value: impl Into<String>) -> Self { + OptionString::default().with_value(value) } // OptionString BUILDER. diff --git a/pagetop/src/html/opt_translated.rs b/pagetop/src/html/opt_translated.rs index 9d8c255b..396fd364 100644 --- a/pagetop/src/html/opt_translated.rs +++ b/pagetop/src/html/opt_translated.rs @@ -1,17 +1,13 @@ use crate::fn_builder; -use crate::html::{html, Markup}; +use crate::html::Markup; use crate::locale::{L10n, LanguageIdentifier}; #[derive(Default)] pub struct OptionTranslated(Option<L10n>); impl OptionTranslated { - pub fn new() -> Self { - OptionTranslated::default() - } - - pub fn with(value: L10n) -> Self { - OptionTranslated(Some(value)) + pub fn new(value: L10n) -> Self { + OptionTranslated::default().with_value(value) } // OptionTranslated BUILDER. @@ -31,10 +27,10 @@ impl OptionTranslated { None } - pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { + pub fn escaped(&self, langid: &LanguageIdentifier) -> Option<Markup> { if let Some(value) = &self.0 { - return value.escaped(langid); + return Some(value.escaped(langid)); } - html! {} + None } } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index a8f19f05..fc450dfd 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -30,15 +30,15 @@ impl Page { #[rustfmt::skip] pub fn new(request: service::HttpRequest) -> Self { Page { - title : OptionTranslated::new(), - description : OptionTranslated::new(), - metadata : Vec::new(), - properties : Vec::new(), + title : OptionTranslated::default(), + description : OptionTranslated::default(), + metadata : Vec::default(), + properties : Vec::default(), favicon : None, context : Context::new(request), - body_classes: OptionClasses::new(), - skip_to : OptionId::new(), - regions : ComponentsRegions::new(), + body_classes: OptionClasses::default(), + skip_to : OptionId::default(), + regions : ComponentsRegions::default(), template : "default".to_owned(), } } From 905b4b1cba58c8a6d103082e66d2345a8e0e838f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 17:13:14 +0100 Subject: [PATCH 610/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Red?= =?UTF-8?q?efine=20typed=20and=20generic=20component=20lists?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/form/form_main.rs | 25 ++--- pagetop/src/base/component/menu/element.rs | 8 +- pagetop/src/base/component/menu/group.rs | 28 +++--- pagetop/src/base/component/menu/item.rs | 12 +-- pagetop/src/base/component/menu/megamenu.rs | 27 +++--- pagetop/src/base/component/menu/menu_main.rs | 21 +++-- pagetop/src/base/component/menu/submenu.rs | 27 +++--- pagetop/src/core/component.rs | 10 +- .../src/core/component/{arc.rs => arc_any.rs} | 93 +++++++++---------- .../core/component/{typed.rs => arc_typed.rs} | 75 +++++++-------- pagetop/src/core/theme/regions.rs | 30 +++--- pagetop/src/response/page.rs | 6 +- 12 files changed, 176 insertions(+), 186 deletions(-) rename pagetop/src/core/component/{arc.rs => arc_any.rs} (59%) rename pagetop/src/core/component/{typed.rs => arc_typed.rs} (60%) diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 8f7a0879..e0ee24fa 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -10,14 +10,14 @@ pub enum FormMethod { #[rustfmt::skip] #[derive(Default)] pub struct Form { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, classes : OptionClasses, action : OptionString, charset : OptionString, method : FormMethod, - stuff : ArcComponents, + stuff : AnyComponents, template : String, } @@ -64,6 +64,12 @@ impl ComponentTrait for Form { impl Form { // Form BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -76,12 +82,6 @@ impl Form { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); @@ -106,14 +106,15 @@ impl Form { self } + #[rustfmt::skip] pub fn with_element(mut self, element: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(element))); + self.stuff.alter_value(ArcAnyOp::Add(ArcAnyComponent::new(element))); self } #[fn_builder] - pub fn alter_elements(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); + pub fn alter_elements(&mut self, op: ArcAnyOp) -> &mut Self { + self.stuff.alter_value(op); self } @@ -141,7 +142,7 @@ impl Form { &self.method } - pub fn elements(&self) -> &ArcComponents { + pub fn elements(&self) -> &AnyComponents { &self.stuff } diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index c06d5689..c7f6181d 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -2,8 +2,8 @@ use crate::prelude::*; use super::Submenu; -type Content = TypedComponent<Html>; -type SubmenuItems = TypedComponent<Submenu>; +type Content = ArcTypedComponent<Html>; +type SubmenuItems = ArcTypedComponent<Submenu>; #[derive(Default)] pub enum ElementType { @@ -54,14 +54,14 @@ impl ComponentTrait for Element { impl Element { pub fn html(content: Html) -> Self { Element { - element_type: ElementType::Html(Content::with(content)), + element_type: ElementType::Html(Content::new(content)), ..Default::default() } } pub fn submenu(submenu: Submenu) -> Self { Element { - element_type: ElementType::Submenu(SubmenuItems::with(submenu)), + element_type: ElementType::Submenu(SubmenuItems::new(submenu)), ..Default::default() } } diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index 52181a51..de88ccb2 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -2,15 +2,13 @@ use crate::prelude::*; use super::Element; -type Elements = TypedComponents<Element>; - #[rustfmt::skip] #[derive(Default)] pub struct Group { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, - elements : Elements, + elements : TypedComponents<Element>, } impl_handle!(COMPONENT_BASE_MENU_GROUP for Group); @@ -44,6 +42,12 @@ impl ComponentTrait for Group { impl Group { // Group BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -56,27 +60,21 @@ impl Group { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - + #[rustfmt::skip] pub fn add_element(mut self, element: Element) -> Self { - self.elements - .alter(TypedOp::Add(TypedComponent::with(element))); + self.elements.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(element))); self } #[fn_builder] - pub fn alter_elements(&mut self, op: TypedOp<Element>) -> &mut Self { - self.elements.alter(op); + pub fn alter_elements(&mut self, op: ArcTypedOp<Element>) -> &mut Self { + self.elements.alter_value(op); self } // Group GETTERS. - pub fn elements(&self) -> &Elements { + pub fn elements(&self) -> &TypedComponents<Element> { &self.elements } } diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 71147c92..13b10e9e 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -3,9 +3,9 @@ use crate::prelude::*; use super::{Megamenu, Submenu}; type Label = L10n; -type Content = TypedComponent<Html>; -type SubmenuItems = TypedComponent<Submenu>; -type MegamenuGroups = TypedComponent<Megamenu>; +type Content = ArcTypedComponent<Html>; +type SubmenuItems = ArcTypedComponent<Submenu>; +type MegamenuGroups = ArcTypedComponent<Megamenu>; #[derive(Default)] pub enum ItemType { @@ -123,21 +123,21 @@ impl Item { pub fn html(content: Html) -> Self { Item { - item_type: ItemType::Html(Content::with(content)), + item_type: ItemType::Html(Content::new(content)), ..Default::default() } } pub fn submenu(label: L10n, submenu: Submenu) -> Self { Item { - item_type: ItemType::Submenu(label, SubmenuItems::with(submenu)), + item_type: ItemType::Submenu(label, SubmenuItems::new(submenu)), ..Default::default() } } pub fn megamenu(label: L10n, megamenu: Megamenu) -> Self { Item { - item_type: ItemType::Megamenu(label, MegamenuGroups::with(megamenu)), + item_type: ItemType::Megamenu(label, MegamenuGroups::new(megamenu)), ..Default::default() } } diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index fb0d717a..c7a1783f 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -2,15 +2,13 @@ use crate::prelude::*; use super::Group; -type Groups = TypedComponents<Group>; - #[rustfmt::skip] #[derive(Default)] pub struct Megamenu { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, - groups : Groups, + groups : TypedComponents<Group>, } impl_handle!(COMPONENT_BASE_MENU_MEGAMENU for Megamenu); @@ -44,6 +42,12 @@ impl ComponentTrait for Megamenu { impl Megamenu { // Megamenu BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -56,26 +60,21 @@ impl Megamenu { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - + #[rustfmt::skip] pub fn add_group(mut self, group: Group) -> Self { - self.groups.alter(TypedOp::Add(TypedComponent::with(group))); + self.groups.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(group))); self } #[fn_builder] - pub fn alter_groups(&mut self, op: TypedOp<Group>) -> &mut Self { - self.groups.alter(op); + pub fn alter_groups(&mut self, op: ArcTypedOp<Group>) -> &mut Self { + self.groups.alter_value(op); self } // Megamenu GETTERS. - pub fn groups(&self) -> &Groups { + pub fn groups(&self) -> &TypedComponents<Group> { &self.groups } } diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index b429a9df..ac053b67 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -5,9 +5,9 @@ use super::Item; #[rustfmt::skip] #[derive(Default)] pub struct Menu { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, items : TypedComponents<Item>, } @@ -70,6 +70,12 @@ impl ComponentTrait for Menu { impl Menu { // Menu BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -82,20 +88,15 @@ impl Menu { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - + #[rustfmt::skip] pub fn add_item(mut self, item: Item) -> Self { - self.items.alter(TypedOp::Add(TypedComponent::with(item))); + self.items.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(item))); self } #[fn_builder] - pub fn alter_items(&mut self, op: TypedOp<Item>) -> &mut Self { - self.items.alter(op); + pub fn alter_items(&mut self, op: ArcTypedOp<Item>) -> &mut Self { + self.items.alter_value(op); self } diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index ff72d0e8..d8743e6a 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -2,16 +2,14 @@ use crate::prelude::*; use super::Item; -type Items = TypedComponents<Item>; - #[rustfmt::skip] #[derive(Default)] pub struct Submenu { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, title : OptionTranslated, - items : Items, + items : TypedComponents<Item>, } impl_handle!(COMPONENT_BASE_MENU_SUBMENU for Submenu); @@ -50,6 +48,12 @@ impl ComponentTrait for Submenu { impl Submenu { // Submenu BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -62,26 +66,21 @@ impl Submenu { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_title(&mut self, title: L10n) -> &mut Self { self.title.alter_value(title); self } + #[rustfmt::skip] pub fn add_item(mut self, item: Item) -> Self { - self.items.alter(TypedOp::Add(TypedComponent::with(item))); + self.items.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(item))); self } #[fn_builder] - pub fn alter_items(&mut self, op: TypedOp<Item>) -> &mut Self { - self.items.alter(op); + pub fn alter_items(&mut self, op: ArcTypedOp<Item>) -> &mut Self { + self.items.alter_value(op); self } @@ -91,7 +90,7 @@ impl Submenu { &self.title } - pub fn items(&self) -> &Items { + pub fn items(&self) -> &TypedComponents<Item> { &self.items } } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index dcb171bd..9d57d87d 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -8,8 +8,10 @@ pub use renderable::{FnIsRenderable, Renderable}; mod definition; pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; -mod arc; -pub use arc::{ArcComponent, ArcComponents, ArcOp}; +mod arc_any; +pub use arc_any::AnyComponents; +pub use arc_any::{ArcAnyComponent, ArcAnyOp}; -mod typed; -pub use typed::{TypedComponent, TypedComponents, TypedOp}; +mod arc_typed; +pub use arc_typed::TypedComponents; +pub use arc_typed::{ArcTypedComponent, ArcTypedOp}; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc_any.rs similarity index 59% rename from pagetop/src/core/component/arc.rs rename to pagetop/src/core/component/arc_any.rs index c6674c3b..680a368b 100644 --- a/pagetop/src/core/component/arc.rs +++ b/pagetop/src/core/component/arc_any.rs @@ -1,6 +1,6 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; -use crate::{impl_handle, Handle, Weight}; +use crate::{fn_builder, impl_handle, Handle, Weight}; use std::sync::{Arc, RwLock, RwLockReadGuard}; @@ -16,30 +16,26 @@ impl ComponentTrait for ComponentNull { } #[derive(Clone)] -pub struct ArcComponent(Arc<RwLock<dyn ComponentTrait>>); +pub struct ArcAnyComponent(Arc<RwLock<dyn ComponentTrait>>); -impl Default for ArcComponent { +impl Default for ArcAnyComponent { fn default() -> Self { - ArcComponent(Arc::new(RwLock::new(ComponentNull))) + ArcAnyComponent(Arc::new(RwLock::new(ComponentNull))) } } -impl ArcComponent { - pub fn new() -> Self { - ArcComponent::default() +impl ArcAnyComponent { + pub fn new(component: impl ComponentTrait) -> Self { + ArcAnyComponent(Arc::new(RwLock::new(component))) } - pub fn with(component: impl ComponentTrait) -> Self { - ArcComponent(Arc::new(RwLock::new(component))) - } - - // ArcComponent BUILDER. + // ArcAnyComponent BUILDER. pub fn set(&mut self, component: impl ComponentTrait) { self.0 = Arc::new(RwLock::new(component)); } - // ArcComponent GETTERS. + // ArcAnyComponent GETTERS. pub fn get(&self) -> RwLockReadGuard<'_, dyn ComponentTrait> { self.0.read().unwrap() @@ -57,69 +53,66 @@ impl ArcComponent { self.0.read().unwrap().weight() } - // ArcComponent RENDER. + // ArcAnyComponent RENDER. pub fn render(&self, cx: &mut Context) -> Markup { self.0.write().unwrap().render(cx) } } -pub enum ArcOp { - Add(ArcComponent), - AddAfterId(&'static str, ArcComponent), - AddBeforeId(&'static str, ArcComponent), - AddFirst(ArcComponent), +// ************************************************************************************************* + +pub enum ArcAnyOp { + Add(ArcAnyComponent), + AddAfterId(&'static str, ArcAnyComponent), + AddBeforeId(&'static str, ArcAnyComponent), + AddFirst(ArcAnyComponent), RemoveById(&'static str), - ReplaceById(&'static str, ArcComponent), + ReplaceById(&'static str, ArcAnyComponent), Reset, } #[derive(Clone, Default)] -pub struct ArcComponents(Vec<ArcComponent>); +pub struct AnyComponents(Vec<ArcAnyComponent>); -impl ArcComponents { - pub fn new() -> Self { - ArcComponents::default() +impl AnyComponents { + pub fn new(arc: ArcAnyComponent) -> Self { + AnyComponents::default().with_value(ArcAnyOp::Add(arc)) } - pub fn with(arc: ArcComponent) -> Self { - let mut components = ArcComponents::new(); - components.alter(ArcOp::Add(arc)); - components - } - - pub(crate) fn merge(mixes: &[Option<&ArcComponents>]) -> Self { - let mut components = ArcComponents::default(); + pub(crate) fn merge(mixes: &[Option<&AnyComponents>]) -> Self { + let mut opt = AnyComponents::default(); for m in mixes.iter().flatten() { - components.0.append(&mut m.0.clone()); + opt.0.append(&mut m.0.clone()); } - components + opt } - // ArcComponents BUILDER. + // AnyComponents BUILDER. - pub fn alter(&mut self, op: ArcOp) -> &mut Self { + #[fn_builder] + pub fn alter_value(&mut self, op: ArcAnyOp) -> &mut Self { match op { - ArcOp::Add(arc) => self.0.push(arc), - ArcOp::AddAfterId(id, arc) => { + ArcAnyOp::Add(arc) => self.0.push(arc), + ArcAnyOp::AddAfterId(id, arc) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index + 1, arc), _ => self.0.push(arc), } } - ArcOp::AddBeforeId(id, arc) => { + ArcAnyOp::AddBeforeId(id, arc) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index, arc), _ => self.0.insert(0, arc), } } - ArcOp::AddFirst(arc) => self.0.insert(0, arc), - ArcOp::RemoveById(id) => { + ArcAnyOp::AddFirst(arc) => self.0.insert(0, arc), + ArcAnyOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { self.0.remove(index); } } - ArcOp::ReplaceById(id, arc) => { + ArcAnyOp::ReplaceById(id, arc) => { for c in self.0.iter_mut() { if c.id().as_deref() == Some(id) { *c = arc; @@ -127,26 +120,30 @@ impl ArcComponents { } } } - ArcOp::Reset => self.0.clear(), + ArcAnyOp::Reset => self.0.clear(), } self } - // ArcComponents GETTERS. + // AnyComponents GETTERS. - pub fn get_by_id(&self, id: &'static str) -> Option<&ArcComponent> { + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub fn get_by_id(&self, id: &'static str) -> Option<&ArcAnyComponent> { self.0.iter().find(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcComponent> { + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcAnyComponent> { self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcComponent> { + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcAnyComponent> { self.0.iter().filter(move |&c| c.handle() == handle) } - // ArcComponents RENDER. + // AnyComponents RENDER. pub fn render(&self, cx: &mut Context) -> Markup { let mut components = self.0.clone(); diff --git a/pagetop/src/core/component/typed.rs b/pagetop/src/core/component/arc_typed.rs similarity index 60% rename from pagetop/src/core/component/typed.rs rename to pagetop/src/core/component/arc_typed.rs index 7ccc48cd..e2e66e56 100644 --- a/pagetop/src/core/component/typed.rs +++ b/pagetop/src/core/component/arc_typed.rs @@ -1,34 +1,30 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; -use crate::{Handle, Weight}; +use crate::{fn_builder, Handle, Weight}; use std::sync::{Arc, RwLock, RwLockReadGuard}; #[derive(Default)] -pub struct TypedComponent<T: ComponentTrait + Default>(Arc<RwLock<T>>); +pub struct ArcTypedComponent<T: ComponentTrait>(Arc<RwLock<T>>); -impl<T: ComponentTrait + Default> Clone for TypedComponent<T> { +impl<T: ComponentTrait> Clone for ArcTypedComponent<T> { fn clone(&self) -> Self { Self(self.0.clone()) } } -impl<T: ComponentTrait + Default> TypedComponent<T> { - pub fn new() -> Self { - TypedComponent::<T>::default() +impl<T: ComponentTrait> ArcTypedComponent<T> { + pub fn new(component: T) -> Self { + ArcTypedComponent(Arc::new(RwLock::new(component))) } - pub fn with(component: T) -> Self { - TypedComponent(Arc::new(RwLock::new(component))) - } - - // TypedComponent BUILDER. + // ArcTypedComponent BUILDER. pub fn set(&mut self, component: T) { self.0 = Arc::new(RwLock::new(component)); } - // TypedComponent GETTERS. + // ArcTypedComponent GETTERS. pub fn get(&self) -> RwLockReadGuard<'_, T> { self.0.read().unwrap() @@ -46,61 +42,58 @@ impl<T: ComponentTrait + Default> TypedComponent<T> { self.0.read().unwrap().weight() } - // TypedComponent RENDER. + // ArcTypedComponent RENDER. pub fn render(&self, cx: &mut Context) -> Markup { self.0.write().unwrap().render(cx) } } -pub enum TypedOp<T: ComponentTrait + Default> { - Add(TypedComponent<T>), - AddAfterId(&'static str, TypedComponent<T>), - AddBeforeId(&'static str, TypedComponent<T>), - AddFirst(TypedComponent<T>), +// ************************************************************************************************* + +pub enum ArcTypedOp<T: ComponentTrait + Default> { + Add(ArcTypedComponent<T>), + AddAfterId(&'static str, ArcTypedComponent<T>), + AddBeforeId(&'static str, ArcTypedComponent<T>), + AddFirst(ArcTypedComponent<T>), RemoveById(&'static str), - ReplaceById(&'static str, TypedComponent<T>), + ReplaceById(&'static str, ArcTypedComponent<T>), Reset, } #[derive(Clone, Default)] -pub struct TypedComponents<T: ComponentTrait + Default>(Vec<TypedComponent<T>>); +pub struct TypedComponents<T: ComponentTrait + Default>(Vec<ArcTypedComponent<T>>); impl<T: ComponentTrait + Default> TypedComponents<T> { - pub fn new() -> Self { - TypedComponents::<T>::default() - } - - pub fn with(one: TypedComponent<T>) -> Self { - let mut components = TypedComponents::new(); - components.alter(TypedOp::Add(one)); - components + pub fn new(arc: ArcTypedComponent<T>) -> Self { + TypedComponents::default().with_value(ArcTypedOp::Add(arc)) } // TypedComponents BUILDER. - pub fn alter(&mut self, op: TypedOp<T>) -> &mut Self { + #[fn_builder] + pub fn alter_value(&mut self, op: ArcTypedOp<T>) -> &mut Self { match op { - TypedOp::Add(one) => self.0.push(one), - TypedOp::AddAfterId(id, one) => { + ArcTypedOp::Add(one) => self.0.push(one), + ArcTypedOp::AddAfterId(id, one) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index + 1, one), _ => self.0.push(one), } } - TypedOp::AddBeforeId(id, one) => { + ArcTypedOp::AddBeforeId(id, one) => { match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { Some(index) => self.0.insert(index, one), _ => self.0.insert(0, one), } } - TypedOp::AddFirst(one) => self.0.insert(0, one), - TypedOp::RemoveById(id) => { + ArcTypedOp::AddFirst(one) => self.0.insert(0, one), + ArcTypedOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { self.0.remove(index); } } - TypedOp::ReplaceById(id, one) => { + ArcTypedOp::ReplaceById(id, one) => { for c in self.0.iter_mut() { if c.id().as_deref() == Some(id) { *c = one; @@ -108,22 +101,26 @@ impl<T: ComponentTrait + Default> TypedComponents<T> { } } } - TypedOp::Reset => self.0.clear(), + ArcTypedOp::Reset => self.0.clear(), } self } // TypedComponents GETTERS. - pub fn get_by_id(&self, id: &'static str) -> Option<&TypedComponent<T>> { + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub fn get_by_id(&self, id: &'static str) -> Option<&ArcTypedComponent<T>> { self.0.iter().find(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &TypedComponent<T>> { + pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcTypedComponent<T>> { self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) } - pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &TypedComponent<T>> { + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcTypedComponent<T>> { self.0.iter().filter(move |&c| c.handle() == handle) } diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 301f5522..548185bd 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,4 +1,4 @@ -use crate::core::component::{ArcComponent, ArcComponents, ArcOp}; +use crate::core::component::{AnyComponents, ArcAnyComponent, ArcAnyOp}; use crate::core::theme::ThemeRef; use crate::{Handle, LazyStatic}; @@ -9,36 +9,32 @@ static THEME_REGIONS: LazyStatic<RwLock<HashMap<Handle, ComponentsRegions>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); static COMMON_REGIONS: LazyStatic<RwLock<ComponentsRegions>> = - LazyStatic::new(|| RwLock::new(ComponentsRegions::new())); + LazyStatic::new(|| RwLock::new(ComponentsRegions::default())); #[derive(Default)] -pub struct ComponentsRegions(HashMap<&'static str, ArcComponents>); +pub struct ComponentsRegions(HashMap<&'static str, AnyComponents>); impl ComponentsRegions { - pub fn new() -> Self { - ComponentsRegions::default() - } - - pub fn with(region: &'static str, arc: ArcComponent) -> Self { - let mut regions = ComponentsRegions::new(); + pub fn new(region: &'static str, arc: ArcAnyComponent) -> Self { + let mut regions = ComponentsRegions::default(); regions.add_in(region, arc); regions } - pub fn add_in(&mut self, region: &'static str, arc: ArcComponent) { + pub fn add_in(&mut self, region: &'static str, arc: ArcAnyComponent) { if let Some(region) = self.0.get_mut(region) { - region.alter(ArcOp::Add(arc)); + region.alter_value(ArcAnyOp::Add(arc)); } else { - self.0.insert(region, ArcComponents::with(arc)); + self.0.insert(region, AnyComponents::new(arc)); } } - pub fn get_components(&self, theme: ThemeRef, region: &str) -> ArcComponents { + pub fn get_components(&self, theme: ThemeRef, region: &str) -> AnyComponents { let common = COMMON_REGIONS.read().unwrap(); if let Some(hm) = THEME_REGIONS.read().unwrap().get(&theme.handle()) { - ArcComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) + AnyComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) } else { - ArcComponents::merge(&[common.0.get(region), self.0.get(region)]) + AnyComponents::merge(&[common.0.get(region), self.0.get(region)]) } } } @@ -48,7 +44,7 @@ pub enum Region { OfTheme(ThemeRef, &'static str), } -pub fn add_component_in(region: Region, arc: ArcComponent) { +pub fn add_component_in(region: Region, arc: ArcAnyComponent) { match region { Region::Named(name) => { COMMON_REGIONS.write().unwrap().add_in(name, arc); @@ -58,7 +54,7 @@ pub fn add_component_in(region: Region, arc: ArcComponent) { if let Some(hm) = regions.get_mut(&theme.handle()) { hm.add_in(region, arc); } else { - regions.insert(theme.handle(), ComponentsRegions::with(region, arc)); + regions.insert(theme.handle(), ComponentsRegions::new(region, arc)); } } } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index fc450dfd..58882db1 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,5 +1,5 @@ use crate::base::action; -use crate::core::component::{ArcComponent, ArcComponents as RegionComponents, ComponentTrait}; +use crate::core::component::{AnyComponents, ArcAnyComponent, ComponentTrait}; use crate::core::component::{Context, ContextOp}; use crate::core::theme::ComponentsRegions; use crate::html::{html, Markup, DOCTYPE}; @@ -95,7 +95,7 @@ impl Page { #[fn_builder] pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_in(region, ArcComponent::with(component)); + self.regions.add_in(region, ArcAnyComponent::new(component)); self } @@ -139,7 +139,7 @@ impl Page { &self.skip_to } - pub fn components_in(&self, region: &str) -> RegionComponents { + pub fn components_in(&self, region: &str) -> AnyComponents { self.regions.get_components(self.context.theme(), region) } From 3d2e75057757e595cc5ff29092579e3dce763f4f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 17:23:58 +0100 Subject: [PATCH 611/853] =?UTF-8?q?=F0=9F=9A=A7=20General=20components=20r?= =?UTF-8?q?eview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/src/lib.rs | 4 +- pagetop-bootsier/src/lib.rs | 6 +- pagetop-bootsier/static/css/styles.css | 8 +- pagetop-bulmix/src/lib.rs | 48 +- pagetop-bulmix/static/css/styles.css | 11 + pagetop-homedemo/src/lib.rs | 10 +- pagetop-homedemo/static/css/styles.css | 4 +- pagetop-node/src/lib.rs | 2 +- pagetop/src/base/component.rs | 9 +- pagetop/src/base/component/block.rs | 33 +- pagetop/src/base/component/branding.rs | 20 +- .../base/component/{anchor.rs => button.rs} | 129 +- pagetop/src/base/component/flex/container.rs | 56 +- pagetop/src/base/component/flex/item.rs | 64 +- pagetop/src/base/component/form/button.rs | 26 +- pagetop/src/base/component/heading.rs | 27 +- pagetop/src/base/component/icon.rs | 47 +- pagetop/src/base/component/image.rs | 14 +- pagetop/src/base/component/paragraph.rs | 38 +- pagetop/src/base/component/wrapper.rs | 25 +- pagetop/src/core/component/definition.rs | 6 + pagetop/static/base/css/buttons.css | 1211 +++++++++++++++++ pagetop/static/base/css/inception.css | 15 +- pagetop/static/base/css/looks.css | 2 +- pagetop/static/base/css/root.css | 46 +- 25 files changed, 1557 insertions(+), 304 deletions(-) create mode 100644 pagetop-bulmix/static/css/styles.css rename pagetop/src/base/component/{anchor.rs => button.rs} (61%) create mode 100644 pagetop/static/base/css/buttons.css diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index bf7f5ca0..db70f468 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -19,8 +19,8 @@ impl ModuleTrait for Admin { fn actions(&self) -> Vec<Action> { actions![ - action::page::BeforePrepareBody::with(before_prepare_body), - action::component::BeforePrepareComponent::<Menu>::with(before_prepare_menu) + action::page::BeforePrepareBody::new(before_prepare_body), + action::component::BeforePrepareComponent::<Menu>::new(before_prepare_menu) .filter_by_referer_id("admin-menu-test"), ] } diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 40e837ad..543bca46 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -124,16 +124,16 @@ impl ThemeTrait for Bootsier { } _ => {} }; - match a.anchor_type() { + match a.button_type() { ButtonType::Link => { a.alter_classes( - ClassesOp::Replace(a.anchor_type().to_string()), + ClassesOp::Replace(a.button_type().to_string()), "btn btn-link", ); } ButtonType::Primary => { a.alter_classes( - ClassesOp::Replace(a.anchor_type().to_string()), + ClassesOp::Replace(a.button_type().to_string()), "btn btn-primary", ); } diff --git a/pagetop-bootsier/static/css/styles.css b/pagetop-bootsier/static/css/styles.css index a26bdd57..9f458863 100644 --- a/pagetop-bootsier/static/css/styles.css +++ b/pagetop-bootsier/static/css/styles.css @@ -3,5 +3,11 @@ /* Heading component */ .pt-heading__subtitle { - margin-top: calc(-1 * var(--pt-gap-0-5)); + margin-top: calc(-1 * var(--pt-gap-0-35)); +} + +/* Button component */ + +.btn-link { + text-decoration: none; } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 272f83b2..ba50dd68 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -24,7 +24,10 @@ impl ThemeTrait for Bulmix { .with_version("0.9.4") .with_weight(-99), )) - .alter_context(ContextOp::AddBaseAssets); + .alter_context(ContextOp::AddBaseAssets) + .alter_context(ContextOp::AddStyleSheet( + StyleSheet::at("/bulmix/css/styles.css").with_version("0.0.1"), + )); } fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { @@ -50,8 +53,8 @@ impl ThemeTrait for Bulmix { _ => {} }; } - COMPONENT_BASE_ANCHOR => { - let a = component_as_mut::<Anchor>(component); + COMPONENT_BASE_BUTTON => { + let a = component_as_mut::<Button>(component); match a.font_size() { FontSize::ExtraLarge => { a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-1"); @@ -70,12 +73,20 @@ impl ThemeTrait for Bulmix { } _ => {} }; - if let AnchorType::Button = a.anchor_type() { - a.alter_classes( - ClassesOp::Replace(a.anchor_type().to_string()), - "button is-primary", - ); - }; + match a.button_type() { + ButtonType::Link => { + a.alter_classes( + ClassesOp::Replace(a.button_type().to_string()), + "button is-text", + ); + } + ButtonType::Primary => { + a.alter_classes( + ClassesOp::Replace(a.button_type().to_string()), + "button is-primary", + ); + } + } } COMPONENT_BASE_HEADING => { let h = component_as_mut::<Heading>(component); @@ -112,19 +123,18 @@ impl ThemeTrait for Bulmix { } } - fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { + fn render_component( + &self, + component: &dyn ComponentTrait, + _cx: &mut Context, + ) -> Option<Markup> { match component.handle() { COMPONENT_BASE_ICON => { let icon = component_as_ref::<Icon>(component); - if icon.icon_name().is_empty() { - return None; - }; - cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); - Some(html! { - span class="icon" { - i class=[icon.classes().get()] {} - } - }) + match icon.icon_name().get() { + None => None, + _ => Some(html! { span class="icon" { i class=[icon.classes().get()] {} } }), + } } _ => None, } diff --git a/pagetop-bulmix/static/css/styles.css b/pagetop-bulmix/static/css/styles.css new file mode 100644 index 00000000..cdd6b4e9 --- /dev/null +++ b/pagetop-bulmix/static/css/styles.css @@ -0,0 +1,11 @@ +html { + scroll-behavior: smooth; +} + +/* OVERRIDE COMPONENT STYLES */ + +/* Button component */ + +.is-link { + text-decoration: none; +} diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 0ee1ae3b..58b46f2f 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -70,20 +70,20 @@ fn hello_world() -> Wrapper { ), )) .add_component( - Anchor::button( + Button::primary( "https://github.com/manuelcillero/pagetop", L10n::t("hello_code", &LOCALES_HOMEDEMO), ) - .with_target(AnchorTarget::Blank) + .with_target(ButtonTarget::Blank) .with_left_icon(Icon::with("git")) .with_classes(ClassesOp::Add, "code-link") - .with_font_size(FontSize::Large), + .with_font_size(FontSize::Medium), ) .add_component( - Anchor::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) + Button::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) .with_left_icon(Icon::with("arrow-down-circle-fill")) .with_classes(ClassesOp::Add, "welcome-link") - .with_font_size(FontSize::Large), + .with_font_size(FontSize::Medium), ), ) .add_item( diff --git a/pagetop-homedemo/static/css/styles.css b/pagetop-homedemo/static/css/styles.css index 5034d72e..c06673be 100644 --- a/pagetop-homedemo/static/css/styles.css +++ b/pagetop-homedemo/static/css/styles.css @@ -18,7 +18,7 @@ body.default-homepage [class$="-col-text"] { body.default-homepage [class$="-col-image"] { padding: 1rem 5%; } - +/* #hello-world a { margin: .25rem; } @@ -36,7 +36,7 @@ body.default-homepage [class$="-col-image"] { #hello-world .hello-col-image { padding-top: 3em; } - +*/ #welcome > div.container { padding: 2rem 1rem; border-radius: 28px; diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 1494aaa0..1a58b9f8 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -23,7 +23,7 @@ impl ModuleTrait for Node { } fn actions(&self) -> Vec<Action> { - actions![action::page::BeforePrepareBody::with(before_prepare_body).with_weight(-1)] + actions![action::page::BeforePrepareBody::new(before_prepare_body).with_weight(-1)] } fn migrations(&self) -> Vec<MigrationItem> { diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index b108402d..ca3f5594 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -46,6 +46,11 @@ pub(crate) fn add_base_assets(cx: &mut Context) { StyleSheet::at("/base/css/looks.css") .with_version("0.0.1") .with_weight(weight), + )) + .alter(ContextOp::AddStyleSheet( + StyleSheet::at("/base/css/buttons.css") + .with_version("0.0.1") + .with_weight(weight), )); } @@ -135,8 +140,8 @@ mod heading; pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_BASE_HEADING}; mod paragraph; pub use paragraph::{Paragraph, COMPONENT_BASE_PARAGRAPH}; -mod anchor; -pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_BASE_ANCHOR}; +mod button; +pub use button::{Button, ButtonTarget, ButtonType, COMPONENT_BASE_BUTTON}; mod image; pub use image::{Image, ImageSize, COMPONENT_BASE_IMAGE}; mod block; diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index c85e2562..b7925e40 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -3,20 +3,19 @@ use crate::prelude::*; #[rustfmt::skip] #[derive(Default)] pub struct Block { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, classes : OptionClasses, title : OptionTranslated, - stuff : ArcComponents, - template : String, + stuff : AnyComponents, } impl_handle!(COMPONENT_BASE_BLOCK for Block); impl ComponentTrait for Block { fn new() -> Self { - Block::default().with_classes(ClassesOp::Add, "block") + Block::default() } fn id(&self) -> Option<String> { @@ -31,7 +30,14 @@ impl ComponentTrait for Block { (self.renderable.check)(cx) } + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.classes.alter_value(ClassesOp::AddFirst, "block"); + } + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + if self.components().is_empty() { + return PrepareMarkup::None; + } let id = cx.required_id::<Block>(self.id()); PrepareMarkup::With(html! { div id=(id) class=[self.classes().get()] { @@ -79,20 +85,15 @@ impl Block { self } + #[rustfmt::skip] pub fn add_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self.stuff.alter_value(ArcAnyOp::Add(ArcAnyComponent::new(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); - self - } - - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); + pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { + self.stuff.alter_value(op); self } @@ -106,11 +107,7 @@ impl Block { &self.title } - pub fn components(&self) -> &ArcComponents { + pub fn components(&self) -> &AnyComponents { &self.stuff } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index c0d59fb0..d5149d25 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -1,14 +1,13 @@ use crate::prelude::*; -type SiteLogo = TypedComponent<Image>; - #[rustfmt::skip] pub struct Branding { + id : OptionId, weight : Weight, renderable: Renderable, app_name : String, slogan : OptionTranslated, - logo : SiteLogo, + logo : ArcTypedComponent<Image>, frontpage : FnContextualPath, } @@ -16,11 +15,12 @@ pub struct Branding { impl Default for Branding { fn default() -> Self { Branding { + id : OptionId::default(), weight : Weight::default(), renderable: Renderable::default(), app_name : config::SETTINGS.app.name.to_owned(), slogan : OptionTranslated::default(), - logo : SiteLogo::default(), + logo : ArcTypedComponent::<Image>::default(), frontpage : |_| "/", } } @@ -34,7 +34,7 @@ impl ComponentTrait for Branding { } fn id(&self) -> Option<String> { - Some("pt-branding".to_owned()) + self.id.get() } fn weight(&self) -> Weight { @@ -48,7 +48,7 @@ impl ComponentTrait for Branding { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let title = L10n::l("site_home").using(cx.langid()); PrepareMarkup::With(html! { - div id=[self.id()] { + div id=[self.id()] class="pt-branding" { div class="pt-branding__wrapper" { div class="pt-branding__logo" { (self.logo().render(cx)) @@ -74,6 +74,12 @@ impl ComponentTrait for Branding { impl Branding { // Branding BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -120,7 +126,7 @@ impl Branding { &self.slogan } - pub fn logo(&self) -> &SiteLogo { + pub fn logo(&self) -> &ArcTypedComponent<Image> { &self.logo } diff --git a/pagetop/src/base/component/anchor.rs b/pagetop/src/base/component/button.rs similarity index 61% rename from pagetop/src/base/component/anchor.rs rename to pagetop/src/base/component/button.rs index 6aad1b92..88e5917d 100644 --- a/pagetop/src/base/component/anchor.rs +++ b/pagetop/src/base/component/button.rs @@ -1,27 +1,24 @@ use crate::prelude::*; -new_handle!(COMPONENT_BASE_ANCHOR); - #[derive(Default)] -pub enum AnchorType { +pub enum ButtonType { #[default] Link, - Button, - Location, + Primary, } #[rustfmt::skip] -impl ToString for AnchorType { +impl ToString for ButtonType { fn to_string(&self) -> String { - match self { - AnchorType::Button => "btn btn-primary".to_string(), - _ => "".to_string(), - } + String::from(match self { + ButtonType::Link => "pt-button__link", + ButtonType::Primary => "pt-button__primary", + }) } } #[derive(Default)] -pub enum AnchorTarget { +pub enum ButtonTarget { #[default] Default, Blank, @@ -30,31 +27,29 @@ pub enum AnchorTarget { Context(String), } -type AnchorIcon = TypedComponent<Icon>; +type ButtonIcon = ArcTypedComponent<Icon>; #[rustfmt::skip] #[derive(Default)] -pub struct Anchor { +pub struct Button { + id : OptionId, weight : Weight, renderable : Renderable, - id : OptionId, classes : OptionClasses, + button_type: ButtonType, font_size : FontSize, - anchor_type: AnchorType, href : OptionString, html : OptionTranslated, - left_icon : AnchorIcon, - right_icon : AnchorIcon, - target : AnchorTarget, + left_icon : ButtonIcon, + right_icon : ButtonIcon, + target : ButtonTarget, } -impl ComponentTrait for Anchor { - fn new() -> Self { - Anchor::default() - } +impl_handle!(COMPONENT_BASE_BUTTON for Button); - fn handle(&self) -> Handle { - COMPONENT_BASE_ANCHOR +impl ComponentTrait for Button { + fn new() -> Self { + Button::default() } fn id(&self) -> Option<String> { @@ -69,13 +64,20 @@ impl ComponentTrait for Anchor { (self.renderable.check)(cx) } + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.classes.alter_value( + ClassesOp::AddFirst, + [self.button_type.to_string(), self.font_size.to_string()].join(" "), + ); + } + #[rustfmt::skip] fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let target = match &self.target() { - AnchorTarget::Blank => Some("_blank"), - AnchorTarget::Parent => Some("_parent"), - AnchorTarget::Top => Some("_top"), - AnchorTarget::Context(name) => Some(name.as_str()), + ButtonTarget::Blank => Some("_blank"), + ButtonTarget::Parent => Some("_parent"), + ButtonTarget::Top => Some("_top"), + ButtonTarget::Context(name) => Some(name.as_str()), _ => None, }; PrepareMarkup::With(html! { @@ -85,31 +87,36 @@ impl ComponentTrait for Anchor { href=[self.href().get()] target=[target] { - (self.left_icon().prepare(cx)) - " " span { (self.html().escaped(cx.langid())) } " " - (self.right_icon().prepare(cx)) + (self.left_icon().render(cx)) + " " span { (self.html().escaped(cx.langid()).unwrap_or_default()) } " " + (self.right_icon().render(cx)) } }) } } -impl Anchor { +impl Button { pub fn link(href: impl Into<String>, html: L10n) -> Self { - Anchor::new().with_href(href).with_html(html) - } - - pub fn button(href: impl Into<String>, html: L10n) -> Self { - Anchor::new() - .with_type(AnchorType::Button) + Button::default() + .with_type(ButtonType::Link) .with_href(href) .with_html(html) } - pub fn location(id: impl Into<String>) -> Self { - Anchor::new().with_type(AnchorType::Location).with_id(id) + pub fn primary(href: impl Into<String>, html: L10n) -> Self { + Button::default() + .with_type(ButtonType::Primary) + .with_href(href) + .with_html(html) } - // Anchor BUILDER. + // Button BUILDER. + + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { @@ -123,12 +130,6 @@ impl Anchor { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); @@ -136,22 +137,14 @@ impl Anchor { } #[fn_builder] - pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.font_size.to_string()), - font_size.to_string(), - ); - self.font_size = font_size; + pub fn alter_type(&mut self, button_type: ButtonType) -> &mut Self { + self.button_type = button_type; self } #[fn_builder] - pub fn alter_type(&mut self, anchor_type: AnchorType) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.anchor_type.to_string()), - anchor_type.to_string(), - ); - self.anchor_type = anchor_type; + pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { + self.font_size = font_size; self } @@ -180,23 +173,23 @@ impl Anchor { } #[fn_builder] - pub fn alter_target(&mut self, target: AnchorTarget) -> &mut Self { + pub fn alter_target(&mut self, target: ButtonTarget) -> &mut Self { self.target = target; self } - // Anchor GETTERS. + // Button GETTERS. pub fn classes(&self) -> &OptionClasses { &self.classes } - pub fn font_size(&self) -> &FontSize { - &self.font_size + pub fn button_type(&self) -> &ButtonType { + &self.button_type } - pub fn anchor_type(&self) -> &AnchorType { - &self.anchor_type + pub fn font_size(&self) -> &FontSize { + &self.font_size } pub fn href(&self) -> &OptionString { @@ -207,15 +200,15 @@ impl Anchor { &self.html } - pub fn left_icon(&self) -> &AnchorIcon { + pub fn left_icon(&self) -> &ButtonIcon { &self.left_icon } - pub fn right_icon(&self) -> &AnchorIcon { + pub fn right_icon(&self) -> &ButtonIcon { &self.right_icon } - pub fn target(&self) -> &AnchorTarget { + pub fn target(&self) -> &ButtonTarget { &self.target } } diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index f879101f..83912eec 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -3,9 +3,9 @@ use crate::prelude::*; #[rustfmt::skip] #[derive(Default)] pub struct Container { + id : OptionId, weight : Weight, renderable : Renderable, - id : OptionId, classes : OptionClasses, items : TypedComponents<flex::Item>, direction : flex::Direction, @@ -19,7 +19,7 @@ impl_handle!(COMPONENT_BASE_FLEX_CONTAINER for Container); impl ComponentTrait for Container { fn new() -> Self { - Container::default().with_classes(ClassesOp::Add, flex::Direction::Default.to_string()) + Container::default() } fn id(&self) -> Option<String> { @@ -34,9 +34,22 @@ impl ComponentTrait for Container { (self.renderable.check)(cx) } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - cx.set_param::<bool>(PARAM_BASE_INCLUDE_FLEX_ASSETS, true); + fn setup_before_prepare(&mut self, cx: &mut Context) { + self.classes.alter_value( + ClassesOp::AddFirst, + [ + self.direction.to_string(), + self.wrap_align.to_string(), + self.content_justify.to_string(), + self.items_align.to_string(), + ] + .join(" "), + ); + cx.set_param::<bool>(PARAM_BASE_INCLUDE_FLEX_ASSETS, true); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let gap = match self.gap() { flex::Gap::Default => None, _ => Some(self.gap().to_string()), @@ -53,6 +66,12 @@ impl ComponentTrait for Container { impl Container { // Container BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -65,65 +84,44 @@ impl Container { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self } + #[rustfmt::skip] pub fn add_item(mut self, item: flex::Item) -> Self { - self.items.alter(TypedOp::Add(TypedComponent::with(item))); + self.items.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(item))); self } #[fn_builder] - pub fn alter_items(&mut self, op: TypedOp<flex::Item>) -> &mut Self { - self.items.alter(op); + pub fn alter_items(&mut self, op: ArcTypedOp<flex::Item>) -> &mut Self { + self.items.alter_value(op); self } #[fn_builder] pub fn alter_direction(&mut self, direction: flex::Direction) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.direction.to_string()), - direction.to_string(), - ); self.direction = direction; self } #[fn_builder] pub fn alter_wrap_align(&mut self, wrap: flex::WrapAlign) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.wrap_align.to_string()), - wrap.to_string(), - ); self.wrap_align = wrap; self } #[fn_builder] pub fn alter_content_justify(&mut self, justify: flex::ContentJustify) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.content_justify.to_string()), - justify.to_string(), - ); self.content_justify = justify; self } #[fn_builder] pub fn alter_items_align(&mut self, align: flex::ItemAlign) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.items_align.to_string()), - align.to_string(), - ); self.items_align = align; self } diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 375f528f..1abe91a1 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -3,9 +3,9 @@ use crate::prelude::*; #[rustfmt::skip] #[derive(Default)] pub struct Item { + id : OptionId, weight : Weight, renderable : Renderable, - id : OptionId, item_classes : OptionClasses, inner_classes: OptionClasses, item_grow : flex::ItemGrow, @@ -13,7 +13,7 @@ pub struct Item { item_size : flex::ItemSize, item_offset : flex::ItemOffset, item_align : flex::ItemAlign, - stuff : ArcComponents, + stuff : AnyComponents, } impl_handle!(COMPONENT_BASE_FLEX_ITEM for Item); @@ -21,8 +21,6 @@ impl_handle!(COMPONENT_BASE_FLEX_ITEM for Item); impl ComponentTrait for Item { fn new() -> Self { Item::default() - .with_item_classes(ClassesOp::Add, "pt-flex__item") - .with_inner_classes(ClassesOp::Add, "pt-flex__item-inner") } fn id(&self) -> Option<String> { @@ -37,6 +35,23 @@ impl ComponentTrait for Item { (self.renderable.check)(cx) } + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.item_classes.alter_value( + ClassesOp::AddFirst, + [ + "pt-flex__item".to_owned(), + self.item_grow.to_string(), + self.item_shrink.to_string(), + self.item_size.to_string(), + self.item_offset.to_string(), + self.item_align.to_string(), + ] + .join(" "), + ); + self.inner_classes + .alter_value(ClassesOp::AddFirst, "pt-flex__item-inner"); + } + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let order = match self.weight() { 0 => None, @@ -55,6 +70,12 @@ impl ComponentTrait for Item { impl Item { // Item BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -67,12 +88,6 @@ impl Item { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_item_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.item_classes.alter_value(op, classes); @@ -87,62 +102,43 @@ impl Item { #[fn_builder] pub fn alter_grow(&mut self, grow: flex::ItemGrow) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_grow.to_string()), - grow.to_string(), - ); self.item_grow = grow; self } #[fn_builder] pub fn alter_shrink(&mut self, shrink: flex::ItemShrink) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_shrink.to_string()), - shrink.to_string(), - ); self.item_shrink = shrink; self } #[fn_builder] pub fn alter_size(&mut self, size: flex::ItemSize) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_size.to_string()), - size.to_string(), - ); self.item_size = size; self } #[fn_builder] pub fn alter_offset(&mut self, offset: flex::ItemOffset) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_offset.to_string()), - offset.to_string(), - ); self.item_offset = offset; self } #[fn_builder] pub fn alter_align(&mut self, align: flex::ItemAlign) -> &mut Self { - self.item_classes.alter_value( - ClassesOp::Replace(self.item_align.to_string()), - align.to_string(), - ); self.item_align = align; self } + #[rustfmt::skip] pub fn add_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self.stuff.alter_value(ArcAnyOp::Add(ArcAnyComponent::new(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); + pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { + self.stuff.alter_value(op); self } @@ -176,7 +172,7 @@ impl Item { &self.item_align } - pub fn components(&self) -> &ArcComponents { + pub fn components(&self) -> &AnyComponents { &self.stuff } } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index 86462c7a..e64c3fc1 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -37,7 +37,7 @@ impl_handle!(COMPONENT_BASE_BUTTON for Button); impl ComponentTrait for Button { fn new() -> Self { - Button::default().with_classes(ClassesOp::Add, "btn btn-primary form-button") + Button::default() } fn weight(&self) -> Weight { @@ -48,16 +48,18 @@ impl ComponentTrait for Button { (self.renderable.check)(cx) } + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.classes.alter_value( + ClassesOp::AddFirst, + concat_string!("btn btn-primary form-", self.button_type.to_string()), + ); + } + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let button_type = match self.button_type() { - ButtonType::Button => "button", - ButtonType::Submit => "submit", - ButtonType::Reset => "reset", - }; let id = self.name().get().map(|name| concat_string!("edit-", name)); PrepareMarkup::With(html! { button - type=(button_type) + type=(self.button_type().to_string()) id=[id] class=[self.classes().get()] name=[self.name().get()] @@ -65,7 +67,7 @@ impl ComponentTrait for Button { autofocus=[self.autofocus().get()] disabled=[self.disabled().get()] { - (self.value().escaped(cx.langid())) + (self.value().escaped(cx.langid()).unwrap_or_default()) } }) } @@ -77,17 +79,13 @@ impl Button { } pub fn submit(value: L10n) -> Self { - let mut button = Button::default() - .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-submit") - .with_value(value); + let mut button = Button::default().with_value(value); button.button_type = ButtonType::Submit; button } pub fn reset(value: L10n) -> Self { - let mut button = Button::default() - .with_classes(ClassesOp::Replace("form-button".to_owned()), "form-reset") - .with_value(value); + let mut button = Button::default().with_value(value); button.button_type = ButtonType::Reset; button } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 282b0f28..b2233a8f 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -41,9 +41,9 @@ impl ToString for HeadingDisplay { #[rustfmt::skip] #[derive(Default)] pub struct Heading { + id : OptionId, weight : Weight, renderable : Renderable, - id : OptionId, classes : OptionClasses, heading_type: HeadingType, text : OptionTranslated, @@ -72,13 +72,14 @@ impl ComponentTrait for Heading { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let id = self.id(); let classes = self.classes().get(); + let text = self.text().escaped(cx.langid()).unwrap_or_default(); PrepareMarkup::With(html! { @match &self.heading_type() { - HeadingType::H1 => h1 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, - HeadingType::H2 => h2 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, - HeadingType::H3 => h3 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, - HeadingType::H4 => h4 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, - HeadingType::H5 => h5 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, - HeadingType::H6 => h6 id=[id] class=[classes] { (self.text().escaped(cx.langid())) }, + HeadingType::H1 => h1 id=[id] class=[classes] { (text) }, + HeadingType::H2 => h2 id=[id] class=[classes] { (text) }, + HeadingType::H3 => h3 id=[id] class=[classes] { (text) }, + HeadingType::H4 => h4 id=[id] class=[classes] { (text) }, + HeadingType::H5 => h5 id=[id] class=[classes] { (text) }, + HeadingType::H6 => h6 id=[id] class=[classes] { (text) }, }}) } } @@ -122,6 +123,12 @@ impl Heading { // Heading BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -134,12 +141,6 @@ impl Heading { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 4b3fd6f9..8257fdfe 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -6,8 +6,8 @@ pub struct Icon { weight : Weight, renderable: Renderable, classes : OptionClasses, + icon_name : OptionString, font_size : FontSize, - icon_name : String, } impl_handle!(COMPONENT_BASE_ICON for Icon); @@ -25,17 +25,26 @@ impl ComponentTrait for Icon { (self.renderable.check)(cx) } - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - if self.icon_name().is_empty() { - return PrepareMarkup::None; + fn setup_before_prepare(&mut self, cx: &mut Context) { + if let Some(icon_name) = self.icon_name.get() { + self.classes.alter_value( + ClassesOp::AddFirst, + concat_string!("bi-", icon_name, " ", self.font_size.to_string()), + ); + cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); + } + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + match self.icon_name().get() { + None => PrepareMarkup::None, + _ => PrepareMarkup::With(html! { i class=[self.classes().get()] {} }), } - cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); - PrepareMarkup::With(html! { i class=[self.classes().get()] {} }) } } impl Icon { - pub fn with(icon_name: &str) -> Self { + pub fn with(icon_name: impl Into<String>) -> Self { Icon::default().with_icon_name(icon_name) } @@ -60,22 +69,14 @@ impl Icon { } #[fn_builder] - pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.font_size.to_string()), - font_size.to_string(), - ); - self.font_size = font_size; + pub fn alter_icon_name(&mut self, name: impl Into<String>) -> &mut Self { + self.icon_name.alter_value(name); self } #[fn_builder] - pub fn alter_icon_name(&mut self, name: &str) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(concat_string!("bi-", self.icon_name)), - concat_string!("bi-", name), - ); - self.icon_name = name.to_owned(); + pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { + self.font_size = font_size; self } @@ -85,11 +86,11 @@ impl Icon { &self.classes } + pub fn icon_name(&self) -> &OptionString { + &self.icon_name + } + pub fn font_size(&self) -> &FontSize { &self.font_size } - - pub fn icon_name(&self) -> &str { - self.icon_name.as_str() - } } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index ac096323..0c404944 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -16,9 +16,9 @@ pub enum ImageSize { #[rustfmt::skip] #[derive(Default)] pub struct Image { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, classes : OptionClasses, source : OptionString, size : ImageSize, @@ -84,6 +84,12 @@ impl Image { // Image BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -96,12 +102,6 @@ impl Image { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index c939cf0c..7177a082 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -3,12 +3,12 @@ use crate::prelude::*; #[rustfmt::skip] #[derive(Default)] pub struct Paragraph { + id : OptionId, weight : Weight, renderable: Renderable, - id : OptionId, classes : OptionClasses, font_size : FontSize, - stuff : ArcComponents, + stuff : AnyComponents, } impl_handle!(COMPONENT_BASE_PARAGRAPH for Paragraph); @@ -30,6 +30,11 @@ impl ComponentTrait for Paragraph { (self.renderable.check)(cx) } + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.classes + .alter_value(ClassesOp::AddFirst, self.font_size.to_string()); + } + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { p @@ -53,6 +58,12 @@ impl Paragraph { // Paragraph BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -65,12 +76,6 @@ impl Paragraph { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); @@ -79,28 +84,25 @@ impl Paragraph { #[fn_builder] pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.font_size.to_string()), - font_size.to_string(), - ); self.font_size = font_size; self } + #[rustfmt::skip] pub fn add_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self.stuff.alter_value(ArcAnyOp::Add(ArcAnyComponent::new(component))); self } + #[rustfmt::skip] pub fn add_translated(mut self, l10n: L10n) -> Self { - self.stuff - .alter(ArcOp::Add(ArcComponent::with(Translate::with(l10n)))); + self.stuff.alter_value(ArcAnyOp::Add(ArcAnyComponent::new(Translate::with(l10n)))); self } #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); + pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { + self.stuff.alter_value(op); self } @@ -114,7 +116,7 @@ impl Paragraph { &self.font_size } - pub fn components(&self) -> &ArcComponents { + pub fn components(&self) -> &AnyComponents { &self.stuff } } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 121af8ed..4102fb44 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -13,13 +13,13 @@ pub enum WrapperType { #[rustfmt::skip] #[derive(Default)] pub struct Wrapper { + id : OptionId, weight : Weight, renderable : Renderable, - id : OptionId, classes : OptionClasses, inner_classes: OptionClasses, wrapper_type : WrapperType, - stuff : ArcComponents, + stuff : AnyComponents, template : String, } @@ -118,6 +118,12 @@ impl Wrapper { // Wrapper BUILDER. + #[fn_builder] + pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { + self.id.alter_value(id); + self + } + #[fn_builder] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; @@ -130,12 +136,6 @@ impl Wrapper { self } - #[fn_builder] - pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { - self.id.alter_value(id); - self - } - #[fn_builder] pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); @@ -148,14 +148,15 @@ impl Wrapper { self } + #[rustfmt::skip] pub fn add_component(mut self, component: impl ComponentTrait) -> Self { - self.stuff.alter(ArcOp::Add(ArcComponent::with(component))); + self.stuff.alter_value(ArcAnyOp::Add(ArcAnyComponent::new(component))); self } #[fn_builder] - pub fn alter_components(&mut self, op: ArcOp) -> &mut Self { - self.stuff.alter(op); + pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { + self.stuff.alter_value(op); self } @@ -179,7 +180,7 @@ impl Wrapper { &self.wrapper_type } - pub fn components(&self) -> &ArcComponents { + pub fn components(&self) -> &AnyComponents { &self.stuff } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 16ad5279..e89942cc 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -39,6 +39,9 @@ pub trait ComponentTrait: ComponentBase + HasHandle + Send + Sync { true } + #[allow(unused_variables)] + fn setup_before_prepare(&mut self, cx: &mut Context) {} + #[allow(unused_variables)] fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::None @@ -48,6 +51,9 @@ pub trait ComponentTrait: ComponentBase + HasHandle + Send + Sync { impl<C: ComponentTrait> ComponentBase for C { fn render(&mut self, cx: &mut Context) -> Markup { if self.is_renderable(cx) { + // Comprueba el componente antes de prepararlo. + self.setup_before_prepare(cx); + // Acciones del tema antes de preparar el componente. cx.theme().before_prepare_component(self, cx); diff --git a/pagetop/static/base/css/buttons.css b/pagetop/static/base/css/buttons.css new file mode 100644 index 00000000..b1b2dea4 --- /dev/null +++ b/pagetop/static/base/css/buttons.css @@ -0,0 +1,1211 @@ +[class^="pt-button"] { + cursor: pointer; + text-align: center; + display: inline-block; + color: var(--pt-color--white); + background-color: transparent; + text-decoration: none; + border: 1px solid transparent; + border-radius: var(--pt-border-radius); + padding: var(--pt-gap-0-35) var(--pt-gap-0-75); + transition: background-color .15s ease-in-out; + white-space: nowrap; + user-select: none; +} +[class^="pt-button"] > span { + margin: 0 var(--pt-gap-0-15); +} + +.pt-button__link { + color: var(--pt-color--primary); +} + +.pt-button__primary { + background-color: var(--pt-color--primary); +} +.pt-button__primary:hover { + color: var(--pt-color--white); + background-color: var(--pt-color--primary-dark); +} +.pt-button__primary:active { + color: var(--pt-color--white); + background-color: var(--pt-color--primary-light); +} + + + +/* +.button strong { + color: inherit +} + +.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small { + height: 1.5em; + width: 1.5em +} + +.button .icon:first-child:not(:last-child) { + margin-left: calc(-.5em - 1px); + margin-right: .25em +} + +.button .icon:last-child:not(:first-child) { + margin-left: .25em; + margin-right: calc(-.5em - 1px) +} + +.button .icon:first-child:last-child { + margin-left: calc(-.5em - 1px); + margin-right: calc(-.5em - 1px) +} + +.button.is-hovered,.button:hover { + border-color: #b5b5b5; + color: #363636 +} + +.button.is-focused,.button:focus { + border-color: #485fc7; + color: #363636 +} + +.button.is-focused:not(:active),.button:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(72,95,199,.25) +} + +.button.is-active,.button:active { + border-color: #4a4a4a; + color: #363636 +} + +.button.is-text { + background-color: transparent; + border-color: transparent; + color: #4a4a4a; + text-decoration: underline +} + +.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover { + background-color: #f5f5f5; + color: #363636 +} + +.button.is-text.is-active,.button.is-text:active { + background-color: #e8e8e8; + color: #363636 +} + +.button.is-text[disabled],fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none +} + +.button.is-ghost { + background: 0 0; + border-color: transparent; + color: #485fc7; + text-decoration: none +} + +.button.is-ghost.is-hovered,.button.is-ghost:hover { + color: #485fc7; + text-decoration: underline +} + +.button.is-white { + background-color: #fff; + border-color: transparent; + color: #0a0a0a +} + +.button.is-white.is-hovered,.button.is-white:hover { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a +} + +.button.is-white.is-focused,.button.is-white:focus { + border-color: transparent; + color: #0a0a0a +} + +.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(255,255,255,.25) +} + +.button.is-white.is-active,.button.is-white:active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a +} + +.button.is-white[disabled],fieldset[disabled] .button.is-white { + background-color: #fff; + border-color: #fff; + box-shadow: none +} + +.button.is-white.is-inverted { + background-color: #0a0a0a; + color: #fff +} + +.button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover { + background-color: #000 +} + +.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: #fff +} + +.button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a!important +} + +.button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover { + background-color: #fff; + border-color: #fff; + color: #0a0a0a +} + +.button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after { + border-color: transparent transparent #0a0a0a #0a0a0a!important +} + +.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} + +.button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a +} + +.button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover { + background-color: #0a0a0a; + color: #fff +} + +.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a +} + +.button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: #fff +} + +.button.is-black.is-hovered,.button.is-black:hover { + background-color: #040404; + border-color: transparent; + color: #fff +} + +.button.is-black.is-focused,.button.is-black:focus { + border-color: transparent; + color: #fff +} + +.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(10,10,10,.25) +} + +.button.is-black.is-active,.button.is-black:active { + background-color: #000; + border-color: transparent; + color: #fff +} + +.button.is-black[disabled],fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + box-shadow: none +} + +.button.is-black.is-inverted { + background-color: #fff; + color: #0a0a0a +} + +.button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover { + background-color: #f2f2f2 +} + +.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0a0a0a +} + +.button.is-black.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a +} + +.button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff +} + +.button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a!important +} + +.button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a +} + +.button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover { + background-color: #fff; + color: #0a0a0a +} + +.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #0a0a0a #0a0a0a!important +} + +.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} + +.button.is-light { + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-light.is-hovered,.button.is-light:hover { + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-light.is-focused,.button.is-light:focus { + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(245,245,245,.25) +} + +.button.is-light.is-active,.button.is-light:active { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-light[disabled],fieldset[disabled] .button.is-light { + background-color: #f5f5f5; + border-color: #f5f5f5; + box-shadow: none +} + +.button.is-light.is-inverted { + background-color: rgba(0,0,0,.7); + color: #f5f5f5 +} + +.button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover { + background-color: rgba(0,0,0,.7) +} + +.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted { + background-color: rgba(0,0,0,.7); + border-color: transparent; + box-shadow: none; + color: #f5f5f5 +} + +.button.is-light.is-loading::after { + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important +} + +.button.is-light.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + color: #f5f5f5 +} + +.button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover { + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,.7) +} + +.button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent #f5f5f5 #f5f5f5!important +} + +.button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after { + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important +} + +.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined { + background-color: transparent; + border-color: #f5f5f5; + box-shadow: none; + color: #f5f5f5 +} + +.button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,.7); + color: rgba(0,0,0,.7) +} + +.button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover { + background-color: rgba(0,0,0,.7); + color: #f5f5f5 +} + +.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #f5f5f5 #f5f5f5!important +} + +.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,.7); + box-shadow: none; + color: rgba(0,0,0,.7) +} + +.button.is-dark { + background-color: #363636; + border-color: transparent; + color: #fff +} + +.button.is-dark.is-hovered,.button.is-dark:hover { + background-color: #2f2f2f; + border-color: transparent; + color: #fff +} + +.button.is-dark.is-focused,.button.is-dark:focus { + border-color: transparent; + color: #fff +} + +.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(54,54,54,.25) +} + +.button.is-dark.is-active,.button.is-dark:active { + background-color: #292929; + border-color: transparent; + color: #fff +} + +.button.is-dark[disabled],fieldset[disabled] .button.is-dark { + background-color: #363636; + border-color: #363636; + box-shadow: none +} + +.button.is-dark.is-inverted { + background-color: #fff; + color: #363636 +} + +.button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover { + background-color: #f2f2f2 +} + +.button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636 +} + +.button.is-dark.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636 +} + +.button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover { + background-color: #363636; + border-color: #363636; + color: #fff +} + +.button.is-dark.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636!important +} + +.button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636 +} + +.button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover { + background-color: #fff; + color: #363636 +} + +.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #363636 #363636!important +} + +.button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} +*/ +/* +.pt-button__primary[disabled],fieldset[disabled] .pt-button__primary { + background-color: #00d1b2; + border-color: #00d1b2; + box-shadow: none +} + +.pt-button__primary.is-inverted { + background-color: #fff; + color: #00d1b2 +} + +.pt-button__primary.is-inverted.is-hovered,.pt-button__primary.is-inverted:hover { + background-color: #f2f2f2 +} + +.pt-button__primary.is-inverted[disabled],fieldset[disabled] .pt-button__primary.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #00d1b2 +} + +.pt-button__primary.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.pt-button__primary.is-outlined { + background-color: transparent; + border-color: #00d1b2; + color: #00d1b2 +} + +.pt-button__primary.is-outlined.is-focused,.pt-button__primary.is-outlined.is-hovered,.pt-button__primary.is-outlined:focus,.pt-button__primary.is-outlined:hover { + background-color: #00d1b2; + border-color: #00d1b2; + color: #fff +} + +.pt-button__primary.is-outlined.is-loading::after { + border-color: transparent transparent #00d1b2 #00d1b2!important +} + +.pt-button__primary.is-outlined.is-loading.is-focused::after,.pt-button__primary.is-outlined.is-loading.is-hovered::after,.pt-button__primary.is-outlined.is-loading:focus::after,.pt-button__primary.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.pt-button__primary.is-outlined[disabled],fieldset[disabled] .pt-button__primary.is-outlined { + background-color: transparent; + border-color: #00d1b2; + box-shadow: none; + color: #00d1b2 +} + +.pt-button__primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.pt-button__primary.is-inverted.is-outlined.is-focused,.pt-button__primary.is-inverted.is-outlined.is-hovered,.pt-button__primary.is-inverted.is-outlined:focus,.pt-button__primary.is-inverted.is-outlined:hover { + background-color: #fff; + color: #00d1b2 +} + +.pt-button__primary.is-inverted.is-outlined.is-loading.is-focused::after,.pt-button__primary.is-inverted.is-outlined.is-loading.is-hovered::after,.pt-button__primary.is-inverted.is-outlined.is-loading:focus::after,.pt-button__primary.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #00d1b2 #00d1b2!important +} + +.pt-button__primary.is-inverted.is-outlined[disabled],fieldset[disabled] .pt-button__primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} + +.pt-button__primary.is-light { + background-color: #ebfffc; + color: #00947e +} + +.pt-button__primary.is-light.is-hovered,.pt-button__primary.is-light:hover { + background-color: #defffa; + border-color: transparent; + color: #00947e +} + +.pt-button__primary.is-light.is-active,.pt-button__primary.is-light:active { + background-color: #d1fff8; + border-color: transparent; + color: #00947e +} + +.button.is-link { + background-color: #485fc7; + border-color: transparent; + color: #fff +} + +.button.is-link.is-hovered,.button.is-link:hover { + background-color: #3e56c4; + border-color: transparent; + color: #fff +} + +.button.is-link.is-focused,.button.is-link:focus { + border-color: transparent; + color: #fff +} + +.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(72,95,199,.25) +} + +.button.is-link.is-active,.button.is-link:active { + background-color: #3a51bb; + border-color: transparent; + color: #fff +} + +.button.is-link[disabled],fieldset[disabled] .button.is-link { + background-color: #485fc7; + border-color: #485fc7; + box-shadow: none +} + +.button.is-link.is-inverted { + background-color: #fff; + color: #485fc7 +} + +.button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover { + background-color: #f2f2f2 +} + +.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #485fc7 +} + +.button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-link.is-outlined { + background-color: transparent; + border-color: #485fc7; + color: #485fc7 +} + +.button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover { + background-color: #485fc7; + border-color: #485fc7; + color: #fff +} + +.button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #485fc7 #485fc7!important +} + +.button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #485fc7; + box-shadow: none; + color: #485fc7 +} + +.button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover { + background-color: #fff; + color: #485fc7 +} + +.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #485fc7 #485fc7!important +} + +.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} + +.button.is-link.is-light { + background-color: #eff1fa; + color: #3850b7 +} + +.button.is-link.is-light.is-hovered,.button.is-link.is-light:hover { + background-color: #e6e9f7; + border-color: transparent; + color: #3850b7 +} + +.button.is-link.is-light.is-active,.button.is-link.is-light:active { + background-color: #dce0f4; + border-color: transparent; + color: #3850b7 +} + +.button.is-info { + background-color: #3e8ed0; + border-color: transparent; + color: #fff +} + +.button.is-info.is-hovered,.button.is-info:hover { + background-color: #3488ce; + border-color: transparent; + color: #fff +} + +.button.is-info.is-focused,.button.is-info:focus { + border-color: transparent; + color: #fff +} + +.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(62,142,208,.25) +} + +.button.is-info.is-active,.button.is-info:active { + background-color: #3082c5; + border-color: transparent; + color: #fff +} + +.button.is-info[disabled],fieldset[disabled] .button.is-info { + background-color: #3e8ed0; + border-color: #3e8ed0; + box-shadow: none +} + +.button.is-info.is-inverted { + background-color: #fff; + color: #3e8ed0 +} + +.button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover { + background-color: #f2f2f2 +} + +.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3e8ed0 +} + +.button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-info.is-outlined { + background-color: transparent; + border-color: #3e8ed0; + color: #3e8ed0 +} + +.button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover { + background-color: #3e8ed0; + border-color: #3e8ed0; + color: #fff +} + +.button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #3e8ed0 #3e8ed0!important +} + +.button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #3e8ed0; + box-shadow: none; + color: #3e8ed0 +} + +.button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover { + background-color: #fff; + color: #3e8ed0 +} + +.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #3e8ed0 #3e8ed0!important +} + +.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} + +.button.is-info.is-light { + background-color: #eff5fb; + color: #296fa8 +} + +.button.is-info.is-light.is-hovered,.button.is-info.is-light:hover { + background-color: #e4eff9; + border-color: transparent; + color: #296fa8 +} + +.button.is-info.is-light.is-active,.button.is-info.is-light:active { + background-color: #dae9f6; + border-color: transparent; + color: #296fa8 +} + +.button.is-success { + background-color: #48c78e; + border-color: transparent; + color: #fff +} + +.button.is-success.is-hovered,.button.is-success:hover { + background-color: #3ec487; + border-color: transparent; + color: #fff +} + +.button.is-success.is-focused,.button.is-success:focus { + border-color: transparent; + color: #fff +} + +.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(72,199,142,.25) +} + +.button.is-success.is-active,.button.is-success:active { + background-color: #3abb81; + border-color: transparent; + color: #fff +} + +.button.is-success[disabled],fieldset[disabled] .button.is-success { + background-color: #48c78e; + border-color: #48c78e; + box-shadow: none +} + +.button.is-success.is-inverted { + background-color: #fff; + color: #48c78e +} + +.button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover { + background-color: #f2f2f2 +} + +.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #48c78e +} + +.button.is-success.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-success.is-outlined { + background-color: transparent; + border-color: #48c78e; + color: #48c78e +} + +.button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover { + background-color: #48c78e; + border-color: #48c78e; + color: #fff +} + +.button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #48c78e #48c78e!important +} + +.button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #48c78e; + box-shadow: none; + color: #48c78e +} + +.button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover { + background-color: #fff; + color: #48c78e +} + +.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #48c78e #48c78e!important +} + +.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} + +.button.is-success.is-light { + background-color: #effaf5; + color: #257953 +} + +.button.is-success.is-light.is-hovered,.button.is-success.is-light:hover { + background-color: #e6f7ef; + border-color: transparent; + color: #257953 +} + +.button.is-success.is-light.is-active,.button.is-success.is-light:active { + background-color: #dcf4e9; + border-color: transparent; + color: #257953 +} + +.button.is-warning { + background-color: #ffe08a; + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-warning.is-hovered,.button.is-warning:hover { + background-color: #ffdc7d; + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-warning.is-focused,.button.is-warning:focus { + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(255,224,138,.25) +} + +.button.is-warning.is-active,.button.is-warning:active { + background-color: #ffd970; + border-color: transparent; + color: rgba(0,0,0,.7) +} + +.button.is-warning[disabled],fieldset[disabled] .button.is-warning { + background-color: #ffe08a; + border-color: #ffe08a; + box-shadow: none +} + +.button.is-warning.is-inverted { + background-color: rgba(0,0,0,.7); + color: #ffe08a +} + +.button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover { + background-color: rgba(0,0,0,.7) +} + +.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0,0,0,.7); + border-color: transparent; + box-shadow: none; + color: #ffe08a +} + +.button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important +} + +.button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffe08a; + color: #ffe08a +} + +.button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover { + background-color: #ffe08a; + border-color: #ffe08a; + color: rgba(0,0,0,.7) +} + +.button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ffe08a #ffe08a!important +} + +.button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after { + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important +} + +.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ffe08a; + box-shadow: none; + color: #ffe08a +} + +.button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,.7); + color: rgba(0,0,0,.7) +} + +.button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover { + background-color: rgba(0,0,0,.7); + color: #ffe08a +} + +.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #ffe08a #ffe08a!important +} + +.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0,0,0,.7); + box-shadow: none; + color: rgba(0,0,0,.7) +} + +.button.is-warning.is-light { + background-color: #fffaeb; + color: #946c00 +} + +.button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover { + background-color: #fff6de; + border-color: transparent; + color: #946c00 +} + +.button.is-warning.is-light.is-active,.button.is-warning.is-light:active { + background-color: #fff3d1; + border-color: transparent; + color: #946c00 +} + +.button.is-danger { + background-color: #f14668; + border-color: transparent; + color: #fff +} + +.button.is-danger.is-hovered,.button.is-danger:hover { + background-color: #f03a5f; + border-color: transparent; + color: #fff +} + +.button.is-danger.is-focused,.button.is-danger:focus { + border-color: transparent; + color: #fff +} + +.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active) { + box-shadow: 0 0 0 .125em rgba(241,70,104,.25) +} + +.button.is-danger.is-active,.button.is-danger:active { + background-color: #ef2e55; + border-color: transparent; + color: #fff +} + +.button.is-danger[disabled],fieldset[disabled] .button.is-danger { + background-color: #f14668; + border-color: #f14668; + box-shadow: none +} + +.button.is-danger.is-inverted { + background-color: #fff; + color: #f14668 +} + +.button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover { + background-color: #f2f2f2 +} + +.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #f14668 +} + +.button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + color: #f14668 +} + +.button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover { + background-color: #f14668; + border-color: #f14668; + color: #fff +} + +.button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #f14668 #f14668!important +} + +.button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important +} + +.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + box-shadow: none; + color: #f14668 +} + +.button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff +} + +.button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover { + background-color: #fff; + color: #f14668 +} + +.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #f14668 #f14668!important +} + +.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff +} + +.button.is-danger.is-light { + background-color: #feecf0; + color: #cc0f35 +} + +.button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover { + background-color: #fde0e6; + border-color: transparent; + color: #cc0f35 +} + +.button.is-danger.is-light.is-active,.button.is-danger.is-light:active { + background-color: #fcd4dc; + border-color: transparent; + color: #cc0f35 +} +*/ \ No newline at end of file diff --git a/pagetop/static/base/css/inception.css b/pagetop/static/base/css/inception.css index 29fb2c3a..8c474b84 100644 --- a/pagetop/static/base/css/inception.css +++ b/pagetop/static/base/css/inception.css @@ -18,7 +18,7 @@ body { h1, h2, h3, h4, h5, h6 { margin-top: 0; - margin-bottom: var(--pt-gap-0-9); + margin-bottom: var(--pt-gap-0-35); font-weight: var(--pt-fw--bold); line-height: var(--pt-lh--header); } @@ -58,7 +58,18 @@ h6 { p { margin-top: 0; - margin-bottom: var(--pt-gap-0-9); + margin-bottom: var(--pt-gap-0-75); +} + +a { + color: var(--pt-color--primary); + transition: color .15s ease-in-out; +} +a:hover { + color: var(--pt-color--primary-dark); +} +a:active { + color: var(--pt-color--primary-light); } /* LAYOUT */ diff --git a/pagetop/static/base/css/looks.css b/pagetop/static/base/css/looks.css index 24a3534c..c2f6c00d 100644 --- a/pagetop/static/base/css/looks.css +++ b/pagetop/static/base/css/looks.css @@ -96,7 +96,7 @@ font-size: calc(var(--pt-fs--x3l) * 1.2); } .pt-heading__subtitle { - margin-top: calc(-1 * var(--pt-gap-0-75)); + margin-top: calc(-1 * var(--pt-gap-0-5)); } /* LG - Applies <= 992px */ @media screen and (max-width: 62em) { diff --git a/pagetop/static/base/css/root.css b/pagetop/static/base/css/root.css index c9c403df..03c9efe2 100644 --- a/pagetop/static/base/css/root.css +++ b/pagetop/static/base/css/root.css @@ -15,10 +15,12 @@ --pt-fs--xs: 0.75rem; --pt-fs--x2s: 0.5625rem; --pt-fs--x3s: 0.375rem; + /* Font weight */ --pt-fw--light: 300; --pt-fw--base: 400; --pt-fw--bold: 500; + /* Line height */ --pt-lh--base: 1.5; --pt-lh--header: 1.2; @@ -33,7 +35,7 @@ --line-height-s: 1.125rem; --max-bg-color: 98.125rem; */ - --pt-gap: 1.125rem; + --pt-gap: 1.125em; /* --content-left: 5.625rem; --site-header-height-wide: var(--pt-gap10); @@ -82,10 +84,11 @@ } */ :root { + --pt-gap-0-15: calc(0.15 * var(--pt-gap)); --pt-gap-0-25: calc(0.25 * var(--pt-gap)); + --pt-gap-0-35: calc(0.35 * var(--pt-gap)); --pt-gap-0-5: calc(0.5 * var(--pt-gap)); --pt-gap-0-75: calc(0.75 * var(--pt-gap)); - --pt-gap-0-9: calc(0.9 * var(--pt-gap)); --pt-gap-1-5: calc(1.5 * var(--pt-gap)); --pt-gap-2: calc(2 * var(--pt-gap)); --pt-gap-2-5: calc(2.5 * var(--pt-gap)); @@ -100,27 +103,24 @@ --pt-gap-11: calc(11 * var(--pt-gap)); --pt-gap-12: calc(12 * var(--pt-gap)); - --pt-color--primary-hue: 202; - --pt-color--primary-saturation: 79%; - --pt-color--primary-lightness: 50; - --pt-color--primary-30: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) - (0.36 * var(--pt-color--primary-lightness))))); - --pt-color--primary-40: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) - (0.24 * var(--pt-color--primary-lightness))))); - --pt-color--primary-50: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * var(--pt-color--primary-lightness))); - --pt-color--primary-60: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) + (0.24 * (100 - var(--pt-color--primary-lightness)))))); - --pt-color--primary-80: hsl(var(--pt-color--primary-hue),var(--pt-color--primary-saturation),calc(1% * (var(--pt-color--primary-lightness) + (0.85 * (100 - var(--pt-color--primary-lightness)))))); + --pt-color--primary-hue: 216; + --pt-color--primary-sat: 98%; + --pt-color--primary-light: hsl(var(--pt-color--primary-hue), var(--pt-color--primary-sat), 60%); + --pt-color--primary-dark: hsl(var(--pt-color--primary-hue), var(--pt-color--primary-sat), 40%); + --pt-color--primary: hsl(var(--pt-color--primary-hue), var(--pt-color--primary-sat), 50%); --pt-color--gray-hue: 201; - --pt-color--gray-saturation: 15%; - --pt-color--gray-5: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),5%); - --pt-color--gray-10: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),11%); - --pt-color--gray-20: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),20%); - --pt-color--gray-45: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),44%); - --pt-color--gray-60: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),57%); - --pt-color--gray-65: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),63%); - --pt-color--gray-70: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),72%); - --pt-color--gray-90: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),88%); - --pt-color--gray-95: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),93%); - --pt-color--gray-100: hsl(var(--pt-color--gray-hue),var(--pt-color--gray-saturation),97%); + --pt-color--gray-sat: 15%; + --pt-color--gray-5: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 5%); + --pt-color--gray-10: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat) ,11%); + --pt-color--gray-20: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat),20%); + --pt-color--gray-45: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 44%); + --pt-color--gray-60: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 57%); + --pt-color--gray-65: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 63%); + --pt-color--gray-70: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 72%); + --pt-color--gray-90: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 88%); + --pt-color--gray-95: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 93%); + --pt-color--gray-100: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 97%); --pt-color--white: #fff; --pt-color--bg: #fafafa; @@ -143,9 +143,9 @@ --header-height-wide-when-fixed: calc(6 * var(--pt-gap)); --mobile-nav-width: 31.25rem; */ - --pt-border-radius: 0.1875rem; - + --pt-border-radius: 0.375rem; + /* Menu component */ --pt-menu--color-bg: var(--pt-color--gray-100); --pt-menu--color-highlight: #e91e63; --pt-menu--color-border: rgba(0, 0, 0, 0.1); From 7ac639b21df76053e94c568d42f264e1b58ef27f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 18:24:08 +0100 Subject: [PATCH 612/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/flex/item.rs | 4 ++-- pagetop/src/base/component/heading.rs | 10 +++++----- pagetop/src/base/component/paragraph.rs | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 1abe91a1..35808918 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -35,6 +35,7 @@ impl ComponentTrait for Item { (self.renderable.check)(cx) } + #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { self.item_classes.alter_value( ClassesOp::AddFirst, @@ -48,8 +49,7 @@ impl ComponentTrait for Item { ] .join(" "), ); - self.inner_classes - .alter_value(ClassesOp::AddFirst, "pt-flex__item-inner"); + self.inner_classes.alter_value(ClassesOp::AddFirst, "pt-flex__item-inner"); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index b2233a8f..e4ccbbe5 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -69,6 +69,11 @@ impl ComponentTrait for Heading { (self.renderable.check)(cx) } + #[rustfmt::skip] + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.classes.alter_value(ClassesOp::Add, self.display().to_string()); + } + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let id = self.id(); let classes = self.classes().get(); @@ -159,13 +164,8 @@ impl Heading { self } - #[rustfmt::skip] #[fn_builder] pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { - self.classes.alter_value( - ClassesOp::Replace(self.display.to_string()), - display.to_string(), - ); self.display = display; self } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 7177a082..caa41443 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -30,9 +30,9 @@ impl ComponentTrait for Paragraph { (self.renderable.check)(cx) } + #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.classes - .alter_value(ClassesOp::AddFirst, self.font_size.to_string()); + self.classes.alter_value(ClassesOp::AddFirst, self.font_size.to_string()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { From 9deed1739e03201466bd0070d48909d258f2d439 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:03:07 +0100 Subject: [PATCH 613/853] =?UTF-8?q?=F0=9F=94=96=20[macros]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml index 67f42aae..a49b5564 100644 --- a/pagetop-macros/Cargo.toml +++ b/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.5" +version = "0.0.6" edition = "2021" authors = [ @@ -19,7 +19,7 @@ proc-macro = true [dependencies] concat-string = "1.0.1" proc-macro2 = "1.0" -proc-macro-crate = "1.3.1" +proc-macro-crate = "2.0.0" proc-macro-error = "1.0.4" quote = "1.0" -syn = { version = "1.0", features = ["full"] } +syn = { version = "2.0", features = ["full"] } From 296437532c1b521a612ca7455c0b6521fb4a171a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:03:23 +0100 Subject: [PATCH 614/853] =?UTF-8?q?=F0=9F=94=96=20[build]=20release=20deve?= =?UTF-8?q?lopment=20version=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-build/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-build/Cargo.toml b/pagetop-build/Cargo.toml index 7721f413..ac0b50b7 100644 --- a/pagetop-build/Cargo.toml +++ b/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From a0049d8babb9a110acdce8a4def68bb829411a54 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:08:28 +0100 Subject: [PATCH 615/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.47?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index f77b7824..ded5f7f1 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.46" +version = "0.0.47" edition = "2021" authors = [ @@ -42,13 +42,13 @@ once_cell = "1.18.0" paste = "1.0.14" substring = "1.4.5" term_size = "0.3.2" -toml = "0.8.5" +toml = "0.8.8" url = "2.4.1" tracing = "0.1.40" -tracing-appender = "0.2.2" -tracing-subscriber = { version = "0.3.17", features = ["json", "env-filter"] } -tracing-actix-web = "0.7.8" +tracing-appender = "0.2.3" +tracing-subscriber = { version = "0.3.18", features = ["json", "env-filter"] } +tracing-actix-web = "0.7.9" fluent-templates = "0.8.0" unic-langid = { version = "0.9.1", features = ["macros"] } From 9d2191de002f5d51a569c7f4b0cac93f5c8004e3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:09:15 +0100 Subject: [PATCH 616/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index e7fe7e87..dab0ce49 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.11" +version = "0.0.12" edition = "2021" authors = [ From 455c64862d2d10c3ced5dc26b9b30971a07f14cf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:10:06 +0100 Subject: [PATCH 617/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index 3539ea14..97b244d5 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.10" +version = "0.0.11" edition = "2021" authors = [ From e0799dd1744035ac769284bde1343b41958a4db4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:10:47 +0100 Subject: [PATCH 618/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 5066e693..037cc507 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.10" +version = "0.0.11" edition = "2021" authors = [ From 89547770fd68b869f8d63364a98f175a930be67e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:12:39 +0100 Subject: [PATCH 619/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20release=20deve?= =?UTF-8?q?lopment=20version=200.0.15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index db9f5cc6..d35482e9 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.14" +version = "0.0.15" edition = "2021" authors = [ From 0692dcf31dd47852079cae896a3471385396358b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:13:32 +0100 Subject: [PATCH 620/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index 473239e4..e12ebd1c 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.12" +version = "0.0.13" edition = "2021" authors = [ From ced06b0b62ca27493338425a4cd5f006bd4dfb09 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Nov 2023 21:14:08 +0100 Subject: [PATCH 621/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 019802aa..670eef41 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.14" +version = "0.0.15" edition = "2021" authors = [ From 3be7b23d0a7e98037f2f0526eeebe793bc0f94f7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 16 Nov 2023 18:13:36 +0100 Subject: [PATCH 622/853] =?UTF-8?q?=F0=9F=94=A5=20Drop=20Default,=20always?= =?UTF-8?q?=20refer=20existing=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/arc_any.rs | 81 +++++++++------------ pagetop/src/core/component/arc_typed.rs | 97 +++++++++++++------------ 2 files changed, 84 insertions(+), 94 deletions(-) diff --git a/pagetop/src/core/component/arc_any.rs b/pagetop/src/core/component/arc_any.rs index 680a368b..4b8759cd 100644 --- a/pagetop/src/core/component/arc_any.rs +++ b/pagetop/src/core/component/arc_any.rs @@ -1,29 +1,12 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; -use crate::{fn_builder, impl_handle, Handle, Weight}; +use crate::{fn_builder, Handle, Weight}; -use std::sync::{Arc, RwLock, RwLockReadGuard}; - -#[derive(Default)] -struct ComponentNull; - -impl_handle!(COMPONENT_NULL for ComponentNull); - -impl ComponentTrait for ComponentNull { - fn new() -> Self { - ComponentNull::default() - } -} +use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; #[derive(Clone)] pub struct ArcAnyComponent(Arc<RwLock<dyn ComponentTrait>>); -impl Default for ArcAnyComponent { - fn default() -> Self { - ArcAnyComponent(Arc::new(RwLock::new(ComponentNull))) - } -} - impl ArcAnyComponent { pub fn new(component: impl ComponentTrait) -> Self { ArcAnyComponent(Arc::new(RwLock::new(component))) @@ -41,16 +24,8 @@ impl ArcAnyComponent { self.0.read().unwrap() } - pub(crate) fn handle(&self) -> Handle { - self.0.read().unwrap().handle() - } - - pub(crate) fn id(&self) -> Option<String> { - self.0.read().unwrap().id() - } - - pub(crate) fn weight(&self) -> Weight { - self.0.read().unwrap().weight() + pub fn get_mut(&self) -> RwLockWriteGuard<'_, dyn ComponentTrait> { + self.0.write().unwrap() } // ArcAnyComponent RENDER. @@ -58,6 +33,20 @@ impl ArcAnyComponent { pub fn render(&self, cx: &mut Context) -> Markup { self.0.write().unwrap().render(cx) } + + // ArcAnyComponent HELPERS. + + fn handle(&self) -> Handle { + self.0.read().unwrap().handle() + } + + fn id(&self) -> String { + self.0.read().unwrap().id().unwrap_or_default() + } + + fn weight(&self) -> Weight { + self.0.read().unwrap().weight() + } } // ************************************************************************************************* @@ -94,27 +83,23 @@ impl AnyComponents { pub fn alter_value(&mut self, op: ArcAnyOp) -> &mut Self { match op { ArcAnyOp::Add(arc) => self.0.push(arc), - ArcAnyOp::AddAfterId(id, arc) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index + 1, arc), - _ => self.0.push(arc), - } - } - ArcAnyOp::AddBeforeId(id, arc) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index, arc), - _ => self.0.insert(0, arc), - } - } + ArcAnyOp::AddAfterId(id, arc) => match self.0.iter().position(|c| c.id() == id) { + Some(index) => self.0.insert(index + 1, arc), + _ => self.0.push(arc), + }, + ArcAnyOp::AddBeforeId(id, arc) => match self.0.iter().position(|c| c.id() == id) { + Some(index) => self.0.insert(index, arc), + _ => self.0.insert(0, arc), + }, ArcAnyOp::AddFirst(arc) => self.0.insert(0, arc), ArcAnyOp::RemoveById(id) => { - if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + if let Some(index) = self.0.iter().position(|c| c.id() == id) { self.0.remove(index); } } ArcAnyOp::ReplaceById(id, arc) => { for c in self.0.iter_mut() { - if c.id().as_deref() == Some(id) { + if c.id() == id { *c = arc; break; } @@ -131,12 +116,14 @@ impl AnyComponents { self.0.is_empty() } - pub fn get_by_id(&self, id: &'static str) -> Option<&ArcAnyComponent> { - self.0.iter().find(|&c| c.id().as_deref() == Some(id)) + pub fn get_by_id(&self, id: impl Into<String>) -> Option<&ArcAnyComponent> { + let id = id.into(); + self.0.iter().find(|c| c.id() == id) } - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcAnyComponent> { - self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) + pub fn iter_by_id(&self, id: impl Into<String>) -> impl Iterator<Item = &ArcAnyComponent> { + let id = id.into(); + self.0.iter().filter(move |&c| c.id() == id) } pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcAnyComponent> { diff --git a/pagetop/src/core/component/arc_typed.rs b/pagetop/src/core/component/arc_typed.rs index e2e66e56..7bce8c98 100644 --- a/pagetop/src/core/component/arc_typed.rs +++ b/pagetop/src/core/component/arc_typed.rs @@ -2,44 +2,35 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; use crate::{fn_builder, Handle, Weight}; -use std::sync::{Arc, RwLock, RwLockReadGuard}; +use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; -#[derive(Default)] -pub struct ArcTypedComponent<T: ComponentTrait>(Arc<RwLock<T>>); +pub struct ArcTypedComponent<C: ComponentTrait>(Arc<RwLock<C>>); -impl<T: ComponentTrait> Clone for ArcTypedComponent<T> { +impl<C: ComponentTrait> Clone for ArcTypedComponent<C> { fn clone(&self) -> Self { Self(self.0.clone()) } } -impl<T: ComponentTrait> ArcTypedComponent<T> { - pub fn new(component: T) -> Self { +impl<C: ComponentTrait> ArcTypedComponent<C> { + pub fn new(component: C) -> Self { ArcTypedComponent(Arc::new(RwLock::new(component))) } // ArcTypedComponent BUILDER. - pub fn set(&mut self, component: T) { + pub fn set(&mut self, component: C) { self.0 = Arc::new(RwLock::new(component)); } // ArcTypedComponent GETTERS. - pub fn get(&self) -> RwLockReadGuard<'_, T> { + pub fn get(&self) -> RwLockReadGuard<'_, C> { self.0.read().unwrap() } - pub(crate) fn handle(&self) -> Handle { - self.0.read().unwrap().handle() - } - - pub(crate) fn id(&self) -> Option<String> { - self.0.read().unwrap().id() - } - - pub(crate) fn weight(&self) -> Weight { - self.0.read().unwrap().weight() + pub fn get_mut(&self) -> RwLockWriteGuard<'_, C> { + self.0.write().unwrap() } // ArcTypedComponent RENDER. @@ -47,55 +38,65 @@ impl<T: ComponentTrait> ArcTypedComponent<T> { pub fn render(&self, cx: &mut Context) -> Markup { self.0.write().unwrap().render(cx) } + + // ArcTypedComponent HELPERS. + + fn handle(&self) -> Handle { + self.0.read().unwrap().handle() + } + + fn id(&self) -> String { + self.0.read().unwrap().id().unwrap_or_default() + } + + fn weight(&self) -> Weight { + self.0.read().unwrap().weight() + } } // ************************************************************************************************* -pub enum ArcTypedOp<T: ComponentTrait + Default> { - Add(ArcTypedComponent<T>), - AddAfterId(&'static str, ArcTypedComponent<T>), - AddBeforeId(&'static str, ArcTypedComponent<T>), - AddFirst(ArcTypedComponent<T>), +pub enum ArcTypedOp<C: ComponentTrait> { + Add(ArcTypedComponent<C>), + AddAfterId(&'static str, ArcTypedComponent<C>), + AddBeforeId(&'static str, ArcTypedComponent<C>), + AddFirst(ArcTypedComponent<C>), RemoveById(&'static str), - ReplaceById(&'static str, ArcTypedComponent<T>), + ReplaceById(&'static str, ArcTypedComponent<C>), Reset, } #[derive(Clone, Default)] -pub struct TypedComponents<T: ComponentTrait + Default>(Vec<ArcTypedComponent<T>>); +pub struct TypedComponents<C: ComponentTrait>(Vec<ArcTypedComponent<C>>); -impl<T: ComponentTrait + Default> TypedComponents<T> { - pub fn new(arc: ArcTypedComponent<T>) -> Self { +impl<C: ComponentTrait + Default> TypedComponents<C> { + pub fn new(arc: ArcTypedComponent<C>) -> Self { TypedComponents::default().with_value(ArcTypedOp::Add(arc)) } // TypedComponents BUILDER. #[fn_builder] - pub fn alter_value(&mut self, op: ArcTypedOp<T>) -> &mut Self { + pub fn alter_value(&mut self, op: ArcTypedOp<C>) -> &mut Self { match op { ArcTypedOp::Add(one) => self.0.push(one), - ArcTypedOp::AddAfterId(id, one) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index + 1, one), - _ => self.0.push(one), - } - } - ArcTypedOp::AddBeforeId(id, one) => { - match self.0.iter().position(|c| c.id().as_deref() == Some(id)) { - Some(index) => self.0.insert(index, one), - _ => self.0.insert(0, one), - } - } + ArcTypedOp::AddAfterId(id, one) => match self.0.iter().position(|c| c.id() == id) { + Some(index) => self.0.insert(index + 1, one), + _ => self.0.push(one), + }, + ArcTypedOp::AddBeforeId(id, one) => match self.0.iter().position(|c| c.id() == id) { + Some(index) => self.0.insert(index, one), + _ => self.0.insert(0, one), + }, ArcTypedOp::AddFirst(one) => self.0.insert(0, one), ArcTypedOp::RemoveById(id) => { - if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == Some(id)) { + if let Some(index) = self.0.iter().position(|c| c.id() == id) { self.0.remove(index); } } ArcTypedOp::ReplaceById(id, one) => { for c in self.0.iter_mut() { - if c.id().as_deref() == Some(id) { + if c.id() == id { *c = one; break; } @@ -112,15 +113,17 @@ impl<T: ComponentTrait + Default> TypedComponents<T> { self.0.is_empty() } - pub fn get_by_id(&self, id: &'static str) -> Option<&ArcTypedComponent<T>> { - self.0.iter().find(|&c| c.id().as_deref() == Some(id)) + pub fn get_by_id(&self, id: impl Into<String>) -> Option<&ArcTypedComponent<C>> { + let id = id.into(); + self.0.iter().find(|&c| c.id() == id) } - pub fn iter_by_id(&self, id: &'static str) -> impl Iterator<Item = &ArcTypedComponent<T>> { - self.0.iter().filter(|&c| c.id().as_deref() == Some(id)) + pub fn iter_by_id(&self, id: impl Into<String>) -> impl Iterator<Item = &ArcTypedComponent<C>> { + let id = id.into(); + self.0.iter().filter(move |&c| c.id() == id) } - pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcTypedComponent<T>> { + pub fn iter_by_handle(&self, handle: Handle) -> impl Iterator<Item = &ArcTypedComponent<C>> { self.0.iter().filter(move |&c| c.handle() == handle) } From 571586e5876b6e5b993c211977c91a8101a00eef Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 16 Nov 2023 18:16:49 +0100 Subject: [PATCH 623/853] =?UTF-8?q?=F0=9F=9A=A7=20Review=20optional=20argu?= =?UTF-8?q?ments=20for=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/html.rs | 3 ++ pagetop/src/html/opt_component.rs | 45 ++++++++++++++++++++++++++++++ pagetop/src/html/opt_translated.rs | 10 +++---- 3 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 pagetop/src/html/opt_component.rs diff --git a/pagetop/src/html.rs b/pagetop/src/html.rs index 5a2bab3d..298fd41d 100644 --- a/pagetop/src/html.rs +++ b/pagetop/src/html.rs @@ -28,6 +28,9 @@ pub use opt_translated::OptionTranslated; mod opt_classes; pub use opt_classes::{ClassesOp, OptionClasses}; +mod opt_component; +pub use opt_component::OptionComponent; + pub mod unit; pub enum PrepareMarkup { diff --git a/pagetop/src/html/opt_component.rs b/pagetop/src/html/opt_component.rs new file mode 100644 index 00000000..059f2e3e --- /dev/null +++ b/pagetop/src/html/opt_component.rs @@ -0,0 +1,45 @@ +use crate::core::component::{ArcTypedComponent, ComponentTrait, Context}; +use crate::fn_builder; +use crate::html::{html, Markup}; + +pub struct OptionComponent<C: ComponentTrait>(Option<ArcTypedComponent<C>>); + +impl<C: ComponentTrait> Default for OptionComponent<C> { + fn default() -> Self { + OptionComponent(None) + } +} + +impl<C: ComponentTrait> OptionComponent<C> { + pub fn new(component: C) -> Self { + OptionComponent::default().with_value(Some(component)) + } + + // OptionComponent BUILDER. + + #[fn_builder] + pub fn alter_value(&mut self, component: Option<C>) -> &mut Self { + if let Some(component) = component { + self.0 = Some(ArcTypedComponent::new(component)); + } else { + self.0 = None; + } + self + } + + // OptionComponent GETTERS. + + pub fn get(&self) -> Option<ArcTypedComponent<C>> { + if let Some(value) = &self.0 { + return Some(value.clone()); + } + None + } + + pub fn render(&self, cx: &mut Context) -> Markup { + match &self.0 { + Some(component) => component.render(cx), + _ => html! {}, + } + } +} diff --git a/pagetop/src/html/opt_translated.rs b/pagetop/src/html/opt_translated.rs index 396fd364..c2424e9e 100644 --- a/pagetop/src/html/opt_translated.rs +++ b/pagetop/src/html/opt_translated.rs @@ -1,5 +1,5 @@ use crate::fn_builder; -use crate::html::Markup; +use crate::html::{html, Markup}; use crate::locale::{L10n, LanguageIdentifier}; #[derive(Default)] @@ -27,10 +27,10 @@ impl OptionTranslated { None } - pub fn escaped(&self, langid: &LanguageIdentifier) -> Option<Markup> { - if let Some(value) = &self.0 { - return Some(value.escaped(langid)); + pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { + match &self.0 { + Some(value) => value.escaped(langid), + _ => html! {}, } - None } } From c2d0c2a80d45350a7eb6e5f57eb5ad6bad8b8ed1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 16 Nov 2023 18:21:20 +0100 Subject: [PATCH 624/853] =?UTF-8?q?=F0=9F=9A=A7=20Ensure=20block=20has=20r?= =?UTF-8?q?enderable=20content?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/block.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b7925e40..ab23a726 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -31,24 +31,23 @@ impl ComponentTrait for Block { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.classes.alter_value(ClassesOp::AddFirst, "block"); + self.classes.alter_value(ClassesOp::AddFirst, "pt-block"); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - if self.components().is_empty() { - return PrepareMarkup::None; + let block_body = self.components().render(cx); + if !block_body.is_empty() { + let id = cx.required_id::<Block>(self.id()); + return PrepareMarkup::With(html! { + div id=(id) class=[self.classes().get()] { + @if let Some(title) = self.title().using(cx.langid()) { + h2 class="pt-block__title" { (title) } + } + div class="pt-block__body" { (block_body) } + } + }); } - let id = cx.required_id::<Block>(self.id()); - PrepareMarkup::With(html! { - div id=(id) class=[self.classes().get()] { - @if let Some(title) = self.title().using(cx.langid()) { - h2 class="block-title" { (title) } - } - div class="block-body" { - (self.components().render(cx)) - } - } - }) + PrepareMarkup::None } } From e25cc16859f32e8be6be69897f17c4a118170e84 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 16 Nov 2023 19:38:17 +0100 Subject: [PATCH 625/853] =?UTF-8?q?=F0=9F=9A=A7=20Simplifies=20translated?= =?UTF-8?q?=20text=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/module/definition.rs | 2 +- pagetop/src/html/opt_translated.rs | 19 +++++++------------ pagetop/src/locale.rs | 11 +++++------ 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index 775b4b5a..a353c430 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -19,7 +19,7 @@ pub trait ModuleTrait: HasHandle + ModuleBase + Send + Sync { } fn description(&self) -> L10n { - L10n::default() + L10n::none() } fn theme(&self) -> Option<ThemeRef> { diff --git a/pagetop/src/html/opt_translated.rs b/pagetop/src/html/opt_translated.rs index c2424e9e..722db440 100644 --- a/pagetop/src/html/opt_translated.rs +++ b/pagetop/src/html/opt_translated.rs @@ -1,36 +1,31 @@ use crate::fn_builder; -use crate::html::{html, Markup}; +use crate::html::Markup; use crate::locale::{L10n, LanguageIdentifier}; #[derive(Default)] -pub struct OptionTranslated(Option<L10n>); + +pub struct OptionTranslated(L10n); impl OptionTranslated { pub fn new(value: L10n) -> Self { - OptionTranslated::default().with_value(value) + OptionTranslated(value) } // OptionTranslated BUILDER. #[fn_builder] pub fn alter_value(&mut self, value: L10n) -> &mut Self { - self.0 = Some(value); + self.0 = value; self } // OptionTranslated GETTERS. pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { - if let Some(value) = &self.0 { - return value.using(langid); - } - None + self.0.using(langid) } pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { - match &self.0 { - Some(value) => value.escaped(langid), - _ => html! {}, - } + self.0.escaped(langid) } } diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 81520c98..de2e1b8d 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -185,14 +185,13 @@ pub struct L10n { } impl L10n { + pub fn none() -> Self { + L10n::default() + } + pub fn n(text: impl Into<String>) -> Self { - let text = text.into(); L10n { - op: if text.trim().is_empty() { - L10nOp::None - } else { - L10nOp::Text(text) - }, + op: L10nOp::Text(text.into()), ..Default::default() } } From 5daa84283d2f67dfed309c4e5e14f72cc60b9b62 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 18 Nov 2023 07:31:45 +0100 Subject: [PATCH 626/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Swa?= =?UTF-8?q?p=20Default=20for=20more=20versatile=20SmartDefault?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 1 + pagetop/src/base/component.rs | 6 +++--- pagetop/src/base/component/block.rs | 2 +- pagetop/src/base/component/branding.rs | 20 ++++---------------- pagetop/src/base/component/button.rs | 8 +++----- pagetop/src/base/component/flex.rs | 20 ++++++++++---------- pagetop/src/base/component/flex/container.rs | 2 +- pagetop/src/base/component/flex/item.rs | 2 +- pagetop/src/base/component/form/button.rs | 4 ++-- pagetop/src/base/component/form/date.rs | 2 +- pagetop/src/base/component/form/form_main.rs | 4 ++-- pagetop/src/base/component/form/hidden.rs | 2 +- pagetop/src/base/component/form/input.rs | 4 ++-- pagetop/src/base/component/heading.rs | 6 +++--- pagetop/src/base/component/html.rs | 2 +- pagetop/src/base/component/icon.rs | 2 +- pagetop/src/base/component/image.rs | 4 ++-- pagetop/src/base/component/menu/element.rs | 4 ++-- pagetop/src/base/component/menu/group.rs | 2 +- pagetop/src/base/component/menu/item.rs | 4 ++-- pagetop/src/base/component/menu/megamenu.rs | 2 +- pagetop/src/base/component/menu/menu_main.rs | 2 +- pagetop/src/base/component/menu/submenu.rs | 2 +- pagetop/src/base/component/paragraph.rs | 2 +- pagetop/src/base/component/powered_by.rs | 2 +- pagetop/src/base/component/translate.rs | 2 +- pagetop/src/base/component/wrapper.rs | 4 ++-- pagetop/src/core/action/list.rs | 3 ++- pagetop/src/core/component/renderable.rs | 11 +++-------- pagetop/src/core/theme/regions.rs | 4 ++-- pagetop/src/html/assets.rs | 4 ++-- pagetop/src/html/assets/headscript.rs | 4 ++-- pagetop/src/html/assets/headstyles.rs | 4 ++-- pagetop/src/html/assets/javascript.rs | 4 ++-- pagetop/src/html/assets/stylesheet.rs | 4 ++-- pagetop/src/html/favicon.rs | 3 ++- pagetop/src/html/opt_classes.rs | 4 ++-- pagetop/src/html/opt_id.rs | 4 ++-- pagetop/src/html/opt_name.rs | 4 ++-- pagetop/src/html/opt_string.rs | 4 ++-- pagetop/src/html/opt_translated.rs | 5 ++--- pagetop/src/html/unit.rs | 4 ++-- pagetop/src/lib.rs | 6 +++++- pagetop/src/locale.rs | 6 +++--- pagetop/src/prelude.rs | 4 ++-- 45 files changed, 93 insertions(+), 106 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index ded5f7f1..5c6b9530 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -40,6 +40,7 @@ itoa = "1.0.9" nom = "7.1.3" once_cell = "1.18.0" paste = "1.0.14" +smart-default = "0.7.1" substring = "1.4.5" term_size = "0.3.2" toml = "0.8.8" diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index ca3f5594..2064d0b4 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -1,6 +1,6 @@ use crate::core::component::{Context, ContextOp}; use crate::html::{JavaScript, StyleSheet}; -use crate::Weight; +use crate::{SmartDefault, Weight}; // Context parameters. pub const PARAM_BASE_WEIGHT: &str = "base.weight"; @@ -57,7 +57,7 @@ pub(crate) fn add_base_assets(cx: &mut Context) { // ************************************************************************************************* #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub enum BreakPoint { #[default] None, /* Does not apply. Rest initially assume 1 pixel = 0.0625em */ @@ -88,7 +88,7 @@ impl ToString for BreakPoint { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum FontSize { ExtraLarge, XxLarge, diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index ab23a726..976d3c96 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Block { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index d5149d25..f14430d0 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -1,31 +1,19 @@ use crate::prelude::*; #[rustfmt::skip] +#[derive(SmartDefault)] pub struct Branding { id : OptionId, weight : Weight, renderable: Renderable, + #[default(_code = "config::SETTINGS.app.name.to_owned()")] app_name : String, slogan : OptionTranslated, - logo : ArcTypedComponent<Image>, + logo : OptionComponent<Image>, + #[default(_code = "|_| \"/\"")] frontpage : FnContextualPath, } -#[rustfmt::skip] -impl Default for Branding { - fn default() -> Self { - Branding { - id : OptionId::default(), - weight : Weight::default(), - renderable: Renderable::default(), - app_name : config::SETTINGS.app.name.to_owned(), - slogan : OptionTranslated::default(), - logo : ArcTypedComponent::<Image>::default(), - frontpage : |_| "/", - } - } -} - impl_handle!(COMPONENT_BASE_BRANDING for Branding); impl ComponentTrait for Branding { diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index 88e5917d..57d5f6dc 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub enum ButtonType { #[default] Link, @@ -17,7 +17,7 @@ impl ToString for ButtonType { } } -#[derive(Default)] +#[derive(SmartDefault)] pub enum ButtonTarget { #[default] Default, @@ -27,10 +27,8 @@ pub enum ButtonTarget { Context(String), } -type ButtonIcon = ArcTypedComponent<Icon>; - #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Button { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/flex.rs b/pagetop/src/base/component/flex.rs index 2eb2a78f..29bed8ec 100644 --- a/pagetop/src/base/component/flex.rs +++ b/pagetop/src/base/component/flex.rs @@ -7,7 +7,7 @@ use crate::prelude::*; // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum Direction { #[default] Default, @@ -42,7 +42,7 @@ impl ToString for Direction { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum WrapAlign { #[default] Default, @@ -65,7 +65,7 @@ impl ToString for WrapAlign { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum ContentAlign { #[default] Default, @@ -94,7 +94,7 @@ impl ToString for ContentAlign { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum ContentJustify { #[default] Default, @@ -123,7 +123,7 @@ impl ToString for ContentJustify { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum ItemAlign { #[default] Default, @@ -150,7 +150,7 @@ impl ToString for ItemAlign { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum Gap { #[default] Default, @@ -175,7 +175,7 @@ impl ToString for Gap { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum ItemGrow { #[default] Default, @@ -210,7 +210,7 @@ impl ToString for ItemGrow { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum ItemShrink { #[default] Default, @@ -245,7 +245,7 @@ impl ToString for ItemShrink { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum ItemSize { #[default] Default, @@ -284,7 +284,7 @@ impl ToString for ItemSize { // ************************************************************************************************* -#[derive(Default)] +#[derive(SmartDefault)] pub enum ItemOffset { #[default] Default, diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index 83912eec..e4c04de8 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Container { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 35808918..b0131090 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Item { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index e64c3fc1..a24f290f 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub enum ButtonType { #[default] Button, @@ -20,7 +20,7 @@ impl ToString for ButtonType { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Button { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 08b47e40..7893c5a6 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Date { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index e0ee24fa..6565d22e 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub enum FormMethod { #[default] Post, @@ -8,7 +8,7 @@ pub enum FormMethod { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Form { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 9a809295..f774317c 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Hidden { weight: Weight, name : OptionName, diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 4e8ec54e..b5d906d7 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub enum InputType { #[default] Textfield, @@ -12,7 +12,7 @@ pub enum InputType { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Input { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index e4ccbbe5..181e9b6a 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub enum HeadingType { #[default] H1, @@ -11,7 +11,7 @@ pub enum HeadingType { H6, } -#[derive(Default)] +#[derive(SmartDefault)] pub enum HeadingDisplay { ExtraLarge, XxLarge, @@ -39,7 +39,7 @@ impl ToString for HeadingDisplay { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Heading { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 7105e715..0d7e04f8 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub struct Html(Markup); impl_handle!(COMPONENT_BASE_HTML for Html); diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 8257fdfe..ffb028e7 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Icon { weight : Weight, renderable: Renderable, diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 0c404944..360c01e8 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -3,7 +3,7 @@ use crate::prelude::*; const IMG_FLUID: &str = "pt-img__fluid"; const IMG_FIXED: &str = "pt-img__fixed"; -#[derive(Default)] +#[derive(SmartDefault)] pub enum ImageSize { #[default] Auto, @@ -14,7 +14,7 @@ pub enum ImageSize { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Image { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index c7f6181d..c01c0f49 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -5,7 +5,7 @@ use super::Submenu; type Content = ArcTypedComponent<Html>; type SubmenuItems = ArcTypedComponent<Submenu>; -#[derive(Default)] +#[derive(SmartDefault)] pub enum ElementType { #[default] Void, @@ -16,7 +16,7 @@ pub enum ElementType { // Element. #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Element { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index de88ccb2..906cb638 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::Element; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Group { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 13b10e9e..ff50696a 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -7,7 +7,7 @@ type Content = ArcTypedComponent<Html>; type SubmenuItems = ArcTypedComponent<Submenu>; type MegamenuGroups = ArcTypedComponent<Megamenu>; -#[derive(Default)] +#[derive(SmartDefault)] pub enum ItemType { #[default] Void, @@ -22,7 +22,7 @@ pub enum ItemType { // Item. #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Item { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index c7a1783f..7ec224d9 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::Group; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Megamenu { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index ac053b67..a670be8a 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::Item; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Menu { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index d8743e6a..caf3f1ec 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use super::Item; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Submenu { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index caa41443..2ff74fd7 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Paragraph { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 4e87dd70..0f0991b5 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -11,7 +11,7 @@ pub enum PoweredByLogo { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct PoweredBy { weight : Weight, renderable: Renderable, diff --git a/pagetop/src/base/component/translate.rs b/pagetop/src/base/component/translate.rs index dd41c215..b32b1b64 100644 --- a/pagetop/src/base/component/translate.rs +++ b/pagetop/src/base/component/translate.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub struct Translate(L10n); impl_handle!(COMPONENT_BASE_TRANSLATE for Translate); diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 4102fb44..25fa7eff 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -#[derive(Default)] +#[derive(SmartDefault)] pub enum WrapperType { #[default] Container, @@ -11,7 +11,7 @@ pub enum WrapperType { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct Wrapper { id : OptionId, weight : Weight, diff --git a/pagetop/src/core/action/list.rs b/pagetop/src/core/action/list.rs index 12a75ec8..617e9b95 100644 --- a/pagetop/src/core/action/list.rs +++ b/pagetop/src/core/action/list.rs @@ -1,10 +1,11 @@ use crate::core::action::ActionTrait; +use crate::SmartDefault; use std::sync::{Arc, RwLock}; pub type Action = Box<dyn ActionTrait>; -#[derive(Default)] +#[derive(SmartDefault)] pub struct ActionsList(Arc<RwLock<Vec<Action>>>); impl ActionsList { diff --git a/pagetop/src/core/component/renderable.rs b/pagetop/src/core/component/renderable.rs index 27d630eb..2b0dcb68 100644 --- a/pagetop/src/core/component/renderable.rs +++ b/pagetop/src/core/component/renderable.rs @@ -1,19 +1,14 @@ use crate::core::component::Context; +use crate::SmartDefault; pub type FnIsRenderable = fn(cx: &Context) -> bool; +#[derive(SmartDefault)] pub struct Renderable { + #[default(_code = "render_always")] pub check: FnIsRenderable, } -impl Default for Renderable { - fn default() -> Self { - Renderable { - check: render_always, - } - } -} - fn render_always(_cx: &Context) -> bool { true } diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 548185bd..688a6553 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -1,6 +1,6 @@ use crate::core::component::{AnyComponents, ArcAnyComponent, ArcAnyOp}; use crate::core::theme::ThemeRef; -use crate::{Handle, LazyStatic}; +use crate::{Handle, LazyStatic, SmartDefault}; use std::collections::HashMap; use std::sync::RwLock; @@ -11,7 +11,7 @@ static THEME_REGIONS: LazyStatic<RwLock<HashMap<Handle, ComponentsRegions>>> = static COMMON_REGIONS: LazyStatic<RwLock<ComponentsRegions>> = LazyStatic::new(|| RwLock::new(ComponentsRegions::default())); -#[derive(Default)] +#[derive(SmartDefault)] pub struct ComponentsRegions(HashMap<&'static str, AnyComponents>); impl ComponentsRegions { diff --git a/pagetop/src/html/assets.rs b/pagetop/src/html/assets.rs index 92e91d9f..503fbcf9 100644 --- a/pagetop/src/html/assets.rs +++ b/pagetop/src/html/assets.rs @@ -4,7 +4,7 @@ pub mod javascript; pub mod stylesheet; use crate::html::{html, Markup}; -use crate::Weight; +use crate::{SmartDefault, Weight}; pub trait AssetsTrait { fn path(&self) -> &str; @@ -14,7 +14,7 @@ pub trait AssetsTrait { fn prepare(&self) -> Markup; } -#[derive(Default)] +#[derive(SmartDefault)] pub struct Assets<T>(Vec<T>); impl<T: AssetsTrait> Assets<T> { diff --git a/pagetop/src/html/assets/headscript.rs b/pagetop/src/html/assets/headscript.rs index 51c649ce..ec7d6390 100644 --- a/pagetop/src/html/assets/headscript.rs +++ b/pagetop/src/html/assets/headscript.rs @@ -1,9 +1,9 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; -use crate::Weight; +use crate::{SmartDefault, Weight}; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct HeadScript { path : String, code : String, diff --git a/pagetop/src/html/assets/headstyles.rs b/pagetop/src/html/assets/headstyles.rs index 1a00430e..ecdd01e9 100644 --- a/pagetop/src/html/assets/headstyles.rs +++ b/pagetop/src/html/assets/headstyles.rs @@ -1,9 +1,9 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; -use crate::Weight; +use crate::{SmartDefault, Weight}; #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct HeadStyles { path : String, styles: String, diff --git a/pagetop/src/html/assets/javascript.rs b/pagetop/src/html/assets/javascript.rs index 526ab412..dbe54d43 100644 --- a/pagetop/src/html/assets/javascript.rs +++ b/pagetop/src/html/assets/javascript.rs @@ -1,6 +1,6 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; -use crate::Weight; +use crate::{SmartDefault, Weight}; #[derive(Default, Eq, PartialEq)] pub enum ModeJS { @@ -11,7 +11,7 @@ pub enum ModeJS { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct JavaScript { path : String, prefix : &'static str, diff --git a/pagetop/src/html/assets/stylesheet.rs b/pagetop/src/html/assets/stylesheet.rs index b670f21e..3974010c 100644 --- a/pagetop/src/html/assets/stylesheet.rs +++ b/pagetop/src/html/assets/stylesheet.rs @@ -1,6 +1,6 @@ use crate::html::assets::AssetsTrait; use crate::html::{html, Markup}; -use crate::Weight; +use crate::{SmartDefault, Weight}; pub enum TargetMedia { Default, @@ -10,7 +10,7 @@ pub enum TargetMedia { } #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub struct StyleSheet { path : String, prefix : &'static str, diff --git a/pagetop/src/html/favicon.rs b/pagetop/src/html/favicon.rs index 651b476b..490e98ce 100644 --- a/pagetop/src/html/favicon.rs +++ b/pagetop/src/html/favicon.rs @@ -1,6 +1,7 @@ use crate::html::{html, Markup}; +use crate::SmartDefault; -#[derive(Default)] +#[derive(SmartDefault)] pub struct Favicon(Vec<Markup>); impl Favicon { diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index e92ccf3e..acddcf50 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -9,7 +9,7 @@ //! **OptionClasses** assumes that the order of the classes is irrelevant //! (<https://stackoverflow.com/a/1321712>), and duplicate classes will not be allowed. -use crate::fn_builder; +use crate::{fn_builder, SmartDefault}; pub enum ClassesOp { Add, @@ -20,7 +20,7 @@ pub enum ClassesOp { Clear, } -#[derive(Default)] +#[derive(SmartDefault)] pub struct OptionClasses(Vec<String>); impl OptionClasses { diff --git a/pagetop/src/html/opt_id.rs b/pagetop/src/html/opt_id.rs index 22cd8e69..2022f16d 100644 --- a/pagetop/src/html/opt_id.rs +++ b/pagetop/src/html/opt_id.rs @@ -1,6 +1,6 @@ -use crate::fn_builder; +use crate::{fn_builder, SmartDefault}; -#[derive(Default)] +#[derive(SmartDefault)] pub struct OptionId(Option<String>); impl OptionId { diff --git a/pagetop/src/html/opt_name.rs b/pagetop/src/html/opt_name.rs index d253e7e3..84c665a8 100644 --- a/pagetop/src/html/opt_name.rs +++ b/pagetop/src/html/opt_name.rs @@ -1,6 +1,6 @@ -use crate::fn_builder; +use crate::{fn_builder, SmartDefault}; -#[derive(Default)] +#[derive(SmartDefault)] pub struct OptionName(Option<String>); impl OptionName { diff --git a/pagetop/src/html/opt_string.rs b/pagetop/src/html/opt_string.rs index d81abdb0..c1f55ebd 100644 --- a/pagetop/src/html/opt_string.rs +++ b/pagetop/src/html/opt_string.rs @@ -1,6 +1,6 @@ -use crate::fn_builder; +use crate::{fn_builder, SmartDefault}; -#[derive(Default)] +#[derive(SmartDefault)] pub struct OptionString(Option<String>); impl OptionString { diff --git a/pagetop/src/html/opt_translated.rs b/pagetop/src/html/opt_translated.rs index 722db440..400170fc 100644 --- a/pagetop/src/html/opt_translated.rs +++ b/pagetop/src/html/opt_translated.rs @@ -1,9 +1,8 @@ -use crate::fn_builder; use crate::html::Markup; use crate::locale::{L10n, LanguageIdentifier}; +use crate::{fn_builder, SmartDefault}; -#[derive(Default)] - +#[derive(SmartDefault)] pub struct OptionTranslated(L10n); impl OptionTranslated { diff --git a/pagetop/src/html/unit.rs b/pagetop/src/html/unit.rs index 44371fa3..1c3bdffe 100644 --- a/pagetop/src/html/unit.rs +++ b/pagetop/src/html/unit.rs @@ -1,4 +1,4 @@ -use crate::concat_string; +use crate::{concat_string, SmartDefault}; // About pixels: Pixels (px) are relative to the viewing device. For low-dpi devices, 1px is one // device pixel (dot) of the display. For printers and high resolution screens 1px implies multiple @@ -10,7 +10,7 @@ use crate::concat_string; // About viewport: If the browser window size is 50cm wide, 1vw = 0.5cm. #[rustfmt::skip] -#[derive(Default)] +#[derive(SmartDefault)] pub enum Value { #[default] None, diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 43772bbe..0192aa7c 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -101,7 +101,7 @@ #![cfg_attr(docsrs, feature(doc_cfg))] // ************************************************************************************************* -// RE-EXPORTED MACROS. +// RE-EXPORTED MACROS AND DERIVES. // ************************************************************************************************* pub use concat_string::concat_string; @@ -109,6 +109,10 @@ pub use concat_string::concat_string; /// Enables flexible identifier concatenation in macros, allowing new items with pasted identifiers. pub use paste::paste; +/// Custom derive for automatically implementing the [Default](std::default::Default) trait with +/// customized default values. +pub use smart_default::SmartDefault; + pub use pagetop_macros::{fn_builder, main, test}; // ************************************************************************************************* diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index de2e1b8d..00833845 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -88,7 +88,7 @@ //! ``` use crate::html::{Markup, PreEscaped}; -use crate::{config, kv, LazyStatic, LOCALES_PAGETOP}; +use crate::{config, kv, LazyStatic, SmartDefault, LOCALES_PAGETOP}; pub use fluent_templates; pub use unic_langid::LanguageIdentifier; @@ -169,7 +169,7 @@ macro_rules! static_locales { }; } -#[derive(Default)] +#[derive(SmartDefault)] enum L10nOp { #[default] None, @@ -177,7 +177,7 @@ enum L10nOp { Translate(String), } -#[derive(Default)] +#[derive(SmartDefault)] pub struct L10n { op: L10nOp, locales: Option<&'static Locales>, diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 1ac38762..7f517184 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,7 +1,7 @@ //! The PageTop Prelude. -// Re-exported macros. -pub use crate::{concat_string, fn_builder, main, paste, test}; +// Re-exported macros and derives. +pub use crate::{concat_string, fn_builder, main, paste, test, SmartDefault}; // Global. pub use crate::{Handle, HasHandle, HashMapResources, LazyStatic, Weight}; From 37f873131ba4139d873f44dcb6618f083045743c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 18 Nov 2023 08:24:58 +0100 Subject: [PATCH 627/853] =?UTF-8?q?=F0=9F=93=9D=20Doc=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 7 +++---- pagetop/src/lib.rs | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 298295dc..41bc1c7b 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -40,7 +40,6 @@ mostrar en el terminal un rótulo de presentación con el nombre de la aplicaci # 🎨 Icono -El monstruo sonriente de Frankenstein es una divertida creación de -[Webalys](https://www.iconfinder.com/webalys). Puede encontrarse en su colección -[Nasty Icons](https://www.iconfinder.com/iconsets/nasty) disponible en -[ICONFINDER](https://www.iconfinder.com). \ No newline at end of file +"La criatura" sonriente es una divertida creación de [Webalys](https://www.iconfinder.com/webalys). +Puede encontrarse en su colección [Nasty Icons](https://www.iconfinder.com/iconsets/nasty) +disponible en [ICONFINDER](https://www.iconfinder.com). \ No newline at end of file diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 0192aa7c..7ae2e736 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -44,10 +44,10 @@ //! ```rust //! use pagetop::prelude::*; //! -//! impl_handle!(APP_HELLO_WORLD for HelloWorld); -//! //! struct HelloWorld; //! +//! impl_handle!(APP_HELLO_WORLD for HelloWorld); +//! //! impl ModuleTrait for HelloWorld { //! fn handle(&self) -> Handle { //! APP_HELLO_WORLD From ed495121ddf508e9ba6b1eed051461e59ac4cfb9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 18 Nov 2023 08:27:40 +0100 Subject: [PATCH 628/853] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20component=20refere?= =?UTF-8?q?nce=20unwrap()=20issues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 242 ++++++++++++++--------- pagetop-bulmix/src/lib.rs | 218 ++++++++++++-------- pagetop/src/core/component/definition.rs | 8 +- 3 files changed, 293 insertions(+), 175 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 543bca46..4f165f11 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -84,102 +84,166 @@ impl ThemeTrait for Bootsier { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { COMPONENT_BASE_ICON => { - let i = component_as_mut::<Icon>(component); - match i.font_size() { - FontSize::ExtraLarge => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-1"); - } - FontSize::XxLarge => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-2"); - } - FontSize::XLarge => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-3"); - } - FontSize::Large => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-4"); - } - FontSize::Medium => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "fs-5"); - } - _ => {} - }; + if let Some(icon) = component_as_mut::<Icon>(component) { + match icon.font_size() { + FontSize::ExtraLarge => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "fs-1", + ); + } + FontSize::XxLarge => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "fs-2", + ); + } + FontSize::XLarge => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "fs-3", + ); + } + FontSize::Large => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "fs-4", + ); + } + FontSize::Medium => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "fs-5", + ); + } + _ => {} + }; + } } COMPONENT_BASE_BUTTON => { - let a = component_as_mut::<Button>(component); - match a.font_size() { - FontSize::ExtraLarge => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-1"); - } - FontSize::XxLarge => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-2"); - } - FontSize::XLarge => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-3"); - } - FontSize::Large => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-4"); - } - FontSize::Medium => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "fs-5"); - } - _ => {} - }; - match a.button_type() { - ButtonType::Link => { - a.alter_classes( - ClassesOp::Replace(a.button_type().to_string()), - "btn btn-link", - ); - } - ButtonType::Primary => { - a.alter_classes( - ClassesOp::Replace(a.button_type().to_string()), - "btn btn-primary", - ); - } + if let Some(button) = component_as_mut::<Button>(component) { + match button.font_size() { + FontSize::ExtraLarge => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "fs-1", + ); + } + FontSize::XxLarge => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "fs-2", + ); + } + FontSize::XLarge => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "fs-3", + ); + } + FontSize::Large => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "fs-4", + ); + } + FontSize::Medium => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "fs-5", + ); + } + _ => {} + }; + match button.button_type() { + ButtonType::Link => { + button.alter_classes( + ClassesOp::Replace(button.button_type().to_string()), + "btn btn-link", + ); + } + ButtonType::Primary => { + button.alter_classes( + ClassesOp::Replace(button.button_type().to_string()), + "btn btn-primary", + ); + } + }; } } COMPONENT_BASE_HEADING => { - let h = component_as_mut::<Heading>(component); - match h.display() { - HeadingDisplay::ExtraLarge => { - h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-1"); - } - HeadingDisplay::XxLarge => { - h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-2"); - } - HeadingDisplay::XLarge => { - h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-3"); - } - HeadingDisplay::Large => { - h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-4"); - } - HeadingDisplay::Medium => { - h.alter_classes(ClassesOp::Replace(h.display().to_string()), "display-5"); - } - _ => {} - }; + if let Some(heading) = component_as_mut::<Heading>(component) { + match heading.display() { + HeadingDisplay::ExtraLarge => { + heading.alter_classes( + ClassesOp::Replace(heading.display().to_string()), + "display-1", + ); + } + HeadingDisplay::XxLarge => { + heading.alter_classes( + ClassesOp::Replace(heading.display().to_string()), + "display-2", + ); + } + HeadingDisplay::XLarge => { + heading.alter_classes( + ClassesOp::Replace(heading.display().to_string()), + "display-3", + ); + } + HeadingDisplay::Large => { + heading.alter_classes( + ClassesOp::Replace(heading.display().to_string()), + "display-4", + ); + } + HeadingDisplay::Medium => { + heading.alter_classes( + ClassesOp::Replace(heading.display().to_string()), + "display-5", + ); + } + _ => {} + }; + } } COMPONENT_BASE_PARAGRAPH => { - let p = component_as_mut::<Paragraph>(component); - match p.font_size() { - FontSize::ExtraLarge => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-1"); - } - FontSize::XxLarge => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-2"); - } - FontSize::XLarge => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-3"); - } - FontSize::Large => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-4"); - } - FontSize::Medium => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "fs-5"); - } - _ => {} - }; + if let Some(paragraph) = component_as_mut::<Paragraph>(component) { + match paragraph.font_size() { + FontSize::ExtraLarge => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "fs-1", + ); + } + FontSize::XxLarge => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "fs-2", + ); + } + FontSize::XLarge => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "fs-3", + ); + } + FontSize::Large => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "fs-4", + ); + } + FontSize::Medium => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "fs-5", + ); + } + _ => {} + }; + } } _ => {} } diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index ba50dd68..369a9a97 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -33,91 +33,141 @@ impl ThemeTrait for Bulmix { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { COMPONENT_BASE_ICON => { - let i = component_as_mut::<Icon>(component); - match i.font_size() { - FontSize::ExtraLarge => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-1"); - } - FontSize::XxLarge => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-2"); - } - FontSize::XLarge => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-3"); - } - FontSize::Large => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-4"); - } - FontSize::Medium => { - i.alter_classes(ClassesOp::Replace(i.font_size().to_string()), "is-size-5"); - } - _ => {} - }; + if let Some(icon) = component_as_mut::<Icon>(component) { + match icon.font_size() { + FontSize::ExtraLarge => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "is-size-1", + ); + } + FontSize::XxLarge => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "is-size-2", + ); + } + FontSize::XLarge => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "is-size-3", + ); + } + FontSize::Large => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "is-size-4", + ); + } + FontSize::Medium => { + icon.alter_classes( + ClassesOp::Replace(icon.font_size().to_string()), + "is-size-5", + ); + } + _ => {} + }; + } } COMPONENT_BASE_BUTTON => { - let a = component_as_mut::<Button>(component); - match a.font_size() { - FontSize::ExtraLarge => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-1"); - } - FontSize::XxLarge => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-2"); - } - FontSize::XLarge => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-3"); - } - FontSize::Large => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-4"); - } - FontSize::Medium => { - a.alter_classes(ClassesOp::Replace(a.font_size().to_string()), "is-size-5"); - } - _ => {} - }; - match a.button_type() { - ButtonType::Link => { - a.alter_classes( - ClassesOp::Replace(a.button_type().to_string()), - "button is-text", - ); - } - ButtonType::Primary => { - a.alter_classes( - ClassesOp::Replace(a.button_type().to_string()), - "button is-primary", - ); - } + if let Some(button) = component_as_mut::<Button>(component) { + match button.font_size() { + FontSize::ExtraLarge => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "is-size-1", + ); + } + FontSize::XxLarge => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "is-size-2", + ); + } + FontSize::XLarge => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "is-size-3", + ); + } + FontSize::Large => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "is-size-4", + ); + } + FontSize::Medium => { + button.alter_classes( + ClassesOp::Replace(button.font_size().to_string()), + "is-size-5", + ); + } + _ => {} + }; + match button.button_type() { + ButtonType::Link => { + button.alter_classes( + ClassesOp::Replace(button.button_type().to_string()), + "button is-text", + ); + } + ButtonType::Primary => { + button.alter_classes( + ClassesOp::Replace(button.button_type().to_string()), + "button is-primary", + ); + } + }; } } COMPONENT_BASE_HEADING => { - let h = component_as_mut::<Heading>(component); - match h.display() { - HeadingDisplay::Subtitle => { - h.alter_classes(ClassesOp::Replace(h.display().to_string()), "subtitle") - } - _ => h.alter_classes(ClassesOp::Add, "title"), - }; + if let Some(heading) = component_as_mut::<Heading>(component) { + match heading.display() { + HeadingDisplay::Subtitle => heading.alter_classes( + ClassesOp::Replace(heading.display().to_string()), + "subtitle", + ), + _ => heading.alter_classes(ClassesOp::Add, "title"), + }; + } } COMPONENT_BASE_PARAGRAPH => { - let p = component_as_mut::<Paragraph>(component); - p.alter_classes(ClassesOp::Add, "block"); - match p.font_size() { - FontSize::ExtraLarge => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-1"); - } - FontSize::XxLarge => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-2"); - } - FontSize::XLarge => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-3"); - } - FontSize::Large => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-4"); - } - FontSize::Medium => { - p.alter_classes(ClassesOp::Replace(p.font_size().to_string()), "is-size-5"); - } - _ => {} - }; + if let Some(paragraph) = component_as_mut::<Paragraph>(component) { + paragraph.alter_classes(ClassesOp::Add, "block"); + match paragraph.font_size() { + FontSize::ExtraLarge => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "is-size-1", + ); + } + FontSize::XxLarge => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "is-size-2", + ); + } + FontSize::XLarge => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "is-size-3", + ); + } + FontSize::Large => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "is-size-4", + ); + } + FontSize::Medium => { + paragraph.alter_classes( + ClassesOp::Replace(paragraph.font_size().to_string()), + "is-size-5", + ); + } + _ => {} + }; + } } _ => {} } @@ -130,11 +180,15 @@ impl ThemeTrait for Bulmix { ) -> Option<Markup> { match component.handle() { COMPONENT_BASE_ICON => { - let icon = component_as_ref::<Icon>(component); - match icon.icon_name().get() { - None => None, - _ => Some(html! { span class="icon" { i class=[icon.classes().get()] {} } }), + if let Some(icon) = component_as_ref::<Icon>(component) { + return match icon.icon_name().get() { + None => None, + _ => { + Some(html! { span class="icon" { i class=[icon.classes().get()] {} } }) + } + }; } + None } _ => None, } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index e89942cc..da7a59be 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -97,10 +97,10 @@ impl<C: ComponentTrait> ComponentBase for C { } } -pub fn component_as_ref<C: ComponentTrait>(component: &dyn ComponentTrait) -> &C { - component.as_ref_any().downcast_ref::<C>().unwrap() +pub fn component_as_ref<C: ComponentTrait>(component: &dyn ComponentTrait) -> Option<&C> { + component.as_ref_any().downcast_ref::<C>() } -pub fn component_as_mut<C: ComponentTrait>(component: &mut dyn ComponentTrait) -> &mut C { - component.as_mut_any().downcast_mut::<C>().unwrap() +pub fn component_as_mut<C: ComponentTrait>(component: &mut dyn ComponentTrait) -> Option<&mut C> { + component.as_mut_any().downcast_mut::<C>() } From 04286f1875b05519b6f56484178ba05e7f286ea5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 00:20:38 +0100 Subject: [PATCH 629/853] =?UTF-8?q?=E2=9C=A8=20Add=20new=20helper=20trait?= =?UTF-8?q?=20for=20components'=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 128 +++++-------------- pagetop-bulmix/src/lib.rs | 122 +++++------------- pagetop/src/base/component/block.rs | 23 ++-- pagetop/src/base/component/button.rs | 26 ++-- pagetop/src/base/component/flex/container.rs | 24 ++-- pagetop/src/base/component/flex/item.rs | 30 ++--- pagetop/src/base/component/form/button.rs | 25 ++-- pagetop/src/base/component/form/date.rs | 21 +-- pagetop/src/base/component/form/form_main.rs | 21 +-- pagetop/src/base/component/form/input.rs | 25 ++-- pagetop/src/base/component/heading.rs | 23 ++-- pagetop/src/base/component/icon.rs | 27 ++-- pagetop/src/base/component/image.rs | 21 +-- pagetop/src/base/component/paragraph.rs | 24 ++-- pagetop/src/base/component/wrapper.rs | 21 +-- pagetop/src/core/component.rs | 3 + pagetop/src/core/component/classes.rs | 60 +++++++++ pagetop/src/html/opt_classes.rs | 11 +- 18 files changed, 294 insertions(+), 341 deletions(-) create mode 100644 pagetop/src/core/component/classes.rs diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 4f165f11..7a45a904 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -84,162 +84,96 @@ impl ThemeTrait for Bootsier { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { COMPONENT_BASE_ICON => { - if let Some(icon) = component_as_mut::<Icon>(component) { - match icon.font_size() { + if let Some(i) = component_as_mut::<Icon>(component) { + match i.font_size() { FontSize::ExtraLarge => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "fs-1", - ); + i.replace_classes(i.font_size().to_string(), "fs-1"); } FontSize::XxLarge => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "fs-2", - ); + i.replace_classes(i.font_size().to_string(), "fs-2"); } FontSize::XLarge => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "fs-3", - ); + i.replace_classes(i.font_size().to_string(), "fs-3"); } FontSize::Large => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "fs-4", - ); + i.replace_classes(i.font_size().to_string(), "fs-4"); } FontSize::Medium => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "fs-5", - ); + i.replace_classes(i.font_size().to_string(), "fs-5"); } _ => {} }; } } COMPONENT_BASE_BUTTON => { - if let Some(button) = component_as_mut::<Button>(component) { - match button.font_size() { + if let Some(b) = component_as_mut::<Button>(component) { + match b.font_size() { FontSize::ExtraLarge => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "fs-1", - ); + b.replace_classes(b.font_size().to_string(), "fs-1"); } FontSize::XxLarge => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "fs-2", - ); + b.replace_classes(b.font_size().to_string(), "fs-2"); } FontSize::XLarge => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "fs-3", - ); + b.replace_classes(b.font_size().to_string(), "fs-3"); } FontSize::Large => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "fs-4", - ); + b.replace_classes(b.font_size().to_string(), "fs-4"); } FontSize::Medium => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "fs-5", - ); + b.replace_classes(b.font_size().to_string(), "fs-5"); } _ => {} }; - match button.button_type() { + match b.button_type() { ButtonType::Link => { - button.alter_classes( - ClassesOp::Replace(button.button_type().to_string()), - "btn btn-link", - ); + b.replace_classes(b.button_type().to_string(), "btn btn-link"); } ButtonType::Primary => { - button.alter_classes( - ClassesOp::Replace(button.button_type().to_string()), - "btn btn-primary", - ); + b.replace_classes(b.button_type().to_string(), "btn btn-primary"); } }; } } COMPONENT_BASE_HEADING => { - if let Some(heading) = component_as_mut::<Heading>(component) { - match heading.display() { + if let Some(h) = component_as_mut::<Heading>(component) { + match h.display() { HeadingDisplay::ExtraLarge => { - heading.alter_classes( - ClassesOp::Replace(heading.display().to_string()), - "display-1", - ); + h.replace_classes(h.display().to_string(), "display-1"); } HeadingDisplay::XxLarge => { - heading.alter_classes( - ClassesOp::Replace(heading.display().to_string()), - "display-2", - ); + h.replace_classes(h.display().to_string(), "display-2"); } HeadingDisplay::XLarge => { - heading.alter_classes( - ClassesOp::Replace(heading.display().to_string()), - "display-3", - ); + h.replace_classes(h.display().to_string(), "display-3"); } HeadingDisplay::Large => { - heading.alter_classes( - ClassesOp::Replace(heading.display().to_string()), - "display-4", - ); + h.replace_classes(h.display().to_string(), "display-4"); } HeadingDisplay::Medium => { - heading.alter_classes( - ClassesOp::Replace(heading.display().to_string()), - "display-5", - ); + h.replace_classes(h.display().to_string(), "display-5"); } _ => {} }; } } COMPONENT_BASE_PARAGRAPH => { - if let Some(paragraph) = component_as_mut::<Paragraph>(component) { - match paragraph.font_size() { + if let Some(p) = component_as_mut::<Paragraph>(component) { + match p.font_size() { FontSize::ExtraLarge => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "fs-1", - ); + p.replace_classes(p.font_size().to_string(), "fs-1"); } FontSize::XxLarge => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "fs-2", - ); + p.replace_classes(p.font_size().to_string(), "fs-2"); } FontSize::XLarge => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "fs-3", - ); + p.replace_classes(p.font_size().to_string(), "fs-3"); } FontSize::Large => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "fs-4", - ); + p.replace_classes(p.font_size().to_string(), "fs-4"); } FontSize::Medium => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "fs-5", - ); + p.replace_classes(p.font_size().to_string(), "fs-5"); } _ => {} }; diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 369a9a97..6dfe5856 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -33,137 +33,85 @@ impl ThemeTrait for Bulmix { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { COMPONENT_BASE_ICON => { - if let Some(icon) = component_as_mut::<Icon>(component) { - match icon.font_size() { + if let Some(i) = component_as_mut::<Icon>(component) { + match i.font_size() { FontSize::ExtraLarge => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "is-size-1", - ); + i.replace_classes(i.font_size().to_string(), "is-size-1"); } FontSize::XxLarge => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "is-size-2", - ); + i.replace_classes(i.font_size().to_string(), "is-size-2"); } FontSize::XLarge => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "is-size-3", - ); + i.replace_classes(i.font_size().to_string(), "is-size-3"); } FontSize::Large => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "is-size-4", - ); + i.replace_classes(i.font_size().to_string(), "is-size-4"); } FontSize::Medium => { - icon.alter_classes( - ClassesOp::Replace(icon.font_size().to_string()), - "is-size-5", - ); + i.replace_classes(i.font_size().to_string(), "is-size-5"); } _ => {} }; } } COMPONENT_BASE_BUTTON => { - if let Some(button) = component_as_mut::<Button>(component) { - match button.font_size() { + if let Some(b) = component_as_mut::<Button>(component) { + match b.font_size() { FontSize::ExtraLarge => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "is-size-1", - ); + b.replace_classes(b.font_size().to_string(), "is-size-1"); } FontSize::XxLarge => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "is-size-2", - ); + b.replace_classes(b.font_size().to_string(), "is-size-2"); } FontSize::XLarge => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "is-size-3", - ); + b.replace_classes(b.font_size().to_string(), "is-size-3"); } FontSize::Large => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "is-size-4", - ); + b.replace_classes(b.font_size().to_string(), "is-size-4"); } FontSize::Medium => { - button.alter_classes( - ClassesOp::Replace(button.font_size().to_string()), - "is-size-5", - ); + b.replace_classes(b.font_size().to_string(), "is-size-5"); } _ => {} }; - match button.button_type() { + match b.button_type() { ButtonType::Link => { - button.alter_classes( - ClassesOp::Replace(button.button_type().to_string()), - "button is-text", - ); + b.replace_classes(b.button_type().to_string(), "button is-text"); } ButtonType::Primary => { - button.alter_classes( - ClassesOp::Replace(button.button_type().to_string()), - "button is-primary", - ); + b.replace_classes(b.button_type().to_string(), "button is-primary"); } }; } } COMPONENT_BASE_HEADING => { - if let Some(heading) = component_as_mut::<Heading>(component) { - match heading.display() { - HeadingDisplay::Subtitle => heading.alter_classes( - ClassesOp::Replace(heading.display().to_string()), - "subtitle", - ), - _ => heading.alter_classes(ClassesOp::Add, "title"), + if let Some(h) = component_as_mut::<Heading>(component) { + match h.display() { + HeadingDisplay::Subtitle => { + h.replace_classes(h.display().to_string(), "subtitle") + } + _ => h.add_classes("title"), }; } } COMPONENT_BASE_PARAGRAPH => { - if let Some(paragraph) = component_as_mut::<Paragraph>(component) { - paragraph.alter_classes(ClassesOp::Add, "block"); - match paragraph.font_size() { + if let Some(p) = component_as_mut::<Paragraph>(component) { + p.add_classes("block"); + match p.font_size() { FontSize::ExtraLarge => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "is-size-1", - ); + p.replace_classes(p.font_size().to_string(), "is-size-1"); } FontSize::XxLarge => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "is-size-2", - ); + p.replace_classes(p.font_size().to_string(), "is-size-2"); } FontSize::XLarge => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "is-size-3", - ); + p.replace_classes(p.font_size().to_string(), "is-size-3"); } FontSize::Large => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "is-size-4", - ); + p.replace_classes(p.font_size().to_string(), "is-size-4"); } FontSize::Medium => { - paragraph.alter_classes( - ClassesOp::Replace(paragraph.font_size().to_string()), - "is-size-5", - ); + p.replace_classes(p.font_size().to_string(), "is-size-5"); } _ => {} }; @@ -180,12 +128,10 @@ impl ThemeTrait for Bulmix { ) -> Option<Markup> { match component.handle() { COMPONENT_BASE_ICON => { - if let Some(icon) = component_as_ref::<Icon>(component) { - return match icon.icon_name().get() { + if let Some(i) = component_as_ref::<Icon>(component) { + return match i.icon_name().get() { None => None, - _ => { - Some(html! { span class="icon" { i class=[icon.classes().get()] {} } }) - } + _ => Some(html! { span class="icon" { i class=[i.classes().get()] {} } }), }; } None diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 976d3c96..f4468854 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -31,7 +31,7 @@ impl ComponentTrait for Block { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.classes.alter_value(ClassesOp::AddFirst, "pt-block"); + self.prepend_classes("pt-block"); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -51,6 +51,17 @@ impl ComponentTrait for Block { } } +impl ComponentClasses for Block { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Block { // Block BUILDER. @@ -72,12 +83,6 @@ impl Block { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_title(&mut self, title: L10n) -> &mut Self { self.title.alter_value(title); @@ -98,10 +103,6 @@ impl Block { // Block GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn title(&self) -> &OptionTranslated { &self.title } diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index 57d5f6dc..82486b17 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -63,9 +63,8 @@ impl ComponentTrait for Button { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.classes.alter_value( - ClassesOp::AddFirst, - [self.button_type.to_string(), self.font_size.to_string()].join(" "), + self.prepend_classes( + [self.button_type().to_string(), self.font_size().to_string()].join(" "), ); } @@ -93,6 +92,17 @@ impl ComponentTrait for Button { } } +impl ComponentClasses for Button { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Button { pub fn link(href: impl Into<String>, html: L10n) -> Self { Button::default() @@ -128,12 +138,6 @@ impl Button { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_type(&mut self, button_type: ButtonType) -> &mut Self { self.button_type = button_type; @@ -178,10 +182,6 @@ impl Button { // Button GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn button_type(&self) -> &ButtonType { &self.button_type } diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index e4c04de8..f578dfcf 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -35,8 +35,7 @@ impl ComponentTrait for Container { } fn setup_before_prepare(&mut self, cx: &mut Context) { - self.classes.alter_value( - ClassesOp::AddFirst, + self.prepend_classes( [ self.direction.to_string(), self.wrap_align.to_string(), @@ -63,6 +62,17 @@ impl ComponentTrait for Container { } } +impl ComponentClasses for Container { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Container { // Container BUILDER. @@ -84,12 +94,6 @@ impl Container { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[rustfmt::skip] pub fn add_item(mut self, item: flex::Item) -> Self { self.items.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(item))); @@ -134,10 +138,6 @@ impl Container { // Container GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn items(&self) -> &TypedComponents<flex::Item> { &self.items } diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index b0131090..6df8e0d6 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -35,10 +35,8 @@ impl ComponentTrait for Item { (self.renderable.check)(cx) } - #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.item_classes.alter_value( - ClassesOp::AddFirst, + self.prepend_classes( [ "pt-flex__item".to_owned(), self.item_grow.to_string(), @@ -49,7 +47,8 @@ impl ComponentTrait for Item { ] .join(" "), ); - self.inner_classes.alter_value(ClassesOp::AddFirst, "pt-flex__item-inner"); + self.inner_classes + .alter_value(ClassesOp::Prepend, "pt-flex__item-inner"); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -58,7 +57,7 @@ impl ComponentTrait for Item { _ => Some(concat_string!("order: ", self.weight().to_string(), ";")), }; PrepareMarkup::With(html! { - div id=[self.id()] class=[self.item_classes().get()] style=[order] { + div id=[self.id()] class=[self.classes().get()] style=[order] { div class=[self.inner_classes().get()] { (self.components().render(cx)) } @@ -67,6 +66,17 @@ impl ComponentTrait for Item { } } +impl ComponentClasses for Item { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.item_classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.item_classes + } +} + impl Item { // Item BUILDER. @@ -88,12 +98,6 @@ impl Item { self } - #[fn_builder] - pub fn alter_item_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.item_classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.inner_classes.alter_value(op, classes); @@ -144,10 +148,6 @@ impl Item { // Item GETTERS. - pub fn item_classes(&self) -> &OptionClasses { - &self.item_classes - } - pub fn inner_classes(&self) -> &OptionClasses { &self.inner_classes } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index a24f290f..b4db4788 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -48,9 +48,9 @@ impl ComponentTrait for Button { (self.renderable.check)(cx) } + #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.classes.alter_value( - ClassesOp::AddFirst, + self.prepend_classes( concat_string!("btn btn-primary form-", self.button_type.to_string()), ); } @@ -73,6 +73,17 @@ impl ComponentTrait for Button { } } +impl ComponentClasses for Button { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Button { pub fn with(value: L10n) -> Self { Button::default().with_value(value) @@ -104,12 +115,6 @@ impl Button { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); @@ -148,10 +153,6 @@ impl Button { // Button GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn button_type(&self) -> &ButtonType { &self.button_type } diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 7893c5a6..07e99b96 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -68,6 +68,17 @@ impl ComponentTrait for Date { } } +impl ComponentClasses for Date { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Date { // Date BUILDER. @@ -83,12 +94,6 @@ impl Date { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); @@ -172,10 +177,6 @@ impl Date { // Date GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn name(&self) -> &OptionString { &self.name } diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 6565d22e..0abdd438 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -61,6 +61,17 @@ impl ComponentTrait for Form { } } +impl ComponentClasses for Form { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Form { // Form BUILDER. @@ -82,12 +93,6 @@ impl Form { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_action(&mut self, action: &str) -> &mut Self { self.action.alter_value(action); @@ -126,10 +131,6 @@ impl Form { // Form GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn action(&self) -> &OptionString { &self.action } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index b5d906d7..80b8eb2f 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -98,6 +98,17 @@ impl ComponentTrait for Input { } } +impl ComponentClasses for Input { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Input { pub fn textfield() -> Self { Input::default() @@ -162,18 +173,12 @@ impl Input { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { if let Some(previous) = self.name.get() { - self.alter_classes(ClassesOp::Remove, concat_string!("form-item-", previous)); + self.remove_classes(concat_string!("form-item-", previous)); } - self.alter_classes(ClassesOp::Add, concat_string!("form-item-", name)); + self.add_classes(concat_string!("form-item-", name)); self.name.alter_value(name); self } @@ -273,10 +278,6 @@ impl Input { // Input GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn input_type(&self) -> &InputType { &self.input_type } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 181e9b6a..1883f084 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -71,7 +71,7 @@ impl ComponentTrait for Heading { #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.classes.alter_value(ClassesOp::Add, self.display().to_string()); + self.add_classes(self.display().to_string()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -89,6 +89,17 @@ impl ComponentTrait for Heading { } } +impl ComponentClasses for Heading { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Heading { pub fn h1(text: L10n) -> Self { Heading::default() @@ -146,12 +157,6 @@ impl Heading { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { self.heading_type = heading_type; @@ -172,10 +177,6 @@ impl Heading { // Paragraph GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn heading_type(&self) -> &HeadingType { &self.heading_type } diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index ffb028e7..4aabe923 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -25,11 +25,11 @@ impl ComponentTrait for Icon { (self.renderable.check)(cx) } + #[rustfmt::skip] fn setup_before_prepare(&mut self, cx: &mut Context) { if let Some(icon_name) = self.icon_name.get() { - self.classes.alter_value( - ClassesOp::AddFirst, - concat_string!("bi-", icon_name, " ", self.font_size.to_string()), + self.prepend_classes( + concat_string!("bi-", icon_name, " ", self.font_size().to_string()), ); cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); } @@ -43,6 +43,17 @@ impl ComponentTrait for Icon { } } +impl ComponentClasses for Icon { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Icon { pub fn with(icon_name: impl Into<String>) -> Self { Icon::default().with_icon_name(icon_name) @@ -62,12 +73,6 @@ impl Icon { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_icon_name(&mut self, name: impl Into<String>) -> &mut Self { self.icon_name.alter_value(name); @@ -82,10 +87,6 @@ impl Icon { // Icon GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn icon_name(&self) -> &OptionString { &self.icon_name } diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 360c01e8..f4841b8f 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -62,6 +62,17 @@ impl ComponentTrait for Image { } } +impl ComponentClasses for Image { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Image { pub fn with(source: &str) -> Self { Image::default() @@ -102,12 +113,6 @@ impl Image { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_source(&mut self, source: &str) -> &mut Self { self.source.alter_value(source); @@ -122,10 +127,6 @@ impl Image { // Image GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn source(&self) -> &OptionString { &self.source } diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 2ff74fd7..dfa7a253 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -30,9 +30,8 @@ impl ComponentTrait for Paragraph { (self.renderable.check)(cx) } - #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.classes.alter_value(ClassesOp::AddFirst, self.font_size.to_string()); + self.prepend_classes(self.font_size().to_string()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -47,6 +46,17 @@ impl ComponentTrait for Paragraph { } } +impl ComponentClasses for Paragraph { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Paragraph { pub fn with(component: impl ComponentTrait) -> Self { Paragraph::default().add_component(component) @@ -76,12 +86,6 @@ impl Paragraph { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { self.font_size = font_size; @@ -108,10 +112,6 @@ impl Paragraph { // Paragraph GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn font_size(&self) -> &FontSize { &self.font_size } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 25fa7eff..2cfa7fdc 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -83,6 +83,17 @@ impl ComponentTrait for Wrapper { } } +impl ComponentClasses for Wrapper { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } +} + impl Wrapper { pub fn header() -> Self { let mut c = Wrapper::default() @@ -136,12 +147,6 @@ impl Wrapper { self } - #[fn_builder] - pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - #[fn_builder] pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.inner_classes.alter_value(op, classes); @@ -168,10 +173,6 @@ impl Wrapper { // Wrapper GETTERS. - pub fn classes(&self) -> &OptionClasses { - &self.classes - } - pub fn inner_classes(&self) -> &OptionClasses { &self.inner_classes } diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 9d57d87d..57be6b3d 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -8,6 +8,9 @@ pub use renderable::{FnIsRenderable, Renderable}; mod definition; pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; +mod classes; +pub use classes::{ComponentClasses, ComponentClassesOp}; + mod arc_any; pub use arc_any::AnyComponents; pub use arc_any::{ArcAnyComponent, ArcAnyOp}; diff --git a/pagetop/src/core/component/classes.rs b/pagetop/src/core/component/classes.rs new file mode 100644 index 00000000..c58e9974 --- /dev/null +++ b/pagetop/src/core/component/classes.rs @@ -0,0 +1,60 @@ +use crate::html::{ClassesOp, OptionClasses}; + +pub trait ComponentClassesOp { + fn with_classes(self, op: ClassesOp, classes: impl Into<String>) -> Self; + + fn add_classes(&mut self, classes: impl Into<String>) -> &mut Self; + + fn prepend_classes(&mut self, classes: impl Into<String>) -> &mut Self; + + fn remove_classes(&mut self, classes: impl Into<String>) -> &mut Self; + + fn replace_classes(&mut self, rep: impl Into<String>, classes: impl Into<String>) -> &mut Self; + + fn toggle_classes(&mut self, classes: impl Into<String>) -> &mut Self; + + fn set_classes(&mut self, classes: impl Into<String>) -> &mut Self; +} + +pub trait ComponentClasses: ComponentClassesOp { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self; + + fn classes(&self) -> &OptionClasses; +} + +impl<C: ComponentClasses> ComponentClassesOp for C { + fn with_classes(mut self, op: ClassesOp, classes: impl Into<String>) -> Self { + self.alter_classes(op, classes); + self + } + + fn add_classes(&mut self, classes: impl Into<String>) -> &mut Self { + self.alter_classes(ClassesOp::Add, classes); + self + } + + fn prepend_classes(&mut self, classes: impl Into<String>) -> &mut Self { + self.alter_classes(ClassesOp::Prepend, classes); + self + } + + fn remove_classes(&mut self, classes: impl Into<String>) -> &mut Self { + self.alter_classes(ClassesOp::Remove, classes); + self + } + + fn replace_classes(&mut self, rep: impl Into<String>, classes: impl Into<String>) -> &mut Self { + self.alter_classes(ClassesOp::Replace(rep.into()), classes); + self + } + + fn toggle_classes(&mut self, classes: impl Into<String>) -> &mut Self { + self.alter_classes(ClassesOp::Toggle, classes); + self + } + + fn set_classes(&mut self, classes: impl Into<String>) -> &mut Self { + self.alter_classes(ClassesOp::Set, classes); + self + } +} diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index acddcf50..aba25eaa 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -13,11 +13,11 @@ use crate::{fn_builder, SmartDefault}; pub enum ClassesOp { Add, - AddFirst, + Prepend, Remove, Replace(String), Toggle, - Clear, + Set, } #[derive(SmartDefault)] @@ -25,7 +25,7 @@ pub struct OptionClasses(Vec<String>); impl OptionClasses { pub fn new(classes: impl Into<String>) -> Self { - OptionClasses::default().with_value(ClassesOp::AddFirst, classes) + OptionClasses::default().with_value(ClassesOp::Prepend, classes) } // OptionClasses BUILDER. @@ -39,7 +39,7 @@ impl OptionClasses { ClassesOp::Add => { self.add(&classes, self.0.len()); } - ClassesOp::AddFirst => { + ClassesOp::Prepend => { self.add(&classes, 0); } ClassesOp::Remove => { @@ -71,8 +71,9 @@ impl OptionClasses { } } } - ClassesOp::Clear => { + ClassesOp::Set => { self.0.clear(); + self.add(&classes, 0); } } self From 942ecad7789f320f845da87367ff3fc546e56972 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 00:24:16 +0100 Subject: [PATCH 630/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20Arc...Op::AddFi?= =?UTF-8?q?rst=20to=20Prepend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/component/arc_any.rs | 4 ++-- pagetop/src/core/component/arc_typed.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pagetop/src/core/component/arc_any.rs b/pagetop/src/core/component/arc_any.rs index 4b8759cd..b9252c36 100644 --- a/pagetop/src/core/component/arc_any.rs +++ b/pagetop/src/core/component/arc_any.rs @@ -55,7 +55,7 @@ pub enum ArcAnyOp { Add(ArcAnyComponent), AddAfterId(&'static str, ArcAnyComponent), AddBeforeId(&'static str, ArcAnyComponent), - AddFirst(ArcAnyComponent), + Prepend(ArcAnyComponent), RemoveById(&'static str), ReplaceById(&'static str, ArcAnyComponent), Reset, @@ -91,7 +91,7 @@ impl AnyComponents { Some(index) => self.0.insert(index, arc), _ => self.0.insert(0, arc), }, - ArcAnyOp::AddFirst(arc) => self.0.insert(0, arc), + ArcAnyOp::Prepend(arc) => self.0.insert(0, arc), ArcAnyOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id() == id) { self.0.remove(index); diff --git a/pagetop/src/core/component/arc_typed.rs b/pagetop/src/core/component/arc_typed.rs index 7bce8c98..483229a0 100644 --- a/pagetop/src/core/component/arc_typed.rs +++ b/pagetop/src/core/component/arc_typed.rs @@ -60,7 +60,7 @@ pub enum ArcTypedOp<C: ComponentTrait> { Add(ArcTypedComponent<C>), AddAfterId(&'static str, ArcTypedComponent<C>), AddBeforeId(&'static str, ArcTypedComponent<C>), - AddFirst(ArcTypedComponent<C>), + Prepend(ArcTypedComponent<C>), RemoveById(&'static str), ReplaceById(&'static str, ArcTypedComponent<C>), Reset, @@ -88,7 +88,7 @@ impl<C: ComponentTrait + Default> TypedComponents<C> { Some(index) => self.0.insert(index, one), _ => self.0.insert(0, one), }, - ArcTypedOp::AddFirst(one) => self.0.insert(0, one), + ArcTypedOp::Prepend(one) => self.0.insert(0, one), ArcTypedOp::RemoveById(id) => { if let Some(index) = self.0.iter().position(|c| c.id() == id) { self.0.remove(index); From 9c16aa251936455103fb91b4be958e4fb5388cee Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 00:25:40 +0100 Subject: [PATCH 631/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Pas?= =?UTF-8?q?ses=20clippy=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index 8cae81fc..cf7e1d6e 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -39,7 +39,7 @@ pub fn fn_builder(_attr: TokenStream, item: TokenStream) -> TokenStream { arg.split_whitespace() .next() .unwrap() - .trim_end_matches(":") + .trim_end_matches(':') .to_string() }) .collect(); From 255fb393a9503e10e49e15eb63edb2f0bdf3a8d1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 00:44:04 +0100 Subject: [PATCH 632/853] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20Apply=20latest?= =?UTF-8?q?=20changes=20to=20the=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/src/lib.rs | 4 +-- pagetop/src/base/component/branding.rs | 11 ++++---- pagetop/src/base/component/button.rs | 18 ++++++------ pagetop/src/base/component/form/button.rs | 2 +- pagetop/src/base/component/heading.rs | 2 +- pagetop/src/base/component/menu/item.rs | 34 +++++++++++++++++++++++ 6 files changed, 53 insertions(+), 18 deletions(-) diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 58b46f2f..849d0d56 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -75,13 +75,13 @@ fn hello_world() -> Wrapper { L10n::t("hello_code", &LOCALES_HOMEDEMO), ) .with_target(ButtonTarget::Blank) - .with_left_icon(Icon::with("git")) + .with_left_icon(Some(Icon::with("git"))) .with_classes(ClassesOp::Add, "code-link") .with_font_size(FontSize::Medium), ) .add_component( Button::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) - .with_left_icon(Icon::with("arrow-down-circle-fill")) + .with_left_icon(Some(Icon::with("arrow-down-circle-fill"))) .with_classes(ClassesOp::Add, "welcome-link") .with_font_size(FontSize::Medium), ), diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index f14430d0..7fb6d664 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -34,12 +34,13 @@ impl ComponentTrait for Branding { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let logo = self.logo().render(cx); let title = L10n::l("site_home").using(cx.langid()); PrepareMarkup::With(html! { div id=[self.id()] class="pt-branding" { div class="pt-branding__wrapper" { - div class="pt-branding__logo" { - (self.logo().render(cx)) + @if !logo.is_empty() { + div class="pt-branding__logo" { (logo) } } div class="pt-branding__text" { div class="pt-branding__name" { @@ -93,8 +94,8 @@ impl Branding { } #[fn_builder] - pub fn alter_logo(&mut self, logo: Image) -> &mut Self { - self.logo.set(logo); + pub fn alter_logo(&mut self, logo: Option<Image>) -> &mut Self { + self.logo.alter_value(logo); self } @@ -114,7 +115,7 @@ impl Branding { &self.slogan } - pub fn logo(&self) -> &ArcTypedComponent<Image> { + pub fn logo(&self) -> &OptionComponent<Image> { &self.logo } diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index 82486b17..e5ccbced 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -38,8 +38,8 @@ pub struct Button { font_size : FontSize, href : OptionString, html : OptionTranslated, - left_icon : ButtonIcon, - right_icon : ButtonIcon, + left_icon : OptionComponent<Icon>, + right_icon : OptionComponent<Icon>, target : ButtonTarget, } @@ -85,7 +85,7 @@ impl ComponentTrait for Button { target=[target] { (self.left_icon().render(cx)) - " " span { (self.html().escaped(cx.langid()).unwrap_or_default()) } " " + " " span { (self.html().escaped(cx.langid())) } " " (self.right_icon().render(cx)) } }) @@ -163,14 +163,14 @@ impl Button { } #[fn_builder] - pub fn alter_left_icon(&mut self, icon: Icon) -> &mut Self { - self.left_icon.set(icon); + pub fn alter_left_icon(&mut self, icon: Option<Icon>) -> &mut Self { + self.left_icon.alter_value(icon); self } #[fn_builder] - pub fn alter_right_icon(&mut self, icon: Icon) -> &mut Self { - self.right_icon.set(icon); + pub fn alter_right_icon(&mut self, icon: Option<Icon>) -> &mut Self { + self.right_icon.alter_value(icon); self } @@ -198,11 +198,11 @@ impl Button { &self.html } - pub fn left_icon(&self) -> &ButtonIcon { + pub fn left_icon(&self) -> &OptionComponent<Icon> { &self.left_icon } - pub fn right_icon(&self) -> &ButtonIcon { + pub fn right_icon(&self) -> &OptionComponent<Icon> { &self.right_icon } diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index b4db4788..e0df5e88 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -67,7 +67,7 @@ impl ComponentTrait for Button { autofocus=[self.autofocus().get()] disabled=[self.disabled().get()] { - (self.value().escaped(cx.langid()).unwrap_or_default()) + (self.value().escaped(cx.langid())) } }) } diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 1883f084..83bedc97 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -77,7 +77,7 @@ impl ComponentTrait for Heading { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let id = self.id(); let classes = self.classes().get(); - let text = self.text().escaped(cx.langid()).unwrap_or_default(); + let text = self.text().escaped(cx.langid()); PrepareMarkup::With(html! { @match &self.heading_type() { HeadingType::H1 => h1 id=[id] class=[classes] { (text) }, HeadingType::H2 => h2 id=[id] class=[classes] { (text) }, diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index ff50696a..ec3edf02 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -28,6 +28,8 @@ pub struct Item { renderable : Renderable, item_type : ItemType, description: OptionTranslated, + left_icon : OptionComponent<Icon>, + right_icon : OptionComponent<Icon>, } impl_handle!(COMPONENT_BASE_MENU_ITEM for Item); @@ -47,26 +49,36 @@ impl ComponentTrait for Item { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { let description = self.description.using(cx.langid()); + + let left_icon = self.left_icon().render(cx); + let right_icon = self.right_icon().render(cx); + match self.item_type() { ItemType::Void => PrepareMarkup::None, ItemType::Label(label) => PrepareMarkup::With(html! { li class="pt-menu__label" { span title=[description] { + (left_icon) (label.escaped(cx.langid())) + (right_icon) } } }), ItemType::Link(label, path) => PrepareMarkup::With(html! { li class="pt-menu__link" { a href=(path(cx)) title=[description] { + (left_icon) (label.escaped(cx.langid())) + (right_icon) } } }), ItemType::LinkBlank(label, path) => PrepareMarkup::With(html! { li class="pt-menu__link" { a href=(path(cx)) title=[description] target="_blank" { + (left_icon) (label.escaped(cx.langid())) + (right_icon) } } }), @@ -78,6 +90,7 @@ impl ComponentTrait for Item { ItemType::Submenu(label, submenu) => PrepareMarkup::With(html! { li class="pt-menu__children" { a href="#" title=[description] { + (left_icon) (label.escaped(cx.langid())) i class="pt-menu__icon bi-chevron-down" {} } div class="pt-menu__subs" { @@ -88,6 +101,7 @@ impl ComponentTrait for Item { ItemType::Megamenu(label, megamenu) => PrepareMarkup::With(html! { li class="pt-menu__children" { a href="#" title=[description] { + (left_icon) (label.escaped(cx.langid())) i class="pt-menu__icon bi-chevron-down" {} } div class="pt-menu__subs pt-menu__mega" { @@ -162,6 +176,18 @@ impl Item { self } + #[fn_builder] + pub fn alter_left_icon(&mut self, icon: Option<Icon>) -> &mut Self { + self.left_icon.alter_value(icon); + self + } + + #[fn_builder] + pub fn alter_right_icon(&mut self, icon: Option<Icon>) -> &mut Self { + self.right_icon.alter_value(icon); + self + } + // Item GETTERS. pub fn item_type(&self) -> &ItemType { @@ -171,4 +197,12 @@ impl Item { pub fn description(&self) -> &OptionTranslated { &self.description } + + pub fn left_icon(&self) -> &OptionComponent<Icon> { + &self.left_icon + } + + pub fn right_icon(&self) -> &OptionComponent<Icon> { + &self.right_icon + } } From d9f35618320fc19b44ed6c37884b770fc0fe1862 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:17:16 +0100 Subject: [PATCH 633/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Maj?= =?UTF-8?q?or=20update=20to=20enhance=20Handle=20usage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 3 +- examples/basics/hello-name/src/main.rs | 3 +- examples/basics/hello-world/src/main.rs | 3 +- pagetop-admin/src/lib.rs | 3 +- pagetop-bootsier/src/lib.rs | 13 ++-- pagetop-bulmix/src/lib.rs | 13 ++-- pagetop-homedemo/src/lib.rs | 3 +- pagetop-macros/src/lib.rs | 68 ++++++++++++++++++- pagetop-node/src/lib.rs | 3 +- pagetop-user/src/lib.rs | 3 +- .../component/after_prepare_component.rs | 4 +- .../component/before_prepare_component.rs | 4 +- .../base/action/page/after_prepare_body.rs | 4 +- .../base/action/page/before_prepare_body.rs | 4 +- pagetop/src/base/component.rs | 26 +++---- pagetop/src/base/component/block.rs | 16 +---- pagetop/src/base/component/branding.rs | 5 +- pagetop/src/base/component/button.rs | 16 +---- pagetop/src/base/component/flex.rs | 4 +- pagetop/src/base/component/flex/container.rs | 16 +---- pagetop/src/base/component/flex/item.rs | 18 +---- pagetop/src/base/component/form.rs | 10 +-- pagetop/src/base/component/form/button.rs | 16 +---- pagetop/src/base/component/form/date.rs | 16 +---- pagetop/src/base/component/form/form_main.rs | 16 +---- pagetop/src/base/component/form/hidden.rs | 5 +- pagetop/src/base/component/form/input.rs | 16 +---- pagetop/src/base/component/heading.rs | 16 +---- pagetop/src/base/component/html.rs | 5 +- pagetop/src/base/component/icon.rs | 16 +---- pagetop/src/base/component/image.rs | 16 +---- pagetop/src/base/component/menu.rs | 12 ++-- pagetop/src/base/component/menu/element.rs | 5 +- pagetop/src/base/component/menu/group.rs | 5 +- pagetop/src/base/component/menu/item.rs | 5 +- pagetop/src/base/component/menu/megamenu.rs | 5 +- pagetop/src/base/component/menu/menu_main.rs | 5 +- pagetop/src/base/component/menu/submenu.rs | 5 +- pagetop/src/base/component/paragraph.rs | 16 +---- pagetop/src/base/component/powered_by.rs | 5 +- pagetop/src/base/component/translate.rs | 5 +- pagetop/src/base/component/wrapper.rs | 16 +---- pagetop/src/base/theme.rs | 6 +- pagetop/src/base/theme/basic.rs | 4 +- pagetop/src/base/theme/chassis.rs | 4 +- pagetop/src/base/theme/inception.rs | 4 +- pagetop/src/core/action/definition.rs | 4 +- pagetop/src/core/component/definition.rs | 4 +- pagetop/src/core/module/definition.rs | 4 +- pagetop/src/lib.rs | 17 ++--- pagetop/src/prelude.rs | 4 +- pagetop/src/response/fatal_error.rs | 4 +- pagetop/src/response/fatal_error/error403.rs | 5 +- pagetop/src/response/fatal_error/error404.rs | 5 +- pagetop/src/util.rs | 38 ----------- pagetop/tests/server/health_check.rs | 3 +- 56 files changed, 201 insertions(+), 353 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 2314c934..87973883 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,9 +1,8 @@ use pagetop::prelude::*; +#[derive(AssignHandle)] struct Drust; -impl_handle!(APP_DRUST for Drust); - impl ModuleTrait for Drust { fn dependencies(&self) -> Vec<ModuleRef> { vec![ diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index cf216f1f..e248d7ff 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -1,9 +1,8 @@ use pagetop::prelude::*; +#[derive(AssignHandle)] struct HelloName; -impl_handle!(APP_HELLO_NAME for HelloName); - impl ModuleTrait for HelloName { fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { scfg.service(hello_name); diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 516bade2..95b28647 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -1,9 +1,8 @@ use pagetop::prelude::*; +#[derive(AssignHandle)] struct HelloWorld; -impl_handle!(APP_HELLO_WORLD for HelloWorld); - impl ModuleTrait for HelloWorld { fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { scfg.route("/", service::web::get().to(hello_world)); diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index db70f468..acf69fa6 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -4,10 +4,9 @@ static_locales!(LOCALES_ADMIN); mod summary; +#[derive(AssignHandle)] pub struct Admin; -impl_handle!(MODULE_ADMIN for Admin); - impl ModuleTrait for Admin { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_ADMIN) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 7a45a904..52c52e4b 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -4,10 +4,9 @@ static_locales!(LOCALES_BOOTSIER); static_files!(bootsier); +#[derive(AssignHandle)] pub struct Bootsier; -impl_handle!(THEME_BOOTSIER for Bootsier); - impl ModuleTrait for Bootsier { fn theme(&self) -> Option<ThemeRef> { Some(&Bootsier) @@ -83,7 +82,7 @@ impl ThemeTrait for Bootsier { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { - COMPONENT_BASE_ICON => { + h if Icon::matches_handle(h) => { if let Some(i) = component_as_mut::<Icon>(component) { match i.font_size() { FontSize::ExtraLarge => { @@ -105,7 +104,7 @@ impl ThemeTrait for Bootsier { }; } } - COMPONENT_BASE_BUTTON => { + h if Button::matches_handle(h) => { if let Some(b) = component_as_mut::<Button>(component) { match b.font_size() { FontSize::ExtraLarge => { @@ -135,7 +134,7 @@ impl ThemeTrait for Bootsier { }; } } - COMPONENT_BASE_HEADING => { + h if Heading::matches_handle(h) => { if let Some(h) = component_as_mut::<Heading>(component) { match h.display() { HeadingDisplay::ExtraLarge => { @@ -157,7 +156,7 @@ impl ThemeTrait for Bootsier { }; } } - COMPONENT_BASE_PARAGRAPH => { + h if Paragraph::matches_handle(h) => { if let Some(p) = component_as_mut::<Paragraph>(component) { match p.font_size() { FontSize::ExtraLarge => { @@ -185,7 +184,7 @@ impl ThemeTrait for Bootsier { fn render_component(&self, component: &dyn ComponentTrait, cx: &mut Context) -> Option<Markup> { match component.handle() { - ERROR_404 => Some(html! { + h if Error404::matches_handle(h) => Some(html! { div class="jumbotron" { div class="media" { img diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 6dfe5856..123facc9 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -2,10 +2,9 @@ use pagetop::prelude::*; static_files!(bulmix); +#[derive(AssignHandle)] pub struct Bulmix; -impl_handle!(THEME_BULMIX for Bulmix); - impl ModuleTrait for Bulmix { fn theme(&self) -> Option<ThemeRef> { Some(&Bulmix) @@ -32,7 +31,7 @@ impl ThemeTrait for Bulmix { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { match component.handle() { - COMPONENT_BASE_ICON => { + h if Icon::matches_handle(h) => { if let Some(i) = component_as_mut::<Icon>(component) { match i.font_size() { FontSize::ExtraLarge => { @@ -54,7 +53,7 @@ impl ThemeTrait for Bulmix { }; } } - COMPONENT_BASE_BUTTON => { + h if Button::matches_handle(h) => { if let Some(b) = component_as_mut::<Button>(component) { match b.font_size() { FontSize::ExtraLarge => { @@ -84,7 +83,7 @@ impl ThemeTrait for Bulmix { }; } } - COMPONENT_BASE_HEADING => { + h if Heading::matches_handle(h) => { if let Some(h) = component_as_mut::<Heading>(component) { match h.display() { HeadingDisplay::Subtitle => { @@ -94,7 +93,7 @@ impl ThemeTrait for Bulmix { }; } } - COMPONENT_BASE_PARAGRAPH => { + h if Paragraph::matches_handle(h) => { if let Some(p) = component_as_mut::<Paragraph>(component) { p.add_classes("block"); match p.font_size() { @@ -127,7 +126,7 @@ impl ThemeTrait for Bulmix { _cx: &mut Context, ) -> Option<Markup> { match component.handle() { - COMPONENT_BASE_ICON => { + h if Icon::matches_handle(h) => { if let Some(i) = component_as_ref::<Icon>(component) { return match i.icon_name().get() { None => None, diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 849d0d56..71ff5294 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -4,10 +4,9 @@ static_locales!(LOCALES_HOMEDEMO); static_files!(homedemo); +#[derive(AssignHandle)] pub struct HomeDemo; -impl_handle!(MODULE_HOMEDEMO for HomeDemo); - impl ModuleTrait for HomeDemo { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_HOMEDEMO) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index cf7e1d6e..8fc88251 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -2,9 +2,10 @@ mod maud; use concat_string::concat_string; use proc_macro::TokenStream; +use proc_macro2::TokenStream as TokenStream2; use proc_macro_error::proc_macro_error; -use quote::{quote, quote_spanned, ToTokens}; -use syn::{parse_macro_input, parse_str, ItemFn}; +use quote::{format_ident, quote, quote_spanned, ToTokens}; +use syn::{parse_macro_input, parse_str, DeriveInput, ItemFn}; #[proc_macro] #[proc_macro_error] @@ -100,3 +101,66 @@ pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { output.extend(item); output } + +#[proc_macro_derive(ComponentClasses)] +pub fn component_classes_derive(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + let name = &input.ident; + + let expanded = quote! { + impl ComponentClasses for #name { + fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { + self.classes.alter_value(op, classes); + self + } + + fn classes(&self) -> &OptionClasses { + &self.classes + } + } + }; + + TokenStream::from(expanded) +} + +#[proc_macro_derive(CrateHandle, attributes(handle))] +pub fn crate_handle_derive(input: TokenStream) -> TokenStream { + impl_handle(input, quote! { crate }) +} + +#[proc_macro_derive(AssignHandle, attributes(handle))] +pub fn assign_handle_derive(input: TokenStream) -> TokenStream { + impl_handle(input, quote! { pagetop }) +} + +fn impl_handle(input: TokenStream, crate_name: TokenStream2) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + let name = &input.ident; + let handle_name = format_ident!("HANDLE_{}", name.to_string().to_uppercase()); + + let expanded = quote! { + const #handle_name: #crate_name::Handle = + #crate_name::util::handle(module_path!(), file!(), line!(), column!()); + + impl #impl_generics #crate_name::ImplementHandle for #name #ty_generics #where_clause { + #[inline] + fn static_handle() -> #crate_name::Handle { + #handle_name + } + + #[inline] + fn matches_handle(is: #crate_name::Handle) -> bool { + is == #handle_name + } + + #[inline] + fn handle(&self) -> #crate_name::Handle { + #handle_name + } + } + }; + + TokenStream::from(expanded) +} diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 1a58b9f8..9201f5d8 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -5,10 +5,9 @@ static_locales!(LOCALES_NODE); //mod entity; mod migration; +#[derive(AssignHandle)] pub struct Node; -impl_handle!(MODULE_NODE for Node); - impl ModuleTrait for Node { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_NODE) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 749ee99e..ba308b38 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -4,10 +4,9 @@ static_locales!(LOCALES_USER); mod migration; +#[derive(AssignHandle)] pub struct User; -impl_handle!(MODULE_USER for User); - impl ModuleTrait for User { fn name(&self) -> L10n { L10n::t("module_name", &LOCALES_USER) diff --git a/pagetop/src/base/action/component/after_prepare_component.rs b/pagetop/src/base/action/component/after_prepare_component.rs index 088ceb20..479cd123 100644 --- a/pagetop/src/base/action/component/after_prepare_component.rs +++ b/pagetop/src/base/action/component/after_prepare_component.rs @@ -1,7 +1,9 @@ use crate::prelude::*; +use crate::CrateHandle; use super::FnAction; +#[derive(CrateHandle)] pub struct AfterPrepareComponent<C: ComponentTrait> { f: FnAction<C>, referer_handle: Option<Handle>, @@ -9,8 +11,6 @@ pub struct AfterPrepareComponent<C: ComponentTrait> { weight: Weight, } -impl_handle!(ACTION_AFTER_PREPARE_COMPONENT for AfterPrepareComponent<ComponentTrait>); - impl<C: ComponentTrait> ActionTrait for AfterPrepareComponent<C> { fn referer_handle(&self) -> Option<Handle> { self.referer_handle diff --git a/pagetop/src/base/action/component/before_prepare_component.rs b/pagetop/src/base/action/component/before_prepare_component.rs index 1bfd3d3e..d81fe2d6 100644 --- a/pagetop/src/base/action/component/before_prepare_component.rs +++ b/pagetop/src/base/action/component/before_prepare_component.rs @@ -1,7 +1,9 @@ use crate::prelude::*; +use crate::CrateHandle; use super::FnAction; +#[derive(CrateHandle)] pub struct BeforePrepareComponent<C: ComponentTrait> { f: FnAction<C>, referer_handle: Option<Handle>, @@ -9,8 +11,6 @@ pub struct BeforePrepareComponent<C: ComponentTrait> { weight: Weight, } -impl_handle!(ACTION_BEFORE_PREPARE_COMPONENT for BeforePrepareComponent<ComponentTrait>); - impl<C: ComponentTrait> ActionTrait for BeforePrepareComponent<C> { fn referer_handle(&self) -> Option<Handle> { self.referer_handle diff --git a/pagetop/src/base/action/page/after_prepare_body.rs b/pagetop/src/base/action/page/after_prepare_body.rs index d8bf98d7..78bcf391 100644 --- a/pagetop/src/base/action/page/after_prepare_body.rs +++ b/pagetop/src/base/action/page/after_prepare_body.rs @@ -1,14 +1,14 @@ use crate::prelude::*; +use crate::CrateHandle; use super::FnActionPage; +#[derive(CrateHandle)] pub struct AfterPrepareBody { f: FnActionPage, weight: Weight, } -impl_handle!(ACTION_AFTER_PREPARE_BODY for AfterPrepareBody); - impl ActionTrait for AfterPrepareBody { fn weight(&self) -> Weight { self.weight diff --git a/pagetop/src/base/action/page/before_prepare_body.rs b/pagetop/src/base/action/page/before_prepare_body.rs index 4258f7ae..b2f94c39 100644 --- a/pagetop/src/base/action/page/before_prepare_body.rs +++ b/pagetop/src/base/action/page/before_prepare_body.rs @@ -1,14 +1,14 @@ use crate::prelude::*; +use crate::CrateHandle; use super::FnActionPage; +#[derive(CrateHandle)] pub struct BeforePrepareBody { f: FnActionPage, weight: Weight, } -impl_handle!(ACTION_BEFORE_PREPARE_BODY for BeforePrepareBody); - impl ActionTrait for BeforePrepareBody { fn weight(&self) -> Weight { self.weight diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 2064d0b4..23048e55 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -124,35 +124,35 @@ impl ToString for FontSize { // ************************************************************************************************* mod html; -pub use html::{Html, COMPONENT_BASE_HTML}; +pub use html::Html; mod translate; -pub use translate::{Translate, COMPONENT_BASE_TRANSLATE}; +pub use translate::Translate; mod wrapper; -pub use wrapper::{Wrapper, WrapperType, COMPONENT_BASE_WRAPPER}; +pub use wrapper::{Wrapper, WrapperType}; pub mod flex; mod icon; -pub use icon::{Icon, COMPONENT_BASE_ICON}; +pub use icon::Icon; mod heading; -pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_BASE_HEADING}; +pub use heading::{Heading, HeadingDisplay, HeadingType}; mod paragraph; -pub use paragraph::{Paragraph, COMPONENT_BASE_PARAGRAPH}; +pub use paragraph::Paragraph; mod button; -pub use button::{Button, ButtonTarget, ButtonType, COMPONENT_BASE_BUTTON}; +pub use button::{Button, ButtonTarget, ButtonType}; mod image; -pub use image::{Image, ImageSize, COMPONENT_BASE_IMAGE}; +pub use image::{Image, ImageSize}; mod block; -pub use block::{Block, COMPONENT_BASE_BLOCK}; +pub use block::Block; mod branding; -pub use branding::{Branding, COMPONENT_BASE_BRANDING}; +pub use branding::Branding; mod powered_by; -pub use powered_by::{PoweredBy, PoweredByLogo, COMPONENT_BASE_POWEREDBY}; +pub use powered_by::{PoweredBy, PoweredByLogo}; pub mod menu; -pub use menu::{Menu, COMPONENT_BASE_MENU}; +pub use menu::Menu; pub mod form; -pub use form::{Form, FormMethod, COMPONENT_BASE_FORM}; +pub use form::{Form, FormMethod}; diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index f4468854..4c1e409a 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,7 +1,8 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Block { id : OptionId, weight : Weight, @@ -11,8 +12,6 @@ pub struct Block { stuff : AnyComponents, } -impl_handle!(COMPONENT_BASE_BLOCK for Block); - impl ComponentTrait for Block { fn new() -> Self { Block::default() @@ -51,17 +50,6 @@ impl ComponentTrait for Block { } } -impl ComponentClasses for Block { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Block { // Block BUILDER. diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index 7fb6d664..221a2f3d 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -1,7 +1,8 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Branding { id : OptionId, weight : Weight, @@ -14,8 +15,6 @@ pub struct Branding { frontpage : FnContextualPath, } -impl_handle!(COMPONENT_BASE_BRANDING for Branding); - impl ComponentTrait for Branding { fn new() -> Self { Branding::default() diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index e5ccbced..3f43f21d 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; #[derive(SmartDefault)] pub enum ButtonType { @@ -28,7 +29,7 @@ pub enum ButtonTarget { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Button { id : OptionId, weight : Weight, @@ -43,8 +44,6 @@ pub struct Button { target : ButtonTarget, } -impl_handle!(COMPONENT_BASE_BUTTON for Button); - impl ComponentTrait for Button { fn new() -> Self { Button::default() @@ -92,17 +91,6 @@ impl ComponentTrait for Button { } } -impl ComponentClasses for Button { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Button { pub fn link(href: impl Into<String>, html: L10n) -> Self { Button::default() diff --git a/pagetop/src/base/component/flex.rs b/pagetop/src/base/component/flex.rs index 29bed8ec..66e0daad 100644 --- a/pagetop/src/base/component/flex.rs +++ b/pagetop/src/base/component/flex.rs @@ -1,7 +1,7 @@ mod container; -pub use container::{Container, COMPONENT_BASE_FLEX_CONTAINER}; +pub use container::Container; mod item; -pub use item::{Item, COMPONENT_BASE_FLEX_ITEM}; +pub use item::Item; use crate::prelude::*; diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index f578dfcf..d2f5fb7c 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -1,7 +1,8 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Container { id : OptionId, weight : Weight, @@ -15,8 +16,6 @@ pub struct Container { gap : flex::Gap, } -impl_handle!(COMPONENT_BASE_FLEX_CONTAINER for Container); - impl ComponentTrait for Container { fn new() -> Self { Container::default() @@ -62,17 +61,6 @@ impl ComponentTrait for Container { } } -impl ComponentClasses for Container { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Container { // Container BUILDER. diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 6df8e0d6..3d1ea0d4 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -1,12 +1,13 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Item { id : OptionId, weight : Weight, renderable : Renderable, - item_classes : OptionClasses, + classes : OptionClasses, inner_classes: OptionClasses, item_grow : flex::ItemGrow, item_shrink : flex::ItemShrink, @@ -16,8 +17,6 @@ pub struct Item { stuff : AnyComponents, } -impl_handle!(COMPONENT_BASE_FLEX_ITEM for Item); - impl ComponentTrait for Item { fn new() -> Self { Item::default() @@ -66,17 +65,6 @@ impl ComponentTrait for Item { } } -impl ComponentClasses for Item { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.item_classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.item_classes - } -} - impl Item { // Item BUILDER. diff --git a/pagetop/src/base/component/form.rs b/pagetop/src/base/component/form.rs index f77f6b68..04f882cc 100644 --- a/pagetop/src/base/component/form.rs +++ b/pagetop/src/base/component/form.rs @@ -1,11 +1,11 @@ mod form_main; -pub use form_main::{Form, FormMethod, COMPONENT_BASE_FORM}; +pub use form_main::{Form, FormMethod}; mod input; -pub use input::{Input, InputType, COMPONENT_BASE_INPUT}; +pub use input::{Input, InputType}; mod hidden; -pub use hidden::{Hidden, COMPONENT_BASE_HIDDEN}; +pub use hidden::Hidden; mod date; -pub use date::{Date, COMPONENT_BASE_DATE}; +pub use date::Date; mod button; -pub use button::{Button, ButtonType, COMPONENT_BASE_BUTTON}; +pub use button::{Button, ButtonType}; diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index e0df5e88..d88dd19b 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; #[derive(SmartDefault)] pub enum ButtonType { @@ -20,7 +21,7 @@ impl ToString for ButtonType { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Button { weight : Weight, renderable : Renderable, @@ -33,8 +34,6 @@ pub struct Button { template : String, } -impl_handle!(COMPONENT_BASE_BUTTON for Button); - impl ComponentTrait for Button { fn new() -> Self { Button::default() @@ -73,17 +72,6 @@ impl ComponentTrait for Button { } } -impl ComponentClasses for Button { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Button { pub fn with(value: L10n) -> Self { Button::default().with_value(value) diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 07e99b96..fbadfe15 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,7 +1,8 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Date { weight : Weight, renderable : Renderable, @@ -19,8 +20,6 @@ pub struct Date { template : String, } -impl_handle!(COMPONENT_BASE_DATE for Date); - impl ComponentTrait for Date { fn new() -> Self { Date::default().with_classes(ClassesOp::Add, "form-item form-type-date") @@ -68,17 +67,6 @@ impl ComponentTrait for Date { } } -impl ComponentClasses for Date { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Date { // Date BUILDER. diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 0abdd438..7e7747b6 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; #[derive(SmartDefault)] pub enum FormMethod { @@ -8,7 +9,7 @@ pub enum FormMethod { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Form { id : OptionId, weight : Weight, @@ -21,8 +22,6 @@ pub struct Form { template : String, } -impl_handle!(COMPONENT_BASE_FORM for Form); - impl ComponentTrait for Form { fn new() -> Self { Form::default() @@ -61,17 +60,6 @@ impl ComponentTrait for Form { } } -impl ComponentClasses for Form { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Form { // Form BUILDER. diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index f774317c..9ed4ef6d 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,15 +1,14 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Hidden { weight: Weight, name : OptionName, value : OptionString, } -impl_handle!(COMPONENT_BASE_HIDDEN for Hidden); - impl ComponentTrait for Hidden { fn new() -> Self { Hidden::default() diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 80b8eb2f..0b62d969 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; #[derive(SmartDefault)] pub enum InputType { @@ -12,7 +13,7 @@ pub enum InputType { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Input { weight : Weight, renderable : Renderable, @@ -34,8 +35,6 @@ pub struct Input { template : String, } -impl_handle!(COMPONENT_BASE_INPUT for Input); - impl ComponentTrait for Input { fn new() -> Self { Input::default() @@ -98,17 +97,6 @@ impl ComponentTrait for Input { } } -impl ComponentClasses for Input { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Input { pub fn textfield() -> Self { Input::default() diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 83bedc97..8b969f52 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; #[derive(SmartDefault)] pub enum HeadingType { @@ -39,7 +40,7 @@ impl ToString for HeadingDisplay { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Heading { id : OptionId, weight : Weight, @@ -50,8 +51,6 @@ pub struct Heading { display : HeadingDisplay, } -impl_handle!(COMPONENT_BASE_HEADING for Heading); - impl ComponentTrait for Heading { fn new() -> Self { Heading::default() @@ -89,17 +88,6 @@ impl ComponentTrait for Heading { } } -impl ComponentClasses for Heading { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Heading { pub fn h1(text: L10n) -> Self { Heading::default() diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 0d7e04f8..8477ca5e 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,10 +1,9 @@ use crate::prelude::*; +use crate::CrateHandle; -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Html(Markup); -impl_handle!(COMPONENT_BASE_HTML for Html); - impl ComponentTrait for Html { fn new() -> Self { Html::default() diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 4aabe923..9a945185 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,7 +1,8 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Icon { weight : Weight, renderable: Renderable, @@ -10,8 +11,6 @@ pub struct Icon { font_size : FontSize, } -impl_handle!(COMPONENT_BASE_ICON for Icon); - impl ComponentTrait for Icon { fn new() -> Self { Icon::default() @@ -43,17 +42,6 @@ impl ComponentTrait for Icon { } } -impl ComponentClasses for Icon { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Icon { pub fn with(icon_name: impl Into<String>) -> Self { Icon::default().with_icon_name(icon_name) diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index f4841b8f..67657b02 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; const IMG_FLUID: &str = "pt-img__fluid"; const IMG_FIXED: &str = "pt-img__fixed"; @@ -14,7 +15,7 @@ pub enum ImageSize { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Image { id : OptionId, weight : Weight, @@ -24,8 +25,6 @@ pub struct Image { size : ImageSize, } -impl_handle!(COMPONENT_BASE_IMAGE for Image); - impl ComponentTrait for Image { fn new() -> Self { Image::default().with_classes(ClassesOp::Add, IMG_FLUID) @@ -62,17 +61,6 @@ impl ComponentTrait for Image { } } -impl ComponentClasses for Image { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Image { pub fn with(source: &str) -> Self { Image::default() diff --git a/pagetop/src/base/component/menu.rs b/pagetop/src/base/component/menu.rs index 5cc46925..34ab59fe 100644 --- a/pagetop/src/base/component/menu.rs +++ b/pagetop/src/base/component/menu.rs @@ -1,17 +1,17 @@ mod menu_main; -pub use menu_main::{Menu, COMPONENT_BASE_MENU}; +pub use menu_main::Menu; mod item; -pub use item::{Item, ItemType, COMPONENT_BASE_MENU_ITEM}; +pub use item::{Item, ItemType}; mod submenu; -pub use submenu::{Submenu, COMPONENT_BASE_MENU_SUBMENU}; +pub use submenu::Submenu; mod megamenu; -pub use megamenu::{Megamenu, COMPONENT_BASE_MENU_MEGAMENU}; +pub use megamenu::Megamenu; mod group; -pub use group::{Group, COMPONENT_BASE_MENU_GROUP}; +pub use group::Group; mod element; -pub use element::{Element, ElementType, COMPONENT_BASE_MENU_ELEMENT}; +pub use element::{Element, ElementType}; diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index c01c0f49..04059f05 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; use super::Submenu; @@ -16,15 +17,13 @@ pub enum ElementType { // Element. #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Element { weight : Weight, renderable : Renderable, element_type: ElementType, } -impl_handle!(COMPONENT_BASE_MENU_ELEMENT for Element); - impl ComponentTrait for Element { fn new() -> Self { Element::default() diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index 906cb638..2278a504 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -1,9 +1,10 @@ use crate::prelude::*; +use crate::CrateHandle; use super::Element; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Group { id : OptionId, weight : Weight, @@ -11,8 +12,6 @@ pub struct Group { elements : TypedComponents<Element>, } -impl_handle!(COMPONENT_BASE_MENU_GROUP for Group); - impl ComponentTrait for Group { fn new() -> Self { Group::default() diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index ec3edf02..42bcd935 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; use super::{Megamenu, Submenu}; @@ -22,7 +23,7 @@ pub enum ItemType { // Item. #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Item { weight : Weight, renderable : Renderable, @@ -32,8 +33,6 @@ pub struct Item { right_icon : OptionComponent<Icon>, } -impl_handle!(COMPONENT_BASE_MENU_ITEM for Item); - impl ComponentTrait for Item { fn new() -> Self { Item::default() diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index 7ec224d9..7415f97d 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -1,9 +1,10 @@ use crate::prelude::*; +use crate::CrateHandle; use super::Group; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Megamenu { id : OptionId, weight : Weight, @@ -11,8 +12,6 @@ pub struct Megamenu { groups : TypedComponents<Group>, } -impl_handle!(COMPONENT_BASE_MENU_MEGAMENU for Megamenu); - impl ComponentTrait for Megamenu { fn new() -> Self { Megamenu::default() diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index a670be8a..adb56e50 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -1,9 +1,10 @@ use crate::prelude::*; +use crate::CrateHandle; use super::Item; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Menu { id : OptionId, weight : Weight, @@ -11,8 +12,6 @@ pub struct Menu { items : TypedComponents<Item>, } -impl_handle!(COMPONENT_BASE_MENU for Menu); - impl ComponentTrait for Menu { fn new() -> Self { Menu::default() diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index caf3f1ec..2af93485 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -1,9 +1,10 @@ use crate::prelude::*; +use crate::CrateHandle; use super::Item; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Submenu { id : OptionId, weight : Weight, @@ -12,8 +13,6 @@ pub struct Submenu { items : TypedComponents<Item>, } -impl_handle!(COMPONENT_BASE_MENU_SUBMENU for Submenu); - impl ComponentTrait for Submenu { fn new() -> Self { Submenu::default() diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index dfa7a253..e4ce4ab7 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,7 +1,8 @@ use crate::prelude::*; +use crate::CrateHandle; #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Paragraph { id : OptionId, weight : Weight, @@ -11,8 +12,6 @@ pub struct Paragraph { stuff : AnyComponents, } -impl_handle!(COMPONENT_BASE_PARAGRAPH for Paragraph); - impl ComponentTrait for Paragraph { fn new() -> Self { Paragraph::default() @@ -46,17 +45,6 @@ impl ComponentTrait for Paragraph { } } -impl ComponentClasses for Paragraph { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Paragraph { pub fn with(component: impl ComponentTrait) -> Self { Paragraph::default().add_component(component) diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 0f0991b5..97b6af01 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; #[derive(Default, Eq, PartialEq)] pub enum PoweredByLogo { @@ -11,7 +12,7 @@ pub enum PoweredByLogo { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct PoweredBy { weight : Weight, renderable: Renderable, @@ -19,8 +20,6 @@ pub struct PoweredBy { logo : PoweredByLogo, } -impl_handle!(COMPONENT_BASE_POWEREDBY for PoweredBy); - impl ComponentTrait for PoweredBy { fn new() -> Self { let year = Utc::now().format("%Y").to_string(); diff --git a/pagetop/src/base/component/translate.rs b/pagetop/src/base/component/translate.rs index b32b1b64..bb6bb34e 100644 --- a/pagetop/src/base/component/translate.rs +++ b/pagetop/src/base/component/translate.rs @@ -1,10 +1,9 @@ use crate::prelude::*; +use crate::CrateHandle; -#[derive(SmartDefault)] +#[derive(CrateHandle, SmartDefault)] pub struct Translate(L10n); -impl_handle!(COMPONENT_BASE_TRANSLATE for Translate); - impl ComponentTrait for Translate { fn new() -> Self { Translate::default() diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 2cfa7fdc..72e9744c 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::CrateHandle; #[derive(SmartDefault)] pub enum WrapperType { @@ -11,7 +12,7 @@ pub enum WrapperType { } #[rustfmt::skip] -#[derive(SmartDefault)] +#[derive(ComponentClasses, CrateHandle, SmartDefault)] pub struct Wrapper { id : OptionId, weight : Weight, @@ -23,8 +24,6 @@ pub struct Wrapper { template : String, } -impl_handle!(COMPONENT_BASE_WRAPPER for Wrapper); - impl ComponentTrait for Wrapper { fn new() -> Self { Wrapper::default() @@ -83,17 +82,6 @@ impl ComponentTrait for Wrapper { } } -impl ComponentClasses for Wrapper { - fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { - self.classes.alter_value(op, classes); - self - } - - fn classes(&self) -> &OptionClasses { - &self.classes - } -} - impl Wrapper { pub fn header() -> Self { let mut c = Wrapper::default() diff --git a/pagetop/src/base/theme.rs b/pagetop/src/base/theme.rs index b78722b0..7b9b442f 100644 --- a/pagetop/src/base/theme.rs +++ b/pagetop/src/base/theme.rs @@ -1,8 +1,8 @@ mod basic; -pub use basic::{Basic, THEME_BASIC}; +pub use basic::Basic; mod chassis; -pub use chassis::{Chassis, THEME_CHASSIS}; +pub use chassis::Chassis; mod inception; -pub use inception::{Inception, THEME_INCEPTION}; +pub use inception::Inception; diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index 0a49642e..8e686915 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -1,9 +1,9 @@ use crate::prelude::*; +use crate::CrateHandle; +#[derive(CrateHandle)] pub struct Basic; -impl_handle!(THEME_BASIC for Basic); - impl ModuleTrait for Basic { fn name(&self) -> L10n { L10n::n("Basic") diff --git a/pagetop/src/base/theme/chassis.rs b/pagetop/src/base/theme/chassis.rs index f9da9574..844c24c7 100644 --- a/pagetop/src/base/theme/chassis.rs +++ b/pagetop/src/base/theme/chassis.rs @@ -1,9 +1,9 @@ use crate::prelude::*; +use crate::CrateHandle; +#[derive(CrateHandle)] pub struct Chassis; -impl_handle!(THEME_CHASSIS for Chassis); - impl ModuleTrait for Chassis { fn name(&self) -> L10n { L10n::n("Chassis") diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index 1454d5e1..cf70c998 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -1,9 +1,9 @@ use crate::prelude::*; +use crate::CrateHandle; +#[derive(CrateHandle)] pub struct Inception; -impl_handle!(THEME_INCEPTION for Inception); - impl ModuleTrait for Inception { fn name(&self) -> L10n { L10n::n("Inception") diff --git a/pagetop/src/core/action/definition.rs b/pagetop/src/core/action/definition.rs index a1c97db9..00841c35 100644 --- a/pagetop/src/core/action/definition.rs +++ b/pagetop/src/core/action/definition.rs @@ -1,4 +1,4 @@ -use crate::{Handle, HasHandle, Weight}; +use crate::{Handle, ImplementHandle, Weight}; use std::any::Any; @@ -6,7 +6,7 @@ pub trait ActionBase: Any { fn as_ref_any(&self) -> &dyn Any; } -pub trait ActionTrait: ActionBase + HasHandle + Send + Sync { +pub trait ActionTrait: ActionBase + ImplementHandle + Send + Sync { fn referer_handle(&self) -> Option<Handle> { None } diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index da7a59be..7843bab4 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -1,7 +1,7 @@ use crate::base::action; use crate::core::component::Context; use crate::html::{html, Markup, PrepareMarkup}; -use crate::{util, HasHandle, Weight}; +use crate::{util, ImplementHandle, Weight}; use std::any::Any; @@ -13,7 +13,7 @@ pub trait ComponentBase: Any { fn as_mut_any(&mut self) -> &mut dyn Any; } -pub trait ComponentTrait: ComponentBase + HasHandle + Send + Sync { +pub trait ComponentTrait: ComponentBase + ImplementHandle + Send + Sync { fn new() -> Self where Self: Sized; diff --git a/pagetop/src/core/module/definition.rs b/pagetop/src/core/module/definition.rs index a353c430..e033487b 100644 --- a/pagetop/src/core/module/definition.rs +++ b/pagetop/src/core/module/definition.rs @@ -1,7 +1,7 @@ use crate::core::action::Action; use crate::core::theme::ThemeRef; use crate::locale::L10n; -use crate::{actions, service, util, HasHandle}; +use crate::{actions, service, util, ImplementHandle}; #[cfg(feature = "database")] use crate::{db::MigrationItem, migrations}; @@ -13,7 +13,7 @@ pub trait ModuleBase { } /// Los módulos deben implementar este *trait*. -pub trait ModuleTrait: HasHandle + ModuleBase + Send + Sync { +pub trait ModuleTrait: ImplementHandle + ModuleBase + Send + Sync { fn name(&self) -> L10n { L10n::n(self.single_name()) } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 7ae2e736..c55189ea 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -44,15 +44,10 @@ //! ```rust //! use pagetop::prelude::*; //! +//! #[derive(AssignHandle)] //! struct HelloWorld; //! -//! impl_handle!(APP_HELLO_WORLD for HelloWorld); -//! //! impl ModuleTrait for HelloWorld { -//! fn handle(&self) -> Handle { -//! APP_HELLO_WORLD -//! } -//! //! fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { //! scfg.route("/", service::web::get().to(hello_world)); //! } @@ -113,7 +108,9 @@ pub use paste::paste; /// customized default values. pub use smart_default::SmartDefault; -pub use pagetop_macros::{fn_builder, main, test}; +pub use pagetop_macros::{fn_builder, main, test, AssignHandle, ComponentClasses}; + +pub(crate) use pagetop_macros::CrateHandle; // ************************************************************************************************* // GLOBAL. @@ -124,11 +121,15 @@ pub use static_files::Resource as StaticResource; pub type Handle = u64; -pub trait HasHandle { +pub trait ImplementHandle { fn static_handle() -> Handle where Self: Sized; + fn matches_handle(is: Handle) -> bool + where + Self: Sized; + fn handle(&self) -> Handle; } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 7f517184..ee6e9b2e 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -4,11 +4,11 @@ pub use crate::{concat_string, fn_builder, main, paste, test, SmartDefault}; // Global. -pub use crate::{Handle, HasHandle, HashMapResources, LazyStatic, Weight}; +pub use crate::{Handle, HashMapResources, ImplementHandle, LazyStatic, Weight}; // Functions and macro helpers. pub use crate::util; -pub use crate::{impl_handle, kv}; +pub use crate::{kv, AssignHandle, ComponentClasses}; // MACROS. diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 7c2fce9f..48f46fa0 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -1,7 +1,7 @@ mod error403; -pub use error403::ERROR_403; +pub use error403::Error403; mod error404; -pub use error404::ERROR_404; +pub use error404::Error404; use crate::locale::L10n; use crate::response::{page::Page, ResponseError}; diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index aa9cc41a..e5c80218 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,11 +1,10 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::impl_handle; +use crate::CrateHandle; +#[derive(CrateHandle)] pub struct Error403; -impl_handle!(ERROR_403 for Error403); - impl ComponentTrait for Error403 { fn new() -> Self { Self diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index e3a77aac..6000e9cc 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,11 +1,10 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::impl_handle; +use crate::CrateHandle; +#[derive(CrateHandle)] pub struct Error404; -impl_handle!(ERROR_404 for Error404); - impl ComponentTrait for Error404 { fn new() -> Self { Self diff --git a/pagetop/src/util.rs b/pagetop/src/util.rs index 3cf4301a..ff658da7 100644 --- a/pagetop/src/util.rs +++ b/pagetop/src/util.rs @@ -92,44 +92,6 @@ pub fn absolute_dir( // MACRO HELPERS. // ************************************************************************************************* -#[macro_export] -macro_rules! impl_handle { - ( $HANDLE:ident for $Element:ident ) => { - /// Constant handle to represent a unique PageTop building element. - pub const $HANDLE: $crate::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); - - impl $crate::HasHandle for $Element { - #[inline] - fn static_handle() -> $crate::Handle { - $HANDLE - } - - #[inline] - fn handle(&self) -> $crate::Handle { - $HANDLE - } - } - }; - ( $HANDLE:ident for $Element:ident<$Implement:ident> ) => { - /// Constant handle to represent a unique PageTop building element. - pub const $HANDLE: $crate::Handle = - $crate::util::handle(module_path!(), file!(), line!(), column!()); - - impl<I: $Implement> $crate::HasHandle for $Element<I> { - #[inline] - fn static_handle() -> $crate::Handle { - $HANDLE - } - - #[inline] - fn handle(&self) -> $crate::Handle { - $HANDLE - } - } - }; -} - #[macro_export] /// Macro para construir grupos de pares clave-valor. /// diff --git a/pagetop/tests/server/health_check.rs b/pagetop/tests/server/health_check.rs index 3f70b8e4..ba3df6de 100644 --- a/pagetop/tests/server/health_check.rs +++ b/pagetop/tests/server/health_check.rs @@ -1,9 +1,8 @@ use pagetop::prelude::*; +#[derive(AssignHandle)] struct HealthCheck; -impl_handle!(MODULE_TEST_SERVER_HEALTH_CHECK for HealthCheck); - impl ModuleTrait for HealthCheck {} #[pagetop::test] From 4662a4a07e18f464f42a1837eac2a90c9345d044 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:19:59 +0100 Subject: [PATCH 634/853] =?UTF-8?q?=F0=9F=94=96=20[macros]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-macros/Cargo.toml b/pagetop-macros/Cargo.toml index a49b5564..e6b24a45 100644 --- a/pagetop-macros/Cargo.toml +++ b/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.6" +version = "0.0.7" edition = "2021" authors = [ From 9130e3c4d1f5d078dd3230aa93ee7ad9453fb778 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:22:43 +0100 Subject: [PATCH 635/853] =?UTF-8?q?=F0=9F=94=96=20[pagetop]=20release=20de?= =?UTF-8?q?velopment=20version=200.0.48?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 5c6b9530..188598aa 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.47" +version = "0.0.48" edition = "2021" authors = [ From 3078483b48392c2c90dc9d5e5dbf46e9bad331a0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:25:43 +0100 Subject: [PATCH 636/853] =?UTF-8?q?=F0=9F=94=96=20[bootsier]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bootsier/Cargo.toml b/pagetop-bootsier/Cargo.toml index dab0ce49..e67037fe 100644 --- a/pagetop-bootsier/Cargo.toml +++ b/pagetop-bootsier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bootsier" -version = "0.0.12" +version = "0.0.13" edition = "2021" authors = [ From 9b6e6dcf6ecf762d7d6e1aa1a5cd250e6fe97a86 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:28:26 +0100 Subject: [PATCH 637/853] =?UTF-8?q?=F0=9F=94=96=20[bulmix]=20release=20dev?= =?UTF-8?q?elopment=20version=200.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bulmix/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-bulmix/Cargo.toml b/pagetop-bulmix/Cargo.toml index 97b244d5..e014cfde 100644 --- a/pagetop-bulmix/Cargo.toml +++ b/pagetop-bulmix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-bulmix" -version = "0.0.11" +version = "0.0.12" edition = "2021" authors = [ From 1256ce602291a7984f38714aca0fd7b8f0576ca9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:31:29 +0100 Subject: [PATCH 638/853] =?UTF-8?q?=F0=9F=94=96=20[homedemo]=20release=20d?= =?UTF-8?q?evelopment=20version=200.0.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-homedemo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-homedemo/Cargo.toml b/pagetop-homedemo/Cargo.toml index 037cc507..f2381557 100644 --- a/pagetop-homedemo/Cargo.toml +++ b/pagetop-homedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-homedemo" -version = "0.0.11" +version = "0.0.12" edition = "2021" authors = [ From 670067469befc3a0db51bd01f29b9ef06d93288f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:34:02 +0100 Subject: [PATCH 639/853] =?UTF-8?q?=F0=9F=94=96=20[admin]=20release=20deve?= =?UTF-8?q?lopment=20version=200.0.16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-admin/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-admin/Cargo.toml b/pagetop-admin/Cargo.toml index d35482e9..054302bd 100644 --- a/pagetop-admin/Cargo.toml +++ b/pagetop-admin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-admin" -version = "0.0.15" +version = "0.0.16" edition = "2021" authors = [ From b209eae0e1d6fe5bfd1cf8dcf3f3d36c9dbf66c8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:36:43 +0100 Subject: [PATCH 640/853] =?UTF-8?q?=F0=9F=94=96=20[user]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-user/Cargo.toml b/pagetop-user/Cargo.toml index e12ebd1c..46739909 100644 --- a/pagetop-user/Cargo.toml +++ b/pagetop-user/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-user" -version = "0.0.13" +version = "0.0.14" edition = "2021" authors = [ From 466723f7e9c07f1c8d32448e13b0e6b4924533c7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Nov 2023 21:39:50 +0100 Subject: [PATCH 641/853] =?UTF-8?q?=F0=9F=94=96=20[node]=20release=20devel?= =?UTF-8?q?opment=20version=200.0.16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pagetop-node/Cargo.toml b/pagetop-node/Cargo.toml index 670eef41..1f10aa37 100644 --- a/pagetop-node/Cargo.toml +++ b/pagetop-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-node" -version = "0.0.15" +version = "0.0.16" edition = "2021" authors = [ From e25cf3eecc009e06827329b5c0cfd1466fa8ff18 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 20 Nov 2023 18:30:23 +0100 Subject: [PATCH 642/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20CrateHandle=20t?= =?UTF-8?q?o=20BaseHandle=20for=20base=20dir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/src/lib.rs | 4 ++-- pagetop/src/base/action/component/after_prepare_component.rs | 4 ++-- pagetop/src/base/action/component/before_prepare_component.rs | 4 ++-- pagetop/src/base/action/page/after_prepare_body.rs | 4 ++-- pagetop/src/base/action/page/before_prepare_body.rs | 4 ++-- pagetop/src/base/component/block.rs | 4 ++-- pagetop/src/base/component/branding.rs | 4 ++-- pagetop/src/base/component/button.rs | 4 ++-- pagetop/src/base/component/flex/container.rs | 4 ++-- pagetop/src/base/component/flex/item.rs | 4 ++-- pagetop/src/base/component/form/button.rs | 4 ++-- pagetop/src/base/component/form/date.rs | 4 ++-- pagetop/src/base/component/form/form_main.rs | 4 ++-- pagetop/src/base/component/form/hidden.rs | 4 ++-- pagetop/src/base/component/form/input.rs | 4 ++-- pagetop/src/base/component/heading.rs | 4 ++-- pagetop/src/base/component/html.rs | 4 ++-- pagetop/src/base/component/icon.rs | 4 ++-- pagetop/src/base/component/image.rs | 4 ++-- pagetop/src/base/component/menu/element.rs | 4 ++-- pagetop/src/base/component/menu/group.rs | 4 ++-- pagetop/src/base/component/menu/item.rs | 4 ++-- pagetop/src/base/component/menu/megamenu.rs | 4 ++-- pagetop/src/base/component/menu/menu_main.rs | 4 ++-- pagetop/src/base/component/menu/submenu.rs | 4 ++-- pagetop/src/base/component/paragraph.rs | 4 ++-- pagetop/src/base/component/powered_by.rs | 4 ++-- pagetop/src/base/component/translate.rs | 4 ++-- pagetop/src/base/component/wrapper.rs | 4 ++-- pagetop/src/base/theme/basic.rs | 4 ++-- pagetop/src/base/theme/chassis.rs | 4 ++-- pagetop/src/base/theme/inception.rs | 4 ++-- pagetop/src/lib.rs | 2 +- pagetop/src/response/fatal_error/error403.rs | 4 ++-- pagetop/src/response/fatal_error/error404.rs | 4 ++-- 35 files changed, 69 insertions(+), 69 deletions(-) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index 8fc88251..ec1f9dfa 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -123,8 +123,8 @@ pub fn component_classes_derive(input: TokenStream) -> TokenStream { TokenStream::from(expanded) } -#[proc_macro_derive(CrateHandle, attributes(handle))] -pub fn crate_handle_derive(input: TokenStream) -> TokenStream { +#[proc_macro_derive(BaseHandle, attributes(handle))] +pub fn base_handle_derive(input: TokenStream) -> TokenStream { impl_handle(input, quote! { crate }) } diff --git a/pagetop/src/base/action/component/after_prepare_component.rs b/pagetop/src/base/action/component/after_prepare_component.rs index 479cd123..67828e28 100644 --- a/pagetop/src/base/action/component/after_prepare_component.rs +++ b/pagetop/src/base/action/component/after_prepare_component.rs @@ -1,9 +1,9 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::FnAction; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct AfterPrepareComponent<C: ComponentTrait> { f: FnAction<C>, referer_handle: Option<Handle>, diff --git a/pagetop/src/base/action/component/before_prepare_component.rs b/pagetop/src/base/action/component/before_prepare_component.rs index d81fe2d6..e4c876d1 100644 --- a/pagetop/src/base/action/component/before_prepare_component.rs +++ b/pagetop/src/base/action/component/before_prepare_component.rs @@ -1,9 +1,9 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::FnAction; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct BeforePrepareComponent<C: ComponentTrait> { f: FnAction<C>, referer_handle: Option<Handle>, diff --git a/pagetop/src/base/action/page/after_prepare_body.rs b/pagetop/src/base/action/page/after_prepare_body.rs index 78bcf391..7b677bc5 100644 --- a/pagetop/src/base/action/page/after_prepare_body.rs +++ b/pagetop/src/base/action/page/after_prepare_body.rs @@ -1,9 +1,9 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::FnActionPage; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct AfterPrepareBody { f: FnActionPage, weight: Weight, diff --git a/pagetop/src/base/action/page/before_prepare_body.rs b/pagetop/src/base/action/page/before_prepare_body.rs index b2f94c39..6debf70d 100644 --- a/pagetop/src/base/action/page/before_prepare_body.rs +++ b/pagetop/src/base/action/page/before_prepare_body.rs @@ -1,9 +1,9 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::FnActionPage; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct BeforePrepareBody { f: FnActionPage, weight: Weight, diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 4c1e409a..67953eff 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Block { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index 221a2f3d..c95f2bf8 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Branding { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index 3f43f21d..9778ce3e 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[derive(SmartDefault)] pub enum ButtonType { @@ -29,7 +29,7 @@ pub enum ButtonTarget { } #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Button { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index d2f5fb7c..d8846e2b 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Container { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 3d1ea0d4..802b214b 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Item { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/button.rs index d88dd19b..794e5318 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/button.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[derive(SmartDefault)] pub enum ButtonType { @@ -21,7 +21,7 @@ impl ToString for ButtonType { } #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Button { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index fbadfe15..88e2f0a2 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Date { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 7e7747b6..ce476583 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[derive(SmartDefault)] pub enum FormMethod { @@ -9,7 +9,7 @@ pub enum FormMethod { } #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Form { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 9ed4ef6d..7ea32da0 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Hidden { weight: Weight, name : OptionName, diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 0b62d969..f0df9aab 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[derive(SmartDefault)] pub enum InputType { @@ -13,7 +13,7 @@ pub enum InputType { } #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Input { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 8b969f52..70d45bbf 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[derive(SmartDefault)] pub enum HeadingType { @@ -40,7 +40,7 @@ impl ToString for HeadingDisplay { } #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Heading { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index 8477ca5e..ab9781ef 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -1,7 +1,7 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Html(Markup); impl ComponentTrait for Html { diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 9a945185..db5634a8 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Icon { weight : Weight, renderable: Renderable, diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 67657b02..2e8bf3dc 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; const IMG_FLUID: &str = "pt-img__fluid"; const IMG_FIXED: &str = "pt-img__fixed"; @@ -15,7 +15,7 @@ pub enum ImageSize { } #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Image { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index 04059f05..0ffcfa53 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::Submenu; @@ -17,7 +17,7 @@ pub enum ElementType { // Element. #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Element { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index 2278a504..9b80a546 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -1,10 +1,10 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::Element; #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Group { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 42bcd935..15e4db4b 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::{Megamenu, Submenu}; @@ -23,7 +23,7 @@ pub enum ItemType { // Item. #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Item { weight : Weight, renderable : Renderable, diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index 7415f97d..777f8ca1 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -1,10 +1,10 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::Group; #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Megamenu { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index adb56e50..d94eef94 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -1,10 +1,10 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::Item; #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Menu { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index 2af93485..457556a3 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -1,10 +1,10 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; use super::Item; #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Submenu { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index e4ce4ab7..0fba5006 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -1,8 +1,8 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Paragraph { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 97b6af01..8b6739fc 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[derive(Default, Eq, PartialEq)] pub enum PoweredByLogo { @@ -12,7 +12,7 @@ pub enum PoweredByLogo { } #[rustfmt::skip] -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct PoweredBy { weight : Weight, renderable: Renderable, diff --git a/pagetop/src/base/component/translate.rs b/pagetop/src/base/component/translate.rs index bb6bb34e..9731a3df 100644 --- a/pagetop/src/base/component/translate.rs +++ b/pagetop/src/base/component/translate.rs @@ -1,7 +1,7 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; -#[derive(CrateHandle, SmartDefault)] +#[derive(BaseHandle, SmartDefault)] pub struct Translate(L10n); impl ComponentTrait for Translate { diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 72e9744c..48f2eb36 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; #[derive(SmartDefault)] pub enum WrapperType { @@ -12,7 +12,7 @@ pub enum WrapperType { } #[rustfmt::skip] -#[derive(ComponentClasses, CrateHandle, SmartDefault)] +#[derive(BaseHandle, ComponentClasses, SmartDefault)] pub struct Wrapper { id : OptionId, weight : Weight, diff --git a/pagetop/src/base/theme/basic.rs b/pagetop/src/base/theme/basic.rs index 8e686915..87d2e713 100644 --- a/pagetop/src/base/theme/basic.rs +++ b/pagetop/src/base/theme/basic.rs @@ -1,7 +1,7 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct Basic; impl ModuleTrait for Basic { diff --git a/pagetop/src/base/theme/chassis.rs b/pagetop/src/base/theme/chassis.rs index 844c24c7..4619dc49 100644 --- a/pagetop/src/base/theme/chassis.rs +++ b/pagetop/src/base/theme/chassis.rs @@ -1,7 +1,7 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct Chassis; impl ModuleTrait for Chassis { diff --git a/pagetop/src/base/theme/inception.rs b/pagetop/src/base/theme/inception.rs index cf70c998..1ecda133 100644 --- a/pagetop/src/base/theme/inception.rs +++ b/pagetop/src/base/theme/inception.rs @@ -1,7 +1,7 @@ use crate::prelude::*; -use crate::CrateHandle; +use crate::BaseHandle; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct Inception; impl ModuleTrait for Inception { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index c55189ea..2f83a1fa 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -110,7 +110,7 @@ pub use smart_default::SmartDefault; pub use pagetop_macros::{fn_builder, main, test, AssignHandle, ComponentClasses}; -pub(crate) use pagetop_macros::CrateHandle; +pub(crate) use pagetop_macros::BaseHandle; // ************************************************************************************************* // GLOBAL. diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/response/fatal_error/error403.rs index e5c80218..906391ae 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/response/fatal_error/error403.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::CrateHandle; +use crate::BaseHandle; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct Error403; impl ComponentTrait for Error403 { diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/response/fatal_error/error404.rs index 6000e9cc..cd41b34c 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/response/fatal_error/error404.rs @@ -1,8 +1,8 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, PrepareMarkup}; -use crate::CrateHandle; +use crate::BaseHandle; -#[derive(CrateHandle)] +#[derive(BaseHandle)] pub struct Error404; impl ComponentTrait for Error404 { From 62b32ebcee3e6e50a133b3327715e8898603b31d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 20 Nov 2023 18:42:08 +0100 Subject: [PATCH 643/853] =?UTF-8?q?=F0=9F=9A=9A=20Errors=20403=20and=20404?= =?UTF-8?q?=20are=20base=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component.rs | 13 +++++++++++++ .../fatal_error => base/component}/error403.rs | 2 +- .../fatal_error => base/component}/error404.rs | 2 +- pagetop/src/response/fatal_error.rs | 10 +++------- 4 files changed, 18 insertions(+), 9 deletions(-) rename pagetop/src/{response/fatal_error => base/component}/error403.rs (96%) rename pagetop/src/{response/fatal_error => base/component}/error404.rs (96%) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 23048e55..65794739 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -136,21 +136,34 @@ pub mod flex; mod icon; pub use icon::Icon; + mod heading; pub use heading::{Heading, HeadingDisplay, HeadingType}; + mod paragraph; pub use paragraph::Paragraph; + mod button; pub use button::{Button, ButtonTarget, ButtonType}; + mod image; pub use image::{Image, ImageSize}; + mod block; pub use block::Block; + mod branding; pub use branding::Branding; + mod powered_by; pub use powered_by::{PoweredBy, PoweredByLogo}; +mod error403; +pub use error403::Error403; + +mod error404; +pub use error404::Error404; + pub mod menu; pub use menu::Menu; diff --git a/pagetop/src/response/fatal_error/error403.rs b/pagetop/src/base/component/error403.rs similarity index 96% rename from pagetop/src/response/fatal_error/error403.rs rename to pagetop/src/base/component/error403.rs index 906391ae..d5f64931 100644 --- a/pagetop/src/response/fatal_error/error403.rs +++ b/pagetop/src/base/component/error403.rs @@ -7,7 +7,7 @@ pub struct Error403; impl ComponentTrait for Error403 { fn new() -> Self { - Self + Error403 } fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { diff --git a/pagetop/src/response/fatal_error/error404.rs b/pagetop/src/base/component/error404.rs similarity index 96% rename from pagetop/src/response/fatal_error/error404.rs rename to pagetop/src/base/component/error404.rs index cd41b34c..3e6043a8 100644 --- a/pagetop/src/response/fatal_error/error404.rs +++ b/pagetop/src/base/component/error404.rs @@ -7,7 +7,7 @@ pub struct Error404; impl ComponentTrait for Error404 { fn new() -> Self { - Self + Error404 } fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 48f46fa0..819445ed 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -1,8 +1,4 @@ -mod error403; -pub use error403::Error403; -mod error404; -pub use error404::Error404; - +use crate::base::component::{Error403, Error404}; use crate::locale::L10n; use crate::response::{page::Page, ResponseError}; use crate::service::http::{header::ContentType, StatusCode}; @@ -33,7 +29,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) - .with_in("content", error403::Error403) + .with_in("content", Error403) .with_template("error") .render() { @@ -47,7 +43,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) - .with_in("content", error404::Error404) + .with_in("content", Error404) .with_template("error") .render() { From 15d545897b243809b6d93a176686886846e3fac9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 20 Nov 2023 20:03:24 +0100 Subject: [PATCH 644/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Bet?= =?UTF-8?q?ter=20names=20for=20with/alter/add=5Fcomponent=5Fin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/basics/hello-name/src/main.rs | 2 +- examples/basics/hello-world/src/main.rs | 2 +- pagetop-admin/src/summary.rs | 4 ++-- pagetop-homedemo/src/lib.rs | 10 +++++----- pagetop-user/src/lib.rs | 2 +- pagetop/src/core/theme/regions.rs | 14 +++++++------- pagetop/src/lib.rs | 2 +- pagetop/src/response/fatal_error.rs | 4 ++-- pagetop/src/response/page.rs | 9 +++++++-- 9 files changed, 27 insertions(+), 22 deletions(-) diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index e248d7ff..03bef647 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -16,7 +16,7 @@ async fn hello_name( ) -> ResultPage<Markup, FatalError> { let name = path.into_inner(); Page::new(request) - .with_in("content", Html::with(html! { h1 { "Hello " (name) "!" } })) + .with_component_in("content", Html::with(html! { h1 { "Hello " (name) "!" } })) .render() } diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 95b28647..788da31a 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -11,7 +11,7 @@ impl ModuleTrait for HelloWorld { async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) - .with_in("content", Html::with(html! { h1 { "Hello World!" } })) + .with_component_in("content", Html::with(html! { h1 { "Hello World!" } })) .render() } diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index f61ee3ee..497eb630 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -153,8 +153,8 @@ pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalE Page::new(request) //.with_context(ContextOp::Theme("Bootsier")) .with_title(L10n::n("Admin")) - .with_in("top-menu", side_menu) - .with_in( + .with_component_in("top-menu", side_menu) + .with_component_in( "content", flex::Container::new() .add_item(flex::Item::new().add_component(Html::with(html! { diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 71ff5294..765620c0 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -29,11 +29,11 @@ async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { "/homedemo/css/styles.css", ))) .with_body_classes(ClassesOp::Add, "default-homepage") - .with_in("content", hello_world()) - .with_in("content", welcome()) - .with_in("content", about_pagetop()) - .with_in("content", promo_pagetop()) - .with_in("content", reporting_issues()) + .with_component_in("content", hello_world()) + .with_component_in("content", welcome()) + .with_component_in("content", about_pagetop()) + .with_component_in("content", promo_pagetop()) + .with_component_in("content", reporting_issues()) .render() } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index ba308b38..726b3cd1 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -33,7 +33,7 @@ impl ModuleTrait for User { async fn login(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { Page::new(request) .with_title(L10n::n("Identificación del usuario")) - .with_in( + .with_component_in( "content", Wrapper::new() .with_id("welcome") diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index 688a6553..c6410c48 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -17,11 +17,11 @@ pub struct ComponentsRegions(HashMap<&'static str, AnyComponents>); impl ComponentsRegions { pub fn new(region: &'static str, arc: ArcAnyComponent) -> Self { let mut regions = ComponentsRegions::default(); - regions.add_in(region, arc); + regions.add_component_in(region, arc); regions } - pub fn add_in(&mut self, region: &'static str, arc: ArcAnyComponent) { + pub fn add_component_in(&mut self, region: &'static str, arc: ArcAnyComponent) { if let Some(region) = self.0.get_mut(region) { region.alter_value(ArcAnyOp::Add(arc)); } else { @@ -31,8 +31,8 @@ impl ComponentsRegions { pub fn get_components(&self, theme: ThemeRef, region: &str) -> AnyComponents { let common = COMMON_REGIONS.read().unwrap(); - if let Some(hm) = THEME_REGIONS.read().unwrap().get(&theme.handle()) { - AnyComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)]) + if let Some(r) = THEME_REGIONS.read().unwrap().get(&theme.handle()) { + AnyComponents::merge(&[common.0.get(region), self.0.get(region), r.0.get(region)]) } else { AnyComponents::merge(&[common.0.get(region), self.0.get(region)]) } @@ -47,12 +47,12 @@ pub enum Region { pub fn add_component_in(region: Region, arc: ArcAnyComponent) { match region { Region::Named(name) => { - COMMON_REGIONS.write().unwrap().add_in(name, arc); + COMMON_REGIONS.write().unwrap().add_component_in(name, arc); } Region::OfTheme(theme, region) => { let mut regions = THEME_REGIONS.write().unwrap(); - if let Some(hm) = regions.get_mut(&theme.handle()) { - hm.add_in(region, arc); + if let Some(r) = regions.get_mut(&theme.handle()) { + r.add_component_in(region, arc); } else { regions.insert(theme.handle(), ComponentsRegions::new(region, arc)); } diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 2f83a1fa..c3d71e96 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -55,7 +55,7 @@ //! //! async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { //! Page::new(request) -//! .with_in("content", Html::with(html! { h1 { "Hello World!" } })) +//! .with_component_in("content", Html::with(html! { h1 { "Hello World!" } })) //! .render() //! } //! diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/fatal_error.rs index 819445ed..5e572fb9 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/fatal_error.rs @@ -29,7 +29,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) - .with_in("content", Error403) + .with_component_in("content", Error403) .with_template("error") .render() { @@ -43,7 +43,7 @@ impl fmt::Display for FatalError { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) - .with_in("content", Error404) + .with_component_in("content", Error404) .with_template("error") .render() { diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 58882db1..9b84d3e2 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -94,8 +94,13 @@ impl Page { } #[fn_builder] - pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { - self.regions.add_in(region, ArcAnyComponent::new(component)); + pub fn alter_component_in( + &mut self, + region: &'static str, + component: impl ComponentTrait, + ) -> &mut Self { + self.regions + .add_component_in(region, ArcAnyComponent::new(component)); self } From a03472a2bcc028f5bdfb3f908b33cca31e12a1ee Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 20 Nov 2023 20:17:17 +0100 Subject: [PATCH 645/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/heading.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 70d45bbf..5d19a70b 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -68,7 +68,6 @@ impl ComponentTrait for Heading { (self.renderable.check)(cx) } - #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { self.add_classes(self.display().to_string()); } From dc4210bcb8805d3849d487d4e1263d9f692f6d26 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 20 Nov 2023 20:37:03 +0100 Subject: [PATCH 646/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20macro=20AssignH?= =?UTF-8?q?andle=20to=20BindHandle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drust/src/main.rs | 2 +- examples/basics/hello-name/src/main.rs | 2 +- examples/basics/hello-world/src/main.rs | 2 +- pagetop-admin/src/lib.rs | 2 +- pagetop-bootsier/src/lib.rs | 2 +- pagetop-bulmix/src/lib.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-macros/src/lib.rs | 4 ++-- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/lib.rs | 4 ++-- pagetop/src/prelude.rs | 2 +- pagetop/tests/server/health_check.rs | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/drust/src/main.rs b/drust/src/main.rs index 87973883..76eb9426 100644 --- a/drust/src/main.rs +++ b/drust/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -#[derive(AssignHandle)] +#[derive(BindHandle)] struct Drust; impl ModuleTrait for Drust { diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index 03bef647..9670965e 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -#[derive(AssignHandle)] +#[derive(BindHandle)] struct HelloName; impl ModuleTrait for HelloName { diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 788da31a..50f61973 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -#[derive(AssignHandle)] +#[derive(BindHandle)] struct HelloWorld; impl ModuleTrait for HelloWorld { diff --git a/pagetop-admin/src/lib.rs b/pagetop-admin/src/lib.rs index acf69fa6..26c66c66 100644 --- a/pagetop-admin/src/lib.rs +++ b/pagetop-admin/src/lib.rs @@ -4,7 +4,7 @@ static_locales!(LOCALES_ADMIN); mod summary; -#[derive(AssignHandle)] +#[derive(BindHandle)] pub struct Admin; impl ModuleTrait for Admin { diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 52c52e4b..87bfebd9 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -4,7 +4,7 @@ static_locales!(LOCALES_BOOTSIER); static_files!(bootsier); -#[derive(AssignHandle)] +#[derive(BindHandle)] pub struct Bootsier; impl ModuleTrait for Bootsier { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 123facc9..79294c2b 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; static_files!(bulmix); -#[derive(AssignHandle)] +#[derive(BindHandle)] pub struct Bulmix; impl ModuleTrait for Bulmix { diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 765620c0..4b645c5b 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -4,7 +4,7 @@ static_locales!(LOCALES_HOMEDEMO); static_files!(homedemo); -#[derive(AssignHandle)] +#[derive(BindHandle)] pub struct HomeDemo; impl ModuleTrait for HomeDemo { diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index ec1f9dfa..0b5b3cd1 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -128,8 +128,8 @@ pub fn base_handle_derive(input: TokenStream) -> TokenStream { impl_handle(input, quote! { crate }) } -#[proc_macro_derive(AssignHandle, attributes(handle))] -pub fn assign_handle_derive(input: TokenStream) -> TokenStream { +#[proc_macro_derive(BindHandle, attributes(handle))] +pub fn bind_handle_derive(input: TokenStream) -> TokenStream { impl_handle(input, quote! { pagetop }) } diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 9201f5d8..f994a696 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -5,7 +5,7 @@ static_locales!(LOCALES_NODE); //mod entity; mod migration; -#[derive(AssignHandle)] +#[derive(BindHandle)] pub struct Node; impl ModuleTrait for Node { diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 726b3cd1..b273495c 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -4,7 +4,7 @@ static_locales!(LOCALES_USER); mod migration; -#[derive(AssignHandle)] +#[derive(BindHandle)] pub struct User; impl ModuleTrait for User { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index c3d71e96..7fc3d7a7 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -44,7 +44,7 @@ //! ```rust //! use pagetop::prelude::*; //! -//! #[derive(AssignHandle)] +//! #[derive(BindHandle)] //! struct HelloWorld; //! //! impl ModuleTrait for HelloWorld { @@ -108,7 +108,7 @@ pub use paste::paste; /// customized default values. pub use smart_default::SmartDefault; -pub use pagetop_macros::{fn_builder, main, test, AssignHandle, ComponentClasses}; +pub use pagetop_macros::{fn_builder, main, test, BindHandle, ComponentClasses}; pub(crate) use pagetop_macros::BaseHandle; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index ee6e9b2e..9c2d949c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -8,7 +8,7 @@ pub use crate::{Handle, HashMapResources, ImplementHandle, LazyStatic, Weight}; // Functions and macro helpers. pub use crate::util; -pub use crate::{kv, AssignHandle, ComponentClasses}; +pub use crate::{kv, BindHandle, ComponentClasses}; // MACROS. diff --git a/pagetop/tests/server/health_check.rs b/pagetop/tests/server/health_check.rs index ba3df6de..0d3543ae 100644 --- a/pagetop/tests/server/health_check.rs +++ b/pagetop/tests/server/health_check.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -#[derive(AssignHandle)] +#[derive(BindHandle)] struct HealthCheck; impl ModuleTrait for HealthCheck {} From 7a9a98347db9399347771875631632ab4f1802a8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 21 Nov 2023 20:13:25 +0100 Subject: [PATCH 647/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/flex/container.rs | 8 ++++---- pagetop/src/base/component/flex/item.rs | 10 +++++----- pagetop/src/base/component/icon.rs | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index d8846e2b..608b41bd 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -36,10 +36,10 @@ impl ComponentTrait for Container { fn setup_before_prepare(&mut self, cx: &mut Context) { self.prepend_classes( [ - self.direction.to_string(), - self.wrap_align.to_string(), - self.content_justify.to_string(), - self.items_align.to_string(), + self.direction().to_string(), + self.wrap_align().to_string(), + self.content_justify().to_string(), + self.items_align().to_string(), ] .join(" "), ); diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 802b214b..761c4b4e 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -38,11 +38,11 @@ impl ComponentTrait for Item { self.prepend_classes( [ "pt-flex__item".to_owned(), - self.item_grow.to_string(), - self.item_shrink.to_string(), - self.item_size.to_string(), - self.item_offset.to_string(), - self.item_align.to_string(), + self.grow().to_string(), + self.shrink().to_string(), + self.size().to_string(), + self.offset().to_string(), + self.align().to_string(), ] .join(" "), ); diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index db5634a8..1ed95e56 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -26,7 +26,7 @@ impl ComponentTrait for Icon { #[rustfmt::skip] fn setup_before_prepare(&mut self, cx: &mut Context) { - if let Some(icon_name) = self.icon_name.get() { + if let Some(icon_name) = self.icon_name().get() { self.prepend_classes( concat_string!("bi-", icon_name, " ", self.font_size().to_string()), ); From 04aa309fc576f64a7882850ff8231658b01ed47d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 21 Nov 2023 20:18:16 +0100 Subject: [PATCH 648/853] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Optimize=20builder?= =?UTF-8?q?=20methods=20for=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index 0b5b3cd1..41597849 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -57,6 +57,7 @@ pub fn fn_builder(_attr: TokenStream, item: TokenStream) -> TokenStream { let expanded = quote! { #fn_with + #[inline] #fn_alter }; expanded.into() From 3fd05643b39088df2cd0bc0c24ac9461ebc50986 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 21 Nov 2023 21:20:47 +0100 Subject: [PATCH 649/853] =?UTF-8?q?=F0=9F=9A=A7=20Redefine=20action=20butt?= =?UTF-8?q?ons=20for=20forms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-user/src/lib.rs | 2 +- pagetop/src/base/component/button.rs | 54 +++++----- pagetop/src/base/component/form.rs | 7 +- .../form/{button.rs => action_button.rs} | 101 +++++++++++------- pagetop/src/locale/en-US/base.ftl | 4 + pagetop/src/locale/es-ES/base.ftl | 4 + pagetop/static/base/css/buttons.css | 3 + 7 files changed, 109 insertions(+), 66 deletions(-) rename pagetop/src/base/component/form/{button.rs => action_button.rs} (59%) diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index b273495c..4bc46ec1 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -61,5 +61,5 @@ fn form_login() -> Form { .with_label(L10n::t("password", &LOCALES_USER)) .with_help_text(L10n::t("password_help", &LOCALES_USER)), ) - .with_element(form::Button::submit(L10n::t("login", &LOCALES_USER))) + .with_element(form::ActionButton::submit().with_value(L10n::t("login", &LOCALES_USER))) } diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index 9778ce3e..c98e76ec 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -12,8 +12,8 @@ pub enum ButtonType { impl ToString for ButtonType { fn to_string(&self) -> String { String::from(match self { - ButtonType::Link => "pt-button__link", - ButtonType::Primary => "pt-button__primary", + ButtonType::Link => "link", + ButtonType::Primary => "primary", }) } } @@ -37,10 +37,10 @@ pub struct Button { classes : OptionClasses, button_type: ButtonType, font_size : FontSize, - href : OptionString, - html : OptionTranslated, left_icon : OptionComponent<Icon>, right_icon : OptionComponent<Icon>, + href : OptionString, + html : OptionTranslated, target : ButtonTarget, } @@ -63,7 +63,11 @@ impl ComponentTrait for Button { fn setup_before_prepare(&mut self, _cx: &mut Context) { self.prepend_classes( - [self.button_type().to_string(), self.font_size().to_string()].join(" "), + [ + concat_string!("pt-button__", self.button_type().to_string()), + self.font_size().to_string(), + ] + .join(" "), ); } @@ -138,18 +142,6 @@ impl Button { self } - #[fn_builder] - pub fn alter_href(&mut self, href: impl Into<String>) -> &mut Self { - self.href.alter_value(href); - self - } - - #[fn_builder] - pub fn alter_html(&mut self, html: L10n) -> &mut Self { - self.html.alter_value(html); - self - } - #[fn_builder] pub fn alter_left_icon(&mut self, icon: Option<Icon>) -> &mut Self { self.left_icon.alter_value(icon); @@ -162,6 +154,18 @@ impl Button { self } + #[fn_builder] + pub fn alter_href(&mut self, href: impl Into<String>) -> &mut Self { + self.href.alter_value(href); + self + } + + #[fn_builder] + pub fn alter_html(&mut self, html: L10n) -> &mut Self { + self.html.alter_value(html); + self + } + #[fn_builder] pub fn alter_target(&mut self, target: ButtonTarget) -> &mut Self { self.target = target; @@ -178,14 +182,6 @@ impl Button { &self.font_size } - pub fn href(&self) -> &OptionString { - &self.href - } - - pub fn html(&self) -> &OptionTranslated { - &self.html - } - pub fn left_icon(&self) -> &OptionComponent<Icon> { &self.left_icon } @@ -194,6 +190,14 @@ impl Button { &self.right_icon } + pub fn href(&self) -> &OptionString { + &self.href + } + + pub fn html(&self) -> &OptionTranslated { + &self.html + } + pub fn target(&self) -> &ButtonTarget { &self.target } diff --git a/pagetop/src/base/component/form.rs b/pagetop/src/base/component/form.rs index 04f882cc..bb5dd943 100644 --- a/pagetop/src/base/component/form.rs +++ b/pagetop/src/base/component/form.rs @@ -3,9 +3,12 @@ pub use form_main::{Form, FormMethod}; mod input; pub use input::{Input, InputType}; + mod hidden; pub use hidden::Hidden; + mod date; pub use date::Date; -mod button; -pub use button::{Button, ButtonType}; + +mod action_button; +pub use action_button::{ActionButton, ActionButtonType}; diff --git a/pagetop/src/base/component/form/button.rs b/pagetop/src/base/component/form/action_button.rs similarity index 59% rename from pagetop/src/base/component/form/button.rs rename to pagetop/src/base/component/form/action_button.rs index 794e5318..f5fc0ee5 100644 --- a/pagetop/src/base/component/form/button.rs +++ b/pagetop/src/base/component/form/action_button.rs @@ -2,41 +2,41 @@ use crate::prelude::*; use crate::BaseHandle; #[derive(SmartDefault)] -pub enum ButtonType { +pub enum ActionButtonType { #[default] - Button, Submit, Reset, } #[rustfmt::skip] -impl ToString for ButtonType { +impl ToString for ActionButtonType { fn to_string(&self) -> String { String::from(match self { - ButtonType::Button => "button", - ButtonType::Submit => "submit", - ButtonType::Reset => "reset", + ActionButtonType::Submit => "submit", + ActionButtonType::Reset => "reset", }) } } #[rustfmt::skip] #[derive(BaseHandle, ComponentClasses, SmartDefault)] -pub struct Button { +pub struct ActionButton { weight : Weight, renderable : Renderable, classes : OptionClasses, - button_type: ButtonType, + button_type: ActionButtonType, + font_size : FontSize, + left_icon : OptionComponent<Icon>, + right_icon : OptionComponent<Icon>, name : OptionString, value : OptionTranslated, autofocus : OptionString, disabled : OptionString, - template : String, } -impl ComponentTrait for Button { +impl ComponentTrait for ActionButton { fn new() -> Self { - Button::default() + ActionButton::submit() } fn weight(&self) -> Weight { @@ -47,10 +47,13 @@ impl ComponentTrait for Button { (self.renderable.check)(cx) } - #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { self.prepend_classes( - concat_string!("btn btn-primary form-", self.button_type.to_string()), + [ + concat_string!("pt-button__", self.button_type().to_string()), + self.font_size().to_string(), + ] + .join(" "), ); } @@ -66,27 +69,29 @@ impl ComponentTrait for Button { autofocus=[self.autofocus().get()] disabled=[self.disabled().get()] { - (self.value().escaped(cx.langid())) + (self.left_icon().render(cx)) + " " (self.value().escaped(cx.langid())) " " + (self.right_icon().render(cx)) } }) } } -impl Button { - pub fn with(value: L10n) -> Self { - Button::default().with_value(value) +impl ActionButton { + pub fn submit() -> Self { + ActionButton { + button_type: ActionButtonType::Submit, + value: OptionTranslated::new(L10n::l("button_submit")), + ..Default::default() + } } - pub fn submit(value: L10n) -> Self { - let mut button = Button::default().with_value(value); - button.button_type = ButtonType::Submit; - button - } - - pub fn reset(value: L10n) -> Self { - let mut button = Button::default().with_value(value); - button.button_type = ButtonType::Reset; - button + pub fn reset() -> Self { + ActionButton { + button_type: ActionButtonType::Reset, + value: OptionTranslated::new(L10n::l("button_reset")), + ..Default::default() + } } // Button BUILDER. @@ -103,6 +108,24 @@ impl Button { self } + #[fn_builder] + pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { + self.font_size = font_size; + self + } + + #[fn_builder] + pub fn alter_left_icon(&mut self, icon: Option<Icon>) -> &mut Self { + self.left_icon.alter_value(icon); + self + } + + #[fn_builder] + pub fn alter_right_icon(&mut self, icon: Option<Icon>) -> &mut Self { + self.right_icon.alter_value(icon); + self + } + #[fn_builder] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); @@ -133,18 +156,24 @@ impl Button { self } - #[fn_builder] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Button GETTERS. - pub fn button_type(&self) -> &ButtonType { + pub fn button_type(&self) -> &ActionButtonType { &self.button_type } + pub fn font_size(&self) -> &FontSize { + &self.font_size + } + + pub fn left_icon(&self) -> &OptionComponent<Icon> { + &self.left_icon + } + + pub fn right_icon(&self) -> &OptionComponent<Icon> { + &self.right_icon + } + pub fn name(&self) -> &OptionString { &self.name } @@ -160,8 +189,4 @@ impl Button { pub fn disabled(&self) -> &OptionString { &self.disabled } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop/src/locale/en-US/base.ftl b/pagetop/src/locale/en-US/base.ftl index 200ae5d1..9ec4803b 100644 --- a/pagetop/src/locale/en-US/base.ftl +++ b/pagetop/src/locale/en-US/base.ftl @@ -7,3 +7,7 @@ pagetop_logo = PageTop logo # Menu component. menu_toggle = Toggle menu visibility + +# Form components. +button_submit = Submit +button_reset = Reset diff --git a/pagetop/src/locale/es-ES/base.ftl b/pagetop/src/locale/es-ES/base.ftl index ee6d2544..953d891c 100644 --- a/pagetop/src/locale/es-ES/base.ftl +++ b/pagetop/src/locale/es-ES/base.ftl @@ -7,3 +7,7 @@ pagetop_logo = Logotipo de PageTop # Menu component. menu_toggle = Alternar visibilidad del menú + +# Form components. +button_submit = Enviar +button_reset = Reiniciar diff --git a/pagetop/static/base/css/buttons.css b/pagetop/static/base/css/buttons.css index b1b2dea4..3c644bd9 100644 --- a/pagetop/static/base/css/buttons.css +++ b/pagetop/static/base/css/buttons.css @@ -20,13 +20,16 @@ color: var(--pt-color--primary); } +.pt-button__submit, .pt-button__primary { background-color: var(--pt-color--primary); } +.pt-button__submit:hover, .pt-button__primary:hover { color: var(--pt-color--white); background-color: var(--pt-color--primary-dark); } +.pt-button__submit:active, .pt-button__primary:active { color: var(--pt-color--white); background-color: var(--pt-color--primary-light); From 9f25695298a8cf86f2e9cacb9cbd8b9f20574109 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 23 Nov 2023 20:29:29 +0100 Subject: [PATCH 650/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20HeadingDisplay?= =?UTF-8?q?=20to=20HeadingSize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 22 ++++++++-------- pagetop-bulmix/src/lib.rs | 6 ++--- pagetop-homedemo/src/lib.rs | 4 +-- pagetop/src/base/component.rs | 2 +- pagetop/src/base/component/heading.rs | 38 +++++++++++++-------------- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index 87bfebd9..c4c008db 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -136,21 +136,21 @@ impl ThemeTrait for Bootsier { } h if Heading::matches_handle(h) => { if let Some(h) = component_as_mut::<Heading>(component) { - match h.display() { - HeadingDisplay::ExtraLarge => { - h.replace_classes(h.display().to_string(), "display-1"); + match h.size() { + HeadingSize::ExtraLarge => { + h.replace_classes(h.size().to_string(), "display-1"); } - HeadingDisplay::XxLarge => { - h.replace_classes(h.display().to_string(), "display-2"); + HeadingSize::XxLarge => { + h.replace_classes(h.size().to_string(), "display-2"); } - HeadingDisplay::XLarge => { - h.replace_classes(h.display().to_string(), "display-3"); + HeadingSize::XLarge => { + h.replace_classes(h.size().to_string(), "display-3"); } - HeadingDisplay::Large => { - h.replace_classes(h.display().to_string(), "display-4"); + HeadingSize::Large => { + h.replace_classes(h.size().to_string(), "display-4"); } - HeadingDisplay::Medium => { - h.replace_classes(h.display().to_string(), "display-5"); + HeadingSize::Medium => { + h.replace_classes(h.size().to_string(), "display-5"); } _ => {} }; diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index 79294c2b..f4354df8 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -85,9 +85,9 @@ impl ThemeTrait for Bulmix { } h if Heading::matches_handle(h) => { if let Some(h) = component_as_mut::<Heading>(component) { - match h.display() { - HeadingDisplay::Subtitle => { - h.replace_classes(h.display().to_string(), "subtitle") + match h.size() { + HeadingSize::Subtitle => { + h.replace_classes(h.size().to_string(), "subtitle") } _ => h.add_classes("title"), }; diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index 4b645c5b..d1c023e5 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -47,7 +47,7 @@ fn hello_world() -> Wrapper { .with_size(flex::ItemSize::Percent40) .add_component( Heading::h1(L10n::t("page_title", &LOCALES_HOMEDEMO)) - .with_display(HeadingDisplay::Medium), + .with_size(HeadingSize::Medium), ) .add_component( Paragraph::translated(L10n::t("hello_intro", &LOCALES_HOMEDEMO).with_arg( @@ -107,7 +107,7 @@ fn welcome() -> Wrapper { &config::SETTINGS.app.name ), )) - .with_display(HeadingDisplay::Subtitle), + .with_size(HeadingSize::Subtitle), ) .add_component( Paragraph::translated(L10n::t("welcome_text1", &LOCALES_HOMEDEMO)) diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 65794739..4e183b99 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -138,7 +138,7 @@ mod icon; pub use icon::Icon; mod heading; -pub use heading::{Heading, HeadingDisplay, HeadingType}; +pub use heading::{Heading, HeadingSize, HeadingType}; mod paragraph; pub use paragraph::Paragraph; diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 5d19a70b..1325a820 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -13,7 +13,7 @@ pub enum HeadingType { } #[derive(SmartDefault)] -pub enum HeadingDisplay { +pub enum HeadingSize { ExtraLarge, XxLarge, XLarge, @@ -25,16 +25,16 @@ pub enum HeadingDisplay { } #[rustfmt::skip] -impl ToString for HeadingDisplay { +impl ToString for HeadingSize { fn to_string(&self) -> String { String::from(match self { - HeadingDisplay::ExtraLarge => "pt-heading__title-x3l", - HeadingDisplay::XxLarge => "pt-heading__title-x2l", - HeadingDisplay::XLarge => "pt-heading__title-xl", - HeadingDisplay::Large => "pt-heading__title-l", - HeadingDisplay::Medium => "pt-heading__title-m", - HeadingDisplay::Normal => "", - HeadingDisplay::Subtitle => "pt-heading__subtitle", + HeadingSize::ExtraLarge => "pt-heading__title-x3l", + HeadingSize::XxLarge => "pt-heading__title-x2l", + HeadingSize::XLarge => "pt-heading__title-xl", + HeadingSize::Large => "pt-heading__title-l", + HeadingSize::Medium => "pt-heading__title-m", + HeadingSize::Normal => "", + HeadingSize::Subtitle => "pt-heading__subtitle", }) } } @@ -47,8 +47,8 @@ pub struct Heading { renderable : Renderable, classes : OptionClasses, heading_type: HeadingType, + size : HeadingSize, text : OptionTranslated, - display : HeadingDisplay, } impl ComponentTrait for Heading { @@ -69,7 +69,7 @@ impl ComponentTrait for Heading { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.add_classes(self.display().to_string()); + self.add_classes(self.size().to_string()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -151,14 +151,14 @@ impl Heading { } #[fn_builder] - pub fn alter_text(&mut self, text: L10n) -> &mut Self { - self.text.alter_value(text); + pub fn alter_size(&mut self, size: HeadingSize) -> &mut Self { + self.size = size; self } #[fn_builder] - pub fn alter_display(&mut self, display: HeadingDisplay) -> &mut Self { - self.display = display; + pub fn alter_text(&mut self, text: L10n) -> &mut Self { + self.text.alter_value(text); self } @@ -168,11 +168,11 @@ impl Heading { &self.heading_type } + pub fn size(&self) -> &HeadingSize { + &self.size + } + pub fn text(&self) -> &OptionTranslated { &self.text } - - pub fn display(&self) -> &HeadingDisplay { - &self.display - } } From 8a797365e20ae6c42c43a082b66190fdebd2f4dc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 23 Nov 2023 20:31:22 +0100 Subject: [PATCH 651/853] =?UTF-8?q?=E2=9C=A8=20Add=20popular=20styles=20to?= =?UTF-8?q?=20buttons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-bootsier/src/lib.rs | 34 +- pagetop-bulmix/src/lib.rs | 34 +- pagetop-homedemo/src/lib.rs | 5 +- pagetop/src/base/component.rs | 33 +- pagetop/src/base/component/button.rs | 49 +- .../src/base/component/form/action_button.rs | 21 +- pagetop/static/base/css/buttons.css | 1185 +++++++++-------- pagetop/static/base/css/inception.css | 10 +- pagetop/static/base/css/menu.css | 6 +- pagetop/static/base/css/root.css | 73 +- 10 files changed, 799 insertions(+), 651 deletions(-) diff --git a/pagetop-bootsier/src/lib.rs b/pagetop-bootsier/src/lib.rs index c4c008db..8ffa4b7c 100644 --- a/pagetop-bootsier/src/lib.rs +++ b/pagetop-bootsier/src/lib.rs @@ -106,6 +106,32 @@ impl ThemeTrait for Bootsier { } h if Button::matches_handle(h) => { if let Some(b) = component_as_mut::<Button>(component) { + match b.style() { + ButtonStyle::Default => { + b.replace_classes(b.style().to_string(), "btn btn-primary"); + } + ButtonStyle::Info => { + b.replace_classes(b.style().to_string(), "btn btn-info"); + } + ButtonStyle::Success => { + b.replace_classes(b.style().to_string(), "btn btn-success"); + } + ButtonStyle::Warning => { + b.replace_classes(b.style().to_string(), "btn btn-warning"); + } + ButtonStyle::Danger => { + b.replace_classes(b.style().to_string(), "btn btn-danger"); + } + ButtonStyle::Light => { + b.replace_classes(b.style().to_string(), "btn btn-light"); + } + ButtonStyle::Dark => { + b.replace_classes(b.style().to_string(), "btn btn-dark"); + } + ButtonStyle::Link => { + b.replace_classes(b.style().to_string(), "btn btn-link"); + } + }; match b.font_size() { FontSize::ExtraLarge => { b.replace_classes(b.font_size().to_string(), "fs-1"); @@ -124,14 +150,6 @@ impl ThemeTrait for Bootsier { } _ => {} }; - match b.button_type() { - ButtonType::Link => { - b.replace_classes(b.button_type().to_string(), "btn btn-link"); - } - ButtonType::Primary => { - b.replace_classes(b.button_type().to_string(), "btn btn-primary"); - } - }; } } h if Heading::matches_handle(h) => { diff --git a/pagetop-bulmix/src/lib.rs b/pagetop-bulmix/src/lib.rs index f4354df8..6d7c0efb 100644 --- a/pagetop-bulmix/src/lib.rs +++ b/pagetop-bulmix/src/lib.rs @@ -55,6 +55,32 @@ impl ThemeTrait for Bulmix { } h if Button::matches_handle(h) => { if let Some(b) = component_as_mut::<Button>(component) { + match b.style() { + ButtonStyle::Default => { + b.replace_classes(b.style().to_string(), "button is-primary"); + } + ButtonStyle::Info => { + b.replace_classes(b.style().to_string(), "button is-info"); + } + ButtonStyle::Success => { + b.replace_classes(b.style().to_string(), "button is-success"); + } + ButtonStyle::Warning => { + b.replace_classes(b.style().to_string(), "button is-warning"); + } + ButtonStyle::Danger => { + b.replace_classes(b.style().to_string(), "button is-danger"); + } + ButtonStyle::Light => { + b.replace_classes(b.style().to_string(), "button is-light"); + } + ButtonStyle::Dark => { + b.replace_classes(b.style().to_string(), "button is-dark"); + } + ButtonStyle::Link => { + b.replace_classes(b.style().to_string(), "button is-text"); + } + }; match b.font_size() { FontSize::ExtraLarge => { b.replace_classes(b.font_size().to_string(), "is-size-1"); @@ -73,14 +99,6 @@ impl ThemeTrait for Bulmix { } _ => {} }; - match b.button_type() { - ButtonType::Link => { - b.replace_classes(b.button_type().to_string(), "button is-text"); - } - ButtonType::Primary => { - b.replace_classes(b.button_type().to_string(), "button is-primary"); - } - }; } } h if Heading::matches_handle(h) => { diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index d1c023e5..a54b5732 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -69,7 +69,7 @@ fn hello_world() -> Wrapper { ), )) .add_component( - Button::primary( + Button::anchor( "https://github.com/manuelcillero/pagetop", L10n::t("hello_code", &LOCALES_HOMEDEMO), ) @@ -79,7 +79,8 @@ fn hello_world() -> Wrapper { .with_font_size(FontSize::Medium), ) .add_component( - Button::link("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) + Button::anchor("#welcome", L10n::t("hello_welcome", &LOCALES_HOMEDEMO)) + .with_style(ButtonStyle::Link) .with_left_icon(Some(Icon::with("arrow-down-circle-fill"))) .with_classes(ClassesOp::Add, "welcome-link") .with_font_size(FontSize::Medium), diff --git a/pagetop/src/base/component.rs b/pagetop/src/base/component.rs index 4e183b99..51d8652a 100644 --- a/pagetop/src/base/component.rs +++ b/pagetop/src/base/component.rs @@ -88,6 +88,37 @@ impl ToString for BreakPoint { // ************************************************************************************************* +#[derive(SmartDefault)] +pub enum ButtonStyle { + #[default] + Default, + Info, + Success, + Warning, + Danger, + Light, + Dark, + Link, +} + +#[rustfmt::skip] +impl ToString for ButtonStyle { + fn to_string(&self) -> String { + String::from(match self { + ButtonStyle::Default => "pt-button__default", + ButtonStyle::Info => "pt-button__info", + ButtonStyle::Success => "pt-button__success", + ButtonStyle::Warning => "pt-button__warning", + ButtonStyle::Danger => "pt-button__danger", + ButtonStyle::Light => "pt-button__light", + ButtonStyle::Dark => "pt-button__dark", + ButtonStyle::Link => "pt-button__link", + }) + } +} + +// ************************************************************************************************* + #[derive(SmartDefault)] pub enum FontSize { ExtraLarge, @@ -144,7 +175,7 @@ mod paragraph; pub use paragraph::Paragraph; mod button; -pub use button::{Button, ButtonTarget, ButtonType}; +pub use button::{Button, ButtonTarget}; mod image; pub use image::{Image, ImageSize}; diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index c98e76ec..d9540078 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -1,23 +1,6 @@ use crate::prelude::*; use crate::BaseHandle; -#[derive(SmartDefault)] -pub enum ButtonType { - #[default] - Link, - Primary, -} - -#[rustfmt::skip] -impl ToString for ButtonType { - fn to_string(&self) -> String { - String::from(match self { - ButtonType::Link => "link", - ButtonType::Primary => "primary", - }) - } -} - #[derive(SmartDefault)] pub enum ButtonTarget { #[default] @@ -35,7 +18,7 @@ pub struct Button { weight : Weight, renderable : Renderable, classes : OptionClasses, - button_type: ButtonType, + style : ButtonStyle, font_size : FontSize, left_icon : OptionComponent<Icon>, right_icon : OptionComponent<Icon>, @@ -62,13 +45,7 @@ impl ComponentTrait for Button { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.prepend_classes( - [ - concat_string!("pt-button__", self.button_type().to_string()), - self.font_size().to_string(), - ] - .join(" "), - ); + self.prepend_classes([self.style().to_string(), self.font_size().to_string()].join(" ")); } #[rustfmt::skip] @@ -96,18 +73,8 @@ impl ComponentTrait for Button { } impl Button { - pub fn link(href: impl Into<String>, html: L10n) -> Self { - Button::default() - .with_type(ButtonType::Link) - .with_href(href) - .with_html(html) - } - - pub fn primary(href: impl Into<String>, html: L10n) -> Self { - Button::default() - .with_type(ButtonType::Primary) - .with_href(href) - .with_html(html) + pub fn anchor(href: impl Into<String>, html: L10n) -> Self { + Button::default().with_href(href).with_html(html) } // Button BUILDER. @@ -131,8 +98,8 @@ impl Button { } #[fn_builder] - pub fn alter_type(&mut self, button_type: ButtonType) -> &mut Self { - self.button_type = button_type; + pub fn alter_style(&mut self, style: ButtonStyle) -> &mut Self { + self.style = style; self } @@ -174,8 +141,8 @@ impl Button { // Button GETTERS. - pub fn button_type(&self) -> &ButtonType { - &self.button_type + pub fn style(&self) -> &ButtonStyle { + &self.style } pub fn font_size(&self) -> &FontSize { diff --git a/pagetop/src/base/component/form/action_button.rs b/pagetop/src/base/component/form/action_button.rs index f5fc0ee5..be7c72c9 100644 --- a/pagetop/src/base/component/form/action_button.rs +++ b/pagetop/src/base/component/form/action_button.rs @@ -25,6 +25,7 @@ pub struct ActionButton { renderable : Renderable, classes : OptionClasses, button_type: ActionButtonType, + style : ButtonStyle, font_size : FontSize, left_icon : OptionComponent<Icon>, right_icon : OptionComponent<Icon>, @@ -48,13 +49,7 @@ impl ComponentTrait for ActionButton { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.prepend_classes( - [ - concat_string!("pt-button__", self.button_type().to_string()), - self.font_size().to_string(), - ] - .join(" "), - ); + self.prepend_classes([self.style().to_string(), self.font_size().to_string()].join(" ")); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -81,6 +76,7 @@ impl ActionButton { pub fn submit() -> Self { ActionButton { button_type: ActionButtonType::Submit, + style: ButtonStyle::Default, value: OptionTranslated::new(L10n::l("button_submit")), ..Default::default() } @@ -89,6 +85,7 @@ impl ActionButton { pub fn reset() -> Self { ActionButton { button_type: ActionButtonType::Reset, + style: ButtonStyle::Info, value: OptionTranslated::new(L10n::l("button_reset")), ..Default::default() } @@ -108,6 +105,12 @@ impl ActionButton { self } + #[fn_builder] + pub fn alter_style(&mut self, style: ButtonStyle) -> &mut Self { + self.style = style; + self + } + #[fn_builder] pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { self.font_size = font_size; @@ -162,6 +165,10 @@ impl ActionButton { &self.button_type } + pub fn style(&self) -> &ButtonStyle { + &self.style + } + pub fn font_size(&self) -> &FontSize { &self.font_size } diff --git a/pagetop/static/base/css/buttons.css b/pagetop/static/base/css/buttons.css index 3c644bd9..14ac801a 100644 --- a/pagetop/static/base/css/buttons.css +++ b/pagetop/static/base/css/buttons.css @@ -2,7 +2,7 @@ cursor: pointer; text-align: center; display: inline-block; - color: var(--pt-color--white); + color: var(--pt-color--white); background-color: transparent; text-decoration: none; border: 1px solid transparent; @@ -16,1199 +16,1274 @@ margin: 0 var(--pt-gap-0-15); } +.pt-button__default { + background-color: var(--pt-color--default); +} +.pt-button__default:hover { + color: var(--pt-color--white); + background-color: var(--pt-color--default-dark); +} +.pt-button__default:active, +.pt-button__default:disabled { + color: var(--pt-color--white); + background-color: var(--pt-color--default-light); +} + +.pt-button__info { + background-color: var(--pt-color--info); +} +.pt-button__info:hover { + color: var(--pt-color--white); + background-color: var(--pt-color--info-dark); +} +.pt-button__info:active, +.pt-button__info:disabled { + color: var(--pt-color--white); + background-color: var(--pt-color--info-light); +} + +.pt-button__success { + background-color: var(--pt-color--success); +} +.pt-button__success:hover { + color: var(--pt-color--white); + background-color: var(--pt-color--success-dark); +} +.pt-button__success:active, +.pt-button__success:disabled { + color: var(--pt-color--white); + background-color: var(--pt-color--success-light); +} + +.pt-button__warning { + background-color: var(--pt-color--warning); +} +.pt-button__warning:hover { + color: var(--pt-color--white); + background-color: var(--pt-color--warning-dark); +} +.pt-button__warning:active, +.pt-button__warning:disabled { + color: var(--pt-color--white); + background-color: var(--pt-color--warning-light); +} + +.pt-button__danger { + background-color: var(--pt-color--danger); +} +.pt-button__danger:hover { + color: var(--pt-color--white); + background-color: var(--pt-color--danger-dark); +} +.pt-button__danger:active, +.pt-button__danger:disabled { + color: var(--pt-color--white); + background-color: var(--pt-color--danger-light); +} + +.pt-button__light { + color: var(--pt-color--text); + background-color: var(--pt-color--light); +} +.pt-button__light:hover { + color: var(--pt-color--text); + background-color: var(--pt-color--light-dark); +} +.pt-button__light:active, +.pt-button__light:disabled { + color: var(--pt-color--text); + background-color: var(--pt-color--light-light); +} + +.pt-button__dark { + background-color: var(--pt-color--dark); +} +.pt-button__dark:hover { + color: var(--pt-color--white); + background-color: var(--pt-color--dark-dark); +} +.pt-button__dark:active, +.pt-button__dark:disabled { + color: var(--pt-color--white); + background-color: var(--pt-color--dark-light); +} + .pt-button__link { - color: var(--pt-color--primary); + color: var(--pt-color--default); } -.pt-button__submit, -.pt-button__primary { - background-color: var(--pt-color--primary); -} -.pt-button__submit:hover, -.pt-button__primary:hover { - color: var(--pt-color--white); - background-color: var(--pt-color--primary-dark); -} -.pt-button__submit:active, -.pt-button__primary:active { - color: var(--pt-color--white); - background-color: var(--pt-color--primary-light); -} - - - /* .button strong { - color: inherit + color: inherit } .button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small { - height: 1.5em; - width: 1.5em + height: 1.5em; + width: 1.5em } .button .icon:first-child:not(:last-child) { - margin-left: calc(-.5em - 1px); - margin-right: .25em + margin-left: calc(-.5em - 1px); + margin-right: .25em } .button .icon:last-child:not(:first-child) { - margin-left: .25em; - margin-right: calc(-.5em - 1px) + margin-left: .25em; + margin-right: calc(-.5em - 1px) } .button .icon:first-child:last-child { - margin-left: calc(-.5em - 1px); - margin-right: calc(-.5em - 1px) + margin-left: calc(-.5em - 1px); + margin-right: calc(-.5em - 1px) } .button.is-hovered,.button:hover { - border-color: #b5b5b5; - color: #363636 + border-color: #b5b5b5; + color: #363636 } .button.is-focused,.button:focus { - border-color: #485fc7; - color: #363636 + border-color: #485fc7; + color: #363636 } .button.is-focused:not(:active),.button:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(72,95,199,.25) + box-shadow: 0 0 0 .125em rgba(72,95,199,.25) } .button.is-active,.button:active { - border-color: #4a4a4a; - color: #363636 + border-color: #4a4a4a; + color: #363636 } .button.is-text { - background-color: transparent; - border-color: transparent; - color: #4a4a4a; - text-decoration: underline + background-color: transparent; + border-color: transparent; + color: #4a4a4a; + text-decoration: underline } .button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover { - background-color: #f5f5f5; - color: #363636 + background-color: #f5f5f5; + color: #363636 } .button.is-text.is-active,.button.is-text:active { - background-color: #e8e8e8; - color: #363636 + background-color: #e8e8e8; + color: #363636 } .button.is-text[disabled],fieldset[disabled] .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none + background-color: transparent; + border-color: transparent; + box-shadow: none } .button.is-ghost { - background: 0 0; - border-color: transparent; - color: #485fc7; - text-decoration: none + background: 0 0; + border-color: transparent; + color: #485fc7; + text-decoration: none } .button.is-ghost.is-hovered,.button.is-ghost:hover { - color: #485fc7; - text-decoration: underline + color: #485fc7; + text-decoration: underline } .button.is-white { - background-color: #fff; - border-color: transparent; - color: #0a0a0a + background-color: #fff; + border-color: transparent; + color: #0a0a0a } .button.is-white.is-hovered,.button.is-white:hover { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a } .button.is-white.is-focused,.button.is-white:focus { - border-color: transparent; - color: #0a0a0a + border-color: transparent; + color: #0a0a0a } .button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(255,255,255,.25) + box-shadow: 0 0 0 .125em rgba(255,255,255,.25) } .button.is-white.is-active,.button.is-white:active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a } .button.is-white[disabled],fieldset[disabled] .button.is-white { - background-color: #fff; - border-color: #fff; - box-shadow: none + background-color: #fff; + border-color: #fff; + box-shadow: none } .button.is-white.is-inverted { - background-color: #0a0a0a; - color: #fff + background-color: #0a0a0a; + color: #fff } .button.is-white.is-inverted.is-hovered,.button.is-white.is-inverted:hover { - background-color: #000 + background-color: #000 } .button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: #fff + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: #fff } .button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a!important + border-color: transparent transparent #0a0a0a #0a0a0a!important } .button.is-white.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff + background-color: transparent; + border-color: #fff; + color: #fff } .button.is-white.is-outlined.is-focused,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover { - background-color: #fff; - border-color: #fff; - color: #0a0a0a + background-color: #fff; + border-color: #fff; + color: #0a0a0a } .button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-white.is-outlined.is-loading.is-focused::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading:hover::after { - border-color: transparent transparent #0a0a0a #0a0a0a!important + border-color: transparent transparent #0a0a0a #0a0a0a!important } .button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a } .button.is-white.is-inverted.is-outlined.is-focused,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover { - background-color: #0a0a0a; - color: #fff + background-color: #0a0a0a; + color: #fff } .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a } .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: #fff + background-color: #0a0a0a; + border-color: transparent; + color: #fff } .button.is-black.is-hovered,.button.is-black:hover { - background-color: #040404; - border-color: transparent; - color: #fff + background-color: #040404; + border-color: transparent; + color: #fff } .button.is-black.is-focused,.button.is-black:focus { - border-color: transparent; - color: #fff + border-color: transparent; + color: #fff } .button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(10,10,10,.25) + box-shadow: 0 0 0 .125em rgba(10,10,10,.25) } .button.is-black.is-active,.button.is-black:active { - background-color: #000; - border-color: transparent; - color: #fff + background-color: #000; + border-color: transparent; + color: #fff } .button.is-black[disabled],fieldset[disabled] .button.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - box-shadow: none + background-color: #0a0a0a; + border-color: #0a0a0a; + box-shadow: none } .button.is-black.is-inverted { - background-color: #fff; - color: #0a0a0a + background-color: #fff; + color: #0a0a0a } .button.is-black.is-inverted.is-hovered,.button.is-black.is-inverted:hover { - background-color: #f2f2f2 + background-color: #f2f2f2 } .button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #0a0a0a + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0a0a0a } .button.is-black.is-loading::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a } .button.is-black.is-outlined.is-focused,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: #fff + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #fff } .button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a!important + border-color: transparent transparent #0a0a0a #0a0a0a!important } .button.is-black.is-outlined.is-loading.is-focused::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a } .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff + background-color: transparent; + border-color: #fff; + color: #fff } .button.is-black.is-inverted.is-outlined.is-focused,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover { - background-color: #fff; - color: #0a0a0a + background-color: #fff; + color: #0a0a0a } .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #0a0a0a #0a0a0a!important + border-color: transparent transparent #0a0a0a #0a0a0a!important } .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } .button.is-light { - background-color: #f5f5f5; - border-color: transparent; - color: rgba(0,0,0,.7) + background-color: #f5f5f5; + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-light.is-hovered,.button.is-light:hover { - background-color: #eee; - border-color: transparent; - color: rgba(0,0,0,.7) + background-color: #eee; + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-light.is-focused,.button.is-light:focus { - border-color: transparent; - color: rgba(0,0,0,.7) + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(245,245,245,.25) + box-shadow: 0 0 0 .125em rgba(245,245,245,.25) } .button.is-light.is-active,.button.is-light:active { - background-color: #e8e8e8; - border-color: transparent; - color: rgba(0,0,0,.7) + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-light[disabled],fieldset[disabled] .button.is-light { - background-color: #f5f5f5; - border-color: #f5f5f5; - box-shadow: none + background-color: #f5f5f5; + border-color: #f5f5f5; + box-shadow: none } .button.is-light.is-inverted { - background-color: rgba(0,0,0,.7); - color: #f5f5f5 + background-color: rgba(0,0,0,.7); + color: #f5f5f5 } .button.is-light.is-inverted.is-hovered,.button.is-light.is-inverted:hover { - background-color: rgba(0,0,0,.7) + background-color: rgba(0,0,0,.7) } .button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted { - background-color: rgba(0,0,0,.7); - border-color: transparent; - box-shadow: none; - color: #f5f5f5 + background-color: rgba(0,0,0,.7); + border-color: transparent; + box-shadow: none; + color: #f5f5f5 } .button.is-light.is-loading::after { - border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important } .button.is-light.is-outlined { - background-color: transparent; - border-color: #f5f5f5; - color: #f5f5f5 + background-color: transparent; + border-color: #f5f5f5; + color: #f5f5f5 } .button.is-light.is-outlined.is-focused,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover { - background-color: #f5f5f5; - border-color: #f5f5f5; - color: rgba(0,0,0,.7) + background-color: #f5f5f5; + border-color: #f5f5f5; + color: rgba(0,0,0,.7) } .button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent #f5f5f5 #f5f5f5!important + border-color: transparent transparent #f5f5f5 #f5f5f5!important } .button.is-light.is-outlined.is-loading.is-focused::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading:hover::after { - border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important } .button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined { - background-color: transparent; - border-color: #f5f5f5; - box-shadow: none; - color: #f5f5f5 + background-color: transparent; + border-color: #f5f5f5; + box-shadow: none; + color: #f5f5f5 } .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0,0,0,.7); - color: rgba(0,0,0,.7) + background-color: transparent; + border-color: rgba(0,0,0,.7); + color: rgba(0,0,0,.7) } .button.is-light.is-inverted.is-outlined.is-focused,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover { - background-color: rgba(0,0,0,.7); - color: #f5f5f5 + background-color: rgba(0,0,0,.7); + color: #f5f5f5 } .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #f5f5f5 #f5f5f5!important + border-color: transparent transparent #f5f5f5 #f5f5f5!important } .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0,0,0,.7); - box-shadow: none; - color: rgba(0,0,0,.7) + background-color: transparent; + border-color: rgba(0,0,0,.7); + box-shadow: none; + color: rgba(0,0,0,.7) } .button.is-dark { - background-color: #363636; - border-color: transparent; - color: #fff + background-color: #363636; + border-color: transparent; + color: #fff } .button.is-dark.is-hovered,.button.is-dark:hover { - background-color: #2f2f2f; - border-color: transparent; - color: #fff + background-color: #2f2f2f; + border-color: transparent; + color: #fff } .button.is-dark.is-focused,.button.is-dark:focus { - border-color: transparent; - color: #fff + border-color: transparent; + color: #fff } .button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(54,54,54,.25) + box-shadow: 0 0 0 .125em rgba(54,54,54,.25) } .button.is-dark.is-active,.button.is-dark:active { - background-color: #292929; - border-color: transparent; - color: #fff + background-color: #292929; + border-color: transparent; + color: #fff } .button.is-dark[disabled],fieldset[disabled] .button.is-dark { - background-color: #363636; - border-color: #363636; - box-shadow: none + background-color: #363636; + border-color: #363636; + box-shadow: none } .button.is-dark.is-inverted { - background-color: #fff; - color: #363636 + background-color: #fff; + color: #363636 } .button.is-dark.is-inverted.is-hovered,.button.is-dark.is-inverted:hover { - background-color: #f2f2f2 + background-color: #f2f2f2 } .button.is-dark.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #363636 + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636 } .button.is-dark.is-loading::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-dark.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636 + background-color: transparent; + border-color: #363636; + color: #363636 } .button.is-dark.is-outlined.is-focused,.button.is-dark.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover { - background-color: #363636; - border-color: #363636; - color: #fff + background-color: #363636; + border-color: #363636; + color: #fff } .button.is-dark.is-outlined.is-loading::after { - border-color: transparent transparent #363636 #363636!important + border-color: transparent transparent #363636 #363636!important } .button.is-dark.is-outlined.is-loading.is-focused::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-dark.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636 + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636 } .button.is-dark.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff + background-color: transparent; + border-color: #fff; + color: #fff } .button.is-dark.is-inverted.is-outlined.is-focused,.button.is-dark.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover { - background-color: #fff; - color: #363636 + background-color: #fff; + color: #363636 } .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #363636 #363636!important + border-color: transparent transparent #363636 #363636!important } .button.is-dark.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } */ /* -.pt-button__primary[disabled],fieldset[disabled] .pt-button__primary { - background-color: #00d1b2; - border-color: #00d1b2; - box-shadow: none +.pt-button__default[disabled],fieldset[disabled] .pt-button__default { + background-color: #00d1b2; + border-color: #00d1b2; + box-shadow: none } -.pt-button__primary.is-inverted { - background-color: #fff; - color: #00d1b2 +.pt-button__default.is-inverted { + background-color: #fff; + color: #00d1b2 } -.pt-button__primary.is-inverted.is-hovered,.pt-button__primary.is-inverted:hover { - background-color: #f2f2f2 +.pt-button__default.is-inverted.is-hovered,.pt-button__default.is-inverted:hover { + background-color: #f2f2f2 } -.pt-button__primary.is-inverted[disabled],fieldset[disabled] .pt-button__primary.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #00d1b2 +.pt-button__default.is-inverted[disabled],fieldset[disabled] .pt-button__default.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #00d1b2 } -.pt-button__primary.is-loading::after { - border-color: transparent transparent #fff #fff!important +.pt-button__default.is-loading::after { + border-color: transparent transparent #fff #fff!important } -.pt-button__primary.is-outlined { - background-color: transparent; - border-color: #00d1b2; - color: #00d1b2 +.pt-button__default.is-outlined { + background-color: transparent; + border-color: #00d1b2; + color: #00d1b2 } -.pt-button__primary.is-outlined.is-focused,.pt-button__primary.is-outlined.is-hovered,.pt-button__primary.is-outlined:focus,.pt-button__primary.is-outlined:hover { - background-color: #00d1b2; - border-color: #00d1b2; - color: #fff +.pt-button__default.is-outlined.is-focused,.pt-button__default.is-outlined.is-hovered,.pt-button__default.is-outlined:focus,.pt-button__default.is-outlined:hover { + background-color: #00d1b2; + border-color: #00d1b2; + color: #fff } -.pt-button__primary.is-outlined.is-loading::after { - border-color: transparent transparent #00d1b2 #00d1b2!important +.pt-button__default.is-outlined.is-loading::after { + border-color: transparent transparent #00d1b2 #00d1b2!important } -.pt-button__primary.is-outlined.is-loading.is-focused::after,.pt-button__primary.is-outlined.is-loading.is-hovered::after,.pt-button__primary.is-outlined.is-loading:focus::after,.pt-button__primary.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important +.pt-button__default.is-outlined.is-loading.is-focused::after,.pt-button__default.is-outlined.is-loading.is-hovered::after,.pt-button__default.is-outlined.is-loading:focus::after,.pt-button__default.is-outlined.is-loading:hover::after { + border-color: transparent transparent #fff #fff!important } -.pt-button__primary.is-outlined[disabled],fieldset[disabled] .pt-button__primary.is-outlined { - background-color: transparent; - border-color: #00d1b2; - box-shadow: none; - color: #00d1b2 +.pt-button__default.is-outlined[disabled],fieldset[disabled] .pt-button__default.is-outlined { + background-color: transparent; + border-color: #00d1b2; + box-shadow: none; + color: #00d1b2 } -.pt-button__primary.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff +.pt-button__default.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff } -.pt-button__primary.is-inverted.is-outlined.is-focused,.pt-button__primary.is-inverted.is-outlined.is-hovered,.pt-button__primary.is-inverted.is-outlined:focus,.pt-button__primary.is-inverted.is-outlined:hover { - background-color: #fff; - color: #00d1b2 +.pt-button__default.is-inverted.is-outlined.is-focused,.pt-button__default.is-inverted.is-outlined.is-hovered,.pt-button__default.is-inverted.is-outlined:focus,.pt-button__default.is-inverted.is-outlined:hover { + background-color: #fff; + color: #00d1b2 } -.pt-button__primary.is-inverted.is-outlined.is-loading.is-focused::after,.pt-button__primary.is-inverted.is-outlined.is-loading.is-hovered::after,.pt-button__primary.is-inverted.is-outlined.is-loading:focus::after,.pt-button__primary.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #00d1b2 #00d1b2!important +.pt-button__default.is-inverted.is-outlined.is-loading.is-focused::after,.pt-button__default.is-inverted.is-outlined.is-loading.is-hovered::after,.pt-button__default.is-inverted.is-outlined.is-loading:focus::after,.pt-button__default.is-inverted.is-outlined.is-loading:hover::after { + border-color: transparent transparent #00d1b2 #00d1b2!important } -.pt-button__primary.is-inverted.is-outlined[disabled],fieldset[disabled] .pt-button__primary.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff +.pt-button__default.is-inverted.is-outlined[disabled],fieldset[disabled] .pt-button__default.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } -.pt-button__primary.is-light { - background-color: #ebfffc; - color: #00947e +.pt-button__default.is-light { + background-color: #ebfffc; + color: #00947e } -.pt-button__primary.is-light.is-hovered,.pt-button__primary.is-light:hover { - background-color: #defffa; - border-color: transparent; - color: #00947e +.pt-button__default.is-light.is-hovered,.pt-button__default.is-light:hover { + background-color: #defffa; + border-color: transparent; + color: #00947e } -.pt-button__primary.is-light.is-active,.pt-button__primary.is-light:active { - background-color: #d1fff8; - border-color: transparent; - color: #00947e +.pt-button__default.is-light.is-active,.pt-button__default.is-light:active { + background-color: #d1fff8; + border-color: transparent; + color: #00947e } .button.is-link { - background-color: #485fc7; - border-color: transparent; - color: #fff + background-color: #485fc7; + border-color: transparent; + color: #fff } .button.is-link.is-hovered,.button.is-link:hover { - background-color: #3e56c4; - border-color: transparent; - color: #fff + background-color: #3e56c4; + border-color: transparent; + color: #fff } .button.is-link.is-focused,.button.is-link:focus { - border-color: transparent; - color: #fff + border-color: transparent; + color: #fff } .button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(72,95,199,.25) + box-shadow: 0 0 0 .125em rgba(72,95,199,.25) } .button.is-link.is-active,.button.is-link:active { - background-color: #3a51bb; - border-color: transparent; - color: #fff + background-color: #3a51bb; + border-color: transparent; + color: #fff } .button.is-link[disabled],fieldset[disabled] .button.is-link { - background-color: #485fc7; - border-color: #485fc7; - box-shadow: none + background-color: #485fc7; + border-color: #485fc7; + box-shadow: none } .button.is-link.is-inverted { - background-color: #fff; - color: #485fc7 + background-color: #fff; + color: #485fc7 } .button.is-link.is-inverted.is-hovered,.button.is-link.is-inverted:hover { - background-color: #f2f2f2 + background-color: #f2f2f2 } .button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #485fc7 + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #485fc7 } .button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-link.is-outlined { - background-color: transparent; - border-color: #485fc7; - color: #485fc7 + background-color: transparent; + border-color: #485fc7; + color: #485fc7 } .button.is-link.is-outlined.is-focused,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover { - background-color: #485fc7; - border-color: #485fc7; - color: #fff + background-color: #485fc7; + border-color: #485fc7; + color: #fff } .button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #485fc7 #485fc7!important + border-color: transparent transparent #485fc7 #485fc7!important } .button.is-link.is-outlined.is-loading.is-focused::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined { - background-color: transparent; - border-color: #485fc7; - box-shadow: none; - color: #485fc7 + background-color: transparent; + border-color: #485fc7; + box-shadow: none; + color: #485fc7 } .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff + background-color: transparent; + border-color: #fff; + color: #fff } .button.is-link.is-inverted.is-outlined.is-focused,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover { - background-color: #fff; - color: #485fc7 + background-color: #fff; + color: #485fc7 } .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #485fc7 #485fc7!important + border-color: transparent transparent #485fc7 #485fc7!important } .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } .button.is-link.is-light { - background-color: #eff1fa; - color: #3850b7 + background-color: #eff1fa; + color: #3850b7 } .button.is-link.is-light.is-hovered,.button.is-link.is-light:hover { - background-color: #e6e9f7; - border-color: transparent; - color: #3850b7 + background-color: #e6e9f7; + border-color: transparent; + color: #3850b7 } .button.is-link.is-light.is-active,.button.is-link.is-light:active { - background-color: #dce0f4; - border-color: transparent; - color: #3850b7 + background-color: #dce0f4; + border-color: transparent; + color: #3850b7 } .button.is-info { - background-color: #3e8ed0; - border-color: transparent; - color: #fff + background-color: #3e8ed0; + border-color: transparent; + color: #fff } .button.is-info.is-hovered,.button.is-info:hover { - background-color: #3488ce; - border-color: transparent; - color: #fff + background-color: #3488ce; + border-color: transparent; + color: #fff } .button.is-info.is-focused,.button.is-info:focus { - border-color: transparent; - color: #fff + border-color: transparent; + color: #fff } .button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(62,142,208,.25) + box-shadow: 0 0 0 .125em rgba(62,142,208,.25) } .button.is-info.is-active,.button.is-info:active { - background-color: #3082c5; - border-color: transparent; - color: #fff + background-color: #3082c5; + border-color: transparent; + color: #fff } .button.is-info[disabled],fieldset[disabled] .button.is-info { - background-color: #3e8ed0; - border-color: #3e8ed0; - box-shadow: none + background-color: #3e8ed0; + border-color: #3e8ed0; + box-shadow: none } .button.is-info.is-inverted { - background-color: #fff; - color: #3e8ed0 + background-color: #fff; + color: #3e8ed0 } .button.is-info.is-inverted.is-hovered,.button.is-info.is-inverted:hover { - background-color: #f2f2f2 + background-color: #f2f2f2 } .button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #3e8ed0 + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #3e8ed0 } .button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-info.is-outlined { - background-color: transparent; - border-color: #3e8ed0; - color: #3e8ed0 + background-color: transparent; + border-color: #3e8ed0; + color: #3e8ed0 } .button.is-info.is-outlined.is-focused,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover { - background-color: #3e8ed0; - border-color: #3e8ed0; - color: #fff + background-color: #3e8ed0; + border-color: #3e8ed0; + color: #fff } .button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #3e8ed0 #3e8ed0!important + border-color: transparent transparent #3e8ed0 #3e8ed0!important } .button.is-info.is-outlined.is-loading.is-focused::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined { - background-color: transparent; - border-color: #3e8ed0; - box-shadow: none; - color: #3e8ed0 + background-color: transparent; + border-color: #3e8ed0; + box-shadow: none; + color: #3e8ed0 } .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff + background-color: transparent; + border-color: #fff; + color: #fff } .button.is-info.is-inverted.is-outlined.is-focused,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover { - background-color: #fff; - color: #3e8ed0 + background-color: #fff; + color: #3e8ed0 } .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #3e8ed0 #3e8ed0!important + border-color: transparent transparent #3e8ed0 #3e8ed0!important } .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } .button.is-info.is-light { - background-color: #eff5fb; - color: #296fa8 + background-color: #eff5fb; + color: #296fa8 } .button.is-info.is-light.is-hovered,.button.is-info.is-light:hover { - background-color: #e4eff9; - border-color: transparent; - color: #296fa8 + background-color: #e4eff9; + border-color: transparent; + color: #296fa8 } .button.is-info.is-light.is-active,.button.is-info.is-light:active { - background-color: #dae9f6; - border-color: transparent; - color: #296fa8 + background-color: #dae9f6; + border-color: transparent; + color: #296fa8 } .button.is-success { - background-color: #48c78e; - border-color: transparent; - color: #fff + background-color: #48c78e; + border-color: transparent; + color: #fff } .button.is-success.is-hovered,.button.is-success:hover { - background-color: #3ec487; - border-color: transparent; - color: #fff + background-color: #3ec487; + border-color: transparent; + color: #fff } .button.is-success.is-focused,.button.is-success:focus { - border-color: transparent; - color: #fff + border-color: transparent; + color: #fff } .button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(72,199,142,.25) + box-shadow: 0 0 0 .125em rgba(72,199,142,.25) } .button.is-success.is-active,.button.is-success:active { - background-color: #3abb81; - border-color: transparent; - color: #fff + background-color: #3abb81; + border-color: transparent; + color: #fff } .button.is-success[disabled],fieldset[disabled] .button.is-success { - background-color: #48c78e; - border-color: #48c78e; - box-shadow: none + background-color: #48c78e; + border-color: #48c78e; + box-shadow: none } .button.is-success.is-inverted { - background-color: #fff; - color: #48c78e + background-color: #fff; + color: #48c78e } .button.is-success.is-inverted.is-hovered,.button.is-success.is-inverted:hover { - background-color: #f2f2f2 + background-color: #f2f2f2 } .button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #48c78e + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #48c78e } .button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-success.is-outlined { - background-color: transparent; - border-color: #48c78e; - color: #48c78e + background-color: transparent; + border-color: #48c78e; + color: #48c78e } .button.is-success.is-outlined.is-focused,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover { - background-color: #48c78e; - border-color: #48c78e; - color: #fff + background-color: #48c78e; + border-color: #48c78e; + color: #fff } .button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #48c78e #48c78e!important + border-color: transparent transparent #48c78e #48c78e!important } .button.is-success.is-outlined.is-loading.is-focused::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined { - background-color: transparent; - border-color: #48c78e; - box-shadow: none; - color: #48c78e + background-color: transparent; + border-color: #48c78e; + box-shadow: none; + color: #48c78e } .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff + background-color: transparent; + border-color: #fff; + color: #fff } .button.is-success.is-inverted.is-outlined.is-focused,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover { - background-color: #fff; - color: #48c78e + background-color: #fff; + color: #48c78e } .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #48c78e #48c78e!important + border-color: transparent transparent #48c78e #48c78e!important } .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } .button.is-success.is-light { - background-color: #effaf5; - color: #257953 + background-color: #effaf5; + color: #257953 } .button.is-success.is-light.is-hovered,.button.is-success.is-light:hover { - background-color: #e6f7ef; - border-color: transparent; - color: #257953 + background-color: #e6f7ef; + border-color: transparent; + color: #257953 } .button.is-success.is-light.is-active,.button.is-success.is-light:active { - background-color: #dcf4e9; - border-color: transparent; - color: #257953 + background-color: #dcf4e9; + border-color: transparent; + color: #257953 } .button.is-warning { - background-color: #ffe08a; - border-color: transparent; - color: rgba(0,0,0,.7) + background-color: #ffe08a; + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-warning.is-hovered,.button.is-warning:hover { - background-color: #ffdc7d; - border-color: transparent; - color: rgba(0,0,0,.7) + background-color: #ffdc7d; + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-warning.is-focused,.button.is-warning:focus { - border-color: transparent; - color: rgba(0,0,0,.7) + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(255,224,138,.25) + box-shadow: 0 0 0 .125em rgba(255,224,138,.25) } .button.is-warning.is-active,.button.is-warning:active { - background-color: #ffd970; - border-color: transparent; - color: rgba(0,0,0,.7) + background-color: #ffd970; + border-color: transparent; + color: rgba(0,0,0,.7) } .button.is-warning[disabled],fieldset[disabled] .button.is-warning { - background-color: #ffe08a; - border-color: #ffe08a; - box-shadow: none + background-color: #ffe08a; + border-color: #ffe08a; + box-shadow: none } .button.is-warning.is-inverted { - background-color: rgba(0,0,0,.7); - color: #ffe08a + background-color: rgba(0,0,0,.7); + color: #ffe08a } .button.is-warning.is-inverted.is-hovered,.button.is-warning.is-inverted:hover { - background-color: rgba(0,0,0,.7) + background-color: rgba(0,0,0,.7) } .button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted { - background-color: rgba(0,0,0,.7); - border-color: transparent; - box-shadow: none; - color: #ffe08a + background-color: rgba(0,0,0,.7); + border-color: transparent; + box-shadow: none; + color: #ffe08a } .button.is-warning.is-loading::after { - border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important } .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffe08a; - color: #ffe08a + background-color: transparent; + border-color: #ffe08a; + color: #ffe08a } .button.is-warning.is-outlined.is-focused,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover { - background-color: #ffe08a; - border-color: #ffe08a; - color: rgba(0,0,0,.7) + background-color: #ffe08a; + border-color: #ffe08a; + color: rgba(0,0,0,.7) } .button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ffe08a #ffe08a!important + border-color: transparent transparent #ffe08a #ffe08a!important } .button.is-warning.is-outlined.is-loading.is-focused::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading:hover::after { - border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important + border-color: transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important } .button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffe08a; - box-shadow: none; - color: #ffe08a + background-color: transparent; + border-color: #ffe08a; + box-shadow: none; + color: #ffe08a } .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0,0,0,.7); - color: rgba(0,0,0,.7) + background-color: transparent; + border-color: rgba(0,0,0,.7); + color: rgba(0,0,0,.7) } .button.is-warning.is-inverted.is-outlined.is-focused,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover { - background-color: rgba(0,0,0,.7); - color: #ffe08a + background-color: rgba(0,0,0,.7); + color: #ffe08a } .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #ffe08a #ffe08a!important + border-color: transparent transparent #ffe08a #ffe08a!important } .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0,0,0,.7); - box-shadow: none; - color: rgba(0,0,0,.7) + background-color: transparent; + border-color: rgba(0,0,0,.7); + box-shadow: none; + color: rgba(0,0,0,.7) } .button.is-warning.is-light { - background-color: #fffaeb; - color: #946c00 + background-color: #fffaeb; + color: #946c00 } .button.is-warning.is-light.is-hovered,.button.is-warning.is-light:hover { - background-color: #fff6de; - border-color: transparent; - color: #946c00 + background-color: #fff6de; + border-color: transparent; + color: #946c00 } .button.is-warning.is-light.is-active,.button.is-warning.is-light:active { - background-color: #fff3d1; - border-color: transparent; - color: #946c00 + background-color: #fff3d1; + border-color: transparent; + color: #946c00 } .button.is-danger { - background-color: #f14668; - border-color: transparent; - color: #fff + background-color: #f14668; + border-color: transparent; + color: #fff } .button.is-danger.is-hovered,.button.is-danger:hover { - background-color: #f03a5f; - border-color: transparent; - color: #fff + background-color: #f03a5f; + border-color: transparent; + color: #fff } .button.is-danger.is-focused,.button.is-danger:focus { - border-color: transparent; - color: #fff + border-color: transparent; + color: #fff } .button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active) { - box-shadow: 0 0 0 .125em rgba(241,70,104,.25) + box-shadow: 0 0 0 .125em rgba(241,70,104,.25) } .button.is-danger.is-active,.button.is-danger:active { - background-color: #ef2e55; - border-color: transparent; - color: #fff + background-color: #ef2e55; + border-color: transparent; + color: #fff } .button.is-danger[disabled],fieldset[disabled] .button.is-danger { - background-color: #f14668; - border-color: #f14668; - box-shadow: none + background-color: #f14668; + border-color: #f14668; + box-shadow: none } .button.is-danger.is-inverted { - background-color: #fff; - color: #f14668 + background-color: #fff; + color: #f14668 } .button.is-danger.is-inverted.is-hovered,.button.is-danger.is-inverted:hover { - background-color: #f2f2f2 + background-color: #f2f2f2 } .button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #f14668 + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #f14668 } .button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-danger.is-outlined { - background-color: transparent; - border-color: #f14668; - color: #f14668 + background-color: transparent; + border-color: #f14668; + color: #f14668 } .button.is-danger.is-outlined.is-focused,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover { - background-color: #f14668; - border-color: #f14668; - color: #fff + background-color: #f14668; + border-color: #f14668; + color: #fff } .button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #f14668 #f14668!important + border-color: transparent transparent #f14668 #f14668!important } .button.is-danger.is-outlined.is-loading.is-focused::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading:hover::after { - border-color: transparent transparent #fff #fff!important + border-color: transparent transparent #fff #fff!important } .button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined { - background-color: transparent; - border-color: #f14668; - box-shadow: none; - color: #f14668 + background-color: transparent; + border-color: #f14668; + box-shadow: none; + color: #f14668 } .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff + background-color: transparent; + border-color: #fff; + color: #fff } .button.is-danger.is-inverted.is-outlined.is-focused,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover { - background-color: #fff; - color: #f14668 + background-color: #fff; + color: #f14668 } .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading:hover::after { - border-color: transparent transparent #f14668 #f14668!important + border-color: transparent transparent #f14668 #f14668!important } .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff } .button.is-danger.is-light { - background-color: #feecf0; - color: #cc0f35 + background-color: #feecf0; + color: #cc0f35 } .button.is-danger.is-light.is-hovered,.button.is-danger.is-light:hover { - background-color: #fde0e6; - border-color: transparent; - color: #cc0f35 + background-color: #fde0e6; + border-color: transparent; + color: #cc0f35 } .button.is-danger.is-light.is-active,.button.is-danger.is-light:active { - background-color: #fcd4dc; - border-color: transparent; - color: #cc0f35 + background-color: #fcd4dc; + border-color: transparent; + color: #cc0f35 } */ \ No newline at end of file diff --git a/pagetop/static/base/css/inception.css b/pagetop/static/base/css/inception.css index 8c474b84..b21da2ea 100644 --- a/pagetop/static/base/css/inception.css +++ b/pagetop/static/base/css/inception.css @@ -8,7 +8,7 @@ body { font-size: var(--pt-fs--base); font-weight: var(--pt-fw--base); line-height: var(--pt-lh--base); - color: var(--pt-color); + color: var(--pt-color--text); background-color: var(--pt-color--bg); -webkit-text-size-adjust: 100%; -webkit-tap-highlight-color: transparent; @@ -62,14 +62,14 @@ p { } a { - color: var(--pt-color--primary); + color: var(--pt-color--default); transition: color .15s ease-in-out; } a:hover { - color: var(--pt-color--primary-dark); + color: var(--pt-color--default-dark); } a:active { - color: var(--pt-color--primary-light); + color: var(--pt-color--default-light); } /* LAYOUT */ @@ -95,7 +95,7 @@ a:active { #footer__inner { color: var(--pt-color--gray-65); background: var(--pt-color--gray-20); - padding: var(--pt-gap-3) 0 var(--pt-gap-12); + padding: calc(3 * var(--pt-gap)) 0 calc(12 * var(--pt-gap)); } #footer__inner a { color: var(--pt-color--white); diff --git a/pagetop/static/base/css/menu.css b/pagetop/static/base/css/menu.css index 18f64c72..a74155e0 100644 --- a/pagetop/static/base/css/menu.css +++ b/pagetop/static/base/css/menu.css @@ -37,7 +37,7 @@ .pt-menu__nav li > a { position: relative; font-weight: 500; - color: var(--pt-color); + color: var(--pt-color--text); text-rendering: optimizeLegibility; } .pt-menu__nav li > a { @@ -135,7 +135,7 @@ height: 2px; margin: 12.675% 0; border-radius: var(--pt-border-radius); - background: var(--pt-color); + background: var(--pt-color--text); } .pt-menu__nav { @@ -234,7 +234,7 @@ min-width: var(--pt-menu--item-height); height: var(--pt-menu--item-height); line-height: var(--pt-menu--item-height); - color: var(--pt-color); + color: var(--pt-color--text); cursor: pointer; display: flex; align-items: center; diff --git a/pagetop/static/base/css/root.css b/pagetop/static/base/css/root.css index 03c9efe2..b210b659 100644 --- a/pagetop/static/base/css/root.css +++ b/pagetop/static/base/css/root.css @@ -91,23 +91,51 @@ --pt-gap-0-75: calc(0.75 * var(--pt-gap)); --pt-gap-1-5: calc(1.5 * var(--pt-gap)); --pt-gap-2: calc(2 * var(--pt-gap)); - --pt-gap-2-5: calc(2.5 * var(--pt-gap)); - --pt-gap-3: calc(3 * var(--pt-gap)); - --pt-gap-4: calc(4 * var(--pt-gap)); - --pt-gap-5: calc(5 * var(--pt-gap)); - --pt-gap-6: calc(6 * var(--pt-gap)); - --pt-gap-7: calc(7 * var(--pt-gap)); - --pt-gap-8: calc(8 * var(--pt-gap)); - --pt-gap-9: calc(9 * var(--pt-gap)); - --pt-gap-10: calc(10 * var(--pt-gap)); - --pt-gap-11: calc(11 * var(--pt-gap)); - --pt-gap-12: calc(12 * var(--pt-gap)); - --pt-color--primary-hue: 216; - --pt-color--primary-sat: 98%; - --pt-color--primary-light: hsl(var(--pt-color--primary-hue), var(--pt-color--primary-sat), 60%); - --pt-color--primary-dark: hsl(var(--pt-color--primary-hue), var(--pt-color--primary-sat), 40%); - --pt-color--primary: hsl(var(--pt-color--primary-hue), var(--pt-color--primary-sat), 50%); + --pt-color--default-hue: 216; + --pt-color--default-sat: 60%; + --pt-color--default-light: hsl(var(--pt-color--default-hue), var(--pt-color--default-sat), 60%); + --pt-color--default-dark: hsl(var(--pt-color--default-hue), var(--pt-color--default-sat), 40%); + --pt-color--default: hsl(var(--pt-color--default-hue), var(--pt-color--default-sat), 50%); + + --pt-color--info-hue: 190; + --pt-color--info-sat: 90%; + --pt-color--info-light: hsl(var(--pt-color--info-hue), var(--pt-color--info-sat), 60%); + --pt-color--info-dark: hsl(var(--pt-color--info-hue), var(--pt-color--info-sat), 40%); + --pt-color--info: hsl(var(--pt-color--info-hue), var(--pt-color--info-sat), 50%); + + --pt-color--success-hue: 150; + --pt-color--success-sat: 50%; + --pt-color--success-light: hsl(var(--pt-color--success-hue), var(--pt-color--success-sat), 60%); + --pt-color--success-dark: hsl(var(--pt-color--success-hue), var(--pt-color--success-sat), 40%); + --pt-color--success: hsl(var(--pt-color--success-hue), var(--pt-color--success-sat), 50%); + + --pt-color--warning-hue: 44; + --pt-color--warning-sat: 100%; + --pt-color--warning-light: hsl(var(--pt-color--warning-hue), var(--pt-color--warning-sat), 60%); + --pt-color--warning-dark: hsl(var(--pt-color--warning-hue), var(--pt-color--warning-sat), 48%); + --pt-color--warning: hsl(var(--pt-color--warning-hue), var(--pt-color--warning-sat), 50%); + + --pt-color--danger-hue: 348; + --pt-color--danger-sat: 86%; + --pt-color--danger-light: hsl(var(--pt-color--danger-hue), var(--pt-color--danger-sat), 60%); + --pt-color--danger-dark: hsl(var(--pt-color--danger-hue), var(--pt-color--danger-sat), 40%); + --pt-color--danger: hsl(var(--pt-color--danger-hue), var(--pt-color--danger-sat), 50%); + + --pt-color--light-hue: 0; + --pt-color--light-sat: 0%; + --pt-color--light-light: hsl(var(--pt-color--light-hue), var(--pt-color--light-sat), 98%); + --pt-color--light-dark: hsl(var(--pt-color--light-hue), var(--pt-color--light-sat), 92%); + --pt-color--light: hsl(var(--pt-color--light-hue), var(--pt-color--light-sat), 96%); + + --pt-color--dark-hue: 0; + --pt-color--dark-sat: 0%; + --pt-color--dark-light: hsl(var(--pt-color--dark-hue), var(--pt-color--dark-sat), 40%); + --pt-color--dark-dark: hsl(var(--pt-color--dark-hue), var(--pt-color--dark-sat), 8%); + --pt-color--dark: hsl(var(--pt-color--dark-hue), var(--pt-color--dark-sat), 25%); + + + --pt-color--gray-hue: 201; --pt-color--gray-sat: 15%; @@ -122,9 +150,12 @@ --pt-color--gray-95: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 93%); --pt-color--gray-100: hsl(var(--pt-color--gray-hue), var(--pt-color--gray-sat), 97%); - --pt-color--white: #fff; + + + --pt-color--bg: #fafafa; - --pt-color: #212529; + --pt-color--text: #212529; + --pt-color--white: #fff; /* @@ -132,8 +163,8 @@ --color-text-neutral-soft: var(--color--gray-45); --color-text-neutral-medium: var(--color--gray-20); --color-text-neutral-loud: var(--color--gray-5); - --color-text-primary-medium: var(--pt-color--primary-40); - --color-text-primary-loud: var(--pt-color--primary-30); + --color-text-primary-medium: var(--pt-color--default-40); + --color-text-primary-loud: var(--pt-color--default-30); --color--black: #000; */ /* @@ -146,7 +177,7 @@ --pt-border-radius: 0.375rem; /* Menu component */ - --pt-menu--color-bg: var(--pt-color--gray-100); + --pt-menu--color-bg: var(--pt-color--bg); --pt-menu--color-highlight: #e91e63; --pt-menu--color-border: rgba(0, 0, 0, 0.1); --pt-menu--color-shadow: rgba(0, 0, 0, 0.06); From 68ed0f78b95bcba5959f7e0e0d4edf94114835be Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 23 Nov 2023 21:19:59 +0100 Subject: [PATCH 652/853] =?UTF-8?q?=F0=9F=9A=A7=20Code=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/src/lib.rs | 2 +- pagetop/src/core/component.rs | 2 +- pagetop/src/core/component/classes.rs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index 41597849..6b6eb3e8 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -109,7 +109,7 @@ pub fn component_classes_derive(input: TokenStream) -> TokenStream { let name = &input.ident; let expanded = quote! { - impl ComponentClasses for #name { + impl ImplementClasses for #name { fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.classes.alter_value(op, classes); self diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index 57be6b3d..d0ec8fdc 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -9,7 +9,7 @@ mod definition; pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; mod classes; -pub use classes::{ComponentClasses, ComponentClassesOp}; +pub use classes::{ImplementClasses, ImplementClassesOp}; mod arc_any; pub use arc_any::AnyComponents; diff --git a/pagetop/src/core/component/classes.rs b/pagetop/src/core/component/classes.rs index c58e9974..b267973b 100644 --- a/pagetop/src/core/component/classes.rs +++ b/pagetop/src/core/component/classes.rs @@ -1,6 +1,6 @@ use crate::html::{ClassesOp, OptionClasses}; -pub trait ComponentClassesOp { +pub trait ImplementClassesOp { fn with_classes(self, op: ClassesOp, classes: impl Into<String>) -> Self; fn add_classes(&mut self, classes: impl Into<String>) -> &mut Self; @@ -16,13 +16,13 @@ pub trait ComponentClassesOp { fn set_classes(&mut self, classes: impl Into<String>) -> &mut Self; } -pub trait ComponentClasses: ComponentClassesOp { +pub trait ImplementClasses: ImplementClassesOp { fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self; fn classes(&self) -> &OptionClasses; } -impl<C: ComponentClasses> ComponentClassesOp for C { +impl<C: ImplementClasses> ImplementClassesOp for C { fn with_classes(mut self, op: ClassesOp, classes: impl Into<String>) -> Self { self.alter_classes(op, classes); self From 09cb6bd7fa2bb04f4b5c1b42c939ab5f2558ca3d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Nov 2023 08:59:51 +0100 Subject: [PATCH 653/853] =?UTF-8?q?=F0=9F=9A=9A=20Better=20name=20for=20re?= =?UTF-8?q?sponse=20page=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/basics/hello-name/src/main.rs | 2 +- examples/basics/hello-world/src/main.rs | 2 +- pagetop-admin/src/summary.rs | 2 +- pagetop-homedemo/src/lib.rs | 2 +- pagetop-node/src/lib.rs | 2 +- pagetop-user/src/lib.rs | 2 +- pagetop/src/app.rs | 7 ++-- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 1 - pagetop/src/response.rs | 2 - pagetop/src/response/page.rs | 10 +++-- .../{fatal_error.rs => page/error.rs} | 38 ++++++++++--------- 12 files changed, 36 insertions(+), 36 deletions(-) rename pagetop/src/response/{fatal_error.rs => page/error.rs} (63%) diff --git a/examples/basics/hello-name/src/main.rs b/examples/basics/hello-name/src/main.rs index 9670965e..6d59d482 100644 --- a/examples/basics/hello-name/src/main.rs +++ b/examples/basics/hello-name/src/main.rs @@ -13,7 +13,7 @@ impl ModuleTrait for HelloName { async fn hello_name( request: service::HttpRequest, path: service::web::Path<String>, -) -> ResultPage<Markup, FatalError> { +) -> ResultPage<Markup, ErrorPage> { let name = path.into_inner(); Page::new(request) .with_component_in("content", Html::with(html! { h1 { "Hello " (name) "!" } })) diff --git a/examples/basics/hello-world/src/main.rs b/examples/basics/hello-world/src/main.rs index 50f61973..22ee8bf3 100644 --- a/examples/basics/hello-world/src/main.rs +++ b/examples/basics/hello-world/src/main.rs @@ -9,7 +9,7 @@ impl ModuleTrait for HelloWorld { } } -async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_component_in("content", Html::with(html! { h1 { "Hello World!" } })) .render() diff --git a/pagetop-admin/src/summary.rs b/pagetop-admin/src/summary.rs index 497eb630..bc4b19d8 100644 --- a/pagetop-admin/src/summary.rs +++ b/pagetop-admin/src/summary.rs @@ -2,7 +2,7 @@ use crate::LOCALES_ADMIN; use pagetop::prelude::*; -pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { +pub async fn summary(request: service::HttpRequest) -> ResultPage<Markup, ErrorPage> { let top_menu = Menu::new() .with_id("admin-menu-test") .add_item(menu::Item::label(L10n::t("module_name", &LOCALES_ADMIN))) diff --git a/pagetop-homedemo/src/lib.rs b/pagetop-homedemo/src/lib.rs index a54b5732..a8644494 100644 --- a/pagetop-homedemo/src/lib.rs +++ b/pagetop-homedemo/src/lib.rs @@ -22,7 +22,7 @@ impl ModuleTrait for HomeDemo { } } -async fn demo(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn demo(request: service::HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_title(L10n::t("page_title", &LOCALES_HOMEDEMO)) .with_context(ContextOp::AddStyleSheet(StyleSheet::at( diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index f994a696..26827674 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -35,7 +35,7 @@ impl ModuleTrait for Node { } } -async fn node(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn node(request: service::HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request).with_title(L10n::n("Nodo")).render() } diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index 4bc46ec1..7285b873 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -30,7 +30,7 @@ impl ModuleTrait for User { } } -async fn login(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { +async fn login(request: service::HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_title(L10n::n("Identificación del usuario")) .with_component_in( diff --git a/pagetop/src/app.rs b/pagetop/src/app.rs index 8e52a747..d4e4b1ed 100644 --- a/pagetop/src/app.rs +++ b/pagetop/src/app.rs @@ -4,8 +4,7 @@ mod figfont; use crate::core::{module, module::ModuleRef}; use crate::html::Markup; -use crate::response::fatal_error::FatalError; -use crate::response::page::ResultPage; +use crate::response::page::{ErrorPage, ResultPage}; use crate::{concat_string, config, locale, service, trace, LazyStatic}; #[cfg(feature = "database")] @@ -112,8 +111,8 @@ fn service_app() -> service::App< .default_service(service::web::route().to(service_not_found)) } -async fn service_not_found(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { - Err(FatalError::NotFound(request)) +async fn service_not_found(request: service::HttpRequest) -> ResultPage<Markup, ErrorPage> { + Err(ErrorPage::NotFound(request)) } fn show_banner() { diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index 7fc3d7a7..ecbda884 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -53,7 +53,7 @@ //! } //! } //! -//! async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, FatalError> { +//! async fn hello_world(request: service::HttpRequest) -> ResultPage<Markup, ErrorPage> { //! Page::new(request) //! .with_component_in("content", Html::with(html! { h1 { "Hello World!" } })) //! .render() diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 9c2d949c..935de58c 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -44,7 +44,6 @@ pub use crate::core::component::*; pub use crate::core::module::*; pub use crate::core::theme::*; -pub use crate::response::fatal_error::*; pub use crate::response::{page::*, redirect::*, ResponseError}; pub use crate::base::action; diff --git a/pagetop/src/response.rs b/pagetop/src/response.rs index 7878d767..72215229 100644 --- a/pagetop/src/response.rs +++ b/pagetop/src/response.rs @@ -5,5 +5,3 @@ pub use actix_web::ResponseError; pub mod page; pub mod redirect; - -pub mod fatal_error; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 9b84d3e2..66d7af37 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -1,3 +1,8 @@ +mod error; +pub use error::ErrorPage; + +pub use actix_web::Result as ResultPage; + use crate::base::action; use crate::core::component::{AnyComponents, ArcAnyComponent, ComponentTrait}; use crate::core::component::{Context, ContextOp}; @@ -5,13 +10,10 @@ use crate::core::theme::ComponentsRegions; use crate::html::{html, Markup, DOCTYPE}; use crate::html::{ClassesOp, Favicon, OptionClasses, OptionId, OptionTranslated}; use crate::locale::L10n; -use crate::response::fatal_error::FatalError; use crate::{fn_builder, service}; use unic_langid::CharacterDirection; -pub use actix_web::Result as ResultPage; - #[rustfmt::skip] pub struct Page { title : OptionTranslated, @@ -154,7 +156,7 @@ impl Page { // Page RENDER. - pub fn render(&mut self) -> ResultPage<Markup, FatalError> { + pub fn render(&mut self) -> ResultPage<Markup, ErrorPage> { // Theme actions before preparing the page body. self.context.theme().before_prepare_body(self); diff --git a/pagetop/src/response/fatal_error.rs b/pagetop/src/response/page/error.rs similarity index 63% rename from pagetop/src/response/fatal_error.rs rename to pagetop/src/response/page/error.rs index 5e572fb9..19d86e57 100644 --- a/pagetop/src/response/fatal_error.rs +++ b/pagetop/src/response/page/error.rs @@ -1,13 +1,15 @@ use crate::base::component::{Error403, Error404}; use crate::locale::L10n; -use crate::response::{page::Page, ResponseError}; +use crate::response::ResponseError; use crate::service::http::{header::ContentType, StatusCode}; use crate::service::{HttpRequest, HttpResponse}; +use super::Page; + use std::fmt; #[derive(Debug)] -pub enum FatalError { +pub enum ErrorPage { NotModified(HttpRequest), BadRequest(HttpRequest), AccessDenied(HttpRequest), @@ -17,15 +19,15 @@ pub enum FatalError { Timeout(HttpRequest), } -impl fmt::Display for FatalError { +impl fmt::Display for ErrorPage { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { // Error 304. - FatalError::NotModified(_) => write!(f, "Not Modified"), + ErrorPage::NotModified(_) => write!(f, "Not Modified"), // Error 400. - FatalError::BadRequest(_) => write!(f, "Bad Client Data"), + ErrorPage::BadRequest(_) => write!(f, "Bad Client Data"), // Error 403. - FatalError::AccessDenied(request) => { + ErrorPage::AccessDenied(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) @@ -39,7 +41,7 @@ impl fmt::Display for FatalError { } } // Error 404. - FatalError::NotFound(request) => { + ErrorPage::NotFound(request) => { let error_page = Page::new(request.clone()); if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) @@ -53,16 +55,16 @@ impl fmt::Display for FatalError { } } // Error 412. - FatalError::PreconditionFailed(_) => write!(f, "Precondition Failed"), + ErrorPage::PreconditionFailed(_) => write!(f, "Precondition Failed"), // Error 500. - FatalError::InternalError(_) => write!(f, "Internal Error"), + ErrorPage::InternalError(_) => write!(f, "Internal Error"), // Error 504. - FatalError::Timeout(_) => write!(f, "Timeout"), + ErrorPage::Timeout(_) => write!(f, "Timeout"), } } } -impl ResponseError for FatalError { +impl ResponseError for ErrorPage { fn error_response(&self) -> HttpResponse { HttpResponse::build(self.status_code()) .insert_header(ContentType::html()) @@ -72,13 +74,13 @@ impl ResponseError for FatalError { #[rustfmt::skip] fn status_code(&self) -> StatusCode { match self { - FatalError::NotModified(_) => StatusCode::NOT_MODIFIED, - FatalError::BadRequest(_) => StatusCode::BAD_REQUEST, - FatalError::AccessDenied(_) => StatusCode::FORBIDDEN, - FatalError::NotFound(_) => StatusCode::NOT_FOUND, - FatalError::PreconditionFailed(_) => StatusCode::PRECONDITION_FAILED, - FatalError::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR, - FatalError::Timeout(_) => StatusCode::GATEWAY_TIMEOUT, + ErrorPage::NotModified(_) => StatusCode::NOT_MODIFIED, + ErrorPage::BadRequest(_) => StatusCode::BAD_REQUEST, + ErrorPage::AccessDenied(_) => StatusCode::FORBIDDEN, + ErrorPage::NotFound(_) => StatusCode::NOT_FOUND, + ErrorPage::PreconditionFailed(_) => StatusCode::PRECONDITION_FAILED, + ErrorPage::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR, + ErrorPage::Timeout(_) => StatusCode::GATEWAY_TIMEOUT, } } } From 7cd056d7a9dabc83d68292398a36f790e1243443 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Nov 2023 10:45:41 +0100 Subject: [PATCH 654/853] =?UTF-8?q?=F0=9F=9A=9A=20Rename=20fn=5Fbuilder=20?= =?UTF-8?q?to=20a=20more=20explicit=20fn=5Fwith?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-macros/src/lib.rs | 2 +- pagetop/src/base/component/block.rs | 10 +++--- pagetop/src/base/component/branding.rs | 14 ++++---- pagetop/src/base/component/button.rs | 20 ++++++------ pagetop/src/base/component/flex/container.rs | 18 +++++------ pagetop/src/base/component/flex/item.rs | 20 ++++++------ .../src/base/component/form/action_button.rs | 20 ++++++------ pagetop/src/base/component/form/date.rs | 26 +++++++-------- pagetop/src/base/component/form/form_main.rs | 16 +++++----- pagetop/src/base/component/form/hidden.rs | 6 ++-- pagetop/src/base/component/form/input.rs | 32 +++++++++---------- pagetop/src/base/component/heading.rs | 12 +++---- pagetop/src/base/component/html.rs | 2 +- pagetop/src/base/component/icon.rs | 8 ++--- pagetop/src/base/component/image.rs | 10 +++--- pagetop/src/base/component/menu/element.rs | 4 +-- pagetop/src/base/component/menu/group.rs | 8 ++--- pagetop/src/base/component/menu/item.rs | 10 +++--- pagetop/src/base/component/menu/megamenu.rs | 8 ++--- pagetop/src/base/component/menu/menu_main.rs | 8 ++--- pagetop/src/base/component/menu/submenu.rs | 10 +++--- pagetop/src/base/component/paragraph.rs | 10 +++--- pagetop/src/base/component/powered_by.rs | 8 ++--- pagetop/src/base/component/translate.rs | 2 +- pagetop/src/base/component/wrapper.rs | 12 +++---- pagetop/src/core/component/arc_any.rs | 4 +-- pagetop/src/core/component/arc_typed.rs | 4 +-- pagetop/src/html/opt_classes.rs | 4 +-- pagetop/src/html/opt_component.rs | 4 +-- pagetop/src/html/opt_id.rs | 4 +-- pagetop/src/html/opt_name.rs | 4 +-- pagetop/src/html/opt_string.rs | 4 +-- pagetop/src/html/opt_translated.rs | 4 +-- pagetop/src/lib.rs | 2 +- pagetop/src/prelude.rs | 2 +- pagetop/src/response/page.rs | 22 ++++++------- 36 files changed, 177 insertions(+), 177 deletions(-) diff --git a/pagetop-macros/src/lib.rs b/pagetop-macros/src/lib.rs index 6b6eb3e8..cb2d08e9 100644 --- a/pagetop-macros/src/lib.rs +++ b/pagetop-macros/src/lib.rs @@ -14,7 +14,7 @@ pub fn html(input: TokenStream) -> TokenStream { } #[proc_macro_attribute] -pub fn fn_builder(_attr: TokenStream, item: TokenStream) -> TokenStream { +pub fn fn_with(_attr: TokenStream, item: TokenStream) -> TokenStream { let fn_item = parse_macro_input!(item as ItemFn); let fn_name = fn_item.sig.ident.to_string(); diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index 67953eff..f4b7f1af 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -53,25 +53,25 @@ impl ComponentTrait for Block { impl Block { // Block BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_title(&mut self, title: L10n) -> &mut Self { self.title.alter_value(title); self @@ -83,7 +83,7 @@ impl Block { self } - #[fn_builder] + #[fn_with] pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { self.stuff.alter_value(op); self diff --git a/pagetop/src/base/component/branding.rs b/pagetop/src/base/component/branding.rs index c95f2bf8..3784e6fb 100644 --- a/pagetop/src/base/component/branding.rs +++ b/pagetop/src/base/component/branding.rs @@ -62,43 +62,43 @@ impl ComponentTrait for Branding { impl Branding { // Branding BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_app_name(&mut self, app_name: impl Into<String>) -> &mut Self { self.app_name = app_name.into(); self } - #[fn_builder] + #[fn_with] pub fn alter_slogan(&mut self, slogan: L10n) -> &mut Self { self.slogan.alter_value(slogan); self } - #[fn_builder] + #[fn_with] pub fn alter_logo(&mut self, logo: Option<Image>) -> &mut Self { self.logo.alter_value(logo); self } - #[fn_builder] + #[fn_with] pub fn alter_frontpage(&mut self, frontpage: FnContextualPath) -> &mut Self { self.frontpage = frontpage; self diff --git a/pagetop/src/base/component/button.rs b/pagetop/src/base/component/button.rs index d9540078..d7f097c6 100644 --- a/pagetop/src/base/component/button.rs +++ b/pagetop/src/base/component/button.rs @@ -79,61 +79,61 @@ impl Button { // Button BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_style(&mut self, style: ButtonStyle) -> &mut Self { self.style = style; self } - #[fn_builder] + #[fn_with] pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { self.font_size = font_size; self } - #[fn_builder] + #[fn_with] pub fn alter_left_icon(&mut self, icon: Option<Icon>) -> &mut Self { self.left_icon.alter_value(icon); self } - #[fn_builder] + #[fn_with] pub fn alter_right_icon(&mut self, icon: Option<Icon>) -> &mut Self { self.right_icon.alter_value(icon); self } - #[fn_builder] + #[fn_with] pub fn alter_href(&mut self, href: impl Into<String>) -> &mut Self { self.href.alter_value(href); self } - #[fn_builder] + #[fn_with] pub fn alter_html(&mut self, html: L10n) -> &mut Self { self.html.alter_value(html); self } - #[fn_builder] + #[fn_with] pub fn alter_target(&mut self, target: ButtonTarget) -> &mut Self { self.target = target; self diff --git a/pagetop/src/base/component/flex/container.rs b/pagetop/src/base/component/flex/container.rs index 608b41bd..8f31c35d 100644 --- a/pagetop/src/base/component/flex/container.rs +++ b/pagetop/src/base/component/flex/container.rs @@ -64,19 +64,19 @@ impl ComponentTrait for Container { impl Container { // Container BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self @@ -88,37 +88,37 @@ impl Container { self } - #[fn_builder] + #[fn_with] pub fn alter_items(&mut self, op: ArcTypedOp<flex::Item>) -> &mut Self { self.items.alter_value(op); self } - #[fn_builder] + #[fn_with] pub fn alter_direction(&mut self, direction: flex::Direction) -> &mut Self { self.direction = direction; self } - #[fn_builder] + #[fn_with] pub fn alter_wrap_align(&mut self, wrap: flex::WrapAlign) -> &mut Self { self.wrap_align = wrap; self } - #[fn_builder] + #[fn_with] pub fn alter_content_justify(&mut self, justify: flex::ContentJustify) -> &mut Self { self.content_justify = justify; self } - #[fn_builder] + #[fn_with] pub fn alter_items_align(&mut self, align: flex::ItemAlign) -> &mut Self { self.items_align = align; self } - #[fn_builder] + #[fn_with] pub fn alter_gap(&mut self, gap: flex::Gap) -> &mut Self { self.gap = gap; self diff --git a/pagetop/src/base/component/flex/item.rs b/pagetop/src/base/component/flex/item.rs index 761c4b4e..4525931b 100644 --- a/pagetop/src/base/component/flex/item.rs +++ b/pagetop/src/base/component/flex/item.rs @@ -68,55 +68,55 @@ impl ComponentTrait for Item { impl Item { // Item BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.inner_classes.alter_value(op, classes); self } - #[fn_builder] + #[fn_with] pub fn alter_grow(&mut self, grow: flex::ItemGrow) -> &mut Self { self.item_grow = grow; self } - #[fn_builder] + #[fn_with] pub fn alter_shrink(&mut self, shrink: flex::ItemShrink) -> &mut Self { self.item_shrink = shrink; self } - #[fn_builder] + #[fn_with] pub fn alter_size(&mut self, size: flex::ItemSize) -> &mut Self { self.item_size = size; self } - #[fn_builder] + #[fn_with] pub fn alter_offset(&mut self, offset: flex::ItemOffset) -> &mut Self { self.item_offset = offset; self } - #[fn_builder] + #[fn_with] pub fn alter_align(&mut self, align: flex::ItemAlign) -> &mut Self { self.item_align = align; self @@ -128,7 +128,7 @@ impl Item { self } - #[fn_builder] + #[fn_with] pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { self.stuff.alter_value(op); self diff --git a/pagetop/src/base/component/form/action_button.rs b/pagetop/src/base/component/form/action_button.rs index be7c72c9..80ab4b4e 100644 --- a/pagetop/src/base/component/form/action_button.rs +++ b/pagetop/src/base/component/form/action_button.rs @@ -93,55 +93,55 @@ impl ActionButton { // Button BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_style(&mut self, style: ButtonStyle) -> &mut Self { self.style = style; self } - #[fn_builder] + #[fn_with] pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { self.font_size = font_size; self } - #[fn_builder] + #[fn_with] pub fn alter_left_icon(&mut self, icon: Option<Icon>) -> &mut Self { self.left_icon.alter_value(icon); self } - #[fn_builder] + #[fn_with] pub fn alter_right_icon(&mut self, icon: Option<Icon>) -> &mut Self { self.right_icon.alter_value(icon); self } - #[fn_builder] + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: L10n) -> &mut Self { self.value.alter_value(value); self } - #[fn_builder] + #[fn_with] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -150,7 +150,7 @@ impl ActionButton { self } - #[fn_builder] + #[fn_with] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 88e2f0a2..16f369ad 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -70,43 +70,43 @@ impl ComponentTrait for Date { impl Date { // Date BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } - #[fn_builder] + #[fn_with] pub fn alter_label(&mut self, label: &str) -> &mut Self { self.label.alter_value(label); self } - #[fn_builder] + #[fn_with] pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { self.placeholder.alter_value(placeholder); self } - #[fn_builder] + #[fn_with] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -115,7 +115,7 @@ impl Date { self } - #[fn_builder] + #[fn_with] pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.alter_value(match toggle { true => "", @@ -124,7 +124,7 @@ impl Date { self } - #[fn_builder] + #[fn_with] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -133,7 +133,7 @@ impl Date { self } - #[fn_builder] + #[fn_with] pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.alter_value(match toggle { true => "readonly", @@ -142,7 +142,7 @@ impl Date { self } - #[fn_builder] + #[fn_with] pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.alter_value(match toggle { true => "required", @@ -151,13 +151,13 @@ impl Date { self } - #[fn_builder] + #[fn_with] pub fn alter_help_text(&mut self, help_text: &str) -> &mut Self { self.help_text.alter_value(help_text); self } - #[fn_builder] + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index ce476583..79ee9e5c 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -63,37 +63,37 @@ impl ComponentTrait for Form { impl Form { // Form BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_action(&mut self, action: &str) -> &mut Self { self.action.alter_value(action); self } - #[fn_builder] + #[fn_with] pub fn alter_charset(&mut self, charset: &str) -> &mut Self { self.charset.alter_value(charset); self } - #[fn_builder] + #[fn_with] pub fn alter_method(&mut self, method: FormMethod) -> &mut Self { self.method = method; self @@ -105,13 +105,13 @@ impl Form { self } - #[fn_builder] + #[fn_with] pub fn alter_elements(&mut self, op: ArcAnyOp) -> &mut Self { self.stuff.alter_value(op); self } - #[fn_builder] + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/form/hidden.rs b/pagetop/src/base/component/form/hidden.rs index 7ea32da0..16ef4079 100644 --- a/pagetop/src/base/component/form/hidden.rs +++ b/pagetop/src/base/component/form/hidden.rs @@ -33,19 +33,19 @@ impl Hidden { // Hidden BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { self.name.alter_value(name); self } - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index f0df9aab..287a9155 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -149,19 +149,19 @@ impl Input { // Input BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_name(&mut self, name: &str) -> &mut Self { if let Some(previous) = self.name.get() { self.remove_classes(concat_string!("form-item-", previous)); @@ -171,43 +171,43 @@ impl Input { self } - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: &str) -> &mut Self { self.value.alter_value(value); self } - #[fn_builder] + #[fn_with] pub fn alter_label(&mut self, label: L10n) -> &mut Self { self.label.alter_value(label); self } - #[fn_builder] + #[fn_with] pub fn alter_size(&mut self, size: Option<u16>) -> &mut Self { self.size = size; self } - #[fn_builder] + #[fn_with] pub fn alter_minlength(&mut self, minlength: Option<u16>) -> &mut Self { self.minlength = minlength; self } - #[fn_builder] + #[fn_with] pub fn alter_maxlength(&mut self, maxlength: Option<u16>) -> &mut Self { self.maxlength = maxlength; self } - #[fn_builder] + #[fn_with] pub fn alter_placeholder(&mut self, placeholder: &str) -> &mut Self { self.placeholder.alter_value(placeholder); self } - #[fn_builder] + #[fn_with] pub fn alter_autofocus(&mut self, toggle: bool) -> &mut Self { self.autofocus.alter_value(match toggle { true => "autofocus", @@ -216,7 +216,7 @@ impl Input { self } - #[fn_builder] + #[fn_with] pub fn alter_autocomplete(&mut self, toggle: bool) -> &mut Self { self.autocomplete.alter_value(match toggle { true => "", @@ -225,7 +225,7 @@ impl Input { self } - #[fn_builder] + #[fn_with] pub fn alter_disabled(&mut self, toggle: bool) -> &mut Self { self.disabled.alter_value(match toggle { true => "disabled", @@ -234,7 +234,7 @@ impl Input { self } - #[fn_builder] + #[fn_with] pub fn alter_readonly(&mut self, toggle: bool) -> &mut Self { self.readonly.alter_value(match toggle { true => "readonly", @@ -243,7 +243,7 @@ impl Input { self } - #[fn_builder] + #[fn_with] pub fn alter_required(&mut self, toggle: bool) -> &mut Self { self.required.alter_value(match toggle { true => "required", @@ -252,13 +252,13 @@ impl Input { self } - #[fn_builder] + #[fn_with] pub fn alter_help_text(&mut self, help_text: L10n) -> &mut Self { self.help_text.alter_value(help_text); self } - #[fn_builder] + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/base/component/heading.rs b/pagetop/src/base/component/heading.rs index 1325a820..40906cc5 100644 --- a/pagetop/src/base/component/heading.rs +++ b/pagetop/src/base/component/heading.rs @@ -126,37 +126,37 @@ impl Heading { // Heading BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { self.heading_type = heading_type; self } - #[fn_builder] + #[fn_with] pub fn alter_size(&mut self, size: HeadingSize) -> &mut Self { self.size = size; self } - #[fn_builder] + #[fn_with] pub fn alter_text(&mut self, text: L10n) -> &mut Self { self.text.alter_value(text); self diff --git a/pagetop/src/base/component/html.rs b/pagetop/src/base/component/html.rs index ab9781ef..a31a7034 100644 --- a/pagetop/src/base/component/html.rs +++ b/pagetop/src/base/component/html.rs @@ -21,7 +21,7 @@ impl Html { // Html BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_html(&mut self, html: Markup) -> &mut Self { self.0 = html; self diff --git a/pagetop/src/base/component/icon.rs b/pagetop/src/base/component/icon.rs index 1ed95e56..c88966f8 100644 --- a/pagetop/src/base/component/icon.rs +++ b/pagetop/src/base/component/icon.rs @@ -49,25 +49,25 @@ impl Icon { // Icon BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_icon_name(&mut self, name: impl Into<String>) -> &mut Self { self.icon_name.alter_value(name); self } - #[fn_builder] + #[fn_with] pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { self.font_size = font_size; self diff --git a/pagetop/src/base/component/image.rs b/pagetop/src/base/component/image.rs index 2e8bf3dc..f6deade5 100644 --- a/pagetop/src/base/component/image.rs +++ b/pagetop/src/base/component/image.rs @@ -83,31 +83,31 @@ impl Image { // Image BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_source(&mut self, source: &str) -> &mut Self { self.source.alter_value(source); self } - #[fn_builder] + #[fn_with] pub fn alter_size(&mut self, size: ImageSize) -> &mut Self { self.size = size; self diff --git a/pagetop/src/base/component/menu/element.rs b/pagetop/src/base/component/menu/element.rs index 0ffcfa53..9158bbfd 100644 --- a/pagetop/src/base/component/menu/element.rs +++ b/pagetop/src/base/component/menu/element.rs @@ -67,13 +67,13 @@ impl Element { // Element BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self diff --git a/pagetop/src/base/component/menu/group.rs b/pagetop/src/base/component/menu/group.rs index 9b80a546..92c36bbc 100644 --- a/pagetop/src/base/component/menu/group.rs +++ b/pagetop/src/base/component/menu/group.rs @@ -41,19 +41,19 @@ impl ComponentTrait for Group { impl Group { // Group BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self @@ -65,7 +65,7 @@ impl Group { self } - #[fn_builder] + #[fn_with] pub fn alter_elements(&mut self, op: ArcTypedOp<Element>) -> &mut Self { self.elements.alter_value(op); self diff --git a/pagetop/src/base/component/menu/item.rs b/pagetop/src/base/component/menu/item.rs index 15e4db4b..ec46c3b1 100644 --- a/pagetop/src/base/component/menu/item.rs +++ b/pagetop/src/base/component/menu/item.rs @@ -157,31 +157,31 @@ impl Item { // Item BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_description(&mut self, text: L10n) -> &mut Self { self.description.alter_value(text); self } - #[fn_builder] + #[fn_with] pub fn alter_left_icon(&mut self, icon: Option<Icon>) -> &mut Self { self.left_icon.alter_value(icon); self } - #[fn_builder] + #[fn_with] pub fn alter_right_icon(&mut self, icon: Option<Icon>) -> &mut Self { self.right_icon.alter_value(icon); self diff --git a/pagetop/src/base/component/menu/megamenu.rs b/pagetop/src/base/component/menu/megamenu.rs index 777f8ca1..63a526e1 100644 --- a/pagetop/src/base/component/menu/megamenu.rs +++ b/pagetop/src/base/component/menu/megamenu.rs @@ -41,19 +41,19 @@ impl ComponentTrait for Megamenu { impl Megamenu { // Megamenu BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self @@ -65,7 +65,7 @@ impl Megamenu { self } - #[fn_builder] + #[fn_with] pub fn alter_groups(&mut self, op: ArcTypedOp<Group>) -> &mut Self { self.groups.alter_value(op); self diff --git a/pagetop/src/base/component/menu/menu_main.rs b/pagetop/src/base/component/menu/menu_main.rs index d94eef94..66fc375d 100644 --- a/pagetop/src/base/component/menu/menu_main.rs +++ b/pagetop/src/base/component/menu/menu_main.rs @@ -69,19 +69,19 @@ impl ComponentTrait for Menu { impl Menu { // Menu BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self @@ -93,7 +93,7 @@ impl Menu { self } - #[fn_builder] + #[fn_with] pub fn alter_items(&mut self, op: ArcTypedOp<Item>) -> &mut Self { self.items.alter_value(op); self diff --git a/pagetop/src/base/component/menu/submenu.rs b/pagetop/src/base/component/menu/submenu.rs index 457556a3..9b2dadd9 100644 --- a/pagetop/src/base/component/menu/submenu.rs +++ b/pagetop/src/base/component/menu/submenu.rs @@ -47,25 +47,25 @@ impl ComponentTrait for Submenu { impl Submenu { // Submenu BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_title(&mut self, title: L10n) -> &mut Self { self.title.alter_value(title); self @@ -77,7 +77,7 @@ impl Submenu { self } - #[fn_builder] + #[fn_with] pub fn alter_items(&mut self, op: ArcTypedOp<Item>) -> &mut Self { self.items.alter_value(op); self diff --git a/pagetop/src/base/component/paragraph.rs b/pagetop/src/base/component/paragraph.rs index 0fba5006..5096b79e 100644 --- a/pagetop/src/base/component/paragraph.rs +++ b/pagetop/src/base/component/paragraph.rs @@ -56,25 +56,25 @@ impl Paragraph { // Paragraph BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { self.font_size = font_size; self @@ -92,7 +92,7 @@ impl Paragraph { self } - #[fn_builder] + #[fn_with] pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { self.stuff.alter_value(op); self diff --git a/pagetop/src/base/component/powered_by.rs b/pagetop/src/base/component/powered_by.rs index 8b6739fc..b947ef85 100644 --- a/pagetop/src/base/component/powered_by.rs +++ b/pagetop/src/base/component/powered_by.rs @@ -72,25 +72,25 @@ impl ComponentTrait for PoweredBy { impl PoweredBy { // PoweredBy BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_copyright(&mut self, copyright: Option<impl Into<String>>) -> &mut Self { self.copyright = copyright.map(|c| c.into()); self } - #[fn_builder] + #[fn_with] pub fn alter_logo(&mut self, logo: PoweredByLogo) -> &mut Self { self.logo = logo; self diff --git a/pagetop/src/base/component/translate.rs b/pagetop/src/base/component/translate.rs index 9731a3df..6b53bdd2 100644 --- a/pagetop/src/base/component/translate.rs +++ b/pagetop/src/base/component/translate.rs @@ -21,7 +21,7 @@ impl Translate { // Translate BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_l10n(&mut self, l10n: L10n) -> &mut Self { self.0 = l10n; self diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 48f2eb36..641123aa 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -117,25 +117,25 @@ impl Wrapper { // Wrapper BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_id(&mut self, id: impl Into<String>) -> &mut Self { self.id.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_weight(&mut self, value: Weight) -> &mut Self { self.weight = value; self } - #[fn_builder] + #[fn_with] pub fn alter_renderable(&mut self, check: FnIsRenderable) -> &mut Self { self.renderable.check = check; self } - #[fn_builder] + #[fn_with] pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.inner_classes.alter_value(op, classes); self @@ -147,13 +147,13 @@ impl Wrapper { self } - #[fn_builder] + #[fn_with] pub fn alter_components(&mut self, op: ArcAnyOp) -> &mut Self { self.stuff.alter_value(op); self } - #[fn_builder] + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self diff --git a/pagetop/src/core/component/arc_any.rs b/pagetop/src/core/component/arc_any.rs index b9252c36..e8fa8bf9 100644 --- a/pagetop/src/core/component/arc_any.rs +++ b/pagetop/src/core/component/arc_any.rs @@ -1,6 +1,6 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; -use crate::{fn_builder, Handle, Weight}; +use crate::{fn_with, Handle, Weight}; use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; @@ -79,7 +79,7 @@ impl AnyComponents { // AnyComponents BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, op: ArcAnyOp) -> &mut Self { match op { ArcAnyOp::Add(arc) => self.0.push(arc), diff --git a/pagetop/src/core/component/arc_typed.rs b/pagetop/src/core/component/arc_typed.rs index 483229a0..2c47c546 100644 --- a/pagetop/src/core/component/arc_typed.rs +++ b/pagetop/src/core/component/arc_typed.rs @@ -1,6 +1,6 @@ use crate::core::component::{ComponentTrait, Context}; use crate::html::{html, Markup}; -use crate::{fn_builder, Handle, Weight}; +use crate::{fn_with, Handle, Weight}; use std::sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}; @@ -76,7 +76,7 @@ impl<C: ComponentTrait + Default> TypedComponents<C> { // TypedComponents BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, op: ArcTypedOp<C>) -> &mut Self { match op { ArcTypedOp::Add(one) => self.0.push(one), diff --git a/pagetop/src/html/opt_classes.rs b/pagetop/src/html/opt_classes.rs index aba25eaa..eb8f06a9 100644 --- a/pagetop/src/html/opt_classes.rs +++ b/pagetop/src/html/opt_classes.rs @@ -9,7 +9,7 @@ //! **OptionClasses** assumes that the order of the classes is irrelevant //! (<https://stackoverflow.com/a/1321712>), and duplicate classes will not be allowed. -use crate::{fn_builder, SmartDefault}; +use crate::{fn_with, SmartDefault}; pub enum ClassesOp { Add, @@ -30,7 +30,7 @@ impl OptionClasses { // OptionClasses BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { let classes: String = classes.into(); let classes: Vec<&str> = classes.split_ascii_whitespace().collect(); diff --git a/pagetop/src/html/opt_component.rs b/pagetop/src/html/opt_component.rs index 059f2e3e..75a6bb71 100644 --- a/pagetop/src/html/opt_component.rs +++ b/pagetop/src/html/opt_component.rs @@ -1,5 +1,5 @@ use crate::core::component::{ArcTypedComponent, ComponentTrait, Context}; -use crate::fn_builder; +use crate::fn_with; use crate::html::{html, Markup}; pub struct OptionComponent<C: ComponentTrait>(Option<ArcTypedComponent<C>>); @@ -17,7 +17,7 @@ impl<C: ComponentTrait> OptionComponent<C> { // OptionComponent BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, component: Option<C>) -> &mut Self { if let Some(component) = component { self.0 = Some(ArcTypedComponent::new(component)); diff --git a/pagetop/src/html/opt_id.rs b/pagetop/src/html/opt_id.rs index 2022f16d..fa9df14f 100644 --- a/pagetop/src/html/opt_id.rs +++ b/pagetop/src/html/opt_id.rs @@ -1,4 +1,4 @@ -use crate::{fn_builder, SmartDefault}; +use crate::{fn_with, SmartDefault}; #[derive(SmartDefault)] pub struct OptionId(Option<String>); @@ -10,7 +10,7 @@ impl OptionId { // OptionId BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { self.0 = Some(value.into().trim().replace(' ', "_")); self diff --git a/pagetop/src/html/opt_name.rs b/pagetop/src/html/opt_name.rs index 84c665a8..46421452 100644 --- a/pagetop/src/html/opt_name.rs +++ b/pagetop/src/html/opt_name.rs @@ -1,4 +1,4 @@ -use crate::{fn_builder, SmartDefault}; +use crate::{fn_with, SmartDefault}; #[derive(SmartDefault)] pub struct OptionName(Option<String>); @@ -10,7 +10,7 @@ impl OptionName { // OptionName BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { self.0 = Some(value.into().trim().replace(' ', "_")); self diff --git a/pagetop/src/html/opt_string.rs b/pagetop/src/html/opt_string.rs index c1f55ebd..d34950ff 100644 --- a/pagetop/src/html/opt_string.rs +++ b/pagetop/src/html/opt_string.rs @@ -1,4 +1,4 @@ -use crate::{fn_builder, SmartDefault}; +use crate::{fn_with, SmartDefault}; #[derive(SmartDefault)] pub struct OptionString(Option<String>); @@ -10,7 +10,7 @@ impl OptionString { // OptionString BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: impl Into<String>) -> &mut Self { self.0 = Some(value.into().trim().to_owned()); self diff --git a/pagetop/src/html/opt_translated.rs b/pagetop/src/html/opt_translated.rs index 400170fc..ba1e7075 100644 --- a/pagetop/src/html/opt_translated.rs +++ b/pagetop/src/html/opt_translated.rs @@ -1,6 +1,6 @@ use crate::html::Markup; use crate::locale::{L10n, LanguageIdentifier}; -use crate::{fn_builder, SmartDefault}; +use crate::{fn_with, SmartDefault}; #[derive(SmartDefault)] pub struct OptionTranslated(L10n); @@ -12,7 +12,7 @@ impl OptionTranslated { // OptionTranslated BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_value(&mut self, value: L10n) -> &mut Self { self.0 = value; self diff --git a/pagetop/src/lib.rs b/pagetop/src/lib.rs index ecbda884..eca5b591 100644 --- a/pagetop/src/lib.rs +++ b/pagetop/src/lib.rs @@ -108,7 +108,7 @@ pub use paste::paste; /// customized default values. pub use smart_default::SmartDefault; -pub use pagetop_macros::{fn_builder, main, test, BindHandle, ComponentClasses}; +pub use pagetop_macros::{fn_with, main, test, BindHandle, ComponentClasses}; pub(crate) use pagetop_macros::BaseHandle; diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 935de58c..b12fe6d2 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -1,7 +1,7 @@ //! The PageTop Prelude. // Re-exported macros and derives. -pub use crate::{concat_string, fn_builder, main, paste, test, SmartDefault}; +pub use crate::{concat_string, fn_with, main, paste, test, SmartDefault}; // Global. pub use crate::{Handle, HashMapResources, ImplementHandle, LazyStatic, Weight}; diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index 66d7af37..ad9f245c 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -10,7 +10,7 @@ use crate::core::theme::ComponentsRegions; use crate::html::{html, Markup, DOCTYPE}; use crate::html::{ClassesOp, Favicon, OptionClasses, OptionId, OptionTranslated}; use crate::locale::L10n; -use crate::{fn_builder, service}; +use crate::{fn_with, service}; use unic_langid::CharacterDirection; @@ -47,55 +47,55 @@ impl Page { // Page BUILDER. - #[fn_builder] + #[fn_with] pub fn alter_title(&mut self, title: L10n) -> &mut Self { self.title.alter_value(title); self } - #[fn_builder] + #[fn_with] pub fn alter_description(&mut self, description: L10n) -> &mut Self { self.description.alter_value(description); self } - #[fn_builder] + #[fn_with] pub fn alter_metadata(&mut self, name: &'static str, content: &'static str) -> &mut Self { self.metadata.push((name, content)); self } - #[fn_builder] + #[fn_with] pub fn alter_property(&mut self, property: &'static str, content: &'static str) -> &mut Self { self.metadata.push((property, content)); self } - #[fn_builder] + #[fn_with] pub fn alter_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { self.favicon = favicon; self } - #[fn_builder] + #[fn_with] pub fn alter_context(&mut self, op: ContextOp) -> &mut Self { self.context.alter(op); self } - #[fn_builder] + #[fn_with] pub fn alter_body_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { self.body_classes.alter_value(op, classes); self } - #[fn_builder] + #[fn_with] pub fn alter_skip_to(&mut self, id: impl Into<String>) -> &mut Self { self.skip_to.alter_value(id); self } - #[fn_builder] + #[fn_with] pub fn alter_component_in( &mut self, region: &'static str, @@ -106,7 +106,7 @@ impl Page { self } - #[fn_builder] + #[fn_with] pub fn alter_template(&mut self, template: &str) -> &mut Self { self.template = template.to_owned(); self From 6ec92871138a795dfdcf7610c8b20f03010a5931 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Nov 2023 11:38:51 +0100 Subject: [PATCH 655/853] =?UTF-8?q?=F0=9F=94=A5=20Remove=20template=20usag?= =?UTF-8?q?e=20in=20base=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/base/component/form/date.rs | 11 ----------- pagetop/src/base/component/form/form_main.rs | 11 ----------- pagetop/src/base/component/form/input.rs | 11 ----------- pagetop/src/base/component/wrapper.rs | 11 ----------- 4 files changed, 44 deletions(-) diff --git a/pagetop/src/base/component/form/date.rs b/pagetop/src/base/component/form/date.rs index 16f369ad..b70ebff7 100644 --- a/pagetop/src/base/component/form/date.rs +++ b/pagetop/src/base/component/form/date.rs @@ -17,7 +17,6 @@ pub struct Date { readonly : OptionString, required : OptionString, help_text : OptionString, - template : String, } impl ComponentTrait for Date { @@ -157,12 +156,6 @@ impl Date { self } - #[fn_with] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Date GETTERS. pub fn name(&self) -> &OptionString { @@ -204,8 +197,4 @@ impl Date { pub fn help_text(&self) -> &OptionString { &self.help_text } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop/src/base/component/form/form_main.rs b/pagetop/src/base/component/form/form_main.rs index 79ee9e5c..2ff2a406 100644 --- a/pagetop/src/base/component/form/form_main.rs +++ b/pagetop/src/base/component/form/form_main.rs @@ -19,7 +19,6 @@ pub struct Form { charset : OptionString, method : FormMethod, stuff : AnyComponents, - template : String, } impl ComponentTrait for Form { @@ -111,12 +110,6 @@ impl Form { self } - #[fn_with] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Form GETTERS. pub fn action(&self) -> &OptionString { @@ -134,8 +127,4 @@ impl Form { pub fn elements(&self) -> &AnyComponents { &self.stuff } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop/src/base/component/form/input.rs b/pagetop/src/base/component/form/input.rs index 287a9155..8c9529f9 100644 --- a/pagetop/src/base/component/form/input.rs +++ b/pagetop/src/base/component/form/input.rs @@ -32,7 +32,6 @@ pub struct Input { readonly : OptionString, required : OptionString, help_text : OptionTranslated, - template : String, } impl ComponentTrait for Input { @@ -258,12 +257,6 @@ impl Input { self } - #[fn_with] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Input GETTERS. pub fn input_type(&self) -> &InputType { @@ -321,8 +314,4 @@ impl Input { pub fn help_text(&self) -> &OptionTranslated { &self.help_text } - - pub fn template(&self) -> &str { - self.template.as_str() - } } diff --git a/pagetop/src/base/component/wrapper.rs b/pagetop/src/base/component/wrapper.rs index 641123aa..2bb337c7 100644 --- a/pagetop/src/base/component/wrapper.rs +++ b/pagetop/src/base/component/wrapper.rs @@ -21,7 +21,6 @@ pub struct Wrapper { inner_classes: OptionClasses, wrapper_type : WrapperType, stuff : AnyComponents, - template : String, } impl ComponentTrait for Wrapper { @@ -153,12 +152,6 @@ impl Wrapper { self } - #[fn_with] - pub fn alter_template(&mut self, template: &str) -> &mut Self { - self.template = template.to_owned(); - self - } - // Wrapper GETTERS. pub fn inner_classes(&self) -> &OptionClasses { @@ -172,8 +165,4 @@ impl Wrapper { pub fn components(&self) -> &AnyComponents { &self.stuff } - - pub fn template(&self) -> &str { - self.template.as_str() - } } From cf335081f73a968a978a86473927bd0c7383d3c3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Nov 2023 12:30:33 +0100 Subject: [PATCH 656/853] =?UTF-8?q?=F0=9F=9A=9A=20Now=20we=20have=20Compon?= =?UTF-8?q?entsInRegions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/src/core/theme.rs | 2 +- pagetop/src/core/theme/regions.rs | 14 +++++++------- pagetop/src/response/page.rs | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pagetop/src/core/theme.rs b/pagetop/src/core/theme.rs index 713017c3..2f2275fe 100644 --- a/pagetop/src/core/theme.rs +++ b/pagetop/src/core/theme.rs @@ -2,7 +2,7 @@ mod definition; pub use definition::{ThemeRef, ThemeTrait}; mod regions; -pub(crate) use regions::ComponentsRegions; +pub(crate) use regions::ComponentsInRegions; pub use regions::{add_component_in, Region}; pub(crate) mod all; diff --git a/pagetop/src/core/theme/regions.rs b/pagetop/src/core/theme/regions.rs index c6410c48..72f8d86c 100644 --- a/pagetop/src/core/theme/regions.rs +++ b/pagetop/src/core/theme/regions.rs @@ -5,18 +5,18 @@ use crate::{Handle, LazyStatic, SmartDefault}; use std::collections::HashMap; use std::sync::RwLock; -static THEME_REGIONS: LazyStatic<RwLock<HashMap<Handle, ComponentsRegions>>> = +static THEME_REGIONS: LazyStatic<RwLock<HashMap<Handle, ComponentsInRegions>>> = LazyStatic::new(|| RwLock::new(HashMap::new())); -static COMMON_REGIONS: LazyStatic<RwLock<ComponentsRegions>> = - LazyStatic::new(|| RwLock::new(ComponentsRegions::default())); +static COMMON_REGIONS: LazyStatic<RwLock<ComponentsInRegions>> = + LazyStatic::new(|| RwLock::new(ComponentsInRegions::default())); #[derive(SmartDefault)] -pub struct ComponentsRegions(HashMap<&'static str, AnyComponents>); +pub struct ComponentsInRegions(HashMap<&'static str, AnyComponents>); -impl ComponentsRegions { +impl ComponentsInRegions { pub fn new(region: &'static str, arc: ArcAnyComponent) -> Self { - let mut regions = ComponentsRegions::default(); + let mut regions = ComponentsInRegions::default(); regions.add_component_in(region, arc); regions } @@ -54,7 +54,7 @@ pub fn add_component_in(region: Region, arc: ArcAnyComponent) { if let Some(r) = regions.get_mut(&theme.handle()) { r.add_component_in(region, arc); } else { - regions.insert(theme.handle(), ComponentsRegions::new(region, arc)); + regions.insert(theme.handle(), ComponentsInRegions::new(region, arc)); } } } diff --git a/pagetop/src/response/page.rs b/pagetop/src/response/page.rs index ad9f245c..3b0482be 100644 --- a/pagetop/src/response/page.rs +++ b/pagetop/src/response/page.rs @@ -6,7 +6,7 @@ pub use actix_web::Result as ResultPage; use crate::base::action; use crate::core::component::{AnyComponents, ArcAnyComponent, ComponentTrait}; use crate::core::component::{Context, ContextOp}; -use crate::core::theme::ComponentsRegions; +use crate::core::theme::ComponentsInRegions; use crate::html::{html, Markup, DOCTYPE}; use crate::html::{ClassesOp, Favicon, OptionClasses, OptionId, OptionTranslated}; use crate::locale::L10n; @@ -24,7 +24,7 @@ pub struct Page { context : Context, body_classes: OptionClasses, skip_to : OptionId, - regions : ComponentsRegions, + regions : ComponentsInRegions, template : String, } @@ -40,7 +40,7 @@ impl Page { context : Context::new(request), body_classes: OptionClasses::default(), skip_to : OptionId::default(), - regions : ComponentsRegions::default(), + regions : ComponentsInRegions::default(), template : "default".to_owned(), } } From 02be4264d03d393a7f347dc45756c2d306bc3228 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 7 Dec 2023 09:38:25 +0100 Subject: [PATCH 657/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Upgrade=20to=20sea?= =?UTF-8?q?-orm=200.12.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 2 +- pagetop/Cargo.toml | 4 +- pagetop/src/db/migration/manager.rs | 21 +++++ pagetop/src/db/migration/migrator.rs | 135 +++++++++++++++++++++------ pagetop/src/db/migration/prelude.rs | 2 + 5 files changed, 130 insertions(+), 34 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 41bc1c7b..46ae8495 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -15,7 +15,7 @@ [SeaQuery](https://github.com/SeaQL/sea-query) para interactuar con bases de datos. Sin embargo, para restringir las migraciones a módulos, se ha integrado en el código una versión modificada de [SeaORM Migration](https://github.com/SeaQL/sea-orm/tree/master/sea-orm-migration) (versión - [0.11.3](https://github.com/SeaQL/sea-orm/tree/0.11.3/sea-orm-migration/src)). + [0.12.8](https://github.com/SeaQL/sea-orm/tree/0.12.8/sea-orm-migration/src)). # 🗚 FIGfonts diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 188598aa..44edc434 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -70,13 +70,13 @@ version = "0.3.29" optional = true [dependencies.sea-orm] -version = "0.11.3" +version = "0.12.8" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true [dependencies.sea-schema] -version = "0.11.0" +version = "0.14.1" optional = true [build-dependencies] diff --git a/pagetop/src/db/migration/manager.rs b/pagetop/src/db/migration/manager.rs index f70c9212..994204e1 100644 --- a/pagetop/src/db/migration/manager.rs +++ b/pagetop/src/db/migration/manager.rs @@ -136,4 +136,25 @@ impl<'c> SchemaManager<'c> { res.try_get("", "has_column") } + + pub async fn has_index<T, I>(&self, table: T, index: I) -> Result<bool, DbErr> + where + T: AsRef<str>, + I: AsRef<str>, + { + let stmt = match self.conn.get_database_backend() { + DbBackend::MySql => MySql::has_index(table, index), + DbBackend::Postgres => Postgres::has_index(table, index), + DbBackend::Sqlite => Sqlite::has_index(table, index), + }; + + let builder = self.conn.get_database_backend(); + let res = self + .conn + .query_one(builder.build(&stmt)) + .await? + .ok_or_else(|| DbErr::Custom("Failed to check index exists".to_owned()))?; + + res.try_get("", "has_index") + } } diff --git a/pagetop/src/db/migration/migrator.rs b/pagetop/src/db/migration/migrator.rs index d91cbd7b..9479cff4 100644 --- a/pagetop/src/db/migration/migrator.rs +++ b/pagetop/src/db/migration/migrator.rs @@ -6,18 +6,19 @@ use std::time::SystemTime; use tracing::info; use sea_orm::sea_query::{ - self, extension::postgres::Type, Alias, Expr, ForeignKey, Iden, JoinType, Query, + self, extension::postgres::Type, Alias, Expr, ForeignKey, IntoIden, JoinType, Order, Query, SelectStatement, SimpleExpr, Table, }; use sea_orm::{ - ActiveModelTrait, ActiveValue, ColumnTrait, Condition, ConnectionTrait, DbBackend, DbErr, - EntityTrait, QueryFilter, QueryOrder, Schema, Statement, TransactionTrait, + ActiveModelTrait, ActiveValue, Condition, ConnectionTrait, DbBackend, DbErr, DeriveIden, + DynIden, EntityTrait, FromQueryResult, Iterable, QueryFilter, Schema, Statement, + TransactionTrait, }; use sea_schema::{mysql::MySql, postgres::Postgres, probe::SchemaProbe, sqlite::Sqlite}; use super::{seaql_migrations, IntoSchemaManagerConnection, MigrationTrait, SchemaManager}; -#[derive(Debug, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] /// Status of migration pub enum MigrationStatus { /// Not yet applied @@ -26,11 +27,6 @@ pub enum MigrationStatus { Applied, } -pub struct Migration { - migration: Box<dyn MigrationTrait>, - status: MigrationStatus, -} - impl Display for MigrationStatus { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let status = match self { @@ -41,12 +37,34 @@ impl Display for MigrationStatus { } } +pub struct Migration { + migration: Box<dyn MigrationTrait>, + status: MigrationStatus, +} + +impl Migration { + /// Get migration name from MigrationName trait implementation + pub fn name(&self) -> &str { + self.migration.name() + } + + /// Get migration status + pub fn status(&self) -> MigrationStatus { + self.status + } +} + /// Performing migrations on a database #[async_trait::async_trait] pub trait MigratorTrait: Send { /// Vector of migrations in time sequence fn migrations() -> Vec<Box<dyn MigrationTrait>>; + /// Name of the migration table, it is `seaql_migrations` by default + fn migration_table_name() -> DynIden { + seaql_migrations::Entity.into_iden() + } + /// Get list of migrations wrapped in `Migration` struct fn get_migration_files() -> Vec<Migration> { Self::migrations() @@ -64,8 +82,13 @@ pub trait MigratorTrait: Send { C: ConnectionTrait, { Self::install(db).await?; - seaql_migrations::Entity::find() - .order_by_asc(seaql_migrations::Column::Version) + let stmt = Query::select() + .table_name(Self::migration_table_name()) + .columns(seaql_migrations::Column::iter().map(IntoIden::into_iden)) + .order_by(seaql_migrations::Column::Version, Order::Asc) + .to_owned(); + let builder = db.get_database_backend(); + seaql_migrations::Model::find_by_statement(builder.build(&stmt)) .all(db) .await } @@ -142,7 +165,9 @@ pub trait MigratorTrait: Send { { let builder = db.get_database_backend(); let schema = Schema::new(builder); - let mut stmt = schema.create_table_from_entity(seaql_migrations::Entity); + let mut stmt = schema + .create_table_from_entity(seaql_migrations::Entity) + .table_name(Self::migration_table_name()); stmt.if_not_exists(); db.execute(builder.build(&stmt)).await.map(|_| ()) } @@ -168,7 +193,7 @@ pub trait MigratorTrait: Send { where C: IntoSchemaManagerConnection<'c>, { - exec_with_connection::<'_, _, _, Self>(db, move |manager| { + exec_with_connection::<'_, _, _>(db, move |manager| { Box::pin(async move { exec_fresh::<Self>(manager).await }) }) .await @@ -179,7 +204,7 @@ pub trait MigratorTrait: Send { where C: IntoSchemaManagerConnection<'c>, { - exec_with_connection::<'_, _, _, Self>(db, move |manager| { + exec_with_connection::<'_, _, _>(db, move |manager| { Box::pin(async move { exec_down::<Self>(manager, None).await?; exec_up::<Self>(manager, None).await @@ -193,7 +218,7 @@ pub trait MigratorTrait: Send { where C: IntoSchemaManagerConnection<'c>, { - exec_with_connection::<'_, _, _, Self>(db, move |manager| { + exec_with_connection::<'_, _, _>(db, move |manager| { Box::pin(async move { exec_down::<Self>(manager, None).await }) }) .await @@ -204,7 +229,7 @@ pub trait MigratorTrait: Send { where C: IntoSchemaManagerConnection<'c>, { - exec_with_connection::<'_, _, _, Self>(db, move |manager| { + exec_with_connection::<'_, _, _>(db, move |manager| { Box::pin(async move { exec_up::<Self>(manager, steps).await }) }) .await @@ -215,21 +240,19 @@ pub trait MigratorTrait: Send { where C: IntoSchemaManagerConnection<'c>, { - exec_with_connection::<'_, _, _, Self>(db, move |manager| { + exec_with_connection::<'_, _, _>(db, move |manager| { Box::pin(async move { exec_down::<Self>(manager, steps).await }) }) .await } } -#[allow(clippy::extra_unused_type_parameters)] -async fn exec_with_connection<'c, C, F, M>(db: C, f: F) -> Result<(), DbErr> +async fn exec_with_connection<'c, C, F>(db: C, f: F) -> Result<(), DbErr> where C: IntoSchemaManagerConnection<'c>, F: for<'b> Fn( &'b SchemaManager<'_>, ) -> Pin<Box<dyn Future<Output = Result<(), DbErr>> + Send + 'b>>, - M: MigratorTrait + ?Sized, { let db = db.into_schema_manager_connection(); @@ -311,7 +334,7 @@ where let type_name: String = row.try_get("", "typname")?; info!("Dropping type '{}'", type_name); let mut stmt = Type::drop(); - stmt.name(Alias::new(&type_name as &str)); + stmt.name(Alias::new(&type_name)); db.execute(db_backend.build(&stmt)).await?; info!("Type '{}' has been dropped", type_name); } @@ -363,11 +386,12 @@ where let now = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("SystemTime before UNIX EPOCH!"); - seaql_migrations::ActiveModel { + seaql_migrations::Entity::insert(seaql_migrations::ActiveModel { version: ActiveValue::Set(migration.name().to_owned()), applied_at: ActiveValue::Set(now.as_secs() as i64), - } - .insert(db) + }) + .table_name(M::migration_table_name()) + .exec(db) .await?; } @@ -403,7 +427,8 @@ where migration.down(manager).await?; info!("Migration '{}' has been rollbacked", migration.name()); seaql_migrations::Entity::delete_many() - .filter(seaql_migrations::Column::Version.eq(migration.name())) + .filter(Expr::col(seaql_migrations::Column::Version).eq(migration.name())) + .table_name(M::migration_table_name()) .exec(db) .await?; } @@ -433,13 +458,13 @@ where } } -#[derive(Iden)] +#[derive(DeriveIden)] enum InformationSchema { - #[iden = "information_schema"] + #[sea_orm(iden = "information_schema")] Schema, - #[iden = "TABLE_NAME"] + #[sea_orm(iden = "TABLE_NAME")] TableName, - #[iden = "CONSTRAINT_NAME"] + #[sea_orm(iden = "CONSTRAINT_NAME")] ConstraintName, TableConstraints, TableSchema, @@ -476,7 +501,7 @@ where stmt } -#[derive(Iden)] +#[derive(DeriveIden)] enum PgType { Table, Typname, @@ -484,7 +509,7 @@ enum PgType { Typelem, } -#[derive(Iden)] +#[derive(DeriveIden)] enum PgNamespace { Table, Oid, @@ -514,3 +539,51 @@ where ); stmt } + +trait QueryTable { + type Statement; + + fn table_name(self, table_name: DynIden) -> Self::Statement; +} + +impl QueryTable for SelectStatement { + type Statement = SelectStatement; + + fn table_name(mut self, table_name: DynIden) -> SelectStatement { + self.from(table_name); + self + } +} + +impl QueryTable for sea_query::TableCreateStatement { + type Statement = sea_query::TableCreateStatement; + + fn table_name(mut self, table_name: DynIden) -> sea_query::TableCreateStatement { + self.table(table_name); + self + } +} + +impl<A> QueryTable for sea_orm::Insert<A> +where + A: ActiveModelTrait, +{ + type Statement = sea_orm::Insert<A>; + + fn table_name(mut self, table_name: DynIden) -> sea_orm::Insert<A> { + sea_orm::QueryTrait::query(&mut self).into_table(table_name); + self + } +} + +impl<E> QueryTable for sea_orm::DeleteMany<E> +where + E: EntityTrait, +{ + type Statement = sea_orm::DeleteMany<E>; + + fn table_name(mut self, table_name: DynIden) -> sea_orm::DeleteMany<E> { + sea_orm::QueryTrait::query(&mut self).from_table(table_name); + self + } +} diff --git a/pagetop/src/db/migration/prelude.rs b/pagetop/src/db/migration/prelude.rs index fac0e132..2c1132ad 100644 --- a/pagetop/src/db/migration/prelude.rs +++ b/pagetop/src/db/migration/prelude.rs @@ -9,5 +9,7 @@ pub use async_trait; pub use sea_orm; pub use sea_orm::sea_query; pub use sea_orm::sea_query::*; +pub use sea_orm::ConnectionTrait; pub use sea_orm::DbErr; +pub use sea_orm::DeriveIden; pub use sea_orm::DeriveMigrationName; From 097b14107eaa0db7e5235897ef7b00776fe242a1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Dec 2023 12:05:34 +0100 Subject: [PATCH 658/853] =?UTF-8?q?=F0=9F=93=8C=20Fix=20ouroboros=5Fmacro/?= =?UTF-8?q?fluent-templates=20conflict?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index 44edc434..ea5598f9 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -69,6 +69,9 @@ serde = { version = "1.0", features = ["derive"] } version = "0.3.29" optional = true +[dependencies.heck] +version = "0.4.1" + [dependencies.sea-orm] version = "0.12.8" features = ["debug-print", "macros", "runtime-async-std-native-tls"] From cf3aeb9e6e5ab70aeeb533aca334f186faeb8e6b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Dec 2023 12:34:17 +0100 Subject: [PATCH 659/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Upgrade=20dependen?= =?UTF-8?q?cies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop/Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pagetop/Cargo.toml b/pagetop/Cargo.toml index ea5598f9..d299f2eb 100644 --- a/pagetop/Cargo.toml +++ b/pagetop/Cargo.toml @@ -36,15 +36,15 @@ async-trait = "0.1.74" chrono = "0.4.31" concat-string = "1.0.1" figlet-rs = "0.1.5" -itoa = "1.0.9" +itoa = "1.0.10" nom = "7.1.3" -once_cell = "1.18.0" +once_cell = "1.19.0" paste = "1.0.14" smart-default = "0.7.1" substring = "1.4.5" term_size = "0.3.2" toml = "0.8.8" -url = "2.4.1" +url = "2.5.0" tracing = "0.1.40" tracing-appender = "0.2.3" @@ -52,7 +52,7 @@ tracing-subscriber = { version = "0.3.18", features = ["json", "env-filter"] } tracing-actix-web = "0.7.9" fluent-templates = "0.8.0" -unic-langid = { version = "0.9.1", features = ["macros"] } +unic-langid = { version = "0.9.3", features = ["macros"] } actix-web = "4" actix-session = { version = "0.8.0", features = ["cookie-session"] } @@ -73,7 +73,7 @@ optional = true version = "0.4.1" [dependencies.sea-orm] -version = "0.12.8" +version = "0.12.9" features = ["debug-print", "macros", "runtime-async-std-native-tls"] default-features = false optional = true From 5b9c5ffdae8e5e9d9ea48cf9a578aa6a575e8c01 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 24 Jun 2025 15:57:55 +0200 Subject: [PATCH 660/853] =?UTF-8?q?=F0=9F=8E=89=20Inicia=20el=20proyecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..8d626330 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +<div align="center"> + +<h1>PageTop</h1> + +<p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> + +</div> + +`PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para +la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. From 45e2882653f45c2f323f87c4634d4aaffa48c8c2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 24 Jun 2025 20:23:28 +0200 Subject: [PATCH 661/853] =?UTF-8?q?=F0=9F=93=84=20A=C3=B1ade=20las=20licen?= =?UTF-8?q?cias=20del=20proyecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE-APACHE | 201 +++++++++++++++++++++++++++++++++++++++++++++++++ LICENSE-MIT | 21 ++++++ README.md | 23 ++++++ 3 files changed, 245 insertions(+) create mode 100644 LICENSE-APACHE create mode 100644 LICENSE-MIT diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 00000000..263ddac1 --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 00000000..cd8af3d6 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Manuel Cillero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 8d626330..7800fa53 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,30 @@ <p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) + </div> `PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. + + +# 📜 Licencia + +El código está disponible bajo una doble licencia: + + * **Licencia MIT** + ([LICENSE-MIT](LICENSE-MIT) o también https://opensource.org/licenses/MIT) + + * **Licencia Apache, Versión 2.0** + ([LICENSE-APACHE](LICENSE-APACHE) o también https://www.apache.org/licenses/LICENSE-2.0) + +Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el estándar de facto en +el ecosistema Rust. + + +# ✨ Contribuciones + +Cualquier contribución para añadir al proyecto se considerará automáticamente bajo la doble licencia +indicada arriba (MIT o Apache v2.0), sin términos o condiciones adicionales, tal y como permite la +licencia *Apache v2.0*. From cbee4c2cb88e9b03601fdaa26e6c2a09d56ed7bb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 3 Jul 2025 20:33:52 +0200 Subject: [PATCH 662/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20servidor=20web?= =?UTF-8?q?=20y=20primeras=20macros=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Crea el crate raíz `pagetop` y configura el workspace con `helpers/pagetop-macros`. - Añade las macros #[pagetop::main] y #[pagetop::test] que envuelven Actix-web para crear aplicaciones y pruebas asíncronas sin depender explícitamente del framework. - Reexporta, mediante el módulo `service`, los tipos esenciales de Actix-web para gestionar servidores y servicios web. - Implementa `Application::{new, run, test}` para simplificar el arranque y la ejecución de tests. - Expone `pagetop::prelude` con las macros, `service` y `Application` para una API pública coherente. - Incorpora ejemplo `examples/app-basic.rs` que levanta un servidor web vacío con el código mínimo para hacerlo. --- .gitignore | 2 + Cargo.lock | 1509 +++++++++++++++++++++++++++++ Cargo.toml | 38 + README.md | 16 +- examples/app-basic.rs | 6 + helpers/pagetop-macros/Cargo.toml | 21 + helpers/pagetop-macros/README.md | 36 + helpers/pagetop-macros/src/lib.rs | 60 ++ src/app.rs | 50 + src/lib.rs | 46 + src/prelude.rs | 11 + src/service.rs | 9 + tests/service.rs | 15 + 13 files changed, 1818 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 examples/app-basic.rs create mode 100644 helpers/pagetop-macros/Cargo.toml create mode 100644 helpers/pagetop-macros/README.md create mode 100644 helpers/pagetop-macros/src/lib.rs create mode 100644 src/app.rs create mode 100644 src/lib.rs create mode 100644 src/prelude.rs create mode 100644 src/service.rs create mode 100644 tests/service.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..855694f3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Ignora directorios de compilación +**/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..0528b57c --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1509 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "base64", + "bitflags", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "foldhash", + "futures-core", + "h2", + "http", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "tracing", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bytestring" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +dependencies = [ + "bytes", +] + +[[package]] +name = "cc" +version = "1.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + +[[package]] +name = "indexmap" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "pagetop" +version = "0.0.1" +dependencies = [ + "actix-web", + "pagetop-macros", +] + +[[package]] +name = "pagetop-macros" +version = "0.0.1" +dependencies = [ + "quote", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc-demangle" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..33bb5bf8 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "pagetop" +version = "0.0.1" +edition = "2021" + +description = """\ + Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables.\ +""" +categories = ["web-programming", "gui", "development-tools", "asynchronous"] +keywords = ["pagetop", "web", "framework", "frontend", "ssr"] + +repository.workspace = true +homepage.workspace = true +license.workspace = true +authors.workspace = true + +[dependencies] +actix-web = "4.11.0" + +pagetop-macros.workspace = true + + + +[workspace] +resolver = "2" +members = [ + "helpers/pagetop-macros", +] + +[workspace.package] +repository = "https://git.cillero.es/manuelcillero/pagetop" +homepage = "https://pagetop.cillero.es" +license = "MIT OR Apache-2.0" +authors = ["Manuel Cillero <manuel@cillero.es>"] + +[workspace.dependencies] +# Helpers +pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } diff --git a/README.md b/README.md index 7800fa53..7293f88d 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,20 @@ la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. +# ⚡️ Guía rápida + +La aplicación más sencilla de `PageTop` se ve así: + +```rust#ignore +use pagetop::prelude::*; + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::new().run()?.await +} +``` + + # 📜 Licencia El código está disponible bajo una doble licencia: @@ -26,7 +40,7 @@ Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el es el ecosistema Rust. -# ✨ Contribuciones +# ✨ Contribuir Cualquier contribución para añadir al proyecto se considerará automáticamente bajo la doble licencia indicada arriba (MIT o Apache v2.0), sin términos o condiciones adicionales, tal y como permite la diff --git a/examples/app-basic.rs b/examples/app-basic.rs new file mode 100644 index 00000000..53743870 --- /dev/null +++ b/examples/app-basic.rs @@ -0,0 +1,6 @@ +use pagetop::prelude::*; + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::new().run()?.await +} diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml new file mode 100644 index 00000000..7a4d30e1 --- /dev/null +++ b/helpers/pagetop-macros/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "pagetop-macros" +version = "0.0.1" +edition = "2021" + +description = """\ + Una colección de macros que mejoran la experiencia de desarrollo con PageTop.\ +""" +categories = ["development-tools::procedural-macro-helpers", "web-programming"] +keywords = ["pagetop", "macros", "proc-macros", "codegen"] + +repository.workspace = true +homepage.workspace = true +license.workspace = true +authors.workspace = true + +[lib] +proc-macro = true + +[dependencies] +quote = "1.0.40" diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md new file mode 100644 index 00000000..8bdc94c2 --- /dev/null +++ b/helpers/pagetop-macros/README.md @@ -0,0 +1,36 @@ +<div align="center"> + +<h1>PageTop Macros</h1> + +<p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) + +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# 🚧 Advertencia + +`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos +hasta que se libere la versión **1.0.0**. + + +# 📜 Licencia + +El código está disponible bajo una doble licencia: + + * **Licencia MIT** + ([LICENSE-MIT](LICENSE-MIT) o también https://opensource.org/licenses/MIT) + + * **Licencia Apache, Versión 2.0** + ([LICENSE-APACHE](LICENSE-APACHE) o también https://www.apache.org/licenses/LICENSE-2.0) + +Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el estándar de facto en +el ecosistema Rust. diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs new file mode 100644 index 00000000..1ed29c5b --- /dev/null +++ b/helpers/pagetop-macros/src/lib.rs @@ -0,0 +1,60 @@ +//! <div align="center"> +//! +//! <h1>PageTop Macros</h1> +//! +//! <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> +//! +//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! +//! </div> +//! +//! ## Sobre PageTop +//! +//! [PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la +//! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles +//! y configurables, basadas en HTML, CSS y JavaScript. + +use proc_macro::TokenStream; +use quote::quote; + +/// Define una función `main` asíncrona como punto de entrada de `PageTop`. +/// +/// # Ejemplos +/// +/// ```rust#ignore +/// #[pagetop::main] +/// async fn main() { +/// async { println!("Hello world!"); }.await +/// } +/// ``` +#[proc_macro_attribute] +pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { + let mut output: TokenStream = (quote! { + #[::pagetop::service::rt::main(system = "::pagetop::service::rt::System")] + }) + .into(); + + output.extend(item); + output +} + +/// Define funciones de prueba asíncronas para usar con `PageTop`. +/// +/// # Ejemplos +/// +/// ```rust#ignore +/// #[pagetop::test] +/// async fn test() { +/// assert_eq!(async { "Hello world" }.await, "Hello world"); +/// } +/// ``` +#[proc_macro_attribute] +pub fn test(_: TokenStream, item: TokenStream) -> TokenStream { + let mut output: TokenStream = (quote! { + #[::pagetop::service::rt::test(system = "::pagetop::service::rt::System")] + }) + .into(); + + output.extend(item); + output +} diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 00000000..711c7631 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,50 @@ +//! Prepara y ejecuta una aplicación creada con `Pagetop`. + +use crate::service; + +use std::io::Error; + +pub struct Application; + +impl Application { + /// Crea una instancia de la aplicación. + pub fn new() -> Self { + Self + } + + /// Ejecuta el servidor web de la aplicación. + pub fn run(self) -> Result<service::Server, Error> { + // Prepara el servidor web. + Ok(service::HttpServer::new(move || Self::service_app()) + .bind("localhost:8080")? + .run()) + } + + /// Prepara el servidor web de la aplicación para pruebas. + pub fn test( + self, + ) -> service::App< + impl service::Factory< + service::Request, + Config = (), + Response = service::Response<service::BoxBody>, + Error = service::Error, + InitError = (), + >, + > { + Self::service_app() + } + + // Configura el servicio web de la aplicación. + fn service_app() -> service::App< + impl service::Factory< + service::Request, + Config = (), + Response = service::Response<service::BoxBody>, + Error = service::Error, + InitError = (), + >, + > { + service::App::new() + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 00000000..c18003f8 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,46 @@ +//! <div align="center"> +//! +//! <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/static/banner.png" /> +//! +//! <h1>PageTop</h1> +//! +//! <p>Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables.</p> +//! +//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! +//! <br> +//! </div> +//! +//! `PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) +//! para la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y +//! JavaScript. +//! +//! # ⚡️ Guía rápida +//! +//! La aplicación más sencilla de `PageTop` se ve así: +//! +//! ```rust#ignore +//! use pagetop::prelude::*; +//! +//! #[pagetop::main] +//! async fn main() -> std::io::Result<()> { +//! Application::new().run()?.await +//! } +//! ``` + +#![cfg_attr(docsrs, feature(doc_cfg))] + +// RE-EXPORTED ************************************************************************************* + +pub use pagetop_macros::{main, test}; + +// API ********************************************************************************************* + +// Gestión del servidor y servicios web. +pub mod service; +// Prepara y ejecuta la aplicación. +pub mod app; + +// PRELUDE ***************************************************************************************** + +pub mod prelude; diff --git a/src/prelude.rs b/src/prelude.rs new file mode 100644 index 00000000..d35e9b11 --- /dev/null +++ b/src/prelude.rs @@ -0,0 +1,11 @@ +//! *Prelude* de `PageTop`. + +// RE-EXPORTED. + +pub use crate::{main, test}; + +// API. + +pub use crate::service; + +pub use crate::app::Application; diff --git a/src/service.rs b/src/service.rs new file mode 100644 index 00000000..9fe2450e --- /dev/null +++ b/src/service.rs @@ -0,0 +1,9 @@ +//! Gestión del servidor y servicios web ([actix-web](https://docs.rs/actix-web)). + +pub use actix_web::body::BoxBody; +pub use actix_web::dev::Server; +pub use actix_web::dev::ServiceFactory as Factory; +pub use actix_web::dev::ServiceRequest as Request; +pub use actix_web::dev::ServiceResponse as Response; +pub use actix_web::{http, rt, test}; +pub use actix_web::{App, Error, HttpServer}; diff --git a/tests/service.rs b/tests/service.rs new file mode 100644 index 00000000..51e74c74 --- /dev/null +++ b/tests/service.rs @@ -0,0 +1,15 @@ +use pagetop::prelude::*; + +#[pagetop::test] +async fn homepage_returns_404() { + let app = service::test::init_service(Application::new().test()).await; + + let req = service::test::TestRequest::get().uri("/").to_request(); + let resp = service::test::call_service(&app, req).await; + + // Comprueba el acceso a la ruta de inicio. + // assert_eq!(resp.status(), service::http::StatusCode::OK); + + // Sin ruta de inicio se obtiene error 404, pero el test funciona. + assert_eq!(resp.status(), service::http::StatusCode::NOT_FOUND); +} From f7dbd90af274dfc4366acf95a654a1ec0af6c527 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 5 Jul 2025 22:23:05 +0200 Subject: [PATCH 663/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20lectura=20de?= =?UTF-8?q?=20configuraci=C3=B3n=20global=20y=20modular?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Soporta jerarquía de ficheros TOML que mapean ajustes a estructuras fuertemente tipadas con valores predefinidos. - Permite definir configuraciones distintas para cada entorno. - Añade la macro `include_config!` para facilitar la asignación modular de ajustes de configuración. - Añade documentación detallada y tests de verificación. --- .gitignore | 5 + Cargo.lock | 141 ++++- Cargo.toml | 11 +- src/app.rs | 55 +- src/app/figfont.rs | 30 + src/app/slant.flf | 1295 +++++++++++++++++++++++++++++++++++++++++ src/app/small.flf | 1097 +++++++++++++++++++++++++++++++++++ src/app/speed.flf | 1301 ++++++++++++++++++++++++++++++++++++++++++ src/app/starwars.flf | 719 +++++++++++++++++++++++ src/config.rs | 179 ++++++ src/global.rs | 57 ++ src/lib.rs | 4 + src/prelude.rs | 7 + tests/config.rs | 41 ++ 14 files changed, 4938 insertions(+), 4 deletions(-) create mode 100644 src/app/figfont.rs create mode 100644 src/app/slant.flf create mode 100644 src/app/small.flf create mode 100644 src/app/speed.flf create mode 100644 src/app/starwars.flf create mode 100644 src/config.rs create mode 100644 src/global.rs create mode 100644 tests/config.rs diff --git a/.gitignore b/.gitignore index 855694f3..56ee30e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ # Ignora directorios de compilación **/target + +# Archivos de configuración locales +**/local.*.toml +**/local.toml +.env diff --git a/Cargo.lock b/Cargo.lock index 0528b57c..045a72fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,6 +319,27 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "colored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "config" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +dependencies = [ + "pathdiff", + "serde", + "toml", + "winnow", +] + [[package]] name = "cookie" version = "0.16.2" @@ -424,6 +445,22 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "figlet-rs" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4742a071cd9694fc86f9fa1a08fa3e53d40cc899d7ee532295da2d085639fbc5" + [[package]] name = "flate2" version = "1.1.2" @@ -712,6 +749,12 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + [[package]] name = "litemap" version = "0.8.0" @@ -807,10 +850,16 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "pagetop" -version = "0.0.1" +version = "0.0.2" dependencies = [ "actix-web", + "colored", + "config", + "figlet-rs", "pagetop-macros", + "serde", + "substring", + "terminal_size", ] [[package]] @@ -843,6 +892,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -994,6 +1049,19 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + [[package]] name = "ryu" version = "1.0.20" @@ -1038,6 +1106,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1104,6 +1181,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + [[package]] name = "syn" version = "2.0.104" @@ -1126,6 +1212,16 @@ dependencies = [ "syn", ] +[[package]] +name = "terminal_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +dependencies = [ + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "time" version = "0.3.41" @@ -1197,6 +1293,40 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tracing" version = "0.1.41" @@ -1367,6 +1497,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" diff --git a/Cargo.toml b/Cargo.toml index 33bb5bf8..a844f527 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.1" +version = "0.0.2" edition = "2021" description = """\ @@ -15,6 +15,13 @@ license.workspace = true authors.workspace = true [dependencies] +colored = "3.0.0" +config = { version = "0.15.11", default-features = false, features = ["toml"] } +figlet-rs = "0.1.5" +serde.workspace = true +substring = "1.4.5" +terminal_size = "0.4.2" + actix-web = "4.11.0" pagetop-macros.workspace = true @@ -34,5 +41,7 @@ license = "MIT OR Apache-2.0" authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] +serde = { version = "1.0", features = ["derive"] } + # Helpers pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } diff --git a/src/app.rs b/src/app.rs index 711c7631..bac74821 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,6 +1,10 @@ //! Prepara y ejecuta una aplicación creada con `Pagetop`. -use crate::service; +mod figfont; + +use crate::{global, service}; + +use substring::Substring; use std::io::Error; @@ -9,14 +13,61 @@ pub struct Application; impl Application { /// Crea una instancia de la aplicación. pub fn new() -> Self { + // Al arrancar muestra una cabecera para la aplicación. + Self::show_banner(); Self } + // Muestra una cabecera para la aplicación basada en la configuración. + fn show_banner() { + use colored::Colorize; + use terminal_size::{terminal_size, Width}; + + if global::SETTINGS.app.startup_banner.to_lowercase() != "off" { + // Nombre de la aplicación, ajustado al ancho del terminal si es necesario. + let mut app_ff = String::new(); + let app_name = &global::SETTINGS.app.name; + if let Some((Width(term_width), _)) = terminal_size() { + if term_width >= 80 { + let maxlen: usize = ((term_width / 10) - 2).into(); + let mut app = app_name.substring(0, maxlen).to_owned(); + if app_name.len() > maxlen { + app = format!("{app}..."); + } + if let Some(ff) = figfont::FIGFONT.convert(&app) { + app_ff = ff.to_string(); + } + } + } + if app_ff.is_empty() { + println!("\n{app_name}"); + } else { + print!("\n{app_ff}"); + } + + // Descripción de la aplicación. + if !global::SETTINGS.app.description.is_empty() { + println!("{}", global::SETTINGS.app.description.cyan()); + }; + + // Versión de PageTop. + println!( + "{} {}\n", + "Powered by PageTop".yellow(), + env!("CARGO_PKG_VERSION").yellow() + ); + } + } + /// Ejecuta el servidor web de la aplicación. pub fn run(self) -> Result<service::Server, Error> { // Prepara el servidor web. Ok(service::HttpServer::new(move || Self::service_app()) - .bind("localhost:8080")? + .bind(format!( + "{}:{}", + &global::SETTINGS.server.bind_address, + &global::SETTINGS.server.bind_port + ))? .run()) } diff --git a/src/app/figfont.rs b/src/app/figfont.rs new file mode 100644 index 00000000..6592d813 --- /dev/null +++ b/src/app/figfont.rs @@ -0,0 +1,30 @@ +use crate::global; + +use std::sync::LazyLock; + +use figlet_rs::FIGfont; + +pub static FIGFONT: LazyLock<FIGfont> = LazyLock::new(|| { + let slant = include_str!("slant.flf"); + let small = include_str!("small.flf"); + let speed = include_str!("speed.flf"); + let starwars = include_str!("starwars.flf"); + + FIGfont::from_content( + match global::SETTINGS.app.startup_banner.to_lowercase().as_str() { + "off" => slant, + "slant" => slant, + "small" => small, + "speed" => speed, + "starwars" => starwars, + _ => { + println!( + "\n FIGfont \"{}\" not found for banner. Using \"Slant\". Check settings.", + global::SETTINGS.app.startup_banner, + ); + slant + } + }, + ) + .unwrap() +}); diff --git a/src/app/slant.flf b/src/app/slant.flf new file mode 100644 index 00000000..ea27b6ed --- /dev/null +++ b/src/app/slant.flf @@ -0,0 +1,1295 @@ +flf2a$ 6 5 16 15 10 0 18319 +Slant by Glenn Chappell 3/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ + __@ + / /@ + / / @ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ + $ @ +$ @ + @@ + __ __ @ + __/ // /_@ + /_ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ + __@ + _/ /@ + / __/@ + (_ ) @ +/ _/ @ +/_/ @@ + _ __@ + (_)_/_/@ + _/_/ @ + _/_/_ @ +/_/ (_) @ + @@ + ___ @ + ( _ ) @ + / __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ + _ @ + ( )@ + |/ @ + $ @ +$ @ + @@ + __@ + _/_/@ + / / @ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + / / @ + _/_/ @ +/_/ @@ + @ + __/|_@ + | /@ +/_ __| @ + |/ @ + @@ + @ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ + _ @ +( )@ +|/ @@ + @ + @ + ______@ +/_____/@ + $ @ + @@ + @ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ + _/_/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ___@ + < /@ + / / @ + / / @ +/_/ @ + @@ + ___ @ + |__ \@ + __/ /@ + / __/ @ +/____/ @ + @@ + _____@ + |__ /@ + /_ < @ + ___/ / @ +/____/ @ + @@ + __ __@ + / // /@ + / // /_@ +/__ __/@ + /_/ @ + @@ + ______@ + / ____/@ + /___ \ @ + ____/ / @ +/_____/ @ + @@ + _____@ + / ___/@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _____@ +/__ /@ + / / @ + / / @ +/_/ @ + @@ + ____ @ + ( __ )@ + / __ |@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + \__, / @ +/____/ @ + @@ + @ + _ @ + (_)@ + _ @ +(_) @ + @@ + @ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +/ / @ +\ \ @ + \_\@ + @@ + @ + _____@ + /____/@ +/____/ @ + $ @ + @@ +__ @ +\ \ @ + \ \@ + / /@ +/_/ @ + @@ + ___ @ + /__ \@ + / _/@ + /_/ @ +(_) @ + @@ + ______ @ + / ____ \@ + / / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ + ___ @ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ + ____ @ + / __ )@ + / __ |@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / __/ @ + / /___ @ +/_____/ @ + @@ + ______@ + / ____/@ + / /_ @ + / __/ @ +/_/ @ + @@ + ______@ + / ____/@ + / / __ @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / / / /@ + / /_/ / @ + / __ / @ +/_/ /_/ @ + @@ + ____@ + / _/@ + / / @ + _/ / @ +/___/ @ + @@ + __@ + / /@ + __ / / @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / //_/@ + / ,< @ + / /| | @ +/_/ |_| @ + @@ + __ @ + / / @ + / / @ + / /___@ +/_____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ + / / / / @ +/_/ /_/ @ + @@ + _ __@ + / | / /@ + / |/ / @ + / /| / @ +/_/ |_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / ____/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\___\_\ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / _, _/ @ +/_/ |_| @ + @@ + _____@ + / ___/@ + \__ \ @ + ___/ / @ +/____/ @ + @@ + ______@ + /_ __/@ + / / @ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ __@ +| | / /@ +| | / / @ +| |/ / @ +|___/ @ + @@ + _ __@ +| | / /@ +| | /| / / @ +| |/ |/ / @ +|__/|__/ @ + @@ + _ __@ + | |/ /@ + | / @ + / | @ +/_/|_| @ + @@ +__ __@ +\ \/ /@ + \ / @ + / / @ +/_/ @ + @@ + _____@ +/__ /@ + / / @ + / /__@ +/____/@ + @@ + ___@ + / _/@ + / / @ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + / / @ + _/ / @ +/__/ @@ + //|@ + |/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ + ______@ +/_____/@@ + _ @ + ( )@ + V @ + $ @ +$ @ + @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ + __ @ + / /_ @ + / __ \@ + / /_/ /@ +/_.___/ @ + @@ + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + __@ + ____/ /@ + / __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ + ___ @ + / _ \@ +/ __/@ +\___/ @ + @@ + ____@ + / __/@ + / /_ @ + / __/ @ +/_/ @ + @@ + @ + ____ _@ + / __ `/@ + / /_/ / @ + \__, / @ +/____/ @@ + __ @ + / /_ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ + __/ / @ +/___/ @@ + __ @ + / /__@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __@ + / /@ + / / @ + / / @ +/_/ @ + @@ + @ + ____ ___ @ + / __ `__ \@ + / / / / / /@ +/_/ /_/ /_/ @ + @@ + @ + ____ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + @ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + @ + ____ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ + _____@ + / ___/@ + / / @ +/_/ @ + @@ + @ + _____@ + / ___/@ + (__ ) @ +/____/ @ + @@ + __ @ + / /_@ + / __/@ +/ /_ @ +\__/ @ + @@ + @ + __ __@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ + _ __@ +| | / /@ +| |/ / @ +|___/ @ + @@ + @ + _ __@ +| | /| / /@ +| |/ |/ / @ +|__/|__/ @ + @@ + @ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + @ + __ __@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ + @ + ____@ +/_ /@ + / /_@ +/___/@ + @@ + __@ + _/_/@ + _/_/ @ +< < @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ + / / @ +/_/ @@ + _ @ + | |@ + / /@ + _>_>@ + _/_/ @ +/_/ @@ + /\//@ + //\/ @ + $ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ +162 CENT SIGN + __@ + __/ /@ + / ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 POUND SIGN + ____ @ + / ,__\@ + __/ /_ @ + _/ /___ @ +(_,____/ @ + @@ +164 CURRENCY SIGN + /|___/|@ + | __ / @ + / /_/ / @ + /___ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @ + @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + __ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | || | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ______ @ + / _____\ @ + / / ___/ |@ + / / /__ / @ +| \___/ / @ + \______/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + ______@ +/___ /@ + /_/ @ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + _____@ +/____/@ + $ @ + @@ +174 REGISTERED SIGN + ______ @ + / ___ \ @ + / / _ \ |@ + / / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 MACRON + ______@ +/_____/@ + $ @ + $ @ +$ @ + @@ +176 DEGREE SIGN + ___ @ + / _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ |@ + / __/ @ +/____/ @ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |_ /@ + _/_ < @ +/____/ @ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / / / /@ + / /_/ / @ + / ._,_/ @ +/_/ @@ +182 PILCROW SIGN + _______@ + / _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ + $ @ +$ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + ___@ + < /@ + / / @ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + \ \ \@ + / / /@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + ___ __ @ + < / _/_/ @ + / /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 VULGAR FRACTION ONE HALF + ___ __ @ + < / _/_/__ @ + / /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |_ / _/_/ @ + _/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 INVERTED QUESTION MARK + _ @ + (_)@ + _/ / @ +/ _/_ @ +\___/ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + __________@ + / ____/@ + / /| __/ @ + / __ /___ @ +/_/ /_____/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + /_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\@ + / __/@ + / _/ @ +/___/ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / __/@ + / _/ @ +/___/ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / __/ @ + / _/ @ +/___/ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / __/ @ + / _/ @ +/___/ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\@ + / _/@ + _/ / @ +/___/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + _/_/@ + / _/@ + _/ / @ +/___/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + / _/ @ + _/ / @ +/___/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + / _/ @ + _/ / @ +/___/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + / __ \@ + __/ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + _//\/ @ + / |/ / @ + / / @ +/_/|_/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ + / //// /@ +/ //// / @ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ +__/_/_@ +\ \/ /@ + \ / @ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / /_ @ + / __ \@ + / ____/@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + __\_\_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + __/_/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //| @ + _|/||_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + __(())@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ____ ___ @ + / __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ + / _ \@ +/ __/@ +\___/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ + / _ \@ +/ __/@ +\___/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + / / @ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + || @ + =||=@ + ___ || @ +/ __` | @ +\____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / __ \ @ + / / / / @ +/_/ /_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 DIVISION SIGN + @ + _ @ + __(_)_@ +/_____/@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + __/_/_@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / /_ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ + / /_/ / @ + \__, / @ +/____/ @@ diff --git a/src/app/small.flf b/src/app/small.flf new file mode 100644 index 00000000..d2a2c49c --- /dev/null +++ b/src/app/small.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 15 10 0 22415 +Small by Glenn Chappell 4/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + @@ + _ _ @ + _| | |_ @ + |_ . _|@ + |_ _|@ + |_|_| @@ + @ + ||_@ + (_-<@ + / _/@ + || @@ + _ __ @ + (_)/ / @ + / /_ @ + /_/(_)@ + @@ + __ @ + / _|___ @ + > _|_ _|@ + \_____| @ + @@ + _ @ + ( )@ + |/ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + /_/ @@ + @ + _/\_@ + > <@ + \/ @ + @@ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + _ @ + ( )@ + |/ @@ + @ + ___ @ + |___|@ + $ @ + @@ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + /_/ @ + @@ + __ @ + / \ @ + | () |@ + \__/ @ + @@ + _ @ + / |@ + | |@ + |_|@ + @@ + ___ @ + |_ )@ + / / @ + /___|@ + @@ + ____@ + |__ /@ + |_ \@ + |___/@ + @@ + _ _ @ + | | | @ + |_ _|@ + |_| @ + @@ + ___ @ + | __|@ + |__ \@ + |___/@ + @@ + __ @ + / / @ + / _ \@ + \___/@ + @@ + ____ @ + |__ |@ + / / @ + /_/ @ + @@ + ___ @ + ( _ )@ + / _ \@ + \___/@ + @@ + ___ @ + / _ \@ + \_, /@ + /_/ @ + @@ + _ @ + (_)@ + _ @ + (_)@ + @@ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + < < @ + \_\@ + @@ + @ + ___ @ + |___|@ + |___|@ + @@ + __ @ + \ \ @ + > >@ + /_/ @ + @@ + ___ @ + |__ \@ + /_/@ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + \ \__,_|@ + \____/ @@ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + ___ @ + | _ )@ + | _ \@ + |___/@ + @@ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + ___ @ + | \ @ + | |) |@ + |___/ @ + @@ + ___ @ + | __|@ + | _| @ + |___|@ + @@ + ___ @ + | __|@ + | _| @ + |_| @ + @@ + ___ @ + / __|@ + | (_ |@ + \___|@ + @@ + _ _ @ + | || |@ + | __ |@ + |_||_|@ + @@ + ___ @ + |_ _|@ + | | @ + |___|@ + @@ + _ @ + _ | |@ + | || |@ + \__/ @ + @@ + _ __@ + | |/ /@ + | ' < @ + |_|\_\@ + @@ + _ @ + | | @ + | |__ @ + |____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + |_| |_|@ + @@ + _ _ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + | _ \@ + | _/@ + |_| @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__\_\@ + @@ + ___ @ + | _ \@ + | /@ + |_|_\@ + @@ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _____ @ + |_ _|@ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \/\/ / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + |_| @ + @@ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __ @ + | _|@ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + @@ + @ + @ + @ + ___ @ + |___|@@ + _ @ + ( )@ + \|@ + $ @ + @@ + @ + __ _ @ + / _` |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \@ + |_.__/@ + @@ + @ + __ @ + / _|@ + \__|@ + @@ + _ @ + __| |@ + / _` |@ + \__,_|@ + @@ + @ + ___ @ + / -_)@ + \___|@ + @@ + __ @ + / _|@ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + \__, |@ + |___/ @@ + _ @ + | |_ @ + | ' \ @ + |_||_|@ + @@ + _ @ + (_)@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + _/ |@ + |__/ @@ + _ @ + | |__@ + | / /@ + |_\_\@ + @@ + _ @ + | |@ + | |@ + |_|@ + @@ + @ + _ __ @ + | ' \ @ + |_|_|_|@ + @@ + @ + _ _ @ + | ' \ @ + |_||_|@ + @@ + @ + ___ @ + / _ \@ + \___/@ + @@ + @ + _ __ @ + | '_ \@ + | .__/@ + |_| @@ + @ + __ _ @ + / _` |@ + \__, |@ + |_|@@ + @ + _ _ @ + | '_|@ + |_| @ + @@ + @ + ___@ + (_-<@ + /__/@ + @@ + _ @ + | |_ @ + | _|@ + \__|@ + @@ + @ + _ _ @ + | || |@ + \_,_|@ + @@ + @ + __ __@ + \ V /@ + \_/ @ + @@ + @ + __ __ __@ + \ V V /@ + \_/\_/ @ + @@ + @ + __ __@ + \ \ /@ + /_\_\@ + @@ + @ + _ _ @ + | || |@ + \_, |@ + |__/ @@ + @ + ___@ + |_ /@ + /__|@ + @@ + __@ + / /@ + _| | @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | |_@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + @@ + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + |_|@ + @@ +162 CENT SIGN + @ + || @ + / _)@ + \ _)@ + || @@ +163 POUND SIGN + __ @ + _/ _\ @ + |_ _|_ @ + (_,___|@ + @@ +164 CURRENCY SIGN + /\_/\@ + \ . /@ + / _ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + / _)@ + /\ \ @ + \ \/ @ + (__/ @@ +168 DIAERESIS + _ _ @ + (_)(_)@ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / _| \@ + \ \__| /@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + < < < @ + \_\_\@ + @@ +172 NOT SIGN + ____ @ + |__ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + __ @ + |__|@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / | -) \@ + \ ||\\ /@ + \____/ @@ +175 MACRON + ___ @ + |___|@ + $ @ + $ @ + @@ +176 DEGREE SIGN + _ @ + /.\@ + \_/@ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ + /__|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ + |__)@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | || |@ + | .,_|@ + |_| @@ +182 PILCROW SIGN + ____ @ + / |@ + \_ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + > > >@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / |/ /__ @ + |_/ /_' |@ + /_/ |_|@ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / |/ /_ @ + |_/ /_ )@ + /_//__|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ // /__ @ + |__) /_' |@ + /_/ |_|@ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /--\ @ + /_/\_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /--\ @ + /_/\_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + /--\ @ + /_/\_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/|@ + |/\/ @ + /--\ @ + /_/\_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + __ @ + (()) @ + /--\ @ + /_/\_\@ + @@ +198 LATIN CAPITAL LETTER AE + ____ @ + /, __|@ + / _ _| @ + /_/|___|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + | -<@ + |__<@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + /_/@ + | -<@ + |__<@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + |/\|@ + | -<@ + |__<@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + | -< @ + |__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | __ \ @ + |_ _|) |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\_ @ + / __ \@ + \____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + _/_/ @ + / __ \@ + \____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + |/\| @ + / __ \@ + \____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / __ \@ + \____/@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ +215 MULTIPLICATION SIGN + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + _/_/_@ + \ V /@ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |_ @ + | -_)@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + _/_/ @ + / _` |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + / _` |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/|@ + |/\/ @ + / _` |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _` |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ___ @ + / _` -_)@ + \__,___|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + __ @ + / _|@ + \__|@ + )_)@@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / -_)@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / -_)@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / -_)@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / -_) @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + \\/\ @ + \/\\ @ + / _` |@ + \___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | ' \ @ + |_||_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \@ + \___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \@ + \___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + \___/@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / _ \@ + \___/@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ +247 DIVISION SIGN + _ @ + (_) @ + |___|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ + / //\@ + \//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + \_\_ @ + | || |@ + \_,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + |/\| @ + | || |@ + \_,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_, |@ + |__/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \@ + | .__/@ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_, |@ + |__/ @@ diff --git a/src/app/speed.flf b/src/app/speed.flf new file mode 100644 index 00000000..d294c52f --- /dev/null +++ b/src/app/speed.flf @@ -0,0 +1,1301 @@ +flf2a$ 6 5 16 15 16 +Speed by Claude Martins 2/95 -- based on Slant +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Explanation of first line: +flf2 - "magic number" for file identification +a - should always be `a', for now +$ - the "hardblank" -- prints as a blank, but can't be smushed +6 - height of a character +5 - height of a character, not including descenders +14 - max line length (excluding comment lines) + a fudge factor +15 - default smushmode for this font +16 - number of comment lines + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +______@ +___ /@ +__ / @ + /_/ @ +(_) @ + @@ +___ _ @ +_( | )@ +_|/|/ @ + $ @ + $ @ + @@ +_______ __ @ +____/ // /_@ +_ _ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ +_______@ +____/ /@ +__ __/@ +_(_ ) @ +/ _/ @ +/_/ @@ +____ __@ +__(_)_/_/@ +____/_/ @ +__/_/_ @ +/_/ (_) @ + @@ +______ @ +__( _ ) @ +_ __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ +___ @ +_( )@ +_|/ @ + $ @ +$ @ + @@ +_______@ +____/_/@ +__ / @ +_ / @ +/ / @ +|_| @@ +______ @ +____| |@ +____ /@ +___ / @ +__/_/ @ +/_/ @@ +_____ @ +____/|_@ +_| /@ +/_ __| @ + |/ @ + @@ + @ +______ @ +___/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ +___ @ +_( )@ +_|/ @@ + @ + @ +________@ +_/_____/@ + $ @ + @@ + @ + @ + @ +___ @ +_(_)@ + @@ +_________@ +______/_/@ +____/_/ @ +__/_/ @ +/_/ @ + @@ +_______ @ +__ __ \@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +______@ +__< /@ +__ / @ +_ / @ +/_/ @ + @@ +______ @ +__|__ \@ +____/ /@ +_ __/ @ +/____/ @ + @@ +________@ +__|__ /@ +___/_ < @ +____/ / @ +/____/ @ + @@ +_____ __@ +__ // /@ +_ // /_@ +/__ __/@ + /_/ @ + @@ +__________@ +___ ____/@ +______ \ @ + ____/ / @ +/_____/ @ + @@ +________@ +__ ___/@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +______@ +/__ /@ +__ / @ +_ / @ +/_/ @ + @@ +_______ @ +__( __ )@ +_ __ |@ +/ /_/ / @ +\____/ @ + @@ +_______ @ +__ __ \@ +_ /_/ /@ +_\__, / @ +/____/ @ + @@ + @ +_____ @ +___(_)@ +___ @ +_(_) @ + @@ + @ +_____ @ +___(_)@ +___ @ +_( ) @ +_|/ @@ +____@ +_ /@ +/ / @ +\ \ @ + \_\@ + @@ + @ +_______@ +_ ____/@ +/____/ @ + $ @ + @@ +___ @ +__ \ @ +___ \@ +__ /@ +_/_/ @ + @@ +_____ @ +_ __ \@ +__/ _/@ +_/_/ @ +(_) @ + @@ +_________ @ +__ ____ \@ +_ / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ +_______ @ +___ |@ +__ /| |@ +_ ___ |@ +/_/ |_|@ + @@ +________ @ +___ __ )@ +__ __ |@ +_ /_/ / @ +/_____/ @ + @@ +_________@ +__ ____/@ +_ / @ +/ /___ @ +\____/ @ + @@ +________ @ +___ __ \@ +__ / / /@ +_ /_/ / @ +/_____/ @ + @@ +__________@ +___ ____/@ +__ __/ @ +_ /___ @ +/_____/ @ + @@ +__________@ +___ ____/@ +__ /_ @ +_ __/ @ +/_/ @ + @@ +_________@ +__ ____/@ +_ / __ @ +/ /_/ / @ +\____/ @ + @@ +______ __@ +___ / / /@ +__ /_/ / @ +_ __ / @ +/_/ /_/ @ + @@ +________@ +____ _/@ + __ / @ +__/ / @ +/___/ @ + @@ +_________@ +______ /@ +___ _ / @ +/ /_/ / @ +\____/ @ + @@ +______ __@ +___ //_/@ +__ ,< @ +_ /| | @ +/_/ |_| @ + @@ +______ @ +___ / @ +__ / @ +_ /___@ +/_____/@ + @@ +______ ___@ +___ |/ /@ +__ /|_/ / @ +_ / / / @ +/_/ /_/ @ + @@ +_____ __@ +___ | / /@ +__ |/ / @ +_ /| / @ +/_/ |_/ @ + @@ +_______ @ +__ __ \@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +________ @ +___ __ \@ +__ /_/ /@ +_ ____/ @ +/_/ @ + @@ +_______ @ +__ __ \@ +_ / / /@ +/ /_/ / @ +\___\_\ @ + @@ +________ @ +___ __ \@ +__ /_/ /@ +_ _, _/ @ +/_/ |_| @ + @@ +________@ +__ ___/@ +_____ \ @ +____/ / @ +/____/ @ + @@ +________@ +___ __/@ +__ / @ +_ / @ +/_/ @ + @@ +_____ __@ +__ / / /@ +_ / / / @ +/ /_/ / @ +\____/ @ + @@ +___ __@ +__ | / /@ +__ | / / @ +__ |/ / @ +_____/ @ + @@ +___ __@ +__ | / /@ +__ | /| / / @ +__ |/ |/ / @ +____/|__/ @ + @@ +____ __@ +__ |/ /@ +__ / @ +_ | @ +/_/|_| @ + @@ +__ __@ +_ \/ /@ +__ / @ +_ / @ +/_/ @ + @@ +______@ +___ /@ +__ / @ +_ /__@ +/____/@ + @@ +________@ +____ _/@ +___ / @ +__ / @ +_ / @ +/__/ @@ +___ @ +__ \ @ +___ \ @ +____ \ @ +______\@ + @@ +________@ +____/ /@ +____ / @ +___ / @ +__/ / @ +/__/ @@ +_ //|@ +_|/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ +________@ +_/_____/@@ +___ @ +_( )@ +__V @ + $ @ +$ @ + @@ + @ +______ _@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +______ @ +___ /_ @ +__ __ \@ +_ /_/ /@ +/_.___/ @ + @@ + @ +_______@ +_ ___/@ +/ /__ @ +\___/ @ + @@ +_________@ +______ /@ +_ __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ +_____ @ +_ _ \@ +/ __/@ +\___/ @ + @@ +________@ +___ __/@ +__ /_ @ +_ __/ @ +/_/ @ + @@ + @ +_______ _@ +__ __ `/@ +_ /_/ / @ +_\__, / @ +/____/ @@ +______ @ +___ /_ @ +__ __ \@ +_ / / /@ +/_/ /_/ @ + @@ +_____ @ +___(_)@ +__ / @ +_ / @ +/_/ @ + @@ +________ @ +______(_)@ +_____ / @ +____ / @ +___ / @ +/___/ @@ +______ @ +___ /__@ +__ //_/@ +_ ,< @ +/_/|_| @ + @@ +______@ +___ /@ +__ / @ +_ / @ +/_/ @ + @@ + @ +_______ ___ @ +__ __ `__ \@ +_ / / / / /@ +/_/ /_/ /_/ @ + @@ + @ +_______ @ +__ __ \@ +_ / / /@ +/_/ /_/ @ + @@ + @ +______ @ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ + @ +________ @ +___ __ \@ +__ /_/ /@ +_ .___/ @ +/_/ @@ + @ +______ _@ +_ __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ +________@ +__ ___/@ +_ / @ +/_/ @ + @@ + @ +________@ +__ ___/@ +_(__ ) @ +/____/ @ + @@ +_____ @ +__ /_@ +_ __/@ +/ /_ @ +\__/ @ + @@ + @ +____ __@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ +___ __@ +__ | / /@ +__ |/ / @ +_____/ @ + @@ + @ +___ __@ +__ | /| / /@ +__ |/ |/ / @ +____/|__/ @ + @@ + @ +____ __@ +__ |/_/@ +__> < @ +/_/|_| @ + @@ + @ +_____ __@ +__ / / /@ +_ /_/ / @ +_\__, / @ +/____/ @@ + @ +______@ +___ /@ +__ /_@ +_____/@ + @@ +_______@ +____/_/@ +__/_/ @ +< < @ +/ / @ +\_\ @@ +_______@ +____ /@ +___ / @ +__ / @ +_ / @ +/_/ @@ +____ _ @ +____| |@ +____/ /@ +____>_>@ +__/_/ @ +/_/ @@ +__/\//@ +_//\/ @ + $ @ + $ @ +$ @ + @@ +_____ _ @ +___(_)(_)@ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\____/ @ + @@ +____ _ @ +__(_)_(_)@ +_ __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\__,_/ @ + @@ +_________ @ +____ __ \@ +___ / / /@ +__ /_| | @ +_ //__/ @ +/_/ @@ +160 + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 +_____ @ +___(_)@ +__ / @ +_ / @ +/_/ @ + @@ +162 +_______@ +____/ /@ +_ ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 +_________ @ +____ ,__\@ +___/ /_ @ +__/ /___ @ +(_,____/ @ + @@ +164 +___ /|___/|@ +___| __ / @ +__ /_/ / @ +_ ___ | @ +|/ |/ @ + @@ +165 +___ ____@ +___| / /@ +_ _ __/@ +/_ __/ @ + /_/ @ + @@ +166 +_______@ +____ /@ +_____/ @ +____ @ +_ / @ +/_/ @@ +167 +_______ @ +____/ _)@ +__ | | @ +_| || | @ +_| |_/ @ +(__/ @@ +168 +___ _ @ +_(_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 +__________ @ +___ _____\ @ +__ / ___/ |@ +_ / /__ / @ +| \___/ / @ + \______/ @@ +170 +______ _@ +__ _ `/@ +__\_,_/ @ +/____/ @ + $ @ + @@ +171 +______@ +_ / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 + @ +________@ +_/___ /@ + /_/ @ + $ @ + @@ +173 + @ + @ +_______@ +_/____/@ + $ @ + @@ +174 +__________ @ +___ ___ \ @ +__ / _ \ |@ +_ / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 +________@ +_/_____/@ + $ @ + $ @ + $ @ + @@ +176 +_____ @ +_ _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 +________ @ +_____/ /_@ +____ __/@ +___/_/_ @ +/_____/ @ + @@ +178 +__ ___ @ +__|_ |@ +_ __/ @ +/____/ @ + $ @ + @@ +179 +__ ____@ +__|_ /@ +__/_ < @ +/____/ @ + $ @ + @@ +180 +____@ +_/_/@ + $ @ + $ @ +$ @ + @@ +181 + @ +______ __@ +___ / / /@ +__ /_/ / @ +_ ._,_/ @ +/_/ @@ +182 +_________@ +_ _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 + @ +___ @ +_(_)@ + $ @ + $ @ + @@ +184 + @ + @ + @ + @ +___ @ +_/_)@@ +185 +_____@ +_< /@ +_ / @ +/_/ @ +$ @ + @@ +186 +______ @ +__ _ \@ +__\___/@ +/____/ @ + $ @ + @@ +187 +_____ @ +__ \ \ @ +___ \ \@ +__ / /@ +___/_/ @ + @@ +188 +_____ __ @ +_< / _/_/ @ +_/ /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 +_____ __ @ +_< / _/_/__ @ +_/ /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 +__ ____ __ @ +__|_ / _/_/ @ +__/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 +___ _ @ +___(_)@ +__ / @ +/ _/_ @ +\___/ @ + @@ +192 +______ @ +____\_\@ +__ _ |@ +_ __ |@ +/_/ |_|@ + @@ +193 +_______@ +____/_/@ +__ _ |@ +_ __ |@ +/_/ |_|@ + @@ +194 +____ //|@ +____|/||@ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +195 +_____/\//@ +____//\/ @ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +196 +_____ _ @ +___(_)(_)@ +__ _ | @ +_ __ | @ +/_/ |_| @ + @@ +197 +____(())@ +___ |@ +__ /| |@ +_ ___ |@ +/_/ |_|@ + @@ +198 +______________@ +___ ____/@ +__ /| __/ @ +_ __ /___ @ +/_/ /_____/ @ + @@ +199 +_________@ +__ ____/@ +_ / @ +/ /___ @ +\____/ @ + /_) @@ +200 +______ @ +____\_\@ +__ __/@ +_ _/ @ +/___/ @ + @@ +201 +_______@ +____/_/@ +__ __/@ +_ _/ @ +/___/ @ + @@ +202 +____ //|@ +____|/||@ +__ __/ @ +_ _/ @ +/___/ @ + @@ +203 +_____ _ @ +___(_)(_)@ +__ __/ @ +_ _/ @ +/___/ @ + @@ +204 +______ @ +____\_\@ +__ _/@ +__/ / @ +/___/ @ + @@ +205 +_______@ +____/_/@ +__ _/@ +__/ / @ +/___/ @ + @@ +206 +____ //|@ +____|/||@ +__ _/ @ +__/ / @ +/___/ @ + @@ +207 +_____ _ @ +___(_)(_)@ +__ _/ @ +__/ / @ +/___/ @ + @@ +208 +_________ @ +____ __ \@ +___ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 +_____/\//@ +____//\/ @ +__ |/ / @ +_ / @ +/_/|_/ @ + @@ +210 +______ @ +____\_\@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +211 +_______@ +____/_/@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +212 +___ //|@ +___|/||@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +213 +____/\//@ +___//\/ @ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 + @ +__ @ +_/|/|@ + > < @ +|/|/ @ + @@ +216 +________ @ +__ _// \@ +_ //// /@ +/ //// / @ +\_//__/ @ + @@ +217 +______ @ +____\_\_@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +218 +_______ @ +____/_/_@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +219 +___ //| @ +___|/||_@ +_ / / /@ +/ /_/ / @ +\____/ @ + @@ +220 +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\____/ @ + @@ +221 +______ @ +___/_/_@ +__ \/ /@ +___ / @ +__/_/ @ + @@ +222 +______ @ +___ /_ @ +__ __ \@ +_ ____/@ +/_/ @ + @@ +223 +_________ @ +____ __ \@ +___ / / /@ +__ /_| | @ +_ //__/ @ +/_/ @@ +224 +______ @ +____\_\_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 +_______ @ +____/_/_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 +___ //| @ +___|/||_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 +____/\//@ +___//\/_@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 +____ _ @ +__(_)_(_)@ +_ __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 +_______ @ +____(())@ +_ __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 + @ +______ ___ @ +_ __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 + @ +_______@ +_ ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 +_____ @ +___\_\@ +_ _ \@ +/ __/@ +\___/ @ + @@ +233 +______@ +___/_/@ +_ _ \@ +/ __/@ +\___/ @ + @@ +234 +___ //|@ +___|/||@ +_ _ \ @ +/ __/ @ +\___/ @ + @@ +235 +____ _ @ +__(_)(_)@ +_ _ \ @ +/ __/ @ +\___/ @ + @@ +236 +_____ @ +___\_\@ +__ / @ +_ / @ +/_/ @ + @@ +237 +______@ +___/_/@ +__ / @ +_ / @ +/_/ @ + @@ +238 +___ //|@ +___|/||@ +__ / @ +_ / @ +/_/ @ + @@ +239 +_ _ _ @ +_(_)_(_)@ +__/ / @ +_ / @ +/_/ @ + @@ +240 +____ || @ +____=||=@ +____ || @ +/ __` | @ +\____/ @ + @@ +241 +_____/\//@ +____//\/ @ +__ __ \ @ +_ / / / @ +/_/ /_/ @ + @@ +242 +______ @ +____\_\@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +243 +_______@ +____/_/@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +244 +___ //|@ +___|/||@ +_ __ \@ +/ /_/ /@ +\____/ @ + @@ +245 +____/\//@ +___//\/ @ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 +____ _ @ +__(_)_(_)@ +_ __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 + @ +_____ @ +___(_)_@ +/_____/@ + (_) @ + @@ +248 + @ +_______ @ +_ _// \@ +/ //// /@ +\_//__/ @ + @@ +249 +______ @ +____\_\_@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 +_______ @ +____/_/_@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 +___ //| @ +___|/||_@ +_ / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 +____ _ @ +__(_) (_)@ +_ / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 +________ @ +_____/_/_@ +__ / / /@ +_ /_/ / @ +_\__, / @ +/____/ @@ +254 +_______ @ +____ /_ @ +___ __ \@ +__ /_/ /@ +_ .___/ @ +/_/ @@ +255 +_____ _ @ +___(_) (_)@ +__ / / / @ +_ /_/ / @ +_\__, / @ +/____/ @@ diff --git a/src/app/starwars.flf b/src/app/starwars.flf new file mode 100644 index 00000000..6ea55f02 --- /dev/null +++ b/src/app/starwars.flf @@ -0,0 +1,719 @@ +flf2a$ 7 6 22 15 4 +starwars.flf by Ryan Youck (youck@cs.uregina.ca) Dec 25/1994 +I am not responsible for use of this font +Based on Big.flf by Glenn Chappell + +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ + __ $@ +| |$@ +| |$@ +| |$@ +|__|$@ +(__)$@ + $@@ + _ _ @ +( | )@ + V V @ + $ @ + $ @ + $ @ + @@ + _ _ @ + _| || |_$@ +|_ __ _|@ + _| || |_ @ +|_ __ _|@ + |_||_| $@ + @@ + __,--,_.@ + / |@ + | (----`@ + \ \ $@ +.----) | $@ +|_ __/ $@ + '--' $@@ + _ ___$ @ + / \ / /$ @ +( o ) / / $ @ + \_/ / / _$ @ + / / / \ @ + / / ( o )@ + /__/ \_/ @@ + @ + ___ @ + ( _ ) $@ + / _ \/\@ +| (_> <@ + \___/\/@ + $@@ + __ @ +(_ )@ + |/ @ + $ @ + $ @ + $ @ + @@ + ___@ + / /@ +| |$@ +| |$@ +| |$@ +| |$@ + \__\@@ +___ @ +\ \ @ + | |@ + | |@ + | |@ + | |@ +/__/ @@ + _ @ + /\| |/\ @ + \ ` ' /$@ +|_ _|@ + / , . \$@ + \/|_|\/ @ + @@ + @ + _ @ + _| |_$@ +|_ _|@ + |_| $@ + $ @ + @@ + @ + @ + $ @ + $ @ + __ @ +(_ )@ + |/ @@ + @ + @ + ______ @ +|______|@ + $ @ + $ @ + @@ + @ + @ + @ + $ @ + __ @ +(__)@ + @@ + ___@ + / /@ + / / @ + / /$ @ + / /$ @ +/__/$ @ + @@ + ___ $@ + / _ \ $@ +| | | |$@ +| | | |$@ +| |_| |$@ + \___/ $@ + $@@ + __ $@ +/_ |$@ + | |$@ + | |$@ + | |$@ + |_|$@ + $@@ + ___ $@ +|__ \ $@ + $) |$@ + / / $@ + / /_ $@ +|____|$@ + $@@ + ____ $@ +|___ \ $@ + __) |$@ + |__ < $@ + ___) |$@ +|____/ $@ + $@@ + _ _ $@ +| || | $@ +| || |_ $@ +|__ _|$@ + | | $@ + |_| $@ + $@@ + _____ $@ +| ____|$@ +| |__ $@ +|___ \ $@ + ___) |$@ +|____/ $@ + $@@ + __ $@ + / / $@ + / /_ $@ +| '_ \ $@ +| (_) |$@ + \___/ $@ + $@@ + ______ $@ +|____ |$@ + $/ / $@ + / / $@ + / / $@ + /_/ $@ + $@@ + ___ $@ + / _ \ $@ +| (_) |$@ + > _ < $@ +| (_) |$@ + \___/ $@ + $@@ + ___ $@ + / _ \ $@ +| (_) |$@ + \__, |$@ + / / $@ + /_/ $@ + $@@ + @ + _ @ +(_)@ + $ @ + _ @ +(_)@ + @@ + @ + _ @ +(_)@ + $ @ + _ @ +( )@ +|/ @@ + ___@ + / /@ + / /$@ +< <$ @ + \ \$@ + \__\@ + @@ + @ + ______ @ +|______|@ + ______ @ +|______|@ + @ + @@ +___ @ +\ \$ @ + \ \ @ + > >@ + / / @ +/__/$ @ + @@ + ______ $@ +| \ $@ +`----) |$@ + / / $@ + |__| $@ + __ $@ + (__) $@@ + ____ @ + / __ \ @ + / / _` |@ +| | (_| |@ + \ \__,_|@ + \____/ @ + @@ + ___ $ @ + / \ $ @ + / ^ \$ @ + / /_\ \$ @ + / _____ \$ @ +/__/ \__\$@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| _ < $@ +| |_) |$@ +|______/ $@ + $@@ + ______$@ + / |@ +| ,----'@ +| | $@ +| `----.@ + \______|@ + $@@ + _______ $@ +| \$@ +| .--. |@ +| | | |@ +| '--' |@ +|_______/$@ + $@@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| |____ @ +|_______|@ + @@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| | $ @ +|__| @ + @@ + _______ @ + / _____|@ +| | __ $@ +| | |_ |$@ +| |__| |$@ + \______|$@ + $@@ + __ __ $@ +| | | |$@ +| |__| |$@ +| __ |$@ +| | | |$@ +|__| |__|$@ + $@@ + __ $@ +| |$@ +| |$@ +| |$@ +| |$@ +|__|$@ + $@@ + __ $@ + | |$@ + | |$@ +.--. | |$@ +| `--' |$@ + \______/ $@ + $@@ + __ ___$@ +| |/ /$@ +| ' / $@ +| < $@ +| . \ $@ +|__|\__\$@ + $@@ + __ $@ +| | $@ +| | $@ +| | $@ +| `----.@ +|_______|@ + $@@ +.___ ___.$@ +| \/ |$@ +| \ / |$@ +| |\/| |$@ +| | | |$@ +|__| |__|$@ + $@@ +.__ __.$@ +| \ | |$@ +| \| |$@ +| . ` |$@ +| |\ |$@ +|__| \__|$@ + $@@ + ______ $@ + / __ \ $@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| ___/ $@ +| | $ @ +| _| $ @ + $ @@ + ______ $ @ + / __ \ $ @ +| | | | $ @ +| | | | $ @ +| `--' '--. @ + \_____\_____\@ + $ @@ +.______ $ @ +| _ \ $ @ +| |_) | $ @ +| / $ @ +| |\ \----.@ +| _| `._____|@ + $@@ + _______.@ + / |@ + | (----`@ + \ \ $@ +.----) | $@ +|_______/ $@ + $@@ +.___________.@ +| |@ +`---| |----`@ + | | $ @ + | | $ @ + |__| $ @ + $ @@ + __ __ $@ +| | | |$@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \ /$ @ + \ /$ @ + \__/$ @ + $ @@ +____ __ ____$@ +\ \ / \ / /$@ + \ \/ \/ /$ @ + \ /$ @ + \ /\ /$ @ + \__/ \__/$ @ + $ @@ +___ ___$@ +\ \ / /$@ + \ V / $@ + > < $@ + / . \ $@ +/__/ \__\$@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \_ _/$ @ + | |$ @ + |__|$ @ + $ @@ + ________ $@ +| / $@ +`---/ / $@ + / / $@ + / /----.@ + /________|@ + $@@ + ____ @ +| |@ +| |-`@ +| | $@ +| | $@ +| |-.@ +|____|@@ +___ @ +\ \ $ @ + \ \$ @ + \ \$ @ + \ \$@ + \__\@ + @@ + ____ @ +| |@ +`-| |@ + | |@ + | |@ +.-| |@ +|____|@@ + ___ @ + / \ @ +/--^--\@ + $@ + $@ + $@ + $@@ + @ + @ + @ + $ @ + $ @ + ______ @ +|______|@@ + __ @ +( _)@ + \| @ + $ @ + $ @ + $ @ + @@ + ___ $ @ + / \ $ @ + / ^ \$ @ + / /_\ \$ @ + / _____ \$ @ +/__/ \__\$@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| _ < $@ +| |_) |$@ +|______/ $@ + $@@ + ______$@ + / |@ +| ,----'@ +| | $@ +| `----.@ + \______|@ + $@@ + _______ $@ +| \$@ +| .--. |@ +| | | |@ +| '--' |@ +|_______/$@ + $@@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| |____ @ +|_______|@ + @@ + _______ @ +| ____|@ +| |__ $@ +| __| $@ +| | $ @ +|__| @ + @@ + _______ @ + / _____|@ +| | __ $@ +| | |_ |$@ +| |__| |$@ + \______|$@ + $@@ + __ __ $@ +| | | |$@ +| |__| |$@ +| __ |$@ +| | | |$@ +|__| |__|$@ + $@@ + __ $@ +| |$@ +| |$@ +| |$@ +| |$@ +|__|$@ + $@@ + __ $@ + | |$@ + | |$@ +.--. | |$@ +| `--' |$@ + \______/ $@ + $@@ + __ ___$@ +| |/ /$@ +| ' / $@ +| < $@ +| . \ $@ +|__|\__\$@ + $@@ + __ $@ +| | $@ +| | $@ +| | $@ +| `----.@ +|_______|@ + $@@ +.___ ___.$@ +| \/ |$@ +| \ / |$@ +| |\/| |$@ +| | | |$@ +|__| |__|$@ + $@@ +.__ __.$@ +| \ | |$@ +| \| |$@ +| . ` |$@ +| |\ |$@ +|__| \__|$@ + $@@ + ______ $@ + / __ \ $@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +.______ $@ +| _ \ $@ +| |_) |$@ +| ___/ $@ +| | $ @ +| _| $ @ + $ @@ + ______ $ @ + / __ \ $ @ +| | | | $ @ +| | | | $ @ +| `--' '--. @ + \_____\_____\@ + $ @@ +.______ $ @ +| _ \ $ @ +| |_) | $ @ +| / $ @ +| |\ \----.@ +| _| `._____|@ + $@@ + _______.@ + / |@ + | (----`@ + \ \ $@ +.----) | $@ +|_______/ $@ + $@@ +.___________.@ +| |@ +`---| |----`@ + | | $ @ + | | $ @ + |__| $ @ + $ @@ + __ __ $@ +| | | |$@ +| | | |$@ +| | | |$@ +| `--' |$@ + \______/ $@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \ /$ @ + \ /$ @ + \__/$ @ + $ @@ +____ __ ____$@ +\ \ / \ / /$@ + \ \/ \/ /$ @ + \ /$ @ + \ /\ /$ @ + \__/ \__/$ @ + $ @@ +___ ___$@ +\ \ / /$@ + \ V / $@ + > < $@ + / . \ $@ +/__/ \__\$@ + $@@ +____ ____$@ +\ \ / /$@ + \ \/ /$ @ + \_ _/$ @ + | |$ @ + |__|$ @ + $ @@ + ________ $@ +| / $@ +`---/ / $@ + / / $@ + / /----.@ + /________|@ + $@@ + ___@ + / /@ + | |$@ +/ /$ @ +\ \$ @ + | |$@ + \__\@@ + __ $@ +| |$@ +| |$@ +| |$@ +| |$@ +| |$@ +|__|$@@ +___ @ +\ \$ @ + | | @ + \ \@ + / /@ + | | @ +/__/$ @@ + __ _ @ + / \/ |@ +|_/\__/ @ + $ @ + $ @ + $ @ + @@ + _ _ @ + (_)_(_) @ + / \ @ + / _ \ @ + / ___ \ @ +/_/ \_\@ + @@ + _ _ @ +(_)_(_)@ + / _ \ @ +| | | |@ +| |_| |@ + \___/ @ + @@ + _ _ @ +(_) (_)@ +| | | |@ +| | | |@ +| |_| |@ + \___/ @ + @@ + _ _ @ +(_) (_)@ + __ _ @ + / _` |@ +| (_| |@ + \__,_|@ + @@ + _ _ @ +(_) (_)@ + ___ @ + / _ \ @ +| (_) |@ + \___/ @ + @@ + _ _ @ +(_) (_)@ + _ _ @ +| | | |@ +| |_| |@ + \__,_|@ + @@ + ___ @ + / _ \ @ +| | ) |@ +| |< < @ +| | ) |@ +| ||_/ @ +|_| @@ diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 00000000..aa5790ca --- /dev/null +++ b/src/config.rs @@ -0,0 +1,179 @@ +//! Carga las opciones de configuración. +//! +//! Estos ajustes se obtienen de archivos [TOML](https://toml.io) como pares `clave = valor` que se +//! mapean a estructuras **fuertemente tipadas** y valores predefinidos. +//! +//! Siguiendo la metodología [Twelve-Factor App](https://12factor.net/config), `PageTop` separa el +//! **código** de la **configuración**, lo que permite tener configuraciones diferentes para cada +//! despliegue, como *dev*, *staging* o *production*, sin modificar el código fuente. +//! +//! +//! # Orden de carga +//! +//! Si tu aplicación necesita archivos de configuración, crea un directorio `config` en la raíz del +//! proyecto, al mismo nivel que el archivo *Cargo.toml* o que el binario de la aplicación. +//! +//! `PageTop` carga en este orden, y siempre de forma opcional, los siguientes archivos TOML: +//! +//! 1. **config/common.toml**, para ajustes comunes a todos los entornos. Este enfoque simplifica el +//! mantenimiento al centralizar los valores de configuración comunes. +//! +//! 2. **config/{rm}.toml**, donde `{rm}` es el valor de la variable de entorno `PAGETOP_RUN_MODE`: +//! +//! * Si `PAGETOP_RUN_MODE` no está definida, se asume el valor `default`, y `PageTop` intentará +//! cargar *config/default.toml* si el archivo existe. +//! +//! * Útil para definir configuraciones específicas por entorno, garantizando que cada uno (p.e. +//! *dev*, *staging* o *production*) disponga de sus propias opciones, como claves de API, +//! URLs o ajustes de rendimiento, sin afectar a los demás. +//! +//! 3. **config/local.{rm}.toml**, útil para configuraciones locales específicas de la máquina o de +//! la ejecución: +//! +//! * Permite añadir o sobrescribir ajustes propios del entorno. Por ejemplo, `local.dev.toml` +//! para desarrollo o `local.production.toml` para retoques en producción. +//! +//! * Facilita que cada desarrollador adapte la configuración a su equipo en un entorno dado. Por +//! lo general no se comparte ni se sube al sistema de control de versiones. +//! +//! 4. **config/local.toml**, para ajustes locales válidos en cualquier entorno, ideal para cambios +//! rápidos o valores temporales que no dependan de un entorno concreto. +//! +//! Los archivos se combinan en el orden anterior, cada archivo sobrescribe a los anteriores en caso +//! de conflicto. +//! +//! +//! # Cómo añadir opciones de configuración a tu código +//! +//! Añade [*serde*](https://docs.rs/serde) en tu archivo *Cargo.toml* con la *feature* `derive`: +//! +//! ```toml +//! [dependencies] +//! serde = { version = "1.0", features = ["derive"] } +//! ``` +//! +//! Y usa la macro [`include_config!`](crate::include_config) para inicializar tus ajustes en una +//! estructura con tipos seguros. Por ejemplo: +//! +//! ```rust#ignore +//! use pagetop::prelude::*; +//! use serde::Deserialize; +//! +//! include_config!(SETTINGS: Settings => [ +//! // [myapp] +//! "myapp.name" => "Value Name", +//! "myapp.width" => 900, +//! "myapp.height" => 320, +//! ]); +//! +//! #[derive(Debug, Deserialize)] +//! pub struct Settings { +//! pub myapp: MyApp, +//! } +//! +//! #[derive(Debug, Deserialize)] +//! pub struct MyApp { +//! pub name: String, +//! pub description: Option<String>, +//! pub width: u16, +//! pub height: u16, +//! } +//! ``` +//! +//! De esta forma estás añadiendo una nueva sección `[myapp]` a la configuración, igual que existen +//! `[app]` o `[server]` en las opciones globales de [`Settings`](crate::global::Settings). +//! +//! Se recomienda proporcionar siempre valores por defecto o usar `Option<T>` para los ajustes +//! opcionales. +//! +//! Si la configuración no se inicializa correctamente, la aplicación lanzará *panic* y detendrá la +//! ejecución. +//! +//! Las estructuras de configuración son de **sólo lectura** durante la ejecución. +//! +//! +//! # Usando tus opciones de configuración +//! +//! ```rust#ignore +//! use pagetop::prelude::*; +//! use crate::config; +//! +//! fn global_settings() { +//! println!("Nombre de la app: {}", &global::SETTINGS.app.name); +//! println!("Descripción: {}", &global::SETTINGS.app.description); +//! println!("Run mode: {}", &global::SETTINGS.app.run_mode); +//! } +//! +//! fn extension_settings() { +//! println!("{} - {:?}", &config::SETTINGS.myapp.name, &config::SETTINGS.myapp.description); +//! println!("{}", &config::SETTINGS.myapp.width); +//! } +//! ``` + +use config::builder::DefaultState; +use config::{Config, ConfigBuilder, File}; + +use std::env; +use std::path::{Path, PathBuf}; +use std::sync::LazyLock; + +// Nombre del directorio de configuración por defecto. +const DEFAULT_CONFIG_DIR: &str = "config"; + +// Modo de ejecución por defecto. +const DEFAULT_RUN_MODE: &str = "default"; + +/// Valores originales cargados desde los archivos de configuración como pares `clave = valor`. +pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new(|| { + // Determina el directorio de configuración: + // - Usa CONFIG_DIR si está definido en el entorno (p.e.: CONFIG_DIR=/etc/myapp ./myapp). + // - Si no, intenta DEFAULT_CONFIG_DIR dentro del proyecto (en CARGO_MANIFEST_DIR). + // - Si nada de esto aplica, entonces usa DEFAULT_CONFIG_DIR relativo al ejecutable. + let config_dir: PathBuf = if let Ok(env_dir) = env::var("CONFIG_DIR") { + env_dir.into() + } else if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") { + let manifest_config = Path::new(&manifest_dir).join(DEFAULT_CONFIG_DIR); + if manifest_config.exists() { + manifest_config + } else { + DEFAULT_CONFIG_DIR.into() + } + } else { + DEFAULT_CONFIG_DIR.into() + }; + + // Determina el modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto usa + // DEFAULT_RUN_MODE si no está definida (p.e.: PAGETOP_RUN_MODE=production ./myapp). + let rm = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| DEFAULT_RUN_MODE.into()); + + Config::builder() + // 1. Configuración común para todos los entornos (common.toml). + .add_source(File::from(config_dir.join("common.toml")).required(false)) + // 2. Configuración específica del entorno (p.e.: default.toml, production.toml). + .add_source(File::from(config_dir.join(format!("{rm}.toml"))).required(false)) + // 3. Configuración local reservada para cada entorno (p.e.: local.default.toml). + .add_source(File::from(config_dir.join(format!("local.{rm}.toml"))).required(false)) + // 4. Configuración local común (local.toml). + .add_source(File::from(config_dir.join("local.toml")).required(false)) + // Guarda el modo de ejecución explícitamente. + .set_override("app.run_mode", rm) + .expect("Failed to set application run mode") +}); + +#[macro_export] +macro_rules! include_config { + ( $SETTINGS:ident : $Settings:ty => [ $( $key:expr => $value:expr ),* $(,)? ] ) => { + /// Valores asignados o predefinidos para la configuración de [`$Settings`]. + pub static $SETTINGS: std::sync::LazyLock<$Settings> = std::sync::LazyLock::new(|| { + let mut settings = $crate::config::CONFIG_VALUES.clone(); + $( + settings = settings.set_default($key, $value).unwrap(); + )* + settings + .build() + .expect(concat!("Failed to build config for ", stringify!($Settings))) + .try_deserialize::<$Settings>() + .expect(concat!("Error parsing settings for ", stringify!($Settings))) + }); + }; +} diff --git a/src/global.rs b/src/global.rs new file mode 100644 index 00000000..5e3d52f2 --- /dev/null +++ b/src/global.rs @@ -0,0 +1,57 @@ +//! Opciones de configuración globales. + +use crate::include_config; + +use serde::Deserialize; + +include_config!(SETTINGS: Settings => [ + // [app] + "app.name" => "Sample", + "app.description" => "Developed with the amazing PageTop framework.", + "app.startup_banner" => "Slant", + + // [server] + "server.bind_address" => "localhost", + "server.bind_port" => 8080, +]); + +#[derive(Debug, Deserialize)] +/// Ajustes de configuración para las secciones globales [`[app]`](App) y [`[server]`](Server). +/// Consulta [`SETTINGS`] para los valores por defecto. +pub struct Settings { + pub app: App, + pub server: Server, +} + +#[derive(Debug, Deserialize)] +/// Sección `[app]` de la configuración. +/// +/// Forma parte de [`Settings`]. +pub struct App { + /// Nombre de la aplicación. + /// Valor por defecto: *"Sample"*. + pub name: String, + /// Breve descripción de la aplicación. + /// Valor por defecto: *"Developed with the amazing PageTop framework."*. + pub description: String, + /// ASCII banner printed at startup: *"Off"*, *"Slant"*, *"Small"*, *"Speed"*, or *"Starwars"*. + /// Default: *"Slant"*. + pub startup_banner: String, + /// Modo de ejecución. + /// Valor por defecto: el definido por la variable de entorno + /// `PAGETOP_RUN_MODE`, o *"default"* si no está establecida. + pub run_mode: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[server]` de la configuración. +/// +/// Forma parte de [`Settings`]. +pub struct Server { + /// Dirección de enlace para el servidor web. + /// Valor por defecto: *"localhost"*. + pub bind_address: String, + /// Puerto de escucha del servidor web. + /// Valor por defecto: *8088*. + pub bind_port: u16, +} diff --git a/src/lib.rs b/src/lib.rs index c18003f8..82f9ebaa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,10 @@ pub use pagetop_macros::{main, test}; // API ********************************************************************************************* +// Carga las opciones de configuración. +pub mod config; +// Opciones de configuración globales. +pub mod global; // Gestión del servidor y servicios web. pub mod service; // Prepara y ejecuta la aplicación. diff --git a/src/prelude.rs b/src/prelude.rs index d35e9b11..bee222e8 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -4,8 +4,15 @@ pub use crate::{main, test}; +// MACROS. + +// crate::config +pub use crate::include_config; + // API. +pub use crate::global; + pub use crate::service; pub use crate::app::Application; diff --git a/tests/config.rs b/tests/config.rs new file mode 100644 index 00000000..ff7135c0 --- /dev/null +++ b/tests/config.rs @@ -0,0 +1,41 @@ +use pagetop::prelude::*; + +use serde::Deserialize; + +use std::env; + +include_config!(SETTINGS: Settings => [ + "test.string_value" => "Test String", + "test.int_value" => -321, + "test.float_value" => 2.3456, +]); + +#[derive(Debug, Deserialize)] +pub struct Settings { + pub test: Test, +} + +#[derive(Debug, Deserialize)] +pub struct Test { + pub string_value: String, + pub int_value: i32, + pub float_value: f32, +} + +#[pagetop::test] +async fn check_global_config() { + env::set_var("PAGETOP_RUN_MODE", "test"); + + assert_eq!(global::SETTINGS.app.run_mode, "test"); + assert_eq!(global::SETTINGS.app.name, "Testing"); + assert_eq!(global::SETTINGS.server.bind_port, 9000); +} + +#[pagetop::test] +async fn check_local_config() { + env::set_var("PAGETOP_RUN_MODE", "test"); + + assert_eq!(SETTINGS.test.string_value, "Modified value"); + assert_eq!(SETTINGS.test.int_value, -321); + assert_eq!(SETTINGS.test.float_value, 8.7654); +} From 60d550a4f97591a315ed86c835a6526c9ed4999d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 6 Jul 2025 20:08:17 +0200 Subject: [PATCH 664/853] =?UTF-8?q?=F0=9F=93=9D=20(config):=20Ampl=C3=ADa?= =?UTF-8?q?=20y=20corrige=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- helpers/pagetop-macros/src/lib.rs | 4 +- src/config.rs | 119 ++++++++++++++++++++++++++---- src/lib.rs | 2 +- 4 files changed, 108 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 7293f88d..159aabe0 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HT La aplicación más sencilla de `PageTop` se ve así: -```rust#ignore +```rust use pagetop::prelude::*; #[pagetop::main] diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 1ed29c5b..31d8dcdd 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -21,7 +21,7 @@ use quote::quote; /// /// # Ejemplos /// -/// ```rust#ignore +/// ```rust,ignore /// #[pagetop::main] /// async fn main() { /// async { println!("Hello world!"); }.await @@ -42,7 +42,7 @@ pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { /// /// # Ejemplos /// -/// ```rust#ignore +/// ```rust,ignore /// #[pagetop::test] /// async fn test() { /// assert_eq!(async { "Hello world" }.await, "Hello world"); diff --git a/src/config.rs b/src/config.rs index aa5790ca..eae182fc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -55,7 +55,7 @@ //! Y usa la macro [`include_config!`](crate::include_config) para inicializar tus ajustes en una //! estructura con tipos seguros. Por ejemplo: //! -//! ```rust#ignore +//! ```rust,no_run //! use pagetop::prelude::*; //! use serde::Deserialize; //! @@ -94,7 +94,7 @@ //! //! # Usando tus opciones de configuración //! -//! ```rust#ignore +//! ```rust,ignore //! use pagetop::prelude::*; //! use crate::config; //! @@ -160,20 +160,109 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( .expect("Failed to set application run mode") }); +/// Incluye los ajustes necesarios de la configuración anticipando valores por defecto. +/// +/// ### Sintaxis +/// +/// Hay que añadir en nuestra librería el siguiente código: +/// +/// ```rust,ignore +/// include_config!(SETTINGS: Settings => [ +/// "ruta.clave" => valor, +/// // … +/// ]); +/// ``` +/// +/// donde: +/// +/// * **`SETTINGS_NAME`** es el nombre de la variable global que se usará para referenciar los +/// ajustes. Se recomienda usar `SETTINGS`, aunque no es obligatorio. +/// * **`Settings_Type`** es la referencia a la estructura que define los tipos para deserializar la +/// configuración. Debe implementar `Deserialize` (derivable con `#[derive(Deserialize)]`). +/// * **Lista de pares** con las claves TOML que requieran valores por defecto. Siguen la notación +/// `"seccion.subclave"` para coincidir con el árbol TOML. +/// +/// ### Ejemplo básico +/// +/// ```rust,no_run +/// use pagetop::prelude::*; +/// use serde::Deserialize; +/// +/// include_config!(SETTINGS: BlogSettings => [ +/// // [blog] +/// "blog.title" => "Mi Blog", +/// "blog.port" => 8080, +/// ]); +/// +/// #[derive(Debug, Deserialize)] +/// pub struct BlogSettings { +/// pub blog: Blog, +/// } +/// +/// #[derive(Debug, Deserialize)] +/// pub struct Blog { +/// pub title: String, +/// pub description: Option<String>, +/// pub port: u16, +/// } +/// +/// fn print_title() { +/// // Lectura en tiempo de ejecución. +/// println!("Título: {}", SETTINGS.blog.title); +/// } +/// ``` +/// +/// ### Buenas prácticas +/// +/// * **Valores por defecto**. Declara un valor por defecto para cada clave obligatoria. Las claves +/// opcionales pueden ser `Option<T>`. +/// +/// * **Secciones únicas**. Agrupa tus claves dentro de una sección exclusiva (p.e. `[blog]`) para +/// evitar colisiones con otras librerías. +/// +/// * **Solo lectura**. La variable generada es inmutable durante toda la vida del programa. Para +/// configurar distintos entornos (*dev*, *staging*, *prod*) usa los archivos TOML descritos en la +/// documentación de [`config`](crate::config). +/// +/// * **Errores explícitos**. Si la deserialización falla, la macro lanzará un `panic!` con un +/// mensaje que indica la estructura problemática, facilitando la depuración. +/// +/// ### Requisitos +/// +/// * Dependencia `serde` con la *feature* `derive`. +/// * Las claves deben coincidir con los campos (*snake case*) de tu estructura `Settings_Type`. +/// +/// ```toml +/// [dependencies] +/// serde = { version = "1.0", features = ["derive"] } +/// ``` + #[macro_export] macro_rules! include_config { - ( $SETTINGS:ident : $Settings:ty => [ $( $key:expr => $value:expr ),* $(,)? ] ) => { - /// Valores asignados o predefinidos para la configuración de [`$Settings`]. - pub static $SETTINGS: std::sync::LazyLock<$Settings> = std::sync::LazyLock::new(|| { - let mut settings = $crate::config::CONFIG_VALUES.clone(); - $( - settings = settings.set_default($key, $value).unwrap(); - )* - settings - .build() - .expect(concat!("Failed to build config for ", stringify!($Settings))) - .try_deserialize::<$Settings>() - .expect(concat!("Error parsing settings for ", stringify!($Settings))) - }); + ( $SETTINGS_NAME:ident : $Settings_Type:ty => [ $( $k:literal => $v:expr ),* $(,)? ] ) => { + #[doc = concat!( + "Referencia a los ajustes de configuración deserializados de [`", + stringify!($Settings_Type), + "`]." + )] + #[doc = ""] + #[doc = "Valores por defecto:"] + #[doc = "```text"] + $( + #[doc = concat!($k, " = ", stringify!($v))] + )* + #[doc = "```"] + pub static $SETTINGS_NAME: std::sync::LazyLock<$Settings_Type> = + std::sync::LazyLock::new(|| { + let mut settings = $crate::config::CONFIG_VALUES.clone(); + $( + settings = settings.set_default($k, $v).unwrap(); + )* + settings + .build() + .expect(concat!("Failed to build config for ", stringify!($Settings_Type))) + .try_deserialize::<$Settings_Type>() + .expect(concat!("Error parsing settings for ", stringify!($Settings_Type))) + }); }; } diff --git a/src/lib.rs b/src/lib.rs index 82f9ebaa..81e7bc6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,7 +19,7 @@ //! //! La aplicación más sencilla de `PageTop` se ve así: //! -//! ```rust#ignore +//! ```rust,no_run //! use pagetop::prelude::*; //! //! #[pagetop::main] From 84e48a3357705070fab06504d73bc919c77c91cc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 6 Jul 2025 23:03:21 +0200 Subject: [PATCH 665/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20gesti=C3=B3n?= =?UTF-8?q?=20de=20trazas=20y=20registro=20de=20eventos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reexporta macros esenciales de `tracing` para el registro de eventos. - Inicializa el gestor de trazas en el servidor web. --- .gitignore | 3 + Cargo.lock | 324 ++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 7 +- src/app.rs | 23 ++-- src/global.rs | 51 +++++--- src/lib.rs | 2 + src/prelude.rs | 2 + src/trace.rs | 85 +++++++++++++ 8 files changed, 467 insertions(+), 30 deletions(-) create mode 100644 src/trace.rs diff --git a/.gitignore b/.gitignore index 56ee30e4..65db440e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Ignora directorios de compilación **/target +# Archivos de log +**/log/*.log* + # Archivos de configuración locales **/local.*.toml **/local.toml diff --git a/Cargo.lock b/Cargo.lock index 045a72fd..43eb2107 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -287,6 +287,12 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "bytes" version = "1.10.1" @@ -369,6 +375,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto-common" version = "0.1.6" @@ -737,12 +758,28 @@ dependencies = [ "libc", ] +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "language-tags" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.174" @@ -794,6 +831,15 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "memchr" version = "2.7.5" @@ -827,6 +873,22 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "mutually_exclusive_features" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94e1e6445d314f972ff7395df2de295fe51b71821694f0b0e1e79c4f12c8577" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -848,9 +910,15 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "pagetop" -version = "0.0.2" +version = "0.0.3" dependencies = [ "actix-web", "colored", @@ -860,6 +928,10 @@ dependencies = [ "serde", "substring", "terminal_size", + "tracing", + "tracing-actix-web", + "tracing-appender", + "tracing-subscriber", ] [[package]] @@ -904,6 +976,26 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1016,8 +1108,17 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1028,7 +1129,7 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] [[package]] @@ -1037,6 +1138,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.5" @@ -1062,6 +1169,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + [[package]] name = "ryu" version = "1.0.20" @@ -1138,6 +1251,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1222,6 +1344,35 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "time" version = "0.3.41" @@ -1339,6 +1490,31 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-actix-web" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2340b7722695166c7fc9b3e3cd1166e7c74fedb9075b8f0c74d3822d2e41caf5" +dependencies = [ + "actix-web", + "mutually_exclusive_features", + "pin-project", + "tracing", + "uuid", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.30" @@ -1357,6 +1533,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", ] [[package]] @@ -1394,6 +1613,23 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "getrandom", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "version_check" version = "0.9.5" @@ -1415,6 +1651,86 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index a844f527..f5948d56 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.2" +version = "0.0.3" edition = "2021" description = """\ @@ -22,6 +22,11 @@ serde.workspace = true substring = "1.4.5" terminal_size = "0.4.2" +tracing = "0.1.41" +tracing-appender = "0.2.3" +tracing-subscriber = { version = "0.3.19", features = ["json", "env-filter"] } +tracing-actix-web = "0.7.18" + actix-web = "4.11.0" pagetop-macros.workspace = true diff --git a/src/app.rs b/src/app.rs index bac74821..d21c08a0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,11 +2,12 @@ mod figfont; -use crate::{global, service}; +use crate::{global, service, trace}; use substring::Substring; use std::io::Error; +use std::sync::LazyLock; pub struct Application; @@ -15,6 +16,10 @@ impl Application { pub fn new() -> Self { // Al arrancar muestra una cabecera para la aplicación. Self::show_banner(); + + // Inicia gestión de trazas y registro de eventos (logging). + LazyLock::force(&trace::TRACING); + Self } @@ -62,13 +67,15 @@ impl Application { /// Ejecuta el servidor web de la aplicación. pub fn run(self) -> Result<service::Server, Error> { // Prepara el servidor web. - Ok(service::HttpServer::new(move || Self::service_app()) - .bind(format!( - "{}:{}", - &global::SETTINGS.server.bind_address, - &global::SETTINGS.server.bind_port - ))? - .run()) + Ok(service::HttpServer::new(move || { + Self::service_app().wrap(tracing_actix_web::TracingLogger::default()) + }) + .bind(format!( + "{}:{}", + &global::SETTINGS.server.bind_address, + &global::SETTINGS.server.bind_port + ))? + .run()) } /// Prepara el servidor web de la aplicación para pruebas. diff --git a/src/global.rs b/src/global.rs index 5e3d52f2..8432032a 100644 --- a/src/global.rs +++ b/src/global.rs @@ -10,48 +10,65 @@ include_config!(SETTINGS: Settings => [ "app.description" => "Developed with the amazing PageTop framework.", "app.startup_banner" => "Slant", + // [log] + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", + // [server] "server.bind_address" => "localhost", "server.bind_port" => 8080, ]); #[derive(Debug, Deserialize)] -/// Ajustes de configuración para las secciones globales [`[app]`](App) y [`[server]`](Server). -/// Consulta [`SETTINGS`] para los valores por defecto. +/// Ajustes para las secciones globales [`[app]`](App), [`[log]`](Log) y [`[server]`](Server) de +/// [`SETTINGS`]. pub struct Settings { pub app: App, + pub log: Log, pub server: Server, } #[derive(Debug, Deserialize)] -/// Sección `[app]` de la configuración. -/// -/// Forma parte de [`Settings`]. +/// Sección `[app]` de la configuración. Forma parte de [`Settings`]. pub struct App { /// Nombre de la aplicación. - /// Valor por defecto: *"Sample"*. pub name: String, /// Breve descripción de la aplicación. - /// Valor por defecto: *"Developed with the amazing PageTop framework."*. pub description: String, - /// ASCII banner printed at startup: *"Off"*, *"Slant"*, *"Small"*, *"Speed"*, or *"Starwars"*. - /// Default: *"Slant"*. + /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o + /// *"Starwars"*. pub startup_banner: String, - /// Modo de ejecución. - /// Valor por defecto: el definido por la variable de entorno - /// `PAGETOP_RUN_MODE`, o *"default"* si no está establecida. + /// Modo de ejecución, dado por la variable de entorno `PAGETOP_RUN_MODE`, o *"default"* si no + /// está definido. pub run_mode: String, } #[derive(Debug, Deserialize)] -/// Sección `[server]` de la configuración. -/// -/// Forma parte de [`Settings`]. +/// Sección `[log]` de la configuración. Forma parte de [`Settings`]. +pub struct Log { + /// Opciones, o combinación de opciones separadas por comas, para filtrar las trazas: *"Error"*, + /// *"Warn"*, *"Info"*, *"Debug"* o *"Trace"*. + /// Ejemplo: "Error,actix_server::builder=Info,tracing_actix_web=Debug". + pub tracing: String, + /// Muestra los mensajes de traza en el terminal (*"Stdout"*) o las registra en archivos con + /// rotación: *"Daily"*, *"Hourly"*, *"Minutely"* o *"Endless"*. + pub rolling: String, + /// Directorio para los archivos de traza (si `rolling` ≠ *"Stdout"*). + pub path: String, + /// Prefijo para los archivos de traza (si `rolling` ≠ *"Stdout"*). + pub prefix: String, + /// Formato de salida de las trazas. Opciones: *"Full"*, *"Compact"*, *"Pretty"* o *"Json"*. + pub format: String, +} + +#[derive(Debug, Deserialize)] +/// Sección `[server]` de la configuración. Forma parte de [`Settings`]. pub struct Server { /// Dirección de enlace para el servidor web. - /// Valor por defecto: *"localhost"*. pub bind_address: String, /// Puerto de escucha del servidor web. - /// Valor por defecto: *8088*. pub bind_port: u16, } diff --git a/src/lib.rs b/src/lib.rs index 81e7bc6b..308c1633 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,6 +40,8 @@ pub use pagetop_macros::{main, test}; pub mod config; // Opciones de configuración globales. pub mod global; +// Gestión de trazas y registro de eventos de la aplicación. +pub mod trace; // Gestión del servidor y servicios web. pub mod service; // Prepara y ejecuta la aplicación. diff --git a/src/prelude.rs b/src/prelude.rs index bee222e8..5d5851fc 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -13,6 +13,8 @@ pub use crate::include_config; pub use crate::global; +pub use crate::trace; + pub use crate::service; pub use crate::app::Application; diff --git a/src/trace.rs b/src/trace.rs new file mode 100644 index 00000000..93a8ff2d --- /dev/null +++ b/src/trace.rs @@ -0,0 +1,85 @@ +//! Gestión de trazas y registro de eventos de la aplicación. +//! +//! `PageTop` recopila información de diagnóstico de la aplicación de forma estructurada y basada en +//! eventos. +//! +//! En los sistemas asíncronos, interpretar los mensajes de log tradicionales suele volverse +//! complicado. Las tareas individuales se multiplexan en el mismo hilo y los eventos y registros +//! asociados se entremezclan, lo que dificulta seguir la secuencia lógica. +//! +//! `PageTop` usa [`tracing`](https://docs.rs/tracing) para registrar eventos estructurados y con +//! información adicional sobre la *temporalidad* y la *causalidad*. A diferencia de un mensaje de +//! log, un *span* (intervalo) tiene un momento de inicio y de fin, puede entrar y salir del flujo +//! de ejecución y puede existir dentro de un árbol anidado de *spans* similares. Además, estos +//! *spans* son estructurados, con la capacidad de registrar tipos de datos y mensajes de texto. + +use crate::global; + +pub use tracing::{debug, error, info, trace, warn}; +pub use tracing::{debug_span, error_span, info_span, trace_span, warn_span}; + +use tracing_appender::non_blocking::WorkerGuard; +use tracing_subscriber::EnvFilter; + +use std::sync::LazyLock; + +/// Trazado y registro de eventos de la aplicación. +/// +/// Para aumentar el rendimiento, un hilo dedicado utiliza un sistema de escritura no bloqueante que +/// actúa de forma periódica en lugar de enviar cada traza o evento al instante. Si el programa +/// termina abruptamente (por ejemplo, debido a un `panic!` o a una llamada a `std::process::exit`), +/// es posible que algunas trazas o eventos no se envíen. +/// +/// Dado que las trazas o eventos registrados poco antes de un fallo suelen ser cruciales para +/// diagnosticar la causa, `Lazy<WorkerGuard>` garantiza que todos los registros almacenados se +/// envíen antes de finalizar la ejecución. + +#[rustfmt::skip] +pub(crate) static TRACING: LazyLock<WorkerGuard> = LazyLock::new(|| { + let env_filter = EnvFilter::try_new(&global::SETTINGS.log.tracing) + .unwrap_or_else(|_| EnvFilter::new("Info")); + + let rolling = global::SETTINGS.log.rolling.to_lowercase(); + + let (non_blocking, guard) = match rolling.as_str() { + "stdout" => tracing_appender::non_blocking(std::io::stdout()), + _ => tracing_appender::non_blocking({ + let path = &global::SETTINGS.log.path; + let prefix = &global::SETTINGS.log.prefix; + match rolling.as_str() { + "daily" => tracing_appender::rolling::daily(path, prefix), + "hourly" => tracing_appender::rolling::hourly(path, prefix), + "minutely" => tracing_appender::rolling::minutely(path, prefix), + "endless" => tracing_appender::rolling::never(path, prefix), + _ => { + println!( + "Rolling value \"{}\" not valid. Using \"daily\". Check the settings file.", + global::SETTINGS.log.rolling, + ); + tracing_appender::rolling::daily(path, prefix) + } + } + }), + }; + + let subscriber = tracing_subscriber::fmt() + .with_env_filter(env_filter) + .with_writer(non_blocking) + .with_ansi(rolling.as_str() == "stdout"); + + match global::SETTINGS.log.format.to_lowercase().as_str() { + "json" => subscriber.json().init(), + "full" => subscriber.init(), + "compact" => subscriber.compact().init(), + "pretty" => subscriber.pretty().init(), + _ => { + println!( + "Tracing format \"{}\" not valid. Using \"Full\". Check the settings file.", + global::SETTINGS.log.format, + ); + subscriber.init(); + } + } + + guard +}); From 1fb8e937d161cfb1a894d0482d1cb9ea6bf29d2d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 7 Jul 2025 18:21:00 +0200 Subject: [PATCH 666/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20macro=20para?= =?UTF-8?q?=20componer=20HTML=20en=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Incorpora el código de la versión 0.25.0 de `maud_macros` creado por Chris Wong. - Y reexporta los elementos esenciales desde la librería principal. --- Cargo.lock | 80 ++- Cargo.toml | 3 +- helpers/pagetop-macros/Cargo.toml | 4 + helpers/pagetop-macros/README.md | 7 + helpers/pagetop-macros/src/lib.rs | 9 + helpers/pagetop-macros/src/maud.rs | 39 + helpers/pagetop-macros/src/maud/ast.rs | 221 ++++++ helpers/pagetop-macros/src/maud/escape.rs | 34 + helpers/pagetop-macros/src/maud/generate.rs | 308 ++++++++ helpers/pagetop-macros/src/maud/parse.rs | 752 ++++++++++++++++++++ src/html.rs | 4 + src/html/maud.rs | 350 +++++++++ src/html/maud/escape.rs | 34 + src/lib.rs | 4 +- src/prelude.rs | 4 +- 15 files changed, 1834 insertions(+), 19 deletions(-) create mode 100644 helpers/pagetop-macros/src/maud.rs create mode 100644 helpers/pagetop-macros/src/maud/ast.rs create mode 100644 helpers/pagetop-macros/src/maud/escape.rs create mode 100644 helpers/pagetop-macros/src/maud/generate.rs create mode 100644 helpers/pagetop-macros/src/maud/parse.rs create mode 100644 src/html.rs create mode 100644 src/html/maud.rs create mode 100644 src/html/maud/escape.rs diff --git a/Cargo.lock b/Cargo.lock index 43eb2107..d53ffd7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -182,7 +182,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -426,7 +426,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "unicode-xid", ] @@ -448,7 +448,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -918,12 +918,13 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.3" +version = "0.0.4" dependencies = [ "actix-web", "colored", "config", "figlet-rs", + "itoa", "pagetop-macros", "serde", "substring", @@ -938,7 +939,11 @@ dependencies = [ name = "pagetop-macros" version = "0.0.1" dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", "quote", + "syn 2.0.104", ] [[package]] @@ -993,7 +998,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1038,6 +1043,39 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -1204,7 +1242,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1312,6 +1350,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.104" @@ -1331,7 +1379,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1361,7 +1409,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1523,7 +1571,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1673,7 +1721,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -1695,7 +1743,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1857,7 +1905,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "synstructure", ] @@ -1878,7 +1926,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] @@ -1898,7 +1946,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", "synstructure", ] @@ -1932,7 +1980,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.104", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f5948d56..b8b3f5fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.3" +version = "0.0.4" edition = "2021" description = """\ @@ -18,6 +18,7 @@ authors.workspace = true colored = "3.0.0" config = { version = "0.15.11", default-features = false, features = ["toml"] } figlet-rs = "0.1.5" +itoa = "1.0.15" serde.workspace = true substring = "1.4.5" terminal_size = "0.4.2" diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 7a4d30e1..80413821 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -18,4 +18,8 @@ authors.workspace = true proc-macro = true [dependencies] +proc-macro2 = "1.0.95" +proc-macro-crate = "3.3.0" +proc-macro-error = "1.0.4" quote = "1.0.40" +syn = { version = "2.0.104", features = ["full"] } diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index 8bdc94c2..06799668 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -8,6 +8,13 @@ </div> +## Descripción general + +Entre sus macros se incluye una adaptación de [maud-macros](https://crates.io/crates/maud_macros) +([0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud_macros)) de +[Chris Wong](https://crates.io/users/lambda-fairy) para no tener que referenciar `maud` en las +dependencias del archivo `Cargo.toml` de cada proyecto `PageTop`. + ## Sobre PageTop [PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 31d8dcdd..65badb04 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -14,9 +14,18 @@ //! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles //! y configurables, basadas en HTML, CSS y JavaScript. +mod maud; + use proc_macro::TokenStream; +use proc_macro_error::proc_macro_error; use quote::quote; +#[proc_macro] +#[proc_macro_error] +pub fn html(input: TokenStream) -> TokenStream { + maud::expand(input.into()).into() +} + /// Define una función `main` asíncrona como punto de entrada de `PageTop`. /// /// # Ejemplos diff --git a/helpers/pagetop-macros/src/maud.rs b/helpers/pagetop-macros/src/maud.rs new file mode 100644 index 00000000..a4e7873f --- /dev/null +++ b/helpers/pagetop-macros/src/maud.rs @@ -0,0 +1,39 @@ +// #![doc(html_root_url = "https://docs.rs/maud_macros/0.25.0")] +// TokenStream values are reference counted, and the mental overhead of tracking +// lifetimes outweighs the marginal gains from explicit borrowing +// #![allow(clippy::needless_pass_by_value)] + +mod ast; +mod escape; +mod generate; +mod parse; + +use proc_macro2::{Ident, Span, TokenStream, TokenTree}; +use proc_macro_crate::{crate_name, FoundCrate}; +use quote::quote; + +pub fn expand(input: TokenStream) -> TokenStream { + let output_ident = TokenTree::Ident(Ident::new("__maud_output", Span::mixed_site())); + // Heuristic: the size of the resulting markup tends to correlate with the + // code size of the template itself + let size_hint = input.to_string().len(); + let markups = parse::parse(input); + let stmts = generate::generate(markups, output_ident.clone()); + + let found_crate = crate_name("pagetop").expect("pagetop is present in `Cargo.toml`"); + let pre_escaped = match found_crate { + FoundCrate::Itself => quote!( + crate::html::PreEscaped(#output_ident) + ), + _ => quote!( + pagetop::html::PreEscaped(#output_ident) + ), + }; + + quote!({ + extern crate alloc; + let mut #output_ident = alloc::string::String::with_capacity(#size_hint); + #stmts + #pre_escaped + }) +} diff --git a/helpers/pagetop-macros/src/maud/ast.rs b/helpers/pagetop-macros/src/maud/ast.rs new file mode 100644 index 00000000..cd8a2cef --- /dev/null +++ b/helpers/pagetop-macros/src/maud/ast.rs @@ -0,0 +1,221 @@ +use proc_macro2::{TokenStream, TokenTree}; +use proc_macro_error::SpanRange; + +#[derive(Debug)] +pub enum Markup { + /// Used as a placeholder value on parse error. + ParseError { + span: SpanRange, + }, + Block(Block), + Literal { + content: String, + span: SpanRange, + }, + Symbol { + symbol: TokenStream, + }, + Splice { + expr: TokenStream, + outer_span: SpanRange, + }, + Element { + name: TokenStream, + attrs: Vec<Attr>, + body: ElementBody, + }, + Let { + at_span: SpanRange, + tokens: TokenStream, + }, + Special { + segments: Vec<Special>, + }, + Match { + at_span: SpanRange, + head: TokenStream, + arms: Vec<MatchArm>, + arms_span: SpanRange, + }, +} + +impl Markup { + pub fn span(&self) -> SpanRange { + match *self { + Markup::ParseError { span } => span, + Markup::Block(ref block) => block.span(), + Markup::Literal { span, .. } => span, + Markup::Symbol { ref symbol } => span_tokens(symbol.clone()), + Markup::Splice { outer_span, .. } => outer_span, + Markup::Element { + ref name, ref body, .. + } => { + let name_span = span_tokens(name.clone()); + name_span.join_range(body.span()) + } + Markup::Let { + at_span, + ref tokens, + } => at_span.join_range(span_tokens(tokens.clone())), + Markup::Special { ref segments } => join_ranges(segments.iter().map(Special::span)), + Markup::Match { + at_span, arms_span, .. + } => at_span.join_range(arms_span), + } + } +} + +#[derive(Debug)] +pub enum Attr { + Class { + dot_span: SpanRange, + name: Markup, + toggler: Option<Toggler>, + }, + Id { + hash_span: SpanRange, + name: Markup, + }, + Named { + named_attr: NamedAttr, + }, +} + +impl Attr { + pub fn span(&self) -> SpanRange { + match *self { + Attr::Class { + dot_span, + ref name, + ref toggler, + } => { + let name_span = name.span(); + let dot_name_span = dot_span.join_range(name_span); + if let Some(toggler) = toggler { + dot_name_span.join_range(toggler.cond_span) + } else { + dot_name_span + } + } + Attr::Id { + hash_span, + ref name, + } => { + let name_span = name.span(); + hash_span.join_range(name_span) + } + Attr::Named { ref named_attr } => named_attr.span(), + } + } +} + +#[derive(Debug)] +pub enum ElementBody { + Void { semi_span: SpanRange }, + Block { block: Block }, +} + +impl ElementBody { + pub fn span(&self) -> SpanRange { + match *self { + ElementBody::Void { semi_span } => semi_span, + ElementBody::Block { ref block } => block.span(), + } + } +} + +#[derive(Debug)] +pub struct Block { + pub markups: Vec<Markup>, + pub outer_span: SpanRange, +} + +impl Block { + pub fn span(&self) -> SpanRange { + self.outer_span + } +} + +#[derive(Debug)] +pub struct Special { + pub at_span: SpanRange, + pub head: TokenStream, + pub body: Block, +} + +impl Special { + pub fn span(&self) -> SpanRange { + let body_span = self.body.span(); + self.at_span.join_range(body_span) + } +} + +#[derive(Debug)] +pub struct NamedAttr { + pub name: TokenStream, + pub attr_type: AttrType, +} + +impl NamedAttr { + fn span(&self) -> SpanRange { + let name_span = span_tokens(self.name.clone()); + if let Some(attr_type_span) = self.attr_type.span() { + name_span.join_range(attr_type_span) + } else { + name_span + } + } +} + +#[derive(Debug)] +pub enum AttrType { + Normal { value: Markup }, + Optional { toggler: Toggler }, + Empty { toggler: Option<Toggler> }, +} + +impl AttrType { + fn span(&self) -> Option<SpanRange> { + match *self { + AttrType::Normal { ref value } => Some(value.span()), + AttrType::Optional { ref toggler } => Some(toggler.span()), + AttrType::Empty { ref toggler } => toggler.as_ref().map(Toggler::span), + } + } +} + +#[derive(Debug)] +pub struct Toggler { + pub cond: TokenStream, + pub cond_span: SpanRange, +} + +impl Toggler { + fn span(&self) -> SpanRange { + self.cond_span + } +} + +#[derive(Debug)] +pub struct MatchArm { + pub head: TokenStream, + pub body: Block, +} + +pub fn span_tokens<I: IntoIterator<Item = TokenTree>>(tokens: I) -> SpanRange { + join_ranges(tokens.into_iter().map(|s| SpanRange::single_span(s.span()))) +} + +pub fn join_ranges<I: IntoIterator<Item = SpanRange>>(ranges: I) -> SpanRange { + let mut iter = ranges.into_iter(); + let first = match iter.next() { + Some(span) => span, + None => return SpanRange::call_site(), + }; + let last = iter.last().unwrap_or(first); + first.join_range(last) +} + +pub fn name_to_string(name: TokenStream) -> String { + name.into_iter().map(|token| token.to_string()).collect() +} diff --git a/helpers/pagetop-macros/src/maud/escape.rs b/helpers/pagetop-macros/src/maud/escape.rs new file mode 100644 index 00000000..49ece776 --- /dev/null +++ b/helpers/pagetop-macros/src/maud/escape.rs @@ -0,0 +1,34 @@ +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// !!!!!!!! PLEASE KEEP THIS IN SYNC WITH `maud/src/escape.rs` !!!!!!!!! +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +extern crate alloc; + +use alloc::string::String; + +pub fn escape_to_string(input: &str, output: &mut String) { + for b in input.bytes() { + match b { + b'&' => output.push_str("&amp;"), + b'<' => output.push_str("&lt;"), + b'>' => output.push_str("&gt;"), + b'"' => output.push_str("&quot;"), + _ => unsafe { output.as_mut_vec().push(b) }, + } + } +} + +#[cfg(test)] +mod test { + extern crate alloc; + + use super::escape_to_string; + use alloc::string::String; + + #[test] + fn it_works() { + let mut s = String::new(); + escape_to_string("<script>launchMissiles()</script>", &mut s); + assert_eq!(s, "&lt;script&gt;launchMissiles()&lt;/script&gt;"); + } +} diff --git a/helpers/pagetop-macros/src/maud/generate.rs b/helpers/pagetop-macros/src/maud/generate.rs new file mode 100644 index 00000000..be7946d0 --- /dev/null +++ b/helpers/pagetop-macros/src/maud/generate.rs @@ -0,0 +1,308 @@ +use proc_macro2::{Delimiter, Group, Ident, Literal, Span, TokenStream, TokenTree}; +use proc_macro_error::SpanRange; +use quote::quote; + +use crate::maud::{ast::*, escape}; + +use proc_macro_crate::{crate_name, FoundCrate}; + +pub fn generate(markups: Vec<Markup>, output_ident: TokenTree) -> TokenStream { + let mut build = Builder::new(output_ident.clone()); + Generator::new(output_ident).markups(markups, &mut build); + build.finish() +} + +struct Generator { + output_ident: TokenTree, +} + +impl Generator { + fn new(output_ident: TokenTree) -> Generator { + Generator { output_ident } + } + + fn builder(&self) -> Builder { + Builder::new(self.output_ident.clone()) + } + + fn markups(&self, markups: Vec<Markup>, build: &mut Builder) { + for markup in markups { + self.markup(markup, build); + } + } + + fn markup(&self, markup: Markup, build: &mut Builder) { + match markup { + Markup::ParseError { .. } => {} + Markup::Block(Block { + markups, + outer_span, + }) => { + if markups + .iter() + .any(|markup| matches!(*markup, Markup::Let { .. })) + { + self.block( + Block { + markups, + outer_span, + }, + build, + ); + } else { + self.markups(markups, build); + } + } + Markup::Literal { content, .. } => build.push_escaped(&content), + Markup::Symbol { symbol } => self.name(symbol, build), + Markup::Splice { expr, .. } => self.splice(expr, build), + Markup::Element { name, attrs, body } => self.element(name, attrs, body, build), + Markup::Let { tokens, .. } => build.push_tokens(tokens), + Markup::Special { segments } => { + for Special { head, body, .. } in segments { + build.push_tokens(head); + self.block(body, build); + } + } + Markup::Match { + head, + arms, + arms_span, + .. + } => { + let body = { + let mut build = self.builder(); + for MatchArm { head, body } in arms { + build.push_tokens(head); + self.block(body, &mut build); + } + build.finish() + }; + let mut body = TokenTree::Group(Group::new(Delimiter::Brace, body)); + body.set_span(arms_span.collapse()); + build.push_tokens(quote!(#head #body)); + } + } + } + + fn block( + &self, + Block { + markups, + outer_span, + }: Block, + build: &mut Builder, + ) { + let block = { + let mut build = self.builder(); + self.markups(markups, &mut build); + build.finish() + }; + let mut block = TokenTree::Group(Group::new(Delimiter::Brace, block)); + block.set_span(outer_span.collapse()); + build.push_tokens(TokenStream::from(block)); + } + + fn splice(&self, expr: TokenStream, build: &mut Builder) { + let output_ident = self.output_ident.clone(); + + let found_crate = crate_name("pagetop").expect("pagetop is present in `Cargo.toml`"); + build.push_tokens(match found_crate { + FoundCrate::Itself => quote!( + crate::html::html_private::render_to!(&#expr, &mut #output_ident); + ), + _ => quote!( + pagetop::html::html_private::render_to!(&#expr, &mut #output_ident); + ), + }); + } + + fn element(&self, name: TokenStream, attrs: Vec<Attr>, body: ElementBody, build: &mut Builder) { + build.push_str("<"); + self.name(name.clone(), build); + self.attrs(attrs, build); + build.push_str(">"); + if let ElementBody::Block { block } = body { + self.markups(block.markups, build); + build.push_str("</"); + self.name(name, build); + build.push_str(">"); + } + } + + fn name(&self, name: TokenStream, build: &mut Builder) { + build.push_escaped(&name_to_string(name)); + } + + fn attrs(&self, attrs: Vec<Attr>, build: &mut Builder) { + for NamedAttr { name, attr_type } in desugar_attrs(attrs) { + match attr_type { + AttrType::Normal { value } => { + build.push_str(" "); + self.name(name, build); + build.push_str("=\""); + self.markup(value, build); + build.push_str("\""); + } + AttrType::Optional { + toggler: Toggler { cond, .. }, + } => { + let inner_value = quote!(inner_value); + let body = { + let mut build = self.builder(); + build.push_str(" "); + self.name(name, &mut build); + build.push_str("=\""); + self.splice(inner_value.clone(), &mut build); + build.push_str("\""); + build.finish() + }; + build.push_tokens(quote!(if let Some(#inner_value) = (#cond) { #body })); + } + AttrType::Empty { toggler: None } => { + build.push_str(" "); + self.name(name, build); + } + AttrType::Empty { + toggler: Some(Toggler { cond, .. }), + } => { + let body = { + let mut build = self.builder(); + build.push_str(" "); + self.name(name, &mut build); + build.finish() + }; + build.push_tokens(quote!(if (#cond) { #body })); + } + } + } + } +} + +//////////////////////////////////////////////////////// + +fn desugar_attrs(attrs: Vec<Attr>) -> Vec<NamedAttr> { + let mut classes_static = vec![]; + let mut classes_toggled = vec![]; + let mut ids = vec![]; + let mut named_attrs = vec![]; + for attr in attrs { + match attr { + Attr::Class { + name, + toggler: Some(toggler), + .. + } => classes_toggled.push((name, toggler)), + Attr::Class { + name, + toggler: None, + .. + } => classes_static.push(name), + Attr::Id { name, .. } => ids.push(name), + Attr::Named { named_attr } => named_attrs.push(named_attr), + } + } + let classes = desugar_classes_or_ids("class", classes_static, classes_toggled); + let ids = desugar_classes_or_ids("id", ids, vec![]); + classes.into_iter().chain(ids).chain(named_attrs).collect() +} + +fn desugar_classes_or_ids( + attr_name: &'static str, + values_static: Vec<Markup>, + values_toggled: Vec<(Markup, Toggler)>, +) -> Option<NamedAttr> { + if values_static.is_empty() && values_toggled.is_empty() { + return None; + } + let mut markups = Vec::new(); + let mut leading_space = false; + for name in values_static { + markups.extend(prepend_leading_space(name, &mut leading_space)); + } + for (name, Toggler { cond, cond_span }) in values_toggled { + let body = Block { + markups: prepend_leading_space(name, &mut leading_space), + // TODO: is this correct? + outer_span: cond_span, + }; + markups.push(Markup::Special { + segments: vec![Special { + at_span: SpanRange::call_site(), + head: quote!(if (#cond)), + body, + }], + }); + } + Some(NamedAttr { + name: TokenStream::from(TokenTree::Ident(Ident::new(attr_name, Span::call_site()))), + attr_type: AttrType::Normal { + value: Markup::Block(Block { + markups, + outer_span: SpanRange::call_site(), + }), + }, + }) +} + +fn prepend_leading_space(name: Markup, leading_space: &mut bool) -> Vec<Markup> { + let mut markups = Vec::new(); + if *leading_space { + markups.push(Markup::Literal { + content: " ".to_owned(), + span: name.span(), + }); + } + *leading_space = true; + markups.push(name); + markups +} + +//////////////////////////////////////////////////////// + +struct Builder { + output_ident: TokenTree, + tokens: Vec<TokenTree>, + tail: String, +} + +impl Builder { + fn new(output_ident: TokenTree) -> Builder { + Builder { + output_ident, + tokens: Vec::new(), + tail: String::new(), + } + } + + fn push_str(&mut self, string: &str) { + self.tail.push_str(string); + } + + fn push_escaped(&mut self, string: &str) { + escape::escape_to_string(string, &mut self.tail); + } + + fn push_tokens(&mut self, tokens: TokenStream) { + self.cut(); + self.tokens.extend(tokens); + } + + fn cut(&mut self) { + if self.tail.is_empty() { + return; + } + let push_str_expr = { + let output_ident = self.output_ident.clone(); + let string = TokenTree::Literal(Literal::string(&self.tail)); + quote!(#output_ident.push_str(#string);) + }; + self.tail.clear(); + self.tokens.extend(push_str_expr); + } + + fn finish(mut self) -> TokenStream { + self.cut(); + self.tokens.into_iter().collect() + } +} diff --git a/helpers/pagetop-macros/src/maud/parse.rs b/helpers/pagetop-macros/src/maud/parse.rs new file mode 100644 index 00000000..d24cea6e --- /dev/null +++ b/helpers/pagetop-macros/src/maud/parse.rs @@ -0,0 +1,752 @@ +use proc_macro2::{Delimiter, Ident, Literal, Spacing, Span, TokenStream, TokenTree}; +use proc_macro_error::{abort, abort_call_site, emit_error, SpanRange}; +use std::collections::HashMap; + +use syn::Lit; + +use crate::maud::ast; + +pub fn parse(input: TokenStream) -> Vec<ast::Markup> { + Parser::new(input).markups() +} + +#[derive(Clone)] +struct Parser { + /// If we're inside an attribute, then this contains the attribute name. + current_attr: Option<String>, + input: <TokenStream as IntoIterator>::IntoIter, +} + +impl Iterator for Parser { + type Item = TokenTree; + + fn next(&mut self) -> Option<TokenTree> { + self.input.next() + } +} + +impl Parser { + fn new(input: TokenStream) -> Parser { + Parser { + current_attr: None, + input: input.into_iter(), + } + } + + fn with_input(&self, input: TokenStream) -> Parser { + Parser { + current_attr: self.current_attr.clone(), + input: input.into_iter(), + } + } + + /// Returns the next token in the stream without consuming it. + fn peek(&mut self) -> Option<TokenTree> { + self.clone().next() + } + + /// Returns the next two tokens in the stream without consuming them. + fn peek2(&mut self) -> Option<(TokenTree, Option<TokenTree>)> { + let mut clone = self.clone(); + clone.next().map(|first| (first, clone.next())) + } + + /// Advances the cursor by one step. + fn advance(&mut self) { + self.next(); + } + + /// Advances the cursor by two steps. + fn advance2(&mut self) { + self.next(); + self.next(); + } + + /// Parses multiple blocks of markup. + fn markups(&mut self) -> Vec<ast::Markup> { + let mut result = Vec::new(); + loop { + match self.peek2() { + None => break, + Some((TokenTree::Punct(ref punct), _)) if punct.as_char() == ';' => self.advance(), + Some((TokenTree::Punct(ref punct), Some(TokenTree::Ident(ref ident)))) + if punct.as_char() == '@' && *ident == "let" => + { + self.advance2(); + let keyword = TokenTree::Ident(ident.clone()); + result.push(self.let_expr(punct.span(), keyword)); + } + _ => result.push(self.markup()), + } + } + result + } + + /// Parses a single block of markup. + fn markup(&mut self) -> ast::Markup { + let token = match self.peek() { + Some(token) => token, + None => { + abort_call_site!("unexpected end of input"); + } + }; + let markup = match token { + // Literal + TokenTree::Literal(literal) => { + self.advance(); + self.literal(literal) + } + // Special form + TokenTree::Punct(ref punct) if punct.as_char() == '@' => { + self.advance(); + let at_span = punct.span(); + match self.next() { + Some(TokenTree::Ident(ident)) => { + let keyword = TokenTree::Ident(ident.clone()); + match ident.to_string().as_str() { + "if" => { + let mut segments = Vec::new(); + self.if_expr(at_span, vec![keyword], &mut segments); + ast::Markup::Special { segments } + } + "while" => self.while_expr(at_span, keyword), + "for" => self.for_expr(at_span, keyword), + "match" => self.match_expr(at_span, keyword), + "let" => { + let span = SpanRange { + first: at_span, + last: ident.span(), + }; + abort!(span, "`@let` only works inside a block"); + } + other => { + let span = SpanRange { + first: at_span, + last: ident.span(), + }; + abort!(span, "unknown keyword `@{}`", other); + } + } + } + _ => { + abort!(at_span, "expected keyword after `@`"); + } + } + } + // Element + TokenTree::Ident(ident) => { + let ident_string = ident.to_string(); + match ident_string.as_str() { + "if" | "while" | "for" | "match" | "let" => { + abort!( + ident, + "found keyword `{}`", ident_string; + help = "should this be a `@{}`?", ident_string + ); + } + "true" | "false" => { + if let Some(attr_name) = &self.current_attr { + emit_error!( + ident, + r#"attribute value must be a string"#; + help = "to declare an empty attribute, omit the equals sign: `{}`", + attr_name; + help = "to toggle the attribute, use square brackets: `{}[some_boolean_flag]`", + attr_name; + ); + return ast::Markup::ParseError { + span: SpanRange::single_span(ident.span()), + }; + } + } + _ => {} + } + + // `.try_namespaced_name()` should never fail as we've + // already seen an `Ident` + let name = self.try_namespaced_name().expect("identifier"); + self.element(name) + } + // Div element shorthand + TokenTree::Punct(ref punct) if punct.as_char() == '.' || punct.as_char() == '#' => { + let name = TokenTree::Ident(Ident::new("div", punct.span())); + self.element(name.into()) + } + // Splice + TokenTree::Group(ref group) if group.delimiter() == Delimiter::Parenthesis => { + self.advance(); + ast::Markup::Splice { + expr: group.stream(), + outer_span: SpanRange::single_span(group.span()), + } + } + // Block + TokenTree::Group(ref group) if group.delimiter() == Delimiter::Brace => { + self.advance(); + ast::Markup::Block(self.block(group.stream(), SpanRange::single_span(group.span()))) + } + // ??? + token => { + abort!(token, "invalid syntax"); + } + }; + markup + } + + /// Parses a literal string. + fn literal(&mut self, literal: Literal) -> ast::Markup { + match Lit::new(literal.clone()) { + Lit::Str(lit_str) => { + return ast::Markup::Literal { + content: lit_str.value(), + span: SpanRange::single_span(literal.span()), + } + } + // Boolean literals are idents, so `Lit::Bool` is handled in + // `markup`, not here. + Lit::Int(..) | Lit::Float(..) => { + emit_error!(literal, r#"literal must be double-quoted: `"{}"`"#, literal); + } + Lit::Char(lit_char) => { + emit_error!( + literal, + r#"literal must be double-quoted: `"{}"`"#, + lit_char.value(), + ); + } + _ => { + emit_error!(literal, "expected string"); + } + } + ast::Markup::ParseError { + span: SpanRange::single_span(literal.span()), + } + } + + /// Parses an `@if` expression. + /// + /// The leading `@if` should already be consumed. + fn if_expr(&mut self, at_span: Span, prefix: Vec<TokenTree>, segments: &mut Vec<ast::Special>) { + let mut head = prefix; + let body = loop { + match self.next() { + Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { + break self.block(block.stream(), SpanRange::single_span(block.span())); + } + Some(token) => head.push(token), + None => { + let mut span = ast::span_tokens(head); + span.first = at_span; + abort!(span, "expected body for this `@if`"); + } + } + }; + segments.push(ast::Special { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + body, + }); + self.else_if_expr(segments) + } + + /// Parses an optional `@else if` or `@else`. + /// + /// The leading `@else if` or `@else` should *not* already be consumed. + fn else_if_expr(&mut self, segments: &mut Vec<ast::Special>) { + match self.peek2() { + Some((TokenTree::Punct(ref punct), Some(TokenTree::Ident(ref else_keyword)))) + if punct.as_char() == '@' && *else_keyword == "else" => + { + self.advance2(); + let at_span = punct.span(); + let else_keyword = TokenTree::Ident(else_keyword.clone()); + match self.peek() { + // `@else if` + Some(TokenTree::Ident(ref if_keyword)) if *if_keyword == "if" => { + self.advance(); + let if_keyword = TokenTree::Ident(if_keyword.clone()); + self.if_expr(at_span, vec![else_keyword, if_keyword], segments) + } + // Just an `@else` + _ => match self.next() { + Some(TokenTree::Group(ref group)) + if group.delimiter() == Delimiter::Brace => + { + let body = + self.block(group.stream(), SpanRange::single_span(group.span())); + segments.push(ast::Special { + at_span: SpanRange::single_span(at_span), + head: vec![else_keyword].into_iter().collect(), + body, + }); + } + _ => { + let span = SpanRange { + first: at_span, + last: else_keyword.span(), + }; + abort!(span, "expected body for this `@else`"); + } + }, + } + } + // We didn't find an `@else`; stop + _ => {} + } + } + + /// Parses an `@while` expression. + /// + /// The leading `@while` should already be consumed. + fn while_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let keyword_span = keyword.span(); + let mut head = vec![keyword]; + let body = loop { + match self.next() { + Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { + break self.block(block.stream(), SpanRange::single_span(block.span())); + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "expected body for this `@while`"); + } + } + }; + ast::Markup::Special { + segments: vec![ast::Special { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + body, + }], + } + } + + /// Parses a `@for` expression. + /// + /// The leading `@for` should already be consumed. + fn for_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let keyword_span = keyword.span(); + let mut head = vec![keyword]; + loop { + match self.next() { + Some(TokenTree::Ident(ref in_keyword)) if *in_keyword == "in" => { + head.push(TokenTree::Ident(in_keyword.clone())); + break; + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "missing `in` in `@for` loop"); + } + } + } + let body = loop { + match self.next() { + Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { + break self.block(block.stream(), SpanRange::single_span(block.span())); + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "expected body for this `@for`"); + } + } + }; + ast::Markup::Special { + segments: vec![ast::Special { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + body, + }], + } + } + + /// Parses a `@match` expression. + /// + /// The leading `@match` should already be consumed. + fn match_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let keyword_span = keyword.span(); + let mut head = vec![keyword]; + let (arms, arms_span) = loop { + match self.next() { + Some(TokenTree::Group(ref body)) if body.delimiter() == Delimiter::Brace => { + let span = SpanRange::single_span(body.span()); + break (self.with_input(body.stream()).match_arms(), span); + } + Some(token) => head.push(token), + None => { + let span = SpanRange { + first: at_span, + last: keyword_span, + }; + abort!(span, "expected body for this `@match`"); + } + } + }; + ast::Markup::Match { + at_span: SpanRange::single_span(at_span), + head: head.into_iter().collect(), + arms, + arms_span, + } + } + + fn match_arms(&mut self) -> Vec<ast::MatchArm> { + let mut arms = Vec::new(); + while let Some(arm) = self.match_arm() { + arms.push(arm); + } + arms + } + + fn match_arm(&mut self) -> Option<ast::MatchArm> { + let mut head = Vec::new(); + loop { + match self.peek2() { + Some((TokenTree::Punct(ref eq), Some(TokenTree::Punct(ref gt)))) + if eq.as_char() == '=' + && gt.as_char() == '>' + && eq.spacing() == Spacing::Joint => + { + self.advance2(); + head.push(TokenTree::Punct(eq.clone())); + head.push(TokenTree::Punct(gt.clone())); + break; + } + Some((token, _)) => { + self.advance(); + head.push(token); + } + None => { + if head.is_empty() { + return None; + } else { + let head_span = ast::span_tokens(head); + abort!(head_span, "unexpected end of @match pattern"); + } + } + } + } + let body = match self.next() { + // $pat => { $stmts } + Some(TokenTree::Group(ref body)) if body.delimiter() == Delimiter::Brace => { + let body = self.block(body.stream(), SpanRange::single_span(body.span())); + // Trailing commas are optional if the match arm is a braced block + if let Some(TokenTree::Punct(ref punct)) = self.peek() { + if punct.as_char() == ',' { + self.advance(); + } + } + body + } + // $pat => $expr + Some(first_token) => { + let mut span = SpanRange::single_span(first_token.span()); + let mut body = vec![first_token]; + loop { + match self.next() { + Some(TokenTree::Punct(ref punct)) if punct.as_char() == ',' => break, + Some(token) => { + span.last = token.span(); + body.push(token); + } + None => break, + } + } + self.block(body.into_iter().collect(), span) + } + None => { + let span = ast::span_tokens(head); + abort!(span, "unexpected end of @match arm"); + } + }; + Some(ast::MatchArm { + head: head.into_iter().collect(), + body, + }) + } + + /// Parses a `@let` expression. + /// + /// The leading `@let` should already be consumed. + fn let_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { + let mut tokens = vec![keyword]; + loop { + match self.next() { + Some(token) => match token { + TokenTree::Punct(ref punct) if punct.as_char() == '=' => { + tokens.push(token.clone()); + break; + } + _ => tokens.push(token), + }, + None => { + let mut span = ast::span_tokens(tokens); + span.first = at_span; + abort!(span, "unexpected end of `@let` expression"); + } + } + } + loop { + match self.next() { + Some(token) => match token { + TokenTree::Punct(ref punct) if punct.as_char() == ';' => { + tokens.push(token.clone()); + break; + } + _ => tokens.push(token), + }, + None => { + let mut span = ast::span_tokens(tokens); + span.first = at_span; + abort!( + span, + "unexpected end of `@let` expression"; + help = "are you missing a semicolon?" + ); + } + } + } + ast::Markup::Let { + at_span: SpanRange::single_span(at_span), + tokens: tokens.into_iter().collect(), + } + } + + /// Parses an element node. + /// + /// The element name should already be consumed. + fn element(&mut self, name: TokenStream) -> ast::Markup { + if self.current_attr.is_some() { + let span = ast::span_tokens(name); + abort!(span, "unexpected element"); + } + let attrs = self.attrs(); + let body = match self.peek() { + Some(TokenTree::Punct(ref punct)) + if punct.as_char() == ';' || punct.as_char() == '/' => + { + // Void element + self.advance(); + if punct.as_char() == '/' { + emit_error!( + punct, + "void elements must use `;`, not `/`"; + help = "change this to `;`"; + help = "see https://github.com/lambda-fairy/maud/pull/315 for details"; + ); + } + ast::ElementBody::Void { + semi_span: SpanRange::single_span(punct.span()), + } + } + Some(_) => match self.markup() { + ast::Markup::Block(block) => ast::ElementBody::Block { block }, + markup => { + let markup_span = markup.span(); + abort!( + markup_span, + "element body must be wrapped in braces"; + help = "see https://github.com/lambda-fairy/maud/pull/137 for details" + ); + } + }, + None => abort_call_site!("expected `;`, found end of macro"), + }; + ast::Markup::Element { name, attrs, body } + } + + /// Parses the attributes of an element. + fn attrs(&mut self) -> Vec<ast::Attr> { + let mut attrs = Vec::new(); + loop { + if let Some(name) = self.try_namespaced_name() { + // Attribute + match self.peek() { + // Non-empty attribute + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '=' => { + self.advance(); + // Parse a value under an attribute context + assert!(self.current_attr.is_none()); + self.current_attr = Some(ast::name_to_string(name.clone())); + let attr_type = match self.attr_toggler() { + Some(toggler) => ast::AttrType::Optional { toggler }, + None => { + let value = self.markup(); + ast::AttrType::Normal { value } + } + }; + self.current_attr = None; + attrs.push(ast::Attr::Named { + named_attr: ast::NamedAttr { name, attr_type }, + }); + } + // Empty attribute (legacy syntax) + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '?' => { + self.advance(); + let toggler = self.attr_toggler(); + attrs.push(ast::Attr::Named { + named_attr: ast::NamedAttr { + name: name.clone(), + attr_type: ast::AttrType::Empty { toggler }, + }, + }); + } + // Empty attribute (new syntax) + _ => { + let toggler = self.attr_toggler(); + attrs.push(ast::Attr::Named { + named_attr: ast::NamedAttr { + name: name.clone(), + attr_type: ast::AttrType::Empty { toggler }, + }, + }); + } + } + } else { + match self.peek() { + // Class shorthand + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '.' => { + self.advance(); + let name = self.class_or_id_name(); + let toggler = self.attr_toggler(); + attrs.push(ast::Attr::Class { + dot_span: SpanRange::single_span(punct.span()), + name, + toggler, + }); + } + // ID shorthand + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '#' => { + self.advance(); + let name = self.class_or_id_name(); + attrs.push(ast::Attr::Id { + hash_span: SpanRange::single_span(punct.span()), + name, + }); + } + // If it's not a valid attribute, backtrack and bail out + _ => break, + } + } + } + + let mut attr_map: HashMap<String, Vec<SpanRange>> = HashMap::new(); + let mut has_class = false; + for attr in &attrs { + let name = match attr { + ast::Attr::Class { .. } => { + if has_class { + // Only check the first class to avoid spurious duplicates + continue; + } + has_class = true; + "class".to_string() + } + ast::Attr::Id { .. } => "id".to_string(), + ast::Attr::Named { named_attr } => named_attr + .name + .clone() + .into_iter() + .map(|token| token.to_string()) + .collect(), + }; + let entry = attr_map.entry(name).or_default(); + entry.push(attr.span()); + } + + for (name, spans) in attr_map { + if spans.len() > 1 { + let mut spans = spans.into_iter(); + let first_span = spans.next().expect("spans should be non-empty"); + abort!(first_span, "duplicate attribute `{}`", name); + } + } + + attrs + } + + /// Parses the name of a class or ID. + fn class_or_id_name(&mut self) -> ast::Markup { + if let Some(symbol) = self.try_name() { + ast::Markup::Symbol { symbol } + } else { + self.markup() + } + } + + /// Parses the `[cond]` syntax after an empty attribute or class shorthand. + fn attr_toggler(&mut self) -> Option<ast::Toggler> { + match self.peek() { + Some(TokenTree::Group(ref group)) if group.delimiter() == Delimiter::Bracket => { + self.advance(); + Some(ast::Toggler { + cond: group.stream(), + cond_span: SpanRange::single_span(group.span()), + }) + } + _ => None, + } + } + + /// Parses an identifier, without dealing with namespaces. + fn try_name(&mut self) -> Option<TokenStream> { + let mut result = Vec::new(); + if let Some(token @ TokenTree::Ident(_)) = self.peek() { + self.advance(); + result.push(token); + } else { + return None; + } + let mut expect_ident = false; + loop { + expect_ident = match self.peek() { + Some(TokenTree::Punct(ref punct)) if punct.as_char() == '-' => { + self.advance(); + result.push(TokenTree::Punct(punct.clone())); + true + } + Some(TokenTree::Ident(ref ident)) if expect_ident => { + self.advance(); + result.push(TokenTree::Ident(ident.clone())); + false + } + _ => break, + }; + } + Some(result.into_iter().collect()) + } + + /// Parses a HTML element or attribute name, along with a namespace + /// if necessary. + fn try_namespaced_name(&mut self) -> Option<TokenStream> { + let mut result = vec![self.try_name()?]; + if let Some(TokenTree::Punct(ref punct)) = self.peek() { + if punct.as_char() == ':' { + self.advance(); + result.push(TokenStream::from(TokenTree::Punct(punct.clone()))); + result.push(self.try_name()?); + } + } + Some(result.into_iter().collect()) + } + + /// Parses the given token stream as a Maud expression. + fn block(&mut self, body: TokenStream, outer_span: SpanRange) -> ast::Block { + let markups = self.with_input(body).markups(); + ast::Block { + markups, + outer_span, + } + } +} diff --git a/src/html.rs b/src/html.rs new file mode 100644 index 00000000..1f24f630 --- /dev/null +++ b/src/html.rs @@ -0,0 +1,4 @@ +//! HTML en código. + +mod maud; +pub use maud::{html, html_private, Markup, PreEscaped, DOCTYPE}; diff --git a/src/html/maud.rs b/src/html/maud.rs new file mode 100644 index 00000000..db9308af --- /dev/null +++ b/src/html/maud.rs @@ -0,0 +1,350 @@ +//#![no_std] + +//! A macro for writing HTML templates. +//! +//! This documentation only describes the runtime API. For a general +//! guide, check out the [book] instead. +//! +//! [book]: https://maud.lambda.xyz/ + +//#![doc(html_root_url = "https://docs.rs/maud/0.25.0")] + +extern crate alloc; + +use alloc::{borrow::Cow, boxed::Box, string::String}; +use core::fmt::{self, Arguments, Display, Write}; + +pub use pagetop_macros::html; + +mod escape; + +/// An adapter that escapes HTML special characters. +/// +/// The following characters are escaped: +/// +/// * `&` is escaped as `&amp;` +/// * `<` is escaped as `&lt;` +/// * `>` is escaped as `&gt;` +/// * `"` is escaped as `&quot;` +/// +/// All other characters are passed through unchanged. +/// +/// **Note:** In versions prior to 0.13, the single quote (`'`) was +/// escaped as well. +/// +/// # Example +/// +/// ```rust#ignore +/// use maud::Escaper; +/// use std::fmt::Write; +/// let mut s = String::new(); +/// write!(Escaper::new(&mut s), "<script>launchMissiles()</script>").unwrap(); +/// assert_eq!(s, "&lt;script&gt;launchMissiles()&lt;/script&gt;"); +/// ``` +pub struct Escaper<'a>(&'a mut String); + +impl<'a> Escaper<'a> { + /// Creates an `Escaper` from a `String`. + pub fn new(buffer: &'a mut String) -> Escaper<'a> { + Escaper(buffer) + } +} + +impl<'a> fmt::Write for Escaper<'a> { + fn write_str(&mut self, s: &str) -> fmt::Result { + escape::escape_to_string(s, self.0); + Ok(()) + } +} + +/// Represents a type that can be rendered as HTML. +/// +/// To implement this for your own type, override either the `.render()` +/// or `.render_to()` methods; since each is defined in terms of the +/// other, you only need to implement one of them. See the example below. +/// +/// # Minimal implementation +/// +/// An implementation of this trait must override at least one of +/// `.render()` or `.render_to()`. Since the default definitions of +/// these methods call each other, not doing this will result in +/// infinite recursion. +/// +/// # Example +/// +/// ```rust#ignore +/// use maud::{html, Markup, Render}; +/// +/// /// Provides a shorthand for linking to a CSS stylesheet. +/// pub struct Stylesheet(&'static str); +/// +/// impl Render for Stylesheet { +/// fn render(&self) -> Markup { +/// html! { +/// link rel="stylesheet" type="text/css" href=(self.0); +/// } +/// } +/// } +/// ``` +pub trait Render { + /// Renders `self` as a block of `Markup`. + fn render(&self) -> Markup { + let mut buffer = String::new(); + self.render_to(&mut buffer); + PreEscaped(buffer) + } + + /// Appends a representation of `self` to the given buffer. + /// + /// Its default implementation just calls `.render()`, but you may + /// override it with something more efficient. + /// + /// Note that no further escaping is performed on data written to + /// the buffer. If you override this method, you must make sure that + /// any data written is properly escaped, whether by hand or using + /// the [`Escaper`](struct.Escaper.html) wrapper struct. + fn render_to(&self, buffer: &mut String) { + buffer.push_str(&self.render().into_string()); + } +} + +impl Render for str { + fn render_to(&self, w: &mut String) { + escape::escape_to_string(self, w); + } +} + +impl Render for String { + fn render_to(&self, w: &mut String) { + str::render_to(self, w); + } +} + +impl<'a> Render for Cow<'a, str> { + fn render_to(&self, w: &mut String) { + str::render_to(self, w); + } +} + +impl<'a> Render for Arguments<'a> { + fn render_to(&self, w: &mut String) { + let _ = Escaper::new(w).write_fmt(*self); + } +} + +impl<'a, T: Render + ?Sized> Render for &'a T { + fn render_to(&self, w: &mut String) { + T::render_to(self, w); + } +} + +impl<'a, T: Render + ?Sized> Render for &'a mut T { + fn render_to(&self, w: &mut String) { + T::render_to(self, w); + } +} + +impl<T: Render + ?Sized> Render for Box<T> { + fn render_to(&self, w: &mut String) { + T::render_to(self, w); + } +} + +macro_rules! impl_render_with_display { + ($($ty:ty)*) => { + $( + impl Render for $ty { + fn render_to(&self, w: &mut String) { + // TODO: remove the explicit arg when Rust 1.58 is released + format_args!("{self}", self = self).render_to(w); + } + } + )* + }; +} + +impl_render_with_display! { + char f32 f64 +} + +macro_rules! impl_render_with_itoa { + ($($ty:ty)*) => { + $( + impl Render for $ty { + fn render_to(&self, w: &mut String) { + w.push_str(itoa::Buffer::new().format(*self)); + } + } + )* + }; +} + +impl_render_with_itoa! { + i8 i16 i32 i64 i128 isize + u8 u16 u32 u64 u128 usize +} + +/// Renders a value using its [`Display`] impl. +/// +/// # Example +/// +/// ```rust#ignore +/// use maud::html; +/// use std::net::Ipv4Addr; +/// +/// let ip_address = Ipv4Addr::new(127, 0, 0, 1); +/// +/// let markup = html! { +/// "My IP address is: " +/// (maud::display(ip_address)) +/// }; +/// +/// assert_eq!(markup.into_string(), "My IP address is: 127.0.0.1"); +/// ``` +pub fn display(value: impl Display) -> impl Render { + struct DisplayWrapper<T>(T); + + impl<T: Display> Render for DisplayWrapper<T> { + fn render_to(&self, w: &mut String) { + format_args!("{0}", self.0).render_to(w); + } + } + + DisplayWrapper(value) +} + +/// A wrapper that renders the inner value without escaping. +#[derive(Debug, Clone, Copy)] +pub struct PreEscaped<T: AsRef<str>>(pub T); + +impl<T: AsRef<str>> Render for PreEscaped<T> { + fn render_to(&self, w: &mut String) { + w.push_str(self.0.as_ref()); + } +} + +/// A block of markup is a string that does not need to be escaped. +/// +/// The `html!` macro expands to an expression of this type. +pub type Markup = PreEscaped<String>; + +impl Markup { + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } +} + +impl<T: AsRef<str> + Into<String>> PreEscaped<T> { + /// Converts the inner value to a string. + pub fn into_string(self) -> String { + self.0.into() + } +} + +impl<T: AsRef<str> + Into<String>> From<PreEscaped<T>> for String { + fn from(value: PreEscaped<T>) -> String { + value.into_string() + } +} + +impl<T: AsRef<str> + Default> Default for PreEscaped<T> { + fn default() -> Self { + Self(Default::default()) + } +} + +/// The literal string `<!DOCTYPE html>`. +/// +/// # Example +/// +/// A minimal web page: +/// +/// ```rust#ignore +/// use maud::{DOCTYPE, html}; +/// +/// let markup = html! { +/// (DOCTYPE) +/// html { +/// head { +/// meta charset="utf-8"; +/// title { "Test page" } +/// } +/// body { +/// p { "Hello, world!" } +/// } +/// } +/// }; +/// ``` +pub const DOCTYPE: PreEscaped<&'static str> = PreEscaped("<!DOCTYPE html>"); + +mod actix_support { + extern crate alloc; + + use crate::html::PreEscaped; + use actix_web::{http::header, HttpRequest, HttpResponse, Responder}; + use alloc::string::String; + + impl Responder for PreEscaped<String> { + type Body = String; + + fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> { + HttpResponse::Ok() + .content_type(header::ContentType::html()) + .message_body(self.0) + .unwrap() + } + } +} + +#[doc(hidden)] +pub mod html_private { + extern crate alloc; + + use super::{display, Render}; + use alloc::string::String; + use core::fmt::Display; + + #[doc(hidden)] + #[macro_export] + macro_rules! render_to { + ($x:expr, $buffer:expr) => {{ + use $crate::html::html_private::*; + match ChooseRenderOrDisplay($x) { + x => (&&x).implements_render_or_display().render_to(x.0, $buffer), + } + }}; + } + + pub use render_to; + + pub struct ChooseRenderOrDisplay<T>(pub T); + + pub struct ViaRenderTag; + pub struct ViaDisplayTag; + + pub trait ViaRender { + fn implements_render_or_display(&self) -> ViaRenderTag { + ViaRenderTag + } + } + pub trait ViaDisplay { + fn implements_render_or_display(&self) -> ViaDisplayTag { + ViaDisplayTag + } + } + + impl<T: Render> ViaRender for &ChooseRenderOrDisplay<T> {} + impl<T: Display> ViaDisplay for ChooseRenderOrDisplay<T> {} + + impl ViaRenderTag { + pub fn render_to<T: Render + ?Sized>(self, value: &T, buffer: &mut String) { + value.render_to(buffer); + } + } + + impl ViaDisplayTag { + pub fn render_to<T: Display + ?Sized>(self, value: &T, buffer: &mut String) { + display(value).render_to(buffer); + } + } +} diff --git a/src/html/maud/escape.rs b/src/html/maud/escape.rs new file mode 100644 index 00000000..94cdeec1 --- /dev/null +++ b/src/html/maud/escape.rs @@ -0,0 +1,34 @@ +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// !!!!! PLEASE KEEP THIS IN SYNC WITH `maud_macros/src/escape.rs` !!!!! +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +extern crate alloc; + +use alloc::string::String; + +pub fn escape_to_string(input: &str, output: &mut String) { + for b in input.bytes() { + match b { + b'&' => output.push_str("&amp;"), + b'<' => output.push_str("&lt;"), + b'>' => output.push_str("&gt;"), + b'"' => output.push_str("&quot;"), + _ => unsafe { output.as_mut_vec().push(b) }, + } + } +} + +#[cfg(test)] +mod test { + extern crate alloc; + + use super::escape_to_string; + use alloc::string::String; + + #[test] + fn it_works() { + let mut s = String::new(); + escape_to_string("<script>launchMissiles()</script>", &mut s); + assert_eq!(s, "&lt;script&gt;launchMissiles()&lt;/script&gt;"); + } +} diff --git a/src/lib.rs b/src/lib.rs index 308c1633..2f973518 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,7 +32,7 @@ // RE-EXPORTED ************************************************************************************* -pub use pagetop_macros::{main, test}; +pub use pagetop_macros::{html, main, test}; // API ********************************************************************************************* @@ -42,6 +42,8 @@ pub mod config; pub mod global; // Gestión de trazas y registro de eventos de la aplicación. pub mod trace; +// HTML en código. +pub mod html; // Gestión del servidor y servicios web. pub mod service; // Prepara y ejecuta la aplicación. diff --git a/src/prelude.rs b/src/prelude.rs index 5d5851fc..eb59c4f2 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -2,7 +2,7 @@ // RE-EXPORTED. -pub use crate::{main, test}; +pub use crate::{html, main, test}; // MACROS. @@ -15,6 +15,8 @@ pub use crate::global; pub use crate::trace; +pub use crate::html::*; + pub use crate::service; pub use crate::app::Application; From 6944938910d3ae48208ba7b50163a234e422b9c1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 7 Jul 2025 20:31:00 +0200 Subject: [PATCH 667/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Actualiza=20el=20c?= =?UTF-8?q?=C3=B3digo=20de=20maud=20a=20la=20versi=C3=B3n=200.27.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 82 +- helpers/pagetop-macros/Cargo.toml | 4 +- helpers/pagetop-macros/src/lib.rs | 3 +- helpers/pagetop-macros/src/maud.rs | 53 +- helpers/pagetop-macros/src/maud/ast.rs | 1222 ++++++++++++++++--- helpers/pagetop-macros/src/maud/escape.rs | 7 - helpers/pagetop-macros/src/maud/generate.rs | 478 +++++--- helpers/pagetop-macros/src/maud/parse.rs | 752 ------------ src/html.rs | 2 +- src/html/maud.rs | 75 +- src/service.rs | 2 +- 11 files changed, 1459 insertions(+), 1221 deletions(-) delete mode 100644 helpers/pagetop-macros/src/maud/parse.rs diff --git a/Cargo.lock b/Cargo.lock index d53ffd7c..cf974c87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -182,7 +182,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -426,7 +426,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "unicode-xid", ] @@ -448,7 +448,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -937,13 +937,13 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro-crate", - "proc-macro-error", "proc-macro2", + "proc-macro2-diagnostics", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -998,7 +998,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1052,30 +1052,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro2" version = "1.0.95" @@ -1085,6 +1061,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "version_check", +] + [[package]] name = "quote" version = "1.0.40" @@ -1242,7 +1230,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1350,16 +1338,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.104" @@ -1379,7 +1357,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1409,7 +1387,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1571,7 +1549,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1721,7 +1699,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn", "wasm-bindgen-shared", ] @@ -1743,7 +1721,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1905,7 +1883,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "synstructure", ] @@ -1926,7 +1904,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -1946,7 +1924,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "synstructure", ] @@ -1980,7 +1958,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 80413821..ea6404b9 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.1" +version = "0.0.2" edition = "2021" description = """\ @@ -19,7 +19,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.95" +proc-macro2-diagnostics = { version = "0.10.1", default-features = false } proc-macro-crate = "3.3.0" -proc-macro-error = "1.0.4" quote = "1.0.40" syn = { version = "2.0.104", features = ["full"] } diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 65badb04..e0f3badd 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -17,11 +17,10 @@ mod maud; use proc_macro::TokenStream; -use proc_macro_error::proc_macro_error; use quote::quote; +/// Macro para escribir plantillas HTML ([Maud](https://docs.rs/maud)). #[proc_macro] -#[proc_macro_error] pub fn html(input: TokenStream) -> TokenStream { maud::expand(input.into()).into() } diff --git a/helpers/pagetop-macros/src/maud.rs b/helpers/pagetop-macros/src/maud.rs index a4e7873f..9077dbb9 100644 --- a/helpers/pagetop-macros/src/maud.rs +++ b/helpers/pagetop-macros/src/maud.rs @@ -1,4 +1,4 @@ -// #![doc(html_root_url = "https://docs.rs/maud_macros/0.25.0")] +// #![doc(html_root_url = "https://docs.rs/maud_macros/0.27.0")] // TokenStream values are reference counted, and the mental overhead of tracking // lifetimes outweighs the marginal gains from explicit borrowing // #![allow(clippy::needless_pass_by_value)] @@ -6,34 +6,55 @@ mod ast; mod escape; mod generate; -mod parse; -use proc_macro2::{Ident, Span, TokenStream, TokenTree}; +use ast::DiagnosticParse; +use proc_macro2::{Ident, Span, TokenStream}; +use proc_macro2_diagnostics::Diagnostic; use proc_macro_crate::{crate_name, FoundCrate}; use quote::quote; +use syn::parse::{ParseStream, Parser}; pub fn expand(input: TokenStream) -> TokenStream { - let output_ident = TokenTree::Ident(Ident::new("__maud_output", Span::mixed_site())); // Heuristic: the size of the resulting markup tends to correlate with the // code size of the template itself let size_hint = input.to_string().len(); - let markups = parse::parse(input); - let stmts = generate::generate(markups, output_ident.clone()); - let found_crate = crate_name("pagetop").expect("pagetop is present in `Cargo.toml`"); - let pre_escaped = match found_crate { - FoundCrate::Itself => quote!( - crate::html::PreEscaped(#output_ident) - ), - _ => quote!( - pagetop::html::PreEscaped(#output_ident) - ), + let mut diagnostics = Vec::new(); + let markups = match Parser::parse2( + |input: ParseStream| ast::Markups::diagnostic_parse(input, &mut diagnostics), + input, + ) { + Ok(data) => data, + Err(err) => { + let err = err.to_compile_error(); + let diag_tokens = diagnostics.into_iter().map(Diagnostic::emit_as_expr_tokens); + + return quote! {{ + #err + #(#diag_tokens)* + }}; + } }; - quote!({ + let diag_tokens = diagnostics.into_iter().map(Diagnostic::emit_as_expr_tokens); + + let output_ident = Ident::new("__maud_output", Span::mixed_site()); + let stmts = generate::generate(markups, output_ident.clone()); + + let found_crate = crate_name("pagetop").expect("pagetop must be in Cargo.toml"); + let crate_ident = match found_crate { + FoundCrate::Itself => Ident::new("pagetop", Span::call_site()), + FoundCrate::Name(ref name) => Ident::new(name, Span::call_site()), + }; + let pre_escaped = quote! { + #crate_ident::html::PreEscaped(#output_ident) + }; + + quote! {{ extern crate alloc; let mut #output_ident = alloc::string::String::with_capacity(#size_hint); #stmts + #(#diag_tokens)* #pre_escaped - }) + }} } diff --git a/helpers/pagetop-macros/src/maud/ast.rs b/helpers/pagetop-macros/src/maud/ast.rs index cd8a2cef..fd499ae2 100644 --- a/helpers/pagetop-macros/src/maud/ast.rs +++ b/helpers/pagetop-macros/src/maud/ast.rs @@ -1,221 +1,1105 @@ -use proc_macro2::{TokenStream, TokenTree}; -use proc_macro_error::SpanRange; +use std::fmt::{self, Display, Formatter}; -#[derive(Debug)] -pub enum Markup { - /// Used as a placeholder value on parse error. - ParseError { - span: SpanRange, - }, - Block(Block), - Literal { - content: String, - span: SpanRange, - }, - Symbol { - symbol: TokenStream, - }, - Splice { - expr: TokenStream, - outer_span: SpanRange, - }, - Element { - name: TokenStream, - attrs: Vec<Attr>, - body: ElementBody, - }, - Let { - at_span: SpanRange, - tokens: TokenStream, - }, - Special { - segments: Vec<Special>, - }, - Match { - at_span: SpanRange, - head: TokenStream, - arms: Vec<MatchArm>, - arms_span: SpanRange, +use proc_macro2::TokenStream; +use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt}; +use quote::ToTokens; +use syn::{ + braced, bracketed, + ext::IdentExt, + parenthesized, + parse::{Lookahead1, Parse, ParseStream}, + punctuated::{Pair, Punctuated}, + spanned::Spanned, + token::{ + At, Brace, Bracket, Colon, Comma, Dot, Else, Eq, FatArrow, For, If, In, Let, Match, Minus, + Paren, Pound, Question, Semi, Slash, While, }, + Error, Expr, Ident, Lit, LitBool, LitInt, LitStr, Local, Pat, Stmt, +}; + +#[derive(Debug, Clone)] +pub struct Markups<E> { + pub markups: Vec<Markup<E>>, } -impl Markup { - pub fn span(&self) -> SpanRange { - match *self { - Markup::ParseError { span } => span, - Markup::Block(ref block) => block.span(), - Markup::Literal { span, .. } => span, - Markup::Symbol { ref symbol } => span_tokens(symbol.clone()), - Markup::Splice { outer_span, .. } => outer_span, - Markup::Element { - ref name, ref body, .. - } => { - let name_span = span_tokens(name.clone()); - name_span.join_range(body.span()) - } - Markup::Let { - at_span, - ref tokens, - } => at_span.join_range(span_tokens(tokens.clone())), - Markup::Special { ref segments } => join_ranges(segments.iter().map(Special::span)), - Markup::Match { - at_span, arms_span, .. - } => at_span.join_range(arms_span), +impl<E: MaybeElement> DiagnosticParse for Markups<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let mut markups = Vec::new(); + while !input.is_empty() { + markups.push(Markup::diagnostic_parse_in_block(input, diagnostics)?) + } + Ok(Self { markups }) + } +} + +impl<E: ToTokens> ToTokens for Markups<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + for markup in &self.markups { + markup.to_tokens(tokens); } } } -#[derive(Debug)] -pub enum Attr { +#[derive(Debug, Clone)] +pub enum Markup<E> { + Block(Block<E>), + Lit(HtmlLit), + Splice { paren_token: Paren, expr: Expr }, + Element(E), + ControlFlow(ControlFlow<E>), + Semi(Semi), +} + +impl<E: MaybeElement> Markup<E> { + pub fn diagnostic_parse_in_block( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + if input.peek(Let) + || input.peek(If) + || input.peek(Else) + || input.peek(For) + || input.peek(While) + || input.peek(Match) + { + let kw = input.call(Ident::parse_any)?; + diagnostics.push( + kw.span() + .error(format!("found keyword `{kw}`")) + .help(format!("should this be `@{kw}`?")), + ); + } + + let lookahead = input.lookahead1(); + + if lookahead.peek(Brace) { + input.diagnostic_parse(diagnostics).map(Self::Block) + } else if lookahead.peek(Lit) { + input.diagnostic_parse(diagnostics).map(Self::Lit) + } else if lookahead.peek(Paren) { + let content; + Ok(Self::Splice { + paren_token: parenthesized!(content in input), + expr: content.parse()?, + }) + } else if let Some(parse_element) = E::should_parse(&lookahead) { + parse_element(input, diagnostics).map(Self::Element) + } else if lookahead.peek(At) { + input.diagnostic_parse(diagnostics).map(Self::ControlFlow) + } else if lookahead.peek(Semi) { + input.parse().map(Self::Semi) + } else { + Err(lookahead.error()) + } + } +} + +impl<E: MaybeElement> DiagnosticParse for Markup<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let markup = Self::diagnostic_parse_in_block(input, diagnostics)?; + + if let Self::ControlFlow(ControlFlow { + kind: ControlFlowKind::Let(_), + .. + }) = &markup + { + diagnostics.push( + markup + .span() + .error("`@let` bindings are only allowed inside blocks"), + ) + } + + Ok(markup) + } +} + +impl<E: ToTokens> ToTokens for Markup<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::Block(block) => block.to_tokens(tokens), + Self::Lit(lit) => lit.to_tokens(tokens), + Self::Splice { paren_token, expr } => { + paren_token.surround(tokens, |tokens| { + expr.to_tokens(tokens); + }); + } + Self::Element(element) => element.to_tokens(tokens), + Self::ControlFlow(control_flow) => control_flow.to_tokens(tokens), + Self::Semi(semi) => semi.to_tokens(tokens), + } + } +} + +/// Represents a context that may or may not allow elements. +/// +/// An attribute accepts almost the same syntax as an element body, except child elements aren't +/// allowed. To enable code reuse, introduce a trait that abstracts over whether an element is +/// allowed or not. +pub trait MaybeElement: Sized + ToTokens { + /// If an element can be parsed here, returns `Some` with a parser for the rest of the element. + fn should_parse(lookahead: &Lookahead1<'_>) -> Option<DiagnosticParseFn<Self>>; +} + +/// An implementation of `DiagnosticParse::diagnostic_parse`. +pub type DiagnosticParseFn<T> = fn(ParseStream, &mut Vec<Diagnostic>) -> syn::Result<T>; + +/// Represents an attribute context, where elements are disallowed. +#[derive(Debug, Clone)] +pub enum NoElement {} + +impl MaybeElement for NoElement { + fn should_parse( + _lookahead: &Lookahead1<'_>, + ) -> Option<fn(ParseStream, &mut Vec<Diagnostic>) -> syn::Result<Self>> { + None + } +} + +impl ToTokens for NoElement { + fn to_tokens(&self, _tokens: &mut TokenStream) { + match *self {} + } +} + +#[derive(Debug, Clone)] +pub struct Element { + pub name: Option<HtmlName>, + pub attrs: Vec<Attribute>, + pub body: ElementBody, +} + +impl From<NoElement> for Element { + fn from(value: NoElement) -> Self { + match value {} + } +} + +impl MaybeElement for Element { + fn should_parse( + lookahead: &Lookahead1<'_>, + ) -> Option<fn(ParseStream, &mut Vec<Diagnostic>) -> syn::Result<Self>> { + if lookahead.peek(Ident::peek_any) || lookahead.peek(Dot) || lookahead.peek(Pound) { + Some(Element::diagnostic_parse) + } else { + None + } + } +} + +impl DiagnosticParse for Element { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Self { + name: if input.peek(Ident::peek_any) { + Some(input.diagnostic_parse(diagnostics)?) + } else { + None + }, + attrs: { + let mut id_pushed = false; + let mut attrs = Vec::new(); + + while input.peek(Ident::peek_any) + || input.peek(Lit) + || input.peek(Dot) + || input.peek(Pound) + { + let attr = input.diagnostic_parse(diagnostics)?; + + if let Attribute::Id { .. } = attr { + if id_pushed { + return Err(Error::new_spanned( + attr, + "duplicate id (`#`) attribute specified", + )); + } + id_pushed = true; + } + + attrs.push(attr); + } + + if !(input.peek(Brace) || input.peek(Semi) || input.peek(Slash)) { + let lookahead = input.lookahead1(); + + lookahead.peek(Ident::peek_any); + lookahead.peek(Lit); + lookahead.peek(Dot); + lookahead.peek(Pound); + + lookahead.peek(Brace); + lookahead.peek(Semi); + + return Err(lookahead.error()); + } + + attrs + }, + body: input.diagnostic_parse(diagnostics)?, + }) + } +} + +impl ToTokens for Element { + fn to_tokens(&self, tokens: &mut TokenStream) { + if let Some(name) = &self.name { + name.to_tokens(tokens); + } + for attr in &self.attrs { + attr.to_tokens(tokens); + } + self.body.to_tokens(tokens); + } +} + +#[derive(Debug, Clone)] +pub enum ElementBody { + Void(Semi), + Block(Block<Element>), +} + +impl DiagnosticParse for ElementBody { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let lookahead = input.lookahead1(); + + if lookahead.peek(Semi) { + input.parse().map(Self::Void) + } else if lookahead.peek(Brace) { + input.diagnostic_parse(diagnostics).map(Self::Block) + } else if lookahead.peek(Slash) { + diagnostics.push( + input + .parse::<Slash>()? + .span() + .error("void elements must use `;`, not `/`") + .help("change this to `;`") + .help("see https://github.com/lambda-fairy/maud/pull/315 for details"), + ); + + Ok(Self::Void(<Semi>::default())) + } else { + Err(lookahead.error()) + } + } +} + +impl ToTokens for ElementBody { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::Void(semi) => semi.to_tokens(tokens), + Self::Block(block) => block.to_tokens(tokens), + } + } +} + +#[derive(Debug, Clone)] +pub struct Block<E> { + pub brace_token: Brace, + pub markups: Markups<E>, +} + +impl<E: MaybeElement> DiagnosticParse for Block<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let content; + Ok(Self { + brace_token: braced!(content in input), + markups: content.diagnostic_parse(diagnostics)?, + }) + } +} + +impl<E: ToTokens> ToTokens for Block<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.brace_token.surround(tokens, |tokens| { + self.markups.to_tokens(tokens); + }); + } +} + +#[derive(Debug, Clone)] +pub enum Attribute { Class { - dot_span: SpanRange, - name: Markup, + dot_token: Dot, + name: HtmlNameOrMarkup, toggler: Option<Toggler>, }, Id { - hash_span: SpanRange, - name: Markup, + pound_token: Pound, + name: HtmlNameOrMarkup, }, Named { - named_attr: NamedAttr, + name: HtmlName, + attr_type: AttributeType, }, } -impl Attr { - pub fn span(&self) -> SpanRange { - match *self { - Attr::Class { - dot_span, - ref name, - ref toggler, +impl DiagnosticParse for Attribute { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let lookahead = input.lookahead1(); + + if lookahead.peek(Dot) { + Ok(Self::Class { + dot_token: input.parse()?, + name: input.diagnostic_parse(diagnostics)?, + toggler: { + let lookahead = input.lookahead1(); + + if lookahead.peek(Bracket) { + Some(input.diagnostic_parse(diagnostics)?) + } else { + None + } + }, + }) + } else if lookahead.peek(Pound) { + Ok(Self::Id { + pound_token: input.parse()?, + name: input.diagnostic_parse(diagnostics)?, + }) + } else { + let name = input.diagnostic_parse::<HtmlName>(diagnostics)?; + + if input.peek(Question) { + input.parse::<Question>()?; + } + + let fork = input.fork(); + + let attr = Self::Named { + name: name.clone(), + attr_type: input.diagnostic_parse(diagnostics)?, + }; + + if fork.peek(Eq) && fork.peek2(LitBool) { + diagnostics.push( + attr.span() + .error("attribute value must be a string") + .help(format!("to declare an empty attribute, omit the equals sign: `{name}`")) + .help(format!("to toggle the attribute, use square brackets: `{name}[some_boolean_flag]`")) + ); + } + + Ok(attr) + } + } +} + +impl ToTokens for Attribute { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::Class { + dot_token, + name, + toggler, } => { - let name_span = name.span(); - let dot_name_span = dot_span.join_range(name_span); + dot_token.to_tokens(tokens); + name.to_tokens(tokens); if let Some(toggler) = toggler { - dot_name_span.join_range(toggler.cond_span) - } else { - dot_name_span + toggler.to_tokens(tokens); } } - Attr::Id { - hash_span, - ref name, - } => { - let name_span = name.span(); - hash_span.join_range(name_span) + Self::Id { pound_token, name } => { + pound_token.to_tokens(tokens); + name.to_tokens(tokens); + } + Self::Named { name, attr_type } => { + name.to_tokens(tokens); + attr_type.to_tokens(tokens); } - Attr::Named { ref named_attr } => named_attr.span(), } } } -#[derive(Debug)] -pub enum ElementBody { - Void { semi_span: SpanRange }, - Block { block: Block }, +#[derive(Debug, Clone)] +pub enum HtmlNameOrMarkup { + HtmlName(HtmlName), + Markup(Markup<NoElement>), } -impl ElementBody { - pub fn span(&self) -> SpanRange { - match *self { - ElementBody::Void { semi_span } => semi_span, - ElementBody::Block { ref block } => block.span(), - } - } -} - -#[derive(Debug)] -pub struct Block { - pub markups: Vec<Markup>, - pub outer_span: SpanRange, -} - -impl Block { - pub fn span(&self) -> SpanRange { - self.outer_span - } -} - -#[derive(Debug)] -pub struct Special { - pub at_span: SpanRange, - pub head: TokenStream, - pub body: Block, -} - -impl Special { - pub fn span(&self) -> SpanRange { - let body_span = self.body.span(); - self.at_span.join_range(body_span) - } -} - -#[derive(Debug)] -pub struct NamedAttr { - pub name: TokenStream, - pub attr_type: AttrType, -} - -impl NamedAttr { - fn span(&self) -> SpanRange { - let name_span = span_tokens(self.name.clone()); - if let Some(attr_type_span) = self.attr_type.span() { - name_span.join_range(attr_type_span) +impl DiagnosticParse for HtmlNameOrMarkup { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + if input.peek(Ident::peek_any) || input.peek(Lit) { + input.diagnostic_parse(diagnostics).map(Self::HtmlName) } else { - name_span + input.diagnostic_parse(diagnostics).map(Self::Markup) } } } -#[derive(Debug)] -pub enum AttrType { - Normal { value: Markup }, - Optional { toggler: Toggler }, - Empty { toggler: Option<Toggler> }, +impl Parse for HtmlNameOrMarkup { + fn parse(input: ParseStream) -> syn::Result<Self> { + Self::diagnostic_parse(input, &mut Vec::new()) + } } -impl AttrType { - fn span(&self) -> Option<SpanRange> { - match *self { - AttrType::Normal { ref value } => Some(value.span()), - AttrType::Optional { ref toggler } => Some(toggler.span()), - AttrType::Empty { ref toggler } => toggler.as_ref().map(Toggler::span), +impl ToTokens for HtmlNameOrMarkup { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::HtmlName(name) => name.to_tokens(tokens), + Self::Markup(markup) => markup.to_tokens(tokens), } } } -#[derive(Debug)] +impl Display for HtmlNameOrMarkup { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + match self { + Self::HtmlName(name) => name.fmt(f), + Self::Markup(markup) => markup.to_token_stream().fmt(f), + } + } +} + +#[derive(Debug, Clone)] +pub enum AttributeType { + Normal { + eq_token: Eq, + value: Markup<NoElement>, + }, + Optional { + eq_token: Eq, + toggler: Toggler, + }, + Empty(Option<Toggler>), +} + +impl DiagnosticParse for AttributeType { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let lookahead = input.lookahead1(); + + if lookahead.peek(Eq) { + let eq_token = input.parse()?; + + if input.peek(Bracket) { + Ok(Self::Optional { + eq_token, + toggler: input.diagnostic_parse(diagnostics)?, + }) + } else { + Ok(Self::Normal { + eq_token, + value: input.diagnostic_parse(diagnostics)?, + }) + } + } else if lookahead.peek(Bracket) { + Ok(Self::Empty(Some(input.diagnostic_parse(diagnostics)?))) + } else { + Ok(Self::Empty(None)) + } + } +} + +impl ToTokens for AttributeType { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::Normal { eq_token, value } => { + eq_token.to_tokens(tokens); + value.to_tokens(tokens); + } + Self::Optional { eq_token, toggler } => { + eq_token.to_tokens(tokens); + toggler.to_tokens(tokens); + } + Self::Empty(toggler) => { + if let Some(toggler) = toggler { + toggler.to_tokens(tokens); + } + } + } + } +} + +#[derive(Debug, Clone)] +pub struct HtmlName { + pub name: Punctuated<HtmlNameFragment, HtmlNamePunct>, +} + +impl DiagnosticParse for HtmlName { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Self { + name: { + let mut punctuated = Punctuated::new(); + + loop { + punctuated.push_value(input.diagnostic_parse(diagnostics)?); + + if !(input.peek(Minus) || input.peek(Colon)) { + break; + } + + let punct = input.diagnostic_parse(diagnostics)?; + punctuated.push_punct(punct); + } + + punctuated + }, + }) + } +} + +impl Parse for HtmlName { + fn parse(input: ParseStream) -> syn::Result<Self> { + Self::diagnostic_parse(input, &mut Vec::new()) + } +} + +impl ToTokens for HtmlName { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.name.to_tokens(tokens); + } +} + +impl Display for HtmlName { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + for pair in self.name.pairs() { + match pair { + Pair::Punctuated(fragment, punct) => { + fragment.fmt(f)?; + punct.fmt(f)?; + } + Pair::End(fragment) => { + fragment.fmt(f)?; + } + } + } + + Ok(()) + } +} + +#[derive(Debug, Clone)] +pub enum HtmlNameFragment { + Ident(Ident), + LitInt(LitInt), + LitStr(LitStr), + Empty, +} + +impl DiagnosticParse for HtmlNameFragment { + fn diagnostic_parse( + input: ParseStream, + _diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let lookahead = input.lookahead1(); + + if lookahead.peek(Ident::peek_any) { + input.call(Ident::parse_any).map(Self::Ident) + } else if lookahead.peek(LitInt) { + input.parse().map(Self::LitInt) + } else if lookahead.peek(LitStr) { + input.parse().map(Self::LitStr) + } else if lookahead.peek(Minus) || lookahead.peek(Colon) { + Ok(Self::Empty) + } else { + Err(lookahead.error()) + } + } +} + +impl ToTokens for HtmlNameFragment { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::Ident(ident) => ident.to_tokens(tokens), + Self::LitInt(lit) => lit.to_tokens(tokens), + Self::LitStr(lit) => lit.to_tokens(tokens), + Self::Empty => {} + } + } +} + +impl Display for HtmlNameFragment { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + match self { + Self::Ident(ident) => ident.fmt(f), + Self::LitInt(lit) => lit.fmt(f), + Self::LitStr(lit) => lit.value().fmt(f), + Self::Empty => Ok(()), + } + } +} + +#[derive(Debug, Clone)] +pub struct HtmlLit { + pub lit: LitStr, +} + +impl DiagnosticParse for HtmlLit { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let lookahead = input.lookahead1(); + + if lookahead.peek(Lit) { + let lit = input.parse()?; + match lit { + Lit::Str(lit) => Ok(Self { lit }), + Lit::Int(lit) => { + diagnostics.push( + lit.span() + .error(format!(r#"literal must be double-quoted: `"{lit}"`"#)), + ); + Ok(Self { + lit: LitStr::new("", lit.span()), + }) + } + Lit::Float(lit) => { + diagnostics.push( + lit.span() + .error(format!(r#"literal must be double-quoted: `"{lit}"`"#)), + ); + Ok(Self { + lit: LitStr::new("", lit.span()), + }) + } + Lit::Char(lit) => { + diagnostics.push(lit.span().error(format!( + r#"literal must be double-quoted: `"{}"`"#, + lit.value() + ))); + Ok(Self { + lit: LitStr::new("", lit.span()), + }) + } + Lit::Bool(_) => { + // diagnostic handled earlier with more information + Ok(Self { + lit: LitStr::new("", lit.span()), + }) + } + _ => { + diagnostics.push(lit.span().error("expected string")); + Ok(Self { + lit: LitStr::new("", lit.span()), + }) + } + } + } else { + Err(lookahead.error()) + } + } +} + +impl ToTokens for HtmlLit { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.lit.to_tokens(tokens); + } +} + +impl Display for HtmlLit { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + self.lit.value().fmt(f) + } +} + +#[derive(Debug, Clone)] +pub enum HtmlNamePunct { + Colon(Colon), + Hyphen(Minus), +} + +impl DiagnosticParse for HtmlNamePunct { + fn diagnostic_parse(input: ParseStream, _: &mut Vec<Diagnostic>) -> syn::Result<Self> { + let lookahead = input.lookahead1(); + + if lookahead.peek(Colon) { + input.parse().map(Self::Colon) + } else if lookahead.peek(Minus) { + input.parse().map(Self::Hyphen) + } else { + Err(lookahead.error()) + } + } +} + +impl ToTokens for HtmlNamePunct { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::Colon(token) => token.to_tokens(tokens), + Self::Hyphen(token) => token.to_tokens(tokens), + } + } +} + +impl Display for HtmlNamePunct { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + match self { + Self::Colon(_) => f.write_str(":"), + Self::Hyphen(_) => f.write_str("-"), + } + } +} + +#[derive(Debug, Clone)] pub struct Toggler { - pub cond: TokenStream, - pub cond_span: SpanRange, + pub bracket_token: Bracket, + pub cond: Expr, } -impl Toggler { - fn span(&self) -> SpanRange { - self.cond_span +impl DiagnosticParse for Toggler { + fn diagnostic_parse(input: ParseStream, _: &mut Vec<Diagnostic>) -> syn::Result<Self> { + let content; + Ok(Self { + bracket_token: bracketed!(content in input), + cond: content.parse()?, + }) } } -#[derive(Debug)] -pub struct MatchArm { - pub head: TokenStream, - pub body: Block, +impl ToTokens for Toggler { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.bracket_token.surround(tokens, |tokens| { + self.cond.to_tokens(tokens); + }); + } } -pub fn span_tokens<I: IntoIterator<Item = TokenTree>>(tokens: I) -> SpanRange { - join_ranges(tokens.into_iter().map(|s| SpanRange::single_span(s.span()))) +#[derive(Debug, Clone)] +pub struct ControlFlow<E> { + pub at_token: At, + pub kind: ControlFlowKind<E>, } -pub fn join_ranges<I: IntoIterator<Item = SpanRange>>(ranges: I) -> SpanRange { - let mut iter = ranges.into_iter(); - let first = match iter.next() { - Some(span) => span, - None => return SpanRange::call_site(), - }; - let last = iter.last().unwrap_or(first); - first.join_range(last) +impl<E: MaybeElement> DiagnosticParse for ControlFlow<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Self { + at_token: input.parse()?, + kind: { + let lookahead = input.lookahead1(); + + if lookahead.peek(If) { + ControlFlowKind::If(input.diagnostic_parse(diagnostics)?) + } else if lookahead.peek(For) { + ControlFlowKind::For(input.diagnostic_parse(diagnostics)?) + } else if lookahead.peek(While) { + ControlFlowKind::While(input.diagnostic_parse(diagnostics)?) + } else if lookahead.peek(Match) { + ControlFlowKind::Match(input.diagnostic_parse(diagnostics)?) + } else if lookahead.peek(Let) { + let Stmt::Local(local) = input.parse()? else { + unreachable!() + }; + + ControlFlowKind::Let(local) + } else { + return Err(lookahead.error()); + } + }, + }) + } } -pub fn name_to_string(name: TokenStream) -> String { - name.into_iter().map(|token| token.to_string()).collect() +impl<E: ToTokens> ToTokens for ControlFlow<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.at_token.to_tokens(tokens); + match &self.kind { + ControlFlowKind::Let(local) => local.to_tokens(tokens), + ControlFlowKind::If(if_) => if_.to_tokens(tokens), + ControlFlowKind::For(for_) => for_.to_tokens(tokens), + ControlFlowKind::While(while_) => while_.to_tokens(tokens), + ControlFlowKind::Match(match_) => match_.to_tokens(tokens), + } + } +} + +#[derive(Debug, Clone)] +pub enum ControlFlowKind<E> { + Let(Local), + If(IfExpr<E>), + For(ForExpr<E>), + While(WhileExpr<E>), + Match(MatchExpr<E>), +} + +#[derive(Debug, Clone)] +pub struct IfExpr<E> { + pub if_token: If, + pub cond: Expr, + pub then_branch: Block<E>, + pub else_branch: Option<(At, Else, Box<IfOrBlock<E>>)>, +} + +impl<E: MaybeElement> DiagnosticParse for IfExpr<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Self { + if_token: input.parse()?, + cond: input.call(Expr::parse_without_eager_brace)?, + then_branch: input.diagnostic_parse(diagnostics)?, + else_branch: { + if input.peek(At) && input.peek2(Else) { + Some(( + input.parse()?, + input.parse()?, + input.diagnostic_parse(diagnostics)?, + )) + } else { + None + } + }, + }) + } +} + +impl<E: ToTokens> ToTokens for IfExpr<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.if_token.to_tokens(tokens); + self.cond.to_tokens(tokens); + self.then_branch.to_tokens(tokens); + if let Some((at_token, else_token, else_branch)) = &self.else_branch { + at_token.to_tokens(tokens); + else_token.to_tokens(tokens); + else_branch.to_tokens(tokens); + } + } +} + +#[derive(Debug, Clone)] +pub enum IfOrBlock<E> { + If(IfExpr<E>), + Block(Block<E>), +} + +impl<E: MaybeElement> DiagnosticParse for IfOrBlock<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let lookahead = input.lookahead1(); + + if lookahead.peek(If) { + input.diagnostic_parse(diagnostics).map(Self::If) + } else if lookahead.peek(Brace) { + input.diagnostic_parse(diagnostics).map(Self::Block) + } else { + Err(lookahead.error()) + } + } +} + +impl<E: ToTokens> ToTokens for IfOrBlock<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + match self { + Self::If(if_) => if_.to_tokens(tokens), + Self::Block(block) => block.to_tokens(tokens), + } + } +} + +#[derive(Debug, Clone)] +pub struct ForExpr<E> { + pub for_token: For, + pub pat: Pat, + pub in_token: In, + pub expr: Expr, + pub body: Block<E>, +} + +impl<E: MaybeElement> DiagnosticParse for ForExpr<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Self { + for_token: input.parse()?, + pat: input.call(Pat::parse_multi_with_leading_vert)?, + in_token: input.parse()?, + expr: input.call(Expr::parse_without_eager_brace)?, + body: input.diagnostic_parse(diagnostics)?, + }) + } +} + +impl<E: ToTokens> ToTokens for ForExpr<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.for_token.to_tokens(tokens); + self.pat.to_tokens(tokens); + self.in_token.to_tokens(tokens); + self.expr.to_tokens(tokens); + self.body.to_tokens(tokens); + } +} + +#[derive(Debug, Clone)] +pub struct WhileExpr<E> { + pub while_token: While, + pub cond: Expr, + pub body: Block<E>, +} + +impl<E: MaybeElement> DiagnosticParse for WhileExpr<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Self { + while_token: input.parse()?, + cond: input.call(Expr::parse_without_eager_brace)?, + body: input.diagnostic_parse(diagnostics)?, + }) + } +} + +impl<E: ToTokens> ToTokens for WhileExpr<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.while_token.to_tokens(tokens); + self.cond.to_tokens(tokens); + self.body.to_tokens(tokens); + } +} + +#[derive(Debug, Clone)] +pub struct MatchExpr<E> { + pub match_token: Match, + pub expr: Expr, + pub brace_token: Brace, + pub arms: Vec<MatchArm<E>>, +} + +impl<E: MaybeElement> DiagnosticParse for MatchExpr<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + let match_token = input.parse()?; + let expr = input.call(Expr::parse_without_eager_brace)?; + + let content; + let brace_token = braced!(content in input); + + let mut arms = Vec::new(); + while !content.is_empty() { + arms.push(content.diagnostic_parse(diagnostics)?); + } + + Ok(Self { + match_token, + expr, + brace_token, + arms, + }) + } +} + +impl<E: ToTokens> ToTokens for MatchExpr<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.match_token.to_tokens(tokens); + self.expr.to_tokens(tokens); + self.brace_token.surround(tokens, |tokens| { + for arm in &self.arms { + arm.to_tokens(tokens); + } + }); + } +} + +#[derive(Debug, Clone)] +pub struct MatchArm<E> { + pub pat: Pat, + pub guard: Option<(If, Expr)>, + pub fat_arrow_token: FatArrow, + pub body: Markup<E>, + pub comma_token: Option<Comma>, +} + +impl<E: MaybeElement> DiagnosticParse for MatchArm<E> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Self { + pat: Pat::parse_multi_with_leading_vert(input)?, + guard: { + if input.peek(If) { + Some((input.parse()?, input.parse()?)) + } else { + None + } + }, + fat_arrow_token: input.parse()?, + body: Markup::diagnostic_parse_in_block(input, diagnostics)?, + comma_token: if input.peek(Comma) { + Some(input.parse()?) + } else { + None + }, + }) + } +} + +impl<E: ToTokens> ToTokens for MatchArm<E> { + fn to_tokens(&self, tokens: &mut TokenStream) { + self.pat.to_tokens(tokens); + if let Some((if_token, guard)) = &self.guard { + if_token.to_tokens(tokens); + guard.to_tokens(tokens); + } + self.fat_arrow_token.to_tokens(tokens); + self.body.to_tokens(tokens); + if let Some(comma_token) = &self.comma_token { + comma_token.to_tokens(tokens); + } + } +} + +pub trait DiagnosticParse: Sized { + fn diagnostic_parse(input: ParseStream, diagnostics: &mut Vec<Diagnostic>) + -> syn::Result<Self>; +} + +impl<T: DiagnosticParse> DiagnosticParse for Box<T> { + fn diagnostic_parse( + input: ParseStream, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<Self> { + Ok(Box::new(input.diagnostic_parse(diagnostics)?)) + } +} + +trait DiagonsticParseExt: Sized { + fn diagnostic_parse<T: DiagnosticParse>( + self, + diagnostics: &mut Vec<Diagnostic>, + ) -> syn::Result<T>; +} + +impl DiagonsticParseExt for ParseStream<'_> { + fn diagnostic_parse<T>(self, diagnostics: &mut Vec<Diagnostic>) -> syn::Result<T> + where + T: DiagnosticParse, + { + T::diagnostic_parse(self, diagnostics) + } } diff --git a/helpers/pagetop-macros/src/maud/escape.rs b/helpers/pagetop-macros/src/maud/escape.rs index 49ece776..786d8c77 100644 --- a/helpers/pagetop-macros/src/maud/escape.rs +++ b/helpers/pagetop-macros/src/maud/escape.rs @@ -2,10 +2,6 @@ // !!!!!!!! PLEASE KEEP THIS IN SYNC WITH `maud/src/escape.rs` !!!!!!!!! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -extern crate alloc; - -use alloc::string::String; - pub fn escape_to_string(input: &str, output: &mut String) { for b in input.bytes() { match b { @@ -20,10 +16,7 @@ pub fn escape_to_string(input: &str, output: &mut String) { #[cfg(test)] mod test { - extern crate alloc; - use super::escape_to_string; - use alloc::string::String; #[test] fn it_works() { diff --git a/helpers/pagetop-macros/src/maud/generate.rs b/helpers/pagetop-macros/src/maud/generate.rs index be7946d0..1f825783 100644 --- a/helpers/pagetop-macros/src/maud/generate.rs +++ b/helpers/pagetop-macros/src/maud/generate.rs @@ -1,23 +1,23 @@ -use proc_macro2::{Delimiter, Group, Ident, Literal, Span, TokenStream, TokenTree}; -use proc_macro_error::SpanRange; -use quote::quote; +use proc_macro2::{Ident, Span, TokenStream}; +use quote::{quote, ToTokens}; +use syn::{parse_quote, token::Brace, Expr, Local}; use crate::maud::{ast::*, escape}; use proc_macro_crate::{crate_name, FoundCrate}; -pub fn generate(markups: Vec<Markup>, output_ident: TokenTree) -> TokenStream { +pub fn generate(markups: Markups<Element>, output_ident: Ident) -> TokenStream { let mut build = Builder::new(output_ident.clone()); Generator::new(output_ident).markups(markups, &mut build); build.finish() } struct Generator { - output_ident: TokenTree, + output_ident: Ident, } impl Generator { - fn new(output_ident: TokenTree) -> Generator { + fn new(output_ident: Ident) -> Generator { Generator { output_ident } } @@ -25,257 +25,341 @@ impl Generator { Builder::new(self.output_ident.clone()) } - fn markups(&self, markups: Vec<Markup>, build: &mut Builder) { - for markup in markups { + fn markups<E: Into<Element>>(&self, markups: Markups<E>, build: &mut Builder) { + for markup in markups.markups { self.markup(markup, build); } } - fn markup(&self, markup: Markup, build: &mut Builder) { + fn markup<E: Into<Element>>(&self, markup: Markup<E>, build: &mut Builder) { match markup { - Markup::ParseError { .. } => {} - Markup::Block(Block { - markups, - outer_span, - }) => { - if markups - .iter() - .any(|markup| matches!(*markup, Markup::Let { .. })) - { - self.block( - Block { - markups, - outer_span, - }, - build, - ); + Markup::Block(block) => { + if block.markups.markups.iter().any(|markup| { + matches!( + *markup, + Markup::ControlFlow(ControlFlow { + kind: ControlFlowKind::Let(_), + .. + }) + ) + }) { + self.block(block, build); } else { - self.markups(markups, build); + self.markups(block.markups, build); } } - Markup::Literal { content, .. } => build.push_escaped(&content), - Markup::Symbol { symbol } => self.name(symbol, build), + Markup::Lit(lit) => build.push_escaped(&lit.to_string()), Markup::Splice { expr, .. } => self.splice(expr, build), - Markup::Element { name, attrs, body } => self.element(name, attrs, body, build), - Markup::Let { tokens, .. } => build.push_tokens(tokens), - Markup::Special { segments } => { - for Special { head, body, .. } in segments { - build.push_tokens(head); - self.block(body, build); - } - } - Markup::Match { - head, - arms, - arms_span, - .. - } => { - let body = { - let mut build = self.builder(); - for MatchArm { head, body } in arms { - build.push_tokens(head); - self.block(body, &mut build); - } - build.finish() - }; - let mut body = TokenTree::Group(Group::new(Delimiter::Brace, body)); - body.set_span(arms_span.collapse()); - build.push_tokens(quote!(#head #body)); - } + Markup::Element(element) => self.element(element.into(), build), + Markup::ControlFlow(control_flow) => self.control_flow(control_flow, build), + Markup::Semi(_) => {} } } - fn block( - &self, - Block { - markups, - outer_span, - }: Block, - build: &mut Builder, - ) { - let block = { + fn block<E: Into<Element>>(&self, block: Block<E>, build: &mut Builder) { + let markups = { let mut build = self.builder(); - self.markups(markups, &mut build); + self.markups(block.markups, &mut build); build.finish() }; - let mut block = TokenTree::Group(Group::new(Delimiter::Brace, block)); - block.set_span(outer_span.collapse()); - build.push_tokens(TokenStream::from(block)); + + build.push_tokens(quote!({ #markups })); } - fn splice(&self, expr: TokenStream, build: &mut Builder) { - let output_ident = self.output_ident.clone(); + fn splice(&self, expr: Expr, build: &mut Builder) { + let output_ident = &self.output_ident; - let found_crate = crate_name("pagetop").expect("pagetop is present in `Cargo.toml`"); - build.push_tokens(match found_crate { - FoundCrate::Itself => quote!( - crate::html::html_private::render_to!(&#expr, &mut #output_ident); - ), - _ => quote!( - pagetop::html::html_private::render_to!(&#expr, &mut #output_ident); - ), + let found_crate = crate_name("pagetop").expect("pagetop debe existir en Cargo.toml"); + let crate_ident = match found_crate { + FoundCrate::Itself => Ident::new("pagetop", Span::call_site()), + FoundCrate::Name(name) => Ident::new(&name, Span::call_site()), + }; + build.push_tokens(quote! { + #crate_ident::html::html_private::render_to!(&(#expr), &mut #output_ident); }); } - fn element(&self, name: TokenStream, attrs: Vec<Attr>, body: ElementBody, build: &mut Builder) { + fn element(&self, element: Element, build: &mut Builder) { + let element_name = element.name.clone().unwrap_or_else(|| parse_quote!(div)); build.push_str("<"); - self.name(name.clone(), build); - self.attrs(attrs, build); + self.name(element_name.clone(), build); + self.attrs(element.attrs, build); build.push_str(">"); - if let ElementBody::Block { block } = body { + if let ElementBody::Block(block) = element.body { self.markups(block.markups, build); build.push_str("</"); - self.name(name, build); + self.name(element_name, build); build.push_str(">"); } } - fn name(&self, name: TokenStream, build: &mut Builder) { - build.push_escaped(&name_to_string(name)); + fn name(&self, name: HtmlName, build: &mut Builder) { + build.push_escaped(&name.to_string()); } - fn attrs(&self, attrs: Vec<Attr>, build: &mut Builder) { - for NamedAttr { name, attr_type } in desugar_attrs(attrs) { - match attr_type { - AttrType::Normal { value } => { + fn name_or_markup(&self, name: HtmlNameOrMarkup, build: &mut Builder) { + match name { + HtmlNameOrMarkup::HtmlName(name) => self.name(name, build), + HtmlNameOrMarkup::Markup(markup) => self.markup(markup, build), + } + } + + fn attr(&self, name: HtmlName, value: AttributeType, build: &mut Builder) { + match value { + AttributeType::Normal { value, .. } => { + build.push_str(" "); + self.name(name, build); + build.push_str("=\""); + self.markup(value, build); + build.push_str("\""); + } + AttributeType::Optional { + toggler: Toggler { cond, .. }, + .. + } => { + let inner_value: Expr = parse_quote!(inner_value); + + let body = { + let mut build = self.builder(); build.push_str(" "); - self.name(name, build); + self.name(name, &mut build); build.push_str("=\""); - self.markup(value, build); + self.splice(inner_value.clone(), &mut build); build.push_str("\""); - } - AttrType::Optional { - toggler: Toggler { cond, .. }, - } => { - let inner_value = quote!(inner_value); - let body = { - let mut build = self.builder(); - build.push_str(" "); - self.name(name, &mut build); - build.push_str("=\""); - self.splice(inner_value.clone(), &mut build); - build.push_str("\""); - build.finish() - }; - build.push_tokens(quote!(if let Some(#inner_value) = (#cond) { #body })); - } - AttrType::Empty { toggler: None } => { + build.finish() + }; + build.push_tokens(quote!(if let Some(#inner_value) = (#cond) { #body })); + } + AttributeType::Empty(None) => { + build.push_str(" "); + self.name(name, build); + } + AttributeType::Empty(Some(Toggler { cond, .. })) => { + let body = { + let mut build = self.builder(); build.push_str(" "); - self.name(name, build); - } - AttrType::Empty { - toggler: Some(Toggler { cond, .. }), - } => { - let body = { - let mut build = self.builder(); - build.push_str(" "); - self.name(name, &mut build); - build.finish() - }; - build.push_tokens(quote!(if (#cond) { #body })); - } + self.name(name, &mut build); + build.finish() + }; + build.push_tokens(quote!(if (#cond) { #body })); } } } + + fn attrs(&self, attrs: Vec<Attribute>, build: &mut Builder) { + let (classes, id, named_attrs) = split_attrs(attrs); + + if !classes.is_empty() { + let mut toggle_class_exprs = vec![]; + + build.push_str(" "); + self.name(parse_quote!(class), build); + build.push_str("=\""); + for (i, (name, toggler)) in classes.into_iter().enumerate() { + if let Some(toggler) = toggler { + toggle_class_exprs.push((i > 0, name, toggler)); + } else { + if i > 0 { + build.push_str(" "); + } + self.name_or_markup(name, build); + } + } + + for (not_first, name, toggler) in toggle_class_exprs { + let body = { + let mut build = self.builder(); + if not_first { + build.push_str(" "); + } + self.name_or_markup(name, &mut build); + build.finish() + }; + build.push_tokens(quote!(if (#toggler) { #body })); + } + + build.push_str("\""); + } + + if let Some(id) = id { + build.push_str(" "); + self.name(parse_quote!(id), build); + build.push_str("=\""); + self.name_or_markup(id, build); + build.push_str("\""); + } + + for (name, attr_type) in named_attrs { + self.attr(name, attr_type, build); + } + } + + fn control_flow<E: Into<Element>>(&self, control_flow: ControlFlow<E>, build: &mut Builder) { + match control_flow.kind { + ControlFlowKind::If(if_) => self.control_flow_if(if_, build), + ControlFlowKind::Let(let_) => self.control_flow_let(let_, build), + ControlFlowKind::For(for_) => self.control_flow_for(for_, build), + ControlFlowKind::While(while_) => self.control_flow_while(while_, build), + ControlFlowKind::Match(match_) => self.control_flow_match(match_, build), + } + } + + fn control_flow_if<E: Into<Element>>( + &self, + IfExpr { + if_token, + cond, + then_branch, + else_branch, + }: IfExpr<E>, + build: &mut Builder, + ) { + build.push_tokens(quote!(#if_token #cond)); + self.block(then_branch, build); + + if let Some((_, else_token, if_or_block)) = else_branch { + build.push_tokens(quote!(#else_token)); + self.control_flow_if_or_block(*if_or_block, build); + } + } + + fn control_flow_if_or_block<E: Into<Element>>( + &self, + if_or_block: IfOrBlock<E>, + build: &mut Builder, + ) { + match if_or_block { + IfOrBlock::If(if_) => self.control_flow_if(if_, build), + IfOrBlock::Block(block) => self.block(block, build), + } + } + + fn control_flow_let(&self, let_: Local, build: &mut Builder) { + build.push_tokens(let_.to_token_stream()); + } + + fn control_flow_for<E: Into<Element>>( + &self, + ForExpr { + for_token, + pat, + in_token, + expr, + body, + }: ForExpr<E>, + build: &mut Builder, + ) { + build.push_tokens(quote!(#for_token #pat #in_token (#expr))); + self.block(body, build); + } + + fn control_flow_while<E: Into<Element>>( + &self, + WhileExpr { + while_token, + cond, + body, + }: WhileExpr<E>, + build: &mut Builder, + ) { + build.push_tokens(quote!(#while_token #cond)); + self.block(body, build); + } + + fn control_flow_match<E: Into<Element>>( + &self, + MatchExpr { + match_token, + expr, + brace_token, + arms, + }: MatchExpr<E>, + build: &mut Builder, + ) { + let arms = { + let mut build = self.builder(); + for MatchArm { + pat, + guard, + fat_arrow_token, + body, + comma_token, + } in arms + { + build.push_tokens(quote!(#pat)); + if let Some((if_token, cond)) = guard { + build.push_tokens(quote!(#if_token #cond)); + } + build.push_tokens(quote!(#fat_arrow_token)); + self.block( + Block { + brace_token: Brace(Span::call_site()), + markups: Markups { + markups: vec![body], + }, + }, + &mut build, + ); + build.push_tokens(quote!(#comma_token)); + } + build.finish() + }; + + let mut arm_block = TokenStream::new(); + + brace_token.surround(&mut arm_block, |tokens| { + arms.to_tokens(tokens); + }); + + build.push_tokens(quote!(#match_token #expr #arm_block)); + } } //////////////////////////////////////////////////////// -fn desugar_attrs(attrs: Vec<Attr>) -> Vec<NamedAttr> { - let mut classes_static = vec![]; - let mut classes_toggled = vec![]; - let mut ids = vec![]; +#[allow(clippy::type_complexity)] +fn split_attrs( + attrs: Vec<Attribute>, +) -> ( + Vec<(HtmlNameOrMarkup, Option<Expr>)>, + Option<HtmlNameOrMarkup>, + Vec<(HtmlName, AttributeType)>, +) { + let mut classes = vec![]; + let mut id = None; let mut named_attrs = vec![]; + for attr in attrs { match attr { - Attr::Class { - name, - toggler: Some(toggler), - .. - } => classes_toggled.push((name, toggler)), - Attr::Class { - name, - toggler: None, - .. - } => classes_static.push(name), - Attr::Id { name, .. } => ids.push(name), - Attr::Named { named_attr } => named_attrs.push(named_attr), + Attribute::Class { name, toggler, .. } => { + classes.push((name, toggler.map(|toggler| toggler.cond))) + } + Attribute::Id { name, .. } => id = Some(name), + Attribute::Named { name, attr_type } => named_attrs.push((name, attr_type)), } } - let classes = desugar_classes_or_ids("class", classes_static, classes_toggled); - let ids = desugar_classes_or_ids("id", ids, vec![]); - classes.into_iter().chain(ids).chain(named_attrs).collect() -} -fn desugar_classes_or_ids( - attr_name: &'static str, - values_static: Vec<Markup>, - values_toggled: Vec<(Markup, Toggler)>, -) -> Option<NamedAttr> { - if values_static.is_empty() && values_toggled.is_empty() { - return None; - } - let mut markups = Vec::new(); - let mut leading_space = false; - for name in values_static { - markups.extend(prepend_leading_space(name, &mut leading_space)); - } - for (name, Toggler { cond, cond_span }) in values_toggled { - let body = Block { - markups: prepend_leading_space(name, &mut leading_space), - // TODO: is this correct? - outer_span: cond_span, - }; - markups.push(Markup::Special { - segments: vec![Special { - at_span: SpanRange::call_site(), - head: quote!(if (#cond)), - body, - }], - }); - } - Some(NamedAttr { - name: TokenStream::from(TokenTree::Ident(Ident::new(attr_name, Span::call_site()))), - attr_type: AttrType::Normal { - value: Markup::Block(Block { - markups, - outer_span: SpanRange::call_site(), - }), - }, - }) -} - -fn prepend_leading_space(name: Markup, leading_space: &mut bool) -> Vec<Markup> { - let mut markups = Vec::new(); - if *leading_space { - markups.push(Markup::Literal { - content: " ".to_owned(), - span: name.span(), - }); - } - *leading_space = true; - markups.push(name); - markups + (classes, id, named_attrs) } //////////////////////////////////////////////////////// struct Builder { - output_ident: TokenTree, - tokens: Vec<TokenTree>, + output_ident: Ident, + tokens: TokenStream, tail: String, } impl Builder { - fn new(output_ident: TokenTree) -> Builder { + fn new(output_ident: Ident) -> Builder { Builder { output_ident, - tokens: Vec::new(), + tokens: TokenStream::new(), tail: String::new(), } } - fn push_str(&mut self, string: &str) { + fn push_str(&mut self, string: &'static str) { self.tail.push_str(string); } @@ -294,8 +378,8 @@ impl Builder { } let push_str_expr = { let output_ident = self.output_ident.clone(); - let string = TokenTree::Literal(Literal::string(&self.tail)); - quote!(#output_ident.push_str(#string);) + let tail = &self.tail; + quote!(#output_ident.push_str(#tail);) }; self.tail.clear(); self.tokens.extend(push_str_expr); @@ -303,6 +387,6 @@ impl Builder { fn finish(mut self) -> TokenStream { self.cut(); - self.tokens.into_iter().collect() + self.tokens } } diff --git a/helpers/pagetop-macros/src/maud/parse.rs b/helpers/pagetop-macros/src/maud/parse.rs deleted file mode 100644 index d24cea6e..00000000 --- a/helpers/pagetop-macros/src/maud/parse.rs +++ /dev/null @@ -1,752 +0,0 @@ -use proc_macro2::{Delimiter, Ident, Literal, Spacing, Span, TokenStream, TokenTree}; -use proc_macro_error::{abort, abort_call_site, emit_error, SpanRange}; -use std::collections::HashMap; - -use syn::Lit; - -use crate::maud::ast; - -pub fn parse(input: TokenStream) -> Vec<ast::Markup> { - Parser::new(input).markups() -} - -#[derive(Clone)] -struct Parser { - /// If we're inside an attribute, then this contains the attribute name. - current_attr: Option<String>, - input: <TokenStream as IntoIterator>::IntoIter, -} - -impl Iterator for Parser { - type Item = TokenTree; - - fn next(&mut self) -> Option<TokenTree> { - self.input.next() - } -} - -impl Parser { - fn new(input: TokenStream) -> Parser { - Parser { - current_attr: None, - input: input.into_iter(), - } - } - - fn with_input(&self, input: TokenStream) -> Parser { - Parser { - current_attr: self.current_attr.clone(), - input: input.into_iter(), - } - } - - /// Returns the next token in the stream without consuming it. - fn peek(&mut self) -> Option<TokenTree> { - self.clone().next() - } - - /// Returns the next two tokens in the stream without consuming them. - fn peek2(&mut self) -> Option<(TokenTree, Option<TokenTree>)> { - let mut clone = self.clone(); - clone.next().map(|first| (first, clone.next())) - } - - /// Advances the cursor by one step. - fn advance(&mut self) { - self.next(); - } - - /// Advances the cursor by two steps. - fn advance2(&mut self) { - self.next(); - self.next(); - } - - /// Parses multiple blocks of markup. - fn markups(&mut self) -> Vec<ast::Markup> { - let mut result = Vec::new(); - loop { - match self.peek2() { - None => break, - Some((TokenTree::Punct(ref punct), _)) if punct.as_char() == ';' => self.advance(), - Some((TokenTree::Punct(ref punct), Some(TokenTree::Ident(ref ident)))) - if punct.as_char() == '@' && *ident == "let" => - { - self.advance2(); - let keyword = TokenTree::Ident(ident.clone()); - result.push(self.let_expr(punct.span(), keyword)); - } - _ => result.push(self.markup()), - } - } - result - } - - /// Parses a single block of markup. - fn markup(&mut self) -> ast::Markup { - let token = match self.peek() { - Some(token) => token, - None => { - abort_call_site!("unexpected end of input"); - } - }; - let markup = match token { - // Literal - TokenTree::Literal(literal) => { - self.advance(); - self.literal(literal) - } - // Special form - TokenTree::Punct(ref punct) if punct.as_char() == '@' => { - self.advance(); - let at_span = punct.span(); - match self.next() { - Some(TokenTree::Ident(ident)) => { - let keyword = TokenTree::Ident(ident.clone()); - match ident.to_string().as_str() { - "if" => { - let mut segments = Vec::new(); - self.if_expr(at_span, vec![keyword], &mut segments); - ast::Markup::Special { segments } - } - "while" => self.while_expr(at_span, keyword), - "for" => self.for_expr(at_span, keyword), - "match" => self.match_expr(at_span, keyword), - "let" => { - let span = SpanRange { - first: at_span, - last: ident.span(), - }; - abort!(span, "`@let` only works inside a block"); - } - other => { - let span = SpanRange { - first: at_span, - last: ident.span(), - }; - abort!(span, "unknown keyword `@{}`", other); - } - } - } - _ => { - abort!(at_span, "expected keyword after `@`"); - } - } - } - // Element - TokenTree::Ident(ident) => { - let ident_string = ident.to_string(); - match ident_string.as_str() { - "if" | "while" | "for" | "match" | "let" => { - abort!( - ident, - "found keyword `{}`", ident_string; - help = "should this be a `@{}`?", ident_string - ); - } - "true" | "false" => { - if let Some(attr_name) = &self.current_attr { - emit_error!( - ident, - r#"attribute value must be a string"#; - help = "to declare an empty attribute, omit the equals sign: `{}`", - attr_name; - help = "to toggle the attribute, use square brackets: `{}[some_boolean_flag]`", - attr_name; - ); - return ast::Markup::ParseError { - span: SpanRange::single_span(ident.span()), - }; - } - } - _ => {} - } - - // `.try_namespaced_name()` should never fail as we've - // already seen an `Ident` - let name = self.try_namespaced_name().expect("identifier"); - self.element(name) - } - // Div element shorthand - TokenTree::Punct(ref punct) if punct.as_char() == '.' || punct.as_char() == '#' => { - let name = TokenTree::Ident(Ident::new("div", punct.span())); - self.element(name.into()) - } - // Splice - TokenTree::Group(ref group) if group.delimiter() == Delimiter::Parenthesis => { - self.advance(); - ast::Markup::Splice { - expr: group.stream(), - outer_span: SpanRange::single_span(group.span()), - } - } - // Block - TokenTree::Group(ref group) if group.delimiter() == Delimiter::Brace => { - self.advance(); - ast::Markup::Block(self.block(group.stream(), SpanRange::single_span(group.span()))) - } - // ??? - token => { - abort!(token, "invalid syntax"); - } - }; - markup - } - - /// Parses a literal string. - fn literal(&mut self, literal: Literal) -> ast::Markup { - match Lit::new(literal.clone()) { - Lit::Str(lit_str) => { - return ast::Markup::Literal { - content: lit_str.value(), - span: SpanRange::single_span(literal.span()), - } - } - // Boolean literals are idents, so `Lit::Bool` is handled in - // `markup`, not here. - Lit::Int(..) | Lit::Float(..) => { - emit_error!(literal, r#"literal must be double-quoted: `"{}"`"#, literal); - } - Lit::Char(lit_char) => { - emit_error!( - literal, - r#"literal must be double-quoted: `"{}"`"#, - lit_char.value(), - ); - } - _ => { - emit_error!(literal, "expected string"); - } - } - ast::Markup::ParseError { - span: SpanRange::single_span(literal.span()), - } - } - - /// Parses an `@if` expression. - /// - /// The leading `@if` should already be consumed. - fn if_expr(&mut self, at_span: Span, prefix: Vec<TokenTree>, segments: &mut Vec<ast::Special>) { - let mut head = prefix; - let body = loop { - match self.next() { - Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { - break self.block(block.stream(), SpanRange::single_span(block.span())); - } - Some(token) => head.push(token), - None => { - let mut span = ast::span_tokens(head); - span.first = at_span; - abort!(span, "expected body for this `@if`"); - } - } - }; - segments.push(ast::Special { - at_span: SpanRange::single_span(at_span), - head: head.into_iter().collect(), - body, - }); - self.else_if_expr(segments) - } - - /// Parses an optional `@else if` or `@else`. - /// - /// The leading `@else if` or `@else` should *not* already be consumed. - fn else_if_expr(&mut self, segments: &mut Vec<ast::Special>) { - match self.peek2() { - Some((TokenTree::Punct(ref punct), Some(TokenTree::Ident(ref else_keyword)))) - if punct.as_char() == '@' && *else_keyword == "else" => - { - self.advance2(); - let at_span = punct.span(); - let else_keyword = TokenTree::Ident(else_keyword.clone()); - match self.peek() { - // `@else if` - Some(TokenTree::Ident(ref if_keyword)) if *if_keyword == "if" => { - self.advance(); - let if_keyword = TokenTree::Ident(if_keyword.clone()); - self.if_expr(at_span, vec![else_keyword, if_keyword], segments) - } - // Just an `@else` - _ => match self.next() { - Some(TokenTree::Group(ref group)) - if group.delimiter() == Delimiter::Brace => - { - let body = - self.block(group.stream(), SpanRange::single_span(group.span())); - segments.push(ast::Special { - at_span: SpanRange::single_span(at_span), - head: vec![else_keyword].into_iter().collect(), - body, - }); - } - _ => { - let span = SpanRange { - first: at_span, - last: else_keyword.span(), - }; - abort!(span, "expected body for this `@else`"); - } - }, - } - } - // We didn't find an `@else`; stop - _ => {} - } - } - - /// Parses an `@while` expression. - /// - /// The leading `@while` should already be consumed. - fn while_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { - let keyword_span = keyword.span(); - let mut head = vec![keyword]; - let body = loop { - match self.next() { - Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { - break self.block(block.stream(), SpanRange::single_span(block.span())); - } - Some(token) => head.push(token), - None => { - let span = SpanRange { - first: at_span, - last: keyword_span, - }; - abort!(span, "expected body for this `@while`"); - } - } - }; - ast::Markup::Special { - segments: vec![ast::Special { - at_span: SpanRange::single_span(at_span), - head: head.into_iter().collect(), - body, - }], - } - } - - /// Parses a `@for` expression. - /// - /// The leading `@for` should already be consumed. - fn for_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { - let keyword_span = keyword.span(); - let mut head = vec![keyword]; - loop { - match self.next() { - Some(TokenTree::Ident(ref in_keyword)) if *in_keyword == "in" => { - head.push(TokenTree::Ident(in_keyword.clone())); - break; - } - Some(token) => head.push(token), - None => { - let span = SpanRange { - first: at_span, - last: keyword_span, - }; - abort!(span, "missing `in` in `@for` loop"); - } - } - } - let body = loop { - match self.next() { - Some(TokenTree::Group(ref block)) if block.delimiter() == Delimiter::Brace => { - break self.block(block.stream(), SpanRange::single_span(block.span())); - } - Some(token) => head.push(token), - None => { - let span = SpanRange { - first: at_span, - last: keyword_span, - }; - abort!(span, "expected body for this `@for`"); - } - } - }; - ast::Markup::Special { - segments: vec![ast::Special { - at_span: SpanRange::single_span(at_span), - head: head.into_iter().collect(), - body, - }], - } - } - - /// Parses a `@match` expression. - /// - /// The leading `@match` should already be consumed. - fn match_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { - let keyword_span = keyword.span(); - let mut head = vec![keyword]; - let (arms, arms_span) = loop { - match self.next() { - Some(TokenTree::Group(ref body)) if body.delimiter() == Delimiter::Brace => { - let span = SpanRange::single_span(body.span()); - break (self.with_input(body.stream()).match_arms(), span); - } - Some(token) => head.push(token), - None => { - let span = SpanRange { - first: at_span, - last: keyword_span, - }; - abort!(span, "expected body for this `@match`"); - } - } - }; - ast::Markup::Match { - at_span: SpanRange::single_span(at_span), - head: head.into_iter().collect(), - arms, - arms_span, - } - } - - fn match_arms(&mut self) -> Vec<ast::MatchArm> { - let mut arms = Vec::new(); - while let Some(arm) = self.match_arm() { - arms.push(arm); - } - arms - } - - fn match_arm(&mut self) -> Option<ast::MatchArm> { - let mut head = Vec::new(); - loop { - match self.peek2() { - Some((TokenTree::Punct(ref eq), Some(TokenTree::Punct(ref gt)))) - if eq.as_char() == '=' - && gt.as_char() == '>' - && eq.spacing() == Spacing::Joint => - { - self.advance2(); - head.push(TokenTree::Punct(eq.clone())); - head.push(TokenTree::Punct(gt.clone())); - break; - } - Some((token, _)) => { - self.advance(); - head.push(token); - } - None => { - if head.is_empty() { - return None; - } else { - let head_span = ast::span_tokens(head); - abort!(head_span, "unexpected end of @match pattern"); - } - } - } - } - let body = match self.next() { - // $pat => { $stmts } - Some(TokenTree::Group(ref body)) if body.delimiter() == Delimiter::Brace => { - let body = self.block(body.stream(), SpanRange::single_span(body.span())); - // Trailing commas are optional if the match arm is a braced block - if let Some(TokenTree::Punct(ref punct)) = self.peek() { - if punct.as_char() == ',' { - self.advance(); - } - } - body - } - // $pat => $expr - Some(first_token) => { - let mut span = SpanRange::single_span(first_token.span()); - let mut body = vec![first_token]; - loop { - match self.next() { - Some(TokenTree::Punct(ref punct)) if punct.as_char() == ',' => break, - Some(token) => { - span.last = token.span(); - body.push(token); - } - None => break, - } - } - self.block(body.into_iter().collect(), span) - } - None => { - let span = ast::span_tokens(head); - abort!(span, "unexpected end of @match arm"); - } - }; - Some(ast::MatchArm { - head: head.into_iter().collect(), - body, - }) - } - - /// Parses a `@let` expression. - /// - /// The leading `@let` should already be consumed. - fn let_expr(&mut self, at_span: Span, keyword: TokenTree) -> ast::Markup { - let mut tokens = vec![keyword]; - loop { - match self.next() { - Some(token) => match token { - TokenTree::Punct(ref punct) if punct.as_char() == '=' => { - tokens.push(token.clone()); - break; - } - _ => tokens.push(token), - }, - None => { - let mut span = ast::span_tokens(tokens); - span.first = at_span; - abort!(span, "unexpected end of `@let` expression"); - } - } - } - loop { - match self.next() { - Some(token) => match token { - TokenTree::Punct(ref punct) if punct.as_char() == ';' => { - tokens.push(token.clone()); - break; - } - _ => tokens.push(token), - }, - None => { - let mut span = ast::span_tokens(tokens); - span.first = at_span; - abort!( - span, - "unexpected end of `@let` expression"; - help = "are you missing a semicolon?" - ); - } - } - } - ast::Markup::Let { - at_span: SpanRange::single_span(at_span), - tokens: tokens.into_iter().collect(), - } - } - - /// Parses an element node. - /// - /// The element name should already be consumed. - fn element(&mut self, name: TokenStream) -> ast::Markup { - if self.current_attr.is_some() { - let span = ast::span_tokens(name); - abort!(span, "unexpected element"); - } - let attrs = self.attrs(); - let body = match self.peek() { - Some(TokenTree::Punct(ref punct)) - if punct.as_char() == ';' || punct.as_char() == '/' => - { - // Void element - self.advance(); - if punct.as_char() == '/' { - emit_error!( - punct, - "void elements must use `;`, not `/`"; - help = "change this to `;`"; - help = "see https://github.com/lambda-fairy/maud/pull/315 for details"; - ); - } - ast::ElementBody::Void { - semi_span: SpanRange::single_span(punct.span()), - } - } - Some(_) => match self.markup() { - ast::Markup::Block(block) => ast::ElementBody::Block { block }, - markup => { - let markup_span = markup.span(); - abort!( - markup_span, - "element body must be wrapped in braces"; - help = "see https://github.com/lambda-fairy/maud/pull/137 for details" - ); - } - }, - None => abort_call_site!("expected `;`, found end of macro"), - }; - ast::Markup::Element { name, attrs, body } - } - - /// Parses the attributes of an element. - fn attrs(&mut self) -> Vec<ast::Attr> { - let mut attrs = Vec::new(); - loop { - if let Some(name) = self.try_namespaced_name() { - // Attribute - match self.peek() { - // Non-empty attribute - Some(TokenTree::Punct(ref punct)) if punct.as_char() == '=' => { - self.advance(); - // Parse a value under an attribute context - assert!(self.current_attr.is_none()); - self.current_attr = Some(ast::name_to_string(name.clone())); - let attr_type = match self.attr_toggler() { - Some(toggler) => ast::AttrType::Optional { toggler }, - None => { - let value = self.markup(); - ast::AttrType::Normal { value } - } - }; - self.current_attr = None; - attrs.push(ast::Attr::Named { - named_attr: ast::NamedAttr { name, attr_type }, - }); - } - // Empty attribute (legacy syntax) - Some(TokenTree::Punct(ref punct)) if punct.as_char() == '?' => { - self.advance(); - let toggler = self.attr_toggler(); - attrs.push(ast::Attr::Named { - named_attr: ast::NamedAttr { - name: name.clone(), - attr_type: ast::AttrType::Empty { toggler }, - }, - }); - } - // Empty attribute (new syntax) - _ => { - let toggler = self.attr_toggler(); - attrs.push(ast::Attr::Named { - named_attr: ast::NamedAttr { - name: name.clone(), - attr_type: ast::AttrType::Empty { toggler }, - }, - }); - } - } - } else { - match self.peek() { - // Class shorthand - Some(TokenTree::Punct(ref punct)) if punct.as_char() == '.' => { - self.advance(); - let name = self.class_or_id_name(); - let toggler = self.attr_toggler(); - attrs.push(ast::Attr::Class { - dot_span: SpanRange::single_span(punct.span()), - name, - toggler, - }); - } - // ID shorthand - Some(TokenTree::Punct(ref punct)) if punct.as_char() == '#' => { - self.advance(); - let name = self.class_or_id_name(); - attrs.push(ast::Attr::Id { - hash_span: SpanRange::single_span(punct.span()), - name, - }); - } - // If it's not a valid attribute, backtrack and bail out - _ => break, - } - } - } - - let mut attr_map: HashMap<String, Vec<SpanRange>> = HashMap::new(); - let mut has_class = false; - for attr in &attrs { - let name = match attr { - ast::Attr::Class { .. } => { - if has_class { - // Only check the first class to avoid spurious duplicates - continue; - } - has_class = true; - "class".to_string() - } - ast::Attr::Id { .. } => "id".to_string(), - ast::Attr::Named { named_attr } => named_attr - .name - .clone() - .into_iter() - .map(|token| token.to_string()) - .collect(), - }; - let entry = attr_map.entry(name).or_default(); - entry.push(attr.span()); - } - - for (name, spans) in attr_map { - if spans.len() > 1 { - let mut spans = spans.into_iter(); - let first_span = spans.next().expect("spans should be non-empty"); - abort!(first_span, "duplicate attribute `{}`", name); - } - } - - attrs - } - - /// Parses the name of a class or ID. - fn class_or_id_name(&mut self) -> ast::Markup { - if let Some(symbol) = self.try_name() { - ast::Markup::Symbol { symbol } - } else { - self.markup() - } - } - - /// Parses the `[cond]` syntax after an empty attribute or class shorthand. - fn attr_toggler(&mut self) -> Option<ast::Toggler> { - match self.peek() { - Some(TokenTree::Group(ref group)) if group.delimiter() == Delimiter::Bracket => { - self.advance(); - Some(ast::Toggler { - cond: group.stream(), - cond_span: SpanRange::single_span(group.span()), - }) - } - _ => None, - } - } - - /// Parses an identifier, without dealing with namespaces. - fn try_name(&mut self) -> Option<TokenStream> { - let mut result = Vec::new(); - if let Some(token @ TokenTree::Ident(_)) = self.peek() { - self.advance(); - result.push(token); - } else { - return None; - } - let mut expect_ident = false; - loop { - expect_ident = match self.peek() { - Some(TokenTree::Punct(ref punct)) if punct.as_char() == '-' => { - self.advance(); - result.push(TokenTree::Punct(punct.clone())); - true - } - Some(TokenTree::Ident(ref ident)) if expect_ident => { - self.advance(); - result.push(TokenTree::Ident(ident.clone())); - false - } - _ => break, - }; - } - Some(result.into_iter().collect()) - } - - /// Parses a HTML element or attribute name, along with a namespace - /// if necessary. - fn try_namespaced_name(&mut self) -> Option<TokenStream> { - let mut result = vec![self.try_name()?]; - if let Some(TokenTree::Punct(ref punct)) = self.peek() { - if punct.as_char() == ':' { - self.advance(); - result.push(TokenStream::from(TokenTree::Punct(punct.clone()))); - result.push(self.try_name()?); - } - } - Some(result.into_iter().collect()) - } - - /// Parses the given token stream as a Maud expression. - fn block(&mut self, body: TokenStream, outer_span: SpanRange) -> ast::Block { - let markups = self.with_input(body).markups(); - ast::Block { - markups, - outer_span, - } - } -} diff --git a/src/html.rs b/src/html.rs index 1f24f630..14e72b94 100644 --- a/src/html.rs +++ b/src/html.rs @@ -1,4 +1,4 @@ //! HTML en código. mod maud; -pub use maud::{html, html_private, Markup, PreEscaped, DOCTYPE}; +pub use maud::{display, html, html_private, Escaper, Markup, PreEscaped, Render, DOCTYPE}; diff --git a/src/html/maud.rs b/src/html/maud.rs index db9308af..19429869 100644 --- a/src/html/maud.rs +++ b/src/html/maud.rs @@ -1,4 +1,4 @@ -//#![no_std] +// #![no_std] //! A macro for writing HTML templates. //! @@ -7,11 +7,11 @@ //! //! [book]: https://maud.lambda.xyz/ -//#![doc(html_root_url = "https://docs.rs/maud/0.25.0")] +// #![doc(html_root_url = "https://docs.rs/maud/0.27.0")] extern crate alloc; -use alloc::{borrow::Cow, boxed::Box, string::String}; +use alloc::{borrow::Cow, boxed::Box, string::String, sync::Arc}; use core::fmt::{self, Arguments, Display, Write}; pub use pagetop_macros::html; @@ -34,8 +34,8 @@ mod escape; /// /// # Example /// -/// ```rust#ignore -/// use maud::Escaper; +/// ```rust +/// use pagetop::html::Escaper; /// use std::fmt::Write; /// let mut s = String::new(); /// write!(Escaper::new(&mut s), "<script>launchMissiles()</script>").unwrap(); @@ -50,7 +50,7 @@ impl<'a> Escaper<'a> { } } -impl<'a> fmt::Write for Escaper<'a> { +impl fmt::Write for Escaper<'_> { fn write_str(&mut self, s: &str) -> fmt::Result { escape::escape_to_string(s, self.0); Ok(()) @@ -72,8 +72,8 @@ impl<'a> fmt::Write for Escaper<'a> { /// /// # Example /// -/// ```rust#ignore -/// use maud::{html, Markup, Render}; +/// ```rust +/// use pagetop::html::{html, Markup, Render}; /// /// /// Provides a shorthand for linking to a CSS stylesheet. /// pub struct Stylesheet(&'static str); @@ -120,25 +120,25 @@ impl Render for String { } } -impl<'a> Render for Cow<'a, str> { +impl Render for Cow<'_, str> { fn render_to(&self, w: &mut String) { str::render_to(self, w); } } -impl<'a> Render for Arguments<'a> { +impl Render for Arguments<'_> { fn render_to(&self, w: &mut String) { let _ = Escaper::new(w).write_fmt(*self); } } -impl<'a, T: Render + ?Sized> Render for &'a T { +impl<T: Render + ?Sized> Render for &T { fn render_to(&self, w: &mut String) { T::render_to(self, w); } } -impl<'a, T: Render + ?Sized> Render for &'a mut T { +impl<T: Render + ?Sized> Render for &mut T { fn render_to(&self, w: &mut String) { T::render_to(self, w); } @@ -150,6 +150,12 @@ impl<T: Render + ?Sized> Render for Box<T> { } } +impl<T: Render + ?Sized> Render for Arc<T> { + fn render_to(&self, w: &mut String) { + T::render_to(self, w); + } +} + macro_rules! impl_render_with_display { ($($ty:ty)*) => { $( @@ -188,15 +194,15 @@ impl_render_with_itoa! { /// /// # Example /// -/// ```rust#ignore -/// use maud::html; +/// ```rust +/// use pagetop::html::{display, html}; /// use std::net::Ipv4Addr; /// /// let ip_address = Ipv4Addr::new(127, 0, 0, 1); /// /// let markup = html! { /// "My IP address is: " -/// (maud::display(ip_address)) +/// (display(ip_address)) /// }; /// /// assert_eq!(markup.into_string(), "My IP address is: 127.0.0.1"); @@ -215,7 +221,7 @@ pub fn display(value: impl Display) -> impl Render { /// A wrapper that renders the inner value without escaping. #[derive(Debug, Clone, Copy)] -pub struct PreEscaped<T: AsRef<str>>(pub T); +pub struct PreEscaped<T>(pub T); impl<T: AsRef<str>> Render for PreEscaped<T> { fn render_to(&self, w: &mut String) { @@ -234,20 +240,20 @@ impl Markup { } } -impl<T: AsRef<str> + Into<String>> PreEscaped<T> { +impl<T: Into<String>> PreEscaped<T> { /// Converts the inner value to a string. pub fn into_string(self) -> String { self.0.into() } } -impl<T: AsRef<str> + Into<String>> From<PreEscaped<T>> for String { +impl<T: Into<String>> From<PreEscaped<T>> for String { fn from(value: PreEscaped<T>) -> String { value.into_string() } } -impl<T: AsRef<str> + Default> Default for PreEscaped<T> { +impl<T: Default> Default for PreEscaped<T> { fn default() -> Self { Self(Default::default()) } @@ -259,8 +265,8 @@ impl<T: AsRef<str> + Default> Default for PreEscaped<T> { /// /// A minimal web page: /// -/// ```rust#ignore -/// use maud::{DOCTYPE, html}; +/// ```rust +/// use pagetop::html::{DOCTYPE, html}; /// /// let markup = html! { /// (DOCTYPE) @@ -280,10 +286,35 @@ pub const DOCTYPE: PreEscaped<&'static str> = PreEscaped("<!DOCTYPE html>"); mod actix_support { extern crate alloc; + use core::{ + pin::Pin, + task::{Context, Poll}, + }; + use crate::html::PreEscaped; - use actix_web::{http::header, HttpRequest, HttpResponse, Responder}; + use actix_web::{ + body::{BodySize, MessageBody}, + http::header, + web::Bytes, + HttpRequest, HttpResponse, Responder, + }; use alloc::string::String; + impl MessageBody for PreEscaped<String> { + type Error = <String as MessageBody>::Error; + + fn size(&self) -> BodySize { + self.0.size() + } + + fn poll_next( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll<Option<Result<Bytes, Self::Error>>> { + Pin::new(&mut self.0).poll_next(cx) + } + } + impl Responder for PreEscaped<String> { type Body = String; diff --git a/src/service.rs b/src/service.rs index 9fe2450e..e6904b82 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,4 +1,4 @@ -//! Gestión del servidor y servicios web ([actix-web](https://docs.rs/actix-web)). +//! Gestión del servidor y servicios web ([Actix Web](https://docs.rs/actix-web)). pub use actix_web::body::BoxBody; pub use actix_web::dev::Server; From 7a0d02d57e4c8e7ad1a0445dfc14f781bc154d30 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 7 Jul 2025 21:23:06 +0200 Subject: [PATCH 668/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20AutoDefault=20?= =?UTF-8?q?para=20derivar=20Default=20avanzado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-macros/Cargo.toml | 2 +- helpers/pagetop-macros/README.md | 9 +- helpers/pagetop-macros/src/lib.rs | 20 ++- helpers/pagetop-macros/src/smart_default.rs | 4 + .../src/smart_default/body_impl.rs | 158 ++++++++++++++++++ .../src/smart_default/default_attr.rs | 89 ++++++++++ .../pagetop-macros/src/smart_default/util.rs | 21 +++ src/lib.rs | 2 +- src/prelude.rs | 2 + src/service.rs | 2 +- 11 files changed, 303 insertions(+), 8 deletions(-) create mode 100644 helpers/pagetop-macros/src/smart_default.rs create mode 100644 helpers/pagetop-macros/src/smart_default/body_impl.rs create mode 100644 helpers/pagetop-macros/src/smart_default/default_attr.rs create mode 100644 helpers/pagetop-macros/src/smart_default/util.rs diff --git a/Cargo.lock b/Cargo.lock index cf974c87..3fe4d512 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -937,7 +937,7 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.0.2" +version = "0.0.3" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index ea6404b9..9f914bfd 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.2" +version = "0.0.3" edition = "2021" description = """\ diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index 06799668..e41dd0ec 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -11,9 +11,12 @@ ## Descripción general Entre sus macros se incluye una adaptación de [maud-macros](https://crates.io/crates/maud_macros) -([0.25.0](https://github.com/lambda-fairy/maud/tree/v0.25.0/maud_macros)) de -[Chris Wong](https://crates.io/users/lambda-fairy) para no tener que referenciar `maud` en las -dependencias del archivo `Cargo.toml` de cada proyecto `PageTop`. +([0.27.0](https://github.com/lambda-fairy/maud/tree/v0.27.0/maud_macros)) de +[Chris Wong](https://crates.io/users/lambda-fairy) y una versión renombrada de +[SmartDefault](https://crates.io/crates/smart_default) (0.7.1) de +[Jane Doe](https://crates.io/users/jane-doe), llamada `AutoDefault`. Estas macros eliminan la +necesidad de referenciar `maud` o `smart_default` en las dependencias del archivo `Cargo.toml` de +cada proyecto `PageTop`. ## Sobre PageTop diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index e0f3badd..eecebed3 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -15,16 +15,34 @@ //! y configurables, basadas en HTML, CSS y JavaScript. mod maud; +mod smart_default; use proc_macro::TokenStream; use quote::quote; +use syn::{parse_macro_input, DeriveInput}; -/// Macro para escribir plantillas HTML ([Maud](https://docs.rs/maud)). +/// Macro para escribir plantillas HTML (basada en [Maud](https://docs.rs/maud)). #[proc_macro] pub fn html(input: TokenStream) -> TokenStream { maud::expand(input.into()).into() } +/// Deriva [`Default`] con atributos personalizados (basada en +/// [SmartDefault](https://docs.rs/smart-default)). +/// +/// Al derivar una estructura con *AutoDefault* se genera automáticamente la implementación de +/// [`Default`]. Aunque, a diferencia de un simple `#[derive(Default)]`, el atributo +/// `#[derive(AutoDefault)]` permite usar anotaciones en los campos como `#[default = "..."]`, +/// funcionando incluso en estructuras con campos que no implementan [`Default`] o en *enums*. +#[proc_macro_derive(AutoDefault, attributes(default))] +pub fn derive_auto_default(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + match smart_default::body_impl::impl_my_derive(&input) { + Ok(output) => output.into(), + Err(error) => error.to_compile_error().into(), + } +} + /// Define una función `main` asíncrona como punto de entrada de `PageTop`. /// /// # Ejemplos diff --git a/helpers/pagetop-macros/src/smart_default.rs b/helpers/pagetop-macros/src/smart_default.rs new file mode 100644 index 00000000..87177dca --- /dev/null +++ b/helpers/pagetop-macros/src/smart_default.rs @@ -0,0 +1,4 @@ +pub mod body_impl; + +mod default_attr; +mod util; diff --git a/helpers/pagetop-macros/src/smart_default/body_impl.rs b/helpers/pagetop-macros/src/smart_default/body_impl.rs new file mode 100644 index 00000000..6a76f904 --- /dev/null +++ b/helpers/pagetop-macros/src/smart_default/body_impl.rs @@ -0,0 +1,158 @@ +use proc_macro2::TokenStream; + +use quote::quote; +use syn::parse::Error; +use syn::spanned::Spanned; +use syn::DeriveInput; + +use crate::smart_default::default_attr::{ConversionStrategy, DefaultAttr}; +use crate::smart_default::util::find_only; + +pub fn impl_my_derive(input: &DeriveInput) -> Result<TokenStream, Error> { + let name = &input.ident; + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + let (default_expr, doc) = match input.data { + syn::Data::Struct(ref body) => { + let (body_assignment, _doc) = default_body_tt(&body.fields)?; + ( + quote! { + #name #body_assignment + }, + format!("Returns a `{}` default.", name), + ) + } + syn::Data::Enum(ref body) => { + let default_variant = find_only(body.variants.iter(), |variant| { + if let Some(meta) = DefaultAttr::find_in_attributes(&variant.attrs)? { + if meta.code.is_none() { + Ok(true) + } else { + Err(Error::new( + meta.code.span(), + "Attribute #[default] on variants should have no value", + )) + } + } else { + Ok(false) + } + })? + .ok_or_else(|| Error::new(input.span(), "No default variant"))?; + let default_variant_name = &default_variant.ident; + let (body_assignment, _doc) = default_body_tt(&default_variant.fields)?; + ( + quote! { + #name :: #default_variant_name #body_assignment + }, + format!("Returns a `{}::{}` default.", name, default_variant_name), + ) + } + syn::Data::Union(_) => { + panic!() + } + }; + Ok(quote! { + #[automatically_derived] + impl #impl_generics Default for #name #ty_generics #where_clause { + #[doc = #doc] + fn default() -> Self { + #default_expr + } + } + }) +} + +/// Return a token-tree for the default "body" - the part after the name that contains the values. +/// That is, the `{ ... }` part for structs, the `(...)` part for tuples, and nothing for units. +fn default_body_tt(body: &syn::Fields) -> Result<(TokenStream, String), Error> { + let mut doc = String::new(); + use std::fmt::Write; + let body_tt = match body { + syn::Fields::Named(ref fields) => { + doc.push_str(" {"); + let result = { + let field_assignments = fields + .named + .iter() + .map(|field| { + let field_name = field.ident.as_ref(); + let (default_value, default_doc) = field_default_expr_and_doc(field)?; + write!( + &mut doc, + "\n {}: {},", + field_name.expect("field value in struct is empty"), + default_doc + ) + .unwrap(); + // let default_value = default_value.into_token_stream(); + Ok(quote! { #field_name : #default_value }) + }) + .collect::<Result<Vec<_>, Error>>()?; + quote! { + { + #( #field_assignments ),* + } + } + }; + if doc.ends_with(',') { + doc.pop(); + doc.push('\n'); + }; + doc.push('}'); + result + } + syn::Fields::Unnamed(ref fields) => { + doc.push('('); + let result = { + let field_assignments = fields + .unnamed + .iter() + .map(|field| { + let (default_value, default_doc) = field_default_expr_and_doc(field)?; + write!(&mut doc, "{}, ", default_doc).unwrap(); + Ok(default_value) + }) + .collect::<Result<Vec<TokenStream>, Error>>()?; + quote! { + ( + #( #field_assignments ),* + ) + } + }; + if doc.ends_with(", ") { + doc.pop(); + doc.pop(); + }; + doc.push(')'); + result + } + &syn::Fields::Unit => quote! {}, + }; + Ok((body_tt, doc)) +} + +/// Return a default expression for a field based on it's `#[default = "..."]` attribute. Panic +/// if there is more than one, of if there is a `#[default]` attribute without value. +fn field_default_expr_and_doc(field: &syn::Field) -> Result<(TokenStream, String), Error> { + if let Some(default_attr) = DefaultAttr::find_in_attributes(&field.attrs)? { + let conversion_strategy = default_attr.conversion_strategy(); + let field_value = default_attr.code.ok_or_else(|| { + Error::new(field.span(), "Expected #[default = ...] or #[default(...)]") + })?; + + let field_value = match conversion_strategy { + ConversionStrategy::NoConversion => field_value, + ConversionStrategy::Into => quote!((#field_value).into()), + }; + + let field_doc = format!("{}", field_value); + Ok((field_value, field_doc)) + } else { + Ok(( + quote! { + Default::default() + }, + "Default::default()".to_owned(), + )) + } +} diff --git a/helpers/pagetop-macros/src/smart_default/default_attr.rs b/helpers/pagetop-macros/src/smart_default/default_attr.rs new file mode 100644 index 00000000..8487fc06 --- /dev/null +++ b/helpers/pagetop-macros/src/smart_default/default_attr.rs @@ -0,0 +1,89 @@ +use proc_macro2::TokenStream; +use quote::ToTokens; +use syn::{parse::Error, MetaNameValue}; + +use crate::smart_default::util::find_only; + +#[derive(Debug, Clone, Copy)] +pub enum ConversionStrategy { + NoConversion, + Into, +} + +pub struct DefaultAttr { + pub code: Option<TokenStream>, + conversion_strategy: Option<ConversionStrategy>, +} + +impl DefaultAttr { + pub fn find_in_attributes(attrs: &[syn::Attribute]) -> Result<Option<Self>, Error> { + if let Some(default_attr) = + find_only(attrs.iter(), |attr| Ok(attr.path().is_ident("default")))? + { + match &default_attr.meta { + syn::Meta::Path(_) => Ok(Some(Self { + code: None, + conversion_strategy: None, + })), + syn::Meta::List(meta) => { + // If the meta contains exactly (_code = "...") take the string literal as the + // expression + if let Ok(ParseCodeHack(code_hack)) = syn::parse(meta.tokens.clone().into()) { + Ok(Some(Self { + code: Some(code_hack), + conversion_strategy: Some(ConversionStrategy::NoConversion), + })) + } else { + Ok(Some(Self { + code: Some(meta.tokens.clone()), + conversion_strategy: None, + })) + } + } + syn::Meta::NameValue(MetaNameValue { value, .. }) => Ok(Some(Self { + code: Some(value.into_token_stream()), + conversion_strategy: None, + })), + } + } else { + Ok(None) + } + } + + pub fn conversion_strategy(&self) -> ConversionStrategy { + if let Some(conversion_strategy) = self.conversion_strategy { + // Conversion strategy already set + return conversion_strategy; + } + let code = if let Some(code) = &self.code { + code + } else { + // #[default] - so no conversion (`Default::default()` already has the correct type) + return ConversionStrategy::NoConversion; + }; + match syn::parse::<syn::Lit>(code.clone().into()) { + Ok(syn::Lit::Str(_)) | Ok(syn::Lit::ByteStr(_)) => { + // A string literal - so we need a conversion in case we need to make it a `String` + return ConversionStrategy::Into; + } + _ => {} + } + // Not handled by one of the rules, so we don't convert it to avoid causing trouble + ConversionStrategy::NoConversion + } +} + +struct ParseCodeHack(TokenStream); + +impl syn::parse::Parse for ParseCodeHack { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let ident: syn::Ident = input.parse()?; + if ident != "_code" { + return Err(Error::new(ident.span(), "Expected `_code`")); + } + input.parse::<syn::token::Eq>()?; + let code: syn::LitStr = input.parse()?; + let code: TokenStream = code.parse()?; + Ok(ParseCodeHack(code)) + } +} diff --git a/helpers/pagetop-macros/src/smart_default/util.rs b/helpers/pagetop-macros/src/smart_default/util.rs new file mode 100644 index 00000000..0d4b247b --- /dev/null +++ b/helpers/pagetop-macros/src/smart_default/util.rs @@ -0,0 +1,21 @@ +use syn::parse::Error; +use syn::spanned::Spanned; + +/// Return the value that fulfills the predicate if there is one in the slice. Panic if there is +/// more than one. +pub fn find_only<T, F>(iter: impl Iterator<Item = T>, pred: F) -> Result<Option<T>, Error> +where + T: Spanned, + F: Fn(&T) -> Result<bool, Error>, +{ + let mut result = None; + for item in iter { + if pred(&item)? { + if result.is_some() { + return Err(Error::new(item.span(), "Multiple defaults")); + } + result = Some(item); + } + } + Ok(result) +} diff --git a/src/lib.rs b/src/lib.rs index 2f973518..b9b2a4bc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,7 +32,7 @@ // RE-EXPORTED ************************************************************************************* -pub use pagetop_macros::{html, main, test}; +pub use pagetop_macros::{html, main, test, AutoDefault}; // API ********************************************************************************************* diff --git a/src/prelude.rs b/src/prelude.rs index eb59c4f2..872447aa 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -4,6 +4,8 @@ pub use crate::{html, main, test}; +pub use crate::AutoDefault; + // MACROS. // crate::config diff --git a/src/service.rs b/src/service.rs index e6904b82..90b13758 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,4 +1,4 @@ -//! Gestión del servidor y servicios web ([Actix Web](https://docs.rs/actix-web)). +//! Gestión del servidor y servicios web (con [Actix Web](https://docs.rs/actix-web)). pub use actix_web::body::BoxBody; pub use actix_web::dev::Server; From 7e03d926bba7a420b0e1433eed01ae91e49a299f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 8 Jul 2025 20:57:39 +0200 Subject: [PATCH 669/853] =?UTF-8?q?=F0=9F=9A=A8=20Aplica=20retoques=20por?= =?UTF-8?q?=20ejecuci=C3=B3n=20de=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.rs | 6 ++++++ src/config.rs | 13 ++++++------- src/trace.rs | 1 - 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/app.rs b/src/app.rs index d21c08a0..082419ab 100644 --- a/src/app.rs +++ b/src/app.rs @@ -11,6 +11,12 @@ use std::sync::LazyLock; pub struct Application; +impl Default for Application { + fn default() -> Self { + Self::new() + } +} + impl Application { /// Crea una instancia de la aplicación. pub fn new() -> Self { diff --git a/src/config.rs b/src/config.rs index eae182fc..d532ba14 100644 --- a/src/config.rs +++ b/src/config.rs @@ -23,7 +23,7 @@ //! * Si `PAGETOP_RUN_MODE` no está definida, se asume el valor `default`, y `PageTop` intentará //! cargar *config/default.toml* si el archivo existe. //! -//! * Útil para definir configuraciones específicas por entorno, garantizando que cada uno (p.e. +//! * Útil para definir configuraciones específicas por entorno, garantizando que cada uno (p.ej. //! *dev*, *staging* o *production*) disponga de sus propias opciones, como claves de API, //! URLs o ajustes de rendimiento, sin afectar a los demás. //! @@ -126,7 +126,7 @@ const DEFAULT_RUN_MODE: &str = "default"; /// Valores originales cargados desde los archivos de configuración como pares `clave = valor`. pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new(|| { // Determina el directorio de configuración: - // - Usa CONFIG_DIR si está definido en el entorno (p.e.: CONFIG_DIR=/etc/myapp ./myapp). + // - Usa CONFIG_DIR si está definido en el entorno (p.ej.: CONFIG_DIR=/etc/myapp ./myapp). // - Si no, intenta DEFAULT_CONFIG_DIR dentro del proyecto (en CARGO_MANIFEST_DIR). // - Si nada de esto aplica, entonces usa DEFAULT_CONFIG_DIR relativo al ejecutable. let config_dir: PathBuf = if let Ok(env_dir) = env::var("CONFIG_DIR") { @@ -143,15 +143,15 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( }; // Determina el modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto usa - // DEFAULT_RUN_MODE si no está definida (p.e.: PAGETOP_RUN_MODE=production ./myapp). + // DEFAULT_RUN_MODE si no está definida (p.ej.: PAGETOP_RUN_MODE=production ./myapp). let rm = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| DEFAULT_RUN_MODE.into()); Config::builder() // 1. Configuración común para todos los entornos (common.toml). .add_source(File::from(config_dir.join("common.toml")).required(false)) - // 2. Configuración específica del entorno (p.e.: default.toml, production.toml). + // 2. Configuración específica del entorno (p.ej.: default.toml, production.toml). .add_source(File::from(config_dir.join(format!("{rm}.toml"))).required(false)) - // 3. Configuración local reservada para cada entorno (p.e.: local.default.toml). + // 3. Configuración local reservada para cada entorno (p.ej.: local.default.toml). .add_source(File::from(config_dir.join(format!("local.{rm}.toml"))).required(false)) // 4. Configuración local común (local.toml). .add_source(File::from(config_dir.join("local.toml")).required(false)) @@ -217,7 +217,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// * **Valores por defecto**. Declara un valor por defecto para cada clave obligatoria. Las claves /// opcionales pueden ser `Option<T>`. /// -/// * **Secciones únicas**. Agrupa tus claves dentro de una sección exclusiva (p.e. `[blog]`) para +/// * **Secciones únicas**. Agrupa tus claves dentro de una sección exclusiva (p.ej. `[blog]`) para /// evitar colisiones con otras librerías. /// /// * **Solo lectura**. La variable generada es inmutable durante toda la vida del programa. Para @@ -236,7 +236,6 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// [dependencies] /// serde = { version = "1.0", features = ["derive"] } /// ``` - #[macro_export] macro_rules! include_config { ( $SETTINGS_NAME:ident : $Settings_Type:ty => [ $( $k:literal => $v:expr ),* $(,)? ] ) => { diff --git a/src/trace.rs b/src/trace.rs index 93a8ff2d..bd8ce56d 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -33,7 +33,6 @@ use std::sync::LazyLock; /// Dado que las trazas o eventos registrados poco antes de un fallo suelen ser cruciales para /// diagnosticar la causa, `Lazy<WorkerGuard>` garantiza que todos los registros almacenados se /// envíen antes de finalizar la ejecución. - #[rustfmt::skip] pub(crate) static TRACING: LazyLock<WorkerGuard> = LazyLock::new(|| { let env_filter = EnvFilter::try_new(&global::SETTINGS.log.tracing) From 896b066ca9f53adf82b622e86916ac55fe936e68 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 9 Jul 2025 20:39:39 +0200 Subject: [PATCH 670/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20para?= =?UTF-8?q?=20localizaci=C3=B3n=20y=20traducci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Incluye recursos Fluent básicos y pruebas asociadas. - Nueva variable de configuración global para definir el idioma predeterminado. --- Cargo.lock | 278 ++++++++++++++++++++++++- Cargo.toml | 5 +- src/app.rs | 5 +- src/global.rs | 3 + src/lib.rs | 4 + src/locale.rs | 364 +++++++++++++++++++++++++++++++++ src/locale/en-US/languages.ftl | 5 + src/locale/en-US/test.ftl | 11 + src/locale/es-ES/languages.ftl | 5 + src/locale/es-ES/test.ftl | 11 + src/prelude.rs | 8 + src/util.rs | 26 +++ tests/locale.rs | 58 ++++++ 13 files changed, 780 insertions(+), 3 deletions(-) create mode 100644 src/locale.rs create mode 100644 src/locale/en-US/languages.ftl create mode 100644 src/locale/en-US/test.ftl create mode 100644 src/locale/es-ES/languages.ftl create mode 100644 src/locale/es-ES/test.ftl create mode 100644 src/util.rs create mode 100644 tests/locale.rs diff --git a/Cargo.lock b/Cargo.lock index 3fe4d512..64073ea1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -287,6 +287,16 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.19.0" @@ -384,6 +394,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -492,6 +521,81 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fluent-bundle" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash 1.1.0", + "self_cell 0.10.3", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33d" +dependencies = [ + "thiserror", +] + +[[package]] +name = "fluent-template-macros" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ed02449601d0dacdc05cb5e13db5dab8f2b98d773aff5c53b62fad43a1b19a1" +dependencies = [ + "flume", + "ignore", + "proc-macro2", + "quote", + "syn", + "unic-langid", +] + +[[package]] +name = "fluent-templates" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69855a5fe87629495efca79aec72adfa97954f1006f928e3a2ec750cb3e85386" +dependencies = [ + "fluent-bundle", + "fluent-langneg", + "fluent-syntax", + "fluent-template-macros", + "flume", + "ignore", + "intl-memoizer", + "log", + "thiserror", + "unic-langid", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -571,6 +675,19 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + [[package]] name = "h2" version = "0.3.26" @@ -726,6 +843,22 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.9", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "impl-more" version = "0.1.9" @@ -742,6 +875,25 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "intl-memoizer" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163f" +dependencies = [ + "type-map", + "unic-langid", +] + +[[package]] +name = "intl_pluralrules" +version = "7.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" +dependencies = [ + "unic-langid", +] + [[package]] name = "itoa" version = "1.0.15" @@ -918,12 +1070,13 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.4" +version = "0.0.5" dependencies = [ "actix-web", "colored", "config", "figlet-rs", + "fluent-templates", "itoa", "pagetop-macros", "serde", @@ -933,6 +1086,7 @@ dependencies = [ "tracing-actix-web", "tracing-appender", "tracing-subscriber", + "unic-langid", ] [[package]] @@ -1052,6 +1206,12 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + [[package]] name = "proc-macro2" version = "1.0.95" @@ -1182,6 +1342,18 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustix" version = "1.0.7" @@ -1207,12 +1379,36 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "self_cell" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" +dependencies = [ + "self_cell 1.2.0", +] + +[[package]] +name = "self_cell" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" + [[package]] name = "serde" version = "1.0.219" @@ -1323,6 +1519,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1604,12 +1809,64 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.1", +] + [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "unic-langid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05" +dependencies = [ + "unic-langid-impl", + "unic-langid-macros", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658" +dependencies = [ + "tinystr", +] + +[[package]] +name = "unic-langid-macros" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5957eb82e346d7add14182a3315a7e298f04e1ba4baac36f7f0dbfedba5fc25" +dependencies = [ + "proc-macro-hack", + "tinystr", + "unic-langid-impl", + "unic-langid-macros-impl", +] + +[[package]] +name = "unic-langid-macros-impl" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1249a628de3ad34b821ecb1001355bca3940bcb2f88558f1a8bd82e977f75b5" +dependencies = [ + "proc-macro-hack", + "quote", + "syn", + "unic-langid-impl", +] + [[package]] name = "unicode-ident" version = "1.0.18" @@ -1662,6 +1919,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -1751,6 +2018,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index b8b3f5fa..bcf1fd50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.4" +version = "0.0.5" edition = "2021" description = """\ @@ -28,6 +28,9 @@ tracing-appender = "0.2.3" tracing-subscriber = { version = "0.3.19", features = ["json", "env-filter"] } tracing-actix-web = "0.7.18" +fluent-templates = "0.13.0" +unic-langid = { version = "0.9.6", features = ["macros"] } + actix-web = "4.11.0" pagetop-macros.workspace = true diff --git a/src/app.rs b/src/app.rs index 082419ab..b02b294a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,7 +2,7 @@ mod figfont; -use crate::{global, service, trace}; +use crate::{global, locale, service, trace}; use substring::Substring; @@ -26,6 +26,9 @@ impl Application { // Inicia gestión de trazas y registro de eventos (logging). LazyLock::force(&trace::TRACING); + // Valida el identificador de idioma por defecto. + LazyLock::force(&locale::DEFAULT_LANGID); + Self } diff --git a/src/global.rs b/src/global.rs index 8432032a..a90aa86c 100644 --- a/src/global.rs +++ b/src/global.rs @@ -8,6 +8,7 @@ include_config!(SETTINGS: Settings => [ // [app] "app.name" => "Sample", "app.description" => "Developed with the amazing PageTop framework.", + "app.language" => "en-US", "app.startup_banner" => "Slant", // [log] @@ -38,6 +39,8 @@ pub struct App { pub name: String, /// Breve descripción de la aplicación. pub description: String, + /// Idioma predeterminado (localización). + pub language: String, /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o /// *"Starwars"*. pub startup_banner: String, diff --git a/src/lib.rs b/src/lib.rs index b9b2a4bc..07b99347 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,6 +36,8 @@ pub use pagetop_macros::{html, main, test, AutoDefault}; // API ********************************************************************************************* +// Funciones y macros útiles. +pub mod util; // Carga las opciones de configuración. pub mod config; // Opciones de configuración globales. @@ -44,6 +46,8 @@ pub mod global; pub mod trace; // HTML en código. pub mod html; +// Localización. +pub mod locale; // Gestión del servidor y servicios web. pub mod service; // Prepara y ejecuta la aplicación. diff --git a/src/locale.rs b/src/locale.rs new file mode 100644 index 00000000..064481f0 --- /dev/null +++ b/src/locale.rs @@ -0,0 +1,364 @@ +//! Localización (L10n). +//! +//! `PageTop` utiliza las especificaciones de [Fluent](https://www.projectfluent.org/) para la +//! localización de aplicaciones, y aprovecha [fluent-templates](https://docs.rs/fluent-templates/) +//! para integrar los recursos de traducción directamente en el binario de la aplicación. +//! +//! # Sintaxis Fluent (FTL) +//! +//! El formato empleado para describir los recursos de traducción se denomina +//! [FTL](https://www.projectfluent.org/fluent/guide/). Está diseñado para ser legible y expresivo, +//! permitiendo representar construcciones complejas del lenguaje natural como el género, el plural +//! o las conjugaciones verbales. +//! +//! # Recursos Fluent +//! +//! Por defecto, las traducciones se organizan en el directorio *src/locale*, con subdirectorios +//! para cada [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido. Podríamos +//! tener una estructura como esta: +//! +//! ```text +//! src/locale/ +//! ├── common.ftl +//! ├── en-US/ +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-ES/ +//! │ ├── default.ftl +//! │ └── main.ftl +//! ├── es-MX/ +//! │ ├── default.ftl +//! │ └── main.ftl +//! └── fr/ +//! ├── default.ftl +//! └── main.ftl +//! ``` +//! +//! Ejemplo de un archivo *src/locale/en-US/main.ftl*: +//! +//! ```text +//! hello-world = Hello world! +//! hello-user = Hello, {$userName}! +//! shared-photos = +//! {$userName} {$photoCount -> +//! [one] added a new photo +//! *[other] added {$photoCount} new photos +//! } of {$userGender -> +//! [male] him and his family +//! [female] her and her family +//! *[other] the family +//! }. +//! ``` +//! +//! Y su archivo equivalente para español *src/locale/es-ES/main.ftl*: +//! +//! ```text +//! hello-world = Hola mundo! +//! hello-user = ¡Hola, {$userName}! +//! shared-photos = +//! {$userName} {$photoCount -> +//! [one] ha añadido una nueva foto +//! *[other] ha añadido {$photoCount} nuevas fotos +//! } de {$userGender -> +//! [male] él y su familia +//! [female] ella y su familia +//! *[other] la familia +//! }. +//! ``` +//! +//! +//! # Cómo aplicar la localización en tu código +//! +//! Una vez creado el directorio con los recursos FTL, basta con utilizar la macro +//! [`include_locales!`](crate::include_locales) para integrarlos en la aplicación. +//! +//! Si los recursos se encuentran en el directorio `"src/locale"`, sólo hay que declarar: +//! +//! ```rust +//! use pagetop::prelude::*; +//! +//! include_locales!(LOCALES_SAMPLE); +//! ``` +//! +//! Pero si están ubicados en otro directorio, entonces se pueden incluir usando: +//! +//! ```rust,ignore +//! include_locales!(LOCALES_SAMPLE from "ruta/a/las/traducciones"); +//! ``` + +use crate::html::{Markup, PreEscaped}; +use crate::{global, hm, AutoDefault}; + +pub use fluent_templates; +pub use unic_langid::{CharacterDirection, LanguageIdentifier}; + +use unic_langid::langid; + +use fluent_templates::Loader; +use fluent_templates::StaticLoader as Locales; + +use std::borrow::Cow; +use std::collections::HashMap; +use std::sync::LazyLock; + +use std::fmt; + +// Asocia cada código de idioma (como "en-US") con su respectivo [`LanguageIdentifier`] y la clave +// en *locale/.../languages.ftl* para obtener el nombre del idioma según la localización. +static LANGUAGES: LazyLock<HashMap<&str, (LanguageIdentifier, &str)>> = LazyLock::new(|| { + hm![ + "en" => ( langid!("en-US"), "english" ), + "en-GB" => ( langid!("en-GB"), "english_british" ), + "en-US" => ( langid!("en-US"), "english_united_states" ), + "es" => ( langid!("es-ES"), "spanish" ), + "es-ES" => ( langid!("es-ES"), "spanish_spain" ), + ] +}); + +// Identificador del idioma de **respaldo** (predefinido a `en-US`). +// +// Se usa cuando el valor del código de idioma en las traducciones no corresponde con ningún idioma +// soportado por la aplicación. +static FALLBACK_LANGID: LazyLock<LanguageIdentifier> = LazyLock::new(|| langid!("en-US")); + +// Identificador del idioma **por defecto** para la aplicación. +// +// Se resuelve a partir de [`global::SETTINGS.app.language`](global::SETTINGS). Si el código de +// idioma configurado no es válido o no está disponible entonces resuelve como [`FALLBACK_LANGID`]. +pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = + LazyLock::new(|| LangMatch::langid_or_fallback(&global::SETTINGS.app.language)); + +/// Comprueba si el idioma está soportado por `PageTop`. +/// +/// Útil para transformar un código de idioma en un [`LanguageIdentifier`] válido para `PageTop`. +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum LangMatch { + /// Cuando el código del idioma es una cadena vacía. + Empty, + /// Si encuentra un [`LanguageIdentifier`] que coincide exactamente o retrocediendo al idioma + /// base. + Found(&'static LanguageIdentifier), + /// Si el código del idioma no está entre los soportados por `PageTop`. + Unknown(String), +} + +impl LangMatch { + /// Resuelve `language` y devuelve el [`LangMatch`] apropiado. + pub fn resolve(language: impl AsRef<str>) -> Self { + let language = language.as_ref().trim(); + + // Rechaza cadenas vacías. + if language.is_empty() { + return Self::Empty; + } + + // Intenta aplicar coincidencia exacta con el código completo (p.ej. "es-MX"). + if let Some(langid) = LANGUAGES.get(language).map(|(langid, _)| langid) { + return Self::Found(langid); + } + + // Si la variante regional no existe, retrocede al idioma base (p.ej. "es"). + if let Some((base_lang, _)) = language.split_once('-') { + if let Some(langid) = LANGUAGES.get(base_lang).map(|(langid, _)| langid) { + return Self::Found(langid); + } + } + + // Devuelve desconocido si el idioma no está soportado. + Self::Unknown(language.to_string()) + } + + /// Devuelve siempre un [`LanguageIdentifier`] válido. + /// + /// Si `language` está vacío o es desconocido, devuelve el idioma de respaldo ("en-US"). + #[inline] + pub fn langid_or_fallback(language: impl AsRef<str>) -> &'static LanguageIdentifier { + match Self::resolve(language) { + Self::Found(l) => l, + _ => &FALLBACK_LANGID, + } + } + + /// Devuelve un [`LanguageIdentifier`] válido para la instancia. + /// + /// Si `language` está vacío o es desconocido, devuelve el idioma de respaldo ("en-US"). + #[inline] + pub fn as_langid(&self) -> &'static LanguageIdentifier { + match self { + LangMatch::Found(l) => l, + _ => &FALLBACK_LANGID, + } + } +} + +#[macro_export] +/// Define un conjunto de elementos de localización y textos de traducción local. +macro_rules! include_locales { + // Se eliminan las marcas de aislamiento Unicode en los argumentos para mejorar la legibilidad y + // la compatibilidad en ciertos contextos de renderizado. + ( $LOCALES:ident $(, $core_locales:literal)? ) => { + $crate::locale::fluent_templates::static_loader! { + static $LOCALES = { + locales: "src/locale", + $( core_locales: $core_locales, )? + fallback_language: "en-US", + // Elimina marcas de aislamiento Unicode en los argumentos. + customise: |bundle| bundle.set_use_isolating(false), + }; + } + }; + ( $LOCALES:ident from $dir_locales:literal $(, $core_locales:literal)? ) => { + $crate::locale::fluent_templates::static_loader! { + static $LOCALES = { + locales: $dir_locales, + $( core_locales: $core_locales, )? + fallback_language: "en-US", + // Elimina marcas de aislamiento Unicode en los argumentos. + customise: |bundle| bundle.set_use_isolating(false), + }; + } + }; +} + +include_locales!(LOCALES_PAGETOP); + +// Operación de localización a realizar. +// +// * `None` - No se aplica ninguna localización. +// * `Text` - Con una cadena literal que se devolverá tal cual. +// * `Translate` - Con la clave a resolver en el `Locales` indicado. +#[derive(AutoDefault)] +enum L10nOp { + #[default] + None, + Text(String), + Translate(String), +} + +/// Crea instancias para traducir textos localizados. +/// +/// Cada instancia puede representar: +/// +/// - Un texto puro (`n()`) que no requiere traducción. +/// - Una clave para traducir un texto de las traducciones por defecto de `PageTop` (`l()`). +/// - Una clave para traducir de un conjunto concreto de traducciones (`t()`). +/// +/// Los argumentos dinámicos se añaden mediante `with_arg()` o `with_args()`. +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Texto literal sin traducción. +/// let raw = L10n::n("© 2025 PageTop").get(); +/// +/// // Traducción simple con clave y argumentos. +/// let hello = L10n::l("greeting") +/// .with_arg("name", "Manuel") +/// .markup(); +/// ``` +/// +/// También para traducciones a idiomas concretos. +/// +/// ```rust,ignore +/// // Traducción con clave, conjunto de traducciones y código de idioma a usar. +/// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(LangMatch::langid_or_fallback("it")); +/// ``` +#[derive(AutoDefault)] +pub struct L10n { + op: L10nOp, + #[default(&LOCALES_PAGETOP)] + locales: &'static Locales, + args: HashMap<String, String>, +} + +impl L10n { + /// **n** = *“native”*. Crea una instancia con una cadena literal sin traducción. + pub fn n(text: impl Into<String>) -> Self { + L10n { + op: L10nOp::Text(text.into()), + ..Default::default() + } + } + + /// **l** = *“lookup”*. Crea una instancia para traducir usando una clave de la tabla de + /// traducciones por defecto. + pub fn l(key: impl Into<String>) -> Self { + L10n { + op: L10nOp::Translate(key.into()), + ..Default::default() + } + } + + /// **t** = *“translate”*. Crea una instancia para traducir usando una clave de una tabla de + /// traducciones específica. + pub fn t(key: impl Into<String>, locales: &'static Locales) -> Self { + L10n { + op: L10nOp::Translate(key.into()), + locales, + ..Default::default() + } + } + + /// Añade un argumento `{$arg}` → `value` a la traducción. + pub fn with_arg(mut self, arg: impl Into<String>, value: impl Into<String>) -> Self { + self.args.insert(arg.into(), value.into()); + self + } + + /// Añade varios argumentos a la traducción de una sola vez (p.ej. usando la macro [`hm!`], + /// también vec![("k", "v")], incluso un array de duplas u otras colecciones). + pub fn with_args<I, K, V>(mut self, args: I) -> Self + where + I: IntoIterator<Item = (K, V)>, + K: Into<String>, + V: Into<String>, + { + self.args + .extend(args.into_iter().map(|(k, v)| (k.into(), v.into()))); + self + } + + /// Resuelve la traducción usando el idioma por defecto de la aplicación. Devuelve `None` si no + /// aplica o no encuentra una traducción. + pub fn get(&self) -> Option<String> { + self.using(&DEFAULT_LANGID) + } + + /// Resuelve la traducción usando el [`LanguageIdentifier`] indicado. Devuelve `None` si no + /// aplica o no encuentra una traducción. + pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { + match &self.op { + L10nOp::None => None, + L10nOp::Text(text) => Some(text.to_owned()), + L10nOp::Translate(key) => self.locales.try_lookup_with_args( + langid, + key, + &self.args.iter().fold(HashMap::new(), |mut arg, (k, v)| { + arg.insert(Cow::Owned(k.clone()), v.to_owned().into()); + arg + }), + ), + } + } + + /// Traduce y escapa con el idioma por defecto, devolviendo [`Markup`]. + pub fn markup(&self) -> Markup { + PreEscaped(self.get().unwrap_or_default()) + } + + /// Traduce y escapa con el [`LanguageIdentifier`] indicado, devolviendo [`Markup`]. + pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { + PreEscaped(self.using(langid).unwrap_or_default()) + } +} + +impl fmt::Display for L10n { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let content = match &self.op { + L10nOp::None => String::new(), + L10nOp::Text(text) => text.clone(), + L10nOp::Translate(key) => self.get().unwrap_or_else(|| format!("??<{}>", key)), + }; + write!(f, "{content}") + } +} diff --git a/src/locale/en-US/languages.ftl b/src/locale/en-US/languages.ftl new file mode 100644 index 00000000..1e816605 --- /dev/null +++ b/src/locale/en-US/languages.ftl @@ -0,0 +1,5 @@ +english = English +english_british = English (British) +english_united_states = English (United States) +spanish = Spanish +spanish_spain = Spanish (Spain) diff --git a/src/locale/en-US/test.ftl b/src/locale/en-US/test.ftl new file mode 100644 index 00000000..3c317fcb --- /dev/null +++ b/src/locale/en-US/test.ftl @@ -0,0 +1,11 @@ +test-hello-world = Hello world! +test-hello-user = Hello, { $userName }! +test-shared-photos = + { $userName } { $photoCount -> + [one] added a new photo + *[other] added { $photoCount } new photos + } of { $userGender -> + [male] him and his family + [female] her and her family + *[other] their family + }. diff --git a/src/locale/es-ES/languages.ftl b/src/locale/es-ES/languages.ftl new file mode 100644 index 00000000..ee74ec26 --- /dev/null +++ b/src/locale/es-ES/languages.ftl @@ -0,0 +1,5 @@ +english = Inglés +english_british = Inglés (Gran Bretaña) +english_united_states = Inglés (Estados Unidos) +spanish = Español +spanish_spain = Español (España) diff --git a/src/locale/es-ES/test.ftl b/src/locale/es-ES/test.ftl new file mode 100644 index 00000000..02cd22e3 --- /dev/null +++ b/src/locale/es-ES/test.ftl @@ -0,0 +1,11 @@ +test-hello-world = ¡Hola mundo! +test-hello-user = ¡Hola, { $userName }! +test-shared-photos = + { $userName } { $photoCount -> + [one] ha añadido una nueva foto + *[other] ha añadido { $photoCount } nuevas fotos + } de { $userGender -> + [male] él y su familia + [female] ella y su familia + *[other] la familia + }. diff --git a/src/prelude.rs b/src/prelude.rs index 872447aa..af29d376 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -8,17 +8,25 @@ pub use crate::AutoDefault; // MACROS. +// crate::util +pub use crate::hm; // crate::config pub use crate::include_config; +// crate::locale +pub use crate::include_locales; // API. +pub use crate::util; + pub use crate::global; pub use crate::trace; pub use crate::html::*; +pub use crate::locale::*; + pub use crate::service; pub use crate::app::Application; diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 00000000..07a6abdb --- /dev/null +++ b/src/util.rs @@ -0,0 +1,26 @@ +//! Funciones y macros útiles. + +// MACROS ÚTILES *********************************************************************************** + +#[macro_export] +/// Macro para construir una colección de pares clave-valor. +/// +/// ```rust +/// use pagetop::hm; +/// use std::collections::HashMap; +/// +/// let args:HashMap<&str, String> = hm![ +/// "userName" => "Roberto", +/// "photoCount" => "3", +/// "userGender" => "male", +/// ]; +/// ``` +macro_rules! hm { + ( $($key:expr => $value:expr),* $(,)? ) => {{ + let mut a = std::collections::HashMap::new(); + $( + a.insert($key.into(), $value.into()); + )* + a + }}; +} diff --git a/tests/locale.rs b/tests/locale.rs new file mode 100644 index 00000000..c723cd46 --- /dev/null +++ b/tests/locale.rs @@ -0,0 +1,58 @@ +use pagetop::prelude::*; + +#[pagetop::test] +async fn literal_text() { + let _app = service::test::init_service(Application::new().test()).await; + + let l10n = L10n::n("© 2025 PageTop"); + assert_eq!(l10n.get(), Some("© 2025 PageTop".to_string())); +} + +#[pagetop::test] +async fn translation_without_args() { + let _app = service::test::init_service(Application::new().test()).await; + + let l10n = L10n::l("test-hello-world"); + let translation = l10n.using(LangMatch::langid_or_fallback("es-ES")); + assert_eq!(translation, Some("¡Hola mundo!".to_string())); +} + +#[pagetop::test] +async fn translation_with_args() { + let _app = service::test::init_service(Application::new().test()).await; + + let l10n = L10n::l("test-hello-user").with_arg("userName", "Manuel"); + let translation = l10n.using(LangMatch::langid_or_fallback("es-ES")); + assert_eq!(translation, Some("¡Hola, Manuel!".to_string())); +} + +#[pagetop::test] +async fn translation_with_plural_and_select() { + let _app = service::test::init_service(Application::new().test()).await; + + let l10n = L10n::l("test-shared-photos").with_args(vec![ + ("userName", "Roberto"), + ("photoCount", "3"), + ("userGender", "male"), + ]); + let translation = l10n.using(LangMatch::langid_or_fallback("es-ES")).unwrap(); + assert!(translation.contains("añadido 3 nuevas fotos de él")); +} + +#[pagetop::test] +async fn check_fallback_language() { + let _app = service::test::init_service(Application::new().test()).await; + + let l10n = L10n::l("test-hello-world"); + let translation = l10n.using(LangMatch::langid_or_fallback("xx-YY")); // Fallback a "en-US". + assert_eq!(translation, Some("Hello world!".to_string())); +} + +#[pagetop::test] +async fn check_unknown_key() { + let _app = service::test::init_service(Application::new().test()).await; + + let l10n = L10n::l("non-existent-key"); + let translation = l10n.using(LangMatch::langid_or_fallback("en-US")); + assert_eq!(translation, None); +} From 22faea7d403d2ec531f3f94e709d37d470f958ec Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 9 Jul 2025 20:51:43 +0200 Subject: [PATCH 671/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20para?= =?UTF-8?q?=20manejo=20de=20fechas=20y=20horas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 166 ++++++++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 5 +- src/datetime.rs | 4 ++ src/lib.rs | 2 + src/prelude.rs | 2 + 5 files changed, 165 insertions(+), 14 deletions(-) create mode 100644 src/datetime.rs diff --git a/Cargo.lock b/Cargo.lock index 64073ea1..50660b36 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,6 +224,21 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -335,6 +350,20 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "colored" version = "3.0.0" @@ -346,9 +375,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.11" +version = "0.15.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +checksum = "5b1eb4fb07bc7f012422df02766c7bd5971effb894f573865642f06fa3265440" dependencies = [ "pathdiff", "serde", @@ -367,6 +396,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -736,6 +771,30 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -1047,6 +1106,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -1070,9 +1138,10 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.5" +version = "0.0.6" dependencies = [ "actix-web", + "chrono", "colored", "config", "figlet-rs", @@ -1443,9 +1512,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.9" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" dependencies = [ "serde", ] @@ -1677,14 +1746,15 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.23" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "f271e09bde39ab52250160a67e88577e0559ad77e9085de6e9051a2c4353f8f8" dependencies = [ "serde", "serde_spanned", - "toml_datetime", - "toml_edit", + "toml_datetime 0.7.0", + "toml_parser", + "winnow", ] [[package]] @@ -1692,6 +1762,12 @@ name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" dependencies = [ "serde", ] @@ -1703,9 +1779,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", - "serde", - "serde_spanned", - "toml_datetime", + "toml_datetime 0.6.11", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c1c469eda89749d2230d8156a5969a69ffe0d6d01200581cdc6110674d293e" +dependencies = [ "winnow", ] @@ -2033,6 +2116,65 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index bcf1fd50..c2cfbd59 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.5" +version = "0.0.6" edition = "2021" description = """\ @@ -15,8 +15,9 @@ license.workspace = true authors.workspace = true [dependencies] +chrono = "0.4.41" colored = "3.0.0" -config = { version = "0.15.11", default-features = false, features = ["toml"] } +config = { version = "0.15.13", default-features = false, features = ["toml"] } figlet-rs = "0.1.5" itoa = "1.0.15" serde.workspace = true diff --git a/src/datetime.rs b/src/datetime.rs new file mode 100644 index 00000000..2e8b6229 --- /dev/null +++ b/src/datetime.rs @@ -0,0 +1,4 @@ +//! Soporte a fechas y horas según estándar [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) +//! (basado en [chrono](https://docs.rs/chrono)). + +pub use chrono::prelude::*; diff --git a/src/lib.rs b/src/lib.rs index 07b99347..d7a97e25 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -48,6 +48,8 @@ pub mod trace; pub mod html; // Localización. pub mod locale; +// Soporte a fechas y horas. +pub mod datetime; // Gestión del servidor y servicios web. pub mod service; // Prepara y ejecuta la aplicación. diff --git a/src/prelude.rs b/src/prelude.rs index af29d376..cc38877a 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -27,6 +27,8 @@ pub use crate::html::*; pub use crate::locale::*; +pub use crate::datetime::*; + pub use crate::service; pub use crate::app::Application; From 835aacf1fa52569a4269562adf2c086e1ee77685 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 9 Jul 2025 21:59:09 +0200 Subject: [PATCH 672/853] =?UTF-8?q?=F0=9F=8D=B1=20A=C3=B1ade=20el=20banner?= =?UTF-8?q?=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/banner.png | Bin 0 -> 74026 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/banner.png diff --git a/static/banner.png b/static/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..422e493e0060ac723a13b5e13b8a9d64b2b257d1 GIT binary patch literal 74026 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 literal 0 HcmV?d00001 From 412524018a6551360b7d29a16eefb0b2e38981b1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 9 Jul 2025 22:05:42 +0200 Subject: [PATCH 673/853] =?UTF-8?q?=F0=9F=93=9D=20Actualiza=20el=20banner?= =?UTF-8?q?=20en=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ src/lib.rs | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 159aabe0..94062a0e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ <div align="center"> +<img src="https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/banner.png" /> + <h1>PageTop</h1> <p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> @@ -26,6 +28,13 @@ async fn main() -> std::io::Result<()> { ``` +# 🚧 Advertencia + +`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos +hasta que se libere la versión **1.0.0**. + + # 📜 Licencia El código está disponible bajo una doble licencia: diff --git a/src/lib.rs b/src/lib.rs index d7a97e25..4519c440 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ //! <div align="center"> //! -//! <img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/static/banner.png" /> +//! <img src="https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/banner.png" /> //! //! <h1>PageTop</h1> //! From 8bc1d00cb9b9a74f6a80e8e6768f9ff4f3872233 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 10 Jul 2025 22:51:47 +0200 Subject: [PATCH 674/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20est=C3=A1ticos?= =?UTF-8?q?=20y=20SCSS=20compilados=20para=20binarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Módulo auxiliar para ejecutar durante la compilación de proyectos de PageTop para incluir archivos estáticos o archivos SCSS compilados en los binarios de los proyectos. --- Cargo.toml | 15 +- helpers/pagetop-build/Cargo.toml | 20 +++ helpers/pagetop-build/README.md | 36 +++++ helpers/pagetop-build/src/lib.rs | 259 +++++++++++++++++++++++++++++++ 4 files changed, 323 insertions(+), 7 deletions(-) create mode 100644 helpers/pagetop-build/Cargo.toml create mode 100644 helpers/pagetop-build/README.md create mode 100644 helpers/pagetop-build/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index c2cfbd59..a91964bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.6" +version = "0.0.7" edition = "2021" description = """\ @@ -20,7 +20,7 @@ colored = "3.0.0" config = { version = "0.15.13", default-features = false, features = ["toml"] } figlet-rs = "0.1.5" itoa = "1.0.15" -serde.workspace = true +paste = { package = "pastey", version = "0.1.0" } substring = "1.4.5" terminal_size = "0.4.2" @@ -33,14 +33,18 @@ fluent-templates = "0.13.0" unic-langid = { version = "0.9.6", features = ["macros"] } actix-web = "4.11.0" +static-files.workspace = true -pagetop-macros.workspace = true +serde = { version = "1.0", features = ["derive"] } + +pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } [workspace] resolver = "2" members = [ + "helpers/pagetop-build", "helpers/pagetop-macros", ] @@ -51,7 +55,4 @@ license = "MIT OR Apache-2.0" authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] -serde = { version = "1.0", features = ["derive"] } - -# Helpers -pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } +static-files = "0.2.5" diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml new file mode 100644 index 00000000..4b947b3e --- /dev/null +++ b/helpers/pagetop-build/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "pagetop-build" +version = "0.0.1" +edition = "2021" + +description = """\ + Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el \ + binario de un proyecto PageTop.\ +""" +categories = ["development-tools::build-utils", "web-programming"] +keywords = ["pagetop", "build", "assets", "resources", "static"] + +repository.workspace = true +homepage.workspace = true +license.workspace = true +authors.workspace = true + +[dependencies] +grass = "0.13.4" +static-files.workspace = true diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md new file mode 100644 index 00000000..9f912e99 --- /dev/null +++ b/helpers/pagetop-build/README.md @@ -0,0 +1,36 @@ +<div align="center"> + +<h1>PageTop Build</h1> + +<p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) + +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# 🚧 Advertencia + +`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos +hasta que se libere la versión **1.0.0**. + + +# 📜 Licencia + +El código está disponible bajo una doble licencia: + + * **Licencia MIT** + ([LICENSE-MIT](LICENSE-MIT) o también https://opensource.org/licenses/MIT) + + * **Licencia Apache, Versión 2.0** + ([LICENSE-APACHE](LICENSE-APACHE) o también https://www.apache.org/licenses/LICENSE-2.0) + +Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el estándar de facto en +el ecosistema Rust. diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs new file mode 100644 index 00000000..c48b21fc --- /dev/null +++ b/helpers/pagetop-build/src/lib.rs @@ -0,0 +1,259 @@ +//! <div align="center"> +//! +//! <h1>PageTop Build</h1> +//! +//! <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> +//! +//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! +//! </div> +//! +//! ## Sobre PageTop +//! +//! [PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la +//! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles +//! y configurables, basadas en HTML, CSS y JavaScript. +//! +//! +//! # ⚡️ Guía rápida +//! +//! Añadir en el archivo `Cargo.toml` del proyecto: +//! +//! ```toml +//! [build-dependencies] +//! pagetop-build = { ... } +//! ``` +//! +//! Y crear un archivo `build.rs` a la altura de `Cargo.toml` para indicar cómo se van a incluir los +//! archivos estáticos o cómo se van a compilar los archivos SCSS para el proyecto. Casos de uso: +//! +//! ## Incluir archivos estáticos desde un directorio +//! +//! Hay que preparar una carpeta en el proyecto con todos los archivos que se quieren incluir, por +//! ejemplo `static`, y añadir el siguiente código en `build.rs` para crear el conjunto de recursos: +//! +//! ```rust,no_run +//! use pagetop_build::StaticFilesBundle; +//! +//! fn main() -> std::io::Result<()> { +//! StaticFilesBundle::from_dir("./static", None) +//! .with_name("guides") +//! .build() +//! } +//! ``` +//! +//! Si es necesario, se puede añadir un filtro para seleccionar archivos específicos de la carpeta, +//! por ejemplo: +//! +//! ```rust,no_run +//! use pagetop_build::StaticFilesBundle; +//! use std::path::Path; +//! +//! fn main() -> std::io::Result<()> { +//! fn only_pdf_files(path: &Path) -> bool { +//! // Selecciona únicamente los archivos con extensión `.pdf`. +//! path.extension().map_or(false, |ext| ext == "pdf") +//! } +//! +//! StaticFilesBundle::from_dir("./static", Some(only_pdf_files)) +//! .with_name("guides") +//! .build() +//! } +//! ``` +//! +//! ## Compilar archivos SCSS a CSS +//! +//! Se puede compilar un archivo SCSS, que podría importar otros a su vez, para preparar un recurso +//! con el archivo CSS minificado obtenido. Por ejemplo: +//! +//! ```rust,no_run +//! use pagetop_build::StaticFilesBundle; +//! +//! fn main() -> std::io::Result<()> { +//! StaticFilesBundle::from_scss("./styles/main.scss", "styles.min.css") +//! .with_name("main_styles") +//! .build() +//! } +//! ``` +//! +//! Este código compila el archivo `main.scss` de la carpeta `static` del proyecto, y prepara un +//! recurso llamado `main_styles` que contiene el archivo `styles.min.css` obtenido. +//! +//! +//! # 📦 Módulos generados +//! +//! Cada conjunto de recursos [`StaticFilesBundle`] genera un archivo en el directorio estándar +//! [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts) +//! donde se incluyen los recursos necesarios para compilar el proyecto. Por ejemplo, para +//! `with_name("guides")` se crea un archivo llamado `guides.rs`. +//! +//! No hay ningún problema en generar más de un conjunto de recursos para cada proyecto. +//! +//! Normalmente no habrá que acceder a estos módulos; bastará con incluirlos en el proyecto con +//! [`include_files!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files.html), y luego con +//! [`include_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files_service.html) +//! configurar un servicio web para servir los recursos desde la ruta indicada: +//! +//! ```rust,ignore +//! use pagetop::prelude::*; +//! +//! include_files!(guides); +//! +//! pub struct MyExtension; +//! +//! impl ExtensionTrait for MyExtension { +//! // Servicio web que publica los recursos de `guides` en `/ruta/a/guides`. +//! fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { +//! include_files_service!(scfg, guides => "/ruta/a/guides"); +//! } +//! } +//! ``` +//! +//! También se puede acceder al conjunto de recursos declarando un `HashMap` estático global: +//! +//! ```rust,ignore +//! include_files!(HM_GUIDES => guides); +//! ``` + +use grass::{from_path, Options, OutputStyle}; +use static_files::{resource_dir, ResourceDir}; + +use std::fs::{create_dir_all, remove_dir_all, File}; +use std::io::Write; +use std::path::Path; + +/// Prepara un conjunto de recursos para ser incluidos en el binario del proyecto utilizando +/// [static_files](https://docs.rs/static-files/). +pub struct StaticFilesBundle { + resource_dir: ResourceDir, +} + +impl StaticFilesBundle { + /// Prepara el conjunto de recursos con los archivos de un directorio. Opcionalmente se puede + /// aplicar un filtro para seleccionar un subconjunto de los archivos. + /// + /// # Argumentos + /// + /// * `dir` - Directorio que contiene los archivos. + /// * `filter` - Una función opcional para aceptar o no un archivo según su ruta. + /// + /// # Ejemplo + /// + /// ```rust,no_run + /// use pagetop_build::StaticFilesBundle; + /// use std::path::Path; + /// + /// fn main() -> std::io::Result<()> { + /// fn only_images(path: &Path) -> bool { + /// matches!( + /// path.extension().and_then(|ext| ext.to_str()), + /// Some("jpg" | "png" | "gif") + /// ) + /// } + /// + /// StaticFilesBundle::from_dir("./static", Some(only_images)) + /// .with_name("images") + /// .build() + /// } + /// ``` + pub fn from_dir(dir: &'static str, filter: Option<fn(p: &Path) -> bool>) -> Self { + let mut resource_dir = resource_dir(dir); + + // Aplica el filtro si está definido. + if let Some(f) = filter { + resource_dir.with_filter(f); + } + + // Identifica el directorio temporal de recursos. + StaticFilesBundle { resource_dir } + } + + /// Prepara un recurso CSS minimizado a partir de la compilación de un archivo SCSS (que puede a + /// su vez importar otros archivos SCSS). + /// + /// # Argumentos + /// + /// * `path` - Archivo SCSS a compilar. + /// * `target_name` - Nombre para el archivo CSS. + /// + /// # Ejemplo + /// + /// ```rust,no_run + /// use pagetop_build::StaticFilesBundle; + /// + /// fn main() -> std::io::Result<()> { + /// StaticFilesBundle::from_scss("./bootstrap/scss/main.scss", "bootstrap.min.css") + /// .with_name("bootstrap_css") + /// .build() + /// } + /// ``` + pub fn from_scss<P>(path: P, target_name: &str) -> Self + where + P: AsRef<Path>, + { + // Crea un directorio temporal para el archivo CSS. + let out_dir = std::env::var("OUT_DIR").unwrap(); + let temp_dir = Path::new(&out_dir).join("from_scss_files"); + + // Limpia el directorio temporal de ejecuciones previas, si existe. + if temp_dir.exists() { + remove_dir_all(&temp_dir).unwrap_or_else(|e| { + panic!( + "Failed to clean temporary directory `{}`: {e}", + temp_dir.display() + ); + }); + } + create_dir_all(&temp_dir).unwrap_or_else(|e| { + panic!( + "Failed to create temporary directory `{}`: {e}", + temp_dir.display() + ); + }); + + // Compila SCSS a CSS. + let css_content = from_path( + path.as_ref(), + &Options::default().style(OutputStyle::Compressed), + ) + .unwrap_or_else(|e| { + panic!( + "Failed to compile SCSS file `{}`: {e}", + path.as_ref().display(), + ) + }); + + // Guarda el archivo CSS compilado en el directorio temporal. + let css_path = temp_dir.join(target_name); + File::create(&css_path) + .expect(&format!( + "Failed to create CSS file `{}`", + css_path.display() + )) + .write_all(css_content.as_bytes()) + .expect(&format!( + "Failed to write CSS content to `{}`", + css_path.display() + )); + + // Identifica el directorio temporal de recursos. + StaticFilesBundle { + resource_dir: resource_dir(temp_dir.to_str().unwrap()), + } + } + + /// Asigna un nombre al conjunto de recursos. + pub fn with_name(mut self, name: &'static str) -> Self { + let out_dir = std::env::var("OUT_DIR").unwrap(); + let filename = Path::new(&out_dir).join(format!("{name}.rs")); + self.resource_dir.with_generated_filename(filename); + self.resource_dir.with_module_name(format!("bundle_{name}")); + self.resource_dir.with_generated_fn(name); + self + } + + /// Contruye finalmente el conjunto de recursos para incluir en el binario de la aplicación. + pub fn build(self) -> std::io::Result<()> { + self.resource_dir.build() + } +} From f37a128044ef33fe0d2c479e5b1af76d621bb18c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 11 Jul 2025 22:17:59 +0200 Subject: [PATCH 675/853] =?UTF-8?q?=F0=9F=9A=A9=20A=C3=B1ade=20feature=20"?= =?UTF-8?q?testing"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Permite desactivar trazas y registro de eventos al ejecutar tests. - Añade opción de configuración para activar o desactivar las trazas. --- .cargo/config.toml | 3 + Cargo.lock | 385 +++++++++++++++++++++++++++++- Cargo.toml | 9 +- README.md | 16 ++ helpers/pagetop-macros/src/lib.rs | 4 +- src/global.rs | 3 + src/trace.rs | 8 + 7 files changed, 416 insertions(+), 12 deletions(-) create mode 100644 .cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000..d29b0de3 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[alias] +ts = ["test", "--features", "testing"] # cargo ts +tw = ["test", "--workspace", "--features", "testing"] # cargo tw diff --git a/Cargo.lock b/Cargo.lock index 50660b36..24c9616f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,7 +49,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand", + "rand 0.9.1", "sha1", "smallvec", "tokio", @@ -200,6 +200,18 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -224,6 +236,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -239,6 +257,56 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -350,6 +418,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "change-detection" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "159fa412eae48a1d94d0b9ecdb85c97ce56eb2a347c62394d3fdbf221adabc1a" +dependencies = [ + "path-matchers", + "path-slash", +] + [[package]] name = "chrono" version = "0.4.41" @@ -364,6 +442,45 @@ dependencies = [ "windows-link", ] +[[package]] +name = "clap" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "codemap" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "colored" version = "3.0.0" @@ -515,6 +632,12 @@ dependencies = [ "syn", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -540,6 +663,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "figlet-rs" version = "0.1.5" @@ -692,6 +821,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + [[package]] name = "getrandom" version = "0.3.3" @@ -710,6 +852,12 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + [[package]] name = "globset" version = "0.4.16" @@ -723,6 +871,31 @@ dependencies = [ "regex-syntax 0.8.5", ] +[[package]] +name = "grass" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a68216437ef68f0738e48d6c7bb9e6e6a92237e001b03d838314b068f33c94" +dependencies = [ + "clap", + "getrandom 0.2.16", + "grass_compiler", +] + +[[package]] +name = "grass_compiler" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d9e3df7f0222ce5184154973d247c591d9aadc28ce7a73c6cd31100c9facff6" +dependencies = [ + "codemap", + "indexmap", + "lasso", + "once_cell", + "phf", + "rand 0.8.5", +] + [[package]] name = "h2" version = "0.3.26" @@ -742,6 +915,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.15.4" @@ -931,7 +1114,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.4", ] [[package]] @@ -953,6 +1136,12 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" version = "1.0.15" @@ -965,7 +1154,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom", + "getrandom 0.3.3", "libc", ] @@ -985,6 +1174,15 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1063,6 +1261,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1130,6 +1338,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "overload" version = "0.1.1" @@ -1138,18 +1352,22 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.6" +version = "0.0.8" dependencies = [ "actix-web", "chrono", "colored", "config", + "dunce", "figlet-rs", "fluent-templates", "itoa", "pagetop-macros", + "pastey", "serde", + "static-files", "substring", + "tempfile", "terminal_size", "tracing", "tracing-actix-web", @@ -1158,6 +1376,14 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "pagetop-build" +version = "0.0.1" +dependencies = [ + "grass", + "static-files", +] + [[package]] name = "pagetop-macros" version = "0.0.3" @@ -1192,6 +1418,27 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "pastey" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a8cb46bdc156b1c90460339ae6bfd45ba0394e5effbaa640badb4987fdc261" + +[[package]] +name = "path-matchers" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36cd9b72a47679ec193a5f0229d9ab686b7bd45e1fbc59ccf953c9f3d83f7b2b" +dependencies = [ + "glob", +] + +[[package]] +name = "path-slash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498a099351efa4becc6a19c72aa9270598e8fd274ca47052e37455241c88b696" + [[package]] name = "pathdiff" version = "0.2.3" @@ -1204,6 +1451,48 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -1317,14 +1606,35 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + [[package]] name = "rand" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ - "rand_chacha", - "rand_core", + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", ] [[package]] @@ -1334,7 +1644,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", ] [[package]] @@ -1343,7 +1662,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom", + "getrandom 0.3.3", ] [[package]] @@ -1566,6 +1885,12 @@ dependencies = [ "libc", ] +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.10" @@ -1603,6 +1928,23 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static-files" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9c425c07353535ef55b45420f5a8b0a397cd9bc3d7e5236497ca0d90604aa9b" +dependencies = [ + "change-detection", + "mime_guess", + "path-slash", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "substring" version = "1.4.5" @@ -1634,6 +1976,19 @@ dependencies = [ "syn", ] +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "terminal_size" version = "0.4.2" @@ -1950,6 +2305,12 @@ dependencies = [ "unic-langid-impl", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.18" @@ -1979,13 +2340,19 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom", + "getrandom 0.3.3", "js-sys", "wasm-bindgen", ] diff --git a/Cargo.toml b/Cargo.toml index a91964bb..3ef84687 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.7" +version = "0.0.8" edition = "2021" description = """\ @@ -39,6 +39,13 @@ serde = { version = "1.0", features = ["derive"] } pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } +[features] +default = [] +testing = [] + +[dev-dependencies] +tempfile = "3.20.0" + [workspace] diff --git a/README.md b/README.md index 94062a0e..6b4aff0c 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,22 @@ async fn main() -> std::io::Result<()> { ``` +# 🧪 Pruebas + +Para simplificar el flujo de trabajo, el repositorio incluye varios **alias de Cargo** declarados en +`.cargo/config.toml`. Basta con ejecutarlos desde la raíz del proyecto: + +| Comando | Descripción | +| ------- | ----------- | +| `cargo ts` | Ejecuta los tests de `pagetop` (*unit + integration*) con la *feature* `testing`. | +| `cargo ts --test util` | Lanza sólo las pruebas de integración del módulo `util`. | +| `cargo tw` | Ejecuta los tests de **todos los paquetes** del *workspace*. | + +> **Nota** +> Estos alias ya compilan con la configuración adecuada. No requieren `--no-default-features`. +> Si quieres **activar** las trazas del registro de eventos entonces usa simplemente `cargo test`. + + # 🚧 Advertencia `PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index eecebed3..776903c0 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -45,7 +45,7 @@ pub fn derive_auto_default(input: TokenStream) -> TokenStream { /// Define una función `main` asíncrona como punto de entrada de `PageTop`. /// -/// # Ejemplos +/// # Ejemplo /// /// ```rust,ignore /// #[pagetop::main] @@ -66,7 +66,7 @@ pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { /// Define funciones de prueba asíncronas para usar con `PageTop`. /// -/// # Ejemplos +/// # Ejemplo /// /// ```rust,ignore /// #[pagetop::test] diff --git a/src/global.rs b/src/global.rs index a90aa86c..c3332d39 100644 --- a/src/global.rs +++ b/src/global.rs @@ -12,6 +12,7 @@ include_config!(SETTINGS: Settings => [ "app.startup_banner" => "Slant", // [log] + "log.enabled" => true, "log.tracing" => "Info", "log.rolling" => "Stdout", "log.path" => "log", @@ -52,6 +53,8 @@ pub struct App { #[derive(Debug, Deserialize)] /// Sección `[log]` de la configuración. Forma parte de [`Settings`]. pub struct Log { + /// Gestión de trazas y registro de eventos activado (`true`) o desactivado (`false`). + pub enabled: bool, /// Opciones, o combinación de opciones separadas por comas, para filtrar las trazas: *"Error"*, /// *"Warn"*, *"Info"*, *"Debug"* o *"Trace"*. /// Ejemplo: "Error,actix_server::builder=Info,tracing_actix_web=Debug". diff --git a/src/trace.rs b/src/trace.rs index bd8ce56d..c57c6a3c 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -35,6 +35,14 @@ use std::sync::LazyLock; /// envíen antes de finalizar la ejecución. #[rustfmt::skip] pub(crate) static TRACING: LazyLock<WorkerGuard> = LazyLock::new(|| { + if !global::SETTINGS.log.enabled || cfg!(test) || cfg!(feature = "testing") { + // Tracing desactivado, se instala un subscriber nulo. + tracing::subscriber::set_global_default(tracing::subscriber::NoSubscriber::default()) + .expect("Failed to install global NoSubscriber (tracing disabled)"); + let (_, guard) = tracing_appender::non_blocking(std::io::sink()); + return guard; + } + let env_filter = EnvFilter::try_new(&global::SETTINGS.log.tracing) .unwrap_or_else(|_| EnvFilter::new("Info")); From 4eadc8b257a0951bc327f27a6368e9ab5ebbecb0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Jul 2025 06:35:09 +0200 Subject: [PATCH 676/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20gesti=C3=B3n?= =?UTF-8?q?=20de=20recursos=20en=20binario=20o=20de=20disco?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Añade dosnuevas macros `include_files` y `include_files_service` para incluir los recursos preparados con `pagetop-build`. - Añade nueva función útil `absolute_dir` y sus tests correspondientes. --- Cargo.lock | 97 +++++++++++++++++++++++++++++++++---- Cargo.toml | 4 +- src/lib.rs | 3 ++ src/prelude.rs | 4 +- src/service.rs | 126 ++++++++++++++++++++++++++++++++++++++++++++++++- src/util.rs | 49 +++++++++++++++++++ tests/util.rs | 70 +++++++++++++++++++++++++++ 7 files changed, 340 insertions(+), 13 deletions(-) create mode 100644 tests/util.rs diff --git a/Cargo.lock b/Cargo.lock index 24c9616f..659ed18e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,6 +19,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "actix-files" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0773d59061dedb49a8aed04c67291b9d8cf2fe0b60130a381aab53c6dd86e9be" +dependencies = [ + "actix-http", + "actix-service", + "actix-utils", + "actix-web", + "bitflags", + "bytes", + "derive_more 0.99.20", + "futures-core", + "http-range", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "v_htmlescape", +] + [[package]] name = "actix-http" version = "3.11.0" @@ -34,7 +57,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more", + "derive_more 2.0.1", "encoding_rs", "flate2", "foldhash", @@ -149,7 +172,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more", + "derive_more 2.0.1", "encoding_rs", "foldhash", "futures-core", @@ -185,6 +208,18 @@ dependencies = [ "syn", ] +[[package]] +name = "actix-web-static-files" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adf6d1ef6d7a60e084f9e0595e2a5234abda14e76c105ecf8e2d0e8800c41a1f" +dependencies = [ + "actix-web", + "derive_more 0.99.20", + "futures-util", + "static-files", +] + [[package]] name = "addr2line" version = "0.24.2" @@ -502,6 +537,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "cookie" version = "0.16.2" @@ -590,6 +631,19 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + [[package]] name = "derive_more" version = "2.0.1" @@ -632,12 +686,6 @@ dependencies = [ "syn", ] -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - [[package]] name = "encoding_rs" version = "0.8.35" @@ -809,6 +857,7 @@ dependencies = [ "futures-task", "pin-project-lite", "pin-utils", + "slab", ] [[package]] @@ -942,6 +991,12 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + [[package]] name = "httparse" version = "1.10.1" @@ -1352,13 +1407,14 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.8" +version = "0.0.9" dependencies = [ + "actix-files", "actix-web", + "actix-web-static-files", "chrono", "colored", "config", - "dunce", "figlet-rs", "fluent-templates", "itoa", @@ -1742,6 +1798,15 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.0.7" @@ -1797,6 +1862,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + [[package]] name = "serde" version = "1.0.219" @@ -2357,6 +2428,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" + [[package]] name = "valuable" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index 3ef84687..851c620d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.8" +version = "0.0.9" edition = "2021" description = """\ @@ -33,6 +33,8 @@ fluent-templates = "0.13.0" unic-langid = { version = "0.9.6", features = ["macros"] } actix-web = "4.11.0" +actix-web-files = { package = "actix-files", version = "0.6.6" } +actix-web-static-files = "4.0.1" static-files.workspace = true serde = { version = "1.0", features = ["derive"] } diff --git a/src/lib.rs b/src/lib.rs index 4519c440..800f7830 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,6 +34,9 @@ pub use pagetop_macros::{html, main, test, AutoDefault}; +/// Representa un conjunto de recursos asociados a `$STATIC` en [`include_files!`]. +pub type StaticResources = std::collections::HashMap<&'static str, static_files::Resource>; + // API ********************************************************************************************* // Funciones y macros útiles. diff --git a/src/prelude.rs b/src/prelude.rs index cc38877a..c27b997e 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -4,7 +4,7 @@ pub use crate::{html, main, test}; -pub use crate::AutoDefault; +pub use crate::{AutoDefault, StaticResources}; // MACROS. @@ -14,6 +14,8 @@ pub use crate::hm; pub use crate::include_config; // crate::locale pub use crate::include_locales; +// crate::service +pub use crate::{include_files, include_files_service}; // API. diff --git a/src/service.rs b/src/service.rs index 90b13758..1adaead8 100644 --- a/src/service.rs +++ b/src/service.rs @@ -5,5 +5,129 @@ pub use actix_web::dev::Server; pub use actix_web::dev::ServiceFactory as Factory; pub use actix_web::dev::ServiceRequest as Request; pub use actix_web::dev::ServiceResponse as Response; -pub use actix_web::{http, rt, test}; +pub use actix_web::{http, rt, web}; pub use actix_web::{App, Error, HttpServer}; + +#[doc(hidden)] +pub use actix_web::test; + +/// Incluye en código un conjunto de recursos previamente preparado con `build.rs`. +/// +/// # Formas de uso +/// +/// * `include_files!(media)` - Incluye el conjunto de recursos llamado `media`. Normalmente se +/// usará esta forma. +/// +/// * `include_files!(BLOG_HM => blog)` - Asigna a la variable estática `BLOG_HM` un conjunto de +/// recursos llamado `blog`. +/// +/// # Argumentos +/// +/// * `$bundle` – Nombre del conjunto de recursos generado por `build.rs` (consultar +/// [`pagetop_build`](https://docs.rs/pagetop-build)). +/// * `$STATIC` – Identificador para la variable estática de tipo +/// [`StaticResources`](`crate::StaticResources`). +/// +/// # Ejemplos +/// +/// ```rust,ignore +/// include_files!(assets); // Uso habitual. +/// +/// include_files!(STATIC_ASSETS => assets); +/// ``` +#[macro_export] +macro_rules! include_files { + // Forma 1: incluye un conjunto de recursos por nombre. + ( $bundle:ident ) => { + $crate::util::paste! { + mod [<static_files_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + } + }; + // Forma 2: asigna a una variable estática $STATIC un conjunto de recursos. + ( $STATIC:ident => $bundle:ident ) => { + $crate::util::paste! { + mod [<static_files_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + pub static $STATIC: std::sync::LazyLock<StaticResources> = std::sync::LazyLock::new( + [<static_files_ $bundle>]::$bundle + ); + } + }; +} + +/// Configura un servicio web para publicar los recursos embebidos con [`include_files!`]. +/// +/// El código expandido de la macro decide durante el arranque de la aplicación si debe servir los +/// archivos de los recursos embebidos o directamente desde el sistema de ficheros, si se ha +/// indicado una ruta válida a un directorio de recursos. +/// +/// # Argumentos +/// +/// * `$scfg` – Instancia de [`ServiceConfig`](crate::service::web::ServiceConfig) donde aplicar la +/// configuración del servicio web. +/// * `$bundle` – Nombre del conjunto de recursos incluido con [`include_files!`]. +/// * `$route` – Ruta URL de origen desde la que se servirán los archivos. +/// * `[ $root, $relative ]` *(opcional)* – Directorio raíz y ruta relativa para construir la ruta +/// absoluta donde buscar los archivos en el sistema de ficheros (ver +/// [`absolute_dir`](crate::util::absolute_dir)). Si no existe, se usarán los recursos embebidos. +/// +/// # Ejemplos +/// +/// ```rust,ignore +/// use pagetop::prelude::*; +/// +/// include_files!(assets); +/// +/// pub struct MyExtension; +/// +/// impl ExtensionTrait for MyExtension { +/// fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { +/// include_files_service!(scfg, assets => "/public"); +/// } +/// } +/// ``` +/// +/// Y para buscar los recursos en el sistema de ficheros (si existe la ruta absoluta): +/// +/// ```rust,ignore +/// include_files_service!(cfg, assets => "/public", ["/var/www", "assets"]); +/// +/// // También desde el directorio actual de ejecución. +/// include_files_service!(cfg, assets => "/public", ["", "static"]); +/// ``` +#[macro_export] +macro_rules! include_files_service { + ( $scfg:ident, $bundle:ident => $route:expr $(, [$root:expr, $relative:expr])? ) => {{ + $crate::util::paste! { + let span = $crate::trace::debug_span!("Configuring static files ", path = $route); + let _ = span.in_scope(|| { + // Determina si se sirven recursos embebidos (`true`) o desde disco (`false`). + #[allow(unused_mut)] + let mut serve_embedded:bool = true; + $( + // Si `$root` y `$relative` no están vacíos, se comprueba la ruta absoluta. + if !$root.is_empty() && !$relative.is_empty() { + if let Ok(absolute) = $crate::util::absolute_dir($root, $relative) { + // Servimos directamente desde el sistema de ficheros. + $scfg.service($crate::service::ActixFiles::new( + $route, + absolute, + ).show_files_listing()); + serve_embedded = false + } + } + )? + // Si no se localiza el directorio, se exponen entonces los recursos embebidos. + if serve_embedded { + $scfg.service($crate::service::ResourceFiles::new( + $route, + [<static_files_ $bundle>]::$bundle(), + )); + } + }); + } + }}; +} diff --git a/src/util.rs b/src/util.rs index 07a6abdb..7a48001f 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,7 +1,56 @@ //! Funciones y macros útiles. +use crate::trace; + +use std::io; +use std::path::{Path, PathBuf}; + + +/// Devuelve la ruta absoluta a un directorio existente. +/// +/// * Si `relative_path` es una ruta absoluta, entonces se ignora `root_path`. +/// * Si la ruta final es relativa, se convierte en absoluta respecto al directorio actual. +/// * Devuelve error si la ruta no existe o no es un directorio. +/// +/// # Ejemplo +/// +/// ```rust,no_run +/// use pagetop::prelude::*; +/// +/// let root = "/home/user"; +/// let rel = "documents"; +/// println!("{:#?}", util::absolute_dir(root, rel)); +/// ``` +pub fn absolute_dir<P, Q>(root_path: P, relative_path: Q) -> io::Result<PathBuf> +where + P: AsRef<Path>, + Q: AsRef<Path>, +{ + // Une ambas rutas: + // - Si `relative_path` es absoluta, el `join` la devuelve tal cual, descartando `root_path`. + // - Si el resultado es aún relativo, lo será respecto al directorio actual. + let candidate = root_path.as_ref().join(relative_path.as_ref()); + + // Resuelve `.`/`..`, enlaces simbólicos y obtiene la ruta absoluta en un único paso. + let absolute_dir = candidate.canonicalize()?; + + // Asegura que realmente es un directorio existente. + if absolute_dir.is_dir() { + Ok(absolute_dir) + } else { + Err({ + let msg = format!("Path \"{}\" is not a directory", absolute_dir.display()); + trace::warn!(msg); + io::Error::new(io::ErrorKind::InvalidInput, msg) + }) + } +} + // MACROS ÚTILES *********************************************************************************** +#[doc(hidden)] +pub use paste::paste; + #[macro_export] /// Macro para construir una colección de pares clave-valor. /// diff --git a/tests/util.rs b/tests/util.rs new file mode 100644 index 00000000..2d52064e --- /dev/null +++ b/tests/util.rs @@ -0,0 +1,70 @@ +use pagetop::prelude::*; + +use std::{fs, io}; +use tempfile::TempDir; + +#[cfg(unix)] +mod unix { + use super::*; + + #[pagetop::test] + async fn ok_absolute_dir() -> io::Result<()> { + let _app = service::test::init_service(Application::new().test()).await; + + // /tmp/<rand>/sub + let td = TempDir::new()?; + let root = td.path(); + let sub = root.join("sub"); + fs::create_dir(&sub)?; + + let abs = util::absolute_dir(root, "sub")?; + assert_eq!(abs, std::fs::canonicalize(&sub)?); + Ok(()) + } + + #[pagetop::test] + async fn error_not_a_directory() -> io::Result<()> { + let _app = service::test::init_service(Application::new().test()).await; + + let td = TempDir::new()?; + let file = td.path().join("foo.txt"); + fs::write(&file, b"data")?; + + let err = util::absolute_dir(td.path(), "foo.txt").unwrap_err(); + assert_eq!(err.kind(), io::ErrorKind::InvalidInput); + Ok(()) + } +} + +#[cfg(windows)] +mod windows { + use super::*; + + #[pagetop::test] + async fn ok_absolute_dir() -> io::Result<()> { + let _app = service::test::init_service(Application::new().test()).await; + + // C:\Users\…\Temp\… + let td = TempDir::new()?; + let root = td.path(); + let sub = root.join("sub"); + fs::create_dir(&sub)?; + + let abs = util::absolute_dir(root, sub.as_path())?; + assert_eq!(abs, std::fs::canonicalize(&sub)?); + Ok(()) + } + + #[pagetop::test] + async fn error_not_a_directory() -> io::Result<()> { + let _app = service::test::init_service(Application::new().test()).await; + + let td = TempDir::new()?; + let file = td.path().join("foo.txt"); + fs::write(&file, b"data")?; + + let err = util::absolute_dir(td.path(), "foo.txt").unwrap_err(); + assert_eq!(err.kind(), io::ErrorKind::InvalidInput); + Ok(()) + } +} From 2b1b31fbf004e227e76162f5b05bb657fde568ca Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 12 Jul 2025 12:04:37 +0200 Subject: [PATCH 677/853] =?UTF-8?q?=E2=9C=A8=20(macros):=20A=C3=B1ade=20ma?= =?UTF-8?q?cro=20`builder=5Ffn`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 4 +- Cargo.toml | 2 +- helpers/pagetop-macros/Cargo.toml | 2 +- helpers/pagetop-macros/src/lib.rs | 157 +++++++++++++++++++++++++++++- src/lib.rs | 2 +- src/prelude.rs | 2 +- 6 files changed, 161 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 659ed18e..49fe0074 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1407,7 +1407,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.9" +version = "0.0.10" dependencies = [ "actix-files", "actix-web", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.0.3" +version = "0.0.4" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 851c620d..8212f62b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.9" +version = "0.0.10" edition = "2021" description = """\ diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 9f914bfd..070e7784 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.3" +version = "0.0.4" edition = "2021" description = """\ diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 776903c0..25105c2f 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -18,8 +18,8 @@ mod maud; mod smart_default; use proc_macro::TokenStream; -use quote::quote; -use syn::{parse_macro_input, DeriveInput}; +use quote::{quote, quote_spanned}; +use syn::{parse_macro_input, spanned::Spanned, DeriveInput, ItemFn}; /// Macro para escribir plantillas HTML (basada en [Maud](https://docs.rs/maud)). #[proc_macro] @@ -43,6 +43,159 @@ pub fn derive_auto_default(input: TokenStream) -> TokenStream { } } +/// Macro (*attribute*) que asocia un método *builder* `with_` con un método `alter_`. +/// +/// La macro añade automáticamente un método `alter_` para modificar la instancia actual usando +/// `&mut self`, y redefine el método *builder* `with_`, que consume la instancia (`mut self`), para +/// delegar la lógica de la modificación al nuevo método `alter_`, reutilizando así la misma +/// implementación. +/// +/// Esta macro emitirá un error en tiempo de compilación si la función anotada no cumple con la +/// firma esperada para el método *builder*: `pub fn with_...(mut self, ...) -> Self`. +/// +/// # Ejemplos +/// +/// Si defines un método `with_` como este: +/// +/// ```rust,ignore +/// #[builder_fn] +/// pub fn with_example(mut self, value: impl Into<String>) -> Self { +/// self.value = Some(value.into()); +/// self +/// } +/// ``` +/// +/// la macro generará automáticamente el siguiente método `alter_`: +/// +/// ```rust,ignore +/// pub fn alter_example(&mut self, value: impl Into<String>) -> &mut Self { +/// self.value = Some(value.into()); +/// self +/// } +/// ``` +/// +/// y reescribirá el método `with_` para delegar la modificación al método `alter_`: +/// +/// ```rust,ignore +/// pub fn with_example(mut self, value: impl Into<String>) -> Self { +/// self.alter_example(value); +/// self +/// } +/// ``` +/// +/// Así, cada método *builder* `with_...()` generará automáticamente su correspondiente método +/// `alter_...()`, que permitirá más adelante modificar instancias existentes. +#[proc_macro_attribute] +pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { + let fn_with = parse_macro_input!(item as ItemFn); + let fn_with_name = fn_with.sig.ident.clone(); + let fn_with_name_str = fn_with.sig.ident.to_string(); + + // Valida el nombre del método. + if !fn_with_name_str.starts_with("with_") { + let expanded = quote_spanned! { + fn_with.sig.ident.span() => + compile_error!("expected a \"pub fn with_...(mut self, ...) -> Self\" method"); + }; + return expanded.into(); + } + // Valida que el método sea público. + if !matches!(fn_with.vis, syn::Visibility::Public(_)) { + return quote_spanned! { + fn_with.sig.ident.span() => compile_error!("expected method to be `pub`"); + } + .into(); + } + // Valida que el método devuelva el tipo `Self`. + if let syn::ReturnType::Type(_, ty) = &fn_with.sig.output { + if let syn::Type::Path(type_path) = &**ty { + let ident = &type_path.path.segments.last().unwrap().ident; + if ident != "Self" { + return quote_spanned! { + fn_with.sig.output.span() => compile_error!("expected return type to be `Self`"); + }.into(); + } + } + } else { + return quote_spanned! { + fn_with.sig.output.span() => compile_error!("expected method to return `Self`"); + } + .into(); + } + // Valida que el primer argumento sea `mut self`. + if let Some(syn::FnArg::Receiver(receiver)) = fn_with.sig.inputs.first() { + if receiver.mutability.is_none() { + return quote_spanned! { + receiver.span() => compile_error!("expected `mut self` as the first argument"); + } + .into(); + } + } else { + return quote_spanned! { + fn_with.sig.ident.span() => compile_error!("expected `mut self` as the first argument"); + } + .into(); + } + + // Genera el nombre del método alter_...(). + let fn_alter_name_str = fn_with_name_str.replace("with_", "alter_"); + let fn_alter_name = syn::Ident::new(&fn_alter_name_str, fn_with.sig.ident.span()); + + // Extrae genéricos y cláusulas where. + let fn_generics = &fn_with.sig.generics; + let where_clause = &fn_with.sig.generics.where_clause; + + // Extrae argumentos y parámetros de llamada. + let args: Vec<_> = fn_with.sig.inputs.iter().skip(1).collect(); + let params: Vec<_> = fn_with + .sig + .inputs + .iter() + .skip(1) + .map(|arg| match arg { + syn::FnArg::Typed(pat) => &pat.pat, + _ => panic!("unexpected argument type"), + }) + .collect(); + + // Extrae bloque del método. + let fn_with_block = &fn_with.block; + + // Extrae documentación y otros atributos del método. + let fn_with_attrs = &fn_with.attrs; + + // Genera el método alter_...() con el código del método with_...(). + let fn_alter_doc = format!( + "Modifica la instancia en los mismos términos que para el patrón <em>builder</em> hace el \ + método asociado `{}()`.", + fn_with_name_str, + ); + let fn_alter = quote! { + #[doc = #fn_alter_doc] + pub fn #fn_alter_name #fn_generics(&mut self, #(#args),*) -> &mut Self #where_clause { + #fn_with_block + } + }; + + // Redefine el método with_...() para que llame a alter_...(). + let fn_with = quote! { + #(#fn_with_attrs)* + #[inline] + pub fn #fn_with_name #fn_generics(mut self, #(#args),*) -> Self #where_clause { + self.#fn_alter_name(#(#params),*); + self + } + }; + + // Genera el código final. + let expanded = quote! { + #fn_with + #[inline] + #fn_alter + }; + expanded.into() +} + /// Define una función `main` asíncrona como punto de entrada de `PageTop`. /// /// # Ejemplo diff --git a/src/lib.rs b/src/lib.rs index 800f7830..d64cf55c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,7 +32,7 @@ // RE-EXPORTED ************************************************************************************* -pub use pagetop_macros::{html, main, test, AutoDefault}; +pub use pagetop_macros::{builder_fn, html, main, test, AutoDefault}; /// Representa un conjunto de recursos asociados a `$STATIC` en [`include_files!`]. pub type StaticResources = std::collections::HashMap<&'static str, static_files::Resource>; diff --git a/src/prelude.rs b/src/prelude.rs index c27b997e..e4aabf55 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -2,7 +2,7 @@ // RE-EXPORTED. -pub use crate::{html, main, test}; +pub use crate::{builder_fn, html, main, test}; pub use crate::{AutoDefault, StaticResources}; From f6b4cb936ca7a9695460c82d0195647e906b327b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 13 Jul 2025 11:10:06 +0200 Subject: [PATCH 678/853] =?UTF-8?q?=F0=9F=8E=A8=20Mejora=20definici=C3=B3n?= =?UTF-8?q?=20encapsulando=20uso=20de=20recursos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-build/src/lib.rs | 4 ++-- src/lib.rs | 25 +++++++++++++++++++++++-- src/service.rs | 17 +++++++++-------- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index c48b21fc..98c8ef87 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -109,10 +109,10 @@ //! } //! ``` //! -//! También se puede acceder al conjunto de recursos declarando un `HashMap` estático global: +//! También se puede asignar el conjunto de recursos a una variable global; p.ej. `GUIDES`: //! //! ```rust,ignore -//! include_files!(HM_GUIDES => guides); +//! include_files!(GUIDES => guides); //! ``` use grass::{from_path, Options, OutputStyle}; diff --git a/src/lib.rs b/src/lib.rs index d64cf55c..1ae35895 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,12 +30,33 @@ #![cfg_attr(docsrs, feature(doc_cfg))] +use std::collections::HashMap; +use std::ops::Deref; + // RE-EXPORTED ************************************************************************************* pub use pagetop_macros::{builder_fn, html, main, test, AutoDefault}; -/// Representa un conjunto de recursos asociados a `$STATIC` en [`include_files!`]. -pub type StaticResources = std::collections::HashMap<&'static str, static_files::Resource>; +/// Conjunto de recursos asociados a `$STATIC` en [`include_files!`](crate::include_files). +pub struct StaticResources { + bundle: HashMap<&'static str, static_files::Resource>, +} + +impl StaticResources { + /// Crea un contenedor para un conjunto de recursos generado por `build.rs` (consultar + /// [`pagetop_build`](https://docs.rs/pagetop-build)). + pub fn new(bundle: HashMap<&'static str, static_files::Resource>) -> Self { + Self { bundle } + } +} + +impl Deref for StaticResources { + type Target = HashMap<&'static str, static_files::Resource>; + + fn deref(&self) -> &Self::Target { + &self.bundle + } +} // API ********************************************************************************************* diff --git a/src/service.rs b/src/service.rs index 1adaead8..9e506fae 100644 --- a/src/service.rs +++ b/src/service.rs @@ -15,18 +15,18 @@ pub use actix_web::test; /// /// # Formas de uso /// -/// * `include_files!(media)` - Incluye el conjunto de recursos llamado `media`. Normalmente se +/// * `include_files!(media)` - Para incluir un conjunto de recursos llamado `media`. Normalmente se /// usará esta forma. /// -/// * `include_files!(BLOG_HM => blog)` - Asigna a la variable estática `BLOG_HM` un conjunto de -/// recursos llamado `blog`. +/// * `include_files!(BLOG => media)` - También se puede asignar el conjunto de recursos a una +/// variable global; p.ej. `BLOG`. /// /// # Argumentos /// /// * `$bundle` – Nombre del conjunto de recursos generado por `build.rs` (consultar /// [`pagetop_build`](https://docs.rs/pagetop-build)). -/// * `$STATIC` – Identificador para la variable estática de tipo -/// [`StaticResources`](`crate::StaticResources`). +/// * `$STATIC` – Asigna el conjunto de recursos a una variable global de tipo +/// [`StaticResources`](crate::StaticResources). /// /// # Ejemplos /// @@ -51,9 +51,10 @@ macro_rules! include_files { mod [<static_files_ $bundle>] { include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); } - pub static $STATIC: std::sync::LazyLock<StaticResources> = std::sync::LazyLock::new( - [<static_files_ $bundle>]::$bundle - ); + pub static $STATIC: std::sync::LazyLock<$crate::StaticResources> = + std::sync::LazyLock::new( + $crate::StaticResources::new([<static_files_ $bundle>]::$bundle) + ); } }; } From 5f60bc4845ba591ecf35bac46e134f4b6840b17f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 15 Jul 2025 20:12:15 +0200 Subject: [PATCH 679/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20API=20para=20e?= =?UTF-8?q?xtensiones=20con=20funcionalidades?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añade el interfaz común que debe implementar cualquier extensión de PageTop para añadir nuevas funcionalidades a la aplicación en forma de servicios web y API de uso. --- src/app.rs | 37 +++++- src/core.rs | 205 +++++++++++++++++++++++++++++++ src/core/extension.rs | 9 ++ src/core/extension/all.rs | 104 ++++++++++++++++ src/core/extension/definition.rs | 77 ++++++++++++ src/lib.rs | 2 + src/prelude.rs | 4 + 7 files changed, 436 insertions(+), 2 deletions(-) create mode 100644 src/core.rs create mode 100644 src/core/extension.rs create mode 100644 src/core/extension/all.rs create mode 100644 src/core/extension/definition.rs diff --git a/src/app.rs b/src/app.rs index b02b294a..0bcece8e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,6 +2,7 @@ mod figfont; +use crate::core::{extension, extension::ExtensionRef}; use crate::{global, locale, service, trace}; use substring::Substring; @@ -9,6 +10,12 @@ use substring::Substring; use std::io::Error; use std::sync::LazyLock; +/// Punto de entrada de una aplicación `PageTop`. +/// +/// No almacena datos, pero **encapsula** el ciclo completo de configuración y puesta en marcha. +/// Para instanciarla se puede usar [`new`](Application::new) o [`prepare`](Application::prepare). +/// Después sólo hay que llamar a [`run`](Application::run) (o a [`test`](Application::test) si se +/// está preparando un entorno de pruebas). pub struct Application; impl Default for Application { @@ -20,6 +27,23 @@ impl Default for Application { impl Application { /// Crea una instancia de la aplicación. pub fn new() -> Self { + Self::internal_prepare(None) + } + + /// Prepara una instancia de la aplicación a partir de una extensión raíz. + /// + /// Esa extensión suele declarar: + /// + /// - Sus propias dependencias (que se habilitarán automáticamente). + /// - Una lista de extensiones que deben deshabilitarse si estuvieran activadas. + /// + /// Esto simplifica el arranque en escenarios complejos. + pub fn prepare(root_extension: ExtensionRef) -> Self { + Self::internal_prepare(Some(root_extension)) + } + + // Método interno para preparar la aplicación, opcionalmente con una extensión. + fn internal_prepare(root_extension: Option<ExtensionRef>) -> Self { // Al arrancar muestra una cabecera para la aplicación. Self::show_banner(); @@ -29,6 +53,12 @@ impl Application { // Valida el identificador de idioma por defecto. LazyLock::force(&locale::DEFAULT_LANGID); + // Registra las extensiones de la aplicación. + extension::all::register_extensions(root_extension); + + // Inicializa las extensiones. + extension::all::initialize_extensions(); + Self } @@ -73,7 +103,10 @@ impl Application { } } - /// Ejecuta el servidor web de la aplicación. + /// Arranca el servidor web de la aplicación. + /// + /// Devuelve [`std::io::Error`] si el *socket* no puede enlazarse (por puerto en uso, permisos, + /// etc.). pub fn run(self) -> Result<service::Server, Error> { // Prepara el servidor web. Ok(service::HttpServer::new(move || { @@ -112,6 +145,6 @@ impl Application { InitError = (), >, > { - service::App::new() + service::App::new().configure(extension::all::configure_services) } } diff --git a/src/core.rs b/src/core.rs new file mode 100644 index 00000000..5aebd1fa --- /dev/null +++ b/src/core.rs @@ -0,0 +1,205 @@ +//! Tipos y funciones esenciales para crear extensiones. + +use std::any::Any; + +/// Selector para identificar segmentos de la ruta de un tipo. +#[derive(Clone, Copy, Debug)] +pub enum TypeInfo { + /// Ruta completa tal y como la devuelve [`core::any::type_name`]. + FullName, + /// Último segmento de la ruta – por ejemplo `Vec<i32>` en lugar de `alloc::vec::Vec<i32>`. + ShortName, + /// Conserva todo **desde** `start` inclusive hasta el final. + NameFrom(isize), + /// Conserva todo **hasta e incluyendo** `end`. + NameTo(isize), + /// Conserva la subruta comprendida entre `start` y `end` (ambos inclusive). + PartialName(isize, isize), +} + +impl TypeInfo { + /// Devuelve el segmento solicitado de la ruta para el tipo `T`. + pub fn of<T: ?Sized>(&self) -> &'static str { + let type_name = std::any::type_name::<T>(); + match self { + TypeInfo::FullName => type_name, + TypeInfo::ShortName => Self::partial(type_name, -1, None), + TypeInfo::NameFrom(start) => Self::partial(type_name, *start, None), + TypeInfo::NameTo(end) => Self::partial(type_name, 0, Some(*end)), + TypeInfo::PartialName(start, end) => Self::partial(type_name, *start, Some(*end)), + } + } + + // Extrae un rango de segmentos de `type_name` (tokens separados por `::`). + // + // Los argumentos `start` y `end` identifican los índices de los segmentos teniendo en cuenta: + // + // * Los índices positivos cuentan **desde la izquierda**, empezando en `0`. + // * Los índices negativos cuentan **desde la derecha**, `-1` es el último. + // * Si `end` es `None`, el corte llega hasta el último segmento. + // * Si la selección resulta vacía por índices desordenados o segmento inexistente, se devuelve + // la cadena vacía. + // + // Ejemplos (con `type_name = "alloc::vec::Vec<i32>"`): + // + // | Llamada | Resultado | + // |------------------------------|--------------------------| + // | `partial(..., 0, None)` | `"alloc::vec::Vec<i32>"` | + // | `partial(..., 1, None)` | `"vec::Vec<i32>"` | + // | `partial(..., -1, None)` | `"Vec<i32>"` | + // | `partial(..., 0, Some(-2))` | `"alloc::vec"` | + // | `partial(..., -5, None)` | `"alloc::vec::Vec<i32>"` | + // + // La porción devuelta vive tanto como `'static` porque `type_name` es `'static` y sólo se + // presta. + fn partial(type_name: &'static str, start: isize, end: Option<isize>) -> &'static str { + let maxlen = type_name.len(); + + // Localiza los límites de cada segmento a nivel 0 de `<…>`. + let mut segments = Vec::new(); + let mut segment_start = 0; // Posición inicial del segmento actual. + let mut angle_brackets = 0; // Profundidad dentro de '<…>'. + let mut previous_char = '\0'; // Se inicializa a carácter nulo, no hay aún carácter previo. + + for (idx, c) in type_name.char_indices() { + match c { + ':' if angle_brackets == 0 => { + if previous_char == ':' { + if segment_start < idx - 1 { + segments.push((segment_start, idx - 1)); // No incluye último '::'. + } + segment_start = idx + 1; // Nuevo segmento tras '::'. + } + } + '<' => angle_brackets += 1, + '>' => angle_brackets -= 1, + _ => {} + } + previous_char = c; + } + + // Incluye el último segmento si lo hubiese. + if segment_start < maxlen { + segments.push((segment_start, maxlen)); + } + + // Calcula la posición inicial. + let start_pos = segments + .get(if start >= 0 { + start as usize + } else { + segments.len().saturating_sub(start.unsigned_abs()) + }) + .map_or(0, |&(s, _)| s); + + // Calcula la posición final. + let end_pos = segments + .get(if let Some(end) = end { + if end >= 0 { + end as usize + } else { + segments.len().saturating_sub(end.unsigned_abs()) + } + } else { + segments.len() - 1 + }) + .map_or(maxlen, |&(_, e)| e); + + // Devuelve la cadena parcial basada en las posiciones calculadas. + if start_pos >= end_pos { + return ""; + } + &type_name[start_pos..end_pos] + } +} + +/// Proporciona información de tipo en tiempo de ejecución y conversión dinámica de tipos. +/// +/// Este *trait* se implementa automáticamente para **todos** los tipos que implementen [`Any`], de +/// modo que basta con traer [`AnyInfo`] al ámbito (`use crate::AnyInfo;`) para disponer de estos +/// métodos adicionales, o usar el [`prelude`](crate::prelude) de `PageTop`. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let n = 3u32; +/// assert_eq!(n.type_name(), "u32"); +/// ``` +pub trait AnyInfo: Any { + /// Devuelve el nombre totalmente cualificado del tipo. + fn type_name(&self) -> &'static str; + + /// Devuelve el nombre corto del tipo (último segmento del nombre). + fn short_name(&self) -> &'static str; + + /// Devuelve una referencia a `dyn Any` para la conversión dinámica de tipos. + fn as_any_ref(&self) -> &dyn Any; + + /// Devuelve una referencia mutable a `dyn Any` para la conversión dinámica de tipos. + fn as_any_mut(&mut self) -> &mut dyn Any; +} + +impl<T: Any> AnyInfo for T { + #[inline] + fn type_name(&self) -> &'static str { + TypeInfo::FullName.of::<T>() + } + + #[inline] + fn short_name(&self) -> &'static str { + TypeInfo::ShortName.of::<T>() + } + + #[inline] + fn as_any_ref(&self) -> &dyn Any { + self + } + + #[inline] + fn as_any_mut(&mut self) -> &mut dyn Any { + self + } +} + +/// Extiende [`AnyInfo`] con utilidades de *downcasting* para conversión de tipos. +/// +/// Preferible a usar directamente `Any::downcast_ref` porque conserva el *trait bound* [`AnyInfo`], +/// lo que permite seguir llamando a `type_name`, etc. +pub trait AnyCast: AnyInfo { + /// Comprueba si la instancia subyacente es de tipo `T`. + #[inline] + fn is<T>(&self) -> bool + where + T: AnyInfo, + { + self.as_any_ref().is::<T>() + } + + /// Intenta hacer *downcast* de un objeto para obtener una referencia de tipo `T`. + #[inline] + #[must_use] + fn downcast_ref<T>(&self) -> Option<&T> + where + T: AnyInfo, + { + self.as_any_ref().downcast_ref() + } + + /// Intenta hacer *downcast* de un objeto para obtener una referencia mutable de tipo `T`. + #[inline] + #[must_use] + fn downcast_mut<T>(&mut self) -> Option<&mut T> + where + T: AnyInfo, + { + self.as_any_mut().downcast_mut() + } +} + +/// Implementación automática para cualquier tipo que ya cumpla [`AnyInfo`]. +impl<T: ?Sized + AnyInfo> AnyCast for T {} + +// Infraestructura para ampliar funcionalidades mediante extensiones. +pub mod extension; diff --git a/src/core/extension.rs b/src/core/extension.rs new file mode 100644 index 00000000..9eb3bd24 --- /dev/null +++ b/src/core/extension.rs @@ -0,0 +1,9 @@ +//! Infraestructura para ampliar funcionalidades mediante extensiones. +//! +//! Cada funcionalidad adicional que quiera incorporarse a una aplicación `PageTop` se debe modelar +//! como una **extensión**. Todas comparten la misma interfaz declarada en [`ExtensionTrait`]. + +mod definition; +pub use definition::{ExtensionRef, ExtensionTrait}; + +pub(crate) mod all; diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs new file mode 100644 index 00000000..d5bebdad --- /dev/null +++ b/src/core/extension/all.rs @@ -0,0 +1,104 @@ +use crate::core::extension::ExtensionRef; +use crate::{service, trace}; + +use std::sync::{LazyLock, RwLock}; + +// EXTENSIONES ************************************************************************************* + +static ENABLED_EXTENSIONS: LazyLock<RwLock<Vec<ExtensionRef>>> = + LazyLock::new(|| RwLock::new(Vec::new())); + +static DROPPED_EXTENSIONS: LazyLock<RwLock<Vec<ExtensionRef>>> = + LazyLock::new(|| RwLock::new(Vec::new())); + +// REGISTRO DE LAS EXTENSIONES ********************************************************************* + +pub fn register_extensions(root_extension: Option<ExtensionRef>) { + // Prepara la lista de extensiones habilitadas. + let mut enabled_list: Vec<ExtensionRef> = Vec::new(); + + // Si se proporciona una extensión raíz inicial, se añade a la lista de extensiones habilitadas. + if let Some(extension) = root_extension { + add_to_enabled(&mut enabled_list, extension); + } + + // Guarda la lista final de extensiones habilitadas. + ENABLED_EXTENSIONS + .write() + .unwrap() + .append(&mut enabled_list); + + // Prepara una lista de extensiones deshabilitadas. + let mut dropped_list: Vec<ExtensionRef> = Vec::new(); + + // Si se proporciona una extensión raíz, analiza su lista de dependencias. + if let Some(extension) = root_extension { + add_to_dropped(&mut dropped_list, extension); + } + + // Guarda la lista final de extensiones deshabilitadas. + DROPPED_EXTENSIONS + .write() + .unwrap() + .append(&mut dropped_list); +} + +fn add_to_enabled(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { + // Verifica que la extensión no esté en la lista para evitar duplicados. + if !list.iter().any(|e| e.type_id() == extension.type_id()) { + // Añade primero (en orden inverso) las dependencias de la extensión. + for d in extension.dependencies().iter().rev() { + add_to_enabled(list, *d); + } + + // Añade la propia extensión a la lista. + list.push(extension); + } +} + +fn add_to_dropped(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { + // Recorre las extensiones que la actual recomienda deshabilitar. + for d in &extension.drop_extensions() { + // Verifica que la extensión no esté ya en la lista. + if !list.iter().any(|e| e.type_id() == d.type_id()) { + // Comprueba si la extensión está habilitada. Si es así, registra una advertencia. + if ENABLED_EXTENSIONS + .read() + .unwrap() + .iter() + .any(|e| e.type_id() == extension.type_id()) + { + trace::warn!( + "Trying to drop \"{}\" extension which is enabled", + extension.short_name() + ); + } else { + // Si la extensión no está habilitada, se añade a la lista y registra la acción. + list.push(*d); + trace::debug!("Extension \"{}\" dropped", d.short_name()); + // Añade recursivamente las dependencias de la extensión eliminada. + // De este modo, todas las dependencias se tienen en cuenta para ser deshabilitadas. + for dependency in &extension.dependencies() { + add_to_dropped(list, *dependency); + } + } + } + } +} + +// INICIALIZA LAS EXTENSIONES ********************************************************************** + +pub fn initialize_extensions() { + trace::info!("Calling application bootstrap"); + for extension in ENABLED_EXTENSIONS.read().unwrap().iter() { + extension.initialize(); + } +} + +// CONFIGURA LOS SERVICIOS ************************************************************************* + +pub fn configure_services(scfg: &mut service::web::ServiceConfig) { + for extension in ENABLED_EXTENSIONS.read().unwrap().iter() { + extension.configure_service(scfg); + } +} diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs new file mode 100644 index 00000000..761fceea --- /dev/null +++ b/src/core/extension/definition.rs @@ -0,0 +1,77 @@ +use crate::core::AnyInfo; +use crate::locale::L10n; +use crate::service; + +/// Representa una referencia a una extensión. +/// +/// Las extensiones se definen como instancias estáticas globales para poder acceder a ellas desde +/// cualquier hilo de la ejecución sin necesidad de sincronización adicional. +pub type ExtensionRef = &'static dyn ExtensionTrait; + +/// Interfaz común que debe implementar cualquier extensión de `PageTop`. +/// +/// Este *trait* es fácil de implementar, basta con declarar la estructura de la extensión y +/// sobreescribir los métodos que sea necesario. +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// pub struct Blog; +/// +/// impl ExtensionTrait for Blog { +/// fn name(&self) -> L10n { L10n::n("Blog") } +/// fn description(&self) -> L10n { L10n::n("Sistema de blogs") } +/// } +/// ``` +pub trait ExtensionTrait: AnyInfo + Send + Sync { + /// Nombre legible para el usuario. + /// + /// Predeterminado por el [`short_name`](AnyInfo::short_name) del tipo asociado a la extensión. + fn name(&self) -> L10n { + L10n::n(self.short_name()) + } + + /// Descripción corta para paneles, listados, etc. + fn description(&self) -> L10n { + L10n::default() + } + + /// Otras extensiones que deben habilitarse **antes** de esta. + /// + /// `PageTop` las resolverá automáticamente respetando el orden durante el arranque de la + /// aplicación. + fn dependencies(&self) -> Vec<ExtensionRef> { + vec![] + } + + /// Inicializa la extensión durante la lógica de arranque de la aplicación. + /// + /// Se llama una sola vez, después de que todas las dependencias se han inicializado y antes de + /// aceptar cualquier petición HTTP. + fn initialize(&self) {} + + /// Configura los servicios web de la extensión, como rutas, *middleware*, acceso a ficheros + /// estáticos, etc., usando [`ServiceConfig`](crate::service::web::ServiceConfig). + /// + /// ```rust,ignore + /// use pagetop::prelude::*; + /// + /// pub struct ExtensionSample; + /// + /// impl ExtensionTrait for ExtensionSample { + /// fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + /// scfg.route("/sample", web::get().to(route_sample)); + /// } + /// } + /// ``` + #[allow(unused_variables)] + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {} + + /// Permite crear extensiones para deshabilitar y desinstalar los recursos de otras extensiones + /// utilizadas en versiones anteriores de la aplicación. + /// + /// Actualmente no se usa, pero se deja como *placeholder* para futuras implementaciones. + fn drop_extensions(&self) -> Vec<ExtensionRef> { + vec![] + } +} diff --git a/src/lib.rs b/src/lib.rs index 1ae35895..04a99397 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -74,6 +74,8 @@ pub mod html; pub mod locale; // Soporte a fechas y horas. pub mod datetime; +// Tipos y funciones esenciales para crear extensiones. +pub mod core; // Gestión del servidor y servicios web. pub mod service; // Prepara y ejecuta la aplicación. diff --git a/src/prelude.rs b/src/prelude.rs index e4aabf55..c391de8c 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -33,4 +33,8 @@ pub use crate::datetime::*; pub use crate::service; +pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; + +pub use crate::core::extension::*; + pub use crate::app::Application; From 4b281a1e96b71facf0a3992d90c1598c536314be Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 16 Jul 2025 00:45:05 +0200 Subject: [PATCH 680/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20A?= =?UTF-8?q?=C3=B1ade=20macros=20para=20concatenar=20cadenas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 9 ++- Cargo.toml | 3 +- src/prelude.rs | 2 +- src/util.rs | 161 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 49fe0074..cde64db7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -525,6 +525,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "concat-string" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7439becb5fafc780b6f4de382b1a7a3e70234afe783854a4702ee8adbb838609" + [[package]] name = "config" version = "0.15.13" @@ -1407,13 +1413,14 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.10" +version = "0.0.11" dependencies = [ "actix-files", "actix-web", "actix-web-static-files", "chrono", "colored", + "concat-string", "config", "figlet-rs", "fluent-templates", diff --git a/Cargo.toml b/Cargo.toml index 8212f62b..b6f844f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.10" +version = "0.0.11" edition = "2021" description = """\ @@ -17,6 +17,7 @@ authors.workspace = true [dependencies] chrono = "0.4.41" colored = "3.0.0" +concat-string = "1.0.1" config = { version = "0.15.13", default-features = false, features = ["toml"] } figlet-rs = "0.1.5" itoa = "1.0.15" diff --git a/src/prelude.rs b/src/prelude.rs index c391de8c..6506aaf9 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -9,7 +9,7 @@ pub use crate::{AutoDefault, StaticResources}; // MACROS. // crate::util -pub use crate::hm; +pub use crate::{hm, join, join_opt, join_pair, join_strict}; // crate::config pub use crate::include_config; // crate::locale diff --git a/src/util.rs b/src/util.rs index 7a48001f..b605125f 100644 --- a/src/util.rs +++ b/src/util.rs @@ -5,6 +5,7 @@ use crate::trace; use std::io; use std::path::{Path, PathBuf}; +// FUNCIONES ÚTILES ******************************************************************************** /// Devuelve la ruta absoluta a un directorio existente. /// @@ -51,6 +52,9 @@ where #[doc(hidden)] pub use paste::paste; +#[doc(hidden)] +pub use concat_string::concat_string; + #[macro_export] /// Macro para construir una colección de pares clave-valor. /// @@ -73,3 +77,160 @@ macro_rules! hm { a }}; } + +/// Concatena eficientemente varios fragmentos en un [`String`]. +/// +/// Esta macro exporta [`concat_string!`](https://docs.rs/concat-string). Acepta cualquier número de +/// fragmentos que implementen [`AsRef<str>`] y construye un [`String`] con el tamaño óptimo, de +/// forma eficiente y evitando el uso de cadenas de formato que penalicen el rendimiento. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Concatena todos los fragmentos directamente. +/// let result = join!("Hello", " ", "World"); +/// assert_eq!(result, String::from("Hello World")); +/// +/// // También funciona con valores vacíos. +/// let result_with_empty = join!("Hello", "", "World"); +/// assert_eq!(result_with_empty, String::from("HelloWorld")); +/// +/// // Un único fragmento devuelve el mismo valor. +/// let single_result = join!("Hello"); +/// assert_eq!(single_result, String::from("Hello")); +/// ``` +#[macro_export] +macro_rules! join { + ($($arg:tt)*) => { + $crate::util::concat_string!($($arg)*) + }; +} + +/// Concatena los fragmentos no vacíos en un [`Option<String>`] con un separador opcional. +/// +/// Esta macro acepta cualquier número de fragmentos que implementen [`AsRef<str>`] para concatenar +/// todos los fragmentos no vacíos usando opcionalmente un separador. +/// +/// Si todos los fragmentos están vacíos, devuelve [`None`]. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Concatena los fragmentos no vacíos con un espacio como separador. +/// let result_with_separator = join_opt!(["Hello", "", "World"]; " "); +/// assert_eq!(result_with_separator, Some(String::from("Hello World"))); +/// +/// // Concatena los fragmentos no vacíos sin un separador. +/// let result_without_separator = join_opt!(["Hello", "", "World"]); +/// assert_eq!(result_without_separator, Some(String::from("HelloWorld"))); +/// +/// // Devuelve `None` si todos los fragmentos están vacíos. +/// let result_empty = join_opt!(["", "", ""]); +/// assert_eq!(result_empty, None); +/// ``` +#[macro_export] +macro_rules! join_opt { + ([$($arg:expr),* $(,)?]) => {{ + let s = $crate::util::concat_string!($($arg),*); + (!s.is_empty()).then_some(s) + }}; + ([$($arg:expr),* $(,)?]; $separator:expr) => {{ + let s = [$($arg),*] + .iter() + .filter(|&item| !item.is_empty()) + .cloned() + .collect::<Vec<_>>() + .join($separator); + (!s.is_empty()).then_some(s) + }}; +} + +/// Concatena dos fragmentos en un [`String`] usando un separador. +/// +/// Une los dos fragmentos, que deben implementar [`AsRef<str>`], usando el separador proporcionado. +/// Si uno de ellos está vacío, devuelve directamente el otro; y si ambos están vacíos devuelve un +/// [`String`] vacío. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let first = "Hello"; +/// let separator = "-"; +/// let second = "World"; +/// +/// // Concatena los dos fragmentos cuando ambos no están vacíos. +/// let result = join_pair!(first, separator, second); +/// assert_eq!(result, String::from("Hello-World")); +/// +/// // Si el primer fragmento está vacío, devuelve el segundo. +/// let result_empty_first = join_pair!("", separator, second); +/// assert_eq!(result_empty_first, String::from("World")); +/// +/// // Si el segundo fragmento está vacío, devuelve el primero. +/// let result_empty_second = join_pair!(first, separator, ""); +/// assert_eq!(result_empty_second, String::from("Hello")); +/// +/// // Si ambos fragmentos están vacíos, devuelve una cadena vacía. +/// let result_both_empty = join_pair!("", separator, ""); +/// assert_eq!(result_both_empty, String::from("")); +/// ``` +#[macro_export] +macro_rules! join_pair { + ($first:expr, $separator:expr, $second:expr) => {{ + if $first.is_empty() { + String::from($second) + } else if $second.is_empty() { + String::from($first) + } else { + $crate::util::concat_string!($first, $separator, $second) + } + }}; +} + +/// Concatena varios fragmentos en un [`Option<String>`] si ninguno está vacío. +/// +/// Si alguno de los fragmentos, que deben implementar [`AsRef<str>`], está vacío, devuelve +/// [`None`]. Opcionalmente se puede indicar un separador entre los fragmentos concatenados. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Concatena los fragmentos. +/// let result = join_strict!(["Hello", "World"]); +/// assert_eq!(result, Some(String::from("HelloWorld"))); +/// +/// // Concatena los fragmentos con un separador. +/// let result_with_separator = join_strict!(["Hello", "World"]; " "); +/// assert_eq!(result_with_separator, Some(String::from("Hello World"))); +/// +/// // Devuelve `None` si alguno de los fragmentos está vacío. +/// let result_with_empty = join_strict!(["Hello", "", "World"]); +/// assert_eq!(result_with_empty, None); +/// ``` +#[macro_export] +macro_rules! join_strict { + ([$($arg:expr),* $(,)?]) => {{ + let fragments = [$($arg),*]; + if fragments.iter().any(|&item| item.is_empty()) { + None + } else { + Some(fragments.concat()) + } + }}; + ([$($arg:expr),* $(,)?]; $separator:expr) => {{ + let fragments = [$($arg),*]; + if fragments.iter().any(|&item| item.is_empty()) { + None + } else { + Some(fragments.join($separator)) + } + }}; +} From 9bfdf2e9ac49ebbf3983d4e4424c042d8bbf9f67 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 16 Jul 2025 01:04:36 +0200 Subject: [PATCH 681/853] =?UTF-8?q?=F0=9F=93=9D=20Actualiza=20documentaci?= =?UTF-8?q?=C3=B3n=20con=20favicon=20propio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-build/src/lib.rs | 4 ++++ helpers/pagetop-macros/src/lib.rs | 4 ++++ src/lib.rs | 4 ++++ static/favicon.ico | Bin 0 -> 10206 bytes 4 files changed, 12 insertions(+) create mode 100644 static/favicon.ico diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index 98c8ef87..3816c658 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -115,6 +115,10 @@ //! include_files!(GUIDES => guides); //! ``` +#![doc( + html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" +)] + use grass::{from_path, Options, OutputStyle}; use static_files::{resource_dir, ResourceDir}; diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 25105c2f..62b6e886 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -14,6 +14,10 @@ //! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles //! y configurables, basadas en HTML, CSS y JavaScript. +#![doc( + html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" +)] + mod maud; mod smart_default; diff --git a/src/lib.rs b/src/lib.rs index 04a99397..0fd3250c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,6 +30,10 @@ #![cfg_attr(docsrs, feature(doc_cfg))] +#![doc( + html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" +)] + use std::collections::HashMap; use std::ops::Deref; diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..95e1affa748f69b77f95490649836e9861036325 GIT binary patch literal 10206 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 Yo2E{c#pzo8UZDq&kyMnZ6f+L`AAO+n{{R30 literal 0 HcmV?d00001 From 17f52efb7274bc64c680c27f7d9981f02697fc77 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 16 Jul 2025 02:53:49 +0200 Subject: [PATCH 682/853] =?UTF-8?q?=F0=9F=9A=91=20(macros):=20Corrige=20ru?= =?UTF-8?q?tas=20absolutas=20en=20html!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Mantiene fijas las rutas absolutas en las funciones de la macro html!. - Introduce un alias interno del crate (`extern crate self as pagetop;`) en `src/lib.rs` para que las expansiones funcionen uniformemente en tests, ejemplos y dependencias externas. --- Cargo.lock | 31 ++------------------- helpers/pagetop-macros/Cargo.toml | 3 +- helpers/pagetop-macros/src/maud.rs | 12 +------- helpers/pagetop-macros/src/maud/generate.rs | 14 ++-------- src/html/maud.rs | 6 ++-- src/lib.rs | 4 +++ 6 files changed, 14 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cde64db7..ab7b20a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1449,9 +1449,8 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.0.4" +version = "0.0.5" dependencies = [ - "proc-macro-crate", "proc-macro2", "proc-macro2-diagnostics", "quote", @@ -1618,15 +1617,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - [[package]] name = "proc-macro-hack" version = "0.5.20+deprecated" @@ -2185,17 +2175,11 @@ checksum = "f271e09bde39ab52250160a67e88577e0559ad77e9085de6e9051a2c4353f8f8" dependencies = [ "serde", "serde_spanned", - "toml_datetime 0.7.0", + "toml_datetime", "toml_parser", "winnow", ] -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - [[package]] name = "toml_datetime" version = "0.7.0" @@ -2205,17 +2189,6 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "toml_datetime 0.6.11", - "winnow", -] - [[package]] name = "toml_parser" version = "1.0.0" diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 070e7784..3a7fd950 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.4" +version = "0.0.5" edition = "2021" description = """\ @@ -20,6 +20,5 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.95" proc-macro2-diagnostics = { version = "0.10.1", default-features = false } -proc-macro-crate = "3.3.0" quote = "1.0.40" syn = { version = "2.0.104", features = ["full"] } diff --git a/helpers/pagetop-macros/src/maud.rs b/helpers/pagetop-macros/src/maud.rs index 9077dbb9..2c763cd0 100644 --- a/helpers/pagetop-macros/src/maud.rs +++ b/helpers/pagetop-macros/src/maud.rs @@ -10,7 +10,6 @@ mod generate; use ast::DiagnosticParse; use proc_macro2::{Ident, Span, TokenStream}; use proc_macro2_diagnostics::Diagnostic; -use proc_macro_crate::{crate_name, FoundCrate}; use quote::quote; use syn::parse::{ParseStream, Parser}; @@ -41,20 +40,11 @@ pub fn expand(input: TokenStream) -> TokenStream { let output_ident = Ident::new("__maud_output", Span::mixed_site()); let stmts = generate::generate(markups, output_ident.clone()); - let found_crate = crate_name("pagetop").expect("pagetop must be in Cargo.toml"); - let crate_ident = match found_crate { - FoundCrate::Itself => Ident::new("pagetop", Span::call_site()), - FoundCrate::Name(ref name) => Ident::new(name, Span::call_site()), - }; - let pre_escaped = quote! { - #crate_ident::html::PreEscaped(#output_ident) - }; - quote! {{ extern crate alloc; let mut #output_ident = alloc::string::String::with_capacity(#size_hint); #stmts #(#diag_tokens)* - #pre_escaped + pagetop::html::PreEscaped(#output_ident) }} } diff --git a/helpers/pagetop-macros/src/maud/generate.rs b/helpers/pagetop-macros/src/maud/generate.rs index 1f825783..19ff3d76 100644 --- a/helpers/pagetop-macros/src/maud/generate.rs +++ b/helpers/pagetop-macros/src/maud/generate.rs @@ -4,8 +4,6 @@ use syn::{parse_quote, token::Brace, Expr, Local}; use crate::maud::{ast::*, escape}; -use proc_macro_crate::{crate_name, FoundCrate}; - pub fn generate(markups: Markups<Element>, output_ident: Ident) -> TokenStream { let mut build = Builder::new(output_ident.clone()); Generator::new(output_ident).markups(markups, &mut build); @@ -68,15 +66,9 @@ impl Generator { fn splice(&self, expr: Expr, build: &mut Builder) { let output_ident = &self.output_ident; - - let found_crate = crate_name("pagetop").expect("pagetop debe existir en Cargo.toml"); - let crate_ident = match found_crate { - FoundCrate::Itself => Ident::new("pagetop", Span::call_site()), - FoundCrate::Name(name) => Ident::new(&name, Span::call_site()), - }; - build.push_tokens(quote! { - #crate_ident::html::html_private::render_to!(&(#expr), &mut #output_ident); - }); + build.push_tokens( + quote!(pagetop::html::html_private::render_to!(&(#expr), &mut #output_ident);), + ); } fn element(&self, element: Element, build: &mut Builder) { diff --git a/src/html/maud.rs b/src/html/maud.rs index 19429869..39cb2c20 100644 --- a/src/html/maud.rs +++ b/src/html/maud.rs @@ -73,7 +73,7 @@ impl fmt::Write for Escaper<'_> { /// # Example /// /// ```rust -/// use pagetop::html::{html, Markup, Render}; +/// use pagetop::prelude::*; /// /// /// Provides a shorthand for linking to a CSS stylesheet. /// pub struct Stylesheet(&'static str); @@ -195,7 +195,7 @@ impl_render_with_itoa! { /// # Example /// /// ```rust -/// use pagetop::html::{display, html}; +/// use pagetop::prelude::*; /// use std::net::Ipv4Addr; /// /// let ip_address = Ipv4Addr::new(127, 0, 0, 1); @@ -266,7 +266,7 @@ impl<T: Default> Default for PreEscaped<T> { /// A minimal web page: /// /// ```rust -/// use pagetop::html::{DOCTYPE, html}; +/// use pagetop::prelude::*; /// /// let markup = html! { /// (DOCTYPE) diff --git a/src/lib.rs b/src/lib.rs index 0fd3250c..248ba6d4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -34,6 +34,10 @@ html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" )] +// Alias para que las rutas absolutas `::pagetop::…` generadas por las macros funcionen en el propio +// *crate*, en *crates* externos y en *doctests*. +extern crate self as pagetop; + use std::collections::HashMap; use std::ops::Deref; From de37724835863ffb028d990dc1a7095e6931ee9c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 19 Jul 2025 00:13:49 +0200 Subject: [PATCH 683/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mej?= =?UTF-8?q?ora=20uso=20y=20doc.=20de=20la=20API=20de=20localizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locale.rs | 127 +++++++++++++++++++++++++++++++++++------------- tests/locale.rs | 10 ++-- 2 files changed, 98 insertions(+), 39 deletions(-) diff --git a/src/locale.rs b/src/locale.rs index 064481f0..ab1f5efc 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -13,9 +13,9 @@ //! //! # Recursos Fluent //! -//! Por defecto, las traducciones se organizan en el directorio *src/locale*, con subdirectorios -//! para cada [Identificador de Idioma Unicode](https://docs.rs/unic-langid/) válido. Podríamos -//! tener una estructura como esta: +//! Por defecto las traducciones están en el directorio `src/locale`, con subdirectorios para cada +//! [Identificador de Idioma Unicode](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier) +//! válido. Podríamos tener una estructura como esta: //! //! ```text //! src/locale/ @@ -29,12 +29,12 @@ //! ├── es-MX/ //! │ ├── default.ftl //! │ └── main.ftl -//! └── fr/ +//! └── fr-FR/ //! ├── default.ftl //! └── main.ftl //! ``` //! -//! Ejemplo de un archivo *src/locale/en-US/main.ftl*: +//! Ejemplo de un archivo en `src/locale/en-US/main.ftl` //! //! ```text //! hello-world = Hello world! @@ -50,7 +50,7 @@ //! }. //! ``` //! -//! Y su archivo equivalente para español *src/locale/es-ES/main.ftl*: +//! Y su archivo equivalente para español en `src/locale/es-ES/main.ftl`: //! //! ```text //! hello-world = Hola mundo! @@ -69,10 +69,11 @@ //! //! # Cómo aplicar la localización en tu código //! -//! Una vez creado el directorio con los recursos FTL, basta con utilizar la macro +//! Una vez creado el directorio con los recursos FTL, basta con usar la macro //! [`include_locales!`](crate::include_locales) para integrarlos en la aplicación. //! -//! Si los recursos se encuentran en el directorio `"src/locale"`, sólo hay que declarar: +//! Si los recursos se encuentran en el directorio por defecto `src/locale` del *crate*, sólo hay +//! que declarar: //! //! ```rust //! use pagetop::prelude::*; @@ -80,11 +81,14 @@ //! include_locales!(LOCALES_SAMPLE); //! ``` //! -//! Pero si están ubicados en otro directorio, entonces se pueden incluir usando: +//! Si están ubicados en otro directorio se puede usar la forma: //! //! ```rust,ignore //! include_locales!(LOCALES_SAMPLE from "ruta/a/las/traducciones"); //! ``` +//! +//! Y *voilà*, sólo queda operar con los idiomas soportados por `PageTop` usando [`LangMatch`] y +//! traducir textos con [`L10n`]. use crate::html::{Markup, PreEscaped}; use crate::{global, hm, AutoDefault}; @@ -128,28 +132,69 @@ static FALLBACK_LANGID: LazyLock<LanguageIdentifier> = LazyLock::new(|| langid!( pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = LazyLock::new(|| LangMatch::langid_or_fallback(&global::SETTINGS.app.language)); -/// Comprueba si el idioma está soportado por `PageTop`. +/// Operaciones con los idiomas soportados por `PageTop`. /// -/// Útil para transformar un código de idioma en un [`LanguageIdentifier`] válido para `PageTop`. +/// Utiliza [`LangMatch`] para transformar un código de idioma en un [`LanguageIdentifier`] +/// soportado por `PageTop`. +/// +/// # Ejemplos +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Coincidencia exacta. +/// let lang = LangMatch::resolve("es-ES"); +/// assert_eq!(lang.as_langid().to_string(), "es-ES"); +/// +/// // Coincidencia parcial (con el idioma base). +/// let lang = LangMatch::resolve("es-EC"); +/// assert_eq!(lang.as_langid().to_string(), "es-ES"); // Porque "es-EC" no está soportado. +/// +/// // Idioma no especificado. +/// let lang = LangMatch::resolve(""); +/// assert_eq!(lang, LangMatch::Unspecified); +/// +/// // Idioma no soportado. +/// let lang = LangMatch::resolve("ja-JP"); +/// assert_eq!(lang, LangMatch::Unsupported("ja-JP".to_string())); +/// ``` +/// +/// Las siguientes instrucciones devuelven siempre un [`LanguageIdentifier`] válido, ya sea porque +/// resuelven un idioma soportado o porque aplican el idioma por defecto o de respaldo: +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Idioma por defecto si no resuelve. +/// let lang = LangMatch::resolve("it-IT"); +/// let langid = lang.as_langid(); +/// +/// // Idioma por defecto si no se encuentra. +/// let langid = LangMatch::langid_or_default("es-MX"); +/// +/// // Idioma de respaldo ("en-US") si no se encuentra. +/// let langid = LangMatch::langid_or_fallback("es-MX"); +/// ``` #[derive(Clone, Debug, Eq, PartialEq)] pub enum LangMatch { /// Cuando el código del idioma es una cadena vacía. - Empty, - /// Si encuentra un [`LanguageIdentifier`] que coincide exactamente o retrocediendo al idioma - /// base. + Unspecified, + /// Si encuentra un [`LanguageIdentifier`] en la lista de idiomas soportados por `PageTop` que + /// coincide exactamente con el código del idioma (p.ej. "es-ES"), o con el código del idioma + /// base (p.ej. "es"). Found(&'static LanguageIdentifier), /// Si el código del idioma no está entre los soportados por `PageTop`. - Unknown(String), + Unsupported(String), } impl LangMatch { - /// Resuelve `language` y devuelve el [`LangMatch`] apropiado. + /// Resuelve `language` y devuelve la variante [`LangMatch`] apropiada. pub fn resolve(language: impl AsRef<str>) -> Self { let language = language.as_ref().trim(); // Rechaza cadenas vacías. if language.is_empty() { - return Self::Empty; + return Self::Unspecified; } // Intenta aplicar coincidencia exacta con el código completo (p.ej. "es-MX"). @@ -164,28 +209,40 @@ impl LangMatch { } } - // Devuelve desconocido si el idioma no está soportado. - Self::Unknown(language.to_string()) + // En otro caso indica que el idioma no está soportado. + Self::Unsupported(language.to_string()) } - /// Devuelve siempre un [`LanguageIdentifier`] válido. + /// Devuelve el idioma de la variante de la instancia, o el idioma por defecto si no está + /// soportado. /// - /// Si `language` está vacío o es desconocido, devuelve el idioma de respaldo ("en-US"). - #[inline] - pub fn langid_or_fallback(language: impl AsRef<str>) -> &'static LanguageIdentifier { - match Self::resolve(language) { - Self::Found(l) => l, - _ => &FALLBACK_LANGID, - } - } - - /// Devuelve un [`LanguageIdentifier`] válido para la instancia. - /// - /// Si `language` está vacío o es desconocido, devuelve el idioma de respaldo ("en-US"). + /// Siempre devuelve un [`LanguageIdentifier`] válido. #[inline] pub fn as_langid(&self) -> &'static LanguageIdentifier { match self { LangMatch::Found(l) => l, + _ => &DEFAULT_LANGID, + } + } + + /// Si `language` está vacío o no está soportado, devuelve el idioma por defecto. + /// + /// Siempre devuelve un [`LanguageIdentifier`] válido. + #[inline] + pub fn langid_or_default(language: impl AsRef<str>) -> &'static LanguageIdentifier { + match Self::resolve(language) { + Self::Found(l) => l, + _ => &DEFAULT_LANGID, + } + } + + /// Si `language` está vacío o no está soportado, devuelve el idioma de respaldo ("en-US"). + /// + /// Siempre devuelve un [`LanguageIdentifier`] válido. + #[inline] + pub fn langid_or_fallback(language: impl AsRef<str>) -> &'static LanguageIdentifier { + match Self::resolve(language) { + Self::Found(l) => l, _ => &FALLBACK_LANGID, } } @@ -243,7 +300,9 @@ enum L10nOp { /// - Una clave para traducir un texto de las traducciones por defecto de `PageTop` (`l()`). /// - Una clave para traducir de un conjunto concreto de traducciones (`t()`). /// -/// Los argumentos dinámicos se añaden mediante `with_arg()` o `with_args()`. +/// # Ejemplo +/// +/// Los argumentos dinámicos se añaden usando `with_arg()` o `with_args()`. /// /// ```rust /// use pagetop::prelude::*; @@ -261,7 +320,7 @@ enum L10nOp { /// /// ```rust,ignore /// // Traducción con clave, conjunto de traducciones y código de idioma a usar. -/// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(LangMatch::langid_or_fallback("it")); +/// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(LangMatch::langid_or_default("it")); /// ``` #[derive(AutoDefault)] pub struct L10n { diff --git a/tests/locale.rs b/tests/locale.rs index c723cd46..420914d8 100644 --- a/tests/locale.rs +++ b/tests/locale.rs @@ -13,7 +13,7 @@ async fn translation_without_args() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-world"); - let translation = l10n.using(LangMatch::langid_or_fallback("es-ES")); + let translation = l10n.using(LangMatch::langid_or_default("es-ES")); assert_eq!(translation, Some("¡Hola mundo!".to_string())); } @@ -22,7 +22,7 @@ async fn translation_with_args() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-user").with_arg("userName", "Manuel"); - let translation = l10n.using(LangMatch::langid_or_fallback("es-ES")); + let translation = l10n.using(LangMatch::langid_or_default("es-ES")); assert_eq!(translation, Some("¡Hola, Manuel!".to_string())); } @@ -35,7 +35,7 @@ async fn translation_with_plural_and_select() { ("photoCount", "3"), ("userGender", "male"), ]); - let translation = l10n.using(LangMatch::langid_or_fallback("es-ES")).unwrap(); + let translation = l10n.using(LangMatch::langid_or_default("es-ES")).unwrap(); assert!(translation.contains("añadido 3 nuevas fotos de él")); } @@ -44,7 +44,7 @@ async fn check_fallback_language() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-world"); - let translation = l10n.using(LangMatch::langid_or_fallback("xx-YY")); // Fallback a "en-US". + let translation = l10n.using(LangMatch::langid_or_fallback("xx-YY")); // Retrocede a "en-US". assert_eq!(translation, Some("Hello world!".to_string())); } @@ -53,6 +53,6 @@ async fn check_unknown_key() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("non-existent-key"); - let translation = l10n.using(LangMatch::langid_or_fallback("en-US")); + let translation = l10n.using(LangMatch::langid_or_default("en-US")); assert_eq!(translation, None); } From a19587c39c073591ed0770840f6b8f6c80d97547 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Jul 2025 11:58:17 +0200 Subject: [PATCH 684/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20(bu?= =?UTF-8?q?ild):=20M=C3=A1s=20opciones=20de=20tipo=20para=20funciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cambia parámetros de tipo en las funciones `from_dir` y `with_name` para aceptar referencias a cadenas. --- helpers/pagetop-build/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index 3816c658..e125c591 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -160,8 +160,8 @@ impl StaticFilesBundle { /// .build() /// } /// ``` - pub fn from_dir(dir: &'static str, filter: Option<fn(p: &Path) -> bool>) -> Self { - let mut resource_dir = resource_dir(dir); + pub fn from_dir(dir: impl AsRef<str>, filter: Option<fn(p: &Path) -> bool>) -> Self { + let mut resource_dir = resource_dir(dir.as_ref()); // Aplica el filtro si está definido. if let Some(f) = filter { @@ -247,7 +247,8 @@ impl StaticFilesBundle { } /// Asigna un nombre al conjunto de recursos. - pub fn with_name(mut self, name: &'static str) -> Self { + pub fn with_name(mut self, name: impl AsRef<str>) -> Self { + let name = name.as_ref(); let out_dir = std::env::var("OUT_DIR").unwrap(); let filename = Path::new(&out_dir).join(format!("{name}.rs")); self.resource_dir.with_generated_filename(filename); From b3ed8e07af1d1b6318701eedd43b86f4471fae3a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Jul 2025 14:24:19 +0200 Subject: [PATCH 685/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20para?= =?UTF-8?q?=20recursos=20en=20documentos=20HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Incluye los recursos favicon, hojas de estilo y scripts JavaScript. - Se introduce una estructura de contexto que, además de gestionar el idioma y el uso de parámetros contextuales, permite administrar estos recursos en documentos HTML. --- src/html.rs | 74 ++++++++++++ src/html/assets.rs | 63 ++++++++++ src/html/assets/favicon.rs | 165 ++++++++++++++++++++++++++ src/html/assets/javascript.rs | 178 ++++++++++++++++++++++++++++ src/html/assets/stylesheet.rs | 174 +++++++++++++++++++++++++++ src/html/context.rs | 216 ++++++++++++++++++++++++++++++++++ src/html/maud.rs | 12 +- src/lib.rs | 6 + src/prelude.rs | 5 +- src/service.rs | 2 +- tests/html.rs | 17 +++ 11 files changed, 904 insertions(+), 8 deletions(-) create mode 100644 src/html/assets.rs create mode 100644 src/html/assets/favicon.rs create mode 100644 src/html/assets/javascript.rs create mode 100644 src/html/assets/stylesheet.rs create mode 100644 src/html/context.rs create mode 100644 tests/html.rs diff --git a/src/html.rs b/src/html.rs index 14e72b94..14a89edd 100644 --- a/src/html.rs +++ b/src/html.rs @@ -2,3 +2,77 @@ mod maud; pub use maud::{display, html, html_private, Escaper, Markup, PreEscaped, Render, DOCTYPE}; + +mod assets; +pub use assets::favicon::Favicon; +pub use assets::javascript::JavaScript; +pub use assets::stylesheet::{StyleSheet, TargetMedia}; +pub(crate) use assets::Assets; + +mod context; +pub use context::{Context, ErrorParam}; + +use crate::AutoDefault; + +/// Prepara contenido HTML para su conversión a [`Markup`]. +/// +/// Este tipo encapsula distintos orígenes de contenido HTML (texto plano, HTML escapado o marcado +/// ya procesado) para renderizar de forma homogénea en plantillas sin interferir con el uso +/// estándar de [`Markup`]. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let fragment = PrepareMarkup::Text(String::from("Hola <b>mundo</b>")); +/// assert_eq!(fragment.render().into_string(), "Hola &lt;b&gt;mundo&lt;/b&gt;"); +/// +/// let raw_html = PrepareMarkup::Escaped(String::from("<b>negrita</b>")); +/// assert_eq!(raw_html.render().into_string(), "<b>negrita</b>"); +/// +/// let prepared = PrepareMarkup::With(html! { +/// h2 { "Título de ejemplo" } +/// p { "Este es un párrafo con contenido dinámico." } +/// }); +/// assert_eq!( +/// prepared.render().into_string(), +/// "<h2>Título de ejemplo</h2><p>Este es un párrafo con contenido dinámico.</p>" +/// ); +/// ``` +#[derive(AutoDefault)] +pub enum PrepareMarkup { + /// No se genera contenido HTML (devuelve `html! {}`). + #[default] + None, + /// Texto estático que se escapará automáticamente para no ser interpretado como HTML. + Text(String), + /// Contenido sin escapado adicional, útil para HTML generado externamente. + Escaped(String), + /// Fragmento HTML ya preparado como [`Markup`], listo para insertarse directamente. + With(Markup), +} + +impl PrepareMarkup { + /// Devuelve `true` si el contenido está vacío y no generará HTML al renderizar. + pub fn is_empty(&self) -> bool { + match self { + PrepareMarkup::None => true, + PrepareMarkup::Text(text) => text.is_empty(), + PrepareMarkup::Escaped(string) => string.is_empty(), + PrepareMarkup::With(markup) => markup.is_empty(), + } + } +} + +impl Render for PrepareMarkup { + /// Integra el renderizado fácilmente en la macro [`html!`]. + fn render(&self) -> Markup { + match self { + PrepareMarkup::None => html! {}, + PrepareMarkup::Text(text) => html! { (text) }, + PrepareMarkup::Escaped(string) => html! { (PreEscaped(string)) }, + PrepareMarkup::With(markup) => html! { (markup) }, + } + } +} diff --git a/src/html/assets.rs b/src/html/assets.rs new file mode 100644 index 00000000..894b7e84 --- /dev/null +++ b/src/html/assets.rs @@ -0,0 +1,63 @@ +pub mod favicon; +pub mod javascript; +pub mod stylesheet; + +use crate::html::{html, Markup, Render}; +use crate::{AutoDefault, Weight}; + +pub trait AssetsTrait: Render { + // Devuelve el nombre del recurso, utilizado como clave única. + fn name(&self) -> &str; + + // Devuelve el peso del recurso, durante el renderizado se procesan de menor a mayor peso. + fn weight(&self) -> Weight; +} + +#[derive(AutoDefault)] +pub(crate) struct Assets<T>(Vec<T>); + +impl<T: AssetsTrait> Assets<T> { + pub fn new() -> Self { + Assets::<T>(Vec::<T>::new()) + } + + pub fn add(&mut self, asset: T) -> bool { + match self.0.iter().position(|x| x.name() == asset.name()) { + Some(index) => { + if self.0[index].weight() > asset.weight() { + self.0.remove(index); + self.0.push(asset); + true + } else { + false + } + } + _ => { + self.0.push(asset); + true + } + } + } + + pub fn remove(&mut self, name: impl AsRef<str>) -> bool { + if let Some(index) = self.0.iter().position(|x| x.name() == name.as_ref()) { + self.0.remove(index); + true + } else { + false + } + } +} + +impl<T: AssetsTrait> Render for Assets<T> { + fn render(&self) -> Markup { + let mut assets = self.0.iter().collect::<Vec<_>>(); + assets.sort_by_key(|a| a.weight()); + + html! { + @for a in assets { + (a.render()) + } + } + } +} diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs new file mode 100644 index 00000000..97a44e86 --- /dev/null +++ b/src/html/assets/favicon.rs @@ -0,0 +1,165 @@ +use crate::html::{html, Markup, Render}; +use crate::AutoDefault; + +/// Un **Favicon** es un recurso gráfico que usa el navegador como icono asociado al sitio. +/// +/// Es universalmente aceptado para mostrar el icono del sitio (`.ico`, `.png`, `.svg`, …) en +/// pestañas, marcadores o accesos directos. +/// +/// Este tipo permite construir de forma fluida las distintas variantes de un *favicon*, ya sea un +/// icono estándar, un icono Apple para la pantalla de inicio, o un icono para Safari con color. +/// También puede aplicar colores al tema o configuraciones específicas para *tiles* de Windows. +/// +/// > **Nota** +/// > Los archivos de los iconos deben estar disponibles en el servidor web de la aplicación. Pueden +/// > incluirse en el proyecto utilizando [`include_files`](crate::include_files) y servirse con +/// > [`include_files_service`](crate::include_files_service). +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let favicon = Favicon::new() +/// // Estándar de facto admitido por todos los navegadores. +/// .with_icon("/icons/favicon.ico") +/// +/// // Variante del favicon con tamaños explícitos: 32×32 y 16×16. +/// .with_icon_for_sizes("/icons/favicon-32.png", "32x32") +/// .with_icon_for_sizes("/icons/favicon-16.png", "16x16") +/// +/// // Icono específico para accesos directos en la pantalla de inicio de iOS. +/// .with_apple_touch_icon("/icons/apple-touch-icon.png", "180x180") +/// +/// // Icono vectorial con color dinámico para pestañas ancladas en Safari. +/// .with_mask_icon("/icons/safari-pinned-tab.svg", "#5bbad5") +/// +/// // Personaliza la barra superior del navegador en Android Chrome (y soportado en otros). +/// .with_theme_color("#ffffff") +/// +/// // Personalizaciones específicas para "tiles" en Windows. +/// .with_ms_tile_color("#da532c") +/// .with_ms_tile_image("/icons/mstile-144x144.png"); +/// ``` +#[derive(AutoDefault)] +pub struct Favicon(Vec<Markup>); + +impl Favicon { + /// Crea un nuevo `Favicon` vacío. + /// + /// Equivalente a `Favicon::default()`. Se recomienda iniciar la secuencia de configuración + /// desde aquí. + pub fn new() -> Self { + Favicon::default() + } + + // Favicon BUILDER ***************************************************************************** + + /// Le añade un icono genérico apuntando a `image`. El tipo MIME se infiere automáticamente a + /// partir de la extensión. + pub fn with_icon(self, image: impl Into<String>) -> Self { + self.add_icon_item("icon", image.into(), None, None) + } + + /// Le añade un icono genérico con atributo `sizes`, útil para indicar resoluciones específicas. + /// + /// El atributo `sizes` informa al navegador de las dimensiones de la imagen para que seleccione + /// el recurso más adecuado. Puede enumerar varias dimensiones separadas por espacios, p.ej. + /// `"16x16 32x32 48x48"` o usar `any` para iconos escalables (SVG). + /// + /// No es imprescindible, pero puede mejorar la selección del icono más adecuado. + pub fn with_icon_for_sizes(self, image: impl Into<String>, sizes: impl Into<String>) -> Self { + self.add_icon_item("icon", image.into(), Some(sizes.into()), None) + } + + /// Le añade un *Apple Touch Icon*, usado por dispositivos iOS para las pantallas de inicio. + /// + /// Se recomienda indicar también el tamaño, p.ej. `"256x256"`. + pub fn with_apple_touch_icon(self, image: impl Into<String>, sizes: impl Into<String>) -> Self { + self.add_icon_item("apple-touch-icon", image.into(), Some(sizes.into()), None) + } + + /// Le añade un icono para el navegador Safari, con un color dinámico. + /// + /// El atributo `color` lo usa Safari para colorear el trazado SVG cuando el icono se muestra en + /// modo *Pinned Tab*. Aunque Safari 12+ acepta *favicons normales*, este método garantiza + /// compatibilidad con versiones anteriores. + pub fn with_mask_icon(self, image: impl Into<String>, color: impl Into<String>) -> Self { + self.add_icon_item("mask-icon", image.into(), None, Some(color.into())) + } + + /// Define el color del tema (`<meta name="theme-color">`). + /// + /// Lo usan algunos navegadores para colorear la barra de direcciones o interfaces. + pub fn with_theme_color(mut self, color: impl Into<String>) -> Self { + self.0.push(html! { + meta name="theme-color" content=(color.into()); + }); + self + } + + /// Define el color del *tile* en Windows (`<meta name="msapplication-TileColor">`). + pub fn with_ms_tile_color(mut self, color: impl Into<String>) -> Self { + self.0.push(html! { + meta name="msapplication-TileColor" content=(color.into()); + }); + self + } + + /// Define la imagen del *tile* en Windows (`<meta name="msapplication-TileImage">`). + pub fn with_ms_tile_image(mut self, image: impl Into<String>) -> Self { + self.0.push(html! { + meta name="msapplication-TileImage" content=(image.into()); + }); + self + } + + // Función interna que centraliza la creación de las etiquetas `<link>`. + // + // - `icon_rel`: indica el tipo de recurso (`"icon"`, `"apple-touch-icon"`, etc.). + // - `icon_source`: URL del recurso. + // - `icon_sizes`: tamaños opcionales. + // - `icon_color`: color opcional (solo relevante para `mask-icon`). + // + // También infiere automáticamente el tipo MIME (`type`) según la extensión del archivo. + fn add_icon_item( + mut self, + icon_rel: &str, + icon_source: String, + icon_sizes: Option<String>, + icon_color: Option<String>, + ) -> Self { + let icon_type = match icon_source.rfind('.') { + Some(i) => match icon_source[i..].to_owned().to_lowercase().as_str() { + ".avif" => Some("image/avif"), + ".gif" => Some("image/gif"), + ".ico" => Some("image/x-icon"), + ".jpg" | ".jpeg" => Some("image/jpeg"), + ".png" => Some("image/png"), + ".svg" => Some("image/svg+xml"), + ".webp" => Some("image/webp"), + _ => None, + }, + _ => None, + }; + self.0.push(html! { + link + rel=(icon_rel) + type=[(icon_type)] + sizes=[(icon_sizes)] + color=[(icon_color)] + href=(icon_source); + }); + self + } +} + +impl Render for Favicon { + fn render(&self) -> Markup { + html! { + @for item in &self.0 { + (item) + } + } + } +} diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs new file mode 100644 index 00000000..fb0a1b64 --- /dev/null +++ b/src/html/assets/javascript.rs @@ -0,0 +1,178 @@ +use crate::html::assets::AssetsTrait; +use crate::html::{html, Markup, Render}; +use crate::{join, join_pair, AutoDefault, Weight}; + +// Define el origen del recurso JavaScript y cómo debe cargarse en el navegador. +// +// Los distintos modos de carga permiten optimizar el rendimiento y controlar el comportamiento del +// script. +// +// - [`From`] – Carga el script de forma estándar con la etiqueta `<script src="...">`. +// - [`Defer`] – Igual que [`From`], pero con el atributo `defer`. +// - [`Async`] – Igual que [`From`], pero con el atributo `async`. +// - [`Inline`] – Inserta el código directamente en la etiqueta `<script>`. +// - [`OnLoad`] – Inserta el código JavaScript y lo ejecuta tras el evento `DOMContentLoaded`. +#[derive(AutoDefault)] +enum Source { + #[default] + From(String), + Defer(String), + Async(String), + Inline(String, String), + OnLoad(String, String), +} + +/// Define un recurso **JavaScript** para incluir en un documento HTML. +/// +/// Este tipo permite añadir *scripts* externos o embebidos con distintas estrategias de carga +/// (`defer`, `async`, *inline*, etc.) y [pesos](crate::Weight) para controlar el orden de inserción +/// en el documento. +/// +/// > **Nota** +/// > Los archivos de los *scripts* deben estar disponibles en el servidor web de la aplicación. +/// > Pueden incluirse en el proyecto utilizando [`include_files`](crate::include_files) y servirse +/// > con [`include_files_service`](crate::include_files_service). +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Script externo con carga diferida, versión para control de caché y prioriza el renderizado. +/// let script = JavaScript::defer("/assets/js/app.js") +/// .with_version("1.2.3") +/// .with_weight(-10); +/// +/// // Script embebido que se ejecuta tras la carga del documento. +/// let script = JavaScript::on_load("init_tooltips", r#" +/// const tooltips = document.querySelectorAll('[data-tooltip]'); +/// for (const el of tooltips) { +/// el.addEventListener('mouseenter', showTooltip); +/// } +/// "#); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct JavaScript { + source : Source, // Fuente y modo de carga del script. + version: String, // Versión del recurso para la caché del navegador. + weight : Weight, // Peso que determina el orden. +} + +impl JavaScript { + /// Crea un **script externo** que se carga y ejecuta de forma inmediata, en orden con el resto + /// del documento HTML. + /// + /// Equivale a `<script src="...">`. + pub fn from(path: impl Into<String>) -> Self { + JavaScript { + source: Source::From(path.into()), + ..Default::default() + } + } + + /// Crea un **script externo** con el atributo `defer`, que se carga en segundo plano y se + /// ejecuta tras analizar completamente el documento HTML. + /// + /// Equivale a `<script src="..." defer>`. Útil para mantener el orden de ejecución y evitar + /// bloquear el análisis del documento HTML. + pub fn defer(path: impl Into<String>) -> Self { + JavaScript { + source: Source::Defer(path.into()), + ..Default::default() + } + } + + /// Crea un **script externo** con el atributo `async`, que se carga y ejecuta de forma + /// asíncrona tan pronto como esté disponible. + /// + /// Equivale a `<script src="..." async>`. La ejecución puede producirse fuera de orden respecto + /// a otros *scripts*. + pub fn asynchronous(path: impl Into<String>) -> Self { + JavaScript { + source: Source::Async(path.into()), + ..Default::default() + } + } + + /// Crea un **script embebido** directamente en el documento HTML. + /// + /// Equivale a `<script>…</script>`. El parámetro `name` se usa como identificador interno del + /// *script*. + pub fn inline(name: impl Into<String>, script: impl Into<String>) -> Self { + JavaScript { + source: Source::Inline(name.into(), script.into()), + ..Default::default() + } + } + + /// Crea un **script embebido** que se ejecuta automáticamente al terminar de cargarse el + /// documento HTML. + /// + /// El código se envuelve automáticamente en un `addEventListener('DOMContentLoaded', ...)`. El + /// parámetro `name` se usa como identificador interno del *script*. + pub fn on_load(name: impl Into<String>, script: impl Into<String>) -> Self { + JavaScript { + source: Source::OnLoad(name.into(), script.into()), + ..Default::default() + } + } + + // JavaScript BUILDER ************************************************************************** + + /// Asocia una versión al recurso (usada para control de la caché del navegador). + /// + /// Si `version` está vacío, no se añade ningún parámetro a la URL. + pub fn with_version(mut self, version: impl Into<String>) -> Self { + self.version = version.into(); + self + } + + /// Modifica el peso del recurso. + /// + /// Los recursos se renderizan de menor a mayor peso. Por defecto es `0`, que respeta el orden + /// de creación. + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } +} + +impl AssetsTrait for JavaScript { + // Para *scripts* externos es la ruta; para *scripts* embebidos, un identificador. + fn name(&self) -> &str { + match &self.source { + Source::From(path) => path, + Source::Defer(path) => path, + Source::Async(path) => path, + Source::Inline(name, _) => name, + Source::OnLoad(name, _) => name, + } + } + + fn weight(&self) -> Weight { + self.weight + } +} + +impl Render for JavaScript { + fn render(&self) -> Markup { + match &self.source { + Source::From(path) => html! { + script src=(join_pair!(path, "?v=", self.version.as_str())) {}; + }, + Source::Defer(path) => html! { + script src=(join_pair!(path, "?v=", self.version.as_str())) defer {}; + }, + Source::Async(path) => html! { + script src=(join_pair!(path, "?v=", self.version.as_str())) async {}; + }, + Source::Inline(_, code) => html! { + script { (code) }; + }, + Source::OnLoad(_, code) => html! { (join!( + "document.addEventListener('DOMContentLoaded',function(){", code, "});" + )) }, + } + } +} diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs new file mode 100644 index 00000000..7f64d187 --- /dev/null +++ b/src/html/assets/stylesheet.rs @@ -0,0 +1,174 @@ +use crate::html::assets::AssetsTrait; +use crate::html::{html, Markup, PreEscaped, Render}; +use crate::{join_pair, AutoDefault, Weight}; + +// Define el origen del recurso CSS y cómo se incluye en el documento. +// +// Los estilos pueden cargarse desde un archivo externo o estar embebidos directamente en una +// etiqueta `<style>`. +// +// - [`From`] – Carga la hoja de estilos desde un archivo externo, insertándola mediante una +// etiqueta `<link>` con `rel="stylesheet"`. +// - [`Inline`] – Inserta directamente el contenido CSS dentro de una etiqueta `<style>`. +#[derive(AutoDefault)] +enum Source { + #[default] + From(String), + Inline(String, String), +} + +/// Define el medio objetivo para la hoja de estilos. +/// +/// Permite especificar en qué contexto se aplica el CSS, adaptándose a diferentes dispositivos o +/// situaciones de impresión. +#[derive(AutoDefault)] +pub enum TargetMedia { + /// Se aplica en todos los casos (el atributo `media` se omite). + #[default] + Default, + /// Se aplica cuando el documento se imprime. + Print, + /// Se aplica en pantallas. + Screen, + /// Se aplica en dispositivos que convierten el texto a voz. + Speech, +} + +/// Devuelve el texto asociado al punto de interrupción usado por Bootstrap. +#[rustfmt::skip] +impl TargetMedia { + fn as_str_opt(&self) -> Option<&str> { + match self { + TargetMedia::Default => None, + TargetMedia::Print => Some("print"), + TargetMedia::Screen => Some("screen"), + TargetMedia::Speech => Some("speech"), + } + } +} + +/// Define un recurso **StyleSheet** para incluir en un documento HTML. +/// +/// Este tipo permite incluir hojas de estilo CSS externas o embebidas, con soporte para medios +/// específicos (`screen`, `print`, etc.) y [pesos](crate::Weight) que determinan el orden de +/// inserción en el documento. +/// +/// > **Nota** +/// > Las hojas de estilo CSS deben estar disponibles en el servidor web de la aplicación. Pueden +/// > incluirse en el proyecto utilizando [`include_files`](crate::include_files) y servirse con +/// > [`include_files_service`](crate::include_files_service). +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Crea una hoja de estilos externa con control de versión y medio específico (`screen`). +/// let stylesheet = StyleSheet::from("/assets/css/main.css") +/// .with_version("2.0.1") +/// .for_media(TargetMedia::Screen) +/// .with_weight(-10); +/// +/// // Crea una hoja de estilos embebida en el documento HTML. +/// let embedded = StyleSheet::inline("custom_theme", r#" +/// body { +/// background-color: #f5f5f5; +/// font-family: 'Segoe UI', sans-serif; +/// } +/// "#); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct StyleSheet { + source : Source, // Fuente y modo de inclusión del CSS. + version: String, // Versión del recurso para la caché del navegador. + media : TargetMedia, // Medio objetivo para los estilos (`print`, `screen`, …). + weight : Weight, // Peso que determina el orden. +} + +impl StyleSheet { + /// Crea una hoja de estilos externa. + /// + /// Equivale a `<link rel="stylesheet" href="...">`. + pub fn from(path: impl Into<String>) -> Self { + StyleSheet { + source: Source::From(path.into()), + ..Default::default() + } + } + + /// Crea una hoja de estilos embebida directamente en el documento HTML. + /// + /// Equivale a `<style>…</style>`. El parámetro `name` se usa como identificador interno del + /// recurso. + pub fn inline(name: impl Into<String>, styles: impl Into<String>) -> Self { + StyleSheet { + source: Source::Inline(name.into(), styles.into()), + ..Default::default() + } + } + + // StyleSheet BUILDER ************************************************************************** + + /// Asocia una versión al recurso (usada para control de la caché del navegador). + /// + /// Si `version` está vacío, no se añade ningún parámetro a la URL. + pub fn with_version(mut self, version: impl Into<String>) -> Self { + self.version = version.into(); + self + } + + /// Modifica el peso del recurso. + /// + /// Los recursos se renderizan de menor a mayor peso. Por defecto es `0`, que respeta el orden + /// de creación. + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + // StyleSheet EXTRAS *************************************************************************** + + /// Especifica el medio donde se aplican los estilos. + /// + /// Según el argumento `media`: + /// + /// - `TargetMedia::Default` - Se aplica en todos los casos (medio por defecto). + /// - `TargetMedia::Print` - Se aplican cuando el documento se imprime. + /// - `TargetMedia::Screen` - Se aplican en pantallas. + /// - `TargetMedia::Speech` - Se aplican en dispositivos que convierten el texto a voz. + pub fn for_media(mut self, media: TargetMedia) -> Self { + self.media = media; + self + } +} + +impl AssetsTrait for StyleSheet { + // Para hojas de estilos externas es la ruta; para las embebidas, un identificador. + fn name(&self) -> &str { + match &self.source { + Source::From(path) => path, + Source::Inline(name, _) => name, + } + } + + fn weight(&self) -> Weight { + self.weight + } +} + +impl Render for StyleSheet { + fn render(&self) -> Markup { + match &self.source { + Source::From(path) => html! { + link + rel="stylesheet" + href=(join_pair!(path, "?v=", self.version.as_str())) + media=[self.media.as_str_opt()]; + }, + Source::Inline(_, code) => html! { + style { (PreEscaped(code)) }; + }, + } + } +} diff --git a/src/html/context.rs b/src/html/context.rs new file mode 100644 index 00000000..23e2be2b --- /dev/null +++ b/src/html/context.rs @@ -0,0 +1,216 @@ +use crate::core::TypeInfo; +use crate::html::{html, Markup, Render}; +use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; +use crate::join; +use crate::locale::{LanguageIdentifier, DEFAULT_LANGID}; +use crate::service::HttpRequest; + +use std::collections::HashMap; +use std::error::Error; +use std::str::FromStr; + +use std::fmt; + +/// Errores de lectura o conversión de parámetros almacenados en el contexto. +#[derive(Debug)] +pub enum ErrorParam { + /// El parámetro solicitado no existe. + NotFound, + /// El valor del parámetro no pudo convertirse al tipo requerido. + ParseError(String), +} + +impl fmt::Display for ErrorParam { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ErrorParam::NotFound => write!(f, "Parameter not found"), + ErrorParam::ParseError(e) => write!(f, "Parse error: {e}"), + } + } +} + +impl Error for ErrorParam {} + +/// Representa el contexto asociado a un documento HTML. +/// +/// Esta estructura se crea internamente para recoger información relativa al documento asociado, +/// como la solicitud HTTP de origen, el idioma y los recursos *favicon* ([`Favicon`]), las hojas de +/// estilo [`StyleSheet`], los *scripts* [`JavaScript`], o parámetros de contexto definidos en +/// tiempo de ejecución. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// fn configure_context(mut ctx: Context) { +/// // Establece el idioma del documento a español. +/// ctx.set_langid(LangMatch::langid_or_default("es-ES")); +/// +/// // Asigna un favicon. +/// ctx.set_favicon(Some(Favicon::new().with_icon("/icons/favicon.ico"))); +/// +/// // Añade una hoja de estilo externa. +/// ctx.add_stylesheet(StyleSheet::from("/css/style.css")); +/// +/// // Añade un script JavaScript. +/// ctx.add_javascript(JavaScript::defer("/js/main.js")); +/// +/// // Añade un parámetro dinámico al contexto. +/// ctx.set_param("usuario_id", 42); +/// +/// // Recupera el parámetro y lo convierte a su tipo original. +/// let id: i32 = ctx.get_param("usuario_id").unwrap(); +/// assert_eq!(id, 42); +/// +/// // Genera un identificador único para un componente de tipo `Menu`. +/// struct Menu; +/// let unique_id = ctx.required_id::<Menu>(None); +/// assert_eq!(unique_id, "menu-1"); // Si es el primero generado. +/// } +/// ``` +#[rustfmt::skip] +pub struct Context { + request : HttpRequest, // Solicitud HTTP de origen. + langid : &'static LanguageIdentifier, // Identificador del idioma. + favicon : Option<Favicon>, // Favicon, si se ha definido. + stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. + javascripts: Assets<JavaScript>, // Scripts JavaScript. + params : HashMap<String, String>, // Parámetros definidos en tiempo de ejecución. + id_counter : usize, // Contador para generar identificadores únicos. +} + +impl Context { + // Crea un nuevo contexto asociado a una solicitud HTTP. + // + // El contexto inicializa el idioma por defecto, sin favicon ni recursos cargados. + #[rustfmt::skip] + pub(crate) fn new(request: HttpRequest) -> Self { + Context { + request, + langid : &DEFAULT_LANGID, + favicon : None, + stylesheets: Assets::<StyleSheet>::new(), + javascripts: Assets::<JavaScript>::new(), + params : HashMap::<String, String>::new(), + id_counter : 0, + } + } + + /// Modifica el identificador de idioma del documento. + pub fn set_langid(&mut self, langid: &'static LanguageIdentifier) -> &mut Self { + self.langid = langid; + self + } + + /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. + pub fn set_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { + self.favicon = favicon; + self + } + + /// Define el *favicon* solo si no se ha establecido previamente. + pub fn set_favicon_if_none(&mut self, favicon: Favicon) -> &mut Self { + if self.favicon.is_none() { + self.favicon = Some(favicon); + } + self + } + + /// Añade una hoja de estilos CSS al documento. + pub fn add_stylesheet(&mut self, css: StyleSheet) -> &mut Self { + self.stylesheets.add(css); + self + } + + /// Elimina una hoja de estilos por su ruta o identificador. + pub fn remove_stylesheet(&mut self, name: impl AsRef<str>) -> &mut Self { + self.stylesheets.remove(name); + self + } + + /// Añade un *script* JavaScript al documento. + pub fn add_javascript(&mut self, js: JavaScript) -> &mut Self { + self.javascripts.add(js); + self + } + + /// Elimina un *script* por su ruta o identificador. + pub fn remove_javascript(&mut self, name: impl AsRef<str>) -> &mut Self { + self.javascripts.remove(name); + self + } + + /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. + pub fn set_param<T: ToString>(&mut self, key: impl AsRef<str>, value: T) -> &mut Self { + self.params + .insert(key.as_ref().to_string(), value.to_string()); + self + } + + // Context GETTERS ***************************************************************************** + + /// Devuelve la solicitud HTTP asociada al documento. + pub fn request(&self) -> &HttpRequest { + &self.request + } + + /// Devuelve el identificador del idioma asociado al documento. + pub fn langid(&self) -> &LanguageIdentifier { + self.langid + } + + /// Recupera un parámetro del contexto convertido al tipo especificado. + /// + /// Devuelve un error si el parámetro no existe ([`ErrorParam::NotFound`]) o la conversión falla + /// ([`ErrorParam::ParseError`]). + pub fn get_param<T: FromStr>(&self, key: impl AsRef<str>) -> Result<T, ErrorParam> { + self.params + .get(key.as_ref()) + .ok_or(ErrorParam::NotFound) + .and_then(|v| T::from_str(v).map_err(|_| ErrorParam::ParseError(v.clone()))) + } + + // Context EXTRAS ****************************************************************************** + + /// Elimina un parámetro del contexto. Devuelve `true` si existía y se eliminó. + pub fn remove_param(&mut self, key: impl AsRef<str>) -> bool { + self.params.remove(key.as_ref()).is_some() + } + + /// Genera un identificador único si no se proporciona uno explícito. + /// + /// Si no se proporciona un `id`, se genera un identificador único en la forma `<tipo>-<número>` + /// donde `<tipo>` es el nombre corto del tipo en minúsculas (sin espacios) y `<número>` es un + /// contador interno incremental. + pub fn required_id<T>(&mut self, id: Option<String>) -> String { + if let Some(id) = id { + id + } else { + let prefix = TypeInfo::ShortName + .of::<T>() + .trim() + .replace(' ', "_") + .to_lowercase(); + let prefix = if prefix.is_empty() { + "prefix".to_owned() + } else { + prefix + }; + self.id_counter += 1; + join!(prefix, "-", self.id_counter.to_string()) + } + } +} + +impl Render for Context { + fn render(&self) -> Markup { + html! { + @if let Some(favicon) = &self.favicon { + (favicon) + } + (self.stylesheets) + (self.javascripts) + } + } +} diff --git a/src/html/maud.rs b/src/html/maud.rs index 39cb2c20..9bf179ec 100644 --- a/src/html/maud.rs +++ b/src/html/maud.rs @@ -18,7 +18,7 @@ pub use pagetop_macros::html; mod escape; -/// An adapter that escapes HTML special characters. +/// Adaptador que escapa los caracteres especiales de HTML. /// /// The following characters are escaped: /// @@ -57,7 +57,7 @@ impl fmt::Write for Escaper<'_> { } } -/// Represents a type that can be rendered as HTML. +/// Representa un tipo que puede renderizarse como HTML. /// /// To implement this for your own type, override either the `.render()` /// or `.render_to()` methods; since each is defined in terms of the @@ -190,7 +190,7 @@ impl_render_with_itoa! { u8 u16 u32 u64 u128 usize } -/// Renders a value using its [`Display`] impl. +/// Renderiza un valor usando su implementación de [`Display`]. /// /// # Example /// @@ -219,7 +219,7 @@ pub fn display(value: impl Display) -> impl Render { DisplayWrapper(value) } -/// A wrapper that renders the inner value without escaping. +/// Contenedor que renderiza el valor interno sin escapar. #[derive(Debug, Clone, Copy)] pub struct PreEscaped<T>(pub T); @@ -229,7 +229,7 @@ impl<T: AsRef<str>> Render for PreEscaped<T> { } } -/// A block of markup is a string that does not need to be escaped. +/// Un bloque de marcado es una cadena que no necesita ser escapada. /// /// The `html!` macro expands to an expression of this type. pub type Markup = PreEscaped<String>; @@ -259,7 +259,7 @@ impl<T: Default> Default for PreEscaped<T> { } } -/// The literal string `<!DOCTYPE html>`. +/// La cadena literal `<!DOCTYPE html>`. /// /// # Example /// diff --git a/src/lib.rs b/src/lib.rs index 248ba6d4..f3126212 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,6 +66,12 @@ impl Deref for StaticResources { } } +/// Representa el peso lógico de una instancia en una colección ordenada por pesos. +/// +/// Las instancias con pesos **más bajos**, incluyendo valores negativos (`-128..127`), se situarán +/// antes en la ordenación. +pub type Weight = i8; + // API ********************************************************************************************* // Funciones y macros útiles. diff --git a/src/prelude.rs b/src/prelude.rs index 6506aaf9..3a9f4f67 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -4,7 +4,7 @@ pub use crate::{builder_fn, html, main, test}; -pub use crate::{AutoDefault, StaticResources}; +pub use crate::{AutoDefault, StaticResources, Weight}; // MACROS. @@ -16,6 +16,8 @@ pub use crate::include_config; pub use crate::include_locales; // crate::service pub use crate::{include_files, include_files_service}; +// crate::core::action +//pub use crate::actions; // API. @@ -35,6 +37,7 @@ pub use crate::service; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; +//pub use crate::core::action::*; pub use crate::core::extension::*; pub use crate::app::Application; diff --git a/src/service.rs b/src/service.rs index 9e506fae..47e84224 100644 --- a/src/service.rs +++ b/src/service.rs @@ -6,7 +6,7 @@ pub use actix_web::dev::ServiceFactory as Factory; pub use actix_web::dev::ServiceRequest as Request; pub use actix_web::dev::ServiceResponse as Response; pub use actix_web::{http, rt, web}; -pub use actix_web::{App, Error, HttpServer}; +pub use actix_web::{App, Error, HttpRequest, HttpServer}; #[doc(hidden)] pub use actix_web::test; diff --git a/tests/html.rs b/tests/html.rs new file mode 100644 index 00000000..315f74ad --- /dev/null +++ b/tests/html.rs @@ -0,0 +1,17 @@ +use pagetop::prelude::*; + +#[pagetop::test] +async fn prepare_markup_is_empty() { + let _app = service::test::init_service(Application::new().test()).await; + + assert!(PrepareMarkup::None.is_empty()); + + assert!(PrepareMarkup::Text(String::from("")).is_empty()); + assert!(!PrepareMarkup::Text(String::from("x")).is_empty()); + + assert!(PrepareMarkup::Escaped(String::new()).is_empty()); + assert!(!PrepareMarkup::Escaped("a".into()).is_empty()); + + assert!(PrepareMarkup::With(html! {}).is_empty()); + assert!(!PrepareMarkup::With(html! { span { "!" } }).is_empty()); +} From 50b704fb6db8ace6fbb89f623b78968ec5845b95 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Jul 2025 14:28:09 +0200 Subject: [PATCH 686/853] =?UTF-8?q?=F0=9F=93=9D=20Retoques=20en=20la=20doc?= =?UTF-8?q?umentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core.rs | 2 +- src/core/extension.rs | 2 +- src/core/extension/definition.rs | 4 ++-- src/lib.rs | 1 - src/locale.rs | 30 +++++++++++++++--------------- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/core.rs b/src/core.rs index 5aebd1fa..4541fae6 100644 --- a/src/core.rs +++ b/src/core.rs @@ -201,5 +201,5 @@ pub trait AnyCast: AnyInfo { /// Implementación automática para cualquier tipo que ya cumpla [`AnyInfo`]. impl<T: ?Sized + AnyInfo> AnyCast for T {} -// Infraestructura para ampliar funcionalidades mediante extensiones. +// API para añadir nuevas funcionalidades usando extensiones. pub mod extension; diff --git a/src/core/extension.rs b/src/core/extension.rs index 9eb3bd24..c493cf5c 100644 --- a/src/core/extension.rs +++ b/src/core/extension.rs @@ -1,4 +1,4 @@ -//! Infraestructura para ampliar funcionalidades mediante extensiones. +//! API para añadir nuevas funcionalidades usando extensiones. //! //! Cada funcionalidad adicional que quiera incorporarse a una aplicación `PageTop` se debe modelar //! como una **extensión**. Todas comparten la misma interfaz declarada en [`ExtensionTrait`]. diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 761fceea..625beba0 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -10,8 +10,8 @@ pub type ExtensionRef = &'static dyn ExtensionTrait; /// Interfaz común que debe implementar cualquier extensión de `PageTop`. /// -/// Este *trait* es fácil de implementar, basta con declarar la estructura de la extensión y -/// sobreescribir los métodos que sea necesario. +/// Este *trait* es fácil de implementar, basta con declarar una estructura de tamaño cero para la +/// extensión y sobreescribir los métodos que sea necesario. /// /// ```rust /// use pagetop::prelude::*; diff --git a/src/lib.rs b/src/lib.rs index f3126212..edc791cd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,7 +29,6 @@ //! ``` #![cfg_attr(docsrs, feature(doc_cfg))] - #![doc( html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" )] diff --git a/src/locale.rs b/src/locale.rs index ab1f5efc..2dcf27e7 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -107,8 +107,8 @@ use std::sync::LazyLock; use std::fmt; -// Asocia cada código de idioma (como "en-US") con su respectivo [`LanguageIdentifier`] y la clave -// en *locale/.../languages.ftl* para obtener el nombre del idioma según la localización. +// Asocia cada identificador de idioma (como "en-US") con su respectivo [`LanguageIdentifier`] y la +// clave en *locale/.../languages.ftl* para obtener el nombre del idioma según la localización. static LANGUAGES: LazyLock<HashMap<&str, (LanguageIdentifier, &str)>> = LazyLock::new(|| { hm![ "en" => ( langid!("en-US"), "english" ), @@ -121,20 +121,20 @@ static LANGUAGES: LazyLock<HashMap<&str, (LanguageIdentifier, &str)>> = LazyLock // Identificador del idioma de **respaldo** (predefinido a `en-US`). // -// Se usa cuando el valor del código de idioma en las traducciones no corresponde con ningún idioma -// soportado por la aplicación. +// Se usa cuando el valor del identificador de idioma en las traducciones no corresponde con ningún +// idioma soportado por la aplicación. static FALLBACK_LANGID: LazyLock<LanguageIdentifier> = LazyLock::new(|| langid!("en-US")); // Identificador del idioma **por defecto** para la aplicación. // -// Se resuelve a partir de [`global::SETTINGS.app.language`](global::SETTINGS). Si el código de -// idioma configurado no es válido o no está disponible entonces resuelve como [`FALLBACK_LANGID`]. +// Se resuelve a partir de [`global::SETTINGS.app.language`](global::SETTINGS). Si el identificador +// de idioma no es válido o no está disponible entonces resuelve como [`FALLBACK_LANGID`]. pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = LazyLock::new(|| LangMatch::langid_or_fallback(&global::SETTINGS.app.language)); /// Operaciones con los idiomas soportados por `PageTop`. /// -/// Utiliza [`LangMatch`] para transformar un código de idioma en un [`LanguageIdentifier`] +/// Utiliza [`LangMatch`] para transformar un identificador de idioma en un [`LanguageIdentifier`] /// soportado por `PageTop`. /// /// # Ejemplos @@ -156,10 +156,10 @@ pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = /// /// // Idioma no soportado. /// let lang = LangMatch::resolve("ja-JP"); -/// assert_eq!(lang, LangMatch::Unsupported("ja-JP".to_string())); +/// assert_eq!(lang, LangMatch::Unsupported(String::from("ja-JP"))); /// ``` /// -/// Las siguientes instrucciones devuelven siempre un [`LanguageIdentifier`] válido, ya sea porque +/// Las siguientes líneas devuelven siempre un [`LanguageIdentifier`] válido, ya sea porque /// resuelven un idioma soportado o porque aplican el idioma por defecto o de respaldo: /// /// ```rust @@ -177,13 +177,13 @@ pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = /// ``` #[derive(Clone, Debug, Eq, PartialEq)] pub enum LangMatch { - /// Cuando el código del idioma es una cadena vacía. + /// Cuando el identificador del idioma es una cadena vacía. Unspecified, /// Si encuentra un [`LanguageIdentifier`] en la lista de idiomas soportados por `PageTop` que - /// coincide exactamente con el código del idioma (p.ej. "es-ES"), o con el código del idioma - /// base (p.ej. "es"). + /// coincide exactamente con el identificador del idioma (p.ej. "es-ES"), o con el identificador + /// del idioma base (p.ej. "es"). Found(&'static LanguageIdentifier), - /// Si el código del idioma no está entre los soportados por `PageTop`. + /// Si el identificador del idioma no está entre los soportados por `PageTop`. Unsupported(String), } @@ -210,7 +210,7 @@ impl LangMatch { } // En otro caso indica que el idioma no está soportado. - Self::Unsupported(language.to_string()) + Self::Unsupported(String::from(language)) } /// Devuelve el idioma de la variante de la instancia, o el idioma por defecto si no está @@ -319,7 +319,7 @@ enum L10nOp { /// También para traducciones a idiomas concretos. /// /// ```rust,ignore -/// // Traducción con clave, conjunto de traducciones y código de idioma a usar. +/// // Traducción con clave, conjunto de traducciones e identificador de idioma a usar. /// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(LangMatch::langid_or_default("it")); /// ``` #[derive(AutoDefault)] From 861392430a5c4bb073e8de968e600c0ffa5a318a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 20 Jul 2025 23:51:15 +0200 Subject: [PATCH 687/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20a=20?= =?UTF-8?q?temas=20en=20la=20API=20de=20extensiones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Incluye una opción de configuración para definir el tema por defecto. - Añade un tema básico predeterminado. --- config/default.toml | 2 ++ src/base.rs | 3 +++ src/base/theme.rs | 4 ++++ src/base/theme/basic.rs | 14 ++++++++++++++ src/core.rs | 5 ++++- src/core/extension/all.rs | 19 +++++++++++++++++++ src/core/extension/definition.rs | 26 ++++++++++++++++++++++++++ src/core/theme.rs | 6 ++++++ src/core/theme/all.rs | 31 +++++++++++++++++++++++++++++++ src/core/theme/definition.rs | 30 ++++++++++++++++++++++++++++++ src/global.rs | 3 +++ src/lib.rs | 4 +++- src/prelude.rs | 6 +++--- 13 files changed, 148 insertions(+), 5 deletions(-) create mode 100644 config/default.toml create mode 100644 src/base.rs create mode 100644 src/base/theme.rs create mode 100644 src/base/theme/basic.rs create mode 100644 src/core/theme.rs create mode 100644 src/core/theme/all.rs create mode 100644 src/core/theme/definition.rs diff --git a/config/default.toml b/config/default.toml new file mode 100644 index 00000000..3e254586 --- /dev/null +++ b/config/default.toml @@ -0,0 +1,2 @@ +[log] +tracing = "Info,pagetop=Debug" diff --git a/src/base.rs b/src/base.rs new file mode 100644 index 00000000..c50cc9e4 --- /dev/null +++ b/src/base.rs @@ -0,0 +1,3 @@ +//! Reúne temas listos para usar. + +pub mod theme; diff --git a/src/base/theme.rs b/src/base/theme.rs new file mode 100644 index 00000000..ea9eeb66 --- /dev/null +++ b/src/base/theme.rs @@ -0,0 +1,4 @@ +//! Temas básicos soportados por `PageTop`. + +mod basic; +pub use basic::Basic; diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs new file mode 100644 index 00000000..0fc533c5 --- /dev/null +++ b/src/base/theme/basic.rs @@ -0,0 +1,14 @@ +//! Es el tema básico que incluye `PageTop` por defecto. + +use crate::prelude::*; + +/// Tema básico por defecto. +pub struct Basic; + +impl ExtensionTrait for Basic { + fn theme(&self) -> Option<ThemeRef> { + Some(&Self) + } +} + +impl ThemeTrait for Basic {} diff --git a/src/core.rs b/src/core.rs index 4541fae6..9f3d7b55 100644 --- a/src/core.rs +++ b/src/core.rs @@ -1,4 +1,4 @@ -//! Tipos y funciones esenciales para crear extensiones. +//! Tipos y funciones esenciales para crear extensiones y temas. use std::any::Any; @@ -203,3 +203,6 @@ impl<T: ?Sized + AnyInfo> AnyCast for T {} // API para añadir nuevas funcionalidades usando extensiones. pub mod extension; + +// API para añadir y gestionar nuevos temas. +pub mod theme; diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index d5bebdad..63a178c9 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -1,4 +1,5 @@ use crate::core::extension::ExtensionRef; +use crate::core::theme::all::THEMES; use crate::{service, trace}; use std::sync::{LazyLock, RwLock}; @@ -17,6 +18,9 @@ pub fn register_extensions(root_extension: Option<ExtensionRef>) { // Prepara la lista de extensiones habilitadas. let mut enabled_list: Vec<ExtensionRef> = Vec::new(); + // Primero añade el tema básico a la lista de extensiones habilitadas. + add_to_enabled(&mut enabled_list, &crate::base::theme::Basic); + // Si se proporciona una extensión raíz inicial, se añade a la lista de extensiones habilitadas. if let Some(extension) = root_extension { add_to_enabled(&mut enabled_list, extension); @@ -53,6 +57,21 @@ fn add_to_enabled(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { // Añade la propia extensión a la lista. list.push(extension); + + // Comprueba si la extensión tiene un tema asociado que deba registrarse. + if let Some(theme) = extension.theme() { + let mut registered_themes = THEMES.write().unwrap(); + // Asegura que el tema no esté ya registrado para evitar duplicados. + if !registered_themes + .iter() + .any(|t| t.type_id() == theme.type_id()) + { + registered_themes.push(theme); + trace::debug!("Enabling \"{}\" theme", theme.short_name()); + } + } else { + trace::debug!("Enabling \"{}\" extension", extension.short_name()); + } } } diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 625beba0..6b963a24 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -1,3 +1,4 @@ +use crate::core::theme::ThemeRef; use crate::core::AnyInfo; use crate::locale::L10n; use crate::service; @@ -36,6 +37,31 @@ pub trait ExtensionTrait: AnyInfo + Send + Sync { L10n::default() } + /// Los temas son extensiones que implementan [`ExtensionTrait`] y también + /// [`ThemeTrait`](crate::core::theme::ThemeTrait). + /// + /// Si la extensión no es un tema, este método devuelve `None` por defecto. + /// + /// En caso contrario, este método debe implementarse para devolver una referencia de sí mismo + /// como tema. Por ejemplo: + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// pub struct MyTheme; + /// + /// impl ExtensionTrait for MyTheme { + /// fn theme(&self) -> Option<ThemeRef> { + /// Some(&Self) + /// } + /// } + /// + /// impl ThemeTrait for MyTheme {} + /// ``` + fn theme(&self) -> Option<ThemeRef> { + None + } + /// Otras extensiones que deben habilitarse **antes** de esta. /// /// `PageTop` las resolverá automáticamente respetando el orden durante el arranque de la diff --git a/src/core/theme.rs b/src/core/theme.rs new file mode 100644 index 00000000..d741cf80 --- /dev/null +++ b/src/core/theme.rs @@ -0,0 +1,6 @@ +//! API para añadir y gestionar nuevos temas. + +mod definition; +pub use definition::{ThemeRef, ThemeTrait}; + +pub(crate) mod all; diff --git a/src/core/theme/all.rs b/src/core/theme/all.rs new file mode 100644 index 00000000..3516107e --- /dev/null +++ b/src/core/theme/all.rs @@ -0,0 +1,31 @@ +use crate::core::theme::ThemeRef; +use crate::global; + +use std::sync::{LazyLock, RwLock}; + +// TEMAS ******************************************************************************************* + +pub static THEMES: LazyLock<RwLock<Vec<ThemeRef>>> = LazyLock::new(|| RwLock::new(Vec::new())); + +// TEMA PREDETERMINADO ***************************************************************************** + +pub static DEFAULT_THEME: LazyLock<ThemeRef> = + LazyLock::new(|| match theme_by_short_name(&global::SETTINGS.app.theme) { + Some(theme) => theme, + None => &crate::base::theme::Basic, + }); + +// TEMA POR NOMBRE ********************************************************************************* + +pub fn theme_by_short_name(short_name: impl AsRef<str>) -> Option<ThemeRef> { + let short_name = short_name.as_ref().to_lowercase(); + match THEMES + .read() + .unwrap() + .iter() + .find(|t| t.short_name().to_lowercase() == short_name) + { + Some(theme) => Some(*theme), + _ => None, + } +} diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs new file mode 100644 index 00000000..13fe2824 --- /dev/null +++ b/src/core/theme/definition.rs @@ -0,0 +1,30 @@ +use crate::core::extension::ExtensionTrait; + +/// Representa una referencia a un tema. +/// +/// Los temas son también extensiones. Por tanto se deben definir igual, es decir, como instancias +/// estáticas globales que implementan [`ThemeTrait`], pero también [`ExtensionTrait`]. +pub type ThemeRef = &'static dyn ThemeTrait; + +/// Interfaz común que debe implementar cualquier tema de `PageTop`. +/// +/// Un tema implementará [`ThemeTrait`] y los métodos que sean necesarios de [`ExtensionTrait`], +/// aunque el único obligatorio es [`theme()`](crate::core::extension::ExtensionTrait#method.theme). +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// pub struct MyTheme; +/// +/// impl ExtensionTrait for MyTheme { +/// fn name(&self) -> L10n { L10n::n("My theme") } +/// fn description(&self) -> L10n { L10n::n("Un tema personal") } +/// +/// fn theme(&self) -> Option<ThemeRef> { +/// Some(&Self) +/// } +/// } +/// +/// impl ThemeTrait for MyTheme {} +/// ``` +pub trait ThemeTrait: ExtensionTrait + Send + Sync {} diff --git a/src/global.rs b/src/global.rs index c3332d39..e8f50658 100644 --- a/src/global.rs +++ b/src/global.rs @@ -8,6 +8,7 @@ include_config!(SETTINGS: Settings => [ // [app] "app.name" => "Sample", "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Basic", "app.language" => "en-US", "app.startup_banner" => "Slant", @@ -40,6 +41,8 @@ pub struct App { pub name: String, /// Breve descripción de la aplicación. pub description: String, + /// Tema predeterminado. + pub theme: String, /// Idioma predeterminado (localización). pub language: String, /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o diff --git a/src/lib.rs b/src/lib.rs index edc791cd..264fdbc4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -87,10 +87,12 @@ pub mod html; pub mod locale; // Soporte a fechas y horas. pub mod datetime; -// Tipos y funciones esenciales para crear extensiones. +// Tipos y funciones esenciales para crear extensiones y temas. pub mod core; // Gestión del servidor y servicios web. pub mod service; +// Reúne temas listos para usar. +pub mod base; // Prepara y ejecuta la aplicación. pub mod app; diff --git a/src/prelude.rs b/src/prelude.rs index 3a9f4f67..7244b912 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -16,8 +16,6 @@ pub use crate::include_config; pub use crate::include_locales; // crate::service pub use crate::{include_files, include_files_service}; -// crate::core::action -//pub use crate::actions; // API. @@ -37,7 +35,9 @@ pub use crate::service; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; -//pub use crate::core::action::*; pub use crate::core::extension::*; +pub use crate::core::theme::*; + +pub use crate::base::theme; pub use crate::app::Application; From c89d4bb5fc609be3f0d040a68b2df1727469e0df Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 21 Jul 2025 08:58:09 +0200 Subject: [PATCH 688/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20para?= =?UTF-8?q?=20inyectar=20acciones=20en=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.rs | 3 + src/core.rs | 5 +- src/core/action.rs | 66 ++++++++++++++++++++ src/core/action/all.rs | 66 ++++++++++++++++++++ src/core/action/definition.rs | 102 +++++++++++++++++++++++++++++++ src/core/action/list.rs | 43 +++++++++++++ src/core/extension/all.rs | 11 ++++ src/core/extension/definition.rs | 12 +++- src/lib.rs | 7 ++- src/prelude.rs | 5 +- 10 files changed, 316 insertions(+), 4 deletions(-) create mode 100644 src/core/action.rs create mode 100644 src/core/action/all.rs create mode 100644 src/core/action/definition.rs create mode 100644 src/core/action/list.rs diff --git a/src/app.rs b/src/app.rs index 0bcece8e..b6b5a716 100644 --- a/src/app.rs +++ b/src/app.rs @@ -56,6 +56,9 @@ impl Application { // Registra las extensiones de la aplicación. extension::all::register_extensions(root_extension); + // Registra las acciones de las extensiones. + extension::all::register_actions(); + // Inicializa las extensiones. extension::all::initialize_extensions(); diff --git a/src/core.rs b/src/core.rs index 9f3d7b55..4b857fc4 100644 --- a/src/core.rs +++ b/src/core.rs @@ -1,4 +1,4 @@ -//! Tipos y funciones esenciales para crear extensiones y temas. +//! Tipos y funciones esenciales para crear acciones, extensiones y temas. use std::any::Any; @@ -201,6 +201,9 @@ pub trait AnyCast: AnyInfo { /// Implementación automática para cualquier tipo que ya cumpla [`AnyInfo`]. impl<T: ?Sized + AnyInfo> AnyCast for T {} +// API para definir acciones que alteran el comportamiento predeterminado del código. +pub mod action; + // API para añadir nuevas funcionalidades usando extensiones. pub mod extension; diff --git a/src/core/action.rs b/src/core/action.rs new file mode 100644 index 00000000..8503ae90 --- /dev/null +++ b/src/core/action.rs @@ -0,0 +1,66 @@ +//! API para definir acciones que inyectan código en el flujo de la aplicación. +//! +//! Permite crear acciones en las librerías para que otros *crates* puedan inyectar código usando +//! funciones *ad hoc* que modifican el comportamiento predefinido en puntos concretos del flujo de +//! ejecución de la aplicación. + +mod definition; +pub use definition::{ActionBase, ActionBox, ActionKey, ActionTrait}; + +mod list; +use list::ActionsList; + +mod all; +pub(crate) use all::add_action; +pub use all::dispatch_actions; + +/// Crea una lista de acciones para facilitar la implementación del método +/// [`actions`](crate::core::extension::ExtensionTrait#method.actions). +/// +/// Esta macro crea vectores de [`ActionBox`], el tipo dinámico que encapsula cualquier acción que +/// implemente [`ActionTrait`]. Evita escribir repetidamente `Box::new(...)` para cada acción +/// inyectada, manteniendo el código más limpio. +/// +/// # Ejemplos +/// +/// Puede llamarse sin argumentos para crear un vector vacío: +/// +/// ```rust,ignore +/// let my_actions = inject_actions![]; +/// ``` +/// +/// O con una lista de acciones concretas: +/// +/// ```rust,ignore +/// let my_actions = inject_actions![ +/// MyFirstAction::new(), +/// MySecondAction::new().with_weight(10), +/// ]; +/// ``` +/// +/// Internamente, expande a un `vec![Box::new(...), ...]`. +/// +/// # Ejemplo típico en una extensión +/// +/// ```rust,ignore +/// impl ExtensionTrait for MyExtension { +/// fn actions(&self) -> Vec<ActionBox> { +/// inject_actions![ +/// CustomizeLoginAction::new(), +/// ModifyHeaderAction::new().with_weight(-5), +/// ] +/// } +/// } +/// ``` +/// +/// Así, `PageTop` podrá registrar todas estas acciones durante la inicialización de la extensión y +/// posteriormente despacharlas según corresponda. +#[macro_export] +macro_rules! inject_actions { + () => { + Vec::<ActionBox>::new() + }; + ( $($action:expr),+ $(,)? ) => {{ + vec![$(Box::new($action),)+] + }}; +} diff --git a/src/core/action/all.rs b/src/core/action/all.rs new file mode 100644 index 00000000..4dcb68df --- /dev/null +++ b/src/core/action/all.rs @@ -0,0 +1,66 @@ +use crate::core::action::{ActionBox, ActionKey, ActionTrait, ActionsList}; + +use std::collections::HashMap; +use std::sync::{LazyLock, RwLock}; + +// ACCIONES **************************************************************************************** + +static ACTIONS: LazyLock<RwLock<HashMap<ActionKey, ActionsList>>> = + LazyLock::new(|| RwLock::new(HashMap::new())); + +// AÑADIR ACCIONES ********************************************************************************* + +// Registra una nueva acción en el sistema. +// +// Si ya existen acciones con la misma `ActionKey`, la acción se añade a la lista existente. Si no, +// se crea una nueva lista. +// +// # Uso típico +// +// Las extensiones llamarán a esta función durante su inicialización para instalar acciones +// personalizadas que modifiquen el comportamiento del núcleo o de otros componentes. +// +// ```rust,ignore +// add_action(Box::new(MyCustomAction::new())); +// ``` +pub fn add_action(action: ActionBox) { + let key = action.key(); + let mut actions = ACTIONS.write().unwrap(); + if let Some(list) = actions.get_mut(&key) { + list.add(action); + } else { + let mut list = ActionsList::new(); + list.add(action); + actions.insert(key, list); + } +} + +// DESPLEGAR ACCIONES ****************************************************************************** + +/// Despacha las funciones asociadas a un [`ActionKey`] y las ejecuta. +/// +/// Permite recorrer de forma segura y ordenada (por peso) la lista de funciones asociadas a una +/// acción específica. +/// +/// # Parámetros genéricos +/// - `A`: Tipo de acción que esperamos procesar. Debe implementar [`ActionTrait`]. +/// - `F`: Función o cierre que recibe cada acción y devuelve un valor de tipo `B`. +/// +/// # Ejemplo de uso +/// ```rust,ignore +/// dispatch_actions::<MyCustomAction, _>(&some_key, |action| { +/// action.do_something(); +/// }); +/// ``` +/// +/// Esto permite a PageTop o a otros módulos aplicar lógica específica a las acciones de un contexto +/// determinado, manteniendo la flexibilidad del sistema. +pub fn dispatch_actions<A, B, F>(key: &ActionKey, f: F) +where + A: ActionTrait, + F: FnMut(&A) -> B, +{ + if let Some(list) = ACTIONS.read().unwrap().get(key) { + list.iter_map(f); + } +} diff --git a/src/core/action/definition.rs b/src/core/action/definition.rs new file mode 100644 index 00000000..d662b2b6 --- /dev/null +++ b/src/core/action/definition.rs @@ -0,0 +1,102 @@ +use crate::core::AnyInfo; +use crate::{UniqueId, Weight}; + +/// Tipo dinámico para encapsular cualquier acción que implementa [`ActionTrait`]. +pub type ActionBox = Box<dyn ActionTrait>; + +/// Identifica una acción con una clave que define las condiciones de selección de las funciones +/// asociadas a esa acción. +/// +/// Las funciones seleccionadas se van a [despachar](crate::core::action::dispatch_actions) y +/// ejecutar en un punto concreto del flujo de ejecución. +/// +/// # Campos +/// +/// - `action_type_id`: Tipo de la acción. +/// - `theme_type_id`: Opcional, filtra las funciones para un tema dado. +/// - `referer_type_id`: Opcional, filtra las funciones para un tipo dado (p.ej. para un tipo de +/// componente). +/// - `referer_id`: Opcional, filtra las funciones por el identificador de una instancia (p.ej. para +/// un formulario concreto). +#[derive(Eq, PartialEq, Hash)] +pub struct ActionKey { + action_type_id: UniqueId, + theme_type_id: Option<UniqueId>, + referer_type_id: Option<UniqueId>, + referer_id: Option<String>, +} + +impl ActionKey { + /// Crea una nueva clave para un tipo de acción. + /// + /// Esta clave permite seleccionar las funciones a ejecutar para ese tipo de acción con filtros + /// opcionales por tema, un tipo de referencia, o una instancia concreta según su identificador. + pub fn new( + action_type_id: UniqueId, + theme_type_id: Option<UniqueId>, + referer_type_id: Option<UniqueId>, + referer_id: Option<String>, + ) -> Self { + ActionKey { + action_type_id, + theme_type_id, + referer_type_id, + referer_id, + } + } +} + +/// Trait base que permite obtener la clave ([`ActionKey`]) asociada a una acción. +/// +/// Implementado automáticamente para cualquier tipo que cumpla [`ActionTrait`]. +pub trait ActionBase { + fn key(&self) -> ActionKey; +} + +/// Interfaz común que deben implementar las acciones del código que pueden ser modificadas. +/// +/// Este trait combina: +/// - [`AnyInfo`] para identificación única del tipo en tiempo de ejecución. +/// - `Send + Sync` para permitir uso concurrente seguro. +/// +/// # Métodos personalizables +/// - `theme_type_id()`: Asocia la acción a un tipo concreto de tema (si aplica). +/// - `referer_type_id()`: Asocia la acción a un tipo de objeto referente (si aplica). +/// - `referer_id()`: Asocia la acción a un identificador concreto. +/// - `weight()`: Controla el orden de aplicación de acciones; valores más bajos se ejecutan antes. +pub trait ActionTrait: ActionBase + AnyInfo + Send + Sync { + /// Especifica el tipo de tema asociado. Por defecto `None`. + fn theme_type_id(&self) -> Option<UniqueId> { + None + } + + /// Especifica el tipo del objeto referente. Por defecto `None`. + fn referer_type_id(&self) -> Option<UniqueId> { + None + } + + /// Especifica un identificador único del objeto referente. Por defecto `None`. + fn referer_id(&self) -> Option<String> { + None + } + + /// Define el peso lógico de la acción para determinar el orden de aplicación. + /// + /// Acciones con pesos más bajos se aplicarán antes. Se pueden usar valores negativos. Por + /// defecto es `0`. + fn weight(&self) -> Weight { + 0 + } +} + +// Implementación automática que construye la clave `ActionKey` a partir de los métodos definidos. +impl<A: ActionTrait> ActionBase for A { + fn key(&self) -> ActionKey { + ActionKey { + action_type_id: self.type_id(), + theme_type_id: self.theme_type_id(), + referer_type_id: self.referer_type_id(), + referer_id: self.referer_id(), + } + } +} diff --git a/src/core/action/list.rs b/src/core/action/list.rs new file mode 100644 index 00000000..ec8149be --- /dev/null +++ b/src/core/action/list.rs @@ -0,0 +1,43 @@ +use crate::core::action::{ActionBox, ActionTrait}; +use crate::core::AnyCast; +use crate::trace; +use crate::AutoDefault; + +use std::sync::RwLock; + +#[derive(AutoDefault)] +pub struct ActionsList(RwLock<Vec<ActionBox>>); + +impl ActionsList { + pub fn new() -> Self { + ActionsList::default() + } + + pub fn add(&mut self, action: ActionBox) { + let mut list = self.0.write().unwrap(); + list.push(action); + list.sort_by_key(|a| a.weight()); + } + + pub fn iter_map<A, B, F>(&self, mut f: F) + where + Self: Sized, + A: ActionTrait, + F: FnMut(&A) -> B, + { + let _: Vec<_> = self + .0 + .read() + .unwrap() + .iter() + .rev() + .map(|a| { + if let Some(action) = (**a).downcast_ref::<A>() { + f(action); + } else { + trace::error!("Failed to downcast action of type {}", (**a).type_name()); + } + }) + .collect(); + } +} diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index 63a178c9..9012234f 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -1,3 +1,4 @@ +use crate::core::action::add_action; use crate::core::extension::ExtensionRef; use crate::core::theme::all::THEMES; use crate::{service, trace}; @@ -105,6 +106,16 @@ fn add_to_dropped(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { } } +// REGISTRO DE LAS ACCIONES ************************************************************************ + +pub fn register_actions() { + for extension in ENABLED_EXTENSIONS.read().unwrap().iter() { + for a in extension.actions().into_iter() { + add_action(a); + } + } +} + // INICIALIZA LAS EXTENSIONES ********************************************************************** pub fn initialize_extensions() { diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 6b963a24..645afc80 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -1,7 +1,8 @@ +use crate::core::action::ActionBox; use crate::core::theme::ThemeRef; use crate::core::AnyInfo; use crate::locale::L10n; -use crate::service; +use crate::{inject_actions, service}; /// Representa una referencia a una extensión. /// @@ -70,6 +71,15 @@ pub trait ExtensionTrait: AnyInfo + Send + Sync { vec![] } + /// Devuelve la lista de acciones que la extensión va a registrar. + /// + /// Estas [acciones](crate::core::action) se despachan por orden de registro o por + /// [peso](crate::Weight), permitiendo personalizar el comportamiento de la aplicación en puntos + /// específicos. + fn actions(&self) -> Vec<ActionBox> { + inject_actions![] + } + /// Inicializa la extensión durante la lógica de arranque de la aplicación. /// /// Se llama una sola vez, después de que todas las dependencias se han inicializado y antes de diff --git a/src/lib.rs b/src/lib.rs index 264fdbc4..4ab3c6e4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -65,6 +65,11 @@ impl Deref for StaticResources { } } +/// Identificador único de un tipo estático durante la ejecución de la aplicación. +/// +/// **Nota:** El valor es único sólo dentro del proceso actual y cambia en cada compilación. +pub type UniqueId = std::any::TypeId; + /// Representa el peso lógico de una instancia en una colección ordenada por pesos. /// /// Las instancias con pesos **más bajos**, incluyendo valores negativos (`-128..127`), se situarán @@ -87,7 +92,7 @@ pub mod html; pub mod locale; // Soporte a fechas y horas. pub mod datetime; -// Tipos y funciones esenciales para crear extensiones y temas. +// Tipos y funciones esenciales para crear acciones, extensiones y temas. pub mod core; // Gestión del servidor y servicios web. pub mod service; diff --git a/src/prelude.rs b/src/prelude.rs index 7244b912..22d9ea0e 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -4,7 +4,7 @@ pub use crate::{builder_fn, html, main, test}; -pub use crate::{AutoDefault, StaticResources, Weight}; +pub use crate::{AutoDefault, StaticResources, UniqueId, Weight}; // MACROS. @@ -16,6 +16,8 @@ pub use crate::include_config; pub use crate::include_locales; // crate::service pub use crate::{include_files, include_files_service}; +// crate::core::action +pub use crate::inject_actions; // API. @@ -35,6 +37,7 @@ pub use crate::service; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; +pub use crate::core::action::*; pub use crate::core::extension::*; pub use crate::core::theme::*; From 4f56d4441ff37417b9ba53718aaf0d8ad49ba2a5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 21 Jul 2025 20:52:45 +0200 Subject: [PATCH 689/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20tipos=20para?= =?UTF-8?q?=20renderizar=20atributos=20HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html.rs | 15 +++++ src/html/opt_classes.rs | 130 +++++++++++++++++++++++++++++++++++++ src/html/opt_id.rs | 57 ++++++++++++++++ src/html/opt_name.rs | 57 ++++++++++++++++ src/html/opt_string.rs | 56 ++++++++++++++++ src/html/opt_translated.rs | 65 +++++++++++++++++++ src/locale.rs | 15 ++++- 7 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 src/html/opt_classes.rs create mode 100644 src/html/opt_id.rs create mode 100644 src/html/opt_name.rs create mode 100644 src/html/opt_string.rs create mode 100644 src/html/opt_translated.rs diff --git a/src/html.rs b/src/html.rs index 14a89edd..4fc9b3e5 100644 --- a/src/html.rs +++ b/src/html.rs @@ -12,6 +12,21 @@ pub(crate) use assets::Assets; mod context; pub use context::{Context, ErrorParam}; +mod opt_id; +pub use opt_id::OptionId; + +mod opt_name; +pub use opt_name::OptionName; + +mod opt_string; +pub use opt_string::OptionString; + +mod opt_translated; +pub use opt_translated::OptionTranslated; + +mod opt_classes; +pub use opt_classes::{ClassesOp, OptionClasses}; + use crate::AutoDefault; /// Prepara contenido HTML para su conversión a [`Markup`]. diff --git a/src/html/opt_classes.rs b/src/html/opt_classes.rs new file mode 100644 index 00000000..bcec9372 --- /dev/null +++ b/src/html/opt_classes.rs @@ -0,0 +1,130 @@ +use crate::{builder_fn, AutoDefault}; + +/// Operaciones disponibles sobre la lista de clases en [`OptionClasses`]. +pub enum ClassesOp { + /// Añade al final (si no existe). + Add, + /// Añade al principio. + Prepend, + /// Elimina coincidencias. + Remove, + /// Sustituye una o varias por las nuevas (`Replace("old other")`). + Replace(String), + /// Alterna presencia/ausencia. + Toggle, + /// Sustituye toda la lista. + Set, +} + +/// Cadena de clases CSS normalizadas para el atributo `class` de HTML. +/// +/// Permite construir y modificar dinámicamente con [`ClassesOp`] una lista de clases CSS +/// normalizadas. +/// +/// ### Normalización +/// - El [orden de las clases no es relevante](https://stackoverflow.com/a/1321712) en CSS. +/// - No se permiten clases duplicadas. +/// - Las clases vacías se ignoran. +/// +/// # Ejemplo +/// ```rust +/// use pagetop::prelude::*; +/// +/// let classes = OptionClasses::new("btn btn-primary") +/// .with_value(ClassesOp::Add, "active") +/// .with_value(ClassesOp::Remove, "btn-primary"); +/// +/// assert_eq!(classes.get(), Some(String::from("btn active"))); +/// assert!(classes.contains("active")); +/// ``` +#[derive(AutoDefault, Clone, Debug)] +pub struct OptionClasses(Vec<String>); + +impl OptionClasses { + pub fn new(classes: impl AsRef<str>) -> Self { + OptionClasses::default().with_value(ClassesOp::Prepend, classes) + } + + // OptionClasses BUILDER *********************************************************************** + + #[builder_fn] + pub fn with_value(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + let classes: &str = classes.as_ref(); + let classes: Vec<&str> = classes.split_ascii_whitespace().collect(); + + if classes.is_empty() { + return self; + } + + match op { + ClassesOp::Add => { + self.add(&classes, self.0.len()); + } + ClassesOp::Prepend => { + self.add(&classes, 0); + } + ClassesOp::Remove => { + for class in classes { + self.0.retain(|c| c.ne(&class.to_string())); + } + } + ClassesOp::Replace(classes_to_replace) => { + let mut pos = self.0.len(); + let replace: Vec<&str> = classes_to_replace.split_ascii_whitespace().collect(); + for class in replace { + if let Some(replace_pos) = self.0.iter().position(|c| c.eq(class)) { + self.0.remove(replace_pos); + if pos > replace_pos { + pos = replace_pos; + } + } + } + self.add(&classes, pos); + } + ClassesOp::Toggle => { + for class in classes { + if !class.is_empty() { + if let Some(pos) = self.0.iter().position(|c| c.eq(class)) { + self.0.remove(pos); + } else { + self.0.push(class.to_string()); + } + } + } + } + ClassesOp::Set => { + self.0.clear(); + self.add(&classes, 0); + } + } + + self + } + + #[inline] + fn add(&mut self, classes: &[&str], mut pos: usize) { + for &class in classes { + if !class.is_empty() && !self.0.iter().any(|c| c == class) { + self.0.insert(pos, class.to_string()); + pos += 1; + } + } + } + + // OptionClasses GETTERS *********************************************************************** + + /// Devuele la cadena de clases, si existe. + pub fn get(&self) -> Option<String> { + if self.0.is_empty() { + None + } else { + Some(self.0.join(" ")) + } + } + + /// Devuelve `true` si la clase está presente. + pub fn contains(&self, class: impl AsRef<str>) -> bool { + let class = class.as_ref(); + self.0.iter().any(|c| c == class) + } +} diff --git a/src/html/opt_id.rs b/src/html/opt_id.rs new file mode 100644 index 00000000..6f166b95 --- /dev/null +++ b/src/html/opt_id.rs @@ -0,0 +1,57 @@ +use crate::{builder_fn, AutoDefault}; + +/// Identificador normalizado para el atributo `id` o similar de HTML. +/// +/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. +/// +/// # Normalización +/// - Se eliminan los espacios al principio y al final. +/// - Se sustituyen los espacios intermedios por guiones bajos (`_`). +/// - Si el resultado es una cadena vacía, se guarda `None`. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let id = OptionId::new("main section"); +/// assert_eq!(id.get(), Some(String::from("main_section"))); +/// +/// let empty = OptionId::default(); +/// assert_eq!(empty.get(), None); +/// ``` +#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] +pub struct OptionId(Option<String>); + +impl OptionId { + /// Crea un nuevo [`OptionId`]. + /// + /// El valor se normaliza automáticamente. + pub fn new(value: impl AsRef<str>) -> Self { + OptionId::default().with_value(value) + } + + // OptionId BUILDER **************************************************************************** + + /// Establece un identificador nuevo. + /// + /// El valor se normaliza automáticamente. + #[builder_fn] + pub fn with_value(mut self, value: impl AsRef<str>) -> Self { + let value = value.as_ref().trim().replace(' ', "_"); + self.0 = (!value.is_empty()).then_some(value); + self + } + + // OptionId GETTERS **************************************************************************** + + /// Devuelve el identificador, si existe. + pub fn get(&self) -> Option<String> { + if let Some(value) = &self.0 { + if !value.is_empty() { + return Some(value.to_owned()); + } + } + None + } +} diff --git a/src/html/opt_name.rs b/src/html/opt_name.rs new file mode 100644 index 00000000..c4e2e2e0 --- /dev/null +++ b/src/html/opt_name.rs @@ -0,0 +1,57 @@ +use crate::{builder_fn, AutoDefault}; + +/// Nombre normalizado para el atributo `name` o similar de HTML. +/// +/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. +/// +/// # Normalización +/// - Se eliminan los espacios al principio y al final. +/// - Se sustituyen los espacios intermedios por guiones bajos (`_`). +/// - Si el resultado es una cadena vacía, se guarda `None`. +/// +/// ## Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let name = OptionName::new(" display name "); +/// assert_eq!(name.get(), Some(String::from("display_name"))); +/// +/// let empty = OptionName::default(); +/// assert_eq!(empty.get(), None); +/// ``` +#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] +pub struct OptionName(Option<String>); + +impl OptionName { + /// Crea un nuevo [`OptionName`]. + /// + /// El valor se normaliza automáticamente. + pub fn new(value: impl AsRef<str>) -> Self { + OptionName::default().with_value(value) + } + + // OptionName BUILDER ************************************************************************** + + /// Establece un nombre nuevo. + /// + /// El valor se normaliza automáticamente. + #[builder_fn] + pub fn with_value(mut self, value: impl AsRef<str>) -> Self { + let value = value.as_ref().trim().replace(' ', "_"); + self.0 = (!value.is_empty()).then_some(value); + self + } + + // OptionName GETTERS ************************************************************************** + + /// Devuelve el nombre, si existe. + pub fn get(&self) -> Option<String> { + if let Some(value) = &self.0 { + if !value.is_empty() { + return Some(value.to_owned()); + } + } + None + } +} diff --git a/src/html/opt_string.rs b/src/html/opt_string.rs new file mode 100644 index 00000000..5379597e --- /dev/null +++ b/src/html/opt_string.rs @@ -0,0 +1,56 @@ +use crate::{builder_fn, AutoDefault}; + +/// Cadena normalizada para renderizar en atributos HTML. +/// +/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. +/// +/// # Normalización +/// - Se eliminan los espacios al principio y al final. +/// - Si el resultado es una cadena vacía, se guarda `None`. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let s = OptionString::new(" a new string "); +/// assert_eq!(s.get(), Some(String::from("a new string"))); +/// +/// let empty = OptionString::default(); +/// assert_eq!(empty.get(), None); +/// ``` +#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] +pub struct OptionString(Option<String>); + +impl OptionString { + /// Crea un nuevo [`OptionString`]. + /// + /// El valor se normaliza automáticamente. + pub fn new(value: impl AsRef<str>) -> Self { + OptionString::default().with_value(value) + } + + // OptionString BUILDER ************************************************************************ + + /// Establece una cadena nueva. + /// + /// El valor se normaliza automáticamente. + #[builder_fn] + pub fn with_value(mut self, value: impl AsRef<str>) -> Self { + let value = value.as_ref().trim().to_owned(); + self.0 = (!value.is_empty()).then_some(value); + self + } + + // OptionString GETTERS ************************************************************************ + + /// Devuelve la cadena, si existe. + pub fn get(&self) -> Option<String> { + if let Some(value) = &self.0 { + if !value.is_empty() { + return Some(value.to_owned()); + } + } + None + } +} diff --git a/src/html/opt_translated.rs b/src/html/opt_translated.rs new file mode 100644 index 00000000..ba60a0f8 --- /dev/null +++ b/src/html/opt_translated.rs @@ -0,0 +1,65 @@ +use crate::html::Markup; +use crate::locale::{L10n, LanguageIdentifier}; +use crate::{builder_fn, AutoDefault}; + +/// Cadena para traducir al renderizar ([`locale`](crate::locale)). +/// +/// Encapsula un tipo [`L10n`] para manejar traducciones de forma segura. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// // Traducción por clave en las locales por defecto de PageTop. +/// let hello = OptionTranslated::new(L10n::l("test-hello-world")); +/// +/// // Español disponible. +/// assert_eq!( +/// hello.using(LangMatch::langid_or_default("es-ES")), +/// Some(String::from("¡Hola mundo!")) +/// ); +/// +/// // Japonés no disponible, traduce al idioma de respaldo ("en-US"). +/// assert_eq!( +/// hello.using(LangMatch::langid_or_fallback("ja-JP")), +/// Some(String::from("Hello world!")) +/// ); +/// +/// // Para incrustar en HTML escapado: +/// let markup = hello.escaped(LangMatch::langid_or_default("es-ES")); +/// assert_eq!(markup.into_string(), "¡Hola mundo!"); +/// ``` +#[derive(AutoDefault, Clone, Debug)] +pub struct OptionTranslated(L10n); + +impl OptionTranslated { + /// Crea una nueva instancia [`OptionTranslated`]. + pub fn new(value: L10n) -> Self { + OptionTranslated(value) + } + + // OptionTranslated BUILDER ******************************************************************** + + /// Establece una traducción nueva. + #[builder_fn] + pub fn with_value(mut self, value: L10n) -> Self { + self.0 = value; + self + } + + // OptionTranslated GETTERS ******************************************************************** + + /// Devuelve la traducción para `langid`, si existe. + pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { + self.0.using(langid) + } + + /// Devuelve la traducción *escapada* como [`Markup`] para `langid`, si existe. + /// + /// Útil para incrustar el texto directamente en plantillas HTML sin riesgo de inyección de + /// contenido. + pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { + self.0.escaped(langid) + } +} diff --git a/src/locale.rs b/src/locale.rs index 2dcf27e7..9af83f58 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -284,7 +284,7 @@ include_locales!(LOCALES_PAGETOP); // * `None` - No se aplica ninguna localización. // * `Text` - Con una cadena literal que se devolverá tal cual. // * `Translate` - Con la clave a resolver en el `Locales` indicado. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Debug)] enum L10nOp { #[default] None, @@ -322,7 +322,7 @@ enum L10nOp { /// // Traducción con clave, conjunto de traducciones e identificador de idioma a usar. /// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(LangMatch::langid_or_default("it")); /// ``` -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone)] pub struct L10n { op: L10nOp, #[default(&LOCALES_PAGETOP)] @@ -411,6 +411,17 @@ impl L10n { } } +impl fmt::Debug for L10n { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("L10n") + .field("op", &self.op) + .field("args", &self.args) + // No se puede mostrar `locales`. Se representa con un texto fijo. + .field("locales", &"<StaticLoader>") + .finish() + } +} + impl fmt::Display for L10n { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let content = match &self.op { From 36ddbd7ecf4d8eec677de79da17142272a98aaa9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 21 Jul 2025 21:17:40 +0200 Subject: [PATCH 690/853] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F=20A=C3=B1ade=20el?= =?UTF-8?q?=20tema=20para=20renderizar=20en=20contexto=20HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/context.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/html/context.rs b/src/html/context.rs index 23e2be2b..b3622501 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -1,3 +1,5 @@ +use crate::core::theme::all::{theme_by_short_name, DEFAULT_THEME}; +use crate::core::theme::ThemeRef; use crate::core::TypeInfo; use crate::html::{html, Markup, Render}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; @@ -34,9 +36,9 @@ impl Error for ErrorParam {} /// Representa el contexto asociado a un documento HTML. /// /// Esta estructura se crea internamente para recoger información relativa al documento asociado, -/// como la solicitud HTTP de origen, el idioma y los recursos *favicon* ([`Favicon`]), las hojas de -/// estilo [`StyleSheet`], los *scripts* [`JavaScript`], o parámetros de contexto definidos en -/// tiempo de ejecución. +/// como la solicitud HTTP de origen, el idioma, el tema para renderizar ([`ThemeRef`]), y los +/// recursos *favicon* ([`Favicon`]), las hojas de estilo ([`StyleSheet`]) y los *scripts* +/// ([`JavaScript`]). También admite parámetros de contexto definidos en tiempo de ejecución. /// /// # Ejemplo /// @@ -47,6 +49,9 @@ impl Error for ErrorParam {} /// // Establece el idioma del documento a español. /// ctx.set_langid(LangMatch::langid_or_default("es-ES")); /// +/// // Selecciona un tema (por su nombre corto). +/// ctx.set_theme("aliner"); +/// /// // Asigna un favicon. /// ctx.set_favicon(Some(Favicon::new().with_icon("/icons/favicon.ico"))); /// @@ -63,6 +68,10 @@ impl Error for ErrorParam {} /// let id: i32 = ctx.get_param("usuario_id").unwrap(); /// assert_eq!(id, 42); /// +/// // Recupera el tema seleccionado. +/// let active_theme = ctx.theme(); +/// assert_eq!(active_theme.short_name(), "aliner"); +/// /// // Genera un identificador único para un componente de tipo `Menu`. /// struct Menu; /// let unique_id = ctx.required_id::<Menu>(None); @@ -73,6 +82,7 @@ impl Error for ErrorParam {} pub struct Context { request : HttpRequest, // Solicitud HTTP de origen. langid : &'static LanguageIdentifier, // Identificador del idioma. + theme : ThemeRef, // Referencia al tema para renderizar. favicon : Option<Favicon>, // Favicon, si se ha definido. stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. javascripts: Assets<JavaScript>, // Scripts JavaScript. @@ -89,6 +99,7 @@ impl Context { Context { request, langid : &DEFAULT_LANGID, + theme : *DEFAULT_THEME, favicon : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), @@ -103,6 +114,15 @@ impl Context { self } + /// Establece el tema que se usará para renderizar el documento. + /// + /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica + /// ninguno entonces usará el tema por defecto. + pub fn set_theme(&mut self, short_name: impl AsRef<str>) -> &mut Self { + self.theme = theme_by_short_name(short_name).unwrap_or(*DEFAULT_THEME); + self + } + /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. pub fn set_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { self.favicon = favicon; @@ -160,6 +180,11 @@ impl Context { self.langid } + /// Devuelve el tema que se usará para renderizar el documento. + pub fn theme(&self) -> ThemeRef { + self.theme + } + /// Recupera un parámetro del contexto convertido al tipo especificado. /// /// Devuelve un error si el parámetro no existe ([`ErrorParam::NotFound`]) o la conversión falla From 8e67065aae51343d8d91b9cebba3827688572f54 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 24 Jul 2025 08:38:17 +0200 Subject: [PATCH 691/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20acciones=20bas?= =?UTF-8?q?e=20y=20renderizado=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Añade acciones BeforeRender y AfterRender para ejecutar código personalizado antes y después de renderizar un componente. - Introduce la acción PrepareRender para personalizar totalmente el renderizado de un componente. - Se actualizan las definiciones de acciones para utilizar el nuevo "trait" ActionDispatcher. - Se crea un nuevo trait ComponentTrait para definir componentes renderizables. - Se implementan las estructuras Children y Child para gestionar componentes hijos dentro de un componente padre. - Se añade OptionComponent para encapsular de forma segura componentes opcionales y poder usarlos en otros componentes. --- Cargo.lock | 7 +- Cargo.toml | 5 +- src/base.rs | 4 +- src/base/action.rs | 15 + src/base/action/component.rs | 10 + .../component/after_render_component.rs | 81 +++++ .../component/before_render_component.rs | 81 +++++ src/base/action/component/is_renderable.rs | 96 +++++ src/base/action/theme.rs | 10 + .../action/theme/after_render_component.rs | 50 +++ .../action/theme/before_render_component.rs | 50 +++ src/base/action/theme/prepare_render.rs | 63 ++++ src/core.rs | 5 +- src/core/action.rs | 56 ++- src/core/action/all.rs | 54 +-- src/core/action/definition.rs | 72 ++-- src/core/action/list.rs | 9 +- src/core/component.rs | 9 + src/core/component/children.rs | 327 ++++++++++++++++++ src/core/component/definition.rs | 121 +++++++ src/core/extension/all.rs | 33 +- src/core/extension/definition.rs | 4 +- src/core/theme/all.rs | 6 +- src/core/theme/definition.rs | 2 +- src/html.rs | 3 + src/html/opt_component.rs | 68 ++++ src/lib.rs | 4 +- src/prelude.rs | 4 +- 28 files changed, 1102 insertions(+), 147 deletions(-) create mode 100644 src/base/action.rs create mode 100644 src/base/action/component.rs create mode 100644 src/base/action/component/after_render_component.rs create mode 100644 src/base/action/component/before_render_component.rs create mode 100644 src/base/action/component/is_renderable.rs create mode 100644 src/base/action/theme.rs create mode 100644 src/base/action/theme/after_render_component.rs create mode 100644 src/base/action/theme/before_render_component.rs create mode 100644 src/base/action/theme/prepare_render.rs create mode 100644 src/core/component.rs create mode 100644 src/core/component/children.rs create mode 100644 src/core/component/definition.rs create mode 100644 src/html/opt_component.rs diff --git a/Cargo.lock b/Cargo.lock index ab7b20a5..b03e9808 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1413,7 +1413,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.11" +version = "0.0.12" dependencies = [ "actix-files", "actix-web", @@ -1426,6 +1426,7 @@ dependencies = [ "fluent-templates", "itoa", "pagetop-macros", + "parking_lot", "pastey", "serde", "static-files", @@ -2212,9 +2213,9 @@ dependencies = [ [[package]] name = "tracing-actix-web" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2340b7722695166c7fc9b3e3cd1166e7c74fedb9075b8f0c74d3822d2e41caf5" +checksum = "5360edd490ec8dee9fedfc6a9fd83ac2f01b3e1996e3261b9ad18a61971fe064" dependencies = [ "actix-web", "mutually_exclusive_features", diff --git a/Cargo.toml b/Cargo.toml index b6f844f1..049c258c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.11" +version = "0.0.12" edition = "2021" description = """\ @@ -21,6 +21,7 @@ concat-string = "1.0.1" config = { version = "0.15.13", default-features = false, features = ["toml"] } figlet-rs = "0.1.5" itoa = "1.0.15" +parking_lot = "0.12.4" paste = { package = "pastey", version = "0.1.0" } substring = "1.4.5" terminal_size = "0.4.2" @@ -28,7 +29,7 @@ terminal_size = "0.4.2" tracing = "0.1.41" tracing-appender = "0.2.3" tracing-subscriber = { version = "0.3.19", features = ["json", "env-filter"] } -tracing-actix-web = "0.7.18" +tracing-actix-web = "0.7.19" fluent-templates = "0.13.0" unic-langid = { version = "0.9.6", features = ["macros"] } diff --git a/src/base.rs b/src/base.rs index c50cc9e4..491223e6 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1,3 +1,5 @@ -//! Reúne temas listos para usar. +//! Reúne acciones y temas listos para usar. + +pub mod action; pub mod theme; diff --git a/src/base/action.rs b/src/base/action.rs new file mode 100644 index 00000000..119a7eaa --- /dev/null +++ b/src/base/action.rs @@ -0,0 +1,15 @@ +//! Acciones predefinidas para alterar el funcionamiento interno de `PageTop`. + +use crate::prelude::*; + +/// Tipo de función para manipular componentes y su contexto de renderizado. +/// +/// Se usa en acciones definidas en [`component`] y [`theme`] para alterar el comportamiento de los +/// componentes. +/// +/// Recibe referencias mutables (`&mut`) del componente `component` y del contexto `cx`. +pub type FnActionWithComponent<C> = fn(component: &mut C, cx: &mut Context); + +pub mod component; + +pub mod theme; diff --git a/src/base/action/component.rs b/src/base/action/component.rs new file mode 100644 index 00000000..aaef1ce9 --- /dev/null +++ b/src/base/action/component.rs @@ -0,0 +1,10 @@ +//! Acciones que operan sobre componentes. + +mod is_renderable; +pub use is_renderable::*; + +mod before_render_component; +pub use before_render_component::*; + +mod after_render_component; +pub use after_render_component::*; diff --git a/src/base/action/component/after_render_component.rs b/src/base/action/component/after_render_component.rs new file mode 100644 index 00000000..3c8ead9a --- /dev/null +++ b/src/base/action/component/after_render_component.rs @@ -0,0 +1,81 @@ +use crate::prelude::*; + +use crate::base::action::FnActionWithComponent; + +/// Ejecuta [`FnActionWithComponent`] después de renderizar un componente. +pub struct AfterRender<C: ComponentTrait> { + f: FnActionWithComponent<C>, + referer_type_id: Option<UniqueId>, + referer_id: OptionId, + weight: Weight, +} + +/// Filtro para despachar [`FnActionWithComponent`] después de renderizar un componente `C`. +impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> { + /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. + fn referer_type_id(&self) -> Option<UniqueId> { + self.referer_type_id + } + + /// Devuelve el identificador del componente. + fn referer_id(&self) -> Option<String> { + self.referer_id.get() + } + + /// Devuelve el peso para definir el orden de aplicación. + fn weight(&self) -> Weight { + self.weight + } +} + +impl<C: ComponentTrait> AfterRender<C> { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`]. + pub fn new(f: FnActionWithComponent<C>) -> Self { + AfterRender { + f, + referer_type_id: Some(UniqueId::of::<C>()), + referer_id: OptionId::default(), + weight: 0, + } + } + + /// Afina el registro para ejecutar la acción [`FnActionWithComponent`] sólo para el componente + /// `C` con identificador `id`. + pub fn filter_by_referer_id(mut self, id: impl AsRef<str>) -> Self { + self.referer_id.alter_value(id); + self + } + + /// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos. + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + // Despacha las acciones. + #[inline] + pub(crate) fn dispatch(component: &mut C, cx: &mut Context) { + // Primero despacha las acciones para el tipo de componente. + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + None, + Some(UniqueId::of::<C>()), + None, + ), + |action: &Self| (action.f)(component, cx), + ); + // Y luego despacha las acciones para el tipo de componente con un identificador dado. + if let Some(id) = component.id() { + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + None, + Some(UniqueId::of::<C>()), + Some(id), + ), + |action: &Self| (action.f)(component, cx), + ); + } + } +} diff --git a/src/base/action/component/before_render_component.rs b/src/base/action/component/before_render_component.rs new file mode 100644 index 00000000..0ebe4092 --- /dev/null +++ b/src/base/action/component/before_render_component.rs @@ -0,0 +1,81 @@ +use crate::prelude::*; + +use crate::base::action::FnActionWithComponent; + +/// Ejecuta [`FnActionWithComponent`] antes de renderizar el componente. +pub struct BeforeRender<C: ComponentTrait> { + f: FnActionWithComponent<C>, + referer_type_id: Option<UniqueId>, + referer_id: OptionId, + weight: Weight, +} + +/// Filtro para despachar [`FnActionWithComponent`] antes de renderizar un componente `C`. +impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> { + /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. + fn referer_type_id(&self) -> Option<UniqueId> { + self.referer_type_id + } + + /// Devuelve el identificador del componente. + fn referer_id(&self) -> Option<String> { + self.referer_id.get() + } + + /// Devuelve el peso para definir el orden de aplicación. + fn weight(&self) -> Weight { + self.weight + } +} + +impl<C: ComponentTrait> BeforeRender<C> { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`]. + pub fn new(f: FnActionWithComponent<C>) -> Self { + BeforeRender { + f, + referer_type_id: Some(UniqueId::of::<C>()), + referer_id: OptionId::default(), + weight: 0, + } + } + + /// Afina el registro para ejecutar la acción [`FnActionWithComponent`] sólo para el componente + /// `C` con identificador `id`. + pub fn filter_by_referer_id(mut self, id: impl AsRef<str>) -> Self { + self.referer_id.alter_value(id); + self + } + + /// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos. + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + // Despacha las acciones. + #[inline] + pub(crate) fn dispatch(component: &mut C, cx: &mut Context) { + // Primero despacha las acciones para el tipo de componente. + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + None, + Some(UniqueId::of::<C>()), + None, + ), + |action: &Self| (action.f)(component, cx), + ); + // Y luego despacha las aciones para el tipo de componente con un identificador dado. + if let Some(id) = component.id() { + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + None, + Some(UniqueId::of::<C>()), + Some(id), + ), + |action: &Self| (action.f)(component, cx), + ); + } + } +} diff --git a/src/base/action/component/is_renderable.rs b/src/base/action/component/is_renderable.rs new file mode 100644 index 00000000..7ba7d53c --- /dev/null +++ b/src/base/action/component/is_renderable.rs @@ -0,0 +1,96 @@ +use crate::prelude::*; + +/// Tipo de función para determinar si un componente se renderiza o no. +/// +/// Se usa en la acción [`IsRenderable`] para controlar dinámicamente la visibilidad del componente +/// `component` según el contexto `cx`. El componente **no se renderiza** en cuanto una de las +/// funciones devuelva `false`. +pub type FnIsRenderable<C> = fn(component: &C, cx: &Context) -> bool; + +/// Con la función [`FnIsRenderable`] se puede decidir si se renderiza o no un componente. +pub struct IsRenderable<C: ComponentTrait> { + f: FnIsRenderable<C>, + referer_type_id: Option<UniqueId>, + referer_id: OptionId, + weight: Weight, +} + +/// Filtro para despachar [`FnIsRenderable`] para decidir si se renderiza o no un componente `C`. +impl<C: ComponentTrait> ActionDispatcher for IsRenderable<C> { + /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. + fn referer_type_id(&self) -> Option<UniqueId> { + self.referer_type_id + } + + /// Devuelve el identificador del componente. + fn referer_id(&self) -> Option<String> { + self.referer_id.get() + } + + /// Devuelve el peso para definir el orden de aplicación. + fn weight(&self) -> Weight { + self.weight + } +} + +impl<C: ComponentTrait> IsRenderable<C> { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnIsRenderable`]. + pub fn new(f: FnIsRenderable<C>) -> Self { + IsRenderable { + f, + referer_type_id: Some(UniqueId::of::<C>()), + referer_id: OptionId::default(), + weight: 0, + } + } + + /// Afina el registro para ejecutar la acción [`FnIsRenderable`] sólo para el componente `C` + /// con identificador `id`. + pub fn filter_by_referer_id(mut self, id: impl AsRef<str>) -> Self { + self.referer_id.alter_value(id); + self + } + + /// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos. + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + // Despacha las acciones. Se detiene en cuanto una [`FnIsRenderable`] devuelve `false`. + #[inline] + pub(crate) fn dispatch(component: &C, cx: &mut Context) -> bool { + let mut renderable = true; + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + None, + Some(UniqueId::of::<C>()), + None, + ), + |action: &Self| { + if renderable && !(action.f)(component, cx) { + renderable = false; + } + }, + ); + if renderable { + if let Some(id) = component.id() { + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + None, + Some(UniqueId::of::<C>()), + Some(id), + ), + |action: &Self| { + if renderable && !(action.f)(component, cx) { + renderable = false; + } + }, + ); + } + } + renderable + } +} diff --git a/src/base/action/theme.rs b/src/base/action/theme.rs new file mode 100644 index 00000000..40988574 --- /dev/null +++ b/src/base/action/theme.rs @@ -0,0 +1,10 @@ +//! Acciones lanzadas desde los temas. + +mod before_render_component; +pub use before_render_component::*; + +mod after_render_component; +pub use after_render_component::*; + +mod prepare_render; +pub use prepare_render::*; diff --git a/src/base/action/theme/after_render_component.rs b/src/base/action/theme/after_render_component.rs new file mode 100644 index 00000000..d33e0d2d --- /dev/null +++ b/src/base/action/theme/after_render_component.rs @@ -0,0 +1,50 @@ +use crate::prelude::*; + +use crate::base::action::FnActionWithComponent; + +/// Ejecuta [`FnActionWithComponent`] después de que un tema renderice el componente. +pub struct AfterRender<C: ComponentTrait> { + f: FnActionWithComponent<C>, + theme_type_id: Option<UniqueId>, + referer_type_id: Option<UniqueId>, +} + +/// Filtro para despachar [`FnActionWithComponent`] después de que un tema renderice el componente +/// `C`. +impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> { + /// Devuelve el identificador de tipo ([`UniqueId`]) del tema. + fn theme_type_id(&self) -> Option<UniqueId> { + self.theme_type_id + } + + /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. + fn referer_type_id(&self) -> Option<UniqueId> { + self.referer_type_id + } +} + +impl<C: ComponentTrait> AfterRender<C> { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`] para + /// un tema dado. + pub fn new(theme: ThemeRef, f: FnActionWithComponent<C>) -> Self { + AfterRender { + f, + theme_type_id: Some(theme.type_id()), + referer_type_id: Some(UniqueId::of::<C>()), + } + } + + // Despacha las acciones. + #[inline] + pub(crate) fn dispatch(component: &mut C, cx: &mut Context) { + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + Some(cx.theme().type_id()), + Some(UniqueId::of::<C>()), + None, + ), + |action: &Self| (action.f)(component, cx), + ); + } +} diff --git a/src/base/action/theme/before_render_component.rs b/src/base/action/theme/before_render_component.rs new file mode 100644 index 00000000..76f6cd22 --- /dev/null +++ b/src/base/action/theme/before_render_component.rs @@ -0,0 +1,50 @@ +use crate::prelude::*; + +use crate::base::action::FnActionWithComponent; + +/// Ejecuta [`FnActionWithComponent`] antes de que un tema renderice el componente. +pub struct BeforeRender<C: ComponentTrait> { + f: FnActionWithComponent<C>, + theme_type_id: Option<UniqueId>, + referer_type_id: Option<UniqueId>, +} + +/// Filtro para despachar [`FnActionWithComponent`] antes de que un tema renderice el componente +/// `C`. +impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> { + /// Devuelve el identificador de tipo ([`UniqueId`]) del tema. + fn theme_type_id(&self) -> Option<UniqueId> { + self.theme_type_id + } + + /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. + fn referer_type_id(&self) -> Option<UniqueId> { + self.referer_type_id + } +} + +impl<C: ComponentTrait> BeforeRender<C> { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`] para + /// un tema dado. + pub fn new(theme: ThemeRef, f: FnActionWithComponent<C>) -> Self { + BeforeRender { + f, + theme_type_id: Some(theme.type_id()), + referer_type_id: Some(UniqueId::of::<C>()), + } + } + + // Despacha las acciones. + #[inline] + pub(crate) fn dispatch(component: &mut C, cx: &mut Context) { + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + Some(cx.theme().type_id()), + Some(UniqueId::of::<C>()), + None, + ), + |action: &Self| (action.f)(component, cx), + ); + } +} diff --git a/src/base/action/theme/prepare_render.rs b/src/base/action/theme/prepare_render.rs new file mode 100644 index 00000000..9d3e2612 --- /dev/null +++ b/src/base/action/theme/prepare_render.rs @@ -0,0 +1,63 @@ +use crate::prelude::*; + +/// Tipo de función para alterar el renderizado de un componente. +/// +/// Permite a un [tema](crate::base::action::theme) sobreescribir el renderizado predeterminado de +/// los componentes. +/// +/// Recibe una referencia al componente `component` y una referencia mutable al contexto `cx`. +pub type FnPrepareRender<C> = fn(component: &C, cx: &mut Context) -> PrepareMarkup; + +/// Ejecuta [`FnPrepareRender`] para preparar el renderizado de un componente. +/// +/// Permite a un tema hacer una implementación nueva del renderizado de un componente. +pub struct PrepareRender<C: ComponentTrait> { + f: FnPrepareRender<C>, + theme_type_id: Option<UniqueId>, + referer_type_id: Option<UniqueId>, +} + +/// Filtro para despachar [`FnPrepareRender`] que modifica el renderizado de un componente `C`. +impl<C: ComponentTrait> ActionDispatcher for PrepareRender<C> { + /// Devuelve el identificador de tipo ([`UniqueId`]) del tema. + fn theme_type_id(&self) -> Option<UniqueId> { + self.theme_type_id + } + + /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. + fn referer_type_id(&self) -> Option<UniqueId> { + self.referer_type_id + } +} + +impl<C: ComponentTrait> PrepareRender<C> { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnPrepareRender`] para un + /// tema dado. + pub fn new(theme: ThemeRef, f: FnPrepareRender<C>) -> Self { + PrepareRender { + f, + theme_type_id: Some(theme.type_id()), + referer_type_id: Some(UniqueId::of::<C>()), + } + } + + // Despacha las acciones. Se detiene en cuanto una renderiza. + #[inline] + pub(crate) fn dispatch(component: &C, cx: &mut Context) -> PrepareMarkup { + let mut render_component = PrepareMarkup::None; + dispatch_actions( + &ActionKey::new( + UniqueId::of::<Self>(), + Some(cx.theme().type_id()), + Some(UniqueId::of::<C>()), + None, + ), + |action: &Self| { + if render_component.is_empty() { + render_component = (action.f)(component, cx); + } + }, + ); + render_component + } +} diff --git a/src/core.rs b/src/core.rs index 4b857fc4..2168c932 100644 --- a/src/core.rs +++ b/src/core.rs @@ -1,4 +1,4 @@ -//! Tipos y funciones esenciales para crear acciones, extensiones y temas. +//! Tipos y funciones esenciales para crear acciones, componentes, extensiones y temas. use std::any::Any; @@ -204,6 +204,9 @@ impl<T: ?Sized + AnyInfo> AnyCast for T {} // API para definir acciones que alteran el comportamiento predeterminado del código. pub mod action; +// API para construir nuevos componentes. +pub mod component; + // API para añadir nuevas funcionalidades usando extensiones. pub mod extension; diff --git a/src/core/action.rs b/src/core/action.rs index 8503ae90..f5dc11c5 100644 --- a/src/core/action.rs +++ b/src/core/action.rs @@ -1,11 +1,11 @@ //! API para definir acciones que inyectan código en el flujo de la aplicación. //! -//! Permite crear acciones en las librerías para que otros *crates* puedan inyectar código usando -//! funciones *ad hoc* que modifican el comportamiento predefinido en puntos concretos del flujo de -//! ejecución de la aplicación. +//! Permite crear acciones para que otros *crates* puedan inyectar código usando funciones *ad hoc* +//! que modifican el comportamiento predefinido en puntos concretos del flujo de ejecución de la +//! aplicación. mod definition; -pub use definition::{ActionBase, ActionBox, ActionKey, ActionTrait}; +pub use definition::{ActionBox, ActionDispatcher, ActionKey}; mod list; use list::ActionsList; @@ -14,49 +14,33 @@ mod all; pub(crate) use all::add_action; pub use all::dispatch_actions; -/// Crea una lista de acciones para facilitar la implementación del método -/// [`actions`](crate::core::extension::ExtensionTrait#method.actions). +/// Facilita la implementación del método +/// [`actions()`](crate::core::extension::ExtensionTrait::actions). /// -/// Esta macro crea vectores de [`ActionBox`], el tipo dinámico que encapsula cualquier acción que -/// implemente [`ActionTrait`]. Evita escribir repetidamente `Box::new(...)` para cada acción -/// inyectada, manteniendo el código más limpio. +/// Evita escribir repetidamente `Box::new(...)` para cada acción de la lista, manteniendo el código +/// más limpio. /// -/// # Ejemplos -/// -/// Puede llamarse sin argumentos para crear un vector vacío: +/// # Ejemplo /// /// ```rust,ignore -/// let my_actions = inject_actions![]; -/// ``` +/// use pagetop::prelude::*; /// -/// O con una lista de acciones concretas: -/// -/// ```rust,ignore -/// let my_actions = inject_actions![ -/// MyFirstAction::new(), -/// MySecondAction::new().with_weight(10), -/// ]; -/// ``` -/// -/// Internamente, expande a un `vec![Box::new(...), ...]`. -/// -/// # Ejemplo típico en una extensión -/// -/// ```rust,ignore -/// impl ExtensionTrait for MyExtension { +/// impl ExtensionTrait for MyTheme { /// fn actions(&self) -> Vec<ActionBox> { -/// inject_actions![ -/// CustomizeLoginAction::new(), -/// ModifyHeaderAction::new().with_weight(-5), +/// actions_boxed![ +/// action::theme::BeforeRender::<Button>::new(&Self, before_render_button), +/// action::theme::PrepareRender::<Error404>::new(&Self, render_error404), /// ] /// } /// } -/// ``` /// -/// Así, `PageTop` podrá registrar todas estas acciones durante la inicialización de la extensión y -/// posteriormente despacharlas según corresponda. +/// impl ThemeTrait for MyTheme {} +/// +/// fn before_render_button(c: &mut Button, cx: &mut Context) { todo!() } +/// fn render_error404(c: &Error404, cx: &mut Context) -> PrepareMarkup { todo!() } +/// ``` #[macro_export] -macro_rules! inject_actions { +macro_rules! actions_boxed { () => { Vec::<ActionBox>::new() }; diff --git a/src/core/action/all.rs b/src/core/action/all.rs index 4dcb68df..ffee9f56 100644 --- a/src/core/action/all.rs +++ b/src/core/action/all.rs @@ -1,7 +1,9 @@ -use crate::core::action::{ActionBox, ActionKey, ActionTrait, ActionsList}; +use crate::core::action::{ActionBox, ActionDispatcher, ActionKey, ActionsList}; + +use parking_lot::RwLock; use std::collections::HashMap; -use std::sync::{LazyLock, RwLock}; +use std::sync::LazyLock; // ACCIONES **************************************************************************************** @@ -12,20 +14,19 @@ static ACTIONS: LazyLock<RwLock<HashMap<ActionKey, ActionsList>>> = // Registra una nueva acción en el sistema. // -// Si ya existen acciones con la misma `ActionKey`, la acción se añade a la lista existente. Si no, -// se crea una nueva lista. -// -// # Uso típico +// Si ya existen acciones con la misma `ActionKey`, la acción se añade a la misma lista. Si no, se +// crea una nueva lista. // // Las extensiones llamarán a esta función durante su inicialización para instalar acciones -// personalizadas que modifiquen el comportamiento del núcleo o de otros componentes. -// -// ```rust,ignore -// add_action(Box::new(MyCustomAction::new())); -// ``` +// personalizadas que modifiquen el comportamiento del *core* o de otros componentes. pub fn add_action(action: ActionBox) { - let key = action.key(); - let mut actions = ACTIONS.write().unwrap(); + let key = ActionKey::new( + action.type_id(), + action.theme_type_id(), + action.referer_type_id(), + action.referer_id(), + ); + let mut actions = ACTIONS.write(); if let Some(list) = actions.get_mut(&key) { list.add(action); } else { @@ -37,30 +38,35 @@ pub fn add_action(action: ActionBox) { // DESPLEGAR ACCIONES ****************************************************************************** -/// Despacha las funciones asociadas a un [`ActionKey`] y las ejecuta. +/// Despacha y ejecuta las funciones asociadas a una [`ActionKey`]. /// /// Permite recorrer de forma segura y ordenada (por peso) la lista de funciones asociadas a una /// acción específica. /// /// # Parámetros genéricos -/// - `A`: Tipo de acción que esperamos procesar. Debe implementar [`ActionTrait`]. -/// - `F`: Función o cierre que recibe cada acción y devuelve un valor de tipo `B`. +/// - `A`: Tipo de acción que esperamos procesar. Debe implementar [`ActionDispatcher`]. +/// - `F`: Función asociada a cada acción, devuelve un valor de tipo `B`. /// /// # Ejemplo de uso /// ```rust,ignore -/// dispatch_actions::<MyCustomAction, _>(&some_key, |action| { -/// action.do_something(); -/// }); +/// pub(crate) fn dispatch(component: &mut C, cx: &mut Context) { +/// dispatch_actions( +/// &ActionKey::new( +/// UniqueId::of::<Self>(), +/// Some(cx.theme().type_id()), +/// Some(UniqueId::of::<C>()), +/// None, +/// ), +/// |action: &Self| (action.f)(component, cx), +/// ); +/// } /// ``` -/// -/// Esto permite a PageTop o a otros módulos aplicar lógica específica a las acciones de un contexto -/// determinado, manteniendo la flexibilidad del sistema. pub fn dispatch_actions<A, B, F>(key: &ActionKey, f: F) where - A: ActionTrait, + A: ActionDispatcher, F: FnMut(&A) -> B, { - if let Some(list) = ACTIONS.read().unwrap().get(key) { + if let Some(list) = ACTIONS.read().get(key) { list.iter_map(f); } } diff --git a/src/core/action/definition.rs b/src/core/action/definition.rs index d662b2b6..9ec9af1f 100644 --- a/src/core/action/definition.rs +++ b/src/core/action/definition.rs @@ -1,23 +1,13 @@ use crate::core::AnyInfo; use crate::{UniqueId, Weight}; -/// Tipo dinámico para encapsular cualquier acción que implementa [`ActionTrait`]. -pub type ActionBox = Box<dyn ActionTrait>; +/// Tipo dinámico para encapsular cualquier acción que implementa [`ActionDispatcher`]. +pub type ActionBox = Box<dyn ActionDispatcher>; -/// Identifica una acción con una clave que define las condiciones de selección de las funciones -/// asociadas a esa acción. +/// Clave para registrar las acciones y seleccionar las funciones asociadas. /// /// Las funciones seleccionadas se van a [despachar](crate::core::action::dispatch_actions) y /// ejecutar en un punto concreto del flujo de ejecución. -/// -/// # Campos -/// -/// - `action_type_id`: Tipo de la acción. -/// - `theme_type_id`: Opcional, filtra las funciones para un tema dado. -/// - `referer_type_id`: Opcional, filtra las funciones para un tipo dado (p.ej. para un tipo de -/// componente). -/// - `referer_id`: Opcional, filtra las funciones por el identificador de una instancia (p.ej. para -/// un formulario concreto). #[derive(Eq, PartialEq, Hash)] pub struct ActionKey { action_type_id: UniqueId, @@ -29,8 +19,15 @@ pub struct ActionKey { impl ActionKey { /// Crea una nueva clave para un tipo de acción. /// - /// Esta clave permite seleccionar las funciones a ejecutar para ese tipo de acción con filtros - /// opcionales por tema, un tipo de referencia, o una instancia concreta según su identificador. + /// Se crea con los siguientes campos: + /// + /// - `action_type_id`: Tipo de la acción. + /// - `theme_type_id`: Opcional, identificador de tipo ([`UniqueId`]) del tema asociado. + /// - `referer_type_id`: Opcional, identificador de tipo ([`UniqueId`]) del componente referido. + /// - `referer_id`: Opcional, identificador de la instancia (p.ej. para un formulario concreto). + /// + /// Esta clave permitirá seleccionar las funciones a ejecutar para ese tipo de acción, con + /// filtros opcionales por tema, componente, o una instancia concreta según su identificador. pub fn new( action_type_id: UniqueId, theme_type_id: Option<UniqueId>, @@ -46,57 +43,28 @@ impl ActionKey { } } -/// Trait base que permite obtener la clave ([`ActionKey`]) asociada a una acción. +/// Implementa el filtro predeterminado para despachar las funciones de una acción dada. /// -/// Implementado automáticamente para cualquier tipo que cumpla [`ActionTrait`]. -pub trait ActionBase { - fn key(&self) -> ActionKey; -} - -/// Interfaz común que deben implementar las acciones del código que pueden ser modificadas. -/// -/// Este trait combina: -/// - [`AnyInfo`] para identificación única del tipo en tiempo de ejecución. -/// - `Send + Sync` para permitir uso concurrente seguro. -/// -/// # Métodos personalizables -/// - `theme_type_id()`: Asocia la acción a un tipo concreto de tema (si aplica). -/// - `referer_type_id()`: Asocia la acción a un tipo de objeto referente (si aplica). -/// - `referer_id()`: Asocia la acción a un identificador concreto. -/// - `weight()`: Controla el orden de aplicación de acciones; valores más bajos se ejecutan antes. -pub trait ActionTrait: ActionBase + AnyInfo + Send + Sync { - /// Especifica el tipo de tema asociado. Por defecto `None`. +/// Las acciones tienen que sobrescribir los métodos para el filtro que apliquen. Por defecto +/// implementa un filtro nulo. +pub trait ActionDispatcher: AnyInfo + Send + Sync { + /// Identificador de tipo ([`UniqueId`]) del tema asociado. En este caso devuelve `None`. fn theme_type_id(&self) -> Option<UniqueId> { None } - /// Especifica el tipo del objeto referente. Por defecto `None`. + /// Identificador de tipo ([`UniqueId`]) del objeto referido. En este caso devuelve `None`. fn referer_type_id(&self) -> Option<UniqueId> { None } - /// Especifica un identificador único del objeto referente. Por defecto `None`. + /// Identificador del objeto referido. En este caso devuelve `None`. fn referer_id(&self) -> Option<String> { None } - /// Define el peso lógico de la acción para determinar el orden de aplicación. - /// - /// Acciones con pesos más bajos se aplicarán antes. Se pueden usar valores negativos. Por - /// defecto es `0`. + /// Funciones con pesos más bajos se aplican antes. En este caso siempre devuelve `0`. fn weight(&self) -> Weight { 0 } } - -// Implementación automática que construye la clave `ActionKey` a partir de los métodos definidos. -impl<A: ActionTrait> ActionBase for A { - fn key(&self) -> ActionKey { - ActionKey { - action_type_id: self.type_id(), - theme_type_id: self.theme_type_id(), - referer_type_id: self.referer_type_id(), - referer_id: self.referer_id(), - } - } -} diff --git a/src/core/action/list.rs b/src/core/action/list.rs index ec8149be..57c89fe6 100644 --- a/src/core/action/list.rs +++ b/src/core/action/list.rs @@ -1,9 +1,9 @@ -use crate::core::action::{ActionBox, ActionTrait}; +use crate::core::action::{ActionBox, ActionDispatcher}; use crate::core::AnyCast; use crate::trace; use crate::AutoDefault; -use std::sync::RwLock; +use parking_lot::RwLock; #[derive(AutoDefault)] pub struct ActionsList(RwLock<Vec<ActionBox>>); @@ -14,7 +14,7 @@ impl ActionsList { } pub fn add(&mut self, action: ActionBox) { - let mut list = self.0.write().unwrap(); + let mut list = self.0.write(); list.push(action); list.sort_by_key(|a| a.weight()); } @@ -22,13 +22,12 @@ impl ActionsList { pub fn iter_map<A, B, F>(&self, mut f: F) where Self: Sized, - A: ActionTrait, + A: ActionDispatcher, F: FnMut(&A) -> B, { let _: Vec<_> = self .0 .read() - .unwrap() .iter() .rev() .map(|a| { diff --git a/src/core/component.rs b/src/core/component.rs new file mode 100644 index 00000000..36c789a8 --- /dev/null +++ b/src/core/component.rs @@ -0,0 +1,9 @@ +//! API para construir nuevos componentes. + +mod definition; +pub use definition::{ComponentRender, ComponentTrait}; + +mod children; +pub use children::Children; +pub use children::{Child, ChildOp}; +pub use children::{Typed, TypedOp}; diff --git a/src/core/component/children.rs b/src/core/component/children.rs new file mode 100644 index 00000000..38a626b2 --- /dev/null +++ b/src/core/component/children.rs @@ -0,0 +1,327 @@ +use crate::core::component::ComponentTrait; +use crate::html::{html, Context, Markup}; +use crate::{builder_fn, UniqueId}; + +use parking_lot::RwLock; + +use std::sync::Arc; +use std::vec::IntoIter; + +/// Representa un componente encapsulado de forma segura y compartida. +/// +/// Esta estructura permite manipular y renderizar cualquier tipo que implemente [`ComponentTrait`], +/// garantizando acceso concurrente a través de [`Arc<RwLock<_>>`]. +#[derive(Clone)] +pub struct Child(Arc<RwLock<dyn ComponentTrait>>); + +impl Child { + /// Crea un nuevo [`Child`] a partir de un componente. + pub fn with(component: impl ComponentTrait) -> Self { + Child(Arc::new(RwLock::new(component))) + } + + // Child GETTERS ******************************************************************************* + + /// Devuelve el identificador del componente, si está definido. + pub fn id(&self) -> Option<String> { + self.0.read().id() + } + + // Child RENDER ******************************************************************************** + + /// Renderiza el componente con el contexto proporcionado. + pub fn render(&self, cx: &mut Context) -> Markup { + self.0.write().render(cx) + } + + // Child HELPERS ******************************************************************************* + + // Devuelve el [`UniqueId`] del tipo del componente. + fn type_id(&self) -> UniqueId { + self.0.read().type_id() + } +} + +// ************************************************************************************************* + +/// Variante tipada de [`Child`] para evitar conversiones durante el uso. +/// +/// Facilita el acceso a componentes del mismo tipo sin necesidad de hacer `downcast`. +pub struct Typed<C: ComponentTrait>(Arc<RwLock<C>>); + +impl<C: ComponentTrait> Clone for Typed<C> { + fn clone(&self) -> Self { + Self(self.0.clone()) + } +} + +impl<C: ComponentTrait> Typed<C> { + /// Crea un nuevo [`Typed`] a partir de un componente. + pub fn with(component: C) -> Self { + Typed(Arc::new(RwLock::new(component))) + } + + // Typed GETTERS ******************************************************************************* + + /// Devuelve el identificador del componente, si está definido. + pub fn id(&self) -> Option<String> { + self.0.read().id() + } + + // Typed RENDER ******************************************************************************** + + /// Renderiza el componente con el contexto proporcionado. + pub fn render(&self, cx: &mut Context) -> Markup { + self.0.write().render(cx) + } + + // Typed HELPERS ******************************************************************************* + + /// Convierte el componente tipado en un [`Child`]. + fn to_child(&self) -> Child { + Child(self.0.clone()) + } +} + +// ************************************************************************************************* + +/// Operaciones con un componente [`Child`] en una lista [`Children`]. +pub enum ChildOp { + Add(Child), + InsertAfterId(&'static str, Child), + InsertBeforeId(&'static str, Child), + Prepend(Child), + RemoveById(&'static str), + ReplaceById(&'static str, Child), + Reset, +} + +/// Operaciones con un componente tipado [`Typed<C>`] en una lista [`Children`]. +pub enum TypedOp<C: ComponentTrait> { + Add(Typed<C>), + InsertAfterId(&'static str, Typed<C>), + InsertBeforeId(&'static str, Typed<C>), + Prepend(Typed<C>), + RemoveById(&'static str), + ReplaceById(&'static str, Typed<C>), + Reset, +} + +/// Lista ordenada de los componentes hijo ([`Child`]) asociados a un componente padre. +/// +/// Esta colección permite añadir, modificar, renderizar y consultar componentes hijos en orden de +/// inserción, soportando operaciones avanzadas como inserción relativa o reemplazo por +/// identificador. +#[derive(Clone, Default)] +pub struct Children(Vec<Child>); + +impl Children { + /// Crea una lista vacía. + pub fn new() -> Self { + Children::default() + } + + /// Crea una lista con un único hijo inicial. + pub fn with(child: Child) -> Self { + Children::default().with_child(ChildOp::Add(child)) + } + + // Fusiona varias listas de `Children` en una sola. + pub(crate) fn merge(mixes: &[Option<&Children>]) -> Self { + let mut opt = Children::default(); + for m in mixes.iter().flatten() { + opt.0.extend(m.0.iter().cloned()); + } + opt + } + + // Children BUILDER **************************************************************************** + + /// Ejecuta una operación con [`ChildOp`] en la lista. + #[builder_fn] + pub fn with_child(mut self, op: ChildOp) -> Self { + match op { + ChildOp::Add(any) => self.add(any), + ChildOp::InsertAfterId(id, any) => self.insert_after_id(id, any), + ChildOp::InsertBeforeId(id, any) => self.insert_before_id(id, any), + ChildOp::Prepend(any) => self.prepend(any), + ChildOp::RemoveById(id) => self.remove_by_id(id), + ChildOp::ReplaceById(id, any) => self.replace_by_id(id, any), + ChildOp::Reset => self.reset(), + } + } + + /// Ejecuta una operación con [`TypedOp`] en la lista. + #[builder_fn] + pub fn with_typed<C: ComponentTrait + Default>(mut self, op: TypedOp<C>) -> Self { + match op { + TypedOp::Add(typed) => self.add(typed.to_child()), + TypedOp::InsertAfterId(id, typed) => self.insert_after_id(id, typed.to_child()), + TypedOp::InsertBeforeId(id, typed) => self.insert_before_id(id, typed.to_child()), + TypedOp::Prepend(typed) => self.prepend(typed.to_child()), + TypedOp::RemoveById(id) => self.remove_by_id(id), + TypedOp::ReplaceById(id, typed) => self.replace_by_id(id, typed.to_child()), + TypedOp::Reset => self.reset(), + } + } + + /// Añade un hijo al final de la lista. + #[inline] + pub fn add(&mut self, child: Child) -> &mut Self { + self.0.push(child); + self + } + + // Inserta un hijo después del componente con el `id` dado, o al final si no se encuentra. + #[inline] + fn insert_after_id(&mut self, id: impl AsRef<str>, child: Child) -> &mut Self { + let id = Some(id.as_ref()); + match self.0.iter().position(|c| c.id().as_deref() == id) { + Some(index) => self.0.insert(index + 1, child), + _ => self.0.push(child), + }; + self + } + + // Inserta un hijo antes del componente con el `id` dado, o al principio si no se encuentra. + #[inline] + fn insert_before_id(&mut self, id: impl AsRef<str>, child: Child) -> &mut Self { + let id = Some(id.as_ref()); + match self.0.iter().position(|c| c.id().as_deref() == id) { + Some(index) => self.0.insert(index, child), + _ => self.0.insert(0, child), + }; + self + } + + // Inserta un hijo al principio de la colección. + #[inline] + fn prepend(&mut self, child: Child) -> &mut Self { + self.0.insert(0, child); + self + } + + // Elimina el primer hijo con el `id` dado. + #[inline] + fn remove_by_id(&mut self, id: impl AsRef<str>) -> &mut Self { + let id = Some(id.as_ref()); + if let Some(index) = self.0.iter().position(|c| c.id().as_deref() == id) { + self.0.remove(index); + } + self + } + + // Sustituye el primer hijo con el `id` dado por otro componente. + #[inline] + fn replace_by_id(&mut self, id: impl AsRef<str>, child: Child) -> &mut Self { + let id = Some(id.as_ref()); + for c in &mut self.0 { + if c.id().as_deref() == id { + *c = child; + break; + } + } + self + } + + // Elimina todos los componentes hijo de la lista. + #[inline] + fn reset(&mut self) -> &mut Self { + self.0.clear(); + self + } + + // Children GETTERS **************************************************************************** + + /// Devuelve el número de componentes hijo de la lista. + pub fn len(&self) -> usize { + self.0.len() + } + + /// Indica si la lista está vacía. + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Devuelve el primer componente hijo con el identificador indicado, si existe. + pub fn get_by_id(&self, id: impl AsRef<str>) -> Option<&Child> { + let id = Some(id.as_ref()); + self.0.iter().find(|c| c.id().as_deref() == id) + } + + /// Devuelve un iterador sobre los componentes hijo con el identificador indicado. + pub fn iter_by_id<'a>(&'a self, id: &'a str) -> impl Iterator<Item = &'a Child> + 'a { + self.0.iter().filter(move |c| c.id().as_deref() == Some(id)) + } + + /// Devuelve un iterador sobre los componentes hijo con el identificador tipo ([`UniqueId`]) + /// indicado. + pub fn iter_by_type_id(&self, type_id: UniqueId) -> impl Iterator<Item = &Child> { + self.0.iter().filter(move |&c| c.type_id() == type_id) + } + + // Children RENDER ***************************************************************************** + + /// Renderiza todos los componentes hijo, en orden. + pub fn render(&self, cx: &mut Context) -> Markup { + html! { + @for c in &self.0 { + (c.render(cx)) + } + } + } +} + +impl IntoIterator for Children { + type Item = Child; + type IntoIter = IntoIter<Child>; + + /// Consume la estructura `Children`, devolviendo un iterador que consume los elementos. + /// + /// ### Ejemplo de uso: + /// ```rust#ignore + /// let children = Children::new().with(child1).with(child2); + /// for child in children { + /// println!("{:?}", child.id()); + /// } + /// ``` + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'a> IntoIterator for &'a Children { + type Item = &'a Child; + type IntoIter = std::slice::Iter<'a, Child>; + + /// Itera sobre una referencia inmutable de `Children`, devolviendo un iterador de referencia. + /// + /// ### Ejemplo de uso: + /// ```rust#ignore + /// let children = Children::new().with(child1).with(child2); + /// for child in &children { + /// println!("{:?}", child.id()); + /// } + /// ``` + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl<'a> IntoIterator for &'a mut Children { + type Item = &'a mut Child; + type IntoIter = std::slice::IterMut<'a, Child>; + + /// Itera sobre una referencia mutable de `Children`, devolviendo un iterador mutable. + /// + /// ### Ejemplo de uso: + /// ```rust#ignore + /// let mut children = Children::new().with(child1).with(child2); + /// for child in &mut children { + /// child.render(&mut context); + /// } + /// ``` + fn into_iter(self) -> Self::IntoIter { + self.0.iter_mut() + } +} diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs new file mode 100644 index 00000000..4c93960a --- /dev/null +++ b/src/core/component/definition.rs @@ -0,0 +1,121 @@ +use crate::base::action; +use crate::core::{AnyInfo, TypeInfo}; +use crate::html::{html, Context, Markup, PrepareMarkup, Render}; + +/// Define la función de renderizado para todos los componentes. +/// +/// Este *trait* se implementa automáticamente en cualquier tipo (componente) que implemente +/// [`ComponentTrait`], por lo que no requiere ninguna codificación manual. +pub trait ComponentRender { + /// Renderiza el componente usando el contexto proporcionado. + fn render(&mut self, cx: &mut Context) -> Markup; +} + +/// Interfaz común que debe implementar un componente renderizable en `PageTop`. +/// +/// Se recomienda que los componentes deriven [`AutoDefault`](crate::AutoDefault). También deben +/// implementar el método [`new`](Self::new) y pueden sobrescribir los otros métodos para +/// personalizar su comportamiento. +pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { + /// Crea una nueva instancia del componente. + /// + /// Este método debe implementarse explícitamente. + fn new() -> Self + where + Self: Sized; + + /// Devuelve el nombre del componente. + /// + /// Por defecto se obtiene del nombre corto del tipo usando [`TypeInfo::ShortName`]. + fn name(&self) -> &'static str { + TypeInfo::ShortName.of::<Self>() + } + + /// Devuelve una descripción opcional del componente. + /// + /// Por defecto, no se proporciona ninguna descripción (`None`). + fn description(&self) -> Option<String> { + None + } + + /// Devuelve un identificador opcional para el componente. + /// + /// Este identificador puede usarse para referenciar el componente en el HTML. Por defecto, no + /// tiene ningún identificador (`None`). + fn id(&self) -> Option<String> { + None + } + + /// Configura el componente justo antes de preparar el renderizado. + /// + /// Este método puede sobrescribirse para modificar la estructura interna del componente o el + /// contexto antes de preparar la renderización del componente. Por defecto no hace nada. + #[allow(unused_variables)] + fn setup_before_prepare(&mut self, cx: &mut Context) {} + + /// Devuelve la representación estructurada del componente lista para renderizar. + /// + /// Puede sobrescribirse para generar dinámicamente el contenido HTML. Por defecto, devuelve + /// [`PrepareMarkup::None`]. + #[allow(unused_variables)] + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::None + } +} + +/// Implementa [`render()`](ComponentRender::render) para todos los componentes. +/// +/// Y para cada componente ejecuta la siguiente secuencia: +/// +/// 1. Despacha [`action::component::IsRenderable`](crate::base::action::component::IsRenderable) +/// para ver si se puede renderizar. Si no es así, devuelve un [`Markup`] vacío. +/// 2. Ejecuta [`setup_before_prepare()`](ComponentTrait::setup_before_prepare) para que el +/// componente pueda ajustar su estructura interna o modificar el contexto. +/// 3. Despacha [`action::theme::BeforeRender<C>`](crate::base::action::theme::BeforeRender) para +/// que el tema pueda hacer ajustes en el componente o el contexto. +/// 4. Despacha [`action::component::BeforeRender<C>`](crate::base::action::component::BeforeRender) +/// para que otras extensiones puedan hacer ajustes. +/// 5. **Prepara el renderizado del componente**: +/// - Despacha [`action::theme::PrepareRender<C>`](crate::base::action::theme::PrepareRender) +/// para permitir al tema preparar un renderizado diferente al predefinido. +/// - Si no es así, ejecuta [`prepare_component()`](ComponentTrait::prepare_component) para +/// preparar el renderizado predefinido del componente. +/// 6. Despacha [`action::theme::AfterRender<C>`](crate::base::action::theme::AfterRender) para +/// que el tema pueda hacer sus últimos ajustes. +/// 7. Despacha [`action::component::AfterRender<C>`](crate::base::action::component::AfterRender) +/// para que otras extensiones puedan hacer sus últimos ajustes. +/// 8. Finalmente devuelve un [`Markup`] del renderizado preparado en el paso 5. +impl<C: ComponentTrait> ComponentRender for C { + fn render(&mut self, cx: &mut Context) -> Markup { + // Si no es renderizable, devuelve un bloque HTML vacío. + if !action::component::IsRenderable::dispatch(self, cx) { + return html! {}; + } + + // Configura el componente antes de preparar. + self.setup_before_prepare(cx); + + // Acciones específicas del tema antes de renderizar el componente. + action::theme::BeforeRender::dispatch(self, cx); + + // Acciones de las extensiones antes de renderizar el componente. + action::component::BeforeRender::dispatch(self, cx); + + // Prepara el renderizado del componente. + let prepare = action::theme::PrepareRender::dispatch(self, cx); + let prepare = if prepare.is_empty() { + self.prepare_component(cx) + } else { + prepare + }; + + // Acciones específicas del tema después de renderizar el componente. + action::theme::AfterRender::dispatch(self, cx); + + // Acciones de las extensiones después de renderizar el componente. + action::component::AfterRender::dispatch(self, cx); + + // Devuelve el marcado final. + prepare.render() + } +} diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index 9012234f..d5c452af 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -1,9 +1,11 @@ use crate::core::action::add_action; use crate::core::extension::ExtensionRef; use crate::core::theme::all::THEMES; -use crate::{service, trace}; +use crate::{/*global, include_files, include_files_service, */ service, trace}; -use std::sync::{LazyLock, RwLock}; +use parking_lot::RwLock; + +use std::sync::LazyLock; // EXTENSIONES ************************************************************************************* @@ -27,11 +29,11 @@ pub fn register_extensions(root_extension: Option<ExtensionRef>) { add_to_enabled(&mut enabled_list, extension); } + /* Añade la página de bienvenida por defecto a la lista de extensiones habilitadas. + add_to_enabled(&mut enabled_list, &crate::base::extension::Welcome); */ + // Guarda la lista final de extensiones habilitadas. - ENABLED_EXTENSIONS - .write() - .unwrap() - .append(&mut enabled_list); + ENABLED_EXTENSIONS.write().append(&mut enabled_list); // Prepara una lista de extensiones deshabilitadas. let mut dropped_list: Vec<ExtensionRef> = Vec::new(); @@ -42,10 +44,7 @@ pub fn register_extensions(root_extension: Option<ExtensionRef>) { } // Guarda la lista final de extensiones deshabilitadas. - DROPPED_EXTENSIONS - .write() - .unwrap() - .append(&mut dropped_list); + DROPPED_EXTENSIONS.write().append(&mut dropped_list); } fn add_to_enabled(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { @@ -61,7 +60,7 @@ fn add_to_enabled(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { // Comprueba si la extensión tiene un tema asociado que deba registrarse. if let Some(theme) = extension.theme() { - let mut registered_themes = THEMES.write().unwrap(); + let mut registered_themes = THEMES.write(); // Asegura que el tema no esté ya registrado para evitar duplicados. if !registered_themes .iter() @@ -84,7 +83,6 @@ fn add_to_dropped(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { // Comprueba si la extensión está habilitada. Si es así, registra una advertencia. if ENABLED_EXTENSIONS .read() - .unwrap() .iter() .any(|e| e.type_id() == extension.type_id()) { @@ -109,7 +107,7 @@ fn add_to_dropped(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { // REGISTRO DE LAS ACCIONES ************************************************************************ pub fn register_actions() { - for extension in ENABLED_EXTENSIONS.read().unwrap().iter() { + for extension in ENABLED_EXTENSIONS.read().iter() { for a in extension.actions().into_iter() { add_action(a); } @@ -120,15 +118,20 @@ pub fn register_actions() { pub fn initialize_extensions() { trace::info!("Calling application bootstrap"); - for extension in ENABLED_EXTENSIONS.read().unwrap().iter() { + for extension in ENABLED_EXTENSIONS.read().iter() { extension.initialize(); } } // CONFIGURA LOS SERVICIOS ************************************************************************* +//include_files!(assets); + pub fn configure_services(scfg: &mut service::web::ServiceConfig) { - for extension in ENABLED_EXTENSIONS.read().unwrap().iter() { + for extension in ENABLED_EXTENSIONS.read().iter() { extension.configure_service(scfg); } + /*include_files_service!( + scfg, assets => "/", [&global::SETTINGS.dev.pagetop_project_dir, "static"] + );*/ } diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 645afc80..2d9f6dda 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -2,7 +2,7 @@ use crate::core::action::ActionBox; use crate::core::theme::ThemeRef; use crate::core::AnyInfo; use crate::locale::L10n; -use crate::{inject_actions, service}; +use crate::{actions_boxed, service}; /// Representa una referencia a una extensión. /// @@ -77,7 +77,7 @@ pub trait ExtensionTrait: AnyInfo + Send + Sync { /// [peso](crate::Weight), permitiendo personalizar el comportamiento de la aplicación en puntos /// específicos. fn actions(&self) -> Vec<ActionBox> { - inject_actions![] + actions_boxed![] } /// Inicializa la extensión durante la lógica de arranque de la aplicación. diff --git a/src/core/theme/all.rs b/src/core/theme/all.rs index 3516107e..1b982680 100644 --- a/src/core/theme/all.rs +++ b/src/core/theme/all.rs @@ -1,7 +1,9 @@ use crate::core::theme::ThemeRef; use crate::global; -use std::sync::{LazyLock, RwLock}; +use parking_lot::RwLock; + +use std::sync::LazyLock; // TEMAS ******************************************************************************************* @@ -17,11 +19,11 @@ pub static DEFAULT_THEME: LazyLock<ThemeRef> = // TEMA POR NOMBRE ********************************************************************************* +/// Devuelve el tema identificado por su [`short_name`](AnyInfo::short_name). pub fn theme_by_short_name(short_name: impl AsRef<str>) -> Option<ThemeRef> { let short_name = short_name.as_ref().to_lowercase(); match THEMES .read() - .unwrap() .iter() .find(|t| t.short_name().to_lowercase() == short_name) { diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 13fe2824..e32ac482 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -9,7 +9,7 @@ pub type ThemeRef = &'static dyn ThemeTrait; /// Interfaz común que debe implementar cualquier tema de `PageTop`. /// /// Un tema implementará [`ThemeTrait`] y los métodos que sean necesarios de [`ExtensionTrait`], -/// aunque el único obligatorio es [`theme()`](crate::core::extension::ExtensionTrait#method.theme). +/// aunque el único obligatorio es [`theme()`](ExtensionTrait::theme). /// /// ```rust /// use pagetop::prelude::*; diff --git a/src/html.rs b/src/html.rs index 4fc9b3e5..3c9c7962 100644 --- a/src/html.rs +++ b/src/html.rs @@ -27,6 +27,9 @@ pub use opt_translated::OptionTranslated; mod opt_classes; pub use opt_classes::{ClassesOp, OptionClasses}; +mod opt_component; +pub use opt_component::OptionComponent; + use crate::AutoDefault; /// Prepara contenido HTML para su conversión a [`Markup`]. diff --git a/src/html/opt_component.rs b/src/html/opt_component.rs new file mode 100644 index 00000000..9e116cd2 --- /dev/null +++ b/src/html/opt_component.rs @@ -0,0 +1,68 @@ +use crate::builder_fn; +use crate::core::component::{ComponentTrait, Typed}; +use crate::html::{html, Context, Markup}; + +/// Contenedor de componente para incluir en otros componentes. +/// +/// Este tipo encapsula `Option<Typed<C>>` para incluir un componente de manera segura en otros +/// componentes, útil para representar estructuras complejas. +/// +/// # Ejemplo +/// +/// ```rust,ignore +/// use pagetop::prelude::*; +/// +/// let comp = MyComponent::new(); +/// let opt = OptionComponent::new(comp); +/// assert!(opt.get().is_some()); +/// ``` +pub struct OptionComponent<C: ComponentTrait>(Option<Typed<C>>); + +impl<C: ComponentTrait> Default for OptionComponent<C> { + fn default() -> Self { + OptionComponent(None) + } +} + +impl<C: ComponentTrait> OptionComponent<C> { + /// Crea un nuevo [`OptionComponent`]. + /// + /// El componente se envuelve automáticamente en un [`Typed`] y se almacena. + pub fn new(component: C) -> Self { + OptionComponent::default().with_value(Some(component)) + } + + // OptionComponent BUILDER ********************************************************************* + + /// Establece un componente nuevo, o lo vacía. + /// + /// Si se proporciona `Some(component)`, se guarda en [`Typed`]; y si es `None`, se limpia. + #[builder_fn] + pub fn with_value(mut self, component: Option<C>) -> Self { + if let Some(component) = component { + self.0 = Some(Typed::with(component)); + } else { + self.0 = None; + } + self + } + + // OptionComponent GETTERS ********************************************************************* + + /// Devuelve el componente, si existe. + pub fn get(&self) -> Option<Typed<C>> { + if let Some(value) = &self.0 { + return Some(value.clone()); + } + None + } + + /// Renderiza el componente, si existe. + pub fn render(&self, cx: &mut Context) -> Markup { + if let Some(component) = &self.0 { + component.render(cx) + } else { + html! {} + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 4ab3c6e4..03bae53e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -92,11 +92,11 @@ pub mod html; pub mod locale; // Soporte a fechas y horas. pub mod datetime; -// Tipos y funciones esenciales para crear acciones, extensiones y temas. +// Tipos y funciones esenciales para crear acciones, componentes, extensiones y temas. pub mod core; // Gestión del servidor y servicios web. pub mod service; -// Reúne temas listos para usar. +// Reúne acciones y temas listos para usar. pub mod base; // Prepara y ejecuta la aplicación. pub mod app; diff --git a/src/prelude.rs b/src/prelude.rs index 22d9ea0e..fe84e28a 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -17,7 +17,7 @@ pub use crate::include_locales; // crate::service pub use crate::{include_files, include_files_service}; // crate::core::action -pub use crate::inject_actions; +pub use crate::actions_boxed; // API. @@ -38,9 +38,11 @@ pub use crate::service; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; pub use crate::core::action::*; +pub use crate::core::component::*; pub use crate::core::extension::*; pub use crate::core::theme::*; +pub use crate::base::action; pub use crate::base::theme; pub use crate::app::Application; From cf1e8bbc0243f0657076af87c972ac4d3bfdf693 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 24 Jul 2025 09:11:29 +0200 Subject: [PATCH 692/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20el=20primer=20?= =?UTF-8?q?componente=20b=C3=A1sico=20nativo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Este componente renderiza directamente código HTML durante el renderizado del documento. --- src/base.rs | 4 +++- src/base/component.rs | 4 ++++ src/base/component/html.rs | 28 ++++++++++++++++++++++++++++ src/core/component/definition.rs | 8 +++----- src/lib.rs | 2 +- src/prelude.rs | 1 + 6 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/base/component.rs create mode 100644 src/base/component/html.rs diff --git a/src/base.rs b/src/base.rs index 491223e6..6f22dd72 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1,5 +1,7 @@ -//! Reúne acciones y temas listos para usar. +//! Reúne acciones, componentes y temas listos para usar. pub mod action; +pub mod component; + pub mod theme; diff --git a/src/base/component.rs b/src/base/component.rs new file mode 100644 index 00000000..27f0f739 --- /dev/null +++ b/src/base/component.rs @@ -0,0 +1,4 @@ +//! Componentes nativos proporcionados por `PageTop`. + +mod html; +pub use html::Html; diff --git a/src/base/component/html.rs b/src/base/component/html.rs new file mode 100644 index 00000000..09376059 --- /dev/null +++ b/src/base/component/html.rs @@ -0,0 +1,28 @@ +use crate::prelude::*; + +/// Componente básico para renderizar directamente código HTML. +#[derive(AutoDefault)] +pub struct Html(Markup); + +impl ComponentTrait for Html { + fn new() -> Self { + Html::default() + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { (self.0) }) + } +} + +impl Html { + /// Crear una instancia con el código HTML del argumento. + pub fn with(html: Markup) -> Self { + Html(html) + } + + /// Modifica el código HTML de la instancia con el nuevo código del argumento. + pub fn alter_html(&mut self, html: Markup) -> &mut Self { + self.0 = html; + self + } +} diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index 4c93960a..63264b7a 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -14,12 +14,10 @@ pub trait ComponentRender { /// Interfaz común que debe implementar un componente renderizable en `PageTop`. /// /// Se recomienda que los componentes deriven [`AutoDefault`](crate::AutoDefault). También deben -/// implementar el método [`new`](Self::new) y pueden sobrescribir los otros métodos para -/// personalizar su comportamiento. +/// implementar explícitamente el método [`new`](Self::new) y pueden sobrescribir los otros métodos +/// para personalizar su comportamiento. pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { /// Crea una nueva instancia del componente. - /// - /// Este método debe implementarse explícitamente. fn new() -> Self where Self: Sized; @@ -53,7 +51,7 @@ pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { #[allow(unused_variables)] fn setup_before_prepare(&mut self, cx: &mut Context) {} - /// Devuelve la representación estructurada del componente lista para renderizar. + /// Devuelve una representación estructurada del componente lista para renderizar. /// /// Puede sobrescribirse para generar dinámicamente el contenido HTML. Por defecto, devuelve /// [`PrepareMarkup::None`]. diff --git a/src/lib.rs b/src/lib.rs index 03bae53e..0818be6a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -96,7 +96,7 @@ pub mod datetime; pub mod core; // Gestión del servidor y servicios web. pub mod service; -// Reúne acciones y temas listos para usar. +// Reúne acciones, componentes y temas listos para usar. pub mod base; // Prepara y ejecuta la aplicación. pub mod app; diff --git a/src/prelude.rs b/src/prelude.rs index fe84e28a..11c785f4 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -43,6 +43,7 @@ pub use crate::core::extension::*; pub use crate::core::theme::*; pub use crate::base::action; +pub use crate::base::component::*; pub use crate::base::theme; pub use crate::app::Application; From c379ac28792f4f8613f2e75dfdd4591c5c6a1a7a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 24 Jul 2025 13:16:39 +0200 Subject: [PATCH 693/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mej?= =?UTF-8?q?ora=20las=20operaciones=20de=20cambio=20en=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html.rs | 2 +- src/html/context.rs | 165 ++++++++++++++++++++++++++------------------ 2 files changed, 98 insertions(+), 69 deletions(-) diff --git a/src/html.rs b/src/html.rs index 3c9c7962..7f18ee89 100644 --- a/src/html.rs +++ b/src/html.rs @@ -10,7 +10,7 @@ pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub(crate) use assets::Assets; mod context; -pub use context::{Context, ErrorParam}; +pub use context::{Context, ContextOp, ErrorParam}; mod opt_id; pub use opt_id::OptionId; diff --git a/src/html/context.rs b/src/html/context.rs index b3622501..4374b14f 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -13,6 +13,37 @@ use std::str::FromStr; use std::fmt; +/// Operaciones para modificar el contexto ([`Context`]) del documento. +pub enum ContextOp { + /// Modifica el identificador de idioma del documento. + LangId(&'static LanguageIdentifier), + /// Establece el tema que se usará para renderizar el documento. + /// + /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica + /// ninguno entonces usará el tema por defecto. + Theme(&'static str), + /// Define el tipo de composición usado para renderizar el documento. + Layout(&'static str), + + // Favicon. + /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. + SetFavicon(Option<Favicon>), + /// Define el *favicon* solo si no se ha establecido previamente. + SetFaviconIfNone(Favicon), + + // Stylesheets. + /// Añade una hoja de estilos CSS al documento. + AddStyleSheet(StyleSheet), + /// Elimina una hoja de estilos por su ruta o identificador. + RemoveStyleSheet(&'static str), + + // JavaScripts. + /// Añade un *script* JavaScript al documento. + AddJavaScript(JavaScript), + /// Elimina un *script* por su ruta o identificador. + RemoveJavaScript(&'static str), +} + /// Errores de lectura o conversión de parámetros almacenados en el contexto. #[derive(Debug)] pub enum ErrorParam { @@ -33,48 +64,52 @@ impl fmt::Display for ErrorParam { impl Error for ErrorParam {} -/// Representa el contexto asociado a un documento HTML. +/// Representa el contexto de un documento HTML. /// -/// Esta estructura se crea internamente para recoger información relativa al documento asociado, -/// como la solicitud HTTP de origen, el idioma, el tema para renderizar ([`ThemeRef`]), y los -/// recursos *favicon* ([`Favicon`]), las hojas de estilo ([`StyleSheet`]) y los *scripts* -/// ([`JavaScript`]). También admite parámetros de contexto definidos en tiempo de ejecución. +/// Se crea internamente para manejar información relevante del documento, como la solicitud HTTP de +/// origen, el idioma, tema y composición para el renderizado, los recursos *favicon* ([`Favicon`]), +/// hojas de estilo ([`StyleSheet`]) y *scripts* ([`JavaScript`]), así como parámetros de contexto +/// definidos en tiempo de ejecución. /// /// # Ejemplo /// /// ```rust /// use pagetop::prelude::*; /// -/// fn configure_context(mut ctx: Context) { +/// fn configure_context(mut cx: Context) { /// // Establece el idioma del documento a español. -/// ctx.set_langid(LangMatch::langid_or_default("es-ES")); -/// +/// cx.alter_assets(ContextOp::LangId( +/// LangMatch::langid_or_default("es-ES") +/// )) /// // Selecciona un tema (por su nombre corto). -/// ctx.set_theme("aliner"); -/// +/// .alter_assets(ContextOp::Theme("aliner")) /// // Asigna un favicon. -/// ctx.set_favicon(Some(Favicon::new().with_icon("/icons/favicon.ico"))); -/// +/// .alter_assets(ContextOp::SetFavicon(Some( +/// Favicon::new().with_icon("/icons/favicon.ico") +/// ))) /// // Añade una hoja de estilo externa. -/// ctx.add_stylesheet(StyleSheet::from("/css/style.css")); -/// +/// .alter_assets(ContextOp::AddStyleSheet( +/// StyleSheet::from("/css/style.css") +/// )) /// // Añade un script JavaScript. -/// ctx.add_javascript(JavaScript::defer("/js/main.js")); +/// .alter_assets(ContextOp::AddJavaScript( +/// JavaScript::defer("/js/main.js") +/// )); /// /// // Añade un parámetro dinámico al contexto. -/// ctx.set_param("usuario_id", 42); +/// cx.set_param("usuario_id", 42); /// /// // Recupera el parámetro y lo convierte a su tipo original. -/// let id: i32 = ctx.get_param("usuario_id").unwrap(); +/// let id: i32 = cx.get_param("usuario_id").unwrap(); /// assert_eq!(id, 42); /// /// // Recupera el tema seleccionado. -/// let active_theme = ctx.theme(); +/// let active_theme = cx.theme(); /// assert_eq!(active_theme.short_name(), "aliner"); /// /// // Genera un identificador único para un componente de tipo `Menu`. /// struct Menu; -/// let unique_id = ctx.required_id::<Menu>(None); +/// let unique_id = cx.required_id::<Menu>(None); /// assert_eq!(unique_id, "menu-1"); // Si es el primero generado. /// } /// ``` @@ -83,6 +118,7 @@ pub struct Context { request : HttpRequest, // Solicitud HTTP de origen. langid : &'static LanguageIdentifier, // Identificador del idioma. theme : ThemeRef, // Referencia al tema para renderizar. + layout : &'static str, // Composición del documento para renderizar. favicon : Option<Favicon>, // Favicon, si se ha definido. stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. javascripts: Assets<JavaScript>, // Scripts JavaScript. @@ -100,6 +136,7 @@ impl Context { request, langid : &DEFAULT_LANGID, theme : *DEFAULT_THEME, + layout : "default", favicon : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), @@ -108,59 +145,45 @@ impl Context { } } - /// Modifica el identificador de idioma del documento. - pub fn set_langid(&mut self, langid: &'static LanguageIdentifier) -> &mut Self { - self.langid = langid; - self - } - - /// Establece el tema que se usará para renderizar el documento. - /// - /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica - /// ninguno entonces usará el tema por defecto. - pub fn set_theme(&mut self, short_name: impl AsRef<str>) -> &mut Self { - self.theme = theme_by_short_name(short_name).unwrap_or(*DEFAULT_THEME); - self - } - - /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. - pub fn set_favicon(&mut self, favicon: Option<Favicon>) -> &mut Self { - self.favicon = favicon; - self - } - - /// Define el *favicon* solo si no se ha establecido previamente. - pub fn set_favicon_if_none(&mut self, favicon: Favicon) -> &mut Self { - if self.favicon.is_none() { - self.favicon = Some(favicon); + /// Modifica información o recursos del contexto usando [`ContextOp`]. + pub fn alter_assets(&mut self, op: ContextOp) -> &mut Self { + match op { + ContextOp::LangId(langid) => { + self.langid = langid; + } + ContextOp::Theme(theme_name) => { + self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); + } + ContextOp::Layout(layout) => { + self.layout = layout; + } + // Favicon. + ContextOp::SetFavicon(favicon) => { + self.favicon = favicon; + } + ContextOp::SetFaviconIfNone(icon) => { + if self.favicon.is_none() { + self.favicon = Some(icon); + } + } + // Stylesheets. + ContextOp::AddStyleSheet(css) => { + self.stylesheets.add(css); + } + ContextOp::RemoveStyleSheet(path) => { + self.stylesheets.remove(path); + } + // JavaScripts. + ContextOp::AddJavaScript(js) => { + self.javascripts.add(js); + } + ContextOp::RemoveJavaScript(path) => { + self.javascripts.remove(path); + } } self } - /// Añade una hoja de estilos CSS al documento. - pub fn add_stylesheet(&mut self, css: StyleSheet) -> &mut Self { - self.stylesheets.add(css); - self - } - - /// Elimina una hoja de estilos por su ruta o identificador. - pub fn remove_stylesheet(&mut self, name: impl AsRef<str>) -> &mut Self { - self.stylesheets.remove(name); - self - } - - /// Añade un *script* JavaScript al documento. - pub fn add_javascript(&mut self, js: JavaScript) -> &mut Self { - self.javascripts.add(js); - self - } - - /// Elimina un *script* por su ruta o identificador. - pub fn remove_javascript(&mut self, name: impl AsRef<str>) -> &mut Self { - self.javascripts.remove(name); - self - } - /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. pub fn set_param<T: ToString>(&mut self, key: impl AsRef<str>, value: T) -> &mut Self { self.params @@ -185,6 +208,12 @@ impl Context { self.theme } + /// Devuelve el tipo de composición usado para renderizar el documento. El valor predeterminado + /// es `"default"`. + pub fn layout(&self) -> &str { + self.layout + } + /// Recupera un parámetro del contexto convertido al tipo especificado. /// /// Devuelve un error si el parámetro no existe ([`ErrorParam::NotFound`]) o la conversión falla From 3397553ba75a8cf674927f34f6b7ea468886d36b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 24 Jul 2025 21:20:35 +0200 Subject: [PATCH 694/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20gesti=C3=B3n?= =?UTF-8?q?=20de=20regiones=20en=20temas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/theme.rs | 18 ++++++ src/core/theme/definition.rs | 7 ++- src/core/theme/regions.rs | 111 +++++++++++++++++++++++++++++++++++ src/locale/en-US/theme.ftl | 1 + src/locale/es-ES/theme.ftl | 1 + 5 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/core/theme/regions.rs create mode 100644 src/locale/en-US/theme.ftl create mode 100644 src/locale/es-ES/theme.ftl diff --git a/src/core/theme.rs b/src/core/theme.rs index d741cf80..d67a4457 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -1,6 +1,24 @@ //! API para añadir y gestionar nuevos temas. +//! +//! En `PageTop` un tema es la *piel* de la aplicación, decide cómo se muestra cada documento HTML, +//! especialmente las páginas de contenido ([`Page`](crate::response::page::Page)), sin alterar la +//! lógica interna de sus componentes. +//! +//! Un tema **declara las regiones** (*cabecera*, *barra lateral*, *pie*, etc.) que estarán +//! disponibles para colocar contenido. Los temas son responsables últimos de los estilos, +//! tipografías, espaciados y cualquier otro detalle visual o de comportamiento (como animaciones, +//! *scripts* de interfaz, etc.). +//! +//! Es una extensión más (implementando [`ExtensionTrait`](crate::core::extension::ExtensionTrait)). +//! Se instala, activa y declara dependencias igual que el resto de extensiones; y se señala a sí +//! misma como tema (implementando [`theme()`](crate::core::extension::ExtensionTrait::theme) +//! y [`ThemeTrait`]). mod definition; pub use definition::{ThemeRef, ThemeTrait}; +mod regions; +pub(crate) use regions::ChildrenInRegions; +pub use regions::InRegion; + pub(crate) mod all; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index e32ac482..6f1e54a1 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,4 +1,5 @@ use crate::core::extension::ExtensionTrait; +use crate::locale::L10n; /// Representa una referencia a un tema. /// @@ -27,4 +28,8 @@ pub type ThemeRef = &'static dyn ThemeTrait; /// /// impl ThemeTrait for MyTheme {} /// ``` -pub trait ThemeTrait: ExtensionTrait + Send + Sync {} +pub trait ThemeTrait: ExtensionTrait + Send + Sync { + fn regions(&self) -> Vec<(&'static str, L10n)> { + vec![("content", L10n::l("content"))] + } +} diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs new file mode 100644 index 00000000..5beee25a --- /dev/null +++ b/src/core/theme/regions.rs @@ -0,0 +1,111 @@ +use crate::core::component::{Child, ChildOp, Children}; +use crate::core::theme::ThemeRef; +use crate::{builder_fn, AutoDefault, UniqueId}; + +use parking_lot::RwLock; + +use std::collections::HashMap; +use std::sync::LazyLock; + +static THEME_REGIONS: LazyLock<RwLock<HashMap<UniqueId, ChildrenInRegions>>> = + LazyLock::new(|| RwLock::new(HashMap::new())); + +static COMMON_REGIONS: LazyLock<RwLock<ChildrenInRegions>> = + LazyLock::new(|| RwLock::new(ChildrenInRegions::default())); + +// Estructura interna para mantener los componentes de cada región dada. +#[derive(AutoDefault)] +pub struct ChildrenInRegions(HashMap<&'static str, Children>); + +impl ChildrenInRegions { + pub fn new() -> Self { + ChildrenInRegions::default() + } + + pub fn with(region_id: &'static str, child: Child) -> Self { + ChildrenInRegions::default().with_in_region(region_id, ChildOp::Add(child)) + } + + #[builder_fn] + pub fn with_in_region(mut self, region_id: &'static str, op: ChildOp) -> Self { + if let Some(region) = self.0.get_mut(region_id) { + region.alter_child(op); + } else { + self.0.insert(region_id, Children::new().with_child(op)); + } + self + } + + pub fn all_in_region(&self, theme: ThemeRef, region_id: &str) -> Children { + let common = COMMON_REGIONS.read(); + if let Some(r) = THEME_REGIONS.read().get(&theme.type_id()) { + Children::merge(&[ + common.0.get(region_id), + self.0.get(region_id), + r.0.get(region_id), + ]) + } else { + Children::merge(&[common.0.get(region_id), self.0.get(region_id)]) + } + } +} + +/// Permite añadir componentes a regiones globales o regiones de temas concretos. +/// +/// Dada una región, según la variante seleccionada, se le podrán añadir ([`add()`](Self::add)) +/// componentes que se mantendrán durante la ejecución de la aplicación. +/// +/// Estas estructuras de componentes se renderizarán automáticamente al procesar los documentos HTML +/// que las usan, como las páginas de contenido ([`Page`](crate::response::page::Page)), por +/// ejemplo. +pub enum InRegion { + /// Representa la región por defecto en la que se pueden añadir componentes. + Content, + /// Representa la región con el nombre del argumento. + Named(&'static str), + /// Representa la región con el nombre y del tema especificado en los argumentos. + OfTheme(&'static str, ThemeRef), +} + +impl InRegion { + /// Permite añadir un componente en la región de la variante seleccionada. + /// + /// # Ejemplo + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// // Banner global, en la región por defecto de cualquier página. + /// InRegion::Content.add(Child::with(Html::with( + /// html! { ("🎉 ¡Bienvenido!") } + /// ))); + /// + /// // Texto en la región "sidebar". + /// InRegion::Named("sidebar").add(Child::with(Html::with( + /// html! { ("Publicidad") } + /// ))); + /// ``` + pub fn add(&self, child: Child) -> &Self { + match self { + InRegion::Content => { + COMMON_REGIONS + .write() + .alter_in_region("region-content", ChildOp::Add(child)); + } + InRegion::Named(name) => { + COMMON_REGIONS + .write() + .alter_in_region(name, ChildOp::Add(child)); + } + InRegion::OfTheme(region, theme) => { + let mut regions = THEME_REGIONS.write(); + if let Some(r) = regions.get_mut(&theme.type_id()) { + r.alter_in_region(region, ChildOp::Add(child)); + } else { + regions.insert(theme.type_id(), ChildrenInRegions::with(region, child)); + } + } + } + self + } +} diff --git a/src/locale/en-US/theme.ftl b/src/locale/en-US/theme.ftl new file mode 100644 index 00000000..fd7f228d --- /dev/null +++ b/src/locale/en-US/theme.ftl @@ -0,0 +1 @@ +content = Content diff --git a/src/locale/es-ES/theme.ftl b/src/locale/es-ES/theme.ftl new file mode 100644 index 00000000..c2026c6f --- /dev/null +++ b/src/locale/es-ES/theme.ftl @@ -0,0 +1 @@ +content = Contenido From 2566bd6e58fe61da8ded884bff38d33ccf262e13 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 25 Jul 2025 18:25:42 +0200 Subject: [PATCH 695/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20respuestas=20w?= =?UTF-8?q?eb=20con=20redirecciones=20HTTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib.rs | 2 + src/prelude.rs | 3 ++ src/response.rs | 5 ++ src/response/redirect.rs | 98 ++++++++++++++++++++++++++++++++++++++++ src/service.rs | 2 +- 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/response.rs create mode 100644 src/response/redirect.rs diff --git a/src/lib.rs b/src/lib.rs index 0818be6a..e2d39754 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,6 +94,8 @@ pub mod locale; pub mod datetime; // Tipos y funciones esenciales para crear acciones, componentes, extensiones y temas. pub mod core; +// Respuestas a peticiones web en sus diferentes formatos. +pub mod response; // Gestión del servidor y servicios web. pub mod service; // Reúne acciones, componentes y temas listos para usar. diff --git a/src/prelude.rs b/src/prelude.rs index 11c785f4..7baa687a 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -34,6 +34,7 @@ pub use crate::locale::*; pub use crate::datetime::*; pub use crate::service; +pub use crate::service::HttpRequest; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; @@ -42,6 +43,8 @@ pub use crate::core::component::*; pub use crate::core::extension::*; pub use crate::core::theme::*; +pub use crate::response::{redirect::*, ResponseError}; + pub use crate::base::action; pub use crate::base::component::*; pub use crate::base::theme; diff --git a/src/response.rs b/src/response.rs new file mode 100644 index 00000000..cf18377c --- /dev/null +++ b/src/response.rs @@ -0,0 +1,5 @@ +//! Respuestas a las peticiones web en sus diferentes formatos. + +pub use actix_web::ResponseError; + +pub mod redirect; diff --git a/src/response/redirect.rs b/src/response/redirect.rs new file mode 100644 index 00000000..bb3020da --- /dev/null +++ b/src/response/redirect.rs @@ -0,0 +1,98 @@ +//! Realiza redirecciones HTTP. +//! +//! **La redirección de URL** (o *URL forwarding*) es una técnica que permite asignar más de una +//! dirección a un mismo recurso web. HTTP define respuestas ***HTTP redirect*** para ello (ver +//! *[Redirections in HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections)*). +//! +//! Existen varios tipos de redirección, agrupados en tres grandes categorías: +//! +//! - **Redirecciones permanentes**. Se usan cuando el cambio de ubicación es definitivo. Indican +//! que la URL original ya no debe emplearse y que ha sido sustituida por la nueva. Los robots de +//! los buscadores, lectores RSS y otros *crawlers* suelen actualizar sus índices con la nueva +//! dirección. +//! +//! - **Redirecciones temporales**. Se aplican cuando el recurso no puede servirse desde su +//! ubicación canónica pero sí desde otra provisional. En este caso los buscadores **no** deben +//! memorizar la URL alternativa. También son útiles para mostrar páginas de progreso al crear, +//! actualizar o eliminar recursos. +//! +//! - **Respuestas especiales**. + +use crate::service::HttpResponse; + +/// Funciones predefinidas para generar respuestas HTTP de redirección. +/// +/// Ofrece atajos para construir respuestas con el código de estado apropiado, añade la cabecera +/// `Location` y la cierra con `.finish()`, evitando repetir la misma secuencia en cada controlador. +pub struct Redirect; + +impl Redirect { + /// Redirección **permanente**. Código de estado **301**. El método GET se conserva tal cual. + /// Otros métodos pueden degradarse a GET. Es una redirección típica para la reorganización de + /// un sitio o aplicación web. + /// + /// Emplear cuando un recurso se ha movido de forma definitiva y la URL antigua debe dejar de + /// usarse. + #[must_use] + pub fn moved(redirect_to_url: &str) -> HttpResponse { + HttpResponse::MovedPermanently() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Redirección **permanente**. Código de estado **308**. Mantiene método y cuerpo sin cambios. + /// + /// Indicada para reorganizaciones de un sitio o aplicación web en las que también existen + /// métodos distintos de GET (POST, PUT, …) que no deben degradarse a GET. + #[must_use] + pub fn permanent(redirect_to_url: &str) -> HttpResponse { + HttpResponse::PermanentRedirect() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Redirección **temporal**. Código de estado **302**. El método GET (y normalmente HEAD) se + /// mantiene tal cual. Otros métodos pueden degradarse a GET. + /// + /// Útil cuando un recurso está fuera de servicio de forma imprevista (mantenimiento breve, + /// sobrecarga, …). + #[must_use] + pub fn found(redirect_to_url: &str) -> HttpResponse { + HttpResponse::Found() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Redirección **temporal**. Código de estado **303**. Método GET se mantiene tal cual. Los + /// demás métodos se cambian a GET (se pierde el cuerpo). + /// + /// Se usa típicamente tras un POST o PUT para aplicar el patrón *Post/Redirect/Get*, permite + /// recargar la página de resultados sin volver a ejecutar la operación. + #[must_use] + pub fn see_other(redirect_to_url: &str) -> HttpResponse { + HttpResponse::SeeOther() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Redirección **temporal**. Código de estado **307**. Conserva método y cuerpo íntegros. + /// + /// Preferible a [`found`](Self::found) cuando el sitio expone operaciones diferentes de GET que + /// deben respetarse durante la redirección. + #[must_use] + pub fn temporary(redirect_to_url: &str) -> HttpResponse { + HttpResponse::TemporaryRedirect() + .append_header(("Location", redirect_to_url)) + .finish() + } + + /// Respuesta **especial**. Código de estado **304**. Se envía tras una petición condicional, + /// para indicar que la copia en caché sigue siendo válida y puede utilizarse, evitando + /// transferir de nuevo el recurso. + /// + /// No es una redirección, el cliente debe reutilizar su copia local. + #[must_use] + pub fn not_modified() -> HttpResponse { + HttpResponse::NotModified().finish() + } +} diff --git a/src/service.rs b/src/service.rs index 47e84224..cc32d56e 100644 --- a/src/service.rs +++ b/src/service.rs @@ -6,7 +6,7 @@ pub use actix_web::dev::ServiceFactory as Factory; pub use actix_web::dev::ServiceRequest as Request; pub use actix_web::dev::ServiceResponse as Response; pub use actix_web::{http, rt, web}; -pub use actix_web::{App, Error, HttpRequest, HttpServer}; +pub use actix_web::{App, Error, HttpRequest, HttpResponse, HttpServer}; #[doc(hidden)] pub use actix_web::test; From a1b5155703b648661ac6cf486c9bfe58f421fa05 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 25 Jul 2025 19:18:06 +0200 Subject: [PATCH 696/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20a=20?= =?UTF-8?q?respuestas=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/prelude.rs | 4 ++-- src/response.rs | 2 ++ src/response/json.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/response/json.rs diff --git a/src/prelude.rs b/src/prelude.rs index 7baa687a..9334f189 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -34,7 +34,7 @@ pub use crate::locale::*; pub use crate::datetime::*; pub use crate::service; -pub use crate::service::HttpRequest; +pub use crate::service::{HttpRequest, HttpResponse}; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; @@ -43,7 +43,7 @@ pub use crate::core::component::*; pub use crate::core::extension::*; pub use crate::core::theme::*; -pub use crate::response::{redirect::*, ResponseError}; +pub use crate::response::{json::*, redirect::*, ResponseError}; pub use crate::base::action; pub use crate::base::component::*; diff --git a/src/response.rs b/src/response.rs index cf18377c..1fce663f 100644 --- a/src/response.rs +++ b/src/response.rs @@ -2,4 +2,6 @@ pub use actix_web::ResponseError; +pub mod json; + pub mod redirect; diff --git a/src/response/json.rs b/src/response/json.rs new file mode 100644 index 00000000..fee4c121 --- /dev/null +++ b/src/response/json.rs @@ -0,0 +1,41 @@ +//! Extractor y generador de respuestas JSON (reexporta [`actix_web::web::Json`]). +//! +//! # Uso como extractor JSON +//! +//! Convierte automáticamente el cuerpo de una petición con `Content-Type: application/json` en un +//! tipo Rust fuertemente tipado, validando el formato y deserializando con *serde*. +//! +//! ```rust +//! use pagetop::prelude::*; +//! +//! #[derive(serde::Deserialize)] +//! struct NuevoUsuario { nombre: String, email: String } +//! +//! // Manejador configurado para la ruta POST "/usuarios". +//! async fn crear_usuario(payload: Json<NuevoUsuario>) -> HttpResponse { +//! // `payload` ya es `NuevoUsuario`; si la deserialización falla, +//! // devolverá automáticamente 400 Bad Request con un cuerpo JSON que describe el error. +//! HttpResponse::Ok().finish() +//! } +//! ``` +//! +//! # Uso como generador de respuestas JSON +//! +//! Serializa valores Rust a JSON y genera una respuesta HTTP con el encabezado apropiado +//! `application/json; charset=utf-8`, todo con una llamada compacta. +//! +//! ```rust +//! use pagetop::prelude::*; +//! +//! #[derive(serde::Serialize)] +//! struct Usuario { id: u32, nombre: String } +//! +//! async fn obtener_usuario() -> Json<Usuario> { +//! Json(Usuario { id: 1, nombre: "Ada".into() }) +//! } +//! ``` +//! +//! `Json<T>` funciona con cualquier tipo que implemente `serde::Serialize` (para respuestas) y/o +//! `serde::Deserialize` (para peticiones). + +pub use actix_web::web::Json; From cf6bb24ed6e7e1d69f1e395d31e2c28160af69e1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 25 Jul 2025 23:05:53 +0200 Subject: [PATCH 697/853] =?UTF-8?q?=F0=9F=92=A1=20Normaliza=20comentarios?= =?UTF-8?q?=20en=20varios=20archivos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.rs | 8 ++++---- src/core/action/all.rs | 2 ++ src/core/component/children.rs | 9 ++++++--- src/html/opt_classes.rs | 4 +++- src/html/opt_id.rs | 1 + src/html/opt_name.rs | 3 ++- src/html/opt_string.rs | 1 + 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/config.rs b/src/config.rs index d532ba14..ed37d550 100644 --- a/src/config.rs +++ b/src/config.rs @@ -162,7 +162,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// Incluye los ajustes necesarios de la configuración anticipando valores por defecto. /// -/// ### Sintaxis +/// # Sintaxis /// /// Hay que añadir en nuestra librería el siguiente código: /// @@ -182,7 +182,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// * **Lista de pares** con las claves TOML que requieran valores por defecto. Siguen la notación /// `"seccion.subclave"` para coincidir con el árbol TOML. /// -/// ### Ejemplo básico +/// # Ejemplo básico /// /// ```rust,no_run /// use pagetop::prelude::*; @@ -212,7 +212,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// } /// ``` /// -/// ### Buenas prácticas +/// # Buenas prácticas /// /// * **Valores por defecto**. Declara un valor por defecto para cada clave obligatoria. Las claves /// opcionales pueden ser `Option<T>`. @@ -227,7 +227,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// * **Errores explícitos**. Si la deserialización falla, la macro lanzará un `panic!` con un /// mensaje que indica la estructura problemática, facilitando la depuración. /// -/// ### Requisitos +/// # Requisitos /// /// * Dependencia `serde` con la *feature* `derive`. /// * Las claves deben coincidir con los campos (*snake case*) de tu estructura `Settings_Type`. diff --git a/src/core/action/all.rs b/src/core/action/all.rs index ffee9f56..7fff970c 100644 --- a/src/core/action/all.rs +++ b/src/core/action/all.rs @@ -44,10 +44,12 @@ pub fn add_action(action: ActionBox) { /// acción específica. /// /// # Parámetros genéricos +/// /// - `A`: Tipo de acción que esperamos procesar. Debe implementar [`ActionDispatcher`]. /// - `F`: Función asociada a cada acción, devuelve un valor de tipo `B`. /// /// # Ejemplo de uso +/// /// ```rust,ignore /// pub(crate) fn dispatch(component: &mut C, cx: &mut Context) { /// dispatch_actions( diff --git a/src/core/component/children.rs b/src/core/component/children.rs index 38a626b2..cba8c39f 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -278,7 +278,8 @@ impl IntoIterator for Children { /// Consume la estructura `Children`, devolviendo un iterador que consume los elementos. /// - /// ### Ejemplo de uso: + /// # Ejemplo de uso: + /// /// ```rust#ignore /// let children = Children::new().with(child1).with(child2); /// for child in children { @@ -296,7 +297,8 @@ impl<'a> IntoIterator for &'a Children { /// Itera sobre una referencia inmutable de `Children`, devolviendo un iterador de referencia. /// - /// ### Ejemplo de uso: + /// # Ejemplo de uso: + /// /// ```rust#ignore /// let children = Children::new().with(child1).with(child2); /// for child in &children { @@ -314,7 +316,8 @@ impl<'a> IntoIterator for &'a mut Children { /// Itera sobre una referencia mutable de `Children`, devolviendo un iterador mutable. /// - /// ### Ejemplo de uso: + /// # Ejemplo de uso: + /// /// ```rust#ignore /// let mut children = Children::new().with(child1).with(child2); /// for child in &mut children { diff --git a/src/html/opt_classes.rs b/src/html/opt_classes.rs index bcec9372..abb3ba48 100644 --- a/src/html/opt_classes.rs +++ b/src/html/opt_classes.rs @@ -21,12 +21,14 @@ pub enum ClassesOp { /// Permite construir y modificar dinámicamente con [`ClassesOp`] una lista de clases CSS /// normalizadas. /// -/// ### Normalización +/// # Normalización +/// /// - El [orden de las clases no es relevante](https://stackoverflow.com/a/1321712) en CSS. /// - No se permiten clases duplicadas. /// - Las clases vacías se ignoran. /// /// # Ejemplo +/// /// ```rust /// use pagetop::prelude::*; /// diff --git a/src/html/opt_id.rs b/src/html/opt_id.rs index 6f166b95..893ac6d3 100644 --- a/src/html/opt_id.rs +++ b/src/html/opt_id.rs @@ -5,6 +5,7 @@ use crate::{builder_fn, AutoDefault}; /// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. /// /// # Normalización +/// /// - Se eliminan los espacios al principio y al final. /// - Se sustituyen los espacios intermedios por guiones bajos (`_`). /// - Si el resultado es una cadena vacía, se guarda `None`. diff --git a/src/html/opt_name.rs b/src/html/opt_name.rs index c4e2e2e0..aa74e3b9 100644 --- a/src/html/opt_name.rs +++ b/src/html/opt_name.rs @@ -5,11 +5,12 @@ use crate::{builder_fn, AutoDefault}; /// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. /// /// # Normalización +/// /// - Se eliminan los espacios al principio y al final. /// - Se sustituyen los espacios intermedios por guiones bajos (`_`). /// - Si el resultado es una cadena vacía, se guarda `None`. /// -/// ## Ejemplo +/// # Ejemplo /// /// ```rust /// use pagetop::prelude::*; diff --git a/src/html/opt_string.rs b/src/html/opt_string.rs index 5379597e..5bfd9c71 100644 --- a/src/html/opt_string.rs +++ b/src/html/opt_string.rs @@ -5,6 +5,7 @@ use crate::{builder_fn, AutoDefault}; /// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. /// /// # Normalización +/// /// - Se eliminan los espacios al principio y al final. /// - Si el resultado es una cadena vacía, se guarda `None`. /// From d7485c8311d79752fea06ca00c8040de9e1fc6ee Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 25 Jul 2025 23:29:16 +0200 Subject: [PATCH 698/853] =?UTF-8?q?=F0=9F=92=A1=20(macros):=20Mejora=20com?= =?UTF-8?q?entario=20en=20m=C3=A9todos=20"alter=5F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 62b6e886..ecca395d 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -170,8 +170,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { // Genera el método alter_...() con el código del método with_...(). let fn_alter_doc = format!( - "Modifica la instancia en los mismos términos que para el patrón <em>builder</em> hace el \ - método asociado `{}()`.", + "Equivale a invocar el método `{}()` cuando se aplica el patrón builder.", fn_with_name_str, ); let fn_alter = quote! { From 4af558289eb51feba1eb91b9b99c2995bc024167 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Jul 2025 00:27:11 +0200 Subject: [PATCH 699/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Reemplaza=20Contex?= =?UTF-8?q?tOp=20por=20AssetsOp=20en=20el=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html.rs | 2 +- src/html/context.rs | 151 +++++++++++++++++++++++--------------------- 2 files changed, 80 insertions(+), 73 deletions(-) diff --git a/src/html.rs b/src/html.rs index 7f18ee89..82fa906b 100644 --- a/src/html.rs +++ b/src/html.rs @@ -10,7 +10,7 @@ pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub(crate) use assets::Assets; mod context; -pub use context::{Context, ContextOp, ErrorParam}; +pub use context::{AssetsOp, Context, ErrorParam}; mod opt_id; pub use opt_id::OptionId; diff --git a/src/html/context.rs b/src/html/context.rs index 4374b14f..a8d634a6 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -1,11 +1,11 @@ use crate::core::theme::all::{theme_by_short_name, DEFAULT_THEME}; use crate::core::theme::ThemeRef; use crate::core::TypeInfo; -use crate::html::{html, Markup, Render}; +use crate::html::{html, Markup}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; -use crate::join; use crate::locale::{LanguageIdentifier, DEFAULT_LANGID}; use crate::service::HttpRequest; +use crate::{builder_fn, join}; use std::collections::HashMap; use std::error::Error; @@ -14,17 +14,7 @@ use std::str::FromStr; use std::fmt; /// Operaciones para modificar el contexto ([`Context`]) del documento. -pub enum ContextOp { - /// Modifica el identificador de idioma del documento. - LangId(&'static LanguageIdentifier), - /// Establece el tema que se usará para renderizar el documento. - /// - /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica - /// ninguno entonces usará el tema por defecto. - Theme(&'static str), - /// Define el tipo de composición usado para renderizar el documento. - Layout(&'static str), - +pub enum AssetsOp { // Favicon. /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. SetFavicon(Option<Favicon>), @@ -76,38 +66,35 @@ impl Error for ErrorParam {} /// ```rust /// use pagetop::prelude::*; /// -/// fn configure_context(mut cx: Context) { +/// fn configure_context(cx: &mut Context) { /// // Establece el idioma del documento a español. -/// cx.alter_assets(ContextOp::LangId( -/// LangMatch::langid_or_default("es-ES") -/// )) +/// cx.alter_langid(LangMatch::langid_or_default("es-ES")) /// // Selecciona un tema (por su nombre corto). -/// .alter_assets(ContextOp::Theme("aliner")) +/// .alter_theme("aliner") +/// // Añade un parámetro dinámico al contexto. +/// .alter_param("usuario_id", 42) /// // Asigna un favicon. -/// .alter_assets(ContextOp::SetFavicon(Some( +/// .alter_assets(AssetsOp::SetFavicon(Some( /// Favicon::new().with_icon("/icons/favicon.ico") /// ))) /// // Añade una hoja de estilo externa. -/// .alter_assets(ContextOp::AddStyleSheet( +/// .alter_assets(AssetsOp::AddStyleSheet( /// StyleSheet::from("/css/style.css") /// )) /// // Añade un script JavaScript. -/// .alter_assets(ContextOp::AddJavaScript( +/// .alter_assets(AssetsOp::AddJavaScript( /// JavaScript::defer("/js/main.js") /// )); /// -/// // Añade un parámetro dinámico al contexto. -/// cx.set_param("usuario_id", 42); -/// -/// // Recupera el parámetro y lo convierte a su tipo original. -/// let id: i32 = cx.get_param("usuario_id").unwrap(); -/// assert_eq!(id, 42); -/// /// // Recupera el tema seleccionado. /// let active_theme = cx.theme(); /// assert_eq!(active_theme.short_name(), "aliner"); /// -/// // Genera un identificador único para un componente de tipo `Menu`. +/// // Recupera el parámetro a su tipo original. +/// let id: i32 = cx.param("usuario_id").unwrap(); +/// assert_eq!(id, 42); +/// +/// // Genera un identificador para un componente de tipo `Menu`. /// struct Menu; /// let unique_id = cx.required_id::<Menu>(None); /// assert_eq!(unique_id, "menu-1"); // Si es el primero generado. @@ -119,10 +106,10 @@ pub struct Context { langid : &'static LanguageIdentifier, // Identificador del idioma. theme : ThemeRef, // Referencia al tema para renderizar. layout : &'static str, // Composición del documento para renderizar. + params : HashMap<String, String>, // Parámetros definidos en tiempo de ejecución. favicon : Option<Favicon>, // Favicon, si se ha definido. stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. javascripts: Assets<JavaScript>, // Scripts JavaScript. - params : HashMap<String, String>, // Parámetros definidos en tiempo de ejecución. id_counter : usize, // Contador para generar identificadores únicos. } @@ -137,60 +124,84 @@ impl Context { langid : &DEFAULT_LANGID, theme : *DEFAULT_THEME, layout : "default", + params : HashMap::<String, String>::new(), favicon : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), - params : HashMap::<String, String>::new(), id_counter : 0, } } - /// Modifica información o recursos del contexto usando [`ContextOp`]. - pub fn alter_assets(&mut self, op: ContextOp) -> &mut Self { + // Context BUILDER ***************************************************************************** + + /// Modifica el identificador de idioma del documento. + #[builder_fn] + pub fn with_langid(&mut self, langid: &'static LanguageIdentifier) -> &mut Self { + self.langid = langid; + self + } + + /// Establece el tema que se usará para renderizar el documento. + /// + /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica + /// ninguno entonces usará el tema por defecto. + #[builder_fn] + pub fn with_theme(&mut self, theme_name: impl AsRef<str>) -> &mut Self { + self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); + self + } + + /// Define el tipo de composición usado para renderizar el documento. + #[builder_fn] + pub fn with_layout(&mut self, layout_name: &'static str) -> &mut Self { + self.layout = layout_name; + self + } + + /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. + #[builder_fn] + pub fn with_param<T: ToString>(&mut self, key: impl AsRef<str>, value: T) -> &mut Self { + self.params + .insert(key.as_ref().to_string(), value.to_string()); + self + } + + /// Elimina un parámetro del contexto. Devuelve `true` si existía y se eliminó. + pub fn remove_param(&mut self, key: impl AsRef<str>) -> bool { + self.params.remove(key.as_ref()).is_some() + } + + /// Modifica información o recursos del contexto usando [`AssetsOp`]. + #[builder_fn] + pub fn with_assets(&mut self, op: AssetsOp) -> &mut Self { match op { - ContextOp::LangId(langid) => { - self.langid = langid; - } - ContextOp::Theme(theme_name) => { - self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); - } - ContextOp::Layout(layout) => { - self.layout = layout; - } // Favicon. - ContextOp::SetFavicon(favicon) => { + AssetsOp::SetFavicon(favicon) => { self.favicon = favicon; } - ContextOp::SetFaviconIfNone(icon) => { + AssetsOp::SetFaviconIfNone(icon) => { if self.favicon.is_none() { self.favicon = Some(icon); } } // Stylesheets. - ContextOp::AddStyleSheet(css) => { + AssetsOp::AddStyleSheet(css) => { self.stylesheets.add(css); } - ContextOp::RemoveStyleSheet(path) => { + AssetsOp::RemoveStyleSheet(path) => { self.stylesheets.remove(path); } // JavaScripts. - ContextOp::AddJavaScript(js) => { + AssetsOp::AddJavaScript(js) => { self.javascripts.add(js); } - ContextOp::RemoveJavaScript(path) => { + AssetsOp::RemoveJavaScript(path) => { self.javascripts.remove(path); } } self } - /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. - pub fn set_param<T: ToString>(&mut self, key: impl AsRef<str>, value: T) -> &mut Self { - self.params - .insert(key.as_ref().to_string(), value.to_string()); - self - } - // Context GETTERS ***************************************************************************** /// Devuelve la solicitud HTTP asociada al documento. @@ -218,20 +229,28 @@ impl Context { /// /// Devuelve un error si el parámetro no existe ([`ErrorParam::NotFound`]) o la conversión falla /// ([`ErrorParam::ParseError`]). - pub fn get_param<T: FromStr>(&self, key: impl AsRef<str>) -> Result<T, ErrorParam> { + pub fn param<T: FromStr>(&self, key: impl AsRef<str>) -> Result<T, ErrorParam> { self.params .get(key.as_ref()) .ok_or(ErrorParam::NotFound) .and_then(|v| T::from_str(v).map_err(|_| ErrorParam::ParseError(v.clone()))) } - // Context EXTRAS ****************************************************************************** + // Context RENDER ****************************************************************************** - /// Elimina un parámetro del contexto. Devuelve `true` si existía y se eliminó. - pub fn remove_param(&mut self, key: impl AsRef<str>) -> bool { - self.params.remove(key.as_ref()).is_some() + /// Renderiza los recursos del contexto. + pub fn render_assets(&self) -> Markup { + html! { + @if let Some(favicon) = &self.favicon { + (favicon) + } + (self.stylesheets) + (self.javascripts) + } } + // Context EXTRAS ****************************************************************************** + /// Genera un identificador único si no se proporciona uno explícito. /// /// Si no se proporciona un `id`, se genera un identificador único en la forma `<tipo>-<número>` @@ -256,15 +275,3 @@ impl Context { } } } - -impl Render for Context { - fn render(&self) -> Markup { - html! { - @if let Some(favicon) = &self.favicon { - (favicon) - } - (self.stylesheets) - (self.javascripts) - } - } -} From 05f523ee51e3e80b5b6cb451055bb9f8f68f0eaf Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Jul 2025 00:33:32 +0200 Subject: [PATCH 700/853] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Corrige=20las=20re?= =?UTF-8?q?ferencias=20"builder"=20a=20self/Self?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/context.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/html/context.rs b/src/html/context.rs index a8d634a6..0035b265 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -136,7 +136,7 @@ impl Context { /// Modifica el identificador de idioma del documento. #[builder_fn] - pub fn with_langid(&mut self, langid: &'static LanguageIdentifier) -> &mut Self { + pub fn with_langid(mut self, langid: &'static LanguageIdentifier) -> Self { self.langid = langid; self } @@ -146,21 +146,21 @@ impl Context { /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica /// ninguno entonces usará el tema por defecto. #[builder_fn] - pub fn with_theme(&mut self, theme_name: impl AsRef<str>) -> &mut Self { + pub fn with_theme(mut self, theme_name: impl AsRef<str>) -> Self { self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); self } /// Define el tipo de composición usado para renderizar el documento. #[builder_fn] - pub fn with_layout(&mut self, layout_name: &'static str) -> &mut Self { + pub fn with_layout(mut self, layout_name: &'static str) -> Self { self.layout = layout_name; self } /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. #[builder_fn] - pub fn with_param<T: ToString>(&mut self, key: impl AsRef<str>, value: T) -> &mut Self { + pub fn with_param<T: ToString>(mut self, key: impl AsRef<str>, value: T) -> Self { self.params .insert(key.as_ref().to_string(), value.to_string()); self @@ -173,7 +173,7 @@ impl Context { /// Modifica información o recursos del contexto usando [`AssetsOp`]. #[builder_fn] - pub fn with_assets(&mut self, op: AssetsOp) -> &mut Self { + pub fn with_assets(mut self, op: AssetsOp) -> Self { match op { // Favicon. AssetsOp::SetFavicon(favicon) => { From 00563fa268707237d09b3c6a73d11105a8d4e2cd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Jul 2025 01:19:16 +0200 Subject: [PATCH 701/853] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20validaci=C3=B3?= =?UTF-8?q?n=20"mut=20self"=20y=20retorno=20de=20Self?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 43 +++++++++++++++++-------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index ecca395d..d9533fe5 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -103,32 +103,16 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { }; return expanded.into(); } - // Valida que el método sea público. + // Valida que el método es público. if !matches!(fn_with.vis, syn::Visibility::Public(_)) { return quote_spanned! { fn_with.sig.ident.span() => compile_error!("expected method to be `pub`"); } .into(); } - // Valida que el método devuelva el tipo `Self`. - if let syn::ReturnType::Type(_, ty) = &fn_with.sig.output { - if let syn::Type::Path(type_path) = &**ty { - let ident = &type_path.path.segments.last().unwrap().ident; - if ident != "Self" { - return quote_spanned! { - fn_with.sig.output.span() => compile_error!("expected return type to be `Self`"); - }.into(); - } - } - } else { - return quote_spanned! { - fn_with.sig.output.span() => compile_error!("expected method to return `Self`"); - } - .into(); - } - // Valida que el primer argumento sea `mut self`. + // Valida que el primer argumento es exactamente `mut self`. if let Some(syn::FnArg::Receiver(receiver)) = fn_with.sig.inputs.first() { - if receiver.mutability.is_none() { + if receiver.mutability.is_none() || receiver.reference.is_some() { return quote_spanned! { receiver.span() => compile_error!("expected `mut self` as the first argument"); } @@ -140,6 +124,27 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { } .into(); } + // Valida que el método devuelve exactamente `Self`. + if let syn::ReturnType::Type(_, ty) = &fn_with.sig.output { + if let syn::Type::Path(type_path) = ty.as_ref() { + if type_path.qself.is_some() || !type_path.path.is_ident("Self") { + return quote_spanned! { ty.span() => + compile_error!("expected return type to be exactly `Self`"); + } + .into(); + } + } else { + return quote_spanned! { ty.span() => + compile_error!("expected return type to be exactly `Self`"); + } + .into(); + } + } else { + return quote_spanned! { + fn_with.sig.output.span() => compile_error!("expected method to return `Self`"); + } + .into(); + } // Genera el nombre del método alter_...(). let fn_alter_name_str = fn_with_name_str.replace("with_", "alter_"); From 94c3d4398ae92513419d6ea51b4e9d84d9853bd2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Jul 2025 13:51:49 +0200 Subject: [PATCH 702/853] =?UTF-8?q?=F0=9F=92=A1=20Simplifica=20documentaci?= =?UTF-8?q?=C3=B3n=20de=20m=C3=A9todos=20`alter=5F=E2=80=A6()`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index d9533fe5..301f4831 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -175,7 +175,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { // Genera el método alter_...() con el código del método with_...(). let fn_alter_doc = format!( - "Equivale a invocar el método `{}()` cuando se aplica el patrón builder.", + "Igual que [`{0}()`](Self::{0}), pero sin usar el patrón *builder*.", fn_with_name_str, ); let fn_alter = quote! { From b837346bf84befa430f5f266f0b1acb217f67b19 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Jul 2025 13:55:28 +0200 Subject: [PATCH 703/853] =?UTF-8?q?=F0=9F=92=A1=20Mejora=20los=20comentari?= =?UTF-8?q?os=20para=20normalizar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.rs | 2 +- src/core.rs | 4 ++-- src/core/component/children.rs | 14 ++++++++------ src/html/assets/favicon.rs | 2 +- src/html/assets/javascript.rs | 2 +- src/html/assets/stylesheet.rs | 4 ++-- src/lib.rs | 4 ++-- src/locale.rs | 10 +++++----- src/response/redirect.rs | 4 ++-- tests/util.rs | 2 +- 10 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/config.rs b/src/config.rs index ed37d550..5dc05a16 100644 --- a/src/config.rs +++ b/src/config.rs @@ -169,7 +169,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// ```rust,ignore /// include_config!(SETTINGS: Settings => [ /// "ruta.clave" => valor, -/// // … +/// // ... /// ]); /// ``` /// diff --git a/src/core.rs b/src/core.rs index 2168c932..0c8aa21f 100644 --- a/src/core.rs +++ b/src/core.rs @@ -55,10 +55,10 @@ impl TypeInfo { fn partial(type_name: &'static str, start: isize, end: Option<isize>) -> &'static str { let maxlen = type_name.len(); - // Localiza los límites de cada segmento a nivel 0 de `<…>`. + // Localiza los límites de cada segmento a nivel 0 de `<...>`. let mut segments = Vec::new(); let mut segment_start = 0; // Posición inicial del segmento actual. - let mut angle_brackets = 0; // Profundidad dentro de '<…>'. + let mut angle_brackets = 0; // Profundidad dentro de '<...>'. let mut previous_char = '\0'; // Se inicializa a carácter nulo, no hay aún carácter previo. for (idx, c) in type_name.char_indices() { diff --git a/src/core/component/children.rs b/src/core/component/children.rs index cba8c39f..cc3a8643 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -85,7 +85,7 @@ impl<C: ComponentTrait> Typed<C> { // ************************************************************************************************* -/// Operaciones con un componente [`Child`] en una lista [`Children`]. +/// Operaciones con un componente hijo [`Child`] en una lista [`Children`]. pub enum ChildOp { Add(Child), InsertAfterId(&'static str, Child), @@ -96,7 +96,7 @@ pub enum ChildOp { Reset, } -/// Operaciones con un componente tipado [`Typed<C>`] en una lista [`Children`]. +/// Operaciones con un componente hijo tipado [`Typed<C>`] en una lista [`Children`]. pub enum TypedOp<C: ComponentTrait> { Add(Typed<C>), InsertAfterId(&'static str, Typed<C>), @@ -107,9 +107,9 @@ pub enum TypedOp<C: ComponentTrait> { Reset, } -/// Lista ordenada de los componentes hijo ([`Child`]) asociados a un componente padre. +/// Lista ordenada de componentes hijo ([`Child`]) mantenida por un componente padre. /// -/// Esta colección permite añadir, modificar, renderizar y consultar componentes hijos en orden de +/// Esta lista permite añadir, modificar, renderizar y consultar componentes hijo en orden de /// inserción, soportando operaciones avanzadas como inserción relativa o reemplazo por /// identificador. #[derive(Clone, Default)] @@ -121,7 +121,7 @@ impl Children { Children::default() } - /// Crea una lista con un único hijo inicial. + /// Crea una lista con un componente hijo inicial. pub fn with(child: Child) -> Self { Children::default().with_child(ChildOp::Add(child)) } @@ -165,7 +165,9 @@ impl Children { } } - /// Añade un hijo al final de la lista. + /// Añade un componente hijo al final de la lista. + /// + /// Es un atajo para `children.alter_child(ChildOp::Add(child))`. #[inline] pub fn add(&mut self, child: Child) -> &mut Self { self.0.push(child); diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index 97a44e86..d02794eb 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -3,7 +3,7 @@ use crate::AutoDefault; /// Un **Favicon** es un recurso gráfico que usa el navegador como icono asociado al sitio. /// -/// Es universalmente aceptado para mostrar el icono del sitio (`.ico`, `.png`, `.svg`, …) en +/// Es universalmente aceptado para mostrar el icono del sitio (`.ico`, `.png`, `.svg`, ...) en /// pestañas, marcadores o accesos directos. /// /// Este tipo permite construir de forma fluida las distintas variantes de un *favicon*, ya sea un diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index fb0a1b64..882b3aff 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -97,7 +97,7 @@ impl JavaScript { /// Crea un **script embebido** directamente en el documento HTML. /// - /// Equivale a `<script>…</script>`. El parámetro `name` se usa como identificador interno del + /// Equivale a `<script>...</script>`. El parámetro `name` se usa como identificador interno del /// *script*. pub fn inline(name: impl Into<String>, script: impl Into<String>) -> Self { JavaScript { diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 7f64d187..dca5d869 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -82,7 +82,7 @@ impl TargetMedia { pub struct StyleSheet { source : Source, // Fuente y modo de inclusión del CSS. version: String, // Versión del recurso para la caché del navegador. - media : TargetMedia, // Medio objetivo para los estilos (`print`, `screen`, …). + media : TargetMedia, // Medio objetivo para los estilos (`print`, `screen`, ...). weight : Weight, // Peso que determina el orden. } @@ -99,7 +99,7 @@ impl StyleSheet { /// Crea una hoja de estilos embebida directamente en el documento HTML. /// - /// Equivale a `<style>…</style>`. El parámetro `name` se usa como identificador interno del + /// Equivale a `<style>...</style>`. El parámetro `name` se usa como identificador interno del /// recurso. pub fn inline(name: impl Into<String>, styles: impl Into<String>) -> Self { StyleSheet { diff --git a/src/lib.rs b/src/lib.rs index e2d39754..63ca6a55 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -33,8 +33,8 @@ html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" )] -// Alias para que las rutas absolutas `::pagetop::…` generadas por las macros funcionen en el propio -// *crate*, en *crates* externos y en *doctests*. +// Alias para que las rutas absolutas `::pagetop::...` generadas por las macros funcionen en el +// propio *crate*, en *crates* externos y en *doctests*. extern crate self as pagetop; use std::collections::HashMap; diff --git a/src/locale.rs b/src/locale.rs index 9af83f58..298b3508 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -119,13 +119,13 @@ static LANGUAGES: LazyLock<HashMap<&str, (LanguageIdentifier, &str)>> = LazyLock ] }); -// Identificador del idioma de **respaldo** (predefinido a `en-US`). +// Identificador de idioma de **respaldo** (predefinido a `en-US`). // // Se usa cuando el valor del identificador de idioma en las traducciones no corresponde con ningún // idioma soportado por la aplicación. static FALLBACK_LANGID: LazyLock<LanguageIdentifier> = LazyLock::new(|| langid!("en-US")); -// Identificador del idioma **por defecto** para la aplicación. +// Identificador de idioma **por defecto** para la aplicación. // // Se resuelve a partir de [`global::SETTINGS.app.language`](global::SETTINGS). Si el identificador // de idioma no es válido o no está disponible entonces resuelve como [`FALLBACK_LANGID`]. @@ -177,13 +177,13 @@ pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = /// ``` #[derive(Clone, Debug, Eq, PartialEq)] pub enum LangMatch { - /// Cuando el identificador del idioma es una cadena vacía. + /// Cuando el identificador de idioma es una cadena vacía. Unspecified, /// Si encuentra un [`LanguageIdentifier`] en la lista de idiomas soportados por `PageTop` que - /// coincide exactamente con el identificador del idioma (p.ej. "es-ES"), o con el identificador + /// coincide exactamente con el identificador de idioma (p.ej. "es-ES"), o con el identificador /// del idioma base (p.ej. "es"). Found(&'static LanguageIdentifier), - /// Si el identificador del idioma no está entre los soportados por `PageTop`. + /// Si el identificador de idioma no está entre los soportados por `PageTop`. Unsupported(String), } diff --git a/src/response/redirect.rs b/src/response/redirect.rs index bb3020da..a3bec0cd 100644 --- a/src/response/redirect.rs +++ b/src/response/redirect.rs @@ -43,7 +43,7 @@ impl Redirect { /// Redirección **permanente**. Código de estado **308**. Mantiene método y cuerpo sin cambios. /// /// Indicada para reorganizaciones de un sitio o aplicación web en las que también existen - /// métodos distintos de GET (POST, PUT, …) que no deben degradarse a GET. + /// métodos distintos de GET (POST, PUT, ...) que no deben degradarse a GET. #[must_use] pub fn permanent(redirect_to_url: &str) -> HttpResponse { HttpResponse::PermanentRedirect() @@ -55,7 +55,7 @@ impl Redirect { /// mantiene tal cual. Otros métodos pueden degradarse a GET. /// /// Útil cuando un recurso está fuera de servicio de forma imprevista (mantenimiento breve, - /// sobrecarga, …). + /// sobrecarga, ...). #[must_use] pub fn found(redirect_to_url: &str) -> HttpResponse { HttpResponse::Found() diff --git a/tests/util.rs b/tests/util.rs index 2d52064e..6e0896ff 100644 --- a/tests/util.rs +++ b/tests/util.rs @@ -44,7 +44,7 @@ mod windows { async fn ok_absolute_dir() -> io::Result<()> { let _app = service::test::init_service(Application::new().test()).await; - // C:\Users\…\Temp\… + // C:\Users\...\Temp\... let td = TempDir::new()?; let root = td.path(); let sub = root.join("sub"); From 5d58d2d934373a878780e1c2ad9688dee5b0b4b1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Jul 2025 21:24:49 +0200 Subject: [PATCH 704/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20para?= =?UTF-8?q?=20responder=20p=C3=A1ginas=20HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Amplia la estructura "Page" para trabajar el renderizado con regiones de componentes para componer la página. - Añade acciones "BeforeRenderBody" y "AfterRenderBody" para alterar el contenido de la página antes y después del renderizado. - Actualiza "Context" para admitir parámetros dinámicos y mejorar la gestión de temas. - Implementa el manejo de errores HTTP respondiendo páginas. - Mejora la documentación y reorganiza el código en varios módulos. --- src/base/action.rs | 2 + .../component/after_render_component.rs | 2 +- .../component/before_render_component.rs | 2 +- src/base/action/component/is_renderable.rs | 2 +- src/base/action/page.rs | 17 ++ src/base/action/page/after_render_body.rs | 46 ++++ src/base/action/page/before_render_body.rs | 46 ++++ src/core/component/children.rs | 96 +++---- src/core/theme.rs | 3 + src/core/theme/all.rs | 4 +- src/core/theme/definition.rs | 66 ++++- src/core/theme/regions.rs | 47 ++-- src/html/context.rs | 138 +++++----- src/prelude.rs | 2 +- src/response.rs | 2 + src/response/page.rs | 249 ++++++++++++++++++ src/response/page/error.rs | 88 +++++++ 17 files changed, 669 insertions(+), 143 deletions(-) create mode 100644 src/base/action/page.rs create mode 100644 src/base/action/page/after_render_body.rs create mode 100644 src/base/action/page/before_render_body.rs create mode 100644 src/response/page.rs create mode 100644 src/response/page/error.rs diff --git a/src/base/action.rs b/src/base/action.rs index 119a7eaa..be35e922 100644 --- a/src/base/action.rs +++ b/src/base/action.rs @@ -13,3 +13,5 @@ pub type FnActionWithComponent<C> = fn(component: &mut C, cx: &mut Context); pub mod component; pub mod theme; + +pub mod page; diff --git a/src/base/action/component/after_render_component.rs b/src/base/action/component/after_render_component.rs index 3c8ead9a..48873f76 100644 --- a/src/base/action/component/after_render_component.rs +++ b/src/base/action/component/after_render_component.rs @@ -22,7 +22,7 @@ impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> { self.referer_id.get() } - /// Devuelve el peso para definir el orden de aplicación. + /// Devuelve el peso para definir el orden de ejecución. fn weight(&self) -> Weight { self.weight } diff --git a/src/base/action/component/before_render_component.rs b/src/base/action/component/before_render_component.rs index 0ebe4092..483b9160 100644 --- a/src/base/action/component/before_render_component.rs +++ b/src/base/action/component/before_render_component.rs @@ -22,7 +22,7 @@ impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> { self.referer_id.get() } - /// Devuelve el peso para definir el orden de aplicación. + /// Devuelve el peso para definir el orden de ejecución. fn weight(&self) -> Weight { self.weight } diff --git a/src/base/action/component/is_renderable.rs b/src/base/action/component/is_renderable.rs index 7ba7d53c..3f0f1638 100644 --- a/src/base/action/component/is_renderable.rs +++ b/src/base/action/component/is_renderable.rs @@ -27,7 +27,7 @@ impl<C: ComponentTrait> ActionDispatcher for IsRenderable<C> { self.referer_id.get() } - /// Devuelve el peso para definir el orden de aplicación. + /// Devuelve el peso para definir el orden de ejecución. fn weight(&self) -> Weight { self.weight } diff --git a/src/base/action/page.rs b/src/base/action/page.rs new file mode 100644 index 00000000..b6dbe9ab --- /dev/null +++ b/src/base/action/page.rs @@ -0,0 +1,17 @@ +//! Acciones para alterar el contenido de las páginas a renderizar. + +use crate::response::page::Page; + +/// Tipo de función para manipular una página durante su construcción o renderizado. +/// +/// Se emplea en acciones orientadas a modificar o inspeccionar una instancia de [`Page`] +/// directamente, sin acceder a los componentes individuales ni al contexto de renderizado. +/// +/// Recibe una referencia mutable (`&mut`) a la página en cuestión. +pub type FnActionWithPage = fn(page: &mut Page); + +mod before_render_body; +pub use before_render_body::*; + +mod after_render_body; +pub use after_render_body::*; diff --git a/src/base/action/page/after_render_body.rs b/src/base/action/page/after_render_body.rs new file mode 100644 index 00000000..081b9aa4 --- /dev/null +++ b/src/base/action/page/after_render_body.rs @@ -0,0 +1,46 @@ +use crate::prelude::*; + +use crate::base::action::page::FnActionWithPage; + +/// Ejecuta [`FnActionWithPage`](crate::base::action::page::FnActionWithPage) después de renderizar +/// el cuerpo de la página. +/// +/// Este tipo de acción se despacha después de renderizar el contenido principal de la página +/// (`<body>`), permitiendo ajustes finales sobre la instancia [`Page`]. +/// +/// Las acciones se ejecutan en orden según el [`Weight`] asignado. +pub struct AfterRenderBody { + f: FnActionWithPage, + weight: Weight, +} + +impl ActionDispatcher for AfterRenderBody { + /// Devuelve el peso para definir el orden de ejecución. + fn weight(&self) -> Weight { + self.weight + } +} + +impl AfterRenderBody { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción + /// [`FnActionWithPage`](crate::base::action::page::FnActionWithPage). + pub fn new(f: FnActionWithPage) -> Self { + AfterRenderBody { f, weight: 0 } + } + + /// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos. + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + // Despacha las acciones. + #[inline(always)] + #[allow(clippy::inline_always)] + pub(crate) fn dispatch(page: &mut Page) { + dispatch_actions( + &ActionKey::new(UniqueId::of::<Self>(), None, None, None), + |action: &Self| (action.f)(page), + ); + } +} diff --git a/src/base/action/page/before_render_body.rs b/src/base/action/page/before_render_body.rs new file mode 100644 index 00000000..a6e5c565 --- /dev/null +++ b/src/base/action/page/before_render_body.rs @@ -0,0 +1,46 @@ +use crate::prelude::*; + +use crate::base::action::page::FnActionWithPage; + +/// Ejecuta [`FnActionWithPage`](crate::base::action::page::FnActionWithPage) antes de renderizar +/// el cuerpo de la página. +/// +/// Este tipo de acción se despacha antes de renderizar el contenido principal de la página +/// (`<body>`), permitiendo ajustes sobre la instancia [`Page`]. +/// +/// Las acciones se ejecutan en orden según el [`Weight`] asignado. +pub struct BeforeRenderBody { + f: FnActionWithPage, + weight: Weight, +} + +impl ActionDispatcher for BeforeRenderBody { + /// Devuelve el peso para definir el orden de ejecución. + fn weight(&self) -> Weight { + self.weight + } +} + +impl BeforeRenderBody { + /// Permite [registrar](ExtensionTrait::actions) una nueva acción + /// [`FnActionWithPage`](crate::base::action::page::FnActionWithPage). + pub fn new(f: FnActionWithPage) -> Self { + BeforeRenderBody { f, weight: 0 } + } + + /// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos. + pub fn with_weight(mut self, value: Weight) -> Self { + self.weight = value; + self + } + + // Despacha las acciones. + #[inline(always)] + #[allow(clippy::inline_always)] + pub(crate) fn dispatch(page: &mut Page) { + dispatch_actions( + &ActionKey::new(UniqueId::of::<Self>(), None, None, None), + |action: &Self| (action.f)(page), + ); + } +} diff --git a/src/core/component/children.rs b/src/core/component/children.rs index cc3a8643..c5b65a26 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -77,8 +77,8 @@ impl<C: ComponentTrait> Typed<C> { // Typed HELPERS ******************************************************************************* - /// Convierte el componente tipado en un [`Child`]. - fn to_child(&self) -> Child { + // Convierte el componente tipado en un [`Child`]. + fn into_child(self) -> Child { Child(self.0.clone()) } } @@ -155,12 +155,12 @@ impl Children { #[builder_fn] pub fn with_typed<C: ComponentTrait + Default>(mut self, op: TypedOp<C>) -> Self { match op { - TypedOp::Add(typed) => self.add(typed.to_child()), - TypedOp::InsertAfterId(id, typed) => self.insert_after_id(id, typed.to_child()), - TypedOp::InsertBeforeId(id, typed) => self.insert_before_id(id, typed.to_child()), - TypedOp::Prepend(typed) => self.prepend(typed.to_child()), + TypedOp::Add(typed) => self.add(typed.into_child()), + TypedOp::InsertAfterId(id, typed) => self.insert_after_id(id, typed.into_child()), + TypedOp::InsertBeforeId(id, typed) => self.insert_before_id(id, typed.into_child()), + TypedOp::Prepend(typed) => self.prepend(typed.into_child()), TypedOp::RemoveById(id) => self.remove_by_id(id), - TypedOp::ReplaceById(id, typed) => self.replace_by_id(id, typed.to_child()), + TypedOp::ReplaceById(id, typed) => self.replace_by_id(id, typed.into_child()), TypedOp::Reset => self.reset(), } } @@ -174,6 +174,48 @@ impl Children { self } + // Children GETTERS **************************************************************************** + + /// Devuelve el número de componentes hijo de la lista. + pub fn len(&self) -> usize { + self.0.len() + } + + /// Indica si la lista está vacía. + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Devuelve el primer componente hijo con el identificador indicado, si existe. + pub fn get_by_id(&self, id: impl AsRef<str>) -> Option<&Child> { + let id = Some(id.as_ref()); + self.0.iter().find(|c| c.id().as_deref() == id) + } + + /// Devuelve un iterador sobre los componentes hijo con el identificador indicado. + pub fn iter_by_id<'a>(&'a self, id: &'a str) -> impl Iterator<Item = &'a Child> + 'a { + self.0.iter().filter(move |c| c.id().as_deref() == Some(id)) + } + + /// Devuelve un iterador sobre los componentes hijo con el identificador de tipo ([`UniqueId`]) + /// indicado. + pub fn iter_by_type_id(&self, type_id: UniqueId) -> impl Iterator<Item = &Child> { + self.0.iter().filter(move |&c| c.type_id() == type_id) + } + + // Children RENDER ***************************************************************************** + + /// Renderiza todos los componentes hijo, en orden. + pub fn render(&self, cx: &mut Context) -> Markup { + html! { + @for c in &self.0 { + (c.render(cx)) + } + } + } + + // Children HELPERS **************************************************************************** + // Inserta un hijo después del componente con el `id` dado, o al final si no se encuentra. #[inline] fn insert_after_id(&mut self, id: impl AsRef<str>, child: Child) -> &mut Self { @@ -232,46 +274,6 @@ impl Children { self.0.clear(); self } - - // Children GETTERS **************************************************************************** - - /// Devuelve el número de componentes hijo de la lista. - pub fn len(&self) -> usize { - self.0.len() - } - - /// Indica si la lista está vacía. - pub fn is_empty(&self) -> bool { - self.0.is_empty() - } - - /// Devuelve el primer componente hijo con el identificador indicado, si existe. - pub fn get_by_id(&self, id: impl AsRef<str>) -> Option<&Child> { - let id = Some(id.as_ref()); - self.0.iter().find(|c| c.id().as_deref() == id) - } - - /// Devuelve un iterador sobre los componentes hijo con el identificador indicado. - pub fn iter_by_id<'a>(&'a self, id: &'a str) -> impl Iterator<Item = &'a Child> + 'a { - self.0.iter().filter(move |c| c.id().as_deref() == Some(id)) - } - - /// Devuelve un iterador sobre los componentes hijo con el identificador tipo ([`UniqueId`]) - /// indicado. - pub fn iter_by_type_id(&self, type_id: UniqueId) -> impl Iterator<Item = &Child> { - self.0.iter().filter(move |&c| c.type_id() == type_id) - } - - // Children RENDER ***************************************************************************** - - /// Renderiza todos los componentes hijo, en orden. - pub fn render(&self, cx: &mut Context) -> Markup { - html! { - @for c in &self.0 { - (c.render(cx)) - } - } - } } impl IntoIterator for Children { diff --git a/src/core/theme.rs b/src/core/theme.rs index d67a4457..35d9887d 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -22,3 +22,6 @@ pub(crate) use regions::ChildrenInRegions; pub use regions::InRegion; pub(crate) mod all; + +/// Nombre de la región por defecto: `content`. +pub const CONTENT_REGION_NAME: &str = "content"; diff --git a/src/core/theme/all.rs b/src/core/theme/all.rs index 1b982680..787e0c9d 100644 --- a/src/core/theme/all.rs +++ b/src/core/theme/all.rs @@ -20,8 +20,8 @@ pub static DEFAULT_THEME: LazyLock<ThemeRef> = // TEMA POR NOMBRE ********************************************************************************* /// Devuelve el tema identificado por su [`short_name`](AnyInfo::short_name). -pub fn theme_by_short_name(short_name: impl AsRef<str>) -> Option<ThemeRef> { - let short_name = short_name.as_ref().to_lowercase(); +pub fn theme_by_short_name(short_name: &'static str) -> Option<ThemeRef> { + let short_name = short_name.to_lowercase(); match THEMES .read() .iter() diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 6f1e54a1..075ce204 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,5 +1,9 @@ use crate::core::extension::ExtensionTrait; +use crate::core::theme::CONTENT_REGION_NAME; +use crate::global; +use crate::html::{html, Markup}; use crate::locale::L10n; +use crate::response::page::Page; /// Representa una referencia a un tema. /// @@ -30,6 +34,66 @@ pub type ThemeRef = &'static dyn ThemeTrait; /// ``` pub trait ThemeTrait: ExtensionTrait + Send + Sync { fn regions(&self) -> Vec<(&'static str, L10n)> { - vec![("content", L10n::l("content"))] + vec![(CONTENT_REGION_NAME, L10n::l("content"))] + } + + #[allow(unused_variables)] + fn before_render_page_body(&self, page: &mut Page) {} + + fn render_page_body(&self, page: &mut Page) -> Markup { + html! { + body id=[page.body_id().get()] class=[page.body_classes().get()] { + @for (region_name, _) in self.regions() { + @let output = page.render_region(region_name); + @if !output.is_empty() { + div id=(region_name) class={ "region-container region-" (region_name) } { + (output) + } + } + } + } + } + } + + #[allow(unused_variables)] + fn after_render_page_body(&self, page: &mut Page) {} + + fn render_page_head(&self, page: &mut Page) -> Markup { + let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; + html! { + head { + meta charset="utf-8"; + + @if let Some(title) = page.title() { + title { (global::SETTINGS.app.name) (" | ") (title) } + } @else { + title { (global::SETTINGS.app.name) } + } + + @if let Some(description) = page.description() { + meta name="description" content=(description); + } + + meta name="viewport" content=(viewport); + @for (name, content) in page.metadata() { + meta name=(name) content=(content) {} + } + + meta http-equiv="X-UA-Compatible" content="IE=edge"; + @for (property, content) in page.properties() { + meta property=(property) content=(content) {} + } + + (page.render_assets()) + } + } + } + + fn error403(&self, _page: &mut Page) -> Markup { + html! { div { h1 { ("FORBIDDEN ACCESS") } } } + } + + fn error404(&self, _page: &mut Page) -> Markup { + html! { div { h1 { ("RESOURCE NOT FOUND") } } } } } diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 5beee25a..5e0186ad 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -1,5 +1,5 @@ use crate::core::component::{Child, ChildOp, Children}; -use crate::core::theme::ThemeRef; +use crate::core::theme::{ThemeRef, CONTENT_REGION_NAME}; use crate::{builder_fn, AutoDefault, UniqueId}; use parking_lot::RwLock; @@ -7,45 +7,43 @@ use parking_lot::RwLock; use std::collections::HashMap; use std::sync::LazyLock; +// Regiones globales con componentes para un tema dado. static THEME_REGIONS: LazyLock<RwLock<HashMap<UniqueId, ChildrenInRegions>>> = LazyLock::new(|| RwLock::new(HashMap::new())); +// Regiones globales con componentes para cualquier tema. static COMMON_REGIONS: LazyLock<RwLock<ChildrenInRegions>> = LazyLock::new(|| RwLock::new(ChildrenInRegions::default())); -// Estructura interna para mantener los componentes de cada región dada. +// Estructura interna para mantener los componentes de una región. #[derive(AutoDefault)] pub struct ChildrenInRegions(HashMap<&'static str, Children>); impl ChildrenInRegions { - pub fn new() -> Self { - ChildrenInRegions::default() - } - - pub fn with(region_id: &'static str, child: Child) -> Self { - ChildrenInRegions::default().with_in_region(region_id, ChildOp::Add(child)) + pub fn with(region_name: &'static str, child: Child) -> Self { + ChildrenInRegions::default().with_child_in_region(region_name, ChildOp::Add(child)) } #[builder_fn] - pub fn with_in_region(mut self, region_id: &'static str, op: ChildOp) -> Self { - if let Some(region) = self.0.get_mut(region_id) { + pub fn with_child_in_region(mut self, region_name: &'static str, op: ChildOp) -> Self { + if let Some(region) = self.0.get_mut(region_name) { region.alter_child(op); } else { - self.0.insert(region_id, Children::new().with_child(op)); + self.0.insert(region_name, Children::new().with_child(op)); } self } - pub fn all_in_region(&self, theme: ThemeRef, region_id: &str) -> Children { + pub fn merge_all_components(&self, theme_ref: ThemeRef, region_name: &'static str) -> Children { let common = COMMON_REGIONS.read(); - if let Some(r) = THEME_REGIONS.read().get(&theme.type_id()) { + if let Some(r) = THEME_REGIONS.read().get(&theme_ref.type_id()) { Children::merge(&[ - common.0.get(region_id), - self.0.get(region_id), - r.0.get(region_id), + common.0.get(region_name), + self.0.get(region_name), + r.0.get(region_name), ]) } else { - Children::merge(&[common.0.get(region_id), self.0.get(region_id)]) + Children::merge(&[common.0.get(region_name), self.0.get(region_name)]) } } } @@ -90,19 +88,22 @@ impl InRegion { InRegion::Content => { COMMON_REGIONS .write() - .alter_in_region("region-content", ChildOp::Add(child)); + .alter_child_in_region(CONTENT_REGION_NAME, ChildOp::Add(child)); } InRegion::Named(name) => { COMMON_REGIONS .write() - .alter_in_region(name, ChildOp::Add(child)); + .alter_child_in_region(name, ChildOp::Add(child)); } - InRegion::OfTheme(region, theme) => { + InRegion::OfTheme(region_name, theme_ref) => { let mut regions = THEME_REGIONS.write(); - if let Some(r) = regions.get_mut(&theme.type_id()) { - r.alter_in_region(region, ChildOp::Add(child)); + if let Some(r) = regions.get_mut(&theme_ref.type_id()) { + r.alter_child_in_region(region_name, ChildOp::Add(child)); } else { - regions.insert(theme.type_id(), ChildrenInRegions::with(region, child)); + regions.insert( + theme_ref.type_id(), + ChildrenInRegions::with(region_name, child), + ); } } } diff --git a/src/html/context.rs b/src/html/context.rs index 0035b265..a1df9879 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -61,37 +61,42 @@ impl Error for ErrorParam {} /// hojas de estilo ([`StyleSheet`]) y *scripts* ([`JavaScript`]), así como parámetros de contexto /// definidos en tiempo de ejecución. /// -/// # Ejemplo +/// # Ejemplos +/// +/// Crea un nuevo contexto asociado a una solicitud HTTP: /// /// ```rust /// use pagetop::prelude::*; /// -/// fn configure_context(cx: &mut Context) { -/// // Establece el idioma del documento a español. -/// cx.alter_langid(LangMatch::langid_or_default("es-ES")) -/// // Selecciona un tema (por su nombre corto). -/// .alter_theme("aliner") -/// // Añade un parámetro dinámico al contexto. -/// .alter_param("usuario_id", 42) -/// // Asigna un favicon. -/// .alter_assets(AssetsOp::SetFavicon(Some( -/// Favicon::new().with_icon("/icons/favicon.ico") -/// ))) -/// // Añade una hoja de estilo externa. -/// .alter_assets(AssetsOp::AddStyleSheet( -/// StyleSheet::from("/css/style.css") -/// )) -/// // Añade un script JavaScript. -/// .alter_assets(AssetsOp::AddJavaScript( -/// JavaScript::defer("/js/main.js") -/// )); +/// fn new_context(request: HttpRequest) -> Context { +/// Context::new(request) +/// // Establece el idioma del documento a español. +/// .with_langid(LangMatch::langid_or_default("es-ES")) +/// // Selecciona un tema (por su nombre corto). +/// .with_theme("aliner") +/// // Asigna un favicon. +/// .with_assets(AssetsOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) +/// // Añade una hoja de estilo externa. +/// .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/style.css"))) +/// // Añade un script JavaScript. +/// .with_assets(AssetsOp::AddJavaScript(JavaScript::defer("/js/main.js"))) +/// // Añade un parámetro dinámico al contexto. +/// .with_param("usuario_id", 42) +/// } +/// ``` /// +/// Y hace operaciones con un contexto dado: +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// fn use_context(cx: &mut Context) { /// // Recupera el tema seleccionado. /// let active_theme = cx.theme(); /// assert_eq!(active_theme.short_name(), "aliner"); /// /// // Recupera el parámetro a su tipo original. -/// let id: i32 = cx.param("usuario_id").unwrap(); +/// let id: i32 = cx.get_param("usuario_id").unwrap(); /// assert_eq!(id, 42); /// /// // Genera un identificador para un componente de tipo `Menu`. @@ -102,32 +107,33 @@ impl Error for ErrorParam {} /// ``` #[rustfmt::skip] pub struct Context { - request : HttpRequest, // Solicitud HTTP de origen. - langid : &'static LanguageIdentifier, // Identificador del idioma. - theme : ThemeRef, // Referencia al tema para renderizar. - layout : &'static str, // Composición del documento para renderizar. - params : HashMap<String, String>, // Parámetros definidos en tiempo de ejecución. - favicon : Option<Favicon>, // Favicon, si se ha definido. - stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. - javascripts: Assets<JavaScript>, // Scripts JavaScript. - id_counter : usize, // Contador para generar identificadores únicos. + request : HttpRequest, // Solicitud HTTP de origen. + langid : &'static LanguageIdentifier, // Identificador de idioma. + theme : ThemeRef, // Referencia al tema para renderizar. + layout : &'static str, // Composición del documento para renderizar. + favicon : Option<Favicon>, // Favicon, si se ha definido. + stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. + javascripts: Assets<JavaScript>, // Scripts JavaScript. + params : HashMap<&'static str, String>, // Parámetros definidos en tiempo de ejecución. + id_counter : usize, // Contador para generar identificadores únicos. } impl Context { - // Crea un nuevo contexto asociado a una solicitud HTTP. - // - // El contexto inicializa el idioma por defecto, sin favicon ni recursos cargados. + /// Crea un nuevo contexto asociado a una solicitud HTTP. + /// + /// El contexto inicializa el idioma, tema y composición por defecto, sin favicon ni recursos + /// cargados. #[rustfmt::skip] - pub(crate) fn new(request: HttpRequest) -> Self { + pub fn new(request: HttpRequest) -> Self { Context { request, langid : &DEFAULT_LANGID, theme : *DEFAULT_THEME, layout : "default", - params : HashMap::<String, String>::new(), favicon : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), + params : HashMap::<&str, String>::new(), id_counter : 0, } } @@ -141,37 +147,24 @@ impl Context { self } - /// Establece el tema que se usará para renderizar el documento. + /// Modifica el tema que se usará para renderizar el documento. /// /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica /// ninguno entonces usará el tema por defecto. #[builder_fn] - pub fn with_theme(mut self, theme_name: impl AsRef<str>) -> Self { + pub fn with_theme(mut self, theme_name: &'static str) -> Self { self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); self } - /// Define el tipo de composición usado para renderizar el documento. + /// Modifica la composición para renderizar el documento. #[builder_fn] pub fn with_layout(mut self, layout_name: &'static str) -> Self { self.layout = layout_name; self } - /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. - #[builder_fn] - pub fn with_param<T: ToString>(mut self, key: impl AsRef<str>, value: T) -> Self { - self.params - .insert(key.as_ref().to_string(), value.to_string()); - self - } - - /// Elimina un parámetro del contexto. Devuelve `true` si existía y se eliminó. - pub fn remove_param(&mut self, key: impl AsRef<str>) -> bool { - self.params.remove(key.as_ref()).is_some() - } - - /// Modifica información o recursos del contexto usando [`AssetsOp`]. + /// Define los recursos del contexto usando [`AssetsOp`]. #[builder_fn] pub fn with_assets(mut self, op: AssetsOp) -> Self { match op { @@ -209,7 +202,7 @@ impl Context { &self.request } - /// Devuelve el identificador del idioma asociado al documento. + /// Devuelve el identificador de idioma asociado al documento. pub fn langid(&self) -> &LanguageIdentifier { self.langid } @@ -219,23 +212,11 @@ impl Context { self.theme } - /// Devuelve el tipo de composición usado para renderizar el documento. El valor predeterminado - /// es `"default"`. + /// Devuelve la composición para renderizar el documento. Por defecto es `"default"`. pub fn layout(&self) -> &str { self.layout } - /// Recupera un parámetro del contexto convertido al tipo especificado. - /// - /// Devuelve un error si el parámetro no existe ([`ErrorParam::NotFound`]) o la conversión falla - /// ([`ErrorParam::ParseError`]). - pub fn param<T: FromStr>(&self, key: impl AsRef<str>) -> Result<T, ErrorParam> { - self.params - .get(key.as_ref()) - .ok_or(ErrorParam::NotFound) - .and_then(|v| T::from_str(v).map_err(|_| ErrorParam::ParseError(v.clone()))) - } - // Context RENDER ****************************************************************************** /// Renderiza los recursos del contexto. @@ -249,6 +230,31 @@ impl Context { } } + // Context PARAMS ****************************************************************************** + + /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. + #[builder_fn] + pub fn with_param<T: ToString>(mut self, key: &'static str, value: T) -> Self { + self.params.insert(key, value.to_string()); + self + } + + /// Recupera un parámetro del contexto convertido al tipo especificado. + /// + /// Devuelve un error si el parámetro no existe ([`ErrorParam::NotFound`]) o la conversión falla + /// ([`ErrorParam::ParseError`]). + pub fn get_param<T: FromStr>(&self, key: &'static str) -> Result<T, ErrorParam> { + self.params + .get(key) + .ok_or(ErrorParam::NotFound) + .and_then(|v| T::from_str(v).map_err(|_| ErrorParam::ParseError(v.clone()))) + } + + /// Elimina un parámetro del contexto. Devuelve `true` si existía y se eliminó. + pub fn remove_param(&mut self, key: &'static str) -> bool { + self.params.remove(key).is_some() + } + // Context EXTRAS ****************************************************************************** /// Genera un identificador único si no se proporciona uno explícito. diff --git a/src/prelude.rs b/src/prelude.rs index 9334f189..af2f5110 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -43,7 +43,7 @@ pub use crate::core::component::*; pub use crate::core::extension::*; pub use crate::core::theme::*; -pub use crate::response::{json::*, redirect::*, ResponseError}; +pub use crate::response::{json::*, page::*, redirect::*, ResponseError}; pub use crate::base::action; pub use crate::base::component::*; diff --git a/src/response.rs b/src/response.rs index 1fce663f..4078d420 100644 --- a/src/response.rs +++ b/src/response.rs @@ -2,6 +2,8 @@ pub use actix_web::ResponseError; +pub mod page; + pub mod json; pub mod redirect; diff --git a/src/response/page.rs b/src/response/page.rs new file mode 100644 index 00000000..b2528487 --- /dev/null +++ b/src/response/page.rs @@ -0,0 +1,249 @@ +mod error; +pub use error::ErrorPage; + +pub use actix_web::Result as ResultPage; + +use crate::base::action; +use crate::builder_fn; +use crate::core::component::{Child, ChildOp, ComponentTrait}; +use crate::core::theme::{ChildrenInRegions, ThemeRef, CONTENT_REGION_NAME}; +use crate::html::{html, AssetsOp, Context, Markup, DOCTYPE}; +use crate::html::{ClassesOp, OptionClasses, OptionId, OptionTranslated}; +use crate::locale::{CharacterDirection, L10n, LanguageIdentifier}; +use crate::service::HttpRequest; + +/// Representa una página HTML completa lista para renderizar. +/// +/// Una instancia de `Page` se compone dinámicamente permitiendo establecer título, descripción, +/// regiones donde disponer los componentes, atributos de `<body>` y otros aspectos del contexto de +/// renderizado. +#[rustfmt::skip] +pub struct Page { + title : OptionTranslated, + description : OptionTranslated, + metadata : Vec<(&'static str, &'static str)>, + properties : Vec<(&'static str, &'static str)>, + context : Context, + body_id : OptionId, + body_classes: OptionClasses, + regions : ChildrenInRegions, +} + +impl Page { + /// Crea una nueva instancia de página con contexto basado en la petición HTTP. + #[rustfmt::skip] + pub fn new(request: HttpRequest) -> Self { + Page { + title : OptionTranslated::default(), + description : OptionTranslated::default(), + metadata : Vec::default(), + properties : Vec::default(), + context : Context::new(request), + body_id : OptionId::default(), + body_classes: OptionClasses::default(), + regions : ChildrenInRegions::default(), + } + } + + // Page BUILDER ******************************************************************************** + + /// Establece el título de la página como un valor traducible. + #[builder_fn] + pub fn with_title(mut self, title: L10n) -> Self { + self.title.alter_value(title); + self + } + + /// Establece la descripción de la página como un valor traducible. + #[builder_fn] + pub fn with_description(mut self, description: L10n) -> Self { + self.description.alter_value(description); + self + } + + /// Añade una entrada `<meta name="..." content="...">` al `<head>`. + #[builder_fn] + pub fn with_metadata(mut self, name: &'static str, content: &'static str) -> Self { + self.metadata.push((name, content)); + self + } + + /// Añade una entrada `<meta property="..." content="...">` al `<head>`. + #[builder_fn] + pub fn with_property(mut self, property: &'static str, content: &'static str) -> Self { + self.metadata.push((property, content)); + self + } + + /// Modifica el identificador de idioma de la página ([`Context::with_langid`]). + #[builder_fn] + pub fn with_langid(mut self, langid: &'static LanguageIdentifier) -> Self { + self.context.alter_langid(langid); + self + } + + /// Modifica el tema que se usará para renderizar la página ([`Context::with_theme`]). + #[builder_fn] + pub fn with_theme(mut self, theme_name: &'static str) -> Self { + self.context.alter_theme(theme_name); + self + } + + /// Modifica la composición para renderizar la página ([`Context::with_layout`]). + #[builder_fn] + pub fn with_layout(mut self, layout_name: &'static str) -> Self { + self.context.alter_layout(layout_name); + self + } + + /// Define los recursos de la página usando [`AssetsOp`]. + #[builder_fn] + pub fn with_assets(mut self, op: AssetsOp) -> Self { + self.context.alter_assets(op); + self + } + + /// Establece el atributo `id` del elemento `<body>`. + #[builder_fn] + pub fn with_body_id(mut self, id: impl AsRef<str>) -> Self { + self.body_id.alter_value(id); + self + } + + /// Modifica las clases CSS del elemento `<body>` con una operación sobre [`OptionClasses`]. + #[builder_fn] + pub fn with_body_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.body_classes.alter_value(op, classes); + self + } + + /// Añade un componente a la región de contenido por defecto. + pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + self.regions + .alter_child_in_region(CONTENT_REGION_NAME, ChildOp::Add(Child::with(component))); + self + } + + /// Añade un componente en una región (`region_name`) de la página. + pub fn with_component_in( + mut self, + region_name: &'static str, + component: impl ComponentTrait, + ) -> Self { + self.regions + .alter_child_in_region(region_name, ChildOp::Add(Child::with(component))); + self + } + + /// Opera con [`ChildOp`] en una región (`region_name`) de la página. + #[builder_fn] + pub fn with_child_in_region(mut self, region_name: &'static str, op: ChildOp) -> Self { + self.regions.alter_child_in_region(region_name, op); + self + } + + // Page GETTERS ******************************************************************************** + + /// Devuelve el título traducido para el idioma activo, si existe. + pub fn title(&mut self) -> Option<String> { + self.title.using(self.context.langid()) + } + + /// Devuelve la descripción traducida para el idioma activo, si existe. + pub fn description(&mut self) -> Option<String> { + self.description.using(self.context.langid()) + } + + /// Devuelve la lista de metadatos `<meta name=...>`. + pub fn metadata(&self) -> &Vec<(&str, &str)> { + &self.metadata + } + + /// Devuelve la lista de propiedades `<meta property=...>`. + pub fn properties(&self) -> &Vec<(&str, &str)> { + &self.properties + } + + /// Devuelve la solicitud HTTP asociada. + pub fn request(&self) -> &HttpRequest { + self.context.request() + } + + /// Devuelve el identificador de idioma asociado. + pub fn langid(&self) -> &LanguageIdentifier { + self.context.langid() + } + + /// Devuelve el tema que se usará para renderizar la página. + pub fn theme(&self) -> ThemeRef { + self.context.theme() + } + + /// Devuelve la composición para renderizar la página. Por defecto es `"default"`. + pub fn layout(&self) -> &str { + self.context.layout() + } + + /// Devuelve el identificador del elemento `<body>`. + pub fn body_id(&self) -> &OptionId { + &self.body_id + } + + /// Devuelve las clases CSS del elemento `<body>`. + pub fn body_classes(&self) -> &OptionClasses { + &self.body_classes + } + + // Page RENDER ********************************************************************************* + + /// Renderiza los componentes de una región (`regiona_name`) de la página. + pub fn render_region(&mut self, region_name: &'static str) -> Markup { + self.regions + .merge_all_components(self.context.theme(), region_name) + .render(&mut self.context) + } + + /// Renderiza los recursos de la página. + pub fn render_assets(&self) -> Markup { + self.context.render_assets() + } + + /// Renderiza la página completa en formato HTML. + /// + /// Ejecuta las acciones correspondientes antes y después de renderizar el `<body>`, + /// así como del `<head>`, e inserta los atributos `lang` y `dir` en la etiqueta `<html>`. + pub fn render(&mut self) -> ResultPage<Markup, ErrorPage> { + // Acciones específicas del tema antes de renderizar el <body>. + self.context.theme().before_render_page_body(self); + + // Acciones de las extensiones antes de renderizar el <body>. + action::page::BeforeRenderBody::dispatch(self); + + // Renderiza el <body>. + let body = self.context.theme().render_page_body(self); + + // Acciones específicas del tema después de renderizar el <body>. + self.context.theme().after_render_page_body(self); + + // Acciones de las extensiones después de renderizar el <body>. + action::page::AfterRenderBody::dispatch(self); + + // Renderiza el <head>. + let head = self.context.theme().render_page_head(self); + + // Compone la página incluyendo los atributos de idioma y dirección del texto. + let lang = &self.context.langid().language; + let dir = match self.context.langid().character_direction() { + CharacterDirection::LTR => "ltr", + CharacterDirection::RTL => "rtl", + CharacterDirection::TTB => "auto", + }; + Ok(html! { + (DOCTYPE) + html lang=(lang) dir=(dir) { + (head) + (body) + } + }) + } +} diff --git a/src/response/page/error.rs b/src/response/page/error.rs new file mode 100644 index 00000000..3d952c62 --- /dev/null +++ b/src/response/page/error.rs @@ -0,0 +1,88 @@ +use crate::base::component::Html; +use crate::locale::L10n; +use crate::response::ResponseError; +use crate::service::http::{header::ContentType, StatusCode}; +use crate::service::{HttpRequest, HttpResponse}; + +use super::Page; + +use std::fmt; + +#[derive(Debug)] +pub enum ErrorPage { + NotModified(HttpRequest), + BadRequest(HttpRequest), + AccessDenied(HttpRequest), + NotFound(HttpRequest), + PreconditionFailed(HttpRequest), + InternalError(HttpRequest), + Timeout(HttpRequest), +} + +impl fmt::Display for ErrorPage { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + // Error 304. + ErrorPage::NotModified(_) => write!(f, "Not Modified"), + // Error 400. + ErrorPage::BadRequest(_) => write!(f, "Bad Client Data"), + // Error 403. + ErrorPage::AccessDenied(request) => { + let mut error_page = Page::new(request.clone()); + let error403 = error_page.theme().error403(&mut error_page); + if let Ok(page) = error_page + .with_title(L10n::n("Error FORBIDDEN")) + .with_layout("error") + .with_component(Html::with(error403)) + .render() + { + write!(f, "{}", page.into_string()) + } else { + write!(f, "Access Denied") + } + } + // Error 404. + ErrorPage::NotFound(request) => { + let mut error_page = Page::new(request.clone()); + let error404 = error_page.theme().error404(&mut error_page); + if let Ok(page) = error_page + .with_title(L10n::n("Error RESOURCE NOT FOUND")) + .with_layout("error") + .with_component(Html::with(error404)) + .render() + { + write!(f, "{}", page.into_string()) + } else { + write!(f, "Not Found") + } + } + // Error 412. + ErrorPage::PreconditionFailed(_) => write!(f, "Precondition Failed"), + // Error 500. + ErrorPage::InternalError(_) => write!(f, "Internal Error"), + // Error 504. + ErrorPage::Timeout(_) => write!(f, "Timeout"), + } + } +} + +impl ResponseError for ErrorPage { + fn error_response(&self) -> HttpResponse { + HttpResponse::build(self.status_code()) + .insert_header(ContentType::html()) + .body(self.to_string()) + } + + #[rustfmt::skip] + fn status_code(&self) -> StatusCode { + match self { + ErrorPage::NotModified(_) => StatusCode::NOT_MODIFIED, + ErrorPage::BadRequest(_) => StatusCode::BAD_REQUEST, + ErrorPage::AccessDenied(_) => StatusCode::FORBIDDEN, + ErrorPage::NotFound(_) => StatusCode::NOT_FOUND, + ErrorPage::PreconditionFailed(_) => StatusCode::PRECONDITION_FAILED, + ErrorPage::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR, + ErrorPage::Timeout(_) => StatusCode::GATEWAY_TIMEOUT, + } + } +} From c715935cbbb27a19962c84620b63a2e88ae20e48 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 27 Jul 2025 22:55:14 +0200 Subject: [PATCH 705/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20para?= =?UTF-8?q?=20sesiones=20y=20cookies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 202 ++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 3 +- src/app.rs | 24 +++++- src/global.rs | 31 ++++---- src/prelude.rs | 2 +- src/service.rs | 5 +- 6 files changed, 246 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b03e9808..b3cb7b25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,7 +52,7 @@ dependencies = [ "actix-rt", "actix-service", "actix-utils", - "base64", + "base64 0.22.1", "bitflags", "brotli", "bytes", @@ -143,6 +143,23 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "actix-session" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efe6976a74f34f1b6d07a6c05aadc0ed0359304a7781c367fa5b4029418db08f" +dependencies = [ + "actix-service", + "actix-utils", + "actix-web", + "anyhow", + "derive_more 1.0.0", + "rand 0.8.5", + "serde", + "serde_json", + "tracing", +] + [[package]] name = "actix-utils" version = "3.0.1" @@ -235,6 +252,41 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.8.12" @@ -342,6 +394,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + [[package]] name = "autocfg" version = "1.5.0" @@ -363,6 +421,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "base64" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" + [[package]] name = "base64" version = "0.22.1" @@ -477,6 +541,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "4.5.41" @@ -555,7 +629,14 @@ version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ + "aes-gcm", + "base64 0.20.0", + "hkdf", + "hmac", "percent-encoding", + "rand 0.8.5", + "sha2", + "subtle", "time", "version_check", ] @@ -625,9 +706,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "deranged" version = "0.4.0" @@ -650,13 +741,34 @@ dependencies = [ "syn", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl", + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", ] [[package]] @@ -679,6 +791,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -901,6 +1014,16 @@ dependencies = [ "wasi 0.14.2+wasi-0.2.4", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.31.1" @@ -986,6 +1109,24 @@ version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "0.2.12" @@ -1178,6 +1319,15 @@ dependencies = [ "hashbrown 0.15.4", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "intl-memoizer" version = "0.5.3" @@ -1405,6 +1555,12 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "overload" version = "0.1.1" @@ -1413,9 +1569,10 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.12" +version = "0.0.13" dependencies = [ "actix-files", + "actix-session", "actix-web", "actix-web-static-files", "chrono", @@ -1594,6 +1751,18 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "potential_utf" version = "0.1.2" @@ -1930,6 +2099,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2023,6 +2203,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.104" @@ -2375,6 +2561,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "url" version = "2.5.4" diff --git a/Cargo.toml b/Cargo.toml index 049c258c..87b7f697 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.12" +version = "0.0.13" edition = "2021" description = """\ @@ -35,6 +35,7 @@ fluent-templates = "0.13.0" unic-langid = { version = "0.9.6", features = ["macros"] } actix-web = "4.11.0" +actix-session = { version = "0.10.1", features = ["cookie-session"] } actix-web-files = { package = "actix-files", version = "0.6.6" } actix-web-static-files = "4.0.1" static-files.workspace = true diff --git a/src/app.rs b/src/app.rs index b6b5a716..6b11c0fd 100644 --- a/src/app.rs +++ b/src/app.rs @@ -5,6 +5,10 @@ mod figfont; use crate::core::{extension, extension::ExtensionRef}; use crate::{global, locale, service, trace}; +use actix_session::config::{BrowserSession, PersistentSession, SessionLifecycle}; +use actix_session::storage::CookieSessionStore; +use actix_session::SessionMiddleware; + use substring::Substring; use std::io::Error; @@ -111,9 +115,27 @@ impl Application { /// Devuelve [`std::io::Error`] si el *socket* no puede enlazarse (por puerto en uso, permisos, /// etc.). pub fn run(self) -> Result<service::Server, Error> { + // Genera clave secreta para firmar y verificar cookies. + let secret_key = service::cookie::Key::generate(); + // Prepara el servidor web. Ok(service::HttpServer::new(move || { - Self::service_app().wrap(tracing_actix_web::TracingLogger::default()) + Self::service_app() + .wrap(tracing_actix_web::TracingLogger::default()) + .wrap( + SessionMiddleware::builder(CookieSessionStore::default(), secret_key.clone()) + .session_lifecycle(match global::SETTINGS.server.session_lifetime { + 0 => SessionLifecycle::BrowserSession(BrowserSession::default()), + _ => SessionLifecycle::PersistentSession( + PersistentSession::default().session_ttl( + service::cookie::time::Duration::seconds( + global::SETTINGS.server.session_lifetime, + ), + ), + ), + }) + .build(), + ) }) .bind(format!( "{}:{}", diff --git a/src/global.rs b/src/global.rs index e8f50658..3f78b504 100644 --- a/src/global.rs +++ b/src/global.rs @@ -6,23 +6,24 @@ use serde::Deserialize; include_config!(SETTINGS: Settings => [ // [app] - "app.name" => "Sample", - "app.description" => "Developed with the amazing PageTop framework.", - "app.theme" => "Basic", - "app.language" => "en-US", - "app.startup_banner" => "Slant", + "app.name" => "Sample", + "app.description" => "Developed with the amazing PageTop framework.", + "app.theme" => "Basic", + "app.language" => "en-US", + "app.startup_banner" => "Slant", // [log] - "log.enabled" => true, - "log.tracing" => "Info", - "log.rolling" => "Stdout", - "log.path" => "log", - "log.prefix" => "tracing.log", - "log.format" => "Full", + "log.enabled" => true, + "log.tracing" => "Info", + "log.rolling" => "Stdout", + "log.path" => "log", + "log.prefix" => "tracing.log", + "log.format" => "Full", // [server] - "server.bind_address" => "localhost", - "server.bind_port" => 8080, + "server.bind_address" => "localhost", + "server.bind_port" => 8080, + "server.session_lifetime" => 604_800, ]); #[derive(Debug, Deserialize)] @@ -80,4 +81,8 @@ pub struct Server { pub bind_address: String, /// Puerto de escucha del servidor web. pub bind_port: u16, + /// Duración de la cookie de sesión en segundos (p.ej. `604_800` para una semana). + /// + /// El valor `0` indica que la cookie permanecerá activa hasta que se cierre el navegador. + pub session_lifetime: i64, } diff --git a/src/prelude.rs b/src/prelude.rs index af2f5110..6bacaf3a 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -34,7 +34,7 @@ pub use crate::locale::*; pub use crate::datetime::*; pub use crate::service; -pub use crate::service::{HttpRequest, HttpResponse}; +pub use crate::service::{HttpMessage, HttpRequest, HttpResponse}; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; diff --git a/src/service.rs b/src/service.rs index cc32d56e..6897a439 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,12 +1,13 @@ //! Gestión del servidor y servicios web (con [Actix Web](https://docs.rs/actix-web)). +pub use actix_session::Session; pub use actix_web::body::BoxBody; pub use actix_web::dev::Server; pub use actix_web::dev::ServiceFactory as Factory; pub use actix_web::dev::ServiceRequest as Request; pub use actix_web::dev::ServiceResponse as Response; -pub use actix_web::{http, rt, web}; -pub use actix_web::{App, Error, HttpRequest, HttpResponse, HttpServer}; +pub use actix_web::{cookie, http, rt, web}; +pub use actix_web::{App, Error, HttpMessage, HttpRequest, HttpResponse, HttpServer}; #[doc(hidden)] pub use actix_web::test; From a88fcff00f7cbc827168ac374977b8e78ea8a2a1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 28 Jul 2025 18:26:30 +0200 Subject: [PATCH 706/853] =?UTF-8?q?=F0=9F=9A=A8=20(build):=20Aplica=20mejo?= =?UTF-8?q?ra=20propuesta=20por=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-build/src/lib.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index e125c591..b0a13f33 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -230,15 +230,9 @@ impl StaticFilesBundle { // Guarda el archivo CSS compilado en el directorio temporal. let css_path = temp_dir.join(target_name); File::create(&css_path) - .expect(&format!( - "Failed to create CSS file `{}`", - css_path.display() - )) + .unwrap_or_else(|_| panic!("Failed to create CSS file `{}`", css_path.display())) .write_all(css_content.as_bytes()) - .expect(&format!( - "Failed to write CSS content to `{}`", - css_path.display() - )); + .unwrap_or_else(|_| panic!("Failed to write CSS content to `{}`", css_path.display())); // Identifica el directorio temporal de recursos. StaticFilesBundle { From e1265a04b69f3a85ea032fd17dbd9588f810c7da Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 28 Jul 2025 18:33:50 +0200 Subject: [PATCH 707/853] =?UTF-8?q?=F0=9F=8D=B1=20A=C3=B1ade=20gesti=C3=B3?= =?UTF-8?q?n=20de=20recursos=20est=C3=A1ticos=20de=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 3 ++- Cargo.toml | 9 +++++++-- build.rs | 7 +++++++ src/core/extension/all.rs | 8 ++++---- src/global.rs | 18 ++++++++++++++++-- src/service.rs | 3 +++ 6 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 build.rs diff --git a/Cargo.lock b/Cargo.lock index b3cb7b25..20087bf9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1569,7 +1569,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.13" +version = "0.0.14" dependencies = [ "actix-files", "actix-session", @@ -1582,6 +1582,7 @@ dependencies = [ "figlet-rs", "fluent-templates", "itoa", + "pagetop-build", "pagetop-macros", "parking_lot", "pastey", diff --git a/Cargo.toml b/Cargo.toml index 87b7f697..476168dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.13" +version = "0.0.14" edition = "2021" description = """\ @@ -42,7 +42,7 @@ static-files.workspace = true serde = { version = "1.0", features = ["derive"] } -pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } +pagetop-macros.workspace = true [features] default = [] @@ -51,6 +51,8 @@ testing = [] [dev-dependencies] tempfile = "3.20.0" +[build-dependencies] +pagetop-build.workspace = true [workspace] @@ -68,3 +70,6 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] static-files = "0.2.5" + +pagetop-build = { version = "0.0", path = "helpers/pagetop-build" } +pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } diff --git a/build.rs b/build.rs new file mode 100644 index 00000000..85e02e02 --- /dev/null +++ b/build.rs @@ -0,0 +1,7 @@ +use pagetop_build::StaticFilesBundle; + +fn main() -> std::io::Result<()> { + StaticFilesBundle::from_dir("./static", None) + .with_name("assets") + .build() +} diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index d5c452af..f0610447 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -1,7 +1,7 @@ use crate::core::action::add_action; use crate::core::extension::ExtensionRef; use crate::core::theme::all::THEMES; -use crate::{/*global, include_files, include_files_service, */ service, trace}; +use crate::{global, include_files, include_files_service, service, trace}; use parking_lot::RwLock; @@ -125,13 +125,13 @@ pub fn initialize_extensions() { // CONFIGURA LOS SERVICIOS ************************************************************************* -//include_files!(assets); +include_files!(assets); pub fn configure_services(scfg: &mut service::web::ServiceConfig) { for extension in ENABLED_EXTENSIONS.read().iter() { extension.configure_service(scfg); } - /*include_files_service!( + include_files_service!( scfg, assets => "/", [&global::SETTINGS.dev.pagetop_project_dir, "static"] - );*/ + ); } diff --git a/src/global.rs b/src/global.rs index 3f78b504..faa9c2f8 100644 --- a/src/global.rs +++ b/src/global.rs @@ -12,6 +12,9 @@ include_config!(SETTINGS: Settings => [ "app.language" => "en-US", "app.startup_banner" => "Slant", + // [dev] + "dev.pagetop_project_dir" => "", + // [log] "log.enabled" => true, "log.tracing" => "Info", @@ -27,10 +30,11 @@ include_config!(SETTINGS: Settings => [ ]); #[derive(Debug, Deserialize)] -/// Ajustes para las secciones globales [`[app]`](App), [`[log]`](Log) y [`[server]`](Server) de -/// [`SETTINGS`]. +/// Ajustes para las secciones globales [`[app]`](App), [`[dev]`](Dev), [`[log]`](Log) y +/// [`[server]`](Server) de [`SETTINGS`]. pub struct Settings { pub app: App, + pub dev: Dev, pub log: Log, pub server: Server, } @@ -54,6 +58,16 @@ pub struct App { pub run_mode: String, } +#[derive(Debug, Deserialize)] +/// Sección `[Dev]` de la configuración. Forma parte de [`Settings`]. +pub struct Dev { + /// Los archivos estáticos requeridos por `PageTop` se integran por defecto en el binario + /// ejecutable. Sin embargo, durante el desarrollo puede resultar útil servirlos desde su propio + /// directorio para evitar recompilar cada vez que se modifican. En ese caso, este ajuste debe + /// indicar la ruta absoluta al directorio raíz del proyecto. + pub pagetop_project_dir: String, +} + #[derive(Debug, Deserialize)] /// Sección `[log]` de la configuración. Forma parte de [`Settings`]. pub struct Log { diff --git a/src/service.rs b/src/service.rs index 6897a439..68c8d5d1 100644 --- a/src/service.rs +++ b/src/service.rs @@ -9,6 +9,9 @@ pub use actix_web::dev::ServiceResponse as Response; pub use actix_web::{cookie, http, rt, web}; pub use actix_web::{App, Error, HttpMessage, HttpRequest, HttpResponse, HttpServer}; +pub use actix_web_files::Files as ActixFiles; +pub use actix_web_static_files::ResourceFiles; + #[doc(hidden)] pub use actix_web::test; From 2bbb37bb5df3e4c4d08975158f5a7becbe139f18 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 2 Aug 2025 11:20:39 +0200 Subject: [PATCH 708/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20p=C3=A1gina=20?= =?UTF-8?q?de=20bienvenida=20y=20de=20comprobaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Añade nueva hoja de estilos (normalize.css) al tema básico. - Activa la extensión de la página de bienvenida por defecto en el registro de extensiones. - Añade traducciones en inglés y español para el contenido de la página de bienvenida. - Incluye estilos CSS y recursos gráficos para el diseño y disposición de la página de bienvenida. --- src/base.rs | 4 +- src/base/extension.rs | 4 + src/base/extension/welcome.rs | 108 +++++++ src/base/theme/basic.rs | 10 +- src/core/extension/all.rs | 13 +- src/global.rs | 2 +- src/lib.rs | 2 +- src/locale.rs | 16 +- src/locale/en-US/theme.ftl | 1 + src/locale/en-US/welcome.ftl | 21 ++ src/locale/es-ES/theme.ftl | 1 + src/locale/es-ES/welcome.ftl | 21 ++ static/css/normalize.css | 349 +++++++++++++++++++++ static/css/welcome.css | 460 ++++++++++++++++++++++++++++ static/img/monster-pagetop_250.avif | Bin 0 -> 10834 bytes static/img/monster-pagetop_250.png | Bin 0 -> 32018 bytes static/img/monster-pagetop_250.webp | Bin 0 -> 12090 bytes static/img/monster-pagetop_500.avif | Bin 0 -> 20876 bytes static/img/monster-pagetop_500.png | Bin 0 -> 80504 bytes static/img/monster-pagetop_500.webp | Bin 0 -> 22974 bytes static/img/welcome-header-sm.avif | Bin 0 -> 16768 bytes static/img/welcome-header-sm.jpg | Bin 0 -> 63203 bytes static/img/welcome-header-sm.webp | Bin 0 -> 85210 bytes static/img/welcome-header.avif | Bin 0 -> 37239 bytes static/img/welcome-header.jpg | Bin 0 -> 184289 bytes static/img/welcome-header.webp | Bin 0 -> 187824 bytes tests/service.rs | 5 +- 27 files changed, 1000 insertions(+), 17 deletions(-) create mode 100644 src/base/extension.rs create mode 100644 src/base/extension/welcome.rs create mode 100644 src/locale/en-US/welcome.ftl create mode 100644 src/locale/es-ES/welcome.ftl create mode 100644 static/css/normalize.css create mode 100644 static/css/welcome.css create mode 100644 static/img/monster-pagetop_250.avif create mode 100644 static/img/monster-pagetop_250.png create mode 100644 static/img/monster-pagetop_250.webp create mode 100644 static/img/monster-pagetop_500.avif create mode 100644 static/img/monster-pagetop_500.png create mode 100644 static/img/monster-pagetop_500.webp create mode 100644 static/img/welcome-header-sm.avif create mode 100644 static/img/welcome-header-sm.jpg create mode 100644 static/img/welcome-header-sm.webp create mode 100644 static/img/welcome-header.avif create mode 100644 static/img/welcome-header.jpg create mode 100644 static/img/welcome-header.webp diff --git a/src/base.rs b/src/base.rs index 6f22dd72..d27a9ad5 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1,7 +1,9 @@ -//! Reúne acciones, componentes y temas listos para usar. +//! Reúne acciones, componentes, extensiones y temas predefinidos. pub mod action; pub mod component; +pub mod extension; + pub mod theme; diff --git a/src/base/extension.rs b/src/base/extension.rs new file mode 100644 index 00000000..49e408dd --- /dev/null +++ b/src/base/extension.rs @@ -0,0 +1,4 @@ +//! Extensiones para funcionalidades avanzadas de `PageTop`. + +mod welcome; +pub use welcome::Welcome; diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs new file mode 100644 index 00000000..f0664d2d --- /dev/null +++ b/src/base/extension/welcome.rs @@ -0,0 +1,108 @@ +use crate::prelude::*; + +/// Página de bienvenida predeterminada de `PageTop`. +/// +/// Esta extensión se instala por defecto y muestra una página en la ruta raíz (`/`) cuando no se ha +/// configurado ninguna página de inicio personalizada. Permite confirmar que el servidor está +/// funcionando correctamente. +pub struct Welcome; + +impl ExtensionTrait for Welcome { + fn name(&self) -> L10n { + L10n::l("welcome_extension_name") + } + + fn description(&self) -> L10n { + L10n::l("welcome_extension_description") + } + + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/", service::web::get().to(homepage)); + } +} + +async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + let app = &global::SETTINGS.app.name; + + Page::new(request) + .with_title(L10n::l("welcome_page")) + .with_theme("Basic") + .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/welcome.css"))) + .with_component(Html::with(html! { + div id="main-header" { + header { + h1 id="header-title" aria-label=(L10n::l("welcome_aria").with_arg("app", app)) { + span { (L10n::l("welcome_title")) } + (L10n::l("welcome_intro").with_arg("app", app)) + } + } + aside id="header-image" aria-hidden="true" { + div id="monster" { + picture { + source + type="image/avif" + src="/img/monster-pagetop_250.avif" + srcset="/img/monster-pagetop_500.avif 1.5x"; + source + type="image/webp" + src="/img/monster-pagetop_250.webp" + srcset="/img/monster-pagetop_500.webp 1.5x"; + img + src="/img/monster-pagetop_250.png" + srcset="/img/monster-pagetop_500.png 1.5x" + alt="Monster PageTop"; + } + } + } + } + + main id="main-content" { + section class="content-body" { + div id="poweredby-button" { + a id="poweredby-link" href="https://pagetop.cillero.es" target="_blank" rel="noreferrer" { + span {} span {} span {} + div id="poweredby-text" { (L10n::l("welcome_powered")) } + } + } + div class="content-text" { + p { (L10n::l("welcome_text1")) } + p { (L10n::l("welcome_text2")) } + + div class="subcontent" { + h1 { span { (L10n::l("welcome_about")) } } + p { (L10n::l("welcome_pagetop")) } + p { (L10n::l("welcome_issues1")) } + p { (L10n::l("welcome_issues2").with_arg("app", app)) } + } + } + } + } + + footer id="footer" { + section class="footer-inner" { + div class="footer-logo" { + svg + viewBox="0 0 1614 1614" + xmlns="http://www.w3.org/2000/svg" + role="img" + aria-label=(L10n::l("pagetop_logo")) + preserveAspectRatio="xMidYMid slice" + focusable="false" + { + path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} + } + } + div class="footer-links" { + a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } + a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code")) } + em { (L10n::l("welcome_have_fun")) } + } + } + } + + })) + .render() +} diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 0fc533c5..4ea24604 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -11,4 +11,12 @@ impl ExtensionTrait for Basic { } } -impl ThemeTrait for Basic {} +impl ThemeTrait for Basic { + fn after_render_page_body(&self, page: &mut Page) { + page.alter_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/css/normalize.css") + .with_version("8.0.1") + .with_weight(-99), + )); + } +} diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index f0610447..93b5c4bd 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -29,8 +29,8 @@ pub fn register_extensions(root_extension: Option<ExtensionRef>) { add_to_enabled(&mut enabled_list, extension); } - /* Añade la página de bienvenida por defecto a la lista de extensiones habilitadas. - add_to_enabled(&mut enabled_list, &crate::base::extension::Welcome); */ + // Añade la página de bienvenida por defecto a la lista de extensiones habilitadas. + add_to_enabled(&mut enabled_list, &crate::base::extension::Welcome); // Guarda la lista final de extensiones habilitadas. ENABLED_EXTENSIONS.write().append(&mut enabled_list); @@ -128,9 +128,18 @@ pub fn initialize_extensions() { include_files!(assets); pub fn configure_services(scfg: &mut service::web::ServiceConfig) { + // Sólo compila durante el desarrollo, para evitar errores 400 en la traza de eventos. + #[cfg(debug_assertions)] + scfg.route( + // Ruta automática lanzada por Chrome DevTools. + "/.well-known/appspecific/com.chrome.devtools.json", + service::web::get().to(|| async { service::HttpResponse::NotFound().finish() }), + ); + for extension in ENABLED_EXTENSIONS.read().iter() { extension.configure_service(scfg); } + include_files_service!( scfg, assets => "/", [&global::SETTINGS.dev.pagetop_project_dir, "static"] ); diff --git a/src/global.rs b/src/global.rs index faa9c2f8..f150ca6d 100644 --- a/src/global.rs +++ b/src/global.rs @@ -6,7 +6,7 @@ use serde::Deserialize; include_config!(SETTINGS: Settings => [ // [app] - "app.name" => "Sample", + "app.name" => "PageTop App", "app.description" => "Developed with the amazing PageTop framework.", "app.theme" => "Basic", "app.language" => "en-US", diff --git a/src/lib.rs b/src/lib.rs index 63ca6a55..598c55e6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -98,7 +98,7 @@ pub mod core; pub mod response; // Gestión del servidor y servicios web. pub mod service; -// Reúne acciones, componentes y temas listos para usar. +// Reúne acciones, componentes, extensiones y temas predefinidos. pub mod base; // Prepara y ejecuta la aplicación. pub mod app; diff --git a/src/locale.rs b/src/locale.rs index 298b3508..2a08ba6f 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -90,7 +90,7 @@ //! Y *voilà*, sólo queda operar con los idiomas soportados por `PageTop` usando [`LangMatch`] y //! traducir textos con [`L10n`]. -use crate::html::{Markup, PreEscaped}; +use crate::html::{Markup, PreEscaped, Render}; use crate::{global, hm, AutoDefault}; pub use fluent_templates; @@ -313,7 +313,7 @@ enum L10nOp { /// // Traducción simple con clave y argumentos. /// let hello = L10n::l("greeting") /// .with_arg("name", "Manuel") -/// .markup(); +/// .get(); /// ``` /// /// También para traducciones a idiomas concretos. @@ -400,17 +400,19 @@ impl L10n { } } - /// Traduce y escapa con el idioma por defecto, devolviendo [`Markup`]. - pub fn markup(&self) -> Markup { - PreEscaped(self.get().unwrap_or_default()) - } - /// Traduce y escapa con el [`LanguageIdentifier`] indicado, devolviendo [`Markup`]. pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { PreEscaped(self.using(langid).unwrap_or_default()) } } +impl Render for L10n { + /// Traduce y escapa con el idioma por defecto, devolviendo [`Markup`]. + fn render(&self) -> Markup { + PreEscaped(self.get().unwrap_or_default()) + } +} + impl fmt::Debug for L10n { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("L10n") diff --git a/src/locale/en-US/theme.ftl b/src/locale/en-US/theme.ftl index fd7f228d..9c71e6bd 100644 --- a/src/locale/en-US/theme.ftl +++ b/src/locale/en-US/theme.ftl @@ -1 +1,2 @@ content = Content +pagetop_logo = PageTop Logo diff --git a/src/locale/en-US/welcome.ftl b/src/locale/en-US/welcome.ftl new file mode 100644 index 00000000..7d98f447 --- /dev/null +++ b/src/locale/en-US/welcome.ftl @@ -0,0 +1,21 @@ +welcome_extension_name = Default homepage +welcome_extension_description = Displays a landing page when none is configured. + +welcome_page = Welcome Page +welcome_title = Hello world! +welcome_aria = Say hello to your { $app } installation + +welcome_intro = Discover⚡{ $app } +welcome_powered = A web solution powered by <strong>PageTop!</strong> + +welcome_text1 = If you can read this page, it means that the <strong>PageTop</strong> server is running correctly but has not yet been fully configured. This usually means the site is either experiencing temporary issues or is undergoing routine maintenance. +welcome_text2 = If the issue persists, please <strong>contact your system administrator</strong> for assistance. + +welcome_about = About +welcome_pagetop = <strong>PageTop</strong> is a <a href="https://www.rust-lang.org" target="_blank">Rust</a>-based web development framework for building modular, extensible, and configurable web solutions. + +welcome_issues1 = To report issues related to the <strong>PageTop</strong> framework, please use <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank">SoloGit</a>. Before opening a new issue, check existing reports to avoid duplicates. +welcome_issues2 = For issues related specifically to <strong>{ $app }</strong>, please refer to its official repository or support channel, rather than directly to <strong>PageTop</strong>. + +welcome_code = Code +welcome_have_fun = Coding is creating diff --git a/src/locale/es-ES/theme.ftl b/src/locale/es-ES/theme.ftl index c2026c6f..f193c537 100644 --- a/src/locale/es-ES/theme.ftl +++ b/src/locale/es-ES/theme.ftl @@ -1 +1,2 @@ content = Contenido +pagetop_logo = Logotipo de PageTop diff --git a/src/locale/es-ES/welcome.ftl b/src/locale/es-ES/welcome.ftl new file mode 100644 index 00000000..8a384253 --- /dev/null +++ b/src/locale/es-ES/welcome.ftl @@ -0,0 +1,21 @@ +welcome_extension_name = Página de inicio predeterminada +welcome_extension_description = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. + +welcome_page = Página de Bienvenida +welcome_title = ¡Hola mundo! +welcome_aria = Saluda a tu instalación { $app } + +welcome_intro = Descubre⚡{ $app } +welcome_powered = Una solución web creada con <strong>PageTop!</strong> + +welcome_text1 = Si puedes leer esta página, significa que el servidor de <strong>PageTop</strong> funciona correctamente, pero aún no ha sido completamente configurado. Esto suele indicar que el sitio está experimentando problemas temporales o está pasando por un mantenimiento de rutina. +welcome_text2 = Si el problema persiste, por favor <strong>contacta con el administrador del sistema</strong> para recibir asistencia técnica. + +welcome_about = Acerca de +welcome_pagetop = <strong>PageTop</strong> es un entorno de desarrollo web basado en <a href="https://www.rust-lang.org/es" target="_blank">Rust</a>, diseñado para crear soluciones web modulares, extensibles y configurables. + +welcome_issues1 = Para comunicar cualquier problema con <strong>PageTop</strong>, utiliza <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank">SoloGit</a>. Antes de informar de una incidencia, revisa los informes ya existentes para evitar duplicados. +welcome_issues2 = Si se trata de fallos específicos de <strong>{ $app }</strong>, por favor acude a su repositorio oficial o canal de soporte, y no al de <strong>PageTop</strong> directamente. + +welcome_code = Código +welcome_have_fun = Programar es crear diff --git a/static/css/normalize.css b/static/css/normalize.css new file mode 100644 index 00000000..192eb9ce --- /dev/null +++ b/static/css/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/static/css/welcome.css b/static/css/welcome.css new file mode 100644 index 00000000..8f603485 --- /dev/null +++ b/static/css/welcome.css @@ -0,0 +1,460 @@ +:root { + --bg-img: url('/img/welcome-header.jpg'); + --bg-img-set: image-set(url('/img/welcome-header.avif') type('image/avif'), url('/img/welcome-header.webp') type('image/webp'), var(--bg-img) type('image/jpeg')); + --bg-img-sm: url('/img/welcome-header-sm.jpg'); + --bg-img-sm-set: image-set(url('/img/welcome-header-sm.avif') type('image/avif'), url('/img/welcome-header-sm.webp') type('image/webp'), var(--bg-img-sm) type('image/jpeg')); + --bg-color: #8c5919; + --color: #1a202c; + --color-red: #fecaca; + --color-gray: #e4e4e7; + --color-link: #1e4eae; + --focus-outline: 2px solid var(--color-link); + --focus-outline-offset: 2px; + --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); +} + +html { + min-height: 100%; + background-color: black; +} +body { + margin: auto; + position: relative; + min-height: 100%; + min-width: 350px; + background-color: var(--bg-color); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 1.125rem; + font-weight: 300; + color: var(--color); + line-height: 1.6; +} + +header, +section { + position: relative; + text-align: center; +} + +a { + color: currentColor; + text-decoration: underline; + transition: font-size 0.2s, text-decoration-color 0.2s; +} +a:focus-visible { + outline: var(--focus-outline); + outline-offset: var(--focus-outline-offset); +} +a:hover, +a:hover:visited { + text-decoration-color: var(--color-link); +} + +#content { + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +#main-header { + display: flex; + flex-direction: column-reverse; + padding-bottom: 9rem; + max-width: 80rem; + width: 100%; + background-image: var(--bg-img-sm); + background-image: var(--bg-img-sm-set); + background-position: top center; + background-position-y: -1rem; + background-size: contain; + background-repeat: no-repeat; +} +#main-header header { + padding: 0; + background: none; +} +#header-title { + margin: 0 0 0 1.5rem; + text-align: left; + display: flex; + flex-direction: column; + box-sizing: border-box; + color: #dceefb; + padding: clamp(0rem, -5.4892rem + 23.4206vw, 9.5rem) 1rem 1rem; + font-size: clamp(1.5rem, 0.7231rem + 3.3149vw, 3.375rem); + font-style: italic; + font-weight: 600; + line-height: 110%; + text-shadow: 0 0.125rem 0.1875rem rgba(0, 0, 0, 0.3); +} +#header-title > span { + background: linear-gradient(180deg, #ddff95 30%, #ffb84b 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + font-size: clamp(2.25rem, 1.3177rem + 3.9779vw, 6.5rem); + font-style: normal; + font-weight: 700; + line-height: 110%; + text-shadow: none; +} +#header-image { + width: 100%; + text-align: right; + display: flex; + justify-content: flex-start; +} +#header-image #monster { + margin-right: 12rem; + margin-top: 1rem; + flex-shrink: 1; +} +@media (min-width: 64rem) { + #main-header { + background-image: var(--bg-img); + background-image: var(--bg-img-set); + } + #header-title { + padding: 1.2rem 2rem 2.6rem 2rem; + } + #header-image { + justify-content: flex-end; + } +} + +#main-content { + height: auto; + margin-top: 1.6rem; +} +.content-body { + box-sizing: border-box; + max-width: 80rem; +} +.content-body:before, +.content-body:after { + content: ''; + position: absolute; + left: 0; + right: 0; + background: linear-gradient(130deg, rgba(13, 44, 91, 0) 0%, #ddff95 77.4%); + margin: 0 -10.375rem; + filter: blur(2.75rem); + opacity: 0.8; + inset: 11.75rem; + z-index: 0; +} +.content-body:before { + top: -1rem; +} +.content-body:after { + bottom: -1rem; +} +@media (max-width: 48rem) { + .content-body { + margin-top: -9.8rem; + } + .content-body:before, + .content-body:after { + inset: unset; + } +} +@media (min-width: 64rem) { + #main-content { + margin-top: 0; + } + .content-body { + margin-top: -5.7rem; + } +} + +#poweredby-button { + width: 100%; + margin: 0 auto 3rem; + z-index: 10; +} +#poweredby-link { + background: #7f1d1d; + background-image: linear-gradient(to bottom, rgba(255,0,0,0.8), rgba(255,255,255,0)); + background-position: top left, center; + background-size: contain; + background-repeat: no-repeat; + border-radius: 0.75rem; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + font-size: 1.5rem; + line-height: 1.3; + text-decoration: none; + text-shadow: var(--shadow); + transition: transform 0.3s ease-in-out; + position: relative; + overflow: hidden; + min-width: 28.875rem; + min-height: 7.6875rem; + outline: none; +} +#poweredby-link::before { + content: ''; + position: absolute; + top: -13.125rem; + left: -10rem; + height: 26.25rem; + width: 26.25rem; + background: linear-gradient(135deg, #ec7bae 50.41%, #9600b8 70.41%); + transform: rotate(45deg); + transition: transform 0.3s ease-in-out; + z-index: 5; +} +#poweredby-text { + display: flex; + flex-direction: column; + flex: 1; + transition: all 0.5s ease-in-out; + position: relative; + z-index: 10; + padding: 1rem 1.5rem; + text-align: left; + color: white; + text-shadow: 0 0.101125rem 0.2021875rem rgba(0, 0, 0, 0.25); + font-size: 1.65rem; + font-style: normal; + font-weight: 600; + line-height: 130.023%; + letter-spacing: 0.0075rem; +} +#poweredby-text strong { + font-size: 2.625rem; + font-weight: 600; + line-height: 130.023%; + letter-spacing: 0.013125rem; +} +#poweredby-link span { + position: absolute; + display: block; + pointer-events: none; +} +#poweredby-link span:nth-child(1) { + height: 8px; + width: 100%; + top: 0; + left: 0; + background: linear-gradient(to right, rgba(0, 0, 0, 0), #f6e58d); + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + transform: translateX(-100%); + animation: span1 8s linear infinite; + animation-delay: 1s; +} +@keyframes span1 { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } +} +#poweredby-link span:nth-child(2) { + width: 8px; + height: 100%; + top: 0; + right: 0; + background: linear-gradient(to bottom, rgba(0, 0, 0, 0), #f6e58d); + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + transform: translateY(100%); + animation: span2 4s linear infinite; + animation-delay: 5s; +} +@keyframes span2 { + 0% { + transform: translateY(-100%); + } + 100% { + transform: translateY(100%); + } +} +#poweredby-link span:nth-child(3) { + height: 8px; + width: 100%; + bottom: 0; + right: 0; + background: linear-gradient(to left, rgba(0, 0, 0, 0), #f6e58d); + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + transform: translateX(100%); + animation: span3 8s linear infinite; + animation-delay: 7s; +} +@keyframes span3 { + 0% { + transform: translateX(100%); + } + 100% { + transform: translateX(-100%); + } +} +#poweredby-link:hover { + transition: all .5s; + transform: rotate(-3deg) scale(1.1); + box-shadow: 0px 3px 5px rgba(0,0,0,.4); +} +#poweredby-link:hover span { + animation-play-state: paused; +} +@media (max-width: 48rem) { + #poweredby-link { + height: 6.25rem; + min-width: auto; + border-radius: 0; + } + #poweredby-text { + display: inline; + padding-top: .5rem; + } +} +@media (min-width: 48rem) { + #poweredby-button { + position: absolute; + top: 0; + left: 50%; + transform: translate(-50%, -50%); + max-width: 29.375rem; + margin-bottom: 0; + } +} + +.content-text { + z-index: 1; + width: 100%; + display: flex; + flex-direction: column; + box-sizing: border-box; + align-items: center; + text-align: left; + font-size: 1.3125rem; + font-weight: 400; + line-height: 1.5; + margin-top: -6rem; + background: #fff; + margin-bottom: 0; + position: relative; + padding: 6rem 1.063rem 0.75rem; + overflow: hidden; +} +.content-text p { + width: 100%; + line-height: 150%; + font-weight: 400; + font-size: 1.45rem; + margin: 0 0 1.5rem; +} +@media (min-width: 48rem) { + .content-text { + font-size: 1.375rem; + line-height: 2rem; + padding-top: 7rem; + } +} +@media (min-width: 64rem) { + .content-text { + border-radius: 0.75rem; + box-shadow: var(--shadow); + max-width: 60rem; + margin: 0 auto 6rem; + padding-left: 4.5rem; + padding-right: 4.5rem; + } +} + +.subcontent { + position: relative; +} +.subcontent h1 { + margin: 1em 0 .8em; +} +.subcontent h1 span { + display: inline-block; + padding: 10px 30px 14px; + margin: 0 0 0 20px; + background: white; + border: 5px solid; + border-radius: 30px; + box-shadow: 0 0 0 5px white, inset 0 0 0 5px white; + border-color: orangered; + transform: rotate(-3deg) translateY(-25%); +} +.subcontent h1:before { + content: ""; + height: 5px; + position: absolute; + top: 50px; + left: -15%; + width: 130%; + z-index: -5; + background: orangered; + box-shadow: 0 0 0 5px white, 0 -10px 0 5px white; + transform: rotate(2deg) translateY(-50%); + transform-origin: top left; +} +.subcontent h1:after { + content: ""; + height: 70rem; + position: absolute; + top: 42px; + left: -15%; + width: 130%; + z-index: -10; + background: var(--color-red); + transform: rotate(2deg); +} + +#footer { + width: 100%; + background-color: black; + color: var(--color-gray); + font-size: 1.15rem; + font-weight: 300; + line-height: 100%; + display: flex; + justify-content: center; + z-index: 10; +} +#footer a:visited { + color: var(--color-gray); +} +.footer-logo { + max-height: 12.625rem; +} +.footer-logo svg { + width: 100%; +} +.footer-logo, +.footer-links, +.footer-inner { + display: flex; + justify-content: center; + width: 100%; +} +.footer-links { + gap: 1.875rem; + flex-wrap: wrap; + margin-top: 2rem; +} +.footer-inner { + max-width: 80rem; + display: flex; + flex-direction: column; + padding: 0 10.625rem 2rem; +} +@media (max-width: 48rem) { + .footer-logo { + display: none; + } +} +@media (max-width: 64rem) { + .footer-inner { + padding: 0 1rem 2rem; + } +} diff --git a/static/img/monster-pagetop_250.avif b/static/img/monster-pagetop_250.avif new file mode 100644 index 0000000000000000000000000000000000000000..df864b85c67c980d485216b1ef18737713114554 GIT binary patch literal 10834 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 literal 0 HcmV?d00001 diff --git a/static/img/monster-pagetop_250.png b/static/img/monster-pagetop_250.png new file mode 100644 index 0000000000000000000000000000000000000000..baa7d1f895f60e0966aa09e926922e653ef469f4 GIT binary patch literal 32018 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 literal 0 HcmV?d00001 diff --git a/static/img/monster-pagetop_250.webp b/static/img/monster-pagetop_250.webp new file mode 100644 index 0000000000000000000000000000000000000000..dcc5ef26308dd2f26d1e9c2c1c688f750d544984 GIT binary patch literal 12090 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 YceFZN(cAxq=dFKgq5Ge|ng6l>1Gp;yN&o-= literal 0 HcmV?d00001 diff --git a/static/img/monster-pagetop_500.avif b/static/img/monster-pagetop_500.avif new file mode 100644 index 0000000000000000000000000000000000000000..d07f359de0e7a7c5d1d9378c55a8819a257838ec GIT binary patch literal 20876 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 LA51~|H)nvri_}K9 literal 0 HcmV?d00001 diff --git a/static/img/monster-pagetop_500.png b/static/img/monster-pagetop_500.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b9e0b1399bf5939bd0e0f784f3105d4c52d0b2 GIT binary patch literal 80504 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 literal 0 HcmV?d00001 diff --git a/static/img/monster-pagetop_500.webp b/static/img/monster-pagetop_500.webp new file mode 100644 index 0000000000000000000000000000000000000000..18896fe50ed014ffe5571b8d0a115b755d63823e GIT binary patch literal 22974 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 F006P8s)7Ij literal 0 HcmV?d00001 diff --git a/static/img/welcome-header-sm.avif b/static/img/welcome-header-sm.avif new file mode 100644 index 0000000000000000000000000000000000000000..ec31a6db0108021e24b121684cb2f5367539139d GIT binary patch literal 16768 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 E9|Dm@zW@LL literal 0 HcmV?d00001 diff --git a/static/img/welcome-header-sm.jpg b/static/img/welcome-header-sm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2c875fe4764fa14b07751b6b44755555eeedd74 GIT binary patch literal 63203 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 ae}(Ef;VTZ}642H--2eK?)9?3l?EeAr`UL&} literal 0 HcmV?d00001 diff --git a/static/img/welcome-header-sm.webp b/static/img/welcome-header-sm.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f7aff8751fa594bf8df6bd02c47aadb64be52ec GIT binary patch literal 85210 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 a!1&co532|+!KdL*Yl<1mek`;DKmY(OcGGqM literal 0 HcmV?d00001 diff --git a/static/img/welcome-header.avif b/static/img/welcome-header.avif new file mode 100644 index 0000000000000000000000000000000000000000..8018555a463cdd2ca6eb5c9eff0383dca6b0a41e GIT binary patch literal 37239 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 FmD;HdKPmtK literal 0 HcmV?d00001 diff --git a/static/img/welcome-header.jpg b/static/img/welcome-header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69f1dbe087e1dbdbfc8098fe435b766820267164 GIT binary patch literal 184289 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 literal 0 HcmV?d00001 diff --git a/static/img/welcome-header.webp b/static/img/welcome-header.webp new file mode 100644 index 0000000000000000000000000000000000000000..7da174cfae43ee89b913ba3ab2f3096e011dd31d GIT binary patch literal 187824 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%0ApKZC2)I|u~Au`q9_ zMqon%lgXu~XshQ>@xn1u-oh;}TejUz&sA9|-A9P)&@l!B&V&A!f{sGY{!KoIJdRP( zPfX6I%bank^pBr300N1~OmlaC_#B?SL15#tkP4-;HY%!Su|*+~1PH$0v;>mNT()U1 zFIxu*)nBb)$w4|mH+M6@2S0ICf^c*k`j1V!f@h<Z(>XJARCyoI&cq@0&WmyQpE{vX z3m)*z-TcFcndM*t1I;WKDcZ_1`IAu<8HoTAg?!C;eXK|Hy6H7gO6tg=q?DWBpu;Z! z+~D>#|H8@t*v|krT=O1J1qylXwC1^uJI0qPb>Y4B`6unG*aR>mGQwv(eN3CvumPwL z00N|$Xi`&?$MRAYo8(?&)}^iH;^iJ;&sc+v?gPg1<#^29{027|ZvO`O{AbRd<nndL z6>XDGksj(@Zk68nrCvWTpe7Jr?uezH!$DLQz`*1X?vmo9#NPM*_qQ`5vbOq-`u--s zhP|+f{g15~#rs`710!>zW#I;xUuZD9z&`MKv_B8r%zxxiXI>ZDuz4NBRc>vr^Bqq> zZl=F0e|r@A5yfNyz>bKFv=+?Fj0M0<K6rGDH7c@VlgueV4Z%Tt+3QPY>~c>@y3Y_J z?2bDCcf$p4KDZpoOAwB)#^L|0)SL_7S<v&H5Jd+@csPW|+knH3bSr8czd{s}CiAxy z6e)r&20S9Rr_a0%$bSZi6e+cr&&w)xBss`)2$s#0Y|$=Ou85fmYJD-sZ~<@TpZ{_D zy!`0)=2iO7`xln&it?B-;i>_oxAcXi<%B$2dce%_fdlwEoig-w2B9FS(C5Dok_X7x z3z^YEPJfsW2Ma6})#EJWa*PpUMDP9Yz5l(BZ&aMYYeaq$Htn8qz^;_C6k`~n$W3ti zc-_Ve`*+SIbND|XeuoP{kJ(E0t@i&!`JPN%IhWSqwbl7mzRn=gHNzjBtE#R-?X9L~ zxVwAX&a-mxp3Uv&OMheR`^e{lG5~7U0$H9)`BMAqn{e{-S{bADKWpGW@CCd4{3qPX zYp>FOIJmrnkK@!apkkQ$>Z^<c!;_;)j{*w?hZv)7dgszNst;*+e)+ZnIL3!UAA7{2 zK(v$T5!;OEHs_qidVx_cHARa<^c4Hp_wOP<glfdQ&O$C(yPPOisKt=<oFSG6bf^E9 zUEqdcKgY*dhu2u8|6JMY*WRvSUWrlZTRD?C(TleC@j3nY?O6|uFKI!Ujtzg{>|GQ@ z*5~UXeY)kt+9}94tOl5g6x5pJ(L8dDblvy8|NTXb|BQ;PExyYwRJ2IYvb;8NTW;HK zO7T)s(ls)b8|VNr8#kDL{CM>Xaq2%(|E?32{kH0MPb1Avl!;y><~A)%(AO>$RA_6! zqAw^dT$4U6lB!Bc2G85zV}23rCk{6`TC@~B{l(t*L;p@>R#asHl>mUEbgIoQPRu%_ z8i<2gua9A~`1$n>KEw)rkhxyk#8JnNv<(+<HVB8fYss5uTeXFW*hZzV@s}B(aElcB zl$0c>3S@#!5x#`s%q2T5>6;j1(pMD3Ub7$&7&R!_T3hW?O(}b+lc|W@0FVaw?ZVst zA;8zz@O{MN7a)@BC7#dOjUxj^4{g#y#m%Hx#?dQ>cpHZwITHBG8<M2qPx(_tC;;q% zE#ZxanK`V0by89{s>$W;XI`ix2a&T*CTgrVNJum!iM9tL_!S?CWbByF!(e{9a9+Rt z3m@?^pJRnC0*{;aO=?ERKpSWQIw3j@w`SJ?3)!zs6r&{<pZy^|k4ivwAnD{t3au>0 zHxi(5w+wy4zgQ|Pbwp;XH*3Kv@(kqpXPk+Zk$IH*ARuHB0`0GFmt}Es?U0%wDW|wQ z?sUU0`w!i4%nc6nJPv=34Zkk??DUwuTDcBlPb<@a03HnI&tZtWQ4d|>uT1gYK%wt~ z#9#{rNrhII{BZvviKGa2;J&B1&m42kX=laebGXMcGd}R%Np3-&gqFQ*-Gh$jKq*Bq zByK+L;KMLx`1CRyAMOJmD{hGudP!cyyDVm@*zmJh<EVF((F~bJjB)rop`b$D#n>Bs z7r@a0M%N6lEuoM0cX+I1WG=zyFtbWj(6GS>BPlaA|Hwo4MsbfFfs$-=Te5uppRGaZ z8B*nVn3>9L7`PdH{r&8@#VYY}w#0^C4xQH`7^2#7`KWYJV{DmMi82mN5xB0cO0UfL zWbjRtaBmOA%%RZygWnr}mHvZMH)_Fe>UL_Hi46wQ4%!X!W0bzw9+|Slw<L?p=FlbI zw(URhRH`FJWTvjmoAf1^8{BVp!M|TS{Jq)|EA(D)>j4AIG`Go|$6N=CmKkuZAo{b2 z7cz_vjQfLe_>oh=H$etFLRpCoPcJVP`p?4-wbYLAXtkSt)(5aH%{tQJ`DXwL;Ee<Y zNESeDhpBC=W&0IRg=)jH2oj`&j(H8^clnubxF#tQ(C%G;`GwgM8(Jow-0Sf)qfm`l zwTagfO9x8_Jbfo)tfd)2UL-#mm4NC%(%D%i1LwB_3LDk4EKM%?R@lF=6sbZ1QOMjf z!>7BqngCECu<(GQTvDu$il~UJ$iWLWu6TpkYs$2Gj+fyzBP-RByLy3qIQY1^`E6b^ zn4hfc*Ve<W4b|cJY45&zyA5DK%oGIJ)(nUbg;t)cxWsRb;eMddaDj*9Dp0JV(97aH zaGZpKq(YpMLc^uJQTVUms^V2B<i76#_dU&hy3JO<Gi)?KBu$5i*HRfVsfvt50Err+ z@mYc-nD&xo%f2p;*Y~_j(qz2(nDwf;0}SRrwLP)K0QZG%#vyLenHc3^)B6(Rsp2Zo z<FTHwsy{on7WKOTcWUfSK%~3Td6c{x1r<6K?4c~%%LX4HqrY{`@LXm1?UpZK$B%ha z?<$hu4ge96xzsIeU;$_VnF2CNN%I)XR7B)aa+4I06iU(v()6`74sEFimHRqUv3Z;h zT>ZA!$#CLx9Rr81J4aT$UTuw^h-$+*$zo%&TCptkE$u1A`GM5kIMn65nX|>mf@^r$ zz`y9Am^&1j3)Fqim;EdLi^CSKY;{?DhELrE5-b8pGZU3d^QBP-YOCL<#C!t4u|U(e zY1(qz82q`XLM4VIMlK{tf<u>`U_W)H>|SSyuc93N4sn+ZZ^-Z<j@G)?<7yP`EUaY) zU^+7h8Gj;<elF&^99o_Msy<EyH}RUm6HxXPh9{PMx6r|ex4rno|65X#JU}2S;F!qy z^hGK}0R&bWNFL{xBHW{|k`bRI^C)-$5Df{m;igBm$We1>sWs~)6PpNNBR?On;@WV5 zd%TNFyo{ld74xv5C&d?|VtZ{s1@ttvN&oEtR{zvReknjtwN-dG@BOL3p=)@@U=JAG zZCwhDme89m4*1(!Ki08?olF36T15Kv=d@{aasvPu0Rm=bGLxEIiWUpYPe@M2mzW~K zmine_dfnu*tuEF^$&`{w4Ed~J@R@FxvybaN1|1*)E&Z80&772@-=Tx=S!2*yT60D? zL;xPSU~=1gy_eU}%q#Z1ivdGu1m_~_<;A!c8)jDutpx3|NN}?Zzb^@roJc#hLY$I9 zy$5%n^IeX&?>i$1H%fP`b(0<Ay!?|&zmblhBv@~OH+f&CWowzfZS(n0D%2Z7kxM47 z<AuA;=XT-k->AVMaDkUzXWI^OR)$7ay!$WAXDwszqJz0Mozbxh1E<mfyjsB#0i+ND zaTRo$4bdw!;&<5@80J8$J9jJ!y=kyR%q39t&G1}hxU+P^w^^L~ik}9(E~!*_foRIp zBEsBfjyZ?50u+Ohm4JzmNSB&gc#D3Atq#0)h{T&DUnDMzOBZFUmtH+#g;awW_53Zk z!!Ov>{zH53QUYe2z|uQ(mtxLHIr<%XC0=^f*adowi^%mDa0xrAvvjc1iFb!vwizD) z!;n5Yy>f{$x7a113aQYk;Es4MV9|@x-!mGbOdSf%1!|ULS4FQ#i%UO07g`<6iipVc zZMwP5CIBFe)tEv?sY&jwjhjkVWM%*;APETdE{iUKvj5t$XfJvQo-a!3h^78o9D@sQ zOAR|!g?~W|%-99&y@uuxXJu$)#mgBUwTtC>+>U5%H4F}~({O95>hlqLtOHCb^~$Fk zZ-SrtbHO!`bPgB8FNK|POK(Fjo$n1#EXi7>AJT7me-O8K;2^FH0uIl-3FbNp!Aycu zc*I>1Syhp$1n>sHOn?@Xq)axa-nP8ap;mH;Qj)RZ3SfR0-Rvh$xORrPM(r8D^v2MN zIV0u9_@T@04S7Vp7Z>c*THyBbBc#ALsn&p&?k2bqm34yBiw*SyXJ=`Hn;@ys`vs4H zn;nI#QfRb<NRAifJ5V%Ut{wlynn&>}fLV!*aJacow>f?@i8oSEW{Le39x=vBk<(C7 zBPw@6fh0k}qHTjMc1vzM^S|>Ml468pC}M?J0lurcy|dzJ%ow+>#yJ&hXby2!hTh6L zmk~;t`5UQQvDuFyZqmQUdyZ?H43d2*G!7g~^=9S*g<cXEbvf9eAgK_iq)_j{^>cQ= zw*Y?(?Y{^YNfkjL*n(ruY?|{`3>7rk`#75{MR?Nhm@5*oNfA(1N|GRqSTbp@dv53d z`fo~7W#&}w0v%V!a@^pz3s36Y2`<wz9{}-^D(7QkXvN&BM=x5;^?Ug*u(P^f;*jPh zDIai&hw%Z3QEZr_K%wqpcw$*3xLJk=%iB~d+~`JRlxAR}bj<KvWw;lJ9EL@2VZSwX zNOcr15KI8Rd*rscub~0}%z(pevNX3)MC^A2MwJ01YJ^Y)kp?8#Xv><y0snWV)QW{| zJ!W?<-{M0YstY;MX(%*0G>)gtp>3cr<4Lq{qEZPR1FFp1nbQV^0!|qKFOAr5LBp%$ zpG)WX8t)IpRqa?5S`6AH^h(%)(K$eJ=}>4cQ1g-`yURO-_FUL`uWxiEfvA8-Zt>wc zeb}5+DU7fxzyy;q&(T_pwGp+Ek(pH|Nfc-he9<D8HEOlRw)64dA*G5TNzBy9bLF5L ze0tXQ1E<T&XyVc+(s1s`-YCf4W@u!^@38Cfd40FrYqsR0cF|ga3#j`sNRfXI;P0Xm zP>RM#Wn+f>@l>E{T~D_i%KkDLkZ&>g06)@f>We3qWZR=kozHz&!2<ANpWyh9YaXqK zh+D;ccFjcu@wRkBndr_#>HApeS4NH4$OP~P@Jc|UAVIWjOO}0zfAkEgB14MEOmS25 zi}g8Qf0b-xJ13`yy;wf#PJ>=K`<sjg6TPJ<9(HW8ux^*PuR`EMYEx=UL`T~H54lSS z`v5vW`8{^%Q5;=UCs8Lh`)Wq9Y8zvZ-ell+*wgEJcz;pYRdgqcIV*+wONgCzxZX{u zP=f=67SFmn??*j9p_bxZMG^%B0=Y$mJ$<^(IZ_p<AhAKk4s$B*;qli}|Ec;<O{vJ* zNkGVaaW0tFEsM0-<3O?`r4&jHA{hBqOkoazQGf9hr+A#%cuz@Jn@OUF;NFoW3rUW9 zLpzQq_NsA;c8{YyzsD>`|GeB#y-!FBfNUEOKfj~Ck%1IGkl8prxk--|RQ7_>i>uRY z0%v!!?Kdbk!6GuW7&sryy(XS;G;aiZf}<HY=1e&ms9BuV*Ua_bDZmAGs%e#rD!i|y z?SyYoUu{cL@z8nl3?L#RJj~r&@K!6{z>ic&O4iy(-opDov5y!rM)cnIZ+t`q-q4I9 zgAEq6s41r{E6Z6~S<cF{%5_~iuBysb`EsVMw9-?OCbS~}5g@oP2_qt~zmlbEvuCeJ zNDIL2zD20i{TV^^Ft3Mifz==Cn>B%QApbMH=N~?<u~i8o3W1@mq62~BI0aM!r&^vK zKinbJfBpP!(tt|@-0)+@K)`bBix9v&fP8&jQeVaoc>fp6Yn@jWACd!{+i;zc*LOI9 zUi$_w;Y<IgbsZ;<s_OYCu?cBWVBsIcj-rM0%J7hVj>D^u_b7kI!1)t2IOx#eVICi7 zzv|n7PWZki?TnA#ZO<Ey<z2j4zDrf$i8J=dj7)FLVKcB@RzyY3R1JVFgjckjhgr$F zzC26<-Lx(cfC5BFz+?l7QkG@e-`J9@x+*KHj&xJr&dRcFS+><46(C7K3<M*7K5#o8 zkGO;?Q>hl70`N5HB?Q<-k*!G=asuoWIRV$}0j?jtc7{3e0y_<PHSB0SIsiRHj|VCM z#?_vvR0tIW&;zJbz!}*omgzu;*7Z{w;fxhPxEVlQ(`GVyH&^BXWU~UY$iDsyK)`!U z1`ec01=kkuvsm1C1AMK#0^}RD%Tb+witD4ChNB}5JJPIrJ7Hg$Y+zXnI7I)1Y5wT& zB2|z1`L!NboE6f(noJn)sug|*i4yh#Vh=bn(`RQI_8*tGi;CErnV2d}cQ=o|gk)77 z0_O=en>fiJNs17LBx69CnGKy;<t$ZImCJReTiUFgnN7-6|JXzlBKcx|1g7wn068DV z2Wm+KAzY$Q3T{z=n&bKoQXJFsf5H{go&a7Eqj*Jh9^R!VZ2%SRwrWgP?J<!+WH*t3 zAaV_SyU=tFxr^110Fc8Vz+qPA5spvhbDsi&2(U8tl8-6rC$R8e$g2L$<j%`1H{PG- zzChJK^FM>w`n7W%4;k8<q*MQsNLH53T(DO7C-&s|llkFo=FzO%A^9e%`*IEL#5MC> zS`SGOt<H>yE*s`}lWh}`Hx*S;gBlR4I7!wapChp$6v5RX5E7-4672@fvVp6rvhp~y zoK>BiWlO1CO(W26f`OL2Ap$RhPe0nzg2SlW2c3PHW|r^Jy=FpG)9FQ~4=jCXPddc% z>p~7Pm@~wnL^a4!sphE0v}r?qmNoVug%3VJGbdIoR_4Y#;AP7d-0!$yRd7mXB#?a_ zNd4V8T&E&#jql&=U}qx@fi>?n?1w7gjh9FE^&$TE;S+A}ueUWOb9Cn{-`dG%g$nnc z;MmvS!haCG>vYU%SWO)mqY%g<jkm8bMgQFCbyHs}JYFpW$cTsxZ`bB<=pweMiP;SX zaR6|51WEGfRo{0l0Y(UlfI<Yc)RWTsGs}6aJWjV?x3kUVKFy|;D+1g5nDIWiX^+@i zy&;0H@iX6T&s+j#9m3;_IXW%6jZWl@Z;cgCVrhVdQ+S7hJ4^t!ghiDc`u1qKfl5i6 zZMLYV<cp;4#;`TR2zUFzw0Dnz?6G!b7Va}^#4E?`W<8s+jxT^`PLx$+!~FuemUDSX zm!~;pxih%`m#|wn>CE(gy<R_~;flu6(^m~JCE$N=YFHT&D}CSf7vO)=sNPKh&yA-8 z17el%VtHDQd-ZU07I;VkfC?ZT8R<S(WV`(^5fu{^n8M%|hyci_;<*wGAVLa|0Z}0e zk~IKj{`!@ceJQIlv%J7+y>yl(KU#jr&wyB&|0KSz@vS%&2S~Gx4~W!W`SdKzmr3yO zY6h85cf-TUt&B6DL*GF-nC?INYTA*ToR3C~@w^QAv>|)2>ldeNuj*Uq=iy(Oc!i8~ z*BM}WN(5&Aouyg%0<VJGeHQy(<S;L7?tHlaL5yc!TgQ%r3iJMNGwE=h^eC{rmO@IC zCf=3hY=yCNllz?JKS#gw?TKE*0u17Smff3p<T~`7aJQnw9(QmN@}6zGh=^^fqG~W$ z2N2N%j67Xp0|Egp1w@L?G(YLKl$qsnmYp4|GF#iCb}H4>3JUn11)lU8euF?k;8M5% zjoaJTlT=P`Y1PO#EFG{8><nWYq@7quLoiSj8S)FNZP@x<zMK2o3lY0ZH!ax**?_yR zjz{l(hywM!9T&k3thhNosq9qU)t_vz7B4(&W&>WiR+FQ6O<96p`YSIqR6YO5q_3Wn z0`1c;4wT=Hd@akV!jd_(UIE0r4%>PKMzW8Gmmhilyr0A4gEry#j9p9I0v!WA%6U#y zI&^b*%b}|zRRMd8dHP@B?V8PJUN*Uyh?xik0tMja4i6`bJi{kp1Ox<tZ}q}c7*b|t zDzz4BU6ohJTAH+)QVTNhK4w4xMsWWz3}feeQIAiUK59KafJ-BWZ*mep1!?7Y$vdZL zHS9`f<;5GodkTyYC=_D^MxkVXYMP*nS9#p?8pw!OvxXcD0NFpj33e+m%oV}Ae@@jJ z0^##>;JYWF1h{fwp9HeU?H&Gs_xNv7E&iR}PdJ?p#&s!xA?UmA0>qUGLB?JgXZbdx zy5`OoIDgUW^rao|y$D*IhBhjq8qxw)?yDqe9rsmNsqwjKWW-wANWX||hs{Kxuvjlk zou0+wr=KKbtCsg%Xb5ttWT~94vdUj~Uv}Qk^6hMKTFT6B7-F;=02mSc2VlR67ZA7v zbjE>(<cb<i)Nuhz*SI!}vt|ruyM4}qw}f*XI8=yne03aW1_W=iHT(8>CYGV@P&Q|i z!_j0PV|T~E8b5bxm3MpRC|Bm~{?u)YmxhEA`gtAL$Jk4E?d9JV@bsW>=;)}PJ$XEK zsP&_e9-CuYa15};_a>YGPJMF&?oJRlm4ln(YgU<4@J|^tt13?5ap?g5%KZtJHG+}2 z06oS9(#6K1clCJRsPWIMz*-;DqlG!lU4F=$iHYgW%(O4k;SU6(WyV6*OQW$Pz!gIj z*?=igDqEJFnR%xDRWGOqYro_vD^pSmngKvDzUTQu{NyQXkBDJ?F7z1J(qj7d0em_x zt*O-pu=HA78w_xV_dX1Sg)%!|>=W`@RA`yYR}%S2UbcEDrr823)U42X2k$uU!_F|I z!$`l3zzydhr@g*}`{MTA!XYgL?$Gbfre973ysKWx6z}{&-g{Tbqj|XUtnxvDoi<m< zwfe|Hi^X<=^42X5vVj#y8BcTNrM`0mtez=9EFUwD0-debx{DW2wW7zkh_)cE%%Q}- zXxzW6B=J>}_>bD$;fODFlTB0wBB~Ieo0|tbB1l%AA0oi@1q6udCdqbM!!Bjj*I)0l z%TIBZl=2cAz&n63<J;EH{U=}Uvr&^>QmH$KWqhW0s7ng)S@2U~;m|O}ALFFXI6GXY z^68Z`I-Gx+W%iH$Ms(W-pXGFe12>ki(h|Z7u)+f2KnNU;s|hwM$Jmnz|Ae)TwNPVm zhr8rvO{o;ffn9MoUQ@jDk@Jq$JJVu3Dd7XkD~=Yd6xCdT+ha`KYk?C((V`8j>dw#q zn67~Lu$R}n@aXzgo3CM9&#jN--2H6~U{Gvry+NfzDyhEiR>Ze>v>FwA#2%STJ;(Iz z?ILzt#7wjs)PX?2J#v&M^V3h0m=R=<cn1&=!6xJsBxj~AWtLr;nSDFUuFK`GxPz46 z*kY3eFjvDm{6RWJ_n~a2tr8!faQG1)`s4uA5*6HP0<6X)3oOR?hE80Tw76DpJ%Iq6 zOH=m9^N;#<j8^e!Kl}2beIHU}t8t&s6@biA1a}SI0e}7jKo=>z;+=2Izw&LijnU|* zo0I)5xx#oY{k#r5`xNIO%MbGwzq&Fr_Hwzydwo3WxAaA?GRtdK0#w>;=e5TVM`Q!b zx_Ny^sSE9;*{G_c16$Lkcy)I>&~v#)qwzy1O4qkpPw50IcYMBvwJ@K45fM>cO9c!7 zaNW6c1e2%uAPnvZyblCGLLrGVhvz5Lmpzs3m(yRr9ZqNUf2n-Ul$$L808o#g@F)LE z(Zwt+ap^lfUBc@HqyV|WVsJiZg7H9+wk@Or(Qd0~PgQLS?MSB7kXp^nds)!M)B!0o z%0sZSG9@DhRv_S}UIyL=N%e?l+^daOzQ)4Zkw^!YIAIOz9iUcAzZ}@-I3MI;eRX=N zRZ*#cs%L3c<g?aIajA#LT4^2W*Nb3hl;Od`$!-&2PIw3J>gx-TyQ=gtO#b`A&)mN1 zR<t3Z20-%ijd7u4P-WloRX`h62#@c=_bnvai9lxhopQy@#8lA5Eo}FQ=s^xno+&H5 zBSh^agAgeyF{Uu2Qf8)Xt16vkx1X6+Ucs5R<W@iu6?jk}0`U)I=OY=4fE08oR|+3e z_;4z9N2thW@+zG81lRbMX#w2rqvOXh7AB_tV%HkiK$}^_usj6v0k?+(879D+35c61 zIV1?+$XEJY0;%{5Ucw)+GeHZA2@PH>hb&muZs|&#<QRLMtH=8;I6F)9_{ni)H;DlO zVCj$=O$<TrZ?A{fhW@HTq(tu7TeIRV_137?7&ow9juU(B>);_Uamw4#<A|J@^EC6+ zlvmUOkDI22z2D4O>Mje}#N<sCVrHscu{#0|hO_?s3laz*ATmgX2($*H*Oh6Fk;lWY zMt1+rFO`{A_E;EzKI4V;jz7TR#XeefSmi*<1q-7A8BVzV67$S&tPOi!(6}lCguu~Z zp;DnrUGE_#b}nWgpQVKqDIa`jiIvSQfFDfYKx#^^HI7Vg-?+i;Uco!X3M=3p{(v}F zMSkX6-wJ>g@LoW`JB&AlKo0C<JR+UVcberpxb~5)C1B|_DB!w?eXd%mBDmI0nd$0H z#GjDcJ2L>Uj0-FGj{C|LIHcL1n7@7eqK@kNbnX23=y;q4$5%Ks3Pt4jn()1Fm87e_ zpxv%YWc##fX2bm=CTb?CZ!psxy#xEz-JPCo4xZq%2?PWL0Fn?TBquG(wk=OvWmio% zETt>USyk?ZzONSNoYZGLS{EV$|BB8S*P6|oP53FtGala<2%q`|NC)swksrJP_;6hS zZB(>Dqp1-K)e!AzE<?STd?2;|rD$v*LjscWZ?Xm}vu`us3M)YGumYt13b1mZ^1p$V z+BU}|LNt?oEmmmjom1tN08m+qeX0P?);^aw?VCeeW9co^?X?CmD;PMH4HUb;&~gIE ze!Me<j2~p<M!X2K1HAK*Iy%aFotowPvfiI}i63@32ZEVqEENw)JQ|dAaj7ZkeMuD6 z{zP_e!VD3y+ffW%)uTTiJtD>!#XMQiN(PDk0kN%tsUc)$*3`(fot0i>J*4H!&XF3K zUqyc;0L&QVh7A$1A-G3y|Mx(=r{8HH1zpbR;sfGmEx<2e0dT#3_VTFceWJ@$sS;?< zrj0N$2;L-f#FUi>@!7r)r25~2l{Z#a4pKQ4O#_kR3+}QJaE2YH&3ZN<OuX~=%S7dD z=}{V(vSuYiSiftsv6rKk>@hrkR_>!3R;QQ-aJF=0D@IC-q_ssSHtA&$a9g_!a+2+K z1Ir(0<DL4&%hz5^@dvy8f1Ld=h>n1TJuvH+T3%JlV%^-;J@(Kv-7lh|X8#jaRfVF5 z{&#U_OD4~_G;|KM4|Rap1<`ZP*=kv7{i?FFoVUNVE@zf)c`7p(%>d?SjQPo(d&HV= zKUk0AMPk^b>~2ECaFc%NAbfxzUD{E+UQarW{@DU>;-TpfMcp=SsvgtMuQ2^7+A7*@ zsos&lz`Dm@c4`P2vxbekOdwzj5UjrfoQ{-<r*V|eDGqq0uNCso;3CZRxCa1@2a&si z)tf+O50gjFydOQhc{;u=9j8~gh@aNtZ(d>HAaPeGZuu?*w^}M+X~XKZRs>d7)<|<_ zn1gup@@YhHKqnI24+nMIE`T<wb{iEcXfIQdt7y~ix{8uSNqU!-R=n#ZRm(t&>E7=! zcM%g&Ra?fOi0FOvh~Qur&+tiFgSNPn1jP0yQled!kt(ZP9_6aa94&RZ?9BZ2E2Yfr zhA{vVT4O{6e^@?j`-&-}qNvZac@dMMO>XG{uv3o`3ng%6sLpQkiy!ey(V0Swq64qX zQ-v~JDHhNLpH_`*6zxyryIE~k-0yKU-5x3tP{0>{elW_;@J|L&=;tn`#w#D$;1%#r z3!@=7cmvt2|9e|-dQ0li69Zm4DDWsP9iYxN;11?ioVKUpHrU~I!!5A$V$uSL3uz^4 z@!YBJl@>RIe3Z0Y=WVd;2fc|`@d2!f3Q(cK0zB(|R%cZmlBxxXuRi(elZ)EjnGwkJ zY}ssVxrvII31smdz`na*-8np$@agAB+d*~`cWfXPg2W+AjWLv&nUXRy%Vo81wd@<) zR$5A1)|`_=K#vt@7uNrSHyve7m;$-g_4sDM!vN~izYl%7LCbBj;q?wX!yXn)--Ktz ztz(sq3NZPNzg)~c3B?qzTp9y(1Q-OuwCq3xV*OCEzQx^)Adp?3kb?w1@@(pffBFJ; z-oA3(%^r{gQ^HRsz!+9m`{=N|M`vH_))CMVYt;AwFu>EI!h!rln>DIg;4VyB$xcFg zS&NgEvkBdG0^w(l@r&fvzqD<5n*4hHuV0Ke89^JH&W?E-G_p*PF6y)Ir%%45IwYx< zQGFtsvP~amPv68$Ox4s(p#Y*sAANLZjjX88@ZwB{pTQj=G7#^8Knaq_lquUbEM=A| z%Q~vk>X{dAmux91X-J=+pD|`YpZjC>lW29OL`8YqbkpN=rit_!W`)!uDwPhLg={G6 z&0TUaCmCp2;kUSrMqCV0p|57BWhJpw07aiIXc?p0IsrO#xTjfR_P=z*g(F_6Y-I(6 z6$mRUc!;yBSx?~xe*Ui_qi=xy7w!p}kdt@^!uf611Js#^*MrA!Mq=_P00VfDW}4ix zYjC~5imzkYUOU?3ry?vpWPO2C)`LKh0K@kMWq#oyu?~Shiz-P2ZLa6#tESO09@ZGa zb~?M6W?U*Q^(CpbbsWp~DwRZ$1a{um?$hTS?sBu6nVG36O!pnTFLJGD$;=bO!o3L* zWH4Gx6O(hwoNZ|+({>)tOWpFg+zw@>M=F)66q268vJ_wh{~2)A+$wek<kdJ){bCwE z<j=mF3xESx#u#^V$SVz?-U$w|n0#z$T^ao7F)G>_#|(*mF=BvG96%5d{R$BEvL_y= zC!}2+?iI+&PX;)H5SX};R2jVDcH;)JiV7i~u&+CR;(9G4Z2R>XaJyj%PKe+JTUJ=U zeBhw}Gxto-tG)%QV}KT@ptsmn>}@RzJSwPcn>}_Eyue3ul6z51fCQ*b1r{r;2xRPZ zFydWn;~!;?()*B2?c+Qi2ebiI6%Yu7L2np)MwF;`iSJ9gO5(dD@lc0S={nmufo$KW zc?)yqW;av$kHV}A&^rM3@pwF9j4JZe&y_$EL<SjzLXu+OJ(U<%W{!~>rK~Kcy@E5V zY}=Virfsc{BwNJ5L&C=Vv31P1Ml!CLQZQmtyK&z_+|B*UfSr!p-{P+Wd0(DgMvty( z1FGQb7ZJwBmz{ndxVeA``Xer~Z?|aMZpo@`8;2ccg;Rig9v!c&2a6Q~LI}8Vz(=zA zJJ)F#)&OFKk`?zSRswE1@eZeV)@Et9t|HE*BA(X`64wDszz!q5)z#YRZ%OK7Q6juO z261)WzLHWWtPoaevmRK175A^4Pp$x70rwYq{Gt~OQ!i)%jY;_ue{|qLkMTZv=_?tO zbd`GD(e)KK0th6sh3Rf)b8aGv8~!J%x-a4p7Jj{6TWgug@uh#CbwWW#h(KTiArdA8 zG38H|?J3F1EN59&rF7Z(g<aQ_r}BkXi&tX2es-ii3#oQkW$+=gn^4GSm<_{bPNfc@ z4d*Cx@73^v)otd)i2I2ch}IKv8$?(vl)rbxkgS!zNv(356!-u>fDb;TNcoWY9}e-j zgg^)~+mvGkhd@YvGJ7{c0t7dZS|I>A3V*^*Z7OtYr^~59!L=-gafiGSinDlU%vv9A z?{Ow*G|D=2J;n#HR4~#vra>G~1;BL_ZpU?U#3|jaIh>HW#a&{Z4rwzxAm60-t45zM zu1Itb<Lek^<iZ6ij8&*;({8J1s|cr}t@{4962C-JNo~!8N7V_S5~uHx;kLO?AJhF} z_6Ac^g~8B){pu0p@fc&U@@x54o=jr~0U&@70U?P=O&MynrsT9;na(QP>(9(=VCBfJ zd|`~hw|)-Rw-z5ri>HYk0?hbg^uuM$-fYfnCNN--WJxQMaT+iJk1KbW%f2*psR9_q zI@5cT&8xXd-Rs$`5D=k%dSjI`gbb~qclTtrVFg(M56IuR{xR;gSUJ#U#f=Dvdj)j= z$|>jS`Qbn#o}C%r;Y7<%vj?EbB38H)?9`L4!Np>Q6Aft*$Y6s6L6!vX00Jw(DyHmF znM3RUb%TaE&OY7|v)4(Mv{9UG)u<6MDx;VYI!}Qyqe%ZHeAoM8Uzfx~RcHf&R^P}? zO#4k$p#}qhc=YIgy|!!nRhe<dWnnt0L5K=b5Q$VSVoFx2N@Z7;T+TMjlfIipp3sAy zQ^Zf+6k&`bHpGpE#o$^@k4489124u;a9u&hvhL<(1d?~^J1O5ZwpINBTUg|cwe;IT zKy<nPxb(9&y&Lg34hBnEvEt(<f|J1N^mGZHq!3odsT<-3^2#|6(3#6PQGCS>*|_bi zW65BjBun~exex85lfJDY9khWqs;CwBXl@rvNPv#+XNZHHcGiqiiz0~a#(jq1hRojG zp&KliFZU`asE1)^tY^r){W$gjO-ab-Ww1b@@s%dfC^M-WB)%v~?^=Vd;_(^!IUOG1 z?&dy+xxK;OpbE1CyZe4^<MIE;7+GvQ;W7#PLGrP{5GE%_YO<LmWj4#q%FL`>znzw) z2e!1%`uUIkm9X<JS<C{^3@mapGLuxz1gcSJMkhiZcK3cVj<gLpRG2U}7TVU*uP6yV znZ=Kc6r_B7NI`~hkl>-{5ZnN34py8}0;e?%8P3fL2jWHs`Ab+9rvRY*)9U#Ec3dJW zD=Y8pl5_lcE8Md&8lz)qee>anv2Y<4PUF3|in>Y+K%hk(b|l6V=z=J%XXRGxRdHtl zfmD*3&#&j1@p#KI{F+Sp#BKr3+<|H5J!BlAd0b1cRk|cmT4-T!RP51?yH7VC=BB1* z22+^s0HQ}c9^ID<@A)X^dBSMoLTErp0St%(N=dSnlH{?hENdNS+O8?3My|#Ih$6{n zWBfF5G#z{wpP=pzJ|~0^U0zLYDb!f8$`~}+7h}EL69v}?DHMoyTSSM%i!pO%yqKUK z%@e(8EUQI<WF!gXxZKo|Vg-R(sUIBT1`)_n)-y%cpD+o$?+7*SclLqM?Fzbu<(Z9} z_|iW*1{}(8!+5&z*uiMDX222&0D0{+cw5VQoH8%S4q`w?5Gococx4rlPFKdxr<qav zLK}4A>X{xx3seBcuyqJLb!5p%miZ;-TM{KnrK&cGJpDeHPg7H<8g%h6->=sz$74MH z#H`_;ewr-6y+ys?chLsG7^wkeTMcJ9t9M>>$<9<t>1hc$r$s<96bkK(hz(79MDUNp zh*+aYZ3fH`<0+9oyqhO^+Qo@s*02iGF6ENQo%m}PKf75XF6I<)zTpD{9{@yP#a?xy z0LnSe39EAtkU%OaBN>N)n{bx=Q#`I5R#wiCDJO`q;{L^7csj2~kI#&aLJ_#4)<ok1 ztYL~zqUfX042Gb?;>kywe_E`%@6Z7$htt?*#XH^s?{9}5PfHt^Q$TCp1$vAg<=JLf ztAMr&f7AWvwRrIp{0w&=^nutT;L)=A9Bv9z$lvXFLB#0p&0CwyR&1~PB(Wr+275>h zaEKHoQ&YBuL_XAwb=c0vR(i^Fq(+AUG*Eznz7WAbpq0qt1u*cTZ;u$nkkH?dJIW(g zC%ZA(XR1O7XRJ1M{<cch?oSP8;r>)xWSBq%zeMVS4~Kxb3GVVzu_fcD%YX#H!HTeo z9(xBYu?G=;!JmvBc}>CCGD3*k4a=htf(+SGCiq3_$*G6+sZ=W3!&cTpMSsH`8A~Sg z74o*%QD;4Qi_{TtM4LIwuG+7xbUYnyV7*s523joW8KZ~=j{(=n0R<5W#o(O$x@lpR zN`;E6eu$c&bEz|s**9)BpHESU?)a?MfxG({k1@u`s*?rJ;$jpKgCd3?PduVB%b8`T zota-+zm&=zH)vPG$CeTQ5=QGq^_ffTgYcpDHm?@4ik0x)JBBHw?iypUdTL=DL;kp< z`&7V4f@%6ww3WXA0z7imb0OUP?CK~bu;P!ij5+)?u|#UEh(kz;01?DtAm7s>sySTM zZ)pWVWW{|FRtS-U)M{aKCfld?i5sI~l}4aE<6Vb8*Nx_NBsW(^fDNthv%I>g&Nh&7 zuMpfs5lH*W+>DBEPorH*&0>fk>v5}soXTD$q{3K5yWO8sC`PKUWcb}6T_s6xm5M|m z3xNovXJ^`UUrW<{_1*pP2sEcN+bpt}XG!mZ(Ua&a7!nb1h{8}pvaFn%va<E*OlQfy ztW0~PB`eh}9~F45?FZkE#KQkX(4Z|hDacJOLL7+V9c-9pHB6uJk3S4I(3GVBt3+Te z#%Zt2#wyIDf=g2<e&NrKfYYSRaHmGfj-Wh|6@r@;HxfiQWR-2Eblms{ah+ZN0-My2 z5O@7dbi>NZB)j7~wd$lN-`O#d_BaHJ)lTUt#Z8iy&Vu(3dhN(PWlzN|$UDsuasoKv z2KT6)$4F5A>)Ah!rn`-s^&#->Qbm-xYw@&EWh|EQ2*XGP?kV0>2;;c!k$6a2bdy=N z@B2<5keQi2TREqj*|PQ35n<OWV}!THIjWea6D=Ww1Ofp<2oerW&M8r{P18)<-*;=u z$}DSHT`4vY8KQv3d_cs{p6T79pQO<E84R-(Juofb+iL*^VAU8b&T4V6!xcDcj==3W zdaeZRv9qAvR;gmN!zd$r(?q}GR|QhbPPIn@NG{v}>)9ag4hRkn8M2}q2`j|igSZi} z^&iHC_%f|nS(Oke^*0RyE20~IzS$HcaCr3`D-*$3{>t#i0q}*K5%R;@ukBdiY@iFG z9w&9LvWV5kfB*L;*EFn<?G@Zp&eqknTG138Lkk@f#saJWl|U7Z3V}D(jB;{crPk{k zVTGy!fSrigGh>mNxqq@;)eQ*jd_3S}jKQpAG3({ruogY}j6lNxga8C>3C$@;Dk(XX zX;o&WZIwqUGi&Dfl`XO!9^3kU&%+<iXcv>ZYAb_y1Jpo0HZU%MJJt%Q=cKcV6>zcN zBCi%ZL*y7eZmSZa$rvjf_ROp$srG~Z#;*;}N~1CugSr7p&B)RO$Xp=>xL36+IKG5H z&LXD|<TNnBKmYPP_6iV)A|VO75wcPy^>yQ&W+cz+qa9^NDQ2)7hgur2FxPi&@tStp z-11y!%gvrxA;4-Q!V0XoAwyE94Z{u2=ng2jef%YAykr=1go?Jv$RY)0Ck$p@H!-y4 z`c8d2O9cWzA>;SAE#?ghe6~y2BjDHZ2ybMYoXi@h3VW^yARtDN0g-QzLxd>_QjQ#w z)Kp*AV%zTEDY>H{r37NeAixdW*U$Z@x)bcI?uqFlBm6`PpAohgd<MigoNTyW-nWa3 z6wn@G?uFeO5vzbsj1jX$h{PjV9Js%_$jW7Js2_~lUO{pcg3~^LJ0JopE4bb3A@G~> z)#Mm6lAPo39UTT>C4U|d$jL||5*e`^_ewF^$0w*~M`xm<tx|#0=Q(W0WZ((L$m<=t z{6um?g>`L+8!0M&b`Wd2v%B5hx%4gWy))NrJbG<|F&Ns}VI+)bt56gc?Y31a(QdcV zv4p0Qq_(MEl%!s_&%PrgBHVq|a)LpDt`7GITpNSlva*VKqO8!889}mtA=G*ik~AqR zB_XYL=Tn!Nt(26?{F+vXZ08GjS_$~t&PI6Aw^;oP<WdK8Cg*`vEU`nhxUP)%y#chD z`=Ie*r=s0f=_Fv`)G#LGof{oh#MKmfH4pC{2LZ><ECgbi(4_22K<SS{dKwA!N&S_t z#$?&{v6s@nScy^-k(H9B%!+#gPv==9R81?G>D*eDMpDfyhRfAQzIFf+zQppd0t8rr z_0+d@^K4hTDT%mQw%OP>Mtlr3=)zLQYJpYxRU<2e3a7zKsd?_PqL$Pm`;Sr^9o~fc zU3bFTozvYEP$-~b(GdY}qdQ5iTk>_62t=?cMv&kKfDjSD#E2nCqpdDk<;zy;D7B^5 zrzBh1M<yUbq3F<q4nNS_3_huhEe4Q52O6H>2Y`tKA!5%Vp89&lYLi!_SD>4*84DAT zg%Dar;5T0gN7e}9SIk^$M`zZy6*6<kNWk%(2p~>s$uB#I1PEy(A%gHV0j}@{pUi+= zb;GmWL`xFg?h|C=KFphV7}fWu79yD|Z~*%lcJgg{xWsH(v*X!7PY6P?{wtkUydom3 zxcLHf{u=#YIy@$g5D2WuG69FdVfLSamufh1xh3^iYNsgPg*tKie*WuSG0k$q0Ns}^ zY?Zw+ytS5<x$LLOtAefA0wAeaY?6{h<yh8iXf;qSyEV#`DG6x>06}Dc?OImgUuYm^ zfjt&3(e?ZS_#QW-;-Me6<KdH%jI<67Cvbc&Vu9kgu7!{0H?R(3<yJ_7K=MT-V6RzV z$6G3z@kVe$0_iK@doiqo*r&!PvfZr6vsqbB#p}T;6*1%-d!7Ds9bMN5cXDIjz|dU0 zL)mzJg#;iF6F8t<XQ;&g-foCLIu=*DbH7_X3Gp<HqS6Z-iqhh#)1->!wrVWnU>(!~ zbx}*B5_KaGXGR2`?fEo!R{*duXrRL*(8dFeWDUMo6;HTq;usNNfD8t=#VEETA!=j_ zNu@HYWOZ0f4XpHH(vksa-4ZM!d}#XyYU3d;o%S$>4rV7HH7a#pW7qHs=~HCck!oIy zBib>3A-{VO$FuRHLE{-T3#{<G@HcOSlr%u-J4CQ*g|K1)LOgXrn)gd&CQ5MZ-5@KF zX2?noY(iq^?qlrXUspROMHO|st)i_;MYR~iG}2CovEc?Sly7}<XnK6)2w+(W#NMk} z&xVz<DSqoD+~0P2iFFM%{wy2;0xwHg6_*xXi1*=|YW-IKkn9i0%%#p2+FAAv?2hIU z?)27L%Q+^0o#EQBTOhCn6bLd1fbGWsqy!`@F(i$2Wu~(A`m%mlQo1Kof<h4SXk2<k z@B&;pc7{FL-|}DJ6rAA4>@oO|N}u)w-kFmkF!Z?aF*aax!7-f>;*WY_xoU)Qih!HM zN;8-6(#$icPX>Klf?blZIv`{~3dz79uR?xOQ*nBYe1(vM3ExI6E;6T{M??rXB^DAV z>mkyI2wCxUYB?|DojN3Rc(36C&YIWe$7yYQ79#BFZK1mY+|4FD8=_kxtl$<xzzys9 zDr;&+go?Hb6_K}9q-(cD8`H)DVSybYe2J48Acnb9^-Z<)B9hqmwu%U3pYFE2<?oI_ zL^vPeT%^sVI<bCQGZx&?P;Y~z8bPM0^n|2or7NY(cCFTm9NB~vM7EH8Yyz=-USx3- zCLh9VF$N_*KJyD3zzZmrSgg^4I$-14u-=d?(yaCq#E6$-i8SBY+cazY!EAOub=n#T z)+cEz86R@ODTCiX2uTml$yhk^(Wj66`Qslfq!f`A_jk4=^;4>wHRg)8)OcZurZ+=g z%ymAZTpY=e@7z+8HUc4}MMx#eN)3c(7liylrhP{{U3940`tDo{8b+A5Xuo5$CH0!3 zsxQ>FWVTSt%ioJ0rzf61kBA7rR(Na4Hpk532{U6uY>HS4YyhDEiHsIV&14Frp*{an zru8+=`aQp`MM<Ec0zdf?QDfVWKWzPcG5Y!4;}JtYK$HPJ#73L7IHK=a1E!LgOW|M4 z-@Fs8MqJvh872sb2cktU80PICMqA#_OVVARax$r^kx0jqN)klQU!=|YZoHI3@1l4Y z0f`W|q}Y;oR+|usn-L$zdwe}miqMdOZ@95SxnI)S=pb1zQ0SH*ZdSVKk@akmthj5$ zO~*vO%{qwb#c(){00~=si3~-t7-jKN=2>?lrSEGA5s}eynokcsE)IkTnlrp{kTo)M z=DDGNE@=d`b7zDa5*Pq5EC8vLCZ)70jm*qZbNtFt(<3Eoq&3;X<zgrpfhT4>#8c?| z6Z9sbA`!w(N9ohP_Lvl7dpQBNWG{Wk>!O(3Ve%Fv3z}TBi#LOZ!Q;4_@666D^;}xo ze4&@U>}k)57zKhAX9i~pgjiqlZj6C8)ONT9_XW}tLPQA@Ml5khevH%YCQ}ZVH@)#l z#_9CS78n8!(AR!3IFi0yNB|uNVihuw;I5DySdqB-7C((1z--T;@s~OSFO9%B$C`)p zwgn=aI|AxPt^JvHwuh#CwvgQ%*rTh%cV`6AIJ~u%S^OxTkq4mXK>K2FCj$zRF(8tZ zIXOKwCg)Vz>1owe>pVw&HEWC^DM6AV00#QU8ZTdqhTe8H5@5Chtp>cuY_ShiOQOfK z7^y@g%N-^*X~S!*DHw4xc$l3L3=;v*09x04rU%P?g3O#a@fZ(LAV@;SEs>MtAfYI8 zY{I8!sPdy*lPRr92)aok64!~iSJr?T!n3twtsiS-sWSphtkuuTm%@C^tAjo^waZHg zq>SxRDqcsnLhwWUm;-3*=4#XaMoYFBG`&EbWF{<?X}7KF&&@f~RVY#4P&K%4W@cnI zMXPrN!UDkV1jC~qPL5H7IWsd)@Bx8!F@gca29ThFz#wKUC{IC<l}^vb>A$9>n$6nT z_M}M85b=r`{{qC+Cl#6w(ZBlJW471<q^O_x7sL>B#M)+aZd2K{Y1<J7n2Z*L;MQGi zy~!-ZzWTc@NcafJnJ|!aUOJ1h>j-ZmvpI>-jn5cr94oM=MrJbtNr*_4_##9mZff%M zpuLQz)l0?XGs75;LA3ihoj0mKD+1ZKq;{JogyaM0CVY_dIu2AS#<5P@3q~^zFL1<W zW}DmgU0tHS7FDWS+9t!pGu?f9DjePcc);Bm^u`g3Wag~Xg=>KJw|4{r!~mlYqzM5j zPpYBiskAj}jvSfFZpz+BBmn_f^;A8;CnrJns_gMZsEMc9VnAyKkMSf5eevnyGU=s` z;tyjaGXz#{OqlP?;DW`a7*}=r8-I%70v`2ja0(HWLkW>Pq3B#kTV?gu7sA<COi>6q z_-`Vzy7l`AVN6<-Ig#*?U?X3tC@%;^Tcx5urBK>ZsZ_L~r^aAh7GLwzfFSD-=vgg0 zLSIQ(3F0P1N`gN<NiF{#3xv^#jj}Mpk}64$$F_t-1lMaiL7b}gzZH3-HhzbtZXeGk zpW%kx{V)+u=NM?oQG>JIGtan4dHBnadw|?SP=IXAsi{v+$&*w=$yO?rmSv?<?d0;I z5GF}}>nUS2-L^;JO4#YR4Hr1kf%do~K??b1F3CgegqG3B9sV|<SH=%l9ni=$^jq)l ztGR{ui4{}<)SFx^>it~v1&Gkap&@jIb^C_o1L-u(G>CLu5`n*n*Q~dnSb;Xg?f%WH zi1I+9`y))2F{o(Meyge&{BLIi#3!3zXA|5-<&#ZlBlJNVWmtJ6&qg8$;rr*|{xm<1 z@BK>RAW<&ovW0Mes_*S|s#rI**j05`7e$fPnre#JB0MtPJlzloAP{f{!<)An!Iqp= zIg3yI6+W;(iF*Y3M!bQo2tu4e5(E_HfHWnEkTRPr^=jQ#N)n|hks(54An@`(E#F#G zZDUB;#1r@L2NNx<huFvt%VMTAsG0hmnK|w!F+>|*;I&(3&y;JQ9>2*_YSN!s8tgBf z7BvH@s(&QY1~Ne*qmoJku>$&&P<$7oXI}okuR=x{X#+{*Ao38B5KEY`@3FSZqw<<L z&8RWsQX>}(Y>fnrAOVagx|Fex7LSlj0AE0$zoAT}RZ>EFuCU^+xaL2+c$;`=JG;Cl z!b6M~Z!Fqh-N(#Wg`k#tQQg-Rxz;;xi15rtOd#MufCy)hV+83*X4b5nPvzUW2tTm? zg}6T!F@)IO2LV8kFyJXc)Ep&^{9f%?7A$2SO$aRk7YMBRBRo!C-*5csVm#tbcP$xT zT||MXi!nkNax!hFYuj(w_#h^{1^)781uu`dhzjm<<+{ABzO6~wQ6l#LF}FyF<0rI| zF8s#f2j%y_nfB?-ffm1uAcK&Q1l=u_ql(p}RCgs0_ow{~XM8W5-@s_bj7~4f15!vd z<6nNzgYusUQjicNY7|05uw~^Rq&7yFh%`}xHHtNs>U}d~U!<tDF7{AGRSRq>ka4yy z!rgOf#NzJZK_|U6))=D(@3Y>Y%WFh%5n8?c7=ZwSn%wyr&?a(90OUF6C+D0gd0J^n zX|=4yZqt|~A)?t@{8QVrcLIrh+BuC|jF@;8Sbi)9uZHMCOju_Ao`#I4k=qdMi#^ux zmm@x2<r97F&-4IVP_UxRHlz}eaO%eP9Fte67D)t8R*-MTOWCigKSHDynb_faQ0yZi z9arGtKHQ$SKsA?Xo1rS9`?xSsu#ZD~)!P!*V4FTGWCk_lwB#YFBzUrcp!;Ai)Z^E@ zP^tREo#DOo!g!le;IAw#`%|NCR8=ankDakc>>05ky<G#Gfcqhn9AgZ!WmdgcW}a}V z@za4=XhV?vm^<Gf#oRX$gaXEZAPEESqrQJ<jkMb8sAUO&i1wcL>v<K46lIk}rkAyu z`Fulxd6>~`Al8uOK>3F(6>>H<U^ynK-<4apWP$q1t@e!OT4*5x$@spIq8A}2B#4aI zj)SCCNN*utM;U8FuVLSz#nMUIC<#W9r;{-s(H0;k*-g--8`E*(>~{S0Y#)Q6)P0ix zOQc;Y9g`>-Cbn!sByK|fm7{}B;<QHhE>Ud=WPz<=JRM^%)pUZo3Ds+gTEa>-KroQ4 zN)KdCcL&@Z9uB&<Mv`n~jpDDo&v({I@+dAjV#6LJV`l&YHf)1Xh>%2Lj3G{rnq9KK z??%gsmRiJeEWr5bHw9nI0s)=|bWk&B#&omEiUPD5Er3E>d3Ol)%_WQ@w?br@?N^6c zxTcAQGPxB!@Ur^bm#@?!qz55Hx+SAM#~}lfE-en`;8TP*Os#;(8eWP49UlT!k}^ad zNb(|i>CV>cTHyO}!^YUN%50K}$ph~N8>|&XE5+unO`73Ksy>++kXTvV{xd(QP9&gh zi&QMM6%h;P&M}|w<PtHuWWuRk6#Ir;f_N*{=UW3JJR){?kEeyR2i)E16{P>lG05cm zc&}Mie0>CB!_#L3Kekq21Bl7s=iY`wg5($yA*CcMJ->sVC$&_NX19j1*b9!B_X#_X z&=w=`Sq;0n0V|JU$liCG3~jXi0dSUD5jd8vA9E98`BRo>`iNUYz|ynO5J-gJ$x7v^ z-3O8$B!fUIASh(!+>`rEUlZHS6J(f>Q(P+1!fvH~4&tdlA>zv>uN#w!`*>T2Hcg&d zVmH>1USng&_6B4c9w1_w2;<ga4n90sk}UGPicPyMl?rG4ABMro5jeesJyx*v>nS!> zt#GO9%OC)(6S1GZ2R1yBnQg`Zdw>znMzW$M$;_;r`RiWig@?5vVq1O?hyVi^WNaeZ zOAKIA!ut@4=J=HwsWorUQ<|J?MTijjy`K%wFrJV4gc-u8#o4xZ0)Z(+peqmJ;>VfS zR-fMJ@i2NT!kZaqH*@@p;HE$gDetCwJs4?wec?)_k#9gC-AYE;d6dIQ#wG_s8p#)4 zjkjyG(7<18$3f1qNRA|uxZMXo<?Q`-ImD6bT?wwvu~C49OdC~RsgH?PF=yad>mhE* zidd(#CL!)&wENqy^9IrGPpMQL)~Y3vEK;m7LXr@cY{Y-a_*&vrN}c*nO_i!pz)r;8 zq9Zf$bWiW$?j9aNZxyUTGFgK;m->vX5R4~8>=6xuj1YkhAR&?*Qi#G3#gXdRZE1T! zv_>x>u%?WE0TMmY1}*eVt@Hu)hv@()TCU&0S~_G_QybEE#2_vaNAzhtT^#B0%MrDk zM-an~zB4lkjipH7U?dYyWqr#;3Lzq72&pnT*--(s`S9g6wI7-z!@barkkwx~T%Xcq z>dY>GiMNZ505Qmr<tKK%Oo2cndCi1_v}&6bQ5z16xo~Y1@w%};d_cm{8DmFo3)>dP z%U}G6s9I~ON-C+i*6ooZLDY#J_SpW~Ga@|Q!-++mQL(he!DPO3)~w1Cd_e#G*fvCf zLGA&Hd>heYk!Ap62pCd>kzM`IhN}d&X$r*i{V!P3HcC+Uk=ah^Bl_+!eV#>Jo8h_x zLYHKDvhEA=qbsSNCPggY@8i-nZf{>`)^0wKB2vgCHlsO|Bq-B{l*E&nv7Cv#@D>}Q z*ER4Uuc-Kp)wa>SGK*)qmsrs#OzIn>(Bc+i)opsc#FI?kkc>epVg6H2fQXWEqHTh9 zGda967}g|fMUmJRIDgcN+Oa;^=2h!7h+osDTCXD2BLM;o1TxQmpAk5p?%^Jc@Nj3e zwoH;Oi@aCmeV#25Sn>$qgYgC+HZT|>7=adv61ictg&{FBwLa_VK@?IV7Yr<SF#7SY znVvUU5E_Z8pZ_*1)B^l%ZA$B?KY;Dbt60jz;;U<n*iCe!G2S6s!7iiTmuHPIAIO2a zWHgm_6GA3Bj8#X$PVIxFk-s3W$p39POdg<i)7~7qXau>9$2d+C_af|(bNV}o(GtS^ zGfqh*?RzQ^89c$88H;t6UI--VJHz0m7ZEt+)r_Nx(i$j<%VX=QTEf{riHwN9;D|ol z=>&Ju$(F3a8WqLKCEP1dmB3m>1R@xFv?9i5C>V36LZl+8&wYN<pPUfn7oEjL6osLl zDLTBkUK##+T0_W&&{fcltJIGl-GjlP-HmZ1R2I5je9(+6hNfYrkp1RtE+&@{&Ss6P zpq@bNjP=N?oFGgIM1(Q~5;`FnogxFfAo(K(+W$kyCwk(mO^;K??5PpEu@o03))Hg- z1#lVp#$-)z5)_r1jCRB-FQ=5*x;H-SwyHnXpQzjYss5A-Vaq~<4CkzjW#OFRa?Qaa zDM_ju74KNhohSf%?14C+88^_|fHOG8V8yyHSxd;A^}1^?;%P<TEdcHe20uye*oi@4 zU{aqu(GipSvd5Q;AV`o%f{K4^A1%nK&1`1>$W3aLRze5Z$Nk~}-di*Rc)*L%)?$p{ zf*3}uCLO!H)8%eE=5AgDhZ1tegGfz>g3dOUv@0ZkU|78Fx5%GJzK~8Ip0}}Kh~LIj z1$>AX5KGAKHJ%Q4F-_cKq!vl47As9sQKU8cB6rU6;|i3Asz23kw?)Qw$aY9pEQw_; z?cUtf%Pgu<qC}}$2?7NW*+(D|k?u*a@DXVAB>#}fmMrp~yw9BT-1;XgA`}|};G4G5 zQ6vDzI|yN543f5`$&}atkER&_6obJ31xw^6MJ{Hgci-S9zr(W4x&p&hM_}|Bk9HD9 z_hUAXT;kU!#*=~MT?ix)is3|#v5@Wv<fkWEgoqLde#PN;_?vt~Nuke$yNsE8ow0Fm zFuuWX^Hl;$A|D@H45mSbkb`fDlBYfyaR-5|n|5bu_H2tkvQ1Aba)nJZzwoWZ*O<By zMM`z&{sRzgnHfO1XOd)uJG~`a)mWxjoK<tytW#xK?8AuIf<Xo&7?{Bz2!SFsKmR*8 zDN#*RVvDAlFmf@9c(!$+cYoL(=3kpy%)X&FD$C(l%?ogT3mnWSfvs3OFMnq=Pv-JG z9c~K9$y9qn1`d%3iJXXUQXwHBL`K*$LQjarbz|5E(EkjQ!F_pb0m2qWd#PDw(c3SO zb01GgWn^R>1BdBPlCGu0$YZCe^EIC4^?(ptvHpxxMmwsHuyFqL<668^t5i2)8zmLL zQ2Q0we#p<)1s2^~Fvz8zgEf-L$(-wd-6vVK{D=S$K?X?%Vm0wU-``1TQrzJO#z;w` z=0hw-iwOY#M=V;N2#*k7DfPyUKwk+Q!0V1z_2X2LcRAB4;)P3_;LBj+JTT%dew6hI z`n$v=a5CR{lMW75UX6qi9Qb0?;xfl2Y`fhi|FF?+#$JM)#R?O=xwvAuh7ksiKOt-U z)X`9$7g{SdNJNsplZ@>Ql)T03Kk#<Q^ETN21Y+57d~lQ>8>4%+d`YEh_on_zZBZbq z0Q{y`z?tqDnT^31L9zyuRU=uWGBfXUX3o=P`42$ujMxw$5MT_oi2-b&<_rfT*BFu| zEV%4Y{~#F453G0a3f!-7qUL!Eob9DtqcXHUg$x2i{0f0VyMuXvGyxk?<{geGQ93-p z^S-q?zaT5R7x+*fgaibzY5~GGLK2}i2_eB#d=LpF%>TcO5i9x1Lq5^@1N&D*)4pbj zR%&PEbMPFcH4^bHj0cACqD4fhOKMIo=_@(Ma4zz!jIWW7G98jW7^8WoACV**ap`W0 zqNrNJccrQVb`pragV>QCc~*__2&X5Pt<9K&zp^T8kv!otAQ(&Wu&@CUXe~C7q5_}* z1lcU0v_wx$N-2>Kf`A}N2nw*J4`CpF_QrL{!L&%ceKmv+_JL0RAqDspVD4i89AIIr z+zB}KY1A=Em0ut`(~iL^scey77$;)w3rBpH-(xzfnnI?rs$@VU-7!!FL{j6d<BOvm zIS!Do)VjK-4vCgNYWy)DazHt(9R67bF}&X*t~h2W!+@!ukq|snuFYwJ2P*+WWVmGX zH66$#WX9Wn^~9Y1RC^3o6yn>@)LAGCKKg|?*cwW8tA=X*Q45O#8Hhc@5%(ISdpmSh z$z;wyk@u?in(sC1b)Qf|dPOZv(vYSGtx2w|b2TP2YUaNyb6wX`{+T!{ugpv!@#5TL zxsAUuMSwbDjC&v;g#y`bCJmYkWW<=)clp-g_)5Nl@QGxyrIC#=w5?+F<xi=M&^U#M zwA(_}AO2&?7zI|%z@RgSx~FQLa6gboMZ>5uD&%2|Py-{GE$CHSOXu}fBg<NGU|`=N z2M~l`)G`@HnWT>P!~ll}o-EfiVhe=wa-_~0j78i{wi1R+4#+=&T*E{#L{{J}73)Vf z)<=F}`Gc&`YS%SZhY+Z@B6g{HP_vDos{LjyMjoli!+c8q$QJn}Mr0gIl0<WQXbcUO z(^n|=z4ad3=3_sO;|QNeL~K4B;jrbfyuX!g@!{OO-qHp_O+%H2$8?g}XvjjG|E{>z zf6hON&Sd`FBmT260FrEsx*xGYx_07itany^S3vFxq7ZecCceX{G7Ti*55mHMaB7@5 zt>o^_)KP1%h#rXM`?nDcBak{ajb5S_ccxs}wmM7ou;}PwKm}eL_zKaMfK)9C5&KbA zk|&SkclS#~2{tEmnRysrz}Og%GPgoAf3iX{FsXgf9N`i%z?hJAb0LU6RzN_AJSwOO zNFdUELIy@Fi!Ah@I^zWadnb)O0x8gnmBoA1>8j0wGeSLx*kbb$=VLo!s!b7cC^FKg zS|Jd+VHUQu-bS;?v`M;72i1vEGZVb7nPkKK3Hx(}ac&T{`M2Qq5K1A0QPa5>%-eVy zgF*f)fd|-jf<b5r(qJsfmNI=kQav#_+B4V~W+8ZnUjb>8uRz(39zU%f0fao&5RoM5 zLdxlrRM4n^;0aydID|5Qk%^EQPP`NvIEB7PpfJDI#XrKy1m^!gPavQ_+LK3+142L; zBV*_RGZ>6D<N66kj5PLzY3z?AOkTqavjX;%32Sx*U9H%49_`uoh=|7)t>-ipZ|T6c zyy9l@mT7>pEbpielf(<r(ag2FaRFY;c%CyeQNrW~hVRbrAh418LT<*uZ_%WivY!Ho zIx%3H_z5KJ?_6a;*hTOnt@pMqjOi6k*0z}*Gm{_2H#YDhtmq9t$jI?0)Ef3|>IOo9 zK**zZb!NIePgzM4J#v^&WCynFDH_Q@c&EpSjb{Hz5X-xO12}*+pO7<UAR$2h&!dE- zAYBFfs)TX*)<gmX#9U)jEue@gNmxaO11S+2<^}!tls;kpgu{pIh&YdECnDl_#HRM| z4xjcZ5ps9MBtAbYAJTMI$;RkCW9H`gXGSk3Z{l^6J1xh*a*$!hLV(oG-@}dHq8GCM z03%i+5%m}?A~Hz}j)egjVx@6_T$JKuQN~w$UX2klpc`}}<hIdxs2yf0Wwsb`!DzP1 z3jB+>HBA?YJWo<ReN1NbJdccmMaH3vNWutVEIe}|tk*_~?b0JQi%vUD%6I`4XF9PV zeV-7LN|Qv=2-FdX>(snzzIj(rE!ILlLM0_1;Sk<nTf)=R{e{s+gn*XF+paUtvyIPV zJC4wKMjZWj&{drT6Q(9nlc>)M$kPwVQr<CdI5_{8T)Ul#OL6&M#u0R~%@Tik0?PfH zIckC1HW)Mv-5K|ILm&PVaBw|VfQ^&NW`(BqS>gJLXMu2lvG`;wI_{0sEL^;W<CF0s zy6wSy1XHxi@*3#L`11N;wl}_+$%~avZHPZYK&-1tO%k6(hy3&uN|OBFuFSdbWjsp7 zO0YGM@K+~^nmSQUz&c&dBx-Eo8>N251X2?sknzfdL?i@#66SUbo<7m39t08dH3Bap z{K0q_Z2OafBixacL7Qf`^TeLEW)8)w_Sm*_Q}{f$T@jKM*p{n%{;KtvOyA0@gNdW+ zU^>oZlDQ@`bFR2Db9s6Wm|U1BH*kSpTKM!(%e@%W4W!Ut5yvRA*eZ+Nofzgj!6qkt zjs?cI7y%9p-0CrCD`aRzP`^OpiwH0bX!}Q6u*7a=WO&_bO!H<9j9g=11ocd8LNcT0 z|BAM0m5`)UpC@E@_U|wm*i!Z$fy5}VWJVRE4xr4;VgCVBzZ3^kT^&lIVm+{yGJ1Vt zRx#I!d2XhH#ZW`yl9oi8;!pThgsovP7EEJ=p4k#=K}Zn_pGP>hU0ojGbIu)-qzanG z0xa<7^Q!;#1hR9>(y;a$ODJp5GRY)KoIso_*DINE{<|Da;>>mN=So7DS4>z5E52y@ zzZ*AW=ud7x+XM6?bASB`m_glH@b?+5q~547F$O<ZgXd&sv?m#)!5wej@U7?&2<c(Q z13ieDF<Q-^m-r&17BY81>=Ok*LwAmUfau8v3z9@6d5WY>>tMK?!}3-^;5f0d^W$6y zyW;?kPiDty1yZ+qBpfO47$MQlQ$-R;twcf5k8DLR<Mt>nvY8PI9Q}wt-z1S`4T&pK zga<-GNT}JK7GU)p$)S*ApO4Ro*tQ6T7nl&Xh?J7*qTSEwN%(bM$#RC$$;4dwlk3Vk zgUJ=o$vG~^s0O*K|1EfzQK}`rc=STzC2+tUyp5LUo$d3e-N$&u1A&+#oZASi8mO<Y zMLuuw6@ix5g=y@`lq>F-doj*^TIsF#>YQh(HzJV=CaRR3qLPU2NM?MNd4Nl7j1_?x zh0<XZ$eO{dUwe=_`=>x5q2mf#y0vzcFpxx;vEPd7T@9huNA)j85|^-TEl9B};cW3t zoGI3H1VR|5MIYHsM)*9>))BGoXM{qXz?M`eCcsKimTy|XH(0JT@0fJwio;~)%8qN1 znRtd8mV#Rbp5KUng<d1uppk>zO856`Vi;PwV-fo+7B;6I_3n@oV=(P8?Y2mRFM<PZ zP^ErcFF_9d5C=TRlLupZ@+7*&4-9+9F?fh~({2@lppX+CN|K`_Q6)XaiD*t9Bb!9+ zHF1z)P@H`r!{*20NH61t>m(tZ;wnoRfl4CvC!=_<TSm3tZn}xFrI~q4Zde*7w<QI% z6gQ=X-6VK2Z7CE)?6E5xn|y|k^EksHpCO0rdJimN>@=V><xl6we1+jo3g=wREBO;= z<_dCpUh#As!Z2uV&K7?uh|z7$K$xDW8=)UFvmS5q-bWRyag|q$r+>=K#e-200)!X7 z^@!19m7pC)=%s)=lmI&dvPpdkj&`}n+m>M@0wbhHL9{^qU>Yy^GQOlggM^S!D~Vrt zkvL<@2hZ3S5t<;eCBs`G_N|0&KaH)Sib9+!n5H(bf)dL}lEgA*deLv+-V%3Vn*NmW z5J@8$?h|nc!ckxk1PFKC<7uAQHsN-CMmWOf8H$K59DQWHrHspx5?_=Tmr3)2?%o#f zm<A}{5R-}OG`U{U%$1Atzf2@?u1uUOBulc!@2p?i((7vrVXzThkx@Tkye_W>yvF|$ z9xj2RZ-7ls_!Mz7<|bvp3hcmj=qa{o`&(Ua`}h{mOzrJP1{*M!_#?}@Pcp@yqnm?B zl206^>oyNFd>B`T9^VtJs4XR$H0K4@BuqTHoT%~z#Nx9r-;9NHUqv_znSy1AYGhDb z1Kk(&glO8XMZ%vf90_Y`e`WCynH0==d@O+lM)+ERv2i#u6r9nc)3Jw-ZI|85o#5RS z&6QGs0V_X0W4wDGbDE70YkJ}&X*kE2c#h+F#^BmzqGGbj`~6}(W;duAvlQ(agL`Du zjJ^xj%nH6O=1E%r?Y5@|fB_Gq$lae1a3=4B{~SAj9RRGfTCOi3>hk&kq}q{6r2u`G ziQ7iq7&95pTW202*066(Etzu2^$Q(5v`CUe?!)>Fo@(Rx8>GYO7g9^wt4434%#sc) zP|X^Ix--KZ5Tb+-IhjW@8{_+5=q8A54e?hJe;A3hg!Z^2wj{)5KK6uLBp3@}V~HRf zgw8V*yJF`IpGWv~I4oNsq_=cy)J81woOHg<`?qD~CrqbJ(m1M?oL7?9>&nD)5|h?* zF6PRGEDa_N^3~bQdSA8})@VrEf`xHC?q_NOZ68D>^qabm{fNRt1Zh_3#l*dwL-H_w z9j;U8*q><lc-oUSP3A4YhZKzzV2o^TVgsVZ%Nu(>b9vfZ-7r-eDPWV>jHJ>k(;*?K zC0YTAzJ;06mcyAQ6Er`Tk|ofv_ZU+UBHCz^bG(B13e?)7QDDX>(3R>iR7onJcAv0Z zzJ6`=VlmAZu`tb=EMy!+HYUvzgcjoZSREueq>4>GeTKrJ(6+};sAI`x3yZR#Onn$P z=)>MIEK}2Y!_$dUdZBR~=gNhtNtRI0u(iRPG+*3&j1Q#9_C$}3n}^j;5&Qym%6c(s zx{Rl;ZWForB+BMW3}DRYZI;<2f`aj-T%X{0vw>m=L)6tM3>S{kSevwO<`yiNWtol; z=zU$Oq2Z$$N9@|P)FbK}KXVc|T=#6|DJ+EJ77B-rSM!QC8pY(FK7FXZU~WohB`-1g znNwVC`oI#LqRsjt9<1^517Z%=z_Uy~61F9bma&*1fv}lPF_)ztNSq-KT0RqThTLS@ z<~>r0jo!LvDBqBe<u_b(H{6qji4zG%O~y$cr}OG0Iv0~ML1xK!^F7|k;cpng$oPjD zB8*wu57~I&LJTi<Bhrj*!Qj<Ttc}f!!&nek3hn&Z7}0JsrU!HXgN9*t>b(*t$O|X_ z@^vHJ13;aV!!V>9o8?{OZ=jcFvZ@B3<3~`@!4xkd$#V)~$V|g9&(dB*U?jdWwlH@5 zzhoW(0_NA2AI8Er;U%7uLo69y7^x>2jBWObt1N$*Pb8B!=|^N?B!m~YS=2B#i-ow_ zQV%4#*>WgCjj$YqBoTT`VX#4_y>pHxbSn$DoNdy1NA=Vu8BDIkxj4flIQlr_nNUL* z5^jsH#JgXci$&x00->c7ps(*q+$gb@&EV4pwQVc@m+htUQpTH69;hHb*liWG(eW$X zBn;^BQBt}TSmLp#GmB+=BgPo9nWaDogvW0RTI}t;pkqFhV=Pe)Mn+qYw0U8glkF}d zu>{skarU}{zajrsaEz}qq`e2h*(43*gBV}FE`P?`YH~p=sbqh{)g|*BiZD$J_ag=k zXl`4(GAcNH+Of+aIku2!rlpiCE>i&p`zlY~jf?U#f^Y=h^XjyYfh(9KE-^!RJWict zSkVSef8A{F+fSb+?fHyi#DD?zFQ{j+9<!5Ph;6e(h*tFr8j1p(Getrs0An448Pom) z@ETtqu0mcWjCk7!8Tm}wHUbUNUChd8epoBk<1;vTpH)9WinAd@l8i*p@Qk%TF(xmt zzh+4sR_I1qZ%9VeXPAfBSkc&T?dxo`W9&4E6hsN<cw~*G*3HD#c5{_XgyV&L(>tlT zva<Uzngf`}MnpMOp$(tA9HEA-a=W75ZGkCU33&LX{7IA>m)TfCS%cQ}gs}Km>YQA! zXfU~6iB}SrW3X=H{<^tx+RH^GT5K?=r(NcIZ7yOpeiftB5t}geyDVAJe-SK4|G2H= z(<w>4GKP1!p>SeIfrb;@xx~n4kOH3x8l8Lw`RC-HV;Ht4K0X7~-eo?3Gc7(yhzV=9 zlQxf}%q)kP<S1{!_%|>S%8Z6u?Xlb~_T#PDNxv`}(kP@ysgHJaV3mm%zt*)as%Ct_ z)A*xE#T8)?Gj`X_!eUN5P(uhLS$kIa^e)FP*`WwWTC(f?-AXsD#6k?yV)(S4<1IG2 z+4_(PG6|+8`Zy;cEa}CpU{FNx#yr1ds0B}+Ov>J~<(l@A35cth)p#%XU<SLIW(Els z+(~}n{*+Wen>K{}8E!}6#Lz+O{`M6Id9lmt-{8$GYrK73I&ts4p-$U{sAu?)P+1?7 zPEV#wN|YqF9N=6rh@a3zeAa*miHZas0RFAyLe7E!q*6&a%hyF>n@jBJ#hBWn=yvIg zx`^;+5lKSmA~+M{L0XJuB%U-F8zU?`a7YgO+$E{Cu-(@6UV-UKi1yu+FObi8`xcff z4Qj%YYijDeUdaTmPIBRJ8pK&tC~r(Zzar<m{NA}aOqbE85G^u0%RN5V(po%7bs8HX zq$dE9%8>p3^0$i!6M;&&ZQQPcwvLMS&)fz_Kv331aS2}l1h{=ohnL*DLFfTBzAoTZ z^qD3EN(gTp(=-)7v`8NBGWS#=uqHUbO6=aucM{M){vE)C7ekmyAd+Ai8F9lb2v(MQ z&}A56!IDru{Kn0sEw)4`=cTn07>iw!M0msR=gxb`5jK&=!G0MdWr=CTqG}TLc>(G7 zNE0YwlOK?29<vomJQJ+PLx(f#F`*W}>~4<w3eGQ)YDKT{!QdY2+UL(-mxH%hO3OA! zz9yP_s<aU&o_gvCV51FfOC?N58+KmD-sE~qG*h5X{?(19kKu+-3bzNOhQkK{{g_2= zPY4OMjR!9$Jy=L}6|#_xl35^Dc4kOYCdol$>~VOk`2}K;frO&=9)BPS>W_EeyB=e= z15Og+3l?-tGR+EVvVFbD615lp2rq&yLc?eJolP?dy$klTM_Zzd)rz25Z*T2#hFy^& zQe_QGNqN{*Q@!q8A7N|K+bN*D<wL`k2ldnm$?MhX^?D^3Hr&PJ@1m!tS7!nFG=@bl zZ`-l7-sAGs04w%7x8ZJ%9mor?ej%E96V=l=(EzJ$p`AZ5*a3%0bltK<E};JO!idoh zZlv;0XUha=ZX+LNXCB_8EYV;6S5%s5H%eAsc{4|u$r<F*P)v4lrWMBV|Cneiz6Y%C z)VRW3@h51B7Nkq^(`gb3v>l+O@y$?B)ciq<cNy0RXO3B8j3S=0u)BP=ngNlWCU_4i z-ZJFavup{Kt868LGKj`a`P@hLE%Ur(I&G3pXNkk$8K*-%9utPg<M9|wx@5s$n8-)z zXv6b9xF>!4nu%p%_67~tf$KG!V5j4-WYAhsqnqH7LItMHKv=4`vVmWR>y%rJ8w~9X zPC!;;xs=TqgAZ^;XbS;+!#*kdKwm=h!EWIeSd#_DxV^(aAcr%N5P1uRm?VziL#*3^ z@B+ty#Xm&CTnFTzK7BTPD{mbG$N0cO5-gD*#BwC+h1o$2sP?PB%L*uB4mQT47_HyM z_=N~dv~cdC*=mteyhm%xd+s7cI3%U9q~vY5+y%-NH|Qns1DfUoIn5oHoNQx4($Q&k z`p5iL5Cc7!4IkW8_<-EH%gdj)`RyO<0Coi206PQvj1abUB5l=2<Kc}!AwpQyer<yJ zCke+p`b{*WUZUQO2Z7Wig>IY;fqalK__`45yUp4?$HLBYW}G48dkRkI$@swL=c&bf zbr^92|0RiP6GV}Sn?pC*&vB907^2;UOseXBE6_xZCGBrn?NPR{5Vme3d`U#R{YLuW z<|!8|TVs$?s=%_}-{0SZQ+3+*DTK=wRGaoA;6}ah>2qmHws}KLsKIoy$f<`0lhnfr zXOMEa?@@knZ*S>EAN4>6gYbN6T(V_q+ZvAZ2DrXVYbKwh<H6SmW$Z2f&^Et-j!%lg zHCknd>olyg>gR#%Hs!MmDN=*{a{v}bL3^Vyj5Ri5UFJ4Z0%H}s4F+SrA#$Vw$w7Yl z&dDSv=CC|7M5Ff><L$tINys|rU&FRvwbj3ZPjRaRk~jsT-24an5l~}AYv`AA>l<zN z9)q#I$vY_vd%6~Ll_?{X!nUOS?d>fsYp0W#NLrpslyr3C9Ekeh{Ujf7I(KYb!7Ku? zbn@y%6Lw60AFpOx6O(E_h0v0~7gNk}35WX=qzqN@jagUQ0FK<k7PnY!6|_<5faq>E z5Emp`M=jyh#pEje_-Q_2I_(;bY1_RTAig}(N3oJSS03y@UXAl?ca01xmLZTt<OAIt z*!EI8nu)}ai9lHRs}GnMv&oiEQTIcJRp7|@5rmm`Ten2WkY?M<GMkwbJ-YlLCGP8N z@oX9QMKF`6kD16NSPN)NB9LucU@U}^en321ljc>u^5IMWWE+q26QU(1rB0Ym*R&={ zUW78e_`itT-de__CZ5ge=e~G?F;~HP0oNbvM5MCL+wT2f5spg{)9%j|zB8mK>Idv_ zoxf+b6?xxfUj4%hDf5y1a~RgVyh~iZ8eoT-*x`wJZB{^Di9ISIB);)3Gk%S6jB$MZ zK;n!{YPgA*0-L|SJ8_OL>{sgSM1)uwNqcF`!tK`V^bSP@RDT|II!pgy3FcXNn2SUU zWs9<vU;rfx+*YKTjJK@!vjS<y?vv$mA1J)Mcg)&H_1f(0^@Xsqrqc<*B&b@JF$q!2 zZMpU7Z#9F5?E@)%<|bvtFtgvD&xNrcVmE$=F{{CM29G~i#$q+l_9CdDNGuDS>tOgB zl*!u8_)$nL0Z4$)Ojd(&50*ni%{<jx?UYR5I&cec_z+i$O#n$w0i-kg%Lh0q%Z0h% z`16z);N8?|cOgNEXG=`|GaQ}_-s97BE=gW!BT3A~_H5=Cre)oI#e|>n65u>k%I#I~ zLLe|MQ(l7*2umpmzrTl4lCXCS<+3PGY3X{3a?*JdAG{Se+)SQnFby?bCe%DlE$ws~ z6P!*^p`;Z5Dsq(vP-B`^<n#K8yi)H2zL?F^_toPEywQnNOH9*?YyigX0CwQ|b-;}} z%`b)=i%$Z}7u?y*_y*JPqO`TasG_~7utR9LQ2|pqv;ozu$qKj$aRd-wWL(p{L*b00 z(ulFZUaB<&d}H3ypfSEMy%E4!GTe?4>JNrV1X56ChF$RN9wk`Q;u?RmwCQ8gr<y4d zw4-ZeHJkEtvL7KLr9CB~ij?;(qf{c=0#N4qe$7gMf-TFImK+ig%H>X%dG%5og29wJ zEhTBTP4n%EhrO6Vs-4~Xfbao)Fkb+!IQJV&W2$eXGHK4s^h*l2t*2EmMcmNyIXG6q z^{qK8^q7nI>@-=83^2YA>odr>UxH<;y%a5ao9h)R;dTTb!o2V|Uszd@ydd!;W0KiF zYr0$Gjafwx7z=qrFo%snvZJFY_g36>415yOiAa)(G`QPkYfDkgJ?&O@vlJT4fD|#} zEs3C1wA*WhQQ{{cFhasA+ZLg$$et@Hi|N+|b-O-P>I2J11TX|JO<C4Z4lW35`sTdr zz7)@Yi!X0RVl_HI8vXxS{!X{Qj-3tc6bWQ6<~#6cnhB!qX=vA>?FChSxNcxnTTHS1 zB|VHg&8htfU}3z}%5oSW^%S2$N^Om2JlW5u@g|*)g9&V>uf%r4%ARZ?NF+%yW{Nah zGe_JIBEBjN4%KQj5*>d$i&pIBj`3eaq#-EDkfPZOZrrDqBItcxkc2J7(!UbX?pG+m z0*qNX*{uAqnu@frg+=eOa`jJ>OAYWjz4qBdmdRVD%M#M0)6}F*FpZY=Fa|Mwdw{=V zd>$7fjH_iS)YBA$5qrR3jlrmJzC(W$PMf@dC_e<K0#v{d3qS>lJ88#<HiqlipR@yZ z1g;e%6QiGzLi{;55R7+Cz^z^jk9#df>)z_##Q?9<Q5RcF!=~;6k8D<WCnOo7M)D+U zF;j{77{t~ZtP2nE=yku`u~k^iw*qNxi3boGhnwH3J>HACZz4Vzhh%dR(Qd0=Lu&+j zD*E!&_5`+DGCfn5d3Nhd7U9E@(BxB6rVXjbG@4Ft8kaP%oWC&v4>z9qG-zPl`&N#x z`)@4cfEg@-Bk3sGi^=<GJOfNm$*-6U!_ZNLSN`j?0I+Zau2HdK^X!&XN(Qvz9^VCD z{g2LTuRqDS8${gUec07e|9=4age?LW%&h<ciVi!hz!}^4E{>s}CXjO?Z$}omD#yO> zi1}LbSr8%ul2Ropmcn}?c!8Sf)d=G(m1kDq_@#OcP!=dDD=D|nvzRm$DNJNFrL?5W zfWRopmh<%H=jVtu`e4?m0`?(kfO6p?gojC+u4&5YP}9qUbfCQNzH43{>d8_Hqth3L z6fgKJoQ=CeOTqMK<2RdXCB7If26W6=nR%ijMHoLWcG@uvz|vok9<@9%q}`zHy2WF} zlbNaLYkbsM9$u)$T5RFnY(^~Ze}GM;<b~mG-^|iExwUjSyF}P<B{(HGVMjttpl!#7 z(_R5<u#L^WabFAhBxH&kksQokj5iu_VO_CYh%tI2PHFdB_)c3`K-r+S@JfJ`DEmoa zm4%Qns5Pih4;v+xr91h>+cJ?iWJ!57Ne9bP%1vlsN&Uh1XFgx9@%IFbPrpS!)91Ff zBC=h33^-s1*qUK#IWZYqAll}$WHe3Ejx<KKiQ7O-3o68TYa6bgn9qrVyel04m}|d3 zfg2^jr{7JM*!|cS=569&u@W$>C2#U>&WMsPJX!A<8SMzPm2rc|Z@3OzCmGPXDNCsK zwO77lA-8kMzL5sxB={mdC&cvIZSDk6BWPFui;Q@PG2$(#SPi1LvX3ZFYdW=%SW3DD zwe)qhkUo@ennQlilH4-Au%s--tw6C132#(Zd@}|<yfJReB|~>$d^hu7z^I{pWQ-@C zmYryjao$&q!IS<V+L`VmXrtp}zye%X2RmJywE2l!$HrH<QS0fm7#&D2DZQqlwg%|d zJhu&Pzz&6mgAzM4@|JDz%0Iw%OGLi#?EMZnQ79fQ4vDku(TEkuIgK)6qrf(?Enp11 zLAc1dIE;`FvQl5x7`J3(BZ?iOx$$}(K1CWbTwAqci~xfWFt2jUF=aek%IN}{BH^+q z8)4%F3~0Fh%h6a<_ljTGI|^*vPMIdXyikT<nrV`TP&><YpWozDhDPo)%M?DOd@$qm zxj#}5zsdoBH~6xfdMN@gVg=Ne>gdEqLg*?8(QYxGkAQ`Poh!x~m`<ys=IQ&vIu5PR zL!bwX9PsfW1=;IE{y9F&dOZWKLpmVM0$}5|uYy0bo`&dlOY%1aXaR!}(}>s;!)N5} z@QN5-^)L)<I@d?kI!GI@D!4uv_emISfRtR{Xhy1$M7rLfFl+2cFt$`l778^3GeHTo z(XgRxD9`p(7N|c;rIK<*7KT!LySegMdS9@9@opG=$8E8;Uy30ly(0X?cjw607zvPX zFSXg_`GE1ET_ZTlpE8)H;`+kO!ri>BnY++<D6G=tw3*Ks?=lSn($-_Hbzte(!NY<6 zof4;yVfT41KW{zcz%`8za~uMV(@X3T$_F3%`APxT^KN3DEVj(R_0P#*MP$V3uVe_* zgr6}M0M=O{N_SnQr)C$(Te8c@)8uqH0Co`6>kPaC#}qv5)D@}?_$IqS%bIWB)9!b$ zij5KNo?y`Uv<X9-HCASmZE4N~Vo^@YLMd?DLSQxV>fqb*<N9|DcqcatA_+B3x^|Rl zz_3h6Z}xA){IJ-z)iOl;K8rESxKZ<Ore@Fb^rm=Jo1fGk!RQs?(=k#B;xmmvqjOQG zqYS42uGs-D4qO8)ykI`ou&@BS#A;&J(eP^d@-~A<(XK7jpf&+E#xS%DM}JK?#Q6g! zq5O6ek_VPqE%8Bk`9gs3;O}&R9bg%g%s1ImzV^D-_X_M9;qEPX)m$NN_uqu&2}X2} zsR{KE3%jkl<2G#~M#U1(Y4YuAhQTe%<&*&_QMORvd6dlF$IRZd`K&(ZH_<LFZ(3kU zNC!&GwL*d$!rIsN^Q^C#0v_ymo{*z6ZjTf#eR<cv8?JBUPGV<5-XS{TJ0FVx%qnf; zZFCGcoF0QJ1;DV1a;b*a3kDdFR{TlQqdX7eg_KLpr`X2r-l`TOG|o{Q%#^LZcbB^` zxRys#cMYt7d}4iNy^Oa_dl}~uw!kWgEsVkS>wuE8j@2ZOd>EtA*wYQLGNo$g!tJg( z#$C83hKIPAmg_6k4Me+*3fihgZZRzE{u%^mPL<s%Q^sY=N({yzfGSfHrPp#kH3$9j zQ38frR$z6ev;BIQUN5ls$lV;@6TT*EjL*V>xkO`;_qhp9l_!J65Qf~Ovv!F8p%AT( zZ&Jdv$Pxr(18vYThcDIi(CNu_z>4Xwg#&TBT^QiX($8vcmu{qd@EN4s8=9<>F7~;; z5quG!VXv0A@ecfzmAt~UjAv*SKqo3_t7y}XpJUi$?xo_SgSS{0Qw_20eS<^iRi*p# z{>E;yNymeg^_wC4+Y^8JTW(dm2knV4CgZDUkLPnAflvaTK@BBf+D*z$Mbb){0BS7~ zP~MndV55Y7!#pKTC@DiaY<LR(^l$fDHu9;N@d9SN6umQE9{To;F5LedxTeivq%20s zJElsuqXeaB$SiU?kH_FZ#2YOL!G)ZSc+Wh5fLute<^dmoG;^}W(+V#=)4QkQb>h@u z76YFQS43$s@5&wASKN3Dgm3VC;$eFxpYweD*f6d(v<)~+hdFizP<a6iVD*eyuk>eZ z;@hKpeU)ym0B3H5u=3mOgl3OFYR?3X^<;V){lVF3Ta!{D#0!D+s*&{7YI6J`7EtOJ zT3#QrsqW4Rc$hhT!dETwIW`7z(?gEMQl^nKrYX}%AiZ_9@oUAv=i&SO<ckpkG#IJ- z)~B=Dc7fts!(GL5E#Ki}JK|kh0UT~MD%t|f^4hecF^`M!s@y7euF>dPPV`G&Aa9os z^8oJYoOw@gW<LOZ{ct!mY4;kG#~65B$PrND9a=Vv&{h3!h;9hCZ}MprJh+`;3<N?o z;{!g#*@Sei>q(fheDI3bmj^ovYXRO<Iz7CV^&Y2K0aC^XnVEQIy2)uIochTJtY8JG zzyi!J))tSqq~-)cEdpOg(2f!TWsN34qkoi`OHYzd&vCyJJ39@qC)i*GBp@MBmdhz~ z1a^LJe-HmeJ@;99QompVt_uVBAKnZy9L<T%hL98NsmHPO7--Px*{gth479R|wvI1M zwiVvrK+%Hw*Z#{qpq5_7XW2f8Il`c2W1h!OMF1WKI0e@~1A<q|L%`hzuqTAGnH-Xn zi17r2LtFt4+QgOPU<~nPHjtN1E6}b5fcH#2a&Tr|*#H;rYn{w|XO6MBAq|u=8209A zf^9(os;q@*w*@(>H?h#@H<SRnW)tJyFu(0HC_%$0!P%~cm}Yhx^#tYD@QpICwl|_A z{1i8pP;N16oG)je0KCJFPw##3;foZ+kulf7s5#e`2C%a-gUu^!#a=+ifGaFIesp5> zr<ngZqQV724>~|A1NoggbDXz!rwa)u783bPj+@)KOK-PDyENtbEa>+&PC!YFO2Zkb z76ycxT_bF-YTb-$Wd%1RgB5vxjQ=d@>=i>*0c{0sGEUlpziMeLx|v43<2h&bKCMZ~ z&EZV~`^F6`92l{8NMX?QVz~_uW|TD#5IDxTjY?qB5VOZOT3e_-jh1LUF-!?4gA>Zl zFGI6=QUWm+&)2Qr;YLDs0_kS$39>{tD3`tC@umF&XkrKnIO%4$HyfW<PW40?EWG?O zUh#7M5v0Xrb|XFzM6c628DSlRjvqZ48y(YTf1|0dhT8Jf4anIncso3{y19=-aHd6P zc?aX=-H%|O>jF*efK9OorgVD;ShV*R@cKzN)U*&e5P!^j?-<bn!i>6&3Jp#*m@+4t z#BI`w8N()kxRaQ)u{o4*yH8Uw*BVm88A!(lFNxW1z1^#flZ-K@9kG#$Hv%d!0u1KG zb5f?SeyTsZJbm3!e)vnVbcf%rTlEuuY1fY2HP1W+gw>a8NDghVS+X13Uq<RhVnOA8 z!eEP_3#rHJDy;yE(g8~YTw7o$po3GMRb&U?(Ie<I`ug$Q#wX+Mh{G4Hq~3DtT!Ur; z&HwA==M#etDltdgM|3<~pBb%hJ&NmG%ko_Z!%nsTIZU(zkXJ!83$jOi2Zk(yoMfek z6}R22f0o-ov6BIKz;)pIb*hZC)8w?`);X=ryNs_&ro|TD<XXVW9FO)WFl9r<KK#V( z^)+vEo4qEoOVOs&8mpi!_!Mn0fDi-FGh#i4VPH&Y>+bZWoB?MGKuxrz<XJg~0BR*} z&{x@6<|$8v6;Q6e*0o7f@)K-aizi>4dboyBzeLZNZ3xgPf14_me!w5VsZZ)1o)(CA zbF91%&`t|3c=UjZG%n^dxKwewC>{^~6U|sSID+0pHl^bv=|R@*2)GGi8^`ukV$LG7 zSZlG28<F=U{BS6==r3dZ2G(rWh#?GdGo+^kHzQtI?)>5~o=^oU4CFZyz`Mk?*dVRQ zfPp8bZm49rdEDH&SGZr<a5g1NHf|`qr|-8%hnD<4_oU}-m5R0ywA(6y(HY>Nt%CN5 zTMU4j$tk-${YqVPqxqQ@<#nc9$?vjm`2?gt<kB`Q23Ts=D$SY$+#H)PPXN3hW=@I; zZQ+h+qsP9D10V+a7+j1k{V?-{`V&R@<eb3i1U&{+JU$HbqyeY`5nGQz#qtb{M(drW z0TvF)f@wii^Ko+fowp81ksIBle8`m)aAN;;7-)x5{{myO8~2sX3T{3N^F6ES{kP^< z4Nw4jKF2^2!|CR15I$_hmYZ%oIBQ<nfcwO|ISFpuoGiNC*UN|6Yl1l*W{d(<7!Zp@ zZag?^R?{e(J=~THD?vm3nQWyl!P0eJejadR{v=#*02KL1zTqYUp=3FftJ@R)!h|dR z@NZ1f`kPtsTU;#Tn1E%QYcD_i)e{e5(#flkyW{n526XaFYcY);T$Q1TLdV;8I$g!k z<1<f}Ri*-+i(JPKNu&AEEb+Mrkb81!iv;=_3t-{IwB&_Vdj<Ek`u|-nU(dv#@I^pG zIu?+vD#L2lP@e`37CyapT3|;!gUpZJ=4Vf`a`LZ+gV3Pu67L6uR;WQcO-S2<7!{xj z+MaPB;_1=#8z^XhnYEZ4z)5*>b(!b&3i>j(-2vqAbAqcWDPhafY<h*q-@v;8G)Y$q zTmncpvWds}5X9`N7~BGUFkA=hJdCdDwKDB?$U3i-Ghuuk#XVw{0Q49Xh<rL}uezru zG7kHnSyY^N&O>}3o%<htZPwU4&z5knLR<J>XU9znUME(`ig%e0LQdkXhkr2ZQ{?lt z$rP0;(X&%_1um8Vx>t*x?Xi&Wj5~(8*9c$an;~tcjNKQSEqdxR*K>sacALQ>Wt}#? z#DydA6vOzxCQ1X*OJoVaEZo_eBwfB%&U@$CKyE?Zhwn)aA>Du-Kmb><2YGJs6UdXl zJBAcv+_ErjovV3S>mlRoV5hFc$4q8^2?06{)Z?N}{15{jM3*uSm8Sp21FxT8#S`RZ zOO@8;5-;O>>F!PqffoDx#^-u=;0?xC$Q|nC4A}t9i}=?V7~?S)JWv6OzJL;UJTNP| ze2SxC6TEW|uCs)z_R*}PfpyyMtyr?hc<jxp=+#&if@l+Q1_KOwhR{RIT)N!3`qx(h zIGIWb)!$dEp5^sD#Le8lkFtg;w-U(VO@AzL;8@TAe-q;l0cM-F=*ws2p$@iDuzvvQ z!Aub=+x$`h&i^z*09kdQu&Y3brLg0Nr|*n>>*lYq3(V8#T>sfKNDYH{n{xxA!0og> z*W#18QeszLxz>n*<%uDFk&}nc7B0cl6OBL&+X8ebu=4?iC1;#0@NRrCn4Sgvar~96 zbbL1JXo|6p52U~cAl34>iSct~7{?^WEG9+I_yDdfvuRB|g`_SG^CA1^$<k~n`An_n z>sQ|5o!GJ)QL;>$Ky81UEcw4RK9GAy0-koMeFmvZx{d%?{^$2%i;?G~*c@U7BHpl8 z1qHOo_c>;HddzjeVv$rE&b5VzZ^=s>d!rJM^T0^SpZx8`dKD<P!uW)7@gR4qx-!`J zAs&2<AL6TCoNN5u_xMLFpGF=bEf%lb3Df)mHwO+TKMv+Nc)Qmf`Kf}@8A00+SoJk4 z7(m1m^BFYEss!axnr-OWFlf5d@h4F7tUi68F5x}uL;CvPld#R&2A29}?0*sBo`yiZ zxNv)suav7|1HgZ8y67uTFy81~)S#V9(X5hXZOhov(!s*n*e7#%9f$AX&8|f#1gN>k zI(VI)`2ldq3)j~;0amgO!g%@d7B}lv9^hG80SD!|nw%|uj~`9~c1Vxw4-1K4P`fcu z<ve}{Z1&CDTahoY+`JnzGSf!0^dno@!2$zqP<{rO<q4b|PlI6{>FqMZENYI>>}d$l z`WAw#R(<z<(i%N^GkJp?xjA`mkCOEEJ@yavHaz~i>9>Gzr0C^Y)8A(te(>>7CJ%g~ z^Ko!I231BGr>FowUd{qvbfzt^ETWW_H(cV|q~BNSx(@mJd-gs~rDcu7o-){!3D|Ox zJ6-MTODrOggFM^c?6`dfD&P;ej$%3s=9RdNJV(@{EbJa@;Pvd!+#k%rhg7pY>*ec2 z&MOkKYXhc@(p>%&W@zAI7Qz0XYj(`4s+v?TUJMCb00J1TpU-`Kb3U*H@F-a)$6C1} z&HebVz1Cf3w%ZNve=pvQbzuEk{>E^YZ(LblOyc;^-qwM70O9B_&pJ+ddT@QQXT;E4 z%WhBp;bl~slxm($Vu}1xkm};o>elcSMc%&CVk;(U<$NMXv-$S&8gC?Yk`W!Y*Tdv` z2C)O*Xo2C?gavPmi)LJQyvBk)*z~PrU+z2LSJIH9K_JYC<`z$KdGr>IG)xNUV!^jo zD=cg!IZVFvqRVU9!vVO9(eeFrx(^Nrgqx}GlpG?fJPJs!BFA0TfAy@!wIlkNIhvS# zY9Sm=KUV60%IH6>lon3s0|9!>EOOH^J<H+S%&*(_6V60OPlZRXJ&WI-E}_+&b1o+6 zt%r&KzDL_#r^(f~{szPaJL~@fWS2R1-nj}dyYf24lvaAE>u`N4Xv5P0W(>wLsu5f- z!fiOMA+H5=n`q|cnLcA4wpf9^H-EtU5aTt!0WqS1ds-a<oKtKQ?TC+tp$#qOGkP-Y zK*vk3N90>voIESd^CU0`n5f>v*DHNXa=s5=cr&uZEOibF?ugGt9Qn)17QakeGuqaE z)Sh~Pr8elue;~Vz^ibw5$`&xf)9}!aqh0Wr`P$&htPZL;0`PDaT!{fuO=Iln@N45` z`~O${LaZa)x8f$3hqp;DC%SPe182_wIGI5<*YeJgJJieIH-|WXgXXj`EyfezKtp4$ z<m%T>%$t@SmMy-EXuvgryaD_poML+B08T)$zXRaY-|2a%;}E5DV*M&Ww4nvy$6$a_ z<)8b>gUeePFVz!jMwcfS$ZH<>vN_+|w?f`cfD$O7j>prL|J1BRUZuy5AKv1ZW{A~i z`3p(g3hGO^I3u?To>{k5H!r?se+mb#v8OW>c7S3}n{zpR=Ma8<IV9Y~r{_ereiRRO z^;0YjQka%pA+depf;8UVEZbb!z&eOsc?G=wwNG)KHCFNH00xn-5a{Ho0yCZpih#Ax zQ37D6;0$t3zTdMD%R#O)vBvAKbo>|k8<2XgT`<yi8!(RnUpf#1!DBMo(t}uDm0!r} zIiB5~P7IA1#%nsiAKy8UJ?-aa{O7n*oB)R?F~(=K=@xyNaMUq0y_G+ayxTd!8(krf z9vCt0ICU$yJz<9jZj3=YJ-k_$E<`p_iEra!aL@Wa=l`A(UnX335bUD<4@E9Fw^zV> z#9lee9qQ%!*DpE7&ywo7#iyYKXvRzWSZ7PRjPQcRLwZH}w%W;^>JUNh+`Pa1DgHo9 zQvHQm*WZV!r0oRIt;=2zUX0h`{?@-QH^wU%WiBi+)ewui_^As&A}(?>o38u{rzS2z zxF#-r2;d@V=Hyanlg(UYiq&W747BtO(t|gqM~k-b+D=z?<GncNv}S{f>%7qsr`>)M zOFW-ql?Ij9K78#$mAV9!!yyo3Ic~+d`)g=gs^vpr0|@MWGfeKhi9n~v`00!6CY$-R z+_5u+9Y|-#e?$uYcPlUN3jGeS`75N>^>K<o(dToqK3BE1bb7?wr=b~5>uTQ;16oX5 zuhjUW`~q*^6G@KurG0GXX8c^I{+iH^0)ljH9WMQ%faN%oSbS}QCDT5T`L1#=-^5Ss zXpf_q{0mG&0i;=u>XHJ3e?h`^=Lg`L_&xBmmGmww**EZ$<68k=VoE|b2U&|Y#M#cQ z0rZIRI>yJNa)YHaF&6R*TDq30I2YhL#OHUA+@~P`-VpjN3*BV`KA$PoNHaq4c$3nJ zMPDyHVt=J|n&Sz&5Qt@oo62|S3yjmoqNS+*ib+=H<{4UQ6D>-TOtdITGNVNy5)LQF zDxH(1U1+W<raqEMf@39SP;yaftZXqTXlQ6CMV+_|?mF&*Qn*cqc#A?LtGFr}6`Ioq z_pLM&irSLkZWXrSpLnQhEB%;Mh$PL98iFKU#S=p5J(7&VMlg6x$|<1eEb3VXCxpU9 zxerMtTZy$C>V@V=o*5@I*in!{M_nq~6pHHg_D&CDt{n9m{82a_#fA=>I-ZBrOs1^6 zHVE+sp+k~nMze`DYWgc%6}deVs)4dMbqtY&!Lhc~;<{EXxT2~EuBh%|@PLXzg)`Ad zIck)I*FYgzM>MM{)P~dM|7}S$Ng+w}g3!JL^<7AsQ;U<0>dJLT^MIl%`!`uQP$>3b zn41)ZE80VHAScHXNp^z1YFk!iSw*8INU~|NO+wKRgX?OOF(kaUY@Hi0$1NQqIXJXZ zK_m$c=^3kSUiiOkzUjruHKEKJn_^lpZnAkb^PfMqpkOF?QVvHShdOj)g~o)U3F`+X zlQbcc#dTG0WyQK-ZB4veozHbz+*JLpml#JXOjTsoD;+!|hvs@WpM$Fku4`nZ#;+R` z4bojG*wbKxgRGBXyfcB@8iga}5_{)TNU~Ic2{SL)2L~w<y{FX;e{5bgIRXRQP&;<n zbiZyy$><*<LqU>;t1kE=G6{u9)m3AQf}?I5JEK9TY|NpVDyhck&`uj3;G7!UD<>BP z9bNWp3b7lECGHVCVJIZCX_;V8aI}U^fkL6t)OJgIDWlYf$PvK>xv}ZEh}2?(UK%7> zdL+0e7{kmE6C=y|mFWYEMuHi|Ein@pzKkkMh%~dZb@dVkPph*Tt(9?=wY6E<7Iw3# z$+<YOC+1PzajXVgmMHC?Xevh=v$Ad%rTrD$q-<=Q;-dCEO))D&dzuglgJ(3&)`M(r zkaV;i3@&JJcyJWMF~BW8(bwlvQ}ap^lW@Izk3qpZ)Hl`U<UmT+(q8LySuH5{ScnI8 z%`pi2+H`PWQAj38vTv-8Xbnw~;4#5BwO2sRuPi3lH&Vfa8bNcUEl2f-;OLy8SnNX4 zKXSEoh)deCEX@%@F+h25WrmW@Wowe#WT-ZywqkbFjcM$(43cn=W8ml7Jx4F_e(Usb z^bbX^gQGP?&&~-3$&1=+jx{NHxg6q1y?x8U3}zED!8O4c#}#{IoIA=LWXzkBmurV{ zNia5`5GSQ1*)@mQmvZ-?tu^JOa3Vgb%Z?`KYpX@)sI8|c9Ya$jcvKlA?`rQb)3Fwq zPf@S!#hVTW8^ubOF<0;7V0@U2J%?_G;yJ;w(aL1iF{8EOL1k!T=Bfx*#5g{q^W1o_ znEO>oW_@&xB;jZcje)1tc6YT`&^9LYZ2C)oUH(a|ccJ-?8#x#=wiAl2@tXl-|Dn)K z&^6WO5Ra&dI|~#%uPs1v`{AXOq&65-MYZ)5r8PzK<pqf@ox2D=ABr;)_Xv)e4hFYK zJgwka1xdo-A-xtbj`fBoE2uW3w&LxyF;UnkcwT!b*Bvpme&FO8)z%Xnt)VFrJgjbV zV|x`O>51@KV6-Tg-lhX0G2CEqgJA5~6k1`=q1dpT)C<uhXQdD)rK|$A=Fr}>knDrP z=WE-sqS`vaiDO_S8KpHvZBQKVddaQrb+B9ujCpgYCQL`0LEI*f6L5=Q>^_W}<D+^b zLctqkc(yXC#AvN}+ptlv5tavzE$C^-Oq8TL!C}GC8k!=(^Xezpw)a7k=vT*pak?$$ z83oC*PAJ|cKB{-2Np6xtbAhsHbjV18D~j?cJ95mlN!G#91CG`dwL!r<1fx!FZZCu+ zhfq6!acx6|xJ_^@b})u<%~_p}KM758p^VAOP;JJ3V>reg98+Inmz~rdkW?ESI-+z8 zO_AUx!QgGmI5L+)C7&wsgcKsl1Q(UTdFf<VA1C!mK$-0_HsD+ilCx5BucBvV#h}=2 zUM82bE2x9hhQ^@S)rI1^?%>>tpNn~?P&g|%c8o%Ahc9Q-i`fK@jcE}VRWw@}+P+Pa z;6Z7T;Bkq2)F#FOLu<_7CZX_F;na31bqQS!j20zlWT*v-Rm%lna9S`r=ceD#$HvP8 zP722UL!re=A)XXCQgB&@&&Lmgq|O-=+@(;kqt|Hfg(U9+#=JQ+^@>}ftePi*!Fh$E zSL}nu)BSlA7n~1QnN5!Mh8HWthsfYSFeWj~%Y;W!nU2^l!RXen(%ub8L#Kf8kZh7r z%yuxQV)N+&A1{S?k(%VJ6j}@v+7A>QE4xo2-l<#c6$FEq>+swGwepI00pp6e=rk}m zEf}2B8vv1HJian~4WZx-GQ3zB-Ubu~%XsQgp_Ky$pRacy6y5Hf+Djm5l7#qd9a|kD z34;q=;ewt|`#bmsQs|20CMm=<DYS*c1%+p}Q1DIkcwltv7i%vfNK$+cnRf^Vw@8O$ zG8QQ$_@**^Hn~v7YGrtp;EK@hF!)lMBSt86DWPCTZ`W4bB<Fj)q82C?QO<QRc#D(` zI%Fu!;Oj~!K;gY|^00z$t|>5M7rsQde#7=USl%M+udyN3xGTI%ZtYMTg~6AWLi-3l zKt*S$k5|_eG1)q=A^1q)^mZRKzYzIoUw>~d!yACXr%0hM29gS$21Yk|)%HU8$SNBA zbpeB<_+e%EL6o=UYyhKMzi)dh(6d0tioPO3F);J<N}-!E9ItI8NyGaI#gn^B=2BRm zw03#1Rc`={`NRCoGJF?`(!NqU<9I7RjNlvQPM#NGsyD>9k)h`SV@qs)a4B>gM~yRD z3%#Iy6v4P+yOt*f)3Eq;VDTwp`-FmfWqx=WUM2S2#o$ZnlW|vaGc0-#ixNMhGI&hp zm!t6_h_9-TM&6WMjq@o)S;empc)j%XfRUB=#Ut=3lDI3m8j?4!Ft|tWZ+{;+oEJ_k zqR>s>hxlP!m)uUdXo0~k5+5cQJ5c^ra^*&xHu2Lc6c=u{LzZI?22ZFw2^ibVe~%R7 z&LQJ)>#s0*0Nw=*-k{=#5Q?pbLw|)BRPxH%LHQE6JgN9dGIS*{4#tMQGhl2$q03(w zq<E{oB<@c>7c9OF7(A`wQ^Y3+#=g|>-2pD1FX_PbNyVp=Zs-a>m|l&<{#GHrv2b)g zB>8~kBjP*=9Q=HGt(S2wcE0Spz^Hd8gRh`31{nOFq|jx+;8`j3LG9HEy+_9{g;4PO zlHqFz1#ggHehT3u0fX<NZvz<o?xfHa$xTw|6A&MVQ1E^9MF4|eq70u+E|lTF2!p|w z(q|;JOepwmN})5!wNmIW02q8TReZnFVS=wMh4ujjZ<paOo>1`Z^l{J>Q67&^8~E-j zTdE8`MGAf2WbhUBX()5x;dTe#rkr0hD11+Sm}BaD15O`bDWpQLO1v^K_^$dmI2sIh z4!(p8pNqd!8GZmTc)#9=Q1E?qKgA6GFs0Cqgo01f%K(Eftp^~2KTa9G0vLR#-UAqX zbKQ?f@YgG~Bq8v1^bUlAZ?D@i`3uI`c^{kL=hOA(A2TG1;{$_FIM*YRjNkD|5}%h( z`QJ|YK|{Vy^#6G%zZb+`G|ZQYzDWQ8R!}$~E=vIbFk1|r0V)j&JOn;@I+sYKtgNgj zGW%JO4+&>(Z$2ga#Qp(fS*QOmE{*XG2+Sw6nVEk8=k?{|?_CYP<3ad-6KW@V@4z(e z|37j6asQFc%T4%i{ZIYx_FinAtN+#P=i|HJ{pSDOdkX(!{{8>6{I8`CK7Y{vxb?8~ zCFFVki=xL}pK5;Ed&0-U)g4uEKJWgoOujYvIyB$^^poR%{rXt?|9TJp-p+Z|`FHfO zVNrYs@UQ*8mp&i<&+b>F|BC-t{~z}L*q`-nf9pT^@#FpbF@O8{<M|)?{6GDBG|&J3 zu6}UwJO9sPHT6yR*>~aJ|HL#>ToWf(N9u`ylmyRBv1q=jePEeyulC^P4Jf|U>^&qj z7fRFqm$Z>ic((tKyGl$D(gi#8>TUsRAdF4bDfx{$FsOU6YD2$t&3D7hsBO1hMrE~0 z*9g*>W3y8IZ143@TClubRUPcb5Ke)vf;31EcpbYtL$k|<_h#>%k_TKx^baIiK}$)r zeG--7Dcpi%u_U)QtY6+}^7?CA*=W`a5WeCE<%}lT1q`?D2|~WMRfo>Zg}{v*@y>Y0 zXE@Fd@K-_Xtq>I8fexBIpZ`)lBq2A!oJ$<5;;?f1%`DPFgI?wsmD`E}FRX9k8Mf9K zt=9q%1R;DkC+QWBB#yhWjua1=g8eYL&vUhC0{``g`>6QO@c{iZicxKUjQoUAUGJee zUHYOSQ8p7@)sfK=*-%x^&WGba-xQ%_tWBSi%Q9dcoXMpaa@5h1H`1i%w2|erXQhro zug|J`jQs7U<H*Qa*FZXlgQ6Q1HJ*K6X)Q&WF3aoeaRO>yQWJ!3YUa?V^x^tTcX?^N zmmMIMmlNESHX8P!kpBy_*Vz#~p+J_^Az74~im60<uB_KnX=DHFP)p&K9f_kW3Em79 zXHitf6Ra*H31OewDR8nC*joxe;Ci!H^qR$CpeXB+m2N$so?<~-iy<Ypr!kf;iG&aV zV?#+6cGa`a4RNq90Hk=KeVG!L^s^99UjkzR=hI3)dx2i~UveGiN*m8}pK62eX%?rX z^7zIb!H>5~WwI(!%)LbELtJ(b&j(TSRx}jk1_DuQKdjwPh~vcvaMm3`EgCDBkCVhg zs+ATF8?eBnqKOzdLq3klm-1IPQcJFR&w<)PvLaGFwA-Eqnm9NP{OD@oq~|afhuW~g z?7W--0hF+R4WplZaiZScrqU>1%v_8BQE(y6c%0JUab?;C6;~MZC}jp)qYE@~zkC<8 z4?D^f&xI{6$0ZtOO*CO(NQ^PZ#_lCaCHyZ&3QwEuKeNAb#-UFGr18W9(Wig^|Ns26 zq}TNZ9}7^EksgTWE#4U#Hi6U7!kYS3QOLSN3xKA4Y3&aN^7z|V_D2HpsJdKz!xB}q zc{%(IMPW0-J%gp_dOxl>+I?p4YXK!t_`hGu=f|G5hGUAJi+B2#xPF_Yd$g0~<Ey%o zkJ19b{Fpi=H@B+A&VTmvrBLX8RJG3UdSJ?oG7P{7sJUzG@v^JBTYE>gshNox>M_{( z>n4#{nvh0IqPk>41<`Iu$NZmFCP+B#Bc4yq$D+Eh{Fx65bKw141f5>uh5tj=YT2=$ zQ7*qGWo?%;>#DUao3`}MOa)2N00W}=s^HKb{>=8ZMe&zhqQa<T!=m}qC4YRhdl}&w zPgigofZGrt;D-<^zSpjuz=x&OykiQN$jz$ZxG_pcqq(j8t#&ga2hVarC)G^qX`&-f zsqbc3>Ik6l_tVQ+0|#EyU8JYN=Sk<>PPk%bg5G6}itml6;QkvzT-gp5tq-Q*m?stc zI0W`rjTQKtyRcbUs+-&{`CPThD8M>$INZFOg}hp#n+R{pZjrhNf08%83P;S&(?5%$ z+`qtM&vjISV_qNgiLQ*{ced~$muqT~RpS>plm!^nWj2utIU+qmD)8@9TyT?3ipMKw zt;2y-Y?aAebN?wrs~7{5wwwgbJvs8$)5+$FUw+y4<5>00oI5}eZ)?H`FvftskD0)w za69~wgzz{i_&9itW1v0*nOPs|X9d}jVp|B~RCm@2_Lzs*oR<Go;8ikCa<!(V`-0ZM zzQv#?x|=2*>11fh+8zltF#Jm<_->AsAbA$^#6o6AEu5Ut^|Tn|v^?)<AdeT9`RkX6 z#?oyWO{Iftk~Dohjthc&61`>qw8%N#Kq?6$P=rMrNQ#l@bU~EpO=BzAB`OR9w;9cH zB3EeAKO)kK44%vw$AldrIBkGm3J@FseWQHTDSV`X^ODc4>eOSpC=`M$s^W4i^INKm z)wTn={@@2j{Lqhm+-9*=l(&>?#VIqFK;VU$%H~z@nhFqnHBs~O1nXZ`nYlu?c#p+O z-_d!sb8?`NysbY-Af8e9AcDO(a9yc9kk$~uZV7~xyav=Z7M&9lM|#UFDg0Q#+L1s| zHdDU!LX~Q8*QW4|X0=VT4ODXj%*5BgeG;t6B9W<!^YLE!ynK8ay*|d{o>RIR?8L!h z5C2%RJiJ3$=0n>=<xTD}A=Yl~Tz+``+=a%#r(9Dp)~5X-aJb;9JT5TkOuJ_dRRqcL zutM^$7rwXj$PVqzL4kID=`wXnMKY+(J_IX9?`KF6ELSokcm?V<-3R$$O13x}v`4Zr zB6JK=EI48QVVLJ*lL6+eRzfky0`yI&m5h{V>)ta2@_^?gJiuFnlMp=+`x@rt`9S$w z;bLwejVgm>7GuIt0wvfH2aGwGFDeBSO!<W>_Fpc{!B7@7Q?Kd;jwX?sLNvuR0~2{u zI(?s#TD|)dydYp%gd3$ghZjJV<5@yGz$^5E6L=sLB{B?HGYp_!ok-7Ig4C!zuU0rJ z@K!AGMZdRWy#>F$-%C!-)Yv!FlR+F#!%y0^5Br8?ZxL&W)LFIns20zw(eskc@9o&* zag+DMoAl$|V9a}^(dlYsv`-5EicirT%{dMu{q*s=Rw^2Kn6I5?Fjf$ocP0$1`}d~+ zU7KtPz3-L2hJH7P$TmjnV2Fix^ZUZdO`yf&dY?-{L7qwgl}DY*3Vti{pZeN22(Q{D zG6ZhK{U1vE+_z9k(=@(MI2HW%?__K%ddQ+07-tSivV{}1hi=mK7PyCy?HviI=hY|} zA*%cVfN<E5Z6L{{d%ILkTt2K}AyN%FGbo>cnW>%St(&)Zg($?UU;Pprrq}bImV>Hx zu@(p?mPKFxfS~>G?ljZ77(>Egv^*H+RDVt2eE^Fgg5!RFa|57ZP$RS*<PVk*Myk0k zlR@5TS@q`S(rGCDqa+G9+GZ!`f_%v1r<}$$%-$f5<Dp&;sUb@uZGwbV`(@>^mlFnN z6IA;XhEadI(O&~c1sS2+Bg5_?Sq?3LAr1B8G>1rlvIuN`DC^TkZU<r&CBFKz78p+I z;P#NmK+Ebd*m`DQP<U}Jc3IGrPc8B>8o>=R-Y&rozuj3%b0e#jJ3|?(iIV}Mf^V?v z<>wq$<inFP)N;?zo+nyFLDS`-<^%GxVzb5=<5GO*z}`nI1HJM4*!>E<4GnxH0jgOg zUx^j8Uw}HW?($ee?(M@kTheQNMwHG=R6(N~4G{$79;uU0l)<>gyc4g<F@|wRRMtTK zByj@B^eFpuWfz*x!BZ*-b^5z-4NE`fF)z0(vZ9p&(8r)05<vCRybkkZ=ggSq&c7LC zVL6?~?Hv#*LCoIhvj(pI)><K4%=j>5H<9M4mv}&^`0R8a>a#X)pNUsY?sndS4a#m~ zeMY_rT!&bl-<tgYQ+ox10l->oQ4yWWsA%s4W3G!<lt42w&6{aow;3j~{g41wz*(WM z>b2<j=c>eeV(<D}FBhOF?9J;ZbKzHqW(RFGWsr^U?@@j8m`_(&6?MCZj=ekX3UDaG zx1AF{7f+iXv{L4p$8X(h22Xj$(4T_FC0RFYdL>7(ha)C;fdlYz2&<!)51*U9H^f_p z9FxLGyBQMO2d>AmCqAQY=n2l)3A19(b@jH=0g4U~W}&k#=LwiEe-DKNO4b^0IY78Y z0`WAUO>>?6c=6@ej{5{X?|vO=QE4|enCj`a27M^GUn_Q)3C#|e+?0aE&4mdu9>TVZ zC-Tl!mua0ILw<AVWJuqm+qdW#<N9s8%(ux0X~MTN@j5Lf>#&V$gbcx)Z1&gXjGO+J zbKn?8&5IHS=buJJFZ5P{@Sj|Z4zs$!zB&{IFWzMDbLDZ9u@YW6V(vZk_lY3txRiO6 zLSh2GrNsy&7N1_}a!<9Q3)C`|Y+!^gO}bCS@oz36eV=v<;ntAPzgVJ%V7Ti$z~9b> zVrsf<0j0Bb7jMOw6UGiF4I>}|fptpK5~*LXTNPV4cAexMbUQ=vG!Ums1S95t=G>_E zH~xgn^TaaM^{j!-p~XNerl~0=UH_H?q1bo<d<d9h>h{BzMK8ZR+TYrfF<u=YS@&E^ zbby$)mRa)D{RV8RXpT2jp0qQ^`L7;t)Zp{kVe&6&QF71GI)eEjIq*k2Db}v|JzM%r zV1&ad7Zr*%q1V&9c2!yEU)K#pO_!k}5t!Q_7zG!dP>xlwH;c<>wCtTd7WA647T}nI zStefn&;q?dHetCD9|Po^x4Aj12|oa8aL|6+ld6a>;!V}8+CRtnhs8L_J#+Y8-XkhI z{!%PYv^q4@$2oXKlGCH%QL97Mw?zEI30<@UNoD;Ye!Kns`NDJV(np}s9Bx7Y#SY7W zKw^p9<!%IEVglRW{#}r>`T0wkqcnT2o%q4i6iEXJc-hfAi$2<pGu5=|<b=KIKT@CS zPT02l8Gy;{$U=7T{)9aY@s8ZHII4vU#V;T#5BfX>p<7bmIts2*tz{Efv#E>|j|(dl z5rT~bziMJX-r%*r@Pd-toJof*`oRZvJx74K(Y^F3oxnGy6mBb{R8?+zcrOrX9^lxw zUU#?zo5(!kBzoM`5$jfdv|lXt3M4JU2DQX=9_%wtA<hQ|qd)e9Tuxs^%OMZQ$sUKn zRw-E7nNV}s`*W=RCaSY8BoX~&4sM|6i)9gCSEg&16DvG}Cza<7cgsUXAb#T0u+n%J z2u3PloBJ^bc*h5_W=+Lf1Ct}U*tp8k_(2Iz+_;f<Elq0$I6hzWpJ`##F@_d?K-|;} zwvy#nj0fp@mmaP*JMVW%!d-h0CUfE>FX?B7!f6v>9S92#)4@^^SCYR*#!Zms?g_?R zoP13fM<C91n4fV01~B)7L;aI`K(EKDm8irs{VGxYBTlT8uH^B{U)5{?`=7|EK^!6a z(&EBY99Afii-6~n?9LTFI8_USD45#6Q$vB9IXA>^CvQ*3>5PqX0)Ujtf@UvP2jy?Y z#TR5guB)b&5UEn75j2z=vv^IhSsC1G!TcPh2}<qym%{w)B4V<xhFjz9);FG4O`&fo zq^H4rpoH+zT=Slq>$>c;13XNiMgO;FV_)1%RuorY{Y#GCN_wR32MX%)>mH;wI*typ z%c>?Gy66-qis$sgthYTXLdYEOz%A-lPhHoma13^uykP$scF<phy^9htf*H~+tH%9M zgT==Ye2n+pe$AAvg5`L_`p%=NluNgNDfE##wUCu4hLx<4U6X2X8u5?Ez&c?ny^hPG z)Ydtr$vRM8_SJ1P_H6H9RauPA=W`XWhh|=uDne@c2rCxxX9S|4JNJecUrGKS%hv&Q z=y5E)talC7nD^xY9D|*ql*0+|UbdcwC#f6HGK}60bTD%sJ?mTk2aokQD}mZ>AG3zm z`E$RlE$f#mphQY!!@cahi>8leI2MzsPyD?Shp~uDlXJf(ll$2Tb_v`*eX`8g4ak7` zkz-|#G~+2@=NnE(cP}osm)fUDo(z?1<Q%)k-e#lkTM4{pq9y{lPqSw3aVH5gw-OSS zs3HBt;M7sq+hLMeng(K*3hrrBIiZO<WRMG3_OV;4=>RTS-RlN3LQE2Wj%>-paIE7w zU;eR3<}GnL(*V;OKlxN)GybV`(I!kHwCF#$Q|IWv53Gry+=)yqA<zyLfjTZ~V-~&9 zD}>Gto4iIzT{zBZ&Rf<Gpe+-o(5)Be?g*S`kwb+o>qu*s(3Yh%zRuAIZZ_oYbIm_P zk|dpzfjHrKxDWhBOp^OckPlp^HTFjF%jt3SdPNmxDdI9PjT*=aO&zB1ihENane!c@ z2Xt1Ng1b)9tH+J^X+1;Z9y?b@>&K!&zjIEhJDbx(SDj}%wR>-EgDHJC{=UR;Wh@!P zMudp^a^qiVOYfIu_L3Z-L$ei7rNn)$0(P10XQj(?z2l;szf$R%G42Zepz<PdtAv## zI}^CP7_<kQw*HO3?FWW}H)tr;M)6XUTcRR`3+I24ws850QrsKYz=5BYLvJ+916ETK zv^1TPD-Nx|9dt2t(^~^M8KAg3u$M9I7u!w{^n^S+W-*Oqs6b$Aj%ACsdCx8;8%M^~ zxo{^&t;ce}y4mke#Y^ZH%9}8`2z0JLJbX<wbF&eFA)iGJ@{$d%cr47p3c)JAz6`dU z&hL>ujX^%>962iD3Anbnf^C@s73(nJOC+CfXfHv5a>W$FlO1k!?^&I=6giEnM}HC@ zMZ_;TV4D+LdgIB7JH%b<sGnAq?P8^k2y)yv)AQv<_z33L3~Njs99G4MN_|?F<@yVs zYMDQSeB!+{`w@JlYM`}_*Banbm#BdtrsVAkNT3iN@e~pQglz2!>+Zp6<T`Wj+&q`< zB#>9tJb-gF-za3$4H+NEO~Qv}dgavWD)T4wE9PK4(r+&BZUVr}Z1>G6Ezb`3x_mD* zQIhoen;gR=8m5~{2AdOLSe%Mt5FFc^5v<^UnT8Z+eZoKKSIg;$Z#>pxtLr~}6Hi?i zJ$SCq-!w-;5P|YJlefvWwL`rtj@s;qcwY)6g8i`6tzi(PpX;zQY9yv?0;T@iy%NT3 z^HnfjCmQW|=hXut*$M&<+dXG}D`51_<}?YApFW%zJ2#y>Uox=F-BHiHd!VnPGEpo8 z^C~H>ylr)j@+DyaBAO-Fe=2lByMur{WR^`N^G;aXjL5UQ#WF6Cq(e{Sk|ax7{3Rl7 zvRr^W>&?$bQl7@xR+UDgik~}k>1>e-8GKsP*F`2}b)puycH14KE8|WmjV=#J?#Pe= zn!`{$KP^*j)DMZz&^{n9pez8iqj<c2=*<Zu6gqje^=2ynfAJ&($QiC0qn(za@#ghZ zl*YO}yr73teP8&FBhhY3xI^lx?t0!;+b_6QUG)3>fOOQIwc2bT*1IpcdST*AWN<X$ zMkz`O^pMt!CRVe8+;8=skg&hC9e@LJycenuL);g;U&e|k=8T^sJjn+>Z4KvEy!m1D zokcsj8crJ`3C*33N@U57Zxxz{w8ZjnRLCG{^})AosmtKl?~+XhSpuJRn4rX~XgX3K zKhV!Zd$V}JvP{_J10z?ik6C;RyynVltWJ89VBCGvI6)|KA~kXtWt|MxtW;UJJC|Bh z<F>Y#Hp~gIF6zdz_S3A4bk@$|F@~-FvNPks#8ge?$Cc2NEphNoIWGnu;|kRlhA6Y_ zU$7<DqA&z0QA|64oPQqrYho@_2-teBgBK&0wB%BA2UHo7jNbTHqXH5Uxz9)RG?HL! z<8*J}^D8iu56=kOR$vwMSo$IM3C^oqYt7mK>4Q}G`xu51b3m%uT<4iqSgh#$t4+T* z?aLPb`1fb5&JyUX7FY026eqH@QK<p}#KuZ)>$_?YqkYV1=d1442?!?6xrHAqEXFJs zIOD9)*^>(CkZ67H*kII;nXZxAp-6`8)BQx>mOA}bbvokMG7Ws$q%6>c-ns)>H9T!d zx}39g-W0Tfwz5MTx{yYW!VS`A7VJC2T3fXmO^BX$rYu;V)=bGp4H%6OC5uw|6pG;+ z9H}85g=7BKfA8YZE~lPnZkYQd5a!q20Hy8qAlA|iL!pjTvAovjN@{54Y;!^=q0>K6 zkZe+q*r@}3YGV41cK}e4LNH73P|^=i5L=>vF*{?3#$1%bAqNl@OX3UmG})#p@-5jE z)fuoXk-!~wlt9DYrGCFv&OjFAiN4C@ye0QLNr)&_pLj71qP<MEgn>u&tINWo*Q!v* zb_?@1jGflff^qfq$<CuW5+9$nW-MdpzE=bn=b&jiY`3t{&s<UT{}S!a{nTL`5Q50j zOhn`hjf)cHOa_?9J&rEb8JOQFs+IRQ$2xgPLGSgxDk4GpBg|O*Lz_f_2C7nzxrG2k zE!{&CHq@u=0&2{*y2>VE61!2D=ZDVO_;r#uMPaU0=-8jTTU$gQ1{u8y7knGdUq7V= zn?W>vlaKc`TTu)Uca=MDT9p{H`u@LIp$PyrlH|cl)AzI;j;v1nBq`{cB9O1Y$^`gV ziO#;92Z1fXz6HEY2D9*&HE;MEnD^RZ4IfRzQ8@b()i2hFCej1drNB&l)R|=Wa^p%b zqpON)hl{*~fZF%JUz6f0VCxq=*JZd?bSY=LYPj~JRNg>=G3?1gM5tTgJ~FQ*0Ya~B z#Q0JkbWBOBKbK1l1uZW7)+?MbAU}QrIDLZxOH=L&7ncx9HFmilEz%t#9NHWly_Dm+ z!>oSbl(AuG07Ax4z3f=Ex$a*`$Ug4t-JL6NE73xZqVzU<rcI#2!;Xb1os#78VK8f& z^K@#lrNL}Tda$PQtghnj+_Fcg?Fwm1U)=z#xX-aQqJQ<y0fiVc?kL(Q-s?^3cqJ}2 z!9DWEwk)P;D&o3lKnPUEV*6hL8z4dWhTQqv^F~?0hWhy1p~fP%x^2<fg)hT?*iY71 zTMJuOa_fA=;_P{aGXxt+D_!7$B>lrpHhN<)l%V6gnCzXF*W|!5F7o<#EQBQse-WiT zrNxhoD9c=I;bYD9o;-irCV_0@RZ7d7n2!iB)7_3{qAZgQB&anZi^*W`Gvw^4aOO&# zM@<wbPP#dc+gtyQI}qQ=6raG@Xk_EGQ8r1eOK1RK_PJ3(I7z~y5bk>+x8>(+iDtnR zda(ETP&>lPbOAlmU-7VB$od#5jIInN2R4gf*I9Isw#BA%5P<G3Z=l;vTk;A7@qcdn zg&_p=uamjmv}yFJtth}wn0Mz=hZd;i4`HH*q?uf^uPu@4L^)rgpO)r>c~jV1a6VIR z(3SwryA9_OkNVZJ>RiJTDg27Fkj4scPF>!^%MJpWezy2gj(D7s!(Y*_`Mt-J{C|6W zFNCqL^e9FXg@BW8=HgFm6#uUGzAHkYu(rH_*z=QP^j7c>6(LE1Jc-#xg!}S6gtTu+ z2VPhqT_jbCw6crfLD{6g#aU-#Tpa8AO#abpN$pe@yZTxH_~SRj76z((cp=}>b!EpT zYw0B+TQyL%(I);>pCo&EmmL4z4@;Y83{#e%w-*U6C>uR{?e!4o`9uOzzGfkuJ|MNU z$=+Q`-ni>(kVT;8$v$~>PrQ23sbx*Z8ONp>vL~=JTlq<7wXJ`sz35i!!<4t#ltD{c z@X;i0l;;5WXxAdf3X6`_q%_ojtS4;uyatBM_(XOqquUKe;!UW`7|XBbk|=0E%S3%m z(RT6ocUG9*`w#-AJQWR{SpQl0ft+(Utc4B4xf2AGBA2x7H?n$!dB~Oma56mJvQtjV zEimW}Qub@L8?mIP+^%mpcK=BOSfuxu3jGpem2c3$DvlH%oN5ymG-Vhw2W*a`3B=1h z(nBgTDXum_<|CmoYq;FT1~^`Al{=Qg;=tJ~soA}v5(^`2XS^*1%lD<OdL@0B+P=(4 z&!s~gfk*#Ilsl2S0)aVWr8EBC;{u+){>!Iy>{*|Hl4Czq0|m$>_g0$=Z@cs6(bD+g zoLo~d0B|5uzVb6dI*WHv5wL;q0C`fcHzg!2^zz-$Rs``xqt`Ay?NC27?pa6{a_NBh zd-DY^pOU`peL>}SOx{=2G?<V5Mzy;b=)&?sN?U`wBbgD;V6T2Ksdi~kAD^G^Qkn}< zDF~gVqw*qIL7x@H1fUl3Wx*?~bOCgai{INWmkLRKcC${1xj5XKe2^>vW*FqIhYff! z*0QXMX?YGmJtyh#w+!eN>QlUR(;7dLd+YrAc7`9mXIAHlNb6N$S?z8>NS~U$z!C?O zUEOXX?=-=CZKzpE={te-05SA09SDGfwd6xdI|t#6H8O*vl|$J}abGRg9kMAU4>=ZY zkt=~Oc(q@^_=pE<4vF)TzkYz4Oe@2uyhkK6b!1;9w3_MWLxfa)rr0h<B;L=G7hVO1 zH!|0N7)yK$f#owu`4rphx;N~X@O~5CsKlu7I~dS7$b#k4)wyhT*;2LT0XG99AF$wS z6}HP{aC%0ldJHPjA}6Y-GLwTwb`w9IO&LLJ?fUKfKnb&{Y!+mS1BGVeRqMd{7cT$5 z4JS<gI2o(phvrS|=z{R;$`Z-|S%GoXUdoD&eaz8eE_w|oNW_seTjgF-TM}9G7)raN zMIVJwtWXSCPAYDm<*%$2Nzq$p3iI<nOu1^DCgL%32o6M+fdqBxS9ApX-lD0FHeS<^ z1Ct{PwqCa20EdeZEgCpgbrCwhgi>ViHh@owHB2{dQbmN)czWOp5iTjs9AS&u?NFpd zixqe<gApMgPyB_A>kY$&6R%KDX{0L05gw{)mp-ngM}G3mODK0uru=nOd5M5v)O2b` z#7E59?dbMw;!-@`peN+4wLXahna&#-w>qX~y98fXz|5mK&d`)bOd(bLe*O<EtX)I2 zj;pK=nla^0E_U{^$Qt_7Q*Neb+HVDKaaxjy*Bx8S7mC9a$z7=_czk~3_M_t$&BP3w z4P}8`R4I~(i^@~_M1N^@C`#P*ck%%UB>dEO20LgVb$G+j*2nqww2o$BsIJWcX`@&F zM~=lX^P)+u&m4@{rOVx^wmqKCbm_mX8JPu<wpKx`7u#I%$TU)73&#1eTnrX;IQ}L) zA|{o1R%%YaT_c=DI(m`x(0Rx`ZBsMI)kZ!;TAn31%W=JLt?wGa5A{(&KehFS@vn`2 z{14ex^r=Ygn;9P!vEIVm?hnS)m3=k$K}k+pD2#0maU#zQM`ROdz~AY!o7;O8>(6{I z=>xO;jn3xbqk|#uC)wq4*?hztumvs(JTUkiBi6<3lj(hg%+~&-gSN7&9ufUl7j_eZ z)+MSiy}6*UWOwef@G3J_>`k5G(H|gP4tYY{nUR#gy|y2A%Tl@A?Ae6t+SA@h%5FG& z6kd2;vXc)>Pv0wAViPe8PRAt6@_J=;xiJ>mQCk4!wKmTrytQm)J;hO3#oa!H761L@ z7EMXRAw<SE`LBZro)%r%l0Vx2KS7v7HY}2J)bCetK1{+HHQOXQ6C&7Y`lS&xdV0mj zE4@}z=!?95%;Fug6E^Em%Qcs~m)?qfB{Q9ri$lQ)v~?np5c;(AElU=Q-?>py4JSoX z1$rm1X=67eHiPr_E-VUY^#`n&cJpAi2NC~N`8r`^A<zZU<_l_KpX(&@3ZTiy1lid4 zJIbXRtp(J+_~?W2;#<Mmn$_p(s=Jz7QR~~rnFwv!b@6JK<kPPROF5YMP7R`(93*Fj z>jF~*+AqTM(+y@$V9OK!XS2AuP1|t=k=M4iNcy|M!|#koJ5hTvir&p_w(ab1o{tZ6 zDy5vRyeF(`Qa}<s0b+p(Z1%&l_4>Z&*h^tsVbHouXR4%)VSDbbTorGV9?rf^RTN&v zTuvE9M7~wQCUPnul-yxuhnTa@Y|@;~^Zp)ui}I3ZFJm>jUUgDi!QcwdqSpok&s2ht z@Fu@3mV8+P-;_uQW-v}b*80C5M2*#5@U&iaI9hn!X~XchL8=Wg*RL#PNBk;BT`W<t zXuo1)0k|_Uont?eA$M6%8&#joUg(JurZeD3Wmv4|>ShsU(I?`6`I35^1s+GEUiLq{ zT9Lq_u?I--eg>M3)}w=JB?Id(23G%Q$&{%jBN?^ieIb_78q_Fu9(1lQCtiu!T+~JK zpb6|BJ~UEueI$$2Ua2v@RQEU6%O5I<5IPp1GL5BJMb$x(0txFsSd}`SGXJpJGE&sw zVtq_>u?}hyQeLc*$q2U|2(a;!8oD!*x&iYv@If91VlX5ryyj$Y*)6PDoI@E&gzvN* zEZ#F7lG3XuP95W6OjjbfgMi(#`(us2zF$%*xo2Kd9m~SqzGZfsxdb`c{ClLS5n8p5 z_Afb{%UIUUV!QJOATinEc3d{?+gxWm(@sKD;Owd90@C1@emLI$rRxEKL&TH*V<R`D z61EyY?rfk?IN))GfRwNlxJfG9^{}O9vw3m;6M1i%vw^(}4T2*MV&nTRJK<)cQ50YR zQzyGp*7|VR>*y&4plv3b&e^Px3!-8F;s+j_#}SiF*EY$J04kpkg^<#Jgzo&`)Qt`7 zQoMqciP^7pY6E+ms~Zv<Qt?pja_*I>1;&7_EnG|w<Z9`8L%n%m#e(`^nssy|wvv2x z&18kd1yG^cn*t(gZYWysLeqAnjQ;X};Lx{B^MeWJN+Er-vSBL+Xz#GbxK<HG)|5@? zEqlPwCDzm(<O~uw@c82e${<LTpn25~Wftcirt6~`v8Epa9VNT!;&!{E)X^`&!b3pT zLYSZVK4AglGou+1smw5iZ~CpFhVFE-YU-pOSA@F0Ja;i`XBi5%N6#=3Xp6lNpqcQr zd!#S~WAR<5TTyGOPn0_&BN$^247ykEXr_gp1&l>w=f(iRfoeAEv_oQpDEgq8Wu7ra z;>*20HjjsL=z{5AKY+svWF)5JQ}6DLd|-YH5WJVKjMtZCmFmj)_AnGNg~oY(yc`5r zmi>;%125A;RK*VmWA<t?>ibAH^^74{udD@ZA7a%x&p$3z?9!^Aj+I3RW-ouo#R`q7 z>=TfT5e~%6w<sdJk9p^hm!>Tu!N1>{qH!RZ3tm(z%P1`Gn8~YKFFjgp4BOTT#Ql<z z|3MZm7rem!<6o5!A@AHMml*vls1=ex^p&BOe)ZUQ=?+C4iYEY65?uXnmF&W+R%eou zc^hR_q}5&Y6p(tBsibuaWOfYc{8KS~v4f0M)Y;#^g#5ipit}X8yum?pIU&qgB>5Mq z0;?lFNrIiFBy5XcbG8A9UVnw^hQZY(Dg}7c_r<>=vXK7wOxes(^#eDeE?Uk+1=ZAa zdGzq6$OoRo*91La?#pz*3q%zHQEzidJ=SH!L##H;Q(seCnzGcM-@6YIP^%lIl#;8Y zFP(M#%2wLJ$X8iZEu*pGTx|p_vs>Sr#*xpkt^<bz1Jikq&_K+LutK>h=zK_AY;hbM z+&L<XgI^?T`pO2oQ}K(qFa_{aSI(-AB?IX;u<e3Ws;doqU&qHMj75YC5m&|qesBdu z-ZI7jwd3gW`#*3KOkD1mUtE`=#8^@3c5>=8iOHw~N~Zw#xpVYJcsLJfncL|Aa`!=p z-cT3<3lvY;aOg#qp}9WK0t&+24!iQ^0kAf;cg}b>SBZIi=DCiS|NhJ&QJ6MbvYMtF z10pdU51E6DSCF57f4+Fcu)rS8XoabxtPR_!b!6TjG++#JM5CblumbI64HSdp)|Zc8 zG<c@B$B1FJ_Oi>Zo18aFSx;p?_Dhp_(%94R5Saco-Rc~NUS*~Zn(C?|?CM*Y_N?f1 zZSl|-Rfk(ipK*AJ2tlYXXdKPCY*R>1@qoozv$hHIg?F-7=x<ZEUdZs4(#CMsV718S z@{+YmDmP2G{$T?Ku|3!pC!7^*_Z*>JmS^oZHDGSeVk-02x^dyLS3$}r7LuawsST8; zT!RQ(<qr8<EzTXb4=RA{`toWaCJ<NNu%FR-H!IOwVIw&k2SB4Pm$K1pGo#%BjXY3} zD{<I-C*Ra`Xj04+a*3C8rGj*p>$m>cp;R$FrXUrqGUpVPfn<*x^m4Ci4U6=#L;ETr zcyC@k0?}FE7E}#3Hh)?yz><4-XR&&2KgRH39>#*(=1i*N^^Fd}v}%Nz_#Z%dd5;rP zMS%)pr*TcfR24u}p1&tP`gjsiJtHlV;F+@<+GWF=n@X`!5KajOV-nxowSvUB_gV7h zY{|#e_E*;pi8T#J5bm=BQyj?sxS<>tR%QoU1s}^$-K^R*;5_ZA&r7WAw<NQn74^K{ z1gNYx)CY~r;7_d{T*;&4#(-1P)avxZ*3$!`rojkkeQl7=5RGNgKCx4;vw{D!p34gk zV7^7x)uV&(Z2L7c@-Cuao+%1i6XO6ESweM>VWmijcblOq1|>N5Dtib23V0?%+-lPT zM|2A)@wM7oB$nJVDg4C%PSl_)LH|+8OVfN<S=>*3Wz7-p0Pe=9{mkT<#$%9+LOepn z_16@3JaKx%ol`PamC=*=@aE?6m$V@l;SgiHf%F7!=P2-=_%L3DpTd#<Ia28HVkM=L zFtV59y&4k-#`l?H?r;?uVr)T2xaW4pnJ0iSA05`gy-_niAA>^q`rz&s`nWS>&nLR@ z*qJ4J`N=yA?lIRX=;fP+gfmC5A*3l;+arY33dbOsS+Wqm-g?Ez&e{w##UPm$-V_NW z7<~ROawr^SRrDAE_$|$)UMAVTI{|r#Xw=T!Vk(qaotOC&gf1g68wNW(!<dLoNP!a% zYNNN|8n-t^?>0h{gL?=tPD+TODnzJ6A&s{AMH0bcN9`!;O&+~D2T!tpvpV<9)1n>_ zhud4Ant1mDj3!-XA`Oou9A2inJnAE-6`>zS>#Ze{D<9r@#Dz`BD}8%=`fvHzi$^^h z0D>1CnNk4MRh{>;L<y}C3_=~cn5=9)1L}q^)C&FAI4HSF82l;SbSvRAX^Od?y6{)V zZFfk_ukvE%0>@!qyeMCar<rHU7{^G*<ZG5t>5RA^ya|eTpUq0e?7}H<jC5MQ>|K+- zuYD9w6BkD-x^#b9v*NWjkz_6HUB01M;)umbU=d7q--C$q&JQ2tc+lhXnM9|$2?;x3 zUVyN)-_`OBzAIE-CduM~fc1?pboNp8KAR*8RmQ3_Nmb@>=hEJ#VA}n{|4k35JtlJ> zF`r)AV;QSx9|opoqSLgt9$zm@b$>7(IATSie5;l`%NkkQpZMo=PL~;O>_+O0CH6YX zWRx{?A{?PX^x@nLP#OMBL5a{~fCe7`CT6E*dQJtz=}p6himj&<dOCrxbky33BuRd5 zJq2-@lA*Fp?bl#Th+XG&Yt*<Gp@}S`YTqH&f8rft;tBdXkeuq8A$PRihS}9_W{yL4 z6)j1NsZ-3-B6{(L=qZM3u_1hABtulT@&n^-KFJ0r=1$OWU6^?&uTap9+TKvAuegR< zSMVJre6kZ&v^fN__x-)R0mRxP>j2JNGAxKYv-5$|t2z7Sy1066PF}zz`%%z5V^mHQ z*at-(y*MD@&6<FdSVY@+-QvSAkwk}zOiCv^&?EazJVy&<;7X%!E_1A{Q?E3s?#I=? zuAZsLUh+aMB`K%9CFp2s2nv}iLOD_%9?DlF4!vK1WZJ=3NK&uuej9n~K9X{9@Y)a0 zqHmdC!$D!$rQ4)ss}RJXIx3nc!)D-S!phR-JFuTOlHD0O!|t&g8N9nuccY<3OZP_T zX&?IDs>w%x^2fh27T7C&yo1Vd6V4+cMrlCO)FjOwl3@cya=-mT*d;bL8oOrh2QA(F z#G6h#VRA=w?YFPd3T2MFkWMVVL2q~wZ!IFA1$hi24bMB<<(7J|ZkKwOLF!f|O+R84 zpx77e7oj3Os%lZ+);W1wdK1;QS-lFgp{}AYG$^hSSPdh{?c&0Ym%?6j4Y|3ajpah8 z*oJRTD3IBmxCgQzHconf1THqF2f93*k92&eg)(=k`0SD0e9P9iB>Qn28>JPhM*8M_ zJdif_gt{cG1QY=O8ZaVIY8D4CW7tYjulkcub;C$YDkWwb(Cl%2C&~-!CkEB1>C;ty zifji?x9=tD#GE&blv7~%Af`9#dU5ZMb5Y{?=y21)9$_WuN?vG=A6;Mn)bE8B({o}6 z0KTwaHRQzHY$1CP5<a9(|4AR~^^7VYopg|vFu4ARZuqfoLgPh6CsICq`_rx2ZYL!L z?TGJKWUGGlsrqivZ;Mp(1D?c6siE$Dq@3FL$jo*FiqlCJ9?cRMHHs(;@wj8wVj3@T zrFgtNzHYmWD{H9KL8oMe_7PtW*8n6YuJx|5iq-kyzOJ`@cc@G0a2fQc(xqLF&L%!s zR6$|t>(l(sIJ7~m70g*A1rO2jQ3QZ}MMbM>t_L=mv(s}#wtn@Z0kJc-WSsZnY%nJ{ zJ8S`t8ZcZ;*4Q(Z6|h~m{{Y|V%cc$Gau?o9Z?EpDM3n=Z135Z9s_LUOzyb~j!z!!6 z%iY~leTUcwp6^txawQZ6h4rVOZKI=EoMd5={y6A<csGK)ePi({<78*DzLi~;kK37n zzewr4C<&J#4ZFZBnj2qd$3op>Xeui@CCjNpb)&q9y*^>=YvC#Dl`|Dc=EyR2Egkq5 z8o3nO$p&<0obV1eHhQ^-*u~(;p1?fLEkU5cABVzDK$ZqCh8lf$DHB~nM$VtUS9bIX z3k4mR*dFU#`u0QiQp-+Db#2@Xk7BPa(FnTAK=4)I=yG&nF3@XKIY-trT>lxJuc5(n zusyC(ehzrjtpRf$87D|JKJ5WNJ}pLUZ*P7UHyT<@ti$CGq7_SA%BtCUue%v?wsQ@K zVS5PrxHig9iaaOSI}p8ZC_))Gq=r_Ag3{NNgnIn)qtn!zCDAYTg6SV=)T^%q$b-p> zgFEAh&f-?mH4NOw^8$9}D2MCSzmiL($>S}H#*_t$#>yTFrI-c60fuRXUjHRs*kbbV ziBSkHF$`7unwhDM4-!%~??$3^V+UMJps6C;tmm33N6V}Kgi7cyrdiMqIJt3EpUT{E z|2&IN-@Hf6lj9bt`@{J2_dr&bA%4-lHlSUX2|^*K>6KZ<e#qunTQ;#ixg63_C^{no zd#$u43%nNrW6-Pw$o`-{M21xvJZlv~=aocfv};>Z55@E`264c|e^JZJkyuXMOwz(w z9_ir`WA7V>_rm3T>8G8w8yKMOgPWLguB@0r{%XWIC^wV4f8g&WxrS%&&9u<D!&18y ze0g+6zaU2@7@=c*v-NqTk|3s#pIKo<rjL;CS1KaM>vt`Ha*R_lSl5thdv_;-rA%$P z;y!iIz+#Wdvx^>w6Z?Qm2PVElTS#pG%p>{HK%--@K8xW=T;@^QTKjSK(|^FEq9PMs z%~Xc1X%x@^Pe8E01L6Fk?iO+oW1vCQj8hwd_Y3YCk)0QHN+^qXF5(-SiIv{0oR8zj zr6|c0nnmu`W>dd4=&5(0r&z1GWP;opD2ye92a^hOKMCIyUaqL&^&End>?k^u{_J-N zZ2M#6i9q8F3PvfA{VgE+?q`pr5#iz1H4JOKAFcwNj?SEBsXu1`8e9mHEDB>~j1`l{ zJI6L{)WlYTjm}W7nnr(}6TNA>6JYv$*%lo?hWoI_v41)#ToR4WQhm!GL*njC@JR)G z_ZAo%DxrnDT8xzyxh8Bte}KrZsX8)5fPH&|W8A93aOKHH*rx0QrrcoL&FspGj;sBI zgzA(K{iOnH*a<OKedpYUYOnN!nMc&JJ2(Ahnqz|l0<?1y6KzUz-Y(a~qaPrDr}jZ` zFHg-3bo4-^-lx4yQl4U`a`^ZHokWb#8x0|<Yc8u#PGMu!+MJ*c4Stn$V;qzbIrfS^ ziorb5ax;NR)y5H{co4EaA+vXKuf60+-w?UcA>t|e03nb@Wc{RJe+$YZsh$3Lfy}@{ zb>dOCZPbL;*q&c}DmT0_93GV2LBdGe^BDz|xTw+E1sSgu)mQAoBnmapk7`Se_pEp% z>hnrC&|U3M-8u9VjJCtDJz{-k<u15`4%{<pNv-J!n9q7=C*Gz<>2vbIV|MW3DZoO{ zcPN{TRjN=kI$(w%Nzlx%N^3nH7nd>JYW{_Ikgx4XXp#G5|L(b*X>6*aR^rgsUyFTz zDEKMohC`k9<@+mp&I<zq5WW&O9nHV(t1v4ia%LeY$Ob!xuu*k-Kl)iM5J%(*t@^S< z!1J&6ctK2-DARm%1GnJ;wx$yx_tyjI#7XIei5fL-fgJ)$_Q!BWI1jVj#nfQF#5mOJ zS2T@;WIO)bog1R+A9xonZC>kt(I_DSk>w!X|7qrZ#T(-Bc0q5W0kSZ_5&rv=+77Tr z-cT|=&Iqz@dOqIGgZFFRM5!ARE;DVEdu;ebOxcyd4-=y*8Eo83jd%Eff~3qyH*hlh z6eG~))s8FN8r99|eR;XRjt$f`vob5Zp>J-5;d0By+T&-bDK^oA-CRK_QB~Mk^X{x} z6c~t(+Lf3y9k2{Z6}2uyx~$=FWUsz-hrNT(xz5d9MU2bL{ctd-$o4~#1gIJj%Uv&& z7M^CvsG0|cF%}-o^oTi4dz*rAG;+cpyVGT!@C1Y)1^bkwn1qXq(OOg*_K-;=UK)tK z49RWu4x}Ly)GzrXWp?B==ha#XzPhLNc{$XSM(N#F$Q_irGt4%R#y2~s_H;|~K81Jz zw-wmMRDzzrS*KeUcdzu*3;PJZ*6oMJfIw6@Hc~Dbce37-LX7!uJo(8~I9GK{rTgO6 zY9fvJ=?EwAf{cnVo72LhCUA`EDE;M>tPu^2q0;}0eEXGMcY)ST3dpS}S^bvri{C3M z`lHrz2{->P>M?8y@4n#IBL+PQAC=2Qz7~~cYg%g(|EM?`U{xj7XjxDiR@HYnOkpoH z>OK|w#p>Y?nE~E->{2O_g%xl<2=GRHc2zHH5OfWE<pO-a%0bN>Ir#M_=4)LUNb5P7 zEJIV99qiiO5+n8+wkNKEt&_1E@Q8bX=pSmHXts=Cw}p)PU%e=gC2A;wL1OX;=LBO! z+_v<7f=f?q2e2BYB@bXD^a>k~@`wI^0TQluL^8D7wUZQbO$HOX1K5LILMQ`_Tz{8c zxgL9D=th!&^=IL~o=7$L!FZ~B((RCsHLMC2Ib71W@Ma*@3@yU|m3bfK*%1XpQaZZ1 zq-?tw|ID{n8Mr!K686~e{$``BXf|w$?@M^4SR%7xS3i6IoyHey1yx0&JS4{15za!} z37@kW!k~+i>N2~dP8NfScb|tPlAO__QByk}(L=XoHqsQ~i<;A*XEFuADe>ocC%K^e z*c6&Lf>LP5@u?s~B|bT~0yIl-<%r1>walp@66o`4ZxYy2q-vd>pAaqKb!f9G*?tSO z<RYRg!yh|B269Asjw%%%e%Bu-|Kn2=NE85j4jyzH8&PYyw!}l>xXHZDM-7;^)qA#R zVe3YT(GGtg<WWFyM|BhT<Py84Bh;Bdod)$&ivgkG5Qxtj)KdPdC`b#w(};J4p;PxT zjp9`qXAHah_ZNC8ny_VscCa~1P;ggSXMg}tnDqTUW*bpn-$uyAKx>d#Wp&QM0V$A! zt{k48^F4ji%){*Ldm-f_JtvfxWESGvuC@-Z;{MC0+aX)%Uih;5oqS$^IW7&z=o#D+ z=tn<|C?|rmh)0hRwTzPa0w1`Mdflu*{#`r1da`V`5%CTTHRH(!ple^|w*@f3UI-9i zI(w@72veSJiqCqO*@wjybl8m&WVK!<3gIf0@XGOGgTxKU6yJr2Mr$Amt%_t#4p2j; z_mqXPkH`Q1y^{pAOxHg6qi`h4mg!d`q78%)gIOoU6pGSGW{$PjlIzEd!_}trR_7-N zr&}+{iKX+TypHcx554Ge!ul}ZbN}L{q61J+4N4JjDXHWlZ072H*%r}cK_m3AtLyn9 zp1Xi}6;3Rsqb(N^eki1*=K$ONF;)c=;J;X@zx7+=bQkT5j2+)WoN@WwS&f@m=Wc-v zf_a62{+4xD>c(Uh8=HY$&c`sfiXofY`$Vb7fXX5!5RW<8dc79S1HbkJ7L>Fs+NbRq z$pMH9+HrLbL}CbV_%hDFl;X3a7@tsIji)W`fIENCB5NOlRdZ3dq$6c(^xr$Ha4iCF z)QBK=Dc7cPAAiO%#_54Tv{gO-eT5e<G$9Hs80~<;$Rcl@FbEG2F$}74@Lp?%*XJcc z9{spue7T3*59I1LbeM2@+ffL8gWCz=*@J2A$DA8XZr_m6M*2`tkbn3wOEtA^x6d@H z$w>V2s`$sXiBM?yirQWXhKRC=AOh}C^gBEw$Z{Ot3E=J1ggrAhxHly820`SyGHKe& z?aTUCg>Si=#0tHqI*rWnP>N#7cRt5qz?I2(zjCH{i$2z?MN#Icl1MZEDDisAci!|? z7EYA(eYvCwa5!1-!8;e;yS{PRys~9$c`Nvt#@h@O{dK1K1Xr$jx!&qabfW0FRJdmD zPe?mCp^+F>{lmKP=-i4ibNF+NyGS@(p|Z^6#G~eJBD2Zl>7dJru-*Fni<MqYg|jqE z{j4>bF8{7xIG1!cupZjDMZF~ZZ#kS8Mz0+zlNe_k=$&}wR0~k~go$;HyP8Y(o%ho5 zTudG?k+MY#=IIIjc72@NUmTAe7vvumOMXvDl0xpOH>E=G3}KoL6c2Gv<!scw{#Z~? zrDU@>g2gh{Wd-@SP@%1Om=5eVL-!WHjesL{%@=t$Ffpq56t4X&AfOt2EkC<e{+^1& zBZ^RaG5r7#4n6|snCJW}%ttJJBp|ucWq0?A!Z?(1@x~c#6{G_oP^~h+W@OOT;er1^ zj(&MR&pkIEZ&DYIS}Pr9Dpz;H!bG5RwN^CVuOw)~MYDRIv*~1~B!-}C3`2AfWB_^v zt}%+$F&l~h-8&~U@|Lz2HB|Kps|bJvXt68LVwj${AWT)aX$vI?Y+F3++q>m`#F*yY zfU$DSkXJ&C8YE7SjWwSJf|qvFVRcm#P4-$eIq_;DK7<XB={ohQdzS|Pi%FLdg<ga^ z6G)fc$DBiYaE75FEkta`!TTm((@60l^$|6p=(0L@(7g?t_K#t8OX2ffqo!67#v#3^ zGG%(tQ9BUr)zK1_>;W2>;oICj!6|&J6$AQ>ZG;SFLeHc^{*Uo|^&Pr&(fu&J+)Ya| z&5DpFzAEBtdHKb48fH2Ru3RXw4aSP7wkC}i2p{!j)9KQ09q*>94FAQjwcq-B*CK&k z7r>8&k(as0c4r=zzymoNa-(l`p@PTK+0<-+k40*);;Y;y7(tvjv~_I67DU7lsn9{2 za6ch?1*oYnh$>pj3@IaEDyDa4R7uDF7aCE#um8s{Yq&HJ#v(?b$$5<e(>n+JaC&RR zS9V|#!dr-7v>lX<B%6WyEkO+b9_k$-Hlstp`sdbeU|HCP&V9V%V_a4)feK>MHM8#p ztWxuC%@e3Y$;nQchdC)bF#+9#A#wcO@A2j^>t3*Tn*a+_LcOsO^Y$Bs02HdxR5KlY zTp1GH1)?9zUQa1|iw1kx4V5-$1~w6n4LpiwuSg44Hb4g#;8}JM3gg2*KrJenxd)Gp zW0y`s%Aq6ijv1`ov(PLIsn=Or4=;18n0^NXnAgrBMy~Aw^j$-9vCkF{7`ku;6m+w_ zn%>cX5X4xaN+<juaswr_jx?J;26>m-CqaW7+%D~)&>v@G*SW`_EkmEvsI!50iC_hX zK!o~x;9rjJD;*xNBI)bgy#ZG?k=P^bzr-L20C=8vt3o@e@<}5lzJGvy@e6*rReE3- zoZ~1_Lr$X!_&>8E2hoD$gE)7z@RTTvbn6d%Es|)SXX#aI@ca}qwx5tzU-LsI4@dlT zZMRD`|A-I>fBd<aWunz2rsp{dxs+=Lf7xA9h>$bDKylb0s`YJH@ec>EAT&MWsRAl5 zyOQkEsHR=EV>kzM-M}6tOOfSoim`?C95dR;$d`B~f0>*tV8WJCncLzEqIuMuckQru z61X3?UE)-Qjc%wmZ)FAQ1^FhuWYF;#G&Ejz{KJ!5w#cRGVRpB`E)NhnE_+=?!G+cu zU20LGN3XtY)>e8r^sa9Q8n+-N$$eoF0p<ET<C3*lk_4ZTjO~jhf?mTZ#-yhEQ}2Ja z0!y|x6vz(F@?&UW(4lsaY3t<5d1fjMb+2Q*d~J=|`B?l-G)V?v={8#qZES4ah1k@- zV_ST34h7=7`v|lVxvEPH<}2#LrZ|z0V+KVi9iIAv%;AaUz+n`?HEe)ZHVNFufyOOM z>x*8xt_bgt5|}vFR5QF<)hTP6|NZ(05?TrM=eGV$z0BdaJM3emP7JjqD#aWt67Rja zeC;+1fchknals=4$)$qPGZz-b>Du&dKLj7*U<oXghOxZpKDc7rEpdhmKW^YH7Nzr| ztTx{@u|`O!3H~y{ft^-mnUG6lR~=TF^N4iLT?>7srMKHBbnW9cLNa}srR$lL&!QQL z{CzgIoOFD3il684@{r+U1y={Bl@Q{3>j6wJ#Nz?Y5#F+IO-}g}3YJ2x9$N^mv_$+- z2aIWC5hFG<fEcjgq})tJcvx$(Fc3YNHYbuzWyVI0K=6H?^_;PSuMS`!B1}*?M`t;m zz2v#k`2YmHF3DD@6HQ$(eP#~&$CG{hJOvFB4O6m%N%X~F5FOwD-(3c`sY4m{O4)To z$NY{N;{pG-ukB}$RS)<leMtwH+!@x2J=Ne5bWn~Z-n|gVd!t=)CYmnVWL()*@^91C z1(W~&7EdA)>L?1D+Zxr?304PiH+CO2o=T)AF_0F$Fb9TEX2VI|pZDQqVYsal;w0la zXNf-xx~y5>MI91|oNlk~<CzTTiOc|9p}L+B|7iqkSNe^|V*p6!DW1tAHzzX2o#|%V zbB@X_??wCK3;*ymeW<l132bHLd7MpFMfU5zZ<;-tNDy@S<w7*Ykmx=!Z#Ke8J6$fw zTm%Kl=(c$V_*USTCt3JYB#!Du4<z@~awK~UJPzMxKTOo8tcPM5!)L6IUU6pnJ1#!o z`{?+=rBxsG7-542!oKzwJ_B3lQBR8(le)Gyu*-52JBre(9}HvKRiU|M0j^sJ4te`a zXIm6D2mKaE!{c6QP2wknU*!!y5ReTr8ITE>odq{Fr7)(n5=5}|<F~=R)bX16Ty<4& zV1E$5KRSQtbhbKVSo6;*bqoZ6k3uR^9O=EUuhjW$Ir<y`?Mmuq7&?AX+D=^=I^bfk zIBc&CktqM2JcpX<)EI9M&UM<XcU51-rn}1WXn5SnRmYD?z`YyoW*urL+=RYBwwB?$ zYt3g4PyJyqQbe2Y=Q}Zf*-!$dj9huVj7`!XD}A5aD&B|Sfc&7YY`@9q3er9+B6dg0 zFweQkSCLQM%VG3-zxR|{NC*a>fdxwJ8p1lnsPEaRBwTD$EjyNJyYmWS>bSJY)98T1 zkT0~@IN@4MxRS7W4|||-L=5#?B&tKR$ViQuNb1uyM^@njL<k<hr5isHrQ6#B2hI#i zA!U62I@*i}`z4+Z_ZV6x$K`1JA98EwJI}iTK9BwL>kzG}^2F}!E9|fJ383^GBMEsh zDGZ;jL5Di5$tglIBZ|Kx-oY1!ZNCt%b^nBPh{ehqBxEDpTTm^)4<U-U8$26QsvcVQ zBpROH4^h(>dcgUtq9rZatKKPBW6D=W>x<>9=^{DKXerNwoQ*IfS(>rcnUXg9Zkcqw zVz%V`(J4i73-AL`iWm1%X@#lZa~zvWu^Q}%g92NW^<^)98szf3X|bhP&RhQOK2Eg< z#F(kDKmOR_h|xaWt<wQ``o;YrQ=@&u$DLQ#GS7$^P*h(mX>lF-+Zl|>v|n^>MilH% zSmUgf0(ehldJDkCy`N?PD((NPQ?-BvAUhq?Cx#ien&L61vNu7x1P5w&LwP_)E9{=w zTvdW(bqfA}ewiV}W8q&~qUsj!$wUg@DZ*H;t<gnU9A6W*Od?-{0QtJ$%LHNFnpvIz zErP0O1z2H5YV0tYlcAFtRQBQ<V*7jqL32J=Rgvgg`^73|rUpY!tZrhy=^u}QUT%<u zdB|9ScrLBB77Q1W1VRs<8y+#WVen^Lat$^aO&dap*U`9CjNP;VTnESEjEOd^L4nne z?wkB8I{Uw<OunFm+>z}aCcGp`6KX}E%}C;z5jw_+<+CG@^f8Xvzwyv_bbSrmfA*r$ zzM|_;5J>oWXi@nSt?5N=b4Ja96Dc&&=NQF!R2rcq;{;t6+I9=p6G)3A(OqYE7HSwj z?b@|&1KA^oGUS6t3P%|BT+$*IK!P8q)waPc^9HukdLqI6*3c+y^<e?k(!TiyiL={> zl>Meg?7(jI`eQ0@kSM-p6KY^vFmGi;#Eo@7xp5`UZVV*!Vq=VdUmcIh%NXkgWekgS z3Xg6gejlv=dlCsCh82WE;0o(`o=?*5%*$xijac-B^;oFM%VgtT;(FBbEGrwW!yIA! z=C#73X<8+zsV?Y%65CwGvhJ#}zwUjugX1oR^E6mKqRKNOY+7Nklq#q1mJoaL>p$8G zEpAhg`Tub49#%6A>wuLM!$K8NTq@~7${muhR#-m_r+SMQW5Uzcy_MeBh3boeNQS&( zVNIxi<&TMw-1<_tQX>;8CJSa0kF;y9%JGd_kVWPH9;kZm-{$*P5^jlov)KWQRzRR( zO!<xEEqx1H^B?DhiclxT2Td=xEff;aIDRC1(#MR%$(LIoRUzeWsVAXe?YhtE%SU&t zxm>xdO9sOx!GWiggjW{o?=A}yJwfEscX`~zx)6tr|AZv>3dS8RlXUVE8ywRHv#X6c zPaI$<8|I(Y@yaASXjoZl$~dU=c>*xPq}X4iCSVup4c=^PQ6s74iOjwLg2g82J|FRZ zE%}e@P+FPGeDshWuNyE}qpnWS*_yV&JU5Y2eIBofuDRIH|H=zqi+^`+;yYkq^^EXv zhIC0*n|Zrf7}h>$qs7n%Ik<Ew5X?s<KvK5e;Z$HKxGu<N5!&4AJ4y|NdW*3h7pnrA z)Xfa<rYZaRYT^7A)Q%fZ22*`j9c&OqOthN3^P9i9t`da&607*oA7ABA!^StW79F-l z&ZQEE`>IOK`EJ{&j@}XyYWRFG9*NJ*2VBjnbwJ2^OjE<I-9Ypk^Z6k{S2^;cbgM)J z34fA_q2nBAk3!PICk}t0sBYw-4V*^2#pIF<&x&afYfq>0s%7*0&%>mVIhPmTTmuXc z=X1g{DlqgDrToxe0K*|kk|_wZT76HWm_ASz?!r86V$0ObvR4x<h7i3?Nq%CLI*iA) zY<bSgY)(tFFQ8}jzQ{pqUIYat=}B$&A7C@eq8Fy_1Tc}En^<oz%XHll-0Vi{-I&2g z5Awr=>U_NM=8!s(x<)TAA!b5GV>XS+>Gh71og2kswF*eiDQT#LEPeTvgm~Kl$;-R} zAIQP#8K^q1+7@l{nTsGcGq#y!G2CBD<HD^zE0ok6xq5o)Rkn1T{k9n6@T%raFkh*L zVs0xcMldYXww_2%y#^}%Do!aY@Ab}%+eQkU4Ek!j2=tyemB6x)d)Hk;pE;YbI|_pf zhTUun(Prs9`F`e7!q}a(caY&Jg?0GWt%548vf3vgY{P-rqQa^rwrVTBF}*u@qFIwH z`+jz2TZvi@9kfEC%*ANArs`)1;+2|kJkPw`q6C|wS~eE_`n-+Bg?v-uBiyVn9QC9I zz4jwJ9gKLsL=Jyg2ZgZeUWWDb+5hFIdQ+euI{=wX;SYpxMPtu2st&@UL8W>qEZo?8 z?5jX^N`Zp0iA~6Mh0O7z_-<f>S~e(z_4K<E{|;=XNqfNoJV>ZP`?n_lUlf~HucNeA zChpLEbG}mhe@Rg}g`o?SoLEAn`ta_sk;)tqd&lpJnC%#DbPYJ7k8DZ?@57t2$eOO9 zA+)hwwi%2$q=9Kl9ArR@NcSMpb));QK7Z*|GQdOgpi{A9sH+>!6@3yl?J3WT?1r86 zoTGQXpyc;tUuXg95>ZLXWe1aFxDYO@6n&i5qpWRGTxOL;P_11L#%o)>1^R;4Ce<(u zGluLhd;AiMLuD9x7%?<stO=ey_tYsI*thhCXJA@?4N^bjyfYfg`HYCBqio|%vu;RQ zgil-}<>0S7ww-iXodvVZxQeWr%fW5ZcVBG6igvP-q|YZ(P7pS<8x;pLgq0A8{B_C) zzHJyox;{ZK3E&lVQn<vOa}hvu_ku$qZ-`$Os;${P#724Ta?oNQk&V@*2?Xyaf+!UP z-K*#>DFeJ4$ga%NT<Gy&XlRpUcNR-4=1ndETeh?<OHA|tI@V%2YJa*^Wa5s)Yj1ez zzTZS~*j-|^jlp_DUAVAhOi9U2Ae7f5BqJq;YUV!MPcA5uNtBk?G*)nA7y(8Pd&fV3 z`QK7l6A1`!i#A#b*tD6?mBT&x=d&QKs&cH&dQ_SNh)4tPv9XGjl&aEhu|?}ek>mnE zx;St{vD1TKJgB&2{8HLvQNjkIt#ja9TpDG0<_b?`cX`Y`YE5axY?{*{W7%cqI*iZ3 z7{<%+E51L-2&Ykqq<Y3z)iGPJFV3{SH269I^K0al|LfVY7UcjI+l(=WvF5R(D$OYQ zWPPe!=-P+_;v=C2DM3n*>j;>H2sI4?akRCZDKsvtj5Gt4oJYl3u4&N{2m7d){8DYt zVaHh8tD$^y23<~GNizhlM*GFU^&aI?2uUM~Aq|*Ni>^~ar4fW84@CSKPbDa7NwPW< zn>`-=6yJr^L*CC5pANp3y-T&Peziq7K~x}R*~uyuaKt2rx7d#*{_csbKR%^0xBkv+ zgQoL$gLALXQJWjiju4Up%oei(vSZeaV*b)`b~oUWHI8Sb=x%+Tu}y4f04=x6aSHX4 zu0V=Zr*s=d`t}Ntk*V9W2v6QG7x0*c;E2eI!u1Se%Un)dZ?*OEM~b^vKaG(Y^5M^6 zI!6B@<|U=%JhSaw&NG7F;%jdpu>EeMsgsGNF#HI~9<VO4&}=Xe8+ur68{O{|T(;t4 zBy>>vf{)FiW`-fScGnyQ1CpiMzr)geH`10M=3C?LS{r$~Pi;(VA@Cxo6g*otnq|K= zIKva9*-Xg`l6t9EJp~Chz*-<Af7I##Nv<P_d|;D+xxM5j&Yr0(9zS5UQo}6x-Xg_F zN+f!tSUoEQF-rCg)fST5O3TZ(g<g6kz}GznB{x0_M=~_D4w*zyF^+I0t5y+M$)USc zeK~Q5^Mm2k@xMfLq+na3Am_R3a!e6+7#K$}wWbs(7n4`kgvdp<ttKiephCsM;;TWx z*ONN|&jL?8Wi9zh>sx_>mG>aLImgZ14LUVWhgbXJ!hkczuFhHxxi9a#(K^3_-MJZ= zkqKys<c6!rrV;V4QK|A_uQ8PT0Fi!?T_yH3vVj13wt_-uxq3^B40@f|F6cCt7#d7q z4CI(|ld$F+SjLyaoDnwv7btL_=A4OL!Vsl}l+4DDFm^r&`{w>&%(v8>W0U6FeEz0- zvOC)@`ng=GmGBJ>TkN^rK>^D+$aJmk$U|Airtg}1K~aC$3TZL|joOX_q`zpjLf@wu zu><3r&$VWhJ$zPsg)yX0;Da6r$wn0WL$Jt|LEc9Ke<ZgEbo09(H7Q!wy7c@MdHLQ_ zw}2(!_bmmlyi-CRG|jjWyCRe}jvZYKaTJWHL=zcAkZ)5hXVQdR@+(d=E9u+jYh;NV zWVJT@7G6PGkp_{~z+LM}3-h5$c~U6!3Bgn~yy014s`>Fww-|6q!RVeN%AA=_wxFP& zhx}|qiH5P$u+EX##2m`1X`R|xPt1`sKgSipzEZ*|bV?H+TFM`WA_c&5M8W1EVKv0t zN9|||FboC-FykWk#HmiH0xpKGmkQLq7K=`N8V^I%hGEY=S%OJmu{<lGQ%f^y{mS&! zU-nQcf7nN+NXgO9CfRjE13?`GQEQaj0t2EY%>d8QEajJron1y~mvb7!=E2@VR(^J} zv9gsaBqQOZyPSLlOOwFg*6l00?(@3!O#Ks|-uEY5J_2w8#6d`&V}Qv{L#%xlb!&6g zh#B58w`%YZpggo=rPIxg6T0m&(Oy7tsaM4sF)v5B&s;Ng@V%enq=+$QIEZ$=McPKF zl<Xo&yGE>5*|-3!T${IlMZG!PPS4Ip;|XFLx(Wums0+7<=h{*(n73qBk>{g3svRhq ze<R!mFCnf!cE~U8C=3PwJx_=6D`An8sL&7);Nm<dAqBG?oUK)))0Hy|2{2=otAL|w z<A2g5bLEdg!Gm3zMFi}9IHz&~kV-z>QF>i?D-3on^i-KcczNC!JO_?1V7Td{*HSzE z_y&^Ke^YM#wz#0(xU&W(z9pqzZR#QMpdyte19(wYg_1wl2xDYQbh*XUc6w>UBD^ir z))ck!Sl&!Y@6BKQ);|oTo^xSDH-Uz}2X@E!LuLaFSK~^FI3{rV@)iV;&>v-VC%30B zaUUaNAP!EP2l>k%qjQn7M-fe^0&+20+rJKO=lAJL6l1FQu&5P<QqEPxbNQvjPG~V* zN|hNdu!52M#C40C>JiU80v`TX-%GT)CGEqBnmY#6;y^E}>ob_Hl<R#gB8X#@-Bobu zDP=19bfbf{TJ?|C-$5b8c-2E8UWm_$md^z`Rx_1E#`#l@0qR&rmX2Gt0z!4&4L$<W z@J2s5AE}HQ5!)TdFg$#Qu9kx271nPE_vYM5poirV0rDxf-82Ixr*RS<<G=CLch7S5 zTpAdla?(0M@CmLoxd7YtK>^YNZhFH7Qo)n8#-uETlP2~Zuk~}k`R$hNi|e$IG{as9 zmQ@dV2$+^+5;z-MM1zJ-tj=0;LGC7xx^KQb*+NEG`uODWm1{~;!k6O1`PQv?M40ca z6ny&sc5qc%th$y%S{SZc<*J^d`qJ21(RuLrot*KD{e@(c01!i9`kd8`ZKaV`UM4^8 z%d=!tow;zxA2ux6D+7*A2Gq&O=?{)^Wn$f{PKQB*(-{30&C``OfWy*EpdmYt3d0NX zupW`X;W>mX`c?@Y=Qud<T&<wh^CCoCFk=@(*UEz~rdnOwfqnCFxg`GJ)KtD62Rl$o zq7w62od3YrvJLCi2S%sUVAAsQOma#&a7hd@-Mc2AQ)@MqWxtYy+>TItB(E~1>DuaH z!;<BzvA+I6d!ddFQ!k}g4EL(Z4vjmX1O2ipEYr4l7P{sf!uX<ES7&Ti!VE`AwXb4j z`@}KGEd#sx<{mOn2~+y{v%M_xaX4Ep^<k$^Q~y`)M?(y67vt&CBS?iTK4s^b=Rh`) z1LF|cFhWsaorP2?>-lt1#=!W@n3J+_VY^dh=Rms#^z1JF14iOAwuOjO8N8}CZuM6c z9z~raVP#8CSSdP8o@@MN_eGn%knPH9B_!C8%i+HtR}!zD;5du3u%QvA-i`w6tGcVy z?gsoLXX=9Z8j^)x53-w!9XbvO1EFC1j#!)$wSk2mIdqSK21v{a8bSC;I@csqC#^#H zb*a3sqE{?Jat)}ScxS^rs18UUo%Zha*_;3|&CTg<Ku`*?P_**Gl5!zkf6W#IPd(t$ zW3%^hpvR_L+6z8vQ{C+lmgjw<LGu?d27|aD(+`NAqdY*YyG53Bg%~+)tVG)Mg@{rC ze!!CshBokem%V+^S`tBf=GRD(!xdRS|71HweoiDZU*B78<ns-S5`sd7j6a8#b@m@m z!OKJ@%=6mE8vSF}rqnZ_A>}X;45H!G2v~MnTT=5LJsnmYnDU2JZkxID0EVy@?WCv# z{8K=6??k%g{K13pnX8?t+EH=l!Hb=1^7ecUW{>By5-tIpv;%A1Ao8~s8j2ExvTAX* zSgi^EOK%<vJuZ~!5RRL=`dJnG^*^vR@6gTBbq98<IHx;iho+_(JwEf#fHpd(^FK15 zj9oL7`19!XjVmS5wOTYRcp8j7`d>!Zp!&DbG)-{Q75qQM<INoHI5R`o2YQ(tCdg6t znPL@IbjrlQPDpq-KvNWxm1?o+_o(0Pn-U4sLxl-5M@%AZ#1-!3E&8IzEY#4e@8=hE zR&bMnoz!qO0U<A;aA-gp&gjSRl}ec(J(}aS&OcXuBzJIpcD*bmk#0kBStQvQFKcuk z@+7~YK6V;{T7!6-opHEMsl0pH<p46f!4f8>s!J2`;CCZY8gJMoktK5ihqV-j^G;)! z>d?>c(ZJ3Q$Ez~U_btx0z&#L-Jh4lLN_l<rt|W8NWAeT#<xO?}R$mW{X<T4u`(TrS zie8acN%10jCbDikoG=pZ_T^`)sVNS6VP0e}Sw`2hGLx6GM#z$MX){*nLq>Z@a2;13 z^)JNgG8I5&J)lRb8=sQrC031r7E0pQ1`JUE0i~N5`AoiA%YsmElrfX6@HgslJCVa# zJF+?3`wqqDlbjsqJEw^GS{3pg@Kme~^2aO+MKp66XRaRrffpL|ZvM8<<v6p?>KBiS zt3iM9vdwUV3J$TO!PI#BuUNO_e1t0Wtkg{WEvJOelMh)YTz+X*_Pi8T+#t$Qa%~f% zAA!TSAfMiiOVMcAVeS0(_76}7g6}qS2fn<v-*lJ*$xyJNCqzxXEXELdB9FHBShW3X z2S0*VB-<eV?e*9a5Jqeq;t_*Tx{#E>xP+H#m`+6~P(e^qxCr+c+m#D4&Xri*i4mS7 zZM~KAzYh9!nQSNHxhNK6-gTkdP$l@g@$w1Jl+ZfPH3p^z5!BP7$CN)13=hHIm($jw z!7R@qB8W|r!TpGKl#A9Vo4!}tzVaAO7Ph~lOv(|N4R#Sw7$Fcw;9@!Vr{*CYC`*e9 zL@WS^Jj-GV4*qgffe-hqLWKG>$JOUP;iqguTi`op!)_bbQcKsb)%A^F-RMz^Fj(uF zV2y>>G8;tFZ2?+K{U>>7v{bf5kqt#fEA$m_yC{!@@q(rsVnqcLF16wBRmy%DX;XrE zDwW*05nL`OM<ZCaxl5i}C%npL8JGacJHBb`QMp|jqcVU?uNqp1a^<uC36{N*LMV4N zTshb>mXqIHe3LC+&6<S0?GlRDZ;3I&V^rnW4Zo!!PrfTfeEXGBBAHtSM|`;`l}ors zt9Vv1^>_@F>#+!%yh-o|_l;o45^W)5k9PbAz<NHi4!az4xWToMI~=)qbU{(G7Z{v~ zQ;lvhUWu&<fqapVzP^$DhkzT2B$TeAwB_|Q_ODWJ4BicxHRv?Lz*6(}gI<TvtN#&j z0Fpn63G6>E!mF{1qp>q}|M6^y>*t@o5KXI0iM5IAaC%0Di5trV|2o14V^&^Mq9&3I zZA-FE3IKjJF>*^<bQGyl(Su64fNmJoQOTcq&@C2=4o#ILGq^QHu}<4`(Jp@~*HW(N zcL*_XIVS{{XmILq?1e0rf{)oCI()o4@J3s#)Ek!wx7+R)+1ln}Optj%;JqL#^gnWP zBfOW4QN>ypX0Qr|ahm#2_b<_oXoErRts)Nv1L3UI<9_N$8ZES4{4;|$EA230Wa|Hk z-NbzfcN-C}nYVEvLy}nztZ)^svp$yV5}X6#SM|E7ru|WE)?ccIBum1a_y|DEpLv8U z2m(Q__V=?&RjVW}_~*879vDjkP;fE(XV?f<39tf`1@aG_j_A&1Lj6?(YVHa?MY2bM zt}rj?s7aM)GtXC3(l4(cRG^@g(S&S)w`8E(#A~&biRHPDKAUZ)=3s5XP2>E%rq+9s z2mQZN##C4OYf<>5RB;`+z{N@FRLO@m0Kls)%<Ei_*j74GT1ihL(VBrIxsO4-fv=AF zNwdLpCXUj@DS=#AFE@%jXuukFI4L_EJal^K`x`%#1*xqSl}}@^0%Z0&3vSkwPA#ag zO<^9^>`ZsTN&0L5pYsl+q0Ir$B5FP*B+nHvordih!@PTDS#?kY^)0sO&^Y2QbV@mu ztQ_ZIlAe7wUT8Gbkz-{6;=JaxQ0eu)xy?3!htq=Z^j9z~Uop8eprGs?r?I3hDw+zN zwl$bNrTif2aMwB{zpniSlu`KX_A7}+R<^$|;7jfX5EaCPQD{4*AtAmfH9_PuBxV%I z;h`|3isw)wDHeMIeldBLVSa@%F_0?rS)f(g!Y9t`Lp_8US!4m@c$&F3K%0o=kM=kU zO@U7i2jEo!CgDo<Ac*e<o+fPy367ro0B8^0FhF4{(RBHvR^W3}oL#)}3C|ksWv{F+ zMy{6v=~u(yWmIM86N6h-n?L3gk?H77>G#F^o?|}y?r-y!F#=fU@2CORyu{lk^)sw} zQC02JPzb+GBkU=TmyV0)4(o$f4|~RVJ`F?4K%H{@#kB`@4ZI>?X3aI1DuAU_#%Svi z6ElH!JI7@ndH((HZawyBQo}fmq3X?enijF1er-a!$=xA6RLiDBT2q%AcBHE2dw%vD z$%WJ=R&Oyi>s4Vg7QXCqLupuh;+0}3qH{cTg-PB2pMTTAR;SzNa4$(UuR#I|yrH?} zH8LbYAzY4^m@q>w`JsCmlNx?@^~OUl_dS$5sZ-#8%tmS?U|O4QZ?OHZIe89n>{zqh zez&(~H1+WUxnIxSI1=~rcQ_x$M6?_cMd?Qwj0<Q5w^jgAGc%+VS_}X3F&Z<(Q%D<m zhDf<z(1Bite7%O>qIk4be-2<6S3mC#)m0u4mh5Nn0~qe_{X+7uQD-MvWagq7!Ne{W zsHuyaB<k+wC{J^2#lyh+9DjP{in3G@2HWq0rJQ3RF#atz{O)3!$4NI*g!%w3Sl3q3 z)bIL~HoXV)Fi_qHWx5XRul_v~bL7fF!_QT;>i)@wKV1j@fZmaSv<p3^ATe&C7JCBQ z++pD~kvoYifvL0Azcz`1qcW|>5fLqM@iekB^4e5$cHrSbj=>aIiQz)`C(v_JBHj8U zA*%7d`GSurCuo7WMI<W3YhQ;7_HvM}f7gv<W+E}*y7}EHQttN&>~Vb7mNSM9Xcjh( z*hXm~z1ZzQzUJEcgY^D8CnhF*WKS9n!t2{abW+?T`~5~kuI!wsE-{E|HH-V;T0hrd zvb*5>lpcWlSD#_vWFq#M)BYq=%Ew3d77m1D&hXBZ7i^cXv@vTx-+}wg=_=w<4sPd4 zl|yi@cbSsvK;U|HK3M1ZjJDA%PqOOB!8n2<;}6j*XrO-NT6h;tWxgKfMort}kQ?*P zlaIndW+rQv3cXegDc$gc2I*!Ir?&%Ek79q${}Kc$g_5I0KG_>C3UT%7uZhimF*<q| z(dDLo$2UmOjn*Z-2V$ybpAk4tGG$se{>Ig096QdSl`!SmV_W7MDc6VQV%tT_I;JwQ z<Q-`ulLm=fc+sjm3z|@YOvQuWRv``c`*z;`m70uF=~ulvPHoXz!p0^gv=${5;*8TG zOMfy=kv=cC&KOM4IVZ-uDgx==SD`d=vI7V`&S#DhU2!bY7;X7H&t`W8FvDq6oE6&* zd}DD%dy)pnE|Y(ee^P3H?p5+GMsNyfinM#R)!FmS9rG!duzxR}KWMc06;;#3f)0(p zpv)dibNJcPfCKsD=?3<;F)uui1YJChA;);DLY5MWEbqtU7}=N25w{b*?#^+k+xNvw zqZ5Bk;WYZiag_A~vQ#I~eZ1OjwlZ}_Rsg+*0x#5p>Xz`Uhb*sLA(DV6Ff7OE6pO?0 zyLOroQ#?*ouVh(ky+zzQ4|zL}e`)Elv1vh29uCGx_`B@F5Ot>Bz|6u)%?2X_Af8dy zDG!CJu%mhjB>Uv_HfdXUf58)|m@~JN;1RF@{!%4i&JH2@fyj}o+Mu7<c7%^nR~?_y zWEQAqLJPhlpzd_OsFMJnz(~wBi?PDLMt}8=pa2K|zH!gi@~pW%o~WBVDo2_R*lQW4 zy|Z~cjOIh4<#12z9h-QsgNT8hg+AfA4qtZ|n{h~_FHi^}GTW`{r^N_a<5?QD45!!^ zsuIabBq<Z3cQ`cRPRzgdk2>vxEk}Q1Z5BuV#wEX3V<|_bWu6GmMp>QxSoE--689_K zjp_3l1d~>(PNNcmI33$zWmk*&M>eAFz?AkV4@kiJV*nWZ4zUhSfZC8Xv?U(Le!`*8 zIzEJg_cGrtg9^;hs$pbcwITfBKl@o<@Zj7Rhb_<mf78A((!UVR-sJ+6by1sRlKqtW z#)YzhE^2DhLs&bRu72a?A|uH7ysJ%qyyrYgD(vZyb#D}$;93eKWh{*rh$bSz$R=N1 z{hkLqJX}U3QITIW1YvL0EY>ukC~%o2<jQD=;?pv}hO7x~@!_D65+Qc;1w*Z7`!zF^ zYjH{`An!?Q&g?rdet?0}oaT%yJ}@VnlamFco4giZp)?$pbOwWX&d}?&spW-zn489M zPU}3-LKIbryY0qWXPbT}|DL~%zsa0RJiX~y@4HHkS`ueJpUqi<X$Un$ae<Z21b7Hx zt>evLVFS`A`SD=>)65u8-XH*^XnCrEfiN#N9UD{f*ibn$frI+<5C(U$ULSgwdL5{V zBC!X2?E9pD-&nC+YoGCupRP?@mS-SF>*ncmIOYtUia197`<_?z1lcnJo}Rg?^Ozt2 zeM{unrA0dtgW<i+F}nPUyjC90nes6Q7fC;cf|s^tNM+aiccB@pZ@y-h7;`)iSUO?w zp>|R%uElh(ajev~vUQ0{4+44}>0x69^Yieo8KAH6W*z>N=n7aM|Iz_lghyR#I)AUt zkS+y+5uwJQSx7=#5gFQ0Bi5&TS5kY(t&Cgdl1~TbM|}_A(SK3~dXxJ@sk1wjt5k4( zk#ce$+JVX2czO}@gT9npZI3)8Q{gxy+4$G^h9@Xr7ysW4EQd??#Y`}DBi<%O;$qJ+ z5V`54{)E4~8k9_OHoL<(=&qNfjX#f0XJAGbUJ?y8Tfpj8kneu$sVxsLyI4Y6{VC@F zUL0pE_v?<Zch%JzpI|rmI+bFO{U<+tiLv`+97n2RxW#IdXo(NxI%?A(X{~|OoM`{g z`@8Qutc__qbcPfjKkgi>*lZabI5#EC=H7Xtt%E8p&vPf4Ll`YsR#Y7UEuW8}0aVWW z3*8^xpFV_GPPt^<5khE~2}{^~>|M~acxU{1yVEm>dE6cFxp;hW@^`a+n3$R~=ePU3 zQxZ5df9ni8?^~dC0G+cYcy4{#Tl*W)x|gjI20S(p9G{xuhajj<vd;;X^L0}wi`cdb zvaW|lX<{VR4;y&}Tv!)`o9itXil{7kAoyp{=aZGQ(Rf+g3^GY`rt#hO^1Rf-o-@Zs zqn+1OygEEyeXQi+FFW}9x912j$PHy9CL!{@${J%F9w~mL1Z*Mqr4}!@qA%Ltq01T^ zw<XYLt_9@O5qJNIzvJinus&NsdD}On%5%uoUO;fg9W|5FgOi8Zpu!<1$(C4v&tFTA z-^r*9?TFo9elIt>NbRH!yc#AYfOW?2LwGa=#j#*j!@Ic^iS(OA=QRYqerBE?El&;= zO7?9|M}`K$Ebv>EUS)OL=?*^R{_Qy=m>((YRm%qfpM}V8&?yuD<qMExpDG_Kz+dbj zWpaXK#w|}JVY(t6O{(R1>Eyd?oTb1kO$NZ+;vM#|On<k~83*OE($;}QP9yB2vcOp% zY!8~-rK2#dsaW@ZEKQ$UDQn*OW(5MTgI@Ai!lm94jd?_nxbo+Ne_PZ<`mt#!p$1eN zG{mU+V#8)gJLqvkVt}N8U1!@ejbWAeMswtgRr>W`K4c%N(@t3dmND-k<84Vs<A59S z6VVj6>(?3R$F78;xYnn6)|>GNJm)f$Tvl{8n3tF>^$U*bvqPg@O+<^-q$AzGtZNg* zq%UlBz08rnqGzs}-DTZRfy#W%h#Vp6GaW8F26E<)ydRSEHS9%pyA9gGoY{jq1Zai- zlg}T=xBpB(rm6x@Bk7HW{l{S+@Jl^{Ika)n9@3zKp%9_OU53Z?Ay0Hhjm#B|c)SaH z(w$0IVH3c}N4Hjd^fxi<GPzLU?c|g~{J`ErAmx=chuJo}rO{LrqLb(_cVcb~-2Hft zMwO9w(WwX0h78G4bC|W7BMoOBHTl#MQ{+osfGS<<#^hL-%TG5YNfm2DyUWz?=QsvS zz_c$uBE<wMp7T;X+Js+}a~+MC(I}L{-L>DtW_KKVr}#4w&%cba+jB*$y&AA@J44O9 z$q-we-jb|u0EI`|ci~Xib<o;5g(9eF9Cy2&3E{Z)yt#WD1}pcC?xE(v1_;?=<Q@i@ z{zu+uavFO$BnRC;k%lu?0X;94X?}Y5&!i*hW1&AF+sUe<aCAw<pG0eUVhXuK0%%7( z%VaHILEMr@qn;W&Q%`nshWm?MA=TXmLzkCsH+kgNN7+^b`6Cgx+`|1WLg#4Hvo|A? zZCATDw1~P)fEyuuxXPiO=jCis6y@Yk%ZQSY*&K|{iFw{QD@rwK>gPG>W>O(ZnqtXa zbZfQB-iCY!sLj>G(A0e}50s`<f-)__JVSA{;K3ais){jZJ6bf-rZO`yJ0(#!&4`>! z<yxCR0CiB!V?T$5pObOVxr%|3zT^RqQzT`QcgbqeKqNm3q8Wk*{yI-+*?A}2t%*rW zt?O7Cx#?baft860YzeU_v9jTza~ZLj^svxiXP6FB1eW}Z0a$X4se%V}N_^@+`g@>@ ze3t`a{86Cq)?8KnjfNd-p=P&)-cGN$A|!n}h@p(StXEwR#|>~0mEp9dXVAsXL1eBk z0sP5RRznF@7O68tU+#YoF#cA<d>`D6(^2aG=}HMZviWBNwiu`fo(u4H(&C*LlR_s< zZMTa|@abxON+R1d^9R;WEG!eV<P|nxQ2e~khqjQ<dPmLWnk(`_b)@y%;d0wSn&tv) zNFsb6L=LT6j!us4YJVQ4GE1_4Z~P6j*EeR{V{z&u<N(Y@ngfU4dbBcFy#J_?_2+@N zO&gQd;1~-(V=3XI`o>Nj{Xa;G@f{-t*k5UWp{8m~7e@rI?u&Jd&h*C@tP;N3(Szp7 z<md!p!m9GBIk19KWC#|8krmB4^gtuWuu?}L7Og%S+_4A=v22xl(@rsL$`fs{QztA) zZ`wxW*IH@Jarr{UPMH&tc~E@lJY?fuLJJDhugpSGG2-I+Jm#Mz^a+X~l(!+Am#N8q zptP=cbx7zM3M31ok1MLOdYHzds3faB`vr0o&(Pp;gN6bGCk?I$p9Dk47^l70VETj5 zn@_p)b!P+j{iU(y_!gv{BIJ?UT2(w1J1*N;hTy^j%6>d<)T@+k^=Ju9#*4N1*JyPG zF^s0m4hZ;OXo;+#$RUsD0j51ul5I|UqyFua00ONb)s0r>$ED!X43fAu26+18iFk43 zzJcg&=Tz#aa$;cbD$2B^#!?J+Q##9yn|3@Yk+84_I5(=(++^JPGS7iBf`e3lcnQlB z%b>oAW5LR~?Pt=VbJQT-&v$|ZnX6UZ&E=C8>a;F8)AOb$5WM!5ULntJo;gXk!iz5k zvg=<N564RKAw8xXtwB8dD5YZ(cDtzb#J>O(U@lr3K~0BaiQpe=nG8fWCmb@wt1AqG zVCL2c2k5aL)`N)lHt~2Fcc&812WvCyoqAJhRKg<c`g-4B>+!vY9EDabRP|k6eZ<T} z775I4{MO0Yj5n@~;Dkq-WQJ#QNd>{-!5k<DejM{WauoCrhpx^yFC02+&hNmf{Fnq1 z!ywm3dD-b!Nnpp926l8B?V1I>dJ}wVMbF%**0Q;BTg(h^Wmjx>uD0c#_b9z1E~h+v z6R+-y^N%)NA9Tp85d+#3`u6BoB45tWg}eJwj04cEG8|XFb#;nSF_JIe32REiqveNf zmAqdf!{k{VIAJ1Lz0l%3DDN>-8@eCQx{mWiP!qOyeZ+DY8_;ZHQOwQE+`UgqO@?uZ zs5^-F)lLi?B)N@)3XVa<Y6S=)3V<Y(d|1)Tg@0I$?nrss3aPq|T<S_)UzhR79Q+Ev zq_YcJTWa1E8g5Asb1#%St)b}S$aF*bq%i`cZ`~Zh7xax}2~r)WAefifjUyhR$j}lY zEIN+|pt@1e0QXRvFO6%&>-u(kG5?aHhnE}VTGuX8sa`6;Z>f&%L?^QaM(7r-e)3ku z$U|W?1Y$qEe#A)@u~KrV99Pq|ATXletCELFzpUijlIchm2)eWB)AyG=aE;`Ksw_Y+ zjld&8zXS~fE%N3w@azP_#r`&~wAb71uPuO{KElCs!!civY6eoIFZv-%%4rf&99R<^ z?w>PMO|PMhpCLVPC#Km=+9d0GY0|T?iy=3m@;tC{@R8{wx<v5(T|MOj2c2tB`sZ|| z>*_yf*Md@herL%PA)zO-(Y?*E9ZD6J2UhQ;LIq_~o%-l`=%Etnn8N~$U1N~BdoSw! z!JCpNvH+JRuAGJDlLz3$fhAbNU*D{q4l~2P1-t|Yg=n(CtA(5<X-U5BrUHYiOc~o4 zrjuXaUzbUE|6<I6{r-8=9j;6-j|3)JGV;2K6wDcAFo$GW4ky3J4sX=idl>kehc)Dk zq8?9&bN@7q+>`pP4Rv@!YrV%K!s6MhP%W95db3!sfV1uw7$L@JoTX=}i(PQ9RwxFr z(|tg|s}wAOgr+p{&RQ9qfDN?S80qU10u^&y+IV@%gWq#9@$9t3XoK+fepdhE$M3~y z$gkx#)-;0B5Cwv))q7?>?Ff#Q)i$1(EBOh>m_w}AQrVtG_(bjv73r@?^VNm~7g=Mw zE^BZDh3Ygna&cK2%>>-%=@tj|vRw?izza`VKB2$>09yxdvCZ$Ng_|8nS*JXa#Yo2x z^-6In^>hRK7`;);ml2bed9bx*;BhOiHVBhsbA>g}-_F>H{F``XV94CPD3q_#Xs|BS zX$*?*>q!VIm1M=nk;08r0!$Q;!MV$5igd*BGg&%Ro4@+<n1nD5Kcc@0z9}h_C&BC4 z)T*{SXX&MI2bZPw0G1F<%6r4AyM2}^Fm6euq09Diw)<vyl~I<t&|75}6vM9%01dmD zmP&f)K@el010>(|LA~+L%aE&8w0O!oYd1)0uN1h_dr`jUKQ5;qW_qqU39R5SNw_r; z{>=qG$u*<r%qEb7*+dyANwk1<f?f_Fy=V4mBTU@_T0Eji)BDQGm2F_~-~mBa<{-_^ zo*2=9j*NKrlC2QDJhrGj6bW2Qa}64kN7<Dh=qfnAjE-RdcQ_nd%wnn!(!guSX$?6L zV3)hJC>=W!2JOPg(12uqcd%Yrz69*ngZ`o~QeOUayXR;cqR(>f)hKQNGeFG07PH?y z@rE-Zhvdib9pYDD#!3b_%*@rwwSc8Y%$+y%lJms2s{&hH?<h$EChs5X%dwpPhO+h0 zTa^42t4qXG9&iI{1=4$5z*EHlxVG|!lmOV7I~jbKSGItCcQg+4jUm&P?Cv`_d)K{# zNBBDWDXR;X*q$+!3ifHEf94ew)Q9R{k$}`Z*PoLLW{)73G%o3fH2xH`9vi`o*DvdJ zzxN^Pdv8O@;}q{^$zIyLTA*_%0xV0CLXf9?gCJRYis0|pq^{Y25wQ)`h$WJ%u9^<P z3*&3r!R(c}Hk(?P=>BhvSb4Ms<zSaPw$1l$#mA5O|8Ci3LF-WN<E7tY=Fs6|T+|2f z^&E_C-#xb!htk!4VmUxNKjZI`T*s1RY{<p~?yTmK2}kZ-Ip7Vr?$w+ru;Ov~@l@V| zdo@`twN6pKKyHq<N5;>#RFW)?H(p}#4Hw$FjKtSLO@Qj?44iJNhU@JKo^{DBb^=jX zz73M8a-qMUf_WO-@O+plxop|ozMBn=hXFp?ZHhHAXWxxjFG{_4^F%MFe{Nbgh|ey2 z8D_jLRZ0owdkLsF*Ud%a=5-X5kl{1Lq#VPkdEw)8S$jCTb7R;^PRoI^iSG9wf!S^T z_xnfZSc#fc5!r*R7UQ`fEE|7NH!+KN@!ueAD%vF#4{>4@%PTG7%`;kWS=-le0mlTt zu}DddZCuaMcmjK7d6K2&OgI1lgV&RdP#2Up4<;!IlfOC<HG`=Ify31?)~-QWcJa@k zrS9uwlR1j$3HaOlLb-nSleuk2tZtcv99NyEvr2*7DLjIeqcD2h4Md~G6C$E1@gGBu z@tYP3r6zBms8Fi7_TLlD^wxEkCf)6R8YsVOk7=Vh*|ib?0#oRYCUH5PX_0t2X;VO< z3X=)3<X(xB3v{Mh^k_2v^~FI+)yIyL-c0_;vl9Ik5nn&2Quo<~t{>Rz`C+4p3msxZ znv4hhW!MM}cHV)X51W^kJ{;*!<S`Z!3_wuOLtE;~ysVTMCxXs_?cJvP%evbdDQ~)D zg^3<M4tO0dmnVARZq!u65}pO6WBrt*<-56AGY4>AugGVNuC==Jv|3pg%WH9(S;pud zjpTbk59d`{p-qo-CJAC&6+%PfeP!Z5nfi~!)cKyvs2#Oz<EvAYuBx+*IBWBfttba9 zgm$*B5%$0E%IlmAv1`yfGSCd44n^F**H*bOze-9PRvdPn0mq(CoEjUcTB;O#O0ZN4 z!bSiDi7m74ddc^<8S3-+9__XeAQxiuF&=gM)vK#KdOGY}a#7oeM*+2reFs2`^PuHN zt^hm_wt2Xno46;L@*jxxxaYRKapsB{q3eb{pl_QD0W1z7I=UcCY>XDf6r5~-!H`mn zGeHKxZzha$TF3&yrQ+{tL)OD@d?vzVyaB0zKx6vpkQ6->!{LAsB@Q?QKb{~ONCF;) z^ZBaOVo-T+Sb$opryP-S?)WEK%5i5bd~pTUd^QDcOud2McBHNAz8gE~C4y!wX67Ni z5mJLs9R&kblwD8)hQZYoy3e+{taip`+%da#{q?>BdPDhL3V?Qucg^D}0>^bsy3Mvc z8Y(l)IiY;p#6~?#aC`;Ija{ER+e4Ud)`mpvbZCO7Dmdod^Q0AxHOg-ujLhntE(`<3 zcDg{{zhp9oT<Cz{qaTQ@79N_<3!Kv$k_-IeJyX2WItbp<mdz2$q2|EftGOSr==78_ zmal-%B_|t0V~*~v?=!7-8~R)11c&u5ff`g`M?eAJn(RU83?Ga>If%Wjwsi*uJpj+$ z_ZS6*%0tKpmBqZG8n<67pC(Q5eBOwhL~3-L-?@dVYOM5(JrfBsZHNGAD8MWl8~{=k z<9#z*P;ot+NwrNG9*&|69Ml`Xn3q{ZVI9}>8at4(icsS+TW+I0ku@C2b9tfvWvLJ2 z`S|a_u&i?d8E}0m%~U<?Ow*buiGi;`Z9=LGgOXFgAS&`M=YRoB>IY+pW4r>=5Q-qv z1ImJZuv=?%2U2}JzZqrdR7Ka<b(Iv!-*RUlGwr@I3R5JcgCNm@uG}IF2z<fGO=XBN zn5sStU&6>sj3eP%0=G*3F=wawcj{=CJ(i<X);vuSUb_gxP$E2$7vK85X=~^{vey|> z<4L2U>2hvvtJ7+!v5-RfjW_EU5F88jpV4c=)TaCj)kV~;`!itmWZ9bjJ#<_}(A5t| z=N|#^`U@6sv`qH3Ddzjn%()#k1h7jc^8L9TQ((CfAdviZN@3A(mf?T*ZHS^hN;xCJ z!0L93PS}96Mf}c_c|IfG%q7U}mm$1X<dJX*>26%z;HNzM+tYr?vo$u<QXh|bRF4R^ zvm_)g?kD=J#k>x|3rJUe3qqP;FgbtgiBCwcu8k=XCVxCDqC}ang-M4{LTI=+-wdes zc3<jFO#eg2fXU!-Gls|uQZr2=N_yG~uL`-k;<%1|7c7FPvqjlKSe*pepmOCk))a}R zG{Hjy3TURQXW@v(X7<d-M(Tb^mmKB|0UoC$xkZ(@f_V5;Ul6mmDZfK>s{jlr#)?zX zqvtv!aYEEUAxHhdfoug2tnjAZH80S0gw3Uazo-!UU$r_R2u~?_xShajY4y^nOq}F! zxl*8+4QY>spWu1PAH@Z*8+Q6Zm(p4&lB6o<x->sL0{PF<EQcA*RSg{6eI4qRWRcjB zzD55t?;qZXZwHHHz<roL6ZLrdq$Y3)LQb_v@sIRJtu0|=*KLr&H&*bt-xPB(dXJah z$3k3ckm^@J_#PLN$DO#5SJ?R}Wxox`Wovb>=2++X!~sz9B_nrY{`G=Sh4JlEiRZf$ z%p?3+A~|av5M*#L_Kc2_#sDgQBdD6|SAHs-;+W@CvO>effSbD)lG)rup>^3<Z&3jj z^<olkyeQgNhaD-5<SPH-_9dG&;UC@XB8sn(b4Dki*VG1OF9NH`j5Pb!w*Qe9Sn18h z9H)443ST~|;2{O!#EU4Tl~L<A^uqL{eH9a!{p1dzU+Br6H{!7Y!x<0j>+=&vBvLGc z1xr4G=!SvQDogXCB*WdOkgYOyx?pp5+qmff8x&ZLysvpr)iZhm%L$EW&TMpVfvJQq z%w$}&cPrVE8-LnKrhj$B+18qMm$2CYRS7`^@kPt@o*`d_c6%DCuVsFk*6sw{e`R;s zhjeoV%M5FcJs)1*?(eCg99%pS^0l}k(hnscC?wfqp+imQJh>nZn1J)}>{ZVdFbwe} z-oW_Tiw?FZ$F>7Bi5WnM30AYeWaFgb>Z3G6u9rwbHpzM)<V1$psqA^lkC=i=+#kpr zKZDQ9n^0GAV8`K*qJ3`dX$r)tX_;l3Pom%w1@P2Lo?e=*bq!!wg>o7#>U}8G0Y`bh zC&!K`_L^14M|iUkkR9awgM4SjIVHJ~{_Z}pv=oP{0G!hc*D2UF^*0XJMc!=!xTQZv zEkD6-=VvXSs>i=UluB-5FWcX0XOv6pAk0`ujCiH6+)A@g+=RRPrjeDIG*a`e37C+i z&ep9_UoA#Y7-SA4T@q$^PNT7DL%xx`P(3d81e%Y#!z4FCwP#wV)AsCLmLGIe$Nx<E z@B~COoN!=EQW>L%*I8wPrE=R6<cgyeYkU*5GdjDHrJ3n%a`!lk1$xV)XQNXVe@EGP z3XAi>DBt7u`PE)<S3={=!*-p^9Fh2*rP)2ovs31t5Ko2WXh<y_$u+Lj$!IjmF9G>f zyHN+xbLha@g%p6ce@m5rI%n?euu4?vpRETPv@iZ#LrX(!AO8&+PU-*?iD`fIM+Ubj zO3A>Fim2Sey;Ex)oPwA9Xca)=FUT~j2`(|?QmN&e8?<c)q#jLy=TC4F&*RpaeB!s; zeS?$Z_TtXH5mnqrHvR0cR8}x<Hp2{gjIoH0q*HUWWgu?azedgJi{*!S8-!hs!8AV; zN(PpPFKb@AHGM@uv<cg#Q$v<M;PoMRj^6pvQ|V~i?p>>HO5G1ombim9$)Fuo;UI8s z!3oV^_-X5^V98@bcv=}%(sG3NnPPk=lp|SB*HgL`!Je`SWlq$Ewj%M7onDBLcQuH8 zUr~s-`_OdCSRsmmjq7SjTj&2)cqjCHX5U2q0#}N*M#>`LZgbmrx%p-Rn;}h4?PHW! z^YXuTkd>t2!TFrv8Mdv%-R{M^SXs}Q=kdX2u55%IG?)x{hL7)a@}XN)bfp07PeT*O zAClA)^<ZoaJ{a~&u;gIPS^@BtSNgjU$y++|H1Ci<Sdpvf$+#g~34t>UM{qxN&P~m; z8N4PezEe`JSqPi&+HIchQbl&CPEJcx=MZ>^OQSBtn+@hfZF#VsS1W7^gKL&O&VoWj z6%E70c#6^Hmutr_;w2+Ab~({%f+p>#6aML$W^h@aNDq1JdM1dU3;YIHPNb?yVN5oX zBL)xw>JH$sKlr8<g1}rz;8kaMO-P)DNmr#@!}f?-8&ro-ONtbVr`;tsy9^b#YlDpm zoq1pNLmAvQ-TJ(o6!+fgn9%*}Lu)<!bVbF}ZlvsRT1z1`IH(^UUfO;BqzbEhrVv-f zk(0FP6uzX$#ro!6G1rotyOgmOwi@-!7m6w@LTqOOq;dM)Tv&<Kh{6?4I1>AD&+|T+ zRB+eC^FXiGIw)WjVO8jdOW8`_VkjwiH$d_-rqEL4moRI(fmED1!q;8h5Xx7UAS7Te zUFsijljb$%%w?T1H}QA_b!fEO@Hc`VGgt=;^}y&d$k<Eb?!aMg7{-0=!cN+R=My3Q zdE9n$Zq9A(NTmVO<IuOA1DB7VPLJwiE>&T-tenyD_p{EVEp=Z;!(6RM!edz?Pq!^l z<WVU=N#QuO&kVf90mdp=!3|tZQlydde9PFmQs4K$9XD*Lg{Q?(9MlByl+%_Yxg|N1 zqG}LOlPGRXn0I8EkWqEXutfTypz9zjl=@f8EF#(~u9KjR#tLQnYLD?&iXk{OF@frS zfjK4M!Zdc9RQ|(qaFFb5G#hMTw}Wqw@f1i(>O$16TEjzHpB>qHXO6}KwSOkMUNW}I zRsiT=WxxK)Adt2e?X{HsMKRmLWV0UlVQlnKiW-vp#0xRT!z5Mj;hM}Cv~omUO~7Ar zc`8mXg~`2=PrDoT;yZQ6SozsX*?8riX>H)YICc5=(7Y{-M4Pa7al#2xB`!{~B$Qkt z%d78=iB}x+xY@L6rv<3AtDUhp6@Qp{U2f|AupaNJU%UC8Qm}w&g%VHVVjFTZ^x7K+ zS8r8f9FiGb6Ea}I0CFz{a1*Bf0gri{<iz-_l2{?gZaYO$v*&VYi&%;E_@7poBL2}% zfg%So?Xx6le^8?&J2du1yiJ+NNa7ISA+VW#qmO$|Mt&FyB4}I}G8TNKCPl}SINs|d z|GNDlcUqRj=EXfqX#^joLnYHz{~ON*-YO#*Hug{h4O$hrwa=HzV54<xia}P?6^VvI z^TY~n+Utw?TjsTTdbe&C?m%FewR^%JsL^C$R{+5SGJ4dIwfLV0rh-%e3<TM(YJ(WN z$$y^pXMp*0m1w0}gv%os&0Lb4wNOw}8NORaVQCWz<S4GY&=E}+MssvO1G>u@MXH>j zh<mMc($$Gg*!19T@-@=5#7ITKP_~&bfUTAlosAgXq(6CVdVjk!Lt1_(nf<p}&mcp& z541<xMygwxo)o`|h7=Ok(qft{1{p!9=6bhQ%*D5J{KC1bR|xyD%?6hkHnKw;7`a<? z^uw3?Bf-%EU0HeZPX0^&U)!_c*Oh7ebYDeViB5XulQnQ>5DN0gOra230x1y=%Qs&e zK!m7%|B(Qtk${i*Y#@_p%!SEau}w!*2#DV5y_FX(K=dqUXnrr3W~MtE33&W{InS(y zRSTvV#R#eVU^<jVJKp~U)aW{*>Hu2BH*l=ur=;*Hmt8>r{;7W3I#9JU>!&6IK{g?_ zxxjXw`=;RIu8&?<SiUD_QkyvXOpKpLqQVbOW*;@Ipy*$2r!FJ>!cZy42}?`1cn{Jg zM-RNAbs3rO=;xu}=!x{e0YR)1WI5TZ@>~gTJEo!f=S_&tQQ^WMO!(3lmWZZe>7jY8 z`LP<|xtBt4i9bUXqE(nY!Nikj3lD@_e=_}-5y}-kj%Q#RpOvt8M(96z@(_kld{mqj zrmOhm<PK^N1|kH!{X``NqlPlfkGKkkLyDBu<%dRp1M$(iXb@Zjk1lmRc}2R%7Db-g z%Q%rZ8Cgow-{dQwjK>fvc5^V}@*VX*80esnIgbax@wpW^m3N6hi-6q<TqxKaTqq^) z|6YM<RS;MiXd+ZD3t%J#2enkcwI^Gl2J=oGVOBh8Cv!&BDT7>h7eZ$Xb+YyK<1QD5 zm7;edKcV%<>;#u2($m@(`bx`vnu9-9Pc@Lr!)t!(PmMK=7b-l*)I6NJTQ{qrr66K^ z5vzTSL08Q=w*O;LJT!VeX-M=wPyFQ>eD&JE?If@jQ@k7kUfZ5p8&mICXWr7v=tiNk z8}uo<4wQZ!S&O~hsApsqw^7(#Vt)#Df{GwP{eKuAbkjWUQMD|3&1Jm|`bNoTpk5)+ zhiF{RqS*l<uEsmaROl-x@#y(ysmm(tbXmt55&o%DAG}(Uw_%flxN<Duwj$r`2ni~0 z=>5EAR!l>Xnb&3w9R?m|!K^|`vSzi9m|#s(ZZ#eabjqPAj1nhBm=id4q3kD9vTtO2 z9|fDUy45SJDim*&i}vwq6XUYg2pw1n?G{m%!_UEBy|MGT9dg$=M(d)3ESXuzWf7=v z1t3*elQ|$c{(G()52eobsE0GjVWE~_GjRL_8N#N<$&7_})<#SU)%8eXH_vsxt<65y z^id!@*)TGHy7^e8;sXrQ0RlK-k4<>ITwQ5k6S4DdH9nXtvp+eHGro^c7}AQL<d1s{ zF<@(K<BS=yIJEY;0y(=G-k+{phQCtDZ2cR9X6F!DS6G<NMCAuSsIA%d%jifTId#qY z4chKL##*x4B_!fGb-H4b`Lj|S7Suux3OA(w?YM0v<Qim;^FJ@SK;EnI&bfecDxGAu zH}c6FCq%aBY+!>8DRp%(f#z-u#kyi;c`2uxOhXpL>cE=Z-q~x%_y||<aJH5b%9hiM zU_Y?%>$E+uh=;ph?tt5;30uSMf@hz0A~Q;?lJ0(EI%nh-GAqu+pKLn(p5wFFI=@YJ zSiNm+_THi)ts)YbI@@P$*Wxm_+#Wj9y3e(or1E>n!>>ISSct1G{(w4_fob&0Lu@vv zHmuAy@mnU0XEt=hDswBjn;VVQfz(Bg5z#DD2r|g!>=hoHpbJ&mZe&vgX+5auW)rOg z>~)N{yZtE{_O)yUu<MF+^0URQT~WSN9(nHWwiXu>AI?g7P~04EZS`EKRZ4vpQlt47 z7!<R{Jxh=SMz2_GDO9^KDQ!KOnoHv@A9x%?i{@)+rvN32qx1_(^?~JtPudT4uLNjM zhXM^6m5<z)D17;nlsH1P-il^!7geQQ=^sT{8Re;C4NfMT0nRXW?d0_e4G?bw$B6<F zmE8=SiO8H!$7@r|nf_cS5)lS1iSG~};&?28cc-=^A}3{Ve#pp0n?lg`T;ni-N81Ev z9_2l3`Sz;mHKC|zzqot@Y`5%gn{e8HYtltblQA|6w)JO`6gW2N+Nyimfj<=($pI@} zRbo#Ws29!QeEU6RF7zGvm7~YD&v-_2>7fLyq+?)Bg?*tGJ)goqzKf9E#Yf~;Ia}qB z0zfLzkjt6a==HQ9r7V?IuHJ2R(R)eP!0tSfdKiqk&O#RzV<#=P;j@Ak9fdRRbTwPv zK4`HdV^AAt>zkR~tn0u$Krg6apFd3!j$r<fo`#^lzae7)zr*hk-gA!?HHl_N=0W7b zhsU3^OeDvn=c~m^mk}bXOe)%*_Y9pDd@{6&JGik_aaDXDtDvvc>I#EEW=}E95{Rat zfAJf<t*tnQa20cQydR8_<(N{IBn&S9%k-%!;(48M|9gi8Gn$()7%>&n(^n*0U;^j6 zuhVraA8PYw>slnj7dpGkoyYbKVAgRf>TdO1B1;8a?75H#sQBoxZJUgmCYv5ZTca?J zO=PN_%FO^Hc9)DyAHP%St(YfgvBlIJi4aW4-#0#!4X687{})pT@l+d-6#Cb;ihgq_ zW0VQEgToc_2pt;<@t=?SyDhDllT5Rv)=rF?SghCJD~Zzlh^GO+as%Gvs*sPMyxQ^c z%ZbGjam>X)0AC8nFB-i+F}ZtE2E22w7FRI&Q6lF>rAh>j75a@7@FUQ*7hA5d^L)MT zQn5gQXJbnghrP_#cXQpSw)6_LizaRVOw$-EB;B;aa<#}#Z(u|WlS}*jWL6ZGm87U! zKk=JJ=DF!j#^aCBcyqY|_7^Jhc(2l9FplgDB&=eY?r0I7YNKG(>#tbaH<#CXxE+9~ z$(c+p$4<e4rL6=dhfR0FV@OaGyN_lKEud&Zt-FB!4mYE03nY{jlREI;_2sdT(`jpG zl4q8%i+ocQ$v*e25YdR>jEV-Fri5c=@sHDaB8mbAg#+g`p!r!QI-=&S2-r1SW;Xz1 z33Q}zU1uA;J{3+5-ZExZ2nVgJDY@R)3{!SiBr!+{d+>AR_+eswtg8zNNFMP0W(f?N zglRe~4d8j&)(thh4F07-D7IZ0LX5GY968Bft?zxUs%%9$Y+WX&RMIwf;qcJw2h+wz zqQnYXkG{a|LV?=omM{yv0ASPbHmL!R%D2jGUX^r9xTYz_#-sjqUdmZ-ijEgrJqr+a zX;kFFY)^OP(Xv~x<4yfK|DiB+83KW5m>F#5+T*mzL(XIfOiD0R&rp)_2!lDeKY<D& zxj7YOnQ%`c50MWvF}t#BGRsOP{Cc0J#4a-&<u>wQ?PIs%Wdy`;DdoS<6~$`6k?$5T zE~&;DA}4X^EgKdEkvR(sPj^8)E7(m}9+D#2tq3GH`sq_W+1bF+DchJgaQxiQD%#$T zkmrap^3o<tRRt$J2$DA&pmgR4gP}o$vbA=|MJ#RZ9&TA&fCaRZRe1`Y^W6EN*_roz ze<ky5q-j82{qYaHUXoNVygw{-;Nuzi?P``UZos*&Owd^`)oI0Gf-r-Y<fx5m&z;oR z7Mg`aFK;X_rE{IfS&je>7y4qIroddKsoJ{(D;op*wMlAUY)|WIlNoCX&>YBVE)!A8 zKfx>giG311a+@!5VwN0?xc*jZ8B<Ds{58<G6HJEp)L|ENfgg6ImzX9ih}F)43sNkF zW-)e5gVvG_q0um&=_{E@Z#H#%>f#GwOmSSWhVx*0qiF^Vja`^<G=NuezyMIMTal1( z<T+7WzV9wXfW-r#SX<M)YF*7ELN(0mrGml_@}^;BN6LzL4QstVC&sE^3zD08tN+{W zD_gEq2<AAFZ1Yu`o(d*+|L)DgG$|l2_#i`b9h0~G>;+Sn<+fNE5u}Qx`#2TK(77B^ zjiN|F&}1W6My{n_?(F#z?zhP^y8GApka<?Pq2{#WQvEIH0mFNg^F3|{<y8FLtr8K? zK&2M+28AxspFtdBXd_?Zisb!q>KLGt(tIcd)k<+#qB6ngvj6(Eq_|E_q9IN~{v!&J zBq51b*b=6ItM&47vzNZEf-LiC`#M|xvOeD&%MuOZd(0oBPtLa>zPdZy-ewWmh!MQF zIhk0eR^(B&mz~rPzmEt;y}ta~Jyp0A!-Nnd=TT%&5yhFRa5=8C5X*y@IBc$>8>xp? zAss&ig|v3=@LoVDoA)bu`sy%-Z3uLgfw@E2PiQQwn~T7Lie|x`QS+)eM_&rF;@!Gi z%{(z}O6K@k-}QlC@d<Y)qW3FrqRi2k&E<u$RoB*1CTWDFMl3!_?-DJ0tUck)m=D&s z=B{NiuSK<>0Vbd3ohgf?j4T@_g|`X&RbTtlhB2hoc{G$GFY>Qi7v`b?A_kV7Z#=7o zSobuwtDJ&O7XKrH%cIgWm!G6qtgE0PW%&4o(Z3i3yy~u|C7HZb;2e8WAC0%kM1q#n zU3Cd+E4L2y2fw=>l}W#8Xx}O0b)vFkK9JM!6);lM`GVQGbx>0REiNY>B$z`mkYQ?# z#Lw8$LQgn9j3!+!t|O4Hw~VyaD*_uOQ_}U^Db78*5J-noF%597Lk2U+05)_Qf%#`Z zIpBDb!>scaGGgJ47=(!A$EK(XY<Z_4BN%Zo=vy6J3!uZu2`oIQ7@H~+P*D`dtQWB_ z;ws9WS4BV0!9rsE#5JDWX`QfwT{f9DRzx4ipGKJb+_f8uHU@=ys-$f3ob926Xj4$A z@ij8&3l(Jn-Wx`}OGZK%7(VvRN|GP&^ehgwfrnAnH$3YJIhvWSNacl*vp41jf)4@7 zrhFReVG4h2N3o#2aA0;0T2qSBDY&4aK@1ROlb@sL*I*3M*mwswb@F9AL$Kt;5V}Lp znSItPNyHcjqZjQMiwPX7`pQ6ArCm<B13~;Rnh@}rDzAdiMH>OckFD|{cDr^H6&QYq z>tXjN#5*tQa-Q}~?l~3NN?>0_?C}P<3UU5Kvj~A4lsK$={`GDoMGv#PCJ{x|pvAIB zmb@m1G^oOMOJnyZXK_Vf=iy<rDZ#Sak^jfpGtfL}+{eI-jb9nhc^851qq68oh<iwk z&h6TZfV;J7geBgilf1kO^J+@3E3Ur?hP_(N<frRIwBBb{kPkXh2N$e4GwTZGx;`og z=^eTSFmMLUe8-fq&}1-!$Lu}+H3yLkYr_w$MhY|YxP`y#Z2(Q`6~#p~vj;2<4)%+C zHlq#S`m&TgjFC;|J*Cg{;${6`F>>Z!tUzI#7AEIwFRx-5bMiA|ikC-0vjX^X?yz;d zMueN+zug()1_j+7#RfBey;E;~_b9kdVQz_YM1oK*XlI3;KxuN(hHz{*fG;W)#xvvU z2X}lKsHBf5k56#3Dk3R=6Fc`$SXqCD<KNN88?Uc6Z6XboDy5sjE5jec2Hi4dZMLBp zuIYT4DQ3*6nA<L*PQQVcP~c!YzJajar0!UXw8)H9&Zxt6^I=C)qlg}xOoRuK-Z-Rr zlz@0t(fF6Q5!n_Qb?ZT(p^JGc6x{R>N~)UdZqlnCKq_4j0CiW==yiIpMbB2YXaSB2 z;f}FgiLlJg&GowR3it-r1J<D=I(L?2OEu=zSO9)fra+$;z3kx^H@_2TUVZ4%OVegB z6`M&kSXm(wlyM5)qjpljPG7RDitH|*A}3ScCY@RDj<Snj&PaR^8C5k(FNNpVGauaF z-_p=cZ5!r}PGiZ+Md>VR+KB%kjOxPOnv`MDUS&)60ay>#&$g&GZKp@ZtQ}faUh|d& zyJjAOQCR;dgX#$K<PM4aMZuJP){QJlMlMQ3OM%o5(`3?~)&4Tm1E?g8&BC;H5?7WO z%mSCb_pD*fCyV=x0EKtD46IKJ8X=RAa!*s_78*J*aZ{Hjc|x={FLb}2RRFbiQLPt; zQxOOL)A-!mH??svg+>STG|pc*SEA1p<KhT9CgM@IKnhkI*h6EPRA+B7>KvdD^9i0p z(3bJJxra_u1cg?I^CD0yVSGVH?3tv24G!{eh)$cS>+*W%i4b&59}X4_!KKHpC=z1{ z%edz>;KTRW3TW?mp(v3xGhnerIXdk=8H<;;G6~snky}g?sHI%ekf63%F21&-#G;BA zUg*2!kp0H_VMX>6J3Uh<(5#=C%M#I?4ti=-rA_RtoS0dyP#(aw#ZnReaw6tjt3;Md zoSx!VkYr~_a&X}$1348&-P)O`qe`8^f-ZjyRlc&HlEn`s@JAt1cC05`rduHf^6vHf zSGPo~7Fc<mwkn2HRPE1>i@8|MeQc6OU9|W1|EvyUu<GVKh+u))fvAiXTeRKZNGxQd zOt(BhY3!^gEbj`~b}$E~Hs&RMnf-TCVmbgA6!-Oq>SeQgvOy;Or%?TY5hIG@kHR0+ zB>CEJfWhq)aZEx{1s&tG$1`$ocE9d;?_R+yVDYj(*cG{vwJWovfJ|;1C>>wRo8TB` z=u`*3NUUigAmAwCM7yKT$_0cJ@_)PieLLpqy0i_wEwVfkxxn@PLIx&)h&eKuf<Z~R ziK|V}`EBQ0V%Yd&fEjIoOP~`Ys<R}Caq%HFOug#nG_`A=VKF!45%70PWID?Q32BTX z(qVY~z(53?${XI&&kB^cACaXc0w)va%MhDq^fEzvEW$To$qp4|w_)rTzH;`IRUFS{ z&GQ5a4ll5t6p316D~%)MNwlkd(2^HF4H(4W<mQuIGa1=L9N22X%dMz+FZ&1JD$~H( zn@<IUqyH4q{4K^)3^g#c=ixN{-I{{abZ9Q3>rs&ZCpnRW6d?{w@33q9<8t+Sd<WZw z2YF!-+DvDl#>vT3>-r-+<L%Hh&(QDE1>XGu98n9<@~3Z)w8mD*8wi~R`chtPC6_f> zs1#qz=vz%|bI5hXc(gEnEUMt;A*P->ohauR;|T$lqTv?ey@$HHaTA{x#|c;B=c?hx zCNFpw*tTK(wDC*vE-{I8x3I05hpKgpya6o(XcmA-Xe5f4{f#fUE|9hOj529TH8GEe z;)cfxYWN+aq)hc100IW0j&Yxjn3>V7$Q=fDc&}IAv_VXvnNK&KY0}XPb81hkmbT~O z2cd{%HXigNyhr%N`m?aJ(G*2MS2eyVWK`(N({kPPji*B{l!T~mE4x7s5OH^nQ3~lW zxKwvL19@}ErU6_giE8?H7WkUV#Ev1yM=&dy$`&<zxihP=acui)yAr~TKuU$orrb(i zkB|LXGG(Q@Q_>Od%ng9Vsx8YQo|1a@exY3#bLmG;t-muk@);GH<ioiqNUi{a`K@GT zjh0=glaKWlxN>3(y9wh+GW>Cv&%Vnb;SKm`U(i`s=>dV|h7_(cB1*Nt>m#>AR#RnE z&j9s;n|5(j>N3%{8uM)q6b?t%g`FCm)(&p`mhpr#EM$t#oBghWvWrlRy$Ii9xnwDF z^<Ld37#`3sf^M43pPuF;&t)R&NO5)N?LpglbQa<~)$}yei4$!gG7h;v&CV{}a_<z9 z;L`12`W(!S>-y4)Ih^uv5r~%srw6S@MkmL>^;pOz#-lxIvaNWA$!Bn@c^@ZUhn$_Y zbXVKY%zVfh2;Z@{pUTKrN==ylZEh)WCHbi1*GOk}79>*NcDb`N7_K$?NuL6_1Rt{T z9ZDLc+J0`aLG*uaeVTI5ctnKjt8AgdRrYo+5QP;fcSr8|?5)`)zS64v!&mtk`{+V^ z`;8wfpesz9y!8D}Ll46@U*0i7{s>UP_)94#yp`Ui8a|=nCR08}>_`{XM@B-K_kjKs zU@~ci98J5(oHS|8ORMepPRV+bUZLcyS&lXo330tv*|?AHZ*egGoH>&}pI8QfcY%Tt ztfoKWlMLxgCBKBY^&0^2zFHs$EA`wUo8Q?*kt5%!H@K$RSr*I<E+P2UK3-v@uw41& ziJ7n%rIjJ?7$b$tk5jYRH3+7cz$SS-L$`g+1_%8?<z5oJC3s8+k=|PN5OY?WD{4{( zz|LO2brugI)?JAx@)#Y;@h6-+PFcq!y|6~>yAS~9p;D^-SdQ%QM+ka%(ewb=DK;8H zzuK){HmlPaP!~{o->bLeB7zF0j=>8DfTH_N6Rstlm?`DTG&4)Jney9{<#5Z&a+ay` zsxg>JaQJX6Awh=gk84kji=&lKqz&FKpF!J<YB=|oC~f|aAiBp!-<;=dGOnM#AKyEe ziMWXL>H6tp+=2fEbylX1*7qfm&js5;!%~(+TSrsyB*@;nrF{&v()K`-op_J+;zKa~ zX$7nHpv2Gx5Y}m3x=T=OMp%OaA6>t59h?;<jTg!FgP=h!&7D}YX)&D{l2ydGvL=#| z#5x(KYD?p3k^^X;2f#*s9C;0ItUDS-{|;@U-Ln9b+*I0#Aej_N6CE^xN7uc`InqWT zc>NoK+XX-^yGW*_;61zi<#VA(7YK@mTZ^eA*G8z3z7MQeNkeO)+OrOX@misJ+g2y~ zvFYajUl{8#lbs2#bWO`mRVL-f9wFc|4`#CJI{Qk^%_sUOcJ@b=V8mub`Yah(6qf4U zrLLCMep)qP%I+b)?@c00N7}Ix)qL68U?A$ig8?2YkF({b=3I2<#N;+xV`rE1Wk7XP z$f0N?e_37`F6+s#AcnSeBr=$iLXrQW?HU<JmJW6m#1k2>&Z$%XHjO}k>0GJEx!FB7 zs+bhv!%^+Wi$z|f6nsbcLH>VNog?*)U-81PNe!LQ--?~s^tGHIX)R24hVNH0iKa<$ z?o6-)tLtsc<QSlu^3$9xj3UJ=WK%*fa%Y-co!R14V7U~CwX;{tF?2AGMFo-1nhnHM z200*21AOt!m)<wK-XZl01JUT7mJXfiw#~~k8FI<8is;pbLR}VrD)P{LIc@Q8?mbf) zXhpdrw}JU=<9%h2oPF#8!<7Sr1@G>7E~rP{KR6@^07AqcqrTZm0fMlfiR0W+5uHjp zp=zYbw#TJ(MiCjE>nZM>Q$EL^iZydEcu85#{1xiW2sWa$rowNliRt)!q8<f1=r7?C z5>JghfTm+Zy*gkO0hd-O!Ow~ddo82&oX$yO_ffJ(Vy*=O)x&k)hzf0gI=#sPxq69Q zo^*9dgdzAfnq3|H>ap9l{J>Dk81a#4y}vM?e(lc#D#N8u=CXl4t}MG)=FE?o04Wc@ z1jJQGX-MXRX9s!3_4=-pG_}YeUs=|`&k?CoAu9m3*I1Sd92q56$LDR)?j$YjT%I^; z02jMFlNrlEJ9N}%7WdAnzsiRen<CP|CnsY#(E;!=v#lHReZoDG-CRD|poVzl<vkV8 zXgdibzw~=e*(>3{;#K(hjy2w-+-$U!WMwZ=&~1@?$Dy*RT?h6yK0KVaW%`3DY(&L? zRi~l6F85x_h2dQWXsD}HguZo8w(Q-mgcGEj<wT)AmIQ^>-jzP*mFJO~oVR>drgK^s zKL%IsU!)qrzC}aQf^8I&hJmdoL7HY75qYhK;c=f9(sMSX)sD8*K#wB~Y@;Pk_{=xe zRXA=AA!a9glc^~@JF%;Tb^;a@t4WFD_ESa0>V_zHh}G9ZF={*;gf{zuK(pb}7UU*+ zr1Y*>N3Y;wpWU`<qlFaLJhn1e$Yvcx0p$O*o<kM}0Wl0FUG9kSE2D4n?aj8YZRZAj zKffcFoJ8xggL@7jWf~!Z_F9ad#LwD+O@=C0?#3{bXl%EB&90enC|~7Bhu#af19Jp9 zElsm=NZ(8R;QUz;Ig1It`}?}LkjPJAk2E!RxNz|qV+K`RKoT$(n!HYS(cn>op?H8` z421__-uf(3BPk#_ZBnUs6(D9|N<aV=A_V>fD9c}yv&2aqWXKp7l>+RLNU%D4HTxkY zX@Y49vctg1@qA;Fm{h}rWS>yymKWUbjc=@%m=WDa?G4RWJ62N&hLS$Xt%}oX7Dn^_ z4n8kNM{i-FXDM-;qW0qS@tUF`&SMZ6x~adreEb@-C~35j2U(;DQp)|Ezm}NhJ*2)3 zZ@*(sOwfMF)PczQ!81izGZSu+PnJ@TrGMd@G)IMmTdn?r@5sTIw_(xEuKhR~ipX89 zwtaJ&014?T-PQYS-e2D7o4={&PiB&H6wN4_BsAiGtZ4{dAl*{gdmtPa<<yW6EUMW1 z4iSd(o00#<|0<Mlgx}=hu$qWhHK*Hg8!*LM7=5gOxi#*njJM+8=6+!1h71~L^Xhz$ z<u=L}q0^mAw#FtB;-d1lc}G65Z0JO=x`bs|i}fsxO*{QrV}TR(<soICg(o+2A+*E| z+x8I|x$9gcSlqvU!0EOM{q*!a3h(P7v!KT!DUMnMHWSWrcLUL*bm|Z4S$6X}jT7as z8F~1sox8PB5bt3RizIKxB_h!Y3ATF+dPc|Wve~@W+{5`D(h<Xg1hL>YC6k@ekCz&@ ze7Z1UYK2?7`$UvExFcHRYD=2{P2HqK(BO7I6NxZO5hb#w3qcKxpY&AOi;j&QMhiMI zpZTc?cU8$bo-7M&-!|oikFB}}fER=o_A|(65alM>y7%4e>DxT8rjUV%d@Hj!&_s-A z15x4L*&d@#fABNZR@oL(MU=o|u1>Ql>A}z*c=0o4)dfJ-j*$`vyvns=ZyJ4)Q~`4K zd#|O3*lpe2^07rUCz3Oc30^*E=3A6|;oxtT{?-fzr7crrvzFVUMdyAeQ^fHy+Guj} zIx<6fDYu5xHp*v@l)wF}52NEaY2|p_>a)Ub6t{VW=FHDXs4gZh6=_t?NZ;+O@na%x z28O<4?9n~@nx=WoOt0Rjid9WIw*d_H2b!(sZ&*H}PN)^JKeOnIL<|#!+6|-b9dbm% zYE3gUXQm1dK>JmUQ=bPDjsEjJ!*sl(;oLq}z5mc~4KflV%qp{cdyd$6ES1ch)J*lR zY(s_7VpKGTeW)wpQdX$Ic0|2EGQff`K-ShkONFNx9U0C@&mruB?8qsYo1kFZQU}G9 z9h@anP1k%7P7`Vj?t1-DxByj6J^h(y8je_U&duAn(&%;M0w2joAo>F7BK%_X4nvkI z=*Mg`$}@81U?PK7x8aY-oiBmWd}==@G80~n0bGNdG=N^FDj-k4XU>pnCQsJT_&X{G z?Yb7(X&=h>sqAVR0;mLN-Mw2d(AgvgBk}`UPS%br9B8Eg=Y`qIUh_LKj&uaEnP~$f zN0|)PiC*XZbrt)<9_V5thEb~kyI0lCMDU9eKOPo(Q1>tb&QafMs82+ZtC3~+Uj}S$ z?H4Y8Q(lhBRe}yr=YGC^`BMyy)W60m%CQmP5Gz?C#vCs+v%6oyl`WvjvEW|1c4Z74 zfM6Gm#ybqNsjH7>l2*A5gZ^{Vk>z*{vudyH03p}dSF**d+f~h;hC{3WnG0Yv<oQWg zV+{)e6-P0~w`r})+GIY}BG6Ly1Z6)g=_)T7><K7)k*OeR$2}4@1Bw1tB8Bt4eJ`c7 zUhcE{GrLUJJo`c@8?_zI0Sb3EdOd_*>Hc}JTRL#?$4i7gmfNF*T;%aI*$sy%nrN{s zcfq$z5AM!LX$g;n;+c|yYDiZgzzBR>(9N6*u@qq+lh(}EWq0&b)^$(LL@;}LZ&U80 zm#m$u=<P{gSOkb`>`3KY*{5JT$@*Rm`#W}>i~~_>0Mo8X?rD-+0H)XN?3VEFg2sIt z4<8YuNpLL+qVkV`8?b4>iHm!4@mN(%Pi$bqV)+e6oX_GXHPnYwKNOprioNKY|7fQM zfzTnJiC=R1hqXIv^1WxA8;-x)B^ns+IsiIucQI6_2>iNv>@BlQcS@-viq+4>CKI6n z8#0hrrO&C(`0^prNQ<nA-GIL@z^(1A!6o_nDp-1|H*?IQ2lm4BI59(xRgcr<0PAml zr6Oa75l}oxDBl;E^rVMqycxd!6_8wY>$BvNJ2CerW4aW472pykr3k-lD6HMVO9@@e zNuOi<HNx6Xr~4M3O?sd>C{TEp<6XSa=Ge7+V=2Oax1Cdab6;f-Rzdx)1Wj4iHu(m( z)_4t84eweRgkfnwEpLZFr|cPH<J%s8Wy{5ImthN%a%{M-Y>WpaN%d?hdEmOeMCJ(T zx#jL}X|9DPy<rQWsy^W)&}6JL|JHfD4CDm!{li<JWXfWa2hl5n#Fb8YD|w<Wuseyp zJaML4dFlSR*O&CGI>8~w;0If?s9Mhcbu3WfX-Re-z4Mvf1TgF7L!~mP5j9%?0lC=6 zSP?$dKsdz7D?}P*T0$nhaTN^`ItI$Cz4od&6YIX_&ngu2<mIHC4FC)v4hGK<sDymZ ztNyYib|Qtx$<8RI?>Fs3SAg;$&3bJzi0tF~N>+@l9|VzsVSYdO`=@#Z%23cHJy!Fb zg3p5<Q=n@0`!FC4&k$?>;wOhfHWQx+=kfHHLHiV|W|-In2YoGrL`Ou5>PdbWpFJ_A z7Y{>TGRvJqY{FnH>S_VKBoWSNMn*U~=&T&$B1&kK#$wG8-c!Cu$h07gltrMN+sbNU z3eT&&<FxY9O0NkwB-8%`uzC^u=kiS+qor62#3Sq-Lp7(wmsvjv@W&P{9P)3zPMUKY zN~}5?uWmn-1;<YjSnE6+7tQBvqy&>L-?iR;G9WoeNUSn`26{VM1KUwB4$e8v|MHUG z7Q#lGvgc5~?LW+@l-i=KQNZ=T#T<r_SK~IsyT11txlD|bs1uYRXn*LuxSSy#^RUfm zyOa0%BRgvZJ==J+Qf_}<HHpcYLGiI`QHXvqa@lA!TB&3aJH>PH2>G4$q{!7U$GKMd z-SXp&C}f8GN!HEu3CNx6%?_~^Pl}sJ0NxGsSc8rj@dE2!y_>BDAP3*kCo~?8KD9X^ zqcoRdeyb#n`)?{t_~WkabJd#xtn@uNM$7KsP4SK?m_mrmNJG&VBElV>G*K#n9e&4k zR@uGkxh+@_4mqGX1$huk<aD&~lr&W6O}i7zM~9-=uB+Nqu}ho?-0);|Vw03Zffuzn zHPo(5kZ(-xXe?^AFa653nL8VWrDL@eH9jnAhp06YPqy~TBdBhW^oOTqko(}X;G8QA z;}*_%s9Uh6XPxtZvUP#fc?ffL?KaESlg41wSjd?bqa<}15+1Qqt;5J5J+_jh^ZCIf z)eyoM7iaAO8e=Bh$|0+AR%Ik8NY4Ag(ewXRFfo86V8nDtv*OyN^B<mOxqKDNF#-wf zW?ySJf)g`<a_^;9r$p&#32V^0fmvq;I4HOo_Qc-Y(##yuz^TJEv@lXLckSRnsee@= zeV`WnB?}_gC+TG8|5Peb!K_UmJdRl^&eTEG%sq^u{{|b038_Kj!XYENQ{WFda+`Sb zt7Py&u(-_{d0ctMQJNY5AAN1$Lj~!|KR0Y_McF&9Nx7_Cb9*m;T<q*AEy)&tT+1C3 zZy;>7hfH=&-h1p1>BjtN$@b8z$dYWK&ZBn(;TP@(qakY3!C#@j2KA4jPw4RcxJ6UD zNeddet^{+i>(N6C5@ckmj%%u|PS8bMmj#P=_7LuC9i1*B!J%2_Hd%5VwvCZwEq0%X z66$%C&#1I}1wx6NN#WK7Czl{R<S;Fya|XukA|#@lh9Y;hNq#jbW>~lEfXU~;Rw`Z~ zSIyB@@;9*SK*g4c)&8pr<5Bpx%Q&kG9bcdhFDpFYpOde**|>u*Z>5at6pU>q`_vPU zauObGsPMS=K1By)lJG({c7f{w@PPu7MQvTQ*&IpM_!k=I+-Frta2!fYRJ^?1d=6f3 z5nj7MUa(j8*u8`H1<o;^<H)ahmR}NqFM|=zEG_-p1$(OPwjbXFKMD=^9Zn!jA`J&} zU`97oBy7^8AizSj%bJ_&Ee@>c{8psMXkC>NHpX&dK=m|`n#Jxhd)!shxYD*vPzjLr zuY9wUp4Og>0=HUT<a_o3-isonz%bE*Er6Q4*^_JzL+Rjv4l-Mej>)@r8H{n^VSja! zeeR98`piYZk}{okhz^a}LT5wa%2FffueX_Dd0Z-{(#*G8+o$04DdxRRk$|LxF{hV@ z%^cJRV$ATdB&S^}-Q%>^NRa)#w1&ylE-q(?RkAo>KrkQN5$2=26<!&=ac_>_*Xs!r z!$`7C8}|`aLQlG;oy~ygo`^;4rgbA<JC<Tmr^1Q+7L0R3t5Yyb*;#~6Tnn!|KodPD zd}Ng#^c&F%{+7rNRn>?rL=eZtu>aF_opJ&|%5xjGtPS(!b4Y2CGBdN-Jxclh9cuG5 z%}upq@JGMjZaY_$!F<q$!IO^6JGj=H+sEk4sid!^4TXf)EHz#rQ`%VrijLs#?zjX9 z%F@FERkoUvz1fIa6==M;<9iIwRi%)3OoPy>KSX&asU~&ehSv-<3llEjn|UmVjWo9? z){d<>h$@`4_fr;)l0z#+V69>bvTMTJh@~RrCvyYj5Gg0)82DJdO=3O)v#O9t&O@sg z-m=@%5xKq{ALgEkhP~_*Vds`w!Mk#I;n1<%K9mx5(^2wK$OiGd_qaqjiIWVb1J!vr z0~K<Gu6MecI<F6j`CuI}OeSIv^*ZQZ_>lCX5NgKq{BF)*@Wy5+ejD^ZbvH)hfo-&m zD{-r}9SEs0V%<6Ii9Tf=ar5c>&E4k)?R1k(kwy*Yay|1$hj(4j2hWml$%{zQ9Z~^x z$^f+%d<v@}<7yTh*dPv!d+2-0h8?1e9!{<#u%r*mrDFN*m2_aTMx2w|WJ-GE&+Q9y z=rPhfh_t}{cB8Q#(@c~`4tfhyk9MXF8bTZ`A$AKPhw>}PbuSUYFhPi(k3HY&?HM}v zw?-mvse4yX;lk`4tEb_Lrxb5h3VMCSw`yGc8h+^nPIcNof%X6Gac`GL0+51nQkCu5 zhWdr_mRx3=Do1O@Y}rwh)wtSFK??)0RX9Se#&4NVkFKg}E}jx!!wX(RQ~Lol-SbQ? z9TP@2oeBqduN3P61FUZTqXNV=_77ZC^nOG`QPLb3FP}WI1}jW#>kPeFJ3W>w(IW>q z?GY+rUBh_KSB6;BW!!q@pfKc}Ki&P>%;TL%IcrjHnq8%|YV2}Awnm}%S1h71^fOKH z+6Y2`=kIBlg*LZ5n)9Agw#iOocz%cTW^*dN*NdxZv49ELF-}oG-#4VA<0{^|e?5Bg zw9%Few|0|?fWlVWjaSFa(}^w6o(fG))tNEoSCH7CPkbOVs$?_<amAymbqTZj!kO4e zd(H#NU_LKXG8-i>=17B?nh(>mBC_N9PhyT>D7Y~N5Ri5~7K3?Y5a~&iA$uE&pe9{# z^q5D*)E$F@dM`p8gjVloTKwq<J`j~{Ly43LsXaq+9CXd_h+P(41SW7&v8?yevN~qQ zD8?3>E&=RNSDZfe_+}txIf9%tYcpwrsKK+`A!Y!Ts~z6@JGC?Xy9_)t<U)_(pSO7- zK*Cp>TSkz%)h|b!%elWqOjA&2%(euS<&bud##?Zz8gjVQe+==myd}hMlSWx(>{ppE zMJyCEW2|U1lh2JaJdfXB^ixLXOji_CcX<$HXCH<;04FOto1*Tia-|Us^=>{30cL?% zb6j3(<u^_=E)0=u8JuNd2ea+xxYD`vGgj?xiNOiJ3p|sIbaqwDP(Ap*{amE)tG@$; zk8-)jzyDfL4>JZ9P$(+tuH!lUQO!c#S1z*==Zr&PJ>z8Dzl)(@o?Zf%*&SSjHK9p} zy*AVsSp8GGOiez<>_4P9pQLdpMlV=xGL}w>*rpw(Tt-H^3W&NuYPpY;^z3Y>E~Wqn zBTxOiL(X4muFJG~q<E;Ofg1F}lV{ecy|lM6K}4?o!9^we62c%!HEzm)7$_BuXNf)E zeArG<`gmwoL=NF+Z26~6mzd{(RtUx;ZS3wwCU51rx^3$OL1hYkfzemD@RCyqZHUHE z3Ru9*ywqT<7l|>dADVSeM^KcyW6M&xn_}lg*<rJO-i&&X2A!1jS|$i5^1tk^eWnsM zcTWJisq<IZh>}ktkCBAOrg!x6q50AY6i&*C;%v7}Ou)8^+xA!6NLQr1i-{kj+Y?Nf zTCk~N*)iN*F3l{lD$FzXhNCPe=5_Ov7F=V^q~#^Z)nj-nL26(ASY-=-COQI*MwHkl z+C`i4G=^YYV~JlMG!la=ax+-E$uuQ7`%S>FIeA)}5U1$=jFy&pT2%3`J)js!BwVbk zA+as&g<A7=i{44%6q)tsuQlfrlC$mlT=4Pv7#5jCirk>+w*^smV1r|AT$X&}&mud8 zlbq+SdVk+zSZtIn$}Fo@><2s9-JL@_JHy0OBPQ})$~3fLTT^1K{~N3RanVK#RPXHo zK|sF0gtXHp#kYBj&d;^)vSty9XyQ$&^QPTxgyE(|pq}H#>>3`I4kpY-R^IHsh2f4P zGXSbC3b&>NzXOYdSqP%Pr)zlrAK+uom8}gP4>09$z`qu`BmF#v0EASqyxq`7z2fcr z(*;AfO-g0%tU^UCC5OULOc#nXy^{CN6{)$#HKzfi>zhIj!Xt3t+#5|siR7A9gEfq5 z7hQ<L5js3st#i-mqr%v9Prb2-h3@k;DEqHn0DI2fIyRwm2b_!f?wVzehd5sHYdeiT zdd{{J%x;agQf`HH*EWm+xvB*q2rFHxBpCFp7%F7$zdiMaYv89!MVH@g+s&L#h?D9d z)qvEjP+_p#v7A<jB?~-IX%n*=#SnNwp3lSHVs*Q-qJ?Q0ORhTL+z*%CNcowoz#1*g zVwDSF(BcY%>a~R=tPKbmj2LnzY>mhr*?bX*Kg6~ZoaKRs;E~ucKaL8-VF`ghi4@hl zmN@`*O^tv;ILN|2QQqfg74Q#)*(fleWAET(VvoPUCb?QYowKfUr*GrFcboU6M*0C_ zXm`p=iC?ZE8kWE|T;LgKnOBa&IE1jnln|}qd<$*ZYoKzpkA+p_fKu`%Fzz-`9uD|D z^(>Z8ba?%}U(kB;b#s%T(uHa{-eKyy25$pi0h@-%vr^Q;Ah@P$zN;(Vmn7mj-~}Aa z5dn!VucK66Awc;5?Oa+OGrj^oJfSKZR|OncBm=_#p;ShwUELpD7Ap>&Q>a3<yQB%c zsQUSTv~N(b@N@IMj?pqlN{H};3R={ORsc37s?pU2?aI3W(In!>3$C|y)kNZ~7cAxU zW%Kt&PM!vBq*P<eGD4AnV5M<pRXWW$kLEK8#A&A&jskE;4T%xqJqaef22I{F>PzfU z*B2XoBy6uB@wql0*;;~OAOXgDKXLL6z-EYD4!o}lR<oJ;m=Cg*IA_C7(|9&8G?B@o zli8<)#)mEuEdq$?LR}W~NP7{dtU-<J=vZx<i^Oy%SiEMpk*vK-TI=KqpV4CnX4j|l zjfzL{K(wb1V>(?E_*YR1GW<<=<&otF(P+Vb?^uzVn{(j0d*rvN@`h2fp@{A-*24&Z z`5i)y0u-<yynwAlan+>1;(yR*O+cA)>=`>moxw<J`Cmc9E=XAn`q?#TyEhZEL^i|| z!Pl&w>jv`0B3jJ_UQGBL1Q4T)TnvgB3b`6-*s~(RanL;eDHM~fY>&l!sDE934eTn) zwE*Qy%(?Xp$h?LKX&KWD_HghsP7J@_lnlWRQLnfM7I^y<fx1^_z#U4Mz;#;8mj+d6 zbU$g^C$h889v;<&L^AzJ>96v){q(qqI4+^SoJKzMw!o#;t?R(T6;k}3%BThls(^wE zsSt9|+Be5|ov6}b0NbL&?}V%)Bc3%&isN1BkKr=12R?>}Y`qx=gS%G=OzjN#VYl0X zqk01)q6<HUTh|(^UDt{Ek_?HCaRGV)>0+%cFUV$5^Ah_(b92$Smw~2VU5mCzml=NW zt1_RKtd&0KdV-&)upyKQHh%LAk$04!me#q*O-+-Y0_afCqm2O)p|w|ot_ulr6$W5T z;yv?IuWhU+BI%F^MXE$_WYhMvQ&Bu?I+AvNOWnZ4rILFqbqeWu*rCOW{7Kw0!<_~6 zE+=uNvUZ||_+*b!DdIC=-2-wrWLGeqoc+G92T+m~qKl(SYip8a^Z%!oTbY4Hc6wUt zGRs($Sap54wCpY2=MpR^Pp<t-Mtql6Q{f%~J1R(to-5u}jhVaXdU{GQuH9SixFYWH zOFKE)n#3ye384<woA-l-f?kfU5c@tvE9jXtQ%t-&!M{cg3qMgJ!=mrm1{l+Ws*gb@ zRiu%nBPALZiw!3xGKW_+wZaKjWsQovB{2d(70c1wu-5=8tqUQ#I>6rY=R>(s?1C}5 z9MeGS-+2eCn}X4NfE4JzGeaD8?&LL&ru}Cd7ti={?3>1hgZ`mBBenTYk4hrag^*-= z0Q4JD?+=_uok%!Z-KCIEw(><W*a4`Cr3wyvlw(S3RbUU)oFij}KlDtJt!;auLu;ff zex$h1g+ZTPmbuz)AlCej`<msx>EbN%-B7X`56C$dXr^#ZbhxN^jw|2$O~rsYf4Uo{ z`%s2x?)+;aRADOqrkr_<3|wk-2r;6PyTlxy{Pbf*8cHElvs<=IJ>aQIHu#xjRy3tn zCed`no&g9?$xGK&HTH-r<M(3uTncx6EX6i)PdY1A)M2f^>B;P&Y-HJfsK*<p(21Bu zUbo@&yD-|LtS_vduy_gE0oI6J2>(c_I*c)h&ChDRsgiL<Pb@RAd<CLtnTgfn)Onja zwjtdKEJka*ZJ<Z8cjHN0qMoe!ld%SLDlNh)Pc=jCP4es+v6BxbB!BVv*eN{*>ln@~ zBVu(lQJa7ufh0U4m|x;Xk_xLj?U#vZJzZU0*E3^ZFa@)9X5Gx{REoqvPnL-1R6&Xk z7WQUZdX@H&o`N9+x@(>g9?2*-`*XH2{=#1S4Z$?J&b<1)07fNj*&b}uO~$W;Pcu6i zT9WtR5sz;$0`=j(R%L5JmNpM+g}7zPmKp=}$8&g-jR1~puWO{PIgBe^I*QJUzj(CO z_8S7FIbM+Pldt_uvyMzaj4`m?3t{Nd#^Y--&`-B#jyutnljS|^>16kc4lwDNo}>G= zi1`4x9~@OsE`X(%2R!iXC&*n|KEm9m)H5%P2^qd)-4;S%W_Ljc6IDif%Lf+!B##y_ z_PiV*@W1JKWp!56!vjQ7p!!vBy7p@RhlOm#Gd?F&g+M=WbjVm+TMQ|~E4;e=hh&fN z&GAozdRZvqMJ;3rZv%2@{uJI4W@lb97^z=grrI&II!ann>2y~&h><$xA%w3ZH%eB; zrvJiB$Z<ucEE7@3oE=7Py$KZXRnhGPl4&M{<{oogh4r>DVC<HNC_4%P-t>1Z|AkjB zOjUU&rL}Gl(Ae$yWid-CS!;79*qh>p!i46yPH^SW%!<OSI9g!*q6j#&plTPV9r=(U z{uG*_y4aruIO)z?^#@<Rdy$g0B4;X($Goq%eWoZEE}g@XkIIvEJ>}qcK@NdHx3!{^ zETozi=i?XMUWf4%FxD$ga6vyotN`GVe<CzW+r^bUGM}aS<wF~oE%N1e<Zbj*zN0>r z?y1t`0aHv(;S1>9cT7bj&@SO5m#+^d{=o64Q^$R$9%9y3m-^$7#%EROr(CLl70dAQ z1H4iFI)R}yS)slO234s<htHP3&J)A@!wNO~!O2%B{9v&C-t4ES<Z@(l(db%qL?!)V z4Vv}Y!n-{jDzszYZSkA;mU6y($aI#LA@dPsTZ#dd<P~4!L4u)Cd_BxI?jEFt8hv9t zN7&UM;cb>f_cOu26=!KGfKpl+=0}9%X~rK!=Q`pk6l3%W`(j8ffBwl(WGZf!#Lxdd zDt008fIvC7mqp=c9?w&iscq;l%6TY{Db<i*Pj@~mnR;%`Flo>>@L6~5?jo~GXEULz zKk}+$0yIh?X{&b}5%Ayzz^Q=JK}}sM`}k{zF?>(6s8<QjlGy3PR3|=Ny{;PCj@i@G ztDg2!qv>7w03Xdd|BXY-8J$u^mV^V!1L@gpWafjF|Cnq{=xh-slgfN5RCBbJ#u%5K z<wzg|Q(-5AS$A+l+apeDr#z4%$S_$#i!tw?MXCn=TApX@s|jDWXjC`A<bE4Ljdmb( z2gDyWMBWaL3U8+zNUt~Z{x|``hq@W%yPWs^!W2Gty407>LXf(@o0&isq5EqQ5<`Z` z*&muOWSzLC0{PvasCJkZ?(`${7WZf093$(vj8gBQsU$UI1lYO2dvA#SraHf`Lf0m~ zM-h=!=n5YvPt1^;+=@1GWEC5llIen+v$8V@x$;q8YZ`Ad%p(U-orHX;`cXROFdU&u zO6Afw@Fb-Kun|MkntrfWMN4_CIQxp`0VghNbpi#<Q$t5Z@Jr~WQbWrAwx$IDBTb<k z-+N+poR+$-g^ndnpa#kf@zLbjz56TsV@)R<#Gj#UZ6&443UgsSb!2%-GZOU^w}I5? zr6f-R>J-R+q^H;j?Bza3lRWu@RuVl1aQZW8p+g#5tFH@#bpZQ+loJe4ARM?`OIcS@ z$(Ta@6VZWs_WF@j3U8tBv0J59H3_dcsRH8DOOig1rQMbMpi5LK?y^rn5U2gX2bz5% z8h2Y)s9&Ot-9+4o55V$<yyB(FwQ~&1He9z)pQ`aSX->9o-L6<lC}N)!2HHCYai8!7 zBZ9)>+IpuIuCx3t@^L*%Jq3F5XjB%mhE_5R?wB4=!oEslS<C%|1k~!C5E?$)OO&Me z9aR+AUo>vn%+89FHV~y9qh&&th*vELCc~$Ml8{>Ce-PC{^m{tUN5qG>x=cKRVrq<? z%EqUl4~GuLx0MDrmTX2h;F4!gdf8`+z9EwFVZUZhG(-Y1WE`2_eGpejfwHP~a9>EW zcywQXA_qABVx5l;5SOFZxK9;R-%z2)<qDhe#1u^tp_mm8)>mE2X-D}uMBWOI&^kTa zg?*AEwg(mim9NW8lA<TX_ZmzOg>B(T_-v}4_q@#2nL=w(jBa>ZH|yeT0SAE3DgYA} z^!{f@v)p5S8}UvzBQ;mgY_$2zO-I<E?wp^GugqareB$RZ1m4B0IS>r$0+bptW!hci z(J3yraW#vsr|i$_c_4vQQ7A%<{m<{vSdfj9w?kow44ZRkVP<_M>C3vSEB||rv49r* zqI1Fk%EswVoqn>hJG}rrj&TLaYsF_!CiqX23ZoUT%8iuUIbx9owa4jwD1fSm{pFZ! zq3L4Hog;BUmFHi%T&g7yXXXbPtjv}8Ddvi`uVyI{oQh7`n07_;?hBg+_w=j~LW8a` z4sgm9rxffo>=l80(sG&;O4E#he_A-gJ*w!|$q`NRW7Ap>1-zI;aBxxzm3pB03U#z5 zmSu#FBup}KZMzf>20qpIM|ulgFr{V;k;CEkoc@)~K&oo<1)Wny`#0B<6U3~oq<Hoj zS&k;Pa^2tr&W^5`LlToUJkPJJHGv79O$Bn}N0woDN4O^5irYx1gen`_qLKkP?^XRi zz^mXDaz9z*4^}Y~M8#mW6D>8xTNDATC+XpEA0<|#-|G=p)biAlLNzn1lN10^y8J)r zom<U6*Iyp3mI36sjuULt%V|l=AktMKS;egDF<(|d*;5DrzFWV(KAf0Pth_0u#Oy4L z|5yB^=_YE+{Qq04C4de##>9bMk)W2ivirawBf+c7VFdS)iof3aFuFw{%GzNt-_^Ka zt70(Hp4i{8C-`Qzx&<*F$nW0>B7|L0$43_0i_d9zUc$JS$OL>Kx$>cz7EAW#G*rj} z0NK6m<R#)e#9&KI?*_P+N%d<ZvU(Pb^%h*ZeMJATynC96e*&|JQOP?J$AW6k>b8RB zFBmAYhY;TkQ|CS?r;#>#OMU1F$+3H4JI@eW)3k^ui8GDp>8y^M_~-@$Nh8=Uoa&e? z?^do{2_MLFJuypdX2NM6?~&#&@s!qdtWXL{yFolcli`mTt{uLFScqBiSo4f4<Q_RJ zABsAO%A!yhtG*X`F7(p1CbA~0&=UkM0#8nm8&*86nM14B_Szmy+(GT+iQU$wAQ)@1 zRp`L<)Ory)9kifS`w3;z!wYCZ;^Z#RF~MN^&vzv5K24Q$hEW~l_XDNI6-uaWZid`P zx;e$yrOz-=6(jU2ZP92rQ!b)tFfD7zM+Quae`PG7mXj*W7@N0OW+To?Tg==1pu*g2 z|MuaNcs$EcCUB66BS?4U$6i5k4o1<Ys=|{N;7|1<2g-iq(EwJenArDOK@sZde5}aQ zi#@A%9w1nfBWb4zDM$#@?Wkj>L2gMUv}EBUvGUdaS%7I}Dx3hq$3>pHiOId<r!H7I z0?aSb{FJ{^!L0cqp@02feFY*X7(K&wY}BCB1OlyUJ^qetDi>=<dt^)p3~!v-3!%WR z?*eN1MCbT3s$Hq6y(q^+9}wi{BQTlC_ys<LoD)R^W3?ihMNM8vXel4EMiC*uOG}kr zvG{faQxBe#Q+mqiz494VrZ(x}1Ivh(4ItT;-ccZSSMFCoZE-=`FV~Z+3&dRHfep>S zelLPa0EV1bklJw&d%V|L|7Fx8J6@P2#>cjVtjkBZv5PejpB{w>CsdMFN(aJnL{6l_ z-%TgUHIglcJyC2M?QK_FEbfHxckh`2S)^$;|6A$F7bN(>tI*Q){Xvx^Zrtoz<`Xq8 zh+4V<RT{o39Y1{VvoB;E8RoYc>`Gentc=A*N_NrhJ6!rrp~U<{o$ZX-_mzAN*JfaT zj%)d$9wN^Tn0mi8IwpfP`pebU*7MX6F&<FUr|TN|du`*lOtS|FJ@S_v=k}iBo>y9< zh1@^s>_G%=Eebt~k7+H~6{kW&RyDX2bV}(?Y_bm!@pG#<YL`q&#VYuT(>af6JCR3- zTG9fOS3)cKJbqYMD7Nmwy73p`vjdlZ9(E##uzur+!2<;s^}v?85;k><2V+!rUeePB ze}fH~?VshY4sx?kzt7amoPz!HAJ~M)&f9xC2_Fm-{rg}^hm&wKKzxgm-N!&(839<G zQmySzh^Q%yux%fO=^#gwed)<Ix}N=bPta>utqI1$x|4fxPUm+vG=wYs0@A=`p|u&U zsfveF&Lg3O_r7drR>#IG|0$4)TFS{YA2~JeaT0n7(vj^*8aYXFI{JOP44}wui;L<s zUmE9-C!%pjfh|bqTdFbWMffGr7+taYa?lxHZe=4RM#UAA`DMpO6vs-_O~~Q^a3o*u zZ`(uauRRIEeFQR?q?6Yxi3e0$Kv6;l(eqI#BStymyn{}`1~hAAmBW3mpqP@(kbxux z3|2Jox8T4CCw9SU+HmUlE4Q7edu8b25VZ-SXch+N3%5jB(x5_R#z4pVvm7*2r;yDb z45*wCtK2w4W)7a$wt9QCU<zH&`O!gUHk-QR$nExUhPOK<9h}e(5Ms*p8K!6?8wHmE ztb1~MQP_wJbt!JSjwsn*KTRes-h;a{c64Jb9F8o4<7>3l0mau82}(jfaUCfL$W22x zW9fx&ZkYOhVkY5KXv^8OA9gl}$WHv@DSs2eO5^O1jlJC2I_9j;Az$P#L?)CU=Yh_F zPgs&Rq4IeD8FqMfSq+^Mfz;=#f*mY!Ur5RYId@U*-rd^c7{^p@EC&fHfI@vo=#M); zc}N5o6{jcoK-lO719B5ki-(ckByB_=z`R%Q>1DFudqwWWO)YYnd#(c?2^|+spgTWc zkj%Qd?Wy%b!I!%Jk?v9VDaMRoYB9g&mC&8GZ}>9mkqD1zUK&h$nBtGL!s*)p%1@?! zPYX$GFvTo|Rd+xopf9vD)iP8a5;{6-b&5PDjb%BBp7%xNs3einxi@dS)@PDi%L8*Q zy`#*o1qMMa;|3Pn6<JbM%-NgxwZf%l2rK;+KB&vU9Z}$bcW?1F29vt^hyKjA_i=ri z+@Hx6WhrM`W>wt|nPnqeuG`rBxk~N_r4GQ|kj4;9pv{a9Gpzc?KHqN+%Tfjq`roQH zvwFON9Q5%b_ZNcrsmUlG*z4+i%ors<w>$Rj0h|R+>^5uz+rlv>1J@48m-o#GmKy#s za9>UK8KOT<ghE@H@X(PKAZi(8?|WL-&;WRJ;SN&uahVe2>*4i1ItY;DH)@t>+LTrk zuU5*ZYuZ7tY30yipVq<<%-}6K%7N77Op`{PNrG5Iu{X$V+wjW21&-2-XC~@)orZnD z2|m*I+A03Mn)Rzl=>%d|;S`)B$t!h|tm_Bg3A=dx67l0`7Zo;*3=)R<HvC`Ta}(5q zl970cT=oMW1Ss9a+`Jb8<;WmeO%Sz^M%&yXU_R__yZWh|J`#eBh3dC36<Ymr>`aO0 z`N?{5#~#O1JBb#$7(54Ax|u7vIA}9bO$nQrSz5ZyFJCNU@`l@20pf{cq_d(l5HJ?K z*&4ITy~k}SDx1PqQ#N_;d8}U+<b&c-(G~H;jWYNOVJ4pC<9*e?6g?XoO!pRToDR?L z5!9lkAbr0@RVKz%G!6g``}HN-BRs^(%g#47PcoFNpR%ug=uaY#_1*cn${0$@4a96_ z+?fz?jGq*I2cNh1@G6I06=wh#+!uH3N+|Ry4g3l5i}YvYT35xc(ZK%uR{b28ql;)O z3w5^CDg*9MyOVGxP(Bu)6nfVJ0!;p=93s+t(v}6VNW55u)tkp7DvvpLUb)lDnHe-@ zjq&gLiUXD<d>GoT65@*q?OJ6r>7u;Yu-BGc3^>v`6ID0jC>(-sL|jdWs~kXakE3g? zGE^eNZap>g7<`#-RQo3XsSzi_;L9U?w8wAKO#?~*0IrAyC3WC7X>@$V9ji+zjAi^7 zE;84X3|aUr)&K`ttQN(N6I+36wvnNLa(J49heGxYdbV~bA(AH+-Y}9vqyiBe12oGs zQOTC_+n6!_O>H2IDV0@f-%NdrpDz*qFY;-~#60`3Wf2}P2@J^&$=Pm`;+bUIj*Jfp zRN^<A8^oC`JA7Pb)qUg9?%A_x8Cm?ute~rCWY`HK+*E%tm-q>XkVU%a9)8rU=q<h$ z==U`zd3}xMX=1y)R*yrg0hWY7bZi%&2RftzxDR2RMcu23s@*lvrH4oTcB~vW%B+pp z`!(@a={Wvs3&<(=3<SFctt{j>3daP%6*;Z<WE{c#fn1R@=?!97$Z=a2(W*$uLnoSb z^0*?A-{3a9q@`=7{s;d{ouYNl#p}aBo$|bdJY2Xqw9>4<6jSU3W~Vn9v|^9a9PZFm z($c;f9kO&v4Kg}>s$gC}h1CeQP0iZsaHrlD7<bqnF>7#32O|IJFy11u6;9-Xemy{^ z;k8%9Ezs~a1qvT}!Ix=eul!!>r*Xv017sSNW=e9o5p?-!odmL)1}<mQJ$%mlM7jF3 z7db@@$06HzY(AfwM5u>+&necmGp6Y9z4vEqFr(|_j+7KPyCda)Z9=?_3!DR!t0DUg z%WNoQp%^#<I{x0ll3ffuk41>x4$SwU7NB<&Z*v#&<+DRH&+%?dE%t&{9OYYW0C%_Q zwxaB!mZ$+R%GQ~_!T&rDqHMA{_pGyKjKc>=l2l^f`C)L%I$a<ODa6d$D$F35XqT)? zQ*6Y)l-t4!*VPFVCb7FGZc~>Zn4!_xzW`3Gug;DMA(O|?MA{67L0kKF4<kUcIW|s$ z?48O9(1Qr(+g5<Q##5-GOmTGbC<gNMkX`g{PTERfu2SakIKOQ}-=>tD6yJ9gm<7;b zmteGcV-&|B-CNz*gX&PcQW)_I2~|&A<>XLvz{K5~sB}9Gy>)*pNm*4K%<`fux<Ag4 zL+S~9+~4O-?VQiqtJhO^C3ebLAXdn`D&nbzn?dr=6Xa9|HhtHmO+LN%d&~>~VpzP| z9fB4Id{BGS&wde!aCn}LRxaCE$OqG`(%j42UG3Gq-20)WS|01IQ%<}CYU;^u=@Vxq zHE*umjI)MOX*_w#a6>(vmjr6S+qT?aVcp8%aS+g6VI(^Q1UTKO^vH{3R{x>5=s}qE z>xxGzjQ2`AGy5i9wmhu)JjglNBJKnP=NOrhQmL`T=Sx11^S1cLQ)wAO6}*6HzAa%Q zw&g5df?Yxkb=T;n*XQCn6Amp+hl)|vIkZ!S$-x#LfjjQIfstBv&DXidBU+@;-=;Dk zY{2jUAOr60h4d#266BnGP#}*%RAxt~ayV0u!hrCt6T|@X)s5SZ9b20e$4aMlvoRlq z6%6yfXAGqrX=W%R{7{EtvRU6%>646#brOLr^FMoY!h|~{Hv~(9Opf;?0sE?2iiLOg zKEY15O_5id4gPNft!bVVV5p(C(9=n9a(+vj2#MXKLa3Qzp{41T%+~;la$%a;b#vGZ zs1bc`t>CcZgdVWPM?3gK5wnGN@!ik|nMd<O(aBSad?o<fIv0gBF<R*k+{ru%rLsTB zXE8}jP7vT{SAwruJ?KQ;@|aEIx~>mK3L#9prxV~9K#ZRBuIfJLG9*qdKk%x^Y!HO= z1#zgAUzqzj49jNruMXQ#s2$_QFX+B3UvxcNax2R`BU+EBS0pdAF$M{A&{bJwljX7L z&l9f28|BanbHW}?nIm0LQ>Zul56L~dM@_8hLz(BHvDpev8F$VMYQpdot?T8Y#-PAS zw}WeqsYHuy(lWK6LaWuxLt#T@4-AHZFC;*mgJU`tITe5*D;i5Q+PUpMtqYUl8D;Zm z_7anV=z4NwMC42V&+{fXA#Mv#9Rng8c5w>aUUp5Qy$xz!t>_|{TNP`w2viFt6*u+D z%$Tn5Vx$PhB}Vl06DRZ+&pA@gIr$nJa6}N}G7OnpH}Thera91{x7gwSuWra!?fYmS zzhMGH=H|3*<-RgASFT8v3n4M&(ubE9-`-HqX;IfV-cG;0D+nUI{%KJW{$(G=1WI0= z#(s5K6zXjTCzoCjPrrLv!9B`VK_1@AZ?i#G+{Ad7^&#ToOsNGCB&CG&mGJZ)w!-&V z3hzds3#_b_f*gFPXP6Kj17}@usmqVgqni)y#?HQl^nFm;<v<ovYZjInHeejPxAm`S z7byf#Gq!3~z>`M{04d?@sCC^e@cvPbEmU$uAC!a^jR*4m<<jXn#b;LNx@JTvQ`&j{ zOrS#Btrvp;5`vzLZUD&J^mhpKxXzQI(}=op=XZ%h!?2|wChJyLM|GeJVE;yRY#Frh zMs~52WLDzQqP|eLbGA4A+owZSR32E$B#vh4*a;DdB!)uSv<Ue2$<F4p2of@_0-{EX zdX}S&6X;WE*Z@M{BVvJp`xX3TZ|C;PfT6kVdX8AdhB!XWp{h6dUZ-mlyDMFb&$*Q< zWB@<Y+^pCL*#oNl^D$r&LkD|0gUWg#0?_Dssj;AryG7D`*Vx)-JAI=L2lTMvx~M@8 zE{3*Hp|Mqsyg<276FxF22i<12$S84mbd2=<pZWi`cUxCtqR8Dak%ItOEl(=8`Gucl zqrE_A@Ec7f$V;8V7zyonM}&<s$sjpyNy5~0%DZff|5Wt?RfJe8?=w9Da3N~9MK7Ew zo~z}T*EJr`iDRYf_Vyw2K8=3lsMNWywPLMBK}Kwg9wPlskF?8N8dO>JLpbKrp*q)2 z<aDTB%ohk-5#@65B>f~0N?MB&7Yip{w>|l#d*(HOTnw*%1q8p*TJiEca=U}1adMu= z-jR93HR?nh_-=$fvh19>$L@DEwF1R)@%B*8>Pt{7z}an(P?su{L$*t^uWa`JR8)C& zGe!Q65(UD?4^-8+|7%dGZr?ktX3PKttB&If25RpEodR^_OyC*LeQtP!Sk&cgBHW(S zIh$cZ=y}QCI2(~3iUZAntK(AxFLV#m8p95MT}ccX?d@zjLJ#UA)D8v~$ZKb%ftPej z7oH<oUE%}4@nWJ`=D%UqWZW$HxK?gwt2Tg4Osc1k@Y*Z!qyCLU>-WBkq~K9UFIi$0 zG)W6lO{S2z66rJb!F&8nEbPpt=M~_g6^Stv<-EJcb1r9@08e+Dj(u8GARsQ$KHDi+ z(*Mjz2cr^v2fLeC@>oNeHh^f^zx75>&?ErZen5@@K>Pnr?mp-fU>b!SE;o-oIA6=a z01L}O_A??NBe^QO|1E`2-j?4K#Wb^jQx=U<^ccy30tlL`5`zgzsXczW5=}Lb0ZqBK zhE2?sha!qFZN)=9;giXj&d8+1drrKdJ~`^K`hy}Cut91VWlpw&$#=~?t0PADzE=R1 z(aR}Go^Sr>bMc)k^$p}QwcUv}i3Fip&Ln#hrv2|b`TLldEwff3LK2%}s)sUA*}4)q z;8G|^p*NQ8J_yI4EbmkLzN=_r!F)8jbu&-r9cHhDMU}^)$Wp>*3vB8eu}+=YY;9ql zU^~keIH_iO5I~da*8W$sZ&M8{6Di45w)fZ#Ch86qtzl}?K;RqB1GX5yh@#Dtj=i9V z;;RHE+YmX{77tagRs#OSy#x2cAfS~(6l0&{OorFy^=(fJ-0*bZC?#~=fZ6Cl1)`^$ zrp3dy_dn&lEyr%TCl^L==J=NzWZ$SzUJV(OTI1>;`K-El57CB;SW5>+e2-!;#KRlY zHgphK!w?>{Xtvq-Bs87oGW)gb!64@BfMWOE|9kamH<%(Y<{G|ch1@k<Idg5ok7j?g z*qVZghcw5CeBXN~Wv*uDHvcXl>M1rkPNdMt*e@>_n1CoG`Om~GTw^(gC|Xd>A83gv z9@(v;ru+k$o`5n)QF+g4K(e8>Bkn0OTfaFfBED2<nGn!9pyyfV)ELBYsKQU*#h!7& zAXLEcsq~zssMVs8W!iHIMG9^<%6W#G)x?ZohSW9`@d%Q_Z(dv$!7130A2#RF(P)~g z+?{tE=?vt_S2vruy{jcDrnr^c-{Vnvd^nCtKxxtQpm2aJrd)cgCTS_~sq|d(J(G$i z6-dTS(2Pll?cOKQY?jCs!WvO%Z<RZTPOYH(r49{Ga1mP2Fygtr)VN*u!zeF3wgX~2 z$0{2oSiamG|7lb{dvP}h8${PS1hH44G^tLKvJCEjE*WjKJBHRXQ^shB|8<|2XtIsj zvqV1r(06G$Sc}I!ej{`QJD=e8FC%q$?}^FAG@^T6Jpr}qE|Z}q*XMXn^bIfVEB6j@ z8s8;i#GR#|L~lZRd<t>_;Q@>eH6{MkJmcO!MHm#yCcw+Bu+DRpu5ZzM9&c(p!J$#H zwEkLf;_3Cr0+LO((Ez9iIq+QSdfE+?Ew^%DXFiSIc6M(U4I(CksVGysucO>`deKJ- z5UlgesNhLS-e^q29|+qtso!LowRcSou#5g!&u3OeJtVDH72;Q9V322^=5*}HTGOt& zyKGf|)0K+qG%foVwIHfwc2;PCsITuyw3Y<e29jRf2l@?pwV^UePndXk|FD}e8IELC zG?|O=29LK-#|5c>?iF4#_+j<PCc3V>kg9Cw1^dh)p|BRtxc*W<JMIxZL-53)vRC!~ z)=Bo#NfgxaUdm)G7E~0ak&=<TUrAF(=7by@-~WG95Q)&=oGHqn*ekF5?l6y2N_e0# zIZoOHTlM#i8`;42s03L!RzJp2!vP+-U!Yj4QM)d64Q7S4l4{C+@tgV|R;%s>?fv~} zgx{fy%2-GlK&bn|GzsMV`_hzN7>H?*bl8+6BtnJTOqyS?Jy6|(!^_S&#6dEo6u}BZ zq#2lK-!w7fI-x)%txYFn0IK6%F!_Vd+*w3>ZP-^@cbfQhKG5fp`d9lZG2X>gL4oLf zQPBTtj5(IuL%71_AWOOR`p+=)hT?G@ZC6vGF`yH<IOCh4ILyXz9Q{2py=v<_zmw}p z4cqpXiNti+#H%h2483#GAWx1sf@CSEAPR}8W``Oe-G=mX*XT&!VakZ*)7)E+Qq|no z!g~UO#S6vr)$S2-g@<h*bdQmR7^f#t!ES@w%vLA-B?#Fe{iud)@-y^)9)MOfALtr6 z@Q)fbH%{Ql?9&>fsP7E++^*$<Bb}GAjqD|l18Buzx{Lbim@Y&*W-imV?{91kqHoUD zFDP$0A>dc^!S~3jBIUzpVZQrv&T|%zKWhwud{<I0vCelLWZ+#IFqQ}}JuW;>qJ5DB z+zLh|wVetU$MEs}{k>!{s-RILA8$y?R^_2<ob%OLKcOu1oQ=SZyG<lg#ti<Kv(EDm zq#dYg5oQMS9lEQ9_YHns6o!o>8WuI-{IrADL4M~01!&z#lokMZfGVf3%#;P+5Y)Oh zkNX|)m}#03bTm-Abchwre?orb3X_M~Mz|BR-rUS^*J{jQ!RrG2)rQsJ()EXMO?pT` z?{EsO^HFc%c48K>`1x|lrwl%AVE@ldj&c=yX^4hBNXd)?yNLBK>JAtFco<QR(L9D~ zT8z}qeE+(|_yh{gA>Tr^C+*uiLBl*^J{fUhLTxq#d;tZ*jX$Vyx<PXb<}eW`4Po)@ zy=V+}?Y2Xu0o-m1DL|&q?D$#f49ULzF1F9ohM9Vg!vOI1Ed6iM&mGWn>JpT|Fnm2? z@fPH8d}vQnn(iNaqb=J8fi)#iA%2f&O)?sJ#$?B-oq&@)?_4a!7@S&weeneAA;2<} zjHUq-8fY5AJ6uhE=eyJ|UZlTy@ZzdMc5_`j@B&Rrq06^J>H(Ty;29Pv+1xHJ72FEa zy1C_Q1bOyB!l(&<8~??^rGt#*dw{x}4pKRdW#Jj%iV!-PF+`f0yGP7B-$XJF?4T=W zz+XR?!1mWIad4E^)m6FqiV12^6&_b+C)ApW8yZnsPyL!KHABuFFB1Bu2nJIRHB!_V z5GCsDUV@4v#0g<Xrv>E;DwW+8NLLzFp2$>=i&F#g*LuASsZageh4Hb#8jTSAH&eX1 zh3ZrBLWdQYj-C=W^WwrWF0`=d+|e<GmGvZ9YeeQK^u_ny_q80^SlknH<+5-<CexE- zIm6%>y;kvmvka$)?y82tUuG*P+)1hfCM=?qKBRcxXM!J+w_{f+wReLlB90`JJk}X3 z+KM|ZHWDzGsl<E~E(<X`?NW>4WfvStM2_A0wt+vSJ9Y}z#SugCgLP`BZ8noH8Fbza z9`eR(Lj+pLuR4EdX3Pyje4zJ=mS-a|&k;2L0<?swR5YDa7sXK1>!X|+uX8Whj+?Hw z<BU?~<C9E)6=pKdL_!9KL{VSWu}tk+_Uaw8XJey@I$Sy;JpRJzxmAgvLILtQ$2bzI z!S$YL3P+FY?eU+u5JTlu4m>OWbbIv-3kgVN80r>_eLpK?jK%B!tik*r=X!&p=xyyf z4P8N}|7+H#>U;ga_@9>8n$`so{p!x)SHtrX_=7tlD=It!ilzCaeD?$FX(3jxzT527 z+g?kIl@};gd>cgoD`2yED0f7M*d1_{Fd08q`po3INdV*Sq|c`i2`^`7Qn`DM6F=*g z0W{ZzLy%Jim1ulOgXPfA)A~--dL#_G0ov@E?D@U5YC<#LL|>9$Y?rj&Z)ck-Jsk^R zWM=IBB*!0NA>nKEjJi#2N_ia2T@hO4fhBhx#k=W@;A(R5!EotblAhY`{%@J2Tk4$D zh{<Il0F{!@`<Fus$jgxIcC#m@zP5A%vR*bv3yhx>L{rthU2W}hd}T@gs&eP!W%&;I z@OM79X>;oZLRNh^_(<x?mVyUTkSUHh`lj+#9fV=_5&z~=(TRl@T;2QtweH8UzKd=+ zbuDr@x+%@NQ54w0Ml^D>1tWMckajr%Q1R;(sDK^vqOr7&<XVcGrbkos^+;!EtLcEk z*vlxu$c9t~*UK*JzMV{;Ya&r+OcpaL?4;FxnJyCmePPfXtFHFYm=tXYXxv^5ZY9TA zOqb9i0vDf(*4<NvFgpfKcA$puyQnJc=4;w#u{)_q5FgIObDI}(Qylu&si1)Pg|@)t zI<rPnD`7QVNYg3a!nB?`xMNy>iH;oJBdib$j5B~}PIMWW2pj&orWr-x?M?5rI5{?v zgng%=Rdci%`dQHwUO9&q=!A)KC|FKH{j8_s<|yVCkE_UHB$>SOP)+^SS&axD@7-vK zwPHMPbC8UUx-k&%vjHWHM+Xn4I?H#+MS*0*>8<>k-mU|*<D7&v&XEILM-qS|3z@9H zf&kNO1{wK4000W1VfM|MfxL#+>EHxas+pY<JXq17E5Ci)XtwM3Zkn|fyOWJKdL&S= zO?x+fWHy0hqmvvkvRTFy9hY&4p9#t3NUDHb*&FTQ=k*2+KI5lfWxcU2@ZB_h_@Na# zm=9>Swc}k;t$i1deh>KXs^S~0<Txap(?Lr}$X(1@qgIqc)$i2ks@`jQN!f8tnc$oe zjMn$oTc;jQwV!)gzyo=b{ccMLG|8J_<!=MlY<UVcO>w&`&1cg&$9v;=>#e&S!WKvl z!mv}EpPBFuUOSip?w}j`ZJK!{Mdwe$+}fn|f$<Lqip#R(YFd@zZXu7&a!hj^*f2m8 zy*W&7h0ivvff<*BXVNlvP}!nIXdkBiWN;VsSY>N<G77$;esJx_LUqwoJOqmck)Ym8 zQ(~*^8yZW-8^>rg)IwGxXE4e{1nfEVxfW$dH4jZ_bH{(vnUz?1`VA&~a$jM_`q~58 za(ZbVT6ImpV_Cfl9@1l(MDonl3kA0qk6JXSVT>jimnl`<ZqH8Q2nh9%--Q-424~a3 z*$Y;nD|b5cvAUiQgy|GCe`^AA%!J^4e>Ws8%Su}MxFe&qQUz>_sOBChi6T(Uo!~qo zqGf$Zn)_(LQbEpTpL)ZpD;5V1QTpDXCddrSUN1F3E=J(J!ZUw-UbQiObhbbycwH2C zPJ@9q;4b{Sb`}*}l-{OW;YVhAW=-O9sQ_PuappZSSnwW#c>qFmOxHPr@GiGuA506j zilfB2J=f5j79N_?^7-euhmAxCvfQ)QB~f~~5?n@6F45KonV<V_W(@|{5P`gN60E%t zq{5t5b9CU@$&w^YCvJFC(Kg7WhMa(?TACvDmSh(LparHjnp<0n#tPMP5yCBYDb+$^ z^f1nO$VIxCeJhw%i+hIEUQgd>WXo*rk(LFWVX>;CZK&$JM8Hu_YjdUuLPH9;w@Hy- z*)|^M*DMO4NcY<Z?|_VBH7Qe6WViUv&2xLu>v!{36{2r*&X(b`rZ-QCcQplEYAK9+ z)e?+{;`GTe^4zBc=gNc|@)bSJeZ}6XlZrsMFi7dMk?HhRM4~cRbasL>;UlpSyn?lJ zJ=>OdJ+Z9d0Cm)*Xb1ezvHpp1>U6(U>!SXlO`wIbL_FUg-b5moXb1OE4J182c|z9H zRMA!FF)GeIKH&p*kP>8qN!9e<veWe8B9W=39dt%2EoV`_HMTl~Vl9<~Y%*5efYLPp z3pz%(m9f?WD;<6NzS1ThjX|B{|NDOq`a$iSU6*4E&f$J=`N0!k2-3=`h`U8mthx=J z2JMhxQp25O>iDb(k>vH8Hf0G%<!>%YK}v*%QXjt1zC_>}2C_2+6}Zg7eHBk4nW?Xl zThK-6ZXY1nVCC-O2dMG&%`e{yw%IqBci>44!xp89YiTI+@7Z+~r%-QLAXuy>YShK< zONWk-=Ik;0KlRFa`iuK`Pk?12E7v|8z!Vgy8<{7zEihuQboz9M*0(;+ngyL(<Z#XL zAbC5gTN=3re@z|woy1tUou$#UESO~&YM4lH$nJP_1P9P6@!Vb%l3Vc5@=L_}<B?xc z7gjsh{EzJs-<*bZ?Uuz_F!tZQ`ZdlT|3i_=!$dtQKqF%@jM#95sNX)=*EeVU+_OW~ zJ`(_CN%NRz3x|hp_#eaf0*~5N380&3<DI{q!e*3KKqwMV{x0Wdu*2ccLS3C+*i7Oc zI`f6L*rXB#$v**(r##c_4eSJx1M58D(5Pc3LUN@6X_}TU)8@^5GH15yto_8?gLE}4 zx8Vis7dCmlew$A}C@brPS7E$0*7ob$9bBY~g0B6g3~2IP{@%GMkcn3_36{0-m)f@I zK&OcV@;X`w3(51Gsnp?D?Oy5oK-4{`bm&ijHx;BYR2lZ5)EgZ%Cp~=4JZxP+6*oLW zP%>D<yD?b&j}>~GJ;mv-zQb=&7{~yoYxvtAc2X)V-uJI7+~q{XhneYedeRZu0-W1+ z#F};3r8<%m!kl)inOS&VPne5lFFG8$k2@de!NY4yTd7QE8fMOZRYO0Fznd4N1vXs$ zZ5Wy?HO~mL@EXr?2hkr)@XO(p#qg+qzY_ERzl{xZGYoF4oFDsnrYn-$4W}U^T-^%w z={{yun9iN_R$J-zk3lom=T$KOB17#TnuOlwXhebI@K|x(J50iC+L*}!3cBxpV_4s< zN8EkifEQEe-wvd#{xW(%|Ln0Pg*459a1RF|zj|XS<D3?IGoCr%<d{Bsr$4?d)MrHM z48bE$w7E;2RUVsOI|?}()8^5(<v%yJe#BSvt_R56JF#`EstHc2zWspCrjo#!DGT74 z`F0XZCd(_baPV!{S;sBZlXmakpcnHr`1zbO%RDXcKIn&8+wa5f6IV$hX!y5o#74u$ z?QhYp1XF%HU0quQ_(%%@2YRt>?`-Ere5!V;#U-Yr8BQ)@K_j%9o4dv#hxri5OD&IK z-T6i0QgI%&laeYB%}#<lD6(dK*C*2NePKTSpa?!>uWeUl5ERBNPN%CoJ@ol+uKMSq z<WQUjLTiZGUi?ehw#sS|nyqFGi-caR1(^tA#rG({t!#RcVq~XZuN1413qLe6uk`-1 zSu%>cH@Joo%G)?VgAolnvy3io+z{}Hu~9652)xfoB<eCzYZS2$pW6*NVZu_B`XfZD z`$a<IZ*`%_@J25Ak#8S=u`;P3cSU~x3j{EV7sCHMNMg{S7}9t}?3~blf(cy##S1IK zF9I3^zVsMTk<kpm!YNrO)R)i>3kM7PdlTx7@sbGyti#@YWv-qY%}chbIS{y@qZ(8Y zBCCbkbrJJ22enj;BC`}_vNt2gIb$|35yL4N9Td&R#s<<5<*alNX33%5At{l85#eeZ zMkt&n<Y1t%ZQjE^pA2v<=+@Y+Lw91Pn4ntjh2oir9Tsuf_n^x!HbpOqIK=A++W>kP z3BPB%8uVV(7ASsi|6nSAyRb5|x5Q;#hd!JPEuvlB79^w{H_vQ2sA{-4i15^ekI&vi z`AiTkA2zNdjqC?+)~FMQM8&3fMLY_K)MB=T<f&|{(KmU;a>qlDmEnYVx*}~G?SBX? z6}TQ~3{lOXJkTRf5f@Ki+MM$-p&PM;!gW0a-wAaM0~^7;X%O+Tkl{#vyVA@lUBr3S ze<kymb9f*n_qhc-tq7pdE-Lqjo7T7DlGX+C;od$zv(Vlnx_Hfs`&1;aFantX=2g=C z{ZRyG2Xuc~JTm`IECN<+$*%Ld?#&=%$jL8DS+6yxBgxvf8~}{h;E2VZQnc34El~qv z|K4t<4qmj1tBdr5?r|EWCLDvYU_L=FPR@hYiL}M#Z4&bIXKsUX$J8ol2f8kCe<I@P zZ%Rdw5+gu!`83HH>M&p&E`NQGc>h6Lr4-AsHf!pc|Ctr0GrF{Is1jac9Qcsfc{lk9 zxs}?@xH~vdyT*i0n)lNxdhTkWc9gw%soWvBBf&tj=B8Lh5_|)fc0&z1Pw8M8Tt;y; zBmPuAhdtI9EW#cw8Rn)25sjvM4|gXt;Lr4Pq8OM)o{L@C_tgKH<X(_kOgGneeFu2^ zo_LJhAO*QC_<8~FNq4H+$NuQUlz{m?2BKu$=g+iBG1Onk4e+~-AtawB-%Aeps|{Em z0t`}#1uDZ&>|%5d$tVC8eU@MlWl{i3a2m2d3->@Wu@V+1<aE%Pm-H)#SXD%0UP3vy zC4A3>F}z^0vdkU%EOE0(0H&(^QQU;S@0B#J8d2OfH6mj_hGeH`t&*lST`WAJX#Ak& zFF0Z?X|sd{YkE<=v4Tchj`!gu#MvP2nd03F-`H$ljzNISm5hsN&!7aTWL=@@aT$iH zc#FHQD5_xK@EPdj3^x2K&Y6;*5q3B*Jq$$75*=F%9#JZZon?H(O|PI^A{VS@B?;R` zE-{lq)GEY<ZNX%oIi2l3z!Ke-zSxI#heIgcN>BGoFS=!UHwR2~hF)-W6A(NZMqAuh zwB4{hd#s@Pc06Sv^a%Sd=VwB#F%?4R0RkKHOh!1Mk3d=xheM&Wl{e5G)!zHrP*9Fd zeE+18AT>`Nv-n|D_l=d}VCb`U=?7r+_ltW%ihdlY5=#-*BSFNSN)YhMl%K8C9KQ5n znlR7;%Hk`rhXC!qF=bR~Khka>{kk=&*?yaFqDw1Ebh9M&JBU*^zHX_bhz7=Wx|U)< zct<i@D^BQ>j*Jyxc))WLUb=!V*EN+h8D$MTX%`}+At;Tsv}C)4%9P%|yXrKor^nZ2 z-B}WAc=9PVn*YPUDw_zXK-v#yBCvhRv!yh{pJ-~V5z3mi^GDkDOr-^|EpaQsXV?RV z198LLp;zTd>e~x@atYb}l3QWBMS9|!{C4a3uovt0Ty%zhzEc`mJdf<391Pu5Hl?<X zF?fq;lBAiqZA5e$vZ()s&hH#2oVQpI+AA_`Fo3gVPUW|%cI6GZ_5ve)#e$!9s%H+L zEO=N5btamxv4KT_B1yDH2Z|yEJZ9E<77}ZC0~fCMwHOusb*(%-7)%29tcj(|_Qh%2 zY`$;?hCv-WcFW;sF`Hrr)TZc1EzTEj28IIuPWr*}3dH2sOCuPHjRq)iBvs{firL$; z)85LcNyoxCsAh(7{zUoZboDw04O1ZYLSpNvgFD2XJT;9%n9X<}?L$EfPpukxaO4j! zqFj>^DQjx<kKZvQ{*jy6s>ro6?<%Vgf~_PizKGTg7<t6!xr1^v|EjaDQw2lB7`w~3 zK1q?NgTx|DW@wl7n|81OM2VOhBw1>oB=Uu-7tLL5<zK^g{~Q9`?CXoXa$g%;^0OXZ zf)^nNr&-%21WwgYJ{A{E!xEcS!Dio$*7#z^1KRbZ*EmSEKuewub?g{EQfgyrCtiDi ziC=P(^~nsqCF@2%X+bPoN-@+m@Ld<5t3#n;>c=UJ*o;Y$VGATOMy1n2Q{GL7w}xrQ zp2?fQZ49O~V=XWHsGKjMi4mXUd-8j_W(A)oL2}#IO)aZjns{}mWeT*+kd{5kkG5<( znlomqS9-X8(n=x_|380e&uP59`3P*+yM4P=;<a^ca1Au%%GUiPU>y!N0oxxMDKCx6 zD@D5phaiCKo9X<qpL}z22l&%(osS*}qxR#|_}1b}2m(f}Mn6et4zrMl;v$^WkU9TB z<sjBx2HOI(xPUl7=r798u3nS;(Sq577Zwq$(gmgea}#ssFmLS2WYt!7R!>Ta`q<7; z377tI2drxm@s2e_lI~-;rs9vTyXSdJBQTx|yL*U7Ey_Sd;6aftMC?kdqwM6-EIy#+ zCK3RtnxOS2e;Igk0l+&UnB|*ze!!+F5D$h|GK9A=pPxz0cM`!OpX@n}3Z{#9h}rwW zJop0`RVxg*?deuHd5O}h3d(w02M1`J<000r3e1?DrYTa!Ti*W`)hW>yE0+f<RbQN$ z7xinXIT(#SanlDsO3>UN)K_r%fuu5OMfYhqdUUpBWeE+Qp#4<mMG9|>v8K3!guml8 zk?4EjOOCI-qgz0dhPZh71<8>04}IVw_lG1N51hR?yuiVt@<=K}m-J=;EgI$VlijZD zaPp=F4u1X8ie(yw(B5s8UBGxQ0CEL#S-I4rxmf`@k<lXbsXWTenZ?FdhE^GtJ-BF5 zAjr0ypj$OTrRj>WTuI@uuX(uhF+ent9xRSzzb^r!(#Hy~+f`-z4naeyDBy|iYI;Ec z%5*A&9Bz@UxOtbggpk$Lx4Svem6}a3DHrlzAevNQU!r_d$E$ZxFOVl>xv2_KrU#px z%hq!(^IliaN=bpbDV-^N9E#AzV5ZkRcp=UKUsY^^!+2*s78H+@ygpk2TuJ~5YxC2K zO;OFh-aCEYl{)GddQL+VAd#4u%Xi+9CC=X2@gS_3c(**b9*S(D1Bz@v$nB8sJu8h$ zco$EvvDkBp&M4IqAW4W$AUh{lfV6B?_=^!LVQi*d=vrktiV$SY@>G??05n{TFs<6< zUjd9h;1^VeHP~<eF!U%Po==em1k&3^9?*hr?4KvI1pNpNT%(RcCU(}SaPM)W?Y6aO zp`T1H&0B<9yLneue#Xr8+4aME+}cD+N4Eg+VfF3}a}UB_0tbpyvJ}pLvcZDruaOF7 zXEA*Z0N^R2zIaL^?m>-Gp^h>xV*n*U+P{Vh&w%Z(Duax%;sJ)VW7B@jbGDX!m4=SS z-BBHPNk5I*%}FuYIVuD5<MKvJiA;(mI44Eqg`Y!MsDdJ)dox{U#|wE*y-M_Hi$RwR zphJW1;`!UzGx~!d2BDb8br$CXB|<bi3kEP2`Iip`;Zqu%fLx3kDRWDYxv`1PP^Ha5 zU6s{fK<#{`0(%6rzp852pZ+QrqlwAGucpPU8aiBXqyy`_Y{uB=ss>tZ4|jHocx;wT zuwHY%%mw-lXbqyTfGtliksxG38Rs|7?DTgY6PZi8mwxUR3H(=qb!rN)Aqp(aiA$M4 z{T|wo(|X^zPyv=sI)S*2V{=H?xw+BM$rY}PaNWD&i?1hFn}OOMr?uh38daM>$Y*JA z=9`u-AuPTh;Rs0>fk^{bn|V7&-s?G$wlU5;MOSm$u)x)Phz!E?&|k&$**lH8nPWrB z2_)zUotke^NCGR|DUEbtAHTWov43xtXFokmSFP-8&11N!{L26?M80x3S(pL}$fx)K zG?AfF^O4fY29b7)(0^}C<+Xd&CG*l+=%^-F6-6c-?)oa6qVg(`)2`}+inu<EeqhcQ z@v0gx0TT)C@4qDqX(oP0yzPm@y7*G=z^EjjsyLkRdQx$!5O#@_+`ZY!OOI<KOz;@x z&fNmmQHg-3u!R!`s6&^VwEMff^w0C3*&hN*+MfMVxTn3Q$?qAvJ<<?!B7n2mAQG-} ztLUI6IViZ`cWH0_O2h~OW~N+a5MEA5Vms7ooLPya<}UY3Np}y|5txaGUnGcI#lWSE zuF$y?0JrDemn3FVmtDpD#DY3s>BhmQU}i?LqPTH1g1hs0uFlp!l}>OI#xC#xE=bRt zuo-r1p(Ra}|KMktmb=a(fQFDvnV?|oR%~iw-krh4r`i$pNw#t@N1E|xkPrSvAR}n7 z&ZdaNF2R9>_>X;wIH7WOB~vYn^jogvWEf<+t+<vg0wkiT5W!{Q3AIfOEAV$tVWc+r zfd(dYyn|j2zVW0?0cf3PNwG8jesl&=?9UZk-Ul;7`Q9+iRbep_34I0Q2I{f1cR<{p z+q;Frumb6Rcf*}YsrEfEoSEhezr6i6wc6OcXAL{NRa2mvvw>v9qxh?0yLSR~KJ8xY zB1T$W&gHcXcOEzfse7Mp(8==SwGtnmw^a*ynM{$Pw8P=_ZX2RQ8(Zl+f`_BV%2h~; zB!80E#BRCOR&nS1n)8hD&(XF+Jg$DvU_+6_TNAR}_muN=TS{T+<opxi6+G`tohKD0 z1yz^zs@dBzaA`JwB9s#dY8C1t((N@HGzFBv7L+hd@fMJt6o2AsR_W@!a?hc#&+$6( zkySgbKz5V*DIR_>NAztd6NY(rPZH%De9V+-vPeeG+A`?+XV0!U4RL|n6$&sABzMg7 zkfWH%SGO<r(Wxn7BJl`eWx_3~iK7{v3*LE8;M%42s6FePBlgA|eP4-h#46d@UF}IN zJI5}Ze!IeC*$hwyNMS1rxDi#l;S!T(Z!l|4<2r54;Ix{uU8AK;t;3qHRp*7WT)Xuf z<0&@ktF07yuf?i|P6|5oY1KKCb)3XUDl&|?XYwEA8@P|=bK4N)bc|PpdYl99GPDtE zhIbxiHgr8;Ndvba|LEL`o+LOVUlb$!)gnOQoYD0|R&frB5?j&3Ke4vM>SUE#WRQU0 z-^>|Z%L#Ao@FsDuH>KogIw<l^0K;e1S|Stf!>|ph$vN<6VX_O${&R|x;J3T@c8|6T zw{^)YqXy$T`ji?j<~){C2Rao#oQS|V`Fs>T5>KBa<aFlysCH^s|7!pMw#WNYp9lm+ zPnt}^rE*`#gDA6Z?0*iyjT9OZ&e?vEL1YKeZW0<$9|PwiDp=}t=mlWl5^6xMarhdu zj10T!Dk#1tN*g>kRX^mGrqYXjSv96b{qb{Sm`B?H?Ma&H4yX?9YsI42D9al4#4a4u zm?^0Nk(wkOY{QhKtc$xgzU>LvD4>F&Bb<AU&6?b8U9lNwP$`0Gy?9qnYtHqnJp7rH z+YI_UaKmwc^|CwNotp-UYEdV?8Q)I<K9sbGQ<5jfaWXI-E5<d>Jd#D9bf<H>I^eOk z5HMGgX}4`^CW5lOn9t+e7NCcxtA&zKP`3rLkmP%LLO_>IP!}+^;0v0B^mZGKU<$TB ze?{2zrLM%|K<$4ZN1rXN1t!HDelFv<F#;z9qbo<p=BDnHBUFdTkeRZv3<o)0^#nJ2 zxJsLGpC=Cop(7Bjl=!!o3fl@=HWHj&`kZ(ClP({CawX;~dclB|e_0?s=R^pQhBsm@ z?M@uhC7$fu)(wh;9Q*I0cv9Yjs1&N&a@SJ<TZj%C7U~qEdLf^6t}2#arg^6+Fd?$0 z#ruR$q(aq~?-#^oTJAD2=jdDs34TC648rSvNHs=p&kQrOAvUH6g_9nnm-s7|97j^U zW8CzeTs`+8BQu{`W5Jy;a<4|GP?v;)*$h_@_>&tFlW7a;W0AiielK~azL<6`^K*;b zd=teYqszt8dihih{qQVp<r!Xa7L5HaVkrczBJb$$waWm5x?n{B3}L^QB5J<#Hx`j& zS+Uq??rKxTDgcZ(a-u~SSPYOmpR=cLSA7Ad#!bpy=NhGvOkswxlF*}$9tUS+52r79 z_y_2{Bt#YnC?diO61<|Z%aFi4;LhZnNkmj{V*p9Gs!7*@zHPP@9t_0m9J5^|F(@M^ zkBi%JcULO504DU^z9@(MC>Nb*NGzd^n35>DPa%+K=GOm}5*|jnyy0SW{ex{jf=8Vs zRU9MRULEg5?>rEug)RCXrf#cFDebf|1O?bt*}?AS`>!F_4}J2ZW#SZGjyo%i#Ni&k zpgN6c#1R$ZwN{mM9Y8LLK--^>`dwk7j3Z=?G+SdK4JagW>G3SeC56%0Kj^a@`Q^3} zuCRDHW)l|#Q|P@O)RABZ{pxReP~81(&cn0L0CNhIOvD@pePLrDua#`(Si76@sf!c{ zsIvDqLLDzG=H0$}AP*p+p>P{c)6PyY{t)I@{6=SNV}FdQ{p1lfx2BrGlU%E4-4vv> zW7=@kFAnoWHTMB}6myw}e2Q-?L|_H=5+@ljo?S|*ipIq~;K>9sJxp>TmDIRArqM*O z+sD`;UFma~bHO_{E7;<==p1k$b4Aq70^?+oLE2xtzNu#js@z6GO<ERskd>h>*L+IW z{?{s3+6*9CQKY%KuE(0T>s)fr?^<0}^Phw;rbN@a5#kLe#`_Whn*#E|vw9_rzpIiK zfqG=ZgMo689epId8@1O%mO+5A%KoIf{~{3L8f#b3ihnX6-ug{5MN7N3`Y)N-&L|Cw zBDl8_+<b85(ptFI3gq6NMt3b=D;BE-N=}yXnDO|?c;OdJKgQQ$^s@=rhMu99v{zIx z!3&rO8X+80jCC*UES^hqK`%1R{4mJ@;5!shQ?rOucd#r=a7RS-rJgRXCR4eTFs`)w z8NeZ=8Pki^q3YS>njeL;z_-9}=qHd?9U>15ip?)(IUkw4`$7IFcJ+sl6qx?@rle3N zpcsjju`g!=Ro!NT&Bx?iBSQyj!(Y99O`n4NeGAa-0-ZfP=o?3$=(v^-=2`#>jx8<L z>Y0M`d})M&g;$Yb0nUId6PbYC__>wm7&(x?5;}bfV6j$Q8j;m*sXy_uwfX87V3mWE zjKuauPLw%(nzqzBMN@6g!09IHGz(#pl*&6BYqC_SEg`GxO@*CuAEq4ic^#Lt3~mjI zpLp5=p78gqjov){1|iCX3Ef(!gB;!!JSLI%!h7~1$y+{rrB6vj-i7vh3W<{=1ykDe z)m?Xh0|hiQ4YteodxXMlc<{6=`XhnPl3j-7pCMy2%+Fv(Ho&MRXE@S{SX(4f8jCR7 z>F_wWI5D4WXmO!k7SX@SI+b}Q%8cESNj_gbjQ6#t%&+3W1Sa#OK3xlFKHhj3J4Kh* zz3u{6lWM;^Dkr}Q-sE+GrYiBrm*#tX*2lT8`C@N*do;v6)bG)Y+n6K}35vXppAp!9 z8CzflC?C$7*~sP9SbJ=9^)DU=Hv?rVaU^C2tI;$Pr>$4W!GD#MzJJCEtyY7nWPSW- zcV-(&7@`CoU?^;<eq>^KQ3ButdfZwW3G@2Nx?Zx^o5W@4jfO6-ynSGS$O*|crkc1U zGF|>LAFn*mx*=3im5N~GXz8R@=<eDA4|>MndWO743tSbXfZ*H&B)U~$zCt@U8-jGU zT|dIaqTr&89@rVWPp#7RfPNTmHr*oY`OoGf4aPgkzhEr)SXZMb!k?_Z54(8WlO;XU zwGB_kW<$&~vYtymi&bz3(L3};<jI50^z!V_sCZ*~FDjaQQ)8`IVRBZPuOfyRkKBaZ zDBXQ4j`5adBpWYJgv^4@e7I`UR)1NMIXVphz4g;v2`5)AmUr6laN}N{N?T0GWJ8a( zk=TE0z??r8tTVmwcMJQk+I7B({g<VHim)>A)&fWH^DU;$0JTkh0(;SBQ2mH^sDACZ z@cQufgu^BZUn?Wb&ekJ<cG0xFaAxBOTDZ?cO~}QXtWeR4OSaqVNoa7nr@@|aI^}-N z-;!jV)<J!<{D*AlQyHVHpL+Pz2um^+_qEvxY^;<E95r3E2i@F}ewkL3=()eI91qrE z+F(JRGpXZz(JCVOTizk=Je|k1miRQnPgJ>?(b-~`XrwfUu`GZM`Mn09PaLvbD=p~$ z(g(FS)qkiXe&CV~fxwT;UZyL9|H?>@E9|NjWnFeiuVTUkT8V$fmOG9XP@(PJVc(hW zLAGb}EGK3}3V6gRIM(vFW%oSCjQOdJZN!X)mVA3(peZ;5%*P<=B5~B{c{az`2+VoK zDaHH|FmE3MB!Yt<$<1xs>-ESyJ8&CY&QnU3iAkXfMW$eJ$3u8Ap*}=DB)&pZQu7+h z?W^)~IOiuvyv>xhg)gu`q`+_MqC9^?1Q7>!auD$i28{m<3+`nn2ap)Hj)g&B7US!x zH#H40q^HJoTg~j;yg)#{nzD)3-bTL|WhPn25)Np@GD(;*YyGu*vH%8F?va3_@vzM` zu4b0PpV%Cuno^0KtxXNdPB6%mNp$VDy!F${Q2aEWs>sfUQ2pWBjhgznWqvmLpf~ET z2nj6nKG{J3j)a!~$OK`t)@^CK)XCF)z%&Fzu8qDn;5#r61k<kqyLy7mW47Gwl(baG z*t~wrrxK3g1&+?*DXRLu&+=Wk<}YmOK7B<X235WMGACVYOtg+3nWxa6*>2r-$)eZa zuioTsoYXu09nN5L;X?85H7XNiga}qQ;~MQ`a^Vmoc)2fr4?oY?II+3ZYmkg}YtE8q zN_XH~8Eh$oJJ0sTSDfi=DaA3<_iX^1yZRc+PlSz0B~mQBA-<j+Ks;}lI0XFteXv4Y z2=RX7C74)sLjsS`U@TQiY8)p6;6Awlof%O&<prgax-?si>7DbfHrF9a;h-rGaK0<g zX{1dD6^eq+hHnV;qG^s(P8GiJS5&8D6YD#YFlm5<os9eaD6;ZXVjUU1SB`pF(Nr^b z^pqunDi8K1!?Ko%%KBSWJ&T`BQlMnhWx|Ak*RIz~8$aa6z_qr}>FIiR9%xZhUoya` zOGDlwvS8l4g4q3fhE|C_0=_6iKb>GFCGTEy52_rog1!`VY0=z;y?itEDK8ov(w3iO zOrmNxPdo`JDyT^jhK98ntlBY^WiMXVWk>7IOt?qRL^!4(3XJl6&~BO?vz8>(bJ;sX z{1dJIc9hr*0t*&?GI%a>y~-TJUDghrC{50@e%~IL_N9C1_n7bfUtW-JUHUhSDe2-- z80yhB#rdPVj-M$SzMhNex+oj9OlfB&NUCna_eeBy`%$em6GWDFzl$HjG%awWs<3`9 ziUt}w8R0b(dvH1&Ct;hKj^Te0c_DE%)_D3g2@ys4RUSYo%Egv^5O!gnmXk#^^Cnjb zXVNjvX26-iOh40*O!{_)%D0EkJvhV*A{|2r@a+wG2w#SIG|Xkj?DNoQ5pwKkciKeg z$TNZh(djv4054ko@Q<H`oIqQdjfrF%PfN+Gh4-L}cT_bt{rxvti&LmH1SoA%l(scw zKQOB9W`M5l^0A4A6-liNU@-e^(LuLbO3gs#=;W@LNlbFfwdaNqtreA$PWbhN(jRgG zMy@H1zHth+BqbIiPiSPZ=%KgB=0GQ<&^BiJW|ZSk&%#s&&G$0VB=7pptEnp7W-oT> zREo{m#5?t#hu9Ov1|=U4aT<J>vi9Oo%NAWH8`+H10Bz{Kf{!m!g$f8}yNZ&~v0nX9 zf@F~}KL4#0bsRv*M)hKs|5Q<;!sjg)ok^z4<`;HjiTt}a4jv2NNeXUs6A9#4wG%;} zt)v&N0B)CfVr6I(hY_1imnfpJ@@FjSCe~u=a=)z1o>UWHrTO!_sEwb3F;Y(vwV?N# z#;mD_qVfG`*1ghcE-ryCT6o3RWq>N1wQT_+P(+Zie(>ZON;0QSWNCQH{ZrrPVvZ+& zfy#P43TQg%U&LQ@B{Z;NYzD9-ePL7xi*VBig(s43eDXw@6k;Pnpp}n1R9aT0;T+IT zhjA;ctmu9~G{PCmsVF-=+$vf~KJQ&00(7$$32q?jCReA<#|ia7X>|aqZA+-~kjK$+ z_~g(H9sZCc(ozTBI8apBHW?8zu@Ab%L!l~@fY@`LtJQ0*5BpJM%wQb1=p)ZHIv;3v zz1<V*&HyhN_5Wr0f+E1l$BlK`G=15s@ZRiUoO8LISRFP?erU%82*{R^LE6yd+{j#l zFK!^BhuOkX+@qfpn&4Dzpv>jA)kjmSga+&Z6Zp6dET3#_L<s4GV!iOOpj;(zmn9L) zSpIF)$%VbgqoGLPH=ckqbmOXS|6f9<^`prv4Xvj1@K#!e%6OuuZhu_MO=2190W9mg z2TqK9;#0*tU{s0xeLjb>K&5i%G&59SII@2_^ev1rIO+kGI?HRsbu{E~9+Z^P|I06C zEu(OJalepgeE0*4rO^4%3tV#q{Sk;!7EK+O%SE^=B9jAth=dIQb5gNQM<tzB?d?qU zbEg(MNxKxzPm;%uuQ$UJ;SKy-*S&F*fQ<opweVm>#b8KOM0$ZkkUn|IGxcjoibS(> zxhZ*3bwMr@YE*K7VwUYUkxT;3PBn$rkn#%NEq_>58^?h&-SYC_<b?n-+a-!c9g~td zt06FPe2*I}k~7FheOXlSAHhd<>a^#6Wqf@$xZ3Vr@WCgSY{R^_6l=iid}Qie83VUi zF&XIXP3d<XrnruNFyEXAyS-=K><KSpH+k=a(fOxqg7ff<_|3B<f;<!W>iHwxyvFoE zb6^JvhY{z22ya?Sz!`73!26obB>5nAMJ_pzviBYEs42V^g&(_KPth4^uK}59!>v>M zHEGti!N4@J<%*NP%%Ay~R0T%MJ)Xq%#2Y+a?xRcaPA&C8o2DEW-A<%~tA-z?VheGy zx2J>ajA}F_8N?`$zf{RZJp;J3uLa3mxi{?M?92FU@qn2vVAM?v7*`))ea$j8T%dM~ zM=^1&Dz@_DlA`yT8-j_H#SxIj`5@#=rioEiF|ual@gUIm;4~Eb2lHA3ZO-_a`ph<y zt@`@=ie2%Ocw@$3AP&oHOFyt=pBw0`a@%Ake}D;1xHRN^lxzjScESn_fR?jru+12F z)doHr9hWqsWaX^9=Wf>6bBwfAGDVMms@Z|hGjlT`<bR1-ZZM?yv|#N0!wR5_P3|~C z?*&#%5t}!*Oy#e#db%AwoG?swr*-8FLr*z*5@X`><P|L;AZ_Y>>H+E=6hf7XUF6*X zSFbphh9f^#OGjsfhRQdepEE0LH@@5<7q2?aS29QPSQ`mH56Np^0JyqGT`*sg=K;ub zvq*W)72#&>64wo2*WH`oryTs7Bo`(5^vBnSH-mkl{L@0b<O~B!vqyGv2vk^UKbd*3 z>@GMsTSHDZiYQf5z8n$F(&|GwKS<B@e(z4asj3qz4mA3lKJx(AHAFVAAmetz*u)sH zOA|33aTgWPG(;<Sd!Xu$Urau-4<=9$$!3bZ8Oz0{Cc>&3sEJdWW?P_Hp8`cS9!q`i z<cme`*>F#mC5?oKM0ai!50rWyk4H)gBAbgdCrXJmxwEo&<krs#MDx*cbjbqN168}Q zcYd3^3>LCtB=Yr#&RJ8ovM#KE{2JC0^3U2ogGj-^*t7#cC&}OZ1B$E%PlHK{^Zq?s zm>7_@HnO3}!)CSpjXBwSYNu6Kxz_axhk=N01xnzpfsJ?rRKz(f?7k0Dg^In(ropfI z9<fbi2O00uz;Xb5a>%C5{&7`JMXk|w^H`P%&!qP@Y}18$^?y^*kQdm$p<m_9Y+G}Y zqG?A03Cx{IlYPr!wrIfRM}{SQqMJp;_pwCkW0O$}(IlVxZVec-S>VO^+O9wS!LzDd zdm=AsMiHA#J@Xn+#-xqP(ozz=5&st8nzhAs(zc`HAs!i@Ckpg3gVV5^VZFx~g%W-t z%KXPo=Gudiqr2Dc@b&d)E>MgwJ&guOh0wjlr(7*Xd&~n<!y`^s7E5XW*uZ}t43|)N zlbG$O+MK#Z0|-XMcqk+OZ{vq`2oxT%HOfkoEBs$IeQTALzcB5aoTn!pU_U{<I_*~V z*nyWXt{UJH=|jq95qdDC1EfSVN=PTFqUZ3v0TK9J6S_NbwqGq6onxiL_ckN|CfCAr z<W^v1<m1|$D{eQps;0tDnyaeWTgdw$w-APaV&EZrdIi1<ummTT03t$39}^+KpSA@{ zTSUNb1|K^vDdwX&NCmb1hX-m&3p0T#7d6|m#6VCb<Gkk${v(YX?OR$O&<iZH(k+@- zi=39s;YitLJtnW;O8q`gg)7>n)a9o}hgZW+xcO+;b#dR*#&jK(G06IQh7rH$JX>hK zhCM$2&*)`5HtN3mv}D*rG!sYt`R5e>`zR=dP&H`Rbcp0AK*m9fz%T<8rd2Cy$}HO) zBeA;dLi>~rnF{$y2qJaMC2DKmYRa6xK_4VdT)?33m~Ubs5A!hLQ69NZ_KpOg$+dzX zU}mexA^-tPK2qpjyt~k|U@O#wgJ7BDzR=hI;RutV9Bp>`y_m&ab%Ae(oO!or+Haxq zo{T%3kG3ulv+EyZ8zj>=+2LS_4jC>odHz|bUc}-^Y`OS<uN#OgLZes3qvG@6Mag2m z7>&9Vmr`5H9Oo~U73DH#h1m3~?uCUspJI8hkfl&vA!QdLSCL10szT+oWdW(7CfLWf z9_|)SdRj9YiI{BSzKHhF%z0KRPnmJL#h>rAnoZx*iIMP0+i!k)Xh%PPmd=Bo?a#U{ z4WR<iCrkDKaD=i0udVHX2oC-qoG{S^A{-CFvNFH}000w#e^sBtqrB^tP$=ieoWz2% zpxzRBHx!0BW9QOm#{mlcPD2s)CND%#lg$pkPepB9vmwc1I%`$$*KyHe1cRqqZOG)7 zt3w$@T6wWsAJ}uEIgI#(y*bchzv8RXG8-;~g#ny@@XADS%U2Rn7?HM_aDv+-flnE* zR>yKCHi0)*qmOttzLQw4IRj`52JMl+Tm)>k@-;CdHdJX1sGwT3WV~S*dA@sf^bCrB z{e1P*gfUpP8+{Gdh-9NM0g3+yK%js_FH=Ie*A*v<dQ58-4#-KDE6T^+qIoFcO~P~u z7bsEvLIcHb9LsAWsw6Qqo&=U<F<&GoG3J88i$?>@wQ*AJ^P=>zTb{c~PI;OZ|7}Ns zg`#oErf8Ue+`~lQ=r?=atty}!JE+(fbe=I5!jD|mJJ~AuW36V)gnhk>cSu4pPu29x zZ|jy~zz#B}LzzoFLT1$6q7@P?k;7ZFQgbSF@>Ch}G8R<-`KkfVpZ^rt$WbYos3w-# z9wXQ2LmbgqR28Rj^pP%n($HSi2#4vZ2g=&OT#Hez|2hw%44=kelo>jza0UCAKIm=( z-GH8Wk*$-QII3t2`9dNETP}c+6(wVD!ZTaNFUQucH@u`QXa;}~z-^sfD<vOt^{-;I zUn8*Z=ZzMF*|bT`twhk%$r4znab0^R-5v-_e^TC81YzO=z}bKbfUq;K5|3Z~WDB_6 zvdc`FVwU&@c}3%#4Xh3Z$iU@~w`^S)@I<MGJ9GewwN@D5a?$<!ik>QUJo_5NP9LhH z%e_vqLw#-@+UmjCvX+n(kMD`m-b?Ouvo>M!*|0~UHn3B`OE;AVxlbL$#qG8JNf8b{ zu=FZuMpvm)>0u>;-dxfqr%WZCoA<0{*KPDy{H{}KY(`<X2oS&`s8RmtkH_;H1nl+} z9H-Iq4UdIp``Nw&gMQ5{z?5r_L0qDlH~?0M7mjgY)(eB^W#&+DJw0=ycOTz5Dd(fm z{UVv*IcOm@PZWTEfQ{TUulwdJKJ-$RU?iz1A}%m0c#U{-n|ptXBI>mo+beJVKSZJc zFzgph7pT1SLXl3KJ#`YypKiCtT;IYSN`n7!s!E!#(d)eXm>j593T_Pl!g3Uo49+o) z_H)Lq(O$4jCBs{`t1r{D_<dN^Vq*oY==DsQA`zRjPUM1DJhLxe!tja7F#Vq3V;T?w zyU~jI#BXwxW%8k+m?0)dOjm>G^2)ka08Ib_6RifRwcjIpM^uA97cu2r=*N?LG&LaR z48l-yv_#xgDp`GWhz>n9HH{1*$|L3gzKBqkn_M^0<ey~od2Lg_;(Mk!+x`h=s9bpD z5GXh2uAw72;FEw3YaRGjG`SBj=jB~44^fCZ(snIs(ci;+c@dMo{>b<ud0}oJipvy1 zOh|~+ZOVvHG58aWmUa?%2Jd=FvF$r-0?K~OaO<<T0`tL?Sd_~Q09k3c;Gzv(y4|-e zs%R3la81xS(fyV~S;L6Z8^dr#IRr3uX}$q=MPAIIi^jEl;*`hbCMXwNd!R2AFtGOn z_DMW#9B?$V3WYlDGkelozwBH4rY$s;V+kZB2{pCwGouG#rbIC_p0Mki{B9Qh@zyFb z19DvgOG=_+;ZLIHeSR*!Gp_%wp}p}|Wq1$YCI0?81j^K<DERAdTe|<{1eVetY}U5B z695XkqlUPe0D12N;E74Q=`*fA=x~mFPnzD4iiwo(H+?^)<|&bBV0H9Zas|R*SpbFL zs3|j<p_q0n>a>@+g0iXpS%das$~UN;I|+&~RWq`lJg{&&|8e!<K8&CTM-UXW&$AE! zH*o(D>Cz#{IOkTM^UXjw_p7JoSxcBZ^$6!OBNmm?TU=Y~|JL4;EXh}lrhMK!daJL| z)Pov0Pe?;dxSUfY*XO`K^UpF(N3gS?6`NK5*Sn6A-CuNrY;<86c_;=8h`2@lW{nV1 z1)G3}0IQ+3fQoA|AG}#88dTGrdUq=GjlEz5;SFnBMena3WpJMJ-$K6GoIC)79<gm% z7mOI3(F<3Crb6D_i;!WL;(9)+KJVFsPeC<DkC$<%19Xg*5@FZ!Hzk{Kz?PcRN|*GH zAR{zwoMslxS08P}<lh<~(Tv6bAboHE0UaPf(%{OT{(i9GFr`%kN|`p$?&-R{526D? zeoUQ%5uK#&+~Qoooa76GQOR|g`GXT1A1MS5P<}x(q>M@uhc4_|OFeC<G<g-PICr*| zgs3z*>{)uV9)q7uRw#ddWJ*t`YU#8RsdR#+T!{*=Q{v|`yp?m5if9ou6EyhYr9lu* z4gZEm+iuEq*OY=Yi86o(Gyplr>`O5#ck1KseUwrkY}z?NeP6kpB<;eI;HWLlXlJ2# zr0hS4<sQeIh!Pf_Z!`Rv_3(taqiihd1;I3s#+P_NwLe9`ih(7v)3pUfj{RI0SSNE2 z|3__cio(tHs<Z*~ks>X`WiCI8W#ty4jdImTO^IF-1@EBS-B=@xIVc2pGl~LwCK5&A zO-Ri>Zb*j;83yY8C<s>bg+qRF@f%zM(R(A*d?p;WLlq&p*nJX0D2uRmZ}BqFxmSTX z$hX+t+j|*V%dVvE7l5<Cq^i%U7H(NJIPn({xU9|EzF1~}`7mS5;s!G~I3|YTW_Q@z z;A50tpe27`?0OQgLf~rtBCWE2bBAY`L_#2dqSG0d-LLL$1T7#+b6L4s3kykl(`exp zQa0093f}bWp)g?^bk;4j2wKy$P44bHiA)daEa2%ioZZ*sK1&R}Ho&De-?+I7J{f!? z@!)A#A9N3SL9D$}ezA@t1?=A)aZ8Fmn>9MlPa-h`iI|;#Cy72JrR`Vy(*T`ihNel^ znt<wK6fu&ihw9h+D&{zi$6GrnNXCbQ5Q&ew;?y7tZmpT9s<gHoQ<I%-oO>Ougsyw6 z9c02HT=f%ky>{1<qELNNzmDjz{#oPM69V2~Et-{Z26f4>6v9WQM|%FWwGFY>%7Jis zoi)jtrr-fLpCN`V`62cnf0!hz<|Q%YD;pF6qkL;eE@s;ohz?bM^4gDex*(9>S<ee; zI1DD*e1n?Xi%SmLRY7$rF|&lBO}PyNZ4z_WzkKF!$g@%VLn#FK)^BU?4mbS1g>sts z`HB%PVLaSvVf6TW(Djx-@%s}AqvgbIRa@O?3oj(cI#2D$I`IZ`!@lfK9k}!E-I!%b zOUI2{i48xlIe`b4ns2;B-Oh+7BA|ggG7JU%d^6lZ$?=laXUlBoS&IeGC>lEH*q{a1 zoe?^sD;#zZpBck@R$X|FvOZ$}_<O0?L3D58vZY2KHOsXl0v4I}?Hi`qFinv61*o}` z%&U-y%+Xqt^Y5M!uTQzd2J^*)T9O;`y!X2W_m}*1;<JF=<ub@O__lO|Ad|4(fZVN? zPq@}vgIY|~ALtbfp2l3L&Q<aaM%Q07_xu(79<$%GESoE|UNxjnEm>*X6=g?;33;yr z8Al~lZ~Ng?DE1ci{Y_uT&d)hAA%zb0oThyVy^Q9o(LzD)ANqEp$IUg!gkGcpQ`(0v z(WDj7DF5=y^b`Gq^KRYauoN1nn26+1i<r;>{R|`KKg$WgC%d>vLf>q*`7cSdtbs&8 z{hgdy#)lj(>#;8cm3?2pV6?xMU%Qwg%T%LJLYA@!oH#`S5*FPfMNjlgC+mb`j`M^9 zmz|mO7Glx*;VzG*@Lib=nG|Qf(%5*47&(jk^x|~&p8LurWE9g`n9c3RIjt9MisubA z&SYSLJ23A8&2{x>fT~$0q-24fI!&R=(^FQUe~K@b2Uj)C1$uu3=b#0#*XXhBWZCae zvx6v0uZ`>jA!Du7PQH9~^r>N2VT7u@a>(~rh=dC3K$D{Xp|NW--nE(9I0^?$CjXX% zL!4`(j<NOTwK&VC-7GFFL=`Q8H?-)Ef_RXo$GWzGxLrqD9sx;<@Eke$8G1i8<x7}> z?sZ4Y_ygQPFZohLpZe!@V9p8``h2$J!C%&NyKIW&oQv^Dd84$E@1jP-!>y-B4)Ot4 z(`K1hI6UaibAAf|KmA931+d8{T}PhdYxMN8e};4?OK2RbCZJ2r^R~&(gVz&%R_0?> zdu0CN_#0<xa4a#2ewBf!PNEpof>vF8D_k4@!@^D9)PqtQd=d}lC5ko4_<^r~6kZiE z%-0Fr`HPF{w*=@oaX5__x$Cj{3Z^ZQR_5i{2LyWP;zJD$X?bY2h@cwDAW(GSs;=WA z_{7N)nOUkcTl6)HUq3um6a5lGCVFZ~NN~i!+$t8Z@NGA0YAj9m%38Hb!+iF;cku{A zfB$;`pZ_28BTTMcGvQCAA~2I$hGpsXina@oAc3;}Rr8YVlcQiRvSgenUlfGy4;t$Z zGyvHLyIO)yJzm8=C+c`|QgBcX<416mAIZL?WVg~p$z?EG&cn<N3c{(sE7k6hwft!x zf#{WeTlr=j6UC<|S{HWjqd3D?c7Yuy>laFkX@G64*bq2VWo%AAwxu<}c$Qbv2g?-t zTjWavfY~OfNxGhT!7EOdN?2#8M?$ZC&%hmV`>^58Wze?bx4JFjU`I3|&xa($sFi`j zFa?yYgFTwAct{n^;c5cVJM}usp3oI1BUhGcAd4=<yIb-xtcYJ>Gq4UHt@mwO_X*Y~ z=JA8a>T>tZK(DlEw%e0k<T(__+1wcyVhzt8W38Ye#q3uP-!NY(6h;Dgfn?*G+R;D& zOz8rjsqJ2vtA$E*?@wvt!e0w6ivE)W^q9pig(+BOH(B>M9*Keda+eutYZ6CxnlOEL zPDQ9)RG~?R<KUQxUgqLwMY6JKE=Xp>ib(wX;O){Z>CtPeb#m<nA~>hFHi`*a#b&VR zALh6w2nB5ei6>v7q?uk%7oX**`WM@ZZ0ISMbBQ+3S3eXo22rFQU{yT#Q#36pJYpO4 zUr{b}R|hHGwpjoG@}3;(=G+$?pKjrh5?{1Ly7y;yo>3}7T}$*1`>sK5SQ*&eu32t& z6DO!H__du}7#|<b?XdjH;0`SM3fX!zlyQfOBSbCdGIRR_7q*<O<py@W(F--fXY)3l zx3uq3H{MYNoG*5_8nZo!<cVzO9&v7w(x)Q`wmX?oV)zx2k;iJb64;ainPjRB&g#R; z5k!K!qV4+?ZtoT$iFc;`ZKh*FTqs^HNX|g}CjuP%fFA_9Wx*KjTD#PhC+%HY5G}VT zhhR?4+k5VVXMK+%s27tAjX<B12q<dAFo7hG4~uwcDDY3%wN*$TH1h|V06XVImlr)o z+d_em%$3chhfJVVNHrtXKZqZ(!f83uCLyDFrsIj|6P?FOEM7`t)8-I$L;3p#Mu^nL z>5k>tf{HYGV&&6P&O3VE2u=M6wjz#LF36ZL?vKJAD=1`;!n1NaI<3oy`Kq};gnM(w z>M@&&!l6C7Gk3{&v^F(UQ16JJ9G(?q7Kw2V)kit5T4yZyV97+f2V^Sk;k=}ZePec{ zkT3PNw8H`&OMRb~Bx8cIoF}`-tlKmsOu)p^oLAPe!(d>x`Gk<B7uzeGfMg27{rGgj zEtdnbo1}11i5_^)Qr}N!u?94qPSI!4OPQRloXqmCFHfd~#e7*KDP*w*Rmy4n0^n&; ztLQ7+DB_9sYI<PQ?+YH7ip$x78a3IO3DTZ7TBFoCOhhCt<7?22dUKpta#7x0&0J&b z15mo)Kme+DRv*X?Q`wi&A!zkL)k-1s#uXwrjf7$^;VgWpNS@)jBH;+L$hG_OCbH36 z`-4YP`|7Or6P8lb#kuziPjI+&FZO97W_EOoa5{*2W3{#!;;K!(SNeO`m{n`~457S- zt-AaKg>Cmh!AqFP8J6RY!O(hPYw^@d*8NEetIf$RKlcVGSj|oomif96CoA|G^lSOD zEV}f_XCf2h#p4rlfRY~-mUU6(`QLrXS1ul_ga-D9AMB>8ImRJLW<-s-uS8=n@OwE4 zcGK;g>cs{!%<|F`m-Y!z7y8hAcD^hhboSchLcu(52P#xcf_<2ynKq&hvAH|g89)F> z7-t7;zEPSt+Q<$vVFOGi=$;fDkN~)3#{4qiT&+(t2EgAUH+Qx<a(C|}Ro0uIPdC-} zT90#bG_d~D+QpSef-n6SgrBTKYrXZV>I%&#WM@Br-xEhVDq&-Gk^<KjsC6$S>e!G{ ze!X;?q<aalU{%Wbmmxl_k3l*xkPdg>1ju#YB`XV3j}3{9n-xdkUj+q)7s%05;Zvwy z-{Z6a`Wuc-%8Xt#j}N<c-erspi-S28`2GdGHU(fzCLgo_6;H~g$f(*RfDR80moLrt zzvxw?L>Ixj@VaY&adP9x`DE%`KlfARRE0-RkfhRla6C*M)%;42b7Z=Yo6`z$LnmB` z?Ecg%0k}#pCX4@XMlgA|AJCgT8$Qky2VwUD!t+l-d8=s-xN|l?FT35%^nO*cqn2v~ z3KjPPbK?^uus^*PRrbJNvvD+$0bbIioogAa!^mxoeJ3W8gnG598TmZUOmuvX>88RH zjT0lT;a<zgFa`_(eU?i@M@nFomb94I_w^=y%JxF860Wtq^@#c1A<H-9AnjiA$m<VG znQ9;uSbr~~T7#Cs2cYuFl#lL-JscaIBj^nw3!`o$l~>Wj@3JgUxla0{_PthT!-S#n z_N2aRuW5JH+ayu(jg?q9Jqg`}YYfu$A%M47+JQesM|!859}73*U}Q}sVv=U*jp{kL zQWv}CW=rF0yBw~${-G1pH5^vjyZhuQ{eHkA{N;GGI3z~af-|v(Q@79Mx+TO1eNS(M zq|h;3%yO%0;a8I1`T~n(!lfel7X&p1-mB$!<ie0eOwAd15{ir6es?k%Fm8`Y$NA1| z$qT!Rp>*5t3f}H5WBagBQSm(ii?SG~Me(LX1htJ2;JauZSelCw0c@F}TQ}-`070|? z)N8s$BaZ+8>UZ@gnk^0D6b+t66&j3TZ2_`AIqDX8^8aV3QU*l5i_Ez6@j+*uG)ku- zZUH}ps<4pwz=@*&knYUypO?m-SXz3I^0{@jy{pzzJWh&K-;ihIWrlvOeh>tgxg8u2 z%@9|+pU|b*XB5p_3HwpVS>UL+g%l1ve$FE~!nf#)hAQChR|60uT?^aaiG%yY%tEkZ zC;Zs1AOR7K3@8YqWdI^HVVkom*i`?`K$TQrN~i2+z-kB3bg35rSAEydHe^}q?Wbl2 zy&v#%v*YuL^O%zu6%;uNYbWKQF#0=|CvSHW_R}COssFIXz?~2E$m@>gpO51*^cBkm z+adDGE-TYVP!Ax0WBs)29obv}Q|KU}Va&OH#6l4(U##bh#`!DyzxSFk&+l{~j66(4 zLMPh<*T%l|$k6|loyAF5a`LVMR$9Q2u5eL9`F9cao^1S)Kh7H8-x5$lI)4Qk5uag& zmbF|Tf8-PN5{t5fB4NLK%LR!Z&snv{%B}F-UAw!&p5R!OX@a7AS3eU?a^_Lja+`E+ zz{-~aaEoL?w!C6bAltmpWSp>mBP|rO%Jvjc5xdP2E{@P^M2HU(TNzYUiZPgHucxvE zbh`s&s`F_&g^!WrHR8Qo;l5#Q4UMF%$>s8Ds*^O`I}F)tGu7aJ0?zHzY=y!Z6Z^vd z^})r$f3c!Db6*N6??F-rxjY*QlN(OoZ&RmM&J57SdRY<*r99Cgnbqt|aM^DfG+2w- zxQNum@w?5eq}a50J6s&qQ)!6p9Y+*zgMOREh36%H#N80`C`toQdgloh-nGJND;PY> z%rkzaV!l`T%s#C%D5)P!wfbaw>Uk5m8L8_TMdK+b+_K(5RaiSHS?0o;=c_fQXxqZv zQ@DC%syDElAT8o*%@d8dP;JzUh)fTYX!JnQLwhp}9jW(TU704rbJ2tMUo7XfA1RFA ze*Bx%muj|_h7C6=eR!xVY2n7l=kP^d<P%;Q=M+Q(8o2_Da5&beU3b4FA7Ni4-;g1- z0G|sK80Loiq0rr`)CMbTFchG=s2G!dc(_73a9=7H&;ADkeig#k@an;~ur*@9_(9Ji zxv^TjK#Gr-FW2)%w_HN=b821FVd&(?K3$bbPB`DTCvu+x{_l^H=?jhqmckOwo~Vjk zs>aP;7In<cxBxPZh?tDan(7InrKsA-G6jM|s*QOiN_eN#3JK;SR{2Bp2QC9X1F%s1 zo89u&?676P!#9wKZRnJ)0eX`HeMC1O{^D2uZ^;iqPSrk{tcsa}p_A{*oR3wqH_W%T zQI5#$_oiFVWiY1se0&s&!P>sw&pR-IgD(B51D&L9zVQxnzvkJgat+7~-pm0DX@zQf zKqvnjs=Yd^hC=SFE@%y<){;~S%O?k92@7?zRU_d1Q3|>MVXJ|seCzKH0VOPV@v%pX zU`+!rm{fCafuC{PGph$!QQw$S|BAKretl=1!OaDrwZO3YYw^ozFxexSt3c6sZicb) zX;UENNAgq6Xdo-~wXe;4G$EcFw!l14HBXFK03FXaB`XE-%#mL>wR`b71#;ObM=V6( zlOU_f&HFo@C?A9A|KwKN3QRA~39tZGleoD{wghW=&kR*p%otfR>z6(t4UT>2nWx2% zNHHK~u%xXHtmk;XhVv+m@E^kGCrlGo0yU^qW2+6?UnoFZi}t{icKK433<e+jTT1#6 zvh{|_UqHYh{0^)F>DMizr8zq)t4Xi*wpCgcDR2Z~SR$I7WQ{Gk-Qy#E1J4)jGFP%T zv}6ke_nm^t;4Pd_X#W_a^BPw9K<raDE=#9HbcH4^>p2YvYB%b32R)L2QCUyaeZU^| zT~V)F9jsZL7IM>JTIIgN@<`~j=9X<r!f7?k?w-K1NJL}jPsmU>LMCF=Mi6|~WdAYT zg|IgU^;2R3mg;eGNEWGF0gY!I)46cjB5C?vPtCDAy+xuw)sOm!(znY-oM-e|!=rtQ zCEBQ`9q~Z(in$AjQN>2u;B}|NLLCd}H;2x&!&-WiBUz8YcVd5D&wmcf2^asPmo)7i z$LePJsjXh+6zqQ~_+ia6_ruZaedeY@ewmVf1cX%j+RZC@Eg?3;1uI~sw~TY8|4cM2 z7>Nv9WJYh~WS@ST_A87(hy!MOeNN+NYhLfjadrNgpnV3xX+|16!?dJ;0X|dQ?>_vE z5I!5;@tEjxt&>wu-=r?d7X@b*oZka5>Y#(=LN|mp5lV${C~oNd0+OXD3|uH*Nn)hX z#7&ZoHbzruHGWp)C^{fW=|+-fRb1>Y+uDV;>jkO|DT8PPR=&haXiV!JAig}#7-V<u zdsJn!K;jx$L6-$=TL)<-W@J%q`*1}6?D3(hqyPW_K8Mmv^2}SZz9U$K<8ot&GtuT> zK^?DHL-14av2@@X6cYcn&ycVa)MaHdrlYu%i8vw`-NwP)A`&Z$ypPR`EV;|v52Um_ zbOWhO6qR1x0Ts}E7858hk!u=t@2<31LKt4ZzJ92<FZpb<S@<tk54&O6<)cNjf!?rJ zl|Qi!R`7<;#k~#A;@vovmwJm;kIg)7X@|&iOX)$wz(|%zlGGm)hr2V$?x}(Z&e40S zAYKorKRxg%1COeV6|fbsA$*?IXOh5W{O5QZ$c;->7Do#~txn&4v;B^hqYA$&|Lw&* zuVR{}w4K%X?h6HFCthhpP^;z*WxLh#hwZ}0vk>gwl4KBQyIXvn<0yN@D`OB<^j>K! zSzkP<(<{#@akS-Ue~yVm#SI-Kdl7bLd~J;<Jj2>&xHQ~;eD0W}g1%ro4bFXm8054m zHMu#Ut|hh<d}9;h8+Z^~WzCFl=E|!G2MVGx-t0#h%XMhP0Q0d{pIwj?DJJ?N%yl?x zsZZQ-yxST4&utFMbT`2ezwwL7BHe~&jouh6W9fD<Q+U~)|BMxhi~E;0uA4;+_~a4$ z`i@XY2z<2&W(#Z@_AZvo6UjK;bd-C|`p5$H?E5H4FsnGt>Mx{d_xXI0<-h*j9UrWb zo}`Teyb3@o^}yNV3QMh0zQnR}82M-WzbVoIp2Bo$N`xUj^LiVyRJ>(%SQ4~*$Hw0; z%(U|^)r?jwv|Xy&h?oXXVbV2pzm+4a)`7@DZ8VsP@D<mxiRVD%cB2W9z*?m8gO=}B zp0*%@HFG`=2U=^Vo&c<sDJQJB2g5mPw2R}>z&g?NZD8UOMro94A949YdSv%VYSFpV zwh$NfAtie?;1C`DLnyps@Cc`lxla<4-=vclYf>=}S<z+(U*_=^X}d-Y#~yb#KL0uh zcOlFV|FH8Ao8(=LXAEk|P5}u8lmGw+j7eQm>iWbwTwQMn%wOr{C1S%--|Kkyd{4wi z)>%AR2R`B_fQ+XG?H@MGWh!2h#SEW^yteb~!AB*{n_Ey1hl{_UDs9SaMuXp#*x6_u ze_>@3*jsv}@vn7Is?ju1C6;fZ&-7X+V56(&xF6!`7AWdWSJpEa8=*t57)m7WnkBj{ z$%R2h*0nPEu&l-s4;^KvbVga}`i+d12U(Lx0FbT(PoX+mQ}ccZ@3}_N(L{ZoaPG#3 zH=~WYTq0*FkYskiu3ZOY4<_73EFjqV1V{aOyk$$s1(7gB{W4oJca?X}5*M-mUcyjH z$i*J!ivzd-qEe2Mav^h6WaSW^t-y<ZVOE}&4vc!b%?Df4r&;5r9MaulOXX>vHLDre zx>$r%Nk~e}dTR}PoYd@9G2hhf4q7Dz?^+_D>3k}ukzJ3>A9y~fqVv4+gc94s7D+tV z#9+oU+7jB^4JGf*dZbpT{~g^Go5BEE5<Lw!6QWI1`2@HA9v`y4-OM0>FtD_!vcS`H zQtWPlGiX&Q0VhrXSry^d9)Z$L)cc?Uz$>;V=@AfK#bOE5wBQJWz%7?Uk4B%2ta%=3 z8g!N)9-G^DIfWpX#kK=C!wY?yJbI|*243UCl&SO!PbJ1u9?X2KFP(bVPa!A1DoPvf zx`XQ{v@Z5?wqVNcnb>A*k4g{%4j5mmCp%WNnob>z5q9ZHdkM~?V{O<zA9M$Ve781p z0`?-A4X%PgBx-UE8_BX(rNzA&RX3alAix!!plazDU#ugvZ3ZD`65g?2AVClZhE$)X zVa0I!F?Pq&qz7dH7$pD%d4b~hfSeLI$&_<)wQxBxp^#Cni|H#oJS@BvJKjZYeM9V9 zWr_#NV#$_M^g1C5`m$!ZbV{DB>_w6bn}%y_5!Jen0t!;b&58d)aO(iwFtW0$9ASJy z%Mr+p#liH(Dw1Ey(P_m%HG9X-Het|V_JMr5rDSd!{axso@4#!;hLht6Pis>`kTGx| zLkFBCe+%S_DVDpM-XE+tN;Ta^9M)-G(UXfvC5F3oDE#|mOTjE&cm(Vd8IFJe3iDoS zVP1eYDTQ578BMa^R@*z}=P6)1h#W5zjJa&wUd8{wX%2oCI>Rl>Li+@IPg!Wst&`L& z(JJkI;@8Dz1`RChdTJMN<+WXBQ^hhOEh7NHn|+bIn2SS#a50}r<bP=8gh0`D#B~L& zy5O$uJr7hY7GJ;+!&OnBB_rBL>@fx~JR*AQIjk_6G=6JD)Zw6B3<){kI*|~HpH({0 z(B?_)o~9&=r_Q~~{sCpM(t_TbAF*q34tw#v0vf4@A&Irr8-62<L{hBvv*uEprCKoE z9JadIc{H$w1$pbm$%i6Lm*hoh<?s0q9XNhy#GNN;N4j8^5(U)Gv`}D_Kv1oFKvyEc zk=t@q;DG<odhRPiLWsqfXOzA$q!w~SU(m4&o0522Xm>2_a|WIWuiWGwK*=?2Zg)4u za_LNCq?QtM-)Z8yY<x4=U<k`}2mB!td^v()Rwd+mdw}$R=*su(k1Ektu~NC0kLz6M zXrvN1HShst|3c4N--&K^7H7Uomim_P<KaOA@P8r$mVMb1=LN|!JUeHsO^)|zZ4>*K zZD76goP?S<x3phL`xsn87s-&*g=D{pfKVt3K)7K3_>8M;Q4-U5{FhyWvJ*86Q2D>@ z@g(W5C~Ccvo3T>SI>w<26lDF&L(9+;|Nn<-W#q9NpR}!VlZr(}R2aMXRVW!_pG!ml zFT@7B-$x_9t(+lO$gik~Voq6&NMIyS7-L%tVf4|N$?vI<xOn2tFzDbe%U0*@m*!}L zteUeQ<H6?ut-<`xyu&iT`?9e+Aa81&bPTM=tVDq7a1*^}oi*JC7rdFkPUH?`giHHE zL19-o+%L8&VCNqLZ8v24R3yKg9mPKQmPy|%?bPE-U&s_jzoG^brmrvFt11Te1}Ukk z%iEfJB-l8PME3TWny7tvOq4IjAn@)>!ijQ}5Lm4qc;JqDJ4>3&P<0x!Z}D+@l?LD& zr1i*aPCer7+qge;ID~S8$#A<$mVFS;40n0hwm;@n>)af=QxTk)7%S39WZ4j(L>x24 z%#-z*zKp|jz;T74@L?$dmltU0(wY;hA|4@JAAHK2vK9yDnmbfcrcj>pWl@sB)^SeA zp-%NvHwy1G8w<OZ)ot)^!Ngq0SUeKI(6W#9ECanaBQtfO=ZL(Xir1*YpKPo`7+NVF zN)tL>NTf0l;Tyc1Ai><%kPzA<QF7P+$nY~n++F(Ti-nx>sz;2u(KEQc6YF)&&?YzA zV6XkM_gt=!c_rYg8(UY?=#AL5nCg}wA`kF2bw#e!TARpy3<JrTG*4#eJs*er-AMw~ zD@Ktj6y@d?1}i*c_rV=%VgSE*_&f`mn%FW;UO;s0-w}x2o(itt&b0IVSPpmq09O$Z zT`XDh?xlnbl~uQoVZEcA7R3bOWu*WMGQg-4_H<(kO#;p%sHlAf2eQ@+%5snI-vrZZ z)$?N@_`8cxwgq@gIK{lKek6$n|K+rCc$F;tZ-N-d>K5^$24!vg{bv^2tp^~r&V)wu z>cW>nf5$13mgFe{o04ZP^=`6O2*lLn*?CUP3Dzh1277T`xV#s(RNfWf&v1{E;qq<% zr0^s?Q;vA#4NP$4>^pD`cr$bM#MqRFyiC^LrUAlOHvp?Tq%ng{+Z~;~L|I4#05ndG z2^5isc?}@x;&H2Lkv&dY1v@zLXt>@pKwTdA?D(U?ymQE!V(O69Ck)Y0L~)%^RNzg* zi1Wg<Q;SqDc_YjC@NTd1Y5IjLI>6oK>Ub#XT(Y|Io${;>EO@9Mt}``7c@+$Wy&9qB zCr$#Kie7pBx~Z~{%eb%=U6}n(h;n3X%4!|PH?M^r@n+f=Kwt&Go_-qx01@H-6(gEq zRz)QXF+Wxr%DhKyBxoG6t3xI@q3&&IK#5bkPi)o)1j-wa`p#B(tDk&F>dh6sA)r)= zV~bhJ;^MW}mqg}Yhzh`Tw-w{nikDAN@HZ23E(hfT`f>r9jl+|s({E8}ic2-blV{t` zX-ot%KW0CGjfJ}dxP&*T79G$fx^H7l1HB7^z60lD^;Z&}w?C)Iv4*=Rb|Z)*;I7p8 zJiru#L}>ytI}Ro}5;v}gfl80&%K%1Lh!*FOVW5rE=i5|zg4}t2HP~bi?ewdEe>3mT z+uaAW62EdAl{#>=Ezv}W&QqPD%8J}`o$uknp5YUFTO}WiY!_i64<bwi=XkrILIFt& zp1x12(k{bX&nW+S%>B-Hwm}f?%S)4M(9vf_j3qktGyvUsx^lRfLQ||7^W-~x-^GsY z%bH-Jo$;9NLAB0~aD^nhD3|PfMJLUFZRUe-6VMmGV<0UzEI8r{FbcByytvAxF&bkR z$7LxiS@LN+N!58eY3C$40ozp`ZMHs|P*(w`gJKs2O2Bxs*+L;#8uku@w~w)((f%FG zRkkDFCv2)<^V+lA=g2`sKp~sW(i)$}?E;n{+aG4UvWe3af7JhGs%kQQxDGB>r@Lf9 zk5uUY!_nrarM<3u(94A;pGae#OMQx+Mc#g5>+jrmixX5wW)TW@o+;1z!P9_U=VEQ` zV+Y+G<UdMlF91x@9TyHDgd|8)Uz1`bCAYXJ$^ZZfa=mE<pt%oY&MqBGshBDo9#8gI zlGX3&?VTRE>IJtk^^zAPL}Al35Iedwbw2(ug9dc|Kw!kzrr(=e!5!4fuIHUjiW6hQ z%6A@c!oj+NsBNJdI;xT3|NM+s%nl%qDuGkQ$CUWwSg;?ejy_5&aP<b2xh5EYRo~kQ z&<ig^m-*}=uF`V|J;+=fOeA9+e47N1&1+6IBL&~sUIw7EUmqK(Nbe_5qVH`2R-a;c zyXk*Kgw%T!_s%CZ+o!A`1XoO4-x=}0S87@J9o60Sf$1RoVC`-_bEXYNJagQPu+e2D z!eDSOA5Lza`Iu$kOo(OR5sgXk{PO*|eyK>#X3cZ6M-@SJQhYG%y2-FRPH{ICOec;t zB^7I9%QOc7PQ_U4*UN)!J4}jw9M}Yv;rVW|mOnbLNL8X2lUk{$waKVl@wCSpOAz>n zi5tCp21~DW_pcv?QkG??rG@1x;-oRN1`r)dVJ(J&H#asIGFGdoQef=y-UGqa>ZI8c zfTax~%&qOq5=60<-)xiRdh!BD6Oo^Fb4kmA3`fSp5{iK#pP}5bS=!4ACpg8*WNT_1 zLgJey+TuPXj=D|p@JZVnAZH12qn4KcQ@XU%PdqQcV$U`1g=vP3xC+BBEvD?<2E%z= zg9jPdG`jB`eMe^1Y>?^gd%<r3vEX8F`SS)+q-{lCVg`Xvw9FqXM8rM2KE1|JbHpYv zTjNBNemTf?KLwk>J&-8pDF|{ym(Q3~+XPGd=tBJnq=%s!y<5w80cm;r*#3{X3bxnn zcApz#4%!fP`O2$*;|#*o!$fsJ9xs6Ph=3)rG-GCDrM*9dOQ%dCJ%CzZxe&#G04dl& z$b^+Shi`e$i>I5IZX<PZ3M$7OzgVe1<iOL5QI{uv2@3+F3-wHWf4iY8;ebB(I>RXX z<4C{;K1&kzY7(QTFDF53rw=kr!V!q19+UKUNY&x43X530ui_9h+wQgWlpn=#ypL69 z#x?1LWLOhT>486|DL;s_6X(~z_q|cDKiN4SL|(|R|Df}p$|TAoRP^i?+No{{`>QoG znMNjI`t^T({TpOtnP=2AOxiAG(waz-4Q3(`c^k2A2obw%yaHom7gD8K{%OJaTmHBJ z0Y@@DHouvJSx?p#$;B9zsSs|Esu^c;=ikmTHSH{sHZR*x+$n!=AS<OvBUS~!YKbZy zGtNA(PiePqDA%r0f#`-PLuGOBW~nbUzo%?3##5XP^mXZxcsAcasDEP|t6IVIVxx7e z=nwdB(l#_l?@7vaue)V*;oBGr9+_6{-8>KHN7xjlL^Ew&!q?E7fAqfNatXyJ%cyo- z&L8OVu5b(}4mRy2W|fwdTe~?*7=qx#7Bs5bf(_qN-<|6)iqcM|{sF><R~fBn-h|jE z8QFSej1!!DePKp^1eqiG<5Pv&Am22F%fLZMOYTcSlzk%^pYe>tAakZ58Qf!6IbVK7 zg~694<6STTlKX<vP4*1aSf``?7^5vM#L;$cb{(6{7NXoBSE>wN@w==|E&(S|8`1LW z&qiu%h8!{F9D5+uK-FnZtH)PqYa8oXf*Jg%U5ALcZo(om<79FZZy0J_J0=s2$nM}w zIa8iDj2~E))-j>ph8mx4&10bAg=DV0J#WmLLz{7~G{PhQTwD6Y*sFur=U%!N&`ImJ zG*gvIgGw+%$z)8}CC>VLot?ik`7Qr3<1>89P;M|_Ey$&T0Xv)gAGTOI;XfO=WJelk zTP)}?hAnAm88WKz^XPn$Aa5^dQ&fLRudc&e0)>Z-FkOe3IG^?Eo!&!_G*3)hdCZsd zHszOZQad||7E(WQy1Ye;?FE|15hWd(%}sV!?z&vc%J13+HCjdL#P0?s;JEmjg-K)h zkd(+ZHb`#ZT6Kq`N5jr*xR9=!jcuEKEY}ZBzvjBK$&=1ODYB{&0D90%{~~q&x=IX_ zt(uDcxU%P{7dxXy8d`M|5S0X5O5i62LjeE`6Jnzfo>M!b?-^ka3cLb77-CngcZzBK z>jQg%U;DueCN7c*?|ag&mNCAH&z>&wU?K5z!^?Md=F--fNA4&~?J!YTiy{(0>Zah$ z6H)1-*!Bjy2a6wk73inSalbMnaIsj682uoPvJx`k<Q@=7S)XVqxB$~xGC$RJLLk7) zfB*mh3+(`yb|$q#DxP;QWDR3A9}+@Gg5YAd#{dGkG3T&ITPm^Y)qDuT@T!8Mm9(_^ z>frc`SdjKCz5Xbu2t03+G*$V`ayO2LxKCGX&`z}`!bh4c^Sf<U+Do>kjJijG9A;5v z+R5OBY}m%Y<{U9exp`Mtyhit89Ga+WqEeYZ0wFa|?t&eK&N=-(eB%lyS_mlV<7CIZ zLddj_`XI(VG_Wn-_lOb7;Use#XM$3Hqlvt>NKquL$QIT>R|p(-F==y7@Tmi?;B$#0 zd?%Wyah=9=DQb}7ObVJEgC^KRcq^vLyNVpl3*EIP!lJEEuH;YB11&QB?MCRfGhK7i z`mdc2X@|KrXgZdY*mApT;|pk}GQ)U*l#wgi4#{tZ+A?4z5&$>-g(9*9mw5Z!8wg$w z@$v!`c)Cjh_4#aI+%FF)zh6{xlugeFYJ0$_(Ow{CwvsAf?J&!4i}1=Y1j3JPm642> zA5#}mk@h^U)gbAji_?)NIbL(KN-IjOQ8_*mS1zKZa5CgHx>ODM3kuOG+9bSco%0_5 z2((~CatOn6_zwD}ZI2BNZ<(|)-XtCxMUg0+B7dva^t2OA$3~pzgPkvfn#Nd^g41B@ z)TzQ^yYbS64|E{}_}2ry6D+F-dd+>;w02a11dNfm;WRXRZ)ly@x9Ge8nKkGvFJS1d zB%6wNYX5E-DnD{P>pcmvWH>TguQ&M~nOX7662{8H_@=Dsjlc<N$Hmb0^)@Ksot94B z&^OWBln@K>)LO*S9SQ$dz87>*dqgoujB>f)O5;W$@rB*Wa3H3XOWj>q|034Ze;$o1 z5E#}#WVDXl8K{F)sZrgUN4q|Sf$1jZ8bem5?lMJ=NkqQG<|$)qKwcoq95^o3Ky3@* z*C|3M50vbTtCx`x=6fW$ZBZ@KOjGCsaeBOgXXFWs{NOt0@#x7&S7tyAD5UhX4=Tb> zGm7D({|8`4DtrtUaD|7{zG8*eI02o7u)vsJXzpw#B=4(pvaB=UnpygS1b{~Zn0&#s zc$?q@qvFoFcHjr$U!?yrL8XQ*RscNZnkY)0#;56S6x@K=*7CA?lN7Thn*@53H8bRR zw6P@Whdb4Wr+y$7MA&c$J6+!Z00008+4azswi@$(Xp}+xvKN2~8R!5fu8DI*#qXf| z;UOJG@ijx$Fso?fK7nje0nXwE7z$h0BaGS!5-gkoJ<>`97kkr$g(ACSV~+J7nK_*9 z6c>Kfa2W@w^lwLbkcRFmbg@aVPFQ^!<=9f0BK4dcxCs=Tv+&3GSK&{_sw?L|s)$Zj za$9;l?wa>ni3&8ExPr@K?ax!@r%j?9nBU03QUv~Z08iChT);TsXx@%-o#heZ5KHiv z<UB8{(!s(ggxMN!A=Rb&aav`58OFmPT#1hs@?st&fVPMoSvXAkAn<!!8t^D=Qn2GX z@(|W3IXoX|DTFi?7T|snvs#;&Z#Y{v#=^%bxnz2d)Tqwqg>#fPl{|ksg)tpycf|4+ zrL8cmaWnO(-@p?C)Pmw;sEJ`wX#p{b(r_LXW!32Yb6zBdm5g9789D_%61~;)2m>Ei zt#|p|6(^!ym;%G<@p|(p&r=JQ4#FcAHwfXall>1e^7IL>O;SK(vNo(JXV_;(v{N## znjy>w8THc3gBG||HR?is9Rl17`OJs=wVqymY_+S!Jv}}jo!Zjq{HZY8;UyceF-w~# zz(!-u5fAw>_-gV>vQ=`5J{!%})TH<A@>nVTygt+>pgSP|(&ITx>l$?f1lTKSKU&b^ z$Flo#d7}>{HKQsI>@?ozh2q99bn|oUgRJ{wriM&e?~uzz7<XaM2XQy&K7FRGN`O_> zWzWTe<yF=Huf^Ml3&4b)3JVX4DpZ_Euq{LUL>|I#s!+O2;7$`p+(79DMa8s8_x|8} zV-aY04)Qa}r)Po|t)O?>vCWKg%D+t-#R(W}%EfuXjgTJ{B#?#*9-6<`IAq$9t@fP3 zPz9nYnF%jvr9CaciP>g3Ho&flkF-TqY-8gFmnw{$8vVGvR4Zb8h*^lR?kO158(mJV zV&kKP5wp@D|1*cjPydeRCaz*pX32+t(l|QxKck~edzz}34j+Om1%wj@U)-P?YeV;P zUxeuz^*#H01>(0Oatdl9WHLS-bqq(XbItCe{4mc98utvRr`kcp1pk2fL8H3*H=}wt zkcI~wn)BOTD;yxGc}XhYn_0Pqu_JIv-&8}HfhnZI;`B&{B8BC}hrJY{qBLBnV(6Ae z$pvY<A8%^Coq(;Fehi+2$~qI(h&7WBMbgX-Bt#6>fG3rI=s;NUsDwMWsMM88+gRUA z)l1iSjKCLygCNDz`=OFwi1a?1d4O|qpv*QK?O5G;fnd43dhb8XlvR21ym<3+6Y7Lb zxvMhVLJHP;J%nuC+@om=_-0-^7QN&YeVz#)-uQMW%Jy)*IuMFrv{}O`qyP&r2T@Sz z%|346VgYSiazN-#^%Gk@hSZ|dI_ZK}cAkitYy~d*xR-8pC9R$Rpvjv`PFo%(a%K>t zBRpTG?D2}8&r6DV1-Q0_2>-_g)ScYTNuCVjx3JL}92lq>VyXngR@qw~oP|j&luBIa z&B5?k)Qw}G2Oh#rB_ArjM}(w;q^*&$k|<-uzH!ur9luY5E9Ht!Ru*6V9=E{UWDVe- zEA_fy<rL#D3*F`0{2{$;{vs)=AXn2ZlxvrMPP*9NdQf`iDoi}UEJ^)kOJp?TRBpic zGnaJ2G>U0J1fZq4Hfr?CJjunEESZtv|NXQ|sKq`4*bMb0(Ai0H9KgiKIUG9(#1X+O zGsNARla7AaniK$J&d|%DgoRYTd#7^1?4ltP8zFh_+u1cBCCUDe^$UfBZyZ!)%Q=1U zB=zch3n?*YVaZ{mVy+4+*vqy^nuG_2R^Z~<ml{;)c|^D4LUL39`=-CYUk!X#r*mQa z<7MCZskfchw_Jh1?g|xJS|q2Zk{~GF$lDN0nT@qUwV%&EBk^GQ+fa9tXJLv>6Y=00 zdp{nJ_rW&Hijy+CZ*jW_+j@paw;67UO4OUNno9kY5i;i{3X18sVc+D+Fs^}_4ObX~ zSuP^2OUeGipTOdV!V1Vlj=4pzf}hj~ErdqCPyEN;nenL<D;YEDPDUrrSR$eZIK?a% zRX}VWc5Dlb*+aBvK`8FR$jo?&nML=!_(VRsym<q1$t(}(+n@i}p(-q?y3kJNUnc}+ zvN}g+==wdjy^Eel2d#d6AYQ_+qKzE(82mq#w<fq1AslJ3zwzoaMn^Pt!2b_uWBXm1 z=%%qqhk}zoO8Q*_ly%n3dHH<lt>x3oY}>8Y2EF;>omVTyN1AGcP{oG-T<gR2TTdq= z|Kk^Za+qyvZA`pYNj%@BH~lQONsqR)M+xz?kiY!?n9T~_VH>O1uIm?;`Npka9#Wy+ zHay?NAFWW&;x8>rVsXWGOxlLT<vM5x?G76>R@~d19+v|Tfk_5{b4EGCps7OW!>kv1 z1k<g5bi^=<#S5G2-yIempQX664>x(FRCD-Vx=vcNJ#~5Bu?={}1B^OF{wXE}U+v@i z702l$=mcjb&Tj0+^a@Xv!~(6FL5jU%I<TN(YjO|E?!-6cbvRs_@r@Zu=B5lx$%$fv zuVu{PGv(=l8^V_-hQN(d^5diR$wr&0t-ew<H)*Ytqj5zp3Q@qg1v8%k{>le;b^a~j zFCD8ER?D^SczyyotQuD$$cM`MZ}jdd*#@Y@XaI3Y{4)gsU)M~jsb=Zrc>^$(mjg?T zUdSM}wCF07TfXffw!ifZ=>wbeC!KOK^$(k)c4CTC*LYCX54!C&8HS8NjgDa#dNpH6 z-!FfgS1^3y_vngTdHCA)zo>s2qsFjlW@fFDOF!=i*gK%Ti+;_%AN_Y}H#!<Af}FJ* z$CyXquetYhSOnB2C~aljKT;5znB5Fv^PRcDHE+}>A)D_iR0)})n9EO*5cbyJJ7d__ z^S)FpjbrIn`e4nJ<Ys1|wskBZ=V|39<22Q6Mhut8`s2{I%OE^Oa&|<}XLL%jpJ{9e zQc|(lCu&@xq3HfB(%ks0JJ=E`31jtPYiaqbu@kiQro)a)nv^A7Vn=KI!OFtD;(>wN zVhoE7s0mHqfUkZ2?iPySDPQ6+fzbMBG_Tp<D;3I2SN+$)YN=xD%>-WMlmBWZ{xvX> z)w+nUI2_$V26;DzJ&GMqJjtQ~6ct{s+>#ev>-!DPyJYMC85cWWK8qYCdgvnKXS#wt e!1jMTL{`}!bu2xsrxvSP<qh$(Ph}UUSfBv(#jtSz literal 0 HcmV?d00001 diff --git a/tests/service.rs b/tests/service.rs index 51e74c74..5aec398e 100644 --- a/tests/service.rs +++ b/tests/service.rs @@ -8,8 +8,5 @@ async fn homepage_returns_404() { let resp = service::test::call_service(&app, req).await; // Comprueba el acceso a la ruta de inicio. - // assert_eq!(resp.status(), service::http::StatusCode::OK); - - // Sin ruta de inicio se obtiene error 404, pero el test funciona. - assert_eq!(resp.status(), service::http::StatusCode::NOT_FOUND); + assert_eq!(resp.status(), service::http::StatusCode::OK); } From 3a6dcc5c72035ca097c858017ec3186e2484dea9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 2 Aug 2025 20:26:39 +0200 Subject: [PATCH 709/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mej?= =?UTF-8?q?ora=20funcionalidad=20del=20componente=20Html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Amplía la documentación del componente. - Aplica la nueva funcionalidad en la página de bienvenida usando el nuevo renderizado dinámico con contexto. - Añade pruebas unitarias para el componente. --- src/base/component/html.rs | 70 +++++++++++++++++++++++++----- src/base/extension/welcome.rs | 4 +- src/core/component/definition.rs | 7 ++- src/html/context.rs | 10 ++--- src/response/page.rs | 9 ++-- src/response/page/error.rs | 8 ++-- tests/component_html.rs | 74 ++++++++++++++++++++++++++++++++ 7 files changed, 155 insertions(+), 27 deletions(-) create mode 100644 tests/component_html.rs diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 09376059..228bfe86 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -1,28 +1,76 @@ use crate::prelude::*; -/// Componente básico para renderizar directamente código HTML. -#[derive(AutoDefault)] -pub struct Html(Markup); +/// Componente básico para renderizar dinámicamente código HTML recibiendo el contexto. +/// +/// Este componente permite generar contenido HTML arbitrario, usando la macro `html!` y accediendo +/// opcionalmente al contexto de renderizado. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let component = Html::with(|_| { +/// html! { +/// div class="example" { +/// p { "Hello from PageTop." } +/// } +/// } +/// }); +/// ``` +/// +/// Para renderizar contenido que dependa del contexto, se puede acceder a él dentro del *closure*: +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let component = Html::with(|cx| { +/// let user = cx.get_param::<String>("username").unwrap_or(String::from("visitor")); +/// html! { +/// h1 { "Hello, " (user) } +/// } +/// }); +/// ``` +pub struct Html(Box<dyn Fn(&mut Context) -> Markup + Send + Sync>); +impl Default for Html { + fn default() -> Self { + Html::with(|_| html! {}) + } +} impl ComponentTrait for Html { fn new() -> Self { Html::default() } - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { (self.0) }) + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With((self.0)(cx)) } } impl Html { - /// Crear una instancia con el código HTML del argumento. - pub fn with(html: Markup) -> Self { - Html(html) + /// Crea una instancia que generará el `Markup`, con acceso opcional al contexto. + /// + /// El método [`prepare_component`](crate::core::component::ComponentTrait::prepare_component) + /// delega el renderizado en la función proporcionada, que recibe una referencia mutable + /// al contexto de renderizado ([`Context`]). + pub fn with<F>(f: F) -> Self + where + F: Fn(&mut Context) -> Markup + Send + Sync + 'static, + { + Html(Box::new(f)) } - /// Modifica el código HTML de la instancia con el nuevo código del argumento. - pub fn alter_html(&mut self, html: Markup) -> &mut Self { - self.0 = html; + /// Sustituye la función que genera el `Markup`. + /// + /// Permite a otras extensiones modificar la función de renderizado que se ejecutará cuando + /// [`prepare_component`](crate::core::component::ComponentTrait::prepare_component) invoque + /// esta instancia. La nueva función también recibe una referencia al contexto ([`Context`]). + pub fn alter_html<F>(&mut self, f: F) -> &mut Self + where + F: Fn(&mut Context) -> Markup + Send + Sync + 'static, + { + self.0 = Box::new(f); self } } diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index f0664d2d..d8b1259f 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -24,11 +24,11 @@ impl ExtensionTrait for Welcome { async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { let app = &global::SETTINGS.app.name; - Page::new(request) + Page::new(Some(request)) .with_title(L10n::l("welcome_page")) .with_theme("Basic") .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/welcome.css"))) - .with_component(Html::with(html! { + .with_component(Html::with(move |_| html! { div id="main-header" { header { h1 id="header-title" aria-label=(L10n::l("welcome_aria").with_arg("app", app)) { diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index 63264b7a..a9a4f815 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -53,8 +53,11 @@ pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { /// Devuelve una representación estructurada del componente lista para renderizar. /// - /// Puede sobrescribirse para generar dinámicamente el contenido HTML. Por defecto, devuelve - /// [`PrepareMarkup::None`]. + /// Este método forma parte del ciclo de vida de los componentes y se invoca automáticamente + /// durante el proceso de construcción del documento. Puede sobrescribirse para generar + /// dinámicamente el contenido HTML con acceso al contexto de renderizado. + /// + /// Por defecto, devuelve [`PrepareMarkup::None`]. #[allow(unused_variables)] fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::None diff --git a/src/html/context.rs b/src/html/context.rs index a1df9879..456ca7ab 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -107,7 +107,7 @@ impl Error for ErrorParam {} /// ``` #[rustfmt::skip] pub struct Context { - request : HttpRequest, // Solicitud HTTP de origen. + request : Option<HttpRequest>, // Solicitud HTTP de origen. langid : &'static LanguageIdentifier, // Identificador de idioma. theme : ThemeRef, // Referencia al tema para renderizar. layout : &'static str, // Composición del documento para renderizar. @@ -124,7 +124,7 @@ impl Context { /// El contexto inicializa el idioma, tema y composición por defecto, sin favicon ni recursos /// cargados. #[rustfmt::skip] - pub fn new(request: HttpRequest) -> Self { + pub fn new(request: Option<HttpRequest>) -> Self { Context { request, langid : &DEFAULT_LANGID, @@ -197,9 +197,9 @@ impl Context { // Context GETTERS ***************************************************************************** - /// Devuelve la solicitud HTTP asociada al documento. - pub fn request(&self) -> &HttpRequest { - &self.request + /// Devuelve una referencia a la solicitud HTTP asociada, si existe. + pub fn request(&self) -> Option<&HttpRequest> { + self.request.as_ref() } /// Devuelve el identificador de idioma asociado al documento. diff --git a/src/response/page.rs b/src/response/page.rs index b2528487..0964509b 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -30,9 +30,12 @@ pub struct Page { } impl Page { - /// Crea una nueva instancia de página con contexto basado en la petición HTTP. + /// Crea una nueva instancia de página. + /// + /// Si se proporciona la solicitud HTTP, se guardará en el contexto de renderizado de la página + /// para poder ser recuperada por los componentes si es necesario. #[rustfmt::skip] - pub fn new(request: HttpRequest) -> Self { + pub fn new(request: Option<HttpRequest>) -> Self { Page { title : OptionTranslated::default(), description : OptionTranslated::default(), @@ -165,7 +168,7 @@ impl Page { } /// Devuelve la solicitud HTTP asociada. - pub fn request(&self) -> &HttpRequest { + pub fn request(&self) -> Option<&HttpRequest> { self.context.request() } diff --git a/src/response/page/error.rs b/src/response/page/error.rs index 3d952c62..3a2511cf 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -28,12 +28,12 @@ impl fmt::Display for ErrorPage { ErrorPage::BadRequest(_) => write!(f, "Bad Client Data"), // Error 403. ErrorPage::AccessDenied(request) => { - let mut error_page = Page::new(request.clone()); + let mut error_page = Page::new(Some(request.clone())); let error403 = error_page.theme().error403(&mut error_page); if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) .with_layout("error") - .with_component(Html::with(error403)) + .with_component(Html::with(move |_| error403.clone())) .render() { write!(f, "{}", page.into_string()) @@ -43,12 +43,12 @@ impl fmt::Display for ErrorPage { } // Error 404. ErrorPage::NotFound(request) => { - let mut error_page = Page::new(request.clone()); + let mut error_page = Page::new(Some(request.clone())); let error404 = error_page.theme().error404(&mut error_page); if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) .with_layout("error") - .with_component(Html::with(error404)) + .with_component(Html::with(move |_| error404.clone())) .render() { write!(f, "{}", page.into_string()) diff --git a/tests/component_html.rs b/tests/component_html.rs new file mode 100644 index 00000000..978248f1 --- /dev/null +++ b/tests/component_html.rs @@ -0,0 +1,74 @@ +use pagetop::prelude::*; + +#[pagetop::test] +async fn component_html_renders_static_markup() { + let component = Html::with(|_| { + html! { + p { "Test" } + } + }); + + let markup = component + .prepare_component(&mut Context::new(None)) + .render(); + + assert_eq!(markup.0, "<p>Test</p>"); +} + +#[pagetop::test] +async fn component_html_renders_using_context_param() { + let mut cx = Context::new(None).with_param("username", String::from("Alice")); + + let component = Html::with(|cx| { + let name = cx.get_param::<String>("username").unwrap_or_default(); + html! { + span { (name) } + } + }); + + let markup = component.prepare_component(&mut cx).render(); + + assert_eq!(markup.0, "<span>Alice</span>"); +} + +#[pagetop::test] +async fn component_html_allows_replacing_render_function() { + let mut component = Html::with(|_| html! { div { "Original" } }); + + component.alter_html(|_| html! { div { "Modified" } }); + + let markup = component + .prepare_component(&mut Context::new(None)) + .render(); + + assert_eq!(markup.0, "<div>Modified</div>"); +} + +#[pagetop::test] +async fn component_html_default_renders_empty_markup() { + let component = Html::default(); + + let markup = component + .prepare_component(&mut Context::new(None)) + .render(); + + assert_eq!(markup.0, ""); +} + +#[pagetop::test] +async fn component_html_can_access_http_method() { + let req = service::test::TestRequest::with_uri("/").to_http_request(); + let mut cx = Context::new(Some(req)); + + let component = Html::with(|cx| { + let method = cx + .request() + .map(|r| r.method().to_string()) + .unwrap_or_default(); + html! { span { (method) } } + }); + + let markup = component.prepare_component(&mut cx).render(); + + assert_eq!(markup.0, "<span>GET</span>"); +} From 4d4b654cd86f359595ffe5bf1658d488ca18b6d5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Aug 2025 08:32:13 +0200 Subject: [PATCH 710/853] =?UTF-8?q?=F0=9F=93=9D=20Retoca=20documentaci?= =?UTF-8?q?=C3=B3n=20generada=20para=20los=20ajustes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.rs b/src/config.rs index 5dc05a16..08067fe6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -240,7 +240,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( macro_rules! include_config { ( $SETTINGS_NAME:ident : $Settings_Type:ty => [ $( $k:literal => $v:expr ),* $(,)? ] ) => { #[doc = concat!( - "Referencia a los ajustes de configuración deserializados de [`", + "Referencia y valores por defecto de los ajustes de configuración para [`", stringify!($Settings_Type), "`]." )] From a0c5c20aa151c871bbe9eaf7e782e67c91196098 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Aug 2025 11:57:01 +0200 Subject: [PATCH 711/853] =?UTF-8?q?=F0=9F=92=A1=20Corrige=20ejemplos=20de?= =?UTF-8?q?=20uso=20del=20componente=20Html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/theme/regions.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 5e0186ad..22ab6f25 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -74,12 +74,12 @@ impl InRegion { /// use pagetop::prelude::*; /// /// // Banner global, en la región por defecto de cualquier página. - /// InRegion::Content.add(Child::with(Html::with( + /// InRegion::Content.add(Child::with(Html::with(|_| /// html! { ("🎉 ¡Bienvenido!") } /// ))); /// /// // Texto en la región "sidebar". - /// InRegion::Named("sidebar").add(Child::with(Html::with( + /// InRegion::Named("sidebar").add(Child::with(Html::with(|_| /// html! { ("Publicidad") } /// ))); /// ``` From fd5b48811da7199c64890cd65f24c3219137f7f5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Aug 2025 11:58:47 +0200 Subject: [PATCH 712/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactoriza=20mane?= =?UTF-8?q?jo=20de=20idiomas=20para=20localizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/extension/welcome.rs | 38 ++++--- src/global.rs | 11 +- src/html/context.rs | 51 +++++++-- src/html/opt_translated.rs | 20 ++-- src/locale.rs | 207 ++++++++++++++++++++-------------- src/response/page.rs | 16 +-- tests/locale.rs | 10 +- 7 files changed, 218 insertions(+), 135 deletions(-) diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index d8b1259f..39edfd37 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -28,12 +28,15 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { .with_title(L10n::l("welcome_page")) .with_theme("Basic") .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/welcome.css"))) - .with_component(Html::with(move |_| html! { + .with_component(Html::with(move |cx| html! { div id="main-header" { header { - h1 id="header-title" aria-label=(L10n::l("welcome_aria").with_arg("app", app)) { - span { (L10n::l("welcome_title")) } - (L10n::l("welcome_intro").with_arg("app", app)) + h1 + id="header-title" + aria-label=(L10n::l("welcome_aria").with_arg("app", app).to_markup(cx)) + { + span { (L10n::l("welcome_title").to_markup(cx)) } + (L10n::l("welcome_intro").with_arg("app", app).to_markup(cx)) } } aside id="header-image" aria-hidden="true" { @@ -59,20 +62,25 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { main id="main-content" { section class="content-body" { div id="poweredby-button" { - a id="poweredby-link" href="https://pagetop.cillero.es" target="_blank" rel="noreferrer" { + a + id="poweredby-link" + href="https://pagetop.cillero.es" + target="_blank" + rel="noreferrer" + { span {} span {} span {} - div id="poweredby-text" { (L10n::l("welcome_powered")) } + div id="poweredby-text" { (L10n::l("welcome_powered").to_markup(cx)) } } } div class="content-text" { - p { (L10n::l("welcome_text1")) } - p { (L10n::l("welcome_text2")) } + p { (L10n::l("welcome_text1").to_markup(cx)) } + p { (L10n::l("welcome_text2").to_markup(cx)) } div class="subcontent" { - h1 { span { (L10n::l("welcome_about")) } } - p { (L10n::l("welcome_pagetop")) } - p { (L10n::l("welcome_issues1")) } - p { (L10n::l("welcome_issues2").with_arg("app", app)) } + h1 { span { (L10n::l("welcome_about").to_markup(cx)) } } + p { (L10n::l("welcome_pagetop").to_markup(cx)) } + p { (L10n::l("welcome_issues1").to_markup(cx)) } + p { (L10n::l("welcome_issues2").with_arg("app", app).to_markup(cx)) } } } } @@ -85,7 +93,7 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { viewBox="0 0 1614 1614" xmlns="http://www.w3.org/2000/svg" role="img" - aria-label=(L10n::l("pagetop_logo")) + aria-label=[L10n::l("pagetop_logo").using(cx)] preserveAspectRatio="xMidYMid slice" focusable="false" { @@ -97,8 +105,8 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { div class="footer-links" { a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } - a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code")) } - em { (L10n::l("welcome_have_fun")) } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code").to_markup(cx)) } + em { (L10n::l("welcome_have_fun").to_markup(cx)) } } } } diff --git a/src/global.rs b/src/global.rs index f150ca6d..25a17811 100644 --- a/src/global.rs +++ b/src/global.rs @@ -9,7 +9,7 @@ include_config!(SETTINGS: Settings => [ "app.name" => "PageTop App", "app.description" => "Developed with the amazing PageTop framework.", "app.theme" => "Basic", - "app.language" => "en-US", + "app.language" => "", "app.startup_banner" => "Slant", // [dev] @@ -48,7 +48,14 @@ pub struct App { pub description: String, /// Tema predeterminado. pub theme: String, - /// Idioma predeterminado (localización). + /// Idioma por defecto para la aplicación. + /// + /// Si no se especifica un valor válido, normalmente se usará el idioma devuelto por la + /// implementación de [`LangId`](crate::locale::LangId) para [`Context`](crate::html::Context), + /// en el siguiente orden: primero, el idioma establecido explícitamente con + /// [`Context::with_langid`](crate::html::Context::with_langid); si no se ha definido, se usará + /// el indicado en la cabecera `Accept-Language` del navegador; y, si ninguno aplica, se + /// empleará el idioma de respaldo ("en-US"). pub language: String, /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o /// *"Starwars"*. diff --git a/src/html/context.rs b/src/html/context.rs index 456ca7ab..8aaeb4af 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -3,7 +3,7 @@ use crate::core::theme::ThemeRef; use crate::core::TypeInfo; use crate::html::{html, Markup}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; -use crate::locale::{LanguageIdentifier, DEFAULT_LANGID}; +use crate::locale::{LangId, LangMatch, LanguageIdentifier, DEFAULT_LANGID, FALLBACK_LANGID}; use crate::service::HttpRequest; use crate::{builder_fn, join}; @@ -69,9 +69,9 @@ impl Error for ErrorParam {} /// use pagetop::prelude::*; /// /// fn new_context(request: HttpRequest) -> Context { -/// Context::new(request) +/// Context::new(Some(request)) /// // Establece el idioma del documento a español. -/// .with_langid(LangMatch::langid_or_default("es-ES")) +/// .with_langid(&LangMatch::resolve("es-ES")) /// // Selecciona un tema (por su nombre corto). /// .with_theme("aliner") /// // Asigna un favicon. @@ -125,9 +125,23 @@ impl Context { /// cargados. #[rustfmt::skip] pub fn new(request: Option<HttpRequest>) -> Self { + // Se intenta DEFAULT_LANGID. + let langid = DEFAULT_LANGID + // Si es None evalúa la cadena de extracción desde la cabecera HTTP. + .or_else(|| { + request + // Se usa `as_ref()` sobre `Option<HttpRequest>` para no mover el valor. + .as_ref() + .and_then(|req| req.headers().get("Accept-Language")) + .and_then(|value| value.to_str().ok()) + .and_then(|language| LangMatch::resolve(language).as_option()) + }) + // Si todo falla, se recurre a &FALLBACK_LANGID. + .unwrap_or(&FALLBACK_LANGID); + Context { request, - langid : &DEFAULT_LANGID, + langid, theme : *DEFAULT_THEME, layout : "default", favicon : None, @@ -140,10 +154,10 @@ impl Context { // Context BUILDER ***************************************************************************** - /// Modifica el identificador de idioma del documento. + /// Modifica la fuente de idioma del documento. #[builder_fn] - pub fn with_langid(mut self, langid: &'static LanguageIdentifier) -> Self { - self.langid = langid; + pub fn with_langid(mut self, language: &impl LangId) -> Self { + self.langid = language.langid(); self } @@ -202,11 +216,6 @@ impl Context { self.request.as_ref() } - /// Devuelve el identificador de idioma asociado al documento. - pub fn langid(&self) -> &LanguageIdentifier { - self.langid - } - /// Devuelve el tema que se usará para renderizar el documento. pub fn theme(&self) -> ThemeRef { self.theme @@ -281,3 +290,21 @@ impl Context { } } } + +/// Permite a [`Context`](crate::html::Context) actuar como proveedor de idioma. +/// +/// Devuelve un [`LanguageIdentifier`] siguiendo este orden de prioridad: +/// +/// 1. Un idioma válido establecido explícitamente con [`Context::with_langid`]. +/// 2. El idioma por defecto configurado para la aplicación. +/// 3. Un idioma válido extraído de la cabecera `Accept-Language` del navegador. +/// 4. Y si ninguna de las opciones anteriores aplica, se usa el idioma de respaldo (`"en-US"`). +/// +/// Resulta útil para usar un contexto ([`Context`]) como fuente de traducción en +/// [`L10n::using`](crate::locale::L10n::using) o +/// [`L10n::to_markup`](crate::locale::L10n::to_markup). +impl LangId for Context { + fn langid(&self) -> &'static LanguageIdentifier { + self.langid + } +} diff --git a/src/html/opt_translated.rs b/src/html/opt_translated.rs index ba60a0f8..b15ea18a 100644 --- a/src/html/opt_translated.rs +++ b/src/html/opt_translated.rs @@ -1,5 +1,5 @@ use crate::html::Markup; -use crate::locale::{L10n, LanguageIdentifier}; +use crate::locale::{L10n, LangId}; use crate::{builder_fn, AutoDefault}; /// Cadena para traducir al renderizar ([`locale`](crate::locale)). @@ -16,18 +16,18 @@ use crate::{builder_fn, AutoDefault}; /// /// // Español disponible. /// assert_eq!( -/// hello.using(LangMatch::langid_or_default("es-ES")), +/// hello.using(&LangMatch::resolve("es-ES")), /// Some(String::from("¡Hola mundo!")) /// ); /// /// // Japonés no disponible, traduce al idioma de respaldo ("en-US"). /// assert_eq!( -/// hello.using(LangMatch::langid_or_fallback("ja-JP")), +/// hello.using(&LangMatch::resolve("ja-JP")), /// Some(String::from("Hello world!")) /// ); /// /// // Para incrustar en HTML escapado: -/// let markup = hello.escaped(LangMatch::langid_or_default("es-ES")); +/// let markup = hello.to_markup(&LangMatch::resolve("es-ES")); /// assert_eq!(markup.into_string(), "¡Hola mundo!"); /// ``` #[derive(AutoDefault, Clone, Debug)] @@ -50,16 +50,16 @@ impl OptionTranslated { // OptionTranslated GETTERS ******************************************************************** - /// Devuelve la traducción para `langid`, si existe. - pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { - self.0.using(langid) + /// Devuelve la traducción para `language`, si existe. + pub fn using(&self, language: &impl LangId) -> Option<String> { + self.0.using(language) } - /// Devuelve la traducción *escapada* como [`Markup`] para `langid`, si existe. + /// Devuelve la traducción *escapada* como [`Markup`] para `language`, si existe. /// /// Útil para incrustar el texto directamente en plantillas HTML sin riesgo de inyección de /// contenido. - pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { - self.0.escaped(langid) + pub fn to_markup(&self, language: &impl LangId) -> Markup { + self.0.to_markup(language) } } diff --git a/src/locale.rs b/src/locale.rs index 2a08ba6f..d81243e6 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -90,7 +90,7 @@ //! Y *voilà*, sólo queda operar con los idiomas soportados por `PageTop` usando [`LangMatch`] y //! traducir textos con [`L10n`]. -use crate::html::{Markup, PreEscaped, Render}; +use crate::html::{Markup, PreEscaped}; use crate::{global, hm, AutoDefault}; pub use fluent_templates; @@ -112,10 +112,10 @@ use std::fmt; static LANGUAGES: LazyLock<HashMap<&str, (LanguageIdentifier, &str)>> = LazyLock::new(|| { hm![ "en" => ( langid!("en-US"), "english" ), - "en-GB" => ( langid!("en-GB"), "english_british" ), - "en-US" => ( langid!("en-US"), "english_united_states" ), + "en-gb" => ( langid!("en-GB"), "english_british" ), + "en-us" => ( langid!("en-US"), "english_united_states" ), "es" => ( langid!("es-ES"), "spanish" ), - "es-ES" => ( langid!("es-ES"), "spanish_spain" ), + "es-es" => ( langid!("es-ES"), "spanish_spain" ), ] }); @@ -123,14 +123,23 @@ static LANGUAGES: LazyLock<HashMap<&str, (LanguageIdentifier, &str)>> = LazyLock // // Se usa cuando el valor del identificador de idioma en las traducciones no corresponde con ningún // idioma soportado por la aplicación. -static FALLBACK_LANGID: LazyLock<LanguageIdentifier> = LazyLock::new(|| langid!("en-US")); +pub(crate) static FALLBACK_LANGID: LazyLock<LanguageIdentifier> = + LazyLock::new(|| langid!("en-US")); // Identificador de idioma **por defecto** para la aplicación. // // Se resuelve a partir de [`global::SETTINGS.app.language`](global::SETTINGS). Si el identificador // de idioma no es válido o no está disponible entonces resuelve como [`FALLBACK_LANGID`]. -pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = - LazyLock::new(|| LangMatch::langid_or_fallback(&global::SETTINGS.app.language)); +pub(crate) static DEFAULT_LANGID: LazyLock<Option<&LanguageIdentifier>> = + LazyLock::new(|| LangMatch::resolve(&global::SETTINGS.app.language).as_option()); + +/// Representa la fuente de idioma (`LanguageIdentifier`) asociada a un recurso. +/// +/// Este *trait* permite que distintas estructuras expongan su fuente de idioma de forma uniforme. +pub trait LangId { + /// Devuelve el identificador de idioma asociado al recurso. + fn langid(&self) -> &'static LanguageIdentifier; +} /// Operaciones con los idiomas soportados por `PageTop`. /// @@ -144,11 +153,11 @@ pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = /// /// // Coincidencia exacta. /// let lang = LangMatch::resolve("es-ES"); -/// assert_eq!(lang.as_langid().to_string(), "es-ES"); +/// assert_eq!(lang.langid().to_string(), "es-ES"); /// /// // Coincidencia parcial (con el idioma base). /// let lang = LangMatch::resolve("es-EC"); -/// assert_eq!(lang.as_langid().to_string(), "es-ES"); // Porque "es-EC" no está soportado. +/// assert_eq!(lang.langid().to_string(), "es-ES"); // Porque "es-EC" no está soportado. /// /// // Idioma no especificado. /// let lang = LangMatch::resolve(""); @@ -159,21 +168,16 @@ pub(crate) static DEFAULT_LANGID: LazyLock<&LanguageIdentifier> = /// assert_eq!(lang, LangMatch::Unsupported(String::from("ja-JP"))); /// ``` /// -/// Las siguientes líneas devuelven siempre un [`LanguageIdentifier`] válido, ya sea porque -/// resuelven un idioma soportado o porque aplican el idioma por defecto o de respaldo: +/// Con la siguiente instrucción siempre se obtiene un [`LanguageIdentifier`] válido, ya sea porque +/// resuelve un idioma soportado o porque se aplica el idioma por defecto o, en último caso, el de +/// respaldo ("en-US"): /// /// ```rust /// use pagetop::prelude::*; /// -/// // Idioma por defecto si no resuelve. +/// // Idioma por defecto o de respaldo si no resuelve. /// let lang = LangMatch::resolve("it-IT"); -/// let langid = lang.as_langid(); -/// -/// // Idioma por defecto si no se encuentra. -/// let langid = LangMatch::langid_or_default("es-MX"); -/// -/// // Idioma de respaldo ("en-US") si no se encuentra. -/// let langid = LangMatch::langid_or_fallback("es-MX"); +/// let langid = lang.langid(); /// ``` #[derive(Clone, Debug, Eq, PartialEq)] pub enum LangMatch { @@ -187,6 +191,13 @@ pub enum LangMatch { Unsupported(String), } +impl Default for LangMatch { + /// Resuelve al idioma por defecto y, si no está disponible, al idioma de respaldo ("en-US"). + fn default() -> Self { + LangMatch::Found(DEFAULT_LANGID.unwrap_or(&FALLBACK_LANGID)) + } +} + impl LangMatch { /// Resuelve `language` y devuelve la variante [`LangMatch`] apropiada. pub fn resolve(language: impl AsRef<str>) -> Self { @@ -198,12 +209,13 @@ impl LangMatch { } // Intenta aplicar coincidencia exacta con el código completo (p.ej. "es-MX"). - if let Some(langid) = LANGUAGES.get(language).map(|(langid, _)| langid) { + let lang = language.to_ascii_lowercase(); + if let Some(langid) = LANGUAGES.get(lang.as_str()).map(|(langid, _)| langid) { return Self::Found(langid); } // Si la variante regional no existe, retrocede al idioma base (p.ej. "es"). - if let Some((base_lang, _)) = language.split_once('-') { + if let Some((base_lang, _)) = lang.split_once('-') { if let Some(langid) = LANGUAGES.get(base_lang).map(|(langid, _)| langid) { return Self::Found(langid); } @@ -213,37 +225,47 @@ impl LangMatch { Self::Unsupported(String::from(language)) } - /// Devuelve el idioma de la variante de la instancia, o el idioma por defecto si no está - /// soportado. + /// Devuelve el [`LanguageIdentifier`] si el idioma fue reconocido. /// - /// Siempre devuelve un [`LanguageIdentifier`] válido. + /// Solo retorna `Some` si la variante es [`LangMatch::Found`]. En cualquier otro caso (por + /// ejemplo, si el identificador es vacío o no está soportado), devuelve `None`. + /// + /// Este método es útil cuando se desea acceder directamente al idioma reconocido sin aplicar el + /// idioma por defecto ni el de respaldo. + /// + /// # Ejemplo + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let lang = LangMatch::resolve("es-ES").as_option(); + /// assert_eq!(lang.unwrap().to_string(), "es-ES"); + /// + /// let lang = LangMatch::resolve("jp-JP").as_option(); + /// assert!(lang.is_none()); + /// ``` #[inline] - pub fn as_langid(&self) -> &'static LanguageIdentifier { + pub fn as_option(&self) -> Option<&'static LanguageIdentifier> { + match self { + LangMatch::Found(l) => Some(l), + _ => None, + } + } +} + +/// Permite a [`LangMatch`] actuar como proveedor de idioma. +/// +/// Devuelve el [`LanguageIdentifier`] si la variante es [`LangMatch::Found`]; en caso contrario, +/// devuelve el idioma por defecto de la aplicación y, si tampoco está disponible, el idioma de +/// respaldo ("en-US"). +/// +/// Resulta útil para usar un valor de [`LangMatch`] como fuente de traducción en [`L10n::using`] o +/// [`L10n::to_markup`]. +impl LangId for LangMatch { + fn langid(&self) -> &'static LanguageIdentifier { match self { LangMatch::Found(l) => l, - _ => &DEFAULT_LANGID, - } - } - - /// Si `language` está vacío o no está soportado, devuelve el idioma por defecto. - /// - /// Siempre devuelve un [`LanguageIdentifier`] válido. - #[inline] - pub fn langid_or_default(language: impl AsRef<str>) -> &'static LanguageIdentifier { - match Self::resolve(language) { - Self::Found(l) => l, - _ => &DEFAULT_LANGID, - } - } - - /// Si `language` está vacío o no está soportado, devuelve el idioma de respaldo ("en-US"). - /// - /// Siempre devuelve un [`LanguageIdentifier`] válido. - #[inline] - pub fn langid_or_fallback(language: impl AsRef<str>) -> &'static LanguageIdentifier { - match Self::resolve(language) { - Self::Found(l) => l, - _ => &FALLBACK_LANGID, + _ => DEFAULT_LANGID.unwrap_or(&FALLBACK_LANGID), } } } @@ -297,7 +319,7 @@ enum L10nOp { /// Cada instancia puede representar: /// /// - Un texto puro (`n()`) que no requiere traducción. -/// - Una clave para traducir un texto de las traducciones por defecto de `PageTop` (`l()`). +/// - Una clave para traducir un texto de las traducciones predefinidas de `PageTop` (`l()`). /// - Una clave para traducir de un conjunto concreto de traducciones (`t()`). /// /// # Ejemplo @@ -319,8 +341,8 @@ enum L10nOp { /// También para traducciones a idiomas concretos. /// /// ```rust,ignore -/// // Traducción con clave, conjunto de traducciones e identificador de idioma a usar. -/// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(LangMatch::langid_or_default("it")); +/// // Traducción con clave, conjunto de traducciones y fuente de idioma. +/// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(&LangMatch::resolve("it")); /// ``` #[derive(AutoDefault, Clone)] pub struct L10n { @@ -339,8 +361,8 @@ impl L10n { } } - /// **l** = *“lookup”*. Crea una instancia para traducir usando una clave de la tabla de - /// traducciones por defecto. + /// **l** = *“lookup”*. Crea una instancia para traducir usando una clave del conjunto de + /// traducciones predefinidas. pub fn l(key: impl Into<String>) -> Self { L10n { op: L10nOp::Translate(key.into()), @@ -348,8 +370,8 @@ impl L10n { } } - /// **t** = *“translate”*. Crea una instancia para traducir usando una clave de una tabla de - /// traducciones específica. + /// **t** = *“translate”*. Crea una instancia para traducir usando una clave de un conjunto de + /// traducciones específico. pub fn t(key: impl Into<String>, locales: &'static Locales) -> Self { L10n { op: L10nOp::Translate(key.into()), @@ -377,20 +399,47 @@ impl L10n { self } - /// Resuelve la traducción usando el idioma por defecto de la aplicación. Devuelve `None` si no - /// aplica o no encuentra una traducción. + /// Resuelve la traducción usando el idioma por defecto o de respaldo de la aplicación. + /// + /// Devuelve `None` si no aplica o no encuentra una traducción válida. + /// + /// # Ejemplo + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let text = L10n::l("greeting").with_arg("name", "Manuel").get(); + /// ``` pub fn get(&self) -> Option<String> { - self.using(&DEFAULT_LANGID) + self.using(&LangMatch::default()) } - /// Resuelve la traducción usando el [`LanguageIdentifier`] indicado. Devuelve `None` si no - /// aplica o no encuentra una traducción. - pub fn using(&self, langid: &LanguageIdentifier) -> Option<String> { + /// Resuelve la traducción usando la fuente de idioma proporcionada. + /// + /// Devuelve `None` si no aplica o no encuentra una traducción válida. + /// + /// # Ejemplo + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// struct ResourceLang; + /// + /// impl LangId for ResourceLang { + /// fn langid(&self) -> &'static LanguageIdentifier { + /// LangMatch::resolve("es-MX").langid() + /// } + /// } + /// + /// let r = ResourceLang; + /// let text = L10n::l("greeting").with_arg("name", "Usuario").using(&r); + /// ``` + pub fn using(&self, language: &impl LangId) -> Option<String> { match &self.op { L10nOp::None => None, L10nOp::Text(text) => Some(text.to_owned()), L10nOp::Translate(key) => self.locales.try_lookup_with_args( - langid, + language.langid(), key, &self.args.iter().fold(HashMap::new(), |mut arg, (k, v)| { arg.insert(Cow::Owned(k.clone()), v.to_owned().into()); @@ -400,16 +449,19 @@ impl L10n { } } - /// Traduce y escapa con el [`LanguageIdentifier`] indicado, devolviendo [`Markup`]. - pub fn escaped(&self, langid: &LanguageIdentifier) -> Markup { - PreEscaped(self.using(langid).unwrap_or_default()) - } -} - -impl Render for L10n { - /// Traduce y escapa con el idioma por defecto, devolviendo [`Markup`]. - fn render(&self) -> Markup { - PreEscaped(self.get().unwrap_or_default()) + /// Traduce el texto y lo devuelve como [`Markup`] usando la fuente de idioma proporcionada. + /// + /// Si no se encuentra una traducción válida, devuelve una cadena vacía. + /// + /// # Ejemplo + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let html = L10n::l("welcome.message").to_markup(&LangMatch::resolve("es")); + /// ``` + pub fn to_markup(&self, language: &impl LangId) -> Markup { + PreEscaped(self.using(language).unwrap_or_default()) } } @@ -423,14 +475,3 @@ impl fmt::Debug for L10n { .finish() } } - -impl fmt::Display for L10n { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let content = match &self.op { - L10nOp::None => String::new(), - L10nOp::Text(text) => text.clone(), - L10nOp::Translate(key) => self.get().unwrap_or_else(|| format!("??<{}>", key)), - }; - write!(f, "{content}") - } -} diff --git a/src/response/page.rs b/src/response/page.rs index 0964509b..c1815d09 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -9,7 +9,7 @@ use crate::core::component::{Child, ChildOp, ComponentTrait}; use crate::core::theme::{ChildrenInRegions, ThemeRef, CONTENT_REGION_NAME}; use crate::html::{html, AssetsOp, Context, Markup, DOCTYPE}; use crate::html::{ClassesOp, OptionClasses, OptionId, OptionTranslated}; -use crate::locale::{CharacterDirection, L10n, LanguageIdentifier}; +use crate::locale::{CharacterDirection, L10n, LangId, LanguageIdentifier}; use crate::service::HttpRequest; /// Representa una página HTML completa lista para renderizar. @@ -78,10 +78,10 @@ impl Page { self } - /// Modifica el identificador de idioma de la página ([`Context::with_langid`]). + /// Modifica la fuente de idioma de la página ([`Context::with_langid`]). #[builder_fn] - pub fn with_langid(mut self, langid: &'static LanguageIdentifier) -> Self { - self.context.alter_langid(langid); + pub fn with_langid(mut self, language: &impl LangId) -> Self { + self.context.alter_langid(language); self } @@ -147,14 +147,14 @@ impl Page { // Page GETTERS ******************************************************************************** - /// Devuelve el título traducido para el idioma activo, si existe. + /// Devuelve el título traducido para el idioma de la página, si existe. pub fn title(&mut self) -> Option<String> { - self.title.using(self.context.langid()) + self.title.using(&self.context) } - /// Devuelve la descripción traducida para el idioma activo, si existe. + /// Devuelve la descripción traducida para el idioma de la página, si existe. pub fn description(&mut self) -> Option<String> { - self.description.using(self.context.langid()) + self.description.using(&self.context) } /// Devuelve la lista de metadatos `<meta name=...>`. diff --git a/tests/locale.rs b/tests/locale.rs index 420914d8..ef875d7d 100644 --- a/tests/locale.rs +++ b/tests/locale.rs @@ -13,7 +13,7 @@ async fn translation_without_args() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-world"); - let translation = l10n.using(LangMatch::langid_or_default("es-ES")); + let translation = l10n.using(&LangMatch::resolve("es-ES")); assert_eq!(translation, Some("¡Hola mundo!".to_string())); } @@ -22,7 +22,7 @@ async fn translation_with_args() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-user").with_arg("userName", "Manuel"); - let translation = l10n.using(LangMatch::langid_or_default("es-ES")); + let translation = l10n.using(&LangMatch::resolve("es-ES")); assert_eq!(translation, Some("¡Hola, Manuel!".to_string())); } @@ -35,7 +35,7 @@ async fn translation_with_plural_and_select() { ("photoCount", "3"), ("userGender", "male"), ]); - let translation = l10n.using(LangMatch::langid_or_default("es-ES")).unwrap(); + let translation = l10n.using(&LangMatch::resolve("es-ES")).unwrap(); assert!(translation.contains("añadido 3 nuevas fotos de él")); } @@ -44,7 +44,7 @@ async fn check_fallback_language() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-world"); - let translation = l10n.using(LangMatch::langid_or_fallback("xx-YY")); // Retrocede a "en-US". + let translation = l10n.using(&LangMatch::resolve("xx-YY")); // Retrocede a "en-US". assert_eq!(translation, Some("Hello world!".to_string())); } @@ -53,6 +53,6 @@ async fn check_unknown_key() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("non-existent-key"); - let translation = l10n.using(LangMatch::langid_or_default("en-US")); + let translation = l10n.using(&LangMatch::resolve("en-US")); assert_eq!(translation, None); } From f03f42f6d5d090e91ee0e470aa579920c515b0d3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Aug 2025 13:15:08 +0200 Subject: [PATCH 713/853] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20Simplifica=20no?= =?UTF-8?q?mbres=20de=20traits=20esenciales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Los traits `ExtensionTrait`, `ThemeTrait` y `ComponentTrait` pasan a ser `Extension`, `Theme`y `Component`, respectivamente, --- helpers/pagetop-build/src/lib.rs | 2 +- .../action/component/after_render_component.rs | 8 ++++---- .../component/before_render_component.rs | 8 ++++---- src/base/action/component/is_renderable.rs | 8 ++++---- src/base/action/page/after_render_body.rs | 2 +- src/base/action/page/before_render_body.rs | 2 +- .../action/theme/after_render_component.rs | 10 +++++----- .../action/theme/before_render_component.rs | 10 +++++----- src/base/action/theme/prepare_render.rs | 10 +++++----- src/base/component/html.rs | 2 +- src/base/extension/welcome.rs | 2 +- src/base/theme/basic.rs | 4 ++-- src/core/action.rs | 4 ++-- src/core/component.rs | 2 +- src/core/component/children.rs | 18 +++++++++--------- src/core/component/definition.rs | 4 ++-- src/core/extension.rs | 4 ++-- src/core/extension/definition.rs | 16 ++++++++-------- src/core/theme.rs | 9 ++++----- src/core/theme/definition.rs | 16 ++++++++-------- src/html/opt_component.rs | 8 ++++---- src/response/page.rs | 6 +++--- src/service.rs | 2 +- 23 files changed, 78 insertions(+), 79 deletions(-) diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index b0a13f33..b18cf52f 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -101,7 +101,7 @@ //! //! pub struct MyExtension; //! -//! impl ExtensionTrait for MyExtension { +//! impl Extension for MyExtension { //! // Servicio web que publica los recursos de `guides` en `/ruta/a/guides`. //! fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { //! include_files_service!(scfg, guides => "/ruta/a/guides"); diff --git a/src/base/action/component/after_render_component.rs b/src/base/action/component/after_render_component.rs index 48873f76..917f3225 100644 --- a/src/base/action/component/after_render_component.rs +++ b/src/base/action/component/after_render_component.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use crate::base::action::FnActionWithComponent; /// Ejecuta [`FnActionWithComponent`] después de renderizar un componente. -pub struct AfterRender<C: ComponentTrait> { +pub struct AfterRender<C: Component> { f: FnActionWithComponent<C>, referer_type_id: Option<UniqueId>, referer_id: OptionId, @@ -11,7 +11,7 @@ pub struct AfterRender<C: ComponentTrait> { } /// Filtro para despachar [`FnActionWithComponent`] después de renderizar un componente `C`. -impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> { +impl<C: Component> ActionDispatcher for AfterRender<C> { /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. fn referer_type_id(&self) -> Option<UniqueId> { self.referer_type_id @@ -28,8 +28,8 @@ impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> { } } -impl<C: ComponentTrait> AfterRender<C> { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`]. +impl<C: Component> AfterRender<C> { + /// Permite [registrar](Extension::actions) una nueva acción [`FnActionWithComponent`]. pub fn new(f: FnActionWithComponent<C>) -> Self { AfterRender { f, diff --git a/src/base/action/component/before_render_component.rs b/src/base/action/component/before_render_component.rs index 483b9160..8c2e38d7 100644 --- a/src/base/action/component/before_render_component.rs +++ b/src/base/action/component/before_render_component.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use crate::base::action::FnActionWithComponent; /// Ejecuta [`FnActionWithComponent`] antes de renderizar el componente. -pub struct BeforeRender<C: ComponentTrait> { +pub struct BeforeRender<C: Component> { f: FnActionWithComponent<C>, referer_type_id: Option<UniqueId>, referer_id: OptionId, @@ -11,7 +11,7 @@ pub struct BeforeRender<C: ComponentTrait> { } /// Filtro para despachar [`FnActionWithComponent`] antes de renderizar un componente `C`. -impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> { +impl<C: Component> ActionDispatcher for BeforeRender<C> { /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. fn referer_type_id(&self) -> Option<UniqueId> { self.referer_type_id @@ -28,8 +28,8 @@ impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> { } } -impl<C: ComponentTrait> BeforeRender<C> { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`]. +impl<C: Component> BeforeRender<C> { + /// Permite [registrar](Extension::actions) una nueva acción [`FnActionWithComponent`]. pub fn new(f: FnActionWithComponent<C>) -> Self { BeforeRender { f, diff --git a/src/base/action/component/is_renderable.rs b/src/base/action/component/is_renderable.rs index 3f0f1638..baa86f1d 100644 --- a/src/base/action/component/is_renderable.rs +++ b/src/base/action/component/is_renderable.rs @@ -8,7 +8,7 @@ use crate::prelude::*; pub type FnIsRenderable<C> = fn(component: &C, cx: &Context) -> bool; /// Con la función [`FnIsRenderable`] se puede decidir si se renderiza o no un componente. -pub struct IsRenderable<C: ComponentTrait> { +pub struct IsRenderable<C: Component> { f: FnIsRenderable<C>, referer_type_id: Option<UniqueId>, referer_id: OptionId, @@ -16,7 +16,7 @@ pub struct IsRenderable<C: ComponentTrait> { } /// Filtro para despachar [`FnIsRenderable`] para decidir si se renderiza o no un componente `C`. -impl<C: ComponentTrait> ActionDispatcher for IsRenderable<C> { +impl<C: Component> ActionDispatcher for IsRenderable<C> { /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. fn referer_type_id(&self) -> Option<UniqueId> { self.referer_type_id @@ -33,8 +33,8 @@ impl<C: ComponentTrait> ActionDispatcher for IsRenderable<C> { } } -impl<C: ComponentTrait> IsRenderable<C> { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnIsRenderable`]. +impl<C: Component> IsRenderable<C> { + /// Permite [registrar](Extension::actions) una nueva acción [`FnIsRenderable`]. pub fn new(f: FnIsRenderable<C>) -> Self { IsRenderable { f, diff --git a/src/base/action/page/after_render_body.rs b/src/base/action/page/after_render_body.rs index 081b9aa4..0bbfeaba 100644 --- a/src/base/action/page/after_render_body.rs +++ b/src/base/action/page/after_render_body.rs @@ -22,7 +22,7 @@ impl ActionDispatcher for AfterRenderBody { } impl AfterRenderBody { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción + /// Permite [registrar](Extension::actions) una nueva acción /// [`FnActionWithPage`](crate::base::action::page::FnActionWithPage). pub fn new(f: FnActionWithPage) -> Self { AfterRenderBody { f, weight: 0 } diff --git a/src/base/action/page/before_render_body.rs b/src/base/action/page/before_render_body.rs index a6e5c565..68f4af7d 100644 --- a/src/base/action/page/before_render_body.rs +++ b/src/base/action/page/before_render_body.rs @@ -22,7 +22,7 @@ impl ActionDispatcher for BeforeRenderBody { } impl BeforeRenderBody { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción + /// Permite [registrar](Extension::actions) una nueva acción /// [`FnActionWithPage`](crate::base::action::page::FnActionWithPage). pub fn new(f: FnActionWithPage) -> Self { BeforeRenderBody { f, weight: 0 } diff --git a/src/base/action/theme/after_render_component.rs b/src/base/action/theme/after_render_component.rs index d33e0d2d..d0beeb45 100644 --- a/src/base/action/theme/after_render_component.rs +++ b/src/base/action/theme/after_render_component.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use crate::base::action::FnActionWithComponent; /// Ejecuta [`FnActionWithComponent`] después de que un tema renderice el componente. -pub struct AfterRender<C: ComponentTrait> { +pub struct AfterRender<C: Component> { f: FnActionWithComponent<C>, theme_type_id: Option<UniqueId>, referer_type_id: Option<UniqueId>, @@ -11,7 +11,7 @@ pub struct AfterRender<C: ComponentTrait> { /// Filtro para despachar [`FnActionWithComponent`] después de que un tema renderice el componente /// `C`. -impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> { +impl<C: Component> ActionDispatcher for AfterRender<C> { /// Devuelve el identificador de tipo ([`UniqueId`]) del tema. fn theme_type_id(&self) -> Option<UniqueId> { self.theme_type_id @@ -23,9 +23,9 @@ impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> { } } -impl<C: ComponentTrait> AfterRender<C> { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`] para - /// un tema dado. +impl<C: Component> AfterRender<C> { + /// Permite [registrar](Extension::actions) una nueva acción [`FnActionWithComponent`] para un + /// tema dado. pub fn new(theme: ThemeRef, f: FnActionWithComponent<C>) -> Self { AfterRender { f, diff --git a/src/base/action/theme/before_render_component.rs b/src/base/action/theme/before_render_component.rs index 76f6cd22..ac5ee6b2 100644 --- a/src/base/action/theme/before_render_component.rs +++ b/src/base/action/theme/before_render_component.rs @@ -3,7 +3,7 @@ use crate::prelude::*; use crate::base::action::FnActionWithComponent; /// Ejecuta [`FnActionWithComponent`] antes de que un tema renderice el componente. -pub struct BeforeRender<C: ComponentTrait> { +pub struct BeforeRender<C: Component> { f: FnActionWithComponent<C>, theme_type_id: Option<UniqueId>, referer_type_id: Option<UniqueId>, @@ -11,7 +11,7 @@ pub struct BeforeRender<C: ComponentTrait> { /// Filtro para despachar [`FnActionWithComponent`] antes de que un tema renderice el componente /// `C`. -impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> { +impl<C: Component> ActionDispatcher for BeforeRender<C> { /// Devuelve el identificador de tipo ([`UniqueId`]) del tema. fn theme_type_id(&self) -> Option<UniqueId> { self.theme_type_id @@ -23,9 +23,9 @@ impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> { } } -impl<C: ComponentTrait> BeforeRender<C> { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnActionWithComponent`] para - /// un tema dado. +impl<C: Component> BeforeRender<C> { + /// Permite [registrar](Extension::actions) una nueva acción [`FnActionWithComponent`] para un + /// tema dado. pub fn new(theme: ThemeRef, f: FnActionWithComponent<C>) -> Self { BeforeRender { f, diff --git a/src/base/action/theme/prepare_render.rs b/src/base/action/theme/prepare_render.rs index 9d3e2612..4a1a2da6 100644 --- a/src/base/action/theme/prepare_render.rs +++ b/src/base/action/theme/prepare_render.rs @@ -11,14 +11,14 @@ pub type FnPrepareRender<C> = fn(component: &C, cx: &mut Context) -> PrepareMark /// Ejecuta [`FnPrepareRender`] para preparar el renderizado de un componente. /// /// Permite a un tema hacer una implementación nueva del renderizado de un componente. -pub struct PrepareRender<C: ComponentTrait> { +pub struct PrepareRender<C: Component> { f: FnPrepareRender<C>, theme_type_id: Option<UniqueId>, referer_type_id: Option<UniqueId>, } /// Filtro para despachar [`FnPrepareRender`] que modifica el renderizado de un componente `C`. -impl<C: ComponentTrait> ActionDispatcher for PrepareRender<C> { +impl<C: Component> ActionDispatcher for PrepareRender<C> { /// Devuelve el identificador de tipo ([`UniqueId`]) del tema. fn theme_type_id(&self) -> Option<UniqueId> { self.theme_type_id @@ -30,9 +30,9 @@ impl<C: ComponentTrait> ActionDispatcher for PrepareRender<C> { } } -impl<C: ComponentTrait> PrepareRender<C> { - /// Permite [registrar](ExtensionTrait::actions) una nueva acción [`FnPrepareRender`] para un - /// tema dado. +impl<C: Component> PrepareRender<C> { + /// Permite [registrar](Extension::actions) una nueva acción [`FnPrepareRender`] para un tema + /// dado. pub fn new(theme: ThemeRef, f: FnPrepareRender<C>) -> Self { PrepareRender { f, diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 228bfe86..1f49b052 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -38,7 +38,7 @@ impl Default for Html { Html::with(|_| html! {}) } } -impl ComponentTrait for Html { +impl Component for Html { fn new() -> Self { Html::default() } diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index 39edfd37..3dda43eb 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -7,7 +7,7 @@ use crate::prelude::*; /// funcionando correctamente. pub struct Welcome; -impl ExtensionTrait for Welcome { +impl Extension for Welcome { fn name(&self) -> L10n { L10n::l("welcome_extension_name") } diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 4ea24604..b02abfb5 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -5,13 +5,13 @@ use crate::prelude::*; /// Tema básico por defecto. pub struct Basic; -impl ExtensionTrait for Basic { +impl Extension for Basic { fn theme(&self) -> Option<ThemeRef> { Some(&Self) } } -impl ThemeTrait for Basic { +impl Theme for Basic { fn after_render_page_body(&self, page: &mut Page) { page.alter_assets(AssetsOp::AddStyleSheet( StyleSheet::from("/css/normalize.css") diff --git a/src/core/action.rs b/src/core/action.rs index f5dc11c5..91847b0c 100644 --- a/src/core/action.rs +++ b/src/core/action.rs @@ -25,7 +25,7 @@ pub use all::dispatch_actions; /// ```rust,ignore /// use pagetop::prelude::*; /// -/// impl ExtensionTrait for MyTheme { +/// impl Extension for MyTheme { /// fn actions(&self) -> Vec<ActionBox> { /// actions_boxed![ /// action::theme::BeforeRender::<Button>::new(&Self, before_render_button), @@ -34,7 +34,7 @@ pub use all::dispatch_actions; /// } /// } /// -/// impl ThemeTrait for MyTheme {} +/// impl Theme for MyTheme {} /// /// fn before_render_button(c: &mut Button, cx: &mut Context) { todo!() } /// fn render_error404(c: &Error404, cx: &mut Context) -> PrepareMarkup { todo!() } diff --git a/src/core/component.rs b/src/core/component.rs index 36c789a8..17b9b735 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -1,7 +1,7 @@ //! API para construir nuevos componentes. mod definition; -pub use definition::{ComponentRender, ComponentTrait}; +pub use definition::{Component, ComponentRender}; mod children; pub use children::Children; diff --git a/src/core/component/children.rs b/src/core/component/children.rs index c5b65a26..fb85db7a 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -1,4 +1,4 @@ -use crate::core::component::ComponentTrait; +use crate::core::component::Component; use crate::html::{html, Context, Markup}; use crate::{builder_fn, UniqueId}; @@ -9,14 +9,14 @@ use std::vec::IntoIter; /// Representa un componente encapsulado de forma segura y compartida. /// -/// Esta estructura permite manipular y renderizar cualquier tipo que implemente [`ComponentTrait`], +/// Esta estructura permite manipular y renderizar cualquier tipo que implemente [`Component`], /// garantizando acceso concurrente a través de [`Arc<RwLock<_>>`]. #[derive(Clone)] -pub struct Child(Arc<RwLock<dyn ComponentTrait>>); +pub struct Child(Arc<RwLock<dyn Component>>); impl Child { /// Crea un nuevo [`Child`] a partir de un componente. - pub fn with(component: impl ComponentTrait) -> Self { + pub fn with(component: impl Component) -> Self { Child(Arc::new(RwLock::new(component))) } @@ -47,15 +47,15 @@ impl Child { /// Variante tipada de [`Child`] para evitar conversiones durante el uso. /// /// Facilita el acceso a componentes del mismo tipo sin necesidad de hacer `downcast`. -pub struct Typed<C: ComponentTrait>(Arc<RwLock<C>>); +pub struct Typed<C: Component>(Arc<RwLock<C>>); -impl<C: ComponentTrait> Clone for Typed<C> { +impl<C: Component> Clone for Typed<C> { fn clone(&self) -> Self { Self(self.0.clone()) } } -impl<C: ComponentTrait> Typed<C> { +impl<C: Component> Typed<C> { /// Crea un nuevo [`Typed`] a partir de un componente. pub fn with(component: C) -> Self { Typed(Arc::new(RwLock::new(component))) @@ -97,7 +97,7 @@ pub enum ChildOp { } /// Operaciones con un componente hijo tipado [`Typed<C>`] en una lista [`Children`]. -pub enum TypedOp<C: ComponentTrait> { +pub enum TypedOp<C: Component> { Add(Typed<C>), InsertAfterId(&'static str, Typed<C>), InsertBeforeId(&'static str, Typed<C>), @@ -153,7 +153,7 @@ impl Children { /// Ejecuta una operación con [`TypedOp`] en la lista. #[builder_fn] - pub fn with_typed<C: ComponentTrait + Default>(mut self, op: TypedOp<C>) -> Self { + pub fn with_typed<C: Component + Default>(mut self, op: TypedOp<C>) -> Self { match op { TypedOp::Add(typed) => self.add(typed.into_child()), TypedOp::InsertAfterId(id, typed) => self.insert_after_id(id, typed.into_child()), diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index a9a4f815..e64e6160 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -5,7 +5,7 @@ use crate::html::{html, Context, Markup, PrepareMarkup, Render}; /// Define la función de renderizado para todos los componentes. /// /// Este *trait* se implementa automáticamente en cualquier tipo (componente) que implemente -/// [`ComponentTrait`], por lo que no requiere ninguna codificación manual. +/// [`Component`], por lo que no requiere ninguna codificación manual. pub trait ComponentRender { /// Renderiza el componente usando el contexto proporcionado. fn render(&mut self, cx: &mut Context) -> Markup; @@ -86,7 +86,7 @@ pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { /// 7. Despacha [`action::component::AfterRender<C>`](crate::base::action::component::AfterRender) /// para que otras extensiones puedan hacer sus últimos ajustes. /// 8. Finalmente devuelve un [`Markup`] del renderizado preparado en el paso 5. -impl<C: ComponentTrait> ComponentRender for C { +impl<C: Component> ComponentRender for C { fn render(&mut self, cx: &mut Context) -> Markup { // Si no es renderizable, devuelve un bloque HTML vacío. if !action::component::IsRenderable::dispatch(self, cx) { diff --git a/src/core/extension.rs b/src/core/extension.rs index c493cf5c..cabae5cd 100644 --- a/src/core/extension.rs +++ b/src/core/extension.rs @@ -1,9 +1,9 @@ //! API para añadir nuevas funcionalidades usando extensiones. //! //! Cada funcionalidad adicional que quiera incorporarse a una aplicación `PageTop` se debe modelar -//! como una **extensión**. Todas comparten la misma interfaz declarada en [`ExtensionTrait`]. +//! como una **extensión**. Todas comparten la misma interfaz declarada en [`Extension`]. mod definition; -pub use definition::{ExtensionRef, ExtensionTrait}; +pub use definition::{Extension, ExtensionRef}; pub(crate) mod all; diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 2d9f6dda..195e2e51 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -8,7 +8,7 @@ use crate::{actions_boxed, service}; /// /// Las extensiones se definen como instancias estáticas globales para poder acceder a ellas desde /// cualquier hilo de la ejecución sin necesidad de sincronización adicional. -pub type ExtensionRef = &'static dyn ExtensionTrait; +pub type ExtensionRef = &'static dyn Extension; /// Interfaz común que debe implementar cualquier extensión de `PageTop`. /// @@ -20,12 +20,12 @@ pub type ExtensionRef = &'static dyn ExtensionTrait; /// /// pub struct Blog; /// -/// impl ExtensionTrait for Blog { +/// impl Extension for Blog { /// fn name(&self) -> L10n { L10n::n("Blog") } /// fn description(&self) -> L10n { L10n::n("Sistema de blogs") } /// } /// ``` -pub trait ExtensionTrait: AnyInfo + Send + Sync { +pub trait Extension: AnyInfo + Send + Sync { /// Nombre legible para el usuario. /// /// Predeterminado por el [`short_name`](AnyInfo::short_name) del tipo asociado a la extensión. @@ -38,8 +38,8 @@ pub trait ExtensionTrait: AnyInfo + Send + Sync { L10n::default() } - /// Los temas son extensiones que implementan [`ExtensionTrait`] y también - /// [`ThemeTrait`](crate::core::theme::ThemeTrait). + /// Los temas son extensiones que implementan [`Extension`] y también + /// [`Theme`](crate::core::theme::Theme). /// /// Si la extensión no es un tema, este método devuelve `None` por defecto. /// @@ -51,13 +51,13 @@ pub trait ExtensionTrait: AnyInfo + Send + Sync { /// /// pub struct MyTheme; /// - /// impl ExtensionTrait for MyTheme { + /// impl Extension for MyTheme { /// fn theme(&self) -> Option<ThemeRef> { /// Some(&Self) /// } /// } /// - /// impl ThemeTrait for MyTheme {} + /// impl Theme for MyTheme {} /// ``` fn theme(&self) -> Option<ThemeRef> { None @@ -94,7 +94,7 @@ pub trait ExtensionTrait: AnyInfo + Send + Sync { /// /// pub struct ExtensionSample; /// - /// impl ExtensionTrait for ExtensionSample { + /// impl Extension for ExtensionSample { /// fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { /// scfg.route("/sample", web::get().to(route_sample)); /// } diff --git a/src/core/theme.rs b/src/core/theme.rs index 35d9887d..0a0f8199 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -9,13 +9,12 @@ //! tipografías, espaciados y cualquier otro detalle visual o de comportamiento (como animaciones, //! *scripts* de interfaz, etc.). //! -//! Es una extensión más (implementando [`ExtensionTrait`](crate::core::extension::ExtensionTrait)). -//! Se instala, activa y declara dependencias igual que el resto de extensiones; y se señala a sí -//! misma como tema (implementando [`theme()`](crate::core::extension::ExtensionTrait::theme) -//! y [`ThemeTrait`]). +//! Es una extensión más (implementando [`Extension`](crate::core::extension::Extension)). Se +//! instala, activa y declara dependencias igual que el resto de extensiones; y se señala a sí misma +//! como tema (implementando [`theme()`](crate::core::extension::Extension::theme) y [`Theme`]). mod definition; -pub use definition::{ThemeRef, ThemeTrait}; +pub use definition::{Theme, ThemeRef}; mod regions; pub(crate) use regions::ChildrenInRegions; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 075ce204..8de88bdd 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,4 +1,4 @@ -use crate::core::extension::ExtensionTrait; +use crate::core::extension::Extension; use crate::core::theme::CONTENT_REGION_NAME; use crate::global; use crate::html::{html, Markup}; @@ -8,20 +8,20 @@ use crate::response::page::Page; /// Representa una referencia a un tema. /// /// Los temas son también extensiones. Por tanto se deben definir igual, es decir, como instancias -/// estáticas globales que implementan [`ThemeTrait`], pero también [`ExtensionTrait`]. -pub type ThemeRef = &'static dyn ThemeTrait; +/// estáticas globales que implementan [`Theme`], pero también [`Extension`]. +pub type ThemeRef = &'static dyn Theme; /// Interfaz común que debe implementar cualquier tema de `PageTop`. /// -/// Un tema implementará [`ThemeTrait`] y los métodos que sean necesarios de [`ExtensionTrait`], -/// aunque el único obligatorio es [`theme()`](ExtensionTrait::theme). +/// Un tema implementará [`Theme`] y los métodos que sean necesarios de [`Extension`], aunque el +/// único obligatorio es [`theme()`](Extension::theme). /// /// ```rust /// use pagetop::prelude::*; /// /// pub struct MyTheme; /// -/// impl ExtensionTrait for MyTheme { +/// impl Extension for MyTheme { /// fn name(&self) -> L10n { L10n::n("My theme") } /// fn description(&self) -> L10n { L10n::n("Un tema personal") } /// @@ -30,9 +30,9 @@ pub type ThemeRef = &'static dyn ThemeTrait; /// } /// } /// -/// impl ThemeTrait for MyTheme {} +/// impl Theme for MyTheme {} /// ``` -pub trait ThemeTrait: ExtensionTrait + Send + Sync { +pub trait Theme: Extension + Send + Sync { fn regions(&self) -> Vec<(&'static str, L10n)> { vec![(CONTENT_REGION_NAME, L10n::l("content"))] } diff --git a/src/html/opt_component.rs b/src/html/opt_component.rs index 9e116cd2..39106d99 100644 --- a/src/html/opt_component.rs +++ b/src/html/opt_component.rs @@ -1,5 +1,5 @@ use crate::builder_fn; -use crate::core::component::{ComponentTrait, Typed}; +use crate::core::component::{Component, Typed}; use crate::html::{html, Context, Markup}; /// Contenedor de componente para incluir en otros componentes. @@ -16,15 +16,15 @@ use crate::html::{html, Context, Markup}; /// let opt = OptionComponent::new(comp); /// assert!(opt.get().is_some()); /// ``` -pub struct OptionComponent<C: ComponentTrait>(Option<Typed<C>>); +pub struct OptionComponent<C: Component>(Option<Typed<C>>); -impl<C: ComponentTrait> Default for OptionComponent<C> { +impl<C: Component> Default for OptionComponent<C> { fn default() -> Self { OptionComponent(None) } } -impl<C: ComponentTrait> OptionComponent<C> { +impl<C: Component> OptionComponent<C> { /// Crea un nuevo [`OptionComponent`]. /// /// El componente se envuelve automáticamente en un [`Typed`] y se almacena. diff --git a/src/response/page.rs b/src/response/page.rs index c1815d09..1b1c0de1 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -5,7 +5,7 @@ pub use actix_web::Result as ResultPage; use crate::base::action; use crate::builder_fn; -use crate::core::component::{Child, ChildOp, ComponentTrait}; +use crate::core::component::{Child, ChildOp, Component}; use crate::core::theme::{ChildrenInRegions, ThemeRef, CONTENT_REGION_NAME}; use crate::html::{html, AssetsOp, Context, Markup, DOCTYPE}; use crate::html::{ClassesOp, OptionClasses, OptionId, OptionTranslated}; @@ -121,7 +121,7 @@ impl Page { } /// Añade un componente a la región de contenido por defecto. - pub fn with_component(mut self, component: impl ComponentTrait) -> Self { + pub fn with_component(mut self, component: impl Component) -> Self { self.regions .alter_child_in_region(CONTENT_REGION_NAME, ChildOp::Add(Child::with(component))); self @@ -131,7 +131,7 @@ impl Page { pub fn with_component_in( mut self, region_name: &'static str, - component: impl ComponentTrait, + component: impl Component, ) -> Self { self.regions .alter_child_in_region(region_name, ChildOp::Add(Child::with(component))); diff --git a/src/service.rs b/src/service.rs index 68c8d5d1..261955cb 100644 --- a/src/service.rs +++ b/src/service.rs @@ -88,7 +88,7 @@ macro_rules! include_files { /// /// pub struct MyExtension; /// -/// impl ExtensionTrait for MyExtension { +/// impl Extension for MyExtension { /// fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { /// include_files_service!(scfg, assets => "/public"); /// } From dfd100c842c1e246e781a93954fc76d257b7a586 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Aug 2025 13:36:00 +0200 Subject: [PATCH 714/853] =?UTF-8?q?=F0=9F=92=A1=20Retoques=20menores=20en?= =?UTF-8?q?=20comentarios=20para=20documentar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 2 +- src/app.rs | 8 ++++---- src/base/component/html.rs | 10 +++++----- src/core/action.rs | 3 +-- src/core/component/definition.rs | 14 +++++++------- src/core/extension/definition.rs | 3 ++- src/core/theme/all.rs | 2 +- src/global.rs | 4 ++-- src/html/assets/favicon.rs | 4 ++-- src/html/assets/javascript.rs | 4 ++-- src/html/assets/stylesheet.rs | 4 ++-- src/html/context.rs | 6 +++--- src/locale.rs | 4 ++-- src/response/page.rs | 6 +++--- src/service.rs | 3 ++- 15 files changed, 39 insertions(+), 38 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 301f4831..b9be0bea 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -175,7 +175,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { // Genera el método alter_...() con el código del método with_...(). let fn_alter_doc = format!( - "Igual que [`{0}()`](Self::{0}), pero sin usar el patrón *builder*.", + "Igual que [`Self::{0}()`](Self::{0}), pero sin usar el patrón *builder*.", fn_with_name_str, ); let fn_alter = quote! { diff --git a/src/app.rs b/src/app.rs index 6b11c0fd..c3576fc5 100644 --- a/src/app.rs +++ b/src/app.rs @@ -16,10 +16,10 @@ use std::sync::LazyLock; /// Punto de entrada de una aplicación `PageTop`. /// -/// No almacena datos, pero **encapsula** el ciclo completo de configuración y puesta en marcha. -/// Para instanciarla se puede usar [`new`](Application::new) o [`prepare`](Application::prepare). -/// Después sólo hay que llamar a [`run`](Application::run) (o a [`test`](Application::test) si se -/// está preparando un entorno de pruebas). +/// No almacena datos, **encapsula** el inicio completo de configuración y puesta en marcha. Para +/// instanciarla se puede usar [`new()`](Application::new) o [`prepare()`](Application::prepare). +/// Después sólo hay que llamar a [`run()`](Application::run) para ejecutar la aplicación (o a +/// [`test()`](Application::test) si se está preparando un entorno de pruebas). pub struct Application; impl Default for Application { diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 1f49b052..8f273edb 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -51,9 +51,9 @@ impl Component for Html { impl Html { /// Crea una instancia que generará el `Markup`, con acceso opcional al contexto. /// - /// El método [`prepare_component`](crate::core::component::ComponentTrait::prepare_component) - /// delega el renderizado en la función proporcionada, que recibe una referencia mutable - /// al contexto de renderizado ([`Context`]). + /// El método [`prepare_component()`](crate::core::component::Component::prepare_component) + /// delega el renderizado en la función proporcionada, que recibe una referencia mutable al + /// contexto de renderizado ([`Context`]). pub fn with<F>(f: F) -> Self where F: Fn(&mut Context) -> Markup + Send + Sync + 'static, @@ -64,8 +64,8 @@ impl Html { /// Sustituye la función que genera el `Markup`. /// /// Permite a otras extensiones modificar la función de renderizado que se ejecutará cuando - /// [`prepare_component`](crate::core::component::ComponentTrait::prepare_component) invoque - /// esta instancia. La nueva función también recibe una referencia al contexto ([`Context`]). + /// [`prepare_component()`](crate::core::component::Component::prepare_component) invoque esta + /// instancia. La nueva función también recibe una referencia al contexto ([`Context`]). pub fn alter_html<F>(&mut self, f: F) -> &mut Self where F: Fn(&mut Context) -> Markup + Send + Sync + 'static, diff --git a/src/core/action.rs b/src/core/action.rs index 91847b0c..cbbe79c0 100644 --- a/src/core/action.rs +++ b/src/core/action.rs @@ -14,8 +14,7 @@ mod all; pub(crate) use all::add_action; pub use all::dispatch_actions; -/// Facilita la implementación del método -/// [`actions()`](crate::core::extension::ExtensionTrait::actions). +/// Facilita la implementación del método [`actions()`](crate::core::extension::Extension::actions). /// /// Evita escribir repetidamente `Box::new(...)` para cada acción de la lista, manteniendo el código /// más limpio. diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index e64e6160..2818570a 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -14,9 +14,9 @@ pub trait ComponentRender { /// Interfaz común que debe implementar un componente renderizable en `PageTop`. /// /// Se recomienda que los componentes deriven [`AutoDefault`](crate::AutoDefault). También deben -/// implementar explícitamente el método [`new`](Self::new) y pueden sobrescribir los otros métodos -/// para personalizar su comportamiento. -pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { +/// implementar explícitamente el método [`new()`](Self::new) y pueden sobrescribir los otros +/// métodos para personalizar su comportamiento. +pub trait Component: AnyInfo + ComponentRender + Send + Sync { /// Crea una nueva instancia del componente. fn new() -> Self where @@ -70,8 +70,8 @@ pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { /// /// 1. Despacha [`action::component::IsRenderable`](crate::base::action::component::IsRenderable) /// para ver si se puede renderizar. Si no es así, devuelve un [`Markup`] vacío. -/// 2. Ejecuta [`setup_before_prepare()`](ComponentTrait::setup_before_prepare) para que el -/// componente pueda ajustar su estructura interna o modificar el contexto. +/// 2. Ejecuta [`setup_before_prepare()`](Component::setup_before_prepare) para que el componente +/// pueda ajustar su estructura interna o modificar el contexto. /// 3. Despacha [`action::theme::BeforeRender<C>`](crate::base::action::theme::BeforeRender) para /// que el tema pueda hacer ajustes en el componente o el contexto. /// 4. Despacha [`action::component::BeforeRender<C>`](crate::base::action::component::BeforeRender) @@ -79,8 +79,8 @@ pub trait ComponentTrait: AnyInfo + ComponentRender + Send + Sync { /// 5. **Prepara el renderizado del componente**: /// - Despacha [`action::theme::PrepareRender<C>`](crate::base::action::theme::PrepareRender) /// para permitir al tema preparar un renderizado diferente al predefinido. -/// - Si no es así, ejecuta [`prepare_component()`](ComponentTrait::prepare_component) para -/// preparar el renderizado predefinido del componente. +/// - Si no es así, ejecuta [`prepare_component()`](Component::prepare_component) para preparar +/// el renderizado predefinido del componente. /// 6. Despacha [`action::theme::AfterRender<C>`](crate::base::action::theme::AfterRender) para /// que el tema pueda hacer sus últimos ajustes. /// 7. Despacha [`action::component::AfterRender<C>`](crate::base::action::component::AfterRender) diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 195e2e51..ac292592 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -28,7 +28,8 @@ pub type ExtensionRef = &'static dyn Extension; pub trait Extension: AnyInfo + Send + Sync { /// Nombre legible para el usuario. /// - /// Predeterminado por el [`short_name`](AnyInfo::short_name) del tipo asociado a la extensión. + /// Predeterminado por el [`short_name()`](AnyInfo::short_name) del tipo asociado a la + /// extensión. fn name(&self) -> L10n { L10n::n(self.short_name()) } diff --git a/src/core/theme/all.rs b/src/core/theme/all.rs index 787e0c9d..ebb28481 100644 --- a/src/core/theme/all.rs +++ b/src/core/theme/all.rs @@ -19,7 +19,7 @@ pub static DEFAULT_THEME: LazyLock<ThemeRef> = // TEMA POR NOMBRE ********************************************************************************* -/// Devuelve el tema identificado por su [`short_name`](AnyInfo::short_name). +// Devuelve el tema identificado por su [`short_name()`](AnyInfo::short_name). pub fn theme_by_short_name(short_name: &'static str) -> Option<ThemeRef> { let short_name = short_name.to_lowercase(); match THEMES diff --git a/src/global.rs b/src/global.rs index 25a17811..ea659b8b 100644 --- a/src/global.rs +++ b/src/global.rs @@ -53,8 +53,8 @@ pub struct App { /// Si no se especifica un valor válido, normalmente se usará el idioma devuelto por la /// implementación de [`LangId`](crate::locale::LangId) para [`Context`](crate::html::Context), /// en el siguiente orden: primero, el idioma establecido explícitamente con - /// [`Context::with_langid`](crate::html::Context::with_langid); si no se ha definido, se usará - /// el indicado en la cabecera `Accept-Language` del navegador; y, si ninguno aplica, se + /// [`Context::with_langid()`](crate::html::Context::with_langid); si no se ha definido, se + /// usará el indicado en la cabecera `Accept-Language` del navegador; y, si ninguno aplica, se /// empleará el idioma de respaldo ("en-US"). pub language: String, /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index d02794eb..2af01730 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -12,8 +12,8 @@ use crate::AutoDefault; /// /// > **Nota** /// > Los archivos de los iconos deben estar disponibles en el servidor web de la aplicación. Pueden -/// > incluirse en el proyecto utilizando [`include_files`](crate::include_files) y servirse con -/// > [`include_files_service`](crate::include_files_service). +/// > incluirse en el proyecto utilizando [`include_files!`](crate::include_files) y servirse con +/// > [`include_files_service!`](crate::include_files_service). /// /// # Ejemplo /// diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index 882b3aff..604e85ae 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -30,8 +30,8 @@ enum Source { /// /// > **Nota** /// > Los archivos de los *scripts* deben estar disponibles en el servidor web de la aplicación. -/// > Pueden incluirse en el proyecto utilizando [`include_files`](crate::include_files) y servirse -/// > con [`include_files_service`](crate::include_files_service). +/// > Pueden incluirse en el proyecto utilizando [`include_files!`](crate::include_files) y servirse +/// > con [`include_files_service!`](crate::include_files_service). /// /// # Ejemplo /// diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index dca5d869..72a79a10 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -55,8 +55,8 @@ impl TargetMedia { /// /// > **Nota** /// > Las hojas de estilo CSS deben estar disponibles en el servidor web de la aplicación. Pueden -/// > incluirse en el proyecto utilizando [`include_files`](crate::include_files) y servirse con -/// > [`include_files_service`](crate::include_files_service). +/// > incluirse en el proyecto utilizando [`include_files!`](crate::include_files) y servirse con +/// > [`include_files_service!`](crate::include_files_service). /// /// # Ejemplo /// diff --git a/src/html/context.rs b/src/html/context.rs index 8aaeb4af..5fbb39b5 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -163,7 +163,7 @@ impl Context { /// Modifica el tema que se usará para renderizar el documento. /// - /// Localiza el tema por su [`short_name`](crate::core::AnyInfo::short_name), y si no aplica + /// Localiza el tema por su [`short_name()`](crate::core::AnyInfo::short_name), y si no aplica /// ninguno entonces usará el tema por defecto. #[builder_fn] pub fn with_theme(mut self, theme_name: &'static str) -> Self { @@ -301,8 +301,8 @@ impl Context { /// 4. Y si ninguna de las opciones anteriores aplica, se usa el idioma de respaldo (`"en-US"`). /// /// Resulta útil para usar un contexto ([`Context`]) como fuente de traducción en -/// [`L10n::using`](crate::locale::L10n::using) o -/// [`L10n::to_markup`](crate::locale::L10n::to_markup). +/// [`L10n::using()`](crate::locale::L10n::using) o +/// [`L10n::to_markup()`](crate::locale::L10n::to_markup). impl LangId for Context { fn langid(&self) -> &'static LanguageIdentifier { self.langid diff --git a/src/locale.rs b/src/locale.rs index d81243e6..f23f51ee 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -259,8 +259,8 @@ impl LangMatch { /// devuelve el idioma por defecto de la aplicación y, si tampoco está disponible, el idioma de /// respaldo ("en-US"). /// -/// Resulta útil para usar un valor de [`LangMatch`] como fuente de traducción en [`L10n::using`] o -/// [`L10n::to_markup`]. +/// Resulta útil para usar un valor de [`LangMatch`] como fuente de traducción en [`L10n::using()`] +/// o [`L10n::to_markup()`]. impl LangId for LangMatch { fn langid(&self) -> &'static LanguageIdentifier { match self { diff --git a/src/response/page.rs b/src/response/page.rs index 1b1c0de1..44cab725 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -78,21 +78,21 @@ impl Page { self } - /// Modifica la fuente de idioma de la página ([`Context::with_langid`]). + /// Modifica la fuente de idioma de la página ([`Context::with_langid()`]). #[builder_fn] pub fn with_langid(mut self, language: &impl LangId) -> Self { self.context.alter_langid(language); self } - /// Modifica el tema que se usará para renderizar la página ([`Context::with_theme`]). + /// Modifica el tema que se usará para renderizar la página ([`Context::with_theme()`]). #[builder_fn] pub fn with_theme(mut self, theme_name: &'static str) -> Self { self.context.alter_theme(theme_name); self } - /// Modifica la composición para renderizar la página ([`Context::with_layout`]). + /// Modifica la composición para renderizar la página ([`Context::with_layout()`]). #[builder_fn] pub fn with_layout(mut self, layout_name: &'static str) -> Self { self.context.alter_layout(layout_name); diff --git a/src/service.rs b/src/service.rs index 261955cb..89ba4966 100644 --- a/src/service.rs +++ b/src/service.rs @@ -77,7 +77,8 @@ macro_rules! include_files { /// * `$route` – Ruta URL de origen desde la que se servirán los archivos. /// * `[ $root, $relative ]` *(opcional)* – Directorio raíz y ruta relativa para construir la ruta /// absoluta donde buscar los archivos en el sistema de ficheros (ver -/// [`absolute_dir`](crate::util::absolute_dir)). Si no existe, se usarán los recursos embebidos. +/// [`absolute_dir()`](crate::util::absolute_dir)). Si no existe, se usarán los recursos +/// embebidos. /// /// # Ejemplos /// From 867b307fc61746f512a9418a53da09a9eb7c2b80 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Aug 2025 14:17:22 +0200 Subject: [PATCH 715/853] =?UTF-8?q?=F0=9F=9A=A7=20(pagetop):=20Preparando?= =?UTF-8?q?=20liberaci=C3=B3n=20de=20la=20v0.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 34 ++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 64 +++++++++++++++++++++++++++++++++++++++++ examples/hello-name.rs | 24 ++++++++++++++++ examples/hello-world.rs | 20 +++++++++++++ 6 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 CREDITS.md create mode 100644 examples/hello-name.rs create mode 100644 examples/hello-world.rs diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 00000000..5e89b868 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,34 @@ +# 🔃 Dependencias + +`PageTop` está basado en [Rust](https://www.rust-lang.org/) y crece a hombros de gigantes +aprovechando algunas de las librerías más robustas y populares del [ecosistema Rust](https://lib.rs) +como son: + + * [Actix Web](https://actix.rs/) para los servicios web. + * [Config](https://docs.rs/config) para cargar y procesar las opciones de configuración. + * [Tracing](https://github.com/tokio-rs/tracing) para la gestión de trazas y registro de eventos + de la aplicación. + * [Fluent templates](https://github.com/XAMPPRocky/fluent-templates), que integra + [Fluent](https://projectfluent.org/) para internacionalizar las aplicaciones. + * Además de otros crates adicionales que se pueden explorar en los archivos `Cargo.toml` de + `PageTop` y sus extensiones. + + +# 🗚 FIGfonts + +`PageTop` usa el *crate* [figlet-rs](https://crates.io/crates/figlet-rs) desarrollado por +*yuanbohan* para mostrar un banner de presentación en el terminal con el nombre de la aplicación en +caracteres [FIGlet](http://www.figlet.org). Las fuentes incluidas en `pagetop/src/app` son: + + * [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) de *Glenn Chappell* + * [small.flf](http://www.figlet.org/fontdb_example.cgi?font=small.flf) de *Glenn Chappell* + (predeterminada) + * [speed.flf](http://www.figlet.org/fontdb_example.cgi?font=speed.flf) de *Claude Martins* + * [starwars.flf](http://www.figlet.org/fontdb_example.cgi?font=starwars.flf) de *Ryan Youck* + + +# 🎨 Icono + +"La Criatura" sonriente es una simpática creación de [Webalys](https://www.iconfinder.com/webalys). +Forma parte de su colección [Nasty Icons](https://www.iconfinder.com/iconsets/nasty), disponible en +[ICONFINDER](https://www.iconfinder.com). diff --git a/Cargo.lock b/Cargo.lock index 20087bf9..906b338c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1569,7 +1569,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.14" +version = "0.0.61" dependencies = [ "actix-files", "actix-session", diff --git a/Cargo.toml b/Cargo.toml index 476168dc..6844b7b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.14" +version = "0.0.61" edition = "2021" description = """\ diff --git a/README.md b/README.md index 6b4aff0c..2619cb66 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,25 @@ <p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +[![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) +[![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) +[![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) </div> `PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. +Ofrece un conjunto de herramientas que los desarrolladores pueden implementar, extender o adaptar +según las necesidades de cada proyecto, incluyendo: + + * **Acciones** (*actions*): alteran la lógica interna de una funcionalidad interceptando su flujo + de ejecución. + * **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales, + configurables y reutilizables. + * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las APIs + de `PageTop` o de terceros. + * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y + componentes sin comprometer su funcionalidad. # ⚡️ Guía rápida @@ -27,6 +41,55 @@ async fn main() -> std::io::Result<()> { } ``` +Sólo con esto, este código sirve por defecto una página web de bienvenida accesible desde un +navegador en la dirección `http://localhost:8080` con la configuración predeterminada. + +Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: + +```rust +use pagetop::prelude::*; + +struct HelloWorld; + +impl Extension for HelloWorld { + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/", service::web::get().to(hello_world)); + } +} + +async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Page::new(Some(request)) + .with_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + .render() +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&HelloWorld).run()?.await +} +``` + +Este programa implementa una extensión llamada `HelloWorld` que sirve una página web en la ruta raíz +(`/`) mostrando el texto "Hello world!" dentro de un elemento HTML `<h1>`. + + +# 📂 Repositorio + +El código se organiza en un *workspace* donde actualmente se incluyen los siguientes subproyectos: + + * **[pagetop](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/src)**, con el código + fuente de la librería principal. Reúne algunos de los *crates* más estables y populares del + ecosistema Rust para proporcionar APIs y recursos para la creación avanzada de soluciones web. + +## Auxiliares + + * **[pagetop-build](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-build)**, + permite incluir fácilmente archivos estáticos o archivos SCSS compilados directamente en el + binario de las aplicaciones `PageTop`. + + * **[pagetop-macros](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-macros)**, + proporciona una colección de macros que mejoran la experiencia de desarrollo con `PageTop`. + # 🧪 Pruebas @@ -37,6 +100,7 @@ Para simplificar el flujo de trabajo, el repositorio incluye varios **alias de C | ------- | ----------- | | `cargo ts` | Ejecuta los tests de `pagetop` (*unit + integration*) con la *feature* `testing`. | | `cargo ts --test util` | Lanza sólo las pruebas de integración del módulo `util`. | +| `cargo ts --doc locale` | Lanza las pruebas de la documentación del módulo `locale`. | | `cargo tw` | Ejecuta los tests de **todos los paquetes** del *workspace*. | > **Nota** diff --git a/examples/hello-name.rs b/examples/hello-name.rs new file mode 100644 index 00000000..7a6db545 --- /dev/null +++ b/examples/hello-name.rs @@ -0,0 +1,24 @@ +use pagetop::prelude::*; + +struct HelloName; + +impl Extension for HelloName { + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/hello/{name}", service::web::get().to(hello_name)); + } +} + +async fn hello_name( + request: HttpRequest, + path: service::web::Path<String>, +) -> ResultPage<Markup, ErrorPage> { + let name = path.into_inner(); + Page::new(Some(request)) + .with_component(Html::with(move |_| html! { h1 { "Hello " (name) "!" } })) + .render() +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&HelloName).run()?.await +} diff --git a/examples/hello-world.rs b/examples/hello-world.rs new file mode 100644 index 00000000..ba268dcd --- /dev/null +++ b/examples/hello-world.rs @@ -0,0 +1,20 @@ +use pagetop::prelude::*; + +struct HelloWorld; + +impl Extension for HelloWorld { + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/", service::web::get().to(hello_world)); + } +} + +async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Page::new(Some(request)) + .with_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + .render() +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&HelloWorld).run()?.await +} From bc1328546af7e37b54386836738509392ff33258 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 3 Aug 2025 18:00:02 +0200 Subject: [PATCH 716/853] =?UTF-8?q?=F0=9F=9A=A7=20Normaliza=20versiones=20?= =?UTF-8?q?a=20las=20=C3=BAltimas=20publicaciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revisa y completa la documentación general. --- Cargo.lock | 4 +-- Cargo.toml | 4 +-- README.md | 4 +-- helpers/pagetop-build/Cargo.toml | 8 ++--- helpers/pagetop-build/README.md | 3 ++ helpers/pagetop-build/src/lib.rs | 3 ++ helpers/pagetop-macros/Cargo.toml | 6 ++-- helpers/pagetop-macros/README.md | 3 ++ helpers/pagetop-macros/src/lib.rs | 3 ++ src/lib.rs | 56 ++++++++++++++++++++++++++++++- 10 files changed, 80 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 906b338c..7cba8b96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.0.1" +version = "0.0.16" dependencies = [ "grass", "static-files", @@ -1608,7 +1608,7 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.0.5" +version = "0.0.18" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", diff --git a/Cargo.toml b/Cargo.toml index 6844b7b7..a1a6bfc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,8 @@ name = "pagetop" version = "0.0.61" edition = "2021" -description = """\ - Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables.\ +description = """ + Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables. """ categories = ["web-programming", "gui", "development-tools", "asynchronous"] keywords = ["pagetop", "web", "framework", "frontend", "ssr"] diff --git a/README.md b/README.md index 2619cb66..e671b50b 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ async fn main() -> std::io::Result<()> { } ``` -Sólo con esto, este código sirve por defecto una página web de bienvenida accesible desde un -navegador en la dirección `http://localhost:8080` con la configuración predeterminada. +Este código arranca el servidor de `PageTop` que, con la configuración por defecto, muestra una +página de bienvenida accesible desde un navegador local en `http://localhost:8080`. Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 4b947b3e..c6d9d519 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "pagetop-build" -version = "0.0.1" +version = "0.0.16" edition = "2021" -description = """\ - Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el \ - binario de un proyecto PageTop.\ +description = """ + Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el + binario de un proyecto PageTop. """ categories = ["development-tools::build-utils", "web-programming"] keywords = ["pagetop", "build", "assets", "resources", "static"] diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md index 9f912e99..27c98147 100644 --- a/helpers/pagetop-build/README.md +++ b/helpers/pagetop-build/README.md @@ -5,6 +5,9 @@ <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +[![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) +[![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) +[![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) </div> diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index b18cf52f..90898dd3 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -5,6 +5,9 @@ //! <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> //! //! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) +//! [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) +//! [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) //! //! </div> //! diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 3a7fd950..27325b88 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "pagetop-macros" -version = "0.0.5" +version = "0.0.18" edition = "2021" -description = """\ - Una colección de macros que mejoran la experiencia de desarrollo con PageTop.\ +description = """ + Una colección de macros que mejoran la experiencia de desarrollo con PageTop. """ categories = ["development-tools::procedural-macro-helpers", "web-programming"] keywords = ["pagetop", "macros", "proc-macros", "codegen"] diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index e41dd0ec..826698ad 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -5,6 +5,9 @@ <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +[![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) +[![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) +[![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) </div> diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index b9be0bea..8a6b98b7 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -5,6 +5,9 @@ //! <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> //! //! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) +//! [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) +//! [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) //! //! </div> //! diff --git a/src/lib.rs b/src/lib.rs index 598c55e6..c0e28d45 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,13 +7,26 @@ //! <p>Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables.</p> //! //! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) +//! [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) +//! [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) //! //! <br> //! </div> //! //! `PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) //! para la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y -//! JavaScript. +//! JavaScript. Ofrece un conjunto de herramientas que los desarrolladores pueden implementar, +//! extender o adaptar según las necesidades de cada proyecto, incluyendo: +//! +//! * **Acciones** (*actions*): alteran la lógica interna de una funcionalidad interceptando su +//! flujo de ejecución. +//! * **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales, +//! configurables y reutilizables. +//! * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las +//! APIs de `PageTop` o de terceros. +//! * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y +//! componentes sin comprometer su funcionalidad. //! //! # ⚡️ Guía rápida //! @@ -27,6 +40,47 @@ //! Application::new().run()?.await //! } //! ``` +//! +//! Este código arranca el servidor de `PageTop` que, con la +//! [configuración por defecto](crate::global::SETTINGS), muestra una página de bienvenida accesible +//! desde un navegador local en `http://localhost:8080`. +//! +//! Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: +//! +//! ```rust,no_run +//! use pagetop::prelude::*; +//! +//! struct HelloWorld; +//! +//! impl Extension for HelloWorld { +//! fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { +//! scfg.route("/", service::web::get().to(hello_world)); +//! } +//! } +//! +//! async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { +//! Page::new(Some(request)) +//! .with_component(Html::with(move |_| html! { h1 { "Hello world!" } })) +//! .render() +//! } +//! +//! #[pagetop::main] +//! async fn main() -> std::io::Result<()> { +//! Application::prepare(&HelloWorld).run()?.await +//! } +//! ``` +//! +//! Este programa implementa una extensión llamada `HelloWorld` que sirve una página web en la ruta +//! raíz (`/`) mostrando el texto "Hello world!" dentro de un elemento HTML `<h1>`. +//! +//! # 🧩 Gestión de Dependencias +//! +//! Los proyectos que utilizan `PageTop` gestionan las dependencias con `cargo`, como cualquier otro +//! proyecto en Rust. +//! +//! Sin embargo, es fundamental que cada extensión declare explícitamente sus +//! [dependencias](core::extension::Extension::dependencies), si las tiene, para que `PageTop` pueda +//! estructurar e inicializar la aplicación de forma modular. #![cfg_attr(docsrs, feature(doc_cfg))] #![doc( From 11caad11afadd8f65ae35924ce2ecf38ea0bf4d6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 5 Aug 2025 18:49:04 +0200 Subject: [PATCH 717/853] =?UTF-8?q?=F0=9F=93=9D=20Retoques=20menores=20en?= =?UTF-8?q?=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 2 +- README.md | 4 ++-- src/lib.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 5e89b868..f5c1b0fa 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -10,7 +10,7 @@ como son: de la aplicación. * [Fluent templates](https://github.com/XAMPPRocky/fluent-templates), que integra [Fluent](https://projectfluent.org/) para internacionalizar las aplicaciones. - * Además de otros crates adicionales que se pueden explorar en los archivos `Cargo.toml` de + * Además de otros *crates* adicionales que se pueden explorar en los archivos `Cargo.toml` de `PageTop` y sus extensiones. diff --git a/README.md b/README.md index e671b50b..87f8b8da 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,8 @@ async fn main() -> std::io::Result<()> { } ``` -Este código arranca el servidor de `PageTop` que, con la configuración por defecto, muestra una -página de bienvenida accesible desde un navegador local en `http://localhost:8080`. +Este código arranca el servidor de `PageTop`. Con la configuración por defecto, muestra una página +de bienvenida accesible desde un navegador local en la dirección `http://localhost:8080`. Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: diff --git a/src/lib.rs b/src/lib.rs index c0e28d45..baa57a69 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -41,9 +41,9 @@ //! } //! ``` //! -//! Este código arranca el servidor de `PageTop` que, con la +//! Este código arranca el servidor de `PageTop`. Con la //! [configuración por defecto](crate::global::SETTINGS), muestra una página de bienvenida accesible -//! desde un navegador local en `http://localhost:8080`. +//! desde un navegador local en la dirección `http://localhost:8080`. //! //! Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: //! From 4ae919ccd78d8863e3fb29431a7ebf087ebc49be Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 5 Aug 2025 18:52:00 +0200 Subject: [PATCH 718/853] =?UTF-8?q?=F0=9F=9A=A8=20Aplica=20cambios=20por?= =?UTF-8?q?=20sugerencias=20de=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 7 +++---- helpers/pagetop-macros/src/maud/ast.rs | 3 +++ helpers/pagetop-macros/src/smart_default/body_impl.rs | 8 ++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 8a6b98b7..fedd682f 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -177,10 +177,9 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { let fn_with_attrs = &fn_with.attrs; // Genera el método alter_...() con el código del método with_...(). - let fn_alter_doc = format!( - "Igual que [`Self::{0}()`](Self::{0}), pero sin usar el patrón *builder*.", - fn_with_name_str, - ); + let fn_alter_doc = + format!("Igual que [`Self::{fn_with_name_str}()`], pero sin usar el patrón *builder*."); + let fn_alter = quote! { #[doc = #fn_alter_doc] pub fn #fn_alter_name #fn_generics(&mut self, #(#args),*) -> &mut Self #where_clause { diff --git a/helpers/pagetop-macros/src/maud/ast.rs b/helpers/pagetop-macros/src/maud/ast.rs index fd499ae2..ebd53318 100644 --- a/helpers/pagetop-macros/src/maud/ast.rs +++ b/helpers/pagetop-macros/src/maud/ast.rs @@ -44,6 +44,7 @@ impl<E: ToTokens> ToTokens for Markups<E> { } #[derive(Debug, Clone)] +#[allow(clippy::large_enum_variant)] pub enum Markup<E> { Block(Block<E>), Lit(HtmlLit), @@ -429,6 +430,7 @@ impl ToTokens for Attribute { } #[derive(Debug, Clone)] +#[allow(clippy::large_enum_variant)] pub enum HtmlNameOrMarkup { HtmlName(HtmlName), Markup(Markup<NoElement>), @@ -472,6 +474,7 @@ impl Display for HtmlNameOrMarkup { } #[derive(Debug, Clone)] +#[allow(clippy::large_enum_variant)] pub enum AttributeType { Normal { eq_token: Eq, diff --git a/helpers/pagetop-macros/src/smart_default/body_impl.rs b/helpers/pagetop-macros/src/smart_default/body_impl.rs index 6a76f904..f7d59bb5 100644 --- a/helpers/pagetop-macros/src/smart_default/body_impl.rs +++ b/helpers/pagetop-macros/src/smart_default/body_impl.rs @@ -19,7 +19,7 @@ pub fn impl_my_derive(input: &DeriveInput) -> Result<TokenStream, Error> { quote! { #name #body_assignment }, - format!("Returns a `{}` default.", name), + format!("Returns a `{name}` default."), ) } syn::Data::Enum(ref body) => { @@ -44,7 +44,7 @@ pub fn impl_my_derive(input: &DeriveInput) -> Result<TokenStream, Error> { quote! { #name :: #default_variant_name #body_assignment }, - format!("Returns a `{}::{}` default.", name, default_variant_name), + format!("Returns a `{name}::{default_variant_name}` default."), ) } syn::Data::Union(_) => { @@ -109,7 +109,7 @@ fn default_body_tt(body: &syn::Fields) -> Result<(TokenStream, String), Error> { .iter() .map(|field| { let (default_value, default_doc) = field_default_expr_and_doc(field)?; - write!(&mut doc, "{}, ", default_doc).unwrap(); + write!(&mut doc, "{default_doc}, ").unwrap(); Ok(default_value) }) .collect::<Result<Vec<TokenStream>, Error>>()?; @@ -145,7 +145,7 @@ fn field_default_expr_and_doc(field: &syn::Field) -> Result<(TokenStream, String ConversionStrategy::Into => quote!((#field_value).into()), }; - let field_doc = format!("{}", field_value); + let field_doc = format!("{field_value}"); Ok((field_value, field_doc)) } else { Ok(( From b01b12f47245aacbcc9da90b126e268f0976b86e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 5 Aug 2025 18:53:01 +0200 Subject: [PATCH 719/853] =?UTF-8?q?=F0=9F=94=A8=20(devops):=20Scripts=20pa?= =?UTF-8?q?ra=20la=20publicaci=C3=B3n=20de=20crates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cargo/cliff.toml | 67 +++++++++++++++++++++++++++++ .cargo/release.toml | 45 ++++++++++++++++++++ tools/changelog.sh | 101 ++++++++++++++++++++++++++++++++++++++++++++ tools/release.sh | 48 +++++++++++++++++++++ 4 files changed, 261 insertions(+) create mode 100644 .cargo/cliff.toml create mode 100644 .cargo/release.toml create mode 100755 tools/changelog.sh create mode 100755 tools/release.sh diff --git a/.cargo/cliff.toml b/.cargo/cliff.toml new file mode 100644 index 00000000..ff362c46 --- /dev/null +++ b/.cargo/cliff.toml @@ -0,0 +1,67 @@ +# cliff.toml + +[changelog] +header = """ +# CHANGELOG + +Este archivo documenta los cambios más relevantes realizados en cada versión. El formato está basado +en [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/), y las versiones se numeran siguiendo +las reglas del [Versionado Semántico](https://semver.org/lang/es/). + +Resume la evolución del proyecto para usuarios y colaboradores, destacando nuevas funcionalidades, +correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o +internos pueden omitirse si no afectan al uso del proyecto. +""" +trim = true +render_always = true + +body = """ +{% if version %} +## {{ version | trim_start_matches(pat="v") }} ({{ timestamp | date(format="%Y-%m-%d") }}) +{% else %} +## Pendiente de publicación +{% endif %}\ +{% set base = "https://git.cillero.es/manuelcillero/pagetop" %}\ +{% for group, commits in commits | group_by(attribute="group") %} +### {{ group | upper_first }} +{% for commit in commits %} +{%- set msg = commit.message + | split(pat="\n") + | first + | replace(from="✨ ", to="") + | replace(from="🐛 ", to="") + | replace(from="⬆️ ", to="") + | replace(from="🚧 ", to="") + | replace(from="♻️ ", to="") + | replace(from="✏️ ", to="") + | replace(from="🏷️ ", to="") + | replace(from="🧑‍💻 ", to="") + | replace(from="🍱 ", to="") + | replace(from="📝 ", to="") + | replace(from="💡 ", to="") +-%} +{% set sha7 = commit.id | truncate(length=7, end="") %} +- {{ msg | trim }} ([{{ sha7 }}]({{ base }}/commit/{{ commit.id }}){% if commit.author.name != "Manuel Cillero" %} - {{ commit.author.name }}{% endif %}) +{% endfor %}{% endfor %} +""" + +[git] +conventional_commits = false +filter_unconventional = false +topo_order_commits = true +sort_commits = "oldest" + +commit_parsers = [ + { message = "^✨", group = "Añadido" }, + { message = "^🐛", group = "Corregido" }, + { message = "^🚧", group = "Cambiado" }, + { message = "^♻️", group = "Cambiado" }, + { message = "^✏️", group = "Cambiado" }, + { message = "^🏷️", group = "Cambiado" }, + { message = "^🧑‍💻", group = "Cambiado" }, + { message = "^🍱", group = "Cambiado" }, + { message = "^⬆️", group = "Dependencias" }, + { message = "^📝", group = "Documentado" }, + { message = "^💡", group = "Documentado" }, + { message = "^.*", group = "Otros cambios" }, +] diff --git a/.cargo/release.toml b/.cargo/release.toml new file mode 100644 index 00000000..9c073794 --- /dev/null +++ b/.cargo/release.toml @@ -0,0 +1,45 @@ +# release.toml + +# Etiqueta por crate: `pagetop-macros-v0.2.0` +tag-prefix = "{{crate_name}}-v" + +# Confirmaciones firmadas (no requeridas) +sign-commit = false +sign-tag = false + +# Empuja etiquetas y commits +push = true + +# Publica en crates.io (puedes desactivarlo para pruebas) +publish = true + +# Actualiza todos los dependientes internos +update-dependencies = true + +# Solo permite publicar estos crates (los que forman parte del workspace) +allow-branch = ["main"] +consolidate-commits = false +consolidate-pushes = true + +# Mensaje personalizado para el commit de versión +pre-release-commit-message = "🔖 Prepara publicación de {{crate_name}} {{version}}" + +[workspace] +# Lista de crates que se pueden publicar dentro del workspace +# Puedes añadir extensiones más adelante +allow-publish = [ + "pagetop", + "pagetop-build", + "pagetop-macros" +] + +# Opcional: ordena la publicación de dependencias internas +publish-order = [ + "pagetop-build", + "pagetop-macros", + "pagetop" +] + +pre-release-hook = [ + "./tools/changelog.sh", "{{crate_name}}", "{{version}}", "--stage" +] diff --git a/tools/changelog.sh b/tools/changelog.sh new file mode 100755 index 00000000..19cbed9e --- /dev/null +++ b/tools/changelog.sh @@ -0,0 +1,101 @@ +#!/bin/bash +set -euo pipefail + +# ------------------------------------------------------------------------------ +# Script para generar el archivo de cambios del crate indicado. +# Uso: +# ./tools/changelog.sh <crate> <version> [--stage] +# Ejemplo: +# ./tools/changelog.sh pagetop-macros 0.1.0 # Sólo genera archivo +# ./tools/changelog.sh pagetop 0.1.0 --stage # Prepara archivo para commit +# ------------------------------------------------------------------------------ + +# Configuración +CRATE="${1:-}" +VERSION="${2:-}" +STAGE="${3:-}" +CLIFF_CONFIG=".cargo/cliff.toml" + +# Comprobaciones +if [[ -z "$CRATE" || -z "$VERSION" ]]; then + echo "Usage: $0 <crate> <version> [--stage]" >&2 + exit 1 +fi + +# Dependencias +command -v git-cliff >/dev/null || { + echo "Error: git-cliff is not installed. Use: cargo install git-cliff" + exit 1 +} + +# Cambia al directorio del espacio +cd "$(dirname "$0")/.." || exit 1 + +# ------------------------------------------------------------------------------ +# Determina ruta del archivo y ámbito de los archivos afectados para el crate +# ------------------------------------------------------------------------------ +case "$CRATE" in + pagetop) + CHANGELOG_FILE="CHANGELOG.md" + PATH_FLAGS=( + --exclude-path "helpers/pagetop-macros/**/*" + --exclude-path "helpers/pagetop-build/**/*" + ) + ;; + pagetop-macros) + CHANGELOG_FILE="helpers/pagetop-macros/CHANGELOG.md" + PATH_FLAGS=(--include-path "helpers/pagetop-macros/**/*") + ;; + pagetop-build) + CHANGELOG_FILE="helpers/pagetop-build/CHANGELOG.md" + PATH_FLAGS=(--include-path "helpers/pagetop-build/**/*") + ;; + *) + echo "Error: unsupported crate '$CRATE'" >&2 + exit 1 + ;; +esac + +# ------------------------------------------------------------------------------ +# Obtiene la última etiqueta del crate +# ------------------------------------------------------------------------------ +LAST_TAG="$(git tag --list "${CRATE}-v*" --sort=-v:refname | head -n 1)" + +if [[ -n "$LAST_TAG" ]]; then + echo "Generating CHANGELOG for '$CRATE' from last tag '$LAST_TAG'" + CLIFF_ARGS=(--unreleased --tag "$VERSION") +else + echo "Generating initial CHANGELOG for '$CRATE'" + CLIFF_ARGS=(--tag "$VERSION") +fi + +# ------------------------------------------------------------------------------ +# Genera el CHANGELOG para el crate correspondiente +# ------------------------------------------------------------------------------ +git-cliff --config "$CLIFF_CONFIG" "${PATH_FLAGS[@]}" "${CLIFF_ARGS[@]}" -o "$CHANGELOG_FILE" -u +echo "CHANGELOG generated at '$CHANGELOG_FILE'" + +# Pregunta por la revisión del archivo de cambios generado +read -p "Do you want to review the changelog before continuing? (y/n) " -n 1 -r || exit 1 +echo +if [[ "$REPLY" =~ ^[Yy]$ ]]; then + ${EDITOR:-nano} "$CHANGELOG_FILE" +fi +read -p "Do you want to proceed with the release of $CRATE? (y/n) " -n 1 -r || exit 1 +echo +if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then + echo "Aborting release process." >&2 + exit 1 +fi + +# Si hay cambios y procede, añade al stage (cargo-release hará el commit) +if ! git diff --quiet -- "$CHANGELOG_FILE"; then + if [[ "$STAGE" == "--stage" ]]; then + git add "$CHANGELOG_FILE" + echo "Staged $CHANGELOG_FILE for commit" + else + echo "Changes detected in '$CHANGELOG_FILE', but not staged (no --stage flag)" + fi +else + echo "No changes in '$CHANGELOG_FILE', skipping staging" +fi diff --git a/tools/release.sh b/tools/release.sh new file mode 100755 index 00000000..f62993aa --- /dev/null +++ b/tools/release.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -euo pipefail + +# ------------------------------------------------------------------------------ +# Script para publicar un crate individual del workspace con cargo-release. +# Uso: +# ./tools/release.sh <crate> [patch|minor|major] [--execute] +# Ejemplos: +# ./tools/release.sh pagetop-macros patch # Dry run (por defecto) +# ./tools/release.sh pagetop minor --execute # Publicación real +# ------------------------------------------------------------------------------ + +# Configuración +CRATE="${1:-}" +LEVEL="${2:-patch}" +EXECUTE="${3:-}" +CONFIG=".cargo/release.toml" + +# Comprobaciones +if [[ -z "$CRATE" ]]; then + echo "Usage: $0 <crate> [patch|minor|major] [--execute]" + exit 1 +fi +if [[ ! "$LEVEL" =~ ^(patch|minor|major)$ ]]; then + echo "Error: invalid level '$LEVEL'. Use: patch, minor, or major" + exit 1 +fi + +# Dependencias +command -v cargo-release >/dev/null || { + echo "Error: cargo-release is not installed. Use: cargo install cargo-release" + exit 1 +} + +# Cambia al directorio del espacio +cd "$(dirname "$0")/.." || exit 1 + +# ------------------------------------------------------------------------------ +# DRY-RUN (por defecto) o ejecución real con --execute +# ------------------------------------------------------------------------------ +if [[ "$EXECUTE" != "--execute" ]]; then + echo "Running dry-run (default mode). Add --execute to publish" + CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" --dry-run +else + echo "Releasing $CRATE ($LEVEL)…" + CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" --execute + echo "Release completed." +fi From 5c0c3090b136484ba9a1672c38013da2488335b9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 5 Aug 2025 18:53:21 +0200 Subject: [PATCH 720/853] =?UTF-8?q?=F0=9F=93=84=20Cada=20crate=20con=20su?= =?UTF-8?q?=20licencia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-build/LICENSE-APACHE | 201 ++++++++++++++++++++++++++ helpers/pagetop-build/LICENSE-MIT | 21 +++ helpers/pagetop-macros/LICENSE-APACHE | 201 ++++++++++++++++++++++++++ helpers/pagetop-macros/LICENSE-MIT | 21 +++ 4 files changed, 444 insertions(+) create mode 100644 helpers/pagetop-build/LICENSE-APACHE create mode 100644 helpers/pagetop-build/LICENSE-MIT create mode 100644 helpers/pagetop-macros/LICENSE-APACHE create mode 100644 helpers/pagetop-macros/LICENSE-MIT diff --git a/helpers/pagetop-build/LICENSE-APACHE b/helpers/pagetop-build/LICENSE-APACHE new file mode 100644 index 00000000..263ddac1 --- /dev/null +++ b/helpers/pagetop-build/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/helpers/pagetop-build/LICENSE-MIT b/helpers/pagetop-build/LICENSE-MIT new file mode 100644 index 00000000..cd8af3d6 --- /dev/null +++ b/helpers/pagetop-build/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Manuel Cillero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/helpers/pagetop-macros/LICENSE-APACHE b/helpers/pagetop-macros/LICENSE-APACHE new file mode 100644 index 00000000..263ddac1 --- /dev/null +++ b/helpers/pagetop-macros/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/helpers/pagetop-macros/LICENSE-MIT b/helpers/pagetop-macros/LICENSE-MIT new file mode 100644 index 00000000..cd8af3d6 --- /dev/null +++ b/helpers/pagetop-macros/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Manuel Cillero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file From 4928b0f7a6a8bd1978dca03346deb39a2d1085c7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 5 Aug 2025 19:02:33 +0200 Subject: [PATCH 721/853] =?UTF-8?q?=F0=9F=A9=B9=20El=20modo=20dry-run=20se?= =?UTF-8?q?=20ejecuta=20por=20defecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/release.sh b/tools/release.sh index f62993aa..082869f5 100755 --- a/tools/release.sh +++ b/tools/release.sh @@ -40,7 +40,7 @@ cd "$(dirname "$0")/.." || exit 1 # ------------------------------------------------------------------------------ if [[ "$EXECUTE" != "--execute" ]]; then echo "Running dry-run (default mode). Add --execute to publish" - CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" --dry-run + CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" else echo "Releasing $CRATE ($LEVEL)…" CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" --execute From b03cd746c0c4cf95b160c55158c2f4ff39404f51 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 5 Aug 2025 23:11:21 +0200 Subject: [PATCH 722/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7cba8b96..1d32d893 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.0.16" +version = "0.1.0" dependencies = [ "grass", "static-files", diff --git a/Cargo.toml b/Cargo.toml index a1a6bfc7..dcf191d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,5 +71,5 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] static-files = "0.2.5" -pagetop-build = { version = "0.0", path = "helpers/pagetop-build" } +pagetop-build = { version = "0.1", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index c6d9d519..7bf60489 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.0.16" +version = "0.1.0" edition = "2021" description = """ From c8976edca45ed97f4e5bc13dc171d55f639ebbd8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 01:54:47 +0200 Subject: [PATCH 723/853] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20edici=C3=B3n?= =?UTF-8?q?=20de=20CHANGELOG=20y=20nuevas=20versiones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cargo/release.toml | 22 +-------------------- tools/changelog.sh | 47 +++++++++++++++++++++++---------------------- tools/release.sh | 4 ++-- 3 files changed, 27 insertions(+), 46 deletions(-) diff --git a/.cargo/release.toml b/.cargo/release.toml index 9c073794..b0ab9389 100644 --- a/.cargo/release.toml +++ b/.cargo/release.toml @@ -13,33 +13,13 @@ push = true # Publica en crates.io (puedes desactivarlo para pruebas) publish = true -# Actualiza todos los dependientes internos -update-dependencies = true - # Solo permite publicar estos crates (los que forman parte del workspace) allow-branch = ["main"] consolidate-commits = false -consolidate-pushes = true # Mensaje personalizado para el commit de versión pre-release-commit-message = "🔖 Prepara publicación de {{crate_name}} {{version}}" -[workspace] -# Lista de crates que se pueden publicar dentro del workspace -# Puedes añadir extensiones más adelante -allow-publish = [ - "pagetop", - "pagetop-build", - "pagetop-macros" -] - -# Opcional: ordena la publicación de dependencias internas -publish-order = [ - "pagetop-build", - "pagetop-macros", - "pagetop" -] - pre-release-hook = [ - "./tools/changelog.sh", "{{crate_name}}", "{{version}}", "--stage" + "sh", "-c", "ROOT=$(git rev-parse --show-toplevel) && \"$ROOT/tools/changelog.sh\" {{crate_name}} {{version}} --stage" ] diff --git a/tools/changelog.sh b/tools/changelog.sh index 19cbed9e..59f04693 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -35,20 +35,20 @@ cd "$(dirname "$0")/.." || exit 1 # Determina ruta del archivo y ámbito de los archivos afectados para el crate # ------------------------------------------------------------------------------ case "$CRATE" in - pagetop) - CHANGELOG_FILE="CHANGELOG.md" - PATH_FLAGS=( - --exclude-path "helpers/pagetop-macros/**/*" - --exclude-path "helpers/pagetop-build/**/*" - ) + pagetop-build) + CHANGELOG_FILE="helpers/pagetop-build/CHANGELOG.md" + PATH_FLAGS=(--include-path "helpers/pagetop-build/**/*") ;; pagetop-macros) CHANGELOG_FILE="helpers/pagetop-macros/CHANGELOG.md" PATH_FLAGS=(--include-path "helpers/pagetop-macros/**/*") ;; - pagetop-build) - CHANGELOG_FILE="helpers/pagetop-build/CHANGELOG.md" - PATH_FLAGS=(--include-path "helpers/pagetop-build/**/*") + pagetop) + CHANGELOG_FILE="CHANGELOG.md" + PATH_FLAGS=( + --exclude-path "helpers/pagetop-build/**/*" + --exclude-path "helpers/pagetop-macros/**/*" + ) ;; *) echo "Error: unsupported crate '$CRATE'" >&2 @@ -56,23 +56,24 @@ case "$CRATE" in ;; esac -# ------------------------------------------------------------------------------ -# Obtiene la última etiqueta del crate -# ------------------------------------------------------------------------------ -LAST_TAG="$(git tag --list "${CRATE}-v*" --sort=-v:refname | head -n 1)" - -if [[ -n "$LAST_TAG" ]]; then - echo "Generating CHANGELOG for '$CRATE' from last tag '$LAST_TAG'" - CLIFF_ARGS=(--unreleased --tag "$VERSION") -else - echo "Generating initial CHANGELOG for '$CRATE'" - CLIFF_ARGS=(--tag "$VERSION") -fi - # ------------------------------------------------------------------------------ # Genera el CHANGELOG para el crate correspondiente # ------------------------------------------------------------------------------ -git-cliff --config "$CLIFF_CONFIG" "${PATH_FLAGS[@]}" "${CLIFF_ARGS[@]}" -o "$CHANGELOG_FILE" -u +COMMON_ARGS=( + --config "$CLIFF_CONFIG" + "${PATH_FLAGS[@]}" + --tag-pattern "^${CRATE}-v" + --tag "$VERSION" + -o "$CHANGELOG_FILE" +) +LAST_TAG="$(git tag --list "${CRATE}-v*" --sort=-v:refname | head -n 1)" +if [[ -n "$LAST_TAG" ]]; then + echo "Generating CHANGELOG for '$CRATE' from tag '$LAST_TAG'" + git-cliff --unreleased "${COMMON_ARGS[@]}" +else + echo "Generating initial CHANGELOG for '$CRATE'" + git-cliff "${COMMON_ARGS[@]}" +fi echo "CHANGELOG generated at '$CHANGELOG_FILE'" # Pregunta por la revisión del archivo de cambios generado diff --git a/tools/release.sh b/tools/release.sh index 082869f5..bb092416 100755 --- a/tools/release.sh +++ b/tools/release.sh @@ -40,9 +40,9 @@ cd "$(dirname "$0")/.." || exit 1 # ------------------------------------------------------------------------------ if [[ "$EXECUTE" != "--execute" ]]; then echo "Running dry-run (default mode). Add --execute to publish" - CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" + cargo release --config "$CONFIG" --package "$CRATE" "$LEVEL" else echo "Releasing $CRATE ($LEVEL)…" - CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" --execute + cargo release --config "$CONFIG" --package "$CRATE" "$LEVEL" --execute echo "Release completed." fi From 49f5de9498ae1bd758767638637ca7fb7c521d49 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:01:32 +0200 Subject: [PATCH 724/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d32d893..6b894b5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" dependencies = [ "grass", "static-files", diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 7bf60489..4769631b 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" edition = "2021" description = """ From 9aa8e05ed0108fc0b203d23c0b336cf51c2522f6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:07:01 +0200 Subject: [PATCH 725/853] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20comprobaci?= =?UTF-8?q?=C3=B3n=20de=20cambios=20en=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/changelog.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/changelog.sh b/tools/changelog.sh index 59f04693..5c5ec325 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -90,7 +90,7 @@ if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then fi # Si hay cambios y procede, añade al stage (cargo-release hará el commit) -if ! git diff --quiet -- "$CHANGELOG_FILE"; then +if ! git diff --quiet HEAD -- "$CHANGELOG_FILE"; then if [[ "$STAGE" == "--stage" ]]; then git add "$CHANGELOG_FILE" echo "Staged $CHANGELOG_FILE for commit" From bab44422a2787efa0210443bc066c3feee01bf0f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:09:50 +0200 Subject: [PATCH 726/853] =?UTF-8?q?=F0=9F=9A=A7=20Trabajando=20sobre=20la?= =?UTF-8?q?=20publicaci=C3=B3n=20de=20versiones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b894b5d..1d32d893 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.1" +version = "0.1.0" dependencies = [ "grass", "static-files", diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 4769631b..7bf60489 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.1" +version = "0.1.0" edition = "2021" description = """ From 652f5adfef09c370d368abfbb9303e5f4eb97861 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:10:37 +0200 Subject: [PATCH 727/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d32d893..6b894b5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" dependencies = [ "grass", "static-files", diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 7bf60489..4769631b 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" edition = "2021" description = """ From 9abd67f479790e4f8d0568119f269751cf788e20 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:15:29 +0200 Subject: [PATCH 728/853] =?UTF-8?q?=F0=9F=9A=A7=20Validando=20comparaci?= =?UTF-8?q?=C3=B3n=20de=20versiones=20de=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- tools/changelog.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b894b5d..1d32d893 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.1" +version = "0.1.0" dependencies = [ "grass", "static-files", diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 4769631b..7bf60489 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.1" +version = "0.1.0" edition = "2021" description = """ diff --git a/tools/changelog.sh b/tools/changelog.sh index 5c5ec325..eb4ab7e5 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -90,7 +90,7 @@ if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then fi # Si hay cambios y procede, añade al stage (cargo-release hará el commit) -if ! git diff --quiet HEAD -- "$CHANGELOG_FILE"; then +if git status --porcelain -- "$CHANGELOG_FILE" | grep -qE '^( M|A |??)'; then if [[ "$STAGE" == "--stage" ]]; then git add "$CHANGELOG_FILE" echo "Staged $CHANGELOG_FILE for commit" From 1a3649897ee97b53a22588f1a5f1837bef1403ff Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:16:00 +0200 Subject: [PATCH 729/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d32d893..6b894b5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" dependencies = [ "grass", "static-files", diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 7bf60489..4769631b 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" edition = "2021" description = """ From 7a6bbf9065b795361439b426f1633620a08fab34 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:19:01 +0200 Subject: [PATCH 730/853] =?UTF-8?q?=F0=9F=9A=A7=20Validaci=C3=B3n=20en=20c?= =?UTF-8?q?urso?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- tools/changelog.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b894b5d..1d32d893 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.1" +version = "0.1.0" dependencies = [ "grass", "static-files", diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 4769631b..7bf60489 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.1" +version = "0.1.0" edition = "2021" description = """ diff --git a/tools/changelog.sh b/tools/changelog.sh index eb4ab7e5..09ffcb0b 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -90,7 +90,7 @@ if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then fi # Si hay cambios y procede, añade al stage (cargo-release hará el commit) -if git status --porcelain -- "$CHANGELOG_FILE" | grep -qE '^( M|A |??)'; then +if [[ -n $(git status --porcelain -- "$CHANGELOG_FILE") ]]; then if [[ "$STAGE" == "--stage" ]]; then git add "$CHANGELOG_FILE" echo "Staged $CHANGELOG_FILE for commit" From 806249ea1b4a761ab74d442321fd33b885c40339 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 02:19:25 +0200 Subject: [PATCH 731/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/CHANGELOG.md | 17 +++++++++++++++++ helpers/pagetop-build/Cargo.toml | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 helpers/pagetop-build/CHANGELOG.md diff --git a/Cargo.lock b/Cargo.lock index 1d32d893..6b894b5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" dependencies = [ "grass", "static-files", diff --git a/helpers/pagetop-build/CHANGELOG.md b/helpers/pagetop-build/CHANGELOG.md new file mode 100644 index 00000000..22429694 --- /dev/null +++ b/helpers/pagetop-build/CHANGELOG.md @@ -0,0 +1,17 @@ +# CHANGELOG + +Este archivo documenta los cambios más relevantes realizados en cada versión. El formato está basado +en [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/), y las versiones se numeran siguiendo +las reglas del [Versionado Semántico](https://semver.org/lang/es/). + +Resume la evolución del proyecto para usuarios y colaboradores, destacando nuevas funcionalidades, +correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o +internos pueden omitirse si no afectan al uso del proyecto. + +## 0.1.1 (2025-08-05) + +- Depura la edición de CHANGELOGs y publicación de nuevas versiones + +## 0.1.0 (2025-08-05) + +- Versión inicial diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 7bf60489..4769631b 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.0" +version = "0.1.1" edition = "2021" description = """ From 605473a68368976b9534bff065507b9171b2ce83 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 03:01:19 +0200 Subject: [PATCH 732/853] =?UTF-8?q?=F0=9F=9A=91=20Corrige=20generaci=C3=B3?= =?UTF-8?q?n=20de=20CHANGELOG=20existentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cargo/cliff.toml | 2 ++ .cargo/release.toml | 2 +- tools/changelog.sh | 12 +++++++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.cargo/cliff.toml b/.cargo/cliff.toml index ff362c46..5e4cfb85 100644 --- a/.cargo/cliff.toml +++ b/.cargo/cliff.toml @@ -30,6 +30,7 @@ body = """ | first | replace(from="✨ ", to="") | replace(from="🐛 ", to="") + | replace(from="🚑 ", to="") | replace(from="⬆️ ", to="") | replace(from="🚧 ", to="") | replace(from="♻️ ", to="") @@ -54,6 +55,7 @@ sort_commits = "oldest" commit_parsers = [ { message = "^✨", group = "Añadido" }, { message = "^🐛", group = "Corregido" }, + { message = "^🚑", group = "Corregido" }, { message = "^🚧", group = "Cambiado" }, { message = "^♻️", group = "Cambiado" }, { message = "^✏️", group = "Cambiado" }, diff --git a/.cargo/release.toml b/.cargo/release.toml index b0ab9389..68f7a9cc 100644 --- a/.cargo/release.toml +++ b/.cargo/release.toml @@ -1,7 +1,7 @@ # release.toml # Etiqueta por crate: `pagetop-macros-v0.2.0` -tag-prefix = "{{crate_name}}-v" +tag-prefix = "{{crate_name}}-" # Confirmaciones firmadas (no requeridas) sign-commit = false diff --git a/tools/changelog.sh b/tools/changelog.sh index 09ffcb0b..13333d4a 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -59,21 +59,27 @@ esac # ------------------------------------------------------------------------------ # Genera el CHANGELOG para el crate correspondiente # ------------------------------------------------------------------------------ +if [[ -f "$CHANGELOG_FILE" ]]; then + # Archivo existe: inserta la nueva sección arriba + OUTPUT_FLAG=(--prepend "$CHANGELOG_FILE") +else + # Primera vez: crea el fichero desde cero + OUTPUT_FLAG=(-o "$CHANGELOG_FILE") +fi COMMON_ARGS=( --config "$CLIFF_CONFIG" "${PATH_FLAGS[@]}" --tag-pattern "^${CRATE}-v" --tag "$VERSION" - -o "$CHANGELOG_FILE" + "${OUTPUT_FLAG[@]}" ) LAST_TAG="$(git tag --list "${CRATE}-v*" --sort=-v:refname | head -n 1)" if [[ -n "$LAST_TAG" ]]; then echo "Generating CHANGELOG for '$CRATE' from tag '$LAST_TAG'" - git-cliff --unreleased "${COMMON_ARGS[@]}" else echo "Generating initial CHANGELOG for '$CRATE'" - git-cliff "${COMMON_ARGS[@]}" fi +git-cliff --unreleased "${COMMON_ARGS[@]}" echo "CHANGELOG generated at '$CHANGELOG_FILE'" # Pregunta por la revisión del archivo de cambios generado From a5f75cdf5bbef09a5ddd9ba0fc41fedadd02b754 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 03:14:25 +0200 Subject: [PATCH 733/853] =?UTF-8?q?=F0=9F=9A=A9=20Asegura=20compilaci?= =?UTF-8?q?=C3=B3n=20para=20publicar=20nueva=20versi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 27325b88..76db954d 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -21,4 +21,4 @@ proc-macro = true proc-macro2 = "1.0.95" proc-macro2-diagnostics = { version = "0.10.1", default-features = false } quote = "1.0.40" -syn = { version = "2.0.104", features = ["full"] } +syn = { version = "2.0.104", features = ["full", "extra-traits"] } From 1ee9339bca7f621fa9628de4393eb2d7e53661b0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 03:15:15 +0200 Subject: [PATCH 734/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-macros=200.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- helpers/pagetop-macros/CHANGELOG.md | 13 +++++++++++++ helpers/pagetop-macros/Cargo.toml | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 helpers/pagetop-macros/CHANGELOG.md diff --git a/Cargo.lock b/Cargo.lock index 6b894b5d..baba4a51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1608,7 +1608,7 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.0.18" +version = "0.1.0" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", diff --git a/Cargo.toml b/Cargo.toml index dcf191d6..860d4ee5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,4 +72,4 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] static-files = "0.2.5" pagetop-build = { version = "0.1", path = "helpers/pagetop-build" } -pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" } +pagetop-macros = { version = "0.1", path = "helpers/pagetop-macros" } diff --git a/helpers/pagetop-macros/CHANGELOG.md b/helpers/pagetop-macros/CHANGELOG.md new file mode 100644 index 00000000..b01b9883 --- /dev/null +++ b/helpers/pagetop-macros/CHANGELOG.md @@ -0,0 +1,13 @@ +# CHANGELOG + +Este archivo documenta los cambios más relevantes realizados en cada versión. El formato está basado +en [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/), y las versiones se numeran siguiendo +las reglas del [Versionado Semántico](https://semver.org/lang/es/). + +Resume la evolución del proyecto para usuarios y colaboradores, destacando nuevas funcionalidades, +correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o +internos pueden omitirse si no afectan al uso del proyecto. + +## 0.1.0 (2025-08-06) + +- Versión inicial diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 76db954d..45ba3283 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.0.18" +version = "0.1.0" edition = "2021" description = """ From 96bc0776166d9c2f1495bacb7b479c8b86f766ec Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 03:22:20 +0200 Subject: [PATCH 735/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop=200.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 13 +++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..b01b9883 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# CHANGELOG + +Este archivo documenta los cambios más relevantes realizados en cada versión. El formato está basado +en [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/), y las versiones se numeran siguiendo +las reglas del [Versionado Semántico](https://semver.org/lang/es/). + +Resume la evolución del proyecto para usuarios y colaboradores, destacando nuevas funcionalidades, +correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o +internos pueden omitirse si no afectan al uso del proyecto. + +## 0.1.0 (2025-08-06) + +- Versión inicial diff --git a/Cargo.lock b/Cargo.lock index baba4a51..e9ba9fb8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1569,7 +1569,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.0.61" +version = "0.1.0" dependencies = [ "actix-files", "actix-session", diff --git a/Cargo.toml b/Cargo.toml index 860d4ee5..229c989c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.0.61" +version = "0.1.0" edition = "2021" description = """ From bbc0a596513a9ed90170c6c08d97bbc6917ac0d8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 11:24:13 +0200 Subject: [PATCH 736/853] =?UTF-8?q?=F0=9F=A9=B9=20Corrige=20enlaces=20de?= =?UTF-8?q?=20licencia=20en=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- helpers/pagetop-build/README.md | 2 +- helpers/pagetop-build/src/lib.rs | 2 +- helpers/pagetop-macros/README.md | 2 +- helpers/pagetop-macros/src/lib.rs | 2 +- src/lib.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 87f8b8da..fe85e665 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ <p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md index 27c98147..d9d52571 100644 --- a/helpers/pagetop-build/README.md +++ b/helpers/pagetop-build/README.md @@ -4,7 +4,7 @@ <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index 90898dd3..4dcd70c0 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -4,7 +4,7 @@ //! //! <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> //! -//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) //! [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) //! [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) //! [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index 826698ad..c5006a87 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -4,7 +4,7 @@ <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index fedd682f..496ce82b 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -4,7 +4,7 @@ //! //! <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> //! -//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) //! [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) //! [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) //! [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) diff --git a/src/lib.rs b/src/lib.rs index baa57a69..e0da3617 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,7 @@ //! //! <p>Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables.</p> //! -//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-license) +//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) //! [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) //! [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) //! [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) From 53f42f9a778ecd4de9ef4f0937c7fb9a8126f965 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 6 Aug 2025 11:26:56 +0200 Subject: [PATCH 737/853] =?UTF-8?q?=F0=9F=9A=A9=20Afina=20Cargo.toml=20par?= =?UTF-8?q?a=20buscar=20la=20mejor=20categor=C3=ADa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 2 +- helpers/pagetop-build/Cargo.toml | 2 +- helpers/pagetop-macros/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 229c989c..3eee24d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" description = """ Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables. """ -categories = ["web-programming", "gui", "development-tools", "asynchronous"] +categories = ["web-programming::http-server"] keywords = ["pagetop", "web", "framework", "frontend", "ssr"] repository.workspace = true diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 4769631b..ba911efc 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -7,7 +7,7 @@ description = """ Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto PageTop. """ -categories = ["development-tools::build-utils", "web-programming"] +categories = ["development-tools::build-utils"] keywords = ["pagetop", "build", "assets", "resources", "static"] repository.workspace = true diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 45ba3283..64f1cf4c 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" description = """ Una colección de macros que mejoran la experiencia de desarrollo con PageTop. """ -categories = ["development-tools::procedural-macro-helpers", "web-programming"] +categories = ["development-tools::procedural-macro-helpers"] keywords = ["pagetop", "macros", "proc-macros", "codegen"] repository.workspace = true From 0ed4b6188048955740a8687772aabfb87df49473 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 8 Aug 2025 23:58:07 +0200 Subject: [PATCH 738/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20librer=C3=ADa?= =?UTF-8?q?=20para=20gestionar=20recursos=20est=C3=A1ticos=20(#1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.cillero.es/manuelcillero/pagetop/pulls/1 Co-authored-by: Manuel Cillero <manuel@cillero.es> Co-committed-by: Manuel Cillero <manuel@cillero.es> --- Cargo.lock | 48 +-- Cargo.toml | 9 +- helpers/pagetop-build/Cargo.toml | 2 +- helpers/pagetop-build/src/lib.rs | 2 +- helpers/pagetop-statics/Cargo.toml | 33 ++ helpers/pagetop-statics/LICENSE-APACHE | 201 +++++++++ helpers/pagetop-statics/LICENSE-MIT | 21 + helpers/pagetop-statics/README.md | 50 +++ helpers/pagetop-statics/build.rs | 43 ++ helpers/pagetop-statics/src/lib.rs | 34 ++ helpers/pagetop-statics/src/resource.rs | 249 +++++++++++ helpers/pagetop-statics/src/resource_dir.rs | 118 ++++++ helpers/pagetop-statics/src/resource_files.rs | 396 ++++++++++++++++++ helpers/pagetop-statics/src/sets.rs | 184 ++++++++ helpers/pagetop-statics/tests/file1.txt | 0 helpers/pagetop-statics/tests/file2.txt | 0 helpers/pagetop-statics/tests/file3.info | 0 helpers/pagetop-statics/tests/index.html | 10 + src/lib.rs | 8 +- src/service.rs | 4 +- 20 files changed, 1371 insertions(+), 41 deletions(-) create mode 100644 helpers/pagetop-statics/Cargo.toml create mode 100644 helpers/pagetop-statics/LICENSE-APACHE create mode 100644 helpers/pagetop-statics/LICENSE-MIT create mode 100644 helpers/pagetop-statics/README.md create mode 100644 helpers/pagetop-statics/build.rs create mode 100644 helpers/pagetop-statics/src/lib.rs create mode 100644 helpers/pagetop-statics/src/resource.rs create mode 100644 helpers/pagetop-statics/src/resource_dir.rs create mode 100644 helpers/pagetop-statics/src/resource_files.rs create mode 100644 helpers/pagetop-statics/src/sets.rs create mode 100644 helpers/pagetop-statics/tests/file1.txt create mode 100644 helpers/pagetop-statics/tests/file2.txt create mode 100644 helpers/pagetop-statics/tests/file3.info create mode 100644 helpers/pagetop-statics/tests/index.html diff --git a/Cargo.lock b/Cargo.lock index e9ba9fb8..2f15a489 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -225,18 +225,6 @@ dependencies = [ "syn", ] -[[package]] -name = "actix-web-static-files" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adf6d1ef6d7a60e084f9e0595e2a5234abda14e76c105ecf8e2d0e8800c41a1f" -dependencies = [ - "actix-web", - "derive_more 0.99.20", - "futures-util", - "static-files", -] - [[package]] name = "addr2line" version = "0.24.2" @@ -658,9 +646,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1076,9 +1064,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -1574,7 +1562,6 @@ dependencies = [ "actix-files", "actix-session", "actix-web", - "actix-web-static-files", "chrono", "colored", "concat-string", @@ -1584,10 +1571,10 @@ dependencies = [ "itoa", "pagetop-build", "pagetop-macros", + "pagetop-statics", "parking_lot", "pastey", "serde", - "static-files", "substring", "tempfile", "terminal_size", @@ -1603,7 +1590,7 @@ name = "pagetop-build" version = "0.1.1" dependencies = [ "grass", - "static-files", + "pagetop-statics", ] [[package]] @@ -1616,6 +1603,18 @@ dependencies = [ "syn", ] +[[package]] +name = "pagetop-statics" +version = "0.0.1" +dependencies = [ + "actix-web", + "change-detection", + "derive_more 0.99.20", + "futures-util", + "mime_guess", + "path-slash", +] + [[package]] name = "parking_lot" version = "0.12.4" @@ -2178,17 +2177,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "static-files" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9c425c07353535ef55b45420f5a8b0a397cd9bc3d7e5236497ca0d90604aa9b" -dependencies = [ - "change-detection", - "mime_guess", - "path-slash", -] - [[package]] name = "strsim" version = "0.11.1" diff --git a/Cargo.toml b/Cargo.toml index 3eee24d6..36007421 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,15 +34,14 @@ tracing-actix-web = "0.7.19" fluent-templates = "0.13.0" unic-langid = { version = "0.9.6", features = ["macros"] } -actix-web = "4.11.0" +actix-web = { workspace = true, default-features = true } actix-session = { version = "0.10.1", features = ["cookie-session"] } actix-web-files = { package = "actix-files", version = "0.6.6" } -actix-web-static-files = "4.0.1" -static-files.workspace = true serde = { version = "1.0", features = ["derive"] } pagetop-macros.workspace = true +pagetop-statics.workspace = true [features] default = [] @@ -60,6 +59,7 @@ resolver = "2" members = [ "helpers/pagetop-build", "helpers/pagetop-macros", + "helpers/pagetop-statics", ] [workspace.package] @@ -69,7 +69,8 @@ license = "MIT OR Apache-2.0" authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] -static-files = "0.2.5" +actix-web = { version = "4.11.0", default-features = false } pagetop-build = { version = "0.1", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.1", path = "helpers/pagetop-macros" } +pagetop-statics = { version = "0.0", path = "helpers/pagetop-statics" } diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index ba911efc..41e826e9 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -17,4 +17,4 @@ authors.workspace = true [dependencies] grass = "0.13.4" -static-files.workspace = true +pagetop-statics.workspace = true diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index 4dcd70c0..b360377f 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -123,7 +123,7 @@ )] use grass::{from_path, Options, OutputStyle}; -use static_files::{resource_dir, ResourceDir}; +use pagetop_statics::{resource_dir, ResourceDir}; use std::fs::{create_dir_all, remove_dir_all, File}; use std::io::Write; diff --git a/helpers/pagetop-statics/Cargo.toml b/helpers/pagetop-statics/Cargo.toml new file mode 100644 index 00000000..f41cec76 --- /dev/null +++ b/helpers/pagetop-statics/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "pagetop-statics" +version = "0.0.1" +edition = "2021" + +description = """ + Librería para automatizar la recopilación de recursos estáticos en PageTop. +""" +categories = ["development-tools::build-utils"] +keywords = ["pagetop", "build", "static", "resources", "file"] + +repository.workspace = true +homepage.workspace = true +license.workspace = true +authors.workspace = true + +[features] +default = ["change-detection"] +sort = [] + +[dependencies] +change-detection = { version = "1.2", optional = true } +mime_guess = "2.0" +path-slash = "0.1" + +actix-web.workspace = true +derive_more = "0.99.17" +futures-util = { version = "0.3", default-features = false, features = ["std"] } + +[build-dependencies] +change-detection = { version = "1.2", optional = true } +mime_guess = "2.0" +path-slash = "0.1" diff --git a/helpers/pagetop-statics/LICENSE-APACHE b/helpers/pagetop-statics/LICENSE-APACHE new file mode 100644 index 00000000..263ddac1 --- /dev/null +++ b/helpers/pagetop-statics/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/helpers/pagetop-statics/LICENSE-MIT b/helpers/pagetop-statics/LICENSE-MIT new file mode 100644 index 00000000..cd8af3d6 --- /dev/null +++ b/helpers/pagetop-statics/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Manuel Cillero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/helpers/pagetop-statics/README.md b/helpers/pagetop-statics/README.md new file mode 100644 index 00000000..c053e955 --- /dev/null +++ b/helpers/pagetop-statics/README.md @@ -0,0 +1,50 @@ +<div align="center"> + +<h1>PageTop Statics</h1> + +<p>Librería para automatizar la recopilación de recursos estáticos en <strong>PageTop</strong>.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) + +</div> + +## Descripción general + +Permite a `PageTop` incluir archivos estáticos en el ejecutable de la aplicación para servirlos de +forma eficiente vía web, con detección de cambios que optimiza el tiempo de compilación. + +Para ello, reúne el código de los *crates* [static-files](https://crates.io/crates/static_files) +(versión [0.2.5](https://github.com/static-files-rs/static-files/tree/v0.2.5)) y +[actix-web-static-files](https://crates.io/crates/actix_web_static_files) (versión +[4.0.1](https://github.com/kilork/actix-web-static-files/tree/v4.0.1)), desarrollados ambos por +[Alexander Korolev](https://crates.io/users/kilork). + +Estas implementaciones se integran en `PageTop` para evitar que cada proyecto tenga que declarar +`static-files` manualmente como dependencia en su `Cargo.toml`. + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# 🚧 Advertencia + +`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos +hasta que se libere la versión **1.0.0**. + + +# 📜 Licencia + +El código está disponible bajo una doble licencia: + + * **Licencia MIT** + ([LICENSE-MIT](LICENSE-MIT) o también https://opensource.org/licenses/MIT) + + * **Licencia Apache, Versión 2.0** + ([LICENSE-APACHE](LICENSE-APACHE) o también https://www.apache.org/licenses/LICENSE-2.0) + +Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el estándar de facto en +el ecosistema Rust. diff --git a/helpers/pagetop-statics/build.rs b/helpers/pagetop-statics/build.rs new file mode 100644 index 00000000..fcd009c9 --- /dev/null +++ b/helpers/pagetop-statics/build.rs @@ -0,0 +1,43 @@ +#![allow(dead_code)] +#![doc(html_no_source)] +#![allow(clippy::needless_doctest_main)] + +mod resource { + include!("src/resource.rs"); +} +use resource::generate_resources_mapping; +mod resource_dir { + include!("src/resource_dir.rs"); +} +use resource_dir::resource_dir; +mod sets { + include!("src/sets.rs"); +} +use sets::{generate_resources_sets, SplitByCount}; + +use std::{env, path::Path}; + +fn main() -> std::io::Result<()> { + resource_dir("./tests").build_test()?; + + let out_dir = env::var("OUT_DIR").unwrap(); + + generate_resources_mapping( + "./tests", + None, + Path::new(&out_dir).join("generated_mapping.rs"), + "pagetop_statics", + )?; + + generate_resources_sets( + "./tests", + None, + Path::new(&out_dir).join("generated_sets.rs"), + "sets", + "generate", + &mut SplitByCount::new(2), + "pagetop_statics", + )?; + + Ok(()) +} diff --git a/helpers/pagetop-statics/src/lib.rs b/helpers/pagetop-statics/src/lib.rs new file mode 100644 index 00000000..fffd1ae3 --- /dev/null +++ b/helpers/pagetop-statics/src/lib.rs @@ -0,0 +1,34 @@ +//! <div align="center"> +//! +//! <h1>PageTop Statics</h1> +//! +//! <p>Librería para automatizar la recopilación de recursos estáticos en <strong>PageTop</strong>.</p> +//! +//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +//! +//! </div> +//! +//! ## Sobre PageTop +//! +//! [PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la +//! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles +//! y configurables, basadas en HTML, CSS y JavaScript. + +#![doc(test(no_crate_inject))] +#![doc( + html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" +)] +#![allow(clippy::needless_doctest_main)] + +/// Resource definition and single module based generation. +pub mod resource; +pub use resource::Resource as StaticResource; + +mod resource_dir; +pub use resource_dir::{resource_dir, ResourceDir}; + +mod resource_files; +pub use resource_files::{ResourceFiles, UriSegmentError}; + +/// Support for module based generations. Use it for large data sets (more than 128 Mb). +pub mod sets; diff --git a/helpers/pagetop-statics/src/resource.rs b/helpers/pagetop-statics/src/resource.rs new file mode 100644 index 00000000..0b81969e --- /dev/null +++ b/helpers/pagetop-statics/src/resource.rs @@ -0,0 +1,249 @@ +use path_slash::PathExt; +use std::{ + fs::{self, File, Metadata}, + io::{self, Write}, + path::{Path, PathBuf}, + time::SystemTime, +}; + +/// Static files resource. +pub struct Resource { + pub data: &'static [u8], + pub modified: u64, + pub mime_type: &'static str, +} + +/// Used internally in generated functions. +#[inline] +pub fn new_resource(data: &'static [u8], modified: u64, mime_type: &'static str) -> Resource { + Resource { + data, + modified, + mime_type, + } +} + +pub(crate) const DEFAULT_VARIABLE_NAME: &str = "r"; + +/// Generate resources for `project_dir` using `filter`. +/// Result saved in `generated_filename` and function named as `fn_name`. +/// +/// in `build.rs`: +/// ```rust +/// use std::{env, path::Path}; +/// use pagetop_statics::resource::generate_resources; +/// +/// fn main() { +/// let out_dir = env::var("OUT_DIR").unwrap(); +/// let generated_filename = Path::new(&out_dir).join("generated.rs"); +/// generate_resources("./tests", None, generated_filename, "generate", "pagetop_statics").unwrap(); +/// } +/// ``` +/// +/// in `main.rs`: +/// ```rust +/// include!(concat!(env!("OUT_DIR"), "/generated.rs")); +/// +/// fn main() { +/// let generated_file = generate(); +/// +/// assert_eq!(generated_file.len(), 4); +/// } +/// ``` +pub fn generate_resources<P: AsRef<Path>, G: AsRef<Path>>( + project_dir: P, + filter: Option<fn(p: &Path) -> bool>, + generated_filename: G, + fn_name: &str, + crate_name: &str, +) -> io::Result<()> { + let resources = collect_resources(&project_dir, filter)?; + + let mut f = File::create(&generated_filename)?; + + generate_function_header(&mut f, fn_name, crate_name)?; + generate_uses(&mut f, crate_name)?; + + generate_variable_header(&mut f, DEFAULT_VARIABLE_NAME)?; + generate_resource_inserts(&mut f, &project_dir, DEFAULT_VARIABLE_NAME, resources)?; + generate_variable_return(&mut f, DEFAULT_VARIABLE_NAME)?; + + generate_function_end(&mut f)?; + + Ok(()) +} + +/// Generate resource mapping for `project_dir` using `filter`. +/// Result saved in `generated_filename` as anonymous block which returns HashMap<&'static str, Resource>. +/// +/// in `build.rs`: +/// ```rust +/// +/// use std::{env, path::Path}; +/// use pagetop_statics::resource::generate_resources_mapping; +/// +/// fn main() { +/// let out_dir = env::var("OUT_DIR").unwrap(); +/// let generated_filename = Path::new(&out_dir).join("generated_mapping.rs"); +/// generate_resources_mapping("./tests", None, generated_filename, "pagetop_statics").unwrap(); +/// } +/// ``` +/// +/// in `main.rs`: +/// ```rust +/// use std::collections::HashMap; +/// +/// use pagetop_statics::StaticResource; +/// +/// fn generate_mapping() -> HashMap<&'static str, StaticResource> { +/// include!(concat!(env!("OUT_DIR"), "/generated_mapping.rs")) +/// } +/// +/// fn main() { +/// let generated_file = generate_mapping(); +/// +/// assert_eq!(generated_file.len(), 4); +/// +/// } +/// ``` +pub fn generate_resources_mapping<P: AsRef<Path>, G: AsRef<Path>>( + project_dir: P, + filter: Option<fn(p: &Path) -> bool>, + generated_filename: G, + crate_name: &str, +) -> io::Result<()> { + let resources = collect_resources(&project_dir, filter)?; + + let mut f = File::create(&generated_filename)?; + writeln!(f, "{{")?; + + generate_uses(&mut f, crate_name)?; + + generate_variable_header(&mut f, DEFAULT_VARIABLE_NAME)?; + + generate_resource_inserts(&mut f, &project_dir, DEFAULT_VARIABLE_NAME, resources)?; + + generate_variable_return(&mut f, DEFAULT_VARIABLE_NAME)?; + + writeln!(f, "}}")?; + Ok(()) +} + +#[cfg(not(feature = "sort"))] +pub(crate) fn collect_resources<P: AsRef<Path>>( + path: P, + filter: Option<fn(p: &Path) -> bool>, +) -> io::Result<Vec<(PathBuf, Metadata)>> { + collect_resources_nested(path, filter) +} + +#[cfg(feature = "sort")] +pub(crate) fn collect_resources<P: AsRef<Path>>( + path: P, + filter: Option<fn(p: &Path) -> bool>, +) -> io::Result<Vec<(PathBuf, Metadata)>> { + let mut resources = collect_resources_nested(path, filter)?; + resources.sort_by(|a, b| a.0.cmp(&b.0)); + Ok(resources) +} + +#[inline] +fn collect_resources_nested<P: AsRef<Path>>( + path: P, + filter: Option<fn(p: &Path) -> bool>, +) -> io::Result<Vec<(PathBuf, Metadata)>> { + let mut result = vec![]; + + for entry in fs::read_dir(&path)? { + let entry = entry?; + let path = entry.path(); + + if let Some(ref filter) = filter { + if !filter(path.as_ref()) { + continue; + } + } + + if path.is_dir() { + let nested = collect_resources(path, filter)?; + result.extend(nested); + } else { + result.push((path, entry.metadata()?)); + } + } + + Ok(result) +} + +pub(crate) fn generate_resource_inserts<P: AsRef<Path>, W: Write>( + f: &mut W, + project_dir: &P, + variable_name: &str, + resources: Vec<(PathBuf, Metadata)>, +) -> io::Result<()> { + for resource in &resources { + generate_resource_insert(f, project_dir, variable_name, resource)?; + } + Ok(()) +} + +#[allow(clippy::unnecessary_debug_formatting)] +pub(crate) fn generate_resource_insert<P: AsRef<Path>, W: Write>( + f: &mut W, + project_dir: &P, + variable_name: &str, + resource: &(PathBuf, Metadata), +) -> io::Result<()> { + let (path, metadata) = resource; + let abs_path = path.canonicalize()?; + let key_path = path.strip_prefix(project_dir).unwrap().to_slash().unwrap(); + + let modified = if let Ok(Ok(modified)) = metadata + .modified() + .map(|x| x.duration_since(SystemTime::UNIX_EPOCH)) + { + modified.as_secs() + } else { + 0 + }; + let mime_type = mime_guess::MimeGuess::from_path(path).first_or_octet_stream(); + writeln!( + f, + "{}.insert({:?},n(i!({:?}),{:?},{:?}));", + variable_name, &key_path, &abs_path, modified, &mime_type, + ) +} + +pub(crate) fn generate_function_header<F: Write>( + f: &mut F, + fn_name: &str, + crate_name: &str, +) -> io::Result<()> { + writeln!( + f, + "#[allow(clippy::unreadable_literal)] pub fn {fn_name}() -> ::std::collections::HashMap<&'static str, ::{crate_name}::StaticResource> {{", + ) +} + +pub(crate) fn generate_function_end<F: Write>(f: &mut F) -> io::Result<()> { + writeln!(f, "}}") +} + +pub(crate) fn generate_uses<F: Write>(f: &mut F, crate_name: &str) -> io::Result<()> { + writeln!( + f, + "use ::{crate_name}::resource::new_resource as n; +use ::std::include_bytes as i;", + ) +} + +pub(crate) fn generate_variable_header<F: Write>(f: &mut F, variable_name: &str) -> io::Result<()> { + writeln!( + f, + "let mut {variable_name} = ::std::collections::HashMap::new();", + ) +} + +pub(crate) fn generate_variable_return<F: Write>(f: &mut F, variable_name: &str) -> io::Result<()> { + writeln!(f, "{variable_name}") +} diff --git a/helpers/pagetop-statics/src/resource_dir.rs b/helpers/pagetop-statics/src/resource_dir.rs new file mode 100644 index 00000000..805e1ed4 --- /dev/null +++ b/helpers/pagetop-statics/src/resource_dir.rs @@ -0,0 +1,118 @@ +use super::sets::{generate_resources_sets, SplitByCount}; +use std::{ + env, io, + path::{Path, PathBuf}, +}; + +/// Generate resources for `resource_dir`. +/// +/// ```rust,no_run +/// // Generate resources for ./tests dir with file name generated.rs +/// // stored in path defined by OUT_DIR environment variable. +/// // Function name is 'generate' +/// use pagetop_statics::resource_dir; +/// +/// resource_dir("./tests").build().unwrap(); +/// ``` +pub fn resource_dir<P: AsRef<Path>>(resource_dir: P) -> ResourceDir { + ResourceDir { + resource_dir: resource_dir.as_ref().into(), + ..Default::default() + } +} + +/// Resource dir. +/// +/// A builder structure allows to change default settings for: +/// - file filter +/// - generated file name +/// - generated function name +#[derive(Default)] +pub struct ResourceDir { + pub(crate) resource_dir: PathBuf, + pub(crate) filter: Option<fn(p: &Path) -> bool>, + pub(crate) generated_filename: Option<PathBuf>, + pub(crate) generated_fn: Option<String>, + pub(crate) module_name: Option<String>, + pub(crate) count_per_module: Option<usize>, +} + +pub const DEFAULT_MODULE_NAME: &str = "sets"; +pub const DEFAULT_COUNT_PER_MODULE: usize = 256; + +impl ResourceDir { + /// Generates resources for current configuration. + pub fn build(self) -> io::Result<()> { + self.internal_build("pagetop") + } + + /// Generates resources for testing current configuration. + #[allow(dead_code)] + pub(crate) fn build_test(self) -> io::Result<()> { + self.internal_build("pagetop_statics") + } + + fn internal_build(self, crate_name: &str) -> io::Result<()> { + let generated_filename = self.generated_filename.unwrap_or_else(|| { + let out_dir = env::var("OUT_DIR").unwrap(); + + Path::new(&out_dir).join("generated.rs") + }); + let generated_fn = self.generated_fn.unwrap_or_else(|| "generate".into()); + + let module_name = self + .module_name + .unwrap_or_else(|| format!("{}_{}", &generated_fn, DEFAULT_MODULE_NAME)); + + let count_per_module = self.count_per_module.unwrap_or(DEFAULT_COUNT_PER_MODULE); + + generate_resources_sets( + &self.resource_dir, + self.filter, + &generated_filename, + module_name.as_str(), + &generated_fn, + &mut SplitByCount::new(count_per_module), + crate_name, + ) + } + + /// Sets the file filter. + pub fn with_filter(&mut self, filter: fn(p: &Path) -> bool) -> &mut Self { + self.filter = Some(filter); + self + } + + /// Sets the generated filename. + pub fn with_generated_filename<P: AsRef<Path>>(&mut self, generated_filename: P) -> &mut Self { + self.generated_filename = Some(generated_filename.as_ref().into()); + self + } + + /// Sets the generated function name. + pub fn with_generated_fn<S>(&mut self, generated_fn: S) -> &mut Self + where + S: Into<String>, + { + self.generated_fn = Some(generated_fn.into()); + self + } + + /// Sets the generated module name. + /// + /// Default value is based on generated function name and the suffix "sets". + /// Generated module would be overriden by each call. + pub fn with_module_name<S>(&mut self, module_name: S) -> &mut Self + where + S: Into<String>, + { + self.module_name = Some(module_name.into()); + self + } + + /// Sets maximal count of files per module. + pub fn with_count_per_module(&mut self, count_per_module: usize) -> &mut Self { + self.count_per_module = Some(count_per_module); + self + } +} diff --git a/helpers/pagetop-statics/src/resource_files.rs b/helpers/pagetop-statics/src/resource_files.rs new file mode 100644 index 00000000..b487bca9 --- /dev/null +++ b/helpers/pagetop-statics/src/resource_files.rs @@ -0,0 +1,396 @@ +use super::resource::Resource; +use actix_web::{ + dev::{ + always_ready, AppService, HttpServiceFactory, ResourceDef, Service, ServiceFactory, + ServiceRequest, ServiceResponse, + }, + error::Error, + guard::{Guard, GuardContext}, + http::{ + header::{self, ContentType}, + Method, StatusCode, + }, + HttpMessage, HttpRequest, HttpResponse, ResponseError, +}; +use derive_more::{Deref, Display, Error}; +use futures_util::future::{ok, FutureExt, LocalBoxFuture, Ready}; +use std::{collections::HashMap, ops::Deref, rc::Rc}; + +/// Static resource files handling +/// +/// `ResourceFiles` service must be registered with `App::service` method. +/// +/// ```rust +/// use std::collections::HashMap; +/// +/// use actix_web::App; +/// +/// fn main() { +/// // serve root directory with default options: +/// // - resolve index.html +/// let files: HashMap<&'static str, pagetop_statics::StaticResource> = HashMap::new(); +/// let app = App::new() +/// .service(pagetop_statics::ResourceFiles::new("/", files)); +/// // or subpath with additional option to not resolve index.html +/// let files: HashMap<&'static str, pagetop_statics::StaticResource> = HashMap::new(); +/// let app = App::new() +/// .service(pagetop_statics::ResourceFiles::new("/imgs", files) +/// .do_not_resolve_defaults()); +/// } +/// ``` +#[allow(clippy::needless_doctest_main)] +pub struct ResourceFiles { + not_resolve_defaults: bool, + use_guard: bool, + not_found_resolves_to: Option<String>, + inner: Rc<ResourceFilesInner>, +} + +pub struct ResourceFilesInner { + path: String, + files: HashMap<&'static str, Resource>, +} + +const INDEX_HTML: &str = "index.html"; + +impl ResourceFiles { + pub fn new(path: &str, files: HashMap<&'static str, Resource>) -> Self { + let inner = ResourceFilesInner { + path: path.into(), + files, + }; + Self { + inner: Rc::new(inner), + not_resolve_defaults: false, + not_found_resolves_to: None, + use_guard: false, + } + } + + /// By default trying to resolve '.../' to '.../index.html' if it exists. + /// Turn off this resolution by calling this function. + pub fn do_not_resolve_defaults(mut self) -> Self { + self.not_resolve_defaults = true; + self + } + + /// Resolves not found references to this path. + /// + /// This can be useful for angular-like applications. + pub fn resolve_not_found_to<S: ToString>(mut self, path: S) -> Self { + self.not_found_resolves_to = Some(path.to_string()); + self + } + + /// Resolves not found references to root path. + /// + /// This can be useful for angular-like applications. + pub fn resolve_not_found_to_root(self) -> Self { + self.resolve_not_found_to(INDEX_HTML) + } + + /// If this is called, we will use an [actix_web::guard::Guard] to check if this request should be handled. + /// If set to true, we skip using the handler for files that haven't been found, instead of sending 404s. + /// Would be ignored, if `resolve_not_found_to` or `resolve_not_found_to_root` is used. + /// + /// Can be useful if you want to share files on a (sub)path that's also used by a different route handler. + pub fn skip_handler_when_not_found(mut self) -> Self { + self.use_guard = true; + self + } + + fn select_guard(&self) -> Box<dyn Guard> { + if self.not_resolve_defaults { + Box::new(NotResolveDefaultsGuard::from(self)) + } else { + Box::new(ResolveDefaultsGuard::from(self)) + } + } +} + +impl Deref for ResourceFiles { + type Target = ResourceFilesInner; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +struct NotResolveDefaultsGuard { + inner: Rc<ResourceFilesInner>, +} + +impl Guard for NotResolveDefaultsGuard { + fn check(&self, ctx: &GuardContext<'_>) -> bool { + self.inner + .files + .contains_key(ctx.head().uri.path().trim_start_matches('/')) + } +} + +impl From<&ResourceFiles> for NotResolveDefaultsGuard { + fn from(files: &ResourceFiles) -> Self { + Self { + inner: files.inner.clone(), + } + } +} + +struct ResolveDefaultsGuard { + inner: Rc<ResourceFilesInner>, +} + +impl Guard for ResolveDefaultsGuard { + fn check(&self, ctx: &GuardContext<'_>) -> bool { + let path = ctx.head().uri.path().trim_start_matches('/'); + self.inner.files.contains_key(path) + || ((path.is_empty() || path.ends_with('/')) + && self + .inner + .files + .contains_key((path.to_string() + INDEX_HTML).as_str())) + } +} + +impl From<&ResourceFiles> for ResolveDefaultsGuard { + fn from(files: &ResourceFiles) -> Self { + Self { + inner: files.inner.clone(), + } + } +} + +impl HttpServiceFactory for ResourceFiles { + fn register(self, config: &mut AppService) { + let prefix = self.path.trim_start_matches('/'); + let rdef = if config.is_root() { + ResourceDef::root_prefix(prefix) + } else { + ResourceDef::prefix(prefix) + }; + let guards = if self.use_guard && self.not_found_resolves_to.is_none() { + Some(vec![self.select_guard()]) + } else { + None + }; + config.register_service(rdef, guards, self, None); + } +} + +impl ServiceFactory<ServiceRequest> for ResourceFiles { + type Config = (); + type Response = ServiceResponse; + type Error = Error; + type Service = ResourceFilesService; + type InitError = (); + type Future = LocalBoxFuture<'static, Result<Self::Service, Self::InitError>>; + + fn new_service(&self, _: ()) -> Self::Future { + ok(ResourceFilesService { + resolve_defaults: !self.not_resolve_defaults, + not_found_resolves_to: self.not_found_resolves_to.clone(), + inner: self.inner.clone(), + }) + .boxed_local() + } +} + +#[derive(Deref)] +pub struct ResourceFilesService { + resolve_defaults: bool, + not_found_resolves_to: Option<String>, + #[deref] + inner: Rc<ResourceFilesInner>, +} + +impl Service<ServiceRequest> for ResourceFilesService { + type Response = ServiceResponse; + type Error = Error; + type Future = Ready<Result<Self::Response, Self::Error>>; + + always_ready!(); + + fn call(&self, req: ServiceRequest) -> Self::Future { + match *req.method() { + Method::HEAD | Method::GET => (), + _ => { + return ok(ServiceResponse::new( + req.into_parts().0, + HttpResponse::MethodNotAllowed() + .insert_header(ContentType::plaintext()) + .insert_header((header::ALLOW, "GET, HEAD")) + .body("This resource only supports GET and HEAD."), + )); + } + } + + let req_path = req.match_info().unprocessed(); + let mut item = self.files.get(req_path); + + if item.is_none() + && self.resolve_defaults + && (req_path.is_empty() || req_path.ends_with('/')) + { + let index_req_path = req_path.to_string() + INDEX_HTML; + item = self.files.get(index_req_path.trim_start_matches('/')); + } + + let (req, response) = if item.is_some() { + let (req, _) = req.into_parts(); + let response = respond_to(&req, item); + (req, response) + } else { + let real_path = match get_pathbuf(req_path) { + Ok(item) => item, + Err(e) => return ok(req.error_response(e)), + }; + + let (req, _) = req.into_parts(); + + let mut item = self.files.get(real_path.as_str()); + + if item.is_none() && self.not_found_resolves_to.is_some() { + let not_found_path = self.not_found_resolves_to.as_ref().unwrap(); + item = self.files.get(not_found_path.as_str()); + } + + let response = respond_to(&req, item); + (req, response) + }; + + ok(ServiceResponse::new(req, response)) + } +} + +fn respond_to(req: &HttpRequest, item: Option<&Resource>) -> HttpResponse { + if let Some(file) = item { + let etag = Some(header::EntityTag::new_strong(format!( + "{:x}:{:x}", + file.data.len(), + file.modified + ))); + + let precondition_failed = !any_match(etag.as_ref(), req); + + let not_modified = !none_match(etag.as_ref(), req); + + let mut resp = HttpResponse::build(StatusCode::OK); + resp.insert_header((header::CONTENT_TYPE, file.mime_type)); + + if let Some(etag) = etag { + resp.insert_header(header::ETag(etag)); + } + + if precondition_failed { + return resp.status(StatusCode::PRECONDITION_FAILED).finish(); + } else if not_modified { + return resp.status(StatusCode::NOT_MODIFIED).finish(); + } + + resp.body(file.data) + } else { + HttpResponse::NotFound().body("Not found") + } +} + +/// Returns true if `req` has no `If-Match` header or one which matches `etag`. +fn any_match(etag: Option<&header::EntityTag>, req: &HttpRequest) -> bool { + match req.get_header::<header::IfMatch>() { + None | Some(header::IfMatch::Any) => true, + Some(header::IfMatch::Items(ref items)) => { + if let Some(some_etag) = etag { + for item in items { + if item.strong_eq(some_etag) { + return true; + } + } + } + false + } + } +} + +/// Returns true if `req` doesn't have an `If-None-Match` header matching `req`. +fn none_match(etag: Option<&header::EntityTag>, req: &HttpRequest) -> bool { + match req.get_header::<header::IfNoneMatch>() { + Some(header::IfNoneMatch::Any) => false, + Some(header::IfNoneMatch::Items(ref items)) => { + if let Some(some_etag) = etag { + for item in items { + if item.weak_eq(some_etag) { + return false; + } + } + } + true + } + None => true, + } +} + +/// Error type representing invalid characters in a URI path segment. +/// +/// This enum is used to report specific formatting errors in individual segments of a URI path, +/// such as starting, ending, or containing disallowed characters. Each variant wraps the offending +/// character that caused the error. +#[derive(Debug, PartialEq, Display, Error)] +pub enum UriSegmentError { + /// The segment started with the wrapped invalid character. + #[display(fmt = "The segment started with the wrapped invalid character")] + BadStart(#[error(not(source))] char), + + /// The segment contained the wrapped invalid character. + #[display(fmt = "The segment contained the wrapped invalid character")] + BadChar(#[error(not(source))] char), + + /// The segment ended with the wrapped invalid character. + #[display(fmt = "The segment ended with the wrapped invalid character")] + BadEnd(#[error(not(source))] char), +} + +#[cfg(test)] +mod tests_error_impl { + use super::*; + + fn assert_send_and_sync<T: Send + Sync + 'static>() {} + + #[test] + fn test_error_impl() { + // ensure backwards compatibility when migrating away from failure + assert_send_and_sync::<UriSegmentError>(); + } +} + +/// Return `BadRequest` for `UriSegmentError` +impl ResponseError for UriSegmentError { + fn error_response(&self) -> HttpResponse { + HttpResponse::new(StatusCode::BAD_REQUEST) + } +} + +fn get_pathbuf(path: &str) -> Result<String, UriSegmentError> { + let mut buf = Vec::new(); + for segment in path.split('/') { + if segment == ".." { + buf.pop(); + } else if segment.starts_with('.') { + return Err(UriSegmentError::BadStart('.')); + } else if segment.starts_with('*') { + return Err(UriSegmentError::BadStart('*')); + } else if segment.ends_with(':') { + return Err(UriSegmentError::BadEnd(':')); + } else if segment.ends_with('>') { + return Err(UriSegmentError::BadEnd('>')); + } else if segment.ends_with('<') { + return Err(UriSegmentError::BadEnd('<')); + } else if segment.is_empty() { + continue; + } else if cfg!(windows) && segment.contains('\\') { + return Err(UriSegmentError::BadChar('\\')); + } else { + buf.push(segment) + } + } + + Ok(buf.join("/")) +} diff --git a/helpers/pagetop-statics/src/sets.rs b/helpers/pagetop-statics/src/sets.rs new file mode 100644 index 00000000..1d9299df --- /dev/null +++ b/helpers/pagetop-statics/src/sets.rs @@ -0,0 +1,184 @@ +use std::{ + fs::{self, File, Metadata}, + io::{self, Write}, + path::{Path, PathBuf}, +}; + +use super::resource::{ + collect_resources, generate_function_end, generate_function_header, generate_resource_insert, + generate_uses, generate_variable_header, generate_variable_return, DEFAULT_VARIABLE_NAME, +}; + +/// Defines the split strategie. +pub trait SetSplitStrategie { + /// Register next file from resources. + fn register(&mut self, path: &Path, metadata: &Metadata); + /// Determine, should we split modules now. + fn should_split(&self) -> bool; + /// Resets internal counters after split. + fn reset(&mut self); +} + +/// Split modules by files count. +pub struct SplitByCount { + current: usize, + max: usize, +} + +impl SplitByCount { + pub fn new(max: usize) -> Self { + Self { current: 0, max } + } +} + +impl SetSplitStrategie for SplitByCount { + fn register(&mut self, _path: &Path, _metadata: &Metadata) { + self.current += 1; + } + + fn should_split(&self) -> bool { + self.current >= self.max + } + + fn reset(&mut self) { + self.current = 0; + } +} + +/// Generate resources for `project_dir` using `filter` +/// breaking them into separate modules using `set_split_strategie` (recommended for large > 128 Mb setups). +/// +/// Result saved in module named `module_name`. It exports +/// only one function named `fn_name`. It is then exported from +/// `generated_filename`. `generated_filename` is also used to determine +/// the parent directory for the module. +/// +/// in `build.rs`: +/// ```rust +/// +/// use std::{env, path::Path}; +/// use pagetop_statics::sets::{generate_resources_sets, SplitByCount}; +/// +/// fn main() { +/// let out_dir = env::var("OUT_DIR").unwrap(); +/// let generated_filename = Path::new(&out_dir).join("generated_sets.rs"); +/// generate_resources_sets( +/// "./tests", +/// None, +/// generated_filename, +/// "sets", +/// "generate", +/// &mut SplitByCount::new(2), +/// "pagetop_statics", +/// ) +/// .unwrap(); +/// } +/// ``` +/// +/// in `main.rs`: +/// ```rust +/// include!(concat!(env!("OUT_DIR"), "/generated_sets.rs")); +/// +/// fn main() { +/// let generated_file = generate(); +/// +/// assert_eq!(generated_file.len(), 4); +/// +/// } +/// ``` +pub fn generate_resources_sets<P, G, S>( + project_dir: P, + filter: Option<fn(p: &Path) -> bool>, + generated_filename: G, + module_name: &str, + fn_name: &str, + set_split_strategie: &mut S, + crate_name: &str, +) -> io::Result<()> +where + P: AsRef<Path>, + G: AsRef<Path>, + S: SetSplitStrategie, +{ + let resources = collect_resources(&project_dir, filter)?; + + let mut generated_file = File::create(&generated_filename)?; + + let module_dir = generated_filename.as_ref().parent().map_or_else( + || PathBuf::from(module_name), + |parent| parent.join(module_name), + ); + fs::create_dir_all(&module_dir)?; + + let mut module_file = File::create(module_dir.join("mod.rs"))?; + + generate_uses(&mut module_file, crate_name)?; + writeln!( + module_file, + " +use ::{crate_name}::StaticResource; +use ::std::collections::HashMap;" + )?; + + let mut modules_count = 1; + + let mut set_file = create_set_module_file(&module_dir, modules_count)?; + let mut should_split = set_split_strategie.should_split(); + + for resource in &resources { + let (path, metadata) = &resource; + if should_split { + set_split_strategie.reset(); + modules_count += 1; + generate_function_end(&mut set_file)?; + set_file = create_set_module_file(&module_dir, modules_count)?; + } + set_split_strategie.register(path, metadata); + should_split = set_split_strategie.should_split(); + + generate_resource_insert(&mut set_file, &project_dir, DEFAULT_VARIABLE_NAME, resource)?; + } + + generate_function_end(&mut set_file)?; + + for module_index in 1..=modules_count { + writeln!(module_file, "mod set_{module_index};")?; + } + + generate_function_header(&mut module_file, fn_name, crate_name)?; + + generate_variable_header(&mut module_file, DEFAULT_VARIABLE_NAME)?; + + for module_index in 1..=modules_count { + writeln!( + module_file, + "set_{module_index}::generate(&mut {DEFAULT_VARIABLE_NAME});", + )?; + } + + generate_variable_return(&mut module_file, DEFAULT_VARIABLE_NAME)?; + + generate_function_end(&mut module_file)?; + + writeln!( + generated_file, + "mod {module_name}; +pub use {module_name}::{fn_name};", + )?; + + Ok(()) +} + +fn create_set_module_file(module_dir: &Path, module_index: usize) -> io::Result<File> { + let mut set_module = File::create(module_dir.join(format!("set_{module_index}.rs")))?; + + writeln!( + set_module, + "#[allow(clippy::wildcard_imports)] +use super::*; +#[allow(clippy::unreadable_literal)] +pub(crate) fn generate({DEFAULT_VARIABLE_NAME}: &mut HashMap<&'static str, StaticResource>) {{", + )?; + + Ok(set_module) +} diff --git a/helpers/pagetop-statics/tests/file1.txt b/helpers/pagetop-statics/tests/file1.txt new file mode 100644 index 00000000..e69de29b diff --git a/helpers/pagetop-statics/tests/file2.txt b/helpers/pagetop-statics/tests/file2.txt new file mode 100644 index 00000000..e69de29b diff --git a/helpers/pagetop-statics/tests/file3.info b/helpers/pagetop-statics/tests/file3.info new file mode 100644 index 00000000..e69de29b diff --git a/helpers/pagetop-statics/tests/index.html b/helpers/pagetop-statics/tests/index.html new file mode 100644 index 00000000..36f505f2 --- /dev/null +++ b/helpers/pagetop-statics/tests/index.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Document</title> +</head> +<body> +</body> +</html> diff --git a/src/lib.rs b/src/lib.rs index e0da3617..bbc45302 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -98,21 +98,23 @@ use std::ops::Deref; pub use pagetop_macros::{builder_fn, html, main, test, AutoDefault}; +pub use pagetop_statics::{resource, StaticResource}; + /// Conjunto de recursos asociados a `$STATIC` en [`include_files!`](crate::include_files). pub struct StaticResources { - bundle: HashMap<&'static str, static_files::Resource>, + bundle: HashMap<&'static str, StaticResource>, } impl StaticResources { /// Crea un contenedor para un conjunto de recursos generado por `build.rs` (consultar /// [`pagetop_build`](https://docs.rs/pagetop-build)). - pub fn new(bundle: HashMap<&'static str, static_files::Resource>) -> Self { + pub fn new(bundle: HashMap<&'static str, StaticResource>) -> Self { Self { bundle } } } impl Deref for StaticResources { - type Target = HashMap<&'static str, static_files::Resource>; + type Target = HashMap<&'static str, StaticResource>; fn deref(&self) -> &Self::Target { &self.bundle diff --git a/src/service.rs b/src/service.rs index 89ba4966..47f1420d 100644 --- a/src/service.rs +++ b/src/service.rs @@ -8,9 +8,9 @@ pub use actix_web::dev::ServiceRequest as Request; pub use actix_web::dev::ServiceResponse as Response; pub use actix_web::{cookie, http, rt, web}; pub use actix_web::{App, Error, HttpMessage, HttpRequest, HttpResponse, HttpServer}; - pub use actix_web_files::Files as ActixFiles; -pub use actix_web_static_files::ResourceFiles; + +pub use pagetop_statics::ResourceFiles; #[doc(hidden)] pub use actix_web::test; From db1ee4887557951240720899aafee3f232ad11ce Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Aug 2025 10:17:14 +0200 Subject: [PATCH 739/853] =?UTF-8?q?=F0=9F=94=A8=20A=C3=B1ade=20soporte=20a?= =?UTF-8?q?=20changelog=20de=20`pagetop-statics`=20(#2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.cillero.es/manuelcillero/pagetop/pulls/2 Co-authored-by: Manuel Cillero <manuel@cillero.es> Co-committed-by: Manuel Cillero <manuel@cillero.es> --- .cargo/cliff.toml | 6 +++--- tools/changelog.sh | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.cargo/cliff.toml b/.cargo/cliff.toml index 5e4cfb85..cbbb57b6 100644 --- a/.cargo/cliff.toml +++ b/.cargo/cliff.toml @@ -21,9 +21,9 @@ body = """ {% else %} ## Pendiente de publicación {% endif %}\ -{% set base = "https://git.cillero.es/manuelcillero/pagetop" %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} + {% for commit in commits %} {%- set msg = commit.message | split(pat="\n") @@ -41,8 +41,8 @@ body = """ | replace(from="📝 ", to="") | replace(from="💡 ", to="") -%} -{% set sha7 = commit.id | truncate(length=7, end="") %} -- {{ msg | trim }} ([{{ sha7 }}]({{ base }}/commit/{{ commit.id }}){% if commit.author.name != "Manuel Cillero" %} - {{ commit.author.name }}{% endif %}) + +- {{ msg | trim }} {% if commit.author.name != "Manuel Cillero" %} - {{ commit.author.name }}{% endif %} {% endfor %}{% endfor %} """ diff --git a/tools/changelog.sh b/tools/changelog.sh index 13333d4a..2668ec67 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -35,6 +35,10 @@ cd "$(dirname "$0")/.." || exit 1 # Determina ruta del archivo y ámbito de los archivos afectados para el crate # ------------------------------------------------------------------------------ case "$CRATE" in + pagetop-statics) + CHANGELOG_FILE="helpers/pagetop-statics/CHANGELOG.md" + PATH_FLAGS=(--include-path "helpers/pagetop-statics/**/*") + ;; pagetop-build) CHANGELOG_FILE="helpers/pagetop-build/CHANGELOG.md" PATH_FLAGS=(--include-path "helpers/pagetop-build/**/*") @@ -46,6 +50,7 @@ case "$CRATE" in pagetop) CHANGELOG_FILE="CHANGELOG.md" PATH_FLAGS=( + --exclude-path "helpers/pagetop-statics/**/*" --exclude-path "helpers/pagetop-build/**/*" --exclude-path "helpers/pagetop-macros/**/*" ) From cb1b6cbdac96baabeb3f3cadf5f3b7385b74ad7f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Aug 2025 10:27:39 +0200 Subject: [PATCH 740/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-statics=200.1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- helpers/pagetop-statics/CHANGELOG.md | 15 +++++++++++++++ helpers/pagetop-statics/Cargo.toml | 2 +- 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 helpers/pagetop-statics/CHANGELOG.md diff --git a/Cargo.lock b/Cargo.lock index 2f15a489..8427dd24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1605,7 +1605,7 @@ dependencies = [ [[package]] name = "pagetop-statics" -version = "0.0.1" +version = "0.1.0" dependencies = [ "actix-web", "change-detection", diff --git a/Cargo.toml b/Cargo.toml index 36007421..ff45ad3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,4 +73,4 @@ actix-web = { version = "4.11.0", default-features = false } pagetop-build = { version = "0.1", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.1", path = "helpers/pagetop-macros" } -pagetop-statics = { version = "0.0", path = "helpers/pagetop-statics" } +pagetop-statics = { version = "0.1", path = "helpers/pagetop-statics" } diff --git a/helpers/pagetop-statics/CHANGELOG.md b/helpers/pagetop-statics/CHANGELOG.md new file mode 100644 index 00000000..62ad97e8 --- /dev/null +++ b/helpers/pagetop-statics/CHANGELOG.md @@ -0,0 +1,15 @@ +# CHANGELOG + +Este archivo documenta los cambios más relevantes realizados en cada versión. El formato está basado +en [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/), y las versiones se numeran siguiendo +las reglas del [Versionado Semántico](https://semver.org/lang/es/). + +Resume la evolución del proyecto para usuarios y colaboradores, destacando nuevas funcionalidades, +correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o +internos pueden omitirse si no afectan al uso del proyecto. + +## 0.1.0 (2025-08-09) + +### Añadido + +- Versión inicial diff --git a/helpers/pagetop-statics/Cargo.toml b/helpers/pagetop-statics/Cargo.toml index f41cec76..e5c58d5e 100644 --- a/helpers/pagetop-statics/Cargo.toml +++ b/helpers/pagetop-statics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-statics" -version = "0.0.1" +version = "0.1.0" edition = "2021" description = """ From f7c1b56981e407a14ff28338b699a50ce88b045e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Aug 2025 10:30:53 +0200 Subject: [PATCH 741/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- helpers/pagetop-build/CHANGELOG.md | 11 +++++++++++ helpers/pagetop-build/Cargo.toml | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8427dd24..8f1450ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1587,7 +1587,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.1.1" +version = "0.2.0" dependencies = [ "grass", "pagetop-statics", diff --git a/Cargo.toml b/Cargo.toml index ff45ad3b..b3da8ca9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,6 +71,6 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] actix-web = { version = "4.11.0", default-features = false } -pagetop-build = { version = "0.1", path = "helpers/pagetop-build" } +pagetop-build = { version = "0.2", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.1", path = "helpers/pagetop-macros" } pagetop-statics = { version = "0.1", path = "helpers/pagetop-statics" } diff --git a/helpers/pagetop-build/CHANGELOG.md b/helpers/pagetop-build/CHANGELOG.md index 22429694..4d087556 100644 --- a/helpers/pagetop-build/CHANGELOG.md +++ b/helpers/pagetop-build/CHANGELOG.md @@ -8,6 +8,17 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.2.0 (2025-08-09) + +### Añadido + +- Añade librería propia para gestionar recursos estáticos (#1) + +### Otros cambios + +- 🩹 Corrige enlace del botón de licencia en la documentación +- 🚩 Afina Cargo.toml para buscar la mejor categoría + ## 0.1.1 (2025-08-05) - Depura la edición de CHANGELOGs y publicación de nuevas versiones diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 41e826e9..14e6000b 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.1.1" +version = "0.2.0" edition = "2021" description = """ From 3bb8b9c0515f09009eceb03b305af9741b061dc6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 9 Aug 2025 10:34:38 +0200 Subject: [PATCH 742/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop=200.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 12 ++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b01b9883..2248658d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,18 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.2.0 (2025-08-09) + +### Añadido + +- Añade librería para gestionar recursos estáticos (#1) +- Añade soporte a changelog de `pagetop-statics` (#2) + +### Otros cambios + +- 🩹 Corrige enlace del botón de licencia en la documentación +- 🚩 Afina Cargo.toml para buscar la mejor categoría + ## 0.1.0 (2025-08-06) - Versión inicial diff --git a/Cargo.lock b/Cargo.lock index 8f1450ae..22cf3086 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1557,7 +1557,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.1.0" +version = "0.2.0" dependencies = [ "actix-files", "actix-session", diff --git a/Cargo.toml b/Cargo.toml index b3da8ca9..cdeae782 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.1.0" +version = "0.2.0" edition = "2021" description = """ From b77e47d6e4073f3c9c46a4b66919a241d7597bcb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 10 Aug 2025 00:48:39 +0200 Subject: [PATCH 743/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mej?= =?UTF-8?q?ora=20funci=C3=B3n=20`from=5Fdir`=20por=20compatibilidad=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.cillero.es/manuelcillero/pagetop/pulls/3 Co-authored-by: Manuel Cillero <manuel@cillero.es> Co-committed-by: Manuel Cillero <manuel@cillero.es> --- helpers/pagetop-build/src/lib.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index b360377f..bb326063 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -129,8 +129,7 @@ use std::fs::{create_dir_all, remove_dir_all, File}; use std::io::Write; use std::path::Path; -/// Prepara un conjunto de recursos para ser incluidos en el binario del proyecto utilizando -/// [static_files](https://docs.rs/static-files/). +/// Prepara un conjunto de recursos para ser incluidos en el binario del proyecto. pub struct StaticFilesBundle { resource_dir: ResourceDir, } @@ -163,8 +162,19 @@ impl StaticFilesBundle { /// .build() /// } /// ``` - pub fn from_dir(dir: impl AsRef<str>, filter: Option<fn(p: &Path) -> bool>) -> Self { - let mut resource_dir = resource_dir(dir.as_ref()); + pub fn from_dir<P>(dir: P, filter: Option<fn(&Path) -> bool>) -> Self + where + P: AsRef<Path>, + { + let dir_path = dir.as_ref(); + let dir_str = dir_path.to_str().unwrap_or_else(|| { + panic!( + "Resource directory path is not valid UTF-8: {}", + dir_path.display() + ); + }); + + let mut resource_dir = resource_dir(dir_str); // Aplica el filtro si está definido. if let Some(f) = filter { From 168d5dc648784d334f197c6aaba801ea1e6b7c74 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 10 Aug 2025 01:10:05 +0200 Subject: [PATCH 744/853] =?UTF-8?q?=F0=9F=93=9D=20Cambia=20el=20formato=20?= =?UTF-8?q?para=20la=20documentaci=C3=B3n=20(#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.cillero.es/manuelcillero/pagetop/pulls/4 Co-authored-by: Manuel Cillero <manuel@cillero.es> Co-committed-by: Manuel Cillero <manuel@cillero.es> --- README.md | 14 +- helpers/pagetop-build/README.md | 101 ++++++++++++ helpers/pagetop-build/src/lib.rs | 240 +++++++++++++++-------------- helpers/pagetop-macros/README.md | 17 +- helpers/pagetop-macros/src/lib.rs | 49 +++--- helpers/pagetop-statics/README.md | 21 +-- helpers/pagetop-statics/src/lib.rs | 49 ++++-- src/lib.rs | 169 ++++++++++---------- 8 files changed, 404 insertions(+), 256 deletions(-) diff --git a/README.md b/README.md index fe85e665..e7fab94b 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) +<br> </div> `PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para @@ -32,7 +33,7 @@ según las necesidades de cada proyecto, incluyendo: La aplicación más sencilla de `PageTop` se ve así: -```rust +```rust,no_run use pagetop::prelude::*; #[pagetop::main] @@ -46,7 +47,7 @@ de bienvenida accesible desde un navegador local en la dirección `http://localh Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: -```rust +```rust,no_run use pagetop::prelude::*; struct HelloWorld; @@ -83,9 +84,14 @@ El código se organiza en un *workspace* donde actualmente se incluyen los sigui ## Auxiliares + * **[pagetop-statics](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-statics)**, + es la librería que permite incluir archivos estáticos en el ejecutable de las aplicaciones + `PageTop` para servirlos de forma eficiente, con detección de cambios que optimizan el tiempo + de compilación. + * **[pagetop-build](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-build)**, - permite incluir fácilmente archivos estáticos o archivos SCSS compilados directamente en el - binario de las aplicaciones `PageTop`. + prepara los archivos estáticos o archivos SCSS compilados para incluirlos en el binario de las + aplicaciones `PageTop` durante la compilación de los ejecutables. * **[pagetop-macros](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-macros)**, proporciona una colección de macros que mejoran la experiencia de desarrollo con `PageTop`. diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md index d9d52571..5af492b1 100644 --- a/helpers/pagetop-build/README.md +++ b/helpers/pagetop-build/README.md @@ -18,6 +18,107 @@ clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares configurables, basadas en HTML, CSS y JavaScript. +# ⚡️ Guía rápida + +Añadir en el archivo `Cargo.toml` del proyecto: + +```toml +[build-dependencies] +pagetop-build = { ... } +``` + +Y crear un archivo `build.rs` a la altura de `Cargo.toml` para indicar cómo se van a incluir los +archivos estáticos o cómo se van a compilar los archivos SCSS para el proyecto. Casos de uso: + +## Incluir archivos estáticos desde un directorio + +Hay que preparar una carpeta en el proyecto con todos los archivos que se quieren incluir, por +ejemplo `static`, y añadir el siguiente código en `build.rs` para crear el conjunto de recursos: + +```rust,no_run +use pagetop_build::StaticFilesBundle; + +fn main() -> std::io::Result<()> { + StaticFilesBundle::from_dir("./static", None) + .with_name("guides") + .build() +} +``` + +Si es necesario, se puede añadir un filtro para seleccionar archivos específicos de la carpeta, por +ejemplo: + +```rust,no_run +use pagetop_build::StaticFilesBundle; +use std::path::Path; + +fn main() -> std::io::Result<()> { + fn only_pdf_files(path: &Path) -> bool { + // Selecciona únicamente los archivos con extensión `.pdf`. + path.extension().map_or(false, |ext| ext == "pdf") + } + + StaticFilesBundle::from_dir("./static", Some(only_pdf_files)) + .with_name("guides") + .build() +} +``` + +## Compilar archivos SCSS a CSS + +Se puede compilar un archivo SCSS, que podría importar otros a su vez, para preparar un recurso con +el archivo CSS minificado obtenido. Por ejemplo: + +```rust,no_run +use pagetop_build::StaticFilesBundle; + +fn main() -> std::io::Result<()> { + StaticFilesBundle::from_scss("./styles/main.scss", "styles.min.css") + .with_name("main_styles") + .build() +} +``` + +Este código compila el archivo `main.scss` de la carpeta `static` del proyecto, y prepara un recurso +llamado `main_styles` que contiene el archivo `styles.min.css` obtenido. + + +# 📦 Módulos generados + +Cada conjunto de recursos [`StaticFilesBundle`] genera un archivo en el directorio estándar +[OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts) +donde se incluyen los recursos necesarios para compilar el proyecto. Por ejemplo, para +`with_name("guides")` se crea un archivo llamado `guides.rs`. + +No hay ningún problema en generar más de un conjunto de recursos para cada proyecto. + +Normalmente no habrá que acceder a estos módulos; bastará con incluirlos en el proyecto con +[`include_files!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files.html), y luego con +[`include_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files_service.html) +configurar un servicio web para servir los recursos desde la ruta indicada: + +```rust,ignore +use pagetop::prelude::*; + +include_files!(guides); + +pub struct MyExtension; + +impl Extension for MyExtension { + // Servicio web que publica los recursos de `guides` en `/ruta/a/guides`. + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + include_files_service!(scfg, guides => "/ruta/a/guides"); + } +} +``` + +También se puede asignar el conjunto de recursos a una variable global; p.ej. `GUIDES`: + +```rust,ignore +include_files!(GUIDES => guides); +``` + + # 🚧 Advertencia `PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index bb326063..09dec428 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -1,122 +1,124 @@ -//! <div align="center"> -//! -//! <h1>PageTop Build</h1> -//! -//! <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> -//! -//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) -//! [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) -//! [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) -//! [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) -//! -//! </div> -//! -//! ## Sobre PageTop -//! -//! [PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la -//! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles -//! y configurables, basadas en HTML, CSS y JavaScript. -//! -//! -//! # ⚡️ Guía rápida -//! -//! Añadir en el archivo `Cargo.toml` del proyecto: -//! -//! ```toml -//! [build-dependencies] -//! pagetop-build = { ... } -//! ``` -//! -//! Y crear un archivo `build.rs` a la altura de `Cargo.toml` para indicar cómo se van a incluir los -//! archivos estáticos o cómo se van a compilar los archivos SCSS para el proyecto. Casos de uso: -//! -//! ## Incluir archivos estáticos desde un directorio -//! -//! Hay que preparar una carpeta en el proyecto con todos los archivos que se quieren incluir, por -//! ejemplo `static`, y añadir el siguiente código en `build.rs` para crear el conjunto de recursos: -//! -//! ```rust,no_run -//! use pagetop_build::StaticFilesBundle; -//! -//! fn main() -> std::io::Result<()> { -//! StaticFilesBundle::from_dir("./static", None) -//! .with_name("guides") -//! .build() -//! } -//! ``` -//! -//! Si es necesario, se puede añadir un filtro para seleccionar archivos específicos de la carpeta, -//! por ejemplo: -//! -//! ```rust,no_run -//! use pagetop_build::StaticFilesBundle; -//! use std::path::Path; -//! -//! fn main() -> std::io::Result<()> { -//! fn only_pdf_files(path: &Path) -> bool { -//! // Selecciona únicamente los archivos con extensión `.pdf`. -//! path.extension().map_or(false, |ext| ext == "pdf") -//! } -//! -//! StaticFilesBundle::from_dir("./static", Some(only_pdf_files)) -//! .with_name("guides") -//! .build() -//! } -//! ``` -//! -//! ## Compilar archivos SCSS a CSS -//! -//! Se puede compilar un archivo SCSS, que podría importar otros a su vez, para preparar un recurso -//! con el archivo CSS minificado obtenido. Por ejemplo: -//! -//! ```rust,no_run -//! use pagetop_build::StaticFilesBundle; -//! -//! fn main() -> std::io::Result<()> { -//! StaticFilesBundle::from_scss("./styles/main.scss", "styles.min.css") -//! .with_name("main_styles") -//! .build() -//! } -//! ``` -//! -//! Este código compila el archivo `main.scss` de la carpeta `static` del proyecto, y prepara un -//! recurso llamado `main_styles` que contiene el archivo `styles.min.css` obtenido. -//! -//! -//! # 📦 Módulos generados -//! -//! Cada conjunto de recursos [`StaticFilesBundle`] genera un archivo en el directorio estándar -//! [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts) -//! donde se incluyen los recursos necesarios para compilar el proyecto. Por ejemplo, para -//! `with_name("guides")` se crea un archivo llamado `guides.rs`. -//! -//! No hay ningún problema en generar más de un conjunto de recursos para cada proyecto. -//! -//! Normalmente no habrá que acceder a estos módulos; bastará con incluirlos en el proyecto con -//! [`include_files!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files.html), y luego con -//! [`include_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files_service.html) -//! configurar un servicio web para servir los recursos desde la ruta indicada: -//! -//! ```rust,ignore -//! use pagetop::prelude::*; -//! -//! include_files!(guides); -//! -//! pub struct MyExtension; -//! -//! impl Extension for MyExtension { -//! // Servicio web que publica los recursos de `guides` en `/ruta/a/guides`. -//! fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { -//! include_files_service!(scfg, guides => "/ruta/a/guides"); -//! } -//! } -//! ``` -//! -//! También se puede asignar el conjunto de recursos a una variable global; p.ej. `GUIDES`: -//! -//! ```rust,ignore -//! include_files!(GUIDES => guides); -//! ``` +/*! +<div align="center"> + +<h1>PageTop Build</h1> + +<p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) +[![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) +[![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) + +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# ⚡️ Guía rápida + +Añadir en el archivo `Cargo.toml` del proyecto: + +```toml +[build-dependencies] +pagetop-build = { ... } +``` + +Y crear un archivo `build.rs` a la altura de `Cargo.toml` para indicar cómo se van a incluir los +archivos estáticos o cómo se van a compilar los archivos SCSS para el proyecto. Casos de uso: + +## Incluir archivos estáticos desde un directorio + +Hay que preparar una carpeta en el proyecto con todos los archivos que se quieren incluir, por +ejemplo `static`, y añadir el siguiente código en `build.rs` para crear el conjunto de recursos: + +```rust,no_run +use pagetop_build::StaticFilesBundle; + +fn main() -> std::io::Result<()> { + StaticFilesBundle::from_dir("./static", None) + .with_name("guides") + .build() +} +``` + +Si es necesario, se puede añadir un filtro para seleccionar archivos específicos de la carpeta, por +ejemplo: + +```rust,no_run +use pagetop_build::StaticFilesBundle; +use std::path::Path; + +fn main() -> std::io::Result<()> { + fn only_pdf_files(path: &Path) -> bool { + // Selecciona únicamente los archivos con extensión `.pdf`. + path.extension().map_or(false, |ext| ext == "pdf") + } + + StaticFilesBundle::from_dir("./static", Some(only_pdf_files)) + .with_name("guides") + .build() +} +``` + +## Compilar archivos SCSS a CSS + +Se puede compilar un archivo SCSS, que podría importar otros a su vez, para preparar un recurso con +el archivo CSS minificado obtenido. Por ejemplo: + +```rust,no_run +use pagetop_build::StaticFilesBundle; + +fn main() -> std::io::Result<()> { + StaticFilesBundle::from_scss("./styles/main.scss", "styles.min.css") + .with_name("main_styles") + .build() +} +``` + +Este código compila el archivo `main.scss` de la carpeta `static` del proyecto, y prepara un recurso +llamado `main_styles` que contiene el archivo `styles.min.css` obtenido. + + +# 📦 Módulos generados + +Cada conjunto de recursos [`StaticFilesBundle`] genera un archivo en el directorio estándar +[OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts) +donde se incluyen los recursos necesarios para compilar el proyecto. Por ejemplo, para +`with_name("guides")` se crea un archivo llamado `guides.rs`. + +No hay ningún problema en generar más de un conjunto de recursos para cada proyecto. + +Normalmente no habrá que acceder a estos módulos; bastará con incluirlos en el proyecto con +[`include_files!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files.html), y luego con +[`include_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files_service.html) +configurar un servicio web para servir los recursos desde la ruta indicada: + +```rust,ignore +use pagetop::prelude::*; + +include_files!(guides); + +pub struct MyExtension; + +impl Extension for MyExtension { + // Servicio web que publica los recursos de `guides` en `/ruta/a/guides`. + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + include_files_service!(scfg, guides => "/ruta/a/guides"); + } +} +``` + +También se puede asignar el conjunto de recursos a una variable global; p.ej. `GUIDES`: + +```rust,ignore +include_files!(GUIDES => guides); +``` +*/ #![doc( html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index c5006a87..e58d24c7 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -11,9 +11,16 @@ </div> -## Descripción general +## Sobre PageTop -Entre sus macros se incluye una adaptación de [maud-macros](https://crates.io/crates/maud_macros) +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + +## Créditos + +Esta librería incluye entre sus macros una adaptación de +[maud-macros](https://crates.io/crates/maud_macros) ([0.27.0](https://github.com/lambda-fairy/maud/tree/v0.27.0/maud_macros)) de [Chris Wong](https://crates.io/users/lambda-fairy) y una versión renombrada de [SmartDefault](https://crates.io/crates/smart_default) (0.7.1) de @@ -21,12 +28,6 @@ Entre sus macros se incluye una adaptación de [maud-macros](https://crates.io/c necesidad de referenciar `maud` o `smart_default` en las dependencias del archivo `Cargo.toml` de cada proyecto `PageTop`. -## Sobre PageTop - -[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web -clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y -configurables, basadas en HTML, CSS y JavaScript. - # 🚧 Advertencia diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 496ce82b..6421ca6e 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -1,21 +1,34 @@ -//! <div align="center"> -//! -//! <h1>PageTop Macros</h1> -//! -//! <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> -//! -//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) -//! [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) -//! [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) -//! [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) -//! -//! </div> -//! -//! ## Sobre PageTop -//! -//! [PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la -//! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles -//! y configurables, basadas en HTML, CSS y JavaScript. +/*! +<div align="center"> + +<h1>PageTop Macros</h1> + +<p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) +[![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) +[![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) + +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + +## Créditos + +Esta librería incluye entre sus macros una adaptación de +[maud-macros](https://crates.io/crates/maud_macros) +([0.27.0](https://github.com/lambda-fairy/maud/tree/v0.27.0/maud_macros)) de +[Chris Wong](https://crates.io/users/lambda-fairy) y una versión renombrada de +[SmartDefault](https://crates.io/crates/smart_default) (0.7.1) de +[Jane Doe](https://crates.io/users/jane-doe), llamada `AutoDefault`. Estas macros eliminan la +necesidad de referenciar `maud` o `smart_default` en las dependencias del archivo `Cargo.toml` de +cada proyecto `PageTop`. +*/ #![doc( html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" diff --git a/helpers/pagetop-statics/README.md b/helpers/pagetop-statics/README.md index c053e955..92999c04 100644 --- a/helpers/pagetop-statics/README.md +++ b/helpers/pagetop-statics/README.md @@ -8,12 +8,21 @@ </div> +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + ## Descripción general -Permite a `PageTop` incluir archivos estáticos en el ejecutable de la aplicación para servirlos de -forma eficiente vía web, con detección de cambios que optimiza el tiempo de compilación. +Esta librería permite incluir archivos estáticos en el ejecutable de las aplicaciones `PageTop` para +servirlos de forma eficiente vía web, con detección de cambios que optimizan el tiempo de +compilación. -Para ello, reúne el código de los *crates* [static-files](https://crates.io/crates/static_files) +## Créditos + +Para ello, adapta el código de los *crates* [static-files](https://crates.io/crates/static_files) (versión [0.2.5](https://github.com/static-files-rs/static-files/tree/v0.2.5)) y [actix-web-static-files](https://crates.io/crates/actix_web_static_files) (versión [4.0.1](https://github.com/kilork/actix-web-static-files/tree/v4.0.1)), desarrollados ambos por @@ -22,12 +31,6 @@ Para ello, reúne el código de los *crates* [static-files](https://crates.io/cr Estas implementaciones se integran en `PageTop` para evitar que cada proyecto tenga que declarar `static-files` manualmente como dependencia en su `Cargo.toml`. -## Sobre PageTop - -[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web -clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y -configurables, basadas en HTML, CSS y JavaScript. - # 🚧 Advertencia diff --git a/helpers/pagetop-statics/src/lib.rs b/helpers/pagetop-statics/src/lib.rs index fffd1ae3..dab50d9e 100644 --- a/helpers/pagetop-statics/src/lib.rs +++ b/helpers/pagetop-statics/src/lib.rs @@ -1,18 +1,37 @@ -//! <div align="center"> -//! -//! <h1>PageTop Statics</h1> -//! -//! <p>Librería para automatizar la recopilación de recursos estáticos en <strong>PageTop</strong>.</p> -//! -//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) -//! -//! </div> -//! -//! ## Sobre PageTop -//! -//! [PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la -//! web clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles -//! y configurables, basadas en HTML, CSS y JavaScript. +/*! +<div align="center"> + +<h1>PageTop Statics</h1> + +<p>Librería para automatizar la recopilación de recursos estáticos en <strong>PageTop</strong>.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) + +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + +## Descripción general + +Esta librería permite incluir archivos estáticos en el ejecutable de las aplicaciones `PageTop` para +servirlos de forma eficiente vía web, con detección de cambios que optimizan el tiempo de +compilación. + +## Créditos + +Para ello, adapta el código de los *crates* [static-files](https://crates.io/crates/static_files) +(versión [0.2.5](https://github.com/static-files-rs/static-files/tree/v0.2.5)) y +[actix-web-static-files](https://crates.io/crates/actix_web_static_files) (versión +[4.0.1](https://github.com/kilork/actix-web-static-files/tree/v4.0.1)), desarrollados ambos por +[Alexander Korolev](https://crates.io/users/kilork). + +Estas implementaciones se integran en `PageTop` para evitar que cada proyecto tenga que declarar +`static-files` manualmente como dependencia en su `Cargo.toml`. +*/ #![doc(test(no_crate_inject))] #![doc( diff --git a/src/lib.rs b/src/lib.rs index bbc45302..d50a4489 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,86 +1,89 @@ -//! <div align="center"> -//! -//! <img src="https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/banner.png" /> -//! -//! <h1>PageTop</h1> -//! -//! <p>Un entorno de desarrollo para crear soluciones web modulares, extensibles y configurables.</p> -//! -//! [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) -//! [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) -//! [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) -//! [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) -//! -//! <br> -//! </div> -//! -//! `PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) -//! para la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y -//! JavaScript. Ofrece un conjunto de herramientas que los desarrolladores pueden implementar, -//! extender o adaptar según las necesidades de cada proyecto, incluyendo: -//! -//! * **Acciones** (*actions*): alteran la lógica interna de una funcionalidad interceptando su -//! flujo de ejecución. -//! * **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales, -//! configurables y reutilizables. -//! * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las -//! APIs de `PageTop` o de terceros. -//! * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y -//! componentes sin comprometer su funcionalidad. -//! -//! # ⚡️ Guía rápida -//! -//! La aplicación más sencilla de `PageTop` se ve así: -//! -//! ```rust,no_run -//! use pagetop::prelude::*; -//! -//! #[pagetop::main] -//! async fn main() -> std::io::Result<()> { -//! Application::new().run()?.await -//! } -//! ``` -//! -//! Este código arranca el servidor de `PageTop`. Con la -//! [configuración por defecto](crate::global::SETTINGS), muestra una página de bienvenida accesible -//! desde un navegador local en la dirección `http://localhost:8080`. -//! -//! Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: -//! -//! ```rust,no_run -//! use pagetop::prelude::*; -//! -//! struct HelloWorld; -//! -//! impl Extension for HelloWorld { -//! fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { -//! scfg.route("/", service::web::get().to(hello_world)); -//! } -//! } -//! -//! async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { -//! Page::new(Some(request)) -//! .with_component(Html::with(move |_| html! { h1 { "Hello world!" } })) -//! .render() -//! } -//! -//! #[pagetop::main] -//! async fn main() -> std::io::Result<()> { -//! Application::prepare(&HelloWorld).run()?.await -//! } -//! ``` -//! -//! Este programa implementa una extensión llamada `HelloWorld` que sirve una página web en la ruta -//! raíz (`/`) mostrando el texto "Hello world!" dentro de un elemento HTML `<h1>`. -//! -//! # 🧩 Gestión de Dependencias -//! -//! Los proyectos que utilizan `PageTop` gestionan las dependencias con `cargo`, como cualquier otro -//! proyecto en Rust. -//! -//! Sin embargo, es fundamental que cada extensión declare explícitamente sus -//! [dependencias](core::extension::Extension::dependencies), si las tiene, para que `PageTop` pueda -//! estructurar e inicializar la aplicación de forma modular. +/*! +<div align="center"> + +<img src="https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/banner.png" /> + +<h1>PageTop</h1> + +<p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) +[![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) +[![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) + +<br> +</div> + +`PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para +la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. +Ofrece un conjunto de herramientas que los desarrolladores pueden implementar, extender o adaptar +según las necesidades de cada proyecto, incluyendo: + + * **Acciones** (*actions*): alteran la lógica interna de una funcionalidad interceptando su flujo + de ejecución. + * **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales, + configurables y reutilizables. + * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las APIs + de `PageTop` o de terceros. + * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y + componentes sin comprometer su funcionalidad. + + +# ⚡️ Guía rápida + +La aplicación más sencilla de `PageTop` se ve así: + +```rust,no_run +use pagetop::prelude::*; + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::new().run()?.await +} +``` + +Este código arranca el servidor de `PageTop`. Con la configuración por defecto, muestra una página +de bienvenida accesible desde un navegador local en la dirección `http://localhost:8080`. + +Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: + +```rust,no_run +use pagetop::prelude::*; + +struct HelloWorld; + +impl Extension for HelloWorld { + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + scfg.route("/", service::web::get().to(hello_world)); + } +} + +async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Page::new(Some(request)) + .with_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + .render() +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&HelloWorld).run()?.await +} +``` + +Este programa implementa una extensión llamada `HelloWorld` que sirve una página web en la ruta raíz +(`/`) mostrando el texto "Hello world!" dentro de un elemento HTML `<h1>`. + + +# 🧩 Gestión de Dependencias + +Los proyectos que utilizan `PageTop` gestionan las dependencias con `cargo`, como cualquier otro +proyecto en Rust. + +Sin embargo, es fundamental que cada extensión declare explícitamente sus +[dependencias](core::extension::Extension::dependencies), si las tiene, para que `PageTop` pueda +estructurar e inicializar la aplicación de forma modular. +*/ #![cfg_attr(docsrs, feature(doc_cfg))] #![doc( From 801642faabbbe9b29d397790ae40eaaf6d29ca03 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Aug 2025 11:54:48 +0200 Subject: [PATCH 745/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Red?= =?UTF-8?q?efine=20funci=C3=B3n=20para=20directorios=20absolutos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.rs | 27 +++++++---------------- src/util.rs | 53 ++++++++++++++++++++++++++++++--------------- tests/util.rs | 60 +++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 95 insertions(+), 45 deletions(-) diff --git a/src/config.rs b/src/config.rs index 08067fe6..27cf630e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -110,11 +110,13 @@ //! } //! ``` +use crate::util; + use config::builder::DefaultState; use config::{Config, ConfigBuilder, File}; use std::env; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use std::sync::LazyLock; // Nombre del directorio de configuración por defecto. @@ -125,25 +127,12 @@ const DEFAULT_RUN_MODE: &str = "default"; /// Valores originales cargados desde los archivos de configuración como pares `clave = valor`. pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new(|| { - // Determina el directorio de configuración: - // - Usa CONFIG_DIR si está definido en el entorno (p.ej.: CONFIG_DIR=/etc/myapp ./myapp). - // - Si no, intenta DEFAULT_CONFIG_DIR dentro del proyecto (en CARGO_MANIFEST_DIR). - // - Si nada de esto aplica, entonces usa DEFAULT_CONFIG_DIR relativo al ejecutable. - let config_dir: PathBuf = if let Ok(env_dir) = env::var("CONFIG_DIR") { - env_dir.into() - } else if let Ok(manifest_dir) = env::var("CARGO_MANIFEST_DIR") { - let manifest_config = Path::new(&manifest_dir).join(DEFAULT_CONFIG_DIR); - if manifest_config.exists() { - manifest_config - } else { - DEFAULT_CONFIG_DIR.into() - } - } else { - DEFAULT_CONFIG_DIR.into() - }; + // CONFIG_DIR (si existe) o DEFAULT_CONFIG_DIR. Si no se puede resolver, se usa tal cual. + let dir = env::var_os("CONFIG_DIR").unwrap_or_else(|| DEFAULT_CONFIG_DIR.into()); + let config_dir = util::resolve_absolute_dir(&dir).unwrap_or_else(|_| PathBuf::from(&dir)); - // Determina el modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Por defecto usa - // DEFAULT_RUN_MODE si no está definida (p.ej.: PAGETOP_RUN_MODE=production ./myapp). + // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Si no está definida, se usa + // por defecto, DEFAULT_RUN_MODE (p.ej.: PAGETOP_RUN_MODE=production). let rm = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| DEFAULT_RUN_MODE.into()); Config::builder() diff --git a/src/util.rs b/src/util.rs index b605125f..21537c5d 100644 --- a/src/util.rs +++ b/src/util.rs @@ -2,35 +2,44 @@ use crate::trace; +use std::env; use std::io; use std::path::{Path, PathBuf}; // FUNCIONES ÚTILES ******************************************************************************** -/// Devuelve la ruta absoluta a un directorio existente. +/// Resuelve y valida la ruta de un directorio existente, devolviendo una ruta absoluta. /// -/// * Si `relative_path` es una ruta absoluta, entonces se ignora `root_path`. -/// * Si la ruta final es relativa, se convierte en absoluta respecto al directorio actual. -/// * Devuelve error si la ruta no existe o no es un directorio. +/// - Si la ruta es relativa, se resuelve respecto al directorio del proyecto según la variable de +/// entorno `CARGO_MANIFEST_DIR` (si existe) o, en su defecto, respecto al directorio actual de +/// trabajo. +/// - Normaliza y valida la ruta final (resuelve `.`/`..` y enlaces simbólicos). +/// - Devuelve error si la ruta no existe o no es un directorio. /// -/// # Ejemplo +/// # Ejemplos /// /// ```rust,no_run /// use pagetop::prelude::*; /// -/// let root = "/home/user"; -/// let rel = "documents"; -/// println!("{:#?}", util::absolute_dir(root, rel)); +/// // Ruta relativa, se resuelve respecto a CARGO_MANIFEST_DIR o al directorio actual (`cwd`). +/// println!("{:#?}", util::resolve_absolute_dir("documents")); +/// +/// // Ruta absoluta, se normaliza y valida tal cual. +/// println!("{:#?}", util::resolve_absolute_dir("/var/www")); /// ``` -pub fn absolute_dir<P, Q>(root_path: P, relative_path: Q) -> io::Result<PathBuf> -where - P: AsRef<Path>, - Q: AsRef<Path>, -{ - // Une ambas rutas: - // - Si `relative_path` es absoluta, el `join` la devuelve tal cual, descartando `root_path`. - // - Si el resultado es aún relativo, lo será respecto al directorio actual. - let candidate = root_path.as_ref().join(relative_path.as_ref()); +pub fn resolve_absolute_dir<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> { + let path = path.as_ref(); + + let candidate = if path.is_absolute() { + path.to_path_buf() + } else { + // Directorio base CARGO_MANIFEST_DIR si está disponible; o current_dir() en su defecto. + env::var_os("CARGO_MANIFEST_DIR") + .map(PathBuf::from) + .or_else(|| env::current_dir().ok()) + .unwrap_or_else(|| PathBuf::from(".")) + .join(path) + }; // Resuelve `.`/`..`, enlaces simbólicos y obtiene la ruta absoluta en un único paso. let absolute_dir = candidate.canonicalize()?; @@ -47,6 +56,16 @@ where } } +/// Devuelve la ruta absoluta a un directorio existente. +#[deprecated(since = "0.3.0", note = "Use [`resolve_absolute_dir`] instead")] +pub fn absolute_dir<P, Q>(root_path: P, relative_path: Q) -> io::Result<PathBuf> +where + P: AsRef<Path>, + Q: AsRef<Path>, +{ + resolve_absolute_dir(root_path.as_ref().join(relative_path.as_ref())) +} + // MACROS ÚTILES *********************************************************************************** #[doc(hidden)] diff --git a/tests/util.rs b/tests/util.rs index 6e0896ff..70699a74 100644 --- a/tests/util.rs +++ b/tests/util.rs @@ -1,6 +1,6 @@ use pagetop::prelude::*; -use std::{fs, io}; +use std::{env, fs, io}; use tempfile::TempDir; #[cfg(unix)] @@ -13,15 +13,36 @@ mod unix { // /tmp/<rand>/sub let td = TempDir::new()?; - let root = td.path(); - let sub = root.join("sub"); + let sub = td.path().join("sub"); fs::create_dir(&sub)?; - let abs = util::absolute_dir(root, "sub")?; + let abs = util::resolve_absolute_dir(&sub)?; assert_eq!(abs, std::fs::canonicalize(&sub)?); Ok(()) } + #[pagetop::test] + async fn ok_relative_dir_with_manifest() -> io::Result<()> { + let _app = service::test::init_service(Application::new().test()).await; + + let td = TempDir::new()?; + let sub = td.path().join("sub"); + fs::create_dir(&sub)?; + + // Fija CARGO_MANIFEST_DIR para que "sub" se resuelva contra td.path() + let prev_manifest_dir = env::var_os("CARGO_MANIFEST_DIR"); + env::set_var("CARGO_MANIFEST_DIR", td.path()); + let res = util::resolve_absolute_dir("sub"); + // Restaura entorno. + match prev_manifest_dir { + Some(v) => env::set_var("CARGO_MANIFEST_DIR", v), + None => env::remove_var("CARGO_MANIFEST_DIR"), + } + + assert_eq!(res?, std::fs::canonicalize(&sub)?); + Ok(()) + } + #[pagetop::test] async fn error_not_a_directory() -> io::Result<()> { let _app = service::test::init_service(Application::new().test()).await; @@ -30,7 +51,7 @@ mod unix { let file = td.path().join("foo.txt"); fs::write(&file, b"data")?; - let err = util::absolute_dir(td.path(), "foo.txt").unwrap_err(); + let err = util::resolve_absolute_dir(&file).unwrap_err(); assert_eq!(err.kind(), io::ErrorKind::InvalidInput); Ok(()) } @@ -46,15 +67,36 @@ mod windows { // C:\Users\...\Temp\... let td = TempDir::new()?; - let root = td.path(); - let sub = root.join("sub"); + let sub = td.path().join("sub"); fs::create_dir(&sub)?; - let abs = util::absolute_dir(root, sub.as_path())?; + let abs = util::resolve_absolute_dir(&sub)?; assert_eq!(abs, std::fs::canonicalize(&sub)?); Ok(()) } + #[pagetop::test] + async fn ok_relative_dir_with_manifest() -> io::Result<()> { + let _app = service::test::init_service(Application::new().test()).await; + + let td = TempDir::new()?; + let sub = td.path().join("sub"); + fs::create_dir(&sub)?; + + // Fija CARGO_MANIFEST_DIR para que "sub" se resuelva contra td.path() + let prev_manifest_dir = env::var_os("CARGO_MANIFEST_DIR"); + env::set_var("CARGO_MANIFEST_DIR", td.path()); + let res = util::resolve_absolute_dir("sub"); + // Restaura entorno. + match prev_manifest_dir { + Some(v) => env::set_var("CARGO_MANIFEST_DIR", v), + None => env::remove_var("CARGO_MANIFEST_DIR"), + } + + assert_eq!(res?, std::fs::canonicalize(&sub)?); + Ok(()) + } + #[pagetop::test] async fn error_not_a_directory() -> io::Result<()> { let _app = service::test::init_service(Application::new().test()).await; @@ -63,7 +105,7 @@ mod windows { let file = td.path().join("foo.txt"); fs::write(&file, b"data")?; - let err = util::absolute_dir(td.path(), "foo.txt").unwrap_err(); + let err = util::resolve_absolute_dir(&file).unwrap_err(); assert_eq!(err.kind(), io::ErrorKind::InvalidInput); Ok(()) } From 69fac6d9ea949b664c80bc281d947614ffa8c304 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Aug 2025 12:15:16 +0200 Subject: [PATCH 746/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mej?= =?UTF-8?q?ora=20la=20integraci=C3=B3n=20de=20archivos=20est=C3=A1ticos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elimina el uso de `include_files!` y sustituye `include_files_service!` por alternativas más completas ofreciadas por `static_files_service!`. --- helpers/pagetop-build/README.md | 26 +++---- helpers/pagetop-build/src/lib.rs | 26 +++---- src/core/extension/all.rs | 8 +-- src/global.rs | 16 +++-- src/html/assets/favicon.rs | 3 +- src/html/assets/javascript.rs | 3 +- src/html/assets/stylesheet.rs | 3 +- src/lib.rs | 3 +- src/prelude.rs | 3 +- src/service.rs | 119 +++++++++++++++++++++++++++++++ 10 files changed, 156 insertions(+), 54 deletions(-) diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md index 5af492b1..80d6bba2 100644 --- a/helpers/pagetop-build/README.md +++ b/helpers/pagetop-build/README.md @@ -83,41 +83,33 @@ Este código compila el archivo `main.scss` de la carpeta `static` del proyecto, llamado `main_styles` que contiene el archivo `styles.min.css` obtenido. -# 📦 Módulos generados +# 📦 Archivos generados Cada conjunto de recursos [`StaticFilesBundle`] genera un archivo en el directorio estándar [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts) -donde se incluyen los recursos necesarios para compilar el proyecto. Por ejemplo, para -`with_name("guides")` se crea un archivo llamado `guides.rs`. +donde se incluye el código necesario para compilar el proyecto. Por ejemplo, para +`with_name("guides")` se genera un archivo llamado `guides.rs`. -No hay ningún problema en generar más de un conjunto de recursos para cada proyecto. +No hay ningún problema en generar más de un conjunto de recursos para cada proyecto siempre que se +usen nombres diferentes. -Normalmente no habrá que acceder a estos módulos; bastará con incluirlos en el proyecto con -[`include_files!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files.html), y luego con -[`include_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files_service.html) -configurar un servicio web para servir los recursos desde la ruta indicada: +Normalmente no habrá que acceder a estos módulos; sólo declarar el nombre del conjunto de recursos +en [`static_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.static_files_service.html) +para configurar un servicio web que sirva los archivos desde la ruta indicada. Por ejemplo: ```rust,ignore use pagetop::prelude::*; -include_files!(guides); - pub struct MyExtension; impl Extension for MyExtension { // Servicio web que publica los recursos de `guides` en `/ruta/a/guides`. fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - include_files_service!(scfg, guides => "/ruta/a/guides"); + static_files_service!(scfg, guides => "/ruta/a/guides"); } } ``` -También se puede asignar el conjunto de recursos a una variable global; p.ej. `GUIDES`: - -```rust,ignore -include_files!(GUIDES => guides); -``` - # 🚧 Advertencia diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index 09dec428..c6e72367 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -84,40 +84,32 @@ Este código compila el archivo `main.scss` de la carpeta `static` del proyecto, llamado `main_styles` que contiene el archivo `styles.min.css` obtenido. -# 📦 Módulos generados +# 📦 Archivos generados Cada conjunto de recursos [`StaticFilesBundle`] genera un archivo en el directorio estándar [OUT_DIR](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts) -donde se incluyen los recursos necesarios para compilar el proyecto. Por ejemplo, para -`with_name("guides")` se crea un archivo llamado `guides.rs`. +donde se incluye el código necesario para compilar el proyecto. Por ejemplo, para +`with_name("guides")` se genera un archivo llamado `guides.rs`. -No hay ningún problema en generar más de un conjunto de recursos para cada proyecto. +No hay ningún problema en generar más de un conjunto de recursos para cada proyecto siempre que se +usen nombres diferentes. -Normalmente no habrá que acceder a estos módulos; bastará con incluirlos en el proyecto con -[`include_files!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files.html), y luego con -[`include_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.include_files_service.html) -configurar un servicio web para servir los recursos desde la ruta indicada: +Normalmente no habrá que acceder a estos módulos; sólo declarar el nombre del conjunto de recursos +en [`static_files_service!`](https://docs.rs/pagetop/latest/pagetop/macro.static_files_service.html) +para configurar un servicio web que sirva los archivos desde la ruta indicada. Por ejemplo: ```rust,ignore use pagetop::prelude::*; -include_files!(guides); - pub struct MyExtension; impl Extension for MyExtension { // Servicio web que publica los recursos de `guides` en `/ruta/a/guides`. fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - include_files_service!(scfg, guides => "/ruta/a/guides"); + static_files_service!(scfg, guides => "/ruta/a/guides"); } } ``` - -También se puede asignar el conjunto de recursos a una variable global; p.ej. `GUIDES`: - -```rust,ignore -include_files!(GUIDES => guides); -``` */ #![doc( diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index 93b5c4bd..a243778c 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -1,7 +1,7 @@ use crate::core::action::add_action; use crate::core::extension::ExtensionRef; use crate::core::theme::all::THEMES; -use crate::{global, include_files, include_files_service, service, trace}; +use crate::{global, service, static_files_service, trace}; use parking_lot::RwLock; @@ -125,8 +125,6 @@ pub fn initialize_extensions() { // CONFIGURA LOS SERVICIOS ************************************************************************* -include_files!(assets); - pub fn configure_services(scfg: &mut service::web::ServiceConfig) { // Sólo compila durante el desarrollo, para evitar errores 400 en la traza de eventos. #[cfg(debug_assertions)] @@ -140,7 +138,5 @@ pub fn configure_services(scfg: &mut service::web::ServiceConfig) { extension.configure_service(scfg); } - include_files_service!( - scfg, assets => "/", [&global::SETTINGS.dev.pagetop_project_dir, "static"] - ); + static_files_service!(scfg, [&global::SETTINGS.dev.pagetop_static_dir, assets] => "/"); } diff --git a/src/global.rs b/src/global.rs index ea659b8b..8a03589c 100644 --- a/src/global.rs +++ b/src/global.rs @@ -13,7 +13,7 @@ include_config!(SETTINGS: Settings => [ "app.startup_banner" => "Slant", // [dev] - "dev.pagetop_project_dir" => "", + "dev.pagetop_static_dir" => "", // [log] "log.enabled" => true, @@ -68,11 +68,15 @@ pub struct App { #[derive(Debug, Deserialize)] /// Sección `[Dev]` de la configuración. Forma parte de [`Settings`]. pub struct Dev { - /// Los archivos estáticos requeridos por `PageTop` se integran por defecto en el binario - /// ejecutable. Sin embargo, durante el desarrollo puede resultar útil servirlos desde su propio - /// directorio para evitar recompilar cada vez que se modifican. En ese caso, este ajuste debe - /// indicar la ruta absoluta al directorio raíz del proyecto. - pub pagetop_project_dir: String, + /// Directorio desde el que servir los archivos estáticos de `PageTop`. + /// + /// Por defecto, los archivos se integran en el binario de la aplicación. Si aquí se indica una + /// ruta válida, ya sea absoluta o relativa al directorio del proyecto o del binario en + /// ejecución, se servirán desde el sistema de ficheros en su lugar. Esto es especialmente útil + /// en desarrollo, ya que evita recompilar el proyecto por cambios en estos archivos. + /// + /// Si la cadena está vacía, se ignora este ajuste. + pub pagetop_static_dir: String, } #[derive(Debug, Deserialize)] diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index 2af01730..1a8b29e7 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -12,8 +12,7 @@ use crate::AutoDefault; /// /// > **Nota** /// > Los archivos de los iconos deben estar disponibles en el servidor web de la aplicación. Pueden -/// > incluirse en el proyecto utilizando [`include_files!`](crate::include_files) y servirse con -/// > [`include_files_service!`](crate::include_files_service). +/// > servirse usando [`static_files_service!`](crate::static_files_service). /// /// # Ejemplo /// diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index 604e85ae..db5754e9 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -30,8 +30,7 @@ enum Source { /// /// > **Nota** /// > Los archivos de los *scripts* deben estar disponibles en el servidor web de la aplicación. -/// > Pueden incluirse en el proyecto utilizando [`include_files!`](crate::include_files) y servirse -/// > con [`include_files_service!`](crate::include_files_service). +/// > Pueden servirse usando [`static_files_service!`](crate::static_files_service). /// /// # Ejemplo /// diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 72a79a10..bb60b01c 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -55,8 +55,7 @@ impl TargetMedia { /// /// > **Nota** /// > Las hojas de estilo CSS deben estar disponibles en el servidor web de la aplicación. Pueden -/// > incluirse en el proyecto utilizando [`include_files!`](crate::include_files) y servirse con -/// > [`include_files_service!`](crate::include_files_service). +/// > servirse usando [`static_files_service!`](crate::static_files_service). /// /// # Ejemplo /// diff --git a/src/lib.rs b/src/lib.rs index d50a4489..90ea4625 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -103,7 +103,8 @@ pub use pagetop_macros::{builder_fn, html, main, test, AutoDefault}; pub use pagetop_statics::{resource, StaticResource}; -/// Conjunto de recursos asociados a `$STATIC` en [`include_files!`](crate::include_files). +/// Contenedor para un conjunto de recursos embebidos. +#[derive(AutoDefault)] pub struct StaticResources { bundle: HashMap<&'static str, StaticResource>, } diff --git a/src/prelude.rs b/src/prelude.rs index 6bacaf3a..9072dec9 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -15,7 +15,8 @@ pub use crate::include_config; // crate::locale pub use crate::include_locales; // crate::service -pub use crate::{include_files, include_files_service}; +#[allow(deprecated)] +pub use crate::{include_files, include_files_service, static_files_service}; // crate::core::action pub use crate::actions_boxed; diff --git a/src/service.rs b/src/service.rs index 47f1420d..288e1eb5 100644 --- a/src/service.rs +++ b/src/service.rs @@ -15,6 +15,9 @@ pub use pagetop_statics::ResourceFiles; #[doc(hidden)] pub use actix_web::test; +/// **Obsoleto desde la versión 0.3.0**: usar [`static_files_service!`](crate::static_files_service) +/// en su lugar. +/// /// Incluye en código un conjunto de recursos previamente preparado con `build.rs`. /// /// # Formas de uso @@ -39,6 +42,7 @@ pub use actix_web::test; /// /// include_files!(STATIC_ASSETS => assets); /// ``` +#[deprecated(since = "0.3.0", note = "Use `static_files_service!` instead")] #[macro_export] macro_rules! include_files { // Forma 1: incluye un conjunto de recursos por nombre. @@ -63,6 +67,9 @@ macro_rules! include_files { }; } +/// **Obsoleto desde la versión 0.3.0**: usar [`static_files_service!`](crate::static_files_service) +/// en su lugar. +/// /// Configura un servicio web para publicar los recursos embebidos con [`include_files!`]. /// /// El código expandido de la macro decide durante el arranque de la aplicación si debe servir los @@ -104,6 +111,7 @@ macro_rules! include_files { /// // También desde el directorio actual de ejecución. /// include_files_service!(cfg, assets => "/public", ["", "static"]); /// ``` +#[deprecated(since = "0.3.0", note = "Use `static_files_service!` instead")] #[macro_export] macro_rules! include_files_service { ( $scfg:ident, $bundle:ident => $route:expr $(, [$root:expr, $relative:expr])? ) => {{ @@ -137,3 +145,114 @@ macro_rules! include_files_service { } }}; } + +/// Configura un servicio web para publicar archivos estáticos. +/// +/// La macro ofrece tres modos para configurar el servicio: +/// +/// - **Sistema de ficheros o embebido** (`[$path, $bundle]`): trata de servir los archivos desde +/// `$path`; y si es una cadena vacía, no existe o no es un directorio, entonces usará el conjunto +/// de recursos `$bundle` integrado en el binario. +/// - **Sólo embebido** (`[$bundle]`): sirve siempre desde el conjunto de recursos `$bundle` +/// integrado en el binario. +/// - **Sólo sistema de ficheros** (`$path`): sin usar corchetes, sirve únicamente desde el sistema +/// de ficheros si existe; en otro caso no registra el servicio. +/// +/// # Argumentos +/// +/// * `$scfg` – Instancia de [`ServiceConfig`](crate::service::web::ServiceConfig) donde aplicar la +/// configuración. +/// * `$path` – Ruta al directorio local con los archivos estáticos. +/// * `$bundle` – Nombre del conjunto de recursos que esta macro integra en el binario. +/// * `$route` – Ruta URL base desde la que se servirán los archivos. +/// +/// # Ejemplos +/// +/// ```rust,ignore +/// use pagetop::prelude::*; +/// +/// pub struct MyExtension; +/// +/// impl Extension for MyExtension { +/// fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { +/// // Forma 1) Sistema de ficheros o embebido. +/// static_files_service!(scfg, ["/var/www/static", assets] => "/public"); +/// +/// // Forma 2) Siempre embebido. +/// static_files_service!(scfg, [assets] => "/public"); +/// +/// // Forma 3) Sólo sistema de ficheros (no requiere `assets`). +/// static_files_service!(scfg, "/var/www/static" => "/public"); +/// } +/// } +/// ``` +#[macro_export] +macro_rules! static_files_service { + // Forma 1: primero intenta servir desde el sistema de ficheros; si falla, sirve embebido. + ( $scfg:ident, [$path:expr, $bundle:ident] => $route:expr $(,)? ) => {{ + let span = $crate::trace::debug_span!( + "Configuring static files (file system or embedded)", + mode = "fs_or_embedded", + route = $route, + ); + let _ = span.in_scope(|| { + let mut serve_embedded: bool = true; + if !::std::path::Path::new(&$path).as_os_str().is_empty() { + if let Ok(absolute) = $crate::util::resolve_absolute_dir($path) { + $scfg.service($crate::service::ActixFiles::new($route, absolute)); + serve_embedded = false; + } + } + if serve_embedded { + $crate::util::paste! { + mod [<static_files_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + $scfg.service($crate::service::ResourceFiles::new( + $route, + [<static_files_ $bundle>]::$bundle(), + )); + } + } + }); + }}; + // Forma 2: sirve siempre embebido. + ( $scfg:ident, [$bundle:ident] => $route:expr $(,)? ) => {{ + let span = $crate::trace::debug_span!( + "Configuring static files (using embedded only)", + mode = "embedded", + route = $route, + ); + let _ = span.in_scope(|| { + $crate::util::paste! { + mod [<static_files_ $bundle>] { + include!(concat!(env!("OUT_DIR"), "/", stringify!($bundle), ".rs")); + } + $scfg.service($crate::service::ResourceFiles::new( + $route, + [<static_files_ $bundle>]::$bundle(), + )); + } + }); + }}; + // Forma 3: intenta servir desde el sistema de ficheros. + ( $scfg:ident, $path:expr => $route:expr $(,)? ) => {{ + let span = $crate::trace::debug_span!( + "Configuring static files (file system only)", + mode = "fs", + route = $route, + ); + let _ = span.in_scope(|| match $crate::util::resolve_absolute_dir($path) { + Ok(absolute) => { + $scfg.service($crate::service::ActixFiles::new($route, absolute)); + } + Err(e) => { + $crate::trace::warn!( + "Static dir not found or invalid for route `{}`: {:?} ({e})", + $route, + $path, + ); + } + }); + }}; +} From 662b269423938503d320d1ea85c8830e294fd1f7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Aug 2025 12:39:51 +0200 Subject: [PATCH 747/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-statics=200.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-statics/CHANGELOG.md | 6 ++++++ helpers/pagetop-statics/Cargo.toml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22cf3086..48adecf2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1605,7 +1605,7 @@ dependencies = [ [[package]] name = "pagetop-statics" -version = "0.1.0" +version = "0.1.1" dependencies = [ "actix-web", "change-detection", diff --git a/helpers/pagetop-statics/CHANGELOG.md b/helpers/pagetop-statics/CHANGELOG.md index 62ad97e8..811a77f4 100644 --- a/helpers/pagetop-statics/CHANGELOG.md +++ b/helpers/pagetop-statics/CHANGELOG.md @@ -8,6 +8,12 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.1.1 (2025-08-16) + +### Documentado + +- Cambia el formato para la documentación (#4) + ## 0.1.0 (2025-08-09) ### Añadido diff --git a/helpers/pagetop-statics/Cargo.toml b/helpers/pagetop-statics/Cargo.toml index e5c58d5e..2afe3739 100644 --- a/helpers/pagetop-statics/Cargo.toml +++ b/helpers/pagetop-statics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-statics" -version = "0.1.0" +version = "0.1.1" edition = "2021" description = """ From 85497bf45256b530bd7cd84a5b47f5438240801f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Aug 2025 12:47:02 +0200 Subject: [PATCH 748/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- helpers/pagetop-build/CHANGELOG.md | 11 +++++++++++ helpers/pagetop-build/Cargo.toml | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 48adecf2..8e9795f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1587,7 +1587,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.2.0" +version = "0.3.0" dependencies = [ "grass", "pagetop-statics", diff --git a/Cargo.toml b/Cargo.toml index cdeae782..bb31197f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,6 +71,6 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] actix-web = { version = "4.11.0", default-features = false } -pagetop-build = { version = "0.2", path = "helpers/pagetop-build" } +pagetop-build = { version = "0.3", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.1", path = "helpers/pagetop-macros" } pagetop-statics = { version = "0.1", path = "helpers/pagetop-statics" } diff --git a/helpers/pagetop-build/CHANGELOG.md b/helpers/pagetop-build/CHANGELOG.md index 4d087556..3e3801e8 100644 --- a/helpers/pagetop-build/CHANGELOG.md +++ b/helpers/pagetop-build/CHANGELOG.md @@ -8,6 +8,17 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.3.0 (2025-08-16) + +### Cambiado + +- Mejora función `from_dir` por compatibilidad (#3) +- Mejora la integración de archivos estáticos + +### Documentado + +- Cambia el formato para la documentación (#4) + ## 0.2.0 (2025-08-09) ### Añadido diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 14e6000b..e0f5ef76 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.2.0" +version = "0.3.0" edition = "2021" description = """ From b11b5d97c67b5a6dfdc9392e24e5d5620d15b231 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Aug 2025 12:51:11 +0200 Subject: [PATCH 749/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-macros=200.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-macros/CHANGELOG.md | 11 +++++++++++ helpers/pagetop-macros/Cargo.toml | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e9795f1..64f77eeb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1595,7 +1595,7 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.1.0" +version = "0.1.1" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", diff --git a/helpers/pagetop-macros/CHANGELOG.md b/helpers/pagetop-macros/CHANGELOG.md index b01b9883..b61471a1 100644 --- a/helpers/pagetop-macros/CHANGELOG.md +++ b/helpers/pagetop-macros/CHANGELOG.md @@ -8,6 +8,17 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.1.1 (2025-08-16) + +### Documentado + +- Cambia el formato para la documentación (#4) +- Corrige enlaces de licencia en la documentación + +### Otros cambios + +- Afina Cargo.toml para buscar la mejor categoría + ## 0.1.0 (2025-08-06) - Versión inicial diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 64f1cf4c..d5ceb1b6 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.1.0" +version = "0.1.1" edition = "2021" description = """ From 2cf5ce2a7086d35407cc7dbd9d98bc1ce2eb5559 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 16 Aug 2025 12:57:00 +0200 Subject: [PATCH 750/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop=200.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 18 ++++++++++++++++-- Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2248658d..9e187143 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,17 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.3.0 (2025-08-16) + +### Cambiado + +- Redefine función para directorios absolutos +- Mejora la integración de archivos estáticos + +### Documentado + +- Cambia el formato para la documentación (#4) + ## 0.2.0 (2025-08-09) ### Añadido @@ -15,10 +26,13 @@ internos pueden omitirse si no afectan al uso del proyecto. - Añade librería para gestionar recursos estáticos (#1) - Añade soporte a changelog de `pagetop-statics` (#2) +### Documentado + +- Corrige enlace del botón de licencia en la documentación + ### Otros cambios -- 🩹 Corrige enlace del botón de licencia en la documentación -- 🚩 Afina Cargo.toml para buscar la mejor categoría +- Afina Cargo.toml para buscar la mejor categoría ## 0.1.0 (2025-08-06) diff --git a/Cargo.lock b/Cargo.lock index 64f77eeb..944027d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1557,7 +1557,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.2.0" +version = "0.3.0" dependencies = [ "actix-files", "actix-session", diff --git a/Cargo.toml b/Cargo.toml index bb31197f..8ccd69ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.2.0" +version = "0.3.0" edition = "2021" description = """ From 313ce391d5a80e94b78aa3ad4cf7f6bdeae53c0a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Aug 2025 09:12:22 +0200 Subject: [PATCH 751/853] =?UTF-8?q?=F0=9F=93=9D=20Retoques=20menores=20en?= =?UTF-8?q?=20la=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/theme.rs | 7 ++++--- src/core/theme/definition.rs | 11 ++++++++--- src/util.rs | 4 +++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/core/theme.rs b/src/core/theme.rs index 0a0f8199..2cd5bb1f 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -9,9 +9,10 @@ //! tipografías, espaciados y cualquier otro detalle visual o de comportamiento (como animaciones, //! *scripts* de interfaz, etc.). //! -//! Es una extensión más (implementando [`Extension`](crate::core::extension::Extension)). Se -//! instala, activa y declara dependencias igual que el resto de extensiones; y se señala a sí misma -//! como tema (implementando [`theme()`](crate::core::extension::Extension::theme) y [`Theme`]). +//! Los temas son extensiones que implementan [`Extension`](crate::core::extension::Extension); por +//! lo que se instancian, declaran sus dependencias y se inician igual que el resto de extensiones; +//! pero serán temas si además implementan [`theme()`](crate::core::extension::Extension::theme) y +//! [`Theme`]. mod definition; pub use definition::{Theme, ThemeRef}; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 8de88bdd..e9cfbba9 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -14,7 +14,7 @@ pub type ThemeRef = &'static dyn Theme; /// Interfaz común que debe implementar cualquier tema de `PageTop`. /// /// Un tema implementará [`Theme`] y los métodos que sean necesarios de [`Extension`], aunque el -/// único obligatorio es [`theme()`](Extension::theme). +/// único obligatorio será [`theme()`](Extension::theme). /// /// ```rust /// use pagetop::prelude::*; @@ -22,8 +22,13 @@ pub type ThemeRef = &'static dyn Theme; /// pub struct MyTheme; /// /// impl Extension for MyTheme { -/// fn name(&self) -> L10n { L10n::n("My theme") } -/// fn description(&self) -> L10n { L10n::n("Un tema personal") } +/// fn name(&self) -> L10n { +/// L10n::n("My theme") +/// } +/// +/// fn description(&self) -> L10n { +/// L10n::n("A personal theme") +/// } /// /// fn theme(&self) -> Option<ThemeRef> { /// Some(&Self) diff --git a/src/util.rs b/src/util.rs index 21537c5d..e70b0998 100644 --- a/src/util.rs +++ b/src/util.rs @@ -56,8 +56,10 @@ pub fn resolve_absolute_dir<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> { } } +/// **Obsoleto desde la versión 0.3.0**: usar [`resolve_absolute_dir()`] en su lugar. +/// /// Devuelve la ruta absoluta a un directorio existente. -#[deprecated(since = "0.3.0", note = "Use [`resolve_absolute_dir`] instead")] +#[deprecated(since = "0.3.0", note = "Use `resolve_absolute_dir()` instead")] pub fn absolute_dir<P, Q>(root_path: P, relative_path: Q) -> io::Result<PathBuf> where P: AsRef<Path>, From 3b5c5dd4e7f7e9ee48da7fe35b1925b1ceac7594 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Aug 2025 09:31:20 +0200 Subject: [PATCH 752/853] =?UTF-8?q?=F0=9F=A6=BA=20Modifica=20tipos=20para?= =?UTF-8?q?=20atributos=20HTML=20a=20min=C3=BAsculas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/opt_classes.rs | 7 ++++--- src/html/opt_id.rs | 5 +++-- src/html/opt_name.rs | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/html/opt_classes.rs b/src/html/opt_classes.rs index abb3ba48..a9857625 100644 --- a/src/html/opt_classes.rs +++ b/src/html/opt_classes.rs @@ -25,6 +25,7 @@ pub enum ClassesOp { /// /// - El [orden de las clases no es relevante](https://stackoverflow.com/a/1321712) en CSS. /// - No se permiten clases duplicadas. +/// - Las clases se convierten a minúsculas. /// - Las clases vacías se ignoran. /// /// # Ejemplo @@ -32,8 +33,8 @@ pub enum ClassesOp { /// ```rust /// use pagetop::prelude::*; /// -/// let classes = OptionClasses::new("btn btn-primary") -/// .with_value(ClassesOp::Add, "active") +/// let classes = OptionClasses::new("Btn btn-primary") +/// .with_value(ClassesOp::Add, "Active") /// .with_value(ClassesOp::Remove, "btn-primary"); /// /// assert_eq!(classes.get(), Some(String::from("btn active"))); @@ -51,7 +52,7 @@ impl OptionClasses { #[builder_fn] pub fn with_value(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { - let classes: &str = classes.as_ref(); + let classes = classes.as_ref().to_ascii_lowercase(); let classes: Vec<&str> = classes.split_ascii_whitespace().collect(); if classes.is_empty() { diff --git a/src/html/opt_id.rs b/src/html/opt_id.rs index 893ac6d3..139fdcd6 100644 --- a/src/html/opt_id.rs +++ b/src/html/opt_id.rs @@ -7,6 +7,7 @@ use crate::{builder_fn, AutoDefault}; /// # Normalización /// /// - Se eliminan los espacios al principio y al final. +/// - Se convierte a minúsculas. /// - Se sustituyen los espacios intermedios por guiones bajos (`_`). /// - Si el resultado es una cadena vacía, se guarda `None`. /// @@ -15,7 +16,7 @@ use crate::{builder_fn, AutoDefault}; /// ```rust /// use pagetop::prelude::*; /// -/// let id = OptionId::new("main section"); +/// let id = OptionId::new(" main Section "); /// assert_eq!(id.get(), Some(String::from("main_section"))); /// /// let empty = OptionId::default(); @@ -39,7 +40,7 @@ impl OptionId { /// El valor se normaliza automáticamente. #[builder_fn] pub fn with_value(mut self, value: impl AsRef<str>) -> Self { - let value = value.as_ref().trim().replace(' ', "_"); + let value = value.as_ref().trim().to_ascii_lowercase().replace(' ', "_"); self.0 = (!value.is_empty()).then_some(value); self } diff --git a/src/html/opt_name.rs b/src/html/opt_name.rs index aa74e3b9..ffb0b989 100644 --- a/src/html/opt_name.rs +++ b/src/html/opt_name.rs @@ -7,6 +7,7 @@ use crate::{builder_fn, AutoDefault}; /// # Normalización /// /// - Se eliminan los espacios al principio y al final. +/// - Se convierte a minúsculas. /// - Se sustituyen los espacios intermedios por guiones bajos (`_`). /// - Si el resultado es una cadena vacía, se guarda `None`. /// @@ -15,7 +16,7 @@ use crate::{builder_fn, AutoDefault}; /// ```rust /// use pagetop::prelude::*; /// -/// let name = OptionName::new(" display name "); +/// let name = OptionName::new(" DISplay name "); /// assert_eq!(name.get(), Some(String::from("display_name"))); /// /// let empty = OptionName::default(); @@ -39,7 +40,7 @@ impl OptionName { /// El valor se normaliza automáticamente. #[builder_fn] pub fn with_value(mut self, value: impl AsRef<str>) -> Self { - let value = value.as_ref().trim().replace(' ', "_"); + let value = value.as_ref().trim().to_ascii_lowercase().replace(' ', "_"); self.0 = (!value.is_empty()).then_some(value); self } From 2cb963350341997fea9b10030278fb930dc242a1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Aug 2025 09:36:25 +0200 Subject: [PATCH 753/853] =?UTF-8?q?=F0=9F=8E=A8=20Retoques=20al=20importar?= =?UTF-8?q?=20`fmt`=20para=20usar=20`Display`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/context.rs | 5 ++--- src/response/page/error.rs | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/html/context.rs b/src/html/context.rs index 5fbb39b5..72c0ff29 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -9,10 +9,9 @@ use crate::{builder_fn, join}; use std::collections::HashMap; use std::error::Error; +use std::fmt::{self, Display}; use std::str::FromStr; -use std::fmt; - /// Operaciones para modificar el contexto ([`Context`]) del documento. pub enum AssetsOp { // Favicon. @@ -43,7 +42,7 @@ pub enum ErrorParam { ParseError(String), } -impl fmt::Display for ErrorParam { +impl Display for ErrorParam { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { ErrorParam::NotFound => write!(f, "Parameter not found"), diff --git a/src/response/page/error.rs b/src/response/page/error.rs index 3a2511cf..99ba62bf 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -6,7 +6,7 @@ use crate::service::{HttpRequest, HttpResponse}; use super::Page; -use std::fmt; +use std::fmt::{self, Display}; #[derive(Debug)] pub enum ErrorPage { @@ -19,7 +19,7 @@ pub enum ErrorPage { Timeout(HttpRequest), } -impl fmt::Display for ErrorPage { +impl Display for ErrorPage { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { // Error 304. From 40c4cabe45d7663b74d17a0a90913bd0d146edcb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 21 Aug 2025 09:40:10 +0200 Subject: [PATCH 754/853] =?UTF-8?q?=F0=9F=90=9B=20(welcome):=20Corrige=20g?= =?UTF-8?q?iro=20bot=C3=B3n=20con=20ancho=20estrecho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/welcome.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/static/css/welcome.css b/static/css/welcome.css index 8f603485..76b042b9 100644 --- a/static/css/welcome.css +++ b/static/css/welcome.css @@ -295,11 +295,6 @@ a:hover:visited { transform: translateX(-100%); } } -#poweredby-link:hover { - transition: all .5s; - transform: rotate(-3deg) scale(1.1); - box-shadow: 0px 3px 5px rgba(0,0,0,.4); -} #poweredby-link:hover span { animation-play-state: paused; } @@ -323,6 +318,11 @@ a:hover:visited { max-width: 29.375rem; margin-bottom: 0; } + #poweredby-link:hover { + transition: all .5s; + transform: rotate(-3deg) scale(1.1); + box-shadow: 0px 3px 5px rgba(0,0,0,.4); + } } .content-text { From ba71f8a83fab01fb95d51c1464068c8ba76eb9e6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 22 Aug 2025 07:46:36 +0200 Subject: [PATCH 755/853] =?UTF-8?q?=E2=9C=A8=20(app):=20A=C3=B1ade=20manej?= =?UTF-8?q?o=20de=20rutas=20no=20encontradas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index c3576fc5..400b0cd3 100644 --- a/src/app.rs +++ b/src/app.rs @@ -3,6 +3,9 @@ mod figfont; use crate::core::{extension, extension::ExtensionRef}; +use crate::html::Markup; +use crate::response::page::{ErrorPage, ResultPage}; +use crate::service::HttpRequest; use crate::{global, locale, service, trace}; use actix_session::config::{BrowserSession, PersistentSession, SessionLifecycle}; @@ -170,6 +173,12 @@ impl Application { InitError = (), >, > { - service::App::new().configure(extension::all::configure_services) + service::App::new() + .configure(extension::all::configure_services) + .default_service(service::web::route().to(service_not_found)) } } + +async fn service_not_found(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Err(ErrorPage::NotFound(request)) +} From e08c412a36e205bdeddd1bda2eb4d216c5406d3f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 22 Aug 2025 08:29:11 +0200 Subject: [PATCH 756/853] =?UTF-8?q?=F0=9F=8E=A8=20(theme):=20Mejora=20gest?= =?UTF-8?q?i=C3=B3n=20de=20regiones=20en=20p=C3=A1ginas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/extension/definition.rs | 19 +++---- src/core/theme.rs | 5 +- src/core/theme/definition.rs | 81 ++++++++++++++++++++++++++---- src/core/theme/regions.rs | 85 ++++++++++++++++++++++++++------ src/locale/en-US/theme.ftl | 9 +++- src/locale/es-ES/theme.ftl | 9 +++- src/response/page.rs | 15 +++--- 7 files changed, 174 insertions(+), 49 deletions(-) diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index ac292592..6df70427 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -26,7 +26,7 @@ pub type ExtensionRef = &'static dyn Extension; /// } /// ``` pub trait Extension: AnyInfo + Send + Sync { - /// Nombre legible para el usuario. + /// Nombre localizado de la extensión legible para el usuario. /// /// Predeterminado por el [`short_name()`](AnyInfo::short_name) del tipo asociado a la /// extensión. @@ -34,18 +34,15 @@ pub trait Extension: AnyInfo + Send + Sync { L10n::n(self.short_name()) } - /// Descripción corta para paneles, listados, etc. + /// Descripción corta localizada de la extensión para paneles, listados, etc. fn description(&self) -> L10n { L10n::default() } - /// Los temas son extensiones que implementan [`Extension`] y también - /// [`Theme`](crate::core::theme::Theme). + /// Devuelve una referencia a esta misma extensión cuando se trata de un tema. /// - /// Si la extensión no es un tema, este método devuelve `None` por defecto. - /// - /// En caso contrario, este método debe implementarse para devolver una referencia de sí mismo - /// como tema. Por ejemplo: + /// Para ello, debe implementar [`Extension`] y también [`Theme`](crate::core::theme::Theme). Si + /// la extensión no es un tema, este método devuelve `None` por defecto. /// /// ```rust /// use pagetop::prelude::*; @@ -81,7 +78,7 @@ pub trait Extension: AnyInfo + Send + Sync { actions_boxed![] } - /// Inicializa la extensión durante la lógica de arranque de la aplicación. + /// Inicializa la extensión durante la fase de arranque de la aplicación. /// /// Se llama una sola vez, después de que todas las dependencias se han inicializado y antes de /// aceptar cualquier petición HTTP. @@ -104,8 +101,8 @@ pub trait Extension: AnyInfo + Send + Sync { #[allow(unused_variables)] fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {} - /// Permite crear extensiones para deshabilitar y desinstalar los recursos de otras extensiones - /// utilizadas en versiones anteriores de la aplicación. + /// Permite crear extensiones para deshabilitar y desinstalar recursos de otras de versiones + /// anteriores de la aplicación. /// /// Actualmente no se usa, pero se deja como *placeholder* para futuras implementaciones. fn drop_extensions(&self) -> Vec<ExtensionRef> { diff --git a/src/core/theme.rs b/src/core/theme.rs index 2cd5bb1f..aa526f16 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -19,9 +19,6 @@ pub use definition::{Theme, ThemeRef}; mod regions; pub(crate) use regions::ChildrenInRegions; -pub use regions::InRegion; +pub use regions::{InRegion, Region, REGION_CONTENT}; pub(crate) mod all; - -/// Nombre de la región por defecto: `content`. -pub const CONTENT_REGION_NAME: &str = "content"; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index e9cfbba9..8d1b632f 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,10 +1,12 @@ use crate::core::extension::Extension; -use crate::core::theme::CONTENT_REGION_NAME; +use crate::core::theme::Region; use crate::global; use crate::html::{html, Markup}; use crate::locale::L10n; use crate::response::page::Page; +use std::sync::LazyLock; + /// Representa una referencia a un tema. /// /// Los temas son también extensiones. Por tanto se deben definir igual, es decir, como instancias @@ -38,21 +40,67 @@ pub type ThemeRef = &'static dyn Theme; /// impl Theme for MyTheme {} /// ``` pub trait Theme: Extension + Send + Sync { + /// **Obsoleto desde la versión 0.4.0**: usar [`declared_regions()`](Self::declared_regions) en + /// su lugar. + #[deprecated(since = "0.4.0", note = "Use `declared_regions()` instead")] fn regions(&self) -> Vec<(&'static str, L10n)> { - vec![(CONTENT_REGION_NAME, L10n::l("content"))] + vec![("content", L10n::l("content"))] } + /// Declaración ordenada de las regiones disponibles en la página. + /// + /// Devuelve una lista estática de pares `(Region, L10n)` que se usará para renderizar en el + /// orden indicado todas las regiones que componen una página. Los identificadores deben ser + /// **estables** como `"sidebar-left"` o `"content"`. La etiqueta `L10n` devuelve el nombre de la + /// región en el idioma activo de la página. + /// + /// Si el tema requiere un conjunto distinto de regiones, se puede sobrescribir este método para + /// devolver una lista diferente. Si no, se usará la lista predeterminada: + /// + /// - `"header"`: cabecera. + /// - `"content"`: contenido principal (**obligatoria**). + /// - `"footer"`: pie. + /// + /// Sólo la región `"content"` es obligatoria, usa [`Region::default()`] para declararla. + #[inline] + fn declared_regions(&self) -> &'static [(Region, L10n)] { + static REGIONS: LazyLock<[(Region, L10n); 3]> = LazyLock::new(|| { + [ + (Region::declare("header"), L10n::l("region_header")), + (Region::default(), L10n::l("region_content")), + (Region::declare("footer"), L10n::l("region_footer")), + ] + }); + &REGIONS[..] + } + + /// Acciones específicas del tema antes de renderizar el `<body>` de la página. + /// + /// Útil para preparar clases, inyectar recursos o ajustar metadatos. #[allow(unused_variables)] fn before_render_page_body(&self, page: &mut Page) {} + /// Renderiza el contenido del `<body>` de la página. + /// + /// Por defecto, recorre [`declared_regions()`](Self::declared_regions) **en el orden que se han + /// declarado** y, para cada región con contenido, genera un contenedor con `role="region"` y + /// `aria-label` localizado. fn render_page_body(&self, page: &mut Page) -> Markup { html! { body id=[page.body_id().get()] class=[page.body_classes().get()] { - @for (region_name, _) in self.regions() { - @let output = page.render_region(region_name); + @for (region, region_label) in self.declared_regions() { + @let output = page.render_region(region.key()); @if !output.is_empty() { - div id=(region_name) class={ "region-container region-" (region_name) } { - (output) + @let region_name = region.name(); + div + id=(region_name) + class="region" + role="region" + aria-label=[region_label.using(page)] + { + div class={ "region__" (region_name) } { + (output) + } } } } @@ -60,9 +108,16 @@ pub trait Theme: Extension + Send + Sync { } } + /// Acciones específicas del tema después de renderizar el `<body>` de la página. + /// + /// Útil para *tracing*, métricas o ajustes finales del estado de la página. #[allow(unused_variables)] fn after_render_page_body(&self, page: &mut Page) {} + /// Renderiza el contenido del `<head>` de la página. + /// + /// Por defecto, genera las etiquetas básicas (`charset`, `title`, `description`, `viewport`, + /// `X-UA-Compatible`), los metadatos y propiedades de la página y los recursos (CSS/JS). fn render_page_head(&self, page: &mut Page) -> Markup { let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { @@ -94,11 +149,17 @@ pub trait Theme: Extension + Send + Sync { } } - fn error403(&self, _page: &mut Page) -> Markup { - html! { div { h1 { ("FORBIDDEN ACCESS") } } } + /// Página de error "*403 – Forbidden*" predeterminada. + /// + /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. + fn error403(&self, page: &mut Page) -> Markup { + html! { div { h1 { (L10n::l("error403_notice").to_markup(page)) } } } } - fn error404(&self, _page: &mut Page) -> Markup { - html! { div { h1 { ("RESOURCE NOT FOUND") } } } + /// Página de error "*404 – Not Found*" predeterminada. + /// + /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. + fn error404(&self, page: &mut Page) -> Markup { + html! { div { h1 { (L10n::l("error404_notice").to_markup(page)) } } } } } diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 22ab6f25..c8a05554 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -1,5 +1,5 @@ use crate::core::component::{Child, ChildOp, Children}; -use crate::core::theme::{ThemeRef, CONTENT_REGION_NAME}; +use crate::core::theme::ThemeRef; use crate::{builder_fn, AutoDefault, UniqueId}; use parking_lot::RwLock; @@ -7,15 +7,71 @@ use parking_lot::RwLock; use std::collections::HashMap; use std::sync::LazyLock; -// Regiones globales con componentes para un tema dado. +// Conjunto de regiones globales asociadas a un tema específico. static THEME_REGIONS: LazyLock<RwLock<HashMap<UniqueId, ChildrenInRegions>>> = LazyLock::new(|| RwLock::new(HashMap::new())); -// Regiones globales con componentes para cualquier tema. +// Conjunto de regiones globales comunes a todos los temas. static COMMON_REGIONS: LazyLock<RwLock<ChildrenInRegions>> = LazyLock::new(|| RwLock::new(ChildrenInRegions::default())); -// Estructura interna para mantener los componentes de una región. +/// Nombre de la región de contenido por defecto (`"content"`). +pub const REGION_CONTENT: &str = "content"; + +/// Identificador de una región de página. +/// +/// Incluye una **clave estática** ([`key()`](Self::key)) que identifica la región en el tema, y un +/// **nombre normalizado** ([`name()`](Self::name)) en minúsculas para su uso en atributos HTML +/// (p.ej., clases `region__{name}`). +/// +/// Se utiliza para declarar las regiones que componen una página en un tema (ver +/// [`declared_regions()`](crate::core::theme::Theme::declared_regions)). +pub struct Region { + key: &'static str, + name: String, +} + +impl Default for Region { + #[inline] + fn default() -> Self { + Self { + key: REGION_CONTENT, + name: String::from(REGION_CONTENT), + } + } +} + +impl Region { + /// Declara una región a partir de su clave estática. + /// + /// Genera además un nombre normalizado de la clave, eliminando espacios iniciales y finales, + /// convirtiendo a minúsculas y sustituyendo los espacios intermedios por guiones (`-`). + /// + /// Esta clave se usará para añadir componentes a la región; por ello se recomiendan nombres + /// sencillos, limitando los caracteres a `[a-z0-9-]` (p.ej., `"sidebar"` o `"main-menu"`), cuyo + /// nombre normalizado coincidirá con la clave. + #[inline] + pub fn declare(key: &'static str) -> Self { + Self { + key, + name: key.trim().to_ascii_lowercase().replace(' ', "-"), + } + } + + /// Devuelve la clave estática asignada a la región. + #[inline] + pub fn key(&self) -> &'static str { + self.key + } + + /// Devuelve el nombre normalizado de la región (para atributos y búsquedas). + #[inline] + pub fn name(&self) -> &str { + &self.name + } +} + +// Contenedor interno de componentes agrupados por región. #[derive(AutoDefault)] pub struct ChildrenInRegions(HashMap<&'static str, Children>); @@ -48,25 +104,24 @@ impl ChildrenInRegions { } } -/// Permite añadir componentes a regiones globales o regiones de temas concretos. +/// Punto de acceso para añadir componentes a regiones globales o específicas de un tema. /// -/// Dada una región, según la variante seleccionada, se le podrán añadir ([`add()`](Self::add)) -/// componentes que se mantendrán durante la ejecución de la aplicación. +/// Según la variante, se pueden añadir componentes ([`add()`](Self::add)) que permanecerán +/// disponibles durante toda la ejecución. /// -/// Estas estructuras de componentes se renderizarán automáticamente al procesar los documentos HTML -/// que las usan, como las páginas de contenido ([`Page`](crate::response::page::Page)), por -/// ejemplo. +/// Estos componentes se renderizarán automáticamente al procesar los documentos HTML que incluyen +/// estas regiones, como las páginas de contenido ([`Page`](crate::response::page::Page)). pub enum InRegion { - /// Representa la región por defecto en la que se pueden añadir componentes. + /// Región de contenido por defecto. Content, - /// Representa la región con el nombre del argumento. + /// Región identificada por el nombre proporcionado. Named(&'static str), - /// Representa la región con el nombre y del tema especificado en los argumentos. + /// Región identificada por un nombre y asociada a un tema concreto. OfTheme(&'static str, ThemeRef), } impl InRegion { - /// Permite añadir un componente en la región de la variante seleccionada. + /// Añade un componente a la región indicada por la variante. /// /// # Ejemplo /// @@ -88,7 +143,7 @@ impl InRegion { InRegion::Content => { COMMON_REGIONS .write() - .alter_child_in_region(CONTENT_REGION_NAME, ChildOp::Add(child)); + .alter_child_in_region(REGION_CONTENT, ChildOp::Add(child)); } InRegion::Named(name) => { COMMON_REGIONS diff --git a/src/locale/en-US/theme.ftl b/src/locale/en-US/theme.ftl index 9c71e6bd..f766766d 100644 --- a/src/locale/en-US/theme.ftl +++ b/src/locale/en-US/theme.ftl @@ -1,2 +1,9 @@ -content = Content +# Regions. +region_header = Header +region_content = Content +region_footer = Footer + +error403_notice = FORBIDDEN ACCESS +error404_notice = RESOURCE NOT FOUND + pagetop_logo = PageTop Logo diff --git a/src/locale/es-ES/theme.ftl b/src/locale/es-ES/theme.ftl index f193c537..b8b91449 100644 --- a/src/locale/es-ES/theme.ftl +++ b/src/locale/es-ES/theme.ftl @@ -1,2 +1,9 @@ -content = Contenido +# Regions. +region_header = Cabecera +region_content = Contenido +region_footer = Pie de página + +error403_notice = ACCESO NO PERMITIDO +error404_notice = RECURSO NO ENCONTRADO + pagetop_logo = Logotipo de PageTop diff --git a/src/response/page.rs b/src/response/page.rs index 44cab725..f30e299e 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -6,7 +6,7 @@ pub use actix_web::Result as ResultPage; use crate::base::action; use crate::builder_fn; use crate::core::component::{Child, ChildOp, Component}; -use crate::core::theme::{ChildrenInRegions, ThemeRef, CONTENT_REGION_NAME}; +use crate::core::theme::{ChildrenInRegions, ThemeRef, REGION_CONTENT}; use crate::html::{html, AssetsOp, Context, Markup, DOCTYPE}; use crate::html::{ClassesOp, OptionClasses, OptionId, OptionTranslated}; use crate::locale::{CharacterDirection, L10n, LangId, LanguageIdentifier}; @@ -123,7 +123,7 @@ impl Page { /// Añade un componente a la región de contenido por defecto. pub fn with_component(mut self, component: impl Component) -> Self { self.regions - .alter_child_in_region(CONTENT_REGION_NAME, ChildOp::Add(Child::with(component))); + .alter_child_in_region(REGION_CONTENT, ChildOp::Add(Child::with(component))); self } @@ -172,11 +172,6 @@ impl Page { self.context.request() } - /// Devuelve el identificador de idioma asociado. - pub fn langid(&self) -> &LanguageIdentifier { - self.context.langid() - } - /// Devuelve el tema que se usará para renderizar la página. pub fn theme(&self) -> ThemeRef { self.context.theme() @@ -250,3 +245,9 @@ impl Page { }) } } + +impl LangId for Page { + fn langid(&self) -> &'static LanguageIdentifier { + self.context.langid() + } +} From 5ef85154b561e7bd3794ae30cacfbf5b2c2f8afd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Aug 2025 18:52:45 +0200 Subject: [PATCH 757/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20(html):=20Cambia?= =?UTF-8?q?=20tipos=20`Option...`=20por=20`Attr...`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renombra los tipos para atributos HTML `Id`, `Name`, `Value` (`String`), `L10n` (`Translate`) y `Classes`. Y mueve `OptionComponent` al *core* de componentes como `TypedSlot`. --- .../component/after_render_component.rs | 4 +- .../component/before_render_component.rs | 4 +- src/base/action/component/is_renderable.rs | 4 +- src/core/component.rs | 3 + src/core/component/children.rs | 17 ++-- src/core/component/slot.rs | 64 +++++++++++++ src/html.rs | 90 +++++++++++++------ src/html/{opt_classes.rs => attr_classes.rs} | 14 +-- src/html/attr_id.rs | 63 +++++++++++++ src/html/{opt_translated.rs => attr_l10n.rs} | 16 ++-- src/html/attr_name.rs | 63 +++++++++++++ src/html/attr_value.rs | 65 ++++++++++++++ src/html/opt_component.rs | 68 -------------- src/html/opt_id.rs | 59 ------------ src/html/opt_name.rs | 59 ------------ src/html/opt_string.rs | 57 ------------ src/response/page.rs | 28 +++--- 17 files changed, 367 insertions(+), 311 deletions(-) create mode 100644 src/core/component/slot.rs rename src/html/{opt_classes.rs => attr_classes.rs} (90%) create mode 100644 src/html/attr_id.rs rename src/html/{opt_translated.rs => attr_l10n.rs} (79%) create mode 100644 src/html/attr_name.rs create mode 100644 src/html/attr_value.rs delete mode 100644 src/html/opt_component.rs delete mode 100644 src/html/opt_id.rs delete mode 100644 src/html/opt_name.rs delete mode 100644 src/html/opt_string.rs diff --git a/src/base/action/component/after_render_component.rs b/src/base/action/component/after_render_component.rs index 917f3225..0cb03347 100644 --- a/src/base/action/component/after_render_component.rs +++ b/src/base/action/component/after_render_component.rs @@ -6,7 +6,7 @@ use crate::base::action::FnActionWithComponent; pub struct AfterRender<C: Component> { f: FnActionWithComponent<C>, referer_type_id: Option<UniqueId>, - referer_id: OptionId, + referer_id: AttrId, weight: Weight, } @@ -34,7 +34,7 @@ impl<C: Component> AfterRender<C> { AfterRender { f, referer_type_id: Some(UniqueId::of::<C>()), - referer_id: OptionId::default(), + referer_id: AttrId::default(), weight: 0, } } diff --git a/src/base/action/component/before_render_component.rs b/src/base/action/component/before_render_component.rs index 8c2e38d7..46ff9aae 100644 --- a/src/base/action/component/before_render_component.rs +++ b/src/base/action/component/before_render_component.rs @@ -6,7 +6,7 @@ use crate::base::action::FnActionWithComponent; pub struct BeforeRender<C: Component> { f: FnActionWithComponent<C>, referer_type_id: Option<UniqueId>, - referer_id: OptionId, + referer_id: AttrId, weight: Weight, } @@ -34,7 +34,7 @@ impl<C: Component> BeforeRender<C> { BeforeRender { f, referer_type_id: Some(UniqueId::of::<C>()), - referer_id: OptionId::default(), + referer_id: AttrId::default(), weight: 0, } } diff --git a/src/base/action/component/is_renderable.rs b/src/base/action/component/is_renderable.rs index baa86f1d..5a0e244e 100644 --- a/src/base/action/component/is_renderable.rs +++ b/src/base/action/component/is_renderable.rs @@ -11,7 +11,7 @@ pub type FnIsRenderable<C> = fn(component: &C, cx: &Context) -> bool; pub struct IsRenderable<C: Component> { f: FnIsRenderable<C>, referer_type_id: Option<UniqueId>, - referer_id: OptionId, + referer_id: AttrId, weight: Weight, } @@ -39,7 +39,7 @@ impl<C: Component> IsRenderable<C> { IsRenderable { f, referer_type_id: Some(UniqueId::of::<C>()), - referer_id: OptionId::default(), + referer_id: AttrId::default(), weight: 0, } } diff --git a/src/core/component.rs b/src/core/component.rs index 17b9b735..36914722 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -7,3 +7,6 @@ mod children; pub use children::Children; pub use children::{Child, ChildOp}; pub use children::{Typed, TypedOp}; + +mod slot; +pub use slot::TypedSlot; diff --git a/src/core/component/children.rs b/src/core/component/children.rs index fb85db7a..cb112e16 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -9,13 +9,13 @@ use std::vec::IntoIter; /// Representa un componente encapsulado de forma segura y compartida. /// -/// Esta estructura permite manipular y renderizar cualquier tipo que implemente [`Component`], -/// garantizando acceso concurrente a través de [`Arc<RwLock<_>>`]. +/// Esta estructura permite manipular y renderizar un componente que implemente [`Component`], y +/// habilita acceso concurrente mediante [`Arc<RwLock<_>>`]. #[derive(Clone)] pub struct Child(Arc<RwLock<dyn Component>>); impl Child { - /// Crea un nuevo [`Child`] a partir de un componente. + /// Crea un nuevo `Child` a partir de un componente. pub fn with(component: impl Component) -> Self { Child(Arc::new(RwLock::new(component))) } @@ -46,7 +46,8 @@ impl Child { /// Variante tipada de [`Child`] para evitar conversiones durante el uso. /// -/// Facilita el acceso a componentes del mismo tipo sin necesidad de hacer `downcast`. +/// Esta estructura permite manipular y renderizar un componente concreto que implemente +/// [`Component`], y habilita acceso concurrente mediante [`Arc<RwLock<_>>`]. pub struct Typed<C: Component>(Arc<RwLock<C>>); impl<C: Component> Clone for Typed<C> { @@ -56,7 +57,7 @@ impl<C: Component> Clone for Typed<C> { } impl<C: Component> Typed<C> { - /// Crea un nuevo [`Typed`] a partir de un componente. + /// Crea un nuevo `Typed` a partir de un componente. pub fn with(component: C) -> Self { Typed(Arc::new(RwLock::new(component))) } @@ -284,7 +285,7 @@ impl IntoIterator for Children { /// /// # Ejemplo de uso: /// - /// ```rust#ignore + /// ```rust,ignore /// let children = Children::new().with(child1).with(child2); /// for child in children { /// println!("{:?}", child.id()); @@ -303,7 +304,7 @@ impl<'a> IntoIterator for &'a Children { /// /// # Ejemplo de uso: /// - /// ```rust#ignore + /// ```rust,ignore /// let children = Children::new().with(child1).with(child2); /// for child in &children { /// println!("{:?}", child.id()); @@ -322,7 +323,7 @@ impl<'a> IntoIterator for &'a mut Children { /// /// # Ejemplo de uso: /// - /// ```rust#ignore + /// ```rust,ignore /// let mut children = Children::new().with(child1).with(child2); /// for child in &mut children { /// child.render(&mut context); diff --git a/src/core/component/slot.rs b/src/core/component/slot.rs new file mode 100644 index 00000000..19ed72ac --- /dev/null +++ b/src/core/component/slot.rs @@ -0,0 +1,64 @@ +use crate::builder_fn; +use crate::core::component::{Component, Typed}; +use crate::html::{html, Context, Markup}; + +/// Contenedor para un componente [`Typed`] opcional. +/// +/// Un `TypedSlot` actúa como un contenedor dentro de otro componente para incluir o no un +/// subcomponente. Internamente encapsula `Option<Typed<C>>`, pero proporciona una API más sencilla +/// para construir estructuras jerárquicas. +/// +/// # Ejemplo +/// +/// ```rust,ignore +/// use pagetop::prelude::*; +/// +/// let comp = MyComponent::new(); +/// let opt = TypedSlot::new(comp); +/// assert!(opt.get().is_some()); +/// ``` +pub struct TypedSlot<C: Component>(Option<Typed<C>>); + +impl<C: Component> Default for TypedSlot<C> { + fn default() -> Self { + TypedSlot(None) + } +} + +impl<C: Component> TypedSlot<C> { + /// Crea un nuevo [`TypedSlot`]. + /// + /// El componente se envuelve automáticamente en un [`Typed`] y se almacena. + pub fn new(component: C) -> Self { + TypedSlot(Some(Typed::with(component))) + } + + // TypedSlot BUILDER ********************************************************************* + + /// Establece un componente nuevo, o lo vacía. + /// + /// Si se proporciona `Some(component)`, se guarda en [`Typed`]; y si es `None`, se limpia. + #[builder_fn] + pub fn with_value(mut self, component: Option<C>) -> Self { + self.0 = component.map(Typed::with); + self + } + + // TypedSlot GETTERS ********************************************************************* + + /// Devuelve un clon (incrementa el contador `Arc`) de [`Typed<C>`], si existe. + pub fn get(&self) -> Option<Typed<C>> { + self.0.clone() + } + + // TypedSlot RENDER ************************************************************************ + + /// Renderiza el componente, si existe. + pub fn render(&self, cx: &mut Context) -> Markup { + if let Some(component) = &self.0 { + component.render(cx) + } else { + html! {} + } + } +} diff --git a/src/html.rs b/src/html.rs index 82fa906b..784457ed 100644 --- a/src/html.rs +++ b/src/html.rs @@ -3,52 +3,82 @@ mod maud; pub use maud::{display, html, html_private, Escaper, Markup, PreEscaped, Render, DOCTYPE}; +// HTML DOCUMENT ASSETS **************************************************************************** + mod assets; pub use assets::favicon::Favicon; pub use assets::javascript::JavaScript; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub(crate) use assets::Assets; +// HTML DOCUMENT CONTEXT *************************************************************************** + mod context; pub use context::{AssetsOp, Context, ErrorParam}; -mod opt_id; -pub use opt_id::OptionId; +// HTML ATTRIBUTES ********************************************************************************* -mod opt_name; -pub use opt_name::OptionName; +mod attr_id; +pub use attr_id::AttrId; +/// **Obsoleto desde la versión 0.4.0**: usar [`AttrId`] en su lugar. +#[deprecated(since = "0.4.0", note = "Use `AttrId` instead")] +pub type OptionId = AttrId; -mod opt_string; -pub use opt_string::OptionString; +mod attr_name; +pub use attr_name::AttrName; +/// **Obsoleto desde la versión 0.4.0**: usar [`AttrName`] en su lugar. +#[deprecated(since = "0.4.0", note = "Use `AttrName` instead")] +pub type OptionName = AttrName; -mod opt_translated; -pub use opt_translated::OptionTranslated; +mod attr_value; +pub use attr_value::AttrValue; +/// **Obsoleto desde la versión 0.4.0**: usar [`AttrValue`] en su lugar. +#[deprecated(since = "0.4.0", note = "Use `AttrValue` instead")] +pub type OptionString = AttrValue; -mod opt_classes; -pub use opt_classes::{ClassesOp, OptionClasses}; +mod attr_l10n; +pub use attr_l10n::AttrL10n; +/// **Obsoleto desde la versión 0.4.0**: usar [`AttrL10n`] en su lugar. +#[deprecated(since = "0.4.0", note = "Use `AttrL10n` instead")] +pub type OptionTranslated = AttrL10n; -mod opt_component; -pub use opt_component::OptionComponent; +mod attr_classes; +pub use attr_classes::{AttrClasses, ClassesOp}; +/// **Obsoleto desde la versión 0.4.0**: usar [`AttrClasses`] en su lugar. +#[deprecated(since = "0.4.0", note = "Use `AttrClasses` instead")] +pub type OptionClasses = AttrClasses; -use crate::AutoDefault; +use crate::{core, AutoDefault}; + +/// **Obsoleto desde la versión 0.4.0**: usar [`TypedSlot`](crate::core::component::TypedSlot) en su +/// lugar. +#[deprecated( + since = "0.4.0", + note = "Use `pagetop::core::component::TypedSlot` instead" +)] +#[allow(type_alias_bounds)] +pub type OptionComponent<C: core::component::Component> = core::component::TypedSlot<C>; /// Prepara contenido HTML para su conversión a [`Markup`]. /// -/// Este tipo encapsula distintos orígenes de contenido HTML (texto plano, HTML escapado o marcado -/// ya procesado) para renderizar de forma homogénea en plantillas sin interferir con el uso -/// estándar de [`Markup`]. +/// Este tipo encapsula distintos orígenes de contenido HTML (texto plano, HTML sin escapar o +/// fragmentos ya procesados) para renderizarlos de forma homogénea en plantillas, sin interferir +/// con el uso estándar de [`Markup`]. /// /// # Ejemplo /// /// ```rust /// use pagetop::prelude::*; /// -/// let fragment = PrepareMarkup::Text(String::from("Hola <b>mundo</b>")); +/// // Texto normal, se escapa automáticamente para evitar inyección de HTML. +/// let fragment = PrepareMarkup::Escaped(String::from("Hola <b>mundo</b>")); /// assert_eq!(fragment.render().into_string(), "Hola &lt;b&gt;mundo&lt;/b&gt;"); /// -/// let raw_html = PrepareMarkup::Escaped(String::from("<b>negrita</b>")); +/// // HTML literal, se inserta directamente, sin escapado adicional. +/// let raw_html = PrepareMarkup::Raw(String::from("<b>negrita</b>")); /// assert_eq!(raw_html.render().into_string(), "<b>negrita</b>"); /// +/// // Fragmento ya preparado con la macro `html!`. /// let prepared = PrepareMarkup::With(html! { /// h2 { "Título de ejemplo" } /// p { "Este es un párrafo con contenido dinámico." } @@ -60,14 +90,22 @@ use crate::AutoDefault; /// ``` #[derive(AutoDefault)] pub enum PrepareMarkup { - /// No se genera contenido HTML (devuelve `html! {}`). + /// No se genera contenido HTML (equivale a `html! {}`). #[default] None, - /// Texto estático que se escapará automáticamente para no ser interpretado como HTML. - Text(String), - /// Contenido sin escapado adicional, útil para HTML generado externamente. + /// Texto plano que se **escapará automáticamente** para que no sea interpretado como HTML. + /// + /// Úsalo con textos que provengan de usuarios u otras fuentes externas para garantizar la + /// seguridad contra inyección de código. Escaped(String), + /// HTML literal que se inserta **sin escapado adicional**. + /// + /// Úsalo únicamente para contenido generado de forma confiable o controlada, ya que cualquier + /// etiqueta o script incluido será renderizado directamente en el documento. + Raw(String), /// Fragmento HTML ya preparado como [`Markup`], listo para insertarse directamente. + /// + /// Normalmente proviene de expresiones `html! { ... }`. With(Markup), } @@ -76,8 +114,8 @@ impl PrepareMarkup { pub fn is_empty(&self) -> bool { match self { PrepareMarkup::None => true, - PrepareMarkup::Text(text) => text.is_empty(), - PrepareMarkup::Escaped(string) => string.is_empty(), + PrepareMarkup::Escaped(text) => text.is_empty(), + PrepareMarkup::Raw(string) => string.is_empty(), PrepareMarkup::With(markup) => markup.is_empty(), } } @@ -88,8 +126,8 @@ impl Render for PrepareMarkup { fn render(&self) -> Markup { match self { PrepareMarkup::None => html! {}, - PrepareMarkup::Text(text) => html! { (text) }, - PrepareMarkup::Escaped(string) => html! { (PreEscaped(string)) }, + PrepareMarkup::Escaped(text) => html! { (text) }, + PrepareMarkup::Raw(string) => html! { (PreEscaped(string)) }, PrepareMarkup::With(markup) => html! { (markup) }, } } diff --git a/src/html/opt_classes.rs b/src/html/attr_classes.rs similarity index 90% rename from src/html/opt_classes.rs rename to src/html/attr_classes.rs index a9857625..92851aa3 100644 --- a/src/html/opt_classes.rs +++ b/src/html/attr_classes.rs @@ -1,6 +1,6 @@ use crate::{builder_fn, AutoDefault}; -/// Operaciones disponibles sobre la lista de clases en [`OptionClasses`]. +/// Operaciones disponibles sobre la lista de clases en [`AttrClasses`]. pub enum ClassesOp { /// Añade al final (si no existe). Add, @@ -33,7 +33,7 @@ pub enum ClassesOp { /// ```rust /// use pagetop::prelude::*; /// -/// let classes = OptionClasses::new("Btn btn-primary") +/// let classes = AttrClasses::new("Btn btn-primary") /// .with_value(ClassesOp::Add, "Active") /// .with_value(ClassesOp::Remove, "btn-primary"); /// @@ -41,14 +41,14 @@ pub enum ClassesOp { /// assert!(classes.contains("active")); /// ``` #[derive(AutoDefault, Clone, Debug)] -pub struct OptionClasses(Vec<String>); +pub struct AttrClasses(Vec<String>); -impl OptionClasses { +impl AttrClasses { pub fn new(classes: impl AsRef<str>) -> Self { - OptionClasses::default().with_value(ClassesOp::Prepend, classes) + AttrClasses::default().with_value(ClassesOp::Prepend, classes) } - // OptionClasses BUILDER *********************************************************************** + // AttrClasses BUILDER ************************************************************************* #[builder_fn] pub fn with_value(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { @@ -114,7 +114,7 @@ impl OptionClasses { } } - // OptionClasses GETTERS *********************************************************************** + // AttrClasses GETTERS ************************************************************************* /// Devuele la cadena de clases, si existe. pub fn get(&self) -> Option<String> { diff --git a/src/html/attr_id.rs b/src/html/attr_id.rs new file mode 100644 index 00000000..8bb1d33b --- /dev/null +++ b/src/html/attr_id.rs @@ -0,0 +1,63 @@ +use crate::{builder_fn, AutoDefault}; + +/// Identificador normalizado para el atributo `id` o similar de HTML. +/// +/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso: +/// +/// - Se eliminan los espacios al principio y al final. +/// - Se convierte a minúsculas. +/// - Se sustituyen los espacios intermedios por guiones bajos (`_`). +/// - Si el resultado es una cadena vacía, se guarda `None`. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let id = AttrId::new(" main Section "); +/// assert_eq!(id.as_str(), Some("main_section")); +/// +/// let empty = AttrId::default(); +/// assert_eq!(empty.get(), None); +/// ``` +#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] +pub struct AttrId(Option<String>); + +impl AttrId { + /// Crea un nuevo `AttrId` normalizando el valor. + pub fn new(value: impl AsRef<str>) -> Self { + AttrId::default().with_value(value) + } + + // AttrId BUILDER ****************************************************************************** + + /// Establece un identificador nuevo normalizando el valor. + #[builder_fn] + pub fn with_value(mut self, value: impl AsRef<str>) -> Self { + let value = value.as_ref().trim().to_ascii_lowercase().replace(' ', "_"); + self.0 = if value.is_empty() { None } else { Some(value) }; + self + } + + // AttrId GETTERS ****************************************************************************** + + /// Devuelve el identificador normalizado, si existe. + pub fn get(&self) -> Option<String> { + self.0.as_ref().cloned() + } + + /// Devuelve el identificador normalizado (sin clonar), si existe. + pub fn as_str(&self) -> Option<&str> { + self.0.as_deref() + } + + /// Devuelve el identificador normalizado (propiedad), si existe. + pub fn into_inner(self) -> Option<String> { + self.0 + } + + /// `true` si no hay valor. + pub fn is_empty(&self) -> bool { + self.0.is_none() + } +} diff --git a/src/html/opt_translated.rs b/src/html/attr_l10n.rs similarity index 79% rename from src/html/opt_translated.rs rename to src/html/attr_l10n.rs index b15ea18a..cd5b389d 100644 --- a/src/html/opt_translated.rs +++ b/src/html/attr_l10n.rs @@ -2,7 +2,7 @@ use crate::html::Markup; use crate::locale::{L10n, LangId}; use crate::{builder_fn, AutoDefault}; -/// Cadena para traducir al renderizar ([`locale`](crate::locale)). +/// Texto para [traducir](crate::locale) en atributos HTML. /// /// Encapsula un tipo [`L10n`] para manejar traducciones de forma segura. /// @@ -12,7 +12,7 @@ use crate::{builder_fn, AutoDefault}; /// use pagetop::prelude::*; /// /// // Traducción por clave en las locales por defecto de PageTop. -/// let hello = OptionTranslated::new(L10n::l("test-hello-world")); +/// let hello = AttrL10n::new(L10n::l("test-hello-world")); /// /// // Español disponible. /// assert_eq!( @@ -31,15 +31,15 @@ use crate::{builder_fn, AutoDefault}; /// assert_eq!(markup.into_string(), "¡Hola mundo!"); /// ``` #[derive(AutoDefault, Clone, Debug)] -pub struct OptionTranslated(L10n); +pub struct AttrL10n(L10n); -impl OptionTranslated { - /// Crea una nueva instancia [`OptionTranslated`]. +impl AttrL10n { + /// Crea una nueva instancia `AttrL10n`. pub fn new(value: L10n) -> Self { - OptionTranslated(value) + AttrL10n(value) } - // OptionTranslated BUILDER ******************************************************************** + // AttrL10n BUILDER **************************************************************************** /// Establece una traducción nueva. #[builder_fn] @@ -48,7 +48,7 @@ impl OptionTranslated { self } - // OptionTranslated GETTERS ******************************************************************** + // AttrL10n GETTERS **************************************************************************** /// Devuelve la traducción para `language`, si existe. pub fn using(&self, language: &impl LangId) -> Option<String> { diff --git a/src/html/attr_name.rs b/src/html/attr_name.rs new file mode 100644 index 00000000..928f841f --- /dev/null +++ b/src/html/attr_name.rs @@ -0,0 +1,63 @@ +use crate::{builder_fn, AutoDefault}; + +/// Nombre normalizado para el atributo `name` o similar de HTML. +/// +/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso: +/// +/// - Se eliminan los espacios al principio y al final. +/// - Se convierte a minúsculas. +/// - Se sustituyen los espacios intermedios por guiones bajos (`_`). +/// - Si el resultado es una cadena vacía, se guarda `None`. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let name = AttrName::new(" DISplay name "); +/// assert_eq!(name.as_str(), Some("display_name")); +/// +/// let empty = AttrName::default(); +/// assert_eq!(empty.get(), None); +/// ``` +#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] +pub struct AttrName(Option<String>); + +impl AttrName { + /// Crea un nuevo `AttrName` normalizando el valor. + pub fn new(value: impl AsRef<str>) -> Self { + AttrName::default().with_value(value) + } + + // AttrName BUILDER **************************************************************************** + + /// Establece un nombre nuevo normalizando el valor. + #[builder_fn] + pub fn with_value(mut self, value: impl AsRef<str>) -> Self { + let value = value.as_ref().trim().to_ascii_lowercase().replace(' ', "_"); + self.0 = if value.is_empty() { None } else { Some(value) }; + self + } + + // AttrName GETTERS **************************************************************************** + + /// Devuelve el nombre normalizado, si existe. + pub fn get(&self) -> Option<String> { + self.0.as_ref().cloned() + } + + /// Devuelve el nombre normalizado (sin clonar), si existe. + pub fn as_str(&self) -> Option<&str> { + self.0.as_deref() + } + + /// Devuelve el nombre normalizado (propiedad), si existe. + pub fn into_inner(self) -> Option<String> { + self.0 + } + + /// `true` si no hay valor. + pub fn is_empty(&self) -> bool { + self.0.is_none() + } +} diff --git a/src/html/attr_value.rs b/src/html/attr_value.rs new file mode 100644 index 00000000..c70229f9 --- /dev/null +++ b/src/html/attr_value.rs @@ -0,0 +1,65 @@ +use crate::{builder_fn, AutoDefault}; + +/// Cadena normalizada para renderizar en atributos HTML. +/// +/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso: +/// +/// - Se eliminan los espacios al principio y al final. +/// - Si el resultado es una cadena vacía, se guarda `None`. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let s = AttrValue::new(" a new string "); +/// assert_eq!(s.as_str(), Some("a new string")); +/// +/// let empty = AttrValue::default(); +/// assert_eq!(empty.get(), None); +/// ``` +#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] +pub struct AttrValue(Option<String>); + +impl AttrValue { + /// Crea un nuevo `AttrValue` normalizando el valor. + pub fn new(value: impl AsRef<str>) -> Self { + AttrValue::default().with_value(value) + } + + // AttrValue BUILDER *************************************************************************** + + /// Establece una cadena nueva normalizando el valor. + #[builder_fn] + pub fn with_value(mut self, value: impl AsRef<str>) -> Self { + let value = value.as_ref().trim(); + self.0 = if value.is_empty() { + None + } else { + Some(value.to_owned()) + }; + self + } + + // AttrValue GETTERS *************************************************************************** + + /// Devuelve la cadena normalizada, si existe. + pub fn get(&self) -> Option<String> { + self.0.as_ref().cloned() + } + + /// Devuelve la cadena normalizada (sin clonar), si existe. + pub fn as_str(&self) -> Option<&str> { + self.0.as_deref() + } + + /// Devuelve la cadena normalizada (propiedad), si existe. + pub fn into_inner(self) -> Option<String> { + self.0 + } + + /// `true` si no hay valor. + pub fn is_empty(&self) -> bool { + self.0.is_none() + } +} diff --git a/src/html/opt_component.rs b/src/html/opt_component.rs deleted file mode 100644 index 39106d99..00000000 --- a/src/html/opt_component.rs +++ /dev/null @@ -1,68 +0,0 @@ -use crate::builder_fn; -use crate::core::component::{Component, Typed}; -use crate::html::{html, Context, Markup}; - -/// Contenedor de componente para incluir en otros componentes. -/// -/// Este tipo encapsula `Option<Typed<C>>` para incluir un componente de manera segura en otros -/// componentes, útil para representar estructuras complejas. -/// -/// # Ejemplo -/// -/// ```rust,ignore -/// use pagetop::prelude::*; -/// -/// let comp = MyComponent::new(); -/// let opt = OptionComponent::new(comp); -/// assert!(opt.get().is_some()); -/// ``` -pub struct OptionComponent<C: Component>(Option<Typed<C>>); - -impl<C: Component> Default for OptionComponent<C> { - fn default() -> Self { - OptionComponent(None) - } -} - -impl<C: Component> OptionComponent<C> { - /// Crea un nuevo [`OptionComponent`]. - /// - /// El componente se envuelve automáticamente en un [`Typed`] y se almacena. - pub fn new(component: C) -> Self { - OptionComponent::default().with_value(Some(component)) - } - - // OptionComponent BUILDER ********************************************************************* - - /// Establece un componente nuevo, o lo vacía. - /// - /// Si se proporciona `Some(component)`, se guarda en [`Typed`]; y si es `None`, se limpia. - #[builder_fn] - pub fn with_value(mut self, component: Option<C>) -> Self { - if let Some(component) = component { - self.0 = Some(Typed::with(component)); - } else { - self.0 = None; - } - self - } - - // OptionComponent GETTERS ********************************************************************* - - /// Devuelve el componente, si existe. - pub fn get(&self) -> Option<Typed<C>> { - if let Some(value) = &self.0 { - return Some(value.clone()); - } - None - } - - /// Renderiza el componente, si existe. - pub fn render(&self, cx: &mut Context) -> Markup { - if let Some(component) = &self.0 { - component.render(cx) - } else { - html! {} - } - } -} diff --git a/src/html/opt_id.rs b/src/html/opt_id.rs deleted file mode 100644 index 139fdcd6..00000000 --- a/src/html/opt_id.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::{builder_fn, AutoDefault}; - -/// Identificador normalizado para el atributo `id` o similar de HTML. -/// -/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. -/// -/// # Normalización -/// -/// - Se eliminan los espacios al principio y al final. -/// - Se convierte a minúsculas. -/// - Se sustituyen los espacios intermedios por guiones bajos (`_`). -/// - Si el resultado es una cadena vacía, se guarda `None`. -/// -/// # Ejemplo -/// -/// ```rust -/// use pagetop::prelude::*; -/// -/// let id = OptionId::new(" main Section "); -/// assert_eq!(id.get(), Some(String::from("main_section"))); -/// -/// let empty = OptionId::default(); -/// assert_eq!(empty.get(), None); -/// ``` -#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] -pub struct OptionId(Option<String>); - -impl OptionId { - /// Crea un nuevo [`OptionId`]. - /// - /// El valor se normaliza automáticamente. - pub fn new(value: impl AsRef<str>) -> Self { - OptionId::default().with_value(value) - } - - // OptionId BUILDER **************************************************************************** - - /// Establece un identificador nuevo. - /// - /// El valor se normaliza automáticamente. - #[builder_fn] - pub fn with_value(mut self, value: impl AsRef<str>) -> Self { - let value = value.as_ref().trim().to_ascii_lowercase().replace(' ', "_"); - self.0 = (!value.is_empty()).then_some(value); - self - } - - // OptionId GETTERS **************************************************************************** - - /// Devuelve el identificador, si existe. - pub fn get(&self) -> Option<String> { - if let Some(value) = &self.0 { - if !value.is_empty() { - return Some(value.to_owned()); - } - } - None - } -} diff --git a/src/html/opt_name.rs b/src/html/opt_name.rs deleted file mode 100644 index ffb0b989..00000000 --- a/src/html/opt_name.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::{builder_fn, AutoDefault}; - -/// Nombre normalizado para el atributo `name` o similar de HTML. -/// -/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. -/// -/// # Normalización -/// -/// - Se eliminan los espacios al principio y al final. -/// - Se convierte a minúsculas. -/// - Se sustituyen los espacios intermedios por guiones bajos (`_`). -/// - Si el resultado es una cadena vacía, se guarda `None`. -/// -/// # Ejemplo -/// -/// ```rust -/// use pagetop::prelude::*; -/// -/// let name = OptionName::new(" DISplay name "); -/// assert_eq!(name.get(), Some(String::from("display_name"))); -/// -/// let empty = OptionName::default(); -/// assert_eq!(empty.get(), None); -/// ``` -#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] -pub struct OptionName(Option<String>); - -impl OptionName { - /// Crea un nuevo [`OptionName`]. - /// - /// El valor se normaliza automáticamente. - pub fn new(value: impl AsRef<str>) -> Self { - OptionName::default().with_value(value) - } - - // OptionName BUILDER ************************************************************************** - - /// Establece un nombre nuevo. - /// - /// El valor se normaliza automáticamente. - #[builder_fn] - pub fn with_value(mut self, value: impl AsRef<str>) -> Self { - let value = value.as_ref().trim().to_ascii_lowercase().replace(' ', "_"); - self.0 = (!value.is_empty()).then_some(value); - self - } - - // OptionName GETTERS ************************************************************************** - - /// Devuelve el nombre, si existe. - pub fn get(&self) -> Option<String> { - if let Some(value) = &self.0 { - if !value.is_empty() { - return Some(value.to_owned()); - } - } - None - } -} diff --git a/src/html/opt_string.rs b/src/html/opt_string.rs deleted file mode 100644 index 5bfd9c71..00000000 --- a/src/html/opt_string.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::{builder_fn, AutoDefault}; - -/// Cadena normalizada para renderizar en atributos HTML. -/// -/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso. -/// -/// # Normalización -/// -/// - Se eliminan los espacios al principio y al final. -/// - Si el resultado es una cadena vacía, se guarda `None`. -/// -/// # Ejemplo -/// -/// ```rust -/// use pagetop::prelude::*; -/// -/// let s = OptionString::new(" a new string "); -/// assert_eq!(s.get(), Some(String::from("a new string"))); -/// -/// let empty = OptionString::default(); -/// assert_eq!(empty.get(), None); -/// ``` -#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)] -pub struct OptionString(Option<String>); - -impl OptionString { - /// Crea un nuevo [`OptionString`]. - /// - /// El valor se normaliza automáticamente. - pub fn new(value: impl AsRef<str>) -> Self { - OptionString::default().with_value(value) - } - - // OptionString BUILDER ************************************************************************ - - /// Establece una cadena nueva. - /// - /// El valor se normaliza automáticamente. - #[builder_fn] - pub fn with_value(mut self, value: impl AsRef<str>) -> Self { - let value = value.as_ref().trim().to_owned(); - self.0 = (!value.is_empty()).then_some(value); - self - } - - // OptionString GETTERS ************************************************************************ - - /// Devuelve la cadena, si existe. - pub fn get(&self) -> Option<String> { - if let Some(value) = &self.0 { - if !value.is_empty() { - return Some(value.to_owned()); - } - } - None - } -} diff --git a/src/response/page.rs b/src/response/page.rs index f30e299e..ea88e846 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -7,8 +7,10 @@ use crate::base::action; use crate::builder_fn; use crate::core::component::{Child, ChildOp, Component}; use crate::core::theme::{ChildrenInRegions, ThemeRef, REGION_CONTENT}; -use crate::html::{html, AssetsOp, Context, Markup, DOCTYPE}; -use crate::html::{ClassesOp, OptionClasses, OptionId, OptionTranslated}; +use crate::html::{html, Markup, DOCTYPE}; +use crate::html::{AssetsOp, Context}; +use crate::html::{AttrClasses, ClassesOp}; +use crate::html::{AttrId, AttrL10n}; use crate::locale::{CharacterDirection, L10n, LangId, LanguageIdentifier}; use crate::service::HttpRequest; @@ -19,13 +21,13 @@ use crate::service::HttpRequest; /// renderizado. #[rustfmt::skip] pub struct Page { - title : OptionTranslated, - description : OptionTranslated, + title : AttrL10n, + description : AttrL10n, metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, context : Context, - body_id : OptionId, - body_classes: OptionClasses, + body_id : AttrId, + body_classes: AttrClasses, regions : ChildrenInRegions, } @@ -37,13 +39,13 @@ impl Page { #[rustfmt::skip] pub fn new(request: Option<HttpRequest>) -> Self { Page { - title : OptionTranslated::default(), - description : OptionTranslated::default(), + title : AttrL10n::default(), + description : AttrL10n::default(), metadata : Vec::default(), properties : Vec::default(), context : Context::new(request), - body_id : OptionId::default(), - body_classes: OptionClasses::default(), + body_id : AttrId::default(), + body_classes: AttrClasses::default(), regions : ChildrenInRegions::default(), } } @@ -113,7 +115,7 @@ impl Page { self } - /// Modifica las clases CSS del elemento `<body>` con una operación sobre [`OptionClasses`]. + /// Modifica las clases CSS del elemento `<body>` con una operación sobre [`AttrClasses`]. #[builder_fn] pub fn with_body_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { self.body_classes.alter_value(op, classes); @@ -183,12 +185,12 @@ impl Page { } /// Devuelve el identificador del elemento `<body>`. - pub fn body_id(&self) -> &OptionId { + pub fn body_id(&self) -> &AttrId { &self.body_id } /// Devuelve las clases CSS del elemento `<body>`. - pub fn body_classes(&self) -> &OptionClasses { + pub fn body_classes(&self) -> &AttrClasses { &self.body_classes } From fbdce1035c13bc0bb386b0e19001c82650c1a232 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 23 Aug 2025 19:34:26 +0200 Subject: [PATCH 758/853] =?UTF-8?q?=E2=9C=85=20(tests):=20Ampl=C3=ADa=20pr?= =?UTF-8?q?uebas=20para=20`PrepareMarkup'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/html.rs | 105 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 6 deletions(-) diff --git a/tests/html.rs b/tests/html.rs index 315f74ad..1499c709 100644 --- a/tests/html.rs +++ b/tests/html.rs @@ -1,17 +1,110 @@ use pagetop::prelude::*; #[pagetop::test] -async fn prepare_markup_is_empty() { - let _app = service::test::init_service(Application::new().test()).await; +async fn prepare_markup_render_none_is_empty_string() { + assert_eq!(render(&PrepareMarkup::None), ""); +} +#[pagetop::test] +async fn prepare_markup_render_escaped_escapes_html_and_ampersands() { + let pm = PrepareMarkup::Escaped(String::from("<b>& \" ' </b>")); + assert_eq!(render(&pm), "&lt;b&gt;&amp; &quot; ' &lt;/b&gt;"); +} + +#[pagetop::test] +async fn prepare_markup_render_raw_is_inserted_verbatim() { + let pm = PrepareMarkup::Raw(String::from("<b>bold</b><script>1<2</script>")); + assert_eq!(render(&pm), "<b>bold</b><script>1<2</script>"); +} + +#[pagetop::test] +async fn prepare_markup_render_with_keeps_structure() { + let pm = PrepareMarkup::With(html! { + h2 { "Sample title" } + p { "This is a paragraph." } + }); + assert_eq!( + render(&pm), + "<h2>Sample title</h2><p>This is a paragraph.</p>" + ); +} + +#[pagetop::test] +async fn prepare_markup_does_not_double_escape_when_wrapped_in_html_macro() { + // Escaped: dentro de `html!` no debe volver a escaparse. + let escaped = PrepareMarkup::Escaped("<i>x</i>".into()); + let wrapped_escaped = html! { div { (escaped) } }; + assert_eq!( + wrapped_escaped.into_string(), + "<div>&lt;i&gt;x&lt;/i&gt;</div>" + ); + + // Raw: tampoco debe escaparse al integrarlo. + let raw = PrepareMarkup::Raw("<i>x</i>".into()); + let wrapped_raw = html! { div { (raw) } }; + assert_eq!(wrapped_raw.into_string(), "<div><i>x</i></div>"); + + // With: debe incrustar el Markup tal cual. + let with = PrepareMarkup::With(html! { span.title { "ok" } }); + let wrapped_with = html! { div { (with) } }; + assert_eq!( + wrapped_with.into_string(), + "<div><span class=\"title\">ok</span></div>" + ); +} + +#[pagetop::test] +async fn prepare_markup_unicode_is_preserved() { + // Texto con acentos y emojis debe conservarse (salvo el escape HTML de signos). + let esc = PrepareMarkup::Escaped("Hello, tomorrow coffee ☕ & donuts!".into()); + assert_eq!(render(&esc), "Hello, tomorrow coffee ☕ &amp; donuts!"); + + // Raw debe pasar íntegro. + let raw = PrepareMarkup::Raw("Title — section © 2025".into()); + assert_eq!(render(&raw), "Title — section © 2025"); +} + +#[pagetop::test] +async fn prepare_markup_is_empty_semantics() { assert!(PrepareMarkup::None.is_empty()); - assert!(PrepareMarkup::Text(String::from("")).is_empty()); - assert!(!PrepareMarkup::Text(String::from("x")).is_empty()); - assert!(PrepareMarkup::Escaped(String::new()).is_empty()); - assert!(!PrepareMarkup::Escaped("a".into()).is_empty()); + assert!(PrepareMarkup::Escaped(String::from("")).is_empty()); + assert!(!PrepareMarkup::Escaped(String::from("x")).is_empty()); + + assert!(PrepareMarkup::Raw(String::new()).is_empty()); + assert!(PrepareMarkup::Raw(String::from("")).is_empty()); + assert!(!PrepareMarkup::Raw("a".into()).is_empty()); assert!(PrepareMarkup::With(html! {}).is_empty()); assert!(!PrepareMarkup::With(html! { span { "!" } }).is_empty()); + + // Ojo: espacios NO deberían considerarse vacíos (comportamiento actual). + assert!(!PrepareMarkup::Escaped(" ".into()).is_empty()); + assert!(!PrepareMarkup::Raw(" ".into()).is_empty()); +} + +#[pagetop::test] +async fn prepare_markup_equivalence_between_render_and_inline_in_html_macro() { + let cases = [ + PrepareMarkup::None, + PrepareMarkup::Escaped("<b>x</b>".into()), + PrepareMarkup::Raw("<b>x</b>".into()), + PrepareMarkup::With(html! { b { "x" } }), + ]; + + for pm in cases { + let rendered = render(&pm); + let in_macro = html! { (pm) }.into_string(); + assert_eq!( + rendered, in_macro, + "The output of Render and (pm) inside html! must match" + ); + } +} + +// HELPERS ***************************************************************************************** + +fn render(x: &impl Render) -> String { + x.render().into_string() } From fdf7c40da715162c4fc1217e2b841ca493b16fca Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Aug 2025 10:04:51 +0200 Subject: [PATCH 759/853] =?UTF-8?q?=F0=9F=93=9D=20(component):=20Ampl?= =?UTF-8?q?=C3=ADa=20documentaci=C3=B3n=20de=20preparaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añade un párrafo explicando la mejor manera de que `prepare_component()` pueda ser útil a los programadores que sobrescriban su comportamiento. --- src/core/component/definition.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index 2818570a..e9a792d7 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -51,12 +51,17 @@ pub trait Component: AnyInfo + ComponentRender + Send + Sync { #[allow(unused_variables)] fn setup_before_prepare(&mut self, cx: &mut Context) {} - /// Devuelve una representación estructurada del componente lista para renderizar. + /// Devuelve una representación estructurada del componente preparada para el renderizado. /// /// Este método forma parte del ciclo de vida de los componentes y se invoca automáticamente /// durante el proceso de construcción del documento. Puede sobrescribirse para generar /// dinámicamente el contenido HTML con acceso al contexto de renderizado. /// + /// Este método debe ser capaz de preparar el renderizado del componente con los métodos del + /// propio componente y el contexto proporcionado, no debería hacerlo accediendo directamente a + /// los campos de la estructura del componente. Es una forma de garantizar que los programadores + /// podrán sobrescribir este método sin preocuparse por los detalles internos del componente. + /// /// Por defecto, devuelve [`PrepareMarkup::None`]. #[allow(unused_variables)] fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { From c63c4e828914e3a13fd8312e11aedb64f8290999 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Aug 2025 10:05:46 +0200 Subject: [PATCH 760/853] =?UTF-8?q?=F0=9F=92=A1=20Correcci=C3=B3n=20menor?= =?UTF-8?q?=20en=20comentario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/attr_classes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/html/attr_classes.rs b/src/html/attr_classes.rs index 92851aa3..91ccfaf0 100644 --- a/src/html/attr_classes.rs +++ b/src/html/attr_classes.rs @@ -116,7 +116,7 @@ impl AttrClasses { // AttrClasses GETTERS ************************************************************************* - /// Devuele la cadena de clases, si existe. + /// Devuelve la cadena de clases, si existe. pub fn get(&self) -> Option<String> { if self.0.is_empty() { None From c8e232d3890069acd2608611aad4216b5998d0e4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Aug 2025 10:09:22 +0200 Subject: [PATCH 761/853] =?UTF-8?q?=F0=9F=9A=A7=20(html):=20Implementa=20`?= =?UTF-8?q?Default`=20en=20`Context`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/context.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/html/context.rs b/src/html/context.rs index 72c0ff29..96787863 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -117,6 +117,12 @@ pub struct Context { id_counter : usize, // Contador para generar identificadores únicos. } +impl Default for Context { + fn default() -> Self { + Context::new(None) + } +} + impl Context { /// Crea un nuevo contexto asociado a una solicitud HTTP. /// From 551e85b23937d6716bc03860415c7d30ffd68e7a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Aug 2025 10:16:02 +0200 Subject: [PATCH 762/853] =?UTF-8?q?=F0=9F=9A=A7=20Aplica=20recomendaciones?= =?UTF-8?q?=20en=20componente=20Html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/html.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 8f273edb..cac39eaf 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -44,11 +44,13 @@ impl Component for Html { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With((self.0)(cx)) + PrepareMarkup::With(self.html(cx)) } } impl Html { + // Html BUILDER ******************************************************************************** + /// Crea una instancia que generará el `Markup`, con acceso opcional al contexto. /// /// El método [`prepare_component()`](crate::core::component::Component::prepare_component) @@ -66,11 +68,24 @@ impl Html { /// Permite a otras extensiones modificar la función de renderizado que se ejecutará cuando /// [`prepare_component()`](crate::core::component::Component::prepare_component) invoque esta /// instancia. La nueva función también recibe una referencia al contexto ([`Context`]). - pub fn alter_html<F>(&mut self, f: F) -> &mut Self + #[builder_fn] + pub fn with_fn<F>(mut self, f: F) -> Self where F: Fn(&mut Context) -> Markup + Send + Sync + 'static, { self.0 = Box::new(f); self } + + // Html GETTERS ******************************************************************************** + + /// Aplica la función interna de renderizado con el [`Context`] proporcionado. + /// + /// Normalmente no se invoca manualmente, ya que el proceso de renderizado de los componentes lo + /// invoca automáticamente durante la construcción de la página. Puede usarse, no obstante, para + /// sobrescribir [`prepare_component()`](crate::core::component::Component::prepare_component) + /// y alterar el comportamiento del componente. + pub fn html(&self, cx: &mut Context) -> Markup { + (self.0)(cx) + } } From bb759e9a3824509886a8312b96638f07d31e2057 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 24 Aug 2025 10:19:17 +0200 Subject: [PATCH 763/853] =?UTF-8?q?=F0=9F=92=84=20A=C3=B1ade=20componente?= =?UTF-8?q?=20`PoweredBy`=20para=20copyright?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adapta la página de bienvenida al tratamiento revisado de regiones y añade en el pie el componente `PoweredBy` para la nota de copyright. --- src/base/component.rs | 3 + src/base/component/poweredby.rs | 69 ++++++++++++++++++++++ src/base/extension/welcome.rs | 49 ++++++++-------- src/base/theme/basic.rs | 5 ++ src/core/theme/definition.rs | 6 +- src/locale/en-US/base.ftl | 2 + src/locale/es-ES/base.ftl | 2 + static/css/basic.css | 11 ++++ static/css/welcome.css | 54 ++++++++++------- tests/component_poweredby.rs | 100 ++++++++++++++++++++++++++++++++ 10 files changed, 251 insertions(+), 50 deletions(-) create mode 100644 src/base/component/poweredby.rs create mode 100644 src/locale/en-US/base.ftl create mode 100644 src/locale/es-ES/base.ftl create mode 100644 static/css/basic.css create mode 100644 tests/component_poweredby.rs diff --git a/src/base/component.rs b/src/base/component.rs index 27f0f739..1bb160b2 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -2,3 +2,6 @@ mod html; pub use html::Html; + +mod poweredby; +pub use poweredby::PoweredBy; diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs new file mode 100644 index 00000000..5a374645 --- /dev/null +++ b/src/base/component/poweredby.rs @@ -0,0 +1,69 @@ +use crate::prelude::*; + +/// Muestra un texto con información de copyright, típica en un pie de página. +/// +/// Por defecto, usando [`default()`](Self::default) sólo se muestra un +/// reconocimiento a PageTop. Sin embargo, se puede usar [`new()`](Self::new) +/// para crear una instancia con un texto de copyright predeterminado. +#[derive(AutoDefault)] +pub struct PoweredBy { + copyright: Option<String>, +} + +impl Component for PoweredBy { + /// Crea una nueva instancia de `PoweredBy`. + /// + /// El copyright se genera automáticamente con el año actual y el nombre de + /// la aplicación configurada en [`global::SETTINGS`]. + fn new() -> Self { + let year = Utc::now().format("%Y").to_string(); + let c = join!(year, " © ", global::SETTINGS.app.name); + PoweredBy { copyright: Some(c) } + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let poweredby_pagetop = L10n::l("poweredby_pagetop") + .with_arg( + "pagetop_link", + "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", + ) + .to_markup(cx); + + PrepareMarkup::With(html! { + div id=[self.id()] class="poweredby" { + @if let Some(c) = self.copyright() { + span class="poweredby__copyright" { (c) "." } " " + } + span class="poweredby__pagetop" { (poweredby_pagetop) } + } + }) + } +} + +impl PoweredBy { + // PoweredBy BUILDER *************************************************************************** + + /// Establece el texto de copyright que mostrará el componente. + /// + /// Al pasar `Some(valor)` se sobrescribe el texto de copyright por defecto. Al pasar `None` se + /// eliminará, pero en este caso es necesario especificar el tipo explícitamente: + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let p1 = PoweredBy::default().with_copyright(Some("2001 © Foo Inc.")); + /// let p2 = PoweredBy::new().with_copyright(None::<String>); + /// ``` + #[builder_fn] + pub fn with_copyright(mut self, copyright: Option<impl Into<String>>) -> Self { + self.copyright = copyright.map(Into::into); + self + } + + // PoweredBy GETTERS *************************************************************************** + + /// Devuelve el texto de copyright actual, si existe. + pub fn copyright(&self) -> Option<&str> { + self.copyright.as_deref() + } +} diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index 3dda43eb..5f413d3c 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -28,6 +28,7 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { .with_title(L10n::l("welcome_page")) .with_theme("Basic") .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/welcome.css"))) + .with_body_classes(ClassesOp::Add, "welcome") .with_component(Html::with(move |cx| html! { div id="main-header" { header { @@ -58,7 +59,8 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { } } } - + })) + .with_component(Html::with(move |cx| html! { main id="main-content" { section class="content-body" { div id="poweredby-button" { @@ -85,32 +87,31 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { } } } - - footer id="footer" { - section class="footer-inner" { - div class="footer-logo" { - svg - viewBox="0 0 1614 1614" - xmlns="http://www.w3.org/2000/svg" - role="img" - aria-label=[L10n::l("pagetop_logo").using(cx)] - preserveAspectRatio="xMidYMid slice" - focusable="false" - { - path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} - path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} - path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} - } - } - div class="footer-links" { - a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } - a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } - a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code").to_markup(cx)) } - em { (L10n::l("welcome_have_fun").to_markup(cx)) } + })) + .with_component_in("footer", Html::with(move |cx| html! { + section class="welcome-footer" { + div class="welcome-footer__logo" { + svg + viewBox="0 0 1614 1614" + xmlns="http://www.w3.org/2000/svg" + role="img" + aria-label=[L10n::l("pagetop_logo").using(cx)] + preserveAspectRatio="xMidYMid slice" + focusable="false" + { + path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} } } + div class="welcome-footer__links" { + a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } + a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code").to_markup(cx)) } + em { (L10n::l("welcome_have_fun").to_markup(cx)) } + } } - })) + .with_component_in("footer", PoweredBy::new()) .render() } diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index b02abfb5..bc380ac3 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -17,6 +17,11 @@ impl Theme for Basic { StyleSheet::from("/css/normalize.css") .with_version("8.0.1") .with_weight(-99), + )) + .alter_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/css/basic.css") + .with_version(env!("CARGO_PKG_VERSION")) + .with_weight(-99), )); } } diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 8d1b632f..3b26a573 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -94,13 +94,11 @@ pub trait Theme: Extension + Send + Sync { @let region_name = region.name(); div id=(region_name) - class="region" + class={ "region region--" (region_name) } role="region" aria-label=[region_label.using(page)] { - div class={ "region__" (region_name) } { - (output) - } + (output) } } } diff --git a/src/locale/en-US/base.ftl b/src/locale/en-US/base.ftl new file mode 100644 index 00000000..b2c92564 --- /dev/null +++ b/src/locale/en-US/base.ftl @@ -0,0 +1,2 @@ +# PoweredBy component. +poweredby_pagetop = Powered by { $pagetop_link } diff --git a/src/locale/es-ES/base.ftl b/src/locale/es-ES/base.ftl new file mode 100644 index 00000000..74eb62e8 --- /dev/null +++ b/src/locale/es-ES/base.ftl @@ -0,0 +1,2 @@ +# PoweredBy component. +poweredby_pagetop = Funciona con { $pagetop_link } \ No newline at end of file diff --git a/static/css/basic.css b/static/css/basic.css new file mode 100644 index 00000000..312ddf09 --- /dev/null +++ b/static/css/basic.css @@ -0,0 +1,11 @@ +/* Page layout */ + +.region--footer { + padding-bottom: 2rem; +} + +/* PoweredBy component */ + +.poweredby { + text-align: center; +} diff --git a/static/css/welcome.css b/static/css/welcome.css index 76b042b9..7630f3e2 100644 --- a/static/css/welcome.css +++ b/static/css/welcome.css @@ -410,51 +410,61 @@ a:hover:visited { transform: rotate(2deg); } -#footer { - width: 100%; +/* + * Region footer + */ + +.region--footer { background-color: black; color: var(--color-gray); +} + +.welcome-footer { font-size: 1.15rem; font-weight: 300; line-height: 100%; - display: flex; justify-content: center; + display: flex; + flex-direction: column; + max-width: 80rem; + padding: 0 10.625rem 2rem; +/* z-index: 10; +*/ } -#footer a:visited { +.welcome-footer a:visited { color: var(--color-gray); } -.footer-logo { - max-height: 12.625rem; -} -.footer-logo svg { - width: 100%; -} -.footer-logo, -.footer-links, -.footer-inner { +.welcome-footer__logo, +.welcome-footer__links { display: flex; justify-content: center; width: 100%; } -.footer-links { +.welcome-footer__logo { + max-height: 12.625rem; +} +.welcome-footer__logo svg { + width: 100%; +} +.welcome-footer__links { gap: 1.875rem; flex-wrap: wrap; margin-top: 2rem; } -.footer-inner { - max-width: 80rem; - display: flex; - flex-direction: column; - padding: 0 10.625rem 2rem; -} @media (max-width: 48rem) { - .footer-logo { + .welcome-footer__logo { display: none; } } @media (max-width: 64rem) { - .footer-inner { + .welcome-footer { padding: 0 1rem 2rem; } } + +/* PoweredBy component */ + +.poweredby a:visited { + color: var(--color-gray); +} diff --git a/tests/component_poweredby.rs b/tests/component_poweredby.rs new file mode 100644 index 00000000..b2e4418b --- /dev/null +++ b/tests/component_poweredby.rs @@ -0,0 +1,100 @@ +use pagetop::prelude::*; + +#[pagetop::test] +async fn poweredby_default_shows_only_pagetop_recognition() { + let _app = service::test::init_service(Application::new().test()).await; + + let p = PoweredBy::default(); + let html = render_component(&p); + + // Debe mostrar el bloque de reconocimiento a PageTop. + assert!(html.contains("poweredby__pagetop")); + + // Y NO debe mostrar el bloque de copyright. + assert!(!html.contains("poweredby__copyright")); +} + +#[pagetop::test] +async fn poweredby_new_includes_current_year_and_app_name() { + let _app = service::test::init_service(Application::new().test()).await; + + let p = PoweredBy::new(); + let html = render_component(&p); + + let year = Utc::now().format("%Y").to_string(); + assert!(html.contains(&year), "HTML should include the current year"); + + // El nombre de la app proviene de `global::SETTINGS.app.name`. + let app_name = &global::SETTINGS.app.name; + assert!( + html.contains(app_name), + "HTML should include the application name" + ); + + // Debe existir el span de copyright. + assert!(html.contains("poweredby__copyright")); +} + +#[pagetop::test] +async fn poweredby_with_copyright_overrides_text() { + let _app = service::test::init_service(Application::new().test()).await; + + let custom = "2001 © FooBar Inc."; + let p = PoweredBy::default().with_copyright(Some(custom)); + let html = render_component(&p); + + assert!(html.contains(custom)); + assert!(html.contains("poweredby__copyright")); +} + +#[pagetop::test] +async fn poweredby_with_copyright_none_hides_text() { + let _app = service::test::init_service(Application::new().test()).await; + + let p = PoweredBy::new().with_copyright(None::<String>); + let html = render_component(&p); + + assert!(!html.contains("poweredby__copyright")); + // El reconocimiento a PageTop siempre debe aparecer. + assert!(html.contains("poweredby__pagetop")); +} + +#[pagetop::test] +async fn poweredby_link_points_to_crates_io() { + let _app = service::test::init_service(Application::new().test()).await; + + let p = PoweredBy::default(); + let html = render_component(&p); + + assert!( + html.contains("https://crates.io/crates/pagetop"), + "Link should point to crates.io/pagetop" + ); +} + +#[pagetop::test] +async fn poweredby_getter_reflects_internal_state() { + let _app = service::test::init_service(Application::new().test()).await; + + // Por defecto no hay copyright. + let p0 = PoweredBy::default(); + assert_eq!(p0.copyright(), None); + + // Y `new()` lo inicializa con año + nombre de app. + let p1 = PoweredBy::new(); + let c1 = p1.copyright().expect("Expected copyright to exis"); + assert!(c1.contains(&Utc::now().format("%Y").to_string())); + assert!(c1.contains(&global::SETTINGS.app.name)); +} + +// HELPERS ***************************************************************************************** + +fn render(x: &impl Render) -> String { + x.render().into_string() +} + +fn render_component<C: Component>(c: &C) -> String { + let mut cx = Context::default(); + let pm = c.prepare_component(&mut cx); + render(&pm) +} From a38f983f09d73f49ad123c23f03b49fe7a9064a0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Aug 2025 07:12:30 +0200 Subject: [PATCH 764/853] =?UTF-8?q?=F0=9F=90=9B=20(welcome):=20Corrige=20c?= =?UTF-8?q?entrado=20del=20pie=20de=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/welcome.css | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/static/css/welcome.css b/static/css/welcome.css index 7630f3e2..906c05d5 100644 --- a/static/css/welcome.css +++ b/static/css/welcome.css @@ -420,17 +420,15 @@ a:hover:visited { } .welcome-footer { + display: flex; + justify-content: center; + flex-direction: column; + margin: 0 auto; + padding: 0 10.625rem 2rem; + max-width: 80rem; font-size: 1.15rem; font-weight: 300; line-height: 100%; - justify-content: center; - display: flex; - flex-direction: column; - max-width: 80rem; - padding: 0 10.625rem 2rem; -/* - z-index: 10; -*/ } .welcome-footer a:visited { color: var(--color-gray); From 779c16010a2a7a1507590cf917c91f5b7bdde320 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Aug 2025 23:25:39 +0200 Subject: [PATCH 765/853] =?UTF-8?q?=F0=9F=90=9B=20Corrige=20nombre=20de=20?= =?UTF-8?q?funci=C3=B3n=20en=20prueba=20de=20`Html`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/component_html.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/component_html.rs b/tests/component_html.rs index 978248f1..b9b8e5ec 100644 --- a/tests/component_html.rs +++ b/tests/component_html.rs @@ -35,7 +35,7 @@ async fn component_html_renders_using_context_param() { async fn component_html_allows_replacing_render_function() { let mut component = Html::with(|_| html! { div { "Original" } }); - component.alter_html(|_| html! { div { "Modified" } }); + component.alter_fn(|_| html! { div { "Modified" } }); let markup = component .prepare_component(&mut Context::new(None)) From ce5a6c07bda0f3a5ba2dd7d13c0d82427d0969c7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 25 Aug 2025 23:30:53 +0200 Subject: [PATCH 766/853] =?UTF-8?q?=F0=9F=92=84=20Aplica=20BEM=20a=20estil?= =?UTF-8?q?os=20de=20bienvenida=20y=20componente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/poweredby.rs | 26 ++++---- src/base/extension/welcome.rs | 30 +++++---- static/css/welcome.css | 111 +++++++++++++++++--------------- 3 files changed, 88 insertions(+), 79 deletions(-) diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index 5a374645..afa8db72 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -1,10 +1,13 @@ use crate::prelude::*; -/// Muestra un texto con información de copyright, típica en un pie de página. +// Enlace a la página oficial de PageTop. +const LINK: &str = "<a href=\"https://pagetop.cillero.es\" rel=\"noreferrer\">PageTop</a>"; + +/// Componente que renderiza la sección 'Powered by' (*Funciona con*) típica del pie de página. /// -/// Por defecto, usando [`default()`](Self::default) sólo se muestra un -/// reconocimiento a PageTop. Sin embargo, se puede usar [`new()`](Self::new) -/// para crear una instancia con un texto de copyright predeterminado. +/// Por defecto, usando [`default()`](Self::default) sólo se muestra un reconocimiento a PageTop. +/// Sin embargo, se puede usar [`new()`](Self::new) para crear una instancia con un texto de +/// copyright predeterminado. #[derive(AutoDefault)] pub struct PoweredBy { copyright: Option<String>, @@ -13,8 +16,8 @@ pub struct PoweredBy { impl Component for PoweredBy { /// Crea una nueva instancia de `PoweredBy`. /// - /// El copyright se genera automáticamente con el año actual y el nombre de - /// la aplicación configurada en [`global::SETTINGS`]. + /// El copyright se genera automáticamente con el año actual y el nombre de la aplicación + /// configurada en [`global::SETTINGS`]. fn new() -> Self { let year = Utc::now().format("%Y").to_string(); let c = join!(year, " © ", global::SETTINGS.app.name); @@ -22,19 +25,14 @@ impl Component for PoweredBy { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let poweredby_pagetop = L10n::l("poweredby_pagetop") - .with_arg( - "pagetop_link", - "<a href=\"https://crates.io/crates/pagetop\">PageTop</a>", - ) - .to_markup(cx); - PrepareMarkup::With(html! { div id=[self.id()] class="poweredby" { @if let Some(c) = self.copyright() { span class="poweredby__copyright" { (c) "." } " " } - span class="poweredby__pagetop" { (poweredby_pagetop) } + span class="poweredby__pagetop" { + (L10n::l("poweredby_pagetop").with_arg("pagetop_link", LINK).to_markup(cx)) + } } }) } diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index 5f413d3c..f7682104 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -29,19 +29,19 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { .with_theme("Basic") .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/welcome.css"))) .with_body_classes(ClassesOp::Add, "welcome") - .with_component(Html::with(move |cx| html! { - div id="main-header" { - header { + .with_component_in("header", Html::with(move |cx| html! { + div class="welcome-header" { + header class="welcome-header__body" { h1 - id="header-title" + class="welcome-header__title" aria-label=(L10n::l("welcome_aria").with_arg("app", app).to_markup(cx)) { span { (L10n::l("welcome_title").to_markup(cx)) } (L10n::l("welcome_intro").with_arg("app", app).to_markup(cx)) } } - aside id="header-image" aria-hidden="true" { - div id="monster" { + aside class="welcome-header__image" aria-hidden="true" { + div class="welcome-header__monster" { picture { source type="image/avif" @@ -61,25 +61,27 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { } })) .with_component(Html::with(move |cx| html! { - main id="main-content" { - section class="content-body" { - div id="poweredby-button" { + main class="welcome-content" { + section class="welcome-content__body" { + div class="welcome-poweredby" { a - id="poweredby-link" + class="welcome-poweredby__link" href="https://pagetop.cillero.es" target="_blank" rel="noreferrer" { span {} span {} span {} - div id="poweredby-text" { (L10n::l("welcome_powered").to_markup(cx)) } + div class="welcome-poweredby__text" { + (L10n::l("welcome_powered").to_markup(cx)) + } } } - div class="content-text" { + div class="welcome-text" { p { (L10n::l("welcome_text1").to_markup(cx)) } p { (L10n::l("welcome_text2").to_markup(cx)) } - div class="subcontent" { - h1 { span { (L10n::l("welcome_about").to_markup(cx)) } } + div class="welcome-text__block" { + h2 { span { (L10n::l("welcome_about").to_markup(cx)) } } p { (L10n::l("welcome_pagetop").to_markup(cx)) } p { (L10n::l("welcome_issues1").to_markup(cx)) } p { (L10n::l("welcome_issues2").with_arg("app", app).to_markup(cx)) } diff --git a/static/css/welcome.css b/static/css/welcome.css index 906c05d5..4ce8046b 100644 --- a/static/css/welcome.css +++ b/static/css/welcome.css @@ -58,12 +58,17 @@ a:hover:visited { align-items: center; } -#main-header { +/* + * Region header + */ + +.welcome-header { display: flex; flex-direction: column-reverse; - padding-bottom: 9rem; - max-width: 80rem; width: 100%; + max-width: 80rem; + margin: 0 auto; + padding-bottom: 9rem; background-image: var(--bg-img-sm); background-image: var(--bg-img-sm-set); background-position: top center; @@ -71,11 +76,11 @@ a:hover:visited { background-size: contain; background-repeat: no-repeat; } -#main-header header { +.welcome-header__body { padding: 0; background: none; } -#header-title { +.welcome-header__title { margin: 0 0 0 1.5rem; text-align: left; display: flex; @@ -89,7 +94,7 @@ a:hover:visited { line-height: 110%; text-shadow: 0 0.125rem 0.1875rem rgba(0, 0, 0, 0.3); } -#header-title > span { +.welcome-header__title > span { background: linear-gradient(180deg, #ddff95 30%, #ffb84b 100%); background-clip: text; -webkit-background-clip: text; @@ -100,40 +105,44 @@ a:hover:visited { line-height: 110%; text-shadow: none; } -#header-image { - width: 100%; - text-align: right; +.welcome-header__image { display: flex; justify-content: flex-start; + text-align: right; + width: 100%; } -#header-image #monster { +.welcome-header__monster { margin-right: 12rem; margin-top: 1rem; flex-shrink: 1; } @media (min-width: 64rem) { - #main-header { + .welcome-header { background-image: var(--bg-img); background-image: var(--bg-img-set); } - #header-title { + .welcome-header__title { padding: 1.2rem 2rem 2.6rem 2rem; } - #header-image { + .welcome-header__image { justify-content: flex-end; } } -#main-content { +/* + * Region content + */ + +.welcome-content { height: auto; margin-top: 1.6rem; } -.content-body { +.welcome-content__body { box-sizing: border-box; max-width: 80rem; } -.content-body:before, -.content-body:after { +.welcome-content__body:before, +.welcome-content__body:after { content: ''; position: absolute; left: 0; @@ -143,38 +152,38 @@ a:hover:visited { filter: blur(2.75rem); opacity: 0.8; inset: 11.75rem; - z-index: 0; + /*z-index: 0;*/ } -.content-body:before { +.welcome-content__body:before { top: -1rem; } -.content-body:after { +.welcome-content__body:after { bottom: -1rem; } @media (max-width: 48rem) { - .content-body { + .welcome-content__body { margin-top: -9.8rem; } - .content-body:before, - .content-body:after { + .welcome-content__body:before, + .welcome-content__body:after { inset: unset; } } @media (min-width: 64rem) { - #main-content { + .welcome-content { margin-top: 0; } - .content-body { + .welcome-content__body { margin-top: -5.7rem; } } -#poweredby-button { +.welcome-poweredby { width: 100%; margin: 0 auto 3rem; z-index: 10; } -#poweredby-link { +.welcome-poweredby__link { background: #7f1d1d; background-image: linear-gradient(to bottom, rgba(255,0,0,0.8), rgba(255,255,255,0)); background-position: top left, center; @@ -187,7 +196,7 @@ a:hover:visited { font-size: 1.5rem; line-height: 1.3; text-decoration: none; - text-shadow: var(--shadow); + /*text-shadow: var(--shadow);*/ transition: transform 0.3s ease-in-out; position: relative; overflow: hidden; @@ -195,7 +204,7 @@ a:hover:visited { min-height: 7.6875rem; outline: none; } -#poweredby-link::before { +.welcome-poweredby__link::before { content: ''; position: absolute; top: -13.125rem; @@ -207,7 +216,7 @@ a:hover:visited { transition: transform 0.3s ease-in-out; z-index: 5; } -#poweredby-text { +.welcome-poweredby__text { display: flex; flex-direction: column; flex: 1; @@ -217,25 +226,25 @@ a:hover:visited { padding: 1rem 1.5rem; text-align: left; color: white; - text-shadow: 0 0.101125rem 0.2021875rem rgba(0, 0, 0, 0.25); + /*text-shadow: 0 0.101125rem 0.2021875rem rgba(0, 0, 0, 0.25);*/ font-size: 1.65rem; font-style: normal; font-weight: 600; line-height: 130.023%; letter-spacing: 0.0075rem; } -#poweredby-text strong { +.welcome-poweredby__text strong { font-size: 2.625rem; font-weight: 600; line-height: 130.023%; letter-spacing: 0.013125rem; } -#poweredby-link span { +.welcome-poweredby__link span { position: absolute; display: block; pointer-events: none; } -#poweredby-link span:nth-child(1) { +.welcome-poweredby__link span:nth-child(1) { height: 8px; width: 100%; top: 0; @@ -255,7 +264,7 @@ a:hover:visited { transform: translateX(100%); } } -#poweredby-link span:nth-child(2) { +.welcome-poweredby__link span:nth-child(2) { width: 8px; height: 100%; top: 0; @@ -275,7 +284,7 @@ a:hover:visited { transform: translateY(100%); } } -#poweredby-link span:nth-child(3) { +.welcome-poweredby__link span:nth-child(3) { height: 8px; width: 100%; bottom: 0; @@ -295,22 +304,22 @@ a:hover:visited { transform: translateX(-100%); } } -#poweredby-link:hover span { +.welcome-poweredby__link:hover span { animation-play-state: paused; } @media (max-width: 48rem) { - #poweredby-link { + .welcome-poweredby__link { height: 6.25rem; min-width: auto; border-radius: 0; } - #poweredby-text { + .welcome-poweredby__text { display: inline; padding-top: .5rem; } } @media (min-width: 48rem) { - #poweredby-button { + .welcome-poweredby { position: absolute; top: 0; left: 50%; @@ -318,14 +327,14 @@ a:hover:visited { max-width: 29.375rem; margin-bottom: 0; } - #poweredby-link:hover { + .welcome-poweredby__link:hover { transition: all .5s; transform: rotate(-3deg) scale(1.1); - box-shadow: 0px 3px 5px rgba(0,0,0,.4); + /*box-shadow: 0px 3px 5px rgba(0,0,0,.4);*/ } } -.content-text { +.welcome-text { z-index: 1; width: 100%; display: flex; @@ -343,7 +352,7 @@ a:hover:visited { padding: 6rem 1.063rem 0.75rem; overflow: hidden; } -.content-text p { +.welcome-text p { width: 100%; line-height: 150%; font-weight: 400; @@ -351,14 +360,14 @@ a:hover:visited { margin: 0 0 1.5rem; } @media (min-width: 48rem) { - .content-text { + .welcome-text { font-size: 1.375rem; line-height: 2rem; padding-top: 7rem; } } @media (min-width: 64rem) { - .content-text { + .welcome-text { border-radius: 0.75rem; box-shadow: var(--shadow); max-width: 60rem; @@ -368,13 +377,13 @@ a:hover:visited { } } -.subcontent { +.welcome-text__block { position: relative; } -.subcontent h1 { +.welcome-text__block h2 { margin: 1em 0 .8em; } -.subcontent h1 span { +.welcome-text__block h2 span { display: inline-block; padding: 10px 30px 14px; margin: 0 0 0 20px; @@ -385,7 +394,7 @@ a:hover:visited { border-color: orangered; transform: rotate(-3deg) translateY(-25%); } -.subcontent h1:before { +.welcome-text__block h2:before { content: ""; height: 5px; position: absolute; @@ -398,7 +407,7 @@ a:hover:visited { transform: rotate(2deg) translateY(-50%); transform-origin: top left; } -.subcontent h1:after { +.welcome-text__block h2:after { content: ""; height: 70rem; position: absolute; From b315e6d08e825176c8e2927d5151ac460046212b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 3 Sep 2025 21:05:35 +0200 Subject: [PATCH 767/853] =?UTF-8?q?=F0=9F=93=9D=20(doc):=20Normaliza=20ref?= =?UTF-8?q?erencias=20al=20nombre=20PageTop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CREDITS.md | 13 ++++++------- README.md | 24 ++++++++++++------------ helpers/pagetop-build/README.md | 2 +- helpers/pagetop-macros/README.md | 4 ++-- helpers/pagetop-macros/src/lib.rs | 6 +++--- helpers/pagetop-statics/README.md | 6 +++--- helpers/pagetop-statics/src/lib.rs | 4 ++-- src/app.rs | 4 ++-- src/base/action.rs | 2 +- src/base/component.rs | 2 +- src/base/extension.rs | 2 +- src/base/extension/welcome.rs | 2 +- src/base/theme.rs | 2 +- src/base/theme/basic.rs | 2 +- src/config.rs | 6 +++--- src/core.rs | 2 +- src/core/component/definition.rs | 2 +- src/core/extension.rs | 2 +- src/core/extension/definition.rs | 4 ++-- src/core/theme.rs | 2 +- src/global.rs | 2 +- src/lib.rs | 18 +++++++++--------- src/locale.rs | 14 +++++++------- src/prelude.rs | 2 +- src/trace.rs | 4 ++-- 25 files changed, 66 insertions(+), 67 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index f5c1b0fa..c5a7bd2e 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,8 +1,7 @@ # 🔃 Dependencias -`PageTop` está basado en [Rust](https://www.rust-lang.org/) y crece a hombros de gigantes -aprovechando algunas de las librerías más robustas y populares del [ecosistema Rust](https://lib.rs) -como son: +PageTop está basado en [Rust](https://www.rust-lang.org/) y crece a hombros de gigantes aprovechando +algunas de las librerías más robustas y populares del [ecosistema Rust](https://lib.rs) como son: * [Actix Web](https://actix.rs/) para los servicios web. * [Config](https://docs.rs/config) para cargar y procesar las opciones de configuración. @@ -11,14 +10,14 @@ como son: * [Fluent templates](https://github.com/XAMPPRocky/fluent-templates), que integra [Fluent](https://projectfluent.org/) para internacionalizar las aplicaciones. * Además de otros *crates* adicionales que se pueden explorar en los archivos `Cargo.toml` de - `PageTop` y sus extensiones. + PageTop y sus extensiones. # 🗚 FIGfonts -`PageTop` usa el *crate* [figlet-rs](https://crates.io/crates/figlet-rs) desarrollado por -*yuanbohan* para mostrar un banner de presentación en el terminal con el nombre de la aplicación en -caracteres [FIGlet](http://www.figlet.org). Las fuentes incluidas en `pagetop/src/app` son: +PageTop usa el *crate* [figlet-rs](https://crates.io/crates/figlet-rs) desarrollado por *yuanbohan* +para mostrar un banner de presentación en el terminal con el nombre de la aplicación en caracteres +[FIGlet](http://www.figlet.org). Las fuentes incluidas en `pagetop/src/app` son: * [slant.flf](http://www.figlet.org/fontdb_example.cgi?font=slant.flf) de *Glenn Chappell* * [small.flf](http://www.figlet.org/fontdb_example.cgi?font=small.flf) de *Glenn Chappell* diff --git a/README.md b/README.md index e7fab94b..9d5efc88 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ <br> </div> -`PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para -la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. +PageTop reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para la +creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. Ofrece un conjunto de herramientas que los desarrolladores pueden implementar, extender o adaptar según las necesidades de cada proyecto, incluyendo: @@ -24,14 +24,14 @@ según las necesidades de cada proyecto, incluyendo: * **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales, configurables y reutilizables. * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las APIs - de `PageTop` o de terceros. + de PageTop o de terceros. * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y componentes sin comprometer su funcionalidad. # ⚡️ Guía rápida -La aplicación más sencilla de `PageTop` se ve así: +La aplicación más sencilla de PageTop se ve así: ```rust,no_run use pagetop::prelude::*; @@ -42,10 +42,10 @@ async fn main() -> std::io::Result<()> { } ``` -Este código arranca el servidor de `PageTop`. Con la configuración por defecto, muestra una página -de bienvenida accesible desde un navegador local en la dirección `http://localhost:8080`. +Este código arranca el servidor de PageTop. Con la configuración por defecto, muestra una página de +bienvenida accesible desde un navegador local en la dirección `http://localhost:8080`. -Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: +Para personalizar el servicio, se puede crear una extensión de PageTop de la siguiente manera: ```rust,no_run use pagetop::prelude::*; @@ -86,15 +86,15 @@ El código se organiza en un *workspace* donde actualmente se incluyen los sigui * **[pagetop-statics](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-statics)**, es la librería que permite incluir archivos estáticos en el ejecutable de las aplicaciones - `PageTop` para servirlos de forma eficiente, con detección de cambios que optimizan el tiempo - de compilación. + PageTop para servirlos de forma eficiente, con detección de cambios que optimizan el tiempo de + compilación. * **[pagetop-build](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-build)**, prepara los archivos estáticos o archivos SCSS compilados para incluirlos en el binario de las - aplicaciones `PageTop` durante la compilación de los ejecutables. + aplicaciones PageTop durante la compilación de los ejecutables. * **[pagetop-macros](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-macros)**, - proporciona una colección de macros que mejoran la experiencia de desarrollo con `PageTop`. + proporciona una colección de macros que mejoran la experiencia de desarrollo con PageTop. # 🧪 Pruebas @@ -116,7 +116,7 @@ Para simplificar el flujo de trabajo, el repositorio incluye varios **alias de C # 🚧 Advertencia -`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +**PageTop** es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos hasta que se libere la versión **1.0.0**. diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md index 80d6bba2..57273e83 100644 --- a/helpers/pagetop-build/README.md +++ b/helpers/pagetop-build/README.md @@ -113,7 +113,7 @@ impl Extension for MyExtension { # 🚧 Advertencia -`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +**PageTop** es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos hasta que se libere la versión **1.0.0**. diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index e58d24c7..7c9c2e86 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -26,12 +26,12 @@ Esta librería incluye entre sus macros una adaptación de [SmartDefault](https://crates.io/crates/smart_default) (0.7.1) de [Jane Doe](https://crates.io/users/jane-doe), llamada `AutoDefault`. Estas macros eliminan la necesidad de referenciar `maud` o `smart_default` en las dependencias del archivo `Cargo.toml` de -cada proyecto `PageTop`. +cada proyecto PageTop. # 🚧 Advertencia -`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +**PageTop** es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos hasta que se libere la versión **1.0.0**. diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 6421ca6e..b462ea13 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -27,7 +27,7 @@ Esta librería incluye entre sus macros una adaptación de [SmartDefault](https://crates.io/crates/smart_default) (0.7.1) de [Jane Doe](https://crates.io/users/jane-doe), llamada `AutoDefault`. Estas macros eliminan la necesidad de referenciar `maud` o `smart_default` en las dependencias del archivo `Cargo.toml` de -cada proyecto `PageTop`. +cada proyecto PageTop. */ #![doc( @@ -219,7 +219,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { expanded.into() } -/// Define una función `main` asíncrona como punto de entrada de `PageTop`. +/// Define una función `main` asíncrona como punto de entrada de PageTop. /// /// # Ejemplo /// @@ -240,7 +240,7 @@ pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { output } -/// Define funciones de prueba asíncronas para usar con `PageTop`. +/// Define funciones de prueba asíncronas para usar con PageTop. /// /// # Ejemplo /// diff --git a/helpers/pagetop-statics/README.md b/helpers/pagetop-statics/README.md index 92999c04..4168cd4a 100644 --- a/helpers/pagetop-statics/README.md +++ b/helpers/pagetop-statics/README.md @@ -16,7 +16,7 @@ configurables, basadas en HTML, CSS y JavaScript. ## Descripción general -Esta librería permite incluir archivos estáticos en el ejecutable de las aplicaciones `PageTop` para +Esta librería permite incluir archivos estáticos en el ejecutable de las aplicaciones PageTop para servirlos de forma eficiente vía web, con detección de cambios que optimizan el tiempo de compilación. @@ -28,13 +28,13 @@ Para ello, adapta el código de los *crates* [static-files](https://crates.io/cr [4.0.1](https://github.com/kilork/actix-web-static-files/tree/v4.0.1)), desarrollados ambos por [Alexander Korolev](https://crates.io/users/kilork). -Estas implementaciones se integran en `PageTop` para evitar que cada proyecto tenga que declarar +Estas implementaciones se integran en PageTop para evitar que cada proyecto tenga que declarar `static-files` manualmente como dependencia en su `Cargo.toml`. # 🚧 Advertencia -`PageTop` es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +**PageTop** es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos hasta que se libere la versión **1.0.0**. diff --git a/helpers/pagetop-statics/src/lib.rs b/helpers/pagetop-statics/src/lib.rs index dab50d9e..201d90ef 100644 --- a/helpers/pagetop-statics/src/lib.rs +++ b/helpers/pagetop-statics/src/lib.rs @@ -17,7 +17,7 @@ configurables, basadas en HTML, CSS y JavaScript. ## Descripción general -Esta librería permite incluir archivos estáticos en el ejecutable de las aplicaciones `PageTop` para +Esta librería permite incluir archivos estáticos en el ejecutable de las aplicaciones PageTop para servirlos de forma eficiente vía web, con detección de cambios que optimizan el tiempo de compilación. @@ -29,7 +29,7 @@ Para ello, adapta el código de los *crates* [static-files](https://crates.io/cr [4.0.1](https://github.com/kilork/actix-web-static-files/tree/v4.0.1)), desarrollados ambos por [Alexander Korolev](https://crates.io/users/kilork). -Estas implementaciones se integran en `PageTop` para evitar que cada proyecto tenga que declarar +Estas implementaciones se integran en PageTop para evitar que cada proyecto tenga que declarar `static-files` manualmente como dependencia en su `Cargo.toml`. */ diff --git a/src/app.rs b/src/app.rs index 400b0cd3..94d901f1 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,4 +1,4 @@ -//! Prepara y ejecuta una aplicación creada con `Pagetop`. +//! Prepara y ejecuta una aplicación creada con PageTop. mod figfont; @@ -17,7 +17,7 @@ use substring::Substring; use std::io::Error; use std::sync::LazyLock; -/// Punto de entrada de una aplicación `PageTop`. +/// Punto de entrada de una aplicación PageTop. /// /// No almacena datos, **encapsula** el inicio completo de configuración y puesta en marcha. Para /// instanciarla se puede usar [`new()`](Application::new) o [`prepare()`](Application::prepare). diff --git a/src/base/action.rs b/src/base/action.rs index be35e922..977ae9e2 100644 --- a/src/base/action.rs +++ b/src/base/action.rs @@ -1,4 +1,4 @@ -//! Acciones predefinidas para alterar el funcionamiento interno de `PageTop`. +//! Acciones predefinidas para alterar el funcionamiento interno de PageTop. use crate::prelude::*; diff --git a/src/base/component.rs b/src/base/component.rs index 1bb160b2..30cb6866 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -1,4 +1,4 @@ -//! Componentes nativos proporcionados por `PageTop`. +//! Componentes nativos proporcionados por PageTop. mod html; pub use html::Html; diff --git a/src/base/extension.rs b/src/base/extension.rs index 49e408dd..1f94fe23 100644 --- a/src/base/extension.rs +++ b/src/base/extension.rs @@ -1,4 +1,4 @@ -//! Extensiones para funcionalidades avanzadas de `PageTop`. +//! Extensiones para funcionalidades avanzadas de PageTop. mod welcome; pub use welcome::Welcome; diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index f7682104..0252cff3 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -/// Página de bienvenida predeterminada de `PageTop`. +/// Página de bienvenida predeterminada de PageTop. /// /// Esta extensión se instala por defecto y muestra una página en la ruta raíz (`/`) cuando no se ha /// configurado ninguna página de inicio personalizada. Permite confirmar que el servidor está diff --git a/src/base/theme.rs b/src/base/theme.rs index ea9eeb66..40129bfa 100644 --- a/src/base/theme.rs +++ b/src/base/theme.rs @@ -1,4 +1,4 @@ -//! Temas básicos soportados por `PageTop`. +//! Temas básicos soportados por PageTop. mod basic; pub use basic::Basic; diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index bc380ac3..961864be 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -1,4 +1,4 @@ -//! Es el tema básico que incluye `PageTop` por defecto. +//! Es el tema básico que incluye PageTop por defecto. use crate::prelude::*; diff --git a/src/config.rs b/src/config.rs index 27cf630e..f2fb9f7f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -3,7 +3,7 @@ //! Estos ajustes se obtienen de archivos [TOML](https://toml.io) como pares `clave = valor` que se //! mapean a estructuras **fuertemente tipadas** y valores predefinidos. //! -//! Siguiendo la metodología [Twelve-Factor App](https://12factor.net/config), `PageTop` separa el +//! Siguiendo la metodología [Twelve-Factor App](https://12factor.net/config), PageTop separa el //! **código** de la **configuración**, lo que permite tener configuraciones diferentes para cada //! despliegue, como *dev*, *staging* o *production*, sin modificar el código fuente. //! @@ -13,14 +13,14 @@ //! Si tu aplicación necesita archivos de configuración, crea un directorio `config` en la raíz del //! proyecto, al mismo nivel que el archivo *Cargo.toml* o que el binario de la aplicación. //! -//! `PageTop` carga en este orden, y siempre de forma opcional, los siguientes archivos TOML: +//! PageTop carga en este orden, y siempre de forma opcional, los siguientes archivos TOML: //! //! 1. **config/common.toml**, para ajustes comunes a todos los entornos. Este enfoque simplifica el //! mantenimiento al centralizar los valores de configuración comunes. //! //! 2. **config/{rm}.toml**, donde `{rm}` es el valor de la variable de entorno `PAGETOP_RUN_MODE`: //! -//! * Si `PAGETOP_RUN_MODE` no está definida, se asume el valor `default`, y `PageTop` intentará +//! * Si `PAGETOP_RUN_MODE` no está definida, se asume el valor `default`, y PageTop intentará //! cargar *config/default.toml* si el archivo existe. //! //! * Útil para definir configuraciones específicas por entorno, garantizando que cada uno (p.ej. diff --git a/src/core.rs b/src/core.rs index 0c8aa21f..79d92074 100644 --- a/src/core.rs +++ b/src/core.rs @@ -117,7 +117,7 @@ impl TypeInfo { /// /// Este *trait* se implementa automáticamente para **todos** los tipos que implementen [`Any`], de /// modo que basta con traer [`AnyInfo`] al ámbito (`use crate::AnyInfo;`) para disponer de estos -/// métodos adicionales, o usar el [`prelude`](crate::prelude) de `PageTop`. +/// métodos adicionales, o usar el [`prelude`](crate::prelude) de PageTop. /// /// # Ejemplo /// diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index e9a792d7..c43dfb0f 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -11,7 +11,7 @@ pub trait ComponentRender { fn render(&mut self, cx: &mut Context) -> Markup; } -/// Interfaz común que debe implementar un componente renderizable en `PageTop`. +/// Interfaz común que debe implementar un componente renderizable en PageTop. /// /// Se recomienda que los componentes deriven [`AutoDefault`](crate::AutoDefault). También deben /// implementar explícitamente el método [`new()`](Self::new) y pueden sobrescribir los otros diff --git a/src/core/extension.rs b/src/core/extension.rs index cabae5cd..6ae6d333 100644 --- a/src/core/extension.rs +++ b/src/core/extension.rs @@ -1,6 +1,6 @@ //! API para añadir nuevas funcionalidades usando extensiones. //! -//! Cada funcionalidad adicional que quiera incorporarse a una aplicación `PageTop` se debe modelar +//! Cada funcionalidad adicional que quiera incorporarse a una aplicación PageTop se debe modelar //! como una **extensión**. Todas comparten la misma interfaz declarada en [`Extension`]. mod definition; diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 6df70427..90bdbad2 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -10,7 +10,7 @@ use crate::{actions_boxed, service}; /// cualquier hilo de la ejecución sin necesidad de sincronización adicional. pub type ExtensionRef = &'static dyn Extension; -/// Interfaz común que debe implementar cualquier extensión de `PageTop`. +/// Interfaz común que debe implementar cualquier extensión de PageTop. /// /// Este *trait* es fácil de implementar, basta con declarar una estructura de tamaño cero para la /// extensión y sobreescribir los métodos que sea necesario. @@ -63,7 +63,7 @@ pub trait Extension: AnyInfo + Send + Sync { /// Otras extensiones que deben habilitarse **antes** de esta. /// - /// `PageTop` las resolverá automáticamente respetando el orden durante el arranque de la + /// PageTop las resolverá automáticamente respetando el orden durante el arranque de la /// aplicación. fn dependencies(&self) -> Vec<ExtensionRef> { vec![] diff --git a/src/core/theme.rs b/src/core/theme.rs index aa526f16..e0c3008e 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -1,6 +1,6 @@ //! API para añadir y gestionar nuevos temas. //! -//! En `PageTop` un tema es la *piel* de la aplicación, decide cómo se muestra cada documento HTML, +//! En PageTop un tema es la *piel* de la aplicación, decide cómo se muestra cada documento HTML, //! especialmente las páginas de contenido ([`Page`](crate::response::page::Page)), sin alterar la //! lógica interna de sus componentes. //! diff --git a/src/global.rs b/src/global.rs index 8a03589c..6be0774d 100644 --- a/src/global.rs +++ b/src/global.rs @@ -68,7 +68,7 @@ pub struct App { #[derive(Debug, Deserialize)] /// Sección `[Dev]` de la configuración. Forma parte de [`Settings`]. pub struct Dev { - /// Directorio desde el que servir los archivos estáticos de `PageTop`. + /// Directorio desde el que servir los archivos estáticos de PageTop. /// /// Por defecto, los archivos se integran en el binario de la aplicación. Si aquí se indica una /// ruta válida, ya sea absoluta o relativa al directorio del proyecto o del binario en diff --git a/src/lib.rs b/src/lib.rs index 90ea4625..e43da2f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,8 +15,8 @@ <br> </div> -`PageTop` reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para -la creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. +PageTop reivindica la esencia de la web clásica usando [Rust](https://www.rust-lang.org/es) para la +creación de soluciones web SSR (*renderizadas en el servidor*) basadas en HTML, CSS y JavaScript. Ofrece un conjunto de herramientas que los desarrolladores pueden implementar, extender o adaptar según las necesidades de cada proyecto, incluyendo: @@ -25,14 +25,14 @@ según las necesidades de cada proyecto, incluyendo: * **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales, configurables y reutilizables. * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las APIs - de `PageTop` o de terceros. + de PageTop o de terceros. * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y componentes sin comprometer su funcionalidad. # ⚡️ Guía rápida -La aplicación más sencilla de `PageTop` se ve así: +La aplicación más sencilla de PageTop se ve así: ```rust,no_run use pagetop::prelude::*; @@ -43,10 +43,10 @@ async fn main() -> std::io::Result<()> { } ``` -Este código arranca el servidor de `PageTop`. Con la configuración por defecto, muestra una página -de bienvenida accesible desde un navegador local en la dirección `http://localhost:8080`. +Este código arranca el servidor de PageTop. Con la configuración por defecto, muestra una página de +bienvenida accesible desde un navegador local en la dirección `http://localhost:8080`. -Para personalizar el servicio, se puede crear una extensión de `PageTop` de la siguiente manera: +Para personalizar el servicio, se puede crear una extensión de PageTop de la siguiente manera: ```rust,no_run use pagetop::prelude::*; @@ -77,11 +77,11 @@ Este programa implementa una extensión llamada `HelloWorld` que sirve una pági # 🧩 Gestión de Dependencias -Los proyectos que utilizan `PageTop` gestionan las dependencias con `cargo`, como cualquier otro +Los proyectos que utilizan PageTop gestionan las dependencias con `cargo`, como cualquier otro proyecto en Rust. Sin embargo, es fundamental que cada extensión declare explícitamente sus -[dependencias](core::extension::Extension::dependencies), si las tiene, para que `PageTop` pueda +[dependencias](core::extension::Extension::dependencies), si las tiene, para que PageTop pueda estructurar e inicializar la aplicación de forma modular. */ diff --git a/src/locale.rs b/src/locale.rs index f23f51ee..43612bd5 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -1,6 +1,6 @@ //! Localización (L10n). //! -//! `PageTop` utiliza las especificaciones de [Fluent](https://www.projectfluent.org/) para la +//! PageTop utiliza las especificaciones de [Fluent](https://www.projectfluent.org/) para la //! localización de aplicaciones, y aprovecha [fluent-templates](https://docs.rs/fluent-templates/) //! para integrar los recursos de traducción directamente en el binario de la aplicación. //! @@ -87,7 +87,7 @@ //! include_locales!(LOCALES_SAMPLE from "ruta/a/las/traducciones"); //! ``` //! -//! Y *voilà*, sólo queda operar con los idiomas soportados por `PageTop` usando [`LangMatch`] y +//! Y *voilà*, sólo queda operar con los idiomas soportados por PageTop usando [`LangMatch`] y //! traducir textos con [`L10n`]. use crate::html::{Markup, PreEscaped}; @@ -141,10 +141,10 @@ pub trait LangId { fn langid(&self) -> &'static LanguageIdentifier; } -/// Operaciones con los idiomas soportados por `PageTop`. +/// Operaciones con los idiomas soportados por PageTop. /// /// Utiliza [`LangMatch`] para transformar un identificador de idioma en un [`LanguageIdentifier`] -/// soportado por `PageTop`. +/// soportado por PageTop. /// /// # Ejemplos /// @@ -183,11 +183,11 @@ pub trait LangId { pub enum LangMatch { /// Cuando el identificador de idioma es una cadena vacía. Unspecified, - /// Si encuentra un [`LanguageIdentifier`] en la lista de idiomas soportados por `PageTop` que + /// Si encuentra un [`LanguageIdentifier`] en la lista de idiomas soportados por PageTop que /// coincide exactamente con el identificador de idioma (p.ej. "es-ES"), o con el identificador /// del idioma base (p.ej. "es"). Found(&'static LanguageIdentifier), - /// Si el identificador de idioma no está entre los soportados por `PageTop`. + /// Si el identificador de idioma no está entre los soportados por PageTop. Unsupported(String), } @@ -319,7 +319,7 @@ enum L10nOp { /// Cada instancia puede representar: /// /// - Un texto puro (`n()`) que no requiere traducción. -/// - Una clave para traducir un texto de las traducciones predefinidas de `PageTop` (`l()`). +/// - Una clave para traducir un texto de las traducciones predefinidas de PageTop (`l()`). /// - Una clave para traducir de un conjunto concreto de traducciones (`t()`). /// /// # Ejemplo diff --git a/src/prelude.rs b/src/prelude.rs index 9072dec9..484e53c1 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,4 +1,4 @@ -//! *Prelude* de `PageTop`. +//! *Prelude* de PageTop. // RE-EXPORTED. diff --git a/src/trace.rs b/src/trace.rs index c57c6a3c..12e428a8 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -1,13 +1,13 @@ //! Gestión de trazas y registro de eventos de la aplicación. //! -//! `PageTop` recopila información de diagnóstico de la aplicación de forma estructurada y basada en +//! PageTop recopila información de diagnóstico de la aplicación de forma estructurada y basada en //! eventos. //! //! En los sistemas asíncronos, interpretar los mensajes de log tradicionales suele volverse //! complicado. Las tareas individuales se multiplexan en el mismo hilo y los eventos y registros //! asociados se entremezclan, lo que dificulta seguir la secuencia lógica. //! -//! `PageTop` usa [`tracing`](https://docs.rs/tracing) para registrar eventos estructurados y con +//! PageTop usa [`tracing`](https://docs.rs/tracing) para registrar eventos estructurados y con //! información adicional sobre la *temporalidad* y la *causalidad*. A diferencia de un mensaje de //! log, un *span* (intervalo) tiene un momento de inicio y de fin, puede entrar y salir del flujo //! de ejecución y puede existir dentro de un árbol anidado de *spans* similares. Además, estos From fec3c32b8e7b5c1be942423425f97b28d32dd045 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 3 Sep 2025 21:12:19 +0200 Subject: [PATCH 768/853] =?UTF-8?q?=F0=9F=93=9D=20(doc):=20Simplifica=20do?= =?UTF-8?q?cumentaci=C3=B3n=20de=20obsoletos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/service.rs | 67 -------------------------------------------------- src/util.rs | 2 -- 2 files changed, 69 deletions(-) diff --git a/src/service.rs b/src/service.rs index 288e1eb5..09dc6183 100644 --- a/src/service.rs +++ b/src/service.rs @@ -17,31 +17,6 @@ pub use actix_web::test; /// **Obsoleto desde la versión 0.3.0**: usar [`static_files_service!`](crate::static_files_service) /// en su lugar. -/// -/// Incluye en código un conjunto de recursos previamente preparado con `build.rs`. -/// -/// # Formas de uso -/// -/// * `include_files!(media)` - Para incluir un conjunto de recursos llamado `media`. Normalmente se -/// usará esta forma. -/// -/// * `include_files!(BLOG => media)` - También se puede asignar el conjunto de recursos a una -/// variable global; p.ej. `BLOG`. -/// -/// # Argumentos -/// -/// * `$bundle` – Nombre del conjunto de recursos generado por `build.rs` (consultar -/// [`pagetop_build`](https://docs.rs/pagetop-build)). -/// * `$STATIC` – Asigna el conjunto de recursos a una variable global de tipo -/// [`StaticResources`](crate::StaticResources). -/// -/// # Ejemplos -/// -/// ```rust,ignore -/// include_files!(assets); // Uso habitual. -/// -/// include_files!(STATIC_ASSETS => assets); -/// ``` #[deprecated(since = "0.3.0", note = "Use `static_files_service!` instead")] #[macro_export] macro_rules! include_files { @@ -69,48 +44,6 @@ macro_rules! include_files { /// **Obsoleto desde la versión 0.3.0**: usar [`static_files_service!`](crate::static_files_service) /// en su lugar. -/// -/// Configura un servicio web para publicar los recursos embebidos con [`include_files!`]. -/// -/// El código expandido de la macro decide durante el arranque de la aplicación si debe servir los -/// archivos de los recursos embebidos o directamente desde el sistema de ficheros, si se ha -/// indicado una ruta válida a un directorio de recursos. -/// -/// # Argumentos -/// -/// * `$scfg` – Instancia de [`ServiceConfig`](crate::service::web::ServiceConfig) donde aplicar la -/// configuración del servicio web. -/// * `$bundle` – Nombre del conjunto de recursos incluido con [`include_files!`]. -/// * `$route` – Ruta URL de origen desde la que se servirán los archivos. -/// * `[ $root, $relative ]` *(opcional)* – Directorio raíz y ruta relativa para construir la ruta -/// absoluta donde buscar los archivos en el sistema de ficheros (ver -/// [`absolute_dir()`](crate::util::absolute_dir)). Si no existe, se usarán los recursos -/// embebidos. -/// -/// # Ejemplos -/// -/// ```rust,ignore -/// use pagetop::prelude::*; -/// -/// include_files!(assets); -/// -/// pub struct MyExtension; -/// -/// impl Extension for MyExtension { -/// fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { -/// include_files_service!(scfg, assets => "/public"); -/// } -/// } -/// ``` -/// -/// Y para buscar los recursos en el sistema de ficheros (si existe la ruta absoluta): -/// -/// ```rust,ignore -/// include_files_service!(cfg, assets => "/public", ["/var/www", "assets"]); -/// -/// // También desde el directorio actual de ejecución. -/// include_files_service!(cfg, assets => "/public", ["", "static"]); -/// ``` #[deprecated(since = "0.3.0", note = "Use `static_files_service!` instead")] #[macro_export] macro_rules! include_files_service { diff --git a/src/util.rs b/src/util.rs index e70b0998..808014b2 100644 --- a/src/util.rs +++ b/src/util.rs @@ -57,8 +57,6 @@ pub fn resolve_absolute_dir<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> { } /// **Obsoleto desde la versión 0.3.0**: usar [`resolve_absolute_dir()`] en su lugar. -/// -/// Devuelve la ruta absoluta a un directorio existente. #[deprecated(since = "0.3.0", note = "Use `resolve_absolute_dir()` instead")] pub fn absolute_dir<P, Q>(root_path: P, relative_path: Q) -> io::Result<PathBuf> where From fdb8132c37e757abc02de6f63f51db87a37ea5a0 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 4 Sep 2025 00:27:25 +0200 Subject: [PATCH 769/853] =?UTF-8?q?=F0=9F=8E=A8=20(locale):=20Mejora=20el?= =?UTF-8?q?=20uso=20de=20`lookup`=20/=20`using`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/poweredby.rs | 2 +- src/html/attr_l10n.rs | 29 ++++++----- src/html/context.rs | 3 +- src/locale.rs | 86 +++++++++++++++++++-------------- src/response/page.rs | 4 +- tests/locale.rs | 10 ++-- 6 files changed, 75 insertions(+), 59 deletions(-) diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index afa8db72..bfe38351 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -31,7 +31,7 @@ impl Component for PoweredBy { span class="poweredby__copyright" { (c) "." } " " } span class="poweredby__pagetop" { - (L10n::l("poweredby_pagetop").with_arg("pagetop_link", LINK).to_markup(cx)) + (L10n::l("poweredby_pagetop").with_arg("pagetop_link", LINK).using(cx)) } } }) diff --git a/src/html/attr_l10n.rs b/src/html/attr_l10n.rs index cd5b389d..3e8a4e4b 100644 --- a/src/html/attr_l10n.rs +++ b/src/html/attr_l10n.rs @@ -4,7 +4,7 @@ use crate::{builder_fn, AutoDefault}; /// Texto para [traducir](crate::locale) en atributos HTML. /// -/// Encapsula un tipo [`L10n`] para manejar traducciones de forma segura. +/// Encapsula un [`L10n`] para manejar traducciones de forma segura en atributos. /// /// # Ejemplo /// @@ -16,19 +16,19 @@ use crate::{builder_fn, AutoDefault}; /// /// // Español disponible. /// assert_eq!( -/// hello.using(&LangMatch::resolve("es-ES")), +/// hello.lookup(&LangMatch::resolve("es-ES")), /// Some(String::from("¡Hola mundo!")) /// ); /// /// // Japonés no disponible, traduce al idioma de respaldo ("en-US"). /// assert_eq!( -/// hello.using(&LangMatch::resolve("ja-JP")), +/// hello.lookup(&LangMatch::resolve("ja-JP")), /// Some(String::from("Hello world!")) /// ); /// -/// // Para incrustar en HTML escapado: -/// let markup = hello.to_markup(&LangMatch::resolve("es-ES")); -/// assert_eq!(markup.into_string(), "¡Hola mundo!"); +/// // Uso típico en un atributo: +/// let title = hello.value(&LangMatch::resolve("es-ES")); +/// // Ejemplo: html! { a title=(title) { "Link" } } /// ``` #[derive(AutoDefault, Clone, Debug)] pub struct AttrL10n(L10n); @@ -51,15 +51,18 @@ impl AttrL10n { // AttrL10n GETTERS **************************************************************************** /// Devuelve la traducción para `language`, si existe. - pub fn using(&self, language: &impl LangId) -> Option<String> { - self.0.using(language) + pub fn lookup(&self, language: &impl LangId) -> Option<String> { + self.0.lookup(language) } - /// Devuelve la traducción *escapada* como [`Markup`] para `language`, si existe. - /// - /// Útil para incrustar el texto directamente en plantillas HTML sin riesgo de inyección de - /// contenido. + /// Devuelve la traducción para `language` o una cadena vacía si no existe. + pub fn value(&self, language: &impl LangId) -> String { + self.0.lookup(language).unwrap_or_default() + } + + /// **Obsoleto desde la versión 0.4.0**: no recomendado para atributos HTML. + #[deprecated(since = "0.4.0", note = "For attributes use `lookup()` or `value()`")] pub fn to_markup(&self, language: &impl LangId) -> Markup { - self.0.to_markup(language) + self.0.using(language) } } diff --git a/src/html/context.rs b/src/html/context.rs index 96787863..8b7afba3 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -306,8 +306,7 @@ impl Context { /// 4. Y si ninguna de las opciones anteriores aplica, se usa el idioma de respaldo (`"en-US"`). /// /// Resulta útil para usar un contexto ([`Context`]) como fuente de traducción en -/// [`L10n::using()`](crate::locale::L10n::using) o -/// [`L10n::to_markup()`](crate::locale::L10n::to_markup). +/// [`L10n::lookup()`](crate::locale::L10n::lookup) o [`L10n::using()`](crate::locale::L10n::using). impl LangId for Context { fn langid(&self) -> &'static LanguageIdentifier { self.langid diff --git a/src/locale.rs b/src/locale.rs index 43612bd5..cf44dd82 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -13,7 +13,7 @@ //! //! # Recursos Fluent //! -//! Por defecto las traducciones están en el directorio `src/locale`, con subdirectorios para cada +//! Por defecto, las traducciones están en el directorio `src/locale`, con subdirectorios para cada //! [Identificador de Idioma Unicode](https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier) //! válido. Podríamos tener una estructura como esta: //! @@ -34,7 +34,7 @@ //! └── main.ftl //! ``` //! -//! Ejemplo de un archivo en `src/locale/en-US/main.ftl` +//! Ejemplo de un archivo en `src/locale/en-US/main.ftl`: //! //! ```text //! hello-world = Hello world! @@ -53,7 +53,7 @@ //! Y su archivo equivalente para español en `src/locale/es-ES/main.ftl`: //! //! ```text -//! hello-world = Hola mundo! +//! hello-world = ¡Hola, mundo! //! hello-user = ¡Hola, {$userName}! //! shared-photos = //! {$userName} {$photoCount -> @@ -81,7 +81,7 @@ //! include_locales!(LOCALES_SAMPLE); //! ``` //! -//! Si están ubicados en otro directorio se puede usar la forma: +//! Si están ubicados en otro directorio, se puede usar la forma: //! //! ```rust,ignore //! include_locales!(LOCALES_SAMPLE from "ruta/a/las/traducciones"); @@ -129,7 +129,7 @@ pub(crate) static FALLBACK_LANGID: LazyLock<LanguageIdentifier> = // Identificador de idioma **por defecto** para la aplicación. // // Se resuelve a partir de [`global::SETTINGS.app.language`](global::SETTINGS). Si el identificador -// de idioma no es válido o no está disponible entonces resuelve como [`FALLBACK_LANGID`]. +// de idioma no es válido o no está disponible, se usa [`FALLBACK_LANGID`]. pub(crate) static DEFAULT_LANGID: LazyLock<Option<&LanguageIdentifier>> = LazyLock::new(|| LangMatch::resolve(&global::SETTINGS.app.language).as_option()); @@ -155,7 +155,7 @@ pub trait LangId { /// let lang = LangMatch::resolve("es-ES"); /// assert_eq!(lang.langid().to_string(), "es-ES"); /// -/// // Coincidencia parcial (con el idioma base). +/// // Coincidencia parcial (retrocede al idioma base si no hay variante regional). /// let lang = LangMatch::resolve("es-EC"); /// assert_eq!(lang.langid().to_string(), "es-ES"); // Porque "es-EC" no está soportado. /// @@ -221,7 +221,7 @@ impl LangMatch { } } - // En otro caso indica que el idioma no está soportado. + // En caso contrario, indica que el idioma no está soportado. Self::Unsupported(String::from(language)) } @@ -241,7 +241,7 @@ impl LangMatch { /// let lang = LangMatch::resolve("es-ES").as_option(); /// assert_eq!(lang.unwrap().to_string(), "es-ES"); /// - /// let lang = LangMatch::resolve("jp-JP").as_option(); + /// let lang = LangMatch::resolve("ja-JP").as_option(); /// assert!(lang.is_none()); /// ``` #[inline] @@ -259,8 +259,8 @@ impl LangMatch { /// devuelve el idioma por defecto de la aplicación y, si tampoco está disponible, el idioma de /// respaldo ("en-US"). /// -/// Resulta útil para usar un valor de [`LangMatch`] como fuente de traducción en [`L10n::using()`] -/// o [`L10n::to_markup()`]. +/// Resulta útil para usar un valor de [`LangMatch`] como fuente de traducción en [`L10n::lookup()`] +/// o [`L10n::using()`]. impl LangId for LangMatch { fn langid(&self) -> &'static LanguageIdentifier { match self { @@ -271,10 +271,10 @@ impl LangId for LangMatch { } #[macro_export] -/// Define un conjunto de elementos de localización y textos de traducción local. +/// Incluye un conjunto de recursos **Fluent** y textos de traducción propios. macro_rules! include_locales { - // Se eliminan las marcas de aislamiento Unicode en los argumentos para mejorar la legibilidad y - // la compatibilidad en ciertos contextos de renderizado. + // Se desactiva la inserción de marcas de aislamiento Unicode (FSI/PDI) en los argumentos para + // mejorar la legibilidad y la compatibilidad en ciertos contextos de renderizado. ( $LOCALES:ident $(, $core_locales:literal)? ) => { $crate::locale::fluent_templates::static_loader! { static $LOCALES = { @@ -310,8 +310,8 @@ include_locales!(LOCALES_PAGETOP); enum L10nOp { #[default] None, - Text(String), - Translate(String), + Text(Cow<'static, str>), + Translate(Cow<'static, str>), } /// Crea instancias para traducir textos localizados. @@ -324,7 +324,7 @@ enum L10nOp { /// /// # Ejemplo /// -/// Los argumentos dinámicos se añaden usando `with_arg()` o `with_args()`. +/// Los argumentos dinámicos se añaden con `with_arg()` o `with_args()`. /// /// ```rust /// use pagetop::prelude::*; @@ -338,11 +338,11 @@ enum L10nOp { /// .get(); /// ``` /// -/// También para traducciones a idiomas concretos. +/// También sirve para traducciones contra un conjunto de recursos concreto. /// /// ```rust,ignore /// // Traducción con clave, conjunto de traducciones y fuente de idioma. -/// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).using(&LangMatch::resolve("it")); +/// let bye = L10n::t("goodbye", &LOCALES_CUSTOM).lookup(&LangMatch::resolve("it")); /// ``` #[derive(AutoDefault, Clone)] pub struct L10n { @@ -354,7 +354,7 @@ pub struct L10n { impl L10n { /// **n** = *“native”*. Crea una instancia con una cadena literal sin traducción. - pub fn n(text: impl Into<String>) -> Self { + pub fn n(text: impl Into<Cow<'static, str>>) -> Self { L10n { op: L10nOp::Text(text.into()), ..Default::default() @@ -363,7 +363,7 @@ impl L10n { /// **l** = *“lookup”*. Crea una instancia para traducir usando una clave del conjunto de /// traducciones predefinidas. - pub fn l(key: impl Into<String>) -> Self { + pub fn l(key: impl Into<Cow<'static, str>>) -> Self { L10n { op: L10nOp::Translate(key.into()), ..Default::default() @@ -372,7 +372,7 @@ impl L10n { /// **t** = *“translate”*. Crea una instancia para traducir usando una clave de un conjunto de /// traducciones específico. - pub fn t(key: impl Into<String>, locales: &'static Locales) -> Self { + pub fn t(key: impl Into<Cow<'static, str>>, locales: &'static Locales) -> Self { L10n { op: L10nOp::Translate(key.into()), locales, @@ -399,7 +399,8 @@ impl L10n { self } - /// Resuelve la traducción usando el idioma por defecto o de respaldo de la aplicación. + /// Resuelve la traducción usando el idioma por defecto o, si no procede, el de respaldo de la + /// aplicación. /// /// Devuelve `None` si no aplica o no encuentra una traducción válida. /// @@ -411,7 +412,7 @@ impl L10n { /// let text = L10n::l("greeting").with_arg("name", "Manuel").get(); /// ``` pub fn get(&self) -> Option<String> { - self.using(&LangMatch::default()) + self.lookup(&LangMatch::default()) } /// Resuelve la traducción usando la fuente de idioma proporcionada. @@ -432,20 +433,27 @@ impl L10n { /// } /// /// let r = ResourceLang; - /// let text = L10n::l("greeting").with_arg("name", "Usuario").using(&r); + /// let text = L10n::l("greeting").with_arg("name", "Usuario").lookup(&r); /// ``` - pub fn using(&self, language: &impl LangId) -> Option<String> { + pub fn lookup(&self, language: &impl LangId) -> Option<String> { match &self.op { L10nOp::None => None, - L10nOp::Text(text) => Some(text.to_owned()), - L10nOp::Translate(key) => self.locales.try_lookup_with_args( - language.langid(), - key, - &self.args.iter().fold(HashMap::new(), |mut arg, (k, v)| { - arg.insert(Cow::Owned(k.clone()), v.to_owned().into()); - arg - }), - ), + L10nOp::Text(text) => Some(text.clone().into_owned()), + L10nOp::Translate(key) => { + if self.args.is_empty() { + self.locales.try_lookup(language.langid(), key.as_ref()) + } else { + self.locales.try_lookup_with_args( + language.langid(), + key.as_ref(), + &self + .args + .iter() + .map(|(k, v)| (Cow::Owned(k.clone()), v.clone().into())) + .collect::<HashMap<_, _>>(), + ) + } + } } } @@ -458,10 +466,16 @@ impl L10n { /// ```rust /// use pagetop::prelude::*; /// - /// let html = L10n::l("welcome.message").to_markup(&LangMatch::resolve("es")); + /// let html = L10n::l("welcome.message").using(&LangMatch::resolve("es")); /// ``` + pub fn using(&self, language: &impl LangId) -> Markup { + PreEscaped(self.lookup(language).unwrap_or_default()) + } + + /// **Obsoleto desde la versión 0.4.0**: usar [`using()`](Self::using) en su lugar. + #[deprecated(since = "0.4.0", note = "Use `using()` instead")] pub fn to_markup(&self, language: &impl LangId) -> Markup { - PreEscaped(self.using(language).unwrap_or_default()) + self.using(language) } } diff --git a/src/response/page.rs b/src/response/page.rs index ea88e846..7ef52703 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -151,12 +151,12 @@ impl Page { /// Devuelve el título traducido para el idioma de la página, si existe. pub fn title(&mut self) -> Option<String> { - self.title.using(&self.context) + self.title.lookup(&self.context) } /// Devuelve la descripción traducida para el idioma de la página, si existe. pub fn description(&mut self) -> Option<String> { - self.description.using(&self.context) + self.description.lookup(&self.context) } /// Devuelve la lista de metadatos `<meta name=...>`. diff --git a/tests/locale.rs b/tests/locale.rs index ef875d7d..ee7ac27c 100644 --- a/tests/locale.rs +++ b/tests/locale.rs @@ -13,7 +13,7 @@ async fn translation_without_args() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-world"); - let translation = l10n.using(&LangMatch::resolve("es-ES")); + let translation = l10n.lookup(&LangMatch::resolve("es-ES")); assert_eq!(translation, Some("¡Hola mundo!".to_string())); } @@ -22,7 +22,7 @@ async fn translation_with_args() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-user").with_arg("userName", "Manuel"); - let translation = l10n.using(&LangMatch::resolve("es-ES")); + let translation = l10n.lookup(&LangMatch::resolve("es-ES")); assert_eq!(translation, Some("¡Hola, Manuel!".to_string())); } @@ -35,7 +35,7 @@ async fn translation_with_plural_and_select() { ("photoCount", "3"), ("userGender", "male"), ]); - let translation = l10n.using(&LangMatch::resolve("es-ES")).unwrap(); + let translation = l10n.lookup(&LangMatch::resolve("es-ES")).unwrap(); assert!(translation.contains("añadido 3 nuevas fotos de él")); } @@ -44,7 +44,7 @@ async fn check_fallback_language() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("test-hello-world"); - let translation = l10n.using(&LangMatch::resolve("xx-YY")); // Retrocede a "en-US". + let translation = l10n.lookup(&LangMatch::resolve("xx-YY")); // Retrocede a "en-US". assert_eq!(translation, Some("Hello world!".to_string())); } @@ -53,6 +53,6 @@ async fn check_unknown_key() { let _app = service::test::init_service(Application::new().test()).await; let l10n = L10n::l("non-existent-key"); - let translation = l10n.using(&LangMatch::resolve("en-US")); + let translation = l10n.lookup(&LangMatch::resolve("en-US")); assert_eq!(translation, None); } From 543f2de333adf8b7635b2556dd98796ddfb0e99b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 4 Sep 2025 01:11:03 +0200 Subject: [PATCH 770/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20`with=5Fcompo?= =?UTF-8?q?nent`=20por=20`add=5Fcomponent`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/hello-name.rs | 2 +- examples/hello-world.rs | 2 +- src/core/theme/regions.rs | 12 +++++------ src/response/page.rs | 42 ++++++++++++++++++++++++++++++++------ src/response/page/error.rs | 4 ++-- 5 files changed, 46 insertions(+), 16 deletions(-) diff --git a/examples/hello-name.rs b/examples/hello-name.rs index 7a6db545..3a491a68 100644 --- a/examples/hello-name.rs +++ b/examples/hello-name.rs @@ -14,7 +14,7 @@ async fn hello_name( ) -> ResultPage<Markup, ErrorPage> { let name = path.into_inner(); Page::new(Some(request)) - .with_component(Html::with(move |_| html! { h1 { "Hello " (name) "!" } })) + .add_component(Html::with(move |_| html! { h1 { "Hello " (name) "!" } })) .render() } diff --git a/examples/hello-world.rs b/examples/hello-world.rs index ba268dcd..5550514b 100644 --- a/examples/hello-world.rs +++ b/examples/hello-world.rs @@ -10,7 +10,7 @@ impl Extension for HelloWorld { async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(Some(request)) - .with_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + .add_component(Html::with(move |_| html! { h1 { "Hello World!" } })) .render() } diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index c8a05554..4fcd7dfa 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -77,11 +77,11 @@ pub struct ChildrenInRegions(HashMap<&'static str, Children>); impl ChildrenInRegions { pub fn with(region_name: &'static str, child: Child) -> Self { - ChildrenInRegions::default().with_child_in_region(region_name, ChildOp::Add(child)) + ChildrenInRegions::default().with_child_in(region_name, ChildOp::Add(child)) } #[builder_fn] - pub fn with_child_in_region(mut self, region_name: &'static str, op: ChildOp) -> Self { + pub fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { if let Some(region) = self.0.get_mut(region_name) { region.alter_child(op); } else { @@ -143,17 +143,17 @@ impl InRegion { InRegion::Content => { COMMON_REGIONS .write() - .alter_child_in_region(REGION_CONTENT, ChildOp::Add(child)); + .alter_child_in(REGION_CONTENT, ChildOp::Add(child)); } - InRegion::Named(name) => { + InRegion::Named(region_name) => { COMMON_REGIONS .write() - .alter_child_in_region(name, ChildOp::Add(child)); + .alter_child_in(region_name, ChildOp::Add(child)); } InRegion::OfTheme(region_name, theme_ref) => { let mut regions = THEME_REGIONS.write(); if let Some(r) = regions.get_mut(&theme_ref.type_id()) { - r.alter_child_in_region(region_name, ChildOp::Add(child)); + r.alter_child_in(region_name, ChildOp::Add(child)); } else { regions.insert( theme_ref.type_id(), diff --git a/src/response/page.rs b/src/response/page.rs index 7ef52703..5ac3720c 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -122,28 +122,58 @@ impl Page { self } + /// **Obsoleto desde la versión 0.4.0**: usar [`add_component()`](Self::add_component) en su + /// lugar. + #[deprecated(since = "0.4.0", note = "Use `add_component()` instead")] + pub fn with_component(self, component: impl Component) -> Self { + self.add_component(component) + } + + /// **Obsoleto desde la versión 0.4.0**: usar [`add_component_in()`](Self::add_component_in) en + /// su lugar. + #[deprecated(since = "0.4.0", note = "Use `add_component_in()` instead")] + pub fn with_component_in(self, region_name: &'static str, component: impl Component) -> Self { + self.add_component_in(region_name, component) + } + /// Añade un componente a la región de contenido por defecto. - pub fn with_component(mut self, component: impl Component) -> Self { + pub fn add_component(mut self, component: impl Component) -> Self { self.regions - .alter_child_in_region(REGION_CONTENT, ChildOp::Add(Child::with(component))); + .alter_child_in(REGION_CONTENT, ChildOp::Add(Child::with(component))); self } /// Añade un componente en una región (`region_name`) de la página. - pub fn with_component_in( + pub fn add_component_in( mut self, region_name: &'static str, component: impl Component, ) -> Self { self.regions - .alter_child_in_region(region_name, ChildOp::Add(Child::with(component))); + .alter_child_in(region_name, ChildOp::Add(Child::with(component))); + self + } + + /// **Obsoleto desde la versión 0.4.0**: usar [`with_child_in()`](Self::with_child_in) en su + /// lugar. + #[deprecated(since = "0.4.0", note = "Use `with_child_in()` instead")] + pub fn with_child_in_region(mut self, region_name: &'static str, op: ChildOp) -> Self { + self.alter_child_in(region_name, op); + self + } + + /// **Obsoleto desde la versión 0.4.0**: usar [`alter_child_in()`](Self::alter_child_in) en su + /// lugar. + #[deprecated(since = "0.4.0", note = "Use `alter_child_in()` instead")] + pub fn alter_child_in_region(&mut self, region_name: &'static str, op: ChildOp) -> &mut Self { + self.alter_child_in(region_name, op); self } /// Opera con [`ChildOp`] en una región (`region_name`) de la página. #[builder_fn] - pub fn with_child_in_region(mut self, region_name: &'static str, op: ChildOp) -> Self { - self.regions.alter_child_in_region(region_name, op); + pub fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { + self.regions.alter_child_in(region_name, op); self } diff --git a/src/response/page/error.rs b/src/response/page/error.rs index 99ba62bf..ab56338f 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -33,7 +33,7 @@ impl Display for ErrorPage { if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) .with_layout("error") - .with_component(Html::with(move |_| error403.clone())) + .add_component(Html::with(move |_| error403.clone())) .render() { write!(f, "{}", page.into_string()) @@ -48,7 +48,7 @@ impl Display for ErrorPage { if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) .with_layout("error") - .with_component(Html::with(move |_| error404.clone())) + .add_component(Html::with(move |_| error404.clone())) .render() { write!(f, "{}", page.into_string()) From 970442a45aaeea242073845d4cfbfd5109d00653 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 4 Sep 2025 01:12:59 +0200 Subject: [PATCH 771/853] =?UTF-8?q?=F0=9F=9A=A7=20Retoques=20en=20el=20c?= =?UTF-8?q?=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 2 +- tests/component_poweredby.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index b462ea13..0a60d532 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -191,7 +191,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { // Genera el método alter_...() con el código del método with_...(). let fn_alter_doc = - format!("Igual que [`Self::{fn_with_name_str}()`], pero sin usar el patrón *builder*."); + format!("Equivalente a [`Self::{fn_with_name_str}()`], pero sin usar el patrón *builder*."); let fn_alter = quote! { #[doc = #fn_alter_doc] diff --git a/tests/component_poweredby.rs b/tests/component_poweredby.rs index b2e4418b..9f8e8222 100644 --- a/tests/component_poweredby.rs +++ b/tests/component_poweredby.rs @@ -67,8 +67,8 @@ async fn poweredby_link_points_to_crates_io() { let html = render_component(&p); assert!( - html.contains("https://crates.io/crates/pagetop"), - "Link should point to crates.io/pagetop" + html.contains("https://pagetop.cillero.es"), + "Link should point to pagetop.cillero.es" ); } From c43c8458cce0453d8c7fd34579ae51f92a27a7ed Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 4 Sep 2025 01:53:51 +0200 Subject: [PATCH 772/853] =?UTF-8?q?=F0=9F=9A=A7=20(welcome):=20Crea=20p?= =?UTF-8?q?=C3=A1gina=20de=20bienvenida=20desde=20intro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implementa un nuevo *layout* en el tema `Basic` para crear una plantilla de páginas de introducción. - Añade nuevo fichero CSS `intro.css` para los estilos globales de la página de introducción. - Incorpora nuevos recursos gráficos para la cabecera de la página de introducción en varios formatos (AVIF, WebP, JPEG). - Revisa los ficheros de localización. --- src/base/component.rs | 3 + src/base/component/block.rs | 103 +++++++++ src/base/extension/welcome.rs | 105 ++------- src/base/theme/basic.rs | 91 +++++++- src/core/component/definition.rs | 6 +- src/core/theme.rs | 6 +- src/core/theme/definition.rs | 210 +++++++++++------- src/core/theme/regions.rs | 2 +- src/locale/en-US/welcome.ftl | 1 - src/locale/es-ES/welcome.ftl | 1 - static/css/{welcome.css => intro.css} | 150 ++++++------- ...me-header-sm.avif => intro-header-sm.avif} | Bin ...come-header-sm.jpg => intro-header-sm.jpg} | Bin ...me-header-sm.webp => intro-header-sm.webp} | Bin ...{welcome-header.avif => intro-header.avif} | Bin .../{welcome-header.jpg => intro-header.jpg} | Bin ...{welcome-header.webp => intro-header.webp} | Bin 17 files changed, 420 insertions(+), 258 deletions(-) create mode 100644 src/base/component/block.rs rename static/css/{welcome.css => intro.css} (78%) rename static/img/{welcome-header-sm.avif => intro-header-sm.avif} (100%) rename static/img/{welcome-header-sm.jpg => intro-header-sm.jpg} (100%) rename static/img/{welcome-header-sm.webp => intro-header-sm.webp} (100%) rename static/img/{welcome-header.avif => intro-header.avif} (100%) rename static/img/{welcome-header.jpg => intro-header.jpg} (100%) rename static/img/{welcome-header.webp => intro-header.webp} (100%) diff --git a/src/base/component.rs b/src/base/component.rs index 30cb6866..4df64ff1 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -3,5 +3,8 @@ mod html; pub use html::Html; +mod block; +pub use block::Block; + mod poweredby; pub use poweredby::PoweredBy; diff --git a/src/base/component/block.rs b/src/base/component/block.rs new file mode 100644 index 00000000..c96f2baf --- /dev/null +++ b/src/base/component/block.rs @@ -0,0 +1,103 @@ +use crate::prelude::*; + +/// Componente genérico que representa un bloque de contenido. +/// +/// Los bloques se utilizan como contenedores de otros componentes o contenidos, con un título +/// opcional y un cuerpo que sólo se renderiza si existen componentes hijos (*children*). +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Block { + id : AttrId, + classes : AttrClasses, + title : L10n, + children: Children, +} + +impl Component for Block { + fn new() -> Self { + Block::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes(ClassesOp::Prepend, "block"); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let block_body = self.children().render(cx); + + if block_body.is_empty() { + return PrepareMarkup::None; + } + + let id = cx.required_id::<Block>(self.id()); + + PrepareMarkup::With(html! { + div id=(id) class=[self.classes().get()] { + @if let Some(title) = self.title().lookup(cx) { + h2 class="block__title" { span { (title) } } + } + div class="block__body" { (block_body) } + } + }) + } +} + +impl Block { + // Block BUILDER ******************************************************************************* + + /// Establece el identificador único (`id`) del bloque. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al bloque. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Establece el título del bloque. + #[builder_fn] + pub fn with_title(mut self, title: L10n) -> Self { + self.title = title; + self + } + + /// Añade un nuevo componente hijo al bloque. + pub fn add_component(mut self, component: impl Component) -> Self { + self.children + .alter_child(ChildOp::Add(Child::with(component))); + self + } + + /// Modifica la lista de hijos (`children`) aplicando una operación. + #[builder_fn] + pub fn with_child(mut self, op: ChildOp) -> Self { + self.children.alter_child(op); + self + } + + // Block GETTERS ******************************************************************************* + + /// Devuelve las clases CSS asociadas al bloque. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el título del bloque como [`L10n`]. + pub fn title(&self) -> &L10n { + &self.title + } + + /// Devuelve la lista de hijos (`children`) del bloque. + pub fn children(&self) -> &Children { + &self.children + } +} diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index 0252cff3..3c0de3db 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -25,95 +25,26 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { let app = &global::SETTINGS.app.name; Page::new(Some(request)) - .with_title(L10n::l("welcome_page")) - .with_theme("Basic") - .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/welcome.css"))) - .with_body_classes(ClassesOp::Add, "welcome") - .with_component_in("header", Html::with(move |cx| html! { - div class="welcome-header" { - header class="welcome-header__body" { - h1 - class="welcome-header__title" - aria-label=(L10n::l("welcome_aria").with_arg("app", app).to_markup(cx)) - { - span { (L10n::l("welcome_title").to_markup(cx)) } - (L10n::l("welcome_intro").with_arg("app", app).to_markup(cx)) - } - } - aside class="welcome-header__image" aria-hidden="true" { - div class="welcome-header__monster" { - picture { - source - type="image/avif" - src="/img/monster-pagetop_250.avif" - srcset="/img/monster-pagetop_500.avif 1.5x"; - source - type="image/webp" - src="/img/monster-pagetop_250.webp" - srcset="/img/monster-pagetop_500.webp 1.5x"; - img - src="/img/monster-pagetop_250.png" - srcset="/img/monster-pagetop_500.png 1.5x" - alt="Monster PageTop"; - } - } - } + .with_theme("basic") + .with_layout("intro") + .with_title(L10n::l("welcome_title")) + .with_description(L10n::l("welcome_intro").with_arg("app", app)) + .add_component(Html::with(|cx| { + html! { + p { (L10n::l("welcome_text1").using(cx)) } + p { (L10n::l("welcome_text2").using(cx)) } } })) - .with_component(Html::with(move |cx| html! { - main class="welcome-content" { - section class="welcome-content__body" { - div class="welcome-poweredby" { - a - class="welcome-poweredby__link" - href="https://pagetop.cillero.es" - target="_blank" - rel="noreferrer" - { - span {} span {} span {} - div class="welcome-poweredby__text" { - (L10n::l("welcome_powered").to_markup(cx)) - } - } + .add_component( + Block::new() + .with_title(L10n::l("welcome_about")) + .add_component(Html::with(move |cx| { + html! { + p { (L10n::l("welcome_pagetop").using(cx)) } + p { (L10n::l("welcome_issues1").using(cx)) } + p { (L10n::l("welcome_issues2").with_arg("app", app).using(cx)) } } - div class="welcome-text" { - p { (L10n::l("welcome_text1").to_markup(cx)) } - p { (L10n::l("welcome_text2").to_markup(cx)) } - - div class="welcome-text__block" { - h2 { span { (L10n::l("welcome_about").to_markup(cx)) } } - p { (L10n::l("welcome_pagetop").to_markup(cx)) } - p { (L10n::l("welcome_issues1").to_markup(cx)) } - p { (L10n::l("welcome_issues2").with_arg("app", app).to_markup(cx)) } - } - } - } - } - })) - .with_component_in("footer", Html::with(move |cx| html! { - section class="welcome-footer" { - div class="welcome-footer__logo" { - svg - viewBox="0 0 1614 1614" - xmlns="http://www.w3.org/2000/svg" - role="img" - aria-label=[L10n::l("pagetop_logo").using(cx)] - preserveAspectRatio="xMidYMid slice" - focusable="false" - { - path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} - path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} - path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} - } - } - div class="welcome-footer__links" { - a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } - a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } - a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code").to_markup(cx)) } - em { (L10n::l("welcome_have_fun").to_markup(cx)) } - } - } - })) - .with_component_in("footer", PoweredBy::new()) + })), + ) .render() } diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 961864be..dc16f2ac 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -12,16 +12,105 @@ impl Extension for Basic { } impl Theme for Basic { + fn render_page_body(&self, page: &mut Page) -> Markup { + match page.layout() { + "intro" => render_intro(page), + _ => <Self as ThemePage>::render_body(self, page, self.page_regions()), + } + } + fn after_render_page_body(&self, page: &mut Page) { + let styles = match page.layout() { + "intro" => "/css/intro.css", + _ => "/css/basic.css", + }; page.alter_assets(AssetsOp::AddStyleSheet( StyleSheet::from("/css/normalize.css") .with_version("8.0.1") .with_weight(-99), )) .alter_assets(AssetsOp::AddStyleSheet( - StyleSheet::from("/css/basic.css") + StyleSheet::from(styles) .with_version(env!("CARGO_PKG_VERSION")) .with_weight(-99), )); } } + +fn render_intro(page: &mut Page) -> Markup { + let title = page.title().unwrap_or_default(); + let intro = page.description().unwrap_or_default(); + + html! { + body id=[page.body_id().get()] class=[page.body_classes().get()] { + header class="intro-header" { + section class="intro-header__body" { + h1 class="intro-header__title" { + span { (title) } + (intro) + } + } + aside class="intro-header__image" aria-hidden="true" { + div class="intro-header__monster" { + picture { + source + type="image/avif" + src="/img/monster-pagetop_250.avif" + srcset="/img/monster-pagetop_500.avif 1.5x"; + source + type="image/webp" + src="/img/monster-pagetop_250.webp" + srcset="/img/monster-pagetop_500.webp 1.5x"; + img + src="/img/monster-pagetop_250.png" + srcset="/img/monster-pagetop_500.png 1.5x" + alt="Monster PageTop"; + } + } + } + } + main class="intro-content" { + section class="intro-content__body" { + div class="intro-button" { + a + class="intro-button__link" + href="https://pagetop.cillero.es" + target="_blank" + rel="noreferrer" + { + span {} span {} span {} + div class="intro-button__text" { + (L10n::l("welcome_powered").using(page)) + } + } + } + div class="intro-text" { (page.render_region("content")) } + } + } + footer class="intro-footer" { + section class="intro-footer__body" { + div class="intro-footer__logo" { + svg + viewBox="0 0 1614 1614" + xmlns="http://www.w3.org/2000/svg" + role="img" + aria-label=[L10n::l("pagetop_logo").lookup(page)] + preserveAspectRatio="xMidYMid slice" + focusable="false" + { + path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} + } + } + div class="intro-footer__links" { + a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } + a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code").using(page)) } + em { (L10n::l("welcome_have_fun").using(page)) } + } + } + } + } + } +} diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index c43dfb0f..d547c4b3 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -29,14 +29,14 @@ pub trait Component: AnyInfo + ComponentRender + Send + Sync { TypeInfo::ShortName.of::<Self>() } - /// Devuelve una descripción opcional del componente. + /// Devuelve una descripción del componente, si existe. /// /// Por defecto, no se proporciona ninguna descripción (`None`). fn description(&self) -> Option<String> { None } - /// Devuelve un identificador opcional para el componente. + /// Devuelve el identificador del componente, si existe. /// /// Este identificador puede usarse para referenciar el componente en el HTML. Por defecto, no /// tiene ningún identificador (`None`). @@ -51,7 +51,7 @@ pub trait Component: AnyInfo + ComponentRender + Send + Sync { #[allow(unused_variables)] fn setup_before_prepare(&mut self, cx: &mut Context) {} - /// Devuelve una representación estructurada del componente preparada para el renderizado. + /// Devuelve una representación renderizada del componente. /// /// Este método forma parte del ciclo de vida de los componentes y se invoca automáticamente /// durante el proceso de construcción del documento. Puede sobrescribirse para generar diff --git a/src/core/theme.rs b/src/core/theme.rs index e0c3008e..5889dcf7 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -15,10 +15,10 @@ //! [`Theme`]. mod definition; -pub use definition::{Theme, ThemeRef}; +pub use definition::{Theme, ThemePage, ThemeRef}; mod regions; -pub(crate) use regions::ChildrenInRegions; -pub use regions::{InRegion, Region, REGION_CONTENT}; +pub(crate) use regions::{ChildrenInRegions, REGION_CONTENT}; +pub use regions::{InRegion, Region}; pub(crate) mod all; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 3b26a573..a4faf0b8 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -7,88 +7,34 @@ use crate::response::page::Page; use std::sync::LazyLock; -/// Representa una referencia a un tema. +/// Referencia estática a un tema. /// -/// Los temas son también extensiones. Por tanto se deben definir igual, es decir, como instancias -/// estáticas globales que implementan [`Theme`], pero también [`Extension`]. +/// Los temas son también extensiones. Por tanto, deben declararse como **instancias estáticas** que +/// implementen [`Theme`] y, a su vez, [`Extension`]. pub type ThemeRef = &'static dyn Theme; -/// Interfaz común que debe implementar cualquier tema de `PageTop`. +/// Métodos predefinidos de renderizado para las páginas de un tema. /// -/// Un tema implementará [`Theme`] y los métodos que sean necesarios de [`Extension`], aunque el -/// único obligatorio será [`theme()`](Extension::theme). +/// Contiene las implementaciones base de las **secciones** `<head>` y `<body>`. Se implementa +/// automáticamente para cualquier tipo que implemente [`Theme`], por lo que normalmente no requiere +/// implementación explícita. /// -/// ```rust -/// use pagetop::prelude::*; +/// Si un tema **sobrescribe** [`render_page_head()`](Theme::render_page_head) o +/// [`render_page_body()`](Theme::render_page_body), se puede volver al comportamiento por defecto +/// cuando se necesite usando FQS (*Fully Qualified Syntax*): /// -/// pub struct MyTheme; -/// -/// impl Extension for MyTheme { -/// fn name(&self) -> L10n { -/// L10n::n("My theme") -/// } -/// -/// fn description(&self) -> L10n { -/// L10n::n("A personal theme") -/// } -/// -/// fn theme(&self) -> Option<ThemeRef> { -/// Some(&Self) -/// } -/// } -/// -/// impl Theme for MyTheme {} -/// ``` -pub trait Theme: Extension + Send + Sync { - /// **Obsoleto desde la versión 0.4.0**: usar [`declared_regions()`](Self::declared_regions) en - /// su lugar. - #[deprecated(since = "0.4.0", note = "Use `declared_regions()` instead")] - fn regions(&self) -> Vec<(&'static str, L10n)> { - vec![("content", L10n::l("content"))] - } - - /// Declaración ordenada de las regiones disponibles en la página. - /// - /// Devuelve una lista estática de pares `(Region, L10n)` que se usará para renderizar en el - /// orden indicado todas las regiones que componen una página. Los identificadores deben ser - /// **estables** como `"sidebar-left"` o `"content"`. La etiqueta `L10n` devuelve el nombre de la - /// región en el idioma activo de la página. - /// - /// Si el tema requiere un conjunto distinto de regiones, se puede sobrescribir este método para - /// devolver una lista diferente. Si no, se usará la lista predeterminada: - /// - /// - `"header"`: cabecera. - /// - `"content"`: contenido principal (**obligatoria**). - /// - `"footer"`: pie. - /// - /// Sólo la región `"content"` es obligatoria, usa [`Region::default()`] para declararla. - #[inline] - fn declared_regions(&self) -> &'static [(Region, L10n)] { - static REGIONS: LazyLock<[(Region, L10n); 3]> = LazyLock::new(|| { - [ - (Region::declare("header"), L10n::l("region_header")), - (Region::default(), L10n::l("region_content")), - (Region::declare("footer"), L10n::l("region_footer")), - ] - }); - &REGIONS[..] - } - - /// Acciones específicas del tema antes de renderizar el `<body>` de la página. - /// - /// Útil para preparar clases, inyectar recursos o ajustar metadatos. - #[allow(unused_variables)] - fn before_render_page_body(&self, page: &mut Page) {} - +/// - `<Self as ThemePage>::render_body(self, page, self.page_regions())` +/// - `<Self as ThemePage>::render_head(self, page)` +pub trait ThemePage { /// Renderiza el contenido del `<body>` de la página. /// - /// Por defecto, recorre [`declared_regions()`](Self::declared_regions) **en el orden que se han - /// declarado** y, para cada región con contenido, genera un contenedor con `role="region"` y - /// `aria-label` localizado. - fn render_page_body(&self, page: &mut Page) -> Markup { + /// Recorre `regions` en el **orden declarado** y, para cada región con contenido, genera un + /// contenedor con `role="region"` y un `aria-label` localizado. Se asume que cada identificador + /// de región es **único** dentro de la página. + fn render_body(&self, page: &mut Page, regions: &[(Region, L10n)]) -> Markup { html! { body id=[page.body_id().get()] class=[page.body_classes().get()] { - @for (region, region_label) in self.declared_regions() { + @for (region, region_label) in regions { @let output = page.render_region(region.key()); @if !output.is_empty() { @let region_name = region.name(); @@ -96,7 +42,7 @@ pub trait Theme: Extension + Send + Sync { id=(region_name) class={ "region region--" (region_name) } role="region" - aria-label=[region_label.using(page)] + aria-label=[region_label.lookup(page)] { (output) } @@ -106,17 +52,12 @@ pub trait Theme: Extension + Send + Sync { } } - /// Acciones específicas del tema después de renderizar el `<body>` de la página. - /// - /// Útil para *tracing*, métricas o ajustes finales del estado de la página. - #[allow(unused_variables)] - fn after_render_page_body(&self, page: &mut Page) {} - /// Renderiza el contenido del `<head>` de la página. /// - /// Por defecto, genera las etiquetas básicas (`charset`, `title`, `description`, `viewport`, - /// `X-UA-Compatible`), los metadatos y propiedades de la página y los recursos (CSS/JS). - fn render_page_head(&self, page: &mut Page) -> Markup { + /// Por defecto incluye las etiquetas básicas (`charset`, `title`, `description`, `viewport`, + /// `X-UA-Compatible`), los metadatos (`name/content`) y propiedades (`property/content`), + /// además de los recursos CSS/JS de la página. + fn render_head(&self, page: &mut Page) -> Markup { let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { head { @@ -146,18 +87,115 @@ pub trait Theme: Extension + Send + Sync { } } } +} - /// Página de error "*403 – Forbidden*" predeterminada. +/// Interfaz común que debe implementar cualquier tema de PageTop. +/// +/// Un tema implementa [`Theme`] y los métodos necesarios de [`Extension`]. El único método +/// **obligatorio** de `Extension` para un tema es [`theme()`](Extension::theme). +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// pub struct MyTheme; +/// +/// impl Extension for MyTheme { +/// fn name(&self) -> L10n { +/// L10n::n("My theme") +/// } +/// +/// fn description(&self) -> L10n { +/// L10n::n("A personal theme") +/// } +/// +/// fn theme(&self) -> Option<ThemeRef> { +/// Some(&Self) +/// } +/// } +/// +/// impl Theme for MyTheme {} +/// ``` +pub trait Theme: Extension + ThemePage + Send + Sync { + /// **Obsoleto desde la versión 0.4.0**: usar [`page_regions()`](Self::page_regions) en su + /// lugar. + #[deprecated(since = "0.4.0", note = "Use `page_regions()` instead")] + fn regions(&self) -> Vec<(&'static str, L10n)> { + vec![("content", L10n::l("content"))] + } + + /// Declaración ordenada de las regiones disponibles en la página. + /// + /// Devuelve una **lista estática** de pares `(Region, L10n)` que se usará para renderizar en el + /// orden indicado todas las regiones que componen una página. + /// + /// Requisitos y recomendaciones: + /// + /// - Los identificadores deben ser **estables** (p. ej. `"sidebar-left"`, `"content"`). + /// - La región `"content"` es **obligatoria**. Se puede usar [`Region::default()`] para + /// declararla. + /// - La etiqueta `L10n` se evalúa con el idioma activo de la página. + /// + /// Si tu tema define un conjunto distinto, se puede **sobrescribir** este método. Por defecto + /// devuelve: + /// + /// - `"header"`: cabecera. + /// - `"content"`: contenido principal (**obligatoria**). + /// - `"footer"`: pie. + fn page_regions(&self) -> &'static [(Region, L10n)] { + static REGIONS: LazyLock<[(Region, L10n); 3]> = LazyLock::new(|| { + [ + (Region::declare("header"), L10n::l("region_header")), + (Region::default(), L10n::l("region_content")), + (Region::declare("footer"), L10n::l("region_footer")), + ] + }); + &REGIONS[..] + } + + /// Acciones específicas del tema antes de renderizar el `<body>` de la página. + /// + /// Útil para preparar clases, inyectar recursos o ajustar metadatos. + #[allow(unused_variables)] + fn before_render_page_body(&self, page: &mut Page) {} + + /// Renderiza el contenido del `<body>` de la página. + /// + /// Si se sobrescribe este método, se puede volver al comportamiento base con: + /// `<Self as ThemePage>::render_body(self, page, self.page_regions())`. + #[inline] + fn render_page_body(&self, page: &mut Page) -> Markup { + <Self as ThemePage>::render_body(self, page, self.page_regions()) + } + + /// Acciones específicas del tema después de renderizar el `<body>` de la página. + /// + /// Útil para *tracing*, métricas o ajustes finales del estado de la página. + #[allow(unused_variables)] + fn after_render_page_body(&self, page: &mut Page) {} + + /// Renderiza el contenido del `<head>` de la página. + /// + /// Si se sobrescribe este método, se puede volver al comportamiento base con: + /// `<Self as ThemePage>::render_head(self, page)`. + #[inline] + fn render_page_head(&self, page: &mut Page) -> Markup { + <Self as ThemePage>::render_head(self, page) + } + + /// Contenido predeterminado para la página de error "*403 – Forbidden*". /// /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. fn error403(&self, page: &mut Page) -> Markup { - html! { div { h1 { (L10n::l("error403_notice").to_markup(page)) } } } + html! { div { h1 { (L10n::l("error403_notice").using(page)) } } } } - /// Página de error "*404 – Not Found*" predeterminada. + /// Contenido predeterminado para la página de error "*404 – Not Found*". /// /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. fn error404(&self, page: &mut Page) -> Markup { - html! { div { h1 { (L10n::l("error404_notice").to_markup(page)) } } } + html! { div { h1 { (L10n::l("error404_notice").using(page)) } } } } } + +/// Se implementa automáticamente `ThemePage` para cualquier tema. +impl<T: Theme> ThemePage for T {} diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 4fcd7dfa..1a2e0fbb 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -25,7 +25,7 @@ pub const REGION_CONTENT: &str = "content"; /// (p.ej., clases `region__{name}`). /// /// Se utiliza para declarar las regiones que componen una página en un tema (ver -/// [`declared_regions()`](crate::core::theme::Theme::declared_regions)). +/// [`page_regions()`](crate::core::theme::Theme::page_regions)). pub struct Region { key: &'static str, name: String, diff --git a/src/locale/en-US/welcome.ftl b/src/locale/en-US/welcome.ftl index 7d98f447..7b7d74d8 100644 --- a/src/locale/en-US/welcome.ftl +++ b/src/locale/en-US/welcome.ftl @@ -3,7 +3,6 @@ welcome_extension_description = Displays a landing page when none is configured. welcome_page = Welcome Page welcome_title = Hello world! -welcome_aria = Say hello to your { $app } installation welcome_intro = Discover⚡{ $app } welcome_powered = A web solution powered by <strong>PageTop!</strong> diff --git a/src/locale/es-ES/welcome.ftl b/src/locale/es-ES/welcome.ftl index 8a384253..78238322 100644 --- a/src/locale/es-ES/welcome.ftl +++ b/src/locale/es-ES/welcome.ftl @@ -3,7 +3,6 @@ welcome_extension_description = Muestra una página de inicio predeterminada cua welcome_page = Página de Bienvenida welcome_title = ¡Hola mundo! -welcome_aria = Saluda a tu instalación { $app } welcome_intro = Descubre⚡{ $app } welcome_powered = Una solución web creada con <strong>PageTop!</strong> diff --git a/static/css/welcome.css b/static/css/intro.css similarity index 78% rename from static/css/welcome.css rename to static/css/intro.css index 4ce8046b..5a5461e4 100644 --- a/static/css/welcome.css +++ b/static/css/intro.css @@ -1,8 +1,8 @@ :root { - --bg-img: url('/img/welcome-header.jpg'); - --bg-img-set: image-set(url('/img/welcome-header.avif') type('image/avif'), url('/img/welcome-header.webp') type('image/webp'), var(--bg-img) type('image/jpeg')); - --bg-img-sm: url('/img/welcome-header-sm.jpg'); - --bg-img-sm-set: image-set(url('/img/welcome-header-sm.avif') type('image/avif'), url('/img/welcome-header-sm.webp') type('image/webp'), var(--bg-img-sm) type('image/jpeg')); + --bg-img: url('/img/intro-header.jpg'); + --bg-img-set: image-set(url('/img/intro-header.avif') type('image/avif'), url('/img/intro-header.webp') type('image/webp'), var(--bg-img) type('image/jpeg')); + --bg-img-sm: url('/img/intro-header-sm.jpg'); + --bg-img-sm-set: image-set(url('/img/intro-header-sm.avif') type('image/avif'), url('/img/intro-header-sm.webp') type('image/webp'), var(--bg-img-sm) type('image/jpeg')); --bg-color: #8c5919; --color: #1a202c; --color-red: #fecaca; @@ -28,9 +28,14 @@ body { font-weight: 300; color: var(--color); line-height: 1.6; + + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; } -header, section { position: relative; text-align: center; @@ -50,19 +55,11 @@ a:hover:visited { text-decoration-color: var(--color-link); } -#content { - width: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - /* - * Region header + * Header */ -.welcome-header { +.intro-header { display: flex; flex-direction: column-reverse; width: 100%; @@ -76,11 +73,11 @@ a:hover:visited { background-size: contain; background-repeat: no-repeat; } -.welcome-header__body { +.intro-header__body { padding: 0; background: none; } -.welcome-header__title { +.intro-header__title { margin: 0 0 0 1.5rem; text-align: left; display: flex; @@ -94,7 +91,7 @@ a:hover:visited { line-height: 110%; text-shadow: 0 0.125rem 0.1875rem rgba(0, 0, 0, 0.3); } -.welcome-header__title > span { +.intro-header__title > span { background: linear-gradient(180deg, #ddff95 30%, #ffb84b 100%); background-clip: text; -webkit-background-clip: text; @@ -105,44 +102,44 @@ a:hover:visited { line-height: 110%; text-shadow: none; } -.welcome-header__image { +.intro-header__image { display: flex; justify-content: flex-start; text-align: right; width: 100%; } -.welcome-header__monster { +.intro-header__monster { margin-right: 12rem; margin-top: 1rem; flex-shrink: 1; } @media (min-width: 64rem) { - .welcome-header { + .intro-header { background-image: var(--bg-img); background-image: var(--bg-img-set); } - .welcome-header__title { + .intro-header__title { padding: 1.2rem 2rem 2.6rem 2rem; } - .welcome-header__image { + .intro-header__image { justify-content: flex-end; } } /* - * Region content + * Content */ -.welcome-content { +.intro-content { height: auto; margin-top: 1.6rem; } -.welcome-content__body { +.intro-content__body { box-sizing: border-box; max-width: 80rem; } -.welcome-content__body:before, -.welcome-content__body:after { +.intro-content__body:before, +.intro-content__body:after { content: ''; position: absolute; left: 0; @@ -152,38 +149,37 @@ a:hover:visited { filter: blur(2.75rem); opacity: 0.8; inset: 11.75rem; - /*z-index: 0;*/ } -.welcome-content__body:before { +.intro-content__body:before { top: -1rem; } -.welcome-content__body:after { +.intro-content__body:after { bottom: -1rem; } @media (max-width: 48rem) { - .welcome-content__body { + .intro-content__body { margin-top: -9.8rem; } - .welcome-content__body:before, - .welcome-content__body:after { + .intro-content__body:before, + .intro-content__body:after { inset: unset; } } @media (min-width: 64rem) { - .welcome-content { + .intro-content { margin-top: 0; } - .welcome-content__body { + .intro-content__body { margin-top: -5.7rem; } } -.welcome-poweredby { +.intro-button { width: 100%; margin: 0 auto 3rem; z-index: 10; } -.welcome-poweredby__link { +.intro-button__link { background: #7f1d1d; background-image: linear-gradient(to bottom, rgba(255,0,0,0.8), rgba(255,255,255,0)); background-position: top left, center; @@ -196,7 +192,6 @@ a:hover:visited { font-size: 1.5rem; line-height: 1.3; text-decoration: none; - /*text-shadow: var(--shadow);*/ transition: transform 0.3s ease-in-out; position: relative; overflow: hidden; @@ -204,7 +199,7 @@ a:hover:visited { min-height: 7.6875rem; outline: none; } -.welcome-poweredby__link::before { +.intro-button__link::before { content: ''; position: absolute; top: -13.125rem; @@ -216,7 +211,7 @@ a:hover:visited { transition: transform 0.3s ease-in-out; z-index: 5; } -.welcome-poweredby__text { +.intro-button__text { display: flex; flex-direction: column; flex: 1; @@ -226,25 +221,24 @@ a:hover:visited { padding: 1rem 1.5rem; text-align: left; color: white; - /*text-shadow: 0 0.101125rem 0.2021875rem rgba(0, 0, 0, 0.25);*/ font-size: 1.65rem; font-style: normal; font-weight: 600; line-height: 130.023%; letter-spacing: 0.0075rem; } -.welcome-poweredby__text strong { +.intro-button__text strong { font-size: 2.625rem; font-weight: 600; line-height: 130.023%; letter-spacing: 0.013125rem; } -.welcome-poweredby__link span { +.intro-button__link span { position: absolute; display: block; pointer-events: none; } -.welcome-poweredby__link span:nth-child(1) { +.intro-button__link span:nth-child(1) { height: 8px; width: 100%; top: 0; @@ -264,7 +258,7 @@ a:hover:visited { transform: translateX(100%); } } -.welcome-poweredby__link span:nth-child(2) { +.intro-button__link span:nth-child(2) { width: 8px; height: 100%; top: 0; @@ -284,7 +278,7 @@ a:hover:visited { transform: translateY(100%); } } -.welcome-poweredby__link span:nth-child(3) { +.intro-button__link span:nth-child(3) { height: 8px; width: 100%; bottom: 0; @@ -304,22 +298,22 @@ a:hover:visited { transform: translateX(-100%); } } -.welcome-poweredby__link:hover span { +.intro-button__link:hover span { animation-play-state: paused; } @media (max-width: 48rem) { - .welcome-poweredby__link { + .intro-button__link { height: 6.25rem; min-width: auto; border-radius: 0; } - .welcome-poweredby__text { + .intro-button__text { display: inline; padding-top: .5rem; } } @media (min-width: 48rem) { - .welcome-poweredby { + .intro-button { position: absolute; top: 0; left: 50%; @@ -327,14 +321,13 @@ a:hover:visited { max-width: 29.375rem; margin-bottom: 0; } - .welcome-poweredby__link:hover { + .intro-button__link:hover { transition: all .5s; transform: rotate(-3deg) scale(1.1); - /*box-shadow: 0px 3px 5px rgba(0,0,0,.4);*/ } } -.welcome-text { +.intro-text { z-index: 1; width: 100%; display: flex; @@ -346,13 +339,16 @@ a:hover:visited { font-weight: 400; line-height: 1.5; margin-top: -6rem; - background: #fff; margin-bottom: 0; + background: #fff; position: relative; - padding: 6rem 1.063rem 0.75rem; + padding: 2.5rem 1.063rem 0.75rem; overflow: hidden; } -.welcome-text p { +.intro-button + .intro-text { + padding-top: 6rem; +} +.intro-text p { width: 100%; line-height: 150%; font-weight: 400; @@ -360,14 +356,16 @@ a:hover:visited { margin: 0 0 1.5rem; } @media (min-width: 48rem) { - .welcome-text { + .intro-text { font-size: 1.375rem; line-height: 2rem; + } + .intro-button + .intro-text { padding-top: 7rem; } } @media (min-width: 64rem) { - .welcome-text { + .intro-text { border-radius: 0.75rem; box-shadow: var(--shadow); max-width: 60rem; @@ -377,13 +375,13 @@ a:hover:visited { } } -.welcome-text__block { +.intro-text .block { position: relative; } -.welcome-text__block h2 { +.intro-text .block__title { margin: 1em 0 .8em; } -.welcome-text__block h2 span { +.intro-text .block__title span { display: inline-block; padding: 10px 30px 14px; margin: 0 0 0 20px; @@ -394,7 +392,7 @@ a:hover:visited { border-color: orangered; transform: rotate(-3deg) translateY(-25%); } -.welcome-text__block h2:before { +.intro-text .block__title:before { content: ""; height: 5px; position: absolute; @@ -407,7 +405,7 @@ a:hover:visited { transform: rotate(2deg) translateY(-50%); transform-origin: top left; } -.welcome-text__block h2:after { +.intro-text .block__title:after { content: ""; height: 70rem; position: absolute; @@ -420,15 +418,17 @@ a:hover:visited { } /* - * Region footer + * Footer */ -.region--footer { +.intro-footer { + width: 100%; background-color: black; color: var(--color-gray); + padding-bottom: 2rem; } -.welcome-footer { +.intro-footer__body { display: flex; justify-content: center; flex-direction: column; @@ -439,33 +439,33 @@ a:hover:visited { font-weight: 300; line-height: 100%; } -.welcome-footer a:visited { +.intro-footer__body a:visited { color: var(--color-gray); } -.welcome-footer__logo, -.welcome-footer__links { +.intro-footer__logo, +.intro-footer__links { display: flex; justify-content: center; width: 100%; } -.welcome-footer__logo { +.intro-footer__logo { max-height: 12.625rem; } -.welcome-footer__logo svg { +.intro-footer__logo svg { width: 100%; } -.welcome-footer__links { +.intro-footer__links { gap: 1.875rem; flex-wrap: wrap; margin-top: 2rem; } @media (max-width: 48rem) { - .welcome-footer__logo { + .intro-footer__logo { display: none; } } @media (max-width: 64rem) { - .welcome-footer { + .intro-footer__body { padding: 0 1rem 2rem; } } diff --git a/static/img/welcome-header-sm.avif b/static/img/intro-header-sm.avif similarity index 100% rename from static/img/welcome-header-sm.avif rename to static/img/intro-header-sm.avif diff --git a/static/img/welcome-header-sm.jpg b/static/img/intro-header-sm.jpg similarity index 100% rename from static/img/welcome-header-sm.jpg rename to static/img/intro-header-sm.jpg diff --git a/static/img/welcome-header-sm.webp b/static/img/intro-header-sm.webp similarity index 100% rename from static/img/welcome-header-sm.webp rename to static/img/intro-header-sm.webp diff --git a/static/img/welcome-header.avif b/static/img/intro-header.avif similarity index 100% rename from static/img/welcome-header.avif rename to static/img/intro-header.avif diff --git a/static/img/welcome-header.jpg b/static/img/intro-header.jpg similarity index 100% rename from static/img/welcome-header.jpg rename to static/img/intro-header.jpg diff --git a/static/img/welcome-header.webp b/static/img/intro-header.webp similarity index 100% rename from static/img/welcome-header.webp rename to static/img/intro-header.webp From da1390c2fe7eb1ba2df5db199049482bf7b770df Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 6 Sep 2025 09:41:01 +0200 Subject: [PATCH 773/853] =?UTF-8?q?=F0=9F=9A=A7=20(context):=20Generaliza?= =?UTF-8?q?=20los=20par=C3=A1metros=20de=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/html.rs | 2 +- src/html/context.rs | 181 ++++++++++++++++++++++++++++++------- src/response/page.rs | 21 ++++- tests/component_html.rs | 2 +- 4 files changed, 168 insertions(+), 38 deletions(-) diff --git a/src/base/component/html.rs b/src/base/component/html.rs index cac39eaf..7bde94a0 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -25,7 +25,7 @@ use crate::prelude::*; /// use pagetop::prelude::*; /// /// let component = Html::with(|cx| { -/// let user = cx.get_param::<String>("username").unwrap_or(String::from("visitor")); +/// let user = cx.param::<String>("username").cloned().unwrap_or(String::from("visitor")); /// html! { /// h1 { "Hello, " (user) } /// } diff --git a/src/html/context.rs b/src/html/context.rs index 8b7afba3..4ebd510e 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -7,10 +7,8 @@ use crate::locale::{LangId, LangMatch, LanguageIdentifier, DEFAULT_LANGID, FALLB use crate::service::HttpRequest; use crate::{builder_fn, join}; +use std::any::Any; use std::collections::HashMap; -use std::error::Error; -use std::fmt::{self, Display}; -use std::str::FromStr; /// Operaciones para modificar el contexto ([`Context`]) del documento. pub enum AssetsOp { @@ -33,32 +31,28 @@ pub enum AssetsOp { RemoveJavaScript(&'static str), } -/// Errores de lectura o conversión de parámetros almacenados en el contexto. +/// Errores de acceso a parámetros dinámicos del contexto. +/// +/// - [`ErrorParam::NotFound`]: la clave no existe. +/// - [`ErrorParam::TypeMismatch`]: la clave existe, pero el valor guardado no coincide con el tipo +/// solicitado. Incluye nombre de la clave (`key`), tipo esperado (`expected`) y tipo realmente +/// guardado (`saved`) para facilitar el diagnóstico. #[derive(Debug)] pub enum ErrorParam { - /// El parámetro solicitado no existe. NotFound, - /// El valor del parámetro no pudo convertirse al tipo requerido. - ParseError(String), + TypeMismatch { + key: &'static str, + expected: &'static str, + saved: &'static str, + }, } -impl Display for ErrorParam { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ErrorParam::NotFound => write!(f, "Parameter not found"), - ErrorParam::ParseError(e) => write!(f, "Parse error: {e}"), - } - } -} - -impl Error for ErrorParam {} - /// Representa el contexto de un documento HTML. /// /// Se crea internamente para manejar información relevante del documento, como la solicitud HTTP de /// origen, el idioma, tema y composición para el renderizado, los recursos *favicon* ([`Favicon`]), -/// hojas de estilo ([`StyleSheet`]) y *scripts* ([`JavaScript`]), así como parámetros de contexto -/// definidos en tiempo de ejecución. +/// hojas de estilo ([`StyleSheet`]) y *scripts* ([`JavaScript`]), así como *parámetros dinámicos +/// heterogéneos* de contexto definidos en tiempo de ejecución. /// /// # Ejemplos /// @@ -95,7 +89,7 @@ impl Error for ErrorParam {} /// assert_eq!(active_theme.short_name(), "aliner"); /// /// // Recupera el parámetro a su tipo original. -/// let id: i32 = cx.get_param("usuario_id").unwrap(); +/// let id: i32 = *cx.get_param::<i32>("usuario_id").unwrap(); /// assert_eq!(id, 42); /// /// // Genera un identificador para un componente de tipo `Menu`. @@ -113,7 +107,7 @@ pub struct Context { favicon : Option<Favicon>, // Favicon, si se ha definido. stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. javascripts: Assets<JavaScript>, // Scripts JavaScript. - params : HashMap<&'static str, String>, // Parámetros definidos en tiempo de ejecución. + params : HashMap<&'static str, (Box<dyn Any>, &'static str)>, // Parámetros definidos en tiempo de ejecución. id_counter : usize, // Contador para generar identificadores únicos. } @@ -152,7 +146,7 @@ impl Context { favicon : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), - params : HashMap::<&str, String>::new(), + params : HashMap::default(), id_counter : 0, } } @@ -246,29 +240,146 @@ impl Context { // Context PARAMS ****************************************************************************** - /// Añade o modifica un parámetro del contexto almacenando el valor como [`String`]. + /// Añade o modifica un parámetro dinámico del contexto. + /// + /// El valor se guarda conservando el *nombre del tipo* real para mejorar los mensajes de error + /// posteriores. + /// + /// # Ejemplos + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let cx = Context::new(None) + /// .with_param("usuario_id", 42_i32) + /// .with_param("titulo", String::from("Hola")) + /// .with_param("flags", vec!["a", "b"]); + /// ``` #[builder_fn] - pub fn with_param<T: ToString>(mut self, key: &'static str, value: T) -> Self { - self.params.insert(key, value.to_string()); + pub fn with_param<T: 'static>(mut self, key: &'static str, value: T) -> Self { + let type_name = TypeInfo::FullName.of::<T>(); + self.params.insert(key, (Box::new(value), type_name)); self } - /// Recupera un parámetro del contexto convertido al tipo especificado. + /// Recupera un parámetro como [`Option`], simplificando el acceso. /// - /// Devuelve un error si el parámetro no existe ([`ErrorParam::NotFound`]) o la conversión falla - /// ([`ErrorParam::ParseError`]). - pub fn get_param<T: FromStr>(&self, key: &'static str) -> Result<T, ErrorParam> { - self.params - .get(key) - .ok_or(ErrorParam::NotFound) - .and_then(|v| T::from_str(v).map_err(|_| ErrorParam::ParseError(v.clone()))) + /// A diferencia de [`get_param`](Self::get_param), que devuelve un [`Result`] con información + /// detallada de error, este método devuelve `None` tanto si la clave no existe como si el valor + /// guardado no coincide con el tipo solicitado. + /// + /// Resulta útil en escenarios donde sólo interesa saber si el valor existe y es del tipo + /// correcto, sin necesidad de diferenciar entre error de ausencia o de tipo. + /// + /// # Ejemplo + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let cx = Context::new(None).with_param("username", String::from("Alice")); + /// + /// // Devuelve Some(&String) si existe y coincide el tipo. + /// assert_eq!(cx.param::<String>("username").map(|s| s.as_str()), Some("Alice")); + /// + /// // Devuelve None si no existe o si el tipo no coincide. + /// assert!(cx.param::<i32>("username").is_none()); + /// assert!(cx.param::<String>("missing").is_none()); + /// + /// // Acceso con valor por defecto. + /// let user = cx.param::<String>("missing") + /// .cloned() + /// .unwrap_or_else(|| "visitor".to_string()); + /// assert_eq!(user, "visitor"); + /// ``` + pub fn param<T: 'static>(&self, key: &'static str) -> Option<&T> { + self.get_param::<T>(key).ok() } - /// Elimina un parámetro del contexto. Devuelve `true` si existía y se eliminó. + /// Recupera una *referencia tipada* al parámetro solicitado. + /// + /// Devuelve: + /// + /// - `Ok(&T)` si la clave existe y el tipo coincide. + /// - `Err(ErrorParam::NotFound)` si la clave no existe. + /// - `Err(ErrorParam::TypeMismatch)` si la clave existe pero el tipo no coincide. + /// + /// # Ejemplos + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let cx = Context::new(None) + /// .with_param("usuario_id", 42_i32) + /// .with_param("titulo", String::from("Hola")); + /// + /// let id: &i32 = cx.get_param("usuario_id").unwrap(); + /// let titulo: &String = cx.get_param("titulo").unwrap(); + /// + /// // Error de tipo: + /// assert!(cx.get_param::<String>("usuario_id").is_err()); + /// ``` + pub fn get_param<T: 'static>(&self, key: &'static str) -> Result<&T, ErrorParam> { + let (any, type_name) = self.params.get(key).ok_or(ErrorParam::NotFound)?; + any.downcast_ref::<T>() + .ok_or_else(|| ErrorParam::TypeMismatch { + key, + expected: TypeInfo::FullName.of::<T>(), + saved: *type_name, + }) + } + + /// Elimina un parámetro del contexto. Devuelve `true` si la clave existía y se eliminó. + /// + /// Devuelve `false` en caso contrario. Usar cuando solo interesa borrar la entrada. + /// + /// # Ejemplos + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let mut cx = Context::new(None).with_param("temp", 1u8); + /// assert!(cx.remove_param("temp")); + /// assert!(!cx.remove_param("temp")); // ya no existe + /// ``` pub fn remove_param(&mut self, key: &'static str) -> bool { self.params.remove(key).is_some() } + /// Recupera el parámetro solicitado y lo elimina del contexto. + /// + /// Devuelve: + /// + /// - `Ok(T)` si la clave existía y el tipo coincide. + /// - `Err(ErrorParam::NotFound)` si la clave no existe. + /// - `Err(ErrorParam::TypeMismatch)` si el tipo no coincide. + /// + /// # Ejemplos + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let mut cx = Context::new(None) + /// .with_param("contador", 7_i32) + /// .with_param("titulo", String::from("Hola")); + /// + /// let n: i32 = cx.take_param("contador").unwrap(); + /// assert!(cx.get_param::<i32>("contador").is_err()); // ya no está + /// + /// // Error de tipo: + /// assert!(cx.take_param::<i32>("titulo").is_err()); + /// ``` + pub fn take_param<T: 'static>(&mut self, key: &'static str) -> Result<T, ErrorParam> { + let (boxed, saved) = self.params.remove(key).ok_or(ErrorParam::NotFound)?; + boxed + .downcast::<T>() + .map(|b| *b) + .map_err(|_| ErrorParam::TypeMismatch { + key, + expected: TypeInfo::FullName.of::<T>(), + saved, + }) + } + // Context EXTRAS ****************************************************************************** /// Genera un identificador único si no se proporciona uno explícito. diff --git a/src/response/page.rs b/src/response/page.rs index 5ac3720c..0942f8c8 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -108,6 +108,12 @@ impl Page { self } + #[builder_fn] + pub fn with_param<T: 'static>(mut self, key: &'static str, value: T) -> Self { + self.context.alter_param(key, value); + self + } + /// Establece el atributo `id` del elemento `<body>`. #[builder_fn] pub fn with_body_id(mut self, id: impl AsRef<str>) -> Self { @@ -214,6 +220,10 @@ impl Page { self.context.layout() } + pub fn param<T: 'static>(&self, key: &'static str) -> Option<&T> { + self.context.param(key) + } + /// Devuelve el identificador del elemento `<body>`. pub fn body_id(&self) -> &AttrId { &self.body_id @@ -223,7 +233,16 @@ impl Page { pub fn body_classes(&self) -> &AttrClasses { &self.body_classes } - + /* + /// Devuelve una referencia mutable al [`Context`] de la página. + /// + /// El [`Context`] actúa como intermediario para muchos métodos de `Page` (idioma, tema, + /// *layout*, recursos, solicitud HTTP, etc.). Resulta especialmente útil cuando un componente + /// o un tema necesita recibir el contexto como parámetro. + pub fn context(&mut self) -> &mut Context { + &mut self.context + } + */ // Page RENDER ********************************************************************************* /// Renderiza los componentes de una región (`regiona_name`) de la página. diff --git a/tests/component_html.rs b/tests/component_html.rs index b9b8e5ec..bd7f3c08 100644 --- a/tests/component_html.rs +++ b/tests/component_html.rs @@ -20,7 +20,7 @@ async fn component_html_renders_using_context_param() { let mut cx = Context::new(None).with_param("username", String::from("Alice")); let component = Html::with(|cx| { - let name = cx.get_param::<String>("username").unwrap_or_default(); + let name = cx.param::<String>("username").cloned().unwrap_or_default(); html! { span { (name) } } From ff76504e781a8fecdee200532a1315a0452b5d6e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 7 Sep 2025 21:06:41 +0200 Subject: [PATCH 774/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20(macros):=20Majora?= =?UTF-8?q?=20la=20validaci=C3=B3n=20de=20`builder=5Ffn`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 260 +++++++++++++++++++++--------- 1 file changed, 181 insertions(+), 79 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 0a60d532..28c6b1b4 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -39,7 +39,7 @@ mod smart_default; use proc_macro::TokenStream; use quote::{quote, quote_spanned}; -use syn::{parse_macro_input, spanned::Spanned, DeriveInput, ItemFn}; +use syn::{parse_macro_input, spanned::Spanned, DeriveInput}; /// Macro para escribir plantillas HTML (basada en [Maud](https://docs.rs/maud)). #[proc_macro] @@ -107,114 +107,216 @@ pub fn derive_auto_default(input: TokenStream) -> TokenStream { /// `alter_...()`, que permitirá más adelante modificar instancias existentes. #[proc_macro_attribute] pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { - let fn_with = parse_macro_input!(item as ItemFn); - let fn_with_name = fn_with.sig.ident.clone(); - let fn_with_name_str = fn_with.sig.ident.to_string(); + use syn::{parse2, FnArg, Ident, ImplItemFn, Pat, ReturnType, TraitItemFn, Type}; + + let ts: proc_macro2::TokenStream = item.clone().into(); + + enum Kind { + Impl(ImplItemFn), + Trait(TraitItemFn), + } + + // Detecta si estamos en `impl` o `trait`. + let kind = if let Ok(it) = parse2::<ImplItemFn>(ts.clone()) { + Kind::Impl(it) + } else if let Ok(tt) = parse2::<TraitItemFn>(ts.clone()) { + Kind::Trait(tt) + } else { + return quote! { + compile_error!("#[builder_fn] only supports methods in `impl` blocks or `trait` items"); + } + .into(); + }; + + // Extrae piezas comunes (sig, attrs, vis, bloque?, es_trait?). + let (sig, attrs, vis, body_opt, is_trait) = match &kind { + Kind::Impl(m) => (&m.sig, &m.attrs, Some(&m.vis), Some(&m.block), false), + Kind::Trait(t) => (&t.sig, &t.attrs, None, t.default.as_ref(), true), + }; + + let with_name = sig.ident.clone(); + let with_name_str = sig.ident.to_string(); // Valida el nombre del método. - if !fn_with_name_str.starts_with("with_") { - let expanded = quote_spanned! { - fn_with.sig.ident.span() => - compile_error!("expected a \"pub fn with_...(mut self, ...) -> Self\" method"); - }; - return expanded.into(); - } - // Valida que el método es público. - if !matches!(fn_with.vis, syn::Visibility::Public(_)) { + if !with_name_str.starts_with("with_") { return quote_spanned! { - fn_with.sig.ident.span() => compile_error!("expected method to be `pub`"); + sig.ident.span() => compile_error!("expected a named `with_...()` method"); } .into(); } - // Valida que el primer argumento es exactamente `mut self`. - if let Some(syn::FnArg::Receiver(receiver)) = fn_with.sig.inputs.first() { - if receiver.mutability.is_none() || receiver.reference.is_some() { - return quote_spanned! { - receiver.span() => compile_error!("expected `mut self` as the first argument"); + + // Sólo se exige `pub` en `impl` (en `trait` no aplica). + let vis_pub = match (is_trait, vis) { + (false, Some(v)) => quote! { #v }, + _ => quote! {}, + }; + + // Validaciones comunes. + if sig.asyncness.is_some() { + return quote_spanned! { + sig.asyncness.span() => compile_error!("`with_...()` cannot be `async`"); + } + .into(); + } + if sig.constness.is_some() { + return quote_spanned! { + sig.constness.span() => compile_error!("`with_...()` cannot be `const`"); + } + .into(); + } + if sig.abi.is_some() { + return quote_spanned! { + sig.abi.span() => compile_error!("`with_...()` cannot be `extern`"); + } + .into(); + } + if sig.unsafety.is_some() { + return quote_spanned! { + sig.unsafety.span() => compile_error!("`with_...()` cannot be `unsafe`"); + } + .into(); + } + + // En `impl` se exige exactamente `mut self`; y en `trait` se exige `self` (sin &). + let receiver_ok = match sig.inputs.first() { + Some(FnArg::Receiver(r)) => { + // Rechaza `self: SomeType`. + if r.colon_token.is_some() { + false + } else if is_trait { + // Exactamente `self` (sin &, sin mut). + r.reference.is_none() && r.mutability.is_none() + } else { + // Exactamente `mut self`. + r.reference.is_none() && r.mutability.is_some() } - .into(); } - } else { + _ => false, + }; + if !receiver_ok { + let msg = if is_trait { + "expected `self` (not `mut self`, `&self` or `&mut self`) in trait method" + } else { + "expected first argument to be exactly `mut self`" + }; + let err = sig + .inputs + .first() + .map(|a| a.span()) + .unwrap_or(sig.ident.span()); return quote_spanned! { - fn_with.sig.ident.span() => compile_error!("expected `mut self` as the first argument"); + err => compile_error!(#msg); } .into(); } + // Valida que el método devuelve exactamente `Self`. - if let syn::ReturnType::Type(_, ty) = &fn_with.sig.output { - if let syn::Type::Path(type_path) = ty.as_ref() { - if type_path.qself.is_some() || !type_path.path.is_ident("Self") { - return quote_spanned! { ty.span() => - compile_error!("expected return type to be exactly `Self`"); + match &sig.output { + ReturnType::Type(_, ty) => match ty.as_ref() { + Type::Path(p) if p.qself.is_none() && p.path.is_ident("Self") => {} + _ => { + return quote_spanned! { + ty.span() => compile_error!("expected return type to be exactly `Self`"); } .into(); } - } else { - return quote_spanned! { ty.span() => - compile_error!("expected return type to be exactly `Self`"); + }, + _ => { + return quote_spanned! { + sig.output.span() => compile_error!("expected return type to be exactly `Self`"); } .into(); } - } else { - return quote_spanned! { - fn_with.sig.output.span() => compile_error!("expected method to return `Self`"); - } - .into(); } // Genera el nombre del método alter_...(). - let fn_alter_name_str = fn_with_name_str.replace("with_", "alter_"); - let fn_alter_name = syn::Ident::new(&fn_alter_name_str, fn_with.sig.ident.span()); + let stem = with_name_str.strip_prefix("with_").expect("validated"); + let alter_ident = Ident::new(&format!("alter_{stem}"), with_name.span()); // Extrae genéricos y cláusulas where. - let fn_generics = &fn_with.sig.generics; - let where_clause = &fn_with.sig.generics.where_clause; + let generics = &sig.generics; + let where_clause = &sig.generics.where_clause; - // Extrae argumentos y parámetros de llamada. - let args: Vec<_> = fn_with.sig.inputs.iter().skip(1).collect(); - let params: Vec<_> = fn_with - .sig - .inputs + // Extrae identificadores de los argumentos para la llamada (sin `mut` ni patrones complejos). + let args: Vec<_> = sig.inputs.iter().skip(1).collect(); + let call_idents: Vec<Ident> = { + let mut v = Vec::new(); + for arg in sig.inputs.iter().skip(1) { + match arg { + FnArg::Typed(pat) => { + if let Pat::Ident(pat_ident) = pat.pat.as_ref() { + v.push(pat_ident.ident.clone()); + } else { + return quote_spanned! { + pat.pat.span() => compile_error!( + "each parameter must be a simple identifier, e.g. `value: T`" + ); + } + .into(); + } + } + _ => { + return quote_spanned! { + arg.span() => compile_error!("unexpected receiver in parameter list"); + } + .into(); + } + } + } + v + }; + + // Extrae atributos descartando la documentación para incluir en `alter_...()`. + let non_doc_attrs: Vec<_> = attrs .iter() - .skip(1) - .map(|arg| match arg { - syn::FnArg::Typed(pat) => &pat.pat, - _ => panic!("unexpected argument type"), - }) + .cloned() + .filter(|a| !a.path().is_ident("doc")) .collect(); - // Extrae bloque del método. - let fn_with_block = &fn_with.block; - - // Extrae documentación y otros atributos del método. - let fn_with_attrs = &fn_with.attrs; - - // Genera el método alter_...() con el código del método with_...(). - let fn_alter_doc = - format!("Equivalente a [`Self::{fn_with_name_str}()`], pero sin usar el patrón *builder*."); - - let fn_alter = quote! { - #[doc = #fn_alter_doc] - pub fn #fn_alter_name #fn_generics(&mut self, #(#args),*) -> &mut Self #where_clause { - #fn_with_block - } - }; - - // Redefine el método with_...() para que llame a alter_...(). - let fn_with = quote! { - #(#fn_with_attrs)* - #[inline] - pub fn #fn_with_name #fn_generics(mut self, #(#args),*) -> Self #where_clause { - self.#fn_alter_name(#(#params),*); - self - } - }; + // Documentación del método alter_...(). + let alter_doc = + format!("Equivalente a [`Self::{with_name_str}()`], pero fuera del patrón *builder*."); // Genera el código final. - let expanded = quote! { - #fn_with - #[inline] - #fn_alter + let expanded = match body_opt { + None => { + quote! { + #(#attrs)* + fn #with_name #generics (self, #(#args),*) -> Self #where_clause; + + #(#non_doc_attrs)* + #[doc = #alter_doc] + fn #alter_ident #generics (&mut self, #(#args),*) -> &mut Self #where_clause; + } + } + Some(body) => { + let with_fn = if is_trait { + quote! { + #vis_pub fn #with_name #generics (self, #(#args),*) -> Self #where_clause { + let mut s = self; + s.#alter_ident(#(#call_idents),*); + s + } + } + } else { + quote! { + #vis_pub fn #with_name #generics (mut self, #(#args),*) -> Self #where_clause { + self.#alter_ident(#(#call_idents),*); + self + } + } + }; + quote! { + #(#attrs)* + #with_fn + + #(#non_doc_attrs)* + #[doc = #alter_doc] + #vis_pub fn #alter_ident #generics (&mut self, #(#args),*) -> &mut Self #where_clause { + #body + } + } + } }; expanded.into() } From b10d0aadf4c998c28a4b07b040de2c91a1f45394 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 7 Sep 2025 21:06:50 +0200 Subject: [PATCH 775/853] =?UTF-8?q?=F0=9F=9A=A7=20(context):=20Define=20un?= =?UTF-8?q?=20`trait`=20com=C3=BAn=20de=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global.rs | 13 +- src/html.rs | 4 +- src/html/assets.rs | 16 +- src/html/assets/javascript.rs | 4 +- src/html/assets/stylesheet.rs | 4 +- src/html/context.rs | 416 ++++++++++++++++++++-------------- src/response/page.rs | 158 +++++++------ src/response/page/error.rs | 1 + 8 files changed, 356 insertions(+), 260 deletions(-) diff --git a/src/global.rs b/src/global.rs index 6be0774d..c81eec99 100644 --- a/src/global.rs +++ b/src/global.rs @@ -48,14 +48,13 @@ pub struct App { pub description: String, /// Tema predeterminado. pub theme: String, - /// Idioma por defecto para la aplicación. + /// Idioma por defecto de la aplicación. /// - /// Si no se especifica un valor válido, normalmente se usará el idioma devuelto por la - /// implementación de [`LangId`](crate::locale::LangId) para [`Context`](crate::html::Context), - /// en el siguiente orden: primero, el idioma establecido explícitamente con - /// [`Context::with_langid()`](crate::html::Context::with_langid); si no se ha definido, se - /// usará el indicado en la cabecera `Accept-Language` del navegador; y, si ninguno aplica, se - /// empleará el idioma de respaldo ("en-US"). + /// Si este valor no es válido, el idioma efectivo para el renderizado se resolverá mediante la + /// implementación de [`LangId`](crate::locale::LangId) en este orden: primero, el establecido + /// explícitamente con [`Contextual::with_langid()`](crate::html::Contextual::with_langid); si + /// no se ha definido, se usará el indicado en la cabecera `Accept-Language` del navegador; y, + /// si ninguno aplica, se empleará el idioma de respaldo ("en-US"). pub language: String, /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o /// *"Starwars"*. diff --git a/src/html.rs b/src/html.rs index 784457ed..9f3d70cf 100644 --- a/src/html.rs +++ b/src/html.rs @@ -9,12 +9,12 @@ mod assets; pub use assets::favicon::Favicon; pub use assets::javascript::JavaScript; pub use assets::stylesheet::{StyleSheet, TargetMedia}; -pub(crate) use assets::Assets; +pub use assets::{Asset, Assets}; // HTML DOCUMENT CONTEXT *************************************************************************** mod context; -pub use context::{AssetsOp, Context, ErrorParam}; +pub use context::{AssetsOp, Context, Contextual, ErrorParam}; // HTML ATTRIBUTES ********************************************************************************* diff --git a/src/html/assets.rs b/src/html/assets.rs index 894b7e84..e53e8e35 100644 --- a/src/html/assets.rs +++ b/src/html/assets.rs @@ -5,20 +5,20 @@ pub mod stylesheet; use crate::html::{html, Markup, Render}; use crate::{AutoDefault, Weight}; -pub trait AssetsTrait: Render { - // Devuelve el nombre del recurso, utilizado como clave única. +pub trait Asset: Render { + /// Devuelve el nombre del recurso, utilizado como clave única. fn name(&self) -> &str; - // Devuelve el peso del recurso, durante el renderizado se procesan de menor a mayor peso. + /// Devuelve el peso del recurso, durante el renderizado se procesan de menor a mayor peso. fn weight(&self) -> Weight; } #[derive(AutoDefault)] -pub(crate) struct Assets<T>(Vec<T>); +pub struct Assets<T>(Vec<T>); -impl<T: AssetsTrait> Assets<T> { +impl<T: Asset> Assets<T> { pub fn new() -> Self { - Assets::<T>(Vec::<T>::new()) + Self(Vec::new()) } pub fn add(&mut self, asset: T) -> bool { @@ -49,14 +49,14 @@ impl<T: AssetsTrait> Assets<T> { } } -impl<T: AssetsTrait> Render for Assets<T> { +impl<T: Asset> Render for Assets<T> { fn render(&self) -> Markup { let mut assets = self.0.iter().collect::<Vec<_>>(); assets.sort_by_key(|a| a.weight()); html! { @for a in assets { - (a.render()) + (a) } } } diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index db5754e9..89b5261c 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -1,4 +1,4 @@ -use crate::html::assets::AssetsTrait; +use crate::html::assets::Asset; use crate::html::{html, Markup, Render}; use crate::{join, join_pair, AutoDefault, Weight}; @@ -137,7 +137,7 @@ impl JavaScript { } } -impl AssetsTrait for JavaScript { +impl Asset for JavaScript { // Para *scripts* externos es la ruta; para *scripts* embebidos, un identificador. fn name(&self) -> &str { match &self.source { diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index bb60b01c..a5537264 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -1,4 +1,4 @@ -use crate::html::assets::AssetsTrait; +use crate::html::assets::Asset; use crate::html::{html, Markup, PreEscaped, Render}; use crate::{join_pair, AutoDefault, Weight}; @@ -142,7 +142,7 @@ impl StyleSheet { } } -impl AssetsTrait for StyleSheet { +impl Asset for StyleSheet { // Para hojas de estilos externas es la ruta; para las embebidas, un identificador. fn name(&self) -> &str { match &self.source { diff --git a/src/html/context.rs b/src/html/context.rs index 4ebd510e..7af884cf 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -10,7 +10,7 @@ use crate::{builder_fn, join}; use std::any::Any; use std::collections::HashMap; -/// Operaciones para modificar el contexto ([`Context`]) del documento. +/// Operaciones para modificar el contexto ([`Context`]) de un documento. pub enum AssetsOp { // Favicon. /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. @@ -47,7 +47,64 @@ pub enum ErrorParam { }, } -/// Representa el contexto de un documento HTML. +pub trait Contextual: LangId { + // Contextual BUILDER ************************************************************************** + + /// Asigna la fuente de idioma del documento. + #[builder_fn] + fn with_langid(self, language: &impl LangId) -> Self; + + /// Asigna la solicitud HTTP al contexto. + #[builder_fn] + fn with_request(self, request: Option<HttpRequest>) -> Self; + + /// Asigna el tema para renderizar el documento. + #[builder_fn] + fn with_theme(self, theme_name: &'static str) -> Self; + + /// Asigna la composición para renderizar el documento. + #[builder_fn] + fn with_layout(self, layout_name: &'static str) -> Self; + + /// Añade o modifica un parámetro dinámico del contexto. + #[builder_fn] + fn with_param<T: 'static>(self, key: &'static str, value: T) -> Self; + + /// Define los recursos del contexto usando [`AssetsOp`]. + #[builder_fn] + fn with_assets(self, op: AssetsOp) -> Self; + + // Contextual GETTERS ************************************************************************** + + /// Devuelve una referencia a la solicitud HTTP asociada, si existe. + fn request(&self) -> Option<&HttpRequest>; + + /// Devuelve el tema que se usará para renderizar el documento. + fn theme(&self) -> ThemeRef; + + /// Devuelve la composición para renderizar el documento. Por defecto es `"default"`. + fn layout(&self) -> &str; + + /// Recupera un parámetro como [`Option`], simplificando el acceso. + fn param<T: 'static>(&self, key: &'static str) -> Option<&T>; + + /// Devuelve el Favicon de los recursos del contexto. + fn favicon(&self) -> Option<&Favicon>; + + /// Devuelve las hojas de estilo de los recursos del contexto. + fn stylesheets(&self) -> &Assets<StyleSheet>; + + /// Devuelve los scripts JavaScript de los recursos del contexto. + fn javascripts(&self) -> &Assets<JavaScript>; + + // Contextual HELPERS ************************************************************************** + + /// Devuelve un identificador único dentro del contexto para el tipo `T`, si no se proporciona + /// un `id` explícito. + fn required_id<T>(&mut self, id: Option<String>) -> String; +} + +/// Implementa el contexto de un documento HTML. /// /// Se crea internamente para manejar información relevante del documento, como la solicitud HTTP de /// origen, el idioma, tema y composición para el renderizado, los recursos *favicon* ([`Favicon`]), @@ -107,7 +164,7 @@ pub struct Context { favicon : Option<Favicon>, // Favicon, si se ha definido. stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. javascripts: Assets<JavaScript>, // Scripts JavaScript. - params : HashMap<&'static str, (Box<dyn Any>, &'static str)>, // Parámetros definidos en tiempo de ejecución. + params : HashMap<&'static str, (Box<dyn Any>, &'static str)>, // Parámetros en ejecución. id_counter : usize, // Contador para generar identificadores únicos. } @@ -151,80 +208,6 @@ impl Context { } } - // Context BUILDER ***************************************************************************** - - /// Modifica la fuente de idioma del documento. - #[builder_fn] - pub fn with_langid(mut self, language: &impl LangId) -> Self { - self.langid = language.langid(); - self - } - - /// Modifica el tema que se usará para renderizar el documento. - /// - /// Localiza el tema por su [`short_name()`](crate::core::AnyInfo::short_name), y si no aplica - /// ninguno entonces usará el tema por defecto. - #[builder_fn] - pub fn with_theme(mut self, theme_name: &'static str) -> Self { - self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); - self - } - - /// Modifica la composición para renderizar el documento. - #[builder_fn] - pub fn with_layout(mut self, layout_name: &'static str) -> Self { - self.layout = layout_name; - self - } - - /// Define los recursos del contexto usando [`AssetsOp`]. - #[builder_fn] - pub fn with_assets(mut self, op: AssetsOp) -> Self { - match op { - // Favicon. - AssetsOp::SetFavicon(favicon) => { - self.favicon = favicon; - } - AssetsOp::SetFaviconIfNone(icon) => { - if self.favicon.is_none() { - self.favicon = Some(icon); - } - } - // Stylesheets. - AssetsOp::AddStyleSheet(css) => { - self.stylesheets.add(css); - } - AssetsOp::RemoveStyleSheet(path) => { - self.stylesheets.remove(path); - } - // JavaScripts. - AssetsOp::AddJavaScript(js) => { - self.javascripts.add(js); - } - AssetsOp::RemoveJavaScript(path) => { - self.javascripts.remove(path); - } - } - self - } - - // Context GETTERS ***************************************************************************** - - /// Devuelve una referencia a la solicitud HTTP asociada, si existe. - pub fn request(&self) -> Option<&HttpRequest> { - self.request.as_ref() - } - - /// Devuelve el tema que se usará para renderizar el documento. - pub fn theme(&self) -> ThemeRef { - self.theme - } - - /// Devuelve la composición para renderizar el documento. Por defecto es `"default"`. - pub fn layout(&self) -> &str { - self.layout - } - // Context RENDER ****************************************************************************** /// Renderiza los recursos del contexto. @@ -240,61 +223,6 @@ impl Context { // Context PARAMS ****************************************************************************** - /// Añade o modifica un parámetro dinámico del contexto. - /// - /// El valor se guarda conservando el *nombre del tipo* real para mejorar los mensajes de error - /// posteriores. - /// - /// # Ejemplos - /// - /// ```rust - /// use pagetop::prelude::*; - /// - /// let cx = Context::new(None) - /// .with_param("usuario_id", 42_i32) - /// .with_param("titulo", String::from("Hola")) - /// .with_param("flags", vec!["a", "b"]); - /// ``` - #[builder_fn] - pub fn with_param<T: 'static>(mut self, key: &'static str, value: T) -> Self { - let type_name = TypeInfo::FullName.of::<T>(); - self.params.insert(key, (Box::new(value), type_name)); - self - } - - /// Recupera un parámetro como [`Option`], simplificando el acceso. - /// - /// A diferencia de [`get_param`](Self::get_param), que devuelve un [`Result`] con información - /// detallada de error, este método devuelve `None` tanto si la clave no existe como si el valor - /// guardado no coincide con el tipo solicitado. - /// - /// Resulta útil en escenarios donde sólo interesa saber si el valor existe y es del tipo - /// correcto, sin necesidad de diferenciar entre error de ausencia o de tipo. - /// - /// # Ejemplo - /// - /// ```rust - /// use pagetop::prelude::*; - /// - /// let cx = Context::new(None).with_param("username", String::from("Alice")); - /// - /// // Devuelve Some(&String) si existe y coincide el tipo. - /// assert_eq!(cx.param::<String>("username").map(|s| s.as_str()), Some("Alice")); - /// - /// // Devuelve None si no existe o si el tipo no coincide. - /// assert!(cx.param::<i32>("username").is_none()); - /// assert!(cx.param::<String>("missing").is_none()); - /// - /// // Acceso con valor por defecto. - /// let user = cx.param::<String>("missing") - /// .cloned() - /// .unwrap_or_else(|| "visitor".to_string()); - /// assert_eq!(user, "visitor"); - /// ``` - pub fn param<T: 'static>(&self, key: &'static str) -> Option<&T> { - self.get_param::<T>(key).ok() - } - /// Recupera una *referencia tipada* al parámetro solicitado. /// /// Devuelve: @@ -328,23 +256,6 @@ impl Context { }) } - /// Elimina un parámetro del contexto. Devuelve `true` si la clave existía y se eliminó. - /// - /// Devuelve `false` en caso contrario. Usar cuando solo interesa borrar la entrada. - /// - /// # Ejemplos - /// - /// ```rust - /// use pagetop::prelude::*; - /// - /// let mut cx = Context::new(None).with_param("temp", 1u8); - /// assert!(cx.remove_param("temp")); - /// assert!(!cx.remove_param("temp")); // ya no existe - /// ``` - pub fn remove_param(&mut self, key: &'static str) -> bool { - self.params.remove(key).is_some() - } - /// Recupera el parámetro solicitado y lo elimina del contexto. /// /// Devuelve: @@ -380,30 +291,21 @@ impl Context { }) } - // Context EXTRAS ****************************************************************************** - - /// Genera un identificador único si no se proporciona uno explícito. + /// Elimina un parámetro del contexto. Devuelve `true` si la clave existía y se eliminó. /// - /// Si no se proporciona un `id`, se genera un identificador único en la forma `<tipo>-<número>` - /// donde `<tipo>` es el nombre corto del tipo en minúsculas (sin espacios) y `<número>` es un - /// contador interno incremental. - pub fn required_id<T>(&mut self, id: Option<String>) -> String { - if let Some(id) = id { - id - } else { - let prefix = TypeInfo::ShortName - .of::<T>() - .trim() - .replace(' ', "_") - .to_lowercase(); - let prefix = if prefix.is_empty() { - "prefix".to_owned() - } else { - prefix - }; - self.id_counter += 1; - join!(prefix, "-", self.id_counter.to_string()) - } + /// Devuelve `false` en caso contrario. Usar cuando solo interesa borrar la entrada. + /// + /// # Ejemplos + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let mut cx = Context::new(None).with_param("temp", 1u8); + /// assert!(cx.remove_param("temp")); + /// assert!(!cx.remove_param("temp")); // ya no existe + /// ``` + pub fn remove_param(&mut self, key: &'static str) -> bool { + self.params.remove(key).is_some() } } @@ -423,3 +325,173 @@ impl LangId for Context { self.langid } } + +impl Contextual for Context { + // Contextual BUILDER ************************************************************************** + + #[builder_fn] + fn with_request(mut self, request: Option<HttpRequest>) -> Self { + self.request = request; + self + } + + #[builder_fn] + fn with_langid(mut self, language: &impl LangId) -> Self { + self.langid = language.langid(); + self + } + + /// Asigna el tema para renderizar el documento. + /// + /// Localiza el tema por su [`short_name()`](crate::core::AnyInfo::short_name), y si no aplica + /// ninguno entonces usará el tema por defecto. + #[builder_fn] + fn with_theme(mut self, theme_name: &'static str) -> Self { + self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); + self + } + + #[builder_fn] + fn with_layout(mut self, layout_name: &'static str) -> Self { + self.layout = layout_name; + self + } + + /// Añade o modifica un parámetro dinámico del contexto. + /// + /// El valor se guarda conservando el *nombre del tipo* real para mejorar los mensajes de error + /// posteriores. + /// + /// # Ejemplos + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let cx = Context::new(None) + /// .with_param("usuario_id", 42_i32) + /// .with_param("titulo", String::from("Hola")) + /// .with_param("flags", vec!["a", "b"]); + /// ``` + #[builder_fn] + fn with_param<T: 'static>(mut self, key: &'static str, value: T) -> Self { + let type_name = TypeInfo::FullName.of::<T>(); + self.params.insert(key, (Box::new(value), type_name)); + self + } + + #[builder_fn] + fn with_assets(mut self, op: AssetsOp) -> Self { + match op { + // Favicon. + AssetsOp::SetFavicon(favicon) => { + self.favicon = favicon; + } + AssetsOp::SetFaviconIfNone(icon) => { + if self.favicon.is_none() { + self.favicon = Some(icon); + } + } + // Stylesheets. + AssetsOp::AddStyleSheet(css) => { + self.stylesheets.add(css); + } + AssetsOp::RemoveStyleSheet(path) => { + self.stylesheets.remove(path); + } + // JavaScripts. + AssetsOp::AddJavaScript(js) => { + self.javascripts.add(js); + } + AssetsOp::RemoveJavaScript(path) => { + self.javascripts.remove(path); + } + } + self + } + + // Contextual GETTERS ************************************************************************** + + fn request(&self) -> Option<&HttpRequest> { + self.request.as_ref() + } + + fn theme(&self) -> ThemeRef { + self.theme + } + + fn layout(&self) -> &str { + self.layout + } + + /// Recupera un parámetro como [`Option`], simplificando el acceso. + /// + /// A diferencia de [`get_param`](Self::get_param), que devuelve un [`Result`] con información + /// detallada de error, este método devuelve `None` tanto si la clave no existe como si el valor + /// guardado no coincide con el tipo solicitado. + /// + /// Resulta útil en escenarios donde sólo interesa saber si el valor existe y es del tipo + /// correcto, sin necesidad de diferenciar entre error de ausencia o de tipo. + /// + /// # Ejemplo + /// + /// ```rust + /// use pagetop::prelude::*; + /// + /// let cx = Context::new(None).with_param("username", String::from("Alice")); + /// + /// // Devuelve Some(&String) si existe y coincide el tipo. + /// assert_eq!(cx.param::<String>("username").map(|s| s.as_str()), Some("Alice")); + /// + /// // Devuelve None si no existe o si el tipo no coincide. + /// assert!(cx.param::<i32>("username").is_none()); + /// assert!(cx.param::<String>("missing").is_none()); + /// + /// // Acceso con valor por defecto. + /// let user = cx.param::<String>("missing") + /// .cloned() + /// .unwrap_or_else(|| "visitor".to_string()); + /// assert_eq!(user, "visitor"); + /// ``` + fn param<T: 'static>(&self, key: &'static str) -> Option<&T> { + self.get_param::<T>(key).ok() + } + + fn favicon(&self) -> Option<&Favicon> { + self.favicon.as_ref() + } + + fn stylesheets(&self) -> &Assets<StyleSheet> { + &self.stylesheets + } + + fn javascripts(&self) -> &Assets<JavaScript> { + &self.javascripts + } + + // Contextual HELPERS ************************************************************************** + + /// Devuelve un identificador único dentro del contexto para el tipo `T`, si no se proporciona + /// un `id` explícito. + /// + /// Si no se proporciona un `id`, se genera un identificador único en la forma `<tipo>-<número>` + /// donde `<tipo>` es el nombre corto del tipo en minúsculas (sin espacios) y `<número>` es un + /// contador interno incremental. + fn required_id<T>(&mut self, id: Option<String>) -> String { + if let Some(id) = id { + id + } else { + let prefix = TypeInfo::ShortName + .of::<T>() + .trim() + .replace(' ', "_") + .to_lowercase(); + let prefix = if prefix.is_empty() { + "prefix".to_owned() + } else { + prefix + }; + self.id_counter += 1; + join!(prefix, "-", self.id_counter.to_string()) + } + } +} diff --git a/src/response/page.rs b/src/response/page.rs index 0942f8c8..77bc9c47 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -8,7 +8,8 @@ use crate::builder_fn; use crate::core::component::{Child, ChildOp, Component}; use crate::core::theme::{ChildrenInRegions, ThemeRef, REGION_CONTENT}; use crate::html::{html, Markup, DOCTYPE}; -use crate::html::{AssetsOp, Context}; +use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; +use crate::html::{AssetsOp, Context, Contextual}; use crate::html::{AttrClasses, ClassesOp}; use crate::html::{AttrId, AttrL10n}; use crate::locale::{CharacterDirection, L10n, LangId, LanguageIdentifier}; @@ -25,9 +26,9 @@ pub struct Page { description : AttrL10n, metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, - context : Context, body_id : AttrId, body_classes: AttrClasses, + context : Context, regions : ChildrenInRegions, } @@ -43,9 +44,9 @@ impl Page { description : AttrL10n::default(), metadata : Vec::default(), properties : Vec::default(), - context : Context::new(request), body_id : AttrId::default(), body_classes: AttrClasses::default(), + context : Context::new(request), regions : ChildrenInRegions::default(), } } @@ -80,40 +81,6 @@ impl Page { self } - /// Modifica la fuente de idioma de la página ([`Context::with_langid()`]). - #[builder_fn] - pub fn with_langid(mut self, language: &impl LangId) -> Self { - self.context.alter_langid(language); - self - } - - /// Modifica el tema que se usará para renderizar la página ([`Context::with_theme()`]). - #[builder_fn] - pub fn with_theme(mut self, theme_name: &'static str) -> Self { - self.context.alter_theme(theme_name); - self - } - - /// Modifica la composición para renderizar la página ([`Context::with_layout()`]). - #[builder_fn] - pub fn with_layout(mut self, layout_name: &'static str) -> Self { - self.context.alter_layout(layout_name); - self - } - - /// Define los recursos de la página usando [`AssetsOp`]. - #[builder_fn] - pub fn with_assets(mut self, op: AssetsOp) -> Self { - self.context.alter_assets(op); - self - } - - #[builder_fn] - pub fn with_param<T: 'static>(mut self, key: &'static str, value: T) -> Self { - self.context.alter_param(key, value); - self - } - /// Establece el atributo `id` del elemento `<body>`. #[builder_fn] pub fn with_body_id(mut self, id: impl AsRef<str>) -> Self { @@ -205,25 +172,6 @@ impl Page { &self.properties } - /// Devuelve la solicitud HTTP asociada. - pub fn request(&self) -> Option<&HttpRequest> { - self.context.request() - } - - /// Devuelve el tema que se usará para renderizar la página. - pub fn theme(&self) -> ThemeRef { - self.context.theme() - } - - /// Devuelve la composición para renderizar la página. Por defecto es `"default"`. - pub fn layout(&self) -> &str { - self.context.layout() - } - - pub fn param<T: 'static>(&self, key: &'static str) -> Option<&T> { - self.context.param(key) - } - /// Devuelve el identificador del elemento `<body>`. pub fn body_id(&self) -> &AttrId { &self.body_id @@ -233,19 +181,19 @@ impl Page { pub fn body_classes(&self) -> &AttrClasses { &self.body_classes } - /* - /// Devuelve una referencia mutable al [`Context`] de la página. - /// - /// El [`Context`] actúa como intermediario para muchos métodos de `Page` (idioma, tema, - /// *layout*, recursos, solicitud HTTP, etc.). Resulta especialmente útil cuando un componente - /// o un tema necesita recibir el contexto como parámetro. - pub fn context(&mut self) -> &mut Context { - &mut self.context - } - */ + + /// Devuelve una referencia mutable al [`Context`] de la página. + /// + /// El [`Context`] actúa como intermediario para muchos métodos de `Page` (idioma, tema, + /// *layout*, recursos, solicitud HTTP, etc.). Resulta especialmente útil cuando un componente + /// o un tema necesita recibir el contexto como parámetro. + pub fn context(&mut self) -> &mut Context { + &mut self.context + } + // Page RENDER ********************************************************************************* - /// Renderiza los componentes de una región (`regiona_name`) de la página. + /// Renderiza los componentes de una región (`region_name`) de la página. pub fn render_region(&mut self, region_name: &'static str) -> Markup { self.regions .merge_all_components(self.context.theme(), region_name) @@ -302,3 +250,79 @@ impl LangId for Page { self.context.langid() } } + +impl Contextual for Page { + // Contextual BUILDER ************************************************************************** + + #[builder_fn] + fn with_request(mut self, request: Option<HttpRequest>) -> Self { + self.context.alter_request(request); + self + } + + #[builder_fn] + fn with_langid(mut self, language: &impl LangId) -> Self { + self.context.alter_langid(language); + self + } + + #[builder_fn] + fn with_theme(mut self, theme_name: &'static str) -> Self { + self.context.alter_theme(theme_name); + self + } + + #[builder_fn] + fn with_layout(mut self, layout_name: &'static str) -> Self { + self.context.alter_layout(layout_name); + self + } + + #[builder_fn] + fn with_param<T: 'static>(mut self, key: &'static str, value: T) -> Self { + self.context.alter_param(key, value); + self + } + + #[builder_fn] + fn with_assets(mut self, op: AssetsOp) -> Self { + self.context.alter_assets(op); + self + } + + // Contextual GETTERS ************************************************************************** + + fn request(&self) -> Option<&HttpRequest> { + self.context.request() + } + + fn theme(&self) -> ThemeRef { + self.context.theme() + } + + fn layout(&self) -> &str { + self.context.layout() + } + + fn param<T: 'static>(&self, key: &'static str) -> Option<&T> { + self.context.param(key) + } + + fn favicon(&self) -> Option<&Favicon> { + self.context.favicon() + } + + fn stylesheets(&self) -> &Assets<StyleSheet> { + self.context.stylesheets() + } + + fn javascripts(&self) -> &Assets<JavaScript> { + self.context.javascripts() + } + + // Contextual HELPERS ************************************************************************** + + fn required_id<T>(&mut self, id: Option<String>) -> String { + self.context.required_id::<T>(id) + } +} diff --git a/src/response/page/error.rs b/src/response/page/error.rs index ab56338f..be48e3ed 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -1,4 +1,5 @@ use crate::base::component::Html; +use crate::html::Contextual; use crate::locale::L10n; use crate::response::ResponseError; use crate::service::http::{header::ContentType, StatusCode}; From 6f11207d8ee471d040d7bc5461fe281828d07218 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 8 Sep 2025 00:10:23 +0200 Subject: [PATCH 776/853] =?UTF-8?q?=F0=9F=93=9D=20Mejora=20la=20documentac?= =?UTF-8?q?i=C3=B3n=20de=20recursos=20y=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global.rs | 12 ++++---- src/html/assets.rs | 32 ++++++++++++++++++- src/html/assets/javascript.rs | 4 ++- src/html/assets/stylesheet.rs | 4 ++- src/html/context.rs | 58 +++++++++++++++++++++++++++-------- 5 files changed, 88 insertions(+), 22 deletions(-) diff --git a/src/global.rs b/src/global.rs index c81eec99..ccc6d9de 100644 --- a/src/global.rs +++ b/src/global.rs @@ -48,13 +48,13 @@ pub struct App { pub description: String, /// Tema predeterminado. pub theme: String, - /// Idioma por defecto de la aplicación. + /// Idioma por defecto para la aplicación. /// - /// Si este valor no es válido, el idioma efectivo para el renderizado se resolverá mediante la - /// implementación de [`LangId`](crate::locale::LangId) en este orden: primero, el establecido - /// explícitamente con [`Contextual::with_langid()`](crate::html::Contextual::with_langid); si - /// no se ha definido, se usará el indicado en la cabecera `Accept-Language` del navegador; y, - /// si ninguno aplica, se empleará el idioma de respaldo ("en-US"). + /// Si no está definido o no es válido, el idioma efectivo para el renderizado se resolverá + /// según la implementación de [`LangId`](crate::locale::LangId) en este orden: primero intenta + /// con el establecido en [`Contextual::with_langid()`](crate::html::Contextual::with_langid); + /// pero si no se ha definido explícitamente, usará el indicado en la cabecera `Accept-Language` + /// del navegador; y, si ninguno aplica, se empleará el idioma de respaldo ("en-US"). pub language: String, /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o /// *"Starwars"*. diff --git a/src/html/assets.rs b/src/html/assets.rs index e53e8e35..ee5431f0 100644 --- a/src/html/assets.rs +++ b/src/html/assets.rs @@ -5,22 +5,49 @@ pub mod stylesheet; use crate::html::{html, Markup, Render}; use crate::{AutoDefault, Weight}; +/// Representación genérica de un *script* [`JavaScript`](crate::html::JavaScript) o una hoja de +/// estilos [`StyleSheet`](crate::html::StyleSheet). +/// +/// Estos recursos se incluyen en los conjuntos de recursos ([`Assets`]) que suelen renderizarse en +/// un documento HTML. +/// +/// Cada recurso se identifica por un **nombre único** ([`Asset::name()`]), usado como clave; y un +/// **peso** ([`Asset::weight()`]), que determina su orden relativo de renderizado. pub trait Asset: Render { /// Devuelve el nombre del recurso, utilizado como clave única. fn name(&self) -> &str; - /// Devuelve el peso del recurso, durante el renderizado se procesan de menor a mayor peso. + /// Devuelve el peso del recurso, usado para ordenar el renderizado de menor a mayor peso. fn weight(&self) -> Weight; } +/// Gestión común para conjuntos de recursos como [`JavaScript`](crate::html::JavaScript) y +/// [`StyleSheet`](crate::html::StyleSheet). +/// +/// Se emplea normalmente para agrupar, administrar y renderizar los recursos de un documento HTML. +/// Cada recurso se identifica por un nombre único ([`Asset::name()`]) y tiene asociado un peso +/// ([`Asset::weight()`]) que determina su orden de renderizado. +/// +/// Durante el renderizado, los recursos se procesan en orden ascendente de peso. En caso de +/// igualdad, se respeta el orden de inserción. #[derive(AutoDefault)] pub struct Assets<T>(Vec<T>); impl<T: Asset> Assets<T> { + /// Crea un nuevo conjunto vacío de recursos. + /// + /// Normalmente no se instancia directamente, sino como parte de la gestión de recursos que + /// hacen páginas o temas. pub fn new() -> Self { Self(Vec::new()) } + /// Inserta un recurso. + /// + /// Si no existe otro con el mismo nombre, lo añade. Si ya existe y su peso era mayor, lo + /// reemplaza. Y si su peso era menor o igual, entonces no realiza ningún cambio. + /// + /// Devuelve `true` si el recurso fue insertado o reemplazado. pub fn add(&mut self, asset: T) -> bool { match self.0.iter().position(|x| x.name() == asset.name()) { Some(index) => { @@ -39,6 +66,9 @@ impl<T: Asset> Assets<T> { } } + /// Elimina un recurso por nombre. + /// + /// Devuelve `true` si el recurso existía y fue eliminado. pub fn remove(&mut self, name: impl AsRef<str>) -> bool { if let Some(index) = self.0.iter().position(|x| x.name() == name.as_ref()) { self.0.remove(index); diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index 89b5261c..be6f9060 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -138,7 +138,9 @@ impl JavaScript { } impl Asset for JavaScript { - // Para *scripts* externos es la ruta; para *scripts* embebidos, un identificador. + /// Devuelve el nombre del recurso, utilizado como clave única. + /// + /// Para *scripts* externos es la ruta del recurso; para *scripts* embebidos, un identificador. fn name(&self) -> &str { match &self.source { Source::From(path) => path, diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index a5537264..38a97d7f 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -143,7 +143,9 @@ impl StyleSheet { } impl Asset for StyleSheet { - // Para hojas de estilos externas es la ruta; para las embebidas, un identificador. + /// Devuelve el nombre del recurso, utilizado como clave única. + /// + /// Para hojas de estilos externas es la ruta del recurso; para las embebidas, un identificador. fn name(&self) -> &str { match &self.source { Source::From(path) => path, diff --git a/src/html/context.rs b/src/html/context.rs index 7af884cf..79148b06 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -47,22 +47,52 @@ pub enum ErrorParam { }, } +/// Interfaz para gestionar el **contexto de renderizado** de un documento HTML. +/// +/// `Contextual` extiende [`LangId`] y define los métodos para: +/// +/// - Establecer el **idioma** del documento. +/// - Almacenar la **solicitud HTTP** de origen. +/// - Seleccionar **tema** y **composición** (*layout*) de renderizado. +/// - Administrar **recursos** del documento como el icono [`Favicon`], las hojas de estilo +/// [`StyleSheet`] o los *scripts* [`JavaScript`] mediante [`AssetsOp`]. +/// - Leer y mantener **parámetros dinámicos tipados** de contexto. +/// - Generar **identificadores únicos** por tipo de componente. +/// +/// Lo implementan, típicamente, estructuras que representan el contexto de renderizado, como +/// [`Context`](crate::html::Context) o [`Page`](crate::response::page::Page). +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// fn prepare_context<C: Contextual>(cx: C) -> C { +/// cx.with_langid(&LangMatch::resolve("es-ES")) +/// .with_theme("aliner") +/// .with_layout("default") +/// .with_assets(AssetsOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) +/// .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/app.css"))) +/// .with_assets(AssetsOp::AddJavaScript(JavaScript::defer("/js/app.js"))) +/// .with_param("usuario_id", 42_i32) +/// } +/// ``` pub trait Contextual: LangId { // Contextual BUILDER ************************************************************************** - /// Asigna la fuente de idioma del documento. + /// Establece el idioma del documento. #[builder_fn] fn with_langid(self, language: &impl LangId) -> Self; - /// Asigna la solicitud HTTP al contexto. + /// Almacena la solicitud HTTP de origen en el contexto. #[builder_fn] fn with_request(self, request: Option<HttpRequest>) -> Self; - /// Asigna el tema para renderizar el documento. + /// Especifica el tema para renderizar el documento. #[builder_fn] fn with_theme(self, theme_name: &'static str) -> Self; - /// Asigna la composición para renderizar el documento. + /// Especifica la composición para renderizar el documento. #[builder_fn] fn with_layout(self, layout_name: &'static str) -> Self; @@ -85,7 +115,7 @@ pub trait Contextual: LangId { /// Devuelve la composición para renderizar el documento. Por defecto es `"default"`. fn layout(&self) -> &str; - /// Recupera un parámetro como [`Option`], simplificando el acceso. + /// Recupera un parámetro como [`Option`]. fn param<T: 'static>(&self, key: &'static str) -> Option<&T>; /// Devuelve el Favicon de los recursos del contexto. @@ -94,22 +124,24 @@ pub trait Contextual: LangId { /// Devuelve las hojas de estilo de los recursos del contexto. fn stylesheets(&self) -> &Assets<StyleSheet>; - /// Devuelve los scripts JavaScript de los recursos del contexto. + /// Devuelve los *scripts* JavaScript de los recursos del contexto. fn javascripts(&self) -> &Assets<JavaScript>; // Contextual HELPERS ************************************************************************** - /// Devuelve un identificador único dentro del contexto para el tipo `T`, si no se proporciona - /// un `id` explícito. + /// Genera un identificador único por tipo (`<tipo>-<n>`) cuando no se aporta uno explícito. + /// + /// Es útil para componentes u otros elementos HTML que necesitan un identificador predecible si + /// no se proporciona ninguno. fn required_id<T>(&mut self, id: Option<String>) -> String; } -/// Implementa el contexto de un documento HTML. +/// Implementa un **contexto de renderizado** para un documento HTML. /// -/// Se crea internamente para manejar información relevante del documento, como la solicitud HTTP de -/// origen, el idioma, tema y composición para el renderizado, los recursos *favicon* ([`Favicon`]), -/// hojas de estilo ([`StyleSheet`]) y *scripts* ([`JavaScript`]), así como *parámetros dinámicos -/// heterogéneos* de contexto definidos en tiempo de ejecución. +/// Extiende [`Contextual`] con métodos para **instanciar** y configurar un nuevo contexto, +/// **renderizar los recursos** del documento (incluyendo el [`Favicon`], las hojas de estilo +/// [`StyleSheet`] y los *scripts* [`JavaScript`]), o extender el uso de **parámetros dinámicos +/// tipados** con nuevos métodos. /// /// # Ejemplos /// From 50ba58ed74c4802ec170b0a276aebeab403eedd2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 8 Sep 2025 18:57:09 +0200 Subject: [PATCH 777/853] =?UTF-8?q?=E2=9C=A8=20(context):=20A=C3=B1ade=20m?= =?UTF-8?q?=C3=A9todos=20auxiliares=20de=20par=C3=A1metros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/context.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/html/context.rs b/src/html/context.rs index 79148b06..26e2478c 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -118,6 +118,21 @@ pub trait Contextual: LangId { /// Recupera un parámetro como [`Option`]. fn param<T: 'static>(&self, key: &'static str) -> Option<&T>; + /// Devuelve el parámetro clonado o el **valor por defecto del tipo** (`T::default()`). + fn param_or_default<T: Default + Clone + 'static>(&self, key: &'static str) -> T { + self.param::<T>(key).cloned().unwrap_or_default() + } + + /// Devuelve el parámetro clonado o un **valor por defecto** si no existe. + fn param_or<T: Clone + 'static>(&self, key: &'static str, default: T) -> T { + self.param::<T>(key).cloned().unwrap_or(default) + } + + /// Devuelve el parámetro clonado o el **valor evaluado** por la función `f` si no existe. + fn param_or_else<T: Clone + 'static, F: FnOnce() -> T>(&self, key: &'static str, f: F) -> T { + self.param::<T>(key).cloned().unwrap_or_else(f) + } + /// Devuelve el Favicon de los recursos del contexto. fn favicon(&self) -> Option<&Favicon>; From 415e524f69a82f78f6d0c26fc343b4231b0d09e5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 8 Sep 2025 23:27:56 +0200 Subject: [PATCH 778/853] =?UTF-8?q?=F0=9F=8E=A8=20Generaliza=20p=C3=A1gina?= =?UTF-8?q?=20de=20bienvenida=20con=20par=C3=A1metros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/extension/welcome.rs | 4 +++- src/base/theme/basic.rs | 25 +++++++++++++++---------- src/response/page.rs | 11 ++++++----- src/response/page/error.rs | 4 ++-- static/css/intro.css | 23 +++++++++++++++++++++-- 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index 3c0de3db..eaa9f339 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -24,11 +24,13 @@ impl Extension for Welcome { async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { let app = &global::SETTINGS.app.name; - Page::new(Some(request)) + Page::new(request) .with_theme("basic") .with_layout("intro") .with_title(L10n::l("welcome_title")) .with_description(L10n::l("welcome_intro").with_arg("app", app)) + .with_param("intro_button_text", L10n::l("welcome_powered")) + .with_param("intro_button_link", "https://pagetop.cillero.es".to_owned()) .add_component(Html::with(|cx| { html! { p { (L10n::l("welcome_text1").using(cx)) } diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index dc16f2ac..fbf4caf5 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -41,6 +41,9 @@ fn render_intro(page: &mut Page) -> Markup { let title = page.title().unwrap_or_default(); let intro = page.description().unwrap_or_default(); + let intro_button_text: L10n = page.param_or_default("intro_button_text"); + let intro_button_link: Option<&String> = page.param("intro_button_link"); + html! { body id=[page.body_id().get()] class=[page.body_classes().get()] { header class="intro-header" { @@ -71,16 +74,18 @@ fn render_intro(page: &mut Page) -> Markup { } main class="intro-content" { section class="intro-content__body" { - div class="intro-button" { - a - class="intro-button__link" - href="https://pagetop.cillero.es" - target="_blank" - rel="noreferrer" - { - span {} span {} span {} - div class="intro-button__text" { - (L10n::l("welcome_powered").using(page)) + @if intro_button_link.is_some() { + div class="intro-button" { + a + class="intro-button__link" + href=[intro_button_link] + target="_blank" + rel="noreferrer" + { + span {} span {} span {} + div class="intro-button__text" { + (intro_button_text.using(page)) + } } } } diff --git a/src/response/page.rs b/src/response/page.rs index 77bc9c47..86a0bdcc 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -4,7 +4,6 @@ pub use error::ErrorPage; pub use actix_web::Result as ResultPage; use crate::base::action; -use crate::builder_fn; use crate::core::component::{Child, ChildOp, Component}; use crate::core::theme::{ChildrenInRegions, ThemeRef, REGION_CONTENT}; use crate::html::{html, Markup, DOCTYPE}; @@ -14,6 +13,7 @@ use crate::html::{AttrClasses, ClassesOp}; use crate::html::{AttrId, AttrL10n}; use crate::locale::{CharacterDirection, L10n, LangId, LanguageIdentifier}; use crate::service::HttpRequest; +use crate::{builder_fn, AutoDefault}; /// Representa una página HTML completa lista para renderizar. /// @@ -21,6 +21,7 @@ use crate::service::HttpRequest; /// regiones donde disponer los componentes, atributos de `<body>` y otros aspectos del contexto de /// renderizado. #[rustfmt::skip] +#[derive(AutoDefault)] pub struct Page { title : AttrL10n, description : AttrL10n, @@ -35,10 +36,10 @@ pub struct Page { impl Page { /// Crea una nueva instancia de página. /// - /// Si se proporciona la solicitud HTTP, se guardará en el contexto de renderizado de la página - /// para poder ser recuperada por los componentes si es necesario. + /// La solicitud HTTP se guardará en el contexto de renderizado de la página para poder ser + /// recuperada por los componentes si es necesario. #[rustfmt::skip] - pub fn new(request: Option<HttpRequest>) -> Self { + pub fn new(request: HttpRequest) -> Self { Page { title : AttrL10n::default(), description : AttrL10n::default(), @@ -46,7 +47,7 @@ impl Page { properties : Vec::default(), body_id : AttrId::default(), body_classes: AttrClasses::default(), - context : Context::new(request), + context : Context::new(Some(request)), regions : ChildrenInRegions::default(), } } diff --git a/src/response/page/error.rs b/src/response/page/error.rs index be48e3ed..2355d234 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -29,7 +29,7 @@ impl Display for ErrorPage { ErrorPage::BadRequest(_) => write!(f, "Bad Client Data"), // Error 403. ErrorPage::AccessDenied(request) => { - let mut error_page = Page::new(Some(request.clone())); + let mut error_page = Page::new(request.clone()); let error403 = error_page.theme().error403(&mut error_page); if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) @@ -44,7 +44,7 @@ impl Display for ErrorPage { } // Error 404. ErrorPage::NotFound(request) => { - let mut error_page = Page::new(Some(request.clone())); + let mut error_page = Page::new(request.clone()); let error404 = error_page.theme().error404(&mut error_page); if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) diff --git a/static/css/intro.css b/static/css/intro.css index 5a5461e4..19fa9f15 100644 --- a/static/css/intro.css +++ b/static/css/intro.css @@ -5,9 +5,13 @@ --bg-img-sm-set: image-set(url('/img/intro-header-sm.avif') type('image/avif'), url('/img/intro-header-sm.webp') type('image/webp'), var(--bg-img-sm) type('image/jpeg')); --bg-color: #8c5919; --color: #1a202c; - --color-red: #fecaca; --color-gray: #e4e4e7; --color-link: #1e4eae; + --color-block-1: #fecaca; + --color-block-2: #e6a9e2; + --color-block-3: #b689ff; + --color-block-4: #ffedca; + --color-block-5: #ffffff; --focus-outline: 2px solid var(--color-link); --focus-outline-offset: 2px; --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); @@ -413,9 +417,24 @@ a:hover:visited { left: -15%; width: 130%; z-index: -10; - background: var(--color-red); + background: var(--color-block-1); transform: rotate(2deg); } +.intro-text .block:nth-of-type(5n+1) .block__title:after { + background: var(--color-block-1); +} +.intro-text .block:nth-of-type(5n+2) .block__title:after { + background: var(--color-block-2); +} +.intro-text .block:nth-of-type(5n+3) .block__title:after { + background: var(--color-block-3); +} +.intro-text .block:nth-of-type(5n+4) .block__title:after { + background: var(--color-block-4); +} +.intro-text .block:nth-of-type(5n+5) .block__title:after { + background: var(--color-block-5); +} /* * Footer From b16c9378d05626f4222b4c3c28c72bd7b4fc66e6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 9 Sep 2025 01:01:18 +0200 Subject: [PATCH 779/853] =?UTF-8?q?=F0=9F=A9=B9=20Corrige=20doc=20y=20c?= =?UTF-8?q?=C3=B3digo=20por=20cambios=20en=20Page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- examples/hello-name.rs | 2 +- examples/hello-world.rs | 2 +- src/lib.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9d5efc88..c6c12e0e 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,8 @@ impl Extension for HelloWorld { } async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { - Page::new(Some(request)) - .with_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + Page::new(request) + .add_component(Html::with(move |_| html! { h1 { "Hello World!" } })) .render() } diff --git a/examples/hello-name.rs b/examples/hello-name.rs index 3a491a68..e1285d09 100644 --- a/examples/hello-name.rs +++ b/examples/hello-name.rs @@ -13,7 +13,7 @@ async fn hello_name( path: service::web::Path<String>, ) -> ResultPage<Markup, ErrorPage> { let name = path.into_inner(); - Page::new(Some(request)) + Page::new(request) .add_component(Html::with(move |_| html! { h1 { "Hello " (name) "!" } })) .render() } diff --git a/examples/hello-world.rs b/examples/hello-world.rs index 5550514b..d56f2105 100644 --- a/examples/hello-world.rs +++ b/examples/hello-world.rs @@ -9,7 +9,7 @@ impl Extension for HelloWorld { } async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { - Page::new(Some(request)) + Page::new(request) .add_component(Html::with(move |_| html! { h1 { "Hello World!" } })) .render() } diff --git a/src/lib.rs b/src/lib.rs index e43da2f2..93b8564b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -60,8 +60,8 @@ impl Extension for HelloWorld { } async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { - Page::new(Some(request)) - .with_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + Page::new(request) + .add_component(Html::with(move |_| html! { h1 { "Hello World!" } })) .render() } From 7179cf08314d36583a4fc9c140fb25aaa56c43b3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 11 Sep 2025 19:03:34 +0200 Subject: [PATCH 780/853] =?UTF-8?q?=F0=9F=8E=A8=20Unifica=20conversiones?= =?UTF-8?q?=20a=20String=20con=20`to=5Fstring()`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Como `String::from()` y `.to_string()` son equivalentes, se sustituyen todas las ocurrencias de `String::from()` por `to_string()` para mayor coherencia y legibilidad. --- src/app.rs | 2 +- src/base/component/html.rs | 2 +- src/core/theme/regions.rs | 2 +- src/html.rs | 4 ++-- src/html/assets/favicon.rs | 2 +- src/html/attr_classes.rs | 2 +- src/html/attr_l10n.rs | 4 ++-- src/html/attr_value.rs | 2 +- src/html/context.rs | 10 +++++----- src/locale.rs | 4 ++-- src/util.rs | 22 +++++++++++----------- tests/component_html.rs | 2 +- 12 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/app.rs b/src/app.rs index 94d901f1..c8ffba11 100644 --- a/src/app.rs +++ b/src/app.rs @@ -84,7 +84,7 @@ impl Application { if let Some((Width(term_width), _)) = terminal_size() { if term_width >= 80 { let maxlen: usize = ((term_width / 10) - 2).into(); - let mut app = app_name.substring(0, maxlen).to_owned(); + let mut app = app_name.substring(0, maxlen).to_string(); if app_name.len() > maxlen { app = format!("{app}..."); } diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 7bde94a0..8fa56902 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -25,7 +25,7 @@ use crate::prelude::*; /// use pagetop::prelude::*; /// /// let component = Html::with(|cx| { -/// let user = cx.param::<String>("username").cloned().unwrap_or(String::from("visitor")); +/// let user = cx.param::<String>("username").cloned().unwrap_or("visitor".to_string()); /// html! { /// h1 { "Hello, " (user) } /// } diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 1a2e0fbb..8082aac9 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -36,7 +36,7 @@ impl Default for Region { fn default() -> Self { Self { key: REGION_CONTENT, - name: String::from(REGION_CONTENT), + name: REGION_CONTENT.to_string(), } } } diff --git a/src/html.rs b/src/html.rs index 9f3d70cf..37ab3f41 100644 --- a/src/html.rs +++ b/src/html.rs @@ -71,11 +71,11 @@ pub type OptionComponent<C: core::component::Component> = core::component::Typed /// use pagetop::prelude::*; /// /// // Texto normal, se escapa automáticamente para evitar inyección de HTML. -/// let fragment = PrepareMarkup::Escaped(String::from("Hola <b>mundo</b>")); +/// let fragment = PrepareMarkup::Escaped("Hola <b>mundo</b>".to_string()); /// assert_eq!(fragment.render().into_string(), "Hola &lt;b&gt;mundo&lt;/b&gt;"); /// /// // HTML literal, se inserta directamente, sin escapado adicional. -/// let raw_html = PrepareMarkup::Raw(String::from("<b>negrita</b>")); +/// let raw_html = PrepareMarkup::Raw("<b>negrita</b>".to_string()); /// assert_eq!(raw_html.render().into_string(), "<b>negrita</b>"); /// /// // Fragmento ya preparado con la macro `html!`. diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index 1a8b29e7..e951df58 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -129,7 +129,7 @@ impl Favicon { icon_color: Option<String>, ) -> Self { let icon_type = match icon_source.rfind('.') { - Some(i) => match icon_source[i..].to_owned().to_lowercase().as_str() { + Some(i) => match icon_source[i..].to_string().to_lowercase().as_str() { ".avif" => Some("image/avif"), ".gif" => Some("image/gif"), ".ico" => Some("image/x-icon"), diff --git a/src/html/attr_classes.rs b/src/html/attr_classes.rs index 91ccfaf0..098c26cd 100644 --- a/src/html/attr_classes.rs +++ b/src/html/attr_classes.rs @@ -37,7 +37,7 @@ pub enum ClassesOp { /// .with_value(ClassesOp::Add, "Active") /// .with_value(ClassesOp::Remove, "btn-primary"); /// -/// assert_eq!(classes.get(), Some(String::from("btn active"))); +/// assert_eq!(classes.get(), Some("btn active".to_string())); /// assert!(classes.contains("active")); /// ``` #[derive(AutoDefault, Clone, Debug)] diff --git a/src/html/attr_l10n.rs b/src/html/attr_l10n.rs index 3e8a4e4b..8250c742 100644 --- a/src/html/attr_l10n.rs +++ b/src/html/attr_l10n.rs @@ -17,13 +17,13 @@ use crate::{builder_fn, AutoDefault}; /// // Español disponible. /// assert_eq!( /// hello.lookup(&LangMatch::resolve("es-ES")), -/// Some(String::from("¡Hola mundo!")) +/// Some("¡Hola mundo!".to_string()) /// ); /// /// // Japonés no disponible, traduce al idioma de respaldo ("en-US"). /// assert_eq!( /// hello.lookup(&LangMatch::resolve("ja-JP")), -/// Some(String::from("Hello world!")) +/// Some("Hello world!".to_string()) /// ); /// /// // Uso típico en un atributo: diff --git a/src/html/attr_value.rs b/src/html/attr_value.rs index c70229f9..4e03120b 100644 --- a/src/html/attr_value.rs +++ b/src/html/attr_value.rs @@ -36,7 +36,7 @@ impl AttrValue { self.0 = if value.is_empty() { None } else { - Some(value.to_owned()) + Some(value.to_string()) }; self } diff --git a/src/html/context.rs b/src/html/context.rs index 26e2478c..8ef3a053 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -285,7 +285,7 @@ impl Context { /// /// let cx = Context::new(None) /// .with_param("usuario_id", 42_i32) - /// .with_param("titulo", String::from("Hola")); + /// .with_param("titulo", "Hola".to_string()); /// /// let id: &i32 = cx.get_param("usuario_id").unwrap(); /// let titulo: &String = cx.get_param("titulo").unwrap(); @@ -318,7 +318,7 @@ impl Context { /// /// let mut cx = Context::new(None) /// .with_param("contador", 7_i32) - /// .with_param("titulo", String::from("Hola")); + /// .with_param("titulo", "Hola".to_string()); /// /// let n: i32 = cx.take_param("contador").unwrap(); /// assert!(cx.get_param::<i32>("contador").is_err()); // ya no está @@ -416,7 +416,7 @@ impl Contextual for Context { /// /// let cx = Context::new(None) /// .with_param("usuario_id", 42_i32) - /// .with_param("titulo", String::from("Hola")) + /// .with_param("titulo", "Hola".to_string()) /// .with_param("flags", vec!["a", "b"]); /// ``` #[builder_fn] @@ -484,7 +484,7 @@ impl Contextual for Context { /// ```rust /// use pagetop::prelude::*; /// - /// let cx = Context::new(None).with_param("username", String::from("Alice")); + /// let cx = Context::new(None).with_param("username", "Alice".to_string()); /// /// // Devuelve Some(&String) si existe y coincide el tipo. /// assert_eq!(cx.param::<String>("username").map(|s| s.as_str()), Some("Alice")); @@ -533,7 +533,7 @@ impl Contextual for Context { .replace(' ', "_") .to_lowercase(); let prefix = if prefix.is_empty() { - "prefix".to_owned() + "prefix".to_string() } else { prefix }; diff --git a/src/locale.rs b/src/locale.rs index cf44dd82..2bf0da90 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -165,7 +165,7 @@ pub trait LangId { /// /// // Idioma no soportado. /// let lang = LangMatch::resolve("ja-JP"); -/// assert_eq!(lang, LangMatch::Unsupported(String::from("ja-JP"))); +/// assert_eq!(lang, LangMatch::Unsupported("ja-JP".to_string())); /// ``` /// /// Con la siguiente instrucción siempre se obtiene un [`LanguageIdentifier`] válido, ya sea porque @@ -222,7 +222,7 @@ impl LangMatch { } // En caso contrario, indica que el idioma no está soportado. - Self::Unsupported(String::from(language)) + Self::Unsupported(language.to_string()) } /// Devuelve el [`LanguageIdentifier`] si el idioma fue reconocido. diff --git a/src/util.rs b/src/util.rs index 808014b2..56b098d8 100644 --- a/src/util.rs +++ b/src/util.rs @@ -110,15 +110,15 @@ macro_rules! hm { /// /// // Concatena todos los fragmentos directamente. /// let result = join!("Hello", " ", "World"); -/// assert_eq!(result, String::from("Hello World")); +/// assert_eq!(result, "Hello World".to_string()); /// /// // También funciona con valores vacíos. /// let result_with_empty = join!("Hello", "", "World"); -/// assert_eq!(result_with_empty, String::from("HelloWorld")); +/// assert_eq!(result_with_empty, "HelloWorld".to_string()); /// /// // Un único fragmento devuelve el mismo valor. /// let single_result = join!("Hello"); -/// assert_eq!(single_result, String::from("Hello")); +/// assert_eq!(single_result, "Hello".to_string()); /// ``` #[macro_export] macro_rules! join { @@ -141,11 +141,11 @@ macro_rules! join { /// /// // Concatena los fragmentos no vacíos con un espacio como separador. /// let result_with_separator = join_opt!(["Hello", "", "World"]; " "); -/// assert_eq!(result_with_separator, Some(String::from("Hello World"))); +/// assert_eq!(result_with_separator, Some("Hello World".to_string())); /// /// // Concatena los fragmentos no vacíos sin un separador. /// let result_without_separator = join_opt!(["Hello", "", "World"]); -/// assert_eq!(result_without_separator, Some(String::from("HelloWorld"))); +/// assert_eq!(result_without_separator, Some("HelloWorld".to_string())); /// /// // Devuelve `None` si todos los fragmentos están vacíos. /// let result_empty = join_opt!(["", "", ""]); @@ -185,19 +185,19 @@ macro_rules! join_opt { /// /// // Concatena los dos fragmentos cuando ambos no están vacíos. /// let result = join_pair!(first, separator, second); -/// assert_eq!(result, String::from("Hello-World")); +/// assert_eq!(result, "Hello-World".to_string()); /// /// // Si el primer fragmento está vacío, devuelve el segundo. /// let result_empty_first = join_pair!("", separator, second); -/// assert_eq!(result_empty_first, String::from("World")); +/// assert_eq!(result_empty_first, "World".to_string()); /// /// // Si el segundo fragmento está vacío, devuelve el primero. /// let result_empty_second = join_pair!(first, separator, ""); -/// assert_eq!(result_empty_second, String::from("Hello")); +/// assert_eq!(result_empty_second, "Hello".to_string()); /// /// // Si ambos fragmentos están vacíos, devuelve una cadena vacía. /// let result_both_empty = join_pair!("", separator, ""); -/// assert_eq!(result_both_empty, String::from("")); +/// assert_eq!(result_both_empty, "".to_string()); /// ``` #[macro_export] macro_rules! join_pair { @@ -224,11 +224,11 @@ macro_rules! join_pair { /// /// // Concatena los fragmentos. /// let result = join_strict!(["Hello", "World"]); -/// assert_eq!(result, Some(String::from("HelloWorld"))); +/// assert_eq!(result, Some("HelloWorld".to_string())); /// /// // Concatena los fragmentos con un separador. /// let result_with_separator = join_strict!(["Hello", "World"]; " "); -/// assert_eq!(result_with_separator, Some(String::from("Hello World"))); +/// assert_eq!(result_with_separator, Some("Hello World".to_string())); /// /// // Devuelve `None` si alguno de los fragmentos está vacío. /// let result_with_empty = join_strict!(["Hello", "", "World"]); diff --git a/tests/component_html.rs b/tests/component_html.rs index bd7f3c08..851315a9 100644 --- a/tests/component_html.rs +++ b/tests/component_html.rs @@ -17,7 +17,7 @@ async fn component_html_renders_static_markup() { #[pagetop::test] async fn component_html_renders_using_context_param() { - let mut cx = Context::new(None).with_param("username", String::from("Alice")); + let mut cx = Context::new(None).with_param("username", "Alice".to_string()); let component = Html::with(|cx| { let name = cx.param::<String>("username").cloned().unwrap_or_default(); From a96a3fdf9f933ddaddbc90146fbb1fcfe10c49e8 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 11 Sep 2025 19:58:50 +0200 Subject: [PATCH 781/853] =?UTF-8?q?=F0=9F=94=A5=20Elimina=20`Render`=20par?= =?UTF-8?q?a=20usar=20siempre=20el=20contexto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/component/definition.rs | 2 +- src/core/theme.rs | 2 +- src/html.rs | 6 +- src/html/assets.rs | 16 ++-- src/html/assets/favicon.rs | 10 ++- src/html/assets/javascript.rs | 144 +++++++++++++++++++++---------- src/html/assets/stylesheet.rs | 34 ++++---- src/html/context.rs | 39 ++++++--- src/html/maud.rs | 21 +---- src/response/page.rs | 2 +- tests/component_poweredby.rs | 31 ++++--- tests/html.rs | 44 +++++----- 12 files changed, 205 insertions(+), 146 deletions(-) diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index d547c4b3..333cf694 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -1,6 +1,6 @@ use crate::base::action; use crate::core::{AnyInfo, TypeInfo}; -use crate::html::{html, Context, Markup, PrepareMarkup, Render}; +use crate::html::{html, Context, Markup, PrepareMarkup}; /// Define la función de renderizado para todos los componentes. /// diff --git a/src/core/theme.rs b/src/core/theme.rs index 5889dcf7..61d820b4 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -7,7 +7,7 @@ //! Un tema **declara las regiones** (*cabecera*, *barra lateral*, *pie*, etc.) que estarán //! disponibles para colocar contenido. Los temas son responsables últimos de los estilos, //! tipografías, espaciados y cualquier otro detalle visual o de comportamiento (como animaciones, -//! *scripts* de interfaz, etc.). +//! scripts de interfaz, etc.). //! //! Los temas son extensiones que implementan [`Extension`](crate::core::extension::Extension); por //! lo que se instancian, declaran sus dependencias y se inician igual que el resto de extensiones; diff --git a/src/html.rs b/src/html.rs index 37ab3f41..4858bbfa 100644 --- a/src/html.rs +++ b/src/html.rs @@ -1,7 +1,7 @@ //! HTML en código. mod maud; -pub use maud::{display, html, html_private, Escaper, Markup, PreEscaped, Render, DOCTYPE}; +pub use maud::{display, html, html_private, Escaper, Markup, PreEscaped, DOCTYPE}; // HTML DOCUMENT ASSETS **************************************************************************** @@ -119,11 +119,9 @@ impl PrepareMarkup { PrepareMarkup::With(markup) => markup.is_empty(), } } -} -impl Render for PrepareMarkup { /// Integra el renderizado fácilmente en la macro [`html!`]. - fn render(&self) -> Markup { + pub fn render(&self) -> Markup { match self { PrepareMarkup::None => html! {}, PrepareMarkup::Escaped(text) => html! { (text) }, diff --git a/src/html/assets.rs b/src/html/assets.rs index ee5431f0..41cd4710 100644 --- a/src/html/assets.rs +++ b/src/html/assets.rs @@ -2,10 +2,10 @@ pub mod favicon; pub mod javascript; pub mod stylesheet; -use crate::html::{html, Markup, Render}; +use crate::html::{html, Context, Markup}; use crate::{AutoDefault, Weight}; -/// Representación genérica de un *script* [`JavaScript`](crate::html::JavaScript) o una hoja de +/// Representación genérica de un script [`JavaScript`](crate::html::JavaScript) o una hoja de /// estilos [`StyleSheet`](crate::html::StyleSheet). /// /// Estos recursos se incluyen en los conjuntos de recursos ([`Assets`]) que suelen renderizarse en @@ -13,12 +13,15 @@ use crate::{AutoDefault, Weight}; /// /// Cada recurso se identifica por un **nombre único** ([`Asset::name()`]), usado como clave; y un /// **peso** ([`Asset::weight()`]), que determina su orden relativo de renderizado. -pub trait Asset: Render { +pub trait Asset { /// Devuelve el nombre del recurso, utilizado como clave única. fn name(&self) -> &str; /// Devuelve el peso del recurso, usado para ordenar el renderizado de menor a mayor peso. fn weight(&self) -> Weight; + + /// Renderiza el recurso en el contexto proporcionado. + fn render(&self, cx: &mut Context) -> Markup; } /// Gestión común para conjuntos de recursos como [`JavaScript`](crate::html::JavaScript) y @@ -77,16 +80,13 @@ impl<T: Asset> Assets<T> { false } } -} -impl<T: Asset> Render for Assets<T> { - fn render(&self) -> Markup { + pub fn render(&self, cx: &mut Context) -> Markup { let mut assets = self.0.iter().collect::<Vec<_>>(); assets.sort_by_key(|a| a.weight()); - html! { @for a in assets { - (a) + (a.render(cx)) } } } diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index e951df58..d731b8f5 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -1,4 +1,4 @@ -use crate::html::{html, Markup, Render}; +use crate::html::{html, Context, Markup}; use crate::AutoDefault; /// Un **Favicon** es un recurso gráfico que usa el navegador como icono asociado al sitio. @@ -151,10 +151,12 @@ impl Favicon { }); self } -} -impl Render for Favicon { - fn render(&self) -> Markup { + /// Renderiza el **Favicon** completo con todas las etiquetas declaradas. + /// + /// El parámetro `Context` se acepta por coherencia con el resto de *assets*, aunque en este + /// caso es ignorado. + pub fn render(&self, _cx: &mut Context) -> Markup { html! { @for item in &self.0 { (item) diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index be6f9060..a8ed3e8c 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -1,35 +1,45 @@ use crate::html::assets::Asset; -use crate::html::{html, Markup, Render}; +use crate::html::{html, Context, Markup, PreEscaped}; use crate::{join, join_pair, AutoDefault, Weight}; // Define el origen del recurso JavaScript y cómo debe cargarse en el navegador. // // Los distintos modos de carga permiten optimizar el rendimiento y controlar el comportamiento del -// script. +// script en relación con el análisis del documento HTML y la ejecución del resto de scripts. // -// - [`From`] – Carga el script de forma estándar con la etiqueta `<script src="...">`. -// - [`Defer`] – Igual que [`From`], pero con el atributo `defer`. -// - [`Async`] – Igual que [`From`], pero con el atributo `async`. -// - [`Inline`] – Inserta el código directamente en la etiqueta `<script>`. -// - [`OnLoad`] – Inserta el código JavaScript y lo ejecuta tras el evento `DOMContentLoaded`. +// - [`From`] – Carga estándar con la etiqueta `<script src="...">`. +// - [`Defer`] – Igual que [`From`], pero con el atributo `defer`, descarga en paralelo y se +// ejecuta tras el análisis del documento HTML, respetando el orden de +// aparición. +// - [`Async`] – Igual que [`From`], pero con el atributo `async`, descarga en paralelo y se +// ejecuta en cuanto esté listo, **sin garantizar** el orden relativo respecto a +// otros scripts. +// - [`Inline`] – Inserta el código directamente en la etiqueta `<script>`. +// - [`OnLoad`] – Inserta el código JavaScript y lo ejecuta tras el evento `DOMContentLoaded`. +// - [`OnLoadAsync`] – Igual que [`OnLoad`], pero con manejador asíncrono (`async`), útil si dentro +// del código JavaScript se utiliza `await`. #[derive(AutoDefault)] enum Source { #[default] From(String), Defer(String), Async(String), - Inline(String, String), - OnLoad(String, String), + // `name`, `closure(Context) -> String`. + Inline(String, Box<dyn Fn(&mut Context) -> String + Send + Sync>), + // `name`, `closure(Context) -> String` (se ejecuta tras `DOMContentLoaded`). + OnLoad(String, Box<dyn Fn(&mut Context) -> String + Send + Sync>), + // `name`, `closure(Context) -> String` (manejador `async` tras `DOMContentLoaded`). + OnLoadAsync(String, Box<dyn Fn(&mut Context) -> String + Send + Sync>), } /// Define un recurso **JavaScript** para incluir en un documento HTML. /// -/// Este tipo permite añadir *scripts* externos o embebidos con distintas estrategias de carga +/// Este tipo permite añadir scripts externos o embebidos con distintas estrategias de carga /// (`defer`, `async`, *inline*, etc.) y [pesos](crate::Weight) para controlar el orden de inserción /// en el documento. /// /// > **Nota** -/// > Los archivos de los *scripts* deben estar disponibles en el servidor web de la aplicación. +/// > Los archivos de los scripts deben estar disponibles en el servidor web de la aplicación. /// > Pueden servirse usando [`static_files_service!`](crate::static_files_service). /// /// # Ejemplo @@ -37,23 +47,37 @@ enum Source { /// ```rust /// use pagetop::prelude::*; /// -/// // Script externo con carga diferida, versión para control de caché y prioriza el renderizado. +/// // Script externo con carga diferida, versión de caché y prioridad en el renderizado. /// let script = JavaScript::defer("/assets/js/app.js") /// .with_version("1.2.3") /// .with_weight(-10); /// /// // Script embebido que se ejecuta tras la carga del documento. -/// let script = JavaScript::on_load("init_tooltips", r#" +/// let script = JavaScript::on_load("init_tooltips", |_| r#" /// const tooltips = document.querySelectorAll('[data-tooltip]'); /// for (const el of tooltips) { /// el.addEventListener('mouseenter', showTooltip); /// } -/// "#); +/// "#.to_string()); +/// +/// // Script embebido con manejador asíncrono (`async`) que puede usar `await`. +/// let mut cx = Context::new(None).with_param("user_id", 7u32); +/// +/// let js = JavaScript::on_load_async("hydrate", |cx| { +/// // Ejemplo: lectura de un parámetro del contexto para inyectarlo en el código. +/// let uid: u32 = cx.param_or_default("user_id"); +/// format!(r#" +/// const USER_ID = {}; +/// await Promise.resolve(USER_ID); +/// // Aquí se podría hidratar la interfaz o cargar módulos dinámicos: +/// // await import('/assets/js/hydrate.js'); +/// "#, uid) +/// }); /// ``` #[rustfmt::skip] #[derive(AutoDefault)] pub struct JavaScript { - source : Source, // Fuente y modo de carga del script. + source : Source, // Fuente y estrategia de carga del script. version: String, // Versión del recurso para la caché del navegador. weight : Weight, // Peso que determina el orden. } @@ -70,11 +94,11 @@ impl JavaScript { } } - /// Crea un **script externo** con el atributo `defer`, que se carga en segundo plano y se - /// ejecuta tras analizar completamente el documento HTML. + /// Crea un **script externo** con el atributo `defer`, que se descarga en paralelo y se ejecuta + /// tras analizar completamente el documento HTML, **respetando el orden** de inserción. /// - /// Equivale a `<script src="..." defer>`. Útil para mantener el orden de ejecución y evitar - /// bloquear el análisis del documento HTML. + /// Equivale a `<script src="..." defer>`. Suele ser la opción recomendada para scripts no + /// críticos. pub fn defer(path: impl Into<String>) -> Self { JavaScript { source: Source::Defer(path.into()), @@ -82,11 +106,10 @@ impl JavaScript { } } - /// Crea un **script externo** con el atributo `async`, que se carga y ejecuta de forma - /// asíncrona tan pronto como esté disponible. + /// Crea un **script externo** con el atributo `async`, que se descarga en paralelo y se ejecuta + /// tan pronto como esté disponible. /// - /// Equivale a `<script src="..." async>`. La ejecución puede producirse fuera de orden respecto - /// a otros *scripts*. + /// Equivale a `<script src="..." async>`. **No garantiza** el orden relativo con otros scripts. pub fn asynchronous(path: impl Into<String>) -> Self { JavaScript { source: Source::Async(path.into()), @@ -97,37 +120,68 @@ impl JavaScript { /// Crea un **script embebido** directamente en el documento HTML. /// /// Equivale a `<script>...</script>`. El parámetro `name` se usa como identificador interno del - /// *script*. - pub fn inline(name: impl Into<String>, script: impl Into<String>) -> Self { + /// script. + /// + /// La función *closure* recibirá el [`Context`] por si se necesita durante el renderizado. + pub fn inline<F>(name: impl Into<String>, f: F) -> Self + where + F: Fn(&mut Context) -> String + Send + Sync + 'static, + { JavaScript { - source: Source::Inline(name.into(), script.into()), + source: Source::Inline(name.into(), Box::new(f)), ..Default::default() } } - /// Crea un **script embebido** que se ejecuta automáticamente al terminar de cargarse el - /// documento HTML. + /// Crea un **script embebido** que se ejecuta cuando **el DOM está listo**. /// - /// El código se envuelve automáticamente en un `addEventListener('DOMContentLoaded', ...)`. El - /// parámetro `name` se usa como identificador interno del *script*. - pub fn on_load(name: impl Into<String>, script: impl Into<String>) -> Self { + /// El código se envuelve en un `addEventListener('DOMContentLoaded',function(){...})` que lo + /// ejecuta tras analizar el documento HTML, **no** espera imágenes ni otros recursos externos. + /// Útil para inicializaciones que no dependen de `await`. El parámetro `name` se usa como + /// identificador interno del script. + /// + /// Los scripts con `defer` se ejecutan antes de `DOMContentLoaded`. + /// + /// La función *closure* recibirá el [`Context`] por si se necesita durante el renderizado. + pub fn on_load<F>(name: impl Into<String>, f: F) -> Self + where + F: Fn(&mut Context) -> String + Send + Sync + 'static, + { JavaScript { - source: Source::OnLoad(name.into(), script.into()), + source: Source::OnLoad(name.into(), Box::new(f)), + ..Default::default() + } + } + + /// Crea un **script embebido** con un **manejador asíncrono**. + /// + /// El código se envuelve en un `addEventListener('DOMContentLoaded',async()=>{...})`, que + /// emplea una función `async` para que el cuerpo devuelto por la función *closure* pueda usar + /// `await`. Ideal para hidratar la interfaz, cargar módulos dinámicos o realizar lecturas + /// iniciales. + /// + /// La función *closure* recibirá el [`Context`] por si se necesita durante el renderizado. + pub fn on_load_async<F>(name: impl Into<String>, f: F) -> Self + where + F: Fn(&mut Context) -> String + Send + Sync + 'static, + { + JavaScript { + source: Source::OnLoadAsync(name.into(), Box::new(f)), ..Default::default() } } // JavaScript BUILDER ************************************************************************** - /// Asocia una versión al recurso (usada para control de la caché del navegador). + /// Asocia una **versión** al recurso (usada para control de la caché del navegador). /// - /// Si `version` está vacío, no se añade ningún parámetro a la URL. + /// Si `version` está vacío, **no** se añade ningún parámetro a la URL. pub fn with_version(mut self, version: impl Into<String>) -> Self { self.version = version.into(); self } - /// Modifica el peso del recurso. + /// Modifica el **peso** del recurso. /// /// Los recursos se renderizan de menor a mayor peso. Por defecto es `0`, que respeta el orden /// de creación. @@ -140,7 +194,7 @@ impl JavaScript { impl Asset for JavaScript { /// Devuelve el nombre del recurso, utilizado como clave única. /// - /// Para *scripts* externos es la ruta del recurso; para *scripts* embebidos, un identificador. + /// Para scripts externos es la ruta del recurso; para scripts embebidos, un identificador. fn name(&self) -> &str { match &self.source { Source::From(path) => path, @@ -148,16 +202,15 @@ impl Asset for JavaScript { Source::Async(path) => path, Source::Inline(name, _) => name, Source::OnLoad(name, _) => name, + Source::OnLoadAsync(name, _) => name, } } fn weight(&self) -> Weight { self.weight } -} -impl Render for JavaScript { - fn render(&self) -> Markup { + fn render(&self, cx: &mut Context) -> Markup { match &self.source { Source::From(path) => html! { script src=(join_pair!(path, "?v=", self.version.as_str())) {}; @@ -168,12 +221,15 @@ impl Render for JavaScript { Source::Async(path) => html! { script src=(join_pair!(path, "?v=", self.version.as_str())) async {}; }, - Source::Inline(_, code) => html! { - script { (code) }; + Source::Inline(_, f) => html! { + script { (PreEscaped((f)(cx))) }; }, - Source::OnLoad(_, code) => html! { (join!( - "document.addEventListener('DOMContentLoaded',function(){", code, "});" - )) }, + Source::OnLoad(_, f) => html! { script { (PreEscaped(join!( + "document.addEventListener(\"DOMContentLoaded\",function(){", (f)(cx), "});" + ))) } }, + Source::OnLoadAsync(_, f) => html! { script { (PreEscaped(join!( + "document.addEventListener(\"DOMContentLoaded\",async()=>{", (f)(cx), "});" + ))) } }, } } } diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 38a97d7f..3ecc77fc 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -1,5 +1,5 @@ use crate::html::assets::Asset; -use crate::html::{html, Markup, PreEscaped, Render}; +use crate::html::{html, Context, Markup, PreEscaped}; use crate::{join_pair, AutoDefault, Weight}; // Define el origen del recurso CSS y cómo se incluye en el documento. @@ -14,7 +14,8 @@ use crate::{join_pair, AutoDefault, Weight}; enum Source { #[default] From(String), - Inline(String, String), + // `name`, `closure(Context) -> String`. + Inline(String, Box<dyn Fn(&mut Context) -> String + Send + Sync>), } /// Define el medio objetivo para la hoja de estilos. @@ -34,7 +35,7 @@ pub enum TargetMedia { Speech, } -/// Devuelve el texto asociado al punto de interrupción usado por Bootstrap. +/// Devuelve el valor para el atributo `media` (`Some(...)`) o `None` para `Default`. #[rustfmt::skip] impl TargetMedia { fn as_str_opt(&self) -> Option<&str> { @@ -69,12 +70,12 @@ impl TargetMedia { /// .with_weight(-10); /// /// // Crea una hoja de estilos embebida en el documento HTML. -/// let embedded = StyleSheet::inline("custom_theme", r#" +/// let embedded = StyleSheet::inline("custom_theme", |_| r#" /// body { /// background-color: #f5f5f5; /// font-family: 'Segoe UI', sans-serif; /// } -/// "#); +/// "#.to_string()); /// ``` #[rustfmt::skip] #[derive(AutoDefault)] @@ -100,9 +101,14 @@ impl StyleSheet { /// /// Equivale a `<style>...</style>`. El parámetro `name` se usa como identificador interno del /// recurso. - pub fn inline(name: impl Into<String>, styles: impl Into<String>) -> Self { + /// + /// La función *closure* recibirá el [`Context`] por si se necesita durante el renderizado. + pub fn inline<F>(name: impl Into<String>, f: F) -> Self + where + F: Fn(&mut Context) -> String + Send + Sync + 'static, + { StyleSheet { - source: Source::Inline(name.into(), styles.into()), + source: Source::Inline(name.into(), Box::new(f)), ..Default::default() } } @@ -133,9 +139,9 @@ impl StyleSheet { /// Según el argumento `media`: /// /// - `TargetMedia::Default` - Se aplica en todos los casos (medio por defecto). - /// - `TargetMedia::Print` - Se aplican cuando el documento se imprime. - /// - `TargetMedia::Screen` - Se aplican en pantallas. - /// - `TargetMedia::Speech` - Se aplican en dispositivos que convierten el texto a voz. + /// - `TargetMedia::Print` - Se aplica cuando el documento se imprime. + /// - `TargetMedia::Screen` - Se aplica en pantallas. + /// - `TargetMedia::Speech` - Se aplica en dispositivos que convierten el texto a voz. pub fn for_media(mut self, media: TargetMedia) -> Self { self.media = media; self @@ -156,10 +162,8 @@ impl Asset for StyleSheet { fn weight(&self) -> Weight { self.weight } -} -impl Render for StyleSheet { - fn render(&self) -> Markup { + fn render(&self, cx: &mut Context) -> Markup { match &self.source { Source::From(path) => html! { link @@ -167,8 +171,8 @@ impl Render for StyleSheet { href=(join_pair!(path, "?v=", self.version.as_str())) media=[self.media.as_str_opt()]; }, - Source::Inline(_, code) => html! { - style { (PreEscaped(code)) }; + Source::Inline(_, f) => html! { + style { (PreEscaped((f)(cx))) }; }, } } diff --git a/src/html/context.rs b/src/html/context.rs index 8ef3a053..2f3e0f07 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -25,9 +25,9 @@ pub enum AssetsOp { RemoveStyleSheet(&'static str), // JavaScripts. - /// Añade un *script* JavaScript al documento. + /// Añade un script JavaScript al documento. AddJavaScript(JavaScript), - /// Elimina un *script* por su ruta o identificador. + /// Elimina un script por su ruta o identificador. RemoveJavaScript(&'static str), } @@ -55,7 +55,7 @@ pub enum ErrorParam { /// - Almacenar la **solicitud HTTP** de origen. /// - Seleccionar **tema** y **composición** (*layout*) de renderizado. /// - Administrar **recursos** del documento como el icono [`Favicon`], las hojas de estilo -/// [`StyleSheet`] o los *scripts* [`JavaScript`] mediante [`AssetsOp`]. +/// [`StyleSheet`] o los scripts [`JavaScript`] mediante [`AssetsOp`]. /// - Leer y mantener **parámetros dinámicos tipados** de contexto. /// - Generar **identificadores únicos** por tipo de componente. /// @@ -139,7 +139,7 @@ pub trait Contextual: LangId { /// Devuelve las hojas de estilo de los recursos del contexto. fn stylesheets(&self) -> &Assets<StyleSheet>; - /// Devuelve los *scripts* JavaScript de los recursos del contexto. + /// Devuelve los scripts JavaScript de los recursos del contexto. fn javascripts(&self) -> &Assets<JavaScript>; // Contextual HELPERS ************************************************************************** @@ -155,7 +155,7 @@ pub trait Contextual: LangId { /// /// Extiende [`Contextual`] con métodos para **instanciar** y configurar un nuevo contexto, /// **renderizar los recursos** del documento (incluyendo el [`Favicon`], las hojas de estilo -/// [`StyleSheet`] y los *scripts* [`JavaScript`]), o extender el uso de **parámetros dinámicos +/// [`StyleSheet`] y los scripts [`JavaScript`]), o extender el uso de **parámetros dinámicos /// tipados** con nuevos métodos. /// /// # Ejemplos @@ -258,14 +258,29 @@ impl Context { // Context RENDER ****************************************************************************** /// Renderiza los recursos del contexto. - pub fn render_assets(&self) -> Markup { - html! { - @if let Some(favicon) = &self.favicon { - (favicon) + pub fn render_assets(&mut self) -> Markup { + use std::mem::take as mem_take; + + // Extrae temporalmente los recursos. + let favicon = mem_take(&mut self.favicon); // Deja valor por defecto (None) en self. + let stylesheets = mem_take(&mut self.stylesheets); // Assets<StyleSheet>::default() en self. + let javascripts = mem_take(&mut self.javascripts); // Assets<JavaScript>::default() en self. + + // Renderiza con `&mut self` como contexto. + let markup = html! { + @if let Some(fi) = &favicon { + (fi.render(self)) } - (self.stylesheets) - (self.javascripts) - } + (stylesheets.render(self)) + (javascripts.render(self)) + }; + + // Restaura los campos tal y como estaban. + self.favicon = favicon; + self.stylesheets = stylesheets; + self.javascripts = javascripts; + + markup } // Context PARAMS ****************************************************************************** diff --git a/src/html/maud.rs b/src/html/maud.rs index 9bf179ec..65360360 100644 --- a/src/html/maud.rs +++ b/src/html/maud.rs @@ -69,23 +69,6 @@ impl fmt::Write for Escaper<'_> { /// `.render()` or `.render_to()`. Since the default definitions of /// these methods call each other, not doing this will result in /// infinite recursion. -/// -/// # Example -/// -/// ```rust -/// use pagetop::prelude::*; -/// -/// /// Provides a shorthand for linking to a CSS stylesheet. -/// pub struct Stylesheet(&'static str); -/// -/// impl Render for Stylesheet { -/// fn render(&self) -> Markup { -/// html! { -/// link rel="stylesheet" type="text/css" href=(self.0); -/// } -/// } -/// } -/// ``` pub trait Render { /// Renders `self` as a block of `Markup`. fn render(&self) -> Markup { @@ -238,6 +221,10 @@ impl Markup { pub fn is_empty(&self) -> bool { self.0.is_empty() } + + pub fn as_str(&self) -> &str { + self.0.as_str() + } } impl<T: Into<String>> PreEscaped<T> { diff --git a/src/response/page.rs b/src/response/page.rs index 86a0bdcc..2dc27f9f 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -202,7 +202,7 @@ impl Page { } /// Renderiza los recursos de la página. - pub fn render_assets(&self) -> Markup { + pub fn render_assets(&mut self) -> Markup { self.context.render_assets() } diff --git a/tests/component_poweredby.rs b/tests/component_poweredby.rs index 9f8e8222..e4551d17 100644 --- a/tests/component_poweredby.rs +++ b/tests/component_poweredby.rs @@ -8,10 +8,10 @@ async fn poweredby_default_shows_only_pagetop_recognition() { let html = render_component(&p); // Debe mostrar el bloque de reconocimiento a PageTop. - assert!(html.contains("poweredby__pagetop")); + assert!(html.as_str().contains("poweredby__pagetop")); // Y NO debe mostrar el bloque de copyright. - assert!(!html.contains("poweredby__copyright")); + assert!(!html.as_str().contains("poweredby__copyright")); } #[pagetop::test] @@ -22,17 +22,20 @@ async fn poweredby_new_includes_current_year_and_app_name() { let html = render_component(&p); let year = Utc::now().format("%Y").to_string(); - assert!(html.contains(&year), "HTML should include the current year"); + assert!( + html.as_str().contains(&year), + "HTML should include the current year" + ); // El nombre de la app proviene de `global::SETTINGS.app.name`. let app_name = &global::SETTINGS.app.name; assert!( - html.contains(app_name), + html.as_str().contains(app_name), "HTML should include the application name" ); // Debe existir el span de copyright. - assert!(html.contains("poweredby__copyright")); + assert!(html.as_str().contains("poweredby__copyright")); } #[pagetop::test] @@ -43,8 +46,8 @@ async fn poweredby_with_copyright_overrides_text() { let p = PoweredBy::default().with_copyright(Some(custom)); let html = render_component(&p); - assert!(html.contains(custom)); - assert!(html.contains("poweredby__copyright")); + assert!(html.as_str().contains(custom)); + assert!(html.as_str().contains("poweredby__copyright")); } #[pagetop::test] @@ -54,9 +57,9 @@ async fn poweredby_with_copyright_none_hides_text() { let p = PoweredBy::new().with_copyright(None::<String>); let html = render_component(&p); - assert!(!html.contains("poweredby__copyright")); + assert!(!html.as_str().contains("poweredby__copyright")); // El reconocimiento a PageTop siempre debe aparecer. - assert!(html.contains("poweredby__pagetop")); + assert!(html.as_str().contains("poweredby__pagetop")); } #[pagetop::test] @@ -67,7 +70,7 @@ async fn poweredby_link_points_to_crates_io() { let html = render_component(&p); assert!( - html.contains("https://pagetop.cillero.es"), + html.as_str().contains("https://pagetop.cillero.es"), "Link should point to pagetop.cillero.es" ); } @@ -89,12 +92,8 @@ async fn poweredby_getter_reflects_internal_state() { // HELPERS ***************************************************************************************** -fn render(x: &impl Render) -> String { - x.render().into_string() -} - -fn render_component<C: Component>(c: &C) -> String { +fn render_component<C: Component>(c: &C) -> Markup { let mut cx = Context::default(); let pm = c.prepare_component(&mut cx); - render(&pm) + pm.render() } diff --git a/tests/html.rs b/tests/html.rs index 1499c709..ae4517bc 100644 --- a/tests/html.rs +++ b/tests/html.rs @@ -2,19 +2,19 @@ use pagetop::prelude::*; #[pagetop::test] async fn prepare_markup_render_none_is_empty_string() { - assert_eq!(render(&PrepareMarkup::None), ""); + assert_eq!(PrepareMarkup::None.render().as_str(), ""); } #[pagetop::test] async fn prepare_markup_render_escaped_escapes_html_and_ampersands() { - let pm = PrepareMarkup::Escaped(String::from("<b>& \" ' </b>")); - assert_eq!(render(&pm), "&lt;b&gt;&amp; &quot; ' &lt;/b&gt;"); + let pm = PrepareMarkup::Escaped("<b>& \" ' </b>".to_string()); + assert_eq!(pm.render().as_str(), "&lt;b&gt;&amp; &quot; ' &lt;/b&gt;"); } #[pagetop::test] async fn prepare_markup_render_raw_is_inserted_verbatim() { - let pm = PrepareMarkup::Raw(String::from("<b>bold</b><script>1<2</script>")); - assert_eq!(render(&pm), "<b>bold</b><script>1<2</script>"); + let pm = PrepareMarkup::Raw("<b>bold</b><script>1<2</script>".to_string()); + assert_eq!(pm.render().as_str(), "<b>bold</b><script>1<2</script>"); } #[pagetop::test] @@ -24,7 +24,7 @@ async fn prepare_markup_render_with_keeps_structure() { p { "This is a paragraph." } }); assert_eq!( - render(&pm), + pm.render().as_str(), "<h2>Sample title</h2><p>This is a paragraph.</p>" ); } @@ -33,7 +33,7 @@ async fn prepare_markup_render_with_keeps_structure() { async fn prepare_markup_does_not_double_escape_when_wrapped_in_html_macro() { // Escaped: dentro de `html!` no debe volver a escaparse. let escaped = PrepareMarkup::Escaped("<i>x</i>".into()); - let wrapped_escaped = html! { div { (escaped) } }; + let wrapped_escaped = html! { div { (escaped.render()) } }; assert_eq!( wrapped_escaped.into_string(), "<div>&lt;i&gt;x&lt;/i&gt;</div>" @@ -41,12 +41,12 @@ async fn prepare_markup_does_not_double_escape_when_wrapped_in_html_macro() { // Raw: tampoco debe escaparse al integrarlo. let raw = PrepareMarkup::Raw("<i>x</i>".into()); - let wrapped_raw = html! { div { (raw) } }; + let wrapped_raw = html! { div { (raw.render()) } }; assert_eq!(wrapped_raw.into_string(), "<div><i>x</i></div>"); // With: debe incrustar el Markup tal cual. let with = PrepareMarkup::With(html! { span.title { "ok" } }); - let wrapped_with = html! { div { (with) } }; + let wrapped_with = html! { div { (with.render()) } }; assert_eq!( wrapped_with.into_string(), "<div><span class=\"title\">ok</span></div>" @@ -57,11 +57,14 @@ async fn prepare_markup_does_not_double_escape_when_wrapped_in_html_macro() { async fn prepare_markup_unicode_is_preserved() { // Texto con acentos y emojis debe conservarse (salvo el escape HTML de signos). let esc = PrepareMarkup::Escaped("Hello, tomorrow coffee ☕ & donuts!".into()); - assert_eq!(render(&esc), "Hello, tomorrow coffee ☕ &amp; donuts!"); + assert_eq!( + esc.render().as_str(), + "Hello, tomorrow coffee ☕ &amp; donuts!" + ); // Raw debe pasar íntegro. let raw = PrepareMarkup::Raw("Title — section © 2025".into()); - assert_eq!(render(&raw), "Title — section © 2025"); + assert_eq!(raw.render().as_str(), "Title — section © 2025"); } #[pagetop::test] @@ -69,11 +72,11 @@ async fn prepare_markup_is_empty_semantics() { assert!(PrepareMarkup::None.is_empty()); assert!(PrepareMarkup::Escaped(String::new()).is_empty()); - assert!(PrepareMarkup::Escaped(String::from("")).is_empty()); - assert!(!PrepareMarkup::Escaped(String::from("x")).is_empty()); + assert!(PrepareMarkup::Escaped("".to_string()).is_empty()); + assert!(!PrepareMarkup::Escaped("x".to_string()).is_empty()); assert!(PrepareMarkup::Raw(String::new()).is_empty()); - assert!(PrepareMarkup::Raw(String::from("")).is_empty()); + assert!(PrepareMarkup::Raw("".to_string()).is_empty()); assert!(!PrepareMarkup::Raw("a".into()).is_empty()); assert!(PrepareMarkup::With(html! {}).is_empty()); @@ -94,17 +97,12 @@ async fn prepare_markup_equivalence_between_render_and_inline_in_html_macro() { ]; for pm in cases { - let rendered = render(&pm); - let in_macro = html! { (pm) }.into_string(); + let rendered = pm.render(); + let in_macro = html! { (rendered) }.into_string(); assert_eq!( - rendered, in_macro, + rendered.as_str(), + in_macro, "The output of Render and (pm) inside html! must match" ); } } - -// HELPERS ***************************************************************************************** - -fn render(x: &impl Render) -> String { - x.render().into_string() -} From cc03a0ea324ae43e31bc486234db5881c904241b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 12 Sep 2025 01:13:17 +0200 Subject: [PATCH 782/853] =?UTF-8?q?=E2=9C=A8=20(util):=20A=C3=B1ade=20`ind?= =?UTF-8?q?oc`=20para=20indentar=20c=C3=B3digo=20bien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 7 +++ Cargo.toml | 1 + src/lib.rs | 2 +- src/util.rs | 128 +++++++++++++++++++++++++++------------------------- 4 files changed, 75 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 944027d8..3053e20c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1307,6 +1307,12 @@ dependencies = [ "hashbrown 0.15.4", ] +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + [[package]] name = "inout" version = "0.1.4" @@ -1568,6 +1574,7 @@ dependencies = [ "config", "figlet-rs", "fluent-templates", + "indoc", "itoa", "pagetop-build", "pagetop-macros", diff --git a/Cargo.toml b/Cargo.toml index 8ccd69ec..ab7551f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ colored = "3.0.0" concat-string = "1.0.1" config = { version = "0.15.13", default-features = false, features = ["toml"] } figlet-rs = "0.1.5" +indoc = "2.0.6" itoa = "1.0.15" parking_lot = "0.12.4" paste = { package = "pastey", version = "0.1.0" } diff --git a/src/lib.rs b/src/lib.rs index 93b8564b..1c1ba2c1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -138,7 +138,7 @@ pub type Weight = i8; // API ********************************************************************************************* -// Funciones y macros útiles. +// Macros y funciones útiles. pub mod util; // Carga las opciones de configuración. pub mod config; diff --git a/src/util.rs b/src/util.rs index 56b098d8..cb101763 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,4 +1,4 @@ -//! Funciones y macros útiles. +//! Macros y funciones útiles. use crate::trace; @@ -6,67 +6,7 @@ use std::env; use std::io; use std::path::{Path, PathBuf}; -// FUNCIONES ÚTILES ******************************************************************************** - -/// Resuelve y valida la ruta de un directorio existente, devolviendo una ruta absoluta. -/// -/// - Si la ruta es relativa, se resuelve respecto al directorio del proyecto según la variable de -/// entorno `CARGO_MANIFEST_DIR` (si existe) o, en su defecto, respecto al directorio actual de -/// trabajo. -/// - Normaliza y valida la ruta final (resuelve `.`/`..` y enlaces simbólicos). -/// - Devuelve error si la ruta no existe o no es un directorio. -/// -/// # Ejemplos -/// -/// ```rust,no_run -/// use pagetop::prelude::*; -/// -/// // Ruta relativa, se resuelve respecto a CARGO_MANIFEST_DIR o al directorio actual (`cwd`). -/// println!("{:#?}", util::resolve_absolute_dir("documents")); -/// -/// // Ruta absoluta, se normaliza y valida tal cual. -/// println!("{:#?}", util::resolve_absolute_dir("/var/www")); -/// ``` -pub fn resolve_absolute_dir<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> { - let path = path.as_ref(); - - let candidate = if path.is_absolute() { - path.to_path_buf() - } else { - // Directorio base CARGO_MANIFEST_DIR si está disponible; o current_dir() en su defecto. - env::var_os("CARGO_MANIFEST_DIR") - .map(PathBuf::from) - .or_else(|| env::current_dir().ok()) - .unwrap_or_else(|| PathBuf::from(".")) - .join(path) - }; - - // Resuelve `.`/`..`, enlaces simbólicos y obtiene la ruta absoluta en un único paso. - let absolute_dir = candidate.canonicalize()?; - - // Asegura que realmente es un directorio existente. - if absolute_dir.is_dir() { - Ok(absolute_dir) - } else { - Err({ - let msg = format!("Path \"{}\" is not a directory", absolute_dir.display()); - trace::warn!(msg); - io::Error::new(io::ErrorKind::InvalidInput, msg) - }) - } -} - -/// **Obsoleto desde la versión 0.3.0**: usar [`resolve_absolute_dir()`] en su lugar. -#[deprecated(since = "0.3.0", note = "Use `resolve_absolute_dir()` instead")] -pub fn absolute_dir<P, Q>(root_path: P, relative_path: Q) -> io::Result<PathBuf> -where - P: AsRef<Path>, - Q: AsRef<Path>, -{ - resolve_absolute_dir(root_path.as_ref().join(relative_path.as_ref())) -} - -// MACROS ÚTILES *********************************************************************************** +// MACROS INTEGRADAS ******************************************************************************* #[doc(hidden)] pub use paste::paste; @@ -74,6 +14,10 @@ pub use paste::paste; #[doc(hidden)] pub use concat_string::concat_string; +pub use indoc::{concatdoc, formatdoc, indoc}; + +// MACROS ÚTILES *********************************************************************************** + #[macro_export] /// Macro para construir una colección de pares clave-valor. /// @@ -253,3 +197,63 @@ macro_rules! join_strict { } }}; } + +// FUNCIONES ÚTILES ******************************************************************************** + +/// Resuelve y valida la ruta de un directorio existente, devolviendo una ruta absoluta. +/// +/// - Si la ruta es relativa, se resuelve respecto al directorio del proyecto según la variable de +/// entorno `CARGO_MANIFEST_DIR` (si existe) o, en su defecto, respecto al directorio actual de +/// trabajo. +/// - Normaliza y valida la ruta final (resuelve `.`/`..` y enlaces simbólicos). +/// - Devuelve error si la ruta no existe o no es un directorio. +/// +/// # Ejemplos +/// +/// ```rust,no_run +/// use pagetop::prelude::*; +/// +/// // Ruta relativa, se resuelve respecto a CARGO_MANIFEST_DIR o al directorio actual (`cwd`). +/// println!("{:#?}", util::resolve_absolute_dir("documents")); +/// +/// // Ruta absoluta, se normaliza y valida tal cual. +/// println!("{:#?}", util::resolve_absolute_dir("/var/www")); +/// ``` +pub fn resolve_absolute_dir<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> { + let path = path.as_ref(); + + let candidate = if path.is_absolute() { + path.to_path_buf() + } else { + // Directorio base CARGO_MANIFEST_DIR si está disponible; o current_dir() en su defecto. + env::var_os("CARGO_MANIFEST_DIR") + .map(PathBuf::from) + .or_else(|| env::current_dir().ok()) + .unwrap_or_else(|| PathBuf::from(".")) + .join(path) + }; + + // Resuelve `.`/`..`, enlaces simbólicos y obtiene la ruta absoluta en un único paso. + let absolute_dir = candidate.canonicalize()?; + + // Asegura que realmente es un directorio existente. + if absolute_dir.is_dir() { + Ok(absolute_dir) + } else { + Err({ + let msg = format!("Path \"{}\" is not a directory", absolute_dir.display()); + trace::warn!(msg); + io::Error::new(io::ErrorKind::InvalidInput, msg) + }) + } +} + +/// **Obsoleto desde la versión 0.3.0**: usar [`resolve_absolute_dir()`] en su lugar. +#[deprecated(since = "0.3.0", note = "Use `resolve_absolute_dir()` instead")] +pub fn absolute_dir<P, Q>(root_path: P, relative_path: Q) -> io::Result<PathBuf> +where + P: AsRef<Path>, + Q: AsRef<Path>, +{ + resolve_absolute_dir(root_path.as_ref().join(relative_path.as_ref())) +} From c6e323b21dae5f48bcb9a47b426571592dc1b7cb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 18 Sep 2025 14:06:33 +0200 Subject: [PATCH 783/853] =?UTF-8?q?=F0=9F=9A=A8=20Ajustes=20menores=20suge?= =?UTF-8?q?ridos=20por=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 2 +- src/html/context.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 28c6b1b4..5af5f9c9 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -269,8 +269,8 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { // Extrae atributos descartando la documentación para incluir en `alter_...()`. let non_doc_attrs: Vec<_> = attrs .iter() + .filter(|&a| !a.path().is_ident("doc")) .cloned() - .filter(|a| !a.path().is_ident("doc")) .collect(); // Documentación del método alter_...(). diff --git a/src/html/context.rs b/src/html/context.rs index 2f3e0f07..7b782681 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -314,7 +314,7 @@ impl Context { .ok_or_else(|| ErrorParam::TypeMismatch { key, expected: TypeInfo::FullName.of::<T>(), - saved: *type_name, + saved: type_name, }) } From 25a71bf526f7a52e1f903c31ab5615c457946385 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 18 Sep 2025 14:17:01 +0200 Subject: [PATCH 784/853] =?UTF-8?q?=F0=9F=8E=A8=20Mejora=20la=20p=C3=A1gin?= =?UTF-8?q?a=20de=20bienvenida=20y=20el=20tema=20b=C3=A1sico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convierte la estructura de la página de bienvenida en una composición del tema básico para ser usada en otros contextos. Por ejemplo, para la página de mantenimiento, o la página de inicio de la guía de uso de PageTop. --- src/base/extension/welcome.rs | 52 +++++++++++++++++++++++++++-------- src/base/theme/basic.rs | 4 +-- src/locale/en-US/base.ftl | 4 +++ src/locale/en-US/welcome.ftl | 29 +++++++++---------- src/locale/es-ES/base.ftl | 6 +++- src/locale/es-ES/welcome.ftl | 25 +++++++++-------- 6 files changed, 79 insertions(+), 41 deletions(-) diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index eaa9f339..e2a77128 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -30,22 +30,50 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { .with_title(L10n::l("welcome_title")) .with_description(L10n::l("welcome_intro").with_arg("app", app)) .with_param("intro_button_text", L10n::l("welcome_powered")) - .with_param("intro_button_link", "https://pagetop.cillero.es".to_owned()) - .add_component(Html::with(|cx| { - html! { - p { (L10n::l("welcome_text1").using(cx)) } - p { (L10n::l("welcome_text2").using(cx)) } + .with_param("intro_button_link", "https://pagetop.cillero.es".to_string()) + .with_assets(AssetsOp::AddJavaScript(JavaScript::on_load_async("welcome-js", |cx| + util::indoc!(r#" + try { + const resp = await fetch("https://crates.io/api/v1/crates/pagetop"); + const data = await resp.json(); + const date = new Date(data.versions[0].created_at); + const formatted = date.toLocaleDateString("LANGID", { year: "numeric", month: "2-digit", day: "2-digit" }); + document.getElementById("welcome-release").src = `https://img.shields.io/badge/Release%20date-${encodeURIComponent(formatted)}-blue?label=LABEL&style=for-the-badge`; + document.getElementById("welcome-badges").style.display = "block"; + } catch (e) { + console.error("Failed to fetch release date from crates.io:", e); } + "#) + .replace("LANGID", cx.langid().to_string().as_str()) + .replace("LABEL", L10n::l("welcome_release_label").using(cx).as_str()) + .to_string(), + ))) + .add_component(Html::with(|cx| html! { + p { (L10n::l("welcome_text1").using(cx)) } + div id="welcome-badges" style="display: none; margin-bottom: 1.1rem;" { + img + src="https://img.shields.io/crates/v/pagetop.svg?label=PageTop&style=for-the-badge" + alt=[L10n::l("welcome_pagetop_label").lookup(cx)] {} (" ") + img + id="welcome-release" + alt=[L10n::l("welcome_release_label").lookup(cx)] {} (" ") + img + src=(format!( + "https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label={}&style=for-the-badge", + L10n::l("welcome_license_label").lookup(cx).unwrap_or_default() + )) + alt=[L10n::l("welcome_license_label").lookup(cx)] {} + } + p { (L10n::l("welcome_text2").using(cx)) } })) .add_component( Block::new() - .with_title(L10n::l("welcome_about")) - .add_component(Html::with(move |cx| { - html! { - p { (L10n::l("welcome_pagetop").using(cx)) } - p { (L10n::l("welcome_issues1").using(cx)) } - p { (L10n::l("welcome_issues2").with_arg("app", app).using(cx)) } - } + .with_title(L10n::l("welcome_notice_title")) + .add_component(Html::with(move |cx| html! { + p { (L10n::l("welcome_notice_1").using(cx)) } + p { (L10n::l("welcome_notice_2").using(cx)) } + p { (L10n::l("welcome_notice_3").using(cx)) } + p { (L10n::l("welcome_notice_4").with_arg("app", app).using(cx)) } })), ) .render() diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index fbf4caf5..e6525489 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -111,8 +111,8 @@ fn render_intro(page: &mut Page) -> Markup { div class="intro-footer__links" { a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } - a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("welcome_code").using(page)) } - em { (L10n::l("welcome_have_fun").using(page)) } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("intro_code").using(page)) } + em { (L10n::l("intro_have_fun").using(page)) } } } } diff --git a/src/locale/en-US/base.ftl b/src/locale/en-US/base.ftl index b2c92564..7a9701de 100644 --- a/src/locale/en-US/base.ftl +++ b/src/locale/en-US/base.ftl @@ -1,2 +1,6 @@ +# Basic theme, intro layout. +intro_code = Code +intro_have_fun = Coding is creating + # PoweredBy component. poweredby_pagetop = Powered by { $pagetop_link } diff --git a/src/locale/en-US/welcome.ftl b/src/locale/en-US/welcome.ftl index 7b7d74d8..0a227f1d 100644 --- a/src/locale/en-US/welcome.ftl +++ b/src/locale/en-US/welcome.ftl @@ -1,20 +1,21 @@ -welcome_extension_name = Default homepage -welcome_extension_description = Displays a landing page when none is configured. +welcome_extension_name = Default Homepage +welcome_extension_description = Displays a default homepage when none is configured. -welcome_page = Welcome Page -welcome_title = Hello world! +welcome_page = Welcome page +welcome_title = Hello, world! welcome_intro = Discover⚡{ $app } -welcome_powered = A web solution powered by <strong>PageTop!</strong> +welcome_powered = A web solution powered by <strong>PageTop</strong> -welcome_text1 = If you can read this page, it means that the <strong>PageTop</strong> server is running correctly but has not yet been fully configured. This usually means the site is either experiencing temporary issues or is undergoing routine maintenance. -welcome_text2 = If the issue persists, please <strong>contact your system administrator</strong> for assistance. +welcome_pagetop_label = PageTop version on Crates.io +welcome_release_label = Release date +welcome_license_label = License -welcome_about = About -welcome_pagetop = <strong>PageTop</strong> is a <a href="https://www.rust-lang.org" target="_blank">Rust</a>-based web development framework for building modular, extensible, and configurable web solutions. +welcome_text1 = PageTop is <strong>a Rust-based web development framework</strong> designed to build modular, extensible, and configurable web solutions. +welcome_text2 = PageTop brings back the essence of the classic web, renders on the server (SSR) and uses <em>HTML-first</em> components, CSS and JavaScript, <strong>with the performance and security of Rust</strong>. -welcome_issues1 = To report issues related to the <strong>PageTop</strong> framework, please use <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank">SoloGit</a>. Before opening a new issue, check existing reports to avoid duplicates. -welcome_issues2 = For issues related specifically to <strong>{ $app }</strong>, please refer to its official repository or support channel, rather than directly to <strong>PageTop</strong>. - -welcome_code = Code -welcome_have_fun = Coding is creating +welcome_notice_title = Notice +welcome_notice_1 = If you can see this page, the <strong>PageTop</strong> server is running correctly, but the application is not fully configured. This may be due to routine maintenance or a temporary issue. +welcome_notice_2 = If the issue persists, please <strong>contact the system administrator</strong>. +welcome_notice_3 = To report issues with the <strong>PageTop</strong> framework, use <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Before opening a new issue, review the existing ones to avoid duplicates. +welcome_notice_4 = For issues specific to the application (<strong>{ $app }</strong>), please use its official repository or support channel. diff --git a/src/locale/es-ES/base.ftl b/src/locale/es-ES/base.ftl index 74eb62e8..99f6c7e8 100644 --- a/src/locale/es-ES/base.ftl +++ b/src/locale/es-ES/base.ftl @@ -1,2 +1,6 @@ +# Basic theme, intro layout. +intro_code = Código +intro_have_fun = Programar es crear + # PoweredBy component. -poweredby_pagetop = Funciona con { $pagetop_link } \ No newline at end of file +poweredby_pagetop = Funciona con { $pagetop_link } diff --git a/src/locale/es-ES/welcome.ftl b/src/locale/es-ES/welcome.ftl index 78238322..b98d9199 100644 --- a/src/locale/es-ES/welcome.ftl +++ b/src/locale/es-ES/welcome.ftl @@ -1,20 +1,21 @@ welcome_extension_name = Página de inicio predeterminada welcome_extension_description = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. -welcome_page = Página de Bienvenida -welcome_title = ¡Hola mundo! +welcome_page = Página de bienvenida +welcome_title = ¡Hola, mundo! welcome_intro = Descubre⚡{ $app } -welcome_powered = Una solución web creada con <strong>PageTop!</strong> +welcome_powered = Una solución web creada con <strong>PageTop</strong> -welcome_text1 = Si puedes leer esta página, significa que el servidor de <strong>PageTop</strong> funciona correctamente, pero aún no ha sido completamente configurado. Esto suele indicar que el sitio está experimentando problemas temporales o está pasando por un mantenimiento de rutina. -welcome_text2 = Si el problema persiste, por favor <strong>contacta con el administrador del sistema</strong> para recibir asistencia técnica. +welcome_pagetop_label = Versión de PageTop en Crates.io +welcome_release_label = Lanzamiento +welcome_license_label = Licencia -welcome_about = Acerca de -welcome_pagetop = <strong>PageTop</strong> es un entorno de desarrollo web basado en <a href="https://www.rust-lang.org/es" target="_blank">Rust</a>, diseñado para crear soluciones web modulares, extensibles y configurables. +welcome_text1 = PageTop es un <strong>entorno de desarrollo web basado en Rust</strong>, pensado para construir soluciones web modulares, extensibles y configurables. +welcome_text2 = PageTop reivindica la esencia de la web clásica, renderiza en el servidor (SSR) utilizando componentes <em>HTML-first</em>, CSS y JavaScript, <strong>con el rendimiento y la seguridad de Rust</strong>. -welcome_issues1 = Para comunicar cualquier problema con <strong>PageTop</strong>, utiliza <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank">SoloGit</a>. Antes de informar de una incidencia, revisa los informes ya existentes para evitar duplicados. -welcome_issues2 = Si se trata de fallos específicos de <strong>{ $app }</strong>, por favor acude a su repositorio oficial o canal de soporte, y no al de <strong>PageTop</strong> directamente. - -welcome_code = Código -welcome_have_fun = Programar es crear +welcome_notice_title = Aviso +welcome_notice_1 = Si puedes ver esta página, el servidor de <strong>PageTop</strong> está funcionando correctamente, pero la aplicación no está completamente configurada. Esto puede deberse a tareas de mantenimiento o a una incidencia temporal. +welcome_notice_2 = Si el problema persiste, por favor, <strong>contacta con el administrador del sistema</strong>. +welcome_notice_3 = Para comunicar incidencias del propio entorno <strong>PageTop</strong>, utiliza <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Antes de abrir una nueva incidencia, revisa las existentes para evitar duplicados. +welcome_notice_4 = Para fallos específicos de la aplicación (<strong>{ $app }</strong>), utiliza su repositorio oficial o su canal de soporte. From 2b2ce2c50164f53e90c76e292889dfd87188e9a4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 18 Sep 2025 23:38:25 +0200 Subject: [PATCH 785/853] =?UTF-8?q?=F0=9F=8E=A8=20Unifica=20par=C3=A1metro?= =?UTF-8?q?s=20y=20estilos=20del=20tema=20b=C3=A1sico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ofrece dos composiciones de página dirigidas a una introducción de contenidos neutra o con referencias a PageTop. --- src/base/extension/welcome.rs | 65 +++++++++------------------ src/base/theme/basic.rs | 85 +++++++++++++++++++++++++++++++---- src/core/theme/definition.rs | 10 ++--- src/locale/en-US/base.ftl | 7 +++ src/locale/en-US/welcome.ftl | 17 +++---- src/locale/es-ES/base.ftl | 7 +++ src/locale/es-ES/welcome.ftl | 17 +++---- static/css/intro.css | 6 +-- 8 files changed, 130 insertions(+), 84 deletions(-) diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index e2a77128..5c6fec5a 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -25,55 +25,30 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { let app = &global::SETTINGS.app.name; Page::new(request) - .with_theme("basic") - .with_layout("intro") + .with_theme("Basic") + .with_layout("PageTopIntro") .with_title(L10n::l("welcome_title")) .with_description(L10n::l("welcome_intro").with_arg("app", app)) - .with_param("intro_button_text", L10n::l("welcome_powered")) - .with_param("intro_button_link", "https://pagetop.cillero.es".to_string()) - .with_assets(AssetsOp::AddJavaScript(JavaScript::on_load_async("welcome-js", |cx| - util::indoc!(r#" - try { - const resp = await fetch("https://crates.io/api/v1/crates/pagetop"); - const data = await resp.json(); - const date = new Date(data.versions[0].created_at); - const formatted = date.toLocaleDateString("LANGID", { year: "numeric", month: "2-digit", day: "2-digit" }); - document.getElementById("welcome-release").src = `https://img.shields.io/badge/Release%20date-${encodeURIComponent(formatted)}-blue?label=LABEL&style=for-the-badge`; - document.getElementById("welcome-badges").style.display = "block"; - } catch (e) { - console.error("Failed to fetch release date from crates.io:", e); - } - "#) - .replace("LANGID", cx.langid().to_string().as_str()) - .replace("LABEL", L10n::l("welcome_release_label").using(cx).as_str()) - .to_string(), - ))) - .add_component(Html::with(|cx| html! { - p { (L10n::l("welcome_text1").using(cx)) } - div id="welcome-badges" style="display: none; margin-bottom: 1.1rem;" { - img - src="https://img.shields.io/crates/v/pagetop.svg?label=PageTop&style=for-the-badge" - alt=[L10n::l("welcome_pagetop_label").lookup(cx)] {} (" ") - img - id="welcome-release" - alt=[L10n::l("welcome_release_label").lookup(cx)] {} (" ") - img - src=(format!( - "https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label={}&style=for-the-badge", - L10n::l("welcome_license_label").lookup(cx).unwrap_or_default() - )) - alt=[L10n::l("welcome_license_label").lookup(cx)] {} - } - p { (L10n::l("welcome_text2").using(cx)) } - })) + .with_param("intro_button_txt", L10n::l("welcome_powered")) + .with_param("intro_button_lnk", "https://pagetop.cillero.es".to_string()) .add_component( Block::new() - .with_title(L10n::l("welcome_notice_title")) - .add_component(Html::with(move |cx| html! { - p { (L10n::l("welcome_notice_1").using(cx)) } - p { (L10n::l("welcome_notice_2").using(cx)) } - p { (L10n::l("welcome_notice_3").using(cx)) } - p { (L10n::l("welcome_notice_4").with_arg("app", app).using(cx)) } + .with_title(L10n::l("welcome_status_title")) + .add_component(Html::with(move |cx| { + html! { + p { (L10n::l("welcome_status_1").using(cx)) } + p { (L10n::l("welcome_status_2").using(cx)) } + } + })), + ) + .add_component( + Block::new() + .with_title(L10n::l("welcome_support_title")) + .add_component(Html::with(move |cx| { + html! { + p { (L10n::l("welcome_support_1").using(cx)) } + p { (L10n::l("welcome_support_2").with_arg("app", app).using(cx)) } + } })), ) .render() diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index e6525489..2f492748 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -1,8 +1,33 @@ -//! Es el tema básico que incluye PageTop por defecto. - +/// Es el tema básico que incluye PageTop por defecto. use crate::prelude::*; /// Tema básico por defecto. +/// +/// Ofrece las siguientes composiciones (*layouts*): +/// +/// - **Composición predeterminada** +/// - Renderizado genérico con +/// [`ThemePage::render_body()`](crate::core::theme::ThemePage::render_body) usando las regiones +/// predefinidas en [`page_regions()`](crate::core::theme::Theme::page_regions). +/// +/// - **`Intro`** +/// - Página de entrada con cabecera visual, título y descripción y un botón opcional de llamada a +/// la acción. Ideal para una página de inicio o bienvenida en el contexto de PageTop. +/// - **Regiones:** `content` (se renderiza dentro de `.intro-content__body`). +/// - **Parámetros:** +/// - `intro_button_txt` (`L10n`) – Texto del botón. +/// - `intro_button_lnk` (`Option<String>`) – URL del botón; si no se indica, el botón no se +/// muestra. +/// +/// - **`PageTopIntro`** +/// - Variante de `Intro` con textos predefinidos sobre PageTop al inicio del contenido. Añade una +/// banda de *badges* con la versión de [PageTop en crates.io](https://crates.io/crates/pagetop) +/// más la fecha de la última versión publicada y la licencia de uso. +/// - **Regiones:** `content` (igual que `Intro`). +/// - **Parámetros:** los mismos que `Intro`. +/// +/// **Nota:** si no se especifica `layout` o el valor no coincide con ninguno de los anteriores, se +/// aplica la composición predeterminada. pub struct Basic; impl Extension for Basic { @@ -14,14 +39,16 @@ impl Extension for Basic { impl Theme for Basic { fn render_page_body(&self, page: &mut Page) -> Markup { match page.layout() { - "intro" => render_intro(page), + "Intro" => render_intro(page), + "PageTopIntro" => render_pagetop_intro(page), _ => <Self as ThemePage>::render_body(self, page, self.page_regions()), } } fn after_render_page_body(&self, page: &mut Page) { let styles = match page.layout() { - "intro" => "/css/intro.css", + "Intro" => "/css/intro.css", + "PageTopIntro" => "/css/intro.css", _ => "/css/basic.css", }; page.alter_assets(AssetsOp::AddStyleSheet( @@ -41,8 +68,8 @@ fn render_intro(page: &mut Page) -> Markup { let title = page.title().unwrap_or_default(); let intro = page.description().unwrap_or_default(); - let intro_button_text: L10n = page.param_or_default("intro_button_text"); - let intro_button_link: Option<&String> = page.param("intro_button_link"); + let intro_button_txt: L10n = page.param_or_default("intro_button_txt"); + let intro_button_lnk: Option<&String> = page.param("intro_button_lnk"); html! { body id=[page.body_id().get()] class=[page.body_classes().get()] { @@ -74,17 +101,17 @@ fn render_intro(page: &mut Page) -> Markup { } main class="intro-content" { section class="intro-content__body" { - @if intro_button_link.is_some() { + @if intro_button_lnk.is_some() { div class="intro-button" { a class="intro-button__link" - href=[intro_button_link] + href=[intro_button_lnk] target="_blank" rel="noreferrer" { span {} span {} span {} div class="intro-button__text" { - (intro_button_text.using(page)) + (intro_button_txt.using(page)) } } } @@ -119,3 +146,43 @@ fn render_intro(page: &mut Page) -> Markup { } } } + +fn render_pagetop_intro(page: &mut Page) -> Markup { + page.alter_assets(AssetsOp::AddJavaScript(JavaScript::on_load_async("intro-js", |cx| + util::indoc!(r#" + try { + const resp = await fetch("https://crates.io/api/v1/crates/pagetop"); + const data = await resp.json(); + const date = new Date(data.versions[0].created_at); + const formatted = date.toLocaleDateString("LANGID", { year: "numeric", month: "2-digit", day: "2-digit" }); + document.getElementById("intro-release").src = `https://img.shields.io/badge/Release%20date-${encodeURIComponent(formatted)}-blue?label=LABEL&style=for-the-badge`; + document.getElementById("intro-badges").style.display = "block"; + } catch (e) { + console.error("Failed to fetch release date from crates.io:", e); + } + "#) + .replace("LANGID", cx.langid().to_string().as_str()) + .replace("LABEL", L10n::l("intro_release_label").using(cx).as_str()) + .to_string(), + ))) + .alter_child_in("content", ChildOp::Prepend(Child::with(Html::with(|cx| html! { + p { (L10n::l("intro_text1").using(cx)) } + div id="intro-badges" style="display: none; margin-bottom: 1.1rem;" { + img + src="https://img.shields.io/crates/v/pagetop.svg?label=PageTop&style=for-the-badge" + alt=[L10n::l("intro_pagetop_label").lookup(cx)] {} (" ") + img + id="intro-release" + alt=[L10n::l("intro_release_label").lookup(cx)] {} (" ") + img + src=(format!( + "https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label={}&style=for-the-badge", + L10n::l("intro_license_label").lookup(cx).unwrap_or_default() + )) + alt=[L10n::l("intro_license_label").lookup(cx)] {} + } + p { (L10n::l("intro_text2").using(cx)) } + })))); + + render_intro(page) +} diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index a4faf0b8..38a0bfc4 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -125,18 +125,18 @@ pub trait Theme: Extension + ThemePage + Send + Sync { /// Declaración ordenada de las regiones disponibles en la página. /// - /// Devuelve una **lista estática** de pares `(Region, L10n)` que se usará para renderizar en el - /// orden indicado todas las regiones que componen una página. + /// Devuelve una **lista estática** de pares `(Region, L10n)` que se usará para renderizar todas + /// las regiones que componen una página en el orden indicado . /// - /// Requisitos y recomendaciones: + /// Si un tema necesita un conjunto distinto de regiones, se puede **sobrescribir** este método + /// con los siguientes requisitos y recomendaciones: /// /// - Los identificadores deben ser **estables** (p. ej. `"sidebar-left"`, `"content"`). /// - La región `"content"` es **obligatoria**. Se puede usar [`Region::default()`] para /// declararla. /// - La etiqueta `L10n` se evalúa con el idioma activo de la página. /// - /// Si tu tema define un conjunto distinto, se puede **sobrescribir** este método. Por defecto - /// devuelve: + /// Por defecto devuelve: /// /// - `"header"`: cabecera. /// - `"content"`: contenido principal (**obligatoria**). diff --git a/src/locale/en-US/base.ftl b/src/locale/en-US/base.ftl index 7a9701de..16b1a3ef 100644 --- a/src/locale/en-US/base.ftl +++ b/src/locale/en-US/base.ftl @@ -1,4 +1,11 @@ # Basic theme, intro layout. +intro_pagetop_label = PageTop version on Crates.io +intro_release_label = Release date +intro_license_label = License + +intro_text1 = PageTop is <strong>an opinionated Rust web development framework</strong> designed to build modular, extensible, and configurable web solutions. +intro_text2 = PageTop brings back the essence of the classic web, renders on the server (SSR) and uses <em>HTML-first</em> components, CSS and JavaScript, <strong>with the performance and security of Rust</strong>. + intro_code = Code intro_have_fun = Coding is creating diff --git a/src/locale/en-US/welcome.ftl b/src/locale/en-US/welcome.ftl index 0a227f1d..20faf964 100644 --- a/src/locale/en-US/welcome.ftl +++ b/src/locale/en-US/welcome.ftl @@ -7,15 +7,10 @@ welcome_title = Hello, world! welcome_intro = Discover⚡{ $app } welcome_powered = A web solution powered by <strong>PageTop</strong> -welcome_pagetop_label = PageTop version on Crates.io -welcome_release_label = Release date -welcome_license_label = License +welcome_status_title = Status +welcome_status_1 = If you can see this page, it means the <strong>PageTop</strong> server is running correctly, but the application is not fully configured. This may be due to routine maintenance or a temporary issue. +welcome_status_2 = If the issue persists, please <strong>contact the system administrator</strong>. -welcome_text1 = PageTop is <strong>a Rust-based web development framework</strong> designed to build modular, extensible, and configurable web solutions. -welcome_text2 = PageTop brings back the essence of the classic web, renders on the server (SSR) and uses <em>HTML-first</em> components, CSS and JavaScript, <strong>with the performance and security of Rust</strong>. - -welcome_notice_title = Notice -welcome_notice_1 = If you can see this page, the <strong>PageTop</strong> server is running correctly, but the application is not fully configured. This may be due to routine maintenance or a temporary issue. -welcome_notice_2 = If the issue persists, please <strong>contact the system administrator</strong>. -welcome_notice_3 = To report issues with the <strong>PageTop</strong> framework, use <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Before opening a new issue, review the existing ones to avoid duplicates. -welcome_notice_4 = For issues specific to the application (<strong>{ $app }</strong>), please use its official repository or support channel. +welcome_support_title = Support +welcome_support_1 = To report issues with the <strong>PageTop</strong> framework, use <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Remember, before opening a new issue, review the existing ones to avoid duplicates. +welcome_support_2 = For issues specific to the application (<strong>{ $app }</strong>), please use its official repository or support channel. diff --git a/src/locale/es-ES/base.ftl b/src/locale/es-ES/base.ftl index 99f6c7e8..fee21a93 100644 --- a/src/locale/es-ES/base.ftl +++ b/src/locale/es-ES/base.ftl @@ -1,4 +1,11 @@ # Basic theme, intro layout. +intro_pagetop_label = Versión de PageTop en Crates.io +intro_release_label = Lanzamiento +intro_license_label = Licencia + +intro_text1 = PageTop es un <strong>entorno de desarrollo web basado en Rust</strong>, pensado para construir soluciones web modulares, extensibles y configurables. +intro_text2 = PageTop reivindica la esencia de la web clásica, renderiza en el servidor (SSR) utilizando componentes <em>HTML-first</em>, CSS y JavaScript, <strong>con el rendimiento y la seguridad de Rust</strong>. + intro_code = Código intro_have_fun = Programar es crear diff --git a/src/locale/es-ES/welcome.ftl b/src/locale/es-ES/welcome.ftl index b98d9199..13330dbf 100644 --- a/src/locale/es-ES/welcome.ftl +++ b/src/locale/es-ES/welcome.ftl @@ -7,15 +7,10 @@ welcome_title = ¡Hola, mundo! welcome_intro = Descubre⚡{ $app } welcome_powered = Una solución web creada con <strong>PageTop</strong> -welcome_pagetop_label = Versión de PageTop en Crates.io -welcome_release_label = Lanzamiento -welcome_license_label = Licencia +welcome_status_title = Estado +welcome_status_1 = Si puedes ver esta página, es porque el servidor de <strong>PageTop</strong> está funcionando correctamente, pero la aplicación no está completamente configurada. Esto puede deberse a tareas de mantenimiento o a una incidencia temporal. +welcome_status_2 = Si el problema persiste, por favor, <strong>contacta con el administrador del sistema</strong>. -welcome_text1 = PageTop es un <strong>entorno de desarrollo web basado en Rust</strong>, pensado para construir soluciones web modulares, extensibles y configurables. -welcome_text2 = PageTop reivindica la esencia de la web clásica, renderiza en el servidor (SSR) utilizando componentes <em>HTML-first</em>, CSS y JavaScript, <strong>con el rendimiento y la seguridad de Rust</strong>. - -welcome_notice_title = Aviso -welcome_notice_1 = Si puedes ver esta página, el servidor de <strong>PageTop</strong> está funcionando correctamente, pero la aplicación no está completamente configurada. Esto puede deberse a tareas de mantenimiento o a una incidencia temporal. -welcome_notice_2 = Si el problema persiste, por favor, <strong>contacta con el administrador del sistema</strong>. -welcome_notice_3 = Para comunicar incidencias del propio entorno <strong>PageTop</strong>, utiliza <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Antes de abrir una nueva incidencia, revisa las existentes para evitar duplicados. -welcome_notice_4 = Para fallos específicos de la aplicación (<strong>{ $app }</strong>), utiliza su repositorio oficial o su canal de soporte. +welcome_support_title = Soporte +welcome_support_1 = Para comunicar incidencias del propio entorno <strong>PageTop</strong>, utiliza <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Recuerda, antes de abrir una nueva incidencia, revisa las existentes para evitar duplicados. +welcome_support_2 = Para fallos específicos de la aplicación (<strong>{ $app }</strong>), utiliza su repositorio oficial o su canal de soporte. diff --git a/static/css/intro.css b/static/css/intro.css index 19fa9f15..39c9d6ad 100644 --- a/static/css/intro.css +++ b/static/css/intro.css @@ -7,9 +7,9 @@ --color: #1a202c; --color-gray: #e4e4e7; --color-link: #1e4eae; - --color-block-1: #fecaca; - --color-block-2: #e6a9e2; - --color-block-3: #b689ff; + --color-block-1: #b689ff; + --color-block-2: #fecaca; + --color-block-3: #e6a9e2; --color-block-4: #ffedca; --color-block-5: #ffffff; --focus-outline: 2px solid var(--color-link); From 6d5e1dfdb483470c9fff935c71afed3bd2c16418 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 13:08:47 +0200 Subject: [PATCH 786/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20(pagetop):=20Actua?= =?UTF-8?q?liza=20dependencias=20para=200.4.0=20(#7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.cillero.es/manuelcillero/pagetop/pulls/7 Co-authored-by: Manuel Cillero <manuel@cillero.es> Co-committed-by: Manuel Cillero <manuel@cillero.es> --- Cargo.lock | 179 +++++++++++++++++++---------- Cargo.toml | 40 +++---- helpers/pagetop-build/Cargo.toml | 2 +- helpers/pagetop-macros/Cargo.toml | 8 +- helpers/pagetop-statics/Cargo.toml | 4 +- 5 files changed, 146 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3053e20c..be745714 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -145,16 +145,16 @@ dependencies = [ [[package]] name = "actix-session" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efe6976a74f34f1b6d07a6c05aadc0ed0359304a7781c367fa5b4029418db08f" +checksum = "400c27fd4cdbe0082b7bbd29ac44a3070cbda1b2114138dc106ba39fe2f90dff" dependencies = [ "actix-service", "actix-utils", "actix-web", "anyhow", - "derive_more 1.0.0", - "rand 0.8.5", + "derive_more 2.0.1", + "rand 0.9.1", "serde", "serde_json", "tracing", @@ -334,9 +334,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -364,22 +364,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -406,7 +406,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -512,7 +512,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "159fa412eae48a1d94d0b9ecdb85c97ce56eb2a347c62394d3fdbf221adabc1a" dependencies = [ "path-matchers", - "path-slash", + "path-slash 0.1.5", ] [[package]] @@ -541,18 +541,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -729,34 +729,13 @@ dependencies = [ "syn", ] -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", + "derive_more-impl", ] [[package]] @@ -815,7 +794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1619,7 +1598,7 @@ dependencies = [ "derive_more 0.99.20", "futures-util", "mime_guess", - "path-slash", + "path-slash 0.2.1", ] [[package]] @@ -1642,7 +1621,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1666,6 +1645,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498a099351efa4becc6a19c72aa9270598e8fd274ca47052e37455241c88b696" +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + [[package]] name = "pathdiff" version = "0.2.3" @@ -1802,9 +1787,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -2207,9 +2192,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -2229,15 +2214,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.20.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -2798,7 +2783,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2807,7 +2792,16 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", ] [[package]] @@ -2816,14 +2810,31 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -2832,48 +2843,96 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.7.11" diff --git a/Cargo.toml b/Cargo.toml index ab7551f6..54f16c34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,29 +15,29 @@ license.workspace = true authors.workspace = true [dependencies] -chrono = "0.4.41" -colored = "3.0.0" -concat-string = "1.0.1" -config = { version = "0.15.13", default-features = false, features = ["toml"] } -figlet-rs = "0.1.5" -indoc = "2.0.6" -itoa = "1.0.15" -parking_lot = "0.12.4" -paste = { package = "pastey", version = "0.1.0" } -substring = "1.4.5" -terminal_size = "0.4.2" +chrono = "0.4" +colored = "3.0" +concat-string = "1.0" +config = { version = "0.15", default-features = false, features = ["toml"] } +figlet-rs = "0.1" +indoc = "2.0" +itoa = "1.0" +parking_lot = "0.12" +paste = { package = "pastey", version = "0.1" } +substring = "1.4" +terminal_size = "0.4" -tracing = "0.1.41" -tracing-appender = "0.2.3" -tracing-subscriber = { version = "0.3.19", features = ["json", "env-filter"] } -tracing-actix-web = "0.7.19" +tracing = "0.1" +tracing-appender = "0.2" +tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] } +tracing-actix-web = "0.7" -fluent-templates = "0.13.0" -unic-langid = { version = "0.9.6", features = ["macros"] } +fluent-templates = "0.13" +unic-langid = { version = "0.9", features = ["macros"] } actix-web = { workspace = true, default-features = true } -actix-session = { version = "0.10.1", features = ["cookie-session"] } -actix-web-files = { package = "actix-files", version = "0.6.6" } +actix-session = { version = "0.11", features = ["cookie-session"] } +actix-web-files = { package = "actix-files", version = "0.6" } serde = { version = "1.0", features = ["derive"] } @@ -49,7 +49,7 @@ default = [] testing = [] [dev-dependencies] -tempfile = "3.20.0" +tempfile = "3.22" [build-dependencies] pagetop-build.workspace = true diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index e0f5ef76..25fb6187 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -16,5 +16,5 @@ license.workspace = true authors.workspace = true [dependencies] -grass = "0.13.4" +grass = "0.13" pagetop-statics.workspace = true diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index d5ceb1b6..5c508dc8 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -18,7 +18,7 @@ authors.workspace = true proc-macro = true [dependencies] -proc-macro2 = "1.0.95" -proc-macro2-diagnostics = { version = "0.10.1", default-features = false } -quote = "1.0.40" -syn = { version = "2.0.104", features = ["full", "extra-traits"] } +proc-macro2 = "1.0" +proc-macro2-diagnostics = { version = "0.10", default-features = false } +quote = "1.0" +syn = { version = "2.0", features = ["full", "extra-traits"] } diff --git a/helpers/pagetop-statics/Cargo.toml b/helpers/pagetop-statics/Cargo.toml index 2afe3739..1f6deede 100644 --- a/helpers/pagetop-statics/Cargo.toml +++ b/helpers/pagetop-statics/Cargo.toml @@ -21,7 +21,7 @@ sort = [] [dependencies] change-detection = { version = "1.2", optional = true } mime_guess = "2.0" -path-slash = "0.1" +path-slash = "0.2" actix-web.workspace = true derive_more = "0.99.17" @@ -30,4 +30,4 @@ futures-util = { version = "0.3", default-features = false, features = ["std"] } [build-dependencies] change-detection = { version = "1.2", optional = true } mime_guess = "2.0" -path-slash = "0.1" +path-slash = "0.2" From b808c00eb1a7fd35ee34cb5bd75139fa0ab46c83 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 13:14:52 +0200 Subject: [PATCH 787/853] =?UTF-8?q?=F0=9F=A9=B9=20Corrige=20dependencia=20?= =?UTF-8?q?no=20actualizada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 54f16c34..750aaaa8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,7 +70,7 @@ license = "MIT OR Apache-2.0" authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] -actix-web = { version = "4.11.0", default-features = false } +actix-web = { version = "4.11", default-features = false } pagetop-build = { version = "0.3", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.1", path = "helpers/pagetop-macros" } From adec5c2636f2ac0443bb061a8fecc2199516edf5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 13:19:14 +0200 Subject: [PATCH 788/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-statics=200.1.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-statics/CHANGELOG.md | 12 +++++++++++- helpers/pagetop-statics/Cargo.toml | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be745714..c5db7142 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1591,7 +1591,7 @@ dependencies = [ [[package]] name = "pagetop-statics" -version = "0.1.1" +version = "0.1.2" dependencies = [ "actix-web", "change-detection", diff --git a/helpers/pagetop-statics/CHANGELOG.md b/helpers/pagetop-statics/CHANGELOG.md index 811a77f4..0d6f5b1b 100644 --- a/helpers/pagetop-statics/CHANGELOG.md +++ b/helpers/pagetop-statics/CHANGELOG.md @@ -8,11 +8,21 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.1.2 (2025-09-20) + +### Dependencias + +- Actualiza dependencias para 0.4.0 + +### Documentado + +- Normaliza referencias al nombre PageTop + ## 0.1.1 (2025-08-16) ### Documentado -- Cambia el formato para la documentación (#4) +- Cambia el formato para la documentación ## 0.1.0 (2025-08-09) diff --git a/helpers/pagetop-statics/Cargo.toml b/helpers/pagetop-statics/Cargo.toml index 1f6deede..0172a190 100644 --- a/helpers/pagetop-statics/Cargo.toml +++ b/helpers/pagetop-statics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-statics" -version = "0.1.1" +version = "0.1.2" edition = "2021" description = """ From ccafedaa0e4b3ba36bdededdd3493199318bef1f Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 13:22:23 +0200 Subject: [PATCH 789/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-build=200.3.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- helpers/pagetop-build/CHANGELOG.md | 18 ++++++++++++++---- helpers/pagetop-build/Cargo.toml | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c5db7142..bbe745b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1573,7 +1573,7 @@ dependencies = [ [[package]] name = "pagetop-build" -version = "0.3.0" +version = "0.3.1" dependencies = [ "grass", "pagetop-statics", diff --git a/helpers/pagetop-build/CHANGELOG.md b/helpers/pagetop-build/CHANGELOG.md index 3e3801e8..5bd9caf3 100644 --- a/helpers/pagetop-build/CHANGELOG.md +++ b/helpers/pagetop-build/CHANGELOG.md @@ -8,22 +8,32 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.3.1 (2025-09-20) + +### Dependencias + +- Actualiza dependencias para 0.4.0 + +### Documentado + +- Normaliza referencias al nombre PageTop + ## 0.3.0 (2025-08-16) ### Cambiado -- Mejora función `from_dir` por compatibilidad (#3) -- Mejora la integración de archivos estáticos +- Mejora función `from_dir` por compatibilidad +- Mejora la integración de archivos estáticos ### Documentado -- Cambia el formato para la documentación (#4) +- Cambia el formato para la documentación ## 0.2.0 (2025-08-09) ### Añadido -- Añade librería propia para gestionar recursos estáticos (#1) +- Añade librería propia para gestionar recursos estáticos ### Otros cambios diff --git a/helpers/pagetop-build/Cargo.toml b/helpers/pagetop-build/Cargo.toml index 25fb6187..cea1de3e 100644 --- a/helpers/pagetop-build/Cargo.toml +++ b/helpers/pagetop-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-build" -version = "0.3.0" +version = "0.3.1" edition = "2021" description = """ From e4a9a72fa791acbba2fcfac8b860152dba82213d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 13:25:59 +0200 Subject: [PATCH 790/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop-macros=200.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- helpers/pagetop-macros/CHANGELOG.md | 19 +++++++++++++++++++ helpers/pagetop-macros/Cargo.toml | 2 +- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bbe745b5..d125b63f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1581,7 +1581,7 @@ dependencies = [ [[package]] name = "pagetop-macros" -version = "0.1.1" +version = "0.2.0" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", diff --git a/Cargo.toml b/Cargo.toml index 750aaaa8..0fd702e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,5 +73,5 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] actix-web = { version = "4.11", default-features = false } pagetop-build = { version = "0.3", path = "helpers/pagetop-build" } -pagetop-macros = { version = "0.1", path = "helpers/pagetop-macros" } +pagetop-macros = { version = "0.2", path = "helpers/pagetop-macros" } pagetop-statics = { version = "0.1", path = "helpers/pagetop-statics" } diff --git a/helpers/pagetop-macros/CHANGELOG.md b/helpers/pagetop-macros/CHANGELOG.md index b61471a1..66a5f8d4 100644 --- a/helpers/pagetop-macros/CHANGELOG.md +++ b/helpers/pagetop-macros/CHANGELOG.md @@ -8,6 +8,25 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.2.0 (2025-09-20) + +### Cambiado + +- Retoques en el código +- Majora la validación de `builder_fn` + +### Dependencias + +- Actualiza dependencias para 0.4.0 + +### Documentado + +- Normaliza referencias al nombre PageTop + +### Otros cambios + +- 🚨 Ajustes menores sugeridos por clippy + ## 0.1.1 (2025-08-16) ### Documentado diff --git a/helpers/pagetop-macros/Cargo.toml b/helpers/pagetop-macros/Cargo.toml index 5c508dc8..601c551d 100644 --- a/helpers/pagetop-macros/Cargo.toml +++ b/helpers/pagetop-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop-macros" -version = "0.1.1" +version = "0.2.0" edition = "2021" description = """ From 6fac597a163706a6a5d4645b339d854eaf7e8c16 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 13:43:36 +0200 Subject: [PATCH 791/853] =?UTF-8?q?=F0=9F=94=A8=20(tools):=20Fuerza=20puls?= =?UTF-8?q?ar=20intro=20para=20confirmar=20input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/changelog.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/changelog.sh b/tools/changelog.sh index 2668ec67..211e896a 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -88,12 +88,12 @@ git-cliff --unreleased "${COMMON_ARGS[@]}" echo "CHANGELOG generated at '$CHANGELOG_FILE'" # Pregunta por la revisión del archivo de cambios generado -read -p "Do you want to review the changelog before continuing? (y/n) " -n 1 -r || exit 1 +read -p "Do you want to review the changelog before continuing? (y/n) " -r || exit 1 echo if [[ "$REPLY" =~ ^[Yy]$ ]]; then ${EDITOR:-nano} "$CHANGELOG_FILE" fi -read -p "Do you want to proceed with the release of $CRATE? (y/n) " -n 1 -r || exit 1 +read -p "Do you want to proceed with the release of $CRATE? (y/n) " -r || exit 1 echo if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then echo "Aborting release process." >&2 From 9536003badba7e3b59b79390e22cc25c2da0ba5d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 14:00:09 +0200 Subject: [PATCH 792/853] =?UTF-8?q?=F0=9F=94=96=20Prepara=20publicaci?= =?UTF-8?q?=C3=B3n=20de=20pagetop=200.4.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++--- Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e187143..f2926a69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,53 @@ Resume la evolución del proyecto para usuarios y colaboradores, destacando nuev correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o internos pueden omitirse si no afectan al uso del proyecto. +## 0.4.0 (2025-09-20) + +### Añadido + +- [app] Añade manejo de rutas no encontradas +- [context] Añade métodos auxiliares de parámetros +- [util] Añade `indoc` para indentar código bien +- Añade componente `PoweredBy` para copyright + +### Cambiado + +- [html] Cambia tipos `Option...` por `Attr...` +- [html] Implementa `Default` en `Context` +- [welcome] Crea página de bienvenida desde intro +- [context] Generaliza los parámetros de contexto +- [context] Define un `trait` común de contexto +- Modifica tipos para atributos HTML a minúsculas +- Renombra `with_component` por `add_component` + +### Corregido + +- [welcome] Corrige giro botón con ancho estrecho +- [welcome] Corrige centrado del pie de página +- Corrige nombre de función en prueba de `Html` +- Corrige doc y código por cambios en Page + +### Dependencias + +- Actualiza dependencias para 0.4.0 + +### Documentado + +- [component] Amplía documentación de preparación +- Normaliza referencias al nombre PageTop +- Simplifica documentación de obsoletos +- Mejora la documentación de recursos y contexto + +### Otros cambios + +- 🎨 [theme] Mejora gestión de regiones en páginas +- ✅ [tests] Amplía pruebas para `PrepareMarkup' +- 🎨 [locale] Mejora el uso de `lookup` / `using` +- 🔨 [tools] Fuerza pulsar intro para confirmar input +- 💄 Aplica BEM a estilos de bienvenida y componente +- 🎨 Unifica conversiones a String con `to_string()` +- 🔥 Elimina `Render` para usar siempre el contexto + ## 0.3.0 (2025-08-16) ### Cambiado @@ -17,14 +64,14 @@ internos pueden omitirse si no afectan al uso del proyecto. ### Documentado -- Cambia el formato para la documentación (#4) +- Cambia el formato para la documentación ## 0.2.0 (2025-08-09) ### Añadido -- Añade librería para gestionar recursos estáticos (#1) -- Añade soporte a changelog de `pagetop-statics` (#2) +- Añade librería para gestionar recursos estáticos +- Añade soporte a changelog de `pagetop-statics` ### Documentado diff --git a/Cargo.lock b/Cargo.lock index d125b63f..01140831 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1542,7 +1542,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pagetop" -version = "0.3.0" +version = "0.4.0" dependencies = [ "actix-files", "actix-session", diff --git a/Cargo.toml b/Cargo.toml index 0fd702e6..913f3d7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pagetop" -version = "0.3.0" +version = "0.4.0" edition = "2021" description = """ From 95777379a9d0b45d8f3f0e1e66b60d2f5b84adcb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 17:55:44 +0200 Subject: [PATCH 793/853] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20=20Actualiza=20dep?= =?UTF-8?q?endencias=20mirando?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 553 +++++++++++++++++++++++++++-------------------------- 1 file changed, 286 insertions(+), 267 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01140831..e0d497c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "actix-files" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0773d59061dedb49a8aed04c67291b9d8cf2fe0b60130a381aab53c6dd86e9be" +checksum = "6c0d87f10d70e2948ad40e8edea79c8e77c6c66e0250a4c1f09b690465199576" dependencies = [ "actix-http", "actix-service", @@ -31,7 +31,7 @@ dependencies = [ "actix-web", "bitflags", "bytes", - "derive_more 0.99.20", + "derive_more 2.0.1", "futures-core", "http-range", "log", @@ -44,9 +44,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.11.0" +version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +checksum = "44cceded2fb55f3c4b67068fa64962e2ca59614edc5b03167de9ff82ae803da0" dependencies = [ "actix-codec", "actix-rt", @@ -72,7 +72,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.1", + "rand 0.9.2", "sha1", "smallvec", "tokio", @@ -108,9 +108,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" dependencies = [ "futures-core", "tokio", @@ -128,7 +128,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2", + "socket2 0.5.10", "tokio", "tracing", ] @@ -154,7 +154,7 @@ dependencies = [ "actix-web", "anyhow", "derive_more 2.0.1", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_json", "tracing", @@ -207,7 +207,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2", + "socket2 0.5.10", "time", "tracing", "url", @@ -317,12 +317,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -384,9 +378,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "autocfg" @@ -423,9 +417,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "block-buffer" @@ -438,9 +432,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.1" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -481,19 +475,20 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bytestring" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" dependencies = [ "bytes", ] [[package]] name = "cc" -version = "1.2.27" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -501,9 +496,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "change-detection" @@ -517,16 +512,15 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -595,12 +589,12 @@ checksum = "7439becb5fafc780b6f4de382b1a7a3e70234afe783854a4702ee8adbb838609" [[package]] name = "config" -version = "0.15.13" +version = "0.15.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1eb4fb07bc7f012422df02766c7bd5971effb894f573865642f06fa3265440" +checksum = "cef036f0ecf99baef11555578630e2cca559909b4c50822dbba828c252d21c49" dependencies = [ "pathdiff", - "serde", + "serde_core", "toml", "winnow", ] @@ -709,9 +703,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", ] @@ -789,12 +783,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -809,6 +803,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4742a071cd9694fc86f9fa1a08fa3e53d40cc899d7ee532295da2d085639fbc5" +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + [[package]] name = "flate2" version = "1.1.2" @@ -821,16 +821,16 @@ dependencies = [ [[package]] name = "fluent-bundle" -version = "0.15.3" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493" +checksum = "01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4" dependencies = [ "fluent-langneg", "fluent-syntax", "intl-memoizer", "intl_pluralrules", - "rustc-hash 1.1.0", - "self_cell 0.10.3", + "rustc-hash", + "self_cell", "smallvec", "unic-langid", ] @@ -846,18 +846,19 @@ dependencies = [ [[package]] name = "fluent-syntax" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33d" +checksum = "54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198" dependencies = [ - "thiserror", + "memchr", + "thiserror 2.0.16", ] [[package]] name = "fluent-template-macros" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ed02449601d0dacdc05cb5e13db5dab8f2b98d773aff5c53b62fad43a1b19a1" +checksum = "e6222b8a208b9f0e7b984da3616651b0cc74e4461571b118cb1c713e0f7617ee" dependencies = [ "flume", "ignore", @@ -869,9 +870,9 @@ dependencies = [ [[package]] name = "fluent-templates" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69855a5fe87629495efca79aec72adfa97954f1006f928e3a2ec750cb3e85386" +checksum = "f8a893d77c0e48dc3f78421e9cba5d82e02bcb85d4520c506cec2fbebd0f513b" dependencies = [ "fluent-bundle", "fluent-langneg", @@ -881,7 +882,7 @@ dependencies = [ "ignore", "intl-memoizer", "log", - "thiserror", + "thiserror 1.0.69", "unic-langid", ] @@ -908,9 +909,9 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -978,7 +979,7 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", ] [[package]] @@ -999,9 +1000,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" @@ -1012,8 +1013,8 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1072,9 +1073,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "hkdf" @@ -1125,9 +1126,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1235,9 +1236,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1264,7 +1265,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.9", + "regex-automata", "same-file", "walkdir", "winapi-util", @@ -1278,12 +1279,12 @@ checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.0", ] [[package]] @@ -1320,6 +1321,17 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -1334,9 +1346,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -1344,9 +1356,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ "once_cell", "wasm-bindgen", @@ -1375,15 +1387,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -1420,17 +1432,17 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -1484,12 +1496,11 @@ checksum = "e94e1e6445d314f972ff7395df2de295fe51b71821694f0b0e1e79c4f12c8577" [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -1534,12 +1545,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "pagetop" version = "0.4.0" @@ -1626,9 +1631,9 @@ dependencies = [ [[package]] name = "pastey" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a8cb46bdc156b1c90460339ae6bfd45ba0394e5effbaa640badb4987fdc261" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "path-matchers" @@ -1659,9 +1664,9 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -1757,9 +1762,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -1834,9 +1839,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -1882,74 +1887,53 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-lite" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -1968,22 +1952,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -2006,15 +1990,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "self_cell" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" -dependencies = [ - "self_cell 1.2.0", -] - [[package]] name = "self_cell" version = "1.2.0" @@ -2023,24 +1998,34 @@ checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.225" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" dependencies = [ "proc-macro2", "quote", @@ -2049,23 +2034,24 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2119,9 +2105,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -2134,9 +2120,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -2154,6 +2140,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -2222,17 +2218,17 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] name = "terminal_size" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ "rustix", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -2241,7 +2237,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +dependencies = [ + "thiserror-impl 2.0.16", ] [[package]] @@ -2255,6 +2260,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" version = "1.1.9" @@ -2266,9 +2282,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -2281,15 +2297,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -2307,26 +2323,28 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", - "windows-sys 0.52.0", + "slab", + "socket2 0.6.0", + "windows-sys 0.59.0", ] [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -2337,11 +2355,11 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.0" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f271e09bde39ab52250160a67e88577e0559ad77e9085de6e9051a2c4353f8f8" +checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" dependencies = [ - "serde", + "serde_core", "serde_spanned", "toml_datetime", "toml_parser", @@ -2350,18 +2368,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_parser" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c1c469eda89749d2230d8156a5969a69ffe0d6d01200581cdc6110674d293e" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" dependencies = [ "winnow", ] @@ -2398,7 +2416,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror", + "thiserror 1.0.69", "time", "tracing-subscriber", ] @@ -2447,14 +2465,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -2472,7 +2490,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" dependencies = [ - "rustc-hash 2.1.1", + "rustc-hash", ] [[package]] @@ -2532,9 +2550,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-xid" @@ -2554,13 +2572,14 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -2577,9 +2596,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -2622,30 +2641,40 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ - "wit-bindgen-rt", + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", @@ -2657,9 +2686,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2667,9 +2696,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", @@ -2680,53 +2709,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" dependencies = [ "unicode-ident", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", - "windows-link", + "windows-link 0.2.0", "windows-result", "windows-strings", ] @@ -2760,21 +2767,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] -name = "windows-result" -version = "0.3.4" +name = "windows-link" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" dependencies = [ - "windows-link", + "windows-link 0.2.0", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -2804,6 +2817,15 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -2826,7 +2848,7 @@ version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -2935,21 +2957,18 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -2983,18 +3002,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -3035,9 +3054,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -3075,9 +3094,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", From f8202aef2edc19d860a3b98cad5aabaaf4a8c3a4 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 20 Sep 2025 18:07:37 +0200 Subject: [PATCH 794/853] =?UTF-8?q?=F0=9F=94=A8=20(tools):=20Homogeiniza?= =?UTF-8?q?=20inputs=20de=20distintas=20fuentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/changelog.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/changelog.sh b/tools/changelog.sh index 211e896a..722cdb7f 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -88,12 +88,13 @@ git-cliff --unreleased "${COMMON_ARGS[@]}" echo "CHANGELOG generated at '$CHANGELOG_FILE'" # Pregunta por la revisión del archivo de cambios generado -read -p "Do you want to review the changelog before continuing? (y/n) " -r || exit 1 -echo +echo "Do you want to review the changelog before continuing? [y/N]" +read -r REPLY if [[ "$REPLY" =~ ^[Yy]$ ]]; then ${EDITOR:-nano} "$CHANGELOG_FILE" fi -read -p "Do you want to proceed with the release of $CRATE? (y/n) " -r || exit 1 +echo "Do you want to proceed with the release of $CRATE? [y/N]" +read -r REPLY echo if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then echo "Aborting release process." >&2 From ce4557684e278fbd44103043c7269e09b4231c57 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 25 Sep 2025 21:36:37 +0200 Subject: [PATCH 795/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20`TypedSlot`?= =?UTF-8?q?=20por=20`TypedOpt`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/component.rs | 4 +-- src/core/component/optional.rs | 59 +++++++++++++++++++++++++++++++ src/core/component/slot.rs | 64 ---------------------------------- src/html.rs | 6 ++-- 4 files changed, 64 insertions(+), 69 deletions(-) create mode 100644 src/core/component/optional.rs delete mode 100644 src/core/component/slot.rs diff --git a/src/core/component.rs b/src/core/component.rs index 36914722..e5858cbf 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -8,5 +8,5 @@ pub use children::Children; pub use children::{Child, ChildOp}; pub use children::{Typed, TypedOp}; -mod slot; -pub use slot::TypedSlot; +mod optional; +pub use optional::TypedOpt; diff --git a/src/core/component/optional.rs b/src/core/component/optional.rs new file mode 100644 index 00000000..c13b8335 --- /dev/null +++ b/src/core/component/optional.rs @@ -0,0 +1,59 @@ +use crate::core::component::{Component, Typed}; +use crate::html::{html, Context, Markup}; +use crate::{builder_fn, AutoDefault}; + +/// Contenedor **opcional** para un componente [`Typed`]. +/// +/// Un `TypedOpt` actúa como un contenedor para incluir o no un subcomponente tipado. Internamente +/// encapsula `Option<Typed<C>>`, pero ofrece una API más sencilla para construir estructuras +/// jerárquicas o contenidas de componentes. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// let icon = Icon::default(); +/// let icon = TypedOpt::new(icon); +/// assert!(icon.get().is_some()); +/// ``` +#[derive(AutoDefault)] +pub struct TypedOpt<C: Component>(Option<Typed<C>>); + +impl<C: Component> TypedOpt<C> { + /// Crea un nuevo [`TypedOpt`]. + /// + /// El componente se envuelve automáticamente en un [`Typed`] y se almacena. + pub fn new(component: C) -> Self { + TypedOpt(Some(Typed::with(component))) + } + + // TypedOpt BUILDER **************************************************************************** + + /// Establece un componente nuevo, o lo vacía. + /// + /// Si se proporciona `Some(component)`, se guarda como [`Typed`]; y si es `None`, se limpia. + #[builder_fn] + pub fn with_component(mut self, component: Option<C>) -> Self { + self.0 = component.map(Typed::with); + self + } + + // TypedOpt GETTERS **************************************************************************** + + /// Devuelve un clon (incrementa el contador `Arc`) de [`Typed<C>`], si existe. + pub fn get(&self) -> Option<Typed<C>> { + self.0.clone() + } + + // TypedOpt RENDER ***************************************************************************** + + /// Renderiza el componente, si existe. + pub fn render(&self, cx: &mut Context) -> Markup { + if let Some(component) = &self.0 { + component.render(cx) + } else { + html! {} + } + } +} diff --git a/src/core/component/slot.rs b/src/core/component/slot.rs deleted file mode 100644 index 19ed72ac..00000000 --- a/src/core/component/slot.rs +++ /dev/null @@ -1,64 +0,0 @@ -use crate::builder_fn; -use crate::core::component::{Component, Typed}; -use crate::html::{html, Context, Markup}; - -/// Contenedor para un componente [`Typed`] opcional. -/// -/// Un `TypedSlot` actúa como un contenedor dentro de otro componente para incluir o no un -/// subcomponente. Internamente encapsula `Option<Typed<C>>`, pero proporciona una API más sencilla -/// para construir estructuras jerárquicas. -/// -/// # Ejemplo -/// -/// ```rust,ignore -/// use pagetop::prelude::*; -/// -/// let comp = MyComponent::new(); -/// let opt = TypedSlot::new(comp); -/// assert!(opt.get().is_some()); -/// ``` -pub struct TypedSlot<C: Component>(Option<Typed<C>>); - -impl<C: Component> Default for TypedSlot<C> { - fn default() -> Self { - TypedSlot(None) - } -} - -impl<C: Component> TypedSlot<C> { - /// Crea un nuevo [`TypedSlot`]. - /// - /// El componente se envuelve automáticamente en un [`Typed`] y se almacena. - pub fn new(component: C) -> Self { - TypedSlot(Some(Typed::with(component))) - } - - // TypedSlot BUILDER ********************************************************************* - - /// Establece un componente nuevo, o lo vacía. - /// - /// Si se proporciona `Some(component)`, se guarda en [`Typed`]; y si es `None`, se limpia. - #[builder_fn] - pub fn with_value(mut self, component: Option<C>) -> Self { - self.0 = component.map(Typed::with); - self - } - - // TypedSlot GETTERS ********************************************************************* - - /// Devuelve un clon (incrementa el contador `Arc`) de [`Typed<C>`], si existe. - pub fn get(&self) -> Option<Typed<C>> { - self.0.clone() - } - - // TypedSlot RENDER ************************************************************************ - - /// Renderiza el componente, si existe. - pub fn render(&self, cx: &mut Context) -> Markup { - if let Some(component) = &self.0 { - component.render(cx) - } else { - html! {} - } - } -} diff --git a/src/html.rs b/src/html.rs index 4858bbfa..89d19d4e 100644 --- a/src/html.rs +++ b/src/html.rs @@ -50,14 +50,14 @@ pub type OptionClasses = AttrClasses; use crate::{core, AutoDefault}; -/// **Obsoleto desde la versión 0.4.0**: usar [`TypedSlot`](crate::core::component::TypedSlot) en su +/// **Obsoleto desde la versión 0.4.0**: usar [`TypedOpt`](crate::core::component::TypedOpt) en su /// lugar. #[deprecated( since = "0.4.0", - note = "Use `pagetop::core::component::TypedSlot` instead" + note = "Use `pagetop::core::component::TypedOpt` instead" )] #[allow(type_alias_bounds)] -pub type OptionComponent<C: core::component::Component> = core::component::TypedSlot<C>; +pub type OptionComponent<C: core::component::Component> = core::component::TypedOpt<C>; /// Prepara contenido HTML para su conversión a [`Markup`]. /// From 2ac3c2a9c4a0210a13c8745d2277f859c2e57579 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 27 Sep 2025 21:18:54 +0200 Subject: [PATCH 796/853] =?UTF-8?q?=F0=9F=94=A5=20Elimina=20definitivament?= =?UTF-8?q?e=20`TypedOpt`=20por=20`Typed`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/component.rs | 3 -- src/core/component/children.rs | 77 +++++++++++++++++++++++----------- src/core/component/optional.rs | 59 -------------------------- src/html.rs | 7 ++-- 4 files changed, 56 insertions(+), 90 deletions(-) delete mode 100644 src/core/component/optional.rs diff --git a/src/core/component.rs b/src/core/component.rs index e5858cbf..17b9b735 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -7,6 +7,3 @@ mod children; pub use children::Children; pub use children::{Child, ChildOp}; pub use children::{Typed, TypedOp}; - -mod optional; -pub use optional::TypedOpt; diff --git a/src/core/component/children.rs b/src/core/component/children.rs index cb112e16..2b16f068 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -1,6 +1,6 @@ use crate::core::component::Component; use crate::html::{html, Context, Markup}; -use crate::{builder_fn, UniqueId}; +use crate::{builder_fn, AutoDefault, UniqueId}; use parking_lot::RwLock; @@ -11,76 +11,105 @@ use std::vec::IntoIter; /// /// Esta estructura permite manipular y renderizar un componente que implemente [`Component`], y /// habilita acceso concurrente mediante [`Arc<RwLock<_>>`]. -#[derive(Clone)] -pub struct Child(Arc<RwLock<dyn Component>>); +#[derive(AutoDefault, Clone)] +pub struct Child(Option<Arc<RwLock<dyn Component>>>); impl Child { /// Crea un nuevo `Child` a partir de un componente. pub fn with(component: impl Component) -> Self { - Child(Arc::new(RwLock::new(component))) + Child(Some(Arc::new(RwLock::new(component)))) + } + + // Child BUILDER ******************************************************************************* + + /// Establece un componente nuevo, o lo vacía. + /// + /// Si se proporciona `Some(component)`, se encapsula como [`Child`]; y si es `None`, se limpia. + #[builder_fn] + pub fn with_component<C: Component>(mut self, component: Option<C>) -> Self { + if let Some(c) = component { + self.0 = Some(Arc::new(RwLock::new(c))); + } else { + self.0 = None; + } + self } // Child GETTERS ******************************************************************************* - /// Devuelve el identificador del componente, si está definido. + /// Devuelve el identificador del componente, si existe y está definido. + #[inline] pub fn id(&self) -> Option<String> { - self.0.read().id() + self.0.as_ref().and_then(|c| c.read().id()) } // Child RENDER ******************************************************************************** /// Renderiza el componente con el contexto proporcionado. pub fn render(&self, cx: &mut Context) -> Markup { - self.0.write().render(cx) + self.0.as_ref().map_or(html! {}, |c| c.write().render(cx)) } // Child HELPERS ******************************************************************************* - // Devuelve el [`UniqueId`] del tipo del componente. - fn type_id(&self) -> UniqueId { - self.0.read().type_id() + // Devuelve el [`UniqueId`] del tipo del componente, si existe. + #[inline] + fn type_id(&self) -> Option<UniqueId> { + self.0.as_ref().map(|c| c.read().type_id()) } } // ************************************************************************************************* -/// Variante tipada de [`Child`] para evitar conversiones durante el uso. +/// Variante tipada de [`Child`] para evitar conversiones de tipo durante el uso. /// /// Esta estructura permite manipular y renderizar un componente concreto que implemente /// [`Component`], y habilita acceso concurrente mediante [`Arc<RwLock<_>>`]. -pub struct Typed<C: Component>(Arc<RwLock<C>>); - -impl<C: Component> Clone for Typed<C> { - fn clone(&self) -> Self { - Self(self.0.clone()) - } -} +#[derive(AutoDefault, Clone)] +pub struct Typed<C: Component>(Option<Arc<RwLock<C>>>); impl<C: Component> Typed<C> { /// Crea un nuevo `Typed` a partir de un componente. pub fn with(component: C) -> Self { - Typed(Arc::new(RwLock::new(component))) + Typed(Some(Arc::new(RwLock::new(component)))) + } + + // Typed BUILDER ******************************************************************************* + + /// Establece un componente nuevo, o lo vacía. + /// + /// Si se proporciona `Some(component)`, se encapsula como [`Typed`]; y si es `None`, se limpia. + #[builder_fn] + pub fn with_component(mut self, component: Option<C>) -> Self { + self.0 = component.map(|c| Arc::new(RwLock::new(c))); + self } // Typed GETTERS ******************************************************************************* - /// Devuelve el identificador del componente, si está definido. + /// Devuelve el identificador del componente, si existe y está definido. + #[inline] pub fn id(&self) -> Option<String> { - self.0.read().id() + self.0.as_ref().and_then(|c| c.read().id()) } // Typed RENDER ******************************************************************************** /// Renderiza el componente con el contexto proporcionado. pub fn render(&self, cx: &mut Context) -> Markup { - self.0.write().render(cx) + self.0.as_ref().map_or(html! {}, |c| c.write().render(cx)) } // Typed HELPERS ******************************************************************************* // Convierte el componente tipado en un [`Child`]. + #[inline] fn into_child(self) -> Child { - Child(self.0.clone()) + if let Some(c) = &self.0 { + Child(Some(c.clone())) + } else { + Child(None) + } } } @@ -201,7 +230,7 @@ impl Children { /// Devuelve un iterador sobre los componentes hijo con el identificador de tipo ([`UniqueId`]) /// indicado. pub fn iter_by_type_id(&self, type_id: UniqueId) -> impl Iterator<Item = &Child> { - self.0.iter().filter(move |&c| c.type_id() == type_id) + self.0.iter().filter(move |&c| c.type_id() == Some(type_id)) } // Children RENDER ***************************************************************************** diff --git a/src/core/component/optional.rs b/src/core/component/optional.rs deleted file mode 100644 index c13b8335..00000000 --- a/src/core/component/optional.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::core::component::{Component, Typed}; -use crate::html::{html, Context, Markup}; -use crate::{builder_fn, AutoDefault}; - -/// Contenedor **opcional** para un componente [`Typed`]. -/// -/// Un `TypedOpt` actúa como un contenedor para incluir o no un subcomponente tipado. Internamente -/// encapsula `Option<Typed<C>>`, pero ofrece una API más sencilla para construir estructuras -/// jerárquicas o contenidas de componentes. -/// -/// # Ejemplo -/// -/// ```rust -/// use pagetop::prelude::*; -/// -/// let icon = Icon::default(); -/// let icon = TypedOpt::new(icon); -/// assert!(icon.get().is_some()); -/// ``` -#[derive(AutoDefault)] -pub struct TypedOpt<C: Component>(Option<Typed<C>>); - -impl<C: Component> TypedOpt<C> { - /// Crea un nuevo [`TypedOpt`]. - /// - /// El componente se envuelve automáticamente en un [`Typed`] y se almacena. - pub fn new(component: C) -> Self { - TypedOpt(Some(Typed::with(component))) - } - - // TypedOpt BUILDER **************************************************************************** - - /// Establece un componente nuevo, o lo vacía. - /// - /// Si se proporciona `Some(component)`, se guarda como [`Typed`]; y si es `None`, se limpia. - #[builder_fn] - pub fn with_component(mut self, component: Option<C>) -> Self { - self.0 = component.map(Typed::with); - self - } - - // TypedOpt GETTERS **************************************************************************** - - /// Devuelve un clon (incrementa el contador `Arc`) de [`Typed<C>`], si existe. - pub fn get(&self) -> Option<Typed<C>> { - self.0.clone() - } - - // TypedOpt RENDER ***************************************************************************** - - /// Renderiza el componente, si existe. - pub fn render(&self, cx: &mut Context) -> Markup { - if let Some(component) = &self.0 { - component.render(cx) - } else { - html! {} - } - } -} diff --git a/src/html.rs b/src/html.rs index 89d19d4e..4a965cab 100644 --- a/src/html.rs +++ b/src/html.rs @@ -50,14 +50,13 @@ pub type OptionClasses = AttrClasses; use crate::{core, AutoDefault}; -/// **Obsoleto desde la versión 0.4.0**: usar [`TypedOpt`](crate::core::component::TypedOpt) en su -/// lugar. +/// **Obsoleto desde la versión 0.4.0**: usar [`Typed`](crate::core::component::Typed) en su lugar. #[deprecated( since = "0.4.0", - note = "Use `pagetop::core::component::TypedOpt` instead" + note = "Use `pagetop::core::component::Typed` instead" )] #[allow(type_alias_bounds)] -pub type OptionComponent<C: core::component::Component> = core::component::TypedOpt<C>; +pub type OptionComponent<C: core::component::Component> = core::component::Typed<C>; /// Prepara contenido HTML para su conversión a [`Markup`]. /// From 31435f30d3b53d9219dc4ce27384b9816d7fa4fc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 Sep 2025 08:51:21 +0200 Subject: [PATCH 797/853] =?UTF-8?q?=F0=9F=92=A1=20Mejora=20legibilidad=20d?= =?UTF-8?q?e=20comentarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/block.rs | 6 +++--- src/base/component/html.rs | 4 ++-- src/base/component/poweredby.rs | 4 ++-- src/core/action/all.rs | 6 +++--- src/core/component/children.rs | 24 ++++++++++++------------ src/core/extension/all.rs | 10 +++++----- src/core/theme/all.rs | 6 +++--- src/html.rs | 6 +++--- src/html/assets/favicon.rs | 4 +++- src/html/assets/javascript.rs | 4 +++- src/html/assets/stylesheet.rs | 6 ++++-- src/html/attr_classes.rs | 4 ++-- src/html/attr_id.rs | 4 ++-- src/html/attr_l10n.rs | 4 ++-- src/html/attr_name.rs | 4 ++-- src/html/attr_value.rs | 4 ++-- src/html/context.rs | 16 ++++++++-------- src/lib.rs | 6 +++--- src/response/page.rs | 12 ++++++------ src/util.rs | 6 +++--- tests/component_poweredby.rs | 2 +- 21 files changed, 74 insertions(+), 68 deletions(-) diff --git a/src/base/component/block.rs b/src/base/component/block.rs index c96f2baf..9a04c4ea 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -47,7 +47,7 @@ impl Component for Block { } impl Block { - // Block BUILDER ******************************************************************************* + // **< Block BUILDER >************************************************************************** /// Establece el identificador único (`id`) del bloque. #[builder_fn] @@ -77,14 +77,14 @@ impl Block { self } - /// Modifica la lista de hijos (`children`) aplicando una operación. + /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. #[builder_fn] pub fn with_child(mut self, op: ChildOp) -> Self { self.children.alter_child(op); self } - // Block GETTERS ******************************************************************************* + // **< Block GETTERS >************************************************************************** /// Devuelve las clases CSS asociadas al bloque. pub fn classes(&self) -> &AttrClasses { diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 8fa56902..b8c4aaaa 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -49,7 +49,7 @@ impl Component for Html { } impl Html { - // Html BUILDER ******************************************************************************** + // **< Html BUILDER >*************************************************************************** /// Crea una instancia que generará el `Markup`, con acceso opcional al contexto. /// @@ -77,7 +77,7 @@ impl Html { self } - // Html GETTERS ******************************************************************************** + // **< Html GETTERS >*************************************************************************** /// Aplica la función interna de renderizado con el [`Context`] proporcionado. /// diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index bfe38351..4b54af36 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -39,7 +39,7 @@ impl Component for PoweredBy { } impl PoweredBy { - // PoweredBy BUILDER *************************************************************************** + // **< PoweredBy BUILDER >********************************************************************** /// Establece el texto de copyright que mostrará el componente. /// @@ -58,7 +58,7 @@ impl PoweredBy { self } - // PoweredBy GETTERS *************************************************************************** + // **< PoweredBy GETTERS >********************************************************************** /// Devuelve el texto de copyright actual, si existe. pub fn copyright(&self) -> Option<&str> { diff --git a/src/core/action/all.rs b/src/core/action/all.rs index 7fff970c..fbbf8427 100644 --- a/src/core/action/all.rs +++ b/src/core/action/all.rs @@ -5,12 +5,12 @@ use parking_lot::RwLock; use std::collections::HashMap; use std::sync::LazyLock; -// ACCIONES **************************************************************************************** +// **< ACCIONES >*********************************************************************************** static ACTIONS: LazyLock<RwLock<HashMap<ActionKey, ActionsList>>> = LazyLock::new(|| RwLock::new(HashMap::new())); -// AÑADIR ACCIONES ********************************************************************************* +// **< AÑADIR ACCIONES >**************************************************************************** // Registra una nueva acción en el sistema. // @@ -36,7 +36,7 @@ pub fn add_action(action: ActionBox) { } } -// DESPLEGAR ACCIONES ****************************************************************************** +// **< DESPLEGAR ACCIONES >************************************************************************* /// Despacha y ejecuta las funciones asociadas a una [`ActionKey`]. /// diff --git a/src/core/component/children.rs b/src/core/component/children.rs index 2b16f068..920dacf8 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -20,7 +20,7 @@ impl Child { Child(Some(Arc::new(RwLock::new(component)))) } - // Child BUILDER ******************************************************************************* + // **< Child BUILDER >************************************************************************** /// Establece un componente nuevo, o lo vacía. /// @@ -35,7 +35,7 @@ impl Child { self } - // Child GETTERS ******************************************************************************* + // **< Child GETTERS >************************************************************************** /// Devuelve el identificador del componente, si existe y está definido. #[inline] @@ -43,14 +43,14 @@ impl Child { self.0.as_ref().and_then(|c| c.read().id()) } - // Child RENDER ******************************************************************************** + // **< Child RENDER >*************************************************************************** /// Renderiza el componente con el contexto proporcionado. pub fn render(&self, cx: &mut Context) -> Markup { self.0.as_ref().map_or(html! {}, |c| c.write().render(cx)) } - // Child HELPERS ******************************************************************************* + // **< Child HELPERS >************************************************************************** // Devuelve el [`UniqueId`] del tipo del componente, si existe. #[inline] @@ -74,7 +74,7 @@ impl<C: Component> Typed<C> { Typed(Some(Arc::new(RwLock::new(component)))) } - // Typed BUILDER ******************************************************************************* + // **< Typed BUILDER >************************************************************************** /// Establece un componente nuevo, o lo vacía. /// @@ -85,7 +85,7 @@ impl<C: Component> Typed<C> { self } - // Typed GETTERS ******************************************************************************* + // **< Typed GETTERS >************************************************************************** /// Devuelve el identificador del componente, si existe y está definido. #[inline] @@ -93,14 +93,14 @@ impl<C: Component> Typed<C> { self.0.as_ref().and_then(|c| c.read().id()) } - // Typed RENDER ******************************************************************************** + // **< Typed RENDER >*************************************************************************** /// Renderiza el componente con el contexto proporcionado. pub fn render(&self, cx: &mut Context) -> Markup { self.0.as_ref().map_or(html! {}, |c| c.write().render(cx)) } - // Typed HELPERS ******************************************************************************* + // **< Typed HELPERS >************************************************************************** // Convierte el componente tipado en un [`Child`]. #[inline] @@ -165,7 +165,7 @@ impl Children { opt } - // Children BUILDER **************************************************************************** + // **< Children BUILDER >*********************************************************************** /// Ejecuta una operación con [`ChildOp`] en la lista. #[builder_fn] @@ -204,7 +204,7 @@ impl Children { self } - // Children GETTERS **************************************************************************** + // **< Children GETTERS >*********************************************************************** /// Devuelve el número de componentes hijo de la lista. pub fn len(&self) -> usize { @@ -233,7 +233,7 @@ impl Children { self.0.iter().filter(move |&c| c.type_id() == Some(type_id)) } - // Children RENDER ***************************************************************************** + // **< Children RENDER >************************************************************************ /// Renderiza todos los componentes hijo, en orden. pub fn render(&self, cx: &mut Context) -> Markup { @@ -244,7 +244,7 @@ impl Children { } } - // Children HELPERS **************************************************************************** + // **< Children HELPERS >*********************************************************************** // Inserta un hijo después del componente con el `id` dado, o al final si no se encuentra. #[inline] diff --git a/src/core/extension/all.rs b/src/core/extension/all.rs index a243778c..fa67671d 100644 --- a/src/core/extension/all.rs +++ b/src/core/extension/all.rs @@ -7,7 +7,7 @@ use parking_lot::RwLock; use std::sync::LazyLock; -// EXTENSIONES ************************************************************************************* +// **< EXTENSIONES >******************************************************************************** static ENABLED_EXTENSIONS: LazyLock<RwLock<Vec<ExtensionRef>>> = LazyLock::new(|| RwLock::new(Vec::new())); @@ -15,7 +15,7 @@ static ENABLED_EXTENSIONS: LazyLock<RwLock<Vec<ExtensionRef>>> = static DROPPED_EXTENSIONS: LazyLock<RwLock<Vec<ExtensionRef>>> = LazyLock::new(|| RwLock::new(Vec::new())); -// REGISTRO DE LAS EXTENSIONES ********************************************************************* +// **< REGISTRO DE LAS EXTENSIONES >**************************************************************** pub fn register_extensions(root_extension: Option<ExtensionRef>) { // Prepara la lista de extensiones habilitadas. @@ -104,7 +104,7 @@ fn add_to_dropped(list: &mut Vec<ExtensionRef>, extension: ExtensionRef) { } } -// REGISTRO DE LAS ACCIONES ************************************************************************ +// **< REGISTRO DE LAS ACCIONES >******************************************************************* pub fn register_actions() { for extension in ENABLED_EXTENSIONS.read().iter() { @@ -114,7 +114,7 @@ pub fn register_actions() { } } -// INICIALIZA LAS EXTENSIONES ********************************************************************** +// **< INICIALIZA LAS EXTENSIONES >***************************************************************** pub fn initialize_extensions() { trace::info!("Calling application bootstrap"); @@ -123,7 +123,7 @@ pub fn initialize_extensions() { } } -// CONFIGURA LOS SERVICIOS ************************************************************************* +// **< CONFIGURA LOS SERVICIOS >******************************************************************** pub fn configure_services(scfg: &mut service::web::ServiceConfig) { // Sólo compila durante el desarrollo, para evitar errores 400 en la traza de eventos. diff --git a/src/core/theme/all.rs b/src/core/theme/all.rs index ebb28481..5e6b65b0 100644 --- a/src/core/theme/all.rs +++ b/src/core/theme/all.rs @@ -5,11 +5,11 @@ use parking_lot::RwLock; use std::sync::LazyLock; -// TEMAS ******************************************************************************************* +// **< TEMAS >************************************************************************************** pub static THEMES: LazyLock<RwLock<Vec<ThemeRef>>> = LazyLock::new(|| RwLock::new(Vec::new())); -// TEMA PREDETERMINADO ***************************************************************************** +// **< TEMA PREDETERMINADO >************************************************************************ pub static DEFAULT_THEME: LazyLock<ThemeRef> = LazyLock::new(|| match theme_by_short_name(&global::SETTINGS.app.theme) { @@ -17,7 +17,7 @@ pub static DEFAULT_THEME: LazyLock<ThemeRef> = None => &crate::base::theme::Basic, }); -// TEMA POR NOMBRE ********************************************************************************* +// **< TEMA POR NOMBRE >**************************************************************************** // Devuelve el tema identificado por su [`short_name()`](AnyInfo::short_name). pub fn theme_by_short_name(short_name: &'static str) -> Option<ThemeRef> { diff --git a/src/html.rs b/src/html.rs index 4a965cab..b6815ece 100644 --- a/src/html.rs +++ b/src/html.rs @@ -3,7 +3,7 @@ mod maud; pub use maud::{display, html, html_private, Escaper, Markup, PreEscaped, DOCTYPE}; -// HTML DOCUMENT ASSETS **************************************************************************** +// **< HTML DOCUMENT ASSETS >*********************************************************************** mod assets; pub use assets::favicon::Favicon; @@ -11,12 +11,12 @@ pub use assets::javascript::JavaScript; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::{Asset, Assets}; -// HTML DOCUMENT CONTEXT *************************************************************************** +// **< HTML DOCUMENT CONTEXT >********************************************************************** mod context; pub use context::{AssetsOp, Context, Contextual, ErrorParam}; -// HTML ATTRIBUTES ********************************************************************************* +// **< HTML ATTRIBUTES >**************************************************************************** mod attr_id; pub use attr_id::AttrId; diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index d731b8f5..56c39056 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -52,7 +52,7 @@ impl Favicon { Favicon::default() } - // Favicon BUILDER ***************************************************************************** + // **< Favicon BUILDER >************************************************************************ /// Le añade un icono genérico apuntando a `image`. El tipo MIME se infiere automáticamente a /// partir de la extensión. @@ -152,6 +152,8 @@ impl Favicon { self } + // **< Favicon RENDER >************************************************************************* + /// Renderiza el **Favicon** completo con todas las etiquetas declaradas. /// /// El parámetro `Context` se acepta por coherencia con el resto de *assets*, aunque en este diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index a8ed3e8c..4649cdb4 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -171,7 +171,7 @@ impl JavaScript { } } - // JavaScript BUILDER ************************************************************************** + // **< JavaScript BUILDER >********************************************************************* /// Asocia una **versión** al recurso (usada para control de la caché del navegador). /// @@ -210,6 +210,8 @@ impl Asset for JavaScript { self.weight } + // **< JavaScript RENDER >********************************************************************** + fn render(&self, cx: &mut Context) -> Markup { match &self.source { Source::From(path) => html! { diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 3ecc77fc..b54f4cf3 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -113,7 +113,7 @@ impl StyleSheet { } } - // StyleSheet BUILDER ************************************************************************** + // **< StyleSheet BUILDER >********************************************************************* /// Asocia una versión al recurso (usada para control de la caché del navegador). /// @@ -132,7 +132,7 @@ impl StyleSheet { self } - // StyleSheet EXTRAS *************************************************************************** + // **< StyleSheet HELPERS >********************************************************************* /// Especifica el medio donde se aplican los estilos. /// @@ -163,6 +163,8 @@ impl Asset for StyleSheet { self.weight } + // **< StyleSheet RENDER >********************************************************************** + fn render(&self, cx: &mut Context) -> Markup { match &self.source { Source::From(path) => html! { diff --git a/src/html/attr_classes.rs b/src/html/attr_classes.rs index 098c26cd..80fdad79 100644 --- a/src/html/attr_classes.rs +++ b/src/html/attr_classes.rs @@ -48,7 +48,7 @@ impl AttrClasses { AttrClasses::default().with_value(ClassesOp::Prepend, classes) } - // AttrClasses BUILDER ************************************************************************* + // **< AttrClasses BUILDER >******************************************************************** #[builder_fn] pub fn with_value(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { @@ -114,7 +114,7 @@ impl AttrClasses { } } - // AttrClasses GETTERS ************************************************************************* + // **< AttrClasses GETTERS >******************************************************************** /// Devuelve la cadena de clases, si existe. pub fn get(&self) -> Option<String> { diff --git a/src/html/attr_id.rs b/src/html/attr_id.rs index 8bb1d33b..3d5f3eb4 100644 --- a/src/html/attr_id.rs +++ b/src/html/attr_id.rs @@ -29,7 +29,7 @@ impl AttrId { AttrId::default().with_value(value) } - // AttrId BUILDER ****************************************************************************** + // **< AttrId BUILDER >************************************************************************* /// Establece un identificador nuevo normalizando el valor. #[builder_fn] @@ -39,7 +39,7 @@ impl AttrId { self } - // AttrId GETTERS ****************************************************************************** + // **< AttrId GETTERS >************************************************************************* /// Devuelve el identificador normalizado, si existe. pub fn get(&self) -> Option<String> { diff --git a/src/html/attr_l10n.rs b/src/html/attr_l10n.rs index 8250c742..37fc80fa 100644 --- a/src/html/attr_l10n.rs +++ b/src/html/attr_l10n.rs @@ -39,7 +39,7 @@ impl AttrL10n { AttrL10n(value) } - // AttrL10n BUILDER **************************************************************************** + // **< AttrL10n BUILDER >*********************************************************************** /// Establece una traducción nueva. #[builder_fn] @@ -48,7 +48,7 @@ impl AttrL10n { self } - // AttrL10n GETTERS **************************************************************************** + // **< AttrL10n GETTERS >*********************************************************************** /// Devuelve la traducción para `language`, si existe. pub fn lookup(&self, language: &impl LangId) -> Option<String> { diff --git a/src/html/attr_name.rs b/src/html/attr_name.rs index 928f841f..9bc9659e 100644 --- a/src/html/attr_name.rs +++ b/src/html/attr_name.rs @@ -29,7 +29,7 @@ impl AttrName { AttrName::default().with_value(value) } - // AttrName BUILDER **************************************************************************** + // **< AttrName BUILDER >*********************************************************************** /// Establece un nombre nuevo normalizando el valor. #[builder_fn] @@ -39,7 +39,7 @@ impl AttrName { self } - // AttrName GETTERS **************************************************************************** + // **< AttrName GETTERS >*********************************************************************** /// Devuelve el nombre normalizado, si existe. pub fn get(&self) -> Option<String> { diff --git a/src/html/attr_value.rs b/src/html/attr_value.rs index 4e03120b..eff80660 100644 --- a/src/html/attr_value.rs +++ b/src/html/attr_value.rs @@ -27,7 +27,7 @@ impl AttrValue { AttrValue::default().with_value(value) } - // AttrValue BUILDER *************************************************************************** + // **< AttrValue BUILDER >********************************************************************** /// Establece una cadena nueva normalizando el valor. #[builder_fn] @@ -41,7 +41,7 @@ impl AttrValue { self } - // AttrValue GETTERS *************************************************************************** + // **< AttrValue GETTERS >********************************************************************** /// Devuelve la cadena normalizada, si existe. pub fn get(&self) -> Option<String> { diff --git a/src/html/context.rs b/src/html/context.rs index 7b782681..355ccead 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -78,7 +78,7 @@ pub enum ErrorParam { /// } /// ``` pub trait Contextual: LangId { - // Contextual BUILDER ************************************************************************** + // **< Contextual BUILDER >********************************************************************* /// Establece el idioma del documento. #[builder_fn] @@ -104,7 +104,7 @@ pub trait Contextual: LangId { #[builder_fn] fn with_assets(self, op: AssetsOp) -> Self; - // Contextual GETTERS ************************************************************************** + // **< Contextual GETTERS >********************************************************************* /// Devuelve una referencia a la solicitud HTTP asociada, si existe. fn request(&self) -> Option<&HttpRequest>; @@ -142,7 +142,7 @@ pub trait Contextual: LangId { /// Devuelve los scripts JavaScript de los recursos del contexto. fn javascripts(&self) -> &Assets<JavaScript>; - // Contextual HELPERS ************************************************************************** + // **< Contextual HELPERS >********************************************************************* /// Genera un identificador único por tipo (`<tipo>-<n>`) cuando no se aporta uno explícito. /// @@ -255,7 +255,7 @@ impl Context { } } - // Context RENDER ****************************************************************************** + // **< Context RENDER >************************************************************************* /// Renderiza los recursos del contexto. pub fn render_assets(&mut self) -> Markup { @@ -283,7 +283,7 @@ impl Context { markup } - // Context PARAMS ****************************************************************************** + // **< Context PARAMS >************************************************************************* /// Recupera una *referencia tipada* al parámetro solicitado. /// @@ -389,7 +389,7 @@ impl LangId for Context { } impl Contextual for Context { - // Contextual BUILDER ************************************************************************** + // **< Contextual BUILDER >********************************************************************* #[builder_fn] fn with_request(mut self, request: Option<HttpRequest>) -> Self { @@ -471,7 +471,7 @@ impl Contextual for Context { self } - // Contextual GETTERS ************************************************************************** + // **< Contextual GETTERS >********************************************************************* fn request(&self) -> Option<&HttpRequest> { self.request.as_ref() @@ -530,7 +530,7 @@ impl Contextual for Context { &self.javascripts } - // Contextual HELPERS ************************************************************************** + // **< Contextual HELPERS >********************************************************************* /// Devuelve un identificador único dentro del contexto para el tipo `T`, si no se proporciona /// un `id` explícito. diff --git a/src/lib.rs b/src/lib.rs index 1c1ba2c1..6f5c5cfb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -97,7 +97,7 @@ extern crate self as pagetop; use std::collections::HashMap; use std::ops::Deref; -// RE-EXPORTED ************************************************************************************* +// **< RE-EXPORTED >******************************************************************************** pub use pagetop_macros::{builder_fn, html, main, test, AutoDefault}; @@ -136,7 +136,7 @@ pub type UniqueId = std::any::TypeId; /// antes en la ordenación. pub type Weight = i8; -// API ********************************************************************************************* +// **< API >**************************************************************************************** // Macros y funciones útiles. pub mod util; @@ -163,6 +163,6 @@ pub mod base; // Prepara y ejecuta la aplicación. pub mod app; -// PRELUDE ***************************************************************************************** +// **< PRELUDE >************************************************************************************ pub mod prelude; diff --git a/src/response/page.rs b/src/response/page.rs index 2dc27f9f..e9d30671 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -52,7 +52,7 @@ impl Page { } } - // Page BUILDER ******************************************************************************** + // **< Page BUILDER >*************************************************************************** /// Establece el título de la página como un valor traducible. #[builder_fn] @@ -151,7 +151,7 @@ impl Page { self } - // Page GETTERS ******************************************************************************** + // **< Page GETTERS >*************************************************************************** /// Devuelve el título traducido para el idioma de la página, si existe. pub fn title(&mut self) -> Option<String> { @@ -192,7 +192,7 @@ impl Page { &mut self.context } - // Page RENDER ********************************************************************************* + // **< Page RENDER >**************************************************************************** /// Renderiza los componentes de una región (`region_name`) de la página. pub fn render_region(&mut self, region_name: &'static str) -> Markup { @@ -253,7 +253,7 @@ impl LangId for Page { } impl Contextual for Page { - // Contextual BUILDER ************************************************************************** + // **< Contextual BUILDER >********************************************************************* #[builder_fn] fn with_request(mut self, request: Option<HttpRequest>) -> Self { @@ -291,7 +291,7 @@ impl Contextual for Page { self } - // Contextual GETTERS ************************************************************************** + // **< Contextual GETTERS >********************************************************************* fn request(&self) -> Option<&HttpRequest> { self.context.request() @@ -321,7 +321,7 @@ impl Contextual for Page { self.context.javascripts() } - // Contextual HELPERS ************************************************************************** + // **< Contextual HELPERS >********************************************************************* fn required_id<T>(&mut self, id: Option<String>) -> String { self.context.required_id::<T>(id) diff --git a/src/util.rs b/src/util.rs index cb101763..a4daf677 100644 --- a/src/util.rs +++ b/src/util.rs @@ -6,7 +6,7 @@ use std::env; use std::io; use std::path::{Path, PathBuf}; -// MACROS INTEGRADAS ******************************************************************************* +// **< MACROS INTEGRADAS >************************************************************************** #[doc(hidden)] pub use paste::paste; @@ -16,7 +16,7 @@ pub use concat_string::concat_string; pub use indoc::{concatdoc, formatdoc, indoc}; -// MACROS ÚTILES *********************************************************************************** +// **< MACROS ÚTILES >****************************************************************************** #[macro_export] /// Macro para construir una colección de pares clave-valor. @@ -198,7 +198,7 @@ macro_rules! join_strict { }}; } -// FUNCIONES ÚTILES ******************************************************************************** +// **< FUNCIONES ÚTILES >*************************************************************************** /// Resuelve y valida la ruta de un directorio existente, devolviendo una ruta absoluta. /// diff --git a/tests/component_poweredby.rs b/tests/component_poweredby.rs index e4551d17..27683d95 100644 --- a/tests/component_poweredby.rs +++ b/tests/component_poweredby.rs @@ -90,7 +90,7 @@ async fn poweredby_getter_reflects_internal_state() { assert!(c1.contains(&global::SETTINGS.app.name)); } -// HELPERS ***************************************************************************************** +// **< HELPERS >************************************************************************************ fn render_component<C: Component>(c: &C) -> Markup { let mut cx = Context::default(); From df1f386241c3b2d8cb09de5bbaa115297bf91cbc Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 Sep 2025 13:46:02 +0200 Subject: [PATCH 798/853] =?UTF-8?q?=F0=9F=9A=A7=20(base):=20A=C3=B1ade=20n?= =?UTF-8?q?uevo=20componente=20`Icon`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component.rs | 3 + src/base/component/icon.rs | 134 +++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 src/base/component/icon.rs diff --git a/src/base/component.rs b/src/base/component.rs index 4df64ff1..5bbe746d 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -8,3 +8,6 @@ pub use block::Block; mod poweredby; pub use poweredby::PoweredBy; + +mod icon; +pub use icon::{Icon, IconKind}; diff --git a/src/base/component/icon.rs b/src/base/component/icon.rs new file mode 100644 index 00000000..73e5ac4e --- /dev/null +++ b/src/base/component/icon.rs @@ -0,0 +1,134 @@ +use crate::prelude::*; + +const DEFAULT_VIEWBOX: &str = "0 0 16 16"; + +#[derive(AutoDefault)] +pub enum IconKind { + #[default] + None, + Font(FontSize), + Svg { + shapes: Markup, + viewbox: AttrValue, + }, +} + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Icon { + classes : AttrClasses, + icon_kind : IconKind, + aria_label: AttrL10n, +} + +impl Component for Icon { + fn new() -> Self { + Icon::default() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + if !matches!(self.icon_kind(), IconKind::None) { + self.alter_classes(ClassesOp::Prepend, "icon"); + } + if let IconKind::Font(font_size) = self.icon_kind() { + self.alter_classes(ClassesOp::Add, font_size.as_str()); + } + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + match self.icon_kind() { + IconKind::None => PrepareMarkup::None, + IconKind::Font(_) => { + let aria_label = self.aria_label().lookup(cx); + let has_label = aria_label.is_some(); + PrepareMarkup::With(html! { + i + class=[self.classes().get()] + role=[has_label.then_some("img")] + aria-label=[aria_label] + aria-hidden=[(!has_label).then_some("true")] + {} + }) + } + IconKind::Svg { shapes, viewbox } => { + let aria_label = self.aria_label().lookup(cx); + let has_label = aria_label.is_some(); + let viewbox = viewbox.get().unwrap_or_else(|| DEFAULT_VIEWBOX.to_string()); + PrepareMarkup::With(html! { + svg + xmlns="http://www.w3.org/2000/svg" + viewBox=(viewbox) + fill="currentColor" + focusable="false" + class=[self.classes().get()] + role=[has_label.then_some("img")] + aria-label=[aria_label] + aria-hidden=[(!has_label).then_some("true")] + { + (shapes) + } + }) + } + } + } +} + +impl Icon { + pub fn font() -> Self { + Icon::default().with_icon_kind(IconKind::Font(FontSize::default())) + } + + pub fn font_sized(font_size: FontSize) -> Self { + Icon::default().with_icon_kind(IconKind::Font(font_size)) + } + + pub fn svg(shapes: Markup) -> Self { + Icon::default().with_icon_kind(IconKind::Svg { + shapes, + viewbox: AttrValue::default(), + }) + } + + pub fn svg_with_viewbox(shapes: Markup, viewbox: impl AsRef<str>) -> Self { + Icon::default().with_icon_kind(IconKind::Svg { + shapes, + viewbox: AttrValue::new(viewbox), + }) + } + + // **< Icon BUILDER >*************************************************************************** + + /// Modifica la lista de clases CSS aplicadas al icono. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + #[builder_fn] + pub fn with_icon_kind(mut self, icon_kind: IconKind) -> Self { + self.icon_kind = icon_kind; + self + } + + #[builder_fn] + pub fn with_aria_label(mut self, label: L10n) -> Self { + self.aria_label.alter_value(label); + self + } + + // **< Icon GETTERS >*************************************************************************** + + /// Devuelve las clases CSS asociadas al icono. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + pub fn icon_kind(&self) -> &IconKind { + &self.icon_kind + } + + pub fn aria_label(&self) -> &AttrL10n { + &self.aria_label + } +} From 67a9b057ee172676934891035305001d921bb81b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 28 Sep 2025 13:47:33 +0200 Subject: [PATCH 799/853] =?UTF-8?q?=F0=9F=9A=A7=20(base):=20A=C3=B1ade=20n?= =?UTF-8?q?uevo=20componente=20`menu`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component.rs | 50 +++++ src/base/component/menu.rs | 17 ++ src/base/component/menu/element.rs | 56 +++++ src/base/component/menu/group.rs | 58 +++++ src/base/component/menu/item.rs | 183 ++++++++++++++++ src/base/component/menu/megamenu.rs | 57 +++++ src/base/component/menu/menu_menu.rs | 106 +++++++++ src/base/component/menu/submenu.rs | 73 +++++++ src/base/theme/basic.rs | 23 +- src/html.rs | 1 + static/css/basic.css | 6 - static/css/components.css | 12 ++ static/css/menu.css | 309 +++++++++++++++++++++++++++ static/css/root.css | 211 ++++++++++++++++++ static/js/menu.js | 94 ++++++++ 15 files changed, 1249 insertions(+), 7 deletions(-) create mode 100644 src/base/component/menu.rs create mode 100644 src/base/component/menu/element.rs create mode 100644 src/base/component/menu/group.rs create mode 100644 src/base/component/menu/item.rs create mode 100644 src/base/component/menu/megamenu.rs create mode 100644 src/base/component/menu/menu_menu.rs create mode 100644 src/base/component/menu/submenu.rs create mode 100644 static/css/components.css create mode 100644 static/css/menu.css create mode 100644 static/css/root.css create mode 100644 static/js/menu.js diff --git a/src/base/component.rs b/src/base/component.rs index 5bbe746d..4edfc9a9 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -1,5 +1,53 @@ //! Componentes nativos proporcionados por PageTop. +use crate::AutoDefault; + +use std::fmt; + +// **< FontSize >*********************************************************************************** + +#[derive(AutoDefault)] +pub enum FontSize { + ExtraLarge, + XxLarge, + XLarge, + Large, + Medium, + #[default] + Normal, + Small, + XSmall, + XxSmall, + ExtraSmall, +} + +#[rustfmt::skip] +impl FontSize { + #[inline] + pub const fn as_str(&self) -> &'static str { + match self { + FontSize::ExtraLarge => "fs__x3l", + FontSize::XxLarge => "fs__x2l", + FontSize::XLarge => "fs__xl", + FontSize::Large => "fs__l", + FontSize::Medium => "fs__m", + FontSize::Normal => "", + FontSize::Small => "fs__s", + FontSize::XSmall => "fs__xs", + FontSize::XxSmall => "fs__x2s", + FontSize::ExtraSmall => "fs__x3s", + } + } +} + +impl fmt::Display for FontSize { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.as_str()) + } +} + +// ************************************************************************************************* + mod html; pub use html::Html; @@ -11,3 +59,5 @@ pub use poweredby::PoweredBy; mod icon; pub use icon::{Icon, IconKind}; + +pub mod menu; diff --git a/src/base/component/menu.rs b/src/base/component/menu.rs new file mode 100644 index 00000000..14f75898 --- /dev/null +++ b/src/base/component/menu.rs @@ -0,0 +1,17 @@ +mod menu_menu; +pub use menu_menu::Menu; + +mod item; +pub use item::{Item, ItemKind}; + +mod submenu; +pub use submenu::Submenu; + +mod megamenu; +pub use megamenu::Megamenu; + +mod group; +pub use group::Group; + +mod element; +pub use element::{Element, ElementType}; diff --git a/src/base/component/menu/element.rs b/src/base/component/menu/element.rs new file mode 100644 index 00000000..6d142048 --- /dev/null +++ b/src/base/component/menu/element.rs @@ -0,0 +1,56 @@ +use crate::prelude::*; + +type Content = Typed<Html>; +type SubmenuItems = Typed<menu::Submenu>; + +#[derive(AutoDefault)] +pub enum ElementType { + #[default] + Void, + Html(Content), + Submenu(SubmenuItems), +} + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Element { + element_type: ElementType, +} + +impl Component for Element { + fn new() -> Self { + Element::default() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + match self.element_type() { + ElementType::Void => PrepareMarkup::None, + ElementType::Html(content) => PrepareMarkup::With(html! { + (content.render(cx)) + }), + ElementType::Submenu(submenu) => PrepareMarkup::With(html! { + (submenu.render(cx)) + }), + } + } +} + +impl Element { + pub fn html(content: Html) -> Self { + Element { + element_type: ElementType::Html(Content::with(content)), + } + } + + pub fn submenu(submenu: menu::Submenu) -> Self { + Element { + element_type: ElementType::Submenu(SubmenuItems::with(submenu)), + } + } + + // **< Element GETTERS >************************************************************************ + + pub fn element_type(&self) -> &ElementType { + &self.element_type + } +} diff --git a/src/base/component/menu/group.rs b/src/base/component/menu/group.rs new file mode 100644 index 00000000..41279b4e --- /dev/null +++ b/src/base/component/menu/group.rs @@ -0,0 +1,58 @@ +use crate::prelude::*; + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Group { + id : AttrId, + elements: Children, +} + +impl Component for Group { + fn new() -> Self { + Group::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class="menu-group" { + (self.elements().render(cx)) + } + }) + } +} + +impl Group { + // **< Group BUILDER >************************************************************************** + + /// Establece el identificador único (`id`) del grupo. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Añade un nuevo elemento al menú. + pub fn add_element(mut self, element: menu::Element) -> Self { + self.elements + .alter_typed(TypedOp::Add(Typed::with(element))); + self + } + + /// Modifica la lista de elementos (`children`) aplicando una operación [`TypedOp`]. + #[builder_fn] + pub fn with_elements(mut self, op: TypedOp<menu::Element>) -> Self { + self.elements.alter_typed(op); + self + } + + // **< Group GETTERS >************************************************************************** + + /// Devuelve la lista de elementos (`children`) del grupo. + pub fn elements(&self) -> &Children { + &self.elements + } +} diff --git a/src/base/component/menu/item.rs b/src/base/component/menu/item.rs new file mode 100644 index 00000000..07d629ae --- /dev/null +++ b/src/base/component/menu/item.rs @@ -0,0 +1,183 @@ +use crate::prelude::*; + +//use super::{Megamenu, Submenu}; + +type Label = L10n; +type Content = Typed<Html>; +type SubmenuItems = Typed<menu::Submenu>; +//type MegamenuGroups = Typed<Megamenu>; + +#[derive(AutoDefault)] +pub enum ItemKind { + #[default] + Void, + Label(Label), + Link(Label, FnPathByContext), + LinkBlank(Label, FnPathByContext), + Html(Content), + Submenu(Label, SubmenuItems), + // Megamenu(Label, MegamenuGroups), +} + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Item { + item_kind : ItemKind, + description: AttrL10n, + left_icon : Typed<Icon>, + right_icon : Typed<Icon>, +} + +impl Component for Item { + fn new() -> Self { + Item::default() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let description = self.description().lookup(cx); + let left_icon = self.left_icon().render(cx); + let right_icon = self.right_icon().render(cx); + + match self.item_kind() { + ItemKind::Void => PrepareMarkup::None, + ItemKind::Label(label) => PrepareMarkup::With(html! { + li class="menu__label" { + span title=[description] { + (left_icon) + (label.using(cx)) + (right_icon) + } + } + }), + ItemKind::Link(label, path) => PrepareMarkup::With(html! { + li class="menu__link" { + a href=(path(cx)) title=[description] { + (left_icon) + (label.using(cx)) + (right_icon) + } + } + }), + ItemKind::LinkBlank(label, path) => PrepareMarkup::With(html! { + li class="menu__link" { + a href=(path(cx)) title=[description] target="_blank" { + (left_icon) + (label.using(cx)) + (right_icon) + } + } + }), + ItemKind::Html(content) => PrepareMarkup::With(html! { + li class="menu__html" { + (content.render(cx)) + } + }), + ItemKind::Submenu(label, submenu) => PrepareMarkup::With(html! { + li class="menu__children" { + a href="#" title=[description] { + (left_icon) + (label.using(cx)) i class="menu__icon bi-chevron-down" {} + } + div class="menu__subs" { + (submenu.render(cx)) + } + } + }), + /* + ItemKind::Megamenu(label, megamenu) => PrepareMarkup::With(html! { + li class="menu__children" { + a href="#" title=[description] { + (left_icon) + (label.escaped(cx.langid())) i class="menu__icon bi-chevron-down" {} + } + div class="menu__subs menu__mega" { + (megamenu.render(cx)) + } + } + }), + */ + } + } +} + +impl Item { + pub fn label(label: L10n) -> Self { + Item { + item_kind: ItemKind::Label(label), + ..Default::default() + } + } + + pub fn link(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::Link(label, path), + ..Default::default() + } + } + + pub fn link_blank(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::LinkBlank(label, path), + ..Default::default() + } + } + + pub fn html(content: Html) -> Self { + Item { + item_kind: ItemKind::Html(Content::with(content)), + ..Default::default() + } + } + + pub fn submenu(label: L10n, submenu: menu::Submenu) -> Self { + Item { + item_kind: ItemKind::Submenu(label, SubmenuItems::with(submenu)), + ..Default::default() + } + } + /* + pub fn megamenu(label: L10n, megamenu: Megamenu) -> Self { + Item { + item_kind: ItemKind::Megamenu(label, MegamenuGroups::with(megamenu)), + ..Default::default() + } + } + */ + // **< Item BUILDER >*************************************************************************** + + #[builder_fn] + pub fn with_description(mut self, text: L10n) -> Self { + self.description.alter_value(text); + self + } + + #[builder_fn] + pub fn with_left_icon<I: Into<Icon>>(mut self, icon: Option<I>) -> Self { + self.left_icon.alter_component(icon.map(Into::into)); + self + } + + #[builder_fn] + pub fn with_right_icon<I: Into<Icon>>(mut self, icon: Option<I>) -> Self { + self.right_icon.alter_component(icon.map(Into::into)); + self + } + + // **< Item GETTERS >*************************************************************************** + + pub fn item_kind(&self) -> &ItemKind { + &self.item_kind + } + + pub fn description(&self) -> &AttrL10n { + &self.description + } + + pub fn left_icon(&self) -> &Typed<Icon> { + &self.left_icon + } + + pub fn right_icon(&self) -> &Typed<Icon> { + &self.right_icon + } +} diff --git a/src/base/component/menu/megamenu.rs b/src/base/component/menu/megamenu.rs new file mode 100644 index 00000000..f22b184e --- /dev/null +++ b/src/base/component/menu/megamenu.rs @@ -0,0 +1,57 @@ +use crate::prelude::*; + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Megamenu { + id : AttrId, + groups: Children, +} + +impl Component for Megamenu { + fn new() -> Self { + Megamenu::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class="menu__groups" { + (self.groups().render(cx)) + } + }) + } +} + +impl Megamenu { + // **< Megamenu BUILDER >*********************************************************************** + + /// Establece el identificador único (`id`) del megamenú. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Añade un nuevo grupo al menú. + pub fn add_group(mut self, group: menu::Group) -> Self { + self.groups.alter_typed(TypedOp::Add(Typed::with(group))); + self + } + + /// Modifica la lista de grupos (`children`) aplicando una operación [`TypedOp`]. + #[builder_fn] + pub fn with_groups(mut self, op: TypedOp<menu::Group>) -> Self { + self.groups.alter_typed(op); + self + } + + // **< Megamenu GETTERS >*********************************************************************** + + /// Devuelve la lista de grupos (`children`) del megamenú. + pub fn groups(&self) -> &Children { + &self.groups + } +} diff --git a/src/base/component/menu/menu_menu.rs b/src/base/component/menu/menu_menu.rs new file mode 100644 index 00000000..a7f91be1 --- /dev/null +++ b/src/base/component/menu/menu_menu.rs @@ -0,0 +1,106 @@ +use crate::prelude::*; + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Menu { + id : AttrId, + classes: AttrClasses, + items : Children, +} + +impl Component for Menu { + fn new() -> Self { + Menu::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes(ClassesOp::Prepend, "menu"); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + // cx.set_param::<bool>(PARAM_BASE_INCLUDE_MENU_ASSETS, &true); + // cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, &true); + + PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] { + div class="menu__wrapper" { + div class="menu__panel" { + div class="menu__overlay" {} + nav class="menu__nav" { + div class="menu__header" { + button type="button" class="menu__back" { + (Icon::svg(html! { + path fill-rule="evenodd" 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" {} + }).render(cx)) + } + div class="menu__title" {} + button type="button" class="menu__close" { + (Icon::svg(html! { + path d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z" {} + }).render(cx)) + } + } + ul class="menu__list" { + (self.items().render(cx)) + } + } + } + button + type="button" + class="menu__trigger" + title=[L10n::l("menu_toggle").lookup(cx)] + { + span {} span {} span {} + } + } + } + }) + } +} + +impl Menu { + // **< Menu BUILDER >*************************************************************************** + + /// Establece el identificador único (`id`) del menú. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al menú. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Añade un nuevo ítem al menú. + pub fn add_item(mut self, item: menu::Item) -> Self { + self.items.alter_typed(TypedOp::Add(Typed::with(item))); + self + } + + /// Modifica la lista de ítems (`children`) aplicando una operación [`TypedOp`]. + #[builder_fn] + pub fn with_items(mut self, op: TypedOp<menu::Item>) -> Self { + self.items.alter_typed(op); + self + } + + // **< Menu GETTERS >*************************************************************************** + + /// Devuelve las clases CSS asociadas al menú. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve la lista de ítems (`children`) del menú. + pub fn items(&self) -> &Children { + &self.items + } +} diff --git a/src/base/component/menu/submenu.rs b/src/base/component/menu/submenu.rs new file mode 100644 index 00000000..58770529 --- /dev/null +++ b/src/base/component/menu/submenu.rs @@ -0,0 +1,73 @@ +use crate::prelude::*; + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Submenu { + id : AttrId, + title: AttrL10n, + items: Children, +} + +impl Component for Submenu { + fn new() -> Self { + Submenu::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + div id=[self.id()] class="menu__items" { + @if let Some(title) = self.title().lookup(cx) { + h4 class="menu__title" { (title) } + } + ul { + (self.items().render(cx)) + } + } + }) + } +} + +impl Submenu { + // **< Submenu BUILDER >************************************************************************ + + /// Establece el identificador único (`id`) del submenú. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + #[builder_fn] + pub fn with_title(mut self, title: L10n) -> Self { + self.title.alter_value(title); + self + } + + /// Añade un nuevo ítem al submenú. + pub fn add_item(mut self, item: menu::Item) -> Self { + self.items.alter_typed(TypedOp::Add(Typed::with(item))); + self + } + + /// Modifica la lista de ítems (`children`) aplicando una operación [`TypedOp`]. + #[builder_fn] + pub fn with_items(mut self, op: TypedOp<menu::Item>) -> Self { + self.items.alter_typed(op); + self + } + + // **< Submenu GETTERS >************************************************************************ + + pub fn title(&self) -> &AttrL10n { + &self.title + } + + /// Devuelve la lista de ítems (`children`) del submenú. + pub fn items(&self) -> &Children { + &self.items + } +} diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 2f492748..20f51994 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -51,14 +51,35 @@ impl Theme for Basic { "PageTopIntro" => "/css/intro.css", _ => "/css/basic.css", }; + let pkg_version = env!("CARGO_PKG_VERSION"); page.alter_assets(AssetsOp::AddStyleSheet( StyleSheet::from("/css/normalize.css") .with_version("8.0.1") .with_weight(-99), )) + .alter_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/css/root.css") + .with_version(pkg_version) + .with_weight(-99), + )) + .alter_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/css/components.css") + .with_version(pkg_version) + .with_weight(-99), + )) + .alter_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/css/menu.css") + .with_version(pkg_version) + .with_weight(-99), + )) .alter_assets(AssetsOp::AddStyleSheet( StyleSheet::from(styles) - .with_version(env!("CARGO_PKG_VERSION")) + .with_version(pkg_version) + .with_weight(-99), + )) + .alter_assets(AssetsOp::AddJavaScript( + JavaScript::defer("/js/menu.js") + .with_version(pkg_version) .with_weight(-99), )); } diff --git a/src/html.rs b/src/html.rs index b6815ece..c4195a9d 100644 --- a/src/html.rs +++ b/src/html.rs @@ -15,6 +15,7 @@ pub use assets::{Asset, Assets}; mod context; pub use context::{AssetsOp, Context, Contextual, ErrorParam}; +pub type FnPathByContext = fn(cx: &Context) -> &str; // **< HTML ATTRIBUTES >**************************************************************************** diff --git a/static/css/basic.css b/static/css/basic.css index 312ddf09..04801dd0 100644 --- a/static/css/basic.css +++ b/static/css/basic.css @@ -3,9 +3,3 @@ .region--footer { padding-bottom: 2rem; } - -/* PoweredBy component */ - -.poweredby { - text-align: center; -} diff --git a/static/css/components.css b/static/css/components.css new file mode 100644 index 00000000..ec5d3f00 --- /dev/null +++ b/static/css/components.css @@ -0,0 +1,12 @@ +/* Icon component */ + +.icon { + width: 1rem; + height: 1rem; +} + +/* PoweredBy component */ + +.poweredby { + text-align: center; +} diff --git a/static/css/menu.css b/static/css/menu.css new file mode 100644 index 00000000..a8b2854c --- /dev/null +++ b/static/css/menu.css @@ -0,0 +1,309 @@ +.menu { + width: 100%; + height: auto; + margin: 0; + padding: 0; + z-index: 9999; + border: none; + outline: none; + background: var(--val-menu--color-bg); +} + +.menu__wrapper { + padding-right: var(--val-gap); +} +.menu__wrapper a, +.menu__wrapper button { + cursor: pointer; + border: none; + background: none; + text-decoration: none; +} + +.menu__nav ul { + margin: 0; + padding: 0; +} +.menu__nav li { + display: inline-block; + margin: 0 0 0 1.5rem; + padding: var(--val-menu--line-padding) 0; + line-height: var(--val-menu--line-height); + list-style: none; + list-style-type: none; +} + +.menu__nav li.menu__label, +.menu__nav li > a { + position: relative; + font-weight: 500; + color: var(--val-color--text); + text-rendering: optimizeLegibility; +} +.menu__nav li > a { + border: none; + transition: color 0.3s ease-in-out; +} +.menu__nav li:hover > a, +.menu__nav li > a:focus { + color: var(--val-menu--color-highlight); +} +.menu__nav li > a > i.menu__icon { + margin-left: 0.25rem; +} + +.menu__nav li .menu__subs { + position: absolute; + max-width: 100%; + height: auto; + padding: 1rem 2rem; + border: none; + outline: none; + background: var(--val-menu--color-bg); + border-radius: var(--val-menu--border-radius); + border-top: 3px solid var(--val-menu--color-highlight); + z-index: 500; + opacity: 0; + visibility: hidden; + box-shadow: 0 4px 6px -1px var(--val-menu--color-border), 0 2px 4px -1px var(--val-menu--color-shadow); + transition: all 0.5s ease-in-out; +} + +.menu__nav li.menu__children:hover > .menu__subs, +.menu__nav li.menu__children > a:focus + .menu__subs, +.menu__nav li.menu__children .menu__subs:focus-within { + margin-top: 0.4rem; + opacity: 1; + visibility: visible; +} + +.menu__nav li .menu__items { + min-width: var(--val-menu--item-width-min); + max-width: var(--val-menu--item-width-max); +} +.menu__nav li .menu__items .menu__title { + font-family: inherit; + font-size: 1rem; + font-weight: 500; + margin: 0; + padding: var(--val-menu--line-padding) 0; + line-height: var(--val-menu--line-height); + border: none; + outline: none; + color: var(--val-menu--color-highlight); + text-transform: uppercase; + text-rendering: optimizeLegibility; +} +.menu__nav li .menu__items li { + display: block; + margin-left: 0; +} + +.menu__nav li .menu__mega { + left: 50%; + transform: translateX(-50%); +} + +.menu__nav li .menu__groups { + display: flex; + flex-wrap: nowrap; +} + +.menu__header, +.menu__trigger { + display: none; +} + +/* Applies <= 992px */ +@media only screen and (max-width: 62rem) { + .menu { + border-radius: var(--val-border-radius); + } + .menu__wrapper { + padding-right: var(--val-gap-0-5); + } + .menu__wrapper button { + margin: var(--val-gap-0-5) 0 var(--val-gap-0-5) var(--val-gap-0-5); + } + .menu__trigger { + cursor: pointer; + width: var(--val-menu--trigger-width); + height: var(--val-menu--item-height); + border: none; + outline: none; + background: none; + display: flex; + flex-direction: column; + justify-content: center; + } + .menu__trigger span { + width: 100%; + height: 2px; + margin: 12.675% 0; + border-radius: var(--val-border-radius); + background: var(--val-color--text); + } + + .menu__nav { + position: fixed; + top: 0; + left: 0; + width: var(--val-menu--side-width); + height: 100%; + z-index: 9099; + overflow: hidden; + background: var(--val-menu--color-bg); + transform: translate(-100%); + transition: all 0.5s ease-in-out; + } + .menu__panel .menu__nav.active { + transform: translate(0%); + } + + .menu__nav li { + display: block; + margin: 0; + padding: 0; + } + .menu__nav li.menu__label, + .menu__nav li > a { + display: block; + padding: var(--val-menu--line-padding) var(--val-menu--item-height) var(--val-menu--line-padding) var(--val-menu--item-gap); + border-bottom: 1px solid var(--val-menu--color-border); + } + .menu__nav li ul li.menu__label, + .menu__nav li ul li > a { + border-bottom: 0; + } + .menu__nav li > a > i.menu__icon { + position: absolute; + top: var(--val-menu--line-padding); + right: var(--val-menu--line-padding); + font-size: 1.25rem; + transform: rotate(-90deg); + } + + .menu__nav li .menu__subs { + position: absolute; + display: none; + top: 0; + left: 0; + max-width: none; + min-width: auto; + width: 100%; + height: 100%; + margin: 0 !important; + padding: 0; + border-top: 0; + opacity: 1; + overflow-y: auto; + visibility: visible; + transform: translateX(0%); + box-shadow: none; + } + .menu__nav li .menu__subs.active { + display: block; + } + .menu__nav li .menu__subs > :first-child { + margin-top: 4rem; + } + + .menu__nav li .menu__items .menu__title { + padding: var(--val-menu--line-padding) var(--val-menu--item-height) var(--val-menu--line-padding) var(--val-menu--item-gap); + } + + .menu__nav li .menu__groups { + display: block; + } + + .menu__nav .menu__header { + position: sticky; + display: flex; + align-items: center; + justify-content: space-between; + top: 0; + height: var(--val-menu--item-height); + border-bottom: 1px solid var(--val-menu--color-border); + background: var(--val-menu--color-bg); + z-index: 501; + } + .menu__nav .menu__header .menu__title { + padding: var(--val-menu--line-padding); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .menu__nav .menu__header .menu__close, + .menu__nav .menu__header .menu__back { + width: var(--val-menu--item-height); + min-width: var(--val-menu--item-height); + height: var(--val-menu--item-height); + line-height: var(--val-menu--item-height); + color: var(--val-color--text); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + } + .menu__nav .menu__header .menu__close { + font-size: 2.25rem; + border-left: 1px solid var(--val-menu--color-border); + } + .menu__nav .menu__header .menu__back { + font-size: 1.25rem; + border-right: 1px solid var(--val-menu--color-border); + display: none; + } + .menu__nav .menu__header.active .menu__back { + display: flex; + } + + .menu__nav .menu__list { + height: 100%; + overflow-y: auto; + overflow-x: hidden; + padding: 0; + margin: 0; + } + + .menu__overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9098; + opacity: 0; + visibility: hidden; + background: rgba(0, 0, 0, 0.55); + transition: all 0.5s ease-in-out; + } + .menu__overlay.active { + opacity: 1; + visibility: visible; + } +} + +/* ANIMATIONS */ + +@keyframes slideLeft { + 0% { + opacity: 0; + transform: translateX(100%); + } + 100% { + opacity: 1; + transform: translateX(0%); + } +} + +@keyframes slideRight { + 0% { + opacity: 1; + transform: translateX(0%); + } + 100% { + opacity: 0; + transform: translateX(100%); + } +} diff --git a/static/css/root.css b/static/css/root.css new file mode 100644 index 00000000..bc55a443 --- /dev/null +++ b/static/css/root.css @@ -0,0 +1,211 @@ +:root { + --val-font-sans: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; + --val-font-serif: "Lora","georgia",serif; + --val-font-monospace: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace; + --val-font-family: var(--val-font-sans); + + /* Font size */ + --val-fs--x3l: 2.5rem; + --val-fs--x2l: 2rem; + --val-fs--xl: 1.75rem; + --val-fs--l: 1.5rem; + --val-fs--m: 1.25rem; + --val-fs--base: 1rem; + --val-fs--s: 0.875rem; + --val-fs--xs: 0.75rem; + --val-fs--x2s: 0.5625rem; + --val-fs--x3s: 0.375rem; + + /* Font weight */ + --val-fw--light: 300; + --val-fw--base: 400; + --val-fw--bold: 500; + + /* Line height */ + --val-lh--base: 1.5; + --val-lh--header: 1.2; + + --val-max-width: 90rem; +/* + --val-color-rgb: 33,37,41; + --val-main--bg-rgb: 255,255,255; + --val-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + + --line-height-base: 1.6875rem; + --line-height-s: 1.125rem; + --max-bg-color: 98.125rem; +*/ + --val-gap: 1.125rem; +/* + --content-left: 5.625rem; + --site-header-height-wide: var(--val-gap10); + --container-padding: var(--val-gap); +*/ +} +/* +@media (min-width: 75rem) { + :root { + --container-padding:var(--val-gap2); + } +} + +:root { + --scrollbar-width: 0px; + --grid-col-count: 6; + --grid-gap: var(--val-gap); + --grid-gap-count: calc(var(--grid-col-count) - 1); + --grid-full-width: calc(100vw - var(--val-gap2) - var(--scrollbar-width)); + --grid-col-width: calc((var(--grid-full-width) - (var(--grid-gap-count) * var(--grid-gap))) / var(--grid-col-count)); +} + +@media (min-width: 43.75rem) { + :root { + --grid-col-count:14; + --grid-gap: var(--val-gap2); + } +} + +@media (min-width: 62.5rem) { + :root { + --scrollbar-width:0.9375rem; + } +} + +@media (min-width: 75rem) { + :root { + --grid-full-width:calc(100vw - var(--scrollbar-width) - var(--content-left) - var(--val-gap4)); + } +} + +@media (min-width: 90rem) { + :root { + --grid-full-width:calc(var(--max-width) - var(--val-gap4)); + } +} +*/ +:root { + --val-gap-0-15: calc(0.15 * var(--val-gap)); + --val-gap-0-25: calc(0.25 * var(--val-gap)); + --val-gap-0-35: calc(0.35 * var(--val-gap)); + --val-gap-0-5: calc(0.5 * var(--val-gap)); + --val-gap-0-75: calc(0.75 * var(--val-gap)); + --val-gap-1-5: calc(1.5 * var(--val-gap)); + --val-gap-2: calc(2 * var(--val-gap)); + + --primary-hue: 216; + --primary-sat: 60%; + --val-color--primary: hsl(var(--primary-hue), var(--primary-sat), 50%); + --val-color--primary-light: hsl(var(--primary-hue), var(--primary-sat), 60%); + --val-color--primary-dark: hsl(var(--primary-hue), var(--primary-sat), 40%); + --val-color--primary-link: hsl(var(--primary-hue), var(--primary-sat), 55%); + --val-color--primary-link-hover: hsl(var(--primary-hue), var(--primary-sat), 30%); + --val-color--primary-link-active: hsl(var(--primary-hue), var(--primary-sat), 70%); + + --info-hue: 190; + --info-sat: 90%; + --val-color--info: hsl(var(--info-hue), var(--info-sat), 54%); + --val-color--info-light: hsl(var(--info-hue), var(--info-sat), 70%); + --val-color--info-dark: hsl(var(--info-hue), var(--info-sat), 45%); + --val-color--info-link: hsl(var(--info-hue), var(--info-sat), 30%); + --val-color--info-link-hover: hsl(var(--info-hue), var(--info-sat), 20%); + --val-color--info-link-active: hsl(var(--info-hue), var(--info-sat), 40%); + + --success-hue: 150; + --success-sat: 50%; + --val-color--success: hsl(var(--success-hue), var(--success-sat), 50%); + --val-color--success-light: hsl(var(--success-hue), var(--success-sat), 68%); + --val-color--success-dark: hsl(var(--success-hue), var(--success-sat), 38%); + --val-color--success-link: hsl(var(--success-hue), var(--success-sat), 26%); + --val-color--success-link-hover: hsl(var(--success-hue), var(--success-sat), 18%); + --val-color--success-link-active: hsl(var(--success-hue), var(--success-sat), 36%); + + --warning-hue: 44; + --warning-sat: 100%; + --val-color--warning: hsl(var(--warning-hue), var(--warning-sat), 50%); + --val-color--warning-light: hsl(var(--warning-hue), var(--warning-sat), 60%); + --val-color--warning-dark: hsl(var(--warning-hue), var(--warning-sat), 40%); + --val-color--warning-link: hsl(var(--warning-hue), var(--warning-sat), 30%); + --val-color--warning-link-hover: hsl(var(--warning-hue), var(--warning-sat), 20%); + --val-color--warning-link-active: hsl(var(--warning-hue), var(--warning-sat), 38%); + + --danger-hue: 348; + --danger-sat: 86%; + --val-color--danger: hsl(var(--danger-hue), var(--danger-sat), 50%); + --val-color--danger-light: hsl(var(--danger-hue), var(--danger-sat), 60%); + --val-color--danger-dark: hsl(var(--danger-hue), var(--danger-sat), 35%); + --val-color--danger-link: hsl(var(--danger-hue), var(--danger-sat), 25%); + --val-color--danger-link-hover: hsl(var(--danger-hue), var(--danger-sat), 10%); + --val-color--danger-link-active: hsl(var(--danger-hue), var(--danger-sat), 30%); + + --light-hue: 0; + --light-sat: 0%; + --val-color--light: hsl(var(--light-hue), var(--light-sat), 96%); + --val-color--light-light: hsl(var(--light-hue), var(--light-sat), 98%); + --val-color--light-dark: hsl(var(--light-hue), var(--light-sat), 92%); + + --dark-hue: 0; + --dark-sat: 0%; + --val-color--dark: hsl(var(--dark-hue), var(--dark-sat), 25%); + --val-color--dark-light: hsl(var(--dark-hue), var(--dark-sat), 40%); + --val-color--dark-dark: hsl(var(--dark-hue), var(--dark-sat), 8%); + --val-color--dark-link: hsl(var(--dark-hue), var(--dark-sat), 90%); + --val-color--dark-link-hover: hsl(var(--dark-hue), var(--dark-sat), 100%); + --val-color--dark-link-active: hsl(var(--dark-hue), var(--dark-sat), 70%); + + + + + --gray-hue: 201; + --gray-sat: 15%; + --val-color--gray-5: hsl(var(--gray-hue), var(--gray-sat), 5%); + --val-color--gray-10: hsl(var(--gray-hue), var(--gray-sat) ,11%); + --val-color--gray-20: hsl(var(--gray-hue), var(--gray-sat),20%); + --val-color--gray-45: hsl(var(--gray-hue), var(--gray-sat), 44%); + --val-color--gray-60: hsl(var(--gray-hue), var(--gray-sat), 57%); + --val-color--gray-65: hsl(var(--gray-hue), var(--gray-sat), 63%); + --val-color--gray-70: hsl(var(--gray-hue), var(--gray-sat), 72%); + --val-color--gray-90: hsl(var(--gray-hue), var(--gray-sat), 88%); + --val-color--gray-95: hsl(var(--gray-hue), var(--gray-sat), 93%); + --val-color--gray-100: hsl(var(--gray-hue), var(--gray-sat), 97%); + + + + + --val-color--bg: #fafafa; + --val-color--text: #212529; + --val-color--white: #fff; + +/* + + + --color-text-neutral-soft: var(--color--gray-45); + --color-text-neutral-medium: var(--color--gray-20); + --color-text-neutral-loud: var(--color--gray-5); + --color-text-primary-medium: var(--val-color--primary-40); + --color-text-primary-loud: var(--val-color--primary-30); + --color--black: #000; +*/ +/* + --color--red: #e33f1e; + --color--gold: #fdca40; + --color--green: #3fa21c; + --header-height-wide-when-fixed: calc(6 * var(--val-gap)); + --mobile-nav-width: 31.25rem; +*/ + --val-border-radius: 0.375rem; + + /* Menu component */ + --val-menu--color-bg: var(--val-color--bg); + --val-menu--color-highlight: #e91e63; + --val-menu--color-border: rgba(0, 0, 0, 0.1); + --val-menu--color-shadow: rgba(0, 0, 0, 0.06); + --val-menu--line-padding: 0.625rem; + --val-menu--line-height: calc(1.875rem + 1px); + --val-menu--item-height: calc(var(--val-menu--line-padding) + var(--val-menu--line-height)); + --val-menu--item-width-min: 14rem; + --val-menu--item-width-max: 20rem; + --val-menu--item-gap: 1rem; + --val-menu--border-radius: 0.625rem; + --val-menu--trigger-width: var(--val-menu--item-height); + --val-menu--side-width: 20rem; +} diff --git a/static/js/menu.js b/static/js/menu.js new file mode 100644 index 00000000..2f3b332e --- /dev/null +++ b/static/js/menu.js @@ -0,0 +1,94 @@ +function menu__showChildren(nav, children) { + let submenu = children[0].querySelector('.menu__subs'); + submenu.classList.add('active'); + submenu.style.animation = 'slideLeft 0.5s ease forwards'; + + let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; + nav.querySelector('.menu__title').innerHTML = title; + nav.querySelector('.menu__header').classList.add('active'); +} + +function menu__hideChildren(nav, children) { + let submenu = children[0].querySelector('.menu__subs'); + submenu.style.animation = 'slideRight 0.5s ease forwards'; + setTimeout(() => { + submenu.classList.remove('active'); + submenu.style.removeProperty('animation'); + }, 300); + + children.shift(); + if (children.length > 0) { + let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; + nav.querySelector('.menu__title').innerHTML = title; + } else { + nav.querySelector('.menu__header').classList.remove('active'); + nav.querySelector('.menu__title').innerHTML = ''; + } +} + +function menu__toggle(nav, overlay) { + nav.classList.toggle('active'); + overlay.classList.toggle('active'); +} + +function menu__reset(menu, nav, overlay) { + menu__toggle(nav, overlay); + setTimeout(() => { + nav.querySelector('.menu__header').classList.remove('active'); + nav.querySelector('.menu__title').innerHTML = ''; + menu.querySelectorAll('.menu__subs').forEach(submenu => { + submenu.classList.remove('active'); + submenu.style.removeProperty('animation'); + }); + }, 300); + return []; +} + +document.querySelectorAll('.menu').forEach(menu => { + + let menuChildren = []; + const menuNav = menu.querySelector('.menu__nav'); + const menuOverlay = menu.querySelector('.menu__overlay'); + + menu.querySelector('.menu__list').addEventListener('click', (e) => { + if (menuNav.classList.contains('active')) { + let target = e.target.closest('.menu__children'); + if (target && target != menuChildren[0]) { + menuChildren.unshift(target); + menu__showChildren(menuNav, menuChildren); + } + } + }); + + menu.querySelector('.menu__back').addEventListener('click', () => { + menu__hideChildren(menuNav, menuChildren); + }); + + menu.querySelector('.menu__close').addEventListener('click', () => { + menuChildren = menu__reset(menu, menuNav, menuOverlay); + }); + + menu.querySelectorAll('.menu__link > a[target="_blank"]').forEach(link => { + link.addEventListener('click', (e) => { + menuChildren = menu__reset(menu, menuNav, menuOverlay); + e.target.blur(); + }); + }); + + menu.querySelector('.menu__trigger').addEventListener('click', () => { + menu__toggle(menuNav, menuOverlay); + }); + + menuOverlay.addEventListener('click', () => { + menu__toggle(menuNav, menuOverlay); + }); + + window.onresize = function () { + if (menuNav.classList.contains('active')) { + var fontSizeRoot = parseFloat(getComputedStyle(document.documentElement).fontSize); + if (this.innerWidth >= 62 * fontSizeRoot) { + menuChildren = menu__reset(menu, menuNav, menuOverlay); + } + } + }; +}); From 0f1296c216e6bd6110edb752f313d9a082775209 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 29 Sep 2025 02:07:10 +0200 Subject: [PATCH 800/853] =?UTF-8?q?=F0=9F=8E=A8=20Mejora=20la=20estructura?= =?UTF-8?q?=20y=20estilos=20del=20men=C3=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rrenombra clases, ajusta estilos CSS y actualiza la lógica de JavaScript para una mejor gestión de submenús. --- src/base/component/menu/group.rs | 2 +- src/base/component/menu/item.rs | 40 ++++++------ src/base/component/menu/megamenu.rs | 2 +- src/base/component/menu/menu_menu.rs | 4 +- src/base/component/menu/submenu.rs | 4 +- static/css/menu.css | 91 +++++++++++++--------------- static/css/root.css | 5 +- static/js/menu.js | 21 ++++--- 8 files changed, 84 insertions(+), 85 deletions(-) diff --git a/src/base/component/menu/group.rs b/src/base/component/menu/group.rs index 41279b4e..ba188934 100644 --- a/src/base/component/menu/group.rs +++ b/src/base/component/menu/group.rs @@ -18,7 +18,7 @@ impl Component for Group { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { - div id=[self.id()] class="menu-group" { + div id=[self.id()] class="menu__group" { (self.elements().render(cx)) } }) diff --git a/src/base/component/menu/item.rs b/src/base/component/menu/item.rs index 07d629ae..7a36fbbf 100644 --- a/src/base/component/menu/item.rs +++ b/src/base/component/menu/item.rs @@ -1,11 +1,9 @@ use crate::prelude::*; -//use super::{Megamenu, Submenu}; - type Label = L10n; type Content = Typed<Html>; type SubmenuItems = Typed<menu::Submenu>; -//type MegamenuGroups = Typed<Megamenu>; +type MegamenuGroups = Typed<menu::Megamenu>; #[derive(AutoDefault)] pub enum ItemKind { @@ -16,7 +14,7 @@ pub enum ItemKind { LinkBlank(Label, FnPathByContext), Html(Content), Submenu(Label, SubmenuItems), - // Megamenu(Label, MegamenuGroups), + Megamenu(Label, MegamenuGroups), } #[rustfmt::skip] @@ -41,61 +39,65 @@ impl Component for Item { match self.item_kind() { ItemKind::Void => PrepareMarkup::None, ItemKind::Label(label) => PrepareMarkup::With(html! { - li class="menu__label" { + li class="menu__item menu__item--label" { span title=[description] { (left_icon) - (label.using(cx)) + span class="menu__label" { (label.using(cx)) } (right_icon) } } }), ItemKind::Link(label, path) => PrepareMarkup::With(html! { - li class="menu__link" { + li class="menu__item menu__item--link" { a href=(path(cx)) title=[description] { (left_icon) - (label.using(cx)) + span class="menu__label" { (label.using(cx)) } (right_icon) } } }), ItemKind::LinkBlank(label, path) => PrepareMarkup::With(html! { - li class="menu__link" { + li class="menu__item menu__item--link" { a href=(path(cx)) title=[description] target="_blank" { (left_icon) - (label.using(cx)) + span class="menu__label" { (label.using(cx)) } (right_icon) } } }), ItemKind::Html(content) => PrepareMarkup::With(html! { - li class="menu__html" { + li class="menu__item menu__item--html" { (content.render(cx)) } }), ItemKind::Submenu(label, submenu) => PrepareMarkup::With(html! { - li class="menu__children" { + li class="menu__item menu__item--children" { a href="#" title=[description] { (left_icon) - (label.using(cx)) i class="menu__icon bi-chevron-down" {} + span class="menu__label" { (label.using(cx)) } + (Icon::svg(html! { + path 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" {} + }).render(cx)) } - div class="menu__subs" { + div class="menu__children menu__children--submenu" { (submenu.render(cx)) } } }), - /* ItemKind::Megamenu(label, megamenu) => PrepareMarkup::With(html! { - li class="menu__children" { + li class="menu__item menu__item--children" { a href="#" title=[description] { (left_icon) - (label.escaped(cx.langid())) i class="menu__icon bi-chevron-down" {} + span class="menu__label" { (label.using(cx)) } + (Icon::svg(html! { + path 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" {} + }).render(cx)) } - div class="menu__subs menu__mega" { + div class="menu__children menu__children--mega" { (megamenu.render(cx)) } } }), - */ } } } diff --git a/src/base/component/menu/megamenu.rs b/src/base/component/menu/megamenu.rs index f22b184e..e435e753 100644 --- a/src/base/component/menu/megamenu.rs +++ b/src/base/component/menu/megamenu.rs @@ -18,7 +18,7 @@ impl Component for Megamenu { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { - div id=[self.id()] class="menu__groups" { + div id=[self.id()] class="menu__mega" { (self.groups().render(cx)) } }) diff --git a/src/base/component/menu/menu_menu.rs b/src/base/component/menu/menu_menu.rs index a7f91be1..58a4c21d 100644 --- a/src/base/component/menu/menu_menu.rs +++ b/src/base/component/menu/menu_menu.rs @@ -54,7 +54,9 @@ impl Component for Menu { class="menu__trigger" title=[L10n::l("menu_toggle").lookup(cx)] { - span {} span {} span {} + (Icon::svg(html! { + path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5" {} + }).render(cx)) } } } diff --git a/src/base/component/menu/submenu.rs b/src/base/component/menu/submenu.rs index 58770529..a5957ef9 100644 --- a/src/base/component/menu/submenu.rs +++ b/src/base/component/menu/submenu.rs @@ -19,9 +19,9 @@ impl Component for Submenu { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { PrepareMarkup::With(html! { - div id=[self.id()] class="menu__items" { + div id=[self.id()] class="menu__submenu" { @if let Some(title) = self.title().lookup(cx) { - h4 class="menu__title" { (title) } + h4 class="menu__submenu-title" { (title) } } ul { (self.items().render(cx)) diff --git a/static/css/menu.css b/static/css/menu.css index a8b2854c..5520e398 100644 --- a/static/css/menu.css +++ b/static/css/menu.css @@ -27,13 +27,13 @@ .menu__nav li { display: inline-block; margin: 0 0 0 1.5rem; - padding: var(--val-menu--line-padding) 0; - line-height: var(--val-menu--line-height); + padding: 0; + line-height: var(--val-menu--item-height); list-style: none; list-style-type: none; } -.menu__nav li.menu__label, +.menu__item--label, .menu__nav li > a { position: relative; font-weight: 500; @@ -48,19 +48,18 @@ .menu__nav li > a:focus { color: var(--val-menu--color-highlight); } -.menu__nav li > a > i.menu__icon { +.menu__nav li > a > svg.icon { margin-left: 0.25rem; } -.menu__nav li .menu__subs { +.menu__children { position: absolute; max-width: 100%; height: auto; - padding: 1rem 2rem; + padding: var(--val-gap-0-5) var(--val-gap-1-5); border: none; outline: none; background: var(--val-menu--color-bg); - border-radius: var(--val-menu--border-radius); border-top: 3px solid var(--val-menu--color-highlight); z-index: 500; opacity: 0; @@ -69,19 +68,19 @@ transition: all 0.5s ease-in-out; } -.menu__nav li.menu__children:hover > .menu__subs, -.menu__nav li.menu__children > a:focus + .menu__subs, -.menu__nav li.menu__children .menu__subs:focus-within { +.menu__item--children:hover > .menu__children, +.menu__item--children > a:focus + .menu__children, +.menu__item--children .menu__children:focus-within { margin-top: 0.4rem; opacity: 1; visibility: visible; } -.menu__nav li .menu__items { +.menu__submenu { min-width: var(--val-menu--item-width-min); max-width: var(--val-menu--item-width-max); } -.menu__nav li .menu__items .menu__title { +.menu__submenu-title { font-family: inherit; font-size: 1rem; font-weight: 500; @@ -94,17 +93,17 @@ text-transform: uppercase; text-rendering: optimizeLegibility; } -.menu__nav li .menu__items li { +.menu__submenu li { display: block; - margin-left: 0; + margin: 0; } -.menu__nav li .menu__mega { +.menu__children--mega { left: 50%; transform: translateX(-50%); } -.menu__nav li .menu__groups { +.menu__mega { display: flex; flex-wrap: nowrap; } @@ -116,15 +115,9 @@ /* Applies <= 992px */ @media only screen and (max-width: 62rem) { - .menu { - border-radius: var(--val-border-radius); - } .menu__wrapper { padding-right: var(--val-gap-0-5); } - .menu__wrapper button { - margin: var(--val-gap-0-5) 0 var(--val-gap-0-5) var(--val-gap-0-5); - } .menu__trigger { cursor: pointer; width: var(--val-menu--trigger-width); @@ -136,14 +129,10 @@ flex-direction: column; justify-content: center; } - .menu__trigger span { - width: 100%; - height: 2px; - margin: 12.675% 0; - border-radius: var(--val-border-radius); - background: var(--val-color--text); + .menu__trigger svg.icon { + width: 2rem; + height: 2rem; } - .menu__nav { position: fixed; top: 0; @@ -156,34 +145,36 @@ transform: translate(-100%); transition: all 0.5s ease-in-out; } - .menu__panel .menu__nav.active { + .menu__nav.active { transform: translate(0%); } .menu__nav li { display: block; margin: 0; - padding: 0; + line-height: var(--val-menu--line-height); } - .menu__nav li.menu__label, + + .menu__item--label, .menu__nav li > a { display: block; padding: var(--val-menu--line-padding) var(--val-menu--item-height) var(--val-menu--line-padding) var(--val-menu--item-gap); border-bottom: 1px solid var(--val-menu--color-border); } - .menu__nav li ul li.menu__label, + .menu__nav li ul li.menu__item--label, .menu__nav li ul li > a { border-bottom: 0; } - .menu__nav li > a > i.menu__icon { + .menu__nav li > a > svg.icon { position: absolute; top: var(--val-menu--line-padding); right: var(--val-menu--line-padding); + height: var(--val-menu--line-height); font-size: 1.25rem; transform: rotate(-90deg); } - .menu__nav li .menu__subs { + .menu__children { position: absolute; display: none; top: 0; @@ -201,22 +192,22 @@ transform: translateX(0%); box-shadow: none; } - .menu__nav li .menu__subs.active { + .menu__children.active { display: block; } - .menu__nav li .menu__subs > :first-child { - margin-top: 4rem; + .menu__children > :first-child { + margin-top: 2.675rem; } - .menu__nav li .menu__items .menu__title { + .menu__submenu-title { padding: var(--val-menu--line-padding) var(--val-menu--item-height) var(--val-menu--line-padding) var(--val-menu--item-gap); } - .menu__nav li .menu__groups { + .menu__mega { display: block; } - .menu__nav .menu__header { + .menu__header { position: sticky; display: flex; align-items: center; @@ -227,14 +218,14 @@ background: var(--val-menu--color-bg); z-index: 501; } - .menu__nav .menu__header .menu__title { + .menu__title { padding: var(--val-menu--line-padding); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } - .menu__nav .menu__header .menu__close, - .menu__nav .menu__header .menu__back { + .menu__close, + .menu__back { width: var(--val-menu--item-height); min-width: var(--val-menu--item-height); height: var(--val-menu--item-height); @@ -245,20 +236,20 @@ align-items: center; justify-content: center; } - .menu__nav .menu__header .menu__close { + .menu__close { font-size: 2.25rem; - border-left: 1px solid var(--val-menu--color-border); + border-left: 1px solid var(--val-menu--color-border) !important; } - .menu__nav .menu__header .menu__back { + .menu__back { font-size: 1.25rem; - border-right: 1px solid var(--val-menu--color-border); + border-right: 1px solid var(--val-menu--color-border) !important; display: none; } - .menu__nav .menu__header.active .menu__back { + .menu__header.active .menu__back { display: flex; } - .menu__nav .menu__list { + .menu__list { height: 100%; overflow-y: auto; overflow-x: hidden; diff --git a/static/css/root.css b/static/css/root.css index bc55a443..aeab1c67 100644 --- a/static/css/root.css +++ b/static/css/root.css @@ -191,6 +191,8 @@ --color--green: #3fa21c; --header-height-wide-when-fixed: calc(6 * var(--val-gap)); --mobile-nav-width: 31.25rem; + + --val-menu--border-radius: 0.625rem; */ --val-border-radius: 0.375rem; @@ -205,7 +207,6 @@ --val-menu--item-width-min: 14rem; --val-menu--item-width-max: 20rem; --val-menu--item-gap: 1rem; - --val-menu--border-radius: 0.625rem; - --val-menu--trigger-width: var(--val-menu--item-height); + --val-menu--trigger-width: 2.675rem; --val-menu--side-width: 20rem; } diff --git a/static/js/menu.js b/static/js/menu.js index 2f3b332e..6b5ae1b0 100644 --- a/static/js/menu.js +++ b/static/js/menu.js @@ -1,15 +1,17 @@ function menu__showChildren(nav, children) { - let submenu = children[0].querySelector('.menu__subs'); + const li = children[0]; + const submenu = li.querySelector('.menu__children'); submenu.classList.add('active'); submenu.style.animation = 'slideLeft 0.5s ease forwards'; - let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; + const labelEl = li.querySelector('.menu__label'); + const title = labelEl ? labelEl.textContent.trim() : (li.querySelector('a')?.textContent?.trim() ?? ''); nav.querySelector('.menu__title').innerHTML = title; nav.querySelector('.menu__header').classList.add('active'); } function menu__hideChildren(nav, children) { - let submenu = children[0].querySelector('.menu__subs'); + const submenu = children[0].querySelector('.menu__children'); submenu.style.animation = 'slideRight 0.5s ease forwards'; setTimeout(() => { submenu.classList.remove('active'); @@ -18,11 +20,12 @@ function menu__hideChildren(nav, children) { children.shift(); if (children.length > 0) { - let title = children[0].querySelector('i').parentNode.childNodes[0].textContent; - nav.querySelector('.menu__title').innerHTML = title; + const a = children[0].querySelector('a'); + const title = (a && a.textContent ? a.textContent.trim() : ''); + nav.querySelector('.menu__title').textContent = title; } else { nav.querySelector('.menu__header').classList.remove('active'); - nav.querySelector('.menu__title').innerHTML = ''; + nav.querySelector('.menu__title').textContent = ''; } } @@ -36,7 +39,7 @@ function menu__reset(menu, nav, overlay) { setTimeout(() => { nav.querySelector('.menu__header').classList.remove('active'); nav.querySelector('.menu__title').innerHTML = ''; - menu.querySelectorAll('.menu__subs').forEach(submenu => { + menu.querySelectorAll('.menu__children').forEach(submenu => { submenu.classList.remove('active'); submenu.style.removeProperty('animation'); }); @@ -52,7 +55,7 @@ document.querySelectorAll('.menu').forEach(menu => { menu.querySelector('.menu__list').addEventListener('click', (e) => { if (menuNav.classList.contains('active')) { - let target = e.target.closest('.menu__children'); + let target = e.target.closest('.menu__item--children'); if (target && target != menuChildren[0]) { menuChildren.unshift(target); menu__showChildren(menuNav, menuChildren); @@ -68,7 +71,7 @@ document.querySelectorAll('.menu').forEach(menu => { menuChildren = menu__reset(menu, menuNav, menuOverlay); }); - menu.querySelectorAll('.menu__link > a[target="_blank"]').forEach(link => { + menu.querySelectorAll('.menu__item--link > a[target="_blank"]').forEach(link => { link.addEventListener('click', (e) => { menuChildren = menu__reset(menu, menuNav, menuOverlay); e.target.blur(); From 6b08b92635c697674a8bcb81e75a470a188a09d9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 30 Sep 2025 20:21:06 +0200 Subject: [PATCH 801/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20`AssetsOp`=20?= =?UTF-8?q?por=20`ContextOp`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/theme/basic.rs | 14 +++++++------- src/html.rs | 3 ++- src/html/context.rs | 40 ++++++++++++++++++++++------------------ src/response/page.rs | 4 ++-- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 20f51994..ecd64856 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -52,32 +52,32 @@ impl Theme for Basic { _ => "/css/basic.css", }; let pkg_version = env!("CARGO_PKG_VERSION"); - page.alter_assets(AssetsOp::AddStyleSheet( + page.alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/css/normalize.css") .with_version("8.0.1") .with_weight(-99), )) - .alter_assets(AssetsOp::AddStyleSheet( + .alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/css/root.css") .with_version(pkg_version) .with_weight(-99), )) - .alter_assets(AssetsOp::AddStyleSheet( + .alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/css/components.css") .with_version(pkg_version) .with_weight(-99), )) - .alter_assets(AssetsOp::AddStyleSheet( + .alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/css/menu.css") .with_version(pkg_version) .with_weight(-99), )) - .alter_assets(AssetsOp::AddStyleSheet( + .alter_assets(ContextOp::AddStyleSheet( StyleSheet::from(styles) .with_version(pkg_version) .with_weight(-99), )) - .alter_assets(AssetsOp::AddJavaScript( + .alter_assets(ContextOp::AddJavaScript( JavaScript::defer("/js/menu.js") .with_version(pkg_version) .with_weight(-99), @@ -169,7 +169,7 @@ fn render_intro(page: &mut Page) -> Markup { } fn render_pagetop_intro(page: &mut Page) -> Markup { - page.alter_assets(AssetsOp::AddJavaScript(JavaScript::on_load_async("intro-js", |cx| + page.alter_assets(ContextOp::AddJavaScript(JavaScript::on_load_async("intro-js", |cx| util::indoc!(r#" try { const resp = await fetch("https://crates.io/api/v1/crates/pagetop"); diff --git a/src/html.rs b/src/html.rs index c4195a9d..679d433a 100644 --- a/src/html.rs +++ b/src/html.rs @@ -14,7 +14,8 @@ pub use assets::{Asset, Assets}; // **< HTML DOCUMENT CONTEXT >********************************************************************** mod context; -pub use context::{AssetsOp, Context, Contextual, ErrorParam}; +#[allow(deprecated)] +pub use context::{AssetsOp, Context, ContextOp, Contextual, ErrorParam}; pub type FnPathByContext = fn(cx: &Context) -> &str; // **< HTML ATTRIBUTES >**************************************************************************** diff --git a/src/html/context.rs b/src/html/context.rs index 355ccead..94f24bf7 100644 --- a/src/html/context.rs +++ b/src/html/context.rs @@ -10,8 +10,12 @@ use crate::{builder_fn, join}; use std::any::Any; use std::collections::HashMap; -/// Operaciones para modificar el contexto ([`Context`]) de un documento. -pub enum AssetsOp { +/// **Obsoleto desde la versión 0.4.0**: usar [`ContextOp`] en su lugar. +#[deprecated(since = "0.5.0", note = "Use `ContextOp` instead")] +pub type AssetsOp = ContextOp; + +/// Operaciones para modificar los recursos asociados al contexto ([`Context`]) de un documento. +pub enum ContextOp { // Favicon. /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. SetFavicon(Option<Favicon>), @@ -55,7 +59,7 @@ pub enum ErrorParam { /// - Almacenar la **solicitud HTTP** de origen. /// - Seleccionar **tema** y **composición** (*layout*) de renderizado. /// - Administrar **recursos** del documento como el icono [`Favicon`], las hojas de estilo -/// [`StyleSheet`] o los scripts [`JavaScript`] mediante [`AssetsOp`]. +/// [`StyleSheet`] o los scripts [`JavaScript`] mediante [`ContextOp`]. /// - Leer y mantener **parámetros dinámicos tipados** de contexto. /// - Generar **identificadores únicos** por tipo de componente. /// @@ -71,9 +75,9 @@ pub enum ErrorParam { /// cx.with_langid(&LangMatch::resolve("es-ES")) /// .with_theme("aliner") /// .with_layout("default") -/// .with_assets(AssetsOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) -/// .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/app.css"))) -/// .with_assets(AssetsOp::AddJavaScript(JavaScript::defer("/js/app.js"))) +/// .with_assets(ContextOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) +/// .with_assets(ContextOp::AddStyleSheet(StyleSheet::from("/css/app.css"))) +/// .with_assets(ContextOp::AddJavaScript(JavaScript::defer("/js/app.js"))) /// .with_param("usuario_id", 42_i32) /// } /// ``` @@ -100,9 +104,9 @@ pub trait Contextual: LangId { #[builder_fn] fn with_param<T: 'static>(self, key: &'static str, value: T) -> Self; - /// Define los recursos del contexto usando [`AssetsOp`]. + /// Define los recursos del contexto usando [`ContextOp`]. #[builder_fn] - fn with_assets(self, op: AssetsOp) -> Self; + fn with_assets(self, op: ContextOp) -> Self; // **< Contextual GETTERS >********************************************************************* @@ -172,11 +176,11 @@ pub trait Contextual: LangId { /// // Selecciona un tema (por su nombre corto). /// .with_theme("aliner") /// // Asigna un favicon. -/// .with_assets(AssetsOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) +/// .with_assets(ContextOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) /// // Añade una hoja de estilo externa. -/// .with_assets(AssetsOp::AddStyleSheet(StyleSheet::from("/css/style.css"))) +/// .with_assets(ContextOp::AddStyleSheet(StyleSheet::from("/css/style.css"))) /// // Añade un script JavaScript. -/// .with_assets(AssetsOp::AddJavaScript(JavaScript::defer("/js/main.js"))) +/// .with_assets(ContextOp::AddJavaScript(JavaScript::defer("/js/main.js"))) /// // Añade un parámetro dinámico al contexto. /// .with_param("usuario_id", 42) /// } @@ -442,29 +446,29 @@ impl Contextual for Context { } #[builder_fn] - fn with_assets(mut self, op: AssetsOp) -> Self { + fn with_assets(mut self, op: ContextOp) -> Self { match op { // Favicon. - AssetsOp::SetFavicon(favicon) => { + ContextOp::SetFavicon(favicon) => { self.favicon = favicon; } - AssetsOp::SetFaviconIfNone(icon) => { + ContextOp::SetFaviconIfNone(icon) => { if self.favicon.is_none() { self.favicon = Some(icon); } } // Stylesheets. - AssetsOp::AddStyleSheet(css) => { + ContextOp::AddStyleSheet(css) => { self.stylesheets.add(css); } - AssetsOp::RemoveStyleSheet(path) => { + ContextOp::RemoveStyleSheet(path) => { self.stylesheets.remove(path); } // JavaScripts. - AssetsOp::AddJavaScript(js) => { + ContextOp::AddJavaScript(js) => { self.javascripts.add(js); } - AssetsOp::RemoveJavaScript(path) => { + ContextOp::RemoveJavaScript(path) => { self.javascripts.remove(path); } } diff --git a/src/response/page.rs b/src/response/page.rs index e9d30671..135ab19e 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -8,9 +8,9 @@ use crate::core::component::{Child, ChildOp, Component}; use crate::core::theme::{ChildrenInRegions, ThemeRef, REGION_CONTENT}; use crate::html::{html, Markup, DOCTYPE}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; -use crate::html::{AssetsOp, Context, Contextual}; use crate::html::{AttrClasses, ClassesOp}; use crate::html::{AttrId, AttrL10n}; +use crate::html::{Context, ContextOp, Contextual}; use crate::locale::{CharacterDirection, L10n, LangId, LanguageIdentifier}; use crate::service::HttpRequest; use crate::{builder_fn, AutoDefault}; @@ -286,7 +286,7 @@ impl Contextual for Page { } #[builder_fn] - fn with_assets(mut self, op: AssetsOp) -> Self { + fn with_assets(mut self, op: ContextOp) -> Self { self.context.alter_assets(op); self } From 075f61bf09ce4e52b03182ac81e2dd11e7f005b2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 30 Sep 2025 23:36:09 +0200 Subject: [PATCH 802/853] =?UTF-8?q?=F0=9F=9A=A7=20(core):=20Mueve=20`Conte?= =?UTF-8?q?xt`=20al=20=C3=A1mbito=20de=20componentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/component.rs | 6 +++++ src/core/component/children.rs | 4 ++-- src/{html => core/component}/context.rs | 10 +++----- src/core/component/definition.rs | 3 ++- src/global.rs | 10 ++++---- src/html.rs | 32 +++++++++++++++++++++---- src/html/assets.rs | 3 ++- src/html/assets/favicon.rs | 3 ++- src/html/assets/javascript.rs | 3 ++- src/html/assets/stylesheet.rs | 3 ++- src/prelude.rs | 9 ++++++- src/response/page.rs | 3 +-- src/response/page/error.rs | 2 +- 13 files changed, 64 insertions(+), 27 deletions(-) rename src/{html => core/component}/context.rs (97%) diff --git a/src/core/component.rs b/src/core/component.rs index 17b9b735..a002e3d5 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -7,3 +7,9 @@ mod children; pub use children::Children; pub use children::{Child, ChildOp}; pub use children::{Typed, TypedOp}; + +// **< HTML DOCUMENT CONTEXT >********************************************************************** + +mod context; +pub use context::{Context, ContextOp, Contextual, ErrorParam}; +pub type FnPathByContext = fn(cx: &Context) -> &str; diff --git a/src/core/component/children.rs b/src/core/component/children.rs index 920dacf8..c0c8841e 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -1,5 +1,5 @@ -use crate::core::component::Component; -use crate::html::{html, Context, Markup}; +use crate::core::component::{Component, Context}; +use crate::html::{html, Markup}; use crate::{builder_fn, AutoDefault, UniqueId}; use parking_lot::RwLock; diff --git a/src/html/context.rs b/src/core/component/context.rs similarity index 97% rename from src/html/context.rs rename to src/core/component/context.rs index 94f24bf7..9333e484 100644 --- a/src/html/context.rs +++ b/src/core/component/context.rs @@ -10,11 +10,7 @@ use crate::{builder_fn, join}; use std::any::Any; use std::collections::HashMap; -/// **Obsoleto desde la versión 0.4.0**: usar [`ContextOp`] en su lugar. -#[deprecated(since = "0.5.0", note = "Use `ContextOp` instead")] -pub type AssetsOp = ContextOp; - -/// Operaciones para modificar los recursos asociados al contexto ([`Context`]) de un documento. +/// Operaciones para modificar recursos asociados al contexto ([`Context`]) de un documento. pub enum ContextOp { // Favicon. /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. @@ -64,7 +60,7 @@ pub enum ErrorParam { /// - Generar **identificadores únicos** por tipo de componente. /// /// Lo implementan, típicamente, estructuras que representan el contexto de renderizado, como -/// [`Context`](crate::html::Context) o [`Page`](crate::response::page::Page). +/// [`Context`](crate::core::component::Context) o [`Page`](crate::response::page::Page). /// /// # Ejemplo /// @@ -375,7 +371,7 @@ impl Context { } } -/// Permite a [`Context`](crate::html::Context) actuar como proveedor de idioma. +/// Permite a [`Context`](crate::core::component::Context) actuar como proveedor de idioma. /// /// Devuelve un [`LanguageIdentifier`] siguiendo este orden de prioridad: /// diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index 333cf694..c0573b44 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -1,6 +1,7 @@ use crate::base::action; +use crate::core::component::Context; use crate::core::{AnyInfo, TypeInfo}; -use crate::html::{html, Context, Markup, PrepareMarkup}; +use crate::html::{html, Markup, PrepareMarkup}; /// Define la función de renderizado para todos los componentes. /// diff --git a/src/global.rs b/src/global.rs index ccc6d9de..c8805a30 100644 --- a/src/global.rs +++ b/src/global.rs @@ -50,11 +50,11 @@ pub struct App { pub theme: String, /// Idioma por defecto para la aplicación. /// - /// Si no está definido o no es válido, el idioma efectivo para el renderizado se resolverá - /// según la implementación de [`LangId`](crate::locale::LangId) en este orden: primero intenta - /// con el establecido en [`Contextual::with_langid()`](crate::html::Contextual::with_langid); - /// pero si no se ha definido explícitamente, usará el indicado en la cabecera `Accept-Language` - /// del navegador; y, si ninguno aplica, se empleará el idioma de respaldo ("en-US"). + /// Si no está definido o no es válido, [`LangId`](crate::locale::LangId) determinará el idioma + /// efectivo para el renderizado en este orden: primero intentará usar el establecido mediante + /// [`Contextual::with_langid()`](crate::core::component::Contextual::with_langid); si no se ha + /// definido explícitamente, probará el indicado en la cabecera `Accept-Language` del navegador; + /// y, si ninguno aplica, se empleará el idioma de respaldo ("en-US"). pub language: String, /// Banner ASCII mostrado al inicio: *"Off"* (desactivado), *"Slant"*, *"Small"*, *"Speed"* o /// *"Starwars"*. diff --git a/src/html.rs b/src/html.rs index 679d433a..079811a2 100644 --- a/src/html.rs +++ b/src/html.rs @@ -13,10 +13,34 @@ pub use assets::{Asset, Assets}; // **< HTML DOCUMENT CONTEXT >********************************************************************** -mod context; -#[allow(deprecated)] -pub use context::{AssetsOp, Context, ContextOp, Contextual, ErrorParam}; -pub type FnPathByContext = fn(cx: &Context) -> &str; +/// **Obsoleto desde la versión 0.5.0**: usar [`core::component::Context`] en su lugar. +#[deprecated(since = "0.5.0", note = "Moved to `pagetop::core::component::Context`")] +pub type Context = crate::core::component::Context; + +/// **Obsoleto desde la versión 0.5.0**: usar [`core::component::ContextOp`] en su lugar. +#[deprecated( + since = "0.5.0", + note = "Moved to `pagetop::core::component::ContextOp`" +)] +pub type ContextOp = crate::core::component::ContextOp; + +/// **Obsoleto desde la versión 0.5.0**: usar [`core::component::Contextual`] en su lugar. +#[deprecated( + since = "0.5.0", + note = "Moved to `pagetop::core::component::Contextual`" +)] +pub trait Contextual: crate::core::component::Contextual {} + +/// **Obsoleto desde la versión 0.5.0**: usar [`core::component::ErrorParam`] en su lugar. +#[deprecated( + since = "0.5.0", + note = "Moved to `pagetop::core::component::ErrorParam`" +)] +pub type ErrorParam = crate::core::component::ErrorParam; + +/// **Obsoleto desde la versión 0.5.0**: usar [`ContextOp`] en su lugar. +#[deprecated(since = "0.5.0", note = "Use `ContextOp` instead")] +pub type AssetsOp = crate::core::component::ContextOp; // **< HTML ATTRIBUTES >**************************************************************************** diff --git a/src/html/assets.rs b/src/html/assets.rs index 41cd4710..fe5f5b7c 100644 --- a/src/html/assets.rs +++ b/src/html/assets.rs @@ -2,7 +2,8 @@ pub mod favicon; pub mod javascript; pub mod stylesheet; -use crate::html::{html, Context, Markup}; +use crate::core::component::Context; +use crate::html::{html, Markup}; use crate::{AutoDefault, Weight}; /// Representación genérica de un script [`JavaScript`](crate::html::JavaScript) o una hoja de diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index 56c39056..c2280aab 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -1,4 +1,5 @@ -use crate::html::{html, Context, Markup}; +use crate::core::component::Context; +use crate::html::{html, Markup}; use crate::AutoDefault; /// Un **Favicon** es un recurso gráfico que usa el navegador como icono asociado al sitio. diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index 4649cdb4..dde5f945 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -1,5 +1,6 @@ +use crate::core::component::Context; use crate::html::assets::Asset; -use crate::html::{html, Context, Markup, PreEscaped}; +use crate::html::{html, Markup, PreEscaped}; use crate::{join, join_pair, AutoDefault, Weight}; // Define el origen del recurso JavaScript y cómo debe cargarse en el navegador. diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index b54f4cf3..49cb9911 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -1,5 +1,6 @@ +use crate::core::component::Context; use crate::html::assets::Asset; -use crate::html::{html, Context, Markup, PreEscaped}; +use crate::html::{html, Markup, PreEscaped}; use crate::{join_pair, AutoDefault, Weight}; // Define el origen del recurso CSS y cómo se incluye en el documento. diff --git a/src/prelude.rs b/src/prelude.rs index 484e53c1..a71375e1 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -28,7 +28,14 @@ pub use crate::global; pub use crate::trace; -pub use crate::html::*; +// No se usa `pub use crate::html::*;` para evitar duplicar alias marcados como obsoletos +// (*deprecated*) porque han sido trasladados a `crate::core::component`. Cuando se retiren estos +// alias obsoletos se volverá a declarar como `pub use crate::html::*;`. +pub use crate::html::{ + display, html_private, Asset, Assets, AttrClasses, AttrId, AttrL10n, AttrName, AttrValue, + ClassesOp, Escaper, Favicon, JavaScript, Markup, PreEscaped, PrepareMarkup, StyleSheet, + TargetMedia, DOCTYPE, +}; pub use crate::locale::*; diff --git a/src/response/page.rs b/src/response/page.rs index 135ab19e..f81c9806 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -4,13 +4,12 @@ pub use error::ErrorPage; pub use actix_web::Result as ResultPage; use crate::base::action; -use crate::core::component::{Child, ChildOp, Component}; +use crate::core::component::{Child, ChildOp, Component, Context, ContextOp, Contextual}; use crate::core::theme::{ChildrenInRegions, ThemeRef, REGION_CONTENT}; use crate::html::{html, Markup, DOCTYPE}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; use crate::html::{AttrClasses, ClassesOp}; use crate::html::{AttrId, AttrL10n}; -use crate::html::{Context, ContextOp, Contextual}; use crate::locale::{CharacterDirection, L10n, LangId, LanguageIdentifier}; use crate::service::HttpRequest; use crate::{builder_fn, AutoDefault}; diff --git a/src/response/page/error.rs b/src/response/page/error.rs index 2355d234..50e1c77b 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -1,5 +1,5 @@ use crate::base::component::Html; -use crate::html::Contextual; +use crate::core::component::Contextual; use crate::locale::L10n; use crate::response::ResponseError; use crate::service::http::{header::ContentType, StatusCode}; From 843aed86c7acc2566b9786b183adc7290e8826a2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 30 Sep 2025 23:45:13 +0200 Subject: [PATCH 803/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20`ErrorParam`?= =?UTF-8?q?=20por=20`ContextError`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/component.rs | 4 +--- src/core/component/context.rs | 34 +++++++++++++++++----------------- src/html.rs | 6 +++--- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/core/component.rs b/src/core/component.rs index a002e3d5..be9bbad1 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -8,8 +8,6 @@ pub use children::Children; pub use children::{Child, ChildOp}; pub use children::{Typed, TypedOp}; -// **< HTML DOCUMENT CONTEXT >********************************************************************** - mod context; -pub use context::{Context, ContextOp, Contextual, ErrorParam}; +pub use context::{Context, ContextError, ContextOp, Contextual}; pub type FnPathByContext = fn(cx: &Context) -> &str; diff --git a/src/core/component/context.rs b/src/core/component/context.rs index 9333e484..9dad7f5f 100644 --- a/src/core/component/context.rs +++ b/src/core/component/context.rs @@ -33,14 +33,14 @@ pub enum ContextOp { /// Errores de acceso a parámetros dinámicos del contexto. /// -/// - [`ErrorParam::NotFound`]: la clave no existe. -/// - [`ErrorParam::TypeMismatch`]: la clave existe, pero el valor guardado no coincide con el tipo -/// solicitado. Incluye nombre de la clave (`key`), tipo esperado (`expected`) y tipo realmente -/// guardado (`saved`) para facilitar el diagnóstico. +/// - [`ContextError::ParamNotFound`]: la clave no existe. +/// - [`ContextError::ParamTypeMismatch`]: la clave existe, pero el valor guardado no coincide con +/// el tipo solicitado. Incluye nombre de la clave (`key`), tipo esperado (`expected`) y tipo +/// realmente guardado (`saved`) para facilitar el diagnóstico. #[derive(Debug)] -pub enum ErrorParam { - NotFound, - TypeMismatch { +pub enum ContextError { + ParamNotFound, + ParamTypeMismatch { key: &'static str, expected: &'static str, saved: &'static str, @@ -290,8 +290,8 @@ impl Context { /// Devuelve: /// /// - `Ok(&T)` si la clave existe y el tipo coincide. - /// - `Err(ErrorParam::NotFound)` si la clave no existe. - /// - `Err(ErrorParam::TypeMismatch)` si la clave existe pero el tipo no coincide. + /// - `Err(ContextError::ParamNotFound)` si la clave no existe. + /// - `Err(ContextError::ParamTypeMismatch)` si la clave existe pero el tipo no coincide. /// /// # Ejemplos /// @@ -308,10 +308,10 @@ impl Context { /// // Error de tipo: /// assert!(cx.get_param::<String>("usuario_id").is_err()); /// ``` - pub fn get_param<T: 'static>(&self, key: &'static str) -> Result<&T, ErrorParam> { - let (any, type_name) = self.params.get(key).ok_or(ErrorParam::NotFound)?; + pub fn get_param<T: 'static>(&self, key: &'static str) -> Result<&T, ContextError> { + let (any, type_name) = self.params.get(key).ok_or(ContextError::ParamNotFound)?; any.downcast_ref::<T>() - .ok_or_else(|| ErrorParam::TypeMismatch { + .ok_or_else(|| ContextError::ParamTypeMismatch { key, expected: TypeInfo::FullName.of::<T>(), saved: type_name, @@ -323,8 +323,8 @@ impl Context { /// Devuelve: /// /// - `Ok(T)` si la clave existía y el tipo coincide. - /// - `Err(ErrorParam::NotFound)` si la clave no existe. - /// - `Err(ErrorParam::TypeMismatch)` si el tipo no coincide. + /// - `Err(ContextError::ParamNotFound)` si la clave no existe. + /// - `Err(ContextError::ParamTypeMismatch)` si el tipo no coincide. /// /// # Ejemplos /// @@ -341,12 +341,12 @@ impl Context { /// // Error de tipo: /// assert!(cx.take_param::<i32>("titulo").is_err()); /// ``` - pub fn take_param<T: 'static>(&mut self, key: &'static str) -> Result<T, ErrorParam> { - let (boxed, saved) = self.params.remove(key).ok_or(ErrorParam::NotFound)?; + pub fn take_param<T: 'static>(&mut self, key: &'static str) -> Result<T, ContextError> { + let (boxed, saved) = self.params.remove(key).ok_or(ContextError::ParamNotFound)?; boxed .downcast::<T>() .map(|b| *b) - .map_err(|_| ErrorParam::TypeMismatch { + .map_err(|_| ContextError::ParamTypeMismatch { key, expected: TypeInfo::FullName.of::<T>(), saved, diff --git a/src/html.rs b/src/html.rs index 079811a2..a86c9f76 100644 --- a/src/html.rs +++ b/src/html.rs @@ -31,12 +31,12 @@ pub type ContextOp = crate::core::component::ContextOp; )] pub trait Contextual: crate::core::component::Contextual {} -/// **Obsoleto desde la versión 0.5.0**: usar [`core::component::ErrorParam`] en su lugar. +/// **Obsoleto desde la versión 0.5.0**: usar [`core::component::ContextError`] en su lugar. #[deprecated( since = "0.5.0", - note = "Moved to `pagetop::core::component::ErrorParam`" + note = "Moved to `pagetop::core::component::ContextError`" )] -pub type ErrorParam = crate::core::component::ErrorParam; +pub type ContextError = crate::core::component::ContextError; /// **Obsoleto desde la versión 0.5.0**: usar [`ContextOp`] en su lugar. #[deprecated(since = "0.5.0", note = "Use `ContextOp` instead")] From 200f8c0f4f5fb1206cd932de931c155b831f95ab Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Oct 2025 18:48:20 +0200 Subject: [PATCH 804/853] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Dep?= =?UTF-8?q?ura=20atributos=20`#[inline]`=20en=20`builder=5Ffn`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 5af5f9c9..709ce572 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -266,10 +266,13 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { v }; - // Extrae atributos descartando la documentación para incluir en `alter_...()`. - let non_doc_attrs: Vec<_> = attrs + // Filtra los atributos descartando `#[doc]` y `#[inline]` para el método `alter_...()`. + let non_doc_or_inline_attrs: Vec<_> = attrs .iter() - .filter(|&a| !a.path().is_ident("doc")) + .filter(|a| { + let p = a.path(); + !p.is_ident("doc") && !p.is_ident("inline") + }) .cloned() .collect(); @@ -284,14 +287,21 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { #(#attrs)* fn #with_name #generics (self, #(#args),*) -> Self #where_clause; - #(#non_doc_attrs)* + #(#non_doc_or_inline_attrs)* #[doc = #alter_doc] fn #alter_ident #generics (&mut self, #(#args),*) -> &mut Self #where_clause; } } Some(body) => { + // Si no se indicó ninguna forma de `inline`, fuerza `#[inline]` para `with_...()`. + let force_inline = if attrs.iter().any(|a| a.path().is_ident("inline")) { + quote! {} + } else { + quote! { #[inline] } + }; let with_fn = if is_trait { quote! { + #force_inline #vis_pub fn #with_name #generics (self, #(#args),*) -> Self #where_clause { let mut s = self; s.#alter_ident(#(#call_idents),*); @@ -300,6 +310,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { } } else { quote! { + #force_inline #vis_pub fn #with_name #generics (mut self, #(#args),*) -> Self #where_clause { self.#alter_ident(#(#call_idents),*); self @@ -310,7 +321,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { #(#attrs)* #with_fn - #(#non_doc_attrs)* + #(#non_doc_or_inline_attrs)* #[doc = #alter_doc] #vis_pub fn #alter_ident #generics (&mut self, #(#args),*) -> &mut Self #where_clause { #body From e23bd0294ce9f795760b587cfa406b3d0801c60b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Thu, 2 Oct 2025 21:24:19 +0200 Subject: [PATCH 805/853] =?UTF-8?q?=F0=9F=8E=A8=20Mejora=20uso=20de=20las?= =?UTF-8?q?=20regiones=20en=20contexto=20y=20p=C3=A1gina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/theme/basic.rs | 116 +++++++++++++++++----------------- src/core/component/context.rs | 22 ++++++- src/core/theme/definition.rs | 86 ++++++++++++------------- src/core/theme/regions.rs | 2 +- src/response/page.rs | 37 ++++++----- 5 files changed, 142 insertions(+), 121 deletions(-) diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index ecd64856..28d93890 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -93,76 +93,74 @@ fn render_intro(page: &mut Page) -> Markup { let intro_button_lnk: Option<&String> = page.param("intro_button_lnk"); html! { - body id=[page.body_id().get()] class=[page.body_classes().get()] { - header class="intro-header" { - section class="intro-header__body" { - h1 class="intro-header__title" { - span { (title) } - (intro) - } + header class="intro-header" { + section class="intro-header__body" { + h1 class="intro-header__title" { + span { (title) } + (intro) } - aside class="intro-header__image" aria-hidden="true" { - div class="intro-header__monster" { - picture { - source - type="image/avif" - src="/img/monster-pagetop_250.avif" - srcset="/img/monster-pagetop_500.avif 1.5x"; - source - type="image/webp" - src="/img/monster-pagetop_250.webp" - srcset="/img/monster-pagetop_500.webp 1.5x"; - img - src="/img/monster-pagetop_250.png" - srcset="/img/monster-pagetop_500.png 1.5x" - alt="Monster PageTop"; - } + } + aside class="intro-header__image" aria-hidden="true" { + div class="intro-header__monster" { + picture { + source + type="image/avif" + src="/img/monster-pagetop_250.avif" + srcset="/img/monster-pagetop_500.avif 1.5x"; + source + type="image/webp" + src="/img/monster-pagetop_250.webp" + srcset="/img/monster-pagetop_500.webp 1.5x"; + img + src="/img/monster-pagetop_250.png" + srcset="/img/monster-pagetop_500.png 1.5x" + alt="Monster PageTop"; } } } - main class="intro-content" { - section class="intro-content__body" { - @if intro_button_lnk.is_some() { - div class="intro-button" { - a - class="intro-button__link" - href=[intro_button_lnk] - target="_blank" - rel="noreferrer" - { - span {} span {} span {} - div class="intro-button__text" { - (intro_button_txt.using(page)) - } + } + main class="intro-content" { + section class="intro-content__body" { + @if intro_button_lnk.is_some() { + div class="intro-button" { + a + class="intro-button__link" + href=[intro_button_lnk] + target="_blank" + rel="noreferrer" + { + span {} span {} span {} + div class="intro-button__text" { + (intro_button_txt.using(page)) } } } - div class="intro-text" { (page.render_region("content")) } } + div class="intro-text" { (page.render_region("content")) } } - footer class="intro-footer" { - section class="intro-footer__body" { - div class="intro-footer__logo" { - svg - viewBox="0 0 1614 1614" - xmlns="http://www.w3.org/2000/svg" - role="img" - aria-label=[L10n::l("pagetop_logo").lookup(page)] - preserveAspectRatio="xMidYMid slice" - focusable="false" - { - path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} - path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} - path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} - } - } - div class="intro-footer__links" { - a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } - a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } - a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("intro_code").using(page)) } - em { (L10n::l("intro_have_fun").using(page)) } + } + footer class="intro-footer" { + section class="intro-footer__body" { + div class="intro-footer__logo" { + svg + viewBox="0 0 1614 1614" + xmlns="http://www.w3.org/2000/svg" + role="img" + aria-label=[L10n::l("pagetop_logo").lookup(page)] + preserveAspectRatio="xMidYMid slice" + focusable="false" + { + path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} } } + div class="intro-footer__links" { + a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } + a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("intro_code").using(page)) } + em { (L10n::l("intro_have_fun").using(page)) } + } } } } diff --git a/src/core/component/context.rs b/src/core/component/context.rs index 9dad7f5f..b344c860 100644 --- a/src/core/component/context.rs +++ b/src/core/component/context.rs @@ -1,5 +1,6 @@ +use crate::core::component::ChildOp; use crate::core::theme::all::{theme_by_short_name, DEFAULT_THEME}; -use crate::core::theme::ThemeRef; +use crate::core::theme::{ChildrenInRegions, ThemeRef}; use crate::core::TypeInfo; use crate::html::{html, Markup}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; @@ -104,6 +105,10 @@ pub trait Contextual: LangId { #[builder_fn] fn with_assets(self, op: ContextOp) -> Self; + /// Opera con [`ChildOp`] en una región (`region_name`) de la página. + #[builder_fn] + fn with_child_in(self, region_name: &'static str, op: ChildOp) -> Self; + // **< Contextual GETTERS >********************************************************************* /// Devuelve una referencia a la solicitud HTTP asociada, si existe. @@ -211,6 +216,7 @@ pub struct Context { favicon : Option<Favicon>, // Favicon, si se ha definido. stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. javascripts: Assets<JavaScript>, // Scripts JavaScript. + regions : ChildrenInRegions, // Regiones de componentes para renderizar. params : HashMap<&'static str, (Box<dyn Any>, &'static str)>, // Parámetros en ejecución. id_counter : usize, // Contador para generar identificadores únicos. } @@ -250,6 +256,7 @@ impl Context { favicon : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), + regions : ChildrenInRegions::default(), params : HashMap::default(), id_counter : 0, } @@ -283,6 +290,13 @@ impl Context { markup } + /// Renderiza los componentes de una región (`region_name`). + pub fn render_region(&mut self, region_name: &'static str) -> Markup { + self.regions + .merge_all_components(self.theme, region_name) + .render(self) + } + // **< Context PARAMS >************************************************************************* /// Recupera una *referencia tipada* al parámetro solicitado. @@ -471,6 +485,12 @@ impl Contextual for Context { self } + #[builder_fn] + fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { + self.regions.alter_child_in(region_name, op); + self + } + // **< Contextual GETTERS >********************************************************************* fn request(&self) -> Option<&HttpRequest> { diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 38a0bfc4..643bfffd 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -26,65 +26,65 @@ pub type ThemeRef = &'static dyn Theme; /// - `<Self as ThemePage>::render_body(self, page, self.page_regions())` /// - `<Self as ThemePage>::render_head(self, page)` pub trait ThemePage { - /// Renderiza el contenido del `<body>` de la página. + /// Renderiza el **contenido interior** del `<body>` de la página. /// /// Recorre `regions` en el **orden declarado** y, para cada región con contenido, genera un - /// contenedor con `role="region"` y un `aria-label` localizado. Se asume que cada identificador - /// de región es **único** dentro de la página. + /// contenedor con `role="region"` y un `aria-label` localizado. + /// Se asume que cada identificador de región es **único** dentro de la página. + /// + /// La etiqueta `<body>` no se incluye aquí; únicamente renderiza su contenido. fn render_body(&self, page: &mut Page, regions: &[(Region, L10n)]) -> Markup { html! { - body id=[page.body_id().get()] class=[page.body_classes().get()] { - @for (region, region_label) in regions { - @let output = page.render_region(region.key()); - @if !output.is_empty() { - @let region_name = region.name(); - div - id=(region_name) - class={ "region region--" (region_name) } - role="region" - aria-label=[region_label.lookup(page)] - { - (output) - } + @for (region, region_label) in regions { + @let output = page.render_region(region.key()); + @if !output.is_empty() { + @let region_name = region.name(); + div + id=(region_name) + class={ "region region--" (region_name) } + role="region" + aria-label=[region_label.lookup(page)] + { + (output) } } } } } - /// Renderiza el contenido del `<head>` de la página. + /// Renderiza el **contenido interior** del `<head>` de la página. /// - /// Por defecto incluye las etiquetas básicas (`charset`, `title`, `description`, `viewport`, - /// `X-UA-Compatible`), los metadatos (`name/content`) y propiedades (`property/content`), - /// además de los recursos CSS/JS de la página. + /// Recorre y genera por defecto las etiquetas básicas (`charset`, `title`, `description`, + /// `viewport`, `X-UA-Compatible`), los metadatos (`name/content`) y propiedades + /// (`property/content`), además de los recursos CSS/JS de la página. + /// + /// La etiqueta `<head>` no se incluye aquí; únicamente renderiza su contenido. fn render_head(&self, page: &mut Page) -> Markup { let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { - head { - meta charset="utf-8"; + meta charset="utf-8"; - @if let Some(title) = page.title() { - title { (global::SETTINGS.app.name) (" | ") (title) } - } @else { - title { (global::SETTINGS.app.name) } - } - - @if let Some(description) = page.description() { - meta name="description" content=(description); - } - - meta name="viewport" content=(viewport); - @for (name, content) in page.metadata() { - meta name=(name) content=(content) {} - } - - meta http-equiv="X-UA-Compatible" content="IE=edge"; - @for (property, content) in page.properties() { - meta property=(property) content=(content) {} - } - - (page.render_assets()) + @if let Some(title) = page.title() { + title { (global::SETTINGS.app.name) (" | ") (title) } + } @else { + title { (global::SETTINGS.app.name) } } + + @if let Some(description) = page.description() { + meta name="description" content=(description); + } + + meta name="viewport" content=(viewport); + @for (name, content) in page.metadata() { + meta name=(name) content=(content) {} + } + + meta http-equiv="X-UA-Compatible" content="IE=edge"; + @for (property, content) in page.properties() { + meta property=(property) content=(content) {} + } + + (page.render_assets()) } } } diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 8082aac9..f14645c0 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -64,7 +64,7 @@ impl Region { self.key } - /// Devuelve el nombre normalizado de la región (para atributos y búsquedas). + /// Devuelve el nombre normalizado de la región (para identificadores y atributos HTML). #[inline] pub fn name(&self) -> &str { &self.name diff --git a/src/response/page.rs b/src/response/page.rs index f81c9806..deab452b 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -5,7 +5,7 @@ pub use actix_web::Result as ResultPage; use crate::base::action; use crate::core::component::{Child, ChildOp, Component, Context, ContextOp, Contextual}; -use crate::core::theme::{ChildrenInRegions, ThemeRef, REGION_CONTENT}; +use crate::core::theme::{ThemeRef, REGION_CONTENT}; use crate::html::{html, Markup, DOCTYPE}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; use crate::html::{AttrClasses, ClassesOp}; @@ -29,7 +29,6 @@ pub struct Page { body_id : AttrId, body_classes: AttrClasses, context : Context, - regions : ChildrenInRegions, } impl Page { @@ -47,7 +46,6 @@ impl Page { body_id : AttrId::default(), body_classes: AttrClasses::default(), context : Context::new(Some(request)), - regions : ChildrenInRegions::default(), } } @@ -111,7 +109,7 @@ impl Page { /// Añade un componente a la región de contenido por defecto. pub fn add_component(mut self, component: impl Component) -> Self { - self.regions + self.context .alter_child_in(REGION_CONTENT, ChildOp::Add(Child::with(component))); self } @@ -122,7 +120,7 @@ impl Page { region_name: &'static str, component: impl Component, ) -> Self { - self.regions + self.context .alter_child_in(region_name, ChildOp::Add(Child::with(component))); self } @@ -143,13 +141,6 @@ impl Page { self } - /// Opera con [`ChildOp`] en una región (`region_name`) de la página. - #[builder_fn] - pub fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { - self.regions.alter_child_in(region_name, op); - self - } - // **< Page GETTERS >*************************************************************************** /// Devuelve el título traducido para el idioma de la página, si existe. @@ -194,13 +185,13 @@ impl Page { // **< Page RENDER >**************************************************************************** /// Renderiza los componentes de una región (`region_name`) de la página. + #[inline] pub fn render_region(&mut self, region_name: &'static str) -> Markup { - self.regions - .merge_all_components(self.context.theme(), region_name) - .render(&mut self.context) + self.context.render_region(region_name) } /// Renderiza los recursos de la página. + #[inline] pub fn render_assets(&mut self) -> Markup { self.context.render_assets() } @@ -238,8 +229,14 @@ impl Page { Ok(html! { (DOCTYPE) html lang=(lang) dir=(dir) { - (head) - (body) + head { + (head) + } + body id=[self.body_id().get()] class=[self.body_classes().get()] { + (self.render_region("page-top")) + (body) + (self.render_region("page-bottom")) + } } }) } @@ -290,6 +287,12 @@ impl Contextual for Page { self } + #[builder_fn] + fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { + self.context.alter_child_in(region_name, op); + self + } + // **< Contextual GETTERS >********************************************************************* fn request(&self) -> Option<&HttpRequest> { From 7b941cb02c1e6f7fa4b61f3514bca48889ad6c56 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 3 Oct 2025 01:55:03 +0200 Subject: [PATCH 806/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20`region=5Fnam?= =?UTF-8?q?e`=20a=20`region=5Fkey`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/theme/basic.rs | 4 +++- src/core/component/context.rs | 14 ++++++------ src/core/theme/definition.rs | 4 ++-- src/core/theme/regions.rs | 38 +++++++++++++++---------------- src/response/page.rs | 42 +++++++++++------------------------ 5 files changed, 44 insertions(+), 58 deletions(-) diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 28d93890..54660a96 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -136,7 +136,9 @@ fn render_intro(page: &mut Page) -> Markup { } } } - div class="intro-text" { (page.render_region("content")) } + div class="intro-text" { + (page.context().render_components_of("content")) + } } } footer class="intro-footer" { diff --git a/src/core/component/context.rs b/src/core/component/context.rs index b344c860..f58d3816 100644 --- a/src/core/component/context.rs +++ b/src/core/component/context.rs @@ -105,9 +105,9 @@ pub trait Contextual: LangId { #[builder_fn] fn with_assets(self, op: ContextOp) -> Self; - /// Opera con [`ChildOp`] en una región (`region_name`) de la página. + /// Opera con [`ChildOp`] en una región (`region_key`) de la página. #[builder_fn] - fn with_child_in(self, region_name: &'static str, op: ChildOp) -> Self; + fn with_child_in(self, region_key: &'static str, op: ChildOp) -> Self; // **< Contextual GETTERS >********************************************************************* @@ -290,10 +290,10 @@ impl Context { markup } - /// Renderiza los componentes de una región (`region_name`). - pub fn render_region(&mut self, region_name: &'static str) -> Markup { + /// Renderiza los componentes de una región (`region_key`). + pub fn render_components_of(&mut self, region_key: &'static str) -> Markup { self.regions - .merge_all_components(self.theme, region_name) + .merge_all_components(self.theme, region_key) .render(self) } @@ -486,8 +486,8 @@ impl Contextual for Context { } #[builder_fn] - fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { - self.regions.alter_child_in(region_name, op); + fn with_child_in(mut self, region_key: &'static str, op: ChildOp) -> Self { + self.regions.alter_child_in(region_key, op); self } diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 643bfffd..4478ad0b 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -36,7 +36,7 @@ pub trait ThemePage { fn render_body(&self, page: &mut Page, regions: &[(Region, L10n)]) -> Markup { html! { @for (region, region_label) in regions { - @let output = page.render_region(region.key()); + @let output = page.context().render_components_of(region.key()); @if !output.is_empty() { @let region_name = region.name(); div @@ -84,7 +84,7 @@ pub trait ThemePage { meta property=(property) content=(content) {} } - (page.render_assets()) + (page.context().render_assets()) } } } diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index f14645c0..3fdfe099 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -76,30 +76,30 @@ impl Region { pub struct ChildrenInRegions(HashMap<&'static str, Children>); impl ChildrenInRegions { - pub fn with(region_name: &'static str, child: Child) -> Self { - ChildrenInRegions::default().with_child_in(region_name, ChildOp::Add(child)) + pub fn with(region_key: &'static str, child: Child) -> Self { + ChildrenInRegions::default().with_child_in(region_key, ChildOp::Add(child)) } #[builder_fn] - pub fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { - if let Some(region) = self.0.get_mut(region_name) { + pub fn with_child_in(mut self, region_key: &'static str, op: ChildOp) -> Self { + if let Some(region) = self.0.get_mut(region_key) { region.alter_child(op); } else { - self.0.insert(region_name, Children::new().with_child(op)); + self.0.insert(region_key, Children::new().with_child(op)); } self } - pub fn merge_all_components(&self, theme_ref: ThemeRef, region_name: &'static str) -> Children { + pub fn merge_all_components(&self, theme_ref: ThemeRef, region_key: &'static str) -> Children { let common = COMMON_REGIONS.read(); if let Some(r) = THEME_REGIONS.read().get(&theme_ref.type_id()) { Children::merge(&[ - common.0.get(region_name), - self.0.get(region_name), - r.0.get(region_name), + common.0.get(region_key), + self.0.get(region_key), + r.0.get(region_key), ]) } else { - Children::merge(&[common.0.get(region_name), self.0.get(region_name)]) + Children::merge(&[common.0.get(region_key), self.0.get(region_key)]) } } } @@ -114,9 +114,9 @@ impl ChildrenInRegions { pub enum InRegion { /// Región de contenido por defecto. Content, - /// Región identificada por el nombre proporcionado. - Named(&'static str), - /// Región identificada por un nombre y asociada a un tema concreto. + /// Región identificada por la clave proporcionado. + Key(&'static str), + /// Región identificada por una clave para un tema concreto. OfTheme(&'static str, ThemeRef), } @@ -134,7 +134,7 @@ impl InRegion { /// ))); /// /// // Texto en la región "sidebar". - /// InRegion::Named("sidebar").add(Child::with(Html::with(|_| + /// InRegion::Key("sidebar").add(Child::with(Html::with(|_| /// html! { ("Publicidad") } /// ))); /// ``` @@ -145,19 +145,19 @@ impl InRegion { .write() .alter_child_in(REGION_CONTENT, ChildOp::Add(child)); } - InRegion::Named(region_name) => { + InRegion::Key(region_key) => { COMMON_REGIONS .write() - .alter_child_in(region_name, ChildOp::Add(child)); + .alter_child_in(region_key, ChildOp::Add(child)); } - InRegion::OfTheme(region_name, theme_ref) => { + InRegion::OfTheme(region_key, theme_ref) => { let mut regions = THEME_REGIONS.write(); if let Some(r) = regions.get_mut(&theme_ref.type_id()) { - r.alter_child_in(region_name, ChildOp::Add(child)); + r.alter_child_in(region_key, ChildOp::Add(child)); } else { regions.insert( theme_ref.type_id(), - ChildrenInRegions::with(region_name, child), + ChildrenInRegions::with(region_key, child), ); } } diff --git a/src/response/page.rs b/src/response/page.rs index deab452b..1649d543 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -103,8 +103,8 @@ impl Page { /// **Obsoleto desde la versión 0.4.0**: usar [`add_component_in()`](Self::add_component_in) en /// su lugar. #[deprecated(since = "0.4.0", note = "Use `add_component_in()` instead")] - pub fn with_component_in(self, region_name: &'static str, component: impl Component) -> Self { - self.add_component_in(region_name, component) + pub fn with_component_in(self, region_key: &'static str, component: impl Component) -> Self { + self.add_component_in(region_key, component) } /// Añade un componente a la región de contenido por defecto. @@ -114,30 +114,26 @@ impl Page { self } - /// Añade un componente en una región (`region_name`) de la página. - pub fn add_component_in( - mut self, - region_name: &'static str, - component: impl Component, - ) -> Self { + /// Añade un componente en una región (`region_key`) de la página. + pub fn add_component_in(mut self, region_key: &'static str, component: impl Component) -> Self { self.context - .alter_child_in(region_name, ChildOp::Add(Child::with(component))); + .alter_child_in(region_key, ChildOp::Add(Child::with(component))); self } /// **Obsoleto desde la versión 0.4.0**: usar [`with_child_in()`](Self::with_child_in) en su /// lugar. #[deprecated(since = "0.4.0", note = "Use `with_child_in()` instead")] - pub fn with_child_in_region(mut self, region_name: &'static str, op: ChildOp) -> Self { - self.alter_child_in(region_name, op); + pub fn with_child_in_region(mut self, region_key: &'static str, op: ChildOp) -> Self { + self.alter_child_in(region_key, op); self } /// **Obsoleto desde la versión 0.4.0**: usar [`alter_child_in()`](Self::alter_child_in) en su /// lugar. #[deprecated(since = "0.4.0", note = "Use `alter_child_in()` instead")] - pub fn alter_child_in_region(&mut self, region_name: &'static str, op: ChildOp) -> &mut Self { - self.alter_child_in(region_name, op); + pub fn alter_child_in_region(&mut self, region_key: &'static str, op: ChildOp) -> &mut Self { + self.alter_child_in(region_key, op); self } @@ -184,18 +180,6 @@ impl Page { // **< Page RENDER >**************************************************************************** - /// Renderiza los componentes de una región (`region_name`) de la página. - #[inline] - pub fn render_region(&mut self, region_name: &'static str) -> Markup { - self.context.render_region(region_name) - } - - /// Renderiza los recursos de la página. - #[inline] - pub fn render_assets(&mut self) -> Markup { - self.context.render_assets() - } - /// Renderiza la página completa en formato HTML. /// /// Ejecuta las acciones correspondientes antes y después de renderizar el `<body>`, @@ -233,9 +217,9 @@ impl Page { (head) } body id=[self.body_id().get()] class=[self.body_classes().get()] { - (self.render_region("page-top")) + (self.context.render_components_of("page-top")) (body) - (self.render_region("page-bottom")) + (self.context.render_components_of("page-bottom")) } } }) @@ -288,8 +272,8 @@ impl Contextual for Page { } #[builder_fn] - fn with_child_in(mut self, region_name: &'static str, op: ChildOp) -> Self { - self.context.alter_child_in(region_name, op); + fn with_child_in(mut self, region_key: &'static str, op: ChildOp) -> Self { + self.context.alter_child_in(region_key, op); self } From 5f64d500808858b3baa39fc8baa3277707678b73 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 4 Oct 2025 08:25:04 +0200 Subject: [PATCH 807/853] =?UTF-8?q?=F0=9F=8E=A8=20Mejora=20`Region`=20para?= =?UTF-8?q?=20declarar=20las=20regiones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/theme/definition.rs | 32 ++++++++++++++++---------------- src/core/theme/regions.rs | 12 +++++++++++- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 4478ad0b..0322a31e 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -28,14 +28,14 @@ pub type ThemeRef = &'static dyn Theme; pub trait ThemePage { /// Renderiza el **contenido interior** del `<body>` de la página. /// - /// Recorre `regions` en el **orden declarado** y, para cada región con contenido, genera un - /// contenedor con `role="region"` y un `aria-label` localizado. + /// Esta implementación recorre `regions` en el **orden declarado** y, para cada región con + /// contenido, genera un contenedor con `role="region"` y un `aria-label` localizado. /// Se asume que cada identificador de región es **único** dentro de la página. /// /// La etiqueta `<body>` no se incluye aquí; únicamente renderiza su contenido. - fn render_body(&self, page: &mut Page, regions: &[(Region, L10n)]) -> Markup { + fn render_body(&self, page: &mut Page, regions: &[Region]) -> Markup { html! { - @for (region, region_label) in regions { + @for region in regions { @let output = page.context().render_components_of(region.key()); @if !output.is_empty() { @let region_name = region.name(); @@ -43,7 +43,7 @@ pub trait ThemePage { id=(region_name) class={ "region region--" (region_name) } role="region" - aria-label=[region_label.lookup(page)] + aria-label=[region.label().lookup(page)] { (output) } @@ -125,31 +125,31 @@ pub trait Theme: Extension + ThemePage + Send + Sync { /// Declaración ordenada de las regiones disponibles en la página. /// - /// Devuelve una **lista estática** de pares `(Region, L10n)` que se usará para renderizar todas - /// las regiones que componen una página en el orden indicado . + /// Devuelve una **lista estática** de regiones ([`Region`](crate::core::theme::Region)) con la + /// información necesaria para renderizar el contenedor de cada región. /// /// Si un tema necesita un conjunto distinto de regiones, se puede **sobrescribir** este método /// con los siguientes requisitos y recomendaciones: /// /// - Los identificadores deben ser **estables** (p. ej. `"sidebar-left"`, `"content"`). - /// - La región `"content"` es **obligatoria**. Se puede usar [`Region::default()`] para - /// declararla. - /// - La etiqueta `L10n` se evalúa con el idioma activo de la página. + /// - La región `"content"` es **obligatoria** porque se usa por defecto para añadir componentes + /// para renderizar. Se puede utilizar [`Region::default()`] para declararla. + /// - La etiqueta `L10n` se evaluará con el idioma activo de la página. /// /// Por defecto devuelve: /// /// - `"header"`: cabecera. /// - `"content"`: contenido principal (**obligatoria**). /// - `"footer"`: pie. - fn page_regions(&self) -> &'static [(Region, L10n)] { - static REGIONS: LazyLock<[(Region, L10n); 3]> = LazyLock::new(|| { + fn page_regions(&self) -> &'static [Region] { + static REGIONS: LazyLock<[Region; 3]> = LazyLock::new(|| { [ - (Region::declare("header"), L10n::l("region_header")), - (Region::default(), L10n::l("region_content")), - (Region::declare("footer"), L10n::l("region_footer")), + Region::declare("header", L10n::l("region_header")), + Region::default(), + Region::declare("footer", L10n::l("region_footer")), ] }); - &REGIONS[..] + &*REGIONS } /// Acciones específicas del tema antes de renderizar el `<body>` de la página. diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 3fdfe099..00ff60cb 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -1,5 +1,6 @@ use crate::core::component::{Child, ChildOp, Children}; use crate::core::theme::ThemeRef; +use crate::locale::L10n; use crate::{builder_fn, AutoDefault, UniqueId}; use parking_lot::RwLock; @@ -29,6 +30,7 @@ pub const REGION_CONTENT: &str = "content"; pub struct Region { key: &'static str, name: String, + label: L10n, } impl Default for Region { @@ -37,6 +39,7 @@ impl Default for Region { Self { key: REGION_CONTENT, name: REGION_CONTENT.to_string(), + label: L10n::l("region_content"), } } } @@ -51,10 +54,11 @@ impl Region { /// sencillos, limitando los caracteres a `[a-z0-9-]` (p.ej., `"sidebar"` o `"main-menu"`), cuyo /// nombre normalizado coincidirá con la clave. #[inline] - pub fn declare(key: &'static str) -> Self { + pub fn declare(key: &'static str, label: L10n) -> Self { Self { key, name: key.trim().to_ascii_lowercase().replace(' ', "-"), + label, } } @@ -69,6 +73,12 @@ impl Region { pub fn name(&self) -> &str { &self.name } + + /// Devuelve la etiqueta localizada asociada a la región. + #[inline] + pub fn label(&self) -> &L10n { + &self.label + } } // Contenedor interno de componentes agrupados por región. From cac50b21cb6f724b06070d2dc5f24582bb3a42b7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 6 Oct 2025 04:09:26 +0200 Subject: [PATCH 808/853] =?UTF-8?q?=F0=9F=9A=A7=20Depura=20la=20estructura?= =?UTF-8?q?=20y=20estilos=20del=20men=C3=BA=20e=20intro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/menu/item.rs | 8 +- src/base/theme/basic.rs | 55 +++++----- src/core/theme/definition.rs | 83 +++++++++++----- static/css/basic.css | 16 +++ static/css/intro.css | 112 +++++++++------------ static/css/menu.css | 171 +++++++++++++++++++++++--------- static/css/root.css | 19 ++++ static/js/menu.js | 1 - 8 files changed, 302 insertions(+), 163 deletions(-) diff --git a/src/base/component/menu/item.rs b/src/base/component/menu/item.rs index 7a36fbbf..c9f79033 100644 --- a/src/base/component/menu/item.rs +++ b/src/base/component/menu/item.rs @@ -49,7 +49,7 @@ impl Component for Item { }), ItemKind::Link(label, path) => PrepareMarkup::With(html! { li class="menu__item menu__item--link" { - a href=(path(cx)) title=[description] { + a class="menu__link" href=(path(cx)) title=[description] { (left_icon) span class="menu__label" { (label.using(cx)) } (right_icon) @@ -58,7 +58,7 @@ impl Component for Item { }), ItemKind::LinkBlank(label, path) => PrepareMarkup::With(html! { li class="menu__item menu__item--link" { - a href=(path(cx)) title=[description] target="_blank" { + a class="menu__link" href=(path(cx)) title=[description] target="_blank" { (left_icon) span class="menu__label" { (label.using(cx)) } (right_icon) @@ -72,7 +72,7 @@ impl Component for Item { }), ItemKind::Submenu(label, submenu) => PrepareMarkup::With(html! { li class="menu__item menu__item--children" { - a href="#" title=[description] { + button type="button" class="menu__link" title=[description] { (left_icon) span class="menu__label" { (label.using(cx)) } (Icon::svg(html! { @@ -86,7 +86,7 @@ impl Component for Item { }), ItemKind::Megamenu(label, megamenu) => PrepareMarkup::With(html! { li class="menu__item menu__item--children" { - a href="#" title=[description] { + button type="button" class="menu__link" title=[description] { (left_icon) span class="menu__label" { (label.using(cx)) } (Icon::svg(html! { diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 54660a96..97d28b82 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -46,12 +46,8 @@ impl Theme for Basic { } fn after_render_page_body(&self, page: &mut Page) { - let styles = match page.layout() { - "Intro" => "/css/intro.css", - "PageTopIntro" => "/css/intro.css", - _ => "/css/basic.css", - }; let pkg_version = env!("CARGO_PKG_VERSION"); + page.alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/css/normalize.css") .with_version("8.0.1") @@ -62,6 +58,11 @@ impl Theme for Basic { .with_version(pkg_version) .with_weight(-99), )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/basic.css") + .with_version(pkg_version) + .with_weight(-99), + )) .alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/css/components.css") .with_version(pkg_version) @@ -72,11 +73,6 @@ impl Theme for Basic { .with_version(pkg_version) .with_weight(-99), )) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from(styles) - .with_version(pkg_version) - .with_weight(-99), - )) .alter_assets(ContextOp::AddJavaScript( JavaScript::defer("/js/menu.js") .with_version(pkg_version) @@ -86,9 +82,18 @@ impl Theme for Basic { } fn render_intro(page: &mut Page) -> Markup { + page.alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/intro.css").with_version(env!("CARGO_PKG_VERSION")), + )); + let title = page.title().unwrap_or_default(); let intro = page.description().unwrap_or_default(); + let theme = page.context().theme(); + let h = theme.render_page_region(page, "header"); + let c = theme.render_page_region(page, "content"); + let f = theme.render_page_region(page, "footer"); + let intro_button_txt: L10n = page.param_or_default("intro_button_txt"); let intro_button_lnk: Option<&String> = page.param("intro_button_lnk"); @@ -118,26 +123,27 @@ fn render_intro(page: &mut Page) -> Markup { } } } + (h) } main class="intro-content" { section class="intro-content__body" { - @if intro_button_lnk.is_some() { - div class="intro-button" { - a - class="intro-button__link" - href=[intro_button_lnk] - target="_blank" - rel="noreferrer" - { - span {} span {} span {} - div class="intro-button__text" { - (intro_button_txt.using(page)) + div class="intro-text" { + @if intro_button_lnk.is_some() { + div class="intro-button" { + a + class="intro-button__link" + href=[intro_button_lnk] + target="_blank" + rel="noreferrer" + { + span {} span {} span {} + div class="intro-button__text" { + (intro_button_txt.using(page)) + } } } } - } - div class="intro-text" { - (page.context().render_components_of("content")) + (c) } } } @@ -164,6 +170,7 @@ fn render_intro(page: &mut Page) -> Markup { em { (L10n::l("intro_have_fun").using(page)) } } } + (f) } } } diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 0322a31e..5756fb23 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -15,50 +15,70 @@ pub type ThemeRef = &'static dyn Theme; /// Métodos predefinidos de renderizado para las páginas de un tema. /// -/// Contiene las implementaciones base de las **secciones** `<head>` y `<body>`. Se implementa -/// automáticamente para cualquier tipo que implemente [`Theme`], por lo que normalmente no requiere -/// implementación explícita. +/// Contiene las implementaciones base para renderizar las **secciones** `<head>` y `<body>`. Se +/// implementa automáticamente para cualquier tipo que implemente [`Theme`], por lo que normalmente +/// no requiere implementación explícita. /// -/// Si un tema **sobrescribe** [`render_page_head()`](Theme::render_page_head) o -/// [`render_page_body()`](Theme::render_page_body), se puede volver al comportamiento por defecto -/// cuando se necesite usando FQS (*Fully Qualified Syntax*): +/// Si un tema **sobrescribe** uno o más de estos métodos de [`Theme`]: +/// +/// - [`render_page_region()`](Theme::render_page_region), +/// - [`render_page_head()`](Theme::render_page_head), o +/// - [`render_page_body()`](Theme::render_page_body); +/// +/// es posible volver al comportamiento por defecto usando FQS (*Fully Qualified Syntax*): /// /// - `<Self as ThemePage>::render_body(self, page, self.page_regions())` /// - `<Self as ThemePage>::render_head(self, page)` pub trait ThemePage { + /// Renderiza el **contenedor** de una región concreta del `<body>` de la página. + /// + /// Obtiene los componentes asociados a `region.key()` desde el contexto de la página y, si hay + /// salida, envuelve el contenido en un contenedor `<div>` predefinido. + /// + /// Si la región **no produce contenido**, devuelve un `Markup` vacío. + #[inline] + fn render_region(&self, page: &mut Page, region: &Region) -> Markup { + html! { + @let output = page.context().render_components_of(region.key()); + @if !output.is_empty() { + @let region_name = region.name(); + div + id=(region_name) + class={ "region region--" (region_name) } + role="region" + aria-label=[region.label().lookup(page)] + { + (output) + } + } + } + } + /// Renderiza el **contenido interior** del `<body>` de la página. /// - /// Esta implementación recorre `regions` en el **orden declarado** y, para cada región con - /// contenido, genera un contenedor con `role="region"` y un `aria-label` localizado. - /// Se asume que cada identificador de región es **único** dentro de la página. + /// Recorre `regions` en el **orden declarado** y, para cada región con contenido, delega en + /// [`render_region()`](Self::render_region) la generación del contenedor. Las regiones sin + /// contenido **no** producen salida. Se asume que cada identificador de región es **único** + /// dentro de la página. /// /// La etiqueta `<body>` no se incluye aquí; únicamente renderiza su contenido. + #[inline] fn render_body(&self, page: &mut Page, regions: &[Region]) -> Markup { html! { @for region in regions { - @let output = page.context().render_components_of(region.key()); - @if !output.is_empty() { - @let region_name = region.name(); - div - id=(region_name) - class={ "region region--" (region_name) } - role="region" - aria-label=[region.label().lookup(page)] - { - (output) - } - } + (self.render_region(page, region)) } } } /// Renderiza el **contenido interior** del `<head>` de la página. /// - /// Recorre y genera por defecto las etiquetas básicas (`charset`, `title`, `description`, - /// `viewport`, `X-UA-Compatible`), los metadatos (`name/content`) y propiedades - /// (`property/content`), además de los recursos CSS/JS de la página. + /// Incluye por defecto las etiquetas básicas (`charset`, `title`, `description`, `viewport`, + /// `X-UA-Compatible`), los metadatos (`name/content`) y propiedades (`property/content`), + /// además de los recursos CSS/JS de la página. /// - /// La etiqueta `<head>` no se incluye aquí; únicamente renderiza su contenido. + /// La etiqueta `<head>` no se incluye aquí; únicamente se renderiza su contenido. + #[inline] fn render_head(&self, page: &mut Page) -> Markup { let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { @@ -152,6 +172,19 @@ pub trait Theme: Extension + ThemePage + Send + Sync { &*REGIONS } + /// Renderiza una región de la página **por clave**. + /// + /// Busca en [`page_regions()`](Self::page_regions) la región asociada a una clave y, si existe, + /// delega en [`ThemePage::render_region()`] su renderizado. Si no se encuentra la clave o la + /// región no produce contenido, devuelve un `Markup` vacío. + fn render_page_region(&self, page: &mut Page, key: &str) -> Markup { + html! { + @if let Some(region) = self.page_regions().iter().find(|r| r.key() == key) { + (self.render_region(page, region)) + } + } + } + /// Acciones específicas del tema antes de renderizar el `<body>` de la página. /// /// Útil para preparar clases, inyectar recursos o ajustar metadatos. diff --git a/static/css/basic.css b/static/css/basic.css index 04801dd0..058e1736 100644 --- a/static/css/basic.css +++ b/static/css/basic.css @@ -1,3 +1,19 @@ +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + font-family: var(--val-font-family); + font-size: var(--val-fs--base); + font-weight: var(--val-fw--base); + line-height: var(--val-lh--base); + color: var(--val-color--text); + background-color: var(--val-color--bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; +} + /* Page layout */ .region--footer { diff --git a/static/css/intro.css b/static/css/intro.css index 39c9d6ad..774bbb2a 100644 --- a/static/css/intro.css +++ b/static/css/intro.css @@ -1,37 +1,15 @@ -:root { - --bg-img: url('/img/intro-header.jpg'); - --bg-img-set: image-set(url('/img/intro-header.avif') type('image/avif'), url('/img/intro-header.webp') type('image/webp'), var(--bg-img) type('image/jpeg')); - --bg-img-sm: url('/img/intro-header-sm.jpg'); - --bg-img-sm-set: image-set(url('/img/intro-header-sm.avif') type('image/avif'), url('/img/intro-header-sm.webp') type('image/webp'), var(--bg-img-sm) type('image/jpeg')); - --bg-color: #8c5919; - --color: #1a202c; - --color-gray: #e4e4e7; - --color-link: #1e4eae; - --color-block-1: #b689ff; - --color-block-2: #fecaca; - --color-block-3: #e6a9e2; - --color-block-4: #ffedca; - --color-block-5: #ffffff; - --focus-outline: 2px solid var(--color-link); - --focus-outline-offset: 2px; - --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); -} - html { min-height: 100%; background-color: black; } + body { margin: auto; position: relative; min-height: 100%; min-width: 350px; - background-color: var(--bg-color); - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - font-size: 1.125rem; - font-weight: 300; - color: var(--color); - line-height: 1.6; + color: var(--intro-color); + background-color: var(--intro-bg-color); width: 100%; display: flex; @@ -51,12 +29,12 @@ a { transition: font-size 0.2s, text-decoration-color 0.2s; } a:focus-visible { - outline: var(--focus-outline); - outline-offset: var(--focus-outline-offset); + outline: var(--intro-focus-outline); + outline-offset: var(--intro-focus-outline-offset); } a:hover, a:hover:visited { - text-decoration-color: var(--color-link); + text-decoration-color: var(--intro-color-link); } /* @@ -69,9 +47,9 @@ a:hover:visited { width: 100%; max-width: 80rem; margin: 0 auto; - padding-bottom: 9rem; - background-image: var(--bg-img-sm); - background-image: var(--bg-img-sm-set); + padding-bottom: 4rem; + background-image: var(--intro-bg-img-sm); + background-image: var(--intro-bg-img-sm-set); background-position: top center; background-position-y: -1rem; background-size: contain; @@ -119,8 +97,8 @@ a:hover:visited { } @media (min-width: 64rem) { .intro-header { - background-image: var(--bg-img); - background-image: var(--bg-img-set); + background-image: var(--intro-bg-img); + background-image: var(--intro-bg-img-set); } .intro-header__title { padding: 1.2rem 2rem 2.6rem 2rem; @@ -180,8 +158,7 @@ a:hover:visited { .intro-button { width: 100%; - margin: 0 auto 3rem; - z-index: 10; + margin: 0 auto; } .intro-button__link { background: #7f1d1d; @@ -306,6 +283,9 @@ a:hover:visited { animation-play-state: paused; } @media (max-width: 48rem) { + .intro-header { + padding-bottom: 9rem;; + } .intro-button__link { height: 6.25rem; min-width: auto; @@ -342,17 +322,15 @@ a:hover:visited { font-size: 1.3125rem; font-weight: 400; line-height: 1.5; - margin-top: -6rem; margin-bottom: 0; background: #fff; position: relative; +} +.region--content { padding: 2.5rem 1.063rem 0.75rem; overflow: hidden; } -.intro-button + .intro-text { - padding-top: 6rem; -} -.intro-text p { +.region--content p { width: 100%; line-height: 150%; font-weight: 400; @@ -364,31 +342,39 @@ a:hover:visited { font-size: 1.375rem; line-height: 2rem; } - .intro-button + .intro-text { + .intro-button + .region--content { padding-top: 7rem; } } @media (min-width: 64rem) { - .intro-text { + .intro-header { + padding-bottom: 9rem;; + } + .intro-text, + .region--content { border-radius: 0.75rem; - box-shadow: var(--shadow); + } + .intro-text { + box-shadow: var(--intro-shadow); max-width: 60rem; margin: 0 auto 6rem; + } + .region--content { padding-left: 4.5rem; padding-right: 4.5rem; } } -.intro-text .block { +.region--content .block { position: relative; } -.intro-text .block__title { +.region--content .block__title { margin: 1em 0 .8em; } -.intro-text .block__title span { +.region--content .block__title span { display: inline-block; padding: 10px 30px 14px; - margin: 0 0 0 20px; + margin: 30px 0 0 20px; background: white; border: 5px solid; border-radius: 30px; @@ -396,7 +382,7 @@ a:hover:visited { border-color: orangered; transform: rotate(-3deg) translateY(-25%); } -.intro-text .block__title:before { +.region--content .block__title:before { content: ""; height: 5px; position: absolute; @@ -409,7 +395,7 @@ a:hover:visited { transform: rotate(2deg) translateY(-50%); transform-origin: top left; } -.intro-text .block__title:after { +.region--content .block__title:after { content: ""; height: 70rem; position: absolute; @@ -417,23 +403,23 @@ a:hover:visited { left: -15%; width: 130%; z-index: -10; - background: var(--color-block-1); + background: var(--intro-bg-block-1); transform: rotate(2deg); } -.intro-text .block:nth-of-type(5n+1) .block__title:after { - background: var(--color-block-1); +.region--content .block:nth-of-type(5n+1) .block__title:after { + background: var(--intro-bg-block-1); } -.intro-text .block:nth-of-type(5n+2) .block__title:after { - background: var(--color-block-2); +.region--content .block:nth-of-type(5n+2) .block__title:after { + background: var(--intro-bg-block-2); } -.intro-text .block:nth-of-type(5n+3) .block__title:after { - background: var(--color-block-3); +.region--content .block:nth-of-type(5n+3) .block__title:after { + background: var(--intro-bg-block-3); } -.intro-text .block:nth-of-type(5n+4) .block__title:after { - background: var(--color-block-4); +.region--content .block:nth-of-type(5n+4) .block__title:after { + background: var(--intro-bg-block-4); } -.intro-text .block:nth-of-type(5n+5) .block__title:after { - background: var(--color-block-5); +.region--content .block:nth-of-type(5n+5) .block__title:after { + background: var(--intro-bg-block-5); } /* @@ -443,7 +429,7 @@ a:hover:visited { .intro-footer { width: 100%; background-color: black; - color: var(--color-gray); + color: var(--intro-color-gray); padding-bottom: 2rem; } @@ -459,7 +445,7 @@ a:hover:visited { line-height: 100%; } .intro-footer__body a:visited { - color: var(--color-gray); + color: var(--intro-color-gray); } .intro-footer__logo, .intro-footer__links { @@ -492,5 +478,5 @@ a:hover:visited { /* PoweredBy component */ .poweredby a:visited { - color: var(--color-gray); + color: var(--intro-color-gray); } diff --git a/static/css/menu.css b/static/css/menu.css index 5520e398..6522f4a7 100644 --- a/static/css/menu.css +++ b/static/css/menu.css @@ -1,54 +1,92 @@ +/* Aislamiento & normalización */ + .menu { + isolation: isolate; +} +@supports (all: revert) { + .menu { + all: revert; + display: block; } +} +.menu { + box-sizing: border-box; + line-height: var(--val-menu--line-height, 1.5); + color: var(--val-color--text); + text-align: left; + text-transform: none; + letter-spacing: normal; + word-spacing: normal; + white-space: normal; + cursor: default; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + width: 100%; height: auto; margin: 0; padding: 0; z-index: 9999; - border: none; - outline: none; + border: 0; background: var(--val-menu--color-bg); } +.menu *, +.menu *::before, +.menu *::after { + box-sizing: inherit; +} +.menu :where(a, button) { + appearance: none; + background: none; + border: 0; + font: inherit; + color: inherit; + text-decoration: none; + cursor: pointer; + -webkit-tap-highlight-color: transparent; +} +.menu :where(a, button):focus-visible { + outline: 2px solid var(--val-menu--color-highlight); + outline-offset: 2px; +} +.menu :where(ul, ol) { + list-style: none; + margin: 0; + padding: 0; +} +.menu svg { + fill: currentColor; +} + +/* Estructura */ .menu__wrapper { padding-right: var(--val-gap); } -.menu__wrapper a, -.menu__wrapper button { - cursor: pointer; - border: none; - background: none; - text-decoration: none; -} -.menu__nav ul { - margin: 0; - padding: 0; -} .menu__nav li { display: inline-block; - margin: 0 0 0 1.5rem; + margin: 0; + margin-inline-start: 1.5rem; padding: 0; line-height: var(--val-menu--item-height); list-style: none; - list-style-type: none; } .menu__item--label, -.menu__nav li > a { +.menu__nav li > .menu__link { position: relative; - font-weight: 500; - color: var(--val-color--text); + font-weight: normal; text-rendering: optimizeLegibility; + font-size: 1.45rem; } -.menu__nav li > a { - border: none; +.menu__nav li > .menu__link { transition: color 0.3s ease-in-out; } -.menu__nav li:hover > a, -.menu__nav li > a:focus { +.menu__nav li:hover > .menu__link, +.menu__nav li > .menu__link:focus { color: var(--val-menu--color-highlight); } -.menu__nav li > a > svg.icon { +.menu__nav li > .menu__link > svg.icon { margin-left: 0.25rem; } @@ -57,19 +95,18 @@ max-width: 100%; height: auto; padding: var(--val-gap-0-5) var(--val-gap-1-5); - border: none; - outline: none; + border: 0; background: var(--val-menu--color-bg); border-top: 3px solid var(--val-menu--color-highlight); z-index: 500; opacity: 0; visibility: hidden; box-shadow: 0 4px 6px -1px var(--val-menu--color-border), 0 2px 4px -1px var(--val-menu--color-shadow); - transition: all 0.5s ease-in-out; + transition: all 0.3s ease-in-out; } .menu__item--children:hover > .menu__children, -.menu__item--children > a:focus + .menu__children, +.menu__item--children > .menu__link:focus + .menu__children, .menu__item--children .menu__children:focus-within { margin-top: 0.4rem; opacity: 1; @@ -81,14 +118,12 @@ max-width: var(--val-menu--item-width-max); } .menu__submenu-title { - font-family: inherit; font-size: 1rem; - font-weight: 500; + font-weight: normal; margin: 0; padding: var(--val-menu--line-padding) 0; line-height: var(--val-menu--line-height); - border: none; - outline: none; + border: 0; color: var(--val-menu--color-highlight); text-transform: uppercase; text-rendering: optimizeLegibility; @@ -113,18 +148,15 @@ display: none; } -/* Applies <= 992px */ -@media only screen and (max-width: 62rem) { +/* Responsive <= 62rem (992px) */ + +@media (max-width: 62rem) { .menu__wrapper { padding-right: var(--val-gap-0-5); } .menu__trigger { - cursor: pointer; width: var(--val-menu--trigger-width); height: var(--val-menu--item-height); - border: none; - outline: none; - background: none; display: flex; flex-direction: column; justify-content: center; @@ -133,6 +165,13 @@ width: 2rem; height: 2rem; } + + .menu__nav, + .menu__children { + overscroll-behavior: contain; + -webkit-overflow-scrolling: touch; + } + .menu__nav { position: fixed; top: 0; @@ -143,10 +182,16 @@ overflow: hidden; background: var(--val-menu--color-bg); transform: translate(-100%); - transition: all 0.5s ease-in-out; + transition: transform .5s ease-in-out, opacity .5s ease-in-out; + will-change: transform; + backface-visibility: hidden; + visibility: hidden; + pointer-events: none; } .menu__nav.active { transform: translate(0%); + visibility: visible; + pointer-events: auto; } .menu__nav li { @@ -156,16 +201,18 @@ } .menu__item--label, - .menu__nav li > a { + .menu__nav li > .menu__link { display: block; + text-align: inherit; + width: 100%; padding: var(--val-menu--line-padding) var(--val-menu--item-height) var(--val-menu--line-padding) var(--val-menu--item-gap); border-bottom: 1px solid var(--val-menu--color-border); } .menu__nav li ul li.menu__item--label, - .menu__nav li ul li > a { + .menu__nav li ul li > .menu__link { border-bottom: 0; } - .menu__nav li > a > svg.icon { + .menu__nav li > .menu__link > svg.icon { position: absolute; top: var(--val-menu--line-padding); right: var(--val-menu--line-padding); @@ -191,6 +238,7 @@ visibility: visible; transform: translateX(0%); box-shadow: none; + transition: opacity .5s ease-in-out, transform .5s ease-in-out, margin-top .5s ease-in-out; } .menu__children.active { display: block; @@ -223,6 +271,16 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + font-size: 1.45rem; + font-weight: normal; + opacity: 0; + transform: translateY(.25rem); + transition: opacity .5s ease-in-out, transform .5s ease-in-out; + will-change: opacity, transform; + } + .menu__header.active .menu__title { + opacity: 1; + transform: translateY(0); } .menu__close, .menu__back { @@ -231,18 +289,20 @@ height: var(--val-menu--item-height); line-height: var(--val-menu--item-height); color: var(--val-color--text); - cursor: pointer; display: flex; align-items: center; justify-content: center; + background: var(--val-menu--color-bg); } .menu__close { font-size: 2.25rem; - border-left: 1px solid var(--val-menu--color-border) !important; + border: 1px solid var(--val-menu--color-border) !important; + border-width: 0 0 1px 1px !important; } .menu__back { font-size: 1.25rem; - border-right: 1px solid var(--val-menu--color-border) !important; + border: 1px solid var(--val-menu--color-border) !important; + border-width: 0 1px 1px 0 !important; display: none; } .menu__header.active .menu__back { @@ -267,15 +327,34 @@ opacity: 0; visibility: hidden; background: rgba(0, 0, 0, 0.55); - transition: all 0.5s ease-in-out; + transition: opacity .5s ease-in-out, visibility 0s linear .5s; } .menu__overlay.active { opacity: 1; visibility: visible; + transition-delay: 0s, 0s; + } +} + +@media (hover: hover) and (pointer: fine) { + .menu__item--children:hover > .menu__children { + margin-top: 0.4rem; + opacity: 1; + visibility: visible; } } -/* ANIMATIONS */ +@media (prefers-reduced-motion: reduce) { + .menu__nav, + .menu__children, + .menu__title, + .menu__overlay { + transition: none !important; + animation: none !important; + } +} + +/* Animaciones */ @keyframes slideLeft { 0% { diff --git a/static/css/root.css b/static/css/root.css index aeab1c67..270c1b3f 100644 --- a/static/css/root.css +++ b/static/css/root.css @@ -1,3 +1,22 @@ +:root { + --intro-bg-img: url('/img/intro-header.jpg'); + --intro-bg-img-set: image-set(url('/img/intro-header.avif') type('image/avif'), url('/img/intro-header.webp') type('image/webp'), var(--intro-bg-img) type('image/jpeg')); + --intro-bg-img-sm: url('/img/intro-header-sm.jpg'); + --intro-bg-img-sm-set: image-set(url('/img/intro-header-sm.avif') type('image/avif'), url('/img/intro-header-sm.webp') type('image/webp'), var(--intro-bg-img-sm) type('image/jpeg')); + --intro-bg-color: #8c5919; + --intro-bg-block-1: #b689ff; + --intro-bg-block-2: #fecaca; + --intro-bg-block-3: #e6a9e2; + --intro-bg-block-4: #ffedca; + --intro-bg-block-5: #ffffff; + --intro-color: #1a202c; + --intro-color-gray: #e4e4e7; + --intro-color-link: #1e4eae; + --intro-focus-outline: 2px solid var(--intro-color-link); + --intro-focus-outline-offset: 2px; + --intro-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); +} + :root { --val-font-sans: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; --val-font-serif: "Lora","georgia",serif; diff --git a/static/js/menu.js b/static/js/menu.js index 6b5ae1b0..1f09bfe5 100644 --- a/static/js/menu.js +++ b/static/js/menu.js @@ -48,7 +48,6 @@ function menu__reset(menu, nav, overlay) { } document.querySelectorAll('.menu').forEach(menu => { - let menuChildren = []; const menuNav = menu.querySelector('.menu__nav'); const menuOverlay = menu.querySelector('.menu__overlay'); From b076e22c2bdd0727f053313ec5e973a9b7341f3c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Tue, 7 Oct 2025 05:56:32 +0200 Subject: [PATCH 809/853] =?UTF-8?q?=F0=9F=8E=A8=20Mejora=20el=20uso=20de?= =?UTF-8?q?=20regiones=20y=20a=C3=B1ade=20`BasicRegion`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/theme.rs | 2 +- src/base/theme/basic.rs | 9 ++- src/core/theme.rs | 4 +- src/core/theme/definition.rs | 121 ++++++++++++++++++++++++----------- src/core/theme/regions.rs | 110 ++++++++++++++++--------------- 5 files changed, 148 insertions(+), 98 deletions(-) diff --git a/src/base/theme.rs b/src/base/theme.rs index 40129bfa..a4b2df5b 100644 --- a/src/base/theme.rs +++ b/src/base/theme.rs @@ -1,4 +1,4 @@ //! Temas básicos soportados por PageTop. mod basic; -pub use basic::Basic; +pub use basic::{Basic, BasicRegion}; diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 97d28b82..b6a982f6 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -1,6 +1,9 @@ /// Es el tema básico que incluye PageTop por defecto. use crate::prelude::*; +/// El tema básico usa las mismas regiones predefinidas por [`ThemeRegion`]. +pub type BasicRegion = ThemeRegion; + /// Tema básico por defecto. /// /// Ofrece las siguientes composiciones (*layouts*): @@ -90,9 +93,9 @@ fn render_intro(page: &mut Page) -> Markup { let intro = page.description().unwrap_or_default(); let theme = page.context().theme(); - let h = theme.render_page_region(page, "header"); - let c = theme.render_page_region(page, "content"); - let f = theme.render_page_region(page, "footer"); + let h = theme.render_page_region(page, &BasicRegion::Header); + let c = theme.render_page_region(page, &BasicRegion::Content); + let f = theme.render_page_region(page, &BasicRegion::Footer); let intro_button_txt: L10n = page.param_or_default("intro_button_txt"); let intro_button_lnk: Option<&String> = page.param("intro_button_lnk"); diff --git a/src/core/theme.rs b/src/core/theme.rs index 61d820b4..64f40f33 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -15,10 +15,10 @@ //! [`Theme`]. mod definition; -pub use definition::{Theme, ThemePage, ThemeRef}; +pub use definition::{Theme, ThemePage, ThemeRef, ThemeRegion}; mod regions; pub(crate) use regions::{ChildrenInRegions, REGION_CONTENT}; -pub use regions::{InRegion, Region}; +pub use regions::{InRegion, Region, RegionRef}; pub(crate) mod all; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 5756fb23..7ef95c46 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,9 +1,9 @@ use crate::core::extension::Extension; -use crate::core::theme::Region; -use crate::global; +use crate::core::theme::{Region, RegionRef, REGION_CONTENT}; use crate::html::{html, Markup}; use crate::locale::L10n; use crate::response::page::Page; +use crate::{global, join}; use std::sync::LazyLock; @@ -13,6 +13,46 @@ use std::sync::LazyLock; /// implementen [`Theme`] y, a su vez, [`Extension`]. pub type ThemeRef = &'static dyn Theme; +/// Conjunto de regiones que los temas pueden exponer para el renderizado. +/// +/// `ThemeRegion` define un conjunto de regiones predefinidas para estructurar un documento HTML. +/// Proporciona **identificadores estables** (vía [`Region::key()`]) y **etiquetas localizables** +/// (vía [`Region::label()`]) a las regiones donde se añadirán los componentes. +/// +/// Se usa por defecto en [`Theme::page_regions()`](crate::core::theme::Theme::page_regions) y sus +/// variantes representan el conjunto mínimo recomendado para cualquier tema. Sin embargo, cada tema +/// podría exponer su propio conjunto de regiones. +pub enum ThemeRegion { + /// Cabecera de la página. + /// + /// Clave: `"header"`. Suele contener *branding*, navegación principal o avisos globales. + Header, + + /// Contenido principal de la página (**obligatoria**). + /// + /// Clave: `"content"`. Es el destino por defecto para insertar componentes a nivel de página. + Content, + + /// Pie de página. + /// + /// Clave: `"footer"`. Suele contener enlaces legales, créditos o navegación secundaria. + Footer, +} + +impl Region for ThemeRegion { + fn key(&self) -> &str { + match self { + ThemeRegion::Header => "header", + ThemeRegion::Content => REGION_CONTENT, + ThemeRegion::Footer => "footer", + } + } + + fn label(&self) -> L10n { + L10n::l(join!("region_", self.key())) + } +} + /// Métodos predefinidos de renderizado para las páginas de un tema. /// /// Contiene las implementaciones base para renderizar las **secciones** `<head>` y `<body>`. Se @@ -37,14 +77,14 @@ pub trait ThemePage { /// /// Si la región **no produce contenido**, devuelve un `Markup` vacío. #[inline] - fn render_region(&self, page: &mut Page, region: &Region) -> Markup { + fn render_region(&self, page: &mut Page, region: RegionRef) -> Markup { html! { - @let output = page.context().render_components_of(region.key()); + @let key = region.key(); + @let output = page.context().render_components_of(key); @if !output.is_empty() { - @let region_name = region.name(); div - id=(region_name) - class={ "region region--" (region_name) } + id=(key) + class={ "region region--" (key) } role="region" aria-label=[region.label().lookup(page)] { @@ -63,10 +103,10 @@ pub trait ThemePage { /// /// La etiqueta `<body>` no se incluye aquí; únicamente renderiza su contenido. #[inline] - fn render_body(&self, page: &mut Page, regions: &[Region]) -> Markup { + fn render_body(&self, page: &mut Page, regions: &[RegionRef]) -> Markup { html! { @for region in regions { - (self.render_region(page, region)) + (self.render_region(page, *region)) } } } @@ -145,44 +185,53 @@ pub trait Theme: Extension + ThemePage + Send + Sync { /// Declaración ordenada de las regiones disponibles en la página. /// - /// Devuelve una **lista estática** de regiones ([`Region`](crate::core::theme::Region)) con la - /// información necesaria para renderizar el contenedor de cada región. + /// Retorna una **lista estática** de referencias ([`RegionRef`](crate::core::theme::RegionRef)) + /// que representan las regiones que el tema admite dentro del `<body>`. /// - /// Si un tema necesita un conjunto distinto de regiones, se puede **sobrescribir** este método - /// con los siguientes requisitos y recomendaciones: + /// Cada referencia apunta a una instancia que implementa [`Region`](crate::core::theme::Region) + /// para definir cada región de forma segura y estable. Y si un tema necesita un conjunto + /// distinto de regiones, puede **sobrescribir** este método siguiendo estas recomendaciones: /// - /// - Los identificadores deben ser **estables** (p. ej. `"sidebar-left"`, `"content"`). - /// - La región `"content"` es **obligatoria** porque se usa por defecto para añadir componentes - /// para renderizar. Se puede utilizar [`Region::default()`] para declararla. - /// - La etiqueta `L10n` se evaluará con el idioma activo de la página. + /// - Los identificadores devueltos por [`Region::key()`](crate::core::theme::Region::key) + /// deben ser **estables** (p. ej. `"sidebar-left"`, `"content"`). + /// - La región `"content"` es **obligatoria**, ya que se usa como destino por defecto para + /// insertar componentes y renderizarlos. + /// - El orden de la lista podría tener relevancia como **orden de renderizado** dentro del + /// `<body>` segun la implementación de [`render_page_body()`](Self::render_page_body). + /// - Las etiquetas (`L10n`) de cada región se evaluarán con el idioma activo de la página. /// - /// Por defecto devuelve: + /// # Ejemplo /// - /// - `"header"`: cabecera. - /// - `"content"`: contenido principal (**obligatoria**). - /// - `"footer"`: pie. - fn page_regions(&self) -> &'static [Region] { - static REGIONS: LazyLock<[Region; 3]> = LazyLock::new(|| { + /// ```rust,ignore + /// fn page_regions(&self) -> &'static [RegionRef] { + /// static REGIONS: LazyLock<[RegionRef; 4]> = LazyLock::new(|| { + /// [ + /// &ThemeRegion::Header, + /// &ThemeRegion::Content, + /// &ThemeRegion::Footer, + /// ] + /// }); + /// &*REGIONS + /// } + /// ``` + fn page_regions(&self) -> &'static [RegionRef] { + static REGIONS: LazyLock<[RegionRef; 3]> = LazyLock::new(|| { [ - Region::declare("header", L10n::l("region_header")), - Region::default(), - Region::declare("footer", L10n::l("region_footer")), + &ThemeRegion::Header, + &ThemeRegion::Content, + &ThemeRegion::Footer, ] }); &*REGIONS } - /// Renderiza una región de la página **por clave**. + /// Renderiza una región de la página. /// - /// Busca en [`page_regions()`](Self::page_regions) la región asociada a una clave y, si existe, - /// delega en [`ThemePage::render_region()`] su renderizado. Si no se encuentra la clave o la - /// región no produce contenido, devuelve un `Markup` vacío. - fn render_page_region(&self, page: &mut Page, key: &str) -> Markup { - html! { - @if let Some(region) = self.page_regions().iter().find(|r| r.key() == key) { - (self.render_region(page, region)) - } - } + /// Si se sobrescribe este método, se puede volver al comportamiento base con: + /// `<Self as ThemePage>::render_region(self, page, region)`. + #[inline] + fn render_page_region(&self, page: &mut Page, region: RegionRef) -> Markup { + <Self as ThemePage>::render_region(self, page, region) } /// Acciones específicas del tema antes de renderizar el `<body>` de la página. diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 00ff60cb..ecb5eb50 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -19,68 +19,66 @@ static COMMON_REGIONS: LazyLock<RwLock<ChildrenInRegions>> = /// Nombre de la región de contenido por defecto (`"content"`). pub const REGION_CONTENT: &str = "content"; -/// Identificador de una región de página. +/// Define la interfaz mínima que describe una **región de renderizado** dentro de una página. /// -/// Incluye una **clave estática** ([`key()`](Self::key)) que identifica la región en el tema, y un -/// **nombre normalizado** ([`name()`](Self::name)) en minúsculas para su uso en atributos HTML -/// (p.ej., clases `region__{name}`). +/// Una *región* representa una zona del documento HTML (por ejemplo: `"header"`, `"content"` o +/// `"sidebar-left"`), en la que se pueden incluir y renderizar componentes dinámicamente. /// -/// Se utiliza para declarar las regiones que componen una página en un tema (ver -/// [`page_regions()`](crate::core::theme::Theme::page_regions)). -pub struct Region { - key: &'static str, - name: String, - label: L10n, -} - -impl Default for Region { - #[inline] - fn default() -> Self { - Self { - key: REGION_CONTENT, - name: REGION_CONTENT.to_string(), - label: L10n::l("region_content"), - } - } -} - -impl Region { - /// Declara una región a partir de su clave estática. +/// Este `trait` abstrae los metadatos básicos de cada región, esencialmente: +/// +/// - su **clave interna** (`key()`), que la identifica de forma única dentro de la página, y +/// - su **etiqueta localizada** (`label()`), que se usa como texto accesible (por ejemplo en +/// `aria-label` o en descripciones semánticas del contenedor). +/// +/// Las implementaciones típicas son *enumeraciones estáticas* declaradas por cada tema (ver como +/// ejemplo [`ThemeRegion`](crate::core::theme::ThemeRegion)), de modo que las claves y etiquetas +/// permanecen inmutables y fácilmente referenciables. +/// +/// # Ejemplo +/// +/// ```rust +/// use pagetop::prelude::*; +/// +/// pub enum MyThemeRegion { +/// Header, +/// Content, +/// Footer, +/// } +/// +/// impl Region for MyThemeRegion { +/// fn key(&self) -> &str { +/// match self { +/// MyThemeRegion::Header => "header", +/// MyThemeRegion::Content => "content", +/// MyThemeRegion::Footer => "footer", +/// } +/// } +/// +/// fn label(&self) -> L10n { +/// L10n::l(join!("region__", self.key())) +/// } +/// } +/// ``` +pub trait Region: Send + Sync { + /// Devuelve la **clave interna** que identifica de forma única una región. /// - /// Genera además un nombre normalizado de la clave, eliminando espacios iniciales y finales, - /// convirtiendo a minúsculas y sustituyendo los espacios intermedios por guiones (`-`). + /// La clave se utiliza para asociar los componentes de la región con su contenedor HTML + /// correspondiente. Por convención, se emplean nombres en minúsculas y con guiones (`"header"`, + /// `"main"`, `"sidebar-right"`, etc.), y la región `"content"` es **obligatoria** en todos los + /// temas. + fn key(&self) -> &str; + + /// Devuelve la **etiqueta localizada** (`L10n`) asociada a la región. /// - /// Esta clave se usará para añadir componentes a la región; por ello se recomiendan nombres - /// sencillos, limitando los caracteres a `[a-z0-9-]` (p.ej., `"sidebar"` o `"main-menu"`), cuyo - /// nombre normalizado coincidirá con la clave. - #[inline] - pub fn declare(key: &'static str, label: L10n) -> Self { - Self { - key, - name: key.trim().to_ascii_lowercase().replace(' ', "-"), - label, - } - } - - /// Devuelve la clave estática asignada a la región. - #[inline] - pub fn key(&self) -> &'static str { - self.key - } - - /// Devuelve el nombre normalizado de la región (para identificadores y atributos HTML). - #[inline] - pub fn name(&self) -> &str { - &self.name - } - - /// Devuelve la etiqueta localizada asociada a la región. - #[inline] - pub fn label(&self) -> &L10n { - &self.label - } + /// Esta etiqueta se evalúa en el idioma activo de la página y se utiliza principalmente para + /// accesibilidad, como el valor de `aria-label` en el contenedor generado por + /// [`ThemePage::render_region()`](crate::core::theme::ThemePage::render_region). + fn label(&self) -> L10n; } +/// Referencia estática a una región. +pub type RegionRef = &'static dyn Region; + // Contenedor interno de componentes agrupados por región. #[derive(AutoDefault)] pub struct ChildrenInRegions(HashMap<&'static str, Children>); From fe1a6d1baa0a8c5a1d01a5db405ff8cca043bf23 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 10 Oct 2025 10:55:51 +0200 Subject: [PATCH 810/853] =?UTF-8?q?=F0=9F=9A=A7=20Revisi=C3=B3n=20del=20es?= =?UTF-8?q?tado=20de=20los=20men=C3=BAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/menu/item.rs | 6 +++--- static/css/menu.css | 5 +++++ static/js/menu.js | 23 +++++++++++------------ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/base/component/menu/item.rs b/src/base/component/menu/item.rs index c9f79033..c6342186 100644 --- a/src/base/component/menu/item.rs +++ b/src/base/component/menu/item.rs @@ -137,14 +137,14 @@ impl Item { ..Default::default() } } - /* - pub fn megamenu(label: L10n, megamenu: Megamenu) -> Self { + + pub fn megamenu(label: L10n, megamenu: menu::Megamenu) -> Self { Item { item_kind: ItemKind::Megamenu(label, MegamenuGroups::with(megamenu)), ..Default::default() } } - */ + // **< Item BUILDER >*************************************************************************** #[builder_fn] diff --git a/static/css/menu.css b/static/css/menu.css index 6522f4a7..428ba157 100644 --- a/static/css/menu.css +++ b/static/css/menu.css @@ -342,6 +342,11 @@ opacity: 1; visibility: visible; } + .menu.menu--closing .menu__children { + margin-top: 0 !important; + opacity: 0 !important; + visibility: hidden !important; + } } @media (prefers-reduced-motion: reduce) { diff --git a/static/js/menu.js b/static/js/menu.js index 1f09bfe5..dca8e4df 100644 --- a/static/js/menu.js +++ b/static/js/menu.js @@ -1,12 +1,12 @@ +const getTitle = (li) => li.querySelector('.menu__label')?.textContent.trim() ?? ''; + function menu__showChildren(nav, children) { const li = children[0]; const submenu = li.querySelector('.menu__children'); submenu.classList.add('active'); submenu.style.animation = 'slideLeft 0.5s ease forwards'; - const labelEl = li.querySelector('.menu__label'); - const title = labelEl ? labelEl.textContent.trim() : (li.querySelector('a')?.textContent?.trim() ?? ''); - nav.querySelector('.menu__title').innerHTML = title; + nav.querySelector('.menu__title').textContent = getTitle(li);; nav.querySelector('.menu__header').classList.add('active'); } @@ -20,9 +20,7 @@ function menu__hideChildren(nav, children) { children.shift(); if (children.length > 0) { - const a = children[0].querySelector('a'); - const title = (a && a.textContent ? a.textContent.trim() : ''); - nav.querySelector('.menu__title').textContent = title; + nav.querySelector('.menu__title').textContent = getTitle(children[0]); } else { nav.querySelector('.menu__header').classList.remove('active'); nav.querySelector('.menu__title').textContent = ''; @@ -38,7 +36,7 @@ function menu__reset(menu, nav, overlay) { menu__toggle(nav, overlay); setTimeout(() => { nav.querySelector('.menu__header').classList.remove('active'); - nav.querySelector('.menu__title').innerHTML = ''; + nav.querySelector('.menu__title').textContent = ''; menu.querySelectorAll('.menu__children').forEach(submenu => { submenu.classList.remove('active'); submenu.style.removeProperty('animation'); @@ -85,12 +83,13 @@ document.querySelectorAll('.menu').forEach(menu => { menu__toggle(menuNav, menuOverlay); }); - window.onresize = function () { + let resizeTimeout; + window.addEventListener('resize', () => { if (menuNav.classList.contains('active')) { - var fontSizeRoot = parseFloat(getComputedStyle(document.documentElement).fontSize); - if (this.innerWidth >= 62 * fontSizeRoot) { + clearTimeout(resizeTimeout); + resizeTimeout = setTimeout(() => { menuChildren = menu__reset(menu, menuNav, menuOverlay); - } + }, 150); } - }; + }); }); From 8eafa436cdb1a0a221aecfa8a0cf3ca9b071d7f2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 11 Oct 2025 21:36:06 +0200 Subject: [PATCH 811/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20nuevo=20tema?= =?UTF-8?q?=20para=20pruebas=20llamado=20`Aliner`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 289 +++++++------- Cargo.toml | 12 +- extensions/pagetop-aliner/Cargo.toml | 21 ++ extensions/pagetop-aliner/README.md | 100 +++++ extensions/pagetop-aliner/build.rs | 7 + extensions/pagetop-aliner/src/lib.rs | 118 ++++++ .../pagetop-aliner/static/css/styles.css | 356 ++++++++++++++++++ 7 files changed, 761 insertions(+), 142 deletions(-) create mode 100644 extensions/pagetop-aliner/Cargo.toml create mode 100644 extensions/pagetop-aliner/README.md create mode 100644 extensions/pagetop-aliner/build.rs create mode 100644 extensions/pagetop-aliner/src/lib.rs create mode 100644 extensions/pagetop-aliner/static/css/styles.css diff --git a/Cargo.lock b/Cargo.lock index e0d497c8..cab741ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,9 +44,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.11.1" +version = "3.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cceded2fb55f3c4b67068fa64962e2ca59614edc5b03167de9ff82ae803da0" +checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" dependencies = [ "actix-codec", "actix-rt", @@ -227,9 +227,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -328,9 +328,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -390,9 +390,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -400,7 +400,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -484,9 +484,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.38" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ "find-msvc-tools", "jobserver", @@ -520,7 +520,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -589,9 +589,9 @@ checksum = "7439becb5fafc780b6f4de382b1a7a3e70234afe783854a4702ee8adbb838609" [[package]] name = "config" -version = "0.15.16" +version = "0.15.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef036f0ecf99baef11555578630e2cca559909b4c50822dbba828c252d21c49" +checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" dependencies = [ "pathdiff", "serde_core", @@ -703,9 +703,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", ] @@ -788,7 +788,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -805,15 +805,15 @@ checksum = "4742a071cd9694fc86f9fa1a08fa3e53d40cc899d7ee532295da2d085639fbc5" [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -851,7 +851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54f0d287c53ffd184d04d8677f590f4ac5379785529e5e08b1c8083acdd5c198" dependencies = [ "memchr", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -994,9 +994,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" @@ -1356,9 +1356,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -1387,9 +1387,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "linux-raw-sys" @@ -1422,11 +1422,10 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -1447,9 +1446,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -1474,6 +1473,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -1520,9 +1520,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -1560,6 +1560,7 @@ dependencies = [ "fluent-templates", "indoc", "itoa", + "pagetop-aliner", "pagetop-build", "pagetop-macros", "pagetop-statics", @@ -1576,6 +1577,14 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "pagetop-aliner" +version = "0.0.9" +dependencies = [ + "pagetop", + "pagetop-build", +] + [[package]] name = "pagetop-build" version = "0.3.1" @@ -1608,9 +1617,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1618,15 +1627,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1813,9 +1822,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -1887,18 +1896,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -1908,9 +1917,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -1960,7 +1969,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -2004,9 +2013,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -2014,18 +2023,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.225" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2047,9 +2056,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ "serde_core", ] @@ -2112,6 +2121,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "siphasher" version = "1.0.1" @@ -2161,9 +2176,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" @@ -2210,15 +2225,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.22.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -2242,11 +2257,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -2262,9 +2277,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -2355,9 +2370,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ "serde_core", "serde_spanned", @@ -2368,18 +2383,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] @@ -2495,9 +2510,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unic-langid" @@ -2659,9 +2674,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -2672,9 +2687,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -2686,9 +2701,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2696,9 +2711,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -2709,9 +2724,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -2722,27 +2737,27 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] name = "windows-core" -version = "0.62.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.0", + "windows-link", "windows-result", "windows-strings", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -2751,9 +2766,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -2762,32 +2777,26 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -2814,16 +2823,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -2844,19 +2853,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -2867,9 +2876,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -2879,9 +2888,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -2891,9 +2900,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -2903,9 +2912,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -2915,9 +2924,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -2927,9 +2936,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -2939,9 +2948,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -2951,9 +2960,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" diff --git a/Cargo.toml b/Cargo.toml index 913f3d7c..fe101436 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,7 +49,8 @@ default = [] testing = [] [dev-dependencies] -tempfile = "3.22" +tempfile = "3.23" +pagetop-aliner.workspace = true [build-dependencies] pagetop-build.workspace = true @@ -58,9 +59,12 @@ pagetop-build.workspace = true [workspace] resolver = "2" members = [ + # Helpers "helpers/pagetop-build", "helpers/pagetop-macros", "helpers/pagetop-statics", + # Extensions + "extensions/pagetop-aliner", ] [workspace.package] @@ -71,7 +75,11 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] actix-web = { version = "4.11", default-features = false } - +# Helpers pagetop-build = { version = "0.3", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.2", path = "helpers/pagetop-macros" } pagetop-statics = { version = "0.1", path = "helpers/pagetop-statics" } +# Extensions +pagetop-aliner = { version = "0.0", path = "extensions/pagetop-aliner" } +# PageTop +pagetop = { version = "0.4", path = "." } diff --git a/extensions/pagetop-aliner/Cargo.toml b/extensions/pagetop-aliner/Cargo.toml new file mode 100644 index 00000000..1c1101fb --- /dev/null +++ b/extensions/pagetop-aliner/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "pagetop-aliner" +version = "0.0.9" +edition = "2021" + +description = """ + Tema para PageTop que muestra esquemáticamente la composición de las páginas HTML +""" +categories = ["web-programming", "gui"] +keywords = ["pagetop", "theme", "css"] + +repository.workspace = true +homepage.workspace = true +license.workspace = true +authors.workspace = true + +[dependencies] +pagetop.workspace = true + +[build-dependencies] +pagetop-build.workspace = true diff --git a/extensions/pagetop-aliner/README.md b/extensions/pagetop-aliner/README.md new file mode 100644 index 00000000..88e3d782 --- /dev/null +++ b/extensions/pagetop-aliner/README.md @@ -0,0 +1,100 @@ +<div align="center"> + +<h1>PageTop Aliner</h1> + +<p>Tema para <strong>PageTop</strong> que muestra esquemáticamente la composición de las páginas HTML.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner) +[![Crates.io](https://img.shields.io/crates/v/pagetop-aliner.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-aliner) +[![Descargas](https://img.shields.io/crates/d/pagetop-aliner.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-aliner) + +<br> +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# ⚡️ Guía rápida + +Igual que con otras extensiones, **añade la dependencia** a tu `Cargo.toml`: + +```toml +[dependencies] +pagetop-aliner = "..." +``` + +**Declara la extensión** en tu aplicación (o extensión que la requiera). Recuerda que el orden en +`dependencies()` determina la prioridad relativa frente a las otras extensiones: + +```rust,no_run +use pagetop::prelude::*; + +struct MyApp; + +impl Extension for MyApp { + fn dependencies(&self) -> Vec<ExtensionRef> { + vec![ + // ... + &pagetop_aliner::Aliner, + // ... + ] + } +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&MyApp).run()?.await +} +``` + +Y **selecciona el tema en la configuración** de la aplicación: + +```toml +[app] +theme = "Aliner" +``` + +…o **fuerza el tema por código** en una página concreta: + +```rust,no_run +use pagetop::prelude::*; + +async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Page::new(request) + .with_theme("Aliner") + .add_component( + Block::new() + .with_title(L10n::l("sample_title")) + .add_component(Html::with(|cx| html! { + p { (L10n::l("sample_content").using(cx)) } + })), + ) + .render() +} +``` + + +# 🚧 Advertencia + +**PageTop** es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos +hasta que se libere la versión **1.0.0**. + + +# 📜 Licencia + +El código está disponible bajo una doble licencia: + + * **Licencia MIT** + ([LICENSE-MIT](LICENSE-MIT) o también https://opensource.org/licenses/MIT) + + * **Licencia Apache, Versión 2.0** + ([LICENSE-APACHE](LICENSE-APACHE) o también https://www.apache.org/licenses/LICENSE-2.0) + +Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el estándar de facto en +el ecosistema Rust. diff --git a/extensions/pagetop-aliner/build.rs b/extensions/pagetop-aliner/build.rs new file mode 100644 index 00000000..26713f52 --- /dev/null +++ b/extensions/pagetop-aliner/build.rs @@ -0,0 +1,7 @@ +use pagetop_build::StaticFilesBundle; + +fn main() -> std::io::Result<()> { + StaticFilesBundle::from_dir("./static", None) + .with_name("aliner") + .build() +} diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs new file mode 100644 index 00000000..8e9b03ab --- /dev/null +++ b/extensions/pagetop-aliner/src/lib.rs @@ -0,0 +1,118 @@ +/*! +<div align="center"> + +<h1>PageTop Aliner</h1> + +<p>Tema para <strong>PageTop</strong> que muestra esquemáticamente la composición de las páginas HTML.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner) +[![Crates.io](https://img.shields.io/crates/v/pagetop-aliner.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-aliner) +[![Descargas](https://img.shields.io/crates/d/pagetop-aliner.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-aliner) + +<br> +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# ⚡️ Guía rápida + +Igual que con otras extensiones, **añade la dependencia** a tu `Cargo.toml`: + +```toml +[dependencies] +pagetop-aliner = "..." +``` + +**Declara la extensión** en tu aplicación (o extensión que la requiera). Recuerda que el orden en +`dependencies()` determina la prioridad relativa frente a las otras extensiones: + +```rust,no_run +use pagetop::prelude::*; + +struct MyApp; + +impl Extension for MyApp { + fn dependencies(&self) -> Vec<ExtensionRef> { + vec![ + // ... + &pagetop_aliner::Aliner, + // ... + ] + } +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&MyApp).run()?.await +} +``` + +Y **selecciona el tema en la configuración** de la aplicación: + +```toml +[app] +theme = "Aliner" +``` + +…o **fuerza el tema por código** en una página concreta: + +```rust,no_run +use pagetop::prelude::*; + +async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Page::new(request) + .with_theme("Aliner") + .add_component( + Block::new() + .with_title(L10n::l("sample_title")) + .add_component(Html::with(|cx| html! { + p { (L10n::l("sample_content").using(cx)) } + })), + ) + .render() +} +``` +*/ + +use pagetop::prelude::*; + +/// El tema usa las mismas regiones predefinidas por [`ThemeRegion`]. +pub type AlinerRegion = ThemeRegion; + +/// Implementa el tema para usar en pruebas que muestran el esquema de páginas HTML. +/// +/// Tema mínimo ideal para **pruebas y demos** que renderiza el **esqueleto HTML** con las mismas +/// regiones básicas definidas por [`ThemeRegion`]. No pretende ser un tema para producción, está +/// pensado para: +/// +/// - Verificar integración de componentes y composiciones (*layouts*) sin estilos complejos. +/// - Realizar pruebas de renderizado rápido con salida estable y predecible. +/// - Preparar ejemplos y documentación, sin dependencias visuales (CSS/JS) innecesarias. +pub struct Aliner; + +impl Extension for Aliner { + fn theme(&self) -> Option<ThemeRef> { + Some(&Self) + } + + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + static_files_service!(scfg, [aliner] => "/aliner"); + } +} + +impl Theme for Aliner { + fn before_render_page_body(&self, page: &mut Page) { + page.alter_param("include_basic_css", true) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/aliner/css/styles.css") + .with_version(env!("CARGO_PKG_VERSION")) + .with_weight(-90), + )); + } +} diff --git a/extensions/pagetop-aliner/static/css/styles.css b/extensions/pagetop-aliner/static/css/styles.css new file mode 100644 index 00000000..1cc2f5dc --- /dev/null +++ b/extensions/pagetop-aliner/static/css/styles.css @@ -0,0 +1,356 @@ +html { + background-color: white; + padding: 1px 3px; +} +body { + padding: 1px 3px; +} +div { + padding: 1px 3px; + margin: 5px; +} +h1, h2, h3, h4,h5, h6, p { + background-color: snow; +} +* * { + outline: 5px solid rgba(255,0,0,.1); +} +* * * { + outline: 3px dashed rgba(255,0,0,.4); +} +* * * * { + outline: 2px dotted rgba(255,0,0,.6); +} +* * * * * { + outline: 1px dotted rgba(255,0,0,.9); +} +* * * * * * { + outline-color: gray; +} + +*::before, *::after { + background: #faa; + border-radius: 3px; + font: normal normal 400 10px/1.2 monospace; + vertical-align: middle; + padding: 1px 3px; + margin: 0 3px; +} +*::before { + content: "("; +} +*::after { + content: ")"; +} + +a::before { content: "<a>"; } +a::after { content: "</a>"; } +abbr::before { content: "<abbr>"; } +abbr::after { content: "</abbr>"; } +acronym::before { content: "<acronym>"; } +acronym::after { content: "</acronym>"; } +address::before { content: "<address>"; } +address::after { content: "</address>"; } +applet::before { content: "<applet>"; } +applet::after { content: "</applet>"; } +area::before { content: "<area>"; } +area::after { content: "</area>"; } +article::before { content: "<article>"; } +article::after { content: "</article>"; } +aside::before { content: "<aside>"; } +aside::after { content: "</aside>"; } +audio::before { content: "<audio>"; } +audio::after { content: "</audio>"; } + +b::before { content: "<b>"; } +b::after { content: "</b>"; } +base::before { content: "<base>"; } +base::after { content: "</base>"; } +basefont::before { content: "<basefont>"; } +basefont::after { content: "</basefont>"; } +bdi::before { content: "<bdi>"; } +bdi::after { content: "</bdi>"; } +bdo::before { content: "<bdo>"; } +bdo::after { content: "</bdo>"; } +bgsound::before { content: "<bgsound>"; } +bgsound::after { content: "</bgsound>"; } +big::before { content: "<big>"; } +big::after { content: "</big>"; } +blink::before { content: "<blink>"; } +blink::after { content: "</blink>"; } +blockquote::before { content: "<blockquote>"; } +blockquote::after { content: "</blockquote>"; } +body::before { content: "<body>"; } +body::after { content: "</body>"; } +br::before { content: "<br>"; } +br::after { content: "</br>"; } +button::before { content: "<button>"; } +button::after { content: "</button>"; } + +caption::before { content: "<caption>"; } +caption::after { content: "</caption>"; } +canvas::before { content: "<canvas>"; } +canvas::after { content: "</canvas>"; } +center::before { content: "<center>"; } +center::after { content: "</center>"; } +cite::before { content: "<cite>"; } +cite::after { content: "</cite>"; } +code::before { content: "<code>"; } +code::after { content: "</code>"; } +col::before { content: "<col>"; } +col::after { content: "</col>"; } +colgroup::before { content: "<colgroup>"; } +colgroup::after { content: "</colgroup>"; } +command::before { content: "<command>"; } +command::after { content: "</command>"; } +content::before { content: "<content>"; } +content::after { content: "</content>"; } + +data::before { content: "<data>"; } +data::after { content: "</data>"; } +datalist::before { content: "<datalist>"; } +datalist::after { content: "</datalist>"; } +dd::before { content: "<dd>"; } +dd::after { content: "</dd>"; } +del::before { content: "<del>"; } +del::after { content: "</del>"; } +details::before { content: "<details>"; } +details::after { content: "</details>"; } +dfn::before { content: "<dfn>"; } +dfn::after { content: "</dfn>"; } +dialog::before { content: "<dialog>"; } +dialog::after { content: "</dialog>"; } +dir::before { content: "<dir>"; } +dir::after { content: "</dir>"; } +div::before { content: "<div>"; } +div::after { content: "</div>"; } +dl::before { content: "<dl>"; } +dl::after { content: "</dl>"; } +dt::before { content: "<dt>"; } +dt::after { content: "</dt>"; } + +element::before { content: "<element>"; } +element::after { content: "</element>"; } +em::before { content: "<em>"; } +em::after { content: "</em>"; } +embed::before { content: "<embed>"; } +embed::after { content: "</embed>"; } + +fieldset::before { content: "<fieldset>"; } +fieldset::after { content: "</fieldset>"; } +figcaption::before { content: "<figcaption>"; } +figcaption::after { content: "</figcaption>"; } +figure::before { content: "<figure>"; } +figure::after { content: "</figure>"; } +font::before { content: "<font>"; } +font::after { content: "</font>"; } +footer::before { content: "<footer>"; } +footer::after { content: "</footer>"; } +form::before { content: "<form>"; } +form::after { content: "</form>"; } +frame::before { content: "<frame>"; } +frame::after { content: "</frame>"; } +frameset::before { content: "<frameset>"; } +frameset::after { content: "</frameset>"; } + +h1::before { content: "<h1>"; } +h1::after { content: "</h1>"; } +h2::before { content: "<h2>"; } +h2::after { content: "</h2>"; } +h3::before { content: "<h3>"; } +h3::after { content: "</h3>"; } +h4::before { content: "<h4>"; } +h4::after { content: "</h4>"; } +h5::before { content: "<h5>"; } +h5::after { content: "</h5>"; } +h6::before { content: "<h6>"; } +h6::after { content: "</h6>"; } +head::before { content: "<head>"; } +head::after { content: "</head>"; } +header::before { content: "<header>"; } +header::after { content: "</header>"; } +hgroup::before { content: "<hgroup>"; } +hgroup::after { content: "</hgroup>"; } +hr::before { content: "<hr>"; } +hr::after { content: "</hr>"; } +html::before { content: "<html>"; } +html::after { content: "</html>"; } + +i::before { content: "<i>"; } +i::after { content: "</i>"; } +iframe::before { content: "<iframe>"; } +iframe::after { content: "</iframe>"; } +image::before { content: "<image>"; } +image::after { content: "</image>"; } +img::before { content: "<img>"; } +img::after { content: "</img>"; } +input::before { content: "<input>"; } +input::after { content: "</input>"; } +ins::before { content: "<ins>"; } +ins::after { content: "</ins>"; } +isindex::before { content: "<isindex>"; } +isindex::after { content: "</isindex>"; } + +kbd::before { content: "<kbd>"; } +kbd::after { content: "</kbd>"; } +keygen::before { content: "<keygen>"; } +keygen::after { content: "</keygen>"; } + +label::before { content: "<label>"; } +label::after { content: "</label>"; } +legend::before { content: "<legend>"; } +legend::after { content: "</legend>"; } +li::before { content: "<li>"; } +li::after { content: "</li>"; } +link::before { content: "<link>"; } +link::after { content: "</link>"; } +listing::before { content: "<listing>"; } +listing::after { content: "</listing>"; } + +main::before { content: "<main>"; } +main::after { content: "</main>"; } +map::before { content: "<map>"; } +map::after { content: "</map>"; } +mark::before { content: "<mark>"; } +mark::after { content: "</mark>"; } +marquee::before { content: "<marquee>"; } +marquee::after { content: "</marquee>"; } +menu::before { content: "<menu>"; } +menu::after { content: "</menu>"; } +menuitem::before { content: "<menuitem>"; } +menuitem::after { content: "</menuitem>"; } +meta::before { content: "<meta>"; } +meta::after { content: "</meta>"; } +meter::before { content: "<meter>"; } +meter::after { content: "</meter>"; } +multicol::before { content: "<multicol>"; } +multicol::after { content: "</multicol>"; } + +nav::before { content: "<nav>"; } +nav::after { content: "</nav>"; } +nextid::before { content: "<nextid>"; } +nextid::after { content: "</nextid>"; } +nobr::before { content: "<nobr>"; } +nobr::after { content: "</nobr>"; } +noembed::before { content: "<noembed>"; } +noembed::after { content: "</noembed>"; } +noframes::before { content: "<noframes>"; } +noframes::after { content: "</noframes>"; } +noscript::before { content: "<noscript>"; } +noscript::after { content: "</noscript>"; } + +object::before { content: "<object>"; } +object::after { content: "</object>"; } +ol::before { content: "<ol>"; } +ol::after { content: "</ol>"; } +optgroup::before { content: "<optgroup>"; } +optgroup::after { content: "</optgroup>"; } +option::before { content: "<option>"; } +option::after { content: "</option>"; } +output::before { content: "<output>"; } +output::after { content: "</output>"; } + +p::before { content: "<p>"; } +p::after { content: "</p>"; } +param::before { content: "<param>"; } +param::after { content: "</param>"; } +picture::before { content: "<picture>"; } +picture::after { content: "</picture>"; } +plaintext::before { content: "<plaintext>"; } +plaintext::after { content: "</plaintext>"; } +pre::before { content: "<pre>"; } +pre::after { content: "</pre>"; } +progress::before { content: "<progress>"; } +progress::after { content: "</progress>"; } + +q::before { content: "<q>"; } +q::after { content: "</q>"; } + +rb::before { content: "<rb>"; } +rb::after { content: "</rb>"; } +rp::before { content: "<rp>"; } +rp::after { content: "</rp>"; } +rt::before { content: "<rt>"; } +rt::after { content: "</rt>"; } +rtc::before { content: "<rtc>"; } +rtc::after { content: "</rtc>"; } +ruby::before { content: "<ruby>"; } +ruby::after { content: "</ruby>"; } + +s::before { content: "<s>"; } +s::after { content: "</s>"; } +samp::before { content: "<samp>"; } +samp::after { content: "</samp>"; } +script::before { content: "<script>"; } +script::after { content: "</script>"; } +section::before { content: "<section>"; } +section::after { content: "</section>"; } +select::before { content: "<select>"; } +select::after { content: "</select>"; } +shadow::before { content: "<shadow>"; } +shadow::after { content: "</shadow>"; } +slot::before { content: "<slot>"; } +slot::after { content: "</slot>"; } +small::before { content: "<small>"; } +small::after { content: "</small>"; } +source::before { content: "<source>"; } +source::after { content: "</source>"; } +spacer::before { content: "<spacer>"; } +spacer::after { content: "</spacer>"; } +span::before { content: "<span>"; } +span::after { content: "</span>"; } +strike::before { content: "<strike>"; } +strike::after { content: "</strike>"; } +strong::before { content: "<strong>"; } +strong::after { content: "</strong>"; } +style::before { content: "<style>"; } +style::after { content: "<\/style>"; } +sub::before { content: "<sub>"; } +sub::after { content: "</sub>"; } +summary::before { content: "<summary>"; } +summary::after { content: "</summary>"; } +sup::before { content: "<sup>"; } +sup::after { content: "</sup>"; } + +table::before { content: "<table>"; } +table::after { content: "</table>"; } +tbody::before { content: "<tbody>"; } +tbody::after { content: "</tbody>"; } +td::before { content: "<td>"; } +td::after { content: "</td>"; } +template::before { content: "<template>"; } +template::after { content: "</template>"; } +textarea::before { content: "<textarea>"; } +textarea::after { content: "</textarea>"; } +tfoot::before { content: "<tfoot>"; } +tfoot::after { content: "</tfoot>"; } +th::before { content: "<th>"; } +th::after { content: "</th>"; } +thead::before { content: "<thead>"; } +thead::after { content: "</thead>"; } +time::before { content: "<time>"; } +time::after { content: "</time>"; } +title::before { content: "<title>"; } +title::after { content: "</title>"; } +tr::before { content: "<tr>"; } +tr::after { content: "</tr>"; } +track::before { content: "<track>"; } +track::after { content: "</track>"; } +tt::before { content: "<tt>"; } +tt::after { content: "</tt>"; } + +u::before { content: "<u>"; } +u::after { content: "</u>"; } +ul::before { content: "<ul>"; } +ul::after { content: "</ul>"; } + +var::before { content: "<var>"; } +var::after { content: "</var>"; } +video::before { content: "<video>"; } +video::after { content: "</video>"; } + +wbr::before { content: "<wbr>"; } +wbr::after { content: "</wbr>"; } + +xmp::before { content: "<xmp>"; } +xmp::after { content: "</xmp>"; } From f25f62dd3c5194a2028b6c1af5d6cf3f77b9226d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 06:57:04 +0200 Subject: [PATCH 812/853] =?UTF-8?q?=F0=9F=93=9D=20Evita=20en=20los=20ejemp?= =?UTF-8?q?los=20`use=20pagetop::prelude::*;`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/html.rs | 6 ++---- src/base/component/poweredby.rs | 3 +-- src/core.rs | 3 +-- src/core/action.rs | 3 +-- src/core/component/context.rs | 24 ++++++++---------------- src/core/extension/definition.rs | 9 +++------ src/core/theme/definition.rs | 3 +-- src/core/theme/regions.rs | 6 ++---- src/html.rs | 3 +-- src/html/assets/favicon.rs | 3 +-- src/html/assets/javascript.rs | 3 +-- src/html/assets/stylesheet.rs | 3 +-- src/html/attr_classes.rs | 3 +-- src/html/attr_id.rs | 3 +-- src/html/attr_l10n.rs | 3 +-- src/html/attr_name.rs | 3 +-- src/html/attr_value.rs | 3 +-- src/locale.rs | 24 ++++++++---------------- src/response/json.rs | 6 ++---- src/service.rs | 3 +-- src/util.rs | 15 +++++---------- 21 files changed, 44 insertions(+), 88 deletions(-) diff --git a/src/base/component/html.rs b/src/base/component/html.rs index b8c4aaaa..a60d30f9 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -8,8 +8,7 @@ use crate::prelude::*; /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let component = Html::with(|_| { /// html! { /// div class="example" { @@ -22,8 +21,7 @@ use crate::prelude::*; /// Para renderizar contenido que dependa del contexto, se puede acceder a él dentro del *closure*: /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let component = Html::with(|cx| { /// let user = cx.param::<String>("username").cloned().unwrap_or("visitor".to_string()); /// html! { diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index 4b54af36..d77d65c6 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -47,8 +47,7 @@ impl PoweredBy { /// eliminará, pero en este caso es necesario especificar el tipo explícitamente: /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let p1 = PoweredBy::default().with_copyright(Some("2001 © Foo Inc.")); /// let p2 = PoweredBy::new().with_copyright(None::<String>); /// ``` diff --git a/src/core.rs b/src/core.rs index 79d92074..9ecbd2e9 100644 --- a/src/core.rs +++ b/src/core.rs @@ -122,8 +122,7 @@ impl TypeInfo { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let n = 3u32; /// assert_eq!(n.type_name(), "u32"); /// ``` diff --git a/src/core/action.rs b/src/core/action.rs index cbbe79c0..9f81cd52 100644 --- a/src/core/action.rs +++ b/src/core/action.rs @@ -22,8 +22,7 @@ pub use all::dispatch_actions; /// # Ejemplo /// /// ```rust,ignore -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// impl Extension for MyTheme { /// fn actions(&self) -> Vec<ActionBox> { /// actions_boxed![ diff --git a/src/core/component/context.rs b/src/core/component/context.rs index f58d3816..8c4e47e1 100644 --- a/src/core/component/context.rs +++ b/src/core/component/context.rs @@ -66,8 +66,7 @@ pub enum ContextError { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// fn prepare_context<C: Contextual>(cx: C) -> C { /// cx.with_langid(&LangMatch::resolve("es-ES")) /// .with_theme("aliner") @@ -168,8 +167,7 @@ pub trait Contextual: LangId { /// Crea un nuevo contexto asociado a una solicitud HTTP: /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// fn new_context(request: HttpRequest) -> Context { /// Context::new(Some(request)) /// // Establece el idioma del documento a español. @@ -190,8 +188,7 @@ pub trait Contextual: LangId { /// Y hace operaciones con un contexto dado: /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// fn use_context(cx: &mut Context) { /// // Recupera el tema seleccionado. /// let active_theme = cx.theme(); @@ -310,8 +307,7 @@ impl Context { /// # Ejemplos /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let cx = Context::new(None) /// .with_param("usuario_id", 42_i32) /// .with_param("titulo", "Hola".to_string()); @@ -343,8 +339,7 @@ impl Context { /// # Ejemplos /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let mut cx = Context::new(None) /// .with_param("contador", 7_i32) /// .with_param("titulo", "Hola".to_string()); @@ -374,8 +369,7 @@ impl Context { /// # Ejemplos /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let mut cx = Context::new(None).with_param("temp", 1u8); /// assert!(cx.remove_param("temp")); /// assert!(!cx.remove_param("temp")); // ya no existe @@ -441,8 +435,7 @@ impl Contextual for Context { /// # Ejemplos /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let cx = Context::new(None) /// .with_param("usuario_id", 42_i32) /// .with_param("titulo", "Hola".to_string()) @@ -517,8 +510,7 @@ impl Contextual for Context { /// # Ejemplo /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let cx = Context::new(None).with_param("username", "Alice".to_string()); /// /// // Devuelve Some(&String) si existe y coincide el tipo. diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 90bdbad2..5699130d 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -16,8 +16,7 @@ pub type ExtensionRef = &'static dyn Extension; /// extensión y sobreescribir los métodos que sea necesario. /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// pub struct Blog; /// /// impl Extension for Blog { @@ -45,8 +44,7 @@ pub trait Extension: AnyInfo + Send + Sync { /// la extensión no es un tema, este método devuelve `None` por defecto. /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// pub struct MyTheme; /// /// impl Extension for MyTheme { @@ -88,8 +86,7 @@ pub trait Extension: AnyInfo + Send + Sync { /// estáticos, etc., usando [`ServiceConfig`](crate::service::web::ServiceConfig). /// /// ```rust,ignore - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// pub struct ExtensionSample; /// /// impl Extension for ExtensionSample { diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 7ef95c46..4e7db776 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -155,8 +155,7 @@ pub trait ThemePage { /// **obligatorio** de `Extension` para un tema es [`theme()`](Extension::theme). /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// pub struct MyTheme; /// /// impl Extension for MyTheme { diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index ecb5eb50..8e386f55 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -37,8 +37,7 @@ pub const REGION_CONTENT: &str = "content"; /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// pub enum MyThemeRegion { /// Header, /// Content, @@ -134,8 +133,7 @@ impl InRegion { /// # Ejemplo /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// // Banner global, en la región por defecto de cualquier página. /// InRegion::Content.add(Child::with(Html::with(|_| /// html! { ("🎉 ¡Bienvenido!") } diff --git a/src/html.rs b/src/html.rs index a86c9f76..abc8e8cf 100644 --- a/src/html.rs +++ b/src/html.rs @@ -93,8 +93,7 @@ pub type OptionComponent<C: core::component::Component> = core::component::Typed /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Texto normal, se escapa automáticamente para evitar inyección de HTML. /// let fragment = PrepareMarkup::Escaped("Hola <b>mundo</b>".to_string()); /// assert_eq!(fragment.render().into_string(), "Hola &lt;b&gt;mundo&lt;/b&gt;"); diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index c2280aab..dce3e1bd 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -18,8 +18,7 @@ use crate::AutoDefault; /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let favicon = Favicon::new() /// // Estándar de facto admitido por todos los navegadores. /// .with_icon("/icons/favicon.ico") diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index dde5f945..6dc9b852 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -46,8 +46,7 @@ enum Source { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Script externo con carga diferida, versión de caché y prioridad en el renderizado. /// let script = JavaScript::defer("/assets/js/app.js") /// .with_version("1.2.3") diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 49cb9911..8d1bf29f 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -62,8 +62,7 @@ impl TargetMedia { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Crea una hoja de estilos externa con control de versión y medio específico (`screen`). /// let stylesheet = StyleSheet::from("/assets/css/main.css") /// .with_version("2.0.1") diff --git a/src/html/attr_classes.rs b/src/html/attr_classes.rs index 80fdad79..bb88f587 100644 --- a/src/html/attr_classes.rs +++ b/src/html/attr_classes.rs @@ -31,8 +31,7 @@ pub enum ClassesOp { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let classes = AttrClasses::new("Btn btn-primary") /// .with_value(ClassesOp::Add, "Active") /// .with_value(ClassesOp::Remove, "btn-primary"); diff --git a/src/html/attr_id.rs b/src/html/attr_id.rs index 3d5f3eb4..a1d8a1da 100644 --- a/src/html/attr_id.rs +++ b/src/html/attr_id.rs @@ -12,8 +12,7 @@ use crate::{builder_fn, AutoDefault}; /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let id = AttrId::new(" main Section "); /// assert_eq!(id.as_str(), Some("main_section")); /// diff --git a/src/html/attr_l10n.rs b/src/html/attr_l10n.rs index 37fc80fa..86d1c4a3 100644 --- a/src/html/attr_l10n.rs +++ b/src/html/attr_l10n.rs @@ -9,8 +9,7 @@ use crate::{builder_fn, AutoDefault}; /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Traducción por clave en las locales por defecto de PageTop. /// let hello = AttrL10n::new(L10n::l("test-hello-world")); /// diff --git a/src/html/attr_name.rs b/src/html/attr_name.rs index 9bc9659e..1741695c 100644 --- a/src/html/attr_name.rs +++ b/src/html/attr_name.rs @@ -12,8 +12,7 @@ use crate::{builder_fn, AutoDefault}; /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let name = AttrName::new(" DISplay name "); /// assert_eq!(name.as_str(), Some("display_name")); /// diff --git a/src/html/attr_value.rs b/src/html/attr_value.rs index eff80660..b20dec3d 100644 --- a/src/html/attr_value.rs +++ b/src/html/attr_value.rs @@ -10,8 +10,7 @@ use crate::{builder_fn, AutoDefault}; /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let s = AttrValue::new(" a new string "); /// assert_eq!(s.as_str(), Some("a new string")); /// diff --git a/src/locale.rs b/src/locale.rs index 2bf0da90..7c913ec9 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -76,8 +76,7 @@ //! que declarar: //! //! ```rust -//! use pagetop::prelude::*; -//! +//! # use pagetop::prelude::*; //! include_locales!(LOCALES_SAMPLE); //! ``` //! @@ -149,8 +148,7 @@ pub trait LangId { /// # Ejemplos /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Coincidencia exacta. /// let lang = LangMatch::resolve("es-ES"); /// assert_eq!(lang.langid().to_string(), "es-ES"); @@ -173,8 +171,7 @@ pub trait LangId { /// respaldo ("en-US"): /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Idioma por defecto o de respaldo si no resuelve. /// let lang = LangMatch::resolve("it-IT"); /// let langid = lang.langid(); @@ -236,8 +233,7 @@ impl LangMatch { /// # Ejemplo /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let lang = LangMatch::resolve("es-ES").as_option(); /// assert_eq!(lang.unwrap().to_string(), "es-ES"); /// @@ -327,8 +323,7 @@ enum L10nOp { /// Los argumentos dinámicos se añaden con `with_arg()` o `with_args()`. /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Texto literal sin traducción. /// let raw = L10n::n("© 2025 PageTop").get(); /// @@ -407,8 +402,7 @@ impl L10n { /// # Ejemplo /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let text = L10n::l("greeting").with_arg("name", "Manuel").get(); /// ``` pub fn get(&self) -> Option<String> { @@ -422,8 +416,7 @@ impl L10n { /// # Ejemplo /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// struct ResourceLang; /// /// impl LangId for ResourceLang { @@ -464,8 +457,7 @@ impl L10n { /// # Ejemplo /// /// ```rust - /// use pagetop::prelude::*; - /// + /// # use pagetop::prelude::*; /// let html = L10n::l("welcome.message").using(&LangMatch::resolve("es")); /// ``` pub fn using(&self, language: &impl LangId) -> Markup { diff --git a/src/response/json.rs b/src/response/json.rs index fee4c121..0878999f 100644 --- a/src/response/json.rs +++ b/src/response/json.rs @@ -6,8 +6,7 @@ //! tipo Rust fuertemente tipado, validando el formato y deserializando con *serde*. //! //! ```rust -//! use pagetop::prelude::*; -//! +//! # use pagetop::prelude::*; //! #[derive(serde::Deserialize)] //! struct NuevoUsuario { nombre: String, email: String } //! @@ -25,8 +24,7 @@ //! `application/json; charset=utf-8`, todo con una llamada compacta. //! //! ```rust -//! use pagetop::prelude::*; -//! +//! # use pagetop::prelude::*; //! #[derive(serde::Serialize)] //! struct Usuario { id: u32, nombre: String } //! diff --git a/src/service.rs b/src/service.rs index 09dc6183..9a936fc3 100644 --- a/src/service.rs +++ b/src/service.rs @@ -102,8 +102,7 @@ macro_rules! include_files_service { /// # Ejemplos /// /// ```rust,ignore -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// pub struct MyExtension; /// /// impl Extension for MyExtension { diff --git a/src/util.rs b/src/util.rs index a4daf677..f73cf78a 100644 --- a/src/util.rs +++ b/src/util.rs @@ -50,8 +50,7 @@ macro_rules! hm { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Concatena todos los fragmentos directamente. /// let result = join!("Hello", " ", "World"); /// assert_eq!(result, "Hello World".to_string()); @@ -81,8 +80,7 @@ macro_rules! join { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Concatena los fragmentos no vacíos con un espacio como separador. /// let result_with_separator = join_opt!(["Hello", "", "World"]; " "); /// assert_eq!(result_with_separator, Some("Hello World".to_string())); @@ -121,8 +119,7 @@ macro_rules! join_opt { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// let first = "Hello"; /// let separator = "-"; /// let second = "World"; @@ -164,8 +161,7 @@ macro_rules! join_pair { /// # Ejemplo /// /// ```rust -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Concatena los fragmentos. /// let result = join_strict!(["Hello", "World"]); /// assert_eq!(result, Some("HelloWorld".to_string())); @@ -211,8 +207,7 @@ macro_rules! join_strict { /// # Ejemplos /// /// ```rust,no_run -/// use pagetop::prelude::*; -/// +/// # use pagetop::prelude::*; /// // Ruta relativa, se resuelve respecto a CARGO_MANIFEST_DIR o al directorio actual (`cwd`). /// println!("{:#?}", util::resolve_absolute_dir("documents")); /// From e38d7a3c4fae6d9006a63f076cf5c2bbd0311f09 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 08:43:17 +0200 Subject: [PATCH 813/853] =?UTF-8?q?=F0=9F=94=A8=20A=C3=B1ade=20soporte=20p?= =?UTF-8?q?ara=20el=20tema=20`pagetop-aliner`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ tools/changelog.sh | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/README.md b/README.md index c6c12e0e..0e635189 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,11 @@ El código se organiza en un *workspace* donde actualmente se incluyen los sigui * **[pagetop-macros](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-macros)**, proporciona una colección de macros que mejoran la experiencia de desarrollo con PageTop. +## Extensiones + + * **[pagetop-aliner](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-aliner)**, + es un tema para demos y pruebas que muestra esquemáticamente la composición de las páginas HTML. + # 🧪 Pruebas diff --git a/tools/changelog.sh b/tools/changelog.sh index 722cdb7f..253f22bc 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -55,6 +55,10 @@ case "$CRATE" in --exclude-path "helpers/pagetop-macros/**/*" ) ;; + pagetop-aliner) + CHANGELOG_FILE="extensions/pagetop-aliner/CHANGELOG.md" + PATH_FLAGS=(--include-path "extensions/pagetop-aliner/**/*") + ;; *) echo "Error: unsupported crate '$CRATE'" >&2 exit 1 From ec60c4ce6f50b84a231dbfa3d240dc2107118a5a Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 09:15:50 +0200 Subject: [PATCH 814/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactoriza=20p?= =?UTF-8?q?=C3=A1gina=20de=20bienvenida=20y=20tema=20`Basic`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Actualiza `Welcome` para usar el nuevo componente `Intro`. - Simplifica el tema `Basic` apoyándose en la lógica de `Theme`. - Predefine los *assets* básicos como recursos de `Theme`. - Refactoriza archivos de localicación para reflejar los cambios de los componentes. --- extensions/pagetop-aliner/src/lib.rs | 2 +- src/base/component.rs | 3 + src/base/component/intro.rs | 343 +++++++++++++++++++++++++++ src/base/extension/welcome.rs | 43 ++-- src/base/theme/basic.rs | 205 +--------------- src/core/theme/definition.rs | 26 +- src/locale/en-US/base.ftl | 6 +- src/locale/en-US/welcome.ftl | 8 +- src/locale/es-ES/base.ftl | 6 +- src/locale/es-ES/welcome.ftl | 8 +- static/css/intro.css | 82 ++++--- static/css/root.css | 19 -- 12 files changed, 455 insertions(+), 296 deletions(-) create mode 100644 src/base/component/intro.rs diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index 8e9b03ab..084678d7 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -108,7 +108,7 @@ impl Extension for Aliner { impl Theme for Aliner { fn before_render_page_body(&self, page: &mut Page) { - page.alter_param("include_basic_css", true) + page.alter_param("include_basic_assets", true) .alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/aliner/css/styles.css") .with_version(env!("CARGO_PKG_VERSION")) diff --git a/src/base/component.rs b/src/base/component.rs index 4edfc9a9..6c3b028f 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -54,6 +54,9 @@ pub use html::Html; mod block; pub use block::Block; +mod intro; +pub use intro::{Intro, IntroOpening}; + mod poweredby; pub use poweredby::PoweredBy; diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs new file mode 100644 index 00000000..5d3440e9 --- /dev/null +++ b/src/base/component/intro.rs @@ -0,0 +1,343 @@ +use crate::prelude::*; + +/// Tipo de apertura que se mostrará en la introducción del componente [`Intro`]. +/// +/// Permite elegir entre una apertura con textos predefinidos sobre PageTop (como hace la página de +/// bienvenida [`Welcome`](crate::base::extension::Welcome)) o una introducción completamente +/// personalizada. +#[derive(AutoDefault, Copy, Clone, Debug, Eq, PartialEq)] +pub enum IntroOpening { + /// Modo por defecto. Muestra una introducción estándar de PageTop e incluye automáticamente + /// *badges* con información de la última versión liberada, fecha del último lanzamiento y + /// licencia de uso. + #[default] + PageTop, + /// Modo totalmente personalizado. No añade *badges* ni textos predefinidos. Usa la imagen de + /// PageTop pero el contenido lo define el propio desarrollador. + Custom, +} + +/// Componente para presentar PageTop (como [`Welcome`](crate::base::extension::Welcome)), o mostrar +/// introducciones. +/// +/// Usa la imagen de PageTop para presentar contenidos con: +/// +/// - Una **imagen decorativa** (el *monster* de PageTop) antecediendo al contenido. +/// - Una vista destacada con **título + eslogan**. +/// - Un **botón opcional** de llamada a la acción con texto y enlace configurables. +/// - El **área de textos** con *badges* predefinidos (en modo [`IntroOpening::PageTop`]) y bloques +/// ([`Block`](crate::base::component::Block)) para crear párrafos vistosos de texto. Aunque +/// admite todo tipo de componentes. +/// +/// ### Ejemplos +/// +/// **Intro mínima por defecto** +/// +/// ```rust +/// # use pagetop::prelude::*; +/// let intro = Intro::default(); +/// ``` +/// +/// **Título, eslogan y botón personalizados** +/// +/// ```rust +/// # use pagetop::prelude::*; +/// let intro = Intro::default() +/// .with_title(L10n::l("intro_custom_title")) +/// .with_slogan(L10n::l("intro_custom_slogan")) +/// .with_button(Some(( +/// L10n::l("intro_learn_more"), +/// |_| "/learn-more" +/// ))); +/// ``` +/// +/// **Sin botón + modo *Custom* (sin *badges* predefinidos)** +/// +/// ```rust +/// # use pagetop::prelude::*; +/// let intro = Intro::default() +/// .with_button(None::<(L10n, FnPathByContext)>) +/// .with_opening(IntroOpening::Custom); +/// ``` +/// +/// **Añadir contenidos hijo** +/// +/// ```rust +/// # use pagetop::prelude::*; +/// let intro = Intro::default() +/// .add_component( +/// Block::new() +/// .with_title(L10n::l("intro_custom_block_title")) +/// .add_component(Html::with(move |cx| { +/// html! { +/// p { (L10n::l("intro_custom_paragraph_1").using(cx)) } +/// p { (L10n::l("intro_custom_paragraph_2").using(cx)) } +/// } +/// })), +/// ); +/// ``` +#[rustfmt::skip] +pub struct Intro { + title : L10n, + slogan : L10n, + button : Option<(L10n, FnPathByContext)>, + opening : IntroOpening, + children: Children, +} + +impl Default for Intro { + #[rustfmt::skip] + fn default() -> Self { + Intro { + title : L10n::l("intro_default_title"), + slogan : L10n::l("intro_default_slogan").with_arg("app", &global::SETTINGS.app.name), + button : Some((L10n::l("intro_default_button"), |_| "https://pagetop.cillero.es")), + opening : IntroOpening::default(), + children: Children::default(), + } + } +} + +impl Component for Intro { + fn new() -> Self { + Intro::default() + } + + fn setup_before_prepare(&mut self, cx: &mut Context) { + cx.alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/intro.css").with_version(env!("CARGO_PKG_VERSION")), + )); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + if self.opening() == IntroOpening::PageTop { + cx.alter_assets(ContextOp::AddJavaScript(JavaScript::on_load_async("intro-js", |cx| + util::indoc!(r#" + try { + const resp = await fetch("https://crates.io/api/v1/crates/pagetop"); + const data = await resp.json(); + const date = new Date(data.versions[0].created_at); + const formatted = date.toLocaleDateString("LANGID", { year: "numeric", month: "2-digit", day: "2-digit" }); + document.getElementById("intro-release").src = `https://img.shields.io/badge/Release%20date-${encodeURIComponent(formatted)}-blue?label=LABEL&style=for-the-badge`; + document.getElementById("intro-badges").style.display = "block"; + } catch (e) { + console.error("Failed to fetch release date from crates.io:", e); + } + "#) + .replace("LANGID", cx.langid().to_string().as_str()) + .replace("LABEL", L10n::l("intro_release_label").using(cx).as_str()) + ))); + } + + PrepareMarkup::With(html! { + div class="intro" { + div class="intro-header" { + section class="intro-header__body" { + h1 class="intro-header__title" { + span { (self.title().using(cx)) } + (self.slogan().using(cx)) + } + } + aside class="intro-header__image" aria-hidden="true" { + div class="intro-header__monster" { + picture { + source + type="image/avif" + src="/img/monster-pagetop_250.avif" + srcset="/img/monster-pagetop_500.avif 1.5x"; + source + type="image/webp" + src="/img/monster-pagetop_250.webp" + srcset="/img/monster-pagetop_500.webp 1.5x"; + img + src="/img/monster-pagetop_250.png" + srcset="/img/monster-pagetop_500.png 1.5x" + alt="Monster PageTop"; + } + } + } + } + div class="intro-content" { + section class="intro-content__body" { + div class="intro-text" { + @if let Some((txt, lnk)) = self.button() { + div class="intro-button" { + a + class="intro-button__link" + href=((lnk)(cx)) + target="_blank" + rel="noreferrer" + { + span {} span {} span {} + div class="intro-button__text" { + (txt.using(cx)) + } + } + } + } + div class="intro-text__children" { + @if self.opening() == IntroOpening::PageTop { + p { (L10n::l("intro_text1").using(cx)) } + div id="intro-badges" { + img + src="https://img.shields.io/crates/v/pagetop.svg?label=PageTop&style=for-the-badge" + alt=[L10n::l("intro_pagetop_label").lookup(cx)] {} (" ") + img + id="intro-release" + alt=[L10n::l("intro_release_label").lookup(cx)] {} (" ") + img + src=(format!( + "https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label={}&style=for-the-badge", + L10n::l("intro_license_label").lookup(cx).unwrap_or_default() + )) + alt=[L10n::l("intro_license_label").lookup(cx)] {} + } + p { (L10n::l("intro_text2").using(cx)) } + } + (self.children().render(cx)) + } + } + } + } + div class="intro-footer" { + section class="intro-footer__body" { + div class="intro-footer__logo" { + svg + viewBox="0 0 1614 1614" + xmlns="http://www.w3.org/2000/svg" + role="img" + aria-label=[L10n::l("pagetop_logo").lookup(cx)] + preserveAspectRatio="xMidYMid slice" + focusable="false" + { + path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} + } + } + div class="intro-footer__links" { + a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } + a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("intro_code").using(cx)) } + em { (L10n::l("intro_have_fun").using(cx)) } + } + } + } + } + }) + } +} + +impl Intro { + // **< Intro BUILDER >************************************************************************** + + /// Establece el título de entrada. + /// + /// # Ejemplo + /// + /// ```rust + /// # use pagetop::prelude::*; + /// let intro = Intro::default().with_title(L10n::n("Título de entrada")); + /// ``` + #[builder_fn] + pub fn with_title(mut self, title: L10n) -> Self { + self.title = title; + self + } + + /// Establece el eslogan de entrada (línea secundaria del título). + /// + /// # Ejemplo + /// + /// ```rust + /// # use pagetop::prelude::*; + /// let intro = Intro::default().with_slogan(L10n::n("Un eslogan para la entrada")); + /// ``` + #[builder_fn] + pub fn with_slogan(mut self, slogan: L10n) -> Self { + self.slogan = slogan; + self + } + + /// Configura el botón opcional de llamada a la acción. + /// + /// - Usa `Some((texto, closure_url))` para mostrarlo, donde [`FnPathByContext`] recibe el + /// [`Context`] y devuelve la ruta o URL final al pulsar el botón. + /// - Usa `None` para ocultarlo. + /// + /// # Ejemplo + /// + /// ```rust + /// # use pagetop::prelude::*; + /// // Define un botón con texto y una URL fija. + /// let intro = Intro::default().with_button(Some((L10n::n("Pulsa este botón"), |_| "/start"))); + /// // Descarta el botón de la intro. + /// let intro_no_button = Intro::default().with_button(None); + /// ``` + #[builder_fn] + pub fn with_button(mut self, button: Option<(L10n, FnPathByContext)>) -> Self { + self.button = button; + self + } + + /// Selecciona el tipo de apertura: [`IntroOpening::PageTop`] (por defecto) o + /// [`IntroOpening::Custom`]. + /// + /// - `PageTop`: añade *badges* automáticos y una presentación de lo que es PageTop. + /// - `Custom`: introducción en blanco para añadir cualquier contenido. + /// + /// # Ejemplo + /// + /// ```rust + /// # use pagetop::prelude::*; + /// let intro = Intro::default().with_opening(IntroOpening::Custom); + /// ``` + #[builder_fn] + pub fn with_opening(mut self, opening: IntroOpening) -> Self { + self.opening = opening; + self + } + + /// Añade un nuevo componente hijo a la intro. + /// + /// Si es un bloque ([`Block`]) aplica estilos específicos para destacarlo. + pub fn add_component(mut self, component: impl Component) -> Self { + self.children + .alter_child(ChildOp::Add(Child::with(component))); + self + } + + /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. + #[builder_fn] + pub fn with_child(mut self, op: ChildOp) -> Self { + self.children.alter_child(op); + self + } + + // **< Intro GETTERS >************************************************************************** + + /// Devuelve el título de entrada. + pub fn title(&self) -> &L10n { + &self.title + } + + /// Devuelve el eslogan de la entrada. + pub fn slogan(&self) -> &L10n { + &self.slogan + } + + /// Devuelve el botón de llamada a la acción, si existe. + pub fn button(&self) -> Option<(&L10n, &FnPathByContext)> { + self.button.as_ref().map(|(txt, lnk)| (txt, lnk)) + } + + /// Devuelve el modo de apertura configurado. + pub fn opening(&self) -> IntroOpening { + self.opening + } + + /// Devuelve la lista de hijos (`children`) de la intro. + pub fn children(&self) -> &Children { + &self.children + } +} diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index 5c6fec5a..865807a1 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -26,30 +26,29 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_theme("Basic") - .with_layout("PageTopIntro") .with_title(L10n::l("welcome_title")) - .with_description(L10n::l("welcome_intro").with_arg("app", app)) - .with_param("intro_button_txt", L10n::l("welcome_powered")) - .with_param("intro_button_lnk", "https://pagetop.cillero.es".to_string()) .add_component( - Block::new() - .with_title(L10n::l("welcome_status_title")) - .add_component(Html::with(move |cx| { - html! { - p { (L10n::l("welcome_status_1").using(cx)) } - p { (L10n::l("welcome_status_2").using(cx)) } - } - })), - ) - .add_component( - Block::new() - .with_title(L10n::l("welcome_support_title")) - .add_component(Html::with(move |cx| { - html! { - p { (L10n::l("welcome_support_1").using(cx)) } - p { (L10n::l("welcome_support_2").with_arg("app", app).using(cx)) } - } - })), + Intro::new() + .add_component( + Block::new() + .with_title(L10n::l("welcome_status_title")) + .add_component(Html::with(move |cx| { + html! { + p { (L10n::l("welcome_status_1").using(cx)) } + p { (L10n::l("welcome_status_2").using(cx)) } + } + })), + ) + .add_component( + Block::new() + .with_title(L10n::l("welcome_support_title")) + .add_component(Html::with(move |cx| { + html! { + p { (L10n::l("welcome_support_1").using(cx)) } + p { (L10n::l("welcome_support_2").with_arg("app", app).using(cx)) } + } + })), + ), ) .render() } diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index b6a982f6..a6711859 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -4,33 +4,7 @@ use crate::prelude::*; /// El tema básico usa las mismas regiones predefinidas por [`ThemeRegion`]. pub type BasicRegion = ThemeRegion; -/// Tema básico por defecto. -/// -/// Ofrece las siguientes composiciones (*layouts*): -/// -/// - **Composición predeterminada** -/// - Renderizado genérico con -/// [`ThemePage::render_body()`](crate::core::theme::ThemePage::render_body) usando las regiones -/// predefinidas en [`page_regions()`](crate::core::theme::Theme::page_regions). -/// -/// - **`Intro`** -/// - Página de entrada con cabecera visual, título y descripción y un botón opcional de llamada a -/// la acción. Ideal para una página de inicio o bienvenida en el contexto de PageTop. -/// - **Regiones:** `content` (se renderiza dentro de `.intro-content__body`). -/// - **Parámetros:** -/// - `intro_button_txt` (`L10n`) – Texto del botón. -/// - `intro_button_lnk` (`Option<String>`) – URL del botón; si no se indica, el botón no se -/// muestra. -/// -/// - **`PageTopIntro`** -/// - Variante de `Intro` con textos predefinidos sobre PageTop al inicio del contenido. Añade una -/// banda de *badges* con la versión de [PageTop en crates.io](https://crates.io/crates/pagetop) -/// más la fecha de la última versión publicada y la licencia de uso. -/// - **Regiones:** `content` (igual que `Intro`). -/// - **Parámetros:** los mismos que `Intro`. -/// -/// **Nota:** si no se especifica `layout` o el valor no coincide con ninguno de los anteriores, se -/// aplica la composición predeterminada. +/// Tema básico por defecto que extiende el funcionamiento predeterminado de [`Theme`]. pub struct Basic; impl Extension for Basic { @@ -40,180 +14,7 @@ impl Extension for Basic { } impl Theme for Basic { - fn render_page_body(&self, page: &mut Page) -> Markup { - match page.layout() { - "Intro" => render_intro(page), - "PageTopIntro" => render_pagetop_intro(page), - _ => <Self as ThemePage>::render_body(self, page, self.page_regions()), - } - } - - fn after_render_page_body(&self, page: &mut Page) { - let pkg_version = env!("CARGO_PKG_VERSION"); - - page.alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/normalize.css") - .with_version("8.0.1") - .with_weight(-99), - )) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/root.css") - .with_version(pkg_version) - .with_weight(-99), - )) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/basic.css") - .with_version(pkg_version) - .with_weight(-99), - )) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/components.css") - .with_version(pkg_version) - .with_weight(-99), - )) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/menu.css") - .with_version(pkg_version) - .with_weight(-99), - )) - .alter_assets(ContextOp::AddJavaScript( - JavaScript::defer("/js/menu.js") - .with_version(pkg_version) - .with_weight(-99), - )); + fn before_render_page_body(&self, page: &mut Page) { + page.alter_param("include_basic_assets", true); } } - -fn render_intro(page: &mut Page) -> Markup { - page.alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/intro.css").with_version(env!("CARGO_PKG_VERSION")), - )); - - let title = page.title().unwrap_or_default(); - let intro = page.description().unwrap_or_default(); - - let theme = page.context().theme(); - let h = theme.render_page_region(page, &BasicRegion::Header); - let c = theme.render_page_region(page, &BasicRegion::Content); - let f = theme.render_page_region(page, &BasicRegion::Footer); - - let intro_button_txt: L10n = page.param_or_default("intro_button_txt"); - let intro_button_lnk: Option<&String> = page.param("intro_button_lnk"); - - html! { - header class="intro-header" { - section class="intro-header__body" { - h1 class="intro-header__title" { - span { (title) } - (intro) - } - } - aside class="intro-header__image" aria-hidden="true" { - div class="intro-header__monster" { - picture { - source - type="image/avif" - src="/img/monster-pagetop_250.avif" - srcset="/img/monster-pagetop_500.avif 1.5x"; - source - type="image/webp" - src="/img/monster-pagetop_250.webp" - srcset="/img/monster-pagetop_500.webp 1.5x"; - img - src="/img/monster-pagetop_250.png" - srcset="/img/monster-pagetop_500.png 1.5x" - alt="Monster PageTop"; - } - } - } - (h) - } - main class="intro-content" { - section class="intro-content__body" { - div class="intro-text" { - @if intro_button_lnk.is_some() { - div class="intro-button" { - a - class="intro-button__link" - href=[intro_button_lnk] - target="_blank" - rel="noreferrer" - { - span {} span {} span {} - div class="intro-button__text" { - (intro_button_txt.using(page)) - } - } - } - } - (c) - } - } - } - footer class="intro-footer" { - section class="intro-footer__body" { - div class="intro-footer__logo" { - svg - viewBox="0 0 1614 1614" - xmlns="http://www.w3.org/2000/svg" - role="img" - aria-label=[L10n::l("pagetop_logo").lookup(page)] - preserveAspectRatio="xMidYMid slice" - focusable="false" - { - path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} - path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} - path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} - } - } - div class="intro-footer__links" { - a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } - a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } - a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("intro_code").using(page)) } - em { (L10n::l("intro_have_fun").using(page)) } - } - } - (f) - } - } -} - -fn render_pagetop_intro(page: &mut Page) -> Markup { - page.alter_assets(ContextOp::AddJavaScript(JavaScript::on_load_async("intro-js", |cx| - util::indoc!(r#" - try { - const resp = await fetch("https://crates.io/api/v1/crates/pagetop"); - const data = await resp.json(); - const date = new Date(data.versions[0].created_at); - const formatted = date.toLocaleDateString("LANGID", { year: "numeric", month: "2-digit", day: "2-digit" }); - document.getElementById("intro-release").src = `https://img.shields.io/badge/Release%20date-${encodeURIComponent(formatted)}-blue?label=LABEL&style=for-the-badge`; - document.getElementById("intro-badges").style.display = "block"; - } catch (e) { - console.error("Failed to fetch release date from crates.io:", e); - } - "#) - .replace("LANGID", cx.langid().to_string().as_str()) - .replace("LABEL", L10n::l("intro_release_label").using(cx).as_str()) - .to_string(), - ))) - .alter_child_in("content", ChildOp::Prepend(Child::with(Html::with(|cx| html! { - p { (L10n::l("intro_text1").using(cx)) } - div id="intro-badges" style="display: none; margin-bottom: 1.1rem;" { - img - src="https://img.shields.io/crates/v/pagetop.svg?label=PageTop&style=for-the-badge" - alt=[L10n::l("intro_pagetop_label").lookup(cx)] {} (" ") - img - id="intro-release" - alt=[L10n::l("intro_release_label").lookup(cx)] {} (" ") - img - src=(format!( - "https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label={}&style=for-the-badge", - L10n::l("intro_license_label").lookup(cx).unwrap_or_default() - )) - alt=[L10n::l("intro_license_label").lookup(cx)] {} - } - p { (L10n::l("intro_text2").using(cx)) } - })))); - - render_intro(page) -} diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 4e7db776..1eb7b226 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,6 +1,7 @@ +use crate::core::component::{ContextOp, Contextual}; use crate::core::extension::Extension; use crate::core::theme::{Region, RegionRef, REGION_CONTENT}; -use crate::html::{html, Markup}; +use crate::html::{html, Markup, StyleSheet}; use crate::locale::L10n; use crate::response::page::Page; use crate::{global, join}; @@ -241,7 +242,7 @@ pub trait Theme: Extension + ThemePage + Send + Sync { /// Renderiza el contenido del `<body>` de la página. /// - /// Si se sobrescribe este método, se puede volver al comportamiento base con: + /// Si se sobrescribe este método, se puede volver al renderizado base con: /// `<Self as ThemePage>::render_body(self, page, self.page_regions())`. #[inline] fn render_page_body(&self, page: &mut Page) -> Markup { @@ -256,10 +257,29 @@ pub trait Theme: Extension + ThemePage + Send + Sync { /// Renderiza el contenido del `<head>` de la página. /// - /// Si se sobrescribe este método, se puede volver al comportamiento base con: + /// Si se sobrescribe este método, se puede volver al renderizado base con: /// `<Self as ThemePage>::render_head(self, page)`. #[inline] fn render_page_head(&self, page: &mut Page) -> Markup { + if page.param_or("include_basic_assets", false) { + let pkg_version = env!("CARGO_PKG_VERSION"); + + page.alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/normalize.css") + .with_version("8.0.1") + .with_weight(-99), + )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/root.css") + .with_version(pkg_version) + .with_weight(-99), + )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/basic.css") + .with_version(pkg_version) + .with_weight(-99), + )); + } <Self as ThemePage>::render_head(self, page) } diff --git a/src/locale/en-US/base.ftl b/src/locale/en-US/base.ftl index 16b1a3ef..76baa120 100644 --- a/src/locale/en-US/base.ftl +++ b/src/locale/en-US/base.ftl @@ -1,4 +1,8 @@ -# Basic theme, intro layout. +# Intro component. +intro_default_title = Hello, world! +intro_default_slogan = Discover⚡{ $app } +intro_default_button = A web solution powered by <strong>PageTop</strong> + intro_pagetop_label = PageTop version on Crates.io intro_release_label = Release date intro_license_label = License diff --git a/src/locale/en-US/welcome.ftl b/src/locale/en-US/welcome.ftl index 20faf964..34028804 100644 --- a/src/locale/en-US/welcome.ftl +++ b/src/locale/en-US/welcome.ftl @@ -1,16 +1,12 @@ welcome_extension_name = Default Homepage welcome_extension_description = Displays a default homepage when none is configured. -welcome_page = Welcome page -welcome_title = Hello, world! - -welcome_intro = Discover⚡{ $app } -welcome_powered = A web solution powered by <strong>PageTop</strong> +welcome_title = Welcome page welcome_status_title = Status welcome_status_1 = If you can see this page, it means the <strong>PageTop</strong> server is running correctly, but the application is not fully configured. This may be due to routine maintenance or a temporary issue. welcome_status_2 = If the issue persists, please <strong>contact the system administrator</strong>. welcome_support_title = Support -welcome_support_1 = To report issues with the <strong>PageTop</strong> framework, use <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Remember, before opening a new issue, review the existing ones to avoid duplicates. +welcome_support_1 = To report issues with the <strong>PageTop</strong> framework, use <a href="https://github.com/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">GitHub</a>. Remember, before opening a new issue, review the existing ones to avoid duplicates. welcome_support_2 = For issues specific to the application (<strong>{ $app }</strong>), please use its official repository or support channel. diff --git a/src/locale/es-ES/base.ftl b/src/locale/es-ES/base.ftl index fee21a93..09867d13 100644 --- a/src/locale/es-ES/base.ftl +++ b/src/locale/es-ES/base.ftl @@ -1,4 +1,8 @@ -# Basic theme, intro layout. +# Intro component. +intro_default_title = ¡Hola, mundo! +intro_default_slogan = Descubre⚡{ $app } +intro_default_button = Una solución web creada con <strong>PageTop</strong> + intro_pagetop_label = Versión de PageTop en Crates.io intro_release_label = Lanzamiento intro_license_label = Licencia diff --git a/src/locale/es-ES/welcome.ftl b/src/locale/es-ES/welcome.ftl index 13330dbf..605d1e2c 100644 --- a/src/locale/es-ES/welcome.ftl +++ b/src/locale/es-ES/welcome.ftl @@ -1,16 +1,12 @@ welcome_extension_name = Página de inicio predeterminada welcome_extension_description = Muestra una página de inicio predeterminada cuando no hay ninguna configurada. -welcome_page = Página de bienvenida -welcome_title = ¡Hola, mundo! - -welcome_intro = Descubre⚡{ $app } -welcome_powered = Una solución web creada con <strong>PageTop</strong> +welcome_title = Página de bienvenida welcome_status_title = Estado welcome_status_1 = Si puedes ver esta página, es porque el servidor de <strong>PageTop</strong> está funcionando correctamente, pero la aplicación no está completamente configurada. Esto puede deberse a tareas de mantenimiento o a una incidencia temporal. welcome_status_2 = Si el problema persiste, por favor, <strong>contacta con el administrador del sistema</strong>. welcome_support_title = Soporte -welcome_support_1 = Para comunicar incidencias del propio entorno <strong>PageTop</strong>, utiliza <a href="https://git.cillero.es/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">SoloGit</a>. Recuerda, antes de abrir una nueva incidencia, revisa las existentes para evitar duplicados. +welcome_support_1 = Para comunicar incidencias del propio entorno <strong>PageTop</strong>, utiliza <a href="https://github.com/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">GitHub</a>. Recuerda, antes de abrir una nueva incidencia, revisa las existentes para evitar duplicados. welcome_support_2 = Para fallos específicos de la aplicación (<strong>{ $app }</strong>), utiliza su repositorio oficial o su canal de soporte. diff --git a/static/css/intro.css b/static/css/intro.css index 774bbb2a..17ab5bef 100644 --- a/static/css/intro.css +++ b/static/css/intro.css @@ -1,12 +1,24 @@ -html { - min-height: 100%; - background-color: black; +:root { + --intro-bg-img: url('/img/intro-header.jpg'); + --intro-bg-img-set: image-set(url('/img/intro-header.avif') type('image/avif'), url('/img/intro-header.webp') type('image/webp'), var(--intro-bg-img) type('image/jpeg')); + --intro-bg-img-sm: url('/img/intro-header-sm.jpg'); + --intro-bg-img-sm-set: image-set(url('/img/intro-header-sm.avif') type('image/avif'), url('/img/intro-header-sm.webp') type('image/webp'), var(--intro-bg-img-sm) type('image/jpeg')); + --intro-bg-color: #8c5919; + --intro-bg-block-1: #b689ff; + --intro-bg-block-2: #fecaca; + --intro-bg-block-3: #e6a9e2; + --intro-bg-block-4: #ffedca; + --intro-bg-block-5: #ffffff; + --intro-color: #1a202c; + --intro-color-gray: #e4e4e7; + --intro-color-link: #1e4eae; + --intro-focus-outline: 2px solid var(--intro-color-link); + --intro-focus-outline-offset: 2px; + --intro-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); } -body { - margin: auto; +.intro { position: relative; - min-height: 100%; min-width: 350px; color: var(--intro-color); background-color: var(--intro-bg-color); @@ -18,22 +30,22 @@ body { align-items: center; } -section { +.intro section { position: relative; text-align: center; } -a { +.intro a { color: currentColor; text-decoration: underline; transition: font-size 0.2s, text-decoration-color 0.2s; } -a:focus-visible { +.intro a:focus-visible { outline: var(--intro-focus-outline); outline-offset: var(--intro-focus-outline-offset); } -a:hover, -a:hover:visited { +.intro a:hover, +.intro a:hover:visited { text-decoration-color: var(--intro-color-link); } @@ -172,8 +184,8 @@ a:hover:visited { justify-content: space-between; font-size: 1.5rem; line-height: 1.3; - text-decoration: none; - transition: transform 0.3s ease-in-out; + text-decoration: none !important; + transition: transform 0.3s ease-in-out !important; position: relative; overflow: hidden; min-width: 28.875rem; @@ -307,7 +319,7 @@ a:hover:visited { } .intro-button__link:hover { transition: all .5s; - transform: rotate(-3deg) scale(1.1); + transform: rotate(-3deg) scale(1.125); } } @@ -326,11 +338,11 @@ a:hover:visited { background: #fff; position: relative; } -.region--content { +.intro-text__children { padding: 2.5rem 1.063rem 0.75rem; overflow: hidden; } -.region--content p { +.intro-text__children p { width: 100%; line-height: 150%; font-weight: 400; @@ -342,7 +354,7 @@ a:hover:visited { font-size: 1.375rem; line-height: 2rem; } - .intro-button + .region--content { + .intro-button + .intro-text__children { padding-top: 7rem; } } @@ -351,7 +363,7 @@ a:hover:visited { padding-bottom: 9rem;; } .intro-text, - .region--content { + .intro-text__children { border-radius: 0.75rem; } .intro-text { @@ -359,19 +371,19 @@ a:hover:visited { max-width: 60rem; margin: 0 auto 6rem; } - .region--content { + .intro-text__children { padding-left: 4.5rem; padding-right: 4.5rem; } } -.region--content .block { +.intro-text__children .block { position: relative; } -.region--content .block__title { +.intro-text__children .block__title { margin: 1em 0 .8em; } -.region--content .block__title span { +.intro-text__children .block__title span { display: inline-block; padding: 10px 30px 14px; margin: 30px 0 0 20px; @@ -382,7 +394,7 @@ a:hover:visited { border-color: orangered; transform: rotate(-3deg) translateY(-25%); } -.region--content .block__title:before { +.intro-text__children .block__title:before { content: ""; height: 5px; position: absolute; @@ -395,7 +407,7 @@ a:hover:visited { transform: rotate(2deg) translateY(-50%); transform-origin: top left; } -.region--content .block__title:after { +.intro-text__children .block__title:after { content: ""; height: 70rem; position: absolute; @@ -406,22 +418,28 @@ a:hover:visited { background: var(--intro-bg-block-1); transform: rotate(2deg); } -.region--content .block:nth-of-type(5n+1) .block__title:after { +.intro-text__children .block:nth-of-type(5n+1) .block__title:after { background: var(--intro-bg-block-1); } -.region--content .block:nth-of-type(5n+2) .block__title:after { +.intro-text__children .block:nth-of-type(5n+2) .block__title:after { background: var(--intro-bg-block-2); } -.region--content .block:nth-of-type(5n+3) .block__title:after { +.intro-text__children .block:nth-of-type(5n+3) .block__title:after { background: var(--intro-bg-block-3); } -.region--content .block:nth-of-type(5n+4) .block__title:after { +.intro-text__children .block:nth-of-type(5n+4) .block__title:after { background: var(--intro-bg-block-4); } -.region--content .block:nth-of-type(5n+5) .block__title:after { +.intro-text__children .block:nth-of-type(5n+5) .block__title:after { background: var(--intro-bg-block-5); } +#intro-badges { + display: none; + margin-bottom: 1.1rem; + text-align: center; +} + /* * Footer */ @@ -474,9 +492,3 @@ a:hover:visited { padding: 0 1rem 2rem; } } - -/* PoweredBy component */ - -.poweredby a:visited { - color: var(--intro-color-gray); -} diff --git a/static/css/root.css b/static/css/root.css index 270c1b3f..aeab1c67 100644 --- a/static/css/root.css +++ b/static/css/root.css @@ -1,22 +1,3 @@ -:root { - --intro-bg-img: url('/img/intro-header.jpg'); - --intro-bg-img-set: image-set(url('/img/intro-header.avif') type('image/avif'), url('/img/intro-header.webp') type('image/webp'), var(--intro-bg-img) type('image/jpeg')); - --intro-bg-img-sm: url('/img/intro-header-sm.jpg'); - --intro-bg-img-sm-set: image-set(url('/img/intro-header-sm.avif') type('image/avif'), url('/img/intro-header-sm.webp') type('image/webp'), var(--intro-bg-img-sm) type('image/jpeg')); - --intro-bg-color: #8c5919; - --intro-bg-block-1: #b689ff; - --intro-bg-block-2: #fecaca; - --intro-bg-block-3: #e6a9e2; - --intro-bg-block-4: #ffedca; - --intro-bg-block-5: #ffffff; - --intro-color: #1a202c; - --intro-color-gray: #e4e4e7; - --intro-color-link: #1e4eae; - --intro-focus-outline: 2px solid var(--intro-color-link); - --intro-focus-outline-offset: 2px; - --intro-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); -} - :root { --val-font-sans: system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; --val-font-serif: "Lora","georgia",serif; From 3e3903b2c72d4264cb2a73915c2b8adeb61bc389 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 12:07:02 +0200 Subject: [PATCH 815/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20tema=20`Bootsi?= =?UTF-8?q?er`=20basado=20en=20`Bootstrap`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 9 + Cargo.toml | 3 + extensions/pagetop-aliner/Cargo.toml | 2 +- extensions/pagetop-aliner/README.md | 2 +- extensions/pagetop-aliner/src/lib.rs | 2 +- extensions/pagetop-bootsier/Cargo.toml | 21 + extensions/pagetop-bootsier/README.md | 100 + extensions/pagetop-bootsier/build.rs | 22 + extensions/pagetop-bootsier/src/lib.rs | 121 + .../static/bootstrap-5.3.3/_accordion.scss | 158 + .../static/bootstrap-5.3.3/_alert.scss | 68 + .../static/bootstrap-5.3.3/_badge.scss | 38 + .../static/bootstrap-5.3.3/_breadcrumb.scss | 40 + .../static/bootstrap-5.3.3/_button-group.scss | 142 + .../static/bootstrap-5.3.3/_buttons.scss | 216 + .../static/bootstrap-5.3.3/_card.scss | 239 + .../static/bootstrap-5.3.3/_carousel.scss | 236 + .../static/bootstrap-5.3.3/_close.scss | 63 + .../static/bootstrap-5.3.3/_containers.scss | 41 + .../static/bootstrap-5.3.3/_dropdown.scss | 250 + .../static/bootstrap-5.3.3/_forms.scss | 9 + .../static/bootstrap-5.3.3/_functions.scss | 302 ++ .../static/bootstrap-5.3.3/_grid.scss | 39 + .../static/bootstrap-5.3.3/_helpers.scss | 12 + .../static/bootstrap-5.3.3/_images.scss | 42 + .../static/bootstrap-5.3.3/_list-group.scss | 197 + .../static/bootstrap-5.3.3/_maps.scss | 174 + .../static/bootstrap-5.3.3/_mixins.scss | 42 + .../static/bootstrap-5.3.3/_modal.scss | 236 + .../static/bootstrap-5.3.3/_nav.scss | 197 + .../static/bootstrap-5.3.3/_navbar.scss | 289 ++ .../static/bootstrap-5.3.3/_offcanvas.scss | 143 + .../static/bootstrap-5.3.3/_pagination.scss | 109 + .../static/bootstrap-5.3.3/_placeholders.scss | 51 + .../static/bootstrap-5.3.3/_popover.scss | 196 + .../static/bootstrap-5.3.3/_progress.scss | 68 + .../static/bootstrap-5.3.3/_reboot.scss | 611 +++ .../static/bootstrap-5.3.3/_root.scss | 187 + .../static/bootstrap-5.3.3/_spinners.scss | 85 + .../static/bootstrap-5.3.3/_tables.scss | 171 + .../static/bootstrap-5.3.3/_toasts.scss | 73 + .../static/bootstrap-5.3.3/_tooltip.scss | 119 + .../static/bootstrap-5.3.3/_transitions.scss | 27 + .../static/bootstrap-5.3.3/_type.scss | 106 + .../static/bootstrap-5.3.3/_utilities.scss | 806 +++ .../bootstrap-5.3.3/_variables-dark.scss | 87 + .../static/bootstrap-5.3.3/_variables.scss | 1751 +++++++ .../bootstrap-5.3.3/bootstrap-grid.scss | 62 + .../bootstrap-5.3.3/bootstrap-reboot.scss | 10 + .../bootstrap-5.3.3/bootstrap-utilities.scss | 19 + .../static/bootstrap-5.3.3/bootstrap.scss | 52 + .../forms/_floating-labels.scss | 95 + .../bootstrap-5.3.3/forms/_form-check.scss | 189 + .../bootstrap-5.3.3/forms/_form-control.scss | 214 + .../bootstrap-5.3.3/forms/_form-range.scss | 91 + .../bootstrap-5.3.3/forms/_form-select.scss | 80 + .../bootstrap-5.3.3/forms/_form-text.scss | 11 + .../bootstrap-5.3.3/forms/_input-group.scss | 132 + .../static/bootstrap-5.3.3/forms/_labels.scss | 36 + .../bootstrap-5.3.3/forms/_validation.scss | 12 + .../bootstrap-5.3.3/helpers/_clearfix.scss | 3 + .../bootstrap-5.3.3/helpers/_color-bg.scss | 7 + .../helpers/_colored-links.scss | 30 + .../bootstrap-5.3.3/helpers/_focus-ring.scss | 5 + .../bootstrap-5.3.3/helpers/_icon-link.scss | 25 + .../bootstrap-5.3.3/helpers/_position.scss | 36 + .../bootstrap-5.3.3/helpers/_ratio.scss | 26 + .../bootstrap-5.3.3/helpers/_stacks.scss | 15 + .../helpers/_stretched-link.scss | 15 + .../helpers/_text-truncation.scss | 7 + .../helpers/_visually-hidden.scss | 8 + .../static/bootstrap-5.3.3/helpers/_vr.scss | 8 + .../static/bootstrap-5.3.3/mixins/_alert.scss | 18 + .../bootstrap-5.3.3/mixins/_backdrop.scss | 14 + .../bootstrap-5.3.3/mixins/_banner.scss | 7 + .../mixins/_border-radius.scss | 78 + .../bootstrap-5.3.3/mixins/_box-shadow.scss | 18 + .../bootstrap-5.3.3/mixins/_breakpoints.scss | 127 + .../bootstrap-5.3.3/mixins/_buttons.scss | 70 + .../static/bootstrap-5.3.3/mixins/_caret.scss | 69 + .../bootstrap-5.3.3/mixins/_clearfix.scss | 9 + .../bootstrap-5.3.3/mixins/_color-mode.scss | 21 + .../bootstrap-5.3.3/mixins/_color-scheme.scss | 7 + .../bootstrap-5.3.3/mixins/_container.scss | 11 + .../bootstrap-5.3.3/mixins/_deprecate.scss | 10 + .../static/bootstrap-5.3.3/mixins/_forms.scss | 163 + .../bootstrap-5.3.3/mixins/_gradients.scss | 47 + .../static/bootstrap-5.3.3/mixins/_grid.scss | 151 + .../static/bootstrap-5.3.3/mixins/_image.scss | 16 + .../bootstrap-5.3.3/mixins/_list-group.scss | 26 + .../static/bootstrap-5.3.3/mixins/_lists.scss | 7 + .../bootstrap-5.3.3/mixins/_pagination.scss | 10 + .../bootstrap-5.3.3/mixins/_reset-text.scss | 17 + .../bootstrap-5.3.3/mixins/_resize.scss | 6 + .../mixins/_table-variants.scss | 24 + .../mixins/_text-truncate.scss | 8 + .../bootstrap-5.3.3/mixins/_transition.scss | 26 + .../bootstrap-5.3.3/mixins/_utilities.scss | 97 + .../mixins/_visually-hidden.scss | 33 + .../static/bootstrap-5.3.3/tests/jasmine.js | 16 + .../_auto-import-of-variables-dark.test.scss | 7 + .../tests/mixins/_color-modes.test.scss | 69 + .../_media-query-color-mode-full.test.scss | 8 + .../tests/mixins/_utilities.test.scss | 393 ++ .../tests/sass-true/register.js | 14 + .../bootstrap-5.3.3/tests/sass-true/runner.js | 17 + .../tests/utilities/_api.test.scss | 75 + .../bootstrap-5.3.3/utilities/_api.scss | 47 + .../static/bootstrap-5.3.3/vendor/_rfs.scss | 348 ++ .../pagetop-bootsier/static/js/bootstrap.js | 4494 +++++++++++++++++ .../static/js/bootstrap.js.map | 1 + .../static/js/bootstrap.min.js | 7 + .../static/js/bootstrap.min.js.map | 1 + src/base/extension/welcome.rs | 1 - tools/changelog.sh | 8 + 115 files changed, 15682 insertions(+), 4 deletions(-) create mode 100644 extensions/pagetop-bootsier/Cargo.toml create mode 100644 extensions/pagetop-bootsier/README.md create mode 100644 extensions/pagetop-bootsier/build.rs create mode 100644 extensions/pagetop-bootsier/src/lib.rs create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_accordion.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_alert.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_badge.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_breadcrumb.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_button-group.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_buttons.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_card.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_carousel.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_close.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_containers.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_dropdown.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_forms.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_functions.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_grid.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_helpers.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_images.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_list-group.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_maps.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_mixins.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_modal.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_nav.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_navbar.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_offcanvas.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_pagination.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_placeholders.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_popover.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_progress.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_reboot.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_root.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_spinners.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tables.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_toasts.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tooltip.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_transitions.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_type.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_utilities.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables-dark.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-grid.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-reboot.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-utilities.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_floating-labels.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-check.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-control.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-range.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-select.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-text.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_input-group.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_labels.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_validation.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_clearfix.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_color-bg.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_colored-links.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_focus-ring.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_icon-link.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_position.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_ratio.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stacks.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stretched-link.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_text-truncation.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_visually-hidden.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_vr.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_alert.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_backdrop.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_banner.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_border-radius.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_breakpoints.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_buttons.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_caret.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_clearfix.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-mode.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-scheme.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_container.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_deprecate.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_forms.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_gradients.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_grid.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_image.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_list-group.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_lists.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_pagination.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_reset-text.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_resize.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_table-variants.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_text-truncate.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_transition.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_utilities.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_visually-hidden.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/jasmine.js create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_auto-import-of-variables-dark.test.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_color-modes.test.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_media-query-color-mode-full.test.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_utilities.test.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/register.js create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/runner.js create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/utilities/_api.test.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/utilities/_api.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/vendor/_rfs.scss create mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.js create mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.js.map create mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.min.js create mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.min.js.map diff --git a/Cargo.lock b/Cargo.lock index cab741ef..ebcebd39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1561,6 +1561,7 @@ dependencies = [ "indoc", "itoa", "pagetop-aliner", + "pagetop-bootsier", "pagetop-build", "pagetop-macros", "pagetop-statics", @@ -1585,6 +1586,14 @@ dependencies = [ "pagetop-build", ] +[[package]] +name = "pagetop-bootsier" +version = "0.0.18" +dependencies = [ + "pagetop", + "pagetop-build", +] + [[package]] name = "pagetop-build" version = "0.3.1" diff --git a/Cargo.toml b/Cargo.toml index fe101436..103f6a94 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,6 +51,7 @@ testing = [] [dev-dependencies] tempfile = "3.23" pagetop-aliner.workspace = true +pagetop-bootsier.workspace = true [build-dependencies] pagetop-build.workspace = true @@ -65,6 +66,7 @@ members = [ "helpers/pagetop-statics", # Extensions "extensions/pagetop-aliner", + "extensions/pagetop-bootsier", ] [workspace.package] @@ -81,5 +83,6 @@ pagetop-macros = { version = "0.2", path = "helpers/pagetop-macros" } pagetop-statics = { version = "0.1", path = "helpers/pagetop-statics" } # Extensions pagetop-aliner = { version = "0.0", path = "extensions/pagetop-aliner" } +pagetop-bootsier = { version = "0.0", path = "extensions/pagetop-bootsier" } # PageTop pagetop = { version = "0.4", path = "." } diff --git a/extensions/pagetop-aliner/Cargo.toml b/extensions/pagetop-aliner/Cargo.toml index 1c1101fb..603a6309 100644 --- a/extensions/pagetop-aliner/Cargo.toml +++ b/extensions/pagetop-aliner/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.9" edition = "2021" description = """ - Tema para PageTop que muestra esquemáticamente la composición de las páginas HTML + Tema de PageTop que muestra esquemáticamente la composición de las páginas HTML """ categories = ["web-programming", "gui"] keywords = ["pagetop", "theme", "css"] diff --git a/extensions/pagetop-aliner/README.md b/extensions/pagetop-aliner/README.md index 88e3d782..ac6da910 100644 --- a/extensions/pagetop-aliner/README.md +++ b/extensions/pagetop-aliner/README.md @@ -2,7 +2,7 @@ <h1>PageTop Aliner</h1> -<p>Tema para <strong>PageTop</strong> que muestra esquemáticamente la composición de las páginas HTML.</p> +<p>Tema de <strong>PageTop</strong> que muestra esquemáticamente la composición de las páginas HTML.</p> [![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner) diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index 084678d7..92f9aa41 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -107,7 +107,7 @@ impl Extension for Aliner { } impl Theme for Aliner { - fn before_render_page_body(&self, page: &mut Page) { + fn after_render_page_body(&self, page: &mut Page) { page.alter_param("include_basic_assets", true) .alter_assets(ContextOp::AddStyleSheet( StyleSheet::from("/aliner/css/styles.css") diff --git a/extensions/pagetop-bootsier/Cargo.toml b/extensions/pagetop-bootsier/Cargo.toml new file mode 100644 index 00000000..8945e5a8 --- /dev/null +++ b/extensions/pagetop-bootsier/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "pagetop-bootsier" +version = "0.0.18" +edition = "2021" + +description = """ + Tema de PageTop basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles. +""" +categories = ["web-programming", "gui"] +keywords = ["pagetop", "theme", "bootstrap", "css", "js"] + +repository.workspace = true +homepage.workspace = true +license.workspace = true +authors.workspace = true + +[dependencies] +pagetop.workspace = true + +[build-dependencies] +pagetop-build.workspace = true diff --git a/extensions/pagetop-bootsier/README.md b/extensions/pagetop-bootsier/README.md new file mode 100644 index 00000000..87bd3c7b --- /dev/null +++ b/extensions/pagetop-bootsier/README.md @@ -0,0 +1,100 @@ +<div align="center"> + +<h1>PageTop Bootsier</h1> + +<p>Tema de <strong>PageTop</strong> basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) +[![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) +[![Descargas](https://img.shields.io/crates/d/pagetop-bootsier.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-bootsier) + +<br> +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# ⚡️ Guía rápida + +Igual que con otras extensiones, **añade la dependencia** a tu `Cargo.toml`: + +```toml +[dependencies] +pagetop-bootsier = "..." +``` + +**Declara la extensión** en tu aplicación (o extensión que la requiera). Recuerda que el orden en +`dependencies()` determina la prioridad relativa frente a las otras extensiones: + +```rust,no_run +use pagetop::prelude::*; + +struct MyApp; + +impl Extension for MyApp { + fn dependencies(&self) -> Vec<ExtensionRef> { + vec![ + // ... + &pagetop_bootsier::Bootsier, + // ... + ] + } +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&MyApp).run()?.await +} +``` + +Y **selecciona el tema en la configuración** de la aplicación: + +```toml +[app] +theme = "Bootsier" +``` + +…o **fuerza el tema por código** en una página concreta: + +```rust,no_run +use pagetop::prelude::*; + +async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Page::new(request) + .with_theme("Bootsier") + .add_component( + Block::new() + .with_title(L10n::l("sample_title")) + .add_component(Html::with(|cx| html! { + p { (L10n::l("sample_content").using(cx)) } + })), + ) + .render() +} +``` + + +# 🚧 Advertencia + +**PageTop** es un proyecto personal para aprender [Rust](https://www.rust-lang.org/es) y conocer su +ecosistema. Su API está sujeta a cambios frecuentes. No se recomienda su uso en producción, al menos +hasta que se libere la versión **1.0.0**. + + +# 📜 Licencia + +El código está disponible bajo una doble licencia: + + * **Licencia MIT** + ([LICENSE-MIT](LICENSE-MIT) o también https://opensource.org/licenses/MIT) + + * **Licencia Apache, Versión 2.0** + ([LICENSE-APACHE](LICENSE-APACHE) o también https://www.apache.org/licenses/LICENSE-2.0) + +Puedes elegir la licencia que prefieras. Este enfoque de doble licencia es el estándar de facto en +el ecosistema Rust. diff --git a/extensions/pagetop-bootsier/build.rs b/extensions/pagetop-bootsier/build.rs new file mode 100644 index 00000000..47cb4740 --- /dev/null +++ b/extensions/pagetop-bootsier/build.rs @@ -0,0 +1,22 @@ +use pagetop_build::StaticFilesBundle; + +use std::env; +use std::path::Path; + +fn main() -> std::io::Result<()> { + StaticFilesBundle::from_scss( + "./static/bootstrap-5.3.3/bootstrap.scss", + "bootstrap.min.css", + ) + .with_name("bootsier") + .build()?; + StaticFilesBundle::from_dir("./static/js", Some(bootstrap_js_files)) + .with_name("bootsier_js") + .build() +} + +fn bootstrap_js_files(path: &Path) -> bool { + // No filtering during development, only on "release" compilation. + env::var("PROFILE").unwrap_or_else(|_| "release".to_string()) != "release" + || path.file_name().map_or(false, |n| n == "bootstrap.min.js") +} diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs new file mode 100644 index 00000000..8157ec2d --- /dev/null +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -0,0 +1,121 @@ +/*! +<div align="center"> + +<h1>PageTop Bootsier</h1> + +<p>Tema de <strong>PageTop</strong> basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles.</p> + +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) +[![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) +[![Descargas](https://img.shields.io/crates/d/pagetop-bootsier.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-bootsier) + +<br> +</div> + +## Sobre PageTop + +[PageTop](https://docs.rs/pagetop) es un entorno de desarrollo que reivindica la esencia de la web +clásica para crear soluciones web SSR (*renderizadas en el servidor*) modulares, extensibles y +configurables, basadas en HTML, CSS y JavaScript. + + +# ⚡️ Guía rápida + +Igual que con otras extensiones, **añade la dependencia** a tu `Cargo.toml`: + +```toml +[dependencies] +pagetop-bootsier = "..." +``` + +**Declara la extensión** en tu aplicación (o extensión que la requiera). Recuerda que el orden en +`dependencies()` determina la prioridad relativa frente a las otras extensiones: + +```rust,no_run +use pagetop::prelude::*; + +struct MyApp; + +impl Extension for MyApp { + fn dependencies(&self) -> Vec<ExtensionRef> { + vec![ + // ... + &pagetop_bootsier::Bootsier, + // ... + ] + } +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&MyApp).run()?.await +} +``` + +Y **selecciona el tema en la configuración** de la aplicación: + +```toml +[app] +theme = "Bootsier" +``` + +…o **fuerza el tema por código** en una página concreta: + +```rust,no_run +use pagetop::prelude::*; + +async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { + Page::new(request) + .with_theme("Bootsier") + .add_component( + Block::new() + .with_title(L10n::l("sample_title")) + .add_component(Html::with(|cx| html! { + p { (L10n::l("sample_content").using(cx)) } + })), + ) + .render() +} +``` +*/ + +use pagetop::prelude::*; + +/// El tema usa las mismas regiones predefinidas por [`ThemeRegion`]. +pub type BootsierRegion = ThemeRegion; + +// Versión de la librería Bootstrap. +const BOOTSTRAP_VERSION: &str = "5.3.3"; + +/// Tema basado en [Bootstrap](https://getbootstrap.com/) para los componentes base de PageTop. +/// +/// Ofrece composición de páginas *responsive*, utilidades y componentes listos para usar, con +/// estilos coherentes y enfoque en accesibilidad. +pub struct Bootsier; + +impl Extension for Bootsier { + fn theme(&self) -> Option<ThemeRef> { + Some(&Self) + } + + fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { + static_files_service!(scfg, [bootsier] => "/bootsier/css"); + static_files_service!(scfg, [bootsier_js] => "/bootsier/js"); + } +} + +impl Theme for Bootsier { + fn after_render_page_body(&self, page: &mut Page) { + page.alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/bootsier/css/bootstrap.min.css") + .with_version(BOOTSTRAP_VERSION) + .with_weight(-90), + )) + .alter_assets(ContextOp::AddJavaScript( + JavaScript::defer("/bootsier/js/bootstrap.min.js") + .with_version(BOOTSTRAP_VERSION) + .with_weight(-90), + )); + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_accordion.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_accordion.scss new file mode 100644 index 00000000..17e5436e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_accordion.scss @@ -0,0 +1,158 @@ +// +// Base styles +// + +.accordion { + // scss-docs-start accordion-css-vars + --#{$prefix}accordion-color: #{$accordion-color}; + --#{$prefix}accordion-bg: #{$accordion-bg}; + --#{$prefix}accordion-transition: #{$accordion-transition}; + --#{$prefix}accordion-border-color: #{$accordion-border-color}; + --#{$prefix}accordion-border-width: #{$accordion-border-width}; + --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; + --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; + --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; + --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; + --#{$prefix}accordion-btn-color: #{$accordion-button-color}; + --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; + --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; + --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; + --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; + --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; + --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; + --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; + --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; + --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; + // scss-docs-end accordion-css-vars +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); + @include font-size($font-size-base); + color: var(--#{$prefix}accordion-btn-color); + text-align: left; // Reset button style + background-color: var(--#{$prefix}accordion-btn-bg); + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition(var(--#{$prefix}accordion-transition)); + + &:not(.collapsed) { + color: var(--#{$prefix}accordion-active-color); + background-color: var(--#{$prefix}accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list + + &::after { + background-image: var(--#{$prefix}accordion-btn-active-icon); + transform: var(--#{$prefix}accordion-btn-icon-transform); + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: var(--#{$prefix}accordion-btn-icon-width); + height: var(--#{$prefix}accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--#{$prefix}accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--#{$prefix}accordion-btn-icon-width); + @include transition(var(--#{$prefix}accordion-btn-icon-transition)); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + outline: 0; + box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--#{$prefix}accordion-color); + background-color: var(--#{$prefix}accordion-bg); + border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); + + &:first-of-type { + @include border-top-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + + > .accordion-header .accordion-button { + &.collapsed { + @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + > .accordion-collapse { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + } + } +} + +.accordion-body { + padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + > .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + // stylelint-disable selector-max-class + > .accordion-header .accordion-button { + &, + &.collapsed { + @include border-radius(0); + } + } + // stylelint-enable selector-max-class + + > .accordion-collapse { + @include border-radius(0); + } + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .accordion-button::after { + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_alert.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_alert.scss new file mode 100644 index 00000000..b8cff9b7 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_alert.scss @@ -0,0 +1,68 @@ +// +// Base styles +// + +.alert { + // scss-docs-start alert-css-vars + --#{$prefix}alert-bg: transparent; + --#{$prefix}alert-padding-x: #{$alert-padding-x}; + --#{$prefix}alert-padding-y: #{$alert-padding-y}; + --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; + --#{$prefix}alert-color: inherit; + --#{$prefix}alert-border-color: transparent; + --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); + --#{$prefix}alert-border-radius: #{$alert-border-radius}; + --#{$prefix}alert-link-color: inherit; + // scss-docs-end alert-css-vars + + position: relative; + padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); + margin-bottom: var(--#{$prefix}alert-margin-bottom); + color: var(--#{$prefix}alert-color); + background-color: var(--#{$prefix}alert-bg); + border: var(--#{$prefix}alert-border); + @include border-radius(var(--#{$prefix}alert-border-radius)); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; + color: var(--#{$prefix}alert-link-color); +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert +@each $state in map-keys($theme-colors) { + .alert-#{$state} { + --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end alert-modifiers diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_badge.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_badge.scss new file mode 100644 index 00000000..cc3d2695 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_badge.scss @@ -0,0 +1,38 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + // scss-docs-start badge-css-vars + --#{$prefix}badge-padding-x: #{$badge-padding-x}; + --#{$prefix}badge-padding-y: #{$badge-padding-y}; + @include rfs($badge-font-size, --#{$prefix}badge-font-size); + --#{$prefix}badge-font-weight: #{$badge-font-weight}; + --#{$prefix}badge-color: #{$badge-color}; + --#{$prefix}badge-border-radius: #{$badge-border-radius}; + // scss-docs-end badge-css-vars + + display: inline-block; + padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); + @include font-size(var(--#{$prefix}badge-font-size)); + font-weight: var(--#{$prefix}badge-font-weight); + line-height: 1; + color: var(--#{$prefix}badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(var(--#{$prefix}badge-border-radius)); + @include gradient-bg(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_breadcrumb.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_breadcrumb.scss new file mode 100644 index 00000000..b8252ff2 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_breadcrumb.scss @@ -0,0 +1,40 @@ +.breadcrumb { + // scss-docs-start breadcrumb-css-vars + --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; + --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; + --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; + @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); + --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; + --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; + --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; + --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; + --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; + // scss-docs-end breadcrumb-css-vars + + display: flex; + flex-wrap: wrap; + padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); + margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); + @include font-size(var(--#{$prefix}breadcrumb-font-size)); + list-style: none; + background-color: var(--#{$prefix}breadcrumb-bg); + @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: var(--#{$prefix}breadcrumb-item-padding-x); + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: var(--#{$prefix}breadcrumb-item-padding-x); + color: var(--#{$prefix}breadcrumb-divider-color); + content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; + } + } + + &.active { + color: var(--#{$prefix}breadcrumb-item-active-color); + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_button-group.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_button-group.scss new file mode 100644 index 00000000..55ae3f65 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_button-group.scss @@ -0,0 +1,142 @@ +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + } + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + @include border-radius($btn-border-radius); + + // Prevent double borders when buttons are next to each other + > :not(.btn-check:first-child) + .btn, + > .btn-group:not(:first-child) { + margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn.dropdown-toggle-split:first-child, + > .btn-group:not(:last-child) > .btn { + @include border-end-radius(0); + } + + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-start-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropend &::after { + margin-left: 0; + } + + .dropstart &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + > .btn ~ .btn, + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_buttons.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_buttons.scss new file mode 100644 index 00000000..caa4518a --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_buttons.scss @@ -0,0 +1,216 @@ +// +// Base styles +// + +.btn { + // scss-docs-start btn-css-vars + --#{$prefix}btn-padding-x: #{$btn-padding-x}; + --#{$prefix}btn-padding-y: #{$btn-padding-y}; + --#{$prefix}btn-font-family: #{$btn-font-family}; + @include rfs($btn-font-size, --#{$prefix}btn-font-size); + --#{$prefix}btn-font-weight: #{$btn-font-weight}; + --#{$prefix}btn-line-height: #{$btn-line-height}; + --#{$prefix}btn-color: #{$btn-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-width: #{$btn-border-width}; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-border-radius: #{$btn-border-radius}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; + --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; + --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); + // scss-docs-end btn-css-vars + + display: inline-block; + padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); + font-family: var(--#{$prefix}btn-font-family); + @include font-size(var(--#{$prefix}btn-font-size)); + font-weight: var(--#{$prefix}btn-font-weight); + line-height: var(--#{$prefix}btn-line-height); + color: var(--#{$prefix}btn-color); + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + cursor: if($enable-button-pointers, pointer, null); + user-select: none; + border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); + @include border-radius(var(--#{$prefix}btn-border-radius)); + @include gradient-bg(var(--#{$prefix}btn-bg)); + @include box-shadow(var(--#{$prefix}btn-box-shadow)); + @include transition($btn-transition); + + &:hover { + color: var(--#{$prefix}btn-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + background-color: var(--#{$prefix}btn-hover-bg); + border-color: var(--#{$prefix}btn-hover-border-color); + } + + .btn-check + &:hover { + // override for the checkbox/radio buttons + color: var(--#{$prefix}btn-color); + background-color: var(--#{$prefix}btn-bg); + border-color: var(--#{$prefix}btn-border-color); + } + + &:focus-visible { + color: var(--#{$prefix}btn-hover-color); + @include gradient-bg(var(--#{$prefix}btn-hover-bg)); + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:focus-visible + & { + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:checked + &, + :not(.btn-check) + &:active, + &:first-child:active, + &.active, + &.show { + color: var(--#{$prefix}btn-active-color); + background-color: var(--#{$prefix}btn-active-bg); + // Remove CSS gradients if they're enabled + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-active-border-color); + @include box-shadow(var(--#{$prefix}btn-active-shadow)); + + &:focus-visible { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + } + + .btn-check:checked:focus-visible + & { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + &:disabled, + &.disabled, + fieldset:disabled & { + color: var(--#{$prefix}btn-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}btn-disabled-bg); + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-disabled-border-color); + opacity: var(--#{$prefix}btn-disabled-opacity); + @include box-shadow(none); + } +} + + +// +// Alternate buttons +// + +// scss-docs-start btn-variant-loops +@each $color, $value in $theme-colors { + .btn-#{$color} { + @if $color == "light" { + @include button-variant( + $value, + $value, + $hover-background: shade-color($value, $btn-hover-bg-shade-amount), + $hover-border: shade-color($value, $btn-hover-border-shade-amount), + $active-background: shade-color($value, $btn-active-bg-shade-amount), + $active-border: shade-color($value, $btn-active-border-shade-amount) + ); + } @else if $color == "dark" { + @include button-variant( + $value, + $value, + $hover-background: tint-color($value, $btn-hover-bg-tint-amount), + $hover-border: tint-color($value, $btn-hover-border-tint-amount), + $active-background: tint-color($value, $btn-active-bg-tint-amount), + $active-border: tint-color($value, $btn-active-border-tint-amount) + ); + } @else { + @include button-variant($value, $value); + } + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} +// scss-docs-end btn-variant-loops + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + --#{$prefix}btn-font-weight: #{$font-weight-normal}; + --#{$prefix}btn-color: #{$btn-link-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-active-color: #{$btn-link-hover-color}; + --#{$prefix}btn-active-border-color: transparent; + --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; + --#{$prefix}btn-disabled-border-color: transparent; + --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows + --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; + + text-decoration: $link-decoration; + @if $enable-gradients { + background-image: none; + } + + &:hover, + &:focus-visible { + text-decoration: $link-hover-decoration; + } + + &:focus-visible { + color: var(--#{$prefix}btn-color); + } + + &:hover { + color: var(--#{$prefix}btn-hover-color); + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_card.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_card.scss new file mode 100644 index 00000000..d3535a98 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_card.scss @@ -0,0 +1,239 @@ +// +// Base styles +// + +.card { + // scss-docs-start card-css-vars + --#{$prefix}card-spacer-y: #{$card-spacer-y}; + --#{$prefix}card-spacer-x: #{$card-spacer-x}; + --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; + --#{$prefix}card-title-color: #{$card-title-color}; + --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; + --#{$prefix}card-border-width: #{$card-border-width}; + --#{$prefix}card-border-color: #{$card-border-color}; + --#{$prefix}card-border-radius: #{$card-border-radius}; + --#{$prefix}card-box-shadow: #{$card-box-shadow}; + --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; + --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; + --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; + --#{$prefix}card-cap-bg: #{$card-cap-bg}; + --#{$prefix}card-cap-color: #{$card-cap-color}; + --#{$prefix}card-height: #{$card-height}; + --#{$prefix}card-color: #{$card-color}; + --#{$prefix}card-bg: #{$card-bg}; + --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; + --#{$prefix}card-group-margin: #{$card-group-margin}; + // scss-docs-end card-css-vars + + position: relative; + display: flex; + flex-direction: column; + min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 + height: var(--#{$prefix}card-height); + color: var(--#{$prefix}body-color); + word-wrap: break-word; + background-color: var(--#{$prefix}card-bg); + background-clip: border-box; + border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + @include border-radius(var(--#{$prefix}card-border-radius)); + @include box-shadow(var(--#{$prefix}card-box-shadow)); + + > hr { + margin-right: 0; + margin-left: 0; + } + + > .list-group { + border-top: inherit; + border-bottom: inherit; + + &:first-child { + border-top-width: 0; + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); + } + + &:last-child { + border-bottom-width: 0; + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); + } + } + + // Due to specificity of the above selector (`.card > .list-group`), we must + // use a child selector here to prevent double borders. + > .card-header + .list-group, + > .list-group + .card-footer { + border-top: 0; + } +} + +.card-body { + // Enable `flex-grow: 1` for decks and groups so that card blocks take up + // as much space as possible, ensuring footers are aligned to the bottom. + flex: 1 1 auto; + padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); + color: var(--#{$prefix}card-color); +} + +.card-title { + margin-bottom: var(--#{$prefix}card-title-spacer-y); + color: var(--#{$prefix}card-title-color); +} + +.card-subtitle { + margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list + margin-bottom: 0; + color: var(--#{$prefix}card-subtitle-color); +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link { + &:hover { + text-decoration: if($link-hover-decoration == underline, none, null); + } + + + .card-link { + margin-left: var(--#{$prefix}card-spacer-x); + } +} + +// +// Optional textual caps +// + +.card-header { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + margin-bottom: 0; // Removes the default margin-bottom of <hN> + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:first-child { + @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); + } +} + +.card-footer { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:last-child { + @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); + } +} + + +// +// Header navs +// + +.card-header-tabs { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + border-bottom: 0; + + .nav-link.active { + background-color: var(--#{$prefix}card-bg); + border-bottom-color: var(--#{$prefix}card-bg); + } +} + +.card-header-pills { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list +} + +// Card image +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--#{$prefix}card-img-overlay-padding); + @include border-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch +} + +.card-img, +.card-img-top { + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-bottom { + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); +} + + +// +// Card groups +// + +.card-group { + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + margin-bottom: var(--#{$prefix}card-group-margin); + } + + @include media-breakpoint-up(sm) { + display: flex; + flex-flow: row wrap; + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 + flex: 1 0 0%; + margin-bottom: 0; + + + .card { + margin-left: 0; + border-left: 0; + } + + // Handle rounded corners + @if $enable-rounded { + &:not(:last-child) { + @include border-end-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-right-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-right-radius: 0; + } + } + + &:not(:first-child) { + @include border-start-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-left-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-left-radius: 0; + } + } + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_carousel.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_carousel.scss new file mode 100644 index 00000000..3a135220 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_carousel.scss @@ -0,0 +1,236 @@ +// Notes on the classes: +// +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) +// even when their scroll action started on a carousel, but for compatibility (with Firefox) +// we're preventing all actions instead +// 2. The .carousel-item-start and .carousel-item-end is used to indicate where +// the active slide is heading. +// 3. .active.carousel-item is the current slide. +// 4. .active.carousel-item-start and .active.carousel-item-end is the current +// slide in its in-transition state. Only one of these occurs at a time. +// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end +// is the upcoming slide in transition. + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + @include clearfix(); +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + @include transition($carousel-transition); +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + + +// +// Alternate transitions +// + +.carousel-fade { + .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + + .carousel-item.active, + .carousel-item-next.carousel-item-start, + .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + + .active.carousel-item-start, + .active.carousel-item-end { + z-index: 0; + opacity: 0; + @include transition(opacity 0s $carousel-transition-duration); + } +} + + +// +// Left/right controls for nav +// + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + // Use flex for alignment (1-3) + display: flex; // 1. allow flex styles + align-items: center; // 2. vertically center contents + justify-content: center; // 3. horizontally center contents + width: $carousel-control-width; + padding: 0; + color: $carousel-control-color; + text-align: center; + background: none; + border: 0; + opacity: $carousel-control-opacity; + @include transition($carousel-control-transition); + + // Hover/focus state + &:hover, + &:focus { + color: $carousel-control-color; + text-decoration: none; + outline: 0; + opacity: $carousel-control-hover-opacity; + } +} +.carousel-control-prev { + left: 0; + background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); +} +.carousel-control-next { + right: 0; + background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); +} + +// Icons for within +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: $carousel-control-icon-width; + height: $carousel-control-icon-width; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: escape-svg($carousel-control-prev-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-next-icon-bg) + "*/"}; +} +.carousel-control-next-icon { + background-image: escape-svg($carousel-control-next-icon-bg) #{"/*rtl:" + escape-svg($carousel-control-prev-icon-bg) + "*/"}; +} + +// Optional indicator pips/controls +// +// Add a container (such as a list) with the following class and add an item (ideally a focusable control, +// like a button) with data-bs-target for each slide your carousel holds. + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + // Use the .carousel-control's width as margin so we don't overlay those + margin-right: $carousel-control-width; + margin-bottom: 1rem; + margin-left: $carousel-control-width; + + [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: $carousel-indicator-width; + height: $carousel-indicator-height; + padding: 0; + margin-right: $carousel-indicator-spacer; + margin-left: $carousel-indicator-spacer; + text-indent: -999px; + cursor: pointer; + background-color: $carousel-indicator-active-bg; + background-clip: padding-box; + border: 0; + // Use transparent borders to increase the hit area by 10px on top and bottom. + border-top: $carousel-indicator-hit-area-height solid transparent; + border-bottom: $carousel-indicator-hit-area-height solid transparent; + opacity: $carousel-indicator-opacity; + @include transition($carousel-indicator-transition); + } + + .active { + opacity: $carousel-indicator-active-opacity; + } +} + + +// Optional captions +// +// + +.carousel-caption { + position: absolute; + right: (100% - $carousel-caption-width) * .5; + bottom: $carousel-caption-spacer; + left: (100% - $carousel-caption-width) * .5; + padding-top: $carousel-caption-padding-y; + padding-bottom: $carousel-caption-padding-y; + color: $carousel-caption-color; + text-align: center; +} + +// Dark mode carousel + +@mixin carousel-dark() { + .carousel-control-prev-icon, + .carousel-control-next-icon { + filter: $carousel-dark-control-icon-filter; + } + + .carousel-indicators [data-bs-target] { + background-color: $carousel-dark-indicator-active-bg; + } + + .carousel-caption { + color: $carousel-dark-caption-color; + } +} + +.carousel-dark { + @include carousel-dark(); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + @if $color-mode-type == "media-query" { + .carousel { + @include carousel-dark(); + } + } @else { + .carousel, + &.carousel { + @include carousel-dark(); + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_close.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_close.scss new file mode 100644 index 00000000..4d6e73c1 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_close.scss @@ -0,0 +1,63 @@ +// Transparent background and border properties included for button version. +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +.btn-close { + // scss-docs-start close-css-vars + --#{$prefix}btn-close-color: #{$btn-close-color}; + --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; + --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; + --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; + --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; + --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; + --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; + --#{$prefix}btn-close-white-filter: #{$btn-close-white-filter}; + // scss-docs-end close-css-vars + + box-sizing: content-box; + width: $btn-close-width; + height: $btn-close-height; + padding: $btn-close-padding-y $btn-close-padding-x; + color: var(--#{$prefix}btn-close-color); + background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements + border: 0; // for button elements + @include border-radius(); + opacity: var(--#{$prefix}btn-close-opacity); + + // Override <a>'s hover style + &:hover { + color: var(--#{$prefix}btn-close-color); + text-decoration: none; + opacity: var(--#{$prefix}btn-close-hover-opacity); + } + + &:focus { + outline: 0; + box-shadow: var(--#{$prefix}btn-close-focus-shadow); + opacity: var(--#{$prefix}btn-close-focus-opacity); + } + + &:disabled, + &.disabled { + pointer-events: none; + user-select: none; + opacity: var(--#{$prefix}btn-close-disabled-opacity); + } +} + +@mixin btn-close-white() { + filter: var(--#{$prefix}btn-close-white-filter); +} + +.btn-close-white { + @include btn-close-white(); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .btn-close { + @include btn-close-white(); + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_containers.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_containers.scss new file mode 100644 index 00000000..83b31381 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_containers.scss @@ -0,0 +1,41 @@ +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +@if $enable-container-classes { + // Single container class with breakpoint max-widths + .container, + // 100% wide container at all breakpoints + .container-fluid { + @include make-container(); + } + + // Responsive containers that are 100% wide until a breakpoint + @each $breakpoint, $container-max-width in $container-max-widths { + .container-#{$breakpoint} { + @extend .container-fluid; + } + + @include media-breakpoint-up($breakpoint, $grid-breakpoints) { + %responsive-container-#{$breakpoint} { + max-width: $container-max-width; + } + + // Extend each breakpoint which is smaller or equal to the current breakpoint + $extend-breakpoint: true; + + @each $name, $width in $grid-breakpoints { + @if ($extend-breakpoint) { + .container#{breakpoint-infix($name, $grid-breakpoints)} { + @extend %responsive-container-#{$breakpoint}; + } + + // Once the current breakpoint is reached, stop extending + @if ($breakpoint == $name) { + $extend-breakpoint: false; + } + } + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_dropdown.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_dropdown.scss new file mode 100644 index 00000000..587ebb48 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_dropdown.scss @@ -0,0 +1,250 @@ +// The dropdown wrapper (`<div>`) +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; + + // Generate the caret automatically + @include caret(); +} + +// The dropdown menu +.dropdown-menu { + // scss-docs-start dropdown-css-vars + --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; + --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; + --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; + --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; + --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; + @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); + --#{$prefix}dropdown-color: #{$dropdown-color}; + --#{$prefix}dropdown-bg: #{$dropdown-bg}; + --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; + --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; + --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; + --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; + --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; + --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; + --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; + --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; + --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; + --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; + --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; + --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; + --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; + --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; + --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; + --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; + --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; + --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; + // scss-docs-end dropdown-css-vars + + position: absolute; + z-index: var(--#{$prefix}dropdown-zindex); + display: none; // none by default, but block on "open" of the menu + min-width: var(--#{$prefix}dropdown-min-width); + padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); + margin: 0; // Override default margin of ul + @include font-size(var(--#{$prefix}dropdown-font-size)); + color: var(--#{$prefix}dropdown-color); + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + list-style: none; + background-color: var(--#{$prefix}dropdown-bg); + background-clip: padding-box; + border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); + @include border-radius(var(--#{$prefix}dropdown-border-radius)); + @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); + + &[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--#{$prefix}dropdown-spacer); + } + + @if $dropdown-padding-y == 0 { + > .dropdown-item:first-child, + > li:first-child .dropdown-item { + @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + > .dropdown-item:last-child, + > li:last-child .dropdown-item { + @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + + } +} + +// scss-docs-start responsive-breakpoints +// We deliberately hardcode the `bs-` prefix because we check +// this custom property in JS to determine Popper's positioning + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .dropdown-menu#{$infix}-start { + --bs-position: start; + + &[data-bs-popper] { + right: auto; + left: 0; + } + } + + .dropdown-menu#{$infix}-end { + --bs-position: end; + + &[data-bs-popper] { + right: 0; + left: auto; + } + } + } +} +// scss-docs-end responsive-breakpoints + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// Just add .dropup after the standard .dropdown class and you're set. +.dropup { + .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(up); + } +} + +.dropend { + .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(end); + &::after { + vertical-align: 0; + } + } +} + +.dropstart { + .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(start); + &::before { + vertical-align: 0; + } + } +} + + +// Dividers (basically an `<hr>`) within the dropdown +.dropdown-divider { + height: 0; + margin: var(--#{$prefix}dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); + opacity: 1; // Revisit in v6 to de-dupe styles that conflict with <hr> element +} + +// Links, buttons, and more within the dropdown menu +// +// `<button>`-specific styles are denoted with `// For <button>s` +.dropdown-item { + display: block; + width: 100%; // For `<button>`s + padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x); + clear: both; + font-weight: $font-weight-normal; + color: var(--#{$prefix}dropdown-link-color); + text-align: inherit; // For `<button>`s + text-decoration: if($link-decoration == none, null, none); + white-space: nowrap; // prevent links from randomly breaking onto new lines + background-color: transparent; // For `<button>`s + border: 0; // For `<button>`s + @include border-radius(var(--#{$prefix}dropdown-item-border-radius, 0)); + + &:hover, + &:focus { + color: var(--#{$prefix}dropdown-link-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + @include gradient-bg(var(--#{$prefix}dropdown-link-hover-bg)); + } + + &.active, + &:active { + color: var(--#{$prefix}dropdown-link-active-color); + text-decoration: none; + @include gradient-bg(var(--#{$prefix}dropdown-link-active-bg)); + } + + &.disabled, + &:disabled { + color: var(--#{$prefix}dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; + // Remove CSS gradients if they're enabled + background-image: if($enable-gradients, none, null); + } +} + +.dropdown-menu.show { + display: block; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: var(--#{$prefix}dropdown-header-padding-y) var(--#{$prefix}dropdown-header-padding-x); + margin-bottom: 0; // for use with heading elements + @include font-size($font-size-sm); + color: var(--#{$prefix}dropdown-header-color); + white-space: nowrap; // as with > li > a +} + +// Dropdown text +.dropdown-item-text { + display: block; + padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x); + color: var(--#{$prefix}dropdown-link-color); +} + +// Dark dropdowns +.dropdown-menu-dark { + // scss-docs-start dropdown-dark-css-vars + --#{$prefix}dropdown-color: #{$dropdown-dark-color}; + --#{$prefix}dropdown-bg: #{$dropdown-dark-bg}; + --#{$prefix}dropdown-border-color: #{$dropdown-dark-border-color}; + --#{$prefix}dropdown-box-shadow: #{$dropdown-dark-box-shadow}; + --#{$prefix}dropdown-link-color: #{$dropdown-dark-link-color}; + --#{$prefix}dropdown-link-hover-color: #{$dropdown-dark-link-hover-color}; + --#{$prefix}dropdown-divider-bg: #{$dropdown-dark-divider-bg}; + --#{$prefix}dropdown-link-hover-bg: #{$dropdown-dark-link-hover-bg}; + --#{$prefix}dropdown-link-active-color: #{$dropdown-dark-link-active-color}; + --#{$prefix}dropdown-link-active-bg: #{$dropdown-dark-link-active-bg}; + --#{$prefix}dropdown-link-disabled-color: #{$dropdown-dark-link-disabled-color}; + --#{$prefix}dropdown-header-color: #{$dropdown-dark-header-color}; + // scss-docs-end dropdown-dark-css-vars +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_forms.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_forms.scss new file mode 100644 index 00000000..7b17d849 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_forms.scss @@ -0,0 +1,9 @@ +@import "forms/labels"; +@import "forms/form-text"; +@import "forms/form-control"; +@import "forms/form-select"; +@import "forms/form-check"; +@import "forms/form-range"; +@import "forms/floating-labels"; +@import "forms/input-group"; +@import "forms/validation"; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_functions.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_functions.scss new file mode 100644 index 00000000..90296586 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_functions.scss @@ -0,0 +1,302 @@ +// Bootstrap functions +// +// Utility mixins and functions for evaluating source code across our variables, maps, and mixins. + +// Ascending +// Used to evaluate Sass maps like our grid breakpoints. +@mixin _assert-ascending($map, $map-name) { + $prev-key: null; + $prev-num: null; + @each $key, $num in $map { + @if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" { + // Do nothing + } @else if not comparable($prev-num, $num) { + @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } @else if $prev-num >= $num { + @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } + $prev-key: $key; + $prev-num: $num; + } +} + +// Starts at zero +// Used to ensure the min-width of the lowest breakpoint starts at 0. +@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") { + @if length($map) > 0 { + $values: map-values($map); + $first-value: nth($values, 1); + @if $first-value != 0 { + @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}."; + } + } +} + +// Colors +@function to-rgb($value) { + @return red($value), green($value), blue($value); +} + +// stylelint-disable scss/dollar-variable-pattern +@function rgba-css-var($identifier, $target) { + @if $identifier == "body" and $target == "bg" { + @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity)); + } @if $identifier == "body" and $target == "text" { + @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity)); + } @else { + @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity)); + } +} + +@function map-loop($map, $func, $args...) { + $_map: (); + + @each $key, $value in $map { + // allow to pass the $key and $value of the map as an function argument + $_args: (); + @each $arg in $args { + $_args: append($_args, if($arg == "$key", $key, if($arg == "$value", $value, $arg))); + } + + $_map: map-merge($_map, ($key: call(get-function($func), $_args...))); + } + + @return $_map; +} +// stylelint-enable scss/dollar-variable-pattern + +@function varify($list) { + $result: null; + @each $entry in $list { + $result: append($result, var(--#{$prefix}#{$entry}), space); + } + @return $result; +} + +// Internal Bootstrap function to turn maps into its negative variant. +// It prefixes the keys with `n` and makes the value negative. +@function negativify-map($map) { + $result: (); + @each $key, $value in $map { + @if $key != 0 { + $result: map-merge($result, ("n" + $key: (-$value))); + } + } + @return $result; +} + +// Get multiple keys from a sass map +@function map-get-multiple($map, $values) { + $result: (); + @each $key, $value in $map { + @if (index($values, $key) != null) { + $result: map-merge($result, ($key: $value)); + } + } + @return $result; +} + +// Merge multiple maps +@function map-merge-multiple($maps...) { + $merged-maps: (); + + @each $map in $maps { + $merged-maps: map-merge($merged-maps, $map); + } + @return $merged-maps; +} + +// Replace `$search` with `$replace` in `$string` +// Used on our SVG icon backgrounds for custom forms. +// +// @author Kitty Giraudel +// @param {String} $string - Initial string +// @param {String} $search - Substring to replace +// @param {String} $replace ('') - New value +// @return {String} - Updated string +@function str-replace($string, $search, $replace: "") { + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); + } + + @return $string; +} + +// See https://codepen.io/kevinweber/pen/dXWoRw +// +// Requires the use of quotes around data URIs. + +@function escape-svg($string) { + @if str-index($string, "data:image/svg+xml") { + @each $char, $encoded in $escaped-characters { + // Do not escape the url brackets + @if str-index($string, "url(") == 1 { + $string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}"); + } @else { + $string: str-replace($string, $char, $encoded); + } + } + } + + @return $string; +} + +// Color contrast +// See https://github.com/twbs/bootstrap/pull/30168 + +// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255) +// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern +$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1; + +@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) { + $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black; + $max-ratio: 0; + $max-ratio-color: null; + + @each $color in $foregrounds { + $contrast-ratio: contrast-ratio($background, $color); + @if $contrast-ratio > $min-contrast-ratio { + @return $color; + } @else if $contrast-ratio > $max-ratio { + $max-ratio: $contrast-ratio; + $max-ratio-color: $color; + } + } + + @warn "Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}..."; + + @return $max-ratio-color; +} + +@function contrast-ratio($background, $foreground: $color-contrast-light) { + $l1: luminance($background); + $l2: luminance(opaque($background, $foreground)); + + @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05)); +} + +// Return WCAG2.1 relative luminance +// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance +// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio +@function luminance($color) { + $rgb: ( + "r": red($color), + "g": green($color), + "b": blue($color) + ); + + @each $name, $value in $rgb { + $value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1)); + $rgb: map-merge($rgb, ($name: $value)); + } + + @return (map-get($rgb, "r") * .2126) + (map-get($rgb, "g") * .7152) + (map-get($rgb, "b") * .0722); +} + +// Return opaque color +// opaque(#fff, rgba(0, 0, 0, .5)) => #808080 +@function opaque($background, $foreground) { + @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%); +} + +// scss-docs-start color-functions +// Tint a color: mix a color with white +@function tint-color($color, $weight) { + @return mix(white, $color, $weight); +} + +// Shade a color: mix a color with black +@function shade-color($color, $weight) { + @return mix(black, $color, $weight); +} + +// Shade the color if the weight is positive, else tint it +@function shift-color($color, $weight) { + @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight)); +} +// scss-docs-end color-functions + +// Return valid calc +@function add($value1, $value2, $return-calc: true) { + @if $value1 == null { + @return $value2; + } + + @if $value2 == null { + @return $value1; + } + + @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) { + @return $value1 + $value2; + } + + @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2); +} + +@function subtract($value1, $value2, $return-calc: true) { + @if $value1 == null and $value2 == null { + @return null; + } + + @if $value1 == null { + @return -$value2; + } + + @if $value2 == null { + @return $value1; + } + + @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) { + @return $value1 - $value2; + } + + @if type-of($value2) != number { + $value2: unquote("(") + $value2 + unquote(")"); + } + + @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2); +} + +@function divide($dividend, $divisor, $precision: 10) { + $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1); + $dividend: abs($dividend); + $divisor: abs($divisor); + @if $dividend == 0 { + @return 0; + } + @if $divisor == 0 { + @error "Cannot divide by 0"; + } + $remainder: $dividend; + $result: 0; + $factor: 10; + @while ($remainder > 0 and $precision >= 0) { + $quotient: 0; + @while ($remainder >= $divisor) { + $remainder: $remainder - $divisor; + $quotient: $quotient + 1; + } + $result: $result * 10 + $quotient; + $factor: $factor * .1; + $remainder: $remainder * 10; + $precision: $precision - 1; + @if ($precision < 0 and $remainder >= $divisor * 5) { + $result: $result + 1; + } + } + $result: $result * $factor * $sign; + $dividend-unit: unit($dividend); + $divisor-unit: unit($divisor); + $unit-map: ( + "px": 1px, + "rem": 1rem, + "em": 1em, + "%": 1% + ); + @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) { + $result: $result * map-get($unit-map, $dividend-unit); + } + @return $result; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_grid.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_grid.scss new file mode 100644 index 00000000..048f8009 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_grid.scss @@ -0,0 +1,39 @@ +// Row +// +// Rows contain your columns. + +:root { + @each $name, $value in $grid-breakpoints { + --#{$prefix}breakpoint-#{$name}: #{$value}; + } +} + +@if $enable-grid-classes { + .row { + @include make-row(); + + > * { + @include make-col-ready(); + } + } +} + +@if $enable-cssgrid { + .grid { + display: grid; + grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr); + grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr); + gap: var(--#{$prefix}gap, #{$grid-gutter-width}); + + @include make-cssgrid(); + } +} + + +// Columns +// +// Common styles for small and large grid columns + +@if $enable-grid-classes { + @include make-grid-columns(); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_helpers.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_helpers.scss new file mode 100644 index 00000000..13f2752c --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_helpers.scss @@ -0,0 +1,12 @@ +@import "helpers/clearfix"; +@import "helpers/color-bg"; +@import "helpers/colored-links"; +@import "helpers/focus-ring"; +@import "helpers/icon-link"; +@import "helpers/ratio"; +@import "helpers/position"; +@import "helpers/stacks"; +@import "helpers/visually-hidden"; +@import "helpers/stretched-link"; +@import "helpers/text-truncation"; +@import "helpers/vr"; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_images.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_images.scss new file mode 100644 index 00000000..3d6a1014 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_images.scss @@ -0,0 +1,42 @@ +// Responsive images (ensure images don't scale beyond their parents) +// +// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s. +// We previously tried the "images are responsive by default" approach in Bootstrap v2, +// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps) +// which weren't expecting the images within themselves to be involuntarily resized. +// See also https://github.com/twbs/bootstrap/issues/18178 +.img-fluid { + @include img-fluid(); +} + + +// Image thumbnails +.img-thumbnail { + padding: $thumbnail-padding; + background-color: $thumbnail-bg; + border: $thumbnail-border-width solid $thumbnail-border-color; + @include border-radius($thumbnail-border-radius); + @include box-shadow($thumbnail-box-shadow); + + // Keep them at most 100% wide + @include img-fluid(); +} + +// +// Figures +// + +.figure { + // Ensures the caption's text aligns with the image. + display: inline-block; +} + +.figure-img { + margin-bottom: $spacer * .5; + line-height: 1; +} + +.figure-caption { + @include font-size($figure-caption-font-size); + color: $figure-caption-color; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_list-group.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_list-group.scss new file mode 100644 index 00000000..455531ee --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_list-group.scss @@ -0,0 +1,197 @@ +// Base class +// +// Easily usable on <ul>, <ol>, or <div>. + +.list-group { + // scss-docs-start list-group-css-vars + --#{$prefix}list-group-color: #{$list-group-color}; + --#{$prefix}list-group-bg: #{$list-group-bg}; + --#{$prefix}list-group-border-color: #{$list-group-border-color}; + --#{$prefix}list-group-border-width: #{$list-group-border-width}; + --#{$prefix}list-group-border-radius: #{$list-group-border-radius}; + --#{$prefix}list-group-item-padding-x: #{$list-group-item-padding-x}; + --#{$prefix}list-group-item-padding-y: #{$list-group-item-padding-y}; + --#{$prefix}list-group-action-color: #{$list-group-action-color}; + --#{$prefix}list-group-action-hover-color: #{$list-group-action-hover-color}; + --#{$prefix}list-group-action-hover-bg: #{$list-group-hover-bg}; + --#{$prefix}list-group-action-active-color: #{$list-group-action-active-color}; + --#{$prefix}list-group-action-active-bg: #{$list-group-action-active-bg}; + --#{$prefix}list-group-disabled-color: #{$list-group-disabled-color}; + --#{$prefix}list-group-disabled-bg: #{$list-group-disabled-bg}; + --#{$prefix}list-group-active-color: #{$list-group-active-color}; + --#{$prefix}list-group-active-bg: #{$list-group-active-bg}; + --#{$prefix}list-group-active-border-color: #{$list-group-active-border-color}; + // scss-docs-end list-group-css-vars + + display: flex; + flex-direction: column; + + // No need to set list-style: none; since .list-group-item is block level + padding-left: 0; // reset padding because ul and ol + margin-bottom: 0; + @include border-radius(var(--#{$prefix}list-group-border-radius)); +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; + + > .list-group-item::before { + // Increments only this instance of the section counter + content: counters(section, ".") ". "; + counter-increment: section; + } +} + +// Interactive list items +// +// Use anchor or button elements instead of `li`s or `div`s to create interactive +// list items. Includes an extra `.active` modifier class for selected items. + +.list-group-item-action { + width: 100%; // For `<button>`s (anchors become 100% by default though) + color: var(--#{$prefix}list-group-action-color); + text-align: inherit; // For `<button>`s (anchors inherit) + + // Hover state + &:hover, + &:focus { + z-index: 1; // Place hover/focus items above their siblings for proper border styling + color: var(--#{$prefix}list-group-action-hover-color); + text-decoration: none; + background-color: var(--#{$prefix}list-group-action-hover-bg); + } + + &:active { + color: var(--#{$prefix}list-group-action-active-color); + background-color: var(--#{$prefix}list-group-action-active-bg); + } +} + +// Individual list items +// +// Use on `li`s or `div`s within the `.list-group` parent. + +.list-group-item { + position: relative; + display: block; + padding: var(--#{$prefix}list-group-item-padding-y) var(--#{$prefix}list-group-item-padding-x); + color: var(--#{$prefix}list-group-color); + text-decoration: if($link-decoration == none, null, none); + background-color: var(--#{$prefix}list-group-bg); + border: var(--#{$prefix}list-group-border-width) solid var(--#{$prefix}list-group-border-color); + + &:first-child { + @include border-top-radius(inherit); + } + + &:last-child { + @include border-bottom-radius(inherit); + } + + &.disabled, + &:disabled { + color: var(--#{$prefix}list-group-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}list-group-disabled-bg); + } + + // Include both here for `<a>`s and `<button>`s + &.active { + z-index: 2; // Place active items above their siblings for proper border styling + color: var(--#{$prefix}list-group-active-color); + background-color: var(--#{$prefix}list-group-active-bg); + border-color: var(--#{$prefix}list-group-active-border-color); + } + + // stylelint-disable-next-line scss/selector-no-redundant-nesting-selector + & + .list-group-item { + border-top-width: 0; + + &.active { + margin-top: calc(-1 * var(--#{$prefix}list-group-border-width)); // stylelint-disable-line function-disallowed-list + border-top-width: var(--#{$prefix}list-group-border-width); + } + } +} + +// Horizontal +// +// Change the layout of list group items from vertical (default) to horizontal. + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .list-group-horizontal#{$infix} { + flex-direction: row; + + > .list-group-item { + &:first-child:not(:last-child) { + @include border-bottom-start-radius(var(--#{$prefix}list-group-border-radius)); + @include border-top-end-radius(0); + } + + &:last-child:not(:first-child) { + @include border-top-end-radius(var(--#{$prefix}list-group-border-radius)); + @include border-bottom-start-radius(0); + } + + &.active { + margin-top: 0; + } + + + .list-group-item { + border-top-width: var(--#{$prefix}list-group-border-width); + border-left-width: 0; + + &.active { + margin-left: calc(-1 * var(--#{$prefix}list-group-border-width)); // stylelint-disable-line function-disallowed-list + border-left-width: var(--#{$prefix}list-group-border-width); + } + } + } + } + } +} + + +// Flush list items +// +// Remove borders and border-radius to keep list group items edge-to-edge. Most +// useful within other components (e.g., cards). + +.list-group-flush { + @include border-radius(0); + + > .list-group-item { + border-width: 0 0 var(--#{$prefix}list-group-border-width); + + &:last-child { + border-bottom-width: 0; + } + } +} + + +// scss-docs-start list-group-modifiers +// List group contextual variants +// +// Add modifier classes to change text and background color on individual items. +// Organizationally, this must come after the `:hover` states. + +@each $state in map-keys($theme-colors) { + .list-group-item-#{$state} { + --#{$prefix}list-group-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}list-group-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}list-group-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}list-group-action-hover-color: var(--#{$prefix}emphasis-color); + --#{$prefix}list-group-action-hover-bg: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}list-group-action-active-color: var(--#{$prefix}emphasis-color); + --#{$prefix}list-group-action-active-bg: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}list-group-active-color: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}list-group-active-bg: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}list-group-active-border-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end list-group-modifiers diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_maps.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_maps.scss new file mode 100644 index 00000000..68ee421c --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_maps.scss @@ -0,0 +1,174 @@ +// Re-assigned maps +// +// Placed here so that others can override the default Sass maps and see automatic updates to utilities and more. + +// scss-docs-start theme-colors-rgb +$theme-colors-rgb: map-loop($theme-colors, to-rgb, "$value") !default; +// scss-docs-end theme-colors-rgb + +// scss-docs-start theme-text-map +$theme-colors-text: ( + "primary": $primary-text-emphasis, + "secondary": $secondary-text-emphasis, + "success": $success-text-emphasis, + "info": $info-text-emphasis, + "warning": $warning-text-emphasis, + "danger": $danger-text-emphasis, + "light": $light-text-emphasis, + "dark": $dark-text-emphasis, +) !default; +// scss-docs-end theme-text-map + +// scss-docs-start theme-bg-subtle-map +$theme-colors-bg-subtle: ( + "primary": $primary-bg-subtle, + "secondary": $secondary-bg-subtle, + "success": $success-bg-subtle, + "info": $info-bg-subtle, + "warning": $warning-bg-subtle, + "danger": $danger-bg-subtle, + "light": $light-bg-subtle, + "dark": $dark-bg-subtle, +) !default; +// scss-docs-end theme-bg-subtle-map + +// scss-docs-start theme-border-subtle-map +$theme-colors-border-subtle: ( + "primary": $primary-border-subtle, + "secondary": $secondary-border-subtle, + "success": $success-border-subtle, + "info": $info-border-subtle, + "warning": $warning-border-subtle, + "danger": $danger-border-subtle, + "light": $light-border-subtle, + "dark": $dark-border-subtle, +) !default; +// scss-docs-end theme-border-subtle-map + +$theme-colors-text-dark: null !default; +$theme-colors-bg-subtle-dark: null !default; +$theme-colors-border-subtle-dark: null !default; + +@if $enable-dark-mode { + // scss-docs-start theme-text-dark-map + $theme-colors-text-dark: ( + "primary": $primary-text-emphasis-dark, + "secondary": $secondary-text-emphasis-dark, + "success": $success-text-emphasis-dark, + "info": $info-text-emphasis-dark, + "warning": $warning-text-emphasis-dark, + "danger": $danger-text-emphasis-dark, + "light": $light-text-emphasis-dark, + "dark": $dark-text-emphasis-dark, + ) !default; + // scss-docs-end theme-text-dark-map + + // scss-docs-start theme-bg-subtle-dark-map + $theme-colors-bg-subtle-dark: ( + "primary": $primary-bg-subtle-dark, + "secondary": $secondary-bg-subtle-dark, + "success": $success-bg-subtle-dark, + "info": $info-bg-subtle-dark, + "warning": $warning-bg-subtle-dark, + "danger": $danger-bg-subtle-dark, + "light": $light-bg-subtle-dark, + "dark": $dark-bg-subtle-dark, + ) !default; + // scss-docs-end theme-bg-subtle-dark-map + + // scss-docs-start theme-border-subtle-dark-map + $theme-colors-border-subtle-dark: ( + "primary": $primary-border-subtle-dark, + "secondary": $secondary-border-subtle-dark, + "success": $success-border-subtle-dark, + "info": $info-border-subtle-dark, + "warning": $warning-border-subtle-dark, + "danger": $danger-border-subtle-dark, + "light": $light-border-subtle-dark, + "dark": $dark-border-subtle-dark, + ) !default; + // scss-docs-end theme-border-subtle-dark-map +} + +// Utilities maps +// +// Extends the default `$theme-colors` maps to help create our utilities. + +// Come v6, we'll de-dupe these variables. Until then, for backward compatibility, we keep them to reassign. +// scss-docs-start utilities-colors +$utilities-colors: $theme-colors-rgb !default; +// scss-docs-end utilities-colors + +// scss-docs-start utilities-text-colors +$utilities-text: map-merge( + $utilities-colors, + ( + "black": to-rgb($black), + "white": to-rgb($white), + "body": to-rgb($body-color) + ) +) !default; +$utilities-text-colors: map-loop($utilities-text, rgba-css-var, "$key", "text") !default; + +$utilities-text-emphasis-colors: ( + "primary-emphasis": var(--#{$prefix}primary-text-emphasis), + "secondary-emphasis": var(--#{$prefix}secondary-text-emphasis), + "success-emphasis": var(--#{$prefix}success-text-emphasis), + "info-emphasis": var(--#{$prefix}info-text-emphasis), + "warning-emphasis": var(--#{$prefix}warning-text-emphasis), + "danger-emphasis": var(--#{$prefix}danger-text-emphasis), + "light-emphasis": var(--#{$prefix}light-text-emphasis), + "dark-emphasis": var(--#{$prefix}dark-text-emphasis) +) !default; +// scss-docs-end utilities-text-colors + +// scss-docs-start utilities-bg-colors +$utilities-bg: map-merge( + $utilities-colors, + ( + "black": to-rgb($black), + "white": to-rgb($white), + "body": to-rgb($body-bg) + ) +) !default; +$utilities-bg-colors: map-loop($utilities-bg, rgba-css-var, "$key", "bg") !default; + +$utilities-bg-subtle: ( + "primary-subtle": var(--#{$prefix}primary-bg-subtle), + "secondary-subtle": var(--#{$prefix}secondary-bg-subtle), + "success-subtle": var(--#{$prefix}success-bg-subtle), + "info-subtle": var(--#{$prefix}info-bg-subtle), + "warning-subtle": var(--#{$prefix}warning-bg-subtle), + "danger-subtle": var(--#{$prefix}danger-bg-subtle), + "light-subtle": var(--#{$prefix}light-bg-subtle), + "dark-subtle": var(--#{$prefix}dark-bg-subtle) +) !default; +// scss-docs-end utilities-bg-colors + +// scss-docs-start utilities-border-colors +$utilities-border: map-merge( + $utilities-colors, + ( + "black": to-rgb($black), + "white": to-rgb($white) + ) +) !default; +$utilities-border-colors: map-loop($utilities-border, rgba-css-var, "$key", "border") !default; + +$utilities-border-subtle: ( + "primary-subtle": var(--#{$prefix}primary-border-subtle), + "secondary-subtle": var(--#{$prefix}secondary-border-subtle), + "success-subtle": var(--#{$prefix}success-border-subtle), + "info-subtle": var(--#{$prefix}info-border-subtle), + "warning-subtle": var(--#{$prefix}warning-border-subtle), + "danger-subtle": var(--#{$prefix}danger-border-subtle), + "light-subtle": var(--#{$prefix}light-border-subtle), + "dark-subtle": var(--#{$prefix}dark-border-subtle) +) !default; +// scss-docs-end utilities-border-colors + +$utilities-links-underline: map-loop($utilities-colors, rgba-css-var, "$key", "link-underline") !default; + +$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default; + +$gutters: $spacers !default; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_mixins.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_mixins.scss new file mode 100644 index 00000000..e1e130b1 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_mixins.scss @@ -0,0 +1,42 @@ +// Toggles +// +// Used in conjunction with global variables to enable certain theme features. + +// Vendor +@import "vendor/rfs"; + +// Deprecate +@import "mixins/deprecate"; + +// Helpers +@import "mixins/breakpoints"; +@import "mixins/color-mode"; +@import "mixins/color-scheme"; +@import "mixins/image"; +@import "mixins/resize"; +@import "mixins/visually-hidden"; +@import "mixins/reset-text"; +@import "mixins/text-truncate"; + +// Utilities +@import "mixins/utilities"; + +// Components +@import "mixins/backdrop"; +@import "mixins/buttons"; +@import "mixins/caret"; +@import "mixins/pagination"; +@import "mixins/lists"; +@import "mixins/forms"; +@import "mixins/table-variants"; + +// Skins +@import "mixins/border-radius"; +@import "mixins/box-shadow"; +@import "mixins/gradients"; +@import "mixins/transition"; + +// Layout +@import "mixins/clearfix"; +@import "mixins/container"; +@import "mixins/grid"; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_modal.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_modal.scss new file mode 100644 index 00000000..494db94e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_modal.scss @@ -0,0 +1,236 @@ +// stylelint-disable function-disallowed-list + +// .modal-open - body class for killing the scroll +// .modal - container to scroll within +// .modal-dialog - positioning shell for the actual modal +// .modal-content - actual modal w/ bg and corners and stuff + + +// Container that the modal scrolls within +.modal { + // scss-docs-start modal-css-vars + --#{$prefix}modal-zindex: #{$zindex-modal}; + --#{$prefix}modal-width: #{$modal-md}; + --#{$prefix}modal-padding: #{$modal-inner-padding}; + --#{$prefix}modal-margin: #{$modal-dialog-margin}; + --#{$prefix}modal-color: #{$modal-content-color}; + --#{$prefix}modal-bg: #{$modal-content-bg}; + --#{$prefix}modal-border-color: #{$modal-content-border-color}; + --#{$prefix}modal-border-width: #{$modal-content-border-width}; + --#{$prefix}modal-border-radius: #{$modal-content-border-radius}; + --#{$prefix}modal-box-shadow: #{$modal-content-box-shadow-xs}; + --#{$prefix}modal-inner-border-radius: #{$modal-content-inner-border-radius}; + --#{$prefix}modal-header-padding-x: #{$modal-header-padding-x}; + --#{$prefix}modal-header-padding-y: #{$modal-header-padding-y}; + --#{$prefix}modal-header-padding: #{$modal-header-padding}; // Todo in v6: Split this padding into x and y + --#{$prefix}modal-header-border-color: #{$modal-header-border-color}; + --#{$prefix}modal-header-border-width: #{$modal-header-border-width}; + --#{$prefix}modal-title-line-height: #{$modal-title-line-height}; + --#{$prefix}modal-footer-gap: #{$modal-footer-margin-between}; + --#{$prefix}modal-footer-bg: #{$modal-footer-bg}; + --#{$prefix}modal-footer-border-color: #{$modal-footer-border-color}; + --#{$prefix}modal-footer-border-width: #{$modal-footer-border-width}; + // scss-docs-end modal-css-vars + + position: fixed; + top: 0; + left: 0; + z-index: var(--#{$prefix}modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + // Prevent Chrome on Windows from adding a focus outline. For details, see + // https://github.com/twbs/bootstrap/pull/10951. + outline: 0; + // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a + // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342 + // See also https://github.com/twbs/bootstrap/issues/17695 +} + +// Shell div to position the modal with bottom padding +.modal-dialog { + position: relative; + width: auto; + margin: var(--#{$prefix}modal-margin); + // allow clicks to pass through for custom click handling to close modal + pointer-events: none; + + // When fading in the modal, animate it to slide down + .modal.fade & { + @include transition($modal-transition); + transform: $modal-fade-transform; + } + .modal.show & { + transform: $modal-show-transform; + } + + // When trying to close, animate focus to scale + .modal.modal-static & { + transform: $modal-scale-transform; + } +} + +.modal-dialog-scrollable { + height: calc(100% - var(--#{$prefix}modal-margin) * 2); + + .modal-content { + max-height: 100%; + overflow: hidden; + } + + .modal-body { + overflow-y: auto; + } +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--#{$prefix}modal-margin) * 2); +} + +// Actual modal +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog` + // counteract the pointer-events: none; in the .modal-dialog + color: var(--#{$prefix}modal-color); + pointer-events: auto; + background-color: var(--#{$prefix}modal-bg); + background-clip: padding-box; + border: var(--#{$prefix}modal-border-width) solid var(--#{$prefix}modal-border-color); + @include border-radius(var(--#{$prefix}modal-border-radius)); + @include box-shadow(var(--#{$prefix}modal-box-shadow)); + // Remove focus outline from opened modal + outline: 0; +} + +// Modal background +.modal-backdrop { + // scss-docs-start modal-backdrop-css-vars + --#{$prefix}backdrop-zindex: #{$zindex-modal-backdrop}; + --#{$prefix}backdrop-bg: #{$modal-backdrop-bg}; + --#{$prefix}backdrop-opacity: #{$modal-backdrop-opacity}; + // scss-docs-end modal-backdrop-css-vars + + @include overlay-backdrop(var(--#{$prefix}backdrop-zindex), var(--#{$prefix}backdrop-bg), var(--#{$prefix}backdrop-opacity)); +} + +// Modal header +// Top section of the modal w/ title and dismiss +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + padding: var(--#{$prefix}modal-header-padding); + border-bottom: var(--#{$prefix}modal-header-border-width) solid var(--#{$prefix}modal-header-border-color); + @include border-top-radius(var(--#{$prefix}modal-inner-border-radius)); + + .btn-close { + padding: calc(var(--#{$prefix}modal-header-padding-y) * .5) calc(var(--#{$prefix}modal-header-padding-x) * .5); + margin: calc(-.5 * var(--#{$prefix}modal-header-padding-y)) calc(-.5 * var(--#{$prefix}modal-header-padding-x)) calc(-.5 * var(--#{$prefix}modal-header-padding-y)) auto; + } +} + +// Title text within header +.modal-title { + margin-bottom: 0; + line-height: var(--#{$prefix}modal-title-line-height); +} + +// Modal body +// Where all modal content resides (sibling of .modal-header and .modal-footer) +.modal-body { + position: relative; + // Enable `flex-grow: 1` so that the body take up as much space as possible + // when there should be a fixed height on `.modal-dialog`. + flex: 1 1 auto; + padding: var(--#{$prefix}modal-padding); +} + +// Footer (for actions) +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; // vertically center + justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items + padding: calc(var(--#{$prefix}modal-padding) - var(--#{$prefix}modal-footer-gap) * .5); + background-color: var(--#{$prefix}modal-footer-bg); + border-top: var(--#{$prefix}modal-footer-border-width) solid var(--#{$prefix}modal-footer-border-color); + @include border-bottom-radius(var(--#{$prefix}modal-inner-border-radius)); + + // Place margin between footer elements + // This solution is far from ideal because of the universal selector usage, + // but is needed to fix https://github.com/twbs/bootstrap/issues/24800 + > * { + margin: calc(var(--#{$prefix}modal-footer-gap) * .5); // Todo in v6: replace with gap on parent class + } +} + +// Scale up the modal +@include media-breakpoint-up(sm) { + .modal { + --#{$prefix}modal-margin: #{$modal-dialog-margin-y-sm-up}; + --#{$prefix}modal-box-shadow: #{$modal-content-box-shadow-sm-up}; + } + + // Automatically set modal's width for larger viewports + .modal-dialog { + max-width: var(--#{$prefix}modal-width); + margin-right: auto; + margin-left: auto; + } + + .modal-sm { + --#{$prefix}modal-width: #{$modal-sm}; + } +} + +@include media-breakpoint-up(lg) { + .modal-lg, + .modal-xl { + --#{$prefix}modal-width: #{$modal-lg}; + } +} + +@include media-breakpoint-up(xl) { + .modal-xl { + --#{$prefix}modal-width: #{$modal-xl}; + } +} + +// scss-docs-start modal-fullscreen-loop +@each $breakpoint in map-keys($grid-breakpoints) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + $postfix: if($infix != "", $infix + "-down", ""); + + @include media-breakpoint-down($breakpoint) { + .modal-fullscreen#{$postfix} { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + + .modal-content { + height: 100%; + border: 0; + @include border-radius(0); + } + + .modal-header, + .modal-footer { + @include border-radius(0); + } + + .modal-body { + overflow-y: auto; + } + } + } +} +// scss-docs-end modal-fullscreen-loop diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_nav.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_nav.scss new file mode 100644 index 00000000..ff073d36 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_nav.scss @@ -0,0 +1,197 @@ +// Base class +// +// Kickstart any navigation component with a set of style resets. Works with +// `<nav>`s, `<ul>`s or `<ol>`s. + +.nav { + // scss-docs-start nav-css-vars + --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x}; + --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y}; + @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size); + --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight}; + --#{$prefix}nav-link-color: #{$nav-link-color}; + --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color}; + --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color}; + // scss-docs-end nav-css-vars + + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x); + @include font-size(var(--#{$prefix}nav-link-font-size)); + font-weight: var(--#{$prefix}nav-link-font-weight); + color: var(--#{$prefix}nav-link-color); + text-decoration: if($link-decoration == none, null, none); + background: none; + border: 0; + @include transition($nav-link-transition); + + &:hover, + &:focus { + color: var(--#{$prefix}nav-link-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + } + + &:focus-visible { + outline: 0; + box-shadow: $nav-link-focus-box-shadow; + } + + // Disabled state lightens text + &.disabled, + &:disabled { + color: var(--#{$prefix}nav-link-disabled-color); + pointer-events: none; + cursor: default; + } +} + +// +// Tabs +// + +.nav-tabs { + // scss-docs-start nav-tabs-css-vars + --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width}; + --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color}; + --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius}; + --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color}; + --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color}; + --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg}; + --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color}; + // scss-docs-end nav-tabs-css-vars + + border-bottom: var(--#{$prefix}nav-tabs-border-width) solid var(--#{$prefix}nav-tabs-border-color); + + .nav-link { + margin-bottom: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list + border: var(--#{$prefix}nav-tabs-border-width) solid transparent; + @include border-top-radius(var(--#{$prefix}nav-tabs-border-radius)); + + &:hover, + &:focus { + // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link + isolation: isolate; + border-color: var(--#{$prefix}nav-tabs-link-hover-border-color); + } + } + + .nav-link.active, + .nav-item.show .nav-link { + color: var(--#{$prefix}nav-tabs-link-active-color); + background-color: var(--#{$prefix}nav-tabs-link-active-bg); + border-color: var(--#{$prefix}nav-tabs-link-active-border-color); + } + + .dropdown-menu { + // Make dropdown border overlap tab border + margin-top: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list + // Remove the top rounded corners here since there is a hard edge above the menu + @include border-top-radius(0); + } +} + + +// +// Pills +// + +.nav-pills { + // scss-docs-start nav-pills-css-vars + --#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius}; + --#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color}; + --#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg}; + // scss-docs-end nav-pills-css-vars + + .nav-link { + @include border-radius(var(--#{$prefix}nav-pills-border-radius)); + } + + .nav-link.active, + .show > .nav-link { + color: var(--#{$prefix}nav-pills-link-active-color); + @include gradient-bg(var(--#{$prefix}nav-pills-link-active-bg)); + } +} + + +// +// Underline +// + +.nav-underline { + // scss-docs-start nav-underline-css-vars + --#{$prefix}nav-underline-gap: #{$nav-underline-gap}; + --#{$prefix}nav-underline-border-width: #{$nav-underline-border-width}; + --#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color}; + // scss-docs-end nav-underline-css-vars + + gap: var(--#{$prefix}nav-underline-gap); + + .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--#{$prefix}nav-underline-border-width) solid transparent; + + &:hover, + &:focus { + border-bottom-color: currentcolor; + } + } + + .nav-link.active, + .show > .nav-link { + font-weight: $font-weight-bold; + color: var(--#{$prefix}nav-underline-link-active-color); + border-bottom-color: currentcolor; + } +} + + +// +// Justified variants +// + +.nav-fill { + > .nav-link, + .nav-item { + flex: 1 1 auto; + text-align: center; + } +} + +.nav-justified { + > .nav-link, + .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; + } +} + +.nav-fill, +.nav-justified { + .nav-item .nav-link { + width: 100%; // Make sure button will grow + } +} + + +// Tabbable tabs +// +// Hide tabbable panes to start, show them when `.active` + +.tab-content { + > .tab-pane { + display: none; + } + > .active { + display: block; + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_navbar.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_navbar.scss new file mode 100644 index 00000000..71619382 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_navbar.scss @@ -0,0 +1,289 @@ +// Navbar +// +// Provide a static navbar from which we expand to create full-width, fixed, and +// other navbar variations. + +.navbar { + // scss-docs-start navbar-css-vars + --#{$prefix}navbar-padding-x: #{if($navbar-padding-x == null, 0, $navbar-padding-x)}; + --#{$prefix}navbar-padding-y: #{$navbar-padding-y}; + --#{$prefix}navbar-color: #{$navbar-light-color}; + --#{$prefix}navbar-hover-color: #{$navbar-light-hover-color}; + --#{$prefix}navbar-disabled-color: #{$navbar-light-disabled-color}; + --#{$prefix}navbar-active-color: #{$navbar-light-active-color}; + --#{$prefix}navbar-brand-padding-y: #{$navbar-brand-padding-y}; + --#{$prefix}navbar-brand-margin-end: #{$navbar-brand-margin-end}; + --#{$prefix}navbar-brand-font-size: #{$navbar-brand-font-size}; + --#{$prefix}navbar-brand-color: #{$navbar-light-brand-color}; + --#{$prefix}navbar-brand-hover-color: #{$navbar-light-brand-hover-color}; + --#{$prefix}navbar-nav-link-padding-x: #{$navbar-nav-link-padding-x}; + --#{$prefix}navbar-toggler-padding-y: #{$navbar-toggler-padding-y}; + --#{$prefix}navbar-toggler-padding-x: #{$navbar-toggler-padding-x}; + --#{$prefix}navbar-toggler-font-size: #{$navbar-toggler-font-size}; + --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)}; + --#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color}; + --#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius}; + --#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width}; + --#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition}; + // scss-docs-end navbar-css-vars + + position: relative; + display: flex; + flex-wrap: wrap; // allow us to do the line break for collapsing content + align-items: center; + justify-content: space-between; // space out brand from logo + padding: var(--#{$prefix}navbar-padding-y) var(--#{$prefix}navbar-padding-x); + @include gradient-bg(); + + // Because flex properties aren't inherited, we need to redeclare these first + // few properties so that content nested within behave properly. + // The `flex-wrap` property is inherited to simplify the expanded navbars + %container-flex-properties { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; + } + + > .container, + > .container-fluid { + @extend %container-flex-properties; + } + + @each $breakpoint, $container-max-width in $container-max-widths { + > .container#{breakpoint-infix($breakpoint, $container-max-widths)} { + @extend %container-flex-properties; + } + } +} + + +// Navbar brand +// +// Used for brand, project, or site names. + +.navbar-brand { + padding-top: var(--#{$prefix}navbar-brand-padding-y); + padding-bottom: var(--#{$prefix}navbar-brand-padding-y); + margin-right: var(--#{$prefix}navbar-brand-margin-end); + @include font-size(var(--#{$prefix}navbar-brand-font-size)); + color: var(--#{$prefix}navbar-brand-color); + text-decoration: if($link-decoration == none, null, none); + white-space: nowrap; + + &:hover, + &:focus { + color: var(--#{$prefix}navbar-brand-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + } +} + + +// Navbar nav +// +// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`). + +.navbar-nav { + // scss-docs-start navbar-nav-css-vars + --#{$prefix}nav-link-padding-x: 0; + --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y}; + @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size); + --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight}; + --#{$prefix}nav-link-color: var(--#{$prefix}navbar-color); + --#{$prefix}nav-link-hover-color: var(--#{$prefix}navbar-hover-color); + --#{$prefix}nav-link-disabled-color: var(--#{$prefix}navbar-disabled-color); + // scss-docs-end navbar-nav-css-vars + + display: flex; + flex-direction: column; // cannot use `inherit` to get the `.navbar`s value + padding-left: 0; + margin-bottom: 0; + list-style: none; + + .nav-link { + &.active, + &.show { + color: var(--#{$prefix}navbar-active-color); + } + } + + .dropdown-menu { + position: static; + } +} + + +// Navbar text +// +// + +.navbar-text { + padding-top: $nav-link-padding-y; + padding-bottom: $nav-link-padding-y; + color: var(--#{$prefix}navbar-color); + + a, + a:hover, + a:focus { + color: var(--#{$prefix}navbar-active-color); + } +} + + +// Responsive navbar +// +// Custom styles for responsive collapsing and toggling of navbar contents. +// Powered by the collapse Bootstrap JavaScript plugin. + +// When collapsed, prevent the toggleable navbar contents from appearing in +// the default flexbox row orientation. Requires the use of `flex-wrap: wrap` +// on the `.navbar` parent. +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + // For always expanded or extra full navbars, ensure content aligns itself + // properly vertically. Can be easily overridden with flex utilities. + align-items: center; +} + +// Button for toggling the navbar when in its collapsed state +.navbar-toggler { + padding: var(--#{$prefix}navbar-toggler-padding-y) var(--#{$prefix}navbar-toggler-padding-x); + @include font-size(var(--#{$prefix}navbar-toggler-font-size)); + line-height: 1; + color: var(--#{$prefix}navbar-color); + background-color: transparent; // remove default button style + border: var(--#{$prefix}border-width) solid var(--#{$prefix}navbar-toggler-border-color); // remove default button style + @include border-radius(var(--#{$prefix}navbar-toggler-border-radius)); + @include transition(var(--#{$prefix}navbar-toggler-transition)); + + &:hover { + text-decoration: none; + } + + &:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width); + } +} + +// Keep as a separate element so folks can easily override it with another icon +// or image file as needed. +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--#{$prefix}navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--#{$prefix}scroll-height, 75vh); + overflow-y: auto; +} + +// scss-docs-start navbar-expand-loop +// Generate series of `.navbar-expand-*` responsive classes for configuring +// where your navbar collapses. +.navbar-expand { + @each $breakpoint in map-keys($grid-breakpoints) { + $next: breakpoint-next($breakpoint, $grid-breakpoints); + $infix: breakpoint-infix($next, $grid-breakpoints); + + // stylelint-disable-next-line scss/selector-no-union-class-name + &#{$infix} { + @include media-breakpoint-up($next) { + flex-wrap: nowrap; + justify-content: flex-start; + + .navbar-nav { + flex-direction: row; + + .dropdown-menu { + position: absolute; + } + + .nav-link { + padding-right: var(--#{$prefix}navbar-nav-link-padding-x); + padding-left: var(--#{$prefix}navbar-nav-link-padding-x); + } + } + + .navbar-nav-scroll { + overflow: visible; + } + + .navbar-collapse { + display: flex !important; // stylelint-disable-line declaration-no-important + flex-basis: auto; + } + + .navbar-toggler { + display: none; + } + + .offcanvas { + // stylelint-disable declaration-no-important + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + @include box-shadow(none); + @include transition(none); + // stylelint-enable declaration-no-important + + .offcanvas-header { + display: none; + } + + .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } + } + } + } + } +} +// scss-docs-end navbar-expand-loop + +// Navbar themes +// +// Styles for switching between navbars with light or dark background. + +.navbar-light { + @include deprecate("`.navbar-light`", "v5.2.0", "v6.0.0", true); +} + +.navbar-dark, +.navbar[data-bs-theme="dark"] { + // scss-docs-start navbar-dark-css-vars + --#{$prefix}navbar-color: #{$navbar-dark-color}; + --#{$prefix}navbar-hover-color: #{$navbar-dark-hover-color}; + --#{$prefix}navbar-disabled-color: #{$navbar-dark-disabled-color}; + --#{$prefix}navbar-active-color: #{$navbar-dark-active-color}; + --#{$prefix}navbar-brand-color: #{$navbar-dark-brand-color}; + --#{$prefix}navbar-brand-hover-color: #{$navbar-dark-brand-hover-color}; + --#{$prefix}navbar-toggler-border-color: #{$navbar-dark-toggler-border-color}; + --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)}; + // scss-docs-end navbar-dark-css-vars +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .navbar-toggler-icon { + --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)}; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_offcanvas.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_offcanvas.scss new file mode 100644 index 00000000..eb2c97ab --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_offcanvas.scss @@ -0,0 +1,143 @@ +// stylelint-disable function-disallowed-list + +%offcanvas-css-vars { + // scss-docs-start offcanvas-css-vars + --#{$prefix}offcanvas-zindex: #{$zindex-offcanvas}; + --#{$prefix}offcanvas-width: #{$offcanvas-horizontal-width}; + --#{$prefix}offcanvas-height: #{$offcanvas-vertical-height}; + --#{$prefix}offcanvas-padding-x: #{$offcanvas-padding-x}; + --#{$prefix}offcanvas-padding-y: #{$offcanvas-padding-y}; + --#{$prefix}offcanvas-color: #{$offcanvas-color}; + --#{$prefix}offcanvas-bg: #{$offcanvas-bg-color}; + --#{$prefix}offcanvas-border-width: #{$offcanvas-border-width}; + --#{$prefix}offcanvas-border-color: #{$offcanvas-border-color}; + --#{$prefix}offcanvas-box-shadow: #{$offcanvas-box-shadow}; + --#{$prefix}offcanvas-transition: #{transform $offcanvas-transition-duration ease-in-out}; + --#{$prefix}offcanvas-title-line-height: #{$offcanvas-title-line-height}; + // scss-docs-end offcanvas-css-vars +} + +@each $breakpoint in map-keys($grid-breakpoints) { + $next: breakpoint-next($breakpoint, $grid-breakpoints); + $infix: breakpoint-infix($next, $grid-breakpoints); + + .offcanvas#{$infix} { + @extend %offcanvas-css-vars; + } +} + +@each $breakpoint in map-keys($grid-breakpoints) { + $next: breakpoint-next($breakpoint, $grid-breakpoints); + $infix: breakpoint-infix($next, $grid-breakpoints); + + .offcanvas#{$infix} { + @include media-breakpoint-down($next) { + position: fixed; + bottom: 0; + z-index: var(--#{$prefix}offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--#{$prefix}offcanvas-color); + visibility: hidden; + background-color: var(--#{$prefix}offcanvas-bg); + background-clip: padding-box; + outline: 0; + @include box-shadow(var(--#{$prefix}offcanvas-box-shadow)); + @include transition(var(--#{$prefix}offcanvas-transition)); + + &.offcanvas-start { + top: 0; + left: 0; + width: var(--#{$prefix}offcanvas-width); + border-right: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color); + transform: translateX(-100%); + } + + &.offcanvas-end { + top: 0; + right: 0; + width: var(--#{$prefix}offcanvas-width); + border-left: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color); + transform: translateX(100%); + } + + &.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--#{$prefix}offcanvas-height); + max-height: 100%; + border-bottom: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color); + transform: translateY(-100%); + } + + &.offcanvas-bottom { + right: 0; + left: 0; + height: var(--#{$prefix}offcanvas-height); + max-height: 100%; + border-top: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color); + transform: translateY(100%); + } + + &.showing, + &.show:not(.hiding) { + transform: none; + } + + &.showing, + &.hiding, + &.show { + visibility: visible; + } + } + + @if not ($infix == "") { + @include media-breakpoint-up($next) { + --#{$prefix}offcanvas-height: auto; + --#{$prefix}offcanvas-border-width: 0; + background-color: transparent !important; // stylelint-disable-line declaration-no-important + + .offcanvas-header { + display: none; + } + + .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + // Reset `background-color` in case `.bg-*` classes are used in offcanvas + background-color: transparent !important; // stylelint-disable-line declaration-no-important + } + } + } + } +} + +.offcanvas-backdrop { + @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity); +} + +.offcanvas-header { + display: flex; + align-items: center; + padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x); + + .btn-close { + padding: calc(var(--#{$prefix}offcanvas-padding-y) * .5) calc(var(--#{$prefix}offcanvas-padding-x) * .5); + margin: calc(-.5 * var(--#{$prefix}offcanvas-padding-y)) calc(-.5 * var(--#{$prefix}offcanvas-padding-x)) calc(-.5 * var(--#{$prefix}offcanvas-padding-y)) auto; + } +} + +.offcanvas-title { + margin-bottom: 0; + line-height: var(--#{$prefix}offcanvas-title-line-height); +} + +.offcanvas-body { + flex-grow: 1; + padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x); + overflow-y: auto; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_pagination.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_pagination.scss new file mode 100644 index 00000000..f275a62e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_pagination.scss @@ -0,0 +1,109 @@ +.pagination { + // scss-docs-start pagination-css-vars + --#{$prefix}pagination-padding-x: #{$pagination-padding-x}; + --#{$prefix}pagination-padding-y: #{$pagination-padding-y}; + @include rfs($pagination-font-size, --#{$prefix}pagination-font-size); + --#{$prefix}pagination-color: #{$pagination-color}; + --#{$prefix}pagination-bg: #{$pagination-bg}; + --#{$prefix}pagination-border-width: #{$pagination-border-width}; + --#{$prefix}pagination-border-color: #{$pagination-border-color}; + --#{$prefix}pagination-border-radius: #{$pagination-border-radius}; + --#{$prefix}pagination-hover-color: #{$pagination-hover-color}; + --#{$prefix}pagination-hover-bg: #{$pagination-hover-bg}; + --#{$prefix}pagination-hover-border-color: #{$pagination-hover-border-color}; + --#{$prefix}pagination-focus-color: #{$pagination-focus-color}; + --#{$prefix}pagination-focus-bg: #{$pagination-focus-bg}; + --#{$prefix}pagination-focus-box-shadow: #{$pagination-focus-box-shadow}; + --#{$prefix}pagination-active-color: #{$pagination-active-color}; + --#{$prefix}pagination-active-bg: #{$pagination-active-bg}; + --#{$prefix}pagination-active-border-color: #{$pagination-active-border-color}; + --#{$prefix}pagination-disabled-color: #{$pagination-disabled-color}; + --#{$prefix}pagination-disabled-bg: #{$pagination-disabled-bg}; + --#{$prefix}pagination-disabled-border-color: #{$pagination-disabled-border-color}; + // scss-docs-end pagination-css-vars + + display: flex; + @include list-unstyled(); +} + +.page-link { + position: relative; + display: block; + padding: var(--#{$prefix}pagination-padding-y) var(--#{$prefix}pagination-padding-x); + @include font-size(var(--#{$prefix}pagination-font-size)); + color: var(--#{$prefix}pagination-color); + text-decoration: if($link-decoration == none, null, none); + background-color: var(--#{$prefix}pagination-bg); + border: var(--#{$prefix}pagination-border-width) solid var(--#{$prefix}pagination-border-color); + @include transition($pagination-transition); + + &:hover { + z-index: 2; + color: var(--#{$prefix}pagination-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + background-color: var(--#{$prefix}pagination-hover-bg); + border-color: var(--#{$prefix}pagination-hover-border-color); + } + + &:focus { + z-index: 3; + color: var(--#{$prefix}pagination-focus-color); + background-color: var(--#{$prefix}pagination-focus-bg); + outline: $pagination-focus-outline; + box-shadow: var(--#{$prefix}pagination-focus-box-shadow); + } + + &.active, + .active > & { + z-index: 3; + color: var(--#{$prefix}pagination-active-color); + @include gradient-bg(var(--#{$prefix}pagination-active-bg)); + border-color: var(--#{$prefix}pagination-active-border-color); + } + + &.disabled, + .disabled > & { + color: var(--#{$prefix}pagination-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}pagination-disabled-bg); + border-color: var(--#{$prefix}pagination-disabled-border-color); + } +} + +.page-item { + &:not(:first-child) .page-link { + margin-left: $pagination-margin-start; + } + + @if $pagination-margin-start == calc(#{$pagination-border-width} * -1) { + &:first-child { + .page-link { + @include border-start-radius(var(--#{$prefix}pagination-border-radius)); + } + } + + &:last-child { + .page-link { + @include border-end-radius(var(--#{$prefix}pagination-border-radius)); + } + } + } @else { + // Add border-radius to all pageLinks in case they have left margin + .page-link { + @include border-radius(var(--#{$prefix}pagination-border-radius)); + } + } +} + + +// +// Sizing +// + +.pagination-lg { + @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg); +} + +.pagination-sm { + @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_placeholders.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_placeholders.scss new file mode 100644 index 00000000..6e32e1cd --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_placeholders.scss @@ -0,0 +1,51 @@ +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: $placeholder-opacity-max; + + &.btn::before { + display: inline-block; + content: ""; + } +} + +// Sizing +.placeholder-xs { + min-height: .6em; +} + +.placeholder-sm { + min-height: .8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +// Animation +.placeholder-glow { + .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; + } +} + +@keyframes placeholder-glow { + 50% { + opacity: $placeholder-opacity-min; + } +} + +.placeholder-wave { + mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%); + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; +} + +@keyframes placeholder-wave { + 100% { + mask-position: -200% 0%; + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_popover.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_popover.scss new file mode 100644 index 00000000..7b69f623 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_popover.scss @@ -0,0 +1,196 @@ +.popover { + // scss-docs-start popover-css-vars + --#{$prefix}popover-zindex: #{$zindex-popover}; + --#{$prefix}popover-max-width: #{$popover-max-width}; + @include rfs($popover-font-size, --#{$prefix}popover-font-size); + --#{$prefix}popover-bg: #{$popover-bg}; + --#{$prefix}popover-border-width: #{$popover-border-width}; + --#{$prefix}popover-border-color: #{$popover-border-color}; + --#{$prefix}popover-border-radius: #{$popover-border-radius}; + --#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius}; + --#{$prefix}popover-box-shadow: #{$popover-box-shadow}; + --#{$prefix}popover-header-padding-x: #{$popover-header-padding-x}; + --#{$prefix}popover-header-padding-y: #{$popover-header-padding-y}; + @include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size); + --#{$prefix}popover-header-color: #{$popover-header-color}; + --#{$prefix}popover-header-bg: #{$popover-header-bg}; + --#{$prefix}popover-body-padding-x: #{$popover-body-padding-x}; + --#{$prefix}popover-body-padding-y: #{$popover-body-padding-y}; + --#{$prefix}popover-body-color: #{$popover-body-color}; + --#{$prefix}popover-arrow-width: #{$popover-arrow-width}; + --#{$prefix}popover-arrow-height: #{$popover-arrow-height}; + --#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color); + // scss-docs-end popover-css-vars + + z-index: var(--#{$prefix}popover-zindex); + display: block; + max-width: var(--#{$prefix}popover-max-width); + // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element. + // So reset our font and text properties to avoid inheriting weird values. + @include reset-text(); + @include font-size(var(--#{$prefix}popover-font-size)); + // Allow breaking very long words so they don't overflow the popover's bounds + word-wrap: break-word; + background-color: var(--#{$prefix}popover-bg); + background-clip: padding-box; + border: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color); + @include border-radius(var(--#{$prefix}popover-border-radius)); + @include box-shadow(var(--#{$prefix}popover-box-shadow)); + + .popover-arrow { + display: block; + width: var(--#{$prefix}popover-arrow-width); + height: var(--#{$prefix}popover-arrow-height); + + &::before, + &::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; + } + } +} + +.bs-popover-top { + > .popover-arrow { + bottom: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list + + &::before, + &::after { + border-width: var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list + } + + &::before { + bottom: 0; + border-top-color: var(--#{$prefix}popover-arrow-border); + } + + &::after { + bottom: var(--#{$prefix}popover-border-width); + border-top-color: var(--#{$prefix}popover-bg); + } + } +} + +/* rtl:begin:ignore */ +.bs-popover-end { + > .popover-arrow { + left: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list + width: var(--#{$prefix}popover-arrow-height); + height: var(--#{$prefix}popover-arrow-width); + + &::before, + &::after { + border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list + } + + &::before { + left: 0; + border-right-color: var(--#{$prefix}popover-arrow-border); + } + + &::after { + left: var(--#{$prefix}popover-border-width); + border-right-color: var(--#{$prefix}popover-bg); + } + } +} + +/* rtl:end:ignore */ + +.bs-popover-bottom { + > .popover-arrow { + top: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list + + &::before, + &::after { + border-width: 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list + } + + &::before { + top: 0; + border-bottom-color: var(--#{$prefix}popover-arrow-border); + } + + &::after { + top: var(--#{$prefix}popover-border-width); + border-bottom-color: var(--#{$prefix}popover-bg); + } + } + + // This will remove the popover-header's border just below the arrow + .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--#{$prefix}popover-arrow-width); + margin-left: calc(-.5 * var(--#{$prefix}popover-arrow-width)); // stylelint-disable-line function-disallowed-list + content: ""; + border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-header-bg); + } +} + +/* rtl:begin:ignore */ +.bs-popover-start { + > .popover-arrow { + right: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list + width: var(--#{$prefix}popover-arrow-height); + height: var(--#{$prefix}popover-arrow-width); + + &::before, + &::after { + border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list + } + + &::before { + right: 0; + border-left-color: var(--#{$prefix}popover-arrow-border); + } + + &::after { + right: var(--#{$prefix}popover-border-width); + border-left-color: var(--#{$prefix}popover-bg); + } + } +} + +/* rtl:end:ignore */ + +.bs-popover-auto { + &[data-popper-placement^="top"] { + @extend .bs-popover-top; + } + &[data-popper-placement^="right"] { + @extend .bs-popover-end; + } + &[data-popper-placement^="bottom"] { + @extend .bs-popover-bottom; + } + &[data-popper-placement^="left"] { + @extend .bs-popover-start; + } +} + +// Offset the popover to account for the popover arrow +.popover-header { + padding: var(--#{$prefix}popover-header-padding-y) var(--#{$prefix}popover-header-padding-x); + margin-bottom: 0; // Reset the default from Reboot + @include font-size(var(--#{$prefix}popover-header-font-size)); + color: var(--#{$prefix}popover-header-color); + background-color: var(--#{$prefix}popover-header-bg); + border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color); + @include border-top-radius(var(--#{$prefix}popover-inner-border-radius)); + + &:empty { + display: none; + } +} + +.popover-body { + padding: var(--#{$prefix}popover-body-padding-y) var(--#{$prefix}popover-body-padding-x); + color: var(--#{$prefix}popover-body-color); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_progress.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_progress.scss new file mode 100644 index 00000000..148c3815 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_progress.scss @@ -0,0 +1,68 @@ +// Disable animation if transitions are disabled + +// scss-docs-start progress-keyframes +@if $enable-transitions { + @keyframes progress-bar-stripes { + 0% { background-position-x: $progress-height; } + } +} +// scss-docs-end progress-keyframes + +.progress, +.progress-stacked { + // scss-docs-start progress-css-vars + --#{$prefix}progress-height: #{$progress-height}; + @include rfs($progress-font-size, --#{$prefix}progress-font-size); + --#{$prefix}progress-bg: #{$progress-bg}; + --#{$prefix}progress-border-radius: #{$progress-border-radius}; + --#{$prefix}progress-box-shadow: #{$progress-box-shadow}; + --#{$prefix}progress-bar-color: #{$progress-bar-color}; + --#{$prefix}progress-bar-bg: #{$progress-bar-bg}; + --#{$prefix}progress-bar-transition: #{$progress-bar-transition}; + // scss-docs-end progress-css-vars + + display: flex; + height: var(--#{$prefix}progress-height); + overflow: hidden; // force rounded corners by cropping it + @include font-size(var(--#{$prefix}progress-font-size)); + background-color: var(--#{$prefix}progress-bg); + @include border-radius(var(--#{$prefix}progress-border-radius)); + @include box-shadow(var(--#{$prefix}progress-box-shadow)); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--#{$prefix}progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--#{$prefix}progress-bar-bg); + @include transition(var(--#{$prefix}progress-bar-transition)); +} + +.progress-bar-striped { + @include gradient-striped(); + background-size: var(--#{$prefix}progress-height) var(--#{$prefix}progress-height); +} + +.progress-stacked > .progress { + overflow: visible; +} + +.progress-stacked > .progress > .progress-bar { + width: 100%; +} + +@if $enable-transitions { + .progress-bar-animated { + animation: $progress-bar-animation-timing progress-bar-stripes; + + @if $enable-reduced-motion { + @media (prefers-reduced-motion: reduce) { + animation: none; + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_reboot.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_reboot.scss new file mode 100644 index 00000000..18791753 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_reboot.scss @@ -0,0 +1,611 @@ +// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix + + +// Reboot +// +// Normalization of HTML elements, manually forked from Normalize.css to remove +// styles targeting irrelevant browsers while applying new styles. +// +// Normalize is licensed MIT. https://github.com/necolas/normalize.css + + +// Document +// +// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`. + +*, +*::before, +*::after { + box-sizing: border-box; +} + + +// Root +// +// Ability to the value of the root font sizes, affecting the value of `rem`. +// null by default, thus nothing is generated. + +:root { + @if $font-size-root != null { + @include font-size(var(--#{$prefix}root-font-size)); + } + + @if $enable-smooth-scroll { + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + } +} + + +// Body +// +// 1. Remove the margin in all browsers. +// 2. As a best practice, apply a default `background-color`. +// 3. Prevent adjustments of font size after orientation changes in iOS. +// 4. Change the default tap highlight to be completely transparent in iOS. + +// scss-docs-start reboot-body-rules +body { + margin: 0; // 1 + font-family: var(--#{$prefix}body-font-family); + @include font-size(var(--#{$prefix}body-font-size)); + font-weight: var(--#{$prefix}body-font-weight); + line-height: var(--#{$prefix}body-line-height); + color: var(--#{$prefix}body-color); + text-align: var(--#{$prefix}body-text-align); + background-color: var(--#{$prefix}body-bg); // 2 + -webkit-text-size-adjust: 100%; // 3 + -webkit-tap-highlight-color: rgba($black, 0); // 4 +} +// scss-docs-end reboot-body-rules + + +// Content grouping +// +// 1. Reset Firefox's gray color + +hr { + margin: $hr-margin-y 0; + color: $hr-color; // 1 + border: 0; + border-top: $hr-border-width solid $hr-border-color; + opacity: $hr-opacity; +} + + +// Typography +// +// 1. Remove top margins from headings +// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top +// margin for easier control within type scales as it avoids margin collapsing. + +%heading { + margin-top: 0; // 1 + margin-bottom: $headings-margin-bottom; + font-family: $headings-font-family; + font-style: $headings-font-style; + font-weight: $headings-font-weight; + line-height: $headings-line-height; + color: var(--#{$prefix}heading-color); +} + +h1 { + @extend %heading; + @include font-size($h1-font-size); +} + +h2 { + @extend %heading; + @include font-size($h2-font-size); +} + +h3 { + @extend %heading; + @include font-size($h3-font-size); +} + +h4 { + @extend %heading; + @include font-size($h4-font-size); +} + +h5 { + @extend %heading; + @include font-size($h5-font-size); +} + +h6 { + @extend %heading; + @include font-size($h6-font-size); +} + + +// Reset margins on paragraphs +// +// Similarly, the top margin on `<p>`s get reset. However, we also reset the +// bottom margin to use `rem` units instead of `em`. + +p { + margin-top: 0; + margin-bottom: $paragraph-margin-bottom; +} + + +// Abbreviations +// +// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari. +// 2. Add explicit cursor to indicate changed behavior. +// 3. Prevent the text-decoration to be skipped. + +abbr[title] { + text-decoration: underline dotted; // 1 + cursor: help; // 2 + text-decoration-skip-ink: none; // 3 +} + + +// Address + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + + +// Lists + +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: $dt-font-weight; +} + +// 1. Undo browser default + +dd { + margin-bottom: .5rem; + margin-left: 0; // 1 +} + + +// Blockquote + +blockquote { + margin: 0 0 1rem; +} + + +// Strong +// +// Add the correct font weight in Chrome, Edge, and Safari + +b, +strong { + font-weight: $font-weight-bolder; +} + + +// Small +// +// Add the correct font size in all browsers + +small { + @include font-size($small-font-size); +} + + +// Mark + +mark { + padding: $mark-padding; + color: var(--#{$prefix}highlight-color); + background-color: var(--#{$prefix}highlight-bg); +} + + +// Sub and Sup +// +// Prevent `sub` and `sup` elements from affecting the line height in +// all browsers. + +sub, +sup { + position: relative; + @include font-size($sub-sup-font-size); + line-height: 0; + vertical-align: baseline; +} + +sub { bottom: -.25em; } +sup { top: -.5em; } + + +// Links + +a { + color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1)); + text-decoration: $link-decoration; + + &:hover { + --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb); + text-decoration: $link-hover-decoration; + } +} + +// And undo these styles for placeholder links/named anchors (without href). +// It would be more straightforward to just use a[href] in previous block, but that +// causes specificity issues in many other styles that are too complex to fix. +// See https://github.com/twbs/bootstrap/issues/19402 + +a:not([href]):not([class]) { + &, + &:hover { + color: inherit; + text-decoration: none; + } +} + + +// Code + +pre, +code, +kbd, +samp { + font-family: $font-family-code; + @include font-size(1em); // Correct the odd `em` font sizing in all browsers. +} + +// 1. Remove browser default top margin +// 2. Reset browser default of `1em` to use `rem`s +// 3. Don't allow content to break outside + +pre { + display: block; + margin-top: 0; // 1 + margin-bottom: 1rem; // 2 + overflow: auto; // 3 + @include font-size($code-font-size); + color: $pre-color; + + // Account for some code outputs that place code tags in pre tags + code { + @include font-size(inherit); + color: inherit; + word-break: normal; + } +} + +code { + @include font-size($code-font-size); + color: var(--#{$prefix}code-color); + word-wrap: break-word; + + // Streamline the style when inside anchors to avoid broken underline and more + a > & { + color: inherit; + } +} + +kbd { + padding: $kbd-padding-y $kbd-padding-x; + @include font-size($kbd-font-size); + color: $kbd-color; + background-color: $kbd-bg; + @include border-radius($border-radius-sm); + + kbd { + padding: 0; + @include font-size(1em); + font-weight: $nested-kbd-font-weight; + } +} + + +// Figures +// +// Apply a consistent margin strategy (matches our type styles). + +figure { + margin: 0 0 1rem; +} + + +// Images and content + +img, +svg { + vertical-align: middle; +} + + +// Tables +// +// Prevent double borders + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: $table-cell-padding-y; + padding-bottom: $table-cell-padding-y; + color: $table-caption-color; + text-align: left; +} + +// 1. Removes font-weight bold by inheriting +// 2. Matches default `<td>` alignment by inheriting `text-align`. +// 3. Fix alignment for Safari + +th { + font-weight: $table-th-font-weight; // 1 + text-align: inherit; // 2 + text-align: -webkit-match-parent; // 3 +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + + +// Forms +// +// 1. Allow labels to use `margin` for spacing. + +label { + display: inline-block; // 1 +} + +// Remove the default `border-radius` that macOS Chrome adds. +// See https://github.com/twbs/bootstrap/issues/24093 + +button { + // stylelint-disable-next-line property-disallowed-list + border-radius: 0; +} + +// Explicitly remove focus outline in Chromium when it shouldn't be +// visible (e.g. as result of mouse click or touch tap). It already +// should be doing this automatically, but seems to currently be +// confused and applies its very visible two-tone outline anyway. + +button:focus:not(:focus-visible) { + outline: 0; +} + +// 1. Remove the margin in Firefox and Safari + +input, +button, +select, +optgroup, +textarea { + margin: 0; // 1 + font-family: inherit; + @include font-size(inherit); + line-height: inherit; +} + +// Remove the inheritance of text transform in Firefox +button, +select { + text-transform: none; +} +// Set the cursor for non-`<button>` buttons +// +// Details at https://github.com/twbs/bootstrap/pull/30562 +[role="button"] { + cursor: pointer; +} + +select { + // Remove the inheritance of word-wrap in Safari. + // See https://github.com/twbs/bootstrap/issues/24990 + word-wrap: normal; + + // Undo the opacity change from Chrome + &:disabled { + opacity: 1; + } +} + +// Remove the dropdown arrow only from text type inputs built with datalists in Chrome. +// See https://stackoverflow.com/a/54997118 + +[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not([type="week"]):not([type="time"])::-webkit-calendar-picker-indicator { + display: none !important; +} + +// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` +// controls in Android 4. +// 2. Correct the inability to style clickable types in iOS and Safari. +// 3. Opinionated: add "hand" cursor to non-disabled button elements. + +button, +[type="button"], // 1 +[type="reset"], +[type="submit"] { + -webkit-appearance: button; // 2 + + @if $enable-button-pointers { + &:not(:disabled) { + cursor: pointer; // 3 + } + } +} + +// Remove inner border and padding from Firefox, but don't restore the outline like Normalize. + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers. + +textarea { + resize: vertical; // 1 +} + +// 1. Browsers set a default `min-width: min-content;` on fieldsets, +// unlike e.g. `<div>`s, which have `min-width: 0;` by default. +// So we reset that to ensure fieldsets behave more like a standard block element. +// See https://github.com/twbs/bootstrap/issues/12359 +// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements +// 2. Reset the default outline behavior of fieldsets so they don't affect page layout. + +fieldset { + min-width: 0; // 1 + padding: 0; // 2 + margin: 0; // 2 + border: 0; // 2 +} + +// 1. By using `float: left`, the legend will behave like a block element. +// This way the border of a fieldset wraps around the legend if present. +// 2. Fix wrapping bug. +// See https://github.com/twbs/bootstrap/issues/29712 + +legend { + float: left; // 1 + width: 100%; + padding: 0; + margin-bottom: $legend-margin-bottom; + @include font-size($legend-font-size); + font-weight: $legend-font-weight; + line-height: inherit; + + + * { + clear: left; // 2 + } +} + +// Fix height of inputs with a type of datetime-local, date, month, week, or time +// See https://github.com/twbs/bootstrap/issues/18842 + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +// 1. This overrides the extra rounded corners on search inputs in iOS so that our +// `.form-control` class can properly style them. Note that this cannot simply +// be added to `.form-control` as it's not specific enough. For details, see +// https://github.com/twbs/bootstrap/issues/11586. +// 2. Correct the outline style in Safari. + +[type="search"] { + -webkit-appearance: textfield; // 1 + outline-offset: -2px; // 2 +} + +// 1. A few input types should stay LTR +// See https://rtlstyling.com/posts/rtl-styling#form-inputs +// 2. RTL only output +// See https://rtlcss.com/learn/usage-guide/control-directives/#raw + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ + +// Remove the inner padding in Chrome and Safari on macOS. + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +// Remove padding around color pickers in webkit browsers + +::-webkit-color-swatch-wrapper { + padding: 0; +} + + +// 1. Inherit font family and line height for file input buttons +// 2. Correct the inability to style clickable types in iOS and Safari. + +::file-selector-button { + font: inherit; // 1 + -webkit-appearance: button; // 2 +} + +// Correct element displays + +output { + display: inline-block; +} + +// Remove border from iframe + +iframe { + border: 0; +} + +// Summary +// +// 1. Add the correct display in all browsers + +summary { + display: list-item; // 1 + cursor: pointer; +} + + +// Progress +// +// Add the correct vertical alignment in Chrome, Firefox, and Opera. + +progress { + vertical-align: baseline; +} + + +// Hidden attribute +// +// Always hide an element with the `hidden` HTML attribute. + +[hidden] { + display: none !important; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_root.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_root.scss new file mode 100644 index 00000000..becddf14 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_root.scss @@ -0,0 +1,187 @@ +:root, +[data-bs-theme="light"] { + // Note: Custom variable values only support SassScript inside `#{}`. + + // Colors + // + // Generate palettes for full colors, grays, and theme colors. + + @each $color, $value in $colors { + --#{$prefix}#{$color}: #{$value}; + } + + @each $color, $value in $grays { + --#{$prefix}gray-#{$color}: #{$value}; + } + + @each $color, $value in $theme-colors { + --#{$prefix}#{$color}: #{$value}; + } + + @each $color, $value in $theme-colors-rgb { + --#{$prefix}#{$color}-rgb: #{$value}; + } + + @each $color, $value in $theme-colors-text { + --#{$prefix}#{$color}-text-emphasis: #{$value}; + } + + @each $color, $value in $theme-colors-bg-subtle { + --#{$prefix}#{$color}-bg-subtle: #{$value}; + } + + @each $color, $value in $theme-colors-border-subtle { + --#{$prefix}#{$color}-border-subtle: #{$value}; + } + + --#{$prefix}white-rgb: #{to-rgb($white)}; + --#{$prefix}black-rgb: #{to-rgb($black)}; + + // Fonts + + // Note: Use `inspect` for lists so that quoted items keep the quotes. + // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 + --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)}; + --#{$prefix}font-monospace: #{inspect($font-family-monospace)}; + --#{$prefix}gradient: #{$gradient}; + + // Root and body + // scss-docs-start root-body-variables + @if $font-size-root != null { + --#{$prefix}root-font-size: #{$font-size-root}; + } + --#{$prefix}body-font-family: #{inspect($font-family-base)}; + @include rfs($font-size-base, --#{$prefix}body-font-size); + --#{$prefix}body-font-weight: #{$font-weight-base}; + --#{$prefix}body-line-height: #{$line-height-base}; + @if $body-text-align != null { + --#{$prefix}body-text-align: #{$body-text-align}; + } + + --#{$prefix}body-color: #{$body-color}; + --#{$prefix}body-color-rgb: #{to-rgb($body-color)}; + --#{$prefix}body-bg: #{$body-bg}; + --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)}; + + --#{$prefix}emphasis-color: #{$body-emphasis-color}; + --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)}; + + --#{$prefix}secondary-color: #{$body-secondary-color}; + --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)}; + --#{$prefix}secondary-bg: #{$body-secondary-bg}; + --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)}; + + --#{$prefix}tertiary-color: #{$body-tertiary-color}; + --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)}; + --#{$prefix}tertiary-bg: #{$body-tertiary-bg}; + --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)}; + // scss-docs-end root-body-variables + + --#{$prefix}heading-color: #{$headings-color}; + + --#{$prefix}link-color: #{$link-color}; + --#{$prefix}link-color-rgb: #{to-rgb($link-color)}; + --#{$prefix}link-decoration: #{$link-decoration}; + + --#{$prefix}link-hover-color: #{$link-hover-color}; + --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)}; + + @if $link-hover-decoration != null { + --#{$prefix}link-hover-decoration: #{$link-hover-decoration}; + } + + --#{$prefix}code-color: #{$code-color}; + --#{$prefix}highlight-color: #{$mark-color}; + --#{$prefix}highlight-bg: #{$mark-bg}; + + // scss-docs-start root-border-var + --#{$prefix}border-width: #{$border-width}; + --#{$prefix}border-style: #{$border-style}; + --#{$prefix}border-color: #{$border-color}; + --#{$prefix}border-color-translucent: #{$border-color-translucent}; + + --#{$prefix}border-radius: #{$border-radius}; + --#{$prefix}border-radius-sm: #{$border-radius-sm}; + --#{$prefix}border-radius-lg: #{$border-radius-lg}; + --#{$prefix}border-radius-xl: #{$border-radius-xl}; + --#{$prefix}border-radius-xxl: #{$border-radius-xxl}; + --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency + --#{$prefix}border-radius-pill: #{$border-radius-pill}; + // scss-docs-end root-border-var + + --#{$prefix}box-shadow: #{$box-shadow}; + --#{$prefix}box-shadow-sm: #{$box-shadow-sm}; + --#{$prefix}box-shadow-lg: #{$box-shadow-lg}; + --#{$prefix}box-shadow-inset: #{$box-shadow-inset}; + + // Focus styles + // scss-docs-start root-focus-variables + --#{$prefix}focus-ring-width: #{$focus-ring-width}; + --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity}; + --#{$prefix}focus-ring-color: #{$focus-ring-color}; + // scss-docs-end root-focus-variables + + // scss-docs-start root-form-validation-variables + --#{$prefix}form-valid-color: #{$form-valid-color}; + --#{$prefix}form-valid-border-color: #{$form-valid-border-color}; + --#{$prefix}form-invalid-color: #{$form-invalid-color}; + --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color}; + // scss-docs-end root-form-validation-variables +} + +@if $enable-dark-mode { + @include color-mode(dark, true) { + color-scheme: dark; + + // scss-docs-start root-dark-mode-vars + --#{$prefix}body-color: #{$body-color-dark}; + --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)}; + --#{$prefix}body-bg: #{$body-bg-dark}; + --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)}; + + --#{$prefix}emphasis-color: #{$body-emphasis-color-dark}; + --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)}; + + --#{$prefix}secondary-color: #{$body-secondary-color-dark}; + --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)}; + --#{$prefix}secondary-bg: #{$body-secondary-bg-dark}; + --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)}; + + --#{$prefix}tertiary-color: #{$body-tertiary-color-dark}; + --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)}; + --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark}; + --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)}; + + @each $color, $value in $theme-colors-text-dark { + --#{$prefix}#{$color}-text-emphasis: #{$value}; + } + + @each $color, $value in $theme-colors-bg-subtle-dark { + --#{$prefix}#{$color}-bg-subtle: #{$value}; + } + + @each $color, $value in $theme-colors-border-subtle-dark { + --#{$prefix}#{$color}-border-subtle: #{$value}; + } + + --#{$prefix}heading-color: #{$headings-color-dark}; + + --#{$prefix}link-color: #{$link-color-dark}; + --#{$prefix}link-hover-color: #{$link-hover-color-dark}; + --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)}; + --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)}; + + --#{$prefix}code-color: #{$code-color-dark}; + --#{$prefix}highlight-color: #{$mark-color-dark}; + --#{$prefix}highlight-bg: #{$mark-bg-dark}; + + --#{$prefix}border-color: #{$border-color-dark}; + --#{$prefix}border-color-translucent: #{$border-color-translucent-dark}; + + --#{$prefix}form-valid-color: #{$form-valid-color-dark}; + --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark}; + --#{$prefix}form-invalid-color: #{$form-invalid-color-dark}; + --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark}; + // scss-docs-end root-dark-mode-vars + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_spinners.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_spinners.scss new file mode 100644 index 00000000..ec847320 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_spinners.scss @@ -0,0 +1,85 @@ +// +// Rotating border +// + +.spinner-grow, +.spinner-border { + display: inline-block; + width: var(--#{$prefix}spinner-width); + height: var(--#{$prefix}spinner-height); + vertical-align: var(--#{$prefix}spinner-vertical-align); + // stylelint-disable-next-line property-disallowed-list + border-radius: 50%; + animation: var(--#{$prefix}spinner-animation-speed) linear infinite var(--#{$prefix}spinner-animation-name); +} + +// scss-docs-start spinner-border-keyframes +@keyframes spinner-border { + to { transform: rotate(360deg) #{"/* rtl:ignore */"}; } +} +// scss-docs-end spinner-border-keyframes + +.spinner-border { + // scss-docs-start spinner-border-css-vars + --#{$prefix}spinner-width: #{$spinner-width}; + --#{$prefix}spinner-height: #{$spinner-height}; + --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align}; + --#{$prefix}spinner-border-width: #{$spinner-border-width}; + --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed}; + --#{$prefix}spinner-animation-name: spinner-border; + // scss-docs-end spinner-border-css-vars + + border: var(--#{$prefix}spinner-border-width) solid currentcolor; + border-right-color: transparent; +} + +.spinner-border-sm { + // scss-docs-start spinner-border-sm-css-vars + --#{$prefix}spinner-width: #{$spinner-width-sm}; + --#{$prefix}spinner-height: #{$spinner-height-sm}; + --#{$prefix}spinner-border-width: #{$spinner-border-width-sm}; + // scss-docs-end spinner-border-sm-css-vars +} + +// +// Growing circle +// + +// scss-docs-start spinner-grow-keyframes +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +// scss-docs-end spinner-grow-keyframes + +.spinner-grow { + // scss-docs-start spinner-grow-css-vars + --#{$prefix}spinner-width: #{$spinner-width}; + --#{$prefix}spinner-height: #{$spinner-height}; + --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align}; + --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed}; + --#{$prefix}spinner-animation-name: spinner-grow; + // scss-docs-end spinner-grow-css-vars + + background-color: currentcolor; + opacity: 0; +} + +.spinner-grow-sm { + --#{$prefix}spinner-width: #{$spinner-width-sm}; + --#{$prefix}spinner-height: #{$spinner-height-sm}; +} + +@if $enable-reduced-motion { + @media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed * 2}; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tables.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tables.scss new file mode 100644 index 00000000..276521a3 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tables.scss @@ -0,0 +1,171 @@ +// +// Basic Bootstrap table +// + +.table { + // Reset needed for nesting tables + --#{$prefix}table-color-type: initial; + --#{$prefix}table-bg-type: initial; + --#{$prefix}table-color-state: initial; + --#{$prefix}table-bg-state: initial; + // End of reset + --#{$prefix}table-color: #{$table-color}; + --#{$prefix}table-bg: #{$table-bg}; + --#{$prefix}table-border-color: #{$table-border-color}; + --#{$prefix}table-accent-bg: #{$table-accent-bg}; + --#{$prefix}table-striped-color: #{$table-striped-color}; + --#{$prefix}table-striped-bg: #{$table-striped-bg}; + --#{$prefix}table-active-color: #{$table-active-color}; + --#{$prefix}table-active-bg: #{$table-active-bg}; + --#{$prefix}table-hover-color: #{$table-hover-color}; + --#{$prefix}table-hover-bg: #{$table-hover-bg}; + + width: 100%; + margin-bottom: $spacer; + vertical-align: $table-cell-vertical-align; + border-color: var(--#{$prefix}table-border-color); + + // Target th & td + // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class. + // We use the universal selectors here to simplify the selector (else we would need 6 different selectors). + // Another advantage is that this generates less code and makes the selector less specific making it easier to override. + // stylelint-disable-next-line selector-max-universal + > :not(caption) > * > * { + padding: $table-cell-padding-y $table-cell-padding-x; + // Following the precept of cascades: https://codepen.io/miriamsuzanne/full/vYNgodb + color: var(--#{$prefix}table-color-state, var(--#{$prefix}table-color-type, var(--#{$prefix}table-color))); + background-color: var(--#{$prefix}table-bg); + border-bottom-width: $table-border-width; + box-shadow: inset 0 0 0 9999px var(--#{$prefix}table-bg-state, var(--#{$prefix}table-bg-type, var(--#{$prefix}table-accent-bg))); + } + + > tbody { + vertical-align: inherit; + } + + > thead { + vertical-align: bottom; + } +} + +.table-group-divider { + border-top: calc(#{$table-border-width} * 2) solid $table-group-separator-color; // stylelint-disable-line function-disallowed-list +} + +// +// Change placement of captions with a class +// + +.caption-top { + caption-side: top; +} + + +// +// Condensed table w/ half padding +// + +.table-sm { + // stylelint-disable-next-line selector-max-universal + > :not(caption) > * > * { + padding: $table-cell-padding-y-sm $table-cell-padding-x-sm; + } +} + + +// Border versions +// +// Add or remove borders all around the table and between all the columns. +// +// When borders are added on all sides of the cells, the corners can render odd when +// these borders do not have the same color or if they are semi-transparent. +// Therefore we add top and border bottoms to the `tr`s and left and right borders +// to the `td`s or `th`s + +.table-bordered { + > :not(caption) > * { + border-width: $table-border-width 0; + + // stylelint-disable-next-line selector-max-universal + > * { + border-width: 0 $table-border-width; + } + } +} + +.table-borderless { + // stylelint-disable-next-line selector-max-universal + > :not(caption) > * > * { + border-bottom-width: 0; + } + + > :not(:first-child) { + border-top-width: 0; + } +} + +// Zebra-striping +// +// Default zebra-stripe styles (alternating gray and transparent backgrounds) + +// For rows +.table-striped { + > tbody > tr:nth-of-type(#{$table-striped-order}) > * { + --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color); + --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg); + } +} + +// For columns +.table-striped-columns { + > :not(caption) > tr > :nth-child(#{$table-striped-columns-order}) { + --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color); + --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg); + } +} + +// Active table +// +// The `.table-active` class can be added to highlight rows or cells + +.table-active { + --#{$prefix}table-color-state: var(--#{$prefix}table-active-color); + --#{$prefix}table-bg-state: var(--#{$prefix}table-active-bg); +} + +// Hover effect +// +// Placed here since it has to come after the potential zebra striping + +.table-hover { + > tbody > tr:hover > * { + --#{$prefix}table-color-state: var(--#{$prefix}table-hover-color); + --#{$prefix}table-bg-state: var(--#{$prefix}table-hover-bg); + } +} + + +// Table variants +// +// Table variants set the table cell backgrounds, border colors +// and the colors of the striped, hovered & active tables + +@each $color, $value in $table-variants { + @include table-variant($color, $value); +} + +// Responsive tables +// +// Generate series of `.table-responsive-*` classes for configuring the screen +// size of where your table will overflow. + +@each $breakpoint in map-keys($grid-breakpoints) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + @include media-breakpoint-down($breakpoint) { + .table-responsive#{$infix} { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_toasts.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_toasts.scss new file mode 100644 index 00000000..2ce378d5 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_toasts.scss @@ -0,0 +1,73 @@ +.toast { + // scss-docs-start toast-css-vars + --#{$prefix}toast-zindex: #{$zindex-toast}; + --#{$prefix}toast-padding-x: #{$toast-padding-x}; + --#{$prefix}toast-padding-y: #{$toast-padding-y}; + --#{$prefix}toast-spacing: #{$toast-spacing}; + --#{$prefix}toast-max-width: #{$toast-max-width}; + @include rfs($toast-font-size, --#{$prefix}toast-font-size); + --#{$prefix}toast-color: #{$toast-color}; + --#{$prefix}toast-bg: #{$toast-background-color}; + --#{$prefix}toast-border-width: #{$toast-border-width}; + --#{$prefix}toast-border-color: #{$toast-border-color}; + --#{$prefix}toast-border-radius: #{$toast-border-radius}; + --#{$prefix}toast-box-shadow: #{$toast-box-shadow}; + --#{$prefix}toast-header-color: #{$toast-header-color}; + --#{$prefix}toast-header-bg: #{$toast-header-background-color}; + --#{$prefix}toast-header-border-color: #{$toast-header-border-color}; + // scss-docs-end toast-css-vars + + width: var(--#{$prefix}toast-max-width); + max-width: 100%; + @include font-size(var(--#{$prefix}toast-font-size)); + color: var(--#{$prefix}toast-color); + pointer-events: auto; + background-color: var(--#{$prefix}toast-bg); + background-clip: padding-box; + border: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-border-color); + box-shadow: var(--#{$prefix}toast-box-shadow); + @include border-radius(var(--#{$prefix}toast-border-radius)); + + &.showing { + opacity: 0; + } + + &:not(.show) { + display: none; + } +} + +.toast-container { + --#{$prefix}toast-zindex: #{$zindex-toast}; + + position: absolute; + z-index: var(--#{$prefix}toast-zindex); + width: max-content; + max-width: 100%; + pointer-events: none; + + > :not(:last-child) { + margin-bottom: var(--#{$prefix}toast-spacing); + } +} + +.toast-header { + display: flex; + align-items: center; + padding: var(--#{$prefix}toast-padding-y) var(--#{$prefix}toast-padding-x); + color: var(--#{$prefix}toast-header-color); + background-color: var(--#{$prefix}toast-header-bg); + background-clip: padding-box; + border-bottom: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-header-border-color); + @include border-top-radius(calc(var(--#{$prefix}toast-border-radius) - var(--#{$prefix}toast-border-width))); + + .btn-close { + margin-right: calc(-.5 * var(--#{$prefix}toast-padding-x)); // stylelint-disable-line function-disallowed-list + margin-left: var(--#{$prefix}toast-padding-x); + } +} + +.toast-body { + padding: var(--#{$prefix}toast-padding-x); + word-wrap: break-word; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tooltip.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tooltip.scss new file mode 100644 index 00000000..85de90f5 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tooltip.scss @@ -0,0 +1,119 @@ +// Base class +.tooltip { + // scss-docs-start tooltip-css-vars + --#{$prefix}tooltip-zindex: #{$zindex-tooltip}; + --#{$prefix}tooltip-max-width: #{$tooltip-max-width}; + --#{$prefix}tooltip-padding-x: #{$tooltip-padding-x}; + --#{$prefix}tooltip-padding-y: #{$tooltip-padding-y}; + --#{$prefix}tooltip-margin: #{$tooltip-margin}; + @include rfs($tooltip-font-size, --#{$prefix}tooltip-font-size); + --#{$prefix}tooltip-color: #{$tooltip-color}; + --#{$prefix}tooltip-bg: #{$tooltip-bg}; + --#{$prefix}tooltip-border-radius: #{$tooltip-border-radius}; + --#{$prefix}tooltip-opacity: #{$tooltip-opacity}; + --#{$prefix}tooltip-arrow-width: #{$tooltip-arrow-width}; + --#{$prefix}tooltip-arrow-height: #{$tooltip-arrow-height}; + // scss-docs-end tooltip-css-vars + + z-index: var(--#{$prefix}tooltip-zindex); + display: block; + margin: var(--#{$prefix}tooltip-margin); + @include deprecate("`$tooltip-margin`", "v5", "v5.x", true); + // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element. + // So reset our font and text properties to avoid inheriting weird values. + @include reset-text(); + @include font-size(var(--#{$prefix}tooltip-font-size)); + // Allow breaking very long words so they don't overflow the tooltip's bounds + word-wrap: break-word; + opacity: 0; + + &.show { opacity: var(--#{$prefix}tooltip-opacity); } + + .tooltip-arrow { + display: block; + width: var(--#{$prefix}tooltip-arrow-width); + height: var(--#{$prefix}tooltip-arrow-height); + + &::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; + } + } +} + +.bs-tooltip-top .tooltip-arrow { + bottom: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list + + &::before { + top: -1px; + border-width: var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list + border-top-color: var(--#{$prefix}tooltip-bg); + } +} + +/* rtl:begin:ignore */ +.bs-tooltip-end .tooltip-arrow { + left: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list + width: var(--#{$prefix}tooltip-arrow-height); + height: var(--#{$prefix}tooltip-arrow-width); + + &::before { + right: -1px; + border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list + border-right-color: var(--#{$prefix}tooltip-bg); + } +} + +/* rtl:end:ignore */ + +.bs-tooltip-bottom .tooltip-arrow { + top: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list + + &::before { + bottom: -1px; + border-width: 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list + border-bottom-color: var(--#{$prefix}tooltip-bg); + } +} + +/* rtl:begin:ignore */ +.bs-tooltip-start .tooltip-arrow { + right: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list + width: var(--#{$prefix}tooltip-arrow-height); + height: var(--#{$prefix}tooltip-arrow-width); + + &::before { + left: -1px; + border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list + border-left-color: var(--#{$prefix}tooltip-bg); + } +} + +/* rtl:end:ignore */ + +.bs-tooltip-auto { + &[data-popper-placement^="top"] { + @extend .bs-tooltip-top; + } + &[data-popper-placement^="right"] { + @extend .bs-tooltip-end; + } + &[data-popper-placement^="bottom"] { + @extend .bs-tooltip-bottom; + } + &[data-popper-placement^="left"] { + @extend .bs-tooltip-start; + } +} + +// Wrapper for the tooltip content +.tooltip-inner { + max-width: var(--#{$prefix}tooltip-max-width); + padding: var(--#{$prefix}tooltip-padding-y) var(--#{$prefix}tooltip-padding-x); + color: var(--#{$prefix}tooltip-color); + text-align: center; + background-color: var(--#{$prefix}tooltip-bg); + @include border-radius(var(--#{$prefix}tooltip-border-radius)); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_transitions.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_transitions.scss new file mode 100644 index 00000000..bfb26aa8 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_transitions.scss @@ -0,0 +1,27 @@ +.fade { + @include transition($transition-fade); + + &:not(.show) { + opacity: 0; + } +} + +// scss-docs-start collapse-classes +.collapse { + &:not(.show) { + display: none; + } +} + +.collapsing { + height: 0; + overflow: hidden; + @include transition($transition-collapse); + + &.collapse-horizontal { + width: 0; + height: auto; + @include transition($transition-collapse-width); + } +} +// scss-docs-end collapse-classes diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_type.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_type.scss new file mode 100644 index 00000000..37d64bf8 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_type.scss @@ -0,0 +1,106 @@ +// +// Headings +// +.h1 { + @extend h1; +} + +.h2 { + @extend h2; +} + +.h3 { + @extend h3; +} + +.h4 { + @extend h4; +} + +.h5 { + @extend h5; +} + +.h6 { + @extend h6; +} + + +.lead { + @include font-size($lead-font-size); + font-weight: $lead-font-weight; +} + +// Type display classes +@each $display, $font-size in $display-font-sizes { + .display-#{$display} { + @include font-size($font-size); + font-family: $display-font-family; + font-style: $display-font-style; + font-weight: $display-font-weight; + line-height: $display-line-height; + } +} + +// +// Emphasis +// +.small { + @extend small; +} + +.mark { + @extend mark; +} + +// +// Lists +// + +.list-unstyled { + @include list-unstyled(); +} + +// Inline turns list items into inline-block +.list-inline { + @include list-unstyled(); +} +.list-inline-item { + display: inline-block; + + &:not(:last-child) { + margin-right: $list-inline-padding; + } +} + + +// +// Misc +// + +// Builds on `abbr` +.initialism { + @include font-size($initialism-font-size); + text-transform: uppercase; +} + +// Blockquotes +.blockquote { + margin-bottom: $blockquote-margin-y; + @include font-size($blockquote-font-size); + + > :last-child { + margin-bottom: 0; + } +} + +.blockquote-footer { + margin-top: -$blockquote-margin-y; + margin-bottom: $blockquote-margin-y; + @include font-size($blockquote-footer-font-size); + color: $blockquote-footer-color; + + &::before { + content: "\2014\00A0"; // em dash, nbsp + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_utilities.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_utilities.scss new file mode 100644 index 00000000..696f906e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_utilities.scss @@ -0,0 +1,806 @@ +// Utilities + +$utilities: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$utilities: map-merge( + ( + // scss-docs-start utils-vertical-align + "align": ( + property: vertical-align, + class: align, + values: baseline top middle bottom text-bottom text-top + ), + // scss-docs-end utils-vertical-align + // scss-docs-start utils-float + "float": ( + responsive: true, + property: float, + values: ( + start: left, + end: right, + none: none, + ) + ), + // scss-docs-end utils-float + // Object Fit utilities + // scss-docs-start utils-object-fit + "object-fit": ( + responsive: true, + property: object-fit, + values: ( + contain: contain, + cover: cover, + fill: fill, + scale: scale-down, + none: none, + ) + ), + // scss-docs-end utils-object-fit + // Opacity utilities + // scss-docs-start utils-opacity + "opacity": ( + property: opacity, + values: ( + 0: 0, + 25: .25, + 50: .5, + 75: .75, + 100: 1, + ) + ), + // scss-docs-end utils-opacity + // scss-docs-start utils-overflow + "overflow": ( + property: overflow, + values: auto hidden visible scroll, + ), + "overflow-x": ( + property: overflow-x, + values: auto hidden visible scroll, + ), + "overflow-y": ( + property: overflow-y, + values: auto hidden visible scroll, + ), + // scss-docs-end utils-overflow + // scss-docs-start utils-display + "display": ( + responsive: true, + print: true, + property: display, + class: d, + values: inline inline-block block grid inline-grid table table-row table-cell flex inline-flex none + ), + // scss-docs-end utils-display + // scss-docs-start utils-shadow + "shadow": ( + property: box-shadow, + class: shadow, + values: ( + null: var(--#{$prefix}box-shadow), + sm: var(--#{$prefix}box-shadow-sm), + lg: var(--#{$prefix}box-shadow-lg), + none: none, + ) + ), + // scss-docs-end utils-shadow + // scss-docs-start utils-focus-ring + "focus-ring": ( + css-var: true, + css-variable-name: focus-ring-color, + class: focus-ring, + values: map-loop($theme-colors-rgb, rgba-css-var, "$key", "focus-ring") + ), + // scss-docs-end utils-focus-ring + // scss-docs-start utils-position + "position": ( + property: position, + values: static relative absolute fixed sticky + ), + "top": ( + property: top, + values: $position-values + ), + "bottom": ( + property: bottom, + values: $position-values + ), + "start": ( + property: left, + class: start, + values: $position-values + ), + "end": ( + property: right, + class: end, + values: $position-values + ), + "translate-middle": ( + property: transform, + class: translate-middle, + values: ( + null: translate(-50%, -50%), + x: translateX(-50%), + y: translateY(-50%), + ) + ), + // scss-docs-end utils-position + // scss-docs-start utils-borders + "border": ( + property: border, + values: ( + null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color), + 0: 0, + ) + ), + "border-top": ( + property: border-top, + values: ( + null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color), + 0: 0, + ) + ), + "border-end": ( + property: border-right, + class: border-end, + values: ( + null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color), + 0: 0, + ) + ), + "border-bottom": ( + property: border-bottom, + values: ( + null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color), + 0: 0, + ) + ), + "border-start": ( + property: border-left, + class: border-start, + values: ( + null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color), + 0: 0, + ) + ), + "border-color": ( + property: border-color, + class: border, + local-vars: ( + "border-opacity": 1 + ), + values: $utilities-border-colors + ), + "subtle-border-color": ( + property: border-color, + class: border, + values: $utilities-border-subtle + ), + "border-width": ( + property: border-width, + class: border, + values: $border-widths + ), + "border-opacity": ( + css-var: true, + class: border-opacity, + values: ( + 10: .1, + 25: .25, + 50: .5, + 75: .75, + 100: 1 + ) + ), + // scss-docs-end utils-borders + // Sizing utilities + // scss-docs-start utils-sizing + "width": ( + property: width, + class: w, + values: ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100%, + auto: auto + ) + ), + "max-width": ( + property: max-width, + class: mw, + values: (100: 100%) + ), + "viewport-width": ( + property: width, + class: vw, + values: (100: 100vw) + ), + "min-viewport-width": ( + property: min-width, + class: min-vw, + values: (100: 100vw) + ), + "height": ( + property: height, + class: h, + values: ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100%, + auto: auto + ) + ), + "max-height": ( + property: max-height, + class: mh, + values: (100: 100%) + ), + "viewport-height": ( + property: height, + class: vh, + values: (100: 100vh) + ), + "min-viewport-height": ( + property: min-height, + class: min-vh, + values: (100: 100vh) + ), + // scss-docs-end utils-sizing + // Flex utilities + // scss-docs-start utils-flex + "flex": ( + responsive: true, + property: flex, + values: (fill: 1 1 auto) + ), + "flex-direction": ( + responsive: true, + property: flex-direction, + class: flex, + values: row column row-reverse column-reverse + ), + "flex-grow": ( + responsive: true, + property: flex-grow, + class: flex, + values: ( + grow-0: 0, + grow-1: 1, + ) + ), + "flex-shrink": ( + responsive: true, + property: flex-shrink, + class: flex, + values: ( + shrink-0: 0, + shrink-1: 1, + ) + ), + "flex-wrap": ( + responsive: true, + property: flex-wrap, + class: flex, + values: wrap nowrap wrap-reverse + ), + "justify-content": ( + responsive: true, + property: justify-content, + values: ( + start: flex-start, + end: flex-end, + center: center, + between: space-between, + around: space-around, + evenly: space-evenly, + ) + ), + "align-items": ( + responsive: true, + property: align-items, + values: ( + start: flex-start, + end: flex-end, + center: center, + baseline: baseline, + stretch: stretch, + ) + ), + "align-content": ( + responsive: true, + property: align-content, + values: ( + start: flex-start, + end: flex-end, + center: center, + between: space-between, + around: space-around, + stretch: stretch, + ) + ), + "align-self": ( + responsive: true, + property: align-self, + values: ( + auto: auto, + start: flex-start, + end: flex-end, + center: center, + baseline: baseline, + stretch: stretch, + ) + ), + "order": ( + responsive: true, + property: order, + values: ( + first: -1, + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + last: 6, + ), + ), + // scss-docs-end utils-flex + // Margin utilities + // scss-docs-start utils-spacing + "margin": ( + responsive: true, + property: margin, + class: m, + values: map-merge($spacers, (auto: auto)) + ), + "margin-x": ( + responsive: true, + property: margin-right margin-left, + class: mx, + values: map-merge($spacers, (auto: auto)) + ), + "margin-y": ( + responsive: true, + property: margin-top margin-bottom, + class: my, + values: map-merge($spacers, (auto: auto)) + ), + "margin-top": ( + responsive: true, + property: margin-top, + class: mt, + values: map-merge($spacers, (auto: auto)) + ), + "margin-end": ( + responsive: true, + property: margin-right, + class: me, + values: map-merge($spacers, (auto: auto)) + ), + "margin-bottom": ( + responsive: true, + property: margin-bottom, + class: mb, + values: map-merge($spacers, (auto: auto)) + ), + "margin-start": ( + responsive: true, + property: margin-left, + class: ms, + values: map-merge($spacers, (auto: auto)) + ), + // Negative margin utilities + "negative-margin": ( + responsive: true, + property: margin, + class: m, + values: $negative-spacers + ), + "negative-margin-x": ( + responsive: true, + property: margin-right margin-left, + class: mx, + values: $negative-spacers + ), + "negative-margin-y": ( + responsive: true, + property: margin-top margin-bottom, + class: my, + values: $negative-spacers + ), + "negative-margin-top": ( + responsive: true, + property: margin-top, + class: mt, + values: $negative-spacers + ), + "negative-margin-end": ( + responsive: true, + property: margin-right, + class: me, + values: $negative-spacers + ), + "negative-margin-bottom": ( + responsive: true, + property: margin-bottom, + class: mb, + values: $negative-spacers + ), + "negative-margin-start": ( + responsive: true, + property: margin-left, + class: ms, + values: $negative-spacers + ), + // Padding utilities + "padding": ( + responsive: true, + property: padding, + class: p, + values: $spacers + ), + "padding-x": ( + responsive: true, + property: padding-right padding-left, + class: px, + values: $spacers + ), + "padding-y": ( + responsive: true, + property: padding-top padding-bottom, + class: py, + values: $spacers + ), + "padding-top": ( + responsive: true, + property: padding-top, + class: pt, + values: $spacers + ), + "padding-end": ( + responsive: true, + property: padding-right, + class: pe, + values: $spacers + ), + "padding-bottom": ( + responsive: true, + property: padding-bottom, + class: pb, + values: $spacers + ), + "padding-start": ( + responsive: true, + property: padding-left, + class: ps, + values: $spacers + ), + // Gap utility + "gap": ( + responsive: true, + property: gap, + class: gap, + values: $spacers + ), + "row-gap": ( + responsive: true, + property: row-gap, + class: row-gap, + values: $spacers + ), + "column-gap": ( + responsive: true, + property: column-gap, + class: column-gap, + values: $spacers + ), + // scss-docs-end utils-spacing + // Text + // scss-docs-start utils-text + "font-family": ( + property: font-family, + class: font, + values: (monospace: var(--#{$prefix}font-monospace)) + ), + "font-size": ( + rfs: true, + property: font-size, + class: fs, + values: $font-sizes + ), + "font-style": ( + property: font-style, + class: fst, + values: italic normal + ), + "font-weight": ( + property: font-weight, + class: fw, + values: ( + lighter: $font-weight-lighter, + light: $font-weight-light, + normal: $font-weight-normal, + medium: $font-weight-medium, + semibold: $font-weight-semibold, + bold: $font-weight-bold, + bolder: $font-weight-bolder + ) + ), + "line-height": ( + property: line-height, + class: lh, + values: ( + 1: 1, + sm: $line-height-sm, + base: $line-height-base, + lg: $line-height-lg, + ) + ), + "text-align": ( + responsive: true, + property: text-align, + class: text, + values: ( + start: left, + end: right, + center: center, + ) + ), + "text-decoration": ( + property: text-decoration, + values: none underline line-through + ), + "text-transform": ( + property: text-transform, + class: text, + values: lowercase uppercase capitalize + ), + "white-space": ( + property: white-space, + class: text, + values: ( + wrap: normal, + nowrap: nowrap, + ) + ), + "word-wrap": ( + property: word-wrap word-break, + class: text, + values: (break: break-word), + rtl: false + ), + // scss-docs-end utils-text + // scss-docs-start utils-color + "color": ( + property: color, + class: text, + local-vars: ( + "text-opacity": 1 + ), + values: map-merge( + $utilities-text-colors, + ( + "muted": var(--#{$prefix}secondary-color), // deprecated + "black-50": rgba($black, .5), // deprecated + "white-50": rgba($white, .5), // deprecated + "body-secondary": var(--#{$prefix}secondary-color), + "body-tertiary": var(--#{$prefix}tertiary-color), + "body-emphasis": var(--#{$prefix}emphasis-color), + "reset": inherit, + ) + ) + ), + "text-opacity": ( + css-var: true, + class: text-opacity, + values: ( + 25: .25, + 50: .5, + 75: .75, + 100: 1 + ) + ), + "text-color": ( + property: color, + class: text, + values: $utilities-text-emphasis-colors + ), + // scss-docs-end utils-color + // scss-docs-start utils-links + "link-opacity": ( + css-var: true, + class: link-opacity, + state: hover, + values: ( + 10: .1, + 25: .25, + 50: .5, + 75: .75, + 100: 1 + ) + ), + "link-offset": ( + property: text-underline-offset, + class: link-offset, + state: hover, + values: ( + 1: .125em, + 2: .25em, + 3: .375em, + ) + ), + "link-underline": ( + property: text-decoration-color, + class: link-underline, + local-vars: ( + "link-underline-opacity": 1 + ), + values: map-merge( + $utilities-links-underline, + ( + null: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-underline-opacity, 1)), + ) + ) + ), + "link-underline-opacity": ( + css-var: true, + class: link-underline-opacity, + state: hover, + values: ( + 0: 0, + 10: .1, + 25: .25, + 50: .5, + 75: .75, + 100: 1 + ), + ), + // scss-docs-end utils-links + // scss-docs-start utils-bg-color + "background-color": ( + property: background-color, + class: bg, + local-vars: ( + "bg-opacity": 1 + ), + values: map-merge( + $utilities-bg-colors, + ( + "transparent": transparent, + "body-secondary": rgba(var(--#{$prefix}secondary-bg-rgb), var(--#{$prefix}bg-opacity)), + "body-tertiary": rgba(var(--#{$prefix}tertiary-bg-rgb), var(--#{$prefix}bg-opacity)), + ) + ) + ), + "bg-opacity": ( + css-var: true, + class: bg-opacity, + values: ( + 10: .1, + 25: .25, + 50: .5, + 75: .75, + 100: 1 + ) + ), + "subtle-background-color": ( + property: background-color, + class: bg, + values: $utilities-bg-subtle + ), + // scss-docs-end utils-bg-color + "gradient": ( + property: background-image, + class: bg, + values: (gradient: var(--#{$prefix}gradient)) + ), + // scss-docs-start utils-interaction + "user-select": ( + property: user-select, + values: all auto none + ), + "pointer-events": ( + property: pointer-events, + class: pe, + values: none auto, + ), + // scss-docs-end utils-interaction + // scss-docs-start utils-border-radius + "rounded": ( + property: border-radius, + class: rounded, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + "rounded-top": ( + property: border-top-left-radius border-top-right-radius, + class: rounded-top, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + "rounded-end": ( + property: border-top-right-radius border-bottom-right-radius, + class: rounded-end, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + "rounded-bottom": ( + property: border-bottom-right-radius border-bottom-left-radius, + class: rounded-bottom, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + "rounded-start": ( + property: border-bottom-left-radius border-top-left-radius, + class: rounded-start, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + // scss-docs-end utils-border-radius + // scss-docs-start utils-visibility + "visibility": ( + property: visibility, + class: null, + values: ( + visible: visible, + invisible: hidden, + ) + ), + // scss-docs-end utils-visibility + // scss-docs-start utils-zindex + "z-index": ( + property: z-index, + class: z, + values: $zindex-levels, + ) + // scss-docs-end utils-zindex + ), + $utilities +); diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables-dark.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables-dark.scss new file mode 100644 index 00000000..6422b387 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables-dark.scss @@ -0,0 +1,87 @@ +// Dark color mode variables +// +// Custom variables for the `[data-bs-theme="dark"]` theme. Use this as a starting point for your own custom color modes by creating a new theme-specific file like `_variables-dark.scss` and adding the variables you need. + +// +// Global colors +// + +// scss-docs-start sass-dark-mode-vars +// scss-docs-start theme-text-dark-variables +$primary-text-emphasis-dark: tint-color($primary, 40%) !default; +$secondary-text-emphasis-dark: tint-color($secondary, 40%) !default; +$success-text-emphasis-dark: tint-color($success, 40%) !default; +$info-text-emphasis-dark: tint-color($info, 40%) !default; +$warning-text-emphasis-dark: tint-color($warning, 40%) !default; +$danger-text-emphasis-dark: tint-color($danger, 40%) !default; +$light-text-emphasis-dark: $gray-100 !default; +$dark-text-emphasis-dark: $gray-300 !default; +// scss-docs-end theme-text-dark-variables + +// scss-docs-start theme-bg-subtle-dark-variables +$primary-bg-subtle-dark: shade-color($primary, 80%) !default; +$secondary-bg-subtle-dark: shade-color($secondary, 80%) !default; +$success-bg-subtle-dark: shade-color($success, 80%) !default; +$info-bg-subtle-dark: shade-color($info, 80%) !default; +$warning-bg-subtle-dark: shade-color($warning, 80%) !default; +$danger-bg-subtle-dark: shade-color($danger, 80%) !default; +$light-bg-subtle-dark: $gray-800 !default; +$dark-bg-subtle-dark: mix($gray-800, $black) !default; +// scss-docs-end theme-bg-subtle-dark-variables + +// scss-docs-start theme-border-subtle-dark-variables +$primary-border-subtle-dark: shade-color($primary, 40%) !default; +$secondary-border-subtle-dark: shade-color($secondary, 40%) !default; +$success-border-subtle-dark: shade-color($success, 40%) !default; +$info-border-subtle-dark: shade-color($info, 40%) !default; +$warning-border-subtle-dark: shade-color($warning, 40%) !default; +$danger-border-subtle-dark: shade-color($danger, 40%) !default; +$light-border-subtle-dark: $gray-700 !default; +$dark-border-subtle-dark: $gray-800 !default; +// scss-docs-end theme-border-subtle-dark-variables + +$body-color-dark: $gray-300 !default; +$body-bg-dark: $gray-900 !default; +$body-secondary-color-dark: rgba($body-color-dark, .75) !default; +$body-secondary-bg-dark: $gray-800 !default; +$body-tertiary-color-dark: rgba($body-color-dark, .5) !default; +$body-tertiary-bg-dark: mix($gray-800, $gray-900, 50%) !default; +$body-emphasis-color-dark: $white !default; +$border-color-dark: $gray-700 !default; +$border-color-translucent-dark: rgba($white, .15) !default; +$headings-color-dark: inherit !default; +$link-color-dark: tint-color($primary, 40%) !default; +$link-hover-color-dark: shift-color($link-color-dark, -$link-shade-percentage) !default; +$code-color-dark: tint-color($code-color, 40%) !default; +$mark-color-dark: $body-color-dark !default; +$mark-bg-dark: $yellow-800 !default; + + +// +// Forms +// + +$form-select-indicator-color-dark: $body-color-dark !default; +$form-select-indicator-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color-dark}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>") !default; + +$form-switch-color-dark: rgba($white, .25) !default; +$form-switch-bg-image-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color-dark}'/></svg>") !default; + +// scss-docs-start form-validation-colors-dark +$form-valid-color-dark: $green-300 !default; +$form-valid-border-color-dark: $green-300 !default; +$form-invalid-color-dark: $red-300 !default; +$form-invalid-border-color-dark: $red-300 !default; +// scss-docs-end form-validation-colors-dark + + +// +// Accordion +// + +$accordion-icon-color-dark: $primary-text-emphasis-dark !default; +$accordion-icon-active-color-dark: $primary-text-emphasis-dark !default; + +$accordion-button-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-color-dark}'><path 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-.708z'/></svg>") !default; +$accordion-button-active-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-active-color-dark}'><path 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-.708z'/></svg>") !default; +// scss-docs-end sass-dark-mode-vars diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables.scss new file mode 100644 index 00000000..06531395 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables.scss @@ -0,0 +1,1751 @@ +// Variables +// +// Variables should follow the `$component-state-property-size` formula for +// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs. + +// Color system + +// scss-docs-start gray-color-variables +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #6c757d !default; +$gray-700: #495057 !default; +$gray-800: #343a40 !default; +$gray-900: #212529 !default; +$black: #000 !default; +// scss-docs-end gray-color-variables + +// fusv-disable +// scss-docs-start gray-colors-map +$grays: ( + "100": $gray-100, + "200": $gray-200, + "300": $gray-300, + "400": $gray-400, + "500": $gray-500, + "600": $gray-600, + "700": $gray-700, + "800": $gray-800, + "900": $gray-900 +) !default; +// scss-docs-end gray-colors-map +// fusv-enable + +// scss-docs-start color-variables +$blue: #0d6efd !default; +$indigo: #6610f2 !default; +$purple: #6f42c1 !default; +$pink: #d63384 !default; +$red: #dc3545 !default; +$orange: #fd7e14 !default; +$yellow: #ffc107 !default; +$green: #198754 !default; +$teal: #20c997 !default; +$cyan: #0dcaf0 !default; +// scss-docs-end color-variables + +// scss-docs-start colors-map +$colors: ( + "blue": $blue, + "indigo": $indigo, + "purple": $purple, + "pink": $pink, + "red": $red, + "orange": $orange, + "yellow": $yellow, + "green": $green, + "teal": $teal, + "cyan": $cyan, + "black": $black, + "white": $white, + "gray": $gray-600, + "gray-dark": $gray-800 +) !default; +// scss-docs-end colors-map + +// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7. +// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast +$min-contrast-ratio: 4.5 !default; + +// Customize the light and dark text colors for use in our color contrast function. +$color-contrast-dark: $black !default; +$color-contrast-light: $white !default; + +// fusv-disable +$blue-100: tint-color($blue, 80%) !default; +$blue-200: tint-color($blue, 60%) !default; +$blue-300: tint-color($blue, 40%) !default; +$blue-400: tint-color($blue, 20%) !default; +$blue-500: $blue !default; +$blue-600: shade-color($blue, 20%) !default; +$blue-700: shade-color($blue, 40%) !default; +$blue-800: shade-color($blue, 60%) !default; +$blue-900: shade-color($blue, 80%) !default; + +$indigo-100: tint-color($indigo, 80%) !default; +$indigo-200: tint-color($indigo, 60%) !default; +$indigo-300: tint-color($indigo, 40%) !default; +$indigo-400: tint-color($indigo, 20%) !default; +$indigo-500: $indigo !default; +$indigo-600: shade-color($indigo, 20%) !default; +$indigo-700: shade-color($indigo, 40%) !default; +$indigo-800: shade-color($indigo, 60%) !default; +$indigo-900: shade-color($indigo, 80%) !default; + +$purple-100: tint-color($purple, 80%) !default; +$purple-200: tint-color($purple, 60%) !default; +$purple-300: tint-color($purple, 40%) !default; +$purple-400: tint-color($purple, 20%) !default; +$purple-500: $purple !default; +$purple-600: shade-color($purple, 20%) !default; +$purple-700: shade-color($purple, 40%) !default; +$purple-800: shade-color($purple, 60%) !default; +$purple-900: shade-color($purple, 80%) !default; + +$pink-100: tint-color($pink, 80%) !default; +$pink-200: tint-color($pink, 60%) !default; +$pink-300: tint-color($pink, 40%) !default; +$pink-400: tint-color($pink, 20%) !default; +$pink-500: $pink !default; +$pink-600: shade-color($pink, 20%) !default; +$pink-700: shade-color($pink, 40%) !default; +$pink-800: shade-color($pink, 60%) !default; +$pink-900: shade-color($pink, 80%) !default; + +$red-100: tint-color($red, 80%) !default; +$red-200: tint-color($red, 60%) !default; +$red-300: tint-color($red, 40%) !default; +$red-400: tint-color($red, 20%) !default; +$red-500: $red !default; +$red-600: shade-color($red, 20%) !default; +$red-700: shade-color($red, 40%) !default; +$red-800: shade-color($red, 60%) !default; +$red-900: shade-color($red, 80%) !default; + +$orange-100: tint-color($orange, 80%) !default; +$orange-200: tint-color($orange, 60%) !default; +$orange-300: tint-color($orange, 40%) !default; +$orange-400: tint-color($orange, 20%) !default; +$orange-500: $orange !default; +$orange-600: shade-color($orange, 20%) !default; +$orange-700: shade-color($orange, 40%) !default; +$orange-800: shade-color($orange, 60%) !default; +$orange-900: shade-color($orange, 80%) !default; + +$yellow-100: tint-color($yellow, 80%) !default; +$yellow-200: tint-color($yellow, 60%) !default; +$yellow-300: tint-color($yellow, 40%) !default; +$yellow-400: tint-color($yellow, 20%) !default; +$yellow-500: $yellow !default; +$yellow-600: shade-color($yellow, 20%) !default; +$yellow-700: shade-color($yellow, 40%) !default; +$yellow-800: shade-color($yellow, 60%) !default; +$yellow-900: shade-color($yellow, 80%) !default; + +$green-100: tint-color($green, 80%) !default; +$green-200: tint-color($green, 60%) !default; +$green-300: tint-color($green, 40%) !default; +$green-400: tint-color($green, 20%) !default; +$green-500: $green !default; +$green-600: shade-color($green, 20%) !default; +$green-700: shade-color($green, 40%) !default; +$green-800: shade-color($green, 60%) !default; +$green-900: shade-color($green, 80%) !default; + +$teal-100: tint-color($teal, 80%) !default; +$teal-200: tint-color($teal, 60%) !default; +$teal-300: tint-color($teal, 40%) !default; +$teal-400: tint-color($teal, 20%) !default; +$teal-500: $teal !default; +$teal-600: shade-color($teal, 20%) !default; +$teal-700: shade-color($teal, 40%) !default; +$teal-800: shade-color($teal, 60%) !default; +$teal-900: shade-color($teal, 80%) !default; + +$cyan-100: tint-color($cyan, 80%) !default; +$cyan-200: tint-color($cyan, 60%) !default; +$cyan-300: tint-color($cyan, 40%) !default; +$cyan-400: tint-color($cyan, 20%) !default; +$cyan-500: $cyan !default; +$cyan-600: shade-color($cyan, 20%) !default; +$cyan-700: shade-color($cyan, 40%) !default; +$cyan-800: shade-color($cyan, 60%) !default; +$cyan-900: shade-color($cyan, 80%) !default; + +$blues: ( + "blue-100": $blue-100, + "blue-200": $blue-200, + "blue-300": $blue-300, + "blue-400": $blue-400, + "blue-500": $blue-500, + "blue-600": $blue-600, + "blue-700": $blue-700, + "blue-800": $blue-800, + "blue-900": $blue-900 +) !default; + +$indigos: ( + "indigo-100": $indigo-100, + "indigo-200": $indigo-200, + "indigo-300": $indigo-300, + "indigo-400": $indigo-400, + "indigo-500": $indigo-500, + "indigo-600": $indigo-600, + "indigo-700": $indigo-700, + "indigo-800": $indigo-800, + "indigo-900": $indigo-900 +) !default; + +$purples: ( + "purple-100": $purple-100, + "purple-200": $purple-200, + "purple-300": $purple-300, + "purple-400": $purple-400, + "purple-500": $purple-500, + "purple-600": $purple-600, + "purple-700": $purple-700, + "purple-800": $purple-800, + "purple-900": $purple-900 +) !default; + +$pinks: ( + "pink-100": $pink-100, + "pink-200": $pink-200, + "pink-300": $pink-300, + "pink-400": $pink-400, + "pink-500": $pink-500, + "pink-600": $pink-600, + "pink-700": $pink-700, + "pink-800": $pink-800, + "pink-900": $pink-900 +) !default; + +$reds: ( + "red-100": $red-100, + "red-200": $red-200, + "red-300": $red-300, + "red-400": $red-400, + "red-500": $red-500, + "red-600": $red-600, + "red-700": $red-700, + "red-800": $red-800, + "red-900": $red-900 +) !default; + +$oranges: ( + "orange-100": $orange-100, + "orange-200": $orange-200, + "orange-300": $orange-300, + "orange-400": $orange-400, + "orange-500": $orange-500, + "orange-600": $orange-600, + "orange-700": $orange-700, + "orange-800": $orange-800, + "orange-900": $orange-900 +) !default; + +$yellows: ( + "yellow-100": $yellow-100, + "yellow-200": $yellow-200, + "yellow-300": $yellow-300, + "yellow-400": $yellow-400, + "yellow-500": $yellow-500, + "yellow-600": $yellow-600, + "yellow-700": $yellow-700, + "yellow-800": $yellow-800, + "yellow-900": $yellow-900 +) !default; + +$greens: ( + "green-100": $green-100, + "green-200": $green-200, + "green-300": $green-300, + "green-400": $green-400, + "green-500": $green-500, + "green-600": $green-600, + "green-700": $green-700, + "green-800": $green-800, + "green-900": $green-900 +) !default; + +$teals: ( + "teal-100": $teal-100, + "teal-200": $teal-200, + "teal-300": $teal-300, + "teal-400": $teal-400, + "teal-500": $teal-500, + "teal-600": $teal-600, + "teal-700": $teal-700, + "teal-800": $teal-800, + "teal-900": $teal-900 +) !default; + +$cyans: ( + "cyan-100": $cyan-100, + "cyan-200": $cyan-200, + "cyan-300": $cyan-300, + "cyan-400": $cyan-400, + "cyan-500": $cyan-500, + "cyan-600": $cyan-600, + "cyan-700": $cyan-700, + "cyan-800": $cyan-800, + "cyan-900": $cyan-900 +) !default; +// fusv-enable + +// scss-docs-start theme-color-variables +$primary: $blue !default; +$secondary: $gray-600 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $gray-100 !default; +$dark: $gray-900 !default; +// scss-docs-end theme-color-variables + +// scss-docs-start theme-colors-map +$theme-colors: ( + "primary": $primary, + "secondary": $secondary, + "success": $success, + "info": $info, + "warning": $warning, + "danger": $danger, + "light": $light, + "dark": $dark +) !default; +// scss-docs-end theme-colors-map + +// scss-docs-start theme-text-variables +$primary-text-emphasis: shade-color($primary, 60%) !default; +$secondary-text-emphasis: shade-color($secondary, 60%) !default; +$success-text-emphasis: shade-color($success, 60%) !default; +$info-text-emphasis: shade-color($info, 60%) !default; +$warning-text-emphasis: shade-color($warning, 60%) !default; +$danger-text-emphasis: shade-color($danger, 60%) !default; +$light-text-emphasis: $gray-700 !default; +$dark-text-emphasis: $gray-700 !default; +// scss-docs-end theme-text-variables + +// scss-docs-start theme-bg-subtle-variables +$primary-bg-subtle: tint-color($primary, 80%) !default; +$secondary-bg-subtle: tint-color($secondary, 80%) !default; +$success-bg-subtle: tint-color($success, 80%) !default; +$info-bg-subtle: tint-color($info, 80%) !default; +$warning-bg-subtle: tint-color($warning, 80%) !default; +$danger-bg-subtle: tint-color($danger, 80%) !default; +$light-bg-subtle: mix($gray-100, $white) !default; +$dark-bg-subtle: $gray-400 !default; +// scss-docs-end theme-bg-subtle-variables + +// scss-docs-start theme-border-subtle-variables +$primary-border-subtle: tint-color($primary, 60%) !default; +$secondary-border-subtle: tint-color($secondary, 60%) !default; +$success-border-subtle: tint-color($success, 60%) !default; +$info-border-subtle: tint-color($info, 60%) !default; +$warning-border-subtle: tint-color($warning, 60%) !default; +$danger-border-subtle: tint-color($danger, 60%) !default; +$light-border-subtle: $gray-200 !default; +$dark-border-subtle: $gray-500 !default; +// scss-docs-end theme-border-subtle-variables + +// Characters which are escaped by the escape-svg function +$escaped-characters: ( + ("<", "%3c"), + (">", "%3e"), + ("#", "%23"), + ("(", "%28"), + (")", "%29"), +) !default; + +// Options +// +// Quickly modify global styling by enabling or disabling optional features. + +$enable-caret: true !default; +$enable-rounded: true !default; +$enable-shadows: false !default; +$enable-gradients: false !default; +$enable-transitions: true !default; +$enable-reduced-motion: true !default; +$enable-smooth-scroll: true !default; +$enable-grid-classes: true !default; +$enable-container-classes: true !default; +$enable-cssgrid: false !default; +$enable-button-pointers: true !default; +$enable-rfs: true !default; +$enable-validation-icons: true !default; +$enable-negative-margins: false !default; +$enable-deprecation-messages: true !default; +$enable-important-utilities: true !default; + +$enable-dark-mode: true !default; +$color-mode-type: data !default; // `data` or `media-query` + +// Prefix for :root CSS variables + +$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix` +$prefix: $variable-prefix !default; + +// Gradient +// +// The gradient which is added to components if `$enable-gradients` is `true` +// This gradient is also added to elements with `.bg-gradient` +// scss-docs-start variable-gradient +$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default; +// scss-docs-end variable-gradient + +// Spacing +// +// Control the default styling of most Bootstrap elements by modifying these +// variables. Mostly focused on spacing. +// You can add more entries to the $spacers map, should you need more variation. + +// scss-docs-start spacer-variables-maps +$spacer: 1rem !default; +$spacers: ( + 0: 0, + 1: $spacer * .25, + 2: $spacer * .5, + 3: $spacer, + 4: $spacer * 1.5, + 5: $spacer * 3, +) !default; +// scss-docs-end spacer-variables-maps + +// Position +// +// Define the edge positioning anchors of the position utilities. + +// scss-docs-start position-map +$position-values: ( + 0: 0, + 50: 50%, + 100: 100% +) !default; +// scss-docs-end position-map + +// Body +// +// Settings for the `<body>` element. + +$body-text-align: null !default; +$body-color: $gray-900 !default; +$body-bg: $white !default; + +$body-secondary-color: rgba($body-color, .75) !default; +$body-secondary-bg: $gray-200 !default; + +$body-tertiary-color: rgba($body-color, .5) !default; +$body-tertiary-bg: $gray-100 !default; + +$body-emphasis-color: $black !default; + +// Links +// +// Style anchor elements. + +$link-color: $primary !default; +$link-decoration: underline !default; +$link-shade-percentage: 20% !default; +$link-hover-color: shift-color($link-color, $link-shade-percentage) !default; +$link-hover-decoration: null !default; + +$stretched-link-pseudo-element: after !default; +$stretched-link-z-index: 1 !default; + +// Icon links +// scss-docs-start icon-link-variables +$icon-link-gap: .375rem !default; +$icon-link-underline-offset: .25em !default; +$icon-link-icon-size: 1em !default; +$icon-link-icon-transition: .2s ease-in-out transform !default; +$icon-link-icon-transform: translate3d(.25em, 0, 0) !default; +// scss-docs-end icon-link-variables + +// Paragraphs +// +// Style p element. + +$paragraph-margin-bottom: 1rem !default; + + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +// scss-docs-start grid-breakpoints +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px, + xxl: 1400px +) !default; +// scss-docs-end grid-breakpoints + +@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); +@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints"); + + +// Grid containers +// +// Define the maximum width of `.container` for different screen sizes. + +// scss-docs-start container-max-widths +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1140px, + xxl: 1320px +) !default; +// scss-docs-end container-max-widths + +@include _assert-ascending($container-max-widths, "$container-max-widths"); + + +// Grid columns +// +// Set the number of columns and specify the width of the gutters. + +$grid-columns: 12 !default; +$grid-gutter-width: 1.5rem !default; +$grid-row-columns: 6 !default; + +// Container padding + +$container-padding-x: $grid-gutter-width !default; + + +// Components +// +// Define common padding and border radius sizes and more. + +// scss-docs-start border-variables +$border-width: 1px !default; +$border-widths: ( + 1: 1px, + 2: 2px, + 3: 3px, + 4: 4px, + 5: 5px +) !default; +$border-style: solid !default; +$border-color: $gray-300 !default; +$border-color-translucent: rgba($black, .175) !default; +// scss-docs-end border-variables + +// scss-docs-start border-radius-variables +$border-radius: .375rem !default; +$border-radius-sm: .25rem !default; +$border-radius-lg: .5rem !default; +$border-radius-xl: 1rem !default; +$border-radius-xxl: 2rem !default; +$border-radius-pill: 50rem !default; +// scss-docs-end border-radius-variables +// fusv-disable +$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0 +// fusv-enable + +// scss-docs-start box-shadow-variables +$box-shadow: 0 .5rem 1rem rgba($black, .15) !default; +$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default; +$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default; +$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default; +// scss-docs-end box-shadow-variables + +$component-active-color: $white !default; +$component-active-bg: $primary !default; + +// scss-docs-start focus-ring-variables +$focus-ring-width: .25rem !default; +$focus-ring-opacity: .25 !default; +$focus-ring-color: rgba($primary, $focus-ring-opacity) !default; +$focus-ring-blur: 0 !default; +$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default; +// scss-docs-end focus-ring-variables + +// scss-docs-start caret-variables +$caret-width: .3em !default; +$caret-vertical-align: $caret-width * .85 !default; +$caret-spacing: $caret-width * .85 !default; +// scss-docs-end caret-variables + +$transition-base: all .2s ease-in-out !default; +$transition-fade: opacity .15s linear !default; +// scss-docs-start collapse-transition +$transition-collapse: height .35s ease !default; +$transition-collapse-width: width .35s ease !default; +// scss-docs-end collapse-transition + +// stylelint-disable function-disallowed-list +// scss-docs-start aspect-ratios +$aspect-ratios: ( + "1x1": 100%, + "4x3": calc(3 / 4 * 100%), + "16x9": calc(9 / 16 * 100%), + "21x9": calc(9 / 21 * 100%) +) !default; +// scss-docs-end aspect-ratios +// stylelint-enable function-disallowed-list + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +// scss-docs-start font-variables +// stylelint-disable value-keyword-case +$font-family-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" !default; +$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; +// stylelint-enable value-keyword-case +$font-family-base: var(--#{$prefix}font-sans-serif) !default; +$font-family-code: var(--#{$prefix}font-monospace) !default; + +// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins +// $font-size-base affects the font size of the body text +$font-size-root: null !default; +$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` +$font-size-sm: $font-size-base * .875 !default; +$font-size-lg: $font-size-base * 1.25 !default; + +$font-weight-lighter: lighter !default; +$font-weight-light: 300 !default; +$font-weight-normal: 400 !default; +$font-weight-medium: 500 !default; +$font-weight-semibold: 600 !default; +$font-weight-bold: 700 !default; +$font-weight-bolder: bolder !default; + +$font-weight-base: $font-weight-normal !default; + +$line-height-base: 1.5 !default; +$line-height-sm: 1.25 !default; +$line-height-lg: 2 !default; + +$h1-font-size: $font-size-base * 2.5 !default; +$h2-font-size: $font-size-base * 2 !default; +$h3-font-size: $font-size-base * 1.75 !default; +$h4-font-size: $font-size-base * 1.5 !default; +$h5-font-size: $font-size-base * 1.25 !default; +$h6-font-size: $font-size-base !default; +// scss-docs-end font-variables + +// scss-docs-start font-sizes +$font-sizes: ( + 1: $h1-font-size, + 2: $h2-font-size, + 3: $h3-font-size, + 4: $h4-font-size, + 5: $h5-font-size, + 6: $h6-font-size +) !default; +// scss-docs-end font-sizes + +// scss-docs-start headings-variables +$headings-margin-bottom: $spacer * .5 !default; +$headings-font-family: null !default; +$headings-font-style: null !default; +$headings-font-weight: 500 !default; +$headings-line-height: 1.2 !default; +$headings-color: inherit !default; +// scss-docs-end headings-variables + +// scss-docs-start display-headings +$display-font-sizes: ( + 1: 5rem, + 2: 4.5rem, + 3: 4rem, + 4: 3.5rem, + 5: 3rem, + 6: 2.5rem +) !default; + +$display-font-family: null !default; +$display-font-style: null !default; +$display-font-weight: 300 !default; +$display-line-height: $headings-line-height !default; +// scss-docs-end display-headings + +// scss-docs-start type-variables +$lead-font-size: $font-size-base * 1.25 !default; +$lead-font-weight: 300 !default; + +$small-font-size: .875em !default; + +$sub-sup-font-size: .75em !default; + +// fusv-disable +$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0 +// fusv-enable + +$initialism-font-size: $small-font-size !default; + +$blockquote-margin-y: $spacer !default; +$blockquote-font-size: $font-size-base * 1.25 !default; +$blockquote-footer-color: $gray-600 !default; +$blockquote-footer-font-size: $small-font-size !default; + +$hr-margin-y: $spacer !default; +$hr-color: inherit !default; + +// fusv-disable +$hr-bg-color: null !default; // Deprecated in v5.2.0 +$hr-height: null !default; // Deprecated in v5.2.0 +// fusv-enable + +$hr-border-color: null !default; // Allows for inherited colors +$hr-border-width: var(--#{$prefix}border-width) !default; +$hr-opacity: .25 !default; + +// scss-docs-start vr-variables +$vr-border-width: var(--#{$prefix}border-width) !default; +// scss-docs-end vr-variables + +$legend-margin-bottom: .5rem !default; +$legend-font-size: 1.5rem !default; +$legend-font-weight: null !default; + +$dt-font-weight: $font-weight-bold !default; + +$list-inline-padding: .5rem !default; + +$mark-padding: .1875em !default; +$mark-color: $body-color !default; +$mark-bg: $yellow-100 !default; +// scss-docs-end type-variables + + +// Tables +// +// Customizes the `.table` component with basic values, each used across all table variations. + +// scss-docs-start table-variables +$table-cell-padding-y: .5rem !default; +$table-cell-padding-x: .5rem !default; +$table-cell-padding-y-sm: .25rem !default; +$table-cell-padding-x-sm: .25rem !default; + +$table-cell-vertical-align: top !default; + +$table-color: var(--#{$prefix}emphasis-color) !default; +$table-bg: var(--#{$prefix}body-bg) !default; +$table-accent-bg: transparent !default; + +$table-th-font-weight: null !default; + +$table-striped-color: $table-color !default; +$table-striped-bg-factor: .05 !default; +$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default; + +$table-active-color: $table-color !default; +$table-active-bg-factor: .1 !default; +$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default; + +$table-hover-color: $table-color !default; +$table-hover-bg-factor: .075 !default; +$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default; + +$table-border-factor: .2 !default; +$table-border-width: var(--#{$prefix}border-width) !default; +$table-border-color: var(--#{$prefix}border-color) !default; + +$table-striped-order: odd !default; +$table-striped-columns-order: even !default; + +$table-group-separator-color: currentcolor !default; + +$table-caption-color: var(--#{$prefix}secondary-color) !default; + +$table-bg-scale: -80% !default; +// scss-docs-end table-variables + +// scss-docs-start table-loop +$table-variants: ( + "primary": shift-color($primary, $table-bg-scale), + "secondary": shift-color($secondary, $table-bg-scale), + "success": shift-color($success, $table-bg-scale), + "info": shift-color($info, $table-bg-scale), + "warning": shift-color($warning, $table-bg-scale), + "danger": shift-color($danger, $table-bg-scale), + "light": $light, + "dark": $dark, +) !default; +// scss-docs-end table-loop + + +// Buttons + Forms +// +// Shared variables that are reassigned to `$input-` and `$btn-` specific variables. + +// scss-docs-start input-btn-variables +$input-btn-padding-y: .375rem !default; +$input-btn-padding-x: .75rem !default; +$input-btn-font-family: null !default; +$input-btn-font-size: $font-size-base !default; +$input-btn-line-height: $line-height-base !default; + +$input-btn-focus-width: $focus-ring-width !default; +$input-btn-focus-color-opacity: $focus-ring-opacity !default; +$input-btn-focus-color: $focus-ring-color !default; +$input-btn-focus-blur: $focus-ring-blur !default; +$input-btn-focus-box-shadow: $focus-ring-box-shadow !default; + +$input-btn-padding-y-sm: .25rem !default; +$input-btn-padding-x-sm: .5rem !default; +$input-btn-font-size-sm: $font-size-sm !default; + +$input-btn-padding-y-lg: .5rem !default; +$input-btn-padding-x-lg: 1rem !default; +$input-btn-font-size-lg: $font-size-lg !default; + +$input-btn-border-width: var(--#{$prefix}border-width) !default; +// scss-docs-end input-btn-variables + + +// Buttons +// +// For each of Bootstrap's buttons, define text, background, and border color. + +// scss-docs-start btn-variables +$btn-color: var(--#{$prefix}body-color) !default; +$btn-padding-y: $input-btn-padding-y !default; +$btn-padding-x: $input-btn-padding-x !default; +$btn-font-family: $input-btn-font-family !default; +$btn-font-size: $input-btn-font-size !default; +$btn-line-height: $input-btn-line-height !default; +$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping + +$btn-padding-y-sm: $input-btn-padding-y-sm !default; +$btn-padding-x-sm: $input-btn-padding-x-sm !default; +$btn-font-size-sm: $input-btn-font-size-sm !default; + +$btn-padding-y-lg: $input-btn-padding-y-lg !default; +$btn-padding-x-lg: $input-btn-padding-x-lg !default; +$btn-font-size-lg: $input-btn-font-size-lg !default; + +$btn-border-width: $input-btn-border-width !default; + +$btn-font-weight: $font-weight-normal !default; +$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default; +$btn-focus-width: $input-btn-focus-width !default; +$btn-focus-box-shadow: $input-btn-focus-box-shadow !default; +$btn-disabled-opacity: .65 !default; +$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default; + +$btn-link-color: var(--#{$prefix}link-color) !default; +$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default; +$btn-link-disabled-color: $gray-600 !default; +$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default; + +// Allows for customizing button radius independently from global border radius +$btn-border-radius: var(--#{$prefix}border-radius) !default; +$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; +$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; + +$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + +$btn-hover-bg-shade-amount: 15% !default; +$btn-hover-bg-tint-amount: 15% !default; +$btn-hover-border-shade-amount: 20% !default; +$btn-hover-border-tint-amount: 10% !default; +$btn-active-bg-shade-amount: 20% !default; +$btn-active-bg-tint-amount: 20% !default; +$btn-active-border-shade-amount: 25% !default; +$btn-active-border-tint-amount: 10% !default; +// scss-docs-end btn-variables + + +// Forms + +// scss-docs-start form-text-variables +$form-text-margin-top: .25rem !default; +$form-text-font-size: $small-font-size !default; +$form-text-font-style: null !default; +$form-text-font-weight: null !default; +$form-text-color: var(--#{$prefix}secondary-color) !default; +// scss-docs-end form-text-variables + +// scss-docs-start form-label-variables +$form-label-margin-bottom: .5rem !default; +$form-label-font-size: null !default; +$form-label-font-style: null !default; +$form-label-font-weight: null !default; +$form-label-color: null !default; +// scss-docs-end form-label-variables + +// scss-docs-start form-input-variables +$input-padding-y: $input-btn-padding-y !default; +$input-padding-x: $input-btn-padding-x !default; +$input-font-family: $input-btn-font-family !default; +$input-font-size: $input-btn-font-size !default; +$input-font-weight: $font-weight-base !default; +$input-line-height: $input-btn-line-height !default; + +$input-padding-y-sm: $input-btn-padding-y-sm !default; +$input-padding-x-sm: $input-btn-padding-x-sm !default; +$input-font-size-sm: $input-btn-font-size-sm !default; + +$input-padding-y-lg: $input-btn-padding-y-lg !default; +$input-padding-x-lg: $input-btn-padding-x-lg !default; +$input-font-size-lg: $input-btn-font-size-lg !default; + +$input-bg: var(--#{$prefix}body-bg) !default; +$input-disabled-color: null !default; +$input-disabled-bg: var(--#{$prefix}secondary-bg) !default; +$input-disabled-border-color: null !default; + +$input-color: var(--#{$prefix}body-color) !default; +$input-border-color: var(--#{$prefix}border-color) !default; +$input-border-width: $input-btn-border-width !default; +$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default; + +$input-border-radius: var(--#{$prefix}border-radius) !default; +$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; +$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; + +$input-focus-bg: $input-bg !default; +$input-focus-border-color: tint-color($component-active-bg, 50%) !default; +$input-focus-color: $input-color !default; +$input-focus-width: $input-btn-focus-width !default; +$input-focus-box-shadow: $input-btn-focus-box-shadow !default; + +$input-placeholder-color: var(--#{$prefix}secondary-color) !default; +$input-plaintext-color: var(--#{$prefix}body-color) !default; + +$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list + +$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default; +$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default; +$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default; + +$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default; +$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default; +$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default; + +$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + +$form-color-width: 3rem !default; +// scss-docs-end form-input-variables + +// scss-docs-start form-check-variables +$form-check-input-width: 1em !default; +$form-check-min-height: $font-size-base * $line-height-base !default; +$form-check-padding-start: $form-check-input-width + .5em !default; +$form-check-margin-bottom: .125rem !default; +$form-check-label-color: null !default; +$form-check-label-cursor: null !default; +$form-check-transition: null !default; + +$form-check-input-active-filter: brightness(90%) !default; + +$form-check-input-bg: $input-bg !default; +$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default; +$form-check-input-border-radius: .25em !default; +$form-check-radio-border-radius: 50% !default; +$form-check-input-focus-border: $input-focus-border-color !default; +$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default; + +$form-check-input-checked-color: $component-active-color !default; +$form-check-input-checked-bg-color: $component-active-bg !default; +$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default; +$form-check-input-checked-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-checked-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/></svg>") !default; +$form-check-radio-checked-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$form-check-input-checked-color}'/></svg>") !default; + +$form-check-input-indeterminate-color: $component-active-color !default; +$form-check-input-indeterminate-bg-color: $component-active-bg !default; +$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default; +$form-check-input-indeterminate-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-indeterminate-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>") !default; + +$form-check-input-disabled-opacity: .5 !default; +$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default; +$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default; + +$form-check-inline-margin-end: 1rem !default; +// scss-docs-end form-check-variables + +// scss-docs-start form-switch-variables +$form-switch-color: rgba($black, .25) !default; +$form-switch-width: 2em !default; +$form-switch-padding-start: $form-switch-width + .5em !default; +$form-switch-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color}'/></svg>") !default; +$form-switch-border-radius: $form-switch-width !default; +$form-switch-transition: background-position .15s ease-in-out !default; + +$form-switch-focus-color: $input-focus-border-color !default; +$form-switch-focus-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-focus-color}'/></svg>") !default; + +$form-switch-checked-color: $component-active-color !default; +$form-switch-checked-bg-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-checked-color}'/></svg>") !default; +$form-switch-checked-bg-position: right center !default; +// scss-docs-end form-switch-variables + +// scss-docs-start input-group-variables +$input-group-addon-padding-y: $input-padding-y !default; +$input-group-addon-padding-x: $input-padding-x !default; +$input-group-addon-font-weight: $input-font-weight !default; +$input-group-addon-color: $input-color !default; +$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default; +$input-group-addon-border-color: $input-border-color !default; +// scss-docs-end input-group-variables + +// scss-docs-start form-select-variables +$form-select-padding-y: $input-padding-y !default; +$form-select-padding-x: $input-padding-x !default; +$form-select-font-family: $input-font-family !default; +$form-select-font-size: $input-font-size !default; +$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image +$form-select-font-weight: $input-font-weight !default; +$form-select-line-height: $input-line-height !default; +$form-select-color: $input-color !default; +$form-select-bg: $input-bg !default; +$form-select-disabled-color: null !default; +$form-select-disabled-bg: $input-disabled-bg !default; +$form-select-disabled-border-color: $input-disabled-border-color !default; +$form-select-bg-position: right $form-select-padding-x center !default; +$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions +$form-select-indicator-color: $gray-800 !default; +$form-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>") !default; + +$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default; +$form-select-feedback-icon-position: center right $form-select-indicator-padding !default; +$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default; + +$form-select-border-width: $input-border-width !default; +$form-select-border-color: $input-border-color !default; +$form-select-border-radius: $input-border-radius !default; +$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default; + +$form-select-focus-border-color: $input-focus-border-color !default; +$form-select-focus-width: $input-focus-width !default; +$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default; + +$form-select-padding-y-sm: $input-padding-y-sm !default; +$form-select-padding-x-sm: $input-padding-x-sm !default; +$form-select-font-size-sm: $input-font-size-sm !default; +$form-select-border-radius-sm: $input-border-radius-sm !default; + +$form-select-padding-y-lg: $input-padding-y-lg !default; +$form-select-padding-x-lg: $input-padding-x-lg !default; +$form-select-font-size-lg: $input-font-size-lg !default; +$form-select-border-radius-lg: $input-border-radius-lg !default; + +$form-select-transition: $input-transition !default; +// scss-docs-end form-select-variables + +// scss-docs-start form-range-variables +$form-range-track-width: 100% !default; +$form-range-track-height: .5rem !default; +$form-range-track-cursor: pointer !default; +$form-range-track-bg: var(--#{$prefix}secondary-bg) !default; +$form-range-track-border-radius: 1rem !default; +$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default; + +$form-range-thumb-width: 1rem !default; +$form-range-thumb-height: $form-range-thumb-width !default; +$form-range-thumb-bg: $component-active-bg !default; +$form-range-thumb-border: 0 !default; +$form-range-thumb-border-radius: 1rem !default; +$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default; +$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default; +$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge +$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default; +$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default; +$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; +// scss-docs-end form-range-variables + +// scss-docs-start form-file-variables +$form-file-button-color: $input-color !default; +$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default; +$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default; +// scss-docs-end form-file-variables + +// scss-docs-start form-floating-variables +$form-floating-height: add(3.5rem, $input-height-border) !default; +$form-floating-line-height: 1.25 !default; +$form-floating-padding-x: $input-padding-x !default; +$form-floating-padding-y: 1rem !default; +$form-floating-input-padding-t: 1.625rem !default; +$form-floating-input-padding-b: .625rem !default; +$form-floating-label-height: 1.5em !default; +$form-floating-label-opacity: .65 !default; +$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default; +$form-floating-label-disabled-color: $gray-600 !default; +$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default; +// scss-docs-end form-floating-variables + +// Form validation + +// scss-docs-start form-feedback-variables +$form-feedback-margin-top: $form-text-margin-top !default; +$form-feedback-font-size: $form-text-font-size !default; +$form-feedback-font-style: $form-text-font-style !default; +$form-feedback-valid-color: $success !default; +$form-feedback-invalid-color: $danger !default; + +$form-feedback-icon-valid-color: $form-feedback-valid-color !default; +$form-feedback-icon-valid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' 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.1z'/></svg>") !default; +$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default; +$form-feedback-icon-invalid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>") !default; +// scss-docs-end form-feedback-variables + +// scss-docs-start form-validation-colors +$form-valid-color: $form-feedback-valid-color !default; +$form-valid-border-color: $form-feedback-valid-color !default; +$form-invalid-color: $form-feedback-invalid-color !default; +$form-invalid-border-color: $form-feedback-invalid-color !default; +// scss-docs-end form-validation-colors + +// scss-docs-start form-validation-states +$form-validation-states: ( + "valid": ( + "color": var(--#{$prefix}form-valid-color), + "icon": $form-feedback-icon-valid, + "tooltip-color": #fff, + "tooltip-bg-color": var(--#{$prefix}success), + "focus-box-shadow": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity), + "border-color": var(--#{$prefix}form-valid-border-color), + ), + "invalid": ( + "color": var(--#{$prefix}form-invalid-color), + "icon": $form-feedback-icon-invalid, + "tooltip-color": #fff, + "tooltip-bg-color": var(--#{$prefix}danger), + "focus-box-shadow": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity), + "border-color": var(--#{$prefix}form-invalid-border-color), + ) +) !default; +// scss-docs-end form-validation-states + +// Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. + +// scss-docs-start zindex-stack +$zindex-dropdown: 1000 !default; +$zindex-sticky: 1020 !default; +$zindex-fixed: 1030 !default; +$zindex-offcanvas-backdrop: 1040 !default; +$zindex-offcanvas: 1045 !default; +$zindex-modal-backdrop: 1050 !default; +$zindex-modal: 1055 !default; +$zindex-popover: 1070 !default; +$zindex-tooltip: 1080 !default; +$zindex-toast: 1090 !default; +// scss-docs-end zindex-stack + +// scss-docs-start zindex-levels-map +$zindex-levels: ( + n1: -1, + 0: 0, + 1: 1, + 2: 2, + 3: 3 +) !default; +// scss-docs-end zindex-levels-map + + +// Navs + +// scss-docs-start nav-variables +$nav-link-padding-y: .5rem !default; +$nav-link-padding-x: 1rem !default; +$nav-link-font-size: null !default; +$nav-link-font-weight: null !default; +$nav-link-color: var(--#{$prefix}link-color) !default; +$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default; +$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default; +$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default; +$nav-link-focus-box-shadow: $focus-ring-box-shadow !default; + +$nav-tabs-border-color: var(--#{$prefix}border-color) !default; +$nav-tabs-border-width: var(--#{$prefix}border-width) !default; +$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default; +$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default; +$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default; +$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default; +$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default; + +$nav-pills-border-radius: var(--#{$prefix}border-radius) !default; +$nav-pills-link-active-color: $component-active-color !default; +$nav-pills-link-active-bg: $component-active-bg !default; + +$nav-underline-gap: 1rem !default; +$nav-underline-border-width: .125rem !default; +$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default; +// scss-docs-end nav-variables + + +// Navbar + +// scss-docs-start navbar-variables +$navbar-padding-y: $spacer * .5 !default; +$navbar-padding-x: null !default; + +$navbar-nav-link-padding-x: .5rem !default; + +$navbar-brand-font-size: $font-size-lg !default; +// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link +$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default; +$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default; +$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default; +$navbar-brand-margin-end: 1rem !default; + +$navbar-toggler-padding-y: .25rem !default; +$navbar-toggler-padding-x: .75rem !default; +$navbar-toggler-font-size: $font-size-lg !default; +$navbar-toggler-border-radius: $btn-border-radius !default; +$navbar-toggler-focus-width: $btn-focus-width !default; +$navbar-toggler-transition: box-shadow .15s ease-in-out !default; + +$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default; +$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default; +$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default; +$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default; +$navbar-light-icon-color: rgba($body-color, .75) !default; +$navbar-light-toggler-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-light-icon-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>") !default; +$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default; +$navbar-light-brand-color: $navbar-light-active-color !default; +$navbar-light-brand-hover-color: $navbar-light-active-color !default; +// scss-docs-end navbar-variables + +// scss-docs-start navbar-dark-variables +$navbar-dark-color: rgba($white, .55) !default; +$navbar-dark-hover-color: rgba($white, .75) !default; +$navbar-dark-active-color: $white !default; +$navbar-dark-disabled-color: rgba($white, .25) !default; +$navbar-dark-icon-color: $navbar-dark-color !default; +$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-icon-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>") !default; +$navbar-dark-toggler-border-color: rgba($white, .1) !default; +$navbar-dark-brand-color: $navbar-dark-active-color !default; +$navbar-dark-brand-hover-color: $navbar-dark-active-color !default; +// scss-docs-end navbar-dark-variables + + +// Dropdowns +// +// Dropdown menu container and contents. + +// scss-docs-start dropdown-variables +$dropdown-min-width: 10rem !default; +$dropdown-padding-x: 0 !default; +$dropdown-padding-y: .5rem !default; +$dropdown-spacer: .125rem !default; +$dropdown-font-size: $font-size-base !default; +$dropdown-color: var(--#{$prefix}body-color) !default; +$dropdown-bg: var(--#{$prefix}body-bg) !default; +$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default; +$dropdown-border-radius: var(--#{$prefix}border-radius) !default; +$dropdown-border-width: var(--#{$prefix}border-width) !default; +$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list +$dropdown-divider-bg: $dropdown-border-color !default; +$dropdown-divider-margin-y: $spacer * .5 !default; +$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default; + +$dropdown-link-color: var(--#{$prefix}body-color) !default; +$dropdown-link-hover-color: $dropdown-link-color !default; +$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default; + +$dropdown-link-active-color: $component-active-color !default; +$dropdown-link-active-bg: $component-active-bg !default; + +$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default; + +$dropdown-item-padding-y: $spacer * .25 !default; +$dropdown-item-padding-x: $spacer !default; + +$dropdown-header-color: $gray-600 !default; +$dropdown-header-padding-x: $dropdown-item-padding-x !default; +$dropdown-header-padding-y: $dropdown-padding-y !default; +// fusv-disable +$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0 +// fusv-enable +// scss-docs-end dropdown-variables + +// scss-docs-start dropdown-dark-variables +$dropdown-dark-color: $gray-300 !default; +$dropdown-dark-bg: $gray-800 !default; +$dropdown-dark-border-color: $dropdown-border-color !default; +$dropdown-dark-divider-bg: $dropdown-divider-bg !default; +$dropdown-dark-box-shadow: null !default; +$dropdown-dark-link-color: $dropdown-dark-color !default; +$dropdown-dark-link-hover-color: $white !default; +$dropdown-dark-link-hover-bg: rgba($white, .15) !default; +$dropdown-dark-link-active-color: $dropdown-link-active-color !default; +$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default; +$dropdown-dark-link-disabled-color: $gray-500 !default; +$dropdown-dark-header-color: $gray-500 !default; +// scss-docs-end dropdown-dark-variables + + +// Pagination + +// scss-docs-start pagination-variables +$pagination-padding-y: .375rem !default; +$pagination-padding-x: .75rem !default; +$pagination-padding-y-sm: .25rem !default; +$pagination-padding-x-sm: .5rem !default; +$pagination-padding-y-lg: .75rem !default; +$pagination-padding-x-lg: 1.5rem !default; + +$pagination-font-size: $font-size-base !default; + +$pagination-color: var(--#{$prefix}link-color) !default; +$pagination-bg: var(--#{$prefix}body-bg) !default; +$pagination-border-radius: var(--#{$prefix}border-radius) !default; +$pagination-border-width: var(--#{$prefix}border-width) !default; +$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list +$pagination-border-color: var(--#{$prefix}border-color) !default; + +$pagination-focus-color: var(--#{$prefix}link-hover-color) !default; +$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default; +$pagination-focus-box-shadow: $focus-ring-box-shadow !default; +$pagination-focus-outline: 0 !default; + +$pagination-hover-color: var(--#{$prefix}link-hover-color) !default; +$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default; +$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this? + +$pagination-active-color: $component-active-color !default; +$pagination-active-bg: $component-active-bg !default; +$pagination-active-border-color: $component-active-bg !default; + +$pagination-disabled-color: var(--#{$prefix}secondary-color) !default; +$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default; +$pagination-disabled-border-color: var(--#{$prefix}border-color) !default; + +$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + +$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default; +$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default; +// scss-docs-end pagination-variables + + +// Placeholders + +// scss-docs-start placeholders +$placeholder-opacity-max: .5 !default; +$placeholder-opacity-min: .2 !default; +// scss-docs-end placeholders + +// Cards + +// scss-docs-start card-variables +$card-spacer-y: $spacer !default; +$card-spacer-x: $spacer !default; +$card-title-spacer-y: $spacer * .5 !default; +$card-title-color: null !default; +$card-subtitle-color: null !default; +$card-border-width: var(--#{$prefix}border-width) !default; +$card-border-color: var(--#{$prefix}border-color-translucent) !default; +$card-border-radius: var(--#{$prefix}border-radius) !default; +$card-box-shadow: null !default; +$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default; +$card-cap-padding-y: $card-spacer-y * .5 !default; +$card-cap-padding-x: $card-spacer-x !default; +$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default; +$card-cap-color: null !default; +$card-height: null !default; +$card-color: null !default; +$card-bg: var(--#{$prefix}body-bg) !default; +$card-img-overlay-padding: $spacer !default; +$card-group-margin: $grid-gutter-width * .5 !default; +// scss-docs-end card-variables + +// Accordion + +// scss-docs-start accordion-variables +$accordion-padding-y: 1rem !default; +$accordion-padding-x: 1.25rem !default; +$accordion-color: var(--#{$prefix}body-color) !default; +$accordion-bg: var(--#{$prefix}body-bg) !default; +$accordion-border-width: var(--#{$prefix}border-width) !default; +$accordion-border-color: var(--#{$prefix}border-color) !default; +$accordion-border-radius: var(--#{$prefix}border-radius) !default; +$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default; + +$accordion-body-padding-y: $accordion-padding-y !default; +$accordion-body-padding-x: $accordion-padding-x !default; + +$accordion-button-padding-y: $accordion-padding-y !default; +$accordion-button-padding-x: $accordion-padding-x !default; +$accordion-button-color: var(--#{$prefix}body-color) !default; +$accordion-button-bg: var(--#{$prefix}accordion-bg) !default; +$accordion-transition: $btn-transition, border-radius .15s ease !default; +$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default; +$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default; + +// fusv-disable +$accordion-button-focus-border-color: $input-focus-border-color !default; // Deprecated in v5.3.3 +// fusv-enable +$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default; + +$accordion-icon-width: 1.25rem !default; +$accordion-icon-color: $body-color !default; +$accordion-icon-active-color: $primary-text-emphasis !default; +$accordion-icon-transition: transform .2s ease-in-out !default; +$accordion-icon-transform: rotate(-180deg) !default; + +$accordion-button-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-color}' stroke-linecap='round' stroke-linejoin='round'><path d='M2 5L8 11L14 5'/></svg>") !default; +$accordion-button-active-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-active-color}' stroke-linecap='round' stroke-linejoin='round'><path d='M2 5L8 11L14 5'/></svg>") !default; +// scss-docs-end accordion-variables + +// Tooltips + +// scss-docs-start tooltip-variables +$tooltip-font-size: $font-size-sm !default; +$tooltip-max-width: 200px !default; +$tooltip-color: var(--#{$prefix}body-bg) !default; +$tooltip-bg: var(--#{$prefix}emphasis-color) !default; +$tooltip-border-radius: var(--#{$prefix}border-radius) !default; +$tooltip-opacity: .9 !default; +$tooltip-padding-y: $spacer * .25 !default; +$tooltip-padding-x: $spacer * .5 !default; +$tooltip-margin: null !default; // TODO: remove this in v6 + +$tooltip-arrow-width: .8rem !default; +$tooltip-arrow-height: .4rem !default; +// fusv-disable +$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables +// fusv-enable +// scss-docs-end tooltip-variables + +// Form tooltips must come after regular tooltips +// scss-docs-start tooltip-feedback-variables +$form-feedback-tooltip-padding-y: $tooltip-padding-y !default; +$form-feedback-tooltip-padding-x: $tooltip-padding-x !default; +$form-feedback-tooltip-font-size: $tooltip-font-size !default; +$form-feedback-tooltip-line-height: null !default; +$form-feedback-tooltip-opacity: $tooltip-opacity !default; +$form-feedback-tooltip-border-radius: $tooltip-border-radius !default; +// scss-docs-end tooltip-feedback-variables + + +// Popovers + +// scss-docs-start popover-variables +$popover-font-size: $font-size-sm !default; +$popover-bg: var(--#{$prefix}body-bg) !default; +$popover-max-width: 276px !default; +$popover-border-width: var(--#{$prefix}border-width) !default; +$popover-border-color: var(--#{$prefix}border-color-translucent) !default; +$popover-border-radius: var(--#{$prefix}border-radius-lg) !default; +$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list +$popover-box-shadow: var(--#{$prefix}box-shadow) !default; + +$popover-header-font-size: $font-size-base !default; +$popover-header-bg: var(--#{$prefix}secondary-bg) !default; +$popover-header-color: $headings-color !default; +$popover-header-padding-y: .5rem !default; +$popover-header-padding-x: $spacer !default; + +$popover-body-color: var(--#{$prefix}body-color) !default; +$popover-body-padding-y: $spacer !default; +$popover-body-padding-x: $spacer !default; + +$popover-arrow-width: 1rem !default; +$popover-arrow-height: .5rem !default; +// scss-docs-end popover-variables + +// fusv-disable +// Deprecated in Bootstrap 5.2.0 for CSS variables +$popover-arrow-color: $popover-bg !default; +$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default; +// fusv-enable + + +// Toasts + +// scss-docs-start toast-variables +$toast-max-width: 350px !default; +$toast-padding-x: .75rem !default; +$toast-padding-y: .5rem !default; +$toast-font-size: .875rem !default; +$toast-color: null !default; +$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default; +$toast-border-width: var(--#{$prefix}border-width) !default; +$toast-border-color: var(--#{$prefix}border-color-translucent) !default; +$toast-border-radius: var(--#{$prefix}border-radius) !default; +$toast-box-shadow: var(--#{$prefix}box-shadow) !default; +$toast-spacing: $container-padding-x !default; + +$toast-header-color: var(--#{$prefix}secondary-color) !default; +$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default; +$toast-header-border-color: $toast-border-color !default; +// scss-docs-end toast-variables + + +// Badges + +// scss-docs-start badge-variables +$badge-font-size: .75em !default; +$badge-font-weight: $font-weight-bold !default; +$badge-color: $white !default; +$badge-padding-y: .35em !default; +$badge-padding-x: .65em !default; +$badge-border-radius: var(--#{$prefix}border-radius) !default; +// scss-docs-end badge-variables + + +// Modals + +// scss-docs-start modal-variables +$modal-inner-padding: $spacer !default; + +$modal-footer-margin-between: .5rem !default; + +$modal-dialog-margin: .5rem !default; +$modal-dialog-margin-y-sm-up: 1.75rem !default; + +$modal-title-line-height: $line-height-base !default; + +$modal-content-color: null !default; +$modal-content-bg: var(--#{$prefix}body-bg) !default; +$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default; +$modal-content-border-width: var(--#{$prefix}border-width) !default; +$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default; +$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default; +$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default; +$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default; + +$modal-backdrop-bg: $black !default; +$modal-backdrop-opacity: .5 !default; + +$modal-header-border-color: var(--#{$prefix}border-color) !default; +$modal-header-border-width: $modal-content-border-width !default; +$modal-header-padding-y: $modal-inner-padding !default; +$modal-header-padding-x: $modal-inner-padding !default; +$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility + +$modal-footer-bg: null !default; +$modal-footer-border-color: $modal-header-border-color !default; +$modal-footer-border-width: $modal-header-border-width !default; + +$modal-sm: 300px !default; +$modal-md: 500px !default; +$modal-lg: 800px !default; +$modal-xl: 1140px !default; + +$modal-fade-transform: translate(0, -50px) !default; +$modal-show-transform: none !default; +$modal-transition: transform .3s ease-out !default; +$modal-scale-transform: scale(1.02) !default; +// scss-docs-end modal-variables + + +// Alerts +// +// Define alert colors, border radius, and padding. + +// scss-docs-start alert-variables +$alert-padding-y: $spacer !default; +$alert-padding-x: $spacer !default; +$alert-margin-bottom: 1rem !default; +$alert-border-radius: var(--#{$prefix}border-radius) !default; +$alert-link-font-weight: $font-weight-bold !default; +$alert-border-width: var(--#{$prefix}border-width) !default; +$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side +// scss-docs-end alert-variables + +// fusv-disable +$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6 +$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6 +$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6 +// fusv-enable + +// Progress bars + +// scss-docs-start progress-variables +$progress-height: 1rem !default; +$progress-font-size: $font-size-base * .75 !default; +$progress-bg: var(--#{$prefix}secondary-bg) !default; +$progress-border-radius: var(--#{$prefix}border-radius) !default; +$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default; +$progress-bar-color: $white !default; +$progress-bar-bg: $primary !default; +$progress-bar-animation-timing: 1s linear infinite !default; +$progress-bar-transition: width .6s ease !default; +// scss-docs-end progress-variables + + +// List group + +// scss-docs-start list-group-variables +$list-group-color: var(--#{$prefix}body-color) !default; +$list-group-bg: var(--#{$prefix}body-bg) !default; +$list-group-border-color: var(--#{$prefix}border-color) !default; +$list-group-border-width: var(--#{$prefix}border-width) !default; +$list-group-border-radius: var(--#{$prefix}border-radius) !default; + +$list-group-item-padding-y: $spacer * .5 !default; +$list-group-item-padding-x: $spacer !default; +// fusv-disable +$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0 +$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0 +// fusv-enable + +$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default; +$list-group-active-color: $component-active-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border-color: $list-group-active-bg !default; + +$list-group-disabled-color: var(--#{$prefix}secondary-color) !default; +$list-group-disabled-bg: $list-group-bg !default; + +$list-group-action-color: var(--#{$prefix}secondary-color) !default; +$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default; + +$list-group-action-active-color: var(--#{$prefix}body-color) !default; +$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default; +// scss-docs-end list-group-variables + + +// Image thumbnails + +// scss-docs-start thumbnail-variables +$thumbnail-padding: .25rem !default; +$thumbnail-bg: var(--#{$prefix}body-bg) !default; +$thumbnail-border-width: var(--#{$prefix}border-width) !default; +$thumbnail-border-color: var(--#{$prefix}border-color) !default; +$thumbnail-border-radius: var(--#{$prefix}border-radius) !default; +$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default; +// scss-docs-end thumbnail-variables + + +// Figures + +// scss-docs-start figure-variables +$figure-caption-font-size: $small-font-size !default; +$figure-caption-color: var(--#{$prefix}secondary-color) !default; +// scss-docs-end figure-variables + + +// Breadcrumbs + +// scss-docs-start breadcrumb-variables +$breadcrumb-font-size: null !default; +$breadcrumb-padding-y: 0 !default; +$breadcrumb-padding-x: 0 !default; +$breadcrumb-item-padding-x: .5rem !default; +$breadcrumb-margin-bottom: 1rem !default; +$breadcrumb-bg: null !default; +$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default; +$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default; +$breadcrumb-divider: quote("/") !default; +$breadcrumb-divider-flipped: $breadcrumb-divider !default; +$breadcrumb-border-radius: null !default; +// scss-docs-end breadcrumb-variables + +// Carousel + +// scss-docs-start carousel-variables +$carousel-control-color: $white !default; +$carousel-control-width: 15% !default; +$carousel-control-opacity: .5 !default; +$carousel-control-hover-opacity: .9 !default; +$carousel-control-transition: opacity .15s ease !default; + +$carousel-indicator-width: 30px !default; +$carousel-indicator-height: 3px !default; +$carousel-indicator-hit-area-height: 10px !default; +$carousel-indicator-spacer: 3px !default; +$carousel-indicator-opacity: .5 !default; +$carousel-indicator-active-bg: $white !default; +$carousel-indicator-active-opacity: 1 !default; +$carousel-indicator-transition: opacity .6s ease !default; + +$carousel-caption-width: 70% !default; +$carousel-caption-color: $white !default; +$carousel-caption-padding-y: 1.25rem !default; +$carousel-caption-spacer: 1.25rem !default; + +$carousel-control-icon-width: 2rem !default; + +$carousel-control-prev-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path 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 0z'/></svg>") !default; +$carousel-control-next-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path 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-.708z'/></svg>") !default; + +$carousel-transition-duration: .6s !default; +$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`) +// scss-docs-end carousel-variables + +// scss-docs-start carousel-dark-variables +$carousel-dark-indicator-active-bg: $black !default; +$carousel-dark-caption-color: $black !default; +$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default; +// scss-docs-end carousel-dark-variables + + +// Spinners + +// scss-docs-start spinner-variables +$spinner-width: 2rem !default; +$spinner-height: $spinner-width !default; +$spinner-vertical-align: -.125em !default; +$spinner-border-width: .25em !default; +$spinner-animation-speed: .75s !default; + +$spinner-width-sm: 1rem !default; +$spinner-height-sm: $spinner-width-sm !default; +$spinner-border-width-sm: .2em !default; +// scss-docs-end spinner-variables + + +// Close + +// scss-docs-start close-variables +$btn-close-width: 1em !default; +$btn-close-height: $btn-close-width !default; +$btn-close-padding-x: .25em !default; +$btn-close-padding-y: $btn-close-padding-x !default; +$btn-close-color: $black !default; +$btn-close-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$btn-close-color}'><path 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.414z'/></svg>") !default; +$btn-close-focus-shadow: $focus-ring-box-shadow !default; +$btn-close-opacity: .5 !default; +$btn-close-hover-opacity: .75 !default; +$btn-close-focus-opacity: 1 !default; +$btn-close-disabled-opacity: .25 !default; +$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default; +// scss-docs-end close-variables + + +// Offcanvas + +// scss-docs-start offcanvas-variables +$offcanvas-padding-y: $modal-inner-padding !default; +$offcanvas-padding-x: $modal-inner-padding !default; +$offcanvas-horizontal-width: 400px !default; +$offcanvas-vertical-height: 30vh !default; +$offcanvas-transition-duration: .3s !default; +$offcanvas-border-color: $modal-content-border-color !default; +$offcanvas-border-width: $modal-content-border-width !default; +$offcanvas-title-line-height: $modal-title-line-height !default; +$offcanvas-bg-color: var(--#{$prefix}body-bg) !default; +$offcanvas-color: var(--#{$prefix}body-color) !default; +$offcanvas-box-shadow: $modal-content-box-shadow-xs !default; +$offcanvas-backdrop-bg: $modal-backdrop-bg !default; +$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default; +// scss-docs-end offcanvas-variables + +// Code + +$code-font-size: $small-font-size !default; +$code-color: $pink !default; + +$kbd-padding-y: .1875rem !default; +$kbd-padding-x: .375rem !default; +$kbd-font-size: $code-font-size !default; +$kbd-color: var(--#{$prefix}body-bg) !default; +$kbd-bg: var(--#{$prefix}body-color) !default; +$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6 + +$pre-color: null !default; + +@import "variables-dark"; // TODO: can be removed safely in v6, only here to avoid breaking changes in v5.3 diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-grid.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-grid.scss new file mode 100644 index 00000000..52bd577e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-grid.scss @@ -0,0 +1,62 @@ +@import "mixins/banner"; +@include bsBanner(Grid); + +$include-column-box-sizing: true !default; + +@import "functions"; +@import "variables"; +@import "variables-dark"; +@import "maps"; + +@import "mixins/breakpoints"; +@import "mixins/container"; +@import "mixins/grid"; +@import "mixins/utilities"; + +@import "vendor/rfs"; + +@import "containers"; +@import "grid"; + +@import "utilities"; +// Only use the utilities we need +// stylelint-disable-next-line scss/dollar-variable-default +$utilities: map-get-multiple( + $utilities, + ( + "display", + "order", + "flex", + "flex-direction", + "flex-grow", + "flex-shrink", + "flex-wrap", + "justify-content", + "align-items", + "align-content", + "align-self", + "margin", + "margin-x", + "margin-y", + "margin-top", + "margin-end", + "margin-bottom", + "margin-start", + "negative-margin", + "negative-margin-x", + "negative-margin-y", + "negative-margin-top", + "negative-margin-end", + "negative-margin-bottom", + "negative-margin-start", + "padding", + "padding-x", + "padding-y", + "padding-top", + "padding-end", + "padding-bottom", + "padding-start", + ) +); + +@import "utilities/api"; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-reboot.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-reboot.scss new file mode 100644 index 00000000..5b69b955 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-reboot.scss @@ -0,0 +1,10 @@ +@import "mixins/banner"; +@include bsBanner(Reboot); + +@import "functions"; +@import "variables"; +@import "variables-dark"; +@import "maps"; +@import "mixins"; +@import "root"; +@import "reboot"; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-utilities.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-utilities.scss new file mode 100644 index 00000000..99c4a359 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-utilities.scss @@ -0,0 +1,19 @@ +@import "mixins/banner"; +@include bsBanner(Utilities); + +// Configuration +@import "functions"; +@import "variables"; +@import "variables-dark"; +@import "maps"; +@import "mixins"; +@import "utilities"; + +// Layout & components +@import "root"; + +// Helpers +@import "helpers"; + +// Utilities +@import "utilities/api"; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap.scss new file mode 100644 index 00000000..449d7048 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap.scss @@ -0,0 +1,52 @@ +@import "mixins/banner"; +@include bsBanner(""); + + +// scss-docs-start import-stack +// Configuration +@import "functions"; +@import "variables"; +@import "variables-dark"; +@import "maps"; +@import "mixins"; +@import "utilities"; + +// Layout & components +@import "root"; +@import "reboot"; +@import "type"; +@import "images"; +@import "containers"; +@import "grid"; +@import "tables"; +@import "forms"; +@import "buttons"; +@import "transitions"; +@import "dropdown"; +@import "button-group"; +@import "nav"; +@import "navbar"; +@import "card"; +@import "accordion"; +@import "breadcrumb"; +@import "pagination"; +@import "badge"; +@import "alert"; +@import "progress"; +@import "list-group"; +@import "close"; +@import "toasts"; +@import "modal"; +@import "tooltip"; +@import "popover"; +@import "carousel"; +@import "spinners"; +@import "offcanvas"; +@import "placeholders"; + +// Helpers +@import "helpers"; + +// Utilities +@import "utilities/api"; +// scss-docs-end import-stack diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_floating-labels.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_floating-labels.scss new file mode 100644 index 00000000..2cf04704 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_floating-labels.scss @@ -0,0 +1,95 @@ +.form-floating { + position: relative; + + > .form-control, + > .form-control-plaintext, + > .form-select { + height: $form-floating-height; + min-height: $form-floating-height; + line-height: $form-floating-line-height; + } + + > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; // allow textareas + padding: $form-floating-padding-y $form-floating-padding-x; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model + transform-origin: 0 0; + @include transition($form-floating-transition); + } + + > .form-control, + > .form-control-plaintext { + padding: $form-floating-padding-y $form-floating-padding-x; + + &::placeholder { + color: transparent; + } + + &:focus, + &:not(:placeholder-shown) { + padding-top: $form-floating-input-padding-t; + padding-bottom: $form-floating-input-padding-b; + } + // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped + &:-webkit-autofill { + padding-top: $form-floating-input-padding-t; + padding-bottom: $form-floating-input-padding-b; + } + } + + > .form-select { + padding-top: $form-floating-input-padding-t; + padding-bottom: $form-floating-input-padding-b; + } + + > .form-control:focus, + > .form-control:not(:placeholder-shown), + > .form-control-plaintext, + > .form-select { + ~ label { + color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity}); + transform: $form-floating-label-transform; + + &::after { + position: absolute; + inset: $form-floating-padding-y ($form-floating-padding-x * .5); + z-index: -1; + height: $form-floating-label-height; + content: ""; + background-color: $input-bg; + @include border-radius($input-border-radius); + } + } + } + // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped + > .form-control:-webkit-autofill { + ~ label { + color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity}); + transform: $form-floating-label-transform; + } + } + + > .form-control-plaintext { + ~ label { + border-width: $input-border-width 0; // Required to properly position label text - as explained above + } + } + + > :disabled ~ label, + > .form-control:disabled ~ label { // Required for `.form-control`s because of specificity + color: $form-floating-label-disabled-color; + + &::after { + background-color: $input-disabled-bg; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-check.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-check.scss new file mode 100644 index 00000000..8a1b639d --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-check.scss @@ -0,0 +1,189 @@ +// +// Check/radio +// + +.form-check { + display: block; + min-height: $form-check-min-height; + padding-left: $form-check-padding-start; + margin-bottom: $form-check-margin-bottom; + + .form-check-input { + float: left; + margin-left: $form-check-padding-start * -1; + } +} + +.form-check-reverse { + padding-right: $form-check-padding-start; + padding-left: 0; + text-align: right; + + .form-check-input { + float: right; + margin-right: $form-check-padding-start * -1; + margin-left: 0; + } +} + +.form-check-input { + --#{$prefix}form-check-bg: #{$form-check-input-bg}; + + flex-shrink: 0; + width: $form-check-input-width; + height: $form-check-input-width; + margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height + vertical-align: top; + appearance: none; + background-color: var(--#{$prefix}form-check-bg); + background-image: var(--#{$prefix}form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: $form-check-input-border; + print-color-adjust: exact; // Keep themed appearance for print + @include transition($form-check-transition); + + &[type="checkbox"] { + @include border-radius($form-check-input-border-radius); + } + + &[type="radio"] { + // stylelint-disable-next-line property-disallowed-list + border-radius: $form-check-radio-border-radius; + } + + &:active { + filter: $form-check-input-active-filter; + } + + &:focus { + border-color: $form-check-input-focus-border; + outline: 0; + box-shadow: $form-check-input-focus-box-shadow; + } + + &:checked { + background-color: $form-check-input-checked-bg-color; + border-color: $form-check-input-checked-border-color; + + &[type="checkbox"] { + @if $enable-gradients { + --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)}, var(--#{$prefix}gradient); + } @else { + --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)}; + } + } + + &[type="radio"] { + @if $enable-gradients { + --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)}, var(--#{$prefix}gradient); + } @else { + --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)}; + } + } + } + + &[type="checkbox"]:indeterminate { + background-color: $form-check-input-indeterminate-bg-color; + border-color: $form-check-input-indeterminate-border-color; + + @if $enable-gradients { + --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)}, var(--#{$prefix}gradient); + } @else { + --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)}; + } + } + + &:disabled { + pointer-events: none; + filter: none; + opacity: $form-check-input-disabled-opacity; + } + + // Use disabled attribute in addition of :disabled pseudo-class + // See: https://github.com/twbs/bootstrap/issues/28247 + &[disabled], + &:disabled { + ~ .form-check-label { + cursor: default; + opacity: $form-check-label-disabled-opacity; + } + } +} + +.form-check-label { + color: $form-check-label-color; + cursor: $form-check-label-cursor; +} + +// +// Switch +// + +.form-switch { + padding-left: $form-switch-padding-start; + + .form-check-input { + --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image)}; + + width: $form-switch-width; + margin-left: $form-switch-padding-start * -1; + background-image: var(--#{$prefix}form-switch-bg); + background-position: left center; + @include border-radius($form-switch-border-radius, 0); + @include transition($form-switch-transition); + + &:focus { + --#{$prefix}form-switch-bg: #{escape-svg($form-switch-focus-bg-image)}; + } + + &:checked { + background-position: $form-switch-checked-bg-position; + + @if $enable-gradients { + --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)}, var(--#{$prefix}gradient); + } @else { + --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)}; + } + } + } + + &.form-check-reverse { + padding-right: $form-switch-padding-start; + padding-left: 0; + + .form-check-input { + margin-right: $form-switch-padding-start * -1; + margin-left: 0; + } + } +} + +.form-check-inline { + display: inline-block; + margin-right: $form-check-inline-margin-end; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; + + &[disabled], + &:disabled { + + .btn { + pointer-events: none; + filter: none; + opacity: $form-check-btn-check-disabled-opacity; + } + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .form-switch .form-check-input:not(:checked):not(:focus) { + --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image-dark)}; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-control.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-control.scss new file mode 100644 index 00000000..67ae5f4f --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-control.scss @@ -0,0 +1,214 @@ +// +// General form controls (plus a few specific high-level interventions) +// + +.form-control { + display: block; + width: 100%; + padding: $input-padding-y $input-padding-x; + font-family: $input-font-family; + @include font-size($input-font-size); + font-weight: $input-font-weight; + line-height: $input-line-height; + color: $input-color; + appearance: none; // Fix appearance for date inputs in Safari + background-color: $input-bg; + background-clip: padding-box; + border: $input-border-width solid $input-border-color; + + // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS. + @include border-radius($input-border-radius, 0); + + @include box-shadow($input-box-shadow); + @include transition($input-transition); + + &[type="file"] { + overflow: hidden; // prevent pseudo element button overlap + + &:not(:disabled):not([readonly]) { + cursor: pointer; + } + } + + // Customize the `:focus` state to imitate native WebKit styles. + &:focus { + color: $input-focus-color; + background-color: $input-focus-bg; + border-color: $input-focus-border-color; + outline: 0; + @if $enable-shadows { + @include box-shadow($input-box-shadow, $input-focus-box-shadow); + } @else { + // Avoid using mixin so we can pass custom focus shadow properly + box-shadow: $input-focus-box-shadow; + } + } + + &::-webkit-date-and-time-value { + // On Android Chrome, form-control's "width: 100%" makes the input width too small + // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109 + // + // On iOS Safari, form-control's "appearance: none" + "width: 100%" makes the input width too small + // Tested under iOS 16.2 / Safari 16.2 + min-width: 85px; // Seems to be a good minimum safe width + + // Add some height to date inputs on iOS + // https://github.com/twbs/bootstrap/issues/23307 + // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved + // Multiply line-height by 1em if it has no unit + height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height); + + // Android Chrome type="date" is taller than the other inputs + // because of "margin: 1px 24px 1px 4px" inside the shadow DOM + // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109 + margin: 0; + } + + // Prevent excessive date input height in Webkit + // https://github.com/twbs/bootstrap/issues/34433 + &::-webkit-datetime-edit { + display: block; + padding: 0; + } + + // Placeholder + &::placeholder { + color: $input-placeholder-color; + // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526. + opacity: 1; + } + + // Disabled inputs + // + // HTML5 says that controls under a fieldset > legend:first-child won't be + // disabled if the fieldset is disabled. Due to implementation difficulty, we + // don't honor that edge case; we style them as disabled anyway. + &:disabled { + color: $input-disabled-color; + background-color: $input-disabled-bg; + border-color: $input-disabled-border-color; + // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655. + opacity: 1; + } + + // File input buttons theming + &::file-selector-button { + padding: $input-padding-y $input-padding-x; + margin: (-$input-padding-y) (-$input-padding-x); + margin-inline-end: $input-padding-x; + color: $form-file-button-color; + @include gradient-bg($form-file-button-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: $input-border-width; + border-radius: 0; // stylelint-disable-line property-disallowed-list + @include transition($btn-transition); + } + + &:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: $form-file-button-hover-bg; + } +} + +// Readonly controls as plain text +// +// Apply class to a readonly input to make it appear like regular plain +// text (without any border, background color, focus indicator) + +.form-control-plaintext { + display: block; + width: 100%; + padding: $input-padding-y 0; + margin-bottom: 0; // match inputs if this class comes on inputs with default margins + line-height: $input-line-height; + color: $input-plaintext-color; + background-color: transparent; + border: solid transparent; + border-width: $input-border-width 0; + + &:focus { + outline: 0; + } + + &.form-control-sm, + &.form-control-lg { + padding-right: 0; + padding-left: 0; + } +} + +// Form control sizing +// +// Build on `.form-control` with modifier classes to decrease or increase the +// height and font-size of form controls. +// +// Repeated in `_input_group.scss` to avoid Sass extend issues. + +.form-control-sm { + min-height: $input-height-sm; + padding: $input-padding-y-sm $input-padding-x-sm; + @include font-size($input-font-size-sm); + @include border-radius($input-border-radius-sm); + + &::file-selector-button { + padding: $input-padding-y-sm $input-padding-x-sm; + margin: (-$input-padding-y-sm) (-$input-padding-x-sm); + margin-inline-end: $input-padding-x-sm; + } +} + +.form-control-lg { + min-height: $input-height-lg; + padding: $input-padding-y-lg $input-padding-x-lg; + @include font-size($input-font-size-lg); + @include border-radius($input-border-radius-lg); + + &::file-selector-button { + padding: $input-padding-y-lg $input-padding-x-lg; + margin: (-$input-padding-y-lg) (-$input-padding-x-lg); + margin-inline-end: $input-padding-x-lg; + } +} + +// Make sure textareas don't shrink too much when resized +// https://github.com/twbs/bootstrap/pull/29124 +// stylelint-disable selector-no-qualifying-type +textarea { + &.form-control { + min-height: $input-height; + } + + &.form-control-sm { + min-height: $input-height-sm; + } + + &.form-control-lg { + min-height: $input-height-lg; + } +} +// stylelint-enable selector-no-qualifying-type + +.form-control-color { + width: $form-color-width; + height: $input-height; + padding: $input-padding-y; + + &:not(:disabled):not([readonly]) { + cursor: pointer; + } + + &::-moz-color-swatch { + border: 0 !important; // stylelint-disable-line declaration-no-important + @include border-radius($input-border-radius); + } + + &::-webkit-color-swatch { + border: 0 !important; // stylelint-disable-line declaration-no-important + @include border-radius($input-border-radius); + } + + &.form-control-sm { height: $input-height-sm; } + &.form-control-lg { height: $input-height-lg; } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-range.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-range.scss new file mode 100644 index 00000000..4732213e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-range.scss @@ -0,0 +1,91 @@ +// Range +// +// Style range inputs the same across browsers. Vendor-specific rules for pseudo +// elements cannot be mixed. As such, there are no shared styles for focus or +// active states on prefixed selectors. + +.form-range { + width: 100%; + height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2); + padding: 0; // Need to reset padding + appearance: none; + background-color: transparent; + + &:focus { + outline: 0; + + // Pseudo-elements must be split across multiple rulesets to have an effect. + // No box-shadow() mixin for focus accessibility. + &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; } + &::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; } + } + + &::-moz-focus-outer { + border: 0; + } + + &::-webkit-slider-thumb { + width: $form-range-thumb-width; + height: $form-range-thumb-height; + margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific + appearance: none; + @include gradient-bg($form-range-thumb-bg); + border: $form-range-thumb-border; + @include border-radius($form-range-thumb-border-radius); + @include box-shadow($form-range-thumb-box-shadow); + @include transition($form-range-thumb-transition); + + &:active { + @include gradient-bg($form-range-thumb-active-bg); + } + } + + &::-webkit-slider-runnable-track { + width: $form-range-track-width; + height: $form-range-track-height; + color: transparent; // Why? + cursor: $form-range-track-cursor; + background-color: $form-range-track-bg; + border-color: transparent; + @include border-radius($form-range-track-border-radius); + @include box-shadow($form-range-track-box-shadow); + } + + &::-moz-range-thumb { + width: $form-range-thumb-width; + height: $form-range-thumb-height; + appearance: none; + @include gradient-bg($form-range-thumb-bg); + border: $form-range-thumb-border; + @include border-radius($form-range-thumb-border-radius); + @include box-shadow($form-range-thumb-box-shadow); + @include transition($form-range-thumb-transition); + + &:active { + @include gradient-bg($form-range-thumb-active-bg); + } + } + + &::-moz-range-track { + width: $form-range-track-width; + height: $form-range-track-height; + color: transparent; + cursor: $form-range-track-cursor; + background-color: $form-range-track-bg; + border-color: transparent; // Firefox specific? + @include border-radius($form-range-track-border-radius); + @include box-shadow($form-range-track-box-shadow); + } + + &:disabled { + pointer-events: none; + + &::-webkit-slider-thumb { + background-color: $form-range-thumb-disabled-bg; + } + + &::-moz-range-thumb { + background-color: $form-range-thumb-disabled-bg; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-select.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-select.scss new file mode 100644 index 00000000..69ace529 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-select.scss @@ -0,0 +1,80 @@ +// Select +// +// Replaces the browser default select with a custom one, mostly pulled from +// https://primer.github.io/. + +.form-select { + --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator)}; + + display: block; + width: 100%; + padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x; + font-family: $form-select-font-family; + @include font-size($form-select-font-size); + font-weight: $form-select-font-weight; + line-height: $form-select-line-height; + color: $form-select-color; + appearance: none; + background-color: $form-select-bg; + background-image: var(--#{$prefix}form-select-bg-img), var(--#{$prefix}form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: $form-select-bg-position; + background-size: $form-select-bg-size; + border: $form-select-border-width solid $form-select-border-color; + @include border-radius($form-select-border-radius, 0); + @include box-shadow($form-select-box-shadow); + @include transition($form-select-transition); + + &:focus { + border-color: $form-select-focus-border-color; + outline: 0; + @if $enable-shadows { + @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow); + } @else { + // Avoid using mixin so we can pass custom focus shadow properly + box-shadow: $form-select-focus-box-shadow; + } + } + + &[multiple], + &[size]:not([size="1"]) { + padding-right: $form-select-padding-x; + background-image: none; + } + + &:disabled { + color: $form-select-disabled-color; + background-color: $form-select-disabled-bg; + border-color: $form-select-disabled-border-color; + } + + // Remove outline from select box in FF + &:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 $form-select-color; + } +} + +.form-select-sm { + padding-top: $form-select-padding-y-sm; + padding-bottom: $form-select-padding-y-sm; + padding-left: $form-select-padding-x-sm; + @include font-size($form-select-font-size-sm); + @include border-radius($form-select-border-radius-sm); +} + +.form-select-lg { + padding-top: $form-select-padding-y-lg; + padding-bottom: $form-select-padding-y-lg; + padding-left: $form-select-padding-x-lg; + @include font-size($form-select-font-size-lg); + @include border-radius($form-select-border-radius-lg); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .form-select { + --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator-dark)}; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-text.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-text.scss new file mode 100644 index 00000000..f080d1a2 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-text.scss @@ -0,0 +1,11 @@ +// +// Form text +// + +.form-text { + margin-top: $form-text-margin-top; + @include font-size($form-text-font-size); + font-style: $form-text-font-style; + font-weight: $form-text-font-weight; + color: $form-text-color; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_input-group.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_input-group.scss new file mode 100644 index 00000000..58e4d409 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_input-group.scss @@ -0,0 +1,132 @@ +// +// Base styles +// + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; // For form validation feedback + align-items: stretch; + width: 100%; + + > .form-control, + > .form-select, + > .form-floating { + position: relative; // For focus state's z-index + flex: 1 1 auto; + width: 1%; + min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size + } + + // Bring the "active" form control to the top of surrounding elements + > .form-control:focus, + > .form-select:focus, + > .form-floating:focus-within { + z-index: 5; + } + + // Ensure buttons are always above inputs for more visually pleasing borders. + // This isn't needed for `.input-group-text` since it shares the same border-color + // as our inputs. + .btn { + position: relative; + z-index: 2; + + &:focus { + z-index: 5; + } + } +} + + +// Textual addons +// +// Serves as a catch-all element for any text or radio/checkbox input you wish +// to prepend or append to an input. + +.input-group-text { + display: flex; + align-items: center; + padding: $input-group-addon-padding-y $input-group-addon-padding-x; + @include font-size($input-font-size); // Match inputs + font-weight: $input-group-addon-font-weight; + line-height: $input-line-height; + color: $input-group-addon-color; + text-align: center; + white-space: nowrap; + background-color: $input-group-addon-bg; + border: $input-border-width solid $input-group-addon-border-color; + @include border-radius($input-border-radius); +} + + +// Sizing +// +// Remix the default form control sizing classes into new ones for easier +// manipulation. + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: $input-padding-y-lg $input-padding-x-lg; + @include font-size($input-font-size-lg); + @include border-radius($input-border-radius-lg); +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: $input-padding-y-sm $input-padding-x-sm; + @include font-size($input-font-size-sm); + @include border-radius($input-border-radius-sm); +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: $form-select-padding-x + $form-select-indicator-padding; +} + + +// Rounded corners +// +// These rulesets must come after the sizing ones to properly override sm and lg +// border-radius values when extending. They're more specific than we'd like +// with the `.input-group >` part, but without it, we cannot override the sizing. + +// stylelint-disable-next-line no-duplicate-selectors +.input-group { + &:not(.has-validation) { + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), + > .dropdown-toggle:nth-last-child(n + 3), + > .form-floating:not(:last-child) > .form-control, + > .form-floating:not(:last-child) > .form-select { + @include border-end-radius(0); + } + } + + &.has-validation { + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), + > .dropdown-toggle:nth-last-child(n + 4), + > .form-floating:nth-last-child(n + 3) > .form-control, + > .form-floating:nth-last-child(n + 3) > .form-select { + @include border-end-radius(0); + } + } + + $validation-messages: ""; + @each $state in map-keys($form-validation-states) { + $validation-messages: $validation-messages + ":not(." + unquote($state) + "-tooltip)" + ":not(." + unquote($state) + "-feedback)"; + } + + > :not(:first-child):not(.dropdown-menu)#{$validation-messages} { + margin-left: calc(#{$input-border-width} * -1); // stylelint-disable-line function-disallowed-list + @include border-start-radius(0); + } + + > .form-floating:not(:first-child) > .form-control, + > .form-floating:not(:first-child) > .form-select { + @include border-start-radius(0); + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_labels.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_labels.scss new file mode 100644 index 00000000..39ecafcd --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_labels.scss @@ -0,0 +1,36 @@ +// +// Labels +// + +.form-label { + margin-bottom: $form-label-margin-bottom; + @include font-size($form-label-font-size); + font-style: $form-label-font-style; + font-weight: $form-label-font-weight; + color: $form-label-color; +} + +// For use with horizontal and inline forms, when you need the label (or legend) +// text to align with the form controls. +.col-form-label { + padding-top: add($input-padding-y, $input-border-width); + padding-bottom: add($input-padding-y, $input-border-width); + margin-bottom: 0; // Override the `<legend>` default + @include font-size(inherit); // Override the `<legend>` default + font-style: $form-label-font-style; + font-weight: $form-label-font-weight; + line-height: $input-line-height; + color: $form-label-color; +} + +.col-form-label-lg { + padding-top: add($input-padding-y-lg, $input-border-width); + padding-bottom: add($input-padding-y-lg, $input-border-width); + @include font-size($input-font-size-lg); +} + +.col-form-label-sm { + padding-top: add($input-padding-y-sm, $input-border-width); + padding-bottom: add($input-padding-y-sm, $input-border-width); + @include font-size($input-font-size-sm); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_validation.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_validation.scss new file mode 100644 index 00000000..c48123a7 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_validation.scss @@ -0,0 +1,12 @@ +// Form validation +// +// Provide feedback to users when form field values are valid or invalid. Works +// primarily for client-side validation via scoped `:invalid` and `:valid` +// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for +// server-side validation. + +// scss-docs-start form-validation-states-loop +@each $state, $data in $form-validation-states { + @include form-validation-state($state, $data...); +} +// scss-docs-end form-validation-states-loop diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_clearfix.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_clearfix.scss new file mode 100644 index 00000000..e92522a9 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_clearfix.scss @@ -0,0 +1,3 @@ +.clearfix { + @include clearfix(); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_color-bg.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_color-bg.scss new file mode 100644 index 00000000..1a3a4cff --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_color-bg.scss @@ -0,0 +1,7 @@ +// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251 +@each $color, $value in $theme-colors { + .text-bg-#{$color} { + color: color-contrast($value) if($enable-important-utilities, !important, null); + background-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null); + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_colored-links.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_colored-links.scss new file mode 100644 index 00000000..5f868578 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_colored-links.scss @@ -0,0 +1,30 @@ +// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251 +@each $color, $value in $theme-colors { + .link-#{$color} { + color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null); + text-decoration-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null); + + @if $link-shade-percentage != 0 { + &:hover, + &:focus { + $hover-color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage)); + color: RGBA(#{to-rgb($hover-color)}, var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null); + text-decoration-color: RGBA(to-rgb($hover-color), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null); + } + } + } +} + +// One-off special link helper as a bridge until v6 +.link-body-emphasis { + color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null); + text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null); + + @if $link-shade-percentage != 0 { + &:hover, + &:focus { + color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, .75)) if($enable-important-utilities, !important, null); + text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, .75)) if($enable-important-utilities, !important, null); + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_focus-ring.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_focus-ring.scss new file mode 100644 index 00000000..26508a8d --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_focus-ring.scss @@ -0,0 +1,5 @@ +.focus-ring:focus { + outline: 0; + // By default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values + box-shadow: var(--#{$prefix}focus-ring-x, 0) var(--#{$prefix}focus-ring-y, 0) var(--#{$prefix}focus-ring-blur, 0) var(--#{$prefix}focus-ring-width) var(--#{$prefix}focus-ring-color); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_icon-link.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_icon-link.scss new file mode 100644 index 00000000..3f8bcb33 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_icon-link.scss @@ -0,0 +1,25 @@ +.icon-link { + display: inline-flex; + gap: $icon-link-gap; + align-items: center; + text-decoration-color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, .5)); + text-underline-offset: $icon-link-underline-offset; + backface-visibility: hidden; + + > .bi { + flex-shrink: 0; + width: $icon-link-icon-size; + height: $icon-link-icon-size; + fill: currentcolor; + @include transition($icon-link-icon-transition); + } +} + +.icon-link-hover { + &:hover, + &:focus-visible { + > .bi { + transform: var(--#{$prefix}icon-link-transform, $icon-link-icon-transform); + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_position.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_position.scss new file mode 100644 index 00000000..59103d94 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_position.scss @@ -0,0 +1,36 @@ +// Shorthand + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: $zindex-fixed; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: $zindex-fixed; +} + +// Responsive sticky top and bottom +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .sticky#{$infix}-top { + position: sticky; + top: 0; + z-index: $zindex-sticky; + } + + .sticky#{$infix}-bottom { + position: sticky; + bottom: 0; + z-index: $zindex-sticky; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_ratio.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_ratio.scss new file mode 100644 index 00000000..b6a7654c --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_ratio.scss @@ -0,0 +1,26 @@ +// Credit: Nicolas Gallagher and SUIT CSS. + +.ratio { + position: relative; + width: 100%; + + &::before { + display: block; + padding-top: var(--#{$prefix}aspect-ratio); + content: ""; + } + + > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } +} + +@each $key, $ratio in $aspect-ratios { + .ratio-#{$key} { + --#{$prefix}aspect-ratio: #{$ratio}; + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stacks.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stacks.scss new file mode 100644 index 00000000..6cd237ae --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stacks.scss @@ -0,0 +1,15 @@ +// scss-docs-start stacks +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} +// scss-docs-end stacks diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stretched-link.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stretched-link.scss new file mode 100644 index 00000000..71a1c755 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stretched-link.scss @@ -0,0 +1,15 @@ +// +// Stretched link +// + +.stretched-link { + &::#{$stretched-link-pseudo-element} { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: $stretched-link-z-index; + content: ""; + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_text-truncation.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_text-truncation.scss new file mode 100644 index 00000000..6421dac9 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_text-truncation.scss @@ -0,0 +1,7 @@ +// +// Text truncation +// + +.text-truncate { + @include text-truncate(); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_visually-hidden.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_visually-hidden.scss new file mode 100644 index 00000000..4760ff03 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_visually-hidden.scss @@ -0,0 +1,8 @@ +// +// Visually hidden +// + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + @include visually-hidden(); +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_vr.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_vr.scss new file mode 100644 index 00000000..b6f9d42c --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_vr.scss @@ -0,0 +1,8 @@ +.vr { + display: inline-block; + align-self: stretch; + width: $vr-border-width; + min-height: 1em; + background-color: currentcolor; + opacity: $hr-opacity; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_alert.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_alert.scss new file mode 100644 index 00000000..fb524af1 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_alert.scss @@ -0,0 +1,18 @@ +@include deprecate("`alert-variant()`", "v5.3.0", "v6.0.0"); + +// scss-docs-start alert-variant-mixin +@mixin alert-variant($background, $border, $color) { + --#{$prefix}alert-color: #{$color}; + --#{$prefix}alert-bg: #{$background}; + --#{$prefix}alert-border-color: #{$border}; + --#{$prefix}alert-link-color: #{shade-color($color, 20%)}; + + @if $enable-gradients { + background-image: var(--#{$prefix}gradient); + } + + .alert-link { + color: var(--#{$prefix}alert-link-color); + } +} +// scss-docs-end alert-variant-mixin diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_backdrop.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_backdrop.scss new file mode 100644 index 00000000..9705ae9e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_backdrop.scss @@ -0,0 +1,14 @@ +// Shared between modals and offcanvases +@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) { + position: fixed; + top: 0; + left: 0; + z-index: $zindex; + width: 100vw; + height: 100vh; + background-color: $backdrop-bg; + + // Fade for backdrop + &.fade { opacity: 0; } + &.show { opacity: $backdrop-opacity; } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_banner.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_banner.scss new file mode 100644 index 00000000..20c2fd12 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_banner.scss @@ -0,0 +1,7 @@ +@mixin bsBanner($file) { + /*! + * Bootstrap #{$file} v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_border-radius.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_border-radius.scss new file mode 100644 index 00000000..616decbc --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_border-radius.scss @@ -0,0 +1,78 @@ +// stylelint-disable property-disallowed-list +// Single side border-radius + +// Helper function to replace negative values with 0 +@function valid-radius($radius) { + $return: (); + @each $value in $radius { + @if type-of($value) == number { + $return: append($return, max($value, 0)); + } @else { + $return: append($return, $value); + } + } + @return $return; +} + +// scss-docs-start border-radius-mixins +@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) { + @if $enable-rounded { + border-radius: valid-radius($radius); + } + @else if $fallback-border-radius != false { + border-radius: $fallback-border-radius; + } +} + +@mixin border-top-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + border-top-right-radius: valid-radius($radius); + } +} + +@mixin border-end-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-right-radius: valid-radius($radius); + border-bottom-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-radius($radius: $border-radius) { + @if $enable-rounded { + border-bottom-right-radius: valid-radius($radius); + border-bottom-left-radius: valid-radius($radius); + } +} + +@mixin border-start-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + border-bottom-left-radius: valid-radius($radius); + } +} + +@mixin border-top-start-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-left-radius: valid-radius($radius); + } +} + +@mixin border-top-end-radius($radius: $border-radius) { + @if $enable-rounded { + border-top-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-end-radius($radius: $border-radius) { + @if $enable-rounded { + border-bottom-right-radius: valid-radius($radius); + } +} + +@mixin border-bottom-start-radius($radius: $border-radius) { + @if $enable-rounded { + border-bottom-left-radius: valid-radius($radius); + } +} +// scss-docs-end border-radius-mixins diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss new file mode 100644 index 00000000..4172541f --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss @@ -0,0 +1,18 @@ +@mixin box-shadow($shadow...) { + @if $enable-shadows { + $result: (); + + @each $value in $shadow { + @if $value != null { + $result: append($result, $value, "comma"); + } + @if $value == none and length($shadow) > 1 { + @warn "The keyword 'none' must be used as a single argument."; + } + } + + @if (length($result) > 0) { + box-shadow: $result; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_breakpoints.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_breakpoints.scss new file mode 100644 index 00000000..286be893 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_breakpoints.scss @@ -0,0 +1,127 @@ +// Breakpoint viewport sizes and media queries. +// +// Breakpoints are defined as a map of (name: minimum width), order from small to large: +// +// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px) +// +// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default. + +// Name of the next breakpoint, or null for the last breakpoint. +// +// >> breakpoint-next(sm) +// md +// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)) +// md +// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl)) +// md +@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) { + $n: index($breakpoint-names, $name); + @if not $n { + @error "breakpoint `#{$name}` not found in `#{$breakpoints}`"; + } + @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null); +} + +// Minimum breakpoint width. Null for the smallest (first) breakpoint. +// +// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)) +// 576px +@function breakpoint-min($name, $breakpoints: $grid-breakpoints) { + $min: map-get($breakpoints, $name); + @return if($min != 0, $min, null); +} + +// Maximum breakpoint width. +// The maximum value is reduced by 0.02px to work around the limitations of +// `min-` and `max-` prefixes and viewports with fractional widths. +// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max +// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari. +// See https://bugs.webkit.org/show_bug.cgi?id=178261 +// +// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)) +// 767.98px +@function breakpoint-max($name, $breakpoints: $grid-breakpoints) { + $max: map-get($breakpoints, $name); + @return if($max and $max > 0, $max - .02, null); +} + +// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. +// Useful for making responsive utilities. +// +// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)) +// "" (Returns a blank string) +// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)) +// "-sm" +@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) { + @return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}"); +} + +// Media of at least the minimum breakpoint width. No query for the smallest breakpoint. +// Makes the @content apply to the given breakpoint and wider. +@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) { + $min: breakpoint-min($name, $breakpoints); + @if $min { + @media (min-width: $min) { + @content; + } + } @else { + @content; + } +} + +// Media of at most the maximum breakpoint width. No query for the largest breakpoint. +// Makes the @content apply to the given breakpoint and narrower. +@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) { + $max: breakpoint-max($name, $breakpoints); + @if $max { + @media (max-width: $max) { + @content; + } + } @else { + @content; + } +} + +// Media that spans multiple breakpoint widths. +// Makes the @content apply between the min and max breakpoints +@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) { + $min: breakpoint-min($lower, $breakpoints); + $max: breakpoint-max($upper, $breakpoints); + + @if $min != null and $max != null { + @media (min-width: $min) and (max-width: $max) { + @content; + } + } @else if $max == null { + @include media-breakpoint-up($lower, $breakpoints) { + @content; + } + } @else if $min == null { + @include media-breakpoint-down($upper, $breakpoints) { + @content; + } + } +} + +// Media between the breakpoint's minimum and maximum widths. +// No minimum for the smallest breakpoint, and no maximum for the largest one. +// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower. +@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) { + $min: breakpoint-min($name, $breakpoints); + $next: breakpoint-next($name, $breakpoints); + $max: breakpoint-max($next, $breakpoints); + + @if $min != null and $max != null { + @media (min-width: $min) and (max-width: $max) { + @content; + } + } @else if $max == null { + @include media-breakpoint-up($name, $breakpoints) { + @content; + } + } @else if $min == null { + @include media-breakpoint-down($next, $breakpoints) { + @content; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_buttons.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_buttons.scss new file mode 100644 index 00000000..cf087fda --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_buttons.scss @@ -0,0 +1,70 @@ +// Button variants +// +// Easily pump out default styles, as well as :hover, :focus, :active, +// and disabled options for all buttons + +// scss-docs-start btn-variant-mixin +@mixin button-variant( + $background, + $border, + $color: color-contrast($background), + $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)), + $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)), + $hover-color: color-contrast($hover-background), + $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)), + $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)), + $active-color: color-contrast($active-background), + $disabled-background: $background, + $disabled-border: $border, + $disabled-color: color-contrast($disabled-background) +) { + --#{$prefix}btn-color: #{$color}; + --#{$prefix}btn-bg: #{$background}; + --#{$prefix}btn-border-color: #{$border}; + --#{$prefix}btn-hover-color: #{$hover-color}; + --#{$prefix}btn-hover-bg: #{$hover-background}; + --#{$prefix}btn-hover-border-color: #{$hover-border}; + --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))}; + --#{$prefix}btn-active-color: #{$active-color}; + --#{$prefix}btn-active-bg: #{$active-background}; + --#{$prefix}btn-active-border-color: #{$active-border}; + --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow}; + --#{$prefix}btn-disabled-color: #{$disabled-color}; + --#{$prefix}btn-disabled-bg: #{$disabled-background}; + --#{$prefix}btn-disabled-border-color: #{$disabled-border}; +} +// scss-docs-end btn-variant-mixin + +// scss-docs-start btn-outline-variant-mixin +@mixin button-outline-variant( + $color, + $color-hover: color-contrast($color), + $active-background: $color, + $active-border: $color, + $active-color: color-contrast($active-background) +) { + --#{$prefix}btn-color: #{$color}; + --#{$prefix}btn-border-color: #{$color}; + --#{$prefix}btn-hover-color: #{$color-hover}; + --#{$prefix}btn-hover-bg: #{$active-background}; + --#{$prefix}btn-hover-border-color: #{$active-border}; + --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)}; + --#{$prefix}btn-active-color: #{$active-color}; + --#{$prefix}btn-active-bg: #{$active-background}; + --#{$prefix}btn-active-border-color: #{$active-border}; + --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow}; + --#{$prefix}btn-disabled-color: #{$color}; + --#{$prefix}btn-disabled-bg: transparent; + --#{$prefix}btn-disabled-border-color: #{$color}; + --#{$prefix}gradient: none; +} +// scss-docs-end btn-outline-variant-mixin + +// scss-docs-start btn-size-mixin +@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) { + --#{$prefix}btn-padding-y: #{$padding-y}; + --#{$prefix}btn-padding-x: #{$padding-x}; + @include rfs($font-size, --#{$prefix}btn-font-size); + --#{$prefix}btn-border-radius: #{$border-radius}; +} +// scss-docs-end btn-size-mixin diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_caret.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_caret.scss new file mode 100644 index 00000000..be731165 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_caret.scss @@ -0,0 +1,69 @@ +// scss-docs-start caret-mixins +@mixin caret-down($width: $caret-width) { + border-top: $width solid; + border-right: $width solid transparent; + border-bottom: 0; + border-left: $width solid transparent; +} + +@mixin caret-up($width: $caret-width) { + border-top: 0; + border-right: $width solid transparent; + border-bottom: $width solid; + border-left: $width solid transparent; +} + +@mixin caret-end($width: $caret-width) { + border-top: $width solid transparent; + border-right: 0; + border-bottom: $width solid transparent; + border-left: $width solid; +} + +@mixin caret-start($width: $caret-width) { + border-top: $width solid transparent; + border-right: $width solid; + border-bottom: $width solid transparent; +} + +@mixin caret( + $direction: down, + $width: $caret-width, + $spacing: $caret-spacing, + $vertical-align: $caret-vertical-align +) { + @if $enable-caret { + &::after { + display: inline-block; + margin-left: $spacing; + vertical-align: $vertical-align; + content: ""; + @if $direction == down { + @include caret-down($width); + } @else if $direction == up { + @include caret-up($width); + } @else if $direction == end { + @include caret-end($width); + } + } + + @if $direction == start { + &::after { + display: none; + } + + &::before { + display: inline-block; + margin-right: $spacing; + vertical-align: $vertical-align; + content: ""; + @include caret-start($width); + } + } + + &:empty::after { + margin-left: 0; + } + } +} +// scss-docs-end caret-mixins diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_clearfix.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_clearfix.scss new file mode 100644 index 00000000..ffc62bb2 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_clearfix.scss @@ -0,0 +1,9 @@ +// scss-docs-start clearfix +@mixin clearfix() { + &::after { + display: block; + clear: both; + content: ""; + } +} +// scss-docs-end clearfix diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-mode.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-mode.scss new file mode 100644 index 00000000..03338b02 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-mode.scss @@ -0,0 +1,21 @@ +// scss-docs-start color-mode-mixin +@mixin color-mode($mode: light, $root: false) { + @if $color-mode-type == "media-query" { + @if $root == true { + @media (prefers-color-scheme: $mode) { + :root { + @content; + } + } + } @else { + @media (prefers-color-scheme: $mode) { + @content; + } + } + } @else { + [data-bs-theme="#{$mode}"] { + @content; + } + } +} +// scss-docs-end color-mode-mixin diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-scheme.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-scheme.scss new file mode 100644 index 00000000..90497aa0 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-scheme.scss @@ -0,0 +1,7 @@ +// scss-docs-start mixin-color-scheme +@mixin color-scheme($name) { + @media (prefers-color-scheme: #{$name}) { + @content; + } +} +// scss-docs-end mixin-color-scheme diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_container.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_container.scss new file mode 100644 index 00000000..b9f33519 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_container.scss @@ -0,0 +1,11 @@ +// Container mixins + +@mixin make-container($gutter: $container-padding-x) { + --#{$prefix}gutter-x: #{$gutter}; + --#{$prefix}gutter-y: 0; + width: 100%; + padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list + padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list + margin-right: auto; + margin-left: auto; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_deprecate.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_deprecate.scss new file mode 100644 index 00000000..df070bc5 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_deprecate.scss @@ -0,0 +1,10 @@ +// Deprecate mixin +// +// This mixin can be used to deprecate mixins or functions. +// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to +// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap) +@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) { + @if ($enable-deprecation-messages != false and $ignore-warning != true) { + @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}."; + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_forms.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_forms.scss new file mode 100644 index 00000000..00b47641 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_forms.scss @@ -0,0 +1,163 @@ +// This mixin uses an `if()` technique to be compatible with Dart Sass +// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details + +// scss-docs-start form-validation-mixins +@mixin form-validation-state-selector($state) { + @if ($state == "valid" or $state == "invalid") { + .was-validated #{if(&, "&", "")}:#{$state}, + #{if(&, "&", "")}.is-#{$state} { + @content; + } + } @else { + #{if(&, "&", "")}.is-#{$state} { + @content; + } + } +} + +@mixin form-validation-state( + $state, + $color, + $icon, + $tooltip-color: color-contrast($color), + $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity), + $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity), + $border-color: $color +) { + .#{$state}-feedback { + display: none; + width: 100%; + margin-top: $form-feedback-margin-top; + @include font-size($form-feedback-font-size); + font-style: $form-feedback-font-style; + color: $color; + } + + .#{$state}-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; // Contain to parent when possible + padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x; + margin-top: .1rem; + @include font-size($form-feedback-tooltip-font-size); + line-height: $form-feedback-tooltip-line-height; + color: $tooltip-color; + background-color: $tooltip-bg-color; + @include border-radius($form-feedback-tooltip-border-radius); + } + + @include form-validation-state-selector($state) { + ~ .#{$state}-feedback, + ~ .#{$state}-tooltip { + display: block; + } + } + + .form-control { + @include form-validation-state-selector($state) { + border-color: $border-color; + + @if $enable-validation-icons { + padding-right: $input-height-inner; + background-image: escape-svg($icon); + background-repeat: no-repeat; + background-position: right $input-height-inner-quarter center; + background-size: $input-height-inner-half $input-height-inner-half; + } + + &:focus { + border-color: $border-color; + @if $enable-shadows { + @include box-shadow($input-box-shadow, $focus-box-shadow); + } @else { + // Avoid using mixin so we can pass custom focus shadow properly + box-shadow: $focus-box-shadow; + } + } + } + } + + // stylelint-disable-next-line selector-no-qualifying-type + textarea.form-control { + @include form-validation-state-selector($state) { + @if $enable-validation-icons { + padding-right: $input-height-inner; + background-position: top $input-height-inner-quarter right $input-height-inner-quarter; + } + } + } + + .form-select { + @include form-validation-state-selector($state) { + border-color: $border-color; + + @if $enable-validation-icons { + &:not([multiple]):not([size]), + &:not([multiple])[size="1"] { + --#{$prefix}form-select-bg-icon: #{escape-svg($icon)}; + padding-right: $form-select-feedback-icon-padding-end; + background-position: $form-select-bg-position, $form-select-feedback-icon-position; + background-size: $form-select-bg-size, $form-select-feedback-icon-size; + } + } + + &:focus { + border-color: $border-color; + @if $enable-shadows { + @include box-shadow($form-select-box-shadow, $focus-box-shadow); + } @else { + // Avoid using mixin so we can pass custom focus shadow properly + box-shadow: $focus-box-shadow; + } + } + } + } + + .form-control-color { + @include form-validation-state-selector($state) { + @if $enable-validation-icons { + width: add($form-color-width, $input-height-inner); + } + } + } + + .form-check-input { + @include form-validation-state-selector($state) { + border-color: $border-color; + + &:checked { + background-color: $color; + } + + &:focus { + box-shadow: $focus-box-shadow; + } + + ~ .form-check-label { + color: $color; + } + } + } + .form-check-inline .form-check-input { + ~ .#{$state}-feedback { + margin-left: .5em; + } + } + + .input-group { + > .form-control:not(:focus), + > .form-select:not(:focus), + > .form-floating:not(:focus-within) { + @include form-validation-state-selector($state) { + @if $state == "valid" { + z-index: 3; + } @else if $state == "invalid" { + z-index: 4; + } + } + } + } +} +// scss-docs-end form-validation-mixins diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_gradients.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_gradients.scss new file mode 100644 index 00000000..608e18df --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_gradients.scss @@ -0,0 +1,47 @@ +// Gradients + +// scss-docs-start gradient-bg-mixin +@mixin gradient-bg($color: null) { + background-color: $color; + + @if $enable-gradients { + background-image: var(--#{$prefix}gradient); + } +} +// scss-docs-end gradient-bg-mixin + +// scss-docs-start gradient-mixins +// Horizontal gradient, from left to right +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) { + background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); +} + +// Vertical gradient, from top to bottom +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) { + background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); +} + +@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) { + background-image: linear-gradient($deg, $start-color, $end-color); +} + +@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { + background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color); +} + +@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { + background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color); +} + +@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) { + background-image: radial-gradient(circle, $inner-color, $outer-color); +} + +@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) { + background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); +} +// scss-docs-end gradient-mixins diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_grid.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_grid.scss new file mode 100644 index 00000000..ea307399 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_grid.scss @@ -0,0 +1,151 @@ +// Grid system +// +// Generate semantic grid columns with these mixins. + +@mixin make-row($gutter: $grid-gutter-width) { + --#{$prefix}gutter-x: #{$gutter}; + --#{$prefix}gutter-y: 0; + display: flex; + flex-wrap: wrap; + // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed + margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list + margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list +} + +@mixin make-col-ready() { + // Add box sizing if only the grid is loaded + box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null); + // Prevent columns from becoming too narrow when at smaller grid tiers by + // always setting `width: 100%;`. This works because we set the width + // later on to override this initial width. + flex-shrink: 0; + width: 100%; + max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid + padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list + padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list + margin-top: var(--#{$prefix}gutter-y); +} + +@mixin make-col($size: false, $columns: $grid-columns) { + @if $size { + flex: 0 0 auto; + width: percentage(divide($size, $columns)); + + } @else { + flex: 1 1 0; + max-width: 100%; + } +} + +@mixin make-col-auto() { + flex: 0 0 auto; + width: auto; +} + +@mixin make-col-offset($size, $columns: $grid-columns) { + $num: divide($size, $columns); + margin-left: if($num == 0, 0, percentage($num)); +} + +// Row columns +// +// Specify on a parent element(e.g., .row) to force immediate children into NN +// number of columns. Supports wrapping to new lines, but does not do a Masonry +// style grid. +@mixin row-cols($count) { + > * { + flex: 0 0 auto; + width: percentage(divide(1, $count)); + } +} + +// Framework grid generation +// +// Used only by Bootstrap to generate the correct number of grid classes given +// any value of `$grid-columns`. + +@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) { + @each $breakpoint in map-keys($breakpoints) { + $infix: breakpoint-infix($breakpoint, $breakpoints); + + @include media-breakpoint-up($breakpoint, $breakpoints) { + // Provide basic `.col-{bp}` classes for equal-width flexbox columns + .col#{$infix} { + flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 + } + + .row-cols#{$infix}-auto > * { + @include make-col-auto(); + } + + @if $grid-row-columns > 0 { + @for $i from 1 through $grid-row-columns { + .row-cols#{$infix}-#{$i} { + @include row-cols($i); + } + } + } + + .col#{$infix}-auto { + @include make-col-auto(); + } + + @if $columns > 0 { + @for $i from 1 through $columns { + .col#{$infix}-#{$i} { + @include make-col($i, $columns); + } + } + + // `$columns - 1` because offsetting by the width of an entire row isn't possible + @for $i from 0 through ($columns - 1) { + @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0 + .offset#{$infix}-#{$i} { + @include make-col-offset($i, $columns); + } + } + } + } + + // Gutters + // + // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns. + @each $key, $value in $gutters { + .g#{$infix}-#{$key}, + .gx#{$infix}-#{$key} { + --#{$prefix}gutter-x: #{$value}; + } + + .g#{$infix}-#{$key}, + .gy#{$infix}-#{$key} { + --#{$prefix}gutter-y: #{$value}; + } + } + } + } +} + +@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) { + @each $breakpoint in map-keys($breakpoints) { + $infix: breakpoint-infix($breakpoint, $breakpoints); + + @include media-breakpoint-up($breakpoint, $breakpoints) { + @if $columns > 0 { + @for $i from 1 through $columns { + .g-col#{$infix}-#{$i} { + grid-column: auto / span $i; + } + } + + // Start with `1` because `0` is an invalid value. + // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible. + @for $i from 1 through ($columns - 1) { + .g-start#{$infix}-#{$i} { + grid-column-start: $i; + } + } + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_image.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_image.scss new file mode 100644 index 00000000..e1df779f --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_image.scss @@ -0,0 +1,16 @@ +// Image Mixins +// - Responsive image +// - Retina image + + +// Responsive image +// +// Keep images from scaling beyond the width of their parents. + +@mixin img-fluid { + // Part 1: Set a maximum relative to the parent + max-width: 100%; + // Part 2: Override the height to auto, otherwise images will be stretched + // when setting a width and height attribute on the img element. + height: auto; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_list-group.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_list-group.scss new file mode 100644 index 00000000..6274f343 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_list-group.scss @@ -0,0 +1,26 @@ +@include deprecate("`list-group-item-variant()`", "v5.3.0", "v6.0.0"); + +// List Groups + +// scss-docs-start list-group-mixin +@mixin list-group-item-variant($state, $background, $color) { + .list-group-item-#{$state} { + color: $color; + background-color: $background; + + &.list-group-item-action { + &:hover, + &:focus { + color: $color; + background-color: shade-color($background, 10%); + } + + &.active { + color: $white; + background-color: $color; + border-color: $color; + } + } + } +} +// scss-docs-end list-group-mixin diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_lists.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_lists.scss new file mode 100644 index 00000000..25185626 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_lists.scss @@ -0,0 +1,7 @@ +// Lists + +// Unstyled keeps list items block level, just removes default browser padding and list-style +@mixin list-unstyled { + padding-left: 0; + list-style: none; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_pagination.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_pagination.scss new file mode 100644 index 00000000..0d657964 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_pagination.scss @@ -0,0 +1,10 @@ +// Pagination + +// scss-docs-start pagination-mixin +@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) { + --#{$prefix}pagination-padding-x: #{$padding-x}; + --#{$prefix}pagination-padding-y: #{$padding-y}; + @include rfs($font-size, --#{$prefix}pagination-font-size); + --#{$prefix}pagination-border-radius: #{$border-radius}; +} +// scss-docs-end pagination-mixin diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_reset-text.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_reset-text.scss new file mode 100644 index 00000000..f5bd1afe --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_reset-text.scss @@ -0,0 +1,17 @@ +@mixin reset-text { + font-family: $font-family-base; + // We deliberately do NOT reset font-size or overflow-wrap / word-wrap. + font-style: normal; + font-weight: $font-weight-normal; + line-height: $line-height-base; + text-align: left; // Fallback for where `start` is not supported + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_resize.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_resize.scss new file mode 100644 index 00000000..66f233a6 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_resize.scss @@ -0,0 +1,6 @@ +// Resize anything + +@mixin resizable($direction) { + overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` + resize: $direction; // Options: horizontal, vertical, both +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_table-variants.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_table-variants.scss new file mode 100644 index 00000000..5fe1b9b2 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_table-variants.scss @@ -0,0 +1,24 @@ +// scss-docs-start table-variant +@mixin table-variant($state, $background) { + .table-#{$state} { + $color: color-contrast(opaque($body-bg, $background)); + $hover-bg: mix($color, $background, percentage($table-hover-bg-factor)); + $striped-bg: mix($color, $background, percentage($table-striped-bg-factor)); + $active-bg: mix($color, $background, percentage($table-active-bg-factor)); + $table-border-color: mix($color, $background, percentage($table-border-factor)); + + --#{$prefix}table-color: #{$color}; + --#{$prefix}table-bg: #{$background}; + --#{$prefix}table-border-color: #{$table-border-color}; + --#{$prefix}table-striped-bg: #{$striped-bg}; + --#{$prefix}table-striped-color: #{color-contrast($striped-bg)}; + --#{$prefix}table-active-bg: #{$active-bg}; + --#{$prefix}table-active-color: #{color-contrast($active-bg)}; + --#{$prefix}table-hover-bg: #{$hover-bg}; + --#{$prefix}table-hover-color: #{color-contrast($hover-bg)}; + + color: var(--#{$prefix}table-color); + border-color: var(--#{$prefix}table-border-color); + } +} +// scss-docs-end table-variant diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_text-truncate.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_text-truncate.scss new file mode 100644 index 00000000..3504bb1a --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_text-truncate.scss @@ -0,0 +1,8 @@ +// Text truncate +// Requires inline-block or block for proper styling + +@mixin text-truncate() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_transition.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_transition.scss new file mode 100644 index 00000000..d437f6d8 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_transition.scss @@ -0,0 +1,26 @@ +// stylelint-disable property-disallowed-list +@mixin transition($transition...) { + @if length($transition) == 0 { + $transition: $transition-base; + } + + @if length($transition) > 1 { + @each $value in $transition { + @if $value == null or $value == none { + @warn "The keyword 'none' or 'null' must be used as a single argument."; + } + } + } + + @if $enable-transitions { + @if nth($transition, 1) != null { + transition: $transition; + } + + @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none { + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_utilities.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_utilities.scss new file mode 100644 index 00000000..4795e894 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_utilities.scss @@ -0,0 +1,97 @@ +// Utility generator +// Used to generate utilities & print utilities +@mixin generate-utility($utility, $infix: "", $is-rfs-media-query: false) { + $values: map-get($utility, values); + + // If the values are a list or string, convert it into a map + @if type-of($values) == "string" or type-of(nth($values, 1)) != "list" { + $values: zip($values, $values); + } + + @each $key, $value in $values { + $properties: map-get($utility, property); + + // Multiple properties are possible, for example with vertical or horizontal margins or paddings + @if type-of($properties) == "string" { + $properties: append((), $properties); + } + + // Use custom class if present + $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1)); + $property-class: if($property-class == null, "", $property-class); + + // Use custom CSS variable name if present, otherwise default to `class` + $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class)); + + // State params to generate pseudo-classes + $state: if(map-has-key($utility, state), map-get($utility, state), ()); + + $infix: if($property-class == "" and str-slice($infix, 1, 1) == "-", str-slice($infix, 2), $infix); + + // Don't prefix if value key is null (e.g. with shadow class) + $property-class-modifier: if($key, if($property-class == "" and $infix == "", "", "-") + $key, ""); + + @if map-get($utility, rfs) { + // Inside the media query + @if $is-rfs-media-query { + $val: rfs-value($value); + + // Do not render anything if fluid and non fluid values are the same + $value: if($val == rfs-fluid-value($value), null, $val); + } + @else { + $value: rfs-fluid-value($value); + } + } + + $is-css-var: map-get($utility, css-var); + $is-local-vars: map-get($utility, local-vars); + $is-rtl: map-get($utility, rtl); + + @if $value != null { + @if $is-rtl == false { + /* rtl:begin:remove */ + } + + @if $is-css-var { + .#{$property-class + $infix + $property-class-modifier} { + --#{$prefix}#{$css-variable-name}: #{$value}; + } + + @each $pseudo in $state { + .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} { + --#{$prefix}#{$css-variable-name}: #{$value}; + } + } + } @else { + .#{$property-class + $infix + $property-class-modifier} { + @each $property in $properties { + @if $is-local-vars { + @each $local-var, $variable in $is-local-vars { + --#{$prefix}#{$local-var}: #{$variable}; + } + } + #{$property}: $value if($enable-important-utilities, !important, null); + } + } + + @each $pseudo in $state { + .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} { + @each $property in $properties { + @if $is-local-vars { + @each $local-var, $variable in $is-local-vars { + --#{$prefix}#{$local-var}: #{$variable}; + } + } + #{$property}: $value if($enable-important-utilities, !important, null); + } + } + } + } + + @if $is-rtl == false { + /* rtl:end:remove */ + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_visually-hidden.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_visually-hidden.scss new file mode 100644 index 00000000..082aeec9 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_visually-hidden.scss @@ -0,0 +1,33 @@ +// stylelint-disable declaration-no-important + +// Hide content visually while keeping it accessible to assistive technologies +// +// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/ +// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/ + +@mixin visually-hidden() { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686 + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; + + // Fix for positioned table caption that could become anonymous cells + &:not(caption) { + position: absolute !important; + } +} + +// Use to only display content when it's focused, or one of its child elements is focused +// (i.e. when focus is within the element/container that the class was applied to) +// +// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 + +@mixin visually-hidden-focusable() { + &:not(:focus):not(:focus-within) { + @include visually-hidden(); + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/jasmine.js b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/jasmine.js new file mode 100644 index 00000000..25d838c9 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/jasmine.js @@ -0,0 +1,16 @@ +/* eslint-disable camelcase */ + +'use strict' + +const path = require('node:path') + +module.exports = { + spec_dir: 'scss', + // Make Jasmine look for `.test.scss` files + spec_files: ['**/*.{test,spec}.scss'], + // Compile them into JS scripts running `sass-true` + requires: [path.join(__dirname, 'sass-true/register')], + // Ensure we use `require` so that the require.extensions works + // as `import` completely bypasses it + jsLoader: 'require' +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_auto-import-of-variables-dark.test.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_auto-import-of-variables-dark.test.scss new file mode 100644 index 00000000..f08ae587 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_auto-import-of-variables-dark.test.scss @@ -0,0 +1,7 @@ +// TODO: this file can be removed safely in v6 when `@import "variables-dark"` will be removed at the end of _variables.scss + +@import "../../functions"; +@import "../../variables"; +// Voluntarily not importing _variables-dark.scss +@import "../../maps"; +@import "../../mixins"; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_color-modes.test.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_color-modes.test.scss new file mode 100644 index 00000000..9ecc628d --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_color-modes.test.scss @@ -0,0 +1,69 @@ +// stylelint-disable selector-attribute-quotes + +@import "../../functions"; +@import "../../variables"; +@import "../../variables-dark"; +@import "../../maps"; +@import "../../mixins"; + +@include describe("global $color-mode-type: data") { + @include it("generates data attribute selectors for dark mode") { + @include assert() { + @include output() { + @include color-mode(dark) { + .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + } + } + @include color-mode(dark, true) { + --custom-color: #{mix($indigo, $blue, 50%)}; + } + } + @include expect() { + [data-bs-theme=dark] .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + } + [data-bs-theme=dark] { + --custom-color: #3a3ff8; + } + } + } + } +} + +@include describe("global $color-mode-type: media-query") { + @include it("generates media queries for dark mode") { + $color-mode-type: media-query !global; + + @include assert() { + @include output() { + @include color-mode(dark) { + .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + } + } + @include color-mode(dark, true) { + --custom-color: #{mix($indigo, $blue, 50%)}; + } + } + @include expect() { + @media (prefers-color-scheme: dark) { + .element { + color: var(--bs-primary-text-emphasis); + background-color: var(--bs-primary-bg-subtle); + } + } + @media (prefers-color-scheme: dark) { + :root { + --custom-color: #3a3ff8; + } + } + } + } + + $color-mode-type: data !global; + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_media-query-color-mode-full.test.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_media-query-color-mode-full.test.scss new file mode 100644 index 00000000..00ed82d6 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_media-query-color-mode-full.test.scss @@ -0,0 +1,8 @@ +$color-mode-type: media-query; + +@import "../../bootstrap"; + +@include describe("global $color-mode-type: media-query") { + @include it("compiles entirely Bootstrap CSS with media-query color mode") { // stylelint-disable-line block-no-empty + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_utilities.test.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_utilities.test.scss new file mode 100644 index 00000000..8140ac47 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_utilities.test.scss @@ -0,0 +1,393 @@ +$prefix: bs-; +$enable-important-utilities: false; + +// Important: Do not import rfs to check that the mixin just calls the appropriate functions from it +@import "../../mixins/utilities"; + +@mixin test-generate-utility($params...) { + @include assert() { + @include output() { + @include generate-utility($params...); + } + + @include expect() { + @content; + } + } +} + +@include describe(generate-utility) { + @include it("generates a utility class for each value") { + @include test-generate-utility( + ( + property: "padding", + values: (small: .5rem, large: 2rem) + ) + ) { + .padding-small { + padding: .5rem; + } + + .padding-large { + padding: 2rem; + } + } + } + + @include describe("global $enable-important-utilities: true") { + @include it("sets !important") { + $enable-important-utilities: true !global; + + @include test-generate-utility( + ( + property: "padding", + values: (small: .5rem, large: 2rem) + ) + ) { + .padding-small { + padding: .5rem !important; + } + + .padding-large { + padding: 2rem !important; + } + } + + $enable-important-utilities: false !global; + } + } + + @include describe("$utility") { + @include describe("values") { + @include it("supports null keys") { + @include test-generate-utility( + ( + property: "padding", + values: (null: 1rem, small: .5rem, large: 2rem) + ), + ) { + .padding { + padding: 1rem; + } + + .padding-small { + padding: .5rem; + } + + .padding-large { + padding: 2rem; + } + } + } + + @include it("ignores null values") { + @include test-generate-utility( + ( + property: "padding", + values: (small: null, large: 2rem) + ) + ) { + .padding-large { + padding: 2rem; + } + } + } + + @include it("supports lists") { + @include test-generate-utility( + ( + property: "padding", + values: 1rem 2rem + ) + ) { + .padding-1rem { + padding: 1rem; + } + + .padding-2rem { + padding: 2rem; + } + } + } + + @include it("supports single values") { + @include test-generate-utility( + ( + property: padding, + values: 1rem + ) + ) { + .padding-1rem { + padding: 1rem; + } + } + } + } + + @include describe("class & property") { + @include it("adds each property to the declaration") { + @include test-generate-utility( + ( + class: padding-x, + property: padding-inline-start padding-inline-end, + values: 1rem + ) + ) { + .padding-x-1rem { + padding-inline-start: 1rem; + padding-inline-end: 1rem; + } + } + } + + @include it("uses the first property as class name") { + @include test-generate-utility( + ( + property: padding-inline-start padding-inline-end, + values: 1rem + ) + ) { + .padding-inline-start-1rem { + padding-inline-start: 1rem; + padding-inline-end: 1rem; + } + } + } + + @include it("supports a null class to create classes straight from the values") { + @include test-generate-utility( + ( + property: visibility, + class: null, + values: ( + visible: visible, + invisible: hidden, + ) + ) + ) { + .visible { + visibility: visible; + } + + .invisible { + visibility: hidden; + } + } + } + } + + @include describe("state") { + @include it("Generates selectors for each states") { + @include test-generate-utility( + ( + property: padding, + values: 1rem, + state: hover focus, + ) + ) { + .padding-1rem { + padding: 1rem; + } + + .padding-1rem-hover:hover { + padding: 1rem; + } + + .padding-1rem-focus:focus { + padding: 1rem; + } + } + } + } + + @include describe("css-var"){ + @include it("sets a CSS variable instead of the property") { + @include test-generate-utility( + ( + property: padding, + css-variable-name: padding, + css-var: true, + values: 1rem 2rem + ) + ) { + .padding-1rem { + --bs-padding: 1rem; + } + + .padding-2rem { + --bs-padding: 2rem; + } + } + } + + @include it("defaults to class") { + @include test-generate-utility( + ( + property: padding, + class: padding, + css-var: true, + values: 1rem 2rem + ) + ) { + .padding-1rem { + --bs-padding: 1rem; + } + + .padding-2rem { + --bs-padding: 2rem; + } + } + } + } + + @include describe("local-vars") { + @include it("generates the listed variables") { + @include test-generate-utility( + ( + property: color, + class: desaturated-color, + local-vars: ( + color-opacity: 1, + color-saturation: .25 + ), + values: ( + blue: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity)) + ) + ) + ) { + .desaturated-color-blue { + --bs-color-opacity: 1; + // Sass compilation will put a leading zero so we want to keep that one + // stylelint-disable-next-line @stylistic/number-leading-zero + --bs-color-saturation: 0.25; + color: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity)); + } + } + } + } + + @include describe("css-var & state") { + @include it("Generates a rule with for each state with a CSS variable") { + @include test-generate-utility( + ( + property: padding, + css-var: true, + css-variable-name: padding, + values: 1rem, + state: hover focus, + ) + ) { + .padding-1rem { + --bs-padding: 1rem; + } + + .padding-1rem-hover:hover { + --bs-padding: 1rem; + } + + .padding-1rem-focus:focus { + --bs-padding: 1rem; + } + } + } + } + + @include describe("rtl") { + @include it("sets up RTLCSS for removal when false") { + @include test-generate-utility( + ( + property: padding, + values: 1rem, + rtl: false + ) + ) { + /* rtl:begin:remove */ + + .padding-1rem { + padding: 1rem; + } + + /* rtl:end:remove */ + + } + } + } + + @include describe("rfs") { + @include it("sets the fluid value when not inside media query") { + @include test-generate-utility( + ( + property: padding, + values: 1rem, + rfs: true + ) + ) { + .padding-1rem { + padding: rfs-fluid-value(1rem); + } + } + } + + @include it("sets the value when inside the media query") { + @include test-generate-utility( + ( + property: padding, + values: 1rem, + rfs: true + ), + $is-rfs-media-query: true + ) { + .padding-1rem { + padding: rfs-value(1rem); + } + } + } + } + } + + @include describe("$infix") { + @include it("inserts the given infix") { + @include test-generate-utility( + ( + property: "padding", + values: (null: 1rem, small: .5rem, large: 2rem) + ), + $infix: -sm + ) { + .padding-sm { + padding: 1rem; + } + + .padding-sm-small { + padding: .5rem; + } + + .padding-sm-large { + padding: 2rem; + } + } + } + + @include it("strips leading - if class is null") { + @include test-generate-utility( + ( + property: visibility, + class: null, + values: ( + visible: visible, + invisible: hidden, + ) + ), + -sm + ) { + .sm-visible { + visibility: visible; + } + + .sm-invisible { + visibility: hidden; + } + } + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/register.js b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/register.js new file mode 100644 index 00000000..d93e414c --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/register.js @@ -0,0 +1,14 @@ +'use strict' + +const path = require('node:path') + +const runnerPath = path.join(__dirname, 'runner').replace(/\\/g, '/') + +require.extensions['.scss'] = (module, filename) => { + const normalizedFilename = filename.replace(/\\/g, '/') + + return module._compile(` + const runner = require('${runnerPath}') + runner('${normalizedFilename}', { describe, it }) + `, filename) +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/runner.js b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/runner.js new file mode 100644 index 00000000..bef870ac --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/runner.js @@ -0,0 +1,17 @@ +'use strict' + +const fs = require('node:fs') +const path = require('node:path') +const { runSass } = require('sass-true') + +module.exports = (filename, { describe, it }) => { + const data = fs.readFileSync(filename, 'utf8') + const TRUE_SETUP = '$true-terminal-output: false; @import "true";' + const sassString = TRUE_SETUP + data + + runSass( + { describe, it, sourceType: 'string' }, + sassString, + { loadPaths: [path.dirname(filename)] } + ) +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/utilities/_api.test.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/utilities/_api.test.scss new file mode 100644 index 00000000..304d8d1c --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/utilities/_api.test.scss @@ -0,0 +1,75 @@ +@import "../../functions"; +@import "../../variables"; +@import "../../variables-dark"; +@import "../../maps"; +@import "../../mixins"; + +$utilities: (); + +@include describe("utilities/api") { + @include it("generates utilities for each breakpoints") { + $utilities: ( + margin: ( + property: margin, + values: auto + ), + padding: ( + property: padding, + responsive: true, + values: 1rem + ), + font-size: ( + property: font-size, + values: (large: 1.25rem), + print: true + ) + ) !global; + + $grid-breakpoints: ( + xs: 0, + sm: 333px, + md: 666px + ) !global; + + @include assert() { + @include output() { + @import "../../utilities/api"; + } + + @include expect() { + // margin is not set to responsive + .margin-auto { + margin: auto !important; + } + + // padding is, though + .padding-1rem { + padding: 1rem !important; + } + + .font-size-large { + font-size: 1.25rem !important; + } + + @media (min-width: 333px) { + .padding-sm-1rem { + padding: 1rem !important; + } + } + + @media (min-width: 666px) { + .padding-md-1rem { + padding: 1rem !important; + } + } + + @media print { + .font-size-print-large { + font-size: 1.25rem !important; + } + } + } + + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/utilities/_api.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/utilities/_api.scss new file mode 100644 index 00000000..62e1d398 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/utilities/_api.scss @@ -0,0 +1,47 @@ +// Loop over each breakpoint +@each $breakpoint in map-keys($grid-breakpoints) { + + // Generate media query if needed + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + // Loop over each utility property + @each $key, $utility in $utilities { + // The utility can be disabled with `false`, thus check if the utility is a map first + // Only proceed if responsive media queries are enabled or if it's the base media query + @if type-of($utility) == "map" and (map-get($utility, responsive) or $infix == "") { + @include generate-utility($utility, $infix); + } + } + } +} + +// RFS rescaling +@media (min-width: $rfs-mq-value) { + @each $breakpoint in map-keys($grid-breakpoints) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) { + // Loop over each utility property + @each $key, $utility in $utilities { + // The utility can be disabled with `false`, thus check if the utility is a map first + // Only proceed if responsive media queries are enabled or if it's the base media query + @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") { + @include generate-utility($utility, $infix, true); + } + } + } + } +} + + +// Print utilities +@media print { + @each $key, $utility in $utilities { + // The utility can be disabled with `false`, thus check if the utility is a map first + // Then check if the utility needs print styles + @if type-of($utility) == "map" and map-get($utility, print) == true { + @include generate-utility($utility, "-print"); + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/vendor/_rfs.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/vendor/_rfs.scss new file mode 100644 index 00000000..aa1f82b9 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/vendor/_rfs.scss @@ -0,0 +1,348 @@ +// stylelint-disable scss/dimension-no-non-numeric-values + +// SCSS RFS mixin +// +// Automated responsive values for font sizes, paddings, margins and much more +// +// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE) + +// Configuration + +// Base value +$rfs-base-value: 1.25rem !default; +$rfs-unit: rem !default; + +@if $rfs-unit != rem and $rfs-unit != px { + @error "`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`."; +} + +// Breakpoint at where values start decreasing if screen width is smaller +$rfs-breakpoint: 1200px !default; +$rfs-breakpoint-unit: px !default; + +@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem { + @error "`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`."; +} + +// Resize values based on screen height and width +$rfs-two-dimensional: false !default; + +// Factor of decrease +$rfs-factor: 10 !default; + +@if type-of($rfs-factor) != number or $rfs-factor <= 1 { + @error "`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1."; +} + +// Mode. Possibilities: "min-media-query", "max-media-query" +$rfs-mode: min-media-query !default; + +// Generate enable or disable classes. Possibilities: false, "enable" or "disable" +$rfs-class: false !default; + +// 1 rem = $rfs-rem-value px +$rfs-rem-value: 16 !default; + +// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14 +$rfs-safari-iframe-resize-bug-fix: false !default; + +// Disable RFS by setting $enable-rfs to false +$enable-rfs: true !default; + +// Cache $rfs-base-value unit +$rfs-base-value-unit: unit($rfs-base-value); + +@function divide($dividend, $divisor, $precision: 10) { + $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1); + $dividend: abs($dividend); + $divisor: abs($divisor); + @if $dividend == 0 { + @return 0; + } + @if $divisor == 0 { + @error "Cannot divide by 0"; + } + $remainder: $dividend; + $result: 0; + $factor: 10; + @while ($remainder > 0 and $precision >= 0) { + $quotient: 0; + @while ($remainder >= $divisor) { + $remainder: $remainder - $divisor; + $quotient: $quotient + 1; + } + $result: $result * 10 + $quotient; + $factor: $factor * .1; + $remainder: $remainder * 10; + $precision: $precision - 1; + @if ($precision < 0 and $remainder >= $divisor * 5) { + $result: $result + 1; + } + } + $result: $result * $factor * $sign; + $dividend-unit: unit($dividend); + $divisor-unit: unit($divisor); + $unit-map: ( + "px": 1px, + "rem": 1rem, + "em": 1em, + "%": 1% + ); + @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) { + $result: $result * map-get($unit-map, $dividend-unit); + } + @return $result; +} + +// Remove px-unit from $rfs-base-value for calculations +@if $rfs-base-value-unit == px { + $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1); +} +@else if $rfs-base-value-unit == rem { + $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value)); +} + +// Cache $rfs-breakpoint unit to prevent multiple calls +$rfs-breakpoint-unit-cache: unit($rfs-breakpoint); + +// Remove unit from $rfs-breakpoint for calculations +@if $rfs-breakpoint-unit-cache == px { + $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1); +} +@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == "em" { + $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value)); +} + +// Calculate the media query value +$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit}); +$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width); +$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height); + +// Internal mixin used to determine which media query needs to be used +@mixin _rfs-media-query { + @if $rfs-two-dimensional { + @if $rfs-mode == max-media-query { + @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) { + @content; + } + } + @else { + @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) { + @content; + } + } + } + @else { + @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) { + @content; + } + } +} + +// Internal mixin that adds disable classes to the selector if needed. +@mixin _rfs-rule { + @if $rfs-class == disable and $rfs-mode == max-media-query { + // Adding an extra class increases specificity, which prevents the media query to override the property + &, + .disable-rfs &, + &.disable-rfs { + @content; + } + } + @else if $rfs-class == enable and $rfs-mode == min-media-query { + .enable-rfs &, + &.enable-rfs { + @content; + } + } @else { + @content; + } +} + +// Internal mixin that adds enable classes to the selector if needed. +@mixin _rfs-media-query-rule { + + @if $rfs-class == enable { + @if $rfs-mode == min-media-query { + @content; + } + + @include _rfs-media-query () { + .enable-rfs &, + &.enable-rfs { + @content; + } + } + } + @else { + @if $rfs-class == disable and $rfs-mode == min-media-query { + .disable-rfs &, + &.disable-rfs { + @content; + } + } + @include _rfs-media-query () { + @content; + } + } +} + +// Helper function to get the formatted non-responsive value +@function rfs-value($values) { + // Convert to list + $values: if(type-of($values) != list, ($values,), $values); + + $val: ""; + + // Loop over each value and calculate value + @each $value in $values { + @if $value == 0 { + $val: $val + " 0"; + } + @else { + // Cache $value unit + $unit: if(type-of($value) == "number", unit($value), false); + + @if $unit == px { + // Convert to rem if needed + $val: $val + " " + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value); + } + @else if $unit == rem { + // Convert to px if needed + $val: $val + " " + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value); + } @else { + // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value + $val: $val + " " + $value; + } + } + } + + // Remove first space + @return unquote(str-slice($val, 2)); +} + +// Helper function to get the responsive value calculated by RFS +@function rfs-fluid-value($values) { + // Convert to list + $values: if(type-of($values) != list, ($values,), $values); + + $val: ""; + + // Loop over each value and calculate value + @each $value in $values { + @if $value == 0 { + $val: $val + " 0"; + } @else { + // Cache $value unit + $unit: if(type-of($value) == "number", unit($value), false); + + // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value + @if not $unit or $unit != px and $unit != rem { + $val: $val + " " + $value; + } @else { + // Remove unit from $value for calculations + $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value))); + + // Only add the media query if the value is greater than the minimum value + @if abs($value) <= $rfs-base-value or not $enable-rfs { + $val: $val + " " + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px); + } + @else { + // Calculate the minimum value + $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor); + + // Calculate difference between $value and the minimum value + $value-diff: abs($value) - $value-min; + + // Base value formatting + $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px); + + // Use negative value if needed + $min-width: if($value < 0, -$min-width, $min-width); + + // Use `vmin` if two-dimensional is enabled + $variable-unit: if($rfs-two-dimensional, vmin, vw); + + // Calculate the variable width between 0 and $rfs-breakpoint + $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit}; + + // Return the calculated value + $val: $val + " calc(" + $min-width + if($value < 0, " - ", " + ") + $variable-width + ")"; + } + } + } + } + + // Remove first space + @return unquote(str-slice($val, 2)); +} + +// RFS mixin +@mixin rfs($values, $property: font-size) { + @if $values != null { + $val: rfs-value($values); + $fluid-val: rfs-fluid-value($values); + + // Do not print the media query if responsive & non-responsive values are the same + @if $val == $fluid-val { + #{$property}: $val; + } + @else { + @include _rfs-rule () { + #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val); + + // Include safari iframe resize fix if needed + min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null); + } + + @include _rfs-media-query-rule () { + #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val); + } + } + } +} + +// Shorthand helper mixins +@mixin font-size($value) { + @include rfs($value); +} + +@mixin padding($value) { + @include rfs($value, padding); +} + +@mixin padding-top($value) { + @include rfs($value, padding-top); +} + +@mixin padding-right($value) { + @include rfs($value, padding-right); +} + +@mixin padding-bottom($value) { + @include rfs($value, padding-bottom); +} + +@mixin padding-left($value) { + @include rfs($value, padding-left); +} + +@mixin margin($value) { + @include rfs($value, margin); +} + +@mixin margin-top($value) { + @include rfs($value, margin-top); +} + +@mixin margin-right($value) { + @include rfs($value, margin-right); +} + +@mixin margin-bottom($value) { + @include rfs($value, margin-bottom); +} + +@mixin margin-left($value) { + @include rfs($value, margin-left); +} diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.js b/extensions/pagetop-bootsier/static/js/bootstrap.js new file mode 100644 index 00000000..e3a59e3a --- /dev/null +++ b/extensions/pagetop-bootsier/static/js/bootstrap.js @@ -0,0 +1,4494 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) : + typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper)); +})(this, (function (Popper) { 'use strict'; + + function _interopNamespaceDefault(e) { + const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); + if (e) { + for (const k in e) { + if (k !== 'default') { + const d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + n.default = e; + return Object.freeze(n); + } + + const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper); + + /** + * -------------------------------------------------------------------------- + * Bootstrap dom/data.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Constants + */ + + const elementMap = new Map(); + const Data = { + set(element, key, instance) { + if (!elementMap.has(element)) { + elementMap.set(element, new Map()); + } + const instanceMap = elementMap.get(element); + + // make it clear we only want one instance per element + // can be removed later when multiple key/instances are fine to be used + if (!instanceMap.has(key) && instanceMap.size !== 0) { + // eslint-disable-next-line no-console + console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); + return; + } + instanceMap.set(key, instance); + }, + get(element, key) { + if (elementMap.has(element)) { + return elementMap.get(element).get(key) || null; + } + return null; + }, + remove(element, key) { + if (!elementMap.has(element)) { + return; + } + const instanceMap = elementMap.get(element); + instanceMap.delete(key); + + // free up element references if there are no instances left for an element + if (instanceMap.size === 0) { + elementMap.delete(element); + } + } + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/index.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const MAX_UID = 1000000; + const MILLISECONDS_MULTIPLIER = 1000; + const TRANSITION_END = 'transitionend'; + + /** + * Properly escape IDs selectors to handle weird IDs + * @param {string} selector + * @returns {string} + */ + const parseSelector = selector => { + if (selector && window.CSS && window.CSS.escape) { + // document.querySelector needs escaping to handle IDs (html5+) containing for instance / + selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`); + } + return selector; + }; + + // Shout-out Angus Croll (https://goo.gl/pxwQGp) + const toType = object => { + if (object === null || object === undefined) { + return `${object}`; + } + return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(); + }; + + /** + * Public Util API + */ + + const getUID = prefix => { + do { + prefix += Math.floor(Math.random() * MAX_UID); + } while (document.getElementById(prefix)); + return prefix; + }; + const getTransitionDurationFromElement = element => { + if (!element) { + return 0; + } + + // Get transition-duration of the element + let { + transitionDuration, + transitionDelay + } = window.getComputedStyle(element); + const floatTransitionDuration = Number.parseFloat(transitionDuration); + const floatTransitionDelay = Number.parseFloat(transitionDelay); + + // Return 0 if element or transition duration is not found + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } + + // If multiple durations are defined, take the first + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }; + const triggerTransitionEnd = element => { + element.dispatchEvent(new Event(TRANSITION_END)); + }; + const isElement = object => { + if (!object || typeof object !== 'object') { + return false; + } + if (typeof object.jquery !== 'undefined') { + object = object[0]; + } + return typeof object.nodeType !== 'undefined'; + }; + const getElement = object => { + // it's a jQuery object or a node element + if (isElement(object)) { + return object.jquery ? object[0] : object; + } + if (typeof object === 'string' && object.length > 0) { + return document.querySelector(parseSelector(object)); + } + return null; + }; + const isVisible = element => { + if (!isElement(element) || element.getClientRects().length === 0) { + return false; + } + const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; + // Handle `details` element as its content may falsie appear visible when it is closed + const closedDetails = element.closest('details:not([open])'); + if (!closedDetails) { + return elementIsVisible; + } + if (closedDetails !== element) { + const summary = element.closest('summary'); + if (summary && summary.parentNode !== closedDetails) { + return false; + } + if (summary === null) { + return false; + } + } + return elementIsVisible; + }; + const isDisabled = element => { + if (!element || element.nodeType !== Node.ELEMENT_NODE) { + return true; + } + if (element.classList.contains('disabled')) { + return true; + } + if (typeof element.disabled !== 'undefined') { + return element.disabled; + } + return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'; + }; + const findShadowRoot = element => { + if (!document.documentElement.attachShadow) { + return null; + } + + // Can find the shadow root otherwise it'll return the document + if (typeof element.getRootNode === 'function') { + const root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + if (element instanceof ShadowRoot) { + return element; + } + + // when we don't find a shadow root + if (!element.parentNode) { + return null; + } + return findShadowRoot(element.parentNode); + }; + const noop = () => {}; + + /** + * Trick to restart an element's animation + * + * @param {HTMLElement} element + * @return void + * + * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation + */ + const reflow = element => { + element.offsetHeight; // eslint-disable-line no-unused-expressions + }; + const getjQuery = () => { + if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { + return window.jQuery; + } + return null; + }; + const DOMContentLoadedCallbacks = []; + const onDOMContentLoaded = callback => { + if (document.readyState === 'loading') { + // add listener on the first call when the document is in loading state + if (!DOMContentLoadedCallbacks.length) { + document.addEventListener('DOMContentLoaded', () => { + for (const callback of DOMContentLoadedCallbacks) { + callback(); + } + }); + } + DOMContentLoadedCallbacks.push(callback); + } else { + callback(); + } + }; + const isRTL = () => document.documentElement.dir === 'rtl'; + const defineJQueryPlugin = plugin => { + onDOMContentLoaded(() => { + const $ = getjQuery(); + /* istanbul ignore if */ + if ($) { + const name = plugin.NAME; + const JQUERY_NO_CONFLICT = $.fn[name]; + $.fn[name] = plugin.jQueryInterface; + $.fn[name].Constructor = plugin; + $.fn[name].noConflict = () => { + $.fn[name] = JQUERY_NO_CONFLICT; + return plugin.jQueryInterface; + }; + } + }); + }; + const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => { + return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue; + }; + const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { + if (!waitForTransition) { + execute(callback); + return; + } + const durationPadding = 5; + const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; + let called = false; + const handler = ({ + target + }) => { + if (target !== transitionElement) { + return; + } + called = true; + transitionElement.removeEventListener(TRANSITION_END, handler); + execute(callback); + }; + transitionElement.addEventListener(TRANSITION_END, handler); + setTimeout(() => { + if (!called) { + triggerTransitionEnd(transitionElement); + } + }, emulatedDuration); + }; + + /** + * Return the previous/next element of a list. + * + * @param {array} list The list of elements + * @param activeElement The active element + * @param shouldGetNext Choose to get next or previous element + * @param isCycleAllowed + * @return {Element|elem} The proper element + */ + const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { + const listLength = list.length; + let index = list.indexOf(activeElement); + + // if the element does not exist in the list return an element + // depending on the direction and if cycle is allowed + if (index === -1) { + return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]; + } + index += shouldGetNext ? 1 : -1; + if (isCycleAllowed) { + index = (index + listLength) % listLength; + } + return list[Math.max(0, Math.min(index, listLength - 1))]; + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap dom/event-handler.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const namespaceRegex = /[^.]*(?=\..*)\.|.*/; + const stripNameRegex = /\..*/; + const stripUidRegex = /::\d+$/; + const eventRegistry = {}; // Events storage + let uidEvent = 1; + const customEvents = { + mouseenter: 'mouseover', + mouseleave: 'mouseout' + }; + const nativeEvents = 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']); + + /** + * Private methods + */ + + function makeEventUid(element, uid) { + return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; + } + function getElementEvents(element) { + const uid = makeEventUid(element); + element.uidEvent = uid; + eventRegistry[uid] = eventRegistry[uid] || {}; + return eventRegistry[uid]; + } + function bootstrapHandler(element, fn) { + return function handler(event) { + hydrateObj(event, { + delegateTarget: element + }); + if (handler.oneOff) { + EventHandler.off(element, event.type, fn); + } + return fn.apply(element, [event]); + }; + } + function bootstrapDelegationHandler(element, selector, fn) { + return function handler(event) { + const domElements = element.querySelectorAll(selector); + for (let { + target + } = event; target && target !== this; target = target.parentNode) { + for (const domElement of domElements) { + if (domElement !== target) { + continue; + } + hydrateObj(event, { + delegateTarget: target + }); + if (handler.oneOff) { + EventHandler.off(element, event.type, selector, fn); + } + return fn.apply(target, [event]); + } + } + }; + } + function findHandler(events, callable, delegationSelector = null) { + return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector); + } + function normalizeParameters(originalTypeEvent, handler, delegationFunction) { + const isDelegated = typeof handler === 'string'; + // TODO: tooltip passes `false` instead of selector, so we need to check + const callable = isDelegated ? delegationFunction : handler || delegationFunction; + let typeEvent = getTypeEvent(originalTypeEvent); + if (!nativeEvents.has(typeEvent)) { + typeEvent = originalTypeEvent; + } + return [isDelegated, callable, typeEvent]; + } + function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); + + // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position + // this prevents the handler from being dispatched the same way as mouseover or mouseout does + if (originalTypeEvent in customEvents) { + const wrapFunction = fn => { + return function (event) { + if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { + return fn.call(this, event); + } + }; + }; + callable = wrapFunction(callable); + } + const events = getElementEvents(element); + const handlers = events[typeEvent] || (events[typeEvent] = {}); + const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); + if (previousFunction) { + previousFunction.oneOff = previousFunction.oneOff && oneOff; + return; + } + const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, '')); + const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); + fn.delegationSelector = isDelegated ? handler : null; + fn.callable = callable; + fn.oneOff = oneOff; + fn.uidEvent = uid; + handlers[uid] = fn; + element.addEventListener(typeEvent, fn, isDelegated); + } + function removeHandler(element, events, typeEvent, handler, delegationSelector) { + const fn = findHandler(events[typeEvent], handler, delegationSelector); + if (!fn) { + return; + } + element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); + delete events[typeEvent][fn.uidEvent]; + } + function removeNamespacedHandlers(element, events, typeEvent, namespace) { + const storeElementEvent = events[typeEvent] || {}; + for (const [handlerKey, event] of Object.entries(storeElementEvent)) { + if (handlerKey.includes(namespace)) { + removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); + } + } + } + function getTypeEvent(event) { + // allow to get the native events from namespaced events ('click.bs.button' --> 'click') + event = event.replace(stripNameRegex, ''); + return customEvents[event] || event; + } + const EventHandler = { + on(element, event, handler, delegationFunction) { + addHandler(element, event, handler, delegationFunction, false); + }, + one(element, event, handler, delegationFunction) { + addHandler(element, event, handler, delegationFunction, true); + }, + off(element, originalTypeEvent, handler, delegationFunction) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); + const inNamespace = typeEvent !== originalTypeEvent; + const events = getElementEvents(element); + const storeElementEvent = events[typeEvent] || {}; + const isNamespace = originalTypeEvent.startsWith('.'); + if (typeof callable !== 'undefined') { + // Simplest case: handler is passed, remove that listener ONLY. + if (!Object.keys(storeElementEvent).length) { + return; + } + removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); + return; + } + if (isNamespace) { + for (const elementEvent of Object.keys(events)) { + removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); + } + } + for (const [keyHandlers, event] of Object.entries(storeElementEvent)) { + const handlerKey = keyHandlers.replace(stripUidRegex, ''); + if (!inNamespace || originalTypeEvent.includes(handlerKey)) { + removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); + } + } + }, + trigger(element, event, args) { + if (typeof event !== 'string' || !element) { + return null; + } + const $ = getjQuery(); + const typeEvent = getTypeEvent(event); + const inNamespace = event !== typeEvent; + let jQueryEvent = null; + let bubbles = true; + let nativeDispatch = true; + let defaultPrevented = false; + if (inNamespace && $) { + jQueryEvent = $.Event(event, args); + $(element).trigger(jQueryEvent); + bubbles = !jQueryEvent.isPropagationStopped(); + nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); + defaultPrevented = jQueryEvent.isDefaultPrevented(); + } + const evt = hydrateObj(new Event(event, { + bubbles, + cancelable: true + }), args); + if (defaultPrevented) { + evt.preventDefault(); + } + if (nativeDispatch) { + element.dispatchEvent(evt); + } + if (evt.defaultPrevented && jQueryEvent) { + jQueryEvent.preventDefault(); + } + return evt; + } + }; + function hydrateObj(obj, meta = {}) { + for (const [key, value] of Object.entries(meta)) { + try { + obj[key] = value; + } catch (_unused) { + Object.defineProperty(obj, key, { + configurable: true, + get() { + return value; + } + }); + } + } + return obj; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap dom/manipulator.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + function normalizeData(value) { + if (value === 'true') { + return true; + } + if (value === 'false') { + return false; + } + if (value === Number(value).toString()) { + return Number(value); + } + if (value === '' || value === 'null') { + return null; + } + if (typeof value !== 'string') { + return value; + } + try { + return JSON.parse(decodeURIComponent(value)); + } catch (_unused) { + return value; + } + } + function normalizeDataKey(key) { + return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`); + } + const Manipulator = { + setDataAttribute(element, key, value) { + element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); + }, + removeDataAttribute(element, key) { + element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); + }, + getDataAttributes(element) { + if (!element) { + return {}; + } + const attributes = {}; + const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig')); + for (const key of bsKeys) { + let pureKey = key.replace(/^bs/, ''); + pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); + attributes[pureKey] = normalizeData(element.dataset[key]); + } + return attributes; + }, + getDataAttribute(element, key) { + return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); + } + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/config.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Class definition + */ + + class Config { + // Getters + static get Default() { + return {}; + } + static get DefaultType() { + return {}; + } + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!'); + } + _getConfig(config) { + config = this._mergeConfigObj(config); + config = this._configAfterMerge(config); + this._typeCheckConfig(config); + return config; + } + _configAfterMerge(config) { + return config; + } + _mergeConfigObj(config, element) { + const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse + + return { + ...this.constructor.Default, + ...(typeof jsonConfig === 'object' ? jsonConfig : {}), + ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}), + ...(typeof config === 'object' ? config : {}) + }; + } + _typeCheckConfig(config, configTypes = this.constructor.DefaultType) { + for (const [property, expectedTypes] of Object.entries(configTypes)) { + const value = config[property]; + const valueType = isElement(value) ? 'element' : toType(value); + if (!new RegExp(expectedTypes).test(valueType)) { + throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); + } + } + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap base-component.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const VERSION = '5.3.3'; + + /** + * Class definition + */ + + class BaseComponent extends Config { + constructor(element, config) { + super(); + element = getElement(element); + if (!element) { + return; + } + this._element = element; + this._config = this._getConfig(config); + Data.set(this._element, this.constructor.DATA_KEY, this); + } + + // Public + dispose() { + Data.remove(this._element, this.constructor.DATA_KEY); + EventHandler.off(this._element, this.constructor.EVENT_KEY); + for (const propertyName of Object.getOwnPropertyNames(this)) { + this[propertyName] = null; + } + } + _queueCallback(callback, element, isAnimated = true) { + executeAfterTransition(callback, element, isAnimated); + } + _getConfig(config) { + config = this._mergeConfigObj(config, this._element); + config = this._configAfterMerge(config); + this._typeCheckConfig(config); + return config; + } + + // Static + static getInstance(element) { + return Data.get(getElement(element), this.DATA_KEY); + } + static getOrCreateInstance(element, config = {}) { + return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null); + } + static get VERSION() { + return VERSION; + } + static get DATA_KEY() { + return `bs.${this.NAME}`; + } + static get EVENT_KEY() { + return `.${this.DATA_KEY}`; + } + static eventName(name) { + return `${name}${this.EVENT_KEY}`; + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap dom/selector-engine.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const getSelector = element => { + let selector = element.getAttribute('data-bs-target'); + if (!selector || selector === '#') { + let hrefAttribute = element.getAttribute('href'); + + // The only valid content that could double as a selector are IDs or classes, + // so everything starting with `#` or `.`. If a "real" URL is used as the selector, + // `document.querySelector` will rightfully complain it is invalid. + // See https://github.com/twbs/bootstrap/issues/32273 + if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) { + return null; + } + + // Just in case some CMS puts out a full URL with the anchor appended + if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { + hrefAttribute = `#${hrefAttribute.split('#')[1]}`; + } + selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null; + } + return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null; + }; + const SelectorEngine = { + find(selector, element = document.documentElement) { + return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); + }, + findOne(selector, element = document.documentElement) { + return Element.prototype.querySelector.call(element, selector); + }, + children(element, selector) { + return [].concat(...element.children).filter(child => child.matches(selector)); + }, + parents(element, selector) { + const parents = []; + let ancestor = element.parentNode.closest(selector); + while (ancestor) { + parents.push(ancestor); + ancestor = ancestor.parentNode.closest(selector); + } + return parents; + }, + prev(element, selector) { + let previous = element.previousElementSibling; + while (previous) { + if (previous.matches(selector)) { + return [previous]; + } + previous = previous.previousElementSibling; + } + return []; + }, + // TODO: this is now unused; remove later along with prev() + next(element, selector) { + let next = element.nextElementSibling; + while (next) { + if (next.matches(selector)) { + return [next]; + } + next = next.nextElementSibling; + } + return []; + }, + focusableChildren(element) { + const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(','); + return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)); + }, + getSelectorFromElement(element) { + const selector = getSelector(element); + if (selector) { + return SelectorEngine.findOne(selector) ? selector : null; + } + return null; + }, + getElementFromSelector(element) { + const selector = getSelector(element); + return selector ? SelectorEngine.findOne(selector) : null; + }, + getMultipleElementsFromSelector(element) { + const selector = getSelector(element); + return selector ? SelectorEngine.find(selector) : []; + } + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/component-functions.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const enableDismissTrigger = (component, method = 'hide') => { + const clickEvent = `click.dismiss${component.EVENT_KEY}`; + const name = component.NAME; + EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) { + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + if (isDisabled(this)) { + return; + } + const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`); + const instance = component.getOrCreateInstance(target); + + // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method + instance[method](); + }); + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap alert.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$f = 'alert'; + const DATA_KEY$a = 'bs.alert'; + const EVENT_KEY$b = `.${DATA_KEY$a}`; + const EVENT_CLOSE = `close${EVENT_KEY$b}`; + const EVENT_CLOSED = `closed${EVENT_KEY$b}`; + const CLASS_NAME_FADE$5 = 'fade'; + const CLASS_NAME_SHOW$8 = 'show'; + + /** + * Class definition + */ + + class Alert extends BaseComponent { + // Getters + static get NAME() { + return NAME$f; + } + + // Public + close() { + const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE); + if (closeEvent.defaultPrevented) { + return; + } + this._element.classList.remove(CLASS_NAME_SHOW$8); + const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5); + this._queueCallback(() => this._destroyElement(), this._element, isAnimated); + } + + // Private + _destroyElement() { + this._element.remove(); + EventHandler.trigger(this._element, EVENT_CLOSED); + this.dispose(); + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Alert.getOrCreateInstance(this); + if (typeof config !== 'string') { + return; + } + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + data[config](this); + }); + } + } + + /** + * Data API implementation + */ + + enableDismissTrigger(Alert, 'close'); + + /** + * jQuery + */ + + defineJQueryPlugin(Alert); + + /** + * -------------------------------------------------------------------------- + * Bootstrap button.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$e = 'button'; + const DATA_KEY$9 = 'bs.button'; + const EVENT_KEY$a = `.${DATA_KEY$9}`; + const DATA_API_KEY$6 = '.data-api'; + const CLASS_NAME_ACTIVE$3 = 'active'; + const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]'; + const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`; + + /** + * Class definition + */ + + class Button extends BaseComponent { + // Getters + static get NAME() { + return NAME$e; + } + + // Public + toggle() { + // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method + this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3)); + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Button.getOrCreateInstance(this); + if (config === 'toggle') { + data[config](); + } + }); + } + } + + /** + * Data API implementation + */ + + EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => { + event.preventDefault(); + const button = event.target.closest(SELECTOR_DATA_TOGGLE$5); + const data = Button.getOrCreateInstance(button); + data.toggle(); + }); + + /** + * jQuery + */ + + defineJQueryPlugin(Button); + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/swipe.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$d = 'swipe'; + const EVENT_KEY$9 = '.bs.swipe'; + const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`; + const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`; + const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`; + const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`; + const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`; + const POINTER_TYPE_TOUCH = 'touch'; + const POINTER_TYPE_PEN = 'pen'; + const CLASS_NAME_POINTER_EVENT = 'pointer-event'; + const SWIPE_THRESHOLD = 40; + const Default$c = { + endCallback: null, + leftCallback: null, + rightCallback: null + }; + const DefaultType$c = { + endCallback: '(function|null)', + leftCallback: '(function|null)', + rightCallback: '(function|null)' + }; + + /** + * Class definition + */ + + class Swipe extends Config { + constructor(element, config) { + super(); + this._element = element; + if (!element || !Swipe.isSupported()) { + return; + } + this._config = this._getConfig(config); + this._deltaX = 0; + this._supportPointerEvents = Boolean(window.PointerEvent); + this._initEvents(); + } + + // Getters + static get Default() { + return Default$c; + } + static get DefaultType() { + return DefaultType$c; + } + static get NAME() { + return NAME$d; + } + + // Public + dispose() { + EventHandler.off(this._element, EVENT_KEY$9); + } + + // Private + _start(event) { + if (!this._supportPointerEvents) { + this._deltaX = event.touches[0].clientX; + return; + } + if (this._eventIsPointerPenTouch(event)) { + this._deltaX = event.clientX; + } + } + _end(event) { + if (this._eventIsPointerPenTouch(event)) { + this._deltaX = event.clientX - this._deltaX; + } + this._handleSwipe(); + execute(this._config.endCallback); + } + _move(event) { + this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX; + } + _handleSwipe() { + const absDeltaX = Math.abs(this._deltaX); + if (absDeltaX <= SWIPE_THRESHOLD) { + return; + } + const direction = absDeltaX / this._deltaX; + this._deltaX = 0; + if (!direction) { + return; + } + execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback); + } + _initEvents() { + if (this._supportPointerEvents) { + EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event)); + EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event)); + this._element.classList.add(CLASS_NAME_POINTER_EVENT); + } else { + EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event)); + EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event)); + EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event)); + } + } + _eventIsPointerPenTouch(event) { + return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH); + } + + // Static + static isSupported() { + return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap carousel.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$c = 'carousel'; + const DATA_KEY$8 = 'bs.carousel'; + const EVENT_KEY$8 = `.${DATA_KEY$8}`; + const DATA_API_KEY$5 = '.data-api'; + const ARROW_LEFT_KEY$1 = 'ArrowLeft'; + const ARROW_RIGHT_KEY$1 = 'ArrowRight'; + const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + const ORDER_NEXT = 'next'; + const ORDER_PREV = 'prev'; + const DIRECTION_LEFT = 'left'; + const DIRECTION_RIGHT = 'right'; + const EVENT_SLIDE = `slide${EVENT_KEY$8}`; + const EVENT_SLID = `slid${EVENT_KEY$8}`; + const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`; + const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`; + const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`; + const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`; + const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`; + const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`; + const CLASS_NAME_CAROUSEL = 'carousel'; + const CLASS_NAME_ACTIVE$2 = 'active'; + const CLASS_NAME_SLIDE = 'slide'; + const CLASS_NAME_END = 'carousel-item-end'; + const CLASS_NAME_START = 'carousel-item-start'; + const CLASS_NAME_NEXT = 'carousel-item-next'; + const CLASS_NAME_PREV = 'carousel-item-prev'; + const SELECTOR_ACTIVE = '.active'; + const SELECTOR_ITEM = '.carousel-item'; + const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM; + const SELECTOR_ITEM_IMG = '.carousel-item img'; + const SELECTOR_INDICATORS = '.carousel-indicators'; + const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'; + const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'; + const KEY_TO_DIRECTION = { + [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT, + [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT + }; + const Default$b = { + interval: 5000, + keyboard: true, + pause: 'hover', + ride: false, + touch: true, + wrap: true + }; + const DefaultType$b = { + interval: '(number|boolean)', + // TODO:v6 remove boolean support + keyboard: 'boolean', + pause: '(string|boolean)', + ride: '(boolean|string)', + touch: 'boolean', + wrap: 'boolean' + }; + + /** + * Class definition + */ + + class Carousel extends BaseComponent { + constructor(element, config) { + super(element, config); + this._interval = null; + this._activeElement = null; + this._isSliding = false; + this.touchTimeout = null; + this._swipeHelper = null; + this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element); + this._addEventListeners(); + if (this._config.ride === CLASS_NAME_CAROUSEL) { + this.cycle(); + } + } + + // Getters + static get Default() { + return Default$b; + } + static get DefaultType() { + return DefaultType$b; + } + static get NAME() { + return NAME$c; + } + + // Public + next() { + this._slide(ORDER_NEXT); + } + nextWhenVisible() { + // FIXME TODO use `document.visibilityState` + // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + if (!document.hidden && isVisible(this._element)) { + this.next(); + } + } + prev() { + this._slide(ORDER_PREV); + } + pause() { + if (this._isSliding) { + triggerTransitionEnd(this._element); + } + this._clearInterval(); + } + cycle() { + this._clearInterval(); + this._updateInterval(); + this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval); + } + _maybeEnableCycle() { + if (!this._config.ride) { + return; + } + if (this._isSliding) { + EventHandler.one(this._element, EVENT_SLID, () => this.cycle()); + return; + } + this.cycle(); + } + to(index) { + const items = this._getItems(); + if (index > items.length - 1 || index < 0) { + return; + } + if (this._isSliding) { + EventHandler.one(this._element, EVENT_SLID, () => this.to(index)); + return; + } + const activeIndex = this._getItemIndex(this._getActive()); + if (activeIndex === index) { + return; + } + const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV; + this._slide(order, items[index]); + } + dispose() { + if (this._swipeHelper) { + this._swipeHelper.dispose(); + } + super.dispose(); + } + + // Private + _configAfterMerge(config) { + config.defaultInterval = config.interval; + return config; + } + _addEventListeners() { + if (this._config.keyboard) { + EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event)); + } + if (this._config.pause === 'hover') { + EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause()); + EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle()); + } + if (this._config.touch && Swipe.isSupported()) { + this._addTouchEventListeners(); + } + } + _addTouchEventListeners() { + for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) { + EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault()); + } + const endCallBack = () => { + if (this._config.pause !== 'hover') { + return; + } + + // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + + this.pause(); + if (this.touchTimeout) { + clearTimeout(this.touchTimeout); + } + this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval); + }; + const swipeConfig = { + leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)), + rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)), + endCallback: endCallBack + }; + this._swipeHelper = new Swipe(this._element, swipeConfig); + } + _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + const direction = KEY_TO_DIRECTION[event.key]; + if (direction) { + event.preventDefault(); + this._slide(this._directionToOrder(direction)); + } + } + _getItemIndex(element) { + return this._getItems().indexOf(element); + } + _setActiveIndicatorElement(index) { + if (!this._indicatorsElement) { + return; + } + const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement); + activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2); + activeIndicator.removeAttribute('aria-current'); + const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement); + if (newActiveIndicator) { + newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2); + newActiveIndicator.setAttribute('aria-current', 'true'); + } + } + _updateInterval() { + const element = this._activeElement || this._getActive(); + if (!element) { + return; + } + const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10); + this._config.interval = elementInterval || this._config.defaultInterval; + } + _slide(order, element = null) { + if (this._isSliding) { + return; + } + const activeElement = this._getActive(); + const isNext = order === ORDER_NEXT; + const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap); + if (nextElement === activeElement) { + return; + } + const nextElementIndex = this._getItemIndex(nextElement); + const triggerEvent = eventName => { + return EventHandler.trigger(this._element, eventName, { + relatedTarget: nextElement, + direction: this._orderToDirection(order), + from: this._getItemIndex(activeElement), + to: nextElementIndex + }); + }; + const slideEvent = triggerEvent(EVENT_SLIDE); + if (slideEvent.defaultPrevented) { + return; + } + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + // TODO: change tests that use empty divs to avoid this check + return; + } + const isCycling = Boolean(this._interval); + this.pause(); + this._isSliding = true; + this._setActiveIndicatorElement(nextElementIndex); + this._activeElement = nextElement; + const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; + const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; + nextElement.classList.add(orderClassName); + reflow(nextElement); + activeElement.classList.add(directionalClassName); + nextElement.classList.add(directionalClassName); + const completeCallBack = () => { + nextElement.classList.remove(directionalClassName, orderClassName); + nextElement.classList.add(CLASS_NAME_ACTIVE$2); + activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName); + this._isSliding = false; + triggerEvent(EVENT_SLID); + }; + this._queueCallback(completeCallBack, activeElement, this._isAnimated()); + if (isCycling) { + this.cycle(); + } + } + _isAnimated() { + return this._element.classList.contains(CLASS_NAME_SLIDE); + } + _getActive() { + return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + } + _getItems() { + return SelectorEngine.find(SELECTOR_ITEM, this._element); + } + _clearInterval() { + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + } + _directionToOrder(direction) { + if (isRTL()) { + return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; + } + return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; + } + _orderToDirection(order) { + if (isRTL()) { + return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Carousel.getOrCreateInstance(this, config); + if (typeof config === 'number') { + data.to(config); + return; + } + if (typeof config === 'string') { + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + } + }); + } + } + + /** + * Data API implementation + */ + + EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) { + const target = SelectorEngine.getElementFromSelector(this); + if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { + return; + } + event.preventDefault(); + const carousel = Carousel.getOrCreateInstance(target); + const slideIndex = this.getAttribute('data-bs-slide-to'); + if (slideIndex) { + carousel.to(slideIndex); + carousel._maybeEnableCycle(); + return; + } + if (Manipulator.getDataAttribute(this, 'slide') === 'next') { + carousel.next(); + carousel._maybeEnableCycle(); + return; + } + carousel.prev(); + carousel._maybeEnableCycle(); + }); + EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => { + const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); + for (const carousel of carousels) { + Carousel.getOrCreateInstance(carousel); + } + }); + + /** + * jQuery + */ + + defineJQueryPlugin(Carousel); + + /** + * -------------------------------------------------------------------------- + * Bootstrap collapse.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$b = 'collapse'; + const DATA_KEY$7 = 'bs.collapse'; + const EVENT_KEY$7 = `.${DATA_KEY$7}`; + const DATA_API_KEY$4 = '.data-api'; + const EVENT_SHOW$6 = `show${EVENT_KEY$7}`; + const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`; + const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`; + const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`; + const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`; + const CLASS_NAME_SHOW$7 = 'show'; + const CLASS_NAME_COLLAPSE = 'collapse'; + const CLASS_NAME_COLLAPSING = 'collapsing'; + const CLASS_NAME_COLLAPSED = 'collapsed'; + const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`; + const CLASS_NAME_HORIZONTAL = 'collapse-horizontal'; + const WIDTH = 'width'; + const HEIGHT = 'height'; + const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'; + const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]'; + const Default$a = { + parent: null, + toggle: true + }; + const DefaultType$a = { + parent: '(null|element)', + toggle: 'boolean' + }; + + /** + * Class definition + */ + + class Collapse extends BaseComponent { + constructor(element, config) { + super(element, config); + this._isTransitioning = false; + this._triggerArray = []; + const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4); + for (const elem of toggleList) { + const selector = SelectorEngine.getSelectorFromElement(elem); + const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element); + if (selector !== null && filterElement.length) { + this._triggerArray.push(elem); + } + } + this._initializeChildren(); + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); + } + if (this._config.toggle) { + this.toggle(); + } + } + + // Getters + static get Default() { + return Default$a; + } + static get DefaultType() { + return DefaultType$a; + } + static get NAME() { + return NAME$b; + } + + // Public + toggle() { + if (this._isShown()) { + this.hide(); + } else { + this.show(); + } + } + show() { + if (this._isTransitioning || this._isShown()) { + return; + } + let activeChildren = []; + + // find active children + if (this._config.parent) { + activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, { + toggle: false + })); + } + if (activeChildren.length && activeChildren[0]._isTransitioning) { + return; + } + const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6); + if (startEvent.defaultPrevented) { + return; + } + for (const activeInstance of activeChildren) { + activeInstance.hide(); + } + const dimension = this._getDimension(); + this._element.classList.remove(CLASS_NAME_COLLAPSE); + this._element.classList.add(CLASS_NAME_COLLAPSING); + this._element.style[dimension] = 0; + this._addAriaAndCollapsedClass(this._triggerArray, true); + this._isTransitioning = true; + const complete = () => { + this._isTransitioning = false; + this._element.classList.remove(CLASS_NAME_COLLAPSING); + this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); + this._element.style[dimension] = ''; + EventHandler.trigger(this._element, EVENT_SHOWN$6); + }; + const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + const scrollSize = `scroll${capitalizedDimension}`; + this._queueCallback(complete, this._element, true); + this._element.style[dimension] = `${this._element[scrollSize]}px`; + } + hide() { + if (this._isTransitioning || !this._isShown()) { + return; + } + const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6); + if (startEvent.defaultPrevented) { + return; + } + const dimension = this._getDimension(); + this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; + reflow(this._element); + this._element.classList.add(CLASS_NAME_COLLAPSING); + this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); + for (const trigger of this._triggerArray) { + const element = SelectorEngine.getElementFromSelector(trigger); + if (element && !this._isShown(element)) { + this._addAriaAndCollapsedClass([trigger], false); + } + } + this._isTransitioning = true; + const complete = () => { + this._isTransitioning = false; + this._element.classList.remove(CLASS_NAME_COLLAPSING); + this._element.classList.add(CLASS_NAME_COLLAPSE); + EventHandler.trigger(this._element, EVENT_HIDDEN$6); + }; + this._element.style[dimension] = ''; + this._queueCallback(complete, this._element, true); + } + _isShown(element = this._element) { + return element.classList.contains(CLASS_NAME_SHOW$7); + } + + // Private + _configAfterMerge(config) { + config.toggle = Boolean(config.toggle); // Coerce string values + config.parent = getElement(config.parent); + return config; + } + _getDimension() { + return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; + } + _initializeChildren() { + if (!this._config.parent) { + return; + } + const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4); + for (const element of children) { + const selected = SelectorEngine.getElementFromSelector(element); + if (selected) { + this._addAriaAndCollapsedClass([element], this._isShown(selected)); + } + } + } + _getFirstLevelChildren(selector) { + const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); + // remove children if greater depth + return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element)); + } + _addAriaAndCollapsedClass(triggerArray, isOpen) { + if (!triggerArray.length) { + return; + } + for (const element of triggerArray) { + element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); + element.setAttribute('aria-expanded', isOpen); + } + } + + // Static + static jQueryInterface(config) { + const _config = {}; + if (typeof config === 'string' && /show|hide/.test(config)) { + _config.toggle = false; + } + return this.each(function () { + const data = Collapse.getOrCreateInstance(this, _config); + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + } + }); + } + } + + /** + * Data API implementation + */ + + EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) { + // preventDefault only for <a> elements (which change the URL) not inside the collapsible element + if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') { + event.preventDefault(); + } + for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) { + Collapse.getOrCreateInstance(element, { + toggle: false + }).toggle(); + } + }); + + /** + * jQuery + */ + + defineJQueryPlugin(Collapse); + + /** + * -------------------------------------------------------------------------- + * Bootstrap dropdown.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$a = 'dropdown'; + const DATA_KEY$6 = 'bs.dropdown'; + const EVENT_KEY$6 = `.${DATA_KEY$6}`; + const DATA_API_KEY$3 = '.data-api'; + const ESCAPE_KEY$2 = 'Escape'; + const TAB_KEY$1 = 'Tab'; + const ARROW_UP_KEY$1 = 'ArrowUp'; + const ARROW_DOWN_KEY$1 = 'ArrowDown'; + const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button + + const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`; + const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`; + const EVENT_SHOW$5 = `show${EVENT_KEY$6}`; + const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`; + const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`; + const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`; + const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`; + const CLASS_NAME_SHOW$6 = 'show'; + const CLASS_NAME_DROPUP = 'dropup'; + const CLASS_NAME_DROPEND = 'dropend'; + const CLASS_NAME_DROPSTART = 'dropstart'; + const CLASS_NAME_DROPUP_CENTER = 'dropup-center'; + const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'; + const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'; + const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`; + const SELECTOR_MENU = '.dropdown-menu'; + const SELECTOR_NAVBAR = '.navbar'; + const SELECTOR_NAVBAR_NAV = '.navbar-nav'; + const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; + const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'; + const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'; + const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'; + const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'; + const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'; + const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'; + const PLACEMENT_TOPCENTER = 'top'; + const PLACEMENT_BOTTOMCENTER = 'bottom'; + const Default$9 = { + autoClose: true, + boundary: 'clippingParents', + display: 'dynamic', + offset: [0, 2], + popperConfig: null, + reference: 'toggle' + }; + const DefaultType$9 = { + autoClose: '(boolean|string)', + boundary: '(string|element)', + display: 'string', + offset: '(array|string|function)', + popperConfig: '(null|object|function)', + reference: '(string|element|object)' + }; + + /** + * Class definition + */ + + class Dropdown extends BaseComponent { + constructor(element, config) { + super(element, config); + this._popper = null; + this._parent = this._element.parentNode; // dropdown wrapper + // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/ + this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent); + this._inNavbar = this._detectNavbar(); + } + + // Getters + static get Default() { + return Default$9; + } + static get DefaultType() { + return DefaultType$9; + } + static get NAME() { + return NAME$a; + } + + // Public + toggle() { + return this._isShown() ? this.hide() : this.show(); + } + show() { + if (isDisabled(this._element) || this._isShown()) { + return; + } + const relatedTarget = { + relatedTarget: this._element + }; + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget); + if (showEvent.defaultPrevented) { + return; + } + this._createPopper(); + + // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) { + for (const element of [].concat(...document.body.children)) { + EventHandler.on(element, 'mouseover', noop); + } + } + this._element.focus(); + this._element.setAttribute('aria-expanded', true); + this._menu.classList.add(CLASS_NAME_SHOW$6); + this._element.classList.add(CLASS_NAME_SHOW$6); + EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget); + } + hide() { + if (isDisabled(this._element) || !this._isShown()) { + return; + } + const relatedTarget = { + relatedTarget: this._element + }; + this._completeHide(relatedTarget); + } + dispose() { + if (this._popper) { + this._popper.destroy(); + } + super.dispose(); + } + update() { + this._inNavbar = this._detectNavbar(); + if (this._popper) { + this._popper.update(); + } + } + + // Private + _completeHide(relatedTarget) { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget); + if (hideEvent.defaultPrevented) { + return; + } + + // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.off(element, 'mouseover', noop); + } + } + if (this._popper) { + this._popper.destroy(); + } + this._menu.classList.remove(CLASS_NAME_SHOW$6); + this._element.classList.remove(CLASS_NAME_SHOW$6); + this._element.setAttribute('aria-expanded', 'false'); + Manipulator.removeDataAttribute(this._menu, 'popper'); + EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget); + } + _getConfig(config) { + config = super._getConfig(config); + if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') { + // Popper virtual elements require a getBoundingClientRect method + throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + } + return config; + } + _createPopper() { + if (typeof Popper__namespace === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); + } + let referenceElement = this._element; + if (this._config.reference === 'parent') { + referenceElement = this._parent; + } else if (isElement(this._config.reference)) { + referenceElement = getElement(this._config.reference); + } else if (typeof this._config.reference === 'object') { + referenceElement = this._config.reference; + } + const popperConfig = this._getPopperConfig(); + this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig); + } + _isShown() { + return this._menu.classList.contains(CLASS_NAME_SHOW$6); + } + _getPlacement() { + const parentDropdown = this._parent; + if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { + return PLACEMENT_RIGHT; + } + if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { + return PLACEMENT_LEFT; + } + if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { + return PLACEMENT_TOPCENTER; + } + if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { + return PLACEMENT_BOTTOMCENTER; + } + + // We need to trim the value because custom properties can also include spaces + const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; + if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { + return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; + } + return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; + } + _detectNavbar() { + return this._element.closest(SELECTOR_NAVBAR) !== null; + } + _getOffset() { + const { + offset + } = this._config; + if (typeof offset === 'string') { + return offset.split(',').map(value => Number.parseInt(value, 10)); + } + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + return offset; + } + _getPopperConfig() { + const defaultBsPopperConfig = { + placement: this._getPlacement(), + modifiers: [{ + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }] + }; + + // Disable Popper if we have a static display or Dropdown is in Navbar + if (this._inNavbar || this._config.display === 'static') { + Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove + defaultBsPopperConfig.modifiers = [{ + name: 'applyStyles', + enabled: false + }]; + } + return { + ...defaultBsPopperConfig, + ...execute(this._config.popperConfig, [defaultBsPopperConfig]) + }; + } + _selectMenuItem({ + key, + target + }) { + const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element)); + if (!items.length) { + return; + } + + // if target isn't included in items (e.g. when expanding the dropdown) + // allow cycling to get the last item in case key equals ARROW_UP_KEY + getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus(); + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Dropdown.getOrCreateInstance(this, config); + if (typeof config !== 'string') { + return; + } + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + }); + } + static clearMenus(event) { + if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) { + return; + } + const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN); + for (const toggle of openToggles) { + const context = Dropdown.getInstance(toggle); + if (!context || context._config.autoClose === false) { + continue; + } + const composedPath = event.composedPath(); + const isMenuTarget = composedPath.includes(context._menu); + if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) { + continue; + } + + // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu + if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) { + continue; + } + const relatedTarget = { + relatedTarget: context._element + }; + if (event.type === 'click') { + relatedTarget.clickEvent = event; + } + context._completeHide(relatedTarget); + } + } + static dataApiKeydownHandler(event) { + // If not an UP | DOWN | ESCAPE key => not a dropdown command + // If input/textarea && if key is other than ESCAPE => not a dropdown command + + const isInput = /input|textarea/i.test(event.target.tagName); + const isEscapeEvent = event.key === ESCAPE_KEY$2; + const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key); + if (!isUpOrDownEvent && !isEscapeEvent) { + return; + } + if (isInput && !isEscapeEvent) { + return; + } + event.preventDefault(); + + // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/ + const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode); + const instance = Dropdown.getOrCreateInstance(getToggleButton); + if (isUpOrDownEvent) { + event.stopPropagation(); + instance.show(); + instance._selectMenuItem(event); + return; + } + if (instance._isShown()) { + // else is escape and we check if it is shown + event.stopPropagation(); + instance.hide(); + getToggleButton.focus(); + } + } + } + + /** + * Data API implementation + */ + + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus); + EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) { + event.preventDefault(); + Dropdown.getOrCreateInstance(this).toggle(); + }); + + /** + * jQuery + */ + + defineJQueryPlugin(Dropdown); + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/backdrop.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$9 = 'backdrop'; + const CLASS_NAME_FADE$4 = 'fade'; + const CLASS_NAME_SHOW$5 = 'show'; + const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`; + const Default$8 = { + className: 'modal-backdrop', + clickCallback: null, + isAnimated: false, + isVisible: true, + // if false, we use the backdrop helper without adding any element to the dom + rootElement: 'body' // give the choice to place backdrop under different elements + }; + const DefaultType$8 = { + className: 'string', + clickCallback: '(function|null)', + isAnimated: 'boolean', + isVisible: 'boolean', + rootElement: '(element|string)' + }; + + /** + * Class definition + */ + + class Backdrop extends Config { + constructor(config) { + super(); + this._config = this._getConfig(config); + this._isAppended = false; + this._element = null; + } + + // Getters + static get Default() { + return Default$8; + } + static get DefaultType() { + return DefaultType$8; + } + static get NAME() { + return NAME$9; + } + + // Public + show(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + this._append(); + const element = this._getElement(); + if (this._config.isAnimated) { + reflow(element); + } + element.classList.add(CLASS_NAME_SHOW$5); + this._emulateAnimation(() => { + execute(callback); + }); + } + hide(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + this._getElement().classList.remove(CLASS_NAME_SHOW$5); + this._emulateAnimation(() => { + this.dispose(); + execute(callback); + }); + } + dispose() { + if (!this._isAppended) { + return; + } + EventHandler.off(this._element, EVENT_MOUSEDOWN); + this._element.remove(); + this._isAppended = false; + } + + // Private + _getElement() { + if (!this._element) { + const backdrop = document.createElement('div'); + backdrop.className = this._config.className; + if (this._config.isAnimated) { + backdrop.classList.add(CLASS_NAME_FADE$4); + } + this._element = backdrop; + } + return this._element; + } + _configAfterMerge(config) { + // use getElement() with the default "body" to get a fresh Element on each instantiation + config.rootElement = getElement(config.rootElement); + return config; + } + _append() { + if (this._isAppended) { + return; + } + const element = this._getElement(); + this._config.rootElement.append(element); + EventHandler.on(element, EVENT_MOUSEDOWN, () => { + execute(this._config.clickCallback); + }); + this._isAppended = true; + } + _emulateAnimation(callback) { + executeAfterTransition(callback, this._getElement(), this._config.isAnimated); + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/focustrap.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$8 = 'focustrap'; + const DATA_KEY$5 = 'bs.focustrap'; + const EVENT_KEY$5 = `.${DATA_KEY$5}`; + const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`; + const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`; + const TAB_KEY = 'Tab'; + const TAB_NAV_FORWARD = 'forward'; + const TAB_NAV_BACKWARD = 'backward'; + const Default$7 = { + autofocus: true, + trapElement: null // The element to trap focus inside of + }; + const DefaultType$7 = { + autofocus: 'boolean', + trapElement: 'element' + }; + + /** + * Class definition + */ + + class FocusTrap extends Config { + constructor(config) { + super(); + this._config = this._getConfig(config); + this._isActive = false; + this._lastTabNavDirection = null; + } + + // Getters + static get Default() { + return Default$7; + } + static get DefaultType() { + return DefaultType$7; + } + static get NAME() { + return NAME$8; + } + + // Public + activate() { + if (this._isActive) { + return; + } + if (this._config.autofocus) { + this._config.trapElement.focus(); + } + EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop + EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event)); + EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event)); + this._isActive = true; + } + deactivate() { + if (!this._isActive) { + return; + } + this._isActive = false; + EventHandler.off(document, EVENT_KEY$5); + } + + // Private + _handleFocusin(event) { + const { + trapElement + } = this._config; + if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) { + return; + } + const elements = SelectorEngine.focusableChildren(trapElement); + if (elements.length === 0) { + trapElement.focus(); + } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { + elements[elements.length - 1].focus(); + } else { + elements[0].focus(); + } + } + _handleKeydown(event) { + if (event.key !== TAB_KEY) { + return; + } + this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD; + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/scrollBar.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; + const SELECTOR_STICKY_CONTENT = '.sticky-top'; + const PROPERTY_PADDING = 'padding-right'; + const PROPERTY_MARGIN = 'margin-right'; + + /** + * Class definition + */ + + class ScrollBarHelper { + constructor() { + this._element = document.body; + } + + // Public + getWidth() { + // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes + const documentWidth = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - documentWidth); + } + hide() { + const width = this.getWidth(); + this._disableOverFlow(); + // give padding to element to balance the hidden scrollbar width + this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width); + // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth + this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width); + this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width); + } + reset() { + this._resetElementAttributes(this._element, 'overflow'); + this._resetElementAttributes(this._element, PROPERTY_PADDING); + this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING); + this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN); + } + isOverflowing() { + return this.getWidth() > 0; + } + + // Private + _disableOverFlow() { + this._saveInitialAttribute(this._element, 'overflow'); + this._element.style.overflow = 'hidden'; + } + _setElementAttributes(selector, styleProperty, callback) { + const scrollbarWidth = this.getWidth(); + const manipulationCallBack = element => { + if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) { + return; + } + this._saveInitialAttribute(element, styleProperty); + const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty); + element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`); + }; + this._applyManipulationCallback(selector, manipulationCallBack); + } + _saveInitialAttribute(element, styleProperty) { + const actualValue = element.style.getPropertyValue(styleProperty); + if (actualValue) { + Manipulator.setDataAttribute(element, styleProperty, actualValue); + } + } + _resetElementAttributes(selector, styleProperty) { + const manipulationCallBack = element => { + const value = Manipulator.getDataAttribute(element, styleProperty); + // We only want to remove the property if the value is `null`; the value can also be zero + if (value === null) { + element.style.removeProperty(styleProperty); + return; + } + Manipulator.removeDataAttribute(element, styleProperty); + element.style.setProperty(styleProperty, value); + }; + this._applyManipulationCallback(selector, manipulationCallBack); + } + _applyManipulationCallback(selector, callBack) { + if (isElement(selector)) { + callBack(selector); + return; + } + for (const sel of SelectorEngine.find(selector, this._element)) { + callBack(sel); + } + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap modal.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$7 = 'modal'; + const DATA_KEY$4 = 'bs.modal'; + const EVENT_KEY$4 = `.${DATA_KEY$4}`; + const DATA_API_KEY$2 = '.data-api'; + const ESCAPE_KEY$1 = 'Escape'; + const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`; + const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`; + const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`; + const EVENT_SHOW$4 = `show${EVENT_KEY$4}`; + const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`; + const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`; + const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`; + const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`; + const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`; + const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`; + const CLASS_NAME_OPEN = 'modal-open'; + const CLASS_NAME_FADE$3 = 'fade'; + const CLASS_NAME_SHOW$4 = 'show'; + const CLASS_NAME_STATIC = 'modal-static'; + const OPEN_SELECTOR$1 = '.modal.show'; + const SELECTOR_DIALOG = '.modal-dialog'; + const SELECTOR_MODAL_BODY = '.modal-body'; + const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]'; + const Default$6 = { + backdrop: true, + focus: true, + keyboard: true + }; + const DefaultType$6 = { + backdrop: '(boolean|string)', + focus: 'boolean', + keyboard: 'boolean' + }; + + /** + * Class definition + */ + + class Modal extends BaseComponent { + constructor(element, config) { + super(element, config); + this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element); + this._backdrop = this._initializeBackDrop(); + this._focustrap = this._initializeFocusTrap(); + this._isShown = false; + this._isTransitioning = false; + this._scrollBar = new ScrollBarHelper(); + this._addEventListeners(); + } + + // Getters + static get Default() { + return Default$6; + } + static get DefaultType() { + return DefaultType$6; + } + static get NAME() { + return NAME$7; + } + + // Public + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + show(relatedTarget) { + if (this._isShown || this._isTransitioning) { + return; + } + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, { + relatedTarget + }); + if (showEvent.defaultPrevented) { + return; + } + this._isShown = true; + this._isTransitioning = true; + this._scrollBar.hide(); + document.body.classList.add(CLASS_NAME_OPEN); + this._adjustDialog(); + this._backdrop.show(() => this._showElement(relatedTarget)); + } + hide() { + if (!this._isShown || this._isTransitioning) { + return; + } + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4); + if (hideEvent.defaultPrevented) { + return; + } + this._isShown = false; + this._isTransitioning = true; + this._focustrap.deactivate(); + this._element.classList.remove(CLASS_NAME_SHOW$4); + this._queueCallback(() => this._hideModal(), this._element, this._isAnimated()); + } + dispose() { + EventHandler.off(window, EVENT_KEY$4); + EventHandler.off(this._dialog, EVENT_KEY$4); + this._backdrop.dispose(); + this._focustrap.deactivate(); + super.dispose(); + } + handleUpdate() { + this._adjustDialog(); + } + + // Private + _initializeBackDrop() { + return new Backdrop({ + isVisible: Boolean(this._config.backdrop), + // 'static' option will be translated to true, and booleans will keep their value, + isAnimated: this._isAnimated() + }); + } + _initializeFocusTrap() { + return new FocusTrap({ + trapElement: this._element + }); + } + _showElement(relatedTarget) { + // try to append dynamic modal + if (!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', true); + this._element.setAttribute('role', 'dialog'); + this._element.scrollTop = 0; + const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); + if (modalBody) { + modalBody.scrollTop = 0; + } + reflow(this._element); + this._element.classList.add(CLASS_NAME_SHOW$4); + const transitionComplete = () => { + if (this._config.focus) { + this._focustrap.activate(); + } + this._isTransitioning = false; + EventHandler.trigger(this._element, EVENT_SHOWN$4, { + relatedTarget + }); + }; + this._queueCallback(transitionComplete, this._dialog, this._isAnimated()); + } + _addEventListeners() { + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => { + if (event.key !== ESCAPE_KEY$1) { + return; + } + if (this._config.keyboard) { + this.hide(); + return; + } + this._triggerBackdropTransition(); + }); + EventHandler.on(window, EVENT_RESIZE$1, () => { + if (this._isShown && !this._isTransitioning) { + this._adjustDialog(); + } + }); + EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => { + // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks + EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => { + if (this._element !== event.target || this._element !== event2.target) { + return; + } + if (this._config.backdrop === 'static') { + this._triggerBackdropTransition(); + return; + } + if (this._config.backdrop) { + this.hide(); + } + }); + }); + } + _hideModal() { + this._element.style.display = 'none'; + this._element.setAttribute('aria-hidden', true); + this._element.removeAttribute('aria-modal'); + this._element.removeAttribute('role'); + this._isTransitioning = false; + this._backdrop.hide(() => { + document.body.classList.remove(CLASS_NAME_OPEN); + this._resetAdjustments(); + this._scrollBar.reset(); + EventHandler.trigger(this._element, EVENT_HIDDEN$4); + }); + } + _isAnimated() { + return this._element.classList.contains(CLASS_NAME_FADE$3); + } + _triggerBackdropTransition() { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1); + if (hideEvent.defaultPrevented) { + return; + } + const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + const initialOverflowY = this._element.style.overflowY; + // return if the following background transition hasn't yet completed + if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) { + return; + } + if (!isModalOverflowing) { + this._element.style.overflowY = 'hidden'; + } + this._element.classList.add(CLASS_NAME_STATIC); + this._queueCallback(() => { + this._element.classList.remove(CLASS_NAME_STATIC); + this._queueCallback(() => { + this._element.style.overflowY = initialOverflowY; + }, this._dialog); + }, this._dialog); + this._element.focus(); + } + + /** + * The following methods are used to handle overflowing modals + */ + + _adjustDialog() { + const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + const scrollbarWidth = this._scrollBar.getWidth(); + const isBodyOverflowing = scrollbarWidth > 0; + if (isBodyOverflowing && !isModalOverflowing) { + const property = isRTL() ? 'paddingLeft' : 'paddingRight'; + this._element.style[property] = `${scrollbarWidth}px`; + } + if (!isBodyOverflowing && isModalOverflowing) { + const property = isRTL() ? 'paddingRight' : 'paddingLeft'; + this._element.style[property] = `${scrollbarWidth}px`; + } + } + _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + } + + // Static + static jQueryInterface(config, relatedTarget) { + return this.each(function () { + const data = Modal.getOrCreateInstance(this, config); + if (typeof config !== 'string') { + return; + } + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + data[config](relatedTarget); + }); + } + } + + /** + * Data API implementation + */ + + EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) { + const target = SelectorEngine.getElementFromSelector(this); + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + EventHandler.one(target, EVENT_SHOW$4, showEvent => { + if (showEvent.defaultPrevented) { + // only register focus restorer if modal will actually get shown + return; + } + EventHandler.one(target, EVENT_HIDDEN$4, () => { + if (isVisible(this)) { + this.focus(); + } + }); + }); + + // avoid conflict when clicking modal toggler while another one is open + const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1); + if (alreadyOpen) { + Modal.getInstance(alreadyOpen).hide(); + } + const data = Modal.getOrCreateInstance(target); + data.toggle(this); + }); + enableDismissTrigger(Modal); + + /** + * jQuery + */ + + defineJQueryPlugin(Modal); + + /** + * -------------------------------------------------------------------------- + * Bootstrap offcanvas.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$6 = 'offcanvas'; + const DATA_KEY$3 = 'bs.offcanvas'; + const EVENT_KEY$3 = `.${DATA_KEY$3}`; + const DATA_API_KEY$1 = '.data-api'; + const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`; + const ESCAPE_KEY = 'Escape'; + const CLASS_NAME_SHOW$3 = 'show'; + const CLASS_NAME_SHOWING$1 = 'showing'; + const CLASS_NAME_HIDING = 'hiding'; + const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'; + const OPEN_SELECTOR = '.offcanvas.show'; + const EVENT_SHOW$3 = `show${EVENT_KEY$3}`; + const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`; + const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`; + const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`; + const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`; + const EVENT_RESIZE = `resize${EVENT_KEY$3}`; + const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`; + const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`; + const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]'; + const Default$5 = { + backdrop: true, + keyboard: true, + scroll: false + }; + const DefaultType$5 = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + scroll: 'boolean' + }; + + /** + * Class definition + */ + + class Offcanvas extends BaseComponent { + constructor(element, config) { + super(element, config); + this._isShown = false; + this._backdrop = this._initializeBackDrop(); + this._focustrap = this._initializeFocusTrap(); + this._addEventListeners(); + } + + // Getters + static get Default() { + return Default$5; + } + static get DefaultType() { + return DefaultType$5; + } + static get NAME() { + return NAME$6; + } + + // Public + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + show(relatedTarget) { + if (this._isShown) { + return; + } + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, { + relatedTarget + }); + if (showEvent.defaultPrevented) { + return; + } + this._isShown = true; + this._backdrop.show(); + if (!this._config.scroll) { + new ScrollBarHelper().hide(); + } + this._element.setAttribute('aria-modal', true); + this._element.setAttribute('role', 'dialog'); + this._element.classList.add(CLASS_NAME_SHOWING$1); + const completeCallBack = () => { + if (!this._config.scroll || this._config.backdrop) { + this._focustrap.activate(); + } + this._element.classList.add(CLASS_NAME_SHOW$3); + this._element.classList.remove(CLASS_NAME_SHOWING$1); + EventHandler.trigger(this._element, EVENT_SHOWN$3, { + relatedTarget + }); + }; + this._queueCallback(completeCallBack, this._element, true); + } + hide() { + if (!this._isShown) { + return; + } + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3); + if (hideEvent.defaultPrevented) { + return; + } + this._focustrap.deactivate(); + this._element.blur(); + this._isShown = false; + this._element.classList.add(CLASS_NAME_HIDING); + this._backdrop.hide(); + const completeCallback = () => { + this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING); + this._element.removeAttribute('aria-modal'); + this._element.removeAttribute('role'); + if (!this._config.scroll) { + new ScrollBarHelper().reset(); + } + EventHandler.trigger(this._element, EVENT_HIDDEN$3); + }; + this._queueCallback(completeCallback, this._element, true); + } + dispose() { + this._backdrop.dispose(); + this._focustrap.deactivate(); + super.dispose(); + } + + // Private + _initializeBackDrop() { + const clickCallback = () => { + if (this._config.backdrop === 'static') { + EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); + return; + } + this.hide(); + }; + + // 'static' option will be translated to true, and booleans will keep their value + const isVisible = Boolean(this._config.backdrop); + return new Backdrop({ + className: CLASS_NAME_BACKDROP, + isVisible, + isAnimated: true, + rootElement: this._element.parentNode, + clickCallback: isVisible ? clickCallback : null + }); + } + _initializeFocusTrap() { + return new FocusTrap({ + trapElement: this._element + }); + } + _addEventListeners() { + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { + if (event.key !== ESCAPE_KEY) { + return; + } + if (this._config.keyboard) { + this.hide(); + return; + } + EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); + }); + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Offcanvas.getOrCreateInstance(this, config); + if (typeof config !== 'string') { + return; + } + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + data[config](this); + }); + } + } + + /** + * Data API implementation + */ + + EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) { + const target = SelectorEngine.getElementFromSelector(this); + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + if (isDisabled(this)) { + return; + } + EventHandler.one(target, EVENT_HIDDEN$3, () => { + // focus on trigger when it is closed + if (isVisible(this)) { + this.focus(); + } + }); + + // avoid conflict when clicking a toggler of an offcanvas, while another is open + const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); + if (alreadyOpen && alreadyOpen !== target) { + Offcanvas.getInstance(alreadyOpen).hide(); + } + const data = Offcanvas.getOrCreateInstance(target); + data.toggle(this); + }); + EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => { + for (const selector of SelectorEngine.find(OPEN_SELECTOR)) { + Offcanvas.getOrCreateInstance(selector).show(); + } + }); + EventHandler.on(window, EVENT_RESIZE, () => { + for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) { + if (getComputedStyle(element).position !== 'fixed') { + Offcanvas.getOrCreateInstance(element).hide(); + } + } + }); + enableDismissTrigger(Offcanvas); + + /** + * jQuery + */ + + defineJQueryPlugin(Offcanvas); + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + // js-docs-start allow-list + const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + const DefaultAllowlist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + 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: [] + }; + // js-docs-end allow-list + + const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); + + /** + * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation + * contexts. + * + * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38 + */ + // eslint-disable-next-line unicorn/better-regex + const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i; + const allowedAttribute = (attribute, allowedAttributeList) => { + const attributeName = attribute.nodeName.toLowerCase(); + if (allowedAttributeList.includes(attributeName)) { + if (uriAttributes.has(attributeName)) { + return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue)); + } + return true; + } + + // Check if a regular expression validates the attribute. + return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName)); + }; + function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { + if (!unsafeHtml.length) { + return unsafeHtml; + } + if (sanitizeFunction && typeof sanitizeFunction === 'function') { + return sanitizeFunction(unsafeHtml); + } + const domParser = new window.DOMParser(); + const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + const elements = [].concat(...createdDocument.body.querySelectorAll('*')); + for (const element of elements) { + const elementName = element.nodeName.toLowerCase(); + if (!Object.keys(allowList).includes(elementName)) { + element.remove(); + continue; + } + const attributeList = [].concat(...element.attributes); + const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); + for (const attribute of attributeList) { + if (!allowedAttribute(attribute, allowedAttributes)) { + element.removeAttribute(attribute.nodeName); + } + } + } + return createdDocument.body.innerHTML; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap util/template-factory.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$5 = 'TemplateFactory'; + const Default$4 = { + allowList: DefaultAllowlist, + content: {}, + // { selector : text , selector2 : text2 , } + extraClass: '', + html: false, + sanitize: true, + sanitizeFn: null, + template: '<div></div>' + }; + const DefaultType$4 = { + allowList: 'object', + content: 'object', + extraClass: '(string|function)', + html: 'boolean', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + template: 'string' + }; + const DefaultContentType = { + entry: '(string|element|function|null)', + selector: '(string|element)' + }; + + /** + * Class definition + */ + + class TemplateFactory extends Config { + constructor(config) { + super(); + this._config = this._getConfig(config); + } + + // Getters + static get Default() { + return Default$4; + } + static get DefaultType() { + return DefaultType$4; + } + static get NAME() { + return NAME$5; + } + + // Public + getContent() { + return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean); + } + hasContent() { + return this.getContent().length > 0; + } + changeContent(content) { + this._checkContent(content); + this._config.content = { + ...this._config.content, + ...content + }; + return this; + } + toHtml() { + const templateWrapper = document.createElement('div'); + templateWrapper.innerHTML = this._maybeSanitize(this._config.template); + for (const [selector, text] of Object.entries(this._config.content)) { + this._setContent(templateWrapper, text, selector); + } + const template = templateWrapper.children[0]; + const extraClass = this._resolvePossibleFunction(this._config.extraClass); + if (extraClass) { + template.classList.add(...extraClass.split(' ')); + } + return template; + } + + // Private + _typeCheckConfig(config) { + super._typeCheckConfig(config); + this._checkContent(config.content); + } + _checkContent(arg) { + for (const [selector, content] of Object.entries(arg)) { + super._typeCheckConfig({ + selector, + entry: content + }, DefaultContentType); + } + } + _setContent(template, content, selector) { + const templateElement = SelectorEngine.findOne(selector, template); + if (!templateElement) { + return; + } + content = this._resolvePossibleFunction(content); + if (!content) { + templateElement.remove(); + return; + } + if (isElement(content)) { + this._putElementInTemplate(getElement(content), templateElement); + return; + } + if (this._config.html) { + templateElement.innerHTML = this._maybeSanitize(content); + return; + } + templateElement.textContent = content; + } + _maybeSanitize(arg) { + return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; + } + _resolvePossibleFunction(arg) { + return execute(arg, [this]); + } + _putElementInTemplate(element, templateElement) { + if (this._config.html) { + templateElement.innerHTML = ''; + templateElement.append(element); + return; + } + templateElement.textContent = element.textContent; + } + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap tooltip.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$4 = 'tooltip'; + const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); + const CLASS_NAME_FADE$2 = 'fade'; + const CLASS_NAME_MODAL = 'modal'; + const CLASS_NAME_SHOW$2 = 'show'; + const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; + const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; + const EVENT_MODAL_HIDE = 'hide.bs.modal'; + const TRIGGER_HOVER = 'hover'; + const TRIGGER_FOCUS = 'focus'; + const TRIGGER_CLICK = 'click'; + const TRIGGER_MANUAL = 'manual'; + const EVENT_HIDE$2 = 'hide'; + const EVENT_HIDDEN$2 = 'hidden'; + const EVENT_SHOW$2 = 'show'; + const EVENT_SHOWN$2 = 'shown'; + const EVENT_INSERTED = 'inserted'; + const EVENT_CLICK$1 = 'click'; + const EVENT_FOCUSIN$1 = 'focusin'; + const EVENT_FOCUSOUT$1 = 'focusout'; + const EVENT_MOUSEENTER = 'mouseenter'; + const EVENT_MOUSELEAVE = 'mouseleave'; + const AttachmentMap = { + AUTO: 'auto', + TOP: 'top', + RIGHT: isRTL() ? 'left' : 'right', + BOTTOM: 'bottom', + LEFT: isRTL() ? 'right' : 'left' + }; + const Default$3 = { + allowList: DefaultAllowlist, + animation: true, + boundary: 'clippingParents', + container: false, + customClass: '', + delay: 0, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], + html: false, + offset: [0, 6], + placement: 'top', + popperConfig: null, + sanitize: true, + sanitizeFn: null, + selector: false, + template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>', + title: '', + trigger: 'hover focus' + }; + const DefaultType$3 = { + 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 definition + */ + + class Tooltip extends BaseComponent { + constructor(element, config) { + if (typeof Popper__namespace === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); + } + super(element, config); + + // Private + this._isEnabled = true; + this._timeout = 0; + this._isHovered = null; + this._activeTrigger = {}; + this._popper = null; + this._templateFactory = null; + this._newContent = null; + + // Protected + this.tip = null; + this._setListeners(); + if (!this._config.selector) { + this._fixTitle(); + } + } + + // Getters + static get Default() { + return Default$3; + } + static get DefaultType() { + return DefaultType$3; + } + static get NAME() { + return NAME$4; + } + + // Public + enable() { + this._isEnabled = true; + } + disable() { + this._isEnabled = false; + } + toggleEnabled() { + this._isEnabled = !this._isEnabled; + } + toggle() { + if (!this._isEnabled) { + return; + } + this._activeTrigger.click = !this._activeTrigger.click; + if (this._isShown()) { + this._leave(); + return; + } + this._enter(); + } + dispose() { + clearTimeout(this._timeout); + EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + if (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 new Error('Please use show on visible elements'); + } + if (!(this._isWithContent() && this._isEnabled)) { + return; + } + const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2)); + const shadowRoot = findShadowRoot(this._element); + const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); + if (showEvent.defaultPrevented || !isInTheDom) { + return; + } + + // TODO: v6 remove this or make it optional + this._disposePopper(); + const tip = this._getTipElement(); + this._element.setAttribute('aria-describedby', tip.getAttribute('id')); + const { + container + } = this._config; + if (!this._element.ownerDocument.documentElement.contains(this.tip)) { + container.append(tip); + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); + } + this._popper = this._createPopper(tip); + tip.classList.add(CLASS_NAME_SHOW$2); + + // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.on(element, 'mouseover', noop); + } + } + const complete = () => { + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2)); + if (this._isHovered === false) { + this._leave(); + } + this._isHovered = false; + }; + this._queueCallback(complete, this.tip, this._isAnimated()); + } + hide() { + if (!this._isShown()) { + return; + } + const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2)); + if (hideEvent.defaultPrevented) { + return; + } + const tip = this._getTipElement(); + tip.classList.remove(CLASS_NAME_SHOW$2); + + // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.off(element, 'mouseover', noop); + } + } + this._activeTrigger[TRIGGER_CLICK] = false; + this._activeTrigger[TRIGGER_FOCUS] = false; + this._activeTrigger[TRIGGER_HOVER] = false; + this._isHovered = null; // it is a trick to support manual triggering + + const complete = () => { + if (this._isWithActiveTrigger()) { + return; + } + if (!this._isHovered) { + this._disposePopper(); + } + this._element.removeAttribute('aria-describedby'); + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2)); + }; + this._queueCallback(complete, this.tip, this._isAnimated()); + } + update() { + if (this._popper) { + this._popper.update(); + } + } + + // Protected + _isWithContent() { + return Boolean(this._getTitle()); + } + _getTipElement() { + if (!this.tip) { + this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); + } + return this.tip; + } + _createTipElement(content) { + const tip = this._getTemplateFactory(content).toHtml(); + + // TODO: remove this check in v6 + if (!tip) { + return null; + } + tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); + // TODO: v6 the following can be achieved with CSS only + tip.classList.add(`bs-${this.constructor.NAME}-auto`); + const tipId = getUID(this.constructor.NAME).toString(); + tip.setAttribute('id', tipId); + if (this._isAnimated()) { + tip.classList.add(CLASS_NAME_FADE$2); + } + return tip; + } + setContent(content) { + this._newContent = content; + if (this._isShown()) { + this._disposePopper(); + this.show(); + } + } + _getTemplateFactory(content) { + if (this._templateFactory) { + this._templateFactory.changeContent(content); + } else { + this._templateFactory = new TemplateFactory({ + ...this._config, + // the `content` var has to be after `this._config` + // to override config.content in case of popover + content, + extraClass: this._resolvePossibleFunction(this._config.customClass) + }); + } + return this._templateFactory; + } + _getContentForTemplate() { + return { + [SELECTOR_TOOLTIP_INNER]: this._getTitle() + }; + } + _getTitle() { + return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title'); + } + + // Private + _initializeOnDelegatedTarget(event) { + return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); + } + _isAnimated() { + return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2); + } + _isShown() { + return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2); + } + _createPopper(tip) { + const placement = execute(this._config.placement, [this, tip, this._element]); + const attachment = AttachmentMap[placement.toUpperCase()]; + return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); + } + _getOffset() { + const { + offset + } = this._config; + if (typeof offset === 'string') { + return offset.split(',').map(value => Number.parseInt(value, 10)); + } + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + return offset; + } + _resolvePossibleFunction(arg) { + return execute(arg, [this._element]); + } + _getPopperConfig(attachment) { + const defaultBsPopperConfig = { + placement: attachment, + 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: true, + phase: 'beforeMain', + fn: data => { + // Pre-set Popper's placement attribute in order to read the arrow sizes properly. + // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement + this._getTipElement().setAttribute('data-popper-placement', data.state.placement); + } + }] + }; + return { + ...defaultBsPopperConfig, + ...execute(this._config.popperConfig, [defaultBsPopperConfig]) + }; + } + _setListeners() { + const triggers = this._config.trigger.split(' '); + for (const trigger of triggers) { + if (trigger === 'click') { + EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + context.toggle(); + }); + } else if (trigger !== TRIGGER_MANUAL) { + const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1); + const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1); + EventHandler.on(this._element, eventIn, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + context._enter(); + }); + EventHandler.on(this._element, eventOut, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); + context._leave(); + }); + } + } + this._hideModalHandler = () => { + if (this._element) { + this.hide(); + } + }; + EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + } + _fixTitle() { + const title = this._element.getAttribute('title'); + if (!title) { + return; + } + if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { + this._element.setAttribute('aria-label', title); + } + this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility + this._element.removeAttribute('title'); + } + _enter() { + if (this._isShown() || this._isHovered) { + this._isHovered = true; + return; + } + this._isHovered = true; + this._setTimeout(() => { + if (this._isHovered) { + this.show(); + } + }, this._config.delay.show); + } + _leave() { + if (this._isWithActiveTrigger()) { + return; + } + this._isHovered = false; + this._setTimeout(() => { + if (!this._isHovered) { + this.hide(); + } + }, this._config.delay.hide); + } + _setTimeout(handler, timeout) { + clearTimeout(this._timeout); + this._timeout = setTimeout(handler, timeout); + } + _isWithActiveTrigger() { + return Object.values(this._activeTrigger).includes(true); + } + _getConfig(config) { + const dataAttributes = Manipulator.getDataAttributes(this._element); + for (const dataAttribute of Object.keys(dataAttributes)) { + if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { + delete dataAttributes[dataAttribute]; + } + } + config = { + ...dataAttributes, + ...(typeof config === 'object' && config ? config : {}) + }; + config = this._mergeConfigObj(config); + config = this._configAfterMerge(config); + this._typeCheckConfig(config); + return config; + } + _configAfterMerge(config) { + config.container = config.container === false ? document.body : getElement(config.container); + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + return config; + } + _getDelegateConfig() { + const config = {}; + for (const [key, value] of Object.entries(this._config)) { + if (this.constructor.Default[key] !== value) { + config[key] = value; + } + } + config.selector = false; + config.trigger = 'manual'; + + // In the future can be replaced with: + // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) + // `Object.fromEntries(keysWithDifferentValues)` + return config; + } + _disposePopper() { + if (this._popper) { + this._popper.destroy(); + this._popper = null; + } + if (this.tip) { + this.tip.remove(); + this.tip = null; + } + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Tooltip.getOrCreateInstance(this, config); + if (typeof config !== 'string') { + return; + } + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + }); + } + } + + /** + * jQuery + */ + + defineJQueryPlugin(Tooltip); + + /** + * -------------------------------------------------------------------------- + * Bootstrap popover.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$3 = 'popover'; + const SELECTOR_TITLE = '.popover-header'; + const SELECTOR_CONTENT = '.popover-body'; + const Default$2 = { + ...Tooltip.Default, + content: '', + offset: [0, 8], + placement: 'right', + template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>', + trigger: 'click' + }; + const DefaultType$2 = { + ...Tooltip.DefaultType, + content: '(null|string|element|function)' + }; + + /** + * Class definition + */ + + class Popover extends Tooltip { + // Getters + static get Default() { + return Default$2; + } + static get DefaultType() { + return DefaultType$2; + } + static get NAME() { + return NAME$3; + } + + // Overrides + _isWithContent() { + return this._getTitle() || this._getContent(); + } + + // Private + _getContentForTemplate() { + return { + [SELECTOR_TITLE]: this._getTitle(), + [SELECTOR_CONTENT]: this._getContent() + }; + } + _getContent() { + return this._resolvePossibleFunction(this._config.content); + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Popover.getOrCreateInstance(this, config); + if (typeof config !== 'string') { + return; + } + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + }); + } + } + + /** + * jQuery + */ + + defineJQueryPlugin(Popover); + + /** + * -------------------------------------------------------------------------- + * Bootstrap scrollspy.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$2 = 'scrollspy'; + const DATA_KEY$2 = 'bs.scrollspy'; + const EVENT_KEY$2 = `.${DATA_KEY$2}`; + const DATA_API_KEY = '.data-api'; + const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`; + const EVENT_CLICK = `click${EVENT_KEY$2}`; + const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`; + const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; + const CLASS_NAME_ACTIVE$1 = 'active'; + const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; + const SELECTOR_TARGET_LINKS = '[href]'; + const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; + const SELECTOR_NAV_LINKS = '.nav-link'; + const SELECTOR_NAV_ITEMS = '.nav-item'; + const SELECTOR_LIST_ITEMS = '.list-group-item'; + const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`; + const SELECTOR_DROPDOWN = '.dropdown'; + const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle'; + const Default$1 = { + offset: null, + // TODO: v6 @deprecated, keep it for backwards compatibility reasons + rootMargin: '0px 0px -25%', + smoothScroll: false, + target: null, + threshold: [0.1, 0.5, 1] + }; + const DefaultType$1 = { + offset: '(number|null)', + // TODO v6 @deprecated, keep it for backwards compatibility reasons + rootMargin: 'string', + smoothScroll: 'boolean', + target: 'element', + threshold: 'array' + }; + + /** + * Class definition + */ + + class ScrollSpy extends BaseComponent { + constructor(element, config) { + super(element, config); + + // this._element is the observablesContainer and config.target the menu links wrapper + 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(); // initialize + } + + // Getters + static get Default() { + return Default$1; + } + static get DefaultType() { + return DefaultType$1; + } + static get NAME() { + return NAME$2; + } + + // Public + refresh() { + this._initializeTargetsAndObservables(); + this._maybeEnableSmoothScroll(); + if (this._observer) { + this._observer.disconnect(); + } else { + this._observer = this._getNewObserver(); + } + for (const section of this._observableSections.values()) { + this._observer.observe(section); + } + } + dispose() { + this._observer.disconnect(); + super.dispose(); + } + + // Private + _configAfterMerge(config) { + // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case + config.target = getElement(config.target) || document.body; + + // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only + config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin; + if (typeof config.threshold === 'string') { + config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value)); + } + return config; + } + _maybeEnableSmoothScroll() { + if (!this._config.smoothScroll) { + return; + } + + // unregister any previous listeners + EventHandler.off(this._config.target, EVENT_CLICK); + EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => { + const observableSection = this._observableSections.get(event.target.hash); + if (observableSection) { + event.preventDefault(); + const root = this._rootElement || window; + const height = observableSection.offsetTop - this._element.offsetTop; + if (root.scrollTo) { + root.scrollTo({ + top: height, + behavior: 'smooth' + }); + return; + } + + // Chrome 60 doesn't support `scrollTo` + root.scrollTop = height; + } + }); + } + _getNewObserver() { + const options = { + root: this._rootElement, + threshold: this._config.threshold, + rootMargin: this._config.rootMargin + }; + return new IntersectionObserver(entries => this._observerCallback(entries), options); + } + + // The logic of selection + _observerCallback(entries) { + const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`); + const activate = entry => { + this._previousScrollData.visibleEntryTop = entry.target.offsetTop; + this._process(targetElement(entry)); + }; + const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; + const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; + this._previousScrollData.parentScrollTop = parentScrollTop; + for (const entry of entries) { + if (!entry.isIntersecting) { + this._activeTarget = null; + this._clearActiveClass(targetElement(entry)); + continue; + } + const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; + // if we are scrolling down, pick the bigger offsetTop + if (userScrollsDown && entryIsLowerThanPrevious) { + activate(entry); + // if parent isn't scrolled, let's keep the first visible item, breaking the iteration + if (!parentScrollTop) { + return; + } + continue; + } + + // if we are scrolling up, pick the smallest offsetTop + if (!userScrollsDown && !entryIsLowerThanPrevious) { + activate(entry); + } + } + } + _initializeTargetsAndObservables() { + this._targetLinks = new Map(); + this._observableSections = new Map(); + const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target); + for (const anchor of targetLinks) { + // ensure that the anchor has an id and is not disabled + if (!anchor.hash || isDisabled(anchor)) { + continue; + } + const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element); + + // ensure that the observableSection exists & is visible + if (isVisible(observableSection)) { + this._targetLinks.set(decodeURI(anchor.hash), anchor); + this._observableSections.set(anchor.hash, observableSection); + } + } + } + _process(target) { + if (this._activeTarget === target) { + return; + } + this._clearActiveClass(this._config.target); + this._activeTarget = target; + target.classList.add(CLASS_NAME_ACTIVE$1); + this._activateParents(target); + EventHandler.trigger(this._element, EVENT_ACTIVATE, { + relatedTarget: target + }); + } + _activateParents(target) { + // Activate dropdown parents + if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { + SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1); + return; + } + for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) { + // Set triggered links parents as active + // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor + for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) { + item.classList.add(CLASS_NAME_ACTIVE$1); + } + } + } + _clearActiveClass(parent) { + parent.classList.remove(CLASS_NAME_ACTIVE$1); + const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent); + for (const node of activeNodes) { + node.classList.remove(CLASS_NAME_ACTIVE$1); + } + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = ScrollSpy.getOrCreateInstance(this, config); + if (typeof config !== 'string') { + return; + } + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + }); + } + } + + /** + * Data API implementation + */ + + EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => { + for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) { + ScrollSpy.getOrCreateInstance(spy); + } + }); + + /** + * jQuery + */ + + defineJQueryPlugin(ScrollSpy); + + /** + * -------------------------------------------------------------------------- + * Bootstrap tab.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME$1 = 'tab'; + const DATA_KEY$1 = 'bs.tab'; + const EVENT_KEY$1 = `.${DATA_KEY$1}`; + const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`; + const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`; + const EVENT_SHOW$1 = `show${EVENT_KEY$1}`; + const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`; + const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`; + const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`; + const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`; + const ARROW_LEFT_KEY = 'ArrowLeft'; + const ARROW_RIGHT_KEY = 'ArrowRight'; + const ARROW_UP_KEY = 'ArrowUp'; + const ARROW_DOWN_KEY = 'ArrowDown'; + const HOME_KEY = 'Home'; + const END_KEY = 'End'; + const CLASS_NAME_ACTIVE = 'active'; + const CLASS_NAME_FADE$1 = 'fade'; + const CLASS_NAME_SHOW$1 = 'show'; + const CLASS_DROPDOWN = 'dropdown'; + const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; + const SELECTOR_DROPDOWN_MENU = '.dropdown-menu'; + const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`; + const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'; + const SELECTOR_OUTER = '.nav-item, .list-group-item'; + const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`; + const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // TODO: could only be `tab` in v6 + const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`; + const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`; + + /** + * Class definition + */ + + class Tab extends BaseComponent { + constructor(element) { + super(element); + this._parent = this._element.closest(SELECTOR_TAB_PANEL); + if (!this._parent) { + return; + // TODO: should throw exception in v6 + // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`) + } + + // Set up initial aria attributes + this._setInitialAttributes(this._parent, this._getChildren()); + EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event)); + } + + // Getters + static get NAME() { + return NAME$1; + } + + // Public + show() { + // Shows this elem and deactivate the active sibling if exists + const innerElem = this._element; + if (this._elemIsActive(innerElem)) { + return; + } + + // Search for active tab on same parent to deactivate it + const active = this._getActiveElem(); + const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, { + relatedTarget: innerElem + }) : null; + const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, { + relatedTarget: active + }); + if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) { + return; + } + this._deactivate(active, innerElem); + this._activate(innerElem, active); + } + + // Private + _activate(element, relatedElem) { + if (!element) { + return; + } + element.classList.add(CLASS_NAME_ACTIVE); + this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section + + const complete = () => { + if (element.getAttribute('role') !== 'tab') { + element.classList.add(CLASS_NAME_SHOW$1); + return; + } + element.removeAttribute('tabindex'); + element.setAttribute('aria-selected', true); + this._toggleDropDown(element, true); + EventHandler.trigger(element, EVENT_SHOWN$1, { + relatedTarget: relatedElem + }); + }; + this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1)); + } + _deactivate(element, relatedElem) { + if (!element) { + return; + } + element.classList.remove(CLASS_NAME_ACTIVE); + element.blur(); + this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too + + const complete = () => { + if (element.getAttribute('role') !== 'tab') { + element.classList.remove(CLASS_NAME_SHOW$1); + return; + } + element.setAttribute('aria-selected', false); + element.setAttribute('tabindex', '-1'); + this._toggleDropDown(element, false); + EventHandler.trigger(element, EVENT_HIDDEN$1, { + relatedTarget: relatedElem + }); + }; + this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1)); + } + _keydown(event) { + if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) { + return; + } + event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page + event.preventDefault(); + const children = this._getChildren().filter(element => !isDisabled(element)); + let nextActiveElement; + if ([HOME_KEY, END_KEY].includes(event.key)) { + nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]; + } else { + const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key); + nextActiveElement = getNextActiveElement(children, event.target, isNext, true); + } + if (nextActiveElement) { + nextActiveElement.focus({ + preventScroll: true + }); + Tab.getOrCreateInstance(nextActiveElement).show(); + } + } + _getChildren() { + // collection of inner elements + return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent); + } + _getActiveElem() { + return this._getChildren().find(child => this._elemIsActive(child)) || null; + } + _setInitialAttributes(parent, children) { + this._setAttributeIfNotExists(parent, 'role', 'tablist'); + for (const child of children) { + this._setInitialAttributesOnChild(child); + } + } + _setInitialAttributesOnChild(child) { + child = this._getInnerElement(child); + const isActive = this._elemIsActive(child); + const outerElem = this._getOuterElement(child); + child.setAttribute('aria-selected', isActive); + if (outerElem !== child) { + this._setAttributeIfNotExists(outerElem, 'role', 'presentation'); + } + if (!isActive) { + child.setAttribute('tabindex', '-1'); + } + this._setAttributeIfNotExists(child, 'role', 'tab'); + + // set attributes to the related panel too + this._setInitialAttributesOnTargetPanel(child); + } + _setInitialAttributesOnTargetPanel(child) { + const target = SelectorEngine.getElementFromSelector(child); + if (!target) { + return; + } + this._setAttributeIfNotExists(target, 'role', 'tabpanel'); + if (child.id) { + this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`); + } + } + _toggleDropDown(element, open) { + const outerElem = this._getOuterElement(element); + if (!outerElem.classList.contains(CLASS_DROPDOWN)) { + return; + } + const toggle = (selector, className) => { + const element = SelectorEngine.findOne(selector, outerElem); + if (element) { + element.classList.toggle(className, open); + } + }; + toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE); + toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1); + outerElem.setAttribute('aria-expanded', open); + } + _setAttributeIfNotExists(element, attribute, value) { + if (!element.hasAttribute(attribute)) { + element.setAttribute(attribute, value); + } + } + _elemIsActive(elem) { + return elem.classList.contains(CLASS_NAME_ACTIVE); + } + + // Try to get the inner element (usually the .nav-link) + _getInnerElement(elem) { + return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem); + } + + // Try to get the outer element (usually the .nav-item) + _getOuterElement(elem) { + return elem.closest(SELECTOR_OUTER) || elem; + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Tab.getOrCreateInstance(this); + if (typeof config !== 'string') { + return; + } + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + data[config](); + }); + } + } + + /** + * Data API implementation + */ + + EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + if (isDisabled(this)) { + return; + } + Tab.getOrCreateInstance(this).show(); + }); + + /** + * Initialize on focus + */ + EventHandler.on(window, EVENT_LOAD_DATA_API, () => { + for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) { + Tab.getOrCreateInstance(element); + } + }); + /** + * jQuery + */ + + defineJQueryPlugin(Tab); + + /** + * -------------------------------------------------------------------------- + * Bootstrap toast.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + + /** + * Constants + */ + + const NAME = 'toast'; + const DATA_KEY = 'bs.toast'; + const EVENT_KEY = `.${DATA_KEY}`; + const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`; + const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`; + const EVENT_FOCUSIN = `focusin${EVENT_KEY}`; + const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`; + const EVENT_HIDE = `hide${EVENT_KEY}`; + const EVENT_HIDDEN = `hidden${EVENT_KEY}`; + const EVENT_SHOW = `show${EVENT_KEY}`; + const EVENT_SHOWN = `shown${EVENT_KEY}`; + const CLASS_NAME_FADE = 'fade'; + const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility + const CLASS_NAME_SHOW = 'show'; + const CLASS_NAME_SHOWING = 'showing'; + const DefaultType = { + animation: 'boolean', + autohide: 'boolean', + delay: 'number' + }; + const Default = { + animation: true, + autohide: true, + delay: 5000 + }; + + /** + * Class definition + */ + + class Toast extends BaseComponent { + constructor(element, config) { + super(element, config); + this._timeout = null; + this._hasMouseInteraction = false; + this._hasKeyboardInteraction = false; + this._setListeners(); + } + + // Getters + static get Default() { + return Default; + } + static get DefaultType() { + return DefaultType; + } + static get NAME() { + return NAME; + } + + // Public + show() { + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW); + if (showEvent.defaultPrevented) { + return; + } + this._clearTimeout(); + if (this._config.animation) { + this._element.classList.add(CLASS_NAME_FADE); + } + const complete = () => { + this._element.classList.remove(CLASS_NAME_SHOWING); + EventHandler.trigger(this._element, EVENT_SHOWN); + this._maybeScheduleHide(); + }; + this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated + reflow(this._element); + this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING); + this._queueCallback(complete, this._element, this._config.animation); + } + hide() { + if (!this.isShown()) { + return; + } + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE); + if (hideEvent.defaultPrevented) { + return; + } + const complete = () => { + this._element.classList.add(CLASS_NAME_HIDE); // @deprecated + this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW); + EventHandler.trigger(this._element, EVENT_HIDDEN); + }; + this._element.classList.add(CLASS_NAME_SHOWING); + this._queueCallback(complete, this._element, this._config.animation); + } + dispose() { + this._clearTimeout(); + if (this.isShown()) { + this._element.classList.remove(CLASS_NAME_SHOW); + } + super.dispose(); + } + isShown() { + return this._element.classList.contains(CLASS_NAME_SHOW); + } + + // Private + + _maybeScheduleHide() { + if (!this._config.autohide) { + return; + } + if (this._hasMouseInteraction || this._hasKeyboardInteraction) { + return; + } + this._timeout = setTimeout(() => { + this.hide(); + }, this._config.delay); + } + _onInteraction(event, isInteracting) { + switch (event.type) { + case 'mouseover': + case 'mouseout': + { + this._hasMouseInteraction = isInteracting; + break; + } + case 'focusin': + case 'focusout': + { + this._hasKeyboardInteraction = isInteracting; + break; + } + } + if (isInteracting) { + this._clearTimeout(); + return; + } + const nextElement = event.relatedTarget; + if (this._element === nextElement || this._element.contains(nextElement)) { + return; + } + this._maybeScheduleHide(); + } + _setListeners() { + EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true)); + EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false)); + EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true)); + EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false)); + } + _clearTimeout() { + clearTimeout(this._timeout); + this._timeout = null; + } + + // Static + static jQueryInterface(config) { + return this.each(function () { + const data = Toast.getOrCreateInstance(this, config); + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + data[config](this); + } + }); + } + } + + /** + * Data API implementation + */ + + enableDismissTrigger(Toast); + + /** + * jQuery + */ + + defineJQueryPlugin(Toast); + + /** + * -------------------------------------------------------------------------- + * Bootstrap index.umd.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const index_umd = { + Alert, + Button, + Carousel, + Collapse, + Dropdown, + Modal, + Offcanvas, + Popover, + ScrollSpy, + Tab, + Toast, + Tooltip + }; + + return index_umd; + +})); +//# sourceMappingURL=bootstrap.js.map diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.js.map b/extensions/pagetop-bootsier/static/js/bootstrap.js.map new file mode 100644 index 00000000..98a87052 --- /dev/null +++ b/extensions/pagetop-bootsier/static/js/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bootstrap.js","sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"names":["elementMap","Map","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","MAX_UID","MILLISECONDS_MULTIPLIER","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","undefined","Object","prototype","toString","call","toLowerCase","getUID","prefix","Math","floor","random","document","getElementById","getTransitionDurationFromElement","transitionDuration","transitionDelay","getComputedStyle","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","querySelector","isVisible","getClientRects","elementIsVisible","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","onDOMContentLoaded","callback","readyState","addEventListener","push","isRTL","dir","defineJQueryPlugin","plugin","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","durationPadding","emulatedDuration","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","bootstrapHandler","event","hydrateObj","delegateTarget","oneOff","EventHandler","off","type","apply","bootstrapDelegationHandler","domElements","querySelectorAll","domElement","findHandler","events","callable","delegationSelector","values","find","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","wrapFunction","relatedTarget","handlers","previousFunction","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","JSON","parse","decodeURIComponent","normalizeDataKey","chr","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","RegExp","test","TypeError","toUpperCase","VERSION","BaseComponent","_element","_config","Data","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","CLASS_NAME_FADE","CLASS_NAME_SHOW","Alert","close","closeEvent","_destroyElement","each","data","DATA_API_KEY","CLASS_NAME_ACTIVE","SELECTOR_DATA_TOGGLE","EVENT_CLICK_DATA_API","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","POINTER_TYPE_TOUCH","POINTER_TYPE_PEN","CLASS_NAME_POINTER_EVENT","SWIPE_THRESHOLD","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","touches","clientX","_eventIsPointerPenTouch","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","TOUCHEVENT_COMPAT_WAIT","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_SLIDE","CLASS_NAME_END","CLASS_NAME_START","CLASS_NAME_NEXT","CLASS_NAME_PREV","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","SELECTOR_ITEM_IMG","SELECTOR_INDICATORS","SELECTOR_DATA_SLIDE","SELECTOR_DATA_RIDE","KEY_TO_DIRECTION","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","endCallBack","clearTimeout","swipeConfig","_directionToOrder","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","slideEvent","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","CLASS_NAME_HORIZONTAL","WIDTH","HEIGHT","SELECTOR_ACTIVES","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","startEvent","activeInstance","dimension","_getDimension","style","complete","capitalizedDimension","scrollSize","getBoundingClientRect","selected","triggerArray","isOpen","ESCAPE_KEY","TAB_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","RIGHT_MOUSE_BUTTON","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","CLASS_NAME_DROPUP","CLASS_NAME_DROPEND","CLASS_NAME_DROPSTART","CLASS_NAME_DROPUP_CENTER","CLASS_NAME_DROPDOWN_CENTER","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","SELECTOR_NAVBAR","SELECTOR_NAVBAR_NAV","SELECTOR_VISIBLE_ITEMS","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","PLACEMENT_TOPCENTER","PLACEMENT_BOTTOMCENTER","autoClose","boundary","display","offset","popperConfig","reference","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","showEvent","_createPopper","focus","_completeHide","destroy","update","hideEvent","Popper","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_FORWARD","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","manipulationCallBack","setProperty","_applyManipulationCallback","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","OPEN_SELECTOR","SELECTOR_DIALOG","SELECTOR_MODAL_BODY","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","CLASS_NAME_BACKDROP","scroll","Offcanvas","blur","completeCallback","position","ARIA_ATTRIBUTE_PATTERN","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","sanitizeHtml","unsafeHtml","allowList","sanitizeFunction","domParser","DOMParser","createdDocument","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","content","extraClass","html","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","DISALLOWED_ATTRIBUTES","CLASS_NAME_MODAL","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","TRIGGER_MANUAL","EVENT_INSERTED","EVENT_CLICK","EVENT_FOCUSOUT","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","fallbackPlacements","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","shadowRoot","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","EVENT_ACTIVATE","CLASS_NAME_DROPDOWN_ITEM","SELECTOR_DATA_SPY","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LIST_GROUP","SELECTOR_NAV_LINKS","SELECTOR_NAV_ITEMS","SELECTOR_LIST_ITEMS","SELECTOR_LINK_ITEMS","SELECTOR_DROPDOWN","SELECTOR_DROPDOWN_TOGGLE","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","HOME_KEY","END_KEY","CLASS_DROPDOWN","SELECTOR_DROPDOWN_MENU","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_TAB_PANEL","SELECTOR_OUTER","SELECTOR_INNER","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"mappings":"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"} \ No newline at end of file diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.min.js b/extensions/pagetop-bootsier/static/js/bootstrap.min.js new file mode 100644 index 00000000..d5dc5ea1 --- /dev/null +++ b/extensions/pagetop-bootsier/static/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t)for(const i in t)if("default"!==i){const s=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const i=e(t),s=new Map,n={set(t,e,i){s.has(t)||s.set(t,new Map);const n=s.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>s.has(t)&&s.get(t).get(e)||null,remove(t,e){if(!s.has(t))return;const i=s.get(t);i.delete(e),0===i.size&&s.delete(t)}},o="transitionend",r=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),a=t=>{t.dispatchEvent(new Event(o))},l=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),c=t=>l(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(r(t)):null,h=t=>{if(!l(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},d=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),u=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?u(t.parentNode):null},_=()=>{},g=t=>{t.offsetHeight},f=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,m=[],p=()=>"rtl"===document.documentElement.dir,b=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}},"loading"===document.readyState?(m.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of m)t()})),m.push(e)):e()},v=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,y=(t,e,i=!0)=>{if(!i)return void v(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const s=Number.parseFloat(e),n=Number.parseFloat(i);return s||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let n=!1;const r=({target:i})=>{i===e&&(n=!0,e.removeEventListener(o,r),v(t))};e.addEventListener(o,r),setTimeout((()=>{n||a(e)}),s)},w=(t,e,i,s)=>{const n=t.length;let o=t.indexOf(e);return-1===o?!i&&s?t[n-1]:t[0]:(o+=i?1:-1,s&&(o=(o+n)%n),t[Math.max(0,Math.min(o,n-1))])},A=/[^.]*(?=\..*)\.|.*/,E=/\..*/,C=/::\d+$/,T={};let k=1;const $={mouseenter:"mouseover",mouseleave:"mouseout"},S=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"]);function L(t,e){return e&&`${e}::${k++}`||t.uidEvent||k++}function O(t){const e=L(t);return t.uidEvent=e,T[e]=T[e]||{},T[e]}function I(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function D(t,e,i){const s="string"==typeof e,n=s?i:e||i;let o=M(t);return S.has(o)||(o=t),[s,n,o]}function N(t,e,i,s,n){if("string"!=typeof e||!t)return;let[o,r,a]=D(e,i,s);if(e in $){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=O(t),c=l[a]||(l[a]={}),h=I(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=L(r,e.replace(A,"")),u=o?function(t,e,i){return function s(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return F(n,{delegateTarget:r}),s.oneOff&&j.off(t,n.type,e,i),i.apply(r,[n])}}(t,i,r):function(t,e){return function i(s){return F(s,{delegateTarget:t}),i.oneOff&&j.off(t,s.type,e),e.apply(t,[s])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function P(t,e,i,s,n){const o=I(e[i],s,n);o&&(t.removeEventListener(i,o,Boolean(n)),delete e[i][o.uidEvent])}function x(t,e,i,s){const n=e[i]||{};for(const[o,r]of Object.entries(n))o.includes(s)&&P(t,e,i,r.callable,r.delegationSelector)}function M(t){return t=t.replace(E,""),$[t]||t}const j={on(t,e,i,s){N(t,e,i,s,!1)},one(t,e,i,s){N(t,e,i,s,!0)},off(t,e,i,s){if("string"!=typeof e||!t)return;const[n,o,r]=D(e,i,s),a=r!==e,l=O(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))x(t,l,i,e.slice(1));for(const[i,s]of Object.entries(c)){const n=i.replace(C,"");a&&!e.includes(n)||P(t,l,r,s.callable,s.delegationSelector)}}else{if(!Object.keys(c).length)return;P(t,l,r,o,n?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const s=f();let n=null,o=!0,r=!0,a=!1;e!==M(e)&&s&&(n=s.Event(e,i),s(t).trigger(n),o=!n.isPropagationStopped(),r=!n.isImmediatePropagationStopped(),a=n.isDefaultPrevented());const l=F(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&n&&n.preventDefault(),l}};function F(t,e={}){for(const[i,s]of Object.entries(e))try{t[i]=s}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>s})}return t}function z(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function H(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${H(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${H(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const s of i){let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=z(t.dataset[s])}return e},getDataAttribute:(t,e)=>z(t.getAttribute(`data-bs-${H(e)}`))};class q{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=l(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...l(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[s,n]of Object.entries(e)){const e=t[s],o=l(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(n).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${s}" provided type "${o}" but expected type "${n}".`)}var i}}class W extends q{constructor(t,e){super(),(t=c(t))&&(this._element=t,this._config=this._getConfig(e),n.set(this._element,this.constructor.DATA_KEY,this))}dispose(){n.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){y(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return n.get(c(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const R=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>r(t))).join(","):null},K={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let s=t.parentNode.closest(e);for(;s;)i.push(s),s=s.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!d(t)&&h(t)))},getSelectorFromElement(t){const e=R(t);return e&&K.findOne(e)?e:null},getElementFromSelector(t){const e=R(t);return e?K.findOne(e):null},getMultipleElementsFromSelector(t){const e=R(t);return e?K.find(e):[]}},V=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),d(this))return;const n=K.getElementFromSelector(this)||this.closest(`.${s}`);t.getOrCreateInstance(n)[e]()}))},Q=".bs.alert",X=`close${Q}`,Y=`closed${Q}`;class U extends W{static get NAME(){return"alert"}close(){if(j.trigger(this._element,X).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,Y),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=U.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}V(U,"close"),b(U);const G='[data-bs-toggle="button"]';class J extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=J.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}j.on(document,"click.bs.button.data-api",G,(t=>{t.preventDefault();const e=t.target.closest(G);J.getOrCreateInstance(e).toggle()})),b(J);const Z=".bs.swipe",tt=`touchstart${Z}`,et=`touchmove${Z}`,it=`touchend${Z}`,st=`pointerdown${Z}`,nt=`pointerup${Z}`,ot={endCallback:null,leftCallback:null,rightCallback:null},rt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class at extends q{constructor(t,e){super(),this._element=t,t&&at.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"swipe"}dispose(){j.off(this._element,Z)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),v(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&v(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(j.on(this._element,st,(t=>this._start(t))),j.on(this._element,nt,(t=>this._end(t))),this._element.classList.add("pointer-event")):(j.on(this._element,tt,(t=>this._start(t))),j.on(this._element,et,(t=>this._move(t))),j.on(this._element,it,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const lt=".bs.carousel",ct=".data-api",ht="next",dt="prev",ut="left",_t="right",gt=`slide${lt}`,ft=`slid${lt}`,mt=`keydown${lt}`,pt=`mouseenter${lt}`,bt=`mouseleave${lt}`,vt=`dragstart${lt}`,yt=`load${lt}${ct}`,wt=`click${lt}${ct}`,At="carousel",Et="active",Ct=".active",Tt=".carousel-item",kt=Ct+Tt,$t={ArrowLeft:_t,ArrowRight:ut},St={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Lt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Ot extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=K.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===At&&this.cycle()}static get Default(){return St}static get DefaultType(){return Lt}static get NAME(){return"carousel"}next(){this._slide(ht)}nextWhenVisible(){!document.hidden&&h(this._element)&&this.next()}prev(){this._slide(dt)}pause(){this._isSliding&&a(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?j.one(this._element,ft,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,ft,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const s=t>i?ht:dt;this._slide(s,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&j.on(this._element,mt,(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,pt,(()=>this.pause())),j.on(this._element,bt,(()=>this._maybeEnableCycle()))),this._config.touch&&at.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of K.find(".carousel-item img",this._element))j.on(t,vt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ut)),rightCallback:()=>this._slide(this._directionToOrder(_t)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new at(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=$t[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=K.findOne(Ct,this._indicatorsElement);e.classList.remove(Et),e.removeAttribute("aria-current");const i=K.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Et),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),s=t===ht,n=e||w(this._getItems(),i,s,this._config.wrap);if(n===i)return;const o=this._getItemIndex(n),r=e=>j.trigger(this._element,e,{relatedTarget:n,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(gt).defaultPrevented)return;if(!i||!n)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=n;const l=s?"carousel-item-start":"carousel-item-end",c=s?"carousel-item-next":"carousel-item-prev";n.classList.add(c),g(n),i.classList.add(l),n.classList.add(l),this._queueCallback((()=>{n.classList.remove(l,c),n.classList.add(Et),i.classList.remove(Et,c,l),this._isSliding=!1,r(ft)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return K.findOne(kt,this._element)}_getItems(){return K.find(Tt,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ut?dt:ht:t===ut?ht:dt}_orderToDirection(t){return p()?t===dt?ut:_t:t===dt?_t:ut}static jQueryInterface(t){return this.each((function(){const e=Ot.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}j.on(document,wt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=K.getElementFromSelector(this);if(!e||!e.classList.contains(At))return;t.preventDefault();const i=Ot.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),j.on(window,yt,(()=>{const t=K.find('[data-bs-ride="carousel"]');for(const e of t)Ot.getOrCreateInstance(e)})),b(Ot);const It=".bs.collapse",Dt=`show${It}`,Nt=`shown${It}`,Pt=`hide${It}`,xt=`hidden${It}`,Mt=`click${It}.data-api`,jt="show",Ft="collapse",zt="collapsing",Ht=`:scope .${Ft} .${Ft}`,Bt='[data-bs-toggle="collapse"]',qt={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Rt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=K.find(Bt);for(const t of i){const e=K.getSelectorFromElement(t),i=K.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return qt}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Rt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(j.trigger(this._element,Dt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Ft),this._element.classList.add(zt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(zt),this._element.classList.add(Ft,jt),this._element.style[e]="",j.trigger(this._element,Nt)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,Pt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,g(this._element),this._element.classList.add(zt),this._element.classList.remove(Ft,jt);for(const t of this._triggerArray){const e=K.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(zt),this._element.classList.add(Ft),j.trigger(this._element,xt)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(jt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=c(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Bt);for(const e of t){const t=K.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=K.find(Ht,this._config.parent);return K.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Rt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,Mt,Bt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of K.getMultipleElementsFromSelector(this))Rt.getOrCreateInstance(t,{toggle:!1}).toggle()})),b(Rt);const Kt="dropdown",Vt=".bs.dropdown",Qt=".data-api",Xt="ArrowUp",Yt="ArrowDown",Ut=`hide${Vt}`,Gt=`hidden${Vt}`,Jt=`show${Vt}`,Zt=`shown${Vt}`,te=`click${Vt}${Qt}`,ee=`keydown${Vt}${Qt}`,ie=`keyup${Vt}${Qt}`,se="show",ne='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',oe=`${ne}.${se}`,re=".dropdown-menu",ae=p()?"top-end":"top-start",le=p()?"top-start":"top-end",ce=p()?"bottom-end":"bottom-start",he=p()?"bottom-start":"bottom-end",de=p()?"left-start":"right-start",ue=p()?"right-start":"left-start",_e={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},ge={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class fe extends W{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=K.next(this._element,re)[0]||K.prev(this._element,re)[0]||K.findOne(re,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return _e}static get DefaultType(){return ge}static get NAME(){return Kt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(d(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!j.trigger(this._element,Jt,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))j.on(t,"mouseover",_);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(se),this._element.classList.add(se),j.trigger(this._element,Zt,t)}}hide(){if(d(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!j.trigger(this._element,Ut,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))j.off(t,"mouseover",_);this._popper&&this._popper.destroy(),this._menu.classList.remove(se),this._element.classList.remove(se),this._element.setAttribute("aria-expanded","false"),B.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,Gt,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!l(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Kt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===i)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:l(this._config.reference)?t=c(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=i.createPopper(t,this._menu,e)}_isShown(){return this._menu.classList.contains(se)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return de;if(t.classList.contains("dropstart"))return ue;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?le:ae:e?he:ce}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...v(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=K.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>h(t)));i.length&&w(i,e,t===Yt,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=fe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=K.find(oe);for(const i of e){const e=fe.getInstance(i);if(!e||!1===e._config.autoClose)continue;const s=t.composedPath(),n=s.includes(e._menu);if(s.includes(e._element)||"inside"===e._config.autoClose&&!n||"outside"===e._config.autoClose&&n)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,s=[Xt,Yt].includes(t.key);if(!s&&!i)return;if(e&&!i)return;t.preventDefault();const n=this.matches(ne)?this:K.prev(this,ne)[0]||K.next(this,ne)[0]||K.findOne(ne,t.delegateTarget.parentNode),o=fe.getOrCreateInstance(n);if(s)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),n.focus())}}j.on(document,ee,ne,fe.dataApiKeydownHandler),j.on(document,ee,re,fe.dataApiKeydownHandler),j.on(document,te,fe.clearMenus),j.on(document,ie,fe.clearMenus),j.on(document,te,ne,(function(t){t.preventDefault(),fe.getOrCreateInstance(this).toggle()})),b(fe);const me="backdrop",pe="show",be=`mousedown.bs.${me}`,ve={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},ye={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class we extends q{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return ve}static get DefaultType(){return ye}static get NAME(){return me}show(t){if(!this._config.isVisible)return void v(t);this._append();const e=this._getElement();this._config.isAnimated&&g(e),e.classList.add(pe),this._emulateAnimation((()=>{v(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(pe),this._emulateAnimation((()=>{this.dispose(),v(t)}))):v(t)}dispose(){this._isAppended&&(j.off(this._element,be),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=c(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),j.on(t,be,(()=>{v(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){y(t,this._getElement(),this._config.isAnimated)}}const Ae=".bs.focustrap",Ee=`focusin${Ae}`,Ce=`keydown.tab${Ae}`,Te="backward",ke={autofocus:!0,trapElement:null},$e={autofocus:"boolean",trapElement:"element"};class Se extends q{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return ke}static get DefaultType(){return $e}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),j.off(document,Ae),j.on(document,Ee,(t=>this._handleFocusin(t))),j.on(document,Ce,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,Ae))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=K.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Te?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Te:"forward")}}const Le=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Oe=".sticky-top",Ie="padding-right",De="margin-right";class Ne{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Ie,(e=>e+t)),this._setElementAttributes(Le,Ie,(e=>e+t)),this._setElementAttributes(Oe,De,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Ie),this._resetElementAttributes(Le,Ie),this._resetElementAttributes(Oe,De)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const s=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+s)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(n))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(l(t))e(t);else for(const i of K.find(t,this._element))e(i)}}const Pe=".bs.modal",xe=`hide${Pe}`,Me=`hidePrevented${Pe}`,je=`hidden${Pe}`,Fe=`show${Pe}`,ze=`shown${Pe}`,He=`resize${Pe}`,Be=`click.dismiss${Pe}`,qe=`mousedown.dismiss${Pe}`,We=`keydown.dismiss${Pe}`,Re=`click${Pe}.data-api`,Ke="modal-open",Ve="show",Qe="modal-static",Xe={backdrop:!0,focus:!0,keyboard:!0},Ye={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ue extends W{constructor(t,e){super(t,e),this._dialog=K.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ne,this._addEventListeners()}static get Default(){return Xe}static get DefaultType(){return Ye}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,Fe,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Ke),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(j.trigger(this._element,xe).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Ve),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){j.off(window,Pe),j.off(this._dialog,Pe),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new we({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_showElement(t){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;const e=K.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),g(this._element),this._element.classList.add(Ve),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,ze,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){j.on(this._element,We,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),j.on(window,He,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),j.on(this._element,qe,(t=>{j.one(this._element,Be,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_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(Ke),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,je)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,Me).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Qe)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Qe),this._queueCallback((()=>{this._element.classList.remove(Qe),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ue.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,Re,'[data-bs-toggle="modal"]',(function(t){const e=K.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,Fe,(t=>{t.defaultPrevented||j.one(e,je,(()=>{h(this)&&this.focus()}))}));const i=K.findOne(".modal.show");i&&Ue.getInstance(i).hide(),Ue.getOrCreateInstance(e).toggle(this)})),V(Ue),b(Ue);const Ge=".bs.offcanvas",Je=".data-api",Ze=`load${Ge}${Je}`,ti="show",ei="showing",ii="hiding",si=".offcanvas.show",ni=`show${Ge}`,oi=`shown${Ge}`,ri=`hide${Ge}`,ai=`hidePrevented${Ge}`,li=`hidden${Ge}`,ci=`resize${Ge}`,hi=`click${Ge}${Je}`,di=`keydown.dismiss${Ge}`,ui={backdrop:!0,keyboard:!0,scroll:!1},_i={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class gi extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return ui}static get DefaultType(){return _i}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,ni,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ne).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ei),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(ti),this._element.classList.remove(ei),j.trigger(this._element,oi,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,ri).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ii),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(ti,ii),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ne).reset(),j.trigger(this._element,li)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new we({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():j.trigger(this._element,ai)}:null})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_addEventListeners(){j.on(this._element,di,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():j.trigger(this._element,ai))}))}static jQueryInterface(t){return this.each((function(){const e=gi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,hi,'[data-bs-toggle="offcanvas"]',(function(t){const e=K.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this))return;j.one(e,li,(()=>{h(this)&&this.focus()}));const i=K.findOne(si);i&&i!==e&&gi.getInstance(i).hide(),gi.getOrCreateInstance(e).toggle(this)})),j.on(window,Ze,(()=>{for(const t of K.find(si))gi.getOrCreateInstance(t).show()})),j.on(window,ci,(()=>{for(const t of K.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&gi.getOrCreateInstance(t).hide()})),V(gi),b(gi);const fi={"*":["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:[]},mi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),pi=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,bi=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!mi.has(i)||Boolean(pi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},vi={allowList:fi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},yi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},wi={entry:"(string|element|function|null)",selector:"(string|element)"};class Ai extends q{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return vi}static get DefaultType(){return yi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},wi)}_setContent(t,e,i){const s=K.findOne(i,t);s&&((e=this._resolvePossibleFunction(e))?l(e)?this._putElementInTemplate(c(e),s):this._config.html?s.innerHTML=this._maybeSanitize(e):s.textContent=e:s.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const s=(new window.DOMParser).parseFromString(t,"text/html"),n=[].concat(...s.body.querySelectorAll("*"));for(const t of n){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const s=[].concat(...t.attributes),n=[].concat(e["*"]||[],e[i]||[]);for(const e of s)bi(e,n)||t.removeAttribute(e.nodeName)}return s.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return v(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ei=new Set(["sanitize","allowList","sanitizeFn"]),Ci="fade",Ti="show",ki=".modal",$i="hide.bs.modal",Si="hover",Li="focus",Oi={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},Ii={allowList:fi,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:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},Di={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 Ni extends W{constructor(t,e){if(void 0===i)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),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 Ii}static get DefaultType(){return Di}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ki),$i,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("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.eventName("show")),e=(u(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),j.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(Ti),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))j.on(t,"mouseover",_);this._queueCallback((()=>{j.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!j.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Ti),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))j.off(t,"mouseover",_);this._activeTrigger.click=!1,this._activeTrigger[Li]=!1,this._activeTrigger[Si]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Ci,Ti),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Ci),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Ai({...this._config,content:t,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(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ci)}_isShown(){return this.tip&&this.tip.classList.contains(Ti)}_createPopper(t){const e=v(this._config.placement,[this,t,this._element]),s=Oi[e.toUpperCase()];return i.createPopper(this._element,t,this._getPopperConfig(s))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return v(t,[this._element])}_getPopperConfig(t){const e={placement:t,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:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...v(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)j.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===Si?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===Si?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");j.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?Li:Si]=!0,e._enter()})),j.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?Li:Si]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ki),$i,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(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(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ei.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:c(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Ni);const Pi={...Ni.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},xi={...Ni.DefaultType,content:"(null|string|element|function)"};class Mi extends Ni{static get Default(){return Pi}static get DefaultType(){return xi}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(t){return this.each((function(){const e=Mi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Mi);const ji=".bs.scrollspy",Fi=`activate${ji}`,zi=`click${ji}`,Hi=`load${ji}.data-api`,Bi="active",qi="[href]",Wi=".nav-link",Ri=`${Wi}, .nav-item > ${Wi}, .list-group-item`,Ki={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Vi={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Qi extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Ki}static get DefaultType(){return Vi}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=c(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(j.off(this._config.target,zi),j.on(this._config.target,zi,qi,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,s=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:s,behavior:"smooth"});i.scrollTop=s}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},s=(this._rootElement||document.documentElement).scrollTop,n=s>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=s;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(n&&t){if(i(o),!s)return}else n||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=K.find(qi,this._config.target);for(const e of t){if(!e.hash||d(e))continue;const t=K.findOne(decodeURI(e.hash),this._element);h(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Bi),this._activateParents(t),j.trigger(this._element,Fi,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))K.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Bi);else for(const e of K.parents(t,".nav, .list-group"))for(const t of K.prev(e,Ri))t.classList.add(Bi)}_clearActiveClass(t){t.classList.remove(Bi);const e=K.find(`${qi}.${Bi}`,t);for(const t of e)t.classList.remove(Bi)}static jQueryInterface(t){return this.each((function(){const e=Qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,Hi,(()=>{for(const t of K.find('[data-bs-spy="scroll"]'))Qi.getOrCreateInstance(t)})),b(Qi);const Xi=".bs.tab",Yi=`hide${Xi}`,Ui=`hidden${Xi}`,Gi=`show${Xi}`,Ji=`shown${Xi}`,Zi=`click${Xi}`,ts=`keydown${Xi}`,es=`load${Xi}`,is="ArrowLeft",ss="ArrowRight",ns="ArrowUp",os="ArrowDown",rs="Home",as="End",ls="active",cs="fade",hs="show",ds=".dropdown-toggle",us=`:not(${ds})`,_s='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',gs=`.nav-link${us}, .list-group-item${us}, [role="tab"]${us}, ${_s}`,fs=`.${ls}[data-bs-toggle="tab"], .${ls}[data-bs-toggle="pill"], .${ls}[data-bs-toggle="list"]`;class ms extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),j.on(this._element,ts,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?j.trigger(e,Yi,{relatedTarget:t}):null;j.trigger(t,Gi,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(ls),this._activate(K.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),j.trigger(t,Ji,{relatedTarget:e})):t.classList.add(hs)}),t,t.classList.contains(cs)))}_deactivate(t,e){t&&(t.classList.remove(ls),t.blur(),this._deactivate(K.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),j.trigger(t,Ui,{relatedTarget:e})):t.classList.remove(hs)}),t,t.classList.contains(cs)))}_keydown(t){if(![is,ss,ns,os,rs,as].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!d(t)));let i;if([rs,as].includes(t.key))i=e[t.key===rs?0:e.length-1];else{const s=[ss,os].includes(t.key);i=w(e,t.target,s,!0)}i&&(i.focus({preventScroll:!0}),ms.getOrCreateInstance(i).show())}_getChildren(){return K.find(gs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=K.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const s=(t,s)=>{const n=K.findOne(t,i);n&&n.classList.toggle(s,e)};s(ds,ls),s(".dropdown-menu",hs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(ls)}_getInnerElement(t){return t.matches(gs)?t:K.findOne(gs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=ms.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,Zi,_s,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this)||ms.getOrCreateInstance(this).show()})),j.on(window,es,(()=>{for(const t of K.find(fs))ms.getOrCreateInstance(t)})),b(ms);const ps=".bs.toast",bs=`mouseover${ps}`,vs=`mouseout${ps}`,ys=`focusin${ps}`,ws=`focusout${ps}`,As=`hide${ps}`,Es=`hidden${ps}`,Cs=`show${ps}`,Ts=`shown${ps}`,ks="hide",$s="show",Ss="showing",Ls={animation:"boolean",autohide:"boolean",delay:"number"},Os={animation:!0,autohide:!0,delay:5e3};class Is extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Os}static get DefaultType(){return Ls}static get NAME(){return"toast"}show(){j.trigger(this._element,Cs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(ks),g(this._element),this._element.classList.add($s,Ss),this._queueCallback((()=>{this._element.classList.remove(Ss),j.trigger(this._element,Ts),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(j.trigger(this._element,As).defaultPrevented||(this._element.classList.add(Ss),this._queueCallback((()=>{this._element.classList.add(ks),this._element.classList.remove(Ss,$s),j.trigger(this._element,Es)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove($s),super.dispose()}isShown(){return this._element.classList.contains($s)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,bs,(t=>this._onInteraction(t,!0))),j.on(this._element,vs,(t=>this._onInteraction(t,!1))),j.on(this._element,ys,(t=>this._onInteraction(t,!0))),j.on(this._element,ws,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Is.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return V(Is),b(Is),{Alert:U,Button:J,Carousel:Ot,Collapse:Rt,Dropdown:fe,Modal:Ue,Offcanvas:gi,Popover:Mi,ScrollSpy:Qi,Tab:ms,Toast:Is,Tooltip:Ni}})); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map b/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map new file mode 100644 index 00000000..4d437152 --- /dev/null +++ b/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","boundary","display","offset","popperConfig","reference","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","destroy","update","Popper","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","scroll","Offcanvas","blur","completeCallback","position","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","allowList","content","extraClass","html","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","fallbackPlacements","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"mappings":"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"} \ No newline at end of file diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index 865807a1..d94afad7 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -25,7 +25,6 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { let app = &global::SETTINGS.app.name; Page::new(request) - .with_theme("Basic") .with_title(L10n::l("welcome_title")) .add_component( Intro::new() diff --git a/tools/changelog.sh b/tools/changelog.sh index 253f22bc..bd5f20bb 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -50,15 +50,23 @@ case "$CRATE" in pagetop) CHANGELOG_FILE="CHANGELOG.md" PATH_FLAGS=( + # Helpers --exclude-path "helpers/pagetop-statics/**/*" --exclude-path "helpers/pagetop-build/**/*" --exclude-path "helpers/pagetop-macros/**/*" + # Extensions + --exclude-path "extensions/pagetop-aliner/**/*" + --exclude-path "extensions/pagetop-bootsier/**/*" ) ;; pagetop-aliner) CHANGELOG_FILE="extensions/pagetop-aliner/CHANGELOG.md" PATH_FLAGS=(--include-path "extensions/pagetop-aliner/**/*") ;; + pagetop-bootsier) + CHANGELOG_FILE="extensions/pagetop-bootsier/CHANGELOG.md" + PATH_FLAGS=(--include-path "extensions/pagetop-bootsier/**/*") + ;; *) echo "Error: unsupported crate '$CRATE'" >&2 exit 1 From 345bac9d2548168539933c93b6418399f084f21e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 12:29:16 +0200 Subject: [PATCH 816/853] =?UTF-8?q?=F0=9F=93=9D=20Repasa=20doc=20y=20cambi?= =?UTF-8?q?a=20caracteres=20Unicode=20ambiguos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ src/core.rs | 2 +- src/core/theme/definition.rs | 4 ++-- src/html/assets/javascript.rs | 12 ++++++------ src/html/assets/stylesheet.rs | 4 ++-- src/service.rs | 8 ++++---- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0e635189..2a05be13 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,10 @@ El código se organiza en un *workspace* donde actualmente se incluyen los sigui * **[pagetop-aliner](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-aliner)**, es un tema para demos y pruebas que muestra esquemáticamente la composición de las páginas HTML. + * **[pagetop-bootsier](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-bootsier)**, + tema basado en [Bootstrap](https://getbootstrap.com) para ofrecer su catálogo de estilos y + componentes flexibles. + # 🧪 Pruebas diff --git a/src/core.rs b/src/core.rs index 9ecbd2e9..ab4d693b 100644 --- a/src/core.rs +++ b/src/core.rs @@ -7,7 +7,7 @@ use std::any::Any; pub enum TypeInfo { /// Ruta completa tal y como la devuelve [`core::any::type_name`]. FullName, - /// Último segmento de la ruta – por ejemplo `Vec<i32>` en lugar de `alloc::vec::Vec<i32>`. + /// Último segmento de la ruta, por ejemplo `Vec<i32>` en lugar de `alloc::vec::Vec<i32>`. ShortName, /// Conserva todo **desde** `start` inclusive hasta el final. NameFrom(isize), diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 1eb7b226..2a20c078 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -283,14 +283,14 @@ pub trait Theme: Extension + ThemePage + Send + Sync { <Self as ThemePage>::render_head(self, page) } - /// Contenido predeterminado para la página de error "*403 – Forbidden*". + /// Contenido predeterminado para la página de error "*403 - Forbidden*". /// /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. fn error403(&self, page: &mut Page) -> Markup { html! { div { h1 { (L10n::l("error403_notice").using(page)) } } } } - /// Contenido predeterminado para la página de error "*404 – Not Found*". + /// Contenido predeterminado para la página de error "*404 - Not Found*". /// /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. fn error404(&self, page: &mut Page) -> Markup { diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index 6dc9b852..0e86f0d4 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -8,16 +8,16 @@ use crate::{join, join_pair, AutoDefault, Weight}; // Los distintos modos de carga permiten optimizar el rendimiento y controlar el comportamiento del // script en relación con el análisis del documento HTML y la ejecución del resto de scripts. // -// - [`From`] – Carga estándar con la etiqueta `<script src="...">`. -// - [`Defer`] – Igual que [`From`], pero con el atributo `defer`, descarga en paralelo y se +// - [`From`] - Carga estándar con la etiqueta `<script src="...">`. +// - [`Defer`] - Igual que [`From`], pero con el atributo `defer`, descarga en paralelo y se // ejecuta tras el análisis del documento HTML, respetando el orden de // aparición. -// - [`Async`] – Igual que [`From`], pero con el atributo `async`, descarga en paralelo y se +// - [`Async`] - Igual que [`From`], pero con el atributo `async`, descarga en paralelo y se // ejecuta en cuanto esté listo, **sin garantizar** el orden relativo respecto a // otros scripts. -// - [`Inline`] – Inserta el código directamente en la etiqueta `<script>`. -// - [`OnLoad`] – Inserta el código JavaScript y lo ejecuta tras el evento `DOMContentLoaded`. -// - [`OnLoadAsync`] – Igual que [`OnLoad`], pero con manejador asíncrono (`async`), útil si dentro +// - [`Inline`] - Inserta el código directamente en la etiqueta `<script>`. +// - [`OnLoad`] - Inserta el código JavaScript y lo ejecuta tras el evento `DOMContentLoaded`. +// - [`OnLoadAsync`] - Igual que [`OnLoad`], pero con manejador asíncrono (`async`), útil si dentro // del código JavaScript se utiliza `await`. #[derive(AutoDefault)] enum Source { diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 8d1bf29f..5f0eaaa0 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -8,9 +8,9 @@ use crate::{join_pair, AutoDefault, Weight}; // Los estilos pueden cargarse desde un archivo externo o estar embebidos directamente en una // etiqueta `<style>`. // -// - [`From`] – Carga la hoja de estilos desde un archivo externo, insertándola mediante una +// - [`From`] - Carga la hoja de estilos desde un archivo externo, insertándola mediante una // etiqueta `<link>` con `rel="stylesheet"`. -// - [`Inline`] – Inserta directamente el contenido CSS dentro de una etiqueta `<style>`. +// - [`Inline`] - Inserta directamente el contenido CSS dentro de una etiqueta `<style>`. #[derive(AutoDefault)] enum Source { #[default] diff --git a/src/service.rs b/src/service.rs index 9a936fc3..1b2f766c 100644 --- a/src/service.rs +++ b/src/service.rs @@ -93,11 +93,11 @@ macro_rules! include_files_service { /// /// # Argumentos /// -/// * `$scfg` – Instancia de [`ServiceConfig`](crate::service::web::ServiceConfig) donde aplicar la +/// * `$scfg` - Instancia de [`ServiceConfig`](crate::service::web::ServiceConfig) donde aplicar la /// configuración. -/// * `$path` – Ruta al directorio local con los archivos estáticos. -/// * `$bundle` – Nombre del conjunto de recursos que esta macro integra en el binario. -/// * `$route` – Ruta URL base desde la que se servirán los archivos. +/// * `$path` - Ruta al directorio local con los archivos estáticos. +/// * `$bundle` - Nombre del conjunto de recursos que esta macro integra en el binario. +/// * `$route` - Ruta URL base desde la que se servirán los archivos. /// /// # Ejemplos /// From 6052b87c9c50378cf2f324e66b038411d2779364 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 13:08:33 +0200 Subject: [PATCH 817/853] =?UTF-8?q?=F0=9F=93=84=20Actualiza=20licencias=20?= =?UTF-8?q?y=20revisa=20*badges*=20de=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- extensions/pagetop-aliner/LICENSE-APACHE | 201 +++++++++++++++++++++ extensions/pagetop-aliner/LICENSE-MIT | 21 +++ extensions/pagetop-aliner/README.md | 2 +- extensions/pagetop-aliner/src/lib.rs | 2 +- extensions/pagetop-bootsier/LICENSE-APACHE | 201 +++++++++++++++++++++ extensions/pagetop-bootsier/LICENSE-MIT | 21 +++ extensions/pagetop-bootsier/README.md | 2 +- extensions/pagetop-bootsier/src/lib.rs | 2 +- helpers/pagetop-build/README.md | 2 +- helpers/pagetop-build/src/lib.rs | 2 +- helpers/pagetop-macros/README.md | 2 +- helpers/pagetop-macros/src/lib.rs | 2 +- helpers/pagetop-statics/README.md | 5 +- helpers/pagetop-statics/src/lib.rs | 5 +- src/lib.rs | 2 +- 16 files changed, 462 insertions(+), 12 deletions(-) create mode 100644 extensions/pagetop-aliner/LICENSE-APACHE create mode 100644 extensions/pagetop-aliner/LICENSE-MIT create mode 100644 extensions/pagetop-bootsier/LICENSE-APACHE create mode 100644 extensions/pagetop-bootsier/LICENSE-MIT diff --git a/README.md b/README.md index 2a05be13..d9eeb402 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@ <p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) <br> </div> diff --git a/extensions/pagetop-aliner/LICENSE-APACHE b/extensions/pagetop-aliner/LICENSE-APACHE new file mode 100644 index 00000000..263ddac1 --- /dev/null +++ b/extensions/pagetop-aliner/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/extensions/pagetop-aliner/LICENSE-MIT b/extensions/pagetop-aliner/LICENSE-MIT new file mode 100644 index 00000000..cd8af3d6 --- /dev/null +++ b/extensions/pagetop-aliner/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Manuel Cillero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/extensions/pagetop-aliner/README.md b/extensions/pagetop-aliner/README.md index ac6da910..798c6596 100644 --- a/extensions/pagetop-aliner/README.md +++ b/extensions/pagetop-aliner/README.md @@ -4,10 +4,10 @@ <p>Tema de <strong>PageTop</strong> que muestra esquemáticamente la composición de las páginas HTML.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner) [![Crates.io](https://img.shields.io/crates/v/pagetop-aliner.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-aliner) [![Descargas](https://img.shields.io/crates/d/pagetop-aliner.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-aliner) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) <br> </div> diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index 92f9aa41..54898b5d 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -5,10 +5,10 @@ <p>Tema para <strong>PageTop</strong> que muestra esquemáticamente la composición de las páginas HTML.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner) [![Crates.io](https://img.shields.io/crates/v/pagetop-aliner.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-aliner) [![Descargas](https://img.shields.io/crates/d/pagetop-aliner.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-aliner) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) <br> </div> diff --git a/extensions/pagetop-bootsier/LICENSE-APACHE b/extensions/pagetop-bootsier/LICENSE-APACHE new file mode 100644 index 00000000..263ddac1 --- /dev/null +++ b/extensions/pagetop-bootsier/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 Manuel Cillero + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/extensions/pagetop-bootsier/LICENSE-MIT b/extensions/pagetop-bootsier/LICENSE-MIT new file mode 100644 index 00000000..cd8af3d6 --- /dev/null +++ b/extensions/pagetop-bootsier/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Manuel Cillero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/extensions/pagetop-bootsier/README.md b/extensions/pagetop-bootsier/README.md index 87bd3c7b..120b3680 100644 --- a/extensions/pagetop-bootsier/README.md +++ b/extensions/pagetop-bootsier/README.md @@ -4,10 +4,10 @@ <p>Tema de <strong>PageTop</strong> basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) [![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) [![Descargas](https://img.shields.io/crates/d/pagetop-bootsier.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-bootsier) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) <br> </div> diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index 8157ec2d..fbb97c63 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -5,10 +5,10 @@ <p>Tema de <strong>PageTop</strong> basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) [![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) [![Descargas](https://img.shields.io/crates/d/pagetop-bootsier.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-bootsier) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) <br> </div> diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md index 57273e83..948429cc 100644 --- a/helpers/pagetop-build/README.md +++ b/helpers/pagetop-build/README.md @@ -4,10 +4,10 @@ <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) </div> diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index c6e72367..30fcfe32 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -5,10 +5,10 @@ <p>Prepara un conjunto de archivos estáticos o archivos SCSS compilados para ser incluidos en el binario de un proyecto <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) </div> diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index 7c9c2e86..fc2f976c 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -4,10 +4,10 @@ <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) </div> diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 709ce572..61780cce 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -5,10 +5,10 @@ <p>Una colección de macros que mejoran la experiencia de desarrollo con <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) </div> diff --git a/helpers/pagetop-statics/README.md b/helpers/pagetop-statics/README.md index 4168cd4a..ba7ae266 100644 --- a/helpers/pagetop-statics/README.md +++ b/helpers/pagetop-statics/README.md @@ -4,7 +4,10 @@ <p>Librería para automatizar la recopilación de recursos estáticos en <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-statics?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-statics) +[![Crates.io](https://img.shields.io/crates/v/pagetop-statics.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-statics) +[![Descargas](https://img.shields.io/crates/d/pagetop-statics.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-statics) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) </div> diff --git a/helpers/pagetop-statics/src/lib.rs b/helpers/pagetop-statics/src/lib.rs index 201d90ef..05570933 100644 --- a/helpers/pagetop-statics/src/lib.rs +++ b/helpers/pagetop-statics/src/lib.rs @@ -5,7 +5,10 @@ <p>Librería para automatizar la recopilación de recursos estáticos en <strong>PageTop</strong>.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) +[![Doc API](https://img.shields.io/docsrs/pagetop-statics?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-statics) +[![Crates.io](https://img.shields.io/crates/v/pagetop-statics.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-statics) +[![Descargas](https://img.shields.io/crates/d/pagetop-statics.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-statics) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) </div> diff --git a/src/lib.rs b/src/lib.rs index 6f5c5cfb..daef77a8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,10 +7,10 @@ <p>Un entorno para el desarrollo de soluciones web modulares, extensibles y configurables.</p> -[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](#-licencia) [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) + ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) <br> </div> From f68f33a7a2fca80975b9bb922f0bb0535dfe3ee6 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 13:27:05 +0200 Subject: [PATCH 818/853] =?UTF-8?q?=F0=9F=93=9D=20depura=20enlaces=20de=20?= =?UTF-8?q?informaci=C3=B3n=20de=20licencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- extensions/pagetop-aliner/README.md | 2 +- extensions/pagetop-aliner/src/lib.rs | 2 +- extensions/pagetop-bootsier/README.md | 2 +- extensions/pagetop-bootsier/src/lib.rs | 2 +- helpers/pagetop-build/README.md | 2 +- helpers/pagetop-build/src/lib.rs | 2 +- helpers/pagetop-macros/README.md | 2 +- helpers/pagetop-macros/src/lib.rs | 2 +- helpers/pagetop-statics/README.md | 2 +- helpers/pagetop-statics/src/lib.rs | 2 +- src/lib.rs | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index d9eeb402..be720910 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop#licencia) <br> </div> diff --git a/extensions/pagetop-aliner/README.md b/extensions/pagetop-aliner/README.md index 798c6596..0560a067 100644 --- a/extensions/pagetop-aliner/README.md +++ b/extensions/pagetop-aliner/README.md @@ -7,7 +7,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner) [![Crates.io](https://img.shields.io/crates/v/pagetop-aliner.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-aliner) [![Descargas](https://img.shields.io/crates/d/pagetop-aliner.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-aliner) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-aliner#licencia) <br> </div> diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index 54898b5d..b51800c2 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -8,7 +8,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-aliner?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-aliner) [![Crates.io](https://img.shields.io/crates/v/pagetop-aliner.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-aliner) [![Descargas](https://img.shields.io/crates/d/pagetop-aliner.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-aliner) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-aliner#licencia) <br> </div> diff --git a/extensions/pagetop-bootsier/README.md b/extensions/pagetop-bootsier/README.md index 120b3680..1a33b4ea 100644 --- a/extensions/pagetop-bootsier/README.md +++ b/extensions/pagetop-bootsier/README.md @@ -7,7 +7,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) [![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) [![Descargas](https://img.shields.io/crates/d/pagetop-bootsier.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-bootsier) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-bootsier#licencia) <br> </div> diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index fbb97c63..c413e8e5 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -8,7 +8,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) [![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) [![Descargas](https://img.shields.io/crates/d/pagetop-bootsier.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-bootsier) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-bootsier#licencia) <br> </div> diff --git a/helpers/pagetop-build/README.md b/helpers/pagetop-build/README.md index 948429cc..875acbd9 100644 --- a/helpers/pagetop-build/README.md +++ b/helpers/pagetop-build/README.md @@ -7,7 +7,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-build#licencia) </div> diff --git a/helpers/pagetop-build/src/lib.rs b/helpers/pagetop-build/src/lib.rs index 30fcfe32..9088ec99 100644 --- a/helpers/pagetop-build/src/lib.rs +++ b/helpers/pagetop-build/src/lib.rs @@ -8,7 +8,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-build?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-build) [![Crates.io](https://img.shields.io/crates/v/pagetop-build.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-build) [![Descargas](https://img.shields.io/crates/d/pagetop-build.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-build) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-build#licencia) </div> diff --git a/helpers/pagetop-macros/README.md b/helpers/pagetop-macros/README.md index fc2f976c..66fdc1fa 100644 --- a/helpers/pagetop-macros/README.md +++ b/helpers/pagetop-macros/README.md @@ -7,7 +7,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-macros#licencia) </div> diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 61780cce..2781aef8 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -8,7 +8,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-macros?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-macros) [![Crates.io](https://img.shields.io/crates/v/pagetop-macros.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-macros) [![Descargas](https://img.shields.io/crates/d/pagetop-macros.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-macros) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-macros#licencia) </div> diff --git a/helpers/pagetop-statics/README.md b/helpers/pagetop-statics/README.md index ba7ae266..cd1da6ac 100644 --- a/helpers/pagetop-statics/README.md +++ b/helpers/pagetop-statics/README.md @@ -7,7 +7,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-statics?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-statics) [![Crates.io](https://img.shields.io/crates/v/pagetop-statics.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-statics) [![Descargas](https://img.shields.io/crates/d/pagetop-statics.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-statics) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-statics#licencia) </div> diff --git a/helpers/pagetop-statics/src/lib.rs b/helpers/pagetop-statics/src/lib.rs index 05570933..6f04bd2a 100644 --- a/helpers/pagetop-statics/src/lib.rs +++ b/helpers/pagetop-statics/src/lib.rs @@ -8,7 +8,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop-statics?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-statics) [![Crates.io](https://img.shields.io/crates/v/pagetop-statics.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-statics) [![Descargas](https://img.shields.io/crates/d/pagetop-statics.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop-statics) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/helpers/pagetop-statics#licencia) </div> diff --git a/src/lib.rs b/src/lib.rs index daef77a8..de6d9e68 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,7 +10,7 @@ [![Doc API](https://img.shields.io/docsrs/pagetop?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop) [![Crates.io](https://img.shields.io/crates/v/pagetop.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop) [![Descargas](https://img.shields.io/crates/d/pagetop.svg?label=Descargas&style=for-the-badge&logo=transmission)](https://crates.io/crates/pagetop) - ![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge) +[![Licencia](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?label=Licencia&style=for-the-badge)](https://git.cillero.es/manuelcillero/pagetop#licencia) <br> </div> From e4cd1e56e09b825a22bc9509ab6f9f32b31a5743 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 20:04:35 +0200 Subject: [PATCH 819/853] =?UTF-8?q?=F0=9F=8D=B1=20(bootsier):=20Actualiza?= =?UTF-8?q?=20bootstrap=20v5.3.3=20a=20v5.3.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/build.rs | 9 +- extensions/pagetop-bootsier/src/lib.rs | 2 +- .../bootstrap-5.3.3/mixins/_box-shadow.scss | 18 -- .../_accordion.scss | 13 +- .../_alert.scss | 0 .../_badge.scss | 0 .../_breadcrumb.scss | 0 .../_button-group.scss | 11 +- .../_buttons.scss | 0 .../{bootstrap-5.3.3 => bootstrap}/_card.scss | 19 +- .../_carousel.scss | 40 ++-- .../_close.scss | 15 +- .../_containers.scss | 0 .../_dropdown.scss | 0 .../_forms.scss | 0 .../_functions.scss | 4 +- .../{bootstrap-5.3.3 => bootstrap}/_grid.scss | 0 .../_helpers.scss | 0 .../_images.scss | 0 .../_list-group.scss | 52 ++--- .../{bootstrap-5.3.3 => bootstrap}/_maps.scss | 0 .../_mixins.scss | 0 .../_modal.scss | 8 +- .../{bootstrap-5.3.3 => bootstrap}/_nav.scss | 2 +- .../_navbar.scss | 2 +- .../_offcanvas.scss | 6 +- .../_pagination.scss | 2 +- .../_placeholders.scss | 0 .../_popover.scss | 0 .../_progress.scss | 2 +- .../_reboot.scss | 8 +- .../{bootstrap-5.3.3 => bootstrap}/_root.scss | 0 .../_spinners.scss | 1 + .../_tables.scss | 0 .../_toasts.scss | 0 .../_tooltip.scss | 0 .../_transitions.scss | 0 .../{bootstrap-5.3.3 => bootstrap}/_type.scss | 2 +- .../_utilities.scss | 0 .../_variables-dark.scss | 19 +- .../_variables.scss | 30 +-- .../bootstrap-grid.scss | 0 .../bootstrap-reboot.scss | 0 .../bootstrap-utilities.scss | 0 .../bootstrap.scss | 0 .../forms/_floating-labels.scss | 34 ++-- .../forms/_form-check.scss | 0 .../forms/_form-control.scss | 0 .../forms/_form-range.scss | 0 .../forms/_form-select.scss | 0 .../forms/_form-text.scss | 0 .../forms/_input-group.scss | 2 +- .../forms/_labels.scss | 0 .../forms/_validation.scss | 0 .../helpers/_clearfix.scss | 0 .../helpers/_color-bg.scss | 0 .../helpers/_colored-links.scss | 0 .../helpers/_focus-ring.scss | 0 .../helpers/_icon-link.scss | 0 .../helpers/_position.scss | 0 .../helpers/_ratio.scss | 0 .../helpers/_stacks.scss | 0 .../helpers/_stretched-link.scss | 0 .../helpers/_text-truncation.scss | 0 .../helpers/_visually-hidden.scss | 0 .../helpers/_vr.scss | 0 .../mixins/_alert.scss | 0 .../mixins/_backdrop.scss | 0 .../mixins/_banner.scss | 4 +- .../mixins/_border-radius.scss | 0 .../static/bootstrap/mixins/_box-shadow.scss | 24 +++ .../mixins/_breakpoints.scss | 0 .../mixins/_buttons.scss | 0 .../mixins/_caret.scss | 0 .../mixins/_clearfix.scss | 0 .../mixins/_color-mode.scss | 0 .../mixins/_color-scheme.scss | 0 .../mixins/_container.scss | 0 .../mixins/_deprecate.scss | 0 .../mixins/_forms.scss | 0 .../mixins/_gradients.scss | 0 .../mixins/_grid.scss | 2 +- .../mixins/_image.scss | 0 .../mixins/_list-group.scss | 0 .../mixins/_lists.scss | 0 .../mixins/_pagination.scss | 0 .../mixins/_reset-text.scss | 0 .../mixins/_resize.scss | 0 .../mixins/_table-variants.scss | 0 .../mixins/_text-truncate.scss | 0 .../mixins/_transition.scss | 0 .../mixins/_utilities.scss | 0 .../mixins/_visually-hidden.scss | 7 +- .../tests/jasmine.js | 0 .../_auto-import-of-variables-dark.test.scss | 0 .../tests/mixins/_box-shadow.test.scss | 188 ++++++++++++++++++ .../tests/mixins/_color-contrast.test.scss | 139 +++++++++++++ .../tests/mixins/_color-modes.test.scss | 0 .../_media-query-color-mode-full.test.scss | 0 .../tests/mixins/_utilities.test.scss | 0 .../tests/sass-true/register.js | 0 .../tests/sass-true/runner.js | 0 .../tests/utilities/_api.test.scss | 0 .../utilities/_api.scss | 0 .../vendor/_rfs.scss | 0 .../pagetop-bootsier/static/js/bootstrap.js | 34 ++-- .../static/js/bootstrap.js.map | 2 +- .../static/js/bootstrap.min.js | 6 +- .../static/js/bootstrap.min.js.map | 2 +- 109 files changed, 536 insertions(+), 173 deletions(-) delete mode 100644 extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_accordion.scss (97%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_alert.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_badge.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_breadcrumb.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_button-group.scss (87%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_buttons.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_card.scss (95%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_carousel.scss (87%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_close.scss (87%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_containers.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_dropdown.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_forms.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_functions.scss (99%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_grid.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_helpers.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_images.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_list-group.scss (93%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_maps.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_mixins.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_modal.scss (96%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_nav.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_navbar.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_offcanvas.scss (93%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_pagination.scss (98%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_placeholders.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_popover.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_progress.scss (96%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_reboot.scss (98%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_root.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_spinners.scss (99%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_tables.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_toasts.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_tooltip.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_transitions.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_type.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_utilities.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_variables-dark.scss (90%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/_variables.scss (98%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/bootstrap-grid.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/bootstrap-reboot.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/bootstrap-utilities.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/bootstrap.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_floating-labels.scss (78%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_form-check.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_form-control.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_form-range.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_form-select.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_form-text.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_input-group.scss (98%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_labels.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/forms/_validation.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_clearfix.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_color-bg.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_colored-links.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_focus-ring.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_icon-link.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_position.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_ratio.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_stacks.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_stretched-link.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_text-truncation.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_visually-hidden.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/helpers/_vr.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_alert.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_backdrop.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_banner.scss (52%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_border-radius.scss (100%) create mode 100644 extensions/pagetop-bootsier/static/bootstrap/mixins/_box-shadow.scss rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_breakpoints.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_buttons.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_caret.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_clearfix.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_color-mode.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_color-scheme.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_container.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_deprecate.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_forms.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_gradients.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_grid.scss (98%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_image.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_list-group.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_lists.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_pagination.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_reset-text.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_resize.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_table-variants.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_text-truncate.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_transition.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_utilities.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/mixins/_visually-hidden.scss (87%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/jasmine.js (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/mixins/_auto-import-of-variables-dark.test.scss (100%) create mode 100644 extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_box-shadow.test.scss create mode 100644 extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-contrast.test.scss rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/mixins/_color-modes.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/mixins/_media-query-color-mode-full.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/mixins/_utilities.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/sass-true/register.js (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/sass-true/runner.js (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/tests/utilities/_api.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/utilities/_api.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap-5.3.3 => bootstrap}/vendor/_rfs.scss (100%) diff --git a/extensions/pagetop-bootsier/build.rs b/extensions/pagetop-bootsier/build.rs index 47cb4740..f2d0f794 100644 --- a/extensions/pagetop-bootsier/build.rs +++ b/extensions/pagetop-bootsier/build.rs @@ -4,12 +4,9 @@ use std::env; use std::path::Path; fn main() -> std::io::Result<()> { - StaticFilesBundle::from_scss( - "./static/bootstrap-5.3.3/bootstrap.scss", - "bootstrap.min.css", - ) - .with_name("bootsier") - .build()?; + StaticFilesBundle::from_scss("./static/bootstrap/bootstrap.scss", "bootstrap.min.css") + .with_name("bootsier") + .build()?; StaticFilesBundle::from_dir("./static/js", Some(bootstrap_js_files)) .with_name("bootsier_js") .build() diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index c413e8e5..fecf1273 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -86,7 +86,7 @@ use pagetop::prelude::*; pub type BootsierRegion = ThemeRegion; // Versión de la librería Bootstrap. -const BOOTSTRAP_VERSION: &str = "5.3.3"; +const BOOTSTRAP_VERSION: &str = "5.3.8"; /// Tema basado en [Bootstrap](https://getbootstrap.com/) para los componentes base de PageTop. /// diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss b/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss deleted file mode 100644 index 4172541f..00000000 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_box-shadow.scss +++ /dev/null @@ -1,18 +0,0 @@ -@mixin box-shadow($shadow...) { - @if $enable-shadows { - $result: (); - - @each $value in $shadow { - @if $value != null { - $result: append($result, $value, "comma"); - } - @if $value == none and length($shadow) > 1 { - @warn "The keyword 'none' must be used as a single argument."; - } - } - - @if (length($result) > 0) { - box-shadow: $result; - } - } -} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_accordion.scss b/extensions/pagetop-bootsier/static/bootstrap/_accordion.scss similarity index 97% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_accordion.scss rename to extensions/pagetop-bootsier/static/bootstrap/_accordion.scss index 17e5436e..e9f267fb 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_accordion.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_accordion.scss @@ -134,17 +134,12 @@ &:last-child { border-bottom: 0; } // stylelint-disable selector-max-class - > .accordion-header .accordion-button { - &, - &.collapsed { - @include border-radius(0); - } - } - // stylelint-enable selector-max-class - - > .accordion-collapse { + > .accordion-collapse, + > .accordion-header .accordion-button, + > .accordion-header .accordion-button.collapsed { @include border-radius(0); } + // stylelint-enable selector-max-class } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_alert.scss b/extensions/pagetop-bootsier/static/bootstrap/_alert.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_alert.scss rename to extensions/pagetop-bootsier/static/bootstrap/_alert.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_badge.scss b/extensions/pagetop-bootsier/static/bootstrap/_badge.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_badge.scss rename to extensions/pagetop-bootsier/static/bootstrap/_badge.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_breadcrumb.scss b/extensions/pagetop-bootsier/static/bootstrap/_breadcrumb.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_breadcrumb.scss rename to extensions/pagetop-bootsier/static/bootstrap/_breadcrumb.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_button-group.scss b/extensions/pagetop-bootsier/static/bootstrap/_button-group.scss similarity index 87% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_button-group.scss rename to extensions/pagetop-bootsier/static/bootstrap/_button-group.scss index 55ae3f65..78e12522 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_button-group.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_button-group.scss @@ -39,7 +39,7 @@ // Prevent double borders when buttons are next to each other > :not(.btn-check:first-child) + .btn, > .btn-group:not(:first-child) { - margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list } // Reset rounded corners @@ -126,7 +126,7 @@ > .btn:not(:first-child), > .btn-group:not(:first-child) { - margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list } // Reset rounded corners @@ -135,7 +135,12 @@ @include border-bottom-radius(0); } - > .btn ~ .btn, + // The top radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, > .btn-group:not(:first-child) > .btn { @include border-top-radius(0); } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_buttons.scss b/extensions/pagetop-bootsier/static/bootstrap/_buttons.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_buttons.scss rename to extensions/pagetop-bootsier/static/bootstrap/_buttons.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_card.scss b/extensions/pagetop-bootsier/static/bootstrap/_card.scss similarity index 95% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_card.scss rename to extensions/pagetop-bootsier/static/bootstrap/_card.scss index d3535a98..dcebe6ac 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_card.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_card.scss @@ -193,8 +193,7 @@ // The child selector allows nested `.card` within `.card-group` // to display properly. > .card { - // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 - flex: 1 0 0%; + flex: 1 0 0; margin-bottom: 0; + .card { @@ -207,13 +206,13 @@ &:not(:last-child) { @include border-end-radius(0); - .card-img-top, - .card-header { + > .card-img-top, + > .card-header { // stylelint-disable-next-line property-disallowed-list border-top-right-radius: 0; } - .card-img-bottom, - .card-footer { + > .card-img-bottom, + > .card-footer { // stylelint-disable-next-line property-disallowed-list border-bottom-right-radius: 0; } @@ -222,13 +221,13 @@ &:not(:first-child) { @include border-start-radius(0); - .card-img-top, - .card-header { + > .card-img-top, + > .card-header { // stylelint-disable-next-line property-disallowed-list border-top-left-radius: 0; } - .card-img-bottom, - .card-footer { + > .card-img-bottom, + > .card-footer { // stylelint-disable-next-line property-disallowed-list border-bottom-left-radius: 0; } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_carousel.scss b/extensions/pagetop-bootsier/static/bootstrap/_carousel.scss similarity index 87% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_carousel.scss rename to extensions/pagetop-bootsier/static/bootstrap/_carousel.scss index 3a135220..5ebf6b15 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_carousel.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_carousel.scss @@ -99,6 +99,7 @@ color: $carousel-control-color; text-align: center; background: none; + filter: var(--#{$prefix}carousel-control-icon-filter); border: 0; opacity: $carousel-control-opacity; @include transition($carousel-control-transition); @@ -168,7 +169,7 @@ margin-left: $carousel-indicator-spacer; text-indent: -999px; cursor: pointer; - background-color: $carousel-indicator-active-bg; + background-color: var(--#{$prefix}carousel-indicator-active-bg); background-clip: padding-box; border: 0; // Use transparent borders to increase the hit area by 10px on top and bottom. @@ -195,42 +196,31 @@ left: (100% - $carousel-caption-width) * .5; padding-top: $carousel-caption-padding-y; padding-bottom: $carousel-caption-padding-y; - color: $carousel-caption-color; + color: var(--#{$prefix}carousel-caption-color); text-align: center; } // Dark mode carousel @mixin carousel-dark() { - .carousel-control-prev-icon, - .carousel-control-next-icon { - filter: $carousel-dark-control-icon-filter; - } - - .carousel-indicators [data-bs-target] { - background-color: $carousel-dark-indicator-active-bg; - } - - .carousel-caption { - color: $carousel-dark-caption-color; - } + --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark}; + --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark}; + --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark}; } .carousel-dark { @include carousel-dark(); } +:root, +[data-bs-theme="light"] { + --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg}; + --#{$prefix}carousel-caption-color: #{$carousel-caption-color}; + --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter}; +} + @if $enable-dark-mode { - @include color-mode(dark) { - @if $color-mode-type == "media-query" { - .carousel { - @include carousel-dark(); - } - } @else { - .carousel, - &.carousel { - @include carousel-dark(); - } - } + @include color-mode(dark, true) { + @include carousel-dark(); } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_close.scss b/extensions/pagetop-bootsier/static/bootstrap/_close.scss similarity index 87% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_close.scss rename to extensions/pagetop-bootsier/static/bootstrap/_close.scss index 4d6e73c1..d53c96fb 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_close.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_close.scss @@ -12,7 +12,6 @@ --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; - --#{$prefix}btn-close-white-filter: #{$btn-close-white-filter}; // scss-docs-end close-css-vars box-sizing: content-box; @@ -21,6 +20,7 @@ padding: $btn-close-padding-y $btn-close-padding-x; color: var(--#{$prefix}btn-close-color); background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements + filter: var(--#{$prefix}btn-close-filter); border: 0; // for button elements @include border-radius(); opacity: var(--#{$prefix}btn-close-opacity); @@ -47,17 +47,20 @@ } @mixin btn-close-white() { - filter: var(--#{$prefix}btn-close-white-filter); + --#{$prefix}btn-close-filter: #{$btn-close-filter-dark}; } .btn-close-white { @include btn-close-white(); } +:root, +[data-bs-theme="light"] { + --#{$prefix}btn-close-filter: #{$btn-close-filter}; +} + @if $enable-dark-mode { - @include color-mode(dark) { - .btn-close { - @include btn-close-white(); - } + @include color-mode(dark, true) { + @include btn-close-white(); } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_containers.scss b/extensions/pagetop-bootsier/static/bootstrap/_containers.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_containers.scss rename to extensions/pagetop-bootsier/static/bootstrap/_containers.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_dropdown.scss b/extensions/pagetop-bootsier/static/bootstrap/_dropdown.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_dropdown.scss rename to extensions/pagetop-bootsier/static/bootstrap/_dropdown.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_forms.scss b/extensions/pagetop-bootsier/static/bootstrap/_forms.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_forms.scss rename to extensions/pagetop-bootsier/static/bootstrap/_forms.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_functions.scss b/extensions/pagetop-bootsier/static/bootstrap/_functions.scss similarity index 99% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_functions.scss rename to extensions/pagetop-bootsier/static/bootstrap/_functions.scss index 90296586..59d431a1 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_functions.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_functions.scss @@ -157,7 +157,7 @@ $_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 @each $color in $foregrounds { $contrast-ratio: contrast-ratio($background, $color); - @if $contrast-ratio > $min-contrast-ratio { + @if $contrast-ratio >= $min-contrast-ratio { @return $color; } @else if $contrast-ratio > $max-ratio { $max-ratio: $contrast-ratio; @@ -177,7 +177,7 @@ $_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05)); } -// Return WCAG2.1 relative luminance +// Return WCAG2.2 relative luminance // See https://www.w3.org/TR/WCAG/#dfn-relative-luminance // See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio @function luminance($color) { diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_grid.scss b/extensions/pagetop-bootsier/static/bootstrap/_grid.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_grid.scss rename to extensions/pagetop-bootsier/static/bootstrap/_grid.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_helpers.scss b/extensions/pagetop-bootsier/static/bootstrap/_helpers.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_helpers.scss rename to extensions/pagetop-bootsier/static/bootstrap/_helpers.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_images.scss b/extensions/pagetop-bootsier/static/bootstrap/_images.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_images.scss rename to extensions/pagetop-bootsier/static/bootstrap/_images.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_list-group.scss b/extensions/pagetop-bootsier/static/bootstrap/_list-group.scss similarity index 93% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_list-group.scss rename to extensions/pagetop-bootsier/static/bootstrap/_list-group.scss index 455531ee..3bdff679 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_list-group.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_list-group.scss @@ -43,31 +43,6 @@ } } -// Interactive list items -// -// Use anchor or button elements instead of `li`s or `div`s to create interactive -// list items. Includes an extra `.active` modifier class for selected items. - -.list-group-item-action { - width: 100%; // For `<button>`s (anchors become 100% by default though) - color: var(--#{$prefix}list-group-action-color); - text-align: inherit; // For `<button>`s (anchors inherit) - - // Hover state - &:hover, - &:focus { - z-index: 1; // Place hover/focus items above their siblings for proper border styling - color: var(--#{$prefix}list-group-action-hover-color); - text-decoration: none; - background-color: var(--#{$prefix}list-group-action-hover-bg); - } - - &:active { - color: var(--#{$prefix}list-group-action-active-color); - background-color: var(--#{$prefix}list-group-action-active-bg); - } -} - // Individual list items // // Use on `li`s or `div`s within the `.list-group` parent. @@ -115,6 +90,33 @@ } } +// Interactive list items +// +// Use anchor or button elements instead of `li`s or `div`s to create interactive +// list items. Includes an extra `.active` modifier class for selected items. + +.list-group-item-action { + width: 100%; // For `<button>`s (anchors become 100% by default though) + color: var(--#{$prefix}list-group-action-color); + text-align: inherit; // For `<button>`s (anchors inherit) + + &:not(.active) { + // Hover state + &:hover, + &:focus { + z-index: 1; // Place hover/focus items above their siblings for proper border styling + color: var(--#{$prefix}list-group-action-hover-color); + text-decoration: none; + background-color: var(--#{$prefix}list-group-action-hover-bg); + } + + &:active { + color: var(--#{$prefix}list-group-action-active-color); + background-color: var(--#{$prefix}list-group-action-active-bg); + } + } +} + // Horizontal // // Change the layout of list group items from vertical (default) to horizontal. diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_maps.scss b/extensions/pagetop-bootsier/static/bootstrap/_maps.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_maps.scss rename to extensions/pagetop-bootsier/static/bootstrap/_maps.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_mixins.scss b/extensions/pagetop-bootsier/static/bootstrap/_mixins.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_mixins.scss rename to extensions/pagetop-bootsier/static/bootstrap/_mixins.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_modal.scss b/extensions/pagetop-bootsier/static/bootstrap/_modal.scss similarity index 96% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_modal.scss rename to extensions/pagetop-bootsier/static/bootstrap/_modal.scss index 494db94e..a3492c17 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_modal.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_modal.scss @@ -59,8 +59,8 @@ // When fading in the modal, animate it to slide down .modal.fade & { - @include transition($modal-transition); transform: $modal-fade-transform; + @include transition($modal-transition); } .modal.show & { transform: $modal-show-transform; @@ -132,7 +132,11 @@ .btn-close { padding: calc(var(--#{$prefix}modal-header-padding-y) * .5) calc(var(--#{$prefix}modal-header-padding-x) * .5); - margin: calc(-.5 * var(--#{$prefix}modal-header-padding-y)) calc(-.5 * var(--#{$prefix}modal-header-padding-x)) calc(-.5 * var(--#{$prefix}modal-header-padding-y)) auto; + // Split properties to avoid invalid calc() function if value is 0 + margin-top: calc(-.5 * var(--#{$prefix}modal-header-padding-y)); + margin-right: calc(-.5 * var(--#{$prefix}modal-header-padding-x)); + margin-bottom: calc(-.5 * var(--#{$prefix}modal-header-padding-y)); + margin-left: auto; } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_nav.scss b/extensions/pagetop-bootsier/static/bootstrap/_nav.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_nav.scss rename to extensions/pagetop-bootsier/static/bootstrap/_nav.scss index ff073d36..96fa5289 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_nav.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_nav.scss @@ -169,8 +169,8 @@ .nav-justified { > .nav-link, .nav-item { - flex-basis: 0; flex-grow: 1; + flex-basis: 0; text-align: center; } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_navbar.scss b/extensions/pagetop-bootsier/static/bootstrap/_navbar.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_navbar.scss rename to extensions/pagetop-bootsier/static/bootstrap/_navbar.scss index 71619382..86aa441e 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_navbar.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_navbar.scss @@ -139,8 +139,8 @@ // the default flexbox row orientation. Requires the use of `flex-wrap: wrap` // on the `.navbar` parent. .navbar-collapse { - flex-basis: 100%; flex-grow: 1; + flex-basis: 100%; // For always expanded or extra full navbars, ensure content aligns itself // properly vertically. Can be easily overridden with flex utilities. align-items: center; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_offcanvas.scss b/extensions/pagetop-bootsier/static/bootstrap/_offcanvas.scss similarity index 93% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_offcanvas.scss rename to extensions/pagetop-bootsier/static/bootstrap/_offcanvas.scss index eb2c97ab..b40b2cd9 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_offcanvas.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_offcanvas.scss @@ -127,7 +127,11 @@ .btn-close { padding: calc(var(--#{$prefix}offcanvas-padding-y) * .5) calc(var(--#{$prefix}offcanvas-padding-x) * .5); - margin: calc(-.5 * var(--#{$prefix}offcanvas-padding-y)) calc(-.5 * var(--#{$prefix}offcanvas-padding-x)) calc(-.5 * var(--#{$prefix}offcanvas-padding-y)) auto; + // Split properties to avoid invalid calc() function if value is 0 + margin-top: calc(-.5 * var(--#{$prefix}offcanvas-padding-y)); + margin-right: calc(-.5 * var(--#{$prefix}offcanvas-padding-x)); + margin-bottom: calc(-.5 * var(--#{$prefix}offcanvas-padding-y)); + margin-left: auto; } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_pagination.scss b/extensions/pagetop-bootsier/static/bootstrap/_pagination.scss similarity index 98% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_pagination.scss rename to extensions/pagetop-bootsier/static/bootstrap/_pagination.scss index f275a62e..9f09694c 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_pagination.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_pagination.scss @@ -75,7 +75,7 @@ margin-left: $pagination-margin-start; } - @if $pagination-margin-start == calc(#{$pagination-border-width} * -1) { + @if $pagination-margin-start == calc(-1 * #{$pagination-border-width}) { &:first-child { .page-link { @include border-start-radius(var(--#{$prefix}pagination-border-radius)); diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_placeholders.scss b/extensions/pagetop-bootsier/static/bootstrap/_placeholders.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_placeholders.scss rename to extensions/pagetop-bootsier/static/bootstrap/_placeholders.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_popover.scss b/extensions/pagetop-bootsier/static/bootstrap/_popover.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_popover.scss rename to extensions/pagetop-bootsier/static/bootstrap/_popover.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_progress.scss b/extensions/pagetop-bootsier/static/bootstrap/_progress.scss similarity index 96% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_progress.scss rename to extensions/pagetop-bootsier/static/bootstrap/_progress.scss index 148c3815..732365c5 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_progress.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_progress.scss @@ -3,7 +3,7 @@ // scss-docs-start progress-keyframes @if $enable-transitions { @keyframes progress-bar-stripes { - 0% { background-position-x: $progress-height; } + 0% { background-position-x: var(--#{$prefix}progress-height); } } } // scss-docs-end progress-keyframes diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_reboot.scss b/extensions/pagetop-bootsier/static/bootstrap/_reboot.scss similarity index 98% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_reboot.scss rename to extensions/pagetop-bootsier/static/bootstrap/_reboot.scss index 18791753..524645fb 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_reboot.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_reboot.scss @@ -499,9 +499,9 @@ legend { width: 100%; padding: 0; margin-bottom: $legend-margin-bottom; - @include font-size($legend-font-size); font-weight: $legend-font-weight; line-height: inherit; + @include font-size($legend-font-size); + * { clear: left; // 2 @@ -534,6 +534,12 @@ legend { [type="search"] { -webkit-appearance: textfield; // 1 outline-offset: -2px; // 2 + + // 3. Better affordance and consistent appearance for search cancel button + &::-webkit-search-cancel-button { + cursor: pointer; + filter: grayscale(1); + } } // 1. A few input types should stay LTR diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_root.scss b/extensions/pagetop-bootsier/static/bootstrap/_root.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_root.scss rename to extensions/pagetop-bootsier/static/bootstrap/_root.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_spinners.scss b/extensions/pagetop-bootsier/static/bootstrap/_spinners.scss similarity index 99% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_spinners.scss rename to extensions/pagetop-bootsier/static/bootstrap/_spinners.scss index ec847320..9dff2892 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_spinners.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_spinners.scss @@ -5,6 +5,7 @@ .spinner-grow, .spinner-border { display: inline-block; + flex-shrink: 0; width: var(--#{$prefix}spinner-width); height: var(--#{$prefix}spinner-height); vertical-align: var(--#{$prefix}spinner-vertical-align); diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tables.scss b/extensions/pagetop-bootsier/static/bootstrap/_tables.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tables.scss rename to extensions/pagetop-bootsier/static/bootstrap/_tables.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_toasts.scss b/extensions/pagetop-bootsier/static/bootstrap/_toasts.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_toasts.scss rename to extensions/pagetop-bootsier/static/bootstrap/_toasts.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tooltip.scss b/extensions/pagetop-bootsier/static/bootstrap/_tooltip.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_tooltip.scss rename to extensions/pagetop-bootsier/static/bootstrap/_tooltip.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_transitions.scss b/extensions/pagetop-bootsier/static/bootstrap/_transitions.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_transitions.scss rename to extensions/pagetop-bootsier/static/bootstrap/_transitions.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_type.scss b/extensions/pagetop-bootsier/static/bootstrap/_type.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_type.scss rename to extensions/pagetop-bootsier/static/bootstrap/_type.scss index 37d64bf8..6961390f 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_type.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_type.scss @@ -34,11 +34,11 @@ // Type display classes @each $display, $font-size in $display-font-sizes { .display-#{$display} { - @include font-size($font-size); font-family: $display-font-family; font-style: $display-font-style; font-weight: $display-font-weight; line-height: $display-line-height; + @include font-size($font-size); } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_utilities.scss b/extensions/pagetop-bootsier/static/bootstrap/_utilities.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_utilities.scss rename to extensions/pagetop-bootsier/static/bootstrap/_utilities.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables-dark.scss b/extensions/pagetop-bootsier/static/bootstrap/_variables-dark.scss similarity index 90% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables-dark.scss rename to extensions/pagetop-bootsier/static/bootstrap/_variables-dark.scss index 6422b387..260f6dcc 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables-dark.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_variables-dark.scss @@ -82,6 +82,21 @@ $form-invalid-border-color-dark: $red-300 !default; $accordion-icon-color-dark: $primary-text-emphasis-dark !default; $accordion-icon-active-color-dark: $primary-text-emphasis-dark !default; -$accordion-button-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-color-dark}'><path 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-.708z'/></svg>") !default; -$accordion-button-active-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-active-color-dark}'><path 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-.708z'/></svg>") !default; +$accordion-button-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-color-dark}'><path 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'/></svg>") !default; +$accordion-button-active-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-active-color-dark}'><path 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'/></svg>") !default; // scss-docs-end sass-dark-mode-vars + + +// +// Carousel +// + +$carousel-indicator-active-bg-dark: $carousel-dark-indicator-active-bg !default; +$carousel-caption-color-dark: $carousel-dark-caption-color !default; +$carousel-control-icon-filter-dark: $carousel-dark-control-icon-filter !default; + +// +// Close button +// + +$btn-close-filter-dark: $btn-close-white-filter !default; diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables.scss b/extensions/pagetop-bootsier/static/bootstrap/_variables.scss similarity index 98% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables.scss rename to extensions/pagetop-bootsier/static/bootstrap/_variables.scss index 06531395..1ffa7e74 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/_variables.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/_variables.scss @@ -67,8 +67,8 @@ $colors: ( ) !default; // scss-docs-end colors-map -// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7. -// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast +// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.2 are 3, 4.5 and 7. +// See https://www.w3.org/TR/WCAG/#contrast-minimum $min-contrast-ratio: 4.5 !default; // Customize the light and dark text colors for use in our color contrast function. @@ -1091,7 +1091,7 @@ $form-feedback-valid-color: $success !default; $form-feedback-invalid-color: $danger !default; $form-feedback-icon-valid-color: $form-feedback-valid-color !default; -$form-feedback-icon-valid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' 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.1z'/></svg>") !default; +$form-feedback-icon-valid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' 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'/></svg>") !default; $form-feedback-icon-invalid-color: $form-feedback-invalid-color !default; $form-feedback-icon-invalid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>") !default; // scss-docs-end form-feedback-variables @@ -1302,7 +1302,7 @@ $pagination-color: var(--#{$prefix}link-color) !default; $pagination-bg: var(--#{$prefix}body-bg) !default; $pagination-border-radius: var(--#{$prefix}border-radius) !default; $pagination-border-width: var(--#{$prefix}border-width) !default; -$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list +$pagination-margin-start: calc(-1 * #{$pagination-border-width}) !default; // stylelint-disable-line function-disallowed-list $pagination-border-color: var(--#{$prefix}border-color) !default; $pagination-focus-color: var(--#{$prefix}link-hover-color) !default; @@ -1394,8 +1394,8 @@ $accordion-icon-active-color: $primary-text-emphasis !default; $accordion-icon-transition: transform .2s ease-in-out !default; $accordion-icon-transform: rotate(-180deg) !default; -$accordion-button-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-color}' stroke-linecap='round' stroke-linejoin='round'><path d='M2 5L8 11L14 5'/></svg>") !default; -$accordion-button-active-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-active-color}' stroke-linecap='round' stroke-linejoin='round'><path d='M2 5L8 11L14 5'/></svg>") !default; +$accordion-button-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-color}' stroke-linecap='round' stroke-linejoin='round'><path d='m2 5 6 6 6-6'/></svg>") !default; +$accordion-button-active-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-active-color}' stroke-linecap='round' stroke-linejoin='round'><path d='m2 5 6 6 6-6'/></svg>") !default; // scss-docs-end accordion-variables // Tooltips @@ -1507,7 +1507,7 @@ $modal-dialog-margin-y-sm-up: 1.75rem !default; $modal-title-line-height: $line-height-base !default; -$modal-content-color: null !default; +$modal-content-color: var(--#{$prefix}body-color) !default; $modal-content-bg: var(--#{$prefix}body-bg) !default; $modal-content-border-color: var(--#{$prefix}border-color-translucent) !default; $modal-content-border-width: var(--#{$prefix}border-width) !default; @@ -1652,6 +1652,7 @@ $carousel-control-width: 15% !default; $carousel-control-opacity: .5 !default; $carousel-control-hover-opacity: .9 !default; $carousel-control-transition: opacity .15s ease !default; +$carousel-control-icon-filter: null !default; $carousel-indicator-width: 30px !default; $carousel-indicator-height: 3px !default; @@ -1669,17 +1670,17 @@ $carousel-caption-spacer: 1.25rem !default; $carousel-control-icon-width: 2rem !default; -$carousel-control-prev-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path 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 0z'/></svg>") !default; -$carousel-control-next-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path 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-.708z'/></svg>") !default; +$carousel-control-prev-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path 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'/></svg>") !default; +$carousel-control-next-icon-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path 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'/></svg>") !default; $carousel-transition-duration: .6s !default; $carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`) // scss-docs-end carousel-variables // scss-docs-start carousel-dark-variables -$carousel-dark-indicator-active-bg: $black !default; -$carousel-dark-caption-color: $black !default; -$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default; +$carousel-dark-indicator-active-bg: $black !default; // Deprecated in v5.3.4 +$carousel-dark-caption-color: $black !default; // Deprecated in v5.3.4 +$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default; // Deprecated in v5.3.4 // scss-docs-end carousel-dark-variables @@ -1706,13 +1707,14 @@ $btn-close-height: $btn-close-width !default; $btn-close-padding-x: .25em !default; $btn-close-padding-y: $btn-close-padding-x !default; $btn-close-color: $black !default; -$btn-close-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$btn-close-color}'><path 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.414z'/></svg>") !default; +$btn-close-bg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$btn-close-color}'><path 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'/></svg>") !default; $btn-close-focus-shadow: $focus-ring-box-shadow !default; $btn-close-opacity: .5 !default; $btn-close-hover-opacity: .75 !default; $btn-close-focus-opacity: 1 !default; $btn-close-disabled-opacity: .25 !default; -$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default; +$btn-close-filter: null !default; +$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default; // Deprecated in v5.3.4 // scss-docs-end close-variables diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-grid.scss b/extensions/pagetop-bootsier/static/bootstrap/bootstrap-grid.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-grid.scss rename to extensions/pagetop-bootsier/static/bootstrap/bootstrap-grid.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-reboot.scss b/extensions/pagetop-bootsier/static/bootstrap/bootstrap-reboot.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-reboot.scss rename to extensions/pagetop-bootsier/static/bootstrap/bootstrap-reboot.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-utilities.scss b/extensions/pagetop-bootsier/static/bootstrap/bootstrap-utilities.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap-utilities.scss rename to extensions/pagetop-bootsier/static/bootstrap/bootstrap-utilities.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap.scss b/extensions/pagetop-bootsier/static/bootstrap/bootstrap.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/bootstrap.scss rename to extensions/pagetop-bootsier/static/bootstrap/bootstrap.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_floating-labels.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_floating-labels.scss similarity index 78% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_floating-labels.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_floating-labels.scss index 2cf04704..38df1155 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_floating-labels.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/forms/_floating-labels.scss @@ -14,9 +14,11 @@ top: 0; left: 0; z-index: 2; + max-width: 100%; height: 100%; // allow textareas padding: $form-floating-padding-y $form-floating-padding-x; overflow: hidden; + color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity}); text-align: start; text-overflow: ellipsis; white-space: nowrap; @@ -49,6 +51,7 @@ > .form-select { padding-top: $form-floating-input-padding-t; padding-bottom: $form-floating-input-padding-b; + padding-left: $form-floating-padding-x; } > .form-control:focus, @@ -56,27 +59,30 @@ > .form-control-plaintext, > .form-select { ~ label { - color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity}); transform: $form-floating-label-transform; - - &::after { - position: absolute; - inset: $form-floating-padding-y ($form-floating-padding-x * .5); - z-index: -1; - height: $form-floating-label-height; - content: ""; - background-color: $input-bg; - @include border-radius($input-border-radius); - } } } // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped > .form-control:-webkit-autofill { ~ label { - color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity}); transform: $form-floating-label-transform; } } + > textarea:focus, + > textarea:not(:placeholder-shown) { + ~ label::after { + position: absolute; + inset: $form-floating-padding-y ($form-floating-padding-x * .5); + z-index: -1; + height: $form-floating-label-height; + content: ""; + background-color: $input-bg; + @include border-radius($input-border-radius); + } + } + > textarea:disabled ~ label::after { + background-color: $input-disabled-bg; + } > .form-control-plaintext { ~ label { @@ -87,9 +93,5 @@ > :disabled ~ label, > .form-control:disabled ~ label { // Required for `.form-control`s because of specificity color: $form-floating-label-disabled-color; - - &::after { - background-color: $input-disabled-bg; - } } } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-check.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_form-check.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-check.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_form-check.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-control.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_form-control.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-control.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_form-control.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-range.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_form-range.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-range.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_form-range.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-select.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_form-select.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-select.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_form-select.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-text.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_form-text.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_form-text.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_form-text.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_input-group.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_input-group.scss similarity index 98% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_input-group.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_input-group.scss index 58e4d409..8078ebb1 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_input-group.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/forms/_input-group.scss @@ -121,7 +121,7 @@ } > :not(:first-child):not(.dropdown-menu)#{$validation-messages} { - margin-left: calc(#{$input-border-width} * -1); // stylelint-disable-line function-disallowed-list + margin-left: calc(-1 * #{$input-border-width}); // stylelint-disable-line function-disallowed-list @include border-start-radius(0); } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_labels.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_labels.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_labels.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_labels.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_validation.scss b/extensions/pagetop-bootsier/static/bootstrap/forms/_validation.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/forms/_validation.scss rename to extensions/pagetop-bootsier/static/bootstrap/forms/_validation.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_clearfix.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_clearfix.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_clearfix.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_clearfix.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_color-bg.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_color-bg.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_color-bg.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_color-bg.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_colored-links.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_colored-links.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_colored-links.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_colored-links.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_focus-ring.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_focus-ring.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_focus-ring.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_focus-ring.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_icon-link.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_icon-link.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_icon-link.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_icon-link.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_position.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_position.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_position.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_position.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_ratio.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_ratio.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_ratio.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_ratio.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stacks.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_stacks.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stacks.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_stacks.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stretched-link.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_stretched-link.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_stretched-link.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_stretched-link.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_text-truncation.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_text-truncation.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_text-truncation.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_text-truncation.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_visually-hidden.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_visually-hidden.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_visually-hidden.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_visually-hidden.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_vr.scss b/extensions/pagetop-bootsier/static/bootstrap/helpers/_vr.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/helpers/_vr.scss rename to extensions/pagetop-bootsier/static/bootstrap/helpers/_vr.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_alert.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_alert.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_alert.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_alert.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_backdrop.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_backdrop.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_backdrop.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_backdrop.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_banner.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_banner.scss similarity index 52% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_banner.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_banner.scss index 20c2fd12..dd8a5103 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_banner.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/mixins/_banner.scss @@ -1,7 +1,7 @@ @mixin bsBanner($file) { /*! - * Bootstrap #{$file} v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors + * Bootstrap #{$file} v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ } diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_border-radius.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_border-radius.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_border-radius.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_border-radius.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_box-shadow.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_box-shadow.scss new file mode 100644 index 00000000..0bb6bf7e --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap/mixins/_box-shadow.scss @@ -0,0 +1,24 @@ +@mixin box-shadow($shadow...) { + @if $enable-shadows { + $result: (); + $has-single-value: false; + $single-value: null; + + @each $value in $shadow { + @if $value != null { + @if $value == none or $value == initial or $value == inherit or $value == unset { + $has-single-value: true; + $single-value: $value; + } @else { + $result: append($result, $value, "comma"); + } + } + } + + @if $has-single-value { + box-shadow: $single-value; + } @else if (length($result) > 0) { + box-shadow: $result; + } + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_breakpoints.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_breakpoints.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_breakpoints.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_breakpoints.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_buttons.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_buttons.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_buttons.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_buttons.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_caret.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_caret.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_caret.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_caret.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_clearfix.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_clearfix.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_clearfix.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_clearfix.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-mode.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_color-mode.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-mode.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_color-mode.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-scheme.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_color-scheme.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_color-scheme.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_color-scheme.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_container.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_container.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_container.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_container.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_deprecate.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_deprecate.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_deprecate.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_deprecate.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_forms.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_forms.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_forms.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_forms.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_gradients.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_gradients.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_gradients.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_gradients.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_grid.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_grid.scss similarity index 98% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_grid.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_grid.scss index ea307399..db77e07f 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_grid.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/mixins/_grid.scss @@ -72,7 +72,7 @@ @include media-breakpoint-up($breakpoint, $breakpoints) { // Provide basic `.col-{bp}` classes for equal-width flexbox columns .col#{$infix} { - flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 + flex: 1 0 0; } .row-cols#{$infix}-auto > * { diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_image.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_image.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_image.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_image.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_list-group.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_list-group.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_list-group.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_list-group.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_lists.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_lists.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_lists.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_lists.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_pagination.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_pagination.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_pagination.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_pagination.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_reset-text.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_reset-text.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_reset-text.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_reset-text.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_resize.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_resize.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_resize.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_resize.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_table-variants.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_table-variants.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_table-variants.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_table-variants.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_text-truncate.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_text-truncate.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_text-truncate.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_text-truncate.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_transition.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_transition.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_transition.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_transition.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_utilities.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_utilities.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_utilities.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_utilities.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_visually-hidden.scss b/extensions/pagetop-bootsier/static/bootstrap/mixins/_visually-hidden.scss similarity index 87% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_visually-hidden.scss rename to extensions/pagetop-bootsier/static/bootstrap/mixins/_visually-hidden.scss index 082aeec9..9dd0ad33 100644 --- a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/mixins/_visually-hidden.scss +++ b/extensions/pagetop-bootsier/static/bootstrap/mixins/_visually-hidden.scss @@ -19,12 +19,17 @@ &:not(caption) { position: absolute !important; } + + // Fix to prevent overflowing children to become focusable + * { + overflow: hidden !important; + } } // Use to only display content when it's focused, or one of its child elements is focused // (i.e. when focus is within the element/container that the class was applied to) // -// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// Useful for "Skip to main content" links; see https://www.w3.org/WAI/WCAG22/Techniques/general/G1.html @mixin visually-hidden-focusable() { &:not(:focus):not(:focus-within) { diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/jasmine.js b/extensions/pagetop-bootsier/static/bootstrap/tests/jasmine.js similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/jasmine.js rename to extensions/pagetop-bootsier/static/bootstrap/tests/jasmine.js diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_auto-import-of-variables-dark.test.scss b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_auto-import-of-variables-dark.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_auto-import-of-variables-dark.test.scss rename to extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_auto-import-of-variables-dark.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_box-shadow.test.scss b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_box-shadow.test.scss new file mode 100644 index 00000000..f5a07484 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_box-shadow.test.scss @@ -0,0 +1,188 @@ +@import "../../functions"; +@import "../../variables"; +@import "../../mixins"; + +// Store original value +$original-enable-shadows: $enable-shadows; + +// Enable shadows for all tests +$enable-shadows: true !global; + +@include describe("box-shadow mixin") { + @include it("handles single none value") { + @include assert() { + @include output() { + .test { + @include box-shadow(none); + } + } + + @include expect() { + .test { + box-shadow: none; + } + } + } + } + + @include it("handles multiple none values by consolidating them") { + @include assert() { + @include output() { + .test { + @include box-shadow(none, none, none); + } + } + + @include expect() { + .test { + box-shadow: none; + } + } + } + } + + @include it("handles other single-value keywords (initial, inherit, unset)") { + @include assert() { + @include output() { + .test-initial { + @include box-shadow(initial); + } + .test-inherit { + @include box-shadow(inherit); + } + .test-unset { + @include box-shadow(unset); + } + } + + @include expect() { + .test-initial { + box-shadow: initial; + } + .test-inherit { + box-shadow: inherit; + } + .test-unset { + box-shadow: unset; + } + } + } + } + + @include it("handles multiple single-value keywords by using the last one") { + @include assert() { + @include output() { + .test { + @include box-shadow(initial, inherit, unset); + } + } + + @include expect() { + .test { + box-shadow: unset; + } + } + } + } + + @include it("handles regular box-shadow values") { + @include assert() { + @include output() { + .test { + @include box-shadow(0 0 10px rgba(0, 0, 0, .5)); + } + } + + @include expect() { + .test { + box-shadow: 0 0 10px rgba(0, 0, 0, .5); + } + } + } + } + + @include it("handles multiple regular box-shadow values") { + @include assert() { + @include output() { + .test { + @include box-shadow(0 0 10px rgba(0, 0, 0, .5), 0 0 20px rgba(0, 0, 0, .3)); + } + } + + @include expect() { + .test { + box-shadow: 0 0 10px rgba(0, 0, 0, .5), 0 0 20px rgba(0, 0, 0, .3); + } + } + } + } + + @include it("handles null values by ignoring them") { + @include assert() { + @include output() { + .test { + @include box-shadow(null, 0 0 10px rgba(0, 0, 0, .5), null); + } + } + + @include expect() { + .test { + box-shadow: 0 0 10px rgba(0, 0, 0, .5); + } + } + } + } + + @include it("handles mixed values with keywords and regular shadows") { + @include assert() { + @include output() { + .test { + @include box-shadow(none, 0 0 10px rgba(0, 0, 0, .5)); + } + } + + @include expect() { + .test { + box-shadow: none; + } + } + } + } + + @include it("handles empty input") { + @include assert() { + @include output() { + .test { + @include box-shadow(); + } + } + + @include expect() { + .test { // stylelint-disable-line block-no-empty + } + } + } + } + + @include it("respects $enable-shadows variable") { + $enable-shadows: false !global; + + @include assert() { + @include output() { + .test { + @include box-shadow(0 0 10px rgba(0, 0, 0, .5)); + } + } + + @include expect() { + .test { // stylelint-disable-line block-no-empty + } + } + } + + $enable-shadows: true !global; + } +} + +// Restore original value +$enable-shadows: $original-enable-shadows !global; diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-contrast.test.scss b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-contrast.test.scss new file mode 100644 index 00000000..5b94ac57 --- /dev/null +++ b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-contrast.test.scss @@ -0,0 +1,139 @@ +@import "../../functions"; +@import "../../variables"; +@import "../../variables-dark"; +@import "../../maps"; +@import "../../mixins"; + +@include describe("color-contrast function") { + @include it("should return a color when contrast ratio equals minimum requirement (WCAG 2.1 compliance)") { + // Test case: Background color that produces contrast ratio close to 4.5:1 + // This tests the WCAG 2.1 requirement that contrast should be "at least 4.5:1" (>= 4.5) + // rather than "strictly greater than 4.5:1" (> 4.5) + + // #777777 produces 4.4776:1 contrast ratio with white text + // Since this is below the 4.5:1 threshold, it should return the highest available contrast color + $test-background: #777; + $result: color-contrast($test-background); + + @include assert-equal($result, $black, "Should return black (highest available contrast) for background with 4.4776:1 contrast ratio (below threshold)"); + } + + @include it("should return a color when contrast ratio is above minimum requirement") { + // Test case: Background color that produces contrast ratio above 4.5:1 + // #767676 produces 4.5415:1 contrast ratio with white text + $test-background: #767676; + $result: color-contrast($test-background); + + @include assert-equal($result, $white, "Should return white for background with 4.5415:1 contrast ratio (above threshold)"); + } + + @include it("should return a color when contrast ratio is below minimum requirement") { + // Test case: Background color that produces contrast ratio below 4.5:1 + // #787878 produces 4.4155:1 contrast ratio with white text + $test-background: #787878; + $result: color-contrast($test-background); + + // Should return the color with the highest available contrast ratio + @include assert-equal($result, $black, "Should return black (highest available contrast) for background with 4.4155:1 contrast ratio (below threshold)"); + } + + @include it("should handle edge case with very light background") { + // Test case: Very light background that should return dark text + $test-background: #f8f9fa; // Very light gray + $result: color-contrast($test-background); + + @include assert-equal($result, $color-contrast-dark, "Should return dark text for very light background"); + } + + @include it("should handle edge case with very dark background") { + // Test case: Very dark background that should return light text + $test-background: #212529; // Very dark gray + $result: color-contrast($test-background); + + @include assert-equal($result, $color-contrast-light, "Should return light text for very dark background"); + } + + @include it("should work with custom minimum contrast ratio") { + // Test case: Using a custom minimum contrast ratio + $test-background: #666; + $result: color-contrast($test-background, $color-contrast-dark, $color-contrast-light, 3); + + @include assert-equal($result, $white, "Should return white when using custom minimum contrast ratio of 3.0"); + } + + @include it("should test contrast ratio calculation accuracy") { + // Test case: Verify that contrast-ratio function works correctly + $background: #767676; + $foreground: $white; + $ratio: contrast-ratio($background, $foreground); + // Bootstrap's implementation calculates this as ~4.5415, not exactly 4.5, due to its luminance math. + // We use 4.54 as the threshold for this test to match the actual implementation. + @include assert-true($ratio >= 4.54 and $ratio <= 4.55, "Contrast ratio should be approximately 4.54:1 (Bootstrap's math)"); + } + + @include it("should test luminance calculation") { + // Test case: Verify luminance function works correctly + $white-luminance: luminance($white); + $black-luminance: luminance($black); + + @include assert-equal($white-luminance, 1, "White should have luminance of 1"); + @include assert-equal($black-luminance, 0, "Black should have luminance of 0"); + } + + @include it("should handle rgba colors correctly") { + // Test case: Test with rgba colors + $test-background: rgba(118, 118, 118, 1); // Same as #767676 + $result: color-contrast($test-background); + + @include assert-equal($result, $white, "Should handle rgba colors correctly"); + } + + @include it("should test the WCAG 2.1 boundary condition with color below threshold") { + // Test case: Background color that produces contrast ratio below 4.5:1 + // #787878 produces 4.4155:1 contrast ratio with white + $test-background: #787878; // Produces 4.4155:1 contrast ratio + $contrast-ratio: contrast-ratio($test-background, $white); + + // Verify the contrast ratio is below 4.5:1 + @include assert-true($contrast-ratio < 4.5, "Contrast ratio should be below 4.5:1 threshold"); + + // The color-contrast function should return the color with highest available contrast + $result: color-contrast($test-background); + @include assert-equal($result, $black, "color-contrast should return black (highest available contrast) for below-threshold ratio"); + } + + @include it("should test the WCAG 2.1 boundary condition with color at threshold") { + // Test case: Background color that produces contrast ratio close to 4.5:1 + // #777777 produces 4.4776:1 contrast ratio with white + $test-background: #777; // Produces 4.4776:1 contrast ratio + $contrast-ratio: contrast-ratio($test-background, $white); + + // Verify the contrast ratio is below 4.5:1 threshold + @include assert-true($contrast-ratio < 4.5, "Contrast ratio is below threshold, function should handle gracefully"); + } + + @include it("should demonstrate the difference between > and >= operators") { + // Test case: Demonstrates the difference between > and >= operators + // Uses #767676 with a custom minimum contrast ratio that matches its actual ratio (4.5415) + // With > 4.5415: should return black (fallback to highest available) + // With >= 4.5415: should return white (meets threshold) + + $test-background: #767676; // Produces 4.5415:1 contrast ratio + $actual-ratio: contrast-ratio($test-background, $white); + + // Test with a custom minimum that matches the actual ratio + $result: color-contrast($test-background, $color-contrast-dark, $color-contrast-light, $actual-ratio); + + // Should return white when using >= implementation + @include assert-equal($result, $white, "color-contrast should return white when using exact ratio as threshold (>= implementation)"); + } + + @include it("should test additional working colors above threshold") { + // Test case: Background color that produces contrast ratio well above 4.5:1 + // #757575 produces 4.6047:1 contrast ratio with white text + $test-background: #757575; // Produces 4.6047:1 contrast ratio + $result: color-contrast($test-background); + + @include assert-equal($result, $white, "Should return white for background with 4.6047:1 contrast ratio (well above threshold)"); + } +} diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_color-modes.test.scss b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-modes.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_color-modes.test.scss rename to extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-modes.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_media-query-color-mode-full.test.scss b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_media-query-color-mode-full.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_media-query-color-mode-full.test.scss rename to extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_media-query-color-mode-full.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_utilities.test.scss b/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_utilities.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/mixins/_utilities.test.scss rename to extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_utilities.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/register.js b/extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/register.js similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/register.js rename to extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/register.js diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/runner.js b/extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/runner.js similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/sass-true/runner.js rename to extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/runner.js diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/utilities/_api.test.scss b/extensions/pagetop-bootsier/static/bootstrap/tests/utilities/_api.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/tests/utilities/_api.test.scss rename to extensions/pagetop-bootsier/static/bootstrap/tests/utilities/_api.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/utilities/_api.scss b/extensions/pagetop-bootsier/static/bootstrap/utilities/_api.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/utilities/_api.scss rename to extensions/pagetop-bootsier/static/bootstrap/utilities/_api.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap-5.3.3/vendor/_rfs.scss b/extensions/pagetop-bootsier/static/bootstrap/vendor/_rfs.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap-5.3.3/vendor/_rfs.scss rename to extensions/pagetop-bootsier/static/bootstrap/vendor/_rfs.scss diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.js b/extensions/pagetop-bootsier/static/js/bootstrap.js index e3a59e3a..e1f6e58f 100644 --- a/extensions/pagetop-bootsier/static/js/bootstrap.js +++ b/extensions/pagetop-bootsier/static/js/bootstrap.js @@ -1,6 +1,6 @@ /*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Bootstrap v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { @@ -224,7 +224,7 @@ * @param {HTMLElement} element * @return void * - * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation + * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation */ const reflow = element => { element.offsetHeight; // eslint-disable-line no-unused-expressions @@ -269,7 +269,7 @@ }); }; const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => { - return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue; + return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue; }; const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { if (!waitForTransition) { @@ -591,7 +591,7 @@ const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig')); for (const key of bsKeys) { let pureKey = key.replace(/^bs/, ''); - pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); + pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1); attributes[pureKey] = normalizeData(element.dataset[key]); } return attributes; @@ -666,7 +666,7 @@ * Constants */ - const VERSION = '5.3.3'; + const VERSION = '5.3.8'; /** * Class definition @@ -692,6 +692,8 @@ this[propertyName] = null; } } + + // Private _queueCallback(callback, element, isAnimated = true) { executeAfterTransition(callback, element, isAnimated); } @@ -1623,11 +1625,11 @@ this._element.style[dimension] = ''; this._queueCallback(complete, this._element, true); } + + // Private _isShown(element = this._element) { return element.classList.contains(CLASS_NAME_SHOW$7); } - - // Private _configAfterMerge(config) { config.toggle = Boolean(config.toggle); // Coerce string values config.parent = getElement(config.parent); @@ -1881,7 +1883,7 @@ } _createPopper() { if (typeof Popper__namespace === 'undefined') { - throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); + throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org/docs/v2/)'); } let referenceElement = this._element; if (this._config.reference === 'parent') { @@ -1960,7 +1962,7 @@ } return { ...defaultBsPopperConfig, - ...execute(this._config.popperConfig, [defaultBsPopperConfig]) + ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig]) }; } _selectMenuItem({ @@ -2982,7 +2984,6 @@ * * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38 */ - // eslint-disable-next-line unicorn/better-regex const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i; const allowedAttribute = (attribute, allowedAttributeList) => { const attributeName = attribute.nodeName.toLowerCase(); @@ -3147,7 +3148,7 @@ return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; } _resolvePossibleFunction(arg) { - return execute(arg, [this]); + return execute(arg, [undefined, this]); } _putElementInTemplate(element, templateElement) { if (this._config.html) { @@ -3246,7 +3247,7 @@ class Tooltip extends BaseComponent { constructor(element, config) { if (typeof Popper__namespace === 'undefined') { - throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); + throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org/docs/v2/)'); } super(element, config); @@ -3292,7 +3293,6 @@ if (!this._isEnabled) { return; } - this._activeTrigger.click = !this._activeTrigger.click; if (this._isShown()) { this._leave(); return; @@ -3480,7 +3480,7 @@ return offset; } _resolvePossibleFunction(arg) { - return execute(arg, [this._element]); + return execute(arg, [this._element, this._element]); } _getPopperConfig(attachment) { const defaultBsPopperConfig = { @@ -3518,7 +3518,7 @@ }; return { ...defaultBsPopperConfig, - ...execute(this._config.popperConfig, [defaultBsPopperConfig]) + ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig]) }; } _setListeners() { @@ -3527,6 +3527,7 @@ if (trigger === 'click') { EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => { const context = this._initializeOnDelegatedTarget(event); + context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]); context.toggle(); }); } else if (trigger !== TRIGGER_MANUAL) { @@ -4392,7 +4393,6 @@ } // Private - _maybeScheduleHide() { if (!this._config.autohide) { return; diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.js.map b/extensions/pagetop-bootsier/static/js/bootstrap.js.map index 98a87052..062cdd5e 100644 --- a/extensions/pagetop-bootsier/static/js/bootstrap.js.map +++ b/extensions/pagetop-bootsier/static/js/bootstrap.js.map @@ -1 +1 @@ -{"version":3,"file":"bootstrap.js","sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"names":["elementMap","Map","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","MAX_UID","MILLISECONDS_MULTIPLIER","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","undefined","Object","prototype","toString","call","toLowerCase","getUID","prefix","Math","floor","random","document","getElementById","getTransitionDurationFromElement","transitionDuration","transitionDelay","getComputedStyle","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","querySelector","isVisible","getClientRects","elementIsVisible","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","onDOMContentLoaded","callback","readyState","addEventListener","push","isRTL","dir","defineJQueryPlugin","plugin","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","durationPadding","emulatedDuration","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","bootstrapHandler","event","hydrateObj","delegateTarget","oneOff","EventHandler","off","type","apply","bootstrapDelegationHandler","domElements","querySelectorAll","domElement","findHandler","events","callable","delegationSelector","values","find","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","wrapFunction","relatedTarget","handlers","previousFunction","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","JSON","parse","decodeURIComponent","normalizeDataKey","chr","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","RegExp","test","TypeError","toUpperCase","VERSION","BaseComponent","_element","_config","Data","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","CLASS_NAME_FADE","CLASS_NAME_SHOW","Alert","close","closeEvent","_destroyElement","each","data","DATA_API_KEY","CLASS_NAME_ACTIVE","SELECTOR_DATA_TOGGLE","EVENT_CLICK_DATA_API","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","POINTER_TYPE_TOUCH","POINTER_TYPE_PEN","CLASS_NAME_POINTER_EVENT","SWIPE_THRESHOLD","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","touches","clientX","_eventIsPointerPenTouch","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","TOUCHEVENT_COMPAT_WAIT","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_SLIDE","CLASS_NAME_END","CLASS_NAME_START","CLASS_NAME_NEXT","CLASS_NAME_PREV","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","SELECTOR_ITEM_IMG","SELECTOR_INDICATORS","SELECTOR_DATA_SLIDE","SELECTOR_DATA_RIDE","KEY_TO_DIRECTION","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","endCallBack","clearTimeout","swipeConfig","_directionToOrder","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","slideEvent","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","CLASS_NAME_HORIZONTAL","WIDTH","HEIGHT","SELECTOR_ACTIVES","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","startEvent","activeInstance","dimension","_getDimension","style","complete","capitalizedDimension","scrollSize","getBoundingClientRect","selected","triggerArray","isOpen","ESCAPE_KEY","TAB_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","RIGHT_MOUSE_BUTTON","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","CLASS_NAME_DROPUP","CLASS_NAME_DROPEND","CLASS_NAME_DROPSTART","CLASS_NAME_DROPUP_CENTER","CLASS_NAME_DROPDOWN_CENTER","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","SELECTOR_NAVBAR","SELECTOR_NAVBAR_NAV","SELECTOR_VISIBLE_ITEMS","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","PLACEMENT_TOPCENTER","PLACEMENT_BOTTOMCENTER","autoClose","boundary","display","offset","popperConfig","reference","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","showEvent","_createPopper","focus","_completeHide","destroy","update","hideEvent","Popper","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_FORWARD","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","manipulationCallBack","setProperty","_applyManipulationCallback","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","OPEN_SELECTOR","SELECTOR_DIALOG","SELECTOR_MODAL_BODY","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","CLASS_NAME_BACKDROP","scroll","Offcanvas","blur","completeCallback","position","ARIA_ATTRIBUTE_PATTERN","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","sanitizeHtml","unsafeHtml","allowList","sanitizeFunction","domParser","DOMParser","createdDocument","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","content","extraClass","html","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","DISALLOWED_ATTRIBUTES","CLASS_NAME_MODAL","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","TRIGGER_MANUAL","EVENT_INSERTED","EVENT_CLICK","EVENT_FOCUSOUT","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","fallbackPlacements","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","shadowRoot","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","EVENT_ACTIVATE","CLASS_NAME_DROPDOWN_ITEM","SELECTOR_DATA_SPY","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LIST_GROUP","SELECTOR_NAV_LINKS","SELECTOR_NAV_ITEMS","SELECTOR_LIST_ITEMS","SELECTOR_LINK_ITEMS","SELECTOR_DROPDOWN","SELECTOR_DROPDOWN_TOGGLE","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","HOME_KEY","END_KEY","CLASS_DROPDOWN","SELECTOR_DROPDOWN_MENU","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_TAB_PANEL","SELECTOR_OUTER","SELECTOR_INNER","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"bootstrap.js","sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n // Private\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n // Private\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [undefined, this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element, this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK])\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"names":["elementMap","Map","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","MAX_UID","MILLISECONDS_MULTIPLIER","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","undefined","Object","prototype","toString","call","toLowerCase","getUID","prefix","Math","floor","random","document","getElementById","getTransitionDurationFromElement","transitionDuration","transitionDelay","getComputedStyle","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","querySelector","isVisible","getClientRects","elementIsVisible","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","onDOMContentLoaded","callback","readyState","addEventListener","push","isRTL","dir","defineJQueryPlugin","plugin","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","durationPadding","emulatedDuration","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","bootstrapHandler","event","hydrateObj","delegateTarget","oneOff","EventHandler","off","type","apply","bootstrapDelegationHandler","domElements","querySelectorAll","domElement","findHandler","events","callable","delegationSelector","values","find","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","wrapFunction","relatedTarget","handlers","previousFunction","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","JSON","parse","decodeURIComponent","normalizeDataKey","chr","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","RegExp","test","TypeError","toUpperCase","VERSION","BaseComponent","_element","_config","Data","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","CLASS_NAME_FADE","CLASS_NAME_SHOW","Alert","close","closeEvent","_destroyElement","each","data","DATA_API_KEY","CLASS_NAME_ACTIVE","SELECTOR_DATA_TOGGLE","EVENT_CLICK_DATA_API","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","POINTER_TYPE_TOUCH","POINTER_TYPE_PEN","CLASS_NAME_POINTER_EVENT","SWIPE_THRESHOLD","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","touches","clientX","_eventIsPointerPenTouch","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","TOUCHEVENT_COMPAT_WAIT","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_SLIDE","CLASS_NAME_END","CLASS_NAME_START","CLASS_NAME_NEXT","CLASS_NAME_PREV","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","SELECTOR_ITEM_IMG","SELECTOR_INDICATORS","SELECTOR_DATA_SLIDE","SELECTOR_DATA_RIDE","KEY_TO_DIRECTION","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","endCallBack","clearTimeout","swipeConfig","_directionToOrder","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","slideEvent","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","CLASS_NAME_DEEPER_CHILDREN","CLASS_NAME_HORIZONTAL","WIDTH","HEIGHT","SELECTOR_ACTIVES","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","startEvent","activeInstance","dimension","_getDimension","style","complete","capitalizedDimension","scrollSize","getBoundingClientRect","selected","triggerArray","isOpen","ESCAPE_KEY","TAB_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","RIGHT_MOUSE_BUTTON","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","CLASS_NAME_DROPUP","CLASS_NAME_DROPEND","CLASS_NAME_DROPSTART","CLASS_NAME_DROPUP_CENTER","CLASS_NAME_DROPDOWN_CENTER","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","SELECTOR_NAVBAR","SELECTOR_NAVBAR_NAV","SELECTOR_VISIBLE_ITEMS","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","PLACEMENT_TOPCENTER","PLACEMENT_BOTTOMCENTER","autoClose","boundary","display","offset","popperConfig","reference","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","showEvent","_createPopper","focus","_completeHide","destroy","update","hideEvent","Popper","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_FORWARD","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","manipulationCallBack","setProperty","_applyManipulationCallback","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","OPEN_SELECTOR","SELECTOR_DIALOG","SELECTOR_MODAL_BODY","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","CLASS_NAME_BACKDROP","scroll","Offcanvas","blur","completeCallback","position","ARIA_ATTRIBUTE_PATTERN","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","sanitizeHtml","unsafeHtml","allowList","sanitizeFunction","domParser","DOMParser","createdDocument","parseFromString","elementName","attributeList","allowedAttributes","innerHTML","content","extraClass","html","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","DISALLOWED_ATTRIBUTES","CLASS_NAME_MODAL","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","TRIGGER_MANUAL","EVENT_INSERTED","EVENT_CLICK","EVENT_FOCUSOUT","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","fallbackPlacements","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","shadowRoot","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","EVENT_ACTIVATE","CLASS_NAME_DROPDOWN_ITEM","SELECTOR_DATA_SPY","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LIST_GROUP","SELECTOR_NAV_LINKS","SELECTOR_NAV_ITEMS","SELECTOR_LIST_ITEMS","SELECTOR_LINK_ITEMS","SELECTOR_DROPDOWN","SELECTOR_DROPDOWN_TOGGLE","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","HOME_KEY","END_KEY","CLASS_DROPDOWN","SELECTOR_DROPDOWN_MENU","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_TAB_PANEL","SELECTOR_OUTER","SELECTOR_INNER","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"mappings":"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"} \ No newline at end of file diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.min.js b/extensions/pagetop-bootsier/static/js/bootstrap.min.js index d5dc5ea1..7f2bc627 100644 --- a/extensions/pagetop-bootsier/static/js/bootstrap.min.js +++ b/extensions/pagetop-bootsier/static/js/bootstrap.min.js @@ -1,7 +1,7 @@ /*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Bootstrap v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t)for(const i in t)if("default"!==i){const s=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const i=e(t),s=new Map,n={set(t,e,i){s.has(t)||s.set(t,new Map);const n=s.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>s.has(t)&&s.get(t).get(e)||null,remove(t,e){if(!s.has(t))return;const i=s.get(t);i.delete(e),0===i.size&&s.delete(t)}},o="transitionend",r=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),a=t=>{t.dispatchEvent(new Event(o))},l=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),c=t=>l(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(r(t)):null,h=t=>{if(!l(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},d=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),u=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?u(t.parentNode):null},_=()=>{},g=t=>{t.offsetHeight},f=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,m=[],p=()=>"rtl"===document.documentElement.dir,b=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}},"loading"===document.readyState?(m.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of m)t()})),m.push(e)):e()},v=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,y=(t,e,i=!0)=>{if(!i)return void v(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const s=Number.parseFloat(e),n=Number.parseFloat(i);return s||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let n=!1;const r=({target:i})=>{i===e&&(n=!0,e.removeEventListener(o,r),v(t))};e.addEventListener(o,r),setTimeout((()=>{n||a(e)}),s)},w=(t,e,i,s)=>{const n=t.length;let o=t.indexOf(e);return-1===o?!i&&s?t[n-1]:t[0]:(o+=i?1:-1,s&&(o=(o+n)%n),t[Math.max(0,Math.min(o,n-1))])},A=/[^.]*(?=\..*)\.|.*/,E=/\..*/,C=/::\d+$/,T={};let k=1;const $={mouseenter:"mouseover",mouseleave:"mouseout"},S=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"]);function L(t,e){return e&&`${e}::${k++}`||t.uidEvent||k++}function O(t){const e=L(t);return t.uidEvent=e,T[e]=T[e]||{},T[e]}function I(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function D(t,e,i){const s="string"==typeof e,n=s?i:e||i;let o=M(t);return S.has(o)||(o=t),[s,n,o]}function N(t,e,i,s,n){if("string"!=typeof e||!t)return;let[o,r,a]=D(e,i,s);if(e in $){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=O(t),c=l[a]||(l[a]={}),h=I(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=L(r,e.replace(A,"")),u=o?function(t,e,i){return function s(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return F(n,{delegateTarget:r}),s.oneOff&&j.off(t,n.type,e,i),i.apply(r,[n])}}(t,i,r):function(t,e){return function i(s){return F(s,{delegateTarget:t}),i.oneOff&&j.off(t,s.type,e),e.apply(t,[s])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function P(t,e,i,s,n){const o=I(e[i],s,n);o&&(t.removeEventListener(i,o,Boolean(n)),delete e[i][o.uidEvent])}function x(t,e,i,s){const n=e[i]||{};for(const[o,r]of Object.entries(n))o.includes(s)&&P(t,e,i,r.callable,r.delegationSelector)}function M(t){return t=t.replace(E,""),$[t]||t}const j={on(t,e,i,s){N(t,e,i,s,!1)},one(t,e,i,s){N(t,e,i,s,!0)},off(t,e,i,s){if("string"!=typeof e||!t)return;const[n,o,r]=D(e,i,s),a=r!==e,l=O(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))x(t,l,i,e.slice(1));for(const[i,s]of Object.entries(c)){const n=i.replace(C,"");a&&!e.includes(n)||P(t,l,r,s.callable,s.delegationSelector)}}else{if(!Object.keys(c).length)return;P(t,l,r,o,n?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const s=f();let n=null,o=!0,r=!0,a=!1;e!==M(e)&&s&&(n=s.Event(e,i),s(t).trigger(n),o=!n.isPropagationStopped(),r=!n.isImmediatePropagationStopped(),a=n.isDefaultPrevented());const l=F(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&n&&n.preventDefault(),l}};function F(t,e={}){for(const[i,s]of Object.entries(e))try{t[i]=s}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>s})}return t}function z(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function H(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${H(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${H(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const s of i){let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=z(t.dataset[s])}return e},getDataAttribute:(t,e)=>z(t.getAttribute(`data-bs-${H(e)}`))};class q{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=l(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...l(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[s,n]of Object.entries(e)){const e=t[s],o=l(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(n).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${s}" provided type "${o}" but expected type "${n}".`)}var i}}class W extends q{constructor(t,e){super(),(t=c(t))&&(this._element=t,this._config=this._getConfig(e),n.set(this._element,this.constructor.DATA_KEY,this))}dispose(){n.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){y(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return n.get(c(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const R=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>r(t))).join(","):null},K={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let s=t.parentNode.closest(e);for(;s;)i.push(s),s=s.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!d(t)&&h(t)))},getSelectorFromElement(t){const e=R(t);return e&&K.findOne(e)?e:null},getElementFromSelector(t){const e=R(t);return e?K.findOne(e):null},getMultipleElementsFromSelector(t){const e=R(t);return e?K.find(e):[]}},V=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),d(this))return;const n=K.getElementFromSelector(this)||this.closest(`.${s}`);t.getOrCreateInstance(n)[e]()}))},Q=".bs.alert",X=`close${Q}`,Y=`closed${Q}`;class U extends W{static get NAME(){return"alert"}close(){if(j.trigger(this._element,X).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,Y),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=U.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}V(U,"close"),b(U);const G='[data-bs-toggle="button"]';class J extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=J.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}j.on(document,"click.bs.button.data-api",G,(t=>{t.preventDefault();const e=t.target.closest(G);J.getOrCreateInstance(e).toggle()})),b(J);const Z=".bs.swipe",tt=`touchstart${Z}`,et=`touchmove${Z}`,it=`touchend${Z}`,st=`pointerdown${Z}`,nt=`pointerup${Z}`,ot={endCallback:null,leftCallback:null,rightCallback:null},rt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class at extends q{constructor(t,e){super(),this._element=t,t&&at.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"swipe"}dispose(){j.off(this._element,Z)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),v(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&v(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(j.on(this._element,st,(t=>this._start(t))),j.on(this._element,nt,(t=>this._end(t))),this._element.classList.add("pointer-event")):(j.on(this._element,tt,(t=>this._start(t))),j.on(this._element,et,(t=>this._move(t))),j.on(this._element,it,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const lt=".bs.carousel",ct=".data-api",ht="next",dt="prev",ut="left",_t="right",gt=`slide${lt}`,ft=`slid${lt}`,mt=`keydown${lt}`,pt=`mouseenter${lt}`,bt=`mouseleave${lt}`,vt=`dragstart${lt}`,yt=`load${lt}${ct}`,wt=`click${lt}${ct}`,At="carousel",Et="active",Ct=".active",Tt=".carousel-item",kt=Ct+Tt,$t={ArrowLeft:_t,ArrowRight:ut},St={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Lt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Ot extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=K.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===At&&this.cycle()}static get Default(){return St}static get DefaultType(){return Lt}static get NAME(){return"carousel"}next(){this._slide(ht)}nextWhenVisible(){!document.hidden&&h(this._element)&&this.next()}prev(){this._slide(dt)}pause(){this._isSliding&&a(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?j.one(this._element,ft,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,ft,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const s=t>i?ht:dt;this._slide(s,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&j.on(this._element,mt,(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,pt,(()=>this.pause())),j.on(this._element,bt,(()=>this._maybeEnableCycle()))),this._config.touch&&at.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of K.find(".carousel-item img",this._element))j.on(t,vt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ut)),rightCallback:()=>this._slide(this._directionToOrder(_t)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new at(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=$t[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=K.findOne(Ct,this._indicatorsElement);e.classList.remove(Et),e.removeAttribute("aria-current");const i=K.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Et),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),s=t===ht,n=e||w(this._getItems(),i,s,this._config.wrap);if(n===i)return;const o=this._getItemIndex(n),r=e=>j.trigger(this._element,e,{relatedTarget:n,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(gt).defaultPrevented)return;if(!i||!n)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=n;const l=s?"carousel-item-start":"carousel-item-end",c=s?"carousel-item-next":"carousel-item-prev";n.classList.add(c),g(n),i.classList.add(l),n.classList.add(l),this._queueCallback((()=>{n.classList.remove(l,c),n.classList.add(Et),i.classList.remove(Et,c,l),this._isSliding=!1,r(ft)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return K.findOne(kt,this._element)}_getItems(){return K.find(Tt,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ut?dt:ht:t===ut?ht:dt}_orderToDirection(t){return p()?t===dt?ut:_t:t===dt?_t:ut}static jQueryInterface(t){return this.each((function(){const e=Ot.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}j.on(document,wt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=K.getElementFromSelector(this);if(!e||!e.classList.contains(At))return;t.preventDefault();const i=Ot.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),j.on(window,yt,(()=>{const t=K.find('[data-bs-ride="carousel"]');for(const e of t)Ot.getOrCreateInstance(e)})),b(Ot);const It=".bs.collapse",Dt=`show${It}`,Nt=`shown${It}`,Pt=`hide${It}`,xt=`hidden${It}`,Mt=`click${It}.data-api`,jt="show",Ft="collapse",zt="collapsing",Ht=`:scope .${Ft} .${Ft}`,Bt='[data-bs-toggle="collapse"]',qt={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Rt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=K.find(Bt);for(const t of i){const e=K.getSelectorFromElement(t),i=K.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return qt}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Rt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(j.trigger(this._element,Dt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Ft),this._element.classList.add(zt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(zt),this._element.classList.add(Ft,jt),this._element.style[e]="",j.trigger(this._element,Nt)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,Pt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,g(this._element),this._element.classList.add(zt),this._element.classList.remove(Ft,jt);for(const t of this._triggerArray){const e=K.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(zt),this._element.classList.add(Ft),j.trigger(this._element,xt)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(jt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=c(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Bt);for(const e of t){const t=K.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=K.find(Ht,this._config.parent);return K.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Rt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,Mt,Bt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of K.getMultipleElementsFromSelector(this))Rt.getOrCreateInstance(t,{toggle:!1}).toggle()})),b(Rt);const Kt="dropdown",Vt=".bs.dropdown",Qt=".data-api",Xt="ArrowUp",Yt="ArrowDown",Ut=`hide${Vt}`,Gt=`hidden${Vt}`,Jt=`show${Vt}`,Zt=`shown${Vt}`,te=`click${Vt}${Qt}`,ee=`keydown${Vt}${Qt}`,ie=`keyup${Vt}${Qt}`,se="show",ne='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',oe=`${ne}.${se}`,re=".dropdown-menu",ae=p()?"top-end":"top-start",le=p()?"top-start":"top-end",ce=p()?"bottom-end":"bottom-start",he=p()?"bottom-start":"bottom-end",de=p()?"left-start":"right-start",ue=p()?"right-start":"left-start",_e={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},ge={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class fe extends W{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=K.next(this._element,re)[0]||K.prev(this._element,re)[0]||K.findOne(re,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return _e}static get DefaultType(){return ge}static get NAME(){return Kt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(d(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!j.trigger(this._element,Jt,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))j.on(t,"mouseover",_);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(se),this._element.classList.add(se),j.trigger(this._element,Zt,t)}}hide(){if(d(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!j.trigger(this._element,Ut,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))j.off(t,"mouseover",_);this._popper&&this._popper.destroy(),this._menu.classList.remove(se),this._element.classList.remove(se),this._element.setAttribute("aria-expanded","false"),B.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,Gt,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!l(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Kt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===i)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:l(this._config.reference)?t=c(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=i.createPopper(t,this._menu,e)}_isShown(){return this._menu.classList.contains(se)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return de;if(t.classList.contains("dropstart"))return ue;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?le:ae:e?he:ce}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...v(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=K.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>h(t)));i.length&&w(i,e,t===Yt,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=fe.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=K.find(oe);for(const i of e){const e=fe.getInstance(i);if(!e||!1===e._config.autoClose)continue;const s=t.composedPath(),n=s.includes(e._menu);if(s.includes(e._element)||"inside"===e._config.autoClose&&!n||"outside"===e._config.autoClose&&n)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,s=[Xt,Yt].includes(t.key);if(!s&&!i)return;if(e&&!i)return;t.preventDefault();const n=this.matches(ne)?this:K.prev(this,ne)[0]||K.next(this,ne)[0]||K.findOne(ne,t.delegateTarget.parentNode),o=fe.getOrCreateInstance(n);if(s)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),n.focus())}}j.on(document,ee,ne,fe.dataApiKeydownHandler),j.on(document,ee,re,fe.dataApiKeydownHandler),j.on(document,te,fe.clearMenus),j.on(document,ie,fe.clearMenus),j.on(document,te,ne,(function(t){t.preventDefault(),fe.getOrCreateInstance(this).toggle()})),b(fe);const me="backdrop",pe="show",be=`mousedown.bs.${me}`,ve={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},ye={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class we extends q{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return ve}static get DefaultType(){return ye}static get NAME(){return me}show(t){if(!this._config.isVisible)return void v(t);this._append();const e=this._getElement();this._config.isAnimated&&g(e),e.classList.add(pe),this._emulateAnimation((()=>{v(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(pe),this._emulateAnimation((()=>{this.dispose(),v(t)}))):v(t)}dispose(){this._isAppended&&(j.off(this._element,be),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=c(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),j.on(t,be,(()=>{v(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){y(t,this._getElement(),this._config.isAnimated)}}const Ae=".bs.focustrap",Ee=`focusin${Ae}`,Ce=`keydown.tab${Ae}`,Te="backward",ke={autofocus:!0,trapElement:null},$e={autofocus:"boolean",trapElement:"element"};class Se extends q{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return ke}static get DefaultType(){return $e}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),j.off(document,Ae),j.on(document,Ee,(t=>this._handleFocusin(t))),j.on(document,Ce,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,Ae))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=K.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Te?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Te:"forward")}}const Le=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Oe=".sticky-top",Ie="padding-right",De="margin-right";class Ne{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Ie,(e=>e+t)),this._setElementAttributes(Le,Ie,(e=>e+t)),this._setElementAttributes(Oe,De,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Ie),this._resetElementAttributes(Le,Ie),this._resetElementAttributes(Oe,De)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const s=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+s)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(n))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(l(t))e(t);else for(const i of K.find(t,this._element))e(i)}}const Pe=".bs.modal",xe=`hide${Pe}`,Me=`hidePrevented${Pe}`,je=`hidden${Pe}`,Fe=`show${Pe}`,ze=`shown${Pe}`,He=`resize${Pe}`,Be=`click.dismiss${Pe}`,qe=`mousedown.dismiss${Pe}`,We=`keydown.dismiss${Pe}`,Re=`click${Pe}.data-api`,Ke="modal-open",Ve="show",Qe="modal-static",Xe={backdrop:!0,focus:!0,keyboard:!0},Ye={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ue extends W{constructor(t,e){super(t,e),this._dialog=K.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ne,this._addEventListeners()}static get Default(){return Xe}static get DefaultType(){return Ye}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,Fe,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Ke),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(j.trigger(this._element,xe).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Ve),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){j.off(window,Pe),j.off(this._dialog,Pe),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new we({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_showElement(t){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;const e=K.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),g(this._element),this._element.classList.add(Ve),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,ze,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){j.on(this._element,We,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),j.on(window,He,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),j.on(this._element,qe,(t=>{j.one(this._element,Be,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_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(Ke),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,je)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,Me).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Qe)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Qe),this._queueCallback((()=>{this._element.classList.remove(Qe),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ue.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,Re,'[data-bs-toggle="modal"]',(function(t){const e=K.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,Fe,(t=>{t.defaultPrevented||j.one(e,je,(()=>{h(this)&&this.focus()}))}));const i=K.findOne(".modal.show");i&&Ue.getInstance(i).hide(),Ue.getOrCreateInstance(e).toggle(this)})),V(Ue),b(Ue);const Ge=".bs.offcanvas",Je=".data-api",Ze=`load${Ge}${Je}`,ti="show",ei="showing",ii="hiding",si=".offcanvas.show",ni=`show${Ge}`,oi=`shown${Ge}`,ri=`hide${Ge}`,ai=`hidePrevented${Ge}`,li=`hidden${Ge}`,ci=`resize${Ge}`,hi=`click${Ge}${Je}`,di=`keydown.dismiss${Ge}`,ui={backdrop:!0,keyboard:!0,scroll:!1},_i={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class gi extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return ui}static get DefaultType(){return _i}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,ni,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ne).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ei),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(ti),this._element.classList.remove(ei),j.trigger(this._element,oi,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,ri).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ii),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(ti,ii),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ne).reset(),j.trigger(this._element,li)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new we({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():j.trigger(this._element,ai)}:null})}_initializeFocusTrap(){return new Se({trapElement:this._element})}_addEventListeners(){j.on(this._element,di,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():j.trigger(this._element,ai))}))}static jQueryInterface(t){return this.each((function(){const e=gi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,hi,'[data-bs-toggle="offcanvas"]',(function(t){const e=K.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this))return;j.one(e,li,(()=>{h(this)&&this.focus()}));const i=K.findOne(si);i&&i!==e&&gi.getInstance(i).hide(),gi.getOrCreateInstance(e).toggle(this)})),j.on(window,Ze,(()=>{for(const t of K.find(si))gi.getOrCreateInstance(t).show()})),j.on(window,ci,(()=>{for(const t of K.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&gi.getOrCreateInstance(t).hide()})),V(gi),b(gi);const fi={"*":["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:[]},mi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),pi=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,bi=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!mi.has(i)||Boolean(pi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},vi={allowList:fi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},yi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},wi={entry:"(string|element|function|null)",selector:"(string|element)"};class Ai extends q{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return vi}static get DefaultType(){return yi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},wi)}_setContent(t,e,i){const s=K.findOne(i,t);s&&((e=this._resolvePossibleFunction(e))?l(e)?this._putElementInTemplate(c(e),s):this._config.html?s.innerHTML=this._maybeSanitize(e):s.textContent=e:s.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const s=(new window.DOMParser).parseFromString(t,"text/html"),n=[].concat(...s.body.querySelectorAll("*"));for(const t of n){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const s=[].concat(...t.attributes),n=[].concat(e["*"]||[],e[i]||[]);for(const e of s)bi(e,n)||t.removeAttribute(e.nodeName)}return s.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return v(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ei=new Set(["sanitize","allowList","sanitizeFn"]),Ci="fade",Ti="show",ki=".modal",$i="hide.bs.modal",Si="hover",Li="focus",Oi={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},Ii={allowList:fi,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:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},Di={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 Ni extends W{constructor(t,e){if(void 0===i)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),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 Ii}static get DefaultType(){return Di}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ki),$i,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("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.eventName("show")),e=(u(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),j.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(Ti),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))j.on(t,"mouseover",_);this._queueCallback((()=>{j.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!j.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Ti),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))j.off(t,"mouseover",_);this._activeTrigger.click=!1,this._activeTrigger[Li]=!1,this._activeTrigger[Si]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Ci,Ti),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Ci),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Ai({...this._config,content:t,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(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ci)}_isShown(){return this.tip&&this.tip.classList.contains(Ti)}_createPopper(t){const e=v(this._config.placement,[this,t,this._element]),s=Oi[e.toUpperCase()];return i.createPopper(this._element,t,this._getPopperConfig(s))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return v(t,[this._element])}_getPopperConfig(t){const e={placement:t,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:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...v(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)j.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===Si?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===Si?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");j.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?Li:Si]=!0,e._enter()})),j.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?Li:Si]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ki),$i,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(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(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ei.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:c(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Ni);const Pi={...Ni.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},xi={...Ni.DefaultType,content:"(null|string|element|function)"};class Mi extends Ni{static get Default(){return Pi}static get DefaultType(){return xi}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(t){return this.each((function(){const e=Mi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}b(Mi);const ji=".bs.scrollspy",Fi=`activate${ji}`,zi=`click${ji}`,Hi=`load${ji}.data-api`,Bi="active",qi="[href]",Wi=".nav-link",Ri=`${Wi}, .nav-item > ${Wi}, .list-group-item`,Ki={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Vi={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Qi extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Ki}static get DefaultType(){return Vi}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=c(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(j.off(this._config.target,zi),j.on(this._config.target,zi,qi,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,s=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:s,behavior:"smooth"});i.scrollTop=s}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},s=(this._rootElement||document.documentElement).scrollTop,n=s>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=s;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(n&&t){if(i(o),!s)return}else n||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=K.find(qi,this._config.target);for(const e of t){if(!e.hash||d(e))continue;const t=K.findOne(decodeURI(e.hash),this._element);h(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Bi),this._activateParents(t),j.trigger(this._element,Fi,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))K.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Bi);else for(const e of K.parents(t,".nav, .list-group"))for(const t of K.prev(e,Ri))t.classList.add(Bi)}_clearActiveClass(t){t.classList.remove(Bi);const e=K.find(`${qi}.${Bi}`,t);for(const t of e)t.classList.remove(Bi)}static jQueryInterface(t){return this.each((function(){const e=Qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,Hi,(()=>{for(const t of K.find('[data-bs-spy="scroll"]'))Qi.getOrCreateInstance(t)})),b(Qi);const Xi=".bs.tab",Yi=`hide${Xi}`,Ui=`hidden${Xi}`,Gi=`show${Xi}`,Ji=`shown${Xi}`,Zi=`click${Xi}`,ts=`keydown${Xi}`,es=`load${Xi}`,is="ArrowLeft",ss="ArrowRight",ns="ArrowUp",os="ArrowDown",rs="Home",as="End",ls="active",cs="fade",hs="show",ds=".dropdown-toggle",us=`:not(${ds})`,_s='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',gs=`.nav-link${us}, .list-group-item${us}, [role="tab"]${us}, ${_s}`,fs=`.${ls}[data-bs-toggle="tab"], .${ls}[data-bs-toggle="pill"], .${ls}[data-bs-toggle="list"]`;class ms extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),j.on(this._element,ts,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?j.trigger(e,Yi,{relatedTarget:t}):null;j.trigger(t,Gi,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(ls),this._activate(K.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),j.trigger(t,Ji,{relatedTarget:e})):t.classList.add(hs)}),t,t.classList.contains(cs)))}_deactivate(t,e){t&&(t.classList.remove(ls),t.blur(),this._deactivate(K.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),j.trigger(t,Ui,{relatedTarget:e})):t.classList.remove(hs)}),t,t.classList.contains(cs)))}_keydown(t){if(![is,ss,ns,os,rs,as].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!d(t)));let i;if([rs,as].includes(t.key))i=e[t.key===rs?0:e.length-1];else{const s=[ss,os].includes(t.key);i=w(e,t.target,s,!0)}i&&(i.focus({preventScroll:!0}),ms.getOrCreateInstance(i).show())}_getChildren(){return K.find(gs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=K.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const s=(t,s)=>{const n=K.findOne(t,i);n&&n.classList.toggle(s,e)};s(ds,ls),s(".dropdown-menu",hs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(ls)}_getInnerElement(t){return t.matches(gs)?t:K.findOne(gs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=ms.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,Zi,_s,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),d(this)||ms.getOrCreateInstance(this).show()})),j.on(window,es,(()=>{for(const t of K.find(fs))ms.getOrCreateInstance(t)})),b(ms);const ps=".bs.toast",bs=`mouseover${ps}`,vs=`mouseout${ps}`,ys=`focusin${ps}`,ws=`focusout${ps}`,As=`hide${ps}`,Es=`hidden${ps}`,Cs=`show${ps}`,Ts=`shown${ps}`,ks="hide",$s="show",Ss="showing",Ls={animation:"boolean",autohide:"boolean",delay:"number"},Os={animation:!0,autohide:!0,delay:5e3};class Is extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Os}static get DefaultType(){return Ls}static get NAME(){return"toast"}show(){j.trigger(this._element,Cs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(ks),g(this._element),this._element.classList.add($s,Ss),this._queueCallback((()=>{this._element.classList.remove(Ss),j.trigger(this._element,Ts),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(j.trigger(this._element,As).defaultPrevented||(this._element.classList.add(Ss),this._queueCallback((()=>{this._element.classList.add(ks),this._element.classList.remove(Ss,$s),j.trigger(this._element,Es)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove($s),super.dispose()}isShown(){return this._element.classList.contains($s)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,bs,(t=>this._onInteraction(t,!0))),j.on(this._element,vs,(t=>this._onInteraction(t,!1))),j.on(this._element,ys,(t=>this._onInteraction(t,!0))),j.on(this._element,ws,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Is.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return V(Is),b(Is),{Alert:U,Button:J,Carousel:Ot,Collapse:Rt,Dropdown:fe,Modal:Ue,Offcanvas:gi,Popover:Mi,ScrollSpy:Qi,Tab:ms,Toast:Is,Tooltip:Ni}})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,function(t){"use strict";function e(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t)for(const i in t)if("default"!==i){const s=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const i=e(t),s=new Map,n={set(t,e,i){s.has(t)||s.set(t,new Map);const n=s.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>s.has(t)&&s.get(t).get(e)||null,remove(t,e){if(!s.has(t))return;const i=s.get(t);i.delete(e),0===i.size&&s.delete(t)}},o="transitionend",r=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,(t,e)=>`#${CSS.escape(e)}`)),t),a=t=>null==t?`${t}`:Object.prototype.toString.call(t).match(/\s([a-z]+)/i)[1].toLowerCase(),l=t=>{t.dispatchEvent(new Event(o))},c=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),h=t=>c(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(r(t)):null,d=t=>{if(!c(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},u=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),_=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?_(t.parentNode):null},g=()=>{},f=t=>{t.offsetHeight},m=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,p=[],b=()=>"rtl"===document.documentElement.dir,v=t=>{var e;e=()=>{const e=m();if(e){const i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",()=>{for(const t of p)t()}),p.push(e)):e()},y=(t,e=[],i=t)=>"function"==typeof t?t.call(...e):i,w=(t,e,i=!0)=>{if(!i)return void y(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const s=Number.parseFloat(e),n=Number.parseFloat(i);return s||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let n=!1;const r=({target:i})=>{i===e&&(n=!0,e.removeEventListener(o,r),y(t))};e.addEventListener(o,r),setTimeout(()=>{n||l(e)},s)},A=(t,e,i,s)=>{const n=t.length;let o=t.indexOf(e);return-1===o?!i&&s?t[n-1]:t[0]:(o+=i?1:-1,s&&(o=(o+n)%n),t[Math.max(0,Math.min(o,n-1))])},E=/[^.]*(?=\..*)\.|.*/,C=/\..*/,T=/::\d+$/,k={};let $=1;const S={mouseenter:"mouseover",mouseleave:"mouseout"},L=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"]);function O(t,e){return e&&`${e}::${$++}`||t.uidEvent||$++}function I(t){const e=O(t);return t.uidEvent=e,k[e]=k[e]||{},k[e]}function D(t,e,i=null){return Object.values(t).find(t=>t.callable===e&&t.delegationSelector===i)}function N(t,e,i){const s="string"==typeof e,n=s?i:e||i;let o=j(t);return L.has(o)||(o=t),[s,n,o]}function P(t,e,i,s,n){if("string"!=typeof e||!t)return;let[o,r,a]=N(e,i,s);if(e in S){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=I(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=O(r,e.replace(E,"")),u=o?function(t,e,i){return function s(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return z(n,{delegateTarget:r}),s.oneOff&&F.off(t,n.type,e,i),i.apply(r,[n])}}(t,i,r):function(t,e){return function i(s){return z(s,{delegateTarget:t}),i.oneOff&&F.off(t,s.type,e),e.apply(t,[s])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function x(t,e,i,s,n){const o=D(e[i],s,n);o&&(t.removeEventListener(i,o,Boolean(n)),delete e[i][o.uidEvent])}function M(t,e,i,s){const n=e[i]||{};for(const[o,r]of Object.entries(n))o.includes(s)&&x(t,e,i,r.callable,r.delegationSelector)}function j(t){return t=t.replace(C,""),S[t]||t}const F={on(t,e,i,s){P(t,e,i,s,!1)},one(t,e,i,s){P(t,e,i,s,!0)},off(t,e,i,s){if("string"!=typeof e||!t)return;const[n,o,r]=N(e,i,s),a=r!==e,l=I(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))M(t,l,i,e.slice(1));for(const[i,s]of Object.entries(c)){const n=i.replace(T,"");a&&!e.includes(n)||x(t,l,r,s.callable,s.delegationSelector)}}else{if(!Object.keys(c).length)return;x(t,l,r,o,n?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const s=m();let n=null,o=!0,r=!0,a=!1;e!==j(e)&&s&&(n=s.Event(e,i),s(t).trigger(n),o=!n.isPropagationStopped(),r=!n.isImmediatePropagationStopped(),a=n.isDefaultPrevented());const l=z(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&n&&n.preventDefault(),l}};function z(t,e={}){for(const[i,s]of Object.entries(e))try{t[i]=s}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>s})}return t}function H(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function B(t){return t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}const q={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${B(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${B(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter(t=>t.startsWith("bs")&&!t.startsWith("bsConfig"));for(const s of i){let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1),e[i]=H(t.dataset[s])}return e},getDataAttribute:(t,e)=>H(t.getAttribute(`data-bs-${B(e)}`))};class W{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=c(e)?q.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...c(e)?q.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[i,s]of Object.entries(e)){const e=t[i],n=c(e)?"element":a(e);if(!new RegExp(s).test(n))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${n}" but expected type "${s}".`)}}}class R extends W{constructor(t,e){super(),(t=h(t))&&(this._element=t,this._config=this._getConfig(e),n.set(this._element,this.constructor.DATA_KEY,this))}dispose(){n.remove(this._element,this.constructor.DATA_KEY),F.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){w(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return n.get(h(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e: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(t){return`${t}${this.EVENT_KEY}`}}const K=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map(t=>r(t)).join(","):null},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const i=[];let s=t.parentNode.closest(e);for(;s;)i.push(s),s=s.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,t).filter(t=>!u(t)&&d(t))},getSelectorFromElement(t){const e=K(t);return e&&V.findOne(e)?e:null},getElementFromSelector(t){const e=K(t);return e?V.findOne(e):null},getMultipleElementsFromSelector(t){const e=K(t);return e?V.find(e):[]}},Q=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;F.on(document,i,`[data-bs-dismiss="${s}"]`,function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),u(this))return;const n=V.getElementFromSelector(this)||this.closest(`.${s}`);t.getOrCreateInstance(n)[e]()})},X=".bs.alert",Y=`close${X}`,U=`closed${X}`;class G extends R{static get NAME(){return"alert"}close(){if(F.trigger(this._element,Y).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),F.trigger(this._element,U),this.dispose()}static jQueryInterface(t){return this.each(function(){const e=G.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}Q(G,"close"),v(G);const J='[data-bs-toggle="button"]';class Z extends R{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each(function(){const e=Z.getOrCreateInstance(this);"toggle"===t&&e[t]()})}}F.on(document,"click.bs.button.data-api",J,t=>{t.preventDefault();const e=t.target.closest(J);Z.getOrCreateInstance(e).toggle()}),v(Z);const tt=".bs.swipe",et=`touchstart${tt}`,it=`touchmove${tt}`,st=`touchend${tt}`,nt=`pointerdown${tt}`,ot=`pointerup${tt}`,rt={endCallback:null,leftCallback:null,rightCallback:null},at={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class lt extends W{constructor(t,e){super(),this._element=t,t&&lt.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return rt}static get DefaultType(){return at}static get NAME(){return"swipe"}dispose(){F.off(this._element,tt)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),y(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&y(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(F.on(this._element,nt,t=>this._start(t)),F.on(this._element,ot,t=>this._end(t)),this._element.classList.add("pointer-event")):(F.on(this._element,et,t=>this._start(t)),F.on(this._element,it,t=>this._move(t)),F.on(this._element,st,t=>this._end(t)))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ct=".bs.carousel",ht=".data-api",dt="ArrowLeft",ut="ArrowRight",_t="next",gt="prev",ft="left",mt="right",pt=`slide${ct}`,bt=`slid${ct}`,vt=`keydown${ct}`,yt=`mouseenter${ct}`,wt=`mouseleave${ct}`,At=`dragstart${ct}`,Et=`load${ct}${ht}`,Ct=`click${ct}${ht}`,Tt="carousel",kt="active",$t=".active",St=".carousel-item",Lt=$t+St,Ot={[dt]:mt,[ut]:ft},It={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Dt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Nt extends R{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Tt&&this.cycle()}static get Default(){return It}static get DefaultType(){return Dt}static get NAME(){return"carousel"}next(){this._slide(_t)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(gt)}pause(){this._isSliding&&l(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?F.one(this._element,bt,()=>this.cycle()):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void F.one(this._element,bt,()=>this.to(t));const i=this._getItemIndex(this._getActive());if(i===t)return;const s=t>i?_t:gt;this._slide(s,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&F.on(this._element,vt,t=>this._keydown(t)),"hover"===this._config.pause&&(F.on(this._element,yt,()=>this.pause()),F.on(this._element,wt,()=>this._maybeEnableCycle())),this._config.touch&&lt.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of V.find(".carousel-item img",this._element))F.on(t,At,t=>t.preventDefault());const t={leftCallback:()=>this._slide(this._directionToOrder(ft)),rightCallback:()=>this._slide(this._directionToOrder(mt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new lt(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Ot[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=V.findOne($t,this._indicatorsElement);e.classList.remove(kt),e.removeAttribute("aria-current");const i=V.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(kt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),s=t===_t,n=e||A(this._getItems(),i,s,this._config.wrap);if(n===i)return;const o=this._getItemIndex(n),r=e=>F.trigger(this._element,e,{relatedTarget:n,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(pt).defaultPrevented)return;if(!i||!n)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=n;const l=s?"carousel-item-start":"carousel-item-end",c=s?"carousel-item-next":"carousel-item-prev";n.classList.add(c),f(n),i.classList.add(l),n.classList.add(l),this._queueCallback(()=>{n.classList.remove(l,c),n.classList.add(kt),i.classList.remove(kt,c,l),this._isSliding=!1,r(bt)},i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return V.findOne(Lt,this._element)}_getItems(){return V.find(St,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return b()?t===ft?gt:_t:t===ft?_t:gt}_orderToDirection(t){return b()?t===gt?ft:mt:t===gt?mt:ft}static jQueryInterface(t){return this.each(function(){const e=Nt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)})}}F.on(document,Ct,"[data-bs-slide], [data-bs-slide-to]",function(t){const e=V.getElementFromSelector(this);if(!e||!e.classList.contains(Tt))return;t.preventDefault();const i=Nt.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===q.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())}),F.on(window,Et,()=>{const t=V.find('[data-bs-ride="carousel"]');for(const e of t)Nt.getOrCreateInstance(e)}),v(Nt);const Pt=".bs.collapse",xt=`show${Pt}`,Mt=`shown${Pt}`,jt=`hide${Pt}`,Ft=`hidden${Pt}`,zt=`click${Pt}.data-api`,Ht="show",Bt="collapse",qt="collapsing",Wt=`:scope .${Bt} .${Bt}`,Rt='[data-bs-toggle="collapse"]',Kt={parent:null,toggle:!0},Vt={parent:"(null|element)",toggle:"boolean"};class Qt extends R{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=V.find(Rt);for(const t of i){const e=V.getSelectorFromElement(t),i=V.find(e).filter(t=>t===this._element);null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Kt}static get DefaultType(){return Vt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(t=>t!==this._element).map(t=>Qt.getOrCreateInstance(t,{toggle:!1}))),t.length&&t[0]._isTransitioning)return;if(F.trigger(this._element,xt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Bt),this._element.classList.add(qt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(qt),this._element.classList.add(Bt,Ht),this._element.style[e]="",F.trigger(this._element,Mt)},this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(F.trigger(this._element,jt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,f(this._element),this._element.classList.add(qt),this._element.classList.remove(Bt,Ht);for(const t of this._triggerArray){const e=V.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(qt),this._element.classList.add(Bt),F.trigger(this._element,Ft)},this._element,!0)}_isShown(t=this._element){return t.classList.contains(Ht)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=h(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Rt);for(const e of t){const t=V.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=V.find(Wt,this._config.parent);return V.find(t,this._config.parent).filter(t=>!e.includes(t))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each(function(){const i=Qt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}})}}F.on(document,zt,Rt,function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of V.getMultipleElementsFromSelector(this))Qt.getOrCreateInstance(t,{toggle:!1}).toggle()}),v(Qt);const Xt="dropdown",Yt=".bs.dropdown",Ut=".data-api",Gt="ArrowUp",Jt="ArrowDown",Zt=`hide${Yt}`,te=`hidden${Yt}`,ee=`show${Yt}`,ie=`shown${Yt}`,se=`click${Yt}${Ut}`,ne=`keydown${Yt}${Ut}`,oe=`keyup${Yt}${Ut}`,re="show",ae='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',le=`${ae}.${re}`,ce=".dropdown-menu",he=b()?"top-end":"top-start",de=b()?"top-start":"top-end",ue=b()?"bottom-end":"bottom-start",_e=b()?"bottom-start":"bottom-end",ge=b()?"left-start":"right-start",fe=b()?"right-start":"left-start",me={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},pe={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class be extends R{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=V.next(this._element,ce)[0]||V.prev(this._element,ce)[0]||V.findOne(ce,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return me}static get DefaultType(){return pe}static get NAME(){return Xt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(u(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!F.trigger(this._element,ee,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))F.on(t,"mouseover",g);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(re),this._element.classList.add(re),F.trigger(this._element,ie,t)}}hide(){if(u(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!F.trigger(this._element,Zt,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))F.off(t,"mouseover",g);this._popper&&this._popper.destroy(),this._menu.classList.remove(re),this._element.classList.remove(re),this._element.setAttribute("aria-expanded","false"),q.removeDataAttribute(this._menu,"popper"),F.trigger(this._element,te,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!c(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Xt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===i)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org/docs/v2/)");let t=this._element;"parent"===this._config.reference?t=this._parent:c(this._config.reference)?t=h(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=i.createPopper(t,this._menu,e)}_isShown(){return this._menu.classList.contains(re)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return ge;if(t.classList.contains("dropstart"))return fe;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?de:he:e?_e:ue}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(q.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...y(this._config.popperConfig,[void 0,t])}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(t=>d(t));i.length&&A(i,e,t===Jt,!i.includes(e)).focus()}static jQueryInterface(t){return this.each(function(){const e=be.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=V.find(le);for(const i of e){const e=be.getInstance(i);if(!e||!1===e._config.autoClose)continue;const s=t.composedPath(),n=s.includes(e._menu);if(s.includes(e._element)||"inside"===e._config.autoClose&&!n||"outside"===e._config.autoClose&&n)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,s=[Gt,Jt].includes(t.key);if(!s&&!i)return;if(e&&!i)return;t.preventDefault();const n=this.matches(ae)?this:V.prev(this,ae)[0]||V.next(this,ae)[0]||V.findOne(ae,t.delegateTarget.parentNode),o=be.getOrCreateInstance(n);if(s)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),n.focus())}}F.on(document,ne,ae,be.dataApiKeydownHandler),F.on(document,ne,ce,be.dataApiKeydownHandler),F.on(document,se,be.clearMenus),F.on(document,oe,be.clearMenus),F.on(document,se,ae,function(t){t.preventDefault(),be.getOrCreateInstance(this).toggle()}),v(be);const ve="backdrop",ye="show",we=`mousedown.bs.${ve}`,Ae={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ee={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ce extends W{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Ae}static get DefaultType(){return Ee}static get NAME(){return ve}show(t){if(!this._config.isVisible)return void y(t);this._append();const e=this._getElement();this._config.isAnimated&&f(e),e.classList.add(ye),this._emulateAnimation(()=>{y(t)})}hide(t){this._config.isVisible?(this._getElement().classList.remove(ye),this._emulateAnimation(()=>{this.dispose(),y(t)})):y(t)}dispose(){this._isAppended&&(F.off(this._element,we),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=h(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),F.on(t,we,()=>{y(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(t){w(t,this._getElement(),this._config.isAnimated)}}const Te=".bs.focustrap",ke=`focusin${Te}`,$e=`keydown.tab${Te}`,Se="backward",Le={autofocus:!0,trapElement:null},Oe={autofocus:"boolean",trapElement:"element"};class Ie extends W{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Le}static get DefaultType(){return Oe}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),F.off(document,Te),F.on(document,ke,t=>this._handleFocusin(t)),F.on(document,$e,t=>this._handleKeydown(t)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,F.off(document,Te))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=V.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Se?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Se:"forward")}}const De=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ne=".sticky-top",Pe="padding-right",xe="margin-right";class Me{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Pe,e=>e+t),this._setElementAttributes(De,Pe,e=>e+t),this._setElementAttributes(Ne,xe,e=>e-t)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Pe),this._resetElementAttributes(De,Pe),this._resetElementAttributes(Ne,xe)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const s=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+s)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(n))}px`)})}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&q.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const i=q.getDataAttribute(t,e);null!==i?(q.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)})}_applyManipulationCallback(t,e){if(c(t))e(t);else for(const i of V.find(t,this._element))e(i)}}const je=".bs.modal",Fe=`hide${je}`,ze=`hidePrevented${je}`,He=`hidden${je}`,Be=`show${je}`,qe=`shown${je}`,We=`resize${je}`,Re=`click.dismiss${je}`,Ke=`mousedown.dismiss${je}`,Ve=`keydown.dismiss${je}`,Qe=`click${je}.data-api`,Xe="modal-open",Ye="show",Ue="modal-static",Ge={backdrop:!0,focus:!0,keyboard:!0},Je={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ze extends R{constructor(t,e){super(t,e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Me,this._addEventListeners()}static get Default(){return Ge}static get DefaultType(){return Je}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||F.trigger(this._element,Be,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Xe),this._adjustDialog(),this._backdrop.show(()=>this._showElement(t)))}hide(){this._isShown&&!this._isTransitioning&&(F.trigger(this._element,Fe).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Ye),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())))}dispose(){F.off(window,je),F.off(this._dialog,je),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ce({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ie({trapElement:this._element})}_showElement(t){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;const e=V.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),f(this._element),this._element.classList.add(Ye),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,F.trigger(this._element,qe,{relatedTarget:t})},this._dialog,this._isAnimated())}_addEventListeners(){F.on(this._element,Ve,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())}),F.on(window,We,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),F.on(this._element,Ke,t=>{F.one(this._element,Re,e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())})})}_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(Xe),this._resetAdjustments(),this._scrollBar.reset(),F.trigger(this._element,He)})}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(F.trigger(this._element,ze).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Ue)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Ue),this._queueCallback(()=>{this._element.classList.remove(Ue),this._queueCallback(()=>{this._element.style.overflowY=e},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=b()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=b()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each(function(){const i=Ze.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}})}}F.on(document,Qe,'[data-bs-toggle="modal"]',function(t){const e=V.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),F.one(e,Be,t=>{t.defaultPrevented||F.one(e,He,()=>{d(this)&&this.focus()})});const i=V.findOne(".modal.show");i&&Ze.getInstance(i).hide(),Ze.getOrCreateInstance(e).toggle(this)}),Q(Ze),v(Ze);const ti=".bs.offcanvas",ei=".data-api",ii=`load${ti}${ei}`,si="show",ni="showing",oi="hiding",ri=".offcanvas.show",ai=`show${ti}`,li=`shown${ti}`,ci=`hide${ti}`,hi=`hidePrevented${ti}`,di=`hidden${ti}`,ui=`resize${ti}`,_i=`click${ti}${ei}`,gi=`keydown.dismiss${ti}`,fi={backdrop:!0,keyboard:!0,scroll:!1},mi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class pi extends R{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return fi}static get DefaultType(){return mi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||F.trigger(this._element,ai,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Me).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ni),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(si),this._element.classList.remove(ni),F.trigger(this._element,li,{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(F.trigger(this._element,ci).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(oi),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(si,oi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Me).reset(),F.trigger(this._element,di)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ce({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():F.trigger(this._element,hi)}:null})}_initializeFocusTrap(){return new Ie({trapElement:this._element})}_addEventListeners(){F.on(this._element,gi,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():F.trigger(this._element,hi))})}static jQueryInterface(t){return this.each(function(){const e=pi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}F.on(document,_i,'[data-bs-toggle="offcanvas"]',function(t){const e=V.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this))return;F.one(e,di,()=>{d(this)&&this.focus()});const i=V.findOne(ri);i&&i!==e&&pi.getInstance(i).hide(),pi.getOrCreateInstance(e).toggle(this)}),F.on(window,ii,()=>{for(const t of V.find(ri))pi.getOrCreateInstance(t).show()}),F.on(window,ui,()=>{for(const t of V.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&pi.getOrCreateInstance(t).hide()}),Q(pi),v(pi);const bi={"*":["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:[]},vi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),yi=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,wi=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!vi.has(i)||Boolean(yi.test(t.nodeValue)):e.filter(t=>t instanceof RegExp).some(t=>t.test(i))},Ai={allowList:bi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},Ei={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Ci={entry:"(string|element|function|null)",selector:"(string|element)"};class Ti extends W{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Ai}static get DefaultType(){return Ei}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(t=>this._resolvePossibleFunction(t)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Ci)}_setContent(t,e,i){const s=V.findOne(i,t);s&&((e=this._resolvePossibleFunction(e))?c(e)?this._putElementInTemplate(h(e),s):this._config.html?s.innerHTML=this._maybeSanitize(e):s.textContent=e:s.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const s=(new window.DOMParser).parseFromString(t,"text/html"),n=[].concat(...s.body.querySelectorAll("*"));for(const t of n){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const s=[].concat(...t.attributes),n=[].concat(e["*"]||[],e[i]||[]);for(const e of s)wi(e,n)||t.removeAttribute(e.nodeName)}return s.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return y(t,[void 0,this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const ki=new Set(["sanitize","allowList","sanitizeFn"]),$i="fade",Si="show",Li=".tooltip-inner",Oi=".modal",Ii="hide.bs.modal",Di="hover",Ni="focus",Pi="click",xi={AUTO:"auto",TOP:"top",RIGHT:b()?"left":"right",BOTTOM:"bottom",LEFT:b()?"right":"left"},Mi={allowList:bi,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:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},ji={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 Fi extends R{constructor(t,e){if(void 0===i)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)");super(t,e),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 Mi}static get DefaultType(){return ji}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),F.off(this._element.closest(Oi),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("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=F.trigger(this._element,this.constructor.eventName("show")),e=(_(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),F.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(Si),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))F.on(t,"mouseover",g);this._queueCallback(()=>{F.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!F.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Si),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))F.off(t,"mouseover",g);this._activeTrigger[Pi]=!1,this._activeTrigger[Ni]=!1,this._activeTrigger[Di]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),F.trigger(this._element,this.constructor.eventName("hidden")))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove($i,Si),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add($i),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Ti({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[Li]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains($i)}_isShown(){return this.tip&&this.tip.classList.contains(Si)}_createPopper(t){const e=y(this._config.placement,[this,t,this._element]),s=xi[e.toUpperCase()];return i.createPopper(this._element,t,this._getPopperConfig(s))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return y(t,[this._element,this._element])}_getPopperConfig(t){const e={placement:t,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:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...y(this._config.popperConfig,[void 0,e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)F.on(this._element,this.constructor.eventName("click"),this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger[Pi]=!(e._isShown()&&e._activeTrigger[Pi]),e.toggle()});else if("manual"!==e){const t=e===Di?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===Di?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");F.on(this._element,t,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?Ni:Di]=!0,e._enter()}),F.on(this._element,i,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?Ni:Di]=e._element.contains(t.relatedTarget),e._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},F.on(this._element.closest(Oi),Ii,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(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(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=q.getDataAttributes(this._element);for(const t of Object.keys(e))ki.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:h(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each(function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}v(Fi);const zi=".popover-header",Hi=".popover-body",Bi={...Fi.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},qi={...Fi.DefaultType,content:"(null|string|element|function)"};class Wi extends Fi{static get Default(){return Bi}static get DefaultType(){return qi}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[zi]:this._getTitle(),[Hi]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each(function(){const e=Wi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}v(Wi);const Ri=".bs.scrollspy",Ki=`activate${Ri}`,Vi=`click${Ri}`,Qi=`load${Ri}.data-api`,Xi="active",Yi="[href]",Ui=".nav-link",Gi=`${Ui}, .nav-item > ${Ui}, .list-group-item`,Ji={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Zi={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class ts extends R{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Ji}static get DefaultType(){return Zi}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=h(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map(t=>Number.parseFloat(t))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(F.off(this._config.target,Vi),F.on(this._config.target,Vi,Yi,t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,s=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:s,behavior:"smooth"});i.scrollTop=s}}))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},s=(this._rootElement||document.documentElement).scrollTop,n=s>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=s;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(n&&t){if(i(o),!s)return}else n||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=V.find(Yi,this._config.target);for(const e of t){if(!e.hash||u(e))continue;const t=V.findOne(decodeURI(e.hash),this._element);d(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Xi),this._activateParents(t),F.trigger(this._element,Ki,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))V.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Xi);else for(const e of V.parents(t,".nav, .list-group"))for(const t of V.prev(e,Gi))t.classList.add(Xi)}_clearActiveClass(t){t.classList.remove(Xi);const e=V.find(`${Yi}.${Xi}`,t);for(const t of e)t.classList.remove(Xi)}static jQueryInterface(t){return this.each(function(){const e=ts.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}F.on(window,Qi,()=>{for(const t of V.find('[data-bs-spy="scroll"]'))ts.getOrCreateInstance(t)}),v(ts);const es=".bs.tab",is=`hide${es}`,ss=`hidden${es}`,ns=`show${es}`,os=`shown${es}`,rs=`click${es}`,as=`keydown${es}`,ls=`load${es}`,cs="ArrowLeft",hs="ArrowRight",ds="ArrowUp",us="ArrowDown",_s="Home",gs="End",fs="active",ms="fade",ps="show",bs=".dropdown-toggle",vs=`:not(${bs})`,ys='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',ws=`.nav-link${vs}, .list-group-item${vs}, [role="tab"]${vs}, ${ys}`,As=`.${fs}[data-bs-toggle="tab"], .${fs}[data-bs-toggle="pill"], .${fs}[data-bs-toggle="list"]`;class Es extends R{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),F.on(this._element,as,t=>this._keydown(t)))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?F.trigger(e,is,{relatedTarget:t}):null;F.trigger(t,ns,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(fs),this._activate(V.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),F.trigger(t,os,{relatedTarget:e})):t.classList.add(ps)},t,t.classList.contains(ms)))}_deactivate(t,e){t&&(t.classList.remove(fs),t.blur(),this._deactivate(V.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),F.trigger(t,ss,{relatedTarget:e})):t.classList.remove(ps)},t,t.classList.contains(ms)))}_keydown(t){if(![cs,hs,ds,us,_s,gs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter(t=>!u(t));let i;if([_s,gs].includes(t.key))i=e[t.key===_s?0:e.length-1];else{const s=[hs,us].includes(t.key);i=A(e,t.target,s,!0)}i&&(i.focus({preventScroll:!0}),Es.getOrCreateInstance(i).show())}_getChildren(){return V.find(ws,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=V.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const s=(t,s)=>{const n=V.findOne(t,i);n&&n.classList.toggle(s,e)};s(bs,fs),s(".dropdown-menu",ps),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(fs)}_getInnerElement(t){return t.matches(ws)?t:V.findOne(ws,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each(function(){const e=Es.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}F.on(document,rs,ys,function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this)||Es.getOrCreateInstance(this).show()}),F.on(window,ls,()=>{for(const t of V.find(As))Es.getOrCreateInstance(t)}),v(Es);const Cs=".bs.toast",Ts=`mouseover${Cs}`,ks=`mouseout${Cs}`,$s=`focusin${Cs}`,Ss=`focusout${Cs}`,Ls=`hide${Cs}`,Os=`hidden${Cs}`,Is=`show${Cs}`,Ds=`shown${Cs}`,Ns="hide",Ps="show",xs="showing",Ms={animation:"boolean",autohide:"boolean",delay:"number"},js={animation:!0,autohide:!0,delay:5e3};class Fs extends R{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return js}static get DefaultType(){return Ms}static get NAME(){return"toast"}show(){F.trigger(this._element,Is).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Ns),f(this._element),this._element.classList.add(Ps,xs),this._queueCallback(()=>{this._element.classList.remove(xs),F.trigger(this._element,Ds),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this.isShown()&&(F.trigger(this._element,Ls).defaultPrevented||(this._element.classList.add(xs),this._queueCallback(()=>{this._element.classList.add(Ns),this._element.classList.remove(xs,Ps),F.trigger(this._element,Os)},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Ps),super.dispose()}isShown(){return this._element.classList.contains(Ps)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){F.on(this._element,Ts,t=>this._onInteraction(t,!0)),F.on(this._element,ks,t=>this._onInteraction(t,!1)),F.on(this._element,$s,t=>this._onInteraction(t,!0)),F.on(this._element,Ss,t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each(function(){const e=Fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}})}}return Q(Fs),v(Fs),{Alert:G,Button:Z,Carousel:Nt,Collapse:Qt,Dropdown:be,Modal:Ze,Offcanvas:pi,Popover:Wi,ScrollSpy:ts,Tab:Es,Toast:Fs,Tooltip:Fi}}); //# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map b/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map index 4d437152..df4b8491 100644 --- a/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map +++ b/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map @@ -1 +1 @@ -{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","boundary","display","offset","popperConfig","reference","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","destroy","update","Popper","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","scroll","Offcanvas","blur","completeCallback","position","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","allowList","content","extraClass","html","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","fallbackPlacements","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","Object","prototype","toString","call","toLowerCase","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","JSON","parse","decodeURIComponent","normalizeDataKey","chr","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ARROW_LEFT_KEY$1","ARROW_RIGHT_KEY$1","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","boundary","display","offset","popperConfig","reference","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","destroy","update","Popper","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","scroll","Offcanvas","blur","completeCallback","position","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","allowList","content","extraClass","html","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","fallbackPlacements","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n // Private\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n // Private\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [undefined, this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element, this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK])\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"mappings":";;;;;sjBAWMA,EAAa,IAAIC,IAEvBC,EAAe,CACbC,IAAIC,EAASC,EAAKC,GACXN,EAAWO,IAAIH,IAClBJ,EAAWG,IAAIC,EAAS,IAAIH,KAG9B,MAAMO,EAAcR,EAAWS,IAAIL,GAI9BI,EAAYD,IAAIF,IAA6B,IAArBG,EAAYE,KAMzCF,EAAYL,IAAIE,EAAKC,GAJnBK,QAAQC,MAAM,+EAA+EC,MAAMC,KAAKN,EAAYO,QAAQ,MAKhI,EAEAN,IAAGA,CAACL,EAASC,IACPL,EAAWO,IAAIH,IACVJ,EAAWS,IAAIL,GAASK,IAAIJ,IAG9B,KAGTW,OAAOZ,EAASC,GACd,IAAKL,EAAWO,IAAIH,GAClB,OAGF,MAAMI,EAAcR,EAAWS,IAAIL,GAEnCI,EAAYS,OAAOZ,GAGM,IAArBG,EAAYE,MACdV,EAAWiB,OAAOb,EAEtB,GC5CIc,EAAiB,gBAOjBC,EAAgBC,IAChBA,GAAYC,OAAOC,KAAOD,OAAOC,IAAIC,SAEvCH,EAAWA,EAASI,QAAQ,gBAAiB,CAACC,EAAOC,IAAO,IAAIJ,IAAIC,OAAOG,OAGtEN,GAIHO,EAASC,GACTA,QACK,GAAGA,IAGLC,OAAOC,UAAUC,SAASC,KAAKJ,GAAQH,MAAM,eAAe,GAAGQ,cAsClEC,EAAuB9B,IAC3BA,EAAQ+B,cAAc,IAAIC,MAAMlB,KAG5BmB,EAAYT,MACXA,GAA4B,iBAAXA,UAIO,IAAlBA,EAAOU,SAChBV,EAASA,EAAO,SAGgB,IAApBA,EAAOW,UAGjBC,EAAaZ,GAEbS,EAAUT,GACLA,EAAOU,OAASV,EAAO,GAAKA,EAGf,iBAAXA,GAAuBA,EAAOa,OAAS,EACzCC,SAASC,cAAcxB,EAAcS,IAGvC,KAGHgB,EAAYxC,IAChB,IAAKiC,EAAUjC,IAAgD,IAApCA,EAAQyC,iBAAiBJ,OAClD,OAAO,EAGT,MAAMK,EAAgF,YAA7DC,iBAAiB3C,GAAS4C,iBAAiB,cAE9DC,EAAgB7C,EAAQ8C,QAAQ,uBAEtC,IAAKD,EACH,OAAOH,EAGT,GAAIG,IAAkB7C,EAAS,CAC7B,MAAM+C,EAAU/C,EAAQ8C,QAAQ,WAChC,GAAIC,GAAWA,EAAQC,aAAeH,EACpC,OAAO,EAGT,GAAgB,OAAZE,EACF,OAAO,CAEX,CAEA,OAAOL,GAGHO,EAAajD,IACZA,GAAWA,EAAQmC,WAAae,KAAKC,gBAItCnD,EAAQoD,UAAUC,SAAS,mBAIC,IAArBrD,EAAQsD,SACVtD,EAAQsD,SAGVtD,EAAQuD,aAAa,aAAoD,UAArCvD,EAAQwD,aAAa,aAG5DC,EAAiBzD,IACrB,IAAKsC,SAASoB,gBAAgBC,aAC5B,OAAO,KAIT,GAAmC,mBAAxB3D,EAAQ4D,YAA4B,CAC7C,MAAMC,EAAO7D,EAAQ4D,cACrB,OAAOC,aAAgBC,WAAaD,EAAO,IAC7C,CAEA,OAAI7D,aAAmB8D,WACd9D,EAIJA,EAAQgD,WAINS,EAAezD,EAAQgD,YAHrB,MAMLe,EAAOA,OAUPC,EAAShE,IACbA,EAAQiE,cAGJC,EAAYA,IACZjD,OAAOkD,SAAW7B,SAAS8B,KAAKb,aAAa,qBACxCtC,OAAOkD,OAGT,KAGHE,EAA4B,GAmB5BC,EAAQA,IAAuC,QAAjChC,SAASoB,gBAAgBa,IAEvCC,EAAqBC,IAnBAC,QAoBN,KACjB,MAAMC,EAAIT,IAEV,GAAIS,EAAG,CACL,MAAMC,EAAOH,EAAOI,KACdC,EAAqBH,EAAEI,GAAGH,GAChCD,EAAEI,GAAGH,GAAQH,EAAOO,gBACpBL,EAAEI,GAAGH,GAAMK,YAAcR,EACzBE,EAAEI,GAAGH,GAAMM,WAAa,KACtBP,EAAEI,GAAGH,GAAQE,EACNL,EAAOO,gBAElB,GA/B0B,YAAxB1C,SAAS6C,YAENd,EAA0BhC,QAC7BC,SAAS8C,iBAAiB,mBAAoB,KAC5C,IAAK,MAAMV,KAAYL,EACrBK,MAKNL,EAA0BgB,KAAKX,IAE/BA,KAuBEY,EAAUA,CAACC,EAAkBC,EAAO,GAAIC,EAAeF,IACxB,mBAArBA,EAAkCA,EAAiB3D,QAAQ4D,GAAQC,EAG7EC,EAAyBA,CAAChB,EAAUiB,EAAmBC,GAAoB,KAC/E,IAAKA,EAEH,YADAN,EAAQZ,GAIV,MACMmB,EA7LiC7F,KACvC,IAAKA,EACH,OAAO,EAIT,IAAI8F,mBAAEA,EAAkBC,gBAAEA,GAAoB9E,OAAO0B,iBAAiB3C,GAEtE,MAAMgG,EAA0BC,OAAOC,WAAWJ,GAC5CK,EAAuBF,OAAOC,WAAWH,GAG/C,OAAKC,GAA4BG,GAKjCL,EAAqBA,EAAmBM,MAAM,KAAK,GACnDL,EAAkBA,EAAgBK,MAAM,KAAK,GAxDf,KA0DtBH,OAAOC,WAAWJ,GAAsBG,OAAOC,WAAWH,KAPzD,GAgLgBM,CAAiCV,GADlC,EAGxB,IAAIW,GAAS,EAEb,MAAMC,EAAUA,EAAGC,aACbA,IAAWb,IAIfW,GAAS,EACTX,EAAkBc,oBAAoB3F,EAAgByF,GACtDjB,EAAQZ,KAGViB,EAAkBP,iBAAiBtE,EAAgByF,GACnDG,WAAW,KACJJ,GACHxE,EAAqB6D,IAEtBE,IAYCc,EAAuBA,CAACC,EAAMC,EAAeC,EAAeC,KAChE,MAAMC,EAAaJ,EAAKvE,OACxB,IAAI4E,EAAQL,EAAKM,QAAQL,GAIzB,OAAc,IAAVI,GACMH,GAAiBC,EAAiBH,EAAKI,EAAa,GAAKJ,EAAK,IAGxEK,GAASH,EAAgB,GAAI,EAEzBC,IACFE,GAASA,EAAQD,GAAcA,GAG1BJ,EAAKO,KAAKC,IAAI,EAAGD,KAAKE,IAAIJ,EAAOD,EAAa,OC7QjDM,EAAiB,qBACjBC,EAAiB,OACjBC,EAAgB,SAChBC,EAAgB,GACtB,IAAIC,EAAW,EACf,MAAMC,EAAe,CACnBC,WAAY,YACZC,WAAY,YAGRC,EAAe,IAAIC,IAAI,CAC3B,QACA,WACA,UACA,YACA,cACA,aACA,iBACA,YACA,WACA,YACA,cACA,YACA,UACA,WACA,QACA,oBACA,aACA,YACA,WACA,cACA,cACA,cACA,YACA,eACA,gBACA,eACA,gBACA,aACA,QACA,OACA,SACA,QACA,SACA,SACA,UACA,WACA,OACA,SACA,eACA,SACA,OACA,mBACA,mBACA,QACA,QACA,WAOF,SAASC,EAAahI,EAASiI,GAC7B,OAAQA,GAAO,GAAGA,MAAQP,OAAiB1H,EAAQ0H,UAAYA,GACjE,CAEA,SAASQ,EAAiBlI,GACxB,MAAMiI,EAAMD,EAAahI,GAKzB,OAHAA,EAAQ0H,SAAWO,EACnBR,EAAcQ,GAAOR,EAAcQ,IAAQ,GAEpCR,EAAcQ,EACvB,CAoCA,SAASE,EAAYC,EAAQC,EAAUC,EAAqB,MAC1D,OAAO7G,OAAO8G,OAAOH,GAClBI,KAAKC,GAASA,EAAMJ,WAAaA,GAAYI,EAAMH,qBAAuBA,EAC/E,CAEA,SAASI,EAAoBC,EAAmBpC,EAASqC,GACvD,MAAMC,EAAiC,iBAAZtC,EAErB8B,EAAWQ,EAAcD,EAAsBrC,GAAWqC,EAChE,IAAIE,EAAYC,EAAaJ,GAM7B,OAJKb,EAAa3H,IAAI2I,KACpBA,EAAYH,GAGP,CAACE,EAAaR,EAAUS,EACjC,CAEA,SAASE,EAAWhJ,EAAS2I,EAAmBpC,EAASqC,EAAoBK,GAC3E,GAAiC,iBAAtBN,IAAmC3I,EAC5C,OAGF,IAAK6I,EAAaR,EAAUS,GAAaJ,EAAoBC,EAAmBpC,EAASqC,GAIzF,GAAID,KAAqBhB,EAAc,CACrC,MAAMuB,EAAenE,GACZ,SAAU0D,GACf,IAAKA,EAAMU,eAAkBV,EAAMU,gBAAkBV,EAAMW,iBAAmBX,EAAMW,eAAe/F,SAASoF,EAAMU,eAChH,OAAOpE,EAAGnD,KAAKyH,KAAMZ,EAEzB,EAGFJ,EAAWa,EAAab,EAC1B,CAEA,MAAMD,EAASF,EAAiBlI,GAC1BsJ,EAAWlB,EAAOU,KAAeV,EAAOU,GAAa,IACrDS,EAAmBpB,EAAYmB,EAAUjB,EAAUQ,EAActC,EAAU,MAEjF,GAAIgD,EAGF,YAFAA,EAAiBN,OAASM,EAAiBN,QAAUA,GAKvD,MAAMhB,EAAMD,EAAaK,EAAUM,EAAkBvH,QAAQkG,EAAgB,KACvEvC,EAAK8D,EAxEb,SAAoC7I,EAASgB,EAAU+D,GACrD,OAAO,SAASwB,EAAQkC,GACtB,MAAMe,EAAcxJ,EAAQyJ,iBAAiBzI,GAE7C,IAAK,IAAIwF,OAAEA,GAAWiC,EAAOjC,GAAUA,IAAW6C,KAAM7C,EAASA,EAAOxD,WACtE,IAAK,MAAM0G,KAAcF,EACvB,GAAIE,IAAelD,EAUnB,OANAmD,EAAWlB,EAAO,CAAEW,eAAgB5C,IAEhCD,EAAQ0C,QACVW,EAAaC,IAAI7J,EAASyI,EAAMqB,KAAM9I,EAAU+D,GAG3CA,EAAGgF,MAAMvD,EAAQ,CAACiC,GAG/B,CACF,CAqDIuB,CAA2BhK,EAASuG,EAAS8B,GArFjD,SAA0BrI,EAAS+E,GACjC,OAAO,SAASwB,EAAQkC,GAOtB,OANAkB,EAAWlB,EAAO,CAAEW,eAAgBpJ,IAEhCuG,EAAQ0C,QACVW,EAAaC,IAAI7J,EAASyI,EAAMqB,KAAM/E,GAGjCA,EAAGgF,MAAM/J,EAAS,CAACyI,GAC5B,CACF,CA4EIwB,CAAiBjK,EAASqI,GAE5BtD,EAAGuD,mBAAqBO,EAActC,EAAU,KAChDxB,EAAGsD,SAAWA,EACdtD,EAAGkE,OAASA,EACZlE,EAAG2C,SAAWO,EACdqB,EAASrB,GAAOlD,EAEhB/E,EAAQoF,iBAAiB0D,EAAW/D,EAAI8D,EAC1C,CAEA,SAASqB,EAAclK,EAASoI,EAAQU,EAAWvC,EAAS+B,GAC1D,MAAMvD,EAAKoD,EAAYC,EAAOU,GAAYvC,EAAS+B,GAE9CvD,IAIL/E,EAAQyG,oBAAoBqC,EAAW/D,EAAIoF,QAAQ7B,WAC5CF,EAAOU,GAAW/D,EAAG2C,UAC9B,CAEA,SAAS0C,EAAyBpK,EAASoI,EAAQU,EAAWuB,GAC5D,MAAMC,EAAoBlC,EAAOU,IAAc,GAE/C,IAAK,MAAOyB,EAAY9B,KAAUhH,OAAO+I,QAAQF,GAC3CC,EAAWE,SAASJ,IACtBH,EAAclK,EAASoI,EAAQU,EAAWL,EAAMJ,SAAUI,EAAMH,mBAGtE,CAEA,SAASS,EAAaN,GAGpB,OADAA,EAAQA,EAAMrH,QAAQmG,EAAgB,IAC/BI,EAAac,IAAUA,CAChC,CAEA,MAAMmB,EAAe,CACnBc,GAAG1K,EAASyI,EAAOlC,EAASqC,GAC1BI,EAAWhJ,EAASyI,EAAOlC,EAASqC,GAAoB,EAC1D,EAEA+B,IAAI3K,EAASyI,EAAOlC,EAASqC,GAC3BI,EAAWhJ,EAASyI,EAAOlC,EAASqC,GAAoB,EAC1D,EAEAiB,IAAI7J,EAAS2I,EAAmBpC,EAASqC,GACvC,GAAiC,iBAAtBD,IAAmC3I,EAC5C,OAGF,MAAO6I,EAAaR,EAAUS,GAAaJ,EAAoBC,EAAmBpC,EAASqC,GACrFgC,EAAc9B,IAAcH,EAC5BP,EAASF,EAAiBlI,GAC1BsK,EAAoBlC,EAAOU,IAAc,GACzC+B,EAAclC,EAAkBmC,WAAW,KAEjD,QAAwB,IAAbzC,EAAX,CAUA,GAAIwC,EACF,IAAK,MAAME,KAAgBtJ,OAAOd,KAAKyH,GACrCgC,EAAyBpK,EAASoI,EAAQ2C,EAAcpC,EAAkBqC,MAAM,IAIpF,IAAK,MAAOC,EAAaxC,KAAUhH,OAAO+I,QAAQF,GAAoB,CACpE,MAAMC,EAAaU,EAAY7J,QAAQoG,EAAe,IAEjDoD,IAAejC,EAAkB8B,SAASF,IAC7CL,EAAclK,EAASoI,EAAQU,EAAWL,EAAMJ,SAAUI,EAAMH,mBAEpE,CAdA,KARA,CAEE,IAAK7G,OAAOd,KAAK2J,GAAmBjI,OAClC,OAGF6H,EAAclK,EAASoI,EAAQU,EAAWT,EAAUQ,EAActC,EAAU,KAE9E,CAeF,EAEA2E,QAAQlL,EAASyI,EAAOjD,GACtB,GAAqB,iBAAViD,IAAuBzI,EAChC,OAAO,KAGT,MAAM2E,EAAIT,IAIV,IAAIiH,EAAc,KACdC,GAAU,EACVC,GAAiB,EACjBC,GAAmB,EALH7C,IADFM,EAAaN,IAQZ9D,IACjBwG,EAAcxG,EAAE3C,MAAMyG,EAAOjD,GAE7Bb,EAAE3E,GAASkL,QAAQC,GACnBC,GAAWD,EAAYI,uBACvBF,GAAkBF,EAAYK,gCAC9BF,EAAmBH,EAAYM,sBAGjC,MAAMC,EAAM/B,EAAW,IAAI3H,MAAMyG,EAAO,CAAE2C,UAASO,YAAY,IAASnG,GAcxE,OAZI8F,GACFI,EAAIE,iBAGFP,GACFrL,EAAQ+B,cAAc2J,GAGpBA,EAAIJ,kBAAoBH,GAC1BA,EAAYS,iBAGPF,CACT,GAGF,SAAS/B,EAAWkC,EAAKC,EAAO,IAC9B,IAAK,MAAO7L,EAAK8L,KAAUtK,OAAO+I,QAAQsB,GACxC,IACED,EAAI5L,GAAO8L,CACb,CAAE,MAAAC,GACAvK,OAAOwK,eAAeJ,EAAK5L,EAAK,CAC9BiM,cAAc,EACd7L,IAAGA,IACM0L,GAGb,CAGF,OAAOF,CACT,CCnTA,SAASM,EAAcJ,GACrB,GAAc,SAAVA,EACF,OAAO,EAGT,GAAc,UAAVA,EACF,OAAO,EAGT,GAAIA,IAAU9F,OAAO8F,GAAOpK,WAC1B,OAAOsE,OAAO8F,GAGhB,GAAc,KAAVA,GAA0B,SAAVA,EAClB,OAAO,KAGT,GAAqB,iBAAVA,EACT,OAAOA,EAGT,IACE,OAAOK,KAAKC,MAAMC,mBAAmBP,GACvC,CAAE,MAAAC,GACA,OAAOD,CACT,CACF,CAEA,SAASQ,EAAiBtM,GACxB,OAAOA,EAAImB,QAAQ,SAAUoL,GAAO,IAAIA,EAAI3K,gBAC9C,CAEA,MAAM4K,EAAc,CAClBC,iBAAiB1M,EAASC,EAAK8L,GAC7B/L,EAAQ2M,aAAa,WAAWJ,EAAiBtM,KAAQ8L,EAC3D,EAEAa,oBAAoB5M,EAASC,GAC3BD,EAAQ6M,gBAAgB,WAAWN,EAAiBtM,KACtD,EAEA6M,kBAAkB9M,GAChB,IAAKA,EACH,MAAO,GAGT,MAAM+M,EAAa,GACbC,EAASvL,OAAOd,KAAKX,EAAQiN,SAASC,OAAOjN,GAAOA,EAAI6K,WAAW,QAAU7K,EAAI6K,WAAW,aAElG,IAAK,MAAM7K,KAAO+M,EAAQ,CACxB,IAAIG,EAAUlN,EAAImB,QAAQ,MAAO,IACjC+L,EAAUA,EAAQC,OAAO,GAAGvL,cAAgBsL,EAAQnC,MAAM,GAC1D+B,EAAWI,GAAWhB,EAAcnM,EAAQiN,QAAQhN,GACtD,CAEA,OAAO8M,CACT,EAEAM,iBAAgBA,CAACrN,EAASC,IACjBkM,EAAcnM,EAAQwD,aAAa,WAAW+I,EAAiBtM,QCpD1E,MAAMqN,EAEJ,kBAAWC,GACT,MAAO,EACT,CAEA,sBAAWC,GACT,MAAO,EACT,CAEA,eAAW3I,GACT,MAAM,IAAI4I,MAAM,sEAClB,CAEAC,WAAWC,GAIT,OAHAA,EAAStE,KAAKuE,gBAAgBD,GAC9BA,EAAStE,KAAKwE,kBAAkBF,GAChCtE,KAAKyE,iBAAiBH,GACfA,CACT,CAEAE,kBAAkBF,GAChB,OAAOA,CACT,CAEAC,gBAAgBD,EAAQ3N,GACtB,MAAM+N,EAAa9L,EAAUjC,GAAWyM,EAAYY,iBAAiBrN,EAAS,UAAY,GAE1F,MAAO,IACFqJ,KAAK2E,YAAYT,WACM,iBAAfQ,EAA0BA,EAAa,MAC9C9L,EAAUjC,GAAWyM,EAAYK,kBAAkB9M,GAAW,MAC5C,iBAAX2N,EAAsBA,EAAS,GAE9C,CAEAG,iBAAiBH,EAAQM,EAAc5E,KAAK2E,YAAYR,aACtD,IAAK,MAAOU,EAAUC,KAAkB1M,OAAO+I,QAAQyD,GAAc,CACnE,MAAMlC,EAAQ4B,EAAOO,GACfE,EAAYnM,EAAU8J,GAAS,UAAYxK,EAAOwK,GAExD,IAAK,IAAIsC,OAAOF,GAAeG,KAAKF,GAClC,MAAM,IAAIG,UACR,GAAGlF,KAAK2E,YAAYnJ,KAAK2J,0BAA0BN,qBAA4BE,yBAAiCD,MAGtH,CACF,ECvCF,MAAMM,UAAsBnB,EAC1BU,YAAYhO,EAAS2N,GACnBe,SAEA1O,EAAUoC,EAAWpC,MAKrBqJ,KAAKsF,SAAW3O,EAChBqJ,KAAKuF,QAAUvF,KAAKqE,WAAWC,GAE/B7N,EAAKC,IAAIsJ,KAAKsF,SAAUtF,KAAK2E,YAAYa,SAAUxF,MACrD,CAGAyF,UACEhP,EAAKc,OAAOyI,KAAKsF,SAAUtF,KAAK2E,YAAYa,UAC5CjF,EAAaC,IAAIR,KAAKsF,SAAUtF,KAAK2E,YAAYe,WAEjD,IAAK,MAAMC,KAAgBvN,OAAOwN,oBAAoB5F,MACpDA,KAAK2F,GAAgB,IAEzB,CAGAE,eAAexK,EAAU1E,EAASmP,GAAa,GAC7CzJ,EAAuBhB,EAAU1E,EAASmP,EAC5C,CAEAzB,WAAWC,GAIT,OAHAA,EAAStE,KAAKuE,gBAAgBD,EAAQtE,KAAKsF,UAC3ChB,EAAStE,KAAKwE,kBAAkBF,GAChCtE,KAAKyE,iBAAiBH,GACfA,CACT,CAGA,kBAAOyB,CAAYpP,GACjB,OAAOF,EAAKO,IAAI+B,EAAWpC,GAAUqJ,KAAKwF,SAC5C,CAEA,0BAAOQ,CAAoBrP,EAAS2N,EAAS,IAC3C,OAAOtE,KAAK+F,YAAYpP,IAAY,IAAIqJ,KAAKrJ,EAA2B,iBAAX2N,EAAsBA,EAAS,KAC9F,CAEA,kBAAW2B,GACT,MArDY,OAsDd,CAEA,mBAAWT,GACT,MAAO,MAAMxF,KAAKxE,MACpB,CAEA,oBAAWkK,GACT,MAAO,IAAI1F,KAAKwF,UAClB,CAEA,gBAAOU,CAAU3K,GACf,MAAO,GAAGA,IAAOyE,KAAK0F,WACxB,ECzEF,MAAMS,EAAcxP,IAClB,IAAIgB,EAAWhB,EAAQwD,aAAa,kBAEpC,IAAKxC,GAAyB,MAAbA,EAAkB,CACjC,IAAIyO,EAAgBzP,EAAQwD,aAAa,QAMzC,IAAKiM,IAAmBA,EAAchF,SAAS,OAASgF,EAAc3E,WAAW,KAC/E,OAAO,KAIL2E,EAAchF,SAAS,OAASgF,EAAc3E,WAAW,OAC3D2E,EAAgB,IAAIA,EAAcrJ,MAAM,KAAK,MAG/CpF,EAAWyO,GAAmC,MAAlBA,EAAwBA,EAAcC,OAAS,IAC7E,CAEA,OAAO1O,EAAWA,EAASoF,MAAM,KAAKuJ,IAAIC,GAAO7O,EAAc6O,IAAMC,KAAK,KAAO,MAG7EC,EAAiB,CACrBtH,KAAIA,CAACxH,EAAUhB,EAAUsC,SAASoB,kBACzB,GAAGqM,UAAUC,QAAQtO,UAAU+H,iBAAiB7H,KAAK5B,EAASgB,IAGvEiP,QAAOA,CAACjP,EAAUhB,EAAUsC,SAASoB,kBAC5BsM,QAAQtO,UAAUa,cAAcX,KAAK5B,EAASgB,GAGvDkP,SAAQA,CAAClQ,EAASgB,IACT,GAAG+O,UAAU/P,EAAQkQ,UAAUhD,OAAOiD,GAASA,EAAMC,QAAQpP,IAGtEqP,QAAQrQ,EAASgB,GACf,MAAMqP,EAAU,GAChB,IAAIC,EAAWtQ,EAAQgD,WAAWF,QAAQ9B,GAE1C,KAAOsP,GACLD,EAAQhL,KAAKiL,GACbA,EAAWA,EAAStN,WAAWF,QAAQ9B,GAGzC,OAAOqP,CACT,EAEAE,KAAKvQ,EAASgB,GACZ,IAAIwP,EAAWxQ,EAAQyQ,uBAEvB,KAAOD,GAAU,CACf,GAAIA,EAASJ,QAAQpP,GACnB,MAAO,CAACwP,GAGVA,EAAWA,EAASC,sBACtB,CAEA,MAAO,EACT,EAEAC,KAAK1Q,EAASgB,GACZ,IAAI0P,EAAO1Q,EAAQ2Q,mBAEnB,KAAOD,GAAM,CACX,GAAIA,EAAKN,QAAQpP,GACf,MAAO,CAAC0P,GAGVA,EAAOA,EAAKC,kBACd,CAEA,MAAO,EACT,EAEAC,kBAAkB5Q,GAChB,MAAM6Q,EAAa,CACjB,IACA,SACA,QACA,WACA,SACA,UACA,aACA,4BACAlB,IAAI3O,GAAY,GAAGA,0BAAiC6O,KAAK,KAE3D,OAAOxG,KAAKb,KAAKqI,EAAY7Q,GAASkN,OAAO4D,IAAO7N,EAAW6N,IAAOtO,EAAUsO,GAClF,EAEAC,uBAAuB/Q,GACrB,MAAMgB,EAAWwO,EAAYxP,GAE7B,OAAIgB,GACK8O,EAAeG,QAAQjP,GAAYA,EAGrC,IACT,EAEAgQ,uBAAuBhR,GACrB,MAAMgB,EAAWwO,EAAYxP,GAE7B,OAAOgB,EAAW8O,EAAeG,QAAQjP,GAAY,IACvD,EAEAiQ,gCAAgCjR,GAC9B,MAAMgB,EAAWwO,EAAYxP,GAE7B,OAAOgB,EAAW8O,EAAetH,KAAKxH,GAAY,EACpD,GC/GIkQ,EAAuBA,CAACC,EAAWC,EAAS,UAChD,MAAMC,EAAa,gBAAgBF,EAAUpC,YACvCnK,EAAOuM,EAAUtM,KAEvB+E,EAAac,GAAGpI,SAAU+O,EAAY,qBAAqBzM,MAAU,SAAU6D,GAK7E,GAJI,CAAC,IAAK,QAAQgC,SAASpB,KAAKiI,UAC9B7I,EAAMmD,iBAGJ3I,EAAWoG,MACb,OAGF,MAAM7C,EAASsJ,EAAekB,uBAAuB3H,OAASA,KAAKvG,QAAQ,IAAI8B,KAC9DuM,EAAU9B,oBAAoB7I,GAGtC4K,IACX,ICXIrC,EAAY,YAEZwC,EAAc,QAAQxC,IACtByC,EAAe,SAASzC,IAQ9B,MAAM0C,UAAchD,EAElB,eAAW5J,GACT,MAhBS,OAiBX,CAGA6M,QAGE,GAFmB9H,EAAasB,QAAQ7B,KAAKsF,SAAU4C,GAExCjG,iBACb,OAGFjC,KAAKsF,SAASvL,UAAUxC,OApBJ,QAsBpB,MAAMuO,EAAa9F,KAAKsF,SAASvL,UAAUC,SAvBvB,QAwBpBgG,KAAK6F,eAAe,IAAM7F,KAAKsI,kBAAmBtI,KAAKsF,SAAUQ,EACnE,CAGAwC,kBACEtI,KAAKsF,SAAS/N,SACdgJ,EAAasB,QAAQ7B,KAAKsF,SAAU6C,GACpCnI,KAAKyF,SACP,CAGA,sBAAO9J,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOJ,EAAMpC,oBAAoBhG,MAEvC,GAAsB,iBAAXsE,EAAX,CAIA,QAAqBmE,IAAjBD,EAAKlE,IAAyBA,EAAO7C,WAAW,MAAmB,gBAAX6C,EAC1D,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,GAAQtE,KANb,CAOF,EACF,EAOF6H,EAAqBO,EAAO,SAM5BjN,EAAmBiN,GCrEnB,MAMMM,EAAuB,4BAO7B,MAAMC,UAAevD,EAEnB,eAAW5J,GACT,MAhBS,QAiBX,CAGAoN,SAEE5I,KAAKsF,SAAShC,aAAa,eAAgBtD,KAAKsF,SAASvL,UAAU6O,OAjB7C,UAkBxB,CAGA,sBAAOjN,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOG,EAAO3C,oBAAoBhG,MAEzB,WAAXsE,GACFkE,EAAKlE,IAET,EACF,EAOF/D,EAAac,GAAGpI,SAlCa,2BAkCmByP,EAAsBtJ,IACpEA,EAAMmD,iBAEN,MAAMsG,EAASzJ,EAAMjC,OAAO1D,QAAQiP,GACvBC,EAAO3C,oBAAoB6C,GAEnCD,WAOPzN,EAAmBwN,GCtDnB,MACMjD,GAAY,YACZoD,GAAmB,aAAapD,KAChCqD,GAAkB,YAAYrD,KAC9BsD,GAAiB,WAAWtD,KAC5BuD,GAAoB,cAAcvD,KAClCwD,GAAkB,YAAYxD,KAM9BxB,GAAU,CACdiF,YAAa,KACbC,aAAc,KACdC,cAAe,MAGXlF,GAAc,CAClBgF,YAAa,kBACbC,aAAc,kBACdC,cAAe,mBAOjB,MAAMC,WAAcrF,EAClBU,YAAYhO,EAAS2N,GACnBe,QACArF,KAAKsF,SAAW3O,EAEXA,GAAY2S,GAAMC,gBAIvBvJ,KAAKuF,QAAUvF,KAAKqE,WAAWC,GAC/BtE,KAAKwJ,QAAU,EACfxJ,KAAKyJ,sBAAwB3I,QAAQlJ,OAAO8R,cAC5C1J,KAAK2J,cACP,CAGA,kBAAWzF,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MArDS,OAsDX,CAGAiK,UACElF,EAAaC,IAAIR,KAAKsF,SAAUI,GAClC,CAGAkE,OAAOxK,GACAY,KAAKyJ,sBAMNzJ,KAAK6J,wBAAwBzK,KAC/BY,KAAKwJ,QAAUpK,EAAM0K,SANrB9J,KAAKwJ,QAAUpK,EAAM2K,QAAQ,GAAGD,OAQpC,CAEAE,KAAK5K,GACCY,KAAK6J,wBAAwBzK,KAC/BY,KAAKwJ,QAAUpK,EAAM0K,QAAU9J,KAAKwJ,SAGtCxJ,KAAKiK,eACLhO,EAAQ+D,KAAKuF,QAAQ4D,YACvB,CAEAe,MAAM9K,GACJY,KAAKwJ,QAAUpK,EAAM2K,SAAW3K,EAAM2K,QAAQ/Q,OAAS,EACrD,EACAoG,EAAM2K,QAAQ,GAAGD,QAAU9J,KAAKwJ,OACpC,CAEAS,eACE,MAAME,EAAYrM,KAAKsM,IAAIpK,KAAKwJ,SAEhC,GAAIW,GAlFgB,GAmFlB,OAGF,MAAME,EAAYF,EAAYnK,KAAKwJ,QAEnCxJ,KAAKwJ,QAAU,EAEVa,GAILpO,EAAQoO,EAAY,EAAIrK,KAAKuF,QAAQ8D,cAAgBrJ,KAAKuF,QAAQ6D,aACpE,CAEAO,cACM3J,KAAKyJ,uBACPlJ,EAAac,GAAGrB,KAAKsF,SAAU2D,GAAmB7J,GAASY,KAAK4J,OAAOxK,IACvEmB,EAAac,GAAGrB,KAAKsF,SAAU4D,GAAiB9J,GAASY,KAAKgK,KAAK5K,IAEnEY,KAAKsF,SAASvL,UAAUuQ,IAvGG,mBAyG3B/J,EAAac,GAAGrB,KAAKsF,SAAUwD,GAAkB1J,GAASY,KAAK4J,OAAOxK,IACtEmB,EAAac,GAAGrB,KAAKsF,SAAUyD,GAAiB3J,GAASY,KAAKkK,MAAM9K,IACpEmB,EAAac,GAAGrB,KAAKsF,SAAU0D,GAAgB5J,GAASY,KAAKgK,KAAK5K,IAEtE,CAEAyK,wBAAwBzK,GACtB,OAAOY,KAAKyJ,wBAjHS,QAiHiBrK,EAAMmL,aAlHrB,UAkHyDnL,EAAMmL,YACxF,CAGA,kBAAOhB,GACL,MAAO,iBAAkBtQ,SAASoB,iBAAmBmQ,UAAUC,eAAiB,CAClF,ECrHF,MAEM/E,GAAY,eACZgF,GAAe,YAEfC,GAAiB,YACjBC,GAAkB,aAGlBC,GAAa,OACbC,GAAa,OACbC,GAAiB,OACjBC,GAAkB,QAElBC,GAAc,QAAQvF,KACtBwF,GAAa,OAAOxF,KACpByF,GAAgB,UAAUzF,KAC1B0F,GAAmB,aAAa1F,KAChC2F,GAAmB,aAAa3F,KAChC4F,GAAmB,YAAY5F,KAC/B6F,GAAsB,OAAO7F,KAAYgF,KACzCc,GAAuB,QAAQ9F,KAAYgF,KAE3Ce,GAAsB,WACtBC,GAAoB,SAOpBC,GAAkB,UAClBC,GAAgB,iBAChBC,GAAuBF,GAAkBC,GAMzCE,GAAmB,CACvBC,CAACpB,IAAiBK,GAClBgB,CAACpB,IAAkBG,IAGf7G,GAAU,CACd+H,SAAU,IACVC,UAAU,EACVC,MAAO,QACPC,MAAM,EACNC,OAAO,EACPC,MAAM,GAGFnI,GAAc,CAClB8H,SAAU,mBACVC,SAAU,UACVC,MAAO,mBACPC,KAAM,mBACNC,MAAO,UACPC,KAAM,WAOR,MAAMC,WAAiBnH,EACrBT,YAAYhO,EAAS2N,GACnBe,MAAM1O,EAAS2N,GAEftE,KAAKwM,UAAY,KACjBxM,KAAKyM,eAAiB,KACtBzM,KAAK0M,YAAa,EAClB1M,KAAK2M,aAAe,KACpB3M,KAAK4M,aAAe,KAEpB5M,KAAK6M,mBAAqBpG,EAAeG,QAzCjB,uBAyC8C5G,KAAKsF,UAC3EtF,KAAK8M,qBAED9M,KAAKuF,QAAQ6G,OAASX,IACxBzL,KAAK+M,OAET,CAGA,kBAAW7I,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MA9FS,UA+FX,CAGA6L,OACErH,KAAKgN,OAAOnC,GACd,CAEAoC,mBAIOhU,SAASiU,QAAU/T,EAAU6G,KAAKsF,WACrCtF,KAAKqH,MAET,CAEAH,OACElH,KAAKgN,OAAOlC,GACd,CAEAqB,QACMnM,KAAK0M,YACPjU,EAAqBuH,KAAKsF,UAG5BtF,KAAKmN,gBACP,CAEAJ,QACE/M,KAAKmN,iBACLnN,KAAKoN,kBAELpN,KAAKwM,UAAYa,YAAY,IAAMrN,KAAKiN,kBAAmBjN,KAAKuF,QAAQ0G,SAC1E,CAEAqB,oBACOtN,KAAKuF,QAAQ6G,OAIdpM,KAAK0M,WACPnM,EAAae,IAAItB,KAAKsF,SAAU4F,GAAY,IAAMlL,KAAK+M,SAIzD/M,KAAK+M,QACP,CAEAQ,GAAG3P,GACD,MAAM4P,EAAQxN,KAAKyN,YACnB,GAAI7P,EAAQ4P,EAAMxU,OAAS,GAAK4E,EAAQ,EACtC,OAGF,GAAIoC,KAAK0M,WAEP,YADAnM,EAAae,IAAItB,KAAKsF,SAAU4F,GAAY,IAAMlL,KAAKuN,GAAG3P,IAI5D,MAAM8P,EAAc1N,KAAK2N,cAAc3N,KAAK4N,cAC5C,GAAIF,IAAgB9P,EAClB,OAGF,MAAMiQ,EAAQjQ,EAAQ8P,EAAc7C,GAAaC,GAEjD9K,KAAKgN,OAAOa,EAAOL,EAAM5P,GAC3B,CAEA6H,UACMzF,KAAK4M,cACP5M,KAAK4M,aAAanH,UAGpBJ,MAAMI,SACR,CAGAjB,kBAAkBF,GAEhB,OADAA,EAAOwJ,gBAAkBxJ,EAAO2H,SACzB3H,CACT,CAEAwI,qBACM9M,KAAKuF,QAAQ2G,UACf3L,EAAac,GAAGrB,KAAKsF,SAAU6F,GAAe/L,GAASY,KAAK+N,SAAS3O,IAG5C,UAAvBY,KAAKuF,QAAQ4G,QACf5L,EAAac,GAAGrB,KAAKsF,SAAU8F,GAAkB,IAAMpL,KAAKmM,SAC5D5L,EAAac,GAAGrB,KAAKsF,SAAU+F,GAAkB,IAAMrL,KAAKsN,sBAG1DtN,KAAKuF,QAAQ8G,OAAS/C,GAAMC,eAC9BvJ,KAAKgO,yBAET,CAEAA,0BACE,IAAK,MAAMC,KAAOxH,EAAetH,KAhKX,qBAgKmCa,KAAKsF,UAC5D/E,EAAac,GAAG4M,EAAK3C,GAAkBlM,GAASA,EAAMmD,kBAGxD,MAqBM2L,EAAc,CAClB9E,aAAcA,IAAMpJ,KAAKgN,OAAOhN,KAAKmO,kBAAkBpD,KACvD1B,cAAeA,IAAMrJ,KAAKgN,OAAOhN,KAAKmO,kBAAkBnD,KACxD7B,YAxBkBiF,KACS,UAAvBpO,KAAKuF,QAAQ4G,QAYjBnM,KAAKmM,QACDnM,KAAK2M,cACP0B,aAAarO,KAAK2M,cAGpB3M,KAAK2M,aAAetP,WAAW,IAAM2C,KAAKsN,oBAjNjB,IAiN+DtN,KAAKuF,QAAQ0G,aASvGjM,KAAK4M,aAAe,IAAItD,GAAMtJ,KAAKsF,SAAU4I,EAC/C,CAEAH,SAAS3O,GACP,GAAI,kBAAkB6F,KAAK7F,EAAMjC,OAAO8K,SACtC,OAGF,MAAMoC,EAAYyB,GAAiB1M,EAAMxI,KACrCyT,IACFjL,EAAMmD,iBACNvC,KAAKgN,OAAOhN,KAAKmO,kBAAkB9D,IAEvC,CAEAsD,cAAchX,GACZ,OAAOqJ,KAAKyN,YAAY5P,QAAQlH,EAClC,CAEA2X,2BAA2B1Q,GACzB,IAAKoC,KAAK6M,mBACR,OAGF,MAAM0B,EAAkB9H,EAAeG,QAAQ+E,GAAiB3L,KAAK6M,oBAErE0B,EAAgBxU,UAAUxC,OAAOmU,IACjC6C,EAAgB/K,gBAAgB,gBAEhC,MAAMgL,EAAqB/H,EAAeG,QAAQ,sBAAsBhJ,MAAWoC,KAAK6M,oBAEpF2B,IACFA,EAAmBzU,UAAUuQ,IAAIoB,IACjC8C,EAAmBlL,aAAa,eAAgB,QAEpD,CAEA8J,kBACE,MAAMzW,EAAUqJ,KAAKyM,gBAAkBzM,KAAK4N,aAE5C,IAAKjX,EACH,OAGF,MAAM8X,EAAkB7R,OAAO8R,SAAS/X,EAAQwD,aAAa,oBAAqB,IAElF6F,KAAKuF,QAAQ0G,SAAWwC,GAAmBzO,KAAKuF,QAAQuI,eAC1D,CAEAd,OAAOa,EAAOlX,EAAU,MACtB,GAAIqJ,KAAK0M,WACP,OAGF,MAAMlP,EAAgBwC,KAAK4N,aACrBe,EAASd,IAAUhD,GACnB+D,EAAcjY,GAAW2G,EAAqB0C,KAAKyN,YAAajQ,EAAemR,EAAQ3O,KAAKuF,QAAQ+G,MAE1G,GAAIsC,IAAgBpR,EAClB,OAGF,MAAMqR,EAAmB7O,KAAK2N,cAAciB,GAEtCE,EAAe5I,GACZ3F,EAAasB,QAAQ7B,KAAKsF,SAAUY,EAAW,CACpDpG,cAAe8O,EACfvE,UAAWrK,KAAK+O,kBAAkBlB,GAClCxW,KAAM2I,KAAK2N,cAAcnQ,GACzB+P,GAAIsB,IAMR,GAFmBC,EAAa7D,IAEjBhJ,iBACb,OAGF,IAAKzE,IAAkBoR,EAGrB,OAGF,MAAMI,EAAYlO,QAAQd,KAAKwM,WAC/BxM,KAAKmM,QAELnM,KAAK0M,YAAa,EAElB1M,KAAKsO,2BAA2BO,GAChC7O,KAAKyM,eAAiBmC,EAEtB,MAAMK,EAAuBN,EAnSR,sBADF,oBAqSbO,EAAiBP,EAnSH,qBACA,qBAoSpBC,EAAY7U,UAAUuQ,IAAI4E,GAE1BvU,EAAOiU,GAEPpR,EAAczD,UAAUuQ,IAAI2E,GAC5BL,EAAY7U,UAAUuQ,IAAI2E,GAa1BjP,KAAK6F,eAXoBsJ,KACvBP,EAAY7U,UAAUxC,OAAO0X,EAAsBC,GACnDN,EAAY7U,UAAUuQ,IAAIoB,IAE1BlO,EAAczD,UAAUxC,OAAOmU,GAAmBwD,EAAgBD,GAElEjP,KAAK0M,YAAa,EAElBoC,EAAa5D,KAGuB1N,EAAewC,KAAKoP,eAEtDJ,GACFhP,KAAK+M,OAET,CAEAqC,cACE,OAAOpP,KAAKsF,SAASvL,UAAUC,SAlUV,QAmUvB,CAEA4T,aACE,OAAOnH,EAAeG,QAAQiF,GAAsB7L,KAAKsF,SAC3D,CAEAmI,YACE,OAAOhH,EAAetH,KAAKyM,GAAe5L,KAAKsF,SACjD,CAEA6H,iBACMnN,KAAKwM,YACP6C,cAAcrP,KAAKwM,WACnBxM,KAAKwM,UAAY,KAErB,CAEA2B,kBAAkB9D,GAChB,OAAIpP,IACKoP,IAAcU,GAAiBD,GAAaD,GAG9CR,IAAcU,GAAiBF,GAAaC,EACrD,CAEAiE,kBAAkBlB,GAChB,OAAI5S,IACK4S,IAAU/C,GAAaC,GAAiBC,GAG1C6C,IAAU/C,GAAaE,GAAkBD,EAClD,CAGA,sBAAOpP,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAO+D,GAASvG,oBAAoBhG,KAAMsE,GAEhD,GAAsB,iBAAXA,GAKX,GAAsB,iBAAXA,EAAqB,CAC9B,QAAqBmE,IAAjBD,EAAKlE,IAAyBA,EAAO7C,WAAW,MAAmB,gBAAX6C,EAC1D,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,IACP,OAVEkE,EAAK+E,GAAGjJ,EAWZ,EACF,EAOF/D,EAAac,GAAGpI,SAAUuS,GAlXE,sCAkXyC,SAAUpM,GAC7E,MAAMjC,EAASsJ,EAAekB,uBAAuB3H,MAErD,IAAK7C,IAAWA,EAAOpD,UAAUC,SAASyR,IACxC,OAGFrM,EAAMmD,iBAEN,MAAM+M,EAAW/C,GAASvG,oBAAoB7I,GACxCoS,EAAavP,KAAK7F,aAAa,oBAErC,OAAIoV,GACFD,EAAS/B,GAAGgC,QACZD,EAAShC,qBAIyC,SAAhDlK,EAAYY,iBAAiBhE,KAAM,UACrCsP,EAASjI,YACTiI,EAAShC,sBAIXgC,EAASpI,YACToI,EAAShC,oBACX,GAEA/M,EAAac,GAAGzJ,OAAQ2T,GAAqB,KAC3C,MAAMiE,EAAY/I,EAAetH,KA9YR,6BAgZzB,IAAK,MAAMmQ,KAAYE,EACrBjD,GAASvG,oBAAoBsJ,KAQjCnU,EAAmBoR,ICncnB,MAEM7G,GAAY,eAGZ+J,GAAa,OAAO/J,KACpBgK,GAAc,QAAQhK,KACtBiK,GAAa,OAAOjK,KACpBkK,GAAe,SAASlK,KACxB8F,GAAuB,QAAQ9F,cAE/BmK,GAAkB,OAClBC,GAAsB,WACtBC,GAAwB,aAExBC,GAA6B,WAAWF,OAAwBA,KAOhEpH,GAAuB,8BAEvBxE,GAAU,CACd+L,OAAQ,KACRrH,QAAQ,GAGJzE,GAAc,CAClB8L,OAAQ,iBACRrH,OAAQ,WAOV,MAAMsH,WAAiB9K,EACrBT,YAAYhO,EAAS2N,GACnBe,MAAM1O,EAAS2N,GAEftE,KAAKmQ,kBAAmB,EACxBnQ,KAAKoQ,cAAgB,GAErB,MAAMC,EAAa5J,EAAetH,KAAKuJ,IAEvC,IAAK,MAAM4H,KAAQD,EAAY,CAC7B,MAAM1Y,EAAW8O,EAAeiB,uBAAuB4I,GACjDC,EAAgB9J,EAAetH,KAAKxH,GACvCkM,OAAO2M,GAAgBA,IAAiBxQ,KAAKsF,UAE/B,OAAb3N,GAAqB4Y,EAAcvX,QACrCgH,KAAKoQ,cAAcpU,KAAKsU,EAE5B,CAEAtQ,KAAKyQ,sBAEAzQ,KAAKuF,QAAQ0K,QAChBjQ,KAAK0Q,0BAA0B1Q,KAAKoQ,cAAepQ,KAAK2Q,YAGtD3Q,KAAKuF,QAAQqD,QACf5I,KAAK4I,QAET,CAGA,kBAAW1E,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MA9ES,UA+EX,CAGAoN,SACM5I,KAAK2Q,WACP3Q,KAAK4Q,OAEL5Q,KAAK6Q,MAET,CAEAA,OACE,GAAI7Q,KAAKmQ,kBAAoBnQ,KAAK2Q,WAChC,OAGF,IAAIG,EAAiB,GASrB,GANI9Q,KAAKuF,QAAQ0K,SACfa,EAAiB9Q,KAAK+Q,uBA9EH,wCA+EhBlN,OAAOlN,GAAWA,IAAYqJ,KAAKsF,UACnCgB,IAAI3P,GAAWuZ,GAASlK,oBAAoBrP,EAAS,CAAEiS,QAAQ,MAGhEkI,EAAe9X,QAAU8X,EAAe,GAAGX,iBAC7C,OAIF,GADmB5P,EAAasB,QAAQ7B,KAAKsF,SAAUmK,IACxCxN,iBACb,OAGF,IAAK,MAAM+O,KAAkBF,EAC3BE,EAAeJ,OAGjB,MAAMK,EAAYjR,KAAKkR,gBAEvBlR,KAAKsF,SAASvL,UAAUxC,OAAOuY,IAC/B9P,KAAKsF,SAASvL,UAAUuQ,IAAIyF,IAE5B/P,KAAKsF,SAAS6L,MAAMF,GAAa,EAEjCjR,KAAK0Q,0BAA0B1Q,KAAKoQ,eAAe,GACnDpQ,KAAKmQ,kBAAmB,EAExB,MAYMiB,EAAa,SADUH,EAAU,GAAG9L,cAAgB8L,EAAUtP,MAAM,KAG1E3B,KAAK6F,eAdYwL,KACfrR,KAAKmQ,kBAAmB,EAExBnQ,KAAKsF,SAASvL,UAAUxC,OAAOwY,IAC/B/P,KAAKsF,SAASvL,UAAUuQ,IAAIwF,GAAqBD,IAEjD7P,KAAKsF,SAAS6L,MAAMF,GAAa,GAEjC1Q,EAAasB,QAAQ7B,KAAKsF,SAAUoK,KAMR1P,KAAKsF,UAAU,GAC7CtF,KAAKsF,SAAS6L,MAAMF,GAAa,GAAGjR,KAAKsF,SAAS8L,MACpD,CAEAR,OACE,GAAI5Q,KAAKmQ,mBAAqBnQ,KAAK2Q,WACjC,OAIF,GADmBpQ,EAAasB,QAAQ7B,KAAKsF,SAAUqK,IACxC1N,iBACb,OAGF,MAAMgP,EAAYjR,KAAKkR,gBAEvBlR,KAAKsF,SAAS6L,MAAMF,GAAa,GAAGjR,KAAKsF,SAASgM,wBAAwBL,OAE1EtW,EAAOqF,KAAKsF,UAEZtF,KAAKsF,SAASvL,UAAUuQ,IAAIyF,IAC5B/P,KAAKsF,SAASvL,UAAUxC,OAAOuY,GAAqBD,IAEpD,IAAK,MAAMhO,KAAW7B,KAAKoQ,cAAe,CACxC,MAAMzZ,EAAU8P,EAAekB,uBAAuB9F,GAElDlL,IAAYqJ,KAAK2Q,SAASha,IAC5BqJ,KAAK0Q,0BAA0B,CAAC7O,IAAU,EAE9C,CAEA7B,KAAKmQ,kBAAmB,EASxBnQ,KAAKsF,SAAS6L,MAAMF,GAAa,GAEjCjR,KAAK6F,eATYwL,KACfrR,KAAKmQ,kBAAmB,EACxBnQ,KAAKsF,SAASvL,UAAUxC,OAAOwY,IAC/B/P,KAAKsF,SAASvL,UAAUuQ,IAAIwF,IAC5BvP,EAAasB,QAAQ7B,KAAKsF,SAAUsK,KAKR5P,KAAKsF,UAAU,EAC/C,CAGAqL,SAASha,EAAUqJ,KAAKsF,UACtB,OAAO3O,EAAQoD,UAAUC,SAAS6V,GACpC,CAEArL,kBAAkBF,GAGhB,OAFAA,EAAOsE,OAAS9H,QAAQwD,EAAOsE,QAC/BtE,EAAO2L,OAASlX,EAAWuL,EAAO2L,QAC3B3L,CACT,CAEA4M,gBACE,OAAOlR,KAAKsF,SAASvL,UAAUC,SAtLL,uBAEhB,QACC,QAoLb,CAEAyW,sBACE,IAAKzQ,KAAKuF,QAAQ0K,OAChB,OAGF,MAAMpJ,EAAW7G,KAAK+Q,uBAAuBrI,IAE7C,IAAK,MAAM/R,KAAWkQ,EAAU,CAC9B,MAAM0K,EAAW9K,EAAekB,uBAAuBhR,GAEnD4a,GACFvR,KAAK0Q,0BAA0B,CAAC/Z,GAAUqJ,KAAK2Q,SAASY,GAE5D,CACF,CAEAR,uBAAuBpZ,GACrB,MAAMkP,EAAWJ,EAAetH,KAAK6Q,GAA4BhQ,KAAKuF,QAAQ0K,QAE9E,OAAOxJ,EAAetH,KAAKxH,EAAUqI,KAAKuF,QAAQ0K,QAAQpM,OAAOlN,IAAYkQ,EAASzF,SAASzK,GACjG,CAEA+Z,0BAA0Bc,EAAcC,GACtC,GAAKD,EAAaxY,OAIlB,IAAK,MAAMrC,KAAW6a,EACpB7a,EAAQoD,UAAU6O,OAvNK,aAuNyB6I,GAChD9a,EAAQ2M,aAAa,gBAAiBmO,EAE1C,CAGA,sBAAO9V,CAAgB2I,GACrB,MAAMiB,EAAU,GAKhB,MAJsB,iBAAXjB,GAAuB,YAAYW,KAAKX,KACjDiB,EAAQqD,QAAS,GAGZ5I,KAAKuI,KAAK,WACf,MAAMC,EAAO0H,GAASlK,oBAAoBhG,KAAMuF,GAEhD,GAAsB,iBAAXjB,EAAqB,CAC9B,QAA4B,IAAjBkE,EAAKlE,GACd,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,IACP,CACF,EACF,EAOF/D,EAAac,GAAGpI,SAAUuS,GAAsB9C,GAAsB,SAAUtJ,IAEjD,MAAzBA,EAAMjC,OAAO8K,SAAoB7I,EAAMW,gBAAmD,MAAjCX,EAAMW,eAAekI,UAChF7I,EAAMmD,iBAGR,IAAK,MAAM5L,KAAW8P,EAAemB,gCAAgC5H,MACnEkQ,GAASlK,oBAAoBrP,EAAS,CAAEiS,QAAQ,IAASA,QAE7D,GAMAzN,EAAmB+U,IC1QnB,MAAM1U,GAAO,WAEPkK,GAAY,eACZgF,GAAe,YAIfgH,GAAe,UACfC,GAAiB,YAGjBhC,GAAa,OAAOjK,KACpBkK,GAAe,SAASlK,KACxB+J,GAAa,OAAO/J,KACpBgK,GAAc,QAAQhK,KACtB8F,GAAuB,QAAQ9F,KAAYgF,KAC3CkH,GAAyB,UAAUlM,KAAYgF,KAC/CmH,GAAuB,QAAQnM,KAAYgF,KAE3CmF,GAAkB,OAOlBnH,GAAuB,4DACvBoJ,GAA6B,GAAGpJ,MAAwBmH,KACxDkC,GAAgB,iBAKhBC,GAAgB/W,IAAU,UAAY,YACtCgX,GAAmBhX,IAAU,YAAc,UAC3CiX,GAAmBjX,IAAU,aAAe,eAC5CkX,GAAsBlX,IAAU,eAAiB,aACjDmX,GAAkBnX,IAAU,aAAe,cAC3CoX,GAAiBpX,IAAU,cAAgB,aAI3CiJ,GAAU,CACdoO,WAAW,EACXC,SAAU,kBACVC,QAAS,UACTC,OAAQ,CAAC,EAAG,GACZC,aAAc,KACdC,UAAW,UAGPxO,GAAc,CAClBmO,UAAW,mBACXC,SAAU,mBACVC,QAAS,SACTC,OAAQ,0BACRC,aAAc,yBACdC,UAAW,2BAOb,MAAMC,WAAiBxN,EACrBT,YAAYhO,EAAS2N,GACnBe,MAAM1O,EAAS2N,GAEftE,KAAK6S,QAAU,KACf7S,KAAK8S,QAAU9S,KAAKsF,SAAS3L,WAE7BqG,KAAK+S,MAAQtM,EAAeY,KAAKrH,KAAKsF,SAAUyM,IAAe,IAC7DtL,EAAeS,KAAKlH,KAAKsF,SAAUyM,IAAe,IAClDtL,EAAeG,QAAQmL,GAAe/R,KAAK8S,SAC7C9S,KAAKgT,UAAYhT,KAAKiT,eACxB,CAGA,kBAAW/O,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,OAAOA,EACT,CAGAoN,SACE,OAAO5I,KAAK2Q,WAAa3Q,KAAK4Q,OAAS5Q,KAAK6Q,MAC9C,CAEAA,OACE,GAAIjX,EAAWoG,KAAKsF,WAAatF,KAAK2Q,WACpC,OAGF,MAAM7Q,EAAgB,CACpBA,cAAeE,KAAKsF,UAKtB,IAFkB/E,EAAasB,QAAQ7B,KAAKsF,SAAUmK,GAAY3P,GAEpDmC,iBAAd,CAUA,GANAjC,KAAKkT,gBAMD,iBAAkBja,SAASoB,kBAAoB2F,KAAK8S,QAAQrZ,QAtFxC,eAuFtB,IAAK,MAAM9C,IAAW,GAAG+P,UAAUzN,SAAS8B,KAAK8L,UAC/CtG,EAAac,GAAG1K,EAAS,YAAa+D,GAI1CsF,KAAKsF,SAAS6N,QACdnT,KAAKsF,SAAShC,aAAa,iBAAiB,GAE5CtD,KAAK+S,MAAMhZ,UAAUuQ,IAAIuF,IACzB7P,KAAKsF,SAASvL,UAAUuQ,IAAIuF,IAC5BtP,EAAasB,QAAQ7B,KAAKsF,SAAUoK,GAAa5P,EAnBjD,CAoBF,CAEA8Q,OACE,GAAIhX,EAAWoG,KAAKsF,YAActF,KAAK2Q,WACrC,OAGF,MAAM7Q,EAAgB,CACpBA,cAAeE,KAAKsF,UAGtBtF,KAAKoT,cAActT,EACrB,CAEA2F,UACMzF,KAAK6S,SACP7S,KAAK6S,QAAQQ,UAGfhO,MAAMI,SACR,CAEA6N,SACEtT,KAAKgT,UAAYhT,KAAKiT,gBAClBjT,KAAK6S,SACP7S,KAAK6S,QAAQS,QAEjB,CAGAF,cAActT,GAEZ,IADkBS,EAAasB,QAAQ7B,KAAKsF,SAAUqK,GAAY7P,GACpDmC,iBAAd,CAMA,GAAI,iBAAkBhJ,SAASoB,gBAC7B,IAAK,MAAM1D,IAAW,GAAG+P,UAAUzN,SAAS8B,KAAK8L,UAC/CtG,EAAaC,IAAI7J,EAAS,YAAa+D,GAIvCsF,KAAK6S,SACP7S,KAAK6S,QAAQQ,UAGfrT,KAAK+S,MAAMhZ,UAAUxC,OAAOsY,IAC5B7P,KAAKsF,SAASvL,UAAUxC,OAAOsY,IAC/B7P,KAAKsF,SAAShC,aAAa,gBAAiB,SAC5CF,EAAYG,oBAAoBvD,KAAK+S,MAAO,UAC5CxS,EAAasB,QAAQ7B,KAAKsF,SAAUsK,GAAc9P,EAlBlD,CAmBF,CAEAuE,WAAWC,GAGT,GAAgC,iBAFhCA,EAASe,MAAMhB,WAAWC,IAERqO,YAA2B/Z,EAAU0L,EAAOqO,YACV,mBAA3CrO,EAAOqO,UAAUrB,sBAGxB,MAAM,IAAIpM,UAAU,GAAG1J,GAAK2J,+GAG9B,OAAOb,CACT,CAEA4O,gBACE,QAAsB,IAAXK,EACT,MAAM,IAAIrO,UAAU,yEAGtB,IAAIsO,EAAmBxT,KAAKsF,SAEG,WAA3BtF,KAAKuF,QAAQoN,UACfa,EAAmBxT,KAAK8S,QACfla,EAAUoH,KAAKuF,QAAQoN,WAChCa,EAAmBza,EAAWiH,KAAKuF,QAAQoN,WACA,iBAA3B3S,KAAKuF,QAAQoN,YAC7Ba,EAAmBxT,KAAKuF,QAAQoN,WAGlC,MAAMD,EAAe1S,KAAKyT,mBAC1BzT,KAAK6S,QAAUU,EAAOG,aAAaF,EAAkBxT,KAAK+S,MAAOL,EACnE,CAEA/B,WACE,OAAO3Q,KAAK+S,MAAMhZ,UAAUC,SAAS6V,GACvC,CAEA8D,gBACE,MAAMC,EAAiB5T,KAAK8S,QAE5B,GAAIc,EAAe7Z,UAAUC,SAzMN,WA0MrB,OAAOoY,GAGT,GAAIwB,EAAe7Z,UAAUC,SA5MJ,aA6MvB,OAAOqY,GAGT,GAAIuB,EAAe7Z,UAAUC,SA/MA,iBAgN3B,MAhMsB,MAmMxB,GAAI4Z,EAAe7Z,UAAUC,SAlNE,mBAmN7B,MAnMyB,SAuM3B,MAAM6Z,EAAkF,QAA1Eva,iBAAiB0G,KAAK+S,OAAOxZ,iBAAiB,iBAAiB8M,OAE7E,OAAIuN,EAAe7Z,UAAUC,SA7NP,UA8Nb6Z,EAAQ5B,GAAmBD,GAG7B6B,EAAQ1B,GAAsBD,EACvC,CAEAe,gBACE,OAAkD,OAA3CjT,KAAKsF,SAAS7L,QA5ND,UA6NtB,CAEAqa,aACE,MAAMrB,OAAEA,GAAWzS,KAAKuF,QAExB,MAAsB,iBAAXkN,EACFA,EAAO1V,MAAM,KAAKuJ,IAAI5D,GAAS9F,OAAO8R,SAAShM,EAAO,KAGzC,mBAAX+P,EACFsB,GAActB,EAAOsB,EAAY/T,KAAKsF,UAGxCmN,CACT,CAEAgB,mBACE,MAAMO,EAAwB,CAC5BC,UAAWjU,KAAK2T,gBAChBO,UAAW,CAAC,CACV3Y,KAAM,kBACN4Y,QAAS,CACP5B,SAAUvS,KAAKuF,QAAQgN,WAG3B,CACEhX,KAAM,SACN4Y,QAAS,CACP1B,OAAQzS,KAAK8T,iBAcnB,OARI9T,KAAKgT,WAAsC,WAAzBhT,KAAKuF,QAAQiN,WACjCpP,EAAYC,iBAAiBrD,KAAK+S,MAAO,SAAU,UACnDiB,EAAsBE,UAAY,CAAC,CACjC3Y,KAAM,cACN6Y,SAAS,KAIN,IACFJ,KACA/X,EAAQ+D,KAAKuF,QAAQmN,aAAc,MAACjK,EAAWuL,IAEtD,CAEAK,iBAAgBzd,IAAEA,EAAGuG,OAAEA,IACrB,MAAMqQ,EAAQ/G,EAAetH,KA5QF,8DA4Q+Ba,KAAK+S,OAAOlP,OAAOlN,GAAWwC,EAAUxC,IAE7F6W,EAAMxU,QAMXsE,EAAqBkQ,EAAOrQ,EAAQvG,IAAQ+a,IAAiBnE,EAAMpM,SAASjE,IAASgW,OACvF,CAGA,sBAAOxX,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOoK,GAAS5M,oBAAoBhG,KAAMsE,GAEhD,GAAsB,iBAAXA,EAAX,CAIA,QAA4B,IAAjBkE,EAAKlE,GACd,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,IANL,CAOF,EACF,CAEA,iBAAOgQ,CAAWlV,GAChB,GA/TuB,IA+TnBA,EAAMyJ,QAAiD,UAAfzJ,EAAMqB,MAlUtC,QAkU0DrB,EAAMxI,IAC1E,OAGF,MAAM2d,EAAc9N,EAAetH,KAAK2S,IAExC,IAAK,MAAMlJ,KAAU2L,EAAa,CAChC,MAAMC,EAAU5B,GAAS7M,YAAY6C,GACrC,IAAK4L,IAAyC,IAA9BA,EAAQjP,QAAQ+M,UAC9B,SAGF,MAAMmC,EAAerV,EAAMqV,eACrBC,EAAeD,EAAarT,SAASoT,EAAQzB,OACnD,GACE0B,EAAarT,SAASoT,EAAQlP,WACC,WAA9BkP,EAAQjP,QAAQ+M,YAA2BoC,GACb,YAA9BF,EAAQjP,QAAQ+M,WAA2BoC,EAE5C,SAIF,GAAIF,EAAQzB,MAAM/Y,SAASoF,EAAMjC,UAA4B,UAAfiC,EAAMqB,MAzV1C,QAyV8DrB,EAAMxI,KAAoB,qCAAqCqO,KAAK7F,EAAMjC,OAAO8K,UACvJ,SAGF,MAAMnI,EAAgB,CAAEA,cAAe0U,EAAQlP,UAE5B,UAAflG,EAAMqB,OACRX,EAAckI,WAAa5I,GAG7BoV,EAAQpB,cAActT,EACxB,CACF,CAEA,4BAAO6U,CAAsBvV,GAI3B,MAAMwV,EAAU,kBAAkB3P,KAAK7F,EAAMjC,OAAO8K,SAC9C4M,EA7WS,WA6WOzV,EAAMxI,IACtBke,EAAkB,CAACpD,GAAcC,IAAgBvQ,SAAShC,EAAMxI,KAEtE,IAAKke,IAAoBD,EACvB,OAGF,GAAID,IAAYC,EACd,OAGFzV,EAAMmD,iBAGN,MAAMwS,EAAkB/U,KAAK+G,QAAQ2B,IACnC1I,KACCyG,EAAeS,KAAKlH,KAAM0I,IAAsB,IAC/CjC,EAAeY,KAAKrH,KAAM0I,IAAsB,IAChDjC,EAAeG,QAAQ8B,GAAsBtJ,EAAMW,eAAepG,YAEhE9C,EAAW+b,GAAS5M,oBAAoB+O,GAE9C,GAAID,EAIF,OAHA1V,EAAM4V,kBACNne,EAASga,YACTha,EAASwd,gBAAgBjV,GAIvBvI,EAAS8Z,aACXvR,EAAM4V,kBACNne,EAAS+Z,OACTmE,EAAgB5B,QAEpB,EAOF5S,EAAac,GAAGpI,SAAU2Y,GAAwBlJ,GAAsBkK,GAAS+B,uBACjFpU,EAAac,GAAGpI,SAAU2Y,GAAwBG,GAAea,GAAS+B,uBAC1EpU,EAAac,GAAGpI,SAAUuS,GAAsBoH,GAAS0B,YACzD/T,EAAac,GAAGpI,SAAU4Y,GAAsBe,GAAS0B,YACzD/T,EAAac,GAAGpI,SAAUuS,GAAsB9C,GAAsB,SAAUtJ,GAC9EA,EAAMmD,iBACNqQ,GAAS5M,oBAAoBhG,MAAM4I,QACrC,GAMAzN,EAAmByX,ICnbnB,MAAMpX,GAAO,WAEPqU,GAAkB,OAClBoF,GAAkB,gBAAgBzZ,KAElC0I,GAAU,CACdgR,UAAW,iBACXC,cAAe,KACfrP,YAAY,EACZ3M,WAAW,EACXic,YAAa,QAGTjR,GAAc,CAClB+Q,UAAW,SACXC,cAAe,kBACfrP,WAAY,UACZ3M,UAAW,UACXic,YAAa,oBAOf,MAAMC,WAAiBpR,EACrBU,YAAYL,GACVe,QACArF,KAAKuF,QAAUvF,KAAKqE,WAAWC,GAC/BtE,KAAKsV,aAAc,EACnBtV,KAAKsF,SAAW,IAClB,CAGA,kBAAWpB,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,OAAOA,EACT,CAGAqV,KAAKxV,GACH,IAAK2E,KAAKuF,QAAQpM,UAEhB,YADA8C,EAAQZ,GAIV2E,KAAKuV,UAEL,MAAM5e,EAAUqJ,KAAKwV,cACjBxV,KAAKuF,QAAQO,YACfnL,EAAOhE,GAGTA,EAAQoD,UAAUuQ,IAAIuF,IAEtB7P,KAAKyV,kBAAkB,KACrBxZ,EAAQZ,IAEZ,CAEAuV,KAAKvV,GACE2E,KAAKuF,QAAQpM,WAKlB6G,KAAKwV,cAAczb,UAAUxC,OAAOsY,IAEpC7P,KAAKyV,kBAAkB,KACrBzV,KAAKyF,UACLxJ,EAAQZ,MARRY,EAAQZ,EAUZ,CAEAoK,UACOzF,KAAKsV,cAIV/U,EAAaC,IAAIR,KAAKsF,SAAU2P,IAEhCjV,KAAKsF,SAAS/N,SACdyI,KAAKsV,aAAc,EACrB,CAGAE,cACE,IAAKxV,KAAKsF,SAAU,CAClB,MAAMoQ,EAAWzc,SAAS0c,cAAc,OACxCD,EAASR,UAAYlV,KAAKuF,QAAQ2P,UAC9BlV,KAAKuF,QAAQO,YACf4P,EAAS3b,UAAUuQ,IAjGH,QAoGlBtK,KAAKsF,SAAWoQ,CAClB,CAEA,OAAO1V,KAAKsF,QACd,CAEAd,kBAAkBF,GAGhB,OADAA,EAAO8Q,YAAcrc,EAAWuL,EAAO8Q,aAChC9Q,CACT,CAEAiR,UACE,GAAIvV,KAAKsV,YACP,OAGF,MAAM3e,EAAUqJ,KAAKwV,cACrBxV,KAAKuF,QAAQ6P,YAAYQ,OAAOjf,GAEhC4J,EAAac,GAAG1K,EAASse,GAAiB,KACxChZ,EAAQ+D,KAAKuF,QAAQ4P,iBAGvBnV,KAAKsV,aAAc,CACrB,CAEAG,kBAAkBpa,GAChBgB,EAAuBhB,EAAU2E,KAAKwV,cAAexV,KAAKuF,QAAQO,WACpE,ECpIF,MAEMJ,GAAY,gBACZmQ,GAAgB,UAAUnQ,KAC1BoQ,GAAoB,cAAcpQ,KAIlCqQ,GAAmB,WAEnB7R,GAAU,CACd8R,WAAW,EACXC,YAAa,MAGT9R,GAAc,CAClB6R,UAAW,UACXC,YAAa,WAOf,MAAMC,WAAkBjS,EACtBU,YAAYL,GACVe,QACArF,KAAKuF,QAAUvF,KAAKqE,WAAWC,GAC/BtE,KAAKmW,WAAY,EACjBnW,KAAKoW,qBAAuB,IAC9B,CAGA,kBAAWlS,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MA1CS,WA2CX,CAGA6a,WACMrW,KAAKmW,YAILnW,KAAKuF,QAAQyQ,WACfhW,KAAKuF,QAAQ0Q,YAAY9C,QAG3B5S,EAAaC,IAAIvH,SAAUyM,IAC3BnF,EAAac,GAAGpI,SAAU4c,GAAezW,GAASY,KAAKsW,eAAelX,IACtEmB,EAAac,GAAGpI,SAAU6c,GAAmB1W,GAASY,KAAKuW,eAAenX,IAE1EY,KAAKmW,WAAY,EACnB,CAEAK,aACOxW,KAAKmW,YAIVnW,KAAKmW,WAAY,EACjB5V,EAAaC,IAAIvH,SAAUyM,IAC7B,CAGA4Q,eAAelX,GACb,MAAM6W,YAAEA,GAAgBjW,KAAKuF,QAE7B,GAAInG,EAAMjC,SAAWlE,UAAYmG,EAAMjC,SAAW8Y,GAAeA,EAAYjc,SAASoF,EAAMjC,QAC1F,OAGF,MAAMsZ,EAAWhQ,EAAec,kBAAkB0O,GAE1B,IAApBQ,EAASzd,OACXid,EAAY9C,QACHnT,KAAKoW,uBAAyBL,GACvCU,EAASA,EAASzd,OAAS,GAAGma,QAE9BsD,EAAS,GAAGtD,OAEhB,CAEAoD,eAAenX,GApFD,QAqFRA,EAAMxI,MAIVoJ,KAAKoW,qBAAuBhX,EAAMsX,SAAWX,GAxFzB,UAyFtB,EChGF,MAAMY,GAAyB,oDACzBC,GAA0B,cAC1BC,GAAmB,gBACnBC,GAAkB,eAMxB,MAAMC,GACJpS,cACE3E,KAAKsF,SAAWrM,SAAS8B,IAC3B,CAGAic,WAEE,MAAMC,EAAgBhe,SAASoB,gBAAgB6c,YAC/C,OAAOpZ,KAAKsM,IAAIxS,OAAOuf,WAAaF,EACtC,CAEArG,OACE,MAAMwG,EAAQpX,KAAKgX,WACnBhX,KAAKqX,mBAELrX,KAAKsX,sBAAsBtX,KAAKsF,SAAUuR,GAAkBU,GAAmBA,EAAkBH,GAEjGpX,KAAKsX,sBAAsBX,GAAwBE,GAAkBU,GAAmBA,EAAkBH,GAC1GpX,KAAKsX,sBAAsBV,GAAyBE,GAAiBS,GAAmBA,EAAkBH,EAC5G,CAEAI,QACExX,KAAKyX,wBAAwBzX,KAAKsF,SAAU,YAC5CtF,KAAKyX,wBAAwBzX,KAAKsF,SAAUuR,IAC5C7W,KAAKyX,wBAAwBd,GAAwBE,IACrD7W,KAAKyX,wBAAwBb,GAAyBE,GACxD,CAEAY,gBACE,OAAO1X,KAAKgX,WAAa,CAC3B,CAGAK,mBACErX,KAAK2X,sBAAsB3X,KAAKsF,SAAU,YAC1CtF,KAAKsF,SAAS6L,MAAMyG,SAAW,QACjC,CAEAN,sBAAsB3f,EAAUkgB,EAAexc,GAC7C,MAAMyc,EAAiB9X,KAAKgX,WAW5BhX,KAAK+X,2BAA2BpgB,EAVHhB,IAC3B,GAAIA,IAAYqJ,KAAKsF,UAAY1N,OAAOuf,WAAaxgB,EAAQugB,YAAcY,EACzE,OAGF9X,KAAK2X,sBAAsBhhB,EAASkhB,GACpC,MAAMN,EAAkB3f,OAAO0B,iBAAiB3C,GAAS4C,iBAAiBse,GAC1ElhB,EAAQwa,MAAM6G,YAAYH,EAAe,GAAGxc,EAASuB,OAAOC,WAAW0a,UAI3E,CAEAI,sBAAsBhhB,EAASkhB,GAC7B,MAAMI,EAActhB,EAAQwa,MAAM5X,iBAAiBse,GAC/CI,GACF7U,EAAYC,iBAAiB1M,EAASkhB,EAAeI,EAEzD,CAEAR,wBAAwB9f,EAAUkgB,GAahC7X,KAAK+X,2BAA2BpgB,EAZHhB,IAC3B,MAAM+L,EAAQU,EAAYY,iBAAiBrN,EAASkhB,GAEtC,OAAVnV,GAKJU,EAAYG,oBAAoB5M,EAASkhB,GACzClhB,EAAQwa,MAAM6G,YAAYH,EAAenV,IALvC/L,EAAQwa,MAAM+G,eAAeL,IASnC,CAEAE,2BAA2BpgB,EAAUwgB,GACnC,GAAIvf,EAAUjB,GACZwgB,EAASxgB,QAIX,IAAK,MAAM4O,KAAOE,EAAetH,KAAKxH,EAAUqI,KAAKsF,UACnD6S,EAAS5R,EAEb,ECxFF,MAEMb,GAAY,YAIZiK,GAAa,OAAOjK,KACpB0S,GAAuB,gBAAgB1S,KACvCkK,GAAe,SAASlK,KACxB+J,GAAa,OAAO/J,KACpBgK,GAAc,QAAQhK,KACtB2S,GAAe,SAAS3S,KACxB4S,GAAsB,gBAAgB5S,KACtC6S,GAA0B,oBAAoB7S,KAC9C8S,GAAwB,kBAAkB9S,KAC1C8F,GAAuB,QAAQ9F,cAE/B+S,GAAkB,aAElB5I,GAAkB,OAClB6I,GAAoB,eAOpBxU,GAAU,CACdwR,UAAU,EACVvC,OAAO,EACPjH,UAAU,GAGN/H,GAAc,CAClBuR,SAAU,mBACVvC,MAAO,UACPjH,SAAU,WAOZ,MAAMyM,WAAcvT,EAClBT,YAAYhO,EAAS2N,GACnBe,MAAM1O,EAAS2N,GAEftE,KAAK4Y,QAAUnS,EAAeG,QAxBV,gBAwBmC5G,KAAKsF,UAC5DtF,KAAK6Y,UAAY7Y,KAAK8Y,sBACtB9Y,KAAK+Y,WAAa/Y,KAAKgZ,uBACvBhZ,KAAK2Q,UAAW,EAChB3Q,KAAKmQ,kBAAmB,EACxBnQ,KAAKiZ,WAAa,IAAIlC,GAEtB/W,KAAK8M,oBACP,CAGA,kBAAW5I,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MAnES,OAoEX,CAGAoN,OAAO9I,GACL,OAAOE,KAAK2Q,SAAW3Q,KAAK4Q,OAAS5Q,KAAK6Q,KAAK/Q,EACjD,CAEA+Q,KAAK/Q,GACCE,KAAK2Q,UAAY3Q,KAAKmQ,kBAIR5P,EAAasB,QAAQ7B,KAAKsF,SAAUmK,GAAY,CAChE3P,kBAGYmC,mBAIdjC,KAAK2Q,UAAW,EAChB3Q,KAAKmQ,kBAAmB,EAExBnQ,KAAKiZ,WAAWrI,OAEhB3X,SAAS8B,KAAKhB,UAAUuQ,IAAImO,IAE5BzY,KAAKkZ,gBAELlZ,KAAK6Y,UAAUhI,KAAK,IAAM7Q,KAAKmZ,aAAarZ,IAC9C,CAEA8Q,OACO5Q,KAAK2Q,WAAY3Q,KAAKmQ,mBAIT5P,EAAasB,QAAQ7B,KAAKsF,SAAUqK,IAExC1N,mBAIdjC,KAAK2Q,UAAW,EAChB3Q,KAAKmQ,kBAAmB,EACxBnQ,KAAK+Y,WAAWvC,aAEhBxW,KAAKsF,SAASvL,UAAUxC,OAAOsY,IAE/B7P,KAAK6F,eAAe,IAAM7F,KAAKoZ,aAAcpZ,KAAKsF,SAAUtF,KAAKoP,gBACnE,CAEA3J,UACElF,EAAaC,IAAI5I,OAAQ8N,IACzBnF,EAAaC,IAAIR,KAAK4Y,QAASlT,IAE/B1F,KAAK6Y,UAAUpT,UACfzF,KAAK+Y,WAAWvC,aAEhBnR,MAAMI,SACR,CAEA4T,eACErZ,KAAKkZ,eACP,CAGAJ,sBACE,OAAO,IAAIzD,GAAS,CAClBlc,UAAW2H,QAAQd,KAAKuF,QAAQmQ,UAChC5P,WAAY9F,KAAKoP,eAErB,CAEA4J,uBACE,OAAO,IAAI9C,GAAU,CACnBD,YAAajW,KAAKsF,UAEtB,CAEA6T,aAAarZ,GAEN7G,SAAS8B,KAAKf,SAASgG,KAAKsF,WAC/BrM,SAAS8B,KAAK6a,OAAO5V,KAAKsF,UAG5BtF,KAAKsF,SAAS6L,MAAMqB,QAAU,QAC9BxS,KAAKsF,SAAS9B,gBAAgB,eAC9BxD,KAAKsF,SAAShC,aAAa,cAAc,GACzCtD,KAAKsF,SAAShC,aAAa,OAAQ,UACnCtD,KAAKsF,SAASgU,UAAY,EAE1B,MAAMC,EAAY9S,EAAeG,QAxIT,cAwIsC5G,KAAK4Y,SAC/DW,IACFA,EAAUD,UAAY,GAGxB3e,EAAOqF,KAAKsF,UAEZtF,KAAKsF,SAASvL,UAAUuQ,IAAIuF,IAa5B7P,KAAK6F,eAXsB2T,KACrBxZ,KAAKuF,QAAQ4N,OACfnT,KAAK+Y,WAAW1C,WAGlBrW,KAAKmQ,kBAAmB,EACxB5P,EAAasB,QAAQ7B,KAAKsF,SAAUoK,GAAa,CAC/C5P,mBAIoCE,KAAK4Y,QAAS5Y,KAAKoP,cAC7D,CAEAtC,qBACEvM,EAAac,GAAGrB,KAAKsF,SAAUkT,GAAuBpZ,IApLvC,WAqLTA,EAAMxI,MAINoJ,KAAKuF,QAAQ2G,SACflM,KAAK4Q,OAIP5Q,KAAKyZ,gCAGPlZ,EAAac,GAAGzJ,OAAQygB,GAAc,KAChCrY,KAAK2Q,WAAa3Q,KAAKmQ,kBACzBnQ,KAAKkZ,kBAIT3Y,EAAac,GAAGrB,KAAKsF,SAAUiT,GAAyBnZ,IAEtDmB,EAAae,IAAItB,KAAKsF,SAAUgT,GAAqBoB,IAC/C1Z,KAAKsF,WAAalG,EAAMjC,QAAU6C,KAAKsF,WAAaoU,EAAOvc,SAIjC,WAA1B6C,KAAKuF,QAAQmQ,SAKb1V,KAAKuF,QAAQmQ,UACf1V,KAAK4Q,OALL5Q,KAAKyZ,iCASb,CAEAL,aACEpZ,KAAKsF,SAAS6L,MAAMqB,QAAU,OAC9BxS,KAAKsF,SAAShC,aAAa,eAAe,GAC1CtD,KAAKsF,SAAS9B,gBAAgB,cAC9BxD,KAAKsF,SAAS9B,gBAAgB,QAC9BxD,KAAKmQ,kBAAmB,EAExBnQ,KAAK6Y,UAAUjI,KAAK,KAClB3X,SAAS8B,KAAKhB,UAAUxC,OAAOkhB,IAC/BzY,KAAK2Z,oBACL3Z,KAAKiZ,WAAWzB,QAChBjX,EAAasB,QAAQ7B,KAAKsF,SAAUsK,KAExC,CAEAR,cACE,OAAOpP,KAAKsF,SAASvL,UAAUC,SA5NX,OA6NtB,CAEAyf,6BAEE,GADkBlZ,EAAasB,QAAQ7B,KAAKsF,SAAU8S,IACxCnW,iBACZ,OAGF,MAAM2X,EAAqB5Z,KAAKsF,SAASuU,aAAe5gB,SAASoB,gBAAgByf,aAC3EC,EAAmB/Z,KAAKsF,SAAS6L,MAAM6I,UAEpB,WAArBD,GAAiC/Z,KAAKsF,SAASvL,UAAUC,SAAS0e,MAIjEkB,IACH5Z,KAAKsF,SAAS6L,MAAM6I,UAAY,UAGlCha,KAAKsF,SAASvL,UAAUuQ,IAAIoO,IAC5B1Y,KAAK6F,eAAe,KAClB7F,KAAKsF,SAASvL,UAAUxC,OAAOmhB,IAC/B1Y,KAAK6F,eAAe,KAClB7F,KAAKsF,SAAS6L,MAAM6I,UAAYD,GAC/B/Z,KAAK4Y,UACP5Y,KAAK4Y,SAER5Y,KAAKsF,SAAS6N,QAChB,CAMA+F,gBACE,MAAMU,EAAqB5Z,KAAKsF,SAASuU,aAAe5gB,SAASoB,gBAAgByf,aAC3EhC,EAAiB9X,KAAKiZ,WAAWjC,WACjCiD,EAAoBnC,EAAiB,EAE3C,GAAImC,IAAsBL,EAAoB,CAC5C,MAAM/U,EAAW5J,IAAU,cAAgB,eAC3C+E,KAAKsF,SAAS6L,MAAMtM,GAAY,GAAGiT,KACrC,CAEA,IAAKmC,GAAqBL,EAAoB,CAC5C,MAAM/U,EAAW5J,IAAU,eAAiB,cAC5C+E,KAAKsF,SAAS6L,MAAMtM,GAAY,GAAGiT,KACrC,CACF,CAEA6B,oBACE3Z,KAAKsF,SAAS6L,MAAM+I,YAAc,GAClCla,KAAKsF,SAAS6L,MAAMgJ,aAAe,EACrC,CAGA,sBAAOxe,CAAgB2I,EAAQxE,GAC7B,OAAOE,KAAKuI,KAAK,WACf,MAAMC,EAAOmQ,GAAM3S,oBAAoBhG,KAAMsE,GAE7C,GAAsB,iBAAXA,EAAX,CAIA,QAA4B,IAAjBkE,EAAKlE,GACd,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,GAAQxE,EANb,CAOF,EACF,EAOFS,EAAac,GAAGpI,SAAUuS,GAnSG,2BAmSyC,SAAUpM,GAC9E,MAAMjC,EAASsJ,EAAekB,uBAAuB3H,MAEjD,CAAC,IAAK,QAAQoB,SAASpB,KAAKiI,UAC9B7I,EAAMmD,iBAGRhC,EAAae,IAAInE,EAAQsS,GAAY2K,IAC/BA,EAAUnY,kBAKd1B,EAAae,IAAInE,EAAQyS,GAAc,KACjCzW,EAAU6G,OACZA,KAAKmT,YAMX,MAAMkH,EAAc5T,EAAeG,QA3Tf,eA4ThByT,GACF1B,GAAM5S,YAAYsU,GAAazJ,OAGpB+H,GAAM3S,oBAAoB7I,GAElCyL,OAAO5I,KACd,GAEA6H,EAAqB8Q,IAMrBxd,EAAmBwd,IC/VnB,MAEMjT,GAAY,gBACZgF,GAAe,YACfa,GAAsB,OAAO7F,KAAYgF,KAGzCmF,GAAkB,OAClByK,GAAqB,UACrBC,GAAoB,SAEpBC,GAAgB,kBAEhB/K,GAAa,OAAO/J,KACpBgK,GAAc,QAAQhK,KACtBiK,GAAa,OAAOjK,KACpB0S,GAAuB,gBAAgB1S,KACvCkK,GAAe,SAASlK,KACxB2S,GAAe,SAAS3S,KACxB8F,GAAuB,QAAQ9F,KAAYgF,KAC3C8N,GAAwB,kBAAkB9S,KAI1CxB,GAAU,CACdwR,UAAU,EACVxJ,UAAU,EACVuO,QAAQ,GAGJtW,GAAc,CAClBuR,SAAU,mBACVxJ,SAAU,UACVuO,OAAQ,WAOV,MAAMC,WAAkBtV,EACtBT,YAAYhO,EAAS2N,GACnBe,MAAM1O,EAAS2N,GAEftE,KAAK2Q,UAAW,EAChB3Q,KAAK6Y,UAAY7Y,KAAK8Y,sBACtB9Y,KAAK+Y,WAAa/Y,KAAKgZ,uBACvBhZ,KAAK8M,oBACP,CAGA,kBAAW5I,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MA5DS,WA6DX,CAGAoN,OAAO9I,GACL,OAAOE,KAAK2Q,SAAW3Q,KAAK4Q,OAAS5Q,KAAK6Q,KAAK/Q,EACjD,CAEA+Q,KAAK/Q,GACCE,KAAK2Q,UAISpQ,EAAasB,QAAQ7B,KAAKsF,SAAUmK,GAAY,CAAE3P,kBAEtDmC,mBAIdjC,KAAK2Q,UAAW,EAChB3Q,KAAK6Y,UAAUhI,OAEV7Q,KAAKuF,QAAQkV,SAChB,IAAI1D,IAAkBnG,OAGxB5Q,KAAKsF,SAAShC,aAAa,cAAc,GACzCtD,KAAKsF,SAAShC,aAAa,OAAQ,UACnCtD,KAAKsF,SAASvL,UAAUuQ,IAAIgQ,IAY5Bta,KAAK6F,eAVoBsJ,KAClBnP,KAAKuF,QAAQkV,SAAUza,KAAKuF,QAAQmQ,UACvC1V,KAAK+Y,WAAW1C,WAGlBrW,KAAKsF,SAASvL,UAAUuQ,IAAIuF,IAC5B7P,KAAKsF,SAASvL,UAAUxC,OAAO+iB,IAC/B/Z,EAAasB,QAAQ7B,KAAKsF,SAAUoK,GAAa,CAAE5P,mBAGfE,KAAKsF,UAAU,GACvD,CAEAsL,OACO5Q,KAAK2Q,WAIQpQ,EAAasB,QAAQ7B,KAAKsF,SAAUqK,IAExC1N,mBAIdjC,KAAK+Y,WAAWvC,aAChBxW,KAAKsF,SAASqV,OACd3a,KAAK2Q,UAAW,EAChB3Q,KAAKsF,SAASvL,UAAUuQ,IAAIiQ,IAC5Bva,KAAK6Y,UAAUjI,OAcf5Q,KAAK6F,eAZoB+U,KACvB5a,KAAKsF,SAASvL,UAAUxC,OAAOsY,GAAiB0K,IAChDva,KAAKsF,SAAS9B,gBAAgB,cAC9BxD,KAAKsF,SAAS9B,gBAAgB,QAEzBxD,KAAKuF,QAAQkV,SAChB,IAAI1D,IAAkBS,QAGxBjX,EAAasB,QAAQ7B,KAAKsF,SAAUsK,KAGA5P,KAAKsF,UAAU,IACvD,CAEAG,UACEzF,KAAK6Y,UAAUpT,UACfzF,KAAK+Y,WAAWvC,aAChBnR,MAAMI,SACR,CAGAqT,sBACE,MAUM3f,EAAY2H,QAAQd,KAAKuF,QAAQmQ,UAEvC,OAAO,IAAIL,GAAS,CAClBH,UAlJsB,qBAmJtB/b,YACA2M,YAAY,EACZsP,YAAapV,KAAKsF,SAAS3L,WAC3Bwb,cAAehc,EAjBKgc,KACU,WAA1BnV,KAAKuF,QAAQmQ,SAKjB1V,KAAK4Q,OAJHrQ,EAAasB,QAAQ7B,KAAKsF,SAAU8S,KAeK,MAE/C,CAEAY,uBACE,OAAO,IAAI9C,GAAU,CACnBD,YAAajW,KAAKsF,UAEtB,CAEAwH,qBACEvM,EAAac,GAAGrB,KAAKsF,SAAUkT,GAAuBpZ,IAtKvC,WAuKTA,EAAMxI,MAINoJ,KAAKuF,QAAQ2G,SACflM,KAAK4Q,OAIPrQ,EAAasB,QAAQ7B,KAAKsF,SAAU8S,MAExC,CAGA,sBAAOzc,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOkS,GAAU1U,oBAAoBhG,KAAMsE,GAEjD,GAAsB,iBAAXA,EAAX,CAIA,QAAqBmE,IAAjBD,EAAKlE,IAAyBA,EAAO7C,WAAW,MAAmB,gBAAX6C,EAC1D,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,GAAQtE,KANb,CAOF,EACF,EAOFO,EAAac,GAAGpI,SAAUuS,GAzLG,+BAyLyC,SAAUpM,GAC9E,MAAMjC,EAASsJ,EAAekB,uBAAuB3H,MAMrD,GAJI,CAAC,IAAK,QAAQoB,SAASpB,KAAKiI,UAC9B7I,EAAMmD,iBAGJ3I,EAAWoG,MACb,OAGFO,EAAae,IAAInE,EAAQyS,GAAc,KAEjCzW,EAAU6G,OACZA,KAAKmT,UAKT,MAAMkH,EAAc5T,EAAeG,QAAQ4T,IACvCH,GAAeA,IAAgBld,GACjCud,GAAU3U,YAAYsU,GAAazJ,OAGxB8J,GAAU1U,oBAAoB7I,GACtCyL,OAAO5I,KACd,GAEAO,EAAac,GAAGzJ,OAAQ2T,GAAqB,KAC3C,IAAK,MAAM5T,KAAY8O,EAAetH,KAAKqb,IACzCE,GAAU1U,oBAAoBrO,GAAUkZ,SAI5CtQ,EAAac,GAAGzJ,OAAQygB,GAAc,KACpC,IAAK,MAAM1hB,KAAW8P,EAAetH,KAAK,gDACG,UAAvC7F,iBAAiB3C,GAASkkB,UAC5BH,GAAU1U,oBAAoBrP,GAASia,SAK7C/I,EAAqB6S,IAMrBvf,EAAmBuf,IC/QnB,MAEaI,GAAmB,CAE9B,IAAK,CAAC,QAAS,MAAO,KAAM,OAAQ,OAJP,kBAK7BC,EAAG,CAAC,SAAU,OAAQ,QAAS,OAC/BC,KAAM,GACNC,EAAG,GACHC,GAAI,GACJC,IAAK,GACLC,KAAM,GACNC,GAAI,GACJC,IAAK,GACLC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,EAAG,GACHhO,IAAK,CAAC,MAAO,SAAU,MAAO,QAAS,QAAS,UAChDiO,GAAI,GACJC,GAAI,GACJC,EAAG,GACHC,IAAK,GACLC,EAAG,GACHC,MAAO,GACPC,KAAM,GACNC,IAAK,GACLC,IAAK,GACLC,OAAQ,GACRC,EAAG,GACHC,GAAI,IAIAC,GAAgB,IAAIpe,IAAI,CAC5B,aACA,OACA,OACA,WACA,WACA,SACA,MACA,eASIqe,GAAmB,0DAEnBC,GAAmBA,CAACC,EAAWC,KACnC,MAAMC,EAAgBF,EAAUG,SAAS5kB,cAEzC,OAAI0kB,EAAqB9b,SAAS+b,IAC5BL,GAAchmB,IAAIqmB,IACbrc,QAAQic,GAAiB9X,KAAKgY,EAAUI,YAO5CH,EAAqBrZ,OAAOyZ,GAAkBA,aAA0BtY,QAC5EuY,KAAKC,GAASA,EAAMvY,KAAKkY,KC9DxBjZ,GAAU,CACduZ,UAAW3C,GACX4C,QAAS,GACTC,WAAY,GACZC,MAAM,EACNC,UAAU,EACVC,WAAY,KACZC,SAAU,eAGN5Z,GAAc,CAClBsZ,UAAW,SACXC,QAAS,SACTC,WAAY,oBACZC,KAAM,UACNC,SAAU,UACVC,WAAY,kBACZC,SAAU,UAGNC,GAAqB,CACzBC,MAAO,iCACPtmB,SAAU,oBAOZ,MAAMumB,WAAwBja,EAC5BU,YAAYL,GACVe,QACArF,KAAKuF,QAAUvF,KAAKqE,WAAWC,EACjC,CAGA,kBAAWJ,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MA/CS,iBAgDX,CAGA2iB,aACE,OAAO/lB,OAAO8G,OAAOc,KAAKuF,QAAQmY,SAC/BpX,IAAIhC,GAAUtE,KAAKoe,yBAAyB9Z,IAC5CT,OAAO/C,QACZ,CAEAud,aACE,OAAOre,KAAKme,aAAanlB,OAAS,CACpC,CAEAslB,cAAcZ,GAGZ,OAFA1d,KAAKue,cAAcb,GACnB1d,KAAKuF,QAAQmY,QAAU,IAAK1d,KAAKuF,QAAQmY,WAAYA,GAC9C1d,IACT,CAEAwe,SACE,MAAMC,EAAkBxlB,SAAS0c,cAAc,OAC/C8I,EAAgBC,UAAY1e,KAAK2e,eAAe3e,KAAKuF,QAAQwY,UAE7D,IAAK,MAAOpmB,EAAUinB,KAASxmB,OAAO+I,QAAQnB,KAAKuF,QAAQmY,SACzD1d,KAAK6e,YAAYJ,EAAiBG,EAAMjnB,GAG1C,MAAMomB,EAAWU,EAAgB5X,SAAS,GACpC8W,EAAa3d,KAAKoe,yBAAyBpe,KAAKuF,QAAQoY,YAM9D,OAJIA,GACFI,EAAShkB,UAAUuQ,OAAOqT,EAAW5gB,MAAM,MAGtCghB,CACT,CAGAtZ,iBAAiBH,GACfe,MAAMZ,iBAAiBH,GACvBtE,KAAKue,cAAcja,EAAOoZ,QAC5B,CAEAa,cAAcO,GACZ,IAAK,MAAOnnB,EAAU+lB,KAAYtlB,OAAO+I,QAAQ2d,GAC/CzZ,MAAMZ,iBAAiB,CAAE9M,WAAUsmB,MAAOP,GAAWM,GAEzD,CAEAa,YAAYd,EAAUL,EAAS/lB,GAC7B,MAAMonB,EAAkBtY,EAAeG,QAAQjP,EAAUomB,GAEpDgB,KAILrB,EAAU1d,KAAKoe,yBAAyBV,IAOpC9kB,EAAU8kB,GACZ1d,KAAKgf,sBAAsBjmB,EAAW2kB,GAAUqB,GAI9C/e,KAAKuF,QAAQqY,KACfmB,EAAgBL,UAAY1e,KAAK2e,eAAejB,GAIlDqB,EAAgBE,YAAcvB,EAd5BqB,EAAgBxnB,SAepB,CAEAonB,eAAeG,GACb,OAAO9e,KAAKuF,QAAQsY,SD1DjB,SAAsBqB,EAAYzB,EAAW0B,GAClD,IAAKD,EAAWlmB,OACd,OAAOkmB,EAGT,GAAIC,GAAgD,mBAArBA,EAC7B,OAAOA,EAAiBD,GAG1B,MACME,GADY,IAAIxnB,OAAOynB,WACKC,gBAAgBJ,EAAY,aACxDzI,EAAW,GAAG/P,UAAU0Y,EAAgBrkB,KAAKqF,iBAAiB,MAEpE,IAAK,MAAMzJ,KAAW8f,EAAU,CAC9B,MAAM8I,EAAc5oB,EAAQymB,SAAS5kB,cAErC,IAAKJ,OAAOd,KAAKmmB,GAAWrc,SAASme,GAAc,CACjD5oB,EAAQY,SACR,QACF,CAEA,MAAMioB,EAAgB,GAAG9Y,UAAU/P,EAAQ+M,YACrC+b,EAAoB,GAAG/Y,OAAO+W,EAAU,MAAQ,GAAIA,EAAU8B,IAAgB,IAEpF,IAAK,MAAMtC,KAAauC,EACjBxC,GAAiBC,EAAWwC,IAC/B9oB,EAAQ6M,gBAAgByZ,EAAUG,SAGxC,CAEA,OAAOgC,EAAgBrkB,KAAK2jB,SAC9B,CC0BmCgB,CAAaZ,EAAK9e,KAAKuF,QAAQkY,UAAWzd,KAAKuF,QAAQuY,YAAcgB,CACtG,CAEAV,yBAAyBU,GACvB,OAAO7iB,EAAQ6iB,EAAK,MAACrW,EAAWzI,MAClC,CAEAgf,sBAAsBroB,EAASooB,GAC7B,GAAI/e,KAAKuF,QAAQqY,KAGf,OAFAmB,EAAgBL,UAAY,QAC5BK,EAAgBnJ,OAAOjf,GAIzBooB,EAAgBE,YAActoB,EAAQsoB,WACxC,ECvIF,MACMU,GAAwB,IAAIjhB,IAAI,CAAC,WAAY,YAAa,eAE1DkhB,GAAkB,OAElB/P,GAAkB,OAElBgQ,GAAyB,iBACzBC,GAAiB,SAEjBC,GAAmB,gBAEnBC,GAAgB,QAChBC,GAAgB,QAChBC,GAAgB,QAchBC,GAAgB,CACpBC,KAAM,OACNC,IAAK,MACLC,MAAOrlB,IAAU,OAAS,QAC1BslB,OAAQ,SACRC,KAAMvlB,IAAU,QAAU,QAGtBiJ,GAAU,CACduZ,UAAW3C,GACX2F,WAAW,EACXlO,SAAU,kBACVmO,WAAW,EACXC,YAAa,GACbC,MAAO,EACPC,mBAAoB,CAAC,MAAO,QAAS,SAAU,QAC/CjD,MAAM,EACNnL,OAAQ,CAAC,EAAG,GACZwB,UAAW,MACXvB,aAAc,KACdmL,UAAU,EACVC,WAAY,KACZnmB,UAAU,EACVomB,SAAU,+GAIV+C,MAAO,GACPjf,QAAS,eAGLsC,GAAc,CAClBsZ,UAAW,SACXgD,UAAW,UACXlO,SAAU,mBACVmO,UAAW,2BACXC,YAAa,oBACbC,MAAO,kBACPC,mBAAoB,QACpBjD,KAAM,UACNnL,OAAQ,0BACRwB,UAAW,oBACXvB,aAAc,yBACdmL,SAAU,UACVC,WAAY,kBACZnmB,SAAU,mBACVomB,SAAU,SACV+C,MAAO,4BACPjf,QAAS,UAOX,MAAMkf,WAAgB3b,EACpBT,YAAYhO,EAAS2N,GACnB,QAAsB,IAAXiP,EACT,MAAM,IAAIrO,UAAU,wEAGtBG,MAAM1O,EAAS2N,GAGftE,KAAKghB,YAAa,EAClBhhB,KAAKihB,SAAW,EAChBjhB,KAAKkhB,WAAa,KAClBlhB,KAAKmhB,eAAiB,GACtBnhB,KAAK6S,QAAU,KACf7S,KAAKohB,iBAAmB,KACxBphB,KAAKqhB,YAAc,KAGnBrhB,KAAKshB,IAAM,KAEXthB,KAAKuhB,gBAEAvhB,KAAKuF,QAAQ5N,UAChBqI,KAAKwhB,WAET,CAGA,kBAAWtd,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MAxHS,SAyHX,CAGAimB,SACEzhB,KAAKghB,YAAa,CACpB,CAEAU,UACE1hB,KAAKghB,YAAa,CACpB,CAEAW,gBACE3hB,KAAKghB,YAAchhB,KAAKghB,UAC1B,CAEApY,SACO5I,KAAKghB,aAINhhB,KAAK2Q,WACP3Q,KAAK4hB,SAIP5hB,KAAK6hB,SACP,CAEApc,UACE4I,aAAarO,KAAKihB,UAElB1gB,EAAaC,IAAIR,KAAKsF,SAAS7L,QAAQqmB,IAAiBC,GAAkB/f,KAAK8hB,mBAE3E9hB,KAAKsF,SAASnL,aAAa,2BAC7B6F,KAAKsF,SAAShC,aAAa,QAAStD,KAAKsF,SAASnL,aAAa,2BAGjE6F,KAAK+hB,iBACL1c,MAAMI,SACR,CAEAoL,OACE,GAAoC,SAAhC7Q,KAAKsF,SAAS6L,MAAMqB,QACtB,MAAM,IAAIpO,MAAM,uCAGlB,IAAMpE,KAAKgiB,mBAAoBhiB,KAAKghB,WAClC,OAGF,MAAM5G,EAAY7Z,EAAasB,QAAQ7B,KAAKsF,SAAUtF,KAAK2E,YAAYuB,UAxJxD,SA0JT+b,GADa7nB,EAAe4F,KAAKsF,WACLtF,KAAKsF,SAAS4c,cAAc7nB,iBAAiBL,SAASgG,KAAKsF,UAE7F,GAAI8U,EAAUnY,mBAAqBggB,EACjC,OAIFjiB,KAAK+hB,iBAEL,MAAMT,EAAMthB,KAAKmiB,iBAEjBniB,KAAKsF,SAAShC,aAAa,mBAAoBge,EAAInnB,aAAa,OAEhE,MAAMumB,UAAEA,GAAc1gB,KAAKuF,QAe3B,GAbKvF,KAAKsF,SAAS4c,cAAc7nB,gBAAgBL,SAASgG,KAAKshB,OAC7DZ,EAAU9K,OAAO0L,GACjB/gB,EAAasB,QAAQ7B,KAAKsF,SAAUtF,KAAK2E,YAAYuB,UAzKpC,cA4KnBlG,KAAK6S,QAAU7S,KAAKkT,cAAcoO,GAElCA,EAAIvnB,UAAUuQ,IAAIuF,IAMd,iBAAkB5W,SAASoB,gBAC7B,IAAK,MAAM1D,IAAW,GAAG+P,UAAUzN,SAAS8B,KAAK8L,UAC/CtG,EAAac,GAAG1K,EAAS,YAAa+D,GAc1CsF,KAAK6F,eAVYwL,KACf9Q,EAAasB,QAAQ7B,KAAKsF,SAAUtF,KAAK2E,YAAYuB,UA5LvC,WA8LU,IAApBlG,KAAKkhB,YACPlhB,KAAK4hB,SAGP5hB,KAAKkhB,YAAa,GAGUlhB,KAAKshB,IAAKthB,KAAKoP,cAC/C,CAEAwB,OACE,GAAK5Q,KAAK2Q,aAIQpQ,EAAasB,QAAQ7B,KAAKsF,SAAUtF,KAAK2E,YAAYuB,UAhNxD,SAiNDjE,iBAAd,CASA,GALYjC,KAAKmiB,iBACbpoB,UAAUxC,OAAOsY,IAIjB,iBAAkB5W,SAASoB,gBAC7B,IAAK,MAAM1D,IAAW,GAAG+P,UAAUzN,SAAS8B,KAAK8L,UAC/CtG,EAAaC,IAAI7J,EAAS,YAAa+D,GAI3CsF,KAAKmhB,eAAejB,KAAiB,EACrClgB,KAAKmhB,eAAelB,KAAiB,EACrCjgB,KAAKmhB,eAAenB,KAAiB,EACrChgB,KAAKkhB,WAAa,KAelBlhB,KAAK6F,eAbYwL,KACXrR,KAAKoiB,yBAIJpiB,KAAKkhB,YACRlhB,KAAK+hB,iBAGP/hB,KAAKsF,SAAS9B,gBAAgB,oBAC9BjD,EAAasB,QAAQ7B,KAAKsF,SAAUtF,KAAK2E,YAAYuB,UA9OtC,aAiPalG,KAAKshB,IAAKthB,KAAKoP,cA/B7C,CAgCF,CAEAkE,SACMtT,KAAK6S,SACP7S,KAAK6S,QAAQS,QAEjB,CAGA0O,iBACE,OAAOlhB,QAAQd,KAAKqiB,YACtB,CAEAF,iBAKE,OAJKniB,KAAKshB,MACRthB,KAAKshB,IAAMthB,KAAKsiB,kBAAkBtiB,KAAKqhB,aAAerhB,KAAKuiB,2BAGtDviB,KAAKshB,GACd,CAEAgB,kBAAkB5E,GAChB,MAAM4D,EAAMthB,KAAKwiB,oBAAoB9E,GAASc,SAG9C,IAAK8C,EACH,OAAO,KAGTA,EAAIvnB,UAAUxC,OAAOqoB,GAAiB/P,IAEtCyR,EAAIvnB,UAAUuQ,IAAI,MAAMtK,KAAK2E,YAAYnJ,aAEzC,MAAMinB,EpBpRKC,KACb,GACEA,GAAU5kB,KAAK6kB,MAjCH,IAiCS7kB,KAAK8kB,gBACnB3pB,SAAS4pB,eAAeH,IAEjC,OAAOA,GoB+QSI,CAAO9iB,KAAK2E,YAAYnJ,MAAMlD,WAQ5C,OANAgpB,EAAIhe,aAAa,KAAMmf,GAEnBziB,KAAKoP,eACPkS,EAAIvnB,UAAUuQ,IAAIsV,IAGb0B,CACT,CAEAyB,WAAWrF,GACT1d,KAAKqhB,YAAc3D,EACf1d,KAAK2Q,aACP3Q,KAAK+hB,iBACL/hB,KAAK6Q,OAET,CAEA2R,oBAAoB9E,GAalB,OAZI1d,KAAKohB,iBACPphB,KAAKohB,iBAAiB9C,cAAcZ,GAEpC1d,KAAKohB,iBAAmB,IAAIlD,GAAgB,IACvCle,KAAKuF,QAGRmY,UACAC,WAAY3d,KAAKoe,yBAAyBpe,KAAKuF,QAAQob,eAIpD3gB,KAAKohB,gBACd,CAEAmB,yBACE,MAAO,CACL1C,CAACA,IAAyB7f,KAAKqiB,YAEnC,CAEAA,YACE,OAAOriB,KAAKoe,yBAAyBpe,KAAKuF,QAAQub,QAAU9gB,KAAKsF,SAASnL,aAAa,yBACzF,CAGA6oB,6BAA6B5jB,GAC3B,OAAOY,KAAK2E,YAAYqB,oBAAoB5G,EAAMW,eAAgBC,KAAKijB,qBACzE,CAEA7T,cACE,OAAOpP,KAAKuF,QAAQkb,WAAczgB,KAAKshB,KAAOthB,KAAKshB,IAAIvnB,UAAUC,SAAS4lB,GAC5E,CAEAjP,WACE,OAAO3Q,KAAKshB,KAAOthB,KAAKshB,IAAIvnB,UAAUC,SAAS6V,GACjD,CAEAqD,cAAcoO,GACZ,MAAMrN,EAAYhY,EAAQ+D,KAAKuF,QAAQ0O,UAAW,CAACjU,KAAMshB,EAAKthB,KAAKsF,WAC7D4d,EAAa/C,GAAclM,EAAU9O,eAC3C,OAAOoO,EAAOG,aAAa1T,KAAKsF,SAAUgc,EAAKthB,KAAKyT,iBAAiByP,GACvE,CAEApP,aACE,MAAMrB,OAAEA,GAAWzS,KAAKuF,QAExB,MAAsB,iBAAXkN,EACFA,EAAO1V,MAAM,KAAKuJ,IAAI5D,GAAS9F,OAAO8R,SAAShM,EAAO,KAGzC,mBAAX+P,EACFsB,GAActB,EAAOsB,EAAY/T,KAAKsF,UAGxCmN,CACT,CAEA2L,yBAAyBU,GACvB,OAAO7iB,EAAQ6iB,EAAK,CAAC9e,KAAKsF,SAAUtF,KAAKsF,UAC3C,CAEAmO,iBAAiByP,GACf,MAAMlP,EAAwB,CAC5BC,UAAWiP,EACXhP,UAAW,CACT,CACE3Y,KAAM,OACN4Y,QAAS,CACP0M,mBAAoB7gB,KAAKuF,QAAQsb,qBAGrC,CACEtlB,KAAM,SACN4Y,QAAS,CACP1B,OAAQzS,KAAK8T,eAGjB,CACEvY,KAAM,kBACN4Y,QAAS,CACP5B,SAAUvS,KAAKuF,QAAQgN,WAG3B,CACEhX,KAAM,QACN4Y,QAAS,CACPxd,QAAS,IAAIqJ,KAAK2E,YAAYnJ,eAGlC,CACED,KAAM,kBACN6Y,SAAS,EACT+O,MAAO,aACPznB,GAAI8M,IAGFxI,KAAKmiB,iBAAiB7e,aAAa,wBAAyBkF,EAAK4a,MAAMnP,eAM/E,MAAO,IACFD,KACA/X,EAAQ+D,KAAKuF,QAAQmN,aAAc,MAACjK,EAAWuL,IAEtD,CAEAuN,gBACE,MAAM8B,EAAWrjB,KAAKuF,QAAQ1D,QAAQ9E,MAAM,KAE5C,IAAK,MAAM8E,KAAWwhB,EACpB,GAAgB,UAAZxhB,EACFtB,EAAac,GAAGrB,KAAKsF,SAAUtF,KAAK2E,YAAYuB,UArZpC,SAqZ4DlG,KAAKuF,QAAQ5N,SAAUyH,IAC7F,MAAMoV,EAAUxU,KAAKgjB,6BAA6B5jB,GAClDoV,EAAQ2M,eAAejB,MAAmB1L,EAAQ7D,YAAc6D,EAAQ2M,eAAejB,KACvF1L,EAAQ5L,gBAEL,GAjaU,WAiaN/G,EAA4B,CACrC,MAAMyhB,EAAUzhB,IAAYme,GAC1BhgB,KAAK2E,YAAYuB,UAzZF,cA0ZflG,KAAK2E,YAAYuB,UA5ZL,WA6ZRqd,EAAW1hB,IAAYme,GAC3BhgB,KAAK2E,YAAYuB,UA3ZF,cA4ZflG,KAAK2E,YAAYuB,UA9ZJ,YAgaf3F,EAAac,GAAGrB,KAAKsF,SAAUge,EAAStjB,KAAKuF,QAAQ5N,SAAUyH,IAC7D,MAAMoV,EAAUxU,KAAKgjB,6BAA6B5jB,GAClDoV,EAAQ2M,eAA8B,YAAf/hB,EAAMqB,KAAqBwf,GAAgBD,KAAiB,EACnFxL,EAAQqN,WAEVthB,EAAac,GAAGrB,KAAKsF,SAAUie,EAAUvjB,KAAKuF,QAAQ5N,SAAUyH,IAC9D,MAAMoV,EAAUxU,KAAKgjB,6BAA6B5jB,GAClDoV,EAAQ2M,eAA8B,aAAf/hB,EAAMqB,KAAsBwf,GAAgBD,IACjExL,EAAQlP,SAAStL,SAASoF,EAAMU,eAElC0U,EAAQoN,UAEZ,CAGF5hB,KAAK8hB,kBAAoB,KACnB9hB,KAAKsF,UACPtF,KAAK4Q,QAITrQ,EAAac,GAAGrB,KAAKsF,SAAS7L,QAAQqmB,IAAiBC,GAAkB/f,KAAK8hB,kBAChF,CAEAN,YACE,MAAMV,EAAQ9gB,KAAKsF,SAASnL,aAAa,SAEpC2mB,IAIA9gB,KAAKsF,SAASnL,aAAa,eAAkB6F,KAAKsF,SAAS2Z,YAAY5Y,QAC1ErG,KAAKsF,SAAShC,aAAa,aAAcwd,GAG3C9gB,KAAKsF,SAAShC,aAAa,yBAA0Bwd,GACrD9gB,KAAKsF,SAAS9B,gBAAgB,SAChC,CAEAqe,SACM7hB,KAAK2Q,YAAc3Q,KAAKkhB,WAC1BlhB,KAAKkhB,YAAa,GAIpBlhB,KAAKkhB,YAAa,EAElBlhB,KAAKwjB,YAAY,KACXxjB,KAAKkhB,YACPlhB,KAAK6Q,QAEN7Q,KAAKuF,QAAQqb,MAAM/P,MACxB,CAEA+Q,SACM5hB,KAAKoiB,yBAITpiB,KAAKkhB,YAAa,EAElBlhB,KAAKwjB,YAAY,KACVxjB,KAAKkhB,YACRlhB,KAAK4Q,QAEN5Q,KAAKuF,QAAQqb,MAAMhQ,MACxB,CAEA4S,YAAYtmB,EAASumB,GACnBpV,aAAarO,KAAKihB,UAClBjhB,KAAKihB,SAAW5jB,WAAWH,EAASumB,EACtC,CAEArB,uBACE,OAAOhqB,OAAO8G,OAAOc,KAAKmhB,gBAAgB/f,UAAS,EACrD,CAEAiD,WAAWC,GACT,MAAMof,EAAiBtgB,EAAYK,kBAAkBzD,KAAKsF,UAE1D,IAAK,MAAMqe,KAAiBvrB,OAAOd,KAAKosB,GAClC/D,GAAsB7oB,IAAI6sB,WACrBD,EAAeC,GAW1B,OAPArf,EAAS,IACJof,KACmB,iBAAXpf,GAAuBA,EAASA,EAAS,IAEtDA,EAAStE,KAAKuE,gBAAgBD,GAC9BA,EAAStE,KAAKwE,kBAAkBF,GAChCtE,KAAKyE,iBAAiBH,GACfA,CACT,CAEAE,kBAAkBF,GAkBhB,OAjBAA,EAAOoc,WAAiC,IAArBpc,EAAOoc,UAAsBznB,SAAS8B,KAAOhC,EAAWuL,EAAOoc,WAEtD,iBAAjBpc,EAAOsc,QAChBtc,EAAOsc,MAAQ,CACb/P,KAAMvM,EAAOsc,MACbhQ,KAAMtM,EAAOsc,QAIW,iBAAjBtc,EAAOwc,QAChBxc,EAAOwc,MAAQxc,EAAOwc,MAAMxoB,YAGA,iBAAnBgM,EAAOoZ,UAChBpZ,EAAOoZ,QAAUpZ,EAAOoZ,QAAQplB,YAG3BgM,CACT,CAEA2e,qBACE,MAAM3e,EAAS,GAEf,IAAK,MAAO1N,EAAK8L,KAAUtK,OAAO+I,QAAQnB,KAAKuF,SACzCvF,KAAK2E,YAAYT,QAAQtN,KAAS8L,IACpC4B,EAAO1N,GAAO8L,GAUlB,OANA4B,EAAO3M,UAAW,EAClB2M,EAAOzC,QAAU,SAKVyC,CACT,CAEAyd,iBACM/hB,KAAK6S,UACP7S,KAAK6S,QAAQQ,UACbrT,KAAK6S,QAAU,MAGb7S,KAAKshB,MACPthB,KAAKshB,IAAI/pB,SACTyI,KAAKshB,IAAM,KAEf,CAGA,sBAAO3lB,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOuY,GAAQ/a,oBAAoBhG,KAAMsE,GAE/C,GAAsB,iBAAXA,EAAX,CAIA,QAA4B,IAAjBkE,EAAKlE,GACd,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,IANL,CAOF,EACF,EAOFnJ,EAAmB4lB,ICxmBnB,MAEM6C,GAAiB,kBACjBC,GAAmB,gBAEnB3f,GAAU,IACX6c,GAAQ7c,QACXwZ,QAAS,GACTjL,OAAQ,CAAC,EAAG,GACZwB,UAAW,QACX8J,SAAU,8IAKVlc,QAAS,SAGLsC,GAAc,IACf4c,GAAQ5c,YACXuZ,QAAS,kCAOX,MAAMoG,WAAgB/C,GAEpB,kBAAW7c,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MAtCS,SAuCX,CAGAwmB,iBACE,OAAOhiB,KAAKqiB,aAAeriB,KAAK+jB,aAClC,CAGAxB,yBACE,MAAO,CACLqB,CAACA,IAAiB5jB,KAAKqiB,YACvBwB,CAACA,IAAmB7jB,KAAK+jB,cAE7B,CAEAA,cACE,OAAO/jB,KAAKoe,yBAAyBpe,KAAKuF,QAAQmY,QACpD,CAGA,sBAAO/hB,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOsb,GAAQ9d,oBAAoBhG,KAAMsE,GAE/C,GAAsB,iBAAXA,EAAX,CAIA,QAA4B,IAAjBkE,EAAKlE,GACd,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,IANL,CAOF,EACF,EAOFnJ,EAAmB2oB,IC5EnB,MAEMpe,GAAY,gBAGZse,GAAiB,WAAWte,KAC5Bue,GAAc,QAAQve,KACtB6F,GAAsB,OAAO7F,cAG7BgG,GAAoB,SAGpBwY,GAAwB,SAExBC,GAAqB,YAGrBC,GAAsB,GAAGD,mBAA+CA,uBAIxEjgB,GAAU,CACduO,OAAQ,KACR4R,WAAY,eACZC,cAAc,EACdnnB,OAAQ,KACRonB,UAAW,CAAC,GAAK,GAAK,IAGlBpgB,GAAc,CAClBsO,OAAQ,gBACR4R,WAAY,SACZC,aAAc,UACdnnB,OAAQ,UACRonB,UAAW,SAOb,MAAMC,WAAkBpf,EACtBT,YAAYhO,EAAS2N,GACnBe,MAAM1O,EAAS2N,GAGftE,KAAKykB,aAAe,IAAIjuB,IACxBwJ,KAAK0kB,oBAAsB,IAAIluB,IAC/BwJ,KAAK2kB,aAA6D,YAA9CrrB,iBAAiB0G,KAAKsF,UAAU0U,UAA0B,KAAOha,KAAKsF,SAC1FtF,KAAK4kB,cAAgB,KACrB5kB,KAAK6kB,UAAY,KACjB7kB,KAAK8kB,oBAAsB,CACzBC,gBAAiB,EACjBC,gBAAiB,GAEnBhlB,KAAKilB,SACP,CAGA,kBAAW/gB,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MArES,WAsEX,CAGAypB,UACEjlB,KAAKklB,mCACLllB,KAAKmlB,2BAEDnlB,KAAK6kB,UACP7kB,KAAK6kB,UAAUO,aAEfplB,KAAK6kB,UAAY7kB,KAAKqlB,kBAGxB,IAAK,MAAMC,KAAWtlB,KAAK0kB,oBAAoBxlB,SAC7Cc,KAAK6kB,UAAUU,QAAQD,EAE3B,CAEA7f,UACEzF,KAAK6kB,UAAUO,aACf/f,MAAMI,SACR,CAGAjB,kBAAkBF,GAWhB,OATAA,EAAOnH,OAASpE,EAAWuL,EAAOnH,SAAWlE,SAAS8B,KAGtDuJ,EAAO+f,WAAa/f,EAAOmO,OAAS,GAAGnO,EAAOmO,oBAAsBnO,EAAO+f,WAE3C,iBAArB/f,EAAOigB,YAChBjgB,EAAOigB,UAAYjgB,EAAOigB,UAAUxnB,MAAM,KAAKuJ,IAAI5D,GAAS9F,OAAOC,WAAW6F,KAGzE4B,CACT,CAEA6gB,2BACOnlB,KAAKuF,QAAQ+e,eAKlB/jB,EAAaC,IAAIR,KAAKuF,QAAQpI,OAAQ8mB,IAEtC1jB,EAAac,GAAGrB,KAAKuF,QAAQpI,OAAQ8mB,GAAaC,GAAuB9kB,IACvE,MAAMomB,EAAoBxlB,KAAK0kB,oBAAoB1tB,IAAIoI,EAAMjC,OAAOsoB,MACpE,GAAID,EAAmB,CACrBpmB,EAAMmD,iBACN,MAAM/H,EAAOwF,KAAK2kB,cAAgB/sB,OAC5B8tB,EAASF,EAAkBG,UAAY3lB,KAAKsF,SAASqgB,UAC3D,GAAInrB,EAAKorB,SAEP,YADAprB,EAAKorB,SAAS,CAAEC,IAAKH,EAAQI,SAAU,WAKzCtrB,EAAK8e,UAAYoM,CACnB,IAEJ,CAEAL,kBACE,MAAMlR,EAAU,CACd3Z,KAAMwF,KAAK2kB,aACXJ,UAAWvkB,KAAKuF,QAAQgf,UACxBF,WAAYrkB,KAAKuF,QAAQ8e,YAG3B,OAAO,IAAI0B,qBAAqB5kB,GAAWnB,KAAKgmB,kBAAkB7kB,GAAUgT,EAC9E,CAGA6R,kBAAkB7kB,GAChB,MAAM8kB,EAAgBhI,GAASje,KAAKykB,aAAaztB,IAAI,IAAIinB,EAAM9gB,OAAOlF,MAChEoe,EAAW4H,IACfje,KAAK8kB,oBAAoBC,gBAAkB9G,EAAM9gB,OAAOwoB,UACxD3lB,KAAKkmB,SAASD,EAAchI,KAGxB+G,GAAmBhlB,KAAK2kB,cAAgB1rB,SAASoB,iBAAiBif,UAClE6M,EAAkBnB,GAAmBhlB,KAAK8kB,oBAAoBE,gBACpEhlB,KAAK8kB,oBAAoBE,gBAAkBA,EAE3C,IAAK,MAAM/G,KAAS9c,EAAS,CAC3B,IAAK8c,EAAMmI,eAAgB,CACzBpmB,KAAK4kB,cAAgB,KACrB5kB,KAAKqmB,kBAAkBJ,EAAchI,IAErC,QACF,CAEA,MAAMqI,EAA2BrI,EAAM9gB,OAAOwoB,WAAa3lB,KAAK8kB,oBAAoBC,gBAEpF,GAAIoB,GAAmBG,GAGrB,GAFAjQ,EAAS4H,IAEJ+G,EACH,YAOCmB,GAAoBG,GACvBjQ,EAAS4H,EAEb,CACF,CAEAiH,mCACEllB,KAAKykB,aAAe,IAAIjuB,IACxBwJ,KAAK0kB,oBAAsB,IAAIluB,IAE/B,MAAM+vB,EAAc9f,EAAetH,KAAK+kB,GAAuBlkB,KAAKuF,QAAQpI,QAE5E,IAAK,MAAMqpB,KAAUD,EAAa,CAEhC,IAAKC,EAAOf,MAAQ7rB,EAAW4sB,GAC7B,SAGF,MAAMhB,EAAoB/e,EAAeG,QAAQ6f,UAAUD,EAAOf,MAAOzlB,KAAKsF,UAG1EnM,EAAUqsB,KACZxlB,KAAKykB,aAAa/tB,IAAI+vB,UAAUD,EAAOf,MAAOe,GAC9CxmB,KAAK0kB,oBAAoBhuB,IAAI8vB,EAAOf,KAAMD,GAE9C,CACF,CAEAU,SAAS/oB,GACH6C,KAAK4kB,gBAAkBznB,IAI3B6C,KAAKqmB,kBAAkBrmB,KAAKuF,QAAQpI,QACpC6C,KAAK4kB,cAAgBznB,EACrBA,EAAOpD,UAAUuQ,IAAIoB,IACrB1L,KAAK0mB,iBAAiBvpB,GAEtBoD,EAAasB,QAAQ7B,KAAKsF,SAAU0e,GAAgB,CAAElkB,cAAe3C,IACvE,CAEAupB,iBAAiBvpB,GAEf,GAAIA,EAAOpD,UAAUC,SAlNQ,iBAmN3ByM,EAAeG,QAxMY,mBAwMsBzJ,EAAO1D,QAzMpC,cA0MjBM,UAAUuQ,IAAIoB,SAInB,IAAK,MAAMib,KAAalgB,EAAeO,QAAQ7J,EAnNnB,qBAsN1B,IAAK,MAAMypB,KAAQngB,EAAeS,KAAKyf,EAAWvC,IAChDwC,EAAK7sB,UAAUuQ,IAAIoB,GAGzB,CAEA2a,kBAAkBpW,GAChBA,EAAOlW,UAAUxC,OAAOmU,IAExB,MAAMmb,EAAcpgB,EAAetH,KAAK,GAAG+kB,MAAyBxY,KAAqBuE,GACzF,IAAK,MAAM6W,KAAQD,EACjBC,EAAK/sB,UAAUxC,OAAOmU,GAE1B,CAGA,sBAAO/P,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOgc,GAAUxe,oBAAoBhG,KAAMsE,GAEjD,GAAsB,iBAAXA,EAAX,CAIA,QAAqBmE,IAAjBD,EAAKlE,IAAyBA,EAAO7C,WAAW,MAAmB,gBAAX6C,EAC1D,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,IANL,CAOF,EACF,EAOF/D,EAAac,GAAGzJ,OAAQ2T,GAAqB,KAC3C,IAAK,MAAMwb,KAAOtgB,EAAetH,KA9PT,0BA+PtBqlB,GAAUxe,oBAAoB+gB,KAQlC5rB,EAAmBqpB,ICrRnB,MAEM9e,GAAY,UAEZiK,GAAa,OAAOjK,KACpBkK,GAAe,SAASlK,KACxB+J,GAAa,OAAO/J,KACpBgK,GAAc,QAAQhK,KACtB8F,GAAuB,QAAQ9F,KAC/ByF,GAAgB,UAAUzF,KAC1B6F,GAAsB,OAAO7F,KAE7BiF,GAAiB,YACjBC,GAAkB,aAClB8G,GAAe,UACfC,GAAiB,YACjBqV,GAAW,OACXC,GAAU,MAEVvb,GAAoB,SACpBkU,GAAkB,OAClB/P,GAAkB,OAGlBqX,GAA2B,mBAE3BC,GAA+B,QAAQD,MAKvCxe,GAAuB,2EACvB0e,GAAsB,YAFOD,uBAAiDA,mBAA6CA,OAE/Eze,KAE5C2e,GAA8B,IAAI3b,8BAA6CA,+BAA8CA,4BAMnI,MAAM4b,WAAYliB,EAChBT,YAAYhO,GACV0O,MAAM1O,GACNqJ,KAAK8S,QAAU9S,KAAKsF,SAAS7L,QAfN,uCAiBlBuG,KAAK8S,UAOV9S,KAAKunB,sBAAsBvnB,KAAK8S,QAAS9S,KAAKwnB,gBAE9CjnB,EAAac,GAAGrB,KAAKsF,SAAU6F,GAAe/L,GAASY,KAAK+N,SAAS3O,IACvE,CAGA,eAAW5D,GACT,MA3DS,KA4DX,CAGAqV,OACE,MAAM4W,EAAYznB,KAAKsF,SACvB,GAAItF,KAAK0nB,cAAcD,GACrB,OAIF,MAAME,EAAS3nB,KAAK4nB,iBAEdC,EAAYF,EAChBpnB,EAAasB,QAAQ8lB,EAAQhY,GAAY,CAAE7P,cAAe2nB,IAC1D,KAEgBlnB,EAAasB,QAAQ4lB,EAAWhY,GAAY,CAAE3P,cAAe6nB,IAEjE1lB,kBAAqB4lB,GAAaA,EAAU5lB,mBAI1DjC,KAAK8nB,YAAYH,EAAQF,GACzBznB,KAAK+nB,UAAUN,EAAWE,GAC5B,CAGAI,UAAUpxB,EAASqxB,GACZrxB,IAILA,EAAQoD,UAAUuQ,IAAIoB,IAEtB1L,KAAK+nB,UAAUthB,EAAekB,uBAAuBhR,IAgBrDqJ,KAAK6F,eAdYwL,KACsB,QAAjC1a,EAAQwD,aAAa,SAKzBxD,EAAQ6M,gBAAgB,YACxB7M,EAAQ2M,aAAa,iBAAiB,GACtCtD,KAAKioB,gBAAgBtxB,GAAS,GAC9B4J,EAAasB,QAAQlL,EAAS+Y,GAAa,CACzC5P,cAAekoB,KARfrxB,EAAQoD,UAAUuQ,IAAIuF,KAYIlZ,EAASA,EAAQoD,UAAUC,SAAS4lB,KACpE,CAEAkI,YAAYnxB,EAASqxB,GACdrxB,IAILA,EAAQoD,UAAUxC,OAAOmU,IACzB/U,EAAQgkB,OAER3a,KAAK8nB,YAAYrhB,EAAekB,uBAAuBhR,IAcvDqJ,KAAK6F,eAZYwL,KACsB,QAAjC1a,EAAQwD,aAAa,SAKzBxD,EAAQ2M,aAAa,iBAAiB,GACtC3M,EAAQ2M,aAAa,WAAY,MACjCtD,KAAKioB,gBAAgBtxB,GAAS,GAC9B4J,EAAasB,QAAQlL,EAASiZ,GAAc,CAAE9P,cAAekoB,KAP3DrxB,EAAQoD,UAAUxC,OAAOsY,KAUClZ,EAASA,EAAQoD,UAAUC,SAAS4lB,KACpE,CAEA7R,SAAS3O,GACP,IAAM,CAACuL,GAAgBC,GAAiB8G,GAAcC,GAAgBqV,GAAUC,IAAS7lB,SAAShC,EAAMxI,KACtG,OAGFwI,EAAM4V,kBACN5V,EAAMmD,iBAEN,MAAMsE,EAAW7G,KAAKwnB,eAAe3jB,OAAOlN,IAAYiD,EAAWjD,IACnE,IAAIuxB,EAEJ,GAAI,CAAClB,GAAUC,IAAS7lB,SAAShC,EAAMxI,KACrCsxB,EAAoBrhB,EAASzH,EAAMxI,MAAQowB,GAAW,EAAIngB,EAAS7N,OAAS,OACvE,CACL,MAAM2V,EAAS,CAAC/D,GAAiB+G,IAAgBvQ,SAAShC,EAAMxI,KAChEsxB,EAAoB5qB,EAAqBuJ,EAAUzH,EAAMjC,OAAQwR,GAAQ,EAC3E,CAEIuZ,IACFA,EAAkB/U,MAAM,CAAEgV,eAAe,IACzCb,GAAIthB,oBAAoBkiB,GAAmBrX,OAE/C,CAEA2W,eACE,OAAO/gB,EAAetH,KAAKioB,GAAqBpnB,KAAK8S,QACvD,CAEA8U,iBACE,OAAO5nB,KAAKwnB,eAAeroB,KAAK2H,GAAS9G,KAAK0nB,cAAc5gB,KAAW,IACzE,CAEAygB,sBAAsBtX,EAAQpJ,GAC5B7G,KAAKooB,yBAAyBnY,EAAQ,OAAQ,WAE9C,IAAK,MAAMnJ,KAASD,EAClB7G,KAAKqoB,6BAA6BvhB,EAEtC,CAEAuhB,6BAA6BvhB,GAC3BA,EAAQ9G,KAAKsoB,iBAAiBxhB,GAC9B,MAAMyhB,EAAWvoB,KAAK0nB,cAAc5gB,GAC9B0hB,EAAYxoB,KAAKyoB,iBAAiB3hB,GACxCA,EAAMxD,aAAa,gBAAiBilB,GAEhCC,IAAc1hB,GAChB9G,KAAKooB,yBAAyBI,EAAW,OAAQ,gBAG9CD,GACHzhB,EAAMxD,aAAa,WAAY,MAGjCtD,KAAKooB,yBAAyBthB,EAAO,OAAQ,OAG7C9G,KAAK0oB,mCAAmC5hB,EAC1C,CAEA4hB,mCAAmC5hB,GACjC,MAAM3J,EAASsJ,EAAekB,uBAAuBb,GAEhD3J,IAIL6C,KAAKooB,yBAAyBjrB,EAAQ,OAAQ,YAE1C2J,EAAM7O,IACR+H,KAAKooB,yBAAyBjrB,EAAQ,kBAAmB,GAAG2J,EAAM7O,MAEtE,CAEAgwB,gBAAgBtxB,EAASgyB,GACvB,MAAMH,EAAYxoB,KAAKyoB,iBAAiB9xB,GACxC,IAAK6xB,EAAUzuB,UAAUC,SAhMN,YAiMjB,OAGF,MAAM4O,EAASA,CAACjR,EAAUud,KACxB,MAAMve,EAAU8P,EAAeG,QAAQjP,EAAU6wB,GAC7C7xB,GACFA,EAAQoD,UAAU6O,OAAOsM,EAAWyT,IAIxC/f,EAAOse,GAA0Bxb,IACjC9C,EAzM2B,iBAyMIiH,IAC/B2Y,EAAUllB,aAAa,gBAAiBqlB,EAC1C,CAEAP,yBAAyBzxB,EAASsmB,EAAWva,GACtC/L,EAAQuD,aAAa+iB,IACxBtmB,EAAQ2M,aAAa2Z,EAAWva,EAEpC,CAEAglB,cAAcpX,GACZ,OAAOA,EAAKvW,UAAUC,SAAS0R,GACjC,CAGA4c,iBAAiBhY,GACf,OAAOA,EAAKvJ,QAAQqgB,IAAuB9W,EAAO7J,EAAeG,QAAQwgB,GAAqB9W,EAChG,CAGAmY,iBAAiBnY,GACf,OAAOA,EAAK7W,QA1NO,gCA0NoB6W,CACzC,CAGA,sBAAO3U,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAO8e,GAAIthB,oBAAoBhG,MAErC,GAAsB,iBAAXsE,EAAX,CAIA,QAAqBmE,IAAjBD,EAAKlE,IAAyBA,EAAO7C,WAAW,MAAmB,gBAAX6C,EAC1D,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,IANL,CAOF,EACF,EAOF/D,EAAac,GAAGpI,SAAUuS,GAAsB9C,GAAsB,SAAUtJ,GAC1E,CAAC,IAAK,QAAQgC,SAASpB,KAAKiI,UAC9B7I,EAAMmD,iBAGJ3I,EAAWoG,OAIfsnB,GAAIthB,oBAAoBhG,MAAM6Q,MAChC,GAKAtQ,EAAac,GAAGzJ,OAAQ2T,GAAqB,KAC3C,IAAK,MAAM5U,KAAW8P,EAAetH,KAAKkoB,IACxCC,GAAIthB,oBAAoBrP,KAO5BwE,EAAmBmsB,ICxSnB,MAEM5hB,GAAY,YAEZkjB,GAAkB,YAAYljB,KAC9BmjB,GAAiB,WAAWnjB,KAC5BmQ,GAAgB,UAAUnQ,KAC1BojB,GAAiB,WAAWpjB,KAC5BiK,GAAa,OAAOjK,KACpBkK,GAAe,SAASlK,KACxB+J,GAAa,OAAO/J,KACpBgK,GAAc,QAAQhK,KAGtBqjB,GAAkB,OAClBlZ,GAAkB,OAClByK,GAAqB,UAErBnW,GAAc,CAClBsc,UAAW,UACXuI,SAAU,UACVpI,MAAO,UAGH1c,GAAU,CACduc,WAAW,EACXuI,UAAU,EACVpI,MAAO,KAOT,MAAMqI,WAAc7jB,EAClBT,YAAYhO,EAAS2N,GACnBe,MAAM1O,EAAS2N,GAEftE,KAAKihB,SAAW,KAChBjhB,KAAKkpB,sBAAuB,EAC5BlpB,KAAKmpB,yBAA0B,EAC/BnpB,KAAKuhB,eACP,CAGA,kBAAWrd,GACT,OAAOA,EACT,CAEA,sBAAWC,GACT,OAAOA,EACT,CAEA,eAAW3I,GACT,MAtDS,OAuDX,CAGAqV,OACoBtQ,EAAasB,QAAQ7B,KAAKsF,SAAUmK,IAExCxN,mBAIdjC,KAAKopB,gBAEDppB,KAAKuF,QAAQkb,WACfzgB,KAAKsF,SAASvL,UAAUuQ,IAvDN,QAiEpBtK,KAAKsF,SAASvL,UAAUxC,OAAOwxB,IAC/BpuB,EAAOqF,KAAKsF,UACZtF,KAAKsF,SAASvL,UAAUuQ,IAAIuF,GAAiByK,IAE7Cta,KAAK6F,eAXYwL,KACfrR,KAAKsF,SAASvL,UAAUxC,OAAO+iB,IAC/B/Z,EAAasB,QAAQ7B,KAAKsF,SAAUoK,IAEpC1P,KAAKqpB,sBAOuBrpB,KAAKsF,SAAUtF,KAAKuF,QAAQkb,WAC5D,CAEA7P,OACO5Q,KAAKspB,YAIQ/oB,EAAasB,QAAQ7B,KAAKsF,SAAUqK,IAExC1N,mBAUdjC,KAAKsF,SAASvL,UAAUuQ,IAAIgQ,IAC5Bta,KAAK6F,eAPYwL,KACfrR,KAAKsF,SAASvL,UAAUuQ,IAAIye,IAC5B/oB,KAAKsF,SAASvL,UAAUxC,OAAO+iB,GAAoBzK,IACnDtP,EAAasB,QAAQ7B,KAAKsF,SAAUsK,KAIR5P,KAAKsF,SAAUtF,KAAKuF,QAAQkb,YAC5D,CAEAhb,UACEzF,KAAKopB,gBAEDppB,KAAKspB,WACPtpB,KAAKsF,SAASvL,UAAUxC,OAAOsY,IAGjCxK,MAAMI,SACR,CAEA6jB,UACE,OAAOtpB,KAAKsF,SAASvL,UAAUC,SAAS6V,GAC1C,CAGAwZ,qBACOrpB,KAAKuF,QAAQyjB,WAIdhpB,KAAKkpB,sBAAwBlpB,KAAKmpB,0BAItCnpB,KAAKihB,SAAW5jB,WAAW,KACzB2C,KAAK4Q,QACJ5Q,KAAKuF,QAAQqb,QAClB,CAEA2I,eAAenqB,EAAOoqB,GACpB,OAAQpqB,EAAMqB,MACZ,IAAK,YACL,IAAK,WACHT,KAAKkpB,qBAAuBM,EAC5B,MAGF,IAAK,UACL,IAAK,WACHxpB,KAAKmpB,wBAA0BK,EASnC,GAAIA,EAEF,YADAxpB,KAAKopB,gBAIP,MAAMxa,EAAcxP,EAAMU,cACtBE,KAAKsF,WAAasJ,GAAe5O,KAAKsF,SAAStL,SAAS4U,IAI5D5O,KAAKqpB,oBACP,CAEA9H,gBACEhhB,EAAac,GAAGrB,KAAKsF,SAAUsjB,GAAiBxpB,GAASY,KAAKupB,eAAenqB,GAAO,IACpFmB,EAAac,GAAGrB,KAAKsF,SAAUujB,GAAgBzpB,GAASY,KAAKupB,eAAenqB,GAAO,IACnFmB,EAAac,GAAGrB,KAAKsF,SAAUuQ,GAAezW,GAASY,KAAKupB,eAAenqB,GAAO,IAClFmB,EAAac,GAAGrB,KAAKsF,SAAUwjB,GAAgB1pB,GAASY,KAAKupB,eAAenqB,GAAO,GACrF,CAEAgqB,gBACE/a,aAAarO,KAAKihB,UAClBjhB,KAAKihB,SAAW,IAClB,CAGA,sBAAOtlB,CAAgB2I,GACrB,OAAOtE,KAAKuI,KAAK,WACf,MAAMC,EAAOygB,GAAMjjB,oBAAoBhG,KAAMsE,GAE7C,GAAsB,iBAAXA,EAAqB,CAC9B,QAA4B,IAAjBkE,EAAKlE,GACd,MAAM,IAAIY,UAAU,oBAAoBZ,MAG1CkE,EAAKlE,GAAQtE,KACf,CACF,EACF,E,OAOF6H,EAAqBohB,IAMrB9tB,EAAmB8tB,ICzMJ,CACb7gB,QACAO,SACA4D,YACA2D,YACA0C,YACA+F,SACA+B,aACAoJ,WACAU,aACA8C,OACA2B,SACAlI,W","ignoreList":[]} \ No newline at end of file From bcde17cb9e789ad75ed255fc8ad381cefe2b200d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 12 Oct 2025 20:37:38 +0200 Subject: [PATCH 820/853] =?UTF-8?q?=F0=9F=8E=A8=20(bootsier):=20Ajusta=20e?= =?UTF-8?q?stilos=20para=20personalizar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/.gitattributes | 1 + extensions/pagetop-bootsier/Cargo.toml | 2 +- extensions/pagetop-bootsier/README.md | 2 +- extensions/pagetop-bootsier/build.rs | 6 +- extensions/pagetop-bootsier/src/lib.rs | 4 +- .../static/scss/_customs.scss | 108 ++++++++++++++++++ .../static/scss/bootsier.scss | 55 +++++++++ .../bootstrap-5.3.8}/_accordion.scss | 0 .../bootstrap-5.3.8}/_alert.scss | 0 .../bootstrap-5.3.8}/_badge.scss | 0 .../bootstrap-5.3.8}/_breadcrumb.scss | 0 .../bootstrap-5.3.8}/_button-group.scss | 0 .../bootstrap-5.3.8}/_buttons.scss | 0 .../bootstrap-5.3.8}/_card.scss | 0 .../bootstrap-5.3.8}/_carousel.scss | 0 .../bootstrap-5.3.8}/_close.scss | 0 .../bootstrap-5.3.8}/_containers.scss | 0 .../bootstrap-5.3.8}/_dropdown.scss | 0 .../bootstrap-5.3.8}/_forms.scss | 0 .../bootstrap-5.3.8}/_functions.scss | 0 .../bootstrap-5.3.8}/_grid.scss | 0 .../bootstrap-5.3.8}/_helpers.scss | 0 .../bootstrap-5.3.8}/_images.scss | 0 .../bootstrap-5.3.8}/_list-group.scss | 0 .../bootstrap-5.3.8}/_maps.scss | 0 .../bootstrap-5.3.8}/_mixins.scss | 0 .../bootstrap-5.3.8}/_modal.scss | 0 .../bootstrap-5.3.8}/_nav.scss | 0 .../bootstrap-5.3.8}/_navbar.scss | 0 .../bootstrap-5.3.8}/_offcanvas.scss | 0 .../bootstrap-5.3.8}/_pagination.scss | 0 .../bootstrap-5.3.8}/_placeholders.scss | 0 .../bootstrap-5.3.8}/_popover.scss | 0 .../bootstrap-5.3.8}/_progress.scss | 0 .../bootstrap-5.3.8}/_reboot.scss | 0 .../bootstrap-5.3.8}/_root.scss | 0 .../bootstrap-5.3.8}/_spinners.scss | 0 .../bootstrap-5.3.8}/_tables.scss | 0 .../bootstrap-5.3.8}/_toasts.scss | 0 .../bootstrap-5.3.8}/_tooltip.scss | 0 .../bootstrap-5.3.8}/_transitions.scss | 0 .../bootstrap-5.3.8}/_type.scss | 0 .../bootstrap-5.3.8}/_utilities.scss | 0 .../bootstrap-5.3.8}/_variables-dark.scss | 0 .../bootstrap-5.3.8}/_variables.scss | 0 .../bootstrap-5.3.8}/bootstrap-grid.scss | 0 .../bootstrap-5.3.8}/bootstrap-reboot.scss | 0 .../bootstrap-5.3.8}/bootstrap-utilities.scss | 0 .../bootstrap-5.3.8}/bootstrap.scss | 0 .../forms/_floating-labels.scss | 0 .../bootstrap-5.3.8}/forms/_form-check.scss | 0 .../bootstrap-5.3.8}/forms/_form-control.scss | 0 .../bootstrap-5.3.8}/forms/_form-range.scss | 0 .../bootstrap-5.3.8}/forms/_form-select.scss | 0 .../bootstrap-5.3.8}/forms/_form-text.scss | 0 .../bootstrap-5.3.8}/forms/_input-group.scss | 0 .../bootstrap-5.3.8}/forms/_labels.scss | 0 .../bootstrap-5.3.8}/forms/_validation.scss | 0 .../bootstrap-5.3.8}/helpers/_clearfix.scss | 0 .../bootstrap-5.3.8}/helpers/_color-bg.scss | 0 .../helpers/_colored-links.scss | 0 .../bootstrap-5.3.8}/helpers/_focus-ring.scss | 0 .../bootstrap-5.3.8}/helpers/_icon-link.scss | 0 .../bootstrap-5.3.8}/helpers/_position.scss | 0 .../bootstrap-5.3.8}/helpers/_ratio.scss | 0 .../bootstrap-5.3.8}/helpers/_stacks.scss | 0 .../helpers/_stretched-link.scss | 0 .../helpers/_text-truncation.scss | 0 .../helpers/_visually-hidden.scss | 0 .../bootstrap-5.3.8}/helpers/_vr.scss | 0 .../bootstrap-5.3.8}/mixins/_alert.scss | 0 .../bootstrap-5.3.8}/mixins/_backdrop.scss | 0 .../bootstrap-5.3.8}/mixins/_banner.scss | 0 .../mixins/_border-radius.scss | 0 .../bootstrap-5.3.8}/mixins/_box-shadow.scss | 0 .../bootstrap-5.3.8}/mixins/_breakpoints.scss | 0 .../bootstrap-5.3.8}/mixins/_buttons.scss | 0 .../bootstrap-5.3.8}/mixins/_caret.scss | 0 .../bootstrap-5.3.8}/mixins/_clearfix.scss | 0 .../bootstrap-5.3.8}/mixins/_color-mode.scss | 0 .../mixins/_color-scheme.scss | 0 .../bootstrap-5.3.8}/mixins/_container.scss | 0 .../bootstrap-5.3.8}/mixins/_deprecate.scss | 0 .../bootstrap-5.3.8}/mixins/_forms.scss | 0 .../bootstrap-5.3.8}/mixins/_gradients.scss | 0 .../bootstrap-5.3.8}/mixins/_grid.scss | 0 .../bootstrap-5.3.8}/mixins/_image.scss | 0 .../bootstrap-5.3.8}/mixins/_list-group.scss | 0 .../bootstrap-5.3.8}/mixins/_lists.scss | 0 .../bootstrap-5.3.8}/mixins/_pagination.scss | 0 .../bootstrap-5.3.8}/mixins/_reset-text.scss | 0 .../bootstrap-5.3.8}/mixins/_resize.scss | 0 .../mixins/_table-variants.scss | 0 .../mixins/_text-truncate.scss | 0 .../bootstrap-5.3.8}/mixins/_transition.scss | 0 .../bootstrap-5.3.8}/mixins/_utilities.scss | 0 .../mixins/_visually-hidden.scss | 0 .../bootstrap-5.3.8}/tests/jasmine.js | 0 .../_auto-import-of-variables-dark.test.scss | 0 .../tests/mixins/_box-shadow.test.scss | 0 .../tests/mixins/_color-contrast.test.scss | 0 .../tests/mixins/_color-modes.test.scss | 0 .../_media-query-color-mode-full.test.scss | 0 .../tests/mixins/_utilities.test.scss | 0 .../tests/sass-true/register.js | 0 .../tests/sass-true/runner.js | 0 .../tests/utilities/_api.test.scss | 0 .../bootstrap-5.3.8}/utilities/_api.scss | 0 .../bootstrap-5.3.8}/vendor/_rfs.scss | 0 109 files changed, 171 insertions(+), 7 deletions(-) create mode 100644 extensions/pagetop-bootsier/.gitattributes create mode 100644 extensions/pagetop-bootsier/static/scss/_customs.scss create mode 100644 extensions/pagetop-bootsier/static/scss/bootsier.scss rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_accordion.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_alert.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_badge.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_breadcrumb.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_button-group.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_buttons.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_card.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_carousel.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_close.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_containers.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_dropdown.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_forms.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_functions.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_grid.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_helpers.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_images.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_list-group.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_maps.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_mixins.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_modal.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_nav.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_navbar.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_offcanvas.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_pagination.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_placeholders.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_popover.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_progress.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_reboot.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_root.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_spinners.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_tables.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_toasts.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_tooltip.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_transitions.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_type.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_utilities.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_variables-dark.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/_variables.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/bootstrap-grid.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/bootstrap-reboot.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/bootstrap-utilities.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/bootstrap.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_floating-labels.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_form-check.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_form-control.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_form-range.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_form-select.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_form-text.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_input-group.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_labels.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/forms/_validation.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_clearfix.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_color-bg.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_colored-links.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_focus-ring.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_icon-link.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_position.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_ratio.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_stacks.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_stretched-link.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_text-truncation.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_visually-hidden.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/helpers/_vr.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_alert.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_backdrop.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_banner.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_border-radius.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_box-shadow.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_breakpoints.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_buttons.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_caret.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_clearfix.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_color-mode.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_color-scheme.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_container.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_deprecate.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_forms.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_gradients.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_grid.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_image.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_list-group.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_lists.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_pagination.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_reset-text.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_resize.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_table-variants.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_text-truncate.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_transition.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_utilities.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/mixins/_visually-hidden.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/jasmine.js (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/mixins/_auto-import-of-variables-dark.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/mixins/_box-shadow.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/mixins/_color-contrast.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/mixins/_color-modes.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/mixins/_media-query-color-mode-full.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/mixins/_utilities.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/sass-true/register.js (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/sass-true/runner.js (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/tests/utilities/_api.test.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/utilities/_api.scss (100%) rename extensions/pagetop-bootsier/static/{bootstrap => scss/bootstrap-5.3.8}/vendor/_rfs.scss (100%) diff --git a/extensions/pagetop-bootsier/.gitattributes b/extensions/pagetop-bootsier/.gitattributes new file mode 100644 index 00000000..940d6a84 --- /dev/null +++ b/extensions/pagetop-bootsier/.gitattributes @@ -0,0 +1 @@ +static/** linguist-vendored diff --git a/extensions/pagetop-bootsier/Cargo.toml b/extensions/pagetop-bootsier/Cargo.toml index 8945e5a8..11306b63 100644 --- a/extensions/pagetop-bootsier/Cargo.toml +++ b/extensions/pagetop-bootsier/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.18" edition = "2021" description = """ - Tema de PageTop basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles. + Tema de PageTop basado en Bootstrap para dar vida a tus diseños web. """ categories = ["web-programming", "gui"] keywords = ["pagetop", "theme", "bootstrap", "css", "js"] diff --git a/extensions/pagetop-bootsier/README.md b/extensions/pagetop-bootsier/README.md index 1a33b4ea..7495bc22 100644 --- a/extensions/pagetop-bootsier/README.md +++ b/extensions/pagetop-bootsier/README.md @@ -2,7 +2,7 @@ <h1>PageTop Bootsier</h1> -<p>Tema de <strong>PageTop</strong> basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles.</p> +<p>Tema de <strong>PageTop</strong> basado en Bootstrap para dar vida a tus diseños web.</p> [![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) [![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) diff --git a/extensions/pagetop-bootsier/build.rs b/extensions/pagetop-bootsier/build.rs index f2d0f794..5945660a 100644 --- a/extensions/pagetop-bootsier/build.rs +++ b/extensions/pagetop-bootsier/build.rs @@ -4,8 +4,8 @@ use std::env; use std::path::Path; fn main() -> std::io::Result<()> { - StaticFilesBundle::from_scss("./static/bootstrap/bootstrap.scss", "bootstrap.min.css") - .with_name("bootsier") + StaticFilesBundle::from_scss("./static/scss/bootsier.scss", "bootstrap.min.css") + .with_name("bootsier_bs") .build()?; StaticFilesBundle::from_dir("./static/js", Some(bootstrap_js_files)) .with_name("bootsier_js") @@ -13,7 +13,7 @@ fn main() -> std::io::Result<()> { } fn bootstrap_js_files(path: &Path) -> bool { - // No filtering during development, only on "release" compilation. + // No filtra durante el desarrollo, solo en la compilación "release". env::var("PROFILE").unwrap_or_else(|_| "release".to_string()) != "release" || path.file_name().map_or(false, |n| n == "bootstrap.min.js") } diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index fecf1273..a6583333 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -100,7 +100,7 @@ impl Extension for Bootsier { } fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { - static_files_service!(scfg, [bootsier] => "/bootsier/css"); + static_files_service!(scfg, [bootsier_bs] => "/bootsier/bs"); static_files_service!(scfg, [bootsier_js] => "/bootsier/js"); } } @@ -108,7 +108,7 @@ impl Extension for Bootsier { impl Theme for Bootsier { fn after_render_page_body(&self, page: &mut Page) { page.alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/bootsier/css/bootstrap.min.css") + StyleSheet::from("/bootsier/bs/bootstrap.min.css") .with_version(BOOTSTRAP_VERSION) .with_weight(-90), )) diff --git a/extensions/pagetop-bootsier/static/scss/_customs.scss b/extensions/pagetop-bootsier/static/scss/_customs.scss new file mode 100644 index 00000000..988d7055 --- /dev/null +++ b/extensions/pagetop-bootsier/static/scss/_customs.scss @@ -0,0 +1,108 @@ +// Enable CSS Grid +$enable-grid-classes: false; +$enable-cssgrid: true; + +// Opacity +.bg-opacity-0 { + --bs-bg-opacity: 0; +} + +.border-opacity-0 { + --bs-border-opacity: 0; +} + +.text-opacity-0 { + --bs-text-opacity: 0; +} +.text-opacity-10 { + --bs-text-opacity: 0.1; +} + +// Extending utilities +$utilities: map-merge( + $utilities, + ( + // Individual border widths + "border-top": ( + property: border-top-width, + class: border-top, + values: $border-widths + ), + "border-end": ( + property: border-right-width, + class: border-end, + values: $border-widths + ), + "border-bottom": ( + property: border-bottom-width, + class: border-bottom, + values: $border-widths + ), + "border-start": ( + property: border-left-width, + class: border-start, + values: $border-widths + ), + // Individual rounded values + "rounded-top-start": ( + property: border-top-left-radius, + class: rounded-top-start, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + "rounded-top-end": ( + property: border-top-right-radius, + class: rounded-top-end, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + "rounded-bottom-start": ( + property: border-bottom-left-radius, + class: rounded-bottom-start, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + "rounded-bottom-end": ( + property: border-bottom-right-radius, + class: rounded-bottom-end, + values: ( + null: var(--#{$prefix}border-radius), + 0: 0, + 1: var(--#{$prefix}border-radius-sm), + 2: var(--#{$prefix}border-radius), + 3: var(--#{$prefix}border-radius-lg), + 4: var(--#{$prefix}border-radius-xl), + 5: var(--#{$prefix}border-radius-xxl), + circle: 50%, + pill: var(--#{$prefix}border-radius-pill) + ) + ), + ) +); diff --git a/extensions/pagetop-bootsier/static/scss/bootsier.scss b/extensions/pagetop-bootsier/static/scss/bootsier.scss new file mode 100644 index 00000000..0d52046a --- /dev/null +++ b/extensions/pagetop-bootsier/static/scss/bootsier.scss @@ -0,0 +1,55 @@ +@import "bootstrap-5.3.8/mixins/banner"; +@include bsBanner(""); + + +// scss-docs-start import-stack +// Configuration +@import "bootstrap-5.3.8/functions"; +@import "bootstrap-5.3.8/variables"; +@import "bootstrap-5.3.8/variables-dark"; +@import "bootstrap-5.3.8/maps"; +@import "bootstrap-5.3.8/mixins"; +@import "bootstrap-5.3.8/utilities"; + +// Layout & components +@import "bootstrap-5.3.8/root"; +@import "bootstrap-5.3.8/reboot"; +@import "bootstrap-5.3.8/type"; +@import "bootstrap-5.3.8/images"; +@import "bootstrap-5.3.8/containers"; +@import "bootstrap-5.3.8/grid"; +@import "bootstrap-5.3.8/tables"; +@import "bootstrap-5.3.8/forms"; +@import "bootstrap-5.3.8/buttons"; +@import "bootstrap-5.3.8/transitions"; +@import "bootstrap-5.3.8/dropdown"; +@import "bootstrap-5.3.8/button-group"; +@import "bootstrap-5.3.8/nav"; +@import "bootstrap-5.3.8/navbar"; +@import "bootstrap-5.3.8/card"; +@import "bootstrap-5.3.8/accordion"; +@import "bootstrap-5.3.8/breadcrumb"; +@import "bootstrap-5.3.8/pagination"; +@import "bootstrap-5.3.8/badge"; +@import "bootstrap-5.3.8/alert"; +@import "bootstrap-5.3.8/progress"; +@import "bootstrap-5.3.8/list-group"; +@import "bootstrap-5.3.8/close"; +@import "bootstrap-5.3.8/toasts"; +@import "bootstrap-5.3.8/modal"; +@import "bootstrap-5.3.8/tooltip"; +@import "bootstrap-5.3.8/popover"; +@import "bootstrap-5.3.8/carousel"; +@import "bootstrap-5.3.8/spinners"; +@import "bootstrap-5.3.8/offcanvas"; +@import "bootstrap-5.3.8/placeholders"; + +// Helpers +@import "bootstrap-5.3.8/helpers"; + +// Custom definitions +@import "customs"; + +// Utilities +@import "bootstrap-5.3.8/utilities/api"; +// scss-docs-end import-stack diff --git a/extensions/pagetop-bootsier/static/bootstrap/_accordion.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_accordion.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_accordion.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_accordion.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_alert.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_alert.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_alert.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_alert.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_badge.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_badge.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_badge.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_badge.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_breadcrumb.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_breadcrumb.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_breadcrumb.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_breadcrumb.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_button-group.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_button-group.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_button-group.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_button-group.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_buttons.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_buttons.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_buttons.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_buttons.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_card.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_card.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_card.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_card.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_carousel.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_carousel.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_carousel.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_carousel.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_close.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_close.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_close.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_close.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_containers.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_containers.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_containers.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_containers.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_dropdown.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_dropdown.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_dropdown.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_dropdown.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_forms.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_forms.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_forms.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_forms.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_functions.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_functions.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_functions.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_functions.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_grid.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_grid.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_grid.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_grid.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_helpers.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_helpers.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_helpers.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_helpers.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_images.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_images.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_images.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_images.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_list-group.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_list-group.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_list-group.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_list-group.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_maps.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_maps.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_maps.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_maps.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_mixins.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_mixins.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_mixins.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_mixins.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_modal.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_modal.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_modal.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_modal.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_nav.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_nav.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_nav.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_nav.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_navbar.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_navbar.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_navbar.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_navbar.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_offcanvas.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_offcanvas.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_offcanvas.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_offcanvas.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_pagination.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_pagination.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_pagination.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_pagination.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_placeholders.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_placeholders.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_placeholders.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_placeholders.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_popover.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_popover.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_popover.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_popover.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_progress.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_progress.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_progress.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_progress.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_reboot.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_reboot.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_reboot.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_reboot.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_root.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_root.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_root.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_root.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_spinners.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_spinners.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_spinners.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_spinners.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_tables.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_tables.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_tables.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_tables.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_toasts.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_toasts.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_toasts.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_toasts.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_tooltip.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_tooltip.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_tooltip.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_tooltip.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_transitions.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_transitions.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_transitions.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_transitions.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_type.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_type.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_type.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_type.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_utilities.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_utilities.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_utilities.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_utilities.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_variables-dark.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_variables-dark.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_variables-dark.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_variables-dark.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/_variables.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_variables.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/_variables.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/_variables.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/bootstrap-grid.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap-grid.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/bootstrap-grid.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap-grid.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/bootstrap-reboot.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap-reboot.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/bootstrap-reboot.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap-reboot.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/bootstrap-utilities.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap-utilities.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/bootstrap-utilities.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap-utilities.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/bootstrap.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/bootstrap.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/bootstrap.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_floating-labels.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_floating-labels.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_floating-labels.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_floating-labels.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_form-check.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-check.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_form-check.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-check.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_form-control.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-control.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_form-control.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-control.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_form-range.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-range.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_form-range.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-range.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_form-select.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-select.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_form-select.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-select.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_form-text.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-text.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_form-text.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_form-text.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_input-group.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_input-group.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_input-group.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_input-group.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_labels.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_labels.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_labels.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_labels.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/forms/_validation.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_validation.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/forms/_validation.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/forms/_validation.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_clearfix.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_clearfix.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_clearfix.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_clearfix.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_color-bg.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_color-bg.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_color-bg.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_color-bg.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_colored-links.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_colored-links.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_colored-links.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_colored-links.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_focus-ring.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_focus-ring.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_focus-ring.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_focus-ring.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_icon-link.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_icon-link.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_icon-link.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_icon-link.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_position.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_position.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_position.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_position.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_ratio.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_ratio.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_ratio.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_ratio.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_stacks.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_stacks.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_stacks.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_stacks.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_stretched-link.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_stretched-link.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_stretched-link.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_stretched-link.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_text-truncation.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_text-truncation.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_text-truncation.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_text-truncation.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_visually-hidden.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_visually-hidden.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_visually-hidden.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_visually-hidden.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/helpers/_vr.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_vr.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/helpers/_vr.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/helpers/_vr.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_alert.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_alert.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_alert.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_alert.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_backdrop.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_backdrop.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_backdrop.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_backdrop.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_banner.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_banner.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_banner.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_banner.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_border-radius.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_border-radius.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_border-radius.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_border-radius.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_box-shadow.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_box-shadow.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_box-shadow.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_box-shadow.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_breakpoints.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_breakpoints.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_breakpoints.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_breakpoints.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_buttons.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_buttons.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_buttons.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_buttons.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_caret.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_caret.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_caret.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_caret.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_clearfix.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_clearfix.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_clearfix.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_clearfix.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_color-mode.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_color-mode.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_color-mode.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_color-mode.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_color-scheme.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_color-scheme.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_color-scheme.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_color-scheme.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_container.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_container.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_container.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_container.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_deprecate.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_deprecate.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_deprecate.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_deprecate.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_forms.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_forms.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_forms.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_forms.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_gradients.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_gradients.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_gradients.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_gradients.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_grid.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_grid.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_grid.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_grid.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_image.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_image.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_image.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_image.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_list-group.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_list-group.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_list-group.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_list-group.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_lists.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_lists.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_lists.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_lists.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_pagination.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_pagination.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_pagination.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_pagination.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_reset-text.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_reset-text.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_reset-text.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_reset-text.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_resize.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_resize.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_resize.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_resize.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_table-variants.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_table-variants.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_table-variants.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_table-variants.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_text-truncate.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_text-truncate.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_text-truncate.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_text-truncate.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_transition.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_transition.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_transition.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_transition.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_utilities.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_utilities.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_utilities.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_utilities.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/mixins/_visually-hidden.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_visually-hidden.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/mixins/_visually-hidden.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/mixins/_visually-hidden.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/jasmine.js b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/jasmine.js similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/jasmine.js rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/jasmine.js diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_auto-import-of-variables-dark.test.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_auto-import-of-variables-dark.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_auto-import-of-variables-dark.test.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_auto-import-of-variables-dark.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_box-shadow.test.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_box-shadow.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_box-shadow.test.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_box-shadow.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-contrast.test.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_color-contrast.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-contrast.test.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_color-contrast.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-modes.test.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_color-modes.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_color-modes.test.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_color-modes.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_media-query-color-mode-full.test.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_media-query-color-mode-full.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_media-query-color-mode-full.test.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_media-query-color-mode-full.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_utilities.test.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_utilities.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/mixins/_utilities.test.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/mixins/_utilities.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/register.js b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/sass-true/register.js similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/register.js rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/sass-true/register.js diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/runner.js b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/sass-true/runner.js similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/sass-true/runner.js rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/sass-true/runner.js diff --git a/extensions/pagetop-bootsier/static/bootstrap/tests/utilities/_api.test.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/utilities/_api.test.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/tests/utilities/_api.test.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/tests/utilities/_api.test.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/utilities/_api.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/utilities/_api.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/utilities/_api.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/utilities/_api.scss diff --git a/extensions/pagetop-bootsier/static/bootstrap/vendor/_rfs.scss b/extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/vendor/_rfs.scss similarity index 100% rename from extensions/pagetop-bootsier/static/bootstrap/vendor/_rfs.scss rename to extensions/pagetop-bootsier/static/scss/bootstrap-5.3.8/vendor/_rfs.scss From 39a3dabcfb5b9f62414816c9134b6fbd6f5d2365 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Oct 2025 13:13:33 +0200 Subject: [PATCH 821/853] =?UTF-8?q?=E2=9C=A8=20(html):=20A=C3=B1ade=20sopo?= =?UTF-8?q?rte=20para=20unidades=20CSS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 9 +- Cargo.toml | 1 + src/html.rs | 5 + src/html/unit.rs | 259 ++++++++++++++++++++++++++++++++++ src/prelude.rs | 2 +- tests/{html.rs => html_pm.rs} | 0 tests/html_unit.rs | 223 +++++++++++++++++++++++++++++ 7 files changed, 494 insertions(+), 5 deletions(-) create mode 100644 src/html/unit.rs rename tests/{html.rs => html_pm.rs} (100%) create mode 100644 tests/html_unit.rs diff --git a/Cargo.lock b/Cargo.lock index ebcebd39..f1b09f9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1568,6 +1568,7 @@ dependencies = [ "parking_lot", "pastey", "serde", + "serde_json", "substring", "tempfile", "terminal_size", @@ -1914,9 +1915,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.3" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "4a52d8d02cacdb176ef4678de6c052efb4b3da14b78e4db683a4252762be5433" dependencies = [ "aho-corasick", "memchr", @@ -1926,9 +1927,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "722166aa0d7438abbaa4d5cc2c649dac844e8c56d82fb3d33e9c34b5cd268fc6" dependencies = [ "aho-corasick", "memchr", diff --git a/Cargo.toml b/Cargo.toml index 103f6a94..0d17082b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,6 +50,7 @@ testing = [] [dev-dependencies] tempfile = "3.23" +serde_json = "1.0" pagetop-aliner.workspace = true pagetop-bootsier.workspace = true diff --git a/src/html.rs b/src/html.rs index abc8e8cf..f85c24ed 100644 --- a/src/html.rs +++ b/src/html.rs @@ -84,6 +84,11 @@ use crate::{core, AutoDefault}; #[allow(type_alias_bounds)] pub type OptionComponent<C: core::component::Component> = core::component::Typed<C>; +mod unit; +pub use unit::UnitValue; + +// **< HTML PrepareMarkup >************************************************************************* + /// Prepara contenido HTML para su conversión a [`Markup`]. /// /// Este tipo encapsula distintos orígenes de contenido HTML (texto plano, HTML sin escapar o diff --git a/src/html/unit.rs b/src/html/unit.rs new file mode 100644 index 00000000..b6a9bc76 --- /dev/null +++ b/src/html/unit.rs @@ -0,0 +1,259 @@ +use crate::AutoDefault; + +use serde::{Deserialize, Deserializer}; + +use std::fmt; +use std::str::FromStr; + +/// Representa una **unidad CSS** lista para formatear o deserializar. +/// +/// ## Unidades soportadas +/// +/// - **Absolutas** *(valores enteros, `isize`)*: +/// - `Cm(isize)` - `cm` (centímetros) +/// - `In(isize)` - `in` (pulgadas; `1in = 96px = 2.54cm`) +/// - `Mm(isize)` - `mm` (milímetros) +/// - `Pc(isize)` - `pc` (picas; `1pc = 12pt`) +/// - `Pt(isize)` - `pt` (puntos; `1pt = 1/72in`) +/// - `Px(isize)` - `px` (píxeles; `1px = 1/96in`) +/// +/// - **Relativas** *(valores decimales, `f32`)*: +/// - `RelEm(f32)` - `em` (relativa al tamaño de fuente del elemento) +/// - `RelRem(f32)` - `rem` (relativa al tamaño de fuente de `:root`) +/// - `RelPct(f32)` - `%` (porcentaje relativo al elemento padre) +/// - `RelVh(f32)` - `vh` (1% de la **altura** del viewport) +/// - `RelVw(f32)` - `vw` (1% del **ancho** del viewport) +/// +/// ## Valores especiales +/// +/// - `None` - equivale a un texto vacío (`""`), útil para atributos opcionales. +/// - `Auto` - equivale a `"auto"`. +/// - `Zero` - equivale a `"0"` (cero sin unidad). +/// +/// ## Características +/// +/// - Soporta unidades **absolutas** (`cm`, `in`, `mm`, `pc`, `pt`, `px`) y **relativas** (`em`, +/// `rem`, `%`, `vh`, `vw`). +/// - `FromStr` para convertir desde texto (p.ej. `"12px"`, `"1.25rem"`, `"auto"`). +/// - `Display` para formatear a cadena (p.ej. `UnitValue::Px(12)` genera `"12px"`). +/// - `Deserialize` delega en `FromStr`, garantizando una gramática única. +/// +/// ## Ejemplos +/// +/// ```rust +/// # use pagetop::prelude::*; +/// use std::str::FromStr; +/// +/// assert_eq!(UnitValue::from_str("16px").unwrap(), UnitValue::Px(16)); +/// assert_eq!(UnitValue::from_str("1.25rem").unwrap(), UnitValue::RelRem(1.25)); +/// assert_eq!(UnitValue::from_str("33%").unwrap(), UnitValue::RelPct(33.0)); +/// assert_eq!(UnitValue::from_str("auto").unwrap(), UnitValue::Auto); +/// assert_eq!(UnitValue::from_str("").unwrap(), UnitValue::None); +/// assert_eq!(UnitValue::from_str("0").unwrap(), UnitValue::Zero); +/// ``` +/// +/// ## Notas +/// +/// - Las absolutas **no aceptan** decimales (p.ej., `"1.5px"` sería erróneo). +/// - Se aceptan signos `+`/`-` en todas las unidades (p.ej., `"-12px"`, `"+0.5em"`). +/// - La comparación de unidad es *case-insensitive* al interpretar el texto (`"PX"`, `"Px"`, …). +/// - **Sobre píxeles**: Los píxeles (px) son relativos al dispositivo de visualización. En +/// dispositivos con baja densidad de píxeles (dpi), 1px equivale a un píxel (punto) del +/// dispositivo. En impresoras y pantallas de alta resolución, 1px implica múltiples píxeles del +/// dispositivo. +/// - **Sobre `em` y `rem`**: +/// - `em` es **relativo al tamaño de fuente *del propio elemento***. Si el elemento hereda o +/// cambia su `font-size`, todos los valores en `em` dentro de él **se escalan en cascada**. +/// - `rem` es **relativo al tamaño de fuente del elemento raíz** (`:root`/`html`), **no se verá +/// afectado** por cambios de `font-size` en elementos anidados. +/// - Ejemplo: si `:root { font-size: 16px }` y un contenedor tiene `font-size: 20px`, entonces +/// dentro del contenedor `1em == 20px` pero `1rem == 16px`. +/// - Uso típico: `rem` para tipografía y espaciados globales (consistencia al cambiar la base del +/// sitio); `em` para tamaños que deban escalar **con el propio componente** (p.ej., +/// `padding: 0.5em` que crece si el componente aumenta su `font-size`). +/// - **Sobre el viewport**: Si el ancho de la ventana del navegador es de 50cm, 1vw equivale a +/// 0.5cm (1vw siempre es 1% del ancho del viewport, independientemente del zoom del navegador o +/// la densidad de píxeles del dispositivo). +#[rustfmt::skip] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] +pub enum UnitValue { + #[default] + None, + Auto, + /// Cero sin unidad. + Zero, + /// Centímetros. + Cm(isize), + /// Pulgadas (1in = 96px = 2.54cm). + In(isize), + /// Milímetros. + Mm(isize), + /// Picas (1pc = 12pt). + Pc(isize), + /// Puntos (1pt = 1/72in). + Pt(isize), + /// Píxeles (1px = 1/96in). + Px(isize), + /// Relativo al tamaño de la fuente del elemento. + RelEm(f32), + /// Relativo al tamaño de la fuente del elemento raíz. + RelRem(f32), + /// Porcentaje relativo al elemento padre. + RelPct(f32), + /// Relativo al 1% de la altura del viewport. + RelVh(f32), + /// Relativo al 1% del ancho del viewport. + RelVw(f32), +} + +/// Formatea la unidad como cadena CSS. +/// +/// Reglas: +/// +/// - `None` - `""` (cadena vacía). +/// - `Auto` - `"auto"`. +/// - `Zero` - `"0"` (cero sin unidad). +/// - Absolutas - entero con su unidad: `Px(12)` a `"12px"`. +/// - Relativas - número en punto flotante; si es entero, se imprime sin decimales: +/// - `RelEm(2.0)` a `"2em"` +/// - `RelPct(33.5)` a `"33.5%"` +#[rustfmt::skip] +impl fmt::Display for UnitValue { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + UnitValue::None => write!(f, ""), + UnitValue::Auto => write!(f, "auto"), + UnitValue::Zero => write!(f, "0"), + // Valor absoluto. + UnitValue::Cm(av) => write!(f, "{av}cm"), + UnitValue::In(av) => write!(f, "{av}in"), + UnitValue::Mm(av) => write!(f, "{av}mm"), + UnitValue::Pc(av) => write!(f, "{av}pc"), + UnitValue::Pt(av) => write!(f, "{av}pt"), + UnitValue::Px(av) => write!(f, "{av}px"), + // Valor relativo. + UnitValue::RelEm(rv) => write!(f, "{rv}em"), + UnitValue::RelRem(rv) => write!(f, "{rv}rem"), + UnitValue::RelPct(rv) => write!(f, "{rv}%"), + UnitValue::RelVh(rv) => write!(f, "{rv}vh"), + UnitValue::RelVw(rv) => write!(f, "{rv}vw"), + } + } +} + +/// Convierte una cadena a [`UnitValue`] siguiendo una gramática CSS acotada. +/// +/// ## Acepta +/// +/// - `""` para `UnitValue::None` +/// - `"auto"` +/// - **Cero sin unidad**: `"0"`, `"+0"`, `"-0"`, `"0.0"`, `"0."`, `".0"` para `UnitValue::Zero` +/// - Porcentaje: `"<n>%"` (p.ej. `"33%"`, `"33 %"`) +/// - Absolutas enteras: `"<entero><unidad>"`, p.ej. `"12px"`, `"-5pt"` +/// - Relativas decimales: `"<float><unidad>"`, p.ej. `"1.25rem"`, `"-0.5vh"`, `".5em"`, `"1.rem"` +/// +/// (Se toleran espacios entre número y unidad: `"12 px"`, `"1.5 rem"`). +/// +/// ## Ejemplo +/// +/// ```rust +/// # use pagetop::prelude::*; +/// use std::str::FromStr; +/// +/// assert_eq!(UnitValue::from_str("12px").unwrap(), UnitValue::Px(12)); +/// assert!(UnitValue::from_str("12").is_err()); +/// ``` +/// +/// ## Errores de interpretación +/// +/// - Falta la unidad cuando es necesaria (p.ej. `"12"`, excepto para el valor cero). +/// - Decimales en valores que deben ser absolutos (p.ej. `"1.5px"`). +/// - Unidades desconocidas (p.ej. `"10ch"`, no soportada aún). +/// - Notación científica o bases no decimales: `"1e3vw"`, `"0x10px"` (no soportadas). Los ceros a +/// la izquierda (p. ej. `"020px"`) se interpretan en **base 10** (`20px`). +/// +/// La comparación de la unidad es *case-insensitive*. +impl FromStr for UnitValue { + type Err = String; + + fn from_str(input: &str) -> Result<Self, Self::Err> { + let s = input.trim(); + if s.is_empty() { + return Ok(UnitValue::None); + } + if s.eq_ignore_ascii_case("auto") { + return Ok(UnitValue::Auto); + } + + match s.find(|c: char| c.is_ascii_alphabetic() || c == '%') { + None => { + let n: f32 = s + .parse() + .map_err(|e| format!("Invalid number `{s}`: {e}"))?; + if n == 0.0 { + Ok(UnitValue::Zero) + } else { + Err( + "Missing unit (expected one of cm,in,mm,pc,pt,px,em,rem,vh,vw, or %)" + .to_string(), + ) + } + } + Some(split_pos) => { + let (num_str, unit_str) = s.split_at(split_pos); + let u = unit_str.trim(); + let n = num_str.trim(); + + let parse_abs = |n_s: &str| -> Result<isize, String> { + n_s.parse::<isize>() + .map_err(|e| format!("Invalid integer `{n_s}`: {e}")) + }; + let parse_rel = |n_s: &str| -> Result<f32, String> { + n_s.parse::<f32>() + .map_err(|e| format!("Invalid float `{n_s}`: {e}")) + }; + + match u.to_ascii_lowercase().as_str() { + // Unidades absolutas. + "cm" => Ok(UnitValue::Cm(parse_abs(n)?)), + "in" => Ok(UnitValue::In(parse_abs(n)?)), + "mm" => Ok(UnitValue::Mm(parse_abs(n)?)), + "pc" => Ok(UnitValue::Pc(parse_abs(n)?)), + "pt" => Ok(UnitValue::Pt(parse_abs(n)?)), + "px" => Ok(UnitValue::Px(parse_abs(n)?)), + // Unidades relativas. + "em" => Ok(UnitValue::RelEm(parse_rel(n)?)), + "rem" => Ok(UnitValue::RelRem(parse_rel(n)?)), + "vh" => Ok(UnitValue::RelVh(parse_rel(n)?)), + "vw" => Ok(UnitValue::RelVw(parse_rel(n)?)), + // Porcentaje como unidad. + "%" => Ok(UnitValue::RelPct(parse_rel(n)?)), + // Unidad desconocida. + _ => Err(format!("Unknown unit: `{u}`")), + } + } + } + } +} + +/// Deserializa desde una cadena usando la misma gramática que [`FromStr`]. +/// +/// ### Ejemplo con `serde_json` +/// ```rust +/// # use pagetop::prelude::*; +/// use serde::Deserialize; +/// +/// #[derive(Deserialize)] +/// struct Style { width: UnitValue } +/// +/// // "{\"width\":\"12px\"}" deserializa como `Style { width: UnitValue::Px(12) }` +/// ``` +impl<'de> Deserialize<'de> for UnitValue { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + let raw = String::deserialize(deserializer)?; + raw.parse().map_err(serde::de::Error::custom) + } +} diff --git a/src/prelude.rs b/src/prelude.rs index a71375e1..cd3191f6 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -34,7 +34,7 @@ pub use crate::trace; pub use crate::html::{ display, html_private, Asset, Assets, AttrClasses, AttrId, AttrL10n, AttrName, AttrValue, ClassesOp, Escaper, Favicon, JavaScript, Markup, PreEscaped, PrepareMarkup, StyleSheet, - TargetMedia, DOCTYPE, + TargetMedia, UnitValue, DOCTYPE, }; pub use crate::locale::*; diff --git a/tests/html.rs b/tests/html_pm.rs similarity index 100% rename from tests/html.rs rename to tests/html_pm.rs diff --git a/tests/html_unit.rs b/tests/html_unit.rs new file mode 100644 index 00000000..9316af89 --- /dev/null +++ b/tests/html_unit.rs @@ -0,0 +1,223 @@ +use pagetop::prelude::*; + +use std::str::FromStr; + +#[pagetop::test] +async fn unit_value_empty_and_auto_and_zero_without_unit() { + assert_eq!(UnitValue::from_str("").unwrap(), UnitValue::None); + assert_eq!(UnitValue::from_str("auto").unwrap(), UnitValue::Auto); + assert_eq!(UnitValue::from_str("AUTO").unwrap(), UnitValue::Auto); + + // Cero sin unidad. + assert_eq!(UnitValue::from_str("0").unwrap(), UnitValue::Zero); + assert_eq!(UnitValue::from_str("+0").unwrap(), UnitValue::Zero); + assert_eq!(UnitValue::from_str("-0").unwrap(), UnitValue::Zero); +} + +#[pagetop::test] +async fn unit_value_absolute_integers_with_signs_and_spaces_and_case() { + // Positivos, negativos y con espacios. + assert_eq!(UnitValue::from_str("12px").unwrap(), UnitValue::Px(12)); + assert_eq!(UnitValue::from_str("-5pt").unwrap(), UnitValue::Pt(-5)); + assert_eq!(UnitValue::from_str(" 7 cm ").unwrap(), UnitValue::Cm(7)); + assert_eq!(UnitValue::from_str("+9 in").unwrap(), UnitValue::In(9)); + assert_eq!(UnitValue::from_str(" 13 mm ").unwrap(), UnitValue::Mm(13)); + assert_eq!(UnitValue::from_str("4 pc").unwrap(), UnitValue::Pc(4)); + + // Insensibilidad a mayúsculas. + assert_eq!(UnitValue::from_str("10PX").unwrap(), UnitValue::Px(10)); + assert_eq!(UnitValue::from_str("15Pt").unwrap(), UnitValue::Pt(15)); +} + +#[pagetop::test] +async fn unit_value_relative_floats_with_signs_and_spaces_and_case() { + assert_eq!( + UnitValue::from_str("1.25rem").unwrap(), + UnitValue::RelRem(1.25) + ); + assert_eq!( + UnitValue::from_str("-0.5em").unwrap(), + UnitValue::RelEm(-0.5) + ); + assert_eq!( + UnitValue::from_str(" 33% ").unwrap(), + UnitValue::RelPct(33.0) + ); + assert_eq!( + UnitValue::from_str(" -12.5 vh").unwrap(), + UnitValue::RelVh(-12.5) + ); + assert_eq!( + UnitValue::from_str(" 8.0 VW ").unwrap(), + UnitValue::RelVw(8.0) + ); +} + +#[pagetop::test] +async fn unit_value_whitespace_between_number_and_unit_is_allowed() { + // Hay espacio entre número y unidad (la implementación actual lo admite). + assert_eq!(UnitValue::from_str("12 px").unwrap(), UnitValue::Px(12)); + assert_eq!( + UnitValue::from_str("1.5 rem").unwrap(), + UnitValue::RelRem(1.5) + ); + assert_eq!( + UnitValue::from_str("25 %").unwrap(), + UnitValue::RelPct(25.0) + ); +} + +#[pagetop::test] +async fn unit_value_roundtrip_display_keeps_expected_format() { + let cases = [ + ("", UnitValue::None, ""), + ("auto", UnitValue::Auto, "auto"), + ("0", UnitValue::Zero, "0"), + ("12px", UnitValue::Px(12), "12px"), + ("-5pt", UnitValue::Pt(-5), "-5pt"), + ("7cm", UnitValue::Cm(7), "7cm"), + ("33%", UnitValue::RelPct(33.0), "33%"), + ("1.25rem", UnitValue::RelRem(1.25), "1.25rem"), + ("2em", UnitValue::RelEm(2.0), "2em"), + ("-0.5vh", UnitValue::RelVh(-0.5), "-0.5vh"), + ("8vw", UnitValue::RelVw(8.0), "8vw"), + ]; + + for (input, expected_value, expected_display) in cases { + let parsed = UnitValue::from_str(input).unwrap(); + assert_eq!( + parsed, expected_value, + "parsed mismatch for input `{input}`" + ); + assert_eq!( + parsed.to_string(), + expected_display, + "display mismatch for input `{input}`" + ); + } +} + +#[pagetop::test] +async fn unit_value_percentage_trimming_and_signs() { + assert_eq!( + UnitValue::from_str(" 12.5 % ").unwrap(), + UnitValue::RelPct(12.5) + ); + assert_eq!( + UnitValue::from_str("-0.0%").unwrap(), + UnitValue::RelPct(-0.0) + ); + assert_eq!( + UnitValue::from_str("+15%").unwrap(), + UnitValue::RelPct(15.0) + ); +} + +// ERRORES ESPERADOS (no cambiar los mensajes; con is_err() basta). + +#[pagetop::test] +async fn unit_value_errors_missing_unit_for_non_zero() { + assert!( + UnitValue::from_str("12").is_err(), + "non-zero without unit must error" + ); + assert!( + UnitValue::from_str(" -3 ").is_err(), + "non-zero without unit must error" + ); +} + +#[pagetop::test] +async fn unit_value_errors_decimals_in_absolute_units() { + assert!(UnitValue::from_str("1.5px").is_err()); + assert!(UnitValue::from_str("-2.0pt").is_err()); + assert!(UnitValue::from_str("+0.1cm").is_err()); +} + +#[pagetop::test] +async fn unit_value_errors_unknown_units_or_bad_percentages() { + // Unidad no soportada. + assert!(UnitValue::from_str("10ch").is_err()); + assert!(UnitValue::from_str("2q").is_err()); + // Falta número. + assert!(UnitValue::from_str("%").is_err()); + assert!(UnitValue::from_str(" % ").is_err()); +} + +#[pagetop::test] +async fn unit_value_errors_non_numeric_numbers() { + assert!(UnitValue::from_str("NaNem").is_err()); + // Decimal no permitido por FromStr. + assert!(UnitValue::from_str("1,5rem").is_err()); +} + +#[pagetop::test] +async fn unit_value_serde_deserialize_struct_and_array() { + use serde::Deserialize; + + #[derive(Deserialize, Debug, PartialEq)] + struct BoxStyle { + width: UnitValue, + height: UnitValue, + margin: UnitValue, + } + + let json = r#"{ "width": "12px", "height": "1.5rem", "margin": "0" }"#; + let s: BoxStyle = serde_json::from_str(json).unwrap(); + assert_eq!(s.width, UnitValue::Px(12)); + assert_eq!(s.height, UnitValue::RelRem(1.5)); + assert_eq!(s.margin, UnitValue::Zero); + + #[derive(Deserialize, Debug, PartialEq)] + struct Many { + values: Vec<UnitValue>, + } + + let json_arr = r#"{ "values": ["", "auto", "33%", "8vw", "7 cm", "-5pt"] }"#; + let m: Many = serde_json::from_str(json_arr).unwrap(); + assert_eq!( + m.values, + vec![ + UnitValue::None, + UnitValue::Auto, + UnitValue::RelPct(33.0), + UnitValue::RelVw(8.0), + UnitValue::Cm(7), + UnitValue::Pt(-5), + ] + ); +} + +#[pagetop::test] +async fn unit_value_accepts_dot5_and_1dot_shorthand_for_relatives() { + // `.5` y `1.` se parsean correctamente en relativas. + assert_eq!(UnitValue::from_str(".5em").unwrap(), UnitValue::RelEm(0.5)); + assert_eq!( + UnitValue::from_str("1.rem").unwrap(), + UnitValue::RelRem(1.0) + ); + assert_eq!(UnitValue::from_str("1.vh").unwrap(), UnitValue::RelVh(1.0)); + // Sin unidad debe seguir fallando. + assert!(UnitValue::from_str("1.").is_err()); +} + +#[pagetop::test] +async fn unit_value_display_keeps_minus_zero_for_relatives() { + // Comportamiento actual: f32 Display muestra "-0" si el valor es -0.0. + let v = UnitValue::RelEm(-0.0); + // Se acepta cualquiera de los dos formatos como válidos. + let s = v.to_string(); + assert!( + s == "-0em" || s == "0em", + "current Display prints `{s}` for -0.0; both are acceptable in tests" + ); +} + +#[pagetop::test] +async fn unit_value_rejects_non_decimal_notations() { + // Octal, los ceros a la izquierda (p.ej. `"020px"`) se interpretan en **base 10** (`20px`). + assert_eq!(UnitValue::from_str("020px").unwrap(), UnitValue::Px(20)); + // Notación científica y bases no decimales (p.ej. `"1e3vw"`, `"0x10px"`) no están soportadas. + assert!(UnitValue::from_str("1e3vw").is_err()); + assert!(UnitValue::from_str("0x10px").is_err()); +} From d46de78367f96776b2ac90ca298706852bc2c891 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 13 Oct 2025 18:51:32 +0200 Subject: [PATCH 822/853] =?UTF-8?q?=E2=9C=A8=20(unit):=20A=C3=B1ade=20m?= =?UTF-8?q?=C3=A9todo=20`is=5Fnumeric`=20en=20`UnitValue`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/unit.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/html/unit.rs b/src/html/unit.rs index b6a9bc76..b67e8b17 100644 --- a/src/html/unit.rs +++ b/src/html/unit.rs @@ -106,6 +106,31 @@ pub enum UnitValue { RelVw(f32), } +impl UnitValue { + /// Indica si el valor es **numérico**. + /// + /// Devuelve `true` para `Zero` y las unidades absolutas/relativas, y `false` para + /// [`UnitValue::None`] y [`UnitValue::Auto`]. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop::prelude::*; + /// // Numéricos (incluido el cero sin unidad). + /// assert!(UnitValue::Zero.is_numeric()); + /// assert!(UnitValue::Px(0).is_numeric()); + /// assert!(UnitValue::Px(10).is_numeric()); + /// assert!(UnitValue::RelPct(33.0).is_numeric()); + /// // No numéricos. + /// assert!(!UnitValue::None.is_numeric()); + /// assert!(!UnitValue::Auto.is_numeric()); + /// ``` + #[inline] + pub const fn is_numeric(&self) -> bool { + !matches!(self, UnitValue::None | UnitValue::Auto) + } +} + /// Formatea la unidad como cadena CSS. /// /// Reglas: From 6368e71413fce6cf42d037f95d44162da24a884b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 17 Oct 2025 18:14:20 +0200 Subject: [PATCH 823/853] =?UTF-8?q?=F0=9F=8E=A8=20(pagetop):=20Mejoras=20s?= =?UTF-8?q?encillas=20en=20doc.=20y=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component.rs | 2 +- src/config.rs | 18 +++++++-------- src/core/action/definition.rs | 3 ++- src/global.rs | 4 ++-- src/html/assets/favicon.rs | 4 ++-- src/html/unit.rs | 41 +++++++++++++++++------------------ src/locale.rs | 12 +++++----- tests/html_unit.rs | 4 ++-- 8 files changed, 43 insertions(+), 45 deletions(-) diff --git a/src/base/component.rs b/src/base/component.rs index 6c3b028f..8991d721 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -1,6 +1,6 @@ //! Componentes nativos proporcionados por PageTop. -use crate::AutoDefault; +use crate::prelude::*; use std::fmt; diff --git a/src/config.rs b/src/config.rs index f2fb9f7f..1607a874 100644 --- a/src/config.rs +++ b/src/config.rs @@ -23,9 +23,9 @@ //! * Si `PAGETOP_RUN_MODE` no está definida, se asume el valor `default`, y PageTop intentará //! cargar *config/default.toml* si el archivo existe. //! -//! * Útil para definir configuraciones específicas por entorno, garantizando que cada uno (p.ej. -//! *dev*, *staging* o *production*) disponga de sus propias opciones, como claves de API, -//! URLs o ajustes de rendimiento, sin afectar a los demás. +//! * Permite definir configuraciones específicas por entorno, garantizando que cada uno (p. ej., +//! *dev*, *staging* o *production*) disponga de sus propias opciones, como claves de API, URLs +//! o ajustes de rendimiento, sin afectar a los demás. //! //! 3. **config/local.{rm}.toml**, útil para configuraciones locales específicas de la máquina o de //! la ejecución: @@ -132,15 +132,15 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( let config_dir = util::resolve_absolute_dir(&dir).unwrap_or_else(|_| PathBuf::from(&dir)); // Modo de ejecución según la variable de entorno PAGETOP_RUN_MODE. Si no está definida, se usa - // por defecto, DEFAULT_RUN_MODE (p.ej.: PAGETOP_RUN_MODE=production). + // por defecto DEFAULT_RUN_MODE (p. ej. PAGETOP_RUN_MODE=production). let rm = env::var("PAGETOP_RUN_MODE").unwrap_or_else(|_| DEFAULT_RUN_MODE.into()); Config::builder() // 1. Configuración común para todos los entornos (common.toml). .add_source(File::from(config_dir.join("common.toml")).required(false)) - // 2. Configuración específica del entorno (p.ej.: default.toml, production.toml). + // 2. Configuración específica del entorno (p. ej. default.toml o production.toml). .add_source(File::from(config_dir.join(format!("{rm}.toml"))).required(false)) - // 3. Configuración local reservada para cada entorno (p.ej.: local.default.toml). + // 3. Configuración local reservada para cada entorno (p. ej. local.default.toml). .add_source(File::from(config_dir.join(format!("local.{rm}.toml"))).required(false)) // 4. Configuración local común (local.toml). .add_source(File::from(config_dir.join("local.toml")).required(false)) @@ -206,7 +206,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( /// * **Valores por defecto**. Declara un valor por defecto para cada clave obligatoria. Las claves /// opcionales pueden ser `Option<T>`. /// -/// * **Secciones únicas**. Agrupa tus claves dentro de una sección exclusiva (p.ej. `[blog]`) para +/// * **Secciones únicas**. Agrupa tus claves dentro de una sección exclusiva (p. ej. `[blog]`) para /// evitar colisiones con otras librerías. /// /// * **Solo lectura**. La variable generada es inmutable durante toda la vida del programa. Para @@ -229,9 +229,7 @@ pub static CONFIG_VALUES: LazyLock<ConfigBuilder<DefaultState>> = LazyLock::new( macro_rules! include_config { ( $SETTINGS_NAME:ident : $Settings_Type:ty => [ $( $k:literal => $v:expr ),* $(,)? ] ) => { #[doc = concat!( - "Referencia y valores por defecto de los ajustes de configuración para [`", - stringify!($Settings_Type), - "`]." + "Instancia los ajustes de configuración para [`", stringify!($Settings_Type), "`]." )] #[doc = ""] #[doc = "Valores por defecto:"] diff --git a/src/core/action/definition.rs b/src/core/action/definition.rs index 9ec9af1f..7ebe4104 100644 --- a/src/core/action/definition.rs +++ b/src/core/action/definition.rs @@ -24,7 +24,8 @@ impl ActionKey { /// - `action_type_id`: Tipo de la acción. /// - `theme_type_id`: Opcional, identificador de tipo ([`UniqueId`]) del tema asociado. /// - `referer_type_id`: Opcional, identificador de tipo ([`UniqueId`]) del componente referido. - /// - `referer_id`: Opcional, identificador de la instancia (p.ej. para un formulario concreto). + /// - `referer_id`: Opcional, identificador de la instancia (p. ej. para asociar la acción a un + /// componente concreto). /// /// Esta clave permitirá seleccionar las funciones a ejecutar para ese tipo de acción, con /// filtros opcionales por tema, componente, o una instancia concreta según su identificador. diff --git a/src/global.rs b/src/global.rs index c8805a30..ee07d818 100644 --- a/src/global.rs +++ b/src/global.rs @@ -30,7 +30,7 @@ include_config!(SETTINGS: Settings => [ ]); #[derive(Debug, Deserialize)] -/// Ajustes para las secciones globales [`[app]`](App), [`[dev]`](Dev), [`[log]`](Log) y +/// Tipos para las secciones globales [`[app]`](App), [`[dev]`](Dev), [`[log]`](Log) y /// [`[server]`](Server) de [`SETTINGS`]. pub struct Settings { pub app: App, @@ -105,7 +105,7 @@ pub struct Server { pub bind_address: String, /// Puerto de escucha del servidor web. pub bind_port: u16, - /// Duración de la cookie de sesión en segundos (p.ej. `604_800` para una semana). + /// Duración de la cookie de sesión en segundos (p. ej., `604_800` para una semana). /// /// El valor `0` indica que la cookie permanecerá activa hasta que se cierre el navegador. pub session_lifetime: i64, diff --git a/src/html/assets/favicon.rs b/src/html/assets/favicon.rs index dce3e1bd..7598603c 100644 --- a/src/html/assets/favicon.rs +++ b/src/html/assets/favicon.rs @@ -63,7 +63,7 @@ impl Favicon { /// Le añade un icono genérico con atributo `sizes`, útil para indicar resoluciones específicas. /// /// El atributo `sizes` informa al navegador de las dimensiones de la imagen para que seleccione - /// el recurso más adecuado. Puede enumerar varias dimensiones separadas por espacios, p.ej. + /// el recurso más adecuado. Puede enumerar varias dimensiones separadas por espacios, p. ej. /// `"16x16 32x32 48x48"` o usar `any` para iconos escalables (SVG). /// /// No es imprescindible, pero puede mejorar la selección del icono más adecuado. @@ -73,7 +73,7 @@ impl Favicon { /// Le añade un *Apple Touch Icon*, usado por dispositivos iOS para las pantallas de inicio. /// - /// Se recomienda indicar también el tamaño, p.ej. `"256x256"`. + /// Se recomienda indicar también el tamaño, p. ej. `"256x256"`. pub fn with_apple_touch_icon(self, image: impl Into<String>, sizes: impl Into<String>) -> Self { self.add_icon_item("apple-touch-icon", image.into(), Some(sizes.into()), None) } diff --git a/src/html/unit.rs b/src/html/unit.rs index b67e8b17..53319dc8 100644 --- a/src/html/unit.rs +++ b/src/html/unit.rs @@ -34,8 +34,8 @@ use std::str::FromStr; /// /// - Soporta unidades **absolutas** (`cm`, `in`, `mm`, `pc`, `pt`, `px`) y **relativas** (`em`, /// `rem`, `%`, `vh`, `vw`). -/// - `FromStr` para convertir desde texto (p.ej. `"12px"`, `"1.25rem"`, `"auto"`). -/// - `Display` para formatear a cadena (p.ej. `UnitValue::Px(12)` genera `"12px"`). +/// - `FromStr` para convertir desde texto (p. ej., `"12px"`, `"1.25rem"`, `"auto"`). +/// - `Display` para formatear a cadena (p. ej., `UnitValue::Px(12)` genera `"12px"`). /// - `Deserialize` delega en `FromStr`, garantizando una gramática única. /// /// ## Ejemplos @@ -54,8 +54,8 @@ use std::str::FromStr; /// /// ## Notas /// -/// - Las absolutas **no aceptan** decimales (p.ej., `"1.5px"` sería erróneo). -/// - Se aceptan signos `+`/`-` en todas las unidades (p.ej., `"-12px"`, `"+0.5em"`). +/// - Las absolutas **no aceptan** decimales (p. ej., `"1.5px"` sería erróneo). +/// - Se aceptan signos `+`/`-` en todas las unidades (p. ej., `"-12px"`, `"+0.5em"`). /// - La comparación de unidad es *case-insensitive* al interpretar el texto (`"PX"`, `"Px"`, …). /// - **Sobre píxeles**: Los píxeles (px) son relativos al dispositivo de visualización. En /// dispositivos con baja densidad de píxeles (dpi), 1px equivale a un píxel (punto) del @@ -69,7 +69,7 @@ use std::str::FromStr; /// - Ejemplo: si `:root { font-size: 16px }` y un contenedor tiene `font-size: 20px`, entonces /// dentro del contenedor `1em == 20px` pero `1rem == 16px`. /// - Uso típico: `rem` para tipografía y espaciados globales (consistencia al cambiar la base del -/// sitio); `em` para tamaños que deban escalar **con el propio componente** (p.ej., +/// sitio); `em` para tamaños que deban escalar **con el propio componente** (p. ej., /// `padding: 0.5em` que crece si el componente aumenta su `font-size`). /// - **Sobre el viewport**: Si el ancho de la ventana del navegador es de 50cm, 1vw equivale a /// 0.5cm (1vw siempre es 1% del ancho del viewport, independientemente del zoom del navegador o @@ -107,26 +107,25 @@ pub enum UnitValue { } impl UnitValue { - /// Indica si el valor es **numérico**. + /// Indica si el valor es **medible**, incluyendo `Zero` sin unidad. /// - /// Devuelve `true` para `Zero` y las unidades absolutas/relativas, y `false` para - /// [`UnitValue::None`] y [`UnitValue::Auto`]. + /// Devuelve `false` para [`UnitValue::None`] y [`UnitValue::Auto`]. /// /// # Ejemplos /// /// ```rust /// # use pagetop::prelude::*; /// // Numéricos (incluido el cero sin unidad). - /// assert!(UnitValue::Zero.is_numeric()); - /// assert!(UnitValue::Px(0).is_numeric()); - /// assert!(UnitValue::Px(10).is_numeric()); - /// assert!(UnitValue::RelPct(33.0).is_numeric()); + /// assert!(UnitValue::Zero.is_measurable()); + /// assert!(UnitValue::Px(0).is_measurable()); + /// assert!(UnitValue::Px(10).is_measurable()); + /// assert!(UnitValue::RelPct(33.0).is_measurable()); /// // No numéricos. - /// assert!(!UnitValue::None.is_numeric()); - /// assert!(!UnitValue::Auto.is_numeric()); + /// assert!(!UnitValue::None.is_measurable()); + /// assert!(!UnitValue::Auto.is_measurable()); /// ``` #[inline] - pub const fn is_numeric(&self) -> bool { + pub const fn is_measurable(&self) -> bool { !matches!(self, UnitValue::None | UnitValue::Auto) } } @@ -173,9 +172,9 @@ impl fmt::Display for UnitValue { /// - `""` para `UnitValue::None` /// - `"auto"` /// - **Cero sin unidad**: `"0"`, `"+0"`, `"-0"`, `"0.0"`, `"0."`, `".0"` para `UnitValue::Zero` -/// - Porcentaje: `"<n>%"` (p.ej. `"33%"`, `"33 %"`) -/// - Absolutas enteras: `"<entero><unidad>"`, p.ej. `"12px"`, `"-5pt"` -/// - Relativas decimales: `"<float><unidad>"`, p.ej. `"1.25rem"`, `"-0.5vh"`, `".5em"`, `"1.rem"` +/// - Porcentaje: `"<n>%"` (p. ej., `"33%"`, `"33 %"`) +/// - Absolutas enteras: `"<entero><unidad>"`, p. ej., `"12px"`, `"-5pt"` +/// - Relativas decimales: `"<float><unidad>"`, p. ej., `"1.25rem"`, `"-0.5vh"`, `".5em"`, `"1.rem"` /// /// (Se toleran espacios entre número y unidad: `"12 px"`, `"1.5 rem"`). /// @@ -191,9 +190,9 @@ impl fmt::Display for UnitValue { /// /// ## Errores de interpretación /// -/// - Falta la unidad cuando es necesaria (p.ej. `"12"`, excepto para el valor cero). -/// - Decimales en valores que deben ser absolutos (p.ej. `"1.5px"`). -/// - Unidades desconocidas (p.ej. `"10ch"`, no soportada aún). +/// - Falta la unidad cuando es necesaria (p. ej., `"12"`, excepto para el valor cero). +/// - Decimales en valores que deben ser absolutos (p. ej. `"1.5px"`). +/// - Unidades desconocidas (p. ej., `"10ch"`, no soportada aún). /// - Notación científica o bases no decimales: `"1e3vw"`, `"0x10px"` (no soportadas). Los ceros a /// la izquierda (p. ej. `"020px"`) se interpretan en **base 10** (`20px`). /// diff --git a/src/locale.rs b/src/locale.rs index 7c913ec9..5c000f7c 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -181,8 +181,8 @@ pub enum LangMatch { /// Cuando el identificador de idioma es una cadena vacía. Unspecified, /// Si encuentra un [`LanguageIdentifier`] en la lista de idiomas soportados por PageTop que - /// coincide exactamente con el identificador de idioma (p.ej. "es-ES"), o con el identificador - /// del idioma base (p.ej. "es"). + /// coincide exactamente con el identificador de idioma (p. ej. "es-ES"), o con el identificador + /// del idioma base (p. ej. "es"). Found(&'static LanguageIdentifier), /// Si el identificador de idioma no está entre los soportados por PageTop. Unsupported(String), @@ -205,13 +205,13 @@ impl LangMatch { return Self::Unspecified; } - // Intenta aplicar coincidencia exacta con el código completo (p.ej. "es-MX"). + // Intenta aplicar coincidencia exacta con el código completo (p. ej. "es-MX"). let lang = language.to_ascii_lowercase(); if let Some(langid) = LANGUAGES.get(lang.as_str()).map(|(langid, _)| langid) { return Self::Found(langid); } - // Si la variante regional no existe, retrocede al idioma base (p.ej. "es"). + // Si la variante regional no existe, retrocede al idioma base (p. ej. "es"). if let Some((base_lang, _)) = lang.split_once('-') { if let Some(langid) = LANGUAGES.get(base_lang).map(|(langid, _)| langid) { return Self::Found(langid); @@ -375,13 +375,13 @@ impl L10n { } } - /// Añade un argumento `{$arg}` → `value` a la traducción. + /// Añade un argumento `{$arg}` => `value` a la traducción. pub fn with_arg(mut self, arg: impl Into<String>, value: impl Into<String>) -> Self { self.args.insert(arg.into(), value.into()); self } - /// Añade varios argumentos a la traducción de una sola vez (p.ej. usando la macro [`hm!`], + /// Añade varios argumentos a la traducción de una sola vez (p. ej. usando la macro [`hm!`], /// también vec![("k", "v")], incluso un array de duplas u otras colecciones). pub fn with_args<I, K, V>(mut self, args: I) -> Self where diff --git a/tests/html_unit.rs b/tests/html_unit.rs index 9316af89..6acae935 100644 --- a/tests/html_unit.rs +++ b/tests/html_unit.rs @@ -215,9 +215,9 @@ async fn unit_value_display_keeps_minus_zero_for_relatives() { #[pagetop::test] async fn unit_value_rejects_non_decimal_notations() { - // Octal, los ceros a la izquierda (p.ej. `"020px"`) se interpretan en **base 10** (`20px`). + // Octal, los ceros a la izquierda (p. ej. `"020px"`) se interpretan en **base 10** (`20px`). assert_eq!(UnitValue::from_str("020px").unwrap(), UnitValue::Px(20)); - // Notación científica y bases no decimales (p.ej. `"1e3vw"`, `"0x10px"`) no están soportadas. + // Notación científica y bases no decimales (p. ej., `"1e3vw"`, `"0x10px"`) no están soportadas. assert!(UnitValue::from_str("1e3vw").is_err()); assert!(UnitValue::from_str("0x10px").is_err()); } From 5eab417b11a3e98f1cd7f4effcdd1de959c86f1e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 18 Oct 2025 21:33:29 +0200 Subject: [PATCH 824/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20`add=5Fcompon?= =?UTF-8?q?ent`=20por=20`add=5Fchild`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- README.md | 2 +- examples/hello-name.rs | 2 +- examples/hello-world.rs | 2 +- extensions/pagetop-aliner/README.md | 4 ++-- extensions/pagetop-aliner/src/lib.rs | 4 ++-- src/base/component/block.rs | 2 +- src/base/component/intro.rs | 6 +++--- src/base/extension/welcome.rs | 10 +++++----- src/lib.rs | 2 +- src/response/page.rs | 23 +++++++++++------------ src/response/page/error.rs | 4 ++-- 12 files changed, 31 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2926a69..bfc9067a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ internos pueden omitirse si no afectan al uso del proyecto. - [context] Generaliza los parámetros de contexto - [context] Define un `trait` común de contexto - Modifica tipos para atributos HTML a minúsculas -- Renombra `with_component` por `add_component` +- Renombra `with_component` por `add_child` ### Corregido diff --git a/README.md b/README.md index be720910..986db58b 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ impl Extension for HelloWorld { async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) - .add_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + .add_child(Html::with(|_| html! { h1 { "Hello World!" } })) .render() } diff --git a/examples/hello-name.rs b/examples/hello-name.rs index e1285d09..c6a82aaf 100644 --- a/examples/hello-name.rs +++ b/examples/hello-name.rs @@ -14,7 +14,7 @@ async fn hello_name( ) -> ResultPage<Markup, ErrorPage> { let name = path.into_inner(); Page::new(request) - .add_component(Html::with(move |_| html! { h1 { "Hello " (name) "!" } })) + .add_child(Html::with(move |_| html! { h1 { "Hello " (name) "!" } })) .render() } diff --git a/examples/hello-world.rs b/examples/hello-world.rs index d56f2105..64817466 100644 --- a/examples/hello-world.rs +++ b/examples/hello-world.rs @@ -10,7 +10,7 @@ impl Extension for HelloWorld { async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) - .add_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + .add_child(Html::with(|_| html! { h1 { "Hello World!" } })) .render() } diff --git a/extensions/pagetop-aliner/README.md b/extensions/pagetop-aliner/README.md index 0560a067..43fb65a5 100644 --- a/extensions/pagetop-aliner/README.md +++ b/extensions/pagetop-aliner/README.md @@ -67,10 +67,10 @@ use pagetop::prelude::*; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_theme("Aliner") - .add_component( + .add_child( Block::new() .with_title(L10n::l("sample_title")) - .add_component(Html::with(|cx| html! { + .add_child(Html::with(|cx| html! { p { (L10n::l("sample_content").using(cx)) } })), ) diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index b51800c2..edbb5040 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -68,10 +68,10 @@ use pagetop::prelude::*; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_theme("Aliner") - .add_component( + .add_child( Block::new() .with_title(L10n::l("sample_title")) - .add_component(Html::with(|cx| html! { + .add_child(Html::with(|cx| html! { p { (L10n::l("sample_content").using(cx)) } })), ) diff --git a/src/base/component/block.rs b/src/base/component/block.rs index 9a04c4ea..17af50c2 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -71,7 +71,7 @@ impl Block { } /// Añade un nuevo componente hijo al bloque. - pub fn add_component(mut self, component: impl Component) -> Self { + pub fn add_child(mut self, component: impl Component) -> Self { self.children .alter_child(ChildOp::Add(Child::with(component))); self diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index 5d3440e9..7e5c3931 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -65,10 +65,10 @@ pub enum IntroOpening { /// ```rust /// # use pagetop::prelude::*; /// let intro = Intro::default() -/// .add_component( +/// .add_child( /// Block::new() /// .with_title(L10n::l("intro_custom_block_title")) -/// .add_component(Html::with(move |cx| { +/// .add_child(Html::with(move |cx| { /// html! { /// p { (L10n::l("intro_custom_paragraph_1").using(cx)) } /// p { (L10n::l("intro_custom_paragraph_2").using(cx)) } @@ -301,7 +301,7 @@ impl Intro { /// Añade un nuevo componente hijo a la intro. /// /// Si es un bloque ([`Block`]) aplica estilos específicos para destacarlo. - pub fn add_component(mut self, component: impl Component) -> Self { + pub fn add_child(mut self, component: impl Component) -> Self { self.children .alter_child(ChildOp::Add(Child::with(component))); self diff --git a/src/base/extension/welcome.rs b/src/base/extension/welcome.rs index d94afad7..b875163b 100644 --- a/src/base/extension/welcome.rs +++ b/src/base/extension/welcome.rs @@ -26,22 +26,22 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_title(L10n::l("welcome_title")) - .add_component( + .add_child( Intro::new() - .add_component( + .add_child( Block::new() .with_title(L10n::l("welcome_status_title")) - .add_component(Html::with(move |cx| { + .add_child(Html::with(move |cx| { html! { p { (L10n::l("welcome_status_1").using(cx)) } p { (L10n::l("welcome_status_2").using(cx)) } } })), ) - .add_component( + .add_child( Block::new() .with_title(L10n::l("welcome_support_title")) - .add_component(Html::with(move |cx| { + .add_child(Html::with(move |cx| { html! { p { (L10n::l("welcome_support_1").using(cx)) } p { (L10n::l("welcome_support_2").with_arg("app", app).using(cx)) } diff --git a/src/lib.rs b/src/lib.rs index de6d9e68..a2683495 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -61,7 +61,7 @@ impl Extension for HelloWorld { async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) - .add_component(Html::with(move |_| html! { h1 { "Hello World!" } })) + .add_child(Html::with(|_| html! { h1 { "Hello World!" } })) .render() } diff --git a/src/response/page.rs b/src/response/page.rs index 1649d543..036c999c 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -93,29 +93,28 @@ impl Page { self } - /// **Obsoleto desde la versión 0.4.0**: usar [`add_component()`](Self::add_component) en su - /// lugar. - #[deprecated(since = "0.4.0", note = "Use `add_component()` instead")] + /// **Obsoleto desde la versión 0.4.0**: usar [`add_child()`](Self::add_child) en su lugar. + #[deprecated(since = "0.4.0", note = "Use `add_child()` instead")] pub fn with_component(self, component: impl Component) -> Self { - self.add_component(component) + self.add_child(component) } - /// **Obsoleto desde la versión 0.4.0**: usar [`add_component_in()`](Self::add_component_in) en - /// su lugar. - #[deprecated(since = "0.4.0", note = "Use `add_component_in()` instead")] + /// **Obsoleto desde la versión 0.4.0**: usar [`add_child_in()`](Self::add_child_in) en su + /// lugar. + #[deprecated(since = "0.4.0", note = "Use `add_child_in()` instead")] pub fn with_component_in(self, region_key: &'static str, component: impl Component) -> Self { - self.add_component_in(region_key, component) + self.add_child_in(region_key, component) } - /// Añade un componente a la región de contenido por defecto. - pub fn add_component(mut self, component: impl Component) -> Self { + /// Añade un componente hijo a la región de contenido por defecto. + pub fn add_child(mut self, component: impl Component) -> Self { self.context .alter_child_in(REGION_CONTENT, ChildOp::Add(Child::with(component))); self } - /// Añade un componente en una región (`region_key`) de la página. - pub fn add_component_in(mut self, region_key: &'static str, component: impl Component) -> Self { + /// Añade un componente hijo en una región (`region_key`) de la página. + pub fn add_child_in(mut self, region_key: &'static str, component: impl Component) -> Self { self.context .alter_child_in(region_key, ChildOp::Add(Child::with(component))); self diff --git a/src/response/page/error.rs b/src/response/page/error.rs index 50e1c77b..6fe6451f 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -34,7 +34,7 @@ impl Display for ErrorPage { if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) .with_layout("error") - .add_component(Html::with(move |_| error403.clone())) + .add_child(Html::with(move |_| error403.clone())) .render() { write!(f, "{}", page.into_string()) @@ -49,7 +49,7 @@ impl Display for ErrorPage { if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) .with_layout("error") - .add_component(Html::with(move |_| error404.clone())) + .add_child(Html::with(move |_| error404.clone())) .render() { write!(f, "{}", page.into_string()) From 708dc9244b057dbe3a034e501f855636feb7ded1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Oct 2025 21:39:14 +0200 Subject: [PATCH 825/853] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Mejora=20macro=20`?= =?UTF-8?q?join=5Fopt!`=20y=20retoca=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/component.rs | 5 +++++ src/util.rs | 30 ++++++++++++++++-------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/core/component.rs b/src/core/component.rs index be9bbad1..a7faa2fb 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -10,4 +10,9 @@ pub use children::{Typed, TypedOp}; mod context; pub use context::{Context, ContextError, ContextOp, Contextual}; + +/// Alias de función (*callback*) para **resolver una URL** según el contexto de renderizado. +/// +/// Se usa para generar enlaces dinámicos en función del contexto (petición, idioma, etc.). Debe +/// devolver una referencia válida durante el renderizado. pub type FnPathByContext = fn(cx: &Context) -> &str; diff --git a/src/util.rs b/src/util.rs index f73cf78a..3d07361a 100644 --- a/src/util.rs +++ b/src/util.rs @@ -70,14 +70,12 @@ macro_rules! join { }; } -/// Concatena los fragmentos no vacíos en un [`Option<String>`] con un separador opcional. +/// Concatena los fragmentos **no vacíos** en un [`Option<String>`] con un separador opcional. /// -/// Esta macro acepta cualquier número de fragmentos que implementen [`AsRef<str>`] para concatenar -/// todos los fragmentos no vacíos usando opcionalmente un separador. +/// Acepta cualquier número de fragmentos que implementen [`AsRef<str>`]. Si todos los fragmentos +/// están vacíos, devuelve `None`. /// -/// Si todos los fragmentos están vacíos, devuelve [`None`]. -/// -/// # Ejemplo +/// # Ejemplos /// /// ```rust /// # use pagetop::prelude::*; @@ -90,7 +88,7 @@ macro_rules! join { /// assert_eq!(result_without_separator, Some("HelloWorld".to_string())); /// /// // Devuelve `None` si todos los fragmentos están vacíos. -/// let result_empty = join_opt!(["", "", ""]); +/// let result_empty = join_opt!(["", "", ""]; ","); /// assert_eq!(result_empty, None); /// ``` #[macro_export] @@ -100,12 +98,16 @@ macro_rules! join_opt { (!s.is_empty()).then_some(s) }}; ([$($arg:expr),* $(,)?]; $separator:expr) => {{ - let s = [$($arg),*] - .iter() - .filter(|&item| !item.is_empty()) - .cloned() - .collect::<Vec<_>>() - .join($separator); + let sep = ($separator).as_ref(); + let mut s = String::new(); + for part in [ $( ($arg).as_ref() ),* ] { + if !(part as &str).is_empty() { + if !s.is_empty() { + s.push_str(sep); + } + s.push_str(part); + } + } (!s.is_empty()).then_some(s) }}; } @@ -153,7 +155,7 @@ macro_rules! join_pair { }}; } -/// Concatena varios fragmentos en un [`Option<String>`] si ninguno está vacío. +/// Concatena varios fragmentos en un [`Option<String>`] **si ninguno está vacío**. /// /// Si alguno de los fragmentos, que deben implementar [`AsRef<str>`], está vacío, devuelve /// [`None`]. Opcionalmente se puede indicar un separador entre los fragmentos concatenados. From 44ddfa4a5136897da3d3561592041caee7528d8e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Oct 2025 21:40:42 +0200 Subject: [PATCH 826/853] =?UTF-8?q?=E2=9C=A8=20Simplifica=20`Display`=20co?= =?UTF-8?q?n=20`f.write=5Fstr()`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html/unit.rs | 6 +++--- src/response/page/error.rs | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/html/unit.rs b/src/html/unit.rs index 53319dc8..4a99de16 100644 --- a/src/html/unit.rs +++ b/src/html/unit.rs @@ -145,9 +145,9 @@ impl UnitValue { impl fmt::Display for UnitValue { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - UnitValue::None => write!(f, ""), - UnitValue::Auto => write!(f, "auto"), - UnitValue::Zero => write!(f, "0"), + UnitValue::None => Ok(()), + UnitValue::Auto => f.write_str("auto"), + UnitValue::Zero => f.write_str("0"), // Valor absoluto. UnitValue::Cm(av) => write!(f, "{av}cm"), UnitValue::In(av) => write!(f, "{av}in"), diff --git a/src/response/page/error.rs b/src/response/page/error.rs index 6fe6451f..9945a948 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -24,9 +24,9 @@ impl Display for ErrorPage { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { // Error 304. - ErrorPage::NotModified(_) => write!(f, "Not Modified"), + ErrorPage::NotModified(_) => f.write_str("Not Modified"), // Error 400. - ErrorPage::BadRequest(_) => write!(f, "Bad Client Data"), + ErrorPage::BadRequest(_) => f.write_str("Bad Client Data"), // Error 403. ErrorPage::AccessDenied(request) => { let mut error_page = Page::new(request.clone()); @@ -39,7 +39,7 @@ impl Display for ErrorPage { { write!(f, "{}", page.into_string()) } else { - write!(f, "Access Denied") + f.write_str("Access Denied") } } // Error 404. @@ -54,15 +54,15 @@ impl Display for ErrorPage { { write!(f, "{}", page.into_string()) } else { - write!(f, "Not Found") + f.write_str("Not Found") } } // Error 412. - ErrorPage::PreconditionFailed(_) => write!(f, "Precondition Failed"), + ErrorPage::PreconditionFailed(_) => f.write_str("Precondition Failed"), // Error 500. - ErrorPage::InternalError(_) => write!(f, "Internal Error"), + ErrorPage::InternalError(_) => f.write_str("Internal Error"), // Error 504. - ErrorPage::Timeout(_) => write!(f, "Timeout"), + ErrorPage::Timeout(_) => f.write_str("Timeout"), } } } From d6e176cc197d94d0c9d95222a9913551fe1033eb Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Oct 2025 21:47:19 +0200 Subject: [PATCH 827/853] =?UTF-8?q?=E2=9E=95=20(bootsier):=20A=C3=B1ade=20?= =?UTF-8?q?dependencia=20`serde`=20y=20edita=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 1 + Cargo.toml | 3 ++- README.md | 2 +- extensions/pagetop-bootsier/Cargo.toml | 3 ++- extensions/pagetop-bootsier/README.md | 6 +++--- extensions/pagetop-bootsier/src/lib.rs | 2 +- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f1b09f9d..2f9fa42e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1593,6 +1593,7 @@ version = "0.0.18" dependencies = [ "pagetop", "pagetop-build", + "serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0d17082b..b1bae0a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ actix-web = { workspace = true, default-features = true } actix-session = { version = "0.11", features = ["cookie-session"] } actix-web-files = { package = "actix-files", version = "0.6" } -serde = { version = "1.0", features = ["derive"] } +serde.workspace = true pagetop-macros.workspace = true pagetop-statics.workspace = true @@ -78,6 +78,7 @@ authors = ["Manuel Cillero <manuel@cillero.es>"] [workspace.dependencies] actix-web = { version = "4.11", default-features = false } +serde = { version = "1.0", features = ["derive"] } # Helpers pagetop-build = { version = "0.3", path = "helpers/pagetop-build" } pagetop-macros = { version = "0.2", path = "helpers/pagetop-macros" } diff --git a/README.md b/README.md index 986db58b..9a12c845 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ El código se organiza en un *workspace* donde actualmente se incluyen los sigui es un tema para demos y pruebas que muestra esquemáticamente la composición de las páginas HTML. * **[pagetop-bootsier](https://git.cillero.es/manuelcillero/pagetop/src/branch/main/extensions/pagetop-bootsier)**, - tema basado en [Bootstrap](https://getbootstrap.com) para ofrecer su catálogo de estilos y + tema basado en [Bootstrap](https://getbootstrap.com) para integrar su catálogo de estilos y componentes flexibles. diff --git a/extensions/pagetop-bootsier/Cargo.toml b/extensions/pagetop-bootsier/Cargo.toml index 11306b63..6df6cf69 100644 --- a/extensions/pagetop-bootsier/Cargo.toml +++ b/extensions/pagetop-bootsier/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.18" edition = "2021" description = """ - Tema de PageTop basado en Bootstrap para dar vida a tus diseños web. + Tema de PageTop basado en Bootstrap para aplicar su catálogo de estilos y componentes flexibles. """ categories = ["web-programming", "gui"] keywords = ["pagetop", "theme", "bootstrap", "css", "js"] @@ -16,6 +16,7 @@ authors.workspace = true [dependencies] pagetop.workspace = true +serde.workspace = true [build-dependencies] pagetop-build.workspace = true diff --git a/extensions/pagetop-bootsier/README.md b/extensions/pagetop-bootsier/README.md index 7495bc22..84e11b57 100644 --- a/extensions/pagetop-bootsier/README.md +++ b/extensions/pagetop-bootsier/README.md @@ -2,7 +2,7 @@ <h1>PageTop Bootsier</h1> -<p>Tema de <strong>PageTop</strong> basado en Bootstrap para dar vida a tus diseños web.</p> +<p>Tema de <strong>PageTop</strong> basado en Bootstrap para aplicar su catálogo de estilos y componentes flexibles.</p> [![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) [![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) @@ -67,10 +67,10 @@ use pagetop::prelude::*; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_theme("Bootsier") - .add_component( + .add_child( Block::new() .with_title(L10n::l("sample_title")) - .add_component(Html::with(|cx| html! { + .add_child(Html::with(|cx| html! { p { (L10n::l("sample_content").using(cx)) } })), ) diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index a6583333..777f71e1 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -3,7 +3,7 @@ <h1>PageTop Bootsier</h1> -<p>Tema de <strong>PageTop</strong> basado en Bootstrap para ofrecer su catálogo de estilos y componentes flexibles.</p> +<p>Tema de <strong>PageTop</strong> basado en Bootstrap para aplicar su catálogo de estilos y componentes flexibles.</p> [![Doc API](https://img.shields.io/docsrs/pagetop-bootsier?label=Doc%20API&style=for-the-badge&logo=Docs.rs)](https://docs.rs/pagetop-bootsier) [![Crates.io](https://img.shields.io/crates/v/pagetop-bootsier.svg?style=for-the-badge&logo=ipfs)](https://crates.io/crates/pagetop-bootsier) From 8978506c39b8eee428875c9766c5d2460d30aa09 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 19 Oct 2025 21:57:15 +0200 Subject: [PATCH 828/853] =?UTF-8?q?=E2=9C=A8=20(bootsier):=20A=C3=B1ade=20?= =?UTF-8?q?m=C3=A1s=20componentes=20y=20repasa=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Se incorpora nuevo componente Dropdown. - Se crea un componente Navbar con soporte para marca, elementos de navegación. - Se implementa el componente Offcanvas con opciones de posición, visibilidad y fondo personalizables. - Mejora el manejo de imágenes con un nuevo componente de Image. - Se reorganizan los componentes del tema para una mejor estructura y usabilidad. --- extensions/pagetop-bootsier/build.rs | 2 +- extensions/pagetop-bootsier/src/config.rs | 41 +++ extensions/pagetop-bootsier/src/lib.rs | 30 +- .../src/locale/en-US/bootsier.ftl | 5 + .../src/locale/en-US/components.ftl | 5 + .../src/locale/en-US/regions.ftl | 9 + .../src/locale/es-ES/bootsier.ftl | 5 + .../src/locale/es-ES/components.ftl | 5 + .../src/locale/es-ES/regions.ftl | 9 + extensions/pagetop-bootsier/src/theme.rs | 27 ++ extensions/pagetop-bootsier/src/theme/aux.rs | 18 ++ .../pagetop-bootsier/src/theme/aux/border.rs | 202 ++++++++++++ .../src/theme/aux/breakpoint.rs | 127 ++++++++ .../pagetop-bootsier/src/theme/aux/color.rs | 155 +++++++++ .../pagetop-bootsier/src/theme/aux/opacity.rs | 109 +++++++ .../pagetop-bootsier/src/theme/aux/rounded.rs | 214 +++++++++++++ .../pagetop-bootsier/src/theme/container.rs | 269 ++++++++++++++++ .../pagetop-bootsier/src/theme/dropdown.rs | 5 + .../src/theme/dropdown/component.rs | 99 ++++++ .../src/theme/dropdown/item.rs | 109 +++++++ .../pagetop-bootsier/src/theme/image.rs | 186 +++++++++++ .../pagetop-bootsier/src/theme/navbar.rs | 17 + .../src/theme/navbar/brand.rs | 104 ++++++ .../src/theme/navbar/button_toggler.rs | 73 +++++ .../src/theme/navbar/component.rs | 233 ++++++++++++++ .../src/theme/navbar/content.rs | 69 ++++ .../pagetop-bootsier/src/theme/navbar/item.rs | 113 +++++++ .../pagetop-bootsier/src/theme/navbar/nav.rs | 75 +++++ .../pagetop-bootsier/src/theme/offcanvas.rs | 302 ++++++++++++++++++ 29 files changed, 2608 insertions(+), 9 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/config.rs create mode 100644 extensions/pagetop-bootsier/src/locale/en-US/bootsier.ftl create mode 100644 extensions/pagetop-bootsier/src/locale/en-US/components.ftl create mode 100644 extensions/pagetop-bootsier/src/locale/en-US/regions.ftl create mode 100644 extensions/pagetop-bootsier/src/locale/es-ES/bootsier.ftl create mode 100644 extensions/pagetop-bootsier/src/locale/es-ES/components.ftl create mode 100644 extensions/pagetop-bootsier/src/locale/es-ES/regions.ftl create mode 100644 extensions/pagetop-bootsier/src/theme.rs create mode 100644 extensions/pagetop-bootsier/src/theme/aux.rs create mode 100644 extensions/pagetop-bootsier/src/theme/aux/border.rs create mode 100644 extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs create mode 100644 extensions/pagetop-bootsier/src/theme/aux/color.rs create mode 100644 extensions/pagetop-bootsier/src/theme/aux/opacity.rs create mode 100644 extensions/pagetop-bootsier/src/theme/aux/rounded.rs create mode 100644 extensions/pagetop-bootsier/src/theme/container.rs create mode 100644 extensions/pagetop-bootsier/src/theme/dropdown.rs create mode 100644 extensions/pagetop-bootsier/src/theme/dropdown/component.rs create mode 100644 extensions/pagetop-bootsier/src/theme/dropdown/item.rs create mode 100644 extensions/pagetop-bootsier/src/theme/image.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/brand.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/component.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/content.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/item.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/nav.rs create mode 100644 extensions/pagetop-bootsier/src/theme/offcanvas.rs diff --git a/extensions/pagetop-bootsier/build.rs b/extensions/pagetop-bootsier/build.rs index 5945660a..a96301c5 100644 --- a/extensions/pagetop-bootsier/build.rs +++ b/extensions/pagetop-bootsier/build.rs @@ -15,5 +15,5 @@ fn main() -> std::io::Result<()> { fn bootstrap_js_files(path: &Path) -> bool { // No filtra durante el desarrollo, solo en la compilación "release". env::var("PROFILE").unwrap_or_else(|_| "release".to_string()) != "release" - || path.file_name().map_or(false, |n| n == "bootstrap.min.js") + || path.file_name().is_some_and(|n| n == "bootstrap.min.js") } diff --git a/extensions/pagetop-bootsier/src/config.rs b/extensions/pagetop-bootsier/src/config.rs new file mode 100644 index 00000000..6c2365ba --- /dev/null +++ b/extensions/pagetop-bootsier/src/config.rs @@ -0,0 +1,41 @@ +//! Opciones de configuración del tema. +//! +//! Ejemplo: +//! +//! ```toml +//! [bootsier] +//! max_width = "90rem" +//! ``` +//! +//! Uso: +//! +//! ```rust +//! # use pagetop::prelude::*; +//! use pagetop_bootsier::config; +//! +//! assert_eq!(config::SETTINGS.bootsier.max_width, UnitValue::Px(1440)); +//! ``` +//! +//! Consulta [`pagetop::config`] para ver cómo PageTop lee los archivos de configuración y aplica +//! los valores a los ajustes. + +use pagetop::prelude::*; + +use serde::Deserialize; + +include_config!(SETTINGS: Settings => [ + // [bootsier] + "bootsier.max_width" => "1440px", +]); + +#[derive(Debug, Deserialize)] +/// Tipos para la sección [`[bootsier]`](Bootsier) de [`SETTINGS`]. +pub struct Settings { + pub bootsier: Bootsier, +} +#[derive(Debug, Deserialize)] +/// Sección `[bootsier]` de la configuración. Forma parte de [`Settings`]. +pub struct Bootsier { + /// Ancho máximo predeterminado para la página, por ejemplo "100%" o "90rem". + pub max_width: UnitValue, +} diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index 777f71e1..a0e6c703 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -68,10 +68,10 @@ use pagetop::prelude::*; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) .with_theme("Bootsier") - .add_component( + .add_child( Block::new() .with_title(L10n::l("sample_title")) - .add_component(Html::with(|cx| html! { + .add_child(Html::with(|cx| html! { p { (L10n::l("sample_content").using(cx)) } })), ) @@ -80,18 +80,32 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { ``` */ +#![doc( + html_favicon_url = "https://git.cillero.es/manuelcillero/pagetop/raw/branch/main/static/favicon.ico" +)] + use pagetop::prelude::*; -/// El tema usa las mismas regiones predefinidas por [`ThemeRegion`]. -pub type BootsierRegion = ThemeRegion; +include_locales!(LOCALES_BOOTSIER); // Versión de la librería Bootstrap. const BOOTSTRAP_VERSION: &str = "5.3.8"; -/// Tema basado en [Bootstrap](https://getbootstrap.com/) para los componentes base de PageTop. -/// -/// Ofrece composición de páginas *responsive*, utilidades y componentes listos para usar, con -/// estilos coherentes y enfoque en accesibilidad. +pub mod config; + +pub mod theme; + +/// *Prelude* del tema. +pub mod prelude { + pub use crate::config::*; + pub use crate::theme::aux::*; + pub use crate::theme::*; +} + +/// El tema usa las mismas regiones predefinidas por [`ThemeRegion`]. +pub type BootsierRegion = ThemeRegion; + +/// Implementa el tema. pub struct Bootsier; impl Extension for Bootsier { diff --git a/extensions/pagetop-bootsier/src/locale/en-US/bootsier.ftl b/extensions/pagetop-bootsier/src/locale/en-US/bootsier.ftl new file mode 100644 index 00000000..0e8969cd --- /dev/null +++ b/extensions/pagetop-bootsier/src/locale/en-US/bootsier.ftl @@ -0,0 +1,5 @@ +e404-description = Oops! Page Not Found +e404-message = The page you are looking for may have been removed, had its name changed, or is temporarily unavailable. +e500-description = Oops! Unexpected Error +e500-message = We're having an issue. Please report this error to an administrator. +back-homepage = Back to homepage diff --git a/extensions/pagetop-bootsier/src/locale/en-US/components.ftl b/extensions/pagetop-bootsier/src/locale/en-US/components.ftl new file mode 100644 index 00000000..83dde396 --- /dev/null +++ b/extensions/pagetop-bootsier/src/locale/en-US/components.ftl @@ -0,0 +1,5 @@ +# Offcanvas +close = Close + +# Navbar +toggle = Toggle navigation diff --git a/extensions/pagetop-bootsier/src/locale/en-US/regions.ftl b/extensions/pagetop-bootsier/src/locale/en-US/regions.ftl new file mode 100644 index 00000000..f3b76e22 --- /dev/null +++ b/extensions/pagetop-bootsier/src/locale/en-US/regions.ftl @@ -0,0 +1,9 @@ +header = Header +nav_branding = Navigation branding region +nav_main = Main navigation region +nav_additional = Additional navigation region (eg search form, social icons, etc) +breadcrumb = Breadcrumb +content = Main content +sidebar_first = Sidebar first +sidebar_second = Sidebar second +footer = Footer diff --git a/extensions/pagetop-bootsier/src/locale/es-ES/bootsier.ftl b/extensions/pagetop-bootsier/src/locale/es-ES/bootsier.ftl new file mode 100644 index 00000000..998b54f2 --- /dev/null +++ b/extensions/pagetop-bootsier/src/locale/es-ES/bootsier.ftl @@ -0,0 +1,5 @@ +e404-description = ¡Vaya! Página No Encontrada +e404-message = La página que está buscando puede haber sido eliminada, cambiada de nombre o no está disponible temporalmente. +e500-description = ¡Vaya! Error Inesperado +e500-message = Está ocurriendo una incidencia. Por favor, informe de este error a un administrador. +back-homepage = Volver al inicio diff --git a/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl b/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl new file mode 100644 index 00000000..1ae97888 --- /dev/null +++ b/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl @@ -0,0 +1,5 @@ +# Offcanvas +close = Cerrar + +# Navbar +toggle = Mostrar/ocultar navegación diff --git a/extensions/pagetop-bootsier/src/locale/es-ES/regions.ftl b/extensions/pagetop-bootsier/src/locale/es-ES/regions.ftl new file mode 100644 index 00000000..674fc4b1 --- /dev/null +++ b/extensions/pagetop-bootsier/src/locale/es-ES/regions.ftl @@ -0,0 +1,9 @@ +header = Cabecera +nav_branding = Navegación y marca +nav_main = Navegación principal +nav_additional = Navegación adicional (p.e. formulario de búsqueda, iconos sociales, etc.) +breadcrumb = Ruta de posicionamiento +content = Contenido principal +sidebar_first = Barra lateral primera +sidebar_second = Barra lateral segunda +footer = Pie diff --git a/extensions/pagetop-bootsier/src/theme.rs b/extensions/pagetop-bootsier/src/theme.rs new file mode 100644 index 00000000..51073d43 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme.rs @@ -0,0 +1,27 @@ +//! Definiciones y componentes del tema. + +pub mod aux; + +// Container. +mod container; +pub use container::{Container, ContainerType}; + +// Dropdown. +pub mod dropdown; +#[doc(inline)] +pub use dropdown::Dropdown; + +// Image. +mod image; +pub use image::{Image, ImageSize}; + +// Navbar. +pub mod navbar; +#[doc(inline)] +pub use navbar::{Navbar, NavbarToggler}; + +// Offcanvas. +mod offcanvas; +pub use offcanvas::{ + Offcanvas, OffcanvasBackdrop, OffcanvasBodyScroll, OffcanvasPlacement, OffcanvasVisibility, +}; diff --git a/extensions/pagetop-bootsier/src/theme/aux.rs b/extensions/pagetop-bootsier/src/theme/aux.rs new file mode 100644 index 00000000..72ebf066 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux.rs @@ -0,0 +1,18 @@ +//! Coleción de elementos auxiliares de Bootstrap para Bootsier. + +mod breakpoint; +pub use breakpoint::BreakPoint; + +mod color; +pub use color::Color; +pub use color::{BgColor, BorderColor, TextColor}; + +mod opacity; +pub use opacity::Opacity; +pub use opacity::{BgOpacity, BorderOpacity, TextOpacity}; + +mod border; +pub use border::{Border, BorderSize}; + +mod rounded; +pub use rounded::{Rounded, RoundedRadius}; diff --git a/extensions/pagetop-bootsier/src/theme/aux/border.rs b/extensions/pagetop-bootsier/src/theme/aux/border.rs new file mode 100644 index 00000000..840f03c7 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/border.rs @@ -0,0 +1,202 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +use std::fmt; + +// **< BorderSize >********************************************************************************* + +/// Tamaño (**ancho**) para los bordes ([`Border`]). +/// +/// Mapea a `border`, `border-0` y `border-{1..5}`: +/// +/// - `None` no añade clase (devuelve `""`). +/// - `Default` genera `border` (borde por defecto del tema). +/// - `Zero` genera `border-0` (sin borde). +/// - `Scale{1..5}` genera `border-{1..5}` (ancho creciente). +#[derive(AutoDefault)] +pub enum BorderSize { + #[default] + None, + Default, + Zero, + Scale1, + Scale2, + Scale3, + Scale4, + Scale5, +} + +impl BorderSize { + #[rustfmt::skip] + fn to_class(&self, prefix: impl AsRef<str>) -> String { + match self { + Self::None => String::new(), + Self::Default => String::from(prefix.as_ref()), + Self::Zero => join!(prefix, "-0"), + Self::Scale1 => join!(prefix, "-1"), + Self::Scale2 => join!(prefix, "-2"), + Self::Scale3 => join!(prefix, "-3"), + Self::Scale4 => join!(prefix, "-4"), + Self::Scale5 => join!(prefix, "-5"), + } + } +} + +impl fmt::Display for BorderSize { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.to_class("border")) + } +} + +// **< Border >************************************************************************************* + +/// Agrupa propiedades para crear **bordes**. +/// +/// Permite: +/// +/// - Definir un tamaño **global** para todo el borde (`size`). +/// - Ajustar el tamaño de cada **lado lógico** (`top`, `end`, `bottom`, `start`, **en este orden**, +/// respetando LTR/RTL). +/// - Aplicar un **color** al borde (`BorderColor`). +/// - Aplicar un nivel de **opacidad** (`BorderOpacity`). +/// +/// # Comportamiento aditivo / sustractivo +/// +/// - **Aditivo**: basta con crear un borde sin tamaño con `Border::new()` para ir añadiendo cada +/// lado lógico con el tamaño deseado usando `BorderSize::Scale{1..5}`. +/// +/// - **Sustractivo**: se crea un borde con tamaño predefinido, p. ej. utilizando +/// `Border::with(BorderSize::Scale2)` y eliminar los lados deseados con `BorderSize::Zero`. +/// +/// - **Anchos diferentes por lado**: usando `BorderSize::Scale{1..5}` en cada lado deseado. +/// +/// # Ejemplos +/// +/// **Borde global:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = Border::with(BorderSize::Scale2); +/// assert_eq!(b.to_string(), "border-2"); +/// ``` +/// +/// **Aditivo (solo borde superior):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = Border::new().with_top(BorderSize::Scale1); +/// assert_eq!(b.to_string(), "border-top-1"); +/// ``` +/// +/// **Sustractivo (borde global menos el superior):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = Border::with(BorderSize::Default).with_top(BorderSize::Zero); +/// assert_eq!(b.to_string(), "border border-top-0"); +/// ``` +/// +/// **Ancho por lado (lado lógico inicial a 2 y final a 4):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = Border::new().with_start(BorderSize::Scale2).with_end(BorderSize::Scale4); +/// assert_eq!(b.to_string(), "border-end-4 border-start-2"); +/// ``` +/// +/// **Combinado (ejemplo completo):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = Border::with(BorderSize::Default) // Borde global por defecto. +/// .with_top(BorderSize::Zero) // Quita borde superior. +/// .with_end(BorderSize::Scale3) // Ancho 3 para el lado lógico final. +/// .with_color(BorderColor::Theme(Color::Primary)) +/// .with_opacity(BorderOpacity::Theme(Opacity::Half)); +/// +/// assert_eq!(b.to_string(), "border border-top-0 border-end-3 border-primary border-opacity-50"); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Border { + size : BorderSize, + top : BorderSize, + end : BorderSize, + bottom : BorderSize, + start : BorderSize, + color : BorderColor, + opacity: BorderOpacity, +} + +impl Border { + /// Prepara un borde **sin tamaño global** de partida. + pub fn new() -> Self { + Self::default() + } + + /// Crea un borde **con tamaño global** (`size`). + pub fn with(size: BorderSize) -> Self { + Self::default().with_size(size) + } + + // **< Border BUILDER >************************************************************************* + + /// Establece el tamaño global del borde (`border*`). + pub fn with_size(mut self, size: BorderSize) -> Self { + self.size = size; + self + } + + /// Establece el tamaño del borde superior (`border-top-*`). + pub fn with_top(mut self, size: BorderSize) -> Self { + self.top = size; + self + } + + /// Establece el tamaño del borde en el lado lógico final (`border-end-*`). Respeta LTR/RTL. + pub fn with_end(mut self, size: BorderSize) -> Self { + self.end = size; + self + } + + /// Establece el tamaño del borde inferior (`border-bottom-*`). + pub fn with_bottom(mut self, size: BorderSize) -> Self { + self.bottom = size; + self + } + + /// Establece el tamaño del borde en el lado lógico inicial (`border-start-*`). Respeta LTR/RTL. + pub fn with_start(mut self, size: BorderSize) -> Self { + self.start = size; + self + } + + /// Establece el **color** del borde. + pub fn with_color(mut self, color: BorderColor) -> Self { + self.color = color; + self + } + + /// Establece la **opacidad** del borde. + pub fn with_opacity(mut self, opacity: BorderOpacity) -> Self { + self.opacity = opacity; + self + } +} + +impl fmt::Display for Border { + /// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start`, *color* y + /// *opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + join_opt!([ + self.size.to_string(), + self.top.to_class("border-top"), + self.end.to_class("border-end"), + self.bottom.to_class("border-bottom"), + self.start.to_class("border-start"), + self.color.to_string(), + self.opacity.to_string(), + ]; " ") + .unwrap_or_default() + ) + } +} diff --git a/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs new file mode 100644 index 00000000..963bb3b5 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs @@ -0,0 +1,127 @@ +use pagetop::prelude::*; + +use std::fmt; + +/// Define los puntos de ruptura (*breakpoints*) para aplicar diseño *responsive*. +/// +/// - `"sm"`, `"md"`, `"lg"`, `"xl"` o `"xxl"` para los puntos de ruptura `SM`, `MD`, `LG`, `XL` o +/// `XXL`, respectivamente. +/// - `""` (cadena vacía) para `None`. +/// - `"fluid"` para las variantes `Fluid` y `FluidMax(_)`, útil para modelar `container-fluid` en +/// [`Container`](crate::theme::Container). Se debe tener en cuenta que `"fluid"` **no** es un +/// sufijo de *breakpoint*. Para construir clases válidas con prefijo (p. ej., `"col-md"`), se +/// recomienda usar `to_class()` (Self::to_class) o `try_class()` (Self::try_class). +/// +/// # Ejemplos +/// +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// assert_eq!(BreakPoint::MD.to_string(), "md"); +/// assert_eq!(BreakPoint::None.to_string(), ""); +/// assert_eq!(BreakPoint::Fluid.to_string(), "fluid"); +/// +/// // Forma correcta para clases con prefijo: +/// //assert_eq!(BreakPoint::MD.to_class("col"), "col-md"); +/// //assert_eq!(BreakPoint::Fluid.to_class("offcanvas"), "offcanvas"); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub enum BreakPoint { + /// **Menos de 576px**. Dispositivos muy pequeños: teléfonos en modo vertical. + #[default] + None, + /// **576px o más** - Dispositivos pequeños: teléfonos en modo horizontal. + SM, + /// **768px o más** - Dispositivos medianos: tabletas. + MD, + /// **992px o más** - Dispositivos grandes: puestos de escritorio. + LG, + /// **1200px o más** - Dispositivos muy grandes: puestos de escritorio grandes. + XL, + /// **1400px o más** - Dispositivos extragrandes: puestos de escritorio más grandes. + XXL, + /// Para [`Container`](crate::theme::Container), ocupa el 100% del ancho del dispositivo. + Fluid, + /// Para [`Container`](crate::theme::Container), ocupa el 100% del ancho del dispositivo hasta + /// un ancho máximo indicado. + FluidMax(UnitValue) +} + +impl BreakPoint { + /// Comprueba si es un punto de ruptura efectivo. + /// + /// Devuelve `true` si el valor es `SM`, `MD`, `LG`, `XL` o `XXL`; y `false` en otro caso. + #[inline] + pub const fn is_breakpoint(&self) -> bool { + matches!(self, Self::SM | Self::MD | Self::LG | Self::XL | Self::XXL) + } + + /// Genera un nombre de clase CSS basado en el punto de ruptura. + /// + /// Si es un punto de ruptura efectivo (ver [`is_breakpoint()`](Self::is_breakpoint), concatena + /// el prefijo, un guion (`-`) y el sufijo asociado. En otro caso devuelve únicamente el + /// prefijo. + /// + /// # Ejemplo + /// + /// ```rust + /// let breakpoint = BreakPoint::MD; + /// let class = breakpoint.to_class("col"); + /// assert_eq!(class, "col-md".to_string()); + /// + /// let breakpoint = BreakPoint::Fluid; + /// let class = breakpoint.to_class("offcanvas"); + /// assert_eq!(class, "offcanvas".to_string()); + /// ``` + #[inline] + pub fn to_class(&self, prefix: impl AsRef<str>) -> String { + if self.is_breakpoint() { + join!(prefix, "-", self.to_string()) + } else { + String::from(prefix.as_ref()) + } + } + + /// Intenta generar un nombre de clase CSS basado en el punto de ruptura. + /// + /// Si es un punto de ruptura efectivo (ver [`is_breakpoint()`](Self::is_breakpoint), devuelve + /// `Some(String)` concatenando el prefijo, un guion (`-`) y el sufijo asociado. En otro caso + /// devuelve `None`. + /// + /// # Ejemplo + /// + /// ```rust + /// let breakpoint = BreakPoint::MD; + /// let class = breakpoint.try_class("col"); + /// assert_eq!(class, Some("col-md".to_string())); + /// + /// let breakpoint = BreakPoint::Fluid; + /// let class = breakpoint.try_class("navbar-expanded"); + /// assert_eq!(class, None); + /// ``` + #[inline] + pub fn try_class(&self, prefix: impl AsRef<str>) -> Option<String> { + if self.is_breakpoint() { + Some(join!(prefix, "-", self.to_string())) + } else { + None + } + } +} + +#[rustfmt::skip] +impl fmt::Display for BreakPoint { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::None => Ok(()), + Self::SM => f.write_str("sm"), + Self::MD => f.write_str("md"), + Self::LG => f.write_str("lg"), + Self::XL => f.write_str("xl"), + Self::XXL => f.write_str("xxl"), + // Devuelven "fluid" (para modelar `container-fluid`). + Self::Fluid => f.write_str("fluid"), + Self::FluidMax(_) => f.write_str("fluid"), + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/aux/color.rs b/extensions/pagetop-bootsier/src/theme/aux/color.rs new file mode 100644 index 00000000..3a288550 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/color.rs @@ -0,0 +1,155 @@ +use pagetop::prelude::*; + +use std::fmt; + +// **< Color >************************************************************************************** + +/// Paleta de colores **temáticos**. +/// +/// Equivalente a los nombres estándar de Bootstrap (`primary`, `secondary`, `success`, etc.). Sirve +/// como base para componer clases de fondo ([`BgColor`]), borde ([`BorderColor`]) y texto +/// ([`TextColor`]). +#[derive(AutoDefault)] +pub enum Color { + #[default] + Primary, + Secondary, + Success, + Info, + Warning, + Danger, + Light, + Dark, +} + +#[rustfmt::skip] +impl fmt::Display for Color { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Primary => f.write_str("primary"), + Self::Secondary => f.write_str("secondary"), + Self::Success => f.write_str("success"), + Self::Info => f.write_str("info"), + Self::Warning => f.write_str("warning"), + Self::Danger => f.write_str("danger"), + Self::Light => f.write_str("light"), + Self::Dark => f.write_str("dark"), + } + } +} + +// **< BgColor >************************************************************************************ + +/// Colores de fondo (`bg-*`). +/// +/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). +/// - `Body*` usa fondos predefinidos del tema (`bg-body`, `bg-body-secondary`, `bg-body-tertiary`). +/// - `Theme(Color)` genera `bg-{color}` (p. ej., `bg-primary`). +/// - `Subtle(Color)` genera `bg-{color}-subtle` (tono suave). +/// - `Black` y `White` son colores explícitos. +/// - `Transparent` no aplica color de fondo (`bg-transparent`). +#[derive(AutoDefault)] +pub enum BgColor { + #[default] + Default, + Body, + BodySecondary, + BodyTertiary, + Theme(Color), + Subtle(Color), + Black, + White, + Transparent, +} + +#[rustfmt::skip] +impl fmt::Display for BgColor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Body => f.write_str("bg-body"), + Self::BodySecondary => f.write_str("bg-body-secondary"), + Self::BodyTertiary => f.write_str("bg-body-tertiary"), + Self::Theme(c) => write!(f, "bg-{c}"), + Self::Subtle(c) => write!(f, "bg-{c}-subtle"), + Self::Black => f.write_str("bg-black"), + Self::White => f.write_str("bg-white"), + Self::Transparent => f.write_str("bg-transparent"), + } + } +} + +// **< BorderColor >******************************************************************************** + +/// Colores (`border-*`) para los bordes ([`Border`](crate::theme::aux::Border)). +/// +/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). +/// - `Theme(Color)` genera `border-{color}`. +/// - `Subtle(Color)` genera `border-{color}-subtle` (versión suavizada). +/// - `Black` y `White` son colores explícitos. +#[derive(AutoDefault)] +pub enum BorderColor { + #[default] + Default, + Theme(Color), + Subtle(Color), + Black, + White, +} + +#[rustfmt::skip] +impl fmt::Display for BorderColor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Theme(c) => write!(f, "border-{c}"), + Self::Subtle(c) => write!(f, "border-{c}-subtle"), + Self::Black => f.write_str("border-black"), + Self::White => f.write_str("border-white"), + } + } +} + +// **< TextColor >********************************************************************************** + +/// Colores de texto y fondos de texto (`text-*`). +/// +/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). +/// - `Body*` aplica colores predefinidos del tema (`text-body`, `text-body-emphasis`, +/// `text-body-secondary`, `text-body-tertiary`). +/// - `Theme(Color)` genera `text-{color}`. +/// - `Emphasis(Color)` genera `text-{color}-emphasis` (contraste mayor acorde al tema). +/// - `Background(Color)` genera `text-bg-{color}` (para color de fondo del texto). +/// - `Black` y `White` son colores explícitos. +#[derive(AutoDefault)] +pub enum TextColor { + #[default] + Default, + Body, + BodyEmphasis, + BodySecondary, + BodyTertiary, + Theme(Color), + Emphasis(Color), + Background(Color), + Black, + White, +} + +#[rustfmt::skip] +impl fmt::Display for TextColor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Body => f.write_str("text-body"), + Self::BodyEmphasis => f.write_str("text-body-emphasis"), + Self::BodySecondary => f.write_str("text-body-secondary"), + Self::BodyTertiary => f.write_str("text-body-tertiary"), + Self::Theme(c) => write!(f, "text-{c}"), + Self::Emphasis(c) => write!(f, "text-{c}-emphasis"), + Self::Background(c) => write!(f, "text-bg-{c}"), + Self::Black => f.write_str("text-black"), + Self::White => f.write_str("text-white"), + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/aux/opacity.rs b/extensions/pagetop-bootsier/src/theme/aux/opacity.rs new file mode 100644 index 00000000..96724d91 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/opacity.rs @@ -0,0 +1,109 @@ +use pagetop::prelude::*; + +use std::fmt; + +// **< Opacity >************************************************************************************ + +/// Niveles de **opacidad** (`opacity-*`). +/// +/// Se usa para modular la transparencia del color de fondo `bg-opacity-*` ([`BgOpacity`]), borde +/// `border-opacity-*` ([`BorderOpacity`]) o texto `text-opacity-*` ([`TextOpacity`]), según las +/// siguientes equivalencias: +/// +/// - `Opaque` => `opacity-100` (100% de opacidad). +/// - `SemiOpaque` => `opacity-75` (75%). +/// - `Half` => `opacity-50` (50%). +/// - `SemiTransparent` => `opacity-25` (25%). +/// - `AlmostTransparent` => `opacity-10` (10%). +/// - `Transparent` => `opacity-0` (0%, totalmente transparente). +#[rustfmt::skip] +#[derive(AutoDefault)] +pub enum Opacity { + #[default] + Opaque, // 100% + SemiOpaque, // 75% + Half, // 50% + SemiTransparent, // 25% + AlmostTransparent, // 10% + Transparent, // 0% +} + +#[rustfmt::skip] +impl fmt::Display for Opacity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Opaque => f.write_str("opacity-100"), + Self::SemiOpaque => f.write_str("opacity-75"), + Self::Half => f.write_str("opacity-50"), + Self::SemiTransparent => f.write_str("opacity-25"), + Self::AlmostTransparent => f.write_str("opacity-10"), + Self::Transparent => f.write_str("opacity-0"), + } + } +} + +// **< BgOpacity >********************************************************************************** + +/// Opacidad para el fondo (`bg-opacity-*`). +/// +/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). +/// - `Theme(Opacity)` genera `bg-{opacity}` (p. ej., `bg-opacity-50`). +#[derive(AutoDefault)] +pub enum BgOpacity { + #[default] + Default, + Theme(Opacity), +} + +impl fmt::Display for BgOpacity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Theme(o) => write!(f, "bg-{o}"), + } + } +} + +// **< BorderOpacity >****************************************************************************** + +/// Opacidad (`border-opacity-*`) para los bordes ([`Border`](crate::theme::aux::Border)). +/// +/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). +/// - `Theme(Opacity)` genera `border-{opacity}` (p. ej., `border-opacity-25`). +#[derive(AutoDefault)] +pub enum BorderOpacity { + #[default] + Default, + Theme(Opacity), +} + +impl fmt::Display for BorderOpacity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Theme(o) => write!(f, "border-{o}"), + } + } +} + +// **< TextOpacity >******************************************************************************** + +/// Opacidad para el texto (`text-opacity-*`). +/// +/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). +/// - `Theme(Opacity)` genera `text-{opacity}` (p. ej., `text-opacity-100`). +#[derive(AutoDefault)] +pub enum TextOpacity { + #[default] + Default, + Theme(Opacity), +} + +impl fmt::Display for TextOpacity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Theme(o) => write!(f, "text-{o}"), + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/aux/rounded.rs b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs new file mode 100644 index 00000000..f7f6e3fe --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs @@ -0,0 +1,214 @@ +use pagetop::prelude::*; + +use std::fmt; + +// **< RoundedRadius >****************************************************************************** + +/// Radio (**redondeo**) para las esquinas ([`Rounded`]). +/// +/// Mapea a `rounded`, `rounded-0`, `rounded-{1..5}`, `rounded-circle` y `rounded-pill`. +/// +/// - `None` no añade clase (devuelve `""`). +/// - `Default` genera `rounded` (radio por defecto del tema). +/// - `Zero` genera `rounded-0` (sin redondeo). +/// - `Scale{1..5}` genera `rounded-{1..5}` (radio creciente). +/// - `Circle` genera `rounded-circle`. +/// - `Pill` genera `rounded-pill`. +#[derive(AutoDefault)] +pub enum RoundedRadius { + #[default] + None, + Default, + Zero, + Scale1, + Scale2, + Scale3, + Scale4, + Scale5, + Circle, + Pill, +} + +impl RoundedRadius { + #[rustfmt::skip] + fn to_class(&self, base: impl AsRef<str>) -> String { + match self { + RoundedRadius::None => String::new(), + RoundedRadius::Default => String::from(base.as_ref()), + RoundedRadius::Zero => join!(base, "-0"), + RoundedRadius::Scale1 => join!(base, "-1"), + RoundedRadius::Scale2 => join!(base, "-2"), + RoundedRadius::Scale3 => join!(base, "-3"), + RoundedRadius::Scale4 => join!(base, "-4"), + RoundedRadius::Scale5 => join!(base, "-5"), + RoundedRadius::Circle => join!(base, "-circle"), + RoundedRadius::Pill => join!(base, "-pill"), + } + } +} + +impl fmt::Display for RoundedRadius { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.to_class("rounded")) + } +} + +// **< Rounded >************************************************************************************ + +/// Agrupa propiedades para crear **esquinas redondeadas**. +/// +/// Permite: +/// +/// - Definir un radio **global para todas las esquinas** (`radius`). +/// - Ajustar el radio asociado a las **esquinas de cada lado lógico** (`top`, `end`, `bottom`, +/// `start`, **en este orden**, respetando LTR/RTL). +/// - Ajustar el radio de las **esquinas concretas** (`top-start`, `top-end`, `bottom-start`, +/// `bottom-end`, **en este orden**, respetando LTR/RTL). +/// +/// # Ejemplos +/// +/// **Radio global:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = Rounded::with(RoundedRadius::Default); +/// assert_eq!(r.to_string(), "rounded"); +/// ``` +/// +/// **Sin redondeo:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = Rounded::new(); +/// assert_eq!(r.to_string(), ""); +/// ``` +/// +/// **Radio en las esquinas de un lado lógico:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = Rounded::new().with_end(RoundedRadius::Scale2); +/// assert_eq!(r.to_string(), "rounded-end-2"); +/// ``` +/// +/// **Radio en una esquina concreta:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = Rounded::new().with_top_start(RoundedRadius::Scale3); +/// assert_eq!(r.to_string(), "rounded-top-start-3"); +/// ``` +/// +/// **Combinado (ejemplo completo):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = Rounded::new() +/// .with_top(RoundedRadius::Default) // Añade redondeo arriba. +/// .with_bottom_start(RoundedRadius::Scale4) // Añade una esquina redondeada concreta. +/// .with_bottom_end(RoundedRadius::Circle); // Añade redondeo extremo en otra esquina. +/// +/// assert_eq!(r.to_string(), "rounded-top rounded-bottom-start-4 rounded-bottom-end-circle"); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Rounded { + radius : RoundedRadius, + top : RoundedRadius, + end : RoundedRadius, + bottom : RoundedRadius, + start : RoundedRadius, + top_start : RoundedRadius, + top_end : RoundedRadius, + bottom_start: RoundedRadius, + bottom_end : RoundedRadius, +} + +impl Rounded { + /// Prepara las esquinas **sin redondeo global** de partida. + pub fn new() -> Self { + Self::default() + } + + /// Crea las esquinas **con redondeo global** (`radius`). + pub fn with(radius: RoundedRadius) -> Self { + Self::default().with_radius(radius) + } + + // **< Rounded BUILDER >************************************************************************ + + /// Establece el radio global de las esquinas (`rounded*`). + pub fn with_radius(mut self, radius: RoundedRadius) -> Self { + self.radius = radius; + self + } + + /// Establece el radio en las esquinas del lado superior (`rounded-top-*`). + pub fn with_top(mut self, radius: RoundedRadius) -> Self { + self.top = radius; + self + } + + /// Establece el radio en las esquinas del lado lógico final (`rounded-end-*`). Respeta LTR/RTL. + pub fn with_end(mut self, radius: RoundedRadius) -> Self { + self.end = radius; + self + } + + /// Establece el radio en las esquinas del lado inferior (`rounded-bottom-*`). + pub fn with_bottom(mut self, radius: RoundedRadius) -> Self { + self.bottom = radius; + self + } + + /// Establece el radio en las esquinas del lado lógico inicial (`rounded-start-*`). Respeta + /// LTR/RTL. + pub fn with_start(mut self, radius: RoundedRadius) -> Self { + self.start = radius; + self + } + + /// Establece el radio en la esquina superior-inicial (`rounded-top-start-*`). Respeta LTR/RTL. + pub fn with_top_start(mut self, radius: RoundedRadius) -> Self { + self.top_start = radius; + self + } + + /// Establece el radio en la esquina superior-final (`rounded-top-end-*`). Respeta LTR/RTL. + pub fn with_top_end(mut self, radius: RoundedRadius) -> Self { + self.top_end = radius; + self + } + + /// Establece el radio en la esquina inferior-inicial (`rounded-bottom-start-*`). Respeta + /// LTR/RTL. + pub fn with_bottom_start(mut self, radius: RoundedRadius) -> Self { + self.bottom_start = radius; + self + } + + /// Establece el radio en la esquina inferior-final (`rounded-bottom-end-*`). Respeta LTR/RTL. + pub fn with_bottom_end(mut self, radius: RoundedRadius) -> Self { + self.bottom_end = radius; + self + } +} + +impl fmt::Display for Rounded { + /// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start`, + /// `top-start`, `top-end`, `bottom-start` y `bottom-end`; respetando LTR/RTL y omitiendo las + /// definiciones vacías. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + join_opt!([ + self.radius.to_string(), + self.top.to_class("rounded-top"), + self.end.to_class("rounded-end"), + self.bottom.to_class("rounded-bottom"), + self.start.to_class("rounded-start"), + self.top_start.to_class("rounded-top-start"), + self.top_end.to_class("rounded-top-end"), + self.bottom_start.to_class("rounded-bottom-start"), + self.bottom_end.to_class("rounded-bottom-end"), + ]; " ") + .unwrap_or_default() + ) + } +} diff --git a/extensions/pagetop-bootsier/src/theme/container.rs b/extensions/pagetop-bootsier/src/theme/container.rs new file mode 100644 index 00000000..65ce9230 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/container.rs @@ -0,0 +1,269 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +/// Tipo de contenedor ([`Container`]). +/// +/// Permite aplicar la etiqueta HTML apropiada (`<main>`, `<header>`, etc.) manteniendo una API +/// común a todos los contenedores. +#[rustfmt::skip] +#[derive(AutoDefault)] +pub enum ContainerType { + /// Contenedor genérico (`<div>`). + #[default] + Default, + /// Contenido principal de la página (`<main>`). + Main, + /// Encabezado de la página o de sección (`<header>`). + Header, + /// Pie de la página o de sección (`<footer>`). + Footer, + /// Sección de contenido (`<section>`). + Section, + /// Artículo de contenido (`<article>`). + Article, +} + +/// Componente genérico para crear un contenedor de componentes. +/// +/// Envuelve el contenido con la etiqueta HTML indicada por [`ContainerType`]. Sólo se renderiza si +/// existen componentes hijos (*children*). +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Container { + id : AttrId, + classes : AttrClasses, + container_type: ContainerType, + breakpoint : BreakPoint, + children : Children, + bg_color : BgColor, + text_color : TextColor, + border : Border, + rounded : Rounded, +} + +impl Component for Container { + fn new() -> Self { + Container::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [ + join_pair!("container", "-", self.breakpoint().to_string()), + self.bg_color().to_string(), + self.text_color().to_string(), + self.border().to_string(), + self.rounded().to_string(), + ] + .join(" "), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let output = self.children().render(cx); + if output.is_empty() { + return PrepareMarkup::None; + } + let style = match self.breakpoint() { + BreakPoint::FluidMax(w) if w.is_measurable() => { + Some(join!("max-width: ", w.to_string(), ";")) + } + _ => None, + }; + match self.container_type() { + ContainerType::Default => PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + ContainerType::Main => PrepareMarkup::With(html! { + main id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + ContainerType::Header => PrepareMarkup::With(html! { + header id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + ContainerType::Footer => PrepareMarkup::With(html! { + footer id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + ContainerType::Section => PrepareMarkup::With(html! { + section id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + ContainerType::Article => PrepareMarkup::With(html! { + article id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + } + } +} + +impl Container { + /// Crea un contenedor de tipo `Main` (`<main>`). + pub fn main() -> Self { + Container { + container_type: ContainerType::Main, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Header` (`<header>`). + pub fn header() -> Self { + Container { + container_type: ContainerType::Header, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Footer` (`<footer>`). + pub fn footer() -> Self { + Container { + container_type: ContainerType::Footer, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Section` (`<section>`). + pub fn section() -> Self { + Container { + container_type: ContainerType::Section, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Article` (`<article>`). + pub fn article() -> Self { + Container { + container_type: ContainerType::Article, + ..Default::default() + } + } + + // **< Container BUILDER >********************************************************************** + + /// Establece el identificador único (`id`) del contenedor. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al contenedor. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Establece el *punto de ruptura* del contenedor. + #[builder_fn] + pub fn with_breakpoint(mut self, bp: BreakPoint) -> Self { + self.breakpoint = bp; + self + } + + /// Añade un nuevo componente hijo al contenedor. + pub fn add_child(mut self, component: impl Component) -> Self { + self.children + .alter_child(ChildOp::Add(Child::with(component))); + self + } + + /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. + #[builder_fn] + pub fn with_child(mut self, op: ChildOp) -> Self { + self.children.alter_child(op); + self + } + + /// Establece el color de fondo ([`BgColor`]). + #[builder_fn] + pub fn with_bg_color(mut self, color: BgColor) -> Self { + self.bg_color = color; + self + } + + /// Establece el color del texto ([`TextColor`]). + #[builder_fn] + pub fn with_text_color(mut self, color: TextColor) -> Self { + self.text_color = color; + self + } + + /// Atajo para definir los colores de fondo y texto a la vez. + #[builder_fn] + pub fn with_colors(mut self, bg_color: BgColor, text_color: TextColor) -> Self { + self.bg_color = bg_color; + self.text_color = text_color; + self + } + + /// Establece el borde del contenedor ([`Border`]). + #[builder_fn] + pub fn with_border(mut self, border: Border) -> Self { + self.border = border; + self + } + + /// Establece esquinas redondeadas para el contenedor. + #[builder_fn] + pub fn with_rounded(mut self, rounded: Rounded) -> Self { + self.rounded = rounded; + self + } + + // **< Container GETTERS >********************************************************************** + + /// Devuelve las clases CSS asociadas al contenedor. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el tipo semántico del contenedor. + pub fn container_type(&self) -> &ContainerType { + &self.container_type + } + + /// Devuelve el *punto de ruptura* actualmente configurado. + pub fn breakpoint(&self) -> &BreakPoint { + &self.breakpoint + } + + /// Devuelve la lista de hijos (`children`) del contenedor. + pub fn children(&self) -> &Children { + &self.children + } + + /// Devuelve el color de fondo del contenedor. + pub fn bg_color(&self) -> &BgColor { + &self.bg_color + } + + /// Devuelve el color del texto del contenedor. + pub fn text_color(&self) -> &TextColor { + &self.text_color + } + + /// Devuelve el borde del contenedor. + pub fn border(&self) -> &Border { + &self.border + } + + /// Devuelve las esquinas redondeadas del contenedor. + pub fn rounded(&self) -> &Rounded { + &self.rounded + } +} diff --git a/extensions/pagetop-bootsier/src/theme/dropdown.rs b/extensions/pagetop-bootsier/src/theme/dropdown.rs new file mode 100644 index 00000000..a04f8dd6 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/dropdown.rs @@ -0,0 +1,5 @@ +mod component; +pub use component::Dropdown; + +mod item; +pub use item::Item; diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs new file mode 100644 index 00000000..2e0ea700 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -0,0 +1,99 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Dropdown { + id : AttrId, + classes: AttrClasses, + items : Children, +} + +impl Component for Dropdown { + fn new() -> Self { + Dropdown::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes(ClassesOp::Prepend, "dropdown"); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let items = self.items().render(cx); + if items.is_empty() { + return PrepareMarkup::None; + } + + PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] { + button + type="button" + class="btn btn-secondary dropdown-toggle" + data-bs-toggle="dropdown" + aria-expanded="false" + { + ("Dropdown button") + } + ul class="dropdown-menu" { + li { + a class="dropdown-item" href="#" { + ("Action") + } + } + li { + a class="dropdown-item" href="#" { + ("Another action") + } + } + li { + a class="dropdown-item" href="#" { + ("Something else here") + } + } + } + } + }) + } +} + +impl Dropdown { + // **< Dropdown BUILDER >*********************************************************************** + + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + pub fn add_item(mut self, item: dropdown::Item) -> Self { + self.items.add(Child::with(item)); + self + } + + #[builder_fn] + pub fn with_items(mut self, op: TypedOp<dropdown::Item>) -> Self { + self.items.alter_typed(op); + self + } + + // **< Dropdown GETTERS >*********************************************************************** + + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + pub fn items(&self) -> &Children { + &self.items + } +} diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs new file mode 100644 index 00000000..1edd64b1 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs @@ -0,0 +1,109 @@ +use pagetop::prelude::*; + +// **< ItemType >*********************************************************************************** + +#[derive(AutoDefault)] +pub enum ItemType { + #[default] + Void, + Label(L10n), + Link(L10n, FnPathByContext), + LinkBlank(L10n, FnPathByContext), +} + +// **< Item >*************************************************************************************** + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Item { + item_type: ItemType, +} + +impl Component for Item { + fn new() -> Self { + Item::default() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let description: Option<String> = None; + + // Obtiene la URL actual desde `cx.request`. + let current_path = cx.request().map(|request| request.path()); + + match self.item_type() { + ItemType::Void => PrepareMarkup::None, + ItemType::Label(label) => PrepareMarkup::With(html! { + li class="dropdown-item" { + span title=[description] { + //(left_icon) + (label.using(cx)) + //(right_icon) + } + } + }), + ItemType::Link(label, path) => { + let item_path = path(cx); + let (class, aria) = if current_path == Some(item_path) { + ("dropdown-item active", Some("page")) + } else { + ("dropdown-item", None) + }; + PrepareMarkup::With(html! { + li class=(class) aria-current=[aria] { + a class="nav-link" href=(item_path) title=[description] { + //(left_icon) + (label.using(cx)) + //(right_icon) + } + } + }) + } + ItemType::LinkBlank(label, path) => { + let item_path = path(cx); + let (class, aria) = if current_path == Some(item_path) { + ("dropdown-item active", Some("page")) + } else { + ("dropdown-item", None) + }; + PrepareMarkup::With(html! { + li class=(class) aria-current=[aria] { + a class="nav-link" href=(item_path) title=[description] target="_blank" { + //(left_icon) + (label.using(cx)) + //(right_icon) + } + } + }) + } + } + } +} + +impl Item { + pub fn label(label: L10n) -> Self { + Item { + item_type: ItemType::Label(label), + ..Default::default() + } + } + + pub fn link(label: L10n, path: FnPathByContext) -> Self { + Item { + item_type: ItemType::Link(label, path), + ..Default::default() + } + } + + pub fn link_blank(label: L10n, path: FnPathByContext) -> Self { + Item { + item_type: ItemType::LinkBlank(label, path), + ..Default::default() + } + } + + // Item GETTERS. + + pub fn item_type(&self) -> &ItemType { + &self.item_type + } +} diff --git a/extensions/pagetop-bootsier/src/theme/image.rs b/extensions/pagetop-bootsier/src/theme/image.rs new file mode 100644 index 00000000..6c602780 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/image.rs @@ -0,0 +1,186 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +#[derive(AutoDefault)] +pub enum ImageSource { + #[default] + //Logo(PageTopLogo), + Responsive(String), + Thumbnail(String), + Static(String), +} + +#[derive(AutoDefault)] +pub enum ImageSize { + #[default] + Auto, + Dimensions(UnitValue, UnitValue), + Width(UnitValue), + Height(UnitValue), + Both(UnitValue), +} + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Image { + id : AttrId, + classes: AttrClasses, + source : ImageSource, + alt : AttrL10n, + size : ImageSize, + border : Border, + rounded: Rounded, +} + +impl Component for Image { + fn new() -> Self { + Image::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [ + String::from(match self.source() { + //ImageSource::Logo(_) => "img-fluid", + ImageSource::Responsive(_) => "img-fluid", + ImageSource::Thumbnail(_) => "img-thumbnail", + _ => "", + }), + self.border().to_string(), + self.rounded().to_string(), + ] + .join(" "), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let dimensions = match self.size() { + ImageSize::Auto => None, + ImageSize::Dimensions(w, h) => { + let w = w.to_string(); + let h = h.to_string(); + Some(join!("width: ", w, "; height: ", h, ";")) + } + ImageSize::Width(w) => { + let w = w.to_string(); + Some(join!("width: ", w, ";")) + } + ImageSize::Height(h) => { + let h = h.to_string(); + Some(join!("height: ", h, ";")) + } + ImageSize::Both(v) => { + let v = v.to_string(); + Some(join!("width: ", v, "; height: ", v, ";")) + } + }; + let source = match self.source() { + /* + ImageSource::Logo(logo) => { + return PrepareMarkup::With(html! { + span + id=[self.id()] + class=[self.classes().get()] + style=[dimensions] + { + (logo.render(cx)) + } + }) + } + */ + ImageSource::Responsive(source) => Some(source), + ImageSource::Thumbnail(source) => Some(source), + ImageSource::Static(source) => Some(source), + }; + PrepareMarkup::With(html! { + img + src=[source] + alt=[self.alternative().lookup(cx)] + id=[self.id()] + class=[self.classes().get()] + style=[dimensions] {} + }) + } +} + +impl Image { + pub fn with(source: ImageSource) -> Self { + Image::default().with_source(source) + } + + // **< Image BUILDER >************************************************************************** + + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + #[builder_fn] + pub fn with_source(mut self, source: ImageSource) -> Self { + self.source = source; + self + } + + #[builder_fn] + pub fn with_alternative(mut self, alt: L10n) -> Self { + self.alt.alter_value(alt); + self + } + + #[builder_fn] + pub fn with_size(mut self, size: ImageSize) -> Self { + self.size = size; + self + } + + #[builder_fn] + pub fn with_border(mut self, border: Border) -> Self { + self.border = border; + self + } + + #[builder_fn] + pub fn with_rounded(mut self, rounded: Rounded) -> Self { + self.rounded = rounded; + self + } + + // **< Image GETTERS >************************************************************************** + + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + pub fn source(&self) -> &ImageSource { + &self.source + } + + pub fn alternative(&self) -> &AttrL10n { + &self.alt + } + + pub fn size(&self) -> &ImageSize { + &self.size + } + + pub fn border(&self) -> &Border { + &self.border + } + + pub fn rounded(&self) -> &Rounded { + &self.rounded + } +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar.rs b/extensions/pagetop-bootsier/src/theme/navbar.rs new file mode 100644 index 00000000..3745b116 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar.rs @@ -0,0 +1,17 @@ +mod component; +pub use component::{Navbar, NavbarToggler, NavbarType}; + +mod button_toggler; +pub use button_toggler::ButtonToggler; + +mod content; +pub use content::{Content, ContentType}; + +mod brand; +pub use brand::Brand; + +mod nav; +pub use nav::Nav; + +mod item; +pub use item::{Item, ItemType}; diff --git a/extensions/pagetop-bootsier/src/theme/navbar/brand.rs b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs new file mode 100644 index 00000000..cfeb45aa --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs @@ -0,0 +1,104 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Brand { + id : AttrId, + #[default(_code = "global::SETTINGS.app.name.to_owned()")] + app_name : String, + slogan : AttrL10n, + logo : Typed<Image>, + #[default(_code = "|_| \"/\"")] + home : FnPathByContext, +} + +impl Component for Brand { + fn new() -> Self { + Brand::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let logo = self.logo().render(cx); + let home = self.home()(cx); + let title = &L10n::l("site_home").lookup(cx); + PrepareMarkup::With(html! { + div id=[self.id()] class="branding__container" { + div class="branding__content" { + @if !logo.is_empty() { + a class="branding__logo" href=(home) title=[title] rel="home" { + (logo) + } + } + div class="branding__text" { + a class="branding__name" href=(home) title=[title] rel="home" { + (self.app_name()) + } + @if let Some(slogan) = self.slogan().lookup(cx) { + div class="branding__slogan" { + (slogan) + } + } + } + } + } + }) + } +} + +impl Brand { + // Brand BUILDER. + + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + #[builder_fn] + pub fn with_app_name(mut self, app_name: impl Into<String>) -> Self { + self.app_name = app_name.into(); + self + } + + #[builder_fn] + pub fn with_slogan(mut self, slogan: L10n) -> Self { + self.slogan.alter_value(slogan); + self + } + + #[builder_fn] + pub fn with_logo(mut self, logo: Option<Image>) -> Self { + self.logo.alter_component(logo); + self + } + + #[builder_fn] + pub fn with_home(mut self, home: FnPathByContext) -> Self { + self.home = home; + self + } + + // Brand GETTERS. + + pub fn app_name(&self) -> &String { + &self.app_name + } + + pub fn slogan(&self) -> &AttrL10n { + &self.slogan + } + + pub fn logo(&self) -> &Typed<Image> { + &self.logo + } + + pub fn home(&self) -> &FnPathByContext { + &self.home + } +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs b/extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs new file mode 100644 index 00000000..036182a7 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs @@ -0,0 +1,73 @@ +use pagetop::prelude::*; + +use crate::LOCALES_BOOTSIER; + +use std::fmt; + +#[derive(AutoDefault, PartialEq)] +pub(crate) enum Toggle { + #[default] + Collapse, + Offcanvas, +} + +#[rustfmt::skip] +impl fmt::Display for Toggle { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Toggle::Collapse => write!(f, "collapse"), + Toggle::Offcanvas => write!(f, "offcanvas"), + } + } +} + +#[derive(AutoDefault)] +pub struct ButtonToggler; + +impl Component for ButtonToggler { + fn new() -> Self { + ButtonToggler::default() + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + PrepareMarkup::With(html! { + button + type="button" + class="navbar-toggler" + { + span class="navbar-toggler-icon" {} + } + }) + } +} + +impl ButtonToggler { + // ButtonToggler PRIVATE RENDER. + + pub(crate) fn render( + &self, + cx: &mut Context, + id_content: String, + data_bs_toggle: Toggle, + ) -> Markup { + let id_content_target = join!("#", id_content); + let aria_expanded = if data_bs_toggle == Toggle::Collapse { + Some("false") + } else { + None + }; + html! { + button + type="button" + class="navbar-toggler" + data-bs-toggle=(data_bs_toggle) + data-bs-target=(id_content_target) + aria-controls=(id_content) + aria-expanded=[aria_expanded] + aria-label=[L10n::t("toggle", &LOCALES_BOOTSIER).lookup(cx)] + { + span class="navbar-toggler-icon" {} + } + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs new file mode 100644 index 00000000..4a203c3f --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs @@ -0,0 +1,233 @@ +use pagetop::prelude::*; + +use crate::prelude::*; +use crate::LOCALES_BOOTSIER; + +const TOGGLE_COLLAPSE: &str = "collapse"; +const TOGGLE_OFFCANVAS: &str = "offcanvas"; + +#[derive(AutoDefault)] +pub enum NavbarToggler { + #[default] + Enabled, + Disabled, +} + +#[derive(AutoDefault)] +pub enum NavbarType { + #[default] + None, + Nav(Typed<navbar::Nav>), + Offcanvas(Typed<Offcanvas>), + Text(L10n), +} + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Navbar { + id : AttrId, + classes : AttrClasses, + expand : BreakPoint, + toggler : NavbarToggler, + navbar_type: NavbarType, + contents : Children, + brand : Typed<navbar::Brand>, +} + +impl Component for Navbar { + fn new() -> Self { + Navbar::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [ + "navbar".to_string(), + self.expand().try_class("navbar-expand").unwrap_or_default(), + ] + .join(" "), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let id = cx.required_id::<Self>(self.id()); + + let navbar_type = match self.navbar_type() { + NavbarType::None => return PrepareMarkup::None, + NavbarType::Nav(nav) => { + let id_content = join!(id, "-content"); + match self.toggler() { + NavbarToggler::Enabled => self.toggler_wrapper( + TOGGLE_COLLAPSE, + L10n::t("toggle", &LOCALES_BOOTSIER).lookup(cx), + id_content, + self.brand().render(cx), + nav.render(cx), + ), + NavbarToggler::Disabled => nav.render(cx), + } + } + NavbarType::Offcanvas(oc) => { + let id_content = oc.id().unwrap_or_default(); + self.toggler_wrapper( + TOGGLE_OFFCANVAS, + L10n::t("toggle", &LOCALES_BOOTSIER).lookup(cx), + id_content, + self.brand().render(cx), + oc.render(cx), + ) + } + NavbarType::Text(text) => html! { + span class="navbar-text" { + (text.using(cx)) + } + }, + }; + + self.nav_wrapper(id, self.brand().render(cx), navbar_type) + } +} + +impl Navbar { + pub fn with_nav(nav: navbar::Nav) -> Self { + Navbar::default().with_navbar_type(NavbarType::Nav(Typed::with(nav))) + } + + pub fn with_offcanvas(offcanvas: Offcanvas) -> Self { + Navbar::default().with_navbar_type(NavbarType::Offcanvas(Typed::with(offcanvas))) + } + + // Navbar BUILDER. + + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + #[builder_fn] + pub fn with_expand(mut self, bp: BreakPoint) -> Self { + self.expand = bp; + self + } + + #[builder_fn] + pub fn with_toggler(mut self, toggler: NavbarToggler) -> Self { + self.toggler = toggler; + self + } + + #[builder_fn] + pub fn with_navbar_type(mut self, navbar_type: NavbarType) -> Self { + self.navbar_type = navbar_type; + self + } + + pub fn with_content(mut self, content: navbar::Content) -> Self { + self.contents.add(Child::with(content)); + self + } + + #[builder_fn] + pub fn with_contents(mut self, op: TypedOp<navbar::Content>) -> Self { + self.contents.alter_typed(op); + self + } + + #[builder_fn] + pub fn with_brand(mut self, brand: Option<navbar::Brand>) -> Self { + self.brand.alter_component(brand); + self + } + + // Navbar GETTERS. + + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + pub fn expand(&self) -> &BreakPoint { + &self.expand + } + + pub fn toggler(&self) -> &NavbarToggler { + &self.toggler + } + + pub fn navbar_type(&self) -> &NavbarType { + &self.navbar_type + } + + pub fn contents(&self) -> &Children { + &self.contents + } + + pub fn brand(&self) -> &Typed<navbar::Brand> { + &self.brand + } + + // Navbar HELPERS. + + fn nav_wrapper(&self, id: String, brand: Markup, content: Markup) -> PrepareMarkup { + if content.is_empty() { + PrepareMarkup::None + } else { + PrepareMarkup::With(html! { + (brand) + nav id=(id) class=[self.classes().get()] { + div class="container-fluid" { + (content) + } + } + }) + } + } + + fn toggler_wrapper( + &self, + data_bs_toggle: &str, + aria_label: Option<String>, + id_content: String, + brand: Markup, + content: Markup, + ) -> Markup { + if content.is_empty() { + html! {} + } else { + let id_content_target = join!("#", id_content); + let aria_expanded = if data_bs_toggle == TOGGLE_COLLAPSE { + Some("false") + } else { + None + }; + html! { + (brand) + button + type="button" + class="navbar-toggler" + data-bs-toggle=(data_bs_toggle) + data-bs-target=(id_content_target) + aria-controls=(id_content) + aria-expanded=[aria_expanded] + aria-label=[aria_label] + { + span class="navbar-toggler-icon" {} + } + div id=(id_content) class="collapse navbar-collapse" { + (content) + } + } + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/content.rs b/extensions/pagetop-bootsier/src/theme/navbar/content.rs new file mode 100644 index 00000000..2efb4a05 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/content.rs @@ -0,0 +1,69 @@ +use pagetop::prelude::*; + +use crate::theme::navbar; + +#[derive(AutoDefault)] +pub enum ContentType { + #[default] + None, + Brand(Typed<navbar::Brand>), + Nav(Typed<navbar::Nav>), + Text(L10n), +} + +// Item. + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Content { + content: ContentType, +} + +impl Component for Content { + fn new() -> Self { + Content::default() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + match self.content() { + ContentType::None => PrepareMarkup::None, + ContentType::Brand(brand) => PrepareMarkup::With(html! { + (brand.render(cx)) + }), + ContentType::Nav(nav) => PrepareMarkup::With(html! { + (nav.render(cx)) + }), + ContentType::Text(text) => PrepareMarkup::With(html! { + span class="navbar-text" { + (text.using(cx)) + } + }), + } + } +} + +impl Content { + pub fn brand(content: navbar::Brand) -> Self { + Content { + content: ContentType::Brand(Typed::with(content)), + } + } + + pub fn nav(content: navbar::Nav) -> Self { + Content { + content: ContentType::Nav(Typed::with(content)), + } + } + + pub fn text(content: L10n) -> Self { + Content { + content: ContentType::Text(content), + } + } + + // Content GETTERS. + + pub fn content(&self) -> &ContentType { + &self.content + } +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/item.rs b/extensions/pagetop-bootsier/src/theme/navbar/item.rs new file mode 100644 index 00000000..08a2aeee --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/item.rs @@ -0,0 +1,113 @@ +use pagetop::prelude::*; + +use crate::theme::Dropdown; + +type Label = L10n; + +#[derive(AutoDefault)] +pub enum ItemType { + #[default] + Void, + Label(Label), + Link(Label, FnPathByContext), + LinkBlank(Label, FnPathByContext), + Dropdown(Typed<Dropdown>), +} + +// Item. + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Item { + item_type: ItemType, +} + +impl Component for Item { + fn new() -> Self { + Item::default() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let description: Option<String> = None; + + // Obtiene la URL actual desde `cx.request`. + let current_path = cx.request().map(|request| request.path()); + + match self.item_type() { + ItemType::Void => PrepareMarkup::None, + ItemType::Label(label) => PrepareMarkup::With(html! { + li class="nav-item" { + span title=[description] { + //(left_icon) + (label.using(cx)) + //(right_icon) + } + } + }), + ItemType::Link(label, path) => { + let item_path = path(cx); + let (class, aria) = if current_path == Some(item_path) { + ("nav-item active", Some("page")) + } else { + ("nav-item", None) + }; + PrepareMarkup::With(html! { + li class=(class) aria-current=[aria] { + a class="nav-link" href=(item_path) title=[description] { + //(left_icon) + (label.using(cx)) + //(right_icon) + } + } + }) + } + ItemType::LinkBlank(label, path) => { + let item_path = path(cx); + let (class, aria) = if current_path == Some(item_path) { + ("nav-item active", Some("page")) + } else { + ("nav-item", None) + }; + PrepareMarkup::With(html! { + li class=(class) aria-current=[aria] { + a class="nav-link" href=(item_path) title=[description] target="_blank" { + //(left_icon) + (label.using(cx)) + //(right_icon) + } + } + }) + } + ItemType::Dropdown(menu) => PrepareMarkup::With(html! { (menu.render(cx)) }), + } + } +} + +impl Item { + pub fn label(label: L10n) -> Self { + Item { + item_type: ItemType::Label(label), + ..Default::default() + } + } + + pub fn link(label: L10n, path: FnPathByContext) -> Self { + Item { + item_type: ItemType::Link(label, path), + ..Default::default() + } + } + + pub fn link_blank(label: L10n, path: FnPathByContext) -> Self { + Item { + item_type: ItemType::LinkBlank(label, path), + ..Default::default() + } + } + + // Item GETTERS. + + pub fn item_type(&self) -> &ItemType { + &self.item_type + } +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/nav.rs b/extensions/pagetop-bootsier/src/theme/navbar/nav.rs new file mode 100644 index 00000000..bc03a291 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/nav.rs @@ -0,0 +1,75 @@ +use pagetop::prelude::*; + +use crate::theme::navbar; + +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Nav { + id : AttrId, + classes: AttrClasses, + items : Children, +} + +impl Component for Nav { + fn new() -> Self { + Nav::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes(ClassesOp::Prepend, "navbar-nav"); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let items = self.items().render(cx); + if items.is_empty() { + return PrepareMarkup::None; + } + + PrepareMarkup::With(html! { + ul id=[self.id()] class=[self.classes().get()] { + (items) + } + }) + } +} + +impl Nav { + // Nav BUILDER. + + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + pub fn with_item(mut self, item: navbar::Item) -> Self { + self.items.add(Child::with(item)); + self + } + + #[builder_fn] + pub fn with_items(mut self, op: TypedOp<navbar::Item>) -> Self { + self.items.alter_typed(op); + self + } + + // Nav GETTERS. + + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + pub fn items(&self) -> &Children { + &self.items + } +} diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas.rs b/extensions/pagetop-bootsier/src/theme/offcanvas.rs new file mode 100644 index 00000000..b790522b --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/offcanvas.rs @@ -0,0 +1,302 @@ +use pagetop::prelude::*; + +use crate::prelude::*; +use crate::LOCALES_BOOTSIER; + +use std::fmt; + +// **< OffcanvasPlacement >************************************************************************* + +/// Posición de aparición del panel **deslizante** ([`Offcanvas`]). +/// +/// Define desde qué borde de la ventana entra y se ancla el panel. +#[derive(AutoDefault)] +pub enum OffcanvasPlacement { + /// Opción por defecto, desde el borde inicial según dirección de lectura (respetando LTR/RTL). + #[default] + Start, + /// Desde el borde final según dirección de lectura (respetando LTR/RTL). + End, + /// Desde la parte superior. + Top, + /// Desde la parte inferior. + Bottom, +} + +#[rustfmt::skip] +impl fmt::Display for OffcanvasPlacement { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + OffcanvasPlacement::Start => f.write_str("offcanvas-start"), + OffcanvasPlacement::End => f.write_str("offcanvas-end"), + OffcanvasPlacement::Top => f.write_str("offcanvas-top"), + OffcanvasPlacement::Bottom => f.write_str("offcanvas-bottom"), + } + } +} + +// **< OffcanvasVisibility >************************************************************************ + +/// Estado inicial del panel ([`Offcanvas`]). +#[derive(AutoDefault)] +pub enum OffcanvasVisibility { + /// El panel **permanece oculto** desde el principio. + #[default] + Default, + /// El panel **se muestra abierto** al cargar. + Show, +} + +impl fmt::Display for OffcanvasVisibility { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + OffcanvasVisibility::Default => Ok(()), + OffcanvasVisibility::Show => f.write_str("show"), + } + } +} + +// **< OffcanvasBodyScroll >************************************************************************ + +/// Controla si la página principal puede **desplazarse** al abrir el panel ([`Offcanvas`]). +#[derive(AutoDefault)] +pub enum OffcanvasBodyScroll { + /// Opción por defecto, la página principal se **bloquea** centrando la interacción en el panel. + #[default] + Disabled, + /// **Permite** el desplazamiento de la página principal. + Enabled, +} + +// **< OffcanvasBackdrop >************************************************************************** + +/// Comportamiento de la **capa de fondo** (*backdrop*) del panel ([`Offcanvas`]) al desplegarse. +#[derive(AutoDefault)] +pub enum OffcanvasBackdrop { + /// **Sin capa** de fondo; la página principal permanece visible e interactiva. + Disabled, + /// Opción por defecto, se **oscurece** el fondo; un clic fuera del panel suele cerrarlo. + #[default] + Enabled, + /// Se muestra capa de fondo pero **no** se cierra al pulsar fuera (útil cuando se requiere + /// completar una acción antes de salir). + Static, +} + +// **< Offcanvas >********************************************************************************** + +/// Panel lateral **deslizante** para contenido complementario. +/// +/// Útil para navegación, filtros, formularios o menús contextuales. Incluye las siguientes +/// características principales: +/// +/// - **Entrada configurable desde un borde** de la ventana. +/// - **Encabezado con título** y **botón de cierre** integrado. +/// - **Accesibilidad**: asocia título y controles a un identificador único y expone atributos +/// adecuados para lectores de pantalla y navegación por teclado. +/// - **Opcionalmente** bloquea el desplazamiento del documento y/o muestra una capa de fondo para +/// centrar la atención del usuario. +/// - **Responsive**: puede cambiar su comportamiento según el punto de ruptura indicado. +/// - **No se renderiza** si no tiene contenido. +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Offcanvas { + id : AttrId, + classes : AttrClasses, + title : L10n, + breakpoint: BreakPoint, + placement : OffcanvasPlacement, + visibility: OffcanvasVisibility, + scrolling : OffcanvasBodyScroll, + backdrop : OffcanvasBackdrop, + children : Children, +} + +impl Component for Offcanvas { + fn new() -> Self { + Offcanvas::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [ + self.breakpoint().to_class("offcanvas"), + self.placement().to_string(), + self.visibility().to_string(), + ] + .join(" "), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let body = self.children().render(cx); + if body.is_empty() { + return PrepareMarkup::None; + } + + let id = cx.required_id::<Self>(self.id()); + let id_label = join!(id, "-label"); + let id_target = join!("#", id); + + let body_scroll = match self.body_scroll() { + OffcanvasBodyScroll::Disabled => None, + OffcanvasBodyScroll::Enabled => Some("true"), + }; + + let backdrop = match self.backdrop() { + OffcanvasBackdrop::Disabled => Some("false"), + OffcanvasBackdrop::Enabled => None, + OffcanvasBackdrop::Static => Some("static"), + }; + + let title = self.title().using(cx); + + PrepareMarkup::With(html! { + div + id=(id) + class=[self.classes().get()] + tabindex="-1" + data-bs-scroll=[body_scroll] + data-bs-backdrop=[backdrop] + aria-labelledby=(id_label) + { + div class="offcanvas-header" { + @if !title.is_empty() { + h5 class="offcanvas-title" id=(id_label) { (title) } + } + button + type="button" + class="btn-close" + data-bs-dismiss="offcanvas" + data-bs-target=(id_target) + aria-label=[L10n::t("close", &LOCALES_BOOTSIER).lookup(cx)] + {} + } + div class="offcanvas-body" { + (body) + } + } + }) + } +} + +impl Offcanvas { + // **< Offcanvas BUILDER >********************************************************************** + + /// Establece el identificador único (`id`) del panel. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al panel. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Establece el **título** del encabezado. + #[builder_fn] + pub fn with_title(mut self, title: L10n) -> Self { + self.title = title; + self + } + + /// Configura el **punto de ruptura** para activar el comportamiento responsive del panel. + #[builder_fn] + pub fn with_breakpoint(mut self, bp: BreakPoint) -> Self { + self.breakpoint = bp; + self + } + + /// Indica la **posición** desde la que entra el panel. + #[builder_fn] + pub fn with_placement(mut self, placement: OffcanvasPlacement) -> Self { + self.placement = placement; + self + } + + /// Fija el **estado inicial** del panel (oculto o visible al cargar). + #[builder_fn] + pub fn with_visibility(mut self, visibility: OffcanvasVisibility) -> Self { + self.visibility = visibility; + self + } + + /// Permite o bloquea el **desplazamiento** de la página principal mientras el panel está + /// abierto. + #[builder_fn] + pub fn with_body_scroll(mut self, scrolling: OffcanvasBodyScroll) -> Self { + self.scrolling = scrolling; + self + } + + /// Ajusta la **capa de fondo** del panel para definir su comportamiento al interactuar fuera. + #[builder_fn] + pub fn with_backdrop(mut self, backdrop: OffcanvasBackdrop) -> Self { + self.backdrop = backdrop; + self + } + + /// Añade un nuevo componente hijo al panel. + pub fn add_child(mut self, child: impl Component) -> Self { + self.children.add(Child::with(child)); + self + } + + /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. + #[builder_fn] + pub fn with_children(mut self, op: ChildOp) -> Self { + self.children.alter_child(op); + self + } + + // **< Offcanvas GETTERS >********************************************************************** + + /// Devuelve las clases CSS asociadas al panel. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el título del panel como [`L10n`]. + pub fn title(&self) -> &L10n { + &self.title + } + + /// Devuelve el punto de ruptura configurado. + pub fn breakpoint(&self) -> &BreakPoint { + &self.breakpoint + } + + /// Devuelve la posición del panel. + pub fn placement(&self) -> &OffcanvasPlacement { + &self.placement + } + + /// Devuelve el estado inicial del panel. + pub fn visibility(&self) -> &OffcanvasVisibility { + &self.visibility + } + + /// Indica si la página principal puede desplazarse mientras el panel está abierto. + pub fn body_scroll(&self) -> &OffcanvasBodyScroll { + &self.scrolling + } + + /// Devuelve la configuración de la capa de fondo. + pub fn backdrop(&self) -> &OffcanvasBackdrop { + &self.backdrop + } + + /// Devuelve la lista de hijos (`children`) del panel. + pub fn children(&self) -> &Children { + &self.children + } +} From bf310bec7e59a148f0c834b6bf182bdd46209fcd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Oct 2025 07:03:14 +0200 Subject: [PATCH 829/853] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Mejora=20adici?= =?UTF-8?q?=C3=B3n=20de=20componentes=20hijos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/block.rs | 8 ++++---- src/base/component/intro.rs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/base/component/block.rs b/src/base/component/block.rs index 17af50c2..76d094ff 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -71,13 +71,13 @@ impl Block { } /// Añade un nuevo componente hijo al bloque. + #[inline] pub fn add_child(mut self, component: impl Component) -> Self { - self.children - .alter_child(ChildOp::Add(Child::with(component))); + self.children.add(Child::with(component)); self } - /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. + /// Modifica la lista de componentes (`children`) aplicando una operación [`ChildOp`]. #[builder_fn] pub fn with_child(mut self, op: ChildOp) -> Self { self.children.alter_child(op); @@ -96,7 +96,7 @@ impl Block { &self.title } - /// Devuelve la lista de hijos (`children`) del bloque. + /// Devuelve la lista de componentes (`children`) del bloque. pub fn children(&self) -> &Children { &self.children } diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index 7e5c3931..6fd4521e 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -301,13 +301,13 @@ impl Intro { /// Añade un nuevo componente hijo a la intro. /// /// Si es un bloque ([`Block`]) aplica estilos específicos para destacarlo. + #[inline] pub fn add_child(mut self, component: impl Component) -> Self { - self.children - .alter_child(ChildOp::Add(Child::with(component))); + self.children.add(Child::with(component)); self } - /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. + /// Modifica la lista de componentes (`children`) aplicando una operación [`ChildOp`]. #[builder_fn] pub fn with_child(mut self, op: ChildOp) -> Self { self.children.alter_child(op); @@ -336,7 +336,7 @@ impl Intro { self.opening } - /// Devuelve la lista de hijos (`children`) de la intro. + /// Devuelve la lista de componentes (`children`) de la intro. pub fn children(&self) -> &Children { &self.children } From d21e1a21682ed87c758d25856259e6bbd1be886c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Oct 2025 07:13:15 +0200 Subject: [PATCH 830/853] =?UTF-8?q?=F0=9F=94=92=20Mejora=20seguridad=20de?= =?UTF-8?q?=20enlaces=20con=20`noopener`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/intro.rs | 8 ++++---- src/base/component/poweredby.rs | 2 +- src/locale/en-US/welcome.ftl | 2 +- src/locale/es-ES/welcome.ftl | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index 6fd4521e..a20d6232 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -166,7 +166,7 @@ impl Component for Intro { class="intro-button__link" href=((lnk)(cx)) target="_blank" - rel="noreferrer" + rel="noopener noreferrer" { span {} span {} span {} div class="intro-button__text" { @@ -216,9 +216,9 @@ impl Component for Intro { } } div class="intro-footer__links" { - a href="https://crates.io/crates/pagetop" target="_blank" rel="noreferrer" { ("Crates.io") } - a href="https://docs.rs/pagetop" target="_blank" rel="noreferrer" { ("Docs.rs") } - a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noreferrer" { (L10n::l("intro_code").using(cx)) } + a href="https://crates.io/crates/pagetop" target="_blank" rel="noopener noreferrer" { ("Crates.io") } + a href="https://docs.rs/pagetop" target="_blank" rel="noopener noreferrer" { ("Docs.rs") } + a href="https://git.cillero.es/manuelcillero/pagetop" target="_blank" rel="noopener noreferrer" { (L10n::l("intro_code").using(cx)) } em { (L10n::l("intro_have_fun").using(cx)) } } } diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index d77d65c6..51ab79d8 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -1,7 +1,7 @@ use crate::prelude::*; // Enlace a la página oficial de PageTop. -const LINK: &str = "<a href=\"https://pagetop.cillero.es\" rel=\"noreferrer\">PageTop</a>"; +const LINK: &str = "<a href=\"https://pagetop.cillero.es\" rel=\"noopener noreferrer\">PageTop</a>"; /// Componente que renderiza la sección 'Powered by' (*Funciona con*) típica del pie de página. /// diff --git a/src/locale/en-US/welcome.ftl b/src/locale/en-US/welcome.ftl index 34028804..ec691d1b 100644 --- a/src/locale/en-US/welcome.ftl +++ b/src/locale/en-US/welcome.ftl @@ -8,5 +8,5 @@ welcome_status_1 = If you can see this page, it means the <strong>PageTop</stron welcome_status_2 = If the issue persists, please <strong>contact the system administrator</strong>. welcome_support_title = Support -welcome_support_1 = To report issues with the <strong>PageTop</strong> framework, use <a href="https://github.com/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">GitHub</a>. Remember, before opening a new issue, review the existing ones to avoid duplicates. +welcome_support_1 = To report issues with the <strong>PageTop</strong> framework, use <a href="https://github.com/manuelcillero/pagetop/issues" target="_blank" rel="noopener noreferrer">GitHub</a>. Remember, before opening a new issue, review the existing ones to avoid duplicates. welcome_support_2 = For issues specific to the application (<strong>{ $app }</strong>), please use its official repository or support channel. diff --git a/src/locale/es-ES/welcome.ftl b/src/locale/es-ES/welcome.ftl index 605d1e2c..a3e3a184 100644 --- a/src/locale/es-ES/welcome.ftl +++ b/src/locale/es-ES/welcome.ftl @@ -8,5 +8,5 @@ welcome_status_1 = Si puedes ver esta página, es porque el servidor de <strong> welcome_status_2 = Si el problema persiste, por favor, <strong>contacta con el administrador del sistema</strong>. welcome_support_title = Soporte -welcome_support_1 = Para comunicar incidencias del propio entorno <strong>PageTop</strong>, utiliza <a href="https://github.com/manuelcillero/pagetop/issues" target="_blank" rel="noreferrer">GitHub</a>. Recuerda, antes de abrir una nueva incidencia, revisa las existentes para evitar duplicados. +welcome_support_1 = Para comunicar incidencias del propio entorno <strong>PageTop</strong>, utiliza <a href="https://github.com/manuelcillero/pagetop/issues" target="_blank" rel="noopener noreferrer">GitHub</a>. Recuerda, antes de abrir una nueva incidencia, revisa las existentes para evitar duplicados. welcome_support_2 = Para fallos específicos de la aplicación (<strong>{ $app }</strong>), utiliza su repositorio oficial o su canal de soporte. From 3841d1d3f3fcb9a427ac1b14d9dab9ae910e93d2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Oct 2025 09:02:58 +0200 Subject: [PATCH 831/853] =?UTF-8?q?=F0=9F=8E=A8=20(bootsier):=20Mejora=20m?= =?UTF-8?q?en=C3=BAs=20desplegables=20`Dropdown`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/locale/en-US/components.ftl | 3 + .../src/locale/es-ES/components.ftl | 3 + extensions/pagetop-bootsier/src/theme/aux.rs | 7 +- .../pagetop-bootsier/src/theme/aux/color.rs | 29 ++ .../pagetop-bootsier/src/theme/aux/size.rs | 31 ++ .../pagetop-bootsier/src/theme/dropdown.rs | 15 +- .../src/theme/dropdown/component.rs | 378 ++++++++++++++++-- .../src/theme/dropdown/item.rs | 260 ++++++++++-- 8 files changed, 654 insertions(+), 72 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/theme/aux/size.rs diff --git a/extensions/pagetop-bootsier/src/locale/en-US/components.ftl b/extensions/pagetop-bootsier/src/locale/en-US/components.ftl index 83dde396..0bb7fba6 100644 --- a/extensions/pagetop-bootsier/src/locale/en-US/components.ftl +++ b/extensions/pagetop-bootsier/src/locale/en-US/components.ftl @@ -1,3 +1,6 @@ +# Dropdown +dropdown_toggle = Toggle Dropdown + # Offcanvas close = Close diff --git a/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl b/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl index 1ae97888..045191e3 100644 --- a/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl +++ b/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl @@ -1,3 +1,6 @@ +# Dropdown +dropdown_toggle = Mostrar/ocultar menú + # Offcanvas close = Cerrar diff --git a/extensions/pagetop-bootsier/src/theme/aux.rs b/extensions/pagetop-bootsier/src/theme/aux.rs index 72ebf066..f3cc127d 100644 --- a/extensions/pagetop-bootsier/src/theme/aux.rs +++ b/extensions/pagetop-bootsier/src/theme/aux.rs @@ -1,11 +1,11 @@ -//! Coleción de elementos auxiliares de Bootstrap para Bootsier. +//! Colección de elementos auxiliares de Bootstrap para Bootsier. mod breakpoint; pub use breakpoint::BreakPoint; mod color; pub use color::Color; -pub use color::{BgColor, BorderColor, TextColor}; +pub use color::{BgColor, BorderColor, ButtonColor, TextColor}; mod opacity; pub use opacity::Opacity; @@ -16,3 +16,6 @@ pub use border::{Border, BorderSize}; mod rounded; pub use rounded::{Rounded, RoundedRadius}; + +mod size; +pub use size::ButtonSize; diff --git a/extensions/pagetop-bootsier/src/theme/aux/color.rs b/extensions/pagetop-bootsier/src/theme/aux/color.rs index 3a288550..c071e407 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/color.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/color.rs @@ -110,6 +110,35 @@ impl fmt::Display for BorderColor { } } +// **< ButtonColor >******************************************************************************** + +/// Variantes de color (`btn-*`) para **botones**. +/// +/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). +/// - `Background(Color)` genera `btn-{color}` (botón relleno). +/// - `Outline(Color)` genera `btn-outline-{color}` (contorno: texto y borde, fondo transparente). +/// - `Link` aplica estilo de enlace (`btn-link`), sin caja ni fondo, heredando el color de texto. +#[derive(AutoDefault)] +pub enum ButtonColor { + #[default] + Default, + Background(Color), + Outline(Color), + Link, +} + +#[rustfmt::skip] +impl fmt::Display for ButtonColor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Background(c) => write!(f, "btn-{c}"), + Self::Outline(c) => write!(f, "btn-outline-{c}"), + Self::Link => f.write_str("btn-link"), + } + } +} + // **< TextColor >********************************************************************************** /// Colores de texto y fondos de texto (`text-*`). diff --git a/extensions/pagetop-bootsier/src/theme/aux/size.rs b/extensions/pagetop-bootsier/src/theme/aux/size.rs new file mode 100644 index 00000000..e5cff63c --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/size.rs @@ -0,0 +1,31 @@ +use pagetop::prelude::*; + +use std::fmt; + +// **< ButtonSize >********************************************************************************* + +/// Tamaño visual de un botón. +/// +/// Controla la escala del botón según el diseño del tema: +/// +/// - `Default`, tamaño por defecto del tema (no añade clase). +/// - `Small`, botón compacto. +/// - `Large`, botón destacado/grande. +#[derive(AutoDefault)] +pub enum ButtonSize { + #[default] + Default, + Small, + Large, +} + +#[rustfmt::skip] +impl fmt::Display for ButtonSize { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Small => f.write_str("btn-sm"), + Self::Large => f.write_str("btn-lg"), + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/dropdown.rs b/extensions/pagetop-bootsier/src/theme/dropdown.rs index a04f8dd6..9e81c7a3 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown.rs @@ -1,5 +1,18 @@ +//! Definiciones para crear menús desplegables [`Dropdown`]. +//! +//! Cada [`dropdown::Item`](crate::theme::dropdown::Item) representa un elemento individual del +//! desplegable [`Dropdown`], con distintos comportamientos según su finalidad: enlaces de +//! navegación, botones de acción, encabezados o divisores visuales. +//! +//! Los ítems pueden estar activos, deshabilitados o abrirse en nueva ventana según su contexto y +//! configuración, y permiten incluir etiquetas localizables usando [`L10n`](pagetop::locale::L10n). +//! +//! Su propósito es ofrecer una base uniforme sobre la que construir menús consistentes, adaptados +//! al contexto de cada aplicación. + mod component; pub use component::Dropdown; +pub use component::{AutoClose, Direction, MenuAlign, MenuPosition}; mod item; -pub use item::Item; +pub use item::{Item, ItemKind}; diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index 2e0ea700..9aef2562 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -1,13 +1,134 @@ use pagetop::prelude::*; use crate::prelude::*; +use crate::LOCALES_BOOTSIER; +// **< AutoClose >********************************************************************************** + +/// Estrategia para el cierre automático de un menú [`Dropdown`]. +/// +/// Define cuándo se cierra el menú desplegado según la interacción del usuario. +#[derive(AutoDefault)] +pub enum AutoClose { + /// Comportamiento por defecto, se cierra con clics dentro y fuera del menú, o pulsando `Esc`. + #[default] + Default, + /// Sólo se cierra con clics dentro del menú. + ClickableInside, + /// Sólo se cierra con clics fuera del menú. + ClickableOutside, + /// Cierre manual, no se cierra con clics; sólo al pulsar nuevamente el botón del menú + /// (*toggle*), o pulsando `Esc`. + ManualClose, +} + +// **< Direction >********************************************************************************** + +/// Dirección de despliegue de un menú [`Dropdown`]. +/// +/// Controla desde qué posición se muestra el menú respecto al botón. +#[derive(AutoDefault)] +pub enum Direction { + /// Comportamiento por defecto (despliega el menú hacia abajo desde la posición inicial, + /// respetando LTR/RTL). + #[default] + Default, + /// Centra horizontalmente el menú respecto al botón. + Centered, + /// Despliega el menú hacia arriba. + Dropup, + /// Despliega el menú hacia arriba y centrado. + DropupCentered, + /// Despliega el menú desde el lateral final, respetando LTR/RTL. + Dropend, + /// Despliega el menú desde el lateral inicial, respetando LTR/RTL. + Dropstart, +} + +// **< MenuAlign >********************************************************************************** + +/// Alineación horizontal del menú desplegable [`Dropdown`]. +/// +/// Permite alinear el menú al inicio o al final del botón (respetando LTR/RTL) y añadirle una +/// alineación diferente a partir de un punto de ruptura ([`BreakPoint`]). +#[derive(AutoDefault)] +pub enum MenuAlign { + /// Alineación al inicio (comportamiento por defecto). + #[default] + Start, + /// Alineación al inicio a partir del punto de ruptura indicado. + StartAt(BreakPoint), + /// Alineación al inicio por defecto, y al final a partir de un punto de ruptura válido. + StartAndEnd(BreakPoint), + /// Alineación al final. + End, + /// Alineación al final a partir del punto de ruptura indicado. + EndAt(BreakPoint), + /// Alineación al final por defecto, y al inicio a partir de un punto de ruptura válido. + EndAndStart(BreakPoint), +} + +// **< MenuPosition >******************************************************************************* + +/// Posición relativa del menú desplegable [`Dropdown`]. +/// +/// Permite indicar un desplazamiento (*offset*) manual o referenciar al elemento padre para el +/// cálculo de la posición. +#[derive(AutoDefault)] +pub enum MenuPosition { + /// Posicionamiento automático por defecto. + #[default] + Default, + /// Desplazamiento manual en píxeles `(x, y)` aplicado al menú. Se admiten valores negativos. + Offset(i8, i8), + /// Posiciona el menú tomando como referencia el botón padre. Especialmente útil cuando + /// [`button_split()`](crate::theme::Dropdown::button_split) es `true`. + Parent, +} + +// **< Dropdown >********************************************************************************** + +/// Componente para crear un **menú desplegable**. +/// +/// Renderiza un botón (único o desdoblado, ver [`with_button_split()`](Self::with_button_split)) +/// para mostrar un menú desplegable de elementos [`dropdown::Item`], que se muestra/oculta según la +/// interacción del usuario. Admite variaciones de tamaño/color del botón, también dirección de +/// apertura, alineación o política de cierre. +/// +/// Sin título para el botón (ver [`with_button_title()`](Self::with_button_title)) se muestra +/// únicamente la lista de elementos sin ningún botón para interactuar. +/// +/// # Ejemplo +/// +/// ```rust +/// # use pagetop::prelude::*; +/// # use pagetop_bootsier::prelude::*; +/// let dd = Dropdown::new() +/// .with_button_title(L10n::n("Menu")) +/// .with_button_color(ButtonColor::Background(Color::Secondary)) +/// .with_auto_close(dropdown::AutoClose::ClickableInside) +/// .with_direction(dropdown::Direction::Dropend) +/// .add_item(dropdown::Item::link(L10n::n("Home"), |_| "/")) +/// .add_item(dropdown::Item::link_blank(L10n::n("External"), |_| "https://www.google.es")) +/// .add_item(dropdown::Item::divider()) +/// .add_item(dropdown::Item::header(L10n::n("User session"))) +/// .add_item(dropdown::Item::button(L10n::n("Sign out"))); +/// ``` #[rustfmt::skip] #[derive(AutoDefault)] pub struct Dropdown { - id : AttrId, - classes: AttrClasses, - items : Children, + id : AttrId, + classes : AttrClasses, + button_title : L10n, + button_size : ButtonSize, + button_color : ButtonColor, + button_split : bool, + button_grouped: bool, + auto_close : dropdown::AutoClose, + direction : dropdown::Direction, + menu_align : dropdown::MenuAlign, + menu_position : dropdown::MenuPosition, + items : Children, } impl Component for Dropdown { @@ -19,42 +140,134 @@ impl Component for Dropdown { self.id.get() } + #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes(ClassesOp::Prepend, "dropdown"); + let g = self.button_grouped(); + self.alter_classes(ClassesOp::Prepend, [ + if g { "btn-group" } else { "" }, + match self.direction() { + Direction::Default if g => "", + Direction::Default => "dropdown", + Direction::Centered => "dropdown-center", + Direction::Dropup => "dropup", + Direction::DropupCentered => "dropup-center", + Direction::Dropend => "dropend", + Direction::Dropstart => "dropstart", + } + ].join(" ")); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + // Si no hay elementos en el menú, no se prepara. let items = self.items().render(cx); if items.is_empty() { return PrepareMarkup::None; } + // Título opcional para el menú desplegable. + let button_title = self.button_title().using(cx); + PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { - button - type="button" - class="btn btn-secondary dropdown-toggle" - data-bs-toggle="dropdown" - aria-expanded="false" - { - ("Dropdown button") - } - ul class="dropdown-menu" { - li { - a class="dropdown-item" href="#" { - ("Action") + @if !button_title.is_empty() { + @let mut btn_classes = AttrClasses::new([ + "btn", + &self.button_size().to_string(), + &self.button_color().to_string(), + ].join(" ")); + @let (offset, reference) = match self.menu_position() { + MenuPosition::Default => (None, None), + MenuPosition::Offset(x, y) => (Some(format!("{x},{y}")), None), + MenuPosition::Parent => (None, Some("parent")), + }; + @let auto_close = match self.auto_close { + AutoClose::Default => None, + AutoClose::ClickableInside => Some("inside"), + AutoClose::ClickableOutside => Some("outside"), + AutoClose::ManualClose => Some("false"), + }; + @let menu_classes = AttrClasses::new("dropdown-menu") + .with_value(ClassesOp::Add, match self.menu_align() { + MenuAlign::Start => String::new(), + MenuAlign::StartAt(bp) => bp.try_class("dropdown-menu") + .map_or(String::new(), |class| join!(class, "-start")), + MenuAlign::StartAndEnd(bp) => bp.try_class("dropdown-menu") + .map_or( + "dropdown-menu-start".into(), + |class| join!("dropdown-menu-start ", class, "-end") + ), + MenuAlign::End => "dropdown-menu-end".into(), + MenuAlign::EndAt(bp) => bp.try_class("dropdown-menu") + .map_or(String::new(), |class| join!(class, "-end")), + MenuAlign::EndAndStart(bp) => bp.try_class("dropdown-menu") + .map_or( + "dropdown-menu-end".into(), + |class| join!("dropdown-menu-end ", class, "-start") + ), + }); + + // Renderizado en modo split (dos botones) o simple (un botón). + @if self.button_split() { + // Botón principal (acción/etiqueta). + @let btn = html! { + button + type="button" + class=[btn_classes.get()] + { + (button_title) + } + }; + // Botón *toggle* que abre/cierra el menú asociado. + @let btn_toggle = html! { + button + type="button" + class=[btn_classes.alter_value( + ClassesOp::Add, "dropdown-toggle dropdown-toggle-split" + ).get()] + data-bs-toggle="dropdown" + data-bs-offset=[offset] + data-bs-reference=[reference] + data-bs-auto-close=[auto_close] + aria-expanded="false" + { + span class="visually-hidden" { + (L10n::t("dropdown_toggle", &LOCALES_BOOTSIER).using(cx)) + } + } + }; + // Orden según dirección (en `dropstart` el *toggle* se sitúa antes). + @match self.direction() { + Direction::Dropstart => { + (btn_toggle) + ul class=[menu_classes.get()] { (items) } + (btn) + } + _ => { + (btn) + (btn_toggle) + ul class=[menu_classes.get()] { (items) } + } } - } - li { - a class="dropdown-item" href="#" { - ("Another action") - } - } - li { - a class="dropdown-item" href="#" { - ("Something else here") + } @else { + // Botón único con funcionalidad de *toggle*. + button + type="button" + class=[btn_classes.alter_value( + ClassesOp::Add, "dropdown-toggle" + ).get()] + data-bs-toggle="dropdown" + data-bs-offset=[offset] + data-bs-reference=[reference] + data-bs-auto-close=[auto_close] + aria-expanded="false" + { + (button_title) } + ul class=[menu_classes.get()] { (items) } } + } @else { + // Sin botón: sólo el listado como menú contextual. + ul class="dropdown-menu" { (items) } } } }) @@ -64,23 +277,91 @@ impl Component for Dropdown { impl Dropdown { // **< Dropdown BUILDER >*********************************************************************** + /// Establece el identificador único (`id`) del menú desplegable. #[builder_fn] pub fn with_id(mut self, id: impl AsRef<str>) -> Self { self.id.alter_value(id); self } + /// Modifica la lista de clases CSS aplicadas al menú desplegable. #[builder_fn] pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { self.classes.alter_value(op, classes); self } + /// Establece el título del botón. + #[builder_fn] + pub fn with_button_title(mut self, title: L10n) -> Self { + self.button_title = title; + self + } + + /// Ajusta el tamaño del botón. + #[builder_fn] + pub fn with_button_size(mut self, size: ButtonSize) -> Self { + self.button_size = size; + self + } + + /// Define el color/estilo del botón. + #[builder_fn] + pub fn with_button_color(mut self, color: ButtonColor) -> Self { + self.button_color = color; + self + } + + /// Activa/desactiva el modo *split* (botón de acción + *toggle*). + #[builder_fn] + pub fn with_button_split(mut self, split: bool) -> Self { + self.button_split = split; + self + } + + /// Indica si el botón del menú está integrado en un grupo de botones. + #[builder_fn] + pub fn with_button_grouped(mut self, grouped: bool) -> Self { + self.button_grouped = grouped; + self + } + + /// Establece la política de cierre automático del menú desplegable. + #[builder_fn] + pub fn with_auto_close(mut self, auto_close: dropdown::AutoClose) -> Self { + self.auto_close = auto_close; + self + } + + /// Establece la dirección de despliegue del menú. + #[builder_fn] + pub fn with_direction(mut self, direction: dropdown::Direction) -> Self { + self.direction = direction; + self + } + + /// Configura la alineación horizontal (con posible comportamiento *responsive* adicional). + #[builder_fn] + pub fn with_menu_align(mut self, align: dropdown::MenuAlign) -> Self { + self.menu_align = align; + self + } + + /// Configura la posición del menú. + #[builder_fn] + pub fn with_menu_position(mut self, position: dropdown::MenuPosition) -> Self { + self.menu_position = position; + self + } + + /// Añade un nuevo elemento hijo al menú. + #[inline] pub fn add_item(mut self, item: dropdown::Item) -> Self { self.items.add(Child::with(item)); self } + /// Modifica la lista de elementos (`children`) aplicando una operación [`TypedOp`]. #[builder_fn] pub fn with_items(mut self, op: TypedOp<dropdown::Item>) -> Self { self.items.alter_typed(op); @@ -89,10 +370,57 @@ impl Dropdown { // **< Dropdown GETTERS >*********************************************************************** + /// Devuelve las clases CSS asociadas al menú desplegable. pub fn classes(&self) -> &AttrClasses { &self.classes } + /// Devuelve el título del botón. + pub fn button_title(&self) -> &L10n { + &self.button_title + } + + /// Devuelve el tamaño configurado del botón. + pub fn button_size(&self) -> &ButtonSize { + &self.button_size + } + + /// Devuelve el color/estilo configurado del botón. + pub fn button_color(&self) -> &ButtonColor { + &self.button_color + } + + /// Devuelve si se debe desdoblar (*split*) el botón (botón de acción + *toggle*). + pub fn button_split(&self) -> bool { + self.button_split + } + + /// Devuelve si el botón del menú está integrado en un grupo de botones. + pub fn button_grouped(&self) -> bool { + self.button_grouped + } + + /// Devuelve la política de cierre automático del menú desplegado. + pub fn auto_close(&self) -> &dropdown::AutoClose { + &self.auto_close + } + + /// Devuelve la dirección de despliegue configurada. + pub fn direction(&self) -> &dropdown::Direction { + &self.direction + } + + /// Devuelve la configuración de alineación horizontal del menú desplegable. + pub fn menu_align(&self) -> &dropdown::MenuAlign { + &self.menu_align + } + + /// Devuelve la posición configurada para el menú desplegable. + pub fn menu_position(&self) -> &dropdown::MenuPosition { + &self.menu_position + } + + /// Devuelve la lista de elementos (`children`) del menú. pub fn items(&self) -> &Children { &self.items } diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs index 1edd64b1..548024c5 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs @@ -1,22 +1,53 @@ use pagetop::prelude::*; -// **< ItemType >*********************************************************************************** +// **< ItemKind >*********************************************************************************** +/// Tipos de [`dropdown::Item`](crate::theme::dropdown::Item) disponibles en un menú desplegable +/// [`Dropdown`](crate::theme::Dropdown). +/// +/// Define internamente la naturaleza del elemento y su comportamiento al mostrarse o interactuar +/// con él. #[derive(AutoDefault)] -pub enum ItemType { +pub enum ItemKind { + /// Elemento vacío, no produce salida. #[default] Void, + /// Etiqueta sin comportamiento interactivo. Label(L10n), - Link(L10n, FnPathByContext), - LinkBlank(L10n, FnPathByContext), + /// Elemento de navegación. Opcionalmente puede abrirse en una nueva ventana y estar + /// inicialmente deshabilitado. + Link { + label: L10n, + path: FnPathByContext, + blank: bool, + disabled: bool, + }, + /// Acción ejecutable en la propia página, sin navegación asociada. Inicialmente puede estar + /// deshabilitado. + Button { label: L10n, disabled: bool }, + /// Título o encabezado que separa grupos de opciones. + Header(L10n), + /// Separador visual entre bloques de elementos. + Divider, } // **< Item >*************************************************************************************** +/// Representa un **elemento individual** de un menú desplegable +/// [`Dropdown`](crate::theme::Dropdown). +/// +/// Cada instancia de [`dropdown::Item`](crate::theme::dropdown::Item) se traduce en un componente +/// visible que puede comportarse como texto, enlace, botón, encabezado o separador, según su +/// [`ItemKind`]. +/// +/// Permite definir identificador, clases de estilo adicionales o tipo de interacción asociada, +/// manteniendo una interfaz común para renderizar todos los ítems del menú. #[rustfmt::skip] #[derive(AutoDefault)] pub struct Item { - item_type: ItemType, + id : AttrId, + classes : AttrClasses, + item_kind: ItemKind, } impl Component for Item { @@ -24,86 +55,227 @@ impl Component for Item { Item::default() } + fn id(&self) -> Option<String> { + self.id.get() + } + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let description: Option<String> = None; + match self.item_kind() { + ItemKind::Void => PrepareMarkup::None, - // Obtiene la URL actual desde `cx.request`. - let current_path = cx.request().map(|request| request.path()); - - match self.item_type() { - ItemType::Void => PrepareMarkup::None, - ItemType::Label(label) => PrepareMarkup::With(html! { - li class="dropdown-item" { - span title=[description] { - //(left_icon) + ItemKind::Label(label) => PrepareMarkup::With(html! { + li id=[self.id()] class=[self.classes().get()] { + span class="dropdown-item-text" { (label.using(cx)) - //(right_icon) } } }), - ItemType::Link(label, path) => { - let item_path = path(cx); - let (class, aria) = if current_path == Some(item_path) { - ("dropdown-item active", Some("page")) - } else { - ("dropdown-item", None) - }; + + ItemKind::Link { + label, + path, + blank, + disabled, + } => { + let path = path(cx); + let current_path = cx.request().map(|request| request.path()); + let is_current = !*disabled && current_path.map(|p| p == path).unwrap_or(false); + + let mut classes = "dropdown-item".to_string(); + if is_current { + classes.push_str(" active"); + } + if *disabled { + classes.push_str(" disabled"); + } + + let href = (!disabled).then_some(path); + let target = (!disabled && *blank).then_some("_blank"); + let rel = (!disabled && *blank).then_some("noopener noreferrer"); + + let aria_current = (href.is_some() && is_current).then_some("page"); + let aria_disabled = disabled.then_some("true"); + let tabindex = disabled.then_some("-1"); + PrepareMarkup::With(html! { - li class=(class) aria-current=[aria] { - a class="nav-link" href=(item_path) title=[description] { - //(left_icon) + li id=[self.id()] class=[self.classes().get()] { + a + class=(classes) + href=[href] + target=[target] + rel=[rel] + aria-current=[aria_current] + aria-disabled=[aria_disabled] + tabindex=[tabindex] + { (label.using(cx)) - //(right_icon) } } }) } - ItemType::LinkBlank(label, path) => { - let item_path = path(cx); - let (class, aria) = if current_path == Some(item_path) { - ("dropdown-item active", Some("page")) - } else { - ("dropdown-item", None) - }; + + ItemKind::Button { label, disabled } => { + let mut classes = "dropdown-item".to_owned(); + if *disabled { + classes.push_str(" disabled"); + } + + let aria_disabled = disabled.then_some("true"); + let disabled_attr = disabled.then_some("disabled"); + PrepareMarkup::With(html! { - li class=(class) aria-current=[aria] { - a class="nav-link" href=(item_path) title=[description] target="_blank" { - //(left_icon) + li id=[self.id()] class=[self.classes().get()] { + button + class=(classes) + type="button" + aria-disabled=[aria_disabled] + disabled=[disabled_attr] + { (label.using(cx)) - //(right_icon) } } }) } + + ItemKind::Header(label) => PrepareMarkup::With(html! { + li id=[self.id()] class=[self.classes().get()] { + h6 class="dropdown-header" { + (label.using(cx)) + } + } + }), + + ItemKind::Divider => PrepareMarkup::With(html! { + li id=[self.id()] class=[self.classes().get()] { hr class="dropdown-divider" {} } + }), } } } impl Item { + /// Crea un elemento de tipo texto, mostrado sin interacción. pub fn label(label: L10n) -> Self { Item { - item_type: ItemType::Label(label), + item_kind: ItemKind::Label(label), ..Default::default() } } + /// Crea un enlace para la navegación. pub fn link(label: L10n, path: FnPathByContext) -> Self { Item { - item_type: ItemType::Link(label, path), + item_kind: ItemKind::Link { + label, + path, + blank: false, + disabled: false, + }, ..Default::default() } } + /// Crea un enlace deshabilitado que no permite la interacción. + pub fn link_disabled(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::Link { + label, + path, + blank: false, + disabled: true, + }, + ..Default::default() + } + } + + /// Crea un enlace que se abre en una nueva ventana o pestaña. pub fn link_blank(label: L10n, path: FnPathByContext) -> Self { Item { - item_type: ItemType::LinkBlank(label, path), + item_kind: ItemKind::Link { + label, + path, + blank: true, + disabled: false, + }, ..Default::default() } } - // Item GETTERS. + /// Crea un enlace deshabilitado que se abriría en una nueva ventana. + pub fn link_blank_disabled(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::Link { + label, + path, + blank: true, + disabled: true, + }, + ..Default::default() + } + } - pub fn item_type(&self) -> &ItemType { - &self.item_type + /// Crea un botón de acción local, sin navegación asociada. + pub fn button(label: L10n) -> Self { + Item { + item_kind: ItemKind::Button { + label, + disabled: false, + }, + ..Default::default() + } + } + + /// Crea un botón deshabilitado. + pub fn button_disabled(label: L10n) -> Self { + Item { + item_kind: ItemKind::Button { + label, + disabled: true, + }, + ..Default::default() + } + } + + /// Crea un encabezado para un grupo de elementos dentro del menú. + pub fn header(label: L10n) -> Self { + Item { + item_kind: ItemKind::Header(label), + ..Default::default() + } + } + + /// Crea un separador visual entre bloques de elementos. + pub fn divider() -> Self { + Item { + item_kind: ItemKind::Divider, + ..Default::default() + } + } + + // **< Item BUILDER >*************************************************************************** + + /// Establece el identificador único (`id`) del elemento. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al elemento. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + // **< Item GETTERS >*************************************************************************** + + /// Devuelve las clases CSS asociadas al elemento. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el tipo de elemento representado por este ítem. + pub fn item_kind(&self) -> &ItemKind { + &self.item_kind } } From c3a0255d441e02ba67a24952adb11499625bfa3e Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Oct 2025 10:52:33 +0200 Subject: [PATCH 832/853] =?UTF-8?q?=F0=9F=9A=A7=20Cambia=20el=20uso=20de?= =?UTF-8?q?=20`BreakPoint`=20para=20`Container`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/src/theme.rs | 2 +- .../src/theme/aux/breakpoint.rs | 43 +++---- .../pagetop-bootsier/src/theme/container.rs | 108 +++++++++++------- 3 files changed, 87 insertions(+), 66 deletions(-) diff --git a/extensions/pagetop-bootsier/src/theme.rs b/extensions/pagetop-bootsier/src/theme.rs index 51073d43..ec95165c 100644 --- a/extensions/pagetop-bootsier/src/theme.rs +++ b/extensions/pagetop-bootsier/src/theme.rs @@ -4,7 +4,7 @@ pub mod aux; // Container. mod container; -pub use container::{Container, ContainerType}; +pub use container::{Container, ContainerType, ContainerWidth}; // Dropdown. pub mod dropdown; diff --git a/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs index 963bb3b5..601aa547 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs @@ -7,10 +7,6 @@ use std::fmt; /// - `"sm"`, `"md"`, `"lg"`, `"xl"` o `"xxl"` para los puntos de ruptura `SM`, `MD`, `LG`, `XL` o /// `XXL`, respectivamente. /// - `""` (cadena vacía) para `None`. -/// - `"fluid"` para las variantes `Fluid` y `FluidMax(_)`, útil para modelar `container-fluid` en -/// [`Container`](crate::theme::Container). Se debe tener en cuenta que `"fluid"` **no** es un -/// sufijo de *breakpoint*. Para construir clases válidas con prefijo (p. ej., `"col-md"`), se -/// recomienda usar `to_class()` (Self::to_class) o `try_class()` (Self::try_class). /// /// # Ejemplos /// @@ -18,13 +14,14 @@ use std::fmt; /// # use pagetop_bootsier::prelude::*; /// assert_eq!(BreakPoint::MD.to_string(), "md"); /// assert_eq!(BreakPoint::None.to_string(), ""); -/// assert_eq!(BreakPoint::Fluid.to_string(), "fluid"); /// /// // Forma correcta para clases con prefijo: -/// //assert_eq!(BreakPoint::MD.to_class("col"), "col-md"); -/// //assert_eq!(BreakPoint::Fluid.to_class("offcanvas"), "offcanvas"); +/// assert_eq!(BreakPoint::MD.to_class("col"), "col-md"); +/// assert_eq!(BreakPoint::None.to_class("offcanvas"), "offcanvas"); +/// +/// assert_eq!(BreakPoint::XXL.try_class("col"), Some("col-xxl".to_string())); +/// assert_eq!(BreakPoint::None.try_class("offcanvas"), None); /// ``` -#[rustfmt::skip] #[derive(AutoDefault)] pub enum BreakPoint { /// **Menos de 576px**. Dispositivos muy pequeños: teléfonos en modo vertical. @@ -40,11 +37,6 @@ pub enum BreakPoint { XL, /// **1400px o más** - Dispositivos extragrandes: puestos de escritorio más grandes. XXL, - /// Para [`Container`](crate::theme::Container), ocupa el 100% del ancho del dispositivo. - Fluid, - /// Para [`Container`](crate::theme::Container), ocupa el 100% del ancho del dispositivo hasta - /// un ancho máximo indicado. - FluidMax(UnitValue) } impl BreakPoint { @@ -53,7 +45,7 @@ impl BreakPoint { /// Devuelve `true` si el valor es `SM`, `MD`, `LG`, `XL` o `XXL`; y `false` en otro caso. #[inline] pub const fn is_breakpoint(&self) -> bool { - matches!(self, Self::SM | Self::MD | Self::LG | Self::XL | Self::XXL) + !matches!(self, Self::None) } /// Genera un nombre de clase CSS basado en el punto de ruptura. @@ -65,11 +57,12 @@ impl BreakPoint { /// # Ejemplo /// /// ```rust + /// # use pagetop_bootsier::prelude::*; /// let breakpoint = BreakPoint::MD; /// let class = breakpoint.to_class("col"); /// assert_eq!(class, "col-md".to_string()); /// - /// let breakpoint = BreakPoint::Fluid; + /// let breakpoint = BreakPoint::None; /// let class = breakpoint.to_class("offcanvas"); /// assert_eq!(class, "offcanvas".to_string()); /// ``` @@ -91,12 +84,13 @@ impl BreakPoint { /// # Ejemplo /// /// ```rust + /// # use pagetop_bootsier::prelude::*; /// let breakpoint = BreakPoint::MD; /// let class = breakpoint.try_class("col"); /// assert_eq!(class, Some("col-md".to_string())); /// - /// let breakpoint = BreakPoint::Fluid; - /// let class = breakpoint.try_class("navbar-expanded"); + /// let breakpoint = BreakPoint::None; + /// let class = breakpoint.try_class("navbar-expand"); /// assert_eq!(class, None); /// ``` #[inline] @@ -113,15 +107,12 @@ impl BreakPoint { impl fmt::Display for BreakPoint { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::None => Ok(()), - Self::SM => f.write_str("sm"), - Self::MD => f.write_str("md"), - Self::LG => f.write_str("lg"), - Self::XL => f.write_str("xl"), - Self::XXL => f.write_str("xxl"), - // Devuelven "fluid" (para modelar `container-fluid`). - Self::Fluid => f.write_str("fluid"), - Self::FluidMax(_) => f.write_str("fluid"), + Self::None => Ok(()), + Self::SM => f.write_str("sm"), + Self::MD => f.write_str("md"), + Self::LG => f.write_str("lg"), + Self::XL => f.write_str("xl"), + Self::XXL => f.write_str("xxl"), } } } diff --git a/extensions/pagetop-bootsier/src/theme/container.rs b/extensions/pagetop-bootsier/src/theme/container.rs index 65ce9230..22f7fc6c 100644 --- a/extensions/pagetop-bootsier/src/theme/container.rs +++ b/extensions/pagetop-bootsier/src/theme/container.rs @@ -2,11 +2,12 @@ use pagetop::prelude::*; use crate::prelude::*; +// **< ContainerType >****************************************************************************** + /// Tipo de contenedor ([`Container`]). /// /// Permite aplicar la etiqueta HTML apropiada (`<main>`, `<header>`, etc.) manteniendo una API /// común a todos los contenedores. -#[rustfmt::skip] #[derive(AutoDefault)] pub enum ContainerType { /// Contenedor genérico (`<div>`). @@ -24,22 +25,42 @@ pub enum ContainerType { Article, } -/// Componente genérico para crear un contenedor de componentes. +// **< ContainerWidth >***************************************************************************** + +/// Define el comportamiento para ajustar el ancho de un contenedor ([`Container`]). +#[derive(AutoDefault)] +pub enum ContainerWidth { + /// Comportamiento por defecto, aplica los anchos máximos predefinidos para cada punto de + /// ruptura. Por debajo del menor punto de ruptura ocupa el 100% del ancho disponible. + #[default] + Default, + /// Aplica los anchos máximos predefinidos a partir del punto de ruptura indicado. Por debajo de + /// ese punto de ruptura ocupa el 100% del ancho disponible. + From(BreakPoint), + /// Ocupa el 100% del ancho disponible siempre. + Fluid, + /// Ocupa el 100% del ancho disponible hasta un ancho máximo explícito. + FluidMax(UnitValue), +} + +// **< Container >********************************************************************************** + +/// Componente para crear un **contenedor de componentes**. /// /// Envuelve el contenido con la etiqueta HTML indicada por [`ContainerType`]. Sólo se renderiza si /// existen componentes hijos (*children*). #[rustfmt::skip] #[derive(AutoDefault)] pub struct Container { - id : AttrId, - classes : AttrClasses, - container_type: ContainerType, - breakpoint : BreakPoint, - children : Children, - bg_color : BgColor, - text_color : TextColor, - border : Border, - rounded : Rounded, + id : AttrId, + classes : AttrClasses, + container_type : ContainerType, + container_width: ContainerWidth, + bg_color : BgColor, + text_color : TextColor, + border : Border, + rounded : Rounded, + children : Children, } impl Component for Container { @@ -55,7 +76,16 @@ impl Component for Container { self.alter_classes( ClassesOp::Prepend, [ - join_pair!("container", "-", self.breakpoint().to_string()), + join_pair!( + "container", + "-", + match self.width() { + ContainerWidth::Default => String::new(), + ContainerWidth::From(bp) => bp.to_string(), + ContainerWidth::Fluid => "fluid".to_string(), + ContainerWidth::FluidMax(_) => "fluid".to_string(), + } + ), self.bg_color().to_string(), self.text_color().to_string(), self.border().to_string(), @@ -70,8 +100,8 @@ impl Component for Container { if output.is_empty() { return PrepareMarkup::None; } - let style = match self.breakpoint() { - BreakPoint::FluidMax(w) if w.is_measurable() => { + let style = match self.width() { + ContainerWidth::FluidMax(w) if w.is_measurable() => { Some(join!("max-width: ", w.to_string(), ";")) } _ => None, @@ -168,24 +198,10 @@ impl Container { self } - /// Establece el *punto de ruptura* del contenedor. + /// Establece el comportamiento del ancho para el contenedor. #[builder_fn] - pub fn with_breakpoint(mut self, bp: BreakPoint) -> Self { - self.breakpoint = bp; - self - } - - /// Añade un nuevo componente hijo al contenedor. - pub fn add_child(mut self, component: impl Component) -> Self { - self.children - .alter_child(ChildOp::Add(Child::with(component))); - self - } - - /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. - #[builder_fn] - pub fn with_child(mut self, op: ChildOp) -> Self { - self.children.alter_child(op); + pub fn with_width(mut self, width: ContainerWidth) -> Self { + self.container_width = width; self } @@ -225,6 +241,20 @@ impl Container { self } + /// Añade un nuevo componente hijo al contenedor. + #[inline] + pub fn add_child(mut self, component: impl Component) -> Self { + self.children.add(Child::with(component)); + self + } + + /// Modifica la lista de componentes (`children`) aplicando una operación [`ChildOp`]. + #[builder_fn] + pub fn with_child(mut self, op: ChildOp) -> Self { + self.children.alter_child(op); + self + } + // **< Container GETTERS >********************************************************************** /// Devuelve las clases CSS asociadas al contenedor. @@ -237,14 +267,9 @@ impl Container { &self.container_type } - /// Devuelve el *punto de ruptura* actualmente configurado. - pub fn breakpoint(&self) -> &BreakPoint { - &self.breakpoint - } - - /// Devuelve la lista de hijos (`children`) del contenedor. - pub fn children(&self) -> &Children { - &self.children + /// Devuelve el comportamiento para el ancho del contenedor. + pub fn width(&self) -> &ContainerWidth { + &self.container_width } /// Devuelve el color de fondo del contenedor. @@ -266,4 +291,9 @@ impl Container { pub fn rounded(&self) -> &Rounded { &self.rounded } + + /// Devuelve la lista de componentes (`children`) del contenedor. + pub fn children(&self) -> &Children { + &self.children + } } From c58b011943d9146dfb69068ff4c88afeb22328f1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Oct 2025 10:55:34 +0200 Subject: [PATCH 833/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactoriza=20`Dro?= =?UTF-8?q?pdown`=20para=20separar=20propiedades?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pagetop-bootsier/src/theme/dropdown.rs | 4 +- .../src/theme/dropdown/component.rs | 127 +++--------------- .../src/theme/dropdown/props.rs | 86 ++++++++++++ 3 files changed, 110 insertions(+), 107 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/theme/dropdown/props.rs diff --git a/extensions/pagetop-bootsier/src/theme/dropdown.rs b/extensions/pagetop-bootsier/src/theme/dropdown.rs index 9e81c7a3..02df7fd0 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown.rs @@ -10,9 +10,11 @@ //! Su propósito es ofrecer una base uniforme sobre la que construir menús consistentes, adaptados //! al contexto de cada aplicación. +mod props; +pub use props::{AutoClose, Direction, MenuAlign, MenuPosition}; + mod component; pub use component::Dropdown; -pub use component::{AutoClose, Direction, MenuAlign, MenuPosition}; mod item; pub use item::{Item, ItemKind}; diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index 9aef2562..e9d36d7f 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -3,91 +3,6 @@ use pagetop::prelude::*; use crate::prelude::*; use crate::LOCALES_BOOTSIER; -// **< AutoClose >********************************************************************************** - -/// Estrategia para el cierre automático de un menú [`Dropdown`]. -/// -/// Define cuándo se cierra el menú desplegado según la interacción del usuario. -#[derive(AutoDefault)] -pub enum AutoClose { - /// Comportamiento por defecto, se cierra con clics dentro y fuera del menú, o pulsando `Esc`. - #[default] - Default, - /// Sólo se cierra con clics dentro del menú. - ClickableInside, - /// Sólo se cierra con clics fuera del menú. - ClickableOutside, - /// Cierre manual, no se cierra con clics; sólo al pulsar nuevamente el botón del menú - /// (*toggle*), o pulsando `Esc`. - ManualClose, -} - -// **< Direction >********************************************************************************** - -/// Dirección de despliegue de un menú [`Dropdown`]. -/// -/// Controla desde qué posición se muestra el menú respecto al botón. -#[derive(AutoDefault)] -pub enum Direction { - /// Comportamiento por defecto (despliega el menú hacia abajo desde la posición inicial, - /// respetando LTR/RTL). - #[default] - Default, - /// Centra horizontalmente el menú respecto al botón. - Centered, - /// Despliega el menú hacia arriba. - Dropup, - /// Despliega el menú hacia arriba y centrado. - DropupCentered, - /// Despliega el menú desde el lateral final, respetando LTR/RTL. - Dropend, - /// Despliega el menú desde el lateral inicial, respetando LTR/RTL. - Dropstart, -} - -// **< MenuAlign >********************************************************************************** - -/// Alineación horizontal del menú desplegable [`Dropdown`]. -/// -/// Permite alinear el menú al inicio o al final del botón (respetando LTR/RTL) y añadirle una -/// alineación diferente a partir de un punto de ruptura ([`BreakPoint`]). -#[derive(AutoDefault)] -pub enum MenuAlign { - /// Alineación al inicio (comportamiento por defecto). - #[default] - Start, - /// Alineación al inicio a partir del punto de ruptura indicado. - StartAt(BreakPoint), - /// Alineación al inicio por defecto, y al final a partir de un punto de ruptura válido. - StartAndEnd(BreakPoint), - /// Alineación al final. - End, - /// Alineación al final a partir del punto de ruptura indicado. - EndAt(BreakPoint), - /// Alineación al final por defecto, y al inicio a partir de un punto de ruptura válido. - EndAndStart(BreakPoint), -} - -// **< MenuPosition >******************************************************************************* - -/// Posición relativa del menú desplegable [`Dropdown`]. -/// -/// Permite indicar un desplazamiento (*offset*) manual o referenciar al elemento padre para el -/// cálculo de la posición. -#[derive(AutoDefault)] -pub enum MenuPosition { - /// Posicionamiento automático por defecto. - #[default] - Default, - /// Desplazamiento manual en píxeles `(x, y)` aplicado al menú. Se admiten valores negativos. - Offset(i8, i8), - /// Posiciona el menú tomando como referencia el botón padre. Especialmente útil cuando - /// [`button_split()`](crate::theme::Dropdown::button_split) es `true`. - Parent, -} - -// **< Dropdown >********************************************************************************** - /// Componente para crear un **menú desplegable**. /// /// Renderiza un botón (único o desdoblado, ver [`with_button_split()`](Self::with_button_split)) @@ -146,13 +61,13 @@ impl Component for Dropdown { self.alter_classes(ClassesOp::Prepend, [ if g { "btn-group" } else { "" }, match self.direction() { - Direction::Default if g => "", - Direction::Default => "dropdown", - Direction::Centered => "dropdown-center", - Direction::Dropup => "dropup", - Direction::DropupCentered => "dropup-center", - Direction::Dropend => "dropend", - Direction::Dropstart => "dropstart", + dropdown::Direction::Default if g => "", + dropdown::Direction::Default => "dropdown", + dropdown::Direction::Centered => "dropdown-center", + dropdown::Direction::Dropup => "dropup", + dropdown::Direction::DropupCentered => "dropup-center", + dropdown::Direction::Dropend => "dropend", + dropdown::Direction::Dropstart => "dropstart", } ].join(" ")); } @@ -176,30 +91,30 @@ impl Component for Dropdown { &self.button_color().to_string(), ].join(" ")); @let (offset, reference) = match self.menu_position() { - MenuPosition::Default => (None, None), - MenuPosition::Offset(x, y) => (Some(format!("{x},{y}")), None), - MenuPosition::Parent => (None, Some("parent")), + dropdown::MenuPosition::Default => (None, None), + dropdown::MenuPosition::Offset(x, y) => (Some(format!("{x},{y}")), None), + dropdown::MenuPosition::Parent => (None, Some("parent")), }; @let auto_close = match self.auto_close { - AutoClose::Default => None, - AutoClose::ClickableInside => Some("inside"), - AutoClose::ClickableOutside => Some("outside"), - AutoClose::ManualClose => Some("false"), + dropdown::AutoClose::Default => None, + dropdown::AutoClose::ClickableInside => Some("inside"), + dropdown::AutoClose::ClickableOutside => Some("outside"), + dropdown::AutoClose::ManualClose => Some("false"), }; @let menu_classes = AttrClasses::new("dropdown-menu") .with_value(ClassesOp::Add, match self.menu_align() { - MenuAlign::Start => String::new(), - MenuAlign::StartAt(bp) => bp.try_class("dropdown-menu") + dropdown::MenuAlign::Start => String::new(), + dropdown::MenuAlign::StartAt(bp) => bp.try_class("dropdown-menu") .map_or(String::new(), |class| join!(class, "-start")), - MenuAlign::StartAndEnd(bp) => bp.try_class("dropdown-menu") + dropdown::MenuAlign::StartAndEnd(bp) => bp.try_class("dropdown-menu") .map_or( "dropdown-menu-start".into(), |class| join!("dropdown-menu-start ", class, "-end") ), - MenuAlign::End => "dropdown-menu-end".into(), - MenuAlign::EndAt(bp) => bp.try_class("dropdown-menu") + dropdown::MenuAlign::End => "dropdown-menu-end".into(), + dropdown::MenuAlign::EndAt(bp) => bp.try_class("dropdown-menu") .map_or(String::new(), |class| join!(class, "-end")), - MenuAlign::EndAndStart(bp) => bp.try_class("dropdown-menu") + dropdown::MenuAlign::EndAndStart(bp) => bp.try_class("dropdown-menu") .map_or( "dropdown-menu-end".into(), |class| join!("dropdown-menu-end ", class, "-start") @@ -237,7 +152,7 @@ impl Component for Dropdown { }; // Orden según dirección (en `dropstart` el *toggle* se sitúa antes). @match self.direction() { - Direction::Dropstart => { + dropdown::Direction::Dropstart => { (btn_toggle) ul class=[menu_classes.get()] { (items) } (btn) diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/props.rs b/extensions/pagetop-bootsier/src/theme/dropdown/props.rs new file mode 100644 index 00000000..da305ea7 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/dropdown/props.rs @@ -0,0 +1,86 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +// **< AutoClose >********************************************************************************** + +/// Estrategia para el cierre automático de un menú [`Dropdown`]. +/// +/// Define cuándo se cierra el menú desplegado según la interacción del usuario. +#[derive(AutoDefault)] +pub enum AutoClose { + /// Comportamiento por defecto, se cierra con clics dentro y fuera del menú, o pulsando `Esc`. + #[default] + Default, + /// Sólo se cierra con clics dentro del menú. + ClickableInside, + /// Sólo se cierra con clics fuera del menú. + ClickableOutside, + /// Cierre manual, no se cierra con clics; sólo al pulsar nuevamente el botón del menú + /// (*toggle*), o pulsando `Esc`. + ManualClose, +} + +// **< Direction >********************************************************************************** + +/// Dirección de despliegue de un menú [`Dropdown`]. +/// +/// Controla desde qué posición se muestra el menú respecto al botón. +#[derive(AutoDefault)] +pub enum Direction { + /// Comportamiento por defecto (despliega el menú hacia abajo desde la posición inicial, + /// respetando LTR/RTL). + #[default] + Default, + /// Centra horizontalmente el menú respecto al botón. + Centered, + /// Despliega el menú hacia arriba. + Dropup, + /// Despliega el menú hacia arriba y centrado. + DropupCentered, + /// Despliega el menú desde el lateral final, respetando LTR/RTL. + Dropend, + /// Despliega el menú desde el lateral inicial, respetando LTR/RTL. + Dropstart, +} + +// **< MenuAlign >********************************************************************************** + +/// Alineación horizontal del menú desplegable [`Dropdown`]. +/// +/// Permite alinear el menú al inicio o al final del botón (respetando LTR/RTL) y añadirle una +/// alineación diferente a partir de un punto de ruptura ([`BreakPoint`]). +#[derive(AutoDefault)] +pub enum MenuAlign { + /// Alineación al inicio (comportamiento por defecto). + #[default] + Start, + /// Alineación al inicio a partir del punto de ruptura indicado. + StartAt(BreakPoint), + /// Alineación al inicio por defecto, y al final a partir de un punto de ruptura válido. + StartAndEnd(BreakPoint), + /// Alineación al final. + End, + /// Alineación al final a partir del punto de ruptura indicado. + EndAt(BreakPoint), + /// Alineación al final por defecto, y al inicio a partir de un punto de ruptura válido. + EndAndStart(BreakPoint), +} + +// **< MenuPosition >******************************************************************************* + +/// Posición relativa del menú desplegable [`Dropdown`]. +/// +/// Permite indicar un desplazamiento (*offset*) manual o referenciar al elemento padre para el +/// cálculo de la posición. +#[derive(AutoDefault)] +pub enum MenuPosition { + /// Posicionamiento automático por defecto. + #[default] + Default, + /// Desplazamiento manual en píxeles `(x, y)` aplicado al menú. Se admiten valores negativos. + Offset(i8, i8), + /// Posiciona el menú tomando como referencia el botón padre. Especialmente útil cuando + /// [`button_split()`](crate::theme::Dropdown::button_split) es `true`. + Parent, +} From 1bf7ada6076e8220ab4318c8f177b5b5b296a631 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Oct 2025 19:02:47 +0200 Subject: [PATCH 834/853] =?UTF-8?q?=E2=9C=A8=20(bootsier):=20A=C3=B1ade=20?= =?UTF-8?q?paneles=20deslizables=20`Offcanvas`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/locale/en-US/components.ftl | 2 +- .../src/locale/es-ES/components.ftl | 2 +- extensions/pagetop-bootsier/src/theme.rs | 7 +- .../pagetop-bootsier/src/theme/offcanvas.rs | 305 +----------------- .../src/theme/offcanvas/component.rs | 261 +++++++++++++++ .../src/theme/offcanvas/props.rs | 60 ++++ 6 files changed, 331 insertions(+), 306 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/theme/offcanvas/component.rs create mode 100644 extensions/pagetop-bootsier/src/theme/offcanvas/props.rs diff --git a/extensions/pagetop-bootsier/src/locale/en-US/components.ftl b/extensions/pagetop-bootsier/src/locale/en-US/components.ftl index 0bb7fba6..e3b0d6e6 100644 --- a/extensions/pagetop-bootsier/src/locale/en-US/components.ftl +++ b/extensions/pagetop-bootsier/src/locale/en-US/components.ftl @@ -2,7 +2,7 @@ dropdown_toggle = Toggle Dropdown # Offcanvas -close = Close +offcanvas_close = Close # Navbar toggle = Toggle navigation diff --git a/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl b/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl index 045191e3..ab7ff687 100644 --- a/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl +++ b/extensions/pagetop-bootsier/src/locale/es-ES/components.ftl @@ -2,7 +2,7 @@ dropdown_toggle = Mostrar/ocultar menú # Offcanvas -close = Cerrar +offcanvas_close = Cerrar # Navbar toggle = Mostrar/ocultar navegación diff --git a/extensions/pagetop-bootsier/src/theme.rs b/extensions/pagetop-bootsier/src/theme.rs index ec95165c..b5be6b71 100644 --- a/extensions/pagetop-bootsier/src/theme.rs +++ b/extensions/pagetop-bootsier/src/theme.rs @@ -21,7 +21,6 @@ pub mod navbar; pub use navbar::{Navbar, NavbarToggler}; // Offcanvas. -mod offcanvas; -pub use offcanvas::{ - Offcanvas, OffcanvasBackdrop, OffcanvasBodyScroll, OffcanvasPlacement, OffcanvasVisibility, -}; +pub mod offcanvas; +#[doc(inline)] +pub use offcanvas::Offcanvas; diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas.rs b/extensions/pagetop-bootsier/src/theme/offcanvas.rs index b790522b..560bd30a 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas.rs @@ -1,302 +1,7 @@ -use pagetop::prelude::*; +//! Definiciones para crear paneles laterales deslizantes [`Offcanvas`]. -use crate::prelude::*; -use crate::LOCALES_BOOTSIER; +mod props; +pub use props::{Backdrop, BodyScroll, Placement, Visibility}; -use std::fmt; - -// **< OffcanvasPlacement >************************************************************************* - -/// Posición de aparición del panel **deslizante** ([`Offcanvas`]). -/// -/// Define desde qué borde de la ventana entra y se ancla el panel. -#[derive(AutoDefault)] -pub enum OffcanvasPlacement { - /// Opción por defecto, desde el borde inicial según dirección de lectura (respetando LTR/RTL). - #[default] - Start, - /// Desde el borde final según dirección de lectura (respetando LTR/RTL). - End, - /// Desde la parte superior. - Top, - /// Desde la parte inferior. - Bottom, -} - -#[rustfmt::skip] -impl fmt::Display for OffcanvasPlacement { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - OffcanvasPlacement::Start => f.write_str("offcanvas-start"), - OffcanvasPlacement::End => f.write_str("offcanvas-end"), - OffcanvasPlacement::Top => f.write_str("offcanvas-top"), - OffcanvasPlacement::Bottom => f.write_str("offcanvas-bottom"), - } - } -} - -// **< OffcanvasVisibility >************************************************************************ - -/// Estado inicial del panel ([`Offcanvas`]). -#[derive(AutoDefault)] -pub enum OffcanvasVisibility { - /// El panel **permanece oculto** desde el principio. - #[default] - Default, - /// El panel **se muestra abierto** al cargar. - Show, -} - -impl fmt::Display for OffcanvasVisibility { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - OffcanvasVisibility::Default => Ok(()), - OffcanvasVisibility::Show => f.write_str("show"), - } - } -} - -// **< OffcanvasBodyScroll >************************************************************************ - -/// Controla si la página principal puede **desplazarse** al abrir el panel ([`Offcanvas`]). -#[derive(AutoDefault)] -pub enum OffcanvasBodyScroll { - /// Opción por defecto, la página principal se **bloquea** centrando la interacción en el panel. - #[default] - Disabled, - /// **Permite** el desplazamiento de la página principal. - Enabled, -} - -// **< OffcanvasBackdrop >************************************************************************** - -/// Comportamiento de la **capa de fondo** (*backdrop*) del panel ([`Offcanvas`]) al desplegarse. -#[derive(AutoDefault)] -pub enum OffcanvasBackdrop { - /// **Sin capa** de fondo; la página principal permanece visible e interactiva. - Disabled, - /// Opción por defecto, se **oscurece** el fondo; un clic fuera del panel suele cerrarlo. - #[default] - Enabled, - /// Se muestra capa de fondo pero **no** se cierra al pulsar fuera (útil cuando se requiere - /// completar una acción antes de salir). - Static, -} - -// **< Offcanvas >********************************************************************************** - -/// Panel lateral **deslizante** para contenido complementario. -/// -/// Útil para navegación, filtros, formularios o menús contextuales. Incluye las siguientes -/// características principales: -/// -/// - **Entrada configurable desde un borde** de la ventana. -/// - **Encabezado con título** y **botón de cierre** integrado. -/// - **Accesibilidad**: asocia título y controles a un identificador único y expone atributos -/// adecuados para lectores de pantalla y navegación por teclado. -/// - **Opcionalmente** bloquea el desplazamiento del documento y/o muestra una capa de fondo para -/// centrar la atención del usuario. -/// - **Responsive**: puede cambiar su comportamiento según el punto de ruptura indicado. -/// - **No se renderiza** si no tiene contenido. -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Offcanvas { - id : AttrId, - classes : AttrClasses, - title : L10n, - breakpoint: BreakPoint, - placement : OffcanvasPlacement, - visibility: OffcanvasVisibility, - scrolling : OffcanvasBodyScroll, - backdrop : OffcanvasBackdrop, - children : Children, -} - -impl Component for Offcanvas { - fn new() -> Self { - Offcanvas::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - [ - self.breakpoint().to_class("offcanvas"), - self.placement().to_string(), - self.visibility().to_string(), - ] - .join(" "), - ); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let body = self.children().render(cx); - if body.is_empty() { - return PrepareMarkup::None; - } - - let id = cx.required_id::<Self>(self.id()); - let id_label = join!(id, "-label"); - let id_target = join!("#", id); - - let body_scroll = match self.body_scroll() { - OffcanvasBodyScroll::Disabled => None, - OffcanvasBodyScroll::Enabled => Some("true"), - }; - - let backdrop = match self.backdrop() { - OffcanvasBackdrop::Disabled => Some("false"), - OffcanvasBackdrop::Enabled => None, - OffcanvasBackdrop::Static => Some("static"), - }; - - let title = self.title().using(cx); - - PrepareMarkup::With(html! { - div - id=(id) - class=[self.classes().get()] - tabindex="-1" - data-bs-scroll=[body_scroll] - data-bs-backdrop=[backdrop] - aria-labelledby=(id_label) - { - div class="offcanvas-header" { - @if !title.is_empty() { - h5 class="offcanvas-title" id=(id_label) { (title) } - } - button - type="button" - class="btn-close" - data-bs-dismiss="offcanvas" - data-bs-target=(id_target) - aria-label=[L10n::t("close", &LOCALES_BOOTSIER).lookup(cx)] - {} - } - div class="offcanvas-body" { - (body) - } - } - }) - } -} - -impl Offcanvas { - // **< Offcanvas BUILDER >********************************************************************** - - /// Establece el identificador único (`id`) del panel. - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - /// Modifica la lista de clases CSS aplicadas al panel. - #[builder_fn] - pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { - self.classes.alter_value(op, classes); - self - } - - /// Establece el **título** del encabezado. - #[builder_fn] - pub fn with_title(mut self, title: L10n) -> Self { - self.title = title; - self - } - - /// Configura el **punto de ruptura** para activar el comportamiento responsive del panel. - #[builder_fn] - pub fn with_breakpoint(mut self, bp: BreakPoint) -> Self { - self.breakpoint = bp; - self - } - - /// Indica la **posición** desde la que entra el panel. - #[builder_fn] - pub fn with_placement(mut self, placement: OffcanvasPlacement) -> Self { - self.placement = placement; - self - } - - /// Fija el **estado inicial** del panel (oculto o visible al cargar). - #[builder_fn] - pub fn with_visibility(mut self, visibility: OffcanvasVisibility) -> Self { - self.visibility = visibility; - self - } - - /// Permite o bloquea el **desplazamiento** de la página principal mientras el panel está - /// abierto. - #[builder_fn] - pub fn with_body_scroll(mut self, scrolling: OffcanvasBodyScroll) -> Self { - self.scrolling = scrolling; - self - } - - /// Ajusta la **capa de fondo** del panel para definir su comportamiento al interactuar fuera. - #[builder_fn] - pub fn with_backdrop(mut self, backdrop: OffcanvasBackdrop) -> Self { - self.backdrop = backdrop; - self - } - - /// Añade un nuevo componente hijo al panel. - pub fn add_child(mut self, child: impl Component) -> Self { - self.children.add(Child::with(child)); - self - } - - /// Modifica la lista de hijos (`children`) aplicando una operación [`ChildOp`]. - #[builder_fn] - pub fn with_children(mut self, op: ChildOp) -> Self { - self.children.alter_child(op); - self - } - - // **< Offcanvas GETTERS >********************************************************************** - - /// Devuelve las clases CSS asociadas al panel. - pub fn classes(&self) -> &AttrClasses { - &self.classes - } - - /// Devuelve el título del panel como [`L10n`]. - pub fn title(&self) -> &L10n { - &self.title - } - - /// Devuelve el punto de ruptura configurado. - pub fn breakpoint(&self) -> &BreakPoint { - &self.breakpoint - } - - /// Devuelve la posición del panel. - pub fn placement(&self) -> &OffcanvasPlacement { - &self.placement - } - - /// Devuelve el estado inicial del panel. - pub fn visibility(&self) -> &OffcanvasVisibility { - &self.visibility - } - - /// Indica si la página principal puede desplazarse mientras el panel está abierto. - pub fn body_scroll(&self) -> &OffcanvasBodyScroll { - &self.scrolling - } - - /// Devuelve la configuración de la capa de fondo. - pub fn backdrop(&self) -> &OffcanvasBackdrop { - &self.backdrop - } - - /// Devuelve la lista de hijos (`children`) del panel. - pub fn children(&self) -> &Children { - &self.children - } -} +mod component; +pub use component::Offcanvas; diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs new file mode 100644 index 00000000..7cd7dffe --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs @@ -0,0 +1,261 @@ +use pagetop::prelude::*; + +use crate::prelude::*; +use crate::LOCALES_BOOTSIER; + +/// Componente para crear un **panel lateral deslizante** con contenidos adicionales. +/// +/// Útil para navegación, filtros, formularios o menús contextuales. Incluye las siguientes +/// características principales: +/// +/// - Puede mostrar una capa de fondo para centrar la atención del usuario en el panel +/// ([`with_backdrop()`](Self::with_backdrop)); o puede bloquear el desplazamiento del documento +/// principal ([`with_body_scroll()`](Self::with_body_scroll)). +/// - Se puede configurar el borde de la ventana desde el que se desliza el panel +/// ([`with_placement()`](Self::with_placement)). +/// - Encabezado con título ([`with_title()`](Self::with_title)) y **botón de cierre** integrado. +/// - Puede cambiar su comportamiento a partir de un punto de ruptura +/// ([`with_breakpoint()`](Self::with_breakpoint)). +/// - Asocia título y controles de accesibilidad a un identificador único y expone atributos +/// adecuados para lectores de pantalla y navegación por teclado. +/// - **No se renderiza** si no tiene contenido. +/// +/// # Ejemplo +/// +/// ```rust +/// # use pagetop::prelude::*; +/// # use pagetop_bootsier::prelude::*; +/// let panel = Offcanvas::new() +/// .with_id("offcanvas_example") +/// .with_title(L10n::n("Offcanvas title")) +/// .with_placement(offcanvas::Placement::End) +/// .with_backdrop(offcanvas::Backdrop::Enabled) +/// .with_body_scroll(offcanvas::BodyScroll::Enabled) +/// .with_visibility(offcanvas::Visibility::Default) +/// .add_child(Dropdown::new() +/// .with_button_title(L10n::n("Menu")) +/// .add_item(dropdown::Item::label(L10n::n("Label"))) +/// .add_item(dropdown::Item::link_blank(L10n::n("Google"), |_| "https://www.google.es")) +/// .add_item(dropdown::Item::link(L10n::n("Sign out"), |_| "/signout")) +/// ); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Offcanvas { + id : AttrId, + classes : AttrClasses, + title : L10n, + breakpoint: BreakPoint, + backdrop : offcanvas::Backdrop, + scrolling : offcanvas::BodyScroll, + placement : offcanvas::Placement, + visibility: offcanvas::Visibility, + children : Children, +} + +impl Component for Offcanvas { + fn new() -> Self { + Offcanvas::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + #[rustfmt::skip] + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [ + self.breakpoint().to_class("offcanvas"), + match self.placement() { + offcanvas::Placement::Start => "offcanvas-start", + offcanvas::Placement::End => "offcanvas-end", + offcanvas::Placement::Top => "offcanvas-top", + offcanvas::Placement::Bottom => "offcanvas-bottom", + }.to_string(), + match self.visibility() { + offcanvas::Visibility::Default => "", + offcanvas::Visibility::Show => "show", + }.to_string(), + ] + .join(" "), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let body = self.children().render(cx); + if body.is_empty() { + return PrepareMarkup::None; + } + + let id = cx.required_id::<Self>(self.id()); + let id_label = join!(id, "-label"); + let id_target = join!("#", id); + + let body_scroll = match self.body_scroll() { + offcanvas::BodyScroll::Disabled => None, + offcanvas::BodyScroll::Enabled => Some("true"), + }; + + let backdrop = match self.backdrop() { + offcanvas::Backdrop::Disabled => Some("false"), + offcanvas::Backdrop::Enabled => None, + offcanvas::Backdrop::Static => Some("static"), + }; + + let title = self.title().using(cx); + + PrepareMarkup::With(html! { + div + id=(id) + class=[self.classes().get()] + tabindex="-1" + data-bs-scroll=[body_scroll] + data-bs-backdrop=[backdrop] + aria-labelledby=(id_label) + { + div class="offcanvas-header" { + @if !title.is_empty() { + h5 class="offcanvas-title" id=(id_label) { (title) } + } + button + type="button" + class="btn-close" + data-bs-dismiss="offcanvas" + data-bs-target=(id_target) + aria-label=[L10n::t("offcanvas_close", &LOCALES_BOOTSIER).lookup(cx)] + {} + } + div class="offcanvas-body" { + (body) + } + } + }) + } +} + +impl Offcanvas { + // **< Offcanvas BUILDER >********************************************************************** + + /// Establece el identificador único (`id`) del panel. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al panel. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Establece el título del encabezado. + #[builder_fn] + pub fn with_title(mut self, title: L10n) -> Self { + self.title = title; + self + } + + /// Establece el punto de ruptura a partir del cual cambia el comportamiento del panel. + /// + /// - **Por debajo** de ese tamaño de pantalla, el componente actúa como panel deslizante + /// ([`Offcanvas`]). + /// - **Por encima**, el contenido del panel se muestra tal cual, integrado en la página. + /// + /// Por ejemplo, con `BreakPoint::LG`, será *offcanvas* en móviles y tabletas, y visible + /// directamente en pantallas grandes. Por defecto usa `BreakPoint::None` para que sea + /// *offcanvas* siempre. + #[builder_fn] + pub fn with_breakpoint(mut self, bp: BreakPoint) -> Self { + self.breakpoint = bp; + self + } + + /// Ajusta la capa de fondo del panel para definir su comportamiento al hacer clic fuera del + /// panel. + #[builder_fn] + pub fn with_backdrop(mut self, backdrop: offcanvas::Backdrop) -> Self { + self.backdrop = backdrop; + self + } + + /// Permite o bloquea el desplazamiento de la página principal mientras el panel está abierto. + #[builder_fn] + pub fn with_body_scroll(mut self, scrolling: offcanvas::BodyScroll) -> Self { + self.scrolling = scrolling; + self + } + + /// Indica desde qué borde de la ventana entra y se ancla el panel. + #[builder_fn] + pub fn with_placement(mut self, placement: offcanvas::Placement) -> Self { + self.placement = placement; + self + } + + /// Fija el estado inicial del panel (oculto o visible al cargar). + #[builder_fn] + pub fn with_visibility(mut self, visibility: offcanvas::Visibility) -> Self { + self.visibility = visibility; + self + } + + /// Añade un nuevo componente hijo al panel. + #[inline] + pub fn add_child(mut self, child: impl Component) -> Self { + self.children.add(Child::with(child)); + self + } + + /// Modifica la lista de componentes (`children`) aplicando una operación [`ChildOp`]. + #[builder_fn] + pub fn with_children(mut self, op: ChildOp) -> Self { + self.children.alter_child(op); + self + } + + // **< Offcanvas GETTERS >********************************************************************** + + /// Devuelve las clases CSS asociadas al panel. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el título del panel. + pub fn title(&self) -> &L10n { + &self.title + } + + /// Devuelve el punto de ruptura configurado para cambiar el comportamiento del panel. + pub fn breakpoint(&self) -> &BreakPoint { + &self.breakpoint + } + + /// Devuelve el comportamiento configurado para la capa de fondo. + pub fn backdrop(&self) -> &offcanvas::Backdrop { + &self.backdrop + } + + /// Indica si la página principal puede desplazarse mientras el panel está abierto. + pub fn body_scroll(&self) -> &offcanvas::BodyScroll { + &self.scrolling + } + + /// Devuelve la posición de inicio del panel. + pub fn placement(&self) -> &offcanvas::Placement { + &self.placement + } + + /// Devuelve el estado inicial del panel. + pub fn visibility(&self) -> &offcanvas::Visibility { + &self.visibility + } + + /// Devuelve la lista de componentes (`children`) del panel. + pub fn children(&self) -> &Children { + &self.children + } +} diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/props.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/props.rs new file mode 100644 index 00000000..cbacbd74 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/offcanvas/props.rs @@ -0,0 +1,60 @@ +use pagetop::prelude::*; + +// **< Backdrop >*********************************************************************************** + +/// Comportamiento de la capa de fondo (*backdrop*) de un panel +/// [`Offcanvas`](crate::theme::Offcanvas) al deslizarse. +#[derive(AutoDefault)] +pub enum Backdrop { + /// Sin capa de fondo, la página principal permanece visible e interactiva. + Disabled, + /// Opción por defecto, se oscurece el fondo; un clic fuera del panel suele cerrarlo. + #[default] + Enabled, + /// Muestra la capa de fondo pero no se cierra al hacer clic fuera del panel. Útil si se + /// requiere completar una acción antes de salir. + Static, +} + +// **< BodyScroll >********************************************************************************* + +/// Controla si la página principal puede desplazarse al abrir un panel +/// [`Offcanvas`](crate::theme::Offcanvas). +#[derive(AutoDefault)] +pub enum BodyScroll { + /// Opción por defecto, la página principal se bloquea centrando la interacción en el panel. + #[default] + Disabled, + /// Permite el desplazamiento de la página principal. + Enabled, +} + +// **< Placement >********************************************************************************** + +/// Posición de aparición de un panel [`Offcanvas`](crate::theme::Offcanvas) al deslizarse. +/// +/// Define desde qué borde de la ventana entra y se ancla el panel. +#[derive(AutoDefault)] +pub enum Placement { + /// Opción por defecto, desde el borde inicial según dirección de lectura (respetando LTR/RTL). + #[default] + Start, + /// Desde el borde final según dirección de lectura (respetando LTR/RTL). + End, + /// Desde la parte superior. + Top, + /// Desde la parte inferior. + Bottom, +} + +// **< Visibility >********************************************************************************* + +/// Estado inicial de un panel [`Offcanvas`](crate::theme::Offcanvas). +#[derive(AutoDefault)] +pub enum Visibility { + /// El panel permanece oculto desde el principio. + #[default] + Default, + /// El panel se muestra abierto al cargar. + Show, +} From 5ac26c0b0609cb7e953e74161b9331ebda650275 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 25 Oct 2025 19:04:35 +0200 Subject: [PATCH 835/853] =?UTF-8?q?=F0=9F=A9=B9=20Correcciones=20menores?= =?UTF-8?q?=20en=20comentarios=20y=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 7 +++---- src/base/component/block.rs | 2 +- src/base/component/intro.rs | 6 +++--- src/core/extension/definition.rs | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 2781aef8..732bbad7 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -277,8 +277,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { .collect(); // Documentación del método alter_...(). - let alter_doc = - format!("Equivalente a [`Self::{with_name_str}()`], pero fuera del patrón *builder*."); + let doc = format!("Equivale a [`Self::{with_name_str}()`], pero fuera del patrón *builder*."); // Genera el código final. let expanded = match body_opt { @@ -288,7 +287,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { fn #with_name #generics (self, #(#args),*) -> Self #where_clause; #(#non_doc_or_inline_attrs)* - #[doc = #alter_doc] + #[doc = #doc] fn #alter_ident #generics (&mut self, #(#args),*) -> &mut Self #where_clause; } } @@ -322,7 +321,7 @@ pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { #with_fn #(#non_doc_or_inline_attrs)* - #[doc = #alter_doc] + #[doc = #doc] #vis_pub fn #alter_ident #generics (&mut self, #(#args),*) -> &mut Self #where_clause { #body } diff --git a/src/base/component/block.rs b/src/base/component/block.rs index 76d094ff..b2a754e5 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -91,7 +91,7 @@ impl Block { &self.classes } - /// Devuelve el título del bloque como [`L10n`]. + /// Devuelve el título del bloque. pub fn title(&self) -> &L10n { &self.title } diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index a20d6232..49488ee4 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -237,7 +237,7 @@ impl Intro { /// /// ```rust /// # use pagetop::prelude::*; - /// let intro = Intro::default().with_title(L10n::n("Título de entrada")); + /// let intro = Intro::default().with_title(L10n::n("Intro title")); /// ``` #[builder_fn] pub fn with_title(mut self, title: L10n) -> Self { @@ -251,7 +251,7 @@ impl Intro { /// /// ```rust /// # use pagetop::prelude::*; - /// let intro = Intro::default().with_slogan(L10n::n("Un eslogan para la entrada")); + /// let intro = Intro::default().with_slogan(L10n::n("A short slogan")); /// ``` #[builder_fn] pub fn with_slogan(mut self, slogan: L10n) -> Self { @@ -270,7 +270,7 @@ impl Intro { /// ```rust /// # use pagetop::prelude::*; /// // Define un botón con texto y una URL fija. - /// let intro = Intro::default().with_button(Some((L10n::n("Pulsa este botón"), |_| "/start"))); + /// let intro = Intro::default().with_button(Some((L10n::n("Learn more"), |_| "/start"))); /// // Descarta el botón de la intro. /// let intro_no_button = Intro::default().with_button(None); /// ``` diff --git a/src/core/extension/definition.rs b/src/core/extension/definition.rs index 5699130d..520153d0 100644 --- a/src/core/extension/definition.rs +++ b/src/core/extension/definition.rs @@ -21,7 +21,7 @@ pub type ExtensionRef = &'static dyn Extension; /// /// impl Extension for Blog { /// fn name(&self) -> L10n { L10n::n("Blog") } -/// fn description(&self) -> L10n { L10n::n("Sistema de blogs") } +/// fn description(&self) -> L10n { L10n::n("Blog system") } /// } /// ``` pub trait Extension: AnyInfo + Send + Sync { From 534b1f9615d0dab00d84c5ba6c65bec67d280a8c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 26 Oct 2025 06:38:10 +0100 Subject: [PATCH 836/853] =?UTF-8?q?=F0=9F=8D=B1=20Reemplaza=20im=C3=A1gene?= =?UTF-8?q?s=20del=20logo=20de=20PageTop=20con=20SVG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component/intro.rs | 28 +-------- src/html.rs | 3 + src/html/logo.rs | 93 ++++++++++++++++++++++++++++ src/prelude.rs | 4 +- static/css/intro.css | 8 ++- static/img/monster-pagetop_250.avif | Bin 10834 -> 0 bytes static/img/monster-pagetop_250.png | Bin 32018 -> 0 bytes static/img/monster-pagetop_250.webp | Bin 12090 -> 0 bytes static/img/monster-pagetop_500.avif | Bin 20876 -> 0 bytes static/img/monster-pagetop_500.png | Bin 80504 -> 0 bytes static/img/monster-pagetop_500.webp | Bin 22974 -> 0 bytes 11 files changed, 106 insertions(+), 30 deletions(-) create mode 100644 src/html/logo.rs delete mode 100644 static/img/monster-pagetop_250.avif delete mode 100644 static/img/monster-pagetop_250.png delete mode 100644 static/img/monster-pagetop_250.webp delete mode 100644 static/img/monster-pagetop_500.avif delete mode 100644 static/img/monster-pagetop_500.png delete mode 100644 static/img/monster-pagetop_500.webp diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index 49488ee4..052f9c60 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -140,20 +140,7 @@ impl Component for Intro { } aside class="intro-header__image" aria-hidden="true" { div class="intro-header__monster" { - picture { - source - type="image/avif" - src="/img/monster-pagetop_250.avif" - srcset="/img/monster-pagetop_500.avif 1.5x"; - source - type="image/webp" - src="/img/monster-pagetop_250.webp" - srcset="/img/monster-pagetop_500.webp 1.5x"; - img - src="/img/monster-pagetop_250.png" - srcset="/img/monster-pagetop_500.png 1.5x" - alt="Monster PageTop"; - } + (PageTopSvg::Color.render(cx)) } } } @@ -202,18 +189,7 @@ impl Component for Intro { div class="intro-footer" { section class="intro-footer__body" { div class="intro-footer__logo" { - svg - viewBox="0 0 1614 1614" - xmlns="http://www.w3.org/2000/svg" - role="img" - aria-label=[L10n::l("pagetop_logo").lookup(cx)] - preserveAspectRatio="xMidYMid slice" - focusable="false" - { - path fill="rgb(255,255,255)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} - path fill="rgb(255,255,255)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} - path fill="rgb(255,255,255)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} - } + (PageTopSvg::LineLight.render(cx)) } div class="intro-footer__links" { a href="https://crates.io/crates/pagetop" target="_blank" rel="noopener noreferrer" { ("Crates.io") } diff --git a/src/html.rs b/src/html.rs index f85c24ed..5f5b833a 100644 --- a/src/html.rs +++ b/src/html.rs @@ -11,6 +11,9 @@ pub use assets::javascript::JavaScript; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub use assets::{Asset, Assets}; +mod logo; +pub use logo::PageTopSvg; + // **< HTML DOCUMENT CONTEXT >********************************************************************** /// **Obsoleto desde la versión 0.5.0**: usar [`core::component::Context`] en su lugar. diff --git a/src/html/logo.rs b/src/html/logo.rs new file mode 100644 index 00000000..f5057d94 --- /dev/null +++ b/src/html/logo.rs @@ -0,0 +1,93 @@ +use crate::core::component::Context; +use crate::html::{html, Markup}; +use crate::locale::L10n; +use crate::AutoDefault; + +/// Representación SVG del **logotipo de PageTop** para incrustar en HTML. +/// +/// # Ejemplo +/// +/// ```rust +/// # use pagetop::prelude::*; +/// fn render_logo(cx: &mut Context) -> PrepareMarkup { +/// PrepareMarkup::With(html! { +/// div class="logo_color" { +/// (PageTopSvg::Color.render(cx)) +/// } +/// div class="line_dark" { +/// (PageTopSvg::LineDark.render(cx)) +/// } +/// div class="line_light" { +/// (PageTopSvg::LineLight.render(cx)) +/// } +/// div class="line_red" { +/// (PageTopSvg::LineRGB(255, 0, 0).render(cx)) +/// } +/// }) +/// }; +/// ``` + +#[derive(AutoDefault)] +pub enum PageTopSvg { + /// Versión por defecto con el logotipo a color. + #[default] + Color, + /// Versión monocroma (línea) oscura, ideal sobre fondos claros. + LineDark, + /// Versión monocroma (línea) clara, ideal sobre fondos oscuros. + LineLight, + /// Versión monocroma configurable por RGB. + LineRGB(u8, u8, u8), +} + +impl PageTopSvg { + /// Renderiza el SVG del logotipo según la variante elegida. + pub fn render(&self, cx: &Context) -> Markup { + let path_fills = match self { + Self::Color => self.logo_color(), + Self::LineDark => self.logo_line(10, 11, 9), + Self::LineLight => self.logo_line(255, 255, 255), + Self::LineRGB(r, g, b) => self.logo_line(*r, *g, *b), + }; + html! { + svg + viewBox="0 0 1614 1614" + xmlns="http://www.w3.org/2000/svg" + role="img" + aria-label=[L10n::l("pagetop_logo").lookup(cx)] + preserveAspectRatio="xMidYMid slice" + focusable="false" + { + (path_fills) + } + } + } + + // **< PageTopSvg HELPERS >********************************************************************* + + fn logo_color(&self) -> Markup { + html! { + path fill="rgb(255,184,75)" d="M 633,61 L 633,61 C 579,61 527,75 480,102 433,129 395,167 368,214 341,261 327,313 327,367 L 327,1244 327,1245 C 327,1299 341,1351 368,1398 395,1445 433,1483 480,1510 527,1537 579,1551 633,1551 L 982,1550 982,1551 C 1036,1551 1088,1537 1135,1510 1182,1483 1220,1445 1247,1398 1274,1351 1288,1299 1288,1245 L 1288,367 1288,367 1288,367 C 1288,313 1274,261 1247,214 1220,167 1182,129 1135,102 1088,75 1036,61 982,61 L 633,61 Z" {} + path fill="rgb(158,96,0)" d="M 1389,573 L 1328,573 1328,460 1449,460 1449,573 1389,573 Z M 1491,627 L 1430,627 1430,404 1551,404 1551,627 1491,627 Z M 222,573 L 161,573 161,460 282,460 282,573 222,573 Z M 120,627 L 59,627 59,404 180,404 180,627 120,627 Z" {} + path fill="rgb(150,0,184)" d="M 678,1040 L 678,1040 C 645,1040 612,1049 583,1065 554,1082 530,1106 513,1135 497,1164 488,1197 488,1230 L 488,1230 488,1230 C 488,1263 497,1296 513,1325 530,1354 554,1378 583,1395 612,1411 645,1420 678,1420 L 940,1420 940,1420 C 973,1420 1006,1411 1035,1395 1064,1378 1088,1354 1105,1325 1121,1296 1130,1263 1130,1230 L 1130,1230 1130,1230 1130,1230 C 1130,1197 1121,1164 1105,1135 1088,1106 1064,1082 1035,1065 1006,1049 973,1040 940,1040 L 678,1040 Z M 488,1040 L 488,1040 488,1040 488,1040 488,1040 488,1040 488,1238 488,1238 488,1238 488,1238 488,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1238 1130,1040 1130,1040 1130,1040 1130,1040 1130,1040 488,1040 Z" {} + path fill="rgb(255,255,255)" d="M 518,1128 L 488,1128 488,1066 547,1066 547,1128 518,1128 Z M 966,1128 L 908,1128 908,1066 1024,1066 1024,1128 966,1128 Z" {} + path fill="rgb(221,255,149)" d="M 898,71 C 940,48 987,36 1035,36 1086,36 1137,50 1181,77 1226,104 1263,142 1289,189 1314,236 1328,288 1328,342 1328,396 1314,448 1289,495 1281,509 1272,522 1262,535 L 898,71 Z M 1337,429 C 1307,460 1272,480 1233,488 1192,496 1148,490 1107,470 1066,451 1029,418 999,375 969,332 948,281 938,227 927,173 928,117 940,66 943,51 948,36 953,22 L 1337,429 Z" {} + path fill="rgb(146,128,99)" d="M 703,99 C 717,121 722,149 719,178 715,208 702,238 682,267 661,295 634,320 602,340 571,360 536,373 501,379 467,385 434,383 405,373 377,363 355,346 341,323 327,301 322,273 325,244 329,214 342,184 362,155 383,127 410,102 442,82 473,62 508,49 543,43 577,37 610,39 639,49 667,59 689,76 703,99 L 703,99 Z" {} + path fill="rgb(146,128,99)" d="M 672,550 C 683,568 685,590 678,615 671,640 655,668 632,694 609,720 580,745 547,765 514,785 479,801 446,810 412,819 381,821 355,816 329,811 310,799 299,782 288,765 286,742 293,717 301,692 316,665 339,638 362,612 391,588 424,567 457,547 492,531 526,523 559,514 591,511 616,516 642,521 661,533 672,550 L 672,550 Z" {} + path fill="rgb(146,128,99)" d="M 455,160 L 456,160 C 430,160 404,167 381,180 359,193 340,212 327,234 314,257 307,283 307,309 L 307,580 307,580 C 307,606 314,632 327,655 340,677 359,696 381,709 404,722 430,729 456,729 L 529,729 529,729 C 555,729 581,722 604,709 626,696 645,677 658,655 671,632 678,606 678,580 L 677,308 678,309 678,309 C 678,283 671,257 658,234 645,212 626,193 604,180 581,167 555,160 529,160 L 455,160 Z" {} + path fill="rgb(240,0,0)" d="M 698,1332 L 699,1332 C 696,1332 694,1333 691,1334 689,1335 687,1337 686,1339 685,1342 684,1344 684,1347 L 684,1405 684,1405 C 684,1408 685,1410 686,1413 687,1415 689,1417 691,1418 694,1419 696,1420 699,1420 L 914,1419 914,1420 C 917,1420 919,1419 922,1418 924,1417 926,1415 927,1413 928,1410 929,1408 929,1405 L 929,1346 929,1347 929,1347 C 929,1344 928,1342 927,1339 926,1337 924,1335 922,1334 919,1333 917,1332 914,1332 L 698,1332 Z M 643,780 C 643,797 638,814 630,830 621,845 608,858 593,867 577,875 560,880 543,880 525,880 508,875 492,867 477,858 464,845 455,830 447,814 442,797 442,780 442,762 447,745 455,729 464,714 477,701 492,692 508,684 525,679 542,679 560,679 577,684 593,692 608,701 621,714 630,729 638,745 643,762 643,779 L 643,780 Z M 1171,780 C 1171,797 1166,814 1158,830 1149,845 1136,858 1121,867 1105,875 1088,880 1071,880 1053,880 1036,875 1020,867 1005,858 992,845 983,830 975,814 970,797 970,780 970,762 975,745 983,729 992,714 1005,701 1020,692 1036,684 1053,679 1071,679 1088,679 1105,684 1121,692 1136,701 1149,714 1158,729 1166,745 1171,762 1171,779 L 1171,780 Z" {} + path fill="rgb(10,11,9)" d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill="rgb(10,11,9)" d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill="rgb(10,11,9)" d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} + } + } + + fn logo_line(&self, r: u8, g: u8, b: u8) -> Markup { + let logo_rgb = format!("rgb({r},{g},{b})"); + html! { + path fill=(logo_rgb) d="M 1573,357 L 1415,357 C 1400,357 1388,369 1388,383 L 1388,410 1335,410 1335,357 C 1335,167 1181,13 992,13 L 621,13 C 432,13 278,167 278,357 L 278,410 225,410 225,383 C 225,369 213,357 198,357 L 40,357 C 25,357 13,369 13,383 L 13,648 C 13,662 25,674 40,674 L 198,674 C 213,674 225,662 225,648 L 225,621 278,621 278,1256 C 278,1446 432,1600 621,1600 L 992,1600 C 1181,1600 1335,1446 1335,1256 L 1335,621 1388,621 1388,648 C 1388,662 1400,674 1415,674 L 1573,674 C 1588,674 1600,662 1600,648 L 1600,383 C 1600,369 1588,357 1573,357 L 1573,357 1573,357 Z M 66,410 L 172,410 172,621 66,621 66,410 66,410 Z M 1282,357 L 1282,488 C 1247,485 1213,477 1181,464 L 1196,437 C 1203,425 1199,409 1186,401 1174,394 1158,398 1150,411 L 1133,440 C 1105,423 1079,401 1056,376 L 1075,361 C 1087,352 1089,335 1079,324 1070,313 1054,311 1042,320 L 1023,335 C 1000,301 981,263 967,221 L 1011,196 C 1023,189 1028,172 1021,160 1013,147 997,143 984,150 L 953,168 C 945,136 941,102 940,66 L 992,66 C 1152,66 1282,197 1282,357 L 1282,357 1282,357 Z M 621,66 L 674,66 674,225 648,225 C 633,225 621,237 621,251 621,266 633,278 648,278 L 674,278 674,357 648,357 C 633,357 621,369 621,383 621,398 633,410 648,410 L 674,410 674,489 648,489 C 633,489 621,501 621,516 621,530 633,542 648,542 L 664,542 C 651,582 626,623 600,662 583,653 563,648 542,648 469,648 410,707 410,780 410,787 411,794 412,801 388,805 361,806 331,806 L 331,357 C 331,197 461,66 621,66 L 621,66 621,66 Z M 621,780 C 621,824 586,859 542,859 498,859 463,824 463,780 463,736 498,701 542,701 586,701 621,736 621,780 L 621,780 621,780 Z M 225,463 L 278,463 278,569 225,569 225,463 225,463 Z M 992,1547 L 621,1547 C 461,1547 331,1416 331,1256 L 331,859 C 367,859 400,858 431,851 454,888 495,912 542,912 615,912 674,853 674,780 674,747 662,718 642,695 675,645 706,594 720,542 L 780,542 C 795,542 807,530 807,516 807,501 795,489 780,489 L 727,489 727,410 780,410 C 795,410 807,398 807,383 807,369 795,357 780,357 L 727,357 727,278 780,278 C 795,278 807,266 807,251 807,237 795,225 780,225 L 727,225 727,66 887,66 C 889,111 895,155 905,196 L 869,217 C 856,224 852,240 859,253 864,261 873,266 882,266 887,266 891,265 895,263 L 921,248 C 937,291 958,331 983,367 L 938,403 C 926,412 925,429 934,440 939,447 947,450 954,450 960,450 966,448 971,444 L 1016,408 C 1043,438 1074,465 1108,485 L 1084,527 C 1076,539 1081,555 1093,563 1098,565 1102,566 1107,566 1116,566 1125,561 1129,553 L 1155,509 C 1194,527 1237,538 1282,541 L 1282,1256 C 1282,1416 1152,1547 992,1547 L 992,1547 992,1547 Z M 1335,463 L 1388,463 1388,569 1335,569 1335,463 1335,463 Z M 1441,410 L 1547,410 1547,621 1441,621 1441,410 1441,410 Z" {} + path fill=(logo_rgb) d="M 1150,1018 L 463,1018 C 448,1018 436,1030 436,1044 L 436,1177 C 436,1348 545,1468 701,1468 L 912,1468 C 1068,1468 1177,1348 1177,1177 L 1177,1044 C 1177,1030 1165,1018 1150,1018 L 1150,1018 1150,1018 Z M 912,1071 L 1018,1071 1018,1124 912,1124 912,1071 912,1071 Z M 489,1071 L 542,1071 542,1124 489,1124 489,1071 489,1071 Z M 701,1415 L 700,1415 C 701,1385 704,1352 718,1343 731,1335 759,1341 795,1359 802,1363 811,1363 818,1359 854,1341 882,1335 895,1343 909,1352 912,1385 913,1415 L 912,1415 701,1415 701,1415 701,1415 Z M 1124,1177 C 1124,1296 1061,1384 966,1408 964,1365 958,1320 922,1298 894,1281 856,1283 807,1306 757,1283 719,1281 691,1298 655,1320 649,1365 647,1408 552,1384 489,1296 489,1177 L 569,1177 C 583,1177 595,1165 595,1150 L 595,1071 859,1071 859,1150 C 859,1165 871,1177 886,1177 L 1044,1177 C 1059,1177 1071,1165 1071,1150 L 1071,1071 1124,1071 1124,1177 1124,1177 1124,1177 Z" {} + path fill=(logo_rgb) d="M 1071,648 C 998,648 939,707 939,780 939,853 998,912 1071,912 1144,912 1203,853 1203,780 1203,707 1144,648 1071,648 L 1071,648 1071,648 Z M 1071,859 C 1027,859 992,824 992,780 992,736 1027,701 1071,701 1115,701 1150,736 1150,780 1150,824 1115,859 1071,859 L 1071,859 1071,859 Z" {} + } + } +} diff --git a/src/prelude.rs b/src/prelude.rs index cd3191f6..377dcdfd 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -33,8 +33,8 @@ pub use crate::trace; // alias obsoletos se volverá a declarar como `pub use crate::html::*;`. pub use crate::html::{ display, html_private, Asset, Assets, AttrClasses, AttrId, AttrL10n, AttrName, AttrValue, - ClassesOp, Escaper, Favicon, JavaScript, Markup, PreEscaped, PrepareMarkup, StyleSheet, - TargetMedia, UnitValue, DOCTYPE, + ClassesOp, Escaper, Favicon, JavaScript, Markup, PageTopSvg, PreEscaped, PrepareMarkup, + StyleSheet, TargetMedia, UnitValue, DOCTYPE, }; pub use crate::locale::*; diff --git a/static/css/intro.css b/static/css/intro.css index 17ab5bef..dbc72252 100644 --- a/static/css/intro.css +++ b/static/css/intro.css @@ -103,9 +103,10 @@ width: 100%; } .intro-header__monster { - margin-right: 12rem; - margin-top: 1rem; + margin: 2rem; flex-shrink: 1; + width: 280px; + height: 280px; } @media (min-width: 64rem) { .intro-header { @@ -118,6 +119,9 @@ .intro-header__image { justify-content: flex-end; } + .intro-header__monster { + margin-right: 12rem; + } } /* diff --git a/static/img/monster-pagetop_250.avif b/static/img/monster-pagetop_250.avif deleted file mode 100644 index df864b85c67c980d485216b1ef18737713114554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10834 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 diff --git a/static/img/monster-pagetop_250.png b/static/img/monster-pagetop_250.png deleted file mode 100644 index baa7d1f895f60e0966aa09e926922e653ef469f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32018 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 diff --git a/static/img/monster-pagetop_250.webp b/static/img/monster-pagetop_250.webp deleted file mode 100644 index dcc5ef26308dd2f26d1e9c2c1c688f750d544984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12090 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 YceFZN(cAxq=dFKgq5Ge|ng6l>1Gp;yN&o-= diff --git a/static/img/monster-pagetop_500.avif b/static/img/monster-pagetop_500.avif deleted file mode 100644 index d07f359de0e7a7c5d1d9378c55a8819a257838ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20876 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 LA51~|H)nvri_}K9 diff --git a/static/img/monster-pagetop_500.png b/static/img/monster-pagetop_500.png deleted file mode 100644 index d0b9e0b1399bf5939bd0e0f784f3105d4c52d0b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80504 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 diff --git a/static/img/monster-pagetop_500.webp b/static/img/monster-pagetop_500.webp deleted file mode 100644 index 18896fe50ed014ffe5571b8d0a115b755d63823e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22974 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 F006P8s)7Ij From c3fd566025cfa53d14d58582e15ae91d763b74d9 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 26 Oct 2025 09:18:33 +0100 Subject: [PATCH 837/853] =?UTF-8?q?=E2=9C=A8=20(bootsier):=20A=C3=B1ade=20?= =?UTF-8?q?componente=20`Image`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/src/theme.rs | 5 +- .../pagetop-bootsier/src/theme/container.rs | 6 +- .../pagetop-bootsier/src/theme/image.rs | 189 +---------------- .../src/theme/image/component.rs | 194 ++++++++++++++++++ .../pagetop-bootsier/src/theme/image/props.rs | 53 +++++ 5 files changed, 258 insertions(+), 189 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/theme/image/component.rs create mode 100644 extensions/pagetop-bootsier/src/theme/image/props.rs diff --git a/extensions/pagetop-bootsier/src/theme.rs b/extensions/pagetop-bootsier/src/theme.rs index b5be6b71..ece34f06 100644 --- a/extensions/pagetop-bootsier/src/theme.rs +++ b/extensions/pagetop-bootsier/src/theme.rs @@ -12,8 +12,9 @@ pub mod dropdown; pub use dropdown::Dropdown; // Image. -mod image; -pub use image::{Image, ImageSize}; +pub mod image; +#[doc(inline)] +pub use image::Image; // Navbar. pub mod navbar; diff --git a/extensions/pagetop-bootsier/src/theme/container.rs b/extensions/pagetop-bootsier/src/theme/container.rs index 22f7fc6c..17512505 100644 --- a/extensions/pagetop-bootsier/src/theme/container.rs +++ b/extensions/pagetop-bootsier/src/theme/container.rs @@ -234,7 +234,7 @@ impl Container { self } - /// Establece esquinas redondeadas para el contenedor. + /// Establece esquinas redondeadas para el contenedor ([`Rounded`]). #[builder_fn] pub fn with_rounded(mut self, rounded: Rounded) -> Self { self.rounded = rounded; @@ -282,12 +282,12 @@ impl Container { &self.text_color } - /// Devuelve el borde del contenedor. + /// Devuelve el borde configurado del contenedor. pub fn border(&self) -> &Border { &self.border } - /// Devuelve las esquinas redondeadas del contenedor. + /// Devuelve las esquinas redondeadas configuradas para el contenedor. pub fn rounded(&self) -> &Rounded { &self.rounded } diff --git a/extensions/pagetop-bootsier/src/theme/image.rs b/extensions/pagetop-bootsier/src/theme/image.rs index 6c602780..837d25a1 100644 --- a/extensions/pagetop-bootsier/src/theme/image.rs +++ b/extensions/pagetop-bootsier/src/theme/image.rs @@ -1,186 +1,7 @@ -use pagetop::prelude::*; +//! Definiciones para renderizar imágenes ([`Image`]). -use crate::prelude::*; +mod props; +pub use props::{Size, Source}; -#[derive(AutoDefault)] -pub enum ImageSource { - #[default] - //Logo(PageTopLogo), - Responsive(String), - Thumbnail(String), - Static(String), -} - -#[derive(AutoDefault)] -pub enum ImageSize { - #[default] - Auto, - Dimensions(UnitValue, UnitValue), - Width(UnitValue), - Height(UnitValue), - Both(UnitValue), -} - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Image { - id : AttrId, - classes: AttrClasses, - source : ImageSource, - alt : AttrL10n, - size : ImageSize, - border : Border, - rounded: Rounded, -} - -impl Component for Image { - fn new() -> Self { - Image::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - [ - String::from(match self.source() { - //ImageSource::Logo(_) => "img-fluid", - ImageSource::Responsive(_) => "img-fluid", - ImageSource::Thumbnail(_) => "img-thumbnail", - _ => "", - }), - self.border().to_string(), - self.rounded().to_string(), - ] - .join(" "), - ); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let dimensions = match self.size() { - ImageSize::Auto => None, - ImageSize::Dimensions(w, h) => { - let w = w.to_string(); - let h = h.to_string(); - Some(join!("width: ", w, "; height: ", h, ";")) - } - ImageSize::Width(w) => { - let w = w.to_string(); - Some(join!("width: ", w, ";")) - } - ImageSize::Height(h) => { - let h = h.to_string(); - Some(join!("height: ", h, ";")) - } - ImageSize::Both(v) => { - let v = v.to_string(); - Some(join!("width: ", v, "; height: ", v, ";")) - } - }; - let source = match self.source() { - /* - ImageSource::Logo(logo) => { - return PrepareMarkup::With(html! { - span - id=[self.id()] - class=[self.classes().get()] - style=[dimensions] - { - (logo.render(cx)) - } - }) - } - */ - ImageSource::Responsive(source) => Some(source), - ImageSource::Thumbnail(source) => Some(source), - ImageSource::Static(source) => Some(source), - }; - PrepareMarkup::With(html! { - img - src=[source] - alt=[self.alternative().lookup(cx)] - id=[self.id()] - class=[self.classes().get()] - style=[dimensions] {} - }) - } -} - -impl Image { - pub fn with(source: ImageSource) -> Self { - Image::default().with_source(source) - } - - // **< Image BUILDER >************************************************************************** - - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - #[builder_fn] - pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { - self.classes.alter_value(op, classes); - self - } - - #[builder_fn] - pub fn with_source(mut self, source: ImageSource) -> Self { - self.source = source; - self - } - - #[builder_fn] - pub fn with_alternative(mut self, alt: L10n) -> Self { - self.alt.alter_value(alt); - self - } - - #[builder_fn] - pub fn with_size(mut self, size: ImageSize) -> Self { - self.size = size; - self - } - - #[builder_fn] - pub fn with_border(mut self, border: Border) -> Self { - self.border = border; - self - } - - #[builder_fn] - pub fn with_rounded(mut self, rounded: Rounded) -> Self { - self.rounded = rounded; - self - } - - // **< Image GETTERS >************************************************************************** - - pub fn classes(&self) -> &AttrClasses { - &self.classes - } - - pub fn source(&self) -> &ImageSource { - &self.source - } - - pub fn alternative(&self) -> &AttrL10n { - &self.alt - } - - pub fn size(&self) -> &ImageSize { - &self.size - } - - pub fn border(&self) -> &Border { - &self.border - } - - pub fn rounded(&self) -> &Rounded { - &self.rounded - } -} +mod component; +pub use component::Image; diff --git a/extensions/pagetop-bootsier/src/theme/image/component.rs b/extensions/pagetop-bootsier/src/theme/image/component.rs new file mode 100644 index 00000000..0345adb2 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/image/component.rs @@ -0,0 +1,194 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +/// Componente para renderizar una **imagen**. +/// +/// - Ajusta su disposición según el origen definido en [`image::Source`]. +/// - Permite configurar **dimensiones** ([`with_size()`](Self::with_size)), **borde** +/// ([`with_border()`](Self::with_border)) y **redondeo de esquinas** +/// ([`with_rounded()`](Self::with_rounded)). +/// - Resuelve el texto alternativo `alt` con **localización** mediante [`L10n`]. +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Image { + id : AttrId, + classes: AttrClasses, + size : image::Size, + source : image::Source, + alt : AttrL10n, + border : Border, + rounded: Rounded, +} + +impl Component for Image { + fn new() -> Self { + Image::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [ + String::from(match self.source() { + image::Source::Logo(_) => "img-fluid", + image::Source::Responsive(_) => "img-fluid", + image::Source::Thumbnail(_) => "img-thumbnail", + image::Source::Plain(_) => "", + }), + self.border().to_string(), + self.rounded().to_string(), + ] + .join(" "), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let dimensions = match self.size() { + image::Size::Auto => None, + image::Size::Dimensions(w, h) => { + let w = w.to_string(); + let h = h.to_string(); + Some(join!("width: ", w, "; height: ", h, ";")) + } + image::Size::Width(w) => { + let w = w.to_string(); + Some(join!("width: ", w, ";")) + } + image::Size::Height(h) => { + let h = h.to_string(); + Some(join!("height: ", h, ";")) + } + image::Size::Both(v) => { + let v = v.to_string(); + Some(join!("width: ", v, "; height: ", v, ";")) + } + }; + let alt_text = self.alternative().lookup(cx).unwrap_or_default(); + let is_decorative = alt_text.is_empty(); + let source = match self.source() { + image::Source::Logo(logo) => { + return PrepareMarkup::With(html! { + span + id=[self.id()] + class=[self.classes().get()] + style=[dimensions] + role=[(!is_decorative).then_some("img")] + aria-label=[(!is_decorative).then_some(alt_text)] + aria-hidden=[is_decorative.then_some("true")] + { + (logo.render(cx)) + } + }) + } + image::Source::Responsive(source) => Some(source), + image::Source::Thumbnail(source) => Some(source), + image::Source::Plain(source) => Some(source), + }; + PrepareMarkup::With(html! { + img + src=[source] + alt=(alt_text) + id=[self.id()] + class=[self.classes().get()] + style=[dimensions] {} + }) + } +} + +impl Image { + /// Crea rápidamente una imagen especificando su origen. + pub fn with(source: image::Source) -> Self { + Image::default().with_source(source) + } + + // **< Image BUILDER >************************************************************************** + + /// Establece el identificador único (`id`) de la imagen. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas a la imagen. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Define las dimensiones de la imagen (auto, ancho/alto, ambos). + #[builder_fn] + pub fn with_size(mut self, size: image::Size) -> Self { + self.size = size; + self + } + + /// Establece el origen de la imagen, influyendo en su disposición en el contenido. + #[builder_fn] + pub fn with_source(mut self, source: image::Source) -> Self { + self.source = source; + self + } + + /// Define el texto alternativo localizado ([`L10n`]) para la imagen. + /// + /// Se recomienda siempre aportar un texto alternativo salvo que la imagen sea puramente + /// decorativa. + #[builder_fn] + pub fn with_alternative(mut self, alt: L10n) -> Self { + self.alt.alter_value(alt); + self + } + + /// Establece el borde de la imagen ([`Border`]). + #[builder_fn] + pub fn with_border(mut self, border: Border) -> Self { + self.border = border; + self + } + + /// Establece esquinas redondeadas para la imagen ([`Rounded`]). + #[builder_fn] + pub fn with_rounded(mut self, rounded: Rounded) -> Self { + self.rounded = rounded; + self + } + + // **< Image GETTERS >************************************************************************** + + /// Devuelve las clases CSS asociadas a la imagen. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve las dimensiones de la imagen. + pub fn size(&self) -> &image::Size { + &self.size + } + + /// Devuelve el origen de la imagen. + pub fn source(&self) -> &image::Source { + &self.source + } + + /// Devuelve el texto alternativo localizado. + pub fn alternative(&self) -> &AttrL10n { + &self.alt + } + + /// Devuelve el borde configurado de la imagen. + pub fn border(&self) -> &Border { + &self.border + } + + /// Devuelve las esquinas redondeadas configuradas para la imagen. + pub fn rounded(&self) -> &Rounded { + &self.rounded + } +} diff --git a/extensions/pagetop-bootsier/src/theme/image/props.rs b/extensions/pagetop-bootsier/src/theme/image/props.rs new file mode 100644 index 00000000..f871de70 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/image/props.rs @@ -0,0 +1,53 @@ +use pagetop::prelude::*; + +// **< Size >*************************************************************************************** + +/// Define las **dimensiones** de una imagen ([`Image`](crate::theme::Image)). +#[derive(AutoDefault)] +pub enum Size { + /// Ajuste automático por defecto. + /// + /// La imagen usa su tamaño natural o se ajusta al contenedor donde se publica. + #[default] + Auto, + /// Establece explícitamente el **ancho y alto** de la imagen. + /// + /// Útil cuando se desea fijar ambas dimensiones de forma exacta. Ten en cuenta que la imagen + /// puede distorsionarse si no se mantiene la proporción original. + Dimensions(UnitValue, UnitValue), + /// Establece sólo el **ancho** de la imagen. + /// + /// La altura se ajusta proporcionalmente de manera automática. + Width(UnitValue), + /// Establece sólo la **altura** de la imagen. + /// + /// El ancho se ajusta proporcionalmente de manera automática. + Height(UnitValue), + /// Establece **el mismo valor** para el ancho y el alto de la imagen. + /// + /// Práctico para forzar rápidamente un área cuadrada. Ten en cuenta que la imagen puede + /// distorsionarse si la original no es cuadrada. + Both(UnitValue), +} + +// **< Source >************************************************************************************* + +/// Especifica la **fuente** para publicar una imagen ([`Image`](crate::theme::Image)). +#[derive(AutoDefault)] +pub enum Source { + /// Imagen con el logotipo de PageTop. + #[default] + Logo(PageTopSvg), + /// Imagen que se adapta automáticamente a su contenedor. + /// + /// El `String` asociado es la URL (o ruta) de la imagen. + Responsive(String), + /// Imagen que aplica el estilo **miniatura** de Bootstrap. + /// + /// El `String` asociado es la URL (o ruta) de la imagen. + Thumbnail(String), + /// Imagen sin clases específicas de Bootstrap, útil para controlar con CSS propio. + /// + /// El `String` asociado es la URL (o ruta) de la imagen. + Plain(String), +} From 80b18cc38063f5de790e1d2d7a888785d3fb25a2 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Wed, 29 Oct 2025 13:47:59 +0100 Subject: [PATCH 838/853] =?UTF-8?q?=E2=9C=A8=20(bootsier):=20A=C3=B1ade=20?= =?UTF-8?q?componente=20`Nav`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adapta `Dropdown` para poder integrarlo en los menús `Nav`. - Actualiza `Children` para soportar operaciones múltiples. --- extensions/pagetop-bootsier/src/theme.rs | 5 + .../pagetop-bootsier/src/theme/dropdown.rs | 5 +- .../src/theme/dropdown/component.rs | 32 ++- .../src/theme/dropdown/item.rs | 8 +- extensions/pagetop-bootsier/src/theme/nav.rs | 17 ++ .../src/theme/nav/component.rs | 168 ++++++++++++ .../pagetop-bootsier/src/theme/nav/item.rs | 257 ++++++++++++++++++ .../pagetop-bootsier/src/theme/nav/props.rs | 39 +++ .../pagetop-bootsier/src/theme/navbar.rs | 6 - .../pagetop-bootsier/src/theme/navbar/item.rs | 113 -------- .../pagetop-bootsier/src/theme/navbar/nav.rs | 75 ----- src/core/component/children.rs | 103 ++++++- 12 files changed, 602 insertions(+), 226 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/theme/nav.rs create mode 100644 extensions/pagetop-bootsier/src/theme/nav/component.rs create mode 100644 extensions/pagetop-bootsier/src/theme/nav/item.rs create mode 100644 extensions/pagetop-bootsier/src/theme/nav/props.rs delete mode 100644 extensions/pagetop-bootsier/src/theme/navbar/item.rs delete mode 100644 extensions/pagetop-bootsier/src/theme/navbar/nav.rs diff --git a/extensions/pagetop-bootsier/src/theme.rs b/extensions/pagetop-bootsier/src/theme.rs index ece34f06..d34c0a9f 100644 --- a/extensions/pagetop-bootsier/src/theme.rs +++ b/extensions/pagetop-bootsier/src/theme.rs @@ -16,6 +16,11 @@ pub mod image; #[doc(inline)] pub use image::Image; +// Nav. +pub mod nav; +#[doc(inline)] +pub use nav::Nav; + // Navbar. pub mod navbar; #[doc(inline)] diff --git a/extensions/pagetop-bootsier/src/theme/dropdown.rs b/extensions/pagetop-bootsier/src/theme/dropdown.rs index 02df7fd0..eb00e4c8 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown.rs @@ -1,14 +1,11 @@ //! Definiciones para crear menús desplegables [`Dropdown`]. //! //! Cada [`dropdown::Item`](crate::theme::dropdown::Item) representa un elemento individual del -//! desplegable [`Dropdown`], con distintos comportamientos según su finalidad: enlaces de +//! desplegable [`Dropdown`], con distintos comportamientos según su finalidad, como enlaces de //! navegación, botones de acción, encabezados o divisores visuales. //! //! Los ítems pueden estar activos, deshabilitados o abrirse en nueva ventana según su contexto y //! configuración, y permiten incluir etiquetas localizables usando [`L10n`](pagetop::locale::L10n). -//! -//! Su propósito es ofrecer una base uniforme sobre la que construir menús consistentes, adaptados -//! al contexto de cada aplicación. mod props; pub use props::{AutoClose, Direction, MenuAlign, MenuPosition}; diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index e9d36d7f..984a3e06 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -10,8 +10,12 @@ use crate::LOCALES_BOOTSIER; /// interacción del usuario. Admite variaciones de tamaño/color del botón, también dirección de /// apertura, alineación o política de cierre. /// -/// Sin título para el botón (ver [`with_button_title()`](Self::with_button_title)) se muestra -/// únicamente la lista de elementos sin ningún botón para interactuar. +/// Si no tiene título (ver [`with_title()`](Self::with_title)) se muestra únicamente la lista de +/// elementos sin ningún botón para interactuar. +/// +/// Si este componente se usa en un menú [`Nav`] (ver [`nav::Item::dropdown()`]) sólo se tendrán en +/// cuenta **el título** (si no existe le asigna uno por defecto) y **la lista de elementos**; el +/// resto de propiedades no afectarán a su representación en [`Nav`]. /// /// # Ejemplo /// @@ -19,7 +23,7 @@ use crate::LOCALES_BOOTSIER; /// # use pagetop::prelude::*; /// # use pagetop_bootsier::prelude::*; /// let dd = Dropdown::new() -/// .with_button_title(L10n::n("Menu")) +/// .with_title(L10n::n("Menu")) /// .with_button_color(ButtonColor::Background(Color::Secondary)) /// .with_auto_close(dropdown::AutoClose::ClickableInside) /// .with_direction(dropdown::Direction::Dropend) @@ -34,7 +38,7 @@ use crate::LOCALES_BOOTSIER; pub struct Dropdown { id : AttrId, classes : AttrClasses, - button_title : L10n, + title : L10n, button_size : ButtonSize, button_color : ButtonColor, button_split : bool, @@ -80,11 +84,11 @@ impl Component for Dropdown { } // Título opcional para el menú desplegable. - let button_title = self.button_title().using(cx); + let title = self.title().using(cx); PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { - @if !button_title.is_empty() { + @if !title.is_empty() { @let mut btn_classes = AttrClasses::new([ "btn", &self.button_size().to_string(), @@ -129,7 +133,7 @@ impl Component for Dropdown { type="button" class=[btn_classes.get()] { - (button_title) + (title) } }; // Botón *toggle* que abre/cierra el menú asociado. @@ -176,7 +180,7 @@ impl Component for Dropdown { data-bs-auto-close=[auto_close] aria-expanded="false" { - (button_title) + (title) } ul class=[menu_classes.get()] { (items) } } @@ -206,10 +210,10 @@ impl Dropdown { self } - /// Establece el título del botón. + /// Establece el título del menú desplegable. #[builder_fn] - pub fn with_button_title(mut self, title: L10n) -> Self { - self.button_title = title; + pub fn with_title(mut self, title: L10n) -> Self { + self.title = title; self } @@ -290,9 +294,9 @@ impl Dropdown { &self.classes } - /// Devuelve el título del botón. - pub fn button_title(&self) -> &L10n { - &self.button_title + /// Devuelve el título del menú desplegable. + pub fn title(&self) -> &L10n { + &self.title } /// Devuelve el tamaño configurado del botón. diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs index 548024c5..1aed83b4 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs @@ -41,7 +41,7 @@ pub enum ItemKind { /// [`ItemKind`]. /// /// Permite definir identificador, clases de estilo adicionales o tipo de interacción asociada, -/// manteniendo una interfaz común para renderizar todos los ítems del menú. +/// manteniendo una interfaz común para renderizar todos los elementos del menú. #[rustfmt::skip] #[derive(AutoDefault)] pub struct Item { @@ -79,7 +79,7 @@ impl Component for Item { } => { let path = path(cx); let current_path = cx.request().map(|request| request.path()); - let is_current = !*disabled && current_path.map(|p| p == path).unwrap_or(false); + let is_current = !*disabled && current_path.map_or(false, |p| p == path); let mut classes = "dropdown-item".to_string(); if is_current { @@ -200,7 +200,7 @@ impl Item { } } - /// Crea un enlace deshabilitado que se abriría en una nueva ventana. + /// Crea un enlace inicialmente deshabilitado que se abriría en una nueva ventana. pub fn link_blank_disabled(label: L10n, path: FnPathByContext) -> Self { Item { item_kind: ItemKind::Link { @@ -274,7 +274,7 @@ impl Item { &self.classes } - /// Devuelve el tipo de elemento representado por este ítem. + /// Devuelve el tipo de elemento representado por este elemento. pub fn item_kind(&self) -> &ItemKind { &self.item_kind } diff --git a/extensions/pagetop-bootsier/src/theme/nav.rs b/extensions/pagetop-bootsier/src/theme/nav.rs new file mode 100644 index 00000000..b540c323 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/nav.rs @@ -0,0 +1,17 @@ +//! Definiciones para crear menús [`Nav`] o alguna de sus variantes de presentación. +//! +//! Cada [`nav::Item`](crate::theme::nav::Item) representa un elemento individual del menú [`Nav`], +//! con distintos comportamientos según su finalidad, como enlaces de navegación o menús +//! desplegables [`Dropdown`](crate::theme::Dropdown). +//! +//! Los ítems pueden estar activos, deshabilitados o abrirse en nueva ventana según su contexto y +//! configuración, y permiten incluir etiquetas localizables usando [`L10n`](pagetop::locale::L10n). + +mod props; +pub use props::{Kind, Layout}; + +mod component; +pub use component::Nav; + +mod item; +pub use item::{Item, ItemKind}; diff --git a/extensions/pagetop-bootsier/src/theme/nav/component.rs b/extensions/pagetop-bootsier/src/theme/nav/component.rs new file mode 100644 index 00000000..34c33b94 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/nav/component.rs @@ -0,0 +1,168 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +/// Componente para crear un **menú** o alguna de sus variantes ([`nav::Kind`]). +/// +/// Presenta un menú con una lista de elementos usando una vista básica, o alguna de sus variantes +/// como *pestañas* (`Tabs`), *botones* (`Pills`) o *subrayado* (`Underline`). También permite +/// controlar su distribución y orientación ([`nav::Layout`](crate::theme::nav::Layout)). +/// +/// # Ejemplo +/// +/// ```rust +/// # use pagetop::prelude::*; +/// # use pagetop_bootsier::prelude::*; +/// let nav = Nav::tabs() +/// .with_layout(nav::Layout::End) +/// .add_item(nav::Item::link(L10n::n("Home"), |_| "/")) +/// .add_item(nav::Item::link_blank(L10n::n("External"), |_| "https://www.google.es")) +/// .add_item(nav::Item::dropdown( +/// Dropdown::new() +/// .with_title(L10n::n("Options")) +/// .with_items(TypedOp::AddMany(vec![ +/// Typed::with(dropdown::Item::link(L10n::n("Action"), |_| "/action")), +/// Typed::with(dropdown::Item::link(L10n::n("Another action"), |_| "/another")), +/// ])), +/// )) +/// .add_item(nav::Item::link_disabled(L10n::n("Disabled"), |_| "#")); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Nav { + id : AttrId, + classes : AttrClasses, + items : Children, + nav_kind : nav::Kind, + nav_layout: nav::Layout, +} + +impl Component for Nav { + fn new() -> Self { + Nav::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [ + "nav", + match self.nav_kind() { + nav::Kind::Default => "", + nav::Kind::Tabs => "nav-tabs", + nav::Kind::Pills => "nav-pills", + nav::Kind::Underline => "nav-underline", + }, + match self.nav_layout() { + nav::Layout::Default => "", + nav::Layout::Start => "justify-content-start", + nav::Layout::Center => "justify-content-center", + nav::Layout::End => "justify-content-end", + nav::Layout::Vertical => "flex-column", + nav::Layout::Fill => "nav-fill", + nav::Layout::Justified => "nav-justified", + }, + ] + .join(" "), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let items = self.items().render(cx); + if items.is_empty() { + return PrepareMarkup::None; + } + + PrepareMarkup::With(html! { + ul id=[self.id()] class=[self.classes().get()] { + (items) + } + }) + } +} + +impl Nav { + /// Crea un `Nav` usando pestañas para los elementos (*Tabs*). + pub fn tabs() -> Self { + Nav::default().with_kind(nav::Kind::Tabs) + } + + /// Crea un `Nav` usando botones para los elementos (*Pills*). + pub fn pills() -> Self { + Nav::default().with_kind(nav::Kind::Pills) + } + + /// Crea un `Nav` usando elementos subrayados (*Underline*). + pub fn underline() -> Self { + Nav::default().with_kind(nav::Kind::Underline) + } + + // **< Nav BUILDER >**************************************************************************** + + /// Establece el identificador único (`id`) del menú. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al menú. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Cambia el estilo del menú (*Tabs*, *Pills*, *Underline* o *Default*). + #[builder_fn] + pub fn with_kind(mut self, kind: nav::Kind) -> Self { + self.nav_kind = kind; + self + } + + /// Selecciona la distribución y orientación del menú. + #[builder_fn] + pub fn with_layout(mut self, layout: nav::Layout) -> Self { + self.nav_layout = layout; + self + } + + /// Añade un nuevo elemento hijo al menú. + pub fn add_item(mut self, item: nav::Item) -> Self { + self.items.add(Child::with(item)); + self + } + + /// Modifica la lista de elementos (`children`) aplicando una operación [`TypedOp`]. + #[builder_fn] + pub fn with_items(mut self, op: TypedOp<nav::Item>) -> Self { + self.items.alter_typed(op); + self + } + + // **< Nav GETTERS >**************************************************************************** + + /// Devuelve las clases CSS asociadas al menú. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el estilo visual seleccionado. + pub fn nav_kind(&self) -> &nav::Kind { + &self.nav_kind + } + + /// Devuelve la distribución y orientación seleccionada. + pub fn nav_layout(&self) -> &nav::Layout { + &self.nav_layout + } + + /// Devuelve la lista de elementos (`children`) del menú. + pub fn items(&self) -> &Children { + &self.items + } +} diff --git a/extensions/pagetop-bootsier/src/theme/nav/item.rs b/extensions/pagetop-bootsier/src/theme/nav/item.rs new file mode 100644 index 00000000..63248f8d --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/nav/item.rs @@ -0,0 +1,257 @@ +use pagetop::prelude::*; + +use crate::prelude::*; +use crate::LOCALES_BOOTSIER; + +// **< ItemKind >*********************************************************************************** + +/// Tipos de [`nav::Item`](crate::theme::nav::Item) disponibles en un menú +/// [`Nav`](crate::theme::Nav). +/// +/// Define internamente la naturaleza del elemento y su comportamiento al mostrarse o interactuar +/// con él. +#[derive(AutoDefault)] +pub enum ItemKind { + /// Elemento vacío, no produce salida. + #[default] + Void, + /// Etiqueta sin comportamiento interactivo. + Label(L10n), + /// Elemento de navegación. Opcionalmente puede abrirse en una nueva ventana y estar + /// inicialmente deshabilitado. + Link { + label: L10n, + path: FnPathByContext, + blank: bool, + disabled: bool, + }, + /// Elemento que despliega un menú [`Dropdown`]. + Dropdown(Typed<Dropdown>), +} + +// **< Item >*************************************************************************************** + +/// Representa un **elemento individual** de un menú [`Nav`](crate::theme::Nav). +/// +/// Cada instancia de [`nav::Item`](crate::theme::nav::Item) se traduce en un componente visible que +/// puede comportarse como texto, enlace, botón o menú desplegable según su [`ItemKind`]. +/// +/// Permite definir identificador, clases de estilo adicionales o tipo de interacción asociada, +/// manteniendo una interfaz común para renderizar todos los elementos del menú. +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Item { + id : AttrId, + classes : AttrClasses, + item_kind: ItemKind, +} + +impl Component for Item { + fn new() -> Self { + Item::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + if matches!(self.item_kind(), ItemKind::Dropdown(_)) { + "nav-item dropdown" + } else { + "nav-item" + }, + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + match self.item_kind() { + ItemKind::Void => PrepareMarkup::None, + + ItemKind::Label(label) => PrepareMarkup::With(html! { + li id=[self.id()] class=[self.classes().get()] { + span { + (label.using(cx)) + } + } + }), + + ItemKind::Link { + label, + path, + blank, + disabled, + } => { + let path = path(cx); + let current_path = cx.request().map(|request| request.path()); + let is_current = !*disabled && current_path.map_or(false, |p| p == path); + + let mut classes = "nav-link".to_string(); + if is_current { + classes.push_str(" active"); + } + if *disabled { + classes.push_str(" disabled"); + } + + let href = (!disabled).then_some(path); + let target = (!disabled && *blank).then_some("_blank"); + let rel = (!disabled && *blank).then_some("noopener noreferrer"); + + let aria_current = (href.is_some() && is_current).then_some("page"); + let aria_disabled = disabled.then_some("true"); + + PrepareMarkup::With(html! { + li id=[self.id()] class=[self.classes().get()] { + a + class=(classes) + href=[href] + target=[target] + rel=[rel] + aria-current=[aria_current] + aria-disabled=[aria_disabled] + { + (label.using(cx)) + } + } + }) + } + + ItemKind::Dropdown(menu) => { + if let Some(dd) = menu.borrow() { + let items = dd.items().render(cx); + if items.is_empty() { + return PrepareMarkup::None; + } + let title = dd.title().lookup(cx).unwrap_or_else(|| { + L10n::t("dropdown", &LOCALES_BOOTSIER) + .lookup(cx) + .unwrap_or_else(|| "Dropdown".to_string()) + }); + PrepareMarkup::With(html! { + li id=[self.id()] class=[self.classes().get()] { + a + class="nav-link dropdown-toggle" + data-bs-toggle="dropdown" + href="#" + role="button" + aria-expanded="false" + { + (title) + } + ul class="dropdown-menu" { + (items) + } + } + }) + } else { + PrepareMarkup::None + } + } + } + } +} + +impl Item { + /// Crea un elemento de tipo texto, mostrado sin interacción. + pub fn label(label: L10n) -> Self { + Item { + item_kind: ItemKind::Label(label), + ..Default::default() + } + } + + /// Crea un enlace para la navegación. + pub fn link(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::Link { + label, + path, + blank: false, + disabled: false, + }, + ..Default::default() + } + } + + /// Crea un enlace deshabilitado que no permite la interacción. + pub fn link_disabled(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::Link { + label, + path, + blank: false, + disabled: true, + }, + ..Default::default() + } + } + + /// Crea un enlace que se abre en una nueva ventana o pestaña. + pub fn link_blank(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::Link { + label, + path, + blank: true, + disabled: false, + }, + ..Default::default() + } + } + + /// Crea un enlace inicialmente deshabilitado que se abriría en una nueva ventana. + pub fn link_blank_disabled(label: L10n, path: FnPathByContext) -> Self { + Item { + item_kind: ItemKind::Link { + label, + path, + blank: true, + disabled: true, + }, + ..Default::default() + } + } + + /// Crea un elemento de navegación que contiene un menú desplegable [`Dropdown`]. + /// + /// Sólo se tienen en cuenta **el título** (si no existe le asigna uno por defecto) y **la lista + /// de elementos** del [`Dropdown`]; el resto de propiedades del componente no afectarán a su + /// representación en [`Nav`]. + pub fn dropdown(menu: Dropdown) -> Self { + Item { + item_kind: ItemKind::Dropdown(Typed::with(menu)), + ..Default::default() + } + } + + // **< Item BUILDER >*************************************************************************** + + /// Establece el identificador único (`id`) del elemento. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al elemento. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + // **< Item GETTERS >*************************************************************************** + + /// Devuelve las clases CSS asociadas al elemento. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el tipo de elemento representado por este elemento. + pub fn item_kind(&self) -> &ItemKind { + &self.item_kind + } +} diff --git a/extensions/pagetop-bootsier/src/theme/nav/props.rs b/extensions/pagetop-bootsier/src/theme/nav/props.rs new file mode 100644 index 00000000..bd8ac1e1 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/nav/props.rs @@ -0,0 +1,39 @@ +use pagetop::prelude::*; + +// **< Kind >*************************************************************************************** + +/// Define la variante de presentación de un menú [`Nav`](crate::theme::Nav). +#[derive(AutoDefault)] +pub enum Kind { + /// Estilo por defecto, lista de enlaces flexible y minimalista. + #[default] + Default, + /// Pestañas con borde para cambiar entre secciones. + Tabs, + /// Botones con fondo que resaltan el elemento activo. + Pills, + /// Variante con subrayado del elemento activo, estética ligera. + Underline, +} + +// **< Layout >************************************************************************************* + +/// Distribución y orientación de un menú [`Nav`](crate::theme::Nav). +#[derive(AutoDefault)] +pub enum Layout { + /// Comportamiento por defecto, ancho definido por el contenido y sin alineación forzada. + #[default] + Default, + /// Alinea los elementos al inicio de la fila. + Start, + /// Centra horizontalmente los elementos. + Center, + /// Alinea los elementos al final de la fila. + End, + /// Apila los elementos en columna. + Vertical, + /// Los elementos se expanden para rellenar la fila. + Fill, + /// Todos los elementos ocupan el mismo ancho rellenando la fila. + Justified, +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar.rs b/extensions/pagetop-bootsier/src/theme/navbar.rs index 3745b116..72a3af3d 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar.rs @@ -9,9 +9,3 @@ pub use content::{Content, ContentType}; mod brand; pub use brand::Brand; - -mod nav; -pub use nav::Nav; - -mod item; -pub use item::{Item, ItemType}; diff --git a/extensions/pagetop-bootsier/src/theme/navbar/item.rs b/extensions/pagetop-bootsier/src/theme/navbar/item.rs deleted file mode 100644 index 08a2aeee..00000000 --- a/extensions/pagetop-bootsier/src/theme/navbar/item.rs +++ /dev/null @@ -1,113 +0,0 @@ -use pagetop::prelude::*; - -use crate::theme::Dropdown; - -type Label = L10n; - -#[derive(AutoDefault)] -pub enum ItemType { - #[default] - Void, - Label(Label), - Link(Label, FnPathByContext), - LinkBlank(Label, FnPathByContext), - Dropdown(Typed<Dropdown>), -} - -// Item. - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Item { - item_type: ItemType, -} - -impl Component for Item { - fn new() -> Self { - Item::default() - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let description: Option<String> = None; - - // Obtiene la URL actual desde `cx.request`. - let current_path = cx.request().map(|request| request.path()); - - match self.item_type() { - ItemType::Void => PrepareMarkup::None, - ItemType::Label(label) => PrepareMarkup::With(html! { - li class="nav-item" { - span title=[description] { - //(left_icon) - (label.using(cx)) - //(right_icon) - } - } - }), - ItemType::Link(label, path) => { - let item_path = path(cx); - let (class, aria) = if current_path == Some(item_path) { - ("nav-item active", Some("page")) - } else { - ("nav-item", None) - }; - PrepareMarkup::With(html! { - li class=(class) aria-current=[aria] { - a class="nav-link" href=(item_path) title=[description] { - //(left_icon) - (label.using(cx)) - //(right_icon) - } - } - }) - } - ItemType::LinkBlank(label, path) => { - let item_path = path(cx); - let (class, aria) = if current_path == Some(item_path) { - ("nav-item active", Some("page")) - } else { - ("nav-item", None) - }; - PrepareMarkup::With(html! { - li class=(class) aria-current=[aria] { - a class="nav-link" href=(item_path) title=[description] target="_blank" { - //(left_icon) - (label.using(cx)) - //(right_icon) - } - } - }) - } - ItemType::Dropdown(menu) => PrepareMarkup::With(html! { (menu.render(cx)) }), - } - } -} - -impl Item { - pub fn label(label: L10n) -> Self { - Item { - item_type: ItemType::Label(label), - ..Default::default() - } - } - - pub fn link(label: L10n, path: FnPathByContext) -> Self { - Item { - item_type: ItemType::Link(label, path), - ..Default::default() - } - } - - pub fn link_blank(label: L10n, path: FnPathByContext) -> Self { - Item { - item_type: ItemType::LinkBlank(label, path), - ..Default::default() - } - } - - // Item GETTERS. - - pub fn item_type(&self) -> &ItemType { - &self.item_type - } -} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/nav.rs b/extensions/pagetop-bootsier/src/theme/navbar/nav.rs deleted file mode 100644 index bc03a291..00000000 --- a/extensions/pagetop-bootsier/src/theme/navbar/nav.rs +++ /dev/null @@ -1,75 +0,0 @@ -use pagetop::prelude::*; - -use crate::theme::navbar; - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Nav { - id : AttrId, - classes: AttrClasses, - items : Children, -} - -impl Component for Nav { - fn new() -> Self { - Nav::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes(ClassesOp::Prepend, "navbar-nav"); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let items = self.items().render(cx); - if items.is_empty() { - return PrepareMarkup::None; - } - - PrepareMarkup::With(html! { - ul id=[self.id()] class=[self.classes().get()] { - (items) - } - }) - } -} - -impl Nav { - // Nav BUILDER. - - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - #[builder_fn] - pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { - self.classes.alter_value(op, classes); - self - } - - pub fn with_item(mut self, item: navbar::Item) -> Self { - self.items.add(Child::with(item)); - self - } - - #[builder_fn] - pub fn with_items(mut self, op: TypedOp<navbar::Item>) -> Self { - self.items.alter_typed(op); - self - } - - // Nav GETTERS. - - pub fn classes(&self) -> &AttrClasses { - &self.classes - } - - pub fn items(&self) -> &Children { - &self.items - } -} diff --git a/src/core/component/children.rs b/src/core/component/children.rs index c0c8841e..3b8f2abf 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -4,6 +4,9 @@ use crate::{builder_fn, AutoDefault, UniqueId}; use parking_lot::RwLock; +pub use parking_lot::RwLockReadGuard as ComponentReadGuard; +pub use parking_lot::RwLockWriteGuard as ComponentWriteGuard; + use std::sync::Arc; use std::vec::IntoIter; @@ -93,6 +96,57 @@ impl<C: Component> Typed<C> { self.0.as_ref().and_then(|c| c.read().id()) } + /// Devuelve una **referencia inmutable** al componente interno. + /// + /// - Devuelve `Some(ComponentReadGuard<C>)` si existe el componente, o `None` si está vacío. + /// - Permite realizar **múltiples lecturas concurrentes**. + /// - Mientras el *guard* esté activo, no se pueden realizar escrituras concurrentes (ver + /// [`borrow_mut`](Self::borrow_mut)). + /// - Se recomienda mantener el *guard* **el menor tiempo posible** para evitar bloqueos + /// innecesarios. + /// + /// # Ejemplo + /// + /// Lectura del nombre del componente: + /// + /// ```rust + /// # use pagetop::prelude::*; + /// let typed = Typed::with(Html::with(|_| html! { "Prueba" })); + /// { + /// if let Some(component) = typed.borrow() { + /// assert_eq!(component.name(), "Html"); + /// } + /// }; // El *guard* se libera aquí, antes del *drop* de `typed`. + /// ``` + pub fn borrow(&self) -> Option<ComponentReadGuard<'_, C>> { + self.0.as_ref().map(|a| a.read()) + } + + /// Obtiene una **referencia mutable exclusiva** al componente interno. + /// + /// - Devuelve `Some(ComponentWriteGuard<C>)` si existe el componente, o `None` si está vacío. + /// - **Exclusivo**: mientras el *guard* esté activo, no habrá otros lectores ni escritores. + /// - Usar sólo para operaciones que **modifican** el estado interno. + /// - Igual que con [`borrow`](Self::borrow), se recomienda mantener el *guard* en un **ámbito + /// reducido**. + /// + /// # Ejemplo + /// + /// Acceso mutable (ámbito corto): + /// + /// ```rust + /// # use pagetop::prelude::*; + /// let typed = Typed::with(Block::new().with_title(L10n::n("Título"))); + /// { + /// if let Some(mut component) = typed.borrow_mut() { + /// component.alter_title(L10n::n("Nuevo título")); + /// } + /// }; // El *guard* se libera aquí, antes del *drop* de `typed`. + /// ``` + pub fn borrow_mut(&self) -> Option<ComponentWriteGuard<'_, C>> { + self.0.as_ref().map(|a| a.write()) + } + // **< Typed RENDER >*************************************************************************** /// Renderiza el componente con el contexto proporcionado. @@ -102,9 +156,9 @@ impl<C: Component> Typed<C> { // **< Typed HELPERS >************************************************************************** - // Convierte el componente tipado en un [`Child`]. + // Método interno para convertir un componente tipado en un [`Child`]. #[inline] - fn into_child(self) -> Child { + fn into(self) -> Child { if let Some(c) = &self.0 { Child(Some(c.clone())) } else { @@ -115,12 +169,14 @@ impl<C: Component> Typed<C> { // ************************************************************************************************* -/// Operaciones con un componente hijo [`Child`] en una lista [`Children`]. +/// Operaciones para componentes hijo [`Child`] en una lista [`Children`]. pub enum ChildOp { Add(Child), + AddMany(Vec<Child>), InsertAfterId(&'static str, Child), InsertBeforeId(&'static str, Child), Prepend(Child), + PrependMany(Vec<Child>), RemoveById(&'static str), ReplaceById(&'static str, Child), Reset, @@ -129,9 +185,11 @@ pub enum ChildOp { /// Operaciones con un componente hijo tipado [`Typed<C>`] en una lista [`Children`]. pub enum TypedOp<C: Component> { Add(Typed<C>), + AddMany(Vec<Typed<C>>), InsertAfterId(&'static str, Typed<C>), InsertBeforeId(&'static str, Typed<C>), Prepend(Typed<C>), + PrependMany(Vec<Typed<C>>), RemoveById(&'static str), ReplaceById(&'static str, Typed<C>), Reset, @@ -172,9 +230,11 @@ impl Children { pub fn with_child(mut self, op: ChildOp) -> Self { match op { ChildOp::Add(any) => self.add(any), + ChildOp::AddMany(many) => self.add_many(many), ChildOp::InsertAfterId(id, any) => self.insert_after_id(id, any), ChildOp::InsertBeforeId(id, any) => self.insert_before_id(id, any), ChildOp::Prepend(any) => self.prepend(any), + ChildOp::PrependMany(many) => self.prepend_many(many), ChildOp::RemoveById(id) => self.remove_by_id(id), ChildOp::ReplaceById(id, any) => self.replace_by_id(id, any), ChildOp::Reset => self.reset(), @@ -183,14 +243,16 @@ impl Children { /// Ejecuta una operación con [`TypedOp`] en la lista. #[builder_fn] - pub fn with_typed<C: Component + Default>(mut self, op: TypedOp<C>) -> Self { + pub fn with_typed<C: Component>(mut self, op: TypedOp<C>) -> Self { match op { - TypedOp::Add(typed) => self.add(typed.into_child()), - TypedOp::InsertAfterId(id, typed) => self.insert_after_id(id, typed.into_child()), - TypedOp::InsertBeforeId(id, typed) => self.insert_before_id(id, typed.into_child()), - TypedOp::Prepend(typed) => self.prepend(typed.into_child()), + TypedOp::Add(typed) => self.add(typed.into()), + TypedOp::AddMany(many) => self.add_many(many.into_iter().map(Typed::<C>::into)), + TypedOp::InsertAfterId(id, typed) => self.insert_after_id(id, typed.into()), + TypedOp::InsertBeforeId(id, typed) => self.insert_before_id(id, typed.into()), + TypedOp::Prepend(typed) => self.prepend(typed.into()), + TypedOp::PrependMany(many) => self.prepend_many(many.into_iter().map(Typed::<C>::into)), TypedOp::RemoveById(id) => self.remove_by_id(id), - TypedOp::ReplaceById(id, typed) => self.replace_by_id(id, typed.into_child()), + TypedOp::ReplaceById(id, typed) => self.replace_by_id(id, typed.into()), TypedOp::Reset => self.reset(), } } @@ -230,7 +292,7 @@ impl Children { /// Devuelve un iterador sobre los componentes hijo con el identificador de tipo ([`UniqueId`]) /// indicado. pub fn iter_by_type_id(&self, type_id: UniqueId) -> impl Iterator<Item = &Child> { - self.0.iter().filter(move |&c| c.type_id() == Some(type_id)) + self.0.iter().filter(move |c| c.type_id() == Some(type_id)) } // **< Children RENDER >************************************************************************ @@ -246,6 +308,16 @@ impl Children { // **< Children HELPERS >*********************************************************************** + // Añade más de un componente hijo al final de la lista (en el orden recibido). + #[inline] + fn add_many<I>(&mut self, iter: I) -> &mut Self + where + I: IntoIterator<Item = Child>, + { + self.0.extend(iter); + self + } + // Inserta un hijo después del componente con el `id` dado, o al final si no se encuentra. #[inline] fn insert_after_id(&mut self, id: impl AsRef<str>, child: Child) -> &mut Self { @@ -275,6 +347,17 @@ impl Children { self } + // Inserta más de un componente hijo al principio de la lista (manteniendo el orden recibido). + #[inline] + fn prepend_many<I>(&mut self, iter: I) -> &mut Self + where + I: IntoIterator<Item = Child>, + { + let buf: Vec<Child> = iter.into_iter().collect(); + self.0.splice(0..0, buf); + self + } + // Elimina el primer hijo con el `id` dado. #[inline] fn remove_by_id(&mut self, id: impl AsRef<str>) -> &mut Self { From 5a00968223c26b1b8de4c2418a44c925b327a972 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 2 Nov 2025 12:40:26 +0100 Subject: [PATCH 839/853] =?UTF-8?q?=E2=9C=A8=20(bootsier):=20A=C3=B1ade=20?= =?UTF-8?q?componente=20`Navbar`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/build.rs | 3 +- extensions/pagetop-bootsier/src/lib.rs | 2 +- extensions/pagetop-bootsier/src/theme.rs | 2 +- .../pagetop-bootsier/src/theme/navbar.rs | 139 +++++- .../src/theme/navbar/brand.rs | 105 +++-- .../src/theme/navbar/button_toggler.rs | 73 --- .../src/theme/navbar/component.rs | 421 ++++++++++-------- .../src/theme/navbar/content.rs | 69 --- .../pagetop-bootsier/src/theme/navbar/item.rs | 108 +++++ .../src/theme/navbar/props.rs | 64 +++ .../static/js/bootstrap.bundle.min.js | 7 + .../static/js/bootstrap.bundle.min.js.map | 1 + .../static/js/bootstrap.min.js | 7 - .../static/js/bootstrap.min.js.map | 1 - 14 files changed, 615 insertions(+), 387 deletions(-) delete mode 100644 extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs delete mode 100644 extensions/pagetop-bootsier/src/theme/navbar/content.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/item.rs create mode 100644 extensions/pagetop-bootsier/src/theme/navbar/props.rs create mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js create mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map delete mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.min.js delete mode 100644 extensions/pagetop-bootsier/static/js/bootstrap.min.js.map diff --git a/extensions/pagetop-bootsier/build.rs b/extensions/pagetop-bootsier/build.rs index a96301c5..df7a2750 100644 --- a/extensions/pagetop-bootsier/build.rs +++ b/extensions/pagetop-bootsier/build.rs @@ -13,7 +13,8 @@ fn main() -> std::io::Result<()> { } fn bootstrap_js_files(path: &Path) -> bool { + let bootstrap_js = "bootstrap.bundle.min.js"; // No filtra durante el desarrollo, solo en la compilación "release". env::var("PROFILE").unwrap_or_else(|_| "release".to_string()) != "release" - || path.file_name().is_some_and(|n| n == "bootstrap.min.js") + || path.file_name().is_some_and(|f| f == bootstrap_js) } diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index a0e6c703..6df5341c 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -127,7 +127,7 @@ impl Theme for Bootsier { .with_weight(-90), )) .alter_assets(ContextOp::AddJavaScript( - JavaScript::defer("/bootsier/js/bootstrap.min.js") + JavaScript::defer("/bootsier/js/bootstrap.bundle.min.js") .with_version(BOOTSTRAP_VERSION) .with_weight(-90), )); diff --git a/extensions/pagetop-bootsier/src/theme.rs b/extensions/pagetop-bootsier/src/theme.rs index d34c0a9f..4c547f6a 100644 --- a/extensions/pagetop-bootsier/src/theme.rs +++ b/extensions/pagetop-bootsier/src/theme.rs @@ -24,7 +24,7 @@ pub use nav::Nav; // Navbar. pub mod navbar; #[doc(inline)] -pub use navbar::{Navbar, NavbarToggler}; +pub use navbar::Navbar; // Offcanvas. pub mod offcanvas; diff --git a/extensions/pagetop-bootsier/src/theme/navbar.rs b/extensions/pagetop-bootsier/src/theme/navbar.rs index 72a3af3d..7b958d7f 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar.rs @@ -1,11 +1,136 @@ -mod component; -pub use component::{Navbar, NavbarToggler, NavbarType}; +//! Definiciones para crear barras de navegación [`Navbar`]. +//! +//! Cada [`navbar::Item`](crate::theme::navbar::Item) representa un elemento individual de la barra +//! de navegación [`Navbar`], con distintos comportamientos según su finalidad, como menús +//! [`Nav`](crate::theme::Nav) o textos localizados usando [`L10n`](pagetop::locale::L10n). +//! +//! También puede mostrar una marca de identidad ([`navbar::Brand`](crate::theme::navbar::Brand)) +//! que identifique la compañía, producto o nombre del proyecto asociado a la solución web. +//! +//! # Ejemplos +//! +//! Barra **simple**, sólo con un menú horizontal: +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let navbar = Navbar::simple() +//! .add_item(navbar::Item::nav( +//! Nav::new() +//! .add_item(nav::Item::link(L10n::n("Home"), |_| "/")) +//! .add_item(nav::Item::link(L10n::n("About"), |_| "/about")) +//! .add_item(nav::Item::link(L10n::n("Contact"), |_| "/contact")) +//! )); +//! ``` +//! +//! Barra **colapsable**, con botón de despliegue y contenido en el desplegable cuando colapsa: +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let navbar = Navbar::simple_toggle() +//! .with_expand(BreakPoint::MD) +//! .add_item(navbar::Item::nav( +//! Nav::new() +//! .add_item(nav::Item::link(L10n::n("Home"), |_| "/")) +//! .add_item(nav::Item::link_blank(L10n::n("Docs"), |_| "https://docs.example.com")) +//! .add_item(nav::Item::link(L10n::n("Support"), |_| "/support")) +//! )); +//! ``` +//! +//! Barra con **marca de identidad a la izquierda** y menú a la derecha, típica de una cabecera: +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let brand = navbar::Brand::new() +//! .with_title(L10n::n("PageTop")) +//! .with_path(Some(|_| "/")); +//! +//! let navbar = Navbar::brand_left(brand) +//! .add_item(navbar::Item::nav( +//! Nav::new() +//! .add_item(nav::Item::link(L10n::n("Home"), |_| "/")) +//! .add_item(nav::Item::dropdown( +//! Dropdown::new() +//! .with_title(L10n::n("Tools")) +//! .add_item(dropdown::Item::link(L10n::n("Generator"), |_| "/tools/gen")) +//! .add_item(dropdown::Item::link(L10n::n("Reports"), |_| "/tools/reports")) +//! )) +//! .add_item(nav::Item::link_disabled(L10n::n("Disabled"), |_| "#")) +//! )); +//! ``` +//! +//! Barra con **botón de despliegue a la izquierda** y **marca de identidad a la derecha**: +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let brand = navbar::Brand::new() +//! .with_title(L10n::n("Intranet")) +//! .with_path(Some(|_| "/")); +//! +//! let navbar = Navbar::brand_right(brand) +//! .with_expand(BreakPoint::LG) +//! .add_item(navbar::Item::nav( +//! Nav::pills() +//! .add_item(nav::Item::link(L10n::n("Dashboard"), |_| "/dashboard")) +//! .add_item(nav::Item::link(L10n::n("Users"), |_| "/users")) +//! )); +//! ``` +//! +//! Barra con el **contenido en un *offcanvas***, ideal para dispositivos móviles o menús largos: +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let oc = Offcanvas::new() +//! .with_id("main_offcanvas") +//! .with_title(L10n::n("Main menu")) +//! .with_placement(offcanvas::Placement::Start) +//! .with_backdrop(offcanvas::Backdrop::Enabled); +//! +//! let navbar = Navbar::offcanvas(oc) +//! .add_item(navbar::Item::nav( +//! Nav::new() +//! .add_item(nav::Item::link(L10n::n("Home"), |_| "/")) +//! .add_item(nav::Item::link(L10n::n("Profile"), |_| "/profile")) +//! .add_item(nav::Item::dropdown( +//! Dropdown::new() +//! .with_title(L10n::n("More")) +//! .add_item(dropdown::Item::link(L10n::n("Settings"), |_| "/settings")) +//! .add_item(dropdown::Item::link(L10n::n("Help"), |_| "/help")) +//! )) +//! )); +//! ``` +//! +//! Barra **fija arriba**: +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let brand = navbar::Brand::new() +//! .with_title(L10n::n("Main App")) +//! .with_path(Some(|_| "/")); +//! +//! let navbar = Navbar::brand_left(brand) +//! .with_position(navbar::Position::FixedTop) +//! .add_item(navbar::Item::nav( +//! Nav::new() +//! .add_item(nav::Item::link(L10n::n("Dashboard"), |_| "/")) +//! .add_item(nav::Item::link(L10n::n("Donors"), |_| "/donors")) +//! .add_item(nav::Item::link(L10n::n("Stock"), |_| "/stock")) +//! )); +//! ``` -mod button_toggler; -pub use button_toggler::ButtonToggler; - -mod content; -pub use content::{Content, ContentType}; +mod props; +pub use props::{Layout, Position}; mod brand; pub use brand::Brand; + +mod component; +pub use component::Navbar; + +mod item; +pub use item::Item; diff --git a/extensions/pagetop-bootsier/src/theme/navbar/brand.rs b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs index cfeb45aa..e969b0e4 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/brand.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs @@ -2,16 +2,25 @@ use pagetop::prelude::*; use crate::prelude::*; +/// Marca de identidad para mostrar en una barra de navegación [`Navbar`]. +/// +/// Representa la identidad del sitio con una imagen, título y eslogan: +/// +/// - Si hay URL ([`with_path()`](Self::with_path)), el bloque completo actúa como enlace. Por +/// defecto enlaza a la raíz del sitio (`/`). +/// - Si no hay imagen ([`with_image()`](Self::with_image)) ni título +/// ([`with_title()`](Self::with_title)), la marca de identidad no se renderiza. +/// - El eslogan ([`with_slogan()`](Self::with_slogan)) es opcional; por defecto no tiene contenido. #[rustfmt::skip] #[derive(AutoDefault)] pub struct Brand { - id : AttrId, - #[default(_code = "global::SETTINGS.app.name.to_owned()")] - app_name : String, - slogan : AttrL10n, - logo : Typed<Image>, - #[default(_code = "|_| \"/\"")] - home : FnPathByContext, + id : AttrId, + image : Typed<Image>, + #[default(_code = "L10n::n(&global::SETTINGS.app.name)")] + title : L10n, + slogan: L10n, + #[default(_code = "Some(|_| \"/\")")] + path : Option<FnPathByContext>, } impl Component for Brand { @@ -24,81 +33,79 @@ impl Component for Brand { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let logo = self.logo().render(cx); - let home = self.home()(cx); - let title = &L10n::l("site_home").lookup(cx); + let image = self.image().render(cx); + let title = self.title().using(cx); + if title.is_empty() && image.is_empty() { + return PrepareMarkup::None; + } + let slogan = self.slogan().using(cx); PrepareMarkup::With(html! { - div id=[self.id()] class="branding__container" { - div class="branding__content" { - @if !logo.is_empty() { - a class="branding__logo" href=(home) title=[title] rel="home" { - (logo) - } - } - div class="branding__text" { - a class="branding__name" href=(home) title=[title] rel="home" { - (self.app_name()) - } - @if let Some(slogan) = self.slogan().lookup(cx) { - div class="branding__slogan" { - (slogan) - } - } - } - } + @if let Some(path) = self.path() { + a class="navbar-brand" href=(path(cx)) { (image) (title) (slogan) } + } @else { + span class="navbar-brand" { (image) (title) (slogan) } } }) } } impl Brand { - // Brand BUILDER. + // **< Brand BUILDER >************************************************************************** + /// Establece el identificador único (`id`) de la marca. #[builder_fn] pub fn with_id(mut self, id: impl AsRef<str>) -> Self { self.id.alter_value(id); self } + /// Asigna o quita la imagen de marca. Si se pasa `None`, no se mostrará. #[builder_fn] - pub fn with_app_name(mut self, app_name: impl Into<String>) -> Self { - self.app_name = app_name.into(); + pub fn with_image(mut self, image: Option<Image>) -> Self { + self.image.alter_component(image); self } + /// Establece el título de la identidad de marca. + #[builder_fn] + pub fn with_title(mut self, title: L10n) -> Self { + self.title = title; + self + } + + /// Define el eslogan de la marca. #[builder_fn] pub fn with_slogan(mut self, slogan: L10n) -> Self { - self.slogan.alter_value(slogan); + self.slogan = slogan; self } + /// Define la URL de destino. Si es `None`, la marca no será un enlace. #[builder_fn] - pub fn with_logo(mut self, logo: Option<Image>) -> Self { - self.logo.alter_component(logo); + pub fn with_path(mut self, path: Option<FnPathByContext>) -> Self { + self.path = path; self } - #[builder_fn] - pub fn with_home(mut self, home: FnPathByContext) -> Self { - self.home = home; - self + // **< Brand GETTERS >************************************************************************** + + /// Devuelve la imagen de marca (si la hay). + pub fn image(&self) -> &Typed<Image> { + &self.image } - // Brand GETTERS. - - pub fn app_name(&self) -> &String { - &self.app_name + /// Devuelve el título de la identidad de marca. + pub fn title(&self) -> &L10n { + &self.title } - pub fn slogan(&self) -> &AttrL10n { + /// Devuelve el eslogan de la marca. + pub fn slogan(&self) -> &L10n { &self.slogan } - pub fn logo(&self) -> &Typed<Image> { - &self.logo - } - - pub fn home(&self) -> &FnPathByContext { - &self.home + /// Devuelve la función que resuelve la URL asociada a la marca (si existe). + pub fn path(&self) -> &Option<FnPathByContext> { + &self.path } } diff --git a/extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs b/extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs deleted file mode 100644 index 036182a7..00000000 --- a/extensions/pagetop-bootsier/src/theme/navbar/button_toggler.rs +++ /dev/null @@ -1,73 +0,0 @@ -use pagetop::prelude::*; - -use crate::LOCALES_BOOTSIER; - -use std::fmt; - -#[derive(AutoDefault, PartialEq)] -pub(crate) enum Toggle { - #[default] - Collapse, - Offcanvas, -} - -#[rustfmt::skip] -impl fmt::Display for Toggle { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Toggle::Collapse => write!(f, "collapse"), - Toggle::Offcanvas => write!(f, "offcanvas"), - } - } -} - -#[derive(AutoDefault)] -pub struct ButtonToggler; - -impl Component for ButtonToggler { - fn new() -> Self { - ButtonToggler::default() - } - - fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { - button - type="button" - class="navbar-toggler" - { - span class="navbar-toggler-icon" {} - } - }) - } -} - -impl ButtonToggler { - // ButtonToggler PRIVATE RENDER. - - pub(crate) fn render( - &self, - cx: &mut Context, - id_content: String, - data_bs_toggle: Toggle, - ) -> Markup { - let id_content_target = join!("#", id_content); - let aria_expanded = if data_bs_toggle == Toggle::Collapse { - Some("false") - } else { - None - }; - html! { - button - type="button" - class="navbar-toggler" - data-bs-toggle=(data_bs_toggle) - data-bs-target=(id_content_target) - aria-controls=(id_content) - aria-expanded=[aria_expanded] - aria-label=[L10n::t("toggle", &LOCALES_BOOTSIER).lookup(cx)] - { - span class="navbar-toggler-icon" {} - } - } - } -} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs index 4a203c3f..fc46175a 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/component.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs @@ -6,32 +6,23 @@ use crate::LOCALES_BOOTSIER; const TOGGLE_COLLAPSE: &str = "collapse"; const TOGGLE_OFFCANVAS: &str = "offcanvas"; -#[derive(AutoDefault)] -pub enum NavbarToggler { - #[default] - Enabled, - Disabled, -} - -#[derive(AutoDefault)] -pub enum NavbarType { - #[default] - None, - Nav(Typed<navbar::Nav>), - Offcanvas(Typed<Offcanvas>), - Text(L10n), -} - +/// Componente para crear una **barra de navegación**. +/// +/// Permite mostrar enlaces, menús y una marca de identidad en distintas disposiciones (simples, con +/// botón de despliegue o dentro de un [`offcanvas`]), controladas por [`navbar::Layout`]. También +/// puede fijarse en la parte superior o inferior del documento mediante [`navbar::Position`]. +/// +/// Ver ejemplos en el módulo [`navbar`]. +/// Si no contiene elementos, el componente **no se renderiza**. #[rustfmt::skip] #[derive(AutoDefault)] pub struct Navbar { - id : AttrId, - classes : AttrClasses, - expand : BreakPoint, - toggler : NavbarToggler, - navbar_type: NavbarType, - contents : Children, - brand : Typed<navbar::Brand>, + id : AttrId, + classes : AttrClasses, + expand : BreakPoint, + layout : navbar::Layout, + position: navbar::Position, + items : Children, } impl Component for Navbar { @@ -49,162 +40,22 @@ impl Component for Navbar { [ "navbar".to_string(), self.expand().try_class("navbar-expand").unwrap_or_default(), + match self.position() { + navbar::Position::Static => "", + navbar::Position::FixedTop => "fixed-top", + navbar::Position::FixedBottom => "fixed-bottom", + navbar::Position::StickyTop => "sticky-top", + navbar::Position::StickyBottom => "sticky-bottom", + } + .to_string(), ] .join(" "), ); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let id = cx.required_id::<Self>(self.id()); - - let navbar_type = match self.navbar_type() { - NavbarType::None => return PrepareMarkup::None, - NavbarType::Nav(nav) => { - let id_content = join!(id, "-content"); - match self.toggler() { - NavbarToggler::Enabled => self.toggler_wrapper( - TOGGLE_COLLAPSE, - L10n::t("toggle", &LOCALES_BOOTSIER).lookup(cx), - id_content, - self.brand().render(cx), - nav.render(cx), - ), - NavbarToggler::Disabled => nav.render(cx), - } - } - NavbarType::Offcanvas(oc) => { - let id_content = oc.id().unwrap_or_default(); - self.toggler_wrapper( - TOGGLE_OFFCANVAS, - L10n::t("toggle", &LOCALES_BOOTSIER).lookup(cx), - id_content, - self.brand().render(cx), - oc.render(cx), - ) - } - NavbarType::Text(text) => html! { - span class="navbar-text" { - (text.using(cx)) - } - }, - }; - - self.nav_wrapper(id, self.brand().render(cx), navbar_type) - } -} - -impl Navbar { - pub fn with_nav(nav: navbar::Nav) -> Self { - Navbar::default().with_navbar_type(NavbarType::Nav(Typed::with(nav))) - } - - pub fn with_offcanvas(offcanvas: Offcanvas) -> Self { - Navbar::default().with_navbar_type(NavbarType::Offcanvas(Typed::with(offcanvas))) - } - - // Navbar BUILDER. - - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - #[builder_fn] - pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { - self.classes.alter_value(op, classes); - self - } - - #[builder_fn] - pub fn with_expand(mut self, bp: BreakPoint) -> Self { - self.expand = bp; - self - } - - #[builder_fn] - pub fn with_toggler(mut self, toggler: NavbarToggler) -> Self { - self.toggler = toggler; - self - } - - #[builder_fn] - pub fn with_navbar_type(mut self, navbar_type: NavbarType) -> Self { - self.navbar_type = navbar_type; - self - } - - pub fn with_content(mut self, content: navbar::Content) -> Self { - self.contents.add(Child::with(content)); - self - } - - #[builder_fn] - pub fn with_contents(mut self, op: TypedOp<navbar::Content>) -> Self { - self.contents.alter_typed(op); - self - } - - #[builder_fn] - pub fn with_brand(mut self, brand: Option<navbar::Brand>) -> Self { - self.brand.alter_component(brand); - self - } - - // Navbar GETTERS. - - pub fn classes(&self) -> &AttrClasses { - &self.classes - } - - pub fn expand(&self) -> &BreakPoint { - &self.expand - } - - pub fn toggler(&self) -> &NavbarToggler { - &self.toggler - } - - pub fn navbar_type(&self) -> &NavbarType { - &self.navbar_type - } - - pub fn contents(&self) -> &Children { - &self.contents - } - - pub fn brand(&self) -> &Typed<navbar::Brand> { - &self.brand - } - - // Navbar HELPERS. - - fn nav_wrapper(&self, id: String, brand: Markup, content: Markup) -> PrepareMarkup { - if content.is_empty() { - PrepareMarkup::None - } else { - PrepareMarkup::With(html! { - (brand) - nav id=(id) class=[self.classes().get()] { - div class="container-fluid" { - (content) - } - } - }) - } - } - - fn toggler_wrapper( - &self, - data_bs_toggle: &str, - aria_label: Option<String>, - id_content: String, - brand: Markup, - content: Markup, - ) -> Markup { - if content.is_empty() { - html! {} - } else { + // Botón de despliegue (colapso u offcanvas) para la barra. + fn button(cx: &mut Context, data_bs_toggle: &str, id_content: &str) -> Markup { let id_content_target = join!("#", id_content); let aria_expanded = if data_bs_toggle == TOGGLE_COLLAPSE { Some("false") @@ -212,7 +63,6 @@ impl Navbar { None }; html! { - (brand) button type="button" class="navbar-toggler" @@ -220,14 +70,229 @@ impl Navbar { data-bs-target=(id_content_target) aria-controls=(id_content) aria-expanded=[aria_expanded] - aria-label=[aria_label] + aria-label=[L10n::t("toggle", &LOCALES_BOOTSIER).lookup(cx)] { span class="navbar-toggler-icon" {} } - div id=(id_content) class="collapse navbar-collapse" { - (content) - } } } + + // Si no hay contenidos, no tiene sentido mostrar una barra vacía. + let items = self.items().render(cx); + if items.is_empty() { + return PrepareMarkup::None; + } + + // Asegura que la barra tiene un id estable para poder asociarlo al colapso/offcanvas. + let id = cx.required_id::<Self>(self.id()); + + PrepareMarkup::With(html! { + nav id=(id) class=[self.classes().get()] { + div class="container-fluid" { + @match self.layout() { + // Barra más sencilla: sólo contenido. + navbar::Layout::Simple => { + (items) + }, + + // Barra sencilla que se puede contraer/expandir. + navbar::Layout::SimpleToggle => { + @let id_content = join!(id, "-content"); + + (button(cx, TOGGLE_COLLAPSE, &id_content)) + div id=(id_content) class="collapse navbar-collapse" { + (items) + } + }, + + // Barra con marca a la izquierda, siempre visible. + navbar::Layout::SimpleBrandLeft(brand) => { + (brand.render(cx)) + (items) + }, + + // Barra con marca a la izquierda y botón a la derecha. + navbar::Layout::BrandLeft(brand) => { + @let id_content = join!(id, "-content"); + + (brand.render(cx)) + (button(cx, TOGGLE_COLLAPSE, &id_content)) + div id=(id_content) class="collapse navbar-collapse" { + (items) + } + }, + + // Barra con botón a la izquierda y marca a la derecha. + navbar::Layout::BrandRight(brand) => { + @let id_content = join!(id, "-content"); + + (button(cx, TOGGLE_COLLAPSE, &id_content)) + (brand.render(cx)) + div id=(id_content) class="collapse navbar-collapse" { + (items) + } + }, + + // Barra cuyo contenido se muestra en un offcanvas, sin marca. + navbar::Layout::Offcanvas(offcanvas) => { + @let id_content = offcanvas.id().unwrap_or_default(); + + (button(cx, TOGGLE_OFFCANVAS, &id_content)) + @if let Some(oc) = offcanvas.borrow() { + (oc.render_offcanvas(cx, Some(self.items()))) + } + }, + + // Barra con marca a la izquierda y contenido en offcanvas. + navbar::Layout::OffcanvasBrandLeft(brand, offcanvas) => { + @let id_content = offcanvas.id().unwrap_or_default(); + + (brand.render(cx)) + (button(cx, TOGGLE_OFFCANVAS, &id_content)) + @if let Some(oc) = offcanvas.borrow() { + (oc.render_offcanvas(cx, Some(self.items()))) + } + }, + + // Barra con contenido en offcanvas y marca a la derecha. + navbar::Layout::OffcanvasBrandRight(brand, offcanvas) => { + @let id_content = offcanvas.id().unwrap_or_default(); + + (button(cx, TOGGLE_OFFCANVAS, &id_content)) + (brand.render(cx)) + @if let Some(oc) = offcanvas.borrow() { + (oc.render_offcanvas(cx, Some(self.items()))) + } + }, + } + } + } + }) + } +} + +impl Navbar { + /// Crea una barra de navegación **simple**, sin marca y sin botón. + pub fn simple() -> Self { + Navbar::default().with_layout(navbar::Layout::Simple) + } + + /// Crea una barra de navegación **simple pero colapsable**, con botón a la izquierda. + pub fn simple_toggle() -> Self { + Navbar::default().with_layout(navbar::Layout::SimpleToggle) + } + + /// Crea una barra de navegación **con marca a la izquierda**, siempre visible. + pub fn simple_brand_left(brand: navbar::Brand) -> Self { + Navbar::default().with_layout(navbar::Layout::SimpleBrandLeft(Typed::with(brand))) + } + + /// Crea una barra de navegación con **marca a la izquierda** y **botón a la derecha**. + pub fn brand_left(brand: navbar::Brand) -> Self { + Navbar::default().with_layout(navbar::Layout::BrandLeft(Typed::with(brand))) + } + + /// Crea una barra de navegación con **botón a la izquierda** y **marca a la derecha**. + pub fn brand_right(brand: navbar::Brand) -> Self { + Navbar::default().with_layout(navbar::Layout::BrandRight(Typed::with(brand))) + } + + /// Crea una barra de navegación cuyo contenido se muestra en un **offcanvas**. + pub fn offcanvas(oc: Offcanvas) -> Self { + Navbar::default().with_layout(navbar::Layout::Offcanvas(Typed::with(oc))) + } + + /// Crea una barra de navegación con **marca a la izquierda** y contenido en **offcanvas**. + pub fn offcanvas_brand_left(brand: navbar::Brand, oc: Offcanvas) -> Self { + Navbar::default().with_layout(navbar::Layout::OffcanvasBrandLeft( + Typed::with(brand), + Typed::with(oc), + )) + } + + /// Crea una barra de navegación con **marca a la derecha** y contenido en **offcanvas**. + pub fn offcanvas_brand_right(brand: navbar::Brand, oc: Offcanvas) -> Self { + Navbar::default().with_layout(navbar::Layout::OffcanvasBrandRight( + Typed::with(brand), + Typed::with(oc), + )) + } + + // **< Navbar BUILDER >************************************************************************* + + /// Establece el identificador único (`id`) de la barra de navegación. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas a la barra de navegación. + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Define a partir de qué punto de ruptura la barra de navegación deja de colapsar. + #[builder_fn] + pub fn with_expand(mut self, bp: BreakPoint) -> Self { + self.expand = bp; + self + } + + /// Define el tipo de disposición que tendrá la barra de navegación. + #[builder_fn] + pub fn with_layout(mut self, layout: navbar::Layout) -> Self { + self.layout = layout; + self + } + + /// Define dónde se mostrará la barra de navegación dentro del documento. + #[builder_fn] + pub fn with_position(mut self, position: navbar::Position) -> Self { + self.position = position; + self + } + + /// Añade un nuevo contenido hijo. + #[inline] + pub fn add_item(mut self, item: navbar::Item) -> Self { + self.items.add(Child::with(item)); + self + } + + /// Modifica la lista de contenidos (`children`) aplicando una operación [`TypedOp`]. + #[builder_fn] + pub fn with_items(mut self, op: TypedOp<navbar::Item>) -> Self { + self.items.alter_typed(op); + self + } + + // **< Navbar GETTERS >************************************************************************* + + /// Devuelve las clases CSS asociadas a la barra de navegación. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el punto de ruptura configurado. + pub fn expand(&self) -> &BreakPoint { + &self.expand + } + + /// Devuelve la disposición configurada para la barra de navegación. + pub fn layout(&self) -> &navbar::Layout { + &self.layout + } + + /// Devuelve la posición configurada para la barra de navegación. + pub fn position(&self) -> &navbar::Position { + &self.position + } + + /// Devuelve la lista de contenidos (`children`). + pub fn items(&self) -> &Children { + &self.items } } diff --git a/extensions/pagetop-bootsier/src/theme/navbar/content.rs b/extensions/pagetop-bootsier/src/theme/navbar/content.rs deleted file mode 100644 index 2efb4a05..00000000 --- a/extensions/pagetop-bootsier/src/theme/navbar/content.rs +++ /dev/null @@ -1,69 +0,0 @@ -use pagetop::prelude::*; - -use crate::theme::navbar; - -#[derive(AutoDefault)] -pub enum ContentType { - #[default] - None, - Brand(Typed<navbar::Brand>), - Nav(Typed<navbar::Nav>), - Text(L10n), -} - -// Item. - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Content { - content: ContentType, -} - -impl Component for Content { - fn new() -> Self { - Content::default() - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - match self.content() { - ContentType::None => PrepareMarkup::None, - ContentType::Brand(brand) => PrepareMarkup::With(html! { - (brand.render(cx)) - }), - ContentType::Nav(nav) => PrepareMarkup::With(html! { - (nav.render(cx)) - }), - ContentType::Text(text) => PrepareMarkup::With(html! { - span class="navbar-text" { - (text.using(cx)) - } - }), - } - } -} - -impl Content { - pub fn brand(content: navbar::Brand) -> Self { - Content { - content: ContentType::Brand(Typed::with(content)), - } - } - - pub fn nav(content: navbar::Nav) -> Self { - Content { - content: ContentType::Nav(Typed::with(content)), - } - } - - pub fn text(content: L10n) -> Self { - Content { - content: ContentType::Text(content), - } - } - - // Content GETTERS. - - pub fn content(&self) -> &ContentType { - &self.content - } -} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/item.rs b/extensions/pagetop-bootsier/src/theme/navbar/item.rs new file mode 100644 index 00000000..f0646406 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/item.rs @@ -0,0 +1,108 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +/// Elementos que puede contener una barra de navegación [`Navbar`](crate::theme::Navbar). +/// +/// Cada variante determina qué se renderiza y cómo. Estos elementos se colocan **dentro del +/// contenido** de la barra (la parte colapsable, el *offcanvas* o el bloque simple), por lo que son +/// independientes de la marca o del botón que ya pueda definir el propio [`navbar::Layout`]. +#[derive(AutoDefault)] +pub enum Item { + /// Sin contenido, no produce salida. + #[default] + Void, + /// Marca de identidad mostrada dentro del contenido de la barra de navegación. + /// + /// Útil cuando el [`navbar::Layout`] no incluye marca, y se quiere incluir dentro del área + /// colapsable/*offcanvas*. Si el *layout* ya muestra una marca, esta variante no la sustituye, + /// sólo añade otra dentro del bloque de contenidos. + Brand(Typed<navbar::Brand>), + /// Representa un menú de navegación [`Nav`](crate::theme::Nav). + Nav(Typed<Nav>), + /// Representa un texto libre localizado. + Text(L10n), +} + +impl Component for Item { + fn new() -> Self { + Item::default() + } + + fn id(&self) -> Option<String> { + match self { + Self::Void => None, + Self::Brand(brand) => brand.id(), + Self::Nav(nav) => nav.id(), + Self::Text(_) => None, + } + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + match self { + Self::Void => PrepareMarkup::None, + Self::Brand(brand) => PrepareMarkup::With(html! { (brand.render(cx)) }), + Self::Nav(nav) => { + if let Some(nav) = nav.borrow() { + let items = nav.items().render(cx); + if items.is_empty() { + return PrepareMarkup::None; + } + let classes = AttrClasses::new( + [ + "navbar-nav", + match nav.nav_kind() { + nav::Kind::Default => "", + nav::Kind::Tabs => "nav-tabs", + nav::Kind::Pills => "nav-pills", + nav::Kind::Underline => "nav-underline", + }, + match nav.nav_layout() { + nav::Layout::Default => "", + nav::Layout::Start => "justify-content-start", + nav::Layout::Center => "justify-content-center", + nav::Layout::End => "justify-content-end", + nav::Layout::Vertical => "flex-column", + nav::Layout::Fill => "nav-fill", + nav::Layout::Justified => "nav-justified", + }, + ] + .join(" "), + ); + PrepareMarkup::With(html! { + ul id=[nav.id()] class=[classes.get()] { + (items) + } + }) + } else { + PrepareMarkup::None + } + } + Self::Text(text) => PrepareMarkup::With(html! { + span class="navbar-text" { + (text.using(cx)) + } + }), + } + } +} + +impl Item { + /// Crea un elemento de tipo [`navbar::Brand`] para añadir en el contenido de [`Navbar`]. + /// + /// Pensado para barras colapsables u offcanvas donde se quiere que la marca aparezca en la zona + /// desplegable. + pub fn brand(brand: navbar::Brand) -> Self { + Self::Brand(Typed::with(brand)) + } + + /// Crea un elemento de tipo [`Nav`] para añadir al contenido de [`Navbar`]. + pub fn nav(item: Nav) -> Self { + Self::Nav(Typed::with(item)) + } + + /// Crea un elemento de texto localizado, mostrado sin interacción. + pub fn text(item: L10n) -> Self { + Self::Text(item) + } +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/props.rs b/extensions/pagetop-bootsier/src/theme/navbar/props.rs new file mode 100644 index 00000000..86326574 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/navbar/props.rs @@ -0,0 +1,64 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +// **< Layout >************************************************************************************* + +/// Representa los diferentes tipos de presentación de una barra de navegación [`Navbar`]. +#[derive(AutoDefault)] +pub enum Layout { + /// Barra simple, sin marca de identidad y sin botón de despliegue. + /// + /// La barra de navegación no se colapsa. + #[default] + Simple, + + /// Barra simple, con botón de despliegue a la izquierda y sin marca de identidad. + SimpleToggle, + + /// Barra simple, con marca de identidad a la izquierda y sin botón de despliegue. + /// + /// La barra de navegación no se colapsa. + SimpleBrandLeft(Typed<navbar::Brand>), + + /// Barra con marca de identidad a la izquierda y botón de despliegue a la derecha. + BrandLeft(Typed<navbar::Brand>), + + /// Barra con botón de despliegue a la izquierda y marca de identidad a la derecha. + BrandRight(Typed<navbar::Brand>), + + /// Contenido en [`Offcanvas`], con botón de despliegue a la izquierda y sin marca de identidad. + Offcanvas(Typed<Offcanvas>), + + /// Contenido en [`Offcanvas`], con marca de identidad a la izquierda y botón de despliegue a la + /// derecha. + OffcanvasBrandLeft(Typed<navbar::Brand>, Typed<Offcanvas>), + + /// Contenido en [`Offcanvas`], con botón de despliegue a la izquierda y marca de identidad a la + /// derecha. + OffcanvasBrandRight(Typed<navbar::Brand>, Typed<Offcanvas>), +} + +// **< Position >*********************************************************************************** + +/// Posición global de una barra de navegación [`Navbar`] en el documento. +#[derive(AutoDefault)] +pub enum Position { + /// Barra normal, fluye con el documento. + #[default] + Static, + /// Barra fijada en la parte superior, siempre visible. + /// + /// Puede ser necesario reservar espacio en la parte superior del contenido que fluye debajo + /// para evitar que quede oculto por la barra. + FixedTop, + /// Barra fijada en la parte inferior, siempre visible. + /// + /// Puede ser necesario reservar espacio en la parte inferior del contenido que fluye debajo + /// para evitar que quede oculto por la barra. + FixedBottom, + /// La barra de navegación se fija en la parte superior al hacer *scroll*. + StickyTop, + /// La barra de navegación se fija en la parte inferior al hacer *scroll*. + StickyBottom, +} diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js b/extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js new file mode 100644 index 00000000..0b873693 --- /dev/null +++ b/extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,(t,e)=>`#${CSS.escape(e)}`)),t),s=t=>null==t?`${t}`:Object.prototype.toString.call(t).match(/\s([a-z]+)/i)[1].toLowerCase(),o=t=>{t.dispatchEvent(new Event(i))},r=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),a=t=>r(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,l=t=>{if(!r(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",()=>{for(const t of p)t()}),p.push(e)):e()},_=(t,e=[],i=t)=>"function"==typeof t?t.call(...e):i,b=(t,e,n=!0)=>{if(!n)return void _(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),_(t))};e.addEventListener(i,a),setTimeout(()=>{r||o(e)},s)},v=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,A=/::\d+$/,E={};let T=1;const C={mouseenter:"mouseover",mouseleave:"mouseout"},O=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"]);function x(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function k(t){const e=x(t);return t.uidEvent=e,E[e]=E[e]||{},E[e]}function L(t,e,i=null){return Object.values(t).find(t=>t.callable===e&&t.delegationSelector===i)}function S(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return O.has(o)||(o=t),[n,s,o]}function D(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=S(e,i,n);if(e in C){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=k(t),c=l[a]||(l[a]={}),h=L(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=x(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function $(t,e,i,n,s){const o=L(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&$(t,e,i,r.callable,r.delegationSelector)}function N(t){return t=t.replace(w,""),C[t]||t}const P={on(t,e,i,n){D(t,e,i,n,!1)},one(t,e,i,n){D(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=k(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(A,"");a&&!e.includes(s)||$(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;$(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=j(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function F(t){return t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}const H={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter(t=>t.startsWith("bs")&&!t.startsWith("bsConfig"));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${F(e)}`))};class W{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=r(e)?H.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...r(e)?H.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[i,n]of Object.entries(e)){const e=t[i],o=r(e)?"element":s(e);if(!new RegExp(n).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${o}" but expected type "${n}".`)}}}class B extends W{constructor(t,i){super(),(t=a(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){b(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(a(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e: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(t){return`${t}${this.EVENT_KEY}`}}const z=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map(t=>n(t)).join(","):null},R={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,t).filter(t=>!c(t)&&l(t))},getSelectorFromElement(t){const e=z(t);return e&&R.findOne(e)?e:null},getElementFromSelector(t){const e=z(t);return e?R.findOne(e):null},getMultipleElementsFromSelector(t){const e=z(t);return e?R.find(e):[]}},q=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;P.on(document,i,`[data-bs-dismiss="${n}"]`,function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const s=R.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()})},V=".bs.alert",K=`close${V}`,Q=`closed${V}`;class X extends B{static get NAME(){return"alert"}close(){if(P.trigger(this._element,K).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,Q),this.dispose()}static jQueryInterface(t){return this.each(function(){const e=X.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}q(X,"close"),g(X);const Y='[data-bs-toggle="button"]';class U extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each(function(){const e=U.getOrCreateInstance(this);"toggle"===t&&e[t]()})}}P.on(document,"click.bs.button.data-api",Y,t=>{t.preventDefault();const e=t.target.closest(Y);U.getOrCreateInstance(e).toggle()}),g(U);const G=".bs.swipe",J=`touchstart${G}`,Z=`touchmove${G}`,tt=`touchend${G}`,et=`pointerdown${G}`,it=`pointerup${G}`,nt={endCallback:null,leftCallback:null,rightCallback:null},st={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class ot extends W{constructor(t,e){super(),this._element=t,t&&ot.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return nt}static get DefaultType(){return st}static get NAME(){return"swipe"}dispose(){P.off(this._element,G)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),_(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&_(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,et,t=>this._start(t)),P.on(this._element,it,t=>this._end(t)),this._element.classList.add("pointer-event")):(P.on(this._element,J,t=>this._start(t)),P.on(this._element,Z,t=>this._move(t)),P.on(this._element,tt,t=>this._end(t)))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const rt=".bs.carousel",at=".data-api",lt="ArrowLeft",ct="ArrowRight",ht="next",dt="prev",ut="left",ft="right",pt=`slide${rt}`,mt=`slid${rt}`,gt=`keydown${rt}`,_t=`mouseenter${rt}`,bt=`mouseleave${rt}`,vt=`dragstart${rt}`,yt=`load${rt}${at}`,wt=`click${rt}${at}`,At="carousel",Et="active",Tt=".active",Ct=".carousel-item",Ot=Tt+Ct,xt={[lt]:ft,[ct]:ut},kt={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Lt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class St extends B{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=R.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===At&&this.cycle()}static get Default(){return kt}static get DefaultType(){return Lt}static get NAME(){return"carousel"}next(){this._slide(ht)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(dt)}pause(){this._isSliding&&o(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,mt,()=>this.cycle()):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,mt,()=>this.to(t));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ht:dt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,gt,t=>this._keydown(t)),"hover"===this._config.pause&&(P.on(this._element,_t,()=>this.pause()),P.on(this._element,bt,()=>this._maybeEnableCycle())),this._config.touch&&ot.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of R.find(".carousel-item img",this._element))P.on(t,vt,t=>t.preventDefault());const t={leftCallback:()=>this._slide(this._directionToOrder(ut)),rightCallback:()=>this._slide(this._directionToOrder(ft)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new ot(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=xt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=R.findOne(Tt,this._indicatorsElement);e.classList.remove(Et),e.removeAttribute("aria-current");const i=R.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Et),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ht,s=e||v(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(pt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),u(s),i.classList.add(l),s.classList.add(l),this._queueCallback(()=>{s.classList.remove(l,c),s.classList.add(Et),i.classList.remove(Et,c,l),this._isSliding=!1,r(mt)},i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return R.findOne(Ot,this._element)}_getItems(){return R.find(Ct,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return m()?t===ut?dt:ht:t===ut?ht:dt}_orderToDirection(t){return m()?t===dt?ut:ft:t===dt?ft:ut}static jQueryInterface(t){return this.each(function(){const e=St.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)})}}P.on(document,wt,"[data-bs-slide], [data-bs-slide-to]",function(t){const e=R.getElementFromSelector(this);if(!e||!e.classList.contains(At))return;t.preventDefault();const i=St.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===H.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())}),P.on(window,yt,()=>{const t=R.find('[data-bs-ride="carousel"]');for(const e of t)St.getOrCreateInstance(e)}),g(St);const Dt=".bs.collapse",$t=`show${Dt}`,It=`shown${Dt}`,Nt=`hide${Dt}`,Pt=`hidden${Dt}`,jt=`click${Dt}.data-api`,Mt="show",Ft="collapse",Ht="collapsing",Wt=`:scope .${Ft} .${Ft}`,Bt='[data-bs-toggle="collapse"]',zt={parent:null,toggle:!0},Rt={parent:"(null|element)",toggle:"boolean"};class qt extends B{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=R.find(Bt);for(const t of i){const e=R.getSelectorFromElement(t),i=R.find(e).filter(t=>t===this._element);null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return zt}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 t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(t=>t!==this._element).map(t=>qt.getOrCreateInstance(t,{toggle:!1}))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,$t).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Ft),this._element.classList.add(Ht),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(Ht),this._element.classList.add(Ft,Mt),this._element.style[e]="",P.trigger(this._element,It)},this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,Nt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(Ht),this._element.classList.remove(Ft,Mt);for(const t of this._triggerArray){const e=R.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(Ht),this._element.classList.add(Ft),P.trigger(this._element,Pt)},this._element,!0)}_isShown(t=this._element){return t.classList.contains(Mt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=a(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Bt);for(const e of t){const t=R.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=R.find(Wt,this._config.parent);return R.find(t,this._config.parent).filter(t=>!e.includes(t))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each(function(){const i=qt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}})}}P.on(document,jt,Bt,function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of R.getMultipleElementsFromSelector(this))qt.getOrCreateInstance(t,{toggle:!1}).toggle()}),g(qt);var Vt="top",Kt="bottom",Qt="right",Xt="left",Yt="auto",Ut=[Vt,Kt,Qt,Xt],Gt="start",Jt="end",Zt="clippingParents",te="viewport",ee="popper",ie="reference",ne=Ut.reduce(function(t,e){return t.concat([e+"-"+Gt,e+"-"+Jt])},[]),se=[].concat(Ut,[Yt]).reduce(function(t,e){return t.concat([e,e+"-"+Gt,e+"-"+Jt])},[]),oe="beforeRead",re="read",ae="afterRead",le="beforeMain",ce="main",he="afterMain",de="beforeWrite",ue="write",fe="afterWrite",pe=[oe,re,ae,le,ce,he,de,ue,fe];function me(t){return t?(t.nodeName||"").toLowerCase():null}function ge(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function _e(t){return t instanceof ge(t).Element||t instanceof Element}function be(t){return t instanceof ge(t).HTMLElement||t instanceof HTMLElement}function ve(t){return"undefined"!=typeof ShadowRoot&&(t instanceof ge(t).ShadowRoot||t instanceof ShadowRoot)}const ye={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach(function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];be(s)&&me(s)&&(Object.assign(s.style,i),Object.keys(n).forEach(function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)}))})},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach(function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce(function(t,e){return t[e]="",t},{});be(n)&&me(n)&&(Object.assign(n.style,o),Object.keys(s).forEach(function(t){n.removeAttribute(t)}))})}},requires:["computeStyles"]};function we(t){return t.split("-")[0]}var Ae=Math.max,Ee=Math.min,Te=Math.round;function Ce(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function Oe(){return!/^((?!chrome|android).)*safari/i.test(Ce())}function xe(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&be(t)&&(s=t.offsetWidth>0&&Te(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Te(n.height)/t.offsetHeight||1);var r=(_e(t)?ge(t):window).visualViewport,a=!Oe()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function ke(t){var e=xe(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Le(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ve(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Se(t){return ge(t).getComputedStyle(t)}function De(t){return["table","td","th"].indexOf(me(t))>=0}function $e(t){return((_e(t)?t.ownerDocument:t.document)||window.document).documentElement}function Ie(t){return"html"===me(t)?t:t.assignedSlot||t.parentNode||(ve(t)?t.host:null)||$e(t)}function Ne(t){return be(t)&&"fixed"!==Se(t).position?t.offsetParent:null}function Pe(t){for(var e=ge(t),i=Ne(t);i&&De(i)&&"static"===Se(i).position;)i=Ne(i);return i&&("html"===me(i)||"body"===me(i)&&"static"===Se(i).position)?e:i||function(t){var e=/firefox/i.test(Ce());if(/Trident/i.test(Ce())&&be(t)&&"fixed"===Se(t).position)return null;var i=Ie(t);for(ve(i)&&(i=i.host);be(i)&&["html","body"].indexOf(me(i))<0;){var n=Se(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function je(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Me(t,e,i){return Ae(t,Ee(e,i))}function Fe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function He(t,e){return e.reduce(function(e,i){return e[i]=t,e},{})}const We={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=we(i.placement),l=je(a),c=[Xt,Qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Fe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:He(t,Ut))}(s.padding,i),d=ke(o),u="y"===l?Vt:Xt,f="y"===l?Kt:Qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=Pe(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Me(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Le(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Be(t){return t.split("-")[1]}var ze={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Re(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Xt,y=Vt,w=window;if(c){var A=Pe(i),E="clientHeight",T="clientWidth";A===ge(i)&&"static"!==Se(A=$e(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===Vt||(s===Xt||s===Qt)&&o===Jt)&&(y=Kt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Xt&&(s!==Vt&&s!==Kt||o!==Jt)||(v=Qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&ze),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:Te(i*s)/s||0,y:Te(n*s)/s||0}}({x:f,y:m},ge(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const qe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:we(e.placement),variation:Be(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,Re(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,Re(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var Ve={passive:!0};const Ke={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=ge(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach(function(t){t.addEventListener("scroll",i.update,Ve)}),a&&l.addEventListener("resize",i.update,Ve),function(){o&&c.forEach(function(t){t.removeEventListener("scroll",i.update,Ve)}),a&&l.removeEventListener("resize",i.update,Ve)}},data:{}};var Qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Xe(t){return t.replace(/left|right|bottom|top/g,function(t){return Qe[t]})}var Ye={start:"end",end:"start"};function Ue(t){return t.replace(/start|end/g,function(t){return Ye[t]})}function Ge(t){var e=ge(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Je(t){return xe($e(t)).left+Ge(t).scrollLeft}function Ze(t){var e=Se(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ti(t){return["html","body","#document"].indexOf(me(t))>=0?t.ownerDocument.body:be(t)&&Ze(t)?t:ti(Ie(t))}function ei(t,e){var i;void 0===e&&(e=[]);var n=ti(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=ge(n),r=s?[o].concat(o.visualViewport||[],Ze(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ei(Ie(r)))}function ii(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ni(t,e,i){return e===te?ii(function(t,e){var i=ge(t),n=$e(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Oe();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Je(t),y:l}}(t,i)):_e(e)?function(t,e){var i=xe(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ii(function(t){var e,i=$e(t),n=Ge(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Ae(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Ae(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Je(t),l=-n.scrollTop;return"rtl"===Se(s||i).direction&&(a+=Ae(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}($e(t)))}function si(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?we(s):null,r=s?Be(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case Vt:e={x:a,y:i.y-n.height};break;case Kt:e={x:a,y:i.y+i.height};break;case Qt:e={x:i.x+i.width,y:l};break;case Xt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?je(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Gt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Jt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function oi(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Zt:a,c=i.rootBoundary,h=void 0===c?te:c,d=i.elementContext,u=void 0===d?ee:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Fe("number"!=typeof g?g:He(g,Ut)),b=u===ee?ie:ee,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ei(Ie(t)),i=["absolute","fixed"].indexOf(Se(t).position)>=0&&be(t)?Pe(t):t;return _e(i)?e.filter(function(t){return _e(t)&&Le(t,i)&&"body"!==me(t)}):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce(function(e,i){var s=ni(t,i,n);return e.top=Ae(s.top,e.top),e.right=Ee(s.right,e.right),e.bottom=Ee(s.bottom,e.bottom),e.left=Ae(s.left,e.left),e},ni(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(_e(y)?y:y.contextElement||$e(t.elements.popper),l,h,r),A=xe(t.elements.reference),E=si({reference:A,element:v,placement:s}),T=ii(Object.assign({},v,E)),C=u===ee?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===ee&&x){var k=x[s];Object.keys(O).forEach(function(t){var e=[Qt,Kt].indexOf(t)>=0?1:-1,i=[Vt,Kt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e})}return O}function ri(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?se:l,h=Be(n),d=h?a?ne:ne.filter(function(t){return Be(t)===h}):Ut,u=d.filter(function(t){return c.indexOf(t)>=0});0===u.length&&(u=d);var f=u.reduce(function(e,i){return e[i]=oi(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[we(i)],e},{});return Object.keys(f).sort(function(t,e){return f[t]-f[e]})}const ai={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=we(g),b=l||(_!==g&&p?function(t){if(we(t)===Yt)return[];var e=Xe(t);return[Ue(t),e,Ue(e)]}(g):[Xe(g)]),v=[g].concat(b).reduce(function(t,i){return t.concat(we(i)===Yt?ri(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)},[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C<v.length;C++){var O=v[C],x=we(O),k=Be(O)===Gt,L=[Vt,Kt].indexOf(x)>=0,S=L?"width":"height",D=oi(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?Qt:Xt:k?Kt:Vt;y[S]>w[S]&&($=Xe($));var I=Xe($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every(function(t){return t})){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find(function(e){var i=A.get(e);if(i)return i.slice(0,t).every(function(t){return t})});if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==P(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function li(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ci(t){return[Vt,Qt,Kt,Xt].some(function(e){return t[e]>=0})}const hi={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=oi(e,{elementContext:"reference"}),a=oi(e,{altBoundary:!0}),l=li(r,n),c=li(a,s,o),h=ci(l),d=ci(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},di={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=se.reduce(function(t,i){return t[i]=function(t,e,i){var n=we(t),s=[Xt,Vt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Xt,Qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t},{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ui={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=si({reference:e.rects.reference,element:e.rects.popper,placement:e.placement})},data:{}},fi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=oi(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=we(e.placement),b=Be(e.placement),v=!b,y=je(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?Vt:Xt,D="y"===y?Kt:Qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],j=f?-T[$]/2:0,M=b===Gt?E[$]:T[$],F=b===Gt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?ke(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Me(0,E[$],W[$]),V=v?E[$]/2-j-q-z-O.mainAxis:M-q-z-O.mainAxis,K=v?-E[$]/2+j+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&Pe(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Me(f?Ee(N,I+V-Y-X):N,I,f?Ae(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?Vt:Xt,tt="x"===y?Kt:Qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[Vt,Xt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Me(t,e,i);return n>i?i:n}(at,et,lt):Me(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function pi(t,e,i){void 0===i&&(i=!1);var n,s,o=be(e),r=be(e)&&function(t){var e=t.getBoundingClientRect(),i=Te(e.width)/t.offsetWidth||1,n=Te(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=$e(e),l=xe(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==me(e)||Ze(a))&&(c=(n=e)!==ge(n)&&be(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Ge(n)),be(e)?((h=xe(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Je(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function mi(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach(function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}}),n.push(t)}return t.forEach(function(t){e.set(t.name,t)}),t.forEach(function(t){i.has(t.name)||s(t)}),n}var gi={placement:"bottom",modifiers:[],strategy:"absolute"};function _i(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some(function(t){return!(t&&"function"==typeof t.getBoundingClientRect)})}function bi(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?gi:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},gi,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:_e(t)?ei(t):t.contextElement?ei(t.contextElement):[],popper:ei(e)};var r,c,u=function(t){var e=mi(t);return pe.reduce(function(t,i){return t.concat(e.filter(function(t){return t.phase===i}))},[])}((r=[].concat(n,a.options.modifiers),c=r.reduce(function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t},{}),Object.keys(c).map(function(t){return c[t]})));return a.orderedModifiers=u.filter(function(t){return t.enabled}),a.orderedModifiers.forEach(function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}}),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(_i(e,i)){a.rects={reference:pi(e,Pe(i),"fixed"===a.options.strategy),popper:ke(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach(function(t){return a.modifiersData[t.name]=Object.assign({},t.data)});for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise(function(t){h.forceUpdate(),t(a)})},function(){return r||(r=new Promise(function(t){Promise.resolve().then(function(){r=void 0,t(s())})})),r}),destroy:function(){d(),c=!0}};if(!_i(t,e))return h;function d(){l.forEach(function(t){return t()}),l=[]}return h.setOptions(i).then(function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)}),h}}var vi=bi(),yi=bi({defaultModifiers:[Ke,ui,qe,ye]}),wi=bi({defaultModifiers:[Ke,ui,qe,ye,di,ai,fi,We,hi]});const Ai=Object.freeze(Object.defineProperty({__proto__:null,afterMain:he,afterRead:ae,afterWrite:fe,applyStyles:ye,arrow:We,auto:Yt,basePlacements:Ut,beforeMain:le,beforeRead:oe,beforeWrite:de,bottom:Kt,clippingParents:Zt,computeStyles:qe,createPopper:wi,createPopperBase:vi,createPopperLite:yi,detectOverflow:oi,end:Jt,eventListeners:Ke,flip:ai,hide:hi,left:Xt,main:ce,modifierPhases:pe,offset:di,placements:se,popper:ee,popperGenerator:bi,popperOffsets:ui,preventOverflow:fi,read:re,reference:ie,right:Qt,start:Gt,top:Vt,variationPlacements:ne,viewport:te,write:ue},Symbol.toStringTag,{value:"Module"})),Ei="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",ji='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Mi=`${ji}.${Pi}`,Fi=".dropdown-menu",Hi=m()?"top-end":"top-start",Wi=m()?"top-start":"top-end",Bi=m()?"bottom-end":"bottom-start",zi=m()?"bottom-start":"bottom-end",Ri=m()?"left-start":"right-start",qi=m()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ki={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Qi extends B{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=R.next(this._element,Fi)[0]||R.prev(this._element,Fi)[0]||R.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Ki}static get NAME(){return Ei}toggle(){return this._isShown()?this.hide():this.show()}show(){if(c(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!P.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))P.on(t,"mouseover",d);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),P.trigger(this._element,Di,t)}}hide(){if(c(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!P.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",d);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),H.removeDataAttribute(this._menu,"popper"),P.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!r(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ei.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===Ai)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org/docs/v2/)");let t=this._element;"parent"===this._config.reference?t=this._parent:r(this._config.reference)?t=a(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=wi(t,this._menu,e)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Wi:Hi:e?zi:Bi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(H.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..._(this._config.popperConfig,[void 0,t])}}_selectMenuItem({key:t,target:e}){const i=R.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(t=>l(t));i.length&&v(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each(function(){const e=Qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=R.find(Mi);for(const i of e){const e=Qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(ji)?this:R.prev(this,ji)[0]||R.next(this,ji)[0]||R.findOne(ji,t.delegateTarget.parentNode),o=Qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ii,ji,Qi.dataApiKeydownHandler),P.on(document,Ii,Fi,Qi.dataApiKeydownHandler),P.on(document,$i,Qi.clearMenus),P.on(document,Ni,Qi.clearMenus),P.on(document,$i,ji,function(t){t.preventDefault(),Qi.getOrCreateInstance(this).toggle()}),g(Qi);const Xi="backdrop",Yi="show",Ui=`mousedown.bs.${Xi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends W{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Xi}show(t){if(!this._config.isVisible)return void _(t);this._append();const e=this._getElement();this._config.isAnimated&&u(e),e.classList.add(Yi),this._emulateAnimation(()=>{_(t)})}hide(t){this._config.isVisible?(this._getElement().classList.remove(Yi),this._emulateAnimation(()=>{this.dispose(),_(t)})):_(t)}dispose(){this._isAppended&&(P.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=a(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,Ui,()=>{_(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends W{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,tn),P.on(document,en,t=>this._handleFocusin(t)),P.on(document,nn,t=>this._handleKeydown(t)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=R.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,e=>e+t),this._setElementAttributes(ln,hn,e=>e+t),this._setElementAttributes(cn,dn,e=>e-t)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)})}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&H.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const i=H.getDataAttribute(t,e);null!==i?(H.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)})}_applyManipulationCallback(t,e){if(r(t))e(t);else for(const i of R.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,An=`keydown.dismiss${fn}`,En=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends B{constructor(t,e){super(t,e),this._dialog=R.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show(()=>this._showElement(t)))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())))}dispose(){P.off(window,fn),P.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){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;const e=R.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),u(this._element),this._element.classList.add(Cn),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,bn,{relatedTarget:t})},this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,An,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())}),P.on(window,vn,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),P.on(this._element,wn,t=>{P.one(this._element,yn,e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())})})}_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(Tn),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,gn)})}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback(()=>{this._element.classList.remove(On),this._queueCallback(()=>{this._element.style.overflowY=e},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=m()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=m()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each(function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}})}}P.on(document,En,'[data-bs-toggle="modal"]',function(t){const e=R.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,_n,t=>{t.defaultPrevented||P.one(e,gn,()=>{l(this)&&this.focus()})});const i=R.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)}),q(Ln),g(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",jn=".offcanvas.show",Mn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Wn=`hidePrevented${Sn}`,Bn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Kn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Qn extends B{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Kn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,Mn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),P.trigger(this._element,Fn,{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),P.trigger(this._element,Bn)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,Wn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){P.on(this._element,qn,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,Wn))})}static jQueryInterface(t){return this.each(function(){const e=Qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}P.on(document,Rn,'[data-bs-toggle="offcanvas"]',function(t){const e=R.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;P.one(e,Bn,()=>{l(this)&&this.focus()});const i=R.findOne(jn);i&&i!==e&&Qn.getInstance(i).hide(),Qn.getOrCreateInstance(e).toggle(this)}),P.on(window,$n,()=>{for(const t of R.find(jn))Qn.getOrCreateInstance(t).show()}),P.on(window,zn,()=>{for(const t of R.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Qn.getOrCreateInstance(t).hide()}),q(Qn),g(Qn);const Xn={"*":["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:[]},Yn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Yn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter(t=>t instanceof RegExp).some(t=>t.test(i))},Jn={allowList:Xn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends W{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(t=>this._resolvePossibleFunction(t)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=R.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?r(e)?this._putElementInTemplate(a(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return _(t,[void 0,this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs="click",ds={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},us={allowList:Xn,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:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},fs={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 ps extends B{constructor(t,e){if(void 0===Ai)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)");super(t,e),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 us}static get DefaultType(){return fs}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(rs),as,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("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(h(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",d);this._queueCallback(()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",d);this._activeTrigger[hs]=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=_(this._config.placement,[this,t,this._element]),i=ds[e.toUpperCase()];return wi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return _(t,[this._element,this._element])}_getPopperConfig(t){const e={placement:t,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:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..._(this._config.popperConfig,[void 0,e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger[hs]=!(e._isShown()&&e._activeTrigger[hs]),e.toggle()});else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()}),P.on(this._element,i,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(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(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=H.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:a(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each(function(){const e=ps.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}g(ps);const ms=".popover-header",gs=".popover-body",_s={...ps.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},bs={...ps.DefaultType,content:"(null|string|element|function)"};class vs extends ps{static get Default(){return _s}static get DefaultType(){return bs}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ms]:this._getTitle(),[gs]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each(function(){const e=vs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}g(vs);const ys=".bs.scrollspy",ws=`activate${ys}`,As=`click${ys}`,Es=`load${ys}.data-api`,Ts="active",Cs="[href]",Os=".nav-link",xs=`${Os}, .nav-item > ${Os}, .list-group-item`,ks={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Ls={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ss extends B{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ks}static get DefaultType(){return Ls}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=a(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map(t=>Number.parseFloat(t))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,As),P.on(this._config.target,As,Cs,t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}}))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=R.find(Cs,this._config.target);for(const e of t){if(!e.hash||c(e))continue;const t=R.findOne(decodeURI(e.hash),this._element);l(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Ts),this._activateParents(t),P.trigger(this._element,ws,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))R.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Ts);else for(const e of R.parents(t,".nav, .list-group"))for(const t of R.prev(e,xs))t.classList.add(Ts)}_clearActiveClass(t){t.classList.remove(Ts);const e=R.find(`${Cs}.${Ts}`,t);for(const t of e)t.classList.remove(Ts)}static jQueryInterface(t){return this.each(function(){const e=Ss.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}P.on(window,Es,()=>{for(const t of R.find('[data-bs-spy="scroll"]'))Ss.getOrCreateInstance(t)}),g(Ss);const Ds=".bs.tab",$s=`hide${Ds}`,Is=`hidden${Ds}`,Ns=`show${Ds}`,Ps=`shown${Ds}`,js=`click${Ds}`,Ms=`keydown${Ds}`,Fs=`load${Ds}`,Hs="ArrowLeft",Ws="ArrowRight",Bs="ArrowUp",zs="ArrowDown",Rs="Home",qs="End",Vs="active",Ks="fade",Qs="show",Xs=".dropdown-toggle",Ys=`:not(${Xs})`,Us='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Gs=`.nav-link${Ys}, .list-group-item${Ys}, [role="tab"]${Ys}, ${Us}`,Js=`.${Vs}[data-bs-toggle="tab"], .${Vs}[data-bs-toggle="pill"], .${Vs}[data-bs-toggle="list"]`;class Zs extends B{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,Ms,t=>this._keydown(t)))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,$s,{relatedTarget:t}):null;P.trigger(t,Ns,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Vs),this._activate(R.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,Ps,{relatedTarget:e})):t.classList.add(Qs)},t,t.classList.contains(Ks)))}_deactivate(t,e){t&&(t.classList.remove(Vs),t.blur(),this._deactivate(R.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,Is,{relatedTarget:e})):t.classList.remove(Qs)},t,t.classList.contains(Ks)))}_keydown(t){if(![Hs,Ws,Bs,zs,Rs,qs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter(t=>!c(t));let i;if([Rs,qs].includes(t.key))i=e[t.key===Rs?0:e.length-1];else{const n=[Ws,zs].includes(t.key);i=v(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Zs.getOrCreateInstance(i).show())}_getChildren(){return R.find(Gs,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=R.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=R.findOne(t,i);s&&s.classList.toggle(n,e)};n(Xs,Vs),n(".dropdown-menu",Qs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Vs)}_getInnerElement(t){return t.matches(Gs)?t:R.findOne(Gs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each(function(){const e=Zs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}P.on(document,js,Us,function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||Zs.getOrCreateInstance(this).show()}),P.on(window,Fs,()=>{for(const t of R.find(Js))Zs.getOrCreateInstance(t)}),g(Zs);const to=".bs.toast",eo=`mouseover${to}`,io=`mouseout${to}`,no=`focusin${to}`,so=`focusout${to}`,oo=`hide${to}`,ro=`hidden${to}`,ao=`show${to}`,lo=`shown${to}`,co="hide",ho="show",uo="showing",fo={animation:"boolean",autohide:"boolean",delay:"number"},po={animation:!0,autohide:!0,delay:5e3};class mo extends B{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return po}static get DefaultType(){return fo}static get NAME(){return"toast"}show(){P.trigger(this._element,ao).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(co),u(this._element),this._element.classList.add(ho,uo),this._queueCallback(()=>{this._element.classList.remove(uo),P.trigger(this._element,lo),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,oo).defaultPrevented||(this._element.classList.add(uo),this._queueCallback(()=>{this._element.classList.add(co),this._element.classList.remove(uo,ho),P.trigger(this._element,ro)},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(ho),super.dispose()}isShown(){return this._element.classList.contains(ho)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,eo,t=>this._onInteraction(t,!0)),P.on(this._element,io,t=>this._onInteraction(t,!1)),P.on(this._element,no,t=>this._onInteraction(t,!0)),P.on(this._element,so,t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each(function(){const e=mo.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}})}}return q(mo),g(mo),{Alert:X,Button:U,Carousel:St,Collapse:qt,Dropdown:Qi,Modal:Ln,Offcanvas:Qn,Popover:vs,ScrollSpy:Ss,Tab:Zs,Toast:mo,Tooltip:ps}}); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map b/extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map new file mode 100644 index 00000000..3e678d4c --- /dev/null +++ b/extensions/pagetop-bootsier/static/js/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","Object","prototype","toString","call","toLowerCase","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","JSON","parse","decodeURIComponent","normalizeDataKey","chr","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ARROW_LEFT_KEY$1","ARROW_RIGHT_KEY$1","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n // Private\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n // Private\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [undefined, this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element, this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK])\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.min.js b/extensions/pagetop-bootsier/static/js/bootstrap.min.js deleted file mode 100644 index 7f2bc627..00000000 --- a/extensions/pagetop-bootsier/static/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.3.8 (https://getbootstrap.com/) - * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,function(t){"use strict";function e(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t)for(const i in t)if("default"!==i){const s=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,s.get?s:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const i=e(t),s=new Map,n={set(t,e,i){s.has(t)||s.set(t,new Map);const n=s.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>s.has(t)&&s.get(t).get(e)||null,remove(t,e){if(!s.has(t))return;const i=s.get(t);i.delete(e),0===i.size&&s.delete(t)}},o="transitionend",r=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,(t,e)=>`#${CSS.escape(e)}`)),t),a=t=>null==t?`${t}`:Object.prototype.toString.call(t).match(/\s([a-z]+)/i)[1].toLowerCase(),l=t=>{t.dispatchEvent(new Event(o))},c=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),h=t=>c(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(r(t)):null,d=t=>{if(!c(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},u=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),_=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?_(t.parentNode):null},g=()=>{},f=t=>{t.offsetHeight},m=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,p=[],b=()=>"rtl"===document.documentElement.dir,v=t=>{var e;e=()=>{const e=m();if(e){const i=t.NAME,s=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=s,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",()=>{for(const t of p)t()}),p.push(e)):e()},y=(t,e=[],i=t)=>"function"==typeof t?t.call(...e):i,w=(t,e,i=!0)=>{if(!i)return void y(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const s=Number.parseFloat(e),n=Number.parseFloat(i);return s||n?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let n=!1;const r=({target:i})=>{i===e&&(n=!0,e.removeEventListener(o,r),y(t))};e.addEventListener(o,r),setTimeout(()=>{n||l(e)},s)},A=(t,e,i,s)=>{const n=t.length;let o=t.indexOf(e);return-1===o?!i&&s?t[n-1]:t[0]:(o+=i?1:-1,s&&(o=(o+n)%n),t[Math.max(0,Math.min(o,n-1))])},E=/[^.]*(?=\..*)\.|.*/,C=/\..*/,T=/::\d+$/,k={};let $=1;const S={mouseenter:"mouseover",mouseleave:"mouseout"},L=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"]);function O(t,e){return e&&`${e}::${$++}`||t.uidEvent||$++}function I(t){const e=O(t);return t.uidEvent=e,k[e]=k[e]||{},k[e]}function D(t,e,i=null){return Object.values(t).find(t=>t.callable===e&&t.delegationSelector===i)}function N(t,e,i){const s="string"==typeof e,n=s?i:e||i;let o=j(t);return L.has(o)||(o=t),[s,n,o]}function P(t,e,i,s,n){if("string"!=typeof e||!t)return;let[o,r,a]=N(e,i,s);if(e in S){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=I(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=O(r,e.replace(E,"")),u=o?function(t,e,i){return function s(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return z(n,{delegateTarget:r}),s.oneOff&&F.off(t,n.type,e,i),i.apply(r,[n])}}(t,i,r):function(t,e){return function i(s){return z(s,{delegateTarget:t}),i.oneOff&&F.off(t,s.type,e),e.apply(t,[s])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function x(t,e,i,s,n){const o=D(e[i],s,n);o&&(t.removeEventListener(i,o,Boolean(n)),delete e[i][o.uidEvent])}function M(t,e,i,s){const n=e[i]||{};for(const[o,r]of Object.entries(n))o.includes(s)&&x(t,e,i,r.callable,r.delegationSelector)}function j(t){return t=t.replace(C,""),S[t]||t}const F={on(t,e,i,s){P(t,e,i,s,!1)},one(t,e,i,s){P(t,e,i,s,!0)},off(t,e,i,s){if("string"!=typeof e||!t)return;const[n,o,r]=N(e,i,s),a=r!==e,l=I(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))M(t,l,i,e.slice(1));for(const[i,s]of Object.entries(c)){const n=i.replace(T,"");a&&!e.includes(n)||x(t,l,r,s.callable,s.delegationSelector)}}else{if(!Object.keys(c).length)return;x(t,l,r,o,n?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const s=m();let n=null,o=!0,r=!0,a=!1;e!==j(e)&&s&&(n=s.Event(e,i),s(t).trigger(n),o=!n.isPropagationStopped(),r=!n.isImmediatePropagationStopped(),a=n.isDefaultPrevented());const l=z(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&n&&n.preventDefault(),l}};function z(t,e={}){for(const[i,s]of Object.entries(e))try{t[i]=s}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>s})}return t}function H(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function B(t){return t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}const q={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${B(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${B(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter(t=>t.startsWith("bs")&&!t.startsWith("bsConfig"));for(const s of i){let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1),e[i]=H(t.dataset[s])}return e},getDataAttribute:(t,e)=>H(t.getAttribute(`data-bs-${B(e)}`))};class W{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=c(e)?q.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...c(e)?q.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[i,s]of Object.entries(e)){const e=t[i],n=c(e)?"element":a(e);if(!new RegExp(s).test(n))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${n}" but expected type "${s}".`)}}}class R extends W{constructor(t,e){super(),(t=h(t))&&(this._element=t,this._config=this._getConfig(e),n.set(this._element,this.constructor.DATA_KEY,this))}dispose(){n.remove(this._element,this.constructor.DATA_KEY),F.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){w(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return n.get(h(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e: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(t){return`${t}${this.EVENT_KEY}`}}const K=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map(t=>r(t)).join(","):null},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const i=[];let s=t.parentNode.closest(e);for(;s;)i.push(s),s=s.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,t).filter(t=>!u(t)&&d(t))},getSelectorFromElement(t){const e=K(t);return e&&V.findOne(e)?e:null},getElementFromSelector(t){const e=K(t);return e?V.findOne(e):null},getMultipleElementsFromSelector(t){const e=K(t);return e?V.find(e):[]}},Q=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;F.on(document,i,`[data-bs-dismiss="${s}"]`,function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),u(this))return;const n=V.getElementFromSelector(this)||this.closest(`.${s}`);t.getOrCreateInstance(n)[e]()})},X=".bs.alert",Y=`close${X}`,U=`closed${X}`;class G extends R{static get NAME(){return"alert"}close(){if(F.trigger(this._element,Y).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),F.trigger(this._element,U),this.dispose()}static jQueryInterface(t){return this.each(function(){const e=G.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}Q(G,"close"),v(G);const J='[data-bs-toggle="button"]';class Z extends R{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each(function(){const e=Z.getOrCreateInstance(this);"toggle"===t&&e[t]()})}}F.on(document,"click.bs.button.data-api",J,t=>{t.preventDefault();const e=t.target.closest(J);Z.getOrCreateInstance(e).toggle()}),v(Z);const tt=".bs.swipe",et=`touchstart${tt}`,it=`touchmove${tt}`,st=`touchend${tt}`,nt=`pointerdown${tt}`,ot=`pointerup${tt}`,rt={endCallback:null,leftCallback:null,rightCallback:null},at={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class lt extends W{constructor(t,e){super(),this._element=t,t&&lt.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return rt}static get DefaultType(){return at}static get NAME(){return"swipe"}dispose(){F.off(this._element,tt)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),y(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&y(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(F.on(this._element,nt,t=>this._start(t)),F.on(this._element,ot,t=>this._end(t)),this._element.classList.add("pointer-event")):(F.on(this._element,et,t=>this._start(t)),F.on(this._element,it,t=>this._move(t)),F.on(this._element,st,t=>this._end(t)))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ct=".bs.carousel",ht=".data-api",dt="ArrowLeft",ut="ArrowRight",_t="next",gt="prev",ft="left",mt="right",pt=`slide${ct}`,bt=`slid${ct}`,vt=`keydown${ct}`,yt=`mouseenter${ct}`,wt=`mouseleave${ct}`,At=`dragstart${ct}`,Et=`load${ct}${ht}`,Ct=`click${ct}${ht}`,Tt="carousel",kt="active",$t=".active",St=".carousel-item",Lt=$t+St,Ot={[dt]:mt,[ut]:ft},It={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Dt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Nt extends R{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Tt&&this.cycle()}static get Default(){return It}static get DefaultType(){return Dt}static get NAME(){return"carousel"}next(){this._slide(_t)}nextWhenVisible(){!document.hidden&&d(this._element)&&this.next()}prev(){this._slide(gt)}pause(){this._isSliding&&l(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?F.one(this._element,bt,()=>this.cycle()):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void F.one(this._element,bt,()=>this.to(t));const i=this._getItemIndex(this._getActive());if(i===t)return;const s=t>i?_t:gt;this._slide(s,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&F.on(this._element,vt,t=>this._keydown(t)),"hover"===this._config.pause&&(F.on(this._element,yt,()=>this.pause()),F.on(this._element,wt,()=>this._maybeEnableCycle())),this._config.touch&&lt.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of V.find(".carousel-item img",this._element))F.on(t,At,t=>t.preventDefault());const t={leftCallback:()=>this._slide(this._directionToOrder(ft)),rightCallback:()=>this._slide(this._directionToOrder(mt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new lt(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Ot[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=V.findOne($t,this._indicatorsElement);e.classList.remove(kt),e.removeAttribute("aria-current");const i=V.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(kt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),s=t===_t,n=e||A(this._getItems(),i,s,this._config.wrap);if(n===i)return;const o=this._getItemIndex(n),r=e=>F.trigger(this._element,e,{relatedTarget:n,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(pt).defaultPrevented)return;if(!i||!n)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=n;const l=s?"carousel-item-start":"carousel-item-end",c=s?"carousel-item-next":"carousel-item-prev";n.classList.add(c),f(n),i.classList.add(l),n.classList.add(l),this._queueCallback(()=>{n.classList.remove(l,c),n.classList.add(kt),i.classList.remove(kt,c,l),this._isSliding=!1,r(bt)},i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return V.findOne(Lt,this._element)}_getItems(){return V.find(St,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return b()?t===ft?gt:_t:t===ft?_t:gt}_orderToDirection(t){return b()?t===gt?ft:mt:t===gt?mt:ft}static jQueryInterface(t){return this.each(function(){const e=Nt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)})}}F.on(document,Ct,"[data-bs-slide], [data-bs-slide-to]",function(t){const e=V.getElementFromSelector(this);if(!e||!e.classList.contains(Tt))return;t.preventDefault();const i=Nt.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===q.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())}),F.on(window,Et,()=>{const t=V.find('[data-bs-ride="carousel"]');for(const e of t)Nt.getOrCreateInstance(e)}),v(Nt);const Pt=".bs.collapse",xt=`show${Pt}`,Mt=`shown${Pt}`,jt=`hide${Pt}`,Ft=`hidden${Pt}`,zt=`click${Pt}.data-api`,Ht="show",Bt="collapse",qt="collapsing",Wt=`:scope .${Bt} .${Bt}`,Rt='[data-bs-toggle="collapse"]',Kt={parent:null,toggle:!0},Vt={parent:"(null|element)",toggle:"boolean"};class Qt extends R{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=V.find(Rt);for(const t of i){const e=V.getSelectorFromElement(t),i=V.find(e).filter(t=>t===this._element);null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Kt}static get DefaultType(){return Vt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(t=>t!==this._element).map(t=>Qt.getOrCreateInstance(t,{toggle:!1}))),t.length&&t[0]._isTransitioning)return;if(F.trigger(this._element,xt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Bt),this._element.classList.add(qt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(qt),this._element.classList.add(Bt,Ht),this._element.style[e]="",F.trigger(this._element,Mt)},this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(F.trigger(this._element,jt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,f(this._element),this._element.classList.add(qt),this._element.classList.remove(Bt,Ht);for(const t of this._triggerArray){const e=V.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(qt),this._element.classList.add(Bt),F.trigger(this._element,Ft)},this._element,!0)}_isShown(t=this._element){return t.classList.contains(Ht)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=h(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Rt);for(const e of t){const t=V.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=V.find(Wt,this._config.parent);return V.find(t,this._config.parent).filter(t=>!e.includes(t))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each(function(){const i=Qt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}})}}F.on(document,zt,Rt,function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of V.getMultipleElementsFromSelector(this))Qt.getOrCreateInstance(t,{toggle:!1}).toggle()}),v(Qt);const Xt="dropdown",Yt=".bs.dropdown",Ut=".data-api",Gt="ArrowUp",Jt="ArrowDown",Zt=`hide${Yt}`,te=`hidden${Yt}`,ee=`show${Yt}`,ie=`shown${Yt}`,se=`click${Yt}${Ut}`,ne=`keydown${Yt}${Ut}`,oe=`keyup${Yt}${Ut}`,re="show",ae='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',le=`${ae}.${re}`,ce=".dropdown-menu",he=b()?"top-end":"top-start",de=b()?"top-start":"top-end",ue=b()?"bottom-end":"bottom-start",_e=b()?"bottom-start":"bottom-end",ge=b()?"left-start":"right-start",fe=b()?"right-start":"left-start",me={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},pe={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class be extends R{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=V.next(this._element,ce)[0]||V.prev(this._element,ce)[0]||V.findOne(ce,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return me}static get DefaultType(){return pe}static get NAME(){return Xt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(u(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!F.trigger(this._element,ee,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))F.on(t,"mouseover",g);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(re),this._element.classList.add(re),F.trigger(this._element,ie,t)}}hide(){if(u(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!F.trigger(this._element,Zt,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))F.off(t,"mouseover",g);this._popper&&this._popper.destroy(),this._menu.classList.remove(re),this._element.classList.remove(re),this._element.setAttribute("aria-expanded","false"),q.removeDataAttribute(this._menu,"popper"),F.trigger(this._element,te,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!c(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Xt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===i)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org/docs/v2/)");let t=this._element;"parent"===this._config.reference?t=this._parent:c(this._config.reference)?t=h(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=i.createPopper(t,this._menu,e)}_isShown(){return this._menu.classList.contains(re)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return ge;if(t.classList.contains("dropstart"))return fe;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?de:he:e?_e:ue}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(q.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...y(this._config.popperConfig,[void 0,t])}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(t=>d(t));i.length&&A(i,e,t===Jt,!i.includes(e)).focus()}static jQueryInterface(t){return this.each(function(){const e=be.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=V.find(le);for(const i of e){const e=be.getInstance(i);if(!e||!1===e._config.autoClose)continue;const s=t.composedPath(),n=s.includes(e._menu);if(s.includes(e._element)||"inside"===e._config.autoClose&&!n||"outside"===e._config.autoClose&&n)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,s=[Gt,Jt].includes(t.key);if(!s&&!i)return;if(e&&!i)return;t.preventDefault();const n=this.matches(ae)?this:V.prev(this,ae)[0]||V.next(this,ae)[0]||V.findOne(ae,t.delegateTarget.parentNode),o=be.getOrCreateInstance(n);if(s)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),n.focus())}}F.on(document,ne,ae,be.dataApiKeydownHandler),F.on(document,ne,ce,be.dataApiKeydownHandler),F.on(document,se,be.clearMenus),F.on(document,oe,be.clearMenus),F.on(document,se,ae,function(t){t.preventDefault(),be.getOrCreateInstance(this).toggle()}),v(be);const ve="backdrop",ye="show",we=`mousedown.bs.${ve}`,Ae={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ee={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ce extends W{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Ae}static get DefaultType(){return Ee}static get NAME(){return ve}show(t){if(!this._config.isVisible)return void y(t);this._append();const e=this._getElement();this._config.isAnimated&&f(e),e.classList.add(ye),this._emulateAnimation(()=>{y(t)})}hide(t){this._config.isVisible?(this._getElement().classList.remove(ye),this._emulateAnimation(()=>{this.dispose(),y(t)})):y(t)}dispose(){this._isAppended&&(F.off(this._element,we),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=h(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),F.on(t,we,()=>{y(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(t){w(t,this._getElement(),this._config.isAnimated)}}const Te=".bs.focustrap",ke=`focusin${Te}`,$e=`keydown.tab${Te}`,Se="backward",Le={autofocus:!0,trapElement:null},Oe={autofocus:"boolean",trapElement:"element"};class Ie extends W{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Le}static get DefaultType(){return Oe}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),F.off(document,Te),F.on(document,ke,t=>this._handleFocusin(t)),F.on(document,$e,t=>this._handleKeydown(t)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,F.off(document,Te))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=V.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Se?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Se:"forward")}}const De=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ne=".sticky-top",Pe="padding-right",xe="margin-right";class Me{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Pe,e=>e+t),this._setElementAttributes(De,Pe,e=>e+t),this._setElementAttributes(Ne,xe,e=>e-t)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Pe),this._resetElementAttributes(De,Pe),this._resetElementAttributes(Ne,xe)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const s=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+s)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(n))}px`)})}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&q.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const i=q.getDataAttribute(t,e);null!==i?(q.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)})}_applyManipulationCallback(t,e){if(c(t))e(t);else for(const i of V.find(t,this._element))e(i)}}const je=".bs.modal",Fe=`hide${je}`,ze=`hidePrevented${je}`,He=`hidden${je}`,Be=`show${je}`,qe=`shown${je}`,We=`resize${je}`,Re=`click.dismiss${je}`,Ke=`mousedown.dismiss${je}`,Ve=`keydown.dismiss${je}`,Qe=`click${je}.data-api`,Xe="modal-open",Ye="show",Ue="modal-static",Ge={backdrop:!0,focus:!0,keyboard:!0},Je={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ze extends R{constructor(t,e){super(t,e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Me,this._addEventListeners()}static get Default(){return Ge}static get DefaultType(){return Je}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||F.trigger(this._element,Be,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Xe),this._adjustDialog(),this._backdrop.show(()=>this._showElement(t)))}hide(){this._isShown&&!this._isTransitioning&&(F.trigger(this._element,Fe).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Ye),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())))}dispose(){F.off(window,je),F.off(this._dialog,je),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ce({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ie({trapElement:this._element})}_showElement(t){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;const e=V.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),f(this._element),this._element.classList.add(Ye),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,F.trigger(this._element,qe,{relatedTarget:t})},this._dialog,this._isAnimated())}_addEventListeners(){F.on(this._element,Ve,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())}),F.on(window,We,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),F.on(this._element,Ke,t=>{F.one(this._element,Re,e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())})})}_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(Xe),this._resetAdjustments(),this._scrollBar.reset(),F.trigger(this._element,He)})}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(F.trigger(this._element,ze).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Ue)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Ue),this._queueCallback(()=>{this._element.classList.remove(Ue),this._queueCallback(()=>{this._element.style.overflowY=e},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=b()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=b()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each(function(){const i=Ze.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}})}}F.on(document,Qe,'[data-bs-toggle="modal"]',function(t){const e=V.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),F.one(e,Be,t=>{t.defaultPrevented||F.one(e,He,()=>{d(this)&&this.focus()})});const i=V.findOne(".modal.show");i&&Ze.getInstance(i).hide(),Ze.getOrCreateInstance(e).toggle(this)}),Q(Ze),v(Ze);const ti=".bs.offcanvas",ei=".data-api",ii=`load${ti}${ei}`,si="show",ni="showing",oi="hiding",ri=".offcanvas.show",ai=`show${ti}`,li=`shown${ti}`,ci=`hide${ti}`,hi=`hidePrevented${ti}`,di=`hidden${ti}`,ui=`resize${ti}`,_i=`click${ti}${ei}`,gi=`keydown.dismiss${ti}`,fi={backdrop:!0,keyboard:!0,scroll:!1},mi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class pi extends R{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return fi}static get DefaultType(){return mi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||F.trigger(this._element,ai,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Me).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ni),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(si),this._element.classList.remove(ni),F.trigger(this._element,li,{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(F.trigger(this._element,ci).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(oi),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(si,oi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Me).reset(),F.trigger(this._element,di)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ce({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():F.trigger(this._element,hi)}:null})}_initializeFocusTrap(){return new Ie({trapElement:this._element})}_addEventListeners(){F.on(this._element,gi,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():F.trigger(this._element,hi))})}static jQueryInterface(t){return this.each(function(){const e=pi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}F.on(document,_i,'[data-bs-toggle="offcanvas"]',function(t){const e=V.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this))return;F.one(e,di,()=>{d(this)&&this.focus()});const i=V.findOne(ri);i&&i!==e&&pi.getInstance(i).hide(),pi.getOrCreateInstance(e).toggle(this)}),F.on(window,ii,()=>{for(const t of V.find(ri))pi.getOrCreateInstance(t).show()}),F.on(window,ui,()=>{for(const t of V.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&pi.getOrCreateInstance(t).hide()}),Q(pi),v(pi);const bi={"*":["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:[]},vi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),yi=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,wi=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!vi.has(i)||Boolean(yi.test(t.nodeValue)):e.filter(t=>t instanceof RegExp).some(t=>t.test(i))},Ai={allowList:bi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},Ei={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Ci={entry:"(string|element|function|null)",selector:"(string|element)"};class Ti extends W{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Ai}static get DefaultType(){return Ei}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(t=>this._resolvePossibleFunction(t)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Ci)}_setContent(t,e,i){const s=V.findOne(i,t);s&&((e=this._resolvePossibleFunction(e))?c(e)?this._putElementInTemplate(h(e),s):this._config.html?s.innerHTML=this._maybeSanitize(e):s.textContent=e:s.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const s=(new window.DOMParser).parseFromString(t,"text/html"),n=[].concat(...s.body.querySelectorAll("*"));for(const t of n){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const s=[].concat(...t.attributes),n=[].concat(e["*"]||[],e[i]||[]);for(const e of s)wi(e,n)||t.removeAttribute(e.nodeName)}return s.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return y(t,[void 0,this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const ki=new Set(["sanitize","allowList","sanitizeFn"]),$i="fade",Si="show",Li=".tooltip-inner",Oi=".modal",Ii="hide.bs.modal",Di="hover",Ni="focus",Pi="click",xi={AUTO:"auto",TOP:"top",RIGHT:b()?"left":"right",BOTTOM:"bottom",LEFT:b()?"right":"left"},Mi={allowList:bi,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:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},ji={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 Fi extends R{constructor(t,e){if(void 0===i)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)");super(t,e),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 Mi}static get DefaultType(){return ji}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),F.off(this._element.closest(Oi),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("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=F.trigger(this._element,this.constructor.eventName("show")),e=(_(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),F.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(Si),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))F.on(t,"mouseover",g);this._queueCallback(()=>{F.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!F.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Si),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))F.off(t,"mouseover",g);this._activeTrigger[Pi]=!1,this._activeTrigger[Ni]=!1,this._activeTrigger[Di]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),F.trigger(this._element,this.constructor.eventName("hidden")))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove($i,Si),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add($i),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Ti({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[Li]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains($i)}_isShown(){return this.tip&&this.tip.classList.contains(Si)}_createPopper(t){const e=y(this._config.placement,[this,t,this._element]),s=xi[e.toUpperCase()];return i.createPopper(this._element,t,this._getPopperConfig(s))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return y(t,[this._element,this._element])}_getPopperConfig(t){const e={placement:t,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:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...y(this._config.popperConfig,[void 0,e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)F.on(this._element,this.constructor.eventName("click"),this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger[Pi]=!(e._isShown()&&e._activeTrigger[Pi]),e.toggle()});else if("manual"!==e){const t=e===Di?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===Di?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");F.on(this._element,t,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?Ni:Di]=!0,e._enter()}),F.on(this._element,i,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?Ni:Di]=e._element.contains(t.relatedTarget),e._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},F.on(this._element.closest(Oi),Ii,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(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(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=q.getDataAttributes(this._element);for(const t of Object.keys(e))ki.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:h(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each(function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}v(Fi);const zi=".popover-header",Hi=".popover-body",Bi={...Fi.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},qi={...Fi.DefaultType,content:"(null|string|element|function)"};class Wi extends Fi{static get Default(){return Bi}static get DefaultType(){return qi}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[zi]:this._getTitle(),[Hi]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each(function(){const e=Wi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}v(Wi);const Ri=".bs.scrollspy",Ki=`activate${Ri}`,Vi=`click${Ri}`,Qi=`load${Ri}.data-api`,Xi="active",Yi="[href]",Ui=".nav-link",Gi=`${Ui}, .nav-item > ${Ui}, .list-group-item`,Ji={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Zi={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class ts extends R{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Ji}static get DefaultType(){return Zi}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=h(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map(t=>Number.parseFloat(t))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(F.off(this._config.target,Vi),F.on(this._config.target,Vi,Yi,t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,s=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:s,behavior:"smooth"});i.scrollTop=s}}))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},s=(this._rootElement||document.documentElement).scrollTop,n=s>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=s;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(n&&t){if(i(o),!s)return}else n||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=V.find(Yi,this._config.target);for(const e of t){if(!e.hash||u(e))continue;const t=V.findOne(decodeURI(e.hash),this._element);d(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Xi),this._activateParents(t),F.trigger(this._element,Ki,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))V.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Xi);else for(const e of V.parents(t,".nav, .list-group"))for(const t of V.prev(e,Gi))t.classList.add(Xi)}_clearActiveClass(t){t.classList.remove(Xi);const e=V.find(`${Yi}.${Xi}`,t);for(const t of e)t.classList.remove(Xi)}static jQueryInterface(t){return this.each(function(){const e=ts.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}F.on(window,Qi,()=>{for(const t of V.find('[data-bs-spy="scroll"]'))ts.getOrCreateInstance(t)}),v(ts);const es=".bs.tab",is=`hide${es}`,ss=`hidden${es}`,ns=`show${es}`,os=`shown${es}`,rs=`click${es}`,as=`keydown${es}`,ls=`load${es}`,cs="ArrowLeft",hs="ArrowRight",ds="ArrowUp",us="ArrowDown",_s="Home",gs="End",fs="active",ms="fade",ps="show",bs=".dropdown-toggle",vs=`:not(${bs})`,ys='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',ws=`.nav-link${vs}, .list-group-item${vs}, [role="tab"]${vs}, ${ys}`,As=`.${fs}[data-bs-toggle="tab"], .${fs}[data-bs-toggle="pill"], .${fs}[data-bs-toggle="list"]`;class Es extends R{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),F.on(this._element,as,t=>this._keydown(t)))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?F.trigger(e,is,{relatedTarget:t}):null;F.trigger(t,ns,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(fs),this._activate(V.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),F.trigger(t,os,{relatedTarget:e})):t.classList.add(ps)},t,t.classList.contains(ms)))}_deactivate(t,e){t&&(t.classList.remove(fs),t.blur(),this._deactivate(V.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),F.trigger(t,ss,{relatedTarget:e})):t.classList.remove(ps)},t,t.classList.contains(ms)))}_keydown(t){if(![cs,hs,ds,us,_s,gs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter(t=>!u(t));let i;if([_s,gs].includes(t.key))i=e[t.key===_s?0:e.length-1];else{const s=[hs,us].includes(t.key);i=A(e,t.target,s,!0)}i&&(i.focus({preventScroll:!0}),Es.getOrCreateInstance(i).show())}_getChildren(){return V.find(ws,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=V.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const s=(t,s)=>{const n=V.findOne(t,i);n&&n.classList.toggle(s,e)};s(bs,fs),s(".dropdown-menu",ps),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(fs)}_getInnerElement(t){return t.matches(ws)?t:V.findOne(ws,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each(function(){const e=Es.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}F.on(document,rs,ys,function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),u(this)||Es.getOrCreateInstance(this).show()}),F.on(window,ls,()=>{for(const t of V.find(As))Es.getOrCreateInstance(t)}),v(Es);const Cs=".bs.toast",Ts=`mouseover${Cs}`,ks=`mouseout${Cs}`,$s=`focusin${Cs}`,Ss=`focusout${Cs}`,Ls=`hide${Cs}`,Os=`hidden${Cs}`,Is=`show${Cs}`,Ds=`shown${Cs}`,Ns="hide",Ps="show",xs="showing",Ms={animation:"boolean",autohide:"boolean",delay:"number"},js={animation:!0,autohide:!0,delay:5e3};class Fs extends R{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return js}static get DefaultType(){return Ms}static get NAME(){return"toast"}show(){F.trigger(this._element,Is).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Ns),f(this._element),this._element.classList.add(Ps,xs),this._queueCallback(()=>{this._element.classList.remove(xs),F.trigger(this._element,Ds),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this.isShown()&&(F.trigger(this._element,Ls).defaultPrevented||(this._element.classList.add(xs),this._queueCallback(()=>{this._element.classList.add(Ns),this._element.classList.remove(xs,Ps),F.trigger(this._element,Os)},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Ps),super.dispose()}isShown(){return this._element.classList.contains(Ps)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){F.on(this._element,Ts,t=>this._onInteraction(t,!0)),F.on(this._element,ks,t=>this._onInteraction(t,!1)),F.on(this._element,$s,t=>this._onInteraction(t,!0)),F.on(this._element,Ss,t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each(function(){const e=Fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}})}}return Q(Fs),v(Fs),{Alert:G,Button:Z,Carousel:Nt,Collapse:Qt,Dropdown:be,Modal:Ze,Offcanvas:pi,Popover:Wi,ScrollSpy:ts,Tab:Es,Toast:Fs,Tooltip:Fi}}); -//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map b/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map deleted file mode 100644 index df4b8491..00000000 --- a/extensions/pagetop-bootsier/static/js/bootstrap.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","Object","prototype","toString","call","toLowerCase","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","JSON","parse","decodeURIComponent","normalizeDataKey","chr","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ARROW_LEFT_KEY$1","ARROW_RIGHT_KEY$1","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","boundary","display","offset","popperConfig","reference","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","destroy","update","Popper","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","scroll","Offcanvas","blur","completeCallback","position","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","allowList","content","extraClass","html","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","fallbackPlacements","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n // Private\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n // Private\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '<div></div>'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [undefined, this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '<div class=\"tooltip\" role=\"tooltip\">' +\n '<div class=\"tooltip-arrow\"></div>' +\n '<div class=\"tooltip-inner\"></div>' +\n '</div>',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element, this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK])\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n constructor(element) {\n super(element)\n this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n if (!this._parent) {\n return\n // TODO: should throw exception in v6\n // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n }\n\n // Set up initial aria attributes\n this._setInitialAttributes(this._parent, this._getChildren())\n\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n show() { // Shows this elem and deactivate the active sibling if exists\n const innerElem = this._element\n if (this._elemIsActive(innerElem)) {\n return\n }\n\n // Search for active tab on same parent to deactivate it\n const active = this._getActiveElem()\n\n const hideEvent = active ?\n EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n null\n\n const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n return\n }\n\n this._deactivate(active, innerElem)\n this._activate(innerElem, active)\n }\n\n // Private\n _activate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.add(CLASS_NAME_ACTIVE)\n\n this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.add(CLASS_NAME_SHOW)\n return\n }\n\n element.removeAttribute('tabindex')\n element.setAttribute('aria-selected', true)\n this._toggleDropDown(element, true)\n EventHandler.trigger(element, EVENT_SHOWN, {\n relatedTarget: relatedElem\n })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _deactivate(element, relatedElem) {\n if (!element) {\n return\n }\n\n element.classList.remove(CLASS_NAME_ACTIVE)\n element.blur()\n\n this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n const complete = () => {\n if (element.getAttribute('role') !== 'tab') {\n element.classList.remove(CLASS_NAME_SHOW)\n return\n }\n\n element.setAttribute('aria-selected', false)\n element.setAttribute('tabindex', '-1')\n this._toggleDropDown(element, false)\n EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n }\n\n this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n }\n\n _keydown(event) {\n if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n return\n }\n\n event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n event.preventDefault()\n\n const children = this._getChildren().filter(element => !isDisabled(element))\n let nextActiveElement\n\n if ([HOME_KEY, END_KEY].includes(event.key)) {\n nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n } else {\n const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n }\n\n if (nextActiveElement) {\n nextActiveElement.focus({ preventScroll: true })\n Tab.getOrCreateInstance(nextActiveElement).show()\n }\n }\n\n _getChildren() { // collection of inner elements\n return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n }\n\n _getActiveElem() {\n return this._getChildren().find(child => this._elemIsActive(child)) || null\n }\n\n _setInitialAttributes(parent, children) {\n this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n for (const child of children) {\n this._setInitialAttributesOnChild(child)\n }\n }\n\n _setInitialAttributesOnChild(child) {\n child = this._getInnerElement(child)\n const isActive = this._elemIsActive(child)\n const outerElem = this._getOuterElement(child)\n child.setAttribute('aria-selected', isActive)\n\n if (outerElem !== child) {\n this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n }\n\n if (!isActive) {\n child.setAttribute('tabindex', '-1')\n }\n\n this._setAttributeIfNotExists(child, 'role', 'tab')\n\n // set attributes to the related panel too\n this._setInitialAttributesOnTargetPanel(child)\n }\n\n _setInitialAttributesOnTargetPanel(child) {\n const target = SelectorEngine.getElementFromSelector(child)\n\n if (!target) {\n return\n }\n\n this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n if (child.id) {\n this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n }\n }\n\n _toggleDropDown(element, open) {\n const outerElem = this._getOuterElement(element)\n if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n return\n }\n\n const toggle = (selector, className) => {\n const element = SelectorEngine.findOne(selector, outerElem)\n if (element) {\n element.classList.toggle(className, open)\n }\n }\n\n toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n outerElem.setAttribute('aria-expanded', open)\n }\n\n _setAttributeIfNotExists(element, attribute, value) {\n if (!element.hasAttribute(attribute)) {\n element.setAttribute(attribute, value)\n }\n }\n\n _elemIsActive(elem) {\n return elem.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n // Try to get the inner element (usually the .nav-link)\n _getInnerElement(elem) {\n return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n }\n\n // Try to get the outer element (usually the .nav-item)\n _getOuterElement(elem) {\n return elem.closest(SELECTOR_OUTER) || elem\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tab.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n Tab.getOrCreateInstance(element)\n }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n animation: 'boolean',\n autohide: 'boolean',\n delay: 'number'\n}\n\nconst Default = {\n animation: true,\n autohide: true,\n delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._timeout = null\n this._hasMouseInteraction = false\n this._hasKeyboardInteraction = false\n this._setListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show() {\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._clearTimeout()\n\n if (this._config.animation) {\n this._element.classList.add(CLASS_NAME_FADE)\n }\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN)\n\n this._maybeScheduleHide()\n }\n\n this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n reflow(this._element)\n this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n hide() {\n if (!this.isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const complete = () => {\n this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.classList.add(CLASS_NAME_SHOWING)\n this._queueCallback(complete, this._element, this._config.animation)\n }\n\n dispose() {\n this._clearTimeout()\n\n if (this.isShown()) {\n this._element.classList.remove(CLASS_NAME_SHOW)\n }\n\n super.dispose()\n }\n\n isShown() {\n return this._element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _maybeScheduleHide() {\n if (!this._config.autohide) {\n return\n }\n\n if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n return\n }\n\n this._timeout = setTimeout(() => {\n this.hide()\n }, this._config.delay)\n }\n\n _onInteraction(event, isInteracting) {\n switch (event.type) {\n case 'mouseover':\n case 'mouseout': {\n this._hasMouseInteraction = isInteracting\n break\n }\n\n case 'focusin':\n case 'focusout': {\n this._hasKeyboardInteraction = isInteracting\n break\n }\n\n default: {\n break\n }\n }\n\n if (isInteracting) {\n this._clearTimeout()\n return\n }\n\n const nextElement = event.relatedTarget\n if (this._element === nextElement || this._element.contains(nextElement)) {\n return\n }\n\n this._maybeScheduleHide()\n }\n\n _setListeners() {\n EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n }\n\n _clearTimeout() {\n clearTimeout(this._timeout)\n this._timeout = null\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Toast.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n Alert,\n Button,\n Carousel,\n Collapse,\n Dropdown,\n Modal,\n Offcanvas,\n Popover,\n ScrollSpy,\n Tab,\n Toast,\n Tooltip\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file From 175fc90775a512b05ab6043b38914da8b558434c Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 2 Nov 2025 12:42:36 +0100 Subject: [PATCH 840/853] =?UTF-8?q?=F0=9F=93=9D=20Repasa=20doc=20de=20`Dro?= =?UTF-8?q?pdown`,=20`Nav`=20y=20`Offcanvas`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pagetop-bootsier/src/theme/dropdown.rs | 17 +++ .../src/theme/dropdown/component.rs | 18 +-- .../src/theme/dropdown/item.rs | 4 +- extensions/pagetop-bootsier/src/theme/nav.rs | 20 +++ .../src/theme/nav/component.rs | 21 +-- .../pagetop-bootsier/src/theme/nav/item.rs | 6 +- .../pagetop-bootsier/src/theme/offcanvas.rs | 20 +++ .../src/theme/offcanvas/component.rs | 126 ++++++++---------- 8 files changed, 124 insertions(+), 108 deletions(-) diff --git a/extensions/pagetop-bootsier/src/theme/dropdown.rs b/extensions/pagetop-bootsier/src/theme/dropdown.rs index eb00e4c8..ed4cbec0 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown.rs @@ -6,6 +6,23 @@ //! //! Los ítems pueden estar activos, deshabilitados o abrirse en nueva ventana según su contexto y //! configuración, y permiten incluir etiquetas localizables usando [`L10n`](pagetop::locale::L10n). +//! +//! # Ejemplo +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let dd = Dropdown::new() +//! .with_title(L10n::n("Menu")) +//! .with_button_color(ButtonColor::Background(Color::Secondary)) +//! .with_auto_close(dropdown::AutoClose::ClickableInside) +//! .with_direction(dropdown::Direction::Dropend) +//! .add_item(dropdown::Item::link(L10n::n("Home"), |_| "/")) +//! .add_item(dropdown::Item::link_blank(L10n::n("External"), |_| "https://www.google.es")) +//! .add_item(dropdown::Item::divider()) +//! .add_item(dropdown::Item::header(L10n::n("User session"))) +//! .add_item(dropdown::Item::button(L10n::n("Sign out"))); +//! ``` mod props; pub use props::{AutoClose, Direction, MenuAlign, MenuPosition}; diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index 984a3e06..c29ac145 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -17,22 +17,8 @@ use crate::LOCALES_BOOTSIER; /// cuenta **el título** (si no existe le asigna uno por defecto) y **la lista de elementos**; el /// resto de propiedades no afectarán a su representación en [`Nav`]. /// -/// # Ejemplo -/// -/// ```rust -/// # use pagetop::prelude::*; -/// # use pagetop_bootsier::prelude::*; -/// let dd = Dropdown::new() -/// .with_title(L10n::n("Menu")) -/// .with_button_color(ButtonColor::Background(Color::Secondary)) -/// .with_auto_close(dropdown::AutoClose::ClickableInside) -/// .with_direction(dropdown::Direction::Dropend) -/// .add_item(dropdown::Item::link(L10n::n("Home"), |_| "/")) -/// .add_item(dropdown::Item::link_blank(L10n::n("External"), |_| "https://www.google.es")) -/// .add_item(dropdown::Item::divider()) -/// .add_item(dropdown::Item::header(L10n::n("User session"))) -/// .add_item(dropdown::Item::button(L10n::n("Sign out"))); -/// ``` +/// Ver ejemplo en el módulo [`dropdown`]. +/// Si no contiene elementos, el componente **no se renderiza**. #[rustfmt::skip] #[derive(AutoDefault)] pub struct Dropdown { diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs index 1aed83b4..a13058dd 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs @@ -79,7 +79,7 @@ impl Component for Item { } => { let path = path(cx); let current_path = cx.request().map(|request| request.path()); - let is_current = !*disabled && current_path.map_or(false, |p| p == path); + let is_current = !*disabled && (current_path == Some(path)); let mut classes = "dropdown-item".to_string(); if is_current { @@ -274,7 +274,7 @@ impl Item { &self.classes } - /// Devuelve el tipo de elemento representado por este elemento. + /// Devuelve el tipo de elemento representado. pub fn item_kind(&self) -> &ItemKind { &self.item_kind } diff --git a/extensions/pagetop-bootsier/src/theme/nav.rs b/extensions/pagetop-bootsier/src/theme/nav.rs index b540c323..c74ab3b5 100644 --- a/extensions/pagetop-bootsier/src/theme/nav.rs +++ b/extensions/pagetop-bootsier/src/theme/nav.rs @@ -6,6 +6,26 @@ //! //! Los ítems pueden estar activos, deshabilitados o abrirse en nueva ventana según su contexto y //! configuración, y permiten incluir etiquetas localizables usando [`L10n`](pagetop::locale::L10n). +//! +//! # Ejemplo +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let nav = Nav::tabs() +//! .with_layout(nav::Layout::End) +//! .add_item(nav::Item::link(L10n::n("Home"), |_| "/")) +//! .add_item(nav::Item::link_blank(L10n::n("External"), |_| "https://www.google.es")) +//! .add_item(nav::Item::dropdown( +//! Dropdown::new() +//! .with_title(L10n::n("Options")) +//! .with_items(TypedOp::AddMany(vec![ +//! Typed::with(dropdown::Item::link(L10n::n("Action"), |_| "/action")), +//! Typed::with(dropdown::Item::link(L10n::n("Another action"), |_| "/another")), +//! ])), +//! )) +//! .add_item(nav::Item::link_disabled(L10n::n("Disabled"), |_| "#")); +//! ``` mod props; pub use props::{Kind, Layout}; diff --git a/extensions/pagetop-bootsier/src/theme/nav/component.rs b/extensions/pagetop-bootsier/src/theme/nav/component.rs index 34c33b94..d4cf2c8c 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/component.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/component.rs @@ -8,25 +8,8 @@ use crate::prelude::*; /// como *pestañas* (`Tabs`), *botones* (`Pills`) o *subrayado* (`Underline`). También permite /// controlar su distribución y orientación ([`nav::Layout`](crate::theme::nav::Layout)). /// -/// # Ejemplo -/// -/// ```rust -/// # use pagetop::prelude::*; -/// # use pagetop_bootsier::prelude::*; -/// let nav = Nav::tabs() -/// .with_layout(nav::Layout::End) -/// .add_item(nav::Item::link(L10n::n("Home"), |_| "/")) -/// .add_item(nav::Item::link_blank(L10n::n("External"), |_| "https://www.google.es")) -/// .add_item(nav::Item::dropdown( -/// Dropdown::new() -/// .with_title(L10n::n("Options")) -/// .with_items(TypedOp::AddMany(vec![ -/// Typed::with(dropdown::Item::link(L10n::n("Action"), |_| "/action")), -/// Typed::with(dropdown::Item::link(L10n::n("Another action"), |_| "/another")), -/// ])), -/// )) -/// .add_item(nav::Item::link_disabled(L10n::n("Disabled"), |_| "#")); -/// ``` +/// Ver ejemplo en el módulo [`nav`]. +/// Si no contiene elementos, el componente **no se renderiza**. #[rustfmt::skip] #[derive(AutoDefault)] pub struct Nav { diff --git a/extensions/pagetop-bootsier/src/theme/nav/item.rs b/extensions/pagetop-bootsier/src/theme/nav/item.rs index 63248f8d..bc097e0c 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/item.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/item.rs @@ -72,7 +72,7 @@ impl Component for Item { ItemKind::Label(label) => PrepareMarkup::With(html! { li id=[self.id()] class=[self.classes().get()] { - span { + span class="nav-link disabled" aria-disabled="true" { (label.using(cx)) } } @@ -86,7 +86,7 @@ impl Component for Item { } => { let path = path(cx); let current_path = cx.request().map(|request| request.path()); - let is_current = !*disabled && current_path.map_or(false, |p| p == path); + let is_current = !*disabled && (current_path == Some(path)); let mut classes = "nav-link".to_string(); if is_current { @@ -250,7 +250,7 @@ impl Item { &self.classes } - /// Devuelve el tipo de elemento representado por este elemento. + /// Devuelve el tipo de elemento representado. pub fn item_kind(&self) -> &ItemKind { &self.item_kind } diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas.rs b/extensions/pagetop-bootsier/src/theme/offcanvas.rs index 560bd30a..dc905348 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas.rs @@ -1,4 +1,24 @@ //! Definiciones para crear paneles laterales deslizantes [`Offcanvas`]. +//! +//! # Ejemplo +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let panel = Offcanvas::new() +//! .with_id("offcanvas_example") +//! .with_title(L10n::n("Offcanvas title")) +//! .with_placement(offcanvas::Placement::End) +//! .with_backdrop(offcanvas::Backdrop::Enabled) +//! .with_body_scroll(offcanvas::BodyScroll::Enabled) +//! .with_visibility(offcanvas::Visibility::Default) +//! .add_child(Dropdown::new() +//! .with_button_title(L10n::n("Menu")) +//! .add_item(dropdown::Item::label(L10n::n("Label"))) +//! .add_item(dropdown::Item::link_blank(L10n::n("Google"), |_| "https://www.google.es")) +//! .add_item(dropdown::Item::link(L10n::n("Sign out"), |_| "/signout")) +//! ); +//! ``` mod props; pub use props::{Backdrop, BodyScroll, Placement, Visibility}; diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs index 7cd7dffe..61e6fae7 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs @@ -18,27 +18,9 @@ use crate::LOCALES_BOOTSIER; /// ([`with_breakpoint()`](Self::with_breakpoint)). /// - Asocia título y controles de accesibilidad a un identificador único y expone atributos /// adecuados para lectores de pantalla y navegación por teclado. -/// - **No se renderiza** si no tiene contenido. /// -/// # Ejemplo -/// -/// ```rust -/// # use pagetop::prelude::*; -/// # use pagetop_bootsier::prelude::*; -/// let panel = Offcanvas::new() -/// .with_id("offcanvas_example") -/// .with_title(L10n::n("Offcanvas title")) -/// .with_placement(offcanvas::Placement::End) -/// .with_backdrop(offcanvas::Backdrop::Enabled) -/// .with_body_scroll(offcanvas::BodyScroll::Enabled) -/// .with_visibility(offcanvas::Visibility::Default) -/// .add_child(Dropdown::new() -/// .with_button_title(L10n::n("Menu")) -/// .add_item(dropdown::Item::label(L10n::n("Label"))) -/// .add_item(dropdown::Item::link_blank(L10n::n("Google"), |_| "https://www.google.es")) -/// .add_item(dropdown::Item::link(L10n::n("Sign out"), |_| "/signout")) -/// ); -/// ``` +/// Ver ejemplo en el módulo [`offcanvas`]. +/// Si no contiene elementos, el componente **no se renderiza**. #[rustfmt::skip] #[derive(AutoDefault)] pub struct Offcanvas { @@ -84,54 +66,7 @@ impl Component for Offcanvas { } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let body = self.children().render(cx); - if body.is_empty() { - return PrepareMarkup::None; - } - - let id = cx.required_id::<Self>(self.id()); - let id_label = join!(id, "-label"); - let id_target = join!("#", id); - - let body_scroll = match self.body_scroll() { - offcanvas::BodyScroll::Disabled => None, - offcanvas::BodyScroll::Enabled => Some("true"), - }; - - let backdrop = match self.backdrop() { - offcanvas::Backdrop::Disabled => Some("false"), - offcanvas::Backdrop::Enabled => None, - offcanvas::Backdrop::Static => Some("static"), - }; - - let title = self.title().using(cx); - - PrepareMarkup::With(html! { - div - id=(id) - class=[self.classes().get()] - tabindex="-1" - data-bs-scroll=[body_scroll] - data-bs-backdrop=[backdrop] - aria-labelledby=(id_label) - { - div class="offcanvas-header" { - @if !title.is_empty() { - h5 class="offcanvas-title" id=(id_label) { (title) } - } - button - type="button" - class="btn-close" - data-bs-dismiss="offcanvas" - data-bs-target=(id_target) - aria-label=[L10n::t("offcanvas_close", &LOCALES_BOOTSIER).lookup(cx)] - {} - } - div class="offcanvas-body" { - (body) - } - } - }) + PrepareMarkup::With(self.render_offcanvas(cx, None)) } } @@ -258,4 +193,59 @@ impl Offcanvas { pub fn children(&self) -> &Children { &self.children } + + // **< Offcanvas HELPERS >********************************************************************** + + pub(crate) fn render_offcanvas(&self, cx: &mut Context, extra: Option<&Children>) -> Markup { + let body = self.children().render(cx); + let body_extra = extra.map(|c| c.render(cx)).unwrap_or_else(|| html! {}); + if body.is_empty() && body_extra.is_empty() { + return html! {}; + } + + let id = cx.required_id::<Self>(self.id()); + let id_label = join!(id, "-label"); + let id_target = join!("#", id); + + let body_scroll = match self.body_scroll() { + offcanvas::BodyScroll::Disabled => None, + offcanvas::BodyScroll::Enabled => Some("true"), + }; + + let backdrop = match self.backdrop() { + offcanvas::Backdrop::Disabled => Some("false"), + offcanvas::Backdrop::Enabled => None, + offcanvas::Backdrop::Static => Some("static"), + }; + + let title = self.title().using(cx); + + html! { + div + id=(id) + class=[self.classes().get()] + tabindex="-1" + data-bs-scroll=[body_scroll] + data-bs-backdrop=[backdrop] + aria-labelledby=(id_label) + { + div class="offcanvas-header" { + @if !title.is_empty() { + h5 class="offcanvas-title" id=(id_label) { (title) } + } + button + type="button" + class="btn-close" + data-bs-dismiss="offcanvas" + data-bs-target=(id_target) + aria-label=[L10n::t("offcanvas_close", &LOCALES_BOOTSIER).lookup(cx)] + {} + } + div class="offcanvas-body" { + (body) + (body_extra) + } + } + } + } } From 1ed5ab86fe4b1b14da87e1d7697bbbe82339a47b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 2 Nov 2025 20:46:43 +0100 Subject: [PATCH 841/853] =?UTF-8?q?=E2=9A=B0=EF=B8=8F=20(menu):=20Elimina?= =?UTF-8?q?=20implementaci=C3=B3n=20base=20de=20men=C3=BAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/component.rs | 2 - src/base/component/menu.rs | 17 -- src/base/component/menu/element.rs | 56 ---- src/base/component/menu/group.rs | 58 ---- src/base/component/menu/item.rs | 185 ------------- src/base/component/menu/megamenu.rs | 57 ---- src/base/component/menu/menu_menu.rs | 108 -------- src/base/component/menu/submenu.rs | 73 ----- static/css/menu.css | 384 --------------------------- static/js/menu.js | 95 ------- 10 files changed, 1035 deletions(-) delete mode 100644 src/base/component/menu.rs delete mode 100644 src/base/component/menu/element.rs delete mode 100644 src/base/component/menu/group.rs delete mode 100644 src/base/component/menu/item.rs delete mode 100644 src/base/component/menu/megamenu.rs delete mode 100644 src/base/component/menu/menu_menu.rs delete mode 100644 src/base/component/menu/submenu.rs delete mode 100644 static/css/menu.css delete mode 100644 static/js/menu.js diff --git a/src/base/component.rs b/src/base/component.rs index 8991d721..508a28e1 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -62,5 +62,3 @@ pub use poweredby::PoweredBy; mod icon; pub use icon::{Icon, IconKind}; - -pub mod menu; diff --git a/src/base/component/menu.rs b/src/base/component/menu.rs deleted file mode 100644 index 14f75898..00000000 --- a/src/base/component/menu.rs +++ /dev/null @@ -1,17 +0,0 @@ -mod menu_menu; -pub use menu_menu::Menu; - -mod item; -pub use item::{Item, ItemKind}; - -mod submenu; -pub use submenu::Submenu; - -mod megamenu; -pub use megamenu::Megamenu; - -mod group; -pub use group::Group; - -mod element; -pub use element::{Element, ElementType}; diff --git a/src/base/component/menu/element.rs b/src/base/component/menu/element.rs deleted file mode 100644 index 6d142048..00000000 --- a/src/base/component/menu/element.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::prelude::*; - -type Content = Typed<Html>; -type SubmenuItems = Typed<menu::Submenu>; - -#[derive(AutoDefault)] -pub enum ElementType { - #[default] - Void, - Html(Content), - Submenu(SubmenuItems), -} - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Element { - element_type: ElementType, -} - -impl Component for Element { - fn new() -> Self { - Element::default() - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - match self.element_type() { - ElementType::Void => PrepareMarkup::None, - ElementType::Html(content) => PrepareMarkup::With(html! { - (content.render(cx)) - }), - ElementType::Submenu(submenu) => PrepareMarkup::With(html! { - (submenu.render(cx)) - }), - } - } -} - -impl Element { - pub fn html(content: Html) -> Self { - Element { - element_type: ElementType::Html(Content::with(content)), - } - } - - pub fn submenu(submenu: menu::Submenu) -> Self { - Element { - element_type: ElementType::Submenu(SubmenuItems::with(submenu)), - } - } - - // **< Element GETTERS >************************************************************************ - - pub fn element_type(&self) -> &ElementType { - &self.element_type - } -} diff --git a/src/base/component/menu/group.rs b/src/base/component/menu/group.rs deleted file mode 100644 index ba188934..00000000 --- a/src/base/component/menu/group.rs +++ /dev/null @@ -1,58 +0,0 @@ -use crate::prelude::*; - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Group { - id : AttrId, - elements: Children, -} - -impl Component for Group { - fn new() -> Self { - Group::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { - div id=[self.id()] class="menu__group" { - (self.elements().render(cx)) - } - }) - } -} - -impl Group { - // **< Group BUILDER >************************************************************************** - - /// Establece el identificador único (`id`) del grupo. - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - /// Añade un nuevo elemento al menú. - pub fn add_element(mut self, element: menu::Element) -> Self { - self.elements - .alter_typed(TypedOp::Add(Typed::with(element))); - self - } - - /// Modifica la lista de elementos (`children`) aplicando una operación [`TypedOp`]. - #[builder_fn] - pub fn with_elements(mut self, op: TypedOp<menu::Element>) -> Self { - self.elements.alter_typed(op); - self - } - - // **< Group GETTERS >************************************************************************** - - /// Devuelve la lista de elementos (`children`) del grupo. - pub fn elements(&self) -> &Children { - &self.elements - } -} diff --git a/src/base/component/menu/item.rs b/src/base/component/menu/item.rs deleted file mode 100644 index c6342186..00000000 --- a/src/base/component/menu/item.rs +++ /dev/null @@ -1,185 +0,0 @@ -use crate::prelude::*; - -type Label = L10n; -type Content = Typed<Html>; -type SubmenuItems = Typed<menu::Submenu>; -type MegamenuGroups = Typed<menu::Megamenu>; - -#[derive(AutoDefault)] -pub enum ItemKind { - #[default] - Void, - Label(Label), - Link(Label, FnPathByContext), - LinkBlank(Label, FnPathByContext), - Html(Content), - Submenu(Label, SubmenuItems), - Megamenu(Label, MegamenuGroups), -} - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Item { - item_kind : ItemKind, - description: AttrL10n, - left_icon : Typed<Icon>, - right_icon : Typed<Icon>, -} - -impl Component for Item { - fn new() -> Self { - Item::default() - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let description = self.description().lookup(cx); - let left_icon = self.left_icon().render(cx); - let right_icon = self.right_icon().render(cx); - - match self.item_kind() { - ItemKind::Void => PrepareMarkup::None, - ItemKind::Label(label) => PrepareMarkup::With(html! { - li class="menu__item menu__item--label" { - span title=[description] { - (left_icon) - span class="menu__label" { (label.using(cx)) } - (right_icon) - } - } - }), - ItemKind::Link(label, path) => PrepareMarkup::With(html! { - li class="menu__item menu__item--link" { - a class="menu__link" href=(path(cx)) title=[description] { - (left_icon) - span class="menu__label" { (label.using(cx)) } - (right_icon) - } - } - }), - ItemKind::LinkBlank(label, path) => PrepareMarkup::With(html! { - li class="menu__item menu__item--link" { - a class="menu__link" href=(path(cx)) title=[description] target="_blank" { - (left_icon) - span class="menu__label" { (label.using(cx)) } - (right_icon) - } - } - }), - ItemKind::Html(content) => PrepareMarkup::With(html! { - li class="menu__item menu__item--html" { - (content.render(cx)) - } - }), - ItemKind::Submenu(label, submenu) => PrepareMarkup::With(html! { - li class="menu__item menu__item--children" { - button type="button" class="menu__link" title=[description] { - (left_icon) - span class="menu__label" { (label.using(cx)) } - (Icon::svg(html! { - path 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" {} - }).render(cx)) - } - div class="menu__children menu__children--submenu" { - (submenu.render(cx)) - } - } - }), - ItemKind::Megamenu(label, megamenu) => PrepareMarkup::With(html! { - li class="menu__item menu__item--children" { - button type="button" class="menu__link" title=[description] { - (left_icon) - span class="menu__label" { (label.using(cx)) } - (Icon::svg(html! { - path 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" {} - }).render(cx)) - } - div class="menu__children menu__children--mega" { - (megamenu.render(cx)) - } - } - }), - } - } -} - -impl Item { - pub fn label(label: L10n) -> Self { - Item { - item_kind: ItemKind::Label(label), - ..Default::default() - } - } - - pub fn link(label: L10n, path: FnPathByContext) -> Self { - Item { - item_kind: ItemKind::Link(label, path), - ..Default::default() - } - } - - pub fn link_blank(label: L10n, path: FnPathByContext) -> Self { - Item { - item_kind: ItemKind::LinkBlank(label, path), - ..Default::default() - } - } - - pub fn html(content: Html) -> Self { - Item { - item_kind: ItemKind::Html(Content::with(content)), - ..Default::default() - } - } - - pub fn submenu(label: L10n, submenu: menu::Submenu) -> Self { - Item { - item_kind: ItemKind::Submenu(label, SubmenuItems::with(submenu)), - ..Default::default() - } - } - - pub fn megamenu(label: L10n, megamenu: menu::Megamenu) -> Self { - Item { - item_kind: ItemKind::Megamenu(label, MegamenuGroups::with(megamenu)), - ..Default::default() - } - } - - // **< Item BUILDER >*************************************************************************** - - #[builder_fn] - pub fn with_description(mut self, text: L10n) -> Self { - self.description.alter_value(text); - self - } - - #[builder_fn] - pub fn with_left_icon<I: Into<Icon>>(mut self, icon: Option<I>) -> Self { - self.left_icon.alter_component(icon.map(Into::into)); - self - } - - #[builder_fn] - pub fn with_right_icon<I: Into<Icon>>(mut self, icon: Option<I>) -> Self { - self.right_icon.alter_component(icon.map(Into::into)); - self - } - - // **< Item GETTERS >*************************************************************************** - - pub fn item_kind(&self) -> &ItemKind { - &self.item_kind - } - - pub fn description(&self) -> &AttrL10n { - &self.description - } - - pub fn left_icon(&self) -> &Typed<Icon> { - &self.left_icon - } - - pub fn right_icon(&self) -> &Typed<Icon> { - &self.right_icon - } -} diff --git a/src/base/component/menu/megamenu.rs b/src/base/component/menu/megamenu.rs deleted file mode 100644 index e435e753..00000000 --- a/src/base/component/menu/megamenu.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::prelude::*; - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Megamenu { - id : AttrId, - groups: Children, -} - -impl Component for Megamenu { - fn new() -> Self { - Megamenu::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { - div id=[self.id()] class="menu__mega" { - (self.groups().render(cx)) - } - }) - } -} - -impl Megamenu { - // **< Megamenu BUILDER >*********************************************************************** - - /// Establece el identificador único (`id`) del megamenú. - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - /// Añade un nuevo grupo al menú. - pub fn add_group(mut self, group: menu::Group) -> Self { - self.groups.alter_typed(TypedOp::Add(Typed::with(group))); - self - } - - /// Modifica la lista de grupos (`children`) aplicando una operación [`TypedOp`]. - #[builder_fn] - pub fn with_groups(mut self, op: TypedOp<menu::Group>) -> Self { - self.groups.alter_typed(op); - self - } - - // **< Megamenu GETTERS >*********************************************************************** - - /// Devuelve la lista de grupos (`children`) del megamenú. - pub fn groups(&self) -> &Children { - &self.groups - } -} diff --git a/src/base/component/menu/menu_menu.rs b/src/base/component/menu/menu_menu.rs deleted file mode 100644 index 58a4c21d..00000000 --- a/src/base/component/menu/menu_menu.rs +++ /dev/null @@ -1,108 +0,0 @@ -use crate::prelude::*; - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Menu { - id : AttrId, - classes: AttrClasses, - items : Children, -} - -impl Component for Menu { - fn new() -> Self { - Menu::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes(ClassesOp::Prepend, "menu"); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - // cx.set_param::<bool>(PARAM_BASE_INCLUDE_MENU_ASSETS, &true); - // cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, &true); - - PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] { - div class="menu__wrapper" { - div class="menu__panel" { - div class="menu__overlay" {} - nav class="menu__nav" { - div class="menu__header" { - button type="button" class="menu__back" { - (Icon::svg(html! { - path fill-rule="evenodd" 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" {} - }).render(cx)) - } - div class="menu__title" {} - button type="button" class="menu__close" { - (Icon::svg(html! { - path d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z" {} - }).render(cx)) - } - } - ul class="menu__list" { - (self.items().render(cx)) - } - } - } - button - type="button" - class="menu__trigger" - title=[L10n::l("menu_toggle").lookup(cx)] - { - (Icon::svg(html! { - path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5m0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5" {} - }).render(cx)) - } - } - } - }) - } -} - -impl Menu { - // **< Menu BUILDER >*************************************************************************** - - /// Establece el identificador único (`id`) del menú. - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - /// Modifica la lista de clases CSS aplicadas al menú. - #[builder_fn] - pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { - self.classes.alter_value(op, classes); - self - } - - /// Añade un nuevo ítem al menú. - pub fn add_item(mut self, item: menu::Item) -> Self { - self.items.alter_typed(TypedOp::Add(Typed::with(item))); - self - } - - /// Modifica la lista de ítems (`children`) aplicando una operación [`TypedOp`]. - #[builder_fn] - pub fn with_items(mut self, op: TypedOp<menu::Item>) -> Self { - self.items.alter_typed(op); - self - } - - // **< Menu GETTERS >*************************************************************************** - - /// Devuelve las clases CSS asociadas al menú. - pub fn classes(&self) -> &AttrClasses { - &self.classes - } - - /// Devuelve la lista de ítems (`children`) del menú. - pub fn items(&self) -> &Children { - &self.items - } -} diff --git a/src/base/component/menu/submenu.rs b/src/base/component/menu/submenu.rs deleted file mode 100644 index a5957ef9..00000000 --- a/src/base/component/menu/submenu.rs +++ /dev/null @@ -1,73 +0,0 @@ -use crate::prelude::*; - -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Submenu { - id : AttrId, - title: AttrL10n, - items: Children, -} - -impl Component for Submenu { - fn new() -> Self { - Submenu::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - PrepareMarkup::With(html! { - div id=[self.id()] class="menu__submenu" { - @if let Some(title) = self.title().lookup(cx) { - h4 class="menu__submenu-title" { (title) } - } - ul { - (self.items().render(cx)) - } - } - }) - } -} - -impl Submenu { - // **< Submenu BUILDER >************************************************************************ - - /// Establece el identificador único (`id`) del submenú. - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - #[builder_fn] - pub fn with_title(mut self, title: L10n) -> Self { - self.title.alter_value(title); - self - } - - /// Añade un nuevo ítem al submenú. - pub fn add_item(mut self, item: menu::Item) -> Self { - self.items.alter_typed(TypedOp::Add(Typed::with(item))); - self - } - - /// Modifica la lista de ítems (`children`) aplicando una operación [`TypedOp`]. - #[builder_fn] - pub fn with_items(mut self, op: TypedOp<menu::Item>) -> Self { - self.items.alter_typed(op); - self - } - - // **< Submenu GETTERS >************************************************************************ - - pub fn title(&self) -> &AttrL10n { - &self.title - } - - /// Devuelve la lista de ítems (`children`) del submenú. - pub fn items(&self) -> &Children { - &self.items - } -} diff --git a/static/css/menu.css b/static/css/menu.css deleted file mode 100644 index 428ba157..00000000 --- a/static/css/menu.css +++ /dev/null @@ -1,384 +0,0 @@ -/* Aislamiento & normalización */ - -.menu { - isolation: isolate; -} -@supports (all: revert) { - .menu { - all: revert; - display: block; } -} -.menu { - box-sizing: border-box; - line-height: var(--val-menu--line-height, 1.5); - color: var(--val-color--text); - text-align: left; - text-transform: none; - letter-spacing: normal; - word-spacing: normal; - white-space: normal; - cursor: default; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - width: 100%; - height: auto; - margin: 0; - padding: 0; - z-index: 9999; - border: 0; - background: var(--val-menu--color-bg); -} -.menu *, -.menu *::before, -.menu *::after { - box-sizing: inherit; -} -.menu :where(a, button) { - appearance: none; - background: none; - border: 0; - font: inherit; - color: inherit; - text-decoration: none; - cursor: pointer; - -webkit-tap-highlight-color: transparent; -} -.menu :where(a, button):focus-visible { - outline: 2px solid var(--val-menu--color-highlight); - outline-offset: 2px; -} -.menu :where(ul, ol) { - list-style: none; - margin: 0; - padding: 0; -} -.menu svg { - fill: currentColor; -} - -/* Estructura */ - -.menu__wrapper { - padding-right: var(--val-gap); -} - -.menu__nav li { - display: inline-block; - margin: 0; - margin-inline-start: 1.5rem; - padding: 0; - line-height: var(--val-menu--item-height); - list-style: none; -} - -.menu__item--label, -.menu__nav li > .menu__link { - position: relative; - font-weight: normal; - text-rendering: optimizeLegibility; - font-size: 1.45rem; -} -.menu__nav li > .menu__link { - transition: color 0.3s ease-in-out; -} -.menu__nav li:hover > .menu__link, -.menu__nav li > .menu__link:focus { - color: var(--val-menu--color-highlight); -} -.menu__nav li > .menu__link > svg.icon { - margin-left: 0.25rem; -} - -.menu__children { - position: absolute; - max-width: 100%; - height: auto; - padding: var(--val-gap-0-5) var(--val-gap-1-5); - border: 0; - background: var(--val-menu--color-bg); - border-top: 3px solid var(--val-menu--color-highlight); - z-index: 500; - opacity: 0; - visibility: hidden; - box-shadow: 0 4px 6px -1px var(--val-menu--color-border), 0 2px 4px -1px var(--val-menu--color-shadow); - transition: all 0.3s ease-in-out; -} - -.menu__item--children:hover > .menu__children, -.menu__item--children > .menu__link:focus + .menu__children, -.menu__item--children .menu__children:focus-within { - margin-top: 0.4rem; - opacity: 1; - visibility: visible; -} - -.menu__submenu { - min-width: var(--val-menu--item-width-min); - max-width: var(--val-menu--item-width-max); -} -.menu__submenu-title { - font-size: 1rem; - font-weight: normal; - margin: 0; - padding: var(--val-menu--line-padding) 0; - line-height: var(--val-menu--line-height); - border: 0; - color: var(--val-menu--color-highlight); - text-transform: uppercase; - text-rendering: optimizeLegibility; -} -.menu__submenu li { - display: block; - margin: 0; -} - -.menu__children--mega { - left: 50%; - transform: translateX(-50%); -} - -.menu__mega { - display: flex; - flex-wrap: nowrap; -} - -.menu__header, -.menu__trigger { - display: none; -} - -/* Responsive <= 62rem (992px) */ - -@media (max-width: 62rem) { - .menu__wrapper { - padding-right: var(--val-gap-0-5); - } - .menu__trigger { - width: var(--val-menu--trigger-width); - height: var(--val-menu--item-height); - display: flex; - flex-direction: column; - justify-content: center; - } - .menu__trigger svg.icon { - width: 2rem; - height: 2rem; - } - - .menu__nav, - .menu__children { - overscroll-behavior: contain; - -webkit-overflow-scrolling: touch; - } - - .menu__nav { - position: fixed; - top: 0; - left: 0; - width: var(--val-menu--side-width); - height: 100%; - z-index: 9099; - overflow: hidden; - background: var(--val-menu--color-bg); - transform: translate(-100%); - transition: transform .5s ease-in-out, opacity .5s ease-in-out; - will-change: transform; - backface-visibility: hidden; - visibility: hidden; - pointer-events: none; - } - .menu__nav.active { - transform: translate(0%); - visibility: visible; - pointer-events: auto; - } - - .menu__nav li { - display: block; - margin: 0; - line-height: var(--val-menu--line-height); - } - - .menu__item--label, - .menu__nav li > .menu__link { - display: block; - text-align: inherit; - width: 100%; - padding: var(--val-menu--line-padding) var(--val-menu--item-height) var(--val-menu--line-padding) var(--val-menu--item-gap); - border-bottom: 1px solid var(--val-menu--color-border); - } - .menu__nav li ul li.menu__item--label, - .menu__nav li ul li > .menu__link { - border-bottom: 0; - } - .menu__nav li > .menu__link > svg.icon { - position: absolute; - top: var(--val-menu--line-padding); - right: var(--val-menu--line-padding); - height: var(--val-menu--line-height); - font-size: 1.25rem; - transform: rotate(-90deg); - } - - .menu__children { - position: absolute; - display: none; - top: 0; - left: 0; - max-width: none; - min-width: auto; - width: 100%; - height: 100%; - margin: 0 !important; - padding: 0; - border-top: 0; - opacity: 1; - overflow-y: auto; - visibility: visible; - transform: translateX(0%); - box-shadow: none; - transition: opacity .5s ease-in-out, transform .5s ease-in-out, margin-top .5s ease-in-out; - } - .menu__children.active { - display: block; - } - .menu__children > :first-child { - margin-top: 2.675rem; - } - - .menu__submenu-title { - padding: var(--val-menu--line-padding) var(--val-menu--item-height) var(--val-menu--line-padding) var(--val-menu--item-gap); - } - - .menu__mega { - display: block; - } - - .menu__header { - position: sticky; - display: flex; - align-items: center; - justify-content: space-between; - top: 0; - height: var(--val-menu--item-height); - border-bottom: 1px solid var(--val-menu--color-border); - background: var(--val-menu--color-bg); - z-index: 501; - } - .menu__title { - padding: var(--val-menu--line-padding); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - font-size: 1.45rem; - font-weight: normal; - opacity: 0; - transform: translateY(.25rem); - transition: opacity .5s ease-in-out, transform .5s ease-in-out; - will-change: opacity, transform; - } - .menu__header.active .menu__title { - opacity: 1; - transform: translateY(0); - } - .menu__close, - .menu__back { - width: var(--val-menu--item-height); - min-width: var(--val-menu--item-height); - height: var(--val-menu--item-height); - line-height: var(--val-menu--item-height); - color: var(--val-color--text); - display: flex; - align-items: center; - justify-content: center; - background: var(--val-menu--color-bg); - } - .menu__close { - font-size: 2.25rem; - border: 1px solid var(--val-menu--color-border) !important; - border-width: 0 0 1px 1px !important; - } - .menu__back { - font-size: 1.25rem; - border: 1px solid var(--val-menu--color-border) !important; - border-width: 0 1px 1px 0 !important; - display: none; - } - .menu__header.active .menu__back { - display: flex; - } - - .menu__list { - height: 100%; - overflow-y: auto; - overflow-x: hidden; - padding: 0; - margin: 0; - } - - .menu__overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 9098; - opacity: 0; - visibility: hidden; - background: rgba(0, 0, 0, 0.55); - transition: opacity .5s ease-in-out, visibility 0s linear .5s; - } - .menu__overlay.active { - opacity: 1; - visibility: visible; - transition-delay: 0s, 0s; - } -} - -@media (hover: hover) and (pointer: fine) { - .menu__item--children:hover > .menu__children { - margin-top: 0.4rem; - opacity: 1; - visibility: visible; - } - .menu.menu--closing .menu__children { - margin-top: 0 !important; - opacity: 0 !important; - visibility: hidden !important; - } -} - -@media (prefers-reduced-motion: reduce) { - .menu__nav, - .menu__children, - .menu__title, - .menu__overlay { - transition: none !important; - animation: none !important; - } -} - -/* Animaciones */ - -@keyframes slideLeft { - 0% { - opacity: 0; - transform: translateX(100%); - } - 100% { - opacity: 1; - transform: translateX(0%); - } -} - -@keyframes slideRight { - 0% { - opacity: 1; - transform: translateX(0%); - } - 100% { - opacity: 0; - transform: translateX(100%); - } -} diff --git a/static/js/menu.js b/static/js/menu.js deleted file mode 100644 index dca8e4df..00000000 --- a/static/js/menu.js +++ /dev/null @@ -1,95 +0,0 @@ -const getTitle = (li) => li.querySelector('.menu__label')?.textContent.trim() ?? ''; - -function menu__showChildren(nav, children) { - const li = children[0]; - const submenu = li.querySelector('.menu__children'); - submenu.classList.add('active'); - submenu.style.animation = 'slideLeft 0.5s ease forwards'; - - nav.querySelector('.menu__title').textContent = getTitle(li);; - nav.querySelector('.menu__header').classList.add('active'); -} - -function menu__hideChildren(nav, children) { - const submenu = children[0].querySelector('.menu__children'); - submenu.style.animation = 'slideRight 0.5s ease forwards'; - setTimeout(() => { - submenu.classList.remove('active'); - submenu.style.removeProperty('animation'); - }, 300); - - children.shift(); - if (children.length > 0) { - nav.querySelector('.menu__title').textContent = getTitle(children[0]); - } else { - nav.querySelector('.menu__header').classList.remove('active'); - nav.querySelector('.menu__title').textContent = ''; - } -} - -function menu__toggle(nav, overlay) { - nav.classList.toggle('active'); - overlay.classList.toggle('active'); -} - -function menu__reset(menu, nav, overlay) { - menu__toggle(nav, overlay); - setTimeout(() => { - nav.querySelector('.menu__header').classList.remove('active'); - nav.querySelector('.menu__title').textContent = ''; - menu.querySelectorAll('.menu__children').forEach(submenu => { - submenu.classList.remove('active'); - submenu.style.removeProperty('animation'); - }); - }, 300); - return []; -} - -document.querySelectorAll('.menu').forEach(menu => { - let menuChildren = []; - const menuNav = menu.querySelector('.menu__nav'); - const menuOverlay = menu.querySelector('.menu__overlay'); - - menu.querySelector('.menu__list').addEventListener('click', (e) => { - if (menuNav.classList.contains('active')) { - let target = e.target.closest('.menu__item--children'); - if (target && target != menuChildren[0]) { - menuChildren.unshift(target); - menu__showChildren(menuNav, menuChildren); - } - } - }); - - menu.querySelector('.menu__back').addEventListener('click', () => { - menu__hideChildren(menuNav, menuChildren); - }); - - menu.querySelector('.menu__close').addEventListener('click', () => { - menuChildren = menu__reset(menu, menuNav, menuOverlay); - }); - - menu.querySelectorAll('.menu__item--link > a[target="_blank"]').forEach(link => { - link.addEventListener('click', (e) => { - menuChildren = menu__reset(menu, menuNav, menuOverlay); - e.target.blur(); - }); - }); - - menu.querySelector('.menu__trigger').addEventListener('click', () => { - menu__toggle(menuNav, menuOverlay); - }); - - menuOverlay.addEventListener('click', () => { - menu__toggle(menuNav, menuOverlay); - }); - - let resizeTimeout; - window.addEventListener('resize', () => { - if (menuNav.classList.contains('active')) { - clearTimeout(resizeTimeout); - resizeTimeout = setTimeout(() => { - menuChildren = menu__reset(menu, menuNav, menuOverlay); - }, 150); - } - }); -}); From 0d6f975649edae10c6cf54705586a00cea710d1b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 2 Nov 2025 20:47:26 +0100 Subject: [PATCH 842/853] =?UTF-8?q?=F0=9F=93=9D=20Corrige=20ejemplo=20de?= =?UTF-8?q?=20documentaci=C3=B3n=20de`Offcanvas`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/src/theme/offcanvas.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas.rs b/extensions/pagetop-bootsier/src/theme/offcanvas.rs index dc905348..18cc253a 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas.rs @@ -13,7 +13,7 @@ //! .with_body_scroll(offcanvas::BodyScroll::Enabled) //! .with_visibility(offcanvas::Visibility::Default) //! .add_child(Dropdown::new() -//! .with_button_title(L10n::n("Menu")) +//! .with_title(L10n::n("Menu")) //! .add_item(dropdown::Item::label(L10n::n("Label"))) //! .add_item(dropdown::Item::link_blank(L10n::n("Google"), |_| "https://www.google.es")) //! .add_item(dropdown::Item::link(L10n::n("Sign out"), |_| "/signout")) From 9a26d579ed022a479c39cb2687407c100f649869 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sun, 2 Nov 2025 20:47:50 +0100 Subject: [PATCH 843/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20ejemplo=20de?= =?UTF-8?q?=20barra=20de=20men=C3=BA=20de=20navegaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/navbar-menus.rs | 101 ++++++++++++++++++++++++++++++++++++ src/locale/en-US/sample.ftl | 24 +++++++++ src/locale/es-ES/sample.ftl | 24 +++++++++ 3 files changed, 149 insertions(+) create mode 100644 examples/navbar-menus.rs create mode 100644 src/locale/en-US/sample.ftl create mode 100644 src/locale/es-ES/sample.ftl diff --git a/examples/navbar-menus.rs b/examples/navbar-menus.rs new file mode 100644 index 00000000..22ef336c --- /dev/null +++ b/examples/navbar-menus.rs @@ -0,0 +1,101 @@ +use pagetop::prelude::*; + +use pagetop_bootsier::prelude::*; + +struct SuperMenu; + +impl Extension for SuperMenu { + fn dependencies(&self) -> Vec<ExtensionRef> { + vec![&pagetop_aliner::Aliner, &pagetop_bootsier::Bootsier] + } + + fn initialize(&self) { + let home_path = |cx: &Context| match cx.langid().language.as_str() { + "en" => "/en", + _ => "/", + }; + + let navbar_menu = Navbar::brand_left(navbar::Brand::new().with_path(Some(home_path))) + .with_expand(BreakPoint::LG) + .add_item(navbar::Item::nav( + Nav::new() + .add_item(nav::Item::link( + L10n::l("sample_menus_item_link"), + home_path, + )) + .add_item(nav::Item::link_blank( + L10n::l("sample_menus_item_blank"), + |_| "https://docs.rs/pagetop", + )) + .add_item(nav::Item::dropdown( + Dropdown::new() + .with_title(L10n::l("sample_menus_test_title")) + .add_item(dropdown::Item::header(L10n::l("sample_menus_dev_header"))) + .add_item(dropdown::Item::link( + L10n::l("sample_menus_dev_getting_started"), + |_| "/dev/getting-started", + )) + .add_item(dropdown::Item::link( + L10n::l("sample_menus_dev_guides"), + |_| "/dev/guides", + )) + .add_item(dropdown::Item::link_blank( + L10n::l("sample_menus_dev_forum"), + |_| "https://forum.example.dev", + )) + .add_item(dropdown::Item::divider()) + .add_item(dropdown::Item::header(L10n::l("sample_menus_sdk_header"))) + .add_item(dropdown::Item::link( + L10n::l("sample_menus_sdk_rust"), + |_| "/dev/sdks/rust", + )) + .add_item(dropdown::Item::link(L10n::l("sample_menus_sdk_js"), |_| { + "/dev/sdks/js" + })) + .add_item(dropdown::Item::link( + L10n::l("sample_menus_sdk_python"), + |_| "/dev/sdks/python", + )) + .add_item(dropdown::Item::divider()) + .add_item(dropdown::Item::header(L10n::l( + "sample_menus_plugin_header", + ))) + .add_item(dropdown::Item::link( + L10n::l("sample_menus_plugin_auth"), + |_| "/dev/sdks/rust/plugins/auth", + )) + .add_item(dropdown::Item::link( + L10n::l("sample_menus_plugin_cache"), + |_| "/dev/sdks/rust/plugins/cache", + )) + .add_item(dropdown::Item::divider()) + .add_item(dropdown::Item::label(L10n::l("sample_menus_item_label"))) + .add_item(dropdown::Item::link_disabled( + L10n::l("sample_menus_item_disabled"), + |_| "#", + )), + )) + .add_item(nav::Item::link_disabled( + L10n::l("sample_menus_item_disabled"), + |_| "#", + )), + )) + .add_item(navbar::Item::nav( + Nav::new() + .add_item(nav::Item::link( + L10n::l("sample_menus_item_sign_up"), + |_| "/auth/sign-up", + )) + .add_item(nav::Item::link(L10n::l("sample_menus_item_login"), |_| { + "/auth/login" + })), + )); + + InRegion::Key("header").add(Child::with(navbar_menu)); + } +} + +#[pagetop::main] +async fn main() -> std::io::Result<()> { + Application::prepare(&SuperMenu).run()?.await +} diff --git a/src/locale/en-US/sample.ftl b/src/locale/en-US/sample.ftl new file mode 100644 index 00000000..ae5b9a7f --- /dev/null +++ b/src/locale/en-US/sample.ftl @@ -0,0 +1,24 @@ +# menus.rs +sample_menus_item_label = Label +sample_menus_item_link = Link +sample_menus_item_blank = External link +sample_menus_item_disabled = Disabled link + +sample_menus_test_title = Dropdown + +sample_menus_dev_header = Intro +sample_menus_dev_getting_started = Getting started +sample_menus_dev_guides = Development guides +sample_menus_dev_forum = Developers forum + +sample_menus_sdk_header = Software Development Kits +sample_menus_sdk_rust = SDKs Rust +sample_menus_sdk_js = SDKs JavaScript +sample_menus_sdk_python = SDKs Python + +sample_menus_plugin_header = Plugins +sample_menus_plugin_auth = Rust Plugin Auth +sample_menus_plugin_cache = Rust Plugin Cache + +sample_menus_item_sign_up = Sign up +sample_menus_item_login = Login diff --git a/src/locale/es-ES/sample.ftl b/src/locale/es-ES/sample.ftl new file mode 100644 index 00000000..65785972 --- /dev/null +++ b/src/locale/es-ES/sample.ftl @@ -0,0 +1,24 @@ +# menus.rs +sample_menus_item_label = Etiqueta +sample_menus_item_link = Enlace +sample_menus_item_blank = Enlace externo +sample_menus_item_disabled = Enlace deshabilitado + +sample_menus_test_title = Desplegable + +sample_menus_dev_header = Introducción +sample_menus_dev_getting_started = Primeros pasos +sample_menus_dev_guides = Guías de desarrollo +sample_menus_dev_forum = Foro de desarrolladores + +sample_menus_sdk_header = Kits de Desarrollo Software +sample_menus_sdk_rust = SDKs de Rust +sample_menus_sdk_js = SDKs de JavaScript +sample_menus_sdk_python = SDKs de Python + +sample_menus_plugin_header = Plugins +sample_menus_plugin_auth = Plugin Rust de autenticación +sample_menus_plugin_cache = Plugin Rust de caché + +sample_menus_item_sign_up = Registrarse +sample_menus_item_login = Iniciar sesión From d5f0d83939f31ffcd20121e32b34b6a7346dadca Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 3 Nov 2025 22:43:31 +0100 Subject: [PATCH 844/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20(bootsier):=20Refa?= =?UTF-8?q?ctoriza=20y=20renombra=20estilos=20`aux`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-bootsier/src/theme/aux.rs | 9 +- .../pagetop-bootsier/src/theme/aux/border.rs | 39 ++- .../pagetop-bootsier/src/theme/aux/color.rs | 226 ++++++++++++++---- .../pagetop-bootsier/src/theme/aux/opacity.rs | 109 --------- .../pagetop-bootsier/src/theme/aux/rounded.rs | 2 +- .../pagetop-bootsier/src/theme/aux/size.rs | 9 +- .../pagetop-bootsier/src/theme/container.rs | 40 ++-- .../pagetop-bootsier/src/theme/dropdown.rs | 2 +- .../src/theme/dropdown/component.rs | 6 +- .../src/theme/navbar/component.rs | 48 +++- 10 files changed, 267 insertions(+), 223 deletions(-) delete mode 100644 extensions/pagetop-bootsier/src/theme/aux/opacity.rs diff --git a/extensions/pagetop-bootsier/src/theme/aux.rs b/extensions/pagetop-bootsier/src/theme/aux.rs index f3cc127d..a56b14e9 100644 --- a/extensions/pagetop-bootsier/src/theme/aux.rs +++ b/extensions/pagetop-bootsier/src/theme/aux.rs @@ -4,12 +4,9 @@ mod breakpoint; pub use breakpoint::BreakPoint; mod color; -pub use color::Color; -pub use color::{BgColor, BorderColor, ButtonColor, TextColor}; - -mod opacity; -pub use opacity::Opacity; -pub use opacity::{BgOpacity, BorderOpacity, TextOpacity}; +pub use color::{Color, Opacity}; +pub use color::{ColorBg, ColorBorder, ColorButton, ColorText}; +pub use color::{StyleBg, StyleBorder, StyleText}; mod border; pub use border::{Border, BorderSize}; diff --git a/extensions/pagetop-bootsier/src/theme/aux/border.rs b/extensions/pagetop-bootsier/src/theme/aux/border.rs index 840f03c7..de3df81e 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/border.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/border.rs @@ -6,7 +6,7 @@ use std::fmt; // **< BorderSize >********************************************************************************* -/// Tamaño (**ancho**) para los bordes ([`Border`]). +/// Tamaño para el ancho de los bordes ([`Border`]). /// /// Mapea a `border`, `border-0` y `border-{1..5}`: /// @@ -58,7 +58,7 @@ impl fmt::Display for BorderSize { /// - Definir un tamaño **global** para todo el borde (`size`). /// - Ajustar el tamaño de cada **lado lógico** (`top`, `end`, `bottom`, `start`, **en este orden**, /// respetando LTR/RTL). -/// - Aplicar un **color** al borde (`BorderColor`). +/// - Aplicar un **color** al borde (`ColorBorder`). /// - Aplicar un nivel de **opacidad** (`BorderOpacity`). /// /// # Comportamiento aditivo / sustractivo @@ -107,21 +107,19 @@ impl fmt::Display for BorderSize { /// let b = Border::with(BorderSize::Default) // Borde global por defecto. /// .with_top(BorderSize::Zero) // Quita borde superior. /// .with_end(BorderSize::Scale3) // Ancho 3 para el lado lógico final. -/// .with_color(BorderColor::Theme(Color::Primary)) -/// .with_opacity(BorderOpacity::Theme(Opacity::Half)); +/// .with_style(StyleBorder::Both(ColorBorder::Theme(Color::Primary), Opacity::Half)); /// /// assert_eq!(b.to_string(), "border border-top-0 border-end-3 border-primary border-opacity-50"); /// ``` #[rustfmt::skip] #[derive(AutoDefault)] pub struct Border { - size : BorderSize, - top : BorderSize, - end : BorderSize, - bottom : BorderSize, - start : BorderSize, - color : BorderColor, - opacity: BorderOpacity, + size : BorderSize, + top : BorderSize, + end : BorderSize, + bottom: BorderSize, + start : BorderSize, + style : StyleBorder, } impl Border { @@ -167,22 +165,16 @@ impl Border { self } - /// Establece el **color** del borde. - pub fn with_color(mut self, color: BorderColor) -> Self { - self.color = color; - self - } - - /// Establece la **opacidad** del borde. - pub fn with_opacity(mut self, opacity: BorderOpacity) -> Self { - self.opacity = opacity; + /// Establece el estilo de color/opacidad del borde. + pub fn with_style(mut self, style: StyleBorder) -> Self { + self.style = style; self } } impl fmt::Display for Border { - /// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start`, *color* y - /// *opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías. + /// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start` y + /// *color*/*opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, @@ -193,8 +185,7 @@ impl fmt::Display for Border { self.end.to_class("border-end"), self.bottom.to_class("border-bottom"), self.start.to_class("border-start"), - self.color.to_string(), - self.opacity.to_string(), + self.style.to_string(), ]; " ") .unwrap_or_default() ) diff --git a/extensions/pagetop-bootsier/src/theme/aux/color.rs b/extensions/pagetop-bootsier/src/theme/aux/color.rs index c071e407..17d192dd 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/color.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/color.rs @@ -4,11 +4,11 @@ use std::fmt; // **< Color >************************************************************************************** -/// Paleta de colores **temáticos**. +/// Paleta de colores temáticos. /// -/// Equivalente a los nombres estándar de Bootstrap (`primary`, `secondary`, `success`, etc.). Sirve -/// como base para componer clases de fondo ([`BgColor`]), borde ([`BorderColor`]) y texto -/// ([`TextColor`]). +/// Equivalen a los nombres estándar definidos por Bootstrap (`primary`, `secondary`, `success`, +/// etc.). Este tipo enumerado sirve de base para componer clases de color para el fondo +/// ([`ColorBg`]), bordes ([`ColorBorder`]) y texto ([`ColorText`]). #[derive(AutoDefault)] pub enum Color { #[default] @@ -38,32 +38,34 @@ impl fmt::Display for Color { } } -// **< BgColor >************************************************************************************ +// **< ColorBg >************************************************************************************ -/// Colores de fondo (`bg-*`). -/// -/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). -/// - `Body*` usa fondos predefinidos del tema (`bg-body`, `bg-body-secondary`, `bg-body-tertiary`). -/// - `Theme(Color)` genera `bg-{color}` (p. ej., `bg-primary`). -/// - `Subtle(Color)` genera `bg-{color}-subtle` (tono suave). -/// - `Black` y `White` son colores explícitos. -/// - `Transparent` no aplica color de fondo (`bg-transparent`). +/// Colores `bg-*` para el fondo. #[derive(AutoDefault)] -pub enum BgColor { +pub enum ColorBg { + /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). #[default] Default, + /// Fondo predefinido del tema (`bg-body`). Body, + /// Fondo predefinido del tema (`bg-body-secondary`). BodySecondary, + /// Fondo predefinido del tema (`bg-body-tertiary`). BodyTertiary, + /// Genera internamente clases `bg-{color}` (p. ej., `bg-primary`). Theme(Color), + /// Genera internamente clases `bg-{color}-subtle` (un tono suavizado del color). Subtle(Color), + /// Color negro. Black, + /// Color blanco. White, + /// No aplica ningún color de fondo (`bg-transparent`). Transparent, } #[rustfmt::skip] -impl fmt::Display for BgColor { +impl fmt::Display for ColorBg { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Default => Ok(()), @@ -79,26 +81,26 @@ impl fmt::Display for BgColor { } } -// **< BorderColor >******************************************************************************** +// **< ColorBorder >******************************************************************************** -/// Colores (`border-*`) para los bordes ([`Border`](crate::theme::aux::Border)). -/// -/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). -/// - `Theme(Color)` genera `border-{color}`. -/// - `Subtle(Color)` genera `border-{color}-subtle` (versión suavizada). -/// - `Black` y `White` son colores explícitos. +/// Colores `border-*` para los bordes ([`Border`](crate::theme::aux::Border)). #[derive(AutoDefault)] -pub enum BorderColor { +pub enum ColorBorder { + /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). #[default] Default, + /// Genera internamente clases `border-{color}`. Theme(Color), + /// Genera internamente clases `border-{color}-subtle` (un tono suavizado del color). Subtle(Color), + /// Color negro. Black, + /// Color blanco. White, } #[rustfmt::skip] -impl fmt::Display for BorderColor { +impl fmt::Display for ColorBorder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Default => Ok(()), @@ -110,25 +112,24 @@ impl fmt::Display for BorderColor { } } -// **< ButtonColor >******************************************************************************** +// **< ColorButton >******************************************************************************** -/// Variantes de color (`btn-*`) para **botones**. -/// -/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). -/// - `Background(Color)` genera `btn-{color}` (botón relleno). -/// - `Outline(Color)` genera `btn-outline-{color}` (contorno: texto y borde, fondo transparente). -/// - `Link` aplica estilo de enlace (`btn-link`), sin caja ni fondo, heredando el color de texto. +/// Variantes de color `btn-*` para botones. #[derive(AutoDefault)] -pub enum ButtonColor { +pub enum ColorButton { + /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). #[default] Default, + /// Genera internamente clases `btn-{color}` (botón relleno). Background(Color), + /// Genera `btn-outline-{color}` (fondo transparente y contorno con borde). Outline(Color), + /// Aplica estilo de los enlaces (`btn-link`), sin caja ni fondo, heredando el color de texto. Link, } #[rustfmt::skip] -impl fmt::Display for ButtonColor { +impl fmt::Display for ColorButton { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Default => Ok(()), @@ -139,34 +140,34 @@ impl fmt::Display for ButtonColor { } } -// **< TextColor >********************************************************************************** +// **< ColorText >********************************************************************************** -/// Colores de texto y fondos de texto (`text-*`). -/// -/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). -/// - `Body*` aplica colores predefinidos del tema (`text-body`, `text-body-emphasis`, -/// `text-body-secondary`, `text-body-tertiary`). -/// - `Theme(Color)` genera `text-{color}`. -/// - `Emphasis(Color)` genera `text-{color}-emphasis` (contraste mayor acorde al tema). -/// - `Background(Color)` genera `text-bg-{color}` (para color de fondo del texto). -/// - `Black` y `White` son colores explícitos. +/// Colores `text-*` para el texto. #[derive(AutoDefault)] -pub enum TextColor { +pub enum ColorText { + /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). #[default] Default, + /// Color predefinido del tema (`text-body`). Body, + /// Color predefinido del tema (`text-body-emphasis`). BodyEmphasis, + /// Color predefinido del tema (`text-body-secondary`). BodySecondary, + /// Color predefinido del tema (`text-body-tertiary`). BodyTertiary, + /// Genera internamente clases `text-{color}`. Theme(Color), + /// Genera internamente clases `text-{color}-emphasis` (mayor contraste acorde al tema). Emphasis(Color), - Background(Color), + /// Color negro. Black, + /// Color blanco. White, } #[rustfmt::skip] -impl fmt::Display for TextColor { +impl fmt::Display for ColorText { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Default => Ok(()), @@ -176,9 +177,140 @@ impl fmt::Display for TextColor { Self::BodyTertiary => f.write_str("text-body-tertiary"), Self::Theme(c) => write!(f, "text-{c}"), Self::Emphasis(c) => write!(f, "text-{c}-emphasis"), - Self::Background(c) => write!(f, "text-bg-{c}"), Self::Black => f.write_str("text-black"), Self::White => f.write_str("text-white"), } } } + +// **< Opacity >************************************************************************************ + +/// Niveles de opacidad (`opacity-*`). +/// +/// Se usa normalmente para graduar la transparencia del color de fondo `bg-opacity-*` +/// ([`StyleBg`]), de los bordes `border-opacity-*` ([`StyleBorder`]) o del texto `text-opacity-*` +/// ([`StyleText`]). +#[rustfmt::skip] +#[derive(AutoDefault)] +pub enum Opacity { + /// Genera internamente clases `opacity-100` (100% de opacidad). + #[default] + Opaque, + /// Genera internamente clases `opacity-75` (75%). + SemiOpaque, + /// Genera internamente clases `opacity-50` (50%). + Half, + /// Genera internamente clases `opacity-25` (25%). + SemiTransparent, + /// Genera internamente clases `opacity-10` (10%). + AlmostTransparent, + /// Genera internamente clases `opacity-0` (0%, totalmente transparente). + Transparent, +} + +#[rustfmt::skip] +impl fmt::Display for Opacity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Opaque => f.write_str("opacity-100"), + Self::SemiOpaque => f.write_str("opacity-75"), + Self::Half => f.write_str("opacity-50"), + Self::SemiTransparent => f.write_str("opacity-25"), + Self::AlmostTransparent => f.write_str("opacity-10"), + Self::Transparent => f.write_str("opacity-0"), + } + } +} + +// **< StyleBg >*********************************************************************************** + +/// Estilos de color/opacidad para el fondo. +#[derive(AutoDefault)] +pub enum StyleBg { + /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). + #[default] + Default, + /// Genera internamente clases `bg-*`. + Color(ColorBg), + /// Genera internamente clases `bg-opacity-*`. + Opacity(Opacity), + /// Genera internamente clases `bg-* bg-opacity-*`. + Both(ColorBg, Opacity), +} + +#[rustfmt::skip] +impl fmt::Display for StyleBg { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Color(c) => write!(f, "{c}"), + Self::Opacity(o) => write!(f, "bg-{o}"), + Self::Both(c, o) => write!(f, "{c} bg-{o}"), + } + } +} + +// **< StyleBorder >******************************************************************************* + +/// Estilos de color/opacidad para los bordes ([`Border`](crate::theme::aux::Border)). +#[derive(AutoDefault)] +pub enum StyleBorder { + /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). + #[default] + Default, + /// Genera internamente clases `border-*`. + Color(ColorBorder), + /// Genera internamente clases `border-opacity-*`. + Opacity(Opacity), + /// Genera internamente clases `border-* border-opacity-*`. + Both(ColorBorder, Opacity), +} + +#[rustfmt::skip] +impl fmt::Display for StyleBorder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Color(c) => write!(f, "{c}"), + Self::Opacity(o) => write!(f, "border-{o}"), + Self::Both(c, o) => write!(f, "{c} border-{o}"), + } + } +} + +// **< StyleText >********************************************************************************* + +/// Estilos de color/opacidad para texto y fondo del texto. +#[derive(AutoDefault)] +pub enum StyleText { + /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). + #[default] + Default, + /// Genera internamente clases `text-*`. + Color(ColorText), + /// Genera internamente clases `text-opacity-*`. + Opacity(Opacity), + /// Genera internamente clases `text-* text-opacity-*`. + Both(ColorText, Opacity), + /// Genera internamente clases `text-bg-*` (para el color de fondo del texto). + Bg(Color), + /// Genera internamente clases `text-bg-* text-*`. + BgAndColor(Color, ColorText), + /// Genera internamente clases `text-bg-* text-* text-opacity-*`. + All(Color, ColorText, Opacity), +} + +#[rustfmt::skip] +impl fmt::Display for StyleText { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Color(c) => write!(f, "{c}"), + Self::Opacity(o) => write!(f, "text-{o}"), + Self::Both(c, o) => write!(f, "{c} text-{o}"), + Self::Bg(bg) => write!(f, "text-bg-{bg}"), + Self::BgAndColor(bg, c) => write!(f, "text-bg-{bg} {c}"), + Self::All(bg, c, o) => write!(f, "text-bg-{bg} {c} text-{o}"), + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/aux/opacity.rs b/extensions/pagetop-bootsier/src/theme/aux/opacity.rs deleted file mode 100644 index 96724d91..00000000 --- a/extensions/pagetop-bootsier/src/theme/aux/opacity.rs +++ /dev/null @@ -1,109 +0,0 @@ -use pagetop::prelude::*; - -use std::fmt; - -// **< Opacity >************************************************************************************ - -/// Niveles de **opacidad** (`opacity-*`). -/// -/// Se usa para modular la transparencia del color de fondo `bg-opacity-*` ([`BgOpacity`]), borde -/// `border-opacity-*` ([`BorderOpacity`]) o texto `text-opacity-*` ([`TextOpacity`]), según las -/// siguientes equivalencias: -/// -/// - `Opaque` => `opacity-100` (100% de opacidad). -/// - `SemiOpaque` => `opacity-75` (75%). -/// - `Half` => `opacity-50` (50%). -/// - `SemiTransparent` => `opacity-25` (25%). -/// - `AlmostTransparent` => `opacity-10` (10%). -/// - `Transparent` => `opacity-0` (0%, totalmente transparente). -#[rustfmt::skip] -#[derive(AutoDefault)] -pub enum Opacity { - #[default] - Opaque, // 100% - SemiOpaque, // 75% - Half, // 50% - SemiTransparent, // 25% - AlmostTransparent, // 10% - Transparent, // 0% -} - -#[rustfmt::skip] -impl fmt::Display for Opacity { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Opaque => f.write_str("opacity-100"), - Self::SemiOpaque => f.write_str("opacity-75"), - Self::Half => f.write_str("opacity-50"), - Self::SemiTransparent => f.write_str("opacity-25"), - Self::AlmostTransparent => f.write_str("opacity-10"), - Self::Transparent => f.write_str("opacity-0"), - } - } -} - -// **< BgOpacity >********************************************************************************** - -/// Opacidad para el fondo (`bg-opacity-*`). -/// -/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). -/// - `Theme(Opacity)` genera `bg-{opacity}` (p. ej., `bg-opacity-50`). -#[derive(AutoDefault)] -pub enum BgOpacity { - #[default] - Default, - Theme(Opacity), -} - -impl fmt::Display for BgOpacity { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Theme(o) => write!(f, "bg-{o}"), - } - } -} - -// **< BorderOpacity >****************************************************************************** - -/// Opacidad (`border-opacity-*`) para los bordes ([`Border`](crate::theme::aux::Border)). -/// -/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). -/// - `Theme(Opacity)` genera `border-{opacity}` (p. ej., `border-opacity-25`). -#[derive(AutoDefault)] -pub enum BorderOpacity { - #[default] - Default, - Theme(Opacity), -} - -impl fmt::Display for BorderOpacity { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Theme(o) => write!(f, "border-{o}"), - } - } -} - -// **< TextOpacity >******************************************************************************** - -/// Opacidad para el texto (`text-opacity-*`). -/// -/// - `Default` no añade clase (devuelve `""` para facilitar la composición de clases). -/// - `Theme(Opacity)` genera `text-{opacity}` (p. ej., `text-opacity-100`). -#[derive(AutoDefault)] -pub enum TextOpacity { - #[default] - Default, - Theme(Opacity), -} - -impl fmt::Display for TextOpacity { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Theme(o) => write!(f, "text-{o}"), - } - } -} diff --git a/extensions/pagetop-bootsier/src/theme/aux/rounded.rs b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs index f7f6e3fe..470a48a3 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/rounded.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs @@ -4,7 +4,7 @@ use std::fmt; // **< RoundedRadius >****************************************************************************** -/// Radio (**redondeo**) para las esquinas ([`Rounded`]). +/// Radio para el redondeo de esquinas ([`Rounded`]). /// /// Mapea a `rounded`, `rounded-0`, `rounded-{1..5}`, `rounded-circle` y `rounded-pill`. /// diff --git a/extensions/pagetop-bootsier/src/theme/aux/size.rs b/extensions/pagetop-bootsier/src/theme/aux/size.rs index e5cff63c..d0abdb51 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/size.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/size.rs @@ -5,17 +5,14 @@ use std::fmt; // **< ButtonSize >********************************************************************************* /// Tamaño visual de un botón. -/// -/// Controla la escala del botón según el diseño del tema: -/// -/// - `Default`, tamaño por defecto del tema (no añade clase). -/// - `Small`, botón compacto. -/// - `Large`, botón destacado/grande. #[derive(AutoDefault)] pub enum ButtonSize { + /// Tamaño por defecto del tema (no añade clase). #[default] Default, + /// Botón compacto. Small, + /// Botón destacado/grande. Large, } diff --git a/extensions/pagetop-bootsier/src/theme/container.rs b/extensions/pagetop-bootsier/src/theme/container.rs index 17512505..411eb0aa 100644 --- a/extensions/pagetop-bootsier/src/theme/container.rs +++ b/extensions/pagetop-bootsier/src/theme/container.rs @@ -56,8 +56,8 @@ pub struct Container { classes : AttrClasses, container_type : ContainerType, container_width: ContainerWidth, - bg_color : BgColor, - text_color : TextColor, + style_bg : StyleBg, + style_text : StyleText, border : Border, rounded : Rounded, children : Children, @@ -86,8 +86,8 @@ impl Component for Container { ContainerWidth::FluidMax(_) => "fluid".to_string(), } ), - self.bg_color().to_string(), - self.text_color().to_string(), + self.style_bg().to_string(), + self.style_text().to_string(), self.border().to_string(), self.rounded().to_string(), ] @@ -205,25 +205,25 @@ impl Container { self } - /// Establece el color de fondo ([`BgColor`]). + /// Establece el estilo del fondo ([`StyleBg`]). #[builder_fn] - pub fn with_bg_color(mut self, color: BgColor) -> Self { - self.bg_color = color; + pub fn with_style_bg(mut self, style: StyleBg) -> Self { + self.style_bg = style; self } - /// Establece el color del texto ([`TextColor`]). + /// Establece el estilo del texto ([`StyleText`]). #[builder_fn] - pub fn with_text_color(mut self, color: TextColor) -> Self { - self.text_color = color; + pub fn with_style_text(mut self, style: StyleText) -> Self { + self.style_text = style; self } - /// Atajo para definir los colores de fondo y texto a la vez. + /// Atajo para definir los estilos de fondo y texto a la vez. #[builder_fn] - pub fn with_colors(mut self, bg_color: BgColor, text_color: TextColor) -> Self { - self.bg_color = bg_color; - self.text_color = text_color; + pub fn with_styles(mut self, style_bg: StyleBg, style_text: StyleText) -> Self { + self.style_bg = style_bg; + self.style_text = style_text; self } @@ -272,14 +272,14 @@ impl Container { &self.container_width } - /// Devuelve el color de fondo del contenedor. - pub fn bg_color(&self) -> &BgColor { - &self.bg_color + /// Devuelve el estilo del fondo del contenedor. + pub fn style_bg(&self) -> &StyleBg { + &self.style_bg } - /// Devuelve el color del texto del contenedor. - pub fn text_color(&self) -> &TextColor { - &self.text_color + /// Devuelve el estilo del texto del contenedor. + pub fn style_text(&self) -> &StyleText { + &self.style_text } /// Devuelve el borde configurado del contenedor. diff --git a/extensions/pagetop-bootsier/src/theme/dropdown.rs b/extensions/pagetop-bootsier/src/theme/dropdown.rs index ed4cbec0..bbad2d3f 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown.rs @@ -14,7 +14,7 @@ //! # use pagetop_bootsier::prelude::*; //! let dd = Dropdown::new() //! .with_title(L10n::n("Menu")) -//! .with_button_color(ButtonColor::Background(Color::Secondary)) +//! .with_button_color(ColorButton::Background(Color::Secondary)) //! .with_auto_close(dropdown::AutoClose::ClickableInside) //! .with_direction(dropdown::Direction::Dropend) //! .add_item(dropdown::Item::link(L10n::n("Home"), |_| "/")) diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index c29ac145..57e30713 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -26,7 +26,7 @@ pub struct Dropdown { classes : AttrClasses, title : L10n, button_size : ButtonSize, - button_color : ButtonColor, + button_color : ColorButton, button_split : bool, button_grouped: bool, auto_close : dropdown::AutoClose, @@ -212,7 +212,7 @@ impl Dropdown { /// Define el color/estilo del botón. #[builder_fn] - pub fn with_button_color(mut self, color: ButtonColor) -> Self { + pub fn with_button_color(mut self, color: ColorButton) -> Self { self.button_color = color; self } @@ -291,7 +291,7 @@ impl Dropdown { } /// Devuelve el color/estilo configurado del botón. - pub fn button_color(&self) -> &ButtonColor { + pub fn button_color(&self) -> &ColorButton { &self.button_color } diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs index fc46175a..6362b9d6 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/component.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs @@ -17,12 +17,14 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas"; #[rustfmt::skip] #[derive(AutoDefault)] pub struct Navbar { - id : AttrId, - classes : AttrClasses, - expand : BreakPoint, - layout : navbar::Layout, - position: navbar::Position, - items : Children, + id : AttrId, + classes : AttrClasses, + expand : BreakPoint, + layout : navbar::Layout, + position : navbar::Position, + style_bg : StyleBg, + style_text: StyleText, + items : Children, } impl Component for Navbar { @@ -48,6 +50,8 @@ impl Component for Navbar { navbar::Position::StickyBottom => "sticky-bottom", } .to_string(), + self.style_bg().to_string(), + self.style_text().to_string(), ] .join(" "), ); @@ -255,6 +259,28 @@ impl Navbar { self } + /// Establece el estilo del fondo ([`StyleBg`]). + #[builder_fn] + pub fn with_style_bg(mut self, style: StyleBg) -> Self { + self.style_bg = style; + self + } + + /// Establece el estilo del texto ([`StyleText`]). + #[builder_fn] + pub fn with_style_text(mut self, style: StyleText) -> Self { + self.style_text = style; + self + } + + /// Atajo para definir los estilos de fondo y texto a la vez. + #[builder_fn] + pub fn with_styles(mut self, style_bg: StyleBg, style_text: StyleText) -> Self { + self.style_bg = style_bg; + self.style_text = style_text; + self + } + /// Añade un nuevo contenido hijo. #[inline] pub fn add_item(mut self, item: navbar::Item) -> Self { @@ -291,6 +317,16 @@ impl Navbar { &self.position } + /// Devuelve el estilo del fondo del contenedor. + pub fn style_bg(&self) -> &StyleBg { + &self.style_bg + } + + /// Devuelve el estilo del texto del contenedor. + pub fn style_text(&self) -> &StyleText { + &self.style_text + } + /// Devuelve la lista de contenidos (`children`). pub fn items(&self) -> &Children { &self.items From 5ec69345b3db07afa46cfba2f169e8b1e29a7d5d Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 8 Nov 2025 08:07:59 +0100 Subject: [PATCH 845/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20trait=20`JoinC?= =?UTF-8?q?lasses`=20para=20unir=20clases=20CSS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit También elimina macros sin uso `join_op!` y `join_strict!` (KISS). --- src/html.rs | 3 + src/html/assets/javascript.rs | 6 +- src/html/assets/stylesheet.rs | 2 +- src/html/join_classes.rs | 67 ++++++++++++++++++++++ src/prelude.rs | 6 +- src/util.rs | 103 +++++----------------------------- 6 files changed, 90 insertions(+), 97 deletions(-) create mode 100644 src/html/join_classes.rs diff --git a/src/html.rs b/src/html.rs index 5f5b833a..f8709dc5 100644 --- a/src/html.rs +++ b/src/html.rs @@ -87,6 +87,9 @@ use crate::{core, AutoDefault}; #[allow(type_alias_bounds)] pub type OptionComponent<C: core::component::Component> = core::component::Typed<C>; +mod join_classes; +pub use join_classes::JoinClasses; + mod unit; pub use unit::UnitValue; diff --git a/src/html/assets/javascript.rs b/src/html/assets/javascript.rs index 0e86f0d4..6394842a 100644 --- a/src/html/assets/javascript.rs +++ b/src/html/assets/javascript.rs @@ -215,13 +215,13 @@ impl Asset for JavaScript { fn render(&self, cx: &mut Context) -> Markup { match &self.source { Source::From(path) => html! { - script src=(join_pair!(path, "?v=", self.version.as_str())) {}; + script src=(join_pair!(path, "?v=", &self.version)) {}; }, Source::Defer(path) => html! { - script src=(join_pair!(path, "?v=", self.version.as_str())) defer {}; + script src=(join_pair!(path, "?v=", &self.version)) defer {}; }, Source::Async(path) => html! { - script src=(join_pair!(path, "?v=", self.version.as_str())) async {}; + script src=(join_pair!(path, "?v=", &self.version)) async {}; }, Source::Inline(_, f) => html! { script { (PreEscaped((f)(cx))) }; diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 5f0eaaa0..68a13da6 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -170,7 +170,7 @@ impl Asset for StyleSheet { Source::From(path) => html! { link rel="stylesheet" - href=(join_pair!(path, "?v=", self.version.as_str())) + href=(join_pair!(path, "?v=", &self.version)) media=[self.media.as_str_opt()]; }, Source::Inline(_, f) => html! { diff --git a/src/html/join_classes.rs b/src/html/join_classes.rs new file mode 100644 index 00000000..3f7d7e70 --- /dev/null +++ b/src/html/join_classes.rs @@ -0,0 +1,67 @@ +/// Añade a los *slices* de elementos [`AsRef<str>`] un método para unir clases CSS. +/// +/// El método es [`join_classes()`](JoinClasses::join_classes), que une las cadenas **no vacías** +/// del *slice* usando un espacio como separador. +pub trait JoinClasses { + /// Une las cadenas **no vacías** de un *slice* usando un espacio como separador. + /// + /// Son cadenas vacías únicamente los elementos del *slice* cuya longitud es `0` (p. ej., `""`); + /// no se realiza recorte ni normalización, por lo que elementos como `" "` no se consideran + /// vacíos. + /// + /// Si todas las cadenas están vacías, devuelve una cadena vacía. Acepta elementos que + /// implementen [`AsRef<str>`] como `&str`, [`String`] o `Cow<'_, str>`. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop::prelude::*; + /// let classes = ["btn", "", "btn-primary"]; + /// assert_eq!(classes.join_classes(), "btn btn-primary"); + /// + /// let empty: [&str; 3] = ["", "", ""]; + /// assert_eq!(empty.join_classes(), ""); + /// + /// let border = String::from("border"); + /// let border_top = String::from("border-top-0"); + /// let v = vec![&border, "", "", "", &border_top]; + /// assert_eq!(v.as_slice().join_classes(), "border border-top-0"); + /// + /// // Elementos con espacios afectan al resultado. + /// let spaced = ["btn", " ", "primary "]; + /// assert_eq!(spaced.join_classes(), "btn primary "); + /// ``` + fn join_classes(&self) -> String; +} + +impl<T> JoinClasses for [T] +where + T: AsRef<str>, +{ + #[inline] + fn join_classes(&self) -> String { + let mut count = 0usize; + let mut total = 0usize; + for s in self.iter().map(T::as_ref).filter(|s| !s.is_empty()) { + count += 1; + total += s.len(); + } + if count == 0 { + return String::new(); + } + let separator = " "; + let mut result = String::with_capacity(total + separator.len() * count.saturating_sub(1)); + for (i, s) in self + .iter() + .map(T::as_ref) + .filter(|s| !s.is_empty()) + .enumerate() + { + if i > 0 { + result.push_str(separator); + } + result.push_str(s); + } + result + } +} diff --git a/src/prelude.rs b/src/prelude.rs index 377dcdfd..0919e991 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -9,7 +9,7 @@ pub use crate::{AutoDefault, StaticResources, UniqueId, Weight}; // MACROS. // crate::util -pub use crate::{hm, join, join_opt, join_pair, join_strict}; +pub use crate::{hm, join, join_pair}; // crate::config pub use crate::include_config; // crate::locale @@ -33,8 +33,8 @@ pub use crate::trace; // alias obsoletos se volverá a declarar como `pub use crate::html::*;`. pub use crate::html::{ display, html_private, Asset, Assets, AttrClasses, AttrId, AttrL10n, AttrName, AttrValue, - ClassesOp, Escaper, Favicon, JavaScript, Markup, PageTopSvg, PreEscaped, PrepareMarkup, - StyleSheet, TargetMedia, UnitValue, DOCTYPE, + ClassesOp, Escaper, Favicon, JavaScript, JoinClasses, Markup, PageTopSvg, PreEscaped, + PrepareMarkup, StyleSheet, TargetMedia, UnitValue, DOCTYPE, }; pub use crate::locale::*; diff --git a/src/util.rs b/src/util.rs index 3d07361a..30b994f2 100644 --- a/src/util.rs +++ b/src/util.rs @@ -65,53 +65,11 @@ macro_rules! hm { /// ``` #[macro_export] macro_rules! join { - ($($arg:tt)*) => { - $crate::util::concat_string!($($arg)*) + ($($arg:expr),+) => { + $crate::util::concat_string!($($arg),+) }; } -/// Concatena los fragmentos **no vacíos** en un [`Option<String>`] con un separador opcional. -/// -/// Acepta cualquier número de fragmentos que implementen [`AsRef<str>`]. Si todos los fragmentos -/// están vacíos, devuelve `None`. -/// -/// # Ejemplos -/// -/// ```rust -/// # use pagetop::prelude::*; -/// // Concatena los fragmentos no vacíos con un espacio como separador. -/// let result_with_separator = join_opt!(["Hello", "", "World"]; " "); -/// assert_eq!(result_with_separator, Some("Hello World".to_string())); -/// -/// // Concatena los fragmentos no vacíos sin un separador. -/// let result_without_separator = join_opt!(["Hello", "", "World"]); -/// assert_eq!(result_without_separator, Some("HelloWorld".to_string())); -/// -/// // Devuelve `None` si todos los fragmentos están vacíos. -/// let result_empty = join_opt!(["", "", ""]; ","); -/// assert_eq!(result_empty, None); -/// ``` -#[macro_export] -macro_rules! join_opt { - ([$($arg:expr),* $(,)?]) => {{ - let s = $crate::util::concat_string!($($arg),*); - (!s.is_empty()).then_some(s) - }}; - ([$($arg:expr),* $(,)?]; $separator:expr) => {{ - let sep = ($separator).as_ref(); - let mut s = String::new(); - for part in [ $( ($arg).as_ref() ),* ] { - if !(part as &str).is_empty() { - if !s.is_empty() { - s.push_str(sep); - } - s.push_str(part); - } - } - (!s.is_empty()).then_some(s) - }}; -} - /// Concatena dos fragmentos en un [`String`] usando un separador. /// /// Une los dos fragmentos, que deben implementar [`AsRef<str>`], usando el separador proporcionado. @@ -145,54 +103,19 @@ macro_rules! join_opt { #[macro_export] macro_rules! join_pair { ($first:expr, $separator:expr, $second:expr) => {{ - if $first.is_empty() { - String::from($second) - } else if $second.is_empty() { - String::from($first) - } else { - $crate::util::concat_string!($first, $separator, $second) - } - }}; -} + let first_val = $first; + let second_val = $second; + let separator_val = $separator; -/// Concatena varios fragmentos en un [`Option<String>`] **si ninguno está vacío**. -/// -/// Si alguno de los fragmentos, que deben implementar [`AsRef<str>`], está vacío, devuelve -/// [`None`]. Opcionalmente se puede indicar un separador entre los fragmentos concatenados. -/// -/// # Ejemplo -/// -/// ```rust -/// # use pagetop::prelude::*; -/// // Concatena los fragmentos. -/// let result = join_strict!(["Hello", "World"]); -/// assert_eq!(result, Some("HelloWorld".to_string())); -/// -/// // Concatena los fragmentos con un separador. -/// let result_with_separator = join_strict!(["Hello", "World"]; " "); -/// assert_eq!(result_with_separator, Some("Hello World".to_string())); -/// -/// // Devuelve `None` si alguno de los fragmentos está vacío. -/// let result_with_empty = join_strict!(["Hello", "", "World"]); -/// assert_eq!(result_with_empty, None); -/// ``` -#[macro_export] -macro_rules! join_strict { - ([$($arg:expr),* $(,)?]) => {{ - let fragments = [$($arg),*]; - if fragments.iter().any(|&item| item.is_empty()) { - None + let first = AsRef::<str>::as_ref(&first_val); + let second = AsRef::<str>::as_ref(&second_val); + let separator = if first.is_empty() || second.is_empty() { + "" } else { - Some(fragments.concat()) - } - }}; - ([$($arg:expr),* $(,)?]; $separator:expr) => {{ - let fragments = [$($arg),*]; - if fragments.iter().any(|&item| item.is_empty()) { - None - } else { - Some(fragments.join($separator)) - } + AsRef::<str>::as_ref(&separator_val) + }; + + $crate::util::concat_string!(first, separator, second) }}; } From 748bd81bf14f17d012f36b45d01b87a32da788b1 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 10 Nov 2025 07:45:05 +0100 Subject: [PATCH 846/853] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20clases=20de=20?= =?UTF-8?q?fondo,=20texto,=20bordes=20y=20esquinas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Refactoriza el componente contenedor `Container` para usar estas clases y aplicar los nuevos enums `Kind` y `Width` para mejorar el comportamiento semántico y *responsive*. - Actualiza los componentes `Dropdown`, `Image`, `Nav`, `Navbar` y `Offcanvas` para usar los nuevos métodos de unión de clases. - Elimina propiedades de estilo redundantes de los componentes `Navbar` e `Image`, simplificando sus interfaces. --- extensions/pagetop-bootsier/src/lib.rs | 1 - extensions/pagetop-bootsier/src/theme.rs | 14 +- extensions/pagetop-bootsier/src/theme/aux.rs | 11 +- .../pagetop-bootsier/src/theme/aux/border.rs | 182 ++-------- .../src/theme/aux/breakpoint.rs | 77 ++--- .../pagetop-bootsier/src/theme/aux/button.rs | 58 ++++ .../pagetop-bootsier/src/theme/aux/color.rs | 258 ++++---------- .../pagetop-bootsier/src/theme/aux/rounded.rs | 186 +--------- .../pagetop-bootsier/src/theme/aux/size.rs | 28 -- .../pagetop-bootsier/src/theme/classes.rs | 10 + .../src/theme/classes/border.rs | 155 +++++++++ .../src/theme/classes/color.rs | 207 ++++++++++++ .../src/theme/classes/rounded.rs | 163 +++++++++ .../pagetop-bootsier/src/theme/container.rs | 319 ++---------------- .../src/theme/container/component.rs | 197 +++++++++++ .../src/theme/container/props.rs | 44 +++ .../pagetop-bootsier/src/theme/dropdown.rs | 2 +- .../src/theme/dropdown/component.rs | 10 +- .../src/theme/image/component.rs | 52 +-- .../src/theme/nav/component.rs | 2 +- .../src/theme/navbar/component.rs | 55 +-- .../pagetop-bootsier/src/theme/navbar/item.rs | 2 +- .../src/theme/offcanvas/component.rs | 2 +- 23 files changed, 1041 insertions(+), 994 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/theme/aux/button.rs delete mode 100644 extensions/pagetop-bootsier/src/theme/aux/size.rs create mode 100644 extensions/pagetop-bootsier/src/theme/classes.rs create mode 100644 extensions/pagetop-bootsier/src/theme/classes/border.rs create mode 100644 extensions/pagetop-bootsier/src/theme/classes/color.rs create mode 100644 extensions/pagetop-bootsier/src/theme/classes/rounded.rs create mode 100644 extensions/pagetop-bootsier/src/theme/container/component.rs create mode 100644 extensions/pagetop-bootsier/src/theme/container/props.rs diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index 6df5341c..4cb35a27 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -98,7 +98,6 @@ pub mod theme; /// *Prelude* del tema. pub mod prelude { pub use crate::config::*; - pub use crate::theme::aux::*; pub use crate::theme::*; } diff --git a/extensions/pagetop-bootsier/src/theme.rs b/extensions/pagetop-bootsier/src/theme.rs index 4c547f6a..2c6b5757 100644 --- a/extensions/pagetop-bootsier/src/theme.rs +++ b/extensions/pagetop-bootsier/src/theme.rs @@ -1,10 +1,18 @@ //! Definiciones y componentes del tema. +//! +//! En esta página, el apartado **Modules** incluye las definiciones necesarias para los componentes +//! que se muestran en el apartado **Structs**, mientras que en **Enums** se listan los elementos +//! auxiliares del tema utilizados en clases y componentes. -pub mod aux; +mod aux; +pub use aux::*; + +pub mod classes; // Container. -mod container; -pub use container::{Container, ContainerType, ContainerWidth}; +pub mod container; +#[doc(inline)] +pub use container::Container; // Dropdown. pub mod dropdown; diff --git a/extensions/pagetop-bootsier/src/theme/aux.rs b/extensions/pagetop-bootsier/src/theme/aux.rs index a56b14e9..528126de 100644 --- a/extensions/pagetop-bootsier/src/theme/aux.rs +++ b/extensions/pagetop-bootsier/src/theme/aux.rs @@ -5,14 +5,13 @@ pub use breakpoint::BreakPoint; mod color; pub use color::{Color, Opacity}; -pub use color::{ColorBg, ColorBorder, ColorButton, ColorText}; -pub use color::{StyleBg, StyleBorder, StyleText}; +pub use color::{ColorBg, ColorText}; mod border; -pub use border::{Border, BorderSize}; +pub use border::{BorderColor, BorderSize}; mod rounded; -pub use rounded::{Rounded, RoundedRadius}; +pub use rounded::RoundedRadius; -mod size; -pub use size::ButtonSize; +mod button; +pub use button::{ButtonColor, ButtonSize}; diff --git a/extensions/pagetop-bootsier/src/theme/aux/border.rs b/extensions/pagetop-bootsier/src/theme/aux/border.rs index de3df81e..47547c30 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/border.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/border.rs @@ -1,16 +1,47 @@ use pagetop::prelude::*; -use crate::prelude::*; +use crate::theme::aux::Color; use std::fmt; +// **< BorderColor >******************************************************************************** + +/// Colores `border-*` para los bordes ([`classes::Border`](crate::theme::classes::Border)). +#[derive(AutoDefault)] +pub enum BorderColor { + /// No define ninguna clase. + #[default] + Default, + /// Genera internamente clases `border-{color}`. + Theme(Color), + /// Genera internamente clases `border-{color}-subtle` (un tono suavizado del color). + Subtle(Color), + /// Color negro. + Black, + /// Color blanco. + White, +} + +#[rustfmt::skip] +impl fmt::Display for BorderColor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Theme(c) => write!(f, "border-{c}"), + Self::Subtle(c) => write!(f, "border-{c}-subtle"), + Self::Black => f.write_str("border-black"), + Self::White => f.write_str("border-white"), + } + } +} + // **< BorderSize >********************************************************************************* -/// Tamaño para el ancho de los bordes ([`Border`]). +/// Tamaño para el ancho de los bordes ([`classes::Border`](crate::theme::classes::Border)). /// /// Mapea a `border`, `border-0` y `border-{1..5}`: /// -/// - `None` no añade clase (devuelve `""`). +/// - `None` no añade ninguna clase. /// - `Default` genera `border` (borde por defecto del tema). /// - `Zero` genera `border-0` (sin borde). /// - `Scale{1..5}` genera `border-{1..5}` (ancho creciente). @@ -29,7 +60,7 @@ pub enum BorderSize { impl BorderSize { #[rustfmt::skip] - fn to_class(&self, prefix: impl AsRef<str>) -> String { + pub(crate) fn to_class(&self, prefix: impl AsRef<str>) -> String { match self { Self::None => String::new(), Self::Default => String::from(prefix.as_ref()), @@ -48,146 +79,3 @@ impl fmt::Display for BorderSize { write!(f, "{}", self.to_class("border")) } } - -// **< Border >************************************************************************************* - -/// Agrupa propiedades para crear **bordes**. -/// -/// Permite: -/// -/// - Definir un tamaño **global** para todo el borde (`size`). -/// - Ajustar el tamaño de cada **lado lógico** (`top`, `end`, `bottom`, `start`, **en este orden**, -/// respetando LTR/RTL). -/// - Aplicar un **color** al borde (`ColorBorder`). -/// - Aplicar un nivel de **opacidad** (`BorderOpacity`). -/// -/// # Comportamiento aditivo / sustractivo -/// -/// - **Aditivo**: basta con crear un borde sin tamaño con `Border::new()` para ir añadiendo cada -/// lado lógico con el tamaño deseado usando `BorderSize::Scale{1..5}`. -/// -/// - **Sustractivo**: se crea un borde con tamaño predefinido, p. ej. utilizando -/// `Border::with(BorderSize::Scale2)` y eliminar los lados deseados con `BorderSize::Zero`. -/// -/// - **Anchos diferentes por lado**: usando `BorderSize::Scale{1..5}` en cada lado deseado. -/// -/// # Ejemplos -/// -/// **Borde global:** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let b = Border::with(BorderSize::Scale2); -/// assert_eq!(b.to_string(), "border-2"); -/// ``` -/// -/// **Aditivo (solo borde superior):** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let b = Border::new().with_top(BorderSize::Scale1); -/// assert_eq!(b.to_string(), "border-top-1"); -/// ``` -/// -/// **Sustractivo (borde global menos el superior):** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let b = Border::with(BorderSize::Default).with_top(BorderSize::Zero); -/// assert_eq!(b.to_string(), "border border-top-0"); -/// ``` -/// -/// **Ancho por lado (lado lógico inicial a 2 y final a 4):** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let b = Border::new().with_start(BorderSize::Scale2).with_end(BorderSize::Scale4); -/// assert_eq!(b.to_string(), "border-end-4 border-start-2"); -/// ``` -/// -/// **Combinado (ejemplo completo):** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let b = Border::with(BorderSize::Default) // Borde global por defecto. -/// .with_top(BorderSize::Zero) // Quita borde superior. -/// .with_end(BorderSize::Scale3) // Ancho 3 para el lado lógico final. -/// .with_style(StyleBorder::Both(ColorBorder::Theme(Color::Primary), Opacity::Half)); -/// -/// assert_eq!(b.to_string(), "border border-top-0 border-end-3 border-primary border-opacity-50"); -/// ``` -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Border { - size : BorderSize, - top : BorderSize, - end : BorderSize, - bottom: BorderSize, - start : BorderSize, - style : StyleBorder, -} - -impl Border { - /// Prepara un borde **sin tamaño global** de partida. - pub fn new() -> Self { - Self::default() - } - - /// Crea un borde **con tamaño global** (`size`). - pub fn with(size: BorderSize) -> Self { - Self::default().with_size(size) - } - - // **< Border BUILDER >************************************************************************* - - /// Establece el tamaño global del borde (`border*`). - pub fn with_size(mut self, size: BorderSize) -> Self { - self.size = size; - self - } - - /// Establece el tamaño del borde superior (`border-top-*`). - pub fn with_top(mut self, size: BorderSize) -> Self { - self.top = size; - self - } - - /// Establece el tamaño del borde en el lado lógico final (`border-end-*`). Respeta LTR/RTL. - pub fn with_end(mut self, size: BorderSize) -> Self { - self.end = size; - self - } - - /// Establece el tamaño del borde inferior (`border-bottom-*`). - pub fn with_bottom(mut self, size: BorderSize) -> Self { - self.bottom = size; - self - } - - /// Establece el tamaño del borde en el lado lógico inicial (`border-start-*`). Respeta LTR/RTL. - pub fn with_start(mut self, size: BorderSize) -> Self { - self.start = size; - self - } - - /// Establece el estilo de color/opacidad del borde. - pub fn with_style(mut self, style: StyleBorder) -> Self { - self.style = style; - self - } -} - -impl fmt::Display for Border { - /// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start` y - /// *color*/*opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{}", - join_opt!([ - self.size.to_string(), - self.top.to_class("border-top"), - self.end.to_class("border-end"), - self.bottom.to_class("border-bottom"), - self.start.to_class("border-start"), - self.style.to_string(), - ]; " ") - .unwrap_or_default() - ) - } -} diff --git a/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs index 601aa547..27d7c29f 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs @@ -3,25 +3,6 @@ use pagetop::prelude::*; use std::fmt; /// Define los puntos de ruptura (*breakpoints*) para aplicar diseño *responsive*. -/// -/// - `"sm"`, `"md"`, `"lg"`, `"xl"` o `"xxl"` para los puntos de ruptura `SM`, `MD`, `LG`, `XL` o -/// `XXL`, respectivamente. -/// - `""` (cadena vacía) para `None`. -/// -/// # Ejemplos -/// -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// assert_eq!(BreakPoint::MD.to_string(), "md"); -/// assert_eq!(BreakPoint::None.to_string(), ""); -/// -/// // Forma correcta para clases con prefijo: -/// assert_eq!(BreakPoint::MD.to_class("col"), "col-md"); -/// assert_eq!(BreakPoint::None.to_class("offcanvas"), "offcanvas"); -/// -/// assert_eq!(BreakPoint::XXL.try_class("col"), Some("col-xxl".to_string())); -/// assert_eq!(BreakPoint::None.try_class("offcanvas"), None); -/// ``` #[derive(AutoDefault)] pub enum BreakPoint { /// **Menos de 576px**. Dispositivos muy pequeños: teléfonos en modo vertical. @@ -40,46 +21,43 @@ pub enum BreakPoint { } impl BreakPoint { - /// Comprueba si es un punto de ruptura efectivo. - /// - /// Devuelve `true` si el valor es `SM`, `MD`, `LG`, `XL` o `XXL`; y `false` en otro caso. + #[rustfmt::skip] #[inline] - pub const fn is_breakpoint(&self) -> bool { - !matches!(self, Self::None) + const fn suffix(&self) -> Option<&'static str> { + match self { + Self::None => None, + Self::SM => Some("sm"), + Self::MD => Some("md"), + Self::LG => Some("lg"), + Self::XL => Some("xl"), + Self::XXL => Some("xxl"), + } } /// Genera un nombre de clase CSS basado en el punto de ruptura. /// - /// Si es un punto de ruptura efectivo (ver [`is_breakpoint()`](Self::is_breakpoint), concatena - /// el prefijo, un guion (`-`) y el sufijo asociado. En otro caso devuelve únicamente el - /// prefijo. + /// Si es un punto de ruptura efectivo concatena el prefijo, un guion (`-`) y el sufijo + /// asociado. Para `None` devuelve sólo el prefijo. /// /// # Ejemplo /// /// ```rust /// # use pagetop_bootsier::prelude::*; /// let breakpoint = BreakPoint::MD; - /// let class = breakpoint.to_class("col"); - /// assert_eq!(class, "col-md".to_string()); + /// assert_eq!(breakpoint.to_class("col"), "col-md"); /// /// let breakpoint = BreakPoint::None; - /// let class = breakpoint.to_class("offcanvas"); - /// assert_eq!(class, "offcanvas".to_string()); + /// assert_eq!(breakpoint.to_class("offcanvas"), "offcanvas"); /// ``` #[inline] pub fn to_class(&self, prefix: impl AsRef<str>) -> String { - if self.is_breakpoint() { - join!(prefix, "-", self.to_string()) - } else { - String::from(prefix.as_ref()) - } + join_pair!(prefix, "-", self.suffix().unwrap_or_default()) } /// Intenta generar un nombre de clase CSS basado en el punto de ruptura. /// - /// Si es un punto de ruptura efectivo (ver [`is_breakpoint()`](Self::is_breakpoint), devuelve - /// `Some(String)` concatenando el prefijo, un guion (`-`) y el sufijo asociado. En otro caso - /// devuelve `None`. + /// Si es un punto de ruptura efectivo devuelve `Some(String)` concatenando el prefijo, un guion + /// (`-`) y el sufijo asociado. En otro caso devuelve `None`. /// /// # Ejemplo /// @@ -95,24 +73,19 @@ impl BreakPoint { /// ``` #[inline] pub fn try_class(&self, prefix: impl AsRef<str>) -> Option<String> { - if self.is_breakpoint() { - Some(join!(prefix, "-", self.to_string())) - } else { - None - } + self.suffix().map(|suffix| join_pair!(prefix, "-", suffix)) } } -#[rustfmt::skip] impl fmt::Display for BreakPoint { + /// Implementa [`Display`](std::fmt::Display) para asociar `"sm"`, `"md"`, `"lg"`, `"xl"` o + /// `"xxl"` a los puntos de ruptura `BreakPoint::SM`, `MD`, `LG`, `XL` o `XXL`, respectivamente. + /// Y `""` (cadena vacía) a `BreakPoint::None`. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::None => Ok(()), - Self::SM => f.write_str("sm"), - Self::MD => f.write_str("md"), - Self::LG => f.write_str("lg"), - Self::XL => f.write_str("xl"), - Self::XXL => f.write_str("xxl"), + if let Some(suffix) = self.suffix() { + f.write_str(suffix) + } else { + Ok(()) } } } diff --git a/extensions/pagetop-bootsier/src/theme/aux/button.rs b/extensions/pagetop-bootsier/src/theme/aux/button.rs new file mode 100644 index 00000000..a2f2efb9 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/button.rs @@ -0,0 +1,58 @@ +use pagetop::prelude::*; + +use crate::theme::aux::Color; + +use std::fmt; + +// **< ButtonColor >******************************************************************************** + +/// Variantes de color `btn-*` para botones. +#[derive(AutoDefault)] +pub enum ButtonColor { + /// No define ninguna clase. + #[default] + Default, + /// Genera internamente clases `btn-{color}` (botón relleno). + Background(Color), + /// Genera `btn-outline-{color}` (fondo transparente y contorno con borde). + Outline(Color), + /// Aplica estilo de los enlaces (`btn-link`), sin caja ni fondo, heredando el color de texto. + Link, +} + +#[rustfmt::skip] +impl fmt::Display for ButtonColor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Background(c) => write!(f, "btn-{c}"), + Self::Outline(c) => write!(f, "btn-outline-{c}"), + Self::Link => f.write_str("btn-link"), + } + } +} + +// **< ButtonSize >********************************************************************************* + +/// Tamaño visual de un botón. +#[derive(AutoDefault)] +pub enum ButtonSize { + /// Tamaño por defecto del tema (no añade clase). + #[default] + Default, + /// Botón compacto. + Small, + /// Botón destacado/grande. + Large, +} + +#[rustfmt::skip] +impl fmt::Display for ButtonSize { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Default => Ok(()), + Self::Small => f.write_str("btn-sm"), + Self::Large => f.write_str("btn-lg"), + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/aux/color.rs b/extensions/pagetop-bootsier/src/theme/aux/color.rs index 17d192dd..d0f1da00 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/color.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/color.rs @@ -7,8 +7,10 @@ use std::fmt; /// Paleta de colores temáticos. /// /// Equivalen a los nombres estándar definidos por Bootstrap (`primary`, `secondary`, `success`, -/// etc.). Este tipo enumerado sirve de base para componer clases de color para el fondo -/// ([`ColorBg`]), bordes ([`ColorBorder`]) y texto ([`ColorText`]). +/// etc.). Este tipo enumerado sirve de base para componer las clases de color para fondo +/// ([`classes::Background`](crate::theme::classes::Background)), bordes +/// ([`classes::Border`](crate::theme::classes::Border)) y texto +/// ([`classes::Text`](crate::theme::classes::Text)). #[derive(AutoDefault)] pub enum Color { #[default] @@ -38,12 +40,69 @@ impl fmt::Display for Color { } } +// **< Opacity >************************************************************************************ + +/// Niveles de opacidad (`opacity-*`). +/// +/// Se usa normalmente para graduar la transparencia del color de fondo `bg-opacity-*` +/// ([`classes::Background`](crate::theme::classes::Background)), de los bordes `border-opacity-*` +/// ([`classes::Border`](crate::theme::classes::Border)) o del texto `text-opacity-*` +/// ([`classes::Text`](crate::theme::classes::Text)). +#[derive(AutoDefault)] +pub enum Opacity { + /// No define ninguna clase. + #[default] + Default, + /// Permite generar clases `*-opacity-100` (100% de opacidad). + Opaque, + /// Permite generar clases `*-opacity-75` (75%). + SemiOpaque, + /// Permite generar clases `*-opacity-50` (50%). + Half, + /// Permite generar clases `*-opacity-25` (25%). + SemiTransparent, + /// Permite generar clases `*-opacity-10` (10%). + AlmostTransparent, + /// Permite generar clases `*-opacity-0` (0%, totalmente transparente). + Transparent, +} + +impl Opacity { + #[rustfmt::skip] + #[inline] + const fn suffix(&self) -> &'static str { + match self { + Self::Default => "", + Self::Opaque => "opacity-100", + Self::SemiOpaque => "opacity-75", + Self::Half => "opacity-50", + Self::SemiTransparent => "opacity-25", + Self::AlmostTransparent => "opacity-10", + Self::Transparent => "opacity-0", + } + } + + #[inline] + pub(crate) fn to_class(&self, prefix: impl AsRef<str>) -> String { + match self { + Self::Default => String::new(), + _ => join_pair!(prefix, "-", self.suffix()), + } + } +} + +impl fmt::Display for Opacity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.suffix()) + } +} + // **< ColorBg >************************************************************************************ /// Colores `bg-*` para el fondo. #[derive(AutoDefault)] pub enum ColorBg { - /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). + /// No define ninguna clase. #[default] Default, /// Fondo predefinido del tema (`bg-body`). @@ -81,71 +140,12 @@ impl fmt::Display for ColorBg { } } -// **< ColorBorder >******************************************************************************** - -/// Colores `border-*` para los bordes ([`Border`](crate::theme::aux::Border)). -#[derive(AutoDefault)] -pub enum ColorBorder { - /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). - #[default] - Default, - /// Genera internamente clases `border-{color}`. - Theme(Color), - /// Genera internamente clases `border-{color}-subtle` (un tono suavizado del color). - Subtle(Color), - /// Color negro. - Black, - /// Color blanco. - White, -} - -#[rustfmt::skip] -impl fmt::Display for ColorBorder { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Theme(c) => write!(f, "border-{c}"), - Self::Subtle(c) => write!(f, "border-{c}-subtle"), - Self::Black => f.write_str("border-black"), - Self::White => f.write_str("border-white"), - } - } -} - -// **< ColorButton >******************************************************************************** - -/// Variantes de color `btn-*` para botones. -#[derive(AutoDefault)] -pub enum ColorButton { - /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). - #[default] - Default, - /// Genera internamente clases `btn-{color}` (botón relleno). - Background(Color), - /// Genera `btn-outline-{color}` (fondo transparente y contorno con borde). - Outline(Color), - /// Aplica estilo de los enlaces (`btn-link`), sin caja ni fondo, heredando el color de texto. - Link, -} - -#[rustfmt::skip] -impl fmt::Display for ColorButton { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Background(c) => write!(f, "btn-{c}"), - Self::Outline(c) => write!(f, "btn-outline-{c}"), - Self::Link => f.write_str("btn-link"), - } - } -} - // **< ColorText >********************************************************************************** /// Colores `text-*` para el texto. #[derive(AutoDefault)] pub enum ColorText { - /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). + /// No define ninguna clase. #[default] Default, /// Color predefinido del tema (`text-body`). @@ -182,135 +182,3 @@ impl fmt::Display for ColorText { } } } - -// **< Opacity >************************************************************************************ - -/// Niveles de opacidad (`opacity-*`). -/// -/// Se usa normalmente para graduar la transparencia del color de fondo `bg-opacity-*` -/// ([`StyleBg`]), de los bordes `border-opacity-*` ([`StyleBorder`]) o del texto `text-opacity-*` -/// ([`StyleText`]). -#[rustfmt::skip] -#[derive(AutoDefault)] -pub enum Opacity { - /// Genera internamente clases `opacity-100` (100% de opacidad). - #[default] - Opaque, - /// Genera internamente clases `opacity-75` (75%). - SemiOpaque, - /// Genera internamente clases `opacity-50` (50%). - Half, - /// Genera internamente clases `opacity-25` (25%). - SemiTransparent, - /// Genera internamente clases `opacity-10` (10%). - AlmostTransparent, - /// Genera internamente clases `opacity-0` (0%, totalmente transparente). - Transparent, -} - -#[rustfmt::skip] -impl fmt::Display for Opacity { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Opaque => f.write_str("opacity-100"), - Self::SemiOpaque => f.write_str("opacity-75"), - Self::Half => f.write_str("opacity-50"), - Self::SemiTransparent => f.write_str("opacity-25"), - Self::AlmostTransparent => f.write_str("opacity-10"), - Self::Transparent => f.write_str("opacity-0"), - } - } -} - -// **< StyleBg >*********************************************************************************** - -/// Estilos de color/opacidad para el fondo. -#[derive(AutoDefault)] -pub enum StyleBg { - /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). - #[default] - Default, - /// Genera internamente clases `bg-*`. - Color(ColorBg), - /// Genera internamente clases `bg-opacity-*`. - Opacity(Opacity), - /// Genera internamente clases `bg-* bg-opacity-*`. - Both(ColorBg, Opacity), -} - -#[rustfmt::skip] -impl fmt::Display for StyleBg { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Color(c) => write!(f, "{c}"), - Self::Opacity(o) => write!(f, "bg-{o}"), - Self::Both(c, o) => write!(f, "{c} bg-{o}"), - } - } -} - -// **< StyleBorder >******************************************************************************* - -/// Estilos de color/opacidad para los bordes ([`Border`](crate::theme::aux::Border)). -#[derive(AutoDefault)] -pub enum StyleBorder { - /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). - #[default] - Default, - /// Genera internamente clases `border-*`. - Color(ColorBorder), - /// Genera internamente clases `border-opacity-*`. - Opacity(Opacity), - /// Genera internamente clases `border-* border-opacity-*`. - Both(ColorBorder, Opacity), -} - -#[rustfmt::skip] -impl fmt::Display for StyleBorder { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Color(c) => write!(f, "{c}"), - Self::Opacity(o) => write!(f, "border-{o}"), - Self::Both(c, o) => write!(f, "{c} border-{o}"), - } - } -} - -// **< StyleText >********************************************************************************* - -/// Estilos de color/opacidad para texto y fondo del texto. -#[derive(AutoDefault)] -pub enum StyleText { - /// No define ninguna clase (devuelve `""` para facilitar la composición de clases). - #[default] - Default, - /// Genera internamente clases `text-*`. - Color(ColorText), - /// Genera internamente clases `text-opacity-*`. - Opacity(Opacity), - /// Genera internamente clases `text-* text-opacity-*`. - Both(ColorText, Opacity), - /// Genera internamente clases `text-bg-*` (para el color de fondo del texto). - Bg(Color), - /// Genera internamente clases `text-bg-* text-*`. - BgAndColor(Color, ColorText), - /// Genera internamente clases `text-bg-* text-* text-opacity-*`. - All(Color, ColorText, Opacity), -} - -#[rustfmt::skip] -impl fmt::Display for StyleText { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Color(c) => write!(f, "{c}"), - Self::Opacity(o) => write!(f, "text-{o}"), - Self::Both(c, o) => write!(f, "{c} text-{o}"), - Self::Bg(bg) => write!(f, "text-bg-{bg}"), - Self::BgAndColor(bg, c) => write!(f, "text-bg-{bg} {c}"), - Self::All(bg, c, o) => write!(f, "text-bg-{bg} {c} text-{o}"), - } - } -} diff --git a/extensions/pagetop-bootsier/src/theme/aux/rounded.rs b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs index 470a48a3..8eac7c53 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/rounded.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs @@ -2,13 +2,11 @@ use pagetop::prelude::*; use std::fmt; -// **< RoundedRadius >****************************************************************************** - -/// Radio para el redondeo de esquinas ([`Rounded`]). +/// Radio para el redondeo de esquinas ([`classes::Rounded`](crate::theme::classes::Rounded)). /// /// Mapea a `rounded`, `rounded-0`, `rounded-{1..5}`, `rounded-circle` y `rounded-pill`. /// -/// - `None` no añade clase (devuelve `""`). +/// - `None` no añade ninguna clase. /// - `Default` genera `rounded` (radio por defecto del tema). /// - `Zero` genera `rounded-0` (sin redondeo). /// - `Scale{1..5}` genera `rounded-{1..5}` (radio creciente). @@ -31,18 +29,18 @@ pub enum RoundedRadius { impl RoundedRadius { #[rustfmt::skip] - fn to_class(&self, base: impl AsRef<str>) -> String { + pub(crate) fn to_class(&self, prefix: impl AsRef<str>) -> String { match self { RoundedRadius::None => String::new(), - RoundedRadius::Default => String::from(base.as_ref()), - RoundedRadius::Zero => join!(base, "-0"), - RoundedRadius::Scale1 => join!(base, "-1"), - RoundedRadius::Scale2 => join!(base, "-2"), - RoundedRadius::Scale3 => join!(base, "-3"), - RoundedRadius::Scale4 => join!(base, "-4"), - RoundedRadius::Scale5 => join!(base, "-5"), - RoundedRadius::Circle => join!(base, "-circle"), - RoundedRadius::Pill => join!(base, "-pill"), + RoundedRadius::Default => String::from(prefix.as_ref()), + RoundedRadius::Zero => join!(prefix, "-0"), + RoundedRadius::Scale1 => join!(prefix, "-1"), + RoundedRadius::Scale2 => join!(prefix, "-2"), + RoundedRadius::Scale3 => join!(prefix, "-3"), + RoundedRadius::Scale4 => join!(prefix, "-4"), + RoundedRadius::Scale5 => join!(prefix, "-5"), + RoundedRadius::Circle => join!(prefix, "-circle"), + RoundedRadius::Pill => join!(prefix, "-pill"), } } } @@ -52,163 +50,3 @@ impl fmt::Display for RoundedRadius { write!(f, "{}", self.to_class("rounded")) } } - -// **< Rounded >************************************************************************************ - -/// Agrupa propiedades para crear **esquinas redondeadas**. -/// -/// Permite: -/// -/// - Definir un radio **global para todas las esquinas** (`radius`). -/// - Ajustar el radio asociado a las **esquinas de cada lado lógico** (`top`, `end`, `bottom`, -/// `start`, **en este orden**, respetando LTR/RTL). -/// - Ajustar el radio de las **esquinas concretas** (`top-start`, `top-end`, `bottom-start`, -/// `bottom-end`, **en este orden**, respetando LTR/RTL). -/// -/// # Ejemplos -/// -/// **Radio global:** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let r = Rounded::with(RoundedRadius::Default); -/// assert_eq!(r.to_string(), "rounded"); -/// ``` -/// -/// **Sin redondeo:** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let r = Rounded::new(); -/// assert_eq!(r.to_string(), ""); -/// ``` -/// -/// **Radio en las esquinas de un lado lógico:** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let r = Rounded::new().with_end(RoundedRadius::Scale2); -/// assert_eq!(r.to_string(), "rounded-end-2"); -/// ``` -/// -/// **Radio en una esquina concreta:** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let r = Rounded::new().with_top_start(RoundedRadius::Scale3); -/// assert_eq!(r.to_string(), "rounded-top-start-3"); -/// ``` -/// -/// **Combinado (ejemplo completo):** -/// ```rust -/// # use pagetop_bootsier::prelude::*; -/// let r = Rounded::new() -/// .with_top(RoundedRadius::Default) // Añade redondeo arriba. -/// .with_bottom_start(RoundedRadius::Scale4) // Añade una esquina redondeada concreta. -/// .with_bottom_end(RoundedRadius::Circle); // Añade redondeo extremo en otra esquina. -/// -/// assert_eq!(r.to_string(), "rounded-top rounded-bottom-start-4 rounded-bottom-end-circle"); -/// ``` -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Rounded { - radius : RoundedRadius, - top : RoundedRadius, - end : RoundedRadius, - bottom : RoundedRadius, - start : RoundedRadius, - top_start : RoundedRadius, - top_end : RoundedRadius, - bottom_start: RoundedRadius, - bottom_end : RoundedRadius, -} - -impl Rounded { - /// Prepara las esquinas **sin redondeo global** de partida. - pub fn new() -> Self { - Self::default() - } - - /// Crea las esquinas **con redondeo global** (`radius`). - pub fn with(radius: RoundedRadius) -> Self { - Self::default().with_radius(radius) - } - - // **< Rounded BUILDER >************************************************************************ - - /// Establece el radio global de las esquinas (`rounded*`). - pub fn with_radius(mut self, radius: RoundedRadius) -> Self { - self.radius = radius; - self - } - - /// Establece el radio en las esquinas del lado superior (`rounded-top-*`). - pub fn with_top(mut self, radius: RoundedRadius) -> Self { - self.top = radius; - self - } - - /// Establece el radio en las esquinas del lado lógico final (`rounded-end-*`). Respeta LTR/RTL. - pub fn with_end(mut self, radius: RoundedRadius) -> Self { - self.end = radius; - self - } - - /// Establece el radio en las esquinas del lado inferior (`rounded-bottom-*`). - pub fn with_bottom(mut self, radius: RoundedRadius) -> Self { - self.bottom = radius; - self - } - - /// Establece el radio en las esquinas del lado lógico inicial (`rounded-start-*`). Respeta - /// LTR/RTL. - pub fn with_start(mut self, radius: RoundedRadius) -> Self { - self.start = radius; - self - } - - /// Establece el radio en la esquina superior-inicial (`rounded-top-start-*`). Respeta LTR/RTL. - pub fn with_top_start(mut self, radius: RoundedRadius) -> Self { - self.top_start = radius; - self - } - - /// Establece el radio en la esquina superior-final (`rounded-top-end-*`). Respeta LTR/RTL. - pub fn with_top_end(mut self, radius: RoundedRadius) -> Self { - self.top_end = radius; - self - } - - /// Establece el radio en la esquina inferior-inicial (`rounded-bottom-start-*`). Respeta - /// LTR/RTL. - pub fn with_bottom_start(mut self, radius: RoundedRadius) -> Self { - self.bottom_start = radius; - self - } - - /// Establece el radio en la esquina inferior-final (`rounded-bottom-end-*`). Respeta LTR/RTL. - pub fn with_bottom_end(mut self, radius: RoundedRadius) -> Self { - self.bottom_end = radius; - self - } -} - -impl fmt::Display for Rounded { - /// Concatena cada definición en el orden: *global*, `top`, `end`, `bottom`, `start`, - /// `top-start`, `top-end`, `bottom-start` y `bottom-end`; respetando LTR/RTL y omitiendo las - /// definiciones vacías. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{}", - join_opt!([ - self.radius.to_string(), - self.top.to_class("rounded-top"), - self.end.to_class("rounded-end"), - self.bottom.to_class("rounded-bottom"), - self.start.to_class("rounded-start"), - self.top_start.to_class("rounded-top-start"), - self.top_end.to_class("rounded-top-end"), - self.bottom_start.to_class("rounded-bottom-start"), - self.bottom_end.to_class("rounded-bottom-end"), - ]; " ") - .unwrap_or_default() - ) - } -} diff --git a/extensions/pagetop-bootsier/src/theme/aux/size.rs b/extensions/pagetop-bootsier/src/theme/aux/size.rs deleted file mode 100644 index d0abdb51..00000000 --- a/extensions/pagetop-bootsier/src/theme/aux/size.rs +++ /dev/null @@ -1,28 +0,0 @@ -use pagetop::prelude::*; - -use std::fmt; - -// **< ButtonSize >********************************************************************************* - -/// Tamaño visual de un botón. -#[derive(AutoDefault)] -pub enum ButtonSize { - /// Tamaño por defecto del tema (no añade clase). - #[default] - Default, - /// Botón compacto. - Small, - /// Botón destacado/grande. - Large, -} - -#[rustfmt::skip] -impl fmt::Display for ButtonSize { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Small => f.write_str("btn-sm"), - Self::Large => f.write_str("btn-lg"), - } - } -} diff --git a/extensions/pagetop-bootsier/src/theme/classes.rs b/extensions/pagetop-bootsier/src/theme/classes.rs new file mode 100644 index 00000000..4e586e11 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/classes.rs @@ -0,0 +1,10 @@ +//! Conjunto de clases para aplicar en componentes del tema. + +mod color; +pub use color::{Background, Text}; + +mod border; +pub use border::Border; + +mod rounded; +pub use rounded::Rounded; diff --git a/extensions/pagetop-bootsier/src/theme/classes/border.rs b/extensions/pagetop-bootsier/src/theme/classes/border.rs new file mode 100644 index 00000000..f49c75c6 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/classes/border.rs @@ -0,0 +1,155 @@ +use pagetop::prelude::*; + +use crate::theme::aux::{BorderColor, BorderSize, Opacity}; + +use std::fmt; + +/// Clases para crear **bordes**. +/// +/// Permite: +/// +/// - Definir un tamaño **global** para todo el borde (`size`). +/// - Ajustar el tamaño de cada **lado lógico** (`top`, `end`, `bottom`, `start`, **en este orden**, +/// respetando LTR/RTL). +/// - Aplicar un **color** al borde (`BorderColor`). +/// - Aplicar un nivel de **opacidad** (`Opacity`). +/// +/// # Comportamiento aditivo / sustractivo +/// +/// - **Aditivo**: basta con crear un borde sin tamaño con `classes::Border::new()` para ir +/// añadiendo cada lado lógico con el tamaño deseado usando `BorderSize::Scale{1..5}`. +/// +/// - **Sustractivo**: se crea un borde con tamaño predefinido, p. ej. utilizando +/// `classes::Border::with(BorderSize::Scale2)` y eliminar los lados deseados con `BorderSize::Zero`. +/// +/// - **Anchos diferentes por lado**: usando `BorderSize::Scale{1..5}` en cada lado deseado. +/// +/// # Ejemplos +/// +/// **Borde global:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = classes::Border::with(BorderSize::Scale2); +/// assert_eq!(b.to_string(), "border-2"); +/// ``` +/// +/// **Aditivo (solo borde superior):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = classes::Border::new().with_top(BorderSize::Scale1); +/// assert_eq!(b.to_string(), "border-top-1"); +/// ``` +/// +/// **Sustractivo (borde global menos el superior):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = classes::Border::with(BorderSize::Default).with_top(BorderSize::Zero); +/// assert_eq!(b.to_string(), "border border-top-0"); +/// ``` +/// +/// **Ancho por lado (lado lógico inicial a 2 y final a 4):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = classes::Border::new().with_start(BorderSize::Scale2).with_end(BorderSize::Scale4); +/// assert_eq!(b.to_string(), "border-end-4 border-start-2"); +/// ``` +/// +/// **Combinado (ejemplo completo):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let b = classes::Border::with(BorderSize::Default) // Borde global por defecto. +/// .with_top(BorderSize::Zero) // Quita borde superior. +/// .with_end(BorderSize::Scale3) // Ancho 3 para el lado lógico final. +/// .with_color(BorderColor::Theme(Color::Primary)) +/// .with_opacity(Opacity::Half); +/// +/// assert_eq!(b.to_string(), "border border-top-0 border-end-3 border-primary border-opacity-50"); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Border { + size : BorderSize, + top : BorderSize, + end : BorderSize, + bottom : BorderSize, + start : BorderSize, + color : BorderColor, + opacity: Opacity, +} + +impl Border { + /// Prepara un borde **sin tamaño global** de partida. + pub fn new() -> Self { + Self::default() + } + + /// Crea un borde **con tamaño global** (`size`). + pub fn with(size: BorderSize) -> Self { + Self::default().with_size(size) + } + + // **< Border BUILDER >************************************************************************* + + /// Establece el tamaño global del borde (`border*`). + pub fn with_size(mut self, size: BorderSize) -> Self { + self.size = size; + self + } + + /// Establece el tamaño del borde superior (`border-top-*`). + pub fn with_top(mut self, size: BorderSize) -> Self { + self.top = size; + self + } + + /// Establece el tamaño del borde en el lado lógico final (`border-end-*`). Respeta LTR/RTL. + pub fn with_end(mut self, size: BorderSize) -> Self { + self.end = size; + self + } + + /// Establece el tamaño del borde inferior (`border-bottom-*`). + pub fn with_bottom(mut self, size: BorderSize) -> Self { + self.bottom = size; + self + } + + /// Establece el tamaño del borde en el lado lógico inicial (`border-start-*`). Respeta LTR/RTL. + pub fn with_start(mut self, size: BorderSize) -> Self { + self.start = size; + self + } + + /// Establece el color del borde. + pub fn with_color(mut self, color: BorderColor) -> Self { + self.color = color; + self + } + + /// Establece la opacidad del borde. + pub fn with_opacity(mut self, opacity: Opacity) -> Self { + self.opacity = opacity; + self + } +} + +impl fmt::Display for Border { + /// Concatena, en este orden, las clases para *global*, `top`, `end`, `bottom`, `start`, *color* + /// y *opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + [ + self.size.to_string(), + self.top.to_class("border-top"), + self.end.to_class("border-end"), + self.bottom.to_class("border-bottom"), + self.start.to_class("border-start"), + self.color.to_string(), + self.opacity.to_class("border"), + ] + .join_classes() + ) + } +} diff --git a/extensions/pagetop-bootsier/src/theme/classes/color.rs b/extensions/pagetop-bootsier/src/theme/classes/color.rs new file mode 100644 index 00000000..6579d21c --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/classes/color.rs @@ -0,0 +1,207 @@ +use pagetop::prelude::*; + +use crate::theme::aux::{ColorBg, ColorText, Opacity}; + +use std::fmt; + +// **< Bg >***************************************************************************************** + +/// Clases para establecer **color/opacidad del fondo**. +/// +/// # Ejemplos +/// +/// ``` +/// # use pagetop_bootsier::prelude::*; +/// // Sin clases. +/// let s = classes::Background::new(); +/// assert_eq!(s.to_string(), ""); +/// +/// // Sólo color de fondo. +/// let s = classes::Background::with(ColorBg::Theme(Color::Primary)); +/// assert_eq!(s.to_string(), "bg-primary"); +/// +/// // Color más opacidad. +/// let s = classes::Background::with(ColorBg::BodySecondary).with_opacity(Opacity::Half); +/// assert_eq!(s.to_string(), "bg-body-secondary bg-opacity-50"); +/// +/// // Usando `From<ColorBg>`. +/// let s: classes::Background = ColorBg::Black.into(); +/// assert_eq!(s.to_string(), "bg-black"); +/// +/// // Usando `From<(ColorBg, Opacity)>`. +/// let s: classes::Background = (ColorBg::White, Opacity::SemiTransparent).into(); +/// assert_eq!(s.to_string(), "bg-white bg-opacity-25"); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Background { + color : ColorBg, + opacity: Opacity, +} + +impl Background { + /// Prepara un nuevo estilo para aplicar al fondo. + pub fn new() -> Self { + Self::default() + } + + /// Crea un estilo fijando el color de fondo (`bg-*`). + pub fn with(color: ColorBg) -> Self { + Self::default().with_color(color) + } + + // **< Bg BUILDER >***************************************************************************** + + /// Establece el color de fondo (`bg-*`). + pub fn with_color(mut self, color: ColorBg) -> Self { + self.color = color; + self + } + + /// Establece la opacidad del fondo (`bg-opacity-*`). + pub fn with_opacity(mut self, opacity: Opacity) -> Self { + self.opacity = opacity; + self + } +} + +impl fmt::Display for Background { + /// Concatena, en este orden, color del fondo (`bg-*`) y opacidad (`bg-opacity-*`), omitiendo + /// las definiciones vacías. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let classes = [self.color.to_string(), self.opacity.to_class("bg")].join_classes(); + write!(f, "{classes}") + } +} + +impl From<(ColorBg, Opacity)> for Background { + /// Atajo para crear un [`classes::Background`](crate::theme::classes::Background) a partir del color de fondo y + /// la opacidad. + /// + /// # Ejemplo + /// + /// ``` + /// # use pagetop_bootsier::prelude::*; + /// let s: classes::Background = (ColorBg::White, Opacity::SemiTransparent).into(); + /// assert_eq!(s.to_string(), "bg-white bg-opacity-25"); + /// ``` + fn from((color, opacity): (ColorBg, Opacity)) -> Self { + Background::with(color).with_opacity(opacity) + } +} + +impl From<ColorBg> for Background { + /// Atajo para crear un [`classes::Background`](crate::theme::classes::Background) a partir del color de fondo. + /// + /// # Ejemplo + /// + /// ``` + /// # use pagetop_bootsier::prelude::*; + /// let s: classes::Background = ColorBg::Black.into(); + /// assert_eq!(s.to_string(), "bg-black"); + /// ``` + fn from(color: ColorBg) -> Self { + Background::with(color) + } +} + +// **< Text >*************************************************************************************** + +/// Clases para establecer **color/opacidad del texto**. +/// +/// # Ejemplos +/// +/// ``` +/// # use pagetop_bootsier::prelude::*; +/// // Sin clases. +/// let s = classes::Text::new(); +/// assert_eq!(s.to_string(), ""); +/// +/// // Sólo color del texto. +/// let s = classes::Text::with(ColorText::Theme(Color::Primary)); +/// assert_eq!(s.to_string(), "text-primary"); +/// +/// // Color del texto y opacidad. +/// let s = classes::Text::new().with_color(ColorText::White).with_opacity(Opacity::SemiTransparent); +/// assert_eq!(s.to_string(), "text-white text-opacity-25"); +/// +/// // Usando `From<ColorText>`. +/// let s: classes::Text = ColorText::Black.into(); +/// assert_eq!(s.to_string(), "text-black"); +/// +/// // Usando `From<(ColorText, Opacity)>`. +/// let s: classes::Text = (ColorText::Theme(Color::Danger), Opacity::Opaque).into(); +/// assert_eq!(s.to_string(), "text-danger text-opacity-100"); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Text { + color : ColorText, + opacity: Opacity, +} + +impl Text { + /// Prepara un nuevo estilo para aplicar al texto. + pub fn new() -> Self { + Self::default() + } + + /// Crea un estilo fijando el color del texto (`text-*`). + pub fn with(color: ColorText) -> Self { + Self::default().with_color(color) + } + + // **< Text BUILDER >*************************************************************************** + + /// Establece el color del texto (`text-*`). + pub fn with_color(mut self, color: ColorText) -> Self { + self.color = color; + self + } + + /// Establece la opacidad del texto (`text-opacity-*`). + pub fn with_opacity(mut self, opacity: Opacity) -> Self { + self.opacity = opacity; + self + } +} + +impl fmt::Display for Text { + /// Concatena, en este orden, `text-*` y `text-opacity-*`, omitiendo las definiciones vacías. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let classes = [self.color.to_string(), self.opacity.to_class("text")].join_classes(); + write!(f, "{classes}") + } +} + +impl From<(ColorText, Opacity)> for Text { + /// Atajo para crear un [`classes::Text`](crate::theme::classes::Text) a partir del color del + /// texto y su opacidad. + /// + /// # Ejemplo + /// + /// ``` + /// # use pagetop_bootsier::prelude::*; + /// let s: classes::Text = (ColorText::Theme(Color::Danger), Opacity::Opaque).into(); + /// assert_eq!(s.to_string(), "text-danger text-opacity-100"); + /// ``` + fn from((color, opacity): (ColorText, Opacity)) -> Self { + Text::with(color).with_opacity(opacity) + } +} + +impl From<ColorText> for Text { + /// Atajo para crear un [`classes::Text`](crate::theme::classes::Text) a partir del color del + /// texto. + /// + /// # Ejemplo + /// + /// ``` + /// # use pagetop_bootsier::prelude::*; + /// let s: classes::Text = ColorText::Black.into(); + /// assert_eq!(s.to_string(), "text-black"); + /// ``` + fn from(color: ColorText) -> Self { + Text::with(color) + } +} diff --git a/extensions/pagetop-bootsier/src/theme/classes/rounded.rs b/extensions/pagetop-bootsier/src/theme/classes/rounded.rs new file mode 100644 index 00000000..b7510c14 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/classes/rounded.rs @@ -0,0 +1,163 @@ +use pagetop::prelude::*; + +use crate::theme::aux::RoundedRadius; + +use std::fmt; + +/// Clases para definir **esquinas redondeadas**. +/// +/// Permite: +/// +/// - Definir un radio **global para todas las esquinas** (`radius`). +/// - Ajustar el radio asociado a las **esquinas de cada lado lógico** (`top`, `end`, `bottom`, +/// `start`, **en este orden**, respetando LTR/RTL). +/// - Ajustar el radio de las **esquinas concretas** (`top-start`, `top-end`, `bottom-start`, +/// `bottom-end`, **en este orden**, respetando LTR/RTL). +/// +/// # Ejemplos +/// +/// **Radio global:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = classes::Rounded::with(RoundedRadius::Default); +/// assert_eq!(r.to_string(), "rounded"); +/// ``` +/// +/// **Sin redondeo:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = classes::Rounded::new(); +/// assert_eq!(r.to_string(), ""); +/// ``` +/// +/// **Radio en las esquinas de un lado lógico:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = classes::Rounded::new().with_end(RoundedRadius::Scale2); +/// assert_eq!(r.to_string(), "rounded-end-2"); +/// ``` +/// +/// **Radio en una esquina concreta:** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = classes::Rounded::new().with_top_start(RoundedRadius::Scale3); +/// assert_eq!(r.to_string(), "rounded-top-start-3"); +/// ``` +/// +/// **Combinado (ejemplo completo):** +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let r = classes::Rounded::new() +/// .with_top(RoundedRadius::Default) // Añade redondeo arriba. +/// .with_bottom_start(RoundedRadius::Scale4) // Añade una esquina redondeada concreta. +/// .with_bottom_end(RoundedRadius::Circle); // Añade redondeo extremo en otra esquina. +/// +/// assert_eq!(r.to_string(), "rounded-top rounded-bottom-start-4 rounded-bottom-end-circle"); +/// ``` +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Rounded { + radius : RoundedRadius, + top : RoundedRadius, + end : RoundedRadius, + bottom : RoundedRadius, + start : RoundedRadius, + top_start : RoundedRadius, + top_end : RoundedRadius, + bottom_start: RoundedRadius, + bottom_end : RoundedRadius, +} + +impl Rounded { + /// Prepara las esquinas **sin redondeo global** de partida. + pub fn new() -> Self { + Self::default() + } + + /// Crea las esquinas **con redondeo global** (`radius`). + pub fn with(radius: RoundedRadius) -> Self { + Self::default().with_radius(radius) + } + + // **< Rounded BUILDER >************************************************************************ + + /// Establece el radio global de las esquinas (`rounded*`). + pub fn with_radius(mut self, radius: RoundedRadius) -> Self { + self.radius = radius; + self + } + + /// Establece el radio en las esquinas del lado superior (`rounded-top-*`). + pub fn with_top(mut self, radius: RoundedRadius) -> Self { + self.top = radius; + self + } + + /// Establece el radio en las esquinas del lado lógico final (`rounded-end-*`). Respeta LTR/RTL. + pub fn with_end(mut self, radius: RoundedRadius) -> Self { + self.end = radius; + self + } + + /// Establece el radio en las esquinas del lado inferior (`rounded-bottom-*`). + pub fn with_bottom(mut self, radius: RoundedRadius) -> Self { + self.bottom = radius; + self + } + + /// Establece el radio en las esquinas del lado lógico inicial (`rounded-start-*`). Respeta + /// LTR/RTL. + pub fn with_start(mut self, radius: RoundedRadius) -> Self { + self.start = radius; + self + } + + /// Establece el radio en la esquina superior-inicial (`rounded-top-start-*`). Respeta LTR/RTL. + pub fn with_top_start(mut self, radius: RoundedRadius) -> Self { + self.top_start = radius; + self + } + + /// Establece el radio en la esquina superior-final (`rounded-top-end-*`). Respeta LTR/RTL. + pub fn with_top_end(mut self, radius: RoundedRadius) -> Self { + self.top_end = radius; + self + } + + /// Establece el radio en la esquina inferior-inicial (`rounded-bottom-start-*`). Respeta + /// LTR/RTL. + pub fn with_bottom_start(mut self, radius: RoundedRadius) -> Self { + self.bottom_start = radius; + self + } + + /// Establece el radio en la esquina inferior-final (`rounded-bottom-end-*`). Respeta LTR/RTL. + pub fn with_bottom_end(mut self, radius: RoundedRadius) -> Self { + self.bottom_end = radius; + self + } +} + +impl fmt::Display for Rounded { + /// Concatena, en este orden, las clases para *global*, `top`, `end`, `bottom`, `start`, + /// `top-start`, `top-end`, `bottom-start` y `bottom-end`; respetando LTR/RTL y omitiendo las + /// definiciones vacías. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}", + [ + self.radius.to_string(), + self.top.to_class("rounded-top"), + self.end.to_class("rounded-end"), + self.bottom.to_class("rounded-bottom"), + self.start.to_class("rounded-start"), + self.top_start.to_class("rounded-top-start"), + self.top_end.to_class("rounded-top-end"), + self.bottom_start.to_class("rounded-bottom-start"), + self.bottom_end.to_class("rounded-bottom-end"), + ] + .join_classes() + ) + } +} diff --git a/extensions/pagetop-bootsier/src/theme/container.rs b/extensions/pagetop-bootsier/src/theme/container.rs index 411eb0aa..a860110f 100644 --- a/extensions/pagetop-bootsier/src/theme/container.rs +++ b/extensions/pagetop-bootsier/src/theme/container.rs @@ -1,299 +1,24 @@ -use pagetop::prelude::*; +//! Definiciones para crear contenedores de componentes ([`Container`]). +//! +//! Cada contenedor envuelve contenido usando la etiqueta semántica indicada por +//! [`container::Kind`](crate::theme::container::Kind). +//! +//! Con [`container::Width`](crate::theme::container::Width) se puede definir el ancho y el +//! comportamiento *responsive* del contenedor. También permite aplicar utilidades de estilo para el +//! fondo, texto, borde o esquinas redondeadas. +//! +//! # Ejemplo +//! +//! ```rust +//! # use pagetop::prelude::*; +//! # use pagetop_bootsier::prelude::*; +//! let main = Container::main() +//! .with_id("main-page") +//! .with_width(container::Width::From(BreakPoint::LG)); +//! ``` -use crate::prelude::*; +mod props; +pub use props::{Kind, Width}; -// **< ContainerType >****************************************************************************** - -/// Tipo de contenedor ([`Container`]). -/// -/// Permite aplicar la etiqueta HTML apropiada (`<main>`, `<header>`, etc.) manteniendo una API -/// común a todos los contenedores. -#[derive(AutoDefault)] -pub enum ContainerType { - /// Contenedor genérico (`<div>`). - #[default] - Default, - /// Contenido principal de la página (`<main>`). - Main, - /// Encabezado de la página o de sección (`<header>`). - Header, - /// Pie de la página o de sección (`<footer>`). - Footer, - /// Sección de contenido (`<section>`). - Section, - /// Artículo de contenido (`<article>`). - Article, -} - -// **< ContainerWidth >***************************************************************************** - -/// Define el comportamiento para ajustar el ancho de un contenedor ([`Container`]). -#[derive(AutoDefault)] -pub enum ContainerWidth { - /// Comportamiento por defecto, aplica los anchos máximos predefinidos para cada punto de - /// ruptura. Por debajo del menor punto de ruptura ocupa el 100% del ancho disponible. - #[default] - Default, - /// Aplica los anchos máximos predefinidos a partir del punto de ruptura indicado. Por debajo de - /// ese punto de ruptura ocupa el 100% del ancho disponible. - From(BreakPoint), - /// Ocupa el 100% del ancho disponible siempre. - Fluid, - /// Ocupa el 100% del ancho disponible hasta un ancho máximo explícito. - FluidMax(UnitValue), -} - -// **< Container >********************************************************************************** - -/// Componente para crear un **contenedor de componentes**. -/// -/// Envuelve el contenido con la etiqueta HTML indicada por [`ContainerType`]. Sólo se renderiza si -/// existen componentes hijos (*children*). -#[rustfmt::skip] -#[derive(AutoDefault)] -pub struct Container { - id : AttrId, - classes : AttrClasses, - container_type : ContainerType, - container_width: ContainerWidth, - style_bg : StyleBg, - style_text : StyleText, - border : Border, - rounded : Rounded, - children : Children, -} - -impl Component for Container { - fn new() -> Self { - Container::default() - } - - fn id(&self) -> Option<String> { - self.id.get() - } - - fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - [ - join_pair!( - "container", - "-", - match self.width() { - ContainerWidth::Default => String::new(), - ContainerWidth::From(bp) => bp.to_string(), - ContainerWidth::Fluid => "fluid".to_string(), - ContainerWidth::FluidMax(_) => "fluid".to_string(), - } - ), - self.style_bg().to_string(), - self.style_text().to_string(), - self.border().to_string(), - self.rounded().to_string(), - ] - .join(" "), - ); - } - - fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let output = self.children().render(cx); - if output.is_empty() { - return PrepareMarkup::None; - } - let style = match self.width() { - ContainerWidth::FluidMax(w) if w.is_measurable() => { - Some(join!("max-width: ", w.to_string(), ";")) - } - _ => None, - }; - match self.container_type() { - ContainerType::Default => PrepareMarkup::With(html! { - div id=[self.id()] class=[self.classes().get()] style=[style] { - (output) - } - }), - ContainerType::Main => PrepareMarkup::With(html! { - main id=[self.id()] class=[self.classes().get()] style=[style] { - (output) - } - }), - ContainerType::Header => PrepareMarkup::With(html! { - header id=[self.id()] class=[self.classes().get()] style=[style] { - (output) - } - }), - ContainerType::Footer => PrepareMarkup::With(html! { - footer id=[self.id()] class=[self.classes().get()] style=[style] { - (output) - } - }), - ContainerType::Section => PrepareMarkup::With(html! { - section id=[self.id()] class=[self.classes().get()] style=[style] { - (output) - } - }), - ContainerType::Article => PrepareMarkup::With(html! { - article id=[self.id()] class=[self.classes().get()] style=[style] { - (output) - } - }), - } - } -} - -impl Container { - /// Crea un contenedor de tipo `Main` (`<main>`). - pub fn main() -> Self { - Container { - container_type: ContainerType::Main, - ..Default::default() - } - } - - /// Crea un contenedor de tipo `Header` (`<header>`). - pub fn header() -> Self { - Container { - container_type: ContainerType::Header, - ..Default::default() - } - } - - /// Crea un contenedor de tipo `Footer` (`<footer>`). - pub fn footer() -> Self { - Container { - container_type: ContainerType::Footer, - ..Default::default() - } - } - - /// Crea un contenedor de tipo `Section` (`<section>`). - pub fn section() -> Self { - Container { - container_type: ContainerType::Section, - ..Default::default() - } - } - - /// Crea un contenedor de tipo `Article` (`<article>`). - pub fn article() -> Self { - Container { - container_type: ContainerType::Article, - ..Default::default() - } - } - - // **< Container BUILDER >********************************************************************** - - /// Establece el identificador único (`id`) del contenedor. - #[builder_fn] - pub fn with_id(mut self, id: impl AsRef<str>) -> Self { - self.id.alter_value(id); - self - } - - /// Modifica la lista de clases CSS aplicadas al contenedor. - #[builder_fn] - pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { - self.classes.alter_value(op, classes); - self - } - - /// Establece el comportamiento del ancho para el contenedor. - #[builder_fn] - pub fn with_width(mut self, width: ContainerWidth) -> Self { - self.container_width = width; - self - } - - /// Establece el estilo del fondo ([`StyleBg`]). - #[builder_fn] - pub fn with_style_bg(mut self, style: StyleBg) -> Self { - self.style_bg = style; - self - } - - /// Establece el estilo del texto ([`StyleText`]). - #[builder_fn] - pub fn with_style_text(mut self, style: StyleText) -> Self { - self.style_text = style; - self - } - - /// Atajo para definir los estilos de fondo y texto a la vez. - #[builder_fn] - pub fn with_styles(mut self, style_bg: StyleBg, style_text: StyleText) -> Self { - self.style_bg = style_bg; - self.style_text = style_text; - self - } - - /// Establece el borde del contenedor ([`Border`]). - #[builder_fn] - pub fn with_border(mut self, border: Border) -> Self { - self.border = border; - self - } - - /// Establece esquinas redondeadas para el contenedor ([`Rounded`]). - #[builder_fn] - pub fn with_rounded(mut self, rounded: Rounded) -> Self { - self.rounded = rounded; - self - } - - /// Añade un nuevo componente hijo al contenedor. - #[inline] - pub fn add_child(mut self, component: impl Component) -> Self { - self.children.add(Child::with(component)); - self - } - - /// Modifica la lista de componentes (`children`) aplicando una operación [`ChildOp`]. - #[builder_fn] - pub fn with_child(mut self, op: ChildOp) -> Self { - self.children.alter_child(op); - self - } - - // **< Container GETTERS >********************************************************************** - - /// Devuelve las clases CSS asociadas al contenedor. - pub fn classes(&self) -> &AttrClasses { - &self.classes - } - - /// Devuelve el tipo semántico del contenedor. - pub fn container_type(&self) -> &ContainerType { - &self.container_type - } - - /// Devuelve el comportamiento para el ancho del contenedor. - pub fn width(&self) -> &ContainerWidth { - &self.container_width - } - - /// Devuelve el estilo del fondo del contenedor. - pub fn style_bg(&self) -> &StyleBg { - &self.style_bg - } - - /// Devuelve el estilo del texto del contenedor. - pub fn style_text(&self) -> &StyleText { - &self.style_text - } - - /// Devuelve el borde configurado del contenedor. - pub fn border(&self) -> &Border { - &self.border - } - - /// Devuelve las esquinas redondeadas configuradas para el contenedor. - pub fn rounded(&self) -> &Rounded { - &self.rounded - } - - /// Devuelve la lista de componentes (`children`) del contenedor. - pub fn children(&self) -> &Children { - &self.children - } -} +mod component; +pub use component::Container; diff --git a/extensions/pagetop-bootsier/src/theme/container/component.rs b/extensions/pagetop-bootsier/src/theme/container/component.rs new file mode 100644 index 00000000..1bcf1006 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/container/component.rs @@ -0,0 +1,197 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +/// Componente para crear un **contenedor de componentes**. +/// +/// Envuelve un contenido con la etiqueta HTML indicada por [`container::Kind`]. Sólo se renderiza +/// si existen componentes hijos (*children*). +#[rustfmt::skip] +#[derive(AutoDefault)] +pub struct Container { + id : AttrId, + classes : AttrClasses, + container_kind : container::Kind, + container_width: container::Width, + children : Children, +} + +impl Component for Container { + fn new() -> Self { + Container::default() + } + + fn id(&self) -> Option<String> { + self.id.get() + } + + fn setup_before_prepare(&mut self, _cx: &mut Context) { + self.alter_classes( + ClassesOp::Prepend, + [join_pair!( + "container", + "-", + match self.width() { + container::Width::Default => String::new(), + container::Width::From(bp) => bp.to_string(), + container::Width::Fluid => "fluid".to_string(), + container::Width::FluidMax(_) => "fluid".to_string(), + } + )] + .join_classes(), + ); + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let output = self.children().render(cx); + if output.is_empty() { + return PrepareMarkup::None; + } + let style = match self.width() { + container::Width::FluidMax(w) if w.is_measurable() => { + Some(join!("max-width: ", w.to_string(), ";")) + } + _ => None, + }; + match self.container_kind() { + container::Kind::Default => PrepareMarkup::With(html! { + div id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + container::Kind::Main => PrepareMarkup::With(html! { + main id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + container::Kind::Header => PrepareMarkup::With(html! { + header id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + container::Kind::Footer => PrepareMarkup::With(html! { + footer id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + container::Kind::Section => PrepareMarkup::With(html! { + section id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + container::Kind::Article => PrepareMarkup::With(html! { + article id=[self.id()] class=[self.classes().get()] style=[style] { + (output) + } + }), + } + } +} + +impl Container { + /// Crea un contenedor de tipo `Main` (`<main>`). + pub fn main() -> Self { + Container { + container_kind: container::Kind::Main, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Header` (`<header>`). + pub fn header() -> Self { + Container { + container_kind: container::Kind::Header, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Footer` (`<footer>`). + pub fn footer() -> Self { + Container { + container_kind: container::Kind::Footer, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Section` (`<section>`). + pub fn section() -> Self { + Container { + container_kind: container::Kind::Section, + ..Default::default() + } + } + + /// Crea un contenedor de tipo `Article` (`<article>`). + pub fn article() -> Self { + Container { + container_kind: container::Kind::Article, + ..Default::default() + } + } + + // **< Container BUILDER >********************************************************************** + + /// Establece el identificador único (`id`) del contenedor. + #[builder_fn] + pub fn with_id(mut self, id: impl AsRef<str>) -> Self { + self.id.alter_value(id); + self + } + + /// Modifica la lista de clases CSS aplicadas al contenedor. + /// + /// También acepta clases predefinidas para: + /// + /// - Modificar el color de fondo ([`classes::Background`]). + /// - Definir la apariencia del texto ([`classes::Text`]). + /// - Establecer bordes ([`classes::Border`]). + /// - Redondear las esquinas ([`classes::Rounded`]). + #[builder_fn] + pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { + self.classes.alter_value(op, classes); + self + } + + /// Establece el comportamiento del ancho para el contenedor. + #[builder_fn] + pub fn with_width(mut self, width: container::Width) -> Self { + self.container_width = width; + self + } + + /// Añade un nuevo componente hijo al contenedor. + #[inline] + pub fn add_child(mut self, component: impl Component) -> Self { + self.children.add(Child::with(component)); + self + } + + /// Modifica la lista de componentes (`children`) aplicando una operación [`ChildOp`]. + #[builder_fn] + pub fn with_child(mut self, op: ChildOp) -> Self { + self.children.alter_child(op); + self + } + + // **< Container GETTERS >********************************************************************** + + /// Devuelve las clases CSS asociadas al contenedor. + pub fn classes(&self) -> &AttrClasses { + &self.classes + } + + /// Devuelve el tipo semántico del contenedor. + pub fn container_kind(&self) -> &container::Kind { + &self.container_kind + } + + /// Devuelve el comportamiento para el ancho del contenedor. + pub fn width(&self) -> &container::Width { + &self.container_width + } + + /// Devuelve la lista de componentes (`children`) del contenedor. + pub fn children(&self) -> &Children { + &self.children + } +} diff --git a/extensions/pagetop-bootsier/src/theme/container/props.rs b/extensions/pagetop-bootsier/src/theme/container/props.rs new file mode 100644 index 00000000..796e32f4 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/container/props.rs @@ -0,0 +1,44 @@ +use pagetop::prelude::*; + +use crate::prelude::*; + +// **< Kind >*************************************************************************************** + +/// Tipo de contenedor ([`Container`]). +/// +/// Permite aplicar la etiqueta HTML apropiada (`<main>`, `<header>`, etc.) manteniendo una API +/// común a todos los contenedores. +#[derive(AutoDefault)] +pub enum Kind { + /// Contenedor genérico (`<div>`). + #[default] + Default, + /// Contenido principal de la página (`<main>`). + Main, + /// Encabezado de la página o de sección (`<header>`). + Header, + /// Pie de la página o de sección (`<footer>`). + Footer, + /// Sección de contenido (`<section>`). + Section, + /// Artículo de contenido (`<article>`). + Article, +} + +// **< Width >************************************************************************************** + +/// Define el comportamiento para ajustar el ancho de un contenedor ([`Container`]). +#[derive(AutoDefault)] +pub enum Width { + /// Comportamiento por defecto, aplica los anchos máximos predefinidos para cada punto de + /// ruptura. Por debajo del menor punto de ruptura ocupa el 100% del ancho disponible. + #[default] + Default, + /// Aplica los anchos máximos predefinidos a partir del punto de ruptura indicado. Por debajo de + /// ese punto de ruptura ocupa el 100% del ancho disponible. + From(BreakPoint), + /// Ocupa el 100% del ancho disponible siempre. + Fluid, + /// Ocupa el 100% del ancho disponible hasta un ancho máximo explícito. + FluidMax(UnitValue), +} diff --git a/extensions/pagetop-bootsier/src/theme/dropdown.rs b/extensions/pagetop-bootsier/src/theme/dropdown.rs index bbad2d3f..ed4cbec0 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown.rs @@ -14,7 +14,7 @@ //! # use pagetop_bootsier::prelude::*; //! let dd = Dropdown::new() //! .with_title(L10n::n("Menu")) -//! .with_button_color(ColorButton::Background(Color::Secondary)) +//! .with_button_color(ButtonColor::Background(Color::Secondary)) //! .with_auto_close(dropdown::AutoClose::ClickableInside) //! .with_direction(dropdown::Direction::Dropend) //! .add_item(dropdown::Item::link(L10n::n("Home"), |_| "/")) diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index 57e30713..450edff2 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -26,7 +26,7 @@ pub struct Dropdown { classes : AttrClasses, title : L10n, button_size : ButtonSize, - button_color : ColorButton, + button_color : ButtonColor, button_split : bool, button_grouped: bool, auto_close : dropdown::AutoClose, @@ -59,7 +59,7 @@ impl Component for Dropdown { dropdown::Direction::Dropend => "dropend", dropdown::Direction::Dropstart => "dropstart", } - ].join(" ")); + ].join_classes()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -79,7 +79,7 @@ impl Component for Dropdown { "btn", &self.button_size().to_string(), &self.button_color().to_string(), - ].join(" ")); + ].join_classes()); @let (offset, reference) = match self.menu_position() { dropdown::MenuPosition::Default => (None, None), dropdown::MenuPosition::Offset(x, y) => (Some(format!("{x},{y}")), None), @@ -212,7 +212,7 @@ impl Dropdown { /// Define el color/estilo del botón. #[builder_fn] - pub fn with_button_color(mut self, color: ColorButton) -> Self { + pub fn with_button_color(mut self, color: ButtonColor) -> Self { self.button_color = color; self } @@ -291,7 +291,7 @@ impl Dropdown { } /// Devuelve el color/estilo configurado del botón. - pub fn button_color(&self) -> &ColorButton { + pub fn button_color(&self) -> &ButtonColor { &self.button_color } diff --git a/extensions/pagetop-bootsier/src/theme/image/component.rs b/extensions/pagetop-bootsier/src/theme/image/component.rs index 0345adb2..2eda4302 100644 --- a/extensions/pagetop-bootsier/src/theme/image/component.rs +++ b/extensions/pagetop-bootsier/src/theme/image/component.rs @@ -6,8 +6,8 @@ use crate::prelude::*; /// /// - Ajusta su disposición según el origen definido en [`image::Source`]. /// - Permite configurar **dimensiones** ([`with_size()`](Self::with_size)), **borde** -/// ([`with_border()`](Self::with_border)) y **redondeo de esquinas** -/// ([`with_rounded()`](Self::with_rounded)). +/// ([`classes::Border`](crate::theme::classes::Border)) y **redondeo de esquinas** +/// ([`classes::Rounded`](crate::theme::classes::Rounded)). /// - Resuelve el texto alternativo `alt` con **localización** mediante [`L10n`]. #[rustfmt::skip] #[derive(AutoDefault)] @@ -17,8 +17,6 @@ pub struct Image { size : image::Size, source : image::Source, alt : AttrL10n, - border : Border, - rounded: Rounded, } impl Component for Image { @@ -33,17 +31,12 @@ impl Component for Image { fn setup_before_prepare(&mut self, _cx: &mut Context) { self.alter_classes( ClassesOp::Prepend, - [ - String::from(match self.source() { - image::Source::Logo(_) => "img-fluid", - image::Source::Responsive(_) => "img-fluid", - image::Source::Thumbnail(_) => "img-thumbnail", - image::Source::Plain(_) => "", - }), - self.border().to_string(), - self.rounded().to_string(), - ] - .join(" "), + match self.source() { + image::Source::Logo(_) => "img-fluid", + image::Source::Responsive(_) => "img-fluid", + image::Source::Thumbnail(_) => "img-thumbnail", + image::Source::Plain(_) => "", + }, ); } @@ -116,6 +109,11 @@ impl Image { } /// Modifica la lista de clases CSS aplicadas a la imagen. + /// + /// También acepta clases predefinidas para: + /// + /// - Establecer bordes ([`classes::Border`]). + /// - Redondear las esquinas ([`classes::Rounded`]). #[builder_fn] pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { self.classes.alter_value(op, classes); @@ -146,20 +144,6 @@ impl Image { self } - /// Establece el borde de la imagen ([`Border`]). - #[builder_fn] - pub fn with_border(mut self, border: Border) -> Self { - self.border = border; - self - } - - /// Establece esquinas redondeadas para la imagen ([`Rounded`]). - #[builder_fn] - pub fn with_rounded(mut self, rounded: Rounded) -> Self { - self.rounded = rounded; - self - } - // **< Image GETTERS >************************************************************************** /// Devuelve las clases CSS asociadas a la imagen. @@ -181,14 +165,4 @@ impl Image { pub fn alternative(&self) -> &AttrL10n { &self.alt } - - /// Devuelve el borde configurado de la imagen. - pub fn border(&self) -> &Border { - &self.border - } - - /// Devuelve las esquinas redondeadas configuradas para la imagen. - pub fn rounded(&self) -> &Rounded { - &self.rounded - } } diff --git a/extensions/pagetop-bootsier/src/theme/nav/component.rs b/extensions/pagetop-bootsier/src/theme/nav/component.rs index d4cf2c8c..fe886bdd 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/component.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/component.rs @@ -50,7 +50,7 @@ impl Component for Nav { nav::Layout::Justified => "nav-justified", }, ] - .join(" "), + .join_classes(), ); } diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs index 6362b9d6..ac592439 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/component.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs @@ -17,14 +17,12 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas"; #[rustfmt::skip] #[derive(AutoDefault)] pub struct Navbar { - id : AttrId, - classes : AttrClasses, - expand : BreakPoint, - layout : navbar::Layout, - position : navbar::Position, - style_bg : StyleBg, - style_text: StyleText, - items : Children, + id : AttrId, + classes : AttrClasses, + expand : BreakPoint, + layout : navbar::Layout, + position : navbar::Position, + items : Children, } impl Component for Navbar { @@ -50,10 +48,8 @@ impl Component for Navbar { navbar::Position::StickyBottom => "sticky-bottom", } .to_string(), - self.style_bg().to_string(), - self.style_text().to_string(), ] - .join(" "), + .join_classes(), ); } @@ -232,6 +228,11 @@ impl Navbar { } /// Modifica la lista de clases CSS aplicadas a la barra de navegación. + /// + /// También acepta clases predefinidas para: + /// + /// - Modificar el color de fondo ([`classes::Background`]). + /// - Definir la apariencia del texto ([`classes::Text`]). #[builder_fn] pub fn with_classes(mut self, op: ClassesOp, classes: impl AsRef<str>) -> Self { self.classes.alter_value(op, classes); @@ -259,28 +260,6 @@ impl Navbar { self } - /// Establece el estilo del fondo ([`StyleBg`]). - #[builder_fn] - pub fn with_style_bg(mut self, style: StyleBg) -> Self { - self.style_bg = style; - self - } - - /// Establece el estilo del texto ([`StyleText`]). - #[builder_fn] - pub fn with_style_text(mut self, style: StyleText) -> Self { - self.style_text = style; - self - } - - /// Atajo para definir los estilos de fondo y texto a la vez. - #[builder_fn] - pub fn with_styles(mut self, style_bg: StyleBg, style_text: StyleText) -> Self { - self.style_bg = style_bg; - self.style_text = style_text; - self - } - /// Añade un nuevo contenido hijo. #[inline] pub fn add_item(mut self, item: navbar::Item) -> Self { @@ -317,16 +296,6 @@ impl Navbar { &self.position } - /// Devuelve el estilo del fondo del contenedor. - pub fn style_bg(&self) -> &StyleBg { - &self.style_bg - } - - /// Devuelve el estilo del texto del contenedor. - pub fn style_text(&self) -> &StyleText { - &self.style_text - } - /// Devuelve la lista de contenidos (`children`). pub fn items(&self) -> &Children { &self.items diff --git a/extensions/pagetop-bootsier/src/theme/navbar/item.rs b/extensions/pagetop-bootsier/src/theme/navbar/item.rs index f0646406..07f52be6 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/item.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/item.rs @@ -67,7 +67,7 @@ impl Component for Item { nav::Layout::Justified => "nav-justified", }, ] - .join(" "), + .join_classes(), ); PrepareMarkup::With(html! { ul id=[nav.id()] class=[classes.get()] { diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs index 61e6fae7..7516238b 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs @@ -61,7 +61,7 @@ impl Component for Offcanvas { offcanvas::Visibility::Show => "show", }.to_string(), ] - .join(" "), + .join_classes(), ); } From 2e39af0856a57e8c6e2bd77aaab72e55169eb703 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 15 Nov 2025 13:16:15 +0100 Subject: [PATCH 847/853] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20(bootsier):=20Refa?= =?UTF-8?q?ctoriza=20la=20gesti=C3=B3n=20de=20clases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Mejora la legibilidad del código. - Simplifica las alteraciones de clases en los componentes `Container`, `Dropdown`, `Image`, `Nav`, `Navbar` y `Offcanvas` usando métodos dedicados para generar clases en función de sus propiedades. - Mejora los enums añadiendo métodos que devuelven sus clases asociadas, reduciendo código repetitivo. - Elimina el trait `JoinClasses` y su implementación, integrando la lógica de unión de clases directamente en los componentes. --- extensions/pagetop-bootsier/src/theme/aux.rs | 5 +- .../pagetop-bootsier/src/theme/aux/border.rs | 114 +++---- .../src/theme/aux/breakpoint.rs | 145 +++++---- .../pagetop-bootsier/src/theme/aux/button.rs | 119 ++++++- .../pagetop-bootsier/src/theme/aux/color.rs | 305 ++++++++++++++---- .../pagetop-bootsier/src/theme/aux/layout.rs | 104 ++++++ .../pagetop-bootsier/src/theme/aux/rounded.rs | 119 +++++-- .../pagetop-bootsier/src/theme/classes.rs | 3 + .../src/theme/classes/border.rs | 178 +++++----- .../src/theme/classes/color.rs | 97 +++--- .../src/theme/classes/layout.rs | 205 ++++++++++++ .../src/theme/classes/rounded.rs | 60 ++-- .../src/theme/container/component.rs | 15 +- .../src/theme/container/props.rs | 38 ++- .../src/theme/dropdown/component.rs | 68 ++-- .../src/theme/dropdown/item.rs | 2 +- .../src/theme/dropdown/props.rs | 148 ++++++++- .../src/theme/image/component.rs | 31 +- .../pagetop-bootsier/src/theme/image/props.rs | 59 +++- .../src/theme/nav/component.rs | 28 +- .../pagetop-bootsier/src/theme/nav/item.rs | 51 ++- .../pagetop-bootsier/src/theme/nav/props.rs | 85 ++++- .../src/theme/navbar/component.rs | 22 +- .../pagetop-bootsier/src/theme/navbar/item.rs | 31 +- .../src/theme/navbar/props.rs | 36 ++- .../src/theme/offcanvas/component.rs | 25 +- .../src/theme/offcanvas/props.rs | 67 +++- src/base/component.rs | 12 +- src/html.rs | 3 - src/html/assets/stylesheet.rs | 6 +- src/html/join_classes.rs | 67 ---- src/html/logo.rs | 2 +- src/prelude.rs | 4 +- 33 files changed, 1607 insertions(+), 647 deletions(-) create mode 100644 extensions/pagetop-bootsier/src/theme/aux/layout.rs create mode 100644 extensions/pagetop-bootsier/src/theme/classes/layout.rs delete mode 100644 src/html/join_classes.rs diff --git a/extensions/pagetop-bootsier/src/theme/aux.rs b/extensions/pagetop-bootsier/src/theme/aux.rs index 528126de..99431fe3 100644 --- a/extensions/pagetop-bootsier/src/theme/aux.rs +++ b/extensions/pagetop-bootsier/src/theme/aux.rs @@ -7,8 +7,11 @@ mod color; pub use color::{Color, Opacity}; pub use color::{ColorBg, ColorText}; +mod layout; +pub use layout::{ScaleSize, Side}; + mod border; -pub use border::{BorderColor, BorderSize}; +pub use border::BorderColor; mod rounded; pub use rounded::RoundedRadius; diff --git a/extensions/pagetop-bootsier/src/theme/aux/border.rs b/extensions/pagetop-bootsier/src/theme/aux/border.rs index 47547c30..43882767 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/border.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/border.rs @@ -2,12 +2,8 @@ use pagetop::prelude::*; use crate::theme::aux::Color; -use std::fmt; - -// **< BorderColor >******************************************************************************** - /// Colores `border-*` para los bordes ([`classes::Border`](crate::theme::classes::Border)). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum BorderColor { /// No define ninguna clase. #[default] @@ -22,60 +18,70 @@ pub enum BorderColor { White, } -#[rustfmt::skip] -impl fmt::Display for BorderColor { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Default => Ok(()), - Self::Theme(c) => write!(f, "border-{c}"), - Self::Subtle(c) => write!(f, "border-{c}-subtle"), - Self::Black => f.write_str("border-black"), - Self::White => f.write_str("border-white"), - } - } -} +impl BorderColor { + const BORDER: &str = "border"; + const BORDER_PREFIX: &str = "border-"; -// **< BorderSize >********************************************************************************* - -/// Tamaño para el ancho de los bordes ([`classes::Border`](crate::theme::classes::Border)). -/// -/// Mapea a `border`, `border-0` y `border-{1..5}`: -/// -/// - `None` no añade ninguna clase. -/// - `Default` genera `border` (borde por defecto del tema). -/// - `Zero` genera `border-0` (sin borde). -/// - `Scale{1..5}` genera `border-{1..5}` (ancho creciente). -#[derive(AutoDefault)] -pub enum BorderSize { - #[default] - None, - Default, - Zero, - Scale1, - Scale2, - Scale3, - Scale4, - Scale5, -} - -impl BorderSize { + // Devuelve el sufijo de la clase `border-*`, o `None` si no define ninguna clase. #[rustfmt::skip] - pub(crate) fn to_class(&self, prefix: impl AsRef<str>) -> String { + #[inline] + const fn suffix(self) -> Option<&'static str> { match self { - Self::None => String::new(), - Self::Default => String::from(prefix.as_ref()), - Self::Zero => join!(prefix, "-0"), - Self::Scale1 => join!(prefix, "-1"), - Self::Scale2 => join!(prefix, "-2"), - Self::Scale3 => join!(prefix, "-3"), - Self::Scale4 => join!(prefix, "-4"), - Self::Scale5 => join!(prefix, "-5"), + Self::Default => None, + Self::Theme(_) => Some(""), + Self::Subtle(_) => Some("-subtle"), + Self::Black => Some("-black"), + Self::White => Some("-white"), } } -} -impl fmt::Display for BorderSize { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.to_class("border")) + // Añade la clase `border-*` a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + if let Some(suffix) = self.suffix() { + if !classes.is_empty() { + classes.push(' '); + } + match self { + Self::Theme(c) | Self::Subtle(c) => { + classes.push_str(Self::BORDER_PREFIX); + classes.push_str(c.as_str()); + } + _ => classes.push_str(Self::BORDER), + } + classes.push_str(suffix); + } + } + + /// Devuelve la clase `border-*` correspondiente al color de borde. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!(BorderColor::Theme(Color::Primary).to_class(), "border-primary"); + /// assert_eq!(BorderColor::Subtle(Color::Warning).to_class(), "border-warning-subtle"); + /// assert_eq!(BorderColor::Black.to_class(), "border-black"); + /// assert_eq!(BorderColor::Default.to_class(), ""); + /// ``` + #[inline] + pub fn to_class(self) -> String { + if let Some(suffix) = self.suffix() { + let base_len = match self { + Self::Theme(c) | Self::Subtle(c) => Self::BORDER_PREFIX.len() + c.as_str().len(), + _ => Self::BORDER.len(), + }; + let mut class = String::with_capacity(base_len + suffix.len()); + match self { + Self::Theme(c) | Self::Subtle(c) => { + class.push_str(Self::BORDER_PREFIX); + class.push_str(c.as_str()); + } + _ => class.push_str(Self::BORDER), + } + class.push_str(suffix); + return class; + } + String::new() } } diff --git a/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs index 27d7c29f..4d9a7626 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/breakpoint.rs @@ -1,9 +1,7 @@ use pagetop::prelude::*; -use std::fmt; - /// Define los puntos de ruptura (*breakpoints*) para aplicar diseño *responsive*. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum BreakPoint { /// **Menos de 576px**. Dispositivos muy pequeños: teléfonos en modo vertical. #[default] @@ -21,71 +19,96 @@ pub enum BreakPoint { } impl BreakPoint { + // Devuelve la identificación del punto de ruptura. #[rustfmt::skip] #[inline] - const fn suffix(&self) -> Option<&'static str> { + pub(crate) const fn as_str(self) -> &'static str { match self { - Self::None => None, - Self::SM => Some("sm"), - Self::MD => Some("md"), - Self::LG => Some("lg"), - Self::XL => Some("xl"), - Self::XXL => Some("xxl"), + Self::None => "", + Self::SM => "sm", + Self::MD => "md", + Self::LG => "lg", + Self::XL => "xl", + Self::XXL => "xxl", } } - /// Genera un nombre de clase CSS basado en el punto de ruptura. - /// - /// Si es un punto de ruptura efectivo concatena el prefijo, un guion (`-`) y el sufijo - /// asociado. Para `None` devuelve sólo el prefijo. - /// - /// # Ejemplo - /// - /// ```rust - /// # use pagetop_bootsier::prelude::*; - /// let breakpoint = BreakPoint::MD; - /// assert_eq!(breakpoint.to_class("col"), "col-md"); - /// - /// let breakpoint = BreakPoint::None; - /// assert_eq!(breakpoint.to_class("offcanvas"), "offcanvas"); - /// ``` + // Añade el punto de ruptura con un prefijo y un sufijo (opcional) separados por un guion `-` a + // la cadena de clases. + // + // - Para `None` - `prefix` o `prefix-suffix` (si `suffix` no está vacío). + // - Para `SM..XXL` - `prefix-{breakpoint}` o `prefix-{breakpoint}-{suffix}`. #[inline] - pub fn to_class(&self, prefix: impl AsRef<str>) -> String { - join_pair!(prefix, "-", self.suffix().unwrap_or_default()) - } - - /// Intenta generar un nombre de clase CSS basado en el punto de ruptura. - /// - /// Si es un punto de ruptura efectivo devuelve `Some(String)` concatenando el prefijo, un guion - /// (`-`) y el sufijo asociado. En otro caso devuelve `None`. - /// - /// # Ejemplo - /// - /// ```rust - /// # use pagetop_bootsier::prelude::*; - /// let breakpoint = BreakPoint::MD; - /// let class = breakpoint.try_class("col"); - /// assert_eq!(class, Some("col-md".to_string())); - /// - /// let breakpoint = BreakPoint::None; - /// let class = breakpoint.try_class("navbar-expand"); - /// assert_eq!(class, None); - /// ``` - #[inline] - pub fn try_class(&self, prefix: impl AsRef<str>) -> Option<String> { - self.suffix().map(|suffix| join_pair!(prefix, "-", suffix)) - } -} - -impl fmt::Display for BreakPoint { - /// Implementa [`Display`](std::fmt::Display) para asociar `"sm"`, `"md"`, `"lg"`, `"xl"` o - /// `"xxl"` a los puntos de ruptura `BreakPoint::SM`, `MD`, `LG`, `XL` o `XXL`, respectivamente. - /// Y `""` (cadena vacía) a `BreakPoint::None`. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if let Some(suffix) = self.suffix() { - f.write_str(suffix) - } else { - Ok(()) + pub(crate) fn push_class(self, classes: &mut String, prefix: &str, suffix: &str) { + if prefix.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + match self { + Self::None => classes.push_str(prefix), + _ => { + classes.push_str(prefix); + classes.push('-'); + classes.push_str(self.as_str()); + } + } + if !suffix.is_empty() { + classes.push('-'); + classes.push_str(suffix); } } + + // Devuelve la clase para el punto de ruptura, con un prefijo y un sufijo opcional, separados + // por un guion `-`. + // + // - Para `None` - `prefix` o `prefix-suffix` (si `suffix` no está vacío). + // - Para `SM..XXL` - `prefix-{breakpoint}` o `prefix-{breakpoint}-{suffix}`. + // - Si `prefix` está vacío devuelve `""`. + // + // # Ejemplos + // + // ```rust + // # use pagetop_bootsier::prelude::*; + // let bp = BreakPoint::MD; + // assert_eq!(bp.class_with("col", ""), "col-md"); + // assert_eq!(bp.class_with("col", "6"), "col-md-6"); + // + // let bp = BreakPoint::None; + // assert_eq!(bp.class_with("offcanvas", ""), "offcanvas"); + // assert_eq!(bp.class_with("col", "12"), "col-12"); + // + // let bp = BreakPoint::LG; + // assert_eq!(bp.class_with("", "3"), ""); + // ``` + #[inline] + pub(crate) fn class_with(self, prefix: &str, suffix: &str) -> String { + if prefix.is_empty() { + return String::new(); + } + + let bp = self.as_str(); + let has_bp = !bp.is_empty(); + let has_suffix = !suffix.is_empty(); + + let mut len = prefix.len(); + if has_bp { + len += 1 + bp.len(); + } + if has_suffix { + len += 1 + suffix.len(); + } + let mut class = String::with_capacity(len); + class.push_str(prefix); + if has_bp { + class.push('-'); + class.push_str(bp); + } + if has_suffix { + class.push('-'); + class.push_str(suffix); + } + class + } } diff --git a/extensions/pagetop-bootsier/src/theme/aux/button.rs b/extensions/pagetop-bootsier/src/theme/aux/button.rs index a2f2efb9..0d1df87d 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/button.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/button.rs @@ -2,12 +2,10 @@ use pagetop::prelude::*; use crate::theme::aux::Color; -use std::fmt; - // **< ButtonColor >******************************************************************************** /// Variantes de color `btn-*` para botones. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum ButtonColor { /// No define ninguna clase. #[default] @@ -20,14 +18,72 @@ pub enum ButtonColor { Link, } -#[rustfmt::skip] -impl fmt::Display for ButtonColor { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ButtonColor { + const BTN_PREFIX: &str = "btn-"; + const BTN_OUTLINE_PREFIX: &str = "btn-outline-"; + const BTN_LINK: &str = "btn-link"; + + // Añade la clase `btn-*` a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + if let Self::Default = self { + return; + } + if !classes.is_empty() { + classes.push(' '); + } match self { - Self::Default => Ok(()), - Self::Background(c) => write!(f, "btn-{c}"), - Self::Outline(c) => write!(f, "btn-outline-{c}"), - Self::Link => f.write_str("btn-link"), + Self::Default => unreachable!(), + Self::Background(c) => { + classes.push_str(Self::BTN_PREFIX); + classes.push_str(c.as_str()); + } + Self::Outline(c) => { + classes.push_str(Self::BTN_OUTLINE_PREFIX); + classes.push_str(c.as_str()); + } + Self::Link => { + classes.push_str(Self::BTN_LINK); + } + } + } + + /// Devuelve la clase `btn-*` correspondiente al color del botón. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!( + /// ButtonColor::Background(Color::Primary).to_class(), + /// "btn-primary" + /// ); + /// assert_eq!( + /// ButtonColor::Outline(Color::Danger).to_class(), + /// "btn-outline-danger" + /// ); + /// assert_eq!(ButtonColor::Link.to_class(), "btn-link"); + /// assert_eq!(ButtonColor::Default.to_class(), ""); + /// ``` + #[inline] + pub fn to_class(self) -> String { + match self { + Self::Default => String::new(), + Self::Background(c) => { + let color = c.as_str(); + let mut class = String::with_capacity(Self::BTN_PREFIX.len() + color.len()); + class.push_str(Self::BTN_PREFIX); + class.push_str(color); + class + } + Self::Outline(c) => { + let color = c.as_str(); + let mut class = String::with_capacity(Self::BTN_OUTLINE_PREFIX.len() + color.len()); + class.push_str(Self::BTN_OUTLINE_PREFIX); + class.push_str(color); + class + } + Self::Link => Self::BTN_LINK.to_string(), } } } @@ -35,7 +91,7 @@ impl fmt::Display for ButtonColor { // **< ButtonSize >********************************************************************************* /// Tamaño visual de un botón. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum ButtonSize { /// Tamaño por defecto del tema (no añade clase). #[default] @@ -46,13 +102,42 @@ pub enum ButtonSize { Large, } -#[rustfmt::skip] -impl fmt::Display for ButtonSize { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ButtonSize { + const BTN_SM: &str = "btn-sm"; + const BTN_LG: &str = "btn-lg"; + + // Añade la clase de tamaño `btn-sm` o `btn-lg` a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + if let Self::Default = self { + return; + } + if !classes.is_empty() { + classes.push(' '); + } match self { - Self::Default => Ok(()), - Self::Small => f.write_str("btn-sm"), - Self::Large => f.write_str("btn-lg"), + Self::Default => unreachable!(), + Self::Small => classes.push_str(Self::BTN_SM), + Self::Large => classes.push_str(Self::BTN_LG), + } + } + + /// Devuelve la clase `btn-sm` o `btn-lg` correspondiente al tamaño del botón. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!(ButtonSize::Small.to_class(), "btn-sm"); + /// assert_eq!(ButtonSize::Large.to_class(), "btn-lg"); + /// assert_eq!(ButtonSize::Default.to_class(), ""); + /// ``` + #[inline] + pub fn to_class(self) -> String { + match self { + Self::Default => String::new(), + Self::Small => Self::BTN_SM.to_string(), + Self::Large => Self::BTN_LG.to_string(), } } } diff --git a/extensions/pagetop-bootsier/src/theme/aux/color.rs b/extensions/pagetop-bootsier/src/theme/aux/color.rs index d0f1da00..480ff3d8 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/color.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/color.rs @@ -1,7 +1,5 @@ use pagetop::prelude::*; -use std::fmt; - // **< Color >************************************************************************************** /// Paleta de colores temáticos. @@ -11,7 +9,7 @@ use std::fmt; /// ([`classes::Background`](crate::theme::classes::Background)), bordes /// ([`classes::Border`](crate::theme::classes::Border)) y texto /// ([`classes::Text`](crate::theme::classes::Text)). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Color { #[default] Primary, @@ -24,20 +22,45 @@ pub enum Color { Dark, } -#[rustfmt::skip] -impl fmt::Display for Color { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl Color { + // Devuelve el nombre del color. + #[rustfmt::skip] + #[inline] + pub(crate) const fn as_str(self) -> &'static str { match self { - Self::Primary => f.write_str("primary"), - Self::Secondary => f.write_str("secondary"), - Self::Success => f.write_str("success"), - Self::Info => f.write_str("info"), - Self::Warning => f.write_str("warning"), - Self::Danger => f.write_str("danger"), - Self::Light => f.write_str("light"), - Self::Dark => f.write_str("dark"), + Self::Primary => "primary", + Self::Secondary => "secondary", + Self::Success => "success", + Self::Info => "info", + Self::Warning => "warning", + Self::Danger => "danger", + Self::Light => "light", + Self::Dark => "dark", } } + + /* Añade el nombre del color a la cadena de clases (reservado). + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(self.as_str()); + } */ + + /// Devuelve la clase correspondiente al color. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!(Color::Primary.to_class(), "primary"); + /// assert_eq!(Color::Danger.to_class(), "danger"); + /// ``` + #[inline] + pub fn to_class(self) -> String { + self.as_str().to_owned() + } } // **< Opacity >************************************************************************************ @@ -48,7 +71,7 @@ impl fmt::Display for Color { /// ([`classes::Background`](crate::theme::classes::Background)), de los bordes `border-opacity-*` /// ([`classes::Border`](crate::theme::classes::Border)) o del texto `text-opacity-*` /// ([`classes::Text`](crate::theme::classes::Text)). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Opacity { /// No define ninguna clase. #[default] @@ -68,39 +91,95 @@ pub enum Opacity { } impl Opacity { + const OPACITY: &str = "opacity"; + const OPACITY_PREFIX: &str = "-opacity"; + + // Devuelve el sufijo para `*opacity-*`, o `None` si no define ninguna clase. #[rustfmt::skip] #[inline] - const fn suffix(&self) -> &'static str { + const fn suffix(self) -> Option<&'static str> { match self { - Self::Default => "", - Self::Opaque => "opacity-100", - Self::SemiOpaque => "opacity-75", - Self::Half => "opacity-50", - Self::SemiTransparent => "opacity-25", - Self::AlmostTransparent => "opacity-10", - Self::Transparent => "opacity-0", + Self::Default => None, + Self::Opaque => Some("-100"), + Self::SemiOpaque => Some("-75"), + Self::Half => Some("-50"), + Self::SemiTransparent => Some("-25"), + Self::AlmostTransparent => Some("-10"), + Self::Transparent => Some("-0"), } } + // Añade la opacidad a la cadena de clases usando el prefijo dado (`bg`, `border`, `text`, o + // vacío para `opacity-*`). #[inline] - pub(crate) fn to_class(&self, prefix: impl AsRef<str>) -> String { - match self { - Self::Default => String::new(), - _ => join_pair!(prefix, "-", self.suffix()), + pub(crate) fn push_class(self, classes: &mut String, prefix: &str) { + if let Some(suffix) = self.suffix() { + if !classes.is_empty() { + classes.push(' '); + } + if prefix.is_empty() { + classes.push_str(Self::OPACITY); + } else { + classes.push_str(prefix); + classes.push_str(Self::OPACITY_PREFIX); + } + classes.push_str(suffix); } } -} -impl fmt::Display for Opacity { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(self.suffix()) + // Devuelve la clase de opacidad con el prefijo dado (`bg`, `border`, `text`, o vacío para + // `opacity-*`). + // + // # Ejemplos + // + // ```rust + // # use pagetop_bootsier::prelude::*; + // assert_eq!(Opacity::Opaque.class_with(""), "opacity-100"); + // assert_eq!(Opacity::Half.class_with("bg"), "bg-opacity-50"); + // assert_eq!(Opacity::SemiTransparent.class_with("text"), "text-opacity-25"); + // assert_eq!(Opacity::Default.class_with("bg"), ""); + // ``` + #[inline] + pub(crate) fn class_with(self, prefix: &str) -> String { + if let Some(suffix) = self.suffix() { + let base_len = if prefix.is_empty() { + Self::OPACITY.len() + } else { + prefix.len() + Self::OPACITY_PREFIX.len() + }; + let mut class = String::with_capacity(base_len + suffix.len()); + if prefix.is_empty() { + class.push_str(Self::OPACITY); + } else { + class.push_str(prefix); + class.push_str(Self::OPACITY_PREFIX); + } + class.push_str(suffix); + return class; + } + String::new() + } + + /// Devuelve la clase de opacidad `opacity-*`. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!(Opacity::Opaque.to_class(), "opacity-100"); + /// assert_eq!(Opacity::Half.to_class(), "opacity-50"); + /// assert_eq!(Opacity::Default.to_class(), ""); + /// ``` + #[inline] + pub fn to_class(self) -> String { + self.class_with("") } } // **< ColorBg >************************************************************************************ /// Colores `bg-*` para el fondo. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum ColorBg { /// No define ninguna clase. #[default] @@ -123,27 +202,83 @@ pub enum ColorBg { Transparent, } -#[rustfmt::skip] -impl fmt::Display for ColorBg { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ColorBg { + const BG: &str = "bg"; + const BG_PREFIX: &str = "bg-"; + + // Devuelve el sufijo de la clase `bg-*`, o `None` si no define ninguna clase. + #[rustfmt::skip] + #[inline] + const fn suffix(self) -> Option<&'static str> { match self { - Self::Default => Ok(()), - Self::Body => f.write_str("bg-body"), - Self::BodySecondary => f.write_str("bg-body-secondary"), - Self::BodyTertiary => f.write_str("bg-body-tertiary"), - Self::Theme(c) => write!(f, "bg-{c}"), - Self::Subtle(c) => write!(f, "bg-{c}-subtle"), - Self::Black => f.write_str("bg-black"), - Self::White => f.write_str("bg-white"), - Self::Transparent => f.write_str("bg-transparent"), + Self::Default => None, + Self::Body => Some("-body"), + Self::BodySecondary => Some("-body-secondary"), + Self::BodyTertiary => Some("-body-tertiary"), + Self::Theme(_) => Some(""), + Self::Subtle(_) => Some("-subtle"), + Self::Black => Some("-black"), + Self::White => Some("-white"), + Self::Transparent => Some("-transparent"), } } + + // Añade la clase de fondo `bg-*` a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + if let Some(suffix) = self.suffix() { + if !classes.is_empty() { + classes.push(' '); + } + match self { + Self::Theme(c) | Self::Subtle(c) => { + classes.push_str(Self::BG_PREFIX); + classes.push_str(c.as_str()); + } + _ => classes.push_str(Self::BG), + } + classes.push_str(suffix); + } + } + + /// Devuelve la clase `bg-*` correspondiente al fondo. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!(ColorBg::Body.to_class(), "bg-body"); + /// assert_eq!(ColorBg::Theme(Color::Primary).to_class(), "bg-primary"); + /// assert_eq!(ColorBg::Subtle(Color::Warning).to_class(), "bg-warning-subtle"); + /// assert_eq!(ColorBg::Transparent.to_class(), "bg-transparent"); + /// assert_eq!(ColorBg::Default.to_class(), ""); + /// ``` + #[inline] + pub fn to_class(self) -> String { + if let Some(suffix) = self.suffix() { + let base_len = match self { + Self::Theme(c) | Self::Subtle(c) => Self::BG_PREFIX.len() + c.as_str().len(), + _ => Self::BG.len(), + }; + let mut class = String::with_capacity(base_len + suffix.len()); + match self { + Self::Theme(c) | Self::Subtle(c) => { + class.push_str(Self::BG_PREFIX); + class.push_str(c.as_str()); + } + _ => class.push_str(Self::BG), + } + class.push_str(suffix); + return class; + } + String::new() + } } // **< ColorText >********************************************************************************** /// Colores `text-*` para el texto. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum ColorText { /// No define ninguna clase. #[default] @@ -166,19 +301,75 @@ pub enum ColorText { White, } -#[rustfmt::skip] -impl fmt::Display for ColorText { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +impl ColorText { + const TEXT: &str = "text"; + const TEXT_PREFIX: &str = "text-"; + + // Devuelve el sufijo de la clase `text-*`, o `None` si no define ninguna clase. + #[rustfmt::skip] + #[inline] + const fn suffix(self) -> Option<&'static str> { match self { - Self::Default => Ok(()), - Self::Body => f.write_str("text-body"), - Self::BodyEmphasis => f.write_str("text-body-emphasis"), - Self::BodySecondary => f.write_str("text-body-secondary"), - Self::BodyTertiary => f.write_str("text-body-tertiary"), - Self::Theme(c) => write!(f, "text-{c}"), - Self::Emphasis(c) => write!(f, "text-{c}-emphasis"), - Self::Black => f.write_str("text-black"), - Self::White => f.write_str("text-white"), + Self::Default => None, + Self::Body => Some("-body"), + Self::BodyEmphasis => Some("-body-emphasis"), + Self::BodySecondary => Some("-body-secondary"), + Self::BodyTertiary => Some("-body-tertiary"), + Self::Theme(_) => Some(""), + Self::Emphasis(_) => Some("-emphasis"), + Self::Black => Some("-black"), + Self::White => Some("-white"), } } + + // Añade la clase de texto `text-*` a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + if let Some(suffix) = self.suffix() { + if !classes.is_empty() { + classes.push(' '); + } + match self { + Self::Theme(c) | Self::Emphasis(c) => { + classes.push_str(Self::TEXT_PREFIX); + classes.push_str(c.as_str()); + } + _ => classes.push_str(Self::TEXT), + } + classes.push_str(suffix); + } + } + + /// Devuelve la clase `text-*` correspondiente al color del texto. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!(ColorText::Body.to_class(), "text-body"); + /// assert_eq!(ColorText::Theme(Color::Primary).to_class(), "text-primary"); + /// assert_eq!(ColorText::Emphasis(Color::Danger).to_class(), "text-danger-emphasis"); + /// assert_eq!(ColorText::Black.to_class(), "text-black"); + /// assert_eq!(ColorText::Default.to_class(), ""); + /// ``` + #[inline] + pub fn to_class(self) -> String { + if let Some(suffix) = self.suffix() { + let base_len = match self { + Self::Theme(c) | Self::Emphasis(c) => Self::TEXT_PREFIX.len() + c.as_str().len(), + _ => Self::TEXT.len(), + }; + let mut class = String::with_capacity(base_len + suffix.len()); + match self { + Self::Theme(c) | Self::Emphasis(c) => { + class.push_str(Self::TEXT_PREFIX); + class.push_str(c.as_str()); + } + _ => class.push_str(Self::TEXT), + } + class.push_str(suffix); + return class; + } + String::new() + } } diff --git a/extensions/pagetop-bootsier/src/theme/aux/layout.rs b/extensions/pagetop-bootsier/src/theme/aux/layout.rs new file mode 100644 index 00000000..1d351582 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/aux/layout.rs @@ -0,0 +1,104 @@ +use pagetop::prelude::*; + +// **< ScaleSize >********************************************************************************** + +/// Escala discreta de tamaños para definir clases utilitarias. +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] +pub enum ScaleSize { + /// Sin tamaño (no define ninguna clase). + #[default] + None, + /// Tamaño automático. + Auto, + /// Escala cero. + Zero, + /// Escala uno. + One, + /// Escala dos. + Two, + /// Escala tres. + Three, + /// Escala cuatro. + Four, + /// Escala cinco. + Five, +} + +impl ScaleSize { + // Devuelve el sufijo para el tamaño (`"-0"`, `"-1"`, etc.), o `None` si no define ninguna + // clase, o `""` para el tamaño automático. + #[rustfmt::skip] + #[inline] + const fn suffix(self) -> Option<&'static str> { + match self { + Self::None => None, + Self::Auto => Some(""), + Self::Zero => Some("-0"), + Self::One => Some("-1"), + Self::Two => Some("-2"), + Self::Three => Some("-3"), + Self::Four => Some("-4"), + Self::Five => Some("-5"), + } + } + + // Añade el tamaño a la cadena de clases usando el prefijo dado. + #[inline] + pub(crate) fn push_class(self, classes: &mut String, prefix: &str) { + if !prefix.is_empty() { + if let Some(suffix) = self.suffix() { + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(prefix); + classes.push_str(suffix); + } + } + } + + /* Devuelve la clase del tamaño para el prefijo, o una cadena vacía si no aplica (reservado). + // + // # Ejemplo + // + // ```rust + // # use pagetop_bootsier::prelude::*; + // assert_eq!(ScaleSize::Auto.class_with("border"), "border"); + // assert_eq!(ScaleSize::Zero.class_with("m"), "m-0"); + // assert_eq!(ScaleSize::Three.class_with("p"), "p-3"); + // assert_eq!(ScaleSize::None.class_with("border"), ""); + // ``` + #[inline] + pub(crate) fn class_with(self, prefix: &str) -> String { + if !prefix.is_empty() { + if let Some(suffix) = self.suffix() { + let mut class = String::with_capacity(prefix.len() + suffix.len()); + class.push_str(prefix); + class.push_str(suffix); + return class; + } + } + String::new() + } */ +} + +// **< Side >*************************************************************************************** + +/// Lados sobre los que aplicar una clase utilitaria (respetando LTR/RTL). +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] +pub enum Side { + /// Todos los lados. + #[default] + All, + /// Lado superior. + Top, + /// Lado inferior. + Bottom, + /// Lado lógico de inicio (respetando RTL). + Start, + /// Lado lógico de fin (respetando RTL). + End, + /// Lados lógicos laterales (abreviatura *x*). + LeftAndRight, + /// Lados superior e inferior (abreviatura *y*). + TopAndBottom, +} diff --git a/extensions/pagetop-bootsier/src/theme/aux/rounded.rs b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs index 8eac7c53..20e061d6 100644 --- a/extensions/pagetop-bootsier/src/theme/aux/rounded.rs +++ b/extensions/pagetop-bootsier/src/theme/aux/rounded.rs @@ -1,52 +1,117 @@ use pagetop::prelude::*; -use std::fmt; - /// Radio para el redondeo de esquinas ([`classes::Rounded`](crate::theme::classes::Rounded)). -/// -/// Mapea a `rounded`, `rounded-0`, `rounded-{1..5}`, `rounded-circle` y `rounded-pill`. -/// -/// - `None` no añade ninguna clase. -/// - `Default` genera `rounded` (radio por defecto del tema). -/// - `Zero` genera `rounded-0` (sin redondeo). -/// - `Scale{1..5}` genera `rounded-{1..5}` (radio creciente). -/// - `Circle` genera `rounded-circle`. -/// - `Pill` genera `rounded-pill`. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum RoundedRadius { + /// No define ninguna clase. #[default] None, + /// Genera `rounded` (radio por defecto del tema). Default, + /// Genera `rounded-0` (sin redondeo). Zero, + /// Genera `rounded-1`. Scale1, + /// Genera `rounded-2`. Scale2, + /// Genera `rounded-3`. Scale3, + /// Genera `rounded-4`. Scale4, + /// Genera `rounded-5`. Scale5, + /// Genera `rounded-circle`. Circle, + /// Genera `rounded-pill`. Pill, } impl RoundedRadius { + const ROUNDED: &str = "rounded"; + + // Devuelve el sufijo para `*rounded-*`, o `None` si no define ninguna clase, o `""` para el + // redondeo por defecto. #[rustfmt::skip] - pub(crate) fn to_class(&self, prefix: impl AsRef<str>) -> String { + #[inline] + const fn suffix(self) -> Option<&'static str> { match self { - RoundedRadius::None => String::new(), - RoundedRadius::Default => String::from(prefix.as_ref()), - RoundedRadius::Zero => join!(prefix, "-0"), - RoundedRadius::Scale1 => join!(prefix, "-1"), - RoundedRadius::Scale2 => join!(prefix, "-2"), - RoundedRadius::Scale3 => join!(prefix, "-3"), - RoundedRadius::Scale4 => join!(prefix, "-4"), - RoundedRadius::Scale5 => join!(prefix, "-5"), - RoundedRadius::Circle => join!(prefix, "-circle"), - RoundedRadius::Pill => join!(prefix, "-pill"), + Self::None => None, + Self::Default => Some(""), + Self::Zero => Some("-0"), + Self::Scale1 => Some("-1"), + Self::Scale2 => Some("-2"), + Self::Scale3 => Some("-3"), + Self::Scale4 => Some("-4"), + Self::Scale5 => Some("-5"), + Self::Circle => Some("-circle"), + Self::Pill => Some("-pill"), } } -} -impl fmt::Display for RoundedRadius { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.to_class("rounded")) + // Añade el redondeo de esquinas a la cadena de clases usando el prefijo dado (`rounded-top`, + // `rounded-bottom-start`, o vacío para `rounded-*`). + #[inline] + pub(crate) fn push_class(self, classes: &mut String, prefix: &str) { + if let Some(suffix) = self.suffix() { + if !classes.is_empty() { + classes.push(' '); + } + if prefix.is_empty() { + classes.push_str(Self::ROUNDED); + } else { + classes.push_str(prefix); + } + classes.push_str(suffix); + } + } + + // Devuelve la clase para el redondeo de esquinas con el prefijo dado (`rounded-top`, + // `rounded-bottom-start`, o vacío para `rounded-*`). + // + // # Ejemplos + // + // ```rust + // # use pagetop_bootsier::prelude::*; + // assert_eq!(RoundedRadius::Scale2.class_with(""), "rounded-2"); + // assert_eq!(RoundedRadius::Zero.class_with("rounded-top"), "rounded-top-0"); + // assert_eq!(RoundedRadius::Scale3.class_with("rounded-top-end"), "rounded-top-end-3"); + // assert_eq!(RoundedRadius::Circle.class_with(""), "rounded-circle"); + // assert_eq!(RoundedRadius::None.class_with("rounded-bottom-start"), ""); + // ``` + #[inline] + pub(crate) fn class_with(self, prefix: &str) -> String { + if let Some(suffix) = self.suffix() { + let base_len = if prefix.is_empty() { + Self::ROUNDED.len() + } else { + prefix.len() + }; + let mut class = String::with_capacity(base_len + suffix.len()); + if prefix.is_empty() { + class.push_str(Self::ROUNDED); + } else { + class.push_str(prefix); + } + class.push_str(suffix); + return class; + } + String::new() + } + + /// Devuelve la clase `rounded-*` para el redondeo de esquinas. + /// + /// # Ejemplos + /// + /// ```rust + /// # use pagetop_bootsier::prelude::*; + /// assert_eq!(RoundedRadius::Default.to_class(), "rounded"); + /// assert_eq!(RoundedRadius::Zero.to_class(), "rounded-0"); + /// assert_eq!(RoundedRadius::Scale3.to_class(), "rounded-3"); + /// assert_eq!(RoundedRadius::Circle.to_class(), "rounded-circle"); + /// assert_eq!(RoundedRadius::None.to_class(), ""); + /// ``` + #[inline] + pub fn to_class(self) -> String { + self.class_with("") } } diff --git a/extensions/pagetop-bootsier/src/theme/classes.rs b/extensions/pagetop-bootsier/src/theme/classes.rs index 4e586e11..9e6c234d 100644 --- a/extensions/pagetop-bootsier/src/theme/classes.rs +++ b/extensions/pagetop-bootsier/src/theme/classes.rs @@ -8,3 +8,6 @@ pub use border::Border; mod rounded; pub use rounded::Rounded; + +mod layout; +pub use layout::{Margin, Padding}; diff --git a/extensions/pagetop-bootsier/src/theme/classes/border.rs b/extensions/pagetop-bootsier/src/theme/classes/border.rs index f49c75c6..3095498c 100644 --- a/extensions/pagetop-bootsier/src/theme/classes/border.rs +++ b/extensions/pagetop-bootsier/src/theme/classes/border.rs @@ -1,122 +1,113 @@ use pagetop::prelude::*; -use crate::theme::aux::{BorderColor, BorderSize, Opacity}; - -use std::fmt; +use crate::theme::aux::{BorderColor, Opacity, ScaleSize, Side}; /// Clases para crear **bordes**. /// /// Permite: /// +/// - Iniciar un borde sin tamaño inicial (`Border::default()`). +/// - Crear un borde con tamaño por defecto (`Border::new()`). +/// - Ajustar el tamaño de cada **lado lógico** (`side`, respetando LTR/RTL). /// - Definir un tamaño **global** para todo el borde (`size`). -/// - Ajustar el tamaño de cada **lado lógico** (`top`, `end`, `bottom`, `start`, **en este orden**, -/// respetando LTR/RTL). /// - Aplicar un **color** al borde (`BorderColor`). /// - Aplicar un nivel de **opacidad** (`Opacity`). /// /// # Comportamiento aditivo / sustractivo /// -/// - **Aditivo**: basta con crear un borde sin tamaño con `classes::Border::new()` para ir -/// añadiendo cada lado lógico con el tamaño deseado usando `BorderSize::Scale{1..5}`. +/// - **Aditivo**: basta con crear un borde sin tamaño con `classes::Border::default()` para ir +/// añadiendo cada lado lógico con el tamaño deseado usando `ScaleSize::{One..Five}`. /// -/// - **Sustractivo**: se crea un borde con tamaño predefinido, p. ej. utilizando -/// `classes::Border::with(BorderSize::Scale2)` y eliminar los lados deseados con `BorderSize::Zero`. +/// - **Sustractivo**: se crea un borde con tamaño predefinido, p. ej. usando +/// `classes::Border::new()` o `classes::Border::with(ScaleSize::Two)` y eliminar los lados +/// deseados con `ScaleSize::Zero`. /// -/// - **Anchos diferentes por lado**: usando `BorderSize::Scale{1..5}` en cada lado deseado. +/// - **Anchos diferentes por lado**: usando `ScaleSize::{Zero..Five}` en cada lado deseado. /// /// # Ejemplos /// /// **Borde global:** /// ```rust /// # use pagetop_bootsier::prelude::*; -/// let b = classes::Border::with(BorderSize::Scale2); -/// assert_eq!(b.to_string(), "border-2"); +/// let b = classes::Border::with(ScaleSize::Two); +/// assert_eq!(b.to_class(), "border-2"); /// ``` /// /// **Aditivo (solo borde superior):** /// ```rust /// # use pagetop_bootsier::prelude::*; -/// let b = classes::Border::new().with_top(BorderSize::Scale1); -/// assert_eq!(b.to_string(), "border-top-1"); +/// let b = classes::Border::default().with_side(Side::Top, ScaleSize::One); +/// assert_eq!(b.to_class(), "border-top-1"); /// ``` /// /// **Sustractivo (borde global menos el superior):** /// ```rust /// # use pagetop_bootsier::prelude::*; -/// let b = classes::Border::with(BorderSize::Default).with_top(BorderSize::Zero); -/// assert_eq!(b.to_string(), "border border-top-0"); +/// let b = classes::Border::new().with_side(Side::Top, ScaleSize::Zero); +/// assert_eq!(b.to_class(), "border border-top-0"); /// ``` /// /// **Ancho por lado (lado lógico inicial a 2 y final a 4):** /// ```rust /// # use pagetop_bootsier::prelude::*; -/// let b = classes::Border::new().with_start(BorderSize::Scale2).with_end(BorderSize::Scale4); -/// assert_eq!(b.to_string(), "border-end-4 border-start-2"); +/// let b = classes::Border::default() +/// .with_side(Side::Start, ScaleSize::Two) +/// .with_side(Side::End, ScaleSize::Four); +/// assert_eq!(b.to_class(), "border-end-4 border-start-2"); /// ``` /// /// **Combinado (ejemplo completo):** /// ```rust /// # use pagetop_bootsier::prelude::*; -/// let b = classes::Border::with(BorderSize::Default) // Borde global por defecto. -/// .with_top(BorderSize::Zero) // Quita borde superior. -/// .with_end(BorderSize::Scale3) // Ancho 3 para el lado lógico final. +/// let b = classes::Border::new() // Borde por defecto. +/// .with_side(Side::Top, ScaleSize::Zero) // Quita borde superior. +/// .with_side(Side::End, ScaleSize::Three) // Ancho 3 para el lado lógico final. /// .with_color(BorderColor::Theme(Color::Primary)) /// .with_opacity(Opacity::Half); /// -/// assert_eq!(b.to_string(), "border border-top-0 border-end-3 border-primary border-opacity-50"); +/// assert_eq!(b.to_class(), "border border-top-0 border-end-3 border-primary border-opacity-50"); /// ``` #[rustfmt::skip] -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub struct Border { - size : BorderSize, - top : BorderSize, - end : BorderSize, - bottom : BorderSize, - start : BorderSize, + all : ScaleSize, + top : ScaleSize, + end : ScaleSize, + bottom : ScaleSize, + start : ScaleSize, color : BorderColor, opacity: Opacity, } impl Border { - /// Prepara un borde **sin tamaño global** de partida. + /// Prepara un borde del tamaño predefinido. Equivale a `border` (ancho por defecto del tema). pub fn new() -> Self { - Self::default() + Self::with(ScaleSize::Auto) } - /// Crea un borde **con tamaño global** (`size`). - pub fn with(size: BorderSize) -> Self { - Self::default().with_size(size) + /// Crea un borde **con un tamaño global** (`size`). + pub fn with(size: ScaleSize) -> Self { + Self::default().with_side(Side::All, size) } // **< Border BUILDER >************************************************************************* - /// Establece el tamaño global del borde (`border*`). - pub fn with_size(mut self, size: BorderSize) -> Self { - self.size = size; - self - } - - /// Establece el tamaño del borde superior (`border-top-*`). - pub fn with_top(mut self, size: BorderSize) -> Self { - self.top = size; - self - } - - /// Establece el tamaño del borde en el lado lógico final (`border-end-*`). Respeta LTR/RTL. - pub fn with_end(mut self, size: BorderSize) -> Self { - self.end = size; - self - } - - /// Establece el tamaño del borde inferior (`border-bottom-*`). - pub fn with_bottom(mut self, size: BorderSize) -> Self { - self.bottom = size; - self - } - - /// Establece el tamaño del borde en el lado lógico inicial (`border-start-*`). Respeta LTR/RTL. - pub fn with_start(mut self, size: BorderSize) -> Self { - self.start = size; + pub fn with_side(mut self, side: Side, size: ScaleSize) -> Self { + match side { + Side::All => self.all = size, + Side::Top => self.top = size, + Side::Bottom => self.bottom = size, + Side::Start => self.start = size, + Side::End => self.end = size, + Side::LeftAndRight => { + self.start = size; + self.end = size; + } + Side::TopAndBottom => { + self.top = size; + self.bottom = size; + } + }; self } @@ -131,25 +122,54 @@ impl Border { self.opacity = opacity; self } -} -impl fmt::Display for Border { - /// Concatena, en este orden, las clases para *global*, `top`, `end`, `bottom`, `start`, *color* - /// y *opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{}", - [ - self.size.to_string(), - self.top.to_class("border-top"), - self.end.to_class("border-end"), - self.bottom.to_class("border-bottom"), - self.start.to_class("border-start"), - self.color.to_string(), - self.opacity.to_class("border"), - ] - .join_classes() - ) + // **< Border HELPERS >************************************************************************* + + /// Añade las clases de borde a la cadena de clases. + /// + /// Concatena, en este orden, las clases para *global*, `top`, `end`, `bottom`, `start`, + /// *color* y *opacidad*; respetando LTR/RTL y omitiendo las definiciones vacías. + #[rustfmt::skip] + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + self.all .push_class(classes, "border"); + self.top .push_class(classes, "border-top"); + self.end .push_class(classes, "border-end"); + self.bottom .push_class(classes, "border-bottom"); + self.start .push_class(classes, "border-start"); + self.color .push_class(classes); + self.opacity.push_class(classes, "border"); + } + + /// Devuelve las clases de borde como cadena (`"border-2"`, + /// `"border border-top-0 border-end-3 border-primary border-opacity-50"`, etc.). + /// + /// Si no se define ningún tamaño, color ni opacidad, devuelve `""`. + #[inline] + pub fn to_class(self) -> String { + let mut classes = String::new(); + self.push_class(&mut classes); + classes + } +} + +/// Atajo para crear un [`classes::Border`](crate::theme::classes::Border) a partir de un tamaño +/// [`ScaleSize`] aplicado a todo el borde. +/// +/// # Ejemplos +/// +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// // Convertir explícitamente con `From::from`: +/// let b = classes::Border::from(ScaleSize::Two); +/// assert_eq!(b.to_class(), "border-2"); +/// +/// // Convertir implícitamente con `into()`: +/// let b: classes::Border = ScaleSize::Auto.into(); +/// assert_eq!(b.to_class(), "border"); +/// ``` +impl From<ScaleSize> for Border { + fn from(size: ScaleSize) -> Self { + Self::with(size) } } diff --git a/extensions/pagetop-bootsier/src/theme/classes/color.rs b/extensions/pagetop-bootsier/src/theme/classes/color.rs index 6579d21c..162b7849 100644 --- a/extensions/pagetop-bootsier/src/theme/classes/color.rs +++ b/extensions/pagetop-bootsier/src/theme/classes/color.rs @@ -2,9 +2,7 @@ use pagetop::prelude::*; use crate::theme::aux::{ColorBg, ColorText, Opacity}; -use std::fmt; - -// **< Bg >***************************************************************************************** +// **< Background >********************************************************************************* /// Clases para establecer **color/opacidad del fondo**. /// @@ -14,28 +12,27 @@ use std::fmt; /// # use pagetop_bootsier::prelude::*; /// // Sin clases. /// let s = classes::Background::new(); -/// assert_eq!(s.to_string(), ""); +/// assert_eq!(s.to_class(), ""); /// /// // Sólo color de fondo. /// let s = classes::Background::with(ColorBg::Theme(Color::Primary)); -/// assert_eq!(s.to_string(), "bg-primary"); +/// assert_eq!(s.to_class(), "bg-primary"); /// /// // Color más opacidad. /// let s = classes::Background::with(ColorBg::BodySecondary).with_opacity(Opacity::Half); -/// assert_eq!(s.to_string(), "bg-body-secondary bg-opacity-50"); +/// assert_eq!(s.to_class(), "bg-body-secondary bg-opacity-50"); /// /// // Usando `From<ColorBg>`. /// let s: classes::Background = ColorBg::Black.into(); -/// assert_eq!(s.to_string(), "bg-black"); +/// assert_eq!(s.to_class(), "bg-black"); /// /// // Usando `From<(ColorBg, Opacity)>`. /// let s: classes::Background = (ColorBg::White, Opacity::SemiTransparent).into(); -/// assert_eq!(s.to_string(), "bg-white bg-opacity-25"); +/// assert_eq!(s.to_class(), "bg-white bg-opacity-25"); /// ``` -#[rustfmt::skip] -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub struct Background { - color : ColorBg, + color: ColorBg, opacity: Opacity, } @@ -50,7 +47,7 @@ impl Background { Self::default().with_color(color) } - // **< Bg BUILDER >***************************************************************************** + // **< Background BUILDER >********************************************************************* /// Establece el color de fondo (`bg-*`). pub fn with_color(mut self, color: ColorBg) -> Self { @@ -63,14 +60,27 @@ impl Background { self.opacity = opacity; self } -} -impl fmt::Display for Background { - /// Concatena, en este orden, color del fondo (`bg-*`) y opacidad (`bg-opacity-*`), omitiendo - /// las definiciones vacías. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let classes = [self.color.to_string(), self.opacity.to_class("bg")].join_classes(); - write!(f, "{classes}") + // **< Background HELPERS >********************************************************************* + + /// Añade las clases de fondo a la cadena de clases. + /// + /// Concatena, en este orden, color del fondo (`bg-*`) y opacidad (`bg-opacity-*`), + /// omitiendo los fragmentos vacíos. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + self.color.push_class(classes); + self.opacity.push_class(classes, "bg"); + } + + /// Devuelve las clases de fondo como cadena (`"bg-primary"`, `"bg-body-secondary bg-opacity-50"`, etc.). + /// + /// Si no se define ni color ni opacidad, devuelve `""`. + #[inline] + pub fn to_class(self) -> String { + let mut classes = String::new(); + self.push_class(&mut classes); + classes } } @@ -83,7 +93,7 @@ impl From<(ColorBg, Opacity)> for Background { /// ``` /// # use pagetop_bootsier::prelude::*; /// let s: classes::Background = (ColorBg::White, Opacity::SemiTransparent).into(); - /// assert_eq!(s.to_string(), "bg-white bg-opacity-25"); + /// assert_eq!(s.to_class(), "bg-white bg-opacity-25"); /// ``` fn from((color, opacity): (ColorBg, Opacity)) -> Self { Background::with(color).with_opacity(opacity) @@ -98,7 +108,7 @@ impl From<ColorBg> for Background { /// ``` /// # use pagetop_bootsier::prelude::*; /// let s: classes::Background = ColorBg::Black.into(); - /// assert_eq!(s.to_string(), "bg-black"); + /// assert_eq!(s.to_class(), "bg-black"); /// ``` fn from(color: ColorBg) -> Self { Background::with(color) @@ -115,28 +125,27 @@ impl From<ColorBg> for Background { /// # use pagetop_bootsier::prelude::*; /// // Sin clases. /// let s = classes::Text::new(); -/// assert_eq!(s.to_string(), ""); +/// assert_eq!(s.to_class(), ""); /// /// // Sólo color del texto. /// let s = classes::Text::with(ColorText::Theme(Color::Primary)); -/// assert_eq!(s.to_string(), "text-primary"); +/// assert_eq!(s.to_class(), "text-primary"); /// /// // Color del texto y opacidad. /// let s = classes::Text::new().with_color(ColorText::White).with_opacity(Opacity::SemiTransparent); -/// assert_eq!(s.to_string(), "text-white text-opacity-25"); +/// assert_eq!(s.to_class(), "text-white text-opacity-25"); /// /// // Usando `From<ColorText>`. /// let s: classes::Text = ColorText::Black.into(); -/// assert_eq!(s.to_string(), "text-black"); +/// assert_eq!(s.to_class(), "text-black"); /// /// // Usando `From<(ColorText, Opacity)>`. /// let s: classes::Text = (ColorText::Theme(Color::Danger), Opacity::Opaque).into(); -/// assert_eq!(s.to_string(), "text-danger text-opacity-100"); +/// assert_eq!(s.to_class(), "text-danger text-opacity-100"); /// ``` -#[rustfmt::skip] -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub struct Text { - color : ColorText, + color: ColorText, opacity: Opacity, } @@ -164,13 +173,27 @@ impl Text { self.opacity = opacity; self } -} -impl fmt::Display for Text { - /// Concatena, en este orden, `text-*` y `text-opacity-*`, omitiendo las definiciones vacías. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let classes = [self.color.to_string(), self.opacity.to_class("text")].join_classes(); - write!(f, "{classes}") + // **< Text HELPERS >*************************************************************************** + + /// Añade las clases de texto a la cadena de clases. + /// + /// Concatena, en este orden, `text-*` y `text-opacity-*`, omitiendo los fragmentos vacíos. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + self.color.push_class(classes); + self.opacity.push_class(classes, "text"); + } + + /// Devuelve las clases de texto como cadena (`"text-primary"`, `"text-white text-opacity-25"`, + /// etc.). + /// + /// Si no se define ni color ni opacidad, devuelve `""`. + #[inline] + pub fn to_class(self) -> String { + let mut classes = String::new(); + self.push_class(&mut classes); + classes } } @@ -183,7 +206,7 @@ impl From<(ColorText, Opacity)> for Text { /// ``` /// # use pagetop_bootsier::prelude::*; /// let s: classes::Text = (ColorText::Theme(Color::Danger), Opacity::Opaque).into(); - /// assert_eq!(s.to_string(), "text-danger text-opacity-100"); + /// assert_eq!(s.to_class(), "text-danger text-opacity-100"); /// ``` fn from((color, opacity): (ColorText, Opacity)) -> Self { Text::with(color).with_opacity(opacity) @@ -199,7 +222,7 @@ impl From<ColorText> for Text { /// ``` /// # use pagetop_bootsier::prelude::*; /// let s: classes::Text = ColorText::Black.into(); - /// assert_eq!(s.to_string(), "text-black"); + /// assert_eq!(s.to_class(), "text-black"); /// ``` fn from(color: ColorText) -> Self { Text::with(color) diff --git a/extensions/pagetop-bootsier/src/theme/classes/layout.rs b/extensions/pagetop-bootsier/src/theme/classes/layout.rs new file mode 100644 index 00000000..e9d7e248 --- /dev/null +++ b/extensions/pagetop-bootsier/src/theme/classes/layout.rs @@ -0,0 +1,205 @@ +use pagetop::prelude::*; + +use crate::theme::aux::{ScaleSize, Side}; +use crate::theme::BreakPoint; + +// **< Margin >************************************************************************************* + +/// Clases para establecer **margin** por lado, tamaño y punto de ruptura. +/// +/// # Ejemplos +/// +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let m = classes::Margin::with(Side::Top, ScaleSize::Three); +/// assert_eq!(m.to_class(), "mt-3"); +/// +/// let m = classes::Margin::with(Side::Start, ScaleSize::Auto).with_breakpoint(BreakPoint::LG); +/// assert_eq!(m.to_class(), "ms-lg-auto"); +/// +/// let m = classes::Margin::with(Side::All, ScaleSize::None); +/// assert_eq!(m.to_class(), ""); +/// ``` +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] +pub struct Margin { + side: Side, + size: ScaleSize, + breakpoint: BreakPoint, +} + +impl Margin { + /// Crea un **margin** indicando lado(s) y tamaño. Por defecto no se aplica a ningún punto de + /// ruptura. + pub fn with(side: Side, size: ScaleSize) -> Self { + Margin { + side, + size, + breakpoint: BreakPoint::None, + } + } + + // **< Margin BUILDER >************************************************************************* + + /// Establece el punto de ruptura a partir del cual se empieza a aplicar el **margin**. + pub fn with_breakpoint(mut self, breakpoint: BreakPoint) -> Self { + self.breakpoint = breakpoint; + self + } + + // **< Margin HELPERS >************************************************************************* + + // Devuelve el prefijo `m*` según el lado. + #[rustfmt::skip] + #[inline] + const fn side_prefix(&self) -> &'static str { + match self.side { + Side::All => "m", + Side::Top => "mt", + Side::Bottom => "mb", + Side::Start => "ms", + Side::End => "me", + Side::LeftAndRight => "mx", + Side::TopAndBottom => "my", + } + } + + // Devuelve el sufijo del tamaño (`auto`, `0`..`5`), o `None` si no define clase. + #[rustfmt::skip] + #[inline] + const fn size_suffix(&self) -> Option<&'static str> { + match self.size { + ScaleSize::None => None, + ScaleSize::Auto => Some("auto"), + ScaleSize::Zero => Some("0"), + ScaleSize::One => Some("1"), + ScaleSize::Two => Some("2"), + ScaleSize::Three => Some("3"), + ScaleSize::Four => Some("4"), + ScaleSize::Five => Some("5"), + } + } + + /* Añade la clase de **margin** a la cadena de clases (reservado). + // + // No añade nada si `size` es `ScaleSize::None`. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + let Some(size) = self.size_suffix() else { + return; + }; + self.breakpoint + .push_class(classes, self.side_prefix(), size); + } */ + + /// Devuelve la clase de **margin** como cadena (`"mt-3"`, `"ms-lg-auto"`, etc.). + /// + /// Si `size` es `ScaleSize::None`, devuelve `""`. + #[inline] + pub fn to_class(self) -> String { + let Some(size) = self.size_suffix() else { + return String::new(); + }; + self.breakpoint.class_with(self.side_prefix(), size) + } +} + +// **< Padding >************************************************************************************ + +/// Clases para establecer **padding** por lado, tamaño y punto de ruptura. +/// +/// # Ejemplos +/// +/// ```rust +/// # use pagetop_bootsier::prelude::*; +/// let p = classes::Padding::with(Side::LeftAndRight, ScaleSize::Two); +/// assert_eq!(p.to_class(), "px-2"); +/// +/// let p = classes::Padding::with(Side::End, ScaleSize::Four).with_breakpoint(BreakPoint::SM); +/// assert_eq!(p.to_class(), "pe-sm-4"); +/// +/// let p = classes::Padding::with(Side::All, ScaleSize::Auto); +/// assert_eq!(p.to_class(), ""); // `Auto` no aplica a padding. +/// ``` +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] +pub struct Padding { + side: Side, + size: ScaleSize, + breakpoint: BreakPoint, +} + +impl Padding { + /// Crea un **padding** indicando lado(s) y tamaño. Por defecto no se aplica a ningún punto de + /// ruptura. + pub fn with(side: Side, size: ScaleSize) -> Self { + Padding { + side, + size, + breakpoint: BreakPoint::None, + } + } + + // **< Padding BUILDER >************************************************************************ + + /// Establece el punto de ruptura a partir del cual se empieza a aplicar el **padding**. + pub fn with_breakpoint(mut self, breakpoint: BreakPoint) -> Self { + self.breakpoint = breakpoint; + self + } + + // **< Padding HELPERS >************************************************************************ + + // Devuelve el prefijo `p*` según el lado. + #[rustfmt::skip] + #[inline] + const fn prefix(&self) -> &'static str { + match self.side { + Side::All => "p", + Side::Top => "pt", + Side::Bottom => "pb", + Side::Start => "ps", + Side::End => "pe", + Side::LeftAndRight => "px", + Side::TopAndBottom => "py", + } + } + + // Devuelve el sufijo del tamaño (`0`..`5`), o `None` si no define clase. + // + // Nota: `ScaleSize::Auto` **no aplica** a padding ⇒ devuelve `None`. + #[rustfmt::skip] + #[inline] + const fn suffix(&self) -> Option<&'static str> { + match self.size { + ScaleSize::None => None, + ScaleSize::Auto => None, + ScaleSize::Zero => Some("0"), + ScaleSize::One => Some("1"), + ScaleSize::Two => Some("2"), + ScaleSize::Three => Some("3"), + ScaleSize::Four => Some("4"), + ScaleSize::Five => Some("5"), + } + } + + /* Añade la clase de **padding** a la cadena de clases (reservado). + // + // No añade nada si `size` es `ScaleSize::None` o `ScaleSize::Auto`. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + let Some(size) = self.suffix() else { + return; + }; + self.breakpoint.push_class(classes, self.prefix(), size); + } */ + + // Devuelve la clase de **padding** como cadena (`"px-2"`, `"pe-sm-4"`, etc.). + // + // Si `size` es `ScaleSize::None` o `ScaleSize::Auto`, devuelve `""`. + #[inline] + pub fn to_class(self) -> String { + let Some(size) = self.suffix() else { + return String::new(); + }; + self.breakpoint.class_with(self.prefix(), size) + } +} diff --git a/extensions/pagetop-bootsier/src/theme/classes/rounded.rs b/extensions/pagetop-bootsier/src/theme/classes/rounded.rs index b7510c14..58d50b86 100644 --- a/extensions/pagetop-bootsier/src/theme/classes/rounded.rs +++ b/extensions/pagetop-bootsier/src/theme/classes/rounded.rs @@ -2,8 +2,6 @@ use pagetop::prelude::*; use crate::theme::aux::RoundedRadius; -use std::fmt; - /// Clases para definir **esquinas redondeadas**. /// /// Permite: @@ -20,28 +18,28 @@ use std::fmt; /// ```rust /// # use pagetop_bootsier::prelude::*; /// let r = classes::Rounded::with(RoundedRadius::Default); -/// assert_eq!(r.to_string(), "rounded"); +/// assert_eq!(r.to_class(), "rounded"); /// ``` /// /// **Sin redondeo:** /// ```rust /// # use pagetop_bootsier::prelude::*; /// let r = classes::Rounded::new(); -/// assert_eq!(r.to_string(), ""); +/// assert_eq!(r.to_class(), ""); /// ``` /// /// **Radio en las esquinas de un lado lógico:** /// ```rust /// # use pagetop_bootsier::prelude::*; /// let r = classes::Rounded::new().with_end(RoundedRadius::Scale2); -/// assert_eq!(r.to_string(), "rounded-end-2"); +/// assert_eq!(r.to_class(), "rounded-end-2"); /// ``` /// /// **Radio en una esquina concreta:** /// ```rust /// # use pagetop_bootsier::prelude::*; /// let r = classes::Rounded::new().with_top_start(RoundedRadius::Scale3); -/// assert_eq!(r.to_string(), "rounded-top-start-3"); +/// assert_eq!(r.to_class(), "rounded-top-start-3"); /// ``` /// /// **Combinado (ejemplo completo):** @@ -52,10 +50,10 @@ use std::fmt; /// .with_bottom_start(RoundedRadius::Scale4) // Añade una esquina redondeada concreta. /// .with_bottom_end(RoundedRadius::Circle); // Añade redondeo extremo en otra esquina. /// -/// assert_eq!(r.to_string(), "rounded-top rounded-bottom-start-4 rounded-bottom-end-circle"); +/// assert_eq!(r.to_class(), "rounded-top rounded-bottom-start-4 rounded-bottom-end-circle"); /// ``` #[rustfmt::skip] -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub struct Rounded { radius : RoundedRadius, top : RoundedRadius, @@ -136,28 +134,36 @@ impl Rounded { self.bottom_end = radius; self } -} -impl fmt::Display for Rounded { + // **< Rounded HELPERS >************************************************************************ + + /// Añade las clases de redondeo a la cadena de clases. + /// /// Concatena, en este orden, las clases para *global*, `top`, `end`, `bottom`, `start`, /// `top-start`, `top-end`, `bottom-start` y `bottom-end`; respetando LTR/RTL y omitiendo las /// definiciones vacías. - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{}", - [ - self.radius.to_string(), - self.top.to_class("rounded-top"), - self.end.to_class("rounded-end"), - self.bottom.to_class("rounded-bottom"), - self.start.to_class("rounded-start"), - self.top_start.to_class("rounded-top-start"), - self.top_end.to_class("rounded-top-end"), - self.bottom_start.to_class("rounded-bottom-start"), - self.bottom_end.to_class("rounded-bottom-end"), - ] - .join_classes() - ) + #[rustfmt::skip] + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + self.radius .push_class(classes, ""); + self.top .push_class(classes, "rounded-top"); + self.end .push_class(classes, "rounded-end"); + self.bottom .push_class(classes, "rounded-bottom"); + self.start .push_class(classes, "rounded-start"); + self.top_start .push_class(classes, "rounded-top-start"); + self.top_end .push_class(classes, "rounded-top-end"); + self.bottom_start.push_class(classes, "rounded-bottom-start"); + self.bottom_end .push_class(classes, "rounded-bottom-end"); + } + + /// Devuelve las clases de redondeo como cadena (`"rounded"`, + /// `"rounded-top rounded-bottom-start-4 rounded-bottom-end-circle"`, etc.). + /// + /// Si no se define ningún radio, devuelve `""`. + #[inline] + pub fn to_class(self) -> String { + let mut classes = String::new(); + self.push_class(&mut classes); + classes } } diff --git a/extensions/pagetop-bootsier/src/theme/container/component.rs b/extensions/pagetop-bootsier/src/theme/container/component.rs index 1bcf1006..068d24a3 100644 --- a/extensions/pagetop-bootsier/src/theme/container/component.rs +++ b/extensions/pagetop-bootsier/src/theme/container/component.rs @@ -26,20 +26,7 @@ impl Component for Container { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - [join_pair!( - "container", - "-", - match self.width() { - container::Width::Default => String::new(), - container::Width::From(bp) => bp.to_string(), - container::Width::Fluid => "fluid".to_string(), - container::Width::FluidMax(_) => "fluid".to_string(), - } - )] - .join_classes(), - ); + self.alter_classes(ClassesOp::Prepend, self.width().to_class()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { diff --git a/extensions/pagetop-bootsier/src/theme/container/props.rs b/extensions/pagetop-bootsier/src/theme/container/props.rs index 796e32f4..2010ba8e 100644 --- a/extensions/pagetop-bootsier/src/theme/container/props.rs +++ b/extensions/pagetop-bootsier/src/theme/container/props.rs @@ -1,14 +1,14 @@ use pagetop::prelude::*; -use crate::prelude::*; +use crate::theme::aux::BreakPoint; // **< Kind >*************************************************************************************** -/// Tipo de contenedor ([`Container`]). +/// Tipo de contenedor ([`Container`](crate::theme::Container)). /// /// Permite aplicar la etiqueta HTML apropiada (`<main>`, `<header>`, etc.) manteniendo una API /// común a todos los contenedores. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Kind { /// Contenedor genérico (`<div>`). #[default] @@ -27,8 +27,8 @@ pub enum Kind { // **< Width >************************************************************************************** -/// Define el comportamiento para ajustar el ancho de un contenedor ([`Container`]). -#[derive(AutoDefault)] +/// Define cómo se comporta el ancho de un contenedor ([`Container`](crate::theme::Container)). +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Width { /// Comportamiento por defecto, aplica los anchos máximos predefinidos para cada punto de /// ruptura. Por debajo del menor punto de ruptura ocupa el 100% del ancho disponible. @@ -42,3 +42,31 @@ pub enum Width { /// Ocupa el 100% del ancho disponible hasta un ancho máximo explícito. FluidMax(UnitValue), } + +impl Width { + const CONTAINER: &str = "container"; + + /* Añade el comportamiento del contenedor a la cadena de clases según ancho (reservado). + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + match self { + Self::Default => BreakPoint::None.push_class(classes, Self::CONTAINER, ""), + Self::From(bp) => bp.push_class(classes, Self::CONTAINER, ""), + Self::Fluid | Self::FluidMax(_) => { + BreakPoint::None.push_class(classes, Self::CONTAINER, "fluid") + } + } + } */ + + /// Devuelve la clase asociada al comportamiento del contenedor según el ajuste de su ancho. + #[inline] + pub fn to_class(self) -> String { + match self { + Self::Default => BreakPoint::None.class_with(Self::CONTAINER, ""), + Self::From(bp) => bp.class_with(Self::CONTAINER, ""), + Self::Fluid | Self::FluidMax(_) => { + BreakPoint::None.class_with(Self::CONTAINER, "fluid") + } + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index 450edff2..5d27daf5 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -45,21 +45,11 @@ impl Component for Dropdown { self.id.get() } - #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - let g = self.button_grouped(); - self.alter_classes(ClassesOp::Prepend, [ - if g { "btn-group" } else { "" }, - match self.direction() { - dropdown::Direction::Default if g => "", - dropdown::Direction::Default => "dropdown", - dropdown::Direction::Centered => "dropdown-center", - dropdown::Direction::Dropup => "dropup", - dropdown::Direction::DropupCentered => "dropup-center", - dropdown::Direction::Dropend => "dropend", - dropdown::Direction::Dropstart => "dropstart", - } - ].join_classes()); + self.alter_classes( + ClassesOp::Prepend, + self.direction().class_with(self.button_grouped()), + ); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -75,41 +65,21 @@ impl Component for Dropdown { PrepareMarkup::With(html! { div id=[self.id()] class=[self.classes().get()] { @if !title.is_empty() { - @let mut btn_classes = AttrClasses::new([ - "btn", - &self.button_size().to_string(), - &self.button_color().to_string(), - ].join_classes()); - @let (offset, reference) = match self.menu_position() { - dropdown::MenuPosition::Default => (None, None), - dropdown::MenuPosition::Offset(x, y) => (Some(format!("{x},{y}")), None), - dropdown::MenuPosition::Parent => (None, Some("parent")), - }; - @let auto_close = match self.auto_close { - dropdown::AutoClose::Default => None, - dropdown::AutoClose::ClickableInside => Some("inside"), - dropdown::AutoClose::ClickableOutside => Some("outside"), - dropdown::AutoClose::ManualClose => Some("false"), - }; - @let menu_classes = AttrClasses::new("dropdown-menu") - .with_value(ClassesOp::Add, match self.menu_align() { - dropdown::MenuAlign::Start => String::new(), - dropdown::MenuAlign::StartAt(bp) => bp.try_class("dropdown-menu") - .map_or(String::new(), |class| join!(class, "-start")), - dropdown::MenuAlign::StartAndEnd(bp) => bp.try_class("dropdown-menu") - .map_or( - "dropdown-menu-start".into(), - |class| join!("dropdown-menu-start ", class, "-end") - ), - dropdown::MenuAlign::End => "dropdown-menu-end".into(), - dropdown::MenuAlign::EndAt(bp) => bp.try_class("dropdown-menu") - .map_or(String::new(), |class| join!(class, "-end")), - dropdown::MenuAlign::EndAndStart(bp) => bp.try_class("dropdown-menu") - .map_or( - "dropdown-menu-end".into(), - |class| join!("dropdown-menu-end ", class, "-start") - ), - }); + @let mut btn_classes = AttrClasses::new({ + let mut classes = "btn".to_string(); + self.button_size().push_class(&mut classes); + self.button_color().push_class(&mut classes); + classes + }); + @let pos = self.menu_position(); + @let offset = pos.data_offset(); + @let reference = pos.data_reference(); + @let auto_close = self.auto_close.as_str(); + @let menu_classes = AttrClasses::new({ + let mut classes = "dropdown-menu".to_string(); + self.menu_align().push_class(&mut classes); + classes + }); // Renderizado en modo split (dos botones) o simple (un botón). @if self.button_split() { diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs index a13058dd..2f62f286 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs @@ -115,7 +115,7 @@ impl Component for Item { } ItemKind::Button { label, disabled } => { - let mut classes = "dropdown-item".to_owned(); + let mut classes = "dropdown-item".to_string(); if *disabled { classes.push_str(" disabled"); } diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/props.rs b/extensions/pagetop-bootsier/src/theme/dropdown/props.rs index da305ea7..7571332b 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/props.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/props.rs @@ -7,7 +7,7 @@ use crate::prelude::*; /// Estrategia para el cierre automático de un menú [`Dropdown`]. /// /// Define cuándo se cierra el menú desplegado según la interacción del usuario. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum AutoClose { /// Comportamiento por defecto, se cierra con clics dentro y fuera del menú, o pulsando `Esc`. #[default] @@ -21,12 +21,26 @@ pub enum AutoClose { ManualClose, } +impl AutoClose { + // Devuelve el valor para `data-bs-auto-close`, o `None` si es el comportamiento por defecto. + #[rustfmt::skip] + #[inline] + pub(crate) const fn as_str(self) -> Option<&'static str> { + match self { + Self::Default => None, + Self::ClickableInside => Some("inside"), + Self::ClickableOutside => Some("outside"), + Self::ManualClose => Some("false"), + } + } +} + // **< Direction >********************************************************************************** /// Dirección de despliegue de un menú [`Dropdown`]. /// /// Controla desde qué posición se muestra el menú respecto al botón. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Direction { /// Comportamiento por defecto (despliega el menú hacia abajo desde la posición inicial, /// respetando LTR/RTL). @@ -44,13 +58,58 @@ pub enum Direction { Dropstart, } +impl Direction { + // Mapea la dirección teniendo en cuenta si se agrupa con otros menús [`Dropdown`]. + #[rustfmt::skip ] + #[inline] + const fn as_str(self, grouped: bool) -> &'static str { + match self { + Self::Default if grouped => "", + Self::Default => "dropdown", + Self::Centered => "dropdown-center", + Self::Dropup => "dropup", + Self::DropupCentered => "dropup-center", + Self::Dropend => "dropend", + Self::Dropstart => "dropstart", + } + } + + // Añade la dirección de despliegue a la cadena de clases teniendo en cuenta si se agrupa con + // otros menús [`Dropdown`]. + #[inline] + pub(crate) fn push_class(self, classes: &mut String, grouped: bool) { + if grouped { + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str("btn-group"); + } + let class = self.as_str(grouped); + if !class.is_empty() { + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(class); + } + } + + // Devuelve la clase asociada a la dirección teniendo en cuenta si se agrupa con otros menús + // [`Dropdown`], o `""` si no corresponde ninguna. + #[inline] + pub(crate) fn class_with(self, grouped: bool) -> String { + let mut classes = String::new(); + self.push_class(&mut classes, grouped); + classes + } +} + // **< MenuAlign >********************************************************************************** /// Alineación horizontal del menú desplegable [`Dropdown`]. /// /// Permite alinear el menú al inicio o al final del botón (respetando LTR/RTL) y añadirle una /// alineación diferente a partir de un punto de ruptura ([`BreakPoint`]). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum MenuAlign { /// Alineación al inicio (comportamiento por defecto). #[default] @@ -67,13 +126,74 @@ pub enum MenuAlign { EndAndStart(BreakPoint), } +impl MenuAlign { + #[inline] + fn push_one(classes: &mut String, class: &str) { + if class.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(class); + } + + // Añade las clases de alineación a `classes` (sin incluir la base `dropdown-menu`). + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + match self { + // Alineación por defecto (start), no añade clases extra. + Self::Start => {} + + // `dropdown-menu-{bp}-start` + Self::StartAt(bp) => { + let class = bp.class_with("dropdown-menu", "start"); + Self::push_one(classes, &class); + } + + // `dropdown-menu-start` + `dropdown-menu-{bp}-end` + Self::StartAndEnd(bp) => { + Self::push_one(classes, "dropdown-menu-start"); + let bp_class = bp.class_with("dropdown-menu", "end"); + Self::push_one(classes, &bp_class); + } + + // `dropdown-menu-end` + Self::End => { + Self::push_one(classes, "dropdown-menu-end"); + } + + // `dropdown-menu-{bp}-end` + Self::EndAt(bp) => { + let class = bp.class_with("dropdown-menu", "end"); + Self::push_one(classes, &class); + } + + // `dropdown-menu-end` + `dropdown-menu-{bp}-start` + Self::EndAndStart(bp) => { + Self::push_one(classes, "dropdown-menu-end"); + let bp_class = bp.class_with("dropdown-menu", "start"); + Self::push_one(classes, &bp_class); + } + } + } + + /* Devuelve las clases de alineación sin incluir `dropdown-menu` (reservado). + #[inline] + pub(crate) fn to_class(self) -> String { + let mut classes = String::new(); + self.push_class(&mut classes); + classes + } */ +} + // **< MenuPosition >******************************************************************************* /// Posición relativa del menú desplegable [`Dropdown`]. /// /// Permite indicar un desplazamiento (*offset*) manual o referenciar al elemento padre para el /// cálculo de la posición. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum MenuPosition { /// Posicionamiento automático por defecto. #[default] @@ -84,3 +204,23 @@ pub enum MenuPosition { /// [`button_split()`](crate::theme::Dropdown::button_split) es `true`. Parent, } + +impl MenuPosition { + // Devuelve el valor para `data-bs-offset` o `None` si no aplica. + #[inline] + pub(crate) fn data_offset(self) -> Option<String> { + match self { + Self::Offset(x, y) => Some(format!("{x},{y}")), + _ => None, + } + } + + // Devuelve el valor para `data-bs-reference` o `None` si no aplica. + #[inline] + pub(crate) fn data_reference(self) -> Option<&'static str> { + match self { + Self::Parent => Some("parent"), + _ => None, + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/image/component.rs b/extensions/pagetop-bootsier/src/theme/image/component.rs index 2eda4302..bc3f2c9d 100644 --- a/extensions/pagetop-bootsier/src/theme/image/component.rs +++ b/extensions/pagetop-bootsier/src/theme/image/component.rs @@ -29,38 +29,11 @@ impl Component for Image { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - match self.source() { - image::Source::Logo(_) => "img-fluid", - image::Source::Responsive(_) => "img-fluid", - image::Source::Thumbnail(_) => "img-thumbnail", - image::Source::Plain(_) => "", - }, - ); + self.alter_classes(ClassesOp::Prepend, self.source().to_class()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { - let dimensions = match self.size() { - image::Size::Auto => None, - image::Size::Dimensions(w, h) => { - let w = w.to_string(); - let h = h.to_string(); - Some(join!("width: ", w, "; height: ", h, ";")) - } - image::Size::Width(w) => { - let w = w.to_string(); - Some(join!("width: ", w, ";")) - } - image::Size::Height(h) => { - let h = h.to_string(); - Some(join!("height: ", h, ";")) - } - image::Size::Both(v) => { - let v = v.to_string(); - Some(join!("width: ", v, "; height: ", v, ";")) - } - }; + let dimensions = self.size().to_style(); let alt_text = self.alternative().lookup(cx).unwrap_or_default(); let is_decorative = alt_text.is_empty(); let source = match self.source() { diff --git a/extensions/pagetop-bootsier/src/theme/image/props.rs b/extensions/pagetop-bootsier/src/theme/image/props.rs index f871de70..e9b1286a 100644 --- a/extensions/pagetop-bootsier/src/theme/image/props.rs +++ b/extensions/pagetop-bootsier/src/theme/image/props.rs @@ -3,7 +3,7 @@ use pagetop::prelude::*; // **< Size >*************************************************************************************** /// Define las **dimensiones** de una imagen ([`Image`](crate::theme::Image)). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Size { /// Ajuste automático por defecto. /// @@ -30,10 +30,24 @@ pub enum Size { Both(UnitValue), } +impl Size { + // Devuelve el valor del atributo `style` en función del tamaño, o `None` si no aplica. + #[inline] + pub(crate) fn to_style(self) -> Option<String> { + match self { + Self::Auto => None, + Self::Dimensions(w, h) => Some(format!("width: {w}; height: {h};")), + Self::Width(w) => Some(format!("width: {w};")), + Self::Height(h) => Some(format!("height: {h};")), + Self::Both(v) => Some(format!("width: {v}; height: {v};")), + } + } +} + // **< Source >************************************************************************************* /// Especifica la **fuente** para publicar una imagen ([`Image`](crate::theme::Image)). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Debug, PartialEq)] pub enum Source { /// Imagen con el logotipo de PageTop. #[default] @@ -51,3 +65,44 @@ pub enum Source { /// El `String` asociado es la URL (o ruta) de la imagen. Plain(String), } + +impl Source { + const IMG_FLUID: &str = "img-fluid"; + const IMG_THUMBNAIL: &str = "img-thumbnail"; + + // Devuelve la clase base asociada a la imagen según la fuente. + #[inline] + fn as_str(&self) -> &'static str { + match self { + Source::Logo(_) | Source::Responsive(_) => Self::IMG_FLUID, + Source::Thumbnail(_) => Self::IMG_THUMBNAIL, + Source::Plain(_) => "", + } + } + + /* Añade la clase base asociada a la imagen según la fuente a la cadena de clases (reservado). + #[inline] + pub(crate) fn push_class(&self, classes: &mut String) { + let s = self.as_str(); + if s.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(s); + } */ + + // Devuelve la clase asociada a la imagen según la fuente. + #[inline] + pub(crate) fn to_class(&self) -> String { + let s = self.as_str(); + if s.is_empty() { + String::new() + } else { + let mut class = String::with_capacity(s.len()); + class.push_str(s); + class + } + } +} diff --git a/extensions/pagetop-bootsier/src/theme/nav/component.rs b/extensions/pagetop-bootsier/src/theme/nav/component.rs index fe886bdd..2bd43774 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/component.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/component.rs @@ -30,28 +30,12 @@ impl Component for Nav { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - [ - "nav", - match self.nav_kind() { - nav::Kind::Default => "", - nav::Kind::Tabs => "nav-tabs", - nav::Kind::Pills => "nav-pills", - nav::Kind::Underline => "nav-underline", - }, - match self.nav_layout() { - nav::Layout::Default => "", - nav::Layout::Start => "justify-content-start", - nav::Layout::Center => "justify-content-center", - nav::Layout::End => "justify-content-end", - nav::Layout::Vertical => "flex-column", - nav::Layout::Fill => "nav-fill", - nav::Layout::Justified => "nav-justified", - }, - ] - .join_classes(), - ); + self.alter_classes(ClassesOp::Prepend, { + let mut classes = "nav".to_string(); + self.nav_kind().push_class(&mut classes); + self.nav_layout().push_class(&mut classes); + classes + }); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { diff --git a/extensions/pagetop-bootsier/src/theme/nav/item.rs b/extensions/pagetop-bootsier/src/theme/nav/item.rs index bc097e0c..a79947cd 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/item.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/item.rs @@ -29,6 +29,40 @@ pub enum ItemKind { Dropdown(Typed<Dropdown>), } +impl ItemKind { + const ITEM: &str = "nav-item"; + const DROPDOWN: &str = "nav-item dropdown"; + + // Devuelve las clases base asociadas al tipo de elemento. + #[inline] + const fn as_str(&self) -> &'static str { + match self { + Self::Void => "", + Self::Dropdown(_) => Self::DROPDOWN, + _ => Self::ITEM, + } + } + + /* Añade las clases asociadas al tipo de elemento a la cadena de clases (reservado). + #[inline] + pub(crate) fn push_class(&self, classes: &mut String) { + let class = self.as_str(); + if class.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(class); + } */ + + // Devuelve las clases asociadas al tipo de elemento. + #[inline] + pub(crate) fn to_class(&self) -> String { + self.as_str().to_owned() + } +} + // **< Item >*************************************************************************************** /// Representa un **elemento individual** de un menú [`Nav`](crate::theme::Nav). @@ -56,14 +90,7 @@ impl Component for Item { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - if matches!(self.item_kind(), ItemKind::Dropdown(_)) { - "nav-item dropdown" - } else { - "nav-item" - }, - ); + self.alter_classes(ClassesOp::Prepend, self.item_kind().to_class()); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { @@ -96,12 +123,12 @@ impl Component for Item { classes.push_str(" disabled"); } - let href = (!disabled).then_some(path); - let target = (!disabled && *blank).then_some("_blank"); - let rel = (!disabled && *blank).then_some("noopener noreferrer"); + let href = (!*disabled).then_some(path); + let target = (!*disabled && *blank).then_some("_blank"); + let rel = (!*disabled && *blank).then_some("noopener noreferrer"); let aria_current = (href.is_some() && is_current).then_some("page"); - let aria_disabled = disabled.then_some("true"); + let aria_disabled = (*disabled).then_some("true"); PrepareMarkup::With(html! { li id=[self.id()] class=[self.classes().get()] { diff --git a/extensions/pagetop-bootsier/src/theme/nav/props.rs b/extensions/pagetop-bootsier/src/theme/nav/props.rs index bd8ac1e1..46a4e2bc 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/props.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/props.rs @@ -3,7 +3,7 @@ use pagetop::prelude::*; // **< Kind >*************************************************************************************** /// Define la variante de presentación de un menú [`Nav`](crate::theme::Nav). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Kind { /// Estilo por defecto, lista de enlaces flexible y minimalista. #[default] @@ -16,10 +16,47 @@ pub enum Kind { Underline, } +impl Kind { + const TABS: &str = "nav-tabs"; + const PILLS: &str = "nav-pills"; + const UNDERLINE: &str = "nav-underline"; + + // Devuelve la clase base asociada al tipo de menú, o una cadena vacía si no aplica. + #[rustfmt::skip] + #[inline] + const fn as_str(self) -> &'static str { + match self { + Self::Default => "", + Self::Tabs => Self::TABS, + Self::Pills => Self::PILLS, + Self::Underline => Self::UNDERLINE, + } + } + + // Añade la clase asociada al tipo de menú a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + let class = self.as_str(); + if class.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(class); + } + + /* Devuelve la clase asociada al tipo de menú, o una cadena vacía si no aplica (reservado). + #[inline] + pub(crate) fn to_class(self) -> String { + self.as_str().to_owned() + } */ +} + // **< Layout >************************************************************************************* /// Distribución y orientación de un menú [`Nav`](crate::theme::Nav). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Layout { /// Comportamiento por defecto, ancho definido por el contenido y sin alineación forzada. #[default] @@ -37,3 +74,47 @@ pub enum Layout { /// Todos los elementos ocupan el mismo ancho rellenando la fila. Justified, } + +impl Layout { + const START: &str = "justify-content-start"; + const CENTER: &str = "justify-content-center"; + const END: &str = "justify-content-end"; + const VERTICAL: &str = "flex-column"; + const FILL: &str = "nav-fill"; + const JUSTIFIED: &str = "nav-justified"; + + // Devuelve la clase base asociada a la distribución y orientación del menú. + #[rustfmt::skip] + #[inline] + const fn as_str(self) -> &'static str { + match self { + Self::Default => "", + Self::Start => Self::START, + Self::Center => Self::CENTER, + Self::End => Self::END, + Self::Vertical => Self::VERTICAL, + Self::Fill => Self::FILL, + Self::Justified => Self::JUSTIFIED, + } + } + + // Añade la clase asociada a la distribución y orientación del menú a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + let class = self.as_str(); + if class.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(class); + } + + /* Devuelve la clase asociada a la distribución y orientación del menú, o una cadena vacía si no + // aplica (reservado). + #[inline] + pub(crate) fn to_class(self) -> String { + self.as_str().to_owned() + } */ +} diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs index ac592439..b40d06c2 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/component.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs @@ -35,22 +35,12 @@ impl Component for Navbar { } fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - [ - "navbar".to_string(), - self.expand().try_class("navbar-expand").unwrap_or_default(), - match self.position() { - navbar::Position::Static => "", - navbar::Position::FixedTop => "fixed-top", - navbar::Position::FixedBottom => "fixed-bottom", - navbar::Position::StickyTop => "sticky-top", - navbar::Position::StickyBottom => "sticky-bottom", - } - .to_string(), - ] - .join_classes(), - ); + self.alter_classes(ClassesOp::Prepend, { + let mut classes = "navbar".to_string(); + self.expand().push_class(&mut classes, "navbar-expand", ""); + self.position().push_class(&mut classes); + classes + }); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { diff --git a/extensions/pagetop-bootsier/src/theme/navbar/item.rs b/extensions/pagetop-bootsier/src/theme/navbar/item.rs index 07f52be6..7e912a49 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/item.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/item.rs @@ -38,6 +38,14 @@ impl Component for Item { } } + fn setup_before_prepare(&mut self, _cx: &mut Context) { + if let Self::Nav(nav) = self { + if let Some(mut nav) = nav.borrow_mut() { + nav.alter_classes(ClassesOp::Prepend, "navbar-nav"); + } + } + } + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { match self { Self::Void => PrepareMarkup::None, @@ -48,29 +56,8 @@ impl Component for Item { if items.is_empty() { return PrepareMarkup::None; } - let classes = AttrClasses::new( - [ - "navbar-nav", - match nav.nav_kind() { - nav::Kind::Default => "", - nav::Kind::Tabs => "nav-tabs", - nav::Kind::Pills => "nav-pills", - nav::Kind::Underline => "nav-underline", - }, - match nav.nav_layout() { - nav::Layout::Default => "", - nav::Layout::Start => "justify-content-start", - nav::Layout::Center => "justify-content-center", - nav::Layout::End => "justify-content-end", - nav::Layout::Vertical => "flex-column", - nav::Layout::Fill => "nav-fill", - nav::Layout::Justified => "nav-justified", - }, - ] - .join_classes(), - ); PrepareMarkup::With(html! { - ul id=[nav.id()] class=[classes.get()] { + ul id=[nav.id()] class=[nav.classes().get()] { (items) } }) diff --git a/extensions/pagetop-bootsier/src/theme/navbar/props.rs b/extensions/pagetop-bootsier/src/theme/navbar/props.rs index 86326574..1aeb6170 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/props.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/props.rs @@ -42,7 +42,7 @@ pub enum Layout { // **< Position >*********************************************************************************** /// Posición global de una barra de navegación [`Navbar`] en el documento. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Position { /// Barra normal, fluye con el documento. #[default] @@ -62,3 +62,37 @@ pub enum Position { /// La barra de navegación se fija en la parte inferior al hacer *scroll*. StickyBottom, } + +impl Position { + // Devuelve la clase base asociada a la posición de la barra de navegación. + #[inline] + const fn as_str(self) -> &'static str { + match self { + Self::Static => "", + Self::FixedTop => "fixed-top", + Self::FixedBottom => "fixed-bottom", + Self::StickyTop => "sticky-top", + Self::StickyBottom => "sticky-bottom", + } + } + + // Añade la clase asociada a la posición de la barra de navegación a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + let class = self.as_str(); + if class.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(class); + } + + /* Devuelve la clase asociada a la posición de la barra de navegación, o cadena vacía si no + // aplica (reservado). + #[inline] + pub(crate) fn to_class(self) -> String { + self.as_str().to_string() + } */ +} diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs index 7516238b..f17fe97a 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs @@ -44,25 +44,14 @@ impl Component for Offcanvas { self.id.get() } - #[rustfmt::skip] fn setup_before_prepare(&mut self, _cx: &mut Context) { - self.alter_classes( - ClassesOp::Prepend, - [ - self.breakpoint().to_class("offcanvas"), - match self.placement() { - offcanvas::Placement::Start => "offcanvas-start", - offcanvas::Placement::End => "offcanvas-end", - offcanvas::Placement::Top => "offcanvas-top", - offcanvas::Placement::Bottom => "offcanvas-bottom", - }.to_string(), - match self.visibility() { - offcanvas::Visibility::Default => "", - offcanvas::Visibility::Show => "show", - }.to_string(), - ] - .join_classes(), - ); + self.alter_classes(ClassesOp::Prepend, { + let mut classes = "offcanvas".to_string(); + self.breakpoint().push_class(&mut classes, "offcanvas", ""); + self.placement().push_class(&mut classes); + self.visibility().push_class(&mut classes); + classes + }); } fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/props.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/props.rs index cbacbd74..cdfe8623 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas/props.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas/props.rs @@ -4,7 +4,7 @@ use pagetop::prelude::*; /// Comportamiento de la capa de fondo (*backdrop*) de un panel /// [`Offcanvas`](crate::theme::Offcanvas) al deslizarse. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Backdrop { /// Sin capa de fondo, la página principal permanece visible e interactiva. Disabled, @@ -20,7 +20,7 @@ pub enum Backdrop { /// Controla si la página principal puede desplazarse al abrir un panel /// [`Offcanvas`](crate::theme::Offcanvas). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum BodyScroll { /// Opción por defecto, la página principal se bloquea centrando la interacción en el panel. #[default] @@ -34,7 +34,7 @@ pub enum BodyScroll { /// Posición de aparición de un panel [`Offcanvas`](crate::theme::Offcanvas) al deslizarse. /// /// Define desde qué borde de la ventana entra y se ancla el panel. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Placement { /// Opción por defecto, desde el borde inicial según dirección de lectura (respetando LTR/RTL). #[default] @@ -47,10 +47,39 @@ pub enum Placement { Bottom, } +impl Placement { + // Devuelve la clase base asociada a la posición de aparición del panel. + #[rustfmt::skip] + #[inline] + const fn as_str(self) -> &'static str { + match self { + Placement::Start => "offcanvas-start", + Placement::End => "offcanvas-end", + Placement::Top => "offcanvas-top", + Placement::Bottom => "offcanvas-bottom", + } + } + + // Añade la clase asociada a la posición de aparición del panel a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(self.as_str()); + } + + /* Devuelve la clase asociada a la posición de aparición del panel (reservado). + #[inline] + pub(crate) fn to_class(self) -> String { + self.as_str().to_owned() + } */ +} + // **< Visibility >********************************************************************************* /// Estado inicial de un panel [`Offcanvas`](crate::theme::Offcanvas). -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum Visibility { /// El panel permanece oculto desde el principio. #[default] @@ -58,3 +87,33 @@ pub enum Visibility { /// El panel se muestra abierto al cargar. Show, } + +impl Visibility { + // Devuelve la clase base asociada al estado inicial del panel. + #[inline] + const fn as_str(self) -> &'static str { + match self { + Visibility::Default => "", + Visibility::Show => "show", + } + } + + // Añade la clase asociada al estado inicial del panel a la cadena de clases. + #[inline] + pub(crate) fn push_class(self, classes: &mut String) { + let class = self.as_str(); + if class.is_empty() { + return; + } + if !classes.is_empty() { + classes.push(' '); + } + classes.push_str(class); + } + + /* Devuelve la clase asociada al estado inicial, o una cadena vacía si no aplica (reservado). + #[inline] + pub(crate) fn to_class(self) -> String { + self.as_str().to_owned() + } */ +} diff --git a/src/base/component.rs b/src/base/component.rs index 508a28e1..bdab35c6 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -2,11 +2,9 @@ use crate::prelude::*; -use std::fmt; - // **< FontSize >*********************************************************************************** -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum FontSize { ExtraLarge, XxLarge, @@ -24,7 +22,7 @@ pub enum FontSize { #[rustfmt::skip] impl FontSize { #[inline] - pub const fn as_str(&self) -> &'static str { + pub const fn as_str(self) -> &'static str { match self { FontSize::ExtraLarge => "fs__x3l", FontSize::XxLarge => "fs__x2l", @@ -40,12 +38,6 @@ impl FontSize { } } -impl fmt::Display for FontSize { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(self.as_str()) - } -} - // ************************************************************************************************* mod html; diff --git a/src/html.rs b/src/html.rs index f8709dc5..5f5b833a 100644 --- a/src/html.rs +++ b/src/html.rs @@ -87,9 +87,6 @@ use crate::{core, AutoDefault}; #[allow(type_alias_bounds)] pub type OptionComponent<C: core::component::Component> = core::component::Typed<C>; -mod join_classes; -pub use join_classes::JoinClasses; - mod unit; pub use unit::UnitValue; diff --git a/src/html/assets/stylesheet.rs b/src/html/assets/stylesheet.rs index 68a13da6..abadef8a 100644 --- a/src/html/assets/stylesheet.rs +++ b/src/html/assets/stylesheet.rs @@ -23,7 +23,7 @@ enum Source { /// /// Permite especificar en qué contexto se aplica el CSS, adaptándose a diferentes dispositivos o /// situaciones de impresión. -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum TargetMedia { /// Se aplica en todos los casos (el atributo `media` se omite). #[default] @@ -39,7 +39,7 @@ pub enum TargetMedia { /// Devuelve el valor para el atributo `media` (`Some(...)`) o `None` para `Default`. #[rustfmt::skip] impl TargetMedia { - fn as_str_opt(&self) -> Option<&str> { + const fn as_str(self) -> Option<&'static str> { match self { TargetMedia::Default => None, TargetMedia::Print => Some("print"), @@ -171,7 +171,7 @@ impl Asset for StyleSheet { link rel="stylesheet" href=(join_pair!(path, "?v=", &self.version)) - media=[self.media.as_str_opt()]; + media=[self.media.as_str()]; }, Source::Inline(_, f) => html! { style { (PreEscaped((f)(cx))) }; diff --git a/src/html/join_classes.rs b/src/html/join_classes.rs deleted file mode 100644 index 3f7d7e70..00000000 --- a/src/html/join_classes.rs +++ /dev/null @@ -1,67 +0,0 @@ -/// Añade a los *slices* de elementos [`AsRef<str>`] un método para unir clases CSS. -/// -/// El método es [`join_classes()`](JoinClasses::join_classes), que une las cadenas **no vacías** -/// del *slice* usando un espacio como separador. -pub trait JoinClasses { - /// Une las cadenas **no vacías** de un *slice* usando un espacio como separador. - /// - /// Son cadenas vacías únicamente los elementos del *slice* cuya longitud es `0` (p. ej., `""`); - /// no se realiza recorte ni normalización, por lo que elementos como `" "` no se consideran - /// vacíos. - /// - /// Si todas las cadenas están vacías, devuelve una cadena vacía. Acepta elementos que - /// implementen [`AsRef<str>`] como `&str`, [`String`] o `Cow<'_, str>`. - /// - /// # Ejemplos - /// - /// ```rust - /// # use pagetop::prelude::*; - /// let classes = ["btn", "", "btn-primary"]; - /// assert_eq!(classes.join_classes(), "btn btn-primary"); - /// - /// let empty: [&str; 3] = ["", "", ""]; - /// assert_eq!(empty.join_classes(), ""); - /// - /// let border = String::from("border"); - /// let border_top = String::from("border-top-0"); - /// let v = vec![&border, "", "", "", &border_top]; - /// assert_eq!(v.as_slice().join_classes(), "border border-top-0"); - /// - /// // Elementos con espacios afectan al resultado. - /// let spaced = ["btn", " ", "primary "]; - /// assert_eq!(spaced.join_classes(), "btn primary "); - /// ``` - fn join_classes(&self) -> String; -} - -impl<T> JoinClasses for [T] -where - T: AsRef<str>, -{ - #[inline] - fn join_classes(&self) -> String { - let mut count = 0usize; - let mut total = 0usize; - for s in self.iter().map(T::as_ref).filter(|s| !s.is_empty()) { - count += 1; - total += s.len(); - } - if count == 0 { - return String::new(); - } - let separator = " "; - let mut result = String::with_capacity(total + separator.len() * count.saturating_sub(1)); - for (i, s) in self - .iter() - .map(T::as_ref) - .filter(|s| !s.is_empty()) - .enumerate() - { - if i > 0 { - result.push_str(separator); - } - result.push_str(s); - } - result - } -} diff --git a/src/html/logo.rs b/src/html/logo.rs index f5057d94..fd604414 100644 --- a/src/html/logo.rs +++ b/src/html/logo.rs @@ -27,7 +27,7 @@ use crate::AutoDefault; /// }; /// ``` -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] pub enum PageTopSvg { /// Versión por defecto con el logotipo a color. #[default] diff --git a/src/prelude.rs b/src/prelude.rs index 0919e991..47fbbf64 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -33,8 +33,8 @@ pub use crate::trace; // alias obsoletos se volverá a declarar como `pub use crate::html::*;`. pub use crate::html::{ display, html_private, Asset, Assets, AttrClasses, AttrId, AttrL10n, AttrName, AttrValue, - ClassesOp, Escaper, Favicon, JavaScript, JoinClasses, Markup, PageTopSvg, PreEscaped, - PrepareMarkup, StyleSheet, TargetMedia, UnitValue, DOCTYPE, + ClassesOp, Escaper, Favicon, JavaScript, Markup, PageTopSvg, PreEscaped, PrepareMarkup, + StyleSheet, TargetMedia, UnitValue, DOCTYPE, }; pub use crate::locale::*; From 9e960c75735841cbb1227bb64a22efe2a011c592 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 15 Nov 2025 18:37:30 +0100 Subject: [PATCH 848/853] =?UTF-8?q?=F0=9F=9A=A7=20Aplica=20nuevas=20utilid?= =?UTF-8?q?ades=20para=20componer=20el=20men=C3=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/navbar-menus.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/navbar-menus.rs b/examples/navbar-menus.rs index 22ef336c..071d24b1 100644 --- a/examples/navbar-menus.rs +++ b/examples/navbar-menus.rs @@ -82,6 +82,10 @@ impl Extension for SuperMenu { )) .add_item(navbar::Item::nav( Nav::new() + .with_classes( + ClassesOp::Add, + classes::Margin::with(Side::Start, ScaleSize::Auto).to_class(), + ) .add_item(nav::Item::link( L10n::l("sample_menus_item_sign_up"), |_| "/auth/sign-up", @@ -91,7 +95,11 @@ impl Extension for SuperMenu { })), )); - InRegion::Key("header").add(Child::with(navbar_menu)); + InRegion::Key("header").add(Child::with( + Container::new() + .with_width(container::Width::FluidMax(UnitValue::RelRem(75.0))) + .add_child(navbar_menu), + )); } } From ceaee54484928a47a543f46579fc1379a00d4957 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 17 Nov 2025 22:47:47 +0100 Subject: [PATCH 849/853] =?UTF-8?q?=F0=9F=8E=A8=20Protege=20el=20uso=20de?= =?UTF-8?q?=20`render`=20en=20PrepareMarkup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html.rs | 17 +++-- tests/component_html.rs | 31 +++------ tests/component_poweredby.rs | 28 +++----- tests/html_pm.rs | 126 ++++++++++++++++++++++------------- 4 files changed, 112 insertions(+), 90 deletions(-) diff --git a/src/html.rs b/src/html.rs index 5f5b833a..82fdcd73 100644 --- a/src/html.rs +++ b/src/html.rs @@ -104,11 +104,11 @@ pub use unit::UnitValue; /// # use pagetop::prelude::*; /// // Texto normal, se escapa automáticamente para evitar inyección de HTML. /// let fragment = PrepareMarkup::Escaped("Hola <b>mundo</b>".to_string()); -/// assert_eq!(fragment.render().into_string(), "Hola &lt;b&gt;mundo&lt;/b&gt;"); +/// assert_eq!(fragment.into_string(), "Hola &lt;b&gt;mundo&lt;/b&gt;"); /// /// // HTML literal, se inserta directamente, sin escapado adicional. /// let raw_html = PrepareMarkup::Raw("<b>negrita</b>".to_string()); -/// assert_eq!(raw_html.render().into_string(), "<b>negrita</b>"); +/// assert_eq!(raw_html.into_string(), "<b>negrita</b>"); /// /// // Fragmento ya preparado con la macro `html!`. /// let prepared = PrepareMarkup::With(html! { @@ -116,11 +116,11 @@ pub use unit::UnitValue; /// p { "Este es un párrafo con contenido dinámico." } /// }); /// assert_eq!( -/// prepared.render().into_string(), +/// prepared.into_string(), /// "<h2>Título de ejemplo</h2><p>Este es un párrafo con contenido dinámico.</p>" /// ); /// ``` -#[derive(AutoDefault)] +#[derive(AutoDefault, Clone)] pub enum PrepareMarkup { /// No se genera contenido HTML (equivale a `html! {}`). #[default] @@ -152,8 +152,13 @@ impl PrepareMarkup { } } - /// Integra el renderizado fácilmente en la macro [`html!`]. - pub fn render(&self) -> Markup { + /// Convierte el contenido en una cadena HTML renderizada. Usar sólo para pruebas o depuración. + pub fn into_string(&self) -> String { + self.render().into_string() + } + + // Integra el renderizado fácilmente en la macro [`html!`]. + pub(crate) fn render(&self) -> Markup { match self { PrepareMarkup::None => html! {}, PrepareMarkup::Escaped(text) => html! { (text) }, diff --git a/tests/component_html.rs b/tests/component_html.rs index 851315a9..06d77ec9 100644 --- a/tests/component_html.rs +++ b/tests/component_html.rs @@ -2,32 +2,28 @@ use pagetop::prelude::*; #[pagetop::test] async fn component_html_renders_static_markup() { - let component = Html::with(|_| { + let mut component = Html::with(|_| { html! { p { "Test" } } }); - let markup = component - .prepare_component(&mut Context::new(None)) - .render(); - + let markup = component.render(&mut Context::default()); assert_eq!(markup.0, "<p>Test</p>"); } #[pagetop::test] async fn component_html_renders_using_context_param() { - let mut cx = Context::new(None).with_param("username", "Alice".to_string()); + let mut cx = Context::default().with_param("username", "Alice".to_string()); - let component = Html::with(|cx| { + let mut component = Html::with(|cx| { let name = cx.param::<String>("username").cloned().unwrap_or_default(); html! { span { (name) } } }); - let markup = component.prepare_component(&mut cx).render(); - + let markup = component.render(&mut cx); assert_eq!(markup.0, "<span>Alice</span>"); } @@ -37,21 +33,15 @@ async fn component_html_allows_replacing_render_function() { component.alter_fn(|_| html! { div { "Modified" } }); - let markup = component - .prepare_component(&mut Context::new(None)) - .render(); - + let markup = component.render(&mut Context::default()); assert_eq!(markup.0, "<div>Modified</div>"); } #[pagetop::test] async fn component_html_default_renders_empty_markup() { - let component = Html::default(); - - let markup = component - .prepare_component(&mut Context::new(None)) - .render(); + let mut component = Html::default(); + let markup = component.render(&mut Context::default()); assert_eq!(markup.0, ""); } @@ -60,7 +50,7 @@ async fn component_html_can_access_http_method() { let req = service::test::TestRequest::with_uri("/").to_http_request(); let mut cx = Context::new(Some(req)); - let component = Html::with(|cx| { + let mut component = Html::with(|cx| { let method = cx .request() .map(|r| r.method().to_string()) @@ -68,7 +58,6 @@ async fn component_html_can_access_http_method() { html! { span { (method) } } }); - let markup = component.prepare_component(&mut cx).render(); - + let markup = component.render(&mut cx); assert_eq!(markup.0, "<span>GET</span>"); } diff --git a/tests/component_poweredby.rs b/tests/component_poweredby.rs index 27683d95..7e5a062c 100644 --- a/tests/component_poweredby.rs +++ b/tests/component_poweredby.rs @@ -4,8 +4,8 @@ use pagetop::prelude::*; async fn poweredby_default_shows_only_pagetop_recognition() { let _app = service::test::init_service(Application::new().test()).await; - let p = PoweredBy::default(); - let html = render_component(&p); + let mut p = PoweredBy::default(); + let html = p.render(&mut Context::default()); // Debe mostrar el bloque de reconocimiento a PageTop. assert!(html.as_str().contains("poweredby__pagetop")); @@ -18,8 +18,8 @@ async fn poweredby_default_shows_only_pagetop_recognition() { async fn poweredby_new_includes_current_year_and_app_name() { let _app = service::test::init_service(Application::new().test()).await; - let p = PoweredBy::new(); - let html = render_component(&p); + let mut p = PoweredBy::new(); + let html = p.render(&mut Context::default()); let year = Utc::now().format("%Y").to_string(); assert!( @@ -43,8 +43,8 @@ async fn poweredby_with_copyright_overrides_text() { let _app = service::test::init_service(Application::new().test()).await; let custom = "2001 © FooBar Inc."; - let p = PoweredBy::default().with_copyright(Some(custom)); - let html = render_component(&p); + let mut p = PoweredBy::default().with_copyright(Some(custom)); + let html = p.render(&mut Context::default()); assert!(html.as_str().contains(custom)); assert!(html.as_str().contains("poweredby__copyright")); @@ -54,8 +54,8 @@ async fn poweredby_with_copyright_overrides_text() { async fn poweredby_with_copyright_none_hides_text() { let _app = service::test::init_service(Application::new().test()).await; - let p = PoweredBy::new().with_copyright(None::<String>); - let html = render_component(&p); + let mut p = PoweredBy::new().with_copyright(None::<String>); + let html = p.render(&mut Context::default()); assert!(!html.as_str().contains("poweredby__copyright")); // El reconocimiento a PageTop siempre debe aparecer. @@ -66,8 +66,8 @@ async fn poweredby_with_copyright_none_hides_text() { async fn poweredby_link_points_to_crates_io() { let _app = service::test::init_service(Application::new().test()).await; - let p = PoweredBy::default(); - let html = render_component(&p); + let mut p = PoweredBy::default(); + let html = p.render(&mut Context::default()); assert!( html.as_str().contains("https://pagetop.cillero.es"), @@ -89,11 +89,3 @@ async fn poweredby_getter_reflects_internal_state() { assert!(c1.contains(&Utc::now().format("%Y").to_string())); assert!(c1.contains(&global::SETTINGS.app.name)); } - -// **< HELPERS >************************************************************************************ - -fn render_component<C: Component>(c: &C) -> Markup { - let mut cx = Context::default(); - let pm = c.prepare_component(&mut cx); - pm.render() -} diff --git a/tests/html_pm.rs b/tests/html_pm.rs index ae4517bc..615ea470 100644 --- a/tests/html_pm.rs +++ b/tests/html_pm.rs @@ -1,70 +1,69 @@ use pagetop::prelude::*; -#[pagetop::test] -async fn prepare_markup_render_none_is_empty_string() { - assert_eq!(PrepareMarkup::None.render().as_str(), ""); +/// Componente mínimo para probar `PrepareMarkup` pasando por el ciclo real +/// de renderizado de componentes (`ComponentRender`). +#[derive(AutoDefault)] +struct TestPrepareComponent { + pm: PrepareMarkup, +} + +impl Component for TestPrepareComponent { + fn new() -> Self { + Self { + pm: PrepareMarkup::None, + } + } + + fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { + self.pm.clone() + } +} + +impl TestPrepareComponent { + fn render_pm(pm: PrepareMarkup) -> String { + let mut c = TestPrepareComponent { pm }; + c.render(&mut Context::default()).into_string() + } } #[pagetop::test] -async fn prepare_markup_render_escaped_escapes_html_and_ampersands() { +async fn prepare_markup_none_is_empty_string() { + assert_eq!(PrepareMarkup::None.into_string(), ""); +} + +#[pagetop::test] +async fn prepare_markup_escaped_escapes_html_and_ampersands() { let pm = PrepareMarkup::Escaped("<b>& \" ' </b>".to_string()); - assert_eq!(pm.render().as_str(), "&lt;b&gt;&amp; &quot; ' &lt;/b&gt;"); + assert_eq!(pm.into_string(), "&lt;b&gt;&amp; &quot; ' &lt;/b&gt;"); } #[pagetop::test] -async fn prepare_markup_render_raw_is_inserted_verbatim() { +async fn prepare_markup_raw_is_inserted_verbatim() { let pm = PrepareMarkup::Raw("<b>bold</b><script>1<2</script>".to_string()); - assert_eq!(pm.render().as_str(), "<b>bold</b><script>1<2</script>"); + assert_eq!(pm.into_string(), "<b>bold</b><script>1<2</script>"); } #[pagetop::test] -async fn prepare_markup_render_with_keeps_structure() { +async fn prepare_markup_with_keeps_structure() { let pm = PrepareMarkup::With(html! { h2 { "Sample title" } - p { "This is a paragraph." } + p { "This is a paragraph." } }); assert_eq!( - pm.render().as_str(), + pm.into_string(), "<h2>Sample title</h2><p>This is a paragraph.</p>" ); } -#[pagetop::test] -async fn prepare_markup_does_not_double_escape_when_wrapped_in_html_macro() { - // Escaped: dentro de `html!` no debe volver a escaparse. - let escaped = PrepareMarkup::Escaped("<i>x</i>".into()); - let wrapped_escaped = html! { div { (escaped.render()) } }; - assert_eq!( - wrapped_escaped.into_string(), - "<div>&lt;i&gt;x&lt;/i&gt;</div>" - ); - - // Raw: tampoco debe escaparse al integrarlo. - let raw = PrepareMarkup::Raw("<i>x</i>".into()); - let wrapped_raw = html! { div { (raw.render()) } }; - assert_eq!(wrapped_raw.into_string(), "<div><i>x</i></div>"); - - // With: debe incrustar el Markup tal cual. - let with = PrepareMarkup::With(html! { span.title { "ok" } }); - let wrapped_with = html! { div { (with.render()) } }; - assert_eq!( - wrapped_with.into_string(), - "<div><span class=\"title\">ok</span></div>" - ); -} - #[pagetop::test] async fn prepare_markup_unicode_is_preserved() { // Texto con acentos y emojis debe conservarse (salvo el escape HTML de signos). let esc = PrepareMarkup::Escaped("Hello, tomorrow coffee ☕ & donuts!".into()); - assert_eq!( - esc.render().as_str(), - "Hello, tomorrow coffee ☕ &amp; donuts!" - ); + assert_eq!(esc.into_string(), "Hello, tomorrow coffee ☕ &amp; donuts!"); // Raw debe pasar íntegro. let raw = PrepareMarkup::Raw("Title — section © 2025".into()); - assert_eq!(raw.render().as_str(), "Title — section © 2025"); + assert_eq!(raw.into_string(), "Title — section © 2025"); } #[pagetop::test] @@ -88,7 +87,36 @@ async fn prepare_markup_is_empty_semantics() { } #[pagetop::test] -async fn prepare_markup_equivalence_between_render_and_inline_in_html_macro() { +async fn prepare_markup_does_not_double_escape_when_markup_is_reinjected_in_html_macro() { + let mut cx = Context::default(); + + // Escaped: dentro de `html!` no debe volver a escaparse. + let mut comp = TestPrepareComponent { + pm: PrepareMarkup::Escaped("<i>x</i>".into()), + }; + let markup = comp.render(&mut cx); // Markup + let wrapped_escaped = html! { div { (markup) } }.into_string(); + assert_eq!(wrapped_escaped, "<div>&lt;i&gt;x&lt;/i&gt;</div>"); + + // Raw: tampoco debe escaparse al integrarlo. + let mut comp = TestPrepareComponent { + pm: PrepareMarkup::Raw("<i>x</i>".into()), + }; + let markup = comp.render(&mut cx); + let wrapped_raw = html! { div { (markup) } }.into_string(); + assert_eq!(wrapped_raw, "<div><i>x</i></div>"); + + // With: debe incrustar el Markup tal cual. + let mut comp = TestPrepareComponent { + pm: PrepareMarkup::With(html! { span.title { "ok" } }), + }; + let markup = comp.render(&mut cx); + let wrapped_with = html! { div { (markup) } }.into_string(); + assert_eq!(wrapped_with, "<div><span class=\"title\">ok</span></div>"); +} + +#[pagetop::test] +async fn prepare_markup_equivalence_between_component_render_and_markup_reinjected_in_html_macro() { let cases = [ PrepareMarkup::None, PrepareMarkup::Escaped("<b>x</b>".into()), @@ -97,12 +125,20 @@ async fn prepare_markup_equivalence_between_render_and_inline_in_html_macro() { ]; for pm in cases { - let rendered = pm.render(); - let in_macro = html! { (rendered) }.into_string(); + // Vía 1: renderizamos y obtenemos directamente el String. + let via_component = TestPrepareComponent::render_pm(pm.clone()); + + // Vía 2: renderizamos, reinyectamos el Markup en `html!` y volvemos a obtener String. + let via_macro = { + let mut cx = Context::default(); + let mut comp = TestPrepareComponent { pm }; + let markup = comp.render(&mut cx); + html! { (markup) }.into_string() + }; + assert_eq!( - rendered.as_str(), - in_macro, - "The output of Render and (pm) inside html! must match" + via_component, via_macro, + "The output of component render and (Markup) inside html! must match" ); } } From 77c4005b4e1dc10213dd8db5f8357dc610a10fdd Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 17 Nov 2025 22:50:56 +0100 Subject: [PATCH 850/853] =?UTF-8?q?=E2=9C=A8=20Incorpora=20`is=5Frenderabl?= =?UTF-8?q?e`=20en=20`Component`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/action/component.rs | 3 - src/base/action/component/is_renderable.rs | 96 ---------------------- src/core/component.rs | 53 ++++++++++++ src/core/component/definition.rs | 36 +++++--- 4 files changed, 78 insertions(+), 110 deletions(-) delete mode 100644 src/base/action/component/is_renderable.rs diff --git a/src/base/action/component.rs b/src/base/action/component.rs index aaef1ce9..30c7ba4a 100644 --- a/src/base/action/component.rs +++ b/src/base/action/component.rs @@ -1,8 +1,5 @@ //! Acciones que operan sobre componentes. -mod is_renderable; -pub use is_renderable::*; - mod before_render_component; pub use before_render_component::*; diff --git a/src/base/action/component/is_renderable.rs b/src/base/action/component/is_renderable.rs deleted file mode 100644 index 5a0e244e..00000000 --- a/src/base/action/component/is_renderable.rs +++ /dev/null @@ -1,96 +0,0 @@ -use crate::prelude::*; - -/// Tipo de función para determinar si un componente se renderiza o no. -/// -/// Se usa en la acción [`IsRenderable`] para controlar dinámicamente la visibilidad del componente -/// `component` según el contexto `cx`. El componente **no se renderiza** en cuanto una de las -/// funciones devuelva `false`. -pub type FnIsRenderable<C> = fn(component: &C, cx: &Context) -> bool; - -/// Con la función [`FnIsRenderable`] se puede decidir si se renderiza o no un componente. -pub struct IsRenderable<C: Component> { - f: FnIsRenderable<C>, - referer_type_id: Option<UniqueId>, - referer_id: AttrId, - weight: Weight, -} - -/// Filtro para despachar [`FnIsRenderable`] para decidir si se renderiza o no un componente `C`. -impl<C: Component> ActionDispatcher for IsRenderable<C> { - /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. - fn referer_type_id(&self) -> Option<UniqueId> { - self.referer_type_id - } - - /// Devuelve el identificador del componente. - fn referer_id(&self) -> Option<String> { - self.referer_id.get() - } - - /// Devuelve el peso para definir el orden de ejecución. - fn weight(&self) -> Weight { - self.weight - } -} - -impl<C: Component> IsRenderable<C> { - /// Permite [registrar](Extension::actions) una nueva acción [`FnIsRenderable`]. - pub fn new(f: FnIsRenderable<C>) -> Self { - IsRenderable { - f, - referer_type_id: Some(UniqueId::of::<C>()), - referer_id: AttrId::default(), - weight: 0, - } - } - - /// Afina el registro para ejecutar la acción [`FnIsRenderable`] sólo para el componente `C` - /// con identificador `id`. - pub fn filter_by_referer_id(mut self, id: impl AsRef<str>) -> Self { - self.referer_id.alter_value(id); - self - } - - /// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos. - pub fn with_weight(mut self, value: Weight) -> Self { - self.weight = value; - self - } - - // Despacha las acciones. Se detiene en cuanto una [`FnIsRenderable`] devuelve `false`. - #[inline] - pub(crate) fn dispatch(component: &C, cx: &mut Context) -> bool { - let mut renderable = true; - dispatch_actions( - &ActionKey::new( - UniqueId::of::<Self>(), - None, - Some(UniqueId::of::<C>()), - None, - ), - |action: &Self| { - if renderable && !(action.f)(component, cx) { - renderable = false; - } - }, - ); - if renderable { - if let Some(id) = component.id() { - dispatch_actions( - &ActionKey::new( - UniqueId::of::<Self>(), - None, - Some(UniqueId::of::<C>()), - Some(id), - ), - |action: &Self| { - if renderable && !(action.f)(component, cx) { - renderable = false; - } - }, - ); - } - } - renderable - } -} diff --git a/src/core/component.rs b/src/core/component.rs index a7faa2fb..9c9ade2e 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -11,6 +11,59 @@ pub use children::{Typed, TypedOp}; mod context; pub use context::{Context, ContextError, ContextOp, Contextual}; +/// Alias de función (*callback*) para **determinar si un componente se renderiza o no**. +/// +/// Puede usarse para permitir que una instancia concreta de un tipo de componente dado decida +/// dinámicamente durante el proceso de renderizado ([`Component::is_renderable()`]) si se renderiza +/// o no. +/// +/// # Ejemplo +/// +/// ```rust +/// # use pagetop::prelude::*; +/// #[derive(AutoDefault)] +/// struct SampleComponent { +/// renderable: Option<FnIsRenderable>, +/// } +/// +/// impl Component for SampleComponent { +/// fn new() -> Self { +/// Self::default() +/// } +/// +/// fn is_renderable(&self, cx: &mut Context) -> bool { +/// // Si hay callback, se usa; en caso contrario, se renderiza por defecto. +/// self.renderable.map_or(true, |f| f(cx)) +/// } +/// +/// fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup { +/// PrepareMarkup::Escaped("Visible component".into()) +/// } +/// } +/// +/// impl SampleComponent { +/// /// Asigna una función que decidirá si el componente se renderiza o no. +/// #[builder_fn] +/// pub fn with_renderable(mut self, f: Option<FnIsRenderable>) -> Self { +/// self.renderable = f; +/// self +/// } +/// } +/// +/// fn sample() { +/// let mut cx = Context::default().with_param("user_logged_in", true); +/// +/// // Se instancia un componente que sólo se renderiza si `user_logged_in` es `true`. +/// let mut component = SampleComponent::new().with_renderable(Some(|cx: &Context| { +/// cx.param::<bool>("user_logged_in").copied().unwrap_or(false) +/// })); +/// +/// // Aquí simplemente se comprueba que compila y se puede invocar. +/// let _markup = component.render(&mut cx); +/// } +/// ``` +pub type FnIsRenderable = fn(cx: &Context) -> bool; + /// Alias de función (*callback*) para **resolver una URL** según el contexto de renderizado. /// /// Se usa para generar enlaces dinámicos en función del contexto (petición, idioma, etc.). Debe diff --git a/src/core/component/definition.rs b/src/core/component/definition.rs index c0573b44..13b03851 100644 --- a/src/core/component/definition.rs +++ b/src/core/component/definition.rs @@ -45,6 +45,20 @@ pub trait Component: AnyInfo + ComponentRender + Send + Sync { None } + /// Indica si el componente es renderizable. + /// + /// Por defecto, todos los componentes son renderizables (`true`). Sin embargo, este método + /// puede sobrescribirse para decidir dinámicamente si los componentes de este tipo se + /// renderizan o no en función del contexto de renderizado. + /// + /// También puede usarse junto con un alias de función como + /// ([`FnIsRenderable`](crate::core::component::FnIsRenderable)) para permitir que instancias + /// concretas del componente decidan si se renderizan o no. + #[allow(unused_variables)] + fn is_renderable(&self, cx: &mut Context) -> bool { + true + } + /// Configura el componente justo antes de preparar el renderizado. /// /// Este método puede sobrescribirse para modificar la estructura interna del componente o el @@ -72,30 +86,30 @@ pub trait Component: AnyInfo + ComponentRender + Send + Sync { /// Implementa [`render()`](ComponentRender::render) para todos los componentes. /// -/// Y para cada componente ejecuta la siguiente secuencia: +/// El proceso de renderizado de cada componente sigue esta secuencia: /// -/// 1. Despacha [`action::component::IsRenderable`](crate::base::action::component::IsRenderable) -/// para ver si se puede renderizar. Si no es así, devuelve un [`Markup`] vacío. +/// 1. Ejecuta [`is_renderable()`](Component::is_renderable) para ver si puede renderizarse en el +/// contexto actual. Si no es así, devuelve un [`Markup`] vacío. /// 2. Ejecuta [`setup_before_prepare()`](Component::setup_before_prepare) para que el componente /// pueda ajustar su estructura interna o modificar el contexto. /// 3. Despacha [`action::theme::BeforeRender<C>`](crate::base::action::theme::BeforeRender) para -/// que el tema pueda hacer ajustes en el componente o el contexto. +/// permitir que el tema realice ajustes previos. /// 4. Despacha [`action::component::BeforeRender<C>`](crate::base::action::component::BeforeRender) -/// para que otras extensiones puedan hacer ajustes. +/// para que otras extensiones puedan también hacer ajustes previos. /// 5. **Prepara el renderizado del componente**: /// - Despacha [`action::theme::PrepareRender<C>`](crate::base::action::theme::PrepareRender) -/// para permitir al tema preparar un renderizado diferente al predefinido. -/// - Si no es así, ejecuta [`prepare_component()`](Component::prepare_component) para preparar -/// el renderizado predefinido del componente. +/// para permitir al tema generar un renderizado alternativo. +/// - Si el tema no lo modifica, llama a [`prepare_component()`](Component::prepare_component) +/// para obtener el renderizado por defecto del componente. /// 6. Despacha [`action::theme::AfterRender<C>`](crate::base::action::theme::AfterRender) para -/// que el tema pueda hacer sus últimos ajustes. +/// que el tema pueda aplicar ajustes finales. /// 7. Despacha [`action::component::AfterRender<C>`](crate::base::action::component::AfterRender) /// para que otras extensiones puedan hacer sus últimos ajustes. -/// 8. Finalmente devuelve un [`Markup`] del renderizado preparado en el paso 5. +/// 8. Devuelve el [`Markup`] generado en el paso 5. impl<C: Component> ComponentRender for C { fn render(&mut self, cx: &mut Context) -> Markup { // Si no es renderizable, devuelve un bloque HTML vacío. - if !action::component::IsRenderable::dispatch(self, cx) { + if !self.is_renderable(cx) { return html! {}; } From 64264f234d1c2b1a5373eb716cb260a28baa98c5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Mon, 17 Nov 2025 22:51:34 +0100 Subject: [PATCH 851/853] =?UTF-8?q?=F0=9F=9A=9A=20Renombra=20`ThemeRegion`?= =?UTF-8?q?=20por=20`DefaultRegions`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pagetop-aliner/src/lib.rs | 6 ++-- extensions/pagetop-bootsier/src/lib.rs | 4 +-- src/base/theme.rs | 2 +- src/base/theme/basic.rs | 4 +-- src/core/theme.rs | 11 ++++---- src/core/theme/definition.rs | 39 ++++++++++++++------------ src/core/theme/regions.rs | 16 +++++------ 7 files changed, 43 insertions(+), 39 deletions(-) diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index edbb5040..cbc0f526 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -82,13 +82,13 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { use pagetop::prelude::*; -/// El tema usa las mismas regiones predefinidas por [`ThemeRegion`]. -pub type AlinerRegion = ThemeRegion; +/// El tema usa las mismas regiones predefinidas por [`DefaultRegions`]. +pub type AlinerRegions = DefaultRegions; /// Implementa el tema para usar en pruebas que muestran el esquema de páginas HTML. /// /// Tema mínimo ideal para **pruebas y demos** que renderiza el **esqueleto HTML** con las mismas -/// regiones básicas definidas por [`ThemeRegion`]. No pretende ser un tema para producción, está +/// regiones básicas definidas por [`DefaultRegions`]. No pretende ser un tema para producción, está /// pensado para: /// /// - Verificar integración de componentes y composiciones (*layouts*) sin estilos complejos. diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index 4cb35a27..76f9d1e2 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -101,8 +101,8 @@ pub mod prelude { pub use crate::theme::*; } -/// El tema usa las mismas regiones predefinidas por [`ThemeRegion`]. -pub type BootsierRegion = ThemeRegion; +/// El tema usa las mismas regiones predefinidas por [`DefaultRegions`]. +pub type BootsierRegions = DefaultRegions; /// Implementa el tema. pub struct Bootsier; diff --git a/src/base/theme.rs b/src/base/theme.rs index a4b2df5b..1e5b1a85 100644 --- a/src/base/theme.rs +++ b/src/base/theme.rs @@ -1,4 +1,4 @@ //! Temas básicos soportados por PageTop. mod basic; -pub use basic::{Basic, BasicRegion}; +pub use basic::{Basic, BasicRegions}; diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index a6711859..2d713e37 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -1,8 +1,8 @@ /// Es el tema básico que incluye PageTop por defecto. use crate::prelude::*; -/// El tema básico usa las mismas regiones predefinidas por [`ThemeRegion`]. -pub type BasicRegion = ThemeRegion; +/// El tema básico usa las mismas regiones predefinidas por [`DefaultRegions`]. +pub type BasicRegions = DefaultRegions; /// Tema básico por defecto que extiende el funcionamiento predeterminado de [`Theme`]. pub struct Basic; diff --git a/src/core/theme.rs b/src/core/theme.rs index 64f40f33..28638ba6 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -9,13 +9,14 @@ //! tipografías, espaciados y cualquier otro detalle visual o de comportamiento (como animaciones, //! scripts de interfaz, etc.). //! -//! Los temas son extensiones que implementan [`Extension`](crate::core::extension::Extension); por -//! lo que se instancian, declaran sus dependencias y se inician igual que el resto de extensiones; -//! pero serán temas si además implementan [`theme()`](crate::core::extension::Extension::theme) y -//! [`Theme`]. +//! Los temas son extensiones que implementan [`Extension`](crate::core::extension::Extension), por +//! lo que se instancian, declaran dependencias y se inician igual que cualquier otra extensión. +//! También deben implementar [`Theme`] y sobrescribir el método +//! [`Extension::theme()`](crate::core::extension::Extension::theme) para que PageTop pueda +//! registrarlos como temas mod definition; -pub use definition::{Theme, ThemePage, ThemeRef, ThemeRegion}; +pub use definition::{Theme, ThemePage, ThemeRef, DefaultRegions}; mod regions; pub(crate) use regions::{ChildrenInRegions, REGION_CONTENT}; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 2a20c078..7d21c146 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -4,7 +4,7 @@ use crate::core::theme::{Region, RegionRef, REGION_CONTENT}; use crate::html::{html, Markup, StyleSheet}; use crate::locale::L10n; use crate::response::page::Page; -use crate::{global, join}; +use crate::{global, join, AutoDefault}; use std::sync::LazyLock; @@ -14,16 +14,17 @@ use std::sync::LazyLock; /// implementen [`Theme`] y, a su vez, [`Extension`]. pub type ThemeRef = &'static dyn Theme; -/// Conjunto de regiones que los temas pueden exponer para el renderizado. +/// Conjunto de regiones predefinidas que los temas pueden exponer para el renderizado. /// -/// `ThemeRegion` define un conjunto de regiones predefinidas para estructurar un documento HTML. +/// `DefaultRegions` define un conjunto de regiones predefinidas para estructurar un documento HTML. /// Proporciona **identificadores estables** (vía [`Region::key()`]) y **etiquetas localizables** /// (vía [`Region::label()`]) a las regiones donde se añadirán los componentes. /// /// Se usa por defecto en [`Theme::page_regions()`](crate::core::theme::Theme::page_regions) y sus /// variantes representan el conjunto mínimo recomendado para cualquier tema. Sin embargo, cada tema /// podría exponer su propio conjunto de regiones. -pub enum ThemeRegion { +#[derive(AutoDefault)] +pub enum DefaultRegions { /// Cabecera de la página. /// /// Clave: `"header"`. Suele contener *branding*, navegación principal o avisos globales. @@ -32,6 +33,7 @@ pub enum ThemeRegion { /// Contenido principal de la página (**obligatoria**). /// /// Clave: `"content"`. Es el destino por defecto para insertar componentes a nivel de página. + #[default] Content, /// Pie de página. @@ -40,12 +42,12 @@ pub enum ThemeRegion { Footer, } -impl Region for ThemeRegion { +impl Region for DefaultRegions { fn key(&self) -> &str { match self { - ThemeRegion::Header => "header", - ThemeRegion::Content => REGION_CONTENT, - ThemeRegion::Footer => "footer", + Self::Header => "header", + Self::Content => REGION_CONTENT, + Self::Footer => "footer", } } @@ -60,16 +62,17 @@ impl Region for ThemeRegion { /// implementa automáticamente para cualquier tipo que implemente [`Theme`], por lo que normalmente /// no requiere implementación explícita. /// -/// Si un tema **sobrescribe** uno o más de estos métodos de [`Theme`]: +/// Si un tema **sobrescribe** uno o más de los siguientes métodos de [`Theme`]: /// /// - [`render_page_region()`](Theme::render_page_region), /// - [`render_page_head()`](Theme::render_page_head), o /// - [`render_page_body()`](Theme::render_page_body); /// -/// es posible volver al comportamiento por defecto usando FQS (*Fully Qualified Syntax*): +/// puede volver al comportamiento por defecto con una llamada FQS (*Fully Qualified Syntax*) a: /// -/// - `<Self as ThemePage>::render_body(self, page, self.page_regions())` -/// - `<Self as ThemePage>::render_head(self, page)` +/// - `<Self as ThemePage>::render_region(self, page, region)`, +/// - `<Self as ThemePage>::render_body(self, page, self.page_regions())`, o +/// - `<Self as ThemePage>::render_head(self, page)`. pub trait ThemePage { /// Renderiza el **contenedor** de una región concreta del `<body>` de la página. /// @@ -206,9 +209,9 @@ pub trait Theme: Extension + ThemePage + Send + Sync { /// fn page_regions(&self) -> &'static [RegionRef] { /// static REGIONS: LazyLock<[RegionRef; 4]> = LazyLock::new(|| { /// [ - /// &ThemeRegion::Header, - /// &ThemeRegion::Content, - /// &ThemeRegion::Footer, + /// &DefaultRegions::Header, + /// &DefaultRegions::Content, + /// &DefaultRegions::Footer, /// ] /// }); /// &*REGIONS @@ -217,9 +220,9 @@ pub trait Theme: Extension + ThemePage + Send + Sync { fn page_regions(&self) -> &'static [RegionRef] { static REGIONS: LazyLock<[RegionRef; 3]> = LazyLock::new(|| { [ - &ThemeRegion::Header, - &ThemeRegion::Content, - &ThemeRegion::Footer, + &DefaultRegions::Header, + &DefaultRegions::Content, + &DefaultRegions::Footer, ] }); &*REGIONS diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 8e386f55..17e15436 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -31,25 +31,25 @@ pub const REGION_CONTENT: &str = "content"; /// `aria-label` o en descripciones semánticas del contenedor). /// /// Las implementaciones típicas son *enumeraciones estáticas* declaradas por cada tema (ver como -/// ejemplo [`ThemeRegion`](crate::core::theme::ThemeRegion)), de modo que las claves y etiquetas -/// permanecen inmutables y fácilmente referenciables. +/// ejemplo [`DefaultRegions`](crate::core::theme::DefaultRegions)), de modo que las claves y +/// etiquetas permanecen inmutables y fácilmente referenciables. /// /// # Ejemplo /// /// ```rust /// # use pagetop::prelude::*; -/// pub enum MyThemeRegion { +/// pub enum MyThemeRegions { /// Header, /// Content, /// Footer, /// } /// -/// impl Region for MyThemeRegion { +/// impl Region for MyThemeRegions { /// fn key(&self) -> &str { /// match self { -/// MyThemeRegion::Header => "header", -/// MyThemeRegion::Content => "content", -/// MyThemeRegion::Footer => "footer", +/// Self::Header => "header", +/// Self::Content => "content", +/// Self::Footer => "footer", /// } /// } /// @@ -111,7 +111,7 @@ impl ChildrenInRegions { } } -/// Punto de acceso para añadir componentes a regiones globales o específicas de un tema. +/// Permite añadir componentes a regiones globales o específicas de un tema. /// /// Según la variante, se pueden añadir componentes ([`add()`](Self::add)) que permanecerán /// disponibles durante toda la ejecución. From 4a3244d0e402d124047d92154e78bf8bfa86f80b Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Fri, 21 Nov 2025 05:57:10 +0100 Subject: [PATCH 852/853] =?UTF-8?q?=F0=9F=93=9D=20Mejora=20doc=20de=20`Aut?= =?UTF-8?q?oDefault`=20y=20`builder=5Ffn`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helpers/pagetop-macros/src/lib.rs | 91 ++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 19 deletions(-) diff --git a/helpers/pagetop-macros/src/lib.rs b/helpers/pagetop-macros/src/lib.rs index 732bbad7..194cd378 100644 --- a/helpers/pagetop-macros/src/lib.rs +++ b/helpers/pagetop-macros/src/lib.rs @@ -54,6 +54,56 @@ pub fn html(input: TokenStream) -> TokenStream { /// [`Default`]. Aunque, a diferencia de un simple `#[derive(Default)]`, el atributo /// `#[derive(AutoDefault)]` permite usar anotaciones en los campos como `#[default = "..."]`, /// funcionando incluso en estructuras con campos que no implementan [`Default`] o en *enums*. +/// +/// # Ejemplos +/// +/// ```rust +/// # use pagetop_macros::AutoDefault; +/// # fn main() { +/// #[derive(AutoDefault)] +/// # #[derive(PartialEq)] +/// # #[allow(dead_code)] +/// enum Foo { +/// Bar, +/// #[default] +/// Baz { +/// #[default = 12] +/// a: i32, +/// b: i32, +/// #[default(Some(Default::default()))] +/// c: Option<i32>, +/// #[default(_code = "vec![1, 2, 3]")] +/// d: Vec<u32>, +/// #[default = "four"] +/// e: String, +/// }, +/// Qux(i32), +/// } +/// +/// assert!(Foo::default() == Foo::Baz { +/// a: 12, +/// b: 0, +/// c: Some(0), +/// d: vec![1, 2, 3], +/// e: "four".to_owned(), +/// }); +/// # } +/// ``` +/// +/// * `Baz` tiene el atributo `#[default]`. Esto significa que el valor por defecto de `Foo` es +/// `Foo::Baz`. Solo una variante puede tener el atributo `#[default]`, y dicho atributo no debe +/// tener ningún valor asociado. +/// * `a` tiene el atributo `#[default = 12]`. Esto significa que su valor por defecto es `12`. +/// * `b` no tiene ningún atributo `#[default = ...]`. Su valor por defecto será, por tanto, el +/// valor por defecto de `i32`, es decir, `0`. +/// * `c` es un `Option<i32>`, y su valor por defecto es `Some(Default::default())`. Rust no puede +/// (actualmente) analizar `#[default = Some(Default::default())]`, pero podemos escribir +/// `#[default(Some(Default::default))]`. +/// * `d` contiene el token `!`, que (actualmente) no puede ser analizado ni siquiera usando +/// `#[default(...)]`, así que debemos codificarlo como una cadena y marcarlo con `_code =`. +/// * `e` es un `String`, por lo que el literal de cadena `"four"` se convierte automáticamente en +/// él. Esta conversión automática **solo** ocurre con literales de cadena (o de bytes), y solo si +/// no se usa `_code`. #[proc_macro_derive(AutoDefault, attributes(default))] pub fn derive_auto_default(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); @@ -65,46 +115,49 @@ pub fn derive_auto_default(input: TokenStream) -> TokenStream { /// Macro (*attribute*) que asocia un método *builder* `with_` con un método `alter_`. /// -/// La macro añade automáticamente un método `alter_` para modificar la instancia actual usando -/// `&mut self`, y redefine el método *builder* `with_`, que consume la instancia (`mut self`), para -/// delegar la lógica de la modificación al nuevo método `alter_`, reutilizando así la misma -/// implementación. +/// La macro añade automáticamente un método `alter_` que permite modificar la instancia actual +/// usando `&mut self`; y redefine el método *builder* `with_`, que consume `mut self`, para delegar +/// la lógica al nuevo método `alter_`, reutilizando así la misma implementación. /// /// Esta macro emitirá un error en tiempo de compilación si la función anotada no cumple con la /// firma esperada para el método *builder*: `pub fn with_...(mut self, ...) -> Self`. /// -/// # Ejemplos +/// # Ejemplo /// /// Si defines un método `with_` como este: /// -/// ```rust,ignore +/// ```rust +/// # use pagetop_macros::builder_fn; +/// # struct Example {value: Option<String>}; +/// # impl Example { /// #[builder_fn] /// pub fn with_example(mut self, value: impl Into<String>) -> Self { /// self.value = Some(value.into()); /// self /// } +/// # } /// ``` /// -/// la macro generará automáticamente el siguiente método `alter_`: +/// la macro rescribirá el método `with_` y generará un nuevo método `alter_`: /// -/// ```rust,ignore -/// pub fn alter_example(&mut self, value: impl Into<String>) -> &mut Self { -/// self.value = Some(value.into()); -/// self -/// } -/// ``` -/// -/// y reescribirá el método `with_` para delegar la modificación al método `alter_`: -/// -/// ```rust,ignore +/// ```rust +/// # struct Example {value: Option<String>}; +/// # impl Example { +/// #[inline] /// pub fn with_example(mut self, value: impl Into<String>) -> Self { /// self.alter_example(value); /// self /// } +/// +/// pub fn alter_example(&mut self, value: impl Into<String>) -> &mut Self { +/// self.value = Some(value.into()); +/// self +/// } +/// # } /// ``` /// -/// Así, cada método *builder* `with_...()` generará automáticamente su correspondiente método -/// `alter_...()`, que permitirá más adelante modificar instancias existentes. +/// De esta forma, cada método *builder* `with_...()` generará automáticamente su correspondiente +/// método `alter_...()` para dejar modificar instancias existentes. #[proc_macro_attribute] pub fn builder_fn(_: TokenStream, item: TokenStream) -> TokenStream { use syn::{parse2, FnArg, Ident, ImplItemFn, Pat, ReturnType, TraitItemFn, Type}; From f0e5f50a7f4d622e5fd8548e094516e28d3f35e5 Mon Sep 17 00:00:00 2001 From: Manuel Cillero <manuel@cillero.es> Date: Sat, 22 Nov 2025 09:11:16 +0100 Subject: [PATCH 853/853] =?UTF-8?q?=E2=9C=A8=20(theme):=20A=C3=B1ade=20com?= =?UTF-8?q?ponentes=20`Region`=20y=20`Template`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Incluye un componente base `Template` para gestionar la estructura del documento y sus regiones (`Region`). - Actualiza el *trait* `Contextual` para permitir la selección de la plantilla de renderizado. - Modifica `Page` y `Context`, y refactoriza el manejo de temas, para dar soporte al nuevo sistema de plantillas y eliminar la gestión obsoleta de regiones. --- examples/navbar-menus.rs | 2 +- extensions/pagetop-aliner/README.md | 3 +- extensions/pagetop-aliner/src/lib.rs | 11 +- extensions/pagetop-bootsier/README.md | 3 +- extensions/pagetop-bootsier/src/lib.rs | 6 +- .../pagetop-bootsier/src/theme}/icon.rs | 0 src/base/component.rs | 81 ++-- src/base/component/poweredby.rs | 2 +- src/base/component/region.rs | 150 ++++++++ src/base/component/template.rs | 84 +++++ src/base/theme.rs | 4 +- src/base/theme/basic.rs | 3 - src/core/action/all.rs | 2 +- src/core/component/children.rs | 2 +- src/core/component/context.rs | 77 ++-- src/core/theme.rs | 21 +- src/core/theme/definition.rs | 356 ++++++------------ src/core/theme/regions.rs | 130 ++----- src/response/page.rs | 38 +- src/response/page/error.rs | 6 +- 20 files changed, 506 insertions(+), 475 deletions(-) rename {src/base/component => extensions/pagetop-bootsier/src/theme}/icon.rs (100%) create mode 100644 src/base/component/region.rs create mode 100644 src/base/component/template.rs diff --git a/examples/navbar-menus.rs b/examples/navbar-menus.rs index 071d24b1..341d394a 100644 --- a/examples/navbar-menus.rs +++ b/examples/navbar-menus.rs @@ -95,7 +95,7 @@ impl Extension for SuperMenu { })), )); - InRegion::Key("header").add(Child::with( + InRegion::Named("header").add(Child::with( Container::new() .with_width(container::Width::FluidMax(UnitValue::RelRem(75.0))) .add_child(navbar_menu), diff --git a/extensions/pagetop-aliner/README.md b/extensions/pagetop-aliner/README.md index 43fb65a5..f4670aae 100644 --- a/extensions/pagetop-aliner/README.md +++ b/extensions/pagetop-aliner/README.md @@ -63,10 +63,11 @@ theme = "Aliner" ```rust,no_run use pagetop::prelude::*; +use pagetop_aliner::Aliner; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) - .with_theme("Aliner") + .with_theme(&Aliner) .add_child( Block::new() .with_title(L10n::l("sample_title")) diff --git a/extensions/pagetop-aliner/src/lib.rs b/extensions/pagetop-aliner/src/lib.rs index cbc0f526..4ae4121e 100644 --- a/extensions/pagetop-aliner/src/lib.rs +++ b/extensions/pagetop-aliner/src/lib.rs @@ -64,10 +64,11 @@ theme = "Aliner" ```rust,no_run use pagetop::prelude::*; +use pagetop_aliner::Aliner; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) - .with_theme("Aliner") + .with_theme(&Aliner) .add_child( Block::new() .with_title(L10n::l("sample_title")) @@ -82,15 +83,11 @@ async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { use pagetop::prelude::*; -/// El tema usa las mismas regiones predefinidas por [`DefaultRegions`]. -pub type AlinerRegions = DefaultRegions; - /// Implementa el tema para usar en pruebas que muestran el esquema de páginas HTML. /// -/// Tema mínimo ideal para **pruebas y demos** que renderiza el **esqueleto HTML** con las mismas -/// regiones básicas definidas por [`DefaultRegions`]. No pretende ser un tema para producción, está -/// pensado para: +/// Define un tema mínimo útil para: /// +/// - Comprobar el funcionamiento de temas, plantillas y regiones. /// - Verificar integración de componentes y composiciones (*layouts*) sin estilos complejos. /// - Realizar pruebas de renderizado rápido con salida estable y predecible. /// - Preparar ejemplos y documentación, sin dependencias visuales (CSS/JS) innecesarias. diff --git a/extensions/pagetop-bootsier/README.md b/extensions/pagetop-bootsier/README.md index 84e11b57..d6e1666a 100644 --- a/extensions/pagetop-bootsier/README.md +++ b/extensions/pagetop-bootsier/README.md @@ -63,10 +63,11 @@ theme = "Bootsier" ```rust,no_run use pagetop::prelude::*; +use pagetop_bootsier::Bootsier; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) - .with_theme("Bootsier") + .with_theme(&Bootsier) .add_child( Block::new() .with_title(L10n::l("sample_title")) diff --git a/extensions/pagetop-bootsier/src/lib.rs b/extensions/pagetop-bootsier/src/lib.rs index 76f9d1e2..0bf94f47 100644 --- a/extensions/pagetop-bootsier/src/lib.rs +++ b/extensions/pagetop-bootsier/src/lib.rs @@ -64,10 +64,11 @@ theme = "Bootsier" ```rust,no_run use pagetop::prelude::*; +use pagetop_bootsier::Bootsier; async fn homepage(request: HttpRequest) -> ResultPage<Markup, ErrorPage> { Page::new(request) - .with_theme("Bootsier") + .with_theme(&Bootsier) .add_child( Block::new() .with_title(L10n::l("sample_title")) @@ -101,9 +102,6 @@ pub mod prelude { pub use crate::theme::*; } -/// El tema usa las mismas regiones predefinidas por [`DefaultRegions`]. -pub type BootsierRegions = DefaultRegions; - /// Implementa el tema. pub struct Bootsier; diff --git a/src/base/component/icon.rs b/extensions/pagetop-bootsier/src/theme/icon.rs similarity index 100% rename from src/base/component/icon.rs rename to extensions/pagetop-bootsier/src/theme/icon.rs diff --git a/src/base/component.rs b/src/base/component.rs index bdab35c6..fa9ed2ad 100644 --- a/src/base/component.rs +++ b/src/base/component.rs @@ -1,48 +1,46 @@ //! Componentes nativos proporcionados por PageTop. - -use crate::prelude::*; - -// **< FontSize >*********************************************************************************** - -#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)] -pub enum FontSize { - ExtraLarge, - XxLarge, - XLarge, - Large, - Medium, - #[default] - Normal, - Small, - XSmall, - XxSmall, - ExtraSmall, -} - -#[rustfmt::skip] -impl FontSize { - #[inline] - pub const fn as_str(self) -> &'static str { - match self { - FontSize::ExtraLarge => "fs__x3l", - FontSize::XxLarge => "fs__x2l", - FontSize::XLarge => "fs__xl", - FontSize::Large => "fs__l", - FontSize::Medium => "fs__m", - FontSize::Normal => "", - FontSize::Small => "fs__s", - FontSize::XSmall => "fs__xs", - FontSize::XxSmall => "fs__x2s", - FontSize::ExtraSmall => "fs__x3s", - } - } -} - -// ************************************************************************************************* +//! +//! Conviene destacar que PageTop distingue entre: +//! +//! - **Componentes estructurales** que definen el esqueleto de un documento HTML, como [`Template`] +//! y [`Region`], utilizados por [`Page`](crate::response::page::Page) para generar la estructura +//! final. +//! - **Componentes de contenido** (menús, barras, tarjetas, etc.), que se incluyen en las regiones +//! gestionadas por los componentes estructurales. +//! +//! El componente [`Template`] describe cómo maquetar el cuerpo del documento a partir de varias +//! regiones lógicas ([`Region`]). En función de la plantilla seleccionada, determina qué regiones +//! se renderizan y en qué orden. Por ejemplo, la plantilla predeterminada [`Template::DEFAULT`] +//! utiliza las regiones [`Region::HEADER`], [`Region::CONTENT`] y [`Region::FOOTER`]. +//! +//! Un componente [`Region`] es un contenedor lógico asociado a un nombre de región. Su contenido se +//! obtiene del [`Context`](crate::core::component::Context), donde los componentes se registran +//! mediante [`Contextual::with_child_in()`](crate::core::component::Contextual::with_child_in) y +//! otros mecanismos similares, y se integra en el documento a través de [`Template`]. +//! +//! Por su parte, una página ([`Page`](crate::response::page::Page)) representa un documento HTML +//! completo. Implementa [`Contextual`](crate::core::component::Contextual) para mantener su propio +//! [`Context`](crate::core::component::Context), donde gestiona el tema activo, la plantilla +//! seleccionada y los componentes asociados a cada región, y se encarga de generar la estructura +//! final de la página. +//! +//! De este modo, temas y extensiones colaboran sobre una estructura común: las aplicaciones +//! registran componentes en el [`Context`](crate::core::component::Context), las plantillas +//! organizan las regiones y las páginas generan el documento HTML resultante. +//! +//! Los temas pueden sobrescribir [`Template`] para exponer nuevas plantillas o adaptar las +//! predeterminadas, y lo mismo con [`Region`] para añadir regiones adicionales o personalizar su +//! representación. mod html; pub use html::Html; +mod region; +pub use region::Region; + +mod template; +pub use template::Template; + mod block; pub use block::Block; @@ -51,6 +49,3 @@ pub use intro::{Intro, IntroOpening}; mod poweredby; pub use poweredby::PoweredBy; - -mod icon; -pub use icon::{Icon, IconKind}; diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index 51ab79d8..797253dc 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -3,7 +3,7 @@ use crate::prelude::*; // Enlace a la página oficial de PageTop. const LINK: &str = "<a href=\"https://pagetop.cillero.es\" rel=\"noopener noreferrer\">PageTop</a>"; -/// Componente que renderiza la sección 'Powered by' (*Funciona con*) típica del pie de página. +/// Componente que informa del 'Powered by' (*Funciona con*) típica del pie de página. /// /// Por defecto, usando [`default()`](Self::default) sólo se muestra un reconocimiento a PageTop. /// Sin embargo, se puede usar [`new()`](Self::new) para crear una instancia con un texto de diff --git a/src/base/component/region.rs b/src/base/component/region.rs new file mode 100644 index 00000000..5dfa25ce --- /dev/null +++ b/src/base/component/region.rs @@ -0,0 +1,150 @@ +use crate::prelude::*; + +/// Componente estructural que renderiza el contenido de una región del documento. +/// +/// `Region` actúa como un contenedor lógico asociado a un nombre de región. Su contenido se obtiene +/// del contexto de renderizado ([`Context`]), donde los componentes suelen registrarse con métodos +/// como [`Contextual::with_child_in()`]. Cada región puede integrarse posteriormente en el cuerpo +/// del documento mediante [`Template`], normalmente desde una página ([`Page`]). +#[derive(AutoDefault)] +pub struct Region { + #[default(AttrName::new(Self::DEFAULT))] + name: AttrName, + #[default(L10n::l("region-content"))] + label: L10n, +} + +impl Component for Region { + fn new() -> Self { + Region::default() + } + + fn id(&self) -> Option<String> { + self.name.get() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let Some(name) = self.name().get() else { + return PrepareMarkup::None; + }; + let output = cx.render_region(&name); + if output.is_empty() { + return PrepareMarkup::None; + } + PrepareMarkup::With(html! { + div + id=[self.id()] + class=(join!("region region-", &name)) + role="region" + aria-label=[self.label().lookup(cx)] + { + (output) + } + }) + } +} + +impl Region { + /// Región especial situada al **inicio del documento**. + /// + /// Su función es proporcionar un punto estable donde las extensiones puedan inyectar contenido + /// global antes de renderizar el resto de regiones principales (cabecera, contenido, etc.). + /// + /// No suele utilizarse en los temas como una región “visible” dentro del maquetado habitual, + /// sino como punto de anclaje para elementos auxiliares, marcadores técnicos, inicializadores o + /// contenido de depuración que deban situarse en la parte superior del documento. + /// + /// Se considera una región **reservada** para este tipo de usos globales. + pub const PAGETOP: &str = "page-top"; + + /// Región estándar para la **cabecera** del documento. + /// + /// Suele emplearse para mostrar un logotipo, navegación principal, barras superiores, etc. + pub const HEADER: &str = "header"; + + /// Región principal de **contenido**. + /// + /// Es la región donde se espera que se renderice el contenido principal de la página (p. ej. + /// cuerpo de la ruta actual, bloques centrales, vistas principales, etc.). En muchos temas será + /// la región mínima imprescindible para que la página tenga sentido. + pub const CONTENT: &str = "content"; + + /// Región estándar para el **pie de página**. + /// + /// Suele contener información legal, enlaces secundarios, créditos, etc. + pub const FOOTER: &str = "footer"; + + /// Región especial situada al **final del documento**. + /// + /// Pensada para proporcionar un punto estable donde las extensiones puedan inyectar contenido + /// global después de renderizar el resto de regiones principales (cabecera, contenido, etc.). + /// + /// No suele utilizarse en los temas como una región “visible” dentro del maquetado habitual, + /// sino como punto de anclaje para elementos auxiliares asociados a comportamientos dinámicos + /// que deban situarse en la parte inferior del documento. + /// + /// Igual que [`Self::PAGETOP`], se considera una región **reservada** para este tipo de usos + /// globales. + pub const PAGEBOTTOM: &str = "page-bottom"; + + /// Región por defecto que se asigna cuando no se especifica ningún nombre. + /// + /// Por diseño, la región por defecto es la de contenido principal ([`Self::CONTENT`]), de + /// manera que un tema sencillo pueda limitarse a definir una sola región funcional. + pub const DEFAULT: &str = Self::CONTENT; + + /// Prepara una región para el nombre indicado. + /// + /// El valor de `name` se utiliza como nombre de la región y como identificador (`id`) del + /// contenedor. Al renderizarse, este componente mostrará el contenido registrado en el contexto + /// bajo ese nombre. + pub fn named(name: impl AsRef<str>) -> Self { + Region { + name: AttrName::new(name), + label: L10n::default(), + } + } + + /// Prepara una región para el nombre indicado con una etiqueta de accesibilidad. + /// + /// El valor de `name` se utiliza como nombre de la región y como identificador (`id`) del + /// contenedor, mientras que `label` será el texto localizado que se usará como `aria-label` del + /// contenedor. + pub fn labeled(name: impl AsRef<str>, label: L10n) -> Self { + Region { + name: AttrName::new(name), + label, + } + } + + // **< Region BUILDER >************************************************************************* + + /// Establece o modifica el nombre de la región. + #[builder_fn] + pub fn with_name(mut self, name: impl AsRef<str>) -> Self { + self.name.alter_value(name); + self + } + + /// Establece la etiqueta localizada de la región. + /// + /// Esta etiqueta se utiliza como `aria-label` del contenedor predefinido `<div role="region">`, + /// lo que mejora la accesibilidad para lectores de pantalla y otras tecnologías de apoyo. + #[builder_fn] + pub fn with_label(mut self, label: L10n) -> Self { + self.label = label; + self + } + + // **< Region GETTERS >************************************************************************* + + /// Devuelve el nombre de la región. + pub fn name(&self) -> &AttrName { + &self.name + } + + /// Devuelve la etiqueta localizada asociada a la región. + pub fn label(&self) -> &L10n { + &self.label + } +} diff --git a/src/base/component/template.rs b/src/base/component/template.rs new file mode 100644 index 00000000..6c70d00e --- /dev/null +++ b/src/base/component/template.rs @@ -0,0 +1,84 @@ +use crate::prelude::*; + +/// Componente estructural para renderizar plantillas de contenido. +/// +/// `Template` describe cómo se compone el cuerpo del documento a partir de varias regiones lógicas +/// ([`Region`]). En función de su nombre, decide qué regiones se renderizan y en qué orden. +/// +/// Normalmente se invoca desde una página ([`Page`]), que consulta el nombre de plantilla guardado +/// en el [`Context`] y delega en `Template` la composición de las regiones que forman el cuerpo del +/// documento. +/// +/// Los temas pueden sobrescribir este componente para exponer sus propias plantillas o adaptar las +/// plantillas predeterminadas. +#[derive(AutoDefault)] +pub struct Template { + #[default(AttrName::new(Self::DEFAULT))] + name: AttrName, +} + +impl Component for Template { + fn new() -> Self { + Template::default() + } + + fn id(&self) -> Option<String> { + self.name.get() + } + + fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { + let Some(name) = self.name().get() else { + return PrepareMarkup::None; + }; + match name.as_str() { + Self::DEFAULT | Self::ERROR => PrepareMarkup::With(html! { + (Region::labeled(Region::HEADER, L10n::l("region-header")).render(cx)) + (Region::default().render(cx)) + (Region::labeled(Region::FOOTER, L10n::l("region-footer")).render(cx)) + }), + _ => PrepareMarkup::None, + } + } +} + +impl Template { + /// Nombre de la plantilla predeterminada. + /// + /// Por defecto define una estructura básica con las regiones [`Region::HEADER`], + /// [`Region::CONTENT`] y [`Region::FOOTER`], en ese orden. Esta plantilla se usa cuando no se + /// selecciona ninguna otra de forma explícita (ver [`Contextual::with_template()`]). + pub const DEFAULT: &str = "default"; + + /// Nombre de la plantilla de error. + /// + /// Se utiliza para páginas de error u otros estados excepcionales. Por defecto reutiliza + /// la misma estructura que [`Self::DEFAULT`], pero permite a temas y extensiones distinguir + /// el contexto de error para aplicar estilos o contenidos específicos. + pub const ERROR: &str = "error"; + + /// Selecciona la plantilla asociada al nombre indicado. + /// + /// El valor de `name` se utiliza como nombre de la plantilla y como identificador (`id`) del + /// componente. + pub fn named(name: impl AsRef<str>) -> Self { + Template { + name: AttrName::new(name), + } + } + + // **< Template BUILDER >*********************************************************************** + + /// Establece o modifica el nombre de la plantilla seleccionada. + #[builder_fn] + pub fn with_name(mut self, name: impl AsRef<str>) -> Self { + self.name.alter_value(name); + self + } + + // **< Template GETTERS >*********************************************************************** + + /// Devuelve el nombre de la plantilla seleccionada. + pub fn name(&self) -> &AttrName { + &self.name + } +} diff --git a/src/base/theme.rs b/src/base/theme.rs index 1e5b1a85..4a13a4e4 100644 --- a/src/base/theme.rs +++ b/src/base/theme.rs @@ -1,4 +1,4 @@ -//! Temas básicos soportados por PageTop. +//! Tema básico soportados por PageTop. mod basic; -pub use basic::{Basic, BasicRegions}; +pub use basic::Basic; diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 2d713e37..eb2274f6 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -1,9 +1,6 @@ /// Es el tema básico que incluye PageTop por defecto. use crate::prelude::*; -/// El tema básico usa las mismas regiones predefinidas por [`DefaultRegions`]. -pub type BasicRegions = DefaultRegions; - /// Tema básico por defecto que extiende el funcionamiento predeterminado de [`Theme`]. pub struct Basic; diff --git a/src/core/action/all.rs b/src/core/action/all.rs index fbbf8427..2a3dfd2d 100644 --- a/src/core/action/all.rs +++ b/src/core/action/all.rs @@ -19,7 +19,7 @@ static ACTIONS: LazyLock<RwLock<HashMap<ActionKey, ActionsList>>> = // // Las extensiones llamarán a esta función durante su inicialización para instalar acciones // personalizadas que modifiquen el comportamiento del *core* o de otros componentes. -pub fn add_action(action: ActionBox) { +pub(crate) fn add_action(action: ActionBox) { let key = ActionKey::new( action.type_id(), action.theme_type_id(), diff --git a/src/core/component/children.rs b/src/core/component/children.rs index 3b8f2abf..b3670433 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -200,7 +200,7 @@ pub enum TypedOp<C: Component> { /// Esta lista permite añadir, modificar, renderizar y consultar componentes hijo en orden de /// inserción, soportando operaciones avanzadas como inserción relativa o reemplazo por /// identificador. -#[derive(Clone, Default)] +#[derive(AutoDefault, Clone)] pub struct Children(Vec<Child>); impl Children { diff --git a/src/core/component/context.rs b/src/core/component/context.rs index 8c4e47e1..5cc5d2e8 100644 --- a/src/core/component/context.rs +++ b/src/core/component/context.rs @@ -1,5 +1,6 @@ +use crate::base::component::Template; use crate::core::component::ChildOp; -use crate::core::theme::all::{theme_by_short_name, DEFAULT_THEME}; +use crate::core::theme::all::DEFAULT_THEME; use crate::core::theme::{ChildrenInRegions, ThemeRef}; use crate::core::TypeInfo; use crate::html::{html, Markup}; @@ -13,19 +14,16 @@ use std::collections::HashMap; /// Operaciones para modificar recursos asociados al contexto ([`Context`]) de un documento. pub enum ContextOp { - // Favicon. /// Define el *favicon* del documento. Sobrescribe cualquier valor anterior. SetFavicon(Option<Favicon>), /// Define el *favicon* solo si no se ha establecido previamente. SetFaviconIfNone(Favicon), - // Stylesheets. /// Añade una hoja de estilos CSS al documento. AddStyleSheet(StyleSheet), /// Elimina una hoja de estilos por su ruta o identificador. RemoveStyleSheet(&'static str), - // JavaScripts. /// Añade un script JavaScript al documento. AddJavaScript(JavaScript), /// Elimina un script por su ruta o identificador. @@ -50,27 +48,27 @@ pub enum ContextError { /// Interfaz para gestionar el **contexto de renderizado** de un documento HTML. /// -/// `Contextual` extiende [`LangId`] y define los métodos para: +/// `Contextual` extiende [`LangId`] para establecer el idioma del documento y añade métodos para: /// -/// - Establecer el **idioma** del documento. /// - Almacenar la **solicitud HTTP** de origen. -/// - Seleccionar **tema** y **composición** (*layout*) de renderizado. +/// - Seleccionar el **tema** y la **plantilla** de renderizado. /// - Administrar **recursos** del documento como el icono [`Favicon`], las hojas de estilo /// [`StyleSheet`] o los scripts [`JavaScript`] mediante [`ContextOp`]. /// - Leer y mantener **parámetros dinámicos tipados** de contexto. /// - Generar **identificadores únicos** por tipo de componente. /// -/// Lo implementan, típicamente, estructuras que representan el contexto de renderizado, como +/// Lo implementan, típicamente, estructuras que manejan el contexto de renderizado, como /// [`Context`](crate::core::component::Context) o [`Page`](crate::response::page::Page). /// /// # Ejemplo /// /// ```rust /// # use pagetop::prelude::*; +/// # use pagetop_aliner::Aliner; /// fn prepare_context<C: Contextual>(cx: C) -> C { /// cx.with_langid(&LangMatch::resolve("es-ES")) -/// .with_theme("aliner") -/// .with_layout("default") +/// .with_theme(&Aliner) +/// .with_template(Template::DEFAULT) /// .with_assets(ContextOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) /// .with_assets(ContextOp::AddStyleSheet(StyleSheet::from("/css/app.css"))) /// .with_assets(ContextOp::AddJavaScript(JavaScript::defer("/js/app.js"))) @@ -90,11 +88,11 @@ pub trait Contextual: LangId { /// Especifica el tema para renderizar el documento. #[builder_fn] - fn with_theme(self, theme_name: &'static str) -> Self; + fn with_theme(self, theme: ThemeRef) -> Self; - /// Especifica la composición para renderizar el documento. + /// Especifica la plantilla para renderizar el documento. #[builder_fn] - fn with_layout(self, layout_name: &'static str) -> Self; + fn with_template(self, template_name: &'static str) -> Self; /// Añade o modifica un parámetro dinámico del contexto. #[builder_fn] @@ -104,9 +102,9 @@ pub trait Contextual: LangId { #[builder_fn] fn with_assets(self, op: ContextOp) -> Self; - /// Opera con [`ChildOp`] en una región (`region_key`) de la página. + /// Opera con [`ChildOp`] en una región (`region_name`) del documento. #[builder_fn] - fn with_child_in(self, region_key: &'static str, op: ChildOp) -> Self; + fn with_child_in(self, region_name: impl AsRef<str>, op: ChildOp) -> Self; // **< Contextual GETTERS >********************************************************************* @@ -116,8 +114,8 @@ pub trait Contextual: LangId { /// Devuelve el tema que se usará para renderizar el documento. fn theme(&self) -> ThemeRef; - /// Devuelve la composición para renderizar el documento. Por defecto es `"default"`. - fn layout(&self) -> &str; + /// Devuelve el nombre de la plantilla usada para renderizar el documento. + fn template(&self) -> &str; /// Recupera un parámetro como [`Option`]. fn param<T: 'static>(&self, key: &'static str) -> Option<&T>; @@ -168,12 +166,13 @@ pub trait Contextual: LangId { /// /// ```rust /// # use pagetop::prelude::*; +/// # use pagetop_aliner::Aliner; /// fn new_context(request: HttpRequest) -> Context { /// Context::new(Some(request)) /// // Establece el idioma del documento a español. /// .with_langid(&LangMatch::resolve("es-ES")) -/// // Selecciona un tema (por su nombre corto). -/// .with_theme("aliner") +/// // Establece el tema para renderizar. +/// .with_theme(&Aliner) /// // Asigna un favicon. /// .with_assets(ContextOp::SetFavicon(Some(Favicon::new().with_icon("/favicon.ico")))) /// // Añade una hoja de estilo externa. @@ -208,8 +207,8 @@ pub trait Contextual: LangId { pub struct Context { request : Option<HttpRequest>, // Solicitud HTTP de origen. langid : &'static LanguageIdentifier, // Identificador de idioma. - theme : ThemeRef, // Referencia al tema para renderizar. - layout : &'static str, // Composición del documento para renderizar. + theme : ThemeRef, // Referencia al tema usado para renderizar. + template : &'static str, // Nombre de la plantilla usada para renderizar. favicon : Option<Favicon>, // Favicon, si se ha definido. stylesheets: Assets<StyleSheet>, // Hojas de estilo CSS. javascripts: Assets<JavaScript>, // Scripts JavaScript. @@ -227,8 +226,8 @@ impl Default for Context { impl Context { /// Crea un nuevo contexto asociado a una solicitud HTTP. /// - /// El contexto inicializa el idioma, tema y composición por defecto, sin favicon ni recursos - /// cargados. + /// El contexto inicializa el idioma, el tema y la plantilla por defecto, sin favicon ni otros + /// recursos cargados. #[rustfmt::skip] pub fn new(request: Option<HttpRequest>) -> Self { // Se intenta DEFAULT_LANGID. @@ -249,7 +248,7 @@ impl Context { request, langid, theme : *DEFAULT_THEME, - layout : "default", + template : Template::DEFAULT, favicon : None, stylesheets: Assets::<StyleSheet>::new(), javascripts: Assets::<JavaScript>::new(), @@ -287,10 +286,10 @@ impl Context { markup } - /// Renderiza los componentes de una región (`region_key`). - pub fn render_components_of(&mut self, region_key: &'static str) -> Markup { + /// Renderiza los componentes de la región `region_name`. + pub fn render_region(&mut self, region_name: impl AsRef<str>) -> Markup { self.regions - .merge_all_components(self.theme, region_key) + .children_for(self.theme, region_name) .render(self) } @@ -364,7 +363,7 @@ impl Context { /// Elimina un parámetro del contexto. Devuelve `true` si la clave existía y se eliminó. /// - /// Devuelve `false` en caso contrario. Usar cuando solo interesa borrar la entrada. + /// Devuelve `false` en caso contrario. Usar cuando sólo interesa borrar la entrada. /// /// # Ejemplos /// @@ -411,19 +410,15 @@ impl Contextual for Context { self } - /// Asigna el tema para renderizar el documento. - /// - /// Localiza el tema por su [`short_name()`](crate::core::AnyInfo::short_name), y si no aplica - /// ninguno entonces usará el tema por defecto. #[builder_fn] - fn with_theme(mut self, theme_name: &'static str) -> Self { - self.theme = theme_by_short_name(theme_name).unwrap_or(*DEFAULT_THEME); + fn with_theme(mut self, theme: ThemeRef) -> Self { + self.theme = theme; self } #[builder_fn] - fn with_layout(mut self, layout_name: &'static str) -> Self { - self.layout = layout_name; + fn with_template(mut self, template_name: &'static str) -> Self { + self.template = template_name; self } @@ -467,7 +462,7 @@ impl Contextual for Context { ContextOp::RemoveStyleSheet(path) => { self.stylesheets.remove(path); } - // JavaScripts. + // Scripts JavaScript. ContextOp::AddJavaScript(js) => { self.javascripts.add(js); } @@ -479,8 +474,8 @@ impl Contextual for Context { } #[builder_fn] - fn with_child_in(mut self, region_key: &'static str, op: ChildOp) -> Self { - self.regions.alter_child_in(region_key, op); + fn with_child_in(mut self, region_name: impl AsRef<str>, op: ChildOp) -> Self { + self.regions.alter_child_in(region_name, op); self } @@ -494,8 +489,8 @@ impl Contextual for Context { self.theme } - fn layout(&self) -> &str { - self.layout + fn template(&self) -> &str { + self.template } /// Recupera un parámetro como [`Option`], simplificando el acceso. diff --git a/src/core/theme.rs b/src/core/theme.rs index 28638ba6..8774276e 100644 --- a/src/core/theme.rs +++ b/src/core/theme.rs @@ -1,25 +1,24 @@ //! API para añadir y gestionar nuevos temas. //! -//! En PageTop un tema es la *piel* de la aplicación, decide cómo se muestra cada documento HTML, -//! especialmente las páginas de contenido ([`Page`](crate::response::page::Page)), sin alterar la -//! lógica interna de sus componentes. +//! En PageTop un tema es la *piel* de la aplicación. Es responsable último de los estilos, +//! tipografías, espaciados y cualquier otro detalle visual o interactivo (animaciones, scripts de +//! interfaz, etc.). //! -//! Un tema **declara las regiones** (*cabecera*, *barra lateral*, *pie*, etc.) que estarán -//! disponibles para colocar contenido. Los temas son responsables últimos de los estilos, -//! tipografías, espaciados y cualquier otro detalle visual o de comportamiento (como animaciones, -//! scripts de interfaz, etc.). +//! Un tema determina el aspecto final de un documento HTML sin alterar la lógica interna de los +//! componentes ni la estructura del documento, que queda definida por la plantilla +//! ([`Template`](crate::base::component::Template)) utilizada por cada página. //! //! Los temas son extensiones que implementan [`Extension`](crate::core::extension::Extension), por //! lo que se instancian, declaran dependencias y se inician igual que cualquier otra extensión. //! También deben implementar [`Theme`] y sobrescribir el método //! [`Extension::theme()`](crate::core::extension::Extension::theme) para que PageTop pueda -//! registrarlos como temas +//! registrarlos como temas. mod definition; -pub use definition::{Theme, ThemePage, ThemeRef, DefaultRegions}; +pub use definition::{Theme, ThemeRef}; mod regions; -pub(crate) use regions::{ChildrenInRegions, REGION_CONTENT}; -pub use regions::{InRegion, Region, RegionRef}; +pub(crate) use regions::ChildrenInRegions; +pub use regions::InRegion; pub(crate) mod all; diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index 7d21c146..de11d1ba 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,129 +1,136 @@ -use crate::core::component::{ContextOp, Contextual}; +use crate::base::component::Template; +use crate::core::component::{ComponentRender, ContextOp, Contextual}; use crate::core::extension::Extension; -use crate::core::theme::{Region, RegionRef, REGION_CONTENT}; +use crate::global; use crate::html::{html, Markup, StyleSheet}; use crate::locale::L10n; use crate::response::page::Page; -use crate::{global, join, AutoDefault}; - -use std::sync::LazyLock; /// Referencia estática a un tema. /// /// Los temas son también extensiones. Por tanto, deben declararse como **instancias estáticas** que -/// implementen [`Theme`] y, a su vez, [`Extension`]. +/// implementen [`Theme`] y, a su vez, [`Extension`]. Estas instancias se exponen usando +/// [`Extension::theme()`](crate::core::extension::Extension::theme). pub type ThemeRef = &'static dyn Theme; -/// Conjunto de regiones predefinidas que los temas pueden exponer para el renderizado. +/// Interfaz común que debe implementar cualquier tema de PageTop. /// -/// `DefaultRegions` define un conjunto de regiones predefinidas para estructurar un documento HTML. -/// Proporciona **identificadores estables** (vía [`Region::key()`]) y **etiquetas localizables** -/// (vía [`Region::label()`]) a las regiones donde se añadirán los componentes. +/// Un tema es una [`Extension`](crate::core::extension::Extension) que define el aspecto general de +/// las páginas: cómo se renderiza el `<head>`, cómo se presenta el `<body>` mediante plantillas +/// ([`Template`]) y qué contenido mostrar en las páginas de error. /// -/// Se usa por defecto en [`Theme::page_regions()`](crate::core::theme::Theme::page_regions) y sus -/// variantes representan el conjunto mínimo recomendado para cualquier tema. Sin embargo, cada tema -/// podría exponer su propio conjunto de regiones. -#[derive(AutoDefault)] -pub enum DefaultRegions { - /// Cabecera de la página. +/// Todos los métodos de este *trait* tienen una implementación por defecto, por lo que pueden +/// sobrescribirse selectivamente para crear nuevos temas con comportamientos distintos a los +/// predeterminados. +/// +/// El único método **obligatorio** de `Extension` para un tema es [`theme()`](Extension::theme), +/// que debe devolver una referencia estática al propio tema: +/// +/// ```rust +/// # use pagetop::prelude::*; +/// pub struct MyTheme; +/// +/// impl Extension for MyTheme { +/// fn name(&self) -> L10n { +/// L10n::n("My theme") +/// } +/// +/// fn description(&self) -> L10n { +/// L10n::n("A personal theme") +/// } +/// +/// fn theme(&self) -> Option<ThemeRef> { +/// Some(&Self) +/// } +/// } +/// +/// impl Theme for MyTheme {} +/// ``` +pub trait Theme: Extension + Send + Sync { + /// Acciones específicas del tema antes de renderizar el `<body>` de la página. /// - /// Clave: `"header"`. Suele contener *branding*, navegación principal o avisos globales. - Header, - - /// Contenido principal de la página (**obligatoria**). + /// Se invoca antes de que se procese la plantilla ([`Template`]) asociada a la página + /// ([`Page::template()`](crate::response::page::Page::template)). Es un buen lugar para + /// inicializar o ajustar recursos en función del contexto de la página, por ejemplo: /// - /// Clave: `"content"`. Es el destino por defecto para insertar componentes a nivel de página. - #[default] - Content, + /// - Añadir metadatos o propiedades a la página. + /// - Preparar atributos compartidos. + /// - Registrar *assets* condicionales en el contexto. + #[allow(unused_variables)] + fn before_render_page_body(&self, page: &mut Page) {} - /// Pie de página. + /// Renderiza el contenido del `<body>` de la página. /// - /// Clave: `"footer"`. Suele contener enlaces legales, créditos o navegación secundaria. - Footer, -} + /// Por defecto, delega en la plantilla ([`Template`]) asociada a la página + /// ([`Page::template()`](crate::response::page::Page::template)). La plantilla se encarga de + /// procesar las regiones y renderizar los componentes registrados en el contexto. + /// + /// Los temas pueden sobrescribir este método para: + /// + /// - Forzar una plantilla concreta en determinadas páginas. + /// - Envolver el contenido en marcadores adicionales. + /// - Implementar lógicas de composición alternativas. + #[inline] + fn render_page_body(&self, page: &mut Page) -> Markup { + Template::named(page.template()).render(page.context()) + } -impl Region for DefaultRegions { - fn key(&self) -> &str { - match self { - Self::Header => "header", - Self::Content => REGION_CONTENT, - Self::Footer => "footer", + /// Acciones específicas del tema después de renderizar el `<body>` de la página. + /// + /// Se invoca tras la generación del contenido del `<body>`. Es útil para: + /// + /// - Ajustar o registrar recursos en función de lo que se haya renderizado. + /// - Realizar *tracing* o recopilar métricas. + /// - Aplicar ajustes finales al estado de la página antes de producir el `<head>` o la + /// respuesta final. + /// + /// La implementación por defecto añade una serie de hojas de estilo básicas (`normalize.css`, + /// `root.css`, `basic.css`) cuando el parámetro `include_basic_assets` de la página está + /// activado. + #[allow(unused_variables)] + fn after_render_page_body(&self, page: &mut Page) { + if page.param_or("include_basic_assets", false) { + let pkg_version = env!("CARGO_PKG_VERSION"); + + page.alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/normalize.css") + .with_version("8.0.1") + .with_weight(-99), + )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/root.css") + .with_version(pkg_version) + .with_weight(-99), + )) + .alter_assets(ContextOp::AddStyleSheet( + StyleSheet::from("/css/basic.css") + .with_version(pkg_version) + .with_weight(-99), + )); } } - fn label(&self) -> L10n { - L10n::l(join!("region_", self.key())) - } -} - -/// Métodos predefinidos de renderizado para las páginas de un tema. -/// -/// Contiene las implementaciones base para renderizar las **secciones** `<head>` y `<body>`. Se -/// implementa automáticamente para cualquier tipo que implemente [`Theme`], por lo que normalmente -/// no requiere implementación explícita. -/// -/// Si un tema **sobrescribe** uno o más de los siguientes métodos de [`Theme`]: -/// -/// - [`render_page_region()`](Theme::render_page_region), -/// - [`render_page_head()`](Theme::render_page_head), o -/// - [`render_page_body()`](Theme::render_page_body); -/// -/// puede volver al comportamiento por defecto con una llamada FQS (*Fully Qualified Syntax*) a: -/// -/// - `<Self as ThemePage>::render_region(self, page, region)`, -/// - `<Self as ThemePage>::render_body(self, page, self.page_regions())`, o -/// - `<Self as ThemePage>::render_head(self, page)`. -pub trait ThemePage { - /// Renderiza el **contenedor** de una región concreta del `<body>` de la página. + /// Renderiza el contenido del `<head>` de la página. /// - /// Obtiene los componentes asociados a `region.key()` desde el contexto de la página y, si hay - /// salida, envuelve el contenido en un contenedor `<div>` predefinido. + /// Aunque en una página el `<head>` se encuentra antes del `<body>`, internamente se renderiza + /// después para contar con los ajustes que hayan ido acumulando los componentes. Por ejemplo, + /// permitiría añadir un archivo de iconos sólo si se ha incluido un icono en la página. /// - /// Si la región **no produce contenido**, devuelve un `Markup` vacío. + /// Por defecto incluye: + /// + /// - La codificación (`charset="utf-8"`). + /// - El título, usando el título de la página si existe y, en caso contrario, sólo el nombre de + /// la aplicación. + /// - La descripción (`<meta name="description">`), si está definida. + /// - La etiqueta `viewport` básica para diseño adaptable. + /// - Los metadatos (`name`/`content`) y propiedades (`property`/`content`) declarados en la + /// página. + /// - Todos los *assets* registrados en el contexto de la página. + /// + /// Los temas pueden sobrescribir este método para añadir etiquetas adicionales (por ejemplo, + /// *favicons* personalizados, manifest, etiquetas de analítica, etc.). #[inline] - fn render_region(&self, page: &mut Page, region: RegionRef) -> Markup { - html! { - @let key = region.key(); - @let output = page.context().render_components_of(key); - @if !output.is_empty() { - div - id=(key) - class={ "region region--" (key) } - role="region" - aria-label=[region.label().lookup(page)] - { - (output) - } - } - } - } - - /// Renderiza el **contenido interior** del `<body>` de la página. - /// - /// Recorre `regions` en el **orden declarado** y, para cada región con contenido, delega en - /// [`render_region()`](Self::render_region) la generación del contenedor. Las regiones sin - /// contenido **no** producen salida. Se asume que cada identificador de región es **único** - /// dentro de la página. - /// - /// La etiqueta `<body>` no se incluye aquí; únicamente renderiza su contenido. - #[inline] - fn render_body(&self, page: &mut Page, regions: &[RegionRef]) -> Markup { - html! { - @for region in regions { - (self.render_region(page, *region)) - } - } - } - - /// Renderiza el **contenido interior** del `<head>` de la página. - /// - /// Incluye por defecto las etiquetas básicas (`charset`, `title`, `description`, `viewport`, - /// `X-UA-Compatible`), los metadatos (`name/content`) y propiedades (`property/content`), - /// además de los recursos CSS/JS de la página. - /// - /// La etiqueta `<head>` no se incluye aquí; únicamente se renderiza su contenido. - #[inline] - fn render_head(&self, page: &mut Page) -> Markup { + fn render_page_head(&self, page: &mut Page) -> Markup { let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no"; html! { meta charset="utf-8"; @@ -151,155 +158,20 @@ pub trait ThemePage { (page.context().render_assets()) } } -} - -/// Interfaz común que debe implementar cualquier tema de PageTop. -/// -/// Un tema implementa [`Theme`] y los métodos necesarios de [`Extension`]. El único método -/// **obligatorio** de `Extension` para un tema es [`theme()`](Extension::theme). -/// -/// ```rust -/// # use pagetop::prelude::*; -/// pub struct MyTheme; -/// -/// impl Extension for MyTheme { -/// fn name(&self) -> L10n { -/// L10n::n("My theme") -/// } -/// -/// fn description(&self) -> L10n { -/// L10n::n("A personal theme") -/// } -/// -/// fn theme(&self) -> Option<ThemeRef> { -/// Some(&Self) -/// } -/// } -/// -/// impl Theme for MyTheme {} -/// ``` -pub trait Theme: Extension + ThemePage + Send + Sync { - /// **Obsoleto desde la versión 0.4.0**: usar [`page_regions()`](Self::page_regions) en su - /// lugar. - #[deprecated(since = "0.4.0", note = "Use `page_regions()` instead")] - fn regions(&self) -> Vec<(&'static str, L10n)> { - vec![("content", L10n::l("content"))] - } - - /// Declaración ordenada de las regiones disponibles en la página. - /// - /// Retorna una **lista estática** de referencias ([`RegionRef`](crate::core::theme::RegionRef)) - /// que representan las regiones que el tema admite dentro del `<body>`. - /// - /// Cada referencia apunta a una instancia que implementa [`Region`](crate::core::theme::Region) - /// para definir cada región de forma segura y estable. Y si un tema necesita un conjunto - /// distinto de regiones, puede **sobrescribir** este método siguiendo estas recomendaciones: - /// - /// - Los identificadores devueltos por [`Region::key()`](crate::core::theme::Region::key) - /// deben ser **estables** (p. ej. `"sidebar-left"`, `"content"`). - /// - La región `"content"` es **obligatoria**, ya que se usa como destino por defecto para - /// insertar componentes y renderizarlos. - /// - El orden de la lista podría tener relevancia como **orden de renderizado** dentro del - /// `<body>` segun la implementación de [`render_page_body()`](Self::render_page_body). - /// - Las etiquetas (`L10n`) de cada región se evaluarán con el idioma activo de la página. - /// - /// # Ejemplo - /// - /// ```rust,ignore - /// fn page_regions(&self) -> &'static [RegionRef] { - /// static REGIONS: LazyLock<[RegionRef; 4]> = LazyLock::new(|| { - /// [ - /// &DefaultRegions::Header, - /// &DefaultRegions::Content, - /// &DefaultRegions::Footer, - /// ] - /// }); - /// &*REGIONS - /// } - /// ``` - fn page_regions(&self) -> &'static [RegionRef] { - static REGIONS: LazyLock<[RegionRef; 3]> = LazyLock::new(|| { - [ - &DefaultRegions::Header, - &DefaultRegions::Content, - &DefaultRegions::Footer, - ] - }); - &*REGIONS - } - - /// Renderiza una región de la página. - /// - /// Si se sobrescribe este método, se puede volver al comportamiento base con: - /// `<Self as ThemePage>::render_region(self, page, region)`. - #[inline] - fn render_page_region(&self, page: &mut Page, region: RegionRef) -> Markup { - <Self as ThemePage>::render_region(self, page, region) - } - - /// Acciones específicas del tema antes de renderizar el `<body>` de la página. - /// - /// Útil para preparar clases, inyectar recursos o ajustar metadatos. - #[allow(unused_variables)] - fn before_render_page_body(&self, page: &mut Page) {} - - /// Renderiza el contenido del `<body>` de la página. - /// - /// Si se sobrescribe este método, se puede volver al renderizado base con: - /// `<Self as ThemePage>::render_body(self, page, self.page_regions())`. - #[inline] - fn render_page_body(&self, page: &mut Page) -> Markup { - <Self as ThemePage>::render_body(self, page, self.page_regions()) - } - - /// Acciones específicas del tema después de renderizar el `<body>` de la página. - /// - /// Útil para *tracing*, métricas o ajustes finales del estado de la página. - #[allow(unused_variables)] - fn after_render_page_body(&self, page: &mut Page) {} - - /// Renderiza el contenido del `<head>` de la página. - /// - /// Si se sobrescribe este método, se puede volver al renderizado base con: - /// `<Self as ThemePage>::render_head(self, page)`. - #[inline] - fn render_page_head(&self, page: &mut Page) -> Markup { - if page.param_or("include_basic_assets", false) { - let pkg_version = env!("CARGO_PKG_VERSION"); - - page.alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/normalize.css") - .with_version("8.0.1") - .with_weight(-99), - )) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/root.css") - .with_version(pkg_version) - .with_weight(-99), - )) - .alter_assets(ContextOp::AddStyleSheet( - StyleSheet::from("/css/basic.css") - .with_version(pkg_version) - .with_weight(-99), - )); - } - <Self as ThemePage>::render_head(self, page) - } /// Contenido predeterminado para la página de error "*403 - Forbidden*". /// - /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. + /// Los temas pueden sobrescribir este método para personalizar el diseño y el contenido de la + /// página de error, manteniendo o no el mensaje de los textos localizados. fn error403(&self, page: &mut Page) -> Markup { html! { div { h1 { (L10n::l("error403_notice").using(page)) } } } } /// Contenido predeterminado para la página de error "*404 - Not Found*". /// - /// Se puede sobrescribir este método para personalizar y adaptar este contenido al tema. + /// Los temas pueden sobrescribir este método para personalizar el diseño y el contenido de la + /// página de error, manteniendo o no el mensaje de los textos localizados. fn error404(&self, page: &mut Page) -> Markup { html! { div { h1 { (L10n::l("error404_notice").using(page)) } } } } } - -/// Se implementa automáticamente `ThemePage` para cualquier tema. -impl<T: Theme> ThemePage for T {} diff --git a/src/core/theme/regions.rs b/src/core/theme/regions.rs index 17e15436..259417eb 100644 --- a/src/core/theme/regions.rs +++ b/src/core/theme/regions.rs @@ -1,6 +1,6 @@ +use crate::base::component::Region; use crate::core::component::{Child, ChildOp, Children}; use crate::core::theme::ThemeRef; -use crate::locale::L10n; use crate::{builder_fn, AutoDefault, UniqueId}; use parking_lot::RwLock; @@ -16,97 +16,36 @@ static THEME_REGIONS: LazyLock<RwLock<HashMap<UniqueId, ChildrenInRegions>>> = static COMMON_REGIONS: LazyLock<RwLock<ChildrenInRegions>> = LazyLock::new(|| RwLock::new(ChildrenInRegions::default())); -/// Nombre de la región de contenido por defecto (`"content"`). -pub const REGION_CONTENT: &str = "content"; - -/// Define la interfaz mínima que describe una **región de renderizado** dentro de una página. -/// -/// Una *región* representa una zona del documento HTML (por ejemplo: `"header"`, `"content"` o -/// `"sidebar-left"`), en la que se pueden incluir y renderizar componentes dinámicamente. -/// -/// Este `trait` abstrae los metadatos básicos de cada región, esencialmente: -/// -/// - su **clave interna** (`key()`), que la identifica de forma única dentro de la página, y -/// - su **etiqueta localizada** (`label()`), que se usa como texto accesible (por ejemplo en -/// `aria-label` o en descripciones semánticas del contenedor). -/// -/// Las implementaciones típicas son *enumeraciones estáticas* declaradas por cada tema (ver como -/// ejemplo [`DefaultRegions`](crate::core::theme::DefaultRegions)), de modo que las claves y -/// etiquetas permanecen inmutables y fácilmente referenciables. -/// -/// # Ejemplo -/// -/// ```rust -/// # use pagetop::prelude::*; -/// pub enum MyThemeRegions { -/// Header, -/// Content, -/// Footer, -/// } -/// -/// impl Region for MyThemeRegions { -/// fn key(&self) -> &str { -/// match self { -/// Self::Header => "header", -/// Self::Content => "content", -/// Self::Footer => "footer", -/// } -/// } -/// -/// fn label(&self) -> L10n { -/// L10n::l(join!("region__", self.key())) -/// } -/// } -/// ``` -pub trait Region: Send + Sync { - /// Devuelve la **clave interna** que identifica de forma única una región. - /// - /// La clave se utiliza para asociar los componentes de la región con su contenedor HTML - /// correspondiente. Por convención, se emplean nombres en minúsculas y con guiones (`"header"`, - /// `"main"`, `"sidebar-right"`, etc.), y la región `"content"` es **obligatoria** en todos los - /// temas. - fn key(&self) -> &str; - - /// Devuelve la **etiqueta localizada** (`L10n`) asociada a la región. - /// - /// Esta etiqueta se evalúa en el idioma activo de la página y se utiliza principalmente para - /// accesibilidad, como el valor de `aria-label` en el contenedor generado por - /// [`ThemePage::render_region()`](crate::core::theme::ThemePage::render_region). - fn label(&self) -> L10n; -} - -/// Referencia estática a una región. -pub type RegionRef = &'static dyn Region; - // Contenedor interno de componentes agrupados por región. #[derive(AutoDefault)] -pub struct ChildrenInRegions(HashMap<&'static str, Children>); +pub(crate) struct ChildrenInRegions(HashMap<String, Children>); impl ChildrenInRegions { - pub fn with(region_key: &'static str, child: Child) -> Self { - ChildrenInRegions::default().with_child_in(region_key, ChildOp::Add(child)) + pub fn with(region_name: impl AsRef<str>, child: Child) -> Self { + Self::default().with_child_in(region_name, ChildOp::Add(child)) } #[builder_fn] - pub fn with_child_in(mut self, region_key: &'static str, op: ChildOp) -> Self { - if let Some(region) = self.0.get_mut(region_key) { + pub fn with_child_in(mut self, region_name: impl AsRef<str>, op: ChildOp) -> Self { + let name = region_name.as_ref(); + if let Some(region) = self.0.get_mut(name) { region.alter_child(op); } else { - self.0.insert(region_key, Children::new().with_child(op)); + self.0 + .insert(name.to_owned(), Children::new().with_child(op)); } self } - pub fn merge_all_components(&self, theme_ref: ThemeRef, region_key: &'static str) -> Children { + pub fn children_for(&self, theme_ref: ThemeRef, region_name: impl AsRef<str>) -> Children { + let name = region_name.as_ref(); let common = COMMON_REGIONS.read(); - if let Some(r) = THEME_REGIONS.read().get(&theme_ref.type_id()) { - Children::merge(&[ - common.0.get(region_key), - self.0.get(region_key), - r.0.get(region_key), - ]) + let themed = THEME_REGIONS.read(); + + if let Some(r) = themed.get(&theme_ref.type_id()) { + Children::merge(&[common.0.get(name), self.0.get(name), r.0.get(name)]) } else { - Children::merge(&[common.0.get(region_key), self.0.get(region_key)]) + Children::merge(&[common.0.get(name), self.0.get(name)]) } } } @@ -120,10 +59,10 @@ impl ChildrenInRegions { /// estas regiones, como las páginas de contenido ([`Page`](crate::response::page::Page)). pub enum InRegion { /// Región de contenido por defecto. - Content, - /// Región identificada por la clave proporcionado. - Key(&'static str), - /// Región identificada por una clave para un tema concreto. + Default, + /// Región identificada por el nombre proporcionado. + Named(&'static str), + /// Región identificada por su nombre para un tema concreto. OfTheme(&'static str, ThemeRef), } @@ -135,39 +74,38 @@ impl InRegion { /// ```rust /// # use pagetop::prelude::*; /// // Banner global, en la región por defecto de cualquier página. - /// InRegion::Content.add(Child::with(Html::with(|_| + /// InRegion::Default.add(Child::with(Html::with(|_| /// html! { ("🎉 ¡Bienvenido!") } /// ))); /// /// // Texto en la región "sidebar". - /// InRegion::Key("sidebar").add(Child::with(Html::with(|_| + /// InRegion::Named("sidebar").add(Child::with(Html::with(|_| /// html! { ("Publicidad") } /// ))); /// ``` pub fn add(&self, child: Child) -> &Self { match self { - InRegion::Content => { - COMMON_REGIONS - .write() - .alter_child_in(REGION_CONTENT, ChildOp::Add(child)); - } - InRegion::Key(region_key) => { - COMMON_REGIONS - .write() - .alter_child_in(region_key, ChildOp::Add(child)); - } - InRegion::OfTheme(region_key, theme_ref) => { + InRegion::Default => Self::add_to_common(Region::DEFAULT, child), + InRegion::Named(region_name) => Self::add_to_common(region_name, child), + InRegion::OfTheme(region_name, theme_ref) => { let mut regions = THEME_REGIONS.write(); if let Some(r) = regions.get_mut(&theme_ref.type_id()) { - r.alter_child_in(region_key, ChildOp::Add(child)); + r.alter_child_in(region_name, ChildOp::Add(child)); } else { regions.insert( theme_ref.type_id(), - ChildrenInRegions::with(region_key, child), + ChildrenInRegions::with(region_name, child), ); } } } self } + + #[inline] + fn add_to_common(region_name: &str, child: Child) { + COMMON_REGIONS + .write() + .alter_child_in(region_name, ChildOp::Add(child)); + } } diff --git a/src/response/page.rs b/src/response/page.rs index 036c999c..7d7789d4 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -4,8 +4,10 @@ pub use error::ErrorPage; pub use actix_web::Result as ResultPage; use crate::base::action; -use crate::core::component::{Child, ChildOp, Component, Context, ContextOp, Contextual}; -use crate::core::theme::{ThemeRef, REGION_CONTENT}; +use crate::base::component::Region; +use crate::core::component::{Child, ChildOp, Component, ComponentRender}; +use crate::core::component::{Context, ContextOp, Contextual}; +use crate::core::theme::ThemeRef; use crate::html::{html, Markup, DOCTYPE}; use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; use crate::html::{AttrClasses, ClassesOp}; @@ -109,14 +111,14 @@ impl Page { /// Añade un componente hijo a la región de contenido por defecto. pub fn add_child(mut self, component: impl Component) -> Self { self.context - .alter_child_in(REGION_CONTENT, ChildOp::Add(Child::with(component))); + .alter_child_in(Region::DEFAULT, ChildOp::Add(Child::with(component))); self } - /// Añade un componente hijo en una región (`region_key`) de la página. - pub fn add_child_in(mut self, region_key: &'static str, component: impl Component) -> Self { + /// Añade un componente hijo en la región `region_name` de la página. + pub fn add_child_in(mut self, region_name: &'static str, component: impl Component) -> Self { self.context - .alter_child_in(region_key, ChildOp::Add(Child::with(component))); + .alter_child_in(region_name, ChildOp::Add(Child::with(component))); self } @@ -191,7 +193,11 @@ impl Page { action::page::BeforeRenderBody::dispatch(self); // Renderiza el <body>. - let body = self.context.theme().render_page_body(self); + let body = html! { + (Region::named(Region::PAGETOP).render(&mut self.context)) + (self.context.theme().render_page_body(self)) + (Region::named(Region::PAGEBOTTOM).render(&mut self.context)) + }; // Acciones específicas del tema después de renderizar el <body>. self.context.theme().after_render_page_body(self); @@ -216,9 +222,7 @@ impl Page { (head) } body id=[self.body_id().get()] class=[self.body_classes().get()] { - (self.context.render_components_of("page-top")) (body) - (self.context.render_components_of("page-bottom")) } } }) @@ -247,14 +251,14 @@ impl Contextual for Page { } #[builder_fn] - fn with_theme(mut self, theme_name: &'static str) -> Self { - self.context.alter_theme(theme_name); + fn with_theme(mut self, theme: ThemeRef) -> Self { + self.context.alter_theme(theme); self } #[builder_fn] - fn with_layout(mut self, layout_name: &'static str) -> Self { - self.context.alter_layout(layout_name); + fn with_template(mut self, template_name: &'static str) -> Self { + self.context.alter_template(template_name); self } @@ -271,8 +275,8 @@ impl Contextual for Page { } #[builder_fn] - fn with_child_in(mut self, region_key: &'static str, op: ChildOp) -> Self { - self.context.alter_child_in(region_key, op); + fn with_child_in(mut self, region_name: impl AsRef<str>, op: ChildOp) -> Self { + self.context.alter_child_in(region_name, op); self } @@ -286,8 +290,8 @@ impl Contextual for Page { self.context.theme() } - fn layout(&self) -> &str { - self.context.layout() + fn template(&self) -> &str { + self.context.template() } fn param<T: 'static>(&self, key: &'static str) -> Option<&T> { diff --git a/src/response/page/error.rs b/src/response/page/error.rs index 9945a948..7a590e6e 100644 --- a/src/response/page/error.rs +++ b/src/response/page/error.rs @@ -1,4 +1,4 @@ -use crate::base::component::Html; +use crate::base::component::{Html, Template}; use crate::core::component::Contextual; use crate::locale::L10n; use crate::response::ResponseError; @@ -33,7 +33,7 @@ impl Display for ErrorPage { let error403 = error_page.theme().error403(&mut error_page); if let Ok(page) = error_page .with_title(L10n::n("Error FORBIDDEN")) - .with_layout("error") + .with_template(Template::ERROR) .add_child(Html::with(move |_| error403.clone())) .render() { @@ -48,7 +48,7 @@ impl Display for ErrorPage { let error404 = error_page.theme().error404(&mut error_page); if let Ok(page) = error_page .with_title(L10n::n("Error RESOURCE NOT FOUND")) - .with_layout("error") + .with_template(Template::ERROR) .add_child(Html::with(move |_| error404.clone())) .render() {